[
  {
    "path": ".clang-format",
    "content": "Language: Cpp\nBasedOnStyle: WebKit\nAccessModifierOffset: -2\nAlignAfterOpenBracket: Align\nAlignArrayOfStructures: None\nAlignConsecutiveAssignments: None\nAlignConsecutiveBitFields: Consecutive\nAlignConsecutiveDeclarations: None\nAlignConsecutiveMacros: None\nAlignEscapedNewlines: Left\nAlignOperands: Align\nAlignTrailingComments: true\nAllowAllParametersOfDeclarationOnNextLine: false\nAllowShortCaseLabelsOnASingleLine: true\nAllowShortEnumsOnASingleLine: true\nAllowShortFunctionsOnASingleLine: Empty\nAllowShortIfStatementsOnASingleLine: WithoutElse\nAllowShortLambdasOnASingleLine: Inline\nAlwaysBreakAfterDefinitionReturnType: None\nAlwaysBreakAfterReturnType: None\nAlwaysBreakBeforeMultilineStrings: false\nAlwaysBreakTemplateDeclarations: true\nAttributeMacros:\n  - JEMALLOC_NOTHROW\n  - FEX_ALIGNED\n  - FEX_ANNOTATE\n  - FEX_DEFAULT_VISIBILITY\n  - FEX_NAKED\n  - FEX_PACKED\n  - FEXCORE_PRESERVE_ALL_ATTR\n  - GLIBC_ALIAS_FUNCTION\nBinPackArguments: true\nBinPackParameters: true\nBitFieldColonSpacing: Both\nBreakAfterAttributes: Leave\nBreakBeforeBraces: Attach\nBreakBeforeBinaryOperators: None\nBreakBeforeInlineASMColon: OnlyMultiline # clang 16 required\nBreakBeforeTernaryOperators: false\nBreakConstructorInitializers: BeforeComma\nBreakInheritanceList: BeforeColon\nColumnLimit: 140\nCompactNamespaces: false\nConstructorInitializerIndentWidth: 2\nContinuationIndentWidth: 2\nCpp11BracedListStyle: true\nDerivePointerAlignment: false\nEmptyLineAfterAccessModifier: Leave\nEmptyLineBeforeAccessModifier: Leave\nExperimentalAutoDetectBinPacking: false\nFixNamespaceComments: true\nIncludeBlocks: Preserve\nIndentAccessModifiers: false\nIndentCaseBlocks: false\nIndentCaseLabels: false\nIndentExternBlock: AfterExternBlock\nIndentGotoLabels: false\nIndentPPDirectives: None\nIndentRequires: false\nIndentWidth: 2\nInsertBraces: true\nKeepEmptyLinesAtTheStartOfBlocks: true\nLambdaBodyIndentation: Signature\nLineEnding: LF # clang 16 required\nMaxEmptyLinesToKeep: 2\nNamespaceIndentation: Inner\nQualifierAlignment: Left\nPackConstructorInitializers: Never\nPenaltyBreakAssignment: 2\nPenaltyBreakBeforeFirstCallParameter: 2\nPenaltyBreakOpenParenthesis: 2\nPenaltyBreakString: 10\nPenaltyBreakTemplateDeclaration: 8\nPenaltyExcessCharacter: 2\nPenaltyReturnTypeOnItsOwnLine: 16\nPointerAlignment: Left\nRemoveBracesLLVM: false\nReferenceAlignment: Left\nReflowComments: true\nRequiresClausePosition: WithPreceding\nSeparateDefinitionBlocks: Leave\nSortIncludes: Never\nSpaceAfterCStyleCast: false\nSpaceAfterLogicalNot: false\nSpaceAfterTemplateKeyword: false\nSpaceAroundPointerQualifiers: Default\nSpaceBeforeAssignmentOperators: true\nSpaceBeforeCaseColon: false\nSpaceBeforeCpp11BracedList: true\nSpaceBeforeInheritanceColon: true\nSpaceBeforeParens: Custom\nSpaceBeforeParensOptions:\n  AfterControlStatements: true\n  AfterFunctionDeclarationName: false\n  AfterFunctionDefinitionName: false\n  AfterOverloadedOperator: false\n  AfterRequiresInClause: true\n  BeforeNonEmptyParentheses: false\nSpaceBeforeRangeBasedForLoopColon: true\nSpaceBeforeSquareBrackets: false\nSpaceInEmptyBlock: false\nSpaceInEmptyParentheses: false\nSpacesBeforeTrailingComments: 1\nSpacesInAngles: Leave\nSpacesInCStyleCastParentheses: false\nSpacesInConditionalStatement: false\nSpacesInParentheses: false\nStandard: c++20\nUseTab: Never\n"
  },
  {
    "path": ".clang-format-ignore",
    "content": "# This file is used to ignore files and directories from clang-format\nSource/Common/cpp-optparse/*\n\n# Files with human-indented tables for readability - don't mess with these\nFEXCore/Source/Interface/Core/X86Tables/*.cpp\n\n# Inline headers with list-like content that can't be processed individually\nSource/Tools/LinuxEmulation/LinuxSyscalls/x*/SyscallsNames.inl\nSource/Tools/LinuxEmulation/LinuxSyscalls/x*/Ioctl/*.inl\n\n# Include files in unittests\nunittests/*ASM/Includes/*.inc\n"
  },
  {
    "path": ".git-blame-ignore-revs",
    "content": "# Since version 2.23 (released in August 2019), git-blame has a feature\n# to ignore or bypass certain commits.\n#\n# This file contains a list of commits that are not likely what you\n# are looking for in a blame, such as mass reformatting or renaming.\n# You can set this file as a default ignore file for blame by running\n# the following command.\n#\n# $ git config blame.ignoreRevsFile .git-blame-ignore-revs\n\n# Whole tree reformat PR#3571\n2b4ec88daebd35fefb5bf5c73d7fc2b4155771ed\n\n# Second reformat to find fixed point PR#3577\n905aa935f5ce344a48ef4d5edab3c31efa8d793e\n\n# Reformat of CodeEmitter inl files\n8760c593ece92d7e9fa94c40da0368fd367c9cad\n\n# Whole-tree reformat with clang-format-19\n5267cde60e7642852d18f20ae8568643bb5293d5\n\n# Minor reformat with clang-format-19\n9fdd96af61c969cb5732471223f00eda64b7a069\n\n# Reformat of X86Tables.h\nba2b0ef809f66f1a6d334f000798fa2ceafab26f\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/potential-game-bug.md",
    "content": "---\nname: Potential Game Bug\nabout: A bug in FEX-Emu that causes a problem in a game\ntitle: \"[Game]: [Short Problem Description]\"\nlabels: Game related\nassignees: ''\n\n---\n\n**What Game**\nThe game name.\nA link to the storefront where to get the game. GOG, Steam, Itch.io, etc\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots and Video**\nIf applicable, add screenshots and video to help explain your problem.\n\n**System information:**\n - OS: [eg: Ubuntu 21.10]\n - CPU/SoC: [eg: Snapdragon 888, Intel Core i8-12900k]\n - Video driver version: [eg: OpenGL ES 3.2 Mesa 22.0.0-devel (git-9ff086052a)]\n - RootFS used: [eg: Ubuntu 21.10 Official Rootfs]\n - FEX version: (FEXGetConfig --version) [eg: FEX-2112-155-gc691d709]\n - Thunks Enabled: [Yes/No]\n\n**Additional context**\n - Is this an x86 or x86-64 game: [x86/x86-64/Both]\n - Does this reproduce on AArch64 with Radeon/Intel/Nvidia: [Yes/No/Untested]\n - Is this a Vulkan game: [Yes/No/Unknown]\n   - If Yes, What is your Vulkan driver:\n\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/workflows/ccpp.yml",
    "content": "name: Build + Test\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n\nenv:\n  # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)\n  BUILD_TYPE: Release\n  CC: clang\n  CXX: clang++\n  FEX_PORTABLE: 1\n\njobs:\n  build_plus_test:\n    runs-on: ${{ matrix.arch }}\n    strategy:\n      matrix:\n        arch: [[self-hosted, ARMv8.0], [self-hosted, ARMv8.2], [self-hosted, ARMv8.4]]\n      fail-fast: false\n\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        fetch-depth: '0'\n        fetch-tags: 'true'\n\n    - name: Set runner info\n      run: |\n        echo \"runner_label=${{ matrix.arch[1] }}\" >> $GITHUB_ENV\n        echo \"runner_name=$(hostname)\" >> $GITHUB_ENV\n\n    - name: Setup Build Environment\n      uses: ./.github/workflows/setup-env\n\n    - name: Configure CMake\n      run: |\n        cmake -S . -B build -DCMAKE_BUILD_TYPE=$BUILD_TYPE -G Ninja -DENABLE_LTO=False -DENABLE_ASSERTIONS=True \\\n          -DENABLE_X86_HOST_DEBUG=True -DBUILD_FEX_LINUX_TESTS=True -DBUILD_THUNKS=True \\\n          -DCMAKE_INSTALL_PREFIX=\"$PWD\"/build/install\n\n    # These steps make a lot of noise but rarely fail.\n    # Put them in a separate step to make normal build logs easier to parse\n    - name: Noisy Build Targets\n      run: cmake --build build --target asm_files 32bit_asm_files JemallocLibs Catch2 vixl cephes_128bit\n\n    - name: Build\n      id: build\n      run: cmake --build build\n\n    - name: Install\n      run: cmake --build build --target install\n\n    # GCC tests\n    - name: GCC64 Target Tests\n      if: steps.build.outcome == 'success'\n      uses: ./.github/workflows/test\n      with:\n        target: gcc_target_tests_64\n\n    - name: GCC32 Target Tests\n      if: steps.build.outcome == 'success'\n      uses: ./.github/workflows/test\n      with:\n        target: gcc_target_tests_32\n\n    # API tests\n    - name: API Tests\n      if: steps.build.outcome == 'success'\n      uses: ./.github/workflows/test\n      with:\n        target: api_tests\n\n    - name: FEXCore API Tests\n      if: steps.build.outcome == 'success'\n      uses: ./.github/workflows/test\n      with:\n        target: fexcore_apitests\n\n    # ARM emission tests\n    - name: ARM Emitter Tests\n      if: steps.build.outcome == 'success'\n      uses: ./.github/workflows/test\n      with:\n        target: emitter_tests\n\n    # Linux  tests\n    - name: FEX Linux Tests\n      if: steps.build.outcome == 'success'\n      uses: ./.github/workflows/test\n      with:\n        target: fex_linux_tests_all\n      env:\n        FEX_PORTABLE: 0\n\n    # Thunking\n    - name: Thunkgen tests\n      if: steps.build.outcome == 'success'\n      uses: ./.github/workflows/test\n      with:\n        target: thunkgen_tests\n\n    - name: Test GL No-Thunks\n      if: ${{ steps.build.outcome == 'success' && matrix.arch[1] == 'x64' }}\n      uses: ./.github/workflows/test\n      with:\n        target: thunk_functional_tests_nothunks\n      env:\n        DISPLAY: ':0'\n\n    - name: Test GL Thunks\n      if: ${{ steps.build.outcome == 'success' && matrix.arch[1] == 'x64' }}\n      uses: ./.github/workflows/test\n      with:\n        target: thunk_functional_tests_thunks\n      env:\n        DISPLAY: ':0'\n\n    # ASM tests\n    - name: ASM Tests\n      if: steps.build.outcome == 'success'\n      uses: ./.github/workflows/test\n      with:\n        target: asm_tests\n\n    # POSIX tests\n    - name: POSIX Tests\n      if: steps.build.outcome == 'success'\n      uses: ./.github/workflows/test\n      with:\n        target: posix_tests\n\n    # GVisor tests\n    - name: GVisor Tests\n      if: steps.build.outcome == 'success'\n      uses: ./.github/workflows/test\n      with:\n        target: gvisor_tests\n\n    # Struct verifier tests\n    - name: Struct verifier tests\n      if: steps.build.outcome == 'success'\n      uses: ./.github/workflows/test\n      with:\n        target: struct_verifier\n\n    - name: Remove old SHM regions\n      if: ${{ always() }}\n      run: cmake --build build --target remove_old_shm_regions\n\n    - name: Upload results\n      if: ${{ always() }}\n      uses: actions/upload-artifact@v6\n      timeout-minutes: 1\n      with:\n        name: Results-${{ env.runner_name }}-${{ env.runner_label }}\n        path: results/*.log\n        retention-days: 3\n"
  },
  {
    "path": ".github/workflows/glibc_fault.yml",
    "content": "name: GLIBC fault test\n# This workflow file is the same as the `Build + Test` with some key differences\n# - Runs on any x86 and ARM64 runner\n# - Disables the glibc jemalloc compile option\n# - Enables the glibc allocator fault option\n# - Disables gvisor tests to reduce stress on CI machines (tmp/shm tests overwhelm them)\n# - Disables thunk tests since they are incompatible with glibc fault allocator\n# - Disables ARMEmitter tests (We don't want to fault test vixl's disassembler)\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n\nenv:\n  # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)\n  BUILD_TYPE: Release\n  CC: clang\n  CXX: clang++\n  FEX_PORTABLE: 1\n\njobs:\n  glibc_fault_test:\n    runs-on: ${{ matrix.arch }}\n    strategy:\n      matrix:\n        arch: [[self-hosted, ARM64]]\n      fail-fast: false\n\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        fetch-depth: '0'\n        fetch-tags: 'true'\n\n    - name: Set runner info\n      run: |\n        echo \"runner_label=${{ matrix.arch[1] }}\" >> $GITHUB_ENV\n        echo \"runner_name=$(hostname)\" >> $GITHUB_ENV\n\n    - name: Setup Build Environment\n      uses: ./.github/workflows/setup-env\n\n    - name: Configure CMake\n      run: |\n        cmake -S . -B build -DCMAKE_BUILD_TYPE=$BUILD_TYPE -G Ninja -DENABLE_LTO=False \\\n          -DENABLE_ASSERTIONS=True -DENABLE_X86_HOST_DEBUG=True -DBUILD_FEX_LINUX_TESTS=True \\\n          -DENABLE_GLIBC_ALLOCATOR_HOOK_FAULT=True -DENABLE_JEMALLOC_GLIBC_ALLOC=False \\\n          -DCMAKE_INSTALL_PREFIX=\"$PWD\"/build/install\n\n    # These steps make a lot of noise but rarely fail.\n    # Put them in a separate step to make normal build logs easier to parse\n    - name: Noisy Build Targets\n      run: cmake --build build --target asm_files 32bit_asm_files JemallocLibs Catch2 vixl cephes_128bit\n\n    - name: Build\n      run: cmake --build build\n\n    - name: Install\n      run: cmake --build build --target install\n\n    # GCC tests\n    - name: GCC64 Target Tests\n      if: ${{ always() }}\n      uses: ./.github/workflows/test\n      with:\n        target: gcc_target_tests_64\n\n    - name: GCC32 Target Tests\n      if: ${{ always() }}\n      uses: ./.github/workflows/test\n      with:\n        target: gcc_target_tests_32\n\n    # API Tests\n    - name: API Tests\n      if: ${{ always() }}\n      uses: ./.github/workflows/test\n      with:\n        target: api_tests\n\n    - name: FEXCore API Tests\n      if: ${{ always() }}\n      uses: ./.github/workflows/test\n      with:\n        target: fexcore_apitests\n\n    # Linux tests\n    - name: FEX Linux Tests\n      if: ${{ always() }}\n      uses: ./.github/workflows/test\n      with:\n        target: fex_linux_tests_all\n\n    # ASM Tests\n    - name: ASM Tests\n      if: ${{ always() }}\n      uses: ./.github/workflows/test\n      with:\n        target: asm_tests\n\n    # POSIX Tests\n    - name: POSIX Tests\n      if: ${{ always() }}\n      uses: ./.github/workflows/test\n      with:\n        target: posix_tests\n\n    - name: Remove old SHM regions\n      if: ${{ always() }}\n      run: cmake --build build --target remove_old_shm_regions\n\n    - name: Upload results\n      if: ${{ always() }}\n      uses: actions/upload-artifact@v6\n      timeout-minutes: 1\n      with:\n        name: Results-${{ env.runner_name }}-${{ env.runner_label }}\n        path: results/*.log\n        retention-days: 3\n\n"
  },
  {
    "path": ".github/workflows/hostrunner.yml",
    "content": "name: Hostrunner tests\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n\nenv:\n  # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)\n  BUILD_TYPE: Release\n  CC: clang\n  CXX: clang++\n  FEX_PORTABLE: 1\n\njobs:\n  hostrunner_tests:\n    runs-on: ${{ matrix.arch }}\n    strategy:\n      matrix:\n        arch: [[self-hosted, x64]]\n      fail-fast: false\n\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        fetch-depth: '0'\n        fetch-tags: 'true'\n\n    - name: Set runner info\n      run: |\n        echo \"runner_label=${{ matrix.arch[1] }}\" >> $GITHUB_ENV\n        echo \"runner_name=$(hostname)\" >> $GITHUB_ENV\n\n    - name: Setup Build Environment\n      uses: ./.github/workflows/setup-env\n\n    - name: Configure CMake\n      run: |\n        cmake -S . -B build -DCMAKE_BUILD_TYPE=$BUILD_TYPE -G Ninja -DENABLE_LTO=False \\\n          -DENABLE_ASSERTIONS=True -DENABLE_X86_HOST_DEBUG=True\n\n    # These steps make a lot of noise but rarely fail.\n    # Put them in a separate step to make normal build logs easier to parse\n    - name: Noisy Build Targets\n      run: cmake --build build --target asm_files 32bit_asm_files JemallocLibs Catch2 vixl cephes_128bit\n\n    - name: Build\n      run: cmake --build build\n\n    # ASM tests\n    - name: ASM Tests\n      if: ${{ always() }}\n      uses: ./.github/workflows/test\n      with:\n        target: asm_tests\n\n    - name: Upload results\n      if: ${{ always() }}\n      uses: actions/upload-artifact@v6\n      timeout-minutes: 1\n      with:\n        name: Results-${{ env.runner_name }}-${{ env.runner_label }}\n        path: results/*.log\n        retention-days: 3\n\n"
  },
  {
    "path": ".github/workflows/instcountci.yml",
    "content": "name: Instruction Count CI run\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n\nenv:\n  # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)\n  BUILD_TYPE: Release\n  CC: clang\n  CXX: clang++\n\njobs:\n  instcountci_tests:\n    runs-on: ${{ matrix.arch }}\n    strategy:\n      matrix:\n        arch: [[self-hosted, x64], [self-hosted, ARM64]]\n      fail-fast: false\n\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        fetch-depth: '0'\n        fetch-tags: 'true'\n\n    - name: Set runner info\n      run: |\n        echo \"runner_label=${{ matrix.arch[1] }}\" >> $GITHUB_ENV\n        echo \"runner_name=$(hostname)\" >> $GITHUB_ENV\n\n    - name: Setup Build Environment\n      uses: ./.github/workflows/setup-env\n\n    - name: Set VIXL_SIM_ENABLED\n      run: |\n        case '${{ matrix.arch[1] }}' in\n          x64) _sim=True ;;\n          ARM64) _sim=False ;;\n        esac\n        echo \"VIXL_SIM_ENABLED=$_sim\" >> $GITHUB_ENV\n\n    - name: Configure CMake\n      run: |\n        cmake -S . -B build -DCMAKE_BUILD_TYPE=$BUILD_TYPE -G Ninja -DENABLE_VIXL_SIMULATOR=$VIXL_SIM_ENABLED \\\n          -DENABLE_VIXL_DISASSEMBLER=True -DENABLE_LTO=False -DENABLE_ASSERTIONS=True -DENABLE_X86_HOST_DEBUG=True\n\n    - name: Build\n      env:\n        FEX_DISABLETELEMETRY: 1\n      run: cmake --build build --target CodeSizeValidation instcountci_test_files\n\n    - name: Instruction Count Tests\n      if: ${{ always() }}\n      uses: ./.github/workflows/test\n      with:\n        target: instcountci_tests\n\n    - name: Update local repo instcount\n      if: ${{ always() }}\n      run: cmake --build build --target instcountci_update_tests\n\n    - name: Check InstCountCI diff\n      if: ${{ always() }}\n      run: git --no-pager diff --exit-code HEAD\n\n    - name: Upload results\n      if: ${{ always() }}\n      uses: actions/upload-artifact@v6\n      timeout-minutes: 1\n      with:\n        name: Results-${{ env.runner_name }}-${{ env.runner_label }}\n        path: results/*.log\n        retention-days: 3\n"
  },
  {
    "path": ".github/workflows/mingw_build.yml",
    "content": "name: Mingw build\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n\nenv:\n  BUILD_TYPE: Debug\n\njobs:\n  mingw_build:\n    runs-on: ${{ matrix.arch }}\n    strategy:\n      matrix:\n        arch: [[self-hosted, ARM64, mingw], [self-hosted, ARM64EC, mingw, ARM64]]\n      fail-fast: false\n\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        fetch-depth: '0'\n        fetch-tags: 'true'\n\n    - name: Set runner label\n      run: echo \"runner_label=${{ matrix.arch[1] }}\" >> $GITHUB_ENV\n\n    - name: Add MingGW to PATH\n      run: echo \"$HOME/llvm-mingw/build/bin/\" >> $GITHUB_PATH\n\n    - name: Set CC\n      run: |\n        case '${{ matrix.arch[1] }}' in\n          x64) _cpu=x86_64 ;;\n          ARM64) _cpu=aarch64 ;;\n          ARM64EC) _cpu=arm64ec ;;\n        esac\n        echo \"MINGW_TRIPLE=${_cpu}-w64-mingw32\" >> $GITHUB_ENV\n\n    - name: Setup Build Environment\n      uses: ./.github/workflows/setup-env\n\n    - name: Configure CMake\n      run: |\n        cmake -S . -B build -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_TOOLCHAIN_FILE=$GITHUB_WORKSPACE/Data/CMake/toolchain_mingw.cmake \\\n        -DMINGW_TRIPLE=$MINGW_TRIPLE -G Ninja -DENABLE_LTO=False -DENABLE_ASSERTIONS=True -DENABLE_X86_HOST_DEBUG=True -DBUILD_TESTING=False \\\n        -DCMAKE_INSTALL_PREFIX=\"$PWD\"/build/install\n\n    - name: Build\n      run: cmake --build build\n"
  },
  {
    "path": ".github/workflows/pr-code-format.yml",
    "content": "# Inspired by LLVM's pr-code-format.yml at\n# https://github.com/llvm/llvm-project/blob/main/.github/workflows/pr-code-format.yml\n\nname: Check code formatting\non:\n  pull_request:\n    branches:\n      - main\n\njobs:\n  code_formatter:\n    runs-on: [self-hosted, X64]\n    if: github.repository == 'FEX-Emu/FEX'\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          ref: ${{ github.event.pull_request.head.sha }}\n\n      - name: Checkout through merge base\n        uses: rmacklin/fetch-through-merge-base@v0\n        timeout-minutes: 3\n        with:\n          base_ref: ${{ github.event.pull_request.base.ref }}\n          head_ref: ${{ github.event.pull_request.head.sha }}\n          deepen_length: 500\n\n      - name: Get changed files\n        run: |\n          BASE=$(git merge-base main HEAD)\n          FILES=$(git diff --name-only \"$BASE\" | tr '\\n' ',' | sed 's/,$//')\n          echo \"CHANGED_FILES=$FILES\" >> $GITHUB_ENV\n\n          echo \"Changed files:\"\n          echo \"$FILES\"\n\n      - name: Check git-clang-format-19 exists\n        run: which git-clang-format-19\n\n      - name: Setup Python env\n        uses: actions/setup-python@v4\n        with:\n          python-version: 3.11\n          cache: pip\n          cache-dependency-path: ./External/code-format-helper/requirements_formatting.txt\n\n      - name: Install python dependencies\n        run: pip install -r ./External/code-format-helper/requirements_formatting.txt\n\n      - name: Run code formatter\n        env:\n          CLANG_FORMAT_PATH: git-clang-format-19\n          GITHUB_PR_NUMBER: ${{ github.event.pull_request.number }}\n          START_REV: ${{ github.event.pull_request.base.sha }}\n          END_REV: ${{ github.event.pull_request.head.sha }}\n        run: |\n          python ./External/code-format-helper/code-format-helper.py \\\n            --repo \"FEX-Emu/FEX\" \\\n            --issue-number \"$GITHUB_PR_NUMBER\" \\\n            --start-rev \"$START_REV\" \\\n            --end-rev \"$END_REV\" \\\n            --changed-files \"$CHANGED_FILES\"\n"
  },
  {
    "path": ".github/workflows/setup-env/action.yml",
    "content": "name: Setup Build Environment\ndescription: Setup RootFS and build environment\n\ninputs:\n  setup-rootfs:\n    description: 'Whether or not to set up the rootfs'\n    default: true\n\nruns:\n  using: composite\n  steps:\n    - name: Set rootfs paths\n      if: ${{ inputs.setup-rootfs == 'true' }}\n      shell: bash\n      run: |\n        echo \"FEX_ROOTFS_MOUNT=/mnt/AutoNFS/rootfs/\" >> $GITHUB_ENV\n        echo \"FEX_ROOTFS_PATH=$HOME/Rootfs/\" >> $GITHUB_ENV\n        echo \"FEX_ROOTFS=$HOME/Rootfs/\" >> $GITHUB_ENV\n\n    - name: Update RootFS cache\n      if: ${{ inputs.setup-rootfs == 'true' }}\n      shell: bash\n      run: python3 Scripts/CI_FetchRootFS.py\n\n    - name: Checkout Submodules\n      shell: bash\n      run: |\n        git submodule sync --recursive\n        git submodule update --init --depth 1\n\n    - name: Clean Build Environment\n      shell: bash\n      run: rm -Rf build\n"
  },
  {
    "path": ".github/workflows/steamrt4.yml",
    "content": "name: steamrt4 build\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n\nenv:\n  DEBIAN_FRONTEND: noninteractive\n  BUILD_TYPE: Release\n  CC: clang\n  CXX: clang++\n\njobs:\n  steamrt4_build:\n    runs-on: ${{ matrix.arch }}\n    strategy:\n      matrix:\n        arch: [[self-hosted, ARM64, distrobox]]\n      fail-fast: false\n\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        fetch-depth: '0'\n        fetch-tags: 'true'\n\n    - name: Set runner label\n      run: echo \"runner_label=${{ matrix.arch[1] }}\" >> $GITHUB_ENV\n\n    - name: Setup Build Environment\n      uses: ./.github/workflows/setup-env\n      with:\n        setup-rootfs: false\n\n    # Setup everything required.\n    - name : distrobox setup\n      run: |\n        distrobox create -Y -i registry.gitlab.steamos.cloud/steamrt/steamrt4/sdk/arm64:4.0.20251117.183306 steamrt4 || true\n        distrobox upgrade steamrt4\n        distrobox enter --name steamrt4 -- sudo apt-get install -y \\\n          git cmake ninja-build ccache \\\n          lld clang \\\n          libclang-dev llvm-dev \\\n          libstdc++-14-dev-i386-cross libgcc-14-dev-i386-cross \\\n          libstdc++-14-dev-amd64-cross libgcc-14-dev-amd64-cross\n\n    - name: Configure CMake\n      run: |\n        distrobox enter --name steamrt4 -- cmake -S . -B build -DCMAKE_BUILD_TYPE=$BUILD_TYPE \\\n          -G Ninja -DBUILD_STEAM_SUPPORT=True -DENABLE_LTO=True -DENABLE_ASSERTIONS=False -DBUILD_THUNKS=True \\\n          -DBUILD_FEXCONFIG=False -DBUILD_TESTING=False -DENABLE_CLANG_THUNKS=True -DUSE_LINKER=lld \\\n          -DCMAKE_INSTALL_PREFIX=/usr\n\n    - name: Build\n      run: distrobox enter --name steamrt4 -- cmake --build build\n\n    - name: install\n      run: DESTDIR=\"$PWD\"/install distrobox enter --name steamrt4 -- cmake --build build -t install\n\n    - name: Upload libraries\n      uses: actions/upload-artifact@v6\n      timeout-minutes: 1\n      with:\n        overwrite: true\n        name: steamrt4_steampipe_depot\n        path: ${{ github.workspace }}/install/*\n        retention-days: 60\n        compression-level: 9\n"
  },
  {
    "path": ".github/workflows/test/action.yml",
    "content": "name: Run Test and Store Logs\ndescription: Run a test and store the log.\ninputs:\n  target:\n    description: 'The test target to run'\n    required: true\n\nruns:\n  using: composite\n  steps:\n    - name: Run Tests\n      shell: bash\n      run: cmake --build build --target ${{ inputs.target }}\n\n    - name: Move and Truncate Results\n      if: ${{ always() }}\n      shell: bash\n      run: |\n        mkdir -p results\n        mv build/Testing/Temporary/LastTest.log results/${{ inputs.target }}.log || true\n        truncate --size=\"<20M\" results/${{ inputs.target }}.log || true\n"
  },
  {
    "path": ".github/workflows/vixl_simulator.yml",
    "content": "name: Vixl Simulator run\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n\nenv:\n  # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)\n  BUILD_TYPE: Release\n  CC: clang\n  CXX: clang++\n  FEX_PORTABLE: 1\n\njobs:\n  vixl_simulator:\n    runs-on: ${{ matrix.arch }}\n    strategy:\n      matrix:\n        # Only the x86-64 runner is fast enough to run this\n        arch: [[self-hosted, x64], [self-hosted, ARMv8.4]]\n      fail-fast: false\n\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        fetch-depth: '0'\n        fetch-tags: 'true'\n\n    - name: Set runner info\n      run: |\n        echo \"runner_label=${{ matrix.arch[1] }}\" >> $GITHUB_ENV\n        echo \"runner_name=$(hostname)\" >> $GITHUB_ENV\n\n    - name: Setup Build Environment\n      uses: ./.github/workflows/setup-env\n\n    - name: Configure CMake\n      run: |\n        cmake -S . -B build -DCMAKE_BUILD_TYPE=$BUILD_TYPE -G Ninja -DENABLE_VIXL_SIMULATOR=True -DENABLE_LTO=False \\\n          -DENABLE_VIXL_DISASSEMBLER=True -DENABLE_ASSERTIONS=True -DENABLE_X86_HOST_DEBUG=True\n\n    # These steps make a lot of noise but rarely fail.\n    # Put them in a separate step to make normal build logs easier to parse\n    - name: Noisy Build Targets\n      run: cmake --build build --target asm_files 32bit_asm_files JemallocLibs Catch2 vixl cephes_128bit\n\n    - name: Build\n      run: cmake --build build\n\n    - name: ASM Tests - SVE256\n      if: ${{ always() }}\n      uses: ./.github/workflows/test\n      with:\n        target: asm_tests\n\n    - name: ASM Tests - SVE128\n      if: ${{ always() }}\n      uses: ./.github/workflows/test\n      env:\n        FEX_FORCESVEWIDTH: \"128\"\n      with:\n        target: asm_tests\n\n    - name: ASM Tests - ASIMD\n      if: ${{ always() }}\n      uses: ./.github/workflows/test\n      env:\n        FEX_HOSTFEATURES: \"disablesve\"\n      with:\n        target: asm_tests\n\n    - name: Upload results\n      if: ${{ always() }}\n      uses: actions/upload-artifact@v6\n      timeout-minutes: 1\n      with:\n        name: Results-${{ env.runner_name }}-${{ env.runner_label }}\n        path: results/*.log\n        retention-days: 3\n"
  },
  {
    "path": ".github/workflows/wine_build/action.yml",
    "content": "name: Wine DLL Build\ndescription: Build a wow64 or arm64ec Wine DLL\n\ninputs:\n  target:\n    description: 'The target (arm64ec or wow64)'\n    required: true\n\nruns:\n  using: composite\n  steps:\n    - name: Clean Build Environment\n      shell: bash\n      run: rm -Rf build_${{ inputs.target }}\n\n    - name: Configure CMake\n      shell: bash\n      run: |\n        case \"${{ inputs.target }}\" in\n          wow64) _cc=aarch64 ;;\n          arm64ec) _cc=arm64ec ;;\n        esac\n\n        cmake -S . -B build_${{ inputs.target }} -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_TOOLCHAIN_FILE=Data/CMake/toolchain_mingw.cmake \\\n          -DMINGW_TRIPLE=${_cc}-w64-mingw32 -DCMAKE_INSTALL_LIBDIR=/usr/lib/wine/aarch64-windows -G Ninja \\\n          -DENABLE_LTO=False -DENABLE_ASSERTIONS=False -DENABLE_JEMALLOC_GLIBC_ALLOC=False \\\n          -DBUILD_TESTING=False -DCMAKE_INSTALL_PREFIX=/usr -DTUNE_ARCH=generic -DTUNE_CPU=none\n\n    - name: Build\n      shell: bash\n      run: cmake --build build_${{ inputs.target }}\n\n    - name: Install\n      shell: bash\n      run: DESTDIR=\"$PWD\"/install cmake --build build_${{ inputs.target }} -t install\n"
  },
  {
    "path": ".github/workflows/wine_dll_artifacts.yml",
    "content": "name: Wine DLL artifacts\n\non:\n  push:\n    branches:\n      - main\n\nenv:\n  BUILD_TYPE: Release\n\njobs:\n  wine_dll_artifacts:\n    runs-on: ${{ matrix.arch }}\n    strategy:\n      matrix:\n        arch: [[self-hosted, ARM64, mingw]]\n      fail-fast: false\n\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        fetch-depth: '0'\n        fetch-tags: 'true'\n\n    - name: Add MingGW to PATH\n      run: echo \"$HOME/llvm-mingw/build/bin/\" >> $GITHUB_PATH\n\n    - name: Checkout Submodules\n      # Need to update submodules\n      run: |\n        git submodule sync --recursive\n        git submodule update --init --depth 1\n\n    - name: Clean install directory\n      run: rm -Rf install\n\n    - name: Build (wow64)\n      uses: ./.github/workflows/wine_build\n      with:\n        target: wow64\n\n    - name: Build (arm64ec)\n      uses: ./.github/workflows/wine_build\n      with:\n        target: arm64ec\n\n    - name: Upload libraries\n      uses: actions/upload-artifact@v6\n      timeout-minutes: 1\n      with:\n        overwrite: true\n        name: wine_dll_artifacts\n        path: ${{ github.workspace }}/install/usr/lib/wine/aarch64-windows/lib*.dll\n        retention-days: 60\n        compression-level: 9\n"
  },
  {
    "path": ".gitignore",
    "content": "# Existing\n\ncompile_commands.json\nvim_rc\nConfig.json\n\n[Bb]uild*\n[Bb]in/\nout/\n.vscode/\n.vs/\n*.pyc\n.cache\n.idea/\nCMakeLists.txt.user\n"
  },
  {
    "path": ".gitlab-ci.yml",
    "content": "spec:\n  inputs:\n    PROMOTE_BRANCH:\n      description: \"Branch to promote the build to. Empty means no promotion.\"\n      default: \"bleeding-edge\"\n\n---\n\nworkflow:\n  rules:\n    - when: always\n      variables:\n        PROMOTE_BRANCH: $[[ inputs.PROMOTE_BRANCH ]]\n\nvariables:\n    DEBIAN_FRONTEND: noninteractive\n    GIT_SUBMODULE_STRATEGY: recursive\n    GIT_DEPTH: 0\n    CC: clang\n    CXX: clang++\n\nbuild:\n  stage: build\n  image: registry.gitlab.steamos.cloud/steamrt/steamrt4/sdk/arm64:4.0.20251117.183306\n  tags:\n    - docker\n    - linux\n    - arm64\n    - aarch64\n  script:\n    - apt-get -y update\n    - apt-get install -y\n        git cmake ninja-build ccache\n        lld clang\n        libclang-dev llvm-dev\n        libstdc++-14-dev-i386-cross libgcc-14-dev-i386-cross\n        libstdc++-14-dev-amd64-cross libgcc-14-dev-amd64-cross\n    - cmake -E make_directory build/\n    - cmake -DCMAKE_BUILD_TYPE=Release -G Ninja -DBUILD_STEAM_SUPPORT=True -DENABLE_LTO=True -DENABLE_ASSERTIONS=False -DBUILD_THUNKS=True -DBUILD_FEXCONFIG=False -DBUILD_TESTING=False -DENABLE_CLANG_THUNKS=True -DUSE_LINKER=lld -DCMAKE_INSTALL_PREFIX=/usr -DTUNE_ARCH=armv8.2-a -DTUNE_CPU=none . -B build/\n    - cmake --build build/ --config Release\n    - DESTDIR=$(pwd)/install/ cmake --build build/ --config Release -t install\n\n  artifacts:\n    name: \"steamrt artifacts\"\n    untracked: false\n    paths:\n      - install/\n\npromote:\n  stage: deploy\n  variables:\n    GIT_STRATEGY: none\n  image: registry.gitlab.steamos.cloud/steamrt/steamrt4/sdk/arm64:4.0.20251117.183306\n  tags:\n    - docker\n    - linux\n    - arm64\n    - aarch64\n  rules:\n    - if: '$PROMOTE_BRANCH'\n  before_script:\n    - apt-get -y update\n    - apt-get install -y tmux curl\n  script:\n    # comment out to debug: SSH in via GCP, go down the container and attach to the session (with `tmux attach -t debug`)\n#    - tmux new-session -d -s debug\n#    - while tmux has-session -t debug 2>/dev/null; do sleep 1; done\n\n    # ref controls which fex-depot code runs the pipeline, while VERSION_PARAM controls which fex branch's artifacts that pipeline downloads.\n    - >\n      curl --fail --location --request POST --form token=${FEX_DEPOT_TRIGGER_TOKEN} --form ref=master --form \"variables[PROMOTE_BRANCH]=${PROMOTE_BRANCH}\" --form \"variables[VERSION_PARAM]=${CI_COMMIT_REF_NAME}\" \"${CI_API_V4_URL}/projects/fex%2Ffex-depot/trigger/pipeline\"\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"External/vixl\"]\n\tshallow = true\n\tpath = External/vixl\n\turl = https://github.com/FEX-Emu/vixl.git\n[submodule \"External/cpp-optparse\"]\n\tpath = Source/Common/cpp-optparse\n\turl = https://github.com/Sonicadvance1/cpp-optparse\n[submodule \"External/fex-posixtest-bins\"]\n  shallow = true\n\tpath = External/fex-posixtest-bins\n\turl = https://github.com/FEX-Emu/fex-posixtest-bins.git\n[submodule \"External/fex-gvisor-tests-bins\"]\n  shallow = true\n\tpath = External/fex-gvisor-tests-bins\n\turl = https://github.com/FEX-Emu/fex-gvisor-tests-bins.git\n[submodule \"External/fex-gcc-target-tests-bins\"]\n  shallow = true\n\tpath = External/fex-gcc-target-tests-bins\n\turl = https://github.com/FEX-Emu/fex-gcc-target-tests-bins.git\n[submodule \"External/fmt\"]\n\tpath = External/fmt\n\turl = https://github.com/fmtlib/fmt.git\n[submodule \"External/drm-headers\"]\n\tpath = External/drm-headers\n\turl = https://github.com/FEX-Emu/drm-headers.git\n[submodule \"External/xxhash\"]\n\tpath = External/xxhash\n\turl = https://github.com/Cyan4973/xxHash.git\n[submodule \"External/Catch2\"]\n\tpath = External/Catch2\n\turl = https://github.com/catchorg/Catch2.git\n[submodule \"External/Vulkan-Headers\"]\n\tshallow = true\n\tpath = External/Vulkan-Headers\n\turl = https://github.com/KhronosGroup/Vulkan-Headers.git\n[submodule \"External/jemalloc_glibc\"]\n\tpath = External/jemalloc_glibc\n\turl = https://github.com/FEX-Emu/jemalloc.git\n[submodule \"External/tracy\"]\n\tpath = External/tracy\n\turl = https://github.com/wolfpld/tracy\n[submodule \"External/range-v3\"]\n\tpath = External/range-v3\n\turl = https://github.com/ericniebler/range-v3.git\n[submodule \"External/zydis\"]\n\tshallow = true\n\tpath = External/zydis\n\turl = https://github.com/zyantific/zydis.git\n[submodule \"External/unordered_dense\"]\n\tpath = External/unordered_dense\n\turl = https://github.com/martinus/unordered_dense.git\n[submodule \"External/rpmalloc\"]\n\tpath = External/rpmalloc\n\turl = https://github.com/FEX-Emu/rpmalloc.git\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.14)\nproject(FEX C CXX ASM)\n\ninclude(CheckIncludeFiles)\ncheck_include_files(\"gdb/jit-reader.h\" HAVE_GDB_JIT_READER_H)\n\noption(BUILD_FEX_LINUX_TESTS \"Build FEXLinuxTests (requires x86 compiler)\" FALSE)\noption(BUILD_THUNKS \"Build thunks\" FALSE)\noption(BUILD_FEXCONFIG \"Build FEXConfig\" TRUE)\noption(ENABLE_CLANG_THUNKS \"Build thunks with clang\" TRUE)\noption(ENABLE_IWYU \"Enable the Include What You Use sanitizer\" FALSE)\noption(ENABLE_LTO \"Enable LTO with compilation\" TRUE)\noption(ENABLE_XRAY \"Enable building with LLVM X-Ray\" FALSE)\nset(USE_LINKER \"\" CACHE STRING \"Path to a custom linker program\")\noption(ENABLE_UBSAN \"Enable the Clang Undefined Behavior Sanitizer\" FALSE)\noption(ENABLE_ASAN \"Enable the Clang Address Sanitizer\" FALSE)\noption(ENABLE_TSAN \"Enable the Clang Thread Sanitizer\" FALSE)\noption(ENABLE_COVERAGE \"Enable Code Coverage\" FALSE)\noption(ENABLE_ASSERTIONS \"Enable debug assertions\" FALSE)\noption(ENABLE_GDB_SYMBOLS \"Enable GDBSymbols integration support\" ${HAVE_GDB_JIT_READER_H})\noption(ENABLE_STRICT_WERROR \"Enable stricter -Werror\" FALSE)\noption(ENABLE_WERROR \"Enable -Werror\" FALSE)\noption(ENABLE_FEX_ALLOCATOR \"Enable allocator for FEX\" TRUE)\noption(ENABLE_JEMALLOC_GLIBC_ALLOC \"Enable jemalloc glibc allocator\" TRUE)\noption(ENABLE_OFFLINE_TELEMETRY \"Enable FEX offline telemetry\" TRUE)\noption(ENABLE_COMPILE_TIME_TRACE \"Enable time trace compile option\" FALSE)\noption(ENABLE_LIBCXX \"Use LLVM's libc++ instead of the GNU libstdc++\" FALSE)\noption(ENABLE_CCACHE \"Enable ccache for build caching\" TRUE)\noption(ENABLE_VIXL_SIMULATOR \"Use the VIXL simulator for emulation (only useful for CI testing)\" FALSE)\noption(ENABLE_VIXL_DISASSEMBLER \"Enable debug disassembler output with VIXL\" FALSE)\noption(ENABLE_ZYDIS \"Enable x86/x86-64 guest disassembler output with Zydis\" FALSE)\noption(USE_LEGACY_BINFMTMISC \"Use legacy method of setting up binfmt_misc\" FALSE)\noption(ENABLE_FEXCORE_PROFILER \"Enable FEXCore's timeline profiling capabilities\" FALSE)\nset(FEXCORE_PROFILER_BACKEND \"gpuvis\" CACHE STRING \"Set which backend to use for FEXCore's profiler\")\nset_property(CACHE FEXCORE_PROFILER_BACKEND PROPERTY STRINGS gpuvis tracy)\noption(ENABLE_GLIBC_ALLOCATOR_HOOK_FAULT \"Enables glibc memory allocation hooking with fault for CI testing\")\noption(USE_PDB_DEBUGINFO \"Build debug info in PDB format\" FALSE)\noption(BUILD_STEAM_SUPPORT \"Enable Steam integration\" FALSE)\n\nset(X86_32_TOOLCHAIN_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/Data/CMake/toolchain_x86_32.cmake\" CACHE FILEPATH \"Toolchain file for the (cross-)compiler targeting i686\")\nset(X86_64_TOOLCHAIN_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/Data/CMake/toolchain_x86_64.cmake\" CACHE FILEPATH \"Toolchain file for the (cross-)compiler targeting x86_64\")\nset(X86_DEV_ROOTFS \"/\" CACHE FILEPATH \"Path to the sysroot used for cross-compiling for i686 and x86_64\")\nset(DATA_DIRECTORY \"\" CACHE PATH \"Global data directory (override)\")\nset(HOSTLIBS_DATA_DIRECTORY \"\" CACHE PATH \"Global data directory (override)\")\n\nif (NOT DATA_DIRECTORY)\n  set(DATA_DIRECTORY \"${CMAKE_INSTALL_PREFIX}/share/fex-emu\")\nendif()\n\ninclude(GNUInstallDirs)\nif (NOT HOSTLIBS_DATA_DIRECTORY)\n  set(HOSTLIBS_DATA_DIRECTORY \"${CMAKE_INSTALL_FULL_LIBDIR}/fex-emu\")\nendif()\n\n## Platform Checks ##\n# Only 64-bit Linux and Windows are supported\n\n# NB: SIZEOF_VOID_P is in bytes, not bits\n# On 32-bit systems this is set to 4\nif (NOT CMAKE_SIZEOF_VOID_P EQUAL 8)\n  message(FATAL_ERROR \"Unsupported pointer size ${CMAKE_SIZEOF_VOID_P}.\"\n    \" FEX only supports 64-bit (8-byte pointer) systems.\"\n    \" If you believe this is in error, file an issue.\")\nelseif (NOT (WIN32 OR CMAKE_SYSTEM_NAME STREQUAL \"Linux\"))\n  message(FATAL_ERROR \"Unsupported system type ${CMAKE_SYSTEM_NAME}.\"\n    \" FEX only supports Linux and Windows.\"\n    \" If you believe this is in error, file an issue.\")\nendif()\n\n## Compiler Checks ##\n# GCC and MSVC are unsupported\nif (CMAKE_CXX_COMPILER_ID STREQUAL \"GNU\")\n  message(FATAL_ERROR \"FEX doesn't support GCC! Use Clang instead.\")\nelseif (MSVC)\n  message(FATAL_ERROR \"FEX doesn't support MSVC! Use Clang on MinGW instead.\")\nelseif (MINGW)\n  message(STATUS \"Building for MinGW\")\n  set(ENABLE_FEX_ALLOCATOR TRUE)\n  set(ENABLE_JEMALLOC_GLIBC_ALLOC FALSE)\nelse ()\n  message(STATUS \"Clang version ${CMAKE_CXX_COMPILER_VERSION}\")\n  set(CLANG_MINIMUM_VERSION 13.0)\n  if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${CLANG_MINIMUM_VERSION})\n    message(FATAL_ERROR \"Clang version too old for FEX. Need at least ${CLANG_MINIMUM_VERSION} but has ${CMAKE_CXX_COMPILER_VERSION}\")\n  endif()\nendif()\n\n## Architecture Handling ##\nstring(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} processor)\nif (processor MATCHES \"x86|amd64\")\n  option(ENABLE_X86_HOST_DEBUG \"Enables compiling on x86_64 host\" FALSE)\n  if (NOT ENABLE_X86_HOST_DEBUG)\n    message(FATAL_ERROR\n      \" FEX doesn't support compiling for x86-64 hosts!\"\n      \" This is /only/ a supported configuration for FEX CI and nothing else!\")\n  else()\n    message(STATUS \"x86_64 debug build\")\n  endif()\n\n  set(ARCHITECTURE_x86_64 1)\n  add_compile_definitions(ARCHITECTURE_x86_64=1)\n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -mcx16\")\nelseif (processor MATCHES \"^aarch64|^arm64|^armv8\\.*\")\n  set(ARCHITECTURE_arm64 1)\n  add_compile_definitions(ARCHITECTURE_arm64=1)\n\n  # arm64ec needs to define both arm64 and arm64ec\n  if (processor MATCHES \"^arm64ec\")\n    set(ARCHITECTURE_arm64ec 1)\n    add_compile_definitions(ARCHITECTURE_arm64ec=1)\n  endif()\nendif()\n\nif (NOT (ARCHITECTURE_arm64 OR ARCHITECTURE_arm64ec OR ARCHITECTURE_x86_64))\n  message(FATAL_ERROR \"Unsupported processor type ${processor}.\"\n    \" If you believe this is in error, file an issue.\")\nendif()\n\nif (BUILD_STEAM_SUPPORT)\n  add_compile_definitions(FEX_STEAM_SUPPORT=1)\nendif()\n\nif (ENABLE_FEXCORE_PROFILER)\n  add_compile_definitions(ENABLE_FEXCORE_PROFILER=1)\n  string(TOUPPER \"${FEXCORE_PROFILER_BACKEND}\" FEXCORE_PROFILER_BACKEND)\n\n  if (FEXCORE_PROFILER_BACKEND STREQUAL \"GPUVIS\")\n    add_compile_definitions(FEXCORE_PROFILER_BACKEND=1)\n  elseif (FEXCORE_PROFILER_BACKEND STREQUAL \"TRACY\")\n    add_compile_definitions(FEXCORE_PROFILER_BACKEND=2)\n    add_compile_definitions(TRACY_ENABLE=1)\n    # Required so that Tracy will only start in the selected guest application\n    add_compile_definitions(TRACY_MANUAL_LIFETIME=1)\n    add_compile_definitions(TRACY_DELAYED_INIT=1)\n    # This interferes with FEX's signal handling\n    add_compile_definitions(TRACY_NO_CRASH_HANDLER=1)\n    # Tracy can gather call stack samples in regular intervals, but this\n    # isn't useful for us since it would usually sample opaque JIT code\n    add_compile_definitions(TRACY_NO_SAMPLING=1)\n    # This pulls in libbacktrace which allocators in global constructors (before FEX can set up its allocator hooks)\n    add_compile_definitions(TRACY_NO_CALLSTACK=1)\n    if (MINGW)\n      message(FATAL_ERROR \"Tracy profiler not supported on MinGW\")\n    endif()\n  else()\n    message(FATAL_ERROR \"Unknown FEXCore profiler backend ${FEXCORE_PROFILER_BACKEND}\")\n  endif()\nendif()\n\nif (ENABLE_JEMALLOC_GLIBC_ALLOC AND ENABLE_GLIBC_ALLOCATOR_HOOK_FAULT)\n  message(FATAL_ERROR \"Can't have both glibc fault allocator and jemalloc glibc allocator enabled at the same time\")\nendif()\n\nif (ENABLE_GLIBC_ALLOCATOR_HOOK_FAULT)\n  add_compile_definitions(GLIBC_ALLOCATOR_FAULT=1)\nendif()\n\n# uninstall target\nif(NOT TARGET uninstall)\n  configure_file(\n    \"${CMAKE_CURRENT_SOURCE_DIR}/Data/CMake/cmake_uninstall.cmake.in\"\n    \"${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/cmake_uninstall.cmake\"\n    IMMEDIATE @ONLY)\n\n  add_custom_target(uninstall\n    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/cmake_uninstall.cmake)\nendif()\n\n# These options are meant for package management\nset(TUNE_CPU \"native\" CACHE STRING \"Override the CPU the build is tuned for\")\nset(TUNE_ARCH \"generic\" CACHE STRING \"Override the Arch the build is tuned for\")\nset(OVERRIDE_VERSION \"detect\" CACHE STRING \"Override the FEX version\")\nset(OVERRIDE_HASH \"detect\" CACHE STRING \"Override the FEX git hash\")\n\nget_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)\nif (NOT IS_MULTI_CONFIG AND NOT CMAKE_BUILD_TYPE)\n    set(CMAKE_BUILD_TYPE Release\n        CACHE STRING \"Choose the type of build.\" FORCE)\n    message(STATUS \"No build type set, defaulting to a Release build\")\nendif()\n\nstring(TOUPPER \"${CMAKE_BUILD_TYPE}\" CMAKE_BUILD_TYPE)\nif (CMAKE_BUILD_TYPE MATCHES \"DEBUG\")\n  set(ENABLE_ASSERTIONS TRUE)\nendif()\n\nif (ENABLE_ASSERTIONS)\n  message(STATUS \"Assertions enabled\")\n  add_compile_definitions(ASSERTIONS_ENABLED=1)\nendif()\n\nif (ENABLE_GDB_SYMBOLS)\n  message(STATUS \"GDBSymbols support enabled\")\n  add_compile_definitions(GDB_SYMBOLS_ENABLED=1)\nendif()\n\nset(CMAKE_CXX_STANDARD 20)\nset(CMAKE_EXPORT_COMPILE_COMMANDS ON)\nset(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Bin)\nset(CMAKE_INCLUDE_CURRENT_DIR ON)\nset(CMAKE_POSITION_INDEPENDENT_CODE ON)\ncmake_policy(SET CMP0083 NEW) # Follow new PIE policy\ninclude(CheckPIESupported)\ncheck_pie_supported()\n\nset(CMAKE_INTERPROCEDURAL_OPTIMIZATION ${ENABLE_LTO})\n\ninclude(CheckCXXSourceCompiles)\nset(CMAKE_REQUIRED_FLAGS \"-std=c++11 -Wattributes -Werror=attributes\")\ncheck_cxx_source_compiles(\n  \"\n  __attribute__((preserve_all))\n  int Testy(int a, int b, int c, int d, int e, int f) {\n  return a + b + c + d + e + f;\n  }\n  int main() {\n  return Testy(0, 1, 2, 3, 4, 5);\n  }\"\n  HAS_CLANG_PRESERVE_ALL)\nunset(CMAKE_REQUIRED_FLAGS)\nif (HAS_CLANG_PRESERVE_ALL)\n  if (MINGW)\n    message(STATUS \"Ignoring broken clang::preserve_all support\")\n    set(HAS_CLANG_PRESERVE_ALL FALSE)\n  else()\n    message(STATUS \"Has clang::preserve_all\")\n  endif()\nendif()\n\nif (ARCHITECTURE_arm64 AND HAS_CLANG_PRESERVE_ALL)\n  add_compile_definitions(\"FEX_PRESERVE_ALL_ATTR=__attribute__((preserve_all))\" \"FEX_HAS_PRESERVE_ALL_ATTR=1\")\nelse()\n  add_compile_definitions(\"FEX_PRESERVE_ALL_ATTR=\" \"FEX_HAS_PRESERVE_ALL_ATTR=0\")\nendif()\n\ncheck_cxx_source_compiles(\n  \"\n  #define _GNU_SOURCE\n  #include <errno.h>\n  int main() {\n  return program_invocation_name == nullptr;\n  }\"\n  HAS_PROGRAM_INVOCATION_NAME)\nadd_compile_definitions(\"HAS_PROGRAM_INVOCATION_NAME=${HAS_PROGRAM_INVOCATION_NAME}\")\n\nif (ENABLE_VIXL_SIMULATOR)\n  # We can run the simulator on both x86-64 or AArch64 hosts\n  add_compile_definitions(VIXL_SIMULATOR=1 VIXL_INCLUDE_SIMULATOR_AARCH64=1)\nendif()\n\nif (ENABLE_CCACHE)\n  find_program(CCACHE_PROGRAM ccache)\n  if(CCACHE_PROGRAM)\n    message(STATUS \"CCache enabled\")\n    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE \"${CCACHE_PROGRAM}\")\n  endif()\nendif()\n\nif (ENABLE_XRAY)\n  add_compile_options(-fxray-instrument)\n  link_libraries(-fxray-instrument)\nendif()\n\nif (ENABLE_COMPILE_TIME_TRACE)\n  add_compile_options(-ftime-trace)\n  link_libraries(-ftime-trace)\nendif()\n\nset(PTHREAD_LIB pthread)\n\nif (USE_LINKER)\n  message(STATUS \"Overriding linker to: ${USE_LINKER}\")\n  add_link_options(\"-fuse-ld=${USE_LINKER}\")\nendif()\n\nif (ENABLE_LIBCXX)\n  message(WARNING \"This is an unsupported configuration and should only be used for testing\")\n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++\")\n  set(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -lc++abi\")\nendif()\n\nif (NOT ENABLE_OFFLINE_TELEMETRY)\n  # Disable FEX offline telemetry entirely if asked\n  add_compile_definitions(FEX_DISABLE_TELEMETRY=1)\nendif()\n\nif (ENABLE_UBSAN)\n  # See https://github.com/FEX-Emu/FEX/pull/4494#issuecomment-2800608944\n  # and related discussion for the use of -fno-sanitize=alignment -fno-sanitize=function\n  # with UBSAN.\n  # alignment: we don't follow a strict alignment policy, for example IR uses packed structs\n  # that are regularly access unaligned.\n  # function: syscalls cast function pointers to void (*)(unsigned long...), causing warnings\n  # related to this access.\n  add_compile_definitions(ENABLE_UBSAN=1)\n  add_compile_options(-fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize=alignment -fno-sanitize=function -fno-sanitize-recover=undefined)\n  link_libraries(-fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize=alignment -fno-sanitize=function -fno-sanitize-recover=undefined)\nendif()\n\nif (ENABLE_ASAN)\n  add_compile_definitions(ENABLE_ASAN=1)\n  add_compile_options(-fno-omit-frame-pointer -fsanitize=address -fsanitize-address-use-after-scope)\n  link_libraries(-fno-omit-frame-pointer -fsanitize=address -fsanitize-address-use-after-scope)\nendif()\n\nif (ENABLE_TSAN)\n  add_compile_options(-fno-omit-frame-pointer -fsanitize=thread)\n  link_libraries(-fno-omit-frame-pointer -fsanitize=thread)\nendif()\n\nif (ENABLE_COVERAGE)\n  add_compile_options(-fprofile-instr-generate -fcoverage-mapping)\n  link_libraries(-fprofile-instr-generate -fcoverage-mapping)\nendif()\n\nif (ENABLE_JEMALLOC_GLIBC_ALLOC)\n  # The glibc jemalloc subproject which hooks the glibc allocator.\n  # Required for thunks to work.\n  # All host native libraries will use this allocator, while *most* other FEX internal allocations will use the other jemalloc allocator.\n  add_subdirectory(External/jemalloc_glibc/)\nelseif (NOT MINGW)\n  message(STATUS\n    \" jemalloc glibc allocator disabled!\\n\"\n    \" This is not a recommended configuration!\\n\"\n    \" This will very explicitly break thunk execution!\\n\"\n    \" Use at your own risk!\")\nendif()\n\nif (ENABLE_FEX_ALLOCATOR)\n  # The rpmalloc subproject that all FEXCore fextl objects allocate through.\n  add_subdirectory(External/rpmalloc/)\nelseif (NOT MINGW)\n  message (STATUS\n    \" FEX allocator is disabled!\\n\"\n    \" This is not a recommended configuration!\\n\"\n    \" This will very explicitly break 32-bit application execution!\\n\"\n    \" Use at your own risk!\")\nendif()\n\nif (USE_PDB_DEBUGINFO)\n  add_compile_options(-g -gcodeview)\n  add_link_options(-g -Wl,--pdb=)\nendif()\n\nset(CMAKE_CXX_FLAGS_RELWITHDEBINFO \"${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -fno-omit-frame-pointer\")\nset(CMAKE_LINKER_FLAGS_RELWITHDEBINFO \"${CMAKE_LINKER_FLAGS_RELWITHDEBINFO} -fno-omit-frame-pointer\")\n\nset(CMAKE_CXX_FLAGS_RELEASE \"${CMAKE_CXX_FLAGS_RELEASE} -fomit-frame-pointer\")\nset(CMAKE_LINKER_FLAGS_RELEASE \"${CMAKE_LINKER_FLAGS_RELEASE} -fomit-frame-pointer\")\n\n## Modules ##\nlist(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/Data/CMake/)\n\ninclude(LinkerGC)\n\n## Externals ##\n\nfind_package(unordered_dense QUIET CONFIG)\nif (NOT unordered_dense_FOUND)\n  add_subdirectory(External/unordered_dense)\nendif()\n\ninclude(CTest)\nif (BUILD_TESTING OR ENABLE_VIXL_DISASSEMBLER OR ENABLE_VIXL_SIMULATOR)\n  add_subdirectory(External/vixl/)\nendif()\n\nif (ENABLE_ZYDIS)\n  find_package(Zycore 1.5 MODULE QUIET)\n  find_package(Zydis 4.0 MODULE QUIET)\n\n  if (TARGET Zydis::Zydis AND TARGET Zycore::Zycore)\n    message(STATUS \"Using system Zydis\")\n  else()\n    set(ZYDIS_BUILD_TOOLS OFF CACHE BOOL \"\" FORCE)\n    set(ZYDIS_BUILD_EXAMPLES OFF CACHE BOOL \"\" FORCE)\n\n    message(STATUS \"Using bundled Zydis\")\n    add_subdirectory(External/zydis/)\n  endif()\nendif()\n\nif (ENABLE_FEXCORE_PROFILER AND FEXCORE_PROFILER_BACKEND STREQUAL \"TRACY\")\n  add_subdirectory(External/tracy)\nendif()\n\nfind_package(Python 3.9 REQUIRED COMPONENTS Interpreter)\n\nset(BUILD_SHARED_LIBS OFF)\n\nif (NOT CMAKE_CROSSCOMPILING)\n  find_package(xxhash MODULE QUIET)\nendif()\n\nif (NOT TARGET xxHash::xxhash)\n  set(XXHASH_BUNDLED_MODE TRUE)\n  set(XXHASH_BUILD_XXHSUM FALSE)\n  add_subdirectory(External/xxhash/cmake_unofficial/)\nendif()\n\nadd_compile_options(-Wno-trigraphs)\nadd_compile_definitions(GLOBAL_DATA_DIRECTORY=\"${DATA_DIRECTORY}/\")\n\nif (BUILD_TESTING)\n  find_package(Catch2 3 QUIET)\n  if (NOT Catch2_FOUND)\n    add_subdirectory(External/Catch2/)\n\n    # Pull in catch_discover_tests definition\n    list(APPEND CMAKE_MODULE_PATH \"${CMAKE_CURRENT_SOURCE_DIR}/External/Catch2/contrib/\")\n  endif()\n\n  include(Catch)\nelse ()\n  # Override any previously generated test list to avoid running stale test binaries\n  file(GENERATE OUTPUT CTestTestfile.cmake CONTENT \"# No tests since BUILD_TESTING is disabled\")\nendif()\n\nfind_package(fmt QUIET)\nif (NOT fmt_FOUND)\n  # Disable fmt install\n  set(FMT_INSTALL OFF)\n  add_subdirectory(External/fmt/)\nendif()\n\nfind_package(range-v3 QUIET)\nif (NOT range-v3_FOUND)\n  add_subdirectory(External/range-v3/)\n  target_compile_definitions(range-v3 INTERFACE RANGES_DISABLE_DEPRECATED_WARNINGS)\nendif()\n\nadd_subdirectory(External/tiny-json/)\n\ninclude_directories(Source/)\ninclude_directories(\"${CMAKE_BINARY_DIR}/Source/\")\n\ninclude(CheckCXXCompilerFlag)\n\n# Add in diagnostic colours if the option is available.\n# Ninja code generator will kill colours if this isn't here\ncheck_cxx_compiler_flag(-fdiagnostics-color=always GCC_COLOR)\ncheck_cxx_compiler_flag(-fcolor-diagnostics CLANG_COLOR)\ncheck_cxx_compiler_flag(-Wno-deprecated-enum-enum-conversion ENUM_ENUM_WARNING)\n\nif (GCC_COLOR)\n  add_compile_options(-fdiagnostics-color=always)\nendif()\nif (CLANG_COLOR)\n  add_compile_options(-fcolor-diagnostics)\nendif()\n\nif(ENUM_ENUM_WARNING)\n  add_compile_options(-Wno-deprecated-enum-enum-conversion)\nendif()\n\n# GCC enables -Wchanges-meaning by default and treats some cases as an error\nif(CMAKE_CXX_COMPILER_ID STREQUAL \"GNU\")\n  add_compile_options(-Wno-error=changes-meaning)\nendif()\n\nif(ENABLE_WERROR OR ENABLE_STRICT_WERROR)\n  add_compile_options(-Werror)\n  if (NOT ENABLE_STRICT_WERROR)\n    # Disable some Werror that can add frustration when developing\n    add_compile_options(-Wno-error=unused-variable)\n  endif()\nendif()\n\nset(FEX_TUNE_COMPILE_FLAGS)\nif (NOT TUNE_ARCH STREQUAL \"generic\")\n  check_cxx_compiler_flag(\"-march=${TUNE_ARCH}\" COMPILER_SUPPORTS_ARCH_TYPE)\n  if(COMPILER_SUPPORTS_ARCH_TYPE)\n    list(APPEND FEX_TUNE_COMPILE_FLAGS \"-march=${TUNE_ARCH}\")\n  else()\n    message(FATAL_ERROR \"Trying to compile arch type '${TUNE_ARCH}' but the compiler doesn't support this\")\n  endif()\nendif()\n\nif (TUNE_CPU STREQUAL \"native\")\n  if(ARCHITECTURE_arm64)\n    if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 999999.0)\n      # Clang 12.0 fixed the -mcpu=native bug with mixed big.little implementers\n      # Clang can not currently check for native Apple M1 type in hypervisor. Currently disabled\n      check_cxx_compiler_flag(\"-mcpu=native\" COMPILER_SUPPORTS_CPU_TYPE)\n      if(COMPILER_SUPPORTS_CPU_TYPE)\n        list(APPEND FEX_TUNE_COMPILE_FLAGS \"-mcpu=native\")\n      endif()\n    else()\n      execute_process(COMMAND python3 \"${PROJECT_SOURCE_DIR}/Scripts/aarch64_fit_native.py\" \"/proc/cpuinfo\" \"${CMAKE_CXX_COMPILER_VERSION}\"\n        OUTPUT_VARIABLE AARCH64_CPU)\n\n      string(STRIP ${AARCH64_CPU} AARCH64_CPU)\n\n      execute_process(COMMAND python3 \"${PROJECT_SOURCE_DIR}/Scripts/NeedDisabledSVE.py\"\n        RESULT_VARIABLE NEEDS_SVE_DISABLED)\n      if (NEEDS_SVE_DISABLED)\n        message(STATUS \"Platform has bugged SVE. Disabling\")\n        set(AARCH64_CPU \"cortex-a78\")\n      endif()\n\n      check_cxx_compiler_flag(\"-mcpu=${AARCH64_CPU}\" COMPILER_SUPPORTS_CPU_TYPE)\n      if(COMPILER_SUPPORTS_CPU_TYPE)\n        list(APPEND FEX_TUNE_COMPILE_FLAGS \"-mcpu=${AARCH64_CPU}\")\n      endif()\n    endif()\n  else()\n    check_cxx_compiler_flag(\"-march=native\" COMPILER_SUPPORTS_MARCH_NATIVE)\n    if(COMPILER_SUPPORTS_MARCH_NATIVE)\n      list(APPEND FEX_TUNE_COMPILE_FLAGS \"-march=native\")\n    endif()\n  endif()\nelseif (NOT TUNE_CPU STREQUAL \"none\")\n  check_cxx_compiler_flag(\"-mcpu=${TUNE_CPU}\" COMPILER_SUPPORTS_CPU_TYPE)\n  if(COMPILER_SUPPORTS_CPU_TYPE)\n    list(APPEND FEX_TUNE_COMPILE_FLAGS \"-mcpu=${TUNE_CPU}\")\n  else()\n    message(FATAL_ERROR \"Trying to compile cpu type '${TUNE_CPU}' but the compiler doesn't support this\")\n  endif()\nendif()\n\nset(GIT_DESCRIBE_STRING \"FEX-Unknown\")\n\nif (OVERRIDE_VERSION STREQUAL \"detect\")\n  find_package(Git)\n\n  if (GIT_FOUND)\n    execute_process(\n      COMMAND ${GIT_EXECUTABLE} describe --abbrev=7\n      WORKING_DIRECTORY \"${CMAKE_SOURCE_DIR}\"\n      OUTPUT_VARIABLE GIT_DESCRIBE_STRING\n      ERROR_QUIET\n      OUTPUT_STRIP_TRAILING_WHITESPACE)\n  endif()\nelse()\n  set(GIT_DESCRIBE_STRING \"${OVERRIDE_VERSION}\")\nendif()\n\nset(GIT_HASH \"Unknown\")\n\nif (OVERRIDE_HASH STREQUAL \"detect\")\n  find_package(Git)\n\n  if (GIT_FOUND)\n    execute_process(\n      COMMAND ${GIT_EXECUTABLE} rev-parse HEAD\n      WORKING_DIRECTORY \"${CMAKE_SOURCE_DIR}\"\n      OUTPUT_VARIABLE GIT_HASH\n      ERROR_QUIET\n      OUTPUT_STRIP_TRAILING_WHITESPACE)\n  endif()\nelse()\n  set(GIT_HASH \"${OVERRIDE_HASH}\")\nendif()\n\nmessage(STATUS \"FEX version: ${GIT_DESCRIBE_STRING}\")\nmessage(STATUS \"FEX commit: ${GIT_HASH}\")\n\n# Prepends 0x to every two-character sequence in the hash,\n# OR the final character of the hash, to plumb it for C++ usage. e.g.:\n# -DOVERRIDE_HASH=123456aa => 0x12, 0x34, 0x56, 0xaa,\n# -DOVERRIDE_HASH=12345678a => 0x12, 0x34, 0x56, 0x78, 0xa,\nstring(REGEX\n  REPLACE \"(..|.$)\" \"0x\\\\1, \"\n  GIT_HASH_ARRAY \"${GIT_HASH}\")\n\nif (ENABLE_IWYU)\n  find_program(IWYU_EXE\n    NAMES iwyu include-what-you-use)\n  if (IWYU_EXE)\n    message(STATUS \"IWYU enabled\")\n    set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE \"${IWYU_EXE}\")\n  endif()\nendif()\n\nadd_compile_options(-Wall)\n\nif (BUILD_TESTING)\n  message(STATUS \"Unit tests are enabled\")\n\n  set(TEST_JOB_COUNT \"\" CACHE STRING \"Override number of parallel jobs to use while running tests\")\n  if (TEST_JOB_COUNT)\n    message(STATUS \"Running tests with ${TEST_JOB_COUNT} jobs\")\n  elseif(CMAKE_VERSION VERSION_LESS \"3.29\")\n    execute_process(COMMAND \"nproc\" OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE TEST_JOB_COUNT)\n  endif()\n  set(TEST_JOB_FLAG \"-j${TEST_JOB_COUNT}\")\nendif()\n\nadd_subdirectory(External/SoftFloat-3e/)\nadd_subdirectory(External/cephes/)\nadd_subdirectory(FEXHeaderUtils/)\nadd_subdirectory(CodeEmitter/)\nadd_subdirectory(FEXCore/)\n\nif (ARCHITECTURE_arm64 AND NOT MINGW AND NOT BUILD_STEAM_SUPPORT)\n  # Binfmt_misc files must be installed prior to Source/ installs\n  add_subdirectory(Data/binfmts/)\nendif()\n\nadd_subdirectory(Source/)\n\nif (NOT BUILD_STEAM_SUPPORT)\n  add_subdirectory(Data/AppConfig/)\nendif()\n\n# Install the ThunksDB file\nfile(GLOB CONFIG_SOURCES CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/Data/*.json)\n\n# Any application configuration json file gets installed\nforeach(CONFIG_SRC ${CONFIG_SOURCES})\n  install(FILES ${CONFIG_SRC}\n    DESTINATION ${DATA_DIRECTORY}/\n    COMPONENT Runtime)\nendforeach()\n\nif (BUILD_TESTING)\n  add_subdirectory(unittests/)\nendif()\n\nif (BUILD_THUNKS)\n  set(FEX_PROJECT_SOURCE_DIR ${PROJECT_SOURCE_DIR})\n  add_subdirectory(ThunkLibs/Generator)\n\n  # Thunk targets for both host libraries and IDE integration\n  add_subdirectory(ThunkLibs/HostLibs)\n\n  # Thunk targets for IDE integration of guest code, only\n  add_subdirectory(ThunkLibs/GuestLibs)\n\n  # Thunk targets for guest libraries\n  include(ExternalProject)\n  ExternalProject_Add(guest-libs\n    PREFIX guest-libs\n    SOURCE_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/ThunkLibs/GuestLibs\"\n    BINARY_DIR \"Guest\"\n    CMAKE_ARGS\n      \"-DBITNESS=64\"\n      \"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}\"\n      \"-DBUILD_FEX_LINUX_TESTS=${BUILD_FEX_LINUX_TESTS}\"\n      \"-DENABLE_CLANG_THUNKS=${ENABLE_CLANG_THUNKS}\"\n      \"-DCMAKE_TOOLCHAIN_FILE:FILEPATH=${X86_64_TOOLCHAIN_FILE}\"\n      \"-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}\"\n      \"-DFEX_PROJECT_SOURCE_DIR=${FEX_PROJECT_SOURCE_DIR}\"\n      \"-DGENERATOR_EXE=$<TARGET_FILE:thunkgen>\"\n      \"-DX86_DEV_ROOTFS=${X86_DEV_ROOTFS}\"\n    INSTALL_COMMAND \"\"\n    BUILD_ALWAYS ON\n    DEPENDS thunkgen)\n\n  ExternalProject_Add(guest-libs-32\n    PREFIX guest-libs-32\n    SOURCE_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/ThunkLibs/GuestLibs\"\n    BINARY_DIR \"Guest_32\"\n    CMAKE_ARGS\n      \"-DBITNESS=32\"\n      \"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}\"\n      \"-DBUILD_FEX_LINUX_TESTS=${BUILD_FEX_LINUX_TESTS}\"\n      \"-DENABLE_CLANG_THUNKS=${ENABLE_CLANG_THUNKS}\"\n      \"-DCMAKE_TOOLCHAIN_FILE:FILEPATH=${X86_32_TOOLCHAIN_FILE}\"\n      \"-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}\"\n      \"-DFEX_PROJECT_SOURCE_DIR=${FEX_PROJECT_SOURCE_DIR}\"\n      \"-DGENERATOR_EXE=$<TARGET_FILE:thunkgen>\"\n      \"-DX86_DEV_ROOTFS=${X86_DEV_ROOTFS}\"\n    INSTALL_COMMAND \"\"\n    BUILD_ALWAYS ON\n    DEPENDS thunkgen)\n\n  install(\n    CODE \"message(\\\"-- Installing: guest-libs\\\")\"\n    CODE \"\n      execute_process(COMMAND ${CMAKE_COMMAND} --build . --target install\n        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/Guest)\"\n    DEPENDS guest-libs\n    COMPONENT Runtime)\n\n  install(\n    CODE \"message(\\\"-- Installing: guest-libs-32\\\")\"\n    CODE \"\n      execute_process(COMMAND ${CMAKE_COMMAND} --build . --target install\n        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/Guest_32)\"\n    DEPENDS guest-libs-32\n    COMPONENT Runtime)\n\n  add_custom_target(uninstall_guest-libs\n    COMMAND ${CMAKE_COMMAND} \"--build\" \".\" \"--target\" \"uninstall\"\n    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/Guest)\n\n  add_custom_target(uninstall_guest-libs-32\n    COMMAND ${CMAKE_COMMAND} \"--build\" \".\" \"--target\" \"uninstall\"\n    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/Guest_32)\n\n  add_dependencies(uninstall uninstall_guest-libs)\n  add_dependencies(uninstall uninstall_guest-libs-32)\nendif()\n\nif (NOT MINGW AND BUILD_STEAM_SUPPORT)\n  add_subdirectory(Source/Steam/)\nendif()\n"
  },
  {
    "path": "CMakeSettings.json",
    "content": "﻿{\r\n\t\"environments\": [\r\n\t\t{\r\n\t\t\t\"BuildPath\": \"${projectDir}\\\\out\\\\build\\\\${name}\",\r\n\t\t\t\"InstallPath\": \"${projectDir}\\\\out\\\\install\\\\${name}\",\r\n\t\t\t\"clangcl\": \"clang-cl.exe\",\r\n\t\t\t\"cc\": \"clang\",\r\n\t\t\t\"cxx\": \"clang++\"\r\n\t\t}\r\n\t],\r\n\t\"configurations\": [\r\n\t\t{\r\n\t\t\t\"name\": \"WSL-Clang-Debug\",\r\n\t\t\t\"generator\": \"Ninja\",\r\n\t\t\t\"configurationType\": \"Debug\",\r\n\t\t\t\"buildRoot\": \"${env.BuildPath}\",\r\n\t\t\t\"installRoot\": \"${env.InstallPath}\",\r\n\t\t\t\"cmakeExecutable\": \"/usr/bin/cmake\",\r\n\t\t\t\"cmakeCommandArgs\": \"\",\r\n\t\t\t\"buildCommandArgs\": \"-v\",\r\n\t\t\t\"ctestCommandArgs\": \"\",\r\n\t\t\t\"wslPath\": \"${defaultWSLPath}\",\r\n\t\t\t\"inheritEnvironments\": [ \"linux_clang_x64\" ],\r\n\t\t\t\"addressSanitizerRuntimeFlags\": \"detect_leaks=0\",\r\n\t\t\t\"variables\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"name\": \"WSL\",\r\n\t\t\t\t\t\"value\": \"TRUE\",\r\n\t\t\t\t\t\"type\": \"BOOL\"\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"name\": \"WSL-Clang-Release\",\r\n\t\t\t\"generator\": \"Ninja\",\r\n\t\t\t\"configurationType\": \"RelWithDebInfo\",\r\n\t\t\t\"buildRoot\": \"${env.BuildPath}\",\r\n\t\t\t\"installRoot\": \"${env.InstallPath}\",\r\n\t\t\t\"cmakeExecutable\": \"/usr/bin/cmake\",\r\n\t\t\t\"cmakeCommandArgs\": \"\",\r\n\t\t\t\"buildCommandArgs\": \"-v\",\r\n\t\t\t\"ctestCommandArgs\": \"\",\r\n\t\t\t\"wslPath\": \"${defaultWSLPath}\",\r\n\t\t\t\"inheritEnvironments\": [ \"linux_clang_x64\" ],\r\n\t\t\t\"addressSanitizerRuntimeFlags\": \"detect_leaks=0\",\r\n\t\t\t\"variables\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"name\": \"WSL\",\r\n\t\t\t\t\t\"value\": \"TRUE\",\r\n\t\t\t\t\t\"type\": \"BOOL\"\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"name\": \"x86-Clang-Cross-Debug\",\r\n\t\t\t\"generator\": \"Ninja\",\r\n\t\t\t\"configurationType\": \"Debug\",\r\n\t\t\t\"buildRoot\": \"${env.BuildPath}\",\r\n\t\t\t\"installRoot\": \"${env.InstallPath}\",\r\n\t\t\t\"cmakeCommandArgs\": \"\",\r\n\t\t\t\"buildCommandArgs\": \"-v\",\r\n\t\t\t\"ctestCommandArgs\": \"\",\r\n\t\t\t\"inheritEnvironments\": [ \"clang_cl_x86\" ],\r\n\t\t\t\"variables\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"name\": \"CMAKE_C_COMPILER\",\r\n\t\t\t\t\t\"value\": \"${env.cc}\",\r\n\t\t\t\t\t\"type\": \"STRING\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"name\": \"CMAKE_CXX_COMPILER\",\r\n\t\t\t\t\t\"value\": \"${env.cxx}\",\r\n\t\t\t\t\t\"type\": \"STRING\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"name\": \"CMAKE_SYSROOT\",\r\n\t\t\t\t\t\"value\": \"${env.fexsysroot}\",\r\n\t\t\t\t\t\"type\": \"STRING\"\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"name\": \"x64-Clang-Cross-Release\",\r\n\t\t\t\"generator\": \"Ninja\",\r\n\t\t\t\"configurationType\": \"RelWithDebInfo\",\r\n\t\t\t\"buildRoot\": \"${env.BuildPath}\",\r\n\t\t\t\"installRoot\": \"${env.InstallPath}\",\r\n\t\t\t\"cmakeCommandArgs\": \"\",\r\n\t\t\t\"buildCommandArgs\": \"-v\",\r\n\t\t\t\"ctestCommandArgs\": \"\",\r\n\t\t\t\"inheritEnvironments\": [ \"clang_cl_x86\" ],\r\n\t\t\t\"variables\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"name\": \"CMAKE_C_COMPILER\",\r\n\t\t\t\t\t\"value\": \"${env.cc}\",\r\n\t\t\t\t\t\"type\": \"STRING\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"name\": \"CMAKE_CXX_COMPILER\",\r\n\t\t\t\t\t\"value\": \"${env.cxx}\",\r\n\t\t\t\t\t\"type\": \"STRING\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"name\": \"CMAKE_SYSROOT\",\r\n\t\t\t\t\t\"value\": \"${env.fexsysroot}\",\r\n\t\t\t\t\t\"type\": \"STRING\"\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"name\": \"Linux-Clang-Remote-Debug\",\r\n\t\t\t\"generator\": \"Ninja\",\r\n\t\t\t\"configurationType\": \"Debug\",\r\n\t\t\t\"cmakeExecutable\": \"/usr/bin/cmake\",\r\n\t\t\t\"remoteCopySourcesExclusionList\": [ \".vs\", \".vscode\", \".git\", \".github\", \"build\", \"out\", \"bin\" ],\r\n\t\t\t\"cmakeCommandArgs\": \"\",\r\n\t\t\t\"buildCommandArgs\": \"-v\",\r\n\t\t\t\"ctestCommandArgs\": \"\",\r\n\t\t\t\"inheritEnvironments\": [ \"linux_clang_x64\" ],\r\n\t\t\t\"remoteMachineName\": \"${env.fexremote}\",\r\n\t\t\t\"remoteCMakeListsRoot\": \"$HOME/projects/.vs/${projectDirName}/src\",\r\n\t\t\t\"remoteBuildRoot\": \"$HOME/projects/.vs/${projectDirName}/build/${name}\",\r\n\t\t\t\"remoteInstallRoot\": \"$HOME/projects/.vs/${projectDirName}/install/${name}\",\r\n\t\t\t\"remoteCopySources\": true,\r\n\t\t\t\"rsyncCommandArgs\": \"-t --delete --delete-excluded\",\r\n\t\t\t\"remoteCopyBuildOutput\": false,\r\n\t\t\t\"remoteCopySourcesMethod\": \"rsync\",\r\n\t\t\t\"addressSanitizerRuntimeFlags\": \"detect_leaks=0\",\r\n\t\t\t\"variables\": []\r\n\t\t}\r\n\t]\r\n}\r\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at team@fex-emu.com. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see\nhttps://www.contributor-covenant.org/faq\n"
  },
  {
    "path": "CodeEmitter/CMakeLists.txt",
    "content": "add_library(CodeEmitter INTERFACE)\ntarget_include_directories(CodeEmitter INTERFACE .)\n"
  },
  {
    "path": "CodeEmitter/CodeEmitter/ALUOps.inl",
    "content": "// SPDX-License-Identifier: MIT\n/* ALU instruction emitters.\n *\n * Almost all of these operations have `ARMEmitter::Size` as their first argument.\n * This allows both 32-bit and 64-bit selection of how that instruction is going to operate.\n *\n * Some emitter operations explicitly use `XRegister` or `WRegister`.\n * This is usually due to the instruction only supporting one operating size.\n * Although in some cases is a minor convenience without any performance implications.\n *\n * FEX-Emu ALU operations usually have a 32-bit or 64-bit operating size encoded in the IR operation,\n * This allows FEX to use a single helper function which decodes to both handlers.\n */\n\n#pragma once\n#ifndef INCLUDED_BY_EMITTER\n#include <CodeEmitter/Emitter.h>\nnamespace ARMEmitter {\nstruct EmitterOps : Emitter {\n#endif\n\nprivate:\n  static bool IsADRRange(int64_t Imm) {\n    return Imm >= -1048576 && Imm <= 1048575;\n  }\n  static bool IsADRPRange(int64_t Imm) {\n    return Imm >= -4294967296 && Imm <= 4294963200;\n  }\n  static bool IsADRPAligned(int64_t Imm) {\n    return (Imm & 0xFFF) == 0;\n  }\npublic:\n  // PC relative\n  void adr(ARMEmitter::Register rd, uint32_t Imm) {\n    constexpr uint32_t Op = 0b0001'0000 << 24;\n    DataProcessing_PCRel_Imm(Op, rd, Imm);\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded adr(ARMEmitter::Register rd, const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n    if (IsADRRange(Imm)) {\n      constexpr uint32_t Op = 0b0001'0000 << 24;\n      DataProcessing_PCRel_Imm(Op, rd, Imm);\n      return BranchEncodeSucceeded::Success;\n    }\n\n    // Can't encode.\n    return BranchEncodeSucceeded::Failure;\n  }\n  [[nodiscard]] BranchEncodeSucceeded adr(ARMEmitter::Register rd, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::ADR});\n    constexpr uint32_t Op = 0b0001'0000 << 24;\n    DataProcessing_PCRel_Imm(Op, rd, 0);\n\n    // Forward label doesn't know if it can encode until Bind.\n    return BranchEncodeSucceeded::Success;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded adr(ARMEmitter::Register rd, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      return adr(rd, &Label->Backward);\n    } else {\n      return adr(rd, &Label->Forward);\n    }\n  }\n\n  void adrp(ARMEmitter::Register rd, uint32_t Imm) {\n    constexpr uint32_t Op = 0b1001'0000 << 24;\n    DataProcessing_PCRel_Imm(Op, rd, Imm);\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded adrp(ARMEmitter::Register rd, const BackwardLabel* Label) {\n    int64_t Imm = reinterpret_cast<int64_t>(Label->Location) - (GetCursorAddress<int64_t>() & ~0xFFFLL);\n\n    if (IsADRPRange(Imm) && IsADRPAligned(Imm)) {\n      constexpr uint32_t Op = 0b1001'0000 << 24;\n      DataProcessing_PCRel_Imm(Op, rd, Imm);\n      return BranchEncodeSucceeded::Success;\n    }\n\n    // Can't encode.\n    return BranchEncodeSucceeded::Failure;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded adrp(ARMEmitter::Register rd, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::ADRP});\n    constexpr uint32_t Op = 0b1001'0000 << 24;\n    DataProcessing_PCRel_Imm(Op, rd, 0);\n\n    // Forward label doesn't know if it can encode until Bind.\n    return BranchEncodeSucceeded::Success;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded adrp(ARMEmitter::Register rd, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      return adrp(rd, &Label->Backward);\n    } else {\n      return adrp(rd, &Label->Forward);\n    }\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded LongAddressGen(ARMEmitter::Register rd, const BackwardLabel* Label) {\n    const auto SLocation = reinterpret_cast<int64_t>(Label->Location);\n    const auto ULocation = std::bit_cast<uint64_t>(SLocation);\n\n    const int64_t Imm = SLocation - (GetCursorAddress<int64_t>());\n    const auto UImm = std::bit_cast<uint64_t>(Imm);\n\n    if (IsADRRange(Imm)) {\n      // If the range is in ADR range then we can just use ADR.\n      return adr(rd, Label);\n    }\n    if (IsADRPRange(Imm)) {\n      const int64_t ADRPImm = (SLocation & ~0xFFFLL) - (GetCursorAddress<int64_t>() & ~0xFFFLL);\n\n      // If the range is in the ADRP range then we can use ADRP.\n      const bool NeedsOffset = !IsADRPAligned(ULocation);\n      const uint64_t AlignedOffset = ULocation & 0xFFFULL;\n\n      // First emit ADRP\n      adrp(rd, ADRPImm >> 12);\n\n      if (NeedsOffset) {\n        // Now even an add\n        add(ARMEmitter::Size::i64Bit, rd, rd, AlignedOffset);\n      }\n\n      return BranchEncodeSucceeded::Success;\n    }\n\n    // Stinky path, we need to load the address as a sequence of movz+movk+movk\n    movz(ARMEmitter::Size::i64Bit, rd, (UImm >> 32) & 0xFFFF, 32);\n    movk(ARMEmitter::Size::i64Bit, rd, (UImm >> 16) & 0xFFFF, 16);\n    movk(ARMEmitter::Size::i64Bit, rd, UImm & 0xFFFF);\n\n    return BranchEncodeSucceeded::Success;\n  }\n  [[nodiscard]] BranchEncodeSucceeded LongAddressGen(ARMEmitter::Register rd, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::LONG_ADDRESS_GEN});\n    // Emit a register index and two nops. These will be backpatched.\n    dc32(rd.Idx());\n    nop();\n    nop();\n\n    // Forward label doesn't know if it can encode until Bind.\n    return BranchEncodeSucceeded::Success;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded LongAddressGen(ARMEmitter::Register rd, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      return LongAddressGen(rd, &Label->Backward);\n    } else {\n      return LongAddressGen(rd, &Label->Forward);\n    }\n  }\n\n  // Add/subtract immediate\n  void add(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t Imm, bool LSL12 = false) {\n    constexpr uint32_t Op = 0b0001'0001'0 << 23;\n    DataProcessing_AddSub_Imm(Op, s, rd, rn, Imm, LSL12);\n  }\n\n  void adds(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t Imm, bool LSL12 = false) {\n    constexpr uint32_t Op = 0b0011'0001'0 << 23;\n    DataProcessing_AddSub_Imm(Op, s, rd, rn, Imm, LSL12);\n  }\n  void cmn(ARMEmitter::Size s, ARMEmitter::Register rn, uint32_t Imm, bool LSL12 = false) {\n    adds(s, ARMEmitter::Reg::zr, rn, Imm, LSL12);\n  }\n  void sub(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t Imm, bool LSL12 = false) {\n    constexpr uint32_t Op = 0b0101'0001'0 << 23;\n    DataProcessing_AddSub_Imm(Op, s, rd, rn, Imm, LSL12);\n  }\n\n  void cmp(ARMEmitter::Size s, ARMEmitter::Register rn, uint32_t Imm, bool LSL12 = false) {\n    constexpr uint32_t Op = 0b0111'0001'0 << 23;\n    DataProcessing_AddSub_Imm(Op, s, ARMEmitter::Reg::rsp, rn, Imm, LSL12);\n  }\n\n  void subs(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t Imm, bool LSL12 = false) {\n    constexpr uint32_t Op = 0b0111'0001'0 << 23;\n    DataProcessing_AddSub_Imm(Op, s, rd, rn, Imm, LSL12);\n  }\n\n  // Min/max immediate\n  void smax(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, int64_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -128 && Imm <= 127, \"{} Immediate too large\", __func__);\n    MinMaxImmediate(0b0000, s, rd, rn, Imm);\n  }\n\n  void umax(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint64_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm <= 255, \"{} Immediate too large\", __func__);\n    MinMaxImmediate(0b0001, s, rd, rn, Imm);\n  }\n\n  void smin(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, int64_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -128 && Imm <= 127, \"{} Immediate too large\", __func__);\n    MinMaxImmediate(0b0010, s, rd, rn, Imm);\n  }\n\n  void umin(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint64_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm <= 255, \"{} Immediate too large\", __func__);\n    MinMaxImmediate(0b0011, s, rd, rn, Imm);\n  }\n\n  // Logical immediate\n  void and_(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint64_t Imm) {\n    uint32_t n, immr, imms;\n    const auto IsImm = IsImmLogical(Imm, RegSizeInBits(s), &n, &imms, &immr);\n    LOGMAN_THROW_A_FMT(IsImm, \"Couldn't encode immediate to logical op\");\n    and_(s, rd, rn, n, immr, imms);\n  }\n\n  void bic(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint64_t Imm) {\n    and_(s, rd, rn, ~Imm);\n  }\n\n  void ands(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint64_t Imm) {\n    uint32_t n, immr, imms;\n    const auto IsImm = IsImmLogical(Imm, RegSizeInBits(s), &n, &imms, &immr);\n    LOGMAN_THROW_A_FMT(IsImm, \"Couldn't encode immediate to logical op\");\n    ands(s, rd, rn, n, immr, imms);\n  }\n\n  void bics(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint64_t Imm) {\n    ands(s, rd, rn, ~Imm);\n  }\n\n  void orr(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint64_t Imm) {\n    uint32_t n, immr, imms;\n    const auto IsImm = IsImmLogical(Imm, RegSizeInBits(s), &n, &imms, &immr);\n    LOGMAN_THROW_A_FMT(IsImm, \"Couldn't encode immediate to logical op\");\n    orr(s, rd, rn, n, immr, imms);\n  }\n\n  void eor(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint64_t Imm) {\n    uint32_t n, immr, imms;\n    const auto IsImm = IsImmLogical(Imm, RegSizeInBits(s), &n, &imms, &immr);\n    LOGMAN_THROW_A_FMT(IsImm, \"Couldn't encode immediate to logical op\");\n    eor(s, rd, rn, n, immr, imms);\n  }\n\n  void tst(ARMEmitter::Size s, Register rn, uint64_t imm) {\n    ands(s, Reg::zr, rn, imm);\n  }\n\n  // Move wide immediate\n  void movn(ARMEmitter::Size s, ARMEmitter::Register rd, uint32_t Imm, uint32_t Offset = 0) {\n    LOGMAN_THROW_A_FMT((Imm & 0xFFFF0000U) == 0, \"Upper bits of move wide not valid\");\n    LOGMAN_THROW_A_FMT((Offset % 16) == 0, \"Offset must be 16bit aligned\");\n\n    constexpr uint32_t Op = 0b001'0010'100 << 21;\n    DataProcessing_MoveWide(Op, s, rd, Imm, Offset >> 4);\n  }\n  void mov(ARMEmitter::Size s, ARMEmitter::Register rd, uint32_t Imm) {\n    movz(s, rd, Imm, 0);\n  }\n  void mov(ARMEmitter::XRegister rd, uint32_t Imm) {\n    movz(ARMEmitter::Size::i64Bit, rd.R(), Imm, 0);\n  }\n  void mov(ARMEmitter::WRegister rd, uint32_t Imm) {\n    movz(ARMEmitter::Size::i32Bit, rd.R(), Imm, 0);\n  }\n\n  void movz(ARMEmitter::Size s, ARMEmitter::Register rd, uint32_t Imm, uint32_t Offset = 0) {\n    LOGMAN_THROW_A_FMT((Imm & 0xFFFF0000U) == 0, \"Upper bits of move wide not valid\");\n    LOGMAN_THROW_A_FMT((Offset % 16) == 0, \"Offset must be 16bit aligned\");\n\n    constexpr uint32_t Op = 0b101'0010'100 << 21;\n    DataProcessing_MoveWide(Op, s, rd, Imm, Offset >> 4);\n  }\n  void movk(ARMEmitter::Size s, ARMEmitter::Register rd, uint32_t Imm, uint32_t Offset = 0) {\n    LOGMAN_THROW_A_FMT((Imm & 0xFFFF0000U) == 0, \"Upper bits of move wide not valid\");\n    LOGMAN_THROW_A_FMT((Offset % 16) == 0, \"Offset must be 16bit aligned\");\n\n    constexpr uint32_t Op = 0b111'0010'100 << 21;\n    DataProcessing_MoveWide(Op, s, rd, Imm, Offset >> 4);\n  }\n\n  void movn(ARMEmitter::XRegister rd, uint32_t Imm, uint32_t Offset = 0) {\n    movn(ARMEmitter::Size::i64Bit, rd.R(), Imm, Offset);\n  }\n  void movz(ARMEmitter::XRegister rd, uint32_t Imm, uint32_t Offset = 0) {\n    movz(ARMEmitter::Size::i64Bit, rd.R(), Imm, Offset);\n  }\n  void movk(ARMEmitter::XRegister rd, uint32_t Imm, uint32_t Offset = 0) {\n    movk(ARMEmitter::Size::i64Bit, rd.R(), Imm, Offset);\n  }\n  void movn(ARMEmitter::WRegister rd, uint32_t Imm, uint32_t Offset = 0) {\n    movn(ARMEmitter::Size::i32Bit, rd.R(), Imm, Offset);\n  }\n  void movz(ARMEmitter::WRegister rd, uint32_t Imm, uint32_t Offset = 0) {\n    movz(ARMEmitter::Size::i32Bit, rd.R(), Imm, Offset);\n  }\n  void movk(ARMEmitter::WRegister rd, uint32_t Imm, uint32_t Offset = 0) {\n    movk(ARMEmitter::Size::i32Bit, rd.R(), Imm, Offset);\n  }\n\n  // Bitfield\n  void sxtb(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn) {\n    sbfm(s, rd, rn, 0, 7);\n  }\n  void sxth(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn) {\n    sbfm(s, rd, rn, 0, 15);\n  }\n  void sxtw(ARMEmitter::XRegister rd, ARMEmitter::WRegister rn) {\n    sbfm(ARMEmitter::Size::i64Bit, rd, rn.X(), 0, 31);\n  }\n  void sbfx(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t lsb, uint32_t width) {\n    LOGMAN_THROW_A_FMT(width > 0, \"sbfx needs width > 0\");\n    LOGMAN_THROW_A_FMT((lsb + width) <= RegSizeInBits(s), \"Tried to sbfx a region larger than the register\");\n    sbfm(s, rd, rn, lsb, lsb + width - 1);\n  }\n  void sbfiz(ARMEmitter::Size s, Register rd, Register rn, uint32_t lsb, uint32_t width) {\n    xbfiz_helper(true, s, rd, rn, lsb, width);\n  }\n  void asr(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t shift) {\n    const auto RegSize_m1 = RegSizeInBits(s) - 1;\n    shift &= RegSize_m1;\n    sbfm(s, rd, rn, shift, RegSize_m1);\n  }\n\n  void uxtb(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn) {\n    ubfm(s, rd, rn, 0, 7);\n  }\n  void uxth(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn) {\n    ubfm(s, rd, rn, 0, 15);\n  }\n  void uxtw(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn) {\n    ubfm(s, rd, rn, 0, 31);\n  }\n\n  void ubfm(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t immr, uint32_t imms) {\n    constexpr uint32_t Op = 0b0101'0011'00 << 22;\n    DataProcessing_Logical_Imm(Op, s, rd, rn, s == ARMEmitter::Size::i64Bit, immr, imms);\n  }\n\n  void ubfiz(ARMEmitter::Size s, Register rd, Register rn, uint32_t lsb, uint32_t width) {\n    xbfiz_helper(false, s, rd, rn, lsb, width);\n  }\n\n  void lsl(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t shift) {\n    const auto RegSize_m1 = RegSizeInBits(s) - 1;\n    shift &= RegSize_m1;\n    ubfm(s, rd, rn, (RegSizeInBits(s) - shift) & RegSize_m1, RegSize_m1 - shift);\n  }\n  void lsr(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t shift) {\n    const auto RegSize_m1 = RegSizeInBits(s) - 1;\n    shift &= RegSize_m1;\n    ubfm(s, rd, rn, shift, RegSize_m1);\n  }\n  void ubfx(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t lsb, uint32_t width) {\n    LOGMAN_THROW_A_FMT(width > 0, \"ubfx needs width > 0\");\n    LOGMAN_THROW_A_FMT((lsb + width) <= RegSizeInBits(s), \"Tried to ubfx a region larger than the register\");\n    ubfm(s, rd, rn, lsb, lsb + width - 1);\n  }\n\n  void bfi(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t lsb, uint32_t width) {\n    const auto RegSize = RegSizeInBits(s);\n    LOGMAN_THROW_A_FMT(width > 0, \"bfc/bfi needs width > 0\");\n    LOGMAN_THROW_A_FMT((lsb + width) <= RegSize, \"Tried to bfc/bfi a region larger than the register\");\n    bfm(s, rd, rn, (RegSize - lsb) & (RegSize - 1), width - 1);\n  }\n  void bfc(ARMEmitter::Size s, Register rd, uint32_t lsb, uint32_t width) {\n    bfi(s, rd, Reg::zr, lsb, width);\n  }\n  void bfxil(ARMEmitter::Size s, Register rd, Register rn, uint32_t lsb, uint32_t width) {\n    const auto reg_size_bits = RegSizeInBits(s);\n    const auto lsb_p_width = lsb + width;\n\n    LOGMAN_THROW_A_FMT(width >= 1, \"bfxil needs width >= 1\");\n    LOGMAN_THROW_A_FMT(lsb_p_width <= reg_size_bits, \"bfxil lsb + width ({}) must be <= {}. lsb={}, width={}\", lsb_p_width, reg_size_bits,\n                       lsb, width);\n\n    bfm(s, rd, rn, lsb, lsb_p_width - 1);\n  }\n\n  // Extract\n  void extr(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm, uint32_t Imm) {\n    constexpr uint32_t Op = 0b001'0011'100 << 21;\n    LOGMAN_THROW_A_FMT(Imm < RegSizeInBits(s), \"Tried to extr a region larger than the register\");\n    DataProcessing_Extract(Op, s, rd, rn, rm, Imm);\n  }\n\n  void ror(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t Imm) {\n    Imm &= RegSizeInBits(s) - 1;\n    extr(s, rd, rn, rn, Imm);\n  }\n\n  // Data processing - 2 source\n  void udiv(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0000'10U << 10);\n    DataProcessing_2Source(Op, s, rd, rn, rm);\n  }\n  void sdiv(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0000'11U << 10);\n    DataProcessing_2Source(Op, s, rd, rn, rm);\n  }\n\n  void lslv(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0010'00U << 10);\n    DataProcessing_2Source(Op, s, rd, rn, rm);\n  }\n  void lsrv(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0010'01U << 10);\n    DataProcessing_2Source(Op, s, rd, rn, rm);\n  }\n  void asrv(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0010'10U << 10);\n    DataProcessing_2Source(Op, s, rd, rn, rm);\n  }\n  void rorv(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0010'11U << 10);\n    DataProcessing_2Source(Op, s, rd, rn, rm);\n  }\n  void crc32b(ARMEmitter::WRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0100'00U << 10);\n    DataProcessing_2Source(Op, ARMEmitter::Size::i32Bit, rd, rn, rm);\n  }\n  void crc32h(ARMEmitter::WRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0100'01U << 10);\n    DataProcessing_2Source(Op, ARMEmitter::Size::i32Bit, rd, rn, rm);\n  }\n  void crc32w(ARMEmitter::WRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0100'10U << 10);\n    DataProcessing_2Source(Op, ARMEmitter::Size::i32Bit, rd, rn, rm);\n  }\n  void crc32cb(ARMEmitter::WRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0101'00U << 10);\n    DataProcessing_2Source(Op, ARMEmitter::Size::i32Bit, rd, rn, rm);\n  }\n  void crc32ch(ARMEmitter::WRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0101'01U << 10);\n    DataProcessing_2Source(Op, ARMEmitter::Size::i32Bit, rd, rn, rm);\n  }\n  void crc32cw(ARMEmitter::WRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0101'10U << 10);\n    DataProcessing_2Source(Op, ARMEmitter::Size::i32Bit, rd, rn, rm);\n  }\n  void smax(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0110'00U << 10);\n    DataProcessing_2Source(Op, s, rd, rn, rm);\n  }\n  void umax(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0110'01U << 10);\n    DataProcessing_2Source(Op, s, rd, rn, rm);\n  }\n  void smin(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0110'10U << 10);\n    DataProcessing_2Source(Op, s, rd, rn, rm);\n  }\n  void umin(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0110'11U << 10);\n    DataProcessing_2Source(Op, s, rd, rn, rm);\n  }\n  void subp(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn, ARMEmitter::XRegister rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0000'00U << 10);\n    DataProcessing_2Source(Op, ARMEmitter::Size::i64Bit, rd, rn, rm);\n  }\n  void irg(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn, ARMEmitter::XRegister rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0001'00U << 10);\n    DataProcessing_2Source(Op, ARMEmitter::Size::i64Bit, rd, rn, rm);\n  }\n  void gmi(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn, ARMEmitter::XRegister rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0001'01U << 10);\n    DataProcessing_2Source(Op, ARMEmitter::Size::i64Bit, rd, rn, rm);\n  }\n  void pacga(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn, ARMEmitter::XRegister rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0011'00U << 10);\n    DataProcessing_2Source(Op, ARMEmitter::Size::i64Bit, rd, rn, rm);\n  }\n  void crc32x(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn, ARMEmitter::XRegister rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0100'11U << 10);\n    DataProcessing_2Source(Op, ARMEmitter::Size::i64Bit, rd, rn, rm);\n  }\n  void crc32cx(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn, ARMEmitter::XRegister rm) {\n    constexpr uint32_t Op = (0b001'1010'110U << 21) | (0b0101'11U << 10);\n    DataProcessing_2Source(Op, ARMEmitter::Size::i64Bit, rd, rn, rm);\n  }\n  void subps(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn, ARMEmitter::XRegister rm) {\n    constexpr uint32_t Op = (0b011'1010'110U << 21) | (0b0000'00U << 10);\n    DataProcessing_2Source(Op, ARMEmitter::Size::i64Bit, rd, rn, rm);\n  }\n\n  // Data processing - 1 source\n  void rbit(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = (0b101'1010'110U << 21) | (0b0'0000U << 16) | (0b0000'00U << 10);\n    DataProcessing_1Source(Op, s, rd, rn);\n  }\n  void rev16(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = (0b101'1010'110U << 21) | (0b0'0000U << 16) | (0b0000'01U << 10);\n    DataProcessing_1Source(Op, s, rd, rn);\n  }\n  void rev(ARMEmitter::WRegister rd, ARMEmitter::WRegister rn) {\n    constexpr uint32_t Op = (0b101'1010'110U << 21) | (0b0'0000U << 16) | (0b0000'10U << 10);\n    DataProcessing_1Source(Op, ARMEmitter::Size::i32Bit, rd, rn);\n  }\n  void rev32(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn) {\n    constexpr uint32_t Op = (0b101'1010'110U << 21) | (0b0'0000U << 16) | (0b0000'10U << 10);\n    DataProcessing_1Source(Op, ARMEmitter::Size::i64Bit, rd, rn);\n  }\n  void clz(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = (0b101'1010'110U << 21) | (0b0'0000U << 16) | (0b0001'00U << 10);\n    DataProcessing_1Source(Op, s, rd, rn);\n  }\n  void cls(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = (0b101'1010'110U << 21) | (0b0'0000U << 16) | (0b0001'01U << 10);\n    DataProcessing_1Source(Op, s, rd, rn);\n  }\n  void rev(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn) {\n    constexpr uint32_t Op = (0b101'1010'110U << 21) | (0b0'0000U << 16) | (0b0000'11U << 10);\n    DataProcessing_1Source(Op, ARMEmitter::Size::i64Bit, rd, rn);\n  }\n  void rev(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn) {\n    uint32_t Op = (0b101'1010'110U << 21) | (0b0'0000U << 16) | (0b0000'10U << 10) | (s == ARMEmitter::Size::i64Bit ? (1U << 10) : 0);\n    DataProcessing_1Source(Op, s, rd, rn);\n  }\n  void ctz(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = (0b101'1010'110U << 21) | (0b0'0000U << 16) | (0b0001'10U << 10);\n    DataProcessing_1Source(Op, s, rd, rn);\n  }\n  void cnt(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = (0b101'1010'110U << 21) | (0b0'0000U << 16) | (0b0001'11U << 10);\n    DataProcessing_1Source(Op, s, rd, rn);\n  }\n  void abs(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = (0b101'1010'110U << 21) | (0b0'0000U << 16) | (0b0010'00U << 10);\n    DataProcessing_1Source(Op, s, rd, rn);\n  }\n\n  // TODO: PAUTH\n\n  // Logical - shifted register\n  void mov(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn) {\n    orr(s, rd, ARMEmitter::Reg::zr, rn, ARMEmitter::ShiftType::LSL, 0);\n  }\n  void mov(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn) {\n    orr(ARMEmitter::Size::i64Bit, rd.R(), ARMEmitter::Reg::zr, rn.R(), ARMEmitter::ShiftType::LSL, 0);\n  }\n  void mov(ARMEmitter::WRegister rd, ARMEmitter::WRegister rn) {\n    orr(ARMEmitter::Size::i32Bit, rd.R(), ARMEmitter::Reg::zr, rn.R(), ARMEmitter::ShiftType::LSL, 0);\n  }\n\n  void mvn(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL,\n           uint32_t amt = 0) {\n    orn(s, rd, ARMEmitter::Reg::zr, rn, Shift, amt);\n  }\n\n  void and_(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm,\n            ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    constexpr uint32_t Op = 0b000'1010'000U << 21;\n    DataProcessing_Shifted_Reg(Op, s, rd, rn, rm, Shift, amt);\n  }\n  void ands(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm,\n            ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    constexpr uint32_t Op = 0b110'1010'000U << 21;\n    DataProcessing_Shifted_Reg(Op, s, rd, rn, rm, Shift, amt);\n  }\n  void bic(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm,\n           ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    constexpr uint32_t Op = 0b000'1010'001U << 21;\n    DataProcessing_Shifted_Reg(Op, s, rd, rn, rm, Shift, amt);\n  }\n  void bics(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm,\n            ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    constexpr uint32_t Op = 0b110'1010'001U << 21;\n    DataProcessing_Shifted_Reg(Op, s, rd, rn, rm, Shift, amt);\n  }\n  void orr(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm,\n           ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    constexpr uint32_t Op = 0b010'1010'000U << 21;\n    DataProcessing_Shifted_Reg(Op, s, rd, rn, rm, Shift, amt);\n  }\n  void tst(ARMEmitter::Size s, Register rn, Register rm, ShiftType shift = ShiftType::LSL, uint32_t amt = 0) {\n    ands(s, Reg::zr, rn, rm, shift, amt);\n  }\n\n  void orn(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm,\n           ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    constexpr uint32_t Op = 0b010'1010'001U << 21;\n    DataProcessing_Shifted_Reg(Op, s, rd, rn, rm, Shift, amt);\n  }\n  void eor(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm,\n           ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    constexpr uint32_t Op = 0b100'1010'000U << 21;\n    DataProcessing_Shifted_Reg(Op, s, rd, rn, rm, Shift, amt);\n  }\n  void eon(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm,\n           ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    constexpr uint32_t Op = 0b100'1010'001U << 21;\n    DataProcessing_Shifted_Reg(Op, s, rd, rn, rm, Shift, amt);\n  }\n\n  // AddSub - shifted register\n  void add(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn, ARMEmitter::XRegister rm,\n           ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    add(ARMEmitter::Size::i64Bit, rd.R(), rn.R(), rm.R(), Shift, amt);\n  }\n  void adds(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn, ARMEmitter::XRegister rm,\n            ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    adds(ARMEmitter::Size::i64Bit, rd.R(), rn.R(), rm.R(), Shift, amt);\n  }\n  void cmn(ARMEmitter::XRegister rn, ARMEmitter::XRegister rm, ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    adds(ARMEmitter::Size::i64Bit, ARMEmitter::XReg::zr, rn.R(), rm.R(), Shift, amt);\n  }\n  void sub(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn, ARMEmitter::XRegister rm,\n           ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    sub(ARMEmitter::Size::i64Bit, rd.R(), rn.R(), rm.R(), Shift, amt);\n  }\n  void neg(ARMEmitter::XRegister rd, ARMEmitter::XRegister rm, ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    sub(rd, ARMEmitter::XReg::zr, rm, Shift, amt);\n  }\n  void cmp(ARMEmitter::XRegister rn, ARMEmitter::XRegister rm, ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    subs(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, rn.R(), rm.R(), Shift, amt);\n  }\n  void subs(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn, ARMEmitter::XRegister rm,\n            ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    subs(ARMEmitter::Size::i64Bit, rd.R(), rn.R(), rm.R(), Shift, amt);\n  }\n  void negs(ARMEmitter::XRegister rd, ARMEmitter::XRegister rm, ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    subs(rd, ARMEmitter::XReg::zr, rm, Shift, amt);\n  }\n\n  void add(ARMEmitter::WRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm,\n           ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    add(ARMEmitter::Size::i32Bit, rd.R(), rn.R(), rm.R(), Shift, amt);\n  }\n  void adds(ARMEmitter::WRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm,\n            ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    adds(ARMEmitter::Size::i32Bit, rd.R(), rn.R(), rm.R(), Shift, amt);\n  }\n  void cmn(ARMEmitter::WRegister rn, ARMEmitter::WRegister rm, ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    adds(ARMEmitter::Size::i32Bit, ARMEmitter::WReg::zr, rn.R(), rm.R(), Shift, amt);\n  }\n  void sub(ARMEmitter::WRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm,\n           ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    sub(ARMEmitter::Size::i32Bit, rd.R(), rn.R(), rm.R(), Shift, amt);\n  }\n  void neg(ARMEmitter::WRegister rd, ARMEmitter::WRegister rm, ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    sub(rd, ARMEmitter::WReg::zr, rm, Shift, amt);\n  }\n  void cmp(ARMEmitter::WRegister rn, ARMEmitter::WRegister rm, ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    subs(ARMEmitter::Size::i32Bit, ARMEmitter::Reg::rsp, rn.R(), rm.R(), Shift, amt);\n  }\n  void subs(ARMEmitter::WRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm,\n            ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    subs(ARMEmitter::Size::i32Bit, rd.R(), rn.R(), rm.R(), Shift, amt);\n  }\n  void negs(ARMEmitter::WRegister rd, ARMEmitter::WRegister rm, ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    subs(rd, ARMEmitter::WReg::zr, rm, Shift, amt);\n  }\n\n  void add(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm,\n           ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    LOGMAN_THROW_A_FMT(Shift != ARMEmitter::ShiftType::ROR, \"Doesn't support ROR\");\n    constexpr uint32_t Op = 0b000'1011'000U << 21;\n    DataProcessing_Shifted_Reg(Op, s, rd, rn, rm, Shift, amt);\n  }\n  void adds(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm,\n            ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    LOGMAN_THROW_A_FMT(Shift != ARMEmitter::ShiftType::ROR, \"Doesn't support ROR\");\n    constexpr uint32_t Op = 0b010'1011'000U << 21;\n    DataProcessing_Shifted_Reg(Op, s, rd, rn, rm, Shift, amt);\n  }\n  void cmn(ARMEmitter::Size s, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL,\n           uint32_t amt = 0) {\n    adds(s, ARMEmitter::Reg::zr, rn, rm, Shift, amt);\n  }\n  void sub(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm,\n           ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    LOGMAN_THROW_A_FMT(Shift != ARMEmitter::ShiftType::ROR, \"Doesn't support ROR\");\n    constexpr uint32_t Op = 0b100'1011'000U << 21;\n    DataProcessing_Shifted_Reg(Op, s, rd, rn, rm, Shift, amt);\n  }\n  void neg(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rm, ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL,\n           uint32_t amt = 0) {\n    sub(s, rd, ARMEmitter::Reg::zr, rm, Shift, amt);\n  }\n  void cmp(ARMEmitter::Size s, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL,\n           uint32_t amt = 0) {\n    subs(s, ARMEmitter::Reg::zr, rn, rm, Shift, amt);\n  }\n\n  void subs(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm,\n            ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL, uint32_t amt = 0) {\n    LOGMAN_THROW_A_FMT(Shift != ARMEmitter::ShiftType::ROR, \"Doesn't support ROR\");\n    constexpr uint32_t Op = 0b110'1011'000U << 21;\n    DataProcessing_Shifted_Reg(Op, s, rd, rn, rm, Shift, amt);\n  }\n  void negs(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rm, ARMEmitter::ShiftType Shift = ARMEmitter::ShiftType::LSL,\n            uint32_t amt = 0) {\n    subs(s, rd, ARMEmitter::Reg::zr, rm, Shift, amt);\n  }\n\n  // AddSub - extended register\n  void add(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option,\n           uint32_t Shift = 0) {\n    LOGMAN_THROW_A_FMT(Shift <= 4, \"Shift amount is too large\");\n    constexpr uint32_t Op = 0b000'1011'001U << 21;\n    DataProcessing_Extended_Reg(Op, s, rd, rn, rm, Option, Shift);\n  }\n  void adds(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option,\n            uint32_t Shift = 0) {\n    constexpr uint32_t Op = 0b010'1011'001U << 21;\n    DataProcessing_Extended_Reg(Op, s, rd, rn, rm, Option, Shift);\n  }\n  void cmn(ARMEmitter::Size s, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift = 0) {\n    adds(s, ARMEmitter::Reg::zr, rn, rm, Option, Shift);\n  }\n  void sub(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option,\n           uint32_t Shift = 0) {\n    constexpr uint32_t Op = 0b100'1011'001U << 21;\n    DataProcessing_Extended_Reg(Op, s, rd, rn, rm, Option, Shift);\n  }\n  void subs(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option,\n            uint32_t Shift = 0) {\n    constexpr uint32_t Op = 0b110'1011'001U << 21;\n    DataProcessing_Extended_Reg(Op, s, rd, rn, rm, Option, Shift);\n  }\n  void cmp(ARMEmitter::Size s, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift = 0) {\n    constexpr uint32_t Op = 0b110'1011'001U << 21;\n    DataProcessing_Extended_Reg(Op, s, ARMEmitter::Reg::zr, rn, rm, Option, Shift);\n  }\n\n  // AddSub - with carry\n  void adc(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Op = 0b0001'1010'000U << 21;\n    DataProcessing_Extended_Reg(Op, s, rd, rn, rm, ARMEmitter::ExtendedType::UXTB, 0);\n  }\n  void adcs(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Op = 0b0011'1010'000U << 21;\n    DataProcessing_Extended_Reg(Op, s, rd, rn, rm, ARMEmitter::ExtendedType::UXTB, 0);\n  }\n  void sbc(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Op = 0b0101'1010'000U << 21;\n    DataProcessing_Extended_Reg(Op, s, rd, rn, rm, ARMEmitter::ExtendedType::UXTB, 0);\n  }\n  void sbcs(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Op = 0b0111'1010'000U << 21;\n    DataProcessing_Extended_Reg(Op, s, rd, rn, rm, ARMEmitter::ExtendedType::UXTB, 0);\n  }\n  void ngc(ARMEmitter::Size s, Register rd, Register rm) {\n    sbc(s, rd, Reg::zr, rm);\n  }\n  void ngcs(ARMEmitter::Size s, Register rd, Register rm) {\n    sbcs(s, rd, Reg::zr, rm);\n  }\n\n  // Rotate right into flags\n  void rmif(XRegister rn, uint32_t shift, uint32_t mask) {\n    LOGMAN_THROW_A_FMT(shift <= 63, \"Shift must be within 0-63. Shift: {}\", shift);\n    LOGMAN_THROW_A_FMT(mask <= 15, \"Mask must be within 0-15. Mask: {}\", mask);\n\n    uint32_t Op = 0b1011'1010'0000'0000'0000'0100'0000'0000;\n    Op |= rn.Idx() << 5;\n    Op |= shift << 15;\n    Op |= mask;\n\n    dc32(Op);\n  }\n\n  // Evaluate into flags\n  void setf8(WRegister rn) {\n    constexpr uint32_t Op = 0b0011'1010'0000'0000'0000'1000'0000'1101;\n    EvaluateIntoFlags(Op, 0, rn);\n  }\n  void setf16(WRegister rn) {\n    constexpr uint32_t Op = 0b0011'1010'0000'0000'0000'1000'0000'1101;\n    EvaluateIntoFlags(Op, 1, rn);\n  }\n\n  void cfinv() {\n    constexpr uint32_t Op = 0b1101'0101'0000'0000'0100'0000'0001'1111;\n    dc32(Op);\n  }\n\n  void axflag() {\n    constexpr uint32_t Op = 0b1101'0101'0000'0000'0100'0000'0101'1111;\n    dc32(Op);\n  }\n\n  void xaflag() {\n    constexpr uint32_t Op = 0b1101'0101'0000'0000'0100'0000'0011'1111;\n    dc32(Op);\n  }\n\n  // Conditional compare - register\n  void ccmn(ARMEmitter::Size s, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::StatusFlags flags, ARMEmitter::Condition Cond) {\n    constexpr uint32_t Op = 0b0011'1010'010 << 21;\n    ConditionalCompare(Op, 0, 0b00, 0, s, rn, rm, flags, Cond);\n  }\n  void ccmp(ARMEmitter::Size s, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::StatusFlags flags, ARMEmitter::Condition Cond) {\n    constexpr uint32_t Op = 0b0011'1010'010 << 21;\n    ConditionalCompare(Op, 1, 0b00, 0, s, rn, rm, flags, Cond);\n  }\n\n  // Conditional compare - immediate\n  void ccmn(ARMEmitter::Size s, ARMEmitter::Register rn, uint32_t rm, ARMEmitter::StatusFlags flags, ARMEmitter::Condition Cond) {\n    LOGMAN_THROW_A_FMT((rm & ~0b1'1111) == 0, \"Comparison imm too large\");\n    constexpr uint32_t Op = 0b0011'1010'010 << 21;\n    ConditionalCompare(Op, 0, 0b10, 0, s, rn, rm, flags, Cond);\n  }\n  void ccmp(ARMEmitter::Size s, ARMEmitter::Register rn, uint32_t rm, ARMEmitter::StatusFlags flags, ARMEmitter::Condition Cond) {\n    LOGMAN_THROW_A_FMT((rm & ~0b1'1111) == 0, \"Comparison imm too large\");\n    constexpr uint32_t Op = 0b0011'1010'010 << 21;\n    ConditionalCompare(Op, 1, 0b10, 0, s, rn, rm, flags, Cond);\n  }\n\n  // Conditional select\n  void csel(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::Condition Cond) {\n    constexpr uint32_t Op = 0b0001'1010'100 << 21;\n    ConditionalCompare(Op, 0, 0b00, s, rd, rn, rm, Cond);\n  }\n  void cset(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Condition Cond) {\n    constexpr uint32_t Op = 0b0001'1010'100 << 21;\n    ConditionalCompare(Op, 0, 0b01, s, rd, ARMEmitter::Reg::zr, ARMEmitter::Reg::zr,\n                       static_cast<ARMEmitter::Condition>(FEXCore::ToUnderlying(Cond) ^ FEXCore::ToUnderlying(ARMEmitter::Condition::CC_NE)));\n  }\n  void csinc(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::Condition Cond) {\n    constexpr uint32_t Op = 0b0001'1010'100 << 21;\n    ConditionalCompare(Op, 0, 0b01, s, rd, rn, rm, Cond);\n  }\n  void csinv(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::Condition Cond) {\n    constexpr uint32_t Op = 0b0001'1010'100 << 21;\n    ConditionalCompare(Op, 1, 0b00, s, rd, rn, rm, Cond);\n  }\n  void csneg(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::Condition Cond) {\n    constexpr uint32_t Op = 0b0001'1010'100 << 21;\n    ConditionalCompare(Op, 1, 0b01, s, rd, rn, rm, Cond);\n  }\n  void cneg(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Condition Cond) {\n    csneg(s, rd, rn, rn, InvertCondition(Cond));\n  }\n  void cinc(ARMEmitter::Size s, Register rd, Register rn, Condition cond) {\n    csinc(s, rd, rn, rn, InvertCondition(cond));\n  }\n  void cinv(ARMEmitter::Size s, Register rd, Register rn, Condition cond) {\n    csinv(s, rd, rn, rn, InvertCondition(cond));\n  }\n  void csetm(ARMEmitter::Size s, Register rd, Condition cond) {\n    csinv(s, rd, Reg::zr, Reg::zr, InvertCondition(cond));\n  }\n\n  // Data processing - 3 source\n  void madd(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::Register ra) {\n    constexpr uint32_t Op = 0b001'1011'000U << 21;\n    DataProcessing_3Source(Op, 0, s, rd, rn, rm, ra);\n  }\n  void mul(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    madd(s, rd, rn, rm, XReg::zr);\n  }\n  void msub(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::Register ra) {\n    constexpr uint32_t Op = 0b001'1011'000U << 21;\n    DataProcessing_3Source(Op, 1, s, rd, rn, rm, ra);\n  }\n  void mneg(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    msub(s, rd, rn, rm, XReg::zr);\n  }\n  void smaddl(ARMEmitter::XRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm, ARMEmitter::XRegister ra) {\n    constexpr uint32_t Op = 0b001'1011'001U << 21;\n    DataProcessing_3Source(Op, 0, ARMEmitter::Size::i64Bit, rd, rn, rm, ra);\n  }\n  void smull(ARMEmitter::XRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm) {\n    smaddl(rd, rn, rm, XReg::zr);\n  }\n  void smsubl(ARMEmitter::XRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm, ARMEmitter::XRegister ra) {\n    constexpr uint32_t Op = 0b001'1011'001U << 21;\n    DataProcessing_3Source(Op, 1, ARMEmitter::Size::i64Bit, rd, rn, rm, ra);\n  }\n  void smnegl(ARMEmitter::XRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm) {\n    smsubl(rd, rn, rm, XReg::zr);\n  }\n  void smulh(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn, ARMEmitter::XRegister rm) {\n    constexpr uint32_t Op = 0b001'1011'010U << 21;\n    DataProcessing_3Source(Op, 0, ARMEmitter::Size::i64Bit, rd, rn, rm, ARMEmitter::Reg::zr);\n  }\n  void umaddl(ARMEmitter::XRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm, ARMEmitter::XRegister ra) {\n    constexpr uint32_t Op = 0b001'1011'101U << 21;\n    DataProcessing_3Source(Op, 0, ARMEmitter::Size::i64Bit, rd, rn, rm, ra);\n  }\n  void umull(ARMEmitter::XRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm) {\n    umaddl(rd, rn, rm, XReg::zr);\n  }\n  void umsubl(ARMEmitter::XRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm, ARMEmitter::XRegister ra) {\n    constexpr uint32_t Op = 0b001'1011'101U << 21;\n    DataProcessing_3Source(Op, 1, ARMEmitter::Size::i64Bit, rd, rn, rm, ra);\n  }\n  void umnegl(ARMEmitter::XRegister rd, ARMEmitter::WRegister rn, ARMEmitter::WRegister rm) {\n    umsubl(rd, rn, rm, XReg::zr);\n  }\n  void umulh(ARMEmitter::XRegister rd, ARMEmitter::XRegister rn, ARMEmitter::XRegister rm) {\n    constexpr uint32_t Op = 0b001'1011'110U << 21;\n    DataProcessing_3Source(Op, 0, ARMEmitter::Size::i64Bit, rd, rn, rm, ARMEmitter::Reg::zr);\n  }\n\nprivate:\n  void and_(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t n, uint32_t immr, uint32_t imms) {\n    constexpr uint32_t Op = 0b001'0010'00 << 22;\n    DataProcessing_Logical_Imm(Op, s, rd, rn, n, immr, imms);\n  }\n  void ands(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t n, uint32_t immr, uint32_t imms) {\n    constexpr uint32_t Op = 0b111'0010'00 << 22;\n    DataProcessing_Logical_Imm(Op, s, rd, rn, n, immr, imms);\n  }\n  void orr(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t n, uint32_t immr, uint32_t imms) {\n    constexpr uint32_t Op = 0b011'0010'00 << 22;\n    DataProcessing_Logical_Imm(Op, s, rd, rn, n, immr, imms);\n  }\n  void eor(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t n, uint32_t immr, uint32_t imms) {\n    constexpr uint32_t Op = 0b101'0010'00 << 22;\n    DataProcessing_Logical_Imm(Op, s, rd, rn, n, immr, imms);\n  }\n\n  void sbfm(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t immr, uint32_t imms) {\n    constexpr uint32_t Op = 0b0001'0011'00 << 22;\n    DataProcessing_Logical_Imm(Op, s, rd, rn, s == ARMEmitter::Size::i64Bit, immr, imms);\n  }\n  void bfm(ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t immr, uint32_t imms) {\n    constexpr uint32_t Op = 0b0011'0011'00 << 22;\n    DataProcessing_Logical_Imm(Op, s, rd, rn, s == ARMEmitter::Size::i64Bit, immr, imms);\n  }\n  // 4.1.64 - Data processing - Immediate\n  void DataProcessing_PCRel_Imm(uint32_t Op, ARMEmitter::Register rd, uint32_t Imm) {\n    // Ensure the immediate is masked.\n    Imm &= 0b1'1111'1111'1111'1111'1111U;\n\n    uint32_t Instr = Op;\n\n    Instr |= (Imm & 0b11) << 29;\n    Instr |= (Imm >> 2) << 5;\n    Instr |= Encode_rd(rd);\n\n    dc32(Instr);\n  }\n\n  void DataProcessing_AddSub_Imm(uint32_t Op, ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t Imm, bool LSL12) {\n    bool TooLarge = (Imm & ~0b1111'1111'1111U) != 0;\n    if (TooLarge && !LSL12 && ((Imm >> 12) & ~0b1111'1111'1111U) == 0) {\n      // We can convert an immediate\n      TooLarge = false;\n      LSL12 = true;\n      Imm >>= 12;\n    }\n    LOGMAN_THROW_A_FMT(TooLarge == false, \"Imm amount too large: 0x{:x}\", Imm);\n\n    const uint32_t SF = s == ARMEmitter::Size::i64Bit ? (1U << 31) : 0;\n\n    uint32_t Instr = Op;\n\n    Instr |= SF;\n    Instr |= LSL12 << 22;\n    Instr |= Imm << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n\n    dc32(Instr);\n  }\n\n  // Min/max immediate\n  void MinMaxImmediate(uint32_t opc, ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint64_t Imm) {\n    const uint32_t SF = s == ARMEmitter::Size::i64Bit ? (1U << 31) : 0;\n\n    uint32_t Instr = 0b1'0001'11U << 22;\n\n    Instr |= SF;\n    Instr |= opc << 18;\n    Instr |= (Imm & 0xFF) << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n\n    dc32(Instr);\n  }\n\n  // Move Wide\n  void DataProcessing_MoveWide(uint32_t Op, ARMEmitter::Size s, ARMEmitter::Register rd, uint32_t Imm, uint32_t Offset) {\n    const uint32_t SF = s == ARMEmitter::Size::i64Bit ? (1U << 31) : 0;\n\n    uint32_t Instr = Op;\n\n    Instr |= SF;\n    Instr |= Imm << 5;\n    Instr |= Offset << 21;\n    Instr |= Encode_rd(rd);\n\n    dc32(Instr);\n  }\n\n  // Logical immediate\n  void DataProcessing_Logical_Imm(uint32_t Op, ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, uint32_t n,\n                                  uint32_t immr, uint32_t imms) {\n    const uint32_t SF = s == ARMEmitter::Size::i64Bit ? (1U << 31) : 0;\n\n    uint32_t Instr = Op;\n\n    Instr |= SF;\n    Instr |= n << 22;\n    Instr |= immr << 16;\n    Instr |= imms << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n\n    dc32(Instr);\n  }\n\n  void xbfiz_helper(bool is_signed, ARMEmitter::Size s, Register rd, Register rn, uint32_t lsb, uint32_t width) {\n    const auto lsb_p_width = lsb + width;\n    const auto reg_size_bits = RegSizeInBits(s);\n\n    LOGMAN_THROW_A_FMT(lsb_p_width <= reg_size_bits, \"lsb + width ({}) must be <= {}. lsb={}, width={}\", lsb_p_width, reg_size_bits, lsb, width);\n    LOGMAN_THROW_A_FMT(width >= 1, \"xbfiz width must be >= 1\");\n\n    const auto immr = (reg_size_bits - lsb) & (reg_size_bits - 1);\n    const auto imms = width - 1;\n\n    if (is_signed) {\n      sbfm(s, rd, rn, immr, imms);\n    } else {\n      ubfm(s, rd, rn, immr, imms);\n    }\n  }\n\n  void DataProcessing_Extract(uint32_t Op, ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm,\n                              uint32_t Imm) {\n    const uint32_t SF = s == ARMEmitter::Size::i64Bit ? (1U << 31) : 0;\n\n    // Current ARMv8 spec hardcodes SF == N for this class of instructions.\n    // Anythign else is undefined behaviour.\n    const uint32_t N = s == ARMEmitter::Size::i64Bit ? (1U << 22) : 0;\n\n    uint32_t Instr = Op;\n\n    Instr |= SF;\n    Instr |= N;\n    Instr |= Encode_rm(rm);\n    Instr |= Imm << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n\n    dc32(Instr);\n  }\n\n  // Data-processing - 2 source\n  void DataProcessing_2Source(uint32_t Op, ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    const uint32_t SF = s == ARMEmitter::Size::i64Bit ? (1U << 31) : 0;\n\n    uint32_t Instr = Op;\n\n    Instr |= SF;\n    Instr |= Encode_rm(rm);\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n\n    dc32(Instr);\n  }\n\n  // Data processing - 1 source\n  template<typename T>\n  void DataProcessing_1Source(uint32_t Op, ARMEmitter::Size s, T rd, T rn) {\n    const uint32_t SF = s == ARMEmitter::Size::i64Bit ? (1U << 31) : 0;\n\n    uint32_t Instr = Op;\n\n    Instr |= SF;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n\n    dc32(Instr);\n  }\n\n  // AddSub - shifted register\n  void DataProcessing_Shifted_Reg(uint32_t Op, ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn,\n                                  ARMEmitter::Register rm, ARMEmitter::ShiftType Shift, uint32_t amt) {\n    LOGMAN_THROW_A_FMT((amt & ~0b11'1111U) == 0, \"Shift amount too large\");\n    if (s == ARMEmitter::Size::i32Bit) {\n      LOGMAN_THROW_A_FMT(amt < 32, \"Shift amount for 32-bit must be below 32\");\n    }\n\n    const uint32_t SF = s == ARMEmitter::Size::i64Bit ? (1U << 31) : 0;\n\n    uint32_t Instr = Op;\n\n    Instr |= SF;\n    Instr |= FEXCore::ToUnderlying(Shift) << 22;\n    Instr |= Encode_rm(rm);\n    Instr |= static_cast<uint32_t>(amt) << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n\n    dc32(Instr);\n  }\n\n  // AddSub - extended register\n  void DataProcessing_Extended_Reg(uint32_t Op, ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn,\n                                   ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    const uint32_t SF = s == ARMEmitter::Size::i64Bit ? (1U << 31) : 0;\n\n    uint32_t Instr = Op;\n\n    Instr |= SF;\n    Instr |= Encode_rm(rm);\n    Instr |= FEXCore::ToUnderlying(Option) << 13;\n    Instr |= static_cast<uint32_t>(Shift) << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n\n    dc32(Instr);\n  }\n  // Conditional compare - register\n  template<typename T>\n  void ConditionalCompare(uint32_t Op, uint32_t o1, uint32_t o2, uint32_t o3, ARMEmitter::Size s, ARMEmitter::Register rn, T rm,\n                          ARMEmitter::StatusFlags flags, ARMEmitter::Condition Cond) {\n    const uint32_t SF = s == ARMEmitter::Size::i64Bit ? (1U << 31) : 0;\n\n    uint32_t Instr = Op;\n\n    Instr |= SF;\n    Instr |= o1 << 30;\n    Instr |= Encode_rm(rm);\n    Instr |= FEXCore::ToUnderlying(Cond) << 12;\n    Instr |= o2 << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= o3 << 4;\n    Instr |= FEXCore::ToUnderlying(flags);\n\n    dc32(Instr);\n  }\n\n  template<typename T>\n  void ConditionalCompare(uint32_t Op, uint32_t o1, uint32_t o2, ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn, T rm,\n                          ARMEmitter::Condition Cond) {\n    const uint32_t SF = s == ARMEmitter::Size::i64Bit ? (1U << 31) : 0;\n\n    uint32_t Instr = Op;\n\n    Instr |= SF;\n    Instr |= o1 << 30;\n    Instr |= Encode_rm(rm);\n    Instr |= FEXCore::ToUnderlying(Cond) << 12;\n    Instr |= o2 << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n\n    dc32(Instr);\n  }\n\n  // Data-processing - 3 source\n  void DataProcessing_3Source(uint32_t Op, uint32_t Op0, ARMEmitter::Size s, ARMEmitter::Register rd, ARMEmitter::Register rn,\n                              ARMEmitter::Register rm, ARMEmitter::Register ra) {\n    const uint32_t SF = s == ARMEmitter::Size::i64Bit ? (1U << 31) : 0;\n\n    uint32_t Instr = Op;\n\n    Instr |= SF;\n    Instr |= Encode_rm(rm);\n    Instr |= Op0 << 15;\n    Instr |= Encode_ra(ra);\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n\n    dc32(Instr);\n  }\n\n  void EvaluateIntoFlags(uint32_t op, uint32_t size, WRegister rn) {\n    uint32_t Instr = op;\n    Instr |= size << 14;\n    Instr |= rn.Idx() << 5;\n    dc32(Instr);\n  }\n\n#ifndef INCLUDED_BY_EMITTER\n}; // struct LoadstoreEmitterOps\n} // namespace ARMEmitter\n#endif\n"
  },
  {
    "path": "CodeEmitter/CodeEmitter/ASIMDOps.inl",
    "content": "// SPDX-License-Identifier: MIT\n/* ASIMD instruction emitters.\n *\n * This contains emitters for vector operations explicitly.\n * Most instructions have a `SubRegSize` as their first argument to select element size while operating.\n * Additionally most emitters accept templated vector register arguments of both `QRegister` and `DRegister` types.\n * Based on the combination of those two arguments, it will emit an instruction operating on a 64-bit or 128-bit wide register\n * with the selected element size.\n *\n * Some vector operations are unsized and only operate at the one width. In these cases the instruction only\n * operates at one size, the width depends on the instruction.\n * The arguments for these instructions are usually `VRegister` but might be one of the other sized types as well.\n *\n * Only two instructions support the `i128Bit` ElementSize.\n */\n\n#pragma once\n#ifndef INCLUDED_BY_EMITTER\n#include <CodeEmitter/Emitter.h>\nnamespace ARMEmitter {\nstruct EmitterOps : Emitter {\n#endif\n\npublic:\n  // Data Processing -- Scalar Floating-Point and Advanced SIMD\n  // Cryptographic AES\n  void aese(VRegister rd, VRegister rn) {\n    CryptoAES(0b00100, rd, rn);\n  }\n  void aesd(VRegister rd, VRegister rn) {\n    CryptoAES(0b00101, rd, rn);\n  }\n  void aesmc(VRegister rd, VRegister rn) {\n    CryptoAES(0b00110, rd, rn);\n  }\n  void aesimc(VRegister rd, VRegister rn) {\n    CryptoAES(0b00111, rd, rn);\n  }\n\n  // Cryptographic three-register SHA\n  void sha1c(VRegister rd, SRegister rn, VRegister rm) {\n    Crypto3RegSHA(0b000, rd, rn.V(), rm);\n  }\n  void sha1p(VRegister rd, SRegister rn, VRegister rm) {\n    Crypto3RegSHA(0b001, rd, rn.V(), rm);\n  }\n  void sha1m(VRegister rd, SRegister rn, VRegister rm) {\n    Crypto3RegSHA(0b010, rd, rn.V(), rm);\n  }\n  void sha1su0(VRegister rd, VRegister rn, VRegister rm) {\n    Crypto3RegSHA(0b011, rd, rn, rm);\n  }\n  void sha256h(VRegister rd, VRegister rn, VRegister rm) {\n    Crypto3RegSHA(0b100, rd, rn, rm);\n  }\n  void sha256h2(VRegister rd, VRegister rn, VRegister rm) {\n    Crypto3RegSHA(0b101, rd, rn, rm);\n  }\n  void sha256su1(VRegister rd, VRegister rn, VRegister rm) {\n    Crypto3RegSHA(0b110, rd, rn, rm);\n  }\n\n  // Cryptographic two-register SHA\n  void sha1h(SRegister rd, SRegister rn) {\n    Crypto2RegSHA(0b00000, rd.V(), rn.V());\n  }\n  void sha1su1(VRegister rd, VRegister rn) {\n    Crypto2RegSHA(0b00001, rd, rn);\n  }\n  void sha256su0(VRegister rd, VRegister rn) {\n    Crypto2RegSHA(0b00010, rd, rn);\n  }\n  // Advanced SIMD table lookup\n  void tbl(QRegister rd, QRegister rn, QRegister rm) {\n    ASIMDTable(1, 0b00, 0b00, 0b0, rd.V(), rn.V(), rm.V());\n  }\n  void tbl(DRegister rd, QRegister rn, DRegister rm) {\n    ASIMDTable(0, 0b00, 0b00, 0b0, rd.V(), rn.V(), rm.V());\n  }\n  void tbx(QRegister rd, QRegister rn, QRegister rm) {\n    ASIMDTable(1, 0b00, 0b00, 0b1, rd.V(), rn.V(), rm.V());\n  }\n  void tbx(DRegister rd, QRegister rn, DRegister rm) {\n    ASIMDTable(0, 0b00, 0b00, 0b1, rd.V(), rn.V(), rm.V());\n  }\n\n  void tbl(QRegister rd, QRegister rn, QRegister rn2, QRegister rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rn, rn2), \"rn and rn2 must be sequential\");\n    ASIMDTable(1, 0b00, 0b01, 0b0, rd.V(), rn.V(), rm.V());\n  }\n  void tbl(DRegister rd, QRegister rn, QRegister rn2, DRegister rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rn, rn2), \"rn and rn2 must be sequential\");\n    ASIMDTable(0, 0b00, 0b01, 0b0, rd.V(), rn.V(), rm.V());\n  }\n  void tbx(QRegister rd, QRegister rn, QRegister rn2, QRegister rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rn, rn2), \"rn and rn2 must be sequential\");\n    ASIMDTable(1, 0b00, 0b01, 0b1, rd.V(), rn.V(), rm.V());\n  }\n  void tbx(DRegister rd, QRegister rn, QRegister rn2, DRegister rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rn, rn2), \"rn and rn2 must be sequential\");\n    ASIMDTable(0, 0b00, 0b01, 0b1, rd.V(), rn.V(), rm.V());\n  }\n\n  void tbl(QRegister rd, QRegister rn, QRegister rn2, QRegister rn3, QRegister rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rn, rn2, rn3), \"rn, rn2, and rn3 must be sequential\");\n    ASIMDTable(1, 0b00, 0b10, 0b0, rd.V(), rn.V(), rm.V());\n  }\n  void tbl(DRegister rd, QRegister rn, QRegister rn2, QRegister rn3, DRegister rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rn, rn2, rn3), \"rn, rn2, and rn3 must be sequential\");\n    ASIMDTable(0, 0b00, 0b10, 0b0, rd.V(), rn.V(), rm.V());\n  }\n  void tbx(QRegister rd, QRegister rn, QRegister rn2, QRegister rn3, QRegister rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rn, rn2, rn3), \"rn, rn2, and rn3 must be sequential\");\n    ASIMDTable(1, 0b00, 0b10, 0b1, rd.V(), rn.V(), rm.V());\n  }\n  void tbx(DRegister rd, QRegister rn, QRegister rn2, QRegister rn3, DRegister rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rn, rn2, rn3), \"rn, rn2, and rn3 must be sequential\");\n    ASIMDTable(0, 0b00, 0b10, 0b1, rd.V(), rn.V(), rm.V());\n  }\n\n  void tbl(QRegister rd, QRegister rn, QRegister rn2, QRegister rn3, QRegister rn4, QRegister rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rn, rn2, rn3, rn4), \"rn, rn2, rn3, and rn4 must be sequential\");\n    ASIMDTable(1, 0b00, 0b11, 0b0, rd.V(), rn.V(), rm.V());\n  }\n  void tbl(DRegister rd, QRegister rn, QRegister rn2, QRegister rn3, QRegister rn4, DRegister rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rn, rn2, rn3, rn4), \"rn, rn2, rn3, and rn4 must be sequential\");\n    ASIMDTable(0, 0b00, 0b11, 0b0, rd.V(), rn.V(), rm.V());\n  }\n  void tbx(QRegister rd, QRegister rn, QRegister rn2, QRegister rn3, QRegister rn4, QRegister rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rn, rn2, rn3, rn4), \"rn, rn2, rn3, and rn4 must be sequential\");\n    ASIMDTable(1, 0b00, 0b11, 0b1, rd.V(), rn.V(), rm.V());\n  }\n  void tbx(DRegister rd, QRegister rn, QRegister rn2, QRegister rn3, QRegister rn4, DRegister rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rn, rn2, rn3, rn4), \"rn, rn2, rn3, and rn4 must be sequential\");\n    ASIMDTable(0, 0b00, 0b11, 0b1, rd.V(), rn.V(), rm.V());\n  }\n\n  // Advanced SIMD permute\n  void uzp1(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    ASIMDPermute(1, size, 0b001, rd.V(), rn.V(), rm.V());\n  }\n  void uzp1(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid 64-bit size on 64-bit permute\");\n    ASIMDPermute(0, size, 0b001, rd.V(), rn.V(), rm.V());\n  }\n  void trn1(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    ASIMDPermute(1, size, 0b010, rd.V(), rn.V(), rm.V());\n  }\n  void trn1(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid 64-bit size on 64-bit permute\");\n    ASIMDPermute(0, size, 0b010, rd.V(), rn.V(), rm.V());\n  }\n  void zip1(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    ASIMDPermute(1, size, 0b011, rd.V(), rn.V(), rm.V());\n  }\n  void zip1(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid 64-bit size on 64-bit permute\");\n    ASIMDPermute(0, size, 0b011, rd.V(), rn.V(), rm.V());\n  }\n  void uzp2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    ASIMDPermute(1, size, 0b101, rd.V(), rn.V(), rm.V());\n  }\n  void uzp2(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid 64-bit size on 64-bit permute\");\n    ASIMDPermute(0, size, 0b101, rd.V(), rn.V(), rm.V());\n  }\n  void trn2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    ASIMDPermute(1, size, 0b110, rd.V(), rn.V(), rm.V());\n  }\n  void trn2(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid 64-bit size on 64-bit permute\");\n    ASIMDPermute(0, size, 0b110, rd.V(), rn.V(), rm.V());\n  }\n  void zip2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    ASIMDPermute(1, size, 0b111, rd.V(), rn.V(), rm.V());\n  }\n  void zip2(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid 64-bit size on 64-bit permute\");\n    ASIMDPermute(0, size, 0b111, rd.V(), rn.V(), rm.V());\n  }\n\n  // Advanced SIMD extract\n  void ext(QRegister rd, QRegister rn, QRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(Index < 16, \"Index can't be more than 15\");\n    ASIMDExtract(1, 0b00, Index, rd.V(), rn.V(), rm.V());\n  }\n  void ext(DRegister rd, DRegister rn, DRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(Index < 8, \"Index can't be more than 7\");\n    ASIMDExtract(0, 0b00, Index, rd.V(), rn.V(), rm.V());\n  }\n\n  // Advanced SIMD copy\n  template<IsQOrDRegister T>\n  void dup(SubRegSize size, T rd, T rn, uint32_t Index) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit dup\");\n    }\n\n    constexpr uint32_t Q = std::is_same_v<QRegister, T> ? 1 : 0;\n\n    const uint32_t SizeImm = FEXCore::ToUnderlying(size);\n    const uint32_t IndexShift = SizeImm + 1;\n    const uint32_t ElementSize = 1U << SizeImm;\n    [[maybe_unused]] const uint32_t MaxIndex = 128U / (ElementSize * 8);\n\n    LOGMAN_THROW_A_FMT(Index < MaxIndex, \"Index too large. Index={}, Max Index: {}\", Index, MaxIndex);\n\n    const uint32_t imm5 = (Index << IndexShift) | ElementSize;\n\n    ASIMDScalarCopy(Q, 0, imm5, 0b0000, rd.V(), rn.V());\n  }\n\n  template<IsQOrDRegister T>\n  void dup(SubRegSize size, T rd, Register rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit dup\");\n    }\n\n    constexpr uint32_t Q = std::is_same_v<QRegister, T> ? 1 : 0;\n\n    // Upper bits of imm5 are ignored for GPR dup\n    const uint32_t imm5 = 1U << FEXCore::ToUnderlying(size);\n\n    ASIMDScalarCopy(Q, 0, imm5, 0b0001, rd, ToVReg(rn));\n  }\n\n  template<SubRegSize size>\n  requires (size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit)\n  void smov(XRegister rd, VRegister rn, uint32_t Index) {\n    static_assert(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit, \"Unsupported smov size\");\n\n    constexpr uint32_t SizeImm = FEXCore::ToUnderlying(size);\n    constexpr uint32_t IndexShift = SizeImm + 1;\n    constexpr uint32_t ElementSize = 1U << SizeImm;\n    [[maybe_unused]] constexpr uint32_t MaxIndex = 128U / (ElementSize * 8);\n\n    LOGMAN_THROW_A_FMT(Index < MaxIndex, \"Index too large. Index={}, Max Index: {}\", Index, MaxIndex);\n\n    const uint32_t imm5 = (Index << IndexShift) | ElementSize;\n\n    ASIMDScalarCopy(1, 0, imm5, 0b0101, ToVReg(rd), rn);\n  }\n  template<SubRegSize size>\n  requires (size == SubRegSize::i8Bit || size == SubRegSize::i16Bit)\n  void smov(WRegister rd, VRegister rn, uint32_t Index) {\n    static_assert(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit, \"Unsupported smov size\");\n\n    constexpr uint32_t SizeImm = FEXCore::ToUnderlying(size);\n    constexpr uint32_t IndexShift = SizeImm + 1;\n    constexpr uint32_t ElementSize = 1U << SizeImm;\n    [[maybe_unused]] constexpr uint32_t MaxIndex = 128U / (ElementSize * 8);\n\n    LOGMAN_THROW_A_FMT(Index < MaxIndex, \"Index too large. Index={}, Max Index: {}\", Index, MaxIndex);\n\n    const uint32_t imm5 = (Index << IndexShift) | ElementSize;\n\n    ASIMDScalarCopy(0, 0, imm5, 0b0101, ToVReg(rd), rn);\n  }\n\n  template<SubRegSize size>\n  void umov(Register rd, VRegister rn, uint32_t Index) {\n    static_assert(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                  \"Unsupported umov size\");\n\n    constexpr uint32_t Q = size == SubRegSize::i64Bit ? 1 : 0;\n\n    constexpr uint32_t SizeImm = FEXCore::ToUnderlying(size);\n    constexpr uint32_t IndexShift = SizeImm + 1;\n    constexpr uint32_t ElementSize = 1U << SizeImm;\n    [[maybe_unused]] constexpr uint32_t MaxIndex = 128U / (ElementSize * 8);\n\n    LOGMAN_THROW_A_FMT(Index < MaxIndex, \"Index too large. Index={}, Max Index: {}\", Index, MaxIndex);\n\n    const uint32_t imm5 = (Index << IndexShift) | ElementSize;\n\n    ASIMDScalarCopy(Q, 0, imm5, 0b0111, ToVReg(rd), rn);\n  }\n\n  void ins(SubRegSize size, VRegister rd, uint32_t Index, Register rn) {\n    const uint32_t SizeImm = FEXCore::ToUnderlying(size);\n    const uint32_t IndexShift = SizeImm + 1;\n    const uint32_t ElementSize = 1U << SizeImm;\n    [[maybe_unused]] const uint32_t MaxIndex = 128U / (ElementSize * 8);\n\n    LOGMAN_THROW_A_FMT(Index < MaxIndex, \"Index too large. Index={}, Max Index: {}\", Index, MaxIndex);\n\n    const uint32_t imm5 = (Index << IndexShift) | ElementSize;\n\n    ASIMDScalarCopy(1, 0, imm5, 0b0011, rd, ToVReg(rn));\n  }\n\n  void ins(SubRegSize size, VRegister rd, uint32_t Index, VRegister rn, uint32_t Index2) {\n    const uint32_t SizeImm = FEXCore::ToUnderlying(size);\n    const uint32_t IndexShift = SizeImm + 1;\n    const uint32_t ElementSize = 1U << SizeImm;\n    [[maybe_unused]] const uint32_t MaxIndex = 128U / (ElementSize * 8);\n\n    LOGMAN_THROW_A_FMT(Index < MaxIndex, \"Index too large. Index={}, Max Index: {}\", Index, MaxIndex);\n    LOGMAN_THROW_A_FMT(Index2 < MaxIndex, \"Index2 too large. Index2={}, Max Index: {}\", Index2, MaxIndex);\n\n    const uint32_t imm5 = (Index << IndexShift) | ElementSize;\n    const uint32_t imm4 = Index2 << SizeImm;\n\n    ASIMDScalarCopy(1, 0b10, imm5, imm4, rd, rn);\n  }\n\n  // Advanced SIMD three-register extension\n  template<IsQOrDRegister T>\n  void sdot(ARMEmitter::SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<ARMEmitter::DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != ARMEmitter::SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMDThreeRegisterExt(0, 0b0010, size, rm, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void usdot(T rd, T rn, T rm) {\n    ASIMDThreeRegisterExt(0, 0b0011, ARMEmitter::SubRegSize::i32Bit, rm, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void sqrdmlah(ARMEmitter::SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<ARMEmitter::DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != ARMEmitter::SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMDThreeRegisterExt(1, 0b0000, size, rm, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void sqrdmlsh(ARMEmitter::SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<ARMEmitter::DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != ARMEmitter::SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMDThreeRegisterExt(1, 0b0001, size, rm, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void udot(ARMEmitter::SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<ARMEmitter::DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != ARMEmitter::SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMDThreeRegisterExt(1, 0b0010, size, rm, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void fcmla(ARMEmitter::SubRegSize size, T rd, T rn, T rm, ARMEmitter::Rotation Rot) {\n    LOGMAN_THROW_A_FMT(size != ARMEmitter::SubRegSize::i8Bit, \"8-bit subregsize not supported\");\n\n    if constexpr (std::is_same_v<ARMEmitter::DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != ARMEmitter::SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMDThreeRegisterExt(1, 0b1000 | FEXCore::ToUnderlying(Rot), size, rm, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void fcadd(ARMEmitter::SubRegSize size, T rd, T rn, T rm, ARMEmitter::Rotation Rot) {\n    LOGMAN_THROW_A_FMT(size != ARMEmitter::SubRegSize::i8Bit, \"8-bit subregsize not supported\");\n\n    if constexpr (std::is_same_v<ARMEmitter::DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != ARMEmitter::SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(Rot == ARMEmitter::Rotation::ROTATE_90 || Rot == ARMEmitter::Rotation::ROTATE_270, \"Invalid rotation\");\n    const uint32_t ConvertedRotation = Rot == ARMEmitter::Rotation::ROTATE_90 ? 0b00 : 0b10;\n    ASIMDThreeRegisterExt(1, 0b1100 | ConvertedRotation, size, rm, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void bfdot(T rd, T rn, T rm) {\n    ASIMDThreeRegisterExt(1, 0b1111, ARMEmitter::SubRegSize::i16Bit, rm, rn, rd);\n  }\n  void bfmlalb(ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm) {\n    ASIMDThreeRegisterExt(1, 0b1111, ARMEmitter::SubRegSize::i64Bit, rm.D(), rn.D(), rd.D());\n  }\n  void bfmlalt(ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm) {\n    ASIMDThreeRegisterExt(1, 0b1111, ARMEmitter::SubRegSize::i64Bit, rm.Q(), rn.Q(), rd.Q());\n  }\n  void smmla(ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm) {\n    ASIMDThreeRegisterExt(0, 0b0100, ARMEmitter::SubRegSize::i32Bit, rm.Q(), rn.Q(), rd.Q());\n  }\n  void usmmla(ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm) {\n    ASIMDThreeRegisterExt(0, 0b0101, ARMEmitter::SubRegSize::i32Bit, rm.Q(), rn.Q(), rd.Q());\n  }\n  void bfmmla(ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm) {\n    ASIMDThreeRegisterExt(1, 0b1101, ARMEmitter::SubRegSize::i16Bit, rm.Q(), rn.Q(), rd.Q());\n  }\n  void ummla(ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm) {\n    ASIMDThreeRegisterExt(1, 0b0100, ARMEmitter::SubRegSize::i32Bit, rm.Q(), rn.Q(), rd.Q());\n  }\n\n  // Advanced SIMD two-register miscellaneous\n  template<IsQOrDRegister T>\n  void rev64(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD2RegMisc(0, size, 0b00000, rd, rn);\n  }\n\n  template<IsQOrDRegister T>\n  void rev16(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit, \"Only 8-bit subregsize supported\");\n    ASIMD2RegMisc(0, size, 0b00001, rd, rn);\n  }\n\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  template<IsQOrDRegister T>\n  void saddlp(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Destination 8-bit subregsize unsupported\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD2RegMisc(0, ConvertedSize, 0b00010, rd, rn);\n  }\n\n  template<IsQOrDRegister T>\n  void suqadd(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMD2RegMisc(0, size, 0b00011, rd, rn);\n  }\n\n  template<IsQOrDRegister T>\n  void cls(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD2RegMisc(0, size, 0b00100, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void cnt(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit, \"Only 8-bit subregsize supported\");\n    ASIMD2RegMisc(0, size, 0b00101, rd, rn);\n  }\n\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  template<IsQOrDRegister T>\n  void sadalp(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Destination 8-bit subregsize unsupported\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD2RegMisc(0, ConvertedSize, 0b00110, rd, rn);\n  }\n\n  template<IsQOrDRegister T>\n  void sqabs(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMD2RegMisc(0, size, 0b00111, rd, rn);\n  }\n  // Comparison against zero\n  template<IsQOrDRegister T>\n  void cmgt(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMD2RegMisc(0, size, 0b01000, rd, rn);\n  }\n  // Comparison against zero\n  template<IsQOrDRegister T>\n  void cmeq(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMD2RegMisc(0, size, 0b01001, rd, rn);\n  }\n  // Comparison against zero\n  template<IsQOrDRegister T>\n  void cmlt(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMD2RegMisc(0, size, 0b01010, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void abs(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMD2RegMisc(0, size, 0b01011, rd, rn);\n  }\n\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void xtn(SubRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit destination subregsize not supported\");\n    ASIMD2RegMisc(0, size, 0b10010, rd.D(), rn.D());\n  }\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void xtn2(SubRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit destination subregsize not supported\");\n    ASIMD2RegMisc(0, size, 0b10010, rd.Q(), rn.Q());\n  }\n\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void sqxtn(SubRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit destination subregsize not supported\");\n    ASIMD2RegMisc(0, size, 0b10100, rd.D(), rn.D());\n  }\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void sqxtn2(SubRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit destination subregsize not supported\");\n    ASIMD2RegMisc(0, size, 0b10100, rd.Q(), rn.Q());\n  }\n\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void fcvtn(SubRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i32Bit || size == SubRegSize::i16Bit, \"Only 16-bit & 32-bit subregsize supported\");\n    const auto ConvertedSize = size == SubRegSize::i32Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n\n    ASIMD2RegMisc(0, ConvertedSize, 0b10110, rd.D(), rn.D());\n  }\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void fcvtn2(SubRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i32Bit || size == SubRegSize::i16Bit, \"Only 16-bit & 32-bit subregsize supported\");\n    const auto ConvertedSize = size == SubRegSize::i32Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n\n    ASIMD2RegMisc(0, ConvertedSize, 0b10110, rd.Q(), rn.Q());\n  }\n\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void fcvtl(SubRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i64Bit || size == SubRegSize::i32Bit, \"Only 32-bit & 64-bit subregsize supported\");\n    const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n\n    ASIMD2RegMisc(0, ConvertedSize, 0b10111, rd.D(), rn.D());\n  }\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void fcvtl2(SubRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i64Bit || size == SubRegSize::i32Bit, \"Only 32-bit & 64-bit subregsize supported\");\n    const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n\n    ASIMD2RegMisc(0, ConvertedSize, 0b10111, rd.Q(), rn.Q());\n  }\n\n  template<IsQOrDRegister T>\n  void frintn(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(0, 0, 0b11000, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD2RegMisc(0, ConvertedSize, 0b11000, rd, rn);\n    }\n  }\n  template<IsQOrDRegister T>\n  void frintm(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(0, 0, 0b11001, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD2RegMisc(0, ConvertedSize, 0b11001, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void fcvtns(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(0, 0, 0b11010, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD2RegMisc(0, ConvertedSize, 0b11010, rd, rn);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fcvtms(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(0, 0, 0b11011, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD2RegMisc(0, ConvertedSize, 0b11011, rd, rn);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fcvtas(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(0, 0, 0b11100, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD2RegMisc(0, ConvertedSize, 0b11100, rd, rn);\n    }\n  }\n  template<IsQOrDRegister T>\n  void scvtf(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(0, 0, 0b11101, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD2RegMisc(0, ConvertedSize, 0b11101, rd, rn);\n    }\n  }\n  template<IsQOrDRegister T>\n  void frint32z(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i64Bit || size == SubRegSize::i32Bit, \"Only 32-bit & 64-bit subregsize supported\");\n    const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n\n    ASIMD2RegMisc(0, ConvertedSize, 0b11110, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void frint64z(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i64Bit || size == SubRegSize::i32Bit, \"Only 32-bit & 64-bit subregsize supported\");\n    const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n\n    ASIMD2RegMisc(0, ConvertedSize, 0b11111, rd, rn);\n  }\n\n  template<IsQOrDRegister T>\n  void fcmgt(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(0, 1, 0b01100, rn, rd);\n    } else {\n      ASIMD2RegMisc(0, size, 0b01100, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void fcmeq(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(0, 1, 0b01101, rn, rd);\n    } else {\n      ASIMD2RegMisc(0, size, 0b01101, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void fcmlt(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(0, 1, 0b01110, rn, rd);\n    } else {\n      ASIMD2RegMisc(0, size, 0b01110, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void fabs(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(0, 1, 0b01111, rn, rd);\n    } else {\n      ASIMD2RegMisc(0, size, 0b01111, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void frintp(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(0, 1, 0b11000, rn, rd);\n    } else {\n      ASIMD2RegMisc(0, size, 0b11000, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void frintz(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(0, 1, 0b11001, rn, rd);\n    } else {\n      ASIMD2RegMisc(0, size, 0b11001, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void fcvtps(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(0, 1, 0b11010, rn, rd);\n    } else {\n      ASIMD2RegMisc(0, size, 0b11010, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void fcvtzs(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(0, 1, 0b11011, rn, rd);\n    } else {\n      ASIMD2RegMisc(0, size, 0b11011, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void urecpe(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i32Bit, \"Only 32-bit subregsize supported\");\n    ASIMD2RegMisc(0, size, 0b11100, rd, rn);\n  }\n\n  template<IsQOrDRegister T>\n  void frecpe(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(0, 1, 0b11101, rn, rd);\n    } else {\n      ASIMD2RegMisc(0, size, 0b11101, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void rev32(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit, \"Only 8-bit & 16-bit subregsize supported\");\n    ASIMD2RegMisc(1, size, 0b00000, rd, rn);\n  }\n\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  template<IsQOrDRegister T>\n  void uaddlp(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Destination 8-bit subregsize unsupported\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD2RegMisc(1, ConvertedSize, 0b00010, rd, rn);\n  }\n\n  template<IsQOrDRegister T>\n  void usqadd(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMD2RegMisc(1, size, 0b00011, rd, rn);\n  }\n\n  template<IsQOrDRegister T>\n  void clz(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD2RegMisc(1, size, 0b00100, rd, rn);\n  }\n\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  template<IsQOrDRegister T>\n  void uadalp(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Destination 8-bit subregsize unsupported\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD2RegMisc(1, ConvertedSize, 0b00110, rd, rn);\n  }\n\n  template<IsQOrDRegister T>\n  void sqneg(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMD2RegMisc(1, size, 0b00111, rd, rn);\n  }\n\n  // Comparison against zero\n  template<IsQOrDRegister T>\n  void cmge(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMD2RegMisc(1, size, 0b01000, rd, rn);\n  }\n  // Comparison against zero\n  template<IsQOrDRegister T>\n  void cmle(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMD2RegMisc(1, size, 0b01001, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void neg(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    ASIMD2RegMisc(1, size, 0b01011, rd, rn);\n  }\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void sqxtun(SubRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit destination subregsize not supported\");\n    ASIMD2RegMisc(1, size, 0b10010, rd.D(), rn.D());\n  }\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void sqxtun2(SubRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit destination subregsize not supported\");\n    ASIMD2RegMisc(1, size, 0b10010, rd.Q(), rn.Q());\n  }\n\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void shll(SubRegSize size, DRegister rd, DRegister rn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Destination 8-bit subregsize unsupported\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD2RegMisc(1, ConvertedSize, 0b10011, rd, rn);\n  }\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void shll2(SubRegSize size, QRegister rd, QRegister rn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Destination 8-bit subregsize unsupported\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD2RegMisc(1, ConvertedSize, 0b10011, rd, rn);\n  }\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void uqxtn(SubRegSize size, VRegister rd, VRegister rn) {\n    ASIMD2RegMisc(1, size, 0b10100, rd.D(), rn.D());\n  }\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void uqxtn2(SubRegSize size, VRegister rd, VRegister rn) {\n    ASIMD2RegMisc(1, size, 0b10100, rd.Q(), rn.Q());\n  }\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void fcvtxn(SubRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i32Bit, \"Only 32-bit subregsize supported\");\n    const auto ConvertedSize = size == SubRegSize::i32Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n\n    ASIMD2RegMisc(1, ConvertedSize, 0b10110, rd.D(), rn.D());\n  }\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  void fcvtxn2(SubRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i32Bit, \"Only 32-bit subregsize supported\");\n    const auto ConvertedSize = size == SubRegSize::i32Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n\n    ASIMD2RegMisc(1, ConvertedSize, 0b10110, rd.Q(), rn.Q());\n  }\n  template<IsQOrDRegister T>\n  void frinta(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(1, 0, 0b11000, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD2RegMisc(1, ConvertedSize, 0b11000, rd, rn);\n    }\n  }\n  template<IsQOrDRegister T>\n  void frintx(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(1, 0, 0b11001, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD2RegMisc(1, ConvertedSize, 0b11001, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void fcvtnu(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(1, 0, 0b11010, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD2RegMisc(1, ConvertedSize, 0b11010, rd, rn);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fcvtmu(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(1, 0, 0b11011, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD2RegMisc(1, ConvertedSize, 0b11011, rd, rn);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fcvtau(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(1, 0, 0b11100, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD2RegMisc(1, ConvertedSize, 0b11100, rd, rn);\n    }\n  }\n  template<IsQOrDRegister T>\n  void ucvtf(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(1, 0, 0b11101, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD2RegMisc(1, ConvertedSize, 0b11101, rd, rn);\n    }\n  }\n  template<IsQOrDRegister T>\n  void frint32x(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i64Bit || size == SubRegSize::i32Bit, \"Only 32-bit & 64-bit subregsize supported\");\n    const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n\n    ASIMD2RegMisc(1, ConvertedSize, 0b11110, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void frint64x(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i64Bit || size == SubRegSize::i32Bit, \"Only 32-bit & 64-bit subregsize supported\");\n    const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n\n    ASIMD2RegMisc(1, ConvertedSize, 0b11111, rd, rn);\n  }\n\n  template<IsQOrDRegister T>\n  void not_(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit, \"Only 8-bit subregsize supported\");\n    ASIMD2RegMisc(1, SubRegSize::i8Bit, 0b00101, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void mvn(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit, \"Only 8-bit subregsize supported\");\n    ASIMD2RegMisc(1, SubRegSize::i8Bit, 0b00101, rd, rn);\n  }\n\n  template<IsQOrDRegister T>\n  void rbit(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit, \"Only 8-bit subregsize supported\");\n    ASIMD2RegMisc(1, SubRegSize::i16Bit, 0b00101, rd, rn);\n  }\n\n  template<IsQOrDRegister T>\n  void fcmge(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(1, 1, 0b01100, rn, rd);\n    } else {\n      ASIMD2RegMisc(1, size, 0b01100, rd, rn);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fcmle(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(1, 1, 0b01101, rn, rd);\n    } else {\n      ASIMD2RegMisc(1, size, 0b01101, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void fneg(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(1, 1, 0b01111, rn, rd);\n    } else {\n      ASIMD2RegMisc(1, size, 0b01111, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void frinti(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(1, 1, 0b11001, rn, rd);\n    } else {\n      ASIMD2RegMisc(1, size, 0b11001, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void fcvtpu(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(1, 1, 0b11010, rn, rd);\n    } else {\n      ASIMD2RegMisc(1, size, 0b11010, rd, rn);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fcvtzu(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(1, 1, 0b11011, rn, rd);\n    } else {\n      ASIMD2RegMisc(1, size, 0b11011, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void ursqrte(SubRegSize size, T rd, T rn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i32Bit, \"Only 32-bit & 64-bit subregsize supported\");\n    ASIMD2RegMisc(1, size, 0b11100, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void frsqrte(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(1, 1, 0b11101, rn, rd);\n    } else {\n      ASIMD2RegMisc(1, size, 0b11101, rd, rn);\n    }\n  }\n\n  template<IsQOrDRegister T>\n  void fsqrt(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDTwoRegMiscFP16(1, 1, 0b11111, rn, rd);\n    } else {\n      ASIMD2RegMisc(1, size, 0b11111, rd, rn);\n    }\n  }\n\n  // Advanced SIMD across lanes\n  ///< size is the destination size.\n  ///< source size is the next size up.\n  template<IsQOrDRegister T>\n  void saddlv(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Destination 8-bit subregsize unsupported\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMDAcrossLanes<T>(0, ConvertedSize, 0b00011, rd, rn);\n  }\n\n  template<IsQOrDRegister T>\n  void smaxv(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i32Bit && size != SubRegSize::i64Bit, \"32/64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Destination 64-bit subregsize unsupported\");\n    ASIMDAcrossLanes<T>(0, size, 0b01010, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void sminv(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i32Bit && size != SubRegSize::i64Bit, \"32/64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Destination 64-bit subregsize unsupported\");\n    ASIMDAcrossLanes<T>(0, size, 0b11010, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void addv(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i32Bit && size != SubRegSize::i64Bit, \"32/64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Destination 64-bit subregsize unsupported\");\n    ASIMDAcrossLanes<T>(0, size, 0b11011, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void uaddlv(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Destination 8-bit subregsize unsupported\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMDAcrossLanes<T>(1, ConvertedSize, 0b00011, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void umaxv(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i32Bit && size != SubRegSize::i64Bit, \"32/64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Destination 64-bit subregsize unsupported\");\n    ASIMDAcrossLanes<T>(1, size, 0b01010, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void uminv(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i32Bit && size != SubRegSize::i64Bit, \"32/64-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Destination 64-bit subregsize unsupported\");\n    ASIMDAcrossLanes<T>(1, size, 0b11010, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void fmaxnmv(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i32Bit, \"32-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i64Bit, \"Destination 8/64-bit subregsize unsupported\");\n    const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n    const auto U = size == SubRegSize::i16Bit ? 0 : 1;\n\n    ASIMDAcrossLanes<T>(U, ConvertedSize, 0b01100, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void fmaxv(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i32Bit, \"32-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i64Bit, \"Destination 8/64-bit subregsize unsupported\");\n    const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n    const auto U = size == ARMEmitter::SubRegSize::i16Bit ? 0 : 1;\n\n    ASIMDAcrossLanes<T>(U, ConvertedSize, 0b01111, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void fminnmv(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i32Bit, \"32-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i64Bit, \"Destination 8/64-bit subregsize unsupported\");\n    const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i64Bit : SubRegSize::i32Bit;\n    const auto U = size == SubRegSize::i16Bit ? 0 : 1;\n\n    ASIMDAcrossLanes<T>(U, ConvertedSize, 0b01100, rd, rn);\n  }\n  template<IsQOrDRegister T>\n  void fminv(SubRegSize size, T rd, T rn) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i32Bit, \"32-bit subregsize not supported\");\n    }\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i64Bit, \"Destination 8/64-bit subregsize unsupported\");\n    const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i64Bit : SubRegSize::i32Bit;\n    const auto U = size == SubRegSize::i16Bit ? 0 : 1;\n\n    ASIMDAcrossLanes<T>(U, ConvertedSize, 0b01111, rd, rn);\n  }\n\n  // Advanced SIMD three different\n  // TODO: Double check narrowing op size limits.\n  // TODO: Don't enforce DRegister/QRegister for Q check\n  ///< Size is dest size\n  void saddl(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b0000, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void saddl2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b0000, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void saddw(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b0001, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void saddw2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b0001, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void ssubl(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b0010, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void ssubl2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b0010, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void ssubw(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b0011, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void ssubw2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b0011, ConvertedSize, rd, rn, rm);\n  }\n  void addhn(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"No 64-bit dest support.\");\n    ASIMD3Different(0, 0b0100, size, rd, rn, rm);\n  }\n  void addhn2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"No 64-bit dest support.\");\n    ASIMD3Different(0, 0b0100, size, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void sabal(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b0101, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void sabal2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n    ASIMD3Different(0, 0b0101, ConvertedSize, rd, rn, rm);\n  }\n  void subhn(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"No 64-bit dest support.\");\n    ASIMD3Different(0, 0b0110, size, rd, rn, rm);\n  }\n  void subhn2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"No 64-bit dest support.\");\n    ASIMD3Different(0, 0b0110, size, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void sabdl(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b0111, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void sabdl2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b0111, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void smlal(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b1000, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void smlal2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b1000, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void sqdmlal(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i16Bit, \"No 8/16-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b1001, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void sqdmlal2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i16Bit, \"No 8/16-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b1001, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void smlsl(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b1010, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void smlsl2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b1010, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void sqdmlsl(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i16Bit, \"No 8/16-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b1011, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void sqdmlsl2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i16Bit, \"No 8/16-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b1011, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void smull(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b1100, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void smull2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b1100, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void sqdmull(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i16Bit, \"No 8/16-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b1101, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void sqdmull2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i16Bit, \"No 8/16-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b1101, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void pmull(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i16Bit || size == SubRegSize::i128Bit, \"Only 16-bit and 128-bit destination supported\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b1110, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void pmull2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i16Bit || size == SubRegSize::i128Bit, \"Only 16-bit and 128-bit destination supported\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(0, 0b1110, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void uaddl(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b0000, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void uaddl2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b0000, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void uaddw(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b0001, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void uaddw2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b0001, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void usubl(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b0010, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void usubl2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b0010, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void usubw(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b0011, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void usubw2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b0011, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void raddhn(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"No 64-bit dest support.\");\n    ASIMD3Different(1, 0b0100, size, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void raddhn2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"No 64-bit dest support.\");\n    ASIMD3Different(1, 0b0100, size, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void uabal(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b0101, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void uabal2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b0101, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void rsubhn(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"No 64-bit dest support.\");\n    ASIMD3Different(1, 0b0110, size, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void rsubhn2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"No 64-bit dest support.\");\n    ASIMD3Different(1, 0b0110, size, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void uabdl(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b0111, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void uabdl2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b0111, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void umlal(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b1000, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void umlal2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b1000, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void umlsl(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b1010, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void umlsl2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b1010, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void umull(SubRegSize size, DRegister rd, DRegister rn, DRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b1100, ConvertedSize, rd, rn, rm);\n  }\n  ///< Size is dest size\n  void umull2(SubRegSize size, QRegister rd, QRegister rn, QRegister rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    const auto ConvertedSize = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n\n    ASIMD3Different(1, 0b1100, ConvertedSize, rd, rn, rm);\n  }\n\n  // Advanced SIMD three same\n  template<IsQOrDRegister T>\n  void shadd(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(0, size, 0b00000, rd, rn, rm);\n  }\n\n  template<IsQOrDRegister T>\n  void sqadd(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit sqadd\");\n    }\n    ASIMD3Same<T>(0, size, 0b00001, rd, rn, rm);\n  }\n\n  template<IsQOrDRegister T>\n  void srhadd(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(0, size, 0b00010, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void shsub(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(0, size, 0b00100, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void sqsub(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit sqsub\");\n    }\n    ASIMD3Same<T>(0, size, 0b00101, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void cmgt(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit cmgt\");\n    }\n    ASIMD3Same<T>(0, size, 0b00110, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void cmge(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit cmge\");\n    }\n    ASIMD3Same<T>(0, size, 0b00111, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void sshl(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit sshl\");\n    }\n    ASIMD3Same<T>(0, size, 0b01000, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void sqshl(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit sqshl\");\n    }\n    ASIMD3Same<T>(0, size, 0b01001, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void srshl(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit srshl\");\n    }\n    ASIMD3Same<T>(0, size, 0b01010, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void sqrshl(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit sqrshl\");\n    }\n    ASIMD3Same<T>(0, size, 0b01011, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void smax(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(0, size, 0b01100, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void smin(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(0, size, 0b01101, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void sabd(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(0, size, 0b01110, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void saba(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(0, size, 0b01111, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void add(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit add\");\n    }\n    ASIMD3Same<T>(0, size, 0b10000, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void cmtst(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit cmtst\");\n    }\n    ASIMD3Same<T>(0, size, 0b10001, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void mla(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(0, size, 0b10010, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void mul(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(0, size, 0b10011, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void smaxp(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(0, size, 0b10100, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void sminp(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(0, size, 0b10101, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void sqdmulh(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"No 8-bit dest support.\");\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(0, size, 0b10110, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void addp(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    ASIMD3Same<T>(0, size, 0b10111, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void fmaxnm(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(0, 0, 0b000, rm, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD3Same<T>(0, ConvertedSize, 0b11000, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fmla(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(0, 0, 0b001, rm, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD3Same<T>(0, ConvertedSize, 0b11001, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fadd(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(0, 0, 0b010, rm, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD3Same<T>(0, ConvertedSize, 0b11010, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fmulx(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(0, 0, 0b011, rm, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD3Same<T>(0, ConvertedSize, 0b11011, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fcmeq(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(0, 0, 0b100, rm, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD3Same<T>(0, ConvertedSize, 0b11100, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fmax(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(0, 0, 0b110, rm, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD3Same<T>(0, ConvertedSize, 0b11110, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void frecps(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(0, 0, 0b111, rm, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD3Same<T>(0, ConvertedSize, 0b11111, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void and_(T rd, T rn, T rm) {\n    ASIMD3Same<T>(0, SubRegSize::i8Bit, 0b00011, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void fmlal(T rd, T rn, T rm) {\n    ASIMD3Same<T>(0, SubRegSize::i8Bit, 0b11101, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void fmlal2(T rd, T rn, T rm) {\n    ASIMD3Same<T>(1, SubRegSize::i8Bit, 0b11001, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void bic(T rd, T rn, T rm) {\n    ASIMD3Same<T>(0, SubRegSize::i16Bit, 0b00011, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void fminnm(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(0, 1, 0b000, rm, rn, rd);\n    } else {\n      ASIMD3Same<T>(0, size, 0b11000, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fmls(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(0, 1, 0b001, rm, rn, rd);\n    } else {\n      ASIMD3Same<T>(0, size, 0b11001, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fsub(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(0, 1, 0b010, rm, rn, rd);\n    } else {\n      ASIMD3Same<T>(0, size, 0b11010, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fmin(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(0, 1, 0b110, rm, rn, rd);\n    } else {\n      ASIMD3Same<T>(0, size, 0b11110, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void frsqrts(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(0, 1, 0b111, rm, rn, rd);\n    } else {\n      ASIMD3Same<T>(0, size, 0b11111, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void orr(T rd, T rn, T rm) {\n    ASIMD3Same<T>(0, SubRegSize::i32Bit, 0b00011, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void mov(T rd, T rn) {\n    orr<T>(rd, rn, rn);\n  }\n  template<IsQOrDRegister T>\n  void fmlsl(T rd, T rn, T rm) {\n    ASIMD3Same<T>(0, SubRegSize::i32Bit, 0b11101, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void fmlsl2(T rd, T rn, T rm) {\n    ASIMD3Same<T>(1, SubRegSize::i32Bit, 0b11001, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void orn(T rd, T rn, T rm) {\n    ASIMD3Same<T>(0, SubRegSize::i64Bit, 0b00011, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void uhadd(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(1, size, 0b00000, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void uqadd(SubRegSize size, T rd, T rn, T rm) {\n    ASIMD3Same<T>(1, size, 0b00001, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void urhadd(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(1, size, 0b00010, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void uhsub(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(1, size, 0b00100, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void uqsub(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(1, size, 0b00101, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void cmhi(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    ASIMD3Same<T>(1, size, 0b00110, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void cmhs(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    ASIMD3Same<T>(1, size, 0b00111, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void ushl(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    ASIMD3Same<T>(1, size, 0b01000, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void uqshl(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(1, size, 0b01001, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void urshl(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    ASIMD3Same<T>(1, size, 0b01010, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void uqrshl(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(1, size, 0b01011, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void umax(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(1, size, 0b01100, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void umin(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(1, size, 0b01101, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void uabd(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(1, size, 0b01110, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void uaba(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(1, size, 0b01111, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void sub(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    ASIMD3Same<T>(1, size, 0b10000, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void cmeq(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    ASIMD3Same<T>(1, size, 0b10001, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void mls(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(1, size, 0b10010, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void pmul(T rd, T rn, T rm) {\n    ASIMD3Same<T>(1, SubRegSize::i8Bit, 0b10011, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void umaxp(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(1, size, 0b10100, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void uminp(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"64-bit subregsize not supported\");\n    ASIMD3Same<T>(1, size, 0b10101, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void sqrdmulh(SubRegSize size, T rd, T rn, T rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit && size != SubRegSize::i8Bit, \"8/64-bit subregsize not supported\");\n    ASIMD3Same<T>(1, size, 0b10110, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void fmaxnmp(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(1, 0, 0b000, rm, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD3Same<T>(1, ConvertedSize, 0b11000, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void faddp(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(1, 0, 0b010, rm, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD3Same<T>(1, ConvertedSize, 0b11010, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fmul(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(1, 0, 0b011, rm, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD3Same<T>(1, ConvertedSize, 0b11011, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fcmge(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(1, 0, 0b100, rm, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD3Same<T>(1, ConvertedSize, 0b11100, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void facge(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(1, 0, 0b101, rm, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD3Same<T>(1, ConvertedSize, 0b11101, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fmaxp(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(1, 0, 0b110, rm, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD3Same<T>(1, ConvertedSize, 0b11110, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fdiv(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(1, 0, 0b111, rm, rn, rd);\n    } else {\n      const auto ConvertedSize = size == SubRegSize::i64Bit ? SubRegSize::i16Bit : SubRegSize::i8Bit;\n      ASIMD3Same<T>(1, ConvertedSize, 0b11111, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void eor(T rd, T rn, T rm) {\n    ASIMD3Same<T>(1, SubRegSize::i8Bit, 0b00011, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void bsl(T rd, T rn, T rm) {\n    ASIMD3Same<T>(1, SubRegSize::i16Bit, 0b00011, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void fminnmp(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(1, 1, 0b000, rm, rn, rd);\n    } else {\n      ASIMD3Same<T>(1, size, 0b11000, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fabd(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(1, 1, 0b010, rm, rn, rd);\n    } else {\n      ASIMD3Same<T>(1, size, 0b11010, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fcmgt(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(1, 1, 0b100, rm, rn, rd);\n    } else {\n      ASIMD3Same<T>(1, size, 0b11100, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void facgt(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(1, 1, 0b101, rm, rn, rd);\n    } else {\n      ASIMD3Same<T>(1, size, 0b11101, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void fminp(SubRegSize size, T rd, T rn, T rm) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Only 16/32/64-bit subregsize supported\");\n\n    if (size == SubRegSize::i16Bit) {\n      ASIMDThreeSameFP16(1, 1, 0b110, rm, rn, rd);\n    } else {\n      ASIMD3Same<T>(1, size, 0b11110, rd, rn, rm);\n    }\n  }\n  template<IsQOrDRegister T>\n  void bit(T rd, T rn, T rm) {\n    ASIMD3Same<T>(1, SubRegSize::i32Bit, 0b00011, rd, rn, rm);\n  }\n  template<IsQOrDRegister T>\n  void bif(T rd, T rn, T rm) {\n    ASIMD3Same<T>(1, SubRegSize::i64Bit, 0b00011, rd, rn, rm);\n  }\n\n  // Advanced SIMD modified immediate\n  // XXX: ORR - 32-bit/16-bit\n  // XXX: MOVI - Shifting ones\n  template<IsQOrDRegister T>\n  void fmov(SubRegSize size, T rd, float Value) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Unsupported fmov size\");\n\n    uint32_t op;\n    uint32_t cmode = 0b1111;\n    uint32_t o2;\n    uint32_t Imm;\n    if (size == SubRegSize::i16Bit) {\n      LOGMAN_MSG_A_FMT(\"Unsupported\");\n      FEX_UNREACHABLE;\n    } else if (size == SubRegSize::i32Bit) {\n      op = 0;\n      o2 = 0;\n      Imm = FP32ToImm8(Value);\n    } else if (size == SubRegSize::i64Bit) {\n      op = 1;\n      o2 = 0;\n      Imm = FP64ToImm8(Value);\n    } else {\n      LOGMAN_MSG_A_FMT(\"Invalid subregsize\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDModifiedImm(op, cmode, o2, Imm, rd);\n  }\n  // XXX: MVNI - Shifted immediate\n  // XXX: BIC\n  // void ASIMDModifiedImm(uint32_t Op, uint32_t op, uint32_t cmode, uint32_t o2, uint32_t imm, T rd) {\n\n  template<IsQOrDRegister T>\n  void movi(SubRegSize size, T rd, uint64_t Imm, uint16_t Shift = 0) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Unsupported movi size\");\n\n    uint32_t cmode;\n    uint32_t op;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Shift == 0, \"8-bit can't have shift\");\n      LOGMAN_THROW_A_FMT((Imm & ~0xFF) == 0, \"Larger than 8-bit Imm not supported\");\n      cmode = 0b1110;\n      op = 0;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 8, \"Shift by invalid amount\");\n      LOGMAN_THROW_A_FMT((Imm & ~0xFF) == 0, \"Larger than 8-bit Imm not supported\");\n      cmode = 0b1000 | (Shift ? 0b10 : 0b00);\n      op = 0;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 8 || Shift == 16 || Shift == 24, \"Shift by invalid amount\");\n      LOGMAN_THROW_A_FMT((Imm & ~0xFF) == 0, \"Larger than 8-bit Imm not supported\");\n      cmode = 0b0000 | ((Shift >> 3) << 1);\n      op = 0;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Shift == 0, \"64-bit can't have shift\");\n      cmode = 0b1110;\n      op = 1;\n\n      // 64-bit movi doesn't behave like the smaller types\n      // Each bit of the 8-bit imm encoding is expanded to a full 8-bits.\n      // This gives us a full 64-bits for the final result but needs special handling.\n      uint8_t NewImm {};\n      for (size_t i = 0; i < 8; ++i) {\n        const size_t BitOffset = i * 8;\n        uint8_t Section = (Imm >> BitOffset) & 0xFF;\n        LOGMAN_THROW_A_FMT(Section == 0 || Section == 0xFF, \"Invalid 64-bit constant encoding\");\n        if (Section == 0xFF) {\n          NewImm |= (1 << i);\n        }\n      }\n      Imm = NewImm;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Invalid subregsize\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDModifiedImm(op, cmode, 0, Imm, rd);\n  }\n\n  // Advanced SIMD shift by immediate\n  template<IsQOrDRegister T>\n  void sshr(SubRegSize size, T rd, T rn, uint32_t Shift) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - (Shift);\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b00000, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void ssra(SubRegSize size, T rd, T rn, uint32_t Shift) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - (Shift);\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b00010, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void srshr(SubRegSize size, T rd, T rn, uint32_t Shift) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - (Shift);\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b00100, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void srsra(SubRegSize size, T rd, T rn, uint32_t Shift) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - (Shift);\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b00110, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void shl(SubRegSize size, T rd, T rn, uint32_t Shift) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = immh:immb - esize but immh is /also/ used for element size.\n    const uint32_t InvertedShift = SubregSizeInBits + Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b01010, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void sqshl(SubRegSize size, T rd, T rn, uint32_t Shift) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = immh:immb - esize but immh is /also/ used for element size.\n    const uint32_t InvertedShift = SubregSizeInBits + Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b01110, rn, rd);\n  }\n  ///< size is destination size\n  void shrn(SubRegSize size, DRegister rd, DRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - (Shift);\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b10000, rn, rd);\n  }\n  ///< size is destination size\n  void shrn2(SubRegSize size, QRegister rd, QRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - (Shift);\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b10000, rn, rd);\n  }\n  ///< size is destination size\n  void rshrn(SubRegSize size, DRegister rd, DRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - (Shift);\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b10001, rn, rd);\n  }\n  ///< size is destination size\n  void rshrn2(SubRegSize size, QRegister rd, QRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - (Shift);\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b10001, rn, rd);\n  }\n  ///< size is destination size\n  void sqshrn(SubRegSize size, DRegister rd, DRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - (Shift);\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b10010, rn, rd);\n  }\n  ///< size is destination size\n  void sqshrn2(SubRegSize size, QRegister rd, QRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - (Shift);\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b10010, rn, rd);\n  }\n  ///< size is destination size\n  void sqrshrn(SubRegSize size, DRegister rd, DRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - (Shift);\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b10011, rn, rd);\n  }\n  ///< size is destination size\n  void sqrshrn2(SubRegSize size, QRegister rd, QRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - (Shift);\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b10011, rn, rd);\n  }\n  ///< size is destination size\n  void sshll(SubRegSize size, DRegister rd, DRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Invalid size\");\n    size = SubRegSize(FEXCore::ToUnderlying(size) - 1);\n\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n    LOGMAN_THROW_A_FMT(Shift < SubregSizeInBits, \"Shift must not be larger than incoming element size\");\n\n    // Shift encoded a bit weirdly.\n    // shift = immh:immb - esize but immh is /also/ used for element size.\n    const uint32_t InvertedShift = SubregSizeInBits + Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b10100, rn, rd);\n  }\n\n  ///< size is destination size\n  void sshll2(SubRegSize size, QRegister rd, QRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Invalid size\");\n    size = SubRegSize(FEXCore::ToUnderlying(size) - 1);\n\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n    LOGMAN_THROW_A_FMT(Shift < SubregSizeInBits, \"Shift must not be larger than incoming element size\");\n\n    // Shift encoded a bit weirdly.\n    // shift = immh:immb - esize but immh is /also/ used for element size.\n    const uint32_t InvertedShift = SubregSizeInBits + Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b10100, rn, rd);\n  }\n  ///< size is destination size\n  void sxtl(SubRegSize size, VRegister rd, VRegister rn) {\n    sshll(size, rd.D(), rn.D(), 0);\n  }\n  ///< size is destination size\n  void sxtl2(SubRegSize size, VRegister rd, VRegister rn) {\n    sshll2(size, rd.Q(), rn.Q(), 0);\n  }\n\n  template<IsQOrDRegister T>\n  void scvtf(SubRegSize size, T rd, T rn, uint32_t FractionalBits) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Invalid size\");\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n    LOGMAN_THROW_A_FMT(FractionalBits < SubregSizeInBits, \"FractionalBits must not be larger than incoming element size\");\n\n    // fbits encoded a bit weirdly.\n    // fbits = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedFractionalBits = (SubregSizeInBits * 2) - FractionalBits;\n    const uint32_t immh = InvertedFractionalBits >> 3;\n    const uint32_t immb = InvertedFractionalBits & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b11100, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void fcvtzs(SubRegSize size, T rd, T rn, uint32_t FractionalBits) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Invalid size\");\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n    LOGMAN_THROW_A_FMT(FractionalBits < SubregSizeInBits, \"FractionalBits must not be larger than incoming element size\");\n\n    // fbits encoded a bit weirdly.\n    // fbits = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedFractionalBits = (SubregSizeInBits * 2) - FractionalBits;\n    const uint32_t immh = InvertedFractionalBits >> 3;\n    const uint32_t immb = InvertedFractionalBits & 0b111;\n\n    ASIMDShiftByImm(0, immh, immb, 0b11111, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void ushr(SubRegSize size, T rd, T rn, uint32_t Shift) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b00000, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void usra(SubRegSize size, T rd, T rn, uint32_t Shift) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b00010, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void urshr(SubRegSize size, T rd, T rn, uint32_t Shift) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b00100, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void ursra(SubRegSize size, T rd, T rn, uint32_t Shift) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b00110, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void sri(SubRegSize size, T rd, T rn, uint32_t Shift) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b01000, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void sli(SubRegSize size, T rd, T rn, uint32_t Shift) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = immh:immb - esize but immh is /also/ used for element size.\n    const uint32_t InvertedShift = SubregSizeInBits + Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b01010, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void sqshlu(SubRegSize size, T rd, T rn, uint32_t Shift) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = immh:immb - esize but immh is /also/ used for element size.\n    const uint32_t InvertedShift = SubregSizeInBits + Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b01100, rn, rd);\n  }\n  ///< size is destination size\n  template<IsQOrDRegister T>\n  void uqshl(SubRegSize size, T rd, T rn, uint32_t Shift) {\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = immh:immb - esize but immh is /also/ used for element size.\n    const uint32_t InvertedShift = SubregSizeInBits + Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b01110, rn, rd);\n  }\n  ///< size is destination size\n  void sqshrun(SubRegSize size, DRegister rd, DRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b10000, rn, rd);\n  }\n  ///< size is destination size\n  void sqshrun2(SubRegSize size, QRegister rd, QRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b10000, rn, rd);\n  }\n  ///< size is destination size\n  void sqrshrun(SubRegSize size, DRegister rd, DRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b10001, rn, rd);\n  }\n  ///< size is destination size\n  void sqrshrun2(SubRegSize size, QRegister rd, QRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b10001, rn, rd);\n  }\n  ///< size is destination size\n  void uqshrn(SubRegSize size, DRegister rd, DRegister rn, uint32_t Shift) {\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b10010, rn, rd);\n  }\n  ///< size is destination size\n  void uqshrn2(SubRegSize size, QRegister rd, QRegister rn, uint32_t Shift) {\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b10010, rn, rd);\n  }\n  ///< size is destination size\n  void uqrshrn(SubRegSize size, DRegister rd, DRegister rn, uint32_t Shift) {\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b10011, rn, rd);\n  }\n  ///< size is destination size\n  void uqrshrn2(SubRegSize size, QRegister rd, QRegister rn, uint32_t Shift) {\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b10011, rn, rd);\n  }\n  ///< size is destination size\n  void ushll(SubRegSize size, DRegister rd, DRegister rn, uint32_t Shift) {\n    size = SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = immh:immb - esize but immh is /also/ used for element size.\n    const uint32_t InvertedShift = SubregSizeInBits + Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b10100, rn, rd);\n  }\n  ///< size is destination size\n  void ushll2(SubRegSize size, QRegister rd, QRegister rn, uint32_t Shift) {\n    size = SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n\n    // Shift encoded a bit weirdly.\n    // shift = immh:immb - esize but immh is /also/ used for element size.\n    const uint32_t InvertedShift = SubregSizeInBits + Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n\n\n    ASIMDShiftByImm(1, immh, immb, 0b10100, rn, rd);\n  }\n  void uxtl(SubRegSize size, DRegister rd, DRegister rn) {\n    ushll(size, rd, rn, 0);\n  }\n  void uxtl2(SubRegSize size, QRegister rd, QRegister rn) {\n    ushll2(size, rd, rn, 0);\n  }\n  template<IsQOrDRegister T>\n  void ucvtf(SubRegSize size, T rd, T rn, uint32_t FractionalBits) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Invalid size\");\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n    LOGMAN_THROW_A_FMT(FractionalBits < SubregSizeInBits, \"FractionalBits must not be larger than incoming element size\");\n\n    // fbits encoded a bit weirdly.\n    // fbits = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedFractionalBits = (SubregSizeInBits * 2) - FractionalBits;\n    const uint32_t immh = InvertedFractionalBits >> 3;\n    const uint32_t immb = InvertedFractionalBits & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b11100, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void fcvtzu(SubRegSize size, T rd, T rn, uint32_t FractionalBits) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Invalid size\");\n    if constexpr (std::is_same_v<DRegister, T>) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Invalid element size with 64-bit {}\", __func__);\n    }\n\n    const size_t SubregSizeInBits = SubRegSizeInBits(size);\n    LOGMAN_THROW_A_FMT(FractionalBits < SubregSizeInBits, \"FractionalBits must not be larger than incoming element size\");\n\n    // fbits encoded a bit weirdly.\n    // fbits = (esize * 2) - immh:immb but immh is /also/ used for element size.\n    const uint32_t InvertedFractionalBits = (SubregSizeInBits * 2) - FractionalBits;\n    const uint32_t immh = InvertedFractionalBits >> 3;\n    const uint32_t immb = InvertedFractionalBits & 0b111;\n\n    ASIMDShiftByImm(1, immh, immb, 0b11111, rn, rd);\n  }\n\n  // Advanced SIMD vector x indexed element\n  ///< size is destination size\n  void smlal(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b0010, H, EncodedSubRegSize, rm.D(), rn.D(), rd.D());\n  }\n  ///< size is destination size\n  void smlal2(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b0010, H, EncodedSubRegSize, rm.Q(), rn.Q(), rd.Q());\n  }\n  ///< size is destination size\n  void sqdmlal(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b0011, H, EncodedSubRegSize, rm.D(), rn.D(), rd.D());\n  }\n  ///< size is destination size\n  void sqdmlal2(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b0011, H, EncodedSubRegSize, rm.Q(), rn.Q(), rd.Q());\n  }\n  ///< size is destination size\n  void smlsl(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b0110, H, EncodedSubRegSize, rm.D(), rn.D(), rd.D());\n  }\n  ///< size is destination size\n  void smlsl2(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b0110, H, EncodedSubRegSize, rm.Q(), rn.Q(), rd.Q());\n  }\n  ///< size is destination size\n  void sqdmlsl(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b0111, H, EncodedSubRegSize, rm.D(), rn.D(), rd.D());\n  }\n  ///< size is destination size\n  void sqdmlsl2(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b0111, H, EncodedSubRegSize, rm.Q(), rn.Q(), rd.Q());\n  }\n  template<IsQOrDRegister T>\n  void mul(ARMEmitter::SubRegSize size, T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i16Bit || size == ARMEmitter::SubRegSize::i32Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(size), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i16Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b1000, H, size, rm, rn, rd);\n  }\n  ///< size is destination size\n  void smull(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b1010, H, EncodedSubRegSize, rm.D(), rn.D(), rd.D());\n  }\n  ///< size is destination size\n  void smull2(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b1010, H, EncodedSubRegSize, rm.Q(), rn.Q(), rd.Q());\n  }\n  ///< size is destination size\n  void sqdmull(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b1011, H, EncodedSubRegSize, rm.D(), rn.D(), rd.D());\n  }\n  ///< size is destination size\n  void sqdmull2(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b1011, H, EncodedSubRegSize, rm.Q(), rn.Q(), rd.Q());\n  }\n  template<IsQOrDRegister T>\n  void sqdmulh(ARMEmitter::SubRegSize size, T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i16Bit || size == ARMEmitter::SubRegSize::i32Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(size), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i16Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b1100, H, size, rm, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void sqrdmulh(ARMEmitter::SubRegSize size, T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i16Bit || size == ARMEmitter::SubRegSize::i32Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(size), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i16Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b1101, H, size, rm, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void sdot(T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(Index < 4, \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    // Index encoded in H:L\n    // M overlaps rm register.\n    H = (Index >> 1) & 1;\n    L = (Index >> 0) & 1;\n    M = 0;\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b1110, H, ARMEmitter::SubRegSize::i32Bit, rm, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void sudot(T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(Index < 4, \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    // Index encoded in H:L\n    // M overlaps rm register.\n    H = (Index >> 1) & 1;\n    L = (Index >> 0) & 1;\n    M = 0;\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b1111, H, ARMEmitter::SubRegSize::i8Bit, rm, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void bfdot(T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(Index < 4, \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    // Index encoded in H:L\n    // M overlaps rm register.\n    H = (Index >> 1) & 1;\n    L = (Index >> 0) & 1;\n    M = 0;\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b1111, H, ARMEmitter::SubRegSize::i16Bit, rm, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void fmla(SubRegSize size, T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Invalid destination size\");\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(size), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    auto EncodedSubRegSize = size;\n\n    if (size == SubRegSize::i16Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n      // ARM in their infinite wisdom decided to encode 16-bit as an 8-bit operation even though 16-bit was unallocated.\n      EncodedSubRegSize = SubRegSize::i8Bit;\n    } else if (size == SubRegSize::i32Bit) {\n      // Index encoded in H:L\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    } else {\n      LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T>), \"Can't encode DRegister with i64Bit\");\n      // Index encoded in H\n      H = Index;\n      L = 0;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b0001, H, EncodedSubRegSize, rm, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void fmls(SubRegSize size, T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Invalid destination size\");\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(size), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    auto EncodedSubRegSize = size;\n\n    if (size == SubRegSize::i16Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n      // ARM in their infinite wisdom decided to encode 16-bit as an 8-bit operation even though 16-bit was unallocated.\n      EncodedSubRegSize = SubRegSize::i8Bit;\n    } else if (size == SubRegSize::i32Bit) {\n      // Index encoded in H:L\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    } else {\n      LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T>), \"Can't encode DRegister with i64Bit\");\n      // Index encoded in H\n      H = Index;\n      L = 0;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b0101, H, EncodedSubRegSize, rm, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void fmul(SubRegSize size, T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Invalid destination size\");\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(size), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    auto EncodedSubRegSize = size;\n\n    if (size == SubRegSize::i16Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n      // ARM in their infinite wisdom decided to encode 16-bit as an 8-bit operation even though 16-bit was unallocated.\n      EncodedSubRegSize = SubRegSize::i8Bit;\n    } else if (size == SubRegSize::i32Bit) {\n      // Index encoded in H:L\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    } else {\n      LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T>), \"Can't encode DRegister with i64Bit\");\n      // Index encoded in H\n      H = Index;\n      L = 0;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b1001, H, EncodedSubRegSize, rm, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void fmlal(T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(Index < 8, \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    // Index encoded in H:L\n    // M overlaps rm register.\n    H = (Index >> 2) & 1;\n    L = (Index >> 1) & 1;\n    M = (Index >> 0) & 1;\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b0000, H, ARMEmitter::SubRegSize::i32Bit, rm, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void fmlal2(T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(Index < 8, \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    // Index encoded in H:L\n    // M overlaps rm register.\n    H = (Index >> 2) & 1;\n    L = (Index >> 1) & 1;\n    M = (Index >> 0) & 1;\n    ASIMDVectorXIndexedElement(0b1, L, M, 0b1000, H, ARMEmitter::SubRegSize::i32Bit, rm, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void fmlsl(T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(Index < 8, \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    // Index encoded in H:L\n    // M overlaps rm register.\n    H = (Index >> 2) & 1;\n    L = (Index >> 1) & 1;\n    M = (Index >> 0) & 1;\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b0100, H, ARMEmitter::SubRegSize::i32Bit, rm, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void fmlsl2(T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(Index < 8, \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    // Index encoded in H:L\n    // M overlaps rm register.\n    H = (Index >> 2) & 1;\n    L = (Index >> 1) & 1;\n    M = (Index >> 0) & 1;\n    ASIMDVectorXIndexedElement(0b1, L, M, 0b1100, H, ARMEmitter::SubRegSize::i32Bit, rm, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void usdot(T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(Index < 4, \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    // Index encoded in H:L\n    // M overlaps rm register.\n    H = (Index >> 1) & 1;\n    L = (Index >> 0) & 1;\n    M = 0;\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b1111, H, ARMEmitter::SubRegSize::i32Bit, rm, rn, rd);\n  }\n\n  void bfmlalb(ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    LOGMAN_THROW_A_FMT(Index < 8, \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    // Index encoded in H:L\n    // M overlaps rm register.\n    H = (Index >> 2) & 1;\n    L = (Index >> 1) & 1;\n    M = (Index >> 0) & 1;\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b1111, H, ARMEmitter::SubRegSize::i64Bit, rm.D(), rn.D(), rd.D());\n  }\n  void bfmlalt(ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    LOGMAN_THROW_A_FMT(Index < 8, \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    // Index encoded in H:L\n    // M overlaps rm register.\n    H = (Index >> 2) & 1;\n    L = (Index >> 1) & 1;\n    M = (Index >> 0) & 1;\n    ASIMDVectorXIndexedElement(0b0, L, M, 0b1111, H, ARMEmitter::SubRegSize::i64Bit, rm.Q(), rn.Q(), rd.Q());\n  }\n\n  template<IsQOrDRegister T>\n  void mla(ARMEmitter::SubRegSize size, T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i16Bit || size == ARMEmitter::SubRegSize::i32Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(size), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i16Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b1, L, M, 0b0000, H, size, rm, rn, rd);\n  }\n\n  ///< size is destination size\n  void umlal(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b1, L, M, 0b0010, H, EncodedSubRegSize, rm.D(), rn.D(), rd.D());\n  }\n  ///< size is destination size\n  void umlal2(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b1, L, M, 0b0010, H, EncodedSubRegSize, rm.Q(), rn.Q(), rd.Q());\n  }\n\n  template<IsQOrDRegister T>\n  void mls(ARMEmitter::SubRegSize size, T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i16Bit || size == ARMEmitter::SubRegSize::i32Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(size), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i16Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b1, L, M, 0b0100, H, size, rm, rn, rd);\n  }\n\n  ///< size is destination size\n  void umlsl(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b1, L, M, 0b0110, H, EncodedSubRegSize, rm.D(), rn.D(), rd.D());\n  }\n  ///< size is destination size\n  void umlsl2(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b1, L, M, 0b0110, H, EncodedSubRegSize, rm.Q(), rn.Q(), rd.Q());\n  }\n\n  ///< size is destination size\n  void umull(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b1, L, M, 0b1010, H, EncodedSubRegSize, rm.D(), rn.D(), rd.D());\n  }\n  ///< size is destination size\n  void umull2(ARMEmitter::SubRegSize size, ARMEmitter::VRegister rd, ARMEmitter::VRegister rn, ARMEmitter::VRegister rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i32Bit || size == ARMEmitter::SubRegSize::i64Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    const auto EncodedSubRegSize = ARMEmitter::SubRegSize(FEXCore::ToUnderlying(size) - 1);\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(EncodedSubRegSize), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i32Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b1, L, M, 0b1010, H, EncodedSubRegSize, rm.Q(), rn.Q(), rd.Q());\n  }\n\n  template<IsQOrDRegister T>\n  void sqrdmlah(ARMEmitter::SubRegSize size, T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i16Bit || size == ARMEmitter::SubRegSize::i32Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(size), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i16Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b1, L, M, 0b1101, H, size, rm, rn, rd);\n  }\n  template<IsQOrDRegister T>\n  void udot(T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(Index < 4, \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    // Index encoded in H:L\n    // M overlaps rm register.\n    H = (Index >> 1) & 1;\n    L = (Index >> 0) & 1;\n    M = 0;\n    ASIMDVectorXIndexedElement(0b1, L, M, 0b1110, H, ARMEmitter::SubRegSize::i32Bit, rm, rn, rd);\n  }\n\n  template<IsQOrDRegister T>\n  void sqrdmlsh(ARMEmitter::SubRegSize size, T rd, T rn, T rm, uint32_t Index) {\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::SubRegSize::i16Bit || size == ARMEmitter::SubRegSize::i32Bit, \"Invalid destination size\");\n\n    if (size == ARMEmitter::SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(rm.Idx() < 16, \"Rm can't be v16-v31 with half source size\");\n    }\n    LOGMAN_THROW_A_FMT(Index < SubRegSizeInBits(size), \"Index must be less than the source register size\");\n\n    uint32_t H, L, M;\n    if (size == ARMEmitter::SubRegSize::i16Bit) {\n      // Index encoded in H:L:M\n      H = (Index >> 2) & 1;\n      L = (Index >> 1) & 1;\n      M = (Index >> 0) & 1;\n    } else {\n      // Index encoded in H:L\n      // M overlaps rm register.\n      H = (Index >> 1) & 1;\n      L = (Index >> 0) & 1;\n      M = 0;\n    }\n    ASIMDVectorXIndexedElement(0b1, L, M, 0b1111, H, size, rm, rn, rd);\n  }\n\n  // Cryptographic three-register, imm2\n  void sm3tt1a(VRegister rd, VRegister rn, VRegister rm, uint32_t index) {\n    Crypto3RegImm(index, 0b00, rm, rn, rd);\n  }\n  void sm3tt1b(VRegister rd, VRegister rn, VRegister rm, uint32_t index) {\n    Crypto3RegImm(index, 0b01, rm, rn, rd);\n  }\n  void sm3tt2a(VRegister rd, VRegister rn, VRegister rm, uint32_t index) {\n    Crypto3RegImm(index, 0b10, rm, rn, rd);\n  }\n  void sm3tt2b(VRegister rd, VRegister rn, VRegister rm, uint32_t index) {\n    Crypto3RegImm(index, 0b11, rm, rn, rd);\n  }\n\n  // Cryptographic three-register SHA 512\n  void sha512h(VRegister rd, VRegister rn, VRegister rm) {\n    Crypto3RegSHA512(0, 0b00, rm, rn, rd);\n  }\n  void sha512h2(VRegister rd, VRegister rn, VRegister rm) {\n    Crypto3RegSHA512(0, 0b01, rm, rn, rd);\n  }\n  void sha512su1(VRegister rd, VRegister rn, VRegister rm) {\n    Crypto3RegSHA512(0, 0b10, rm, rn, rd);\n  }\n  void rax1(VRegister rd, VRegister rn, VRegister rm) {\n    Crypto3RegSHA512(0, 0b11, rm, rn, rd);\n  }\n  void sm3partw1(VRegister rd, VRegister rn, VRegister rm) {\n    Crypto3RegSHA512(1, 0b00, rm, rn, rd);\n  }\n  void sm3partw2(VRegister rd, VRegister rn, VRegister rm) {\n    Crypto3RegSHA512(1, 0b01, rm, rn, rd);\n  }\n  void sm4ekey(VRegister rd, VRegister rn, VRegister rm) {\n    Crypto3RegSHA512(1, 0b10, rm, rn, rd);\n  }\n\n  // Cryptographic four-register\n  void eor3(VRegister rd, VRegister rn, VRegister rm, VRegister ra) {\n    Crypto4Register(0b00, rm, ra, rn, rd);\n  }\n  void bcax(VRegister rd, VRegister rn, VRegister rm, VRegister ra) {\n    Crypto4Register(0b01, rm, ra, rn, rd);\n  }\n  void sm3ss1(VRegister rd, VRegister rn, VRegister rm, VRegister ra) {\n    Crypto4Register(0b10, rm, ra, rn, rd);\n  }\n\n  // Cryptographic two-register SHA 512\n  void sha512su0(VRegister rd, VRegister rn) {\n    Crypto2RegSHA512(0b00, rn, rd);\n  }\n  void sm4e(VRegister rd, VRegister rn) {\n    Crypto2RegSHA512(0b01, rn, rd);\n  }\n\n  // Conversion between floating-point and fixed-point\n  void scvtf(ARMEmitter::ScalarRegSize ScalarSize, ARMEmitter::VRegister rd, ARMEmitter::Size GPRSize, ARMEmitter::Register rn,\n             uint32_t FractionalBits) {\n    LOGMAN_THROW_A_FMT(FractionalBits >= 1 && FractionalBits <= ARMEmitter::RegSizeInBits(GPRSize), \"Fractional bits out of range\");\n\n    uint32_t Scale = 64 - FractionalBits;\n    const auto ConvertedSize = ScalarSize == ARMEmitter::ScalarRegSize::i64Bit ? 0b01 :\n                               ScalarSize == ARMEmitter::ScalarRegSize::i32Bit ? 0b00 :\n                               ScalarSize == ARMEmitter::ScalarRegSize::i16Bit ? 0b11 :\n                                                                                 0;\n\n    ScalarConvertBetweenFPAndFixed(0, 0b00, 0b010, Scale, GPRSize, ConvertedSize, rn, rd);\n  }\n\n  void ucvtf(ARMEmitter::ScalarRegSize ScalarSize, ARMEmitter::VRegister rd, ARMEmitter::Size GPRSize, ARMEmitter::Register rn,\n             uint32_t FractionalBits) {\n    LOGMAN_THROW_A_FMT(FractionalBits >= 1 && FractionalBits <= ARMEmitter::RegSizeInBits(GPRSize), \"Fractional bits out of range\");\n\n    uint32_t Scale = 64 - FractionalBits;\n    const auto ConvertedSize = ScalarSize == ARMEmitter::ScalarRegSize::i64Bit ? 0b01 :\n                               ScalarSize == ARMEmitter::ScalarRegSize::i32Bit ? 0b00 :\n                               ScalarSize == ARMEmitter::ScalarRegSize::i16Bit ? 0b11 :\n                                                                                 0;\n\n    ScalarConvertBetweenFPAndFixed(0, 0b00, 0b011, Scale, GPRSize, ConvertedSize, rn, rd);\n  }\n\n  void fcvtzs(ARMEmitter::Size GPRSize, ARMEmitter::Register rd, ARMEmitter::ScalarRegSize ScalarSize, ARMEmitter::VRegister rn,\n              uint32_t FractionalBits) {\n    LOGMAN_THROW_A_FMT(FractionalBits >= 1 && FractionalBits <= ARMEmitter::RegSizeInBits(GPRSize), \"Fractional bits out of range\");\n\n    uint32_t Scale = 64 - FractionalBits;\n    const auto ConvertedSize = ScalarSize == ARMEmitter::ScalarRegSize::i64Bit ? 0b01 :\n                               ScalarSize == ARMEmitter::ScalarRegSize::i32Bit ? 0b00 :\n                               ScalarSize == ARMEmitter::ScalarRegSize::i16Bit ? 0b11 :\n                                                                                 0;\n\n    ScalarConvertBetweenFPAndFixed(0, 0b11, 0b000, Scale, GPRSize, ConvertedSize, rn, rd);\n  }\n\n  void fcvtzu(ARMEmitter::Size GPRSize, ARMEmitter::Register rd, ARMEmitter::ScalarRegSize ScalarSize, ARMEmitter::VRegister rn,\n              uint32_t FractionalBits) {\n    LOGMAN_THROW_A_FMT(FractionalBits >= 1 && FractionalBits <= ARMEmitter::RegSizeInBits(GPRSize), \"Fractional bits out of range\");\n\n    uint32_t Scale = 64 - FractionalBits;\n    const auto ConvertedSize = ScalarSize == ARMEmitter::ScalarRegSize::i64Bit ? 0b01 :\n                               ScalarSize == ARMEmitter::ScalarRegSize::i32Bit ? 0b00 :\n                               ScalarSize == ARMEmitter::ScalarRegSize::i16Bit ? 0b11 :\n                                                                                 0;\n\n    ScalarConvertBetweenFPAndFixed(0, 0b11, 0b001, Scale, GPRSize, ConvertedSize, rn, rd);\n  }\n\n  // Conversion between floating-point and integer\n  void fcvtns(ARMEmitter::Size size, Register rd, HRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b11, 0b00, 0b000, rd, ToReg(rn));\n  }\n  void fcvtns(ARMEmitter::Size size, Register rd, SRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b00, 0b00, 0b000, rd, ToReg(rn));\n  }\n  void fcvtns(ARMEmitter::Size size, Register rd, DRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b01, 0b00, 0b000, rd, ToReg(rn));\n  }\n  void fcvtnu(ARMEmitter::Size size, Register rd, HRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b11, 0b00, 0b001, rd, ToReg(rn));\n  }\n  void fcvtnu(ARMEmitter::Size size, Register rd, SRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b00, 0b00, 0b001, rd, ToReg(rn));\n  }\n  void fcvtnu(ARMEmitter::Size size, Register rd, DRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b01, 0b00, 0b001, rd, ToReg(rn));\n  }\n  void scvtf(ARMEmitter::Size size, HRegister rd, Register rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b11, 0b00, 0b010, ToReg(rd), rn);\n  }\n  void scvtf(ARMEmitter::Size size, SRegister rd, Register rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b00, 0b00, 0b010, ToReg(rd), rn);\n  }\n  void scvtf(ARMEmitter::Size size, DRegister rd, Register rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b01, 0b00, 0b010, ToReg(rd), rn);\n  }\n  void ucvtf(ARMEmitter::Size size, HRegister rd, Register rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b11, 0b00, 0b011, ToReg(rd), rn);\n  }\n  void ucvtf(ARMEmitter::Size size, SRegister rd, Register rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b00, 0b00, 0b011, ToReg(rd), rn);\n  }\n  void ucvtf(ARMEmitter::Size size, DRegister rd, Register rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b01, 0b00, 0b011, ToReg(rd), rn);\n  }\n  void fcvtas(ARMEmitter::Size size, Register rd, HRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b11, 0b00, 0b100, rd, ToReg(rn));\n  }\n  void fcvtas(ARMEmitter::Size size, Register rd, SRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b00, 0b00, 0b100, rd, ToReg(rn));\n  }\n  void fcvtas(ARMEmitter::Size size, Register rd, DRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b01, 0b00, 0b100, rd, ToReg(rn));\n  }\n  void fcvtau(ARMEmitter::Size size, Register rd, HRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b11, 0b00, 0b101, rd, ToReg(rn));\n  }\n  void fcvtau(ARMEmitter::Size size, Register rd, SRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b00, 0b00, 0b101, rd, ToReg(rn));\n  }\n  void fcvtau(ARMEmitter::Size size, Register rd, DRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b01, 0b00, 0b101, rd, ToReg(rn));\n  }\n  void fmov(ARMEmitter::Size size, Register rd, HRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b11, 0b00, 0b110, rd, ToReg(rn));\n  }\n  void fmov(ARMEmitter::Size size, Register rd, SRegister rn) {\n    LOGMAN_THROW_A_FMT(size != ARMEmitter::Size::i64Bit, \"Can't move SReg to 64-bit\");\n    ASIMDFloatConvBetweenInt(size, 0, 0b00, 0b00, 0b110, rd, ToReg(rn));\n  }\n  void fmov(ARMEmitter::Size size, Register rd, DRegister rn) {\n    LOGMAN_THROW_A_FMT(size != ARMEmitter::Size::i32Bit, \"Can't move DReg to 32-bit\");\n    ASIMDFloatConvBetweenInt(size, 0, 0b01, 0b00, 0b110, rd, ToReg(rn));\n  }\n  void fmov(ARMEmitter::Size size, Register rd, VRegister rn, bool Upper) {\n    if (Upper) {\n      LOGMAN_THROW_A_FMT(size == ARMEmitter::Size::i64Bit, \"Can only move upper with 64-bit elements\");\n    }\n    ASIMDFloatConvBetweenInt(size, 0, Upper ? 0b10 : 0b01, Upper ? 0b01 : 0b00, 0b110, rd, ToReg(rn));\n  }\n  void fmov(ARMEmitter::Size size, HRegister rd, Register rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b11, 0b00, 0b111, ToReg(rd), rn);\n  }\n  void fmov(ARMEmitter::Size size, SRegister rd, Register rn) {\n    LOGMAN_THROW_A_FMT(size != ARMEmitter::Size::i64Bit, \"Can't move SReg to 64-bit\");\n    ASIMDFloatConvBetweenInt(size, 0, 0b00, 0b00, 0b111, ToReg(rd), rn);\n  }\n  void fmov(ARMEmitter::Size size, DRegister rd, Register rn) {\n    LOGMAN_THROW_A_FMT(size != ARMEmitter::Size::i32Bit, \"Can't move DReg to 32-bit\");\n    ASIMDFloatConvBetweenInt(size, 0, 0b01, 0b00, 0b111, ToReg(rd), rn);\n  }\n  void fmov(ARMEmitter::Size size, VRegister rd, Register rn, bool Upper) {\n    if (Upper) {\n      LOGMAN_THROW_A_FMT(size == ARMEmitter::Size::i64Bit, \"Can only move upper with 64-bit elements\");\n    }\n    ASIMDFloatConvBetweenInt(size, 0, Upper ? 0b10 : 0b01, Upper ? 0b01 : 0b00, 0b111, ToReg(rd), rn);\n  }\n  void fcvtps(ARMEmitter::Size size, Register rd, HRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b11, 0b01, 0b000, rd, ToReg(rn));\n  }\n  void fcvtps(ARMEmitter::Size size, Register rd, SRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b00, 0b01, 0b000, rd, ToReg(rn));\n  }\n  void fcvtps(ARMEmitter::Size size, Register rd, DRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b01, 0b01, 0b000, rd, ToReg(rn));\n  }\n  void fcvtpu(ARMEmitter::Size size, Register rd, HRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b11, 0b01, 0b001, rd, ToReg(rn));\n  }\n  void fcvtpu(ARMEmitter::Size size, Register rd, SRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b00, 0b01, 0b001, rd, ToReg(rn));\n  }\n  void fcvtpu(ARMEmitter::Size size, Register rd, DRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b01, 0b01, 0b001, rd, ToReg(rn));\n  }\n  void fcvtms(ARMEmitter::Size size, Register rd, HRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b11, 0b10, 0b000, rd, ToReg(rn));\n  }\n  void fcvtms(ARMEmitter::Size size, Register rd, SRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b00, 0b10, 0b000, rd, ToReg(rn));\n  }\n  void fcvtms(ARMEmitter::Size size, Register rd, DRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b01, 0b10, 0b000, rd, ToReg(rn));\n  }\n  void fcvtmu(ARMEmitter::Size size, Register rd, HRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b11, 0b10, 0b001, rd, ToReg(rn));\n  }\n  void fcvtmu(ARMEmitter::Size size, Register rd, SRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b00, 0b10, 0b001, rd, ToReg(rn));\n  }\n  void fcvtmu(ARMEmitter::Size size, Register rd, DRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b01, 0b10, 0b001, rd, ToReg(rn));\n  }\n  void fcvtzs(ARMEmitter::Size size, Register rd, HRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b11, 0b11, 0b000, rd, ToReg(rn));\n  }\n  void fcvtzs(ARMEmitter::Size size, Register rd, SRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b00, 0b11, 0b000, rd, ToReg(rn));\n  }\n  void fcvtzs(ARMEmitter::Size size, Register rd, DRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b01, 0b11, 0b000, rd, ToReg(rn));\n  }\n  void fcvtzs(ARMEmitter::Size size, Register rd, VRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b01, 0b11, 0b000, rd, ToReg(rn));\n  }\n  void fcvtzu(ARMEmitter::Size size, Register rd, HRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b11, 0b11, 0b001, rd, ToReg(rn));\n  }\n  void fcvtzu(ARMEmitter::Size size, Register rd, SRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b00, 0b11, 0b001, rd, ToReg(rn));\n  }\n  void fcvtzu(ARMEmitter::Size size, Register rd, DRegister rn) {\n    ASIMDFloatConvBetweenInt(size, 0, 0b01, 0b11, 0b001, rd, ToReg(rn));\n  }\n\nprivate:\n  // Advanced SIMD three same (FP16)\n  template<IsQOrDRegister T>\n  void ASIMDThreeSameFP16(uint32_t U, uint32_t a, uint32_t opcode, T rm, T rn, T rd) {\n    constexpr uint32_t Q = std::is_same_v<ARMEmitter::QRegister, T> ? 1U << 30 : 0;\n    constexpr uint32_t Op = 0b0000'1110'0100'0000'0000'01 << 10;\n\n    uint32_t Instr = Op;\n    Instr |= Q;\n    Instr |= U << 29;\n    Instr |= a << 23;\n    Instr |= rm.Idx() << 16;\n    Instr |= opcode << 11;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  // Advanced SIMD two-register miscellaneous (FP16)\n  template<IsQOrDRegister T>\n  void ASIMDTwoRegMiscFP16(uint32_t U, uint32_t a, uint32_t opcode, T rn, T rd) {\n    constexpr uint32_t Q = std::is_same_v<ARMEmitter::QRegister, T> ? 1U << 30 : 0;\n    constexpr uint32_t Op = 0b0000'1110'0111'1000'0000'10 << 10;\n\n    uint32_t Instr = Op;\n    Instr |= Q;\n    Instr |= U << 29;\n    Instr |= a << 23;\n    Instr |= opcode << 12;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  // Advanced SIMD three-register extension\n  template<IsQOrDRegister T>\n  void ASIMDThreeRegisterExt(uint32_t U, uint32_t opcode, ARMEmitter::SubRegSize size, T rm, T rn, T rd) {\n    constexpr uint32_t Q = std::is_same_v<ARMEmitter::QRegister, T> ? 1U << 30 : 0;\n    constexpr uint32_t Op = 0b0000'1110'0000'0000'1000'01 << 10;\n\n    uint32_t Instr = Op;\n    Instr |= Q;\n    Instr |= U << 29;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= rm.Idx() << 16;\n    Instr |= opcode << 11;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  // Cryptographic AES\n  void CryptoAES(uint32_t opcode, VRegister rd, VRegister rn) {\n    uint32_t Instr = 0b0100'1110'0010'1000'0000'10U << 10;\n    Instr |= opcode << 12;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n  // Cryptographic three-register SHA\n  void Crypto3RegSHA(uint32_t opcode, VRegister rd, VRegister rn, VRegister rm) {\n    uint32_t Instr = 0b0101'1110'0000'0000'0000'00U << 10;\n    Instr |= Encode_rm(rm);\n    Instr |= opcode << 12;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n  // Cryptographic two-register SHA\n  void Crypto2RegSHA(uint32_t opcode, VRegister rd, VRegister rn) {\n    uint32_t Instr = 0b0101'1110'0010'1000'0000'10U << 10;\n    Instr |= opcode << 12;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n  // Advanced SIMD table lookup\n  void ASIMDTable(uint32_t Q, uint32_t op2, uint32_t len, uint32_t op, VRegister rd, VRegister rn, VRegister rm) {\n    uint32_t Instr = 0b0000'1110'000U << 21;\n    Instr |= Q << 30;\n    Instr |= op2 << 22;\n    Instr |= Encode_rm(rm);\n    Instr |= len << 13;\n    Instr |= op << 12;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n  // Advanced SIMD permute\n  void ASIMDPermute(uint32_t Q, SubRegSize size, uint32_t opcode, VRegister rd, VRegister rn, VRegister rm) {\n    uint32_t Instr = 0b0000'1110'0000'0000'0000'10U << 10;\n    Instr |= Q << 30;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= Encode_rm(rm);\n    Instr |= opcode << 12;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n  // Advanced SIMD extract\n  void ASIMDExtract(uint32_t Q, uint32_t op2, uint32_t imm4, VRegister rd, VRegister rn, VRegister rm) {\n    uint32_t Instr = 0b0010'1110'000U << 21;\n    Instr |= Q << 30;\n    Instr |= op2 << 22;\n    Instr |= Encode_rm(rm);\n    Instr |= imm4 << 11;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n  // Advanced SIMD two-register miscellaneous\n  template<IsQOrDRegister T>\n  void ASIMD2RegMisc(uint32_t U, SubRegSize size, uint32_t opcode, T rd, T rn) {\n    constexpr uint32_t Q = std::is_same_v<QRegister, T> ? 1U << 30 : 0;\n\n    uint32_t Instr = 0b0000'1110'0010'0000'0000'10U << 10;\n    Instr |= Q;\n    Instr |= U << 29;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opcode << 12;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n  // Advanced SIMD across lanes\n  template<IsQOrDRegister T>\n  void ASIMDAcrossLanes(uint32_t U, SubRegSize size, uint32_t opcode, T rd, T rn) {\n    constexpr uint32_t Q = std::is_same_v<QRegister, T> ? 1U << 30 : 0;\n\n    uint32_t Instr = 0b0000'1110'0011'0000'0000'10U << 10;\n    Instr |= Q;\n    Instr |= U << 29;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opcode << 12;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n  // Advanced SIMD three different\n  template<IsQOrDRegister T>\n  void ASIMD3Different(uint32_t U, uint32_t opcode, SubRegSize size, T rd, T rn, T rm) {\n    constexpr uint32_t Q = std::is_same_v<QRegister, T> ? 1U << 30 : 0;\n\n    uint32_t Instr = 0b0000'1110'0010'0000'0000'00U << 10;\n    Instr |= Q;\n    Instr |= U << 29;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= Encode_rm(rm);\n    Instr |= opcode << 12;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n  // Advanced SIMD three same\n  template<IsQOrDRegister T>\n  void ASIMD3Same(uint32_t U, SubRegSize size, uint32_t opcode, T rd, T rn, T rm) {\n    constexpr uint32_t Q = std::is_same_v<QRegister, T> ? 1U << 30 : 0;\n\n    uint32_t Instr = 0b0000'1110'0010'0000'0000'01U << 10;\n    Instr |= Q;\n    Instr |= U << 29;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= Encode_rm(rm);\n    Instr |= opcode << 11;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n  // Advanced SIMD modified immediate\n  template<IsQOrDRegister T>\n  void ASIMDModifiedImm(uint32_t op, uint32_t cmode, uint32_t o2, uint32_t imm, T rd) {\n    constexpr uint32_t Q = std::is_same_v<QRegister, T> ? 1U << 30 : 0;\n\n    uint32_t Instr = 0b0000'1111'0000'0000'0000'01U << 10;\n    Instr |= Q;\n    Instr |= op << 29;\n    Instr |= ((imm >> 7) & 1) << 18;\n    Instr |= ((imm >> 6) & 1) << 17;\n    Instr |= ((imm >> 5) & 1) << 16;\n    Instr |= cmode << 12;\n    Instr |= o2 << 11;\n    Instr |= ((imm >> 4) & 1) << 9;\n    Instr |= ((imm >> 3) & 1) << 8;\n    Instr |= ((imm >> 2) & 1) << 7;\n    Instr |= ((imm >> 1) & 1) << 6;\n    Instr |= ((imm >> 0) & 1) << 5;\n\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n  // Advanced SIMD shift by immediate\n  template<IsQOrDRegister T>\n  void ASIMDShiftByImm(uint32_t U, uint32_t immh, uint32_t immb, uint32_t opcode, T rn, T rd) {\n    constexpr uint32_t Q = std::is_same_v<QRegister, T> ? 1U << 30 : 0;\n    LOGMAN_THROW_A_FMT(immh != 0, \"ImmH needs to not be zero\");\n\n    uint32_t Instr = 0b0000'1111'0000'0000'0000'01U << 10;\n\n    Instr |= Q;\n    Instr |= U << 29;\n    Instr |= immh << 19;\n    Instr |= immb << 16;\n    Instr |= opcode << 11;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n  // Advanced SIMD vector x indexed element\n  template<IsQOrDRegister T>\n  void ASIMDVectorXIndexedElement(uint32_t U, uint32_t L, uint32_t M, uint32_t opcode, uint32_t H, ARMEmitter::SubRegSize size, T rm, T rn, T rd) {\n    constexpr uint32_t Op = 0b0000'1111'0000'0000'0000'00 << 10;\n    constexpr uint32_t Q = std::is_same_v<ARMEmitter::QRegister, T> ? 1U << 30 : 0;\n\n    uint32_t Instr = Op;\n\n    Instr |= Q;\n    Instr |= U << 29;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= L << 21;\n\n    // M and Rm might overlap. It's up to the instruction emitter itself to ensure there is no conflict.\n    Instr |= M << 20;\n    Instr |= rm.Idx() << 16;\n    Instr |= opcode << 12;\n    Instr |= H << 11;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  void Crypto3RegImm(uint32_t index, uint32_t opcode, VRegister rm, VRegister rn, VRegister rd) {\n    LOGMAN_THROW_A_FMT(index <= 3, \"index ({}) must be within [0-3]\", index);\n\n    uint32_t Instr = 0b1100'1110'0100'0000'1000'0000'0000'0000;\n    Instr |= rm.Idx() << 16;\n    Instr |= index << 12;\n    Instr |= opcode << 10;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  void Crypto3RegSHA512(uint32_t o, uint32_t opcode, VRegister rm, VRegister rn, VRegister rd) {\n    uint32_t Instr = 0b1100'1110'0110'0000'1000'0000'0000'0000;\n    Instr |= rm.Idx() << 16;\n    Instr |= o << 14;\n    Instr |= opcode << 10;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  void Crypto4Register(uint32_t opcode, VRegister rm, VRegister ra, VRegister rn, VRegister rd) {\n    uint32_t Instr = 0b1100'1110'0000'0000'0000'0000'0000'0000;\n    Instr |= opcode << 21;\n    Instr |= rm.Idx() << 16;\n    Instr |= ra.Idx() << 10;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  void Crypto2RegSHA512(uint32_t opcode, VRegister rn, VRegister rd) {\n    uint32_t Instr = 0b1100'1110'1100'0000'1000'0000'0000'0000;\n    Instr |= opcode << 10;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  // Conversion between floating-point and fixed-point\n  template<typename T, typename T2>\n  void ScalarConvertBetweenFPAndFixed(uint32_t S, uint32_t rmode, uint32_t opcode, uint32_t scale, ARMEmitter::Size GPRSize,\n                                      uint32_t ScalarSize, T rn, T2 rd) {\n    constexpr uint32_t Op = 0b0001'1110'000 << 21;\n    const uint32_t SF = GPRSize == ARMEmitter::Size::i64Bit ? (1U << 31) : 0;\n\n    uint32_t Instr = Op;\n    Instr |= SF;\n    Instr |= S << 29;\n    Instr |= ScalarSize << 22;\n    Instr |= rmode << 19;\n    Instr |= opcode << 16;\n    Instr |= scale << 10;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  // Conversion between floating-point and integer\n  void ASIMDFloatConvBetweenInt(ARMEmitter::Size s, uint32_t S, uint32_t ptype, uint32_t rmode, uint32_t opcode, Register rd, Register rn) {\n    const uint32_t SF = s == ARMEmitter::Size::i64Bit ? (1U << 31) : 0;\n\n    uint32_t Instr = 0b0001'1110'001U << 21;\n    Instr |= SF;\n    Instr |= S << 29;\n    Instr |= ptype << 22;\n    Instr |= rmode << 19;\n    Instr |= opcode << 16;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n  template<ARMEmitter::SubRegSize size, bool Load, IsQOrDRegister T>\n  void ASIMDLoadStoreMultipleStructure(uint32_t Op, uint32_t opcode, T rt, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Q = std::is_same_v<ARMEmitter::QRegister, T> ? 1U << 30 : 0;\n\n    uint32_t Instr = Op;\n\n    Instr |= Q;\n    Instr |= Load ? 1 << 22 : 0;\n    Instr |= Encode_rm(rm);\n    Instr |= opcode;\n    Instr |= FEXCore::ToUnderlying(size) << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rt(rt);\n    dc32(Instr);\n  }\n  template<ARMEmitter::SubRegSize size, bool Load, uint32_t Count>\n  void ASIMDSTLD(uint32_t Op, uint32_t Opcode, ARMEmitter::VRegister rt, uint32_t Index, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    LOGMAN_THROW_A_FMT((size == SubRegSize::i8Bit && Index < 16) || (size == SubRegSize::i16Bit && Index < 8) ||\n                         (size == SubRegSize::i32Bit && Index < 4) || (size == SubRegSize::i64Bit && Index < 2),\n                       \"Invalid Index selected\");\n\n    uint32_t Q {};\n    uint32_t S {};\n    uint32_t Size {};\n\n    // selem is for determining if we are doing 1-3 loadstore single structure operations\n    // eg: ST1/2/3/4 or LD1/2/3/4\n    constexpr uint32_t selem = Count - 1;\n    const uint32_t opcode = Opcode | (selem >> 1);\n\n    // Index is encoded as:\n    // 8-bit:  Q:S:size\n    // 16-bit  Q:S:size<1>\n    // 32-bit: Q:S\n    // 64-bit: Q\n    if constexpr (size == SubRegSize::i8Bit) {\n      Q = ((Index & 0b1000) >> 3) << 30;\n      S = ((Index & 0b0100) >> 2);\n      Size = Index & 0b11;\n    } else if constexpr (size == SubRegSize::i16Bit) {\n      Q = ((Index & 0b0100) >> 2) << 30;\n      S = ((Index & 0b0010) >> 1);\n      Size = (Index & 0b1) << 1;\n    } else if constexpr (size == SubRegSize::i32Bit) {\n      Q = ((Index & 0b0010) >> 1) << 30;\n      S = Index & 0b0001;\n    } else if constexpr (size == SubRegSize::i64Bit) {\n      Q = (Index & 0b0001) << 30;\n      Size = 1;\n    }\n\n    // scale = opcode<2:1>\n    // selem = opcode<0>:R + 1\n    //\n    // scale:\n    // - 0\n    //   - Index = Q:S:size - aka B[0-15]\n    // - 1\n    //   - Index = Q:S:size<1> - aka H[0-7]\n    // - 2\n    //   if (size == i32)\n    //     - Index = Q:S - aka S[0-3]\n    //   if (size == i64)\n    //     - Index = Q - aka D[0-1]\n    //   if (size == i128) undefined\n    // - 3\n    //   Load+Replicate\n    //   scale = size\n\n    ASIMDLoadStore(Op | Q, Load, selem & 1, opcode, S, Size, rt, rn, rm);\n  }\n\n  template<ARMEmitter::SubRegSize size, bool Load, uint32_t Count, typename T>\n  void ASIMDSTLD(uint32_t Op, uint32_t Opcode, T rt, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    constexpr uint32_t Q = std::is_same_v<ARMEmitter::QRegister, T> ? 1U << 30 : 0;\n    constexpr uint32_t S = 0;\n\n    // selem is for determining if we are doing 1-3 loadstore single structure operations\n    // eg: ST1/2/3/4 or LD1/2/3/4\n    constexpr uint32_t selem = Count - 1;\n    const uint32_t opcode = Opcode | (selem >> 1);\n\n    // scale = opcode<2:1>\n    // selem = opcode<0>:R + 1\n    //\n    // scale:\n    // - 0\n    //   - Index = Q:S:size - aka B[0-15]\n    // - 1\n    //   - Index = Q:S:size<1> - aka H[0-7]\n    // - 2\n    //   if (size == i32)\n    //     - Index = Q:S - aka S[0-3]\n    //   if (size == i64)\n    //     - Index = Q - aka D[0-1]\n    //   if (size == i128) undefined\n    // - 3\n    //   Load+Replicate\n    //   scale = size\n\n    ASIMDLoadStore(Op | Q, Load, selem & 1, opcode, S, FEXCore::ToUnderlying(size), rt, rn, rm);\n  }\n  void ASIMDLoadStore(uint32_t Op, uint32_t L, uint32_t R, uint32_t opcode, uint32_t S, uint32_t size, ARMEmitter::VRegister rt,\n                      ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    uint32_t Instr = Op;\n\n    Instr |= L << 22;\n    Instr |= R << 21;\n    Instr |= Encode_rm(rm);\n    Instr |= opcode << 13;\n    Instr |= S << 12;\n    Instr |= size << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rt(rt);\n\n    dc32(Instr);\n  }\n\n#ifndef INCLUDED_BY_EMITTER\n}; // struct LoadstoreEmitterOps\n} // namespace ARMEmitter\n#endif\n"
  },
  {
    "path": "CodeEmitter/CodeEmitter/BranchOps.inl",
    "content": "// SPDX-License-Identifier: MIT\n/* Branch instruction emitters.\n *\n * Most of these instructions will use `BackwardLabel`, `ForwardLabel`, or `BiDirectionLabel` to determine where a branch targets.\n */\n\n#pragma once\n#ifndef INCLUDED_BY_EMITTER\n#include <CodeEmitter/Emitter.h>\nnamespace ARMEmitter {\nstruct EmitterOps : Emitter {\n#endif\n\npublic:\n  // Branches, Exception Generating and System instructions\npublic:\n  // Conditional branch immediate\n  ///< Branch conditional\n  void b(ARMEmitter::Condition Cond, uint32_t Imm) {\n    constexpr uint32_t Op = 0b0101'010 << 25;\n    Branch_Conditional(Op, 0, 0, Cond, Imm);\n  }\n  [[nodiscard]] BranchEncodeSucceeded b(ARMEmitter::Condition Cond, const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n    if (Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0)) {\n      constexpr uint32_t Op = 0b0101'010 << 25;\n      Branch_Conditional(Op, 0, 0, Cond, Imm >> 2);\n      return BranchEncodeSucceeded::Success;\n    }\n\n    // Can't encode.\n    return BranchEncodeSucceeded::Failure;\n  }\n  [[nodiscard]] BranchEncodeSucceeded b(ARMEmitter::Condition Cond, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::BC});\n    constexpr uint32_t Op = 0b0101'010 << 25;\n    Branch_Conditional(Op, 0, 0, Cond, 0);\n\n    // Forward label doesn't know if it can encode until Bind.\n    return BranchEncodeSucceeded::Success;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded b(ARMEmitter::Condition Cond, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      return b(Cond, &Label->Backward);\n    } else {\n      return b(Cond, &Label->Forward);\n    }\n  }\n\n  ///< Branch consistent conditional\n  void bc(ARMEmitter::Condition Cond, uint32_t Imm) {\n    constexpr uint32_t Op = 0b0101'010 << 25;\n    Branch_Conditional(Op, 0, 1, Cond, Imm);\n  }\n  [[nodiscard]] BranchEncodeSucceeded bc(ARMEmitter::Condition Cond, const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n    if (Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0)) {\n      constexpr uint32_t Op = 0b0101'010 << 25;\n      Branch_Conditional(Op, 0, 1, Cond, Imm >> 2);\n      return BranchEncodeSucceeded::Success;\n    }\n\n    // Can't encode.\n    return BranchEncodeSucceeded::Failure;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded bc(ARMEmitter::Condition Cond, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::BC});\n    constexpr uint32_t Op = 0b0101'010 << 25;\n    Branch_Conditional(Op, 0, 1, Cond, 0);\n\n    // Forward label doesn't know if it can encode until Bind.\n    return BranchEncodeSucceeded::Success;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded bc(ARMEmitter::Condition Cond, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      return bc(Cond, &Label->Backward);\n    } else {\n      return bc(Cond, &Label->Forward);\n    }\n  }\n\n  // Unconditional branch register\n  void br(ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b1101011 << 25 | 0b0'000 << 21 | // opc\n                            0b1'1111 << 16 |                  // op2\n                            0b0000'00 << 10 |                 // op3\n                            0b0'0000;                         // op4\n\n    UnconditionalBranch(Op, rn);\n  }\n  void blr(ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b1101011 << 25 | 0b0'001 << 21 | // opc\n                            0b1'1111 << 16 |                  // op2\n                            0b0000'00 << 10 |                 // op3\n                            0b0'0000;                         // op4\n\n    UnconditionalBranch(Op, rn);\n  }\n  void ret(ARMEmitter::Register rn = ARMEmitter::Reg::r30) {\n    constexpr uint32_t Op = 0b1101011 << 25 | 0b0'010 << 21 | // opc\n                            0b1'1111 << 16 |                  // op2\n                            0b0000'00 << 10 |                 // op3\n                            0b0'0000;                         // op4\n\n    UnconditionalBranch(Op, rn);\n  }\n\n  // Unconditional branch immediate\n  void b(uint32_t Imm) {\n    constexpr uint32_t Op = 0b0001'01 << 26;\n\n    UnconditionalBranch(Op, Imm);\n  }\n  [[nodiscard]] BranchEncodeSucceeded b(const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n    if (Imm >= -134217728 && Imm <= 134217724 && ((Imm & 0b11) == 0)) {\n      constexpr uint32_t Op = 0b0001'01 << 26;\n      UnconditionalBranch(Op, Imm >> 2);\n      return BranchEncodeSucceeded::Success;\n    }\n\n    // Can't encode.\n    return BranchEncodeSucceeded::Failure;\n  }\n  [[nodiscard]] BranchEncodeSucceeded b(ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::B});\n    constexpr uint32_t Op = 0b0001'01 << 26;\n\n    UnconditionalBranch(Op, 0);\n\n    // Forward label doesn't know if it can encode until Bind.\n    return BranchEncodeSucceeded::Success;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded b(BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      return b(&Label->Backward);\n    } else {\n      return b(&Label->Forward);\n    }\n  }\n\n  void bl(uint32_t Imm) {\n    constexpr uint32_t Op = 0b1001'01 << 26;\n\n    UnconditionalBranch(Op, Imm);\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded bl(const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n    if (Imm >= -134217728 && Imm <= 134217724 && ((Imm & 0b11) == 0)) {\n      constexpr uint32_t Op = 0b1001'01 << 26;\n      UnconditionalBranch(Op, Imm >> 2);\n\n      return BranchEncodeSucceeded::Success;\n    }\n\n    // Can't encode.\n    return BranchEncodeSucceeded::Failure;\n  }\n  [[nodiscard]] BranchEncodeSucceeded bl(ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::B});\n    constexpr uint32_t Op = 0b1001'01 << 26;\n\n    UnconditionalBranch(Op, 0);\n\n    // Forward label doesn't know if it can encode until Bind.\n    return BranchEncodeSucceeded::Success;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded bl(BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      return bl(&Label->Backward);\n    } else {\n      return bl(&Label->Forward);\n    }\n  }\n\n  // Compare and branch\n  void cbz(ARMEmitter::Size s, ARMEmitter::Register rt, uint32_t Imm) {\n    constexpr uint32_t Op = 0b0011'0100 << 24;\n\n    CompareAndBranch(Op, s, rt, Imm);\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded cbz(ARMEmitter::Size s, ARMEmitter::Register rt, const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n\n    if (Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0)) {\n      constexpr uint32_t Op = 0b0011'0100 << 24;\n      CompareAndBranch(Op, s, rt, Imm >> 2);\n      return BranchEncodeSucceeded::Success;\n    }\n\n    // Can't encode.\n    return BranchEncodeSucceeded::Failure;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded cbz(ARMEmitter::Size s, ARMEmitter::Register rt, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::BC});\n\n    constexpr uint32_t Op = 0b0011'0100 << 24;\n\n    CompareAndBranch(Op, s, rt, 0);\n\n    // Forward label doesn't know if it can encode until Bind.\n    return BranchEncodeSucceeded::Success;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded cbz(ARMEmitter::Size s, ARMEmitter::Register rt, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      return cbz(s, rt, &Label->Backward);\n    } else {\n      return cbz(s, rt, &Label->Forward);\n    }\n  }\n\n  void cbnz(ARMEmitter::Size s, ARMEmitter::Register rt, uint32_t Imm) {\n    constexpr uint32_t Op = 0b0011'0101 << 24;\n\n    CompareAndBranch(Op, s, rt, Imm);\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded cbnz(ARMEmitter::Size s, ARMEmitter::Register rt, const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n\n    if (Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0)) {\n      constexpr uint32_t Op = 0b0011'0101 << 24;\n      CompareAndBranch(Op, s, rt, Imm >> 2);\n      return BranchEncodeSucceeded::Success;\n    }\n\n    // Can't encode.\n    return BranchEncodeSucceeded::Failure;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded cbnz(ARMEmitter::Size s, ARMEmitter::Register rt, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::BC});\n\n    constexpr uint32_t Op = 0b0011'0101 << 24;\n\n    CompareAndBranch(Op, s, rt, 0);\n\n    // Forward label doesn't know if it can encode until Bind.\n    return BranchEncodeSucceeded::Success;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded cbnz(ARMEmitter::Size s, ARMEmitter::Register rt, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      return cbnz(s, rt, &Label->Backward);\n    } else {\n      return cbnz(s, rt, &Label->Forward);\n    }\n  }\n\n  // Test and branch immediate\n  void tbz(ARMEmitter::Register rt, uint32_t Bit, uint32_t Imm) {\n    constexpr uint32_t Op = 0b0011'0110 << 24;\n\n    TestAndBranch(Op, rt, Bit, Imm);\n  }\n  [[nodiscard]] BranchEncodeSucceeded tbz(ARMEmitter::Register rt, uint32_t Bit, const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n\n    if (Imm >= -32768 && Imm <= 32764 && ((Imm & 0b11) == 0)) {\n      constexpr uint32_t Op = 0b0011'0110 << 24;\n      TestAndBranch(Op, rt, Bit, Imm >> 2);\n      return BranchEncodeSucceeded::Success;\n    }\n\n    // Can't encode.\n    return BranchEncodeSucceeded::Failure;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded tbz(ARMEmitter::Register rt, uint32_t Bit, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::TEST_BRANCH});\n\n    constexpr uint32_t Op = 0b0011'0110 << 24;\n\n    TestAndBranch(Op, rt, Bit, 0);\n\n    // Forward label doesn't know if it can encode until Bind.\n    return BranchEncodeSucceeded::Success;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded tbz(ARMEmitter::Register rt, uint32_t Bit, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      return tbz(rt, Bit, &Label->Backward);\n    } else {\n      return tbz(rt, Bit, &Label->Forward);\n    }\n  }\n\n  void tbnz(ARMEmitter::Register rt, uint32_t Bit, uint32_t Imm) {\n    constexpr uint32_t Op = 0b0011'0111 << 24;\n\n    TestAndBranch(Op, rt, Bit, Imm);\n  }\n  [[nodiscard]] BranchEncodeSucceeded tbnz(ARMEmitter::Register rt, uint32_t Bit, const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n\n    if (Imm >= -32768 && Imm <= 32764 && ((Imm & 0b11) == 0)) {\n      constexpr uint32_t Op = 0b0011'0111 << 24;\n      TestAndBranch(Op, rt, Bit, Imm >> 2);\n      return BranchEncodeSucceeded::Success;\n    }\n\n    // Can't encode.\n    return BranchEncodeSucceeded::Failure;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded tbnz(ARMEmitter::Register rt, uint32_t Bit, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::TEST_BRANCH});\n    constexpr uint32_t Op = 0b0011'0111 << 24;\n\n    TestAndBranch(Op, rt, Bit, 0);\n\n    // Forward label doesn't know if it can encode until Bind.\n    return BranchEncodeSucceeded::Success;\n  }\n\n  [[nodiscard]] BranchEncodeSucceeded tbnz(ARMEmitter::Register rt, uint32_t Bit, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      return tbnz(rt, Bit, &Label->Backward);\n    } else {\n      return tbnz(rt, Bit, &Label->Forward);\n    }\n  }\n\nprivate:\n  // Conditional branch immediate\n  void Branch_Conditional(uint32_t Op, uint32_t Op1, uint32_t Op0, ARMEmitter::Condition Cond, uint32_t Imm) {\n    uint32_t Instr = Op;\n\n    Instr |= Op1 << 24;\n    Instr |= (Imm & 0x7'FFFF) << 5;\n    Instr |= Op0 << 4;\n    Instr |= FEXCore::ToUnderlying(Cond);\n\n    dc32(Instr);\n  }\n\n  // Unconditional branch register\n  void UnconditionalBranch(uint32_t Op, ARMEmitter::Register rn) {\n    uint32_t Instr = Op;\n    Instr |= Encode_rn(rn);\n    dc32(Instr);\n  }\n\n  // Unconditional branch - immediate\n  void UnconditionalBranch(uint32_t Op, uint32_t Imm) {\n    uint32_t Instr = Op;\n    Instr |= Imm & 0x3FF'FFFF;\n    dc32(Instr);\n  }\n\n  // Compare and branch\n  void CompareAndBranch(uint32_t Op, ARMEmitter::Size s, ARMEmitter::Register rt, uint32_t Imm) {\n    const uint32_t SF = s == ARMEmitter::Size::i64Bit ? (1U << 31) : 0;\n\n    uint32_t Instr = Op;\n\n    Instr |= SF;\n    Instr |= (Imm & 0x7'FFFF) << 5;\n    Instr |= Encode_rt(rt);\n    dc32(Instr);\n  }\n\n  // Test and branch - immediate\n  void TestAndBranch(uint32_t Op, ARMEmitter::Register rt, uint32_t Bit, uint32_t Imm) {\n    uint32_t Instr = Op;\n\n    Instr |= (Bit >> 5) << 31;\n    Instr |= (Bit & 0b1'1111) << 19;\n    Instr |= (Imm & 0x3FFF) << 5;\n    Instr |= Encode_rt(rt);\n    dc32(Instr);\n  }\n\n#ifndef INCLUDED_BY_EMITTER\n}; // struct LoadstoreEmitterOps\n} // namespace ARMEmitter\n#endif\n"
  },
  {
    "path": "CodeEmitter/CodeEmitter/Buffer.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <cstddef>\n#include <cstdint>\n#include <cstring>\n#include <type_traits>\n\nnamespace ARMEmitter {\nclass Buffer {\npublic:\n  Buffer() {\n    SetBuffer(nullptr, 0);\n  }\n\n  Buffer(uint8_t* Base, uint64_t BaseSize) {\n    SetBuffer(Base, BaseSize);\n  }\n\n  void SetBuffer(uint8_t* Base, uint64_t BaseSize) {\n    BufferBase = Base;\n    CurrentOffset = BufferBase;\n    Size = BaseSize;\n  }\n\n  template<typename T>\n  requires (std::is_trivially_copyable_v<T>)\n  void dcn(const T& Data) {\n    std::memcpy(CurrentOffset, &Data, sizeof(Data));\n    CurrentOffset += sizeof(Data);\n  }\n  void dc8(uint8_t Data) {\n    dcn(Data);\n  }\n  void dc16(uint16_t Data) {\n    dcn(Data);\n  }\n  void dc32(uint32_t Data) {\n    dcn(Data);\n  }\n  void dc64(uint64_t Data) {\n    dcn(Data);\n  }\n\n  void EmitString(const char* String) {\n    const auto StringLength = strlen(String);\n    memcpy(CurrentOffset, String, StringLength);\n    CurrentOffset += StringLength;\n  }\n\n  void Align(size_t Size = 4) {\n    // Align the buffer to provided size.\n    auto CurrentAlignment = reinterpret_cast<uint64_t>(CurrentOffset) & (Size - 1);\n    if (!CurrentAlignment) {\n      return;\n    }\n    std::memset(CurrentOffset, 0, Size - CurrentAlignment);\n    CurrentOffset += Size - CurrentAlignment;\n  }\n\n  template<typename T>\n  T GetCursorAddress() const {\n    return reinterpret_cast<T>(CurrentOffset);\n  }\n\n  static void ClearICache(void* Begin, std::size_t Length) {\n    __builtin___clear_cache(static_cast<char*>(Begin), static_cast<char*>(Begin) + Length);\n  }\n\n  size_t GetCursorOffset() const {\n    return static_cast<size_t>(CurrentOffset - BufferBase);\n  }\n\n  uint8_t* GetBufferBase() const {\n    return BufferBase;\n  }\n\n  void CursorIncrement(size_t Size) {\n    CurrentOffset += Size;\n  }\n\n  void SetCursorOffset(size_t Offset) {\n    CurrentOffset = BufferBase + Offset;\n  }\n\n  uint64_t GetBufferSize() const {\n    return Size;\n  }\n\n  template<typename T>\n  size_t GetCursorOffsetFromAddress(const T* Address) const {\n    return static_cast<size_t>(reinterpret_cast<const uint8_t*>(Address) - BufferBase);\n  }\n\nprotected:\n\n  uint8_t* BufferBase;\n  uint8_t* CurrentOffset;\n  uint64_t Size;\n};\n} // namespace ARMEmitter\n"
  },
  {
    "path": "CodeEmitter/CodeEmitter/Emitter.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/EnumUtils.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <FEXHeaderUtils/BitUtils.h>\n#include <CodeEmitter/Buffer.h>\n#include <CodeEmitter/Registers.h>\n\n#include <array>\n#include <bit>\n#include <cstdint>\n#include <utility>\n#include <type_traits>\n\n/*\n * Welcome to FEX-Emu's custom AArch64 emitter.\n * This was written specifically to avoid the performance cost of the vixl emitter.\n *\n * There are some specific design constraints in this design to target a couple features:\n *   - High performance\n *   - Low CPU cache performance hit\n *   - Significantly reduced code footprint\n *   - Low number of branches\n *\n * These requirements are mostly achieved by removing a bunch of developer conveniences\n * that vixl provides. The developer needs to take a lot of care to not shoot themselves in the foot.\n *\n * Misc design decisions:\n * - Registers are encoded as basic uint32_t enums.\n *   - Converting between different registers is zero-cost.\n *   - Passing around as arguments are as cheap as registers\n *     - Contrast to vixl where every register requires living on the stack.\n *   - Registers can get encoded in to instructions with a simple `BFM` instruction.\n *\n * - Instructions are very simply emitted, allowing direct inlining most of the time.\n *   - These are simple enough that multiple back-to-back instructions get optimized to 128-bit load-store operations.\n *     - Contrast to vixl where pretty much no instruction emitter gets inlined.\n *\n * - Instruction emitters are /mostly/ unsized. Most instructions take a size argument first, which gets encoded\n *   directly in to the instruction.\n *   - Contrast to vixl where the register arguments are how the instructions determine operating size.\n *   - Size argument allows FEX to use `CSEL` to select a size at runtime, instead of branching.\n *   - Some instructions are explicitly sized based on register type. Read comments in the respective `inl` files to\n *     see why.\n *     Some scalar/vector operations are an example of this.\n *\n * - Almost zero helper functions.\n *   - Primary exception to this rule is load-store operations. These will use a helper to make\n *     it easier to select the correct load-store instruction. Mostly because these are a nightmare selecting\n *     the right instruction.\n */\nnamespace ARMEmitter {\n/*\n * This `Size` enum is used for most ALU operations.\n * These follow the AArch64 encoding style in most cases.\n */\nenum class Size : uint32_t {\n  i32Bit = 0,\n  i64Bit,\n};\n\n// This allows us to get the `Size` enum in bits.\n[[nodiscard]]\nconstexpr size_t RegSizeInBits(Size size) {\n  return size_t {32} << FEXCore::ToUnderlying(size);\n}\n\n/* This `SubRegSize` enum is used for most ASIMD operations.\n * These follow the AArch64 encoding style in most cases.\n */\nenum class SubRegSize : uint32_t {\n  i8Bit = 0b00,\n  i16Bit = 0b01,\n  i32Bit = 0b10,\n  i64Bit = 0b11,\n  i128Bit = 0b100,\n};\n\n// This allows us to get the `SubRegSize` in bits.\n[[nodiscard]]\nconstexpr size_t SubRegSizeInBits(SubRegSize size) {\n  return size_t {8} << FEXCore::ToUnderlying(size);\n}\n\n// Many floating point operations constrain their element sizes to the\n// main three float sizes half, single, and double precision. This just\n// combines all the checks together for brevity.\n[[nodiscard]]\nconstexpr bool IsStandardFloatSize(SubRegSize size) {\n  return size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit;\n}\n\n/* This `ScalarRegSize` enum is used for most scalar float\n * operations.\n *\n * This is specifically duplicated from `SubRegSize` to have strongly\n * typed functions.\n *\n * `ScalarRegSize` specifically doesn't have `i128Bit` because scalar operations\n * can't operate at 128-bit.\n */\nenum class ScalarRegSize : uint32_t {\n  i8Bit = 0b00,\n  i16Bit = 0b01,\n  i32Bit = 0b10,\n  i64Bit = 0b11,\n};\n\n// This allows us to get the `ScalarRegSize` in bits.\n[[nodiscard]]\nconstexpr size_t ScalarRegSizeInBits(ScalarRegSize size) {\n  return size_t {8} << FEXCore::ToUnderlying(size);\n}\n\n/* This `VectorRegSizePair` union allows us to have an overlapping type\n * to select a scalar operation or a vector depending on which operation\n * we pass in.\n * Useful in FEX's vector operations that behave as scalar or vector\n * depending on various factors. But since the operation will have the sa,e\n * element size, we want to choose the operation more easily\n */\nunion VectorRegSizePair {\n  ScalarRegSize Scalar;\n  SubRegSize Vector;\n};\n\n// This allows us to create a `VectorRegSizePair` union.\n[[nodiscard]]\nconstexpr VectorRegSizePair ToVectorSizePair(SubRegSize size) {\n  return VectorRegSizePair {.Vector = size};\n}\n[[nodiscard]]\nconstexpr VectorRegSizePair ToVectorSizePair(ScalarRegSize size) {\n  return VectorRegSizePair {.Scalar = size};\n}\n\n// This `ShiftType` enum is used for ALU shift-register encoded instructions.\nenum class ShiftType : uint32_t {\n  LSL = 0,\n  LSR,\n  ASR,\n  ROR,\n};\n\n// This `ExtendedType` enum is used for ALU extended-register encoded instructions.\nenum class ExtendedType : uint32_t {\n  UXTB = 0b000,\n  UXTH = 0b001,\n  UXTW = 0b010,\n  UXTX = 0b011,\n  SXTB = 0b100,\n  SXTH = 0b101,\n  SXTW = 0b110,\n  SXTX = 0b111,\n  LSL_32 = UXTW,\n  LSL_64 = UXTX,\n};\n\n// This `Condition` enum is used for various conditional instructions.\nenum class Condition : uint32_t {\n  // Meaning:   Int                    - Float\n  CC_EQ = 0, // Equal                  - Equal\n  CC_NE,     // Not Eq                 - Not Eq or unordered\n  CC_CS,     // Carry set              - Greater than, equal, or unordered\n  CC_CC,     // Carry clear            - Less than\n  CC_MI,     // Minus/Negative         - Less than\n  CC_PL,     // Plus, positive or zero - GT, equal, or unordered\n  CC_VS,     // Overflow               - Unordered\n  CC_VC,     // No Overflow            - Ordered\n  CC_HI,     // Unsigned higher        - GT, or unordered\n  CC_LS,     // Unsigned lower or same - LT or EQ\n  CC_GE,     // Signed GT or EQ        - GT or EQ\n  CC_LT,     // Signed LT              - LT or Unordered\n  CC_GT,     // Signed GT              - GT\n  CC_LE,     // Signed LT or EQ        - LT, EQ, or Unordered\n  CC_AL,     // Always                 - Always\n  CC_NV,     // Always                 - Always\n\n  // Aliases\n  CC_HS = CC_CS,\n  CC_LO = CC_CC,\n};\n\n/*\n * This `StatusFlags` enum is used for conditional compare encoded instructions.\n * These directly encode to the `nzcv` flags.\n */\nenum class StatusFlags : uint32_t {\n  None = 0,\n  Flag_V = 0b0001,\n  Flag_C = 0b0010,\n  Flag_Z = 0b0100,\n  Flag_N = 0b1000,\n\n  Flag_NZCV = Flag_N | Flag_Z | Flag_C | Flag_V,\n};\n\n\n/*\n * This `IndexType` enum is used for load-store instructions.\n * Not all load-store instructions use this, so the user needs to be careful.\n */\nenum class IndexType {\n  POST,\n  OFFSET,\n  PRE,\n\n  UNPRIVILEGED,\n};\n\n// Used with adr and scalar + vector load/store variants to denote\n// a modifier operation.\nenum class SVEModType : uint8_t {\n  MOD_UXTW,\n  MOD_SXTW,\n  MOD_LSL,\n  MOD_NONE,\n};\n\n/* This `SVEMemOperand` class is used for the helper SVE load-store instructions.\n * Load-store instructions are quite expressive, so having a helper that handles these differences is worth it.\n */\nclass SVEMemOperand final {\npublic:\n  enum class Type {\n    ScalarPlusScalar,\n    ScalarPlusImm,\n    ScalarPlusVector,\n    VectorPlusImm,\n  };\n\n  SVEMemOperand(XRegister rn, XRegister rm = XReg::zr)\n    : rn {rn}\n    , MemType {Type::ScalarPlusScalar}\n    , MetaType {.ScalarScalarType {\n        .rm = rm,\n      }} {}\n  SVEMemOperand(XRegister rn, int32_t imm = 0)\n    : rn {rn}\n    , MemType {Type::ScalarPlusImm}\n    , MetaType {.ScalarImmType {\n        .Imm = imm,\n      }} {}\n  SVEMemOperand(XRegister rn, ZRegister zm, SVEModType mod = SVEModType::MOD_NONE, uint8_t scale = 0)\n    : rn {rn}\n    , MemType {Type::ScalarPlusVector}\n    , MetaType {.ScalarVectorType {\n        .zm = zm,\n        .mod = mod,\n        .scale = scale,\n      }} {}\n  SVEMemOperand(ZRegister zn, uint32_t imm)\n    : rn {Register {zn.Idx()}}\n    , MemType {Type::VectorPlusImm}\n    , MetaType {.VectorImmType {\n        .Imm = imm,\n      }} {}\n\n  [[nodiscard]]\n  bool IsScalarPlusScalar() const {\n    return MemType == Type::ScalarPlusScalar;\n  }\n  [[nodiscard]]\n  bool IsScalarPlusImm() const {\n    return MemType == Type::ScalarPlusImm;\n  }\n  [[nodiscard]]\n  bool IsScalarPlusVector() const {\n    return MemType == Type::ScalarPlusVector;\n  }\n  [[nodiscard]]\n  bool IsVectorPlusImm() const {\n    return MemType == Type::VectorPlusImm;\n  }\n\n  union Data {\n    struct {\n      Register rm;\n    } ScalarScalarType;\n\n    struct {\n      int32_t Imm;\n    } ScalarImmType;\n\n    struct {\n      ZRegister zm;\n      SVEModType mod;\n      uint8_t scale;\n    } ScalarVectorType;\n\n    struct {\n      // rn will be a ZRegister\n      uint32_t Imm;\n    } VectorImmType;\n  };\n\n  Register rn;\n  Type MemType;\n  Data MetaType;\n};\n\n/* This `ExtendedMemOperand` class is used for the helper load-store instructions.\n * Load-store instructions are quite expressive, so having a helper that handles these differences is worth it.\n */\nclass ExtendedMemOperand final {\npublic:\n  ExtendedMemOperand(XRegister rn, XRegister rm = XReg::zr, ExtendedType Option = ExtendedType::LSL_64, uint32_t Shift = 0)\n    : rn {rn}\n    , MetaType {.Extended {\n        .Header = {.MemType = TYPE_EXTENDED},\n        .rm = rm,\n        .Option = Option,\n        .Shift = Shift,\n      }} {}\n  ExtendedMemOperand(XRegister rn, IndexType Index = IndexType::OFFSET, int32_t Imm = 0)\n    : rn {rn}\n    , MetaType {.ImmType {\n        .Header = {.MemType = TYPE_IMM},\n        .Index = Index,\n        .Imm = Imm,\n      }} {}\n\n  Register rn;\n  enum Type {\n    TYPE_EXTENDED,\n    TYPE_IMM,\n  };\n  struct HeaderStruct {\n    Type MemType;\n  };\n  union {\n    HeaderStruct Header;\n    struct {\n      HeaderStruct Header;\n      Register rm;\n      ExtendedType Option;\n      uint32_t Shift;\n    } Extended;\n    struct {\n      HeaderStruct Header;\n      IndexType Index;\n      int32_t Imm;\n    } ImmType;\n  } MetaType;\n};\n\ntemplate<uint32_t op0, uint32_t op1, uint32_t CRn, uint32_t CRm, uint32_t op2>\ninline constexpr uint32_t GenSystemReg = op0 << 19 | op1 << 16 | CRn << 12 | CRm << 8 | op2 << 5;\n\n// This `SystemRegister` enum is used for the mrs/msr instructions.\nenum class SystemRegister : uint32_t {\n  CTR_EL0 = GenSystemReg<0b11, 0b011, 0b0000, 0b0000, 0b001>,\n  DCZID_EL0 = GenSystemReg<0b11, 0b011, 0b0000, 0b0000, 0b111>,\n  TPIDR_EL0 = GenSystemReg<0b11, 0b011, 0b1101, 0b0000, 0b010>,\n  RNDR = GenSystemReg<0b11, 0b011, 0b0010, 0b0100, 0b000>,\n  RNDRRS = GenSystemReg<0b11, 0b011, 0b0010, 0b0100, 0b001>,\n  NZCV = GenSystemReg<0b11, 0b011, 0b0100, 0b0010, 0b000>,\n  FPCR = GenSystemReg<0b11, 0b011, 0b0100, 0b0100, 0b000>,\n  TPIDRRO_EL0 = GenSystemReg<0b11, 0b011, 0b1101, 0b0000, 0b011>,\n  CNTFRQ_EL0 = GenSystemReg<0b11, 0b011, 0b1110, 0b0000, 0b000>,\n  CNTVCT_EL0 = GenSystemReg<0b11, 0b011, 0b1110, 0b0000, 0b010>,\n  CNTVCTSS_EL0 = GenSystemReg<0b11, 0b011, 0b1110, 0b0000, 0b110>,\n};\n\ntemplate<uint32_t op1, uint32_t CRm, uint32_t op2>\ninline constexpr uint32_t GenDCReg = op1 << 16 | CRm << 8 | op2 << 5;\n\n// This `DataCacheOperation` enum is used for the dc instruction.\nenum class DataCacheOperation : uint32_t {\n  IVAC = GenDCReg<0b000, 0b0110, 0b001>,\n  ISW = GenDCReg<0b000, 0b0110, 0b010>,\n  CSW = GenDCReg<0b000, 0b1010, 0b010>,\n  CISW = GenDCReg<0b000, 0b1110, 0b010>,\n  ZVA = GenDCReg<0b011, 0b0100, 0b001>,\n  CVAC = GenDCReg<0b011, 0b1010, 0b001>,\n  CVAU = GenDCReg<0b011, 0b1011, 0b001>,\n  CIVAC = GenDCReg<0b011, 0b1110, 0b001>,\n\n  // MTE2\n  IGVAC = GenDCReg<0b000, 0b0110, 0b011>,\n  IGSW = GenDCReg<0b000, 0b0110, 0b100>,\n  IGDVAC = GenDCReg<0b000, 0b0110, 0b101>,\n  IGDSW = GenDCReg<0b000, 0b0110, 0b110>,\n  CGSW = GenDCReg<0b000, 0b1010, 0b100>,\n  CGDSW = GenDCReg<0b000, 0b1010, 0b110>,\n  CIGSW = GenDCReg<0b000, 0b1110, 0b100>,\n  CIGDSW = GenDCReg<0b000, 0b1110, 0b110>,\n\n  // MTE\n  GVA = GenDCReg<0b011, 0b0100, 0b011>,\n  GZVA = GenDCReg<0b011, 0b0100, 0b100>,\n  CGVAC = GenDCReg<0b011, 0b1010, 0b011>,\n  CGDVAC = GenDCReg<0b011, 0b1010, 0b101>,\n  CGVAP = GenDCReg<0b011, 0b1100, 0b011>,\n  CGDVAP = GenDCReg<0b011, 0b1100, 0b101>,\n  CGVADP = GenDCReg<0b011, 0b1101, 0b011>,\n  CGDVADP = GenDCReg<0b011, 0b1101, 0b101>,\n  CIGVAC = GenDCReg<0b011, 0b1110, 0b011>,\n  CIGDVAC = GenDCReg<0b011, 0b1110, 0b101>,\n\n  // DPB\n  CVAP = GenDCReg<0b011, 0b1100, 0b001>,\n\n  // DPB2\n  CVADP = GenDCReg<0b011, 0b1101, 0b001>,\n};\n\ntemplate<uint32_t CRm, uint32_t op2>\ninline constexpr uint32_t GenHintBarrierReg = CRm << 8 | op2 << 5;\n\n// This `HintRegister` enum is used for the hint instruction.\nenum class HintRegister : uint32_t {\n  NOP = GenHintBarrierReg<0b0000, 0b000>,\n  YIELD = GenHintBarrierReg<0b0000, 0b001>,\n  WFE = GenHintBarrierReg<0b0000, 0b010>,\n  WFI = GenHintBarrierReg<0b0000, 0b011>,\n  SEV = GenHintBarrierReg<0b0000, 0b100>,\n  SEVL = GenHintBarrierReg<0b0000, 0b101>,\n  DGH = GenHintBarrierReg<0b0000, 0b110>,\n  CSDB = GenHintBarrierReg<0b0010, 0b100>,\n};\n\n// This `BarrierRegister` enum is used for the various barrier instructions.\nenum class BarrierRegister : uint32_t {\n  CLREX = GenHintBarrierReg<0b0000, 0b010>,\n  TCOMMIT = GenHintBarrierReg<0b0000, 0b011>,\n  DSB = GenHintBarrierReg<0b0000, 0b100>,\n  DMB = GenHintBarrierReg<0b0000, 0b101>,\n  ISB = GenHintBarrierReg<0b0000, 0b110>,\n  SB = GenHintBarrierReg<0b0000, 0b111>,\n};\n\n// This `BarrierScope` enum is used for the dsb/dmb instructions.\nenum class BarrierScope : uint32_t {\n  // Outer shareable\n  OSHLD = 0b0001,\n  OSHST = 0b0010,\n  OSH = 0b0011,\n  // Non shareable\n  NSHLD = 0b0101,\n  NSHST = 0b0110,\n  NSH = 0b0111,\n  // Inner shareable\n  ISHLD = 0b1001,\n  ISHST = 0b1010,\n  ISH = 0b1011,\n  // Full System visibility\n  LD = 0b1101,\n  ST = 0b1110,\n  SY = 0b1111,\n};\n\n// This `Prefetch` enum is used for prefetch instructions.\nenum class Prefetch : uint32_t {\n  // Prefetch for load\n  PLDL1KEEP = 0b00000,\n  PLDL1STRM = 0b00001,\n  PLDL2KEEP = 0b00010,\n  PLDL2STRM = 0b00011,\n  PLDL3KEEP = 0b00100,\n  PLDL3STRM = 0b00101,\n\n  // Preload instructions\n  PLIL1KEEP = 0b01000,\n  PLIL1STRM = 0b01001,\n  PLIL2KEEP = 0b01010,\n  PLIL2STRM = 0b01011,\n  PLIL3KEEP = 0b01100,\n  PLIL3STRM = 0b01101,\n\n  // Preload for store\n  PSTL1KEEP = 0b10000,\n  PSTL1STRM = 0b10001,\n  PSTL2KEEP = 0b10010,\n  PSTL2STRM = 0b10011,\n  PSTL3KEEP = 0b10100,\n  PSTL3STRM = 0b10101,\n};\n\n// This `PredicatePattern` enun is used for some SVE instructions.\nenum class PredicatePattern : uint32_t {\n  SVE_POW2 = 0b00000,\n  SVE_VL1 = 0b00001,\n  SVE_VL2 = 0b00010,\n  SVE_VL3 = 0b00011,\n  SVE_VL4 = 0b00100,\n  SVE_VL5 = 0b00101,\n  SVE_VL6 = 0b00110,\n  SVE_VL7 = 0b00111,\n  SVE_VL8 = 0b01000,\n  SVE_VL16 = 0b01001,\n  SVE_VL32 = 0b01010,\n  SVE_VL64 = 0b01011,\n  SVE_VL128 = 0b01100,\n  SVE_VL256 = 0b01101,\n  SVE_MUL4 = 0b11101,\n  SVE_MUL3 = 0b11110,\n  SVE_ALL = 0b11111,\n};\n\n// Used with SVE FP immediate arithmetic instructions\nenum class SVEFAddSubImm : uint32_t {\n  _0_5,\n  _1_0,\n};\nenum class SVEFMulImm : uint32_t {\n  _0_5,\n  _2_0,\n};\nenum class SVEFMaxMinImm : uint32_t {\n  _0_0,\n  _1_0,\n};\n\n/* This `BackwardLabel` struct is used for retaining a location for PC-Relative instructions.\n * This is specifically a label for a target that is logically `below` an instruction that uses it.\n * Which means that a branch would jump backwards.\n */\nstruct BackwardLabel {\n  uint8_t* Location {};\n};\n\n/* This `ForwardLabel` struct is used for retaining a location for PC-Relative instructions.\n * This is specifically a label for a target that is logically `above` an instruction that uses it.\n * Which means that a branch would jump forwards.\n */\nstruct ForwardLabel {\n  enum class InstType {\n    UNKNOWN,\n    ADR,\n    ADRP,\n    B,\n    BC,\n    TEST_BRANCH,\n    RELATIVE_LOAD,\n    LONG_ADDRESS_GEN,\n  };\n\n  struct Reference {\n    uint8_t* Location {};\n    InstType Type = InstType::UNKNOWN;\n  };\n\n  // The first element is stored separately to avoid allocations for simple cases\n  Reference FirstInst;\n\n  fextl::vector<Reference> Insts;\n};\n\n/* This `BiDirectionalLabel` struct used for retaining a location for PC-Relative instructions.\n * This is specifically a label for a target that is in either direction of an instruction that uses it.\n * Which means a branch could jump backwards or forwards depending on situation.\n */\nstruct BiDirectionalLabel {\n  BackwardLabel Backward;\n  ForwardLabel Forward;\n};\n\nstatic inline void AddLocationToLabel(ForwardLabel* Label, ForwardLabel::Reference&& Location) {\n  if (Label->FirstInst.Location == nullptr) {\n    Label->FirstInst = Location;\n  } else {\n    Label->Insts.push_back(Location);\n  }\n}\n\n// Some FCMA ASIMD instructions support a rotation argument.\nenum class Rotation : uint32_t {\n  ROTATE_0 = 0b00,\n  ROTATE_90 = 0b01,\n  ROTATE_180 = 0b10,\n  ROTATE_270 = 0b11,\n};\n\n// Concept for contraining some instructions to accept only an XRegister or WRegister.\n// Particularly for operations that differ encodings depending on which one is used.\ntemplate<typename T>\nconcept IsXOrWRegister = std::is_same_v<T, XRegister> || std::is_same_v<T, WRegister>;\n\n// Concept for contraining some instructions to accept only a QRegister or DRegister.\ntemplate<typename T>\nconcept IsQOrDRegister = std::is_same_v<T, QRegister> || std::is_same_v<T, DRegister>;\n\ntemplate<typename T>\nconcept IsLabel = std::is_same_v<T, ARMEmitter::ForwardLabel> || std::is_same_v<T, ARMEmitter::BackwardLabel> ||\n                  std::is_same_v<T, ARMEmitter::BiDirectionalLabel> || std::is_same_v<T, ARMEmitter::ForwardLabel::Reference>;\n\nenum class BranchEncodeSucceeded {\n  Success,\n  Failure,\n};\n\n// Whether or not a given set of vector registers are sequential\n// in increasing order as far as the register file is concerned (modulo its size)\n//\n// For example, a set of registers like:\n//\n// v1,  v2, v3 and\n// v31, v0, v1\n//\n// would both be considered sequential sequences, and some instructions in particular\n// limit register lists to these kind of sequences.\n//\ntemplate<typename T, typename... Args>\nconstexpr bool AreVectorsSequential(T first, const Args&... args) {\n  // Ensure we always have a pair of registers to compare against.\n  static_assert(sizeof...(args) >= 1, \"Number of arguments must be greater than 1\");\n\n  const auto fn = [](auto& lhs, const auto& rhs) {\n    const auto result = ((lhs.Idx() + 1) % 32) == rhs.Idx();\n    lhs = rhs;\n    return result;\n  };\n\n  return (fn(first, args) && ...);\n}\n\n// Returns if the immediate can fit in to add/sub immediate instruction encodings.\nconstexpr bool IsImmAddSub(uint64_t imm) {\n  constexpr uint64_t U12Mask = 0xFFF;\n  auto FitsWithin12Bits = [](uint64_t imm) {\n    return (imm & ~U12Mask) == 0;\n  };\n  // Can fit in to the instruction encoding:\n  // - if only bits [11:0] are set.\n  // - if only bits [23:12] are set.\n  return FitsWithin12Bits(imm) || (FitsWithin12Bits(imm >> 12) && (imm & U12Mask) == 0);\n}\n\n// This is an emitter that is designed around the smallest code bloat as possible.\n// Eschewing most developer convenience in order to keep code as small as possible.\n\n// Choices:\n// - Size of ops passed as an argument rather than template to let the compiler use csel instead of branching.\n// - Registers are unsized so they can be passed in a GPR and not need conversion operations\nclass Emitter : public ARMEmitter::Buffer {\npublic:\n  Emitter() = default;\n\n  Emitter(uint8_t* Base, uint64_t BaseSize)\n    : Buffer(Base, BaseSize) {}\n\n  // Bind a backward label to an address.\n  // Address that is bound is the current emitter location.\n  [[nodiscard]] bool Bind(BackwardLabel* Label) {\n    LOGMAN_THROW_A_FMT(Label->Location == nullptr, \"Trying to bind a label twice\");\n    Label->Location = GetCursorAddress<uint8_t*>();\n\n    // Always binds because it is only storing a location.\n    return true;\n  }\n\n  [[nodiscard]] bool Bind(const ForwardLabel::Reference* Label) {\n    uint8_t* CurrentAddress = GetCursorAddress<uint8_t*>();\n    // Patch up the instructions\n    switch (Label->Type) {\n    case ForwardLabel::InstType::ADR: {\n      uint32_t* Instruction = reinterpret_cast<uint32_t*>(Label->Location);\n      int64_t Imm = reinterpret_cast<int64_t>(CurrentAddress) - reinterpret_cast<int64_t>(Instruction);\n      if (!IsADRRange(Imm)) {\n        // Can't bind.\n        return false;\n      }\n      uint32_t InstMask = 0b11 << 29 | 0b1111'1111'1111'1111'111 << 5;\n      uint32_t Offset = static_cast<uint32_t>(Imm) & 0x3F'FFFF;\n      uint32_t Inst = *Instruction & ~InstMask;\n      Inst |= (Offset & 0b11) << 29;\n      Inst |= (Offset >> 2) << 5;\n      *Instruction = Inst;\n      break;\n    }\n    case ForwardLabel::InstType::ADRP: {\n      uint32_t* Instruction = reinterpret_cast<uint32_t*>(Label->Location);\n      int64_t Imm = reinterpret_cast<int64_t>(CurrentAddress) - reinterpret_cast<int64_t>(Instruction);\n\n      if (!(IsADRPRange(Imm) && IsADRPAligned(Imm))) {\n        // Can't bind.\n        return false;\n      }\n\n      Imm >>= 12;\n      uint32_t InstMask = 0b11 << 29 | 0b1111'1111'1111'1111'111 << 5;\n      uint32_t Offset = static_cast<uint32_t>(Imm) & 0x3F'FFFF;\n      uint32_t Inst = *Instruction & ~InstMask;\n      Inst |= (Offset & 0b11) << 29;\n      Inst |= (Offset >> 2) << 5;\n      *Instruction = Inst;\n      break;\n    }\n    case ForwardLabel::InstType::B: {\n      uint32_t* Instruction = reinterpret_cast<uint32_t*>(Label->Location);\n      int64_t Imm = reinterpret_cast<int64_t>(CurrentAddress) - reinterpret_cast<int64_t>(Instruction);\n      if (!(Imm >= -134217728 && Imm <= 134217724 && ((Imm & 0b11) == 0))) {\n        // Can't bind.\n        return false;\n      }\n      Imm >>= 2;\n      uint32_t InstMask = 0x3FF'FFFF;\n      uint32_t Offset = static_cast<uint32_t>(Imm) & InstMask;\n      uint32_t Inst = *Instruction & ~InstMask;\n      Inst |= Offset;\n      *Instruction = Inst;\n\n      break;\n    }\n    case ForwardLabel::InstType::TEST_BRANCH: {\n      uint32_t* Instruction = reinterpret_cast<uint32_t*>(Label->Location);\n      int64_t Imm = reinterpret_cast<int64_t>(CurrentAddress) - reinterpret_cast<int64_t>(Instruction);\n      if (!(Imm >= -32768 && Imm <= 32764 && ((Imm & 0b11) == 0))) {\n        // Can't bind.\n        return false;\n      }\n      Imm >>= 2;\n      uint32_t InstMask = 0x3FFF;\n      uint32_t Offset = static_cast<uint32_t>(Imm) & InstMask;\n      uint32_t Inst = *Instruction & ~(InstMask << 5);\n      Inst |= Offset << 5;\n      *Instruction = Inst;\n\n      break;\n    }\n    case ForwardLabel::InstType::BC:\n    case ForwardLabel::InstType::RELATIVE_LOAD: {\n      uint32_t* Instruction = reinterpret_cast<uint32_t*>(Label->Location);\n      int64_t Imm = reinterpret_cast<int64_t>(CurrentAddress) - reinterpret_cast<int64_t>(Instruction);\n      if (!(Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0))) {\n        // Can't bind.\n        return false;\n      }\n      Imm >>= 2;\n      uint32_t InstMask = 0x7'FFFF;\n      uint32_t Offset = static_cast<uint32_t>(Imm) & InstMask;\n      uint32_t Inst = *Instruction & ~(InstMask << 5);\n      Inst |= Offset << 5;\n      *Instruction = Inst;\n      break;\n    }\n    case ForwardLabel::InstType::LONG_ADDRESS_GEN: {\n      const auto* Instructions = reinterpret_cast<uint32_t*>(Label->Location);\n      const auto ImmInstOne = reinterpret_cast<int64_t>(CurrentAddress) - reinterpret_cast<int64_t>(&Instructions[0]);\n      const auto ImmInstTwo = reinterpret_cast<int64_t>(CurrentAddress) - reinterpret_cast<int64_t>(&Instructions[1]);\n      const auto ImmInstThree = reinterpret_cast<int64_t>(CurrentAddress) - reinterpret_cast<int64_t>(&Instructions[2]);\n      const auto OriginalOffset = GetCursorOffset();\n\n      const auto InstOffset = GetCursorOffsetFromAddress(Instructions);\n      SetCursorOffset(InstOffset);\n\n      // We encoded the destination register in to the first instruction space.\n      // Read it back.\n      ARMEmitter::Register DestReg(Instructions[0]);\n\n      if (IsADRRange(ImmInstThree)) {\n        // If within ADR range from the third instruction, then we can emit NOP+NOP+ADR\n        nop();\n        nop();\n        adr(DestReg, static_cast<uint32_t>(ImmInstThree) & 0x7FFF);\n      } else if (IsADRPRange(ImmInstTwo)) {\n\n        // If within ADRP range from the first instruction, then we are /definitely/ in range for the second instruction.\n        // First check if we are in non-offset range for second instruction.\n        if (IsADRPAligned(reinterpret_cast<uint64_t>(CurrentAddress))) {\n          // We can emit nop + nop + adrp\n          nop();\n          nop();\n          adrp(DestReg, static_cast<uint32_t>(ImmInstThree >> 12) & 0x7FFF);\n        } else {\n          // Not aligned, need nop + adrp + add\n          nop();\n          adrp(DestReg, static_cast<uint32_t>(ImmInstTwo >> 12) & 0x7FFF);\n          add(ARMEmitter::Size::i64Bit, DestReg, DestReg, ImmInstTwo & 0xFFF);\n        }\n      } else {\n        // Stinky path, we need to emit a movz+movk+movk sequence.\n        movz(ARMEmitter::Size::i64Bit, DestReg, uint32_t(ImmInstOne >> 32) & 0x7FFF, 32);\n        movk(ARMEmitter::Size::i64Bit, DestReg, uint32_t(ImmInstOne >> 16) & 0xFFFF, 16);\n        movk(ARMEmitter::Size::i64Bit, DestReg, uint32_t(ImmInstOne) & 0xFFFF);\n      }\n\n      SetCursorOffset(OriginalOffset);\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unexpected inst type in label fixup\");\n    }\n\n    return true;\n  }\n\n  // Bind a forward label to a location.\n  // This walks all the instructions in the label's vector.\n  // Then backpatching all instructions that have used the label.\n  [[nodiscard]] bool Bind(ForwardLabel* Label) {\n    bool Bound = true;\n    if (Label->FirstInst.Location) {\n      Bound &= Bind(&Label->FirstInst);\n    }\n    for (auto& Inst : Label->Insts) {\n      Bound &= Bind(&Inst);\n    }\n\n    return Bound;\n  }\n\n  // Bind a bidirectional location to a location.\n  // Binds both forwards and backwards depending on how the label was used.\n  [[nodiscard]] bool Bind(BiDirectionalLabel* Label) {\n    bool Bound = true;\n    if (!Label->Backward.Location) {\n      Bound &= Bind(&Label->Backward);\n    }\n    Bound &= Bind(&Label->Forward);\n\n    return Bound;\n  }\n\n  static constexpr Condition InvertCondition(Condition cond) {\n    // These behave as always, so it makes no sense to allow inverting these.\n    LOGMAN_THROW_A_FMT(cond != Condition::CC_AL && cond != Condition::CC_NV, \"Cannot invert CC_AL or CC_NV\");\n    return static_cast<Condition>(FEXCore::ToUnderlying(cond) ^ 1);\n  }\n\n#include <CodeEmitter/VixlUtils.inl>\n\npublic:\n\n// This symbol is used to allow external tooling (IDEs, clang-format, ...) to process the included files individually:\n// If defined, the files will inject member functions into this class.\n// If not, the files will wrap the member functions in a class so that tooling will process them properly.\n#define INCLUDED_BY_EMITTER\n\n  // TODO: Implement SME when it matters.\n#include <CodeEmitter/ALUOps.inl>\n#include <CodeEmitter/BranchOps.inl>\n#include <CodeEmitter/LoadstoreOps.inl>\n#include <CodeEmitter/SystemOps.inl>\n#include <CodeEmitter/ScalarOps.inl>\n#include <CodeEmitter/ASIMDOps.inl>\n#include <CodeEmitter/SVEOps.inl>\n\n#undef INCLUDED_BY_EMITTER\n\nprotected:\n  template<typename T>\n  uint32_t Encode_ra(T Reg) const {\n    return Reg.Idx() << 10;\n  }\n  uint32_t Encode_ra(uint32_t Reg) const {\n    return Reg << 10;\n  }\n  template<typename T>\n  uint32_t Encode_rt2(T Reg) const {\n    return Reg.Idx() << 10;\n  }\n  uint32_t Encode_rt2(uint32_t Reg) const {\n    return Reg << 10;\n  }\n  template<typename T>\n  uint32_t Encode_rm(T Reg) const {\n    return Reg.Idx() << 16;\n  }\n  uint32_t Encode_rm(uint32_t Reg) const {\n    return Reg << 16;\n  }\n  template<typename T>\n  uint32_t Encode_rs(T Reg) const {\n    return Reg.Idx() << 16;\n  }\n  uint32_t Encode_rs(uint32_t Reg) const {\n    return Reg << 16;\n  }\n  template<typename T>\n  uint32_t Encode_rn(T Reg) const {\n    return Reg.Idx() << 5;\n  }\n  uint32_t Encode_rn(uint32_t Reg) const {\n    return Reg << 5;\n  }\n  template<typename T>\n  uint32_t Encode_rd(T Reg) const {\n    return Reg.Idx();\n  }\n  uint32_t Encode_rd(uint32_t Reg) const {\n    return Reg;\n  }\n  template<typename T>\n  uint32_t Encode_rt(T Reg) const {\n    return Reg.Idx();\n  }\n  uint32_t Encode_rt(Prefetch Reg) const {\n    return FEXCore::ToUnderlying(Reg);\n  }\n  uint32_t Encode_rt(uint32_t Reg) const {\n    return Reg;\n  }\n  template<typename T>\n  uint32_t Encode_pd(T Reg) const {\n    return FEXCore::ToUnderlying(Reg);\n  }\n};\n} // namespace ARMEmitter\n"
  },
  {
    "path": "CodeEmitter/CodeEmitter/LoadstoreOps.inl",
    "content": "// SPDX-License-Identifier: MIT\n/* Load-store instruction emitters\n *\n * For GPR load-stores that take a `Size` argument as their first argument can be 32-bit or 64-bit.\n * For GPR load-stores that don't take a `Size` argument, then their operating size is determined by the name of the instruction.\n *\n * For Vector load-stores, most take a `SubRegSize` to determine the size of the elements getting loaded or stored.\n * Depending on the instruction it can be an single element or the full instruction, it depends on the instruction.\n *\n * There are some load-store helper functions which take a `ExtendedMemOperand` argument.\n * This helper will select the viable load-store that can work with the provided encapsulated arguments.\n */\n\n#pragma once\n#ifndef INCLUDED_BY_EMITTER\n#include <CodeEmitter/Emitter.h>\nnamespace ARMEmitter {\nstruct EmitterOps : Emitter {\n#endif\n\npublic:\n  // Compare and swap pair\n  void casp(ARMEmitter::Size s, ARMEmitter::Register rs, ARMEmitter::Register rs2, ARMEmitter::Register rt, ARMEmitter::Register rt2,\n            ARMEmitter::Register rn) {\n    LOGMAN_THROW_A_FMT((rs.Idx() + 1) == rs2.Idx(), \"These must be sequential\");\n    LOGMAN_THROW_A_FMT((rt.Idx() + 1) == rt2.Idx(), \"These must be sequential\");\n    constexpr uint32_t Op = 0b0000'1000'001 << 21;\n    AtomicOp(Op, s, 0, 0, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void caspa(ARMEmitter::Size s, ARMEmitter::Register rs, ARMEmitter::Register rs2, ARMEmitter::Register rt, ARMEmitter::Register rt2,\n             ARMEmitter::Register rn) {\n    LOGMAN_THROW_A_FMT((rs.Idx() + 1) == rs2.Idx(), \"These must be sequential\");\n    LOGMAN_THROW_A_FMT((rt.Idx() + 1) == rt2.Idx(), \"These must be sequential\");\n    constexpr uint32_t Op = 0b0000'1000'001 << 21;\n    AtomicOp(Op, s, 1, 0, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void caspl(ARMEmitter::Size s, ARMEmitter::Register rs, ARMEmitter::Register rs2, ARMEmitter::Register rt, ARMEmitter::Register rt2,\n             ARMEmitter::Register rn) {\n    LOGMAN_THROW_A_FMT((rs.Idx() + 1) == rs2.Idx(), \"These must be sequential\");\n    LOGMAN_THROW_A_FMT((rt.Idx() + 1) == rt2.Idx(), \"These must be sequential\");\n    constexpr uint32_t Op = 0b0000'1000'001 << 21;\n    AtomicOp(Op, s, 0, 1, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void caspal(ARMEmitter::Size s, ARMEmitter::Register rs, ARMEmitter::Register rs2, ARMEmitter::Register rt, ARMEmitter::Register rt2,\n              ARMEmitter::Register rn) {\n    LOGMAN_THROW_A_FMT((rs.Idx() + 1) == rs2.Idx(), \"These must be sequential\");\n    LOGMAN_THROW_A_FMT((rt.Idx() + 1) == rt2.Idx(), \"These must be sequential\");\n    constexpr uint32_t Op = 0b0000'1000'001 << 21;\n    AtomicOp(Op, s, 1, 1, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n\n  // Advanced SIMD load/store multiple structures\n  template<SubRegSize size, typename T>\n  void ld1(T rt, Register rn) {\n    constexpr uint32_t Op = 0b0000'1100'000 << 21;\n    constexpr uint32_t Opcode = 0b0111 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size, typename T>\n  void ld1(T rt, T rt2, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1100'000 << 21;\n    constexpr uint32_t Opcode = 0b1010 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size, typename T>\n  void ld1(T rt, T rt2, T rt3, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1100'000 << 21;\n    constexpr uint32_t Opcode = 0b0110 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size, typename T>\n  void ld1(T rt, T rt2, T rt3, T rt4, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1100'000 << 21;\n    constexpr uint32_t Opcode = 0b0010 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size, typename T>\n  void st1(T rt, Register rn) {\n    constexpr uint32_t Op = 0b0000'1100'000 << 21;\n    constexpr uint32_t Opcode = 0b0111 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size, typename T>\n  void st1(T rt, T rt2, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1100'000 << 21;\n    constexpr uint32_t Opcode = 0b1010 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size, typename T>\n  void st1(T rt, T rt2, T rt3, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1100'000 << 21;\n    constexpr uint32_t Opcode = 0b0110 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size, typename T>\n  void st1(T rt, T rt2, T rt3, T rt4, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1100'000 << 21;\n    constexpr uint32_t Opcode = 0b0010 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size, typename T>\n  void ld2(T rt, T rt2, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1100'000 << 21;\n    constexpr uint32_t Opcode = 0b1000 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size, typename T>\n  void st2(T rt, T rt2, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1100'000 << 21;\n    constexpr uint32_t Opcode = 0b1000 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size, typename T>\n  void ld3(T rt, T rt2, T rt3, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1100'000 << 21;\n    constexpr uint32_t Opcode = 0b0100 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size, typename T>\n  void st3(T rt, T rt2, T rt3, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1100'000 << 21;\n    constexpr uint32_t Opcode = 0b0100 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size, typename T>\n  void ld4(T rt, T rt2, T rt3, T rt4, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1100'000 << 21;\n    constexpr uint32_t Opcode = 0b0000 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size, typename T>\n  void st4(T rt, T rt2, T rt3, T rt4, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1100'000 << 21;\n    constexpr uint32_t Opcode = 0b0000 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  // Advanced SIMD load/store multiple structures (post-indexed)\n  static constexpr uint32_t ASIMDLoadstoreMultiplePost_Op = 0b0000'1100'100 << 21;\n  template<SubRegSize size, typename T>\n  void ld1(T rt, Register rn, Register rm) {\n    constexpr uint32_t Opcode = 0b0111 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, rm);\n  }\n  template<SubRegSize size, typename T>\n  void ld1(T rt, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T> && (PostOffset == 16)) || (std::is_same_v<DRegister, T> && (PostOffset == 8)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Opcode = 0b0111 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, Reg::r31);\n  }\n  template<SubRegSize size, typename T>\n  void ld1(T rt, T rt2, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    constexpr uint32_t Opcode = 0b1010 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, rm);\n  }\n  template<SubRegSize size, typename T>\n  void ld1(T rt, T rt2, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T> && (PostOffset == 32)) || (std::is_same_v<DRegister, T> && (PostOffset == 16)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Opcode = 0b1010 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, Reg::r31);\n  }\n  template<SubRegSize size, typename T>\n  void ld1(T rt, T rt2, T rt3, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    constexpr uint32_t Opcode = 0b0110 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, rm);\n  }\n  template<SubRegSize size, typename T>\n  void ld1(T rt, T rt2, T rt3, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T> && (PostOffset == 48)) || (std::is_same_v<DRegister, T> && (PostOffset == 24)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Opcode = 0b0110 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, Reg::r31);\n  }\n  template<SubRegSize size, typename T>\n  void ld1(T rt, T rt2, T rt3, T rt4, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    constexpr uint32_t Opcode = 0b0010 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, rm);\n  }\n  template<SubRegSize size, typename T>\n  void ld1(T rt, T rt2, T rt3, T rt4, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T> && (PostOffset == 64)) || (std::is_same_v<DRegister, T> && (PostOffset == 32)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Opcode = 0b0010 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, Reg::r31);\n  }\n\n  template<SubRegSize size, typename T>\n  void st1(T rt, Register rn, Register rm) {\n    constexpr uint32_t Opcode = 0b0111 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, rm);\n  }\n  template<SubRegSize size, typename T>\n  void st1(T rt, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T> && (PostOffset == 16)) || (std::is_same_v<DRegister, T> && (PostOffset == 8)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Opcode = 0b0111 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, Reg::r31);\n  }\n  template<SubRegSize size, typename T>\n  void st1(T rt, T rt2, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    constexpr uint32_t Opcode = 0b1010 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, rm);\n  }\n  template<SubRegSize size, typename T>\n  void st1(T rt, T rt2, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T> && (PostOffset == 32)) || (std::is_same_v<DRegister, T> && (PostOffset == 16)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Opcode = 0b1010 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, Reg::r31);\n  }\n  template<SubRegSize size, typename T>\n  void st1(T rt, T rt2, T rt3, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    constexpr uint32_t Opcode = 0b0110 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, rm);\n  }\n  template<SubRegSize size, typename T>\n  void st1(T rt, T rt2, T rt3, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T> && (PostOffset == 48)) || (std::is_same_v<DRegister, T> && (PostOffset == 24)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Opcode = 0b0110 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, Reg::r31);\n  }\n  template<SubRegSize size, typename T>\n  void st1(T rt, T rt2, T rt3, T rt4, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    constexpr uint32_t Opcode = 0b0010 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, rm);\n  }\n  template<SubRegSize size, typename T>\n  void st1(T rt, T rt2, T rt3, T rt4, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T> && (PostOffset == 64)) || (std::is_same_v<DRegister, T> && (PostOffset == 32)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Opcode = 0b0010 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, Reg::r31);\n  }\n\n  template<SubRegSize size, typename T>\n  void ld2(T rt, T rt2, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    constexpr uint32_t Opcode = 0b1000 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, rm);\n  }\n  template<SubRegSize size, typename T>\n  void ld2(T rt, T rt2, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T> && (PostOffset == 32)) || (std::is_same_v<DRegister, T> && (PostOffset == 16)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Opcode = 0b1000 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, Reg::r31);\n  }\n  template<SubRegSize size, typename T>\n  void st2(T rt, T rt2, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    constexpr uint32_t Opcode = 0b1000 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, rm);\n  }\n  template<SubRegSize size, typename T>\n  void st2(T rt, T rt2, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T> && (PostOffset == 32)) || (std::is_same_v<DRegister, T> && (PostOffset == 16)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Opcode = 0b1000 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, Reg::r31);\n  }\n  template<SubRegSize size, typename T>\n  void ld3(T rt, T rt2, T rt3, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    constexpr uint32_t Opcode = 0b0100 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, rm);\n  }\n  template<SubRegSize size, typename T>\n  void ld3(T rt, T rt2, T rt3, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T> && (PostOffset == 48)) || (std::is_same_v<DRegister, T> && (PostOffset == 24)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Opcode = 0b0100 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, Reg::r31);\n  }\n  template<SubRegSize size, typename T>\n  void st3(T rt, T rt2, T rt3, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    constexpr uint32_t Opcode = 0b0100 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, rm);\n  }\n  template<SubRegSize size, typename T>\n  void st3(T rt, T rt2, T rt3, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T> && (PostOffset == 48)) || (std::is_same_v<DRegister, T> && (PostOffset == 24)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Opcode = 0b0100 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, Reg::r31);\n  }\n  template<SubRegSize size, typename T>\n  void ld4(T rt, T rt2, T rt3, T rt4, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    constexpr uint32_t Opcode = 0b0000 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, rm);\n  }\n  template<SubRegSize size, typename T>\n  void ld4(T rt, T rt2, T rt3, T rt4, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T> && (PostOffset == 64)) || (std::is_same_v<DRegister, T> && (PostOffset == 32)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Opcode = 0b0000 << 12;\n    ASIMDLoadStoreMultipleStructure<size, true>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, Reg::r31);\n  }\n  template<SubRegSize size, typename T>\n  void st4(T rt, T rt2, T rt3, T rt4, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    constexpr uint32_t Opcode = 0b0000 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, rm);\n  }\n  template<SubRegSize size, typename T>\n  void st4(T rt, T rt2, T rt3, T rt4, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    LOGMAN_THROW_A_FMT((std::is_same_v<QRegister, T> && (PostOffset == 64)) || (std::is_same_v<DRegister, T> && (PostOffset == 32)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Opcode = 0b0000 << 12;\n    ASIMDLoadStoreMultipleStructure<size, false>(ASIMDLoadstoreMultiplePost_Op, Opcode, rt, rn, Reg::r31);\n  }\n\n  // ASIMD loadstore single\n  template<SubRegSize size>\n  void st1(VRegister rt, uint32_t Index, Register rn) {\n    constexpr uint32_t Op = 0b0000'1101'000 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, false, 1>(Op, Opcode, rt, Index, rn, Reg::r0);\n  }\n  template<SubRegSize size>\n  void st2(VRegister rt, VRegister rt2, uint32_t Index, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'000 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, false, 2>(Op, Opcode, rt, Index, rn, Reg::r0);\n  }\n  template<SubRegSize size>\n  void st3(VRegister rt, VRegister rt2, VRegister rt3, uint32_t Index, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'000 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, false, 3>(Op, Opcode, rt, Index, rn, Reg::r0);\n  }\n  template<SubRegSize size>\n  void st4(VRegister rt, VRegister rt2, VRegister rt3, VRegister rt4, uint32_t Index, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'000 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, false, 4>(Op, Opcode, rt, Index, rn, Reg::r0);\n  }\n  template<SubRegSize size>\n  void ld1(VRegister rt, uint32_t Index, Register rn) {\n    constexpr uint32_t Op = 0b0000'1101'000 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, true, 1>(Op, Opcode, rt, Index, rn, Reg::r0);\n  }\n  template<SubRegSize size, IsQOrDRegister T>\n  void ld1r(T rt, Register rn) {\n    constexpr uint32_t Op = 0b0000'1101'000 << 21;\n    constexpr uint32_t Opcode = 0b110;\n    ASIMDSTLD<size, true, 1>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size>\n  void ld2(VRegister rt, VRegister rt2, uint32_t Index, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'000 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, true, 2>(Op, Opcode, rt, Index, rn, Reg::r0);\n  }\n  template<SubRegSize size, IsQOrDRegister T>\n  void ld2r(T rt, T rt2, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'000 << 21;\n    constexpr uint32_t Opcode = 0b110;\n    ASIMDSTLD<size, true, 2>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size>\n  void ld3(VRegister rt, VRegister rt2, VRegister rt3, uint32_t Index, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'000 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, true, 3>(Op, Opcode, rt, Index, rn, Reg::r0);\n  }\n  template<SubRegSize size, IsQOrDRegister T>\n  void ld3r(T rt, T rt2, T rt3, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'000 << 21;\n    constexpr uint32_t Opcode = 0b110;\n    ASIMDSTLD<size, true, 3>(Op, Opcode, rt, rn, Reg::r0);\n  }\n  template<SubRegSize size>\n  void ld4(VRegister rt, VRegister rt2, VRegister rt3, VRegister rt4, uint32_t Index, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'000 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, true, 4>(Op, Opcode, rt, Index, rn, Reg::r0);\n  }\n  template<SubRegSize size, IsQOrDRegister T>\n  void ld4r(T rt, T rt2, T rt3, T rt4, Register rn) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'000 << 21;\n    constexpr uint32_t Opcode = 0b110;\n    ASIMDSTLD<size, true, 4>(Op, Opcode, rt, rn, Reg::r0);\n  }\n\n  // ASIMD loadstore single post-indexed\n  template<SubRegSize size>\n  void st1(VRegister rt, uint32_t Index, Register rn, Register rm) {\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, false, 1>(Op, Opcode, rt, Index, rn, rm);\n  }\n  template<SubRegSize size>\n  void st1(VRegister rt, uint32_t Index, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT((size == SubRegSize::i8Bit && (PostOffset == 1)) || (size == SubRegSize::i16Bit && (PostOffset == 2)) ||\n                         (size == SubRegSize::i32Bit && (PostOffset == 4)) || (size == SubRegSize::i64Bit && (PostOffset == 8)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, false, 1>(Op, Opcode, rt, Index, rn, Reg::r31);\n  }\n  template<SubRegSize size>\n  void st2(VRegister rt, VRegister rt2, uint32_t Index, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, false, 2>(Op, Opcode, rt, Index, rn, rm);\n  }\n  template<SubRegSize size>\n  void st2(VRegister rt, uint32_t Index, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT((size == SubRegSize::i8Bit && (PostOffset == 2)) || (size == SubRegSize::i16Bit && (PostOffset == 4)) ||\n                         (size == SubRegSize::i32Bit && (PostOffset == 8)) || (size == SubRegSize::i64Bit && (PostOffset == 16)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, false, 2>(Op, Opcode, rt, Index, rn, Reg::r31);\n  }\n  template<SubRegSize size>\n  void st3(VRegister rt, VRegister rt2, VRegister rt3, uint32_t Index, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, false, 3>(Op, Opcode, rt, Index, rn, rm);\n  }\n  template<SubRegSize size>\n  void st3(VRegister rt, uint32_t Index, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT((size == SubRegSize::i8Bit && (PostOffset == 3)) || (size == SubRegSize::i16Bit && (PostOffset == 6)) ||\n                         (size == SubRegSize::i32Bit && (PostOffset == 8)) || (size == SubRegSize::i64Bit && (PostOffset == 24)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, false, 3>(Op, Opcode, rt, Index, rn, Reg::r31);\n  }\n  template<SubRegSize size>\n  void st4(VRegister rt, VRegister rt2, VRegister rt3, VRegister rt4, uint32_t Index, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, false, 4>(Op, Opcode, rt, Index, rn, rm);\n  }\n  template<SubRegSize size>\n  void st4(VRegister rt, uint32_t Index, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT((size == SubRegSize::i8Bit && (PostOffset == 4)) || (size == SubRegSize::i16Bit && (PostOffset == 8)) ||\n                         (size == SubRegSize::i32Bit && (PostOffset == 16)) || (size == SubRegSize::i64Bit && (PostOffset == 32)),\n                       \"Post-index offset needs to match number of elements times their size\");\n\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, false, 4>(Op, Opcode, rt, Index, rn, Reg::r31);\n  }\n  template<SubRegSize size>\n  void ld1(VRegister rt, uint32_t Index, Register rn, Register rm) {\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, true, 1>(Op, Opcode, rt, Index, rn, rm);\n  }\n  template<SubRegSize size>\n  void ld1(VRegister rt, uint32_t Index, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT((size == SubRegSize::i8Bit && (PostOffset == 1)) || (size == SubRegSize::i16Bit && (PostOffset == 2)) ||\n                         (size == SubRegSize::i32Bit && (PostOffset == 4)) || (size == SubRegSize::i64Bit && (PostOffset == 8)),\n                       \"Post-index offset needs to match number of elements times their size\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, true, 1>(Op, Opcode, rt, Index, rn, Reg::r31);\n  }\n  template<SubRegSize size>\n  void ld1r(VRegister rt, Register rn, Register rm) {\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode = 0b110;\n    ASIMDSTLD<size, true, 1>(Op, Opcode, rt, 0, rn, rm);\n  }\n  template<SubRegSize size>\n  void ld1r(VRegister rt, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT((size == SubRegSize::i8Bit && (PostOffset == 1)) || (size == SubRegSize::i16Bit && (PostOffset == 2)) ||\n                         (size == SubRegSize::i32Bit && (PostOffset == 4)) || (size == SubRegSize::i64Bit && (PostOffset == 8)),\n                       \"Post-index offset needs to match number of elements times their size\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode = 0b110;\n    ASIMDSTLD<size, true, 1>(Op, Opcode, rt, 0, rn, Reg::r31);\n  }\n  template<SubRegSize size>\n  void ld2(VRegister rt, VRegister rt2, uint32_t Index, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, true, 2>(Op, Opcode, rt, Index, rn, rm);\n  }\n  template<SubRegSize size>\n  void ld2(VRegister rt, uint32_t Index, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT((size == SubRegSize::i8Bit && (PostOffset == 2)) || (size == SubRegSize::i16Bit && (PostOffset == 4)) ||\n                         (size == SubRegSize::i32Bit && (PostOffset == 8)) || (size == SubRegSize::i64Bit && (PostOffset == 16)),\n                       \"Post-index offset needs to match number of elements times their size\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, true, 2>(Op, Opcode, rt, Index, rn, Reg::r31);\n  }\n  template<SubRegSize size>\n  void ld2r(VRegister rt, VRegister rt2, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode = 0b110;\n    ASIMDSTLD<size, true, 2>(Op, Opcode, rt, 0, rn, rm);\n  }\n  template<SubRegSize size>\n  void ld2r(VRegister rt, VRegister rt2, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    LOGMAN_THROW_A_FMT((size == SubRegSize::i8Bit && (PostOffset == 2)) || (size == SubRegSize::i16Bit && (PostOffset == 4)) ||\n                         (size == SubRegSize::i32Bit && (PostOffset == 8)) || (size == SubRegSize::i64Bit && (PostOffset == 16)),\n                       \"Post-index offset needs to match number of elements times their size\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode = 0b110;\n    ASIMDSTLD<size, true, 2>(Op, Opcode, rt, 0, rn, Reg::r31);\n  }\n  template<SubRegSize size>\n  void ld3(VRegister rt, VRegister rt2, VRegister rt3, uint32_t Index, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, true, 3>(Op, Opcode, rt, Index, rn, rm);\n  }\n  template<SubRegSize size>\n  void ld3(VRegister rt, uint32_t Index, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT((size == SubRegSize::i8Bit && (PostOffset == 3)) || (size == SubRegSize::i16Bit && (PostOffset == 6)) ||\n                         (size == SubRegSize::i32Bit && (PostOffset == 12)) || (size == SubRegSize::i64Bit && (PostOffset == 16)),\n                       \"Post-index offset needs to match number of elements times their size\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, true, 3>(Op, Opcode, rt, Index, rn, Reg::r31);\n  }\n  template<SubRegSize size>\n  void ld3r(VRegister rt, VRegister rt2, VRegister rt3, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode = 0b110;\n    ASIMDSTLD<size, true, 3>(Op, Opcode, rt, 0, rn, rm);\n  }\n  template<SubRegSize size>\n  void ld3r(VRegister rt, VRegister rt2, VRegister rt3, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    LOGMAN_THROW_A_FMT((size == SubRegSize::i8Bit && (PostOffset == 3)) || (size == SubRegSize::i16Bit && (PostOffset == 6)) ||\n                         (size == SubRegSize::i32Bit && (PostOffset == 12)) || (size == SubRegSize::i64Bit && (PostOffset == 16)),\n                       \"Post-index offset needs to match number of elements times their size\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode = 0b110;\n    ASIMDSTLD<size, true, 3>(Op, Opcode, rt, 0, rn, Reg::r31);\n  }\n  template<SubRegSize size>\n  void ld4(VRegister rt, VRegister rt2, VRegister rt3, VRegister rt4, uint32_t Index, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, true, 4>(Op, Opcode, rt, Index, rn, rm);\n  }\n  template<SubRegSize size>\n  void ld4(VRegister rt, uint32_t Index, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT((size == SubRegSize::i8Bit && (PostOffset == 4)) || (size == SubRegSize::i16Bit && (PostOffset == 8)) ||\n                         (size == SubRegSize::i32Bit && (PostOffset == 16)) || (size == SubRegSize::i64Bit && (PostOffset == 32)),\n                       \"Post-index offset needs to match number of elements times their size\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode =\n        size == SubRegSize::i8Bit  ? 0b000 : // Scale = 0\n        size == SubRegSize::i16Bit ? 0b010 : // Scale = 1\n        size == SubRegSize::i32Bit ? 0b100 : // Scale = 2\n        size == SubRegSize::i64Bit ? 0b100 : // Scale = 2 (Uses size to determine difference between 32-bit).\n        0;\n    ASIMDSTLD<size, true, 4>(Op, Opcode, rt, Index, rn, Reg::r31);\n  }\n  template<SubRegSize size>\n  void ld4r(VRegister rt, VRegister rt2, VRegister rt3, VRegister rt4, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode = 0b110;\n    ASIMDSTLD<size, true, 4>(Op, Opcode, rt, 0, rn, rm);\n  }\n  template<SubRegSize size>\n  void ld4r(VRegister rt, VRegister rt2, VRegister rt3, VRegister rt4, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    LOGMAN_THROW_A_FMT((size == SubRegSize::i8Bit && (PostOffset == 4)) || (size == SubRegSize::i16Bit && (PostOffset == 8)) ||\n                         (size == SubRegSize::i32Bit && (PostOffset == 16)) || (size == SubRegSize::i64Bit && (PostOffset == 32)),\n                       \"Post-index offset needs to match number of elements times their size\");\n    constexpr uint32_t Op = 0b0000'1101'100 << 21;\n    constexpr uint32_t Opcode = 0b110;\n    ASIMDSTLD<size, true, 4>(Op, Opcode, rt, 0, rn, Reg::r31);\n  }\n\n  // Advanced SIMD load/store single structure (post-indexed)\n  template<typename T>\n  void st1(ARMEmitter::SubRegSize size, T rt, uint32_t Index, ARMEmitter::Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    LOGMAN_THROW_A_FMT((PostOffset * 8) == SubRegSizeInBits(size), \"Post-Index size must match element size\");\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 0;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b000;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b010;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b100;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b100;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 0, R, opcode, S, Size, ARMEmitter::Reg::r31, rn, rt.Q());\n  }\n  template<typename T>\n  void ld1(ARMEmitter::SubRegSize size, T rt, uint32_t Index, ARMEmitter::Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    LOGMAN_THROW_A_FMT((PostOffset * 8) == SubRegSizeInBits(size), \"Post-Index size must match element size\");\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 0;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b001;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b011;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b100;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b101;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 1, R, opcode, S, Size, ARMEmitter::Reg::r31, rn, rt.Q());\n  }\n  template<typename T>\n  void ld1r(ARMEmitter::SubRegSize size, T rt, ARMEmitter::Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(PostOffset == 1 || PostOffset == 2 || PostOffset == 4 || PostOffset == 8, \"Index too large\");\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    constexpr uint32_t Q = std::is_same_v<ARMEmitter::QRegister, T> ? 1 : 0;\n    uint32_t R = 0;\n    uint32_t opcode = 0b110;\n    uint32_t S = 0;\n    uint32_t Size = FEXCore::ToUnderlying(size);\n    ASIMDLoadStoreSinglePost<T>(Op, Q, 1, R, opcode, S, Size, ARMEmitter::Reg::r31, rn, rt);\n  }\n\n  template<typename T>\n  void ld2r(SubRegSize size, T rt, T rt2, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    LOGMAN_THROW_A_FMT(PostOffset == 2 || PostOffset == 4 || PostOffset == 8 || PostOffset == 16, \"Index too large\");\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    constexpr uint32_t Q = std::is_same_v<QRegister, T> ? 1 : 0;\n    uint32_t R = 1;\n    uint32_t opcode = 0b110;\n    uint32_t S = 0;\n    uint32_t Size = FEXCore::ToUnderlying(size);\n    ASIMDLoadStoreSinglePost<T>(Op, Q, 1, R, opcode, S, Size, Reg::r31, rn, rt);\n  }\n\n  template<typename T>\n  void ld3r(SubRegSize size, T rt, T rt2, T rt3, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    LOGMAN_THROW_A_FMT(PostOffset == 3 || PostOffset == 6 || PostOffset == 12 || PostOffset == 24, \"Index too large\");\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    constexpr uint32_t Q = std::is_same_v<QRegister, T> ? 1 : 0;\n    uint32_t R = 0;\n    uint32_t opcode = 0b111;\n    uint32_t S = 0;\n    uint32_t Size = FEXCore::ToUnderlying(size);\n    ASIMDLoadStoreSinglePost<T>(Op, Q, 1, R, opcode, S, Size, Reg::r31, rn, rt);\n  }\n  template<typename T>\n  void ld4r(SubRegSize size, T rt, T rt2, T rt3, T rt4, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    LOGMAN_THROW_A_FMT(PostOffset == 4 || PostOffset == 8 || PostOffset == 16 || PostOffset == 32, \"Index too large\");\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    constexpr uint32_t Q = std::is_same_v<QRegister, T> ? 1 : 0;\n    uint32_t R = 1;\n    uint32_t opcode = 0b111;\n    uint32_t S = 0;\n    uint32_t Size = FEXCore::ToUnderlying(size);\n    ASIMDLoadStoreSinglePost<T>(Op, Q, 1, R, opcode, S, Size, Reg::r31, rn, rt);\n  }\n\n  template<typename T>\n  void st2(SubRegSize size, T rt, T rt2, uint32_t Index, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    LOGMAN_THROW_A_FMT((PostOffset * 8) == (SubRegSizeInBits(size) * 2), \"Post-Index size must match element size\");\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 1;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b000;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b010;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b100;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b100;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 0, R, opcode, S, Size, Reg::r31, rn, rt.Q());\n  }\n  template<typename T>\n  void ld2(SubRegSize size, T rt, T rt2, uint32_t Index, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    LOGMAN_THROW_A_FMT((PostOffset * 8) == (SubRegSizeInBits(size) * 2), \"Post-Index size must match element size\");\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 1;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b000;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b010;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b100;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b100;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 1, R, opcode, S, Size, Reg::r31, rn, rt.Q());\n  }\n  template<typename T>\n  void st3(SubRegSize size, T rt, T rt2, T rt3, uint32_t Index, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    LOGMAN_THROW_A_FMT((PostOffset * 8) == (SubRegSizeInBits(size) * 3), \"Post-Index size must match element size\");\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 0;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b001;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b011;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b101;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b101;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 0, R, opcode, S, Size, Reg::r31, rn, rt.Q());\n  }\n  template<typename T>\n  void ld3(SubRegSize size, T rt, T rt2, T rt3, uint32_t Index, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    LOGMAN_THROW_A_FMT((PostOffset * 8) == (SubRegSizeInBits(size) * 3), \"Post-Index size must match element size\");\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 0;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b001;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b011;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b101;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b101;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 1, R, opcode, S, Size, Reg::r31, rn, rt.Q());\n  }\n  template<typename T>\n  void st4(SubRegSize size, T rt, T rt2, T rt3, T rt4, uint32_t Index, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    LOGMAN_THROW_A_FMT((PostOffset * 8) == (SubRegSizeInBits(size) * 4), \"Post-Index size must match element size\");\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 1;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b001;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b011;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b101;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b101;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 0, R, opcode, S, Size, Reg::r31, rn, rt.Q());\n  }\n  template<typename T>\n  void ld4(SubRegSize size, T rt, T rt2, T rt3, T rt4, uint32_t Index, Register rn, uint32_t PostOffset) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    LOGMAN_THROW_A_FMT((PostOffset * 8) == (SubRegSizeInBits(size) * 4), \"Post-Index size must match element size\");\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 1;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b001;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b011;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b101;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b101;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 1, R, opcode, S, Size, Reg::r31, rn, rt.Q());\n  }\n\n  template<typename T>\n  void st1(ARMEmitter::SubRegSize size, T rt, uint32_t Index, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 0;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b000;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b010;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b100;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b100;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 0, R, opcode, S, Size, rm, rn, rt.Q());\n  }\n  template<typename T>\n  void ld1(ARMEmitter::SubRegSize size, T rt, uint32_t Index, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 0;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b001;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b011;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b100;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b101;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 1, R, opcode, S, Size, rm, rn, rt.Q());\n  }\n  template<typename T>\n  void ld1r(SubRegSize size, T rt, Register rn, Register rm) {\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    constexpr uint32_t Q = std::is_same_v<QRegister, T> ? 1 : 0;\n    uint32_t R = 0;\n    uint32_t opcode = 0b110;\n    uint32_t S = 0;\n    uint32_t Size = FEXCore::ToUnderlying(size);\n    ASIMDLoadStoreSinglePost<T>(Op, Q, 1, R, opcode, S, Size, rm, rn, rt);\n  }\n\n  template<typename T>\n  void ld2r(SubRegSize size, T rt, T rt2, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    constexpr uint32_t Q = std::is_same_v<QRegister, T> ? 1 : 0;\n    uint32_t R = 1;\n    uint32_t opcode = 0b110;\n    uint32_t S = 0;\n    uint32_t Size = FEXCore::ToUnderlying(size);\n    ASIMDLoadStoreSinglePost<T>(Op, Q, 1, R, opcode, S, Size, rm, rn, rt);\n  }\n\n  template<typename T>\n  void ld3r(SubRegSize size, T rt, T rt2, T rt3, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    constexpr uint32_t Q = std::is_same_v<QRegister, T> ? 1 : 0;\n    uint32_t R = 0;\n    uint32_t opcode = 0b111;\n    uint32_t S = 0;\n    uint32_t Size = FEXCore::ToUnderlying(size);\n    ASIMDLoadStoreSinglePost<T>(Op, Q, 1, R, opcode, S, Size, rm, rn, rt);\n  }\n  template<typename T>\n  void ld4r(SubRegSize size, T rt, T rt2, T rt3, T rt4, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    constexpr uint32_t Q = std::is_same_v<QRegister, T> ? 1 : 0;\n    uint32_t R = 1;\n    uint32_t opcode = 0b111;\n    uint32_t S = 0;\n    uint32_t Size = FEXCore::ToUnderlying(size);\n    ASIMDLoadStoreSinglePost<T>(Op, Q, 1, R, opcode, S, Size, rm, rn, rt);\n  }\n\n  template<typename T>\n  void st2(SubRegSize size, T rt, T rt2, uint32_t Index, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 1;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b000;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b010;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b100;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b100;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 0, R, opcode, S, Size, rm, rn, rt.Q());\n  }\n  template<typename T>\n  void ld2(SubRegSize size, T rt, T rt2, uint32_t Index, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2), \"rt and rt2 must be sequential\");\n\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 1;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b000;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b010;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b100;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b100;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 1, R, opcode, S, Size, rm, rn, rt.Q());\n  }\n  template<typename T>\n  void st3(SubRegSize size, T rt, T rt2, T rt3, uint32_t Index, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 0;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b001;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b011;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b101;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b101;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 0, R, opcode, S, Size, rm, rn, rt.Q());\n  }\n  template<typename T>\n  void ld3(SubRegSize size, T rt, T rt2, T rt3, uint32_t Index, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3), \"rt, rt2, and rt3 must be sequential\");\n\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 0;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b001;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b011;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b101;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b101;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 1, R, opcode, S, Size, rm, rn, rt.Q());\n  }\n  template<typename T>\n  void st4(SubRegSize size, T rt, T rt2, T rt3, T rt4, uint32_t Index, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 1;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b001;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b011;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b101;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b101;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 0, R, opcode, S, Size, rm, rn, rt.Q());\n  }\n  template<typename T>\n  void ld4(SubRegSize size, T rt, T rt2, T rt3, T rt4, uint32_t Index, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit,\n                       \"Incorrect size\");\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(rt, rt2, rt3, rt4), \"rt, rt2, rt3, and rt4 must be sequential\");\n\n    constexpr uint32_t Op = 0b0000'1101'1 << 23;\n    uint32_t Q;\n    uint32_t R = 1;\n    uint32_t opcode;\n    uint32_t S;\n    uint32_t Size;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(Index < 16, \"Index too large\");\n      Q = Index >> 3;\n      S = (Index >> 2) & 1;\n      opcode = 0b001;\n      Size = Index & 0b11;\n    } else if (size == SubRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(Index < 8, \"Index too large\");\n      Q = Index >> 2;\n      S = (Index >> 1) & 1;\n      opcode = 0b011;\n      Size = (Index & 0b1) << 1;\n    } else if (size == SubRegSize::i32Bit) {\n      LOGMAN_THROW_A_FMT(Index < 4, \"Index too large\");\n      Q = Index >> 1;\n      S = Index & 1;\n      opcode = 0b101;\n      Size = 0b00;\n    } else if (size == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(Index < 2, \"Index too large\");\n      Q = Index;\n      S = 0;\n      opcode = 0b101;\n      Size = 0b01;\n    } else {\n      LOGMAN_MSG_A_FMT(\"Unknown size\");\n      FEX_UNREACHABLE;\n    }\n\n    ASIMDLoadStoreSinglePost(Op, Q, 1, R, opcode, S, Size, rm, rn, rt.Q());\n  }\n\n  template<ARMEmitter::SubRegSize size, typename T>\n  void st1(T rt, uint32_t Index, ARMEmitter::Register rn, uint32_t PostOffset) {\n    st1(size, rt, Index, rn, PostOffset);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld1(T rt, uint32_t Index, ARMEmitter::Register rn, uint32_t PostOffset) {\n    ld1(size, rt, Index, rn, PostOffset);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld1r(T rt, ARMEmitter::Register rn, uint32_t PostOffset) {\n    ld1r(size, rt, rn, PostOffset);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld2r(T rt, T rt2, ARMEmitter::Register rn, uint32_t PostOffset) {\n    ld2r(size, rt, rt2, rn, PostOffset);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld3r(T rt, T rt2, T rt3, ARMEmitter::Register rn, uint32_t PostOffset) {\n    ld3r(size, rt, rt2, rt3, rn, PostOffset);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld4r(T rt, T rt2, T rt3, T rt4, ARMEmitter::Register rn, uint32_t PostOffset) {\n    ld4r(size, rt, rt2, rt3, rt4, rn, PostOffset);\n  }\n\n  template<ARMEmitter::SubRegSize size, typename T>\n  void st2(T rt, T rt2, uint32_t Index, ARMEmitter::Register rn, uint32_t PostOffset) {\n    st2(size, rt, rt2, Index, rn, PostOffset);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld2(T rt, T rt2, uint32_t Index, ARMEmitter::Register rn, uint32_t PostOffset) {\n    ld2(size, rt, rt2, Index, rn, PostOffset);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void st3(T rt, T rt2, T rt3, uint32_t Index, ARMEmitter::Register rn, uint32_t PostOffset) {\n    st3(size, rt, rt2, rt3, Index, rn, PostOffset);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld3(T rt, T rt2, T rt3, uint32_t Index, ARMEmitter::Register rn, uint32_t PostOffset) {\n    ld3(size, rt, rt2, rt3, Index, rn, PostOffset);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void st4(T rt, T rt2, T rt3, T rt4, uint32_t Index, ARMEmitter::Register rn, uint32_t PostOffset) {\n    st4(size, rt, rt2, rt3, rt4, Index, rn, PostOffset);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld4(T rt, T rt2, T rt3, T rt4, uint32_t Index, ARMEmitter::Register rn, uint32_t PostOffset) {\n    ld4(size, rt, rt2, rt3, rt4, Index, rn, PostOffset);\n  }\n\n  template<ARMEmitter::SubRegSize size, typename T>\n  void st1(T rt, uint32_t Index, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    st1(size, rt, Index, rn, rm);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld1(T rt, uint32_t Index, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    ld1(size, rt, Index, rn, rm);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld1r(T rt, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    ld1r(size, rt, rn, rm);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld2r(T rt, T rt2, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    ld2r(size, rt, rt2, rn, rm);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld3r(T rt, T rt2, T rt3, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    ld3r(size, rt, rt2, rt3, rn, rm);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld4r(T rt, T rt2, T rt3, T rt4, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    ld4r(size, rt, rt2, rt3, rt4, rn, rm);\n  }\n\n  template<ARMEmitter::SubRegSize size, typename T>\n  void st2(T rt, T rt2, uint32_t Index, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    st2(size, rt, rt2, Index, rn, rm);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld2(T rt, T rt2, uint32_t Index, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    ld2(size, rt, rt2, Index, rn, rm);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void st3(T rt, T rt2, T rt3, uint32_t Index, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    st3(size, rt, rt2, rt3, Index, rn, rm);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld3(T rt, T rt2, T rt3, uint32_t Index, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    ld3(size, rt, rt2, rt3, Index, rn, rm);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void st4(T rt, T rt2, T rt3, T rt4, uint32_t Index, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    st4(size, rt, rt2, rt3, rt4, Index, rn, rm);\n  }\n  template<ARMEmitter::SubRegSize size, typename T>\n  void ld4(T rt, T rt2, T rt3, T rt4, uint32_t Index, ARMEmitter::Register rn, ARMEmitter::Register rm) {\n    ld4(size, rt, rt2, rt3, rt4, Index, rn, rm);\n  }\n\n  template<typename T>\n  void ASIMDLoadStoreSinglePost(uint32_t Op, uint32_t Q, uint32_t L, uint32_t R, uint32_t opcode, uint32_t S, uint32_t size,\n                                ARMEmitter::Register rm, ARMEmitter::Register rn, T rt) {\n    LOGMAN_THROW_A_FMT((std::is_same_v<ARMEmitter::QRegister, T> || std::is_same_v<ARMEmitter::DRegister, T>), \"Only supports 128-bit and \"\n                                                                                                               \"64-bit vector registers.\");\n    uint32_t Instr = Op;\n\n    Instr |= Q << 30;\n    Instr |= L << 22;\n    Instr |= R << 21;\n    Instr |= Encode_rm(rm);\n    Instr |= opcode << 13;\n    Instr |= S << 12;\n    Instr |= size << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rt(rt);\n    dc32(Instr);\n  }\n  // Loadstore exclusive pair\n  void stxp(ARMEmitter::Size s, ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rt2, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b1000'1000'001 << 21;\n    AtomicOp(Op, s, 0, 0, rs, rt, rt2, rn);\n  }\n  void stlxp(ARMEmitter::Size s, ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rt2, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b1000'1000'001 << 21;\n    AtomicOp(Op, s, 0, 1, rs, rt, rt2, rn);\n  }\n  void ldxp(ARMEmitter::Size s, ARMEmitter::Register rt, ARMEmitter::Register rt2, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b1000'1000'001 << 21;\n    AtomicOp(Op, s, 1, 0, ARMEmitter::Reg::r31, rt, rt2, rn);\n  }\n  void ldaxp(ARMEmitter::Size s, ARMEmitter::Register rt, ARMEmitter::Register rt2, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b1000'1000'001 << 21;\n    AtomicOp(Op, s, 1, 1, ARMEmitter::Reg::r31, rt, rt2, rn);\n  }\n  // Loadstore exclusive register\n  void stxrb(ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i8Bit, 0, 0, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void stlxrb(ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i8Bit, 0, 1, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void ldxrb(ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i8Bit, 1, 0, ARMEmitter::Reg::r31, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void ldaxrb(ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i8Bit, 1, 1, ARMEmitter::Reg::r31, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void stxrh(ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i16Bit, 0, 0, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void stlxrh(ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i16Bit, 0, 1, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void ldxrh(ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i16Bit, 1, 0, ARMEmitter::Reg::r31, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void ldaxrh(ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i16Bit, 1, 1, ARMEmitter::Reg::r31, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void stxr(ARMEmitter::WRegister rs, ARMEmitter::WRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i32Bit, 0, 0, rs, rt, ARMEmitter::WReg::w31, rn);\n  }\n  void stlxr(ARMEmitter::WRegister rs, ARMEmitter::WRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i32Bit, 0, 1, rs, rt, ARMEmitter::WReg::w31, rn);\n  }\n  void ldxr(ARMEmitter::WRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i32Bit, 1, 0, ARMEmitter::WReg::w31, rt, ARMEmitter::WReg::w31, rn);\n  }\n  void ldaxr(ARMEmitter::WRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i32Bit, 1, 1, ARMEmitter::WReg::w31, rt, ARMEmitter::WReg::w31, rn);\n  }\n  void stxr(ARMEmitter::XRegister rs, ARMEmitter::XRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i64Bit, 0, 0, rs, rt, ARMEmitter::XReg::x31, rn);\n  }\n  void stlxr(ARMEmitter::WRegister rs, ARMEmitter::XRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i64Bit, 0, 1, rs.R(), rt.R(), ARMEmitter::Reg::r31, rn);\n  }\n  void ldxr(ARMEmitter::XRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i64Bit, 1, 0, ARMEmitter::XReg::x31, rt, ARMEmitter::XReg::x31, rn);\n  }\n  void ldaxr(ARMEmitter::XRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i64Bit, 1, 1, ARMEmitter::XReg::x31, rt, ARMEmitter::XReg::x31, rn);\n  }\n  void stxr(ARMEmitter::SubRegSize size, ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, size, 0, 0, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void stlxr(ARMEmitter::SubRegSize size, ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, size, 0, 1, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void ldxr(ARMEmitter::SubRegSize size, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, size, 1, 0, ARMEmitter::Reg::r31, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void ldaxr(ARMEmitter::SubRegSize size, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'000 << 21;\n    SubAtomicOp(Op, size, 1, 1, ARMEmitter::Reg::r31, rt, ARMEmitter::Reg::r31, rn);\n  }\n\n  // Load/store ordered\n  static constexpr uint32_t LoadStoreOrdered_Op = 0b0000'1000'100 << 21;\n  void stllrb(ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i8Bit, 0, 0, ARMEmitter::Reg::r31, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void stlrb(ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i8Bit, 0, 1, ARMEmitter::Reg::r31, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void ldlarb(ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i8Bit, 1, 0, ARMEmitter::Reg::r31, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void ldarb(ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i8Bit, 1, 1, ARMEmitter::Reg::r31, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void stllrh(ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i16Bit, 0, 0, ARMEmitter::Reg::r31, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void stlrh(ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i16Bit, 0, 1, ARMEmitter::Reg::r31, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void ldlarh(ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i16Bit, 1, 0, ARMEmitter::Reg::r31, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void ldarh(ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i16Bit, 1, 1, ARMEmitter::Reg::r31, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void stllr(ARMEmitter::WRegister rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i32Bit, 0, 0, ARMEmitter::WReg::w31, rt, ARMEmitter::WReg::w31, rn);\n  }\n  void stlr(ARMEmitter::WRegister rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i32Bit, 0, 1, ARMEmitter::WReg::w31, rt, ARMEmitter::WReg::w31, rn);\n  }\n  void ldlar(ARMEmitter::WRegister rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i32Bit, 1, 0, ARMEmitter::WReg::w31, rt, ARMEmitter::WReg::w31, rn);\n  }\n  void ldar(ARMEmitter::WRegister rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i32Bit, 1, 1, ARMEmitter::WReg::w31, rt, ARMEmitter::WReg::w31, rn);\n  }\n  void stllr(ARMEmitter::XRegister rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i64Bit, 0, 0, ARMEmitter::XReg::x31, rt, ARMEmitter::XReg::x31, rn);\n  }\n  void stlr(ARMEmitter::XRegister rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i64Bit, 0, 1, ARMEmitter::XReg::x31, rt, ARMEmitter::XReg::x31, rn);\n  }\n  void ldlar(ARMEmitter::XRegister rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i64Bit, 1, 0, ARMEmitter::XReg::x31, rt, ARMEmitter::XReg::x31, rn);\n  }\n  void ldar(ARMEmitter::XRegister rt, ARMEmitter::Register rn) {\n    SubAtomicOp(LoadStoreOrdered_Op, ARMEmitter::SubRegSize::i64Bit, 1, 1, ARMEmitter::XReg::x31, rt, ARMEmitter::XReg::x31, rn);\n  }\n  // Compare and swap\n  void casb(ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i8Bit, 0, 0, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void caslb(ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i8Bit, 0, 1, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void casab(ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i8Bit, 1, 0, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void casalb(ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i8Bit, 1, 1, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void cash(ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i16Bit, 0, 0, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void caslh(ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i16Bit, 0, 1, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void casah(ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i16Bit, 1, 0, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void casalh(ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i16Bit, 1, 1, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void cas(ARMEmitter::WRegister rs, ARMEmitter::WRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i32Bit, 0, 0, rs.R(), rt.R(), ARMEmitter::Reg::r31, rn);\n  }\n  void casl(ARMEmitter::WRegister rs, ARMEmitter::WRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i32Bit, 0, 1, rs.R(), rt.R(), ARMEmitter::Reg::r31, rn);\n  }\n  void casa(ARMEmitter::WRegister rs, ARMEmitter::WRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i32Bit, 1, 0, rs.R(), rt.R(), ARMEmitter::Reg::r31, rn);\n  }\n  void casal(ARMEmitter::WRegister rs, ARMEmitter::WRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i32Bit, 1, 1, rs.R(), rt.R(), ARMEmitter::Reg::r31, rn);\n  }\n  void cas(ARMEmitter::XRegister rs, ARMEmitter::XRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i64Bit, 0, 0, rs.R(), rt.R(), ARMEmitter::Reg::r31, rn);\n  }\n  void casl(ARMEmitter::XRegister rs, ARMEmitter::XRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i64Bit, 0, 1, rs.R(), rt.R(), ARMEmitter::Reg::r31, rn);\n  }\n  void casa(ARMEmitter::XRegister rs, ARMEmitter::XRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i64Bit, 1, 0, rs.R(), rt.R(), ARMEmitter::Reg::r31, rn);\n  }\n  void casal(ARMEmitter::XRegister rs, ARMEmitter::XRegister rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, ARMEmitter::SubRegSize::i64Bit, 1, 1, rs.R(), rt.R(), ARMEmitter::Reg::r31, rn);\n  }\n\n  void cas(ARMEmitter::SubRegSize size, ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, size, 0, 0, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void casl(ARMEmitter::SubRegSize size, ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, size, 0, 1, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void casa(ARMEmitter::SubRegSize size, ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, size, 1, 0, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  void casal(ARMEmitter::SubRegSize size, ARMEmitter::Register rs, ARMEmitter::Register rt, ARMEmitter::Register rn) {\n    constexpr uint32_t Op = 0b0000'1000'101 << 21;\n    SubAtomicOp(Op, size, 1, 1, rs, rt, ARMEmitter::Reg::r31, rn);\n  }\n  // LDAPR/STLR unscaled immediate\n  void stlurb(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1001'000 << 21;\n    SubAtomicImm(Op, ARMEmitter::SubRegSize::i8Bit, 0b00, rt, rn, static_cast<uint32_t>(Imm) & 0x1'FF);\n  }\n  void ldapurb(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1001'000 << 21;\n    SubAtomicImm(Op, ARMEmitter::SubRegSize::i8Bit, 0b01, rt, rn, static_cast<uint32_t>(Imm) & 0x1'FF);\n  }\n  void ldapursb(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1001'000 << 21;\n    SubAtomicImm(Op, ARMEmitter::SubRegSize::i8Bit, 0b11, rt, rn, static_cast<uint32_t>(Imm) & 0x1'FF);\n  }\n  void ldapursb(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1001'000 << 21;\n    SubAtomicImm(Op, ARMEmitter::SubRegSize::i8Bit, 0b10, rt, rn, static_cast<uint32_t>(Imm) & 0x1'FF);\n  }\n  void stlurh(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1001'000 << 21;\n    SubAtomicImm(Op, ARMEmitter::SubRegSize::i16Bit, 0b00, rt, rn, static_cast<uint32_t>(Imm) & 0x1'FF);\n  }\n  void ldapurh(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1001'000 << 21;\n    SubAtomicImm(Op, ARMEmitter::SubRegSize::i16Bit, 0b01, rt, rn, static_cast<uint32_t>(Imm) & 0x1'FF);\n  }\n  void ldapursh(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1001'000 << 21;\n    SubAtomicImm(Op, ARMEmitter::SubRegSize::i16Bit, 0b11, rt, rn, static_cast<uint32_t>(Imm) & 0x1'FF);\n  }\n  void ldapursh(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1001'000 << 21;\n    SubAtomicImm(Op, ARMEmitter::SubRegSize::i16Bit, 0b10, rt, rn, static_cast<uint32_t>(Imm) & 0x1'FF);\n  }\n  void stlur(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1001'000 << 21;\n    SubAtomicImm(Op, ARMEmitter::SubRegSize::i32Bit, 0b00, rt, rn, static_cast<uint32_t>(Imm) & 0x1'FF);\n  }\n  void ldapur(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1001'000 << 21;\n    SubAtomicImm(Op, ARMEmitter::SubRegSize::i32Bit, 0b01, rt, rn, static_cast<uint32_t>(Imm) & 0x1'FF);\n  }\n  void ldapursw(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1001'000 << 21;\n    SubAtomicImm(Op, ARMEmitter::SubRegSize::i32Bit, 0b10, rt, rn, static_cast<uint32_t>(Imm) & 0x1'FF);\n  }\n  void stlur(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1001'000 << 21;\n    SubAtomicImm(Op, ARMEmitter::SubRegSize::i64Bit, 0b00, rt, rn, static_cast<uint32_t>(Imm) & 0x1'FF);\n  }\n  void ldapur(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1001'000 << 21;\n    SubAtomicImm(Op, ARMEmitter::SubRegSize::i64Bit, 0b01, rt, rn, static_cast<uint32_t>(Imm) & 0x1'FF);\n  }\n  // Load register literal\n  void ldr(ARMEmitter::WRegister rt, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1000 << 24;\n    LoadStoreLiteral(Op, rt, static_cast<uint32_t>(Imm >> 2) & 0x7'FFFF);\n  }\n  void ldr(ARMEmitter::SRegister rt, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1100 << 24;\n    LoadStoreLiteral(Op, rt, static_cast<uint32_t>(Imm >> 2) & 0x7'FFFF);\n  }\n  void ldr(ARMEmitter::XRegister rt, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0101'1000 << 24;\n    LoadStoreLiteral(Op, rt, static_cast<uint32_t>(Imm >> 2) & 0x7'FFFF);\n  }\n  void ldr(ARMEmitter::DRegister rt, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0101'1100 << 24;\n    LoadStoreLiteral(Op, rt, static_cast<uint32_t>(Imm >> 2) & 0x7'FFFF);\n  }\n  void ldrs(ARMEmitter::WRegister rt, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b1001'1000 << 24;\n    LoadStoreLiteral(Op, rt, static_cast<uint32_t>(Imm >> 2) & 0x7'FFFF);\n  }\n  void ldr(ARMEmitter::QRegister rt, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b1001'1100 << 24;\n    LoadStoreLiteral(Op, rt, static_cast<uint32_t>(Imm >> 2) & 0x7'FFFF);\n  }\n  void prfm(ARMEmitter::Prefetch prfop, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b1101'1000 << 24;\n    LoadStoreLiteral(Op, prfop, static_cast<uint32_t>(Imm >> 2) & 0x7'FFFF);\n  }\n  void ldr(ARMEmitter::WRegister rt, const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n    LOGMAN_THROW_A_FMT(Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1000 << 24;\n    LoadStoreLiteral(Op, rt, static_cast<uint32_t>(Imm >> 2) & 0x7'FFFF);\n  }\n  void ldr(ARMEmitter::SRegister rt, const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n    LOGMAN_THROW_A_FMT(Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0001'1100 << 24;\n    LoadStoreLiteral(Op, rt, static_cast<uint32_t>(Imm >> 2) & 0x7'FFFF);\n  }\n  void ldr(ARMEmitter::XRegister rt, const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n    LOGMAN_THROW_A_FMT(Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0101'1000 << 24;\n    LoadStoreLiteral(Op, rt, static_cast<uint32_t>(Imm >> 2) & 0x7'FFFF);\n  }\n  void ldr(ARMEmitter::DRegister rt, const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n    LOGMAN_THROW_A_FMT(Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0101'1100 << 24;\n    LoadStoreLiteral(Op, rt, static_cast<uint32_t>(Imm >> 2) & 0x7'FFFF);\n  }\n  void ldrsw(ARMEmitter::XRegister rt, const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n    LOGMAN_THROW_A_FMT(Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b1001'1000 << 24;\n    LoadStoreLiteral(Op, rt, static_cast<uint32_t>(Imm >> 2) & 0x7'FFFF);\n  }\n  void ldr(ARMEmitter::QRegister rt, const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n    LOGMAN_THROW_A_FMT(Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b1001'1100 << 24;\n    LoadStoreLiteral(Op, rt, static_cast<uint32_t>(Imm >> 2) & 0x7'FFFF);\n  }\n  void prfm(ARMEmitter::Prefetch prfop, const BackwardLabel* Label) {\n    int32_t Imm = static_cast<int32_t>(Label->Location - GetCursorAddress<uint8_t*>());\n    LOGMAN_THROW_A_FMT(Imm >= -1048576 && Imm <= 1048575 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b1101'1000 << 24;\n    LoadStoreLiteral(Op, prfop, static_cast<uint32_t>(Imm >> 2) & 0x7'FFFF);\n  }\n\n  void ldr(ARMEmitter::WRegister rt, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::RELATIVE_LOAD});\n    constexpr uint32_t Op = 0b0001'1000 << 24;\n    LoadStoreLiteral(Op, rt, 0);\n  }\n\n  void ldr(ARMEmitter::SRegister rt, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::RELATIVE_LOAD});\n    constexpr uint32_t Op = 0b0001'1100 << 24;\n    LoadStoreLiteral(Op, rt, 0);\n  }\n\n  void ldr(ARMEmitter::XRegister rt, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::RELATIVE_LOAD});\n    constexpr uint32_t Op = 0b0101'1000 << 24;\n    LoadStoreLiteral(Op, rt, 0);\n  }\n\n  void ldr(ARMEmitter::DRegister rt, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::RELATIVE_LOAD});\n    constexpr uint32_t Op = 0b0101'1100 << 24;\n    LoadStoreLiteral(Op, rt, 0);\n  }\n\n  void ldrsw(ARMEmitter::XRegister rt, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::RELATIVE_LOAD});\n    constexpr uint32_t Op = 0b1001'1000 << 24;\n    LoadStoreLiteral(Op, rt, 0);\n  }\n\n  void ldr(ARMEmitter::QRegister rt, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::RELATIVE_LOAD});\n    constexpr uint32_t Op = 0b1001'1100 << 24;\n    LoadStoreLiteral(Op, rt, 0);\n  }\n\n  void prfm(ARMEmitter::Prefetch prfop, ForwardLabel* Label) {\n    AddLocationToLabel(Label, ForwardLabel::Reference {.Location = GetCursorAddress<uint8_t*>(), .Type = ForwardLabel::InstType::RELATIVE_LOAD});\n    constexpr uint32_t Op = 0b1101'1000 << 24;\n    LoadStoreLiteral(Op, prfop, 0);\n  }\n\n  void ldr(ARMEmitter::WRegister rt, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      ldr(rt, &Label->Backward);\n    } else {\n      ldr(rt, &Label->Forward);\n    }\n  }\n  void ldr(ARMEmitter::SRegister rt, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      ldr(rt, &Label->Backward);\n    } else {\n      ldr(rt, &Label->Forward);\n    }\n  }\n  void ldr(ARMEmitter::XRegister rt, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      ldr(rt, &Label->Backward);\n    } else {\n      ldr(rt, &Label->Forward);\n    }\n  }\n  void ldr(ARMEmitter::DRegister rt, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      ldr(rt, &Label->Backward);\n    } else {\n      ldr(rt, &Label->Forward);\n    }\n  }\n  void ldrs(ARMEmitter::WRegister rt, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      ldr(rt, &Label->Backward);\n    } else {\n      ldr(rt, &Label->Forward);\n    }\n  }\n  void ldr(ARMEmitter::QRegister rt, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      ldr(rt, &Label->Backward);\n    } else {\n      ldr(rt, &Label->Forward);\n    }\n  }\n  void prfm(ARMEmitter::Prefetch prfop, BiDirectionalLabel* Label) {\n    if (Label->Backward.Location) {\n      prfm(prfop, &Label->Backward);\n    } else {\n      prfm(prfop, &Label->Forward);\n    }\n  }\n\n  // Memory copy/set\n  void cpyfp(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b0000, rs, rn, rd);\n  }\n  void cpyfm(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b0000, rs, rn, rd);\n  }\n  void cpyfe(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b0000, rs, rn, rd);\n  }\n  void cpyfpwt(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b0001, rs, rn, rd);\n  }\n  void cpyfmwt(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b0001, rs, rn, rd);\n  }\n  void cpyfewt(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b0001, rs, rn, rd);\n  }\n  void cpyfprt(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b0010, rs, rn, rd);\n  }\n  void cpyfmrt(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b0010, rs, rn, rd);\n  }\n  void cpyfert(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b0010, rs, rn, rd);\n  }\n  void cpyfpt(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b0011, rs, rn, rd);\n  }\n  void cpyfmt(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b0011, rs, rn, rd);\n  }\n  void cpyfet(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b0011, rs, rn, rd);\n  }\n  void cpyfpwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b0100, rs, rn, rd);\n  }\n  void cpyfmwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b0100, rs, rn, rd);\n  }\n  void cpyfewn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b0100, rs, rn, rd);\n  }\n  void cpyfpwtwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b0101, rs, rn, rd);\n  }\n  void cpyfmwtwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b0101, rs, rn, rd);\n  }\n  void cpyfewtwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b0101, rs, rn, rd);\n  }\n  void cpyfprtwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b0110, rs, rn, rd);\n  }\n  void cpyfmrtwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b0110, rs, rn, rd);\n  }\n  void cpyfertwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b0110, rs, rn, rd);\n  }\n  void cpyfptwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b0111, rs, rn, rd);\n  }\n  void cpyfmtwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b0111, rs, rn, rd);\n  }\n  void cpyfetwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b0111, rs, rn, rd);\n  }\n  void cpyfprn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b1000, rs, rn, rd);\n  }\n  void cpyfmrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b1000, rs, rn, rd);\n  }\n  void cpyfern(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b1000, rs, rn, rd);\n  }\n  void cpyfpwtrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b1001, rs, rn, rd);\n  }\n  void cpyfmwtrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b1001, rs, rn, rd);\n  }\n  void cpyfewtrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b1001, rs, rn, rd);\n  }\n  void cpyfprtrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b1010, rs, rn, rd);\n  }\n  void cpyfmrtrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b1010, rs, rn, rd);\n  }\n  void cpyfertrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b1010, rs, rn, rd);\n  }\n  void cpyfptrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b1011, rs, rn, rd);\n  }\n  void cpyfmtrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b1011, rs, rn, rd);\n  }\n  void cpyfetrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b1011, rs, rn, rd);\n  }\n  void cpyfpn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b1100, rs, rn, rd);\n  }\n  void cpyfmn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b1100, rs, rn, rd);\n  }\n  void cpyfen(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b1100, rs, rn, rd);\n  }\n  void cpyfpwtn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b1101, rs, rn, rd);\n  }\n  void cpyfmwtn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b1101, rs, rn, rd);\n  }\n  void cpyfewtn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b1101, rs, rn, rd);\n  }\n  void cpyfprtn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b1110, rs, rn, rd);\n  }\n  void cpyfmrtn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b1110, rs, rn, rd);\n  }\n  void cpyfertn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b1110, rs, rn, rd);\n  }\n  void cpyfptn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b00, 0b1111, rs, rn, rd);\n  }\n  void cpyfmtn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b01, 0b1111, rs, rn, rd);\n  }\n  void cpyfetn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 0, 0b10, 0b1111, rs, rn, rd);\n  }\n\n  void setp(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 0, 0b11, 0b0000, rs, rn, rd);\n  }\n  void setm(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 0, 0b11, 0b0100, rs, rn, rd);\n  }\n  void sete(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 0, 0b11, 0b1000, rs, rn, rd);\n  }\n  void setpt(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 0, 0b11, 0b0001, rs, rn, rd);\n  }\n  void setmt(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 0, 0b11, 0b0101, rs, rn, rd);\n  }\n  void setet(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 0, 0b11, 0b1001, rs, rn, rd);\n  }\n  void setpn(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 0, 0b11, 0b0010, rs, rn, rd);\n  }\n  void setmn(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 0, 0b11, 0b0110, rs, rn, rd);\n  }\n  void seten(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 0, 0b11, 0b1010, rs, rn, rd);\n  }\n  void setptn(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 0, 0b11, 0b0011, rs, rn, rd);\n  }\n  void setmtn(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 0, 0b11, 0b0111, rs, rn, rd);\n  }\n  void setetn(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 0, 0b11, 0b1011, rs, rn, rd);\n  }\n\n  void cpyp(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b0000, rs, rn, rd);\n  }\n  void cpym(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b0000, rs, rn, rd);\n  }\n  void cpye(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b0000, rs, rn, rd);\n  }\n  void cpypwt(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b0001, rs, rn, rd);\n  }\n  void cpymwt(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b0001, rs, rn, rd);\n  }\n  void cpyewt(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b0001, rs, rn, rd);\n  }\n  void cpyprt(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b0010, rs, rn, rd);\n  }\n  void cpymrt(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b0010, rs, rn, rd);\n  }\n  void cpyert(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b0010, rs, rn, rd);\n  }\n  void cpypt(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b0011, rs, rn, rd);\n  }\n  void cpymt(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b0011, rs, rn, rd);\n  }\n  void cpyet(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b0011, rs, rn, rd);\n  }\n  void cpypwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b0100, rs, rn, rd);\n  }\n  void cpymwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b0100, rs, rn, rd);\n  }\n  void cpyewn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b0100, rs, rn, rd);\n  }\n  void cpypwtwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b0101, rs, rn, rd);\n  }\n  void cpymwtwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b0101, rs, rn, rd);\n  }\n  void cpyewtwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b0101, rs, rn, rd);\n  }\n  void cpyprtwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b0110, rs, rn, rd);\n  }\n  void cpymrtwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b0110, rs, rn, rd);\n  }\n  void cpyertwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b0110, rs, rn, rd);\n  }\n  void cpyptwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b0111, rs, rn, rd);\n  }\n  void cpymtwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b0111, rs, rn, rd);\n  }\n  void cpyetwn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b0111, rs, rn, rd);\n  }\n  void cpyprn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b1000, rs, rn, rd);\n  }\n  void cpymrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b1000, rs, rn, rd);\n  }\n  void cpyern(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b1000, rs, rn, rd);\n  }\n  void cpypwtrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b1001, rs, rn, rd);\n  }\n  void cpymwtrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b1001, rs, rn, rd);\n  }\n  void cpyewtrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b1001, rs, rn, rd);\n  }\n  void cpyprtrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b1010, rs, rn, rd);\n  }\n  void cpymrtrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b1010, rs, rn, rd);\n  }\n  void cpyertrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b1010, rs, rn, rd);\n  }\n  void cpyptrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b1011, rs, rn, rd);\n  }\n  void cpymtrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b1011, rs, rn, rd);\n  }\n  void cpyetrn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b1011, rs, rn, rd);\n  }\n  void cpypn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b1100, rs, rn, rd);\n  }\n  void cpymn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b1100, rs, rn, rd);\n  }\n  void cpyen(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b1100, rs, rn, rd);\n  }\n  void cpypwtn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b1101, rs, rn, rd);\n  }\n  void cpymwtn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b1101, rs, rn, rd);\n  }\n  void cpyewtn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b1101, rs, rn, rd);\n  }\n  void cpyprtn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b1110, rs, rn, rd);\n  }\n  void cpymrtn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b1110, rs, rn, rd);\n  }\n  void cpyertn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b1110, rs, rn, rd);\n  }\n  void cpyptn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b00, 0b1111, rs, rn, rd);\n  }\n  void cpymtn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b01, 0b1111, rs, rn, rd);\n  }\n  void cpyetn(Register rd, Register rs, Register rn) {\n    MemoryCopyAndMemorySet(0, 1, 0b10, 0b1111, rs, rn, rd);\n  }\n\n  void setgp(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 1, 0b11, 0b0000, rs, rn, rd);\n  }\n  void setgm(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 1, 0b11, 0b0100, rs, rn, rd);\n  }\n  void setge(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 1, 0b11, 0b1000, rs, rn, rd);\n  }\n  void setgpt(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 1, 0b11, 0b0001, rs, rn, rd);\n  }\n  void setgmt(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 1, 0b11, 0b0101, rs, rn, rd);\n  }\n  void setget(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 1, 0b11, 0b1001, rs, rn, rd);\n  }\n  void setgpn(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 1, 0b11, 0b0010, rs, rn, rd);\n  }\n  void setgmn(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 1, 0b11, 0b0110, rs, rn, rd);\n  }\n  void setgen(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 1, 0b11, 0b1010, rs, rn, rd);\n  }\n  void setgptn(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 1, 0b11, 0b0011, rs, rn, rd);\n  }\n  void setgmtn(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 1, 0b11, 0b0111, rs, rn, rd);\n  }\n  void setgetn(Register rd, Register rn, Register rs) {\n    MemoryCopyAndMemorySet(0, 1, 0b11, 0b1011, rs, rn, rd);\n  }\n\n  // Loadstore no-allocate pair\n  void stnp(ARMEmitter::WRegister rt, ARMEmitter::WRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 252 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0010'1000'00 << 22;\n    LoadStoreNoAllocate(Op, rt, rt2, rn, static_cast<uint32_t>(Imm >> 2) & 0b111'1111);\n  }\n  void ldnp(ARMEmitter::WRegister rt, ARMEmitter::WRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 252 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0010'1000'01 << 22;\n    LoadStoreNoAllocate(Op, rt, rt2, rn, static_cast<uint32_t>(Imm >> 2) & 0b111'1111);\n  }\n  void stnp(ARMEmitter::SRegister rt, ARMEmitter::SRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 252 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0010'1100'00 << 22;\n    LoadStoreNoAllocate(Op, rt, rt2, rn, static_cast<uint32_t>(Imm >> 2) & 0b111'1111);\n  }\n  void ldnp(ARMEmitter::SRegister rt, ARMEmitter::SRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 252 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0010'1100'01 << 22;\n    LoadStoreNoAllocate(Op, rt, rt2, rn, static_cast<uint32_t>(Imm >> 2) & 0b111'1111);\n  }\n  void stnp(ARMEmitter::XRegister rt, ARMEmitter::XRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -512 && Imm <= 504 && ((Imm & 0b111) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b1010'1000'00 << 22;\n    LoadStoreNoAllocate(Op, rt, rt2, rn, static_cast<uint32_t>(Imm >> 3) & 0b111'1111);\n  }\n  void ldnp(ARMEmitter::XRegister rt, ARMEmitter::XRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -512 && Imm <= 504 && ((Imm & 0b111) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b1010'1000'01 << 22;\n    LoadStoreNoAllocate(Op, rt, rt2, rn, static_cast<uint32_t>(Imm >> 3) & 0b111'1111);\n  }\n  void stnp(ARMEmitter::DRegister rt, ARMEmitter::DRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -512 && Imm <= 504 && ((Imm & 0b111) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0110'1100'00 << 22;\n    LoadStoreNoAllocate(Op, rt, rt2, rn, static_cast<uint32_t>(Imm >> 3) & 0b111'1111);\n  }\n  void ldnp(ARMEmitter::DRegister rt, ARMEmitter::DRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -512 && Imm <= 504 && ((Imm & 0b111) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b0110'1100'01 << 22;\n    LoadStoreNoAllocate(Op, rt, rt2, rn, static_cast<uint32_t>(Imm >> 3) & 0b111'1111);\n  }\n  void stnp(ARMEmitter::QRegister rt, ARMEmitter::QRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -1024 && Imm <= 1008 && ((Imm & 0b1111) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b1010'1100'00 << 22;\n    LoadStoreNoAllocate(Op, rt, rt2, rn, static_cast<uint32_t>(Imm >> 4) & 0b111'1111);\n  }\n  void ldnp(ARMEmitter::QRegister rt, ARMEmitter::QRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -1024 && Imm <= 1008 && ((Imm & 0b1111) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = 0b1010'1100'01 << 22;\n    LoadStoreNoAllocate(Op, rt, rt2, rn, static_cast<uint32_t>(Imm >> 4) & 0b111'1111);\n  }\n  // Loadstore register pair post-indexed\n  // Loadstore register pair offset\n  // Loadstore register pair pre-indexed\n  template<IndexType Index>\n  void stp(ARMEmitter::WRegister rt, ARMEmitter::WRegister rt2, ARMEmitter::Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 252 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = (0b0010'1000'00 << 22) | (Index == IndexType::POST   ? (0b01 << 23) :\n                                                      Index == IndexType::PRE    ? (0b11 << 23) :\n                                                      Index == IndexType::OFFSET ? (0b10 << 23) :\n                                                                                   -1);\n\n    LoadStorePair(Op, rt, rt2, rn, (Imm >> 2) & 0b111'1111);\n  }\n  template<IndexType Index>\n  void ldp(ARMEmitter::WRegister rt, ARMEmitter::WRegister rt2, ARMEmitter::Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 252 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = (0b0010'1000'01 << 22) | (Index == IndexType::POST   ? (0b01 << 23) :\n                                                      Index == IndexType::PRE    ? (0b11 << 23) :\n                                                      Index == IndexType::OFFSET ? (0b10 << 23) :\n                                                                                   -1);\n\n    LoadStorePair(Op, rt, rt2, rn, (Imm >> 2) & 0b111'1111);\n  }\n  template<IndexType Index>\n  void ldpsw(ARMEmitter::XRegister rt, ARMEmitter::XRegister rt2, ARMEmitter::Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 252 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = (0b0110'1000'01 << 22) | (Index == IndexType::POST   ? (0b01 << 23) :\n                                                      Index == IndexType::PRE    ? (0b11 << 23) :\n                                                      Index == IndexType::OFFSET ? (0b10 << 23) :\n                                                                                   -1);\n    LoadStorePair(Op, rt, rt2, rn, (Imm >> 2) & 0b111'1111);\n  }\n  template<IndexType Index>\n  void stp(ARMEmitter::XRegister rt, ARMEmitter::XRegister rt2, ARMEmitter::Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(Imm >= -512 && Imm <= 504 && ((Imm & 0b111) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = (0b1010'1000'00 << 22) | (Index == IndexType::POST   ? (0b01 << 23) :\n                                                      Index == IndexType::PRE    ? (0b11 << 23) :\n                                                      Index == IndexType::OFFSET ? (0b10 << 23) :\n                                                                                   -1);\n\n    LoadStorePair(Op, rt, rt2, rn, (Imm >> 3) & 0b111'1111);\n  }\n  template<IndexType Index>\n  void ldp(ARMEmitter::XRegister rt, ARMEmitter::XRegister rt2, ARMEmitter::Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(Imm >= -512 && Imm <= 504 && ((Imm & 0b111) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = (0b1010'1000'01 << 22) | (Index == IndexType::POST   ? (0b01 << 23) :\n                                                      Index == IndexType::PRE    ? (0b11 << 23) :\n                                                      Index == IndexType::OFFSET ? (0b10 << 23) :\n                                                                                   -1);\n\n    LoadStorePair(Op, rt, rt2, rn, (Imm >> 3) & 0b111'1111);\n  }\n  template<IndexType Index>\n  void stp(ARMEmitter::SRegister rt, ARMEmitter::SRegister rt2, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stp_w<Index>(rt.V(), rt2.V(), rn, Imm);\n  }\n  template<IndexType Index>\n  void ldp(ARMEmitter::SRegister rt, ARMEmitter::SRegister rt2, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldp_w<Index>(rt.V(), rt2.V(), rn, Imm);\n  }\n  template<IndexType Index>\n  void stp(ARMEmitter::DRegister rt, ARMEmitter::DRegister rt2, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stp_x<Index>(rt.V(), rt2.V(), rn, Imm);\n  }\n  template<IndexType Index>\n  void ldp(ARMEmitter::DRegister rt, ARMEmitter::DRegister rt2, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldp_x<Index>(rt.V(), rt2.V(), rn, Imm);\n  }\n  template<IndexType Index>\n  void stp(ARMEmitter::QRegister rt, ARMEmitter::QRegister rt2, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stp_q<Index>(rt.V(), rt2.V(), rn, Imm);\n  }\n  template<IndexType Index>\n  void ldp(ARMEmitter::QRegister rt, ARMEmitter::QRegister rt2, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldp_q<Index>(rt.V(), rt2.V(), rn, Imm);\n  }\n\n  // Loadstore register unscaled immediate\n  void sturb(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXrb<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void ldurb(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrb<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void sturb(ARMEmitter::VRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXrb<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void ldurb(ARMEmitter::VRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrb<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void ldursb(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrsb<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void ldursb(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrsb<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void sturh(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXrh<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void ldurh(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrh<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void sturh(ARMEmitter::VRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXrh<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void ldurh(ARMEmitter::VRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrh<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void ldursh(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrsh<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void ldursh(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrsh<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void stur(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXr<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void ldur(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXr<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void stur(ARMEmitter::SRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXr<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void ldur(ARMEmitter::SRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXr<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void ldursw(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrsw<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void stur(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXr<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void ldur(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXr<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void stur(ARMEmitter::DRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXr<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void ldur(ARMEmitter::DRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXr<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void stur(ARMEmitter::QRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXr<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  void ldur(ARMEmitter::QRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXr<IndexType::OFFSET>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  void prfum(ARMEmitter::Prefetch prfop, ARMEmitter::Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n    static_assert(Index == IndexType::OFFSET, \"Doesn't support another index type\");\n\n    constexpr uint32_t Op = 0b1111'1000'10 << 22;\n    constexpr uint32_t o2 = 0b00;\n\n    LoadStoreImm(Op, o2, prfop, rn, Imm);\n  }\n\n  // Loadstore register immediate post-indexed\n  // Loadstore register immediate pre-indexed\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void strb(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXrb<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void ldrb(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrb<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void strb(ARMEmitter::VRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXrb<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void ldrb(ARMEmitter::VRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrb<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void ldrsb(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrsb<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void ldrsb(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrsb<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void strh(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXrh<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void ldrh(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrh<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void strh(ARMEmitter::VRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXrh<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void ldrh(ARMEmitter::VRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrh<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void ldrsh(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrsh<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void ldrsh(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrsh<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void str(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXr<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void ldr(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXr<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void str(ARMEmitter::SRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXr<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void ldr(ARMEmitter::SRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXr<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void ldrsw(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrsw<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void str(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXr<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void ldr(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXr<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void str(ARMEmitter::DRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXr<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void ldr(ARMEmitter::DRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXr<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void str(ARMEmitter::QRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXr<Index>(rt, rn, Imm);\n  }\n  template<IndexType Index>\n  requires (Index == IndexType::POST || Index == IndexType::PRE)\n  void ldr(ARMEmitter::QRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXr<Index>(rt, rn, Imm);\n  }\n\n  // Loadstore register unprivileged\n  void sttrb(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXrb<IndexType::UNPRIVILEGED>(rt, rn, Imm);\n  }\n  void ldtrb(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrb<IndexType::UNPRIVILEGED>(rt, rn, Imm);\n  }\n  void ldtrsb(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrsb<IndexType::UNPRIVILEGED>(rt, rn, Imm);\n  }\n  void ldtrsb(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrsb<IndexType::UNPRIVILEGED>(rt, rn, Imm);\n  }\n  void sttrh(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXrh<IndexType::UNPRIVILEGED>(rt, rn, Imm);\n  }\n  void ldtrh(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrh<IndexType::UNPRIVILEGED>(rt, rn, Imm);\n  }\n  void ldtrsh(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrsh<IndexType::UNPRIVILEGED>(rt, rn, Imm);\n  }\n  void ldtrsh(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrsh<IndexType::UNPRIVILEGED>(rt, rn, Imm);\n  }\n  void sttr(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXr<IndexType::UNPRIVILEGED>(rt, rn, Imm);\n  }\n  void ldtr(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXr<IndexType::UNPRIVILEGED>(rt, rn, Imm);\n  }\n  void ldtrsw(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXrsw<IndexType::UNPRIVILEGED>(rt, rn, Imm);\n  }\n  void sttr(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    stXr<IndexType::UNPRIVILEGED>(rt, rn, Imm);\n  }\n  void ldtr(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm = 0) {\n    ldXr<IndexType::UNPRIVILEGED>(rt, rn, Imm);\n  }\n  // Atomic memory operations\n  void stadd(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 0, 0, 0b000, rs, Reg::zr, rn);\n  }\n  void staddl(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 1, 0, 0b000, rs, Reg::zr, rn);\n  }\n  void stadda(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 0, 0, 0b000, rs, Reg::zr, rn);\n  }\n  void staddal(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 1, 0, 0b000, rs, Reg::zr, rn);\n  }\n  void stclr(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 0, 0, 0b001, rs, Reg::zr, rn);\n  }\n  void stclrl(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 1, 0, 0b001, rs, Reg::zr, rn);\n  }\n  void stclra(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 0, 0, 0b001, rs, Reg::zr, rn);\n  }\n  void stclral(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 1, 0, 0b001, rs, Reg::zr, rn);\n  }\n  void stset(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 0, 0, 0b011, rs, Reg::zr, rn);\n  }\n  void stsetl(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 1, 0, 0b011, rs, Reg::zr, rn);\n  }\n  void stseta(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 0, 0, 0b011, rs, Reg::zr, rn);\n  }\n  void stsetal(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 1, 0, 0b011, rs, Reg::zr, rn);\n  }\n  void steor(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 0, 0, 0b010, rs, Reg::zr, rn);\n  }\n  void steorl(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 1, 0, 0b010, rs, Reg::zr, rn);\n  }\n  void steora(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 0, 0, 0b010, rs, Reg::zr, rn);\n  }\n  void steoral(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 1, 0, 0b010, rs, Reg::zr, rn);\n  }\n  void stsmax(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 0, 0, 0b100, rs, Reg::zr, rn);\n  }\n  void stsmaxl(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 1, 0, 0b100, rs, Reg::zr, rn);\n  }\n  void stsmaxa(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 0, 0, 0b100, rs, Reg::zr, rn);\n  }\n  void stsmaxal(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 1, 0, 0b100, rs, Reg::zr, rn);\n  }\n  void stsmin(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 0, 0, 0b101, rs, Reg::zr, rn);\n  }\n  void stsminl(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 1, 0, 0b101, rs, Reg::zr, rn);\n  }\n  void stsmina(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 0, 0, 0b101, rs, Reg::zr, rn);\n  }\n  void stsminal(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 1, 0, 0b101, rs, Reg::zr, rn);\n  }\n  void stumax(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 0, 0, 0b110, rs, Reg::zr, rn);\n  }\n  void stumaxl(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 1, 0, 0b110, rs, Reg::zr, rn);\n  }\n  void stumaxa(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 0, 0, 0b110, rs, Reg::zr, rn);\n  }\n  void stumaxal(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 1, 0, 0b110, rs, Reg::zr, rn);\n  }\n  void stumin(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 0, 0, 0b111, rs, Reg::zr, rn);\n  }\n  void stuminl(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 1, 0, 0b111, rs, Reg::zr, rn);\n  }\n  void stumina(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 0, 0, 0b111, rs, Reg::zr, rn);\n  }\n  void stuminal(SubRegSize size, Register rs, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 1, 0, 0b111, rs, Reg::zr, rn);\n  }\n  void ldswp(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 0, 1, 0b000, rs, rt, rn);\n  }\n  void ldswpl(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 1, 1, 0b000, rs, rt, rn);\n  }\n  void ldswpa(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 0, 1, 0b000, rs, rt, rn);\n  }\n  void ldswpal(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 1, 1, 0b000, rs, rt, rn);\n  }\n\n  void ldadd(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 0, 0, 0b000, rs, rt, rn);\n  }\n  void ldadda(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 0, 0, 0b000, rs, rt, rn);\n  }\n  void ldaddl(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 1, 0, 0b000, rs, rt, rn);\n  }\n  void ldaddal(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 1, 0, 0b000, rs, rt, rn);\n  }\n  void ldclr(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 0, 0, 0b001, rs, rt, rn);\n  }\n  void ldclra(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 0, 0, 0b001, rs, rt, rn);\n  }\n  void ldclrl(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 1, 0, 0b001, rs, rt, rn);\n  }\n  void ldclral(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 1, 0, 0b001, rs, rt, rn);\n  }\n\n  void ldset(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 0, 0, 0b011, rs, rt, rn);\n  }\n  void ldseta(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 0, 0, 0b011, rs, rt, rn);\n  }\n  void ldsetl(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 1, 0, 0b011, rs, rt, rn);\n  }\n  void ldsetal(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 1, 0, 0b011, rs, rt, rn);\n  }\n  void ldeor(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 0, 0, 0b010, rs, rt, rn);\n  }\n  void ldeora(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 0, 0, 0b010, rs, rt, rn);\n  }\n  void ldeorl(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 0, 1, 0, 0b010, rs, rt, rn);\n  }\n  void ldeoral(SubRegSize size, Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(size, 1, 1, 0, 0b010, rs, rt, rn);\n  }\n\n\n  // 8-bit\n  void ldaddb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 0, 0, 0b000, rs, rt, rn);\n  }\n  void ldclrb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 0, 0, 0b001, rs, rt, rn);\n  }\n  void ldeorb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 0, 0, 0b010, rs, rt, rn);\n  }\n  void ldsetb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 0, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmaxb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 0, 0, 0b100, rs, rt, rn);\n  }\n  void ldsminb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 0, 0, 0b101, rs, rt, rn);\n  }\n  void ldumaxb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 0, 0, 0b110, rs, rt, rn);\n  }\n  void lduminb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 0, 0, 0b111, rs, rt, rn);\n  }\n  void ldswpb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 0, 1, 0b000, rs, rt, rn);\n  }\n  void ldaddlb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 1, 0, 0b000, rs, rt, rn);\n  }\n  void ldclrlb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 1, 0, 0b001, rs, rt, rn);\n  }\n  void ldeorlb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 1, 0, 0b010, rs, rt, rn);\n  }\n  void ldsetlb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 1, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmaxlb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 1, 0, 0b100, rs, rt, rn);\n  }\n  void ldsminlb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 1, 0, 0b101, rs, rt, rn);\n  }\n  void ldumaxlb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 1, 0, 0b110, rs, rt, rn);\n  }\n  void lduminlb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 1, 0, 0b111, rs, rt, rn);\n  }\n  void ldswplb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 0, 1, 1, 0b000, rs, rt, rn);\n  }\n  void ldaddab(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 0, 0, 0b000, rs, rt, rn);\n  }\n  void ldclrab(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 0, 0, 0b001, rs, rt, rn);\n  }\n  void ldeorab(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 0, 0, 0b010, rs, rt, rn);\n  }\n  void ldsetab(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 0, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmaxab(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 0, 0, 0b100, rs, rt, rn);\n  }\n  void ldsminab(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 0, 0, 0b101, rs, rt, rn);\n  }\n  void ldumaxab(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 0, 0, 0b110, rs, rt, rn);\n  }\n  void lduminab(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 0, 0, 0b111, rs, rt, rn);\n  }\n  void ldswpab(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 0, 1, 0b000, rs, rt, rn);\n  }\n  void ldaddalb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 1, 0, 0b000, rs, rt, rn);\n  }\n  void ldclralb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 1, 0, 0b001, rs, rt, rn);\n  }\n  void ldeoralb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 1, 0, 0b010, rs, rt, rn);\n  }\n  void ldsetalb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 1, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmaxalb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 1, 0, 0b100, rs, rt, rn);\n  }\n  void ldsminalb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 1, 0, 0b101, rs, rt, rn);\n  }\n  void ldumaxalb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 1, 0, 0b110, rs, rt, rn);\n  }\n  void lduminalb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 1, 0, 0b111, rs, rt, rn);\n  }\n  void ldswpalb(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 1, 1, 0b000, rs, rt, rn);\n  }\n  // 16-bit\n  void ldaddh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 0, 0, 0b000, rs, rt, rn);\n  }\n  void ldclrh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 0, 0, 0b001, rs, rt, rn);\n  }\n  void ldeorh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 0, 0, 0b010, rs, rt, rn);\n  }\n  void ldseth(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 0, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmaxh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 0, 0, 0b100, rs, rt, rn);\n  }\n  void ldsminh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 0, 0, 0b101, rs, rt, rn);\n  }\n  void ldumaxh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 0, 0, 0b110, rs, rt, rn);\n  }\n  void lduminh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 0, 0, 0b111, rs, rt, rn);\n  }\n  void ldswph(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 0, 1, 0b000, rs, rt, rn);\n  }\n  void ldaddlh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 1, 0, 0b000, rs, rt, rn);\n  }\n  void ldclrlh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 1, 0, 0b001, rs, rt, rn);\n  }\n  void ldeorlh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 1, 0, 0b010, rs, rt, rn);\n  }\n  void ldsetlh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 1, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmaxlh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 1, 0, 0b100, rs, rt, rn);\n  }\n  void ldsminlh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 1, 0, 0b101, rs, rt, rn);\n  }\n  void ldumaxlh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 1, 0, 0b110, rs, rt, rn);\n  }\n  void lduminlh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 1, 0, 0b111, rs, rt, rn);\n  }\n  void ldswplh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 0, 1, 1, 0b000, rs, rt, rn);\n  }\n  void ldaddah(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 0, 0, 0b000, rs, rt, rn);\n  }\n  void ldclrah(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 0, 0, 0b001, rs, rt, rn);\n  }\n  void ldeorah(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 0, 0, 0b010, rs, rt, rn);\n  }\n  void ldsetah(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 0, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmaxah(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 0, 0, 0b100, rs, rt, rn);\n  }\n  void ldsminah(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 0, 0, 0b101, rs, rt, rn);\n  }\n  void ldumaxah(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 0, 0, 0b110, rs, rt, rn);\n  }\n  void lduminah(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 0, 0, 0b111, rs, rt, rn);\n  }\n  void ldswpah(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 0, 1, 0b000, rs, rt, rn);\n  }\n  void ldaddalh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 1, 0, 0b000, rs, rt, rn);\n  }\n  void ldclralh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 1, 0, 0b001, rs, rt, rn);\n  }\n  void ldeoralh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 1, 0, 0b010, rs, rt, rn);\n  }\n  void ldsetalh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 1, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmaxalh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 1, 0, 0b100, rs, rt, rn);\n  }\n  void ldsminalh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 1, 0, 0b101, rs, rt, rn);\n  }\n  void ldumaxalh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 1, 0, 0b110, rs, rt, rn);\n  }\n  void lduminalh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 1, 0, 0b111, rs, rt, rn);\n  }\n  void ldswpalh(Register rs, Register rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 1, 1, 0b000, rs, rt, rn);\n  }\n  // 32-bit\n  void ldadd(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 0, 0, 0b000, rs, rt, rn);\n  }\n  void ldclr(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 0, 0, 0b001, rs, rt, rn);\n  }\n  void ldeor(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 0, 0, 0b010, rs, rt, rn);\n  }\n  void ldset(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 0, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmax(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 0, 0, 0b100, rs, rt, rn);\n  }\n  void ldsmin(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 0, 0, 0b101, rs, rt, rn);\n  }\n  void ldumax(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 0, 0, 0b110, rs, rt, rn);\n  }\n  void ldumin(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 0, 0, 0b111, rs, rt, rn);\n  }\n  void ldswp(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 0, 1, 0b000, rs, rt, rn);\n  }\n  void ldaddl(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 1, 0, 0b000, rs, rt, rn);\n  }\n  void ldclrl(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 1, 0, 0b001, rs, rt, rn);\n  }\n  void ldeorl(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 1, 0, 0b010, rs, rt, rn);\n  }\n  void ldsetl(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 1, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmaxl(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 1, 0, 0b100, rs, rt, rn);\n  }\n  void ldsminl(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 1, 0, 0b101, rs, rt, rn);\n  }\n  void ldumaxl(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 1, 0, 0b110, rs, rt, rn);\n  }\n  void lduminl(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 1, 0, 0b111, rs, rt, rn);\n  }\n  void ldswpl(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 0, 1, 1, 0b000, rs, rt, rn);\n  }\n  void ldadda(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 0, 0, 0b000, rs, rt, rn);\n  }\n  void ldclra(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 0, 0, 0b001, rs, rt, rn);\n  }\n  void ldeora(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 0, 0, 0b010, rs, rt, rn);\n  }\n  void ldseta(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 0, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmaxa(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 0, 0, 0b100, rs, rt, rn);\n  }\n  void ldsmina(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 0, 0, 0b101, rs, rt, rn);\n  }\n  void ldumaxa(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 0, 0, 0b110, rs, rt, rn);\n  }\n  void ldumina(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 0, 0, 0b111, rs, rt, rn);\n  }\n  void ldswpa(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 0, 1, 0b000, rs, rt, rn);\n  }\n  void ldaddal(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 1, 0, 0b000, rs, rt, rn);\n  }\n  void ldclral(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 1, 0, 0b001, rs, rt, rn);\n  }\n  void ldeoral(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 1, 0, 0b010, rs, rt, rn);\n  }\n  void ldsetal(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 1, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmaxal(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 1, 0, 0b100, rs, rt, rn);\n  }\n  void ldsminal(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 1, 0, 0b101, rs, rt, rn);\n  }\n  void ldumaxal(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 1, 0, 0b110, rs, rt, rn);\n  }\n  void lduminal(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 1, 0, 0b111, rs, rt, rn);\n  }\n  void ldswpal(WRegister rs, WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 1, 1, 0b000, rs, rt, rn);\n  }\n  // 64-bit\n  void ldadd(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 0, 0, 0b000, rs, rt, rn);\n  }\n  void ldclr(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 0, 0, 0b001, rs, rt, rn);\n  }\n  void ldeor(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 0, 0, 0b010, rs, rt, rn);\n  }\n  void ldset(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 0, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmax(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 0, 0, 0b100, rs, rt, rn);\n  }\n  void ldsmin(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 0, 0, 0b101, rs, rt, rn);\n  }\n  void ldumax(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 0, 0, 0b110, rs, rt, rn);\n  }\n  void ldumin(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 0, 0, 0b111, rs, rt, rn);\n  }\n  void ldswp(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 0, 1, 0b000, rs, rt, rn);\n  }\n  void ldaddl(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 1, 0, 0b000, rs, rt, rn);\n  }\n  void ldclrl(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 1, 0, 0b001, rs, rt, rn);\n  }\n  void ldeorl(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 1, 0, 0b010, rs, rt, rn);\n  }\n  void ldsetl(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 1, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmaxl(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 1, 0, 0b100, rs, rt, rn);\n  }\n  void ldsminl(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 1, 0, 0b101, rs, rt, rn);\n  }\n  void ldumaxl(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 1, 0, 0b110, rs, rt, rn);\n  }\n  void lduminl(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 1, 0, 0b111, rs, rt, rn);\n  }\n  void ldswpl(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 1, 1, 0b000, rs, rt, rn);\n  }\n  void ldadda(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 0, 0, 0b000, rs, rt, rn);\n  }\n  void ldclra(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 0, 0, 0b001, rs, rt, rn);\n  }\n  void ldeora(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 0, 0, 0b010, rs, rt, rn);\n  }\n  void ldseta(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 0, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmaxa(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 0, 0, 0b100, rs, rt, rn);\n  }\n  void ldsmina(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 0, 0, 0b101, rs, rt, rn);\n  }\n  void ldumaxa(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 0, 0, 0b110, rs, rt, rn);\n  }\n  void ldumina(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 0, 0, 0b111, rs, rt, rn);\n  }\n  void ldswpa(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 0, 1, 0b000, rs, rt, rn);\n  }\n  void ldaddal(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 1, 0, 0b000, rs, rt, rn);\n  }\n  void ldclral(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 1, 0, 0b001, rs, rt, rn);\n  }\n  void ldeoral(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 1, 0, 0b010, rs, rt, rn);\n  }\n  void ldsetal(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 1, 0, 0b011, rs, rt, rn);\n  }\n  void ldsmaxal(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 1, 0, 0b100, rs, rt, rn);\n  }\n  void ldsminal(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 1, 0, 0b101, rs, rt, rn);\n  }\n  void ldumaxal(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 1, 0, 0b110, rs, rt, rn);\n  }\n  void lduminal(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 1, 0, 0b111, rs, rt, rn);\n  }\n  void ldswpal(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 1, 1, 0b000, rs, rt, rn);\n  }\n  void ldaprb(WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i8Bit, 1, 0, 1, 0b100, WReg::w31, rt, rn);\n  }\n  void ldaprh(WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i16Bit, 1, 0, 1, 0b100, WReg::w31, rt, rn);\n  }\n  void ldapr(WRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i32Bit, 1, 0, 1, 0b100, WReg::w31, rt, rn);\n  }\n  void ldapr(XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 1, 0, 1, 0b100, XReg::x31, rt, rn);\n  }\n  void st64bv0(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 0, 1, 0b010, rs, rt, rn);\n  }\n  void st64bv(XRegister rs, XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 0, 1, 0b011, rs, rt, rn);\n  }\n  void st64b(XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 0, 1, 0b001, XReg::x31, rt, rn);\n  }\n  void ld64b(XRegister rt, Register rn) {\n    LoadStoreAtomicLSE(SubRegSize::i64Bit, 0, 0, 1, 0b101, XReg::x31, rt, rn);\n  }\n\n  // Loadstore register-register offset\n  void strb(ARMEmitter::Register rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, bool Shift = false) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    constexpr uint32_t Op = 0b0011'1000'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b00, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void ldrb(ARMEmitter::Register rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, bool Shift = false) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    constexpr uint32_t Op = 0b0011'1000'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b01, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void ldrsb(ARMEmitter::XRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, bool Shift = false) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    constexpr uint32_t Op = 0b0011'1000'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b10, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void ldrsb(ARMEmitter::WRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, bool Shift = false) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    constexpr uint32_t Op = 0b0011'1000'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b11, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void strh(ARMEmitter::Register rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 1, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b0111'1000'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b00, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void ldrh(ARMEmitter::Register rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 1, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b0111'1000'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b01, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void ldrsh(ARMEmitter::XRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 1, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b0111'1000'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b10, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void ldrsh(ARMEmitter::WRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 1, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b0111'1000'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b11, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void str(ARMEmitter::WRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 2, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b1011'1000'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b00, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void ldr(ARMEmitter::WRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 2, \"Unsupported shift amount: {}\", Shift);\n    constexpr uint32_t Op = 0b1011'1000'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b01, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void ldrsw(ARMEmitter::XRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 2, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b1011'1000'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b10, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void str(ARMEmitter::XRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 3, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b1111'1000'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b00, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void ldr(ARMEmitter::XRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 3, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b1111'1000'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b01, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void prfm(ARMEmitter::Prefetch prfop, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 3, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b1111'1000'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b10, prfop, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void strb(ARMEmitter::VRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    constexpr uint32_t Op = 0b0011'1100'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b00, rt, rn, rm, Option, 0);\n  }\n  void ldrb(ARMEmitter::VRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    constexpr uint32_t Op = 0b0011'1100'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b01, rt, rn, rm, Option, 0);\n  }\n  void strh(ARMEmitter::VRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 1, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b0111'1100'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b00, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void ldrh(ARMEmitter::VRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 1, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b0111'1100'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b01, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void str(ARMEmitter::SRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 2, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b1011'1100'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b00, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void ldr(ARMEmitter::SRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 2, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b1011'1100'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b01, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void str(ARMEmitter::DRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 3, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b1111'1100'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b00, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void ldr(ARMEmitter::DRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 3, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b1111'1100'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b01, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void str(ARMEmitter::QRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 4, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b0011'1100'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b10, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n  void ldr(ARMEmitter::QRegister rt, ARMEmitter::Register rn, ARMEmitter::Register rm, ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT((FEXCore::ToUnderlying(Option) & 0b010) == 0b010, \"Unsupported Extendtype\");\n    LOGMAN_THROW_A_FMT(Shift == 0 || Shift == 4, \"Unsupported shift amount\");\n    constexpr uint32_t Op = 0b0011'1100'001 << 21 | (0b10 << 10);\n    LoadStoreRegisterOffset(Op, 0b11, rt, rn, rm, Option, Shift ? 1 : 0);\n  }\n\n  void strb(ARMEmitter::Register rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      strb(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      strb(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if (MemSrc.MetaType.ImmType.Imm < 0) {\n          sturb(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          strb(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        strb<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        strb<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void ldrb(ARMEmitter::Register rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      ldrb(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      ldrb(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if (MemSrc.MetaType.ImmType.Imm < 0) {\n          ldurb(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          ldrb(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        ldrb<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        ldrb<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void ldrsb(ARMEmitter::XRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      ldrsb(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      ldrsb(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if (MemSrc.MetaType.ImmType.Imm < 0) {\n          ldursb(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          ldrsb(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        ldrsb<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        ldrsb<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void ldrsb(ARMEmitter::WRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      ldrsb(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      ldrsb(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if (MemSrc.MetaType.ImmType.Imm < 0) {\n          ldursb(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          ldrsb(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        ldrsb<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        ldrsb<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void strh(ARMEmitter::Register rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      strh(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      strh(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b1) || MemSrc.MetaType.ImmType.Imm < 0) {\n          sturh(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          strh(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        strh<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        strh<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void ldrh(ARMEmitter::Register rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      ldrh(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      ldrh(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b1) || MemSrc.MetaType.ImmType.Imm < 0) {\n          ldurh(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          ldrh(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        ldrh<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        ldrh<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void ldrsh(ARMEmitter::XRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      ldrsh(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      ldrsh(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b1) || MemSrc.MetaType.ImmType.Imm < 0) {\n          ldursh(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          ldrsh(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        ldrsh<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        ldrsh<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void ldrsh(ARMEmitter::WRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      ldrsh(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      ldrsh(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b1) || MemSrc.MetaType.ImmType.Imm < 0) {\n          ldursh(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          ldrsh(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        ldrsh<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        ldrsh<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void str(ARMEmitter::WRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      str(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      str(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b11) || MemSrc.MetaType.ImmType.Imm < 0) {\n          stur(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          str(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        str<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        str<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void ldr(ARMEmitter::WRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      ldr(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      ldr(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b11) || MemSrc.MetaType.ImmType.Imm < 0) {\n          ldur(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          ldr(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        ldr<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        ldr<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void ldrsw(ARMEmitter::XRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      ldrsw(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      ldrsw(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b11) || MemSrc.MetaType.ImmType.Imm < 0) {\n          ldursw(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          ldrsw(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        ldrsw<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        ldrsw<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void str(ARMEmitter::XRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      str(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      str(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b111) || MemSrc.MetaType.ImmType.Imm < 0) {\n          stur(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          str(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        str<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        str<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void ldr(ARMEmitter::XRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      ldr(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      ldr(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b111) || MemSrc.MetaType.ImmType.Imm < 0) {\n          ldur(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          ldr(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        ldr<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        ldr<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void prfm(ARMEmitter::Prefetch prfop, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      prfm(prfop, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      prfm(prfop, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b111) || MemSrc.MetaType.ImmType.Imm < 0) {\n          prfum<IndexType::OFFSET>(prfop, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          prfm(prfop, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n\n  void strb(ARMEmitter::VRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      LOGMAN_THROW_A_FMT(MemSrc.MetaType.Extended.Shift == false, \"Can't shift byte\");\n      strb(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      strb(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if (MemSrc.MetaType.ImmType.Imm < 0) {\n          sturb(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          strb(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        strb<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        strb<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void ldrb(ARMEmitter::VRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      LOGMAN_THROW_A_FMT(MemSrc.MetaType.Extended.Shift == false, \"Can't shift byte\");\n      ldrb(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      ldrb(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if (MemSrc.MetaType.ImmType.Imm < 0) {\n          ldurb(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          ldrb(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        ldrb<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        ldrb<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void strh(ARMEmitter::VRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      strh(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      strh(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b1) || MemSrc.MetaType.ImmType.Imm < 0) {\n          sturh(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          strh(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        strh<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        strh<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void ldrh(ARMEmitter::VRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      ldrh(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      ldrh(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b1) || MemSrc.MetaType.ImmType.Imm < 0) {\n          ldurh(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          ldrh(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        ldrh<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        ldrh<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void str(ARMEmitter::SRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      str(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      str(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b11) || MemSrc.MetaType.ImmType.Imm < 0) {\n          stur(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          str(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        str<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        str<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void ldr(ARMEmitter::SRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      ldr(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      ldr(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b11) || MemSrc.MetaType.ImmType.Imm < 0) {\n          ldur(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          ldr(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        ldr<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        ldr<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void str(ARMEmitter::DRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      str(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      str(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b111) || MemSrc.MetaType.ImmType.Imm < 0) {\n          stur(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          str(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        str<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        str<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void ldr(ARMEmitter::DRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      ldr(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      ldr(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b111) || MemSrc.MetaType.ImmType.Imm < 0) {\n          ldur(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          ldr(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        ldr<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        ldr<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void str(ARMEmitter::QRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      str(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      str(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b1111) || MemSrc.MetaType.ImmType.Imm < 0) {\n          stur(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          str(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        str<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        str<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n  void ldr(ARMEmitter::QRegister rt, ARMEmitter::ExtendedMemOperand MemSrc) {\n    if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED &&\n        MemSrc.MetaType.Extended.rm.Idx() != ARMEmitter::Reg::r31.Idx()) {\n      ldr(rt, MemSrc.rn, MemSrc.MetaType.Extended.rm, MemSrc.MetaType.Extended.Option, MemSrc.MetaType.Extended.Shift);\n    } else if (MemSrc.MetaType.Header.MemType == ARMEmitter::ExtendedMemOperand::Type::TYPE_EXTENDED) {\n      ldr(rt, MemSrc.rn);\n    } else {\n      if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::OFFSET) {\n        if ((MemSrc.MetaType.ImmType.Imm & 0b1111) || MemSrc.MetaType.ImmType.Imm < 0) {\n          ldur(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        } else {\n          ldr(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n        }\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::POST) {\n        ldr<ARMEmitter::IndexType::POST>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else if (MemSrc.MetaType.ImmType.Index == ARMEmitter::IndexType::PRE) {\n        ldr<ARMEmitter::IndexType::PRE>(rt, MemSrc.rn, MemSrc.MetaType.ImmType.Imm);\n      } else {\n        LOGMAN_MSG_A_FMT(\"Unexpected loadstore index type\");\n        FEX_UNREACHABLE;\n      }\n    }\n  }\n\n  // Loadstore PAC\n  void ldraa(XRegister rt, XRegister rn, IndexType type, int32_t offset = 0) {\n    LoadStorePAC(0b11, 0, 0, offset, type, rn, rt);\n  }\n  void ldrab(XRegister rt, XRegister rn, IndexType type, int32_t offset = 0) {\n    LoadStorePAC(0b11, 0, 1, offset, type, rn, rt);\n  }\n\n  // Loadstore unsigned immediate\n  // Maximum values of unsigned immediate offsets for particular data sizes.\n  static constexpr uint32_t LSByteMaxUnsignedOffset = 4095;\n  static constexpr uint32_t LSHalfMaxUnsignedOffset = 8190;\n  static constexpr uint32_t LSWordMaxUnsignedOffset = 16380;\n  static constexpr uint32_t LSDWordMaxUnsignedOffset = 32760;\n  static constexpr uint32_t LSQWordMaxUnsignedOffset = 65520;\n\n  void strb(Register rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b00, 0, 0b00, rt, rn, Imm);\n  }\n  void ldrb(Register rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b00, 0, 0b01, rt, rn, Imm);\n  }\n  void ldrsb(XRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b00, 0, 0b10, rt, rn, Imm);\n  }\n  void ldrsb(WRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b00, 0, 0b11, rt, rn, Imm);\n  }\n  void strb(VRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b00, 1, 0b00, rt, rn, Imm);\n  }\n  void ldrb(VRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b00, 1, 0b01, rt, rn, Imm);\n  }\n  void strh(Register rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b01, 0, 0b00, rt, rn, Imm);\n  }\n  void ldrh(Register rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b01, 0, 0b01, rt, rn, Imm);\n  }\n  void ldrsh(XRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b01, 0, 0b10, rt, rn, Imm);\n  }\n  void ldrsh(WRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b01, 0, 0b11, rt, rn, Imm);\n  }\n  void strh(VRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b01, 1, 0b00, rt, rn, Imm);\n  }\n  void ldrh(VRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b01, 1, 0b01, rt, rn, Imm);\n  }\n  void str(WRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b10, 0, 0b00, rt, rn, Imm);\n  }\n  void ldr(WRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b10, 0, 0b01, rt, rn, Imm);\n  }\n  void ldrsw(XRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b10, 0, 0b10, rt, rn, Imm);\n  }\n  void str(SRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b10, 1, 0b00, rt, rn, Imm);\n  }\n  void ldr(SRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b10, 1, 0b01, rt, rn, Imm);\n  }\n  void str(XRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b11, 0, 0b00, rt, rn, Imm);\n  }\n  void ldr(XRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b11, 0, 0b01, rt, rn, Imm);\n  }\n\n  void ldr(SubRegSize size, Register rt, Register rn, uint32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n    LoadStoreUnsigned(FEXCore::ToUnderlying(size), 0, 0b01, rt, rn, Imm);\n  }\n  void str(SubRegSize size, Register rt, Register rn, uint32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n    LoadStoreUnsigned(FEXCore::ToUnderlying(size), 0, 0b00, rt, rn, Imm);\n  }\n\n  void prfm(Prefetch prfop, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b11, 0, 0b10, prfop, rn, Imm);\n  }\n  void str(DRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b11, 1, 0b00, rt, rn, Imm);\n  }\n  void ldr(DRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b11, 1, 0b01, rt, rn, Imm);\n  }\n  void str(QRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b00, 1, 0b10, rt, rn, Imm);\n  }\n  void ldr(QRegister rt, Register rn, uint32_t Imm = 0) {\n    LoadStoreUnsigned(0b00, 1, 0b11, rt, rn, Imm);\n  }\n\nprivate:\n  void AtomicOp(uint32_t Op, ARMEmitter::Size s, uint32_t L, uint32_t o0, ARMEmitter::Register rs, ARMEmitter::Register rt,\n                ARMEmitter::Register rt2, ARMEmitter::Register rn) {\n    const uint32_t sz = s == ARMEmitter::Size::i64Bit ? (1U << 30) : 0;\n    uint32_t Instr = Op;\n\n    Instr |= sz;\n    Instr |= L << 22;\n    Instr |= Encode_rs(rs);\n    Instr |= o0 << 15;\n    Instr |= Encode_rt2(rt2);\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rt(rt);\n\n    dc32(Instr);\n  }\n\n  template<typename T>\n  void SubAtomicOp(uint32_t Op, ARMEmitter::SubRegSize s, uint32_t L, uint32_t o0, T rs, T rt, T rt2, ARMEmitter::Register rn) {\n    const uint32_t sz = FEXCore::ToUnderlying(s) << 30;\n    uint32_t Instr = Op;\n\n    Instr |= sz;\n    Instr |= L << 22;\n    Instr |= Encode_rs(rs);\n    Instr |= o0 << 15;\n    Instr |= Encode_rt2(rt2);\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rt(rt);\n\n    dc32(Instr);\n  }\n\n  template<typename T>\n  void SubAtomicImm(uint32_t Op, ARMEmitter::SubRegSize s, uint32_t opc, T rt, ARMEmitter::Register rn, uint32_t Imm) {\n    const uint32_t sz = FEXCore::ToUnderlying(s) << 30;\n    uint32_t Instr = Op;\n\n    Instr |= sz;\n    Instr |= opc << 22;\n    Instr |= Imm << 12;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rt(rt);\n\n    dc32(Instr);\n  }\n  // Load register literal\n  template<typename T>\n  void LoadStoreLiteral(uint32_t Op, T rt, uint32_t Imm) {\n    uint32_t Instr = Op;\n\n    Instr |= Imm << 5;\n    Instr |= Encode_rt(rt);\n    dc32(Instr);\n  }\n\n  void MemoryCopyAndMemorySet(uint32_t sz, uint32_t o0, uint32_t op1, uint32_t op2, Register rs, Register rn, Register rd) {\n    uint32_t Instr = 0b0001'1001'0000'0000'0000'0100'0000'0000;\n\n    Instr |= sz << 30;\n    Instr |= o0 << 26;\n    Instr |= op1 << 22;\n    Instr |= rs.Idx() << 16;\n    Instr |= op2 << 12;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n\n    dc32(Instr);\n  }\n\n  // Loadstore no-allocate pair\n  template<typename T>\n  void LoadStoreNoAllocate(uint32_t Op, T rt, T rt2, ARMEmitter::Register rn, uint32_t Imm) {\n    uint32_t Instr = Op;\n\n    Instr |= Imm << 15;\n    Instr |= Encode_rt2(rt2);\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rt(rt);\n    dc32(Instr);\n  }\n  // Loadstore register pair post-indexed\n  template<typename T>\n  void LoadStorePair(uint32_t Op, T rt, T rt2, ARMEmitter::Register rn, uint32_t Imm) {\n    uint32_t Instr = Op;\n    Instr |= Imm << 15;\n    Instr |= Encode_rt2(rt2);\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rt(rt);\n    dc32(Instr);\n  }\n\n  // Loadstore register unscaled immediate\n  // Loadstore register immediate post-indexed\n  // Loadstore register unprivileged\n  // Loadstore register immediate pre-indexed\n  template<typename T>\n  void LoadStoreImm(uint32_t Op, uint32_t o2, T rt, ARMEmitter::Register rn, uint32_t Imm) {\n    uint32_t Instr = Op;\n\n    Instr |= Imm << 12;\n    Instr |= o2 << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rt(rt);\n    dc32(Instr);\n  }\n\n  // Atomic memory operations\n  void LoadStoreAtomicLSE(SubRegSize s, uint32_t A, uint32_t R, uint32_t o3, uint32_t opc, Register rs, Register rt, Register rn) {\n    uint32_t Instr = 0b0011'1000'0010'0000'0000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(s) << 30;\n    Instr |= A << 23;\n    Instr |= R << 22;\n    Instr |= Encode_rs(rs);\n    Instr |= o3 << 15;\n    Instr |= opc << 12;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rt(rt);\n    dc32(Instr);\n  }\n\n  // Loadstore register-register offset\n  template<typename T>\n  void LoadStoreRegisterOffset(uint32_t Op, uint32_t opc, T rt, ARMEmitter::Register rn, ARMEmitter::Register rm,\n                               ARMEmitter::ExtendedType Option, uint32_t Shift) {\n    uint32_t Instr = Op;\n\n    Instr |= opc << 22;\n    Instr |= Encode_rt(rt);\n    Instr |= FEXCore::ToUnderlying(Option) << 13;\n    Instr |= Shift << 12;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rm(rm);\n    dc32(Instr);\n  }\n\n  void LoadStorePAC(uint32_t size, uint32_t VR, uint32_t M, int32_t imm, IndexType type, Register rn, Register rt) {\n    LOGMAN_THROW_A_FMT((imm % 8) == 0, \"Immediate ({}) must be divisible by 8\", imm);\n    LOGMAN_THROW_A_FMT(imm >= -4096 && imm <= 4088, \"Immediate ({}) must be within [-4096, 4088]\", imm);\n    LOGMAN_THROW_A_FMT(type == IndexType::OFFSET || type == IndexType::PRE, \"PAC may only use offset or pre-indexed values\");\n\n    // The immediate is scaled down in order to fit within the available 10 immediate bits.\n    const auto scaled_imm = static_cast<uint32_t>(imm / 8);\n    const auto imm9 = scaled_imm & 0b1'1111'1111;\n    const auto S = (scaled_imm >> 9) & 1;\n\n    const auto W = type == IndexType::OFFSET ? 0U : 1U;\n\n    uint32_t Instr = 0b0011'1000'0010'0000'0000'0100'0000'0000;\n    Instr |= size << 30;\n    Instr |= VR << 26;\n    Instr |= M << 23;\n    Instr |= S << 22;\n    Instr |= imm9 << 12;\n    Instr |= W << 11;\n    Instr |= rn.Idx() << 5;\n    Instr |= rt.Idx();\n    dc32(Instr);\n  }\n\n  // Loadstore unsigned immediate\n  template<typename T>\n  void LoadStoreUnsigned(uint32_t size, uint32_t V, uint32_t opc, T rt, Register rn, uint32_t Imm) {\n    uint32_t SizeShift = size;\n    if constexpr (std::is_same_v<T, QRegister>) {\n      // 128-bit variant is specified via size=0b00, V=1, opc=0b1x\n      // so we need to special case this one based on whether or not\n      // rt indicates a 128-bit vector. Nice thing is this can be\n      // checked at compile-time.\n      SizeShift = 4;\n    }\n\n    [[maybe_unused]] const uint32_t MaxImm = LSByteMaxUnsignedOffset << SizeShift;\n    [[maybe_unused]] const uint32_t ElementSize = 1U << SizeShift;\n\n    LOGMAN_THROW_A_FMT(Imm <= MaxImm, \"{}: Offset not valid: Imm: 0x{:x} Max: 0x{:x}\", __func__, Imm, MaxImm);\n    LOGMAN_THROW_A_FMT((Imm % ElementSize) == 0, \"{}: Offset must be a multiple of {}. Offset: 0x{:x}\", __func__, ElementSize, Imm);\n\n    const uint32_t ShiftedImm = Imm >> SizeShift;\n\n    uint32_t Instr = 0b0011'1001'0000'0000'0000'0000'0000'0000;\n    Instr |= size << 30;\n    Instr |= V << 26;\n    Instr |= opc << 22;\n    Instr |= ShiftedImm << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rt(rt);\n    dc32(Instr);\n  }\n\n  template<IndexType Index>\n  void ldp_w(ARMEmitter::VRegister rt, ARMEmitter::VRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 252 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = (0b0010'1100'01 << 22) | (Index == IndexType::POST   ? (0b01 << 23) :\n                                                      Index == IndexType::PRE    ? (0b11 << 23) :\n                                                      Index == IndexType::OFFSET ? (0b10 << 23) :\n                                                                                   -1);\n\n    LoadStorePair(Op, rt, rt2, rn, (Imm >> 2) & 0b111'1111);\n  }\n  template<IndexType Index>\n  void ldp_x(ARMEmitter::VRegister rt, ARMEmitter::VRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -512 && Imm <= 504 && ((Imm & 0b111) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = (0b0110'1100'01 << 22) | (Index == IndexType::POST   ? (0b01 << 23) :\n                                                      Index == IndexType::PRE    ? (0b11 << 23) :\n                                                      Index == IndexType::OFFSET ? (0b10 << 23) :\n                                                                                   -1);\n\n    LoadStorePair(Op, rt, rt2, rn, (Imm >> 3) & 0b111'1111);\n  }\n  template<IndexType Index>\n  void stp_w(ARMEmitter::VRegister rt, ARMEmitter::VRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 252 && ((Imm & 0b11) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = (0b0010'1100'00 << 22) | (Index == IndexType::POST   ? (0b01 << 23) :\n                                                      Index == IndexType::PRE    ? (0b11 << 23) :\n                                                      Index == IndexType::OFFSET ? (0b10 << 23) :\n                                                                                   -1);\n\n    LoadStorePair(Op, rt, rt2, rn, (Imm >> 2) & 0b111'1111);\n  }\n  template<IndexType Index>\n  void stp_x(ARMEmitter::VRegister rt, ARMEmitter::VRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -512 && Imm <= 504 && ((Imm & 0b111) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = (0b0110'1100'00 << 22) | (Index == IndexType::POST   ? (0b01 << 23) :\n                                                      Index == IndexType::PRE    ? (0b11 << 23) :\n                                                      Index == IndexType::OFFSET ? (0b10 << 23) :\n                                                                                   -1);\n\n    LoadStorePair(Op, rt, rt2, rn, (Imm >> 3) & 0b111'1111);\n  }\n  template<IndexType Index>\n  void ldp_q(ARMEmitter::VRegister rt, ARMEmitter::VRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -1024 && Imm <= 1008 && ((Imm & 0b1111) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = (0b1010'1100'01 << 22) | (Index == IndexType::POST   ? (0b01 << 23) :\n                                                      Index == IndexType::PRE    ? (0b11 << 23) :\n                                                      Index == IndexType::OFFSET ? (0b10 << 23) :\n                                                                                   -1);\n\n    LoadStorePair(Op, rt, rt2, rn, (Imm >> 4) & 0b111'1111);\n  }\n  template<IndexType Index>\n  void stp_q(ARMEmitter::VRegister rt, ARMEmitter::VRegister rt2, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -1024 && Imm <= 1008 && ((Imm & 0b1111) == 0), \"Unscaled offset too large\");\n    constexpr uint32_t Op = (0b1010'1100'00 << 22) | (Index == IndexType::POST   ? (0b01 << 23) :\n                                                      Index == IndexType::PRE    ? (0b11 << 23) :\n                                                      Index == IndexType::OFFSET ? (0b10 << 23) :\n                                                                                   -1);\n\n    LoadStorePair(Op, rt, rt2, rn, (Imm >> 4) & 0b111'1111);\n  }\n\n  template<IndexType Index>\n  void stXrb(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b0011'1000'00 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void ldXrb(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b0011'1000'01 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void stXrb(ARMEmitter::VRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b0011'1100'00 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void ldXrb(ARMEmitter::VRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b0011'1100'01 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void ldXrsb(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b0011'1000'10 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void ldXrsb(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b0011'1000'11 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void stXrh(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b0111'1000'00 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void ldXrh(ARMEmitter::Register rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b0111'1000'01 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void stXrh(ARMEmitter::VRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b0111'1100'00 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void ldXrh(ARMEmitter::VRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b0111'1100'01 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void ldXrsh(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b0111'1000'10 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void ldXrsh(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b0111'1000'11 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void stXr(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b1011'1000'00 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void ldXr(ARMEmitter::WRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b1011'1000'01 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void stXr(ARMEmitter::SRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b1011'1100'00 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void ldXr(ARMEmitter::SRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b1011'1100'01 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void ldXrsw(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b1011'1000'10 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void stXr(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b1111'1000'00 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void ldXr(ARMEmitter::XRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b1111'1000'01 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void stXr(ARMEmitter::DRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b1111'1100'00 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void ldXr(ARMEmitter::DRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b1111'1100'01 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void stXr(ARMEmitter::QRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b0011'1100'10 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n  template<IndexType Index>\n  void ldXr(ARMEmitter::QRegister rt, ARMEmitter::Register rn, int32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm >= -256 && Imm <= 255, \"Unscaled offset too large\");\n\n    constexpr uint32_t Op = 0b0011'1100'11 << 22;\n    constexpr uint32_t o2 = Index == IndexType::POST         ? 0b01 :\n                            Index == IndexType::PRE          ? 0b11 :\n                            Index == IndexType::OFFSET       ? 0b00 :\n                            Index == IndexType::UNPRIVILEGED ? 0b10 :\n                                                               -1;\n\n    LoadStoreImm(Op, o2, rt, rn, Imm & 0b1'1111'1111);\n  }\n\n#ifndef INCLUDED_BY_EMITTER\n}; // struct LoadstoreEmitterOps\n} // namespace ARMEmitter\n#endif\n"
  },
  {
    "path": "CodeEmitter/CodeEmitter/Registers.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/EnumUtils.h>\n\n#include <compare>\n#include <cstdint>\n\nnamespace ARMEmitter {\nclass WRegister;\nclass XRegister;\n\n/* Unsized GPR register class\n * This class doesn't imply a size when used\n */\nclass Register {\npublic:\n  Register() = delete;\n  constexpr explicit Register(uint32_t Idx)\n    : Index {Idx} {}\n\n  friend constexpr auto operator<=>(const Register&, const Register&) = default;\n\n  constexpr uint32_t Idx() const {\n    return Index;\n  }\n  constexpr WRegister W() const;\n  constexpr XRegister X() const;\n\nprivate:\n  uint32_t Index;\n};\nstatic_assert(sizeof(Register) == sizeof(uint32_t));\nstatic_assert(std::is_trivially_copyable_v<Register>);\nstatic_assert(std::is_standard_layout_v<Register>);\n\n/* 32-bit GPR register class.\n * This class will imply a 32-bit register size being used.\n */\nclass WRegister {\npublic:\n  WRegister() = delete;\n  constexpr explicit WRegister(uint32_t Idx)\n    : Index {Idx} {}\n\n  friend constexpr auto operator<=>(const WRegister&, const WRegister&) = default;\n\n  constexpr uint32_t Idx() const {\n    return Index;\n  }\n\n  constexpr operator Register() const {\n    return Register(Index);\n  }\n  constexpr XRegister X() const;\n  constexpr Register R() const;\n\nprivate:\n  uint32_t Index;\n};\nstatic_assert(sizeof(WRegister) == sizeof(uint32_t));\nstatic_assert(std::is_trivially_copyable_v<WRegister>);\nstatic_assert(std::is_standard_layout_v<WRegister>);\n\n/* 64-bit GPR register class.\n * This class will imply a 64-bit register size being used.\n */\nclass XRegister {\npublic:\n  XRegister() = delete;\n  constexpr explicit XRegister(uint32_t Idx)\n    : Index {Idx} {}\n\n  friend constexpr auto operator<=>(const XRegister&, const XRegister&) = default;\n\n  constexpr uint32_t Idx() const {\n    return Index;\n  }\n\n  constexpr operator Register() const {\n    return Register(Index);\n  }\n  constexpr WRegister W() const;\n  constexpr Register R() const;\n\nprivate:\n  uint32_t Index;\n};\nstatic_assert(sizeof(XRegister) == sizeof(uint32_t));\nstatic_assert(std::is_trivially_copyable_v<XRegister>);\nstatic_assert(std::is_standard_layout_v<XRegister>);\n\ninline constexpr WRegister Register::W() const {\n  return WRegister {Index};\n}\n\ninline constexpr XRegister Register::X() const {\n  return XRegister {Index};\n}\n\ninline constexpr XRegister WRegister::X() const {\n  return XRegister {Index};\n}\n\ninline constexpr Register WRegister::R() const {\n  return *this;\n}\n\ninline constexpr WRegister XRegister::W() const {\n  return WRegister {Index};\n}\n\ninline constexpr Register XRegister::R() const {\n  return *this;\n}\n\n// Namespace containing all unsized GPR register objects.\nnamespace Reg {\n  constexpr static Register r0(0);\n  constexpr static Register r1(1);\n  constexpr static Register r2(2);\n  constexpr static Register r3(3);\n  constexpr static Register r4(4);\n  constexpr static Register r5(5);\n  constexpr static Register r6(6);\n  constexpr static Register r7(7);\n  constexpr static Register r8(8);\n  constexpr static Register r9(9);\n  constexpr static Register r10(10);\n  constexpr static Register r11(11);\n  constexpr static Register r12(12);\n  constexpr static Register r13(13);\n  constexpr static Register r14(14);\n  constexpr static Register r15(15);\n  constexpr static Register r16(16);\n  constexpr static Register r17(17);\n  constexpr static Register r18(18);\n  constexpr static Register r19(19);\n  constexpr static Register r20(20);\n  constexpr static Register r21(21);\n  constexpr static Register r22(22);\n  constexpr static Register r23(23);\n  constexpr static Register r24(24);\n  constexpr static Register r25(25);\n  constexpr static Register r26(26);\n  constexpr static Register r27(27);\n  constexpr static Register r28(28);\n  constexpr static Register r29(29);\n  constexpr static Register r30(30);\n  constexpr static Register r31(31);\n\n  // Named registers\n  constexpr static Register ip0(16);\n  constexpr static Register ip1(17);\n\n  constexpr static Register fp(29);\n  constexpr static Register lr(30);\n  constexpr static Register rsp(31);\n  constexpr static Register zr(31);\n} // namespace Reg\n\n// Namespace containing all 64-bit GPR register objects.\nnamespace XReg {\n  constexpr static XRegister x0(0);\n  constexpr static XRegister x1(1);\n  constexpr static XRegister x2(2);\n  constexpr static XRegister x3(3);\n  constexpr static XRegister x4(4);\n  constexpr static XRegister x5(5);\n  constexpr static XRegister x6(6);\n  constexpr static XRegister x7(7);\n  constexpr static XRegister x8(8);\n  constexpr static XRegister x9(9);\n  constexpr static XRegister x10(10);\n  constexpr static XRegister x11(11);\n  constexpr static XRegister x12(12);\n  constexpr static XRegister x13(13);\n  constexpr static XRegister x14(14);\n  constexpr static XRegister x15(15);\n  constexpr static XRegister x16(16);\n  constexpr static XRegister x17(17);\n  constexpr static XRegister x18(18);\n  constexpr static XRegister x19(19);\n  constexpr static XRegister x20(20);\n  constexpr static XRegister x21(21);\n  constexpr static XRegister x22(22);\n  constexpr static XRegister x23(23);\n  constexpr static XRegister x24(24);\n  constexpr static XRegister x25(25);\n  constexpr static XRegister x26(26);\n  constexpr static XRegister x27(27);\n  constexpr static XRegister x28(28);\n  constexpr static XRegister x29(29);\n  constexpr static XRegister x30(30);\n  constexpr static XRegister x31(31);\n\n  // Named registers\n  constexpr static XRegister ip0(16);\n  constexpr static XRegister ip1(17);\n\n  constexpr static XRegister fp(29);\n  constexpr static XRegister lr(30);\n  constexpr static XRegister rsp(31);\n  constexpr static XRegister zr(31);\n} // namespace XReg\n\n// Namespace containing all 32-bit GPR register objects.\nnamespace WReg {\n  constexpr static WRegister w0(0);\n  constexpr static WRegister w1(1);\n  constexpr static WRegister w2(2);\n  constexpr static WRegister w3(3);\n  constexpr static WRegister w4(4);\n  constexpr static WRegister w5(5);\n  constexpr static WRegister w6(6);\n  constexpr static WRegister w7(7);\n  constexpr static WRegister w8(8);\n  constexpr static WRegister w9(9);\n  constexpr static WRegister w10(10);\n  constexpr static WRegister w11(11);\n  constexpr static WRegister w12(12);\n  constexpr static WRegister w13(13);\n  constexpr static WRegister w14(14);\n  constexpr static WRegister w15(15);\n  constexpr static WRegister w16(16);\n  constexpr static WRegister w17(17);\n  constexpr static WRegister w18(18);\n  constexpr static WRegister w19(19);\n  constexpr static WRegister w20(20);\n  constexpr static WRegister w21(21);\n  constexpr static WRegister w22(22);\n  constexpr static WRegister w23(23);\n  constexpr static WRegister w24(24);\n  constexpr static WRegister w25(25);\n  constexpr static WRegister w26(26);\n  constexpr static WRegister w27(27);\n  constexpr static WRegister w28(28);\n  constexpr static WRegister w29(29);\n  constexpr static WRegister w30(30);\n  constexpr static WRegister w31(31);\n\n  // Named registers\n  constexpr static WRegister ip0(16);\n  constexpr static WRegister ip1(17);\n\n  constexpr static WRegister fp(29);\n  constexpr static WRegister lr(30);\n  constexpr static WRegister rsp(31);\n  constexpr static WRegister zr(31);\n} // namespace WReg\n\nclass VRegister;\nclass BRegister;\nclass HRegister;\nclass SRegister;\nclass DRegister;\nclass QRegister;\nclass ZRegister;\n\n/* Unsized ASIMD register class\n * This class doesn't imply a size when used, nor implies Vector or Scalar.\n * It does imply that this instruction isn't using the register for SVE.\n */\nclass VRegister {\npublic:\n  VRegister() = delete;\n  constexpr explicit VRegister(uint32_t Idx)\n    : Index {Idx} {}\n\n  friend constexpr auto operator<=>(const VRegister&, const VRegister&) = default;\n\n  constexpr uint32_t Idx() const {\n    return Index;\n  }\n\n  constexpr BRegister B() const;\n  constexpr HRegister H() const;\n  constexpr SRegister S() const;\n  constexpr DRegister D() const;\n  constexpr QRegister Q() const;\n  constexpr ZRegister Z() const;\n\nprivate:\n  uint32_t Index;\n};\nstatic_assert(sizeof(VRegister) == sizeof(uint32_t));\nstatic_assert(std::is_trivially_copyable_v<VRegister>);\nstatic_assert(std::is_standard_layout_v<VRegister>);\n\n/* 8-bit ASIMD register class\n * This class implies 8-bit scalar register.\n */\nclass BRegister {\npublic:\n  BRegister() = delete;\n  constexpr explicit BRegister(uint32_t Idx)\n    : Index {Idx} {}\n\n  friend constexpr auto operator<=>(const BRegister&, const BRegister&) = default;\n\n  constexpr uint32_t Idx() const {\n    return Index;\n  }\n\n  constexpr operator VRegister() const {\n    return VRegister(Index);\n  }\n  constexpr BRegister V() const;\n  constexpr HRegister H() const;\n  constexpr SRegister S() const;\n  constexpr DRegister D() const;\n  constexpr QRegister Q() const;\n  constexpr ZRegister Z() const;\n\nprivate:\n  uint32_t Index;\n};\nstatic_assert(sizeof(BRegister) == sizeof(uint32_t));\nstatic_assert(std::is_trivially_copyable_v<BRegister>);\nstatic_assert(std::is_standard_layout_v<BRegister>);\n\n/* 16-bit ASIMD register class\n * This class implies 16-bit scalar register.\n */\nclass HRegister {\npublic:\n  HRegister() = delete;\n  constexpr explicit HRegister(uint32_t Idx)\n    : Index {Idx} {}\n\n  friend constexpr auto operator<=>(const HRegister&, const HRegister&) = default;\n\n  constexpr uint32_t Idx() const {\n    return Index;\n  }\n\n  constexpr operator VRegister() const {\n    return VRegister(Index);\n  }\n  constexpr HRegister V() const;\n  constexpr BRegister B() const;\n  constexpr SRegister S() const;\n  constexpr DRegister D() const;\n  constexpr QRegister Q() const;\n  constexpr ZRegister Z() const;\n\nprivate:\n  uint32_t Index;\n};\nstatic_assert(sizeof(HRegister) == sizeof(uint32_t));\nstatic_assert(std::is_trivially_copyable_v<HRegister>);\nstatic_assert(std::is_standard_layout_v<HRegister>);\n\n/* 32-bit ASIMD register class\n * This class implies 32-bit scalar register.\n */\nclass SRegister {\npublic:\n  SRegister() = delete;\n  constexpr explicit SRegister(uint32_t Idx)\n    : Index {Idx} {}\n\n  friend constexpr auto operator<=>(const SRegister&, const SRegister&) = default;\n\n  constexpr uint32_t Idx() const {\n    return Index;\n  }\n\n  constexpr operator VRegister() const {\n    return VRegister(Index);\n  }\n  constexpr SRegister V() const;\n  constexpr BRegister B() const;\n  constexpr HRegister H() const;\n  constexpr DRegister D() const;\n  constexpr QRegister Q() const;\n  constexpr ZRegister Z() const;\n\nprivate:\n  uint32_t Index;\n};\nstatic_assert(sizeof(SRegister) == sizeof(uint32_t));\nstatic_assert(std::is_trivially_copyable_v<SRegister>);\nstatic_assert(std::is_standard_layout_v<SRegister>);\n\n/* 64-bit ASIMD register class\n * This class doesn't imply Vector or Scalar.\n * Associated with operating the instruction at 64-bit.\n */\nclass DRegister {\npublic:\n  DRegister() = delete;\n  constexpr explicit DRegister(uint32_t Idx)\n    : Index {Idx} {}\n\n  friend constexpr auto operator<=>(const DRegister&, const DRegister&) = default;\n\n  constexpr uint32_t Idx() const {\n    return Index;\n  }\n\n  constexpr operator VRegister() const {\n    return VRegister(Index);\n  }\n  constexpr DRegister V() const;\n  constexpr BRegister B() const;\n  constexpr HRegister H() const;\n  constexpr SRegister S() const;\n  constexpr QRegister Q() const;\n  constexpr ZRegister Z() const;\n\nprivate:\n  uint32_t Index;\n};\nstatic_assert(sizeof(DRegister) == sizeof(uint32_t));\nstatic_assert(std::is_trivially_copyable_v<DRegister>);\nstatic_assert(std::is_standard_layout_v<DRegister>);\n\n/* 128-bit ASIMD register class\n * This class doesn't imply Vector or Scalar.\n * Associated with operating the instruction at 128-bit.\n */\nclass QRegister {\npublic:\n  QRegister() = delete;\n  constexpr explicit QRegister(uint32_t Idx)\n    : Index {Idx} {}\n\n  friend constexpr auto operator<=>(const QRegister&, const QRegister&) = default;\n\n  constexpr uint32_t Idx() const {\n    return Index;\n  }\n\n  constexpr operator VRegister() const {\n    return VRegister(Index);\n  }\n  constexpr QRegister V() const;\n  constexpr BRegister B() const;\n  constexpr HRegister H() const;\n  constexpr SRegister S() const;\n  constexpr DRegister D() const;\n  constexpr ZRegister Z() const;\n\nprivate:\n  uint32_t Index;\n};\nstatic_assert(sizeof(QRegister) == sizeof(uint32_t));\nstatic_assert(std::is_trivially_copyable_v<QRegister>);\nstatic_assert(std::is_standard_layout_v<QRegister>);\n\n/* Unsized SVE register class.\n * This class explicitly implies the instruction will operate using SVE.\n */\nclass ZRegister {\npublic:\n  ZRegister() = delete;\n  constexpr explicit ZRegister(uint32_t Idx)\n    : Index {Idx} {}\n\n  friend constexpr auto operator<=>(const ZRegister&, const ZRegister&) = default;\n\n  constexpr uint32_t Idx() const {\n    return Index;\n  }\n\n  constexpr VRegister V() const;\n  constexpr BRegister B() const;\n  constexpr HRegister H() const;\n  constexpr SRegister S() const;\n  constexpr DRegister D() const;\n  constexpr QRegister Q() const;\n\nprivate:\n  uint32_t Index;\n};\nstatic_assert(sizeof(ZRegister) == sizeof(uint32_t));\nstatic_assert(std::is_trivially_copyable_v<ZRegister>);\nstatic_assert(std::is_standard_layout_v<ZRegister>);\n\n// VRegister\ninline constexpr BRegister VRegister::B() const {\n  return BRegister {Index};\n}\ninline constexpr HRegister VRegister::H() const {\n  return HRegister {Index};\n}\ninline constexpr SRegister VRegister::S() const {\n  return SRegister {Index};\n}\ninline constexpr DRegister VRegister::D() const {\n  return DRegister {Index};\n}\ninline constexpr QRegister VRegister::Q() const {\n  return QRegister {Index};\n}\ninline constexpr ZRegister VRegister::Z() const {\n  return ZRegister {Index};\n}\n\n// BRegister\ninline constexpr BRegister BRegister::V() const {\n  return *this;\n}\ninline constexpr HRegister BRegister::H() const {\n  return HRegister {Index};\n}\ninline constexpr SRegister BRegister::S() const {\n  return SRegister {Index};\n}\ninline constexpr DRegister BRegister::D() const {\n  return DRegister {Index};\n}\ninline constexpr QRegister BRegister::Q() const {\n  return QRegister {Index};\n}\ninline constexpr ZRegister BRegister::Z() const {\n  return ZRegister {Index};\n}\n\n// HRegister\ninline constexpr HRegister HRegister::V() const {\n  return *this;\n}\ninline constexpr BRegister HRegister::B() const {\n  return BRegister {Index};\n}\ninline constexpr SRegister HRegister::S() const {\n  return SRegister {Index};\n}\ninline constexpr DRegister HRegister::D() const {\n  return DRegister {Index};\n}\ninline constexpr QRegister HRegister::Q() const {\n  return QRegister {Index};\n}\ninline constexpr ZRegister HRegister::Z() const {\n  return ZRegister {Index};\n}\n\n// SRegister\ninline constexpr SRegister SRegister::V() const {\n  return *this;\n}\ninline constexpr BRegister SRegister::B() const {\n  return BRegister {Index};\n}\ninline constexpr HRegister SRegister::H() const {\n  return HRegister {Index};\n}\ninline constexpr DRegister SRegister::D() const {\n  return DRegister {Index};\n}\ninline constexpr QRegister SRegister::Q() const {\n  return QRegister {Index};\n}\ninline constexpr ZRegister SRegister::Z() const {\n  return ZRegister {Index};\n}\n\n// DRegister\ninline constexpr DRegister DRegister::V() const {\n  return DRegister {Index};\n}\ninline constexpr BRegister DRegister::B() const {\n  return BRegister {Index};\n}\ninline constexpr HRegister DRegister::H() const {\n  return HRegister {Index};\n}\ninline constexpr SRegister DRegister::S() const {\n  return SRegister {Index};\n}\ninline constexpr QRegister DRegister::Q() const {\n  return QRegister {Index};\n}\ninline constexpr ZRegister DRegister::Z() const {\n  return ZRegister {Index};\n}\n\n// QRegister\ninline constexpr QRegister QRegister::V() const {\n  return *this;\n}\ninline constexpr BRegister QRegister::B() const {\n  return BRegister {Index};\n}\ninline constexpr HRegister QRegister::H() const {\n  return HRegister {Index};\n}\ninline constexpr SRegister QRegister::S() const {\n  return SRegister {Index};\n}\ninline constexpr DRegister QRegister::D() const {\n  return DRegister {Index};\n}\ninline constexpr ZRegister QRegister::Z() const {\n  return ZRegister {Index};\n}\n\n// ZRegister\ninline constexpr VRegister ZRegister::V() const {\n  return VRegister(Index);\n}\ninline constexpr BRegister ZRegister::B() const {\n  return BRegister(Index);\n}\ninline constexpr HRegister ZRegister::H() const {\n  return HRegister(Index);\n}\ninline constexpr SRegister ZRegister::S() const {\n  return SRegister(Index);\n}\ninline constexpr DRegister ZRegister::D() const {\n  return DRegister(Index);\n}\ninline constexpr QRegister ZRegister::Q() const {\n  return QRegister(Index);\n}\n\n// Namespace containing all unsized ASIMD register objects.\nnamespace VReg {\n  constexpr static VRegister v0(0);\n  constexpr static VRegister v1(1);\n  constexpr static VRegister v2(2);\n  constexpr static VRegister v3(3);\n  constexpr static VRegister v4(4);\n  constexpr static VRegister v5(5);\n  constexpr static VRegister v6(6);\n  constexpr static VRegister v7(7);\n  constexpr static VRegister v8(8);\n  constexpr static VRegister v9(9);\n  constexpr static VRegister v10(10);\n  constexpr static VRegister v11(11);\n  constexpr static VRegister v12(12);\n  constexpr static VRegister v13(13);\n  constexpr static VRegister v14(14);\n  constexpr static VRegister v15(15);\n  constexpr static VRegister v16(16);\n  constexpr static VRegister v17(17);\n  constexpr static VRegister v18(18);\n  constexpr static VRegister v19(19);\n  constexpr static VRegister v20(20);\n  constexpr static VRegister v21(21);\n  constexpr static VRegister v22(22);\n  constexpr static VRegister v23(23);\n  constexpr static VRegister v24(24);\n  constexpr static VRegister v25(25);\n  constexpr static VRegister v26(26);\n  constexpr static VRegister v27(27);\n  constexpr static VRegister v28(28);\n  constexpr static VRegister v29(29);\n  constexpr static VRegister v30(30);\n  constexpr static VRegister v31(31);\n} // namespace VReg\n\n// Namespace containing all 8-bit ASIMD register objects.\nnamespace BReg {\n  constexpr static BRegister b0(0);\n  constexpr static BRegister b1(1);\n  constexpr static BRegister b2(2);\n  constexpr static BRegister b3(3);\n  constexpr static BRegister b4(4);\n  constexpr static BRegister b5(5);\n  constexpr static BRegister b6(6);\n  constexpr static BRegister b7(7);\n  constexpr static BRegister b8(8);\n  constexpr static BRegister b9(9);\n  constexpr static BRegister b10(10);\n  constexpr static BRegister b11(11);\n  constexpr static BRegister b12(12);\n  constexpr static BRegister b13(13);\n  constexpr static BRegister b14(14);\n  constexpr static BRegister b15(15);\n  constexpr static BRegister b16(16);\n  constexpr static BRegister b17(17);\n  constexpr static BRegister b18(18);\n  constexpr static BRegister b19(19);\n  constexpr static BRegister b20(20);\n  constexpr static BRegister b21(21);\n  constexpr static BRegister b22(22);\n  constexpr static BRegister b23(23);\n  constexpr static BRegister b24(24);\n  constexpr static BRegister b25(25);\n  constexpr static BRegister b26(26);\n  constexpr static BRegister b27(27);\n  constexpr static BRegister b28(28);\n  constexpr static BRegister b29(29);\n  constexpr static BRegister b30(30);\n  constexpr static BRegister b31(31);\n} // namespace BReg\n\n// Namespace containing all 16-bit ASIMD register objects.\nnamespace HReg {\n  constexpr static HRegister h0(0);\n  constexpr static HRegister h1(1);\n  constexpr static HRegister h2(2);\n  constexpr static HRegister h3(3);\n  constexpr static HRegister h4(4);\n  constexpr static HRegister h5(5);\n  constexpr static HRegister h6(6);\n  constexpr static HRegister h7(7);\n  constexpr static HRegister h8(8);\n  constexpr static HRegister h9(9);\n  constexpr static HRegister h10(10);\n  constexpr static HRegister h11(11);\n  constexpr static HRegister h12(12);\n  constexpr static HRegister h13(13);\n  constexpr static HRegister h14(14);\n  constexpr static HRegister h15(15);\n  constexpr static HRegister h16(16);\n  constexpr static HRegister h17(17);\n  constexpr static HRegister h18(18);\n  constexpr static HRegister h19(19);\n  constexpr static HRegister h20(20);\n  constexpr static HRegister h21(21);\n  constexpr static HRegister h22(22);\n  constexpr static HRegister h23(23);\n  constexpr static HRegister h24(24);\n  constexpr static HRegister h25(25);\n  constexpr static HRegister h26(26);\n  constexpr static HRegister h27(27);\n  constexpr static HRegister h28(28);\n  constexpr static HRegister h29(29);\n  constexpr static HRegister h30(30);\n  constexpr static HRegister h31(31);\n} // namespace HReg\n\n// Namespace containing all 32-bit ASIMD register objects.\nnamespace SReg {\n  constexpr static SRegister s0(0);\n  constexpr static SRegister s1(1);\n  constexpr static SRegister s2(2);\n  constexpr static SRegister s3(3);\n  constexpr static SRegister s4(4);\n  constexpr static SRegister s5(5);\n  constexpr static SRegister s6(6);\n  constexpr static SRegister s7(7);\n  constexpr static SRegister s8(8);\n  constexpr static SRegister s9(9);\n  constexpr static SRegister s10(10);\n  constexpr static SRegister s11(11);\n  constexpr static SRegister s12(12);\n  constexpr static SRegister s13(13);\n  constexpr static SRegister s14(14);\n  constexpr static SRegister s15(15);\n  constexpr static SRegister s16(16);\n  constexpr static SRegister s17(17);\n  constexpr static SRegister s18(18);\n  constexpr static SRegister s19(19);\n  constexpr static SRegister s20(20);\n  constexpr static SRegister s21(21);\n  constexpr static SRegister s22(22);\n  constexpr static SRegister s23(23);\n  constexpr static SRegister s24(24);\n  constexpr static SRegister s25(25);\n  constexpr static SRegister s26(26);\n  constexpr static SRegister s27(27);\n  constexpr static SRegister s28(28);\n  constexpr static SRegister s29(29);\n  constexpr static SRegister s30(30);\n  constexpr static SRegister s31(31);\n} // namespace SReg\n\n// Namespace containing all 64-bit ASIMD register objects.\nnamespace DReg {\n  constexpr static DRegister d0(0);\n  constexpr static DRegister d1(1);\n  constexpr static DRegister d2(2);\n  constexpr static DRegister d3(3);\n  constexpr static DRegister d4(4);\n  constexpr static DRegister d5(5);\n  constexpr static DRegister d6(6);\n  constexpr static DRegister d7(7);\n  constexpr static DRegister d8(8);\n  constexpr static DRegister d9(9);\n  constexpr static DRegister d10(10);\n  constexpr static DRegister d11(11);\n  constexpr static DRegister d12(12);\n  constexpr static DRegister d13(13);\n  constexpr static DRegister d14(14);\n  constexpr static DRegister d15(15);\n  constexpr static DRegister d16(16);\n  constexpr static DRegister d17(17);\n  constexpr static DRegister d18(18);\n  constexpr static DRegister d19(19);\n  constexpr static DRegister d20(20);\n  constexpr static DRegister d21(21);\n  constexpr static DRegister d22(22);\n  constexpr static DRegister d23(23);\n  constexpr static DRegister d24(24);\n  constexpr static DRegister d25(25);\n  constexpr static DRegister d26(26);\n  constexpr static DRegister d27(27);\n  constexpr static DRegister d28(28);\n  constexpr static DRegister d29(29);\n  constexpr static DRegister d30(30);\n  constexpr static DRegister d31(31);\n} // namespace DReg\n\n// Namespace containing all 128-bit ASIMD register objects.\nnamespace QReg {\n  constexpr static QRegister q0(0);\n  constexpr static QRegister q1(1);\n  constexpr static QRegister q2(2);\n  constexpr static QRegister q3(3);\n  constexpr static QRegister q4(4);\n  constexpr static QRegister q5(5);\n  constexpr static QRegister q6(6);\n  constexpr static QRegister q7(7);\n  constexpr static QRegister q8(8);\n  constexpr static QRegister q9(9);\n  constexpr static QRegister q10(10);\n  constexpr static QRegister q11(11);\n  constexpr static QRegister q12(12);\n  constexpr static QRegister q13(13);\n  constexpr static QRegister q14(14);\n  constexpr static QRegister q15(15);\n  constexpr static QRegister q16(16);\n  constexpr static QRegister q17(17);\n  constexpr static QRegister q18(18);\n  constexpr static QRegister q19(19);\n  constexpr static QRegister q20(20);\n  constexpr static QRegister q21(21);\n  constexpr static QRegister q22(22);\n  constexpr static QRegister q23(23);\n  constexpr static QRegister q24(24);\n  constexpr static QRegister q25(25);\n  constexpr static QRegister q26(26);\n  constexpr static QRegister q27(27);\n  constexpr static QRegister q28(28);\n  constexpr static QRegister q29(29);\n  constexpr static QRegister q30(30);\n  constexpr static QRegister q31(31);\n} // namespace QReg\n\n// Namespace containing all unsigned SVE register objects.\nnamespace ZReg {\n  constexpr static ZRegister z0(0);\n  constexpr static ZRegister z1(1);\n  constexpr static ZRegister z2(2);\n  constexpr static ZRegister z3(3);\n  constexpr static ZRegister z4(4);\n  constexpr static ZRegister z5(5);\n  constexpr static ZRegister z6(6);\n  constexpr static ZRegister z7(7);\n  constexpr static ZRegister z8(8);\n  constexpr static ZRegister z9(9);\n  constexpr static ZRegister z10(10);\n  constexpr static ZRegister z11(11);\n  constexpr static ZRegister z12(12);\n  constexpr static ZRegister z13(13);\n  constexpr static ZRegister z14(14);\n  constexpr static ZRegister z15(15);\n  constexpr static ZRegister z16(16);\n  constexpr static ZRegister z17(17);\n  constexpr static ZRegister z18(18);\n  constexpr static ZRegister z19(19);\n  constexpr static ZRegister z20(20);\n  constexpr static ZRegister z21(21);\n  constexpr static ZRegister z22(22);\n  constexpr static ZRegister z23(23);\n  constexpr static ZRegister z24(24);\n  constexpr static ZRegister z25(25);\n  constexpr static ZRegister z26(26);\n  constexpr static ZRegister z27(27);\n  constexpr static ZRegister z28(28);\n  constexpr static ZRegister z29(29);\n  constexpr static ZRegister z30(30);\n  constexpr static ZRegister z31(31);\n} // namespace ZReg\n\n// Zero-cost FPR->GPR\ninline constexpr Register ToReg(HRegister Reg) {\n  return Register(Reg.Idx());\n}\ninline constexpr Register ToReg(SRegister Reg) {\n  return Register(Reg.Idx());\n}\ninline constexpr Register ToReg(DRegister Reg) {\n  return Register(Reg.Idx());\n}\ninline constexpr Register ToReg(VRegister Reg) {\n  return Register(Reg.Idx());\n}\n\n// Zero-cost GPR->FPR\ninline constexpr VRegister ToVReg(Register Reg) {\n  return VRegister(Reg.Idx());\n}\ninline constexpr VRegister ToVReg(XRegister Reg) {\n  return VRegister(Reg.Idx());\n}\ninline constexpr VRegister ToVReg(WRegister Reg) {\n  return VRegister(Reg.Idx());\n}\n\nclass PRegisterZero;\nclass PRegisterMerge;\n\n/* Unsized predicate register for SVE.\n * This is unsized because of how SVE operates.\n */\nclass PRegister {\npublic:\n  PRegister() = delete;\n  constexpr PRegister(uint32_t Idx)\n    : Index {Idx} {}\n\n  friend constexpr auto operator<=>(const PRegister&, const PRegister&) = default;\n\n  constexpr uint32_t Idx() const {\n    return Index;\n  }\n\n  constexpr PRegisterZero Zeroing() const;\n  constexpr PRegisterMerge Merging() const;\n\nprivate:\n  uint32_t Index;\n};\nstatic_assert(sizeof(PRegister) == sizeof(uint32_t));\nstatic_assert(std::is_trivially_copyable_v<PRegister>);\nstatic_assert(std::is_standard_layout_v<PRegister>);\n\n// Unsized predicate register for SVE with zeroing semantics.\nclass PRegisterZero {\npublic:\n  PRegisterZero() = delete;\n  constexpr PRegisterZero(uint32_t Idx)\n    : Index {Idx} {}\n\n  friend constexpr auto operator<=>(const PRegisterZero&, const PRegisterZero&) = default;\n\n  constexpr uint32_t Idx() const {\n    return Index;\n  }\n\n  constexpr operator PRegister() const {\n    return PRegister(Index);\n  }\n  constexpr PRegister P() const {\n    return PRegister(Index);\n  }\n  constexpr PRegisterMerge Merging() const;\n\nprivate:\n  uint32_t Index;\n};\nstatic_assert(sizeof(PRegisterZero) == sizeof(uint32_t));\nstatic_assert(std::is_trivially_copyable_v<PRegisterZero>);\nstatic_assert(std::is_standard_layout_v<PRegisterZero>);\n\n// Unsized predicate register for SVE with merging semantics.\nclass PRegisterMerge {\npublic:\n  PRegisterMerge() = delete;\n  constexpr PRegisterMerge(uint32_t Idx)\n    : Index {Idx} {}\n\n  friend constexpr auto operator<=>(const PRegisterMerge&, const PRegisterMerge&) = default;\n\n  constexpr uint32_t Idx() const {\n    return Index;\n  }\n\n  constexpr operator PRegister() const {\n    return PRegister(Index);\n  }\n  constexpr PRegister P() const {\n    return PRegister(Index);\n  }\n  constexpr PRegisterZero Zeroing() const;\n\nprivate:\n  uint32_t Index;\n};\nstatic_assert(sizeof(PRegisterMerge) == sizeof(uint32_t));\nstatic_assert(std::is_trivially_copyable_v<PRegisterMerge>);\nstatic_assert(std::is_standard_layout_v<PRegisterMerge>);\n\n// PRegister\ninline constexpr PRegisterZero PRegister::Zeroing() const {\n  return PRegisterZero(Idx());\n}\ninline constexpr PRegisterMerge PRegister::Merging() const {\n  return PRegisterMerge(Idx());\n}\n\n// PRegisterZero\ninline constexpr PRegisterMerge PRegisterZero::Merging() const {\n  return PRegisterMerge(Idx());\n}\n\n// PRegisterMerge\ninline constexpr PRegisterZero PRegisterMerge::Zeroing() const {\n  return PRegisterZero(Idx());\n}\n\n// Namespace containing all unsigned SVE predicate register objects.\nnamespace PReg {\n  constexpr static PRegister p0(0);\n  constexpr static PRegister p1(1);\n  constexpr static PRegister p2(2);\n  constexpr static PRegister p3(3);\n  constexpr static PRegister p4(4);\n  constexpr static PRegister p5(5);\n  constexpr static PRegister p6(6);\n  constexpr static PRegister p7(7);\n  constexpr static PRegister p8(8);\n  constexpr static PRegister p9(9);\n  constexpr static PRegister p10(10);\n  constexpr static PRegister p11(11);\n  constexpr static PRegister p12(12);\n  constexpr static PRegister p13(13);\n  constexpr static PRegister p14(14);\n  constexpr static PRegister p15(15);\n} // namespace PReg\n\n/* `OpType` enum describes how some SVE instructions operate if they support both forms.\n * Not all SVE instructions support this.\n */\nenum class OpType : uint32_t {\n  Destructive = 0,\n  Constructive,\n};\n} // namespace ARMEmitter\n"
  },
  {
    "path": "CodeEmitter/CodeEmitter/SVEOps.inl",
    "content": "// SPDX-License-Identifier: MIT\n/* SVE instruction emitters\n * These contain instruction emitters for AArch64 SVE and SVE2 operations.\n *\n * All of these SVE emitters have a `SubRegSize` as their first argument to set the element size on the instruction.\n * Since nearly every SVE instruction is unsized they don't need more than `ZRegister` and `PRegister` arguments.\n *\n * Most predicated instructions take a `PRegister` argument, not explicitly stating if it is merging or zeroing behaviour.\n * This is because the instruction only supports one style.\n * For instructions that take an explicit `PRegisterMerge` or `PRegisterZero`, then this instruction likely\n * supports both so we support both implementations depending on predicate register type.\n *\n * Some instructions take a templated `OpType` to choose between a destructive or constructive version of the instruction.\n *\n * Some instructions support the `i128Bit` SubRegSize, mostly around data movement.\n *\n * There are some SVE load-store helper functions which take a `SVEMemOperand` argument.\n * This helper will select the viable SVE load-store that can work with the provided encapsulated arguments.\n */\n\n#pragma once\n#ifndef INCLUDED_BY_EMITTER\n#include <CodeEmitter/Emitter.h>\nnamespace ARMEmitter {\nstruct EmitterOps : Emitter {\n#endif\n\npublic:\n  // SVE encodings\n  void dup(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Index) {\n    SVEDupIndexed(size, zn, zd, Index);\n  }\n\n  void sel(SubRegSize size, ZRegister zd, PRegister pv, ZRegister zn, ZRegister zm) {\n    SVESel(size, zm, pv, zn, zd);\n  }\n  void mov(SubRegSize size, ZRegister zd, PRegisterMerge pv, ZRegister zn) {\n    sel(size, zd, pv, zn, zd);\n  }\n\n  void histcnt(SubRegSize size, ZRegister zd, PRegisterZero pv, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"SubRegSize must be 32-bit or 64-bit\");\n    LOGMAN_THROW_A_FMT(pv <= PReg::p7.Zeroing(), \"histcnt can only use p0 to p7\");\n\n    uint32_t Op = 0b0100'0101'0010'0000'1100'0000'0000'0000;\n    Op |= FEXCore::ToUnderlying(size) << 22;\n    Op |= zm.Idx() << 16;\n    Op |= pv.Idx() << 10;\n    Op |= zn.Idx() << 5;\n    Op |= zd.Idx();\n    dc32(Op);\n  }\n\n  void histseg(ZRegister zd, ZRegister zn, ZRegister zm) {\n    uint32_t Op = 0b0100'0101'0010'0000'1010'0000'0000'0000;\n    Op |= zm.Idx() << 16;\n    Op |= zn.Idx() << 5;\n    Op |= zd.Idx();\n    dc32(Op);\n  }\n\n  void fcmla(SubRegSize size, ZRegister zda, PRegisterMerge pv, ZRegister zn, ZRegister zm, Rotation rot) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"SubRegSize must be 16-bit, 32-bit, or 64-bit\");\n    LOGMAN_THROW_A_FMT(pv <= PReg::p7.Merging(), \"fcmla can only use p0 to p7\");\n\n    uint32_t Op = 0b0110'0100'0000'0000'0000'0000'0000'0000;\n    Op |= FEXCore::ToUnderlying(size) << 22;\n    Op |= zm.Idx() << 16;\n    Op |= FEXCore::ToUnderlying(rot) << 13;\n    Op |= pv.Idx() << 10;\n    Op |= zn.Idx() << 5;\n    Op |= zda.Idx();\n\n    dc32(Op);\n  }\n\n  void fcadd(SubRegSize size, ZRegister zd, PRegisterMerge pv, ZRegister zn, ZRegister zm, Rotation rot) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"SubRegSize must be 16-bit, 32-bit, or 64-bit\");\n    LOGMAN_THROW_A_FMT(pv <= PReg::p7.Merging(), \"fcadd can only use p0 to p7\");\n    LOGMAN_THROW_A_FMT(rot == Rotation::ROTATE_90 || rot == Rotation::ROTATE_270, \"fcadd rotation may only be 90 or 270 degrees\");\n    LOGMAN_THROW_A_FMT(zd == zn, \"fcadd zd and zn must be the same register\");\n\n    const uint32_t ConvertedRotation = rot == Rotation::ROTATE_90 ? 0 : 1;\n\n    uint32_t Op = 0b0110'0100'0000'0000'1000'0000'0000'0000;\n    Op |= FEXCore::ToUnderlying(size) << 22;\n    Op |= ConvertedRotation << 16;\n    Op |= pv.Idx() << 10;\n    Op |= zm.Idx() << 5;\n    Op |= zd.Idx();\n\n    dc32(Op);\n  }\n\n  // SVE integer add/subtract vectors (unpredicated)\n  void add(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEIntegerAddSubUnpredicated(0b000, size, zm, zn, zd);\n  }\n  void sub(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEIntegerAddSubUnpredicated(0b001, size, zm, zn, zd);\n  }\n  void sqadd(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEIntegerAddSubUnpredicated(0b100, size, zm, zn, zd);\n  }\n  void uqadd(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEIntegerAddSubUnpredicated(0b101, size, zm, zn, zd);\n  }\n  void sqsub(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEIntegerAddSubUnpredicated(0b110, size, zm, zn, zd);\n  }\n  void uqsub(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEIntegerAddSubUnpredicated(0b111, size, zm, zn, zd);\n  }\n\n  // SVE address generation\n  void adr(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm, SVEModType mod = SVEModType::MOD_NONE, uint32_t scale = 0) {\n    SVEAddressGeneration(size, zd, zn, zm, mod, scale);\n  }\n\n  // SVE table lookup (three sources)\n  void tbl(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVETableLookup(0b100, size, zm, zn, zd);\n  }\n  void tbl(SubRegSize size, ZRegister zd, ZRegister zn1, ZRegister zn2, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zn1, zn2), \"TBL zn1 and zn2 must be sequential\");\n    SVETableLookup(0b010, size, zm, zn1, zd);\n  }\n  void tbx(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVETableLookup(0b011, size, zm, zn, zd);\n  }\n\n  // SVE permute vector elements\n  void zip1(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEPermute(0b000, size, zm, zn, zd);\n  }\n  void zip2(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEPermute(0b001, size, zm, zn, zd);\n  }\n  void uzp1(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEPermute(0b010, size, zm, zn, zd);\n  }\n  void uzp2(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEPermute(0b011, size, zm, zn, zd);\n  }\n  void trn1(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEPermute(0b100, size, zm, zn, zd);\n  }\n  void trn2(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEPermute(0b101, size, zm, zn, zd);\n  }\n\n  // SVE integer compare with unsigned immediate\n  void cmphi(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, uint32_t imm) {\n    SVEIntegerCompareImm(0, 1, imm, size, pg, zn, pd);\n  }\n  void cmphs(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, uint32_t imm) {\n    SVEIntegerCompareImm(0, 0, imm, size, pg, zn, pd);\n  }\n  void cmplo(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, uint32_t imm) {\n    SVEIntegerCompareImm(1, 0, imm, size, pg, zn, pd);\n  }\n  void cmpls(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, uint32_t imm) {\n    SVEIntegerCompareImm(1, 1, imm, size, pg, zn, pd);\n  }\n\n  // SVE integer compare with signed immediate\n  void cmpeq(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, int32_t imm) {\n    SVEIntegerCompareSignedImm(1, 0, 0, imm, size, pg, zn, pd);\n  }\n  void cmpgt(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, int32_t imm) {\n    SVEIntegerCompareSignedImm(0, 0, 1, imm, size, pg, zn, pd);\n  }\n  void cmpge(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, int32_t imm) {\n    SVEIntegerCompareSignedImm(0, 0, 0, imm, size, pg, zn, pd);\n  }\n  void cmplt(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, int32_t imm) {\n    SVEIntegerCompareSignedImm(0, 1, 0, imm, size, pg, zn, pd);\n  }\n  void cmple(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, int32_t imm) {\n    SVEIntegerCompareSignedImm(0, 1, 1, imm, size, pg, zn, pd);\n  }\n  void cmpne(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, int32_t imm) {\n    SVEIntegerCompareSignedImm(1, 0, 1, imm, size, pg, zn, pd);\n  }\n\n  // SVE predicate logical operations\n  void and_(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPredicateLogical(0, 0, 0, 0, pm, pg, pn, pd);\n  }\n  void ands(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPredicateLogical(0, 1, 0, 0, pm, pg, pn, pd);\n  }\n\n  void mov(PRegister pd, PRegisterMerge pg, PRegister pn) {\n    SVEPredicateLogical(0, 0, 1, 1, pd, pg, pn, pd);\n  }\n  void mov(PRegister pd, PRegisterZero pg, PRegister pn) {\n    SVEPredicateLogical(0, 0, 0, 0, pn, pg, pn, pd);\n  }\n\n  void movs(PRegister pd, PRegisterZero pg, PRegister pn) {\n    SVEPredicateLogical(0, 1, 0, 0, pn, pg, pn, pd);\n  }\n  void bic(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPredicateLogical(0, 0, 0, 1, pm, pg, pn, pd);\n  }\n  void bics(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPredicateLogical(0, 1, 0, 1, pm, pg, pn, pd);\n  }\n\n  void eor(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPredicateLogical(0, 0, 1, 0, pm, pg, pn, pd);\n  }\n  void eors(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPredicateLogical(0, 1, 1, 0, pm, pg, pn, pd);\n  }\n\n  void not_(PRegister pd, PRegisterZero pg, PRegister pn) {\n    SVEPredicateLogical(0, 0, 1, 0, pg, pg, pn, pd);\n  }\n  void sel(PRegister pd, PRegister pg, PRegister pn, PRegister pm) {\n    SVEPredicateLogical(0, 0, 1, 1, pm, pg, pn, pd);\n  }\n  void orr(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPredicateLogical(1, 0, 0, 0, pm, pg, pn, pd);\n  }\n  void mov(PRegister pd, PRegister pn) {\n    SVEPredicateLogical(1, 0, 0, 0, pn, pn, pn, pd);\n  }\n  void orn(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPredicateLogical(1, 0, 0, 1, pm, pg, pn, pd);\n  }\n  void nor(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPredicateLogical(1, 0, 1, 0, pm, pg, pn, pd);\n  }\n  void nand(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPredicateLogical(1, 0, 1, 1, pm, pg, pn, pd);\n  }\n  void orrs(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPredicateLogical(1, 1, 0, 0, pm, pg, pn, pd);\n  }\n  void movs(PRegister pd, PRegister pn) {\n    SVEPredicateLogical(1, 1, 0, 0, pn, pn, pn, pd);\n  }\n  void orns(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPredicateLogical(1, 1, 0, 1, pm, pg, pn, pd);\n  }\n  void nors(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPredicateLogical(1, 1, 1, 0, pm, pg, pn, pd);\n  }\n  void nands(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPredicateLogical(1, 1, 1, 1, pm, pg, pn, pd);\n  }\n\n  // SVE broadcast predicate element\n  // XXX:\n\n  // SVE integer clamp\n  // XXX:\n\n  // SVE2 character match\n  void match(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVECharacterMatch(0, size, pd, pg, zn, zm);\n  }\n  void nmatch(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVECharacterMatch(1, size, pd, pg, zn, zm);\n  }\n\n  // SVE floating-point convert precision odd elements\n  void fcvtxnt(ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEFloatConvertOdd(0b00, 0b10, pg, zn, zd);\n  }\n  ///< Size is destination size\n  void fcvtnt(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i32Bit || size == SubRegSize::i16Bit, \"Unsupported size in {}\", __func__);\n\n    const auto ConvertedDestSize = size == SubRegSize::i16Bit ? 0b00 : size == SubRegSize::i32Bit ? 0b10 : 0b00;\n\n    const auto ConvertedSrcSize = size == SubRegSize::i16Bit ? 0b10 : size == SubRegSize::i32Bit ? 0b11 : 0b00;\n\n    SVEFloatConvertOdd(ConvertedSrcSize, ConvertedDestSize, pg, zn, zd);\n  }\n\n  ///< Size is destination size\n  void fcvtlt(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i64Bit || size == SubRegSize::i32Bit, \"Unsupported size in {}\", __func__);\n\n    const auto ConvertedDestSize = size == SubRegSize::i32Bit ? 0b01 : size == SubRegSize::i64Bit ? 0b11 : 0b00;\n\n    const auto ConvertedSrcSize = size == SubRegSize::i32Bit ? 0b10 : size == SubRegSize::i64Bit ? 0b11 : 0b00;\n\n    SVEFloatConvertOdd(ConvertedSrcSize, ConvertedDestSize, pg, zn, zd);\n  }\n\n  // XXX: BFCVTNT\n\n  // SVE2 floating-point pairwise operations\n  void faddp(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatPairwiseArithmetic(0b000, size, pg, zd, zn, zm);\n  }\n  void fmaxnmp(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatPairwiseArithmetic(0b100, size, pg, zd, zn, zm);\n  }\n  void fminnmp(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatPairwiseArithmetic(0b101, size, pg, zd, zn, zm);\n  }\n  void fmaxp(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatPairwiseArithmetic(0b110, size, pg, zd, zn, zm);\n  }\n  void fminp(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatPairwiseArithmetic(0b111, size, pg, zd, zn, zm);\n  }\n\n  // SVE floating-point multiply-add (indexed)\n  void fmla(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm, uint32_t index) {\n    SVEFPMultiplyAddIndexed(0, size, zda, zn, zm, index);\n  }\n  void fmls(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm, uint32_t index) {\n    SVEFPMultiplyAddIndexed(1, size, zda, zn, zm, index);\n  }\n\n  // SVE floating-point complex multiply-add (indexed)\n  void fcmla(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm, uint32_t index, Rotation rot) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i16Bit || size == SubRegSize::i32Bit, \"SubRegSize must be 16-bit or 32-bit\");\n\n    // 16 -> 32, 32 -> 64, since fcmla (indexed)'s restrictions and encodings\n    // are essentially as if 16-bit were 32-bit and 32-bit were 64-bit.\n    const auto DoubledSize = static_cast<SubRegSize>(FEXCore::ToUnderlying(size) + 1);\n\n    SVEFPMultiplyAddIndexed(0b100 | FEXCore::ToUnderlying(rot), DoubledSize, zda, zn, zm, index);\n  }\n\n  // SVE floating-point multiply (indexed)\n  void fmul(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm, uint32_t index) {\n    SVEFPMultiplyAddIndexed(0b1000, size, zd, zn, zm, index);\n  }\n\n  // SVE floating point matrix multiply accumulate\n  // XXX: BFMMLA\n  void fmmla(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEFPMatrixMultiplyAccumulate(size, zda, zn, zm);\n  }\n\n  // SVE floating-point compare vectors\n  void fcmeq(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEFloatCompareVector(0, 1, 0, size, zm, pg, zn, pd);\n  }\n  void fcmgt(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEFloatCompareVector(0, 0, 1, size, zm, pg, zn, pd);\n  }\n  void fcmge(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEFloatCompareVector(0, 0, 0, size, zm, pg, zn, pd);\n  }\n  void fcmne(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEFloatCompareVector(0, 1, 1, size, zm, pg, zn, pd);\n  }\n  void fcmuo(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEFloatCompareVector(1, 0, 0, size, zm, pg, zn, pd);\n  }\n  void facge(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEFloatCompareVector(1, 0, 1, size, zm, pg, zn, pd);\n  }\n  void facgt(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEFloatCompareVector(1, 1, 1, size, zm, pg, zn, pd);\n  }\n  void facle(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zm, ZRegister zn) {\n    facge(size, pd, pg, zn, zm);\n  }\n  void faclt(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zm, ZRegister zn) {\n    facgt(size, pd, pg, zn, zm);\n  }\n\n  // SVE floating-point arithmetic (unpredicated)\n  void fadd(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticUnpredicated(0b000, size, zm, zn, zd);\n  }\n  void fsub(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticUnpredicated(0b001, size, zm, zn, zd);\n  }\n  void fmul(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticUnpredicated(0b010, size, zm, zn, zd);\n  }\n  void ftsmul(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticUnpredicated(0b011, size, zm, zn, zd);\n  }\n  void frecps(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticUnpredicated(0b110, size, zm, zn, zd);\n  }\n  void frsqrts(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticUnpredicated(0b111, size, zm, zn, zd);\n  }\n\n  // SVE floating-point recursive reduction\n  void faddv(SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    SVEFPRecursiveReduction(0b000, size, vd, pg, zn);\n  }\n  void fmaxnmv(SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    SVEFPRecursiveReduction(0b100, size, vd, pg, zn);\n  }\n  void fminnmv(SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    SVEFPRecursiveReduction(0b101, size, vd, pg, zn);\n  }\n  void fmaxv(SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    SVEFPRecursiveReduction(0b110, size, vd, pg, zn);\n  }\n  void fminv(SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    SVEFPRecursiveReduction(0b111, size, vd, pg, zn);\n  }\n\n  // SVE integer Multiply-Add - Predicated\n  // SVE integer multiply-accumulate writing addend (predicated)\n  void mla(SubRegSize size, ZRegister zda, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerMultiplyAddSubPredicated(0b0, 0b0, size, zda, pg, zn, zm);\n  }\n  void mls(SubRegSize size, ZRegister zda, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerMultiplyAddSubPredicated(0b0, 0b1, size, zda, pg, zn, zm);\n  }\n\n  // SVE integer multiply-add writing multiplicand (predicated)\n  void mad(SubRegSize size, ZRegister zdn, PRegisterMerge pg, ZRegister zm, ZRegister za) {\n    SVEIntegerMultiplyAddSubPredicated(0b1, 0b0, size, zdn, pg, za, zm);\n  }\n  void msb(SubRegSize size, ZRegister zdn, PRegisterMerge pg, ZRegister zm, ZRegister za) {\n    SVEIntegerMultiplyAddSubPredicated(0b1, 0b1, size, zdn, pg, za, zm);\n  }\n\n  // SVE Integer Binary Arithmetic - Predicated\n  // SVE integer add/subtract vectors (predicated)\n  void add(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEAddSubVectorsPredicated(0b000, size, zd, pg, zn, zm);\n  }\n  void sub(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEAddSubVectorsPredicated(0b001, size, zd, pg, zn, zm);\n  }\n  void subr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEAddSubVectorsPredicated(0b011, size, zd, pg, zn, zm);\n  }\n\n  // SVE integer min/max/difference (predicated)\n  void smax(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, ZRegister zm) {\n    SVEIntegerMinMaxDifferencePredicated(0b00, 0, size, pg, zdn, zm, zd);\n  }\n  void umax(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, ZRegister zm) {\n    SVEIntegerMinMaxDifferencePredicated(0b00, 1, size, pg, zdn, zm, zd);\n  }\n  void smin(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, ZRegister zm) {\n    SVEIntegerMinMaxDifferencePredicated(0b01, 0, size, pg, zdn, zm, zd);\n  }\n  void umin(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, ZRegister zm) {\n    SVEIntegerMinMaxDifferencePredicated(0b01, 1, size, pg, zdn, zm, zd);\n  }\n  void sabd(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, ZRegister zm) {\n    SVEIntegerMinMaxDifferencePredicated(0b10, 0, size, pg, zdn, zm, zd);\n  }\n  void uabd(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, ZRegister zm) {\n    SVEIntegerMinMaxDifferencePredicated(0b10, 1, size, pg, zdn, zm, zd);\n  }\n\n  // SVE integer multiply vectors (predicated)\n  void mul(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerMulDivVectorsPredicated(0b0, 0b00, size, zd, pg, zn, zm);\n  }\n  void smulh(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerMulDivVectorsPredicated(0b0, 0b10, size, zd, pg, zn, zm);\n  }\n  void umulh(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerMulDivVectorsPredicated(0b0, 0b11, size, zd, pg, zn, zm);\n  }\n\n  // SVE integer divide vectors (predicated)\n  void sdiv(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerMulDivVectorsPredicated(0b1, 0b00, size, zd, pg, zn, zm);\n  }\n  void udiv(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerMulDivVectorsPredicated(0b1, 0b01, size, zd, pg, zn, zm);\n  }\n  void sdivr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerMulDivVectorsPredicated(0b1, 0b10, size, zd, pg, zn, zm);\n  }\n  void udivr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerMulDivVectorsPredicated(0b1, 0b11, size, zd, pg, zn, zm);\n  }\n\n  // SVE bitwise logical operations (predicated)\n  void orr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, ZRegister zm) {\n    SVEBitwiseLogicalPredicated(0b000, size, pg, zdn, zm, zd);\n  }\n  void eor(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, ZRegister zm) {\n    SVEBitwiseLogicalPredicated(0b001, size, pg, zdn, zm, zd);\n  }\n  void and_(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, ZRegister zm) {\n    SVEBitwiseLogicalPredicated(0b010, size, pg, zdn, zm, zd);\n  }\n  void bic(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, ZRegister zm) {\n    SVEBitwiseLogicalPredicated(0b011, size, pg, zdn, zm, zd);\n  }\n\n  // SVE Integer Reduction\n  // SVE integer add reduction (predicated)\n  void saddv(SubRegSize size, DRegister vd, PRegister pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit, \"saddv may only use 8-bit, \"\n                                                                                                              \"16-bit, or 32-bit \"\n                                                                                                              \"elements.\");\n    constexpr uint32_t Op = 0b0000'0100'0000'0000'0010'0000'0000'0000;\n    SVEIntegerReductionOperation(Op, 0b00, size, vd, pg, zn);\n  }\n  void uaddv(SubRegSize size, DRegister vd, PRegister pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit || size == SubRegSize::i32Bit, \"uaddv may only use 8-bit, \"\n                                                                                                              \"16-bit, or 32-bit \"\n                                                                                                              \"elements.\");\n    constexpr uint32_t Op = 0b0000'0100'0000'0000'0010'0000'0000'0000;\n    SVEIntegerReductionOperation(Op, 0b01, size, vd, pg, zn);\n  }\n\n  // SVE integer min/max reduction (predicated)\n  void smaxv(SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    constexpr uint32_t Op = 0b0000'0100'0000'1000'001 << 13;\n    SVEIntegerReductionOperation(Op, 0b00, size, vd, pg, zn);\n  }\n  void umaxv(SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    constexpr uint32_t Op = 0b0000'0100'0000'1000'001 << 13;\n    SVEIntegerReductionOperation(Op, 0b01, size, vd, pg, zn);\n  }\n  void sminv(SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    constexpr uint32_t Op = 0b0000'0100'0000'1000'001 << 13;\n    SVEIntegerReductionOperation(Op, 0b10, size, vd, pg, zn);\n  }\n  void uminv(SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    constexpr uint32_t Op = 0b0000'0100'0000'1000'001 << 13;\n    SVEIntegerReductionOperation(Op, 0b11, size, vd, pg, zn);\n  }\n\n  // SVE constructive prefix (predicated)\n  template<typename T>\n  requires (std::is_same_v<PRegisterZero, T> || std::is_same_v<PRegisterMerge, T>)\n  void movprfx(SubRegSize size, ZRegister zd, T pg, ZRegister zn) {\n    constexpr uint32_t M = std::is_same_v<PRegisterMerge, T> ? 1 : 0;\n    SVEConstructivePrefixPredicated(0b00, M, size, pg, zn, zd);\n  }\n\n  // SVE bitwise logical reduction (predicated)\n  void orv(SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    constexpr uint32_t Op = 0b0000'0100'0001'1000'0010'0000'0000'0000;\n    SVEIntegerReductionOperation(Op, 0b00, size, vd, pg, zn);\n  }\n  void eorv(SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    constexpr uint32_t Op = 0b0000'0100'0001'1000'0010'0000'0000'0000;\n    SVEIntegerReductionOperation(Op, 0b01, size, vd, pg, zn);\n  }\n  void andv(SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    constexpr uint32_t Op = 0b0000'0100'0001'1000'0010'0000'0000'0000;\n    SVEIntegerReductionOperation(Op, 0b10, size, vd, pg, zn);\n  }\n\n  // SVE Bitwise Shift - Predicated\n  // SVE bitwise shift by immediate (predicated)\n  void asr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, uint32_t Shift) {\n    SVEBitWiseShiftImmediatePred(size, 0b00, 0, 0, pg, zd, zdn, Shift);\n  }\n  void lsr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, uint32_t Shift) {\n    SVEBitWiseShiftImmediatePred(size, 0b00, 0, 1, pg, zd, zdn, Shift);\n  }\n  void lsl(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, uint32_t Shift) {\n    SVEBitWiseShiftImmediatePred(size, 0b00, 1, 1, pg, zd, zdn, Shift);\n  }\n  void asrd(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, uint32_t Shift) {\n    SVEBitWiseShiftImmediatePred(size, 0b01, 0, 0, pg, zd, zdn, Shift);\n  }\n  void sqshl(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, uint32_t Shift) {\n    SVEBitWiseShiftImmediatePred(size, 0b01, 1, 0, pg, zd, zdn, Shift);\n  }\n  void uqshl(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, uint32_t Shift) {\n    SVEBitWiseShiftImmediatePred(size, 0b01, 1, 1, pg, zd, zdn, Shift);\n  }\n  void srshr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, uint32_t Shift) {\n    SVEBitWiseShiftImmediatePred(size, 0b11, 0, 0, pg, zd, zdn, Shift);\n  }\n  void urshr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, uint32_t Shift) {\n    SVEBitWiseShiftImmediatePred(size, 0b11, 0, 1, pg, zd, zdn, Shift);\n  }\n  void sqshlu(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zdn, uint32_t Shift) {\n    SVEBitWiseShiftImmediatePred(size, 0b11, 1, 1, pg, zd, zdn, Shift);\n  }\n\n  // SVE bitwise shift by vector (predicated)\n  void asr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEBitwiseShiftbyVector(0, 0, 0, size, pg, zd, zn, zm);\n  }\n  void lsr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEBitwiseShiftbyVector(0, 0, 1, size, pg, zd, zn, zm);\n  }\n  void lsl(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEBitwiseShiftbyVector(0, 1, 1, size, pg, zd, zn, zm);\n  }\n  void asrr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEBitwiseShiftbyVector(1, 0, 0, size, pg, zd, zn, zm);\n  }\n  void lsrr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEBitwiseShiftbyVector(1, 0, 1, size, pg, zd, zn, zm);\n  }\n  void lslr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEBitwiseShiftbyVector(1, 1, 1, size, pg, zd, zn, zm);\n  }\n\n  // SVE bitwise shift by wide elements (predicated)\n  void asr_wide(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEBitwiseShiftByWideElementPredicated(size, 0b000, zd, pg, zn, zm);\n  }\n  void lsr_wide(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEBitwiseShiftByWideElementPredicated(size, 0b001, zd, pg, zn, zm);\n  }\n  void lsl_wide(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEBitwiseShiftByWideElementPredicated(size, 0b011, zd, pg, zn, zm);\n  }\n\n  // SVE Integer Unary Arithmetic - Predicated\n  // SVE integer unary operations (predicated)\n  void sxtb(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid subregsize size\");\n    SVEIntegerUnaryPredicated(0b10, 0b000, size, pg, zn, zd);\n  }\n  void uxtb(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid subregsize size\");\n    SVEIntegerUnaryPredicated(0b10, 0b001, size, pg, zn, zd);\n  }\n  void sxth(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid subregsize size\");\n    SVEIntegerUnaryPredicated(0b10, 0b010, size, pg, zn, zd);\n  }\n  void uxth(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid subregsize size\");\n    SVEIntegerUnaryPredicated(0b10, 0b011, size, pg, zn, zd);\n  }\n  void sxtw(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i64Bit, \"Invalid subregsize size\");\n    SVEIntegerUnaryPredicated(0b10, 0b100, size, pg, zn, zd);\n  }\n  void uxtw(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i64Bit, \"Invalid subregsize size\");\n    SVEIntegerUnaryPredicated(0b10, 0b101, size, pg, zn, zd);\n  }\n  void abs(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEIntegerUnaryPredicated(0b10, 0b110, size, pg, zn, zd);\n  }\n  void neg(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEIntegerUnaryPredicated(0b10, 0b111, size, pg, zn, zd);\n  }\n\n  // SVE bitwise unary operations (predicated)\n  void cls(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEIntegerUnaryPredicated(0b11, 0b000, size, pg, zn, zd);\n  }\n  void clz(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEIntegerUnaryPredicated(0b11, 0b001, size, pg, zn, zd);\n  }\n  void cnt(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEIntegerUnaryPredicated(0b11, 0b010, size, pg, zn, zd);\n  }\n  void cnot(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEIntegerUnaryPredicated(0b11, 0b011, size, pg, zn, zd);\n  }\n  void fabs(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Invalid size\");\n    SVEIntegerUnaryPredicated(0b11, 0b100, size, pg, zn, zd);\n  }\n  void fneg(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Invalid size\");\n    SVEIntegerUnaryPredicated(0b11, 0b101, size, pg, zn, zd);\n  }\n  void not_(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEIntegerUnaryPredicated(0b11, 0b110, size, pg, zn, zd);\n  }\n\n  // SVE Bitwise Logical - Unpredicated\n  // SVE bitwise logical operations (unpredicated)\n  void and_(ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEBitwiseLogicalUnpredicated(0b00, zm, zn, zd);\n  }\n  void orr(ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEBitwiseLogicalUnpredicated(0b01, zm, zn, zd);\n  }\n  void mov(ZRegister zd, ZRegister zn) {\n    SVEBitwiseLogicalUnpredicated(0b01, zn, zn, zd);\n  }\n  void eor(ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEBitwiseLogicalUnpredicated(0b10, zm, zn, zd);\n  }\n  void bic(ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEBitwiseLogicalUnpredicated(0b11, zm, zn, zd);\n  }\n\n  void xar(SubRegSize size, ZRegister zd, ZRegister zm, uint32_t rotate) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Element size cannot be 128-bit.\");\n\n    const auto [tszh, tszl_imm3] = EncodeSVEShiftImmediate(size, rotate);\n\n    uint32_t Inst = 0b0000'0100'0010'0000'0011'0100'0000'0000;\n    Inst |= tszh << 22;\n    Inst |= tszl_imm3 << 16;\n    Inst |= zm.Idx() << 5;\n    Inst |= zd.Idx();\n    dc32(Inst);\n  }\n\n  // SVE2 bitwise ternary operations\n  void eor3(ZRegister zd, ZRegister zdn, ZRegister zm, ZRegister zk) {\n    SVE2BitwiseTernary(0b00, 0, zm, zk, zd, zdn);\n  }\n  void bsl(ZRegister zd, ZRegister zdn, ZRegister zm, ZRegister zk) {\n    SVE2BitwiseTernary(0b00, 1, zm, zk, zd, zdn);\n  }\n  void bcax(ZRegister zd, ZRegister zdn, ZRegister zm, ZRegister zk) {\n    SVE2BitwiseTernary(0b01, 0, zm, zk, zd, zdn);\n  }\n  void bsl1n(ZRegister zd, ZRegister zdn, ZRegister zm, ZRegister zk) {\n    SVE2BitwiseTernary(0b01, 1, zm, zk, zd, zdn);\n  }\n  void bsl2n(ZRegister zd, ZRegister zdn, ZRegister zm, ZRegister zk) {\n    SVE2BitwiseTernary(0b10, 1, zm, zk, zd, zdn);\n  }\n  void nbsl(ZRegister zd, ZRegister zdn, ZRegister zm, ZRegister zk) {\n    SVE2BitwiseTernary(0b11, 1, zm, zk, zd, zdn);\n  }\n\n  // SVE Index Generation\n  void index(SubRegSize size, ZRegister zd, int32_t initial, int32_t increment) {\n    LOGMAN_THROW_A_FMT(initial >= -16 && initial <= 15, \"initial value must be within -16-15. initial: {}\", initial);\n    LOGMAN_THROW_A_FMT(increment >= -16 && increment <= 15, \"increment value must be within -16-15. increment: {}\", increment);\n    SVEIndexGeneration(0b00, size, zd, initial, increment);\n  }\n  void index(SubRegSize size, ZRegister zd, Register initial, int32_t increment) {\n    LOGMAN_THROW_A_FMT(increment >= -16 && increment <= 15, \"increment value must be within -16-15. increment: {}\", increment);\n    SVEIndexGeneration(0b01, size, zd, static_cast<int32_t>(initial.Idx()), increment);\n  }\n  void index(SubRegSize size, ZRegister zd, int32_t initial, Register increment) {\n    LOGMAN_THROW_A_FMT(initial >= -16 && initial <= 15, \"initial value must be within -16-15. initial: {}\", initial);\n    SVEIndexGeneration(0b10, size, zd, initial, static_cast<int32_t>(increment.Idx()));\n  }\n  void index(SubRegSize size, ZRegister zd, Register initial, Register increment) {\n    SVEIndexGeneration(0b11, size, zd, static_cast<int32_t>(initial.Idx()), static_cast<int32_t>(increment.Idx()));\n  }\n\n  // SVE Stack Allocation\n  // SVE stack frame adjustment\n  void addvl(XRegister rd, XRegister rn, int32_t imm) {\n    SVEStackFrameOperation(0b00, rd, rn, imm);\n  }\n  void addpl(XRegister rd, XRegister rn, int32_t imm) {\n    SVEStackFrameOperation(0b01, rd, rn, imm);\n  }\n\n  // Streaming SVE stack frame adjustment (SME)\n  // XXX:\n\n  // SVE stack frame size\n  void rdvl(XRegister rd, int32_t imm) {\n    // Would-be Rn field is just set to all 1's, which is the same\n    // as writing the encoding for the SP into it.\n    SVEStackFrameOperation(0b10, rd, XReg::rsp, imm);\n  }\n\n  // Streaming SVE stack frame size (SME)\n  // XXX:\n\n  // SVE2 Integer Multiply - Unpredicated\n  // SVE2 integer multiply vectors (unpredicated)\n  void mul(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMultiplyVectors(0b00, size, zm, zn, zd);\n  }\n  void smulh(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMultiplyVectors(0b10, size, zm, zn, zd);\n  }\n\n  void umulh(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMultiplyVectors(0b11, size, zm, zn, zd);\n  }\n\n  void pmul(ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMultiplyVectors(0b01, SubRegSize::i8Bit, zm, zn, zd);\n  }\n\n  // SVE2 signed saturating doubling multiply high (unpredicated)\n  void sqdmulh(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMultiplyVectors(0b100, size, zm, zn, zd);\n  }\n  void sqrdmulh(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMultiplyVectors(0b101, size, zm, zn, zd);\n  }\n\n  // SVE Bitwise Shift - Unpredicated\n  // SVE bitwise shift by wide elements (unpredicated)\n  void asr_wide(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEBitwiseShiftByWideElementsUnpredicated(size, 0b00, zd, zn, zm);\n  }\n  void lsr_wide(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEBitwiseShiftByWideElementsUnpredicated(size, 0b01, zd, zn, zm);\n  }\n  void lsl_wide(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVEBitwiseShiftByWideElementsUnpredicated(size, 0b11, zd, zn, zm);\n  }\n\n  // SVE bitwise shift by immediate (unpredicated)\n  void asr(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t shift) {\n    SVEBitWiseShiftImmediateUnpred(size, 0b00, zd, zn, shift);\n  }\n  void lsr(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t shift) {\n    SVEBitWiseShiftImmediateUnpred(size, 0b01, zd, zn, shift);\n  }\n  void lsl(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t shift) {\n    SVEBitWiseShiftImmediateUnpred(size, 0b11, zd, zn, shift);\n  }\n\n  // SVE Integer Misc - Unpredicated\n  // SVE floating-point trig select coefficient\n  void ftssel(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"ftssel may only use 16/32/64-bit element sizes\");\n    SVEIntegerMiscUnpredicated(0b00, zm.Idx(), FEXCore::ToUnderlying(size), zd, zn);\n  }\n  // SVE floating-point exponential accelerator\n  void fexpa(SubRegSize size, ZRegister zd, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"fexpa may only use 16/32/64-bit element sizes\");\n    SVEIntegerMiscUnpredicated(0b10, 0b00000, FEXCore::ToUnderlying(size), zd, zn);\n  }\n  // SVE constructive prefix (unpredicated)\n  void movprfx(ZRegister zd, ZRegister zn) {\n    SVEIntegerMiscUnpredicated(0b11, 0b00000, 0b00, zd, zn);\n  }\n\n  // SVE Element Count\n  // SVE saturating inc/dec vector by element count\n  void sqinch(ZRegister zdn, PredicatePattern pattern, uint32_t imm4) {\n    SVEElementCount(0, 0b0000, SubRegSize::i16Bit, zdn, pattern, imm4);\n  }\n  void uqinch(ZRegister zdn, PredicatePattern pattern, uint32_t imm4) {\n    SVEElementCount(0, 0b0001, SubRegSize::i16Bit, zdn, pattern, imm4);\n  }\n  void sqdech(ZRegister zdn, PredicatePattern pattern, uint32_t imm4) {\n    SVEElementCount(0, 0b0010, SubRegSize::i16Bit, zdn, pattern, imm4);\n  }\n  void uqdech(ZRegister zdn, PredicatePattern pattern, uint32_t imm4) {\n    SVEElementCount(0, 0b0011, SubRegSize::i16Bit, zdn, pattern, imm4);\n  }\n  void sqincw(ZRegister zdn, PredicatePattern pattern, uint32_t imm4) {\n    SVEElementCount(0, 0b0000, SubRegSize::i32Bit, zdn, pattern, imm4);\n  }\n  void uqincw(ZRegister zdn, PredicatePattern pattern, uint32_t imm4) {\n    SVEElementCount(0, 0b0001, SubRegSize::i32Bit, zdn, pattern, imm4);\n  }\n  void sqdecw(ZRegister zdn, PredicatePattern pattern, uint32_t imm4) {\n    SVEElementCount(0, 0b0010, SubRegSize::i32Bit, zdn, pattern, imm4);\n  }\n  void uqdecw(ZRegister zdn, PredicatePattern pattern, uint32_t imm4) {\n    SVEElementCount(0, 0b0011, SubRegSize::i32Bit, zdn, pattern, imm4);\n  }\n  void sqincd(ZRegister zdn, PredicatePattern pattern, uint32_t imm4) {\n    SVEElementCount(0, 0b0000, SubRegSize::i64Bit, zdn, pattern, imm4);\n  }\n  void uqincd(ZRegister zdn, PredicatePattern pattern, uint32_t imm4) {\n    SVEElementCount(0, 0b0001, SubRegSize::i64Bit, zdn, pattern, imm4);\n  }\n  void sqdecd(ZRegister zdn, PredicatePattern pattern, uint32_t imm4) {\n    SVEElementCount(0, 0b0010, SubRegSize::i64Bit, zdn, pattern, imm4);\n  }\n  void uqdecd(ZRegister zdn, PredicatePattern pattern, uint32_t imm4) {\n    SVEElementCount(0, 0b0011, SubRegSize::i64Bit, zdn, pattern, imm4);\n  }\n\n  // SVE element count\n  void cntb(XRegister rd, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1000, SubRegSize::i8Bit, ZRegister {rd.Idx()}, pattern, imm);\n  }\n  void cnth(XRegister rd, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1000, SubRegSize::i16Bit, ZRegister {rd.Idx()}, pattern, imm);\n  }\n  void cntw(XRegister rd, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1000, SubRegSize::i32Bit, ZRegister {rd.Idx()}, pattern, imm);\n  }\n  void cntd(XRegister rd, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1000, SubRegSize::i64Bit, ZRegister {rd.Idx()}, pattern, imm);\n  }\n\n  // SVE inc/dec vector by element count\n  void inch(ZRegister zdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b0000, SubRegSize::i16Bit, zdn, pattern, imm);\n  }\n  void dech(ZRegister zdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b0001, SubRegSize::i16Bit, zdn, pattern, imm);\n  }\n  void incw(ZRegister zdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b0000, SubRegSize::i32Bit, zdn, pattern, imm);\n  }\n  void decw(ZRegister zdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b0001, SubRegSize::i32Bit, zdn, pattern, imm);\n  }\n  void incd(ZRegister zdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b0000, SubRegSize::i64Bit, zdn, pattern, imm);\n  }\n  void decd(ZRegister zdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b0001, SubRegSize::i64Bit, zdn, pattern, imm);\n  }\n\n  // SVE inc/dec register by element count\n  void incb(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1000, SubRegSize::i8Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void decb(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1001, SubRegSize::i8Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void inch(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1000, SubRegSize::i16Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void dech(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1001, SubRegSize::i16Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void incw(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1000, SubRegSize::i32Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void decw(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1001, SubRegSize::i32Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void incd(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1000, SubRegSize::i64Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void decd(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1001, SubRegSize::i64Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n\n  // SVE saturating inc/dec register by element count\n  void sqincb(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1100, SubRegSize::i8Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void sqincb(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1100, SubRegSize::i8Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqincb(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1101, SubRegSize::i8Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqincb(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1101, SubRegSize::i8Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void sqdecb(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1110, SubRegSize::i8Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void sqdecb(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1110, SubRegSize::i8Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqdecb(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1111, SubRegSize::i8Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqdecb(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1111, SubRegSize::i8Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n\n  void sqinch(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1100, SubRegSize::i16Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void sqinch(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1100, SubRegSize::i16Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqinch(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1101, SubRegSize::i16Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqinch(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1101, SubRegSize::i16Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void sqdech(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1110, SubRegSize::i16Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void sqdech(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1110, SubRegSize::i16Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqdech(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1111, SubRegSize::i16Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqdech(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1111, SubRegSize::i16Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n\n  void sqincw(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1100, SubRegSize::i32Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void sqincw(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1100, SubRegSize::i32Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqincw(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1101, SubRegSize::i32Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqincw(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1101, SubRegSize::i32Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void sqdecw(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1110, SubRegSize::i32Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void sqdecw(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1110, SubRegSize::i32Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqdecw(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1111, SubRegSize::i32Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqdecw(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1111, SubRegSize::i32Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n\n  void sqincd(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1100, SubRegSize::i64Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void sqincd(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1100, SubRegSize::i64Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqincd(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1101, SubRegSize::i64Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqincd(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1101, SubRegSize::i64Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void sqdecd(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1110, SubRegSize::i64Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void sqdecd(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1110, SubRegSize::i64Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqdecd(XRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(1, 0b1111, SubRegSize::i64Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n  void uqdecd(WRegister rdn, PredicatePattern pattern, uint32_t imm) {\n    SVEElementCount(0, 0b1111, SubRegSize::i64Bit, ZRegister {rdn.Idx()}, pattern, imm);\n  }\n\n  // SVE Bitwise Immediate\n  // XXX: DUPM\n  // SVE bitwise logical with immediate (unpredicated)\n  // XXX:\n\n  // SVE Integer Wide Immediate - Predicated\n  void fcpy(SubRegSize size, ZRegister zd, PRegisterMerge pg, float value) {\n    SVEBroadcastFloatImmPredicated(size, zd, pg, value);\n  }\n  void fmov(SubRegSize size, ZRegister zd, PRegisterMerge pg, float value) {\n    fcpy(size, zd, pg, value);\n  }\n\n  // SVE copy integer immediate (predicated)\n  void cpy(SubRegSize size, ZRegister zd, PRegisterZero pg, int32_t imm) {\n    SVEBroadcastIntegerImmPredicated(0, size, zd, pg, imm);\n  }\n  void cpy(SubRegSize size, ZRegister zd, PRegisterMerge pg, int32_t imm) {\n    SVEBroadcastIntegerImmPredicated(1, size, zd, pg, imm);\n  }\n  void mov_imm(SubRegSize size, ZRegister zd, PRegisterZero pg, int32_t imm) {\n    cpy(size, zd, pg, imm);\n  }\n  void mov_imm(SubRegSize size, ZRegister zd, PRegisterMerge pg, int32_t imm) {\n    cpy(size, zd, pg, imm);\n  }\n\n  // SVE Permute Vector - Unpredicated\n  void dup(SubRegSize size, ZRegister zd, Register rn) {\n    SVEPermuteUnpredicated(size, 0b00000, zd, ZRegister {rn.Idx()});\n  }\n  void mov(SubRegSize size, ZRegister zd, Register rn) {\n    dup(size, zd, rn);\n  }\n  void insr(SubRegSize size, ZRegister zdn, Register rm) {\n    SVEPermuteUnpredicated(size, 0b00100, zdn, ZRegister {rm.Idx()});\n  }\n  void insr(SubRegSize size, ZRegister zdn, VRegister vm) {\n    SVEPermuteUnpredicated(size, 0b10100, zdn, vm.Z());\n  }\n  void rev(SubRegSize size, ZRegister zd, ZRegister zn) {\n    SVEPermuteUnpredicated(size, 0b11000, zd, zn);\n  }\n\n  // SVE unpack vector elements\n  void sunpklo(SubRegSize size, ZRegister zd, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid subregsize size\");\n    SVEPermuteUnpredicated(size, 0b10000, zd, zn);\n  }\n  void sunpkhi(SubRegSize size, ZRegister zd, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid subregsize size\");\n    SVEPermuteUnpredicated(size, 0b10001, zd, zn);\n  }\n  void uunpklo(SubRegSize size, ZRegister zd, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid subregsize size\");\n    SVEPermuteUnpredicated(size, 0b10010, zd, zn);\n  }\n  void uunpkhi(SubRegSize size, ZRegister zd, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid subregsize size\");\n    SVEPermuteUnpredicated(size, 0b10011, zd, zn);\n  }\n\n  // SVE Permute Predicate\n  void rev(SubRegSize size, PRegister pd, PRegister pn) {\n    SVEPermutePredicate(size, 0b10100, 0b0000, 0b0, pd, pn);\n  }\n\n  // SVE unpack predicate elements\n  void punpklo(PRegister pd, PRegister pn) {\n    SVEPermutePredicate(SubRegSize::i8Bit, 0b10000, 0b0000, 0b0, pd, pn);\n  }\n  void punpkhi(PRegister pd, PRegister pn) {\n    SVEPermutePredicate(SubRegSize::i8Bit, 0b10001, 0b0000, 0b0, pd, pn);\n  }\n\n  // SVE permute predicate elements\n  void zip1(SubRegSize size, PRegister pd, PRegister pn, PRegister pm) {\n    SVEPermutePredicate(size, pm.Idx(), 0b0000, 0b0, pd, pn);\n  }\n  void zip2(SubRegSize size, PRegister pd, PRegister pn, PRegister pm) {\n    SVEPermutePredicate(size, pm.Idx(), 0b0010, 0b0, pd, pn);\n  }\n  void uzp1(SubRegSize size, PRegister pd, PRegister pn, PRegister pm) {\n    SVEPermutePredicate(size, pm.Idx(), 0b0100, 0b0, pd, pn);\n  }\n  void uzp2(SubRegSize size, PRegister pd, PRegister pn, PRegister pm) {\n    SVEPermutePredicate(size, pm.Idx(), 0b0110, 0b0, pd, pn);\n  }\n  void trn1(SubRegSize size, PRegister pd, PRegister pn, PRegister pm) {\n    SVEPermutePredicate(size, pm.Idx(), 0b1000, 0b0, pd, pn);\n  }\n  void trn2(SubRegSize size, PRegister pd, PRegister pn, PRegister pm) {\n    SVEPermutePredicate(size, pm.Idx(), 0b1010, 0b0, pd, pn);\n  }\n\n  // SVE Permute Vector - Predicated - Base\n  // CPY (SIMD&FP scalar)\n  void cpy(SubRegSize size, ZRegister zd, PRegisterMerge pg, VRegister vn) {\n    SVEPermuteVectorPredicated(0b00000, 0b0, size, zd, pg, ZRegister {vn.Idx()});\n  }\n\n  void compact(SubRegSize size, ZRegister zd, PRegister pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i64Bit || size == SubRegSize::i32Bit, \"Invalid element size\");\n    SVEPermuteVectorPredicated(0b00001, 0b0, size, zd, pg, zn);\n  }\n\n  // CPY (scalar)\n  void cpy(SubRegSize size, ZRegister zd, PRegisterMerge pg, Register rn) {\n    SVEPermuteVectorPredicated(0b01000, 0b1, size, zd, pg, ZRegister {rn.Idx()});\n  }\n\n  template<OpType optype>\n  requires (optype == OpType::Constructive)\n  void splice(SubRegSize size, ZRegister zd, PRegister pv, ZRegister zn, ZRegister zn2) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zn, zn2), \"zn and zn2 must be sequential registers\");\n    SVEPermuteVectorPredicated(0b01101, 0b0, size, zd, pv, zn);\n  }\n\n  template<OpType optype>\n  requires (optype == OpType::Destructive)\n  void splice(SubRegSize size, ZRegister zd, PRegister pv, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(zd == zn, \"zd needs to equal zn\");\n    SVEPermuteVectorPredicated(0b01100, 0b0, size, zd, pv, zm);\n  }\n\n  // SVE Permute Vector - Predicated\n  // SVE extract element to general register\n  void lasta(SubRegSize size, Register rd, PRegister pg, ZRegister zn) {\n    SVEPermuteVectorPredicated(0b00000, 0b1, size, ZRegister {rd.Idx()}, pg, zn);\n  }\n  void lastb(SubRegSize size, Register rd, PRegister pg, ZRegister zn) {\n    SVEPermuteVectorPredicated(0b00001, 0b1, size, ZRegister {rd.Idx()}, pg, zn);\n  }\n\n  // SVE extract element to SIMD&FP scalar register\n  void lasta(SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    SVEPermuteVectorPredicated(0b00010, 0b0, size, ZRegister {vd.Idx()}, pg, zn);\n  }\n  void lastb(SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    SVEPermuteVectorPredicated(0b00011, 0b0, size, ZRegister {vd.Idx()}, pg, zn);\n  }\n\n  // SVE reverse within elements\n  void revb(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Can't use 8-bit element size\");\n    SVEPermuteVectorPredicated(0b00100, 0b0, size, zd, pg, zn);\n  }\n  void revh(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i16Bit, \"Can't use 8/16-bit element sizes\");\n    SVEPermuteVectorPredicated(0b00101, 0b0, size, zd, pg, zn);\n  }\n  void revw(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i64Bit, \"Can't use 8/16/32-bit element sizes\");\n    SVEPermuteVectorPredicated(0b00110, 0b0, size, zd, pg, zn);\n  }\n  void rbit(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEPermuteVectorPredicated(0b00111, 0b0, size, zd, pg, zn);\n  }\n\n  // SVE conditionally broadcast element to vector\n  void clasta(SubRegSize size, ZRegister zd, PRegister pg, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(zd == zn, \"zd must be the same as zn\");\n    SVEPermuteVectorPredicated(0b01000, 0b0, size, zd, pg, zm);\n  }\n  void clastb(SubRegSize size, ZRegister zd, PRegister pg, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(zd == zn, \"zd must be the same as zn\");\n    SVEPermuteVectorPredicated(0b01001, 0b0, size, zd, pg, zm);\n  }\n\n  // SVE conditionally extract element to SIMD&FP scalar\n  void clasta(SubRegSize size, VRegister vd, PRegister pg, VRegister vn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(vd == vn, \"vd must be the same as vn\");\n    SVEPermuteVectorPredicated(0b01010, 0b0, size, ZRegister {vd.Idx()}, pg, zm);\n  }\n  void clastb(SubRegSize size, VRegister vd, PRegister pg, VRegister vn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(vd == vn, \"vd must be the same as vn\");\n    SVEPermuteVectorPredicated(0b01011, 0b0, size, ZRegister {vd.Idx()}, pg, zm);\n  }\n\n  // SVE reverse doublewords (SME)\n  // XXX:\n\n  // SVE conditionally extract element to general register\n  void clasta(SubRegSize size, Register rd, PRegister pg, Register rn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(rd == rn, \"rd must be the same as rn\");\n    SVEPermuteVectorPredicated(0b10000, 0b1, size, ZRegister {rd.Idx()}, pg, zm);\n  }\n  void clastb(SubRegSize size, Register rd, PRegister pg, Register rn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(rd == rn, \"rd must be the same as rn\");\n    SVEPermuteVectorPredicated(0b10001, 0b1, size, ZRegister {rd.Idx()}, pg, zm);\n  }\n\n  // SVE Permute Vector - Extract\n  // Constructive\n  template<OpType optype>\n  requires (optype == OpType::Constructive)\n  void ext(ZRegister zd, ZRegister zn, ZRegister zn2, uint8_t Imm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zn, zn2), \"zn and zn2 must be sequential registers\");\n    SVEPermuteVector(1, zd, zn, Imm);\n  }\n\n  // Destructive\n  template<OpType optype>\n  requires (optype == OpType::Destructive)\n  void ext(ZRegister zd, ZRegister zdn, ZRegister zm, uint8_t Imm) {\n    LOGMAN_THROW_A_FMT(zd == zdn, \"Dest needs to equal zdn\");\n    SVEPermuteVector(0, zd, zm, Imm);\n  }\n\n  // SVE Permute Vector - Segments\n  // SVE permute vector segments\n  // XXX:\n\n  // SVE Integer Compare - Vectors\n  // SVE integer compare vectors\n  void cmpeq(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVector(1, 1, 0, size, zm, pg, zn, pd);\n  }\n  void cmpge(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVector(1, 0, 0, size, zm, pg, zn, pd);\n  }\n  void cmpgt(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVector(1, 0, 1, size, zm, pg, zn, pd);\n  }\n  void cmphi(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVector(0, 0, 1, size, zm, pg, zn, pd);\n  }\n  void cmphs(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVector(0, 0, 0, size, zm, pg, zn, pd);\n  }\n  void cmpne(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVector(1, 1, 1, size, zm, pg, zn, pd);\n  }\n\n  // SVE integer compare with wide elements\n  void cmpeq_wide(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVectorWide(0, 0b01, 0, size, pd, pg, zn, zm);\n  }\n  void cmpgt_wide(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVectorWide(0, 0b10, 1, size, pd, pg, zn, zm);\n  }\n  void cmpge_wide(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVectorWide(0, 0b10, 0, size, pd, pg, zn, zm);\n  }\n  void cmphi_wide(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVectorWide(1, 0b10, 1, size, pd, pg, zn, zm);\n  }\n  void cmphs_wide(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVectorWide(1, 0b10, 0, size, pd, pg, zn, zm);\n  }\n  void cmplt_wide(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVectorWide(0, 0b11, 0, size, pd, pg, zn, zm);\n  }\n  void cmple_wide(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVectorWide(0, 0b11, 1, size, pd, pg, zn, zm);\n  }\n  void cmplo_wide(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVectorWide(1, 0b11, 0, size, pd, pg, zn, zm);\n  }\n  void cmpls_wide(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVectorWide(1, 0b11, 1, size, pd, pg, zn, zm);\n  }\n  void cmpne_wide(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerCompareVectorWide(0, 0b01, 1, size, pd, pg, zn, zm);\n  }\n\n  // SVE Propagate Break\n  // SVE propagate break from previous partition\n  void brkpa(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPropagateBreak(0b0000, 0b11, 0, pd, pg, pn, pm);\n  }\n  void brkpb(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPropagateBreak(0b0000, 0b11, 1, pd, pg, pn, pm);\n  }\n  void brkpas(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPropagateBreak(0b0100, 0b11, 0, pd, pg, pn, pm);\n  }\n  void brkpbs(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    SVEPropagateBreak(0b0100, 0b11, 1, pd, pg, pn, pm);\n  }\n\n  // SVE Partition Break\n  // SVE propagate break to next partition\n  void brkn(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    LOGMAN_THROW_A_FMT(pd == pm, \"pd and pm need to be the same\");\n    SVEPropagateBreak(0b0001, 0b01, 0, pd, pg, pn, PReg::p8);\n  }\n  void brkns(PRegister pd, PRegisterZero pg, PRegister pn, PRegister pm) {\n    LOGMAN_THROW_A_FMT(pd == pm, \"pd and pm need to be the same\");\n    SVEPropagateBreak(0b0101, 0b01, 0, pd, pg, pn, PReg::p8);\n  }\n\n  // SVE partition break condition\n  void brka(PRegister pd, PRegisterZero pg, PRegister pn) {\n    SVEPropagateBreak(0b0001, 0b01, 0, pd, pg, pn, PReg::p0);\n  }\n  void brka(PRegister pd, PRegisterMerge pg, PRegister pn) {\n    SVEPropagateBreak(0b0001, 0b01, 1, pd, pg, pn, PReg::p0);\n  }\n  void brkas(PRegister pd, PRegisterZero pg, PRegister pn) {\n    SVEPropagateBreak(0b0101, 0b01, 0, pd, pg, pn, PReg::p0);\n  }\n  void brkb(PRegister pd, PRegisterZero pg, PRegister pn) {\n    SVEPropagateBreak(0b1001, 0b01, 0, pd, pg, pn, PReg::p0);\n  }\n  void brkb(PRegister pd, PRegisterMerge pg, PRegister pn) {\n    SVEPropagateBreak(0b1001, 0b01, 1, pd, pg, pn, PReg::p0);\n  }\n  void brkbs(PRegister pd, PRegisterZero pg, PRegister pn) {\n    SVEPropagateBreak(0b1101, 0b01, 0, pd, pg, pn, PReg::p0);\n  }\n\n  // SVE Predicate Misc\n  void pnext(SubRegSize size, PRegister pd, PRegister pv, PRegister pn) {\n    LOGMAN_THROW_A_FMT(pd == pn, \"pd and pn need to be the same\");\n    SVEPredicateMisc(0b1001, 0b00010, pv.Idx(), size, pd);\n  }\n\n  // SVE predicate test\n  void ptest(PRegister pg, PRegister pn) {\n    SVEPredicateMisc(0b0000, pg.Idx() << 1, pn.Idx(), SubRegSize::i16Bit, PReg::p0);\n  }\n\n  // SVE predicate first active\n  void pfirst(PRegister pd, PRegister pg, PRegister pn) {\n    LOGMAN_THROW_A_FMT(pd == pn, \"pd and pn need to be the same\");\n    SVEPredicateMisc(0b1000, 0b00000, pg.Idx(), SubRegSize::i16Bit, pd);\n  }\n\n  // SVE predicate zero\n  void pfalse(PRegister pd) {\n    SVEPredicateMisc(0b1000, 0b10010, 0b0000, SubRegSize::i8Bit, pd);\n  }\n\n  // SVE predicate read from FFR (predicated)\n  void rdffr(PRegister pd, PRegisterZero pg) {\n    SVEPredicateMisc(0b1000, 0b11000, pg.Idx(), SubRegSize::i8Bit, pd);\n  }\n\n  void rdffrs(PRegister pd, PRegisterZero pg) {\n    SVEPredicateMisc(0b1000, 0b11000, pg.Idx(), SubRegSize::i16Bit, pd);\n  }\n\n  // SVE predicate read from FFR (unpredicated)\n  void rdffr(PRegister pd) {\n    SVEPredicateMisc(0b1001, 0b11000, 0b0000, SubRegSize::i8Bit, pd);\n  }\n\n  // SVE predicate initialize\n  void ptrue(SubRegSize size, PRegister pd, PredicatePattern pattern) {\n    SVEPredicateMisc(0b1000, 0b10000, FEXCore::ToUnderlying(pattern), size, pd);\n  }\n  void ptrues(SubRegSize size, PRegister pd, PredicatePattern pattern) {\n    SVEPredicateMisc(0b1001, 0b10000, FEXCore::ToUnderlying(pattern), size, pd);\n  }\n\n  // SVE Integer Compare - Scalars\n  // SVE integer compare scalar count and limit\n  template<IsXOrWRegister T>\n  void whilege(SubRegSize size, PRegister pd, T rn, T rm) {\n    constexpr auto IsXRegister = static_cast<uint32_t>(std::is_same_v<T, XRegister>);\n    SVEIntCompareScalar(IsXRegister << 2, 0, pd.Idx(), size, rn, rm);\n  }\n  template<IsXOrWRegister T>\n  void whilegt(SubRegSize size, PRegister pd, T rn, T rm) {\n    constexpr auto IsXRegister = static_cast<uint32_t>(std::is_same_v<T, XRegister>);\n    SVEIntCompareScalar(IsXRegister << 2, 1, pd.Idx(), size, rn, rm);\n  }\n  template<IsXOrWRegister T>\n  void whilelt(SubRegSize size, PRegister pd, T rn, T rm) {\n    constexpr auto IsXRegister = static_cast<uint32_t>(std::is_same_v<T, XRegister>);\n    SVEIntCompareScalar((IsXRegister << 2) | 0b001, 0, pd.Idx(), size, rn, rm);\n  }\n  template<IsXOrWRegister T>\n  void whilele(SubRegSize size, PRegister pd, T rn, T rm) {\n    constexpr auto IsXRegister = static_cast<uint32_t>(std::is_same_v<T, XRegister>);\n    SVEIntCompareScalar((IsXRegister << 2) | 0b001, 1, pd.Idx(), size, rn, rm);\n  }\n  template<IsXOrWRegister T>\n  void whilehs(SubRegSize size, PRegister pd, T rn, T rm) {\n    constexpr auto IsXRegister = static_cast<uint32_t>(std::is_same_v<T, XRegister>);\n    SVEIntCompareScalar((IsXRegister << 2) | 0b010, 0, pd.Idx(), size, rn, rm);\n  }\n  template<IsXOrWRegister T>\n  void whilehi(SubRegSize size, PRegister pd, T rn, T rm) {\n    constexpr auto IsXRegister = static_cast<uint32_t>(std::is_same_v<T, XRegister>);\n    SVEIntCompareScalar((IsXRegister << 2) | 0b010, 1, pd.Idx(), size, rn, rm);\n  }\n  template<IsXOrWRegister T>\n  void whilelo(SubRegSize size, PRegister pd, T rn, T rm) {\n    constexpr auto IsXRegister = static_cast<uint32_t>(std::is_same_v<T, XRegister>);\n    SVEIntCompareScalar((IsXRegister << 2) | 0b011, 0, pd.Idx(), size, rn, rm);\n  }\n  template<IsXOrWRegister T>\n  void whilels(SubRegSize size, PRegister pd, T rn, T rm) {\n    constexpr auto IsXRegister = static_cast<uint32_t>(std::is_same_v<T, XRegister>);\n    SVEIntCompareScalar((IsXRegister << 2) | 0b011, 1, pd.Idx(), size, rn, rm);\n  }\n\n  // SVE conditionally terminate scalars\n  template<IsXOrWRegister T>\n  void ctermeq(T rn, T rm) {\n    constexpr auto size = std::is_same_v<T, XRegister> ? SubRegSize::i64Bit : SubRegSize::i32Bit;\n    SVEIntCompareScalar(0b1000, 0, 0b0000, size, rn, rm);\n  }\n  template<IsXOrWRegister T>\n  void ctermne(T rn, T rm) {\n    constexpr auto size = std::is_same_v<T, XRegister> ? SubRegSize::i64Bit : SubRegSize::i32Bit;\n    SVEIntCompareScalar(0b1000, 1, 0b0000, size, rn, rm);\n  }\n\n  // SVE pointer conflict compare\n  void whilewr(SubRegSize size, PRegister pd, XRegister rn, XRegister rm) {\n    SVEIntCompareScalar(0b1100, 0, pd.Idx(), size, rn, rm);\n  }\n  void whilerw(SubRegSize size, PRegister pd, XRegister rn, XRegister rm) {\n    SVEIntCompareScalar(0b1100, 1, pd.Idx(), size, rn, rm);\n  }\n\n  // SVE Integer Wide Immediate - Unpredicated\n  // SVE integer add/subtract immediate (unpredicated)\n  void add(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t imm) {\n    SVEAddSubImmediateUnpred(0b000, size, zd, zn, imm);\n  }\n  void sub(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t imm) {\n    SVEAddSubImmediateUnpred(0b001, size, zd, zn, imm);\n  }\n  void subr(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t imm) {\n    SVEAddSubImmediateUnpred(0b011, size, zd, zn, imm);\n  }\n  void sqadd(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t imm) {\n    SVEAddSubImmediateUnpred(0b100, size, zd, zn, imm);\n  }\n  void uqadd(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t imm) {\n    SVEAddSubImmediateUnpred(0b101, size, zd, zn, imm);\n  }\n  void sqsub(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t imm) {\n    SVEAddSubImmediateUnpred(0b110, size, zd, zn, imm);\n  }\n  void uqsub(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t imm) {\n    SVEAddSubImmediateUnpred(0b111, size, zd, zn, imm);\n  }\n\n  // SVE integer min/max immediate (unpredicated)\n  void smax(SubRegSize size, ZRegister zd, ZRegister zn, int32_t imm) {\n    SVEMinMaxImmediateUnpred(0b000, size, zd, zn, imm);\n  }\n  void umax(SubRegSize size, ZRegister zd, ZRegister zn, int32_t imm) {\n    SVEMinMaxImmediateUnpred(0b001, size, zd, zn, imm);\n  }\n  void smin(SubRegSize size, ZRegister zd, ZRegister zn, int32_t imm) {\n    SVEMinMaxImmediateUnpred(0b010, size, zd, zn, imm);\n  }\n  void umin(SubRegSize size, ZRegister zd, ZRegister zn, int32_t imm) {\n    SVEMinMaxImmediateUnpred(0b011, size, zd, zn, imm);\n  }\n\n  // SVE integer multiply immediate (unpredicated)\n  void mul(SubRegSize size, ZRegister zd, ZRegister zn, int32_t imm) {\n    SVEMultiplyImmediateUnpred(0b000, size, zd, zn, imm);\n  }\n\n  // SVE broadcast integer immediate (unpredicated)\n  void dup_imm(SubRegSize size, ZRegister zd, int32_t Value) {\n    SVEBroadcastImm(0b00, Value, size, zd);\n  }\n  void mov_imm(SubRegSize size, ZRegister zd, int32_t Value) {\n    dup_imm(size, zd, Value);\n  }\n\n  // SVE broadcast floating-point immediate (unpredicated)\n  void fdup(SubRegSize size, ZRegister zd, float Value) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Unsupported fmov size\");\n\n    uint32_t Imm {};\n    if (size == SubRegSize::i16Bit) {\n      LOGMAN_MSG_A_FMT(\"Unsupported\");\n      FEX_UNREACHABLE;\n    } else if (size == SubRegSize::i32Bit) {\n      Imm = FP32ToImm8(Value);\n    } else if (size == SubRegSize::i64Bit) {\n      Imm = FP64ToImm8(Value);\n    }\n\n    SVEBroadcastFloatImmUnpredicated(0b00, 0, Imm, size, zd);\n  }\n  void fmov(SubRegSize size, ZRegister zd, float Value) {\n    fdup(size, zd, Value);\n  }\n\n  // SVE Predicate Count\n  // SVE predicate count\n  void cntp(SubRegSize size, XRegister rd, PRegister pg, PRegister pn) {\n    SVEPredicateCount(0b000, size, rd, pg, pn);\n  }\n\n  // SVE Inc/Dec by Predicate Count\n  // SVE saturating inc/dec vector by predicate count\n  void sqincp(SubRegSize size, ZRegister zdn, PRegister pm) {\n    SVEIncDecPredicateCountVector(0, 0, 0b00, 0b00, size, zdn, pm);\n  }\n  void uqincp(SubRegSize size, ZRegister zdn, PRegister pm) {\n    SVEIncDecPredicateCountVector(0, 0, 0b00, 0b01, size, zdn, pm);\n  }\n  void sqdecp(SubRegSize size, ZRegister zdn, PRegister pm) {\n    SVEIncDecPredicateCountVector(0, 0, 0b00, 0b10, size, zdn, pm);\n  }\n  void uqdecp(SubRegSize size, ZRegister zdn, PRegister pm) {\n    SVEIncDecPredicateCountVector(0, 0, 0b00, 0b11, size, zdn, pm);\n  }\n\n  // SVE saturating inc/dec register by predicate count\n  void sqincp(SubRegSize size, XRegister rdn, PRegister pm) {\n    SVEIncDecPredicateCountScalar(0, 1, 0b10, 0b00, size, rdn, pm);\n  }\n  void sqincp(SubRegSize size, XRegister rdn, PRegister pm, WRegister wn) {\n    LOGMAN_THROW_A_FMT(rdn.Idx() == wn.Idx(), \"rdn and wn must be the same\");\n    SVEIncDecPredicateCountScalar(0, 1, 0b00, 0b00, size, rdn, pm);\n  }\n  void uqincp(SubRegSize size, XRegister rdn, PRegister pm) {\n    SVEIncDecPredicateCountScalar(0, 1, 0b10, 0b01, size, rdn, pm);\n  }\n  void uqincp(SubRegSize size, WRegister rdn, PRegister pm) {\n    SVEIncDecPredicateCountScalar(0, 1, 0b00, 0b01, size, rdn, pm);\n  }\n  void sqdecp(SubRegSize size, XRegister rdn, PRegister pm) {\n    SVEIncDecPredicateCountScalar(0, 1, 0b10, 0b10, size, rdn, pm);\n  }\n  void sqdecp(SubRegSize size, XRegister rdn, PRegister pm, WRegister wn) {\n    LOGMAN_THROW_A_FMT(rdn.Idx() == wn.Idx(), \"rdn and wn must be the same\");\n    SVEIncDecPredicateCountScalar(0, 1, 0b00, 0b10, size, rdn, pm);\n  }\n  void uqdecp(SubRegSize size, XRegister rdn, PRegister pm) {\n    SVEIncDecPredicateCountScalar(0, 1, 0b10, 0b11, size, rdn, pm);\n  }\n  void uqdecp(SubRegSize size, WRegister rdn, PRegister pm) {\n    SVEIncDecPredicateCountScalar(0, 1, 0b00, 0b11, size, rdn, pm);\n  }\n\n  // SVE inc/dec vector by predicate count\n  void incp(SubRegSize size, ZRegister zdn, PRegister pm) {\n    SVEIncDecPredicateCountVector(1, 0, 0b00, 0b00, size, zdn, pm);\n  }\n  void decp(SubRegSize size, ZRegister zdn, PRegister pm) {\n    SVEIncDecPredicateCountVector(1, 0, 0b00, 0b01, size, zdn, pm);\n  }\n\n  // SVE inc/dec register by predicate count\n  void incp(SubRegSize size, XRegister rdn, PRegister pm) {\n    SVEIncDecPredicateCountScalar(1, 1, 0b00, 0b00, size, rdn, pm);\n  }\n  void decp(SubRegSize size, XRegister rdn, PRegister pm) {\n    SVEIncDecPredicateCountScalar(1, 1, 0b00, 0b01, size, rdn, pm);\n  }\n\n  // SVE Write FFR\n  // SVE FFR write from predicate\n  void wrffr(PRegister pn) {\n    SVEWriteFFR(0, 0b00, 0b000, pn.Idx(), 0b00000);\n  }\n  // SVE FFR initialise\n  void setffr() {\n    SVEWriteFFR(1, 0b00, 0b000, 0b0000, 0b00000);\n  }\n\n  // SVE Integer Multiply-Add - Unpredicated\n  void cdot(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm, Rotation rot) {\n    SVEIntegerDotProduct(0b0001, size, zda, zn, zm, rot);\n  }\n\n  // SVE integer dot product (unpredicated)\n  void sdot(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEIntegerDotProduct(0b0000, size, zda, zn, zm, Rotation::ROTATE_0);\n  }\n  void udot(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEIntegerDotProduct(0b0000, size, zda, zn, zm, Rotation::ROTATE_90);\n  }\n\n  // SVE2 saturating multiply-add interleaved long\n  void sqdmlalbt(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2SaturatingMulAddInterleaved(0b000010, size, zda, zn, zm);\n  }\n  void sqdmlslbt(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2SaturatingMulAddInterleaved(0b000011, size, zda, zn, zm);\n  }\n\n  // SVE2 complex integer multiply-add\n  void cmla(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm, Rotation rot) {\n    SVEIntegerComplexMulAdd(0b0010, size, zda, zn, zm, rot);\n  }\n  void sqrdcmlah(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm, Rotation rot) {\n    SVEIntegerComplexMulAdd(0b0011, size, zda, zn, zm, rot);\n  }\n\n  // SVE2 integer multiply-add long\n  void smlalb(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMulAddLong(0b010'000, size, zda, zn, zm);\n  }\n  void smlalt(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMulAddLong(0b010'001, size, zda, zn, zm);\n  }\n  void umlalb(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMulAddLong(0b010'010, size, zda, zn, zm);\n  }\n  void umlalt(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMulAddLong(0b010'011, size, zda, zn, zm);\n  }\n  void smlslb(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMulAddLong(0b010'100, size, zda, zn, zm);\n  }\n  void smlslt(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMulAddLong(0b010'101, size, zda, zn, zm);\n  }\n  void umlslb(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMulAddLong(0b010'110, size, zda, zn, zm);\n  }\n  void umlslt(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMulAddLong(0b010'111, size, zda, zn, zm);\n  }\n\n  // SVE2 saturating multiply-add long\n  void sqdmlalb(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMulAddLong(0b0110'00, size, zda, zn, zm);\n  }\n  void sqdmlalt(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMulAddLong(0b0110'01, size, zda, zn, zm);\n  }\n  void sqdmlslb(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMulAddLong(0b0110'10, size, zda, zn, zm);\n  }\n  void sqdmlslt(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMulAddLong(0b0110'11, size, zda, zn, zm);\n  }\n\n  // SVE2 saturating multiply-add high\n  void sqrdmlah(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEIntegerMultiplyAddUnpredicated(0b011'100, size, zda, zn, zm);\n  }\n  void sqrdmlsh(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEIntegerMultiplyAddUnpredicated(0b011'101, size, zda, zn, zm);\n  }\n\n  // SVE mixed sign dot product\n  void usdot(ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEIntegerDotProduct(0b0111, SubRegSize::i32Bit, zda, zn, zm, Rotation::ROTATE_180);\n  }\n\n  // SVE2 Integer - Predicated\n  // SVE2 integer pairwise add and accumulate long\n  void sadalp(SubRegSize size, ZRegister zda, PRegisterMerge pg, ZRegister zn) {\n    SVE2IntegerPairwiseAddAccumulateLong(0, size, zda, pg, zn);\n  }\n  void uadalp(SubRegSize size, ZRegister zda, PRegisterMerge pg, ZRegister zn) {\n    SVE2IntegerPairwiseAddAccumulateLong(1, size, zda, pg, zn);\n  }\n\n  // SVE2 integer unary operations (predicated)\n  void urecpe(ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVE2IntegerUnaryOpsPredicated(0b00000, SubRegSize::i32Bit, zd, pg, zn);\n  }\n  void ursqrte(ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVE2IntegerUnaryOpsPredicated(0b00001, SubRegSize::i32Bit, zd, pg, zn);\n  }\n  void sqabs(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVE2IntegerUnaryOpsPredicated(0b01000, size, zd, pg, zn);\n  }\n  void sqneg(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVE2IntegerUnaryOpsPredicated(0b01001, size, zd, pg, zn);\n  }\n\n  // SVE2 saturating/rounding bitwise shift left (predicated)\n  void srshl(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2SaturatingRoundingBitwiseShiftLeft(0b00010, size, zd, pg, zn, zm);\n  }\n  void urshl(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2SaturatingRoundingBitwiseShiftLeft(0b00011, size, zd, pg, zn, zm);\n  }\n  void srshlr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2SaturatingRoundingBitwiseShiftLeft(0b00110, size, zd, pg, zn, zm);\n  }\n  void urshlr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2SaturatingRoundingBitwiseShiftLeft(0b00111, size, zd, pg, zn, zm);\n  }\n  void sqshl(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2SaturatingRoundingBitwiseShiftLeft(0b01000, size, zd, pg, zn, zm);\n  }\n  void uqshl(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2SaturatingRoundingBitwiseShiftLeft(0b01001, size, zd, pg, zn, zm);\n  }\n  void sqrshl(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2SaturatingRoundingBitwiseShiftLeft(0b01010, size, zd, pg, zn, zm);\n  }\n  void uqrshl(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2SaturatingRoundingBitwiseShiftLeft(0b01011, size, zd, pg, zn, zm);\n  }\n  void sqshlr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2SaturatingRoundingBitwiseShiftLeft(0b01100, size, zd, pg, zn, zm);\n  }\n  void uqshlr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2SaturatingRoundingBitwiseShiftLeft(0b01101, size, zd, pg, zn, zm);\n  }\n  void sqrshlr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2SaturatingRoundingBitwiseShiftLeft(0b01110, size, zd, pg, zn, zm);\n  }\n  void uqrshlr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2SaturatingRoundingBitwiseShiftLeft(0b01111, size, zd, pg, zn, zm);\n  }\n\n  // SVE2 integer halving add/subtract (predicated)\n  void shadd(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerHalvingPredicated(0b000, size, pg, zd, zn, zm);\n  }\n  void uhadd(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerHalvingPredicated(0b001, size, pg, zd, zn, zm);\n  }\n  void shsub(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerHalvingPredicated(0b010, size, pg, zd, zn, zm);\n  }\n  void uhsub(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerHalvingPredicated(0b011, size, pg, zd, zn, zm);\n  }\n  void srhadd(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerHalvingPredicated(0b100, size, pg, zd, zn, zm);\n  }\n  void urhadd(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerHalvingPredicated(0b101, size, pg, zd, zn, zm);\n  }\n  void shsubr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerHalvingPredicated(0b110, size, pg, zd, zn, zm);\n  }\n  void uhsubr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerHalvingPredicated(0b111, size, pg, zd, zn, zm);\n  }\n\n  // SVE2 integer pairwise arithmetic\n  void addp(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerPairwiseArithmetic(0b00, 1, size, pg, zd, zn, zm);\n  }\n  void smaxp(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerPairwiseArithmetic(0b10, 0, size, pg, zd, zn, zm);\n  }\n  void umaxp(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerPairwiseArithmetic(0b10, 1, size, pg, zd, zn, zm);\n  }\n  void sminp(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerPairwiseArithmetic(0b11, 0, size, pg, zd, zn, zm);\n  }\n  void uminp(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEIntegerPairwiseArithmetic(0b11, 1, size, pg, zd, zn, zm);\n  }\n\n  // SVE2 saturating add/subtract\n  void sqadd(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerSaturatingAddSub(0b000, size, zd, pg, zn, zm);\n  }\n  void uqadd(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerSaturatingAddSub(0b001, size, zd, pg, zn, zm);\n  }\n  void sqsub(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerSaturatingAddSub(0b010, size, zd, pg, zn, zm);\n  }\n  void uqsub(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerSaturatingAddSub(0b011, size, zd, pg, zn, zm);\n  }\n  void suqadd(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerSaturatingAddSub(0b100, size, zd, pg, zn, zm);\n  }\n  void usqadd(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerSaturatingAddSub(0b101, size, zd, pg, zn, zm);\n  }\n  void sqsubr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerSaturatingAddSub(0b110, size, zd, pg, zn, zm);\n  }\n  void uqsubr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVE2IntegerSaturatingAddSub(0b111, size, zd, pg, zn, zm);\n  }\n\n  // SVE2 Widening Integer Arithmetic\n  // SVE2 integer add/subtract long\n  void saddlb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLong(0, 0b000, size, zd, zn, zm);\n  }\n\n  void saddlt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLong(0, 0b001, size, zd, zn, zm);\n  }\n\n  void uaddlb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLong(0, 0b010, size, zd, zn, zm);\n  }\n\n  void uaddlt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLong(0, 0b011, size, zd, zn, zm);\n  }\n\n  void ssublb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLong(0, 0b100, size, zd, zn, zm);\n  }\n\n  void ssublt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLong(0, 0b101, size, zd, zn, zm);\n  }\n\n  void usublb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLong(0, 0b110, size, zd, zn, zm);\n  }\n\n  void usublt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLong(0, 0b111, size, zd, zn, zm);\n  }\n\n  void sabdlb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLong(1, 0b100, size, zd, zn, zm);\n  }\n\n  void sabdlt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLong(1, 0b101, size, zd, zn, zm);\n  }\n\n  void uabdlb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLong(1, 0b110, size, zd, zn, zm);\n  }\n\n  void uabdlt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLong(1, 0b111, size, zd, zn, zm);\n  }\n\n  // SVE2 integer add/subtract wide\n  void saddwb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubWide(0b000, size, zd, zn, zm);\n  }\n  void saddwt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubWide(0b001, size, zd, zn, zm);\n  }\n  void uaddwb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubWide(0b010, size, zd, zn, zm);\n  }\n  void uaddwt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubWide(0b011, size, zd, zn, zm);\n  }\n  void ssubwb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubWide(0b100, size, zd, zn, zm);\n  }\n  void ssubwt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubWide(0b101, size, zd, zn, zm);\n  }\n  void usubwb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubWide(0b110, size, zd, zn, zm);\n  }\n  void usubwt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubWide(0b111, size, zd, zn, zm);\n  }\n\n  // SVE2 integer multiply long\n  void sqdmullb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMultiplyLong(0b000, size, zd, zn, zm);\n  }\n  void sqdmullt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMultiplyLong(0b001, size, zd, zn, zm);\n  }\n  void pmullb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMultiplyLong(0b010, size, zd, zn, zm);\n  }\n  void pmullt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMultiplyLong(0b011, size, zd, zn, zm);\n  }\n  void smullb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMultiplyLong(0b100, size, zd, zn, zm);\n  }\n  void smullt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMultiplyLong(0b101, size, zd, zn, zm);\n  }\n  void umullb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMultiplyLong(0b110, size, zd, zn, zm);\n  }\n  void umullt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerMultiplyLong(0b111, size, zd, zn, zm);\n  }\n\n  //\n  // SVE Misc\n  // SVE2 bitwise shift left long\n  void sshllb(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t shift) {\n    SVE2BitwiseShiftLeftLong(size, 0b00, zd, zn, shift);\n  }\n  void sshllt(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t shift) {\n    SVE2BitwiseShiftLeftLong(size, 0b01, zd, zn, shift);\n  }\n  void ushllb(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t shift) {\n    SVE2BitwiseShiftLeftLong(size, 0b10, zd, zn, shift);\n  }\n  void ushllt(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t shift) {\n    SVE2BitwiseShiftLeftLong(size, 0b11, zd, zn, shift);\n  }\n\n  // SVE2 integer add/subtract interleaved long\n  void saddlbt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubInterleavedLong(size, 0b00, zd, zn, zm);\n  }\n  void ssublbt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubInterleavedLong(size, 0b10, zd, zn, zm);\n  }\n  void ssubltb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubInterleavedLong(size, 0b11, zd, zn, zm);\n  }\n\n  // SVE2 bitwise exclusive-or interleaved\n  void eorbt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2BitwiseXorInterleaved(size, 0b0, zd, zn, zm);\n  }\n  void eortb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2BitwiseXorInterleaved(size, 0b1, zd, zn, zm);\n  }\n\n  // SVE integer matrix multiply accumulate\n  void smmla(ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEIntegerMatrixMulAccumulate(0b00, zda, zn, zm);\n  }\n  void usmmla(ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEIntegerMatrixMulAccumulate(0b10, zda, zn, zm);\n  }\n  void ummla(ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEIntegerMatrixMulAccumulate(0b11, zda, zn, zm);\n  }\n\n  // SVE2 bitwise permute\n  void bext(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2BitwisePermute(size, 0b00, zd, zn, zm);\n  }\n  void bdep(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2BitwisePermute(size, 0b01, zd, zn, zm);\n  }\n  void bgrp(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2BitwisePermute(size, 0b10, zd, zn, zm);\n  }\n\n  // SVE2 Accumulate\n  // SVE2 complex integer add\n  void cadd(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm, Rotation rot) {\n    SVE2ComplexIntAdd(size, 0b0, rot, zd, zn, zm);\n  }\n  void sqcadd(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm, Rotation rot) {\n    SVE2ComplexIntAdd(size, 0b1, rot, zd, zn, zm);\n  }\n\n  // SVE2 integer absolute difference and accumulate long\n  void sabalb(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubInterleavedLong(size, 0b10000, zda, zn, zm);\n  }\n  void sabalt(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubInterleavedLong(size, 0b10001, zda, zn, zm);\n  }\n  void uabalb(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubInterleavedLong(size, 0b10010, zda, zn, zm);\n  }\n  void uabalt(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubInterleavedLong(size, 0b10011, zda, zn, zm);\n  }\n\n  // SVE2 integer add/subtract long with carry\n  void adclb(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLongWithCarry(size, 0, 0, zda, zn, zm);\n  }\n  void adclt(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLongWithCarry(size, 0, 1, zda, zn, zm);\n  }\n  void sbclb(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLongWithCarry(size, 1, 0, zda, zn, zm);\n  }\n  void sbclt(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubLongWithCarry(size, 1, 1, zda, zn, zm);\n  }\n\n  // SVE2 bitwise shift right and accumulate\n  void ssra(SubRegSize size, ZRegister zda, ZRegister zn, uint32_t shift) {\n    SVE2BitwiseShiftRightAndAccumulate(size, 0b00, zda, zn, shift);\n  }\n  void usra(SubRegSize size, ZRegister zda, ZRegister zn, uint32_t shift) {\n    SVE2BitwiseShiftRightAndAccumulate(size, 0b01, zda, zn, shift);\n  }\n  void srsra(SubRegSize size, ZRegister zda, ZRegister zn, uint32_t shift) {\n    SVE2BitwiseShiftRightAndAccumulate(size, 0b10, zda, zn, shift);\n  }\n  void ursra(SubRegSize size, ZRegister zda, ZRegister zn, uint32_t shift) {\n    SVE2BitwiseShiftRightAndAccumulate(size, 0b11, zda, zn, shift);\n  }\n\n  // SVE2 bitwise shift and insert\n  void sri(SubRegSize size, ZRegister zda, ZRegister zn, uint32_t shift) {\n    SVE2BitwiseShiftAndInsert(size, 0b0, zda, zn, shift);\n  }\n  void sli(SubRegSize size, ZRegister zda, ZRegister zn, uint32_t shift) {\n    SVE2BitwiseShiftAndInsert(size, 0b1, zda, zn, shift);\n  }\n\n  // SVE2 integer absolute difference and accumulate\n  void saba(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAbsDiffAndAccumulate(size, 0b0, zda, zn, zm);\n  }\n  void uaba(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAbsDiffAndAccumulate(size, 0b1, zda, zn, zm);\n  }\n\n  // SVE2 Narrowing\n  // SVE2 saturating extract narrow\n  void sqxtnb(SubRegSize size, ZRegister zd, ZRegister zn) {\n    SVE2SaturatingExtractNarrow(size, 0b00, 0, zn, zd);\n  }\n  void sqxtnt(SubRegSize size, ZRegister zd, ZRegister zn) {\n    SVE2SaturatingExtractNarrow(size, 0b00, 1, zn, zd);\n  }\n  void uqxtnb(SubRegSize size, ZRegister zd, ZRegister zn) {\n    SVE2SaturatingExtractNarrow(size, 0b01, 0, zn, zd);\n  }\n  void uqxtnt(SubRegSize size, ZRegister zd, ZRegister zn) {\n    SVE2SaturatingExtractNarrow(size, 0b01, 1, zn, zd);\n  }\n  void sqxtunb(SubRegSize size, ZRegister zd, ZRegister zn) {\n    SVE2SaturatingExtractNarrow(size, 0b10, 0, zn, zd);\n  }\n  void sqxtunt(SubRegSize size, ZRegister zd, ZRegister zn) {\n    SVE2SaturatingExtractNarrow(size, 0b10, 1, zn, zd);\n  }\n\n  // SVE2 bitwise shift right narrow\n  void sqshrunb(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 0, 0, 0, 0, zn, zd);\n  }\n  void sqshrunt(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 0, 0, 0, 1, zn, zd);\n  }\n  void sqrshrunb(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 0, 0, 1, 0, zn, zd);\n  }\n  void sqrshrunt(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 0, 0, 1, 1, zn, zd);\n  }\n  void shrnb(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 0, 1, 0, 0, zn, zd);\n  }\n  void shrnt(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 0, 1, 0, 1, zn, zd);\n  }\n  void rshrnb(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 0, 1, 1, 0, zn, zd);\n  }\n  void rshrnt(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 0, 1, 1, 1, zn, zd);\n  }\n  void sqshrnb(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 1, 0, 0, 0, zn, zd);\n  }\n  void sqshrnt(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 1, 0, 0, 1, zn, zd);\n  }\n  void sqrshrnb(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 1, 0, 1, 0, zn, zd);\n  }\n  void sqrshrnt(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 1, 0, 1, 1, zn, zd);\n  }\n  void uqshrnb(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 1, 1, 0, 0, zn, zd);\n  }\n  void uqshrnt(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 1, 1, 0, 1, zn, zd);\n  }\n  void uqrshrnb(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 1, 1, 1, 0, zn, zd);\n  }\n  void uqrshrnt(SubRegSize size, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    SVE2BitwiseShiftRightNarrow(size, Shift, 1, 1, 1, 1, zn, zd);\n  }\n\n  // SVE2 integer add/subtract narrow high part\n  void addhnb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubNarrowHighPart(size, 0b000, zd, zn, zm);\n  }\n  void addhnt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubNarrowHighPart(size, 0b001, zd, zn, zm);\n  }\n  void raddhnb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubNarrowHighPart(size, 0b010, zd, zn, zm);\n  }\n  void raddhnt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubNarrowHighPart(size, 0b011, zd, zn, zm);\n  }\n  void subhnb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubNarrowHighPart(size, 0b100, zd, zn, zm);\n  }\n  void subhnt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubNarrowHighPart(size, 0b101, zd, zn, zm);\n  }\n  void rsubhnb(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubNarrowHighPart(size, 0b110, zd, zn, zm);\n  }\n  void rsubhnt(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2IntegerAddSubNarrowHighPart(size, 0b111, zd, zn, zm);\n  }\n\n  // SVE2 Crypto Extensions\n  // SVE2 crypto unary operations\n  void aesimc(ZRegister zdn, ZRegister zn) {\n    SVE2CryptoUnaryOperation(1, zdn, zn);\n  }\n  void aesmc(ZRegister zdn, ZRegister zn) {\n    SVE2CryptoUnaryOperation(0, zdn, zn);\n  }\n\n  // SVE2 crypto destructive binary operations\n  void aese(ZRegister zdn, ZRegister zn, ZRegister zm) {\n    SVE2CryptoDestructiveBinaryOperation(0, 0, zdn, zn, zm);\n  }\n  void aesd(ZRegister zdn, ZRegister zn, ZRegister zm) {\n    SVE2CryptoDestructiveBinaryOperation(0, 1, zdn, zn, zm);\n  }\n  void sm4e(ZRegister zdn, ZRegister zn, ZRegister zm) {\n    SVE2CryptoDestructiveBinaryOperation(1, 0, zdn, zn, zm);\n  }\n\n  // SVE2 crypto constructive binary operations\n  void sm4ekey(ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2CryptoConstructiveBinaryOperation(0, zd, zn, zm);\n  }\n  void rax1(ZRegister zd, ZRegister zn, ZRegister zm) {\n    SVE2CryptoConstructiveBinaryOperation(1, zd, zn, zm);\n  }\n\n  // SVE Floating Point Widening Multiply-Add - Indexed\n  // SVE BFloat16 floating-point dot product (indexed)\n  // XXX:\n\n  // SVE floating-point multiply-add long (indexed)\n  void fmlalb(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm, uint32_t index) {\n    SVEFPMultiplyAddLongIndexed(0, 0, 0, dstsize, zda, zn, zm, index);\n  }\n  void fmlalt(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm, uint32_t index) {\n    SVEFPMultiplyAddLongIndexed(0, 0, 1, dstsize, zda, zn, zm, index);\n  }\n  void fmlslb(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm, uint32_t index) {\n    SVEFPMultiplyAddLongIndexed(0, 1, 0, dstsize, zda, zn, zm, index);\n  }\n  void fmlslt(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm, uint32_t index) {\n    SVEFPMultiplyAddLongIndexed(0, 1, 1, dstsize, zda, zn, zm, index);\n  }\n  void bfmlalb(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm, uint32_t index) {\n    SVEFPMultiplyAddLongIndexed(1, 0, 0, dstsize, zda, zn, zm, index);\n  }\n  void bfmlalt(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm, uint32_t index) {\n    SVEFPMultiplyAddLongIndexed(1, 0, 1, dstsize, zda, zn, zm, index);\n  }\n  void bfmlslb(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm, uint32_t index) {\n    SVEFPMultiplyAddLongIndexed(1, 1, 0, dstsize, zda, zn, zm, index);\n  }\n  void bfmlslt(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm, uint32_t index) {\n    SVEFPMultiplyAddLongIndexed(1, 1, 1, dstsize, zda, zn, zm, index);\n  }\n\n  // SVE Floating Point Widening Multiply-Add\n  // SVE BFloat16 floating-point dot product\n  // XXX:\n\n  // SVE floating-point multiply-add long\n  void fmlalb(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEFPMultiplyAddLong(0, 0, 0, dstsize, zda, zn, zm);\n  }\n  void fmlalt(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEFPMultiplyAddLong(0, 0, 1, dstsize, zda, zn, zm);\n  }\n  void fmlslb(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEFPMultiplyAddLong(0, 1, 0, dstsize, zda, zn, zm);\n  }\n  void fmlslt(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEFPMultiplyAddLong(0, 1, 1, dstsize, zda, zn, zm);\n  }\n  void bfmlalb(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEFPMultiplyAddLong(1, 0, 0, dstsize, zda, zn, zm);\n  }\n  void bfmlalt(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEFPMultiplyAddLong(1, 0, 1, dstsize, zda, zn, zm);\n  }\n  void bfmlslb(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEFPMultiplyAddLong(1, 1, 0, dstsize, zda, zn, zm);\n  }\n  void bfmlslt(SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVEFPMultiplyAddLong(1, 1, 1, dstsize, zda, zn, zm);\n  }\n\n  // SVE Floating Point Arithmetic - Predicated\n  void ftmad(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm, uint32_t imm) {\n    LOGMAN_THROW_A_FMT(imm <= 7, \"ftmad immediate must be within 0-7\");\n    SVEFloatArithmeticPredicated(0b10000 | imm, size, PReg::p0, zd, zn, zm);\n  }\n  // SVE floating-point arithmetic (predicated)\n  void fadd(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticPredicated(0b0000, size, pg, zd, zn, zm);\n  }\n  void fsub(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticPredicated(0b0001, size, pg, zd, zn, zm);\n  }\n  void fmul(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticPredicated(0b0010, size, pg, zd, zn, zm);\n  }\n  void fsubr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticPredicated(0b0011, size, pg, zd, zn, zm);\n  }\n  void fmaxnm(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticPredicated(0b0100, size, pg, zd, zn, zm);\n  }\n  void fminnm(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticPredicated(0b0101, size, pg, zd, zn, zm);\n  }\n  void fmax(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticPredicated(0b0110, size, pg, zd, zn, zm);\n  }\n  void fmin(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticPredicated(0b0111, size, pg, zd, zn, zm);\n  }\n  void fabd(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticPredicated(0b1000, size, pg, zd, zn, zm);\n  }\n  void fscale(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticPredicated(0b1001, size, pg, zd, zn, zm);\n  }\n  void fmulx(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticPredicated(0b1010, size, pg, zd, zn, zm);\n  }\n  void fdivr(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticPredicated(0b1100, size, pg, zd, zn, zm);\n  }\n  void fdiv(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFloatArithmeticPredicated(0b1101, size, pg, zd, zn, zm);\n  }\n\n  // SVE floating-point arithmetic with immediate (predicated)\n  void fadd(SubRegSize size, ZRegister zd, PRegisterMerge pg, SVEFAddSubImm imm) {\n    SVEFPArithWithImmediate(0b000, size, zd, pg, FEXCore::ToUnderlying(imm));\n  }\n  void fsub(SubRegSize size, ZRegister zd, PRegisterMerge pg, SVEFAddSubImm imm) {\n    SVEFPArithWithImmediate(0b001, size, zd, pg, FEXCore::ToUnderlying(imm));\n  }\n  void fmul(SubRegSize size, ZRegister zd, PRegisterMerge pg, SVEFMulImm imm) {\n    SVEFPArithWithImmediate(0b010, size, zd, pg, FEXCore::ToUnderlying(imm));\n  }\n  void fsubr(SubRegSize size, ZRegister zd, PRegisterMerge pg, SVEFAddSubImm imm) {\n    SVEFPArithWithImmediate(0b011, size, zd, pg, FEXCore::ToUnderlying(imm));\n  }\n  void fmaxnm(SubRegSize size, ZRegister zd, PRegisterMerge pg, SVEFMaxMinImm imm) {\n    SVEFPArithWithImmediate(0b100, size, zd, pg, FEXCore::ToUnderlying(imm));\n  }\n  void fminnm(SubRegSize size, ZRegister zd, PRegisterMerge pg, SVEFMaxMinImm imm) {\n    SVEFPArithWithImmediate(0b101, size, zd, pg, FEXCore::ToUnderlying(imm));\n  }\n  void fmax(SubRegSize size, ZRegister zd, PRegisterMerge pg, SVEFMaxMinImm imm) {\n    SVEFPArithWithImmediate(0b110, size, zd, pg, FEXCore::ToUnderlying(imm));\n  }\n  void fmin(SubRegSize size, ZRegister zd, PRegisterMerge pg, SVEFMaxMinImm imm) {\n    SVEFPArithWithImmediate(0b111, size, zd, pg, FEXCore::ToUnderlying(imm));\n  }\n\n  // SVE Floating Point Unary Operations - Predicated\n  // SVE floating-point round to integral value\n  void frinti(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEFloatRoundIntegral(0b111, size, zd, pg, zn);\n  }\n  void frintx(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEFloatRoundIntegral(0b110, size, zd, pg, zn);\n  }\n  void frinta(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEFloatRoundIntegral(0b100, size, zd, pg, zn);\n  }\n  void frintn(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEFloatRoundIntegral(0b000, size, zd, pg, zn);\n  }\n  void frintz(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEFloatRoundIntegral(0b011, size, zd, pg, zn);\n  }\n  void frintm(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEFloatRoundIntegral(0b010, size, zd, pg, zn);\n  }\n  void frintp(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEFloatRoundIntegral(0b001, size, zd, pg, zn);\n  }\n\n  // SVE floating-point convert precision\n  void fcvt(SubRegSize to, SubRegSize from, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEFPConvertPrecision(to, from, zd, pg, zn);\n  }\n  void fcvtx(ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n    uint32_t Instr = 0b0110'0101'0000'1010'1010'0000'0000'0000;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  // SVE floating-point unary operations\n  void frecpx(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEFloatUnary(0b00, size, pg, zn, zd);\n  }\n  void fsqrt(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVEFloatUnary(0b01, size, pg, zn, zd);\n  }\n\n  // SVE integer convert to floating-point\n  void scvtf(ZRegister zd, SubRegSize dstsize, PRegisterMerge pg, ZRegister zn, SubRegSize srcsize) {\n    uint32_t opc1, opc2;\n    if (srcsize == SubRegSize::i16Bit) {\n      // Srcsize = fp16, opc2 encodes dst size\n      LOGMAN_THROW_A_FMT(dstsize == SubRegSize::i16Bit, \"Unsupported size in {}\", __func__);\n      opc1 = 0b01;\n      opc2 = 0b01;\n    } else if (srcsize == SubRegSize::i32Bit) {\n      // Srcsize = fp32, opc1 encodes dst size\n      opc1 = dstsize == SubRegSize::i64Bit ? 0b11 : dstsize == SubRegSize::i32Bit ? 0b10 : dstsize == SubRegSize::i16Bit ? 0b01 : 0b00;\n\n      opc2 = dstsize == SubRegSize::i64Bit ? 0b00 : dstsize == SubRegSize::i32Bit ? 0b10 : dstsize == SubRegSize::i16Bit ? 0b10 : 0b00;\n    } else if (srcsize == SubRegSize::i64Bit) {\n      // SrcSize = fp64, opc2 encodes dst size\n      opc1 = dstsize == SubRegSize::i64Bit ? 0b11 : dstsize == SubRegSize::i32Bit ? 0b11 : dstsize == SubRegSize::i16Bit ? 0b01 : 0b00;\n      opc2 = dstsize == SubRegSize::i64Bit ? 0b11 : dstsize == SubRegSize::i32Bit ? 0b10 : dstsize == SubRegSize::i16Bit ? 0b11 : 0b00;\n    } else {\n      FEX_UNREACHABLE;\n    }\n    SVEIntegerConvertToFloat(dstsize, srcsize, opc1, opc2, 0, pg, zn, zd);\n  }\n  void ucvtf(ZRegister zd, SubRegSize dstsize, PRegisterMerge pg, ZRegister zn, SubRegSize srcsize) {\n    uint32_t opc1, opc2;\n    if (srcsize == SubRegSize::i16Bit) {\n      // Srcsize = fp16, opc2 encodes dst size\n      LOGMAN_THROW_A_FMT(dstsize == SubRegSize::i16Bit, \"Unsupported size in {}\", __func__);\n      opc1 = 0b01;\n      opc2 = 0b01;\n    } else if (srcsize == SubRegSize::i32Bit) {\n      // Srcsize = fp32, opc1 encodes dst size\n      opc1 = dstsize == SubRegSize::i64Bit ? 0b11 : dstsize == SubRegSize::i32Bit ? 0b10 : dstsize == SubRegSize::i16Bit ? 0b01 : 0b00;\n\n      opc2 = dstsize == SubRegSize::i64Bit ? 0b00 : dstsize == SubRegSize::i32Bit ? 0b10 : dstsize == SubRegSize::i16Bit ? 0b10 : 0b00;\n    } else if (srcsize == SubRegSize::i64Bit) {\n      // SrcSize = fp64, opc2 encodes dst size\n      opc1 = dstsize == SubRegSize::i64Bit ? 0b11 : dstsize == SubRegSize::i32Bit ? 0b11 : dstsize == SubRegSize::i16Bit ? 0b01 : 0b00;\n      opc2 = dstsize == SubRegSize::i64Bit ? 0b11 : dstsize == SubRegSize::i32Bit ? 0b10 : dstsize == SubRegSize::i16Bit ? 0b11 : 0b00;\n    } else {\n      FEX_UNREACHABLE;\n    }\n    SVEIntegerConvertToFloat(dstsize, srcsize, opc1, opc2, 1, pg, zn, zd);\n  }\n\n  // SVE floating-point convert to integer\n  void flogb(SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    const auto ConvertedSize = size == SubRegSize::i64Bit ? 0b11 :\n                               size == SubRegSize::i32Bit ? 0b10 :\n                               size == SubRegSize::i16Bit ? 0b01 :\n                                                            0b00;\n\n    SVEFloatConvertToInt(size, size, 1, 0b00, ConvertedSize, 0, pg, zn, zd);\n  }\n  void fcvtzs(ZRegister zd, SubRegSize dstsize, PRegisterMerge pg, ZRegister zn, SubRegSize srcsize) {\n    uint32_t opc1, opc2;\n    if (srcsize == SubRegSize::i16Bit) {\n      // Srcsize = fp16, opc2 encodes dst size\n      opc1 = 0b01;\n      opc2 = dstsize == SubRegSize::i64Bit ? 0b11 : dstsize == SubRegSize::i32Bit ? 0b10 : dstsize == SubRegSize::i16Bit ? 0b01 : 0b00;\n    } else if (srcsize == SubRegSize::i32Bit) {\n      // Srcsize = fp32, opc1 encodes dst size\n      LOGMAN_THROW_A_FMT(dstsize != SubRegSize::i16Bit, \"Unsupported size in {}\", __func__);\n      opc1 = dstsize == SubRegSize::i64Bit ? 0b11 : 0b10;\n      opc2 = 0b10;\n    } else if (srcsize == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(dstsize != SubRegSize::i16Bit, \"Unsupported size in {}\", __func__);\n      // SrcSize = fp64, opc2 encodes dst size\n      opc1 = 0b11;\n      opc2 = dstsize == SubRegSize::i64Bit ? 0b11 : 0b00;\n    } else {\n      FEX_UNREACHABLE;\n    }\n    SVEFloatConvertToInt(dstsize, srcsize, 1, opc1, opc2, 0, pg, zn, zd);\n  }\n  void fcvtzu(ZRegister zd, SubRegSize dstsize, PRegisterMerge pg, ZRegister zn, SubRegSize srcsize) {\n    uint32_t opc1, opc2;\n    if (srcsize == SubRegSize::i16Bit) {\n      // Srcsize = fp16, opc2 encodes dst size\n      opc1 = 0b01;\n      opc2 = dstsize == SubRegSize::i64Bit ? 0b11 : dstsize == SubRegSize::i32Bit ? 0b10 : dstsize == SubRegSize::i16Bit ? 0b01 : 0b00;\n    } else if (srcsize == SubRegSize::i32Bit) {\n      // Srcsize = fp32, opc1 encodes dst size\n      LOGMAN_THROW_A_FMT(dstsize != SubRegSize::i16Bit, \"Unsupported size in {}\", __func__);\n      opc1 = dstsize == SubRegSize::i64Bit ? 0b11 : 0b10;\n      opc2 = 0b10;\n    } else if (srcsize == SubRegSize::i64Bit) {\n      LOGMAN_THROW_A_FMT(dstsize != SubRegSize::i16Bit, \"Unsupported size in {}\", __func__);\n      // SrcSize = fp64, opc2 encodes dst size\n      opc1 = 0b11;\n      opc2 = dstsize == SubRegSize::i64Bit ? 0b11 : 0b00;\n    } else {\n      FEX_UNREACHABLE;\n    }\n    SVEFloatConvertToInt(dstsize, srcsize, 1, opc1, opc2, 1, pg, zn, zd);\n  }\n\n  // SVE Floating Point Unary Operations - Unpredicated\n  // SVE floating-point reciprocal estimate (unpredicated)\n  void frecpe(SubRegSize size, ZRegister zd, ZRegister zn) {\n    SVEFPUnaryOpsUnpredicated(0b110, size, zd, zn);\n  }\n  void frsqrte(SubRegSize size, ZRegister zd, ZRegister zn) {\n    SVEFPUnaryOpsUnpredicated(0b111, size, zd, zn);\n  }\n\n  // SVE Floating Point Compare - with Zero\n  // SVE floating-point compare with zero\n  void fcmge(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn) {\n    SVEFPCompareWithZero(0b00, 0, size, pd, pg, zn);\n  }\n  void fcmgt(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn) {\n    SVEFPCompareWithZero(0b00, 1, size, pd, pg, zn);\n  }\n  void fcmlt(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn) {\n    SVEFPCompareWithZero(0b01, 0, size, pd, pg, zn);\n  }\n  void fcmle(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn) {\n    SVEFPCompareWithZero(0b01, 1, size, pd, pg, zn);\n  }\n  void fcmeq(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn) {\n    SVEFPCompareWithZero(0b10, 0, size, pd, pg, zn);\n  }\n  void fcmne(SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn) {\n    SVEFPCompareWithZero(0b11, 0, size, pd, pg, zn);\n  }\n\n  // SVE Floating Point Accumulating Reduction\n  // SVE floating-point serial reduction (predicated)\n  void fadda(SubRegSize size, VRegister vd, PRegister pg, VRegister vn, ZRegister zm) {\n    SVEFPSerialReductionPredicated(0b00, size, vd, pg, vn, zm);\n  }\n\n  // SVE Floating Point Multiply-Add\n  // SVE floating-point multiply-accumulate writing addend\n  void fmla(SubRegSize size, ZRegister zda, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFPMultiplyAdd(0b000, size, zda, pg, zn, zm);\n  }\n  void fmls(SubRegSize size, ZRegister zda, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFPMultiplyAdd(0b001, size, zda, pg, zn, zm);\n  }\n  void fnmla(SubRegSize size, ZRegister zda, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFPMultiplyAdd(0b010, size, zda, pg, zn, zm);\n  }\n  void fnmls(SubRegSize size, ZRegister zda, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    SVEFPMultiplyAdd(0b011, size, zda, pg, zn, zm);\n  }\n\n  // SVE floating-point multiply-accumulate writing multiplicand\n  void fmad(SubRegSize size, ZRegister zdn, PRegisterMerge pg, ZRegister zm, ZRegister za) {\n    SVEFPMultiplyAdd(0b100, size, zdn, pg, zm, za);\n  }\n  void fmsb(SubRegSize size, ZRegister zdn, PRegisterMerge pg, ZRegister zm, ZRegister za) {\n    SVEFPMultiplyAdd(0b101, size, zdn, pg, zm, za);\n  }\n  void fnmad(SubRegSize size, ZRegister zdn, PRegisterMerge pg, ZRegister zm, ZRegister za) {\n    SVEFPMultiplyAdd(0b110, size, zdn, pg, zm, za);\n  }\n  void fnmsb(SubRegSize size, ZRegister zdn, PRegisterMerge pg, ZRegister zm, ZRegister za) {\n    SVEFPMultiplyAdd(0b111, size, zdn, pg, zm, za);\n  }\n\n  // SVE Memory - 32-bit Gather and Unsized Contiguous\n  void ldr(PRegister pt, XRegister rn, int32_t imm = 0) {\n    SVEUnsizedLoadStoreContiguous(0b0, imm, ZRegister {pt.Idx()}, rn, false);\n  }\n  void ldr(ZRegister zt, XRegister rn, int32_t imm = 0) {\n    SVEUnsizedLoadStoreContiguous(0b1, imm, zt, rn, false);\n  }\n\n  // SVE 32-bit gather prefetch (scalar plus 32-bit scaled offsets)\n  // XXX:\n  // SVE contiguous prefetch (scalar plus immediate)\n  // XXX:\n  // SVE2 32-bit gather non-temporal load (vector plus scalar)\n  // XXX:\n  // SVE contiguous prefetch (scalar plus scalar)\n  // XXX:\n  // SVE 32-bit gather prefetch (vector plus immediate)\n  // XXX:\n\n  // SVE load and broadcast element\n  void ld1rb(SubRegSize esize, ZRegister zt, PRegisterZero pg, Register rn, uint32_t imm = 0) {\n    SVELoadAndBroadcastElement(false, esize, SubRegSize::i8Bit, zt, pg, rn, imm);\n  }\n  void ld1rsb(SubRegSize esize, ZRegister zt, PRegisterZero pg, Register rn, uint32_t imm = 0) {\n    SVELoadAndBroadcastElement(true, esize, SubRegSize::i8Bit, zt, pg, rn, imm);\n  }\n  void ld1rh(SubRegSize esize, ZRegister zt, PRegisterZero pg, Register rn, uint32_t imm = 0) {\n    SVELoadAndBroadcastElement(false, esize, SubRegSize::i16Bit, zt, pg, rn, imm);\n  }\n  void ld1rsh(SubRegSize esize, ZRegister zt, PRegisterZero pg, Register rn, uint32_t imm = 0) {\n    SVELoadAndBroadcastElement(true, esize, SubRegSize::i16Bit, zt, pg, rn, imm);\n  }\n  void ld1rw(SubRegSize esize, ZRegister zt, PRegisterZero pg, Register rn, uint32_t imm = 0) {\n    SVELoadAndBroadcastElement(false, esize, SubRegSize::i32Bit, zt, pg, rn, imm);\n  }\n  void ld1rsw(ZRegister zt, PRegisterZero pg, Register rn, uint32_t imm = 0) {\n    SVELoadAndBroadcastElement(true, SubRegSize::i64Bit, SubRegSize::i32Bit, zt, pg, rn, imm);\n  }\n  void ld1rd(ZRegister zt, PRegisterZero pg, Register rn, uint32_t imm = 0) {\n    SVELoadAndBroadcastElement(false, SubRegSize::i64Bit, SubRegSize::i64Bit, zt, pg, rn, imm);\n  }\n\n  // SVE contiguous non-temporal load (scalar plus immediate)\n  void ldnt1b(ZRegister zt, PRegister pg, Register rn, int32_t Imm = 0) {\n    SVEContiguousNontemporalLoad(0b00, zt, pg, rn, Imm);\n  }\n  void ldnt1h(ZRegister zt, PRegister pg, Register rn, int32_t Imm = 0) {\n    SVEContiguousNontemporalLoad(0b01, zt, pg, rn, Imm);\n  }\n  void ldnt1w(ZRegister zt, PRegister pg, Register rn, int32_t Imm = 0) {\n    SVEContiguousNontemporalLoad(0b10, zt, pg, rn, Imm);\n  }\n  void ldnt1d(ZRegister zt, PRegister pg, Register rn, int32_t Imm = 0) {\n    SVEContiguousNontemporalLoad(0b11, zt, pg, rn, Imm);\n  }\n\n  // SVE contiguous non-temporal load (scalar plus scalar)\n  // XXX:\n  // SVE load multiple structures (scalar plus immediate)\n  void ld2b(ZRegister zt1, ZRegister zt2, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(2, false, 0b00, Imm, zt1, pg, rn);\n  }\n  void ld3b(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(3, false, 0b00, Imm, zt1, pg, rn);\n  }\n  void ld4b(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(4, false, 0b00, Imm, zt1, pg, rn);\n  }\n  void ld2h(ZRegister zt1, ZRegister zt2, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(2, false, 0b01, Imm, zt1, pg, rn);\n  }\n  void ld3h(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(3, false, 0b01, Imm, zt1, pg, rn);\n  }\n  void ld4h(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(4, false, 0b01, Imm, zt1, pg, rn);\n  }\n  void ld2w(ZRegister zt1, ZRegister zt2, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(2, false, 0b10, Imm, zt1, pg, rn);\n  }\n  void ld3w(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(3, false, 0b10, Imm, zt1, pg, rn);\n  }\n  void ld4w(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(4, false, 0b10, Imm, zt1, pg, rn);\n  }\n  void ld2d(ZRegister zt1, ZRegister zt2, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(2, false, 0b11, Imm, zt1, pg, rn);\n  }\n  void ld3d(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(3, false, 0b11, Imm, zt1, pg, rn);\n  }\n  void ld4d(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(4, false, 0b11, Imm, zt1, pg, rn);\n  }\n\n  // SVE helper implementations\n  template<SubRegSize size>\n  void ld1b(ZRegister zt, PRegisterZero pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      ld1b<size>(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      ld1b<size>(zt, pg, Src.rn, Src.MetaType.ScalarImmType.Imm);\n    } else if (Src.IsScalarPlusVector()) {\n      SVEGatherLoadScalarPlusVector(size, SubRegSize::i8Bit, zt, pg, Src, true, false);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEGatherLoadVectorPlusImm(size, SubRegSize::i8Bit, zt, pg, Src, true, false);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  template<SubRegSize size>\n  void ldff1b(ZRegister zt, PRegisterZero pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      ldff1b<size>(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      LOGMAN_THROW_A_FMT(false, \"ldff1b doesn't have a scalar plus immediate variant\");\n    } else if (Src.IsScalarPlusVector()) {\n      SVEGatherLoadScalarPlusVector(size, SubRegSize::i8Bit, zt, pg, Src, true, true);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEGatherLoadVectorPlusImm(size, SubRegSize::i8Bit, zt, pg, Src, true, true);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  void ld1sw(ZRegister zt, PRegisterZero pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      ld1sw(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      ld1sw(zt, pg, Src.rn, Src.MetaType.ScalarImmType.Imm);\n    } else if (Src.IsScalarPlusVector()) {\n      SVEGatherLoadScalarPlusVector(SubRegSize::i64Bit, SubRegSize::i32Bit, zt, pg, Src, false, false);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEGatherLoadVectorPlusImm(SubRegSize::i64Bit, SubRegSize::i32Bit, zt, pg, Src, false, false);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  template<SubRegSize size>\n  void ld1h(ZRegister zt, PRegisterZero pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      ld1h<size>(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      ld1h<size>(zt, pg, Src.rn, Src.MetaType.ScalarImmType.Imm);\n    } else if (Src.IsScalarPlusVector()) {\n      SVEGatherLoadScalarPlusVector(size, SubRegSize::i16Bit, zt, pg, Src, true, false);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEGatherLoadVectorPlusImm(size, SubRegSize::i16Bit, zt, pg, Src, true, false);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  template<SubRegSize size>\n  void ld1sh(ZRegister zt, PRegisterZero pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      ld1sh<size>(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      ld1sh<size>(zt, pg, Src.rn, Src.MetaType.ScalarImmType.Imm);\n    } else if (Src.IsScalarPlusVector()) {\n      SVEGatherLoadScalarPlusVector(size, SubRegSize::i16Bit, zt, pg, Src, false, false);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEGatherLoadVectorPlusImm(size, SubRegSize::i16Bit, zt, pg, Src, false, false);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  template<SubRegSize size>\n  void ldff1h(ZRegister zt, PRegisterZero pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      ldff1h<size>(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      LOGMAN_THROW_A_FMT(false, \"ldff1h doesn't have a scalar plus immediate variant\");\n    } else if (Src.IsScalarPlusVector()) {\n      SVEGatherLoadScalarPlusVector(size, SubRegSize::i16Bit, zt, pg, Src, true, true);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEGatherLoadVectorPlusImm(size, SubRegSize::i16Bit, zt, pg, Src, true, true);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  template<SubRegSize size>\n  void ldff1sh(ZRegister zt, PRegisterZero pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      ldff1sh<size>(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      LOGMAN_THROW_A_FMT(false, \"ldff1sh doesn't have a scalar plus immediate variant\");\n    } else if (Src.IsScalarPlusVector()) {\n      SVEGatherLoadScalarPlusVector(size, SubRegSize::i16Bit, zt, pg, Src, false, true);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEGatherLoadVectorPlusImm(size, SubRegSize::i16Bit, zt, pg, Src, false, true);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  template<SubRegSize size>\n  void ld1w(ZRegister zt, PRegisterZero pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      ld1w<size>(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      ld1w<size>(zt, pg, Src.rn, Src.MetaType.ScalarImmType.Imm);\n    } else if (Src.IsScalarPlusVector()) {\n      SVEGatherLoadScalarPlusVector(size, SubRegSize::i32Bit, zt, pg, Src, true, false);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEGatherLoadVectorPlusImm(size, SubRegSize::i32Bit, zt, pg, Src, true, false);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  template<SubRegSize size>\n  void ldff1w(ZRegister zt, PRegisterZero pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      ldff1w<size>(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      LOGMAN_THROW_A_FMT(false, \"ldff1w doesn't have a scalar plus immediate variant\");\n    } else if (Src.IsScalarPlusVector()) {\n      SVEGatherLoadScalarPlusVector(size, SubRegSize::i32Bit, zt, pg, Src, true, true);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEGatherLoadVectorPlusImm(size, SubRegSize::i32Bit, zt, pg, Src, true, true);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  void ldff1sw(ZRegister zt, PRegisterZero pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      ldff1sw(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      LOGMAN_THROW_A_FMT(false, \"ldff1sw doesn't have a scalar plus immediate variant\");\n    } else if (Src.IsScalarPlusVector()) {\n      SVEGatherLoadScalarPlusVector(SubRegSize::i64Bit, SubRegSize::i32Bit, zt, pg, Src, false, true);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEGatherLoadVectorPlusImm(SubRegSize::i64Bit, SubRegSize::i32Bit, zt, pg, Src, false, true);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  template<SubRegSize size>\n  void ld1sb(ZRegister zt, PRegisterZero pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      ld1sb<size>(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      ld1sb<size>(zt, pg, Src.rn, Src.MetaType.ScalarImmType.Imm);\n    } else if (Src.IsScalarPlusVector()) {\n      SVEGatherLoadScalarPlusVector(size, SubRegSize::i8Bit, zt, pg, Src, false, false);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEGatherLoadVectorPlusImm(size, SubRegSize::i8Bit, zt, pg, Src, false, false);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  template<SubRegSize size>\n  void ldff1sb(ZRegister zt, PRegisterZero pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      ldff1sb<size>(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      LOGMAN_THROW_A_FMT(false, \"ldff1sb doesn't have a scalar plus immediate variant\");\n    } else if (Src.IsScalarPlusVector()) {\n      SVEGatherLoadScalarPlusVector(size, SubRegSize::i8Bit, zt, pg, Src, false, true);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEGatherLoadVectorPlusImm(size, SubRegSize::i8Bit, zt, pg, Src, false, true);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  void ld1d(ZRegister zt, PRegisterZero pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      ld1d(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      ld1d(zt, pg, Src.rn, Src.MetaType.ScalarImmType.Imm);\n    } else if (Src.IsScalarPlusVector()) {\n      SVEGatherLoadScalarPlusVector(SubRegSize::i64Bit, SubRegSize::i64Bit, zt, pg, Src, true, false);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEGatherLoadVectorPlusImm(SubRegSize::i64Bit, SubRegSize::i64Bit, zt, pg, Src, true, false);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  void ldff1d(ZRegister zt, PRegisterZero pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      ldff1d(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      LOGMAN_THROW_A_FMT(false, \"ldff1d doesn't have a scalar plus immediate variant\");\n    } else if (Src.IsScalarPlusVector()) {\n      SVEGatherLoadScalarPlusVector(SubRegSize::i64Bit, SubRegSize::i64Bit, zt, pg, Src, true, true);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEGatherLoadVectorPlusImm(SubRegSize::i64Bit, SubRegSize::i64Bit, zt, pg, Src, true, true);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  template<SubRegSize size>\n  void st1b(ZRegister zt, PRegister pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      st1b<size>(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      st1b<size>(zt, pg, Src.rn, Src.MetaType.ScalarImmType.Imm);\n    } else if (Src.IsScalarPlusVector()) {\n      SVEScatterStoreScalarPlusVector(size, SubRegSize::i8Bit, zt, pg, Src);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEScatterStoreVectorPlusImm(size, SubRegSize::i8Bit, zt, pg, Src);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  template<SubRegSize size>\n  void st1h(ZRegister zt, PRegister pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      st1h<size>(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      st1h<size>(zt, pg, Src.rn, Src.MetaType.ScalarImmType.Imm);\n    } else if (Src.IsScalarPlusVector()) {\n      SVEScatterStoreScalarPlusVector(size, SubRegSize::i16Bit, zt, pg, Src);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEScatterStoreVectorPlusImm(size, SubRegSize::i16Bit, zt, pg, Src);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  template<SubRegSize size>\n  void st1w(ZRegister zt, PRegister pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      st1w<size>(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      st1w<size>(zt, pg, Src.rn, Src.MetaType.ScalarImmType.Imm);\n    } else if (Src.IsScalarPlusVector()) {\n      SVEScatterStoreScalarPlusVector(size, SubRegSize::i32Bit, zt, pg, Src);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEScatterStoreVectorPlusImm(size, SubRegSize::i32Bit, zt, pg, Src);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  void st1d(ZRegister zt, PRegister pg, SVEMemOperand Src) {\n    if (Src.IsScalarPlusScalar()) {\n      st1d(zt, pg, Src.rn, Src.MetaType.ScalarScalarType.rm);\n    } else if (Src.IsScalarPlusImm()) {\n      st1d(zt, pg, Src.rn, Src.MetaType.ScalarImmType.Imm);\n    } else if (Src.IsScalarPlusVector()) {\n      SVEScatterStoreScalarPlusVector(SubRegSize::i64Bit, SubRegSize::i64Bit, zt, pg, Src);\n    } else if (Src.IsVectorPlusImm()) {\n      SVEScatterStoreVectorPlusImm(SubRegSize::i64Bit, SubRegSize::i64Bit, zt, pg, Src);\n    } else {\n      FEX_UNREACHABLE;\n    }\n  }\n\n  // SVE load multiple structures (scalar plus scalar)\n  void ld2b(ZRegister zt1, ZRegister zt2, PRegisterZero pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(false, SubRegSize::i8Bit, 0b01, zt1, pg, rn, rm);\n  }\n  void ld3b(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegisterZero pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(false, SubRegSize::i8Bit, 0b10, zt1, pg, rn, rm);\n  }\n  void ld4b(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegisterZero pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(false, SubRegSize::i8Bit, 0b11, zt1, pg, rn, rm);\n  }\n  void ld2h(ZRegister zt1, ZRegister zt2, PRegisterZero pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(false, SubRegSize::i16Bit, 0b01, zt1, pg, rn, rm);\n  }\n  void ld3h(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegisterZero pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(false, SubRegSize::i16Bit, 0b10, zt1, pg, rn, rm);\n  }\n  void ld4h(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegisterZero pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(false, SubRegSize::i16Bit, 0b11, zt1, pg, rn, rm);\n  }\n  void ld2w(ZRegister zt1, ZRegister zt2, PRegisterZero pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(false, SubRegSize::i32Bit, 0b01, zt1, pg, rn, rm);\n  }\n  void ld3w(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegisterZero pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(false, SubRegSize::i32Bit, 0b10, zt1, pg, rn, rm);\n  }\n  void ld4w(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegisterZero pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(false, SubRegSize::i32Bit, 0b11, zt1, pg, rn, rm);\n  }\n  void ld2d(ZRegister zt1, ZRegister zt2, PRegisterZero pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(false, SubRegSize::i64Bit, 0b01, zt1, pg, rn, rm);\n  }\n  void ld3d(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegisterZero pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(false, SubRegSize::i64Bit, 0b10, zt1, pg, rn, rm);\n  }\n  void ld4d(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegisterZero pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(false, SubRegSize::i64Bit, 0b11, zt1, pg, rn, rm);\n  }\n\n  // SVE load and broadcast quadword (scalar plus immediate)\n  void ld1rqb(ZRegister zt, PRegisterZero pg, Register rn, int imm = 0) {\n    SVELoadBroadcastQuadScalarPlusImm(0b00, 0b00, zt, pg, rn, imm);\n  }\n  void ld1rob(ZRegister zt, PRegisterZero pg, Register rn, int imm = 0) {\n    SVELoadBroadcastQuadScalarPlusImm(0b00, 0b01, zt, pg, rn, imm);\n  }\n  void ld1rqh(ZRegister zt, PRegisterZero pg, Register rn, int imm = 0) {\n    SVELoadBroadcastQuadScalarPlusImm(0b01, 0b00, zt, pg, rn, imm);\n  }\n  void ld1roh(ZRegister zt, PRegisterZero pg, Register rn, int imm = 0) {\n    SVELoadBroadcastQuadScalarPlusImm(0b01, 0b01, zt, pg, rn, imm);\n  }\n  void ld1rqw(ZRegister zt, PRegisterZero pg, Register rn, int imm = 0) {\n    SVELoadBroadcastQuadScalarPlusImm(0b10, 0b00, zt, pg, rn, imm);\n  }\n  void ld1row(ZRegister zt, PRegisterZero pg, Register rn, int imm = 0) {\n    SVELoadBroadcastQuadScalarPlusImm(0b10, 0b01, zt, pg, rn, imm);\n  }\n  void ld1rqd(ZRegister zt, PRegisterZero pg, Register rn, int imm = 0) {\n    SVELoadBroadcastQuadScalarPlusImm(0b11, 0b00, zt, pg, rn, imm);\n  }\n  void ld1rod(ZRegister zt, PRegisterZero pg, Register rn, int imm = 0) {\n    SVELoadBroadcastQuadScalarPlusImm(0b11, 0b01, zt, pg, rn, imm);\n  }\n\n  // SVE contiguous load (scalar plus immediate)\n  template<SubRegSize size>\n  void ld1b(ZRegister zt, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    SVEContiguousLoadImm(false, 0b0000 | FEXCore::ToUnderlying(size), Imm, pg, rn, zt);\n  }\n\n  void ld1sw(ZRegister zt, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    SVEContiguousLoadImm(false, 0b0100, Imm, pg, rn, zt);\n  }\n\n  template<SubRegSize size>\n  void ld1h(ZRegister zt, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    static_assert(size != SubRegSize::i8Bit, \"Invalid size\");\n    SVEContiguousLoadImm(false, 0b0100 | FEXCore::ToUnderlying(size), Imm, pg, rn, zt);\n  }\n\n  template<SubRegSize size>\n  void ld1sh(ZRegister zt, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    static_assert(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid size\");\n\n    constexpr uint32_t ConvertedSize = size == SubRegSize::i32Bit ? 1 : size == SubRegSize::i64Bit ? 0 : -1;\n\n    SVEContiguousLoadImm(false, 0b1000 | ConvertedSize, Imm, pg, rn, zt);\n  }\n\n  template<SubRegSize size>\n  void ld1w(ZRegister zt, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    static_assert(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid size\");\n\n    constexpr uint32_t ConvertedSize = size == SubRegSize::i32Bit ? 0 : size == SubRegSize::i64Bit ? 1 : -1;\n\n    SVEContiguousLoadImm(false, 0b1010 | ConvertedSize, Imm, pg, rn, zt);\n  }\n\n  template<SubRegSize size>\n  void ld1sb(ZRegister zt, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    static_assert(size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid size\");\n\n    constexpr uint32_t ConvertedSize = size == SubRegSize::i16Bit ? 0b10 :\n                                       size == SubRegSize::i32Bit ? 0b01 :\n                                       size == SubRegSize::i64Bit ? 0b00 :\n                                                                    -1;\n\n    SVEContiguousLoadImm(false, 0b1100 | ConvertedSize, Imm, pg, rn, zt);\n  }\n  void ld1d(ZRegister zt, PRegisterZero pg, Register rn, int32_t Imm = 0) {\n    SVEContiguousLoadImm(false, 0b1111, Imm, pg, rn, zt);\n  }\n\n  // SVE contiguous non-fault load (scalar plus immediate)\n  // XXX:\n\n  // SVE load and broadcast quadword (scalar plus scalar)\n  void ld1rqb(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    SVELoadBroadcastQuadScalarPlusScalar(0b00, 0b00, zt, pg, rn, rm);\n  }\n  void ld1rob(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    SVELoadBroadcastQuadScalarPlusScalar(0b00, 0b01, zt, pg, rn, rm);\n  }\n  void ld1rqh(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    SVELoadBroadcastQuadScalarPlusScalar(0b01, 0b00, zt, pg, rn, rm);\n  }\n  void ld1roh(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    SVELoadBroadcastQuadScalarPlusScalar(0b01, 0b01, zt, pg, rn, rm);\n  }\n  void ld1rqw(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    SVELoadBroadcastQuadScalarPlusScalar(0b10, 0b00, zt, pg, rn, rm);\n  }\n  void ld1row(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    SVELoadBroadcastQuadScalarPlusScalar(0b10, 0b01, zt, pg, rn, rm);\n  }\n  void ld1rqd(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    SVELoadBroadcastQuadScalarPlusScalar(0b11, 0b00, zt, pg, rn, rm);\n  }\n  void ld1rod(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    SVELoadBroadcastQuadScalarPlusScalar(0b11, 0b01, zt, pg, rn, rm);\n  }\n\n  // SVE contiguous load (scalar plus scalar)\n  template<SubRegSize size>\n  void ld1b(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    SVEContiguousLoadStore(0, 0, 0b0000 | FEXCore::ToUnderlying(size), rm, pg, rn, zt);\n  }\n\n  void ld1sw(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    SVEContiguousLoadStore(0, 0, 0b0100, rm, pg, rn, zt);\n  }\n\n  template<SubRegSize size>\n  void ld1h(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    static_assert(size != SubRegSize::i8Bit, \"Invalid size\");\n    SVEContiguousLoadStore(0, 0, 0b0100 | FEXCore::ToUnderlying(size), rm, pg, rn, zt);\n  }\n\n  template<SubRegSize size>\n  void ld1sh(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    static_assert(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid size\");\n    constexpr uint32_t ConvertedSize = size == SubRegSize::i32Bit ? 1 : size == SubRegSize::i64Bit ? 0 : -1;\n    SVEContiguousLoadStore(0, 0, 0b1000 | ConvertedSize, rm, pg, rn, zt);\n  }\n\n  template<SubRegSize size>\n  void ld1w(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    static_assert(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid size\");\n    constexpr uint32_t ConvertedSize = size == SubRegSize::i32Bit ? 0 : size == SubRegSize::i64Bit ? 1 : -1;\n    SVEContiguousLoadStore(0, 0, 0b1010 | ConvertedSize, rm, pg, rn, zt);\n  }\n  template<SubRegSize size>\n  void ld1sb(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    static_assert(size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid size\");\n    constexpr uint32_t ConvertedSize = size == SubRegSize::i16Bit ? 0b10 :\n                                       size == SubRegSize::i32Bit ? 0b01 :\n                                       size == SubRegSize::i64Bit ? 0b00 :\n                                                                    -1;\n    SVEContiguousLoadStore(0, 0, 0b1100 | ConvertedSize, rm, pg, rn, zt);\n  }\n\n  void ld1d(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    SVEContiguousLoadStore(0, 0, 0b1111, rm, pg, rn, zt);\n  }\n\n  // SVE contiguous first-fault load (scalar plus scalar)\n  template<SubRegSize size>\n  void ldff1b(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    SVEContiguousLoadStore(0, 1, 0b0000 | FEXCore::ToUnderlying(size), rm, pg, rn, zt);\n  }\n  template<SubRegSize size>\n  void ldff1sb(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    static_assert(size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid size\");\n    constexpr uint32_t ConvertedSize = size == SubRegSize::i16Bit ? 0b10 :\n                                       size == SubRegSize::i32Bit ? 0b01 :\n                                       size == SubRegSize::i64Bit ? 0b00 :\n                                                                    -1;\n    SVEContiguousLoadStore(0, 1, 0b1100 | ConvertedSize, rm, pg, rn, zt);\n  }\n  template<SubRegSize size>\n  void ldff1h(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    static_assert(size != SubRegSize::i8Bit, \"Invalid size\");\n    SVEContiguousLoadStore(0, 1, 0b0100 | FEXCore::ToUnderlying(size), rm, pg, rn, zt);\n  }\n  template<SubRegSize size>\n  void ldff1sh(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    static_assert(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid size\");\n    constexpr uint32_t ConvertedSize = size == SubRegSize::i32Bit ? 1 : size == SubRegSize::i64Bit ? 0 : -1;\n    SVEContiguousLoadStore(0, 1, 0b1000 | ConvertedSize, rm, pg, rn, zt);\n  }\n  template<SubRegSize size>\n  void ldff1w(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    static_assert(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid size\");\n    constexpr uint32_t ConvertedSize = size == SubRegSize::i32Bit ? 0 : size == SubRegSize::i64Bit ? 1 : -1;\n    SVEContiguousLoadStore(0, 1, 0b1010 | ConvertedSize, rm, pg, rn, zt);\n  }\n  void ldff1sw(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    SVEContiguousLoadStore(0, 1, 0b0100, rm, pg, rn, zt);\n  }\n  void ldff1d(ZRegister zt, PRegisterZero pg, Register rn, Register rm) {\n    SVEContiguousLoadStore(0, 1, 0b1111, rm, pg, rn, zt);\n  }\n\n  // SVE Memory - 64-bit Gather\n  // SVE 64-bit gather prefetch (scalar plus 64-bit scaled offsets)\n  // XXX:\n  // SVE 64-bit gather prefetch (scalar plus unpacked 32-bit scaled offsets)\n  // XXX:\n  // SVE 64-bit gather prefetch (vector plus immediate)\n  // XXX:\n  // SVE2 64-bit gather non-temporal load (vector plus scalar)\n  // XXX:\n\n  // SVE Memory - Contiguous Store and Unsized Contiguous\n  void str(PRegister pt, XRegister rn, int32_t imm = 0) {\n    SVEUnsizedLoadStoreContiguous(0b0, imm, ZRegister {pt.Idx()}, rn, true);\n  }\n  void str(ZRegister zt, XRegister rn, int32_t imm = 0) {\n    SVEUnsizedLoadStoreContiguous(0b1, imm, zt, rn, true);\n  }\n\n  // SVE contiguous store (scalar plus scalar)\n  template<SubRegSize size>\n  void st1b(ZRegister zt, PRegister pg, Register rn, Register rm) {\n    SVEContiguousLoadStore(1, 0, 0b0000 | FEXCore::ToUnderlying(size), rm, pg, rn, zt);\n  }\n\n  template<SubRegSize size>\n  void st1h(ZRegister zt, PRegister pg, Register rn, Register rm) {\n    static_assert(size != SubRegSize::i8Bit, \"Invalid size\");\n    SVEContiguousLoadStore(1, 0, 0b0100 | FEXCore::ToUnderlying(size), rm, pg, rn, zt);\n  }\n\n  template<SubRegSize size>\n  void st1w(ZRegister zt, PRegister pg, Register rn, Register rm) {\n    static_assert(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid size\");\n    constexpr uint32_t ConvertedSize = size == SubRegSize::i32Bit ? 0 : size == SubRegSize::i64Bit ? 1 : -1;\n\n    SVEContiguousLoadStore(1, 0, 0b1010 | ConvertedSize, rm, pg, rn, zt);\n  }\n  void st1d(ZRegister zt, PRegister pg, Register rn, Register rm) {\n    SVEContiguousLoadStore(1, 0, 0b1111, rm, pg, rn, zt);\n  }\n\n  // SVE Memory - Non-temporal and Multi-register Store\n  // SVE2 64-bit scatter non-temporal store (vector plus scalar)\n  // XXX:\n  // SVE contiguous non-temporal store (scalar plus scalar)\n  // XXX:\n  // SVE2 32-bit scatter non-temporal store (vector plus scalar)\n  // XXX:\n\n  // SVE store multiple structures (scalar plus scalar)\n  void st2b(ZRegister zt1, ZRegister zt2, PRegister pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(true, SubRegSize::i8Bit, 0b01, zt1, pg, rn, rm);\n  }\n  void st3b(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegister pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(true, SubRegSize::i8Bit, 0b10, zt1, pg, rn, rm);\n  }\n  void st4b(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegister pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(true, SubRegSize::i8Bit, 0b11, zt1, pg, rn, rm);\n  }\n  void st2h(ZRegister zt1, ZRegister zt2, PRegister pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(true, SubRegSize::i16Bit, 0b01, zt1, pg, rn, rm);\n  }\n  void st3h(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegister pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(true, SubRegSize::i16Bit, 0b10, zt1, pg, rn, rm);\n  }\n  void st4h(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegister pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(true, SubRegSize::i16Bit, 0b11, zt1, pg, rn, rm);\n  }\n  void st2w(ZRegister zt1, ZRegister zt2, PRegister pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(true, SubRegSize::i32Bit, 0b01, zt1, pg, rn, rm);\n  }\n  void st3w(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegister pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(true, SubRegSize::i32Bit, 0b10, zt1, pg, rn, rm);\n  }\n  void st4w(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegister pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(true, SubRegSize::i32Bit, 0b11, zt1, pg, rn, rm);\n  }\n  void st2d(ZRegister zt1, ZRegister zt2, PRegister pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(true, SubRegSize::i64Bit, 0b01, zt1, pg, rn, rm);\n  }\n  void st3d(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegister pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(true, SubRegSize::i64Bit, 0b10, zt1, pg, rn, rm);\n  }\n  void st4d(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegister pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousLoadStoreMultipleScalar(true, SubRegSize::i64Bit, 0b11, zt1, pg, rn, rm);\n  }\n\n  // SVE Memory - Contiguous Store with Immediate Offset\n  // SVE contiguous non-temporal store (scalar plus immediate)\n  void stnt1b(ZRegister zt, PRegister pg, Register rn, int32_t Imm = 0) {\n    SVEContiguousNontemporalStore(0b00, zt, pg, rn, Imm);\n  }\n  void stnt1h(ZRegister zt, PRegister pg, Register rn, int32_t Imm = 0) {\n    SVEContiguousNontemporalStore(0b01, zt, pg, rn, Imm);\n  }\n  void stnt1w(ZRegister zt, PRegister pg, Register rn, int32_t Imm = 0) {\n    SVEContiguousNontemporalStore(0b10, zt, pg, rn, Imm);\n  }\n  void stnt1d(ZRegister zt, PRegister pg, Register rn, int32_t Imm = 0) {\n    SVEContiguousNontemporalStore(0b11, zt, pg, rn, Imm);\n  }\n\n  // SVE store multiple structures (scalar plus immediate)\n  void st2b(ZRegister zt1, ZRegister zt2, PRegister pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(2, true, 0b00, Imm, zt1, pg, rn);\n  }\n  void st3b(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegister pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(3, true, 0b00, Imm, zt1, pg, rn);\n  }\n  void st4b(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegister pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(4, true, 0b00, Imm, zt1, pg, rn);\n  }\n  void st2h(ZRegister zt1, ZRegister zt2, PRegister pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(2, true, 0b01, Imm, zt1, pg, rn);\n  }\n  void st3h(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegister pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(3, true, 0b01, Imm, zt1, pg, rn);\n  }\n  void st4h(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegister pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(4, true, 0b01, Imm, zt1, pg, rn);\n  }\n  void st2w(ZRegister zt1, ZRegister zt2, PRegister pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(2, true, 0b10, Imm, zt1, pg, rn);\n  }\n  void st3w(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegister pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(3, true, 0b10, Imm, zt1, pg, rn);\n  }\n  void st4w(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegister pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(4, true, 0b10, Imm, zt1, pg, rn);\n  }\n  void st2d(ZRegister zt1, ZRegister zt2, PRegister pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(2, true, 0b11, Imm, zt1, pg, rn);\n  }\n  void st3d(ZRegister zt1, ZRegister zt2, ZRegister zt3, PRegister pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(3, true, 0b11, Imm, zt1, pg, rn);\n  }\n  void st4d(ZRegister zt1, ZRegister zt2, ZRegister zt3, ZRegister zt4, PRegister pg, Register rn, int32_t Imm = 0) {\n    LOGMAN_THROW_A_FMT(AreVectorsSequential(zt1, zt2, zt3, zt4), \"Registers need to be contiguous\");\n    SVEContiguousMultipleStructures(4, true, 0b11, Imm, zt1, pg, rn);\n  }\n\n  // SVE contiguous store (scalar plus immediate)\n  template<SubRegSize size>\n  void st1b(ZRegister zt, PRegister pg, Register rn, int32_t Imm = 0) {\n    SVEContiguousLoadImm(true, 0b0000 | FEXCore::ToUnderlying(size), Imm, pg, rn, zt);\n  }\n\n  template<SubRegSize size>\n  void st1h(ZRegister zt, PRegister pg, Register rn, int32_t Imm = 0) {\n    static_assert(size != SubRegSize::i8Bit, \"Invalid size\");\n    SVEContiguousLoadImm(true, 0b0100 | FEXCore::ToUnderlying(size), Imm, pg, rn, zt);\n  }\n\n  template<SubRegSize size>\n  void st1w(ZRegister zt, PRegister pg, Register rn, int32_t Imm = 0) {\n    static_assert(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Invalid size\");\n\n    constexpr uint32_t ConvertedSize = size == SubRegSize::i32Bit ? 0 : size == SubRegSize::i64Bit ? 1 : -1;\n\n    SVEContiguousLoadImm(true, 0b1010 | ConvertedSize, Imm, pg, rn, zt);\n  }\n\n  void st1d(ZRegister zt, PRegister pg, Register rn, int32_t Imm = 0) {\n    SVEContiguousLoadImm(true, 0b1111, Imm, pg, rn, zt);\n  }\nprivate:\n  // SVE encodings\n  void SVEDupIndexed(SubRegSize size, ZRegister zn, ZRegister zd, uint32_t Index) {\n    const auto size_bytes = 1U << FEXCore::ToUnderlying(size);\n    const auto log2_size_bytes = FEXCore::ilog2(size_bytes);\n\n    // We can index up to 512-bit registers with dup\n    const auto max_index = (64U >> log2_size_bytes) - 1;\n    LOGMAN_THROW_A_FMT(Index <= max_index, \"dup index ({}) too large. Must be within [0, {}].\", Index, max_index);\n\n    // imm2:tsz make up a 7 bit wide field, with each increasing element size\n    // restricting the range of those 7 bits (e.g. B: tsz=xxxx1, H: tsz=xxx10,\n    // S: tsz=xx100. etc). So we can just use the log2 of the element size\n    // to construct the overall immediate and form both imm2 and tsz.\n    const auto imm7 = (Index << (log2_size_bytes + 1)) | (1U << log2_size_bytes);\n    const auto imm2 = imm7 >> 5;\n    const auto tsz = imm7 & 0b11111;\n\n    uint32_t Instr = 0b0000'0101'0010'0000'0010'0000'0000'0000;\n    Instr |= imm2 << 22;\n    Instr |= tsz << 16;\n    Instr |= Encode_rn(zn);\n    Instr |= Encode_rd(zd);\n    dc32(Instr);\n  }\n\n  void SVEAddSubImmediateUnpred(uint32_t opc, SubRegSize size, ZRegister zd, ZRegister zn, uint32_t imm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit element size\");\n    LOGMAN_THROW_A_FMT(zd == zn, \"zd needs to equal zn\");\n\n    const bool is_uint8_imm = (imm >> 8) == 0;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(is_uint8_imm, \"Can't perform LSL #8 shift on 8-bit elements.\");\n    }\n\n    uint32_t shift = 0;\n    if (!is_uint8_imm) {\n      const bool is_uint16_imm = (imm >> 16) == 0;\n\n      LOGMAN_THROW_A_FMT(is_uint16_imm, \"Immediate ({}) must be a 16-bit value within [256, 65280]\", imm);\n      LOGMAN_THROW_A_FMT((imm % 256) == 0, \"Immediate ({}) must be a multiple of 256\", imm);\n\n      imm /= 256;\n      shift = 1;\n    }\n\n    uint32_t Instr = 0b0010'0101'0010'0000'1100'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= shift << 13;\n    Instr |= imm << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEMinMaxImmediateUnpred(uint32_t opc, SubRegSize size, ZRegister zd, ZRegister zn, int32_t imm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit element size\");\n    LOGMAN_THROW_A_FMT(zd == zn, \"zd needs to equal zn\");\n\n    const bool is_signed = (opc & 1) == 0;\n    if (is_signed) {\n      LOGMAN_THROW_A_FMT(imm >= -128 && imm <= 127, \"Invalid immediate ({}). Must be within [-127, 128]\", imm);\n    } else {\n      LOGMAN_THROW_A_FMT(imm >= 0 && imm <= 255, \"Invalid immediate ({}). Must be within [0, 255]\", imm);\n    }\n\n    const auto imm8 = static_cast<uint32_t>(imm) & 0xFF;\n\n    uint32_t Instr = 0b0010'0101'0010'1000'1100'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= imm8 << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEMultiplyImmediateUnpred(uint32_t opc, SubRegSize size, ZRegister zd, ZRegister zn, int32_t imm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit element size\");\n    LOGMAN_THROW_A_FMT(zd == zn, \"zd needs to equal zn\");\n    LOGMAN_THROW_A_FMT(imm >= -128 && imm <= 127, \"Invalid immediate ({}). Must be within [-127, 128]\", imm);\n\n    const auto imm8 = static_cast<uint32_t>(imm) & 0xFF;\n\n    uint32_t Instr = 0b0010'0101'0011'0000'1100'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= imm8 << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEBroadcastImm(uint32_t opc, int32_t imm, SubRegSize size, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n\n    const auto [new_imm, is_shift] = HandleSVESImm8Shift(size, imm);\n\n    uint32_t Instr = 0b0010'0101'0011'1000'1100'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 17;\n    Instr |= is_shift << 13;\n    Instr |= (static_cast<uint32_t>(new_imm) & 0xFF) << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEBroadcastFloatImmPredicated(SubRegSize size, ZRegister zd, PRegister pg, float value) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Unsupported fcpy/fmov size\");\n\n    uint32_t imm {};\n    if (size == SubRegSize::i16Bit) {\n      LOGMAN_MSG_A_FMT(\"Unsupported\");\n      FEX_UNREACHABLE;\n    } else if (size == SubRegSize::i32Bit) {\n      imm = FP32ToImm8(value);\n    } else if (size == SubRegSize::i64Bit) {\n      imm = FP64ToImm8(value);\n    }\n\n    uint32_t Instr = 0b0000'0101'0001'0000'1100'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= pg.Idx() << 16;\n    Instr |= imm << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEBroadcastFloatImmUnpredicated(uint32_t opc, uint32_t o2, uint32_t imm, SubRegSize size, ZRegister zd) {\n    uint32_t Instr = 0b0010'0101'0011'1001'1100'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 17;\n    Instr |= o2 << 13;\n    Instr |= imm << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEBroadcastIntegerImmPredicated(uint32_t m, SubRegSize size, ZRegister zd, PRegister pg, int32_t imm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit element size\");\n\n    const auto [new_imm, is_shift] = HandleSVESImm8Shift(size, imm);\n\n    uint32_t Instr = 0b0000'0101'0001'0000'0000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= pg.Idx() << 16;\n    Instr |= m << 14;\n    Instr |= is_shift << 13;\n    Instr |= (static_cast<uint32_t>(new_imm) & 0xFF) << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEAddressGeneration(SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm, SVEModType mod, uint32_t scale) {\n    LOGMAN_THROW_A_FMT(scale <= 3, \"Scale ({}) must be within [0, 3]\", scale);\n\n    uint32_t Instr = 0b0000'0100'0010'0000'1010'0000'0000'0000;\n\n    switch (mod) {\n    case SVEModType::MOD_UXTW:\n    case SVEModType::MOD_SXTW: {\n      LOGMAN_THROW_A_FMT(size == SubRegSize::i64Bit, \"Unpacked ADR must be using 64-bit elements\");\n\n      const auto is_unsigned = mod == SVEModType::MOD_UXTW;\n      if (is_unsigned) {\n        Instr |= 1U << 22;\n      }\n      break;\n    }\n    case SVEModType::MOD_NONE:\n    case SVEModType::MOD_LSL: {\n      if (mod == SVEModType::MOD_NONE) {\n        LOGMAN_THROW_A_FMT(scale == 0, \"Cannot scale packed ADR without a modifier\");\n      }\n      LOGMAN_THROW_A_FMT(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Packed ADR must be using 32-bit or 64-bit elements\");\n      Instr |= FEXCore::ToUnderlying(size) << 22;\n      break;\n    }\n    }\n\n    Instr |= zm.Idx() << 16;\n    Instr |= scale << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVESel(SubRegSize size, ZRegister zm, PRegister pv, ZRegister zn, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit element size\");\n\n    uint32_t Instr = 0b0000'0101'0010'0000'1100'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= pv.Idx() << 10;\n    Instr |= Encode_rn(zn);\n    Instr |= Encode_rd(zd);\n    dc32(Instr);\n  }\n\n  void SVEBitwiseShiftbyVector(uint32_t R, uint32_t L, uint32_t U, SubRegSize size, PRegister pg, ZRegister zd, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n    LOGMAN_THROW_A_FMT(zd == zn, \"Dest needs to equal zn\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0000'0100'0001'0000'1000'0000'0000'0000;\n\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= R << 18;\n    Instr |= L << 17;\n    Instr |= U << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zm.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  // SVE integer add/subtract vectors (unpredicated)\n  void SVEIntegerAddSubUnpredicated(uint32_t opc, SubRegSize size, ZRegister zm, ZRegister zn, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n\n    uint32_t Instr = 0b0000'0100'0010'0000'0000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= opc << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  // SVE table lookup (three sources)\n  void SVETableLookup(uint32_t op, SubRegSize size, ZRegister zm, ZRegister zn, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n\n    uint32_t Instr = 0b0000'0101'0010'0000'0010'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= op << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  // SVE permute vector elements\n  void SVEPermute(uint32_t opc, SubRegSize size, ZRegister zm, ZRegister zn, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n\n    uint32_t Instr = 0b0000'0101'0010'0000'0110'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= opc << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  // SVE predicate logical operations\n  void SVEPredicateLogical(uint32_t op, uint32_t S, uint32_t o2, uint32_t o3, PRegister pm, PRegister pg, PRegister pn, PRegister pd) {\n    uint32_t Instr = 0b0010'0101'0000'0000'0100'0000'0000'0000;\n    Instr |= op << 23;\n    Instr |= S << 22;\n    Instr |= pm.Idx() << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= o2 << 9;\n    Instr |= pn.Idx() << 5;\n    Instr |= o3 << 4;\n    Instr |= pd.Idx();\n    dc32(Instr);\n  }\n\n  // SVE floating-point convert precision odd elements\n  void SVEFloatConvertOdd(uint32_t opc, uint32_t opc2, PRegister pg, ZRegister zn, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0110'0100'0000'1000'1010'0000'0000'0000;\n    Instr |= opc << 22;\n    Instr |= opc2 << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  // SVE2 floating-point pairwise operations\n  void SVEFloatPairwiseArithmetic(uint32_t opc, SubRegSize size, PRegister pg, ZRegister zd, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(zd == zn, \"zd needs to equal zn\");\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Invalid float size\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0110'0100'0001'0000'1000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zm.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  // SVE floating-point arithmetic (unpredicated)\n  void SVEFloatArithmeticUnpredicated(uint32_t opc, SubRegSize size, ZRegister zm, ZRegister zn, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Invalid float size\");\n\n    uint32_t Instr = 0b0110'0101'0000'0000'0000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= opc << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  // SVE bitwise logical operations (predicated)\n  void SVEBitwiseLogicalPredicated(uint32_t opc, SubRegSize size, PRegister pg, ZRegister zdn, ZRegister zm, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(size != ARMEmitter::SubRegSize::i128Bit, \"Can't use 128-bit size\");\n    LOGMAN_THROW_A_FMT(zd == zdn, \"zd needs to equal zdn\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0000'0100'0001'1000'0000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zm.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  // SVE constructive prefix (predicated)\n  void SVEConstructivePrefixPredicated(uint32_t opc, uint32_t M, SubRegSize size, PRegister pg, ZRegister zn, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit element size\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0000'0100'0001'0000'0010'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 17;\n    Instr |= M << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= Encode_rn(zn);\n    Instr |= Encode_rd(zd);\n    dc32(Instr);\n  }\n\n  // SVE bitwise unary operations (predicated)\n  void SVEIntegerUnaryPredicated(uint32_t op0, uint32_t opc, SubRegSize size, PRegister pg, ZRegister zn, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0000'0100'0000'0000'1010'0000'0000'0000;\n\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= op0 << 19;\n    Instr |= opc << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  // SVE bitwise logical operations (unpredicated)\n  void SVEBitwiseLogicalUnpredicated(uint32_t opc, ZRegister zm, ZRegister zn, ZRegister zd) {\n    uint32_t Instr = 0b0000'0100'0010'0000'0011'0000'0000'0000;\n\n    Instr |= opc << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  // SVE Permute Vector - Unpredicated\n  void SVEPermuteUnpredicated(SubRegSize size, uint32_t opc, ZRegister zdn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Cannot use 128-bit element size\");\n\n    uint32_t Instr = 0b0000'0101'0010'0000'0011'1000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= zm.Idx() << 5;\n    Instr |= zdn.Idx();\n    dc32(Instr);\n  }\n\n  // SVE Permute Predicate\n  void SVEPermutePredicate(SubRegSize size, uint32_t op1, uint32_t op2, uint32_t op3, PRegister pd, PRegister pn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Cannot use 128-bit element size\");\n\n    uint32_t Instr = 0b0000'0101'0010'0000'0100'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= op1 << 16;\n    Instr |= op2 << 9;\n    Instr |= op3 << 4;\n    Instr |= pn.Idx() << 5;\n    Instr |= pd.Idx();\n    dc32(Instr);\n  }\n\n  // SVE Integer Misc - Unpredicated\n  void SVEIntegerMiscUnpredicated(uint32_t op0, uint32_t opc, uint32_t opc2, ZRegister zd, ZRegister zn) {\n    uint32_t Instr = 0b0000'0100'0010'0000'1011'0000'0000'0000;\n    Instr |= opc2 << 22;\n    Instr |= opc << 16;\n    Instr |= op0 << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  // SVE floating-point arithmetic (predicated)\n  void SVEFloatArithmeticPredicated(uint32_t opc, SubRegSize size, PRegister pg, ZRegister zd, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(zd == zn, \"zn needs to equal zd\");\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Invalid float size\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0110'0101'0000'0000'1000'0000'0000'0000;\n\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zm.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVECharacterMatch(uint32_t opc, SubRegSize size, PRegister pd, PRegisterZero pg, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i8Bit || size == SubRegSize::i16Bit, \"match/nmatch can only use 8-bit or 16-bit element sizes\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7.Zeroing(), \"match/nmatch can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0100'0101'0010'0000'1000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 4;\n    Instr |= zm.Idx() << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= pd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEFPRecursiveReduction(uint32_t opc, SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"FP reduction operation can only use 16/32/64-bit element sizes\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"FP reduction operation can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0110'0101'0000'0000'0010'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= vd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEAddSubVectorsPredicated(uint32_t opc, SubRegSize size, ZRegister zd, PRegister pg, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(zd == zn, \"zd and zn must be the same register\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Add/Sub operation can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0000'0100'0000'0000'0000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zm.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEIntegerMulDivVectorsPredicated(uint32_t b18, uint32_t opc, SubRegSize size, ZRegister zd, PRegister pg, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(zd == zn, \"zd and zn must be the same register\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Mul/Div operation can only use p0-p7 as a governing predicate\");\n\n    // Division instruction\n    if (b18 != 0) {\n      LOGMAN_THROW_A_FMT(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Predicated divide only handles 32-bit or 64-bit \"\n                                                                                   \"elements\");\n    }\n\n    uint32_t Instr = 0b0000'0100'0001'0000'0000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= b18 << 18;\n    Instr |= opc << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zm.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEIntegerReductionOperation(uint32_t op, uint32_t opc, SubRegSize size, VRegister vd, PRegister pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit element size for reduction operation\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Integer reduction operation can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = op;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= vd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEIntegerMultiplyAddSubPredicated(uint32_t op0, uint32_t opc, SubRegSize size, ZRegister zd, PRegister pg, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit element size\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0000'0100'0000'0000'0100'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= op0 << 15;\n    Instr |= opc << 13;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEStackFrameOperation(uint32_t opc, XRegister rd, XRegister rn, int32_t imm) {\n    LOGMAN_THROW_A_FMT(imm >= -32 && imm <= 31, \"Stack frame operation immediate must be within -32 to 31\");\n\n    uint32_t Instr = 0b0000'0100'0010'0000'0101'0000'0000'0000;\n    Instr |= opc << 22;\n    Instr |= rn.Idx() << 16;\n    Instr |= (static_cast<uint32_t>(imm) & 0b111111) << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEBitwiseShiftByWideElementPredicated(SubRegSize size, uint32_t opc, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit && size != SubRegSize::i128Bit, \"Can't use 64-bit or 128-bit element size\");\n    LOGMAN_THROW_A_FMT(zd == zn, \"zd and zn must be the same register\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7.Merging(), \"Wide shift can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0000'0100'0001'1000'1000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zm.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEBitwiseShiftByWideElementsUnpredicated(SubRegSize size, uint32_t opc, ZRegister zd, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit && size != SubRegSize::i128Bit, \"Can't use 64-bit or 128-bit element size\");\n\n    uint32_t Instr = 0b0000'0100'0010'0000'1000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 10;\n    Instr |= zm.Idx() << 16;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEFPArithWithImmediate(uint32_t opc, SubRegSize size, ZRegister zd, PRegister pg, uint32_t i1) {\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i128Bit, \"Can't use 8-bit or 128-bit element size\");\n\n    uint32_t Instr = 0b0110'0101'0001'1000'1000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= i1 << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEFPConvertPrecision(SubRegSize to, SubRegSize from, ZRegister zd, PRegister pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n    LOGMAN_THROW_A_FMT(to != from, \"to and from sizes cannot be the same.\");\n    LOGMAN_THROW_A_FMT(to != SubRegSize::i8Bit && to != SubRegSize::i128Bit && from != SubRegSize::i8Bit && from != SubRegSize::i128Bit,\n                       \"Can't use 8-bit or 128-bit element size\");\n\n    // Encodings for the to and from sizes can get a little funky\n    // depending on what is being converted to/from.\n    const uint32_t op = [&] {\n      switch (from) {\n      case SubRegSize::i16Bit: {\n        switch (to) {\n        case SubRegSize::i32Bit: return 0x00810000U;\n        case SubRegSize::i64Bit: return 0x00C10000U;\n        default: return UINT32_MAX;\n        }\n      }\n\n      case SubRegSize::i32Bit: {\n        switch (to) {\n        case SubRegSize::i16Bit: return 0x00800000U;\n        case SubRegSize::i64Bit: return 0x00C30000U;\n        default: return UINT32_MAX;\n        }\n      }\n\n      case SubRegSize::i64Bit: {\n        switch (to) {\n        case SubRegSize::i16Bit: return 0x00C00000U;\n        case SubRegSize::i32Bit: return 0x00C20000U;\n        default: return UINT32_MAX;\n        }\n      }\n\n      default: return UINT32_MAX;\n      }\n    }();\n    LOGMAN_THROW_A_FMT(op != UINT32_MAX, \"Invalid conversion op value: {}\", op);\n\n    uint32_t Instr = 0b0110'0101'0000'1000'1010'0000'0000'0000;\n    Instr |= op;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2IntegerAddSubNarrowHighPart(SubRegSize size, uint32_t opc, ZRegister zd, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit && size != SubRegSize::i128Bit, \"Can't use 64-bit or 128-bit element size\");\n\n    uint32_t Instr = 0b0100'0101'0010'0000'0110'0000'0000'0000;\n    Instr |= (FEXCore::ToUnderlying(size) + 1) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= opc << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2CryptoUnaryOperation(uint32_t op, ZRegister zdn, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(zdn == zn, \"zdn and zn must be the same register\");\n\n    uint32_t Instr = 0b0100'0101'0010'0000'1110'0000'0000'0000;\n    Instr |= op << 10;\n    Instr |= zdn.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2CryptoDestructiveBinaryOperation(uint32_t op, uint32_t o2, ZRegister zdn, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(zdn == zn, \"zdn and zn must be the same register\");\n\n    uint32_t Instr = 0b0100'0101'0010'0010'1110'0000'0000'0000;\n    Instr |= op << 16;\n    Instr |= o2 << 10;\n    Instr |= zm.Idx() << 5;\n    Instr |= zdn.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2CryptoConstructiveBinaryOperation(uint32_t op, ZRegister zd, ZRegister zn, ZRegister zm) {\n    uint32_t Instr = 0b0100'0101'0010'0000'1111'0000'0000'0000;\n    Instr |= zm.Idx() << 16;\n    Instr |= op << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2BitwisePermute(SubRegSize size, uint32_t opc, ZRegister zd, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit element size\");\n\n    uint32_t Instr = 0b0100'0101'0000'0000'1011'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= opc << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2BitwiseXorInterleaved(SubRegSize size, uint32_t opc, ZRegister zd, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit element size\");\n\n    uint32_t Instr = 0b0100'0101'0000'0000'1001'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= opc << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEIntegerMatrixMulAccumulate(uint32_t opc, ZRegister zda, ZRegister zn, ZRegister zm) {\n    uint32_t Instr = 0b0100'0101'0000'0000'1001'1000'0000'0000;\n    Instr |= opc << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= zn.Idx() << 5;\n    Instr |= zda.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2IntegerAddSubInterleavedLong(SubRegSize size, uint32_t opc, ZRegister zd, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i128Bit, \"Can't use 8-bit or 128-bit element size\");\n\n    uint32_t Instr = 0b0100'0101'0000'0000'1000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= opc << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2IntegerAbsDiffAndAccumulate(SubRegSize size, uint32_t opc, ZRegister zda, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit element size\");\n\n    uint32_t Instr = 0b0100'0101'0000'0000'1111'1000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= opc << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zda.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2IntegerAddSubLongWithCarry(SubRegSize size, uint32_t sizep1, uint32_t T, ZRegister zda, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Element size must be 32-bit or 64-bit\");\n\n    const uint32_t NewSize = size == SubRegSize::i32Bit ? 0 : 1;\n\n    uint32_t Instr = 0b0100'0101'0000'0000'1101'0000'0000'0000;\n    Instr |= sizep1 << 23;\n    Instr |= NewSize << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= T << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zda.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2BitwiseShiftRightAndAccumulate(SubRegSize size, uint32_t opc, ZRegister zda, ZRegister zn, uint32_t shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Element size cannot be 128-bit\");\n\n    const auto [tszh, tszl_imm3] = EncodeSVEShiftImmediate(size, shift);\n\n    uint32_t Instr = 0b0100'0101'0000'0000'1110'0000'0000'0000;\n    Instr |= tszh << 22;\n    Instr |= tszl_imm3 << 16;\n    Instr |= opc << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zda.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2BitwiseShiftAndInsert(SubRegSize size, uint32_t opc, ZRegister zd, ZRegister zn, uint32_t shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Element size cannot be 128-bit\");\n\n    const bool IsLeftShift = opc != 0;\n    const auto [tszh, tszl_imm3] = EncodeSVEShiftImmediate(size, shift, IsLeftShift);\n\n    uint32_t Instr = 0b0100'0101'0000'0000'1111'0000'0000'0000;\n    Instr |= tszh << 22;\n    Instr |= tszl_imm3 << 16;\n    Instr |= opc << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2BitwiseShiftLeftLong(SubRegSize size, uint32_t opc, ZRegister zd, ZRegister zn, uint32_t shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i128Bit, \"Can't use 8-bit or 128-bit element size\");\n\n    // The size provided in is the size to expand to (e.g. 16-bit means a long shift\n    // expanding from 8-bit) so we just need to subtract the size by 1 so that our\n    // encoding helper will perform the proper encoding.\n    const auto size_minus_1 = SubRegSize {FEXCore::ToUnderlying(size) - 1};\n    const auto [tszh, tszl_imm3] = EncodeSVEShiftImmediate(size_minus_1, shift, true);\n\n    uint32_t Instr = 0b0100'0101'0000'0000'1010'0000'0000'0000;\n    Instr |= tszh << 22;\n    Instr |= tszl_imm3 << 16;\n    Instr |= opc << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2ComplexIntAdd(SubRegSize size, uint32_t opc, Rotation rot, ZRegister zd, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Complex add cannot use 128-bit element size\");\n    LOGMAN_THROW_A_FMT(zd == zn, \"zd and zn must be the same register\");\n    LOGMAN_THROW_A_FMT(rot == Rotation::ROTATE_90 || rot == Rotation::ROTATE_270, \"Rotation must be 90 or 270 degrees\");\n\n    const uint32_t SanitizedRot = rot == Rotation::ROTATE_90 ? 0 : 1;\n\n    uint32_t Instr = 0b0100'0101'0000'0000'1101'1000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= SanitizedRot << 10;\n    Instr |= zm.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2AbsDiffAccLong(SubRegSize size, uint32_t opc, ZRegister zda, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i128Bit, \"Cannot use 8-bit or 128-bit element size\");\n\n    uint32_t Instr = 0b0100'0101'0000'0000'1100'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= opc << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zda.Idx();\n    dc32(Instr);\n  }\n\n  void SVEPermuteVectorUnpredicated(SubRegSize size, uint32_t opc, ZRegister zdn, VRegister vm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Cannot use 128-bit element size\");\n\n    uint32_t Instr = 0b0000'0101'0010'0000'0011'1000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= vm.Idx() << 5;\n    Instr |= zdn.Idx();\n    dc32(Instr);\n  }\n\n  // SVE floating-point round to integral value\n  void SVEFloatRoundIntegral(uint32_t opc, SubRegSize size, ZRegister zd, PRegister pg, ZRegister zn) {\n    // opc = round mode\n    // 0b000 - N - Neaest ties to even\n    // 0b001 - P - Towards +inf\n    // 0b010 - M - Towards -inf\n    // 0b011 - Z - Towards zero\n    // 0b100 - A - Nearest away from zero\n    // 0b101 - Unallocated\n    // 0b110 - X - Current signalling inexact\n    // 0b111 - I - Current\n\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Unsupported size in {}\", __func__);\n\n    uint32_t Instr = 0b0110'0101'0000'0000'1010'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  // SVE floating-point convert to integer\n  void SVEFloatConvertToInt(SubRegSize dstsize, SubRegSize srcsize, uint32_t b19, uint32_t opc, uint32_t opc2, uint32_t U, PRegister pg,\n                            ZRegister zn, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n    LOGMAN_THROW_A_FMT(srcsize == SubRegSize::i16Bit || srcsize == SubRegSize::i32Bit || srcsize == SubRegSize::i64Bit,\n                       \"Unsupported src size in {}\", __func__);\n    LOGMAN_THROW_A_FMT(dstsize == SubRegSize::i16Bit || dstsize == SubRegSize::i32Bit || dstsize == SubRegSize::i64Bit,\n                       \"Unsupported dst size in {}\", __func__);\n\n    uint32_t Instr = 0b0110'0101'0001'0000'1010'0000'0000'0000;\n    Instr |= opc << 22;\n    Instr |= b19 << 19;\n    Instr |= opc2 << 17;\n    Instr |= U << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n  // SVE integer convert to floating-point\n  // We can implement this in terms of the floating-point to int version above,\n  // since the only difference in encoding is setting bit 19 to 0.\n  void SVEIntegerConvertToFloat(SubRegSize dstsize, SubRegSize srcsize, uint32_t opc, uint32_t opc2, uint32_t U, PRegister pg, ZRegister zn,\n                                ZRegister zd) {\n    SVEFloatConvertToInt(dstsize, srcsize, 0, opc, opc2, U, pg, zn, zd);\n  }\n\n  // SVE Memory - 32-bit Gather and Unsized Contiguous\n  // Note: This also handles 64-bit variants to keep overall handling code\n  //       compact and in the same place.\n  void SVEGatherLoadScalarPlusVector(SubRegSize esize, SubRegSize msize, ZRegister zt, PRegisterZero pg, SVEMemOperand mem_op,\n                                     bool is_unsigned, bool is_fault_first) {\n    LOGMAN_THROW_A_FMT(esize == SubRegSize::i32Bit || esize == SubRegSize::i64Bit, \"Gather load element size must be 32-bit or 64-bit\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    const auto& op_data = mem_op.MetaType.ScalarVectorType;\n    const bool is_scaled = op_data.scale != 0;\n    const auto msize_value = FEXCore::ToUnderlying(msize);\n\n    LOGMAN_THROW_A_FMT(op_data.scale == 0 || op_data.scale == msize_value, \"scale may only be 0 or {}\", msize_value);\n\n    uint32_t mod_value = FEXCore::ToUnderlying(op_data.mod);\n    uint32_t Instr = 0b1000'0100'0000'0000'0000'0000'0000'0000;\n\n    if (esize == SubRegSize::i64Bit) {\n      Instr |= 1U << 30;\n\n      const auto mod = op_data.mod;\n      const bool is_lsl = mod == SVEModType::MOD_LSL;\n      const bool is_none = mod == SVEModType::MOD_NONE;\n\n      // LSL and no modifier encodings should be setting bit 22 to 1.\n      if (is_lsl || is_none) {\n        if (is_lsl) {\n          LOGMAN_THROW_A_FMT(op_data.scale == msize_value, \"mod type of LSL must have a scale of {}\", msize_value);\n        } else {\n          LOGMAN_THROW_A_FMT(op_data.scale == 0, \"mod type of none must have a scale of 0\");\n        }\n\n        Instr |= 1U << 15;\n        mod_value = 1;\n      }\n    } else {\n      LOGMAN_THROW_A_FMT(op_data.mod == SVEModType::MOD_UXTW || op_data.mod == SVEModType::MOD_SXTW, \"mod type for 32-bit lane size may \"\n                                                                                                     \"only be UXTW or SXTW\");\n    }\n\n    Instr |= FEXCore::ToUnderlying(msize) << 23;\n    Instr |= static_cast<uint32_t>(mod_value) << 22;\n    Instr |= static_cast<uint32_t>(is_scaled) << 21;\n    Instr |= op_data.zm.Idx() << 16;\n    Instr |= static_cast<uint32_t>(is_unsigned) << 14;\n    Instr |= static_cast<uint32_t>(is_fault_first) << 13;\n    Instr |= pg.Idx() << 10;\n    Instr |= mem_op.rn.Idx() << 5;\n    Instr |= zt.Idx();\n\n    dc32(Instr);\n  }\n\n  void SVEScatterStoreScalarPlusVector(SubRegSize esize, SubRegSize msize, ZRegister zt, PRegister pg, SVEMemOperand mem_op) {\n    LOGMAN_THROW_A_FMT(esize == SubRegSize::i32Bit || esize == SubRegSize::i64Bit, \"Gather load element size must be 32-bit or 64-bit\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    const auto& op_data = mem_op.MetaType.ScalarVectorType;\n    const bool is_scaled = op_data.scale != 0;\n\n    const auto msize_value = FEXCore::ToUnderlying(msize);\n    uint32_t mod_value = FEXCore::ToUnderlying(op_data.mod);\n\n    LOGMAN_THROW_A_FMT(op_data.scale == 0 || op_data.scale == msize_value, \"scale may only be 0 or {}\", msize_value);\n\n    uint32_t Instr = 0b1110'0100'0000'0000'1000'0000'0000'0000;\n\n    if (esize == SubRegSize::i64Bit) {\n      const auto mod = op_data.mod;\n      const bool is_lsl = mod == SVEModType::MOD_LSL;\n      const bool is_none = mod == SVEModType::MOD_NONE;\n\n      if (is_lsl || is_none) {\n        if (is_lsl) {\n          LOGMAN_THROW_A_FMT(op_data.scale == msize_value, \"mod type of LSL must have a scale of {}\", msize_value);\n        } else {\n          LOGMAN_THROW_A_FMT(op_data.scale == 0, \"mod type of none must have a scale of 0\");\n        }\n        if (is_lsl || is_scaled) {\n          LOGMAN_THROW_A_FMT(msize != SubRegSize::i8Bit, \"Cannot use 8-bit store elements with unpacked 32-bit scaled offset and \"\n                                                         \"64-bit scaled offset variants. Instructions not allocated.\");\n        }\n\n        // 64-bit scaled/unscaled scatters need to set bit 13\n        Instr |= 1U << 13;\n        mod_value = 0;\n      }\n    } else {\n      if (is_scaled) {\n        LOGMAN_THROW_A_FMT(msize != SubRegSize::i8Bit && msize != SubRegSize::i64Bit, \"Cannot use 8-bit or 64-bit store elements with \"\n                                                                                      \"32-bit scaled offset variant. \"\n                                                                                      \"Instructions not allocated\");\n      } else {\n        LOGMAN_THROW_A_FMT(msize != SubRegSize::i64Bit, \"Cannot use 64-bit store elements with 32-bit unscaled offset variant. \"\n                                                        \"Instruction not allocated.\");\n      }\n\n      LOGMAN_THROW_A_FMT(op_data.mod == SVEModType::MOD_UXTW || op_data.mod == SVEModType::MOD_SXTW, \"mod type for 32-bit lane size may \"\n                                                                                                     \"only be UXTW or SXTW\");\n\n      // 32-bit scatters need to set bit 22.\n      Instr |= 1U << 22;\n    }\n\n    Instr |= msize_value << 23;\n    Instr |= static_cast<uint32_t>(is_scaled) << 21;\n    Instr |= op_data.zm.Idx() << 16;\n    Instr |= static_cast<uint32_t>(mod_value) << 14;\n    Instr |= pg.Idx() << 10;\n    Instr |= mem_op.rn.Idx() << 5;\n    Instr |= zt.Idx();\n\n    dc32(Instr);\n  }\n\n  void SVEGatherScatterVectorPlusImm(SubRegSize esize, SubRegSize msize, ZRegister zt, PRegister pg, SVEMemOperand mem_op, bool is_store,\n                                     bool is_unsigned, bool is_fault_first) {\n    LOGMAN_THROW_A_FMT(esize == SubRegSize::i32Bit || esize == SubRegSize::i64Bit, \"Gather load/store element size must be 32-bit or \"\n                                                                                   \"64-bit\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    const auto msize_value = FEXCore::ToUnderlying(msize);\n    const auto msize_bytes = 1U << msize_value;\n\n    const auto imm_limit = (32U << msize_value) - msize_bytes;\n    const auto imm = mem_op.MetaType.VectorImmType.Imm;\n    const auto imm_to_encode = imm >> msize_value;\n\n    LOGMAN_THROW_A_FMT(imm <= imm_limit, \"Immediate must be within [0, {}]\", imm_limit);\n    LOGMAN_THROW_A_FMT(imm == 0 || (imm % msize_bytes) == 0, \"Immediate must be cleanly divisible by {}\", msize_bytes);\n\n    uint32_t Instr = 0b1000'0100'0000'0000'1000'0000'0000'0000;\n\n    if (is_store) {\n      Instr |= 0x60402000U;\n      if (esize == SubRegSize::i32Bit) {\n        Instr |= 1U << 21;\n      }\n    } else {\n      Instr |= 0x00200000U;\n      if (esize == SubRegSize::i64Bit) {\n        Instr |= 1U << 30;\n      }\n    }\n\n    Instr |= msize_value << 23;\n    Instr |= imm_to_encode << 16;\n    Instr |= static_cast<uint32_t>(is_unsigned) << 14;\n    Instr |= static_cast<uint32_t>(is_fault_first) << 13;\n    Instr |= pg.Idx() << 10;\n    Instr |= mem_op.rn.Idx() << 5;\n    Instr |= zt.Idx();\n\n    dc32(Instr);\n  }\n\n  void SVEGatherLoadVectorPlusImm(SubRegSize esize, SubRegSize msize, ZRegister zt, PRegisterZero pg, SVEMemOperand mem_op,\n                                  bool is_unsigned, bool is_fault_first) {\n    SVEGatherScatterVectorPlusImm(esize, msize, zt, pg, mem_op, false, is_unsigned, is_fault_first);\n  }\n\n  void SVEScatterStoreVectorPlusImm(SubRegSize esize, SubRegSize msize, ZRegister zt, PRegister pg, SVEMemOperand mem_op) {\n    SVEGatherScatterVectorPlusImm(esize, msize, zt, pg, mem_op, true, false, true);\n  }\n\n  void SVEUnsizedLoadStoreContiguous(uint32_t op2, int32_t imm, ZRegister zt, Register rn, bool is_store) {\n    LOGMAN_THROW_A_FMT(imm >= -256 && imm <= 255, \"Immediate offset ({}) too large. Must be within [-256, 255].\", imm);\n\n    const auto imm9 = static_cast<uint32_t>(imm) & 0b1'1111'1111;\n\n    uint32_t Instr = 0b1000'0101'1000'0000'0000'0000'0000'0000;\n\n    if (is_store) {\n      Instr |= 0x60000000U;\n    }\n\n    Instr |= (imm9 >> 3) << 16;\n    Instr |= op2 << 14;\n    Instr |= (imm9 & 0b111) << 10;\n    Instr |= rn.Idx() << 5;\n    Instr |= zt.Idx();\n\n    dc32(Instr);\n  }\n\n  // SVE load/store multiple structures (scalar plus immediate)\n  void SVEContiguousMultipleStructures(int32_t num_regs, bool is_store, uint32_t msz, int32_t imm, ZRegister zt, PRegister pg, Register rn) {\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n    LOGMAN_THROW_A_FMT((imm % num_regs) == 0, \"Offset must be a multiple of {}\", num_regs);\n\n    const auto min_offset = -8 * num_regs;\n    const auto max_offset = 7 * num_regs;\n    LOGMAN_THROW_A_FMT(imm >= min_offset && imm <= max_offset,\n                       \"Invalid load/store offset ({}). Offset must be a multiple of {} and be within [{}, {}]\", imm, num_regs, min_offset,\n                       max_offset);\n\n    const auto imm4 = static_cast<uint32_t>(imm / num_regs) & 0xF;\n    const auto opc = static_cast<uint32_t>(num_regs - 1);\n\n    uint32_t Instr = 0b1010'0100'0000'0000'1110'0000'0000'0000;\n    Instr |= msz << 23;\n    Instr |= opc << 21;\n    Instr |= imm4 << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= zt.Idx();\n    if (is_store) {\n      Instr |= 0x40100000U;\n    }\n    dc32(Instr);\n  }\n\n  // SVE contiguous non-temporal load (scalar plus immediate)\n  void SVEContiguousNontemporalLoad(uint32_t msz, ZRegister zt, PRegister pg, Register rn, int32_t imm) {\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n    LOGMAN_THROW_A_FMT(imm >= -8 && imm <= 7, \"Invalid loadstore offset ({}). Must be between [-8, 7]\", imm);\n\n    const auto imm4 = static_cast<uint32_t>(imm) & 0xF;\n    uint32_t Instr = 0b1010'0100'0000'0000'1110'0000'0000'0000;\n    Instr |= msz << 23;\n    Instr |= imm4 << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= zt.Idx();\n    dc32(Instr);\n  }\n\n  // SVE contiguous non-temporal store (scalar plus immediate)\n  void SVEContiguousNontemporalStore(uint32_t msz, ZRegister zt, PRegister pg, Register rn, int32_t imm) {\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n    LOGMAN_THROW_A_FMT(imm >= -8 && imm <= 7, \"Invalid loadstore offset ({}). Must be between [-8, 7]\", imm);\n\n    const auto imm4 = static_cast<uint32_t>(imm) & 0xF;\n    uint32_t Instr = 0b1110'0100'0001'0000'1110'0000'0000'0000;\n    Instr |= msz << 23;\n    Instr |= imm4 << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= zt.Idx();\n    dc32(Instr);\n  }\n\n  void SVEContiguousLoadImm(bool is_store, uint32_t dtype, int32_t imm, PRegister pg, Register rn, ZRegister zt) {\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n    LOGMAN_THROW_A_FMT(imm >= -8 && imm <= 7, \"Invalid loadstore offset ({}). Must be between [-8, 7]\", imm);\n\n    const auto imm4 = static_cast<uint32_t>(imm) & 0xF;\n\n    uint32_t Instr = 0b1010'0100'0000'0000'1010'0000'0000'0000;\n    Instr |= dtype << 21;\n    Instr |= imm4 << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= zt.Idx();\n    if (is_store) {\n      Instr |= 0x40004000U;\n    }\n    dc32(Instr);\n  }\n\n  // zt.b, pg/z, xn, xm\n  void SVEContiguousLoadStore(uint32_t b30, uint32_t b13, uint32_t dtype, Register rm, PRegister pg, Register rn, ZRegister zt) {\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b1010'0100'0000'0000'0100'0000'0000'0000;\n    Instr |= b30 << 30;\n    Instr |= dtype << 21;\n    Instr |= Encode_rm(rm);\n    Instr |= b13 << 13;\n    Instr |= pg.Idx() << 10;\n    Instr |= Encode_rn(rn);\n    Instr |= zt.Idx();\n    dc32(Instr);\n  }\n\n  void SVEContiguousLoadStoreMultipleScalar(bool is_store, SubRegSize msz, uint32_t opc, ZRegister zt, PRegister pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n    LOGMAN_THROW_A_FMT(rm != Reg::rsp, \"rm cannot be the stack pointer\");\n\n    uint32_t Instr = 0b1010'0100'0000'0000'0000'0000'0000'0000;\n    if (is_store) {\n      Instr |= 0x40006000U;\n    } else {\n      Instr |= 0x0000C000U;\n    }\n    Instr |= FEXCore::ToUnderlying(msz) << 23;\n    Instr |= opc << 21;\n    Instr |= rm.Idx() << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= rn.Idx() << 5;\n    Instr |= zt.Idx();\n    dc32(Instr);\n  }\n\n  void SVELoadBroadcastQuadScalarPlusImm(uint32_t msz, uint32_t ssz, ZRegister zt, PRegister pg, Register rn, int imm) {\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    const auto esize = static_cast<int>(16 << ssz);\n    const auto max_imm = (esize << 3) - esize;\n    const auto min_imm = -(max_imm + esize);\n\n    LOGMAN_THROW_A_FMT((imm % esize) == 0, \"imm ({}) must be a multiple of {}\", imm, esize);\n    LOGMAN_THROW_A_FMT(imm >= min_imm && imm <= max_imm, \"imm ({}) must be within [{}, {}]\", imm, min_imm, max_imm);\n\n    const auto sanitized_imm = static_cast<uint32_t>(imm / esize) & 0b1111;\n\n    uint32_t Instr = 0b1010'0100'0000'0000'0010'0000'0000'0000;\n    Instr |= msz << 23;\n    Instr |= ssz << 21;\n    Instr |= sanitized_imm << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= rn.Idx() << 5;\n    Instr |= zt.Idx();\n    dc32(Instr);\n  }\n\n  void SVELoadBroadcastQuadScalarPlusScalar(uint32_t msz, uint32_t ssz, ZRegister zt, PRegister pg, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n    LOGMAN_THROW_A_FMT(rm != Reg::rsp, \"rm may not be the stack pointer\");\n\n    uint32_t Instr = 0b1010'0100'0000'0000'0000'0000'0000'0000;\n    Instr |= msz << 23;\n    Instr |= ssz << 21;\n    Instr |= rm.Idx() << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= rn.Idx() << 5;\n    Instr |= zt.Idx();\n    dc32(Instr);\n  }\n\n  void SVELoadAndBroadcastElement(bool is_signed, SubRegSize esize, SubRegSize msize, ZRegister zt, PRegister pg, Register rn, uint32_t imm) {\n    LOGMAN_THROW_A_FMT(esize != SubRegSize::i128Bit, \"Cannot use 128-bit elements.\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n    if (is_signed) {\n      // The element size needs to be larger than memory size, otherwise you tell\n      // me how we're gonna sign extend this bad boy in memory.\n      LOGMAN_THROW_A_FMT(esize > msize, \"Signed broadcast element size must be greater than memory size.\");\n    }\n\n    const auto esize_value = FEXCore::ToUnderlying(esize);\n    const auto msize_value = FEXCore::ToUnderlying(msize);\n\n    const auto data_size_bytes = 1U << msize_value;\n    const auto max_imm = (64U << msize_value) - data_size_bytes;\n    LOGMAN_THROW_A_FMT((imm % data_size_bytes) == 0 && imm <= max_imm, \"imm must be a multiple of {} and be within [0, {}]\",\n                       data_size_bytes, max_imm);\n\n    const auto sanitized_imm = imm / data_size_bytes;\n\n    auto dtypeh = msize_value;\n    auto dtypel = esize_value;\n    if (is_signed) {\n      // Signed forms of the broadcast instructions are encoded in such a way\n      // that msize will always be greater than esize, which, conveniently,\n      // works out by just XORing the would-be unsigned dtype values by 3.\n      dtypeh ^= 0b11;\n      dtypel ^= 0b11;\n    }\n    // Guards against bogus combinations of element size and memory size values\n    // being passed in. Unsigned variants will always have dtypeh be less than\n    // or equal to dtypel. The only time this isn't the case is with signed variants.\n    LOGMAN_THROW_A_FMT(is_signed == (dtypeh > dtypel),\n                       \"Invalid element size used with load broadcast instruction \"\n                       \"(esize: {}, msize: {})\",\n                       esize_value, msize_value);\n\n    uint32_t Instr = 0b1000'0100'0100'0000'1000'0000'0000'0000;\n    Instr |= dtypeh << 23;\n    Instr |= sanitized_imm << 16;\n    Instr |= dtypel << 13;\n    Instr |= pg.Idx() << 10;\n    Instr |= rn.Idx() << 5;\n    Instr |= zt.Idx();\n    dc32(Instr);\n  }\n\n  void SVEIndexGeneration(uint32_t op, SubRegSize size, ZRegister zd, int32_t imm5, int32_t imm5b) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"INDEX cannot use 128-bit element sizes\");\n\n    uint32_t Instr = 0b0000'0100'0010'0000'0100'0000'0000'0000;\n    Instr |= op << 10;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= (static_cast<uint32_t>(imm5b) & 0b11111) << 16;\n    Instr |= (static_cast<uint32_t>(imm5) & 0b11111) << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEIntegerCompareImm(uint32_t lt, uint32_t ne, uint32_t imm7, SubRegSize size, PRegister pg, ZRegister zn, PRegister pd) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n    LOGMAN_THROW_A_FMT(imm7 < 128, \"Invalid imm ({}). Must be within [0, 128]\", imm7);\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0010'0100'0010'0000'0000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= imm7 << 14;\n    Instr |= lt << 13;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= ne << 4;\n    Instr |= pd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEIntegerCompareSignedImm(uint32_t op, uint32_t o2, uint32_t ne, int32_t imm5, SubRegSize size, PRegister pg, ZRegister zn, PRegister pd) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n    LOGMAN_THROW_A_FMT(imm5 >= -16 && imm5 <= 15, \"Invalid imm ({}). Must be within [-16, 15].\", imm5);\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0010'0101'0000'0000'0000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= (static_cast<uint32_t>(imm5) & 0b1'1111) << 16;\n    Instr |= op << 15;\n    Instr |= o2 << 13;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= ne << 4;\n    Instr |= pd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEFloatCompareVector(uint32_t op, uint32_t o2, uint32_t o3, SubRegSize size, ZRegister zm, PRegister pg, ZRegister zn, PRegister pd) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Can't use 8-bit size\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0110'0101'0000'0000'0100'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= op << 15;\n    Instr |= o2 << 13;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= o3 << 4;\n    Instr |= pd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEIntegerMinMaxDifferencePredicated(uint32_t opc, uint32_t U, SubRegSize size, PRegister pg, ZRegister zdn, ZRegister zm, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n    LOGMAN_THROW_A_FMT(zd == zdn, \"zd needs to equal zdn\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0000'0100'0000'1000'0000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 17;\n    Instr |= U << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zm.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEBitWiseShiftImmediatePred(SubRegSize size, uint32_t opc, uint32_t L, uint32_t U, PRegister pg, ZRegister zd, ZRegister zdn,\n                                    uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit element size\");\n    LOGMAN_THROW_A_FMT(zd == zdn, \"zd needs to equal zdn\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    const bool IsLeftShift = L != 0;\n    const auto [tszh, tszl_imm3] = EncodeSVEShiftImmediate(size, Shift, IsLeftShift);\n\n    uint32_t Instr = 0b0000'0100'0000'0000'1000'0000'0000'0000;\n    Instr |= tszh << 22;\n    Instr |= opc << 18;\n    Instr |= L << 17;\n    Instr |= U << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= tszl_imm3 << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEBitWiseShiftImmediateUnpred(SubRegSize size, uint32_t opc, ZRegister zd, ZRegister zn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit element size\");\n\n    const bool IsLeftShift = opc == 0b11;\n    const auto [tszh, tszl_imm3] = EncodeSVEShiftImmediate(size, Shift, IsLeftShift);\n\n    uint32_t Instr = 0b0000'0100'0010'0000'1001'0000'0000'0000;\n    Instr |= tszh << 22;\n    Instr |= tszl_imm3 << 16;\n    Instr |= opc << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2BitwiseTernary(uint32_t opc, uint32_t o2, ZRegister zm, ZRegister zk, ZRegister zd, ZRegister zdn) {\n    LOGMAN_THROW_A_FMT(zd == zdn, \"zd needs to equal zdn\");\n\n    uint32_t Instr = 0b0000'0100'0010'0000'0011'1000'0000'0000;\n    Instr |= opc << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= o2 << 10;\n    Instr |= zk.Idx() << 5;\n    Instr |= zdn.Idx();\n    dc32(Instr);\n  }\n\n  void SVEPermuteVector(uint32_t op0, ARMEmitter::ZRegister zd, ARMEmitter::ZRegister zm, uint32_t Imm) {\n    constexpr uint32_t Op = 0b0000'0101'0010'0000'000 << 13;\n    uint32_t Instr = Op;\n\n    Instr |= op0 << 22;\n    Instr |= (Imm >> 3) << 16;\n    Instr |= (Imm & 0b111) << 10;\n    Instr |= zm.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEIntegerCompareVector(uint32_t op, uint32_t o2, uint32_t ne, SubRegSize size, ZRegister zm, PRegister pg, ZRegister zn, PRegister pd) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit element size\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    constexpr uint32_t Op = 0b0010'0100'0000'0000'000 << 13;\n    uint32_t Instr = Op;\n\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= op << 15;\n    Instr |= o2 << 13;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= ne << 4;\n    Instr |= pd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEIntegerCompareVectorWide(uint32_t op, uint32_t o2, uint32_t ne, SubRegSize size, PRegister pd, PRegister pg, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i64Bit, \"Can't use 64-bit element size\");\n    SVEIntegerCompareVector(op, o2, ne, size, zm, pg, zn, pd);\n  }\n\n  void SVE2SaturatingExtractNarrow(SubRegSize size, uint32_t opc, uint32_t T, ZRegister zn, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit && size != SubRegSize::i64Bit, \"Can't use 64/128-bit size\");\n\n    // While not necessarily a left shift, we can piggyback off its\n    // encoding behavior to encode the tszh and tszl bits.\n    const auto [tszh, tszl_imm3] = EncodeSVEShiftImmediate(size, 0, true);\n\n    uint32_t Instr = 0b0100'0101'0010'0000'0100'0000'0000'0000;\n    Instr |= tszh << 22;\n    Instr |= tszl_imm3 << 16;\n    Instr |= opc << 11;\n    Instr |= T << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2BitwiseShiftRightNarrow(SubRegSize size, uint32_t shift, uint32_t opc, uint32_t U, uint32_t R, uint32_t T, ZRegister zn, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit && size != SubRegSize::i64Bit, \"Can't use 64/128-bit element size\");\n\n    const auto [tszh, tszl_imm3] = EncodeSVEShiftImmediate(size, shift);\n\n    uint32_t Instr = 0b0100'0101'0010'0000'0000'0000'0000'0000;\n    Instr |= tszh << 22;\n    Instr |= tszl_imm3 << 16;\n    Instr |= opc << 13;\n    Instr |= U << 12;\n    Instr |= R << 11;\n    Instr |= T << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEFloatUnary(uint32_t opc, SubRegSize size, PRegister pg, ZRegister zn, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"Unsupported size in {}\", __func__);\n\n    uint32_t Instr = 0b0110'0101'0000'1100'1010'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2IntegerMultiplyVectors(uint32_t opc, SubRegSize size, ZRegister zm, ZRegister zn, ZRegister zd) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n\n    constexpr uint32_t Op = 0b0000'0100'0010'0000'0110 << 12;\n    uint32_t Instr = Op;\n\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= opc << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEPermuteVectorPredicated(uint32_t opc1, uint32_t opc2, SubRegSize size, ZRegister zd, PRegister pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0000'0101'0010'0000'1000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc1 << 16;\n    Instr |= opc2 << 13;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEPropagateBreak(uint32_t opc, uint32_t op2, uint32_t op3, PRegister pd, PRegister pg, PRegister pn, PRegister pm) {\n    uint32_t Instr = 0b0010'0101'0000'0000'0000'0000'0000'0000;\n    Instr |= opc << 20;\n    Instr |= op2 << 14;\n    Instr |= op3 << 4;\n    Instr |= pm.Idx() << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= pn.Idx() << 5;\n    Instr |= pd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEPredicateMisc(uint32_t op0, uint32_t op2, uint32_t op3, SubRegSize size, PRegister pd) {\n    // Note: op2 combines op1 like [op1:op2], since they're adjacent.\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n\n    uint32_t Instr = 0b0010'0101'0001'0000'1100'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= op0 << 16;\n    Instr |= op2 << 9;\n    Instr |= op3 << 5;\n    Instr |= pd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEIntCompareScalar(uint32_t op1, uint32_t b4, uint32_t op2, SubRegSize size, Register rn, Register rm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Can't use 128-bit size\");\n\n    uint32_t Instr = 0b0010'0101'0010'0000'0000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= rm.Idx() << 16;\n    Instr |= op1 << 10;\n    Instr |= rn.Idx() << 5;\n    Instr |= b4 << 4;\n    Instr |= op2;\n    dc32(Instr);\n  }\n\n  void SVEWriteFFR(uint32_t op0, uint32_t op1, uint32_t op2, uint32_t op3, uint32_t op4) {\n    uint32_t Instr = 0b0010'0101'0010'1000'1001'0000'0000'0000;\n    Instr |= op0 << 18;\n    Instr |= op1 << 16;\n    Instr |= op2 << 9;\n    Instr |= op3 << 5;\n    Instr |= op4;\n    dc32(Instr);\n  }\n\n  void SVEFPUnaryOpsUnpredicated(uint32_t opc, SubRegSize size, ZRegister zd, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"SubRegSize must be 16-bit, 32-bit, or 64-bit\");\n\n    uint32_t Instr = 0b0110'0101'0000'1000'0011'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEFPSerialReductionPredicated(uint32_t opc, SubRegSize size, VRegister vd, PRegister pg, VRegister vn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"SubRegSize must be 16-bit, 32-bit, or 64-bit\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n    LOGMAN_THROW_A_FMT(vd == vn, \"vn must be the same as vd\");\n\n    uint32_t Instr = 0b0110'0101'0001'1000'0010'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zm.Idx() << 5;\n    Instr |= vd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEFPCompareWithZero(uint32_t eqlt, uint32_t ne, SubRegSize size, PRegister pd, PRegister pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"SubRegSize must be 16-bit, 32-bit, or 64-bit\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0110'0101'0001'0000'0010'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= eqlt << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= ne << 4;\n    Instr |= pd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEFPMultiplyAdd(uint32_t opc, SubRegSize size, ZRegister zd, PRegister pg, ZRegister zn, ZRegister zm) {\n    // NOTE: opc also includes the op0 bit (bit 15) like op0:opc, since the fields are adjacent\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"SubRegSize must be 16-bit, 32-bit, or 64-bit\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0110'0101'0010'0000'0000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= opc << 13;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEFPMultiplyAddIndexed(uint32_t op, SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm, uint32_t index) {\n    LOGMAN_THROW_A_FMT(IsStandardFloatSize(size), \"SubRegSize must be 16-bit, 32-bit, or 64-bit\");\n    LOGMAN_THROW_A_FMT((size <= SubRegSize::i32Bit && zm <= ZReg::z7) || (size == SubRegSize::i64Bit && zm <= ZReg::z15),\n                       \"16-bit and 32-bit indexed variants may only use Zm between z0-z7\\n\"\n                       \"64-bit variants may only use Zm between z0-z15\");\n\n    const auto Underlying = FEXCore::ToUnderlying(size);\n    const uint32_t IndexMax = (16 / (1U << Underlying)) - 1;\n    LOGMAN_THROW_A_FMT(index <= IndexMax, \"Index must be within 0-{}\", IndexMax);\n\n    // Can be bit 20 or 19 depending on whether or not the element size is 64-bit.\n    const auto IndexShift = 19 + static_cast<uint32_t>(size == SubRegSize::i64Bit);\n\n    uint32_t Instr = 0b0110'0100'0010'0000'0000'0000'0000'0000;\n    Instr |= Underlying << 22;\n    Instr |= (index & 0b1000) << 19;\n    Instr |= (index & 0b0111) << IndexShift;\n    Instr |= zm.Idx() << 16;\n    Instr |= op << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zda.Idx();\n    dc32(Instr);\n  }\n\n  void SVEFPMultiplyAddLongIndexed(uint32_t o2, uint32_t op, uint32_t T, SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm,\n                                   uint32_t index) {\n    LOGMAN_THROW_A_FMT(dstsize == SubRegSize::i32Bit, \"Destination size must be 32-bit.\");\n    LOGMAN_THROW_A_FMT(index <= 7, \"Index ({}) must be within [0, 7]\", index);\n    LOGMAN_THROW_A_FMT(zm <= ZReg::z7, \"zm (z{}) must be within [z0, z7]\", zm.Idx());\n\n    uint32_t Inst = 0b0110'0100'1010'0000'0100'0000'0000'0000;\n    Inst |= o2 << 22;\n    Inst |= (index & 0b110) << 18;\n    Inst |= zm.Idx() << 16;\n    Inst |= op << 13;\n    Inst |= (index & 0b001) << 11;\n    Inst |= T << 10;\n    Inst |= zn.Idx() << 5;\n    Inst |= zda.Idx();\n    dc32(Inst);\n  }\n\n  void SVEFPMultiplyAddLong(uint32_t o2, uint32_t op, uint32_t T, SubRegSize dstsize, ZRegister zda, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(dstsize == SubRegSize::i32Bit, \"Destination size must be 32-bit.\");\n\n    uint32_t Instr = 0b0110'0100'1010'0000'1000'0000'0000'0000;\n    Instr |= o2 << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= op << 13;\n    Instr |= T << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zda.Idx();\n    dc32(Instr);\n  }\n\n  void SVEFPMatrixMultiplyAccumulate(SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"SubRegSize must be 32-bit or 64-bit\");\n\n    uint32_t Instr = 0b0110'0100'0010'0000'1110'0100'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= zn.Idx() << 5;\n    Instr |= zda.Idx();\n    dc32(Instr);\n  }\n\n  void SVEPredicateCount(uint32_t opc, SubRegSize size, XRegister rd, PRegister pg, PRegister pn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Cannot use 128-bit element size\");\n\n    uint32_t Instr = 0b0010'0101'0010'0000'1000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= opc << 16;\n    Instr |= pg.Idx() << 10;\n    Instr |= pn.Idx() << 5;\n    Instr |= rd.Idx();\n\n    dc32(Instr);\n  }\n\n  void SVEElementCount(uint32_t b20, uint32_t op1, SubRegSize size, ZRegister zdn, PredicatePattern pattern, uint32_t imm4) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Cannot use 128-bit element size\");\n    LOGMAN_THROW_A_FMT(imm4 >= 1 && imm4 <= 16, \"Immediate must be between 1-16 inclusive\");\n\n    uint32_t Instr = 0b0000'0100'0010'0000'1100'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= b20 << 20;\n    Instr |= (imm4 - 1) << 16;\n    Instr |= op1 << 10;\n    Instr |= FEXCore::ToUnderlying(pattern) << 5;\n    Instr |= zdn.Idx();\n    dc32(Instr);\n  }\n\n  void SVEIncDecPredicateCountScalar(uint32_t op0, uint32_t op1, uint32_t opc, uint32_t b16, SubRegSize size, Register rdn, PRegister pm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Cannot use 128-bit element size\");\n\n    uint32_t Instr = 0b0010'0101'0010'1000'1000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= op0 << 18;\n    Instr |= b16 << 16;\n    Instr |= op1 << 11;\n    Instr |= opc << 9;\n    Instr |= pm.Idx() << 5;\n    Instr |= rdn.Idx();\n    dc32(Instr);\n  }\n  void SVEIncDecPredicateCountVector(uint32_t op0, uint32_t op1, uint32_t opc, uint32_t b16, SubRegSize size, ZRegister zdn, PRegister pm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Cannot use 8-bit element size\");\n    SVEIncDecPredicateCountScalar(op0, op1, opc, b16, size, Register {zdn.Idx()}, pm);\n  }\n\n  void SVE2IntegerPredicated(uint32_t op0, uint32_t op1, SubRegSize size, ZRegister zd, PRegister pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Cannot use 128-bit size\");\n    LOGMAN_THROW_A_FMT(pg <= PReg::p7, \"Can only use p0-p7 as a governing predicate\");\n\n    uint32_t Instr = 0b0100'0100'0000'0000'0000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= op0 << 16; // Intentionally 16 instead of 17 to handle bit range nicer\n    Instr |= op1 << 13;\n    Instr |= pg.Idx() << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2IntegerPairwiseAddAccumulateLong(uint32_t U, SubRegSize size, ZRegister zda, PRegisterMerge pg, ZRegister zn) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i16Bit || size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"SubRegSize must be 16-bit, \"\n                                                                                                               \"32-bit, or 64-bit\");\n    SVE2IntegerPredicated((0b0010 << 1) | U, 0b101, size, zda, pg, zn);\n  }\n\n  void SVE2IntegerUnaryOpsPredicated(uint32_t op0, SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn) {\n    SVE2IntegerPredicated(op0, 0b101, size, zd, pg, zn);\n  }\n\n  void SVE2SaturatingRoundingBitwiseShiftLeft(uint32_t op0, SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(zd == zn, \"zn needs to equal zd\");\n    SVE2IntegerPredicated(op0, 0b100, size, zd, pg, zm);\n  }\n\n  void SVE2IntegerHalvingPredicated(uint32_t RSU, SubRegSize size, PRegister pg, ZRegister zd, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(zd == zn, \"zn needs to equal zd\");\n    SVE2IntegerPredicated((0b10 << 3) | RSU, 0b100, size, zd, pg, zm);\n  }\n\n  void SVEIntegerPairwiseArithmetic(uint32_t opc, uint32_t U, SubRegSize size, PRegister pg, ZRegister zd, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(zd == zn, \"zn needs to equal zd\");\n    SVE2IntegerPredicated((0b10 << 3) | (opc << 1) | U, 0b101, size, zd, pg, zm);\n  }\n\n  void SVE2IntegerSaturatingAddSub(uint32_t opc, SubRegSize size, ZRegister zd, PRegisterMerge pg, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(zd == zn, \"zn needs to equal zd\");\n    SVE2IntegerPredicated((0b11 << 3) | opc, 0b100, size, zd, pg, zm);\n  }\n\n  void SVEIntegerMultiplyAddUnpredicated(uint32_t op0, SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i128Bit, \"Cannot use 128-bit element size\");\n\n    uint32_t Instr = 0b0100'0100'0000'0000'0000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= op0 << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVEIntegerDotProduct(uint32_t op, SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm, Rotation rot) {\n    LOGMAN_THROW_A_FMT(size == SubRegSize::i32Bit || size == SubRegSize::i64Bit, \"Dot product must only use 32-bit or 64-bit element \"\n                                                                                 \"sizes\");\n    SVEIntegerComplexMulAdd(op, size, zda, zn, zm, rot);\n  }\n\n  void SVEIntegerComplexMulAdd(uint32_t op, SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm, Rotation rot) {\n    const auto op0 = op << 2 | FEXCore::ToUnderlying(rot);\n    SVEIntegerMultiplyAddUnpredicated(op0, size, zda, zn, zm);\n  }\n\n  void SVE2SaturatingMulAddInterleaved(uint32_t op0, SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit, \"Element size may only be 16-bit, 32-bit, or 64-bit\");\n    SVEIntegerMultiplyAddUnpredicated(op0, size, zda, zn, zm);\n  }\n\n  void SVE2IntegerMulAddLong(uint32_t op0, SubRegSize size, ZRegister zda, ZRegister zn, ZRegister zm) {\n    SVE2SaturatingMulAddInterleaved(op0, size, zda, zn, zm);\n  }\n\n  void SVE2WideningIntegerArithmetic(uint32_t op, uint32_t SUT, SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    uint32_t Instr = 0b0100'0101'0000'0000'0000'0000'0000'0000;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= zm.Idx() << 16;\n    Instr |= op << 13;\n    Instr |= SUT << 10;\n    Instr |= zn.Idx() << 5;\n    Instr |= zd.Idx();\n    dc32(Instr);\n  }\n\n  void SVE2IntegerAddSubLong(uint32_t op, uint32_t SUT, SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i128Bit, \"Can't use 8-bit or 128-bit element size\");\n    SVE2WideningIntegerArithmetic(op, SUT, size, zd, zn, zm);\n  }\n\n  void SVE2IntegerAddSubWide(uint32_t SUT, SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i128Bit, \"Can't use 8-bit or 128-bit element size\");\n    SVE2WideningIntegerArithmetic(0b10, SUT, size, zd, zn, zm);\n  }\n\n  void SVE2IntegerMultiplyLong(uint32_t SUT, SubRegSize size, ZRegister zd, ZRegister zn, ZRegister zm) {\n    // PMULLB and PMULLT support the use of 128-bit element sizes (with the SVE2PMULL128 extension)\n    if (SUT == 0b010 || SUT == 0b011) {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i32Bit, \"Can't use 8-bit or 32-bit element size\");\n\n      // 128-bit variant is encoded as if it were 8-bit (0b00)\n      if (size == SubRegSize::i128Bit) {\n        size = SubRegSize::i8Bit;\n      }\n    } else {\n      LOGMAN_THROW_A_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i128Bit, \"Can't use 8-bit or 128-bit element size\");\n    }\n\n    SVE2WideningIntegerArithmetic(0b11, SUT, size, zd, zn, zm);\n  }\n\n  struct SVEEncodedImmShift {\n    uint32_t tszh;\n    uint32_t tszl_imm3;\n  };\n  // Helper for encoding shift immediates that make use of the tszh:tszl and imm3 field.\n  static constexpr SVEEncodedImmShift EncodeSVEShiftImmediate(SubRegSize size, uint32_t shift, bool is_left_shift = false) {\n    const uint32_t element_size = SubRegSizeInBits(size);\n\n    if (is_left_shift) {\n      LOGMAN_THROW_A_FMT(shift < element_size, \"Invalid left shift value ({}). Must be within [0, {}]\", shift, element_size - 1);\n    } else {\n      LOGMAN_THROW_A_FMT(shift > 0 && shift <= element_size, \"Invalid right shift value ({}). Must be within [1, {}]\", shift, element_size);\n    }\n\n    // Both left and right shifts encodes their shift as if it were\n    // expanding the tszh:tszl (tsize) bits to the the left in order to accomodate\n    // larger shift values. e.g. (B: tsize=0b0001, H: tsize=0b001x, etc)\n    //\n    // The difference is in how they're encoded. Left shifts are trivial and\n    // encode as element_size_in_bits + shift, which works nicely since\n    // the size will just occupy the next bit in tsize leaving the previous\n    // one for encoding larger shifts.\n    //\n    // Right shifts instead encode it like a subtraction. e.g. A shift of 1\n    // would encode like (S: tsize=0b0111 imm3=0b111, where 64 - 1 = 63, etc).\n    // so the more lower in value the bits are set, the larger the shift.\n    const uint32_t encoded_shift = is_left_shift ? element_size + shift : (2 * element_size) - shift;\n\n    return {\n      .tszh = encoded_shift >> 5,\n      .tszl_imm3 = encoded_shift & 0b11111,\n    };\n  }\n\n  // Alias that returns the equivalently sized unsigned type for a floating-point type T.\n  template<typename T>\n  requires (std::is_same_v<T, float> || std::is_same_v<T, double>)\n  using FloatToEquivalentUInt = std::conditional_t<std::is_same_v<T, float>, uint32_t, uint64_t>;\n\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  // Determines if a floating-point value is capable of being converted\n  // into an 8-bit immediate. See pseudocode definition of VFPExpandImm\n  // in ARM A-profile reference manual for a general overview of how this was derived.\n  template<typename T>\n  requires (std::is_same_v<T, float> || std::is_same_v<T, double>)\n  [[nodiscard]]\n  static bool IsValidFPValueForImm8(T value) {\n    const uint64_t bits = std::bit_cast<FloatToEquivalentUInt<T>>(value);\n    const uint64_t datasize_idx = FEXCore::ilog2(sizeof(T)) - 1;\n\n    static constexpr std::array mantissa_masks {\n      0x00000000'0000003FULL, // half (bits [5:0])\n      0x00000000'0007FFFFULL, // single (bits [18:0])\n      0x0000FFFF'FFFFFFFFULL, // double (bits [47:0])\n    };\n    const auto mantissa_mask = mantissa_masks[datasize_idx];\n\n    // Relevant mantissa bits must be set to zero\n    if ((bits & mantissa_mask) != 0) {\n      return false;\n    }\n\n    static constexpr std::array exponent_masks {\n      0x00000000'00003000ULL, // half (bits [13:12])\n      0x00000000'3E000000ULL, // single (bits [29:25])\n      0x3FC00000'00000000ULL, // double (bits [61:54])\n    };\n    const auto exponent_mask = exponent_masks[datasize_idx];\n    const auto masked_exponent = bits & exponent_mask;\n\n    // Relevant exponent bits must either be all set or all cleared.\n    if (masked_exponent != 0 && masked_exponent != exponent_mask) {\n      return false;\n    }\n\n    // The two bits before the sign bit must be inverses of each other.\n    const auto datasize = 8ULL * sizeof(T);\n    const auto inverse = bits ^ (bits << 1);\n    const auto inverse_mask = 1ULL << (datasize - 2);\n    if ((inverse & inverse_mask) == 0) {\n      return false;\n    }\n\n    return true;\n  }\n#endif\n\nprotected:\n  static uint32_t FP32ToImm8(float value) {\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    LOGMAN_THROW_A_FMT(IsValidFPValueForImm8(value), \"Value ({}) cannot be encoded into an 8-bit immediate\", value);\n#endif\n\n    const auto bits = std::bit_cast<uint32_t>(value);\n    const auto sign = (bits & 0x80000000) >> 24;\n    const auto expb2 = (bits & 0x20000000) >> 23;\n    const auto b5_to_0 = (bits >> 19) & 0x3F;\n\n    return sign | expb2 | b5_to_0;\n  }\n\n  static uint32_t FP64ToImm8(double value) {\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    LOGMAN_THROW_A_FMT(IsValidFPValueForImm8(value), \"Value ({}) cannot be encoded into an 8-bit immediate\", value);\n#endif\n\n    const auto bits = std::bit_cast<uint64_t>(value);\n    const auto sign = (bits & 0x80000000'00000000) >> 56;\n    const auto expb2 = (bits & 0x20000000'00000000) >> 55;\n    const auto b5_to_0 = (bits >> 48) & 0x3F;\n\n    return static_cast<uint32_t>(sign | expb2 | b5_to_0);\n  }\n\nprivate:\n  // Handling for signed 8-bit immediate shifts (e.g. in cpy/dup)\n  struct HandledSImm8Shift {\n    int32_t imm;\n    uint32_t is_shift;\n  };\n  static constexpr HandledSImm8Shift HandleSVESImm8Shift(SubRegSize size, int32_t imm) {\n    const int32_t imm8_limit = 128;\n    const bool is_int8_imm = -imm8_limit <= imm && imm < imm8_limit;\n    if (size == SubRegSize::i8Bit) {\n      LOGMAN_THROW_A_FMT(is_int8_imm, \"Can't perform LSL #8 shift on 8-bit elements.\");\n    }\n\n    uint32_t shift = 0;\n    if (!is_int8_imm) {\n      const int32_t imm16_limit = 32768;\n      const bool is_int16_imm = -imm16_limit <= imm && imm < imm16_limit;\n\n      LOGMAN_THROW_A_FMT(is_int16_imm, \"Immediate ({}) must be a 16-bit value within [-32768, 32512]\", imm);\n      LOGMAN_THROW_A_FMT((imm % 256) == 0, \"Immediate ({}) must be a multiple of 256\", imm);\n\n      imm /= 256;\n      shift = 1;\n    }\n\n    return {\n      .imm = imm,\n      .is_shift = shift,\n    };\n  }\n\n#ifndef INCLUDED_BY_EMITTER\n}; // struct LoadstoreEmitterOps\n} // namespace ARMEmitter\n#endif\n"
  },
  {
    "path": "CodeEmitter/CodeEmitter/ScalarOps.inl",
    "content": "// SPDX-License-Identifier: MIT\n/* Scalar instruction emitters.\n *\n * These contain instruction emitters for scalar ASIMD operations explicitly.\n * Some of these emitter arguments might seem a bit strange at first glance,\n * but is because ARM's instruction encodings for these instructions are a hot mess.\n *\n * Specifically FP16 was an afterthought for these scalar operations, using a `ScalarRegSize` with\n * 16-bit wouldn't encode an FP16 instruction because they are a different instruction class instead.\n *\n * Most FP16 operations instead have their own freestanding implementation using `HRegister` arguments.\n *\n * Meanwhile other FP32 and FP64 instructions will use `ScalarRegSize`, supporting both those sizes.\n *\n * For Scalar integer operations, these instructions will mostly support all `ScalarRegSize` operations.\n * Exceptions to this rule will have asserts in the emitter implementation when misused.\n *\n */\n\n#pragma once\n#ifndef INCLUDED_BY_EMITTER\n#include <CodeEmitter/Emitter.h>\nnamespace ARMEmitter {\nstruct EmitterOps : Emitter {\n#endif\n\npublic:\n  // Advanced SIMD scalar copy\n  void dup(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Index) {\n    const uint32_t SizeImm = FEXCore::ToUnderlying(size);\n    const uint32_t IndexShift = SizeImm + 1;\n    const uint32_t ElementSize = 1U << SizeImm;\n    const uint32_t MaxIndex = 128U / (ElementSize * 8);\n\n    LOGMAN_THROW_A_FMT(Index < MaxIndex, \"Index too large. Index={}, Max Index: {}\", Index, MaxIndex);\n\n    const uint32_t imm5 = (Index << IndexShift) | ElementSize;\n\n    ASIMDScalarCopy(1, 1, imm5, 0b0000, rd, rn);\n  }\n\n  void mov(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Index) {\n    dup(size, rd, rn, Index);\n  }\n\n  // Advanced SIMD scalar three same FP16\n  void fmulx(HRegister rd, HRegister rn, HRegister rm) {\n    ASIMDScalarThreeSameFP16(0, 0, 0b011, rm, rn, rd);\n  }\n  void fcmeq(HRegister rd, HRegister rn, HRegister rm) {\n    ASIMDScalarThreeSameFP16(0, 0, 0b100, rm, rn, rd);\n  }\n  void frecps(HRegister rd, HRegister rn, HRegister rm) {\n    ASIMDScalarThreeSameFP16(0, 0, 0b111, rm, rn, rd);\n  }\n  void frsqrts(HRegister rd, HRegister rn, HRegister rm) {\n    ASIMDScalarThreeSameFP16(0, 1, 0b111, rm, rn, rd);\n  }\n  void fcmge(HRegister rd, HRegister rn, HRegister rm) {\n    ASIMDScalarThreeSameFP16(1, 0, 0b100, rm, rn, rd);\n  }\n  void facge(HRegister rd, HRegister rn, HRegister rm) {\n    ASIMDScalarThreeSameFP16(1, 0, 0b101, rm, rn, rd);\n  }\n  void fabd(HRegister rd, HRegister rn, HRegister rm) {\n    ASIMDScalarThreeSameFP16(1, 1, 0b010, rm, rn, rd);\n  }\n  void fcmgt(HRegister rd, HRegister rn, HRegister rm) {\n    ASIMDScalarThreeSameFP16(1, 1, 0b100, rm, rn, rd);\n  }\n  void facgt(HRegister rd, HRegister rn, HRegister rm) {\n    ASIMDScalarThreeSameFP16(1, 1, 0b101, rm, rn, rd);\n  }\n\n  // Advanced SIMD scalar two-register miscellaneous FP16\n  void fcvtns(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(0, 0, 0b11010, rn, rd);\n  }\n  void fcvtms(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(0, 0, 0b11011, rn, rd);\n  }\n  void fcvtas(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(0, 0, 0b11100, rn, rd);\n  }\n  void scvtf(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(0, 0, 0b11101, rn, rd);\n  }\n  void fcmgt(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(0, 1, 0b01100, rn, rd);\n  }\n  void fcmeq(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(0, 1, 0b01101, rn, rd);\n  }\n  void fcmlt(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(0, 1, 0b01110, rn, rd);\n  }\n  void fcvtps(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(0, 1, 0b11010, rn, rd);\n  }\n  void fcvtzs(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(0, 1, 0b11011, rn, rd);\n  }\n  void frecpe(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(0, 1, 0b11101, rn, rd);\n  }\n  void frecpx(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(0, 1, 0b11111, rn, rd);\n  }\n  void fcvtnu(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(1, 0, 0b11010, rn, rd);\n  }\n  void fcvtmu(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(1, 0, 0b11011, rn, rd);\n  }\n  void fcvtau(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(1, 0, 0b11100, rn, rd);\n  }\n  void ucvtf(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(1, 0, 0b11101, rn, rd);\n  }\n  void fcmge(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(1, 1, 0b01100, rn, rd);\n  }\n  void fcmle(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(1, 1, 0b01101, rn, rd);\n  }\n  void fcvtpu(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(1, 1, 0b11010, rn, rd);\n  }\n  void fcvtzu(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(1, 1, 0b11011, rn, rd);\n  }\n  void frsqrte(HRegister rd, HRegister rn) {\n    ASIMDScalarTwoRegMiscFP16(1, 1, 0b11101, rn, rd);\n  }\n\n  // Advanced SIMD scalar three same extra\n  void sqrdmlah(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i16Bit || size == ScalarRegSize::i32Bit, \"Only supports 16/32-bit\");\n    ASIMDScalarThreeSameExtra(1, size, 0b0000, rm, rn, rd);\n  }\n  void sqrdmlsh(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i16Bit || size == ScalarRegSize::i32Bit, \"Only supports 16/32-bit\");\n    ASIMDScalarThreeSameExtra(1, size, 0b0001, rm, rn, rd);\n  }\n\n  // Advanced SIMD scalar two-register miscellaneous\n  void suqadd(ScalarRegSize size, VRegister rd, VRegister rn) {\n    ASIMDScalar2RegMisc(0, 0, size, 0b00011, rd, rn);\n  }\n  void sqabs(ScalarRegSize size, VRegister rd, VRegister rn) {\n    ASIMDScalar2RegMisc(0, 0, size, 0b00111, rd, rn);\n  }\n\n  ///< Comparison against 0.0\n  void cmgt(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMDScalar2RegMisc(0, 0, size, 0b01000, rd, rn);\n  }\n  ///< Comparison against 0.0\n  void cmeq(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMDScalar2RegMisc(0, 0, size, 0b01001, rd, rn);\n  }\n\n  ///< Comparison against 0.0\n  void cmlt(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMDScalar2RegMisc(0, 0, size, 0b01010, rd, rn);\n  }\n  void abs(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMDScalar2RegMisc(0, 0, size, 0b01011, rd, rn);\n  }\n  ///< size is destination size.\n  void sqxtn(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size != ScalarRegSize::i64Bit, \"64-bit destination not supported\");\n    ASIMDScalar2RegMisc(0, 0, size, 0b10100, rd, rn);\n  }\n\n  void fcvtns(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMDScalar2RegMisc(0, 0, ConvertedSize, 0b11010, rd, rn);\n  }\n  void fcvtms(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMDScalar2RegMisc(0, 0, ConvertedSize, 0b11011, rd, rn);\n  }\n  void fcvtas(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMDScalar2RegMisc(0, 0, ConvertedSize, 0b11100, rd, rn);\n  }\n  void scvtf(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMDScalar2RegMisc(0, 0, ConvertedSize, 0b11101, rd, rn);\n  }\n\n  ///< Comparison against 0.0\n  void fcmgt(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float compare\");\n    ASIMDScalar2RegMisc(0, 0, size, 0b01100, rd, rn);\n  }\n  ///< Comparison against 0.0\n  void fcmeq(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float compare\");\n    ASIMDScalar2RegMisc(0, 0, size, 0b01101, rd, rn);\n  }\n  ///< Comparison against 0.0\n  void fcmlt(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float compare\");\n\n    ASIMDScalar2RegMisc(0, 0, size, 0b01110, rd, rn);\n  }\n  void fcvtps(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    ASIMDScalar2RegMisc(0, 0, size, 0b11010, rd, rn);\n  }\n  void fcvtzs(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    ASIMDScalar2RegMisc(0, 0, size, 0b11011, rd, rn);\n  }\n  void frecpe(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    ASIMDScalar2RegMisc(0, 0, size, 0b11101, rd, rn);\n  }\n  void frecpx(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    ASIMDScalar2RegMisc(0, 0, size, 0b11111, rd, rn);\n  }\n  void usqadd(ScalarRegSize size, VRegister rd, VRegister rn) {\n    ASIMDScalar2RegMisc(0, 1, size, 0b00011, rd, rn);\n  }\n  void sqneg(ScalarRegSize size, VRegister rd, VRegister rn) {\n    ASIMDScalar2RegMisc(0, 1, size, 0b00111, rd, rn);\n  }\n  ///< Comparison against 0.0\n  void cmge(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMDScalar2RegMisc(0, 1, size, 0b01000, rd, rn);\n  }\n  ///< Comparison against 0.0\n  void cmle(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMDScalar2RegMisc(0, 1, size, 0b01001, rd, rn);\n  }\n  void neg(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMDScalar2RegMisc(0, 1, size, 0b01011, rd, rn);\n  }\n  ///< size is destination.\n  void sqxtun(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size != ScalarRegSize::i64Bit, \"64-bit destination not supported\");\n    ASIMDScalar2RegMisc(0, 1, size, 0b10010, rd, rn);\n  }\n  ///< size is destination.\n  void uqxtn(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size != ScalarRegSize::i64Bit, \"64-bit destination not supported\");\n    ASIMDScalar2RegMisc(0, 1, size, 0b10100, rd, rn);\n  }\n  ///< size is destination.\n  void fcvtxn(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n    ASIMDScalar2RegMisc(0, 1, ScalarRegSize::i16Bit, 0b10110, rd, rn);\n  }\n  void fcvtnu(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMDScalar2RegMisc(0, 1, ConvertedSize, 0b11010, rd, rn);\n  }\n  void fcvtmu(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMDScalar2RegMisc(0, 1, ConvertedSize, 0b11011, rd, rn);\n  }\n  void fcvtau(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMDScalar2RegMisc(0, 1, ConvertedSize, 0b11100, rd, rn);\n  }\n  void ucvtf(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMDScalar2RegMisc(0, 1, ConvertedSize, 0b11101, rd, rn);\n  }\n  ///< Comparison against 0.0\n  void fcmge(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    ASIMDScalar2RegMisc(0, 1, size, 0b01100, rd, rn);\n  }\n  ///< Comparison against 0.0\n  void fcmle(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    ASIMDScalar2RegMisc(0, 1, size, 0b01101, rd, rn);\n  }\n  void fcvtpu(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    ASIMDScalar2RegMisc(0, 1, size, 0b11010, rd, rn);\n  }\n  void fcvtzu(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    ASIMDScalar2RegMisc(0, 1, size, 0b11011, rd, rn);\n  }\n  void frsqrte(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    ASIMDScalar2RegMisc(0, 1, size, 0b11101, rd, rn);\n  }\n  // Advanced SIMD scalar pairwise\n  void addp(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Invalid size selected for addp\");\n    ASIMDScalar2RegMisc(1, 0, size, 0b11011, rd, rn);\n  }\n\n  void fmaxnmp(HRegister rd, HRegister rn) {\n    ASIMDScalar2RegMisc(1, 0, ScalarRegSize::i8Bit, 0b01100, rd.V(), rn.V());\n  }\n  void faddp(HRegister rd, HRegister rn) {\n    ASIMDScalar2RegMisc(1, 0, ScalarRegSize::i8Bit, 0b01101, rd.V(), rn.V());\n  }\n  void fmaxp(HRegister rd, HRegister rn) {\n    ASIMDScalar2RegMisc(1, 0, ScalarRegSize::i8Bit, 0b01111, rd.V(), rn.V());\n  }\n  void fminnmp(HRegister rd, HRegister rn) {\n    ASIMDScalar2RegMisc(1, 0, ScalarRegSize::i32Bit, 0b01100, rd.V(), rn.V());\n  }\n  void fminp(HRegister rd, HRegister rn) {\n    ASIMDScalar2RegMisc(1, 0, ScalarRegSize::i32Bit, 0b01111, rd.V(), rn.V());\n  }\n\n  void fmaxnmp(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMDScalar2RegMisc(1, 1, ConvertedSize, 0b01100, rd, rn);\n  }\n  void faddp(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMDScalar2RegMisc(1, 1, ConvertedSize, 0b01101, rd, rn);\n  }\n  void fmaxp(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMDScalar2RegMisc(1, 1, ConvertedSize, 0b01111, rd, rn);\n  }\n  void fminnmp(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n    ASIMDScalar2RegMisc(1, 1, size, 0b01100, rd, rn);\n  }\n  void fminp(ScalarRegSize size, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n    ASIMDScalar2RegMisc(1, 1, size, 0b01111, rd, rn);\n  }\n  // Advanced SIMD scalar three different\n  ///< size is destination.\n  void sqdmlal(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i32Bit : ScalarRegSize::i16Bit;\n    ASIMD3RegDifferent(0, ConvertedSize, 0b1001, rd, rn, rm);\n  }\n  ///< size is destination.\n  void sqdmlsl(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i32Bit : ScalarRegSize::i16Bit;\n    ASIMD3RegDifferent(0, ConvertedSize, 0b1011, rd, rn, rm);\n  }\n\n  ///< size is destination.\n  void sqdmull(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i32Bit : ScalarRegSize::i16Bit;\n    ASIMD3RegDifferent(0, ConvertedSize, 0b1101, rd, rn, rm);\n  }\n  // Advanced SIMD scalar three same\n  void sqadd(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    ASIMD3RegSame(0, size, 0b00001, rd, rn, rm);\n  }\n  void sqsub(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    ASIMD3RegSame(0, size, 0b00101, rd, rn, rm);\n  }\n  void cmgt(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMD3RegSame(0, size, 0b00110, rd, rn, rm);\n  }\n  void cmge(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMD3RegSame(0, size, 0b00111, rd, rn, rm);\n  }\n  void sshl(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMD3RegSame(0, size, 0b01000, rd, rn, rm);\n  }\n  void sqshl(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    ASIMD3RegSame(0, size, 0b01001, rd, rn, rm);\n  }\n  void srshl(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMD3RegSame(0, size, 0b01010, rd, rn, rm);\n  }\n  void sqrshl(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    ASIMD3RegSame(0, size, 0b01011, rd, rn, rm);\n  }\n  void add(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMD3RegSame(0, size, 0b10000, rd, rn, rm);\n  }\n  void cmtst(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMD3RegSame(0, size, 0b10001, rd, rn, rm);\n  }\n  void sqdmulh(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i32Bit || size == ScalarRegSize::i16Bit, \"Invalid size\");\n    ASIMD3RegSame(0, size, 0b10110, rd, rn, rm);\n  }\n  void fmulx(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMD3RegSame(0, ConvertedSize, 0b11011, rd, rn, rm);\n  }\n  void fcmeq(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMD3RegSame(0, ConvertedSize, 0b11100, rd, rn, rm);\n  }\n  void frecps(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMD3RegSame(0, ConvertedSize, 0b11111, rd, rn, rm);\n  }\n  void frsqrts(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n    ASIMD3RegSame(0, size, 0b11111, rd, rn, rm);\n  }\n  void uqadd(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    ASIMD3RegSame(1, size, 0b00001, rd, rn, rm);\n  }\n  void uqsub(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    ASIMD3RegSame(1, size, 0b00101, rd, rn, rm);\n  }\n  void cmhi(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMD3RegSame(1, size, 0b00110, rd, rn, rm);\n  }\n  void cmhs(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMD3RegSame(1, size, 0b00111, rd, rn, rm);\n  }\n  void ushl(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMD3RegSame(1, size, 0b01000, rd, rn, rm);\n  }\n  void uqshl(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    ASIMD3RegSame(1, size, 0b01001, rd, rn, rm);\n  }\n  void urshl(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMD3RegSame(1, size, 0b01010, rd, rn, rm);\n  }\n  void uqrshl(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    ASIMD3RegSame(1, size, 0b01011, rd, rn, rm);\n  }\n  void sub(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMD3RegSame(1, size, 0b10000, rd, rn, rm);\n  }\n  void cmeq(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit, \"Only supports 64-bit\");\n    ASIMD3RegSame(1, size, 0b10001, rd, rn, rm);\n  }\n  void sqrdmulh(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i32Bit || size == ScalarRegSize::i16Bit, \"Invalid size\");\n    ASIMD3RegSame(1, size, 0b10110, rd, rn, rm);\n  }\n  void fcmge(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMD3RegSame(1, ConvertedSize, 0b11100, rd, rn, rm);\n  }\n  void facge(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n\n    const ScalarRegSize ConvertedSize = size == ScalarRegSize::i64Bit ? ScalarRegSize::i16Bit : ScalarRegSize::i8Bit;\n\n    ASIMD3RegSame(1, ConvertedSize, 0b11101, rd, rn, rm);\n  }\n  void fabd(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n    ASIMD3RegSame(1, size, 0b11010, rd, rn, rm);\n  }\n  void fcmgt(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n    ASIMD3RegSame(1, size, 0b11100, rd, rn, rm);\n  }\n  void facgt(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit, \"Invalid size selected for float convert\");\n    ASIMD3RegSame(1, size, 0b11101, rd, rn, rm);\n  }\n  // Advanced SIMD scalar shift by immediate\n  void sshr(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < 64, \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sshr\");\n    const size_t SubregSizeInBits = ScalarRegSizeInBits(size);\n    // Shift encoded in immh:immb, but inverted with 128-bit source\n    // shift = (esize * 2) - immh:immb\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n    ASIMDScalarShiftByImm(0, immh, immb, 0b00000, rd, rn);\n  }\n  void ssra(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < 64, \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sshr\");\n    const size_t SubregSizeInBits = ScalarRegSizeInBits(size);\n    // Shift encoded in immh:immb, but inverted with 128-bit source\n    // shift = (esize * 2) - immh:immb\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n    ASIMDScalarShiftByImm(0, immh, immb, 0b00010, rd, rn);\n  }\n  void srshr(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < 64, \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sshr\");\n    const size_t SubregSizeInBits = ScalarRegSizeInBits(size);\n    // Shift encoded in immh:immb, but inverted with 128-bit source\n    // shift = (esize * 2) - immh:immb\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n    ASIMDScalarShiftByImm(0, immh, immb, 0b00100, rd, rn);\n  }\n  void srsra(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < 64, \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sshr\");\n    const size_t SubregSizeInBits = ScalarRegSizeInBits(size);\n    // Shift encoded in immh:immb, but inverted with 128-bit source\n    // shift = (esize * 2) - immh:immb\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n    ASIMDScalarShiftByImm(0, immh, immb, 0b00110, rd, rn);\n  }\n  void shl(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < 64, \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sshr\");\n    // Shift encoded a bit weirdly.\n    // shift = immh:immb - elementsize but immh is /also/ used for element size.\n    const uint32_t immh = 1 << FEXCore::ToUnderlying(size) | (Shift >> 3);\n    const uint32_t immb = Shift & 0b111;\n    ASIMDScalarShiftByImm(0, immh, immb, 0b01010, rd, rn);\n  }\n  void sqshl(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < ScalarRegSizeInBits(size), \"Invalid shift for sshr\");\n    // Shift encoded a bit weirdly.\n    // shift = immh:immb - elementsize but immh is /also/ used for element size.\n    const uint32_t immh = 1 << FEXCore::ToUnderlying(size) | (Shift >> 3);\n    const uint32_t immb = Shift & 0b111;\n    ASIMDScalarShiftByImm(0, immh, immb, 0b01110, rd, rn);\n  }\n  ///< size is destination\n  void sqshrn(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < ScalarRegSizeInBits(size), \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size != ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sqshrn\");\n    const size_t SubregSizeInBits = ScalarRegSizeInBits(size);\n    // Shift encoded in immh:immb, but inverted with 128-bit source\n    // shift = (esize * 2) - immh:immb\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n    ASIMDScalarShiftByImm(0, immh, immb, 0b10010, rd, rn);\n  }\n  void sqrshrn(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < ScalarRegSizeInBits(size), \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size != ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sqshrn\");\n    const size_t SubregSizeInBits = ScalarRegSizeInBits(size);\n    // Shift encoded in immh:immb, but inverted with 128-bit source\n    // shift = (esize * 2) - immh:immb\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n    ASIMDScalarShiftByImm(0, immh, immb, 0b10011, rd, rn);\n  }\n  // TODO: SCVTF, FCVTZS\n  void ushr(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < 64, \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sshr\");\n    const size_t SubregSizeInBits = ScalarRegSizeInBits(size);\n    // Shift encoded in immh:immb, but inverted with 128-bit source\n    // shift = (esize * 2) - immh:immb\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n    ASIMDScalarShiftByImm(1, immh, immb, 0b00000, rd, rn);\n  }\n  void usra(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < 64, \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sshr\");\n    const size_t SubregSizeInBits = ScalarRegSizeInBits(size);\n    // Shift encoded in immh:immb, but inverted with 128-bit source\n    // shift = (esize * 2) - immh:immb\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n    ASIMDScalarShiftByImm(1, immh, immb, 0b00010, rd, rn);\n  }\n  void urshr(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < 64, \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sshr\");\n    const size_t SubregSizeInBits = ScalarRegSizeInBits(size);\n    // Shift encoded in immh:immb, but inverted with 128-bit source\n    // shift = (esize * 2) - immh:immb\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n    ASIMDScalarShiftByImm(1, immh, immb, 0b00100, rd, rn);\n  }\n  void ursra(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < 64, \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sshr\");\n    const size_t SubregSizeInBits = ScalarRegSizeInBits(size);\n    // Shift encoded in immh:immb, but inverted with 128-bit source\n    // shift = (esize * 2) - immh:immb\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n    ASIMDScalarShiftByImm(1, immh, immb, 0b00110, rd, rn);\n  }\n  void sri(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < 64, \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sshr\");\n    const size_t SubregSizeInBits = ScalarRegSizeInBits(size);\n    // Shift encoded in immh:immb, but inverted with 128-bit source\n    // shift = (esize * 2) - immh:immb\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n    ASIMDScalarShiftByImm(1, immh, immb, 0b01000, rd, rn);\n  }\n  void sli(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < 64, \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size == ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sshr\");\n    // Shift encoded a bit weirdly.\n    // shift = immh:immb - elementsize but immh is /also/ used for element size.\n    const uint32_t immh = 1 << FEXCore::ToUnderlying(size) | (Shift >> 3);\n    const uint32_t immb = Shift & 0b111;\n    ASIMDScalarShiftByImm(1, immh, immb, 0b01010, rd, rn);\n  }\n  void sqshlu(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < ScalarRegSizeInBits(size), \"Invalid shift for sshr\");\n    // Shift encoded a bit weirdly.\n    // shift = immh:immb - elementsize but immh is /also/ used for element size.\n    const uint32_t immh = 1 << FEXCore::ToUnderlying(size) | (Shift >> 3);\n    const uint32_t immb = Shift & 0b111;\n    ASIMDScalarShiftByImm(1, immh, immb, 0b01100, rd, rn);\n  }\n  void uqshl(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < ScalarRegSizeInBits(size), \"Invalid shift for sshr\");\n    // Shift encoded a bit weirdly.\n    // shift = immh:immb - elementsize but immh is /also/ used for element size.\n    const uint32_t immh = 1 << FEXCore::ToUnderlying(size) | (Shift >> 3);\n    const uint32_t immb = Shift & 0b111;\n    ASIMDScalarShiftByImm(1, immh, immb, 0b01110, rd, rn);\n  }\n  ///< size is destination.\n  void sqshrun(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < ScalarRegSizeInBits(size), \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size != ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sqshrun\");\n    const size_t SubregSizeInBits = ScalarRegSizeInBits(size);\n    // Shift encoded in immh:immb, but inverted with 128-bit source\n    // shift = (esize * 2) - immh:immb\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n    ASIMDScalarShiftByImm(1, immh, immb, 0b10000, rd, rn);\n  }\n  ///< size is destination.\n  void sqrshrun(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < ScalarRegSizeInBits(size), \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size != ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sqrshrun\");\n    const size_t SubregSizeInBits = ScalarRegSizeInBits(size);\n    // Shift encoded in immh:immb, but inverted with 128-bit source\n    // shift = (esize * 2) - immh:immb\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n    ASIMDScalarShiftByImm(1, immh, immb, 0b10001, rd, rn);\n  }\n  ///< size is destination.\n  void uqshrn(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < ScalarRegSizeInBits(size), \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size != ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sqrshrun\");\n    const size_t SubregSizeInBits = ScalarRegSizeInBits(size);\n    // Shift encoded in immh:immb, but inverted with 128-bit source\n    // shift = (esize * 2) - immh:immb\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n    ASIMDScalarShiftByImm(1, immh, immb, 0b10010, rd, rn);\n  }\n  ///< size is destination.\n  void uqrshrn(ScalarRegSize size, VRegister rd, VRegister rn, uint32_t Shift) {\n    LOGMAN_THROW_A_FMT(Shift > 0 && Shift < ScalarRegSizeInBits(size), \"Invalid shift for sshr\");\n    LOGMAN_THROW_A_FMT(size != ARMEmitter::ScalarRegSize::i64Bit, \"Invalid size selected for sqrshrun\");\n    const size_t SubregSizeInBits = ScalarRegSizeInBits(size);\n    // Shift encoded in immh:immb, but inverted with 128-bit source\n    // shift = (esize * 2) - immh:immb\n    const uint32_t InvertedShift = (SubregSizeInBits * 2) - Shift;\n    const uint32_t immh = InvertedShift >> 3;\n    const uint32_t immb = InvertedShift & 0b111;\n    ASIMDScalarShiftByImm(1, immh, immb, 0b10011, rd, rn);\n  }\n\n  // TODO: UCVTF, FCVTZU\n\n  // Advanced SIMD scalar x indexed element\n  void sqdmlal(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm, uint32_t index) {\n    LOGMAN_THROW_A_FMT(size != ScalarRegSize::i64Bit, \"Scalar size must not be 64-bit\");\n    ASIMDScalarXIndexedElement(0, size, 0b0011, rm, rn, rd, index);\n  }\n  void sqdmlsl(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm, uint32_t index) {\n    LOGMAN_THROW_A_FMT(size != ScalarRegSize::i64Bit, \"Scalar size must not be 64-bit\");\n    ASIMDScalarXIndexedElement(0, size, 0b0111, rm, rn, rd, index);\n  }\n  void sqdmull(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm, uint32_t index) {\n    LOGMAN_THROW_A_FMT(size != ScalarRegSize::i64Bit, \"Scalar size must not be 64-bit\");\n    ASIMDScalarXIndexedElement(0, size, 0b1011, rm, rn, rd, index);\n  }\n  void sqdmulh(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm, uint32_t index) {\n    LOGMAN_THROW_A_FMT(size != ScalarRegSize::i64Bit, \"Scalar size must not be 64-bit\");\n    ASIMDScalarXIndexedElement(0, size, 0b1100, rm, rn, rd, index);\n  }\n  void sqrdmulh(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm, uint32_t index) {\n    LOGMAN_THROW_A_FMT(size != ScalarRegSize::i64Bit, \"Scalar size must not be 64-bit\");\n    ASIMDScalarXIndexedElement(0, size, 0b1101, rm, rn, rd, index);\n  }\n  void fmla(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm, uint32_t index) {\n    ASIMDScalarXIndexedElement(0, size, 0b0001, rm, rn, rd, index);\n  }\n  void fmls(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm, uint32_t index) {\n    ASIMDScalarXIndexedElement(0, size, 0b0101, rm, rn, rd, index);\n  }\n  void fmul(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm, uint32_t index) {\n    ASIMDScalarXIndexedElement(0, size, 0b1001, rm, rn, rd, index);\n  }\n  void sqrdmlah(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm, uint32_t index) {\n    LOGMAN_THROW_A_FMT(size != ScalarRegSize::i64Bit, \"Scalar size must not be 64-bit\");\n    ASIMDScalarXIndexedElement(1, size, 0b1101, rm, rn, rd, index);\n  }\n  void sqrdmlsh(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm, uint32_t index) {\n    LOGMAN_THROW_A_FMT(size != ScalarRegSize::i64Bit, \"Scalar size must not be 64-bit\");\n    ASIMDScalarXIndexedElement(1, size, 0b1111, rm, rn, rd, index);\n  }\n  void fmulx(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm, uint32_t index) {\n    ASIMDScalarXIndexedElement(1, size, 0b1001, rm, rn, rd, index);\n  }\n\n  // Floating-point data-processing (1 source)\n  void fmov(ScalarRegSize size, VRegister rd, VRegister rn) {\n    Float1Source(size, 0, 0, 0b000000, rd, rn);\n  }\n  void fabs(ScalarRegSize size, VRegister rd, VRegister rn) {\n    Float1Source(size, 0, 0, 0b000001, rd, rn);\n  }\n  void fneg(ScalarRegSize size, VRegister rd, VRegister rn) {\n    Float1Source(size, 0, 0, 0b000010, rd, rn);\n  }\n  void fsqrt(ScalarRegSize size, VRegister rd, VRegister rn) {\n    Float1Source(size, 0, 0, 0b000011, rd, rn);\n  }\n  void frintn(ScalarRegSize size, VRegister rd, VRegister rn) {\n    Float1Source(size, 0, 0, 0b001000, rd, rn);\n  }\n  void frintp(ScalarRegSize size, VRegister rd, VRegister rn) {\n    Float1Source(size, 0, 0, 0b001001, rd, rn);\n  }\n  void frintm(ScalarRegSize size, VRegister rd, VRegister rn) {\n    Float1Source(size, 0, 0, 0b001010, rd, rn);\n  }\n  void frintz(ScalarRegSize size, VRegister rd, VRegister rn) {\n    Float1Source(size, 0, 0, 0b001011, rd, rn);\n  }\n  void frinta(ScalarRegSize size, VRegister rd, VRegister rn) {\n    Float1Source(size, 0, 0, 0b001100, rd, rn);\n  }\n  void frintx(ScalarRegSize size, VRegister rd, VRegister rn) {\n    Float1Source(size, 0, 0, 0b001110, rd, rn);\n  }\n  void frinti(ScalarRegSize size, VRegister rd, VRegister rn) {\n    Float1Source(size, 0, 0, 0b001111, rd, rn);\n  }\n  void frint32z(ScalarRegSize size, VRegister rd, VRegister rn) {\n    Float1Source(size, 0, 0, 0b010000, rd, rn);\n  }\n  void frint32x(ScalarRegSize size, VRegister rd, VRegister rn) {\n    Float1Source(size, 0, 0, 0b010001, rd, rn);\n  }\n  void frint64z(ScalarRegSize size, VRegister rd, VRegister rn) {\n    Float1Source(size, 0, 0, 0b010010, rd, rn);\n  }\n  void frint64x(ScalarRegSize size, VRegister rd, VRegister rn) {\n    Float1Source(size, 0, 0, 0b010011, rd, rn);\n  }\n\n  void fmov(SRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b000000, rd.V(), rn.V());\n  }\n  void fabs(SRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b000001, rd.V(), rn.V());\n  }\n  void fneg(SRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b000010, rd.V(), rn.V());\n  }\n  void fsqrt(SRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b000011, rd.V(), rn.V());\n  }\n  void fcvt(DRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b000101, rd.V(), rn.V());\n  }\n  void fcvt(HRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b000111, rd.V(), rn.V());\n  }\n  void frintn(SRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b001000, rd.V(), rn.V());\n  }\n  void frintp(SRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b001001, rd.V(), rn.V());\n  }\n  void frintm(SRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b001010, rd.V(), rn.V());\n  }\n  void frintz(SRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b001011, rd.V(), rn.V());\n  }\n  void frinta(SRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b001100, rd.V(), rn.V());\n  }\n  void frintx(SRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b001110, rd.V(), rn.V());\n  }\n  void frinti(SRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b001111, rd.V(), rn.V());\n  }\n  void frint32z(SRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b010000, rd.V(), rn.V());\n  }\n  void frint32x(SRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b010001, rd.V(), rn.V());\n  }\n  void frint64z(SRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b010010, rd.V(), rn.V());\n  }\n  void frint64x(SRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b00, 0b010011, rd.V(), rn.V());\n  }\n\n  void fmov(DRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b000000, rd.V(), rn.V());\n  }\n  void fabs(DRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b000001, rd.V(), rn.V());\n  }\n  void fneg(DRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b000010, rd.V(), rn.V());\n  }\n  void fsqrt(DRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b000011, rd.V(), rn.V());\n  }\n  void fcvt(SRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b000100, rd.V(), rn.V());\n  }\n  void bfcvt(HRegister rd, SRegister rn) {\n    Float1Source(0, 0, 0b01, 0b000110, rd.V(), rn.V());\n  }\n  void fcvt(HRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b000111, rd.V(), rn.V());\n  }\n  void frintn(DRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b001000, rd.V(), rn.V());\n  }\n  void frintp(DRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b001001, rd.V(), rn.V());\n  }\n  void frintm(DRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b001010, rd.V(), rn.V());\n  }\n  void frintz(DRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b001011, rd.V(), rn.V());\n  }\n  void frinta(DRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b001100, rd.V(), rn.V());\n  }\n  void frintx(DRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b001110, rd.V(), rn.V());\n  }\n  void frinti(DRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b001111, rd.V(), rn.V());\n  }\n  void frint32z(DRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b010000, rd.V(), rn.V());\n  }\n  void frint32x(DRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b010001, rd.V(), rn.V());\n  }\n  void frint64z(DRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b010010, rd.V(), rn.V());\n  }\n  void frint64x(DRegister rd, DRegister rn) {\n    Float1Source(0, 0, 0b01, 0b010011, rd.V(), rn.V());\n  }\n\n  void fmov(HRegister rd, HRegister rn) {\n    Float1Source(0, 0, 0b11, 0b000000, rd.V(), rn.V());\n  }\n  void fabs(HRegister rd, HRegister rn) {\n    Float1Source(0, 0, 0b11, 0b000001, rd.V(), rn.V());\n  }\n  void fneg(HRegister rd, HRegister rn) {\n    Float1Source(0, 0, 0b11, 0b000010, rd.V(), rn.V());\n  }\n  void fsqrt(HRegister rd, HRegister rn) {\n    Float1Source(0, 0, 0b11, 0b000011, rd.V(), rn.V());\n  }\n  void fcvt(SRegister rd, HRegister rn) {\n    Float1Source(0, 0, 0b11, 0b000100, rd.V(), rn.V());\n  }\n  void fcvt(DRegister rd, HRegister rn) {\n    Float1Source(0, 0, 0b11, 0b000101, rd.V(), rn.V());\n  }\n  void frintn(HRegister rd, HRegister rn) {\n    Float1Source(0, 0, 0b11, 0b001000, rd.V(), rn.V());\n  }\n  void frintp(HRegister rd, HRegister rn) {\n    Float1Source(0, 0, 0b11, 0b001001, rd.V(), rn.V());\n  }\n  void frintm(HRegister rd, HRegister rn) {\n    Float1Source(0, 0, 0b11, 0b001010, rd.V(), rn.V());\n  }\n  void frintz(HRegister rd, HRegister rn) {\n    Float1Source(0, 0, 0b11, 0b001011, rd.V(), rn.V());\n  }\n  void frinta(HRegister rd, HRegister rn) {\n    Float1Source(0, 0, 0b11, 0b001100, rd.V(), rn.V());\n  }\n  void frintx(HRegister rd, HRegister rn) {\n    Float1Source(0, 0, 0b11, 0b001110, rd.V(), rn.V());\n  }\n  void frinti(HRegister rd, HRegister rn) {\n    Float1Source(0, 0, 0b11, 0b001111, rd.V(), rn.V());\n  }\n\n  // Floating-point compare\n  void fcmp(ScalarRegSize Size, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(Size != ScalarRegSize::i8Bit, \"8-bit destination not supported\");\n\n    const auto ConvertedSize = Size == ARMEmitter::ScalarRegSize::i64Bit ? 0b01 :\n                               Size == ARMEmitter::ScalarRegSize::i32Bit ? 0b00 :\n                               Size == ARMEmitter::ScalarRegSize::i16Bit ? 0b11 :\n                                                                           0;\n\n    FloatCompare(0, 0, ConvertedSize, 0b00, 0b00000, rn, rm);\n  }\n\n  void fcmp(SRegister rn, SRegister rm) {\n    FloatCompare(0, 0, 0b00, 0b00, 0b00000, rn.V(), rm.V());\n  }\n  ///< Compare to #0.0\n  void fcmp(SRegister rn) {\n    FloatCompare(0, 0, 0b00, 0b00, 0b01000, rn.V(), VReg::v0);\n  }\n  void fcmpe(SRegister rn, SRegister rm) {\n    FloatCompare(0, 0, 0b00, 0b00, 0b10000, rn.V(), rm.V());\n  }\n\n  ///< Compare to #0.0\n  void fcmpe(SRegister rn) {\n    FloatCompare(0, 0, 0b00, 0b00, 0b11000, rn.V(), VReg::v0);\n  }\n  void fcmp(DRegister rn, DRegister rm) {\n    FloatCompare(0, 0, 0b01, 0b00, 0b00000, rn.V(), rm.V());\n  }\n\n  ///< Compare to #0.0\n  void fcmp(DRegister rn) {\n    FloatCompare(0, 0, 0b01, 0b00, 0b01000, rn.V(), VReg::v0);\n  }\n  void fcmpe(DRegister rn, DRegister rm) {\n    FloatCompare(0, 0, 0b01, 0b00, 0b10000, rn.V(), rm.V());\n  }\n\n  ///< Compare to #0.0\n  void fcmpe(DRegister rn) {\n    FloatCompare(0, 0, 0b01, 0b00, 0b11000, rn.V(), VReg::v0);\n  }\n  void fcmp(HRegister rn, HRegister rm) {\n    FloatCompare(0, 0, 0b11, 0b00, 0b00000, rn.V(), rm.V());\n  }\n\n  ///< Compare to #0.0\n  void fcmp(HRegister rn) {\n    FloatCompare(0, 0, 0b11, 0b00, 0b01000, rn.V(), VReg::v0);\n  }\n  void fcmpe(HRegister rn, HRegister rm) {\n    FloatCompare(0, 0, 0b11, 0b00, 0b10000, rn.V(), rm.V());\n  }\n\n  ///< Compare to #0.0\n  void fcmpe(HRegister rn) {\n    FloatCompare(0, 0, 0b11, 0b00, 0b11000, rn.V(), VReg::v0);\n  }\n\n  // Floating-point immediate\n  void fmov(ARMEmitter::ScalarRegSize size, ARMEmitter::VRegister rd, float Value) {\n    uint32_t M = 0;\n    uint32_t S = 0;\n    uint32_t ptype;\n    uint32_t imm8;\n    uint32_t imm5 = 0b0'0000;\n    if (size == ARMEmitter::ScalarRegSize::i16Bit) {\n      LOGMAN_MSG_A_FMT(\"Unsupported\");\n      FEX_UNREACHABLE;\n    } else if (size == ARMEmitter::ScalarRegSize::i32Bit) {\n      ptype = 0b00;\n      imm8 = FP32ToImm8(Value);\n    } else if (size == ARMEmitter::ScalarRegSize::i64Bit) {\n      ptype = 0b01;\n      imm8 = FP64ToImm8(Value);\n    } else {\n      FEX_UNREACHABLE;\n    }\n\n    FloatScalarImmediate(M, S, ptype, imm8, imm5, rd);\n  }\n\n  void FloatScalarImmediate(uint32_t M, uint32_t S, uint32_t ptype, uint32_t imm8, uint32_t imm5, ARMEmitter::VRegister rd) {\n    constexpr uint32_t Op = 0b0001'1110'0010'0000'0001'00 << 10;\n    uint32_t Instr = Op;\n\n    Instr |= M << 31;\n    Instr |= S << 29;\n    Instr |= ptype << 22;\n    Instr |= imm8 << 13;\n    Instr |= imm5 << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  // Floating-point conditional compare\n  void fccmp(SRegister rn, SRegister rm, StatusFlags flags, Condition Cond) {\n    FloatConditionalCompare(0, 0, 0b00, 0b0, rn.V(), rm.V(), flags, Cond);\n  }\n  void fccmpe(SRegister rn, SRegister rm, StatusFlags flags, Condition Cond) {\n    FloatConditionalCompare(0, 0, 0b00, 0b1, rn.V(), rm.V(), flags, Cond);\n  }\n  void fccmp(DRegister rn, DRegister rm, StatusFlags flags, Condition Cond) {\n    FloatConditionalCompare(0, 0, 0b01, 0b0, rn.V(), rm.V(), flags, Cond);\n  }\n  void fccmpe(DRegister rn, DRegister rm, StatusFlags flags, Condition Cond) {\n    FloatConditionalCompare(0, 0, 0b01, 0b1, rn.V(), rm.V(), flags, Cond);\n  }\n  void fccmp(HRegister rn, HRegister rm, StatusFlags flags, Condition Cond) {\n    FloatConditionalCompare(0, 0, 0b11, 0b0, rn.V(), rm.V(), flags, Cond);\n  }\n  void fccmpe(HRegister rn, HRegister rm, StatusFlags flags, Condition Cond) {\n    FloatConditionalCompare(0, 0, 0b11, 0b1, rn.V(), rm.V(), flags, Cond);\n  }\n\n  // Floating-point data-processing (2 source)\n  void fmul(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    Float2Source(size, 0, 0, 0b0000, rd, rn, rm);\n  }\n  void fdiv(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    Float2Source(size, 0, 0, 0b0001, rd, rn, rm);\n  }\n  void fadd(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    Float2Source(size, 0, 0, 0b0010, rd, rn, rm);\n  }\n  void fsub(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    Float2Source(size, 0, 0, 0b0011, rd, rn, rm);\n  }\n  void fmax(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    Float2Source(size, 0, 0, 0b0100, rd, rn, rm);\n  }\n  void fmin(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    Float2Source(size, 0, 0, 0b0101, rd, rn, rm);\n  }\n  void fmaxnm(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    Float2Source(size, 0, 0, 0b0110, rd, rn, rm);\n  }\n  void fminnm(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    Float2Source(size, 0, 0, 0b0111, rd, rn, rm);\n  }\n  void fnmul(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm) {\n    Float2Source(size, 0, 0, 0b1000, rd, rn, rm);\n  }\n\n  void fmul(SRegister rd, SRegister rn, SRegister rm) {\n    Float2Source(0, 0, 0b00, 0b0000, rd.V(), rn.V(), rm.V());\n  }\n  void fdiv(SRegister rd, SRegister rn, SRegister rm) {\n    Float2Source(0, 0, 0b00, 0b0001, rd.V(), rn.V(), rm.V());\n  }\n  void fadd(SRegister rd, SRegister rn, SRegister rm) {\n    Float2Source(0, 0, 0b00, 0b0010, rd.V(), rn.V(), rm.V());\n  }\n  void fsub(SRegister rd, SRegister rn, SRegister rm) {\n    Float2Source(0, 0, 0b00, 0b0011, rd.V(), rn.V(), rm.V());\n  }\n  void fmax(SRegister rd, SRegister rn, SRegister rm) {\n    Float2Source(0, 0, 0b00, 0b0100, rd.V(), rn.V(), rm.V());\n  }\n  void fmin(SRegister rd, SRegister rn, SRegister rm) {\n    Float2Source(0, 0, 0b00, 0b0101, rd.V(), rn.V(), rm.V());\n  }\n  void fmaxnm(SRegister rd, SRegister rn, SRegister rm) {\n    Float2Source(0, 0, 0b00, 0b0110, rd.V(), rn.V(), rm.V());\n  }\n  void fminnm(SRegister rd, SRegister rn, SRegister rm) {\n    Float2Source(0, 0, 0b00, 0b0111, rd.V(), rn.V(), rm.V());\n  }\n  void fnmul(SRegister rd, SRegister rn, SRegister rm) {\n    Float2Source(0, 0, 0b00, 0b1000, rd.V(), rn.V(), rm.V());\n  }\n\n  void fmul(DRegister rd, DRegister rn, DRegister rm) {\n    Float2Source(0, 0, 0b01, 0b0000, rd.V(), rn.V(), rm.V());\n  }\n  void fdiv(DRegister rd, DRegister rn, DRegister rm) {\n    Float2Source(0, 0, 0b01, 0b0001, rd.V(), rn.V(), rm.V());\n  }\n  void fadd(DRegister rd, DRegister rn, DRegister rm) {\n    Float2Source(0, 0, 0b01, 0b0010, rd.V(), rn.V(), rm.V());\n  }\n  void fsub(DRegister rd, DRegister rn, DRegister rm) {\n    Float2Source(0, 0, 0b01, 0b0011, rd.V(), rn.V(), rm.V());\n  }\n  void fmax(DRegister rd, DRegister rn, DRegister rm) {\n    Float2Source(0, 0, 0b01, 0b0100, rd.V(), rn.V(), rm.V());\n  }\n  void fmin(DRegister rd, DRegister rn, DRegister rm) {\n    Float2Source(0, 0, 0b01, 0b0101, rd.V(), rn.V(), rm.V());\n  }\n  void fmaxnm(DRegister rd, DRegister rn, DRegister rm) {\n    Float2Source(0, 0, 0b01, 0b0110, rd.V(), rn.V(), rm.V());\n  }\n  void fminnm(DRegister rd, DRegister rn, DRegister rm) {\n    Float2Source(0, 0, 0b01, 0b0111, rd.V(), rn.V(), rm.V());\n  }\n  void fnmul(DRegister rd, DRegister rn, DRegister rm) {\n    Float2Source(0, 0, 0b01, 0b1000, rd.V(), rn.V(), rm.V());\n  }\n\n  void fmul(HRegister rd, HRegister rn, HRegister rm) {\n    Float2Source(0, 0, 0b11, 0b0000, rd.V(), rn.V(), rm.V());\n  }\n  void fdiv(HRegister rd, HRegister rn, HRegister rm) {\n    Float2Source(0, 0, 0b11, 0b0001, rd.V(), rn.V(), rm.V());\n  }\n  void fadd(HRegister rd, HRegister rn, HRegister rm) {\n    Float2Source(0, 0, 0b11, 0b0010, rd.V(), rn.V(), rm.V());\n  }\n  void fsub(HRegister rd, HRegister rn, HRegister rm) {\n    Float2Source(0, 0, 0b11, 0b0011, rd.V(), rn.V(), rm.V());\n  }\n  void fmax(HRegister rd, HRegister rn, HRegister rm) {\n    Float2Source(0, 0, 0b11, 0b0100, rd.V(), rn.V(), rm.V());\n  }\n  void fmin(HRegister rd, HRegister rn, HRegister rm) {\n    Float2Source(0, 0, 0b11, 0b0101, rd.V(), rn.V(), rm.V());\n  }\n  void fmaxnm(HRegister rd, HRegister rn, HRegister rm) {\n    Float2Source(0, 0, 0b11, 0b0110, rd.V(), rn.V(), rm.V());\n  }\n  void fminnm(HRegister rd, HRegister rn, HRegister rm) {\n    Float2Source(0, 0, 0b11, 0b0111, rd.V(), rn.V(), rm.V());\n  }\n  void fnmul(HRegister rd, HRegister rn, HRegister rm) {\n    Float2Source(0, 0, 0b11, 0b1000, rd.V(), rn.V(), rm.V());\n  }\n\n  // Floating-point conditional select\n  void fcsel(ScalarRegSize size, VRegister rd, VRegister rn, VRegister rm, Condition Cond) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i16Bit || size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit,\n                       \"Invalid size selected for {}\", __func__);\n\n    const uint32_t ConvertedSize = size == ScalarRegSize::i64Bit ? 0b01 : size == ScalarRegSize::i32Bit ? 0b00 : 0b11;\n\n    FloatConditionalSelect(0, 0, ConvertedSize, rd, rn, rm, Cond);\n  }\n\n  void fcsel(SRegister rd, SRegister rn, SRegister rm, Condition Cond) {\n    FloatConditionalSelect(0, 0, 0b00, rd.V(), rn.V(), rm.V(), Cond);\n  }\n  void fcsel(DRegister rd, DRegister rn, DRegister rm, Condition Cond) {\n    FloatConditionalSelect(0, 0, 0b01, rd.V(), rn.V(), rm.V(), Cond);\n  }\n  void fcsel(HRegister rd, HRegister rn, HRegister rm, Condition Cond) {\n    FloatConditionalSelect(0, 0, 0b11, rd.V(), rn.V(), rm.V(), Cond);\n  }\n\n  // Floating-point data-processing (3 source)\n  void fmadd(SRegister rd, SRegister rn, SRegister rm, SRegister ra) {\n    Float3Source(0, 0, 0b00, 0, 0, rd.V(), rn.V(), rm.V(), ra.V());\n  }\n  void fmsub(SRegister rd, SRegister rn, SRegister rm, SRegister ra) {\n    Float3Source(0, 0, 0b00, 0, 1, rd.V(), rn.V(), rm.V(), ra.V());\n  }\n  void fnmadd(SRegister rd, SRegister rn, SRegister rm, SRegister ra) {\n    Float3Source(0, 0, 0b00, 1, 0, rd.V(), rn.V(), rm.V(), ra.V());\n  }\n  void fnmsub(SRegister rd, SRegister rn, SRegister rm, SRegister ra) {\n    Float3Source(0, 0, 0b00, 1, 1, rd.V(), rn.V(), rm.V(), ra.V());\n  }\n\n  void fmadd(DRegister rd, DRegister rn, DRegister rm, DRegister ra) {\n    Float3Source(0, 0, 0b01, 0, 0, rd.V(), rn.V(), rm.V(), ra.V());\n  }\n  void fmsub(DRegister rd, DRegister rn, DRegister rm, DRegister ra) {\n    Float3Source(0, 0, 0b01, 0, 1, rd.V(), rn.V(), rm.V(), ra.V());\n  }\n  void fnmadd(DRegister rd, DRegister rn, DRegister rm, DRegister ra) {\n    Float3Source(0, 0, 0b01, 1, 0, rd.V(), rn.V(), rm.V(), ra.V());\n  }\n  void fnmsub(DRegister rd, DRegister rn, DRegister rm, DRegister ra) {\n    Float3Source(0, 0, 0b01, 1, 1, rd.V(), rn.V(), rm.V(), ra.V());\n  }\n\n  void fmadd(HRegister rd, HRegister rn, HRegister rm, HRegister ra) {\n    Float3Source(0, 0, 0b11, 0, 0, rd.V(), rn.V(), rm.V(), ra.V());\n  }\n  void fmsub(HRegister rd, HRegister rn, HRegister rm, HRegister ra) {\n    Float3Source(0, 0, 0b11, 0, 1, rd.V(), rn.V(), rm.V(), ra.V());\n  }\n  void fnmadd(HRegister rd, HRegister rn, HRegister rm, HRegister ra) {\n    Float3Source(0, 0, 0b11, 1, 0, rd.V(), rn.V(), rm.V(), ra.V());\n  }\n  void fnmsub(HRegister rd, HRegister rn, HRegister rm, HRegister ra) {\n    Float3Source(0, 0, 0b11, 1, 1, rd.V(), rn.V(), rm.V(), ra.V());\n  }\n\nprivate:\n  // Advanced SIMD scalar copy\n  void ASIMDScalarCopy(uint32_t Q, uint32_t b28, uint32_t imm5, uint32_t imm4, VRegister rd, VRegister rn) {\n    uint32_t Instr = 0b0000'1110'0000'0000'0000'01U << 10;\n    Instr |= Q << 30;\n    Instr |= b28 << 28;\n    Instr |= imm5 << 16;\n    Instr |= imm4 << 11;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n  // Advanced SIMD scalar three same FP16\n  void ASIMDScalarThreeSameFP16(uint32_t U, uint32_t a, uint32_t opcode, HRegister rm, HRegister rn, HRegister rd) {\n    uint32_t Instr = 0b0101'1110'0100'0000'0000'0100'0000'0000;\n\n    Instr |= U << 29;\n    Instr |= a << 23;\n    Instr |= rm.Idx() << 16;\n    Instr |= opcode << 11;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n  // Advanced SIMD scalar two-register miscellaneous FP16\n  void ASIMDScalarTwoRegMiscFP16(uint32_t U, uint32_t a, uint32_t opcode, HRegister rn, HRegister rd) {\n    uint32_t Instr = 0b0101'1110'0111'1000'0000'1000'0000'0000;\n\n    Instr |= U << 29;\n    Instr |= a << 23;\n    Instr |= opcode << 12;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  // Advanced SIMD scalar three same extra\n  void ASIMDScalarThreeSameExtra(uint32_t U, ScalarRegSize size, uint32_t opcode, VRegister rm, VRegister rn, VRegister rd) {\n    uint32_t Instr = 0b0101'1110'0000'0000'1000'0100'0000'0000;\n    Instr |= U << 29;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= rm.Idx() << 16;\n    Instr |= opcode << 11;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  // Advanced SIMD scalar two-register miscellaneous\n  void ASIMDScalar2RegMisc(uint32_t b20, uint32_t U, ScalarRegSize size, uint32_t opcode, VRegister rd, VRegister rn) {\n    uint32_t Instr = 0b0101'1110'0010'0000'0000'1000'0000'0000;\n\n    Instr |= U << 29;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= b20 << 20;\n    Instr |= opcode << 12;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  // Advanced SIMD scalar three different\n  void ASIMD3RegDifferent(uint32_t U, ScalarRegSize size, uint32_t opcode, VRegister rd, VRegister rn, VRegister rm) {\n    uint32_t Instr = 0b0101'1110'0010'0000'0000'0000'0000'0000;\n\n    Instr |= U << 29;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= Encode_rm(rm);\n    Instr |= opcode << 12;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n  // Advanced SIMD scalar three same\n  void ASIMD3RegSame(uint32_t U, ScalarRegSize size, uint32_t opcode, VRegister rd, VRegister rn, VRegister rm) {\n    uint32_t Instr = 0b0101'1110'0010'0000'0000'0100'0000'0000;\n\n    Instr |= U << 29;\n    Instr |= FEXCore::ToUnderlying(size) << 22;\n    Instr |= Encode_rm(rm);\n    Instr |= opcode << 11;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n  // Advanced SIMD scalar shift by immediate\n  void ASIMDScalarShiftByImm(uint32_t U, uint32_t immh, uint32_t immb, uint32_t opcode, VRegister rd, VRegister rn) {\n    uint32_t Instr = 0b0101'1111'0000'0000'0000'0100'0000'0000;\n\n    Instr |= U << 29;\n    Instr |= immh << 19;\n    Instr |= immb << 16;\n    Instr |= opcode << 11;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n  // Advanced SIMD scalar x indexed element\n  void ASIMDScalarXIndexedElement(uint32_t U, ScalarRegSize size, uint32_t opcode, VRegister rm, VRegister rn, VRegister rd, uint32_t index) {\n    LOGMAN_THROW_A_FMT(size != ScalarRegSize::i8Bit, \"Scalar size must not be 8-bit\");\n\n    const auto invalid_bound = 16U >> FEXCore::ToUnderlying(size);\n    LOGMAN_THROW_A_FMT(index < invalid_bound, \"Index ({}) must be within [0-{}]\", index, invalid_bound - 1);\n\n    uint32_t Instr = 0b0101'1111'0000'0000'0000'0000'0000'0000;\n\n    // FMUL/FMLA/FMLS indexed variants deal with size differently.\n    if (opcode == 0b0001 || opcode == 0b0101 || opcode == 0b1001) {\n      // Unlike other instructions in the group, 16-bit is encoded as zero\n      // and 32/64-bit are encoded with the top bit always set to one.\n      if (size != ScalarRegSize::i16Bit) {\n        Instr |= (0b10 | (FEXCore::ToUnderlying(size) & 1)) << 22;\n      }\n    } else {\n      Instr |= FEXCore::ToUnderlying(size) << 22;\n    }\n\n    uint32_t H = 0;\n    uint32_t LM = 0;\n    if (size == ScalarRegSize::i16Bit) {\n      LOGMAN_THROW_A_FMT(rm <= VReg::v15, \"rm ({}) must be within [v0-v15]\", rm.Idx());\n      H = (index >> 2) & 1;\n      LM = index & 0b11;\n    } else if (size == ScalarRegSize::i32Bit) {\n      H = (index >> 1) & 1;\n      LM = (index & 0b01) << 1;\n    } else {\n      H = index & 1;\n    }\n\n    Instr |= U << 29;\n    Instr |= LM << 20;\n    Instr |= rm.Idx() << 16;\n    Instr |= opcode << 12;\n    Instr |= H << 11;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  // Floating-point data-processing (1 source)\n  void Float1Source(uint32_t M, uint32_t S, uint32_t ptype, uint32_t opcode, VRegister rd, VRegister rn) {\n    uint32_t Instr = 0b0001'1110'0010'0000'0100'0000'0000'0000;\n\n    Instr |= M << 31;\n    Instr |= S << 29;\n    Instr |= ptype << 22;\n    Instr |= opcode << 15;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n\n    dc32(Instr);\n  }\n  void Float1Source(ScalarRegSize size, uint32_t M, uint32_t S, uint32_t opcode, VRegister rd, VRegister rn) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i16Bit || size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit,\n                       \"Invalid size selected for {}\", __func__);\n\n    const uint32_t ConvertedSize = size == ScalarRegSize::i64Bit ? 0b01 : size == ScalarRegSize::i32Bit ? 0b00 : 0b11;\n\n    Float1Source(M, S, ConvertedSize, opcode, rd, rn);\n  }\n\n  // Floating-point compare\n  void FloatCompare(uint32_t M, uint32_t S, uint32_t ftype, uint32_t op, uint32_t opcode2, VRegister rn, VRegister rm) {\n    uint32_t Instr = 0b0001'1110'0010'0000'0010'0000'0000'0000;\n\n    Instr |= M << 31;\n    Instr |= S << 29;\n    Instr |= ftype << 22;\n    Instr |= Encode_rm(rm);\n    Instr |= op << 14;\n    Instr |= Encode_rn(rn);\n    Instr |= opcode2;\n\n    dc32(Instr);\n  }\n  // Floating-point immediate\n  // XXX:\n  // Floating-point conditional compare\n  void FloatConditionalCompare(uint32_t M, uint32_t S, uint32_t ptype, uint32_t op, VRegister rn, VRegister rm, StatusFlags flags, Condition Cond) {\n    uint32_t Instr = 0b0001'1110'0010'0000'0000'0100'0000'0000;\n\n    Instr |= M << 31;\n    Instr |= S << 29;\n    Instr |= ptype << 22;\n    Instr |= Encode_rm(rm);\n    Instr |= FEXCore::ToUnderlying(Cond) << 12;\n    Instr |= Encode_rn(rn);\n    Instr |= op << 4;\n    Instr |= FEXCore::ToUnderlying(flags);\n\n    dc32(Instr);\n  }\n  // Floating-point data-processing (2 source)\n\n  void Float2Source(uint32_t M, uint32_t S, uint32_t ptype, uint32_t opcode, VRegister rd, VRegister rn, VRegister rm) {\n    uint32_t Instr = 0b0001'1110'0010'0000'0000'1000'0000'0000;\n\n    Instr |= M << 31;\n    Instr |= S << 29;\n    Instr |= ptype << 22;\n    Instr |= Encode_rm(rm);\n    Instr |= opcode << 12;\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n\n    dc32(Instr);\n  }\n\n  void Float2Source(ScalarRegSize size, uint32_t M, uint32_t S, uint32_t opcode, VRegister rd, VRegister rn, VRegister rm) {\n    LOGMAN_THROW_A_FMT(size == ScalarRegSize::i16Bit || size == ScalarRegSize::i64Bit || size == ScalarRegSize::i32Bit,\n                       \"Invalid size selected for {}\", __func__);\n\n    const uint32_t ConvertedSize = size == ScalarRegSize::i64Bit ? 0b01 : size == ScalarRegSize::i32Bit ? 0b00 : 0b11;\n\n    Float2Source(M, S, ConvertedSize, opcode, rd, rn, rm);\n  }\n\n  // Floating-point conditional select\n  void FloatConditionalSelect(uint32_t M, uint32_t S, uint32_t ptype, VRegister rd, VRegister rn, VRegister rm, Condition Cond) {\n    uint32_t Instr = 0b0001'1110'0010'0000'0000'1100'0000'0000;\n\n    Instr |= M << 31;\n    Instr |= S << 29;\n    Instr |= ptype << 22;\n    Instr |= rm.Idx() << 16;\n    Instr |= FEXCore::ToUnderlying(Cond) << 12;\n    Instr |= rn.Idx() << 5;\n    Instr |= rd.Idx();\n    dc32(Instr);\n  }\n\n  // Floating-point data-processing (3 source)\n  void Float3Source(uint32_t M, uint32_t S, uint32_t ptype, uint32_t o1, uint32_t o0, VRegister rd, VRegister rn, VRegister rm, VRegister ra) {\n    uint32_t Instr = 0b0001'1111'0000'0000'0000'0000'0000'0000;\n\n    Instr |= M << 31;\n    Instr |= S << 29;\n    Instr |= ptype << 22;\n    Instr |= o1 << 21;\n    Instr |= Encode_rm(rm);\n    Instr |= o0 << 15;\n    Instr |= Encode_ra(ra);\n    Instr |= Encode_rn(rn);\n    Instr |= Encode_rd(rd);\n    dc32(Instr);\n  }\n\n#ifndef INCLUDED_BY_EMITTER\n}; // struct LoadstoreEmitterOps\n} // namespace ARMEmitter\n#endif\n"
  },
  {
    "path": "CodeEmitter/CodeEmitter/SystemOps.inl",
    "content": "// SPDX-License-Identifier: MIT\n/* System instruction emitters.\n *\n * This is mostly a mashup of various instruction types.\n * Nothing follows an explicit pattern since they are mostly different.\n */\n\n#pragma once\n#ifndef INCLUDED_BY_EMITTER\n#include <CodeEmitter/Emitter.h>\nnamespace ARMEmitter {\nstruct EmitterOps : Emitter {\n#endif\n\npublic:\n  // Reserved\n  void udf(uint32_t Imm) {\n    LOGMAN_THROW_A_FMT(Imm < 0x1'0000, \"Immediate needs to be 16-bit\");\n    dc32(Imm);\n  }\n\n  // System with result\n  // TODO: SYSL\n  // System Instruction\n  // TODO: AT\n  // TODO: CFP\n  // TODO: CPP\n  void dc(ARMEmitter::DataCacheOperation DCOp, ARMEmitter::Register rt) {\n    constexpr uint32_t Op = 0b1101'0101'0000'1000'0111 << 12;\n    SystemInstruction(Op, 0, FEXCore::ToUnderlying(DCOp), rt);\n  }\n  // TODO: DVP\n  // TODO: IC\n  // TODO: TLBI\n\n  // Exception generation\n  void svc(uint32_t Imm) {\n    ExceptionGeneration(0b000, 0b000, 0b01, Imm);\n  }\n  void hvc(uint32_t Imm) {\n    ExceptionGeneration(0b000, 0b000, 0b10, Imm);\n  }\n  void smc(uint32_t Imm) {\n    ExceptionGeneration(0b000, 0b000, 0b11, Imm);\n  }\n  void brk(uint32_t Imm) {\n    ExceptionGeneration(0b001, 0b000, 0b00, Imm);\n  }\n  void hlt(uint32_t Imm) {\n    ExceptionGeneration(0b010, 0b000, 0b00, Imm);\n  }\n  void tcancel(uint32_t Imm) {\n    ExceptionGeneration(0b011, 0b000, 0b00, Imm);\n  }\n  void dcps1(uint32_t Imm) {\n    ExceptionGeneration(0b101, 0b000, 0b01, Imm);\n  }\n  void dcps2(uint32_t Imm) {\n    ExceptionGeneration(0b101, 0b000, 0b10, Imm);\n  }\n  void dcps3(uint32_t Imm) {\n    ExceptionGeneration(0b101, 0b000, 0b11, Imm);\n  }\n  // System instructions with register argument\n  void wfet(ARMEmitter::Register rt) {\n    SystemInstructionWithReg(0b0000, 0b000, rt);\n  }\n  void wfit(ARMEmitter::Register rt) {\n    SystemInstructionWithReg(0b0000, 0b001, rt);\n  }\n\n  // Hints\n  void nop() {\n    Hint(ARMEmitter::HintRegister::NOP);\n  }\n  void yield() {\n    Hint(ARMEmitter::HintRegister::YIELD);\n  }\n  void wfe() {\n    Hint(ARMEmitter::HintRegister::WFE);\n  }\n  void wfi() {\n    Hint(ARMEmitter::HintRegister::WFI);\n  }\n  void sev() {\n    Hint(ARMEmitter::HintRegister::SEV);\n  }\n  void sevl() {\n    Hint(ARMEmitter::HintRegister::SEVL);\n  }\n  void dgh() {\n    Hint(ARMEmitter::HintRegister::DGH);\n  }\n  void csdb() {\n    Hint(ARMEmitter::HintRegister::CSDB);\n  }\n\n  // Barriers\n  void clrex(uint32_t imm = 15) {\n    LOGMAN_THROW_A_FMT(imm < 16, \"Immediate out of range\");\n    Barrier(ARMEmitter::BarrierRegister::CLREX, imm);\n  }\n  void dsb(ARMEmitter::BarrierScope Scope) {\n    Barrier(ARMEmitter::BarrierRegister::DSB, FEXCore::ToUnderlying(Scope));\n  }\n  void dmb(ARMEmitter::BarrierScope Scope) {\n    Barrier(ARMEmitter::BarrierRegister::DMB, FEXCore::ToUnderlying(Scope));\n  }\n  void isb() {\n    Barrier(ARMEmitter::BarrierRegister::ISB, FEXCore::ToUnderlying(ARMEmitter::BarrierScope::SY));\n  }\n  void sb() {\n    Barrier(ARMEmitter::BarrierRegister::SB, 0);\n  }\n  void tcommit() {\n    Barrier(ARMEmitter::BarrierRegister::TCOMMIT, 0);\n  }\n\n  // System register move\n  void msr(ARMEmitter::SystemRegister reg, ARMEmitter::Register rt) {\n    constexpr uint32_t Op = 0b1101'0101'0001 << 20;\n    SystemRegisterMove(Op, rt, reg);\n  }\n\n  void mrs(ARMEmitter::Register rd, ARMEmitter::SystemRegister reg) {\n    constexpr uint32_t Op = 0b1101'0101'0011 << 20;\n    SystemRegisterMove(Op, rd, reg);\n  }\n\nprivate:\n\n  // Exception Generation\n  void ExceptionGeneration(uint32_t opc, uint32_t op2, uint32_t LL, uint32_t Imm) {\n    LOGMAN_THROW_A_FMT((Imm & 0xFFFF'0000) == 0, \"Imm amount too large\");\n\n    uint32_t Instr = 0b1101'0100 << 24;\n\n    Instr |= opc << 21;\n    Instr |= Imm << 5;\n    Instr |= op2 << 2;\n    Instr |= LL;\n\n    dc32(Instr);\n  }\n\n  // System instructions with register argument\n  void SystemInstructionWithReg(uint32_t CRm, uint32_t op2, ARMEmitter::Register rt) {\n    uint32_t Instr = 0b1101'0101'0000'0011'0001 << 12;\n\n    Instr |= CRm << 8;\n    Instr |= op2 << 5;\n    Instr |= Encode_rt(rt);\n    dc32(Instr);\n  }\n\n  // Hints\n  void Hint(ARMEmitter::HintRegister Reg) {\n    uint32_t Instr = 0b1101'0101'0000'0011'0010'0000'0001'1111U;\n    Instr |= FEXCore::ToUnderlying(Reg);\n    dc32(Instr);\n  }\n  // Barriers\n  void Barrier(ARMEmitter::BarrierRegister Reg, uint32_t CRm) {\n    uint32_t Instr = 0b1101'0101'0000'0011'0011'0000'0001'1111U;\n    Instr |= CRm << 8;\n    Instr |= FEXCore::ToUnderlying(Reg);\n    dc32(Instr);\n  }\n\n  // System Instruction\n  void SystemInstruction(uint32_t Op, uint32_t L, uint32_t SubOp, ARMEmitter::Register rt) {\n    uint32_t Instr = Op;\n\n    Instr |= L << 21;\n    Instr |= SubOp;\n    Instr |= Encode_rt(rt);\n\n    dc32(Instr);\n  }\n\n  // System register move\n  void SystemRegisterMove(uint32_t Op, ARMEmitter::Register rt, ARMEmitter::SystemRegister reg) {\n    uint32_t Instr = Op;\n\n    Instr |= FEXCore::ToUnderlying(reg);\n    Instr |= Encode_rt(rt);\n\n    dc32(Instr);\n  }\n\n#ifndef INCLUDED_BY_EMITTER\n}; // struct LoadstoreEmitterOps\n} // namespace ARMEmitter\n#endif\n"
  },
  {
    "path": "CodeEmitter/CodeEmitter/VixlUtils.inl",
    "content": "// Collection of utilities from vixl.\n// Following is the vixl license.\n// Copyright 2015, VIXL authors\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//   * Redistributions of source code must retain the above copyright notice,\n//     this list of conditions and the following disclaimer.\n//   * Redistributions in binary form must reproduce the above copyright notice,\n//     this list of conditions and the following disclaimer in the documentation\n//     and/or other materials provided with the distribution.\n//   * Neither the name of ARM Limited nor the names of its contributors may be\n//     used to endorse or promote products derived from this software without\n//     specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Test if a given value can be encoded in the immediate field of a logical\n// instruction.\n// If it can be encoded, the function returns true, and values pointed to by n,\n// imm_s and imm_r are updated with immediates encoded in the format required\n// by the corresponding fields in the logical instruction.\n// If it can not be encoded, the function returns false, and the values pointed\n// to by n, imm_s and imm_r are undefined.\nstatic bool IsImmLogical(uint64_t value, unsigned width, unsigned* n = nullptr, unsigned* imm_s = nullptr, unsigned* imm_r = nullptr) {\n  [[maybe_unused]] constexpr auto kBRegSize = 8;\n  [[maybe_unused]] constexpr auto kHRegSize = 16;\n  [[maybe_unused]] constexpr auto kSRegSize = 32;\n  [[maybe_unused]] constexpr auto kDRegSize = 64;\n\n  constexpr auto kWRegSize = 32;\n\n  LOGMAN_THROW_A_FMT((width == kBRegSize) || (width == kHRegSize) || (width == kSRegSize) || (width == kDRegSize), \"Unexpected imm size\");\n\n  bool negate = false;\n\n  // Logical immediates are encoded using parameters n, imm_s and imm_r using\n  // the following table:\n  //\n  //    N   imms    immr    size        S             R\n  //    1  ssssss  rrrrrr    64    UInt(ssssss)  UInt(rrrrrr)\n  //    0  0sssss  xrrrrr    32    UInt(sssss)   UInt(rrrrr)\n  //    0  10ssss  xxrrrr    16    UInt(ssss)    UInt(rrrr)\n  //    0  110sss  xxxrrr     8    UInt(sss)     UInt(rrr)\n  //    0  1110ss  xxxxrr     4    UInt(ss)      UInt(rr)\n  //    0  11110s  xxxxxr     2    UInt(s)       UInt(r)\n  // (s bits must not be all set)\n  //\n  // A pattern is constructed of size bits, where the least significant S+1 bits\n  // are set. The pattern is rotated right by R, and repeated across a 32 or\n  // 64-bit value, depending on destination register width.\n  //\n  // Put another way: the basic format of a logical immediate is a single\n  // contiguous stretch of 1 bits, repeated across the whole word at intervals\n  // given by a power of 2. To identify them quickly, we first locate the\n  // lowest stretch of 1 bits, then the next 1 bit above that; that combination\n  // is different for every logical immediate, so it gives us all the\n  // information we need to identify the only logical immediate that our input\n  // could be, and then we simply check if that's the value we actually have.\n  //\n  // (The rotation parameter does give the possibility of the stretch of 1 bits\n  // going 'round the end' of the word. To deal with that, we observe that in\n  // any situation where that happens the bitwise NOT of the value is also a\n  // valid logical immediate. So we simply invert the input whenever its low bit\n  // is set, and then we know that the rotated case can't arise.)\n\n  if (value & 1) {\n    // If the low bit is 1, negate the value, and set a flag to remember that we\n    // did (so that we can adjust the return values appropriately).\n    negate = true;\n    value = ~value;\n  }\n\n  if (width <= kWRegSize) {\n    // To handle 8/16/32-bit logical immediates, the very easiest thing is to repeat\n    // the input value to fill a 64-bit word. The correct encoding of that as a\n    // logical immediate will also be the correct encoding of the value.\n\n    // Avoid making the assumption that the most-significant 56/48/32 bits are zero by\n    // shifting the value left and duplicating it.\n    for (unsigned bits = width; bits <= kWRegSize; bits *= 2) {\n      value <<= bits;\n      uint64_t mask = (UINT64_C(1) << bits) - 1;\n      value |= ((value >> bits) & mask);\n    }\n  }\n\n  // The basic analysis idea: imagine our input word looks like this.\n  //\n  //    0011111000111110001111100011111000111110001111100011111000111110\n  //                                                          c  b    a\n  //                                                          |<--d-->|\n  //\n  // We find the lowest set bit (as an actual power-of-2 value, not its index)\n  // and call it a. Then we add a to our original number, which wipes out the\n  // bottommost stretch of set bits and replaces it with a 1 carried into the\n  // next zero bit. Then we look for the new lowest set bit, which is in\n  // position b, and subtract it, so now our number is just like the original\n  // but with the lowest stretch of set bits completely gone. Now we find the\n  // lowest set bit again, which is position c in the diagram above. Then we'll\n  // measure the distance d between bit positions a and c (using CLZ), and that\n  // tells us that the only valid logical immediate that could possibly be equal\n  // to this number is the one in which a stretch of bits running from a to just\n  // below b is replicated every d bits.\n  uint64_t a = LowestSetBit(value);\n  uint64_t value_plus_a = value + a;\n  uint64_t b = LowestSetBit(value_plus_a);\n  uint64_t value_plus_a_minus_b = value_plus_a - b;\n  uint64_t c = LowestSetBit(value_plus_a_minus_b);\n\n  int d, clz_a, out_n;\n  uint64_t mask;\n\n  if (c != 0) {\n    // The general case, in which there is more than one stretch of set bits.\n    // Compute the repeat distance d, and set up a bitmask covering the basic\n    // unit of repetition (i.e. a word with the bottom d bits set). Also, in all\n    // of these cases the N bit of the output will be zero.\n    clz_a = std::countl_zero(a);\n    int clz_c = std::countl_zero(c);\n    d = clz_a - clz_c;\n    mask = ((UINT64_C(1) << d) - 1);\n    out_n = 0;\n  } else {\n    // Handle degenerate cases.\n    //\n    // If any of those 'find lowest set bit' operations didn't find a set bit at\n    // all, then the word will have been zero thereafter, so in particular the\n    // last lowest_set_bit operation will have returned zero. So we can test for\n    // all the special case conditions in one go by seeing if c is zero.\n    if (a == 0) {\n      // The input was zero (or all 1 bits, which will come to here too after we\n      // inverted it at the start of the function), for which we just return\n      // false.\n      return false;\n    } else {\n      // Otherwise, if c was zero but a was not, then there's just one stretch\n      // of set bits in our word, meaning that we have the trivial case of\n      // d == 64 and only one 'repetition'. Set up all the same variables as in\n      // the general case above, and set the N bit in the output.\n      clz_a = std::countl_zero(a);\n      d = 64;\n      mask = ~UINT64_C(0);\n      out_n = 1;\n    }\n  }\n\n  // If the repeat period d is not a power of two, it can't be encoded.\n  if (!std::has_single_bit(uint32_t(d))) {\n    return false;\n  }\n\n  if (((b - a) & ~mask) != 0) {\n    // If the bit stretch (b - a) does not fit within the mask derived from the\n    // repeat period, then fail.\n    return false;\n  }\n\n  // The only possible option is b - a repeated every d bits. Now we're going to\n  // actually construct the valid logical immediate derived from that\n  // specification, and see if it equals our original input.\n  //\n  // To repeat a value every d bits, we multiply it by a number of the form\n  // (1 + 2^d + 2^(2d) + ...), i.e. 0x0001000100010001 or similar. These can\n  // be derived using a table lookup on CLZ(d).\n  static const uint64_t multipliers[] = {\n    0x0000000000000001UL, 0x0000000100000001UL, 0x0001000100010001UL, 0x0101010101010101UL, 0x1111111111111111UL, 0x5555555555555555UL,\n  };\n  uint64_t multiplier = multipliers[std::countl_zero(uint64_t(d)) - 57];\n  uint64_t candidate = (b - a) * multiplier;\n\n  if (value != candidate) {\n    // The candidate pattern doesn't match our input value, so fail.\n    return false;\n  }\n\n  // We have a match! This is a valid logical immediate, so now we have to\n  // construct the bits and pieces of the instruction encoding that generates\n  // it.\n\n  // Count the set bits in our basic stretch. The special case of clz(0) == -1\n  // makes the answer come out right for stretches that reach the very top of\n  // the word (e.g. numbers like 0xffffc00000000000).\n  int clz_b = (b == 0) ? -1 : std::countl_zero(b);\n  int s = clz_a - clz_b;\n\n  // Decide how many bits to rotate right by, to put the low bit of that basic\n  // stretch in position a.\n  int r;\n  if (negate) {\n    // If we inverted the input right at the start of this function, here's\n    // where we compensate: the number of set bits becomes the number of clear\n    // bits, and the rotation count is based on position b rather than position\n    // a (since b is the location of the 'lowest' 1 bit after inversion).\n    s = d - s;\n    r = (clz_b + 1) & (d - 1);\n  } else {\n    r = (clz_a + 1) & (d - 1);\n  }\n\n  // Now we're done, except for having to encode the S output in such a way that\n  // it gives both the number of set bits and the length of the repeated\n  // segment. The s field is encoded like this:\n  //\n  //     imms    size        S\n  //    ssssss    64    UInt(ssssss)\n  //    0sssss    32    UInt(sssss)\n  //    10ssss    16    UInt(ssss)\n  //    110sss     8    UInt(sss)\n  //    1110ss     4    UInt(ss)\n  //    11110s     2    UInt(s)\n  //\n  // So we 'or' (2 * -d) with our computed s to form imms.\n  if (n != nullptr) {\n    *n = out_n;\n  }\n  if (imm_s != nullptr) {\n    *imm_s = ((2 * -d) | (s - 1)) & 0x3f;\n  }\n  if (imm_r != nullptr) {\n    *imm_r = r;\n  }\n\n  return true;\n}\n\nstatic inline bool IsIntN(unsigned n, int64_t x) {\n  if (n == 64) {\n    return true;\n  }\n  int64_t limit = INT64_C(1) << (n - 1);\n  return (-limit <= x) && (x < limit);\n}\n\nstatic inline bool IsUintN(unsigned n, int64_t x) {\n  // Convert to an unsigned integer to avoid implementation-defined behavior.\n  return !(static_cast<uint64_t>(x) >> n);\n}\n\n// clang-format off\n#define INT_1_TO_32_LIST(V)                                                    \\\nV(1)  V(2)  V(3)  V(4)  V(5)  V(6)  V(7)  V(8)                                 \\\nV(9)  V(10) V(11) V(12) V(13) V(14) V(15) V(16)                                \\\nV(17) V(18) V(19) V(20) V(21) V(22) V(23) V(24)                                \\\nV(25) V(26) V(27) V(28) V(29) V(30) V(31) V(32)\n\n#define INT_33_TO_63_LIST(V)                                                   \\\nV(33) V(34) V(35) V(36) V(37) V(38) V(39) V(40)                                \\\nV(41) V(42) V(43) V(44) V(45) V(46) V(47) V(48)                                \\\nV(49) V(50) V(51) V(52) V(53) V(54) V(55) V(56)                                \\\nV(57) V(58) V(59) V(60) V(61) V(62) V(63)\n\n#define INT_1_TO_63_LIST(V) INT_1_TO_32_LIST(V) INT_33_TO_63_LIST(V)\n\n// clang-format on\n\n#define DECLARE_IS_INT_N(N)                \\\n  static inline bool IsInt##N(int64_t x) { \\\n    return IsIntN(N, x);                   \\\n  }\n\n#define DECLARE_IS_UINT_N(N)                \\\n  static inline bool IsUint##N(int64_t x) { \\\n    return IsUintN(N, x);                   \\\n  }\n\nINT_1_TO_63_LIST(DECLARE_IS_INT_N)\nINT_1_TO_63_LIST(DECLARE_IS_UINT_N)\n\n#undef DECLARE_IS_INT_N\n#undef DECLARE_IS_UINT_N\n\nprivate:\n\n// Some compilers dislike negating unsigned integers,\n// so we provide an equivalent.\ntemplate<typename T>\nstatic inline T UnsignedNegate(T value) {\n  static_assert(std::is_unsigned<T>::value);\n  return ~value + 1;\n}\n\nstatic inline uint64_t LowestSetBit(uint64_t value) {\n  return value & UnsignedNegate(value);\n}\n\npublic:\n"
  },
  {
    "path": "Data/AppConfig/CMakeLists.txt",
    "content": "file(GLOB CONFIG_SOURCES CONFIGURE_DEPENDS *.json)\nfile(GLOB GEN_CONFIG_SOURCES CONFIGURE_DEPENDS *.json.in)\n\n# Any application configuration json file gets installed\nforeach(CONFIG_SRC ${CONFIG_SOURCES})\n  install(FILES ${CONFIG_SRC}\n    DESTINATION ${DATA_DIRECTORY}/AppConfig/\n    COMPONENT Runtime)\nendforeach()\n\n# Any configuration file json file that needs to be generated\n# First generate then install it\nforeach(GEN_CONFIG_SRC ${GEN_CONFIG_SOURCES})\n  # Get the filename only component\n  get_filename_component(CONFIG_NAME ${GEN_CONFIG_SRC} NAME_WLE)\n\n  # Configure it\n  configure_file(${GEN_CONFIG_SRC} ${CMAKE_BINARY_DIR}/Data/AppConfig/${CONFIG_NAME})\n\n  # Then install the configured json\n  install(FILES ${CMAKE_BINARY_DIR}/Data/AppConfig/${CONFIG_NAME}\n    DESTINATION ${DATA_DIRECTORY}/AppConfig/\n    COMPONENT Runtime)\nendforeach()\n"
  },
  {
    "path": "Data/AppConfig/client.json",
    "content": "{\n  \"Config\": {\n    \"HideHypervisorBit\": \"1\"\n  }\n}\n"
  },
  {
    "path": "Data/AppConfig/steamwebhelper.json",
    "content": "{\n  \"Comment\": \"Bypasses libGL's glX and instead sends GLX requests directly via xcb\",\n  \"ThunksDB\": {\n    \"GL\": 0\n  }\n}\n"
  },
  {
    "path": "Data/CI/FEXLinuxTestsThunks.json",
    "content": "{\n  \"ThunksDB\": {\n    \"fex_thunk_test\": 1\n  }\n}\n"
  },
  {
    "path": "Data/CI/GLThunks.json",
    "content": "{\n  \"ThunksDB\": {\n    \"GL\": 1\n  }\n}\n"
  },
  {
    "path": "Data/CI/VulkanThunks.json",
    "content": "{\n  \"ThunksDB\": {\n    \"Vulkan\": 1\n  }\n}\n"
  },
  {
    "path": "Data/CMake/FindZycore.cmake",
    "content": "# SPDX-License-Identifier: MIT\n\nif (CMAKE_CROSSCOMPILING)\n    return()\nendif()\n\ninclude(FindPackageHandleStandardArgs)\n\nfind_package(Zycore QUIET CONFIG)\n\nif (Zycore_CONSIDERED_CONFIGS)\n    find_package_handle_standard_args(Zycore CONFIG_MODE)\nelse()\n    find_package(PkgConfig QUIET)\n    pkg_search_module(Zycore QUIET IMPORTED_TARGET zycore)\n    find_package_handle_standard_args(Zycore\n        REQUIRED_VARS zycore_LINK_LIBRARIES\n        VERSION_VAR zycore_VERSION)\n\n    if (TARGET PkgConfig::zycore)\n      add_library(Zycore::Zycore ALIAS PkgConfig::zycore)\n    endif()\nendif()\n"
  },
  {
    "path": "Data/CMake/FindZydis.cmake",
    "content": "# SPDX-License-Identifier: MIT\n\nif (CMAKE_CROSSCOMPILING)\n    return()\nendif()\n\ninclude(FindPackageHandleStandardArgs)\n\nfind_package(Zydis QUIET CONFIG)\n\nif (Zydis_CONSIDERED_CONFIGS)\n    find_package_handle_standard_args(Zydis CONFIG_MODE)\nelse()\n    find_package(PkgConfig QUIET)\n    pkg_search_module(Zydis QUIET IMPORTED_TARGET zydis)\n    find_package_handle_standard_args(Zydis\n        REQUIRED_VARS zydis_LINK_LIBRARIES\n        VERSION_VAR zydis_VERSION)\n\n    if (TARGET PkgConfig::zydis)\n      add_library(Zydis::Zydis ALIAS PkgConfig::zydis)\n    endif()\nendif()\n"
  },
  {
    "path": "Data/CMake/Findxxhash.cmake",
    "content": "# SPDX-License-Identifier: MIT\n\ninclude(FindPackageHandleStandardArgs)\n\nfind_package(PkgConfig QUIET)\npkg_search_module(xxhash QUIET IMPORTED_TARGET xxhash libxxhash)\nfind_package_handle_standard_args(xxhash\n    REQUIRED_VARS xxhash_LINK_LIBRARIES\n    VERSION_VAR xxhash_VERSION\n)\n\nif (xxhash_FOUND AND NOT TARGET xxHash::xxhash)\n    if (TARGET PkgConfig::xxhash)\n        add_library(xxHash::xxhash ALIAS PkgConfig::xxhash)\n    else()\n        add_library(xxHash::xxhash ALIAS xxhash)\n    endif()\nendif()\n"
  },
  {
    "path": "Data/CMake/LinkerGC.cmake",
    "content": "# SPDX-License-Identifier: MIT\n\n# This applies some common linker options that reduce code size and linking time in Release mode. Namely:\n# --gc-sections: Linktime garbage collection, discards unused sections from the final output\n# --strip-all  : Similar to running `strip`, discards the symbol table from the final output\n# --as-needed  : Only includes libraries that are actually needed in the final output.\n\nmacro(LinkerGC target)\n  if (CMAKE_BUILD_TYPE MATCHES \"RELEASE\")\n    target_link_options(${target} PRIVATE\n      \"LINKER:--gc-sections\"\n      \"LINKER:--strip-all\"\n      \"LINKER:--as-needed\")\n  endif()\nendmacro()\n"
  },
  {
    "path": "Data/CMake/cmake_uninstall.cmake.in",
    "content": "if(NOT EXISTS \"@CMAKE_BINARY_DIR@/install_manifest.txt\")\n  message(FATAL_ERROR \"Cannot find install manifest: @CMAKE_BINARY_DIR@/install_manifest.txt\")\nendif()\n\nfile(READ \"@CMAKE_BINARY_DIR@/install_manifest.txt\" files)\nstring(REGEX REPLACE \"\\n\" \";\" files \"${files}\")\nforeach(file ${files})\n  message(STATUS \"Uninstalling $ENV{DESTDIR}${file}\")\n  if(IS_SYMLINK \"$ENV{DESTDIR}${file}\" OR EXISTS \"$ENV{DESTDIR}${file}\")\n    exec_program(\n      \"@CMAKE_COMMAND@\" ARGS \"-E remove \\\"$ENV{DESTDIR}${file}\\\"\"\n      OUTPUT_VARIABLE rm_out\n      RETURN_VALUE rm_retval\n      )\n    if(NOT \"${rm_retval}\" STREQUAL 0)\n      message(FATAL_ERROR \"Problem when removing $ENV{DESTDIR}${file}\")\n    endif()\n  else(IS_SYMLINK \"$ENV{DESTDIR}${file}\" OR EXISTS \"$ENV{DESTDIR}${file}\")\n    message(STATUS \"File $ENV{DESTDIR}${file} does not exist.\")\n  endif()\nendforeach()\n"
  },
  {
    "path": "Data/CMake/toolchain_aarch64.cmake",
    "content": "# This is a reference AArch64 cross compile script\n# Pass in to cmake when building:\n# eg: cmake --toolchain ../Data/CMake/toolchain_aarch64.cmake ..\nif (NOT DEFINED ENV{SYSROOT})\n  message(FATAL_ERROR \"Need to have SYSROOT environment variable set\")\nendif()\n\nset(CMAKE_SYSTEM_NAME Linux)\nset(CMAKE_SYSTEM_PROCESSOR aarch64)\nset(CMAKE_CROSSCOMPILING TRUE)\n\n# Target triple needs to match the binutils exactly\nset(TARGET_TRIPLE aarch64-linux-gnu)\nset(CMAKE_C_COMPILER \"clang\")\nset(CMAKE_CXX_COMPILER \"clang++\")\nset(CMAKE_C_COMPILER_AR \"llvm-ar\")\nset(CMAKE_CXX_COMPILER_AR \"llvm-ar\")\nset(CMAKE_C_COMPILER_RANLIB \"llvm-ranlib\")\nset(CMAKE_CXX_COMPILER_RANLIB \"llvm-ranlib\")\nset(CMAKE_LINKER \"ld.lld\")\n\nset(CMAKE_C_COMPILER_TARGET ${TARGET_TRIPLE})\nset(CMAKE_CXX_COMPILER_TARGET ${TARGET_TRIPLE})\n\n# Set the environment variable SYSROOT to the aarch64 rootfs\nset(CMAKE_FIND_ROOT_PATH \"$ENV{SYSROOT}\")\nset(CMAKE_SYSROOT \"$ENV{SYSROOT}\")\n\nlist(APPEND CMAKE_PREFIX_PATH \"$ENV{SYSROOT}/usr/lib/${TARGET_TRIPLE}/cmake/\")\n\nset(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\n\nset(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\nset(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\nset(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)\n"
  },
  {
    "path": "Data/CMake/toolchain_mingw.cmake",
    "content": "set(MINGW_TRIPLE \"\" CACHE STRING \"MinGW compiler target architecture triple\")\n\nset(CMAKE_RC_COMPILER ${MINGW_TRIPLE}-windres)\nset(CMAKE_C_COMPILER ${MINGW_TRIPLE}-clang)\nset(CMAKE_CXX_COMPILER ${MINGW_TRIPLE}-clang++)\nset(CMAKE_DLLTOOL ${MINGW_TRIPLE}-dlltool)\nset(CMAKE_AR ${MINGW_TRIPLE}-ar)\n\n# Compile everything as static to avoid requiring the MinGW runtime libraries, force page aligned sections so that\n# debug symbols work correctly, and disable loop alignment to workaround an LLVM bug\n# (https://github.com/llvm/llvm-project/issues/47432)\nset(CMAKE_SHARED_LINKER_FLAGS_INIT \"-static -static-libgcc -static-libstdc++ -Wl,--file-alignment=4096,/mllvm:-align-loops=1\")\nset(CMAKE_EXE_LINKER_FLAGS_INIT \"-static -static-libgcc -static-libstdc++ -Wl,--file-alignment=4096,/mllvm:-align-loops=1\")\nset(CMAKE_C_STANDARD_LIBRARIES \"\" CACHE STRING \"\" FORCE)\nset(CMAKE_CXX_STANDARD_LIBRARIES \"\" CACHE STRING \"\" FORCE)\nset(CMAKE_STANDARD_LIBRARIES \"\" CACHE STRING \"\" FORCE)\nset(CMAKE_SYSTEM_NAME Windows)\nset(CMAKE_SYSTEM_PROCESSOR ${MINGW_TRIPLE})\n\nset(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)\n"
  },
  {
    "path": "Data/CMake/toolchain_x86_32.cmake",
    "content": "option(ENABLE_CLANG_THUNKS \"Enable building thunks with clang\" FALSE)\n\nset(CMAKE_SYSTEM_PROCESSOR i686)\n\nif (ENABLE_CLANG_THUNKS)\n  message(STATUS \"Enabling thunk clang building. Force enabling LLD as well\")\n\n  set(CMAKE_EXE_LINKER_FLAGS_INIT \"-fuse-ld=lld\")\n  set(CMAKE_MODULE_LINKER_FLAGS_INIT \"-fuse-ld=lld\")\n  set(CMAKE_SHARED_LINKER_FLAGS_INIT \"-fuse-ld=lld\")\n  set(CMAKE_C_COMPILER clang)\n  set(CMAKE_CXX_COMPILER clang++)\n  set(CLANG_FLAGS \"-target i686-linux-gnu -msse2 -mfpmath=sse\")\n\n  set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} ${CLANG_FLAGS}\")\n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} ${CLANG_FLAGS}\")\nelse()\n  set(CMAKE_C_COMPILER x86_64-linux-gnu-gcc -m32)\n  set(CMAKE_CXX_COMPILER x86_64-linux-gnu-g++ -m32)\nendif()\n"
  },
  {
    "path": "Data/CMake/toolchain_x86_64.cmake",
    "content": "option(ENABLE_CLANG_THUNKS \"Enable building thunks with clang\" FALSE)\n\nset(CMAKE_SYSTEM_PROCESSOR x86_64)\n\nif (ENABLE_CLANG_THUNKS)\n  message(STATUS \"Enabling thunk clang building. Force enabling LLD as well\")\n\n  set(CMAKE_EXE_LINKER_FLAGS_INIT \"-fuse-ld=lld\")\n  set(CMAKE_MODULE_LINKER_FLAGS_INIT \"-fuse-ld=lld\")\n  set(CMAKE_SHARED_LINKER_FLAGS_INIT \"-fuse-ld=lld\")\n  set(CMAKE_C_COMPILER clang)\n  set(CMAKE_CXX_COMPILER clang++)\n  set(CLANG_FLAGS \"-target x86_64-linux-gnu\")\n\n  set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} ${CLANG_FLAGS}\")\n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} ${CLANG_FLAGS}\")\nelse()\n  set(CMAKE_C_COMPILER x86_64-linux-gnu-gcc)\n  set(CMAKE_CXX_COMPILER x86_64-linux-gnu-g++)\nendif()\n"
  },
  {
    "path": "Data/CMake/version_to_variables.cmake",
    "content": "# Extracts a version from the passed in version string in the form of \"<Major>.<Minor>.<Patch>\".\n# If a part of the version is missing then it gets set as zero.\n# Version variables returned in:\n# ${Package}_VERSION_MAJOR\n# ${Package}_VERSION_MINOR\n# ${Package}_VERSION_PATCH\nfunction(version_to_variables VERSION _Package)\n  string(REPLACE \".\" \";\" VERSION_LIST \"${VERSION}\")\n  list (LENGTH VERSION_LIST VERSION_LEN)\n  if (${VERSION_LEN} GREATER 0)\n    list(GET VERSION_LIST 0 VERSION_MAJOR)\n    set(${_Package}_VERSION_MAJOR ${VERSION_MAJOR} PARENT_SCOPE)\n  else()\n    set(${_Package}_VERSION_MAJOR 0 PARENT_SCOPE)\n  endif()\n\n  if (${VERSION_LEN} GREATER 1)\n    list(GET VERSION_LIST 1 VERSION_MINOR)\n    set(${_Package}_VERSION_MINOR ${VERSION_MINOR} PARENT_SCOPE)\n  else()\n    set(${_Package}_VERSION_MINOR 0 PARENT_SCOPE)\n  endif()\n\n  if (${VERSION_LEN} GREATER 2)\n    list(GET VERSION_LIST 2 VERSION_PATCH)\n    set(${_Package}_VERSION_PATCH ${VERSION_PATCH} PARENT_SCOPE)\n  else()\n    set(${_Package}_VERSION_PATCH 0 PARENT_SCOPE)\n  endif()\nendfunction()\n"
  },
  {
    "path": "Data/Dockerfile",
    "content": "# --- Stage 1: Builder ---\nFROM ubuntu:22.04 as builder\n\nRUN DEBIAN_FRONTEND=\"noninteractive\" apt-get update\nRUN DEBIAN_FRONTEND=\"noninteractive\" apt install -y cmake \\\nclang-13 llvm-13 nasm ninja-build pkg-config \\\nlibcap-dev libglfw3-dev libepoxy-dev python3-dev libsdl2-dev \\\npython3 linux-headers-generic  \\\ngit  qtbase5-dev qtdeclarative5-dev lld\n\nRUN git clone --recurse-submodules https://github.com/FEX-Emu/FEX.git\nWORKDIR /FEX\nRUN mkdir build\n\nARG CC=clang-13\nARG CXX=clang++-13\nRUN cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DUSE_LINKER=lld -DENABLE_LTO=True -DBUILD_TESTING=False -DENABLE_ASSERTIONS=False -G Ninja .\nRUN ninja\n\nWORKDIR /FEX/build\n\n# --- Stage 2: Runner ---\nFROM builder as runner\n\nRUN DEBIAN_FRONTEND=\"noninteractive\" apt-get update\nRUN DEBIAN_FRONTEND=\"noninteractive\" apt install -y \\\nlibcap-dev libglfw3-dev libepoxy-dev\n\nCOPY --from=builder /FEX/Bin/* /usr/bin/\n\nWORKDIR /\n"
  },
  {
    "path": "Data/ThunksDB.json",
    "content": "{\n  \"DB\": {\n    \"GL\": {\n      \"Library\" : \"libGL-guest.so\",\n      \"Overlay\": [\n        \"@PREFIX_LIB@/libGL.so\",\n        \"@PREFIX_LIB@/libGL.so.1\",\n        \"@PREFIX_LIB@/libGL.so.1.2.0\",\n        \"@PREFIX_LIB@/libGL.so.1.7.0\"\n      ]\n    },\n    \"Vulkan\": {\n      \"Library\": \"libvulkan-guest.so\",\n      \"Overlay\": [\n        \"@PREFIX_LIB@/libvulkan.so\",\n        \"@PREFIX_LIB@/libvulkan.so.1\",\n        \"@HOME@/.local/share/Steam/ubuntu12_32/steam-runtime/pinned_libs_64/libvulkan.so.1\"\n      ]\n    },\n    \"drm\": {\n      \"Library\": \"libdrm-guest.so\",\n      \"Overlay\": [\n        \"@PREFIX_LIB@/libdrm.so\",\n        \"@PREFIX_LIB@/libdrm.so.2\",\n        \"@PREFIX_LIB@/libdrm.so.2.4.0\"\n      ]\n    },\n    \"asound\": {\n      \"Library\": \"libasound-guest.so\",\n      \"Overlay\": [\n        \"@PREFIX_LIB@/libasound.so\",\n        \"@PREFIX_LIB@/libasound.so.2\",\n        \"@PREFIX_LIB@/libasound.so.2.0.0\"\n      ]\n    },\n    \"fex_thunk_test\": {\n      \"Library\": \"libfex_thunk_test-guest.so\",\n      \"Overlay\": [\n        \"@PREFIX_LIB@/libfex_thunk_test.so\"\n      ]\n    },\n    \"WaylandClient\": {\n      \"Library\" : \"libwayland-client-guest.so\",\n      \"Overlay\": [\n        \"@PREFIX_LIB@/libwayland-client.so\",\n        \"@PREFIX_LIB@/libwayland-client.so.0\",\n        \"@PREFIX_LIB@/libwayland-client.so.0.20.0\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "Data/binfmts/CMakeLists.txt",
    "content": "function(GenBinFmt Name)\n  # Get the filename only component\n  get_filename_component(FMT_NAME ${Name} NAME_WE)\n\n  # Configure it\n  configure_file(${Name} ${CMAKE_BINARY_DIR}/Data/binfmts/${FMT_NAME})\n\n  # Then install the configured binfmt\n  install(FILES ${CMAKE_BINARY_DIR}/Data/binfmts/${FMT_NAME}\n    DESTINATION ${CMAKE_INSTALL_PREFIX}/share/binfmts/\n    COMPONENT Runtime)\nendfunction()\n\nif (NOT USE_LEGACY_BINFMTMISC)\n  configure_file(FEX-x86.conf.in ${CMAKE_BINARY_DIR}/Data/binfmts/FEX-x86.conf)\n  configure_file(FEX-x86_64.conf.in ${CMAKE_BINARY_DIR}/Data/binfmts/FEX-x86_64.conf)\n\n  install(FILES ${CMAKE_BINARY_DIR}/Data/binfmts/FEX-x86.conf ${CMAKE_BINARY_DIR}/Data/binfmts/FEX-x86_64.conf\n    DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/binfmt.d/\n    COMPONENT Runtime)\nelse()\n  GenBinFmt(FEX-x86.in)\n  GenBinFmt(FEX-x86_64.in)\nendif()\n"
  },
  {
    "path": "Data/binfmts/FEX-x86.conf.in",
    "content": ":FEX-x86:M:0:\\x7fELF\\x01\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x03\\x00:\\xff\\xff\\xff\\xff\\xff\\xfe\\xfe\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff\\xff:@CMAKE_INSTALL_PREFIX@/bin/FEX:POCF\n"
  },
  {
    "path": "Data/binfmts/FEX-x86.in",
    "content": "package fex\ninterpreter @CMAKE_INSTALL_PREFIX@/bin/FEX\nmagic \\x7fELF\\x01\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x03\\x00\noffset 0\nmask \\xff\\xff\\xff\\xff\\xff\\xfe\\xfe\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff\\xff\ncredentials yes\nfix_binary yes\npreserve yes\n"
  },
  {
    "path": "Data/binfmts/FEX-x86_64.conf.in",
    "content": ":FEX-x86_64:M:0:\\x7fELF\\x02\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x3e\\x00:\\xff\\xff\\xff\\xff\\xff\\xfe\\xfe\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff\\xff:@CMAKE_INSTALL_PREFIX@/bin/FEX:POCF\n"
  },
  {
    "path": "Data/binfmts/FEX-x86_64.in",
    "content": "package fex\ninterpreter @CMAKE_INSTALL_PREFIX@/bin/FEX\nmagic \\x7fELF\\x02\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x3e\\x00\noffset 0\nmask \\xff\\xff\\xff\\xff\\xff\\xfe\\xfe\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff\\xff\ncredentials yes\nfix_binary yes\npreserve yes\n"
  },
  {
    "path": "Data/nix/FEXLinuxTests/shell.nix",
    "content": "{ pkgs ? import <nixpkgs> { } }:\n\nlet\n  pkgsCross32 = pkgs.pkgsCross.gnu32;\n  pkgsCross64 = pkgs.pkgsCross.gnu64;\n\n  gcc32 = pkgs.writeText \"toolchain_nix_gcc_x86_32.txt\" ''\n    set(CMAKE_SYSTEM_PROCESSOR i686)\n    set(CMAKE_C_COMPILER ${pkgsCross32.buildPackages.gcc}/bin/i686-unknown-linux-gnu-gcc)\n    set(CMAKE_CXX_COMPILER ${pkgsCross32.buildPackages.gcc}/bin/i686-unknown-linux-gnu-g++)\n  '';\n\n  gcc64 = pkgs.writeText \"toolchain_nix_gcc_x86_64.txt\" ''\n    set(CMAKE_SYSTEM_PROCESSOR x86_64)\n    set(CMAKE_C_COMPILER ${pkgsCross64.buildPackages.gcc}/bin/x86_64-unknown-linux-gnu-gcc)\n    set(CMAKE_CXX_COMPILER ${pkgsCross64.buildPackages.gcc}/bin/x86_64-unknown-linux-gnu-g++)\n  '';\nin\npkgs.mkShell {\n  buildInputs = [\n    pkgsCross64.buildPackages.clang\n    pkgsCross32.buildPackages.clang\n  ];\n\n  shellHook = ''\n    if [[ $- == *i* ]]; then\n      echo \"toolchain32: ${gcc32}\"\n      echo \"toolchain64: ${gcc64}\"\n      echo \"\"\n      echo \"Use \\$FEX_CMAKE_TOOLCHAINS to configure CMake.\"\n    fi\n  '';\n\n  FEX_CMAKE_TOOLCHAINS = \"-DX86_32_TOOLCHAIN_FILE=${gcc32} -DX86_64_TOOLCHAIN_FILE=${gcc64}\";\n}\n"
  },
  {
    "path": "Data/nix/LibraryForwarding/shell.nix",
    "content": "{ pkgs ? import <nixpkgs> { } }:\n\nlet\n  pkgsCross32 = pkgs.pkgsCross.gnu32;\n  pkgsCross64 = pkgs.pkgsCross.gnu64;\n\n  devRootFS = pkgs.buildEnv {\n    name = \"fex-dev-rootfs\";\n    paths = [\n      pkgsCross64.stdenv.cc.libc_dev\n      pkgsCross32.stdenv.cc.libc_dev\n      pkgsCross64.stdenv.cc.cc\n      pkgsCross32.stdenv.cc.cc\n\n      pkgs.alsa-lib.dev\n      pkgs.libdrm.dev\n      pkgs.libGL.dev\n      pkgs.wayland.dev\n      pkgs.xorg.libX11.dev\n      pkgs.xorg.libxcb.dev\n      pkgs.xorg.libXrandr.dev\n      pkgs.xorg.libXrender.dev\n      pkgs.xorg.xorgproto\n    ];\n    ignoreCollisions = true;\n    pathsToLink = [\n      \"/include\"\n      \"/lib\"\n    ];\n\n    postBuild = ''\n      mkdir -p $out/usr\n      ln -s $out/include $out/usr/\n    '';\n  };\n\n  toolchain32 = pkgs.writeText \"toolchain_nix_x86_32.txt\" ''\n    set(CMAKE_EXE_LINKER_FLAGS_INIT \"-fuse-ld=lld\")\n    set(CMAKE_MODULE_LINKER_FLAGS_INIT \"-fuse-ld=lld\")\n    set(CMAKE_SHARED_LINKER_FLAGS_INIT \"-fuse-ld=lld\")\n    set(CMAKE_SYSTEM_PROCESSOR i686)\n    set(CMAKE_C_COMPILER clang)\n    set(CMAKE_CXX_COMPILER clang++)\n    set(CMAKE_C_COMPILER ${pkgsCross32.buildPackages.clang}/bin/i686-unknown-linux-gnu-clang)\n    set(CMAKE_CXX_COMPILER ${pkgsCross32.buildPackages.clang}/bin/i686-unknown-linux-gnu-clang++)\n    set(CLANG_FLAGS \"-nodefaultlibs -nostartfiles -lstdc++ -target i686-linux-gnu -msse2 -mfpmath=sse --sysroot=${devRootFS} -iwithsysroot/include\")\n    set(CMAKE_C_FLAGS \"''${CMAKE_C_FLAGS} ''${CLANG_FLAGS}\")\n    set(CMAKE_CXX_FLAGS \"''${CMAKE_CXX_FLAGS} ''${CLANG_FLAGS}\")\n  '';\n\n  toolchain64 = pkgs.writeText \"toolchain_nix_x86_64.txt\" ''\n    set(CMAKE_EXE_LINKER_FLAGS_INIT \"-fuse-ld=lld\")\n    set(CMAKE_MODULE_LINKER_FLAGS_INIT \"-fuse-ld=lld\")\n    set(CMAKE_SHARED_LINKER_FLAGS_INIT \"-fuse-ld=lld\")\n    set(CMAKE_SYSTEM_PROCESSOR x86_64)\n    set(CMAKE_C_COMPILER clang)\n    set(CMAKE_CXX_COMPILER clang++)\n    set(CMAKE_C_COMPILER ${pkgsCross64.buildPackages.clang}/bin/x86_64-unknown-linux-gnu-clang)\n    set(CMAKE_CXX_COMPILER ${pkgsCross64.buildPackages.clang}/bin/x86_64-unknown-linux-gnu-clang++)\n    set(CLANG_FLAGS \"-nodefaultlibs -nostartfiles -lstdc++ -target x86_64-linux-gnu --sysroot=${devRootFS} -iwithsysroot/usr/include\")\n    set(CMAKE_C_FLAGS \"''${CMAKE_C_FLAGS} ''${CLANG_FLAGS}\")\n    set(CMAKE_CXX_FLAGS \"''${CMAKE_CXX_FLAGS} ''${CLANG_FLAGS}\")\n  '';\nin\npkgs.mkShell {\n  buildInputs = [\n    pkgsCross64.buildPackages.clang\n    pkgsCross32.buildPackages.clang\n  ];\n\n  shellHook = ''\n    if [[ $- == *i* ]]; then\n      echo \"Set up dev RootFS at ${devRootFS}\"\n      echo \"toolchain32: ${toolchain32}\"\n      echo \"toolchain64: ${toolchain64}\"\n      echo \"\"\n      echo \"Use \\$FEX_CMAKE_TOOLCHAINS to configure CMake.\"\n    fi\n  '';\n\n  FEX_CMAKE_TOOLCHAINS = \"-DX86_32_TOOLCHAIN_FILE=${toolchain32} -DX86_64_TOOLCHAIN_FILE=${toolchain64} -DX86_DEV_ROOTFS=${devRootFS}\";\n  ROOTFS = \"${devRootFS}\";\n}\n"
  },
  {
    "path": "Data/nix/WineOnArm/shell.nix",
    "content": "{ pkgs ? import <nixpkgs> { } }:\n\nlet\n  toolchain = pkgs.fetchzip {\n    url = \"https://github.com/bylaws/llvm-mingw/releases/download/20250920/llvm-mingw-20250920-ucrt-ubuntu-22.04-aarch64.tar.xz\";\n    sha256 = \"sha256-LaojKjC8KzY+soW5u6eoDoXE3qtYk9Ejr7M3enTqRAE=\";\n  };\n\n  cmakeToolchainFile = pkgs.substitute {\n    # Use absolute paths that are discoverable outside of the nix shell\n    src = ../../CMake/toolchain_mingw.cmake;\n    substitutions = [\"--replace-fail\" \"\\${MINGW_TRIPLE}-\" \"${toolchain}/bin/\\${MINGW_TRIPLE}-\"];\n  };\n\n  mesonCrossFile = pkgs.writeText \"crossfile_llvm_mingw.txt\" ''\n    [binaries]\n    ar = '${toolchain}/bin/arm64ec-w64-mingw32-ar'\n    c = '${toolchain}/bin/arm64ec-w64-mingw32-gcc'\n    cpp = '${toolchain}/bin/arm64ec-w64-mingw32-g++'\n    ld = '${toolchain}/bin/arm64ec-w64-mingw32-ld'\n    windres = '${toolchain}/bin/arm64ec-w64-mingw32-windres'\n    strip = '${toolchain}/bin/strip'\n    widl = '${toolchain}/bin/arm64ec-w64-mingw32-widl'\n    pkgconfig = 'aarch64-linux-gnu-pkg-config'\n    [host_machine]\n    system = 'windows'\n    cpu_family = 'aarch64'\n    cpu = 'aarch64'\n    endian = 'little'\n  '';\nin\npkgs.mkShell {\n  buildInputs = [\n    toolchain\n  ];\n\n  shellHook = ''\n    if [[ $- == *i* ]]; then\n      echo \"llvm-mingw set up at ${toolchain}.\"\n      echo \"\"\n      echo \"To configure DXVK/vkd3d-proton: meson setup \\$FEX_MESON_CROSSFILE\"\n      echo \"\"\n      echo \"To configure 32-bit FEX build: cmake \\$FEX_CMAKE_TOOLCHAIN_WOW64\"\n      echo \"To configure 64-bit FEX build: cmake \\$FEX_CMAKE_TOOLCHAIN_ARM64EC\"\n    fi\n  '';\n\n  # E.g. cmake $FEX_CMAKE_TOOLCHAIN_ARM64EC -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DENABLE_LTO=False -DBUILD_TESTING=False\n  FEX_CMAKE_TOOLCHAIN_ARM64EC = \"--toolchain ${cmakeToolchainFile} -DMINGW_TRIPLE=arm64ec-w64-mingw32 -DCMAKE_INSTALL_LIBDIR=/usr/lib/wine/aarch64-windows\";\n  FEX_CMAKE_TOOLCHAIN_WOW64 = \"--toolchain ${cmakeToolchainFile} -DMINGW_TRIPLE=aarch64-w64-mingw32 -DCMAKE_INSTALL_LIBDIR=/usr/lib/wine/aarch64-windows\";\n  FEX_MESON_CROSSFILE = \"--cross-file ${mesonCrossFile}\";\n}\n"
  },
  {
    "path": "Data/nix/cmake_configure_woa32.sh",
    "content": "#! /usr/bin/env nix-shell\n#! nix-shell -i bash WineOnArm/shell.nix\n\n# Helper script to configure CMake for building FEX as library for emulation\n# of 32-bit applications in Wine/Proton.\n# The required cross-toolchains will be set up and managed by nix.\n\nif [ $# -eq 0 ]\nthen\n  echo \"Expected CMake argument list\"\n  exit 1\nfi\n\nif [ -f CMakeCache.txt ]\nthen\n  echo \"Expected empty build folder\"\n  exit 1\nfi\n\nset -o xtrace\ncmake $FEX_CMAKE_TOOLCHAIN_WOW64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DENABLE_LTO=False -DBUILD_TESTING=False $@\n"
  },
  {
    "path": "Data/nix/cmake_configure_woa64.sh",
    "content": "#! /usr/bin/env nix-shell\n#! nix-shell -i bash WineOnArm/shell.nix\n\n# Helper script to configure CMake for building FEX as library for emulation\n# of 64-bit applications in Wine/Proton\n# Nix is used to install and manage the required cross-toolchains.\n\nif [ $# -eq 0 ]\nthen\n  echo \"Expected CMake argument list\"\n  exit 1\nfi\n\nif [ -f CMakeCache.txt ]\nthen\n  echo \"Expected empty build folder\"\n  exit 1\nfi\n\nset -o xtrace\ncmake $FEX_CMAKE_TOOLCHAIN_ARM64EC -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DENABLE_LTO=False -DBUILD_TESTING=False $@\n"
  },
  {
    "path": "Data/nix/cmake_enable_flt.sh",
    "content": "#! /usr/bin/env nix-shell\n#! nix-shell -i bash FEXLinuxTests/shell.nix\n\n# Helper script to configure CMake for building FEXLinuxTests.\n# Nix is used to install and manage the required cross-toolchains.\n\nif [ ! -f CMakeCache.txt ]\nthen\n  echo \"Must be run from a pre-configured CMake build folder\"\n  exit 1\nfi\n\n# Remove previous build to ensure the new toolchain is applied\nrm -rf unittests/FEXLinuxTests\n\nset -o xtrace\ncmake . $FEX_CMAKE_TOOLCHAINS -DBUILD_TESTING=ON -DBUILD_FEX_LINUX_TESTS=ON\n"
  },
  {
    "path": "Data/nix/cmake_enable_libfwd.sh",
    "content": "# Helper script to configure CMake for library forwarding in FEX.\n# Nix is used to install and manage the required cross-toolchains.\n\nif [ ! -f CMakeCache.txt ]\nthen\n  echo \"Must be run from a pre-configured CMake build folder\"\n  exit 1\nfi\n\n# Remove previous build to ensure the new toolchain is applied\nrm -rf guest-libs guest-libs-32 Guest Guest_32\n\n# Set clang executable path manually since the one from the nix store\n# will be picked up otherwise\nCLANG_EXEC_PATH=\"\"\nif ! grep -q CLANG_EXEC_PATH CMakeCache.txt\nthen\n  CLANG_EXEC_PATH=\"-DCLANG_EXEC_PATH=`which clang`\"\nfi\n\nnix-shell `dirname -- \"$0\"`/LibraryForwarding/shell.nix \\\n  --run \"set -o xtrace; cmake . \\$FEX_CMAKE_TOOLCHAINS -DBUILD_THUNKS=ON $CLANG_EXEC_PATH; set +o xtrace\"\n"
  },
  {
    "path": "External/.clang-format",
    "content": "DisableFormat: true\n"
  },
  {
    "path": "External/SoftFloat-3e/CMakeLists.txt",
    "content": "\nadd_library(softfloat_3e STATIC\n  # F80 support\n  src/extF80_add.c\n  src/extF80_div.c\n  src/extF80_sub.c\n  src/extF80_mul.c\n  src/extF80_rem.c\n  src/extF80_sqrt.c\n  src/extF80_le.c\n  src/extF80_to_i32.c\n  src/extF80_to_i64.c\n  src/extF80_to_ui64.c\n  src/extF80_to_f32.c\n  src/extF80_to_f64.c\n  src/i32_to_extF80.c\n  src/ui64_to_extF80.c\n  src/extF80_to_f128.c\n  src/f128_to_extF80.c\n\n  # F128 support\n  src/f128_add.c\n  src/f128_div.c\n  src/f128_eq.c\n  src/f128_eq_signaling.c\n  src/f128_isSignalingNaN.c\n  src/f128_le.c\n  src/f128_le_quiet.c\n  src/f128_lt.c\n  src/f128_lt_quiet.c\n  src/f128_mulAdd.c\n  src/f128_mul.c\n  src/f128_rem.c\n  src/f128_sqrt.c\n  src/f128_sub.c\n  src/f128_to_f16.c\n  src/f128_to_f32.c\n  src/f128_to_f64.c\n  src/f128_to_i32.c\n  src/f128_to_i64.c\n  src/f128_to_ui32.c\n  src/f128_to_ui64.c\n  src/s_addMagsF128.c\n  src/s_subMagsF128.c\n  src/s_normRoundPackToF128.c\n  src/s_roundPackToF128.c\n  src/s_propagateNaNF128UI.c\n\n  # Conversion\n  src/f32_to_f128.c\n  src/i32_to_f128.c\n\n  src/s_roundToUI64.c\n  src/s_f128UIToCommonNaN.c\n  src/s_commonNaNToF128UI.c\n  src/s_normSubnormalF128Sig.c\n  src/s_roundToI32.c\n  src/s_roundToI64.c\n  src/s_roundPackToF32.c\n  src/s_addMagsExtF80.c\n  src/s_extF80UIToCommonNaN.c\n  src/s_commonNaNToF32UI.c\n  src/s_commonNaNToF64UI.c\n  src/s_roundPackToF64.c\n  src/s_propagateNaNExtF80UI.c\n  src/s_roundPackToExtF80.c\n  src/s_normSubnormalExtF80Sig.c\n  src/s_subMagsExtF80.c\n  src/s_shiftRightJam128.c\n  src/s_shiftRightJam128Extra.c\n  src/s_normRoundPackToExtF80.c\n  src/s_approxRecip_1Ks.c\n  src/s_approxRecipSqrt32_1.c\n  src/s_approxRecipSqrt_1Ks.c\n  src/softfloat_raiseFlags.c\n  src/f64_to_extF80.c\n  src/s_commonNaNToExtF80UI.c\n  src/s_normSubnormalF64Sig.c\n  src/s_f64UIToCommonNaN.c\n  src/extF80_roundToInt.c\n  src/extF80_eq.c\n  src/extF80_lt.c\n  src/f32_to_extF80.c\n  src/s_normSubnormalF32Sig.c\n  src/s_f32UIToCommonNaN.c)\n\nif (ARCHITECTURE_arm64 AND HAS_CLANG_PRESERVE_ALL)\n  list(APPEND DEFINES \"-DFEXCORE_PRESERVE_ALL_ATTR=__attribute__((preserve_all));-DFEXCORE_HAS_PRESERVE_ALL_ATTR=1\")\nelse()\n  list(APPEND DEFINES \"-DFEXCORE_PRESERVE_ALL_ATTR=;-DFEXCORE_HAS_PRESERVE_ALL_ATTR=0\")\nendif()\n\nlist(APPEND DEFINES \"-DSOFTFLOAT_BUILTIN_CLZ=1;-DINLINE=static inline;-DINLINE_LEVEL=4;-DSOFTFLOAT_FAST_INT64=1;-DSOFTFLOAT_FAST_DIV32TO16=1;-DSOFTFLOAT_FAST_DIV64TO32=1\")\n\ntarget_include_directories(softfloat_3e PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/)\ntarget_include_directories(softfloat_3e PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/SoftFloat-3e/)\ntarget_compile_definitions(softfloat_3e PUBLIC ${DEFINES})\n"
  },
  {
    "path": "External/SoftFloat-3e/include/SoftFloat-3e/opts-GCC.h",
    "content": "\r\n/*============================================================================\r\n\r\nThis C header file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2017 The Regents of the University of California.  All rights\r\nreserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#ifndef opts_GCC_h\r\n#define opts_GCC_h 1\r\n\r\n#ifdef INLINE\r\n\r\n#include <stdint.h>\r\n#include \"primitiveTypes.h\"\r\n\r\n#ifdef SOFTFLOAT_BUILTIN_CLZ\r\n\r\nINLINE uint_fast8_t softfloat_countLeadingZeros16( uint16_t a )\r\n    { return a ? __builtin_clz( a ) - 16 : 16; }\r\n#define softfloat_countLeadingZeros16 softfloat_countLeadingZeros16\r\n\r\nINLINE uint_fast8_t softfloat_countLeadingZeros32( uint32_t a )\r\n    { return a ? __builtin_clz( a ) : 32; }\r\n#define softfloat_countLeadingZeros32 softfloat_countLeadingZeros32\r\n\r\nINLINE uint_fast8_t softfloat_countLeadingZeros64( uint64_t a )\r\n    { return a ? __builtin_clzll( a ) : 64; }\r\n#define softfloat_countLeadingZeros64 softfloat_countLeadingZeros64\r\n\r\n#endif\r\n\r\n#ifdef SOFTFLOAT_INTRINSIC_INT128\r\n\r\nINLINE struct uint128 softfloat_mul64ByShifted32To128( uint64_t a, uint32_t b )\r\n{\r\n    union { unsigned __int128 ui; struct uint128 s; } uZ;\r\n    uZ.ui = (unsigned __int128) a * ((uint_fast64_t) b<<32);\r\n    return uZ.s;\r\n}\r\n#define softfloat_mul64ByShifted32To128 softfloat_mul64ByShifted32To128\r\n\r\nINLINE struct uint128 softfloat_mul64To128( uint64_t a, uint64_t b )\r\n{\r\n    union { unsigned __int128 ui; struct uint128 s; } uZ;\r\n    uZ.ui = (unsigned __int128) a * b;\r\n    return uZ.s;\r\n}\r\n#define softfloat_mul64To128 softfloat_mul64To128\r\n\r\nINLINE\r\nstruct uint128 softfloat_mul128By32( uint64_t a64, uint64_t a0, uint32_t b )\r\n{\r\n    union { unsigned __int128 ui; struct uint128 s; } uZ;\r\n    uZ.ui = ((unsigned __int128) a64<<64 | a0) * b;\r\n    return uZ.s;\r\n}\r\n#define softfloat_mul128By32 softfloat_mul128By32\r\n\r\nINLINE\r\nvoid\r\n softfloat_mul128To256M(\r\n     uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0, uint64_t *zPtr )\r\n{\r\n    unsigned __int128 z0, mid1, mid, z128;\r\n    z0 = (unsigned __int128) a0 * b0;\r\n    mid1 = (unsigned __int128) a64 * b0;\r\n    mid = mid1 + (unsigned __int128) a0 * b64;\r\n    z128 = (unsigned __int128) a64 * b64;\r\n    z128 += (unsigned __int128) (mid < mid1)<<64 | mid>>64;\r\n    mid <<= 64;\r\n    z0 += mid;\r\n    z128 += (z0 < mid);\r\n    zPtr[indexWord( 4, 0 )] = z0;\r\n    zPtr[indexWord( 4, 1 )] = z0>>64;\r\n    zPtr[indexWord( 4, 2 )] = z128;\r\n    zPtr[indexWord( 4, 3 )] = z128>>64;\r\n}\r\n#define softfloat_mul128To256M softfloat_mul128To256M\r\n\r\n#endif\r\n\r\n#endif\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/include/SoftFloat-3e/platform.h",
    "content": "\r\n/*============================================================================\r\n\r\nThis C header file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n/*----------------------------------------------------------------------------\r\n*----------------------------------------------------------------------------*/\r\n#define LITTLEENDIAN 1\r\n\r\n/*----------------------------------------------------------------------------\r\n*----------------------------------------------------------------------------*/\r\n#define SOFTFLOAT_BUILTIN_CLZ 1\r\n#define SOFTFLOAT_INTRINSIC_INT128 1\r\n#define SOFTFLOAT_FAST_INT64 1\r\n#include \"opts-GCC.h\"\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/include/SoftFloat-3e/primitiveTypes.h",
    "content": "\r\n/*============================================================================\r\n\r\nThis C header file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#ifndef primitiveTypes_h\r\n#define primitiveTypes_h 1\r\n\r\n#include <stdint.h>\r\n\r\n#ifdef SOFTFLOAT_FAST_INT64\r\n\r\n#ifdef LITTLEENDIAN\r\nstruct uint128 { uint64_t v0, v64; };\r\nstruct uint64_extra { uint64_t extra, v; };\r\nstruct uint128_extra { uint64_t extra; struct uint128 v; };\r\n#else\r\nstruct uint128 { uint64_t v64, v0; };\r\nstruct uint64_extra { uint64_t v, extra; };\r\nstruct uint128_extra { struct uint128 v; uint64_t extra; };\r\n#endif\r\n\r\n#endif\r\n\r\n/*----------------------------------------------------------------------------\r\n| These macros are used to isolate the differences in word order between big-\r\n| endian and little-endian platforms.\r\n*----------------------------------------------------------------------------*/\r\n#ifdef LITTLEENDIAN\r\n#define wordIncr 1\r\n#define indexWord( total, n ) (n)\r\n#define indexWordHi( total ) ((total) - 1)\r\n#define indexWordLo( total ) 0\r\n#define indexMultiword( total, m, n ) (n)\r\n#define indexMultiwordHi( total, n ) ((total) - (n))\r\n#define indexMultiwordLo( total, n ) 0\r\n#define indexMultiwordHiBut( total, n ) (n)\r\n#define indexMultiwordLoBut( total, n ) 0\r\n#define INIT_UINTM4( v3, v2, v1, v0 ) { v0, v1, v2, v3 }\r\n#else\r\n#define wordIncr -1\r\n#define indexWord( total, n ) ((total) - 1 - (n))\r\n#define indexWordHi( total ) 0\r\n#define indexWordLo( total ) ((total) - 1)\r\n#define indexMultiword( total, m, n ) ((total) - 1 - (m))\r\n#define indexMultiwordHi( total, n ) 0\r\n#define indexMultiwordLo( total, n ) ((total) - (n))\r\n#define indexMultiwordHiBut( total, n ) 0\r\n#define indexMultiwordLoBut( total, n ) (n)\r\n#define INIT_UINTM4( v3, v2, v1, v0 ) { v3, v2, v1, v0 }\r\n#endif\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/include/SoftFloat-3e/softfloat.h",
    "content": "\r\n/*============================================================================\r\n\r\nThis C header file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n\r\n/*============================================================================\r\n| Note:  If SoftFloat is made available as a general library for programs to\r\n| use, it is strongly recommended that a platform-specific version of this\r\n| header, \"softfloat.h\", be created that folds in \"softfloat_types.h\" and that\r\n| eliminates all dependencies on compile-time macros.\r\n*============================================================================*/\r\n\r\n\r\n#ifndef softfloat_h\r\n#define softfloat_h 1\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"softfloat_types.h\"\r\n\r\n/*----------------------------------------------------------------------------\r\n| Routine to raise any or all of the software floating-point exception flags.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nvoid softfloat_raiseFlags( struct softfloat_state *, uint_fast8_t );\r\n\r\n/*----------------------------------------------------------------------------\r\n| Integer-to-floating-point conversion routines.\r\n*----------------------------------------------------------------------------*/\r\nfloat16_t ui32_to_f16( uint32_t );\r\nfloat32_t ui32_to_f32( uint32_t );\r\nfloat64_t ui32_to_f64( uint32_t );\r\n#ifdef SOFTFLOAT_FAST_INT64\r\nextFloat80_t ui32_to_extF80( uint32_t );\r\nfloat128_t ui32_to_f128( uint32_t );\r\n#endif\r\nvoid ui32_to_extF80M( uint32_t, extFloat80_t * );\r\nvoid ui32_to_f128M( uint32_t, float128_t * );\r\nfloat16_t ui64_to_f16( uint64_t );\r\nfloat32_t ui64_to_f32( uint64_t );\r\nfloat64_t ui64_to_f64( uint64_t );\r\n#ifdef SOFTFLOAT_FAST_INT64\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t ui64_to_extF80( uint64_t );\r\nfloat128_t ui64_to_f128( uint64_t );\r\n#endif\r\nvoid ui64_to_extF80M( uint64_t, extFloat80_t * );\r\nvoid ui64_to_f128M( uint64_t, float128_t * );\r\nfloat16_t i32_to_f16( int32_t );\r\nfloat32_t i32_to_f32( int32_t );\r\nfloat64_t i32_to_f64( int32_t );\r\n#ifdef SOFTFLOAT_FAST_INT64\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t i32_to_extF80( int32_t );\r\nfloat128_t i32_to_f128( int32_t );\r\n#endif\r\nvoid i32_to_extF80M( int32_t, extFloat80_t * );\r\nvoid i32_to_f128M( int32_t, float128_t * );\r\nfloat16_t i64_to_f16( int64_t );\r\nfloat32_t i64_to_f32( int64_t );\r\nfloat64_t i64_to_f64( int64_t );\r\n#ifdef SOFTFLOAT_FAST_INT64\r\nextFloat80_t i64_to_extF80( int64_t );\r\nfloat128_t i64_to_f128( int64_t );\r\n#endif\r\nvoid i64_to_extF80M( int64_t, extFloat80_t * );\r\nvoid i64_to_f128M( int64_t, float128_t * );\r\n\r\n/*----------------------------------------------------------------------------\r\n| 16-bit (half-precision) floating-point operations.\r\n*----------------------------------------------------------------------------*/\r\nuint_fast32_t f16_to_ui32( float16_t, uint_fast8_t, bool );\r\nuint_fast64_t f16_to_ui64( float16_t, uint_fast8_t, bool );\r\nint_fast32_t f16_to_i32( float16_t, uint_fast8_t, bool );\r\nint_fast64_t f16_to_i64( float16_t, uint_fast8_t, bool );\r\nuint_fast32_t f16_to_ui32_r_minMag( float16_t, bool );\r\nuint_fast64_t f16_to_ui64_r_minMag( float16_t, bool );\r\nint_fast32_t f16_to_i32_r_minMag( float16_t, bool );\r\nint_fast64_t f16_to_i64_r_minMag( float16_t, bool );\r\nfloat32_t f16_to_f32( float16_t );\r\nfloat64_t f16_to_f64( float16_t );\r\n#ifdef SOFTFLOAT_FAST_INT64\r\nextFloat80_t f16_to_extF80( float16_t );\r\nfloat128_t f16_to_f128( float16_t );\r\n#endif\r\nvoid f16_to_extF80M( float16_t, extFloat80_t * );\r\nvoid f16_to_f128M( float16_t, float128_t * );\r\nfloat16_t f16_roundToInt( float16_t, uint_fast8_t, bool );\r\nfloat16_t f16_add( float16_t, float16_t );\r\nfloat16_t f16_sub( float16_t, float16_t );\r\nfloat16_t f16_mul( float16_t, float16_t );\r\nfloat16_t f16_mulAdd( float16_t, float16_t, float16_t );\r\nfloat16_t f16_div( float16_t, float16_t );\r\nfloat16_t f16_rem( float16_t, float16_t );\r\nfloat16_t f16_sqrt( float16_t );\r\nbool f16_eq( float16_t, float16_t );\r\nbool f16_le( float16_t, float16_t );\r\nbool f16_lt( float16_t, float16_t );\r\nbool f16_eq_signaling( float16_t, float16_t );\r\nbool f16_le_quiet( float16_t, float16_t );\r\nbool f16_lt_quiet( float16_t, float16_t );\r\nbool f16_isSignalingNaN( float16_t );\r\n\r\n/*----------------------------------------------------------------------------\r\n| 32-bit (single-precision) floating-point operations.\r\n*----------------------------------------------------------------------------*/\r\nuint_fast32_t f32_to_ui32( float32_t, uint_fast8_t, bool );\r\nuint_fast64_t f32_to_ui64( float32_t, uint_fast8_t, bool );\r\nint_fast32_t f32_to_i32( float32_t, uint_fast8_t, bool );\r\nint_fast64_t f32_to_i64( float32_t, uint_fast8_t, bool );\r\nuint_fast32_t f32_to_ui32_r_minMag( float32_t, bool );\r\nuint_fast64_t f32_to_ui64_r_minMag( float32_t, bool );\r\nint_fast32_t f32_to_i32_r_minMag( float32_t, bool );\r\nint_fast64_t f32_to_i64_r_minMag( float32_t, bool );\r\nfloat16_t f32_to_f16( float32_t );\r\nfloat64_t f32_to_f64( float32_t );\r\n#ifdef SOFTFLOAT_FAST_INT64\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t f32_to_extF80( struct softfloat_state *, float32_t );\r\nfloat128_t f32_to_f128( struct softfloat_state *, float32_t );\r\n#endif\r\nvoid f32_to_extF80M( float32_t, extFloat80_t * );\r\nvoid f32_to_f128M( float32_t, float128_t * );\r\nfloat32_t f32_roundToInt( float32_t, uint_fast8_t, bool );\r\nfloat32_t f32_add( float32_t, float32_t );\r\nfloat32_t f32_sub( float32_t, float32_t );\r\nfloat32_t f32_mul( float32_t, float32_t );\r\nfloat32_t f32_mulAdd( float32_t, float32_t, float32_t );\r\nfloat32_t f32_div( float32_t, float32_t );\r\nfloat32_t f32_rem( float32_t, float32_t );\r\nfloat32_t f32_sqrt( float32_t );\r\nbool f32_eq( float32_t, float32_t );\r\nbool f32_le( float32_t, float32_t );\r\nbool f32_lt( float32_t, float32_t );\r\nbool f32_eq_signaling( float32_t, float32_t );\r\nbool f32_le_quiet( float32_t, float32_t );\r\nbool f32_lt_quiet( float32_t, float32_t );\r\nbool f32_isSignalingNaN( float32_t );\r\n\r\n/*----------------------------------------------------------------------------\r\n| 64-bit (double-precision) floating-point operations.\r\n*----------------------------------------------------------------------------*/\r\nuint_fast32_t f64_to_ui32( float64_t, uint_fast8_t, bool );\r\nuint_fast64_t f64_to_ui64( float64_t, uint_fast8_t, bool );\r\nint_fast32_t f64_to_i32( float64_t, uint_fast8_t, bool );\r\nint_fast64_t f64_to_i64( float64_t, uint_fast8_t, bool );\r\nuint_fast32_t f64_to_ui32_r_minMag( float64_t, bool );\r\nuint_fast64_t f64_to_ui64_r_minMag( float64_t, bool );\r\nint_fast32_t f64_to_i32_r_minMag( float64_t, bool );\r\nint_fast64_t f64_to_i64_r_minMag( float64_t, bool );\r\nfloat16_t f64_to_f16( float64_t );\r\nfloat32_t f64_to_f32( float64_t );\r\n#ifdef SOFTFLOAT_FAST_INT64\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t f64_to_extF80( struct softfloat_state *, float64_t );\r\nfloat128_t f64_to_f128( float64_t );\r\n#endif\r\nvoid f64_to_extF80M( float64_t, extFloat80_t * );\r\nvoid f64_to_f128M( float64_t, float128_t * );\r\nfloat64_t f64_roundToInt( float64_t, uint_fast8_t, bool );\r\nfloat64_t f64_add( float64_t, float64_t );\r\nfloat64_t f64_sub( float64_t, float64_t );\r\nfloat64_t f64_mul( float64_t, float64_t );\r\nfloat64_t f64_mulAdd( float64_t, float64_t, float64_t );\r\nfloat64_t f64_div( float64_t, float64_t );\r\nfloat64_t f64_rem( float64_t, float64_t );\r\nfloat64_t f64_sqrt( float64_t );\r\nbool f64_eq( float64_t, float64_t );\r\nbool f64_le( float64_t, float64_t );\r\nbool f64_lt( float64_t, float64_t );\r\nbool f64_eq_signaling( float64_t, float64_t );\r\nbool f64_le_quiet( float64_t, float64_t );\r\nbool f64_lt_quiet( float64_t, float64_t );\r\nbool f64_isSignalingNaN( float64_t );\r\n\r\n/*----------------------------------------------------------------------------\r\n| 80-bit extended double-precision floating-point operations.\r\n*----------------------------------------------------------------------------*/\r\n#ifdef SOFTFLOAT_FAST_INT64\r\nuint_fast32_t extF80_to_ui32( extFloat80_t, uint_fast8_t, bool );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint_fast64_t extF80_to_ui64( struct softfloat_state *, extFloat80_t, uint_fast8_t, bool );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nint_fast32_t extF80_to_i32( struct softfloat_state *, extFloat80_t, uint_fast8_t, bool );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nint_fast64_t extF80_to_i64( struct softfloat_state *, extFloat80_t, uint_fast8_t, bool );\r\nuint_fast32_t extF80_to_ui32_r_minMag( extFloat80_t, bool );\r\nuint_fast64_t extF80_to_ui64_r_minMag( extFloat80_t, bool );\r\nint_fast32_t extF80_to_i32_r_minMag( extFloat80_t, bool );\r\nint_fast64_t extF80_to_i64_r_minMag( extFloat80_t, bool );\r\nfloat16_t extF80_to_f16( extFloat80_t );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nfloat32_t extF80_to_f32( struct softfloat_state *, extFloat80_t );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nfloat64_t extF80_to_f64( struct softfloat_state *, extFloat80_t );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nfloat128_t extF80_to_f128( struct softfloat_state *, extFloat80_t );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t extF80_roundToInt( struct softfloat_state *, extFloat80_t, uint_fast8_t, bool );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t extF80_add( struct softfloat_state *, extFloat80_t, extFloat80_t );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t extF80_sub( struct softfloat_state *, extFloat80_t, extFloat80_t );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t extF80_mul( struct softfloat_state *, extFloat80_t, extFloat80_t );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t extF80_div( struct softfloat_state *, extFloat80_t, extFloat80_t );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t extF80_rem( struct softfloat_state *, extFloat80_t, extFloat80_t );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t extF80_sqrt( struct softfloat_state *, extFloat80_t );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nbool extF80_eq( struct softfloat_state *, extFloat80_t, extFloat80_t );\r\nbool extF80_le( struct softfloat_state *, extFloat80_t, extFloat80_t );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nbool extF80_lt( struct softfloat_state *, extFloat80_t, extFloat80_t );\r\nbool extF80_eq_signaling( extFloat80_t, extFloat80_t );\r\nbool extF80_le_quiet( extFloat80_t, extFloat80_t );\r\nbool extF80_lt_quiet( extFloat80_t, extFloat80_t );\r\nbool extF80_isSignalingNaN( extFloat80_t );\r\nstatic inline extFloat80_t extF80_complement_sign(extFloat80_t a) {\r\n  a.signExp ^= 1ULL << 15;\r\n  return a;\r\n}\r\n#endif\r\nuint_fast32_t extF80M_to_ui32( const extFloat80_t *, uint_fast8_t, bool );\r\nuint_fast64_t extF80M_to_ui64( const extFloat80_t *, uint_fast8_t, bool );\r\nint_fast32_t extF80M_to_i32( const extFloat80_t *, uint_fast8_t, bool );\r\nint_fast64_t extF80M_to_i64( const extFloat80_t *, uint_fast8_t, bool );\r\nuint_fast32_t extF80M_to_ui32_r_minMag( const extFloat80_t *, bool );\r\nuint_fast64_t extF80M_to_ui64_r_minMag( const extFloat80_t *, bool );\r\nint_fast32_t extF80M_to_i32_r_minMag( const extFloat80_t *, bool );\r\nint_fast64_t extF80M_to_i64_r_minMag( const extFloat80_t *, bool );\r\nfloat16_t extF80M_to_f16( const extFloat80_t * );\r\nfloat32_t extF80M_to_f32( const extFloat80_t * );\r\nfloat64_t extF80M_to_f64( const extFloat80_t * );\r\nvoid extF80M_to_f128M( const extFloat80_t *, float128_t * );\r\nvoid\r\n extF80M_roundToInt(\r\n     const extFloat80_t *, uint_fast8_t, bool, extFloat80_t * );\r\nvoid extF80M_add( const extFloat80_t *, const extFloat80_t *, extFloat80_t * );\r\nvoid extF80M_sub( const extFloat80_t *, const extFloat80_t *, extFloat80_t * );\r\nvoid extF80M_mul( const extFloat80_t *, const extFloat80_t *, extFloat80_t * );\r\nvoid extF80M_div( const extFloat80_t *, const extFloat80_t *, extFloat80_t * );\r\nvoid extF80M_rem( const extFloat80_t *, const extFloat80_t *, extFloat80_t * );\r\nvoid extF80M_sqrt( const extFloat80_t *, extFloat80_t * );\r\nbool extF80M_eq( const extFloat80_t *, const extFloat80_t * );\r\nbool extF80M_le( const extFloat80_t *, const extFloat80_t * );\r\nbool extF80M_lt( const extFloat80_t *, const extFloat80_t * );\r\nbool extF80M_eq_signaling( const extFloat80_t *, const extFloat80_t * );\r\nbool extF80M_le_quiet( const extFloat80_t *, const extFloat80_t * );\r\nbool extF80M_lt_quiet( const extFloat80_t *, const extFloat80_t * );\r\nbool extF80M_isSignalingNaN( const extFloat80_t * );\r\n\r\n/*----------------------------------------------------------------------------\r\n| 128-bit (quadruple-precision) floating-point operations.\r\n*----------------------------------------------------------------------------*/\r\n#ifdef SOFTFLOAT_FAST_INT64\r\nuint_fast32_t f128_to_ui32( struct softfloat_state *, float128_t, uint_fast8_t, bool );\r\nuint_fast64_t f128_to_ui64( struct softfloat_state *, float128_t, uint_fast8_t, bool );\r\nint_fast32_t f128_to_i32( struct softfloat_state *, float128_t, uint_fast8_t, bool );\r\nint_fast64_t f128_to_i64( struct softfloat_state *, float128_t, uint_fast8_t, bool );\r\nuint_fast32_t f128_to_ui32_r_minMag( float128_t, bool );\r\nuint_fast64_t f128_to_ui64_r_minMag( float128_t, bool );\r\nint_fast32_t f128_to_i32_r_minMag( float128_t, bool );\r\nint_fast64_t f128_to_i64_r_minMag( float128_t, bool );\r\nfloat16_t f128_to_f16( struct softfloat_state *, float128_t );\r\nfloat32_t f128_to_f32( struct softfloat_state *, float128_t );\r\nfloat64_t f128_to_f64( struct softfloat_state *, float128_t );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t f128_to_extF80( struct softfloat_state *, float128_t );\r\nfloat128_t f128_roundToInt( float128_t, uint_fast8_t, bool );\r\nfloat128_t f128_add( struct softfloat_state *, float128_t, float128_t );\r\nfloat128_t f128_sub( struct softfloat_state *, float128_t, float128_t );\r\nfloat128_t f128_mul( struct softfloat_state *, float128_t, float128_t );\r\nfloat128_t f128_mulAdd( struct softfloat_state *, float128_t, float128_t, float128_t );\r\nfloat128_t f128_div( struct softfloat_state *, float128_t, float128_t );\r\nfloat128_t f128_rem( struct softfloat_state *, float128_t, float128_t );\r\nfloat128_t f128_sqrt( struct softfloat_state *, float128_t );\r\nbool f128_eq( struct softfloat_state *, float128_t, float128_t );\r\nbool f128_le( struct softfloat_state *, float128_t, float128_t );\r\nbool f128_lt( struct softfloat_state *, float128_t, float128_t );\r\nbool f128_eq_signaling( struct softfloat_state *, float128_t, float128_t );\r\nbool f128_le_quiet( struct softfloat_state *, float128_t, float128_t );\r\nbool f128_lt_quiet( struct softfloat_state *, float128_t, float128_t );\r\nbool f128_isSignalingNaN( float128_t );\r\nstatic inline float128_t f128_complement_sign(float128_t a) {\r\n  a.v[1] ^= 1ULL << 63;\r\n  return a;\r\n}\r\n#endif\r\nuint_fast32_t f128M_to_ui32( const float128_t *, uint_fast8_t, bool );\r\nuint_fast64_t f128M_to_ui64( const float128_t *, uint_fast8_t, bool );\r\nint_fast32_t f128M_to_i32( const float128_t *, uint_fast8_t, bool );\r\nint_fast64_t f128M_to_i64( const float128_t *, uint_fast8_t, bool );\r\nuint_fast32_t f128M_to_ui32_r_minMag( const float128_t *, bool );\r\nuint_fast64_t f128M_to_ui64_r_minMag( const float128_t *, bool );\r\nint_fast32_t f128M_to_i32_r_minMag( const float128_t *, bool );\r\nint_fast64_t f128M_to_i64_r_minMag( const float128_t *, bool );\r\nfloat16_t f128M_to_f16( const float128_t * );\r\nfloat32_t f128M_to_f32( const float128_t * );\r\nfloat64_t f128M_to_f64( const float128_t * );\r\nvoid f128M_to_extF80M( const float128_t *, extFloat80_t * );\r\nvoid f128M_roundToInt( const float128_t *, uint_fast8_t, bool, float128_t * );\r\nvoid f128M_add( const float128_t *, const float128_t *, float128_t * );\r\nvoid f128M_sub( const float128_t *, const float128_t *, float128_t * );\r\nvoid f128M_mul( const float128_t *, const float128_t *, float128_t * );\r\nvoid\r\n f128M_mulAdd(\r\n     const float128_t *, const float128_t *, const float128_t *, float128_t *\r\n );\r\nvoid f128M_div( const float128_t *, const float128_t *, float128_t * );\r\nvoid f128M_rem( const float128_t *, const float128_t *, float128_t * );\r\nvoid f128M_sqrt( const float128_t *, float128_t * );\r\nbool f128M_eq( const float128_t *, const float128_t * );\r\nbool f128M_le( const float128_t *, const float128_t * );\r\nbool f128M_lt( const float128_t *, const float128_t * );\r\nbool f128M_eq_signaling( const float128_t *, const float128_t * );\r\nbool f128M_le_quiet( const float128_t *, const float128_t * );\r\nbool f128M_lt_quiet( const float128_t *, const float128_t * );\r\nbool f128M_isSignalingNaN( const float128_t * );\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/include/SoftFloat-3e/softfloat_types.h",
    "content": "\r\n/*============================================================================\r\n\r\nThis C header file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2017 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#ifndef softfloat_types_h\r\n#define softfloat_types_h 1\r\n\r\n#include <stdint.h>\r\n\r\n/*----------------------------------------------------------------------------\r\n| Types used to pass 16-bit, 32-bit, 64-bit, and 128-bit floating-point\r\n| arguments and results to/from functions.  These types must be exactly\r\n| 16 bits, 32 bits, 64 bits, and 128 bits in size, respectively.  Where a\r\n| platform has \"native\" support for IEEE-Standard floating-point formats,\r\n| the types below may, if desired, be defined as aliases for the native types\r\n| (typically 'float' and 'double', and possibly 'long double').\r\n*----------------------------------------------------------------------------*/\r\ntypedef struct { uint16_t v; } float16_t;\r\ntypedef struct { uint32_t v; } float32_t;\r\ntypedef struct { uint64_t v; } float64_t;\r\ntypedef struct { uint64_t v[2]; } float128_t;\r\n\r\n/*----------------------------------------------------------------------------\r\n| The format of an 80-bit extended floating-point number in memory.  This\r\n| structure must contain a 16-bit field named 'signExp' and a 64-bit field\r\n| named 'signif'.\r\n*----------------------------------------------------------------------------*/\r\n#ifdef LITTLEENDIAN\r\nstruct extFloat80M { uint64_t signif; uint16_t signExp; };\r\n#else\r\nstruct extFloat80M { uint16_t signExp; uint64_t signif; };\r\n#endif\r\n\r\n/*----------------------------------------------------------------------------\r\n| The type used to pass 80-bit extended floating-point arguments and\r\n| results to/from functions.  This type must have size identical to\r\n| 'struct extFloat80M'.  Type 'extFloat80_t' can be defined as an alias for\r\n| 'struct extFloat80M'.  Alternatively, if a platform has \"native\" support\r\n| for IEEE-Standard 80-bit extended floating-point, it may be possible,\r\n| if desired, to define 'extFloat80_t' as an alias for the native type\r\n| (presumably either 'long double' or a nonstandard compiler-intrinsic type).\r\n| In that case, the 'signif' and 'signExp' fields of 'struct extFloat80M'\r\n| must align exactly with the locations in memory of the sign, exponent, and\r\n| significand of the native type.\r\n*----------------------------------------------------------------------------*/\r\ntypedef struct extFloat80M extFloat80_t;\r\n\r\nenum {\r\n    softfloat_tininess_beforeRounding = 0,\r\n    softfloat_tininess_afterRounding  = 1\r\n};\r\n\r\nenum {\r\n    softfloat_round_near_even   = 0,\r\n    softfloat_round_minMag      = 1,\r\n    softfloat_round_min         = 2,\r\n    softfloat_round_max         = 3,\r\n    softfloat_round_near_maxMag = 4,\r\n    softfloat_round_odd         = 6\r\n};\r\n\r\nenum {\r\n    softfloat_flag_inexact   =  1,\r\n    softfloat_flag_underflow =  2,\r\n    softfloat_flag_overflow  =  4,\r\n    softfloat_flag_infinite  =  8,\r\n    softfloat_flag_invalid   = 16\r\n};\r\n\r\nstruct softfloat_state {\r\n/*----------------------------------------------------------------------------\r\n| Software floating-point underflow tininess-detection mode.\r\n*----------------------------------------------------------------------------*/\r\nuint8_t detectTininess; /* = init_detectTininess */\r\n/*----------------------------------------------------------------------------\r\n| Software floating-point rounding mode.  (Mode \"odd\" is supported only if\r\n| SoftFloat is compiled with macro 'SOFTFLOAT_ROUND_ODD' defined.)\r\n*----------------------------------------------------------------------------*/\r\nuint8_t roundingMode; /* = softfloat_round_near_even */\r\n\r\n/*----------------------------------------------------------------------------\r\n| Software floating-point exception flags.\r\n*----------------------------------------------------------------------------*/\r\nuint8_t exceptionFlags; /* = 0 */\r\n\r\n/*----------------------------------------------------------------------------\r\n| Rounding precision for 80-bit extended double-precision floating-point.\r\n| Valid values are 32, 64, and 80.\r\n*----------------------------------------------------------------------------*/\r\nuint8_t roundingPrecision; /* = 80 */\r\n};\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_add.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t extF80_add( struct softfloat_state *state, extFloat80_t a, extFloat80_t b )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64;\r\n    uint_fast64_t uiA0;\r\n    bool signA;\r\n    union { struct extFloat80M s; extFloat80_t f; } uB;\r\n    uint_fast16_t uiB64;\r\n    uint_fast64_t uiB0;\r\n    bool signB;\r\n    extFloat80_t\r\n        (*magsFuncPtr)(\r\n            struct softfloat_state *, uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool );\r\n\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    uiA0  = uA.s.signif;\r\n    signA = signExtF80UI64( uiA64 );\r\n    uB.f = b;\r\n    uiB64 = uB.s.signExp;\r\n    uiB0  = uB.s.signif;\r\n    signB = signExtF80UI64( uiB64 );\r\n    magsFuncPtr =\r\n        (signA == signB) ? softfloat_addMagsExtF80 : softfloat_subMagsExtF80;\r\n    return (*magsFuncPtr)( state, uiA64, uiA0, uiB64, uiB0, signA );\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_div.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t extF80_div( struct softfloat_state *state, extFloat80_t a, extFloat80_t b )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64;\r\n    uint_fast64_t uiA0;\r\n    bool signA;\r\n    int_fast32_t expA;\r\n    uint_fast64_t sigA;\r\n    union { struct extFloat80M s; extFloat80_t f; } uB;\r\n    uint_fast16_t uiB64;\r\n    uint_fast64_t uiB0;\r\n    bool signB;\r\n    int_fast32_t expB;\r\n    uint_fast64_t sigB;\r\n    bool signZ;\r\n    struct exp32_sig64 normExpSig;\r\n    int_fast32_t expZ;\r\n    struct uint128 rem;\r\n    uint_fast32_t recip32;\r\n    uint_fast64_t sigZ;\r\n    int ix;\r\n    uint_fast64_t q64;\r\n    uint_fast32_t q;\r\n    struct uint128 term;\r\n    uint_fast64_t sigZExtra;\r\n    struct uint128 uiZ;\r\n    uint_fast16_t uiZ64;\r\n    uint_fast64_t uiZ0;\r\n    union { struct extFloat80M s; extFloat80_t f; } uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    uiA0  = uA.s.signif;\r\n    signA = signExtF80UI64( uiA64 );\r\n    expA  = expExtF80UI64( uiA64 );\r\n    sigA  = uiA0;\r\n    uB.f = b;\r\n    uiB64 = uB.s.signExp;\r\n    uiB0  = uB.s.signif;\r\n    signB = signExtF80UI64( uiB64 );\r\n    expB  = expExtF80UI64( uiB64 );\r\n    sigB  = uiB0;\r\n    signZ = signA ^ signB;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( expA == 0x7FFF ) {\r\n        if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;\r\n        if ( expB == 0x7FFF ) {\r\n            if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;\r\n            goto invalid;\r\n        }\r\n        goto infinity;\r\n    }\r\n    if ( expB == 0x7FFF ) {\r\n        if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;\r\n        goto zero;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( ! expB ) expB = 1;\r\n    if ( ! (sigB & UINT64_C( 0x8000000000000000 )) ) {\r\n        if ( ! sigB ) {\r\n            if ( ! sigA ) goto invalid;\r\n            softfloat_raiseFlags( state, softfloat_flag_infinite );\r\n            goto infinity;\r\n        }\r\n        normExpSig = softfloat_normSubnormalExtF80Sig( sigB );\r\n        expB += normExpSig.exp;\r\n        sigB = normExpSig.sig;\r\n    }\r\n    if ( ! expA ) expA = 1;\r\n    if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {\r\n        if ( ! sigA ) goto zero;\r\n        normExpSig = softfloat_normSubnormalExtF80Sig( sigA );\r\n        expA += normExpSig.exp;\r\n        sigA = normExpSig.sig;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    expZ = expA - expB + 0x3FFF;\r\n    if ( sigA < sigB ) {\r\n        --expZ;\r\n        rem = softfloat_shortShiftLeft128( 0, sigA, 32 );\r\n    } else {\r\n        rem = softfloat_shortShiftLeft128( 0, sigA, 31 );\r\n    }\r\n    recip32 = softfloat_approxRecip32_1( sigB>>32 );\r\n    sigZ = 0;\r\n    ix = 2;\r\n    for (;;) {\r\n        q64 = (uint_fast64_t) (uint32_t) (rem.v64>>2) * recip32;\r\n        q = (q64 + 0x80000000)>>32;\r\n        --ix;\r\n        if ( ix < 0 ) break;\r\n        rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );\r\n        term = softfloat_mul64ByShifted32To128( sigB, q );\r\n        rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );\r\n        if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {\r\n            --q;\r\n            rem = softfloat_add128( rem.v64, rem.v0, sigB>>32, sigB<<32 );\r\n        }\r\n        sigZ = (sigZ<<29) + q;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( ((q + 1) & 0x3FFFFF) < 2 ) {\r\n        rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );\r\n        term = softfloat_mul64ByShifted32To128( sigB, q );\r\n        rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );\r\n        term = softfloat_shortShiftLeft128( 0, sigB, 32 );\r\n        if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {\r\n            --q;\r\n            rem = softfloat_add128( rem.v64, rem.v0, term.v64, term.v0 );\r\n        } else if ( softfloat_le128( term.v64, term.v0, rem.v64, rem.v0 ) ) {\r\n            ++q;\r\n            rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );\r\n        }\r\n        if ( rem.v64 | rem.v0 ) q |= 1;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    sigZ = (sigZ<<6) + (q>>23);\r\n    sigZExtra = (uint64_t) ((uint_fast64_t) q<<41);\r\n    return\r\n        softfloat_roundPackToExtF80(\r\n            state, signZ, expZ, sigZ, sigZExtra, state->roundingPrecision );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n propagateNaN:\r\n    uiZ = softfloat_propagateNaNExtF80UI( state, uiA64, uiA0, uiB64, uiB0 );\r\n    uiZ64 = uiZ.v64;\r\n    uiZ0  = uiZ.v0;\r\n    goto uiZ;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n invalid:\r\n    softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n    uiZ64 = defaultNaNExtF80UI64;\r\n    uiZ0  = defaultNaNExtF80UI0;\r\n    goto uiZ;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n infinity:\r\n    uiZ64 = packToExtF80UI64( signZ, 0x7FFF );\r\n    uiZ0  = UINT64_C( 0x8000000000000000 );\r\n    goto uiZ;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n zero:\r\n    uiZ64 = packToExtF80UI64( signZ, 0 );\r\n    uiZ0  = 0;\r\n uiZ:\r\n    uZ.s.signExp = uiZ64;\r\n    uZ.s.signif  = uiZ0;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_eq.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nbool extF80_eq( struct softfloat_state *state, extFloat80_t a, extFloat80_t b )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64;\r\n    uint_fast64_t uiA0;\r\n    union { struct extFloat80M s; extFloat80_t f; } uB;\r\n    uint_fast16_t uiB64;\r\n    uint_fast64_t uiB0;\r\n\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    uiA0  = uA.s.signif;\r\n    uB.f = b;\r\n    uiB64 = uB.s.signExp;\r\n    uiB0  = uB.s.signif;\r\n    if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {\r\n        if (\r\n               softfloat_isSigNaNExtF80UI( uiA64, uiA0 )\r\n            || softfloat_isSigNaNExtF80UI( uiB64, uiB0 )\r\n        ) {\r\n            softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        }\r\n        return false;\r\n    }\r\n    return\r\n           (uiA0 == uiB0)\r\n        && ((uiA64 == uiB64) || (! uiA0 && ! ((uiA64 | uiB64) & 0x7FFF)));\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_le.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nbool extF80_le( struct softfloat_state *state, extFloat80_t a, extFloat80_t b )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64;\r\n    uint_fast64_t uiA0;\r\n    union { struct extFloat80M s; extFloat80_t f; } uB;\r\n    uint_fast16_t uiB64;\r\n    uint_fast64_t uiB0;\r\n    bool signA, signB;\r\n\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    uiA0  = uA.s.signif;\r\n    uB.f = b;\r\n    uiB64 = uB.s.signExp;\r\n    uiB0  = uB.s.signif;\r\n    if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        return false;\r\n    }\r\n    signA = signExtF80UI64( uiA64 );\r\n    signB = signExtF80UI64( uiB64 );\r\n    return\r\n        (signA != signB)\r\n            ? signA || ! (((uiA64 | uiB64) & 0x7FFF) | uiA0 | uiB0)\r\n            : ((uiA64 == uiB64) && (uiA0 == uiB0))\r\n                  || (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_lt.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nbool extF80_lt( struct softfloat_state *state, extFloat80_t a, extFloat80_t b )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64;\r\n    uint_fast64_t uiA0;\r\n    union { struct extFloat80M s; extFloat80_t f; } uB;\r\n    uint_fast16_t uiB64;\r\n    uint_fast64_t uiB0;\r\n    bool signA, signB;\r\n\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    uiA0  = uA.s.signif;\r\n    uB.f = b;\r\n    uiB64 = uB.s.signExp;\r\n    uiB0  = uB.s.signif;\r\n    if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        return false;\r\n    }\r\n    signA = signExtF80UI64( uiA64 );\r\n    signB = signExtF80UI64( uiB64 );\r\n    return\r\n        (signA != signB)\r\n            ? signA && (((uiA64 | uiB64) & 0x7FFF) | uiA0 | uiB0)\r\n            : ((uiA64 != uiB64) || (uiA0 != uiB0))\r\n                  && (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_mul.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t extF80_mul( struct softfloat_state *state, extFloat80_t a, extFloat80_t b )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64;\r\n    uint_fast64_t uiA0;\r\n    bool signA;\r\n    int_fast32_t expA;\r\n    uint_fast64_t sigA;\r\n    union { struct extFloat80M s; extFloat80_t f; } uB;\r\n    uint_fast16_t uiB64;\r\n    uint_fast64_t uiB0;\r\n    bool signB;\r\n    int_fast32_t expB;\r\n    uint_fast64_t sigB;\r\n    bool signZ;\r\n    uint_fast64_t magBits;\r\n    struct exp32_sig64 normExpSig;\r\n    int_fast32_t expZ;\r\n    struct uint128 sig128Z, uiZ;\r\n    uint_fast16_t uiZ64;\r\n    uint_fast64_t uiZ0;\r\n    union { struct extFloat80M s; extFloat80_t f; } uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    uiA0  = uA.s.signif;\r\n    signA = signExtF80UI64( uiA64 );\r\n    expA  = expExtF80UI64( uiA64 );\r\n    sigA  = uiA0;\r\n    uB.f = b;\r\n    uiB64 = uB.s.signExp;\r\n    uiB0  = uB.s.signif;\r\n    signB = signExtF80UI64( uiB64 );\r\n    expB  = expExtF80UI64( uiB64 );\r\n    sigB  = uiB0;\r\n    signZ = signA ^ signB;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( expA == 0x7FFF ) {\r\n        if (\r\n               (sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ))\r\n            || ((expB == 0x7FFF) && (sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF )))\r\n        ) {\r\n            goto propagateNaN;\r\n        }\r\n        magBits = expB | sigB;\r\n        goto infArg;\r\n    }\r\n    if ( expB == 0x7FFF ) {\r\n        if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;\r\n        magBits = expA | sigA;\r\n        goto infArg;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( ! expA ) expA = 1;\r\n    if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {\r\n        if ( ! sigA ) goto zero;\r\n        normExpSig = softfloat_normSubnormalExtF80Sig( sigA );\r\n        expA += normExpSig.exp;\r\n        sigA = normExpSig.sig;\r\n    }\r\n    if ( ! expB ) expB = 1;\r\n    if ( ! (sigB & UINT64_C( 0x8000000000000000 )) ) {\r\n        if ( ! sigB ) goto zero;\r\n        normExpSig = softfloat_normSubnormalExtF80Sig( sigB );\r\n        expB += normExpSig.exp;\r\n        sigB = normExpSig.sig;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    expZ = expA + expB - 0x3FFE;\r\n    sig128Z = softfloat_mul64To128( sigA, sigB );\r\n    if ( sig128Z.v64 < UINT64_C( 0x8000000000000000 ) ) {\r\n        --expZ;\r\n        sig128Z =\r\n            softfloat_add128(\r\n                sig128Z.v64, sig128Z.v0, sig128Z.v64, sig128Z.v0 );\r\n    }\r\n    return\r\n        softfloat_roundPackToExtF80(\r\n            state, signZ, expZ, sig128Z.v64, sig128Z.v0, state->roundingPrecision );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n propagateNaN:\r\n    uiZ = softfloat_propagateNaNExtF80UI( state, uiA64, uiA0, uiB64, uiB0 );\r\n    uiZ64 = uiZ.v64;\r\n    uiZ0  = uiZ.v0;\r\n    goto uiZ;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n infArg:\r\n    if ( ! magBits ) {\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        uiZ64 = defaultNaNExtF80UI64;\r\n        uiZ0  = defaultNaNExtF80UI0;\r\n    } else {\r\n        uiZ64 = packToExtF80UI64( signZ, 0x7FFF );\r\n        uiZ0  = UINT64_C( 0x8000000000000000 );\r\n    }\r\n    goto uiZ;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n zero:\r\n    uiZ64 = packToExtF80UI64( signZ, 0 );\r\n    uiZ0  = 0;\r\n uiZ:\r\n    uZ.s.signExp = uiZ64;\r\n    uZ.s.signif  = uiZ0;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_rem.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t extF80_rem( struct softfloat_state *state, extFloat80_t a, extFloat80_t b )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64;\r\n    uint_fast64_t uiA0;\r\n    bool signA;\r\n    int_fast32_t expA;\r\n    uint_fast64_t sigA;\r\n    union { struct extFloat80M s; extFloat80_t f; } uB;\r\n    uint_fast16_t uiB64;\r\n    uint_fast64_t uiB0;\r\n    int_fast32_t expB;\r\n    uint_fast64_t sigB;\r\n    struct exp32_sig64 normExpSig;\r\n    int_fast32_t expDiff;\r\n    struct uint128 rem, shiftedSigB;\r\n    uint_fast32_t q, recip32;\r\n    uint_fast64_t q64;\r\n    struct uint128 term, altRem, meanRem;\r\n    bool signRem;\r\n    struct uint128 uiZ;\r\n    uint_fast16_t uiZ64;\r\n    uint_fast64_t uiZ0;\r\n    union { struct extFloat80M s; extFloat80_t f; } uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    uiA0  = uA.s.signif;\r\n    signA = signExtF80UI64( uiA64 );\r\n    expA  = expExtF80UI64( uiA64 );\r\n    sigA  = uiA0;\r\n    uB.f = b;\r\n    uiB64 = uB.s.signExp;\r\n    uiB0  = uB.s.signif;\r\n    expB  = expExtF80UI64( uiB64 );\r\n    sigB  = uiB0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( expA == 0x7FFF ) {\r\n        if (\r\n               (sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ))\r\n            || ((expB == 0x7FFF) && (sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF )))\r\n        ) {\r\n            goto propagateNaN;\r\n        }\r\n        goto invalid;\r\n    }\r\n    if ( expB == 0x7FFF ) {\r\n        if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;\r\n        /*--------------------------------------------------------------------\r\n        | Argument b is an infinity.  Doubling `expB' is an easy way to ensure\r\n        | that `expDiff' later is less than -1, which will result in returning\r\n        | a canonicalized version of argument a.\r\n        *--------------------------------------------------------------------*/\r\n        expB += expB;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( ! expB ) expB = 1;\r\n    if ( ! (sigB & UINT64_C( 0x8000000000000000 )) ) {\r\n        if ( ! sigB ) goto invalid;\r\n        normExpSig = softfloat_normSubnormalExtF80Sig( sigB );\r\n        expB += normExpSig.exp;\r\n        sigB = normExpSig.sig;\r\n    }\r\n    if ( ! expA ) expA = 1;\r\n    if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {\r\n        if ( ! sigA ) {\r\n            expA = 0;\r\n            goto copyA;\r\n        }\r\n        normExpSig = softfloat_normSubnormalExtF80Sig( sigA );\r\n        expA += normExpSig.exp;\r\n        sigA = normExpSig.sig;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    expDiff = expA - expB;\r\n    if ( expDiff < -1 ) goto copyA;\r\n    rem = softfloat_shortShiftLeft128( 0, sigA, 32 );\r\n    shiftedSigB = softfloat_shortShiftLeft128( 0, sigB, 32 );\r\n    if ( expDiff < 1 ) {\r\n        if ( expDiff ) {\r\n            --expB;\r\n            shiftedSigB = softfloat_shortShiftLeft128( 0, sigB, 33 );\r\n            q = 0;\r\n        } else {\r\n            q = (sigB <= sigA);\r\n            if ( q ) {\r\n                rem =\r\n                    softfloat_sub128(\r\n                        rem.v64, rem.v0, shiftedSigB.v64, shiftedSigB.v0 );\r\n            }\r\n        }\r\n    } else {\r\n        recip32 = softfloat_approxRecip32_1( sigB>>32 );\r\n        expDiff -= 30;\r\n        for (;;) {\r\n            q64 = (uint_fast64_t) (uint32_t) (rem.v64>>2) * recip32;\r\n            if ( expDiff < 0 ) break;\r\n            q = (q64 + 0x80000000)>>32;\r\n            rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );\r\n            term = softfloat_mul64ByShifted32To128( sigB, q );\r\n            rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );\r\n            if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {\r\n                rem =\r\n                    softfloat_add128(\r\n                        rem.v64, rem.v0, shiftedSigB.v64, shiftedSigB.v0 );\r\n            }\r\n            expDiff -= 29;\r\n        }\r\n        /*--------------------------------------------------------------------\r\n        | (`expDiff' cannot be less than -29 here.)\r\n        *--------------------------------------------------------------------*/\r\n        q = (uint32_t) (q64>>32)>>(~expDiff & 31);\r\n        rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, expDiff + 30 );\r\n        term = softfloat_mul64ByShifted32To128( sigB, q );\r\n        rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );\r\n        if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {\r\n            altRem =\r\n                softfloat_add128(\r\n                    rem.v64, rem.v0, shiftedSigB.v64, shiftedSigB.v0 );\r\n            goto selectRem;\r\n        }\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    do {\r\n        altRem = rem;\r\n        ++q;\r\n        rem =\r\n            softfloat_sub128(\r\n                rem.v64, rem.v0, shiftedSigB.v64, shiftedSigB.v0 );\r\n    } while ( ! (rem.v64 & UINT64_C( 0x8000000000000000 )) );\r\n selectRem:\r\n    meanRem = softfloat_add128( rem.v64, rem.v0, altRem.v64, altRem.v0 );\r\n    if (\r\n        (meanRem.v64 & UINT64_C( 0x8000000000000000 ))\r\n            || (! (meanRem.v64 | meanRem.v0) && (q & 1))\r\n    ) {\r\n        rem = altRem;\r\n    }\r\n    signRem = signA;\r\n    if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {\r\n        signRem = ! signRem;\r\n        rem = softfloat_sub128( 0, 0, rem.v64, rem.v0 );\r\n    }\r\n    return\r\n        softfloat_normRoundPackToExtF80(\r\n            state, signRem, rem.v64 | rem.v0 ? expB + 32 : 0, rem.v64, rem.v0, 80 );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n propagateNaN:\r\n    uiZ = softfloat_propagateNaNExtF80UI( state, uiA64, uiA0, uiB64, uiB0 );\r\n    uiZ64 = uiZ.v64;\r\n    uiZ0  = uiZ.v0;\r\n    goto uiZ;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n invalid:\r\n    softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n    uiZ64 = defaultNaNExtF80UI64;\r\n    uiZ0  = defaultNaNExtF80UI0;\r\n    goto uiZ;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n copyA:\r\n    if ( expA < 1 ) {\r\n        sigA >>= 1 - expA;\r\n        expA = 0;\r\n    }\r\n    uiZ64 = packToExtF80UI64( signA, expA );\r\n    uiZ0  = sigA;\r\n uiZ:\r\n    uZ.s.signExp = uiZ64;\r\n    uZ.s.signif  = uiZ0;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_roundToInt.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2017 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t\r\n extF80_roundToInt( struct softfloat_state *state, extFloat80_t a, uint_fast8_t roundingMode, bool exact )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64, signUI64;\r\n    int_fast32_t exp;\r\n    uint_fast64_t sigA;\r\n    uint_fast16_t uiZ64;\r\n    uint_fast64_t sigZ;\r\n    struct exp32_sig64 normExpSig;\r\n    struct uint128 uiZ;\r\n    uint_fast64_t lastBitMask, roundBitsMask;\r\n    union { struct extFloat80M s; extFloat80_t f; } uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    signUI64 = uiA64 & packToExtF80UI64( 1, 0 );\r\n    exp = expExtF80UI64( uiA64 );\r\n    sigA = uA.s.signif;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( !(sigA & UINT64_C( 0x8000000000000000 )) && (exp != 0x7FFF) ) {\r\n        if ( !sigA ) {\r\n            uiZ64 = signUI64;\r\n            sigZ = 0;\r\n            goto uiZ;\r\n        }\r\n        normExpSig = softfloat_normSubnormalExtF80Sig( sigA );\r\n        exp += normExpSig.exp;\r\n        sigA = normExpSig.sig;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( 0x403E <= exp ) {\r\n        if ( exp == 0x7FFF ) {\r\n            if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {\r\n                uiZ = softfloat_propagateNaNExtF80UI( state, uiA64, sigA, 0, 0 );\r\n                uiZ64 = uiZ.v64;\r\n                sigZ  = uiZ.v0;\r\n                goto uiZ;\r\n            }\r\n            sigZ = UINT64_C( 0x8000000000000000 );\r\n        } else {\r\n            sigZ = sigA;\r\n        }\r\n        uiZ64 = signUI64 | exp;\r\n        goto uiZ;\r\n    }\r\n    if ( exp <= 0x3FFE ) {\r\n        if ( exact ) state->exceptionFlags |= softfloat_flag_inexact;\r\n        switch ( roundingMode ) {\r\n         case softfloat_round_near_even:\r\n            if ( !(sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ) break;\r\n            __attribute__((fallthrough));\r\n         case softfloat_round_near_maxMag:\r\n            if ( exp == 0x3FFE ) goto mag1;\r\n            break;\r\n         case softfloat_round_min:\r\n            if ( signUI64 ) goto mag1;\r\n            break;\r\n         case softfloat_round_max:\r\n            if ( !signUI64 ) goto mag1;\r\n            break;\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n         case softfloat_round_odd:\r\n            goto mag1;\r\n#endif\r\n        }\r\n        uiZ64 = signUI64;\r\n        sigZ  = 0;\r\n        goto uiZ;\r\n     mag1:\r\n        uiZ64 = signUI64 | 0x3FFF;\r\n        sigZ  = UINT64_C( 0x8000000000000000 );\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uiZ64 = signUI64 | exp;\r\n    lastBitMask = (uint_fast64_t) 1<<(0x403E - exp);\r\n    roundBitsMask = lastBitMask - 1;\r\n    sigZ = sigA;\r\n    if ( roundingMode == softfloat_round_near_maxMag ) {\r\n        sigZ += lastBitMask>>1;\r\n    } else if ( roundingMode == softfloat_round_near_even ) {\r\n        sigZ += lastBitMask>>1;\r\n        if ( !(sigZ & roundBitsMask) ) sigZ &= ~lastBitMask;\r\n    } else if (\r\n        roundingMode == (signUI64 ? softfloat_round_min : softfloat_round_max)\r\n    ) {\r\n        sigZ += roundBitsMask;\r\n    }\r\n    sigZ &= ~roundBitsMask;\r\n    if ( !sigZ ) {\r\n        ++uiZ64;\r\n        sigZ = UINT64_C( 0x8000000000000000 );\r\n    }\r\n    if ( sigZ != sigA ) {\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n        if ( roundingMode == softfloat_round_odd ) sigZ |= lastBitMask;\r\n#endif\r\n        if ( exact ) state->exceptionFlags |= softfloat_flag_inexact;\r\n    }\r\n uiZ:\r\n    uZ.s.signExp = uiZ64;\r\n    uZ.s.signif = sigZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_sqrt.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t extF80_sqrt( struct softfloat_state *state, extFloat80_t a )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64;\r\n    uint_fast64_t uiA0;\r\n    bool signA;\r\n    int_fast32_t expA;\r\n    uint_fast64_t sigA;\r\n    struct uint128 uiZ;\r\n    uint_fast16_t uiZ64;\r\n    uint_fast64_t uiZ0;\r\n    struct exp32_sig64 normExpSig;\r\n    int_fast32_t expZ;\r\n    uint_fast32_t sig32A, recipSqrt32, sig32Z;\r\n    struct uint128 rem;\r\n    uint_fast64_t q, x64, sigZ;\r\n    struct uint128 y, term;\r\n    uint_fast64_t sigZExtra;\r\n    union { struct extFloat80M s; extFloat80_t f; } uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    uiA0  = uA.s.signif;\r\n    signA = signExtF80UI64( uiA64 );\r\n    expA  = expExtF80UI64( uiA64 );\r\n    sigA  = uiA0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( expA == 0x7FFF ) {\r\n        if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {\r\n            uiZ = softfloat_propagateNaNExtF80UI( state, uiA64, uiA0, 0, 0 );\r\n            uiZ64 = uiZ.v64;\r\n            uiZ0  = uiZ.v0;\r\n            goto uiZ;\r\n        }\r\n        if ( ! signA ) return a;\r\n        goto invalid;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( signA ) {\r\n        if ( ! sigA ) goto zero;\r\n        goto invalid;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( ! expA ) expA = 1;\r\n    if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {\r\n        if ( ! sigA ) goto zero;\r\n        normExpSig = softfloat_normSubnormalExtF80Sig( sigA );\r\n        expA += normExpSig.exp;\r\n        sigA = normExpSig.sig;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    | (`sig32Z' is guaranteed to be a lower bound on the square root of\r\n    | `sig32A', which makes `sig32Z' also a lower bound on the square root of\r\n    | `sigA'.)\r\n    *------------------------------------------------------------------------*/\r\n    expZ = ((expA - 0x3FFF)>>1) + 0x3FFF;\r\n    expA &= 1;\r\n    sig32A = sigA>>32;\r\n    recipSqrt32 = softfloat_approxRecipSqrt32_1( expA, sig32A );\r\n    sig32Z = ((uint_fast64_t) sig32A * recipSqrt32)>>32;\r\n    if ( expA ) {\r\n        sig32Z >>= 1;\r\n        rem = softfloat_shortShiftLeft128( 0, sigA, 61 );\r\n    } else {\r\n        rem = softfloat_shortShiftLeft128( 0, sigA, 62 );\r\n    }\r\n    rem.v64 -= (uint_fast64_t) sig32Z * sig32Z;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    q = ((uint32_t) (rem.v64>>2) * (uint_fast64_t) recipSqrt32)>>32;\r\n    x64 = (uint_fast64_t) sig32Z<<32;\r\n    sigZ = x64 + (q<<3);\r\n    y = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );\r\n    /*------------------------------------------------------------------------\r\n    | (Repeating this loop is a rare occurrence.)\r\n    *------------------------------------------------------------------------*/\r\n    for (;;) {\r\n        term = softfloat_mul64ByShifted32To128( x64 + sigZ, q );\r\n        rem = softfloat_sub128( y.v64, y.v0, term.v64, term.v0 );\r\n        if ( ! (rem.v64 & UINT64_C( 0x8000000000000000 )) ) break;\r\n        --q;\r\n        sigZ -= 1<<3;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    q = (((rem.v64>>2) * recipSqrt32)>>32) + 2;\r\n    x64 = sigZ;\r\n    sigZ = (sigZ<<1) + (q>>25);\r\n    sigZExtra = (uint64_t) (q<<39);\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( (q & 0xFFFFFF) <= 2 ) {\r\n        q &= ~(uint_fast64_t) 0xFFFF;\r\n        sigZExtra = (uint64_t) (q<<39);\r\n        term = softfloat_mul64ByShifted32To128( x64 + (q>>27), q );\r\n        x64 = (uint32_t) (q<<5) * (uint_fast64_t) (uint32_t) q;\r\n        term = softfloat_add128( term.v64, term.v0, 0, x64 );\r\n        rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 28 );\r\n        rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );\r\n        if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {\r\n            if ( ! sigZExtra ) --sigZ;\r\n            --sigZExtra;\r\n        } else {\r\n            if ( rem.v64 | rem.v0 ) sigZExtra |= 1;\r\n        }\r\n    }\r\n    return\r\n        softfloat_roundPackToExtF80(\r\n            state, 0, expZ, sigZ, sigZExtra, state->roundingPrecision );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n invalid:\r\n    softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n    uiZ64 = defaultNaNExtF80UI64;\r\n    uiZ0  = defaultNaNExtF80UI0;\r\n    goto uiZ;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n zero:\r\n    uiZ64 = packToExtF80UI64( signA, 0 );\r\n    uiZ0  = 0;\r\n uiZ:\r\n    uZ.s.signExp = uiZ64;\r\n    uZ.s.signif  = uiZ0;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_sub.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t extF80_sub( struct softfloat_state *state, extFloat80_t a, extFloat80_t b )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64;\r\n    uint_fast64_t uiA0;\r\n    bool signA;\r\n    union { struct extFloat80M s; extFloat80_t f; } uB;\r\n    uint_fast16_t uiB64;\r\n    uint_fast64_t uiB0;\r\n    bool signB;\r\n#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2)\r\n    extFloat80_t\r\n        (*magsFuncPtr)(\r\n            struct softfloat_state *, uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool );\r\n#endif\r\n\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    uiA0  = uA.s.signif;\r\n    signA = signExtF80UI64( uiA64 );\r\n    uB.f = b;\r\n    uiB64 = uB.s.signExp;\r\n    uiB0  = uB.s.signif;\r\n    signB = signExtF80UI64( uiB64 );\r\n#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)\r\n    if ( signA == signB ) {\r\n        return softfloat_subMagsExtF80( state, uiA64, uiA0, uiB64, uiB0, signA );\r\n    } else {\r\n        return softfloat_addMagsExtF80( state, uiA64, uiA0, uiB64, uiB0, signA );\r\n    }\r\n#else\r\n    magsFuncPtr =\r\n        (signA == signB) ? softfloat_subMagsExtF80 : softfloat_addMagsExtF80;\r\n    return (*magsFuncPtr)( state, uiA64, uiA0, uiB64, uiB0, signA );\r\n#endif\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_to_f128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nfloat128_t extF80_to_f128( struct softfloat_state *state, extFloat80_t a )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64;\r\n    uint_fast64_t uiA0;\r\n    uint_fast16_t exp;\r\n    uint_fast64_t frac;\r\n    struct commonNaN commonNaN;\r\n    struct uint128 uiZ;\r\n    bool sign;\r\n    struct uint128 frac128;\r\n    union ui128_f128 uZ;\r\n\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    uiA0  = uA.s.signif;\r\n    exp = expExtF80UI64( uiA64 );\r\n    frac = uiA0 & UINT64_C( 0x7FFFFFFFFFFFFFFF );\r\n    if ( (exp == 0x7FFF) && frac ) {\r\n        softfloat_extF80UIToCommonNaN( state, uiA64, uiA0, &commonNaN );\r\n        uiZ = softfloat_commonNaNToF128UI( &commonNaN );\r\n    } else {\r\n        sign = signExtF80UI64( uiA64 );\r\n        frac128 = softfloat_shortShiftLeft128( 0, frac, 49 );\r\n        uiZ.v64 = packToF128UI64( sign, exp, frac128.v64 );\r\n        uiZ.v0  = frac128.v0;\r\n    }\r\n    uZ.ui = uiZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_to_f32.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nfloat32_t extF80_to_f32( struct softfloat_state *state, extFloat80_t a )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64;\r\n    uint_fast64_t uiA0;\r\n    bool sign;\r\n    int_fast32_t exp;\r\n    uint_fast64_t sig;\r\n    struct commonNaN commonNaN;\r\n    uint_fast32_t uiZ, sig32;\r\n    union ui32_f32 uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    uiA0  = uA.s.signif;\r\n    sign = signExtF80UI64( uiA64 );\r\n    exp  = expExtF80UI64( uiA64 );\r\n    sig  = uiA0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( exp == 0x7FFF ) {\r\n        if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {\r\n            softfloat_extF80UIToCommonNaN( state, uiA64, uiA0, &commonNaN );\r\n            uiZ = softfloat_commonNaNToF32UI( &commonNaN );\r\n        } else {\r\n            uiZ = packToF32UI( sign, 0xFF, 0 );\r\n        }\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    sig32 = softfloat_shortShiftRightJam64( sig, 33 );\r\n    if ( ! (exp | sig32) ) {\r\n        uiZ = packToF32UI( sign, 0, 0 );\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    exp -= 0x3F81;\r\n    if ( sizeof (int_fast16_t) < sizeof (int_fast32_t) ) {\r\n        if ( exp < -0x1000 ) exp = -0x1000;\r\n    }\r\n    return softfloat_roundPackToF32( state, sign, exp, sig32 );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n uiZ:\r\n    uZ.ui = uiZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_to_f64.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nfloat64_t extF80_to_f64( struct softfloat_state *state, extFloat80_t a )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64;\r\n    uint_fast64_t uiA0;\r\n    bool sign;\r\n    int_fast32_t exp;\r\n    uint_fast64_t sig;\r\n    struct commonNaN commonNaN;\r\n    uint_fast64_t uiZ;\r\n    union ui64_f64 uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    uiA0  = uA.s.signif;\r\n    sign = signExtF80UI64( uiA64 );\r\n    exp  = expExtF80UI64( uiA64 );\r\n    sig  = uiA0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( ! (exp | sig) ) {\r\n        uiZ = packToF64UI( sign, 0, 0 );\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( exp == 0x7FFF ) {\r\n        if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {\r\n            softfloat_extF80UIToCommonNaN( state, uiA64, uiA0, &commonNaN );\r\n            uiZ = softfloat_commonNaNToF64UI( &commonNaN );\r\n        } else {\r\n            uiZ = packToF64UI( sign, 0x7FF, 0 );\r\n        }\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    sig = softfloat_shortShiftRightJam64( sig, 1 );\r\n    exp -= 0x3C01;\r\n    if ( sizeof (int_fast16_t) < sizeof (int_fast32_t) ) {\r\n        if ( exp < -0x1000 ) exp = -0x1000;\r\n    }\r\n    return softfloat_roundPackToF64( state, sign, exp, sig );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n uiZ:\r\n    uZ.ui = uiZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_to_i32.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nint_fast32_t\r\n extF80_to_i32( struct softfloat_state *state, extFloat80_t a, uint_fast8_t roundingMode, bool exact )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64;\r\n    bool sign;\r\n    int_fast32_t exp;\r\n    uint_fast64_t sig;\r\n    int_fast32_t shiftDist;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    sign = signExtF80UI64( uiA64 );\r\n    exp  = expExtF80UI64( uiA64 );\r\n    sig = uA.s.signif;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n#if (i32_fromNaN != i32_fromPosOverflow) || (i32_fromNaN != i32_fromNegOverflow)\r\n    if ( (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ) {\r\n#if (i32_fromNaN == i32_fromPosOverflow)\r\n        sign = 0;\r\n#elif (i32_fromNaN == i32_fromNegOverflow)\r\n        sign = 1;\r\n#else\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        return i32_fromNaN;\r\n#endif\r\n    }\r\n#endif\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    shiftDist = 0x4032 - exp;\r\n    if ( shiftDist <= 0 ) shiftDist = 1;\r\n    sig = softfloat_shiftRightJam64( sig, shiftDist );\r\n    return softfloat_roundToI32( state, sign, sig, roundingMode, exact );\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_to_i64.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nint_fast64_t\r\n extF80_to_i64( struct softfloat_state *state, extFloat80_t a, uint_fast8_t roundingMode, bool exact )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64;\r\n    bool sign;\r\n    int_fast32_t exp;\r\n    uint_fast64_t sig;\r\n    int_fast32_t shiftDist;\r\n    uint_fast64_t sigExtra;\r\n    struct uint64_extra sig64Extra;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    sign = signExtF80UI64( uiA64 );\r\n    exp  = expExtF80UI64( uiA64 );\r\n    sig = uA.s.signif;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    shiftDist = 0x403E - exp;\r\n    if ( shiftDist <= 0 ) {\r\n        /*--------------------------------------------------------------------\r\n        *--------------------------------------------------------------------*/\r\n        if ( shiftDist ) {\r\n            softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n            return\r\n                (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ))\r\n                    ? i64_fromNaN\r\n                    : sign ? i64_fromNegOverflow : i64_fromPosOverflow;\r\n        }\r\n        /*--------------------------------------------------------------------\r\n        *--------------------------------------------------------------------*/\r\n        sigExtra = 0;\r\n    } else {\r\n        /*--------------------------------------------------------------------\r\n        *--------------------------------------------------------------------*/\r\n        sig64Extra = softfloat_shiftRightJam64Extra( sig, 0, shiftDist );\r\n        sig = sig64Extra.v;\r\n        sigExtra = sig64Extra.extra;\r\n    }\r\n    return softfloat_roundToI64( state, sign, sig, sigExtra, roundingMode, exact );\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/extF80_to_ui64.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint_fast64_t\r\n extF80_to_ui64( struct softfloat_state *state, extFloat80_t a, uint_fast8_t roundingMode, bool exact )\r\n{\r\n    union { struct extFloat80M s; extFloat80_t f; } uA;\r\n    uint_fast16_t uiA64;\r\n    bool sign;\r\n    int_fast32_t exp;\r\n    uint_fast64_t sig;\r\n    int_fast32_t shiftDist;\r\n    uint_fast64_t sigExtra;\r\n    struct uint64_extra sig64Extra;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.s.signExp;\r\n    sign = signExtF80UI64( uiA64 );\r\n    exp  = expExtF80UI64( uiA64 );\r\n    sig = uA.s.signif;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    shiftDist = 0x403E - exp;\r\n    if ( shiftDist < 0 ) {\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        return\r\n            (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ))\r\n                ? ui64_fromNaN\r\n                : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    sigExtra = 0;\r\n    if ( shiftDist ) {\r\n        sig64Extra = softfloat_shiftRightJam64Extra( sig, 0, shiftDist );\r\n        sig = sig64Extra.v;\r\n        sigExtra = sig64Extra.extra;\r\n    }\r\n    return softfloat_roundToUI64( state, sign, sig, sigExtra, roundingMode, exact );\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_add.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"softfloat.h\"\r\n\r\nfloat128_t f128_add( struct softfloat_state *state, float128_t a, float128_t b )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    bool signA;\r\n    union ui128_f128 uB;\r\n    uint_fast64_t uiB64, uiB0;\r\n    bool signB;\r\n#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2)\r\n    float128_t\r\n        (*magsFuncPtr)(\r\n            uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool );\r\n#endif\r\n\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    signA = signF128UI64( uiA64 );\r\n    uB.f = b;\r\n    uiB64 = uB.ui.v64;\r\n    uiB0  = uB.ui.v0;\r\n    signB = signF128UI64( uiB64 );\r\n#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)\r\n    if ( signA == signB ) {\r\n        return softfloat_addMagsF128( state, uiA64, uiA0, uiB64, uiB0, signA );\r\n    } else {\r\n        return softfloat_subMagsF128( state, uiA64, uiA0, uiB64, uiB0, signA );\r\n    }\r\n#else\r\n    magsFuncPtr =\r\n        (signA == signB) ? softfloat_addMagsF128 : softfloat_subMagsF128;\r\n    return (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );\r\n#endif\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_div.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nfloat128_t f128_div( struct softfloat_state *state, float128_t a, float128_t b )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    bool signA;\r\n    int_fast32_t expA;\r\n    struct uint128 sigA;\r\n    union ui128_f128 uB;\r\n    uint_fast64_t uiB64, uiB0;\r\n    bool signB;\r\n    int_fast32_t expB;\r\n    struct uint128 sigB;\r\n    bool signZ;\r\n    struct exp32_sig128 normExpSig;\r\n    int_fast32_t expZ;\r\n    struct uint128 rem;\r\n    uint_fast32_t recip32;\r\n    int ix;\r\n    uint_fast64_t q64;\r\n    uint_fast32_t q;\r\n    struct uint128 term;\r\n    uint_fast32_t qs[3];\r\n    uint_fast64_t sigZExtra;\r\n    struct uint128 sigZ, uiZ;\r\n    union ui128_f128 uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    signA = signF128UI64( uiA64 );\r\n    expA  = expF128UI64( uiA64 );\r\n    sigA.v64 = fracF128UI64( uiA64 );\r\n    sigA.v0  = uiA0;\r\n    uB.f = b;\r\n    uiB64 = uB.ui.v64;\r\n    uiB0  = uB.ui.v0;\r\n    signB = signF128UI64( uiB64 );\r\n    expB  = expF128UI64( uiB64 );\r\n    sigB.v64 = fracF128UI64( uiB64 );\r\n    sigB.v0  = uiB0;\r\n    signZ = signA ^ signB;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( expA == 0x7FFF ) {\r\n        if ( sigA.v64 | sigA.v0 ) goto propagateNaN;\r\n        if ( expB == 0x7FFF ) {\r\n            if ( sigB.v64 | sigB.v0 ) goto propagateNaN;\r\n            goto invalid;\r\n        }\r\n        goto infinity;\r\n    }\r\n    if ( expB == 0x7FFF ) {\r\n        if ( sigB.v64 | sigB.v0 ) goto propagateNaN;\r\n        goto zero;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( ! expB ) {\r\n        if ( ! (sigB.v64 | sigB.v0) ) {\r\n            if ( ! (expA | sigA.v64 | sigA.v0) ) goto invalid;\r\n            softfloat_raiseFlags( state, softfloat_flag_infinite );\r\n            goto infinity;\r\n        }\r\n        normExpSig = softfloat_normSubnormalF128Sig( sigB.v64, sigB.v0 );\r\n        expB = normExpSig.exp;\r\n        sigB = normExpSig.sig;\r\n    }\r\n    if ( ! expA ) {\r\n        if ( ! (sigA.v64 | sigA.v0) ) goto zero;\r\n        normExpSig = softfloat_normSubnormalF128Sig( sigA.v64, sigA.v0 );\r\n        expA = normExpSig.exp;\r\n        sigA = normExpSig.sig;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    expZ = expA - expB + 0x3FFE;\r\n    sigA.v64 |= UINT64_C( 0x0001000000000000 );\r\n    sigB.v64 |= UINT64_C( 0x0001000000000000 );\r\n    rem = sigA;\r\n    if ( softfloat_lt128( sigA.v64, sigA.v0, sigB.v64, sigB.v0 ) ) {\r\n        --expZ;\r\n        rem = softfloat_add128( sigA.v64, sigA.v0, sigA.v64, sigA.v0 );\r\n    }\r\n    recip32 = softfloat_approxRecip32_1( sigB.v64>>17 );\r\n    ix = 3;\r\n    for (;;) {\r\n        q64 = (uint_fast64_t) (uint32_t) (rem.v64>>19) * recip32;\r\n        q = (q64 + 0x80000000)>>32;\r\n        --ix;\r\n        if ( ix < 0 ) break;\r\n        rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );\r\n        term = softfloat_mul128By32( sigB.v64, sigB.v0, q );\r\n        rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );\r\n        if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {\r\n            --q;\r\n            rem = softfloat_add128( rem.v64, rem.v0, sigB.v64, sigB.v0 );\r\n        }\r\n        qs[ix] = q;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( ((q + 1) & 7) < 2 ) {\r\n        rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );\r\n        term = softfloat_mul128By32( sigB.v64, sigB.v0, q );\r\n        rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );\r\n        if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {\r\n            --q;\r\n            rem = softfloat_add128( rem.v64, rem.v0, sigB.v64, sigB.v0 );\r\n        } else if ( softfloat_le128( sigB.v64, sigB.v0, rem.v64, rem.v0 ) ) {\r\n            ++q;\r\n            rem = softfloat_sub128( rem.v64, rem.v0, sigB.v64, sigB.v0 );\r\n        }\r\n        if ( rem.v64 | rem.v0 ) q |= 1;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    sigZExtra = (uint64_t) ((uint_fast64_t) q<<60);\r\n    term = softfloat_shortShiftLeft128( 0, qs[1], 54 );\r\n    sigZ =\r\n        softfloat_add128(\r\n            (uint_fast64_t) qs[2]<<19, ((uint_fast64_t) qs[0]<<25) + (q>>4),\r\n            term.v64, term.v0\r\n        );\r\n    return\r\n        softfloat_roundPackToF128( state, signZ, expZ, sigZ.v64, sigZ.v0, sigZExtra );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n propagateNaN:\r\n    uiZ = softfloat_propagateNaNF128UI( state, uiA64, uiA0, uiB64, uiB0 );\r\n    goto uiZ;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n invalid:\r\n    softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n    uiZ.v64 = defaultNaNF128UI64;\r\n    uiZ.v0  = defaultNaNF128UI0;\r\n    goto uiZ;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n infinity:\r\n    uiZ.v64 = packToF128UI64( signZ, 0x7FFF, 0 );\r\n    goto uiZ0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n zero:\r\n    uiZ.v64 = packToF128UI64( signZ, 0, 0 );\r\n uiZ0:\r\n    uiZ.v0 = 0;\r\n uiZ:\r\n    uZ.ui = uiZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_eq.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nbool f128_eq( struct softfloat_state *state, float128_t a, float128_t b )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    union ui128_f128 uB;\r\n    uint_fast64_t uiB64, uiB0;\r\n\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    uB.f = b;\r\n    uiB64 = uB.ui.v64;\r\n    uiB0  = uB.ui.v0;\r\n    if ( isNaNF128UI( uiA64, uiA0 ) || isNaNF128UI( uiB64, uiB0 ) ) {\r\n        if (\r\n               softfloat_isSigNaNF128UI( uiA64, uiA0 )\r\n            || softfloat_isSigNaNF128UI( uiB64, uiB0 )\r\n        ) {\r\n            softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        }\r\n        return false;\r\n    }\r\n    return\r\n           (uiA0 == uiB0)\r\n        && (   (uiA64 == uiB64)\r\n            || (! uiA0 && ! ((uiA64 | uiB64) & UINT64_C( 0x7FFFFFFFFFFFFFFF )))\r\n           );\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_eq_signaling.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"softfloat.h\"\r\n\r\nbool f128_eq_signaling( struct softfloat_state *state, float128_t a, float128_t b )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    union ui128_f128 uB;\r\n    uint_fast64_t uiB64, uiB0;\r\n\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    uB.f = b;\r\n    uiB64 = uB.ui.v64;\r\n    uiB0  = uB.ui.v0;\r\n    if ( isNaNF128UI( uiA64, uiA0 ) || isNaNF128UI( uiB64, uiB0 ) ) {\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        return false;\r\n    }\r\n    return\r\n           (uiA0 == uiB0)\r\n        && (   (uiA64 == uiB64)\r\n            || (! uiA0 && ! ((uiA64 | uiB64) & UINT64_C( 0x7FFFFFFFFFFFFFFF )))\r\n           );\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_isSignalingNaN.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nbool f128_isSignalingNaN( float128_t a )\r\n{\r\n    union ui128_f128 uA;\r\n\r\n    uA.f = a;\r\n    return softfloat_isSigNaNF128UI( uA.ui.v64, uA.ui.v0 );\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_le.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"softfloat.h\"\r\n\r\nbool f128_le( struct softfloat_state *state, float128_t a, float128_t b )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    union ui128_f128 uB;\r\n    uint_fast64_t uiB64, uiB0;\r\n    bool signA, signB;\r\n\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    uB.f = b;\r\n    uiB64 = uB.ui.v64;\r\n    uiB0  = uB.ui.v0;\r\n    if ( isNaNF128UI( uiA64, uiA0 ) || isNaNF128UI( uiB64, uiB0 ) ) {\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        return false;\r\n    }\r\n    signA = signF128UI64( uiA64 );\r\n    signB = signF128UI64( uiB64 );\r\n    return\r\n        (signA != signB)\r\n            ? signA\r\n                  || ! (((uiA64 | uiB64) & UINT64_C( 0x7FFFFFFFFFFFFFFF ))\r\n                            | uiA0 | uiB0)\r\n            : ((uiA64 == uiB64) && (uiA0 == uiB0))\r\n                  || (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_le_quiet.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nbool f128_le_quiet( struct softfloat_state *state, float128_t a, float128_t b )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    union ui128_f128 uB;\r\n    uint_fast64_t uiB64, uiB0;\r\n    bool signA, signB;\r\n\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    uB.f = b;\r\n    uiB64 = uB.ui.v64;\r\n    uiB0  = uB.ui.v0;\r\n    if ( isNaNF128UI( uiA64, uiA0 ) || isNaNF128UI( uiB64, uiB0 ) ) {\r\n        if (\r\n               softfloat_isSigNaNF128UI( uiA64, uiA0 )\r\n            || softfloat_isSigNaNF128UI( uiB64, uiB0 )\r\n        ) {\r\n            softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        }\r\n        return false;\r\n    }\r\n    signA = signF128UI64( uiA64 );\r\n    signB = signF128UI64( uiB64 );\r\n    return\r\n        (signA != signB)\r\n            ? signA\r\n                  || ! (((uiA64 | uiB64) & UINT64_C( 0x7FFFFFFFFFFFFFFF ))\r\n                            | uiA0 | uiB0)\r\n            : ((uiA64 == uiB64) && (uiA0 == uiB0))\r\n                  || (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_lt.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"softfloat.h\"\r\n\r\nbool f128_lt( struct softfloat_state *state, float128_t a, float128_t b )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    union ui128_f128 uB;\r\n    uint_fast64_t uiB64, uiB0;\r\n    bool signA, signB;\r\n\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    uB.f = b;\r\n    uiB64 = uB.ui.v64;\r\n    uiB0  = uB.ui.v0;\r\n    if ( isNaNF128UI( uiA64, uiA0 ) || isNaNF128UI( uiB64, uiB0 ) ) {\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        return false;\r\n    }\r\n    signA = signF128UI64( uiA64 );\r\n    signB = signF128UI64( uiB64 );\r\n    return\r\n        (signA != signB)\r\n            ? signA\r\n                  && (((uiA64 | uiB64) & UINT64_C( 0x7FFFFFFFFFFFFFFF ))\r\n                          | uiA0 | uiB0)\r\n            : ((uiA64 != uiB64) || (uiA0 != uiB0))\r\n                  && (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_lt_quiet.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nbool f128_lt_quiet( struct softfloat_state *state, float128_t a, float128_t b )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    union ui128_f128 uB;\r\n    uint_fast64_t uiB64, uiB0;\r\n    bool signA, signB;\r\n\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    uB.f = b;\r\n    uiB64 = uB.ui.v64;\r\n    uiB0  = uB.ui.v0;\r\n    if ( isNaNF128UI( uiA64, uiA0 ) || isNaNF128UI( uiB64, uiB0 ) ) {\r\n        if (\r\n               softfloat_isSigNaNF128UI( uiA64, uiA0 )\r\n            || softfloat_isSigNaNF128UI( uiB64, uiB0 )\r\n        ) {\r\n            softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        }\r\n        return false;\r\n    }\r\n    signA = signF128UI64( uiA64 );\r\n    signB = signF128UI64( uiB64 );\r\n    return\r\n        (signA != signB)\r\n            ? signA\r\n                  && (((uiA64 | uiB64) & UINT64_C( 0x7FFFFFFFFFFFFFFF ))\r\n                          | uiA0 | uiB0)\r\n            : ((uiA64 != uiB64) || (uiA0 != uiB0))\r\n                  && (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_mul.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nfloat128_t f128_mul( struct softfloat_state *state, float128_t a, float128_t b )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    bool signA;\r\n    int_fast32_t expA;\r\n    struct uint128 sigA;\r\n    union ui128_f128 uB;\r\n    uint_fast64_t uiB64, uiB0;\r\n    bool signB;\r\n    int_fast32_t expB;\r\n    struct uint128 sigB;\r\n    bool signZ;\r\n    uint_fast64_t magBits;\r\n    struct exp32_sig128 normExpSig;\r\n    int_fast32_t expZ;\r\n    uint64_t sig256Z[4];\r\n    uint_fast64_t sigZExtra;\r\n    struct uint128 sigZ;\r\n    struct uint128_extra sig128Extra;\r\n    struct uint128 uiZ;\r\n    union ui128_f128 uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    signA = signF128UI64( uiA64 );\r\n    expA  = expF128UI64( uiA64 );\r\n    sigA.v64 = fracF128UI64( uiA64 );\r\n    sigA.v0  = uiA0;\r\n    uB.f = b;\r\n    uiB64 = uB.ui.v64;\r\n    uiB0  = uB.ui.v0;\r\n    signB = signF128UI64( uiB64 );\r\n    expB  = expF128UI64( uiB64 );\r\n    sigB.v64 = fracF128UI64( uiB64 );\r\n    sigB.v0  = uiB0;\r\n    signZ = signA ^ signB;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( expA == 0x7FFF ) {\r\n        if (\r\n            (sigA.v64 | sigA.v0) || ((expB == 0x7FFF) && (sigB.v64 | sigB.v0))\r\n        ) {\r\n            goto propagateNaN;\r\n        }\r\n        magBits = expB | sigB.v64 | sigB.v0;\r\n        goto infArg;\r\n    }\r\n    if ( expB == 0x7FFF ) {\r\n        if ( sigB.v64 | sigB.v0 ) goto propagateNaN;\r\n        magBits = expA | sigA.v64 | sigA.v0;\r\n        goto infArg;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( ! expA ) {\r\n        if ( ! (sigA.v64 | sigA.v0) ) goto zero;\r\n        normExpSig = softfloat_normSubnormalF128Sig( sigA.v64, sigA.v0 );\r\n        expA = normExpSig.exp;\r\n        sigA = normExpSig.sig;\r\n    }\r\n    if ( ! expB ) {\r\n        if ( ! (sigB.v64 | sigB.v0) ) goto zero;\r\n        normExpSig = softfloat_normSubnormalF128Sig( sigB.v64, sigB.v0 );\r\n        expB = normExpSig.exp;\r\n        sigB = normExpSig.sig;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    expZ = expA + expB - 0x4000;\r\n    sigA.v64 |= UINT64_C( 0x0001000000000000 );\r\n    sigB = softfloat_shortShiftLeft128( sigB.v64, sigB.v0, 16 );\r\n    softfloat_mul128To256M( sigA.v64, sigA.v0, sigB.v64, sigB.v0, sig256Z );\r\n    sigZExtra = sig256Z[indexWord( 4, 1 )] | (sig256Z[indexWord( 4, 0 )] != 0);\r\n    sigZ =\r\n        softfloat_add128(\r\n            sig256Z[indexWord( 4, 3 )], sig256Z[indexWord( 4, 2 )],\r\n            sigA.v64, sigA.v0\r\n        );\r\n    if ( UINT64_C( 0x0002000000000000 ) <= sigZ.v64 ) {\r\n        ++expZ;\r\n        sig128Extra =\r\n            softfloat_shortShiftRightJam128Extra(\r\n                sigZ.v64, sigZ.v0, sigZExtra, 1 );\r\n        sigZ = sig128Extra.v;\r\n        sigZExtra = sig128Extra.extra;\r\n    }\r\n    return\r\n        softfloat_roundPackToF128( state, signZ, expZ, sigZ.v64, sigZ.v0, sigZExtra );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n propagateNaN:\r\n    uiZ = softfloat_propagateNaNF128UI( state, uiA64, uiA0, uiB64, uiB0 );\r\n    goto uiZ;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n infArg:\r\n    if ( ! magBits ) {\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        uiZ.v64 = defaultNaNF128UI64;\r\n        uiZ.v0  = defaultNaNF128UI0;\r\n        goto uiZ;\r\n    }\r\n    uiZ.v64 = packToF128UI64( signZ, 0x7FFF, 0 );\r\n    goto uiZ0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n zero:\r\n    uiZ.v64 = packToF128UI64( signZ, 0, 0 );\r\n uiZ0:\r\n    uiZ.v0 = 0;\r\n uiZ:\r\n    uZ.ui = uiZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_mulAdd.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"softfloat.h\"\r\n\r\nfloat128_t f128_mulAdd( struct softfloat_state *state, float128_t a, float128_t b, float128_t c )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    union ui128_f128 uB;\r\n    uint_fast64_t uiB64, uiB0;\r\n    union ui128_f128 uC;\r\n    uint_fast64_t uiC64, uiC0;\r\n\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    uB.f = b;\r\n    uiB64 = uB.ui.v64;\r\n    uiB0  = uB.ui.v0;\r\n    uC.f = c;\r\n    uiC64 = uC.ui.v64;\r\n    uiC0  = uC.ui.v0;\r\n    return softfloat_mulAddF128( uiA64, uiA0, uiB64, uiB0, uiC64, uiC0, 0 );\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_rem.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nfloat128_t f128_rem( struct softfloat_state *state, float128_t a, float128_t b )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    bool signA;\r\n    int_fast32_t expA;\r\n    struct uint128 sigA;\r\n    union ui128_f128 uB;\r\n    uint_fast64_t uiB64, uiB0;\r\n    int_fast32_t expB;\r\n    struct uint128 sigB;\r\n    struct exp32_sig128 normExpSig;\r\n    struct uint128 rem;\r\n    int_fast32_t expDiff;\r\n    uint_fast32_t q, recip32;\r\n    uint_fast64_t q64;\r\n    struct uint128 term, altRem, meanRem;\r\n    bool signRem;\r\n    struct uint128 uiZ;\r\n    union ui128_f128 uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    signA = signF128UI64( uiA64 );\r\n    expA  = expF128UI64( uiA64 );\r\n    sigA.v64 = fracF128UI64( uiA64 );\r\n    sigA.v0  = uiA0;\r\n    uB.f = b;\r\n    uiB64 = uB.ui.v64;\r\n    uiB0  = uB.ui.v0;\r\n    expB  = expF128UI64( uiB64 );\r\n    sigB.v64 = fracF128UI64( uiB64 );\r\n    sigB.v0  = uiB0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( expA == 0x7FFF ) {\r\n        if (\r\n            (sigA.v64 | sigA.v0) || ((expB == 0x7FFF) && (sigB.v64 | sigB.v0))\r\n        ) {\r\n            goto propagateNaN;\r\n        }\r\n        goto invalid;\r\n    }\r\n    if ( expB == 0x7FFF ) {\r\n        if ( sigB.v64 | sigB.v0 ) goto propagateNaN;\r\n        return a;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( ! expB ) {\r\n        if ( ! (sigB.v64 | sigB.v0) ) goto invalid;\r\n        normExpSig = softfloat_normSubnormalF128Sig( sigB.v64, sigB.v0 );\r\n        expB = normExpSig.exp;\r\n        sigB = normExpSig.sig;\r\n    }\r\n    if ( ! expA ) {\r\n        if ( ! (sigA.v64 | sigA.v0) ) return a;\r\n        normExpSig = softfloat_normSubnormalF128Sig( sigA.v64, sigA.v0 );\r\n        expA = normExpSig.exp;\r\n        sigA = normExpSig.sig;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    sigA.v64 |= UINT64_C( 0x0001000000000000 );\r\n    sigB.v64 |= UINT64_C( 0x0001000000000000 );\r\n    rem = sigA;\r\n    expDiff = expA - expB;\r\n    if ( expDiff < 1 ) {\r\n        if ( expDiff < -1 ) return a;\r\n        if ( expDiff ) {\r\n            --expB;\r\n            sigB = softfloat_add128( sigB.v64, sigB.v0, sigB.v64, sigB.v0 );\r\n            q = 0;\r\n        } else {\r\n            q = softfloat_le128( sigB.v64, sigB.v0, rem.v64, rem.v0 );\r\n            if ( q ) {\r\n                rem = softfloat_sub128( rem.v64, rem.v0, sigB.v64, sigB.v0 );\r\n            }\r\n        }\r\n    } else {\r\n        recip32 = softfloat_approxRecip32_1( sigB.v64>>17 );\r\n        expDiff -= 30;\r\n        for (;;) {\r\n            q64 = (uint_fast64_t) (uint32_t) (rem.v64>>19) * recip32;\r\n            if ( expDiff < 0 ) break;\r\n            q = (q64 + 0x80000000)>>32;\r\n            rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );\r\n            term = softfloat_mul128By32( sigB.v64, sigB.v0, q );\r\n            rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );\r\n            if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {\r\n                rem = softfloat_add128( rem.v64, rem.v0, sigB.v64, sigB.v0 );\r\n            }\r\n            expDiff -= 29;\r\n        }\r\n        /*--------------------------------------------------------------------\r\n        | (`expDiff' cannot be less than -29 here.)\r\n        *--------------------------------------------------------------------*/\r\n        q = (uint32_t) (q64>>32)>>(~expDiff & 31);\r\n        rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, expDiff + 30 );\r\n        term = softfloat_mul128By32( sigB.v64, sigB.v0, q );\r\n        rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );\r\n        if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {\r\n            altRem = softfloat_add128( rem.v64, rem.v0, sigB.v64, sigB.v0 );\r\n            goto selectRem;\r\n        }\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    do {\r\n        altRem = rem;\r\n        ++q;\r\n        rem = softfloat_sub128( rem.v64, rem.v0, sigB.v64, sigB.v0 );\r\n    } while ( ! (rem.v64 & UINT64_C( 0x8000000000000000 )) );\r\n selectRem:\r\n    meanRem = softfloat_add128( rem.v64, rem.v0, altRem.v64, altRem.v0 );\r\n    if (\r\n        (meanRem.v64 & UINT64_C( 0x8000000000000000 ))\r\n            || (! (meanRem.v64 | meanRem.v0) && (q & 1))\r\n    ) {\r\n        rem = altRem;\r\n    }\r\n    signRem = signA;\r\n    if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {\r\n        signRem = ! signRem;\r\n        rem = softfloat_sub128( 0, 0, rem.v64, rem.v0 );\r\n    }\r\n    return softfloat_normRoundPackToF128( state, signRem, expB - 1, rem.v64, rem.v0 );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n propagateNaN:\r\n    uiZ = softfloat_propagateNaNF128UI( state, uiA64, uiA0, uiB64, uiB0 );\r\n    goto uiZ;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n invalid:\r\n    softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n    uiZ.v64 = defaultNaNF128UI64;\r\n    uiZ.v0  = defaultNaNF128UI0;\r\n uiZ:\r\n    uZ.ui = uiZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_sqrt.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nfloat128_t f128_sqrt( struct softfloat_state *state, float128_t a )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    bool signA;\r\n    int_fast32_t expA;\r\n    struct uint128 sigA, uiZ;\r\n    struct exp32_sig128 normExpSig;\r\n    int_fast32_t expZ;\r\n    uint_fast32_t sig32A, recipSqrt32, sig32Z;\r\n    struct uint128 rem;\r\n    uint32_t qs[3];\r\n    uint_fast32_t q;\r\n    uint_fast64_t x64, sig64Z;\r\n    struct uint128 y, term;\r\n    uint_fast64_t sigZExtra;\r\n    struct uint128 sigZ;\r\n    union ui128_f128 uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    signA = signF128UI64( uiA64 );\r\n    expA  = expF128UI64( uiA64 );\r\n    sigA.v64 = fracF128UI64( uiA64 );\r\n    sigA.v0  = uiA0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( expA == 0x7FFF ) {\r\n        if ( sigA.v64 | sigA.v0 ) {\r\n            uiZ = softfloat_propagateNaNF128UI( state, uiA64, uiA0, 0, 0 );\r\n            goto uiZ;\r\n        }\r\n        if ( ! signA ) return a;\r\n        goto invalid;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( signA ) {\r\n        if ( ! (expA | sigA.v64 | sigA.v0) ) return a;\r\n        goto invalid;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( ! expA ) {\r\n        if ( ! (sigA.v64 | sigA.v0) ) return a;\r\n        normExpSig = softfloat_normSubnormalF128Sig( sigA.v64, sigA.v0 );\r\n        expA = normExpSig.exp;\r\n        sigA = normExpSig.sig;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    | (`sig32Z' is guaranteed to be a lower bound on the square root of\r\n    | `sig32A', which makes `sig32Z' also a lower bound on the square root of\r\n    | `sigA'.)\r\n    *------------------------------------------------------------------------*/\r\n    expZ = ((expA - 0x3FFF)>>1) + 0x3FFE;\r\n    expA &= 1;\r\n    sigA.v64 |= UINT64_C( 0x0001000000000000 );\r\n    sig32A = sigA.v64>>17;\r\n    recipSqrt32 = softfloat_approxRecipSqrt32_1( expA, sig32A );\r\n    sig32Z = ((uint_fast64_t) sig32A * recipSqrt32)>>32;\r\n    if ( expA ) {\r\n        sig32Z >>= 1;\r\n        rem = softfloat_shortShiftLeft128( sigA.v64, sigA.v0, 12 );\r\n    } else {\r\n        rem = softfloat_shortShiftLeft128( sigA.v64, sigA.v0, 13 );\r\n    }\r\n    qs[2] = sig32Z;\r\n    rem.v64 -= (uint_fast64_t) sig32Z * sig32Z;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    q = ((uint32_t) (rem.v64>>2) * (uint_fast64_t) recipSqrt32)>>32;\r\n    x64 = (uint_fast64_t) sig32Z<<32;\r\n    sig64Z = x64 + ((uint_fast64_t) q<<3);\r\n    y = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );\r\n    /*------------------------------------------------------------------------\r\n    | (Repeating this loop is a rare occurrence.)\r\n    *------------------------------------------------------------------------*/\r\n    for (;;) {\r\n        term = softfloat_mul64ByShifted32To128( x64 + sig64Z, q );\r\n        rem = softfloat_sub128( y.v64, y.v0, term.v64, term.v0 );\r\n        if ( ! (rem.v64 & UINT64_C( 0x8000000000000000 )) ) break;\r\n        --q;\r\n        sig64Z -= 1<<3;\r\n    }\r\n    qs[1] = q;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    q = ((rem.v64>>2) * recipSqrt32)>>32;\r\n    y = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );\r\n    sig64Z <<= 1;\r\n    /*------------------------------------------------------------------------\r\n    | (Repeating this loop is a rare occurrence.)\r\n    *------------------------------------------------------------------------*/\r\n    for (;;) {\r\n        term = softfloat_shortShiftLeft128( 0, sig64Z, 32 );\r\n        term = softfloat_add128( term.v64, term.v0, 0, (uint_fast64_t) q<<6 );\r\n        term = softfloat_mul128By32( term.v64, term.v0, q );\r\n        rem = softfloat_sub128( y.v64, y.v0, term.v64, term.v0 );\r\n        if ( ! (rem.v64 & UINT64_C( 0x8000000000000000 )) ) break;\r\n        --q;\r\n    }\r\n    qs[0] = q;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    q = (((rem.v64>>2) * recipSqrt32)>>32) + 2;\r\n    sigZExtra = (uint64_t) ((uint_fast64_t) q<<59);\r\n    term = softfloat_shortShiftLeft128( 0, qs[1], 53 );\r\n    sigZ =\r\n        softfloat_add128(\r\n            (uint_fast64_t) qs[2]<<18, ((uint_fast64_t) qs[0]<<24) + (q>>5),\r\n            term.v64, term.v0\r\n        );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( (q & 0xF) <= 2 ) {\r\n        q &= ~3;\r\n        sigZExtra = (uint64_t) ((uint_fast64_t) q<<59);\r\n        y = softfloat_shortShiftLeft128( sigZ.v64, sigZ.v0, 6 );\r\n        y.v0 |= sigZExtra>>58;\r\n        term = softfloat_sub128( y.v64, y.v0, 0, q );\r\n        y    = softfloat_mul64ByShifted32To128( term.v0,  q );\r\n        term = softfloat_mul64ByShifted32To128( term.v64, q );\r\n        term = softfloat_add128( term.v64, term.v0, 0, y.v64 );\r\n        rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 20 );\r\n        term = softfloat_sub128( term.v64, term.v0, rem.v64, rem.v0 );\r\n        /*--------------------------------------------------------------------\r\n        | The concatenation of `term' and `y.v0' is now the negative remainder\r\n        | (3 words altogether).\r\n        *--------------------------------------------------------------------*/\r\n        if ( term.v64 & UINT64_C( 0x8000000000000000 ) ) {\r\n            sigZExtra |= 1;\r\n        } else {\r\n            if ( term.v64 | term.v0 | y.v0 ) {\r\n                if ( sigZExtra ) {\r\n                    --sigZExtra;\r\n                } else {\r\n                    sigZ = softfloat_sub128( sigZ.v64, sigZ.v0, 0, 1 );\r\n                    sigZExtra = ~0;\r\n                }\r\n            }\r\n        }\r\n    }\r\n    return softfloat_roundPackToF128( state, 0, expZ, sigZ.v64, sigZ.v0, sigZExtra );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n invalid:\r\n    softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n    uiZ.v64 = defaultNaNF128UI64;\r\n    uiZ.v0  = defaultNaNF128UI0;\r\n uiZ:\r\n    uZ.ui = uiZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_sub.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"softfloat.h\"\r\n\r\nfloat128_t f128_sub( struct softfloat_state *state, float128_t a, float128_t b )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    bool signA;\r\n    union ui128_f128 uB;\r\n    uint_fast64_t uiB64, uiB0;\r\n    bool signB;\r\n#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2)\r\n    float128_t\r\n        (*magsFuncPtr)(\r\n            uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool );\r\n#endif\r\n\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    signA = signF128UI64( uiA64 );\r\n    uB.f = b;\r\n    uiB64 = uB.ui.v64;\r\n    uiB0  = uB.ui.v0;\r\n    signB = signF128UI64( uiB64 );\r\n#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)\r\n    if ( signA == signB ) {\r\n        return softfloat_subMagsF128( state, uiA64, uiA0, uiB64, uiB0, signA );\r\n    } else {\r\n        return softfloat_addMagsF128( state, uiA64, uiA0, uiB64, uiB0, signA );\r\n    }\r\n#else\r\n    magsFuncPtr =\r\n        (signA == signB) ? softfloat_subMagsF128 : softfloat_addMagsF128;\r\n    return (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );\r\n#endif\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_to_extF80.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t f128_to_extF80( struct softfloat_state *state, float128_t a )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    bool sign;\r\n    int_fast32_t exp;\r\n    uint_fast64_t frac64, frac0;\r\n    struct commonNaN commonNaN;\r\n    struct uint128 uiZ;\r\n    uint_fast16_t uiZ64;\r\n    uint_fast64_t uiZ0;\r\n    struct exp32_sig128 normExpSig;\r\n    struct uint128 sig128;\r\n    union { struct extFloat80M s; extFloat80_t f; } uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    sign   = signF128UI64( uiA64 );\r\n    exp    = expF128UI64( uiA64 );\r\n    frac64 = fracF128UI64( uiA64 );\r\n    frac0  = uiA0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( exp == 0x7FFF ) {\r\n        if ( frac64 | frac0 ) {\r\n            softfloat_f128UIToCommonNaN( state, uiA64, uiA0, &commonNaN );\r\n            uiZ = softfloat_commonNaNToExtF80UI( &commonNaN );\r\n            uiZ64 = uiZ.v64;\r\n            uiZ0  = uiZ.v0;\r\n        } else {\r\n            uiZ64 = packToExtF80UI64( sign, 0x7FFF );\r\n            uiZ0  = UINT64_C( 0x8000000000000000 );\r\n        }\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( ! exp ) {\r\n        if ( ! (frac64 | frac0) ) {\r\n            uiZ64 = packToExtF80UI64( sign, 0 );\r\n            uiZ0  = 0;\r\n            goto uiZ;\r\n        }\r\n        normExpSig = softfloat_normSubnormalF128Sig( frac64, frac0 );\r\n        exp   = normExpSig.exp;\r\n        frac64 = normExpSig.sig.v64;\r\n        frac0  = normExpSig.sig.v0;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    sig128 =\r\n        softfloat_shortShiftLeft128(\r\n            frac64 | UINT64_C( 0x0001000000000000 ), frac0, 15 );\r\n    return softfloat_roundPackToExtF80( state, sign, exp, sig128.v64, sig128.v0, 80 );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n uiZ:\r\n    uZ.s.signExp = uiZ64;\r\n    uZ.s.signif  = uiZ0;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_to_f16.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nfloat16_t f128_to_f16( struct softfloat_state *state, float128_t a )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    bool sign;\r\n    int_fast32_t exp;\r\n    uint_fast64_t frac64;\r\n    struct commonNaN commonNaN;\r\n    uint_fast16_t uiZ, frac16;\r\n    union ui16_f16 uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    sign  = signF128UI64( uiA64 );\r\n    exp   = expF128UI64( uiA64 );\r\n    frac64 = fracF128UI64( uiA64 ) | (uiA0 != 0);\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( exp == 0x7FFF ) {\r\n        if ( frac64 ) {\r\n            softfloat_f128UIToCommonNaN( state, uiA64, uiA0, &commonNaN );\r\n            uiZ = softfloat_commonNaNToF16UI( &commonNaN );\r\n        } else {\r\n            uiZ = packToF16UI( sign, 0x1F, 0 );\r\n        }\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    frac16 = softfloat_shortShiftRightJam64( frac64, 34 );\r\n    if ( ! (exp | frac16) ) {\r\n        uiZ = packToF16UI( sign, 0, 0 );\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    exp -= 0x3FF1;\r\n    if ( sizeof (int_fast16_t) < sizeof (int_fast32_t) ) {\r\n        if ( exp < -0x40 ) exp = -0x40;\r\n    }\r\n    return softfloat_roundPackToF16( sign, exp, frac16 | 0x4000 );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n uiZ:\r\n    uZ.ui = uiZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_to_f32.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nfloat32_t f128_to_f32( struct softfloat_state *state, float128_t a )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    bool sign;\r\n    int_fast32_t exp;\r\n    uint_fast64_t frac64;\r\n    struct commonNaN commonNaN;\r\n    uint_fast32_t uiZ, frac32;\r\n    union ui32_f32 uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    sign  = signF128UI64( uiA64 );\r\n    exp   = expF128UI64( uiA64 );\r\n    frac64 = fracF128UI64( uiA64 ) | (uiA0 != 0);\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( exp == 0x7FFF ) {\r\n        if ( frac64 ) {\r\n            softfloat_f128UIToCommonNaN( state, uiA64, uiA0, &commonNaN );\r\n            uiZ = softfloat_commonNaNToF32UI( &commonNaN );\r\n        } else {\r\n            uiZ = packToF32UI( sign, 0xFF, 0 );\r\n        }\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    frac32 = softfloat_shortShiftRightJam64( frac64, 18 );\r\n    if ( ! (exp | frac32) ) {\r\n        uiZ = packToF32UI( sign, 0, 0 );\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    exp -= 0x3F81;\r\n    if ( sizeof (int_fast16_t) < sizeof (int_fast32_t) ) {\r\n        if ( exp < -0x1000 ) exp = -0x1000;\r\n    }\r\n    return softfloat_roundPackToF32( state, sign, exp, frac32 | 0x40000000 );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n uiZ:\r\n    uZ.ui = uiZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_to_f64.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nfloat64_t f128_to_f64( struct softfloat_state *state, float128_t a )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    bool sign;\r\n    int_fast32_t exp;\r\n    uint_fast64_t frac64, frac0;\r\n    struct commonNaN commonNaN;\r\n    uint_fast64_t uiZ;\r\n    struct uint128 frac128;\r\n    union ui64_f64 uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    sign  = signF128UI64( uiA64 );\r\n    exp   = expF128UI64( uiA64 );\r\n    frac64 = fracF128UI64( uiA64 );\r\n    frac0  = uiA0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( exp == 0x7FFF ) {\r\n        if ( frac64 | frac0 ) {\r\n            softfloat_f128UIToCommonNaN( state, uiA64, uiA0, &commonNaN );\r\n            uiZ = softfloat_commonNaNToF64UI( &commonNaN );\r\n        } else {\r\n            uiZ = packToF64UI( sign, 0x7FF, 0 );\r\n        }\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    frac128 = softfloat_shortShiftLeft128( frac64, frac0, 14 );\r\n    frac64 = frac128.v64 | (frac128.v0 != 0);\r\n    if ( ! (exp | frac64) ) {\r\n        uiZ = packToF64UI( sign, 0, 0 );\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    exp -= 0x3C01;\r\n    if ( sizeof (int_fast16_t) < sizeof (int_fast32_t) ) {\r\n        if ( exp < -0x1000 ) exp = -0x1000;\r\n    }\r\n    return\r\n        softfloat_roundPackToF64(\r\n            state, sign, exp, frac64 | UINT64_C( 0x4000000000000000 ) );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n uiZ:\r\n    uZ.ui = uiZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_to_i32.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nint_fast32_t f128_to_i32( struct softfloat_state *state, float128_t a, uint_fast8_t roundingMode, bool exact )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    bool sign;\r\n    int_fast32_t exp;\r\n    uint_fast64_t sig64, sig0;\r\n    int_fast32_t shiftDist;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    sign  = signF128UI64( uiA64 );\r\n    exp   = expF128UI64( uiA64 );\r\n    sig64 = fracF128UI64( uiA64 );\r\n    sig0  = uiA0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n#if (i32_fromNaN != i32_fromPosOverflow) || (i32_fromNaN != i32_fromNegOverflow)\r\n    if ( (exp == 0x7FFF) && (sig64 | sig0) ) {\r\n#if (i32_fromNaN == i32_fromPosOverflow)\r\n        sign = 0;\r\n#elif (i32_fromNaN == i32_fromNegOverflow)\r\n        sign = 1;\r\n#else\r\n        softfloat_raiseFlags( softfloat_flag_invalid );\r\n        return i32_fromNaN;\r\n#endif\r\n    }\r\n#endif\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( exp ) sig64 |= UINT64_C( 0x0001000000000000 );\r\n    sig64 |= (sig0 != 0);\r\n    shiftDist = 0x4023 - exp;\r\n    if ( 0 < shiftDist ) sig64 = softfloat_shiftRightJam64( sig64, shiftDist );\r\n    return softfloat_roundToI32( state, sign, sig64, roundingMode, exact );\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_to_i64.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nint_fast64_t f128_to_i64( struct softfloat_state *state, float128_t a, uint_fast8_t roundingMode, bool exact )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    bool sign;\r\n    int_fast32_t exp;\r\n    uint_fast64_t sig64, sig0;\r\n    int_fast32_t shiftDist;\r\n    struct uint128 sig128;\r\n    struct uint64_extra sigExtra;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    sign  = signF128UI64( uiA64 );\r\n    exp   = expF128UI64( uiA64 );\r\n    sig64 = fracF128UI64( uiA64 );\r\n    sig0  = uiA0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    shiftDist = 0x402F - exp;\r\n    if ( shiftDist <= 0 ) {\r\n        /*--------------------------------------------------------------------\r\n        *--------------------------------------------------------------------*/\r\n        if ( shiftDist < -15 ) {\r\n            softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n            return\r\n                (exp == 0x7FFF) && (sig64 | sig0) ? i64_fromNaN\r\n                    : sign ? i64_fromNegOverflow : i64_fromPosOverflow;\r\n        }\r\n        /*--------------------------------------------------------------------\r\n        *--------------------------------------------------------------------*/\r\n        sig64 |= UINT64_C( 0x0001000000000000 );\r\n        if ( shiftDist ) {\r\n            sig128 = softfloat_shortShiftLeft128( sig64, sig0, -shiftDist );\r\n            sig64 = sig128.v64;\r\n            sig0  = sig128.v0;\r\n        }\r\n    } else {\r\n        /*--------------------------------------------------------------------\r\n        *--------------------------------------------------------------------*/\r\n        if ( exp ) sig64 |= UINT64_C( 0x0001000000000000 );\r\n        sigExtra = softfloat_shiftRightJam64Extra( sig64, sig0, shiftDist );\r\n        sig64 = sigExtra.v;\r\n        sig0  = sigExtra.extra;\r\n    }\r\n    return softfloat_roundToI64( state, sign, sig64, sig0, roundingMode, exact );\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_to_ui32.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nuint_fast32_t\r\n f128_to_ui32( struct softfloat_state *state, float128_t a, uint_fast8_t roundingMode, bool exact )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    bool sign;\r\n    int_fast32_t exp;\r\n    uint_fast64_t sig64;\r\n    int_fast32_t shiftDist;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    sign  = signF128UI64( uiA64 );\r\n    exp   = expF128UI64( uiA64 );\r\n    sig64 = fracF128UI64( uiA64 ) | (uiA0 != 0);\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n#if (ui32_fromNaN != ui32_fromPosOverflow) || (ui32_fromNaN != ui32_fromNegOverflow)\r\n    if ( (exp == 0x7FFF) && sig64 ) {\r\n#if (ui32_fromNaN == ui32_fromPosOverflow)\r\n        sign = 0;\r\n#elif (ui32_fromNaN == ui32_fromNegOverflow)\r\n        sign = 1;\r\n#else\r\n        softfloat_raiseFlags( softfloat_flag_invalid );\r\n        return ui32_fromNaN;\r\n#endif\r\n    }\r\n#endif\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( exp ) sig64 |= UINT64_C( 0x0001000000000000 );\r\n    shiftDist = 0x4023 - exp;\r\n    if ( 0 < shiftDist ) {\r\n        sig64 = softfloat_shiftRightJam64( sig64, shiftDist );\r\n    }\r\n    return softfloat_roundToUI32( sign, sig64, roundingMode, exact );\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f128_to_ui64.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nuint_fast64_t\r\n f128_to_ui64( struct softfloat_state *state, float128_t a, uint_fast8_t roundingMode, bool exact )\r\n{\r\n    union ui128_f128 uA;\r\n    uint_fast64_t uiA64, uiA0;\r\n    bool sign;\r\n    int_fast32_t exp;\r\n    uint_fast64_t sig64, sig0;\r\n    int_fast32_t shiftDist;\r\n    struct uint128 sig128;\r\n    struct uint64_extra sigExtra;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA64 = uA.ui.v64;\r\n    uiA0  = uA.ui.v0;\r\n    sign  = signF128UI64( uiA64 );\r\n    exp   = expF128UI64( uiA64 );\r\n    sig64 = fracF128UI64( uiA64 );\r\n    sig0  = uiA0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    shiftDist = 0x402F - exp;\r\n    if ( shiftDist <= 0 ) {\r\n        /*--------------------------------------------------------------------\r\n        *--------------------------------------------------------------------*/\r\n        if ( shiftDist < -15 ) {\r\n            softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n            return\r\n                (exp == 0x7FFF) && (sig64 | sig0) ? ui64_fromNaN\r\n                    : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;\r\n        }\r\n        /*--------------------------------------------------------------------\r\n        *--------------------------------------------------------------------*/\r\n        sig64 |= UINT64_C( 0x0001000000000000 );\r\n        if ( shiftDist ) {\r\n            sig128 = softfloat_shortShiftLeft128( sig64, sig0, -shiftDist );\r\n            sig64 = sig128.v64;\r\n            sig0  = sig128.v0;\r\n        }\r\n    } else {\r\n        /*--------------------------------------------------------------------\r\n        *--------------------------------------------------------------------*/\r\n        if ( exp ) sig64 |= UINT64_C( 0x0001000000000000 );\r\n        sigExtra = softfloat_shiftRightJam64Extra( sig64, sig0, shiftDist );\r\n        sig64 = sigExtra.v;\r\n        sig0  = sigExtra.extra;\r\n    }\r\n    return softfloat_roundToUI64( state, sign, sig64, sig0, roundingMode, exact );\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f32_to_extF80.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t f32_to_extF80( struct softfloat_state *state, float32_t a )\r\n{\r\n    union ui32_f32 uA;\r\n    uint_fast32_t uiA;\r\n    bool sign;\r\n    int_fast16_t exp;\r\n    uint_fast32_t frac;\r\n    struct commonNaN commonNaN;\r\n    struct uint128 uiZ;\r\n    uint_fast16_t uiZ64;\r\n    uint_fast64_t uiZ0;\r\n    struct exp16_sig32 normExpSig;\r\n    union { struct extFloat80M s; extFloat80_t f; } uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA = uA.ui;\r\n    sign = signF32UI( uiA );\r\n    exp  = expF32UI( uiA );\r\n    frac = fracF32UI( uiA );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( exp == 0xFF ) {\r\n        if ( frac ) {\r\n            softfloat_f32UIToCommonNaN( state, uiA, &commonNaN );\r\n            uiZ = softfloat_commonNaNToExtF80UI( &commonNaN );\r\n            uiZ64 = uiZ.v64;\r\n            uiZ0  = uiZ.v0;\r\n        } else {\r\n            uiZ64 = packToExtF80UI64( sign, 0x7FFF );\r\n            uiZ0  = UINT64_C( 0x8000000000000000 );\r\n        }\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( ! exp ) {\r\n        if ( ! frac ) {\r\n            uiZ64 = packToExtF80UI64( sign, 0 );\r\n            uiZ0  = 0;\r\n            goto uiZ;\r\n        }\r\n        normExpSig = softfloat_normSubnormalF32Sig( frac );\r\n        exp = normExpSig.exp;\r\n        frac = normExpSig.sig;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uiZ64 = packToExtF80UI64( sign, exp + 0x3F80 );\r\n    uiZ0  = (uint_fast64_t) (frac | 0x00800000)<<40;\r\n uiZ:\r\n    uZ.s.signExp = uiZ64;\r\n    uZ.s.signif  = uiZ0;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f32_to_f128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nfloat128_t f32_to_f128( struct softfloat_state *state, float32_t a )\r\n{\r\n    union ui32_f32 uA;\r\n    uint_fast32_t uiA;\r\n    bool sign;\r\n    int_fast16_t exp;\r\n    uint_fast32_t frac;\r\n    struct commonNaN commonNaN;\r\n    struct uint128 uiZ;\r\n    struct exp16_sig32 normExpSig;\r\n    union ui128_f128 uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA = uA.ui;\r\n    sign = signF32UI( uiA );\r\n    exp  = expF32UI( uiA );\r\n    frac = fracF32UI( uiA );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( exp == 0xFF ) {\r\n        if ( frac ) {\r\n            softfloat_f32UIToCommonNaN( state, uiA, &commonNaN );\r\n            uiZ = softfloat_commonNaNToF128UI( &commonNaN );\r\n        } else {\r\n            uiZ.v64 = packToF128UI64( sign, 0x7FFF, 0 );\r\n            uiZ.v0  = 0;\r\n        }\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( ! exp ) {\r\n        if ( ! frac ) {\r\n            uiZ.v64 = packToF128UI64( sign, 0, 0 );\r\n            uiZ.v0  = 0;\r\n            goto uiZ;\r\n        }\r\n        normExpSig = softfloat_normSubnormalF32Sig( frac );\r\n        exp = normExpSig.exp - 1;\r\n        frac = normExpSig.sig;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uiZ.v64 = packToF128UI64( sign, exp + 0x3F80, (uint_fast64_t) frac<<25 );\r\n    uiZ.v0  = 0;\r\n uiZ:\r\n    uZ.ui = uiZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/f64_to_extF80.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t f64_to_extF80( struct softfloat_state *state, float64_t a )\r\n{\r\n    union ui64_f64 uA;\r\n    uint_fast64_t uiA;\r\n    bool sign;\r\n    int_fast16_t exp;\r\n    uint_fast64_t frac;\r\n    struct commonNaN commonNaN;\r\n    struct uint128 uiZ;\r\n    uint_fast16_t uiZ64;\r\n    uint_fast64_t uiZ0;\r\n    struct exp16_sig64 normExpSig;\r\n    union { struct extFloat80M s; extFloat80_t f; } uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uA.f = a;\r\n    uiA = uA.ui;\r\n    sign = signF64UI( uiA );\r\n    exp  = expF64UI( uiA );\r\n    frac = fracF64UI( uiA );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( exp == 0x7FF ) {\r\n        if ( frac ) {\r\n            softfloat_f64UIToCommonNaN( state, uiA, &commonNaN );\r\n            uiZ = softfloat_commonNaNToExtF80UI( &commonNaN );\r\n            uiZ64 = uiZ.v64;\r\n            uiZ0  = uiZ.v0;\r\n        } else {\r\n            uiZ64 = packToExtF80UI64( sign, 0x7FFF );\r\n            uiZ0  = UINT64_C( 0x8000000000000000 );\r\n        }\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( ! exp ) {\r\n        if ( ! frac ) {\r\n            uiZ64 = packToExtF80UI64( sign, 0 );\r\n            uiZ0  = 0;\r\n            goto uiZ;\r\n        }\r\n        normExpSig = softfloat_normSubnormalF64Sig( frac );\r\n        exp = normExpSig.exp;\r\n        frac = normExpSig.sig;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    uiZ64 = packToExtF80UI64( sign, exp + 0x3C00 );\r\n    uiZ0  = (frac | UINT64_C( 0x0010000000000000 ))<<11;\r\n uiZ:\r\n    uZ.s.signExp = uiZ64;\r\n    uZ.s.signif  = uiZ0;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/i32_to_extF80.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t i32_to_extF80( int32_t a )\r\n{\r\n    uint_fast16_t uiZ64;\r\n    uint_fast32_t absA;\r\n    bool sign;\r\n    int_fast8_t shiftDist;\r\n    union { struct extFloat80M s; extFloat80_t f; } uZ;\r\n\r\n    uiZ64 = 0;\r\n    absA = 0;\r\n    if ( a ) {\r\n        sign = (a < 0);\r\n        absA = sign ? -(uint_fast32_t) a : (uint_fast32_t) a;\r\n        shiftDist = softfloat_countLeadingZeros32( absA );\r\n        uiZ64 = packToExtF80UI64( sign, 0x401E - shiftDist );\r\n        absA <<= shiftDist;\r\n    }\r\n    uZ.s.signExp = uiZ64;\r\n    uZ.s.signif = (uint_fast64_t) absA<<32;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/i32_to_f128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"softfloat.h\"\r\n\r\nfloat128_t i32_to_f128( int32_t a )\r\n{\r\n    uint_fast64_t uiZ64;\r\n    bool sign;\r\n    uint_fast32_t absA;\r\n    int_fast8_t shiftDist;\r\n    union ui128_f128 uZ;\r\n\r\n    uiZ64 = 0;\r\n    if ( a ) {\r\n        sign = (a < 0);\r\n        absA = sign ? -(uint_fast32_t) a : (uint_fast32_t) a;\r\n        shiftDist = softfloat_countLeadingZeros32( absA ) + 17;\r\n        uiZ64 =\r\n            packToF128UI64(\r\n                sign, 0x402E - shiftDist, (uint_fast64_t) absA<<shiftDist );\r\n    }\r\n    uZ.ui.v64 = uiZ64;\r\n    uZ.ui.v0  = 0;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/internals.h",
    "content": "\r\n/*============================================================================\r\n\r\nThis C header file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#ifndef internals_h\r\n#define internals_h 1\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"primitives.h\"\r\n#include \"softfloat_types.h\"\r\n\r\nunion ui16_f16 { uint16_t ui; float16_t f; };\r\nunion ui32_f32 { uint32_t ui; float32_t f; };\r\nunion ui64_f64 { uint64_t ui; float64_t f; };\r\n\r\n#ifdef SOFTFLOAT_FAST_INT64\r\nunion extF80M_extF80 { struct extFloat80M fM; extFloat80_t f; };\r\nunion ui128_f128 { struct uint128 ui; float128_t f; };\r\n#endif\r\n\r\nenum {\r\n    softfloat_mulAdd_subC    = 1,\r\n    softfloat_mulAdd_subProd = 2\r\n};\r\n\r\n/*----------------------------------------------------------------------------\r\n*----------------------------------------------------------------------------*/\r\nuint_fast32_t softfloat_roundToUI32( bool, uint_fast64_t, uint_fast8_t, bool );\r\n\r\n#ifdef SOFTFLOAT_FAST_INT64\r\nuint_fast64_t\r\n softfloat_roundToUI64(\r\n     struct softfloat_state *, bool, uint_fast64_t, uint_fast64_t, uint_fast8_t, bool );\r\n#else\r\nuint_fast64_t softfloat_roundMToUI64( bool, uint32_t *, uint_fast8_t, bool );\r\n#endif\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nint_fast32_t softfloat_roundToI32( struct softfloat_state *, bool, uint_fast64_t, uint_fast8_t, bool );\r\n\r\n#ifdef SOFTFLOAT_FAST_INT64\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nint_fast64_t\r\n softfloat_roundToI64(\r\n     struct softfloat_state *, bool, uint_fast64_t, uint_fast64_t, uint_fast8_t, bool );\r\n#else\r\nint_fast64_t softfloat_roundMToI64( bool, uint32_t *, uint_fast8_t, bool );\r\n#endif\r\n\r\n/*----------------------------------------------------------------------------\r\n*----------------------------------------------------------------------------*/\r\n#define signF16UI( a ) ((bool) ((uint16_t) (a)>>15))\r\n#define expF16UI( a ) ((int_fast8_t) ((a)>>10) & 0x1F)\r\n#define fracF16UI( a ) ((a) & 0x03FF)\r\n#define packToF16UI( sign, exp, sig ) (((uint16_t) (sign)<<15) + ((uint16_t) (exp)<<10) + (sig))\r\n\r\n#define isNaNF16UI( a ) (((~(a) & 0x7C00) == 0) && ((a) & 0x03FF))\r\n\r\nstruct exp8_sig16 { int_fast8_t exp; uint_fast16_t sig; };\r\nstruct exp8_sig16 softfloat_normSubnormalF16Sig( uint_fast16_t );\r\n\r\nfloat16_t softfloat_roundPackToF16( bool, int_fast16_t, uint_fast16_t );\r\nfloat16_t softfloat_normRoundPackToF16( bool, int_fast16_t, uint_fast16_t );\r\n\r\nfloat16_t softfloat_addMagsF16( uint_fast16_t, uint_fast16_t );\r\nfloat16_t softfloat_subMagsF16( uint_fast16_t, uint_fast16_t );\r\nfloat16_t\r\n softfloat_mulAddF16(\r\n     uint_fast16_t, uint_fast16_t, uint_fast16_t, uint_fast8_t );\r\n\r\n/*----------------------------------------------------------------------------\r\n*----------------------------------------------------------------------------*/\r\n#define signF32UI( a ) ((bool) ((uint32_t) (a)>>31))\r\n#define expF32UI( a ) ((int_fast16_t) ((a)>>23) & 0xFF)\r\n#define fracF32UI( a ) ((a) & 0x007FFFFF)\r\n#define packToF32UI( sign, exp, sig ) (((uint32_t) (sign)<<31) + ((uint32_t) (exp)<<23) + (sig))\r\n\r\n#define isNaNF32UI( a ) (((~(a) & 0x7F800000) == 0) && ((a) & 0x007FFFFF))\r\n\r\nstruct exp16_sig32 { int_fast16_t exp; uint_fast32_t sig; };\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct exp16_sig32 softfloat_normSubnormalF32Sig( uint_fast32_t );\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nfloat32_t softfloat_roundPackToF32( struct softfloat_state *, bool, int_fast16_t, uint_fast32_t );\r\nfloat32_t softfloat_normRoundPackToF32( bool, int_fast16_t, uint_fast32_t );\r\n\r\nfloat32_t softfloat_addMagsF32( uint_fast32_t, uint_fast32_t );\r\nfloat32_t softfloat_subMagsF32( uint_fast32_t, uint_fast32_t );\r\nfloat32_t\r\n softfloat_mulAddF32(\r\n     uint_fast32_t, uint_fast32_t, uint_fast32_t, uint_fast8_t );\r\n\r\n/*----------------------------------------------------------------------------\r\n*----------------------------------------------------------------------------*/\r\n#define signF64UI( a ) ((bool) ((uint64_t) (a)>>63))\r\n#define expF64UI( a ) ((int_fast16_t) ((a)>>52) & 0x7FF)\r\n#define fracF64UI( a ) ((a) & UINT64_C( 0x000FFFFFFFFFFFFF ))\r\n#define packToF64UI( sign, exp, sig ) ((uint64_t) (((uint_fast64_t) (sign)<<63) + ((uint_fast64_t) (exp)<<52) + (sig)))\r\n\r\n#define isNaNF64UI( a ) (((~(a) & UINT64_C( 0x7FF0000000000000 )) == 0) && ((a) & UINT64_C( 0x000FFFFFFFFFFFFF )))\r\n\r\nstruct exp16_sig64 { int_fast16_t exp; uint_fast64_t sig; };\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct exp16_sig64 softfloat_normSubnormalF64Sig( uint_fast64_t );\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nfloat64_t softfloat_roundPackToF64( struct softfloat_state *, bool, int_fast16_t, uint_fast64_t );\r\nfloat64_t softfloat_normRoundPackToF64( bool, int_fast16_t, uint_fast64_t );\r\n\r\nfloat64_t softfloat_addMagsF64( uint_fast64_t, uint_fast64_t, bool );\r\nfloat64_t softfloat_subMagsF64( uint_fast64_t, uint_fast64_t, bool );\r\nfloat64_t\r\n softfloat_mulAddF64(\r\n     uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast8_t );\r\n\r\n/*----------------------------------------------------------------------------\r\n*----------------------------------------------------------------------------*/\r\n#define signExtF80UI64( a64 ) ((bool) ((uint16_t) (a64)>>15))\r\n#define expExtF80UI64( a64 ) ((a64) & 0x7FFF)\r\n#define packToExtF80UI64( sign, exp ) ((uint_fast16_t) (sign)<<15 | (exp))\r\n\r\n#define isNaNExtF80UI( a64, a0 ) ((((a64) & 0x7FFF) == 0x7FFF) && ((a0) & UINT64_C( 0x7FFFFFFFFFFFFFFF )))\r\n\r\n#ifdef SOFTFLOAT_FAST_INT64\r\n\r\n/*----------------------------------------------------------------------------\r\n*----------------------------------------------------------------------------*/\r\n\r\nstruct exp32_sig64 { int_fast32_t exp; uint64_t sig; };\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct exp32_sig64 softfloat_normSubnormalExtF80Sig( uint_fast64_t );\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t\r\n softfloat_roundPackToExtF80(\r\n     struct softfloat_state *, bool, int_fast32_t, uint_fast64_t, uint_fast64_t, uint_fast8_t );\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t\r\n softfloat_normRoundPackToExtF80(\r\n     struct softfloat_state *, bool, int_fast32_t, uint_fast64_t, uint_fast64_t, uint_fast8_t );\r\n\r\nextFloat80_t\r\n softfloat_addMagsExtF80(\r\n     struct softfloat_state *, uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool );\r\nextFloat80_t\r\n softfloat_subMagsExtF80(\r\n     struct softfloat_state *, uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool );\r\n\r\n/*----------------------------------------------------------------------------\r\n*----------------------------------------------------------------------------*/\r\n#define signF128UI64( a64 ) ((bool) ((uint64_t) (a64)>>63))\r\n#define expF128UI64( a64 ) ((int_fast32_t) ((a64)>>48) & 0x7FFF)\r\n#define fracF128UI64( a64 ) ((a64) & UINT64_C( 0x0000FFFFFFFFFFFF ))\r\n#define packToF128UI64( sign, exp, sig64 ) (((uint_fast64_t) (sign)<<63) + ((uint_fast64_t) (exp)<<48) + (sig64))\r\n\r\n#define isNaNF128UI( a64, a0 ) (((~(a64) & UINT64_C( 0x7FFF000000000000 )) == 0) && (a0 || ((a64) & UINT64_C( 0x0000FFFFFFFFFFFF ))))\r\n\r\nstruct exp32_sig128 { int_fast32_t exp; struct uint128 sig; };\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct exp32_sig128\r\n softfloat_normSubnormalF128Sig( uint_fast64_t, uint_fast64_t );\r\n\r\nfloat128_t\r\n softfloat_roundPackToF128(\r\n     struct softfloat_state *,\r\n     bool, int_fast32_t, uint_fast64_t, uint_fast64_t, uint_fast64_t );\r\nfloat128_t\r\n softfloat_normRoundPackToF128(\r\n     struct softfloat_state *,\r\n     bool, int_fast32_t, uint_fast64_t, uint_fast64_t );\r\n\r\nfloat128_t\r\n softfloat_addMagsF128(\r\n     struct softfloat_state *,\r\n     uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool );\r\nfloat128_t\r\n softfloat_subMagsF128(\r\n     struct softfloat_state *,\r\n     uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool );\r\nfloat128_t\r\n softfloat_mulAddF128(\r\n     uint_fast64_t,\r\n     uint_fast64_t,\r\n     uint_fast64_t,\r\n     uint_fast64_t,\r\n     uint_fast64_t,\r\n     uint_fast64_t,\r\n     uint_fast8_t\r\n );\r\n\r\n#else\r\n\r\n/*----------------------------------------------------------------------------\r\n*----------------------------------------------------------------------------*/\r\n\r\nbool\r\n softfloat_tryPropagateNaNExtF80M(\r\n     const struct extFloat80M *,\r\n     const struct extFloat80M *,\r\n     struct extFloat80M *\r\n );\r\nvoid softfloat_invalidExtF80M( struct extFloat80M * );\r\n\r\nint softfloat_normExtF80SigM( uint64_t * );\r\n\r\nvoid\r\n softfloat_roundPackMToExtF80M(\r\n     bool, int32_t, uint32_t *, uint_fast8_t, struct extFloat80M * );\r\nvoid\r\n softfloat_normRoundPackMToExtF80M(\r\n     bool, int32_t, uint32_t *, uint_fast8_t, struct extFloat80M * );\r\n\r\nvoid\r\n softfloat_addExtF80M(\r\n     const struct extFloat80M *,\r\n     const struct extFloat80M *,\r\n     struct extFloat80M *,\r\n     bool\r\n );\r\n\r\nint\r\n softfloat_compareNonnormExtF80M(\r\n     const struct extFloat80M *, const struct extFloat80M * );\r\n\r\n/*----------------------------------------------------------------------------\r\n*----------------------------------------------------------------------------*/\r\n#define signF128UI96( a96 ) ((bool) ((uint32_t) (a96)>>31))\r\n#define expF128UI96( a96 ) ((int32_t) ((a96)>>16) & 0x7FFF)\r\n#define fracF128UI96( a96 ) ((a96) & 0x0000FFFF)\r\n#define packToF128UI96( sign, exp, sig96 ) (((uint32_t) (sign)<<31) + ((uint32_t) (exp)<<16) + (sig96))\r\n\r\nbool softfloat_isNaNF128M( const uint32_t * );\r\n\r\nbool\r\n softfloat_tryPropagateNaNF128M(\r\n     const uint32_t *, const uint32_t *, uint32_t * );\r\nvoid softfloat_invalidF128M( uint32_t * );\r\n\r\nint softfloat_shiftNormSigF128M( const uint32_t *, uint_fast8_t, uint32_t * );\r\n\r\nvoid softfloat_roundPackMToF128M( bool, int32_t, uint32_t *, uint32_t * );\r\nvoid softfloat_normRoundPackMToF128M( bool, int32_t, uint32_t *, uint32_t * );\r\n\r\nvoid\r\n softfloat_addF128M( const uint32_t *, const uint32_t *, uint32_t *, bool );\r\nvoid\r\n softfloat_mulAddF128M(\r\n     const uint32_t *,\r\n     const uint32_t *,\r\n     const uint32_t *,\r\n     uint32_t *,\r\n     uint_fast8_t\r\n );\r\n\r\n#endif\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/primitives.h",
    "content": "\r\n/*============================================================================\r\n\r\nThis C header file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#ifndef primitives_h\r\n#define primitives_h 1\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"primitiveTypes.h\"\r\n\r\n#ifndef softfloat_shortShiftRightJam64\r\n/*----------------------------------------------------------------------------\r\n| Shifts 'a' right by the number of bits given in 'dist', which must be in\r\n| the range 1 to 63.  If any nonzero bits are shifted off, they are \"jammed\"\r\n| into the least-significant bit of the shifted value by setting the least-\r\n| significant bit to 1.  This shifted-and-jammed value is returned.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)\r\nINLINE\r\nuint64_t softfloat_shortShiftRightJam64( uint64_t a, uint_fast8_t dist )\r\n    { return a>>dist | ((a & (((uint_fast64_t) 1<<dist) - 1)) != 0); }\r\n#else\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint64_t softfloat_shortShiftRightJam64( uint64_t a, uint_fast8_t dist );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_shiftRightJam32\r\n/*----------------------------------------------------------------------------\r\n| Shifts 'a' right by the number of bits given in 'dist', which must not\r\n| be zero.  If any nonzero bits are shifted off, they are \"jammed\" into the\r\n| least-significant bit of the shifted value by setting the least-significant\r\n| bit to 1.  This shifted-and-jammed value is returned.\r\n|   The value of 'dist' can be arbitrarily large.  In particular, if 'dist' is\r\n| greater than 32, the result will be either 0 or 1, depending on whether 'a'\r\n| is zero or nonzero.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)\r\nINLINE uint32_t softfloat_shiftRightJam32( uint32_t a, uint_fast16_t dist )\r\n{\r\n    return\r\n        (dist < 31) ? a>>dist | ((uint32_t) (a<<(-dist & 31)) != 0) : (a != 0);\r\n}\r\n#else\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint32_t softfloat_shiftRightJam32( uint32_t a, uint_fast16_t dist );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_shiftRightJam64\r\n/*----------------------------------------------------------------------------\r\n| Shifts 'a' right by the number of bits given in 'dist', which must not\r\n| be zero.  If any nonzero bits are shifted off, they are \"jammed\" into the\r\n| least-significant bit of the shifted value by setting the least-significant\r\n| bit to 1.  This shifted-and-jammed value is returned.\r\n|   The value of 'dist' can be arbitrarily large.  In particular, if 'dist' is\r\n| greater than 64, the result will be either 0 or 1, depending on whether 'a'\r\n| is zero or nonzero.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)\r\nINLINE uint64_t softfloat_shiftRightJam64( uint64_t a, uint_fast32_t dist )\r\n{\r\n    return\r\n        (dist < 63) ? a>>dist | ((uint64_t) (a<<(-dist & 63)) != 0) : (a != 0);\r\n}\r\n#else\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint64_t softfloat_shiftRightJam64( uint64_t a, uint_fast32_t dist );\r\n#endif\r\n#endif\r\n\r\n/*----------------------------------------------------------------------------\r\n| A constant table that translates an 8-bit unsigned integer (the array index)\r\n| into the number of leading 0 bits before the most-significant 1 of that\r\n| integer.  For integer zero (index 0), the corresponding table element is 8.\r\n*----------------------------------------------------------------------------*/\r\nextern const uint_least8_t softfloat_countLeadingZeros8[256];\r\n\r\n#ifndef softfloat_countLeadingZeros16\r\n/*----------------------------------------------------------------------------\r\n| Returns the number of leading 0 bits before the most-significant 1 bit of\r\n| 'a'.  If 'a' is zero, 16 is returned.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)\r\nINLINE uint_fast8_t softfloat_countLeadingZeros16( uint16_t a )\r\n{\r\n    uint_fast8_t count = 8;\r\n    if ( 0x100 <= a ) {\r\n        count = 0;\r\n        a >>= 8;\r\n    }\r\n    count += softfloat_countLeadingZeros8[a];\r\n    return count;\r\n}\r\n#else\r\nuint_fast8_t softfloat_countLeadingZeros16( uint16_t a );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_countLeadingZeros32\r\n/*----------------------------------------------------------------------------\r\n| Returns the number of leading 0 bits before the most-significant 1 bit of\r\n| 'a'.  If 'a' is zero, 32 is returned.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)\r\nINLINE uint_fast8_t softfloat_countLeadingZeros32( uint32_t a )\r\n{\r\n    uint_fast8_t count = 0;\r\n    if ( a < 0x10000 ) {\r\n        count = 16;\r\n        a <<= 16;\r\n    }\r\n    if ( a < 0x1000000 ) {\r\n        count += 8;\r\n        a <<= 8;\r\n    }\r\n    count += softfloat_countLeadingZeros8[a>>24];\r\n    return count;\r\n}\r\n#else\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint_fast8_t softfloat_countLeadingZeros32( uint32_t a );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_countLeadingZeros64\r\n/*----------------------------------------------------------------------------\r\n| Returns the number of leading 0 bits before the most-significant 1 bit of\r\n| 'a'.  If 'a' is zero, 64 is returned.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint_fast8_t softfloat_countLeadingZeros64( uint64_t a );\r\n#endif\r\n\r\nextern const uint16_t softfloat_approxRecip_1k0s[16];\r\nextern const uint16_t softfloat_approxRecip_1k1s[16];\r\n\r\n#ifndef softfloat_approxRecip32_1\r\n/*----------------------------------------------------------------------------\r\n| Returns an approximation to the reciprocal of the number represented by 'a',\r\n| where 'a' is interpreted as an unsigned fixed-point number with one integer\r\n| bit and 31 fraction bits.  The 'a' input must be \"normalized\", meaning that\r\n| its most-significant bit (bit 31) must be 1.  Thus, if A is the value of\r\n| the fixed-point interpretation of 'a', then 1 <= A < 2.  The returned value\r\n| is interpreted as a pure unsigned fraction, having no integer bits and 32\r\n| fraction bits.  The approximation returned is never greater than the true\r\n| reciprocal 1/A, and it differs from the true reciprocal by at most 2.006 ulp\r\n| (units in the last place).\r\n*----------------------------------------------------------------------------*/\r\n#ifdef SOFTFLOAT_FAST_DIV64TO32\r\n#define softfloat_approxRecip32_1( a ) ((uint32_t) (UINT64_C( 0x7FFFFFFFFFFFFFFF ) / (uint32_t) (a)))\r\n#else\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint32_t softfloat_approxRecip32_1( uint32_t a );\r\n#endif\r\n#endif\r\n\r\nextern const uint16_t softfloat_approxRecipSqrt_1k0s[16];\r\nextern const uint16_t softfloat_approxRecipSqrt_1k1s[16];\r\n\r\n#ifndef softfloat_approxRecipSqrt32_1\r\n/*----------------------------------------------------------------------------\r\n| Returns an approximation to the reciprocal of the square root of the number\r\n| represented by 'a', where 'a' is interpreted as an unsigned fixed-point\r\n| number either with one integer bit and 31 fraction bits or with two integer\r\n| bits and 30 fraction bits.  The format of 'a' is determined by 'oddExpA',\r\n| which must be either 0 or 1.  If 'oddExpA' is 1, 'a' is interpreted as\r\n| having one integer bit, and if 'oddExpA' is 0, 'a' is interpreted as having\r\n| two integer bits.  The 'a' input must be \"normalized\", meaning that its\r\n| most-significant bit (bit 31) must be 1.  Thus, if A is the value of the\r\n| fixed-point interpretation of 'a', it follows that 1 <= A < 2 when 'oddExpA'\r\n| is 1, and 2 <= A < 4 when 'oddExpA' is 0.\r\n|   The returned value is interpreted as a pure unsigned fraction, having\r\n| no integer bits and 32 fraction bits.  The approximation returned is never\r\n| greater than the true reciprocal 1/sqrt(A), and it differs from the true\r\n| reciprocal by at most 2.06 ulp (units in the last place).  The approximation\r\n| returned is also always within the range 0.5 to 1; thus, the most-\r\n| significant bit of the result is always set.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint32_t softfloat_approxRecipSqrt32_1( unsigned int oddExpA, uint32_t a );\r\n#endif\r\n\r\n#ifdef SOFTFLOAT_FAST_INT64\r\n\r\n/*----------------------------------------------------------------------------\r\n| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is\r\n| defined.\r\n*----------------------------------------------------------------------------*/\r\n\r\n#ifndef softfloat_eq128\r\n/*----------------------------------------------------------------------------\r\n| Returns true if the 128-bit unsigned integer formed by concatenating 'a64'\r\n| and 'a0' is equal to the 128-bit unsigned integer formed by concatenating\r\n| 'b64' and 'b0'.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (1 <= INLINE_LEVEL)\r\nINLINE\r\nbool softfloat_eq128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )\r\n    { return (a64 == b64) && (a0 == b0); }\r\n#else\r\nbool softfloat_eq128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_le128\r\n/*----------------------------------------------------------------------------\r\n| Returns true if the 128-bit unsigned integer formed by concatenating 'a64'\r\n| and 'a0' is less than or equal to the 128-bit unsigned integer formed by\r\n| concatenating 'b64' and 'b0'.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)\r\nINLINE\r\nbool softfloat_le128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )\r\n    { return (a64 < b64) || ((a64 == b64) && (a0 <= b0)); }\r\n#else\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nbool softfloat_le128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_lt128\r\n/*----------------------------------------------------------------------------\r\n| Returns true if the 128-bit unsigned integer formed by concatenating 'a64'\r\n| and 'a0' is less than the 128-bit unsigned integer formed by concatenating\r\n| 'b64' and 'b0'.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)\r\nINLINE\r\nbool softfloat_lt128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )\r\n    { return (a64 < b64) || ((a64 == b64) && (a0 < b0)); }\r\n#else\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nbool softfloat_lt128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_shortShiftLeft128\r\n/*----------------------------------------------------------------------------\r\n| Shifts the 128 bits formed by concatenating 'a64' and 'a0' left by the\r\n| number of bits given in 'dist', which must be in the range 1 to 63.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)\r\nINLINE\r\nstruct uint128\r\n softfloat_shortShiftLeft128( uint64_t a64, uint64_t a0, uint_fast8_t dist )\r\n{\r\n    struct uint128 z;\r\n    z.v64 = a64<<dist | a0>>(-dist & 63);\r\n    z.v0 = a0<<dist;\r\n    return z;\r\n}\r\n#else\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128\r\n softfloat_shortShiftLeft128( uint64_t a64, uint64_t a0, uint_fast8_t dist );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_shortShiftRight128\r\n/*----------------------------------------------------------------------------\r\n| Shifts the 128 bits formed by concatenating 'a64' and 'a0' right by the\r\n| number of bits given in 'dist', which must be in the range 1 to 63.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)\r\nINLINE\r\nstruct uint128\r\n softfloat_shortShiftRight128( uint64_t a64, uint64_t a0, uint_fast8_t dist )\r\n{\r\n    struct uint128 z;\r\n    z.v64 = a64>>dist;\r\n    z.v0 = a64<<(-dist & 63) | a0>>dist;\r\n    return z;\r\n}\r\n#else\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128\r\n softfloat_shortShiftRight128( uint64_t a64, uint64_t a0, uint_fast8_t dist );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_shortShiftRightJam64Extra\r\n/*----------------------------------------------------------------------------\r\n| This function is the same as 'softfloat_shiftRightJam64Extra' (below),\r\n| except that 'dist' must be in the range 1 to 63.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)\r\nINLINE\r\nstruct uint64_extra\r\n softfloat_shortShiftRightJam64Extra(\r\n     uint64_t a, uint64_t extra, uint_fast8_t dist )\r\n{\r\n    struct uint64_extra z;\r\n    z.v = a>>dist;\r\n    z.extra = a<<(-dist & 63) | (extra != 0);\r\n    return z;\r\n}\r\n#else\r\nstruct uint64_extra\r\n softfloat_shortShiftRightJam64Extra(\r\n     uint64_t a, uint64_t extra, uint_fast8_t dist );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_shortShiftRightJam128\r\n/*----------------------------------------------------------------------------\r\n| Shifts the 128 bits formed by concatenating 'a64' and 'a0' right by the\r\n| number of bits given in 'dist', which must be in the range 1 to 63.  If any\r\n| nonzero bits are shifted off, they are \"jammed\" into the least-significant\r\n| bit of the shifted value by setting the least-significant bit to 1.  This\r\n| shifted-and-jammed value is returned.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)\r\nINLINE\r\nstruct uint128\r\n softfloat_shortShiftRightJam128(\r\n     uint64_t a64, uint64_t a0, uint_fast8_t dist )\r\n{\r\n    uint_fast8_t negDist = -dist;\r\n    struct uint128 z;\r\n    z.v64 = a64>>dist;\r\n    z.v0 =\r\n        a64<<(negDist & 63) | a0>>dist\r\n            | ((uint64_t) (a0<<(negDist & 63)) != 0);\r\n    return z;\r\n}\r\n#else\r\nstruct uint128\r\n softfloat_shortShiftRightJam128(\r\n     uint64_t a64, uint64_t a0, uint_fast8_t dist );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_shortShiftRightJam128Extra\r\n/*----------------------------------------------------------------------------\r\n| This function is the same as 'softfloat_shiftRightJam128Extra' (below),\r\n| except that 'dist' must be in the range 1 to 63.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)\r\nINLINE\r\nstruct uint128_extra\r\n softfloat_shortShiftRightJam128Extra(\r\n     uint64_t a64, uint64_t a0, uint64_t extra, uint_fast8_t dist )\r\n{\r\n    uint_fast8_t negDist = -dist;\r\n    struct uint128_extra z;\r\n    z.v.v64 = a64>>dist;\r\n    z.v.v0 = a64<<(negDist & 63) | a0>>dist;\r\n    z.extra = a0<<(negDist & 63) | (extra != 0);\r\n    return z;\r\n}\r\n#else\r\nstruct uint128_extra\r\n softfloat_shortShiftRightJam128Extra(\r\n     uint64_t a64, uint64_t a0, uint64_t extra, uint_fast8_t dist );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_shiftRightJam64Extra\r\n/*----------------------------------------------------------------------------\r\n| Shifts the 128 bits formed by concatenating 'a' and 'extra' right by 64\r\n| _plus_ the number of bits given in 'dist', which must not be zero.  This\r\n| shifted value is at most 64 nonzero bits and is returned in the 'v' field\r\n| of the 'struct uint64_extra' result.  The 64-bit 'extra' field of the result\r\n| contains a value formed as follows from the bits that were shifted off:  The\r\n| _last_ bit shifted off is the most-significant bit of the 'extra' field, and\r\n| the other 63 bits of the 'extra' field are all zero if and only if _all_but_\r\n| _the_last_ bits shifted off were all zero.\r\n|   (This function makes more sense if 'a' and 'extra' are considered to form\r\n| an unsigned fixed-point number with binary point between 'a' and 'extra'.\r\n| This fixed-point value is shifted right by the number of bits given in\r\n| 'dist', and the integer part of this shifted value is returned in the 'v'\r\n| field of the result.  The fractional part of the shifted value is modified\r\n| as described above and returned in the 'extra' field of the result.)\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (4 <= INLINE_LEVEL)\r\nINLINE\r\nstruct uint64_extra\r\n softfloat_shiftRightJam64Extra(\r\n     uint64_t a, uint64_t extra, uint_fast32_t dist )\r\n{\r\n    struct uint64_extra z;\r\n    if ( dist < 64 ) {\r\n        z.v = a>>dist;\r\n        z.extra = a<<(-dist & 63);\r\n    } else {\r\n        z.v = 0;\r\n        z.extra = (dist == 64) ? a : (a != 0);\r\n    }\r\n    z.extra |= (extra != 0);\r\n    return z;\r\n}\r\n#else\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint64_extra\r\n softfloat_shiftRightJam64Extra(\r\n     uint64_t a, uint64_t extra, uint_fast32_t dist );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_shiftRightJam128\r\n/*----------------------------------------------------------------------------\r\n| Shifts the 128 bits formed by concatenating 'a64' and 'a0' right by the\r\n| number of bits given in 'dist', which must not be zero.  If any nonzero bits\r\n| are shifted off, they are \"jammed\" into the least-significant bit of the\r\n| shifted value by setting the least-significant bit to 1.  This shifted-and-\r\n| jammed value is returned.\r\n|   The value of 'dist' can be arbitrarily large.  In particular, if 'dist' is\r\n| greater than 128, the result will be either 0 or 1, depending on whether the\r\n| original 128 bits are all zeros.\r\n*----------------------------------------------------------------------------*/\r\nstruct uint128\r\n softfloat_shiftRightJam128( uint64_t a64, uint64_t a0, uint_fast32_t dist );\r\n#endif\r\n\r\n#ifndef softfloat_shiftRightJam128Extra\r\n/*----------------------------------------------------------------------------\r\n| Shifts the 192 bits formed by concatenating 'a64', 'a0', and 'extra' right\r\n| by 64 _plus_ the number of bits given in 'dist', which must not be zero.\r\n| This shifted value is at most 128 nonzero bits and is returned in the 'v'\r\n| field of the 'struct uint128_extra' result.  The 64-bit 'extra' field of the\r\n| result contains a value formed as follows from the bits that were shifted\r\n| off:  The _last_ bit shifted off is the most-significant bit of the 'extra'\r\n| field, and the other 63 bits of the 'extra' field are all zero if and only\r\n| if _all_but_the_last_ bits shifted off were all zero.\r\n|   (This function makes more sense if 'a64', 'a0', and 'extra' are considered\r\n| to form an unsigned fixed-point number with binary point between 'a0' and\r\n| 'extra'.  This fixed-point value is shifted right by the number of bits\r\n| given in 'dist', and the integer part of this shifted value is returned\r\n| in the 'v' field of the result.  The fractional part of the shifted value\r\n| is modified as described above and returned in the 'extra' field of the\r\n| result.)\r\n*----------------------------------------------------------------------------*/\r\nstruct uint128_extra\r\n softfloat_shiftRightJam128Extra(\r\n     uint64_t a64, uint64_t a0, uint64_t extra, uint_fast32_t dist );\r\n#endif\r\n\r\n#ifndef softfloat_shiftRightJam256M\r\n/*----------------------------------------------------------------------------\r\n| Shifts the 256-bit unsigned integer pointed to by 'aPtr' right by the number\r\n| of bits given in 'dist', which must not be zero.  If any nonzero bits are\r\n| shifted off, they are \"jammed\" into the least-significant bit of the shifted\r\n| value by setting the least-significant bit to 1.  This shifted-and-jammed\r\n| value is stored at the location pointed to by 'zPtr'.  Each of 'aPtr' and\r\n| 'zPtr' points to an array of four 64-bit elements that concatenate in the\r\n| platform's normal endian order to form a 256-bit integer.\r\n|   The value of 'dist' can be arbitrarily large.  In particular, if 'dist'\r\n| is greater than 256, the stored result will be either 0 or 1, depending on\r\n| whether the original 256 bits are all zeros.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_shiftRightJam256M(\r\n     const uint64_t *aPtr, uint_fast32_t dist, uint64_t *zPtr );\r\n#endif\r\n\r\n#ifndef softfloat_add128\r\n/*----------------------------------------------------------------------------\r\n| Returns the sum of the 128-bit integer formed by concatenating 'a64' and\r\n| 'a0' and the 128-bit integer formed by concatenating 'b64' and 'b0'.  The\r\n| addition is modulo 2^128, so any carry out is lost.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)\r\nINLINE\r\nstruct uint128\r\n softfloat_add128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )\r\n{\r\n    struct uint128 z;\r\n    z.v0 = a0 + b0;\r\n    z.v64 = a64 + b64 + (z.v0 < a0);\r\n    return z;\r\n}\r\n#else\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128\r\n softfloat_add128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_add256M\r\n/*----------------------------------------------------------------------------\r\n| Adds the two 256-bit integers pointed to by 'aPtr' and 'bPtr'.  The addition\r\n| is modulo 2^256, so any carry out is lost.  The sum is stored at the\r\n| location pointed to by 'zPtr'.  Each of 'aPtr', 'bPtr', and 'zPtr' points to\r\n| an array of four 64-bit elements that concatenate in the platform's normal\r\n| endian order to form a 256-bit integer.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_add256M(\r\n     const uint64_t *aPtr, const uint64_t *bPtr, uint64_t *zPtr );\r\n#endif\r\n\r\n#ifndef softfloat_sub128\r\n/*----------------------------------------------------------------------------\r\n| Returns the difference of the 128-bit integer formed by concatenating 'a64'\r\n| and 'a0' and the 128-bit integer formed by concatenating 'b64' and 'b0'.\r\n| The subtraction is modulo 2^128, so any borrow out (carry out) is lost.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)\r\nINLINE\r\nstruct uint128\r\n softfloat_sub128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )\r\n{\r\n    struct uint128 z;\r\n    z.v0 = a0 - b0;\r\n    z.v64 = a64 - b64;\r\n    z.v64 -= (a0 < b0);\r\n    return z;\r\n}\r\n#else\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128\r\n softfloat_sub128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_sub256M\r\n/*----------------------------------------------------------------------------\r\n| Subtracts the 256-bit integer pointed to by 'bPtr' from the 256-bit integer\r\n| pointed to by 'aPtr'.  The addition is modulo 2^256, so any borrow out\r\n| (carry out) is lost.  The difference is stored at the location pointed to\r\n| by 'zPtr'.  Each of 'aPtr', 'bPtr', and 'zPtr' points to an array of four\r\n| 64-bit elements that concatenate in the platform's normal endian order to\r\n| form a 256-bit integer.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_sub256M(\r\n     const uint64_t *aPtr, const uint64_t *bPtr, uint64_t *zPtr );\r\n#endif\r\n\r\n#ifndef softfloat_mul64ByShifted32To128\r\n/*----------------------------------------------------------------------------\r\n| Returns the 128-bit product of 'a', 'b', and 2^32.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)\r\nINLINE struct uint128 softfloat_mul64ByShifted32To128( uint64_t a, uint32_t b )\r\n{\r\n    uint_fast64_t mid;\r\n    struct uint128 z;\r\n    mid = (uint_fast64_t) (uint32_t) a * b;\r\n    z.v0 = mid<<32;\r\n    z.v64 = (uint_fast64_t) (uint32_t) (a>>32) * b + (mid>>32);\r\n    return z;\r\n}\r\n#else\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128 softfloat_mul64ByShifted32To128( uint64_t a, uint32_t b );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_mul64To128\r\n/*----------------------------------------------------------------------------\r\n| Returns the 128-bit product of 'a' and 'b'.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128 softfloat_mul64To128( uint64_t a, uint64_t b );\r\n#endif\r\n\r\n#ifndef softfloat_mul128By32\r\n/*----------------------------------------------------------------------------\r\n| Returns the product of the 128-bit integer formed by concatenating 'a64' and\r\n| 'a0', multiplied by 'b'.  The multiplication is modulo 2^128; any overflow\r\n| bits are discarded.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (4 <= INLINE_LEVEL)\r\nINLINE\r\nstruct uint128 softfloat_mul128By32( uint64_t a64, uint64_t a0, uint32_t b )\r\n{\r\n    struct uint128 z;\r\n    uint_fast64_t mid;\r\n    uint_fast32_t carry;\r\n    z.v0 = a0 * b;\r\n    mid = (uint_fast64_t) (uint32_t) (a0>>32) * b;\r\n    carry = (uint32_t) ((uint_fast32_t) (z.v0>>32) - (uint_fast32_t) mid);\r\n    z.v64 = a64 * b + (uint_fast32_t) ((mid + carry)>>32);\r\n    return z;\r\n}\r\n#else\r\nstruct uint128 softfloat_mul128By32( uint64_t a64, uint64_t a0, uint32_t b );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_mul128To256M\r\n/*----------------------------------------------------------------------------\r\n| Multiplies the 128-bit unsigned integer formed by concatenating 'a64' and\r\n| 'a0' by the 128-bit unsigned integer formed by concatenating 'b64' and\r\n| 'b0'.  The 256-bit product is stored at the location pointed to by 'zPtr'.\r\n| Argument 'zPtr' points to an array of four 64-bit elements that concatenate\r\n| in the platform's normal endian order to form a 256-bit integer.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_mul128To256M(\r\n     uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0, uint64_t *zPtr );\r\n#endif\r\n\r\n#else\r\n\r\n/*----------------------------------------------------------------------------\r\n| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is not\r\n| defined.\r\n*----------------------------------------------------------------------------*/\r\n\r\n#ifndef softfloat_compare96M\r\n/*----------------------------------------------------------------------------\r\n| Compares the two 96-bit unsigned integers pointed to by 'aPtr' and 'bPtr'.\r\n| Returns -1 if the first integer (A) is less than the second (B); returns 0\r\n| if the two integers are equal; and returns +1 if the first integer (A)\r\n| is greater than the second (B).  (The result is thus the signum of A - B.)\r\n| Each of 'aPtr' and 'bPtr' points to an array of three 32-bit elements that\r\n| concatenate in the platform's normal endian order to form a 96-bit integer.\r\n*----------------------------------------------------------------------------*/\r\nint_fast8_t softfloat_compare96M( const uint32_t *aPtr, const uint32_t *bPtr );\r\n#endif\r\n\r\n#ifndef softfloat_compare128M\r\n/*----------------------------------------------------------------------------\r\n| Compares the two 128-bit unsigned integers pointed to by 'aPtr' and 'bPtr'.\r\n| Returns -1 if the first integer (A) is less than the second (B); returns 0\r\n| if the two integers are equal; and returns +1 if the first integer (A)\r\n| is greater than the second (B).  (The result is thus the signum of A - B.)\r\n| Each of 'aPtr' and 'bPtr' points to an array of four 32-bit elements that\r\n| concatenate in the platform's normal endian order to form a 128-bit integer.\r\n*----------------------------------------------------------------------------*/\r\nint_fast8_t\r\n softfloat_compare128M( const uint32_t *aPtr, const uint32_t *bPtr );\r\n#endif\r\n\r\n#ifndef softfloat_shortShiftLeft64To96M\r\n/*----------------------------------------------------------------------------\r\n| Extends 'a' to 96 bits and shifts the value left by the number of bits given\r\n| in 'dist', which must be in the range 1 to 31.  The result is stored at the\r\n| location pointed to by 'zPtr'.  Argument 'zPtr' points to an array of three\r\n| 32-bit elements that concatenate in the platform's normal endian order to\r\n| form a 96-bit integer.\r\n*----------------------------------------------------------------------------*/\r\n#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)\r\nINLINE\r\nvoid\r\n softfloat_shortShiftLeft64To96M(\r\n     uint64_t a, uint_fast8_t dist, uint32_t *zPtr )\r\n{\r\n    zPtr[indexWord( 3, 0 )] = (uint32_t) a<<dist;\r\n    a >>= 32 - dist;\r\n    zPtr[indexWord( 3, 2 )] = a>>32;\r\n    zPtr[indexWord( 3, 1 )] = a;\r\n}\r\n#else\r\nvoid\r\n softfloat_shortShiftLeft64To96M(\r\n     uint64_t a, uint_fast8_t dist, uint32_t *zPtr );\r\n#endif\r\n#endif\r\n\r\n#ifndef softfloat_shortShiftLeftM\r\n/*----------------------------------------------------------------------------\r\n| Shifts the N-bit unsigned integer pointed to by 'aPtr' left by the number\r\n| of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'\r\n| must be in the range 1 to 31.  Any nonzero bits shifted off are lost.  The\r\n| shifted N-bit result is stored at the location pointed to by 'zPtr'.  Each\r\n| of 'aPtr' and 'zPtr' points to a 'size_words'-long array of 32-bit elements\r\n| that concatenate in the platform's normal endian order to form an N-bit\r\n| integer.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_shortShiftLeftM(\r\n     uint_fast8_t size_words,\r\n     const uint32_t *aPtr,\r\n     uint_fast8_t dist,\r\n     uint32_t *zPtr\r\n );\r\n#endif\r\n\r\n#ifndef softfloat_shortShiftLeft96M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_shortShiftLeftM' with\r\n| 'size_words' = 3 (N = 96).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_shortShiftLeft96M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 3, aPtr, dist, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_shortShiftLeft128M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_shortShiftLeftM' with\r\n| 'size_words' = 4 (N = 128).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_shortShiftLeft128M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 4, aPtr, dist, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_shortShiftLeft160M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_shortShiftLeftM' with\r\n| 'size_words' = 5 (N = 160).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_shortShiftLeft160M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 5, aPtr, dist, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_shiftLeftM\r\n/*----------------------------------------------------------------------------\r\n| Shifts the N-bit unsigned integer pointed to by 'aPtr' left by the number\r\n| of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'\r\n| must not be zero.  Any nonzero bits shifted off are lost.  The shifted\r\n| N-bit result is stored at the location pointed to by 'zPtr'.  Each of 'aPtr'\r\n| and 'zPtr' points to a 'size_words'-long array of 32-bit elements that\r\n| concatenate in the platform's normal endian order to form an N-bit integer.\r\n|   The value of 'dist' can be arbitrarily large.  In particular, if 'dist' is\r\n| greater than N, the stored result will be 0.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_shiftLeftM(\r\n     uint_fast8_t size_words,\r\n     const uint32_t *aPtr,\r\n     uint32_t dist,\r\n     uint32_t *zPtr\r\n );\r\n#endif\r\n\r\n#ifndef softfloat_shiftLeft96M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_shiftLeftM' with\r\n| 'size_words' = 3 (N = 96).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_shiftLeft96M( aPtr, dist, zPtr ) softfloat_shiftLeftM( 3, aPtr, dist, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_shiftLeft128M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_shiftLeftM' with\r\n| 'size_words' = 4 (N = 128).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_shiftLeft128M( aPtr, dist, zPtr ) softfloat_shiftLeftM( 4, aPtr, dist, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_shiftLeft160M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_shiftLeftM' with\r\n| 'size_words' = 5 (N = 160).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_shiftLeft160M( aPtr, dist, zPtr ) softfloat_shiftLeftM( 5, aPtr, dist, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_shortShiftRightM\r\n/*----------------------------------------------------------------------------\r\n| Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number\r\n| of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'\r\n| must be in the range 1 to 31.  Any nonzero bits shifted off are lost.  The\r\n| shifted N-bit result is stored at the location pointed to by 'zPtr'.  Each\r\n| of 'aPtr' and 'zPtr' points to a 'size_words'-long array of 32-bit elements\r\n| that concatenate in the platform's normal endian order to form an N-bit\r\n| integer.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_shortShiftRightM(\r\n     uint_fast8_t size_words,\r\n     const uint32_t *aPtr,\r\n     uint_fast8_t dist,\r\n     uint32_t *zPtr\r\n );\r\n#endif\r\n\r\n#ifndef softfloat_shortShiftRight128M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_shortShiftRightM' with\r\n| 'size_words' = 4 (N = 128).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_shortShiftRight128M( aPtr, dist, zPtr ) softfloat_shortShiftRightM( 4, aPtr, dist, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_shortShiftRight160M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_shortShiftRightM' with\r\n| 'size_words' = 5 (N = 160).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_shortShiftRight160M( aPtr, dist, zPtr ) softfloat_shortShiftRightM( 5, aPtr, dist, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_shortShiftRightJamM\r\n/*----------------------------------------------------------------------------\r\n| Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number\r\n| of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'\r\n| must be in the range 1 to 31.  If any nonzero bits are shifted off, they are\r\n| \"jammed\" into the least-significant bit of the shifted value by setting the\r\n| least-significant bit to 1.  This shifted-and-jammed N-bit result is stored\r\n| at the location pointed to by 'zPtr'.  Each of 'aPtr' and 'zPtr' points\r\n| to a 'size_words'-long array of 32-bit elements that concatenate in the\r\n| platform's normal endian order to form an N-bit integer.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_shortShiftRightJamM(\r\n     uint_fast8_t, const uint32_t *, uint_fast8_t, uint32_t * );\r\n#endif\r\n\r\n#ifndef softfloat_shortShiftRightJam160M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_shortShiftRightJamM' with\r\n| 'size_words' = 5 (N = 160).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_shortShiftRightJam160M( aPtr, dist, zPtr ) softfloat_shortShiftRightJamM( 5, aPtr, dist, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_shiftRightM\r\n/*----------------------------------------------------------------------------\r\n| Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number\r\n| of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'\r\n| must not be zero.  Any nonzero bits shifted off are lost.  The shifted\r\n| N-bit result is stored at the location pointed to by 'zPtr'.  Each of 'aPtr'\r\n| and 'zPtr' points to a 'size_words'-long array of 32-bit elements that\r\n| concatenate in the platform's normal endian order to form an N-bit integer.\r\n|   The value of 'dist' can be arbitrarily large.  In particular, if 'dist' is\r\n| greater than N, the stored result will be 0.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_shiftRightM(\r\n     uint_fast8_t size_words,\r\n     const uint32_t *aPtr,\r\n     uint32_t dist,\r\n     uint32_t *zPtr\r\n );\r\n#endif\r\n\r\n#ifndef softfloat_shiftRight96M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_shiftRightM' with\r\n| 'size_words' = 3 (N = 96).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_shiftRight96M( aPtr, dist, zPtr ) softfloat_shiftRightM( 3, aPtr, dist, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_shiftRightJamM\r\n/*----------------------------------------------------------------------------\r\n| Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number\r\n| of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'\r\n| must not be zero.  If any nonzero bits are shifted off, they are \"jammed\"\r\n| into the least-significant bit of the shifted value by setting the least-\r\n| significant bit to 1.  This shifted-and-jammed N-bit result is stored\r\n| at the location pointed to by 'zPtr'.  Each of 'aPtr' and 'zPtr' points\r\n| to a 'size_words'-long array of 32-bit elements that concatenate in the\r\n| platform's normal endian order to form an N-bit integer.\r\n|   The value of 'dist' can be arbitrarily large.  In particular, if 'dist'\r\n| is greater than N, the stored result will be either 0 or 1, depending on\r\n| whether the original N bits are all zeros.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_shiftRightJamM(\r\n     uint_fast8_t size_words,\r\n     const uint32_t *aPtr,\r\n     uint32_t dist,\r\n     uint32_t *zPtr\r\n );\r\n#endif\r\n\r\n#ifndef softfloat_shiftRightJam96M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_shiftRightJamM' with\r\n| 'size_words' = 3 (N = 96).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_shiftRightJam96M( aPtr, dist, zPtr ) softfloat_shiftRightJamM( 3, aPtr, dist, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_shiftRightJam128M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_shiftRightJamM' with\r\n| 'size_words' = 4 (N = 128).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_shiftRightJam128M( aPtr, dist, zPtr ) softfloat_shiftRightJamM( 4, aPtr, dist, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_shiftRightJam160M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_shiftRightJamM' with\r\n| 'size_words' = 5 (N = 160).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_shiftRightJam160M( aPtr, dist, zPtr ) softfloat_shiftRightJamM( 5, aPtr, dist, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_addM\r\n/*----------------------------------------------------------------------------\r\n| Adds the two N-bit integers pointed to by 'aPtr' and 'bPtr', where N =\r\n| 'size_words' * 32.  The addition is modulo 2^N, so any carry out is lost.\r\n| The N-bit sum is stored at the location pointed to by 'zPtr'.  Each of\r\n| 'aPtr', 'bPtr', and 'zPtr' points to a 'size_words'-long array of 32-bit\r\n| elements that concatenate in the platform's normal endian order to form an\r\n| N-bit integer.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_addM(\r\n     uint_fast8_t size_words,\r\n     const uint32_t *aPtr,\r\n     const uint32_t *bPtr,\r\n     uint32_t *zPtr\r\n );\r\n#endif\r\n\r\n#ifndef softfloat_add96M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_addM' with 'size_words'\r\n| = 3 (N = 96).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_add96M( aPtr, bPtr, zPtr ) softfloat_addM( 3, aPtr, bPtr, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_add128M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_addM' with 'size_words'\r\n| = 4 (N = 128).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_add128M( aPtr, bPtr, zPtr ) softfloat_addM( 4, aPtr, bPtr, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_add160M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_addM' with 'size_words'\r\n| = 5 (N = 160).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_add160M( aPtr, bPtr, zPtr ) softfloat_addM( 5, aPtr, bPtr, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_addCarryM\r\n/*----------------------------------------------------------------------------\r\n| Adds the two N-bit unsigned integers pointed to by 'aPtr' and 'bPtr', where\r\n| N = 'size_words' * 32, plus 'carry', which must be either 0 or 1.  The N-bit\r\n| sum (modulo 2^N) is stored at the location pointed to by 'zPtr', and any\r\n| carry out is returned as the result.  Each of 'aPtr', 'bPtr', and 'zPtr'\r\n| points to a 'size_words'-long array of 32-bit elements that concatenate in\r\n| the platform's normal endian order to form an N-bit integer.\r\n*----------------------------------------------------------------------------*/\r\nuint_fast8_t\r\n softfloat_addCarryM(\r\n     uint_fast8_t size_words,\r\n     const uint32_t *aPtr,\r\n     const uint32_t *bPtr,\r\n     uint_fast8_t carry,\r\n     uint32_t *zPtr\r\n );\r\n#endif\r\n\r\n#ifndef softfloat_addComplCarryM\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_addCarryM', except that\r\n| the value of the unsigned integer pointed to by 'bPtr' is bit-wise completed\r\n| before the addition.\r\n*----------------------------------------------------------------------------*/\r\nuint_fast8_t\r\n softfloat_addComplCarryM(\r\n     uint_fast8_t size_words,\r\n     const uint32_t *aPtr,\r\n     const uint32_t *bPtr,\r\n     uint_fast8_t carry,\r\n     uint32_t *zPtr\r\n );\r\n#endif\r\n\r\n#ifndef softfloat_addComplCarry96M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_addComplCarryM' with\r\n| 'size_words' = 3 (N = 96).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_addComplCarry96M( aPtr, bPtr, carry, zPtr ) softfloat_addComplCarryM( 3, aPtr, bPtr, carry, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_negXM\r\n/*----------------------------------------------------------------------------\r\n| Replaces the N-bit unsigned integer pointed to by 'zPtr' by the\r\n| 2s-complement of itself, where N = 'size_words' * 32.  Argument 'zPtr'\r\n| points to a 'size_words'-long array of 32-bit elements that concatenate in\r\n| the platform's normal endian order to form an N-bit integer.\r\n*----------------------------------------------------------------------------*/\r\nvoid softfloat_negXM( uint_fast8_t size_words, uint32_t *zPtr );\r\n#endif\r\n\r\n#ifndef softfloat_negX96M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_negXM' with 'size_words'\r\n| = 3 (N = 96).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_negX96M( zPtr ) softfloat_negXM( 3, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_negX128M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_negXM' with 'size_words'\r\n| = 4 (N = 128).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_negX128M( zPtr ) softfloat_negXM( 4, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_negX160M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_negXM' with 'size_words'\r\n| = 5 (N = 160).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_negX160M( zPtr ) softfloat_negXM( 5, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_negX256M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_negXM' with 'size_words'\r\n| = 8 (N = 256).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_negX256M( zPtr ) softfloat_negXM( 8, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_sub1XM\r\n/*----------------------------------------------------------------------------\r\n| Subtracts 1 from the N-bit integer pointed to by 'zPtr', where N =\r\n| 'size_words' * 32.  The subtraction is modulo 2^N, so any borrow out (carry\r\n| out) is lost.  Argument 'zPtr' points to a 'size_words'-long array of 32-bit\r\n| elements that concatenate in the platform's normal endian order to form an\r\n| N-bit integer.\r\n*----------------------------------------------------------------------------*/\r\nvoid softfloat_sub1XM( uint_fast8_t size_words, uint32_t *zPtr );\r\n#endif\r\n\r\n#ifndef softfloat_sub1X96M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_sub1XM' with 'size_words'\r\n| = 3 (N = 96).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_sub1X96M( zPtr ) softfloat_sub1XM( 3, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_sub1X160M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_sub1XM' with 'size_words'\r\n| = 5 (N = 160).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_sub1X160M( zPtr ) softfloat_sub1XM( 5, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_subM\r\n/*----------------------------------------------------------------------------\r\n| Subtracts the two N-bit integers pointed to by 'aPtr' and 'bPtr', where N =\r\n| 'size_words' * 32.  The subtraction is modulo 2^N, so any borrow out (carry\r\n| out) is lost.  The N-bit difference is stored at the location pointed to by\r\n| 'zPtr'.  Each of 'aPtr', 'bPtr', and 'zPtr' points to a 'size_words'-long\r\n| array of 32-bit elements that concatenate in the platform's normal endian\r\n| order to form an N-bit integer.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_subM(\r\n     uint_fast8_t size_words,\r\n     const uint32_t *aPtr,\r\n     const uint32_t *bPtr,\r\n     uint32_t *zPtr\r\n );\r\n#endif\r\n\r\n#ifndef softfloat_sub96M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_subM' with 'size_words'\r\n| = 3 (N = 96).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_sub96M( aPtr, bPtr, zPtr ) softfloat_subM( 3, aPtr, bPtr, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_sub128M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_subM' with 'size_words'\r\n| = 4 (N = 128).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_sub128M( aPtr, bPtr, zPtr ) softfloat_subM( 4, aPtr, bPtr, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_sub160M\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_subM' with 'size_words'\r\n| = 5 (N = 160).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_sub160M( aPtr, bPtr, zPtr ) softfloat_subM( 5, aPtr, bPtr, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_mul64To128M\r\n/*----------------------------------------------------------------------------\r\n| Multiplies 'a' and 'b' and stores the 128-bit product at the location\r\n| pointed to by 'zPtr'.  Argument 'zPtr' points to an array of four 32-bit\r\n| elements that concatenate in the platform's normal endian order to form a\r\n| 128-bit integer.\r\n*----------------------------------------------------------------------------*/\r\nvoid softfloat_mul64To128M( uint64_t a, uint64_t b, uint32_t *zPtr );\r\n#endif\r\n\r\n#ifndef softfloat_mul128MTo256M\r\n/*----------------------------------------------------------------------------\r\n| Multiplies the two 128-bit unsigned integers pointed to by 'aPtr' and\r\n| 'bPtr', and stores the 256-bit product at the location pointed to by 'zPtr'.\r\n| Each of 'aPtr' and 'bPtr' points to an array of four 32-bit elements that\r\n| concatenate in the platform's normal endian order to form a 128-bit integer.\r\n| Argument 'zPtr' points to an array of eight 32-bit elements that concatenate\r\n| to form a 256-bit integer.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_mul128MTo256M(\r\n     const uint32_t *aPtr, const uint32_t *bPtr, uint32_t *zPtr );\r\n#endif\r\n\r\n#ifndef softfloat_remStepMBy32\r\n/*----------------------------------------------------------------------------\r\n| Performs a \"remainder reduction step\" as follows:  Arguments 'remPtr' and\r\n| 'bPtr' both point to N-bit unsigned integers, where N = 'size_words' * 32.\r\n| Defining R and B as the values of those integers, the expression (R<<'dist')\r\n| - B * q is computed modulo 2^N, and the N-bit result is stored at the\r\n| location pointed to by 'zPtr'.  Each of 'remPtr', 'bPtr', and 'zPtr' points\r\n| to a 'size_words'-long array of 32-bit elements that concatenate in the\r\n| platform's normal endian order to form an N-bit integer.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_remStepMBy32(\r\n     uint_fast8_t size_words,\r\n     const uint32_t *remPtr,\r\n     uint_fast8_t dist,\r\n     const uint32_t *bPtr,\r\n     uint32_t q,\r\n     uint32_t *zPtr\r\n );\r\n#endif\r\n\r\n#ifndef softfloat_remStep96MBy32\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_remStepMBy32' with\r\n| 'size_words' = 3 (N = 96).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_remStep96MBy32( remPtr, dist, bPtr, q, zPtr ) softfloat_remStepMBy32( 3, remPtr, dist, bPtr, q, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_remStep128MBy32\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_remStepMBy32' with\r\n| 'size_words' = 4 (N = 128).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_remStep128MBy32( remPtr, dist, bPtr, q, zPtr ) softfloat_remStepMBy32( 4, remPtr, dist, bPtr, q, zPtr )\r\n#endif\r\n\r\n#ifndef softfloat_remStep160MBy32\r\n/*----------------------------------------------------------------------------\r\n| This function or macro is the same as 'softfloat_remStepMBy32' with\r\n| 'size_words' = 5 (N = 160).\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_remStep160MBy32( remPtr, dist, bPtr, q, zPtr ) softfloat_remStepMBy32( 5, remPtr, dist, bPtr, q, zPtr )\r\n#endif\r\n\r\n#endif\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_add128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitiveTypes.h\"\r\n\r\n#ifndef softfloat_add128\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128\r\n softfloat_add128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )\r\n{\r\n    struct uint128 z;\r\n\r\n    z.v0 = a0 + b0;\r\n    z.v64 = a64 + b64 + (z.v0 < a0);\r\n    return z;\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_addMagsExtF80.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nextFloat80_t\r\n softfloat_addMagsExtF80(\r\n     struct softfloat_state *state,\r\n     uint_fast16_t uiA64,\r\n     uint_fast64_t uiA0,\r\n     uint_fast16_t uiB64,\r\n     uint_fast64_t uiB0,\r\n     bool signZ\r\n )\r\n{\r\n    int_fast32_t expA;\r\n    uint_fast64_t sigA;\r\n    int_fast32_t expB;\r\n    uint_fast64_t sigB;\r\n    int_fast32_t expDiff;\r\n    uint_fast16_t uiZ64;\r\n    uint_fast64_t uiZ0, sigZ, sigZExtra;\r\n    struct exp32_sig64 normExpSig;\r\n    int_fast32_t expZ;\r\n    struct uint64_extra sig64Extra;\r\n    struct uint128 uiZ;\r\n    union { struct extFloat80M s; extFloat80_t f; } uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    expA = expExtF80UI64( uiA64 );\r\n    sigA = uiA0;\r\n    expB = expExtF80UI64( uiB64 );\r\n    sigB = uiB0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    expDiff = expA - expB;\r\n    if ( ! expDiff ) {\r\n        if ( expA == 0x7FFF ) {\r\n            if ( (sigA | sigB) & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {\r\n                goto propagateNaN;\r\n            }\r\n            uiZ64 = uiA64;\r\n            uiZ0  = uiA0;\r\n            goto uiZ;\r\n        }\r\n        sigZ = sigA + sigB;\r\n        sigZExtra = 0;\r\n        if ( ! expA ) {\r\n            normExpSig = softfloat_normSubnormalExtF80Sig( sigZ );\r\n            expZ = normExpSig.exp + 1;\r\n            sigZ = normExpSig.sig;\r\n            goto roundAndPack;\r\n        }\r\n        expZ = expA;\r\n        goto shiftRight1;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( expDiff < 0 ) {\r\n        if ( expB == 0x7FFF ) {\r\n            if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;\r\n            uiZ64 = packToExtF80UI64( signZ, 0x7FFF );\r\n            uiZ0  = uiB0;\r\n            goto uiZ;\r\n        }\r\n        expZ = expB;\r\n        if ( ! expA ) {\r\n            ++expDiff;\r\n            sigZExtra = 0;\r\n            if ( ! expDiff ) goto newlyAligned;\r\n        }\r\n        sig64Extra = softfloat_shiftRightJam64Extra( sigA, 0, -expDiff );\r\n        sigA = sig64Extra.v;\r\n        sigZExtra = sig64Extra.extra;\r\n    } else {\r\n        if ( expA == 0x7FFF ) {\r\n            if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;\r\n            uiZ64 = uiA64;\r\n            uiZ0  = uiA0;\r\n            goto uiZ;\r\n        }\r\n        expZ = expA;\r\n        if ( ! expB ) {\r\n            --expDiff;\r\n            sigZExtra = 0;\r\n            if ( ! expDiff ) goto newlyAligned;\r\n        }\r\n        sig64Extra = softfloat_shiftRightJam64Extra( sigB, 0, expDiff );\r\n        sigB = sig64Extra.v;\r\n        sigZExtra = sig64Extra.extra;\r\n    }\r\n newlyAligned:\r\n    sigZ = sigA + sigB;\r\n    if ( sigZ & UINT64_C( 0x8000000000000000 ) ) goto roundAndPack;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n shiftRight1:\r\n    sig64Extra = softfloat_shortShiftRightJam64Extra( sigZ, sigZExtra, 1 );\r\n    sigZ = sig64Extra.v | UINT64_C( 0x8000000000000000 );\r\n    sigZExtra = sig64Extra.extra;\r\n    ++expZ;\r\n roundAndPack:\r\n    return\r\n        softfloat_roundPackToExtF80(\r\n            state, signZ, expZ, sigZ, sigZExtra, state->roundingPrecision );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n propagateNaN:\r\n    uiZ = softfloat_propagateNaNExtF80UI( state, uiA64, uiA0, uiB64, uiB0 );\r\n    uiZ64 = uiZ.v64;\r\n    uiZ0  = uiZ.v0;\r\n uiZ:\r\n    uZ.s.signExp = uiZ64;\r\n    uZ.s.signif  = uiZ0;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_addMagsF128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n\r\nfloat128_t\r\n softfloat_addMagsF128(\r\n     struct softfloat_state *state,\r\n     uint_fast64_t uiA64,\r\n     uint_fast64_t uiA0,\r\n     uint_fast64_t uiB64,\r\n     uint_fast64_t uiB0,\r\n     bool signZ\r\n )\r\n{\r\n    int_fast32_t expA;\r\n    struct uint128 sigA;\r\n    int_fast32_t expB;\r\n    struct uint128 sigB;\r\n    int_fast32_t expDiff;\r\n    struct uint128 uiZ, sigZ;\r\n    int_fast32_t expZ;\r\n    uint_fast64_t sigZExtra;\r\n    struct uint128_extra sig128Extra;\r\n    union ui128_f128 uZ;\r\n\r\n    expA = expF128UI64( uiA64 );\r\n    sigA.v64 = fracF128UI64( uiA64 );\r\n    sigA.v0  = uiA0;\r\n    expB = expF128UI64( uiB64 );\r\n    sigB.v64 = fracF128UI64( uiB64 );\r\n    sigB.v0  = uiB0;\r\n    expDiff = expA - expB;\r\n    if ( ! expDiff ) {\r\n        if ( expA == 0x7FFF ) {\r\n            if ( sigA.v64 | sigA.v0 | sigB.v64 | sigB.v0 ) goto propagateNaN;\r\n            uiZ.v64 = uiA64;\r\n            uiZ.v0  = uiA0;\r\n            goto uiZ;\r\n        }\r\n        sigZ = softfloat_add128( sigA.v64, sigA.v0, sigB.v64, sigB.v0 );\r\n        if ( ! expA ) {\r\n            uiZ.v64 = packToF128UI64( signZ, 0, sigZ.v64 );\r\n            uiZ.v0  = sigZ.v0;\r\n            goto uiZ;\r\n        }\r\n        expZ = expA;\r\n        sigZ.v64 |= UINT64_C( 0x0002000000000000 );\r\n        sigZExtra = 0;\r\n        goto shiftRight1;\r\n    }\r\n    if ( expDiff < 0 ) {\r\n        if ( expB == 0x7FFF ) {\r\n            if ( sigB.v64 | sigB.v0 ) goto propagateNaN;\r\n            uiZ.v64 = packToF128UI64( signZ, 0x7FFF, 0 );\r\n            uiZ.v0  = 0;\r\n            goto uiZ;\r\n        }\r\n        expZ = expB;\r\n        if ( expA ) {\r\n            sigA.v64 |= UINT64_C( 0x0001000000000000 );\r\n        } else {\r\n            ++expDiff;\r\n            sigZExtra = 0;\r\n            if ( ! expDiff ) goto newlyAligned;\r\n        }\r\n        sig128Extra =\r\n            softfloat_shiftRightJam128Extra( sigA.v64, sigA.v0, 0, -expDiff );\r\n        sigA = sig128Extra.v;\r\n        sigZExtra = sig128Extra.extra;\r\n    } else {\r\n        if ( expA == 0x7FFF ) {\r\n            if ( sigA.v64 | sigA.v0 ) goto propagateNaN;\r\n            uiZ.v64 = uiA64;\r\n            uiZ.v0  = uiA0;\r\n            goto uiZ;\r\n        }\r\n        expZ = expA;\r\n        if ( expB ) {\r\n            sigB.v64 |= UINT64_C( 0x0001000000000000 );\r\n        } else {\r\n            --expDiff;\r\n            sigZExtra = 0;\r\n            if ( ! expDiff ) goto newlyAligned;\r\n        }\r\n        sig128Extra =\r\n            softfloat_shiftRightJam128Extra( sigB.v64, sigB.v0, 0, expDiff );\r\n        sigB = sig128Extra.v;\r\n        sigZExtra = sig128Extra.extra;\r\n    }\r\n newlyAligned:\r\n    sigZ =\r\n        softfloat_add128(\r\n            sigA.v64 | UINT64_C( 0x0001000000000000 ),\r\n            sigA.v0,\r\n            sigB.v64,\r\n            sigB.v0\r\n        );\r\n    --expZ;\r\n    if ( sigZ.v64 < UINT64_C( 0x0002000000000000 ) ) goto roundAndPack;\r\n    ++expZ;\r\n shiftRight1:\r\n    sig128Extra =\r\n        softfloat_shortShiftRightJam128Extra(\r\n            sigZ.v64, sigZ.v0, sigZExtra, 1 );\r\n    sigZ = sig128Extra.v;\r\n    sigZExtra = sig128Extra.extra;\r\n roundAndPack:\r\n    return\r\n        softfloat_roundPackToF128( state, signZ, expZ, sigZ.v64, sigZ.v0, sigZExtra );\r\n propagateNaN:\r\n    uiZ = softfloat_propagateNaNF128UI( state, uiA64, uiA0, uiB64, uiB0 );\r\n uiZ:\r\n    uZ.ui = uiZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_approxRecip32_1.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n\r\n#ifndef softfloat_approxRecip32_1\r\n\r\nextern const uint16_t softfloat_approxRecip_1k0s[16];\r\nextern const uint16_t softfloat_approxRecip_1k1s[16];\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint32_t softfloat_approxRecip32_1( uint32_t a )\r\n{\r\n    int index;\r\n    uint16_t eps, r0;\r\n    uint32_t sigma0;\r\n    uint_fast32_t r;\r\n    uint32_t sqrSigma0;\r\n\r\n    index = a>>27 & 0xF;\r\n    eps = (uint16_t) (a>>11);\r\n    r0 = softfloat_approxRecip_1k0s[index]\r\n             - ((softfloat_approxRecip_1k1s[index] * (uint_fast32_t) eps)>>20);\r\n    sigma0 = ~(uint_fast32_t) ((r0 * (uint_fast64_t) a)>>7);\r\n    r = ((uint_fast32_t) r0<<16) + ((r0 * (uint_fast64_t) sigma0)>>24);\r\n    sqrSigma0 = ((uint_fast64_t) sigma0 * sigma0)>>32;\r\n    r += ((uint32_t) r * (uint_fast64_t) sqrSigma0)>>48;\r\n    return r;\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_approxRecipSqrt32_1.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n\r\n#ifndef softfloat_approxRecipSqrt32_1\r\n\r\nextern const uint16_t softfloat_approxRecipSqrt_1k0s[];\r\nextern const uint16_t softfloat_approxRecipSqrt_1k1s[];\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint32_t softfloat_approxRecipSqrt32_1( unsigned int oddExpA, uint32_t a )\r\n{\r\n    int index;\r\n    uint16_t eps, r0;\r\n    uint_fast32_t ESqrR0;\r\n    uint32_t sigma0;\r\n    uint_fast32_t r;\r\n    uint32_t sqrSigma0;\r\n\r\n    index = (a>>27 & 0xE) + oddExpA;\r\n    eps = (uint16_t) (a>>12);\r\n    r0 = softfloat_approxRecipSqrt_1k0s[index]\r\n             - ((softfloat_approxRecipSqrt_1k1s[index] * (uint_fast32_t) eps)\r\n                    >>20);\r\n    ESqrR0 = (uint_fast32_t) r0 * r0;\r\n    if ( ! oddExpA ) ESqrR0 <<= 1;\r\n    sigma0 = ~(uint_fast32_t) (((uint32_t) ESqrR0 * (uint_fast64_t) a)>>23);\r\n    r = ((uint_fast32_t) r0<<16) + ((r0 * (uint_fast64_t) sigma0)>>25);\r\n    sqrSigma0 = ((uint_fast64_t) sigma0 * sigma0)>>32;\r\n    r += ((uint32_t) ((r>>1) + (r>>3) - ((uint_fast32_t) r0<<14))\r\n              * (uint_fast64_t) sqrSigma0)\r\n             >>48;\r\n    if ( ! (r & 0x80000000) ) r = 0x80000000;\r\n    return r;\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_approxRecipSqrt_1Ks.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitives.h\"\r\n\r\nconst uint16_t softfloat_approxRecipSqrt_1k0s[16] = {\r\n    0xB4C9, 0xFFAB, 0xAA7D, 0xF11C, 0xA1C5, 0xE4C7, 0x9A43, 0xDA29,\r\n    0x93B5, 0xD0E5, 0x8DED, 0xC8B7, 0x88C6, 0xC16D, 0x8424, 0xBAE1\r\n};\r\nconst uint16_t softfloat_approxRecipSqrt_1k1s[16] = {\r\n    0xA5A5, 0xEA42, 0x8C21, 0xC62D, 0x788F, 0xAA7F, 0x6928, 0x94B6,\r\n    0x5CC7, 0x8335, 0x52A6, 0x74E2, 0x4A3E, 0x68FE, 0x432B, 0x5EFD\r\n};\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_approxRecip_1Ks.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitives.h\"\r\n\r\nconst uint16_t softfloat_approxRecip_1k0s[16] = {\r\n    0xFFC4, 0xF0BE, 0xE363, 0xD76F, 0xCCAD, 0xC2F0, 0xBA16, 0xB201,\r\n    0xAA97, 0xA3C6, 0x9D7A, 0x97A6, 0x923C, 0x8D32, 0x887E, 0x8417\r\n};\r\nconst uint16_t softfloat_approxRecip_1k1s[16] = {\r\n    0xF0F1, 0xD62C, 0xBFA1, 0xAC77, 0x9C0A, 0x8DDB, 0x8185, 0x76BA,\r\n    0x6D3B, 0x64D4, 0x5D5C, 0x56B1, 0x50B6, 0x4B55, 0x4679, 0x4211\r\n};\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_commonNaNToExtF80UI.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitives.h\"\r\n#include \"specialize.h\"\r\n\r\n/*----------------------------------------------------------------------------\r\n| Converts the common NaN pointed to by `aPtr' into an 80-bit extended\r\n| floating-point NaN, and returns the bit pattern of this value as an unsigned\r\n| integer.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr )\r\n{\r\n    struct uint128 uiZ;\r\n\r\n    uiZ.v64 = (uint_fast16_t) aPtr->sign<<15 | 0x7FFF;\r\n    uiZ.v0 = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;\r\n    return uiZ;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_commonNaNToF128UI.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitives.h\"\r\n#include \"specialize.h\"\r\n\r\n/*----------------------------------------------------------------------------\r\n| Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point\r\n| NaN, and returns the bit pattern of this value as an unsigned integer.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128 softfloat_commonNaNToF128UI( const struct commonNaN *aPtr )\r\n{\r\n    struct uint128 uiZ;\r\n\r\n    uiZ = softfloat_shortShiftRight128( aPtr->v64, aPtr->v0, 16 );\r\n    uiZ.v64 |= (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FFF800000000000 );\r\n    return uiZ;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_commonNaNToF32UI.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"specialize.h\"\r\n\r\n/*----------------------------------------------------------------------------\r\n| Converts the common NaN pointed to by `aPtr' into a 32-bit floating-point\r\n| NaN, and returns the bit pattern of this value as an unsigned integer.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr )\r\n{\r\n\r\n    return (uint_fast32_t) aPtr->sign<<31 | 0x7FC00000 | aPtr->v64>>41;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_commonNaNToF64UI.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"specialize.h\"\r\n\r\n/*----------------------------------------------------------------------------\r\n| Converts the common NaN pointed to by `aPtr' into a 64-bit floating-point\r\n| NaN, and returns the bit pattern of this value as an unsigned integer.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr )\r\n{\r\n\r\n    return\r\n        (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FF8000000000000 )\r\n            | aPtr->v64>>12;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_countLeadingZeros32.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n\r\n#ifndef softfloat_countLeadingZeros32\r\n\r\n#define softfloat_countLeadingZeros32 softfloat_countLeadingZeros32\r\n#include \"primitives.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint_fast8_t softfloat_countLeadingZeros32( uint32_t a )\r\n{\r\n    uint_fast8_t count;\r\n\r\n    count = 0;\r\n    if ( a < 0x10000 ) {\r\n        count = 16;\r\n        a <<= 16;\r\n    }\r\n    if ( a < 0x1000000 ) {\r\n        count += 8;\r\n        a <<= 8;\r\n    }\r\n    count += softfloat_countLeadingZeros8[a>>24];\r\n    return count;\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_countLeadingZeros64.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n\r\n#ifndef softfloat_countLeadingZeros64\r\n\r\n#define softfloat_countLeadingZeros64 softfloat_countLeadingZeros64\r\n#include \"primitives.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint_fast8_t softfloat_countLeadingZeros64( uint64_t a )\r\n{\r\n    uint_fast8_t count;\r\n    uint32_t a32;\r\n\r\n    count = 0;\r\n    a32 = a>>32;\r\n    if ( ! a32 ) {\r\n        count = 32;\r\n        a32 = a;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    | From here, result is current count + count leading zeros of `a32'.\r\n    *------------------------------------------------------------------------*/\r\n    if ( a32 < 0x10000 ) {\r\n        count += 16;\r\n        a32 <<= 16;\r\n    }\r\n    if ( a32 < 0x1000000 ) {\r\n        count += 8;\r\n        a32 <<= 8;\r\n    }\r\n    count += softfloat_countLeadingZeros8[a32>>24];\r\n    return count;\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_countLeadingZeros8.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitives.h\"\r\n\r\nconst uint_least8_t softfloat_countLeadingZeros8[256] = {\r\n    8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,\r\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r\n    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r\n    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\r\n};\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_extF80UIToCommonNaN.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\n/*----------------------------------------------------------------------------\r\n| Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0'\r\n| has the bit pattern of an 80-bit extended floating-point NaN, converts\r\n| this NaN to the common NaN form, and stores the resulting common NaN at the\r\n| location pointed to by `zPtr'.  If the NaN is a signaling NaN, the invalid\r\n| exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nvoid\r\n softfloat_extF80UIToCommonNaN(\r\n     struct softfloat_state *state, uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )\r\n{\r\n\r\n    if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ) {\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n    }\r\n    zPtr->sign = uiA64>>15;\r\n    zPtr->v64  = uiA0<<1;\r\n    zPtr->v0   = 0;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_f128UIToCommonNaN.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitives.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\n/*----------------------------------------------------------------------------\r\n| Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0'\r\n| has the bit pattern of a 128-bit floating-point NaN, converts this NaN to\r\n| the common NaN form, and stores the resulting common NaN at the location\r\n| pointed to by `zPtr'.  If the NaN is a signaling NaN, the invalid exception\r\n| is raised.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nvoid\r\n softfloat_f128UIToCommonNaN(\r\n     struct softfloat_state *state, uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )\r\n{\r\n    struct uint128 NaNSig;\r\n\r\n    if ( softfloat_isSigNaNF128UI( uiA64, uiA0 ) ) {\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n    }\r\n    NaNSig = softfloat_shortShiftLeft128( uiA64, uiA0, 16 );\r\n    zPtr->sign = uiA64>>63;\r\n    zPtr->v64  = NaNSig.v64;\r\n    zPtr->v0   = NaNSig.v0;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_f32UIToCommonNaN.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\n/*----------------------------------------------------------------------------\r\n| Assuming `uiA' has the bit pattern of a 32-bit floating-point NaN, converts\r\n| this NaN to the common NaN form, and stores the resulting common NaN at the\r\n| location pointed to by `zPtr'.  If the NaN is a signaling NaN, the invalid\r\n| exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nvoid softfloat_f32UIToCommonNaN( struct softfloat_state *state, uint_fast32_t uiA, struct commonNaN *zPtr )\r\n{\r\n\r\n    if ( softfloat_isSigNaNF32UI( uiA ) ) {\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n    }\r\n    zPtr->sign = uiA>>31;\r\n    zPtr->v64  = (uint_fast64_t) uiA<<41;\r\n    zPtr->v0   = 0;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_f64UIToCommonNaN.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\n/*----------------------------------------------------------------------------\r\n| Assuming `uiA' has the bit pattern of a 64-bit floating-point NaN, converts\r\n| this NaN to the common NaN form, and stores the resulting common NaN at the\r\n| location pointed to by `zPtr'.  If the NaN is a signaling NaN, the invalid\r\n| exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nvoid softfloat_f64UIToCommonNaN( struct softfloat_state *state, uint_fast64_t uiA, struct commonNaN *zPtr )\r\n{\r\n\r\n    if ( softfloat_isSigNaNF64UI( uiA ) ) {\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n    }\r\n    zPtr->sign = uiA>>63;\r\n    zPtr->v64  = uiA<<12;\r\n    zPtr->v0   = 0;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_le128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n\r\n#ifndef softfloat_le128\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nbool softfloat_le128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )\r\n{\r\n\r\n    return (a64 < b64) || ((a64 == b64) && (a0 <= b0));\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_lt128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n\r\n#ifndef softfloat_lt128\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nbool softfloat_lt128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )\r\n{\r\n\r\n    return (a64 < b64) || ((a64 == b64) && (a0 < b0));\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_mul64ByShifted32To128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitiveTypes.h\"\r\n\r\n#ifndef softfloat_mul64ByShifted32To128\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128 softfloat_mul64ByShifted32To128( uint64_t a, uint32_t b )\r\n{\r\n    uint_fast64_t mid;\r\n    struct uint128 z;\r\n\r\n    mid = (uint_fast64_t) (uint32_t) a * b;\r\n    z.v0 = mid<<32;\r\n    z.v64 = (uint_fast64_t) (uint32_t) (a>>32) * b + (mid>>32);\r\n    return z;\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_mul64To128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitiveTypes.h\"\r\n\r\n#ifndef softfloat_mul64To128\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128 softfloat_mul64To128( uint64_t a, uint64_t b )\r\n{\r\n    uint32_t a32, a0, b32, b0;\r\n    struct uint128 z;\r\n    uint64_t mid1, mid;\r\n\r\n    a32 = a>>32;\r\n    a0 = a;\r\n    b32 = b>>32;\r\n    b0 = b;\r\n    z.v0 = (uint_fast64_t) a0 * b0;\r\n    mid1 = (uint_fast64_t) a32 * b0;\r\n    mid = mid1 + (uint_fast64_t) a0 * b32;\r\n    z.v64 = (uint_fast64_t) a32 * b32;\r\n    z.v64 += (uint_fast64_t) (mid < mid1)<<32 | mid>>32;\r\n    mid <<= 32;\r\n    z.v0 += mid;\r\n    z.v64 += (z.v0 < mid);\r\n    return z;\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_normRoundPackToExtF80.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t\r\n softfloat_normRoundPackToExtF80(\r\n     struct softfloat_state *state,\r\n     bool sign,\r\n     int_fast32_t exp,\r\n     uint_fast64_t sig,\r\n     uint_fast64_t sigExtra,\r\n     uint_fast8_t roundingPrecision\r\n )\r\n{\r\n    int_fast8_t shiftDist;\r\n    struct uint128 sig128;\r\n\r\n    if ( ! sig ) {\r\n        exp -= 64;\r\n        sig = sigExtra;\r\n        sigExtra = 0;\r\n    }\r\n    shiftDist = softfloat_countLeadingZeros64( sig );\r\n    exp -= shiftDist;\r\n    if ( shiftDist ) {\r\n        sig128 = softfloat_shortShiftLeft128( sig, sigExtra, shiftDist );\r\n        sig = sig128.v64;\r\n        sigExtra = sig128.v0;\r\n    }\r\n    return\r\n        softfloat_roundPackToExtF80(\r\n            state, sign, exp, sig, sigExtra, roundingPrecision );\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_normRoundPackToF128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n\r\nfloat128_t\r\n softfloat_normRoundPackToF128(\r\n     struct softfloat_state *state,\r\n     bool sign, int_fast32_t exp, uint_fast64_t sig64, uint_fast64_t sig0 )\r\n{\r\n    int_fast8_t shiftDist;\r\n    struct uint128 sig128;\r\n    union ui128_f128 uZ;\r\n    uint_fast64_t sigExtra;\r\n    struct uint128_extra sig128Extra;\r\n\r\n    if ( ! sig64 ) {\r\n        exp -= 64;\r\n        sig64 = sig0;\r\n        sig0 = 0;\r\n    }\r\n    shiftDist = softfloat_countLeadingZeros64( sig64 ) - 15;\r\n    exp -= shiftDist;\r\n    if ( 0 <= shiftDist ) {\r\n        if ( shiftDist ) {\r\n            sig128 = softfloat_shortShiftLeft128( sig64, sig0, shiftDist );\r\n            sig64 = sig128.v64;\r\n            sig0  = sig128.v0;\r\n        }\r\n        if ( (uint32_t) exp < 0x7FFD ) {\r\n            uZ.ui.v64 = packToF128UI64( sign, sig64 | sig0 ? exp : 0, sig64 );\r\n            uZ.ui.v0  = sig0;\r\n            return uZ.f;\r\n        }\r\n        sigExtra = 0;\r\n    } else {\r\n        sig128Extra =\r\n            softfloat_shortShiftRightJam128Extra( sig64, sig0, 0, -shiftDist );\r\n        sig64 = sig128Extra.v.v64;\r\n        sig0  = sig128Extra.v.v0;\r\n        sigExtra = sig128Extra.extra;\r\n    }\r\n    return softfloat_roundPackToF128( state, sign, exp, sig64, sig0, sigExtra );\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_normSubnormalExtF80Sig.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct exp32_sig64 softfloat_normSubnormalExtF80Sig( uint_fast64_t sig )\r\n{\r\n    int_fast8_t shiftDist;\r\n    struct exp32_sig64 z;\r\n\r\n    shiftDist = softfloat_countLeadingZeros64( sig );\r\n    z.exp = -shiftDist;\r\n    z.sig = sig<<shiftDist;\r\n    return z;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_normSubnormalF128Sig.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct exp32_sig128\r\n softfloat_normSubnormalF128Sig( uint_fast64_t sig64, uint_fast64_t sig0 )\r\n{\r\n    int_fast8_t shiftDist;\r\n    struct exp32_sig128 z;\r\n\r\n    if ( ! sig64 ) {\r\n        shiftDist = softfloat_countLeadingZeros64( sig0 ) - 15;\r\n        z.exp = -63 - shiftDist;\r\n        if ( shiftDist < 0 ) {\r\n            z.sig.v64 = sig0>>-shiftDist;\r\n            z.sig.v0  = sig0<<(shiftDist & 63);\r\n        } else {\r\n            z.sig.v64 = sig0<<shiftDist;\r\n            z.sig.v0  = 0;\r\n        }\r\n    } else {\r\n        shiftDist = softfloat_countLeadingZeros64( sig64 ) - 15;\r\n        z.exp = 1 - shiftDist;\r\n        z.sig = softfloat_shortShiftLeft128( sig64, sig0, shiftDist );\r\n    }\r\n    return z;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_normSubnormalF128SigM.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n\r\nint softfloat_normSubnormalF128SigM( uint32_t *sigPtr )\r\n{\r\n    const uint32_t *ptr;\r\n    int_fast16_t shiftDist;\r\n    uint32_t wordSig;\r\n\r\n    ptr = sigPtr + indexWordHi( 4 );\r\n    shiftDist = 0;\r\n    for (;;) {\r\n        wordSig = *ptr;\r\n        if ( wordSig ) break;\r\n        shiftDist += 32;\r\n        if ( 128 <= shiftDist ) return 1;\r\n        ptr -= wordIncr;\r\n    }\r\n    shiftDist += softfloat_countLeadingZeros32( wordSig ) - 15;\r\n    if ( shiftDist ) softfloat_shiftLeft128M( sigPtr, shiftDist, sigPtr );\r\n    return 1 - shiftDist;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_normSubnormalF32Sig.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct exp16_sig32 softfloat_normSubnormalF32Sig( uint_fast32_t sig )\r\n{\r\n    int_fast8_t shiftDist;\r\n    struct exp16_sig32 z;\r\n\r\n    shiftDist = softfloat_countLeadingZeros32( sig ) - 8;\r\n    z.exp = 1 - shiftDist;\r\n    z.sig = sig<<shiftDist;\r\n    return z;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_normSubnormalF64Sig.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct exp16_sig64 softfloat_normSubnormalF64Sig( uint_fast64_t sig )\r\n{\r\n    int_fast8_t shiftDist;\r\n    struct exp16_sig64 z;\r\n\r\n    shiftDist = softfloat_countLeadingZeros64( sig ) - 11;\r\n    z.exp = 1 - shiftDist;\r\n    z.sig = sig<<shiftDist;\r\n    return z;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_propagateNaNExtF80UI.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2018 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\n/*----------------------------------------------------------------------------\r\n| Interpreting the unsigned integer formed from concatenating 'uiA64' and\r\n| 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting\r\n| the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another\r\n| 80-bit extended floating-point value, and assuming at least on of these\r\n| floating-point values is a NaN, returns the bit pattern of the combined NaN\r\n| result.  If either original floating-point value is a signaling NaN, the\r\n| invalid exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128\r\n softfloat_propagateNaNExtF80UI(\r\n     struct softfloat_state *state,\r\n     uint_fast16_t uiA64,\r\n     uint_fast64_t uiA0,\r\n     uint_fast16_t uiB64,\r\n     uint_fast64_t uiB0\r\n )\r\n{\r\n    bool isSigNaNA, isSigNaNB;\r\n    uint_fast64_t uiNonsigA0, uiNonsigB0;\r\n    uint_fast16_t uiMagA64, uiMagB64;\r\n    struct uint128 uiZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    isSigNaNA = softfloat_isSigNaNExtF80UI( uiA64, uiA0 );\r\n    isSigNaNB = softfloat_isSigNaNExtF80UI( uiB64, uiB0 );\r\n    /*------------------------------------------------------------------------\r\n    | Make NaNs non-signaling.\r\n    *------------------------------------------------------------------------*/\r\n    uiNonsigA0 = uiA0 | UINT64_C( 0xC000000000000000 );\r\n    uiNonsigB0 = uiB0 | UINT64_C( 0xC000000000000000 );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( isSigNaNA | isSigNaNB ) {\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        if ( isSigNaNA ) {\r\n            if ( isSigNaNB ) goto returnLargerMag;\r\n            if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto returnB;\r\n            goto returnA;\r\n        } else {\r\n            if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto returnA;\r\n            goto returnB;\r\n        }\r\n    }\r\n returnLargerMag:\r\n    uiMagA64 = uiA64 & 0x7FFF;\r\n    uiMagB64 = uiB64 & 0x7FFF;\r\n    if ( uiMagA64 < uiMagB64 ) goto returnB;\r\n    if ( uiMagB64 < uiMagA64 ) goto returnA;\r\n    if ( uiA0 < uiB0 ) goto returnB;\r\n    if ( uiB0 < uiA0 ) goto returnA;\r\n    if ( uiA64 < uiB64 ) goto returnA;\r\n returnB:\r\n    uiZ.v64 = uiB64;\r\n    uiZ.v0  = uiNonsigB0;\r\n    return uiZ;\r\n returnA:\r\n    uiZ.v64 = uiA64;\r\n    uiZ.v0  = uiNonsigA0;\r\n    return uiZ;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_propagateNaNF128UI.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\n/*----------------------------------------------------------------------------\r\n| Interpreting the unsigned integer formed from concatenating `uiA64' and\r\n| `uiA0' as a 128-bit floating-point value, and likewise interpreting the\r\n| unsigned integer formed from concatenating `uiB64' and `uiB0' as another\r\n| 128-bit floating-point value, and assuming at least on of these floating-\r\n| point values is a NaN, returns the bit pattern of the combined NaN result.\r\n| If either original floating-point value is a signaling NaN, the invalid\r\n| exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nstruct uint128\r\n softfloat_propagateNaNF128UI(\r\n     struct softfloat_state *state,\r\n     uint_fast64_t uiA64,\r\n     uint_fast64_t uiA0,\r\n     uint_fast64_t uiB64,\r\n     uint_fast64_t uiB0\r\n )\r\n{\r\n    bool isSigNaNA;\r\n    struct uint128 uiZ;\r\n\r\n    isSigNaNA = softfloat_isSigNaNF128UI( uiA64, uiA0 );\r\n    if ( isSigNaNA || softfloat_isSigNaNF128UI( uiB64, uiB0 ) ) {\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        if ( isSigNaNA ) goto returnNonsigA;\r\n    }\r\n    if ( isNaNF128UI( uiA64, uiA0 ) ) {\r\n returnNonsigA:\r\n        uiZ.v64 = uiA64;\r\n        uiZ.v0  = uiA0;\r\n    } else {\r\n        uiZ.v64 = uiB64;\r\n        uiZ.v0  = uiB0;\r\n    }\r\n    uiZ.v64 |= UINT64_C( 0x0000800000000000 );\r\n    return uiZ;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_roundPackToExtF80.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2017 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t\r\n softfloat_roundPackToExtF80(\r\n     struct softfloat_state *state,\r\n     bool sign,\r\n     int_fast32_t exp,\r\n     uint_fast64_t sig,\r\n     uint_fast64_t sigExtra,\r\n     uint_fast8_t roundingPrecision\r\n )\r\n{\r\n    uint_fast8_t roundingMode;\r\n    bool roundNearEven;\r\n    uint_fast64_t roundIncrement, roundMask, roundBits;\r\n    bool isTiny, doIncrement;\r\n    struct uint64_extra sig64Extra;\r\n    union { struct extFloat80M s; extFloat80_t f; } uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    roundingMode = state->roundingMode;\r\n    roundNearEven = (roundingMode == softfloat_round_near_even);\r\n    if ( roundingPrecision == 80 ) goto precision80;\r\n    if ( roundingPrecision == 64 ) {\r\n        roundIncrement = UINT64_C( 0x0000000000000400 );\r\n        roundMask = UINT64_C( 0x00000000000007FF );\r\n    } else if ( roundingPrecision == 32 ) {\r\n        roundIncrement = UINT64_C( 0x0000008000000000 );\r\n        roundMask = UINT64_C( 0x000000FFFFFFFFFF );\r\n    } else {\r\n        goto precision80;\r\n    }\r\n    sig |= (sigExtra != 0);\r\n    if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {\r\n        roundIncrement =\r\n            (roundingMode\r\n                 == (sign ? softfloat_round_min : softfloat_round_max))\r\n                ? roundMask\r\n                : 0;\r\n    }\r\n    roundBits = sig & roundMask;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( 0x7FFD <= (uint32_t) (exp - 1) ) {\r\n        if ( exp <= 0 ) {\r\n            /*----------------------------------------------------------------\r\n            *----------------------------------------------------------------*/\r\n            isTiny =\r\n                   (state->detectTininess\r\n                        == softfloat_tininess_beforeRounding)\r\n                || (exp < 0)\r\n                || (sig <= (uint64_t) (sig + roundIncrement));\r\n            sig = softfloat_shiftRightJam64( sig, 1 - exp );\r\n            roundBits = sig & roundMask;\r\n            if ( roundBits ) {\r\n                if ( isTiny ) softfloat_raiseFlags( state, softfloat_flag_underflow );\r\n                state->exceptionFlags |= softfloat_flag_inexact;\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n                if ( roundingMode == softfloat_round_odd ) {\r\n                    sig |= roundMask + 1;\r\n                }\r\n#endif\r\n            }\r\n            sig += roundIncrement;\r\n            exp = ((sig & UINT64_C( 0x8000000000000000 )) != 0);\r\n            roundIncrement = roundMask + 1;\r\n            if ( roundNearEven && (roundBits<<1 == roundIncrement) ) {\r\n                roundMask |= roundIncrement;\r\n            }\r\n            sig &= ~roundMask;\r\n            goto packReturn;\r\n        }\r\n        if (\r\n               (0x7FFE < exp)\r\n            || ((exp == 0x7FFE) && ((uint64_t) (sig + roundIncrement) < sig))\r\n        ) {\r\n            goto overflow;\r\n        }\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( roundBits ) {\r\n        state->exceptionFlags |= softfloat_flag_inexact;\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n        if ( roundingMode == softfloat_round_odd ) {\r\n            sig = (sig & ~roundMask) | (roundMask + 1);\r\n            goto packReturn;\r\n        }\r\n#endif\r\n    }\r\n    sig = (uint64_t) (sig + roundIncrement);\r\n    if ( sig < roundIncrement ) {\r\n        ++exp;\r\n        sig = UINT64_C( 0x8000000000000000 );\r\n    }\r\n    roundIncrement = roundMask + 1;\r\n    if ( roundNearEven && (roundBits<<1 == roundIncrement) ) {\r\n        roundMask |= roundIncrement;\r\n    }\r\n    sig &= ~roundMask;\r\n    goto packReturn;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n precision80:\r\n    doIncrement = (UINT64_C( 0x8000000000000000 ) <= sigExtra);\r\n    if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {\r\n        doIncrement =\r\n            (roundingMode\r\n                 == (sign ? softfloat_round_min : softfloat_round_max))\r\n                && sigExtra;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( 0x7FFD <= (uint32_t) (exp - 1) ) {\r\n        if ( exp <= 0 ) {\r\n            /*----------------------------------------------------------------\r\n            *----------------------------------------------------------------*/\r\n            isTiny =\r\n                   (state->detectTininess\r\n                        == softfloat_tininess_beforeRounding)\r\n                || (exp < 0)\r\n                || ! doIncrement\r\n                || (sig < UINT64_C( 0xFFFFFFFFFFFFFFFF ));\r\n            sig64Extra =\r\n                softfloat_shiftRightJam64Extra( sig, sigExtra, 1 - exp );\r\n            exp = 0;\r\n            sig = sig64Extra.v;\r\n            sigExtra = sig64Extra.extra;\r\n            if ( sigExtra ) {\r\n                if ( isTiny ) softfloat_raiseFlags( state, softfloat_flag_underflow );\r\n                state->exceptionFlags |= softfloat_flag_inexact;\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n                if ( roundingMode == softfloat_round_odd ) {\r\n                    sig |= 1;\r\n                    goto packReturn;\r\n                }\r\n#endif\r\n            }\r\n            doIncrement = (UINT64_C( 0x8000000000000000 ) <= sigExtra);\r\n            if (\r\n                ! roundNearEven\r\n                    && (roundingMode != softfloat_round_near_maxMag)\r\n            ) {\r\n                doIncrement =\r\n                    (roundingMode\r\n                         == (sign ? softfloat_round_min : softfloat_round_max))\r\n                        && sigExtra;\r\n            }\r\n            if ( doIncrement ) {\r\n                ++sig;\r\n                sig &=\r\n                    ~(uint_fast64_t)\r\n                         (! (sigExtra & UINT64_C( 0x7FFFFFFFFFFFFFFF ))\r\n                              & roundNearEven);\r\n                exp = ((sig & UINT64_C( 0x8000000000000000 )) != 0);\r\n            }\r\n            goto packReturn;\r\n        }\r\n        if (\r\n               (0x7FFE < exp)\r\n            || ((exp == 0x7FFE) && (sig == UINT64_C( 0xFFFFFFFFFFFFFFFF ))\r\n                    && doIncrement)\r\n        ) {\r\n            /*----------------------------------------------------------------\r\n            *----------------------------------------------------------------*/\r\n            roundMask = 0;\r\n overflow:\r\n            softfloat_raiseFlags(\r\n                state, softfloat_flag_overflow | softfloat_flag_inexact );\r\n            if (\r\n                   roundNearEven\r\n                || (roundingMode == softfloat_round_near_maxMag)\r\n                || (roundingMode\r\n                        == (sign ? softfloat_round_min : softfloat_round_max))\r\n            ) {\r\n                exp = 0x7FFF;\r\n                sig = UINT64_C( 0x8000000000000000 );\r\n            } else {\r\n                exp = 0x7FFE;\r\n                sig = ~roundMask;\r\n            }\r\n            goto packReturn;\r\n        }\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( sigExtra ) {\r\n        state->exceptionFlags |= softfloat_flag_inexact;\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n        if ( roundingMode == softfloat_round_odd ) {\r\n            sig |= 1;\r\n            goto packReturn;\r\n        }\r\n#endif\r\n    }\r\n    if ( doIncrement ) {\r\n        ++sig;\r\n        if ( ! sig ) {\r\n            ++exp;\r\n            sig = UINT64_C( 0x8000000000000000 );\r\n        } else {\r\n            sig &=\r\n                ~(uint_fast64_t)\r\n                     (! (sigExtra & UINT64_C( 0x7FFFFFFFFFFFFFFF ))\r\n                          & roundNearEven);\r\n        }\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n packReturn:\r\n    uZ.s.signExp = packToExtF80UI64( sign, exp );\r\n    uZ.s.signif = sig;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_roundPackToF128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2017 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"softfloat.h\"\r\n\r\nfloat128_t\r\n softfloat_roundPackToF128(\r\n     struct softfloat_state *state,\r\n     bool sign,\r\n     int_fast32_t exp,\r\n     uint_fast64_t sig64,\r\n     uint_fast64_t sig0,\r\n     uint_fast64_t sigExtra\r\n )\r\n{\r\n    uint_fast8_t roundingMode;\r\n    bool roundNearEven, doIncrement, isTiny;\r\n    struct uint128_extra sig128Extra;\r\n    uint_fast64_t uiZ64, uiZ0;\r\n    struct uint128 sig128;\r\n    union ui128_f128 uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    roundingMode = state->roundingMode;\r\n    roundNearEven = (roundingMode == softfloat_round_near_even);\r\n    doIncrement = (UINT64_C( 0x8000000000000000 ) <= sigExtra);\r\n    if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {\r\n        doIncrement =\r\n            (roundingMode\r\n                 == (sign ? softfloat_round_min : softfloat_round_max))\r\n                && sigExtra;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( 0x7FFD <= (uint32_t) exp ) {\r\n        if ( exp < 0 ) {\r\n            /*----------------------------------------------------------------\r\n            *----------------------------------------------------------------*/\r\n            isTiny =\r\n                   (state->detectTininess\r\n                        == softfloat_tininess_beforeRounding)\r\n                || (exp < -1)\r\n                || ! doIncrement\r\n                || softfloat_lt128(\r\n                       sig64,\r\n                       sig0,\r\n                       UINT64_C( 0x0001FFFFFFFFFFFF ),\r\n                       UINT64_C( 0xFFFFFFFFFFFFFFFF )\r\n                   );\r\n            sig128Extra =\r\n                softfloat_shiftRightJam128Extra( sig64, sig0, sigExtra, -exp );\r\n            sig64 = sig128Extra.v.v64;\r\n            sig0  = sig128Extra.v.v0;\r\n            sigExtra = sig128Extra.extra;\r\n            exp = 0;\r\n            if ( isTiny && sigExtra ) {\r\n                softfloat_raiseFlags( state, softfloat_flag_underflow );\r\n            }\r\n            doIncrement = (UINT64_C( 0x8000000000000000 ) <= sigExtra);\r\n            if (\r\n                   ! roundNearEven\r\n                && (roundingMode != softfloat_round_near_maxMag)\r\n            ) {\r\n                doIncrement =\r\n                    (roundingMode\r\n                         == (sign ? softfloat_round_min : softfloat_round_max))\r\n                        && sigExtra;\r\n            }\r\n        } else if (\r\n               (0x7FFD < exp)\r\n            || ((exp == 0x7FFD)\r\n                    && softfloat_eq128( \r\n                           sig64,\r\n                           sig0,\r\n                           UINT64_C( 0x0001FFFFFFFFFFFF ),\r\n                           UINT64_C( 0xFFFFFFFFFFFFFFFF )\r\n                       )\r\n                    && doIncrement)\r\n        ) {\r\n            /*----------------------------------------------------------------\r\n            *----------------------------------------------------------------*/\r\n            softfloat_raiseFlags(\r\n                state, softfloat_flag_overflow | softfloat_flag_inexact );\r\n            if (\r\n                   roundNearEven\r\n                || (roundingMode == softfloat_round_near_maxMag)\r\n                || (roundingMode\r\n                        == (sign ? softfloat_round_min : softfloat_round_max))\r\n            ) {\r\n                uiZ64 = packToF128UI64( sign, 0x7FFF, 0 );\r\n                uiZ0  = 0;\r\n            } else {\r\n                uiZ64 =\r\n                    packToF128UI64(\r\n                        sign, 0x7FFE, UINT64_C( 0x0000FFFFFFFFFFFF ) );\r\n                uiZ0 = UINT64_C( 0xFFFFFFFFFFFFFFFF );\r\n            }\r\n            goto uiZ;\r\n        }\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( sigExtra ) {\r\n        state->exceptionFlags |= softfloat_flag_inexact;\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n        if ( roundingMode == softfloat_round_odd ) {\r\n            sig0 |= 1;\r\n            goto packReturn;\r\n        }\r\n#endif\r\n    }\r\n    if ( doIncrement ) {\r\n        sig128 = softfloat_add128( sig64, sig0, 0, 1 );\r\n        sig64 = sig128.v64;\r\n        sig0 =\r\n            sig128.v0\r\n                & ~(uint64_t)\r\n                       (! (sigExtra & UINT64_C( 0x7FFFFFFFFFFFFFFF ))\r\n                            & roundNearEven);\r\n    } else {\r\n        if ( ! (sig64 | sig0) ) exp = 0;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n     *------------------------------------------------------------------------*/\r\n    uiZ64 = packToF128UI64( sign, exp, sig64 );\r\n    uiZ0  = sig0;\r\n uiZ:\r\n    uZ.ui.v64 = uiZ64;\r\n    uZ.ui.v0  = uiZ0;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_roundPackToF32.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2017 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nfloat32_t\r\n softfloat_roundPackToF32( struct softfloat_state *state, bool sign, int_fast16_t exp, uint_fast32_t sig )\r\n{\r\n    uint_fast8_t roundingMode;\r\n    bool roundNearEven;\r\n    uint_fast8_t roundIncrement, roundBits;\r\n    bool isTiny;\r\n    uint_fast32_t uiZ;\r\n    union ui32_f32 uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    roundingMode = state->roundingMode;\r\n    roundNearEven = (roundingMode == softfloat_round_near_even);\r\n    roundIncrement = 0x40;\r\n    if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {\r\n        roundIncrement =\r\n            (roundingMode\r\n                 == (sign ? softfloat_round_min : softfloat_round_max))\r\n                ? 0x7F\r\n                : 0;\r\n    }\r\n    roundBits = sig & 0x7F;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( 0xFD <= (unsigned int) exp ) {\r\n        if ( exp < 0 ) {\r\n            /*----------------------------------------------------------------\r\n            *----------------------------------------------------------------*/\r\n            isTiny =\r\n                (state->detectTininess == softfloat_tininess_beforeRounding)\r\n                    || (exp < -1) || (sig + roundIncrement < 0x80000000);\r\n            sig = softfloat_shiftRightJam32( sig, -exp );\r\n            exp = 0;\r\n            roundBits = sig & 0x7F;\r\n            if ( isTiny && roundBits ) {\r\n                softfloat_raiseFlags( state, softfloat_flag_underflow );\r\n            }\r\n        } else if ( (0xFD < exp) || (0x80000000 <= sig + roundIncrement) ) {\r\n            /*----------------------------------------------------------------\r\n            *----------------------------------------------------------------*/\r\n            softfloat_raiseFlags(\r\n                state, softfloat_flag_overflow | softfloat_flag_inexact );\r\n            uiZ = packToF32UI( sign, 0xFF, 0 ) - ! roundIncrement;\r\n            goto uiZ;\r\n        }\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    sig = (sig + roundIncrement)>>7;\r\n    if ( roundBits ) {\r\n        state->exceptionFlags |= softfloat_flag_inexact;\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n        if ( roundingMode == softfloat_round_odd ) {\r\n            sig |= 1;\r\n            goto packReturn;\r\n        }\r\n#endif\r\n    }\r\n    sig &= ~(uint_fast32_t) (! (roundBits ^ 0x40) & roundNearEven);\r\n    if ( ! sig ) exp = 0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n packReturn:\r\n#endif\r\n    uiZ = packToF32UI( sign, exp, sig );\r\n uiZ:\r\n    uZ.ui = uiZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_roundPackToF64.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2017 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nfloat64_t\r\n softfloat_roundPackToF64( struct softfloat_state *state, bool sign, int_fast16_t exp, uint_fast64_t sig )\r\n{\r\n    uint_fast8_t roundingMode;\r\n    bool roundNearEven;\r\n    uint_fast16_t roundIncrement, roundBits;\r\n    bool isTiny;\r\n    uint_fast64_t uiZ;\r\n    union ui64_f64 uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    roundingMode = state->roundingMode;\r\n    roundNearEven = (roundingMode == softfloat_round_near_even);\r\n    roundIncrement = 0x200;\r\n    if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {\r\n        roundIncrement =\r\n            (roundingMode\r\n                 == (sign ? softfloat_round_min : softfloat_round_max))\r\n                ? 0x3FF\r\n                : 0;\r\n    }\r\n    roundBits = sig & 0x3FF;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if ( 0x7FD <= (uint16_t) exp ) {\r\n        if ( exp < 0 ) {\r\n            /*----------------------------------------------------------------\r\n            *----------------------------------------------------------------*/\r\n            isTiny =\r\n                (state->detectTininess == softfloat_tininess_beforeRounding)\r\n                    || (exp < -1)\r\n                    || (sig + roundIncrement < UINT64_C( 0x8000000000000000 ));\r\n            sig = softfloat_shiftRightJam64( sig, -exp );\r\n            exp = 0;\r\n            roundBits = sig & 0x3FF;\r\n            if ( isTiny && roundBits ) {\r\n                softfloat_raiseFlags( state, softfloat_flag_underflow );\r\n            }\r\n        } else if (\r\n            (0x7FD < exp)\r\n                || (UINT64_C( 0x8000000000000000 ) <= sig + roundIncrement)\r\n        ) {\r\n            /*----------------------------------------------------------------\r\n            *----------------------------------------------------------------*/\r\n            softfloat_raiseFlags(\r\n                state, softfloat_flag_overflow | softfloat_flag_inexact );\r\n            uiZ = packToF64UI( sign, 0x7FF, 0 ) - ! roundIncrement;\r\n            goto uiZ;\r\n        }\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    sig = (sig + roundIncrement)>>10;\r\n    if ( roundBits ) {\r\n        state->exceptionFlags |= softfloat_flag_inexact;\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n        if ( roundingMode == softfloat_round_odd ) {\r\n            sig |= 1;\r\n            goto packReturn;\r\n        }\r\n#endif\r\n    }\r\n    sig &= ~(uint_fast64_t) (! (roundBits ^ 0x200) & roundNearEven);\r\n    if ( ! sig ) exp = 0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n packReturn:\r\n#endif\r\n    uiZ = packToF64UI( sign, exp, sig );\r\n uiZ:\r\n    uZ.ui = uiZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_roundToI32.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nint_fast32_t\r\n softfloat_roundToI32(\r\n     struct softfloat_state *state, bool sign, uint_fast64_t sig, uint_fast8_t roundingMode, bool exact )\r\n{\r\n    uint_fast16_t roundIncrement, roundBits;\r\n    uint_fast32_t sig32;\r\n    union { uint32_t ui; int32_t i; } uZ;\r\n    int_fast32_t z;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    roundIncrement = 0x800;\r\n    if (\r\n        (roundingMode != softfloat_round_near_maxMag)\r\n            && (roundingMode != softfloat_round_near_even)\r\n    ) {\r\n        roundIncrement = 0;\r\n        if ( \r\n            sign\r\n                ? (roundingMode == softfloat_round_min)\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n                      || (roundingMode == softfloat_round_odd)\r\n#endif\r\n                : (roundingMode == softfloat_round_max)\r\n        ) {\r\n            roundIncrement = 0xFFF;\r\n        }\r\n    }\r\n    roundBits = sig & 0xFFF;\r\n    sig += roundIncrement;\r\n    if ( sig & UINT64_C( 0xFFFFF00000000000 ) ) goto invalid;\r\n    sig32 = sig>>12;\r\n    if (\r\n        (roundBits == 0x800) && (roundingMode == softfloat_round_near_even)\r\n    ) {\r\n        sig32 &= ~(uint_fast32_t) 1;\r\n    }\r\n    uZ.ui = sign ? -sig32 : sig32;\r\n    z = uZ.i;\r\n    if ( z && ((z < 0) ^ sign) ) goto invalid;\r\n    if ( roundBits ) {\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n        if ( roundingMode == softfloat_round_odd ) z |= 1;\r\n#endif\r\n        if ( exact ) state->exceptionFlags |= softfloat_flag_inexact;\r\n    }\r\n    return z;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n invalid:\r\n    softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n    return sign ? i32_fromNegOverflow : i32_fromPosOverflow;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_roundToI64.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nint_fast64_t\r\n softfloat_roundToI64(\r\n     struct softfloat_state *state,\r\n     bool sign,\r\n     uint_fast64_t sig,\r\n     uint_fast64_t sigExtra,\r\n     uint_fast8_t roundingMode,\r\n     bool exact\r\n )\r\n{\r\n    union { uint64_t ui; int64_t i; } uZ;\r\n    int_fast64_t z;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if (\r\n        (roundingMode == softfloat_round_near_maxMag)\r\n            || (roundingMode == softfloat_round_near_even)\r\n    ) {\r\n        if ( UINT64_C( 0x8000000000000000 ) <= sigExtra ) goto increment;\r\n    } else {\r\n        if (\r\n            sigExtra\r\n                && (sign\r\n                        ? (roundingMode == softfloat_round_min)\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n                              || (roundingMode == softfloat_round_odd)\r\n#endif\r\n                        : (roundingMode == softfloat_round_max))\r\n        ) {\r\n increment:\r\n            ++sig;\r\n            if ( !sig ) goto invalid;\r\n            if (\r\n                (sigExtra == UINT64_C( 0x8000000000000000 ))\r\n                    && (roundingMode == softfloat_round_near_even)\r\n            ) {\r\n                sig &= ~(uint_fast64_t) 1;\r\n            }\r\n        }\r\n    }\r\n    uZ.ui = sign ? -sig : sig;\r\n    z = uZ.i;\r\n    if ( z && ((z < 0) ^ sign) ) goto invalid;\r\n    if ( sigExtra ) {\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n        if ( roundingMode == softfloat_round_odd ) z |= 1;\r\n#endif\r\n        if ( exact ) state->exceptionFlags |= softfloat_flag_inexact;\r\n    }\r\n    return z;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n invalid:\r\n    softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n    return sign ? i64_fromNegOverflow : i64_fromPosOverflow;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_roundToUI64.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nuint_fast64_t\r\n softfloat_roundToUI64(\r\n     struct softfloat_state *state,\r\n     bool sign,\r\n     uint_fast64_t sig,\r\n     uint_fast64_t sigExtra,\r\n     uint_fast8_t roundingMode,\r\n     bool exact\r\n )\r\n{\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    if (\r\n        (roundingMode == softfloat_round_near_maxMag)\r\n            || (roundingMode == softfloat_round_near_even)\r\n    ) {\r\n        if ( UINT64_C( 0x8000000000000000 ) <= sigExtra ) goto increment;\r\n    } else {\r\n        if ( sign ) {\r\n            if ( !(sig | sigExtra) ) return 0;\r\n            if ( roundingMode == softfloat_round_min ) goto invalid;\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n            if ( roundingMode == softfloat_round_odd ) goto invalid;\r\n#endif\r\n        } else {\r\n            if ( (roundingMode == softfloat_round_max) && sigExtra ) {\r\n increment:\r\n                ++sig;\r\n                if ( !sig ) goto invalid;\r\n                if ( \r\n                    (sigExtra == UINT64_C( 0x8000000000000000 ))\r\n                        && (roundingMode == softfloat_round_near_even)\r\n                ) {\r\n                    sig &= ~(uint_fast64_t) 1;\r\n                }\r\n            }\r\n        }\r\n    }\r\n    if ( sign && sig ) goto invalid;\r\n    if ( sigExtra ) {\r\n#ifdef SOFTFLOAT_ROUND_ODD\r\n        if ( roundingMode == softfloat_round_odd ) sig |= 1;\r\n#endif\r\n        if ( exact ) state->exceptionFlags |= softfloat_flag_inexact;\r\n    }\r\n    return sig;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n invalid:\r\n    softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n    return sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_shiftRightJam128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitiveTypes.h\"\r\n\r\n#ifndef softfloat_shiftRightJam128\r\n\r\nstruct uint128\r\n softfloat_shiftRightJam128( uint64_t a64, uint64_t a0, uint_fast32_t dist )\r\n{\r\n    uint_fast8_t u8NegDist;\r\n    struct uint128 z;\r\n\r\n    if ( dist < 64 ) {\r\n        u8NegDist = -dist;\r\n        z.v64 = a64>>dist;\r\n        z.v0 =\r\n            a64<<(u8NegDist & 63) | a0>>dist\r\n                | ((uint64_t) (a0<<(u8NegDist & 63)) != 0);\r\n    } else {\r\n        z.v64 = 0;\r\n        z.v0 =\r\n            (dist < 127)\r\n                ? a64>>(dist & 63)\r\n                      | (((a64 & (((uint_fast64_t) 1<<(dist & 63)) - 1)) | a0)\r\n                             != 0)\r\n                : ((a64 | a0) != 0);\r\n    }\r\n    return z;\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_shiftRightJam128Extra.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitiveTypes.h\"\r\n\r\n#ifndef softfloat_shiftRightJam128Extra\r\n\r\nstruct uint128_extra\r\n softfloat_shiftRightJam128Extra(\r\n     uint64_t a64, uint64_t a0, uint64_t extra, uint_fast32_t dist )\r\n{\r\n    uint_fast8_t u8NegDist;\r\n    struct uint128_extra z;\r\n\r\n    u8NegDist = -dist;\r\n    if ( dist < 64 ) {\r\n        z.v.v64 = a64>>dist;\r\n        z.v.v0 = a64<<(u8NegDist & 63) | a0>>dist;\r\n        z.extra = a0<<(u8NegDist & 63);\r\n    } else {\r\n        z.v.v64 = 0;\r\n        if ( dist == 64 ) {\r\n            z.v.v0 = a64;\r\n            z.extra = a0;\r\n        } else {\r\n            extra |= a0;\r\n            if ( dist < 128 ) {\r\n                z.v.v0 = a64>>(dist & 63);\r\n                z.extra = a64<<(u8NegDist & 63);\r\n            } else {\r\n                z.v.v0 = 0;\r\n                z.extra = (dist == 128) ? a64 : (a64 != 0);\r\n            }\r\n        }\r\n    }\r\n    z.extra |= (extra != 0);\r\n    return z;\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_shiftRightJam32.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n\r\n#ifndef softfloat_shiftRightJam32\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint32_t softfloat_shiftRightJam32( uint32_t a, uint_fast16_t dist )\r\n{\r\n\r\n    return\r\n        (dist < 31) ? a>>dist | ((uint32_t) (a<<(-dist & 31)) != 0) : (a != 0);\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_shiftRightJam64.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n\r\n#ifndef softfloat_shiftRightJam64\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint64_t softfloat_shiftRightJam64( uint64_t a, uint_fast32_t dist )\r\n{\r\n\r\n    return\r\n        (dist < 63) ? a>>dist | ((uint64_t) (a<<(-dist & 63)) != 0) : (a != 0);\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_shiftRightJam64Extra.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitiveTypes.h\"\r\n\r\n#ifndef softfloat_shiftRightJam64Extra\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint64_extra\r\n softfloat_shiftRightJam64Extra(\r\n     uint64_t a, uint64_t extra, uint_fast32_t dist )\r\n{\r\n    struct uint64_extra z;\r\n\r\n    if ( dist < 64 ) {\r\n        z.v = a>>dist;\r\n        z.extra = a<<(-dist & 63);\r\n    } else {\r\n        z.v = 0;\r\n        z.extra = (dist == 64) ? a : (a != 0);\r\n    }\r\n    z.extra |= (extra != 0);\r\n    return z;\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_shortShiftLeft128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitiveTypes.h\"\r\n\r\n#ifndef softfloat_shortShiftLeft128\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128\r\n softfloat_shortShiftLeft128( uint64_t a64, uint64_t a0, uint_fast8_t dist )\r\n{\r\n    struct uint128 z;\r\n\r\n    z.v64 = a64<<dist | a0>>(-dist & 63);\r\n    z.v0 = a0<<dist;\r\n    return z;\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_shortShiftRight128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitiveTypes.h\"\r\n\r\n#ifndef softfloat_shortShiftRight128\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128\r\n softfloat_shortShiftRight128( uint64_t a64, uint64_t a0, uint_fast8_t dist )\r\n{\r\n    struct uint128 z;\r\n\r\n    z.v64 = a64>>dist;\r\n    z.v0 = a64<<(-dist & 63) | a0>>dist;\r\n    return z;\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_shortShiftRightJam64.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n\r\n#ifndef softfloat_shortShiftRightJam64\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint64_t softfloat_shortShiftRightJam64( uint64_t a, uint_fast8_t dist )\r\n{\r\n\r\n    return a>>dist | ((a & (((uint_fast64_t) 1<<dist) - 1)) != 0);\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_shortShiftRightJam64Extra.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitiveTypes.h\"\r\n\r\n#ifndef softfloat_shortShiftRightJam64Extra\r\n\r\nstruct uint64_extra\r\n softfloat_shortShiftRightJam64Extra(\r\n     uint64_t a, uint64_t extra, uint_fast8_t dist )\r\n{\r\n    struct uint64_extra z;\r\n\r\n    z.v = a>>dist;\r\n    z.extra = a<<(-dist & 63) | (extra != 0);\r\n    return z;\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_sub128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"primitiveTypes.h\"\r\n\r\n#ifndef softfloat_sub128\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128\r\n softfloat_sub128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )\r\n{\r\n    struct uint128 z;\r\n\r\n    z.v0 = a0 - b0;\r\n    z.v64 = a64 - b64 - (a0 < b0);\r\n    return z;\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_subMagsExtF80.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nextFloat80_t\r\n softfloat_subMagsExtF80(\r\n     struct softfloat_state *state,\r\n     uint_fast16_t uiA64,\r\n     uint_fast64_t uiA0,\r\n     uint_fast16_t uiB64,\r\n     uint_fast64_t uiB0,\r\n     bool signZ\r\n )\r\n{\r\n    int_fast32_t expA;\r\n    uint_fast64_t sigA;\r\n    int_fast32_t expB;\r\n    uint_fast64_t sigB;\r\n    int_fast32_t expDiff;\r\n    uint_fast16_t uiZ64;\r\n    uint_fast64_t uiZ0;\r\n    int_fast32_t expZ;\r\n    uint_fast64_t sigExtra;\r\n    struct uint128 sig128, uiZ;\r\n    union { struct extFloat80M s; extFloat80_t f; } uZ;\r\n\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    expA = expExtF80UI64( uiA64 );\r\n    sigA = uiA0;\r\n    expB = expExtF80UI64( uiB64 );\r\n    sigB = uiB0;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    expDiff = expA - expB;\r\n    if ( 0 < expDiff ) goto expABigger;\r\n    if ( expDiff < 0 ) goto expBBigger;\r\n    if ( expA == 0x7FFF ) {\r\n        if ( (sigA | sigB) & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {\r\n            goto propagateNaN;\r\n        }\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        uiZ64 = defaultNaNExtF80UI64;\r\n        uiZ0  = defaultNaNExtF80UI0;\r\n        goto uiZ;\r\n    }\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n    expZ = expA;\r\n    if ( ! expZ ) expZ = 1;\r\n    sigExtra = 0;\r\n    if ( sigB < sigA ) goto aBigger;\r\n    if ( sigA < sigB ) goto bBigger;\r\n    uiZ64 =\r\n        packToExtF80UI64( (state->roundingMode == softfloat_round_min), 0 );\r\n    uiZ0 = 0;\r\n    goto uiZ;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n expBBigger:\r\n    if ( expB == 0x7FFF ) {\r\n        if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;\r\n        uiZ64 = packToExtF80UI64( signZ ^ 1, 0x7FFF );\r\n        uiZ0  = UINT64_C( 0x8000000000000000 );\r\n        goto uiZ;\r\n    }\r\n    if ( ! expA ) {\r\n        ++expDiff;\r\n        sigExtra = 0;\r\n        if ( ! expDiff ) goto newlyAlignedBBigger;\r\n    }\r\n    sig128 = softfloat_shiftRightJam128( sigA, 0, -expDiff );\r\n    sigA = sig128.v64;\r\n    sigExtra = sig128.v0;\r\n newlyAlignedBBigger:\r\n    expZ = expB;\r\n bBigger:\r\n    signZ = ! signZ;\r\n    sig128 = softfloat_sub128( sigB, 0, sigA, sigExtra );\r\n    goto normRoundPack;\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n expABigger:\r\n    if ( expA == 0x7FFF ) {\r\n        if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;\r\n        uiZ64 = uiA64;\r\n        uiZ0  = uiA0;\r\n        goto uiZ;\r\n    }\r\n    if ( ! expB ) {\r\n        --expDiff;\r\n        sigExtra = 0;\r\n        if ( ! expDiff ) goto newlyAlignedABigger;\r\n    }\r\n    sig128 = softfloat_shiftRightJam128( sigB, 0, expDiff );\r\n    sigB = sig128.v64;\r\n    sigExtra = sig128.v0;\r\n newlyAlignedABigger:\r\n    expZ = expA;\r\n aBigger:\r\n    sig128 = softfloat_sub128( sigA, 0, sigB, sigExtra );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n normRoundPack:\r\n    return\r\n        softfloat_normRoundPackToExtF80(\r\n            state, signZ, expZ, sig128.v64, sig128.v0, state->roundingPrecision );\r\n    /*------------------------------------------------------------------------\r\n    *------------------------------------------------------------------------*/\r\n propagateNaN:\r\n    uiZ = softfloat_propagateNaNExtF80UI( state, uiA64, uiA0, uiB64, uiB0 );\r\n    uiZ64 = uiZ.v64;\r\n    uiZ0  = uiZ.v0;\r\n uiZ:\r\n    uZ.s.signExp = uiZ64;\r\n    uZ.s.signif  = uiZ0;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/s_subMagsF128.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of\r\nCalifornia.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"specialize.h\"\r\n#include \"softfloat.h\"\r\n\r\nfloat128_t\r\n softfloat_subMagsF128(\r\n     struct softfloat_state *state,\r\n     uint_fast64_t uiA64,\r\n     uint_fast64_t uiA0,\r\n     uint_fast64_t uiB64,\r\n     uint_fast64_t uiB0,\r\n     bool signZ\r\n )\r\n{\r\n    int_fast32_t expA;\r\n    struct uint128 sigA;\r\n    int_fast32_t expB;\r\n    struct uint128 sigB, sigZ;\r\n    int_fast32_t expDiff, expZ;\r\n    struct uint128 uiZ;\r\n    union ui128_f128 uZ;\r\n\r\n    expA = expF128UI64( uiA64 );\r\n    sigA.v64 = fracF128UI64( uiA64 );\r\n    sigA.v0  = uiA0;\r\n    expB = expF128UI64( uiB64 );\r\n    sigB.v64 = fracF128UI64( uiB64 );\r\n    sigB.v0  = uiB0;\r\n    sigA = softfloat_shortShiftLeft128( sigA.v64, sigA.v0, 4 );\r\n    sigB = softfloat_shortShiftLeft128( sigB.v64, sigB.v0, 4 );\r\n    expDiff = expA - expB;\r\n    if ( 0 < expDiff ) goto expABigger;\r\n    if ( expDiff < 0 ) goto expBBigger;\r\n    if ( expA == 0x7FFF ) {\r\n        if ( sigA.v64 | sigA.v0 | sigB.v64 | sigB.v0 ) goto propagateNaN;\r\n        softfloat_raiseFlags( state, softfloat_flag_invalid );\r\n        uiZ.v64 = defaultNaNF128UI64;\r\n        uiZ.v0  = defaultNaNF128UI0;\r\n        goto uiZ;\r\n    }\r\n    expZ = expA;\r\n    if ( ! expZ ) expZ = 1;\r\n    if ( sigB.v64 < sigA.v64 ) goto aBigger;\r\n    if ( sigA.v64 < sigB.v64 ) goto bBigger;\r\n    if ( sigB.v0 < sigA.v0 ) goto aBigger;\r\n    if ( sigA.v0 < sigB.v0 ) goto bBigger;\r\n    uiZ.v64 =\r\n        packToF128UI64(\r\n            (state->roundingMode == softfloat_round_min), 0, 0 );\r\n    uiZ.v0 = 0;\r\n    goto uiZ;\r\n expBBigger:\r\n    if ( expB == 0x7FFF ) {\r\n        if ( sigB.v64 | sigB.v0 ) goto propagateNaN;\r\n        uiZ.v64 = packToF128UI64( signZ ^ 1, 0x7FFF, 0 );\r\n        uiZ.v0  = 0;\r\n        goto uiZ;\r\n    }\r\n    if ( expA ) {\r\n        sigA.v64 |= UINT64_C( 0x0010000000000000 );\r\n    } else {\r\n        ++expDiff;\r\n        if ( ! expDiff ) goto newlyAlignedBBigger;\r\n    }\r\n    sigA = softfloat_shiftRightJam128( sigA.v64, sigA.v0, -expDiff );\r\n newlyAlignedBBigger:\r\n    expZ = expB;\r\n    sigB.v64 |= UINT64_C( 0x0010000000000000 );\r\n bBigger:\r\n    signZ = ! signZ;\r\n    sigZ = softfloat_sub128( sigB.v64, sigB.v0, sigA.v64, sigA.v0 );\r\n    goto normRoundPack;\r\n expABigger:\r\n    if ( expA == 0x7FFF ) {\r\n        if ( sigA.v64 | sigA.v0 ) goto propagateNaN;\r\n        uiZ.v64 = uiA64;\r\n        uiZ.v0  = uiA0;\r\n        goto uiZ;\r\n    }\r\n    if ( expB ) {\r\n        sigB.v64 |= UINT64_C( 0x0010000000000000 );\r\n    } else {\r\n        --expDiff;\r\n        if ( ! expDiff ) goto newlyAlignedABigger;\r\n    }\r\n    sigB = softfloat_shiftRightJam128( sigB.v64, sigB.v0, expDiff );\r\n newlyAlignedABigger:\r\n    expZ = expA;\r\n    sigA.v64 |= UINT64_C( 0x0010000000000000 );\r\n aBigger:\r\n    sigZ = softfloat_sub128( sigA.v64, sigA.v0, sigB.v64, sigB.v0 );\r\n normRoundPack:\r\n    return softfloat_normRoundPackToF128( state, signZ, expZ - 5, sigZ.v64, sigZ.v0 );\r\n propagateNaN:\r\n    uiZ = softfloat_propagateNaNF128UI( state, uiA64, uiA0, uiB64, uiB0 );\r\n uiZ:\r\n    uZ.ui = uiZ;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/softfloat_raiseFlags.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014 The Regents of the University of California.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include \"platform.h\"\r\n#include \"softfloat.h\"\r\n\r\n/*----------------------------------------------------------------------------\r\n| Raises the exceptions specified by `flags'.  Floating-point traps can be\r\n| defined here if desired.  It is currently not possible for such a trap\r\n| to substitute a result value.  If traps are not implemented, this routine\r\n| should be simply `softfloat_exceptionFlags |= flags;'.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nvoid softfloat_raiseFlags( struct softfloat_state *state, uint_fast8_t flags )\r\n{\r\n\r\n    state->exceptionFlags |= flags;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/specialize.h",
    "content": "\r\n/*============================================================================\r\n\r\nThis C header file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2018 The Regents of the\r\nUniversity of California.  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#ifndef specialize_h\r\n#define specialize_h 1\r\n\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include \"primitiveTypes.h\"\r\n#include \"softfloat.h\"\r\n\r\n/*----------------------------------------------------------------------------\r\n| Default value for 'softfloat_detectTininess'.\r\n*----------------------------------------------------------------------------*/\r\n#define init_detectTininess softfloat_tininess_afterRounding\r\n\r\n/*----------------------------------------------------------------------------\r\n| The values to return on conversions to 32-bit integer formats that raise an\r\n| invalid exception.\r\n*----------------------------------------------------------------------------*/\r\n#define ui32_fromPosOverflow 0xFFFFFFFF\r\n#define ui32_fromNegOverflow 0xFFFFFFFF\r\n#define ui32_fromNaN         0xFFFFFFFF\r\n#define i32_fromPosOverflow  (-0x7FFFFFFF - 1)\r\n#define i32_fromNegOverflow  (-0x7FFFFFFF - 1)\r\n#define i32_fromNaN          (-0x7FFFFFFF - 1)\r\n\r\n/*----------------------------------------------------------------------------\r\n| The values to return on conversions to 64-bit integer formats that raise an\r\n| invalid exception.\r\n*----------------------------------------------------------------------------*/\r\n#define ui64_fromPosOverflow UINT64_C( 0xFFFFFFFFFFFFFFFF )\r\n#define ui64_fromNegOverflow UINT64_C( 0xFFFFFFFFFFFFFFFF )\r\n#define ui64_fromNaN         UINT64_C( 0xFFFFFFFFFFFFFFFF )\r\n#define i64_fromPosOverflow  (-INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1)\r\n#define i64_fromNegOverflow  (-INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1)\r\n#define i64_fromNaN          (-INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1)\r\n\r\n/*----------------------------------------------------------------------------\r\n| \"Common NaN\" structure, used to transfer NaN representations from one format\r\n| to another.\r\n*----------------------------------------------------------------------------*/\r\nstruct commonNaN {\r\n    bool sign;\r\n#ifdef LITTLEENDIAN\r\n    uint64_t v0, v64;\r\n#else\r\n    uint64_t v64, v0;\r\n#endif\r\n};\r\n\r\n/*----------------------------------------------------------------------------\r\n| The bit pattern for a default generated 16-bit floating-point NaN.\r\n*----------------------------------------------------------------------------*/\r\n#define defaultNaNF16UI 0xFE00\r\n\r\n/*----------------------------------------------------------------------------\r\n| Returns true when 16-bit unsigned integer 'uiA' has the bit pattern of a\r\n| 16-bit floating-point signaling NaN.\r\n| Note:  This macro evaluates its argument more than once.\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_isSigNaNF16UI( uiA ) ((((uiA) & 0x7E00) == 0x7C00) && ((uiA) & 0x01FF))\r\n\r\n/*----------------------------------------------------------------------------\r\n| Assuming 'uiA' has the bit pattern of a 16-bit floating-point NaN, converts\r\n| this NaN to the common NaN form, and stores the resulting common NaN at the\r\n| location pointed to by 'zPtr'.  If the NaN is a signaling NaN, the invalid\r\n| exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nvoid softfloat_f16UIToCommonNaN( uint_fast16_t uiA, struct commonNaN *zPtr );\r\n\r\n/*----------------------------------------------------------------------------\r\n| Converts the common NaN pointed to by 'aPtr' into a 16-bit floating-point\r\n| NaN, and returns the bit pattern of this value as an unsigned integer.\r\n*----------------------------------------------------------------------------*/\r\nuint_fast16_t softfloat_commonNaNToF16UI( const struct commonNaN *aPtr );\r\n\r\n/*----------------------------------------------------------------------------\r\n| Interpreting 'uiA' and 'uiB' as the bit patterns of two 16-bit floating-\r\n| point values, at least one of which is a NaN, returns the bit pattern of\r\n| the combined NaN result.  If either 'uiA' or 'uiB' has the pattern of a\r\n| signaling NaN, the invalid exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nuint_fast16_t\r\n softfloat_propagateNaNF16UI( uint_fast16_t uiA, uint_fast16_t uiB );\r\n\r\n/*----------------------------------------------------------------------------\r\n| The bit pattern for a default generated 32-bit floating-point NaN.\r\n*----------------------------------------------------------------------------*/\r\n#define defaultNaNF32UI 0xFFC00000\r\n\r\n/*----------------------------------------------------------------------------\r\n| Returns true when 32-bit unsigned integer 'uiA' has the bit pattern of a\r\n| 32-bit floating-point signaling NaN.\r\n| Note:  This macro evaluates its argument more than once.\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_isSigNaNF32UI( uiA ) ((((uiA) & 0x7FC00000) == 0x7F800000) && ((uiA) & 0x003FFFFF))\r\n\r\n/*----------------------------------------------------------------------------\r\n| Assuming 'uiA' has the bit pattern of a 32-bit floating-point NaN, converts\r\n| this NaN to the common NaN form, and stores the resulting common NaN at the\r\n| location pointed to by 'zPtr'.  If the NaN is a signaling NaN, the invalid\r\n| exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nvoid softfloat_f32UIToCommonNaN( struct softfloat_state *, uint_fast32_t uiA, struct commonNaN *zPtr );\r\n\r\n/*----------------------------------------------------------------------------\r\n| Converts the common NaN pointed to by 'aPtr' into a 32-bit floating-point\r\n| NaN, and returns the bit pattern of this value as an unsigned integer.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr );\r\n\r\n/*----------------------------------------------------------------------------\r\n| Interpreting 'uiA' and 'uiB' as the bit patterns of two 32-bit floating-\r\n| point values, at least one of which is a NaN, returns the bit pattern of\r\n| the combined NaN result.  If either 'uiA' or 'uiB' has the pattern of a\r\n| signaling NaN, the invalid exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nuint_fast32_t\r\n softfloat_propagateNaNF32UI( uint_fast32_t uiA, uint_fast32_t uiB );\r\n\r\n/*----------------------------------------------------------------------------\r\n| The bit pattern for a default generated 64-bit floating-point NaN.\r\n*----------------------------------------------------------------------------*/\r\n#define defaultNaNF64UI UINT64_C( 0xFFF8000000000000 )\r\n\r\n/*----------------------------------------------------------------------------\r\n| Returns true when 64-bit unsigned integer 'uiA' has the bit pattern of a\r\n| 64-bit floating-point signaling NaN.\r\n| Note:  This macro evaluates its argument more than once.\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_isSigNaNF64UI( uiA ) ((((uiA) & UINT64_C( 0x7FF8000000000000 )) == UINT64_C( 0x7FF0000000000000 )) && ((uiA) & UINT64_C( 0x0007FFFFFFFFFFFF )))\r\n\r\n/*----------------------------------------------------------------------------\r\n| Assuming 'uiA' has the bit pattern of a 64-bit floating-point NaN, converts\r\n| this NaN to the common NaN form, and stores the resulting common NaN at the\r\n| location pointed to by 'zPtr'.  If the NaN is a signaling NaN, the invalid\r\n| exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nvoid softfloat_f64UIToCommonNaN( struct softfloat_state *, uint_fast64_t uiA, struct commonNaN *zPtr );\r\n\r\n/*----------------------------------------------------------------------------\r\n| Converts the common NaN pointed to by 'aPtr' into a 64-bit floating-point\r\n| NaN, and returns the bit pattern of this value as an unsigned integer.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nuint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr );\r\n\r\n/*----------------------------------------------------------------------------\r\n| Interpreting 'uiA' and 'uiB' as the bit patterns of two 64-bit floating-\r\n| point values, at least one of which is a NaN, returns the bit pattern of\r\n| the combined NaN result.  If either 'uiA' or 'uiB' has the pattern of a\r\n| signaling NaN, the invalid exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nuint_fast64_t\r\n softfloat_propagateNaNF64UI( uint_fast64_t uiA, uint_fast64_t uiB );\r\n\r\n/*----------------------------------------------------------------------------\r\n| The bit pattern for a default generated 80-bit extended floating-point NaN.\r\n*----------------------------------------------------------------------------*/\r\n#define defaultNaNExtF80UI64 0xFFFF\r\n#define defaultNaNExtF80UI0  UINT64_C( 0xC000000000000000 )\r\n\r\n/*----------------------------------------------------------------------------\r\n| Returns true when the 80-bit unsigned integer formed from concatenating\r\n| 16-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of an 80-bit extended\r\n| floating-point signaling NaN.\r\n| Note:  This macro evaluates its arguments more than once.\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ((((uiA64) & 0x7FFF) == 0x7FFF) && ! ((uiA0) & UINT64_C( 0x4000000000000000 )) && ((uiA0) & UINT64_C( 0x3FFFFFFFFFFFFFFF )))\r\n\r\n#ifdef SOFTFLOAT_FAST_INT64\r\n\r\n/*----------------------------------------------------------------------------\r\n| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is\r\n| defined.\r\n*----------------------------------------------------------------------------*/\r\n\r\n/*----------------------------------------------------------------------------\r\n| Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0'\r\n| has the bit pattern of an 80-bit extended floating-point NaN, converts\r\n| this NaN to the common NaN form, and stores the resulting common NaN at the\r\n| location pointed to by 'zPtr'.  If the NaN is a signaling NaN, the invalid\r\n| exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nvoid\r\n softfloat_extF80UIToCommonNaN(\r\n     struct softfloat_state *, uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr );\r\n\r\n/*----------------------------------------------------------------------------\r\n| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended\r\n| floating-point NaN, and returns the bit pattern of this value as an unsigned\r\n| integer.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr );\r\n\r\n/*----------------------------------------------------------------------------\r\n| Interpreting the unsigned integer formed from concatenating 'uiA64' and\r\n| 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting\r\n| the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another\r\n| 80-bit extended floating-point value, and assuming at least on of these\r\n| floating-point values is a NaN, returns the bit pattern of the combined NaN\r\n| result.  If either original floating-point value is a signaling NaN, the\r\n| invalid exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128\r\n softfloat_propagateNaNExtF80UI(\r\n     struct softfloat_state *,\r\n     uint_fast16_t uiA64,\r\n     uint_fast64_t uiA0,\r\n     uint_fast16_t uiB64,\r\n     uint_fast64_t uiB0\r\n );\r\n\r\n/*----------------------------------------------------------------------------\r\n| The bit pattern for a default generated 128-bit floating-point NaN.\r\n*----------------------------------------------------------------------------*/\r\n#define defaultNaNF128UI64 UINT64_C( 0xFFFF800000000000 )\r\n#define defaultNaNF128UI0  UINT64_C( 0 )\r\n\r\n/*----------------------------------------------------------------------------\r\n| Returns true when the 128-bit unsigned integer formed from concatenating\r\n| 64-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of a 128-bit floating-\r\n| point signaling NaN.\r\n| Note:  This macro evaluates its arguments more than once.\r\n*----------------------------------------------------------------------------*/\r\n#define softfloat_isSigNaNF128UI( uiA64, uiA0 ) ((((uiA64) & UINT64_C( 0x7FFF800000000000 )) == UINT64_C( 0x7FFF000000000000 )) && ((uiA0) || ((uiA64) & UINT64_C( 0x00007FFFFFFFFFFF ))))\r\n\r\n/*----------------------------------------------------------------------------\r\n| Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0'\r\n| has the bit pattern of a 128-bit floating-point NaN, converts this NaN to\r\n| the common NaN form, and stores the resulting common NaN at the location\r\n| pointed to by 'zPtr'.  If the NaN is a signaling NaN, the invalid exception\r\n| is raised.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nvoid\r\n softfloat_f128UIToCommonNaN(\r\n     struct softfloat_state *, uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr );\r\n\r\n/*----------------------------------------------------------------------------\r\n| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point\r\n| NaN, and returns the bit pattern of this value as an unsigned integer.\r\n*----------------------------------------------------------------------------*/\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nstruct uint128 softfloat_commonNaNToF128UI( const struct commonNaN * );\r\n\r\n/*----------------------------------------------------------------------------\r\n| Interpreting the unsigned integer formed from concatenating 'uiA64' and\r\n| 'uiA0' as a 128-bit floating-point value, and likewise interpreting the\r\n| unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another\r\n| 128-bit floating-point value, and assuming at least on of these floating-\r\n| point values is a NaN, returns the bit pattern of the combined NaN result.\r\n| If either original floating-point value is a signaling NaN, the invalid\r\n| exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nstruct uint128\r\n softfloat_propagateNaNF128UI(\r\n     struct softfloat_state *,\r\n     uint_fast64_t uiA64,\r\n     uint_fast64_t uiA0,\r\n     uint_fast64_t uiB64,\r\n     uint_fast64_t uiB0\r\n );\r\n\r\n#else\r\n\r\n/*----------------------------------------------------------------------------\r\n| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is not\r\n| defined.\r\n*----------------------------------------------------------------------------*/\r\n\r\n/*----------------------------------------------------------------------------\r\n| Assuming the 80-bit extended floating-point value pointed to by 'aSPtr' is\r\n| a NaN, converts this NaN to the common NaN form, and stores the resulting\r\n| common NaN at the location pointed to by 'zPtr'.  If the NaN is a signaling\r\n| NaN, the invalid exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_extF80MToCommonNaN(\r\n     const struct extFloat80M *aSPtr, struct commonNaN *zPtr );\r\n\r\n/*----------------------------------------------------------------------------\r\n| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended\r\n| floating-point NaN, and stores this NaN at the location pointed to by\r\n| 'zSPtr'.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_commonNaNToExtF80M(\r\n     const struct commonNaN *aPtr, struct extFloat80M *zSPtr );\r\n\r\n/*----------------------------------------------------------------------------\r\n| Assuming at least one of the two 80-bit extended floating-point values\r\n| pointed to by 'aSPtr' and 'bSPtr' is a NaN, stores the combined NaN result\r\n| at the location pointed to by 'zSPtr'.  If either original floating-point\r\n| value is a signaling NaN, the invalid exception is raised.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_propagateNaNExtF80M(\r\n     const struct extFloat80M *aSPtr,\r\n     const struct extFloat80M *bSPtr,\r\n     struct extFloat80M *zSPtr\r\n );\r\n\r\n/*----------------------------------------------------------------------------\r\n| The bit pattern for a default generated 128-bit floating-point NaN.\r\n*----------------------------------------------------------------------------*/\r\n#define defaultNaNF128UI96 0xFFFF8000\r\n#define defaultNaNF128UI64 0\r\n#define defaultNaNF128UI32 0\r\n#define defaultNaNF128UI0  0\r\n\r\n/*----------------------------------------------------------------------------\r\n| Assuming the 128-bit floating-point value pointed to by 'aWPtr' is a NaN,\r\n| converts this NaN to the common NaN form, and stores the resulting common\r\n| NaN at the location pointed to by 'zPtr'.  If the NaN is a signaling NaN,\r\n| the invalid exception is raised.  Argument 'aWPtr' points to an array of\r\n| four 32-bit elements that concatenate in the platform's normal endian order\r\n| to form a 128-bit floating-point value.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_f128MToCommonNaN( const uint32_t *aWPtr, struct commonNaN *zPtr );\r\n\r\n/*----------------------------------------------------------------------------\r\n| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point\r\n| NaN, and stores this NaN at the location pointed to by 'zWPtr'.  Argument\r\n| 'zWPtr' points to an array of four 32-bit elements that concatenate in the\r\n| platform's normal endian order to form a 128-bit floating-point value.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr );\r\n\r\n/*----------------------------------------------------------------------------\r\n| Assuming at least one of the two 128-bit floating-point values pointed to by\r\n| 'aWPtr' and 'bWPtr' is a NaN, stores the combined NaN result at the location\r\n| pointed to by 'zWPtr'.  If either original floating-point value is a\r\n| signaling NaN, the invalid exception is raised.  Each of 'aWPtr', 'bWPtr',\r\n| and 'zWPtr' points to an array of four 32-bit elements that concatenate in\r\n| the platform's normal endian order to form a 128-bit floating-point value.\r\n*----------------------------------------------------------------------------*/\r\nvoid\r\n softfloat_propagateNaNF128M(\r\n     const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr );\r\n\r\n#endif\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "External/SoftFloat-3e/src/ui64_to_extF80.c",
    "content": "\r\n/*============================================================================\r\n\r\nThis C source file is part of the SoftFloat IEEE Floating-Point Arithmetic\r\nPackage, Release 3e, by John R. Hauser.\r\n\r\nCopyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of\r\nCalifornia.  All Rights Reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n 1. Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions, and the following disclaimer.\r\n\r\n 2. Redistributions in binary form must reproduce the above copyright notice,\r\n    this list of conditions, and the following disclaimer in the documentation\r\n    and/or other materials provided with the distribution.\r\n\r\n 3. Neither the name of the University nor the names of its contributors may\r\n    be used to endorse or promote products derived from this software without\r\n    specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS \"AS IS\", AND ANY\r\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE\r\nDISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n=============================================================================*/\r\n\r\n#include <stdint.h>\r\n#include \"platform.h\"\r\n#include \"internals.h\"\r\n#include \"softfloat.h\"\r\n\r\nFEXCORE_PRESERVE_ALL_ATTR\r\nextFloat80_t ui64_to_extF80( uint64_t a )\r\n{\r\n    uint_fast16_t uiZ64;\r\n    int_fast8_t shiftDist;\r\n    union { struct extFloat80M s; extFloat80_t f; } uZ;\r\n\r\n    uiZ64 = 0;\r\n    if ( a ) {\r\n        shiftDist = softfloat_countLeadingZeros64( a );\r\n        uiZ64 = 0x403E - shiftDist;\r\n        a <<= shiftDist;\r\n    }\r\n    uZ.s.signExp = uiZ64;\r\n    uZ.s.signif  = a;\r\n    return uZ.f;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "External/cephes/CMakeLists.txt",
    "content": "add_library(cephes_128bit STATIC\n  src/128bit/Impl.cpp\n  src/128bit/atanll.c\n  src/128bit/constll.c\n  src/128bit/exp2ll.c\n  src/128bit/floorll.c\n  src/128bit/log2ll.c\n  src/128bit/mtherr.c\n  src/128bit/polevll.c\n  src/128bit/sinll.c\n  src/128bit/tanll.c)\n\n# 128-bit library\ntarget_link_libraries(cephes_128bit softfloat_3e)\ntarget_include_directories(cephes_128bit PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/)\ntarget_compile_options(cephes_128bit PRIVATE -fno-builtin)\n"
  },
  {
    "path": "External/cephes/LICENSE",
    "content": "The cephes math library is BSD licensed.\nThe source can be accessed from https://www.netlib.org/cephes/\n\nOriginal license from https://www.netlib.org/cephes/readme :\n>    Some software in this archive may be from the book _Methods and\n> Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster\n> International, 1989) or from the Cephes Mathematical Library, a\n> commercial product. In either event, it is copyrighted by the author.\n> What you see here may be used freely but it comes with no support or\n> guarantee.\n>\n>    The two known misprints in the book are repaired here in the\n> source listings for the gamma function and the incomplete beta\n> integral.\n>\n>\n>    Stephen L. Moshier\n>    moshier@na-net.ornl.gov\n\nThe author was e-mailed and they allowed it to be relicensed under BSD.\nResources:\nhttps://bugs.gentoo.org/687276\nhttps://lists.debian.org/debian-legal/2004/12/msg00295.html\nhttps://github.com/deepmind/torch-cephes/blob/master/LICENSE.txt\nhttps://github.com/nearform/node-cephes/blob/master/LICENSE\n\nE-mail snippit from torch-cephes source:\n\nReturn-Path: <steve@moshier.net>\nX-Original-To: julien@cornebise.com\nDelivered-To: julien@cornebise.com\nReceived: from atl4mhob11.myregisteredsite.com (atl4mhob11.myregisteredsite.com [209.17.115.49])\n    by cornebise.com (Postfix) with ESMTP id D47B139FC0\n    for <julien@cornebise.com>; Fri, 25 Oct 2013 16:32:40 +0200 (CEST)\nReceived: from mailpod1.hostingplatform.com ([10.30.71.116])\n    by atl4mhob11.myregisteredsite.com (8.14.4/8.14.4) with ESMTP id r9PEWcwQ003543\n    for <julien@cornebise.com>; Fri, 25 Oct 2013 10:32:38 -0400\nReceived: (qmail 11948 invoked by uid 0); 25 Oct 2013 12:36:20 -0000\nX-TCPREMOTEIP: 76.24.25.74\nX-Authenticated-UID: steve@moshier.net\nReceived: from unknown (HELO d510.local) (steve@moshier.net@76.24.25.74)\n  by 0 with ESMTPA; 25 Oct 2013 12:36:20 -0000\nDate: Fri, 25 Oct 2013 08:36:19 -0400 (EDT)\nFrom: Stephen Moshier <steve@moshier.net>\nX-X-Sender: steve@d510\nTo: Julien Cornebise <julien@cornebise.com>\nSubject: Re: Cephes: permission to wrap+distribute for Lua\nIn-Reply-To: <52653AD3.1010004@cornebise.com>\nMessage-ID: <alpine.DEB.2.02.1310250827040.17646@d510>\nReferences: <52653AD3.1010004@cornebise.com>\nUser-Agent: Alpine 2.02 (DEB 1266 2009-07-14)\nMIME-Version: 1.0\nContent-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed\n\n\nJulien, thank you for writing.\nBSD license is fine, modification is OK.\nThere are more build scripts available in the web site distributions than\nthere are on the Netlib.  I think there is an update to Planck's radiation\nfunction that I haven't sent to Netlib yet.  But Netlib is a more stable\nsite, so it is better to cite that as a reference.\n\n\nOn Mon, 21 Oct 2013, Julien Cornebise wrote:\n\n> -----BEGIN PGP SIGNED MESSAGE-----\n> Hash: SHA1\n>\n> Dear Mr Moshier\n>\n> I am a researcher in mathematics and machine learning in London, and\n> am writing about your awesome Cephes library, whom I found at the\n> heart of Scipy.\n>\n> It is so useful that, with your permission, I would like to wrap it\n> for Lua and Torch (a machine learning overlay to Lua, specialized in\n> neural nets, see http://www.torch.ch). I would like to distribute it\n> as a package for Torch, including your source code along the wrapping\n> code.\n> This wouldbe a public package, distributed under BSD License. I have\n> put a first draft on github:\n> https://github.com/jucor/torch-cephes\n>\n> Hence my three questions, please:\n>\n> 1/ How would you like to be acknowledged, beyond the comments that are\n> already in your code? Do you have any standard header/disclaimer that\n> I could add to the documentation?\n>\n> 2/ At the moment, your code is left untouched. However, if I ever need\n> to modify bits of the code, what are the conditions/restrictions?\n> Nothing huge -- I definitely do not want to mess with it: I was\n> planning to use the natural completion of some functions on the\n> completed real line (e.g. CDF returing 1 when called with \"infinity\",\n> or quantiles returning -Infinity when called with 0), either natively\n> if supported, or by setting a specific flag  via mtherr().\n>\n> 3/ I am currently using the source from Netlib. Do you recommend using\n> the source from your website instead ?\n>\n> Thank you very much for your attention,\n> and, more importantly, for the time and effort your poured into Cephes.\n>\n> Best regards,\n>\n> Julien Cornebise, Ph.D.\n> London, UK\n> http://www.cornebise.com/julien\n> -----BEGIN PGP SIGNATURE-----\n> Version: GnuPG v1.4.14 (Darwin)\n> Comment: GPGTools - http://gpgtools.org\n> Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/\n>\n> iEYEARECAAYFAlJlOtEACgkQKYR3gC0rw/gIpQCfZKu6+iDh9ghhm6QfsLXnldKN\n> BuIAn2zZHu1c/IrRAevhjM7N7xGg0LHO\n> =WeP5\n> -----END PGP SIGNATURE-----\n\n"
  },
  {
    "path": "External/cephes/include/cephes_128bit.h",
    "content": "#pragma once\n\nextern \"C\" {\n#include \"SoftFloat-3e/platform.h\"\n#include \"SoftFloat-3e/softfloat.h\"\n}\n\nnamespace FEXCore::cephes_128bit {\n  float128_t atan2l(float128_t y, float128_t x);\n  float128_t cosl(float128_t x);\n  float128_t exp2l(float128_t x);\n  float128_t log2l(float128_t x);\n  float128_t sinl(float128_t x);\n  float128_t tanl(float128_t x);\n}\n"
  },
  {
    "path": "External/cephes/src/128bit/Impl.cpp",
    "content": "#include \"cephes_128bit.h\"\n\nextern \"C\" {\n// cephes_128bit functions\nfloat128_t cephes_f128_atan2l(float128_t y, float128_t x);\nfloat128_t cephes_f128_cosl(float128_t x);\nfloat128_t cephes_f128_exp2l(float128_t x);\nfloat128_t cephes_f128_log2l(float128_t x);\nfloat128_t cephes_f128_sinl(float128_t x);\nfloat128_t cephes_f128_tanl(float128_t x);\n}\n\nnamespace FEXCore::cephes_128bit {\n  float128_t atan2l(float128_t y, float128_t x) {\n    return cephes_f128_atan2l(y, x);\n  }\n  float128_t cosl(float128_t x) {\n    return cephes_f128_cosl(x);\n  }\n  float128_t exp2l(float128_t x) {\n    return cephes_f128_exp2l(x);\n  }\n  float128_t log2l(float128_t x) {\n    return cephes_f128_log2l(x);\n  }\n  float128_t sinl(float128_t x) {\n    return cephes_f128_sinl(x);\n  }\n  float128_t tanl(float128_t x) {\n    return cephes_f128_tanl(x);\n  }\n}\n"
  },
  {
    "path": "External/cephes/src/128bit/atanll.c",
    "content": "/*\t\t\t\t\t\t\tatanl.c\n *\n *\tInverse circular tangent, 128-bit float128_t precision\n *      (arctangent)\n *\n *\n *\n * SYNOPSIS:\n *\n * float128_t x, y, atanl();\n *\n * y = atanl( x );\n *\n *\n *\n * DESCRIPTION:\n *\n * Returns radian angle between -pi/2 and +pi/2 whose tangent\n * is x.\n *\n * Range reduction is from four intervals into the interval\n * from zero to  tan( pi/8 ).  The approximant uses a rational\n * function of degree 3/4 of the form x + x**3 P(x)/Q(x).\n *\n *\n *\n * ACCURACY:\n *\n *                      Relative error:\n * arithmetic   domain     # trials      peak         rms\n *    IEEE      -10, 10    100,000      2.6e-34     6.5e-35\n *\n */\n\f/*\t\t\t\t\t\t\tatan2l()\n *\n *\tQuadrant correct inverse circular tangent,\n *\tfloat128_t precision\n *\n *\n *\n * SYNOPSIS:\n *\n * float128_t x, y, z, atan2l();\n *\n * z = atan2l( y, x );\n *\n *\n *\n * DESCRIPTION:\n *\n * Returns radian angle whose tangent is y/x.\n * Define compile time symbol ANSIC = 1 for ANSI standard,\n * range -PI < z <= +PI, args (y,x); else ANSIC = 0 for range\n * 0 to 2PI, args (x,y).\n *\n *\n *\n * ACCURACY:\n *\n *                      Relative error:\n * arithmetic   domain     # trials      peak         rms\n *    IEEE      -10, 10    100,000      3.2e-34      5.9e-35\n * See atan.c.\n *\n */\n\f\n/*\t\t\t\t\t\t\tatan.c */\n\n\n/*\nCephes Math Library Release 2.2:  December, 1990\nCopyright 1984, 1990 by Stephen L. Moshier\nDirect inquiries to 30 Frost Street, Cambridge, MA 02140\n*/\n\n#include \"mconf.h\"\n\n/* arctan(x) = x + x^3 P(x^2)\n * Theoretical peak relative error = 3.0e-36\n * relative peak error spread = 6.6e-8\n */\nstatic float128_t P[9] = {\n{0xf3f0105b1dae46bfULL, 0xbff45be85838aa26ULL}, // -6.635810778635296712545011270011752799963E-4L,\n{0x529a2bf25f15874bULL, 0xbffec0f17ae68a18ULL}, // -8.768423468036849091777415076702113400070E-1L,\n{0x3054a2e7144e265cULL, 0xc00397b0dc1f4d10ULL}, // -2.548067867495502632615671450650071218995E1L,\n{0x1e19d6b8c5cd9e65ULL, 0xc006f38d4e47779aULL}, // -2.497759878476618348858065206895055957104E2L,\n{0x69dcb1e41a413bddULL, 0xc0091f0a8586c642ULL}, // -1.148164399808514330375280133523543970854E3L,\n{0x501d0f5157516744ULL, 0xc00a5d08ba650145ULL}, // -2.792272753241044941703278827346430350236E3L,\n{0x16f18bf3f5b4b987ULL, 0xc00ace087656cfbeULL}, // -3.696264445691821235400930243493001671932E3L,\n{0x2966de608cbf9696ULL, 0xc00a3a5a8d629fc7ULL}, // -2.514829758941713674909996882101723647996E3L,\n{0xeb77db69572ecd22ULL, 0xc0085807a6c98431ULL}, // -6.880597774405940432145577545328795037141E2L\n};\nstatic float128_t Q[8] = {\n/* 1.000000000000000000000000000000000000000E0L, */\n{0x0cc994a760137543ULL, 0x40041d4c974b22bcULL}, // 3.566239794444800849656497338030115886153E1L,\n{0xa5b186c10b6a065eULL, 0x4007aed5b7e20c37ULL}, // 4.308348370818927353321556740027020068897E2L,\n{0x8711ebf202296129ULL, 0x400a37d5c6fdd0cdULL}, // 2.494680540950601626662048893678584497900E3L,\n{0x02d59339ee4eee21ULL, 0x400bef892855649eULL}, // 7.928572347062145288093560392463784743935E3L,\n{0xd9b903b0950fefb3ULL, 0x400cc7c8d1c45b09ULL}, // 1.458510242529987155225086911411015961174E4L,\n{0x174d6e0dae833752ULL, 0x400ce38f8ba0a897ULL}, // 1.547394317752562611786521896296215170819E4L,\n{0xfcbdd5dddcf7c68cULL, 0x400c1277f99a3d1aULL}, // 8.782996876218210302516194604424986107121E3L,\n{0x7099e48f01631a53ULL, 0x400a0205bd172325ULL}, // 2.064179332321782129643673263598686441900E3L\n};\n\n/* tan( 3*pi/8 ) */\nstatic float128_t T3P8 = {0x6484597d89b3754bULL, 0x40003504f333f9deULL};\n\n/* tan( pi/8 ) */\nstatic float128_t TP8 = {0x2422cbec4d9baa56ULL, 0x3ffda827999fcef3ULL};\n\nstatic const float128_t zero = {0, 0};\nstatic const float128_t one = {0, 0x3fff000000000000ULL};\n__attribute__((unused)) static const float128_t f_2_p0 = {0x0000000000000000ULL, 0x4000000000000000ULL};\n__attribute__((unused)) static const float128_t f_3_p0 = {0x0000000000000000ULL, 0x4000800000000000ULL};\n\nfloat128_t cephes_f128_atanl(float128_t x)\n{\nstruct softfloat_state state = {};\nfloat128_t y, z;\nshort sign;\n\n/* make argument positive and save the sign */\nsign = 1;\nif( f128_lt(&state, x, zero) )\n\t{\n\tsign = -1;\n\tx = f128_complement_sign(x);\n\t}\n\n/* range reduction */\n// if( x > T3P8 )\n\nif( f128_lt(&state, T3P8, x) )\n\t{\n\ty = F128_PIO2L;\n\tx = f128_complement_sign( f128_div(&state, one, x));\n\t}\n\nelse if( f128_lt(&state, TP8, x) )\n\t{\n\ty = F128_PIO4L;\n\tx = f128_div(&state, f128_sub(&state, x, one), f128_add(&state, x, one));\n\t}\nelse\n\ty = zero;\n\n/* rational form in x**2 */\nz = f128_mul(&state, x, x);\ny = f128_add(&state, f128_add(&state, y, f128_mul(&state, f128_mul(&state, f128_div(&state, cephes_f128_polevll( z, P, 8 ), cephes_f128_p1evll( z, Q, 8 ) ), z), x)), x);\n\nif( sign < 0 )\n\ty = f128_complement_sign(y);\n\nreturn(y);\n}\n\f\n/*\t\t\t\t\t\t\tatan2\t*/\n\n\n\n#if ANSIC\nfloat128_t cephes_f128_atan2l( float128_t y, float128_t x )\n#else\nfloat128_t cephes_f128_atan2l( float128_t x, float128_t y )\n#endif\n{\nstruct softfloat_state state = {};\nfloat128_t z, w;\nshort code;\n\n\ncode = 0;\nw = zero;\n\nif( f128_lt(&state, x, zero) )\n\tcode = 2;\nif( f128_lt(&state, y, zero) )\n\tcode |= 1;\n\nif( f128_eq(&state, x, zero) )\n\t{\n\tif( code & 1 )\n\t\t{\n#if ANSIC\n\t\treturn( f128_complement_sign(F128_PIO2L) );\n#else\n\t\treturn( f128_mul(&state, f_3_p0, F128_PIO2L) );\n#endif\n\t\t}\n\tif( f128_eq(&state, y, zero) )\n\t\treturn zero;\n\treturn( F128_PIO2L );\n\t}\n\nif( f128_eq(&state, y, zero) )\n\t{\n\tif( code & 2 )\n\t\treturn( F128_PIL );\n\treturn zero;\n\t}\n\n\nswitch( code )\n\t{\n#if ANSIC\n\tcase 0:\n\tcase 1: w = zero; break;\n\tcase 2: w = F128_PIL; break;\n\tcase 3: w = f128_complement_sign(F128_PIL); break;\n#else\n\tcase 0: w = zero; break;\n\tcase 1: w = f128_mul(&state, f_2_p0, F128_PIL); break;\n\tcase 2:\n\tcase 3: w = F128_PIL; break;\n#endif\n\t}\n\nz = cephes_f128_atanl( f128_div(&state, y, x) );\n\nreturn f128_add(&state, w, z );\n}\n"
  },
  {
    "path": "External/cephes/src/128bit/constll.c",
    "content": "#include \"mconf.h\"\n\n/* (1 - 2^-113) 2^16384 */\nfloat128_t F128_MAXNUML = {0xffffffffffffffffULL, 0x7ffeffffffffffffULL}; //1.189731495357231765085759326628007016196469e4932L;\n\n/* 2^-113 */\nfloat128_t F128_MACHEPL = {0x0000000000000000ULL, 0x3f8e000000000000ULL}; // 9.629649721936179265279889712924636592690508e-35L;\n\n/* (1 + 2^-112) 2^-16382 */\nfloat128_t F128_UFTHRESHL = {0x0000000000000001ULL, 0x0001000000000000ULL}; // 3.362103143112093506262677817321753250115591e-4932L;\n\n/* 2^-16494 */\nfloat128_t F128_MINNUML = {0x0000000000000001ULL, 0x0000000000000000ULL}; // 6.475175119438025110924438958227646552499569e-4966L;\n\n/* ln(MAXNUM) */\nfloat128_t F128_MAXLOGL = {0xf35793c7673007e6ULL, 0x400c62e42fefa39eULL}; // 1.1356523406294143949491931077970764891253E4L;\n\n/* ln(MINNUM) */\nfloat128_t F128_MINLOGL = {0x2c89d24d65e96274ULL, 0xc00c654628220780ULL}; // -1.143276959615573793352782661133116431383730e4L;\n\n/* ln(UFTHRESH) */\n/* float128_t F128_MINLOGL = -1.135513711193302405887309661372784853802025e4L; */\n\nfloat128_t F128_PIL = {0x8469898cc51701b8ULL, 0x4000921fb54442d1ULL}; // 3.141592653589793238462643383279502884197169L;\n\nfloat128_t F128_PIO2L = {0x8469898cc51701b8ULL, 0x3fff921fb54442d1ULL}; // 1.570796326794896619231321691639751442098585L;\n\nfloat128_t F128_PIO4L =  {0x8469898cc51701b8ULL, 0x3ffe921fb54442d1ULL}; // 0.7853981633974483096156608458198757210492923L;\n\nfloat128_t F128_LOGE2L =  {0xf35793c7673007e6ULL, 0x3ffe62e42fefa39eULL}; // 0.6931471805599453094172321214581765680755001L;\n\nfloat128_t F128_LOG2EL =  {0xe1777d0ffda0d23aULL, 0x3fff71547652b82fULL}; // 1.442695040888963407359924681001892137426646L;\n\nfloat128_t F128_INFINITYL = {0x0000000000000000ULL, 0x7fff000000000000ULL}; // 1.0L / 0.0L;\n"
  },
  {
    "path": "External/cephes/src/128bit/exp2ll.c",
    "content": "/*\t\t\t\t\t\t\texp2l.c\n *\n *\tBase 2 exponential function, 128-bit float128_t precision\n *\n *\n *\n * SYNOPSIS:\n *\n * float128_t x, y, exp2l();\n *\n * y = exp2l( x );\n *\n *\n *\n * DESCRIPTION:\n *\n * Returns 2 raised to the x power.\n *\n * Range reduction is accomplished by separating the argument\n * into an integer k and fraction f such that\n *     x    k  f\n *    2  = 2  2.\n *\n * A Pade' form\n *\n *   1 + 2x P(x**2) / (Q(x**2) - x P(x**2) )\n *\n * approximates 2**x in the basic range [-0.5, 0.5].\n *\n *\n * ACCURACY:\n *\n *                      Relative error:\n * arithmetic   domain     # trials      peak         rms\n *    IEEE      +-16300    100,000      2.0e-34     4.8e-35\n *\n *\n * See exp.c for comments on error amplification.\n *\n *\n * ERROR MESSAGES:\n *\n *   message         condition      value returned\n * exp2l underflow   x < -16382        0.0\n * exp2l overflow    x >= 16384       MAXNUM\n *\n */\n\f\n\n/*\nCephes Math Library Release 2.2:  January, 1991\nCopyright 1984, 1991 by Stephen L. Moshier\nDirect inquiries to 30 Frost Street, Cambridge, MA 02140\n*/\n\n#include \"mconf.h\"\nstatic char fname[] = {\"exp2l\"};\n\n/* Pade' coefficients for 2^x - 1\n   Theoretical peak relative error = 1.4e-40,\n   relative peak error spread = 6.8e-14\n */\nstatic float128_t P[5] = {\n {0x3008ca100ca13471ULL, 0x40063d6f2f556577ULL}, // 1.587171580015525194694938306936721666031E2L,\n {0x9fac10fe43d72769ULL, 0x40122e00e88b4606ULL}, // 6.185032670011643762127954396427045467506E5L,\n {0x4c22cf0c6c7a8fc7ULL, 0x401c0eb996d98ba4ULL}, // 5.677513871931844661829755443994214173883E8L,\n {0x4acd9b1339dda08aULL, 0x40241d19e728a6beULL}, // 1.530625323728429161131811299626419117557E11L,\n {0xae406b996488ba7aULL, 0x402a0840400c1c84ULL}, // 9.079594442980146270952372234833529694788E12L\n};\nstatic float128_t Q[5] = {\n/* 1.000000000000000000000000000000000000000E0L, */\n {0xcf48c9db239c2189ULL, 0x400c827029417a6aULL}, // 1.236602014442099053716561665053645270207E4L,\n {0xb20f61f9a3c778b9ULL, 0x40174d9860120d5dULL}, // 2.186249607051644894762167991800811827835E7L,\n {0x9f361a3e85f209ceULL, 0x4020457bc8296e4eULL}, // 1.092141473886177435056423606755843616331E10L,\n {0x2dcf78c66f0a65ddULL, 0x40275b0c5bcbd7a7ULL}, // 1.490560994263653042761789432690793026977E12L,\n {0x4e4a9905cf9c9235ULL, 0x402b7d3bcb89794eULL}, // 2.619817175234089411411070339065679229869E13L\n};\n\nstatic const float128_t MAXL2 = {0x0000000000000000ULL, 0x400d000000000000ULL};\nstatic const float128_t MINL2 = {0x0000000000000000ULL, 0xc00cfff000000000ULL};\nstatic const float128_t zero = {0, 0};\nstatic const float128_t f_0_p5 = {0, 0x3ffe000000000000ULL};\nstatic const float128_t one = {0, 0x3fff000000000000ULL};\n\nextern float128_t F128_MAXNUML;\n\nfloat128_t cephes_f128_exp2l(float128_t x) {\nstruct softfloat_state state = {};\nfloat128_t px, xx;\nint n;\n\nif( f128_le(&state, MAXL2, x))\n\t{\n\tmtherr( fname, OVERFLOW );\n\treturn( F128_MAXNUML );\n\t}\n\nif(f128_lt(&state, x, MINL2) )\n\t{\n\tmtherr( fname, UNDERFLOW );\n\treturn zero;\n\t}\n\nxx = x;\t/* save x */\n/* separate into integer and fractional parts */\npx = cephes_f128_floorl(f128_add(&state, x, f_0_p5));\nn = f128_to_i32(&state, px, softfloat_round_near_even, true);\nx = f128_sub(&state, x, px);\n\n/* rational approximation\n * exp2(x) = 1.0 +  2xP(xx)/(Q(xx) - P(xx))\n * where xx = x**2\n */\nxx = f128_mul(&state, x, x);\npx = f128_mul(&state, x, cephes_f128_polevll( xx, P, 4 ));\nx = f128_div(&state, px, f128_sub(&state, cephes_f128_p1evll( xx, Q, 5 ), px));\nx = f128_add(&state, one, cephes_f128_ldexpl( x, 1 ));\n\n/* scale by power of 2 */\nx = cephes_f128_ldexpl( x, n );\nreturn(x);\n}\n"
  },
  {
    "path": "External/cephes/src/128bit/floorll.c",
    "content": "/*                                                      ceill()\n *                                                      floorl()\n *                                                      frexpl()\n *                                                      ldexpl()\n *                                                      fabsl()\n *\t\t\t\t\t\t\tsignbitl()\n *\t\t\t\t\t\t\tisnanl()\n *\t\t\t\t\t\t\tisfinitel()\n *\n *      Floating point numeric utilities\n *\n *\n *\n * SYNOPSIS:\n *\n * float128_t x, y;\n * float128_t ceill(), floorl(), frexpl(), ldexpl(), fabsl();\n * int signbitl(), isnanl(), isfinitel();\n * int expnt, n;\n *\n * y = floorl(x);\n * y = ceill(x);\n * y = frexpl( x, &expnt );\n * y = ldexpl( x, n );\n * y = fabsl( x );\n *\n *\n *\n * DESCRIPTION:\n *\n * All four routines return a float128_t precision floating point\n * result.\n *\n * floorl() returns the largest integer less than or equal to x.\n * It truncates toward minus infinity.\n *\n * ceill() returns the smallest integer greater than or equal\n * to x.  It truncates toward plus infinity.\n *\n * frexpl() extracts the exponent from x.  It returns an integer\n * power of two to expnt and the significand between 0.5 and 1\n * to y.  Thus  x = y * 2**expn.\n *\n * ldexpl() multiplies x by 2**n.\n *\n * fabsl() returns the absolute value of its argument.\n *\n * signbitl(x) returns 1 if the sign bit of x is 1, else 0.\n *\n * These functions are part of the standard C run time library\n * for some but not all C compilers.  The ones supplied are\n * written in C for IEEE arithmetic.  They should\n * be used only if your compiler library does not already have\n * them.\n *\n * The IEEE versions assume that denormal numbers are implemented\n * in the arithmetic.  Some modifications will be required if\n * the arithmetic has abrupt rather than gradual underflow.\n */\n\f\n\n/*\nCephes Math Library Release 2.2:  July, 1992\nCopyright 1984, 1987, 1988, 1992 by Stephen L. Moshier\nDirect inquiries to 30 Frost Street, Cambridge, MA 02140\n*/\n\n#include \"mconf.h\"\n#define DENORMAL 1\n\n#ifdef UNK\nchar *unkmsg = \"ceill(), floorl(), frexpl(), ldexpl() must be rewritten!\\n\";\n#undef UNK\n#define MIEEE 1\n#define EXPOFS 0\n#endif\n\n#ifdef IBMPC\n#define NBITS 113\n#define EXPOFS 7\n#endif\n\n#ifdef MIEEE\n#define NBITS 113\n#define EXPOFS 0\n#endif\n\nextern float128_t F128_MAXNUML;\n\n\nstatic const float128_t zero = {0, 0};\nstatic const float128_t f_0_p5 = {0, 0x3ffe000000000000ULL};\nstatic const float128_t one = {0, 0x3fff000000000000ULL};\nstatic const float128_t neg_one = {0, 0xbfff000000000000ULL};\nstatic const float128_t f_2_p0 = {0, 0x4000000000000000ULL};\n\nfloat128_t cephes_f128_fabsl(float128_t x)\n{\nstruct softfloat_state state = {};\n\nif( f128_lt(&state, x, zero) )\n        return f128_sub(&state, zero, x );\nelse\n        return( x );\n}\n\n\n\nfloat128_t cephes_f128_ceill(float128_t x)\n{\nfloat128_t y;\n\n#ifdef UNK\nmtherr( \"ceill\", DOMAIN );\nreturn(0.0L);\n#endif\n\nstruct softfloat_state state = {};\ny = cephes_f128_floorl(x);\nif( f128_lt(&state, y, x) )\n        y = f128_add(&state, y, one);\nreturn(y);\n}\n\n\n\n\n/* Bit clearing masks: */\n\nstatic unsigned short bmask[] = {\n0xffff,\n0xfffe,\n0xfffc,\n0xfff8,\n0xfff0,\n0xffe0,\n0xffc0,\n0xff80,\n0xff00,\n0xfe00,\n0xfc00,\n0xf800,\n0xf000,\n0xe000,\n0xc000,\n0x8000,\n0x0000,\n};\n\n\n\nfloat128_t cephes_f128_floorl(float128_t x)\n{\nunion\n  {\n    float128_t y;\n    unsigned short sh[8];\n  } u;\nint e, j;\n\n#ifdef UNK\nmtherr( \"floor\", DOMAIN );\nreturn(0.0L);\n#endif\n\nstruct softfloat_state state = {};\nu.y = x;\n/* find the exponent (power of 2) */\ne = (u.sh[EXPOFS] & 0x7fff) - 0x3fff;\n\nif( e < 0 )\n        {\n        if( f128_lt(&state, u.y, zero) )\n                return neg_one;\n        else\n                return zero;\n        }\n\n#ifdef IBMPC\nj = 0;\n#endif\n\n#ifdef MIEEE\nj = 7;\n#endif\n\ne = (NBITS - 1) - e;\n/* clean out 16 bits at a time */\nwhile( e >= 16 )\n        {\n#ifdef IBMPC\n        u.sh[j++] = 0;\n#endif\n\n#ifdef MIEEE\n        u.sh[j--] = 0;\n#endif\n        e -= 16;\n        }\n\n/* clear the remaining bits */\nif( e > 0 )\n        u.sh[j] &= bmask[e];\n\nif( f128_lt(&state, x, zero) && !f128_eq(&state, u.y, x) )\n        u.y = f128_sub(&state, u.y, one);;\n\nreturn(u.y);\n}\n\n\n\nfloat128_t cephes_f128_frexpl( float128_t x, int *pw2 )\n{\nunion\n  {\n    float128_t y;\n    unsigned short sh[8];\n  } u;\nint i, k;\n\nstruct softfloat_state state = {};\nu.y = x;\n\n#ifdef UNK\nmtherr( \"frexp\", DOMAIN );\nreturn(0.0L);\n#endif\n\n/* find the exponent (power of 2) */\ni  = u.sh[EXPOFS] & 0x7fff;\n\nif( i == 0 )\n        {\n        if( f128_eq(&state, u.y, zero))\n                {\n                *pw2 = 0;\n                return zero;\n                }\n/* Number is denormal or zero */\n#if DENORMAL\n/* Handle denormal number. */\ndo\n        {\n        u.y = f128_mul(&state, u.y, f_2_p0);\n        i -= 1;\n        k  = u.sh[EXPOFS] & 0x7fff;\n        }\nwhile( (k == 0) && (i > -115) );\ni = i + k;\n#else\n        *pw2 = 0;\n        return(0.0L);\n#endif /* DENORMAL */\n        }\n\n*pw2 = i - 0x3ffe;\nu.sh[EXPOFS] = 0x3ffe;\nreturn( u.y );\n}\n\n\nfloat128_t cephes_f128_ldexpl( float128_t x, int pw2 )\n{\nunion\n  {\n    float128_t y;\n    unsigned short sh[8];\n  } u;\nlong e;\n\n#ifdef UNK\nmtherr( \"ldexp\", DOMAIN );\nreturn zero;\n#endif\n\nstruct softfloat_state state = {};\nu.y = x;\nwhile( (e = (u.sh[EXPOFS] & 0x7fffL)) == 0 )\n        {\n#if DENORMAL\n        if( f128_eq(&state, u.y, zero))\n                {\n                return zero;\n                }\n/* Input is denormal. */\n        if( pw2 > 0 )\n                {\n                u.y = f128_mul(&state, u.y, f_2_p0);\n                pw2 -= 1;\n                }\n        if( pw2 < 0 )\n                {\n                if( pw2 < -113 )\n                        return zero;\n                u.y = f128_sub(&state, u.y, f_0_p5);\n                pw2 += 1;\n                }\n        if( pw2 == 0 )\n                return(u.y);\n#else\n        return zero;\n#endif\n        }\n\ne = e + pw2;\n\n/* Handle overflow */\nif( e > 0x7ffeL )\n        {\n          e = u.sh[EXPOFS];\n          u.y = zero;\n          u.sh[EXPOFS] = e | 0x7fff;\n          return( u.y );\n        }\nu.sh[EXPOFS] &= 0x8000;\n/* Handle denormalized results */\nif( e < 1 )\n        {\n#if DENORMAL\n        if( e < -113 )\n                return zero;\n        u.sh[EXPOFS] |= 1;\n        while( e < 1 )\n                {\n                u.y = f128_sub(&state, u.y, f_0_p5);\n                e += 1;\n                }\n        e = 0;\n#else\n        return zero;\n#endif\n        }\n\nu.sh[EXPOFS] |= e & 0x7fff;\nreturn(u.y);\n}\n\n/* Return 1 if x is a number that is Not a Number, else return 0.  */\n\nint cephes_f128_isnanl(float128_t x)\n{\n#ifdef NANS\nunion\n\t{\n\tfloat128_t d;\n\tunsigned short s[8];\n\tunsigned int i[4];\n\t} u;\n\nu.d = x;\n\nif( sizeof(int) == 4 )\n\t{\n#ifdef IBMPC\t    \n\tif( ((u.s[7] & 0x7fff) == 0x7fff)\n\t    && ((u.i[3] & 0x7fff) | u.i[2] | u.i[1] | u.i[0]))\n\t\treturn 1;\n#endif\n#ifdef MIEEE\n\tif( ((u.i[0] & 0x7fff0000) == 0x7fff0000)\n\t    && ((u.i[0] & 0x7fff) | u.i[1] | u.i[2] | u.i[3]))\n\t\treturn 1;\n#endif\n\treturn(0);\n\t}\nelse\n\t{ /* size int not 4 */\n#ifdef IBMPC\n\tif( (u.s[7] & 0x7fff) == 0x7fff)\n\t\t{\n\t\tif((u.s[6] & 0x7fff) | u.s[5] | u.s[4] | u.s[3] | u.s[2] | u.s[1] | u.s[0])\n\t\t\treturn(1);\n\t\t}\n#endif\n#ifdef MIEEE\n\tif( (u.s[0] & 0x7fff) == 0x7fff)\n\t\t{\n\t\tif((u.s[1] & 0x7fff) | (u.s[2] & 0x7fff) | u.s[3] | u.s[4] | u.s[5] | u.s[6] | u.s[7])\n\t\t\treturn(1);\n\t\t}\n#endif\n\treturn(0);\n\t} /* size int not 4 */\n\n#else\n/* No NANS.  */\nreturn(0);\n#endif\n}\n\n\n/* Return 1 if x is not infinite and is not a NaN.  */\n\nint cephes_f128_isfinitel(float128_t x)\n{\n#ifdef INFINITIES\nunion\n\t{\n\tfloat128_t d;\n\tunsigned short s[8];\n\tunsigned int i[4];\n\t} u;\n\nu.d = x;\n\nif( sizeof(int) == 4 )\n\t{\n#ifdef IBMPC\n\tif( (u.s[7] & 0x7fff) != 0x7fff)\n\t\treturn 1;\n#endif\n#ifdef MIEEE\n\tif( (u.i[0] & 0x7fff0000) != 0x7fff0000)\n\t\treturn 1;\n#endif\n\treturn(0);\n\t}\nelse\n\t{\n#ifdef IBMPC\n\tif( (u.s[7] & 0x7fff) != 0x7fff)\n\t\treturn 1;\n#endif\n#ifdef MIEEE\n\tif( (u.s[0] & 0x7fff) != 0x7fff)\n\t\treturn 1;\n#endif\n\treturn(0);\n\t}\n#else\n/* No INFINITY.  */\nreturn(1);\n#endif\n}\n\n\n/* Return 1 if the sign bit of x is 1, else 0.  */\n\nint cephes_f128_signbitl(float128_t x)\n{\nunion\n\t{\n\tfloat128_t d;\n\tshort s[8];\n\tint i[4];\n\t} u;\n\nu.d = x;\n\nif( sizeof(int) == 4 )\n\t{\n#ifdef IBMPC\n\treturn( u.s[7] < 0 );\n#endif\n#ifdef DEC\nerror no such DEC format\n#endif\n#ifdef MIEEE\n\treturn( u.i[0] < 0 );\n#endif\n\t}\nelse\n\t{\n#ifdef IBMPC\n\treturn( u.s[7] < 0 );\n#endif\n#ifdef DEC\nerror no such DEC format\n#endif\n#ifdef MIEEE\n\treturn( u.s[0] < 0 );\n#endif\n\t}\n}\n"
  },
  {
    "path": "External/cephes/src/128bit/log2ll.c",
    "content": "/*\t\t\t\t\t\t\tcephes_f128_log2l.c\n *\n *\tBase 2 logarithm, float128_t precision\n *\n *\n *\n * SYNOPSIS:\n *\n * float128_t x, y, cephes_f128_log2l();\n *\n * y = cephes_f128_log2l( x );\n *\n *\n *\n * DESCRIPTION:\n *\n * Returns the base 2 logarithm of x.\n *\n * The argument is separated into its exponent and fractional\n * parts.  If the exponent is between -1 and +1, the (natural)\n * logarithm of the fraction is approximated by\n *\n *     log(1+x) = x - 0.5 x**2 + x**3 P(x)/Q(x).\n *\n * Otherwise, setting  z = 2(x-1)/x+1),\n * \n *     log(x) = z + z**3 P(z)/Q(z).\n *\n *\n *\n * ACCURACY:\n *\n *                      Relative error:\n * arithmetic   domain     # trials      peak         rms\n *    IEEE      0.5, 2.0     100,000    1.3e-34     4.5e-35\n *    IEEE     exp(+-10000)  100,000    9.6e-35     4.0e-35\n *\n * In the tests over the interval exp(+-10000), the logarithms\n * of the random arguments were uniformly distributed over\n * [-10000, +10000].\n *\n * ERROR MESSAGES:\n *\n * log singularity:  x = 0; returns MINLOG\n * log domain:       x < 0; returns MINLOG\n */\n\f\n/*\nCephes Math Library Release 2.2:  January, 1991\nCopyright 1984, 1991 by Stephen L. Moshier\nDirect inquiries to 30 Frost Street, Cambridge, MA 02140\n*/\n\n#include \"mconf.h\"\nstatic char fname[] = {\"cephes_f128_log2l\"};\n\n/* Coefficients for ln(1+x) = x - x**2/2 + x**3 P(x)/Q(x)\n * 1/sqrt(2) <= x < sqrt(2)\n * Theoretical peak relative error = 5.3e-37,\n * relative peak error spread = 2.3e-14\n */\nstatic float128_t P[13] = {\n\t{0x95434922008560fcULL, 0x3feb9d04a0d6ed82ULL}, // 1.538612243596254322971797716843006400388E-6L\n\t{0x2e9cb5e91a8c2fa0ULL, 0x3ffdffd7e21347ccULL}, // 4.998469661968096229986658302195402690910E-1L\n\t{0x674c43ea62a592e7ULL, 0x400373615178fe96ULL}, // 2.321125933898420063925789532045674660756E1L\n\t{0xfa539715d5fd0560ULL, 0x40079b73a8639c28ULL}, // 4.114517881637811823002128927449878962058E2L\n\t{0x5ec5c60d38b7fa2aULL, 0x400ade1e79b3ae12ULL}, // 3.824952356185897735160588078446136783779E3L\n\t{0x6369f0cada64eeecULL, 0x400d4ca24f0550cfULL}, // 2.128857716871515081352991964243375186031E4L\n\t{0x115104b644c1f464ULL, 0x400f28a791822d40ULL}, // 7.594356839258970405033155585486712125861E4L\n\t{0x95ec43488121aff8ULL, 0x40105f196a49f171ULL}, // 1.797628303815655343403735250238293741397E5L\n\t{0xa2484b7171ab5034ULL, 0x401116caba9f2757ULL}, // 2.854829159639697837788887080758954924001E5L\n\t{0xe49b2bf8646a8a1eULL, 0x401125a72eb05ba7ULL}, // 3.007007295140399532324943111654767187848E5L\n\t{0x17ac5c737d1b8ad4ULL, 0x4010897ca319418dULL}, // 2.014652742082537582487669938141683759923E5L\n\t{0x9ff15925da76d408ULL, 0x400f2f8f8bfbf9a1ULL}, // 7.771154681358524243729929227226708890930E4L\n\t{0xe740b8544d79077cULL, 0x400c9a7dcad5d0efULL}, // 1.313572404063446165910279910527789794488E4L\n};\nstatic float128_t Q[12] = {\n/* 1.000000000000000000000000000000000000000E0L, */\n{0x4a2113daac8d7fa5ULL,0x40048322fbda4d3fULL}, // 4.839208193348159620282142911143429644326E1L,\n{0x9efb2fe2c778f56fULL,0x4008c73f14777e56ULL}, // 9.104928120962988414618126155557301584078E2L,\n{0xf23a98d434d3a705ULL,0x400c1dd933ea5565ULL}, // 9.147150349299596453976674231612674085381E3L,\n{0x4b44059a3b76f461ULL,0x400eb5f4d77aed02ULL}, // 5.605842085972455027590989944010492125825E4L,\n{0x2962234d48fff0bcULL,0x4010b71bb67f5effULL}, // 2.248234257620569139969141618556349415120E5L,\n{0xe673c713bcf24ee3ULL,0x40122b6c5ddac3b8ULL}, // 6.132189329546557743179177159925690841200E5L,\n{0x34d8d36e8de37c71ULL,0x40131ab83fa3b03bULL}, // 1.158019977462989115839826904108208787040E6L,\n{0x061338bb0e95b314ULL,0x401371d8273f762aULL}, // 1.514882452993549494932585972882995548426E6L,\n{0xe379b5d8e7071d74ULL,0x401348fbe89d38e2ULL}, // 1.347518538384329112529391120390701166528E6L,\n{0x412eafafea233277ULL,0x40127bc5211688c1ULL}, // 7.777690340007566932935753241556479363645E5L,\n{0x16378fd2514ba129ULL,0x40110088814003eaULL}, // 2.626900195321832660448791748036714883242E5L,\n{0xed708a3f3a1ac5caULL,0x400e33de58205cb3ULL}, // 3.940717212190338497730839731583397586124E4L\n};\n\n/* Coefficients for log(x) = z + z^3 P(z^2)/Q(z^2),\n * where z = 2(x-1)/(x+1)\n * 1/sqrt(2) <= x < sqrt(2)\n * Theoretical peak relative error = 1.1e-35,\n * relative peak error spread 1.1e-9\n */\nstatic float128_t R[6] = {\n\t{0x68479d54e4ced708ULL, 0xbffec40a1c874f5aULL}, // -8.828896441624934385266096344596648080902E-1L,\n\t{0x565b5611a30df628ULL, 0x40054247b533971eULL}, // 8.057002716646055371965756206836056074715E1L,\n\t{0xb690eddd457e03b0ULL, 0xc009fa1350a9210eULL}, // -2.024301798136027039250415126250455056397E3L,\n\t{0xea1230d4dc2a41c8ULL, 0x400d4020cbb3c4edULL}, // 2.048819892795278657810231591630928516206E4L,\n\t{0x388e5d3ae806c32aULL, 0xc00f5eac94780e23ULL}, // -8.977257995689735303686582344659576526998E4L,\n\t{0x6802a6fb3250b4fdULL, 0x401014fab5e2e8c1ULL}, // 1.418134209872192732479751274970992665513E5L\n};\nstatic float128_t S[6] = {\n/* 1.000000000000000000000000000000000000000E0L, */\n {0x2575cd7cadd52c63ULL, 0xc005da8b34108b63ULL}, // -1.186359407982897997337150403816839480438E2L,\n {0x9022bf51e9d20aecULL, 0x400af3d0db24df08ULL}, // 3.998526750980007367835804959888064681098E3L,\n {0xeb27fc1032bb267dULL, 0xc00ec11ad77cc51cULL}, // -5.748542087379434595104154610899551484314E4L,\n {0xaeec5bd6a5211cbdULL, 0x401186c6f13df72eULL}, // 4.001557694070773974936904547424676279307E5L,\n {0xee9e91e4b3020178ULL, 0xc013455371e04bc5ULL}, // -1.332535117259762928288745111081235577029E6L,\n {0x1c03fa78cb791730ULL, 0x40139f7810d45d22ULL}, // 1.701761051846631278975701529965589676574E6L\n};\n/* log2(e) - 1 */\nstatic const float128_t LOG2EA = {0x85ddf43ff68348eaULL, 0x3ffdc551d94ae0bfULL};\n\nstatic const float128_t SQRTH = {0xc908b2fb1366ea95ULL,  0x3ffe6a09e667f3bcULL};\nstatic const float128_t zero = {0, 0};\nstatic const float128_t f_0_p5 = {0, 0x3ffe000000000000ULL};\nstatic const float128_t one = {0, 0x3fff000000000000ULL};\n\nstatic const float128_t indeterminate = {0x0000000000000000ULL, 0xc00d000000000000ULL};\n\nfloat128_t cephes_f128_log2l(float128_t x) {\nVOLATILE float128_t z;\nfloat128_t y;\nint e;\n\nstruct softfloat_state state = {};\n\n/* Test for domain */\nif( f128_le(&state, x, zero) )\n\t{\n\tif( f128_eq(&state, x, zero) )\n\t\tmtherr( fname, SING );\n\telse\n\t\tmtherr( fname, DOMAIN );\n\treturn indeterminate;\n\t}\n\n/* separate mantissa from exponent */\n\n/* Note, frexp is used so that denormal numbers\n * will be handled properly.\n */\nx = cephes_f128_frexpl( x, &e );\n\n\n/* logarithm using log(x) = z + z**3 P(z)/Q(z),\n * where z = 2(x-1)/x+1)\n */\nif( (e > 2) || (e < -2) )\n{\nif( f128_lt(&state, x, SQRTH) )\n\t{ /* 2( 2x-1 )/( 2x+1 ) */\n\te -= 1;\n\tz = f128_sub(&state, x, f_0_p5);\n\ty = f128_add(&state, f128_mul(&state, f_0_p5, z), f_0_p5);\n\t}\t\nelse\n\t{ /*  2 (x-1)/(x+1)   */\n\tz = f128_sub(&state, x, f_0_p5);\n\tz = f128_sub(&state, z, f_0_p5);\n\ty = f128_add(&state, f128_mul(&state, f_0_p5, x), f_0_p5);\n\t}\nx = f128_div(&state, z, y);\nz = f128_mul(&state, x, x);\ny = f128_mul(&state, x,\n    f128_div(&state, f128_mul(&state, z, cephes_f128_polevll( z, R, 5 )), cephes_f128_p1evll( z, S, 6 ) ));\ngoto done;\n}\n\n\n/* logarithm using log(1+x) = x - .5x**2 + x**3 P(x)/Q(x) */\n\nif( f128_lt(&state, x, SQRTH) )\n\t{\n\te -= 1;\n\tx = f128_sub(&state, cephes_f128_ldexpl( x, 1 ), one); /*  2x - 1  */\n\t}\nelse\n\t{\n\tx = f128_sub(&state, x, one);\n\t}\nz = f128_mul(&state, x, x);\ny = f128_mul(&state, x,\n    f128_div(&state, f128_mul(&state, z, cephes_f128_polevll( x, P, 12 )), cephes_f128_p1evll( x, Q, 12 )));\ny = f128_sub(&state, y, cephes_f128_ldexpl( z, -1 ));   /* -0.5x^2 + ... */\n\ndone:\n\n/* Multiply log of fraction by log2(e)\n * and base 2 exponent by 1\n *\n * ***CAUTION***\n *\n * This sequence of operations is critical and it may\n * be horribly defeated by some compiler optimizers.\n */\nz = f128_mul(&state, y, LOG2EA);\nz = f128_add(&state, z, f128_mul(&state, x, LOG2EA));\nz = f128_add(&state, z, y);\nz = f128_add(&state, z, x);\nz = f128_add(&state, z, i32_to_f128(e));\nreturn( z );\n}\n\n"
  },
  {
    "path": "External/cephes/src/128bit/mconf.h",
    "content": "/*\t\t\t\t\t\t\tmconf.h\n *\n *\tCommon include file for math routines\n *\n *\n *\n * SYNOPSIS:\n *\n * #include \"mconf.h\"\n *\n *\n *\n * DESCRIPTION:\n *\n * This file contains definitions for error codes that are\n * passed to the common error handling routine mtherr()\n * (which see).\n *\n * The file also includes a conditional assembly definition\n * for the type of computer arithmetic (IEEE, DEC, Motorola\n * IEEE, or UNKnown).\n * \n * For Digital Equipment PDP-11 and VAX computers, certain\n * IBM systems, and others that use numbers with a 56-bit\n * significand, the symbol DEC should be defined.  In this\n * mode, most floating point constants are given as arrays\n * of octal integers to eliminate decimal to binary conversion\n * errors that might be introduced by the compiler.\n *\n * For little-endian computers, such as IBM PC, that follow the\n * IEEE Standard for Binary Floating Point Arithmetic (ANSI/IEEE\n * Std 754-1985), the symbol IBMPC should be defined.  These\n * numbers have 53-bit significands.  In this mode, constants\n * are provided as arrays of hexadecimal 16 bit integers.\n *\n * Big-endian IEEE format is denoted MIEEE.  On some RISC\n * systems such as Sun SPARC, double precision constants\n * must be stored on 8-byte address boundaries.  Since integer\n * arrays may be aligned differently, the MIEEE configuration\n * may fail on such machines.\n *\n * To accommodate other types of computer arithmetic, all\n * constants are also provided in a normal decimal radix\n * which one can hope are correctly converted to a suitable\n * format by the available C language compiler.  To invoke\n * this mode, define the symbol UNK.\n *\n * An important difference among these modes is a predefined\n * set of machine arithmetic constants for each.  The numbers\n * MACHEP (the machine roundoff error), MAXNUM (largest number\n * represented), and several other parameters are preset by\n * the configuration symbol.  Check the file const.c to\n * ensure that these values are correct for your computer.\n *\n * Configurations NANS, INFINITIES, MINUSZERO, and DENORMAL\n * may fail on many systems.  Verify that they are supposed\n * to work on your computer.\n */\n\f\n/*\nCephes Math Library Release 2.3:  June, 1995\nCopyright 1984, 1987, 1989, 1995 by Stephen L. Moshier\n*/\n\n\n/* Constant definitions for math error conditions\n */\n\n#include \"SoftFloat-3e/platform.h\"\n#include \"SoftFloat-3e/softfloat.h\"\n\n#define DOMAIN\t\t1\t/* argument domain error */\n#define SING\t\t2\t/* argument singularity */\n#define OVERFLOW\t3\t/* overflow range error */\n#define UNDERFLOW\t4\t/* underflow range error */\n#define TLOSS\t\t5\t/* total loss of precision */\n#define PLOSS\t\t6\t/* partial loss of precision */\n\n#define EDOM\t\t33\n#define ERANGE\t\t34\n\n/* Complex numeral.  */\ntypedef struct\n\t{\n\tdouble r;\n\tdouble i;\n\t} cmplx;\n\ntypedef struct\n\t{\n\tfloat r;\n\tfloat i;\n\t} cmplxf;\n\n/* Long double complex numeral.  */\n\ntypedef struct\n\t{\n\tfloat128_t r;\n\tfloat128_t i;\n\t} cmplxl;\n\n\n/* Type of computer arithmetic */\n\n/* PDP-11, Pro350, VAX:\n */\n/* #define DEC 1 */\n\n/* Intel IEEE, low order words come first:\n */\n#define IBMPC 1\n\n/* Motorola IEEE, high order words come first\n * (Sun 680x0 workstation):\n */\n/* #define MIEEE 1 */\n\n/* UNKnown arithmetic, invokes coefficients given in\n * normal decimal format.  Beware of range boundary\n * problems (MACHEP, MAXLOG, etc. in const.c) and\n * roundoff problems in pow.c:\n * (Sun SPARCstation)\n */\n/* #define UNK 1 */\n\n/* If you define UNK, then be sure to set BIGENDIAN properly. */\n/* #define BIGENDIAN 1 */\n\n/* Define this `volatile' if your compiler thinks\n * that floating point arithmetic obeys the associative\n * and distributive laws.  It will defeat some optimizations\n * (but probably not enough of them).\n *\n * #define VOLATILE volatile\n */\n#define VOLATILE\n\n/* For 12-byte long doubles on an i386, pad a 16-bit short 0\n * to the end of real constants initialized by integer arrays.\n *\n * #define XPD 0,\n *\n * Otherwise, the type is 10 bytes long and XPD should be\n * defined blank (e.g., Microsoft C).\n *\n * #define XPD\n */\n#define XPD 0,\n\n/* Define to support tiny denormal numbers, else undefine. */\n#define DENORMAL 1\n\n/* Define to ask for infinity support, else undefine. */\n#define INFINITIES 1\n\n/* Define to ask for support of numbers that are Not-a-Number,\n   else undefine.  This may automatically define INFINITIES in some files. */\n#define NANS 1\n\n/* Define to distinguish between -0.0 and +0.0.  */\n#define MINUSZERO 1\n\n/* Define 1 for ANSI C atan2() function\n   and ANSI prototypes for float arguments.\n   See atan.c and clog.c. */\n#define ANSIC 1\n\n/* Variable for error reporting.  See mtherr.c.  */\nextern int merror;\n\n/* Forward declarations */\nextern float128_t F128_MINLOGL;\n\nextern float128_t F128_MAXNUML;\nextern float128_t F128_PIL;\nextern float128_t F128_PIO2L, F128_PIO4L;\n\nfloat128_t cephes_f128_atanl(float128_t x);\n#if ANSIC\nfloat128_t cephes_f128_atan2l( float128_t y, float128_t x );\n#else\nfloat128_t cephes_f128_atan2l( float128_t x, float128_t y );\n#endif\nfloat128_t cephes_f128_ceill(float128_t x);\nfloat128_t cephes_f128_cosl(float128_t x);\nfloat128_t cephes_f128_fabsl(float128_t x);\nfloat128_t cephes_f128_floorl(float128_t x);\nfloat128_t cephes_f128_frexpl( float128_t x, int *pw2 );\nint cephes_f128_isfinitel(float128_t x);\nint cephes_f128_isnanl(float128_t x);\nfloat128_t cephes_f128_ldexpl( float128_t x, int pw2 );\nfloat128_t cephes_f128_polevll( float128_t x, void *PP, int n );\nfloat128_t cephes_f128_p1evll( float128_t x, void *PP, int n );\nint cephes_f128_signbitl(float128_t x);\nfloat128_t cephes_f128_sinl(float128_t x);\nint mtherr( char *name, int code );\n\n/* Public symbol declarations */\nfloat128_t cephes_f128_log2l(float128_t x);\n"
  },
  {
    "path": "External/cephes/src/128bit/mtherr.c",
    "content": "/*\t\t\t\t\t\t\tmtherr.c\n *\n *\tLibrary common error handling routine\n *\n *\n *\n * SYNOPSIS:\n *\n * char *fctnam;\n * int code;\n * int mtherr();\n *\n * mtherr( fctnam, code );\n *\n *\n *\n * DESCRIPTION:\n *\n * This routine may be called to report one of the following\n * error conditions (in the include file mconf.h).\n *  \n *   Mnemonic        Value          Significance\n *\n *    DOMAIN            1       argument domain error\n *    SING              2       function singularity\n *    OVERFLOW          3       overflow range error\n *    UNDERFLOW         4       underflow range error\n *    TLOSS             5       total loss of precision\n *    PLOSS             6       partial loss of precision\n *    EDOM             33       Unix domain error code\n *    ERANGE           34       Unix range error code\n *\n * The default version of the file prints the function name,\n * passed to it by the pointer fctnam, followed by the\n * error condition.  The display is directed to the standard\n * output device.  The routine then returns to the calling\n * program.  Users may wish to modify the program to abort by\n * calling exit() under severe error conditions such as domain\n * errors.\n *\n * Since all error conditions pass control to this function,\n * the display may be easily changed, eliminated, or directed\n * to an error logging device.\n *\n * SEE ALSO:\n *\n * mconf.h\n *\n */\n\n/*\nCephes Math Library Release 2.0:  April, 1987\nCopyright 1984, 1987 by Stephen L. Moshier\nDirect inquiries to 30 Frost Street, Cambridge, MA 02140\n*/\n\n#include \"mconf.h\"\n\nint merror = 0;\n\nint mtherr( char *name, int code )\n{\n#if 0\n/* Display string passed by calling program,\n * which is supposed to be the name of the\n * function in which the error occurred:\n */\nprintf( \"\\n%s \", name );\n\n/* Set global error message word */\nmerror = code;\n\n/* Display error message defined\n * by the code argument.\n */\nif( (code <= 0) || (code >= 7) )\n\tcode = 0;\nprintf( \"%s error\\n\", ermsg[code] );\n\n#endif\n/* Return to calling\n * program\n */\nreturn( 0 );\n}\n"
  },
  {
    "path": "External/cephes/src/128bit/polevll.c",
    "content": "/*\t\t\t\t\t\t\tpolevll.c\n *\t\t\t\t\t\t\tp1evll.c\n *\n *\tEvaluate polynomial\n *\n *\n *\n * SYNOPSIS:\n *\n * int N;\n * float128_t x, y, coef[N+1], polevl[];\n *\n * y = polevll( x, coef, N );\n *\n *\n *\n * DESCRIPTION:\n *\n * Evaluates polynomial of degree N:\n *\n *                     2          N\n * y  =  C  + C x + C x  +...+ C x\n *        0    1     2          N\n *\n * Coefficients are stored in reverse order:\n *\n * coef[0] = C  , ..., coef[N] = C  .\n *            N                   0\n *\n *  The function p1evll() assumes that coef[N] = 1.0 and is\n * omitted from the array.  Its calling arguments are\n * otherwise the same as polevll().\n *\n *\n * SPEED:\n *\n * In the interest of speed, there are no checks for out\n * of bounds arithmetic.  This routine is used by most of\n * the functions in the library.  Depending on available\n * equipment features, the user may wish to rewrite the\n * program in microcode or assembly language.\n *\n */\n\f\n\n/*\nCephes Math Library Release 2.2:  July, 1992\nCopyright 1984, 1987, 1988, 1992 by Stephen L. Moshier\nDirect inquiries to 30 Frost Street, Cambridge, MA 02140\n*/\n#include \"mconf.h\"\n\n\n/* Polynomial evaluator:\n *  P[0] x^n  +  P[1] x^(n-1)  +  ...  +  P[n]\n */\nfloat128_t cephes_f128_polevll( float128_t x, void *PP, int n )\n{\n\nstruct softfloat_state state = {};\nregister float128_t y;\nfloat128_t *P;\n\nP = (float128_t *) PP;\ny = *P++;\ndo\n\t{\n\ty = f128_add(&state, f128_mul(&state, y, x), *P++);\n\t}\nwhile( --n );\nreturn(y);\n}\n\n\n\n/* Polynomial evaluator:\n *  x^n  +  P[0] x^(n-1)  +  P[1] x^(n-2)  +  ...  +  P[n]\n */\nfloat128_t cephes_f128_p1evll( float128_t x, void *PP, int n )\n{\nstruct softfloat_state state = {};\nregister float128_t y;\nfloat128_t *P;\n\nP = (float128_t *) PP;\nn -= 1;\ny = f128_add(&state, x, *P++);\ndo\n\t{\n\ty = f128_add(&state, f128_mul(&state, y, x), *P++);\n\t}\nwhile( --n );\nreturn( y );\n}\n"
  },
  {
    "path": "External/cephes/src/128bit/sinll.c",
    "content": "/*\t\t\t\t\t\t\tsinl.c\n *\n *\tCircular sine, float128_t precision\n *\n *\n *\n * SYNOPSIS:\n *\n * float128_t x, y, sinl();\n *\n * y = sinl( x );\n *\n *\n *\n * DESCRIPTION:\n *\n * Range reduction is into intervals of pi/4.  The reduction\n * error is nearly eliminated by contriving an extended precision\n * modular arithmetic.\n *\n * Two polynomial approximating functions are employed.\n * Between 0 and pi/4 the sine is approximated by the Cody\n * and Waite polynomial form\n *      x + x^3 P(x^2) .\n * Between pi/4 and pi/2 the cosine is represented as\n *      1 - .5 x^2 + x^4 Q(x^2) .\n *\n *\n * ACCURACY:\n *\n *                      Relative error:\n * arithmetic   domain      # trials      peak         rms\n *    IEEE     +-3.6e16      100,000    2.0e-34     5.3e-35\n *\n * ERROR MESSAGES:\n *\n *   message           condition        value returned\n * sin total loss      x > 2^55              0.0\n *\n */\n\f/*\t\t\t\t\t\t\tcosl.c\n *\n *\tCircular cosine, float128_t precision\n *\n *\n *\n * SYNOPSIS:\n *\n * float128_t x, y, cosl();\n *\n * y = cosl( x );\n *\n *\n *\n * DESCRIPTION:\n *\n * Range reduction is into intervals of pi/4.  The reduction\n * error is nearly eliminated by contriving an extended precision\n * modular arithmetic.\n *\n * Two polynomial approximating functions are employed.\n * Between 0 and pi/4 the cosine is approximated by\n *      1 - .5 x^2 + x^4 Q(x^2) .\n * Between pi/4 and pi/2 the sine is represented by the Cody\n * and Waite polynomial form\n *      x  +  x^3 P(x^2) .\n *\n *\n * ACCURACY:\n *\n *                      Relative error:\n * arithmetic   domain      # trials      peak         rms\n *    IEEE     +-3.6e16     100,000      2.0e-34     5.2e-35\n *\n * ERROR MESSAGES:\n *\n *   message           condition        value returned\n * cos total loss      x > 2^55              0.0\n */\n\f\n/*\t\t\t\t\t\t\tsin.c\t*/\n\n/*\nCephes Math Library Release 2.2:  December, 1990\nCopyright 1985, 1990 by Stephen L. Moshier\nDirect inquiries to 30 Frost Street, Cambridge, MA 02140\n*/\n\n#include \"mconf.h\"\n\n/* sin(x) = x + x^3 P(x^2)\n * Theoretical peak relative error = 5.6e-39\n * relative peak error spread = 1.7e-9\n */\n\nstatic float128_t sincof[12] = {\n{0x07424c0cc240ddd5ULL, 0x3fab3d6c15b6d187ULL}, // 6.410290407010279602425714995528976754871E-26L,\n{0x0f48760e659301d0ULL, 0xbfb47619a65f0be7ULL}, // -3.868105354403065333804959405965295962871E-23L,\n{0xcb791f8ea7c13184ULL, 0x3fbd71b8ee9a64e1ULL}, // 1.957294039628045847156851410307133941611E-20L,\n{0x0b420eabbeb9d9bcULL, 0xbfc62f49b467cdf7ULL}, // -8.220635246181818130416407184286068307901E-18L,\n{0x4be70cee4054eef9ULL, 0x3fce952c77030ab5ULL}, // 2.811457254345322887443598804951004537784E-15L,\n{0xe782874b38cbd281ULL, 0xbfd6ae7f3e733b81ULL}, // -7.647163731819815869711749952353081768709E-13L,\n{0x97c83627668fe57cULL, 0x3fde6124613a86d0ULL}, // 1.605904383682161459812515654720205050216E-10L,\n{0x38fe73eef2ec94cdULL, 0xbfe5ae64567f544eULL}, // -2.505210838544171877505034150892770940116E-8L,\n{0x38faac1c6f6fa52aULL, 0x3fec71de3a556c73ULL}, // 2.755731922398589065255731765498970284004E-6L,\n{0xa01a01a019fc52ccULL, 0xbff2a01a01a01a01ULL}, // -1.984126984126984126984126984045294307281E-4L,\n{0x1111111111111083ULL, 0x3ff8111111111111ULL}, // 8.333333333333333333333333333333119885283E-3L,\n{0x5555555555555555ULL, 0xbffc555555555555ULL}, // -1.666666666666666666666666666666666647199E-1L\n};\n/* cos(x) = 1 - .5 x^2 + x^2 (x^2 P(x^2))\n * Theoretical peak relative error = 2.1e-37,\n * relative peak error spread = 1.4e-8\n */\nstatic float128_t coscof[11] = {\n{0x86919a6fdf15a4b3ULL, 0x3fafefc8801eb0a1ULL}, // 1.601961934248327059668321782499768648351E-24L,\n{0x902367b3281c9510ULL, 0xbfb90ce245980e11ULL}, // -8.896621117922334603659240022184527001401E-22L,\n{0xcf5102d043ad399aULL, 0x3fc1e542b8eb4f0dULL}, // 4.110317451243694098169570731967589555498E-19L,\n{0xa8272970c73ab5ffULL, 0xbfca6827863b2960ULL}, // -1.561920696747074515985647487260202922160E-16L,\n{0xf9016edb75d1fb52ULL, 0x3fd2ae7f3e733b51ULL}, // 4.779477332386900932514186378501779328195E-14L,\n{0xc3e862188c1c1f15ULL, 0xbfda93974a8c07c9ULL}, // -1.147074559772972328629102981460088437917E-11L,\n{0x7b517ff3abf58399ULL, 0x3fe21eed8eff8d89ULL}, // 2.087675698786809897637922200570559726116E-9L,\n{0xc72eef5d4453f45cULL, 0xbfe927e4fb7789f5ULL}, // -2.755731922398589065255365968070684102298E-7L,\n{0xa01a019fdf56450dULL, 0x3fefa01a01a01a01ULL}, // 2.480158730158730158730158440896461945271E-5L,\n{0x6c16c16c16b76e10ULL, 0xbff56c16c16c16c1ULL}, // -1.388888888888888888888888888765724370132E-3L,\n{0x55555555555553fdULL, 0x3ffa555555555555ULL}, // 4.166666666666666666666666666666459301466E-2L\n};\n/*\nstatic float128_t DP1 = 7.853981554508209228515625E-1L;\nstatic float128_t DP2 =  7.94662735614792836713604629039764404296875E-9L;\nstatic float128_t DP3 = 3.0616169978683829430651648306875026455243736148E-17L;\nstatic float128_t lossth = 5.49755813888e11L;\n*/\nstatic float128_t DP1 =\n{0x8400000000000000ULL, 0x3ffe921fb54442d1ULL};\n //7.853981633974483067550664827649598009884357452392578125E-1L;\nstatic float128_t DP2 =\n{0xe000000000000000ULL, 0x3fc4a62633145c06ULL};\n //2.8605943630549158983813312792950660807511260829685741796657E-18L;\nstatic float128_t DP3 =\n{0xa67cc74020bbea64ULL, 0x3f8bcd129024e088ULL};\n //2.1679525325309452561992610065108379921905808E-35L;\n\nstatic const float128_t lossth =  {0x0000000000000000ULL, 0x4036000000000000ULL}; // 3.6028797018963968E16L; /* 2^55 */\nstatic const float128_t zero = {0, 0};\nstatic const float128_t one = {0, 0x3fff000000000000ULL};\n\nfloat128_t cephes_f128_sinl(float128_t x)\n{\nstruct softfloat_state state = {};\nfloat128_t y, z, zz;\nint j, sign;\n\n/* make argument positive but save the sign */\nsign = 1;\nif( f128_lt(&state, x, zero) )\n\t{\n\tx = f128_complement_sign(x);\n\tsign = -1;\n\t}\n\nif( f128_lt(&state, lossth, x))\n\t{\n\tmtherr( \"sinl\", TLOSS );\n\treturn zero;\n\t}\n\ny = cephes_f128_floorl( f128_div(&state, x, F128_PIO4L) ); /* integer part of x/PIO4 */\n\n/* strip high bits of integer part to prevent integer overflow */\nz = cephes_f128_ldexpl( y, -4 );\nz = cephes_f128_floorl(z);           /* integer part of y/8 */\nz = f128_sub(&state, y, cephes_f128_ldexpl( z, 4 ));  /* y - 16 * (y/16) */\n\nj = f128_to_i32(&state, z, softfloat_round_near_even, true); /* convert to integer for tests on the phase angle */\n/* map zeros to origin */\nif( j & 1 )\n\t{\n\tj += 1;\n\ty = f128_add(&state, y, one);\n\t}\nj = j & 07; /* octant modulo 360 degrees */\n/* reflect in x axis */\nif( j > 3)\n\t{\n\tsign = -sign;\n\tj -= 4;\n\t}\n\n/* Extended precision modular arithmetic */\n// z = ((x - y * DP1) - y * DP2) - y * DP3;\n {\n   float128_t tmp1 = f128_mul(&state, y, DP1);\n   float128_t tmp2 = f128_mul(&state, y, DP2);\n   float128_t tmp3 = f128_mul(&state, y, DP3);\n   float128_t tmp4 = f128_sub(&state, x, tmp1);\n   float128_t tmp5 = f128_sub(&state, tmp4, tmp2);\n   z = f128_sub(&state, tmp5, tmp3);\n }\n\nz = f128_sub(&state, f128_sub(&state, f128_sub(&state, x, f128_mul(&state, y, DP1)), f128_mul(&state, y, DP2)), f128_mul(&state, y, DP3));\n\nzz = f128_mul(&state, z, z);\nif( (j==1) || (j==2) )\n\t{\n  // y = 1.0L - ldexpl(zz,-1) + zz * zz * polevll( zz, coscof, 10 );\n  float128_t tmp1 = f128_mul(&state, zz, zz);\n  float128_t tmp2 = f128_mul(&state, tmp1, cephes_f128_polevll( zz, coscof, 10 ));\n  float128_t tmp3 = f128_sub(&state, one, cephes_f128_ldexpl(zz,-1));\n  y = f128_add(&state, tmp3, tmp2);\n\t}\nelse\n\t{\n  // y = z  +  z * (zz * polevll( zz, sincof, 11 ));\n  float128_t tmp1 = f128_mul(&state, zz, cephes_f128_polevll( zz, sincof, 11 ));\n  float128_t tmp2 = f128_mul(&state, z, tmp1);\n  y = f128_add(&state, z, tmp2);\n\t}\n\nif(sign < 0)\n\ty = f128_complement_sign(y);\n\nreturn(y);\n}\n\n\n\n\n\nfloat128_t cephes_f128_cosl(float128_t x)\n{\nstruct softfloat_state state = {};\nfloat128_t y, z, zz;\nlong i;\nint j, sign;\n\n/* make argument positive */\nsign = 1;\nif( f128_lt(&state, x, zero) )\n\tx = f128_complement_sign(x);\n\n\nif( f128_lt(&state, lossth, x))\n\t{\n\tmtherr( \"cosl\", TLOSS );\n\treturn zero;\n\t}\n\ny = cephes_f128_floorl( f128_div(&state, x, F128_PIO4L));\nz = cephes_f128_ldexpl( y, -4 );\nz = cephes_f128_floorl(z);\t\t/* integer part of y/8 */\nz = f128_sub(&state, y, cephes_f128_ldexpl( z, 4 ));  /* y - 16 * (y/16) */\n\n/* integer and fractional part modulo one octant */\ni = f128_to_i32(&state, z, softfloat_round_near_even, true);\nif( i & 1 )\t/* map zeros to origin */\n\t{\n\ti += 1;\n\ty = f128_add(&state, y, one);\n\t}\nj = i & 07;\nif( j > 3)\n\t{\n\tj -=4;\n\tsign = -sign;\n\t}\n\nif( j > 1 )\n\tsign = -sign;\n\n/* Extended precision modular arithmetic */\n// z = ((x - y * DP1) - y * DP2) - y * DP3;\n {\n   float128_t tmp1 = f128_mul(&state, y, DP1);\n   float128_t tmp2 = f128_mul(&state, y, DP2);\n   float128_t tmp3 = f128_mul(&state, y, DP3);\n   float128_t tmp4 = f128_sub(&state, x, tmp1);\n   float128_t tmp5 = f128_sub(&state, tmp4, tmp2);\n   z = f128_sub(&state, tmp5, tmp3);\n }\n\nzz = f128_mul(&state, z, z);\nif( (j==1) || (j==2) )\n\t{\n    // y = z  +  z * (zz * polevll( zz, sincof, 11 ));\n    float128_t tmp1 = f128_mul(&state, zz, cephes_f128_polevll( zz, sincof, 11 ));\n    float128_t tmp2 = f128_mul(&state, z, tmp1);\n    y = f128_add(&state, z, tmp2);\n\t}\nelse\n\t{\n    // y = 1.0L - ldexpl(zz,-1) + zz * zz * polevll( zz, coscof, 10 );\n    float128_t tmp1 = f128_mul(&state, zz, zz);\n    float128_t tmp2 = f128_mul(&state, tmp1, cephes_f128_polevll( zz, coscof, 10 ));\n    float128_t tmp3 = f128_sub(&state, one, cephes_f128_ldexpl(zz,-1));\n    y = f128_add(&state, tmp3, tmp2);\n\t}\n\nif(sign < 0)\n\ty = f128_complement_sign(y);\n\nreturn(y);\n}\n"
  },
  {
    "path": "External/cephes/src/128bit/tanll.c",
    "content": "/*\t\t\t\t\t\t\ttanl.c\n *\n *\tCircular tangent, 128-bit float128_t precision\n *\n *\n *\n * SYNOPSIS:\n *\n * float128_t x, y, tanl();\n *\n * y = tanl( x );\n *\n *\n *\n * DESCRIPTION:\n *\n * Returns the circular tangent of the radian argument x.\n *\n * Range reduction is modulo pi/4.  A rational function\n *       x + x**3 P(x**2)/Q(x**2)\n * is employed in the basic interval [0, pi/4].\n *\n *\n *\n * ACCURACY:\n *\n *                      Relative error:\n * arithmetic   domain     # trials      peak         rms\n *    IEEE     +-3.6e16    100,000      3.0e-34      7.2e-35\n *\n * ERROR MESSAGES:\n *\n *   message         condition          value returned\n * tan total loss   x > 2^55                0.0\n *\n */\n\f/*\t\t\t\t\t\t\tcotl.c\n *\n *\tCircular cotangent, float128_t precision\n *\n *\n *\n * SYNOPSIS:\n *\n * float128_t x, y, cotl();\n *\n * y = cotl( x );\n *\n *\n *\n * DESCRIPTION:\n *\n * Returns the circular cotangent of the radian argument x.\n *\n * Range reduction is modulo pi/4.  A rational function\n *       x + x**3 P(x**2)/Q(x**2)\n * is employed in the basic interval [0, pi/4].\n *\n *\n *\n * ACCURACY:\n *\n *                      Relative error:\n * arithmetic   domain     # trials      peak         rms\n *    IEEE     +-3.6e16    100,000      2.9e-34     7.2e-35\n *\n *\n * ERROR MESSAGES:\n *\n *   message         condition          value returned\n * cot total loss   x > 2^55                0.0\n * cot singularity  x = 0                  MAXNUM\n *\n */\n\f\n/*\nCephes Math Library Release 2.2:  December, 1990\nCopyright 1984, 1990 by Stephen L. Moshier\nDirect inquiries to 30 Frost Street, Cambridge, MA 02140\n*/\n\n#include \"mconf.h\"\n\n/* tan(x) = x + x^3 P(x^2)\n * 0 <= |x| <= pi/4\n * Theoretical peak relative error = 4.3e-38\n * relative peak error spread = 6.1e-11\n */\nstatic float128_t P[6] = {\n {0x09978dc7ae2a2f4bULL, 0xbffefa5d486820e2ULL}, // -9.889929415807650724957118893791829849557E-1L,\n {0x52a017b1ca7c4799ULL, 0x40093e130edd1294ULL}, // 1.272297782199996882828849455156962260810E3L,\n {0x8857161b398b3c53ULL, 0xc0119f024bdcc6c3ULL}, // -4.249691853501233575668486667664718192660E5L,\n {0xcc299261a6616b83ULL, 0x401889b0ed404622ULL}, // 5.160188250214037865511600561074819366815E7L,\n {0x37d9311de4cdbf04ULL, 0xc01e1304fe4d6331ULL}, // -2.307030822693734879744223131873392503321E9L,\n {0x6e9f0eac6b638a9aULL, 0x4021ada98af62f83ULL}, // 2.883414728874239697964612246732416606301E10L\n};\nstatic float128_t Q[6] = {\n/* 1.000000000000000000000000000000000000000E0L, */\n {0xeb01d728f7d3bb04ULL, 0xc009494f98d3c1caULL}, // -1.317243702830553658702531997959756728291E3L,\n {0xcdd312b4ac46a6cdULL, 0x4011ba538d331a98ULL}, // 4.529422062441341616231663543669583527923E5L,\n {0x2a1a6372eebd73a1ULL, 0xc018b57281a9f10bULL}, // -5.733709132766856723608447733926138506824E7L,\n {0x3e9defb0e348fbe5ULL, 0x401e48d6025d9b41ULL}, // 2.758476078803232151774723646710890525496E9L,\n {0x7cd82869db5580d1ULL, 0xc022355d0fdbd24eULL}, // -4.152206921457208101480801635640958361612E10L,\n {0x92f74b01508aa7f3ULL, 0x4023423f2838a3a2ULL}, // 8.650244186622719093893836740197250197602E10L\n};\n\nstatic float128_t DP1 =\n{0x8400000000000000ULL, 0x3ffe921fb54442d1ULL};\n //7.853981633974483067550664827649598009884357452392578125E-1L;\nstatic float128_t DP2 =\n{0xe000000000000000ULL, 0x3fc4a62633145c06ULL};\n //2.8605943630549158983813312792950660807511260829685741796657E-18L;\nstatic float128_t DP3 =\n{0xa67cc74020bbea64ULL, 0x3f8bcd129024e088ULL};\n // 2.1679525325309452561992610065108379921905808E-35L;\n\nstatic const float128_t lossth =  {0x0000000000000000ULL, 0x4036000000000000ULL}; // 3.6028797018963968E16L; /* 2^55 */\n\nstatic const float128_t zero = {0, 0};\nstatic const float128_t one = {0, 0x3fff000000000000ULL};\nstatic const float128_t neg_one = {0, 0xbfff000000000000ULL};\n\nstatic const float128_t max_quad = {0x35d511e976394d7aULL, 0x3fbc79ca10c92422ULL};\n\nstatic float128_t tancotl( struct softfloat_state *state, float128_t xx, int cotflg );\n\nfloat128_t cephes_f128_tanl(float128_t x)\n{\nstruct softfloat_state state = {};\nreturn( tancotl(&state, x,0) );\n}\n\n\nfloat128_t cotl(float128_t x)\n{\nstruct softfloat_state state = {};\n\nif( f128_eq(&state, x, zero) )\n\t{\n\tmtherr( \"cotl\", SING );\n\treturn( F128_MAXNUML );\n\t}\nreturn( tancotl(&state, x,1) );\n}\n\n\nstatic float128_t tancotl( struct softfloat_state *state, float128_t xx, int cotflg )\n{\nfloat128_t x, y, z, zz;\nint j, sign;\n\n/* make argument positive but save the sign */\n// if (xx < 0.0L)\nif( f128_lt(state, xx, zero) )\n\t{\n\tx = f128_sub(state, zero, xx);\n\tsign = -1;\n\t}\nelse\n\t{\n\tx = xx;\n\tsign = 1;\n\t}\n\n//if (x > lossth)\nif (f128_lt(state, lossth, x))\n\t{\n\tif( cotflg )\n\t\tmtherr( \"cotl\", TLOSS );\n\telse\n\t\tmtherr( \"tanl\", TLOSS );\n\treturn zero;\n\t}\n\n/* compute x mod PIO4 */\ny = cephes_f128_floorl( f128_div(state, x, F128_PIO4L));\n\n/* strip high bits of integer part */\nz = cephes_f128_ldexpl( y, -4 );\nz = cephes_f128_floorl(z);\t\t/* integer part of y/16 */\nz = f128_sub(state, y, cephes_f128_ldexpl( z, 4 ));  /* y - 16 * (y/16) */\n\n/* integer and fractional part modulo one octant */\nj = f128_to_i32(state, z, softfloat_round_near_even, true);\n\n/* map zeros and singularities to origin */\nif( j & 1 )\n\t{\n\tj += 1;\n\ty = f128_add(state, y, one);\n\t}\n\nz = f128_sub(state, f128_sub(state, f128_sub(state, x, f128_mul(state, y, DP1)), f128_mul(state, y, DP2)), f128_mul(state, y, DP3));\n\nzz = f128_mul(state, z, z);\n\n// if( zz > 1.0e-20L )\nif (f128_lt(state, max_quad, zz))\n{\n\ty = f128_add(state, z, f128_mul(state, z, f128_div(state, f128_mul(state, zz, cephes_f128_polevll( zz, P, 5 )), cephes_f128_p1evll(zz, Q, 6))));\n}\nelse\n{\n\ty = z;\n}\n\t\nif( j & 2 )\n\t{\n\tif( cotflg )\n    y = f128_complement_sign(y);\n\telse\n\t\ty = f128_div(state, neg_one, y);\n\t}\nelse\n\t{\n\tif( cotflg )\n\t\ty = f128_div(state, one, y);\n\t}\n\nif( sign < 0 )\n  y = f128_complement_sign(y);\n\nreturn( y );\n}\n"
  },
  {
    "path": "External/code-format-helper/code-format-helper.py",
    "content": "#!/usr/bin/env python3\n#\n# ====- code-format-helper, runs code formatters from the ci or in a hook --*- python -*--==#\n#\n# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.\n# See https://llvm.org/LICENSE.txt for license information.\n# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception\n#\n# ==--------------------------------------------------------------------------------------==#\n\nimport argparse\nimport os\nimport subprocess\nimport sys\nfrom typing import List, Optional\n\n\"\"\"\nThis script is run by GitHub actions to ensure that the code in PR's conform to\nthe coding style of LLVM. It can also be installed as a pre-commit git hook to\ncheck the coding style before submitting it. The canonical source of this script\nis in the LLVM source tree under llvm/utils/git.\n\nFor C/C++ code it uses clang-format.\n\nYou can learn more about the LLVM coding style on llvm.org:\nhttps://llvm.org/docs/CodingStandards.html\n\nYou can install this script as a git hook by symlinking it to the .git/hooks\ndirectory:\n\nln -s $(pwd)/llvm/utils/git/code-format-helper.py .git/hooks/pre-commit\n\nYou can control the exact path to clang-format with the following\nenvironment variable: $CLANG_FORMAT_PATH.\n\"\"\"\n\n\nclass FormatArgs:\n    start_rev: str = None\n    end_rev: str = None\n    repo: str = None\n    changed_files: List[str] = []\n    token: str = None\n    verbose: bool = True\n    issue_number: int = 0\n    write_comment_to_file: str = None\n\n    def __init__(self, args: argparse.Namespace = None) -> None:\n        if not args is None:\n            self.start_rev = args.start_rev\n            self.end_rev = args.end_rev\n            self.repo = args.repo\n            self.token = args.token\n            self.changed_files = args.changed_files\n            self.issue_number = args.issue_number\n            self.write_comment_to_file = args.write_comment_to_file\n\n\nclass FormatHelper:\n    COMMENT_TAG = \"<!--CODE FORMAT COMMENT: {fmt}-->\"\n    name: str\n    friendly_name: str\n    comment: dict = None\n\n    @property\n    def comment_tag(self) -> str:\n        return self.COMMENT_TAG.replace(\"fmt\", self.name)\n\n    @property\n    def instructions(self) -> str:\n        raise NotImplementedError()\n\n    def has_tool(self) -> bool:\n        raise NotImplementedError()\n\n    def format_run(self, changed_files: List[str], args: FormatArgs) -> Optional[str]:\n        raise NotImplementedError()\n\n    def pr_comment_text_for_diff(self, diff: str) -> str:\n        return f\"\"\"\n:warning: {self.friendly_name}, {self.name} found issues in your code. :warning:\n\n<details>\n<summary>\nYou can test this locally with the following command:\n</summary>\n\n``````````bash\n{self.instructions}\n``````````\n\n</details>\n\n<details>\n<summary>\nView the diff from {self.name} here.\n</summary>\n\n``````````diff\n{diff}\n``````````\n\n</details>\n\"\"\"\n\n    # TODO: any type should be replaced with the correct github type, but it requires refactoring to\n    # not require the github module to be installed everywhere.\n    def find_comment(self, pr: any) -> any:\n        for comment in pr.as_issue().get_comments():\n            if self.comment_tag in comment.body:\n                return comment\n        return None\n\n    def update_pr(self, comment_text: str, args: FormatArgs, create_new: bool) -> None:\n        import github\n        from github import IssueComment, PullRequest\n\n        repo = github.Github(args.token).get_repo(args.repo)\n        pr = repo.get_issue(args.issue_number).as_pull_request()\n\n        comment_text = self.comment_tag + \"\\n\\n\" + comment_text\n\n        existing_comment = self.find_comment(pr)\n\n        if args.write_comment_to_file:\n            if create_new or existing_comment:\n                self.comment = {\"body\": comment_text}\n            if existing_comment:\n                self.comment[\"id\"] = existing_comment.id\n            return\n\n        if existing_comment:\n            existing_comment.edit(comment_text)\n        elif create_new:\n            pr.as_issue().create_comment(comment_text)\n\n    def run(self, changed_files: List[str], args: FormatArgs) -> bool:\n        changed_files = [arg for arg in changed_files if \"third-party\" not in arg]\n        diff = self.format_run(changed_files, args)\n        should_update_gh = args.token is not None and args.repo is not None\n\n        if diff is None:\n            if should_update_gh:\n                comment_text = (\n                    \":white_check_mark: With the latest revision \"\n                    f\"this PR passed the {self.friendly_name}.\"\n                )\n                self.update_pr(comment_text, args, create_new=False)\n            return True\n        elif len(diff) > 0:\n            if should_update_gh:\n                comment_text = self.pr_comment_text_for_diff(diff)\n                self.update_pr(comment_text, args, create_new=True)\n            else:\n                print(\n                    f\"Warning: {self.friendly_name}, {self.name} detected \"\n                    \"some issues with your code formatting...\"\n                )\n            return False\n        else:\n            # The formatter failed but didn't output a diff (e.g. some sort of\n            # infrastructure failure).\n            comment_text = (\n                f\":warning: The {self.friendly_name} failed without printing \"\n                \"a diff. Check the logs for stderr output. :warning:\"\n            )\n            self.update_pr(comment_text, args, create_new=False)\n            return False\n\n\nclass ClangFormatHelper(FormatHelper):\n    name = \"git-clang-format\"\n    friendly_name = \"C/C++ code formatter\"\n\n\n    @property\n    def instructions(self) -> str:\n        return \" \".join(self.cf_cmd)\n\n    def should_include_extensionless_file(self, path: str) -> bool:\n        return path.startswith(\"libcxx/include\")\n\n    def filter_changed_files(self, changed_files: List[str]) -> List[str]:\n        filtered_files = []\n        for path in changed_files:\n            _, ext = os.path.splitext(path)\n            if ext in (\".cpp\", \".c\", \".h\", \".hpp\", \".hxx\", \".cxx\", \".inc\", \".cppm\"):\n                filtered_files.append(path)\n            elif ext == \"\" and self.should_include_extensionless_file(path):\n                filtered_files.append(path)\n        return filtered_files\n\n    @property\n    def clang_fmt_path(self) -> str:\n        if \"CLANG_FORMAT_PATH\" in os.environ:\n            return os.environ[\"CLANG_FORMAT_PATH\"]\n        return \"git-clang-format-19\"\n\n    def has_tool(self) -> bool:\n        cmd = [self.clang_fmt_path, \"-h\"]\n        proc = None\n        try:\n            proc = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n        except:\n            return False\n        return proc.returncode == 0\n\n    def format_run(self, changed_files: List[str], args: FormatArgs) -> Optional[str]:\n        cpp_files = self.filter_changed_files(changed_files)\n        if not cpp_files:\n            return None\n\n        cf_cmd = [\n            self.clang_fmt_path,\n            \"--binary=clang-format-19\",\n            \"--diff\",\n        ]\n\n        if args.start_rev and args.end_rev:\n            cf_cmd.append(args.start_rev)\n            cf_cmd.append(args.end_rev)\n\n        cf_cmd.append(\"--\")\n        cf_cmd += cpp_files\n\n        if args.verbose:\n            print(f\"Running: {' '.join(cf_cmd)}\")\n        self.cf_cmd = cf_cmd\n        proc = subprocess.run(cf_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n        sys.stdout.write(proc.stderr.decode(\"utf-8\"))\n\n        if proc.returncode != 0:\n            # formatting needed, or the command otherwise failed\n            if args.verbose:\n                print(f\"error: {self.name} exited with code {proc.returncode}\")\n                # Print the diff in the log so that it is viewable there\n                print(proc.stdout.decode(\"utf-8\"))\n            return proc.stdout.decode(\"utf-8\")\n        else:\n            return None\n\nALL_FORMATTERS = [ClangFormatHelper()]\n\ndef hook_main():\n    # fill out args\n    args = FormatArgs()\n    args.verbose = False\n\n    # find the changed files\n    cmd = [\"git\", \"diff\", \"--cached\", \"--name-only\", \"--diff-filter=d\"]\n    proc = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n    output = proc.stdout.decode(\"utf-8\")\n    for line in output.splitlines():\n        args.changed_files.append(line)\n\n    failed_fmts = []\n    for fmt in ALL_FORMATTERS:\n        if fmt.has_tool():\n            if not fmt.run(args.changed_files, args):\n                failed_fmts.append(fmt.name)\n            if fmt.comment:\n                comments.append(fmt.comment)\n        else:\n            print(f\"Couldn't find {fmt.name}, can't check \" + fmt.friendly_name.lower())\n\n    if len(failed_fmts) > 0:\n        sys.exit(1)\n\n    sys.exit(0)\n\n\nif __name__ == \"__main__\":\n    script_path = os.path.abspath(__file__)\n    if \".git/hooks\" in script_path:\n        hook_main()\n        sys.exit(0)\n\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\n        \"--token\", type=str, required=False, help=\"GitHub authentication token\"\n    )\n    parser.add_argument(\n        \"--repo\",\n        type=str,\n        default=os.getenv(\"GITHUB_REPOSITORY\", \"llvm/llvm-project\"),\n        help=\"The GitHub repository that we are working with in the form of <owner>/<repo> (e.g. llvm/llvm-project)\",\n    )\n    parser.add_argument(\"--issue-number\", type=int, required=True)\n    parser.add_argument(\n        \"--start-rev\",\n        type=str,\n        required=True,\n        help=\"Compute changes from this revision.\",\n    )\n    parser.add_argument(\n        \"--end-rev\", type=str, required=True, help=\"Compute changes to this revision\"\n    )\n    parser.add_argument(\n        \"--changed-files\",\n        type=str,\n        help=\"Comma separated list of files that has been changed\",\n    )\n    parser.add_argument(\n        \"--write-comment-to-file\",\n        type=str,\n        help=\"Don't post comments on the PR, instead write the comments and metadata a file\",\n    )\n\n    args = FormatArgs(parser.parse_args())\n\n    changed_files = []\n    if args.changed_files:\n        changed_files = args.changed_files.split(\",\")\n\n    failed_formatters = []\n    comments = []\n    for fmt in ALL_FORMATTERS:\n        if not fmt.run(changed_files, args):\n            failed_formatters.append(fmt.name)\n        if fmt.comment:\n            comments.append(fmt.comment)\n\n    if len(comments):\n        with open(args.write_comment_to_file, \"w\") as f:\n            import json\n\n            json.dump(comments, f)\n\n    if len(failed_formatters) > 0:\n        print(f\"error: some formatters failed: {' '.join(failed_formatters)}\")\n        sys.exit(1)\n"
  },
  {
    "path": "External/code-format-helper/requirements_formatting.txt",
    "content": "#\n# This file is autogenerated by pip-compile with Python 3.13\n# by the following command:\n#\n#    pip-compile --generate-hashes --output-file=requirements_formatting.txt --strip-extras requirements_formatting.txt.in\n#\nblack==26.3.1 \\\n    --hash=sha256:0126ae5b7c09957da2bdbd91a9ba1207453feada9e9fe51992848658c6c8e01c \\\n    --hash=sha256:0f76ff19ec5297dd8e66eb64deda23631e642c9393ab592826fd4bdc97a4bce7 \\\n    --hash=sha256:28ef38aee69e4b12fda8dba75e21f9b4f979b490c8ac0baa7cb505369ac9e1ff \\\n    --hash=sha256:2bd5aa94fc267d38bb21a70d7410a89f1a1d318841855f698746f8e7f51acd1b \\\n    --hash=sha256:2c50f5063a9641c7eed7795014ba37b0f5fa227f3d408b968936e24bc0566b07 \\\n    --hash=sha256:2d6bfaf7fd0993b420bed691f20f9492d53ce9a2bcccea4b797d34e947318a78 \\\n    --hash=sha256:41cd2012d35b47d589cb8a16faf8a32ef7a336f56356babd9fcf70939ad1897f \\\n    --hash=sha256:474c27574d6d7037c1bc875a81d9be0a9a4f9ee95e62800dab3cfaadbf75acd5 \\\n    --hash=sha256:5602bdb96d52d2d0672f24f6ffe5218795736dd34807fd0fd55ccd6bf206168b \\\n    --hash=sha256:5e9d0d86df21f2e1677cc4bd090cd0e446278bcbbe49bf3659c308c3e402843e \\\n    --hash=sha256:5ed0ca58586c8d9a487352a96b15272b7fa55d139fc8496b519e78023a8dab0a \\\n    --hash=sha256:6c54a4a82e291a1fee5137371ab488866b7c86a3305af4026bdd4dc78642e1ac \\\n    --hash=sha256:6e131579c243c98f35bce64a7e08e87fb2d610544754675d4a0e73a070a5aa3a \\\n    --hash=sha256:855822d90f884905362f602880ed8b5df1b7e3ee7d0db2502d4388a954cc8c54 \\\n    --hash=sha256:86a8b5035fce64f5dcd1b794cf8ec4d31fe458cf6ce3986a30deb434df82a1d2 \\\n    --hash=sha256:8a33d657f3276328ce00e4d37fe70361e1ec7614da5d7b6e78de5426cb56332f \\\n    --hash=sha256:92c0ec1f2cc149551a2b7b47efc32c866406b6891b0ee4625e95967c8f4acfb1 \\\n    --hash=sha256:9a5e9f45e5d5e1c5b5c29b3bd4265dcc90e8b92cf4534520896ed77f791f4da5 \\\n    --hash=sha256:afc622538b430aa4c8c853f7f63bc582b3b8030fd8c80b70fb5fa5b834e575c2 \\\n    --hash=sha256:b07fc0dab849d24a80a29cfab8d8a19187d1c4685d8a5e6385a5ce323c1f015f \\\n    --hash=sha256:b5e6f89631eb88a7302d416594a32faeee9fb8fb848290da9d0a5f2903519fc1 \\\n    --hash=sha256:bf9bf162ed91a26f1adba8efda0b573bc6924ec1408a52cc6f82cb73ec2b142c \\\n    --hash=sha256:c7e72339f841b5a237ff14f7d3880ddd0fc7f98a1199e8c4327f9a4f478c1839 \\\n    --hash=sha256:ddb113db38838eb9f043623ba274cfaf7d51d5b0c22ecb30afe58b1bb8322983 \\\n    --hash=sha256:dfdd51fc3e64ea4f35873d1b3fb25326773d55d2329ff8449139ebaad7357efb \\\n    --hash=sha256:f1cd08e99d2f9317292a311dfe578fd2a24b15dbce97792f9c4d752275c1fa56 \\\n    --hash=sha256:f89f2ab047c76a9c03f78d0d66ca519e389519902fa27e7a91117ef7611c0568\n    # via\n    #   -r requirements_formatting.txt.in\n    #   darker\ncertifi==2025.7.14 \\\n    --hash=sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2 \\\n    --hash=sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995\n    # via\n    #   -r requirements_formatting.txt.in\n    #   requests\ncffi==2.0.0 \\\n    --hash=sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb \\\n    --hash=sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b \\\n    --hash=sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f \\\n    --hash=sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9 \\\n    --hash=sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44 \\\n    --hash=sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2 \\\n    --hash=sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c \\\n    --hash=sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75 \\\n    --hash=sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65 \\\n    --hash=sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e \\\n    --hash=sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a \\\n    --hash=sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e \\\n    --hash=sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25 \\\n    --hash=sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a \\\n    --hash=sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe \\\n    --hash=sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b \\\n    --hash=sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91 \\\n    --hash=sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592 \\\n    --hash=sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187 \\\n    --hash=sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c \\\n    --hash=sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1 \\\n    --hash=sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94 \\\n    --hash=sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba \\\n    --hash=sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb \\\n    --hash=sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165 \\\n    --hash=sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529 \\\n    --hash=sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca \\\n    --hash=sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c \\\n    --hash=sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6 \\\n    --hash=sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c \\\n    --hash=sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0 \\\n    --hash=sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743 \\\n    --hash=sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63 \\\n    --hash=sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5 \\\n    --hash=sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5 \\\n    --hash=sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4 \\\n    --hash=sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d \\\n    --hash=sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b \\\n    --hash=sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93 \\\n    --hash=sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205 \\\n    --hash=sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27 \\\n    --hash=sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512 \\\n    --hash=sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d \\\n    --hash=sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c \\\n    --hash=sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037 \\\n    --hash=sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26 \\\n    --hash=sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322 \\\n    --hash=sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb \\\n    --hash=sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c \\\n    --hash=sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8 \\\n    --hash=sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4 \\\n    --hash=sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414 \\\n    --hash=sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9 \\\n    --hash=sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664 \\\n    --hash=sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9 \\\n    --hash=sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775 \\\n    --hash=sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739 \\\n    --hash=sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc \\\n    --hash=sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062 \\\n    --hash=sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe \\\n    --hash=sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9 \\\n    --hash=sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92 \\\n    --hash=sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5 \\\n    --hash=sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13 \\\n    --hash=sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d \\\n    --hash=sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26 \\\n    --hash=sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f \\\n    --hash=sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495 \\\n    --hash=sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b \\\n    --hash=sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6 \\\n    --hash=sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c \\\n    --hash=sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef \\\n    --hash=sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5 \\\n    --hash=sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18 \\\n    --hash=sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad \\\n    --hash=sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3 \\\n    --hash=sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7 \\\n    --hash=sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5 \\\n    --hash=sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534 \\\n    --hash=sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49 \\\n    --hash=sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2 \\\n    --hash=sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5 \\\n    --hash=sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453 \\\n    --hash=sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf\n    # via\n    #   cryptography\n    #   pynacl\ncharset-normalizer==3.2.0 \\\n    --hash=sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96 \\\n    --hash=sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c \\\n    --hash=sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710 \\\n    --hash=sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706 \\\n    --hash=sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020 \\\n    --hash=sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252 \\\n    --hash=sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad \\\n    --hash=sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329 \\\n    --hash=sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a \\\n    --hash=sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f \\\n    --hash=sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6 \\\n    --hash=sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4 \\\n    --hash=sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a \\\n    --hash=sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46 \\\n    --hash=sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2 \\\n    --hash=sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23 \\\n    --hash=sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace \\\n    --hash=sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd \\\n    --hash=sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982 \\\n    --hash=sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10 \\\n    --hash=sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2 \\\n    --hash=sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea \\\n    --hash=sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09 \\\n    --hash=sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5 \\\n    --hash=sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149 \\\n    --hash=sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489 \\\n    --hash=sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9 \\\n    --hash=sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80 \\\n    --hash=sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592 \\\n    --hash=sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3 \\\n    --hash=sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6 \\\n    --hash=sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed \\\n    --hash=sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c \\\n    --hash=sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200 \\\n    --hash=sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a \\\n    --hash=sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e \\\n    --hash=sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d \\\n    --hash=sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6 \\\n    --hash=sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623 \\\n    --hash=sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669 \\\n    --hash=sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3 \\\n    --hash=sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa \\\n    --hash=sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9 \\\n    --hash=sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2 \\\n    --hash=sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f \\\n    --hash=sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1 \\\n    --hash=sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4 \\\n    --hash=sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a \\\n    --hash=sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8 \\\n    --hash=sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3 \\\n    --hash=sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029 \\\n    --hash=sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f \\\n    --hash=sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959 \\\n    --hash=sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22 \\\n    --hash=sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7 \\\n    --hash=sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952 \\\n    --hash=sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346 \\\n    --hash=sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e \\\n    --hash=sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d \\\n    --hash=sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299 \\\n    --hash=sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd \\\n    --hash=sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a \\\n    --hash=sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3 \\\n    --hash=sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037 \\\n    --hash=sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94 \\\n    --hash=sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c \\\n    --hash=sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858 \\\n    --hash=sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a \\\n    --hash=sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449 \\\n    --hash=sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c \\\n    --hash=sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918 \\\n    --hash=sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1 \\\n    --hash=sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c \\\n    --hash=sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac \\\n    --hash=sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa\n    # via requests\nclick==8.1.7 \\\n    --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \\\n    --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de\n    # via black\ncryptography==46.0.5 \\\n    --hash=sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72 \\\n    --hash=sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235 \\\n    --hash=sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9 \\\n    --hash=sha256:2ae6971afd6246710480e3f15824ed3029a60fc16991db250034efd0b9fb4356 \\\n    --hash=sha256:2b7a67c9cd56372f3249b39699f2ad479f6991e62ea15800973b956f4b73e257 \\\n    --hash=sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad \\\n    --hash=sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4 \\\n    --hash=sha256:3b4995dc971c9fb83c25aa44cf45f02ba86f71ee600d81091c2f0cbae116b06c \\\n    --hash=sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614 \\\n    --hash=sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed \\\n    --hash=sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31 \\\n    --hash=sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229 \\\n    --hash=sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0 \\\n    --hash=sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731 \\\n    --hash=sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b \\\n    --hash=sha256:4d8ae8659ab18c65ced284993c2265910f6c9e650189d4e3f68445ef82a810e4 \\\n    --hash=sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4 \\\n    --hash=sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263 \\\n    --hash=sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595 \\\n    --hash=sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1 \\\n    --hash=sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678 \\\n    --hash=sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48 \\\n    --hash=sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76 \\\n    --hash=sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0 \\\n    --hash=sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18 \\\n    --hash=sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d \\\n    --hash=sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d \\\n    --hash=sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1 \\\n    --hash=sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981 \\\n    --hash=sha256:8456928655f856c6e1533ff59d5be76578a7157224dbd9ce6872f25055ab9ab7 \\\n    --hash=sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82 \\\n    --hash=sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2 \\\n    --hash=sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4 \\\n    --hash=sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663 \\\n    --hash=sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c \\\n    --hash=sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d \\\n    --hash=sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a \\\n    --hash=sha256:bc84e875994c3b445871ea7181d424588171efec3e185dced958dad9e001950a \\\n    --hash=sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d \\\n    --hash=sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b \\\n    --hash=sha256:c3bcce8521d785d510b2aad26ae2c966092b7daa8f45dd8f44734a104dc0bc1a \\\n    --hash=sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826 \\\n    --hash=sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee \\\n    --hash=sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9 \\\n    --hash=sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648 \\\n    --hash=sha256:d861ee9e76ace6cf36a6a89b959ec08e7bc2493ee39d07ffe5acb23ef46d27da \\\n    --hash=sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2 \\\n    --hash=sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2 \\\n    --hash=sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87\n    # via\n    #   -r requirements_formatting.txt.in\n    #   pyjwt\ndarker==2.1.1 \\\n    --hash=sha256:a6e6a682c0604e76fe9aec7650e96a944f517563c69b28fcc076db9d957d98ea \\\n    --hash=sha256:ead701414c45359fc0312bc285614d3285fc135476d43f3bc08d989ee19d9020\n    # via -r requirements_formatting.txt.in\ndarkgraylib==1.2.1 \\\n    --hash=sha256:60c59de69842367ce0c78c32c451fa8e9d29500e681312d9864a7416bcdb7792 \\\n    --hash=sha256:a5dd6a2015a470d9047278cdd01a91ccb1d746675f8fd4562b3b5f6b8cbda930\n    # via\n    #   darker\n    #   graylint\ndeprecated==1.2.14 \\\n    --hash=sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c \\\n    --hash=sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3\n    # via pygithub\ngraylint==1.1.1 \\\n    --hash=sha256:0fd8e02972ca03d0ef2bf0adea76b5343efcd492d7afb5f658f3e3a724f55a36 \\\n    --hash=sha256:b7e0eab6c159684dbf5ef84e942c3340f6a6549b02a3d11b1a1763cc4f8f0593\n    # via darker\nidna==3.10 \\\n    --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \\\n    --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3\n    # via\n    #   -r requirements_formatting.txt.in\n    #   requests\nmypy-extensions==1.0.0 \\\n    --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \\\n    --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782\n    # via black\npackaging==23.1 \\\n    --hash=sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61 \\\n    --hash=sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f\n    # via black\npathspec==1.0.4 \\\n    --hash=sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645 \\\n    --hash=sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723\n    # via black\nplatformdirs==3.10.0 \\\n    --hash=sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d \\\n    --hash=sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d\n    # via black\npycparser==2.21 \\\n    --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \\\n    --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206\n    # via cffi\npygithub==2.6.1 \\\n    --hash=sha256:6f2fa6d076ccae475f9fc392cc6cdbd54db985d4f69b8833a28397de75ed6ca3 \\\n    --hash=sha256:b5c035392991cca63959e9453286b41b54d83bf2de2daa7d7ff7e4312cebf3bf\n    # via -r requirements_formatting.txt.in\npyjwt==2.12.1 \\\n    --hash=sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c \\\n    --hash=sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b\n    # via\n    #   -r requirements_formatting.txt.in\n    #   pygithub\npynacl==1.6.2 \\\n    --hash=sha256:018494d6d696ae03c7e656e5e74cdfd8ea1326962cc401bcf018f1ed8436811c \\\n    --hash=sha256:04316d1fc625d860b6c162fff704eb8426b1a8bcd3abacea11142cbd99a6b574 \\\n    --hash=sha256:22de65bb9010a725b0dac248f353bb072969c94fa8d6b1f34b87d7953cf7bbe4 \\\n    --hash=sha256:26bfcd00dcf2cf160f122186af731ae30ab120c18e8375684ec2670dccd28130 \\\n    --hash=sha256:2fef529ef3ee487ad8113d287a593fa26f48ee3620d92ecc6f1d09ea38e0709b \\\n    --hash=sha256:320ef68a41c87547c91a8b58903c9caa641ab01e8512ce291085b5fe2fcb7590 \\\n    --hash=sha256:3bffb6d0f6becacb6526f8f42adfb5efb26337056ee0831fb9a7044d1a964444 \\\n    --hash=sha256:44081faff368d6c5553ccf55322ef2819abb40e25afaec7e740f159f74813634 \\\n    --hash=sha256:46065496ab748469cdd999246d17e301b2c24ae2fdf739132e580a0e94c94a87 \\\n    --hash=sha256:5811c72b473b2f38f7e2a3dc4f8642e3a3e9b5e7317266e4ced1fba85cae41aa \\\n    --hash=sha256:622d7b07cc5c02c666795792931b50c91f3ce3c2649762efb1ef0d5684c81594 \\\n    --hash=sha256:62985f233210dee6548c223301b6c25440852e13d59a8b81490203c3227c5ba0 \\\n    --hash=sha256:68be3a09455743ff9505491220b64440ced8973fe930f270c8e07ccfa25b1f9e \\\n    --hash=sha256:834a43af110f743a754448463e8fd61259cd4ab5bbedcf70f9dabad1d28a394c \\\n    --hash=sha256:8845c0631c0be43abdd865511c41eab235e0be69c81dc66a50911594198679b0 \\\n    --hash=sha256:8a66d6fb6ae7661c58995f9c6435bda2b1e68b54b598a6a10247bfcdadac996c \\\n    --hash=sha256:8b097553b380236d51ed11356c953bf8ce36a29a3e596e934ecabe76c985a577 \\\n    --hash=sha256:a84bf1c20339d06dc0c85d9aea9637a24f718f375d861b2668b2f9f96fa51145 \\\n    --hash=sha256:a9f9932d8d2811ce1a8ffa79dcbdf3970e7355b5c8eb0c1a881a57e7f7d96e88 \\\n    --hash=sha256:bc4a36b28dd72fb4845e5d8f9760610588a96d5a51f01d84d8c6ff9849968c14 \\\n    --hash=sha256:c8a231e36ec2cab018c4ad4358c386e36eede0319a0c41fed24f840b1dac59f6 \\\n    --hash=sha256:c949ea47e4206af7c8f604b8278093b674f7c79ed0d4719cc836902bf4517465 \\\n    --hash=sha256:d071c6a9a4c94d79eb665db4ce5cedc537faf74f2355e4d502591d850d3913c0 \\\n    --hash=sha256:d29bfe37e20e015a7d8b23cfc8bd6aa7909c92a1b8f41ee416bbb3e79ef182b2 \\\n    --hash=sha256:fe9847ca47d287af41e82be1dd5e23023d3c31a951da134121ab02e42ac218c9\n    # via\n    #   -r requirements_formatting.txt.in\n    #   pygithub\npytokens==0.4.1 \\\n    --hash=sha256:0fc71786e629cef478cbf29d7ea1923299181d0699dbe7c3c0f4a583811d9fc1 \\\n    --hash=sha256:11edda0942da80ff58c4408407616a310adecae1ddd22eef8c692fe266fa5009 \\\n    --hash=sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083 \\\n    --hash=sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1 \\\n    --hash=sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de \\\n    --hash=sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2 \\\n    --hash=sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a \\\n    --hash=sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1 \\\n    --hash=sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5 \\\n    --hash=sha256:30f51edd9bb7f85c748979384165601d028b84f7bd13fe14d3e065304093916a \\\n    --hash=sha256:34bcc734bd2f2d5fe3b34e7b3c0116bfb2397f2d9666139988e7a3eb5f7400e3 \\\n    --hash=sha256:3ad72b851e781478366288743198101e5eb34a414f1d5627cdd585ca3b25f1db \\\n    --hash=sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68 \\\n    --hash=sha256:42f144f3aafa5d92bad964d471a581651e28b24434d184871bd02e3a0d956037 \\\n    --hash=sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321 \\\n    --hash=sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc \\\n    --hash=sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7 \\\n    --hash=sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f \\\n    --hash=sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918 \\\n    --hash=sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9 \\\n    --hash=sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c \\\n    --hash=sha256:682fa37ff4d8e95f7df6fe6fe6a431e8ed8e788023c6bcc0f0880a12eab80ad1 \\\n    --hash=sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1 \\\n    --hash=sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3 \\\n    --hash=sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b \\\n    --hash=sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb \\\n    --hash=sha256:941d4343bf27b605e9213b26bfa1c4bf197c9c599a9627eb7305b0defcfe40c1 \\\n    --hash=sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a \\\n    --hash=sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4 \\\n    --hash=sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa \\\n    --hash=sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78 \\\n    --hash=sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe \\\n    --hash=sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9 \\\n    --hash=sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d \\\n    --hash=sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975 \\\n    --hash=sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440 \\\n    --hash=sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16 \\\n    --hash=sha256:da5baeaf7116dced9c6bb76dc31ba04a2dc3695f3d9f74741d7910122b456edc \\\n    --hash=sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d \\\n    --hash=sha256:dcafc12c30dbaf1e2af0490978352e0c4041a7cde31f4f81435c2a5e8b9cabb6 \\\n    --hash=sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6 \\\n    --hash=sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324\n    # via black\nrequests==2.32.4 \\\n    --hash=sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c \\\n    --hash=sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422\n    # via\n    #   -r requirements_formatting.txt.in\n    #   pygithub\ntoml==0.10.2 \\\n    --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \\\n    --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f\n    # via\n    #   darker\n    #   darkgraylib\ntyping-extensions==4.14.1 \\\n    --hash=sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36 \\\n    --hash=sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76\n    # via pygithub\nurllib3==2.6.3 \\\n    --hash=sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed \\\n    --hash=sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4\n    # via\n    #   -r requirements_formatting.txt.in\n    #   pygithub\n    #   requests\nwrapt==1.15.0 \\\n    --hash=sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0 \\\n    --hash=sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420 \\\n    --hash=sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a \\\n    --hash=sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c \\\n    --hash=sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079 \\\n    --hash=sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923 \\\n    --hash=sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f \\\n    --hash=sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1 \\\n    --hash=sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8 \\\n    --hash=sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86 \\\n    --hash=sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0 \\\n    --hash=sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364 \\\n    --hash=sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e \\\n    --hash=sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c \\\n    --hash=sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e \\\n    --hash=sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c \\\n    --hash=sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727 \\\n    --hash=sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff \\\n    --hash=sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e \\\n    --hash=sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29 \\\n    --hash=sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7 \\\n    --hash=sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72 \\\n    --hash=sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475 \\\n    --hash=sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a \\\n    --hash=sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317 \\\n    --hash=sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2 \\\n    --hash=sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd \\\n    --hash=sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640 \\\n    --hash=sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98 \\\n    --hash=sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248 \\\n    --hash=sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e \\\n    --hash=sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d \\\n    --hash=sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec \\\n    --hash=sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1 \\\n    --hash=sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e \\\n    --hash=sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9 \\\n    --hash=sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92 \\\n    --hash=sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb \\\n    --hash=sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094 \\\n    --hash=sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46 \\\n    --hash=sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29 \\\n    --hash=sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd \\\n    --hash=sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705 \\\n    --hash=sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8 \\\n    --hash=sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975 \\\n    --hash=sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb \\\n    --hash=sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e \\\n    --hash=sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b \\\n    --hash=sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418 \\\n    --hash=sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019 \\\n    --hash=sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1 \\\n    --hash=sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba \\\n    --hash=sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6 \\\n    --hash=sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2 \\\n    --hash=sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3 \\\n    --hash=sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7 \\\n    --hash=sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752 \\\n    --hash=sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416 \\\n    --hash=sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f \\\n    --hash=sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1 \\\n    --hash=sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc \\\n    --hash=sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145 \\\n    --hash=sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee \\\n    --hash=sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a \\\n    --hash=sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7 \\\n    --hash=sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b \\\n    --hash=sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653 \\\n    --hash=sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0 \\\n    --hash=sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90 \\\n    --hash=sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29 \\\n    --hash=sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6 \\\n    --hash=sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034 \\\n    --hash=sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09 \\\n    --hash=sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559 \\\n    --hash=sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639\n    # via deprecated\n"
  },
  {
    "path": "External/code-format-helper/requirements_formatting.txt.in",
    "content": "black>=26.3.1\ndarker==2.1.1\nPyGithub==2.6.1\ncryptography>=46.0.5\nurllib3>=2.6.3\nrequests>=2.32.4\nidna>=3.7\ncertifi>=2024.7.4\nPyNaCl>=1.6.2\nPyJWT>=2.12.1\n"
  },
  {
    "path": "External/tiny-json/CMakeLists.txt",
    "content": "set(NAME tiny-json)\nset(SRCS tiny-json.c)\nadd_library(${NAME} STATIC ${SRCS})\n\ntarget_include_directories(${NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR})\nadd_library(${NAME}::${NAME} ALIAS ${NAME})"
  },
  {
    "path": "External/tiny-json/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Rafa Garcia\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "External/tiny-json/tiny-json.c",
    "content": "\n/*\n\n<https://github.com/rafagafe/tiny-json>\n     \n  Licensed under the MIT License <http://opensource.org/licenses/MIT>.\n  SPDX-License-Identifier: MIT\n  Copyright (c) 2016-2018 Rafa Garcia <rafagarcia77@gmail.com>.\n\n  Permission is hereby  granted, free of charge, to any  person obtaining a copy\n  of this software and associated  documentation files (the \"Software\"), to deal\n  in the Software  without restriction, including without  limitation the rights\n  to  use, copy,  modify, merge,  publish, distribute,  sublicense, and/or  sell\n  copies  of  the Software,  and  to  permit persons  to  whom  the Software  is\n  furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included in all\n  copies or substantial portions of the Software.\n\n  THE SOFTWARE  IS PROVIDED \"AS  IS\", WITHOUT WARRANTY  OF ANY KIND,  EXPRESS OR\n  IMPLIED,  INCLUDING BUT  NOT  LIMITED TO  THE  WARRANTIES OF  MERCHANTABILITY,\n  FITNESS FOR  A PARTICULAR PURPOSE AND  NONINFRINGEMENT. IN NO EVENT  SHALL THE\n  AUTHORS  OR COPYRIGHT  HOLDERS  BE  LIABLE FOR  ANY  CLAIM,  DAMAGES OR  OTHER\n  LIABILITY, WHETHER IN AN ACTION OF  CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE  OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n    \n*/\n\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n#include <stddef.h> // For NULL\n#include \"tiny-json.h\"\n\n/** Structure to handle a heap of JSON properties. */\ntypedef struct jsonStaticPool_s {\n    json_t* const mem;      /**< Pointer to array of json properties.      */\n    unsigned int const qty; /**< Length of the array of json properties.   */\n    unsigned int nextFree;  /**< The index of the next free json property. */\n    jsonPool_t pool;\n} jsonStaticPool_t;\n\n/* Search a property by its name in a JSON object. */\njson_t const* json_getProperty( json_t const* obj, char const* property ) {\n    json_t const* sibling;\n    for( sibling = obj->u.c.child; sibling; sibling = sibling->sibling )\n        if ( sibling->name && !strcmp( sibling->name, property ) )\n            return sibling;\n    return 0;\n}\n\n/* Search a property by its name in a JSON object and return its value. */\nchar const* json_getPropertyValue( json_t const* obj, char const* property ) {\n\tjson_t const* field = json_getProperty( obj, property );\n\tif ( !field ) return 0;\n        jsonType_t type = json_getType( field );\n        if ( JSON_ARRAY >= type ) return 0;\n\treturn json_getValue( field );\n}\n\n/* Internal prototypes: */\nstatic char* goBlank( char* str );\nstatic char* goNum( char* str );\nstatic json_t* poolInit( jsonPool_t* pool );\nstatic json_t* poolAlloc( jsonPool_t* pool );\nstatic char* objValue( char* ptr, json_t* obj, jsonPool_t* pool );\nstatic char* setToNull( char* ch );\nstatic bool isEndOfPrimitive( char ch );\n\n/* Parse a string to get a json. */\njson_t const* json_createWithPool( char *str, jsonPool_t *pool ) {\n    char* ptr = goBlank( str );\n    if ( !ptr || *ptr != '{' ) return 0;\n    json_t* obj = pool->init( pool );\n    obj->name    = 0;\n    obj->sibling = 0;\n    obj->u.c.child = 0;\n    ptr = objValue( ptr, obj, pool );\n    if ( !ptr ) return 0;\n    return obj;\n}\n\n/* Parse a string to get a json. */\njson_t const* json_create( char* str, json_t mem[], unsigned int qty ) {\n    jsonStaticPool_t spool = {\n        .mem  = mem,\n        .qty  = qty,\n        .pool = {\n            .init = poolInit,\n            .alloc = poolAlloc\n        }\n    };\n    return json_createWithPool( str, &spool.pool );\n}\n\n/** Get a special character with its escape character. Examples:\n  * 'b' -> '\\b', 'n' -> '\\n', 't' -> '\\t'\n  * @param ch The escape character.\n  * @return  The character code. */\nstatic char getEscape( char ch ) {\n    static struct { char ch; char code; } const pair[] = {\n        { '\\\"', '\\\"' }, { '\\\\', '\\\\' },\n        { '/',  '/'  }, { 'b',  '\\b' },\n        { 'f',  '\\f' }, { 'n',  '\\n' },\n        { 'r',  '\\r' }, { 't',  '\\t' },\n    };\n    unsigned int i;\n    for( i = 0; i < sizeof pair / sizeof *pair; ++i )\n        if ( pair[i].ch == ch )\n            return pair[i].code;\n    return '\\0';\n}\n\n/** Parse 4 characters.\n  * @Param str Pointer to  first digit.\n  * @retval '?' If the four characters are hexadecimal digits.\n  * @retcal '\\0' In other cases. */\nstatic unsigned char getCharFromUnicode( unsigned char const* str ) {\n    unsigned int i;\n    for( i = 0; i < 4; ++i )\n        if ( !isxdigit( str[i] ) )\n            return '\\0';\n    return '?';\n}\n\n/** Parse a string and replace the scape characters by their meaning characters.\n  * This parser stops when finds the character '\\\"'. Then replaces '\\\"' by '\\0'.\n  * @param str Pointer to first character.\n  * @retval Pointer to first non white space after the string. If success.\n  * @retval Null pointer if any error occur. */\nstatic char* parseString( char* str ) {\n    unsigned char* head = (unsigned char*)str;\n    unsigned char* tail = (unsigned char*)str;\n    for( ; *head >= ' '; ++head, ++tail ) {\n        if ( *head == '\\\"' ) {\n            *tail = '\\0';\n            return (char*)++head;\n        }\n        if ( *head == '\\\\' ) {\n            if ( *++head == 'u' ) {\n                char const ch = getCharFromUnicode( ++head );\n                if ( ch == '\\0' ) return 0;\n                *tail = ch;\n                head += 3;\n            }\n            else {\n                char const esc = getEscape( *head );\n                if ( esc == '\\0' ) return 0;\n                *tail = esc;\n            }\n        }\n        else *tail = *head;\n    }\n    return 0;\n}\n\n/** Parse a string to get the name of a property.\n  * @param str Pointer to first character.\n  * @param property The property to assign the name.\n  * @retval Pointer to first of property value. If success.\n  * @retval Null pointer if any error occur. */\nstatic char* propertyName( char* ptr, json_t* property ) {\n    property->name = ++ptr;\n    ptr = parseString( ptr );\n    if ( !ptr ) return 0;\n    ptr = goBlank( ptr );\n    if ( !ptr ) return 0;\n    if ( *ptr++ != ':' ) return 0;\n    return goBlank( ptr );\n}\n\n/** Parse a string to get the value of a property when its type is JSON_TEXT.\n  * @param str Pointer to first character ('\\\"').\n  * @param property The property to assign the name.\n  * @retval Pointer to first non white space after the string. If success.\n  * @retval Null pointer if any error occur. */\nstatic char* textValue( char* ptr, json_t* property ) {\n    ++property->u.value;\n    ptr = parseString( ++ptr );\n    if ( !ptr ) return 0;\n    property->type = JSON_TEXT;\n    return ptr;\n}\n\n/** Compare two strings until get the null character in the second one.\n  * @param ptr sub string\n  * @param str main string\n  * @retval Pointer to next character.\n  * @retval Null pointer if any error occur. */\nstatic char* checkStr( char* ptr, char const* str ) {\n    while( *str )\n        if ( *ptr++ != *str++ )\n            return 0;\n    return ptr;\n}\n\n/** Parser a string to get a primitive value.\n  * If the first character after the value is different of '}' or ']' is set to '\\0'.\n  * @param str Pointer to first character.\n  * @param property Property handler to set the value and the type, (true, false or null).\n  * @param value String with the primitive literal.\n  * @param type The code of the type. ( JSON_BOOLEAN or JSON_NULL )\n  * @retval Pointer to first non white space after the string. If success.\n  * @retval Null pointer if any error occur. */\nstatic char* primitiveValue( char* ptr, json_t* property, char const* value, jsonType_t type ) {\n    ptr = checkStr( ptr, value );\n    if ( !ptr || !isEndOfPrimitive( *ptr ) ) return 0;\n    ptr = setToNull( ptr );\n    property->type = type;\n    return ptr;\n}\n\n/** Parser a string to get a true value.\n  * If the first character after the value is different of '}' or ']' is set to '\\0'.\n  * @param str Pointer to first character.\n  * @param property Property handler to set the value and the type, (true, false or null).\n  * @retval Pointer to first non white space after the string. If success.\n  * @retval Null pointer if any error occur. */\nstatic char* trueValue( char* ptr, json_t* property ) {\n    return primitiveValue( ptr, property, \"true\", JSON_BOOLEAN );\n}\n\n/** Parser a string to get a false value.\n  * If the first character after the value is different of '}' or ']' is set to '\\0'.\n  * @param str Pointer to first character.\n  * @param property Property handler to set the value and the type, (true, false or null).\n  * @retval Pointer to first non white space after the string. If success.\n  * @retval Null pointer if any error occur. */\nstatic char* falseValue( char* ptr, json_t* property ) {\n    return primitiveValue( ptr, property, \"false\", JSON_BOOLEAN );\n}\n\n/** Parser a string to get a null value.\n  * If the first character after the value is different of '}' or ']' is set to '\\0'.\n  * @param str Pointer to first character.\n  * @param property Property handler to set the value and the type, (true, false or null).\n  * @retval Pointer to first non white space after the string. If success.\n  * @retval Null pointer if any error occur. */\nstatic char* nullValue( char* ptr, json_t* property ) {\n    return primitiveValue( ptr, property, \"null\", JSON_NULL );\n}\n\n/** Analyze the exponential part of a real number.\n  * @param str Pointer to first character.\n  * @retval Pointer to first non numerical after the string. If success.\n  * @retval Null pointer if any error occur. */\nstatic char* expValue( char* ptr ) {\n    if ( *ptr == '-' || *ptr == '+' ) ++ptr;\n    if ( !isdigit( *ptr ) ) return 0;\n    ptr = goNum( ++ptr );\n    return ptr;\n}\n\n/** Analyze the decimal part of a real number.\n  * @param str Pointer to first character.\n  * @retval Pointer to first non numerical after the string. If success.\n  * @retval Null pointer if any error occur. */\nstatic char* fraqValue( char* ptr ) {\n    if ( !isdigit( *ptr ) ) return 0;\n    ptr = goNum( ++ptr );\n    if ( !ptr ) return 0;\n    return ptr;\n}\n\n/** Parser a string to get a numerical value.\n  * If the first character after the value is different of '}' or ']' is set to '\\0'.\n  * @param str Pointer to first character.\n  * @param property Property handler to set the value and the type: JSON_REAL or JSON_INTEGER.\n  * @retval Pointer to first non white space after the string. If success.\n  * @retval Null pointer if any error occur. */\nstatic char* numValue( char* ptr, json_t* property ) {\n    if ( *ptr == '-' ) ++ptr;\n    if ( !isdigit( *ptr ) ) return 0;\n    if ( *ptr != '0' ) {\n        ptr = goNum( ptr );\n        if ( !ptr ) return 0;\n    }\n    else if ( isdigit( *++ptr ) ) return 0;\n    property->type = JSON_INTEGER;\n    if ( *ptr == '.' ) {\n        ptr = fraqValue( ++ptr );\n        if ( !ptr ) return 0;\n        property->type = JSON_REAL;\n    }\n    if ( *ptr == 'e' || *ptr == 'E' ) {\n        ptr = expValue( ++ptr );\n        if ( !ptr ) return 0;\n        property->type = JSON_REAL;\n    }\n    if ( !isEndOfPrimitive( *ptr ) ) return 0;\n    if ( JSON_INTEGER == property->type ) {\n        char const* value = property->u.value;\n        bool const negative = *value == '-';\n        static char const min[] = \"-9223372036854775808\";\n        static char const max[] = \"9223372036854775807\";\n        unsigned int const maxdigits = ( negative? sizeof min: sizeof max ) - 1;\n        unsigned int const len = ptr - value;\n        if ( len > maxdigits ) return 0;\n        if ( len == maxdigits ) {\n            char const tmp = *ptr;\n            *ptr = '\\0';\n            char const* const threshold = negative ? min: max;\n            if ( 0 > strcmp( threshold, value ) ) return 0;\n            *ptr = tmp;\n        }\n    }\n    ptr = setToNull( ptr );\n    return ptr;\n}\n\n/** Add a property to a JSON object or array.\n  * @param obj The handler of the JSON object or array.\n  * @param property The handler of the property to be added. */\nstatic void add( json_t* obj, json_t* property ) {\n    property->sibling = 0;\n    if ( !obj->u.c.child ){\n\t    obj->u.c.child = property;\n\t    obj->u.c.last_child = property;\n    } else {\n\t    obj->u.c.last_child->sibling = property;\n\t    obj->u.c.last_child = property;\n    }\n}\n\n/** Parser a string to get a json object value.\n  * @param str Pointer to first character.\n  * @param pool The handler of a json pool for creating json instances.\n  * @retval Pointer to first character after the value. If success.\n  * @retval Null pointer if any error occur. */\nstatic char* objValue( char* ptr, json_t* obj, jsonPool_t* pool ) {\n    obj->type    = JSON_OBJ;\n    obj->u.c.child = 0;\n    obj->sibling = 0;\n    ptr++;\n    for(;;) {\n        ptr = goBlank( ptr );\n        if ( !ptr ) return 0;\n        if ( *ptr == ',' ) {\n            ++ptr;\n            continue;\n        }\n        char const endchar = ( obj->type == JSON_OBJ )? '}': ']';\n        if ( *ptr == endchar ) {\n            *ptr = '\\0';\n            json_t* parentObj = obj->sibling;\n            if ( !parentObj ) return ++ptr;\n            obj->sibling = 0;\n            obj = parentObj;\n            ++ptr;\n            continue;\n        }\n        json_t* property = pool->alloc( pool );\n        if ( !property ) return 0;\n        if( obj->type != JSON_ARRAY ) {\n            if ( *ptr != '\\\"' ) return 0;\n            ptr = propertyName( ptr, property );\n            if ( !ptr ) return 0;\n        }\n        else property->name = 0;\n        add( obj, property );\n        property->u.value = ptr;\n        switch( *ptr ) {\n            case '{':\n                property->type    = JSON_OBJ;\n                property->u.c.child = 0;\n                property->sibling = obj;\n                obj = property;\n                ++ptr;\n                break;\n            case '[':\n                property->type    = JSON_ARRAY;\n                property->u.c.child = 0;\n                property->sibling = obj;\n                obj = property;\n                ++ptr;\n                break;\n            case '\\\"': ptr = textValue( ptr, property );  break;\n            case 't':  ptr = trueValue( ptr, property );  break;\n            case 'f':  ptr = falseValue( ptr, property ); break;\n            case 'n':  ptr = nullValue( ptr, property );  break;\n            default:   ptr = numValue( ptr, property );   break;\n        }\n        if ( !ptr ) return 0;\n    }\n}\n\n/** Initialize a json pool.\n  * @param pool The handler of the pool.\n  * @return a instance of a json. */\nstatic json_t* poolInit( jsonPool_t* pool ) {\n    jsonStaticPool_t *spool = json_containerOf( pool, jsonStaticPool_t, pool );\n    spool->nextFree = 1;\n    return spool->mem;\n}\n\n/** Create an instance of a json from a pool.\n  * @param pool The handler of the pool.\n  * @retval The handler of the new instance if success.\n  * @retval Null pointer if the pool was empty. */\nstatic json_t* poolAlloc( jsonPool_t* pool ) {\n    jsonStaticPool_t *spool = json_containerOf( pool, jsonStaticPool_t, pool );\n    if ( spool->nextFree >= spool->qty ) return 0;\n    return spool->mem + spool->nextFree++;\n}\n\n/** Checks whether an character belongs to set.\n  * @param ch Character value to be checked.\n  * @param set Set of characters. It is just a null-terminated string.\n  * @return true or false there is membership or not. */\nstatic bool isOneOfThem( char ch, char const* set ) {\n    while( *set != '\\0' )\n        if ( ch == *set++ )\n            return true;\n    return false;\n}\n\n/** Increases a pointer while it points to a character that belongs to a set.\n  * @param str The initial pointer value.\n  * @param set Set of characters. It is just a null-terminated string.\n  * @return The final pointer value or null pointer if the null character was found. */\nstatic char* goWhile( char* str, char const* set ) {\n    for(; *str != '\\0'; ++str ) {\n        if ( !isOneOfThem( *str, set ) )\n            return str;\n    }\n    return 0;\n}\n\n/** Set of characters that defines a blank. */\nstatic char const* const blank = \" \\n\\r\\t\\f\";\n\n/** Increases a pointer while it points to a white space character.\n  * @param str The initial pointer value.\n  * @return The final pointer value or null pointer if the null character was found. */\nstatic char* goBlank( char* str ) {\n    return goWhile( str, blank );\n}\n\n/** Increases a pointer while it points to a decimal digit character.\n  * @param str The initial pointer value.\n  * @return The final pointer value or null pointer if the null character was found. */\nstatic char* goNum( char* str ) {\n    for( ; *str != '\\0'; ++str ) {\n        if ( !isdigit( *str ) )\n            return str;\n    }\n    return 0;\n}\n\n/** Set of characters that defines the end of an array or a JSON object. */\nstatic char const* const endofblock = \"}]\";\n\n/** Set a char to '\\0' and increase its pointer if the char is different to '}' or ']'.\n  * @param ch Pointer to character.\n  * @return  Final value pointer. */\nstatic char* setToNull( char* ch ) {\n    if ( !isOneOfThem( *ch, endofblock ) ) *ch++ = '\\0';\n    return ch;\n}\n\n/** Indicate if a character is the end of a primitive value. */\nstatic bool isEndOfPrimitive( char ch ) {\n    return ch == ',' || isOneOfThem( ch, blank ) || isOneOfThem( ch, endofblock );\n}\n\n/** Add a character at the end of a string.\n  * @param dest Pointer to the null character of the string\n  * @param ch Value to be added.\n  * @return Pointer to the null character of the destination string. */\nstatic char* chtoa( char* dest, char ch ) {\n    *dest   = ch;\n    *++dest = '\\0';\n    return dest;\n}\n\n/** Copy a null-terminated string.\n  * @param dest Destination memory block.\n  * @param src Source string.\n  * @return Pointer to the null character of the destination string. */\nstatic char* atoa( char* dest, char const* src ) {\n    for( ; *src != '\\0'; ++dest, ++src )\n        *dest = *src;\n    *dest = '\\0';\n    return dest;\n}\n\n/* Open a JSON object in a JSON string. */\nchar* json_objOpen( char* dest, char const* name ) {\n    if ( NULL == name )\n        dest = chtoa( dest, '{' );\n    else {\n        dest = chtoa( dest, '\\\"' );\n        dest = atoa( dest, name );\n        dest = atoa( dest, \"\\\":{\" );\n    }\n    return dest;\n}\n\n/* Close a JSON object in a JSON string. */\nchar* json_objClose( char* dest ) {\n    if ( dest[-1] == ',' )\n        --dest;\n    return atoa( dest, \"},\" );\n}\n\n/* Open an array in a JSON string. */\nchar* json_arrOpen( char* dest, char const* name ) {\n    if ( NULL == name )\n        dest = chtoa( dest, '[' );\n    else {\n        dest = chtoa( dest, '\\\"' );\n        dest = atoa( dest, name );\n        dest = atoa( dest, \"\\\":[\" );\n    }\n    return dest;\n}\n\n/* Close an array in a JSON string. */\nchar* json_arrClose( char* dest ) {\n    if ( dest[-1] == ',' )\n        --dest;\n    return atoa( dest, \"],\" );\n}\n\n/** Add the name of a text property.\n  * @param dest Destination memory.\n  * @param name The name of the property.\n  * @return Pointer to the next char. */\nstatic char* strname( char* dest, char const* name ) {\n    dest = chtoa( dest, '\\\"' );\n    if ( NULL != name ) {\n        dest = atoa( dest, name );\n        dest = atoa( dest, \"\\\":\\\"\" );\n    }\n    return dest;\n}\n\n/** Get the hexadecimal digit of the least significant nibble of a integer. */\nstatic int nibbletoch( int nibble ) {\n    return \"0123456789ABCDEF\"[ nibble % 16u ];\n}\n\n/** Get the escape character of a non-printable.\n  * @param ch Character source.\n  * @return The escape character or null character if error. */\nstatic int escape( int ch ) {\n    static struct { char code; char ch; } const pair[] = {\n        { '\\\"', '\\\"' }, { '\\\\', '\\\\' }, { '/',  '/'  }, { 'b',  '\\b' },\n        { 'f',  '\\f' }, { 'n',  '\\n' }, { 'r',  '\\r' }, { 't',  '\\t' },\n    };\n    for( int i = 0; i < sizeof pair / sizeof *pair; ++i )\n        if ( ch == pair[i].ch )\n            return pair[i].code;\n    return '\\0';\n}\n\n/** Copy a null-terminated string inserting escape characters if needed.\n  * @param dest Destination memory block.\n  * @param src Source string.\n  * @return Pointer to the null character of the destination string. */\nstatic char* atoesc( char* dest, char const* src ) {\n    for( ; *src != '\\0'; ++dest, ++src ) {\n        if ( *src >= ' ' && *src != '\\\"' && *src != '\\\\' && *src != '/' )\n            *dest = *src;\n        else {\n            *dest++ = '\\\\';\n            int const esc = escape( *src );\n            if ( esc )\n                *dest = esc;\n            else {\n                *dest++ = 'u';\n                *dest++ = '0';\n                *dest++ = '0';\n                *dest++ = nibbletoch( *src / 16 );\n                *dest++ = nibbletoch( *src );\n            }\n        }\n    }\n    *dest = '\\0';\n    return dest;\n}\n\n/* Add a text property in a JSON string. */\nchar* json_str( char* dest, char const* name, char const* value ) {\n    dest = strname( dest, name );\n    dest = atoesc( dest, value );\n    dest = atoa( dest, \"\\\",\" );\n    return dest;\n}\n\n/** Add the name of a primitive property.\n  * @param dest Destination memory.\n  * @param name The name of the property.\n  * @return Pointer to the next char. */\nstatic char* primitivename( char* dest, char const* name ) {\n    if( NULL == name )\n        return dest;\n    dest = chtoa( dest, '\\\"' );\n    dest = atoa( dest, name );\n    dest = atoa( dest, \"\\\":\" );\n    return dest;\n}\n\n/*  Add a boolean property in a JSON string. */\nchar* json_bool( char* dest, char const* name, int value ) {\n    dest = primitivename( dest, name );\n    dest = atoa( dest, value ? \"true,\" : \"false,\" );\n    return dest;\n}\n\n/* Add a null property in a JSON string. */\nchar* json_null( char* dest, char const* name ) {\n    dest = primitivename( dest, name );\n    dest = atoa( dest, \"null,\" );\n    return dest;\n}\n\n/* Used to finish the root JSON object. After call json_objClose(). */\nchar* json_end( char* dest ) {\n    if ( ',' == dest[-1] ) {\n        dest[-1] = '\\0';\n        --dest;\n    }\n    return dest;\n}\n\n#define ALL_TYPES \\\n    X( json_int,      int,           \"%d\"   ) \\\n    X( json_long,     long,          \"%ld\"  ) \\\n    X( json_uint,     unsigned int,  \"%u\"   ) \\\n    X( json_ulong,    unsigned long, \"%lu\"  ) \\\n    X( json_verylong, long long,     \"%lld\" ) \\\n    X( json_double,   double,        \"%g\"   ) \\\n\n\n#define json_num( funcname, type, fmt )                         \\\nchar* funcname( char* dest, char const* name, type value ) {    \\\n    dest = primitivename( dest, name );                         \\\n    dest += sprintf( dest, fmt, value );                        \\\n    dest = chtoa( dest, ',' );                                  \\\n    return dest;                                                \\\n}\n\n#define X( name, type, fmt ) json_num( name, type, fmt )\nALL_TYPES\n#undef X\n"
  },
  {
    "path": "External/tiny-json/tiny-json.h",
    "content": "\n/*\n\n<https://github.com/rafagafe/tiny-json>\n     \n  Licensed under the MIT License <http://opensource.org/licenses/MIT>.\n  SPDX-License-Identifier: MIT\n  Copyright (c) 2016-2018 Rafa Garcia <rafagarcia77@gmail.com>.\n\n  Permission is hereby  granted, free of charge, to any  person obtaining a copy\n  of this software and associated  documentation files (the \"Software\"), to deal\n  in the Software  without restriction, including without  limitation the rights\n  to  use, copy,  modify, merge,  publish, distribute,  sublicense, and/or  sell\n  copies  of  the Software,  and  to  permit persons  to  whom  the Software  is\n  furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included in all\n  copies or substantial portions of the Software.\n\n  THE SOFTWARE  IS PROVIDED \"AS  IS\", WITHOUT WARRANTY  OF ANY KIND,  EXPRESS OR\n  IMPLIED,  INCLUDING BUT  NOT  LIMITED TO  THE  WARRANTIES OF  MERCHANTABILITY,\n  FITNESS FOR  A PARTICULAR PURPOSE AND  NONINFRINGEMENT. IN NO EVENT  SHALL THE\n  AUTHORS  OR COPYRIGHT  HOLDERS  BE  LIABLE FOR  ANY  CLAIM,  DAMAGES OR  OTHER\n  LIABILITY, WHETHER IN AN ACTION OF  CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE  OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n    \n*/\n\n#ifndef _TINY_JSON_H_\n#define\t_TINY_JSON_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <stddef.h>\n#include <stdlib.h>\n#include <stdbool.h>\n#include <stdint.h>\n\n#define json_containerOf( ptr, type, member ) \\\n    ((type*)( (char*)ptr - offsetof( type, member ) ))\n\n/** @defgroup tinyJson Tiny JSON parser.\n  * @{ */\n\n/** Enumeration of codes of supported JSON properties types. */\ntypedef enum {\n    JSON_OBJ, JSON_ARRAY, JSON_TEXT, JSON_BOOLEAN,\n    JSON_INTEGER, JSON_REAL, JSON_NULL\n} jsonType_t;\n\n/** Structure to handle JSON properties. */\ntypedef struct json_s {\n    struct json_s* sibling;\n    const char* name;\n    union {\n      const char* value;\n      struct {\n        struct json_s* child;\n        struct json_s* last_child;\n        } c;\n    } u;\n    jsonType_t type;\n} json_t;\n\n/** Parse a string to get a json.\n  * @param str String pointer with a JSON object. It will be modified.\n  * @param mem Array of json properties to allocate.\n  * @param qty Number of elements of mem.\n  * @retval Null pointer if any was wrong in the parse process.\n  * @retval If the parser process was successfully a valid handler of a json.\n  *         This property is always unnamed and its type is JSON_OBJ. */\nconst json_t* json_create(char* str, json_t mem[], unsigned int qty);\n\n/** Get the name of a json property.\n  * @param json A valid handler of a json property.\n  * @retval Pointer to null-terminated if property has name.\n  * @retval Null pointer if the property is unnamed. */\nstatic inline const char* json_getName(const json_t* json) {\n    return json->name;\n}\n\n/** Get the value of a json property.\n  * The type of property cannot be JSON_OBJ or JSON_ARRAY.\n  * @param json A valid handler of a json property.\n  * @return Pointer to null-terminated string with the value. */\nstatic inline const char* json_getValue(const json_t* property) {\n    return property->u.value;\n}\n\n/** Get the type of a json property.\n  * @param json A valid handler of a json property.\n  * @return The code of type.*/\nstatic inline jsonType_t json_getType(const json_t* json) {\n    return json->type;\n}\n\n/** Get the next sibling of a JSON property that is within a JSON object or array.\n  * @param json A valid handler of a json property.\n  * @retval The handler of the next sibling if found.\n  * @retval Null pointer if the json property is the last one. */\nstatic inline const json_t* json_getSibling(const json_t* json) {\n    return json->sibling;\n}\n\n/** Search a property by its name in a JSON object.\n  * @param obj A valid handler of a json object. Its type must be JSON_OBJ.\n  * @param property The name of property to get.\n  * @retval The handler of the json property if found.\n  * @retval Null pointer if not found. */\nconst json_t* json_getProperty(const json_t* obj, const char* property);\n\n\n/** Search a property by its name in a JSON object and return its value.\n  * @param obj A valid handler of a json object. Its type must be JSON_OBJ.\n  * @param property The name of property to get.\n  * @retval If found a pointer to null-terminated string with the value.\n  * @retval Null pointer if not found or it is an array or an object. */\nconst char* json_getPropertyValue(const json_t* obj, const char* property);\n\n/** Get the first property of a JSON object or array.\n  * @param json A valid handler of a json property.\n  *             Its type must be JSON_OBJ or JSON_ARRAY.\n  * @retval The handler of the first property if there is.\n  * @retval Null pointer if the json object has not properties. */\nstatic inline const json_t* json_getChild(const json_t* json) {\n    return json->u.c.child;\n}\n\n/** Get the value of a json boolean property.\n  * @param property A valid handler of a json object. Its type must be JSON_BOOLEAN.\n  * @return The value stdbool. */\nstatic inline bool json_getBoolean(const json_t* property) {\n    return *property->u.value == 't';\n}\n\n/** Get the value of a json integer property.\n  * @param property A valid handler of a json object. Its type must be JSON_INTEGER.\n  * @return The value stdint. */\nstatic inline int64_t json_getInteger(const json_t* property) {\n    return atoll( property->u.value );\n}\n\n/** Get the value of a json real property.\n  * @param property A valid handler of a json object. Its type must be JSON_REAL.\n  * @return The value. */\nstatic inline double json_getReal(const json_t* property) {\n    return atof( property->u.value );\n}\n\n\n/** Structure to handle a heap of JSON properties. */\ntypedef struct jsonPool_s jsonPool_t;\nstruct jsonPool_s {\n    json_t* (*init)( jsonPool_t* pool );\n    json_t* (*alloc)( jsonPool_t* pool );\n};\n\n/** Parse a string to get a json.\n  * @param str String pointer with a JSON object. It will be modified.\n  * @param pool Custom json pool pointer.\n  * @retval Null pointer if any was wrong in the parse process.\n  * @retval If the parser process was successfully a valid handler of a json.\n  *         This property is always unnamed and its type is JSON_OBJ. */\nconst json_t* json_createWithPool(char* str, jsonPool_t* pool);\n\n/** @ } */\n\n/** @defgroup makejoson Make JSON.\n * @{ */\n\n/** Open a JSON object in a JSON string.\n * @param dest Pointer to the end of JSON under construction.\n * @param name Pointer to null-terminated string or null for unnamed.\n * @return Pointer to the new end of JSON under construction. */\nchar* json_objOpen(char* dest, const char* name);\n\n/** Close a JSON object in a JSON string.\n * @param dest Pointer to the end of JSON under construction.\n * @return Pointer to the new end of JSON under construction. */\nchar* json_objClose(char* dest);\n\n/** Used to finish the root JSON object. After call json_objClose().\n * @param dest Pointer to the end of JSON under construction.\n * @return Pointer to the new end of JSON under construction. */\nchar* json_end(char* dest);\n\n/** Open an array in a JSON string.\n * @param dest Pointer to the end of JSON under construction.\n * @param name Pointer to null-terminated string or null for unnamed.\n * @return Pointer to the new end of JSON under construction. */\nchar* json_arrOpen(char* dest, const char* name);\n\n/** Close an array in a JSON string.\n * @param dest Pointer to the end of JSON under construction.\n * @return Pointer to the new end of JSON under construction. */\nchar* json_arrClose(char* dest);\n\n/** Add a text property in a JSON string.\n * @param dest Pointer to the end of JSON under construction.\n * @param name Pointer to null-terminated string or null for unnamed.\n * @param value A valid null-terminated string with the value.\n *              Backslash escapes will be added for special characters.\n * @return Pointer to the new end of JSON under construction. */\nchar* json_str(char* dest, const char* name, const char* value);\n\n/** Add a boolean property in a JSON string.\n * @param dest Pointer to the end of JSON under construction.\n * @param name Pointer to null-terminated string or null for unnamed.\n * @param value Zero for false. Non zero for true.\n * @return Pointer to the new end of JSON under construction. */\nchar* json_bool(char* dest, const char* name, int value);\n\n/** Add a null property in a JSON string.\n * @param dest Pointer to the end of JSON under construction.\n * @param name Pointer to null-terminated string or null for unnamed.\n * @return Pointer to the new end of JSON under construction. */\nchar* json_null(char* dest, const char* name);\n\n/** Add an integer property in a JSON string.\n * @param dest Pointer to the end of JSON under construction.\n * @param name Pointer to null-terminated string or null for unnamed.\n * @param value Value of the property.\n * @return Pointer to the new end of JSON under construction. */\nchar* json_int(char* dest, const char* name, int value);\n\n/** Add an unsigned integer property in a JSON string.\n * @param dest Pointer to the end of JSON under construction.\n * @param name Pointer to null-terminated string or null for unnamed.\n * @param value Value of the property.\n * @return Pointer to the new end of JSON under construction. */\nchar* json_uint(char* dest, const char* name, unsigned int value);\n\n/** Add a long integer property in a JSON string.\n * @param dest Pointer to the end of JSON under construction.\n * @param name Pointer to null-terminated string or null for unnamed.\n * @param value Value of the property.\n * @return Pointer to the new end of JSON under construction. */\nchar* json_long(char* dest, const char* name, long int value);\n\n/** Add an unsigned long integer property in a JSON string.\n * @param dest Pointer to the end of JSON under construction.\n * @param name Pointer to null-terminated string or null for unnamed.\n * @param value Value of the property.\n * @return Pointer to the new end of JSON under construction. */\nchar* json_ulong(char* dest, const char* name, unsigned long int value);\n\n/** Add a long long integer property in a JSON string.\n * @param dest Pointer to the end of JSON under construction.\n * @param name Pointer to null-terminated string or null for unnamed.\n * @param value Value of the property.\n * @return Pointer to the new end of JSON under construction. */\nchar* json_verylong(char* dest, const char* name, long long int value);\n\n/** Add a double precision number property in a JSON string.\n * @param dest Pointer to the end of JSON under construction.\n * @param name Pointer to null-terminated string or null for unnamed.\n * @param value Value of the property.\n * @return Pointer to the new end of JSON under construction. */\nchar* json_double(char* dest, const char* name, double value);\n\n/** @ } */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\t/* _TINY_JSON_H_ */\n"
  },
  {
    "path": "FEXCore/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.14)\nset(PROJECT_NAME FEXCore)\nproject(${PROJECT_NAME}\n  VERSION 0.01\n  LANGUAGES CXX)\n\nif (CMAKE_SYSTEM_PROCESSOR MATCHES \"x86_64\")\n  set(ARCHITECTURE_x86_64 1)\n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -mcx16\")\nendif()\n\nif (CMAKE_SYSTEM_PROCESSOR MATCHES \"^aarch64|^arm64|^armv8\\.*\")\n  set(ARCHITECTURE_arm64 1)\nendif()\n\nset(CMAKE_POSITION_INDEPENDENT_CODE ON)\ncmake_policy(SET CMP0083 NEW) # Follow new PIE policy\ninclude(CheckPIESupported)\ncheck_pie_supported()\n\nset(CMAKE_INCLUDE_CURRENT_DIR ON)\n\ninclude(CheckCXXCompilerFlag)\ninclude(CheckIncludeFileCXX)\ninclude(CheckCXXSourceCompiles)\n\nset(CMAKE_CXX_STANDARD 20)\nset(CMAKE_EXPORT_COMPILE_COMMANDS ON)\n\nconfigure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/git_version.h.in\n  ${CMAKE_BINARY_DIR}/generated/git_version.h)\n\ninclude_directories(${CMAKE_BINARY_DIR}/generated)\n\n# Disable strict aliasing for all build modes\n# See discussion in https://github.com/FEX-Emu/FEX/pull/4494#issuecomment-2800608944\n# for background context.\nadd_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-strict-aliasing> $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>)\n\nadd_subdirectory(Source/)\n\nif (NOT BUILD_STEAM_SUPPORT)\n  install (DIRECTORY include/FEXCore ${CMAKE_BINARY_DIR}/include/FEXCore\n    DESTINATION include\n    COMPONENT Development)\nendif()\n\nif (BUILD_TESTING)\n  add_subdirectory(unittests/)\nendif()\n"
  },
  {
    "path": "FEXCore/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 Ryan Houdek <Sonicadvance1@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "FEXCore/Readme.md",
    "content": "# FEXCore - Fast x86 Core emulation library\nThis is the core emulation library that is used for the FEX emulator project.\nThis project aims to provide a fast and functional x86-64 emulation library that can meet and surpass other x86-64 emulation libraries.\n### Goals\n* Be as fast as possible, beating and exceeding current options for x86-64 emulation\n  * 25% - 50% lower performance than native code would be desired target\n  * Use an IR to efficiently translate x86-64 to our host architecture\n  * Support a tiered recompiler to allow for fast runtime performance\n  * Support offline compilation and offline tooling for inspection and performance analysis\n  * Support threaded emulation. Including emulating x86-64's strong memory model on weak memory model architectures\n* Support a significant portion of the x86-64 instruction space.\n  * Including MMX, SSE, SSE2, SSE3, SSSE3, and SSE4*\n* Support fallback routines for uncommonly used x86-64 instructions\n  * Including x87 and 3DNow!\n* Only support userspace emulation.\n  * All x86-64 instructions run as if they are under CPL-3(userland) security layer\n* Minimal Linux Syscall emulation for testing purposes\n* Portable library implementation in order to support easy integration in to applications\n### Target Host Architecture\nThe target host architecture for this library is AArch64. Specifically the ARMv8.1 version or newer.\nThe CPU IR is designed with AArch64 in mind but should allow for other architectures as well.\nx86-64 host support is available for ease of development, but is not a priority.\n### Not desired\n* Kernel space emulation\n* CPL0-2 emulation\n* Real Mode, Protected Mode, Virtual-8086 Mode, System Management Mode\n* IRQs\n* SVM\n* \"Cycle Accurate\" emulation\n"
  },
  {
    "path": "FEXCore/Scripts/config_generator.py",
    "content": "import datetime\nimport json\nimport sys\n\ndef print_header():\n    header = '''#ifndef OPT_BASE\n#define OPT_BASE(type, group, enum, json, default)\n#endif\n#ifndef OPT_BOOL\n#define OPT_BOOL(group, enum, json, default) OPT_BASE(bool, group, enum, json, default)\n#endif\n#ifndef OPT_UINT8\n#define OPT_UINT8(group, enum, json, default) OPT_BASE(uint8_t, group, enum, json, default)\n#endif\n#ifndef OPT_INT32\n#define OPT_INT32(group, enum, json, default) OPT_BASE(int32_t, group, enum, json, default)\n#endif\n#ifndef OPT_UINT32\n#define OPT_UINT32(group, enum, json, default) OPT_BASE(uint32_t, group, enum, json, default)\n#endif\n#ifndef OPT_UINT64\n#define OPT_UINT64(group, enum, json, default) OPT_BASE(uint64_t, group, enum, json, default)\n#endif\n#ifndef OPT_STR\n#define OPT_STR(group, enum, json, default) OPT_BASE(fextl::string, group, enum, json, default)\n#endif\n#ifndef OPT_STRARRAY\n#define OPT_STRARRAY(group, enum, json, default) OPT_BASE(fextl::string, group, enum, json, default)\n#endif\n#ifndef OPT_STRENUM\n#define OPT_STRENUM(group, enum, json, default) OPT_BASE(uint64_t, group, enum, json, default)\n#endif\n'''\n    output_file.write(header)\n\ndef print_tail():\n    tail = '''#undef OPT_BASE\n#undef OPT_BOOL\n#undef OPT_UINT8\n#undef OPT_INT32\n#undef OPT_UINT32\n#undef OPT_UINT64\n#undef OPT_STR\n#undef OPT_STRARRAY\n#undef OPT_STRENUM\n'''\n    output_file.write(tail)\n\ndef print_config(type, group_name, json_name, default_value):\n    output_file.write(\"OPT_{0} ({1}, {2}, {3}, {4})\\n\".format(type.upper(), group_name.upper(), json_name.upper(), json_name, default_value))\n\ndef print_options(options):\n    for op_group, group_vals in options.items():\n        for op_key, op_vals in group_vals.items():\n            default = op_vals[\"Default\"]\n            if (op_vals[\"Type\"] == \"str\" or op_vals[\"Type\"] == \"strarray\"):\n                # Wrap the string argument in quotes\n                default = \"\\\"\" + default + \"\\\"\"\n\n            print_config(\n                op_vals[\"Type\"],\n                op_group,\n                op_key,\n                default)\n\n        output_file.write(\"\\n\")\n\ndef print_unnamed_options(options):\n    output_file.write(\"// Unnamed configuration options\\n\")\n    for op_group, group_vals in options.items():\n        for op_key, op_vals in group_vals.items():\n            default = op_vals[\"Default\"]\n            if (op_vals[\"Type\"] == \"str\" or op_vals[\"Type\"] == \"strarray\"):\n                # Wrap the string argument in quotes\n                default = \"\\\"\" + default + \"\\\"\"\n\n            print_config(\n                op_vals[\"Type\"],\n                op_group,\n                op_key.upper(), # KEY is the enum here, there is no json configuration for these\n                default)\n\n        output_file.write(\"\\n\")\n\ndef print_man_option(short, long, desc, default):\n    if (short != None):\n        output_man.write(\".It Fl {0} , \".format(short))\n    else:\n        output_man.write(\".It \")\n\n    output_man.write(\"Fl Fl {0}=\".format(long))\n\n    output_man.write(\"\\n\");\n\n    # Print description\n    for line in desc:\n        output_man.write(\".Pp\\n\")\n        output_man.write(\"{0}\\n\".format(line))\n\n    output_man.write(\".Pp\\n\")\n    output_man.write(\"\\\\fBdefault:\\\\fR {0}\\n\".format(default))\n    output_man.write(\".Pp\\n\\n\")\n\ndef print_man_env_option(name, desc, default, no_json_key):\n    output_man.write(\"\\\\fBFEX_{0}\\\\fR\\n\".format(name.upper()))\n\n    # Print description\n    for line in desc:\n        output_man.write(\".Pp\\n\")\n        output_man.write(\"{0}\\n\".format(line))\n\n    if (not no_json_key):\n        output_man.write(\".Pp\\n\")\n        output_man.write(\"\\\\fBJSON key:\\\\fR '{0}'\\n\".format(name))\n        output_man.write(\".Pp\\n\\n\")\n\n    output_man.write(\".Pp\\n\")\n    output_man.write(\"\\\\fBdefault:\\\\fR {0}\\n\".format(default))\n    output_man.write(\".Pp\\n\\n\")\n\ndef print_man_environment(options):\n    output_man.write(\".Sh ENVIRONMENT\\n\")\n    output_man.write(\".Bl -tag -width -indent\\n\")\n    for op_group, group_vals in options.items():\n        for op_key, op_vals in group_vals.items():\n            default = op_vals[\"Default\"]\n            value_type = op_vals[\"Type\"]\n\n            # Textual default rather than enum based\n            if (\"TextDefault\" in op_vals):\n                default = op_vals[\"TextDefault\"]\n\n            if (value_type == \"str\" or value_type == \"strarray\" or value_type == \"strenum\"):\n                # Wrap the string argument in quotes\n                default = \"'\" + default + \"'\"\n            print_man_env_option(\n                op_key,\n                op_vals[\"Desc\"],\n                default,\n                False\n            )\n\n            if (value_type == \"strenum\"):\n                Enums = op_vals[\"Enums\"]\n                output_man.write(\"\\\\fBAvailable Options:\\\\fR\\n\")\n                output_man.write(\", \".join(f\"{enum_op_val}\" for [_, enum_op_val] in Enums.items()))\n                output_man.write(\"\\n.sp\\n\")\n\n    print_man_environment_tail()\n    output_man.write(\".El\\n\")\n\ndef print_man_environment_tail():\n\n    # Additional environment variables that live outside of the normal loop\n    print_man_env_option(\n    \"APP_CONFIG_LOCATION\",\n    [\n    \"Allows the user to override where FEX looks for configuration files\",\n    \"By default FEX will look in ${XDG_CONFIG_HOME, $HOME/.config}/fex-emu/\",\n    \"This will override the full path\",\n    \"If FEX_PORTABLE is declared then relative paths are also supported\",\n    \"For FEX: Relative to the FEX binary\",\n    \"For WINE: Relative to %LOCALAPPDATA%\"\n    ],\n    \"''\", True)\n\n    print_man_env_option(\n    \"APP_CONFIG\",\n    [\n    \"Allows the user to override where FEX looks for only the application config file\",\n    \"By default FEX will look in ${XDG_CONFIG_HOME, $HOME/.config}/fex-emu/Config.json\",\n    \"This will override this file location\",\n    \"One must be careful with this option as it will override any applications that load with execve as well\"\n    \"If you need to support applications that execve then use FEX_APP_CONFIG_LOCATION instead\"\n    \"If FEX_PORTABLE is declared then relative paths are also supported\",\n    \"For FEX: Relative to the FEX binary\",\n    \"For WINE: Relative to %LOCALAPPDATA%\"\n    ],\n    \"''\", True)\n\n    print_man_env_option(\n    \"APP_DATA_LOCATION\",\n    [\n    \"Allows the user to override where FEX looks for data files\",\n    \"By default FEX will look in {$XDG_DATA_HOME, $HOME/.local/share}/fex-emu/\",\n    \"This will override the full path\",\n    \"This is the folder where FEX stores generated files like IR cache\"\n    ],\n    \"''\", True)\n\n    print_man_env_option(\n    \"PORTABLE\",\n    [\n    \"Allows FEX to run without installation. Global locations for configuration and binfmt_misc are ignored.\",\n    \"For FEX on Linux:\",\n    \"These files are instead read from <FEXPath>/fex-emu/ by default.\",\n    \"For Arm64ec/Wow64 WINE builds:\",\n    \"These files are instead read from $LOCALAPPDATA/fex-emu/ by default.\",\n    \"For further customization, see FEX_APP_CONFIG_LOCATION and FEX_APP_DATA_LOCATION.\"\n    ],\n    \"''\", True)\n\n    print_man_env_option(\n    \"APP_CACHE_LOCATION\",\n    [\n    \"Allows the user to override where FEX stores and loads cache files\",\n    \"By default FEX will look in ${XDG_CACHE_HOME, $HOME/.cache}/fex-emu/\",\n    \"This will override the full path, trailing forward-slash is expected to exist\",\n    ],\n    \"''\", True)\n\ndef print_man_header():\n    header ='''.Dd {0}\n.Dt FEX\n.Os Linux\n.Sh NAME\n.Nm FEX\n.Nm FEXBash\n.Nd Fast x86-64 and x86 emulation.\n.Sh SYNOPSIS\n.Nm\n.Ar <args> ...\n.Pp\n.Nm FEXBash\n.Ar <args> ...\n.Sh DESCRIPTION\nFEX allows you to run x86 and x86-64 binaries on an AArch64 host, similar to qemu-user and box86.\nIt has native support for a rootfs overlay, so you don't need to chroot, as well as some thunklibs so it can forward things like GL to the host.\nFEX presents a Linux 5.0 interface to the guest, and supports both AArch64 and x86-64 as hosts.\nFEX is very much work in progress, so expect things to change.\n'''\n    output_man.write(header.format(datetime.datetime.now().strftime(\"%d-%m-%Y\")))\n\ndef print_man_tail():\n    tail ='''.Sh FILES\n.Bl -tag -width \"$prefix/share/fex-emu/GuestThunks\" -compact\n.It Pa $XDG_CONFIG_DIR/fex-emu\nDefault FEX user configuration directory\n.It Pa $prefix/share/fex-emu/AppConfig\nSystem level application configuration files\n.It Pa $prefix/share/fex-emu/GuestThunks\nguest-side thunk data libraries\n.It Pa $prefix/lib/fex-emu/HostThunks\nhost-side thunks for guest communication\n.El\n'''\n    output_man.write(tail)\n\ndef print_config_option(type, group_name, json_name, default_value, short, choices, desc):\n    if (type == \"bool\"):\n        # Bool gets some special handling to add an inverted case\n        output_argloader.write(\"{0}Group\".format(group_name))\n\n        options = \"\"\n        AddedArg = False\n        if (short != None):\n            AddedArg = True\n            options += \"\\\"-{0}\\\"\".format(short)\n\n        if (AddedArg):\n            options += \", \"\n        options += \"\\\"--{0}\\\"\".format(json_name.lower())\n\n        output_argloader.write(\".add_option({0})\".format(options))\n\n        output_argloader.write(\"\\n\")\n\n        output_argloader.write(\"\\t.action(\\\"store_true\\\")\\n\")\n\n        output_argloader.write(\"\\t.dest(\\\"{0}\\\")\\n\".format(json_name));\n\n        # help\n        output_argloader.write(\"\\t.help(\\n\")\n        desc_line_ender = \"\"\n        if (len(desc) > 1):\n            desc_line_ender = \"\\\\n\"\n\n        for line in desc:\n            output_argloader.write(\"\\t\\t\\\"{0}{1}\\\"\\n\".format(line, desc_line_ender))\n        output_argloader.write(\"\\t)\\n\")\n\n        output_argloader.write(\"\\t.set_default({0});\\n\\n\".format(default_value));\n\n        output_argloader.write(\"{0}Group\".format(group_name))\n        output_argloader.write(\".add_option(\\\"--no-{0}\\\")\\n\".format(json_name.lower()))\n\n        # Inverted case sets the bool to false\n        output_argloader.write(\"\\t.action(\\\"store_false\\\")\\n\")\n\n        output_argloader.write(\"\\t.dest(\\\"{0}\\\");\\n\".format(json_name));\n    else:\n        output_argloader.write(\"{0}Group\".format(group_name))\n        options = \"\"\n        AddedArg = False\n        if (short != None):\n            AddedArg = True\n            options += \"\\\"-{0}\\\"\".format(short)\n\n        if (AddedArg):\n            options += \", \"\n        options += \"\\\"--{0}\\\"\".format(json_name.lower())\n\n        output_argloader.write(\".add_option({0})\".format(options))\n\n        output_argloader.write(\"\\n\")\n\n        output_argloader.write(\"\\t.dest(\\\"{0}\\\")\\n\".format(json_name));\n\n        if (choices != None):\n            output_argloader.write(\"\\t.choices({\\n\")\n            for choice in choices:\n                output_argloader.write(\"\\t\\t\\\"{0}\\\",\\n\".format(choice))\n            output_argloader.write(\"\\t})\\n\")\n\n\n        # help\n        output_argloader.write(\"\\t.help(\\n\")\n        desc_line_ender = \"\"\n        if (len(desc) > 1):\n            desc_line_ender = \"\\\\n\"\n\n        for line in desc:\n            output_argloader.write(\"\\t\\t\\\"{0}{1}\\\"\\n\".format(line, desc_line_ender))\n        output_argloader.write(\"\\t)\\n\")\n\n        output_argloader.write(\"\\t.set_default({0});\\n\".format(default_value));\n\n    output_argloader.write(\"\\n\");\n\ndef print_parse_envloader_options(options):\n    output_argloader.write(\"#ifdef ENVLOADER\\n\")\n    output_argloader.write(\"#undef ENVLOADER\\n\")\n    output_argloader.write(\"if (false) {}\\n\")\n\n    for op_group, group_vals in options.items():\n        for op_key, op_vals in group_vals.items():\n            value_type = op_vals[\"Type\"]\n            if (value_type == \"strenum\"):\n                output_argloader.write(\"else if (Key == \\\"FEX_{0}\\\") {{\\n\".format(op_key.upper()))\n                output_argloader.write(\"\\tValue = FEXCore::Config::EnumParser<FEXCore::Config::{}ConfigPair>(FEXCore::Config::{}_EnumPairs, Value_View);\\n\".format(op_key, op_key))\n                output_argloader.write(\"}\\n\")\n\n            if (\"ArgumentHandler\" in op_vals):\n                conversion_func = \"FEXCore::Config::Handler::{0}\".format(op_vals[\"ArgumentHandler\"])\n                output_argloader.write(\"else if (Key == \\\"FEX_{0}\\\") {{\\n\".format(op_key.upper()))\n                output_argloader.write(\"\\tValue = {0}(Value_View);\\n\".format(conversion_func))\n                output_argloader.write(\"}\\n\")\n    output_argloader.write(\"#endif\\n\")\n\ndef print_parse_jsonloader_options(options):\n    output_argloader.write(\"#ifdef JSONLOADER\\n\")\n    output_argloader.write(\"#undef JSONLOADER\\n\")\n    output_argloader.write(\"if (false) {}\\n\")\n    op_key = None\n    for op_group, group_vals in options.items():\n        for op_key, op_vals in group_vals.items():\n            value_type = op_vals[\"Type\"]\n            if (value_type == \"strenum\"):\n                output_argloader.write(\"else if (KeyName == \\\"{0}\\\") {{\\n\".format(op_key))\n                output_argloader.write(\"\\tSet(KeyOption, FEXCore::Config::EnumParser<FEXCore::Config::{}ConfigPair>(FEXCore::Config::{}_EnumPairs, Value_View));\\n\".format(op_key, op_key))\n                output_argloader.write(\"}\\n\")\n            elif (value_type == \"strarray\"):\n                output_argloader.write(\"else if (KeyName == \\\"{0}\\\") {{\\n\".format(op_key))\n                output_argloader.write(\"\\tAppendStrArrayValue(KeyOption, ConfigString);\\n\")\n                output_argloader.write(\"}\\n\")\n    assert op_key is not None, \"No options found in JSONLOADER\"\n    output_argloader.write(\"else {\\n\")\n    output_argloader.write(\"\\tSet(KeyOption, ConfigString);\\n\")\n    output_argloader.write(\"}\\n\")\n\n    output_argloader.write(\"#endif\\n\")\n\ndef print_parse_enum_options(options):\n    output_argloader.write(\"#ifdef ENUMDEFINES\\n\")\n    output_argloader.write(\"#undef ENUMDEFINES\\n\")\n    for op_group, group_vals in options.items():\n        for op_key, op_vals in group_vals.items():\n            if (op_vals[\"Type\"] == \"strenum\"):\n                output_argloader.write(\"enum class {} : uint64_t {{\\n\".format(op_key))\n                Enums = op_vals[\"Enums\"]\n                i = 0\n                # Always have an OFF.\n                output_argloader.write(\"\\tOFF = 0,\\n\")\n                for enum_op_key, enum_op_vals in Enums.items():\n                    output_argloader.write(\"\\t{} = 1ULL << {},\\n\".format(enum_op_key.upper(), i))\n                    i += 1\n\n                output_argloader.write(\"};\\n\")\n                output_argloader.write(\"FEX_DEF_NUM_OPS({})\\n\".format(op_key))\n\n\n    for op_group, group_vals in options.items():\n        for op_key, op_vals in group_vals.items():\n            if (op_vals[\"Type\"] == \"strenum\"):\n                Enums = op_vals[\"Enums\"]\n\n                output_argloader.write(\"using {}ConfigPair = std::pair<std::string_view, FEXCore::Config::{}>;\\n\".format(op_key, op_key))\n                output_argloader.write(\"constexpr static std::array<{}ConfigPair, {}> {}_EnumPairs = {{{{\\n\".format(op_key, len(Enums) + 1, op_key))\n                i = 0\n                # Always have an OFF.\n                output_argloader.write(\"\\t{{ \\\"off\\\", FEXCore::Config::{}::OFF }},\\n\".format(op_key))\n                for enum_op_key, enum_op_vals in Enums.items():\n                    output_argloader.write(\"\\t{{ \\\"{}\\\", FEXCore::Config::{}::{} }},\\n\".format(enum_op_vals, op_key, enum_op_key.upper()))\n                    i += 1\n\n                output_argloader.write(\"}};\\n\")\n\n    output_argloader.write(\"#endif\\n\")\n\nif (len(sys.argv) < 5):\n    sys.exit()\n\noutput_filename = sys.argv[2]\noutput_man_page = sys.argv[3]\noutput_argumentloader_filename = sys.argv[4]\n\njson_file = open(sys.argv[1], \"r\")\njson_text = json_file.read()\njson_file.close()\n\njson_object = json.loads(json_text)\n\noptions = json_object[\"Options\"]\nunnamed_options = json_object[\"UnnamedOptions\"]\n\n# Generate config include file\noutput_file = open(output_filename, \"w\")\nprint_header()\nprint_options(options)\nprint_unnamed_options(unnamed_options)\nprint_tail()\noutput_file.close()\n\n# Generate man file\noutput_man = open(output_man_page, \"w\")\nprint_man_header()\nprint_man_environment(options)\nprint_man_tail()\n\noutput_man.close()\n\n# Generate argument loader code\noutput_argloader = open(output_argumentloader_filename, \"w\")\n\n# Generate environment loader code\nprint_parse_envloader_options(options);\n\n# Generate json loader code\nprint_parse_jsonloader_options(options);\n\n# Generate enum variable options\nprint_parse_enum_options(options);\n\noutput_argloader.close()\n"
  },
  {
    "path": "FEXCore/Scripts/json_ir_doc_generator.py",
    "content": "import collections\nimport json\nimport sys\n\nOpClasses = collections.OrderedDict()\n\ndef get_ir_classes(ops, defines):\n    global OpClasses\n\n    for op_class, opslist in ops.items():\n        if not (op_class in OpClasses):\n            OpClasses[op_class] = []\n\n        for op, op_val in opslist.items():\n            OpClasses[op_class].append([op, op_val])\n\n    # Sort the dictionary after we are done parsing it\n    OpClasses = collections.OrderedDict(sorted(OpClasses.items()))\n\ndef print_ir_op_index():\n    output_file.write(\"# Index\\n\")\n    output_file.write(\"## Op Classes\\n\")\n    for class_key, class_value in OpClasses.items():\n        output_file.write(\"- [%s](#%s)\\n\\n\" % (class_key, class_key))\n\n    output_file.write(\"## Definitions\\n\")\n    output_file.write(\"- [Defines](#Defines)\\n\\n\")\n\ndef print_ir_ops():\n    for class_key, class_value in OpClasses.items():\n        output_file.write(\"# %s\\n\\n\" % (class_key))\n        for op in class_value:\n            op_key = op[0]\n            op_vals = op[1]\n            output_file.write(\"## %s\\n\" % (op_key))\n\n            output_file.write(\">\")\n            output_file.write(op_key)\n\n            output_file.write(\"\\n\\n\")\n\n            if (\"Desc\" in op_vals):\n                desc = op_vals[\"Desc\"]\n                if (isinstance(desc, list)):\n                    for line in desc:\n                        output_file.write(\"%s\\n\\n\" % line)\n                else:\n                    output_file.write(\"%s\\n\" % op_vals[\"Desc\"])\n            else:\n                output_file.write(\"XXX: Missing op desc!\\n\")\n\ndef print_ir_defines(defines):\n    output_file.write(\"## Defines\\n\")\n    output_file.write(\"```cpp\\n\")\n    for define in defines:\n        output_file.write(\"%s\\n\" % (define))\n    output_file.write(\"```\\n\")\n\nif (len(sys.argv) < 3):\n    sys.exit()\n\noutput_filename = sys.argv[2]\njson_file = open(sys.argv[1], \"r\")\njson_text = json_file.read()\njson_file.close()\n\njson_object = json.loads(json_text)\njson_object = {k.upper(): v for k, v in json_object.items()}\n\nops = json_object[\"OPS\"]\ndefines = json_object[\"DEFINES\"]\n\nget_ir_classes(ops, defines)\n\noutput_file = open(output_filename, \"w\")\n\nprint_ir_op_index()\n\noutput_file.write(\"# IR documentation\\n\\n\")\n\nprint_ir_ops()\n\nprint_ir_defines(defines)\n\noutput_file.close()\n"
  },
  {
    "path": "FEXCore/Scripts/json_ir_generator.py",
    "content": "#!/bin/python3\nimport json\nimport sys\nfrom dataclasses import dataclass, field\nimport textwrap\n\ndef ExitError(msg):\n    print(msg)\n    sys.exit(-1)\n\n@dataclass\nclass IRType:\n    IRName: str\n    CXXName: str\n    def __init__(self, IRName, CXXName):\n        self.IRName = IRName\n        self.CXXName = CXXName\n\n@dataclass\nclass OpArgument:\n    Type: str\n    IsSSA: bool\n    Temporary: bool\n    Name: str\n    NameWithPrefix: str\n    DefaultInitializer: str\n\n    def __init__(self):\n        self.Type = None\n        self.IsSSA = False\n        self.Temporary = False\n        self.Name = None\n        self.NameWithPrefix = None\n        self.DefaultInitializer = None\n        return\n\n    def print(self):\n        attrs = vars(self)\n        print(\", \".join(\"%s: %s\" % item for item in attrs.items()))\n\n@dataclass\nclass OpDefinition:\n    Name: str\n    HasDest: bool\n    DestType: str\n    DestSize: str\n    ElementSize: str\n    OpClass: str\n    HasSideEffects: bool\n    ImplicitFlagClobber: bool\n    RAOverride: int\n    SwitchGen: bool\n    ArgPrinter: bool\n    SSAArgNum: int\n    NonSSAArgNum: int\n    DynamicDispatch: bool\n    LoweredX87: bool\n    JITDispatch: bool\n    JITDispatchOverride: str\n    TiedSource: int\n    Inline: list[str]\n    Arguments: list[OpArgument]\n    EmitValidation: list[str]\n    Desc: list[str]\n\n    def __init__(self):\n        self.Name = None\n        self.HasDest = False\n        self.DestType = None\n        self.DestSize = None\n        self.ElementSize = None\n        self.OpClass = None\n        self.OpSize = 0\n        self.HasSideEffects = False\n        self.ImplicitFlagClobber = False\n        self.RAOverride = -1\n        self.SwitchGen = True\n        self.ArgPrinter = True\n        self.SSAArgNum = 0\n        self.NonSSAArgNum = 0\n        self.DynamicDispatch = False\n        self.LoweredX87 = False\n        self.JITDispatch = True\n        self.JITDispatchOverride = None\n        self.TiedSource = -1\n        self.Arguments = []\n        self.EmitValidation = []\n        self.Desc = []\n        return\n\n    def print(self):\n        attrs = vars(self)\n        print(\", \".join(\"%s: %s\" % item for item in attrs.items()))\n\nIRTypesToCXX: dict[str, IRType] = {}\nCXXTypeToIR: dict[str, IRType] = {}\nIROps: list[OpDefinition] = []\n\nIROpNameSet: set[str] = set()\n\ndef is_ssa_type(op_type: str):\n    return op_type in {\"SSA\", \"GPR\", \"GPRPair\", \"FPR\"}\n\ndef parse_irtypes(irtypes):\n    for op_key, op_val in irtypes.items():\n        IRTypesToCXX[op_key] = IRType(op_key, op_val)\n        CXXTypeToIR[op_val] = IRType(op_key, op_val)\n\ndef parse_ops(ops):\n    for op_class, opslist in ops.items():\n        for op, op_val in opslist.items():\n            if \"Ignore\" in op_val:\n                # Skip these\n                continue\n\n            OpDef = OpDefinition()\n\n            # Check if we have a destination\n            # Only happens if the IR name contains `=`\n            EqualSplit = op.split(\"=\", 1)\n\n            RHS = EqualSplit[0].strip()\n            if len(EqualSplit) > 1:\n                LHS = EqualSplit[0].strip()\n                RHS = EqualSplit[1].strip()\n\n                if \":\" in LHS:\n                    # Named destinations. This is a hack, but so is the entire\n                    # multi-destination support bolten onto the old IR...\n                    #\n                    # Named destinations require side effects because they break\n                    # SSA hard. Validate that.\n                    assert(\"HasSideEffects\" in op_val and op_val[\"HasSideEffects\"])\n\n                    for Dest in LHS.split(\",\"):\n                        Dest = Dest.strip()\n                        DType, Name = Dest.split(\":$\")\n\n                        # If the destination appears also as a source, it is\n                        # read-modify-write.\n                        if Dest in RHS:\n                            # Turn RMW into an in/out source\n                            RHS = RHS.replace(Dest.strip(), f\"{DType}:$Inout{Name}\")\n                        else:\n                            # Turn named destinations into an out source.\n                            RHS += f\", {DType}:$Out{Name}\"\n                else:\n                    # Single anonymous destination\n                    if LHS not in [\"SSA\", \"GPR\", \"GPRPair\", \"FPR\"]:\n                        ExitError(f\"Unknown destination class type {LHS}. Needs to be one of SSA, GPR, GPRPair, FPR\")\n\n                    OpDef.HasDest = True\n                    OpDef.DestType = LHS\n\n            # IR Op needs to start with a name\n            RHS = RHS.split(\" \", 1)\n\n            if len(RHS) < 1:\n                ExitError(\"Missing IR op name. Needs to be a string\")\n\n            # Set the op name\n            OpDef.Name = RHS[0]\n\n            # Parse the arguments\n            if len(RHS) > 1:\n                Arguments = RHS[1].strip().split(\",\")\n                for Argument in Arguments:\n                    Argument = Argument.strip()\n                    OpArg = OpArgument()\n\n                    Split = Argument.split(\":\", 1)\n                    if len(Split) != 2:\n                        ExitError(\"Error parsing argument. Missing Type and name colon split\")\n\n                    # Type is the first argument\n                    OpArg.Type = Split[0]\n\n                    # Validate typing is in our type map\n                    if not OpArg.Type in IRTypesToCXX:\n                        ExitError(\"IR type {} isn't in IR type map. From IR op {}, argument {}\".format(OpArg.Type, OpDef.Name, Argument))\n\n                    # Style is the first byte of the name\n                    if Split[1][0] == \"#\":\n                        OpArg.Temporary = True\n                        OpArg.IsSSA = False\n                    elif Split[1][0] == \"$\":\n                        OpArg.Temporary = False\n                        OpArg.IsSSA = is_ssa_type(OpArg.Type)\n                        if OpArg.IsSSA:\n                            OpDef.SSAArgNum = OpDef.SSAArgNum + 1\n                        else:\n                            OpDef.NonSSAArgNum = OpDef.NonSSAArgNum + 1\n                    else:\n                        ExitError(\"IR Op {} missing value argument style specifier. Needs to be one of {{#, $}}\".format(OpDef.Name))\n\n                    Prefix = Split[1][0]\n                    ArgName = Split[1][1:]\n                    NameWithPrefix = Prefix + ArgName\n\n                    if len(ArgName) == 0:\n                        ExitError(\"Argument is missing variable name\")\n\n                    DefaultInit = ArgName.split(\"{\", 1)\n                    if len(DefaultInit) > 1:\n                        # We have a default initializer, need to do some more work\n                        # First argument will still be the argument name\n                        ArgName = DefaultInit[0].strip()\n                        NameWithPrefix = Prefix + ArgName\n                        # Second argument will be the default initializer\n                        # Since we stripped the opening curly brace then it'll end with a closing brace\n                        if DefaultInit[1][-1] != \"}\":\n                            ExitError(\"IR op {} Argument {} is missing closing curly brace in default initializer?\".format(OpDef.Name, ArgName))\n\n                        OpArg.DefaultInitializer = DefaultInit[1][:-1]\n\n                    # If SSA type then we can generate validation for this op\n                    if OpArg.IsSSA and OpArg.Type in {\"GPR\", \"GPRPair\", \"FPR\"}:\n                        OpDef.EmitValidation.append(f\"GetOpRegClass({ArgName}) == RegClass::Invalid || WalkFindRegClass({ArgName}) == RegClass::{OpArg.Type}\")\n\n                    OpArg.Name = ArgName\n                    OpArg.NameWithPrefix = NameWithPrefix\n                    OpDef.Arguments.append(OpArg)\n\n            # Additional metadata\n            if \"DestSize\" in op_val:\n                OpDef.DestSize = op_val[\"DestSize\"]\n\n            if \"ElementSize\" in op_val:\n                OpDef.ElementSize = op_val[\"ElementSize\"]\n\n            if len(op_class):\n                OpDef.OpClass = op_class\n\n            if \"HasSideEffects\" in op_val:\n                OpDef.HasSideEffects = bool(op_val[\"HasSideEffects\"])\n\n            if \"ImplicitFlagClobber\" in op_val:\n                OpDef.ImplicitFlagClobber = bool(op_val[\"ImplicitFlagClobber\"])\n\n            if \"ArgPrinter\" in op_val:\n                OpDef.ArgPrinter = bool(op_val[\"ArgPrinter\"])\n\n            if \"RAOverride\" in op_val:\n                OpDef.RAOverride = int(op_val[\"RAOverride\"])\n\n            if \"SwitchGen\" in op_val:\n                OpDef.SwitchGen = op_val[\"SwitchGen\"]\n\n            if \"EmitValidation\" in op_val:\n                OpDef.EmitValidation.extend(op_val[\"EmitValidation\"])\n\n            if \"Desc\" in op_val:\n                OpDef.Desc = op_val[\"Desc\"]\n\n            if \"DynamicDispatch\" in op_val:\n                OpDef.DynamicDispatch = bool(op_val[\"DynamicDispatch\"])\n\n            if \"JITDispatch\" in op_val:\n                OpDef.JITDispatch = bool(op_val[\"JITDispatch\"])\n\n            if \"JITDispatchOverride\" in op_val:\n                OpDef.JITDispatchOverride = op_val[\"JITDispatchOverride\"]\n\n            if \"X87\" in op_val:\n                OpDef.LoweredX87 = op_val[\"X87\"]\n\n                # X87 implies !JITDispatch\n                assert(\"JITDispatch\" not in op_val)\n                OpDef.JITDispatch = False\n\n            if \"TiedSource\" in op_val:\n                OpDef.TiedSource = op_val[\"TiedSource\"]\n\n            # Pad Inline out to the argument count\n            OpDef.Inline = [''] * len(OpDef.Arguments)\n            if \"Inline\" in op_val:\n                Value = op_val[\"Inline\"]\n                OpDef.Inline[0:len(Value)] = Value\n\n            # Do some fixups of the data here\n            if len(OpDef.EmitValidation) != 0:\n                for i in range(len(OpDef.EmitValidation)):\n                    # Patch up all the argument names\n                    for Arg in OpDef.Arguments:\n                        # Temporary ops just replace all instances no prefix variant\n                        OpDef.EmitValidation[i] = OpDef.EmitValidation[i].replace(Arg.NameWithPrefix, Arg.Name)\n\n            #OpDef.print()\n\n            # Error on duplicate op\n            if OpDef.Name in IROpNameSet:\n                ExitError(\"Duplicate Op defined! {}\".format(OpDef.Name))\n\n            IROps.append(OpDef)\n            IROpNameSet.add(OpDef.Name)\n\n# Print out enum values\ndef print_enums(enums):\n    output_file.write(\"#ifdef IROP_ENUM\\n\")\n    output_file.write(\"enum IROps : uint16_t {\\n\")\n    for op in IROps:\n        output_file.write(\"\\tOP_{},\\n\" .format(op.Name.upper()))\n    output_file.write(\"};\\n\")\n\n    for name, members in enums.items():\n        output_file.write(f\"enum {name} {{\\n\")\n        for member in members:\n            if member:\n                output_file.write(f\"\\t{member}\\n\")\n            else:\n                output_file.write(\"\\n\")\n        output_file.write(\"};\\n\\n\")\n\n    output_file.write(\"#undef IROP_ENUM\\n\")\n    output_file.write(\"#endif\\n\\n\")\n\ndef print_ir_structs(defines):\n    output_file.write(\"#ifdef IROP_STRUCTS\\n\")\n\n    # Print out defines here\n    for op_val in defines:\n        if op_val:\n            output_file.write(\"\\t%s;\\n\" % op_val)\n        else:\n            output_file.write(\"\\n\")\n\n    # Emit the default struct first\n    output_file.write(\"// Default structs\\n\")\n    output_file.write(\"struct __attribute__((packed)) IROp_Header {\\n\")\n    output_file.write(\"\\tvoid* Data[0];\\n\")\n    output_file.write(\"\\tIROps Op;\\n\\n\")\n    output_file.write(\"\\tIR::OpSize Size;\\n\")\n    output_file.write(\"\\tIR::OpSize ElementSize;\\n\")\n\n    output_file.write(\"\\ttemplate<typename T>\\n\")\n    output_file.write(\"\\tT const* C() const { return reinterpret_cast<T const*>(Data); }\\n\")\n    output_file.write(\"\\ttemplate<typename T>\\n\")\n    output_file.write(\"\\tT* CW() { return reinterpret_cast<T*>(Data); }\\n\")\n\n    output_file.write(\"\\tOrderedNodeWrapper Args[0];\\n\")\n\n    output_file.write(\"};\\n\\n\");\n    output_file.write(\"static_assert(sizeof(IROp_Header) == sizeof(uint32_t), \\\"IROp_Header should be 32-bits in size\\\");\\n\\n\");\n\n    # Now the user defined types\n    output_file.write(\"// User defined IR Op structs\\n\")\n    for op in IROps:\n        output_file.write(\"struct __attribute__((packed)) IROp_{} {{\\n\".format(op.Name))\n        output_file.write(\"\\tIROp_Header Header;\\n\")\n\n        # SSA arguments have a hard requirement to appear after the header\n        if op.SSAArgNum > 0:\n            output_file.write(\"\\t// SSA arguments\\n\")\n\n            # Walk the SSA arguments and place them in order of declaration\n            for arg in op.Arguments:\n                if arg.IsSSA:\n                    output_file.write(\"\\tOrderedNodeWrapper {};\\n\".format(arg.Name));\n\n        # Non-SSA arguments are also placed in order of declaration, after SSA though\n        if op.NonSSAArgNum > 0:\n            output_file.write(\"\\t// Non-SSA arguments\\n\")\n            for arg in op.Arguments:\n                if not arg.Temporary and not arg.IsSSA:\n                    CType = IRTypesToCXX[arg.Type].CXXName\n                    output_file.write(\"\\t{} {};\\n\".format(CType, arg.Name));\n\n        output_file.write(\"\\tstatic constexpr IROps OPCODE = OP_{};\\n\".format(op.Name.upper()))\n\n\n        if op.SSAArgNum > 0:\n            output_file.write(\"\\t// Get index of argument by name\\n\")\n            SSAArg = 0\n            for arg in op.Arguments:\n                if arg.IsSSA:\n                    output_file.write(\"\\tstatic constexpr size_t {}_Index = {};\\n\".format(arg.Name, SSAArg))\n                    SSAArg = SSAArg + 1\n\n\n        output_file.write(\"};\\n\")\n\n        # Add a static assert that the IR ops must be pod\n        output_file.write(\"static_assert(std::is_trivially_copyable_v<IROp_{}>);\\n\".format(op.Name))\n        output_file.write(\"static_assert(std::is_standard_layout_v<IROp_{}>);\\n\\n\".format(op.Name))\n\n    output_file.write(\"#undef IROP_STRUCTS\\n\")\n    output_file.write(\"#endif\\n\\n\")\n\n# Print out const expression to calculate IR Op sizes\ndef print_ir_sizes():\n    output_file.write(\"#ifdef IROP_SIZES\\n\")\n\n    output_file.write(\"constexpr std::array<size_t, IROps::OP_LAST + 1> IRSizes = {\\n\")\n    for op in IROps:\n        if op.Name == \"Last\":\n            output_file.write(\"\\t-1ULL,\\n\")\n        else:\n            output_file.write(f\"\\tsizeof(IROp_{op.Name}),\\n\")\n\n    output_file.write(textwrap.dedent(\"\"\"\n    };\n\n    // Make sure our array maps directly to the IROps enum\n    static_assert(IRSizes[IROps::OP_LAST] == -1ULL);\n\n    [[nodiscard]] inline size_t GetSize(IROps Op) { return IRSizes[Op]; }\n    [[nodiscard, gnu::const]] std::string_view const& GetName(IROps Op);\n    [[nodiscard, gnu::const]] uint8_t GetArgs(IROps Op);\n    [[nodiscard, gnu::const]] uint8_t GetRAArgs(IROps Op);\n    [[nodiscard, gnu::const]] FEXCore::IR::RegClass GetRegClass(IROps Op);\n    [[nodiscard, gnu::const]] bool HasSideEffects(IROps Op);\n    [[nodiscard, gnu::const]] bool ImplicitFlagClobber(IROps Op);\n    [[nodiscard, gnu::const]] bool GetHasDest(IROps Op);\n    [[nodiscard, gnu::const]] bool LoweredX87(IROps Op);\n    [[nodiscard, gnu::const]] int8_t TiedSource(IROps Op);\n\n    #undef IROP_SIZES\n    #endif\n    \"\"\"))\n\ndef print_ir_reg_classes():\n    output_file.write(\"#ifdef IROP_REG_CLASSES_IMPL\\n\")\n\n    output_file.write(\"constexpr std::array<FEXCore::IR::RegClass, IROps::OP_LAST + 1> IRRegClasses = {\\n\")\n    for op in IROps:\n        if op.Name == \"Last\":\n            output_file.write(\"\\tRegClass::Invalid,\\n\")\n        else:\n            if op.HasDest and op.DestType is None:\n                ExitError(\"IR op {} has destination with no destination class\".format(op.Name))\n\n            if op.HasDest and op.DestType == \"SSA\": # Special case SSA type\n                output_file.write(\"\\tRegClass::Complex,\\n\")\n            elif op.HasDest:\n                output_file.write(\"\\tRegClass::{},\\n\".format(op.DestType))\n            else:\n                # No destination so it has an invalid destination class\n                output_file.write(\"\\tRegClass::Invalid, // No destination\\n\")\n\n\n    output_file.write(\"};\\n\\n\")\n\n    output_file.write(\"// Make sure our array maps directly to the IROps enum\\n\")\n    output_file.write(\"static_assert(IRRegClasses[IROps::OP_LAST] == RegClass::Invalid);\\n\\n\")\n\n    output_file.write(\"FEXCore::IR::RegClass GetRegClass(IROps Op) { return IRRegClasses[Op]; }\\n\\n\")\n\n    output_file.write(\"#undef IROP_REG_CLASSES_IMPL\\n\")\n    output_file.write(\"#endif\\n\\n\")\n\n# Print out the name printer implementation\ndef print_ir_getname():\n    output_file.write(\"#ifdef IROP_GETNAME_IMPL\\n\")\n    output_file.write(\"constexpr std::array<std::string_view const, OP_LAST + 1> IRNames = {\\n\")\n    for op in IROps:\n        output_file.write(\"\\t\\\"{}\\\",\\n\".format(op.Name))\n\n    output_file.write(\"};\\n\\n\")\n\n    output_file.write(\"static_assert(IRNames[OP_LAST] == \\\"Last\\\");\\n\\n\")\n\n    output_file.write(\"std::string_view const& GetName(IROps Op) {\\n\")\n    output_file.write(\"  return IRNames[Op];\\n\")\n    output_file.write(\"}\\n\")\n\n    output_file.write(\"#undef IROP_GETNAME_IMPL\\n\")\n    output_file.write(\"#endif\\n\\n\")\n\n# Print out the number of SSA args that need to be RA'd\ndef print_ir_getraargs():\n    output_file.write(\"#ifdef IROP_GETRAARGS_IMPL\\n\")\n\n    output_file.write(\"constexpr std::array<uint8_t, OP_LAST + 1> IRRAArgs = {\\n\")\n    for op in IROps:\n        SSAArgs = op.SSAArgNum\n\n        if op.RAOverride != -1:\n            if op.RAOverride > op.SSAArgNum:\n                ExitError(\"Op {} has RA override of {} which is more than total SSA values {}. This doesn't work\".format(op.Name, op.RAOverride, op.SSAArgNum))\n            SSAArgs = op.RAOverride\n\n        output_file.write(\"\\t{},\\n\".format(SSAArgs))\n\n    output_file.write(\"};\\n\\n\")\n\n\n    output_file.write(\"constexpr std::array<uint8_t, OP_LAST + 1> IRArgs = {\\n\")\n    for op in IROps:\n        SSAArgs = op.SSAArgNum\n        output_file.write(\"\\t{},\\n\".format(SSAArgs))\n\n    output_file.write(\"};\\n\\n\")\n\n    output_file.write(\"uint8_t GetRAArgs(IROps Op) {\\n\")\n    output_file.write(\"  return IRRAArgs[Op];\\n\")\n    output_file.write(\"}\\n\")\n\n    output_file.write(\"uint8_t GetArgs(IROps Op) {\\n\")\n    output_file.write(\"  return IRArgs[Op];\\n\")\n    output_file.write(\"}\\n\")\n\n    output_file.write(\"#undef IROP_GETRAARGS_IMPL\\n\")\n    output_file.write(\"#endif\\n\\n\")\n\ndef print_ir_hassideeffects():\n    output_file.write(\"#ifdef IROP_HASSIDEEFFECTS_IMPL\\n\")\n\n    for prop, T in [\n        (\"HasSideEffects\", \"bool\"),\n        (\"ImplicitFlagClobber\", \"bool\"),\n        (\"LoweredX87\", \"bool\"),\n        (\"TiedSource\", \"int8_t\"),\n    ]:\n        output_file.write(\n            f\"constexpr std::array<{'uint8_t' if T == 'bool' else T}, OP_LAST + 1> {prop}_ = {{\\n\"\n        )\n        for op in IROps:\n            if T == \"bool\":\n                output_file.write(\n                    \"\\t{},\\n\".format((\"true\" if getattr(op, prop) else \"false\"))\n                )\n            else:\n                output_file.write(f\"\\t{getattr(op, prop)},\\n\")\n\n        output_file.write(\"};\\n\\n\")\n\n        output_file.write(f\"{T} {prop}(IROps Op) {{\\n\")\n        output_file.write(f\"  return {prop}_[Op];\\n\")\n        output_file.write(\"}\\n\")\n\n    output_file.write(\"#undef IROP_HASSIDEEFFECTS_IMPL\\n\")\n    output_file.write(\"#endif\\n\\n\")\n\ndef print_ir_gethasdest():\n    output_file.write(\"#ifdef IROP_GETHASDEST_IMPL\\n\")\n\n    output_file.write(\"constexpr std::array<bool, OP_LAST + 1> IRDest = {\\n\")\n    for op in IROps:\n        if op.HasDest:\n            output_file.write(\"\\ttrue,\\n\")\n        else:\n            output_file.write(\"\\tfalse,\\n\")\n\n    output_file.write(\"};\\n\\n\")\n\n    output_file.write(\"bool GetHasDest(IROps Op) {\\n\")\n    output_file.write(\"  return IRDest[Op];\\n\")\n    output_file.write(\"}\\n\")\n\n    output_file.write(\"#undef IROP_GETHASDEST_IMPL\\n\")\n    output_file.write(\"#endif\\n\\n\")\n\n# Print out IR argument printing\ndef print_ir_arg_printer():\n    output_file.write(\"#ifdef IROP_ARGPRINTER_HELPER\\n\")\n    output_file.write(\"switch (IROp->Op) {\\n\")\n    for op in IROps:\n        if not op.ArgPrinter:\n            continue\n\n        output_file.write(\"case IROps::OP_{}: {{\\n\".format(op.Name.upper()))\n\n        if len(op.Arguments) != 0:\n            output_file.write(\"\\t[[maybe_unused]] auto Op = IROp->C<IR::IROp_{}>();\\n\".format(op.Name))\n            output_file.write(\"\\t*out << \\\" \\\";\\n\")\n\n            SSAArgNum = 0\n            FirstArg = True\n            for arg in op.Arguments:\n                # No point printing temporaries that we can't recover\n                if arg.Temporary:\n                    continue\n\n                if FirstArg:\n                    FirstArg = False\n                else:\n                    output_file.write('\\t*out << \", \";\\n')\n\n                if arg.IsSSA:\n                    # SSA value\n                    output_file.write(\"\\tPrintArg(out, IR, Op->Header.Args[{}]);\\n\".format(SSAArgNum))\n                    SSAArgNum = SSAArgNum + 1\n                else:\n                    # User defined op that is stored\n                    output_file.write(\"\\tPrintArg(out, IR, Op->{});\\n\".format(arg.Name))\n\n        output_file.write(\"break;\\n\")\n        output_file.write(\"}\\n\")\n\n    output_file.write(\"#undef IROP_ARGPRINTER_HELPER\\n\")\n    output_file.write(\"#endif\\n\")\n\ndef print_validation(op):\n    if len(op.EmitValidation) != 0:\n        output_file.write(\"#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\\n\")\n\n        for Validation in op.EmitValidation:\n            Sanitized = Validation.replace(\"\\\"\", \"\\\\\\\"\")\n            output_file.write(\"\\t\\tLOGMAN_THROW_A_FMT({}, \\\"{}\\\");\\n\".format(Validation, Sanitized))\n        output_file.write(\"#endif\\n\")\n\n# Print out IR allocator helpers\ndef print_ir_allocator_helpers():\n    output_file.write(\"#ifdef IROP_ALLOCATE_HELPERS\\n\")\n\n    output_file.write(\"\\ttemplate <class T>\\n\")\n    output_file.write(\"\\tstruct Wrapper final {\\n\")\n    output_file.write(\"\\t\\tT *first;\\n\")\n    output_file.write(\"\\t\\tOrderedNode *Node; ///< Actual offset of this IR in ths list\\n\")\n    output_file.write(\"\\n\")\n    output_file.write(\"\\t\\toperator Wrapper<IROp_Header>() const { return Wrapper<IROp_Header> {reinterpret_cast<IROp_Header*>(first), Node}; }\\n\")\n    output_file.write(\"\\t\\toperator OrderedNode *() { return Node; }\\n\")\n    output_file.write(\"\\t\\toperator const OrderedNode *() const { return Node; }\\n\")\n    output_file.write(\"\\t\\toperator OpNodeWrapper () const { return Node->Header.Value; }\\n\")\n    output_file.write(\"\\t};\\n\")\n\n    output_file.write(\"\\ttemplate <class T>\\n\")\n    output_file.write(\"\\tusing IRPair = Wrapper<T>;\\n\\n\")\n\n    output_file.write(\"\\tIRPair<IROp_Header> AllocateRawOp(size_t HeaderSize) {\\n\")\n    output_file.write(\"\\t\\tauto Op = reinterpret_cast<IROp_Header*>(DualListData.DataAllocate(HeaderSize));\\n\")\n    output_file.write(\"\\t\\tmemset(Op, 0, HeaderSize);\\n\")\n    output_file.write(\"\\t\\tOp->Op = IROps::OP_DUMMY;\\n\")\n    output_file.write(\"\\t\\treturn IRPair<IROp_Header>{Op, CreateNode(Op)};\\n\")\n    output_file.write(\"\\t}\\n\\n\")\n\n    output_file.write(\"\\ttemplate<class T, IROps T2>\\n\")\n    output_file.write(\"\\tT *AllocateOrphanOp() {\\n\")\n    output_file.write(\"\\t\\tsize_t Size = FEXCore::IR::GetSize(T2);\\n\")\n    output_file.write(\"\\t\\tauto Op = reinterpret_cast<T*>(DualListData.DataAllocate(Size));\\n\")\n    output_file.write(\"\\t\\tmemset(Op, 0, Size);\\n\")\n    output_file.write(\"\\t\\tOp->Header.Op = T2;\\n\")\n    output_file.write(\"\\t\\treturn Op;\\n\")\n    output_file.write(\"\\t}\\n\\n\")\n\n    output_file.write(\"\\ttemplate<class T, IROps T2>\\n\")\n    output_file.write(\"\\tIRPair<T> AllocateOp() {\\n\")\n    output_file.write(\"\\t\\tsize_t Size = FEXCore::IR::GetSize(T2);\\n\")\n    output_file.write(\"\\t\\tauto Op = reinterpret_cast<T*>(DualListData.DataAllocate(Size));\\n\")\n    output_file.write(\"\\t\\tmemset(Op, 0, Size);\\n\")\n    output_file.write(\"\\t\\tOp->Header.Op = T2;\\n\")\n    output_file.write(\"\\t\\treturn IRPair<T>{Op, CreateNode(&Op->Header)};\\n\")\n    output_file.write(\"\\t}\\n\\n\")\n\n    output_file.write(\"\\tIR::OpSize GetOpSize(const OrderedNode *Op) const {\\n\")\n    output_file.write(\"\\t\\tauto HeaderOp = Op->Header.Value.GetNode(DualListData.DataBegin());\\n\")\n    output_file.write(\"\\t\\treturn HeaderOp->Size;\\n\")\n    output_file.write(\"\\t}\\n\\n\")\n\n    output_file.write(\"\\tIR::OpSize GetOpElementSize(const OrderedNode *Op) const {\\n\")\n    output_file.write(\"\\t\\tauto HeaderOp = Op->Header.Value.GetNode(DualListData.DataBegin());\\n\")\n    output_file.write(\"\\t\\treturn HeaderOp->ElementSize;\\n\")\n    output_file.write(\"\\t}\\n\\n\")\n\n    output_file.write(\"\\tuint8_t GetOpElements(const OrderedNode *Op) const {\\n\")\n    output_file.write(\"\\t\\tLOGMAN_THROW_A_FMT(OpHasDest(Op), \\\"Op {} has no dest\\\\n\\\", GetOpName(Op));\\n\")\n    output_file.write(\"\\t\\treturn IR::OpSizeToSize(GetOpSize(Op)) / IR::OpSizeToSize(GetOpElementSize(Op));\\n\")\n    output_file.write(\"\\t}\\n\\n\")\n\n    output_file.write(\"\\tbool OpHasDest(const OrderedNode *Op) const {\\n\")\n    output_file.write(\"\\t\\tauto HeaderOp = Op->Header.Value.GetNode(DualListData.DataBegin());\\n\")\n    output_file.write(\"\\t\\treturn GetHasDest(HeaderOp->Op);\\n\")\n    output_file.write(\"\\t}\\n\\n\")\n\n    output_file.write(\"\\tIROps GetOpType(const OrderedNode *Op) const {\\n\")\n    output_file.write(\"\\t\\tauto HeaderOp = Op->Header.Value.GetNode(DualListData.DataBegin());\\n\")\n    output_file.write(\"\\t\\treturn HeaderOp->Op;\\n\")\n    output_file.write(\"\\t}\\n\\n\")\n\n    output_file.write(\"\\tFEXCore::IR::RegClass GetOpRegClass(const OrderedNode *Op) const {\\n\")\n    output_file.write(\"\\t\\treturn GetRegClass(GetOpType(Op));\\n\")\n    output_file.write(\"\\t}\\n\\n\")\n\n    output_file.write(\"\\tstd::string_view const& GetOpName(const OrderedNode *Op) const {\\n\")\n    output_file.write(\"\\t\\treturn IR::GetName(GetOpType(Op));\\n\")\n    output_file.write(\"\\t}\\n\\n\")\n\n    # Generate helpers with operands\n    for op in IROps:\n        if op.Name != \"Last\":\n            output_file.write(\"\\t///\\n\".join([\"\\t/// {}\\n\" .format(comment) for comment in op.Desc]))\n            output_file.write(\"\\tIRPair<IROp_{}> _{}(\" .format(op.Name, op.Name))\n\n            # Output SSA args first\n            for i, arg in enumerate(op.Arguments):\n                LastArg = i == len(op.Arguments) - 1\n\n                if arg.Temporary:\n                    CType = IRTypesToCXX[arg.Type].CXXName\n                    output_file.write(\"{} {}\".format(CType, arg.Name))\n                elif arg.IsSSA:\n                    # SSA value\n                    output_file.write(\"OrderedNodeWrapper {}\".format(arg.Name))\n                else:\n                    # User defined op that is stored\n                    CType = IRTypesToCXX[arg.Type].CXXName\n                    output_file.write(\"{} {}\".format(CType, arg.Name))\n\n                if arg.DefaultInitializer:\n                    output_file.write(\" = {}\".format(arg.DefaultInitializer))\n\n                if not LastArg:\n                    output_file.write(\", \")\n\n            output_file.write(\") {\\n\")\n\n            # Save NZCV if needed before clobbering NZCV\n            if op.ImplicitFlagClobber:\n                output_file.write(\"\\t\\tSaveNZCV(IROps::OP_{});\".format(op.Name.upper()))\n\n            # We gather the \"has x87?\" flag as we go. This saves the user from\n            # having to keep track of whether they emitted any x87.\n            # Also changes the mmx state to X87.\n            if op.LoweredX87:\n                output_file.write(\"\\t\\tRecordX87Use();\\n\")\n                output_file.write(\n                    \"\\t\\tif(MMXState == MMXState_MMX) ChgStateMMX_X87();\\n\"\n                )\n\n            output_file.write(\"\\t\\tauto _Op = AllocateOp<IROp_{}, IROps::OP_{}>();\\n\".format(op.Name, op.Name.upper()))\n\n            if op.SSAArgNum != 0:\n                for arg in op.Arguments:\n                    if arg.IsSSA:\n                        output_file.write(\"\\t\\t_Op.first->{} = {};\\n\".format(arg.Name, arg.Name))\n\n            if len(op.Arguments) != 0:\n                for arg in op.Arguments:\n                    if not arg.Temporary and not arg.IsSSA:\n                        output_file.write(\"\\t\\t_Op.first->{} = {};\\n\".format(arg.Name, arg.Name))\n\n            assert not (op.HasDest and op.DestSize is None)\n\n            # Some ops without a destination still need an operating size\n            # Effectively reusing the destination size value for operation size\n            if op.DestSize != None:\n                output_file.write(\"\\t\\t_Op.first->Header.Size = {};\\n\".format(op.DestSize))\n\n            if op.ElementSize == None:\n                output_file.write(\"\\t\\t_Op.first->Header.ElementSize = _Op.first->Header.Size;\\n\")\n            else:\n                output_file.write(\"\\t\\t_Op.first->Header.ElementSize = {};\\n\".format(op.ElementSize))\n\n\n            # Only validate here if there's no OrderedNode * version. Else\n            # validation is in that version, see the comment below.\n            if op.SSAArgNum == 0:\n                print_validation(op)\n\n            output_file.write(\"\\t\\treturn _Op;\\n\")\n            output_file.write(\"\\t}\\n\\n\")\n\n            # Now do the OrderedNode * version if necessary\n            if op.SSAArgNum:\n                output_file.write(\"\\t///\\n\".join([\"\\t/// {}\\n\" .format(comment) for comment in op.Desc]))\n                output_file.write(\"\\tIRPair<IROp_{}> _{}(\" .format(op.Name, op.Name))\n\n                for i, arg in enumerate(op.Arguments):\n                    LastArg = i == len(op.Arguments) - 1\n\n                    if arg.Temporary:\n                        CType = IRTypesToCXX[arg.Type].CXXName\n                        output_file.write(\"{} {}\".format(CType, arg.Name))\n                    elif arg.IsSSA:\n                        output_file.write(\"OrderedNode *{}\".format(arg.Name))\n                    else:\n                        CType = IRTypesToCXX[arg.Type].CXXName\n                        output_file.write(\"{} {}\".format(CType, arg.Name))\n\n                    if arg.DefaultInitializer:\n                        output_file.write(\" = {}\".format(arg.DefaultInitializer))\n\n                    if not LastArg:\n                        output_file.write(\", \")\n\n                output_file.write(\") {\\n\")\n                output_file.write(\"\\t\\tauto ListDataBegin = DualListData.ListBegin();\\n\")\n\n                idx = 0\n                for arg in op.Arguments:\n                    if arg.IsSSA:\n                        # Inline an immediate if we can\n                        inline = op.Inline[idx]\n                        idx += 1\n\n                        if inline != '':\n                            Sized = \"Size\" in [x.Name for x in op.Arguments]\n                            P = [\"Size\" if Sized else \"OpSize::i64Bit\", arg.Name]\n\n                            # A few cases need extra info plumbed.\n                            if inline == \"SubtractZero\":\n                                P += [\"Src2\"]\n                            elif inline == \"Mem\":\n                                P += [\"OffsetType\", \"OffsetScale\"]\n                            elif inline == \"Memtso\":\n                                P += [\"OffsetType\", \"OffsetScale\", \"true /* TSO */\"]\n                                inline = \"Mem\"\n\n                            output_file.write(f\"\\t\\t{arg.Name} = Inline{inline}({', '.join(P)});\\n\")\n\n                        output_file.write(f\"\\t\\t{arg.Name}->AddUse();\\n\")\n\n                # Insert validation here. This is skipped for the\n                # OrderedNodeWrapper version because validation can depend on\n                # the OrderedNode, but that's ok in practice. Everything pre-RA\n                # uses the OrderedNode version, and anything RA-onwards is\n                # dubious to validate.\n                print_validation(op)\n\n                output_file.write(f\"\\t\\treturn _{op.Name}(\")\n                for i, arg in enumerate(op.Arguments):\n                    LastArg = i == len(op.Arguments) - 1\n                    output_file.write(arg.Name)\n                    if arg.IsSSA:\n                        output_file.write(\"->Wrapped(ListDataBegin)\")\n                    if not LastArg:\n                        output_file.write(\", \")\n                output_file.write(\");\\n\")\n                output_file.write(\"\\t}\\n\\n\")\n\n    output_file.write(\"#undef IROP_ALLOCATE_HELPERS\\n\")\n    output_file.write(\"#endif\\n\")\n\ndef print_ir_dispatcher_defs():\n    output_dispatch_file.write(\"#ifdef IROP_DISPATCH_DEFS\\n\")\n    for op in IROps:\n        if op.Name != \"Last\" and op.SwitchGen and op.JITDispatch and op.JITDispatchOverride == None:\n            output_dispatch_file.write(\"DEF_OP({});\\n\".format(op.Name))\n\n    output_dispatch_file.write(\"#undef IROP_DISPATCH_DEFS\\n\")\n    output_dispatch_file.write(\"#endif\\n\")\n\ndef print_ir_dispatcher_dispatch():\n    output_dispatch_file.write(\"#ifdef IROP_DISPATCH_DISPATCH\\n\")\n    for op in IROps:\n        if op.Name != \"Last\" and op.JITDispatch:\n            DispatchName = op.Name\n            if op.JITDispatchOverride != None:\n                DispatchName = op.JITDispatchOverride\n\n            if (op.DynamicDispatch):\n                output_dispatch_file.write(\"REGISTER_OP_RT({}, {});\\n\".format(op.Name.upper(), DispatchName))\n            else:\n                output_dispatch_file.write(\"REGISTER_OP({}, {});\\n\".format(op.Name.upper(), DispatchName))\n\n    output_dispatch_file.write(\"#undef IROP_DISPATCH_DISPATCH\\n\")\n    output_dispatch_file.write(\"#endif\\n\")\n\n\nif len(sys.argv) < 4:\n    ExitError(\"Insufficient parameters passed to script\")\n\noutput_filename = sys.argv[2]\noutput_dispatcher_filename = sys.argv[3]\n\njson_file = open(sys.argv[1], \"r\")\njson_text = json_file.read()\njson_file.close()\n\njson_object = json.loads(json_text)\njson_object = {k.upper(): v for k, v in json_object.items()}\n\nenums = json_object[\"ENUMS\"]\nops = json_object[\"OPS\"]\nirtypes = json_object[\"IRTYPES\"]\ndefines = json_object[\"DEFINES\"]\n\nparse_irtypes(irtypes)\nparse_ops(ops)\n\noutput_file = open(output_filename, \"w\")\n\nprint_enums(enums)\nprint_ir_structs(defines)\nprint_ir_sizes()\nprint_ir_reg_classes()\nprint_ir_getname()\nprint_ir_getraargs()\nprint_ir_hassideeffects()\nprint_ir_gethasdest()\nprint_ir_arg_printer()\nprint_ir_allocator_helpers()\n\noutput_file.close()\n\noutput_dispatch_file = open(output_dispatcher_filename, \"w\")\nprint_ir_dispatcher_defs()\nprint_ir_dispatcher_dispatch()\n\noutput_dispatch_file.close()\n"
  },
  {
    "path": "FEXCore/Source/CMakeLists.txt",
    "content": "set(MAN_DIR share/man CACHE PATH \"MAN_DIR\")\n\nset(FEXCORE_BASE_SRCS\n  Interface/Config/Config.cpp\n  Utils/Allocator.cpp\n  Utils/FileLoading.cpp\n  Utils/ForcedAssert.cpp\n  Utils/LogManager.cpp\n  Utils/SpinWaitLock.cpp)\n\nif (NOT MINGW)\n  list(APPEND FEXCORE_BASE_SRCS\n    Utils/Allocator/64BitAllocator.cpp)\nendif()\n\nset(SRCS\n  Common/JitSymbols.cpp\n  Interface/Context/Context.cpp\n  Interface/Core/LookupCache.cpp\n  Interface/Core/CodeCache.cpp\n  Interface/Core/Core.cpp\n  Interface/Core/CPUBackend.cpp\n  Interface/Core/Addressing.cpp\n  Interface/Core/CPUID.cpp\n  Interface/Core/Frontend.cpp\n  Interface/Core/OpcodeDispatcher/AVX_128.cpp\n  Interface/Core/OpcodeDispatcher/Crypto.cpp\n  Interface/Core/OpcodeDispatcher/Flags.cpp\n  Interface/Core/OpcodeDispatcher/Vector.cpp\n  Interface/Core/OpcodeDispatcher/X87.cpp\n  Interface/Core/OpcodeDispatcher/X87F64.cpp\n  Interface/Core/OpcodeDispatcher.cpp\n  Interface/Core/ArchHelpers/Arm64Emitter.cpp\n  Interface/Core/Dispatcher/Dispatcher.cpp\n  Interface/Core/Interpreter/Fallbacks/InterpreterFallbacks.cpp\n  Interface/Core/Interpreter/Fallbacks/StringCompareFallbacks.cpp\n  Interface/Core/JIT/JIT.cpp\n  Interface/Core/JIT/ALUOps.cpp\n  Interface/Core/JIT/AtomicOps.cpp\n  Interface/Core/JIT/BranchOps.cpp\n  Interface/Core/JIT/ConversionOps.cpp\n  Interface/Core/JIT/EncryptionOps.cpp\n  Interface/Core/JIT/MemoryOps.cpp\n  Interface/Core/JIT/MiscOps.cpp\n  Interface/Core/JIT/MoveOps.cpp\n  Interface/Core/JIT/VectorOps.cpp\n  Interface/Core/JIT/Arm64Relocations.cpp\n  Interface/Core/X86Tables/BaseTables.cpp\n  Interface/Core/X86Tables/DDDTables.cpp\n  Interface/Core/X86Tables/H0F38Tables.cpp\n  Interface/Core/X86Tables/H0F3ATables.cpp\n  Interface/Core/X86Tables/PrimaryGroupTables.cpp\n  Interface/Core/X86Tables/SecondaryGroupTables.cpp\n  Interface/Core/X86Tables/SecondaryModRMTables.cpp\n  Interface/Core/X86Tables/SecondaryTables.cpp\n  Interface/Core/X86Tables/VEXTables.cpp\n  Interface/Core/X86Tables/X87Tables.cpp\n  Interface/GDBJIT/GDBJIT.cpp\n  Interface/IR/IRDumper.cpp\n  Interface/IR/IREmitter.cpp\n  Interface/IR/PassManager.cpp\n  Interface/IR/Passes/IRDumperPass.cpp\n  Interface/IR/Passes/IRValidation.cpp\n  Interface/IR/Passes/RedundantFlagCalculationElimination.cpp\n  Interface/IR/Passes/RegisterAllocationPass.cpp\n  Interface/IR/Passes/x87StackOptimizationPass.cpp\n  Utils/LongJump.cpp\n  Utils/Telemetry.cpp\n  Utils/Threads.cpp\n  Utils/Profiler.cpp)\n\nif (ARCHITECTURE_arm64)\n  list(APPEND SRCS Utils/ArchHelpers/Arm64.cpp)\nelse()\n  list(APPEND SRCS Utils/ArchHelpers/Arm64_stubs.cpp)\nendif()\n\nif (ENABLE_GLIBC_ALLOCATOR_HOOK_FAULT)\n  list(APPEND FEXCORE_BASE_SRCS\n    Utils/AllocatorOverride.cpp)\nendif()\n\nset(DEFINES -DJIT_ARM64)\n\nif (ARCHITECTURE_x86_64)\n  list(APPEND DEFINES -DARCHITECTURE_x86_64=1)\nendif()\n\nif (ARCHITECTURE_arm64)\n  list(APPEND DEFINES -DARCHITECTURE_arm64=1)\nendif()\n\nif (ENABLE_VIXL_DISASSEMBLER)\n  list(APPEND DEFINES -DVIXL_DISASSEMBLER=1)\nendif()\n\nif (ENABLE_ZYDIS)\n  list(APPEND DEFINES -DZYDIS_DISASSEMBLER=1)\nendif()\n\nif (ARCHITECTURE_arm64 AND HAS_CLANG_PRESERVE_ALL)\n  list(APPEND DEFINES \"-DFEXCORE_PRESERVE_ALL_ATTR=__attribute__((preserve_all));-DFEXCORE_HAS_PRESERVE_ALL_ATTR=1\")\nelse()\n  list(APPEND DEFINES \"-DFEXCORE_PRESERVE_ALL_ATTR=;-DFEXCORE_HAS_PRESERVE_ALL_ATTR=0\")\nendif()\n\nset(LIBS fmt::fmt xxHash::xxhash FEXHeaderUtils CodeEmitter cephes_128bit)\n\nif (ENABLE_VIXL_DISASSEMBLER OR ENABLE_VIXL_SIMULATOR)\n  list(APPEND LIBS vixl::vixl)\nendif()\n\nif (ENABLE_ZYDIS)\n  list(APPEND LIBS Zydis::Zydis)\nendif()\n\nif (NOT MINGW)\n  list(APPEND LIBS dl)\nelse()\n  list(APPEND LIBS synchronization)\n  if (ARCHITECTURE_arm64ec)\n    list(APPEND LIBS mincore)\n  endif()\nendif()\n\nif (CMAKE_CXX_COMPILER_ID STREQUAL \"GNU\")\n  # GCC requires libatomic to use 128-bit atomics\n  list(APPEND LIBS atomic)\nendif()\n\n# Generate config\nconfigure_file(${CMAKE_CURRENT_SOURCE_DIR}/Interface/Config/Config.json.in\n  ${CMAKE_BINARY_DIR}/generated/Config/Config.json)\n\n# Generate IR include file\nset(OUTPUT_IR_FOLDER \"${CMAKE_BINARY_DIR}/include/FEXCore/IR\")\nset(OUTPUT_NAME \"${OUTPUT_IR_FOLDER}/IRDefines.inc\")\nset(OUTPUT_DISPATCHER_NAME \"${OUTPUT_IR_FOLDER}/IRDefines_Dispatch.inc\")\nset(INPUT_NAME \"${CMAKE_CURRENT_SOURCE_DIR}/Interface/IR/IR.json\")\n\nfile(MAKE_DIRECTORY \"${OUTPUT_IR_FOLDER}\")\n\nadd_custom_command(\n  OUTPUT \"${OUTPUT_NAME}\" \"${OUTPUT_DISPATCHER_NAME}\"\n  DEPENDS \"${INPUT_NAME}\"\n  DEPENDS \"${CMAKE_CURRENT_SOURCE_DIR}/../Scripts/json_ir_generator.py\"\n  COMMAND \"python3\" \"${CMAKE_CURRENT_SOURCE_DIR}/../Scripts/json_ir_generator.py\"\n    \"${INPUT_NAME}\" \"${OUTPUT_NAME}\" \"${OUTPUT_DISPATCHER_NAME}\")\n\nset_source_files_properties(${OUTPUT_NAME} PROPERTIES GENERATED TRUE)\n\n# Generate IR documentation\nset(OUTPUT_IR_DOC \"${CMAKE_BINARY_DIR}/IR.md\")\n\nadd_custom_command(\n  OUTPUT \"${OUTPUT_IR_DOC}\"\n  DEPENDS \"${INPUT_NAME}\"\n  DEPENDS \"${CMAKE_CURRENT_SOURCE_DIR}/../Scripts/json_ir_doc_generator.py\"\n  COMMAND \"python3\" \"${CMAKE_CURRENT_SOURCE_DIR}/../Scripts/json_ir_doc_generator.py\"\n    \"${INPUT_NAME}\" \"${OUTPUT_IR_DOC}\")\n\nset_source_files_properties(${OUTPUT_IR_NAME} PROPERTIES GENERATED TRUE)\n\n# Create the target\nadd_custom_target(IR_INC\n  DEPENDS \"${OUTPUT_NAME}\"\n  DEPENDS \"${OUTPUT_IR_DOC}\")\n\n# Generate the configuration include file\nset(OUTPUT_CONFIG_FOLDER \"${CMAKE_BINARY_DIR}/include/FEXCore/Config\")\nset(OUTPUT_CONFIG_NAME \"${OUTPUT_CONFIG_FOLDER}/ConfigValues.inl\")\nset(OUTPUT_CONFIG_OPTION_NAME \"${OUTPUT_CONFIG_FOLDER}/ConfigOptions.inl\")\nset(INPUT_CONFIG_NAME \"${CMAKE_BINARY_DIR}/generated/Config/Config.json\")\nset(OUTPUT_MAN_NAME \"${CMAKE_BINARY_DIR}/generated/FEX.1\")\nset(OUTPUT_MAN_NAME_COMPRESS \"${CMAKE_BINARY_DIR}/generated/FEX.1.gz\")\n\nfile(MAKE_DIRECTORY \"${OUTPUT_CONFIG_FOLDER}\")\n\nadd_custom_command(\n  OUTPUT \"${OUTPUT_CONFIG_NAME}\"\n  OUTPUT \"${OUTPUT_CONFIG_OPTION_NAME}\"\n  OUTPUT \"${OUTPUT_MAN_NAME}\"\n  DEPENDS \"${INPUT_CONFIG_NAME}\"\n  DEPENDS \"${CMAKE_CURRENT_SOURCE_DIR}/../Scripts/config_generator.py\"\n  COMMAND \"python3\" \"${CMAKE_CURRENT_SOURCE_DIR}/../Scripts/config_generator.py\" \"${INPUT_CONFIG_NAME}\" \"${OUTPUT_CONFIG_NAME}\" \"${OUTPUT_MAN_NAME}\"\n  \"${OUTPUT_CONFIG_OPTION_NAME}\")\n\nadd_custom_command(\n  OUTPUT \"${OUTPUT_MAN_NAME_COMPRESS}\"\n  DEPENDS \"${OUTPUT_MAN_NAME}\"\n  COMMAND \"gzip\" \"-kf9n\" \"${OUTPUT_MAN_NAME}\")\n\nset_source_files_properties(${OUTPUT_CONFIG_NAME} PROPERTIES\n  GENERATED TRUE)\nset_source_files_properties(${OUTPUT_CONFIG_OPTION_NAME} PROPERTIES\n  GENERATED TRUE)\n\nset_source_files_properties(${OUTPUT_MAN_NAME} PROPERTIES\n  GENERATED TRUE)\nset_source_files_properties(${OUTPUT_MAN_NAME_COMPRESS} PROPERTIES\n  GENERATED TRUE)\n\n# Create the target\nadd_custom_target(CONFIG_INC\n  DEPENDS \"${OUTPUT_CONFIG_NAME}\"\n  DEPENDS \"${OUTPUT_CONFIG_OPTION_NAME}\"\n  DEPENDS \"${OUTPUT_MAN_NAME}\"\n  DEPENDS \"${OUTPUT_MAN_NAME_COMPRESS}\")\n\nif (NOT BUILD_STEAM_SUPPORT)\n  # Install the compressed man page\n  install(FILES ${OUTPUT_MAN_NAME_COMPRESS} COMPONENT Runtime DESTINATION ${MAN_DIR}/man1)\nendif()\n\n# Add in diagnostic colours if the option is available.\n# Ninja code generator will kill colours if this isn't here\ncheck_cxx_compiler_flag(-fdiagnostics-color=always GCC_COLOR)\ncheck_cxx_compiler_flag(-fcolor-diagnostics CLANG_COLOR)\n\nfunction(AddDefaultOptionsToTarget Name)\n  set_target_properties(${Name} PROPERTIES C_VISIBILITY_PRESET hidden)\n  set_target_properties(${Name} PROPERTIES CXX_VISIBILITY_PRESET hidden)\n  set_target_properties(${Name} PROPERTIES VISIBILITY_INLINES_HIDDEN TRUE)\n  target_include_directories(${Name} PUBLIC \"${CMAKE_CURRENT_BINARY_DIR}\")\n\n  target_include_directories(${Name} PRIVATE IncludePrivate/)\n  target_include_directories(${Name} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/)\n\n  target_include_directories(${Name} PUBLIC \"${PROJECT_SOURCE_DIR}/include/\")\n  target_include_directories(${Name} PUBLIC \"${CMAKE_BINARY_DIR}/include/\")\n\n  target_compile_definitions(${Name} PRIVATE ${DEFINES})\n  add_dependencies(${Name} CONFIG_INC IR_INC)\n\n  target_compile_options(${Name} PRIVATE\n    -Wall\n    -Werror=cast-qual\n    -Werror=ignored-qualifiers\n    -Werror=implicit-fallthrough\n\n    -Wno-trigraphs\n    -ffunction-sections\n    -fwrapv)\n\n  if (GCC_COLOR)\n    target_compile_options(${Name} PRIVATE \"-fdiagnostics-color=always\")\n  endif()\n\n  if (CLANG_COLOR)\n    target_compile_options(${Name} PRIVATE \"-fcolor-diagnostics\")\n  endif()\n\n  LinkerGC(${Name})\n  target_link_libraries(${Name} PUBLIC unordered_dense::unordered_dense)\nendfunction()\n\n# Build FEXCore_Base static library\nadd_library(FEXCore_Base STATIC ${FEXCORE_BASE_SRCS})\ntarget_link_libraries(FEXCore_Base PUBLIC ${LIBS})\nAddDefaultOptionsToTarget(FEXCore_Base)\n\nif (ENABLE_FEXCORE_PROFILER AND FEXCORE_PROFILER_BACKEND STREQUAL \"TRACY\")\n  target_link_libraries(FEXCore_Base PUBLIC TracyClient)\nendif()\n\nfunction(AddObject Name)\n  add_library(${Name} OBJECT ${SRCS})\n\n  target_link_libraries(${Name} PRIVATE FEXCore_Base)\n  target_compile_options(${Name} PRIVATE ${FEX_TUNE_COMPILE_FLAGS})\n  AddDefaultOptionsToTarget(${Name})\nendfunction()\n\nfunction(AddLibrary Name Type)\n  add_library(${Name} ${Type} $<TARGET_OBJECTS:${PROJECT_NAME}_object>)\n  set_target_properties(${Name} PROPERTIES OUTPUT_NAME FEXCore)\n\n  # During generation of the import library (dll.a), MinGW needs some extra symbols from libraries\n  # such as fmt, which are propagated by FEXCore_Base. Wonderful.\n  if (MINGW)\n    target_link_libraries(${Name} PRIVATE FEXCore_Base)\n  endif()\n  AddDefaultOptionsToTarget(${Name})\nendfunction()\n\nAddObject(${PROJECT_NAME}_object)\nAddLibrary(${PROJECT_NAME} STATIC)\nAddLibrary(${PROJECT_NAME}_shared SHARED)\n\nif (NOT MINGW AND NOT BUILD_STEAM_SUPPORT)\n  install(TARGETS ${PROJECT_NAME}_shared LIBRARY\n    DESTINATION ${CMAKE_INSTALL_LIBDIR}\n    COMPONENT Libraries)\nendif()\n\n# Meta-library to link jemalloc libraries enabled in the build configuration.\n# Only needed for targets that run emulation. For others, use JemallocDummy.\nadd_library(JemallocLibs STATIC Utils/AllocatorHooks.cpp)\nif (ENABLE_FEX_ALLOCATOR)\n  target_compile_definitions(JemallocLibs PRIVATE ENABLE_FEX_ALLOCATOR=1)\n  target_link_libraries(JemallocLibs PUBLIC rpmalloc)\nendif()\nif (ENABLE_JEMALLOC_GLIBC_ALLOC)\n  set_source_files_properties(Interface/HLE/Thunks/Thunks.cpp PROPERTIES COMPILE_DEFINITIONS ENABLE_JEMALLOC_GLIBC=1)\n  target_link_libraries(JemallocLibs INTERFACE FEX_jemalloc_glibc)\nendif()\n\nif (NOT MINGW)\n  # Dummy project to use for host tools.\n  # This overrides use of jemalloc in FEXCore with the normal glibc allocator.\n  add_library(JemallocDummy STATIC Utils/AllocatorHooks.cpp)\n  target_include_directories(JemallocDummy PRIVATE \"${PROJECT_SOURCE_DIR}/include/\")\nendif()\n\n# The shared library should always link enabled jemalloc libraries\ntarget_link_libraries(${PROJECT_NAME}_shared PRIVATE JemallocLibs)\n"
  },
  {
    "path": "FEXCore/Source/Common/BitSet.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/LogManager.h>\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstring>\n#include <type_traits>\n\nnamespace FEXCore {\n\ntemplate<typename T>\nstruct BitSet final {\n  using ElementType = T;\n  constexpr static size_t MinimumSize = sizeof(ElementType);\n  constexpr static size_t MinimumSizeBits = sizeof(ElementType) * 8;\n\n  ElementType* Memory;\n  void Allocate(size_t Elements) {\n    size_t AllocateSize = ToBytes(Elements);\n    LOGMAN_THROW_A_FMT((AllocateSize * MinimumSize) >= Elements, \"Fail\");\n    Memory = static_cast<ElementType*>(FEXCore::Allocator::malloc(AllocateSize));\n  }\n  void Realloc(size_t Elements) {\n    size_t AllocateSize = ToBytes(Elements);\n    LOGMAN_THROW_A_FMT((AllocateSize * MinimumSize) >= Elements, \"Fail\");\n    Memory = static_cast<ElementType*>(FEXCore::Allocator::realloc(Memory, AllocateSize));\n  }\n  void Free() {\n    FEXCore::Allocator::free(Memory);\n    Memory = nullptr;\n  }\n  bool Get(T Element) {\n    return (Memory[Element / MinimumSizeBits] & (1ULL << (Element % MinimumSizeBits))) != 0;\n  }\n  void Set(T Element) {\n    Memory[Element / MinimumSizeBits] |= (1ULL << (Element % MinimumSizeBits));\n  }\n  void Clear(T Element) {\n    Memory[Element / MinimumSizeBits] &= (1ULL << (Element % MinimumSizeBits));\n  }\n  void MemClear(size_t Elements) {\n    memset(Memory, 0, ToBytes(Elements));\n  }\n  void MemSet(size_t Elements) {\n    memset(Memory, 0xFF, ToBytes(Elements));\n  }\n  uint32_t ToBytes(size_t Elements) {\n    return AlignUp(Elements, MinimumSizeBits) / MinimumSize;\n  }\n\n  // This very explicitly doesn't let you take an address\n  // Is only a getter\n  bool operator[](T Element) {\n    return Get(Element);\n  }\n};\n\ntemplate<typename T>\nstruct BitSetView final {\n  using ElementType = T;\n  constexpr static size_t MinimumSize = sizeof(ElementType);\n  constexpr static size_t MinimumSizeBits = sizeof(ElementType) * 8;\n\n  ElementType* Memory;\n\n  void GetView(BitSet<T>& Set, uint64_t ElementOffset) {\n    LOGMAN_THROW_A_FMT((ElementOffset % MinimumSize) == 0, \"Bitset view offset needs to be aligned to size of backing element\");\n    Memory = &Set.Memory[ElementOffset / MinimumSizeBits];\n  }\n\n  bool Get(T Element) {\n    return (Memory[Element / MinimumSizeBits] & (1ULL << (Element % MinimumSizeBits))) != 0;\n  }\n  void Set(T Element) {\n    Memory[Element / MinimumSizeBits] |= (1ULL << (Element % MinimumSizeBits));\n  }\n  void Clear(T Element) {\n    Memory[Element / MinimumSizeBits] &= (1ULL << (Element % MinimumSizeBits));\n  }\n  void MemClear(size_t Elements) {\n    memset(Memory, 0, AlignUp(Elements / MinimumSizeBits, MinimumSizeBits));\n  }\n  void MemSet(size_t Elements) {\n    memset(Memory, 0xFF, AlignUp(Elements / MinimumSizeBits, MinimumSizeBits));\n  }\n\n  // This very explicitly doesn't let you take an address\n  // Is only a getter\n  bool operator[](T Element) {\n    return Get(Element);\n  }\n};\n\nstatic_assert(sizeof(BitSet<uint32_t>) == sizeof(uintptr_t), \"Needs to just be a pointer\");\nstatic_assert(std::is_trivially_copyable_v<BitSet<uint32_t>>, \"Needs to trivially copyable\");\n\nstatic_assert(sizeof(BitSetView<uint32_t>) == sizeof(uintptr_t), \"Needs to just be a pointer\");\nstatic_assert(std::is_trivially_copyable_v<BitSetView<uint32_t>>, \"Needs to trivially copyable\");\n\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/Source/Common/JitSymbols.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXCore/fextl/fmt.h>\n\n#include \"Common/JitSymbols.h\"\n\n#include <fcntl.h>\n#include <unistd.h>\n\nnamespace FEXCore {\nJITSymbols::JITSymbols() {}\n\nJITSymbols::~JITSymbols() {\n  if (fd != -1) {\n    close(fd);\n  }\n}\n\nvoid JITSymbols::InitFile() {\n  // We can't use FILE here since we must be robust against forking processes closing our FD from under us.\n#ifdef __ANDROID__\n  // Android simpleperf looks in /data/local/tmp instead of /tmp\n  const auto PerfMap = fextl::fmt::format(\"/data/local/tmp/perf-{}.map\", getpid());\n#else\n  const auto PerfMap = fextl::fmt::format(\"/tmp/perf-{}.map\", getpid());\n#endif\n  fd = open(PerfMap.c_str(), O_CREAT | O_TRUNC | O_WRONLY | O_APPEND, 0644);\n}\n\nvoid JITSymbols::RegisterNamedRegion(const void* HostAddr, uint32_t CodeSize, std::string_view Name) {\n  if (fd == -1) {\n    return;\n  }\n\n  // Linux perf format is very straightforward\n  // `<HostPtr> <Size> <Name>\\n`\n  const auto Buffer = fextl::fmt::format(\"{} {:x} {}\\n\", HostAddr, CodeSize, Name);\n  auto Result = write(fd, Buffer.c_str(), Buffer.size());\n  if (Result == -1 && errno == EBADF) {\n    fd = -1;\n  }\n}\n\nvoid JITSymbols::RegisterJITSpace(const void* HostAddr, uint32_t CodeSize) {\n  if (fd == -1) {\n    return;\n  }\n\n  // Linux perf format is very straightforward\n  // `<HostPtr> <Size> <Name>\\n`\n  const auto Buffer = fextl::fmt::format(\"{} {:x} FEXJIT\\n\", HostAddr, CodeSize);\n  auto Result = write(fd, Buffer.c_str(), Buffer.size());\n  if (Result == -1 && errno == EBADF) {\n    fd = -1;\n  }\n}\n\n// Buffered JIT symbols.\nvoid JITSymbols::Register(FEXCore::JITSymbolBuffer* Buffer, const void* HostAddr, uint64_t GuestAddr, uint32_t CodeSize) {\n  if (fd == -1) {\n    return;\n  }\n\n  // Calculate remaining sizes.\n  const auto RemainingSize = Buffer->BUFFER_SIZE - Buffer->Offset;\n  const auto CurrentBufferOffset = &Buffer->Buffer[Buffer->Offset];\n\n  // Linux perf format is very straightforward\n  // `<HostPtr> <Size> <Name>\\n`\n  const auto FMTResult = fmt::format_to_n(CurrentBufferOffset, RemainingSize, \"{} {:x} JIT_0x{:x}_{}\\n\", HostAddr, CodeSize, GuestAddr, HostAddr);\n  if (FMTResult.out >= &Buffer->Buffer[Buffer->BUFFER_SIZE]) {\n    // Couldn't fit, need to force a write.\n    WriteBuffer(Buffer, true);\n    // Rerun\n    Register(Buffer, HostAddr, GuestAddr, CodeSize);\n    return;\n  }\n\n  Buffer->Offset += FMTResult.size;\n  WriteBuffer(Buffer);\n}\n\nvoid JITSymbols::Register(FEXCore::JITSymbolBuffer* Buffer, const void* HostAddr, uint32_t CodeSize, std::string_view Name, uintptr_t Offset) {\n  if (fd == -1) {\n    return;\n  }\n\n  // Calculate remaining sizes.\n  const auto RemainingSize = Buffer->BUFFER_SIZE - Buffer->Offset;\n  const auto CurrentBufferOffset = &Buffer->Buffer[Buffer->Offset];\n\n  // Linux perf format is very straightforward\n  // `<HostPtr> <Size> <Name>\\n`\n  const auto FMTResult =\n    fmt::format_to_n(CurrentBufferOffset, RemainingSize, \"{} {:x} {}+0x{:x} ({})\\n\", HostAddr, CodeSize, Name, Offset, HostAddr);\n  if (FMTResult.out >= &Buffer->Buffer[Buffer->BUFFER_SIZE]) {\n    // Couldn't fit, need to force a write.\n    WriteBuffer(Buffer, true);\n    // Rerun\n    Register(Buffer, HostAddr, CodeSize, Name, Offset);\n    return;\n  }\n\n  Buffer->Offset += FMTResult.size;\n  WriteBuffer(Buffer);\n}\n\nvoid JITSymbols::RegisterNamedRegion(FEXCore::JITSymbolBuffer* Buffer, const void* HostAddr, uint32_t CodeSize, std::string_view Name) {\n  if (fd == -1) {\n    return;\n  }\n\n  // Calculate remaining sizes.\n  const auto RemainingSize = Buffer->BUFFER_SIZE - Buffer->Offset;\n  const auto CurrentBufferOffset = &Buffer->Buffer[Buffer->Offset];\n\n  // Linux perf format is very straightforward\n  // `<HostPtr> <Size> <Name>\\n`\n  const auto FMTResult = fmt::format_to_n(CurrentBufferOffset, RemainingSize, \"{} {:x} {}\\n\", HostAddr, CodeSize, Name);\n  if (FMTResult.out >= &Buffer->Buffer[Buffer->BUFFER_SIZE]) {\n    // Couldn't fit, need to force a write.\n    WriteBuffer(Buffer, true);\n    // Rerun\n    RegisterNamedRegion(Buffer, HostAddr, CodeSize, Name);\n    return;\n  }\n\n  Buffer->Offset += FMTResult.size;\n  WriteBuffer(Buffer);\n}\n\nvoid JITSymbols::WriteBuffer(FEXCore::JITSymbolBuffer* Buffer, bool ForceWrite) {\n  auto Now = std::chrono::steady_clock::now();\n  if (!ForceWrite) {\n    if (((Buffer->LastWrite - Now) < Buffer->MAXIMUM_THRESHOLD) && Buffer->Offset < Buffer->NEEDS_WRITE_DISTANCE) {\n      // Still buffering, no need to write.\n      return;\n    }\n  }\n\n  Buffer->LastWrite = Now;\n  auto Result = write(fd, Buffer->Buffer, Buffer->Offset);\n  if (Result == -1 && errno == EBADF) {\n    fd = -1;\n  }\n\n  Buffer->Offset = 0;\n}\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/Source/Common/JitSymbols.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/Utils/TypeDefines.h>\n\n#include <FEXCore/fextl/memory.h>\n\n#include <chrono>\n#include <cstddef>\n#include <cstdint>\n#include <string_view>\n\nnamespace FEXCore {\n// Buffered JIT symbol tracking.\nstruct JITSymbolBuffer {\n  // Maximum buffer size to ensure we are a page in size.\n  constexpr static size_t BUFFER_SIZE = FEXCore::Utils::FEX_PAGE_SIZE - (8 * 2);\n  // Maximum distance until the end of the buffer to do a write.\n  constexpr static size_t NEEDS_WRITE_DISTANCE = BUFFER_SIZE - 64;\n  // Maximum time threshhold to wait before a buffer write occurs.\n  constexpr static std::chrono::milliseconds MAXIMUM_THRESHOLD {100};\n\n  JITSymbolBuffer()\n    : LastWrite {std::chrono::steady_clock::now()} {}\n  // stead_clock to ensure a monotonic increasing clock.\n  // In highly stressed situations this can still cause >2% CPU time in vdso_clock_gettime.\n  // If we need lower CPU time when JIT symbols are enabled then FEX can read the cycle counter directly.\n  std::chrono::steady_clock::time_point LastWrite {};\n  size_t Offset {};\n  char Buffer[BUFFER_SIZE] {};\n};\nstatic_assert(sizeof(JITSymbolBuffer) == FEXCore::Utils::FEX_PAGE_SIZE, \"Ensure this is one page in size\");\n\nclass JITSymbols final {\npublic:\n  JITSymbols();\n  ~JITSymbols();\n\n  void InitFile();\n  void RegisterNamedRegion(const void* HostAddr, uint32_t CodeSize, std::string_view Name);\n  void RegisterJITSpace(const void* HostAddr, uint32_t CodeSize);\n\n  // Allocate JIT buffer.\n  static fextl::unique_ptr<FEXCore::JITSymbolBuffer> AllocateBuffer() {\n    return fextl::make_unique<FEXCore::JITSymbolBuffer>();\n  }\n\n  void Register(FEXCore::JITSymbolBuffer* Buffer, const void* HostAddr, uint64_t GuestAddr, uint32_t CodeSize);\n  void Register(FEXCore::JITSymbolBuffer* Buffer, const void* HostAddr, uint32_t CodeSize, std::string_view Name, uintptr_t Offset);\n  void RegisterNamedRegion(FEXCore::JITSymbolBuffer* Buffer, const void* HostAddr, uint32_t CodeSize, std::string_view Name);\n\nprivate:\n  int fd {-1};\n  void WriteBuffer(FEXCore::JITSymbolBuffer* Buffer, bool ForceWrite = false);\n};\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/Source/Common/SoftFloat.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/sstream.h>\n#include <FEXCore/fextl/string.h>\n#include \"cephes_128bit.h\"\n\n#include <bit>\n#include <cmath>\n#include <cstring>\n#include <stdint.h>\n\n#include \"Common/VectorRegType.h\"\n\nextern \"C\" {\n#include \"SoftFloat-3e/platform.h\"\n#include \"SoftFloat-3e/softfloat.h\"\n}\n\nstruct FEX_PACKED X80SoftFloat {\n#ifdef ARCHITECTURE_x86_64\n// Define this to push some operations to x87\n// Only useful to see if precision loss is killing something\n// #define DEBUG_X86_FLOAT\n#ifdef DEBUG_X86_FLOAT\n#define BIGFLOAT long double\n#define BIGFLOATSIZE 10\n#else\n#define BIGFLOAT float128_t\n#define BIGFLOATSIZE 16\n#endif\n#elif defined(ARCHITECTURE_arm64)\n#define BIGFLOAT float128_t\n#define BIGFLOATSIZE 16\n#else\n#error No 128bit float for this target!\n#endif\n\n  uint64_t Significand;\n  union {\n    uint16_t Raw;\n    struct {\n      uint16_t Exponent : 15;\n      uint16_t Sign     : 1;\n    };\n  } Top;\n\n  X80SoftFloat() {\n    memset(this, 0, sizeof(*this));\n  }\n  X80SoftFloat(uint16_t _Sign, uint16_t _Exponent, uint64_t _Significand)\n    : Significand {_Significand}\n    , Top {.Raw = static_cast<uint16_t>((_Exponent & 0x7FFF) | (_Sign << 15))} {}\n\n  fextl::string str() const {\n    fextl::ostringstream string;\n    string << std::hex << Top.Sign;\n    string << \"_\" << Top.Exponent;\n    string << \"_\" << (Significand >> 63);\n    string << \"_\" << (Significand & ((1ULL << 63) - 1));\n    return string.str();\n  }\n\n  // Ops\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FADD(softfloat_state* state, const X80SoftFloat& lhs, const X80SoftFloat& rhs) {\n#ifdef DEBUG_X86_FLOAT\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[rhs]; # st1\n    fldt %[lhs]; # st0\n    faddp;\n    fstpt %[result];\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs), [rhs] \"m\"(rhs)\n        : \"st\", \"st(1)\");\n\n    return Result;\n#else\n    return extF80_add(state, lhs, rhs);\n#endif\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FSUB(softfloat_state* state, const X80SoftFloat& lhs, const X80SoftFloat& rhs) {\n#ifdef DEBUG_X86_FLOAT\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[rhs]; # st1\n    fldt %[lhs]; # st0\n    fsubp;\n    fstpt %[result];\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs), [rhs] \"m\"(rhs)\n        : \"st\", \"st(1)\");\n\n    return Result;\n#else\n    return extF80_sub(state, lhs, rhs);\n#endif\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FMUL(softfloat_state* state, const X80SoftFloat& lhs, const X80SoftFloat& rhs) {\n#ifdef DEBUG_X86_FLOAT\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[rhs]; # st1\n    fldt %[lhs]; # st0\n    fmulp;\n    fstpt %[result];\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs), [rhs] \"m\"(rhs)\n        : \"st\", \"st(1)\");\n\n    return Result;\n#else\n    return extF80_mul(state, lhs, rhs);\n#endif\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FDIV(softfloat_state* state, const X80SoftFloat& lhs, const X80SoftFloat& rhs) {\n#ifdef DEBUG_X86_FLOAT\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[rhs]; # st1\n    fldt %[lhs]; # st0\n    fdivp;\n    fstpt %[result];\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs), [rhs] \"m\"(rhs)\n        : \"st\", \"st(1)\");\n\n    return Result;\n#else\n    return extF80_div(state, lhs, rhs);\n#endif\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FREM(softfloat_state* state, const X80SoftFloat& lhs, const X80SoftFloat& rhs) {\n#if defined(DEBUG_X86_FLOAT)\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[rhs]; # st1\n    fldt %[lhs]; # st0\n    fprem;\n    fstpt %[result];\n    ffreep %%st(0);\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs), [rhs] \"m\"(rhs)\n        : \"st\", \"st(1)\");\n\n    return Result;\n#else\n    /*\n     * Check for invalid operation cases first - Intel FPREM sets Invalid Operation\n     * for several cases including infinity dividend and zero divisor.\n     */\n    X80SoftFloat result = 0;\n    if (HandleInfinityOp(state, lhs, result)) {\n      return result;\n    } else if (lhs.Top.Exponent == 0x7FFF && (lhs.Significand & 0x7FFFFFFFFFFFFFFFULL)) { // NaN\n      // propagate NaN\n      state->exceptionFlags |= softfloat_flag_invalid;\n      return lhs;\n    }\n\n    // Check for zero divisor - fprem(x, 0) is invalid operation\n    if (rhs.Top.Exponent == 0 && rhs.Significand == 0) {\n      state->exceptionFlags |= softfloat_flag_invalid;\n      // Return QNaN\n      result.Top.Sign = 0;\n      result.Top.Exponent = 0x7FFF;\n      result.Significand = 0xC000000000000000ULL;\n      return result;\n    }\n\n    /*\n     * FPREM is not an IEEE-754 remainder.  From the Intel spec:\n     *\n     *    Computes the remainder obtained from dividing the value in the ST(0)\n     *    register (the dividend) by the value in the ST(1) register (the divisor\n     *    or modulus), and stores the result in ST(0). The remainder represents the\n     *    following value:\n     *\n     *    Remainder := ST(0) − (Q * ST(1))\n     *\n     *    Here, Q is an integer value that is obtained by truncating the\n     *    floating-point number quotient of [ST(0) / ST(1)] toward zero.\n     *\n     * We implement this sequence literally. softfloat_round_minMag means\n     * \"truncate towards zero\".\n     */\n    extFloat80_t quotient = extF80_div(state, lhs, rhs);\n    extFloat80_t Q = extF80_roundToInt(state, quotient, softfloat_round_minMag, true);\n    bool Q_zero = Q.signif == 0 && (Q.signExp & ~(1 << 15)) == 0;\n\n    if (Q_zero) {\n      return lhs;\n    } else {\n      return extF80_sub(state, lhs, extF80_mul(state, Q, rhs));\n    }\n#endif\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FREM1(softfloat_state* state, const X80SoftFloat& lhs, const X80SoftFloat& rhs) {\n#if defined(DEBUG_X86_FLOAT)\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[rhs]; # st1\n    fldt %[lhs]; # st0\n    fprem1;\n    fstpt %[result];\n    ffreep %%st(0);\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs), [rhs] \"m\"(rhs)\n        : \"st\", \"st(1)\");\n\n    return Result;\n#else\n    return extF80_rem(state, lhs, rhs);\n#endif\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FRNDINT(softfloat_state* state, const X80SoftFloat& lhs) {\n    return extF80_roundToInt(state, lhs, state->roundingMode, false);\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FRNDINT(softfloat_state* state, const X80SoftFloat& lhs, uint_fast8_t RoundMode) {\n    return extF80_roundToInt(state, lhs, RoundMode, false);\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FXTRACT_SIG(const X80SoftFloat& lhs) {\n#if defined(DEBUG_X86_FLOAT)\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[lhs]; # st0\n    fxtract;\n    fstpt %[result];\n    ffreep %%st(0);\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs)\n        : \"st\", \"st(1)\");\n\n    return Result;\n#else\n    // Zero is a special case, the significand for +/- 0 is +/- zero.\n    if (lhs.Top.Exponent == 0x0 && lhs.Significand == 0x0) {\n      return lhs;\n    }\n    X80SoftFloat Tmp = lhs;\n    Tmp.Top.Exponent = 0x3FFF;\n    Tmp.Top.Sign = lhs.Top.Sign;\n    return Tmp;\n#endif\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FXTRACT_EXP(const X80SoftFloat& lhs) {\n#if defined(DEBUG_X86_FLOAT)\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[lhs]; # st0\n    fxtract;\n    ffreep %%st(0);\n    fstpt %[result];\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs)\n        : \"st\", \"st(1)\");\n\n    return Result;\n#else\n    // Zero is a special case, the exponent is always -inf\n    if (lhs.Top.Exponent == 0x0 && lhs.Significand == 0x0) {\n      X80SoftFloat Result(1, 0x7FFFUL, 0x8000'0000'0000'0000UL);\n      return Result;\n    }\n\n    int32_t TrueExp = lhs.Top.Exponent - ExponentBias;\n    return i32_to_extF80(TrueExp);\n#endif\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static void\n  FCMP(softfloat_state* state, const X80SoftFloat& lhs, const X80SoftFloat& rhs, bool* eq, bool* lt, bool* nan) {\n    *eq = extF80_eq(state, lhs, rhs);\n    *lt = extF80_lt(state, lhs, rhs);\n\n    // Use IEEE 754 semantics: unordered if neither <, =, nor > is true\n    // This is more reliable than custom NaN detection\n    bool gt = !(*eq) && !(*lt) && extF80_le(state, rhs, lhs);\n    *nan = !(*eq) && !(*lt) && !gt;\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FSCALE(softfloat_state* state, const X80SoftFloat& lhs, const X80SoftFloat& rhs) {\n#ifdef DEBUG_X86_FLOAT\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[rhs]; # st1\n    fldt %[lhs]; # st0\n    fscale; # st0 = st0 * 2^(rdint(st1))\n    fstpt %[result];\n    ffreep %%st(0);\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs), [rhs] \"m\"(rhs)\n        : \"st\", \"st(1)\");\n\n    return Result;\n#else\n    extFloat80_t Zero {0, 0};\n    if (extF80_eq(state, lhs, Zero)) {\n      return lhs;\n    }\n    X80SoftFloat Int = FRNDINT(state, rhs, softfloat_round_minMag);\n    BIGFLOAT Src2_d = Int.ToFMax(state);\n    Src2_d = FEXCore::cephes_128bit::exp2l(Src2_d);\n    X80SoftFloat Src2_X80(state, Src2_d);\n    X80SoftFloat Result = extF80_mul(state, lhs, Src2_X80);\n    return Result;\n#endif\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat F2XM1(softfloat_state* state, const X80SoftFloat& lhs) {\n#ifdef DEBUG_X86_FLOAT\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[lhs]; # st0\n    f2xm1; # st0 = 2^st(0) - 1\n    fstpt %[result];\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs)\n        : \"st\");\n\n    return Result;\n#else\n    auto Src1_d = lhs.ToFMax(state);\n    auto Result = FEXCore::cephes_128bit::exp2l(Src1_d);\n\n    static const float128_t one {0x0ULL, 0x3fff000000000000ULL};\n    return X80SoftFloat(state, f128_sub(state, Result, one));\n#endif\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FYL2X(softfloat_state* state, const X80SoftFloat& lhs, const X80SoftFloat& rhs) {\n#ifdef DEBUG_X86_FLOAT\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[rhs]; # st(1)\n    fldt %[lhs]; # st(0)\n    fyl2x; # st(1) * log2l(st(0))\n    fstpt %[result];\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs), [rhs] \"m\"(rhs)\n        : \"st\", \"st(1)\");\n\n    return Result;\n#else\n    auto Src1_d = lhs.ToFMax(state);\n    auto Src2_d = rhs.ToFMax(state);\n\n    auto Tmp = f128_mul(state, Src2_d, FEXCore::cephes_128bit::log2l(Src1_d));\n    return X80SoftFloat(state, Tmp);\n#endif\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FATAN(softfloat_state* state, const X80SoftFloat& lhs, const X80SoftFloat& rhs) {\n#ifdef DEBUG_X86_FLOAT\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[lhs];\n    fldt %[rhs];\n    fpatan;\n    fstpt %[result];\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs), [rhs] \"m\"(rhs)\n        : \"st\", \"st(1)\");\n\n    return Result;\n#else\n    BIGFLOAT Src1_d = lhs.ToFMax(state);\n    BIGFLOAT Src2_d = rhs.ToFMax(state);\n    BIGFLOAT Tmp = FEXCore::cephes_128bit::atan2l(Src1_d, Src2_d);\n    return X80SoftFloat(state, Tmp);\n#endif\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FTAN(softfloat_state* state, const X80SoftFloat& lhs) {\n#ifdef DEBUG_X86_FLOAT\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[lhs]; # st0\n    fptan;\n    ffreep %%st(0);\n    fstpt %[result];\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs)\n        : \"st\");\n\n    return Result;\n#else\n    X80SoftFloat result;\n    if (HandleInfinityOp(state, lhs, result)) {\n      return result;\n    }\n\n    BIGFLOAT Src_d = lhs.ToFMax(state);\n    Src_d = FEXCore::cephes_128bit::tanl(Src_d);\n    return X80SoftFloat(state, Src_d);\n#endif\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FSIN(softfloat_state* state, const X80SoftFloat& lhs) {\n#ifdef DEBUG_X86_FLOAT\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[lhs]; # st0\n    fsin;\n    fstpt %[result];\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs)\n        : \"st\");\n\n    return Result;\n#else\n    X80SoftFloat result;\n    if (HandleInfinityOp(state, lhs, result)) {\n      return result;\n    }\n\n    BIGFLOAT Src_d = lhs.ToFMax(state);\n    Src_d = FEXCore::cephes_128bit::sinl(Src_d);\n    return X80SoftFloat(state, Src_d);\n#endif\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FCOS(softfloat_state* state, const X80SoftFloat& lhs) {\n#ifdef DEBUG_X86_FLOAT\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[lhs]; # st0\n    fcos;\n    fstpt %[result];\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs)\n        : \"st\");\n\n    return Result;\n#else\n    X80SoftFloat result;\n    if (HandleInfinityOp(state, lhs, result)) {\n      return result;\n    }\n\n    BIGFLOAT Src_d = lhs.ToFMax(state);\n    Src_d = FEXCore::cephes_128bit::cosl(Src_d);\n    return X80SoftFloat(state, Src_d);\n#endif\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FSQRT(softfloat_state* state, const X80SoftFloat& lhs) {\n#ifdef DEBUG_X86_FLOAT\n    BIGFLOAT Result;\n    asm(R\"(\n    fninit;\n    fldt %[lhs]; # st0\n    fsqrt;\n    fstpt %[result];\n    )\"\n        : [result] \"=m\"(Result)\n        : [lhs] \"m\"(lhs)\n        : \"st\");\n\n    return Result;\n#else\n    return extF80_sqrt(state, lhs);\n#endif\n  }\n\n  float ToF32(softfloat_state* state) const {\n    const float32_t Result = extF80_to_f32(state, *this);\n    return std::bit_cast<float>(Result);\n  }\n\n  double ToF64(softfloat_state* state) const {\n    const float64_t Result = extF80_to_f64(state, *this);\n    return std::bit_cast<double>(Result);\n  }\n\n  FEXCore::VectorRegType ToVector() const {\n    FEXCore::VectorRegType Ret {};\n    memcpy(&Ret, this, sizeof(*this));\n    return Ret;\n  }\n\n  BIGFLOAT ToFMax(softfloat_state* state) const {\n#if BIGFLOATSIZE == 16\n    const float128_t Result = extF80_to_f128(state, *this);\n    return std::bit_cast<BIGFLOAT>(Result);\n#else\n    BIGFLOAT result {};\n    memcpy(&result, this, sizeof(result));\n    return result;\n#endif\n  }\n\n  int16_t ToI16(softfloat_state* state) const {\n    auto rv = extF80_to_i32(state, *this, state->roundingMode, false);\n    if (rv > INT16_MAX || rv < INT16_MIN) {\n      ///< Indefinite value for 16-bit conversions.\n      return INT16_MIN;\n    } else {\n      return rv;\n    }\n  }\n\n  int32_t ToI32(softfloat_state* state) const {\n    return extF80_to_i32(state, *this, state->roundingMode, false);\n  }\n\n  int64_t ToI64(softfloat_state* state) const {\n    return extF80_to_i64(state, *this, state->roundingMode, false);\n  }\n\n  uint64_t ToUI64(softfloat_state* state) const {\n    return extF80_to_ui64(state, *this, state->roundingMode, false);\n  }\n\n  void operator=(const int16_t rhs) {\n    *this = i32_to_extF80(rhs);\n  }\n\n  void operator=(const int32_t rhs) {\n    *this = i32_to_extF80(rhs);\n  }\n\n  void operator=(const uint64_t rhs) {\n    *this = ui64_to_extF80(rhs);\n  }\n\n#if BIGFLOATSIZE == 10\n  void operator=(const long double rhs) {\n    memcpy(this, &rhs, sizeof(rhs));\n  }\n#endif\n\n  operator void*() {\n    return reinterpret_cast<void*>(this);\n  }\n\n  X80SoftFloat(extFloat80_t rhs) {\n    Significand = rhs.signif;\n    Top.Raw = rhs.signExp;\n  }\n\n  X80SoftFloat(softfloat_state* state, const float rhs) {\n    *this = f32_to_extF80(state, std::bit_cast<float32_t>(rhs));\n  }\n\n  X80SoftFloat(softfloat_state* state, const double rhs) {\n    *this = f64_to_extF80(state, std::bit_cast<float64_t>(rhs));\n  }\n\n  X80SoftFloat(softfloat_state* state, BIGFLOAT rhs) {\n#if BIGFLOATSIZE == 16\n    *this = f128_to_extF80(state, std::bit_cast<float128_t>(rhs));\n#else\n    *this = std::bit_cast<long double>(rhs);\n#endif\n  }\n\n  X80SoftFloat(const int16_t rhs) {\n    *this = i32_to_extF80(rhs);\n  }\n\n  X80SoftFloat(const int32_t rhs) {\n    *this = i32_to_extF80(rhs);\n  }\n\n  X80SoftFloat(const FEXCore::VectorRegType rhs) {\n    memcpy(this, &rhs, sizeof(*this));\n  }\n\n  void operator=(extFloat80_t rhs) {\n    Significand = rhs.signif;\n    Top.Raw = rhs.signExp;\n  }\n\n  operator FEXCore::VectorRegType() const {\n    return ToVector();\n  }\n\n  operator extFloat80_t() const {\n    extFloat80_t Result {};\n    Result.signif = Significand;\n    Result.signExp = Top.Raw;\n    return Result;\n  }\n\n  static bool IsNan(const X80SoftFloat& lhs) {\n    return (lhs.Top.Exponent == 0x7FFF) && (lhs.Significand & IntegerBit) && (lhs.Significand & Bottom62Significand);\n  }\n\n  static bool SignBit(const X80SoftFloat& lhs) {\n    return lhs.Top.Sign;\n  }\n\nprivate:\n  static constexpr uint64_t IntegerBit = (1ULL << 63);\n  static constexpr uint64_t Bottom62Significand = ((1ULL << 62) - 1);\n  static constexpr uint32_t ExponentBias = 16383;\n\n  // Helper function to check for infinity and set invalid operation flag.\n  // Returns true if infinity is dealt with, false otherwise.\n  FEXCORE_PRESERVE_ALL_ATTR static bool HandleInfinityOp(softfloat_state* state, const X80SoftFloat& arg, X80SoftFloat& result) {\n    if (arg.Top.Exponent == 0x7FFF && arg.Significand == 0x8000000000000000ULL) {\n      state->exceptionFlags |= softfloat_flag_invalid;\n      // Return QNaN.\n      result.Top.Sign = 0;\n      result.Top.Exponent = 0x7FFF;\n      result.Significand = 0xC000000000000000ULL;\n      return true;\n    }\n    return false;\n  }\n};\n\nstatic_assert(sizeof(X80SoftFloat) == 10, \"tword must be 10bytes in size\");\n"
  },
  {
    "path": "FEXCore/Source/Common/StringConv.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/string.h>\n\n#include <concepts>\n#include <string_view>\n\nnamespace FEXCore::StrConv {\ntemplate<std::integral T>\nbool Conv(std::string_view Value, T* Result) {\n  if constexpr (std::is_signed_v<T>) {\n    *Result = static_cast<T>(std::strtoll(Value.data(), nullptr, 0));\n  } else {\n    *Result = static_cast<T>(std::strtoull(Value.data(), nullptr, 0));\n  }\n  return true;\n}\n\ntemplate<typename T, typename = std::enable_if_t<std::is_enum_v<T>, T>>\nbool Conv(std::string_view Value, T* Result) {\n  *Result = static_cast<T>(std::strtoull(Value.data(), nullptr, 0));\n  return true;\n}\n\ninline bool Conv(std::string_view Value, fextl::string* Result) {\n  *Result = Value;\n  return true;\n}\n} // namespace FEXCore::StrConv\n"
  },
  {
    "path": "FEXCore/Source/Common/VectorRegType.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#ifdef ARCHITECTURE_x86_64\n#include <xmmintrin.h>\n#include <immintrin.h>\n#else\n#include <cstdint>\n#endif\n\nnamespace FEXCore {\nstruct VectorScalarF64Pair {\n  double val[2];\n};\n\n#ifdef ARCHITECTURE_arm64\n// Can't use uint8x16_t directly from arm_neon.h here.\n// Overrides softfloat-3e's defines which causes problems.\n#ifdef __clang__\nusing VectorRegType = __attribute__((neon_vector_type(16))) uint8_t;\n#else\nusing VectorRegType = __attribute__((vector_size(16))) uint8_t;\n#endif\nstruct VectorRegPairType {\n  VectorRegType val[2];\n};\n\nstatic inline VectorRegPairType MakeVectorRegPair(VectorRegType low, VectorRegType high) {\n  return VectorRegPairType {low, high};\n}\n\n#elif defined(ARCHITECTURE_x86_64)\nusing VectorRegType = __m128i;\nusing VectorRegPairType = __m256i;\n\nstatic inline VectorRegPairType MakeVectorRegPair(VectorRegType low, VectorRegType high) {\n  return _mm256_set_m128i(high, low);\n}\n#endif\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/Source/Interface/Config/Config.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Common/StringConv.h\"\n#include \"FEXCore/Utils/EnumUtils.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/FileLoading.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/StringUtils.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/list.h>\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/unordered_map.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXHeaderUtils/Filesystem.h>\n\n#include <array>\n#include <cstdlib>\n#include <optional>\n#include <stddef.h>\n#include <stdint.h>\n#include <string_view>\n#include <type_traits>\n#include <utility>\n\nnamespace FEXCore::Context {\nclass Context;\n}\n\nnamespace FEXCore::Config {\nnamespace detail {\n#define P(x) x\n#define OPT_BASE(type, group, enum, json, default) const P(type) P(enum) = P(default);\n#define OPT_STR(group, enum, json, default) const std::string_view P(enum) = P(default);\n#define OPT_STRARRAY(group, enum, json, default) OPT_STR(group, enum, json, default)\n#define OPT_STRENUM(group, enum, json, default) const uint64_t P(enum) = FEXCore::ToUnderlying(P(default));\n#include <FEXCore/Config/ConfigValues.inl>\n} // namespace detail\n\nenum Paths {\n  PATH_DATA_DIR_LOCAL = 0,\n  PATH_DATA_DIR_GLOBAL,\n  PATH_CONFIG_DIR_LOCAL,\n  PATH_CONFIG_DIR_GLOBAL,\n  PATH_CONFIG_FILE_LOCAL,\n  PATH_CONFIG_FILE_GLOBAL,\n  PATH_CONFIG_TELEMETRY_FOLDER,\n  PATH_LAST,\n};\nstatic std::array<fextl::string, Paths::PATH_LAST> Paths;\n\nvoid SetDataDirectory(const std::string_view Path, bool Global) {\n  Paths[PATH_DATA_DIR_LOCAL + Global] = Path;\n}\n\nvoid SetConfigDirectory(const std::string_view Path, bool Global) {\n  Paths[PATH_CONFIG_DIR_LOCAL + Global] = Path;\n}\n\nvoid SetConfigFileLocation(const std::string_view Path, bool Global) {\n  Paths[PATH_CONFIG_FILE_LOCAL + Global] = Path;\n}\n\nconst fextl::string& GetTelemetryDirectory() {\n  auto& Path = Paths[PATH_CONFIG_TELEMETRY_FOLDER];\n  if (Path.empty()) {\n    FEX_CONFIG_OPT(TelemetryDirectory, TELEMETRYDIRECTORY);\n    if (!TelemetryDirectory().empty()) {\n      Path = TelemetryDirectory;\n      Path += \"/\";\n    } else {\n      Path = Config::GetDataDirectory(false) + \"Telemetry/\";\n    }\n  }\n\n  return Path;\n}\n\nconst fextl::string& GetDataDirectory(bool Global) {\n  return Paths[PATH_DATA_DIR_LOCAL + Global];\n}\n\nconst fextl::string& GetConfigDirectory(bool Global) {\n  return Paths[PATH_CONFIG_DIR_LOCAL + Global];\n}\n\nconst fextl::string& GetConfigFileLocation(bool Global) {\n  return Paths[PATH_CONFIG_FILE_LOCAL + Global];\n}\n\nfextl::string GetApplicationConfig(const std::string_view Program, bool Global) {\n  fextl::string ConfigFile = GetConfigDirectory(Global);\n\n  if (!Global && !FHU::Filesystem::Exists(ConfigFile) && !FHU::Filesystem::CreateDirectories(ConfigFile)) {\n    LogMan::Msg::DFmt(\"Couldn't create config directory: '{}'\", ConfigFile);\n    // Let's go local in this case\n    return fextl::fmt::format(\"./{}.json\", Program);\n  }\n\n  ConfigFile += \"AppConfig/\";\n\n  // Attempt to create the local folder if it doesn't exist\n  if (!Global && !FHU::Filesystem::Exists(ConfigFile) && !FHU::Filesystem::CreateDirectories(ConfigFile)) {\n    // Let's go local in this case\n    return fextl::fmt::format(\"./{}.json\", Program);\n  }\n\n  return fextl::fmt::format(\"{}{}.json\", ConfigFile, Program);\n}\n\nstatic fextl::map<FEXCore::Config::LayerType, fextl::unique_ptr<FEXCore::Config::Layer>> ConfigLayers;\nclass MetaLayer;\nstatic FEXCore::Config::MetaLayer* Meta {};\n\nconstexpr std::array<FEXCore::Config::LayerType, 10> LoadOrder = {\n  FEXCore::Config::LayerType::LAYER_GLOBAL_MAIN,      FEXCore::Config::LayerType::LAYER_MAIN,\n  FEXCore::Config::LayerType::LAYER_GLOBAL_STEAM_APP, FEXCore::Config::LayerType::LAYER_GLOBAL_APP,\n  FEXCore::Config::LayerType::LAYER_LOCAL_STEAM_APP,  FEXCore::Config::LayerType::LAYER_LOCAL_APP,\n  FEXCore::Config::LayerType::LAYER_ARGUMENTS,        FEXCore::Config::LayerType::LAYER_USER_OVERRIDE,\n  FEXCore::Config::LayerType::LAYER_ENVIRONMENT,      FEXCore::Config::LayerType::LAYER_TOP};\n\nLayer::Layer(const LayerType _Type)\n  : Type {_Type} {}\n\nLayer::~Layer() {}\n\nclass MetaLayer final : public FEXCore::Config::Layer {\npublic:\n  MetaLayer(const LayerType _Type)\n    : FEXCore::Config::Layer(_Type) {}\n  ~MetaLayer() {}\n  void Load();\n\n  template<typename T>\n  requires (!std::is_same_v<fextl::string, T> && !std::is_same_v<StringArrayType, T>)\n  std::optional<T> GetConv(ConfigOption Option) {\n    const auto it = OptionMap.find(Option);\n    if (it == OptionMap.end()) {\n      return std::nullopt;\n    }\n\n    const auto& Value = it->second;\n    LOGMAN_THROW_A_FMT(!std::holds_alternative<StringArrayType>(Value), \"Tried to get config of invalid type!\");\n\n    if (std::holds_alternative<T>(Value)) [[likely]] {\n      return std::get<T>(Value);\n    }\n\n    T ConvertedValue;\n    if (std::holds_alternative<fextl::string>(Value)) {\n      const auto& StrVal = std::get<fextl::string>(Value);\n      if (FEXCore::StrConv::Conv(StrVal, &ConvertedValue)) {\n        // Convert the value.\n        OptionMap[Option].emplace<T>(ConvertedValue);\n        return ConvertedValue;\n      } else {\n        LOGMAN_MSG_A_FMT(\"Couldn't Convert {} to specified type!\", StrVal);\n      }\n    }\n\n    FEX_UNREACHABLE;\n  }\n\nprivate:\n  void MergeConfigMap(const LayerOptions& Options);\n  void MergeEnvironmentVariables(const ConfigOption& Option, const StringArrayType& Value);\n};\n\nvoid MetaLayer::Load() {\n  OptionMap.clear();\n\n  for (auto CurrentLayer = LoadOrder.begin(); CurrentLayer != LoadOrder.end(); ++CurrentLayer) {\n    auto it = ConfigLayers.find(*CurrentLayer);\n    if (it != ConfigLayers.end() && *CurrentLayer != Type) {\n      // Merge this layer's options to this layer\n      MergeConfigMap(it->second->GetOptionMap());\n    }\n  }\n}\n\n\nvoid MetaLayer::MergeEnvironmentVariables(const ConfigOption& Option, const StringArrayType& Value) {\n  // Environment variables need a bit of additional work\n  // We want to merge the arrays rather than overwrite entirely\n  auto MetaEnvironment = OptionMap.find(Option);\n  if (MetaEnvironment == OptionMap.end()) {\n    // Doesn't exist, just insert\n    OptionMap.insert_or_assign(Option, Value);\n    return;\n  }\n\n  // If an environment variable exists in both current meta and in the incoming layer then the meta layer value is overwritten\n  fextl::unordered_map<fextl::string, fextl::string> LookupMap;\n  const auto AddToMap = [&LookupMap](const StringArrayType& Value) {\n    for (const auto& EnvVar : Value) {\n      const auto ItEq = EnvVar.find_first_of('=');\n      if (ItEq == fextl::string::npos) {\n        // Broken environment variable\n        // Skip\n        continue;\n      }\n      auto Key = fextl::string(EnvVar.begin(), EnvVar.begin() + ItEq);\n      auto Value = fextl::string(EnvVar.begin() + ItEq + 1, EnvVar.end());\n\n      // Add the key to the map, overwriting whatever previous value was there\n      LookupMap.insert_or_assign(std::move(Key), std::move(Value));\n    }\n  };\n\n  AddToMap(std::get<StringArrayType>(MetaEnvironment->second));\n  AddToMap(Value);\n\n  // Now with the two layers merged in the map\n  // Add all the values to the option\n  Erase(Option);\n  for (auto& Val : LookupMap) {\n    // Set will emplace multiple options in to its list\n    AppendStrArrayValue(Option, Val.first + \"=\" + Val.second);\n  }\n}\n\nvoid MetaLayer::MergeConfigMap(const LayerOptions& Options) {\n  // Insert this layer's options, overlaying previous options that exist here\n  for (auto& it : Options) {\n    if (it.first == FEXCore::Config::ConfigOption::CONFIG_ENV || it.first == FEXCore::Config::ConfigOption::CONFIG_HOSTENV) {\n      LOGMAN_THROW_A_FMT(std::holds_alternative<StringArrayType>(it.second), \"Tried to get config of invalid type!\");\n      MergeEnvironmentVariables(it.first, std::get<StringArrayType>(it.second));\n    } else {\n      OptionMap.insert_or_assign(it.first, it.second);\n    }\n  }\n}\n\nvoid Initialize() {\n  AddLayer(fextl::make_unique<MetaLayer>(FEXCore::Config::LayerType::LAYER_TOP));\n  Meta = dynamic_cast<MetaLayer*>(ConfigLayers.begin()->second.get());\n}\n\nvoid Shutdown() {\n  ConfigLayers.clear();\n  Meta = nullptr;\n}\n\nvoid Load() {\n  for (auto CurrentLayer = LoadOrder.begin(); CurrentLayer != LoadOrder.end(); ++CurrentLayer) {\n    auto it = ConfigLayers.find(*CurrentLayer);\n    if (it != ConfigLayers.end()) {\n      it->second->Load();\n    }\n  }\n}\n\nfextl::string ExpandPath(const fextl::string& ContainerPrefix, const fextl::string& PathName) {\n  if (PathName.empty()) {\n    return {};\n  }\n\n  // Expand home if it exists\n  if (FHU::Filesystem::IsRelative(PathName)) {\n    fextl::string Home = getenv(\"HOME\") ?: \"\";\n    // Home expansion only works if it is the first character\n    // This matches bash behaviour\n    if (PathName.starts_with(\"~/\")) {\n      Home.append(PathName.begin() + 1, PathName.end());\n      return Home;\n    }\n\n    // Expand relative path to absolute\n    char ExistsTempPath[PATH_MAX];\n    char* RealPath = FHU::Filesystem::Absolute(PathName.c_str(), ExistsTempPath);\n    if (RealPath && FHU::Filesystem::Exists(RealPath)) {\n      return RealPath;\n    }\n\n    // Only return if it exists\n    if (FHU::Filesystem::Exists(PathName)) {\n      return PathName;\n    }\n  } else {\n    // If the containerprefix and pathname isn't empty\n    // Then we check if the pathname exists in our current namespace\n    // If the path DOESN'T exist but DOES exist with the prefix applied\n    // then redirect to the prefix\n    //\n    // This might not be expected behaviour for some edge cases but since\n    // all paths aren't mounted inside the container, then it'll be fine\n    //\n    // Main catch case for this is the default thunk install folders\n    // HostThunks: $CMAKE_INSTALL_PREFIX/lib/fex-emu/HostThunks/\n    // GuestThunks: $CMAKE_INSTALL_PREFIX/share/fex-emu/GuestThunks/\n    if (!ContainerPrefix.empty() && !PathName.empty()) {\n      if (!FHU::Filesystem::Exists(PathName)) {\n        auto ContainerPath = ContainerPrefix + PathName;\n        if (FHU::Filesystem::Exists(ContainerPath)) {\n          return ContainerPath;\n        }\n      }\n    }\n  }\n  return {};\n}\n\nconstexpr char ContainerManager[] = \"/run/host/container-manager\";\n\nfextl::string FindContainer() {\n  // We only support pressure-vessel at the moment\n  if (FHU::Filesystem::Exists(ContainerManager)) {\n    fextl::string Manager {};\n    if (FEXCore::FileLoading::LoadFile(Manager, ContainerManager)) {\n      // Trim the whitespace, may contain a newline\n      return FEXCore::StringUtils::Trim(Manager);\n    }\n  }\n  return {};\n}\n\nfextl::string FindContainerPrefix() {\n  // We only support pressure-vessel at the moment\n  if (FHU::Filesystem::Exists(ContainerManager)) {\n    fextl::string Manager {};\n    if (FEXCore::FileLoading::LoadFile(Manager, ContainerManager)) {\n      // Trim the whitespace, may contain a newline\n      if (FEXCore::StringUtils::Trim(Manager) == \"pressure-vessel\") {\n        // We are running inside of pressure vessel\n        // Our $CMAKE_INSTALL_PREFIX paths are now inside of /run/host/$CMAKE_INSTALL_PREFIX\n        return \"/run/host/\";\n      }\n    }\n  }\n  return {};\n}\n\nvoid ReloadMetaLayer() {\n  Meta->Load();\n\n  const fextl::string ContainerPrefix {FindContainerPrefix()};\n  auto ExpandPathIfExists = [&ContainerPrefix](FEXCore::Config::ConfigOption Config, const fextl::string& PathName) {\n    const auto NewPath = ExpandPath(ContainerPrefix, PathName);\n    if (!NewPath.empty()) {\n      FEXCore::Config::Set(Config, NewPath);\n    }\n  };\n\n  if (FEXCore::Config::Exists(FEXCore::Config::CONFIG_ROOTFS)) {\n    const auto PathName = *Meta->Get(FEXCore::Config::CONFIG_ROOTFS);\n    const auto ExpandedString = ExpandPath(ContainerPrefix, *PathName);\n    if (!ExpandedString.empty()) {\n      // Adjust the path if it ended up being relative\n      FEXCore::Config::Set(FEXCore::Config::CONFIG_ROOTFS, ExpandedString);\n    } else if (!PathName->empty()) {\n      // If the filesystem doesn't exist then let's see if it exists in the fex-emu folder\n      const auto PathNameCopy = *PathName;\n      for (auto Global : {true, false}) {\n        for (auto DirectoryFetchers : {GetDataDirectory, GetConfigDirectory}) {\n          fextl::string NamedRootFS = DirectoryFetchers(Global) + \"RootFS/\" + PathNameCopy;\n          if (FHU::Filesystem::Exists(NamedRootFS)) {\n            FEXCore::Config::Set(FEXCore::Config::CONFIG_ROOTFS, NamedRootFS);\n          }\n        }\n      }\n    }\n  }\n  if (FEXCore::Config::Exists(FEXCore::Config::CONFIG_THUNKHOSTLIBS)) {\n    const auto PathName = *Meta->Get(FEXCore::Config::CONFIG_THUNKHOSTLIBS);\n    ExpandPathIfExists(FEXCore::Config::CONFIG_THUNKHOSTLIBS, *PathName);\n  }\n  if (FEXCore::Config::Exists(FEXCore::Config::CONFIG_THUNKGUESTLIBS)) {\n    const auto PathName = *Meta->Get(FEXCore::Config::CONFIG_THUNKGUESTLIBS);\n    ExpandPathIfExists(FEXCore::Config::CONFIG_THUNKGUESTLIBS, *PathName);\n  }\n  if (FEXCore::Config::Exists(FEXCore::Config::CONFIG_THUNKCONFIG)) {\n    const auto PathName = *Meta->Get(FEXCore::Config::CONFIG_THUNKCONFIG);\n    const auto ExpandedString = ExpandPath(ContainerPrefix, *PathName);\n    if (!ExpandedString.empty()) {\n      // Adjust the path if it ended up being relative\n      FEXCore::Config::Set(FEXCore::Config::CONFIG_THUNKCONFIG, ExpandedString);\n    } else if (!PathName->empty()) {\n      // If the filesystem doesn't exist then let's see if it exists in the fex-emu folder\n      const auto PathNameCopy = *PathName;\n      for (auto Global : {true, false}) {\n        for (auto DirectoryFetchers : {GetDataDirectory, GetConfigDirectory}) {\n          fextl::string NamedConfig = DirectoryFetchers(Global) + \"ThunkConfigs/\" + PathNameCopy;\n          if (FHU::Filesystem::Exists(NamedConfig)) {\n            FEXCore::Config::Set(FEXCore::Config::CONFIG_THUNKCONFIG, NamedConfig);\n          }\n        }\n      }\n    }\n  }\n  if (FEXCore::Config::Exists(FEXCore::Config::CONFIG_OUTPUTLOG)) {\n    const auto PathName = *Meta->Get(FEXCore::Config::CONFIG_OUTPUTLOG);\n    if (*PathName != \"stdout\" && *PathName != \"stderr\" && *PathName != \"server\") {\n      ExpandPathIfExists(FEXCore::Config::CONFIG_OUTPUTLOG, *PathName);\n    }\n  }\n\n  if (FEXCore::Config::Exists(FEXCore::Config::CONFIG_DUMPIR) && !FEXCore::Config::Exists(FEXCore::Config::CONFIG_PASSMANAGERDUMPIR)) {\n    // If DumpIR is set but no PassManagerDumpIR configuration is set, then default to `afteropt`\n    const auto PathName = *Meta->Get(FEXCore::Config::CONFIG_DUMPIR);\n    if (*PathName != \"no\") {\n      Set(FEXCore::Config::ConfigOption::CONFIG_PASSMANAGERDUMPIR,\n          fextl::fmt::format(\"{}\", static_cast<uint64_t>(FEXCore::Config::PassManagerDumpIR::AFTEROPT)));\n    }\n  }\n\n  if (FEXCore::Config::Exists(FEXCore::Config::CONFIG_SINGLESTEP) && Meta->GetConv<bool>(FEXCore::Config::CONFIG_SINGLESTEP).value_or(false)) {\n    // Single stepping also enforces single instruction size blocks\n    Set(FEXCore::Config::ConfigOption::CONFIG_MAXINST, \"1\");\n  }\n}\n\nvoid AddLayer(fextl::unique_ptr<FEXCore::Config::Layer> _Layer) {\n  ConfigLayers.emplace(_Layer->GetLayerType(), std::move(_Layer));\n}\n\nbool Exists(ConfigOption Option) {\n  return Meta->OptionExists(Option);\n}\n\nstd::optional<StringArrayType*> All(ConfigOption Option) {\n  return Meta->All(Option);\n}\n\nstd::optional<fextl::string*> Get(ConfigOption Option) {\n  return Meta->Get(Option);\n}\n\ntemplate<typename T>\nstd::optional<T> GetConv(ConfigOption Option) {\n  return Meta->GetConv<T>(Option);\n}\n\ntemplate std::optional<bool> GetConv(ConfigOption Option);\ntemplate std::optional<uint8_t> GetConv(ConfigOption Option);\ntemplate std::optional<int32_t> GetConv(ConfigOption Option);\ntemplate std::optional<uint32_t> GetConv(ConfigOption Option);\ntemplate std::optional<uint64_t> GetConv(ConfigOption Option);\n\nvoid Set(ConfigOption Option, std::string_view Data) {\n  Meta->Set(Option, Data);\n}\n\nvoid Erase(ConfigOption Option) {\n  Meta->Erase(Option);\n}\n\ntemplate<typename T>\nT Value<T>::GetIfExists(FEXCore::Config::ConfigOption Option, T Default) {\n  auto Value = FEXCore::Config::GetConv<T>(Option);\n  if (Value) {\n    return *Value;\n  }\n\n  return Default;\n}\n\ntemplate<>\nfextl::string Value<fextl::string>::GetIfExists(FEXCore::Config::ConfigOption Option, fextl::string Default) {\n  auto Value = FEXCore::Config::Get(Option);\n  if (Value) {\n    return **Value;\n  } else {\n    return Default;\n  }\n}\n\ntemplate<>\nfextl::string Value<fextl::string>::GetIfExists(FEXCore::Config::ConfigOption Option, std::string_view Default) {\n  auto Value = FEXCore::Config::Get(Option);\n  if (Value) {\n    return **Value;\n  } else {\n    return fextl::string(Default);\n  }\n}\n\ntemplate bool Value<bool>::GetIfExists(FEXCore::Config::ConfigOption Option, bool Default);\ntemplate int8_t Value<int8_t>::GetIfExists(FEXCore::Config::ConfigOption Option, int8_t Default);\ntemplate uint8_t Value<uint8_t>::GetIfExists(FEXCore::Config::ConfigOption Option, uint8_t Default);\ntemplate int16_t Value<int16_t>::GetIfExists(FEXCore::Config::ConfigOption Option, int16_t Default);\ntemplate uint16_t Value<uint16_t>::GetIfExists(FEXCore::Config::ConfigOption Option, uint16_t Default);\ntemplate int32_t Value<int32_t>::GetIfExists(FEXCore::Config::ConfigOption Option, int32_t Default);\ntemplate uint32_t Value<uint32_t>::GetIfExists(FEXCore::Config::ConfigOption Option, uint32_t Default);\ntemplate int64_t Value<int64_t>::GetIfExists(FEXCore::Config::ConfigOption Option, int64_t Default);\ntemplate uint64_t Value<uint64_t>::GetIfExists(FEXCore::Config::ConfigOption Option, uint64_t Default);\n\n// Constructor\ntemplate Value<fextl::string>::Value(FEXCore::Config::ConfigOption _Option, fextl::string Default);\ntemplate Value<bool>::Value(FEXCore::Config::ConfigOption _Option, bool Default);\ntemplate Value<uint8_t>::Value(FEXCore::Config::ConfigOption _Option, uint8_t Default);\ntemplate Value<uint64_t>::Value(FEXCore::Config::ConfigOption _Option, uint64_t Default);\n\ntemplate<typename T>\nvoid Value<T>::GetListIfExists(FEXCore::Config::ConfigOption Option, StringArrayType* List) {\n  auto Value = FEXCore::Config::All(Option);\n  List->clear();\n  if (Value) {\n    *List = **Value;\n  }\n}\ntemplate void Value<StringArrayType>::GetListIfExists(FEXCore::Config::ConfigOption Option, StringArrayType* List);\n} // namespace FEXCore::Config\n"
  },
  {
    "path": "FEXCore/Source/Interface/Config/Config.json.in",
    "content": "{\n  \"Options\": {\n    \"CPU\": {\n      \"Multiblock\": {\n        \"Type\": \"bool\",\n        \"Default\": \"true\",\n        \"Desc\": [\n          \"Controls multiblock code compilation\",\n          \"Can cause long JIT compilation times and stutter\"\n        ]\n      },\n      \"MaxInst\": {\n        \"Type\": \"int32\",\n        \"Default\": \"5000\",\n        \"Desc\": [\n          \"Maximum number of instruction to store in a block\"\n        ]\n      },\n      \"EnableCodeCachingWIP\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Enable the code caching subsystem\"\n        ]\n      },\n      \"EnableCodeCacheValidation\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Enable expensive validation when loading code caches\"\n        ]\n      },\n      \"HostFeatures\": {\n        \"Type\": \"strenum\",\n        \"Default\": \"FEXCore::Config::HostFeatures::OFF\",\n        \"Enums\": {\n          \"ENABLESVE\": \"enablesve\",\n          \"DISABLESVE\": \"disablesve\",\n          \"ENABLEAVX\": \"enableavx\",\n          \"DISABLEAVX\": \"disableavx\",\n          \"ENABLEAFP\": \"enableafp\",\n          \"DISABLEAFP\": \"disableafp\",\n          \"ENABLELRCPC\": \"enablelrcpc\",\n          \"DISABLELRCPC\": \"disablelrcpc\",\n          \"ENABLELRCPC2\": \"enablelrcpc2\",\n          \"DISABLELRCPC2\": \"disablelrcpc2\",\n          \"ENABLECSSC\": \"enablecssc\",\n          \"DISABLECSSC\": \"disablecssc\",\n          \"ENABLEPMULL128\": \"enablepmull128\",\n          \"DISABLEPMULL128\": \"disablepmull128\",\n          \"ENABLERNG\": \"enablerng\",\n          \"DISABLERNG\": \"disablerng\",\n          \"ENABLECLZERO\": \"enableclzero\",\n          \"DISABLECLZERO\": \"disableclzero\",\n          \"ENABLEATOMICS\": \"enableatomics\",\n          \"DISABLEATOMICS\": \"disableatomics\",\n          \"ENABLEFCMA\": \"enablefcma\",\n          \"DISABLEFCMA\": \"disablefcma\",\n          \"ENABLEFLAGM\": \"enableflagm\",\n          \"DISABLEFLAGM\": \"disableflagm\",\n          \"ENABLEFLAGM2\": \"enableflagm2\",\n          \"DISABLEFLAGM2\": \"disableflagm2\",\n          \"ENABLEFRINTTS\": \"enablefrintts\",\n          \"DISABLEFRINTTS\": \"disablefrintts\",\n          \"ENABLECRYPTO\": \"enablecrypto\",\n          \"DISABLECRYPTO\": \"disablecrypto\",\n          \"ENABLERPRES\": \"enablerpres\",\n          \"DISABLERPRES\": \"disablerpres\",\n          \"ENABLESVEBITPERM\": \"enablesvebitperm\",\n          \"DISABLESVEBITPERM\": \"disablesvebitperm\",\n          \"ENABLEPRESERVEALLABI\": \"enablepreserveallabi\",\n          \"DISABLEPRESERVEALLABI\": \"disablepreserveallabi\",\n          \"ENABLEWFXT\": \"enablewfxt\",\n          \"DISABLEWFXT\": \"disablewfxt\",\n          \"ENABLE3DNOW\": \"enable3dnow\",\n          \"DISABLE3DNOW\": \"disable3dnow\",\n          \"ENABLESSE4A\": \"enablesse4a\",\n          \"DISABLESSE4A\": \"disablesse4a\",\n          \"ENABLEMOPS\": \"enablemops\",\n          \"DISABLEMOPS\": \"disablemops\"\n        },\n        \"Desc\": [\n          \"Allows controlling of the CPU features in the JIT.\",\n          \"\\toff: Default CPU features queried from CPU features\",\n          \"\\t{enable,disable}sve: Will force enable or disable sve even if the host doesn't support it\",\n          \"\\t{enable,disable}avx: Will force enable or disable avx even if the host doesn't support it\",\n          \"\\t{enable,disable}afp: Will force enable or disable afp even if the host doesn't support it\",\n          \"\\t{enable,disable}lrcpc: Will force enable or disable lrcpc even if the host doesn't support it\",\n          \"\\t{enable,disable}lrcpc2: Will force enable or disable lrcpc2 even if the host doesn't support it\",\n          \"\\t{enable,disable}cssc: Will force enable or disable cssc even if the host doesn't support it\",\n          \"\\t{enable,disable}pmull128: Will force enable or disable pmull128 even if the host doesn't support it\",\n          \"\\t{enable,disable}rng: Will force enable or disable rng even if the host doesn't support it\",\n          \"\\t{enable,disable}clzero: Will force enable or disable clzero even if the host doesn't support it\",\n          \"\\t{enable,disable}atomics: Will force enable or disable ARMv8.1 LSE atomics even if the host doesn't support it\",\n          \"\\t{enable,disable}fcma: Will force enable or disable fcma even if the host doesn't support it\",\n          \"\\t{enable,disable}flagm: Will force enable or disable flagm even if the host doesn't support it\",\n          \"\\t{enable,disable}flagm2: Will force enable or disable flagm2 even if the host doesn't support it\",\n          \"\\t{enable,disable}crypto: Will force enable or disable crypto extensions even if the host doesn't support it\",\n          \"\\t{enable,disable}rpres: Will force enable or disable rpres even if the host doesn't support it\",\n          \"\\t{enable,disable}svebitperm: Will force enable or disable svebitperm even if the host doesn't support it\",\n          \"\\t{enable,disable}preserveallabi: Will force enable or disable preserve_all abi even if the host doesn't support it\",\n          \"\\t{enable,disable}wfxt: Will force enable or disable wfxt even if the host doesn't support it\",\n          \"\\t{enable,disable}3dnow: Will force enable or disable 3DNow! even if the host doesn't support it\",\n          \"\\t{enable,disable}sse4a: Will force enable or disable SSE4a even if the host doesn't support it\",\n          \"\\t{enable,disable}mops: Will force enable or disable FEAT_MOPS even if the host doesn't support it\"\n        ]\n      },\n      \"SmallTSCScale\": {\n        \"Type\": \"bool\",\n        \"Default\": \"true\",\n        \"Desc\": [\n          \"Scales the cycle counter on systems that have low frequencies.\"\n        ]\n      },\n      \"HideHybrid\": {\n        \"Type\": \"bool\",\n        \"Default\": \"true\",\n        \"Desc\": [\n          \"Hides hybrid CPU core arrangement.\"\n        ]\n      },\n      \"CPUFeatureRegisters\": {\n        \"Type\": \"str\",\n        \"Default\": \"\",\n        \"Desc\": [\n          \"Allows overriding cpu feature flags for manual testing\"\n        ]\n      }\n    },\n    \"Emulation\": {\n      \"RootFS\": {\n        \"Type\": \"str\",\n        \"Default\": \"\",\n        \"Desc\": [\n          \"Which Root filesystem prefix to use\",\n          \"This can be a filesystem path\",\n          \"\\teg: ~/RootFS/Debian_x86_64\",\n          \"Or this can be a name of a rootfs\",\n          \"If the named rootfs exists in the FEX data folder then it will use that one\",\n          \"\\teg: $XDG_DATA_HOME/fex-emu/RootFS/<RootFS name>/\",\n          \"If XDG_DATA_HOME is unset, ~/.local/share will be used in its place.\",\n          \"\\teg: $HOME/.local/share/fex-emu/RootFS/<RootFS name>/\"\n        ]\n      },\n      \"ThunkHostLibs\": {\n        \"Type\": \"str\",\n        \"Default\": \"@CMAKE_INSTALL_FULL_LIBDIR@/fex-emu/HostThunks\",\n        \"Desc\": [\n          \"Folder to find the host-side thunking libraries.\"\n        ]\n      },\n      \"ThunkGuestLibs\": {\n        \"Type\": \"str\",\n        \"Default\": \"@CMAKE_INSTALL_PREFIX@/share/fex-emu/GuestThunks\",\n        \"Desc\": [\n          \"Folder to find the guest-side thunking libraries.\"\n        ]\n      },\n      \"ThunkConfig\": {\n        \"Type\": \"str\",\n        \"Default\": \"\",\n        \"Desc\": [\n          \"A json file specifying where to overlay the thunks.\",\n          \"This can be a filesystem path\",\n          \"\\teg: ~/MyThunkConfig.json\",\n          \"Or this can be a named of a Thunk config file\",\n          \"If the named config file exists in the FEX data folder folder the it will use that one\",\n          \"\\teg: $XDG_DATA_HOME/fex-emu/ThunkConfigs/<ThunkConfig name>\",\n          \"If XDG_DATA_HOME is unset, ~/.local/share will be used in its place.\",\n          \"\\teg: $HOME/.local/share/fex-emu/ThunkConfigs/<ThunkConfig name>\"\n        ]\n      },\n      \"Env\": {\n        \"Type\": \"strarray\",\n        \"Default\": \"\",\n        \"Desc\": [\n          \"Adds an environment variable to the emulated environment.\"\n        ]\n      },\n      \"HostEnv\": {\n        \"Type\": \"strarray\",\n        \"Default\": \"\",\n        \"Desc\": [\n          \"Adds an environment variable to the host environment.\",\n          \"This can be useful for setting environment variables that thunks can pick up.\",\n          \"Typically isn't necessary since the guest libc isn't thunked. But is possible.\"\n        ]\n      },\n      \"AdditionalArguments\": {\n        \"Type\": \"strarray\",\n        \"Default\": \"\",\n        \"Desc\": [\n          \"Allows the user to pass additional arguments to the application\"\n        ]\n      },\n      \"DisableL2Cache\": {\n        \"Type\": \"bool\",\n        \"Default\": \"true\",\n        \"Desc\": [\n          \"Disables FEXCore's JIT L2 cache lookup. Saving memory.\",\n          \"Can potentially introduce more stutters.\"\n        ]\n      },\n      \"DynamicL1Cache\": {\n        \"Type\": \"bool\",\n        \"Default\": \"true\",\n        \"Desc\": [\n          \"Switches FEXCore's JIT L1 cache to be dynamically sized. Saving memory.\",\n          \"Can potentially introduce more stutters.\"\n        ]\n      },\n      \"DynamicL1CacheIncreaseCountHeuristic\": {\n        \"Type\": \"uint64\",\n        \"Default\": \"250\",\n        \"Desc\": [\n          \"Threshold of lookups per second that the L1 dynamic cache should increase its size.\",\n          \"Lower numbers means more aggressive scaling upward to the maximum size.\",\n          \"Higher numbers means more conservative scaling, using less memory.\",\n          \"Can potentially introduce stutters, more likely the higher the number.\",\n          \"Don't have this number smaller than the decrease count!\"\n        ]\n      },\n      \"DynamicL1CacheDecreaseCountHeuristic\": {\n        \"Type\": \"uint64\",\n        \"Default\": \"50\",\n        \"Desc\": [\n          \"Threshold of lookups per second that the L1 dynamic cache should decrease its size.\",\n          \"The higher the number, the more aggressively it reduces the L1 cache size.\",\n          \"Lower numbers means more conservative memory savings.\",\n          \"Can potentially introduce more stutters, more likely the higher the number.\",\n          \"Don't have this number larger than the increase count!\"\n        ]\n      }\n    },\n    \"Debug\": {\n      \"SingleStep\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Single stepping configuration.\"\n        ]\n      },\n      \"GdbServer\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Enables the GDB server.\"\n        ]\n      },\n      \"DumpIR\": {\n        \"Type\": \"str\",\n        \"Default\": \"no\",\n        \"Desc\": [\n          \"Folder to dump the IR in to.\",\n          \"[no, stdout, stderr, server, <Folder>]\"\n        ]\n      },\n      \"PassManagerDumpIR\": {\n        \"Type\": \"strenum\",\n        \"Default\": \"FEXCore::Config::PassManagerDumpIR::OFF\",\n        \"Enums\": {\n          \"BEFOREOPT\": \"beforeopt\",\n          \"AFTEROPT\": \"afteropt\",\n          \"BEFOREPASS\": \"beforepass\",\n          \"AFTERPASS\": \"afterpass\"\n        },\n        \"Desc\": [\n          \"Allows controlling when FEX dumps its IR.\",\n          \"\\toff: IR dumping will be disabled\",\n          \"\\tbeforeopt: Dump IR before any optimizations\",\n          \"\\tafteropt: Dump IR after all optimizations\",\n          \"\\tbeforepass: Dump IR before every optimization pass\",\n          \"\\tafterpass: Dump IR after every optimization pass\"\n        ]\n      },\n      \"DumpGPRs\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"When the test harness ends, print the GPR state.\"\n        ]\n      },\n      \"O0\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Disables optimizations passes for debugging.\"\n        ]\n      },\n      \"GlobalJITNaming\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Uses JITSymbols to name all JIT state as one symbol\",\n          \"Useful for querying how much time is spent inside of the JIT\",\n          \"Profiling tools will show JIT time as FEXJIT\"\n        ]\n      },\n      \"LibraryJITNaming\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Uses JITSymbols to name JIT symbols grouped by library\",\n          \"Useful for querying how much time is spent in each guest library\",\n          \"Can be used to help guide thunk generation\"\n        ]\n      },\n      \"BlockJITNaming\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Uses JITSymbols to name JIT symbols\",\n          \"Useful for determining hot blocks of code\",\n          \"Has some file writing overhead per JIT block\"\n        ]\n      },\n      \"GDBSymbols\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Integrates with GDB using the JIT interface.\",\n          \"Needs the fex jit loader in GDB, which can be loaded via `jit-reader-load libFEXGDBReader.so.`\",\n          \"Also needs x86_64-linux-gnu-objdump in PATH.\",\n          \"Can be very slow.\"\n        ]\n      },\n      \"InjectLibSegFault\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Sets the environment variable LD_PRELOAD=libSegFault.so\",\n          \"This allows the user to very easily enable libSegFault without dealing with environment variables\",\n          \"Very useful for applications that have launch scripts that set the variable to nothing at launch\",\n          \"Set this in an application configuration for injecting in to only specific applications.\",\n          \"\\tNote: If x86/x86_64 libSegFault.so isn't installed then this option won't work.\"\n        ]\n      },\n      \"Disassemble\": {\n        \"Type\": \"strenum\",\n        \"Default\": \"FEXCore::Config::Disassemble::OFF\",\n        \"Enums\": {\n          \"DISPATCHER\": \"dispatcher\",\n          \"BLOCKS\": \"blocks\",\n          \"STATS\": \"stats\"\n        },\n        \"Desc\": [\n          \"Allows controlling of the vixl disassembler for generated ARM code.\",\n          \"\\toff: No disassembly will be output\",\n          \"\\tdispatcher: Will enable disassembly of the JIT dispatcher loop\",\n          \"\\tblocks: Will enable disassembly of the translated instruction code blocks\",\n          \"\\tstats: Will print stats when disassembling the code\"\n        ]\n      },\n      \"X86Disassemble\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Enables x86/x86-64 guest disassembly output for compiled blocks.\",\n          \"Requires FEX to be built with -DENABLE_ZYDIS=TRUE\"\n        ]\n      },\n      \"ForceSVEWidth\": {\n        \"Type\": \"uint32\",\n        \"Default\": \"0\",\n        \"Desc\": [\n          \"Allows overriding the SVE width in the vixl simulator.\",\n          \"Useful as a debugging feature.\"\n        ]\n      },\n      \"DisableTelemetry\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Disables telemetry at runtime.\",\n          \"Useful for CI instcountCI mostly\"\n        ]\n      }\n    },\n    \"Logging\": {\n      \"SilentLog\": {\n        \"Type\": \"bool\",\n        \"Default\": \"true\",\n        \"Desc\": [\n          \"Disables logging\"\n        ]\n      },\n      \"OutputLog\": {\n        \"Type\": \"str\",\n        \"Default\": \"server\",\n        \"Desc\": [\n          \"File to write FEX output to.\",\n          \"[stderr, server, <Filename>]\"\n        ]\n      },\n      \"TelemetryDirectory\": {\n        \"Type\": \"str\",\n        \"Default\": \"\",\n        \"Desc\": [\n          \"Redirects the telemetry folder that FEX usually writes to.\",\n          \"By default telemetry data is stored in {$FEX_APP_DATA_LOCATION,{$XDG_DATA_HOME,$HOME}/fex-emu/Telemetry/}\"\n        ]\n      },\n      \"ProfileStats\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Enables FEX's low-overhead sampling profile statistics.\",\n          \"Requires a supported version of Mangohud to see the results\"\n        ]\n      },\n      \"EnableGpuvisProfiling\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Enables profiling when FEX was built with the gpuvis profiler backend.\"\n        ]\n      }\n    },\n    \"Hacks\": {\n      \"SMCChecks\": {\n        \"Type\": \"uint8\",\n        \"Default\": \"FEXCore::Config::CONFIG_SMC_MTRACK\",\n        \"TextDefault\": \"mtrack\",\n        \"ArgumentHandler\": \"SMCCheckHandler\",\n        \"Desc\": [\n          \"Checks code for modification before execution.\",\n          \"\\tnone: No checks\",\n          \"\\tmtrack: Page tracking based invalidation (default)\",\n          \"\\tfull: Validate code before every run (slow)\"\n        ]\n      },\n      \"TSOEnabled\": {\n        \"Type\": \"bool\",\n        \"Default\": \"true\",\n        \"Desc\": [\n          \"Controls TSO IR ops.\",\n          \"Highly likely to break any multithreaded application if disabled.\"\n        ]\n      },\n      \"VectorTSOEnabled\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"When TSO emulation is enabled, controls if vector loadstores should also be atomic.\"\n        ]\n      },\n      \"MemcpySetTSOEnabled\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"When TSO emulation is enabled, controls if memcpy and memset should also be atomic.\",\n          \"Only affects REP MOVS and REP STOS instructions\"\n        ]\n      },\n      \"HalfBarrierTSOEnabled\": {\n        \"Type\": \"bool\",\n        \"Default\": \"true\",\n        \"Desc\": [\n          \"When TSO emulation is enabled, controls if unaligned loads and stores should be backpatched to half-barrier atomics.\",\n          \"Can be dangerous due to aligned loadstores through the same code now become non-atomic.\"\n        ]\n      },\n      \"StrictInProcessSplitLocks\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Strict global lock when handling an unaligned atomic that crosses a 16-byte or cacheline granularity\",\n          \"This is required to ensure a split-lock doesn't tear inside the process\"\n        ]\n      },\n      \"KernelUnalignedAtomicBackpatching\": {\n        \"Type\": \"bool\",\n        \"Default\": \"true\",\n        \"Desc\": [\n          \"When the kernel unaligned atomic handler is enabled, use backpatching to reduce kernel context switches.\"\n        ]\n      },\n      \"VolatileMetadata\": {\n        \"Type\": \"bool\",\n        \"Default\": \"true\",\n        \"Desc\": [\n          \"Use volatile metadata in PE files to inform TSO instructions when available.\",\n          \"When metadata is unavailable falls back to the currently enabled TSO options.\"\n        ]\n      },\n      \"X87ReducedPrecision\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Emulates X87 floating point using 64-bit precision. This reduces emulation accuracy and may result in rendering bugs.\"\n        ]\n      },\n      \"StallProcess\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Forces a process to stall out on initialization\",\n          \"Useful for a process that keeps restarting and doesn't work\"\n        ]\n      },\n      \"HideHypervisorBit\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Hides the hypervisor CPUID bit when set.\",\n          \"Should only be used for applications that have issues with this set.\"\n        ]\n      },\n      \"StartupSleep\": {\n        \"Type\": \"uint32\",\n        \"Default\": \"0\",\n        \"Desc\": [\n          \"Sleeps the process at startup for a duration of seconds.\",\n          \"Useful if an application crashes too quickly to attach a debugger.\"\n        ]\n      },\n      \"StartupSleepProcName\": {\n        \"Type\": \"str\",\n        \"Default\": \"\",\n        \"Desc\": [\n          \"Contrains the startup sleep to only apply to processes that match this name.\"\n        ]\n      },\n      \"MonoHacks\": {\n        \"Type\": \"bool\",\n        \"Default\": \"true\",\n        \"Desc\": [\n          \"Permits a hook-based SMC approach and smaller JIT blocks when mono is detected.\"\n        ]\n      }\n    },\n    \"Misc\": {\n      \"ServerSocketPath\": {\n        \"Type\": \"str\",\n        \"Default\": \"\",\n        \"Desc\": [\n          \"Override for a FEXServer socket path. Only useful for chroots.\"\n        ]\n      },\n      \"NeedsSeccomp\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\",\n        \"Desc\": [\n          \"Disables inline syscalls in order to support seccomp handling\"\n        ]\n      },\n      \"ExtendedVolatileMetadata\": {\n        \"Type\": \"str\",\n        \"Default\": \"\",\n        \"Desc\": [\n          \"Configuration provided volatile metadata. Only implemented for WoW64/arm64ec.\",\n          \"Limited in its use but can be handy.\",\n          \"Extends on top of what Microsoft has for volatile metadata, but also supported for WoW64.\",\n          \"Colon delimited modules, then semi-colon delimited instructions, then comma delimited ranges\",\n          \"Default disables TSO in the module, unless instructions overlap the range\",\n          \"<module>;<offset begin>-<offset-end>,...;<instruction offset to force TSO>,...:<another>\",\n          \"examples:\",\n          \"  * Disable TSO for a full module: Just provide the module name:\",\n          \"      `hl2_linux`\",\n          \"  * Disable TSO for a part of the module:\",\n          \"      `hl2_linux;<offset begin>-<offset-end>`\",\n          \"  * Disable TSO for a part of the module, but enable TSO for some instructions within the module\",\n          \"      `hl2_linux;<offset begin>-<offset-end>;<instruction offset>,<instruction offset>`\",\n          \"  * Disable TSO for multiple modules\",\n          \"      `hl2_linux:libsdl2.so`\"\n        ]\n      }\n    }\n  },\n  \"UnnamedOptions\": {\n    \"Misc\": {\n      \"INTERPRETER_INSTALLED\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\"\n      },\n      \"APP_FILENAME\": {\n        \"Type\": \"str\",\n        \"Default\": \"\"\n      },\n      \"APP_CONFIG_NAME\": {\n        \"Type\": \"str\",\n        \"Default\": \"\",\n        \"Desc\": [\n          \"This is the application config name that has been loaded.\",\n          \"This differs from APP_FILENAME in two ways\",\n          \"Where APP_FILENAME always points to the executable path that FEX-Emu is executing.\",\n          \"This matches what is used to load the AppLayer configuration name.\",\n          \"When running through a compatibility layer like wine, this will only be the exe name, instead of wine full path.\"\n        ]\n      },\n      \"IS64BIT_MODE\": {\n        \"Type\": \"bool\",\n        \"Default\": \"false\"\n      },\n      \"DISABLE_VIXL_INDIRECT_RUNTIME_CALLS\": {\n        \"Type\": \"bool\",\n        \"Default\": \"true\",\n        \"Desc\": [\n          \"This option is used for the InstructionCountCI so it can generate the same codegen between Arm64 hosts and vixl simulator hosts.\",\n          \"Vixl simulator indirect runtime calls are a special hlt instruction with metadata after it. Effectively making a custom call instruction.\",\n          \"With visual simulator calls disabled, the code generation would be the same as on a native Arm64 host, but running the code is broken.\"\n        ]\n      }\n    }\n  }\n}\n\n"
  },
  {
    "path": "FEXCore/Source/Interface/Context/Context.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Interface/Context/Context.h\"\n#include \"Interface/Core/OpcodeDispatcher.h\"\n#include \"Interface/Core/Dispatcher/Dispatcher.h\"\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/CPUID.h>\n#include <FEXCore/Core/HostFeatures.h>\n#include <FEXCore/Core/SignalDelegator.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n\n#include <FEXCore/Core/Thunks.h>\n#include \"FEXCore/Debug/InternalThreadState.h\"\n\nnamespace FEXCore::Context {\nfextl::unique_ptr<FEXCore::Context::Context> FEXCore::Context::Context::CreateNewContext(const FEXCore::HostFeatures& Features) {\n  return fextl::make_unique<FEXCore::Context::ContextImpl>(Features);\n}\n\nvoid FEXCore::Context::ContextImpl::CompileRIP(FEXCore::Core::InternalThreadState* Thread, uint64_t GuestRIP) {\n  CompileBlock(Thread->CurrentFrame, GuestRIP);\n}\n\nvoid FEXCore::Context::ContextImpl::CompileRIPCount(FEXCore::Core::InternalThreadState* Thread, uint64_t GuestRIP, uint64_t MaxInst) {\n  CompileBlock(Thread->CurrentFrame, GuestRIP, MaxInst);\n}\n\nvoid FEXCore::Context::ContextImpl::SetSignalDelegator(FEXCore::SignalDelegator* _SignalDelegation) {\n  SignalDelegation = _SignalDelegation;\n}\n\nvoid FEXCore::Context::ContextImpl::SetSyscallHandler(FEXCore::HLE::SyscallHandler* Handler) {\n  SyscallHandler = Handler;\n  SourcecodeResolver = Handler->GetSourcecodeResolver();\n}\n\nvoid FEXCore::Context::ContextImpl::SetThunkHandler(FEXCore::ThunkHandler* Handler) {\n  ThunkHandler = Handler;\n}\n\nFEXCore::CPUID::FunctionResults FEXCore::Context::ContextImpl::RunCPUIDFunction(uint32_t Function, uint32_t Leaf) {\n  return CPUID.RunFunction(Function, Leaf);\n}\n\nFEXCore::CPUID::XCRResults FEXCore::Context::ContextImpl::RunXCRFunction(uint32_t Function) {\n  return CPUID.RunXCRFunction(Function);\n}\n\nFEXCore::CPUID::FunctionResults FEXCore::Context::ContextImpl::RunCPUIDFunctionName(uint32_t Function, uint32_t Leaf, uint32_t CPU) {\n  return CPUID.RunFunctionName(Function, Leaf, CPU);\n}\n\nbool FEXCore::Context::ContextImpl::IsAddressInCodeBuffer(FEXCore::Core::InternalThreadState* Thread, uintptr_t Address) const {\n  return Thread->CPUBackend->IsAddressInCodeBuffer(Address);\n}\n} // namespace FEXCore::Context\n"
  },
  {
    "path": "FEXCore/Source/Interface/Context/Context.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"Common/JitSymbols.h\"\n#include \"Interface/Core/CPUBackend.h\"\n#include \"Interface/Core/CPUID.h\"\n#include <Interface/IR/IntrusiveIRList.h>\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/HostFeatures.h>\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/SignalScopeGuards.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/set.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/unordered_map.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <atomic>\n#include <cstddef>\n#include <cstdint>\n#include <mutex>\n#include <optional>\n#include <shared_mutex>\n\nnamespace FEXCore {\nclass SignalDelegator;\nclass ThunkHandler;\nstruct LookupCacheWriteLockToken;\n\nnamespace Core {\n  struct DebugData;\n  struct InternalThreadState;\n} // namespace Core\n\nnamespace CPU {\n  class Dispatcher;\n} // namespace CPU\n\nnamespace HLE {\n  class SourcecodeResolver;\n  class SyscallHandler;\n} // namespace HLE\n} // namespace FEXCore\n\nnamespace FEXCore::Context {\nstruct FEX_PACKED ExitFunctionLinkData {\n  uint64_t HostCode;\n  uint64_t GuestRIP;\n  int64_t CallerOffset;\n};\n\nstruct CustomIRResult {\n  void* Creator;\n  void* Data;\n\n  CustomIRResult(void* Creator, void* Data)\n    : Creator(Creator)\n    , Data(Data) {}\n};\n\nusing BlockDelinkerFunc = void (*)(FEXCore::Context::ExitFunctionLinkData* Record);\nconstexpr uint32_t TSC_SCALE_MAXIMUM = 1'000'000'000; ///< 1Ghz\n\nclass CodeCache : public AbstractCodeCache {\npublic:\n  CodeCache(ContextImpl&);\n  ~CodeCache();\n\n  ContextImpl& CTX;\n  fextl::unique_ptr<ContextImpl> ValidationCTX;\n  fextl::unique_ptr<Core::InternalThreadState> ValidationThread;\n  FEXCore::Core::CPUState::gdt_segment ValidationGDT[32] {};\n  bool IsGeneratingCache = false;\n\n  FEX_CONFIG_OPT(EnableCodeCaching, ENABLECODECACHINGWIP);\n  FEX_CONFIG_OPT(EnableCodeCacheValidation, ENABLECODECACHEVALIDATION);\n\n  uint64_t ComputeCodeMapId(std::string_view Filename, int FD) override;\n  bool SaveData(Core::InternalThreadState&, int TargetFD, const ExecutableFileSectionInfo&, uint64_t SerializedBaseAddress) override;\n  bool LoadData(Core::InternalThreadState*, std::byte* MappedCacheFile, const ExecutableFileSectionInfo&) override;\n\n  /**\n   * Performs expensive extra validation on the loaded code cache data.\n   *\n   * This kicks off an in-process recompile of all cached blocks and compares\n   * them with the cached data. Differences will be reported as fatal errors,\n   * which can uncover bugs like for example:\n   * - mismatches of the JIT configuration used during cache generation\n   * - hidden position dependencies due to missing FEX relocations\n   * - incorrect instruction padding\n   */\n  void Validate(const ExecutableFileSectionInfo&, fextl::set<uint64_t> GuestBlocks, const fextl::set<uint64_t>& HostBlocks,\n                std::span<std::byte> CachedCode);\n\n  void InitiateCacheGeneration() override {\n    IsGeneratingCache = true;\n  }\n\n  /**\n   * Applies a set of FEX relocations to the given code section.\n   *\n   * FEX relocations describe runtime-dependencies of FEX-generated code.\n   * When loading a code cache, they are used to move cached code to the\n   * dynamically chosen base address of the guest binary.\n   *\n   * Conversely, relocations are applied in reverse when writing code caches\n   * to ensure consistency across generation runs.\n   *\n   * Note that FEX relocations are unrelated to ELF/PE relocations.\n   *\n   * @param GuestDelta Guest address offset to apply to RIP-relative data\n   * @param ForStorage True for serializing data (producing deterministic output); false for de-serializing it (resolving dynamic symbols)\n   *\n   * @return Returns true on success\n   */\n  [[nodiscard]]\n  bool ApplyCodeRelocations(uint64_t GuestDelta, std::span<std::byte> Code, std::span<const CPU::Relocation> Relocations, bool ForStorage);\n};\n\nclass ContextImpl final : public FEXCore::Context::Context, public CPU::CodeBufferManager {\npublic:\n  // Context base class implementation.\n  bool InitCore() override;\n\n  void ExecuteThread(FEXCore::Core::InternalThreadState* Thread) override;\n\n  bool CheckIfBlockIsCacheable(FEXCore::Core::InternalThreadState&, uint64_t GuestRIP, uint64_t MaxInst) override;\n  void CompileRIP(FEXCore::Core::InternalThreadState* Thread, uint64_t GuestRIP) override;\n  void CompileRIPCount(FEXCore::Core::InternalThreadState* Thread, uint64_t GuestRIP, uint64_t MaxInst) override;\n\n  void HandleCallback(FEXCore::Core::InternalThreadState* Thread, uint64_t RIP) override;\n\n  bool IsAddressInCurrentBlock(FEXCore::Core::InternalThreadState* Thread, uint64_t Address, uint64_t Size) override;\n  bool IsCurrentBlockSingleInst(FEXCore::Core::InternalThreadState* Thread) override;\n  uint64_t GetGuestBlockEntry(FEXCore::Core::InternalThreadState* Thread) override;\n\n  uint64_t RestoreRIPFromHostPC(FEXCore::Core::InternalThreadState* Thread, uint64_t HostPC) override;\n  uint32_t ReconstructCompactedEFLAGS(FEXCore::Core::InternalThreadState* Thread, bool WasInJIT, const uint64_t* HostGPRs, uint64_t PSTATE) override;\n  void SetFlagsFromCompactedEFLAGS(FEXCore::Core::InternalThreadState* Thread, uint32_t EFLAGS) override;\n\n  void ReconstructXMMRegisters(const FEXCore::Core::InternalThreadState* Thread, __uint128_t* XMM_Low, __uint128_t* YMM_High) override;\n  void SetXMMRegistersFromState(FEXCore::Core::InternalThreadState* Thread, const __uint128_t* XMM_Low, const __uint128_t* YMM_High) override;\n\n  /**\n   * @brief Used to create FEX thread objects in preparation for creating a true OS thread. Does set a TID or PID.\n   *\n   * @param InitialRIP The starting RIP of this thread\n   * @param StackPointer The starting RSP of this thread\n   * @param NewThreadState The initial thread state to setup for our state, if inheriting.\n   *\n   * @return The InternalThreadState object that tracks all of the emulated thread's state\n   *\n   * Usecases:\n   *  Parent thread Creation:\n   *    - Thread = CreateThread(InitialRIP, InitialStack, nullptr, 0);\n   *    - CTX->ExecuteThread(Thread);\n   *  OS thread Creation:\n   *    - Thread = CreateThread(0, 0, NewState, PPID);\n   *    - Thread->ExecutionThread = FEXCore::Threads::Thread::Create(ThreadHandler, Arg);\n   *    - ThreadHandler calls `CTX->ExecuteThread(Thread)`\n   *  OS fork (New thread created with a clone of thread state):\n   *    - clone{2, 3}\n   *    - Thread = CreateThread(0, 0, CopyOfThreadState, PPID);\n   *    - ExecuteThread(Thread); // Starts executing without creating another host thread\n   *  Thunk callback executing guest code from native host thread\n   *    - Thread = CreateThread(0, 0, NewState, PPID);\n   *    - HandleCallback(Thread, RIP);\n   */\n\n  FEXCore::Core::InternalThreadState* CreateThread(uint64_t InitialRIP, uint64_t StackPointer, const FEXCore::Core::CPUState* NewThreadState) override;\n\n  /**\n   * @brief Destroys this FEX thread object and stops tracking it internally\n   *\n   * @param Thread The internal FEX thread state object\n   */\n  void DestroyThread(FEXCore::Core::InternalThreadState* Thread) override;\n\n#ifndef _WIN32\n  void LockBeforeFork(FEXCore::Core::InternalThreadState* Thread) override;\n  void UnlockAfterFork(FEXCore::Core::InternalThreadState* Thread, bool Child) override;\n#endif\n  void SetSignalDelegator(FEXCore::SignalDelegator* SignalDelegation) override;\n  void SetSyscallHandler(FEXCore::HLE::SyscallHandler* Handler) override;\n  void SetThunkHandler(FEXCore::ThunkHandler* Handler) override;\n\n  FEXCore::CPUID::FunctionResults RunCPUIDFunction(uint32_t Function, uint32_t Leaf) override;\n  FEXCore::CPUID::XCRResults RunXCRFunction(uint32_t Function) override;\n  FEXCore::CPUID::FunctionResults RunCPUIDFunctionName(uint32_t Function, uint32_t Leaf, uint32_t CPU) override;\n\n  CodeCache& GetCodeCache() override {\n    return CodeCache;\n  }\n\n  void SetCodeMapWriter(fextl::unique_ptr<CodeMapWriter> Writer) override {\n    CodeMapWriter = std::move(Writer);\n  }\n\n  void FlushAndCloseCodeMap() override {\n    if (CodeMapWriter) {\n      CodeMapWriter.reset();\n    }\n  }\n\n  void OnCodeBufferAllocated(const std::shared_ptr<CPU::CodeBuffer>&) override;\n  void ClearCodeCache(FEXCore::Core::InternalThreadState* Thread, bool NewCodeBuffer = true) override;\n  void InvalidateCodeBuffersCodeRange(uint64_t Start, uint64_t Length) override;\n  void InvalidateThreadCachedCodeRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Start, uint64_t Length) override;\n  FEXCore::ForkableSharedMutex& GetCodeInvalidationMutex() override {\n    return CodeInvalidationMutex;\n  }\n\n  void ConfigureAOTGen(FEXCore::Core::InternalThreadState* Thread, fextl::set<uint64_t>* ExternalBranches, uint64_t SectionMaxAddress) override;\n\n  bool IsAddressInCodeBuffer(FEXCore::Core::InternalThreadState* Thread, uintptr_t Address) const override;\n\n  // returns false if a handler was already registered\n  std::optional<CustomIRResult>\n  AddCustomIREntrypoint(uintptr_t Entrypoint, CustomIREntrypointHandler Handler, void* Creator = nullptr, void* Data = nullptr);\n\n  void AddThunkTrampolineIRHandler(uintptr_t Entrypoint, uintptr_t GuestThunkEntrypoint) override;\n\n  void AddForceTSOInformation(const IntervalList<uint64_t>& ValidRanges, fextl::set<uint64_t>&& Instructions) override;\n\n  void RemoveForceTSOInformation(uint64_t Address, uint64_t Size) override;\n\n  void MarkMonoDetected() override {\n    MonoDetected = true;\n  }\n\n  void MarkMonoBackpatcherBlock(uint64_t BlockEntry) override;\n\npublic:\n  struct {\n    uint64_t VirtualMemSize {1ULL << 36};\n    uint64_t TSCScale = 0;\n\n    // Used if the JIT needs to have its interrupt fault code emitted.\n    bool NeedsPendingInterruptFaultCheck {false};\n\n    FEX_CONFIG_OPT(Multiblock, MULTIBLOCK);\n    FEX_CONFIG_OPT(SingleStepConfig, SINGLESTEP);\n    FEX_CONFIG_OPT(GdbServer, GDBSERVER);\n    FEX_CONFIG_OPT(Is64BitMode, IS64BIT_MODE);\n    FEX_CONFIG_OPT(TSOEnabled, TSOENABLED);\n    FEX_CONFIG_OPT(VectorTSOEnabled, VECTORTSOENABLED);\n    FEX_CONFIG_OPT(MemcpySetTSOEnabled, MEMCPYSETTSOENABLED);\n    FEX_CONFIG_OPT(SMCChecks, SMCCHECKS);\n    FEX_CONFIG_OPT(MaxInstPerBlock, MAXINST);\n    FEX_CONFIG_OPT(RootFSPath, ROOTFS);\n    FEX_CONFIG_OPT(GlobalJITNaming, GLOBALJITNAMING);\n    FEX_CONFIG_OPT(LibraryJITNaming, LIBRARYJITNAMING);\n    FEX_CONFIG_OPT(BlockJITNaming, BLOCKJITNAMING);\n    FEX_CONFIG_OPT(GDBSymbols, GDBSYMBOLS);\n    FEX_CONFIG_OPT(x87ReducedPrecision, X87REDUCEDPRECISION);\n    FEX_CONFIG_OPT(DisableTelemetry, DISABLETELEMETRY);\n    FEX_CONFIG_OPT(DisableVixlIndirectCalls, DISABLE_VIXL_INDIRECT_RUNTIME_CALLS);\n    FEX_CONFIG_OPT(SmallTSCScale, SMALLTSCSCALE);\n    FEX_CONFIG_OPT(StrictInProcessSplitLocks, STRICTINPROCESSSPLITLOCKS);\n    FEX_CONFIG_OPT(MonoHacks, MONOHACKS);\n  } Config;\n\n  FEXCore::ForkableSharedMutex CodeInvalidationMutex;\n\n  uint32_t StrictSplitLockMutex {};\n\n  FEXCore::HostFeatures HostFeatures;\n  // CPUID depends on HostFeatures so needs to be initialized after that.\n  FEXCore::CPUIDEmu CPUID;\n  FEXCore::HLE::SyscallHandler* SyscallHandler {};\n  FEXCore::HLE::SourcecodeResolver* SourcecodeResolver {};\n  FEXCore::ThunkHandler* ThunkHandler {};\n  fextl::unique_ptr<FEXCore::CPU::Dispatcher> Dispatcher;\n  CodeCache CodeCache;\n  fextl::unique_ptr<CodeMapWriter> CodeMapWriter;\n\n  SignalDelegator* SignalDelegation {};\n\n  ContextImpl(const FEXCore::HostFeatures& Features);\n\n  static void ThreadRemoveCodeEntryFromJit(FEXCore::Core::CpuStateFrame* Frame, uint64_t GuestRIP);\n\n  // This is used as a replacement for the SMC writes in the mono callsite backpatcher that avoids atomic operations\n  // (safe as the invalidation mutex is locked) and manually invalidates the modified range. Allowing SMC to be detected\n  // even if faulting is disabled.\n  static void MonoBackpatcherWrite(FEXCore::Core::CpuStateFrame* Frame, uint8_t Size, uint64_t Address, uint64_t Value);\n\n  void RemoveCustomIREntrypoint(FEXCore::Core::InternalThreadState* Thread, uintptr_t Entrypoint);\n\n  struct GenerateIRResult {\n    std::optional<IR::IRListView> IRView;\n    uint64_t TotalInstructions;\n    uint64_t TotalInstructionsLength;\n    uint64_t StartAddr;\n    uint64_t Length;\n    bool NeedsAddGuestCodeRanges;\n  };\n  [[nodiscard]]\n  GenerateIRResult GenerateIR(FEXCore::Core::InternalThreadState* Thread, uint64_t GuestRIP, bool ExtendedDebugInfo, uint64_t MaxInst);\n\n  struct CompileCodeResult {\n    CPU::CPUBackend::CompiledCode CompiledCode;\n    fextl::unique_ptr<FEXCore::Core::DebugData> DebugData;\n    uint64_t StartAddr;\n    uint64_t Length;\n    bool NeedsAddGuestCodeRanges;\n  };\n  [[nodiscard]]\n  CompileCodeResult CompileCode(FEXCore::Core::InternalThreadState* Thread, uint64_t GuestRIP, uint64_t MaxInst = 0);\n  uintptr_t CompileBlock(FEXCore::Core::CpuStateFrame* Frame, uint64_t GuestRIP, uint64_t MaxInst = 0);\n  uintptr_t CompileSingleStep(FEXCore::Core::CpuStateFrame* Frame, uint64_t GuestRIP);\n\n  FEXCore::JITSymbols Symbols;\n\n  FEXCore::Utils::PooledAllocatorVirtual OpDispatcherAllocator {\"FEXMem_OpDispatcher\"};\n  FEXCore::Utils::PooledAllocatorVirtual FrontendAllocator {\"FEXMem_Frontend\"};\n  FEXCore::Utils::PooledAllocatorVirtualWithGuard CPUBackendAllocator {\"FEXMem_CPUBackend\"};\n\n  // If Atomic-based TSO emulation is enabled or not.\n  bool IsAtomicTSOEnabled() const {\n    return AtomicTSOEmulationEnabled;\n  }\n\n  // If atomic-based TSO emulation is enabled for vector operations.\n  bool IsVectorAtomicTSOEnabled() const {\n    return VectorAtomicTSOEmulationEnabled;\n  }\n\n  // If atomic-based TSO emulation is enabled for memcpy operations.\n  bool IsMemcpyAtomicTSOEnabled() const {\n    return MemcpyAtomicTSOEmulationEnabled;\n  }\n\n  void SetHardwareTSOSupport(bool HardwareTSOSupported) override {\n    SupportsHardwareTSO = HardwareTSOSupported;\n    UpdateAtomicTSOEmulationConfig();\n  }\n\n  void EnableExitOnHLT() override {\n    ExitOnHLT = true;\n  }\n\n  bool ExitOnHLTEnabled() const {\n    return ExitOnHLT;\n  }\n\n  bool AreMonoHacksActive() const {\n    return Config.MonoHacks && MonoDetected;\n  }\n\nprotected:\n  void UpdateAtomicTSOEmulationConfig() {\n    if (SupportsHardwareTSO) {\n      // If the hardware supports TSO then we don't need to emulate it through atomics.\n      AtomicTSOEmulationEnabled = false;\n      VectorAtomicTSOEmulationEnabled = false;\n      MemcpyAtomicTSOEmulationEnabled = false;\n    } else {\n      AtomicTSOEmulationEnabled = Config.TSOEnabled;\n      VectorAtomicTSOEmulationEnabled = Config.TSOEnabled && Config.VectorTSOEnabled;\n      MemcpyAtomicTSOEmulationEnabled = Config.TSOEnabled && Config.MemcpySetTSOEnabled;\n    }\n  }\n\nprivate:\n  /**\n   * @brief Initializes the JIT compilers for the thread\n   *\n   * @param State The internal FEX thread state object\n   *\n   * InitializeCompiler is called inside of CreateThread, so you likely don't need this\n   */\n  void InitializeCompiler(FEXCore::Core::InternalThreadState* Thread);\n\n  bool SupportsHardwareTSO = false;\n  bool AtomicTSOEmulationEnabled = true;\n  bool VectorAtomicTSOEmulationEnabled = false;\n  bool MemcpyAtomicTSOEmulationEnabled = false;\n\n  bool ExitOnHLT = false;\n  FEX_CONFIG_OPT(AppFilename, APP_FILENAME);\n\n  std::shared_mutex CustomIRMutex;\n  std::atomic<bool> HasCustomIRHandlers {};\n  struct CustomIRHandlerEntry final {\n    CustomIREntrypointHandler Handler;\n    void* Creator;\n    void* Data;\n  };\n  fextl::unordered_map<uint64_t, CustomIRHandlerEntry> CustomIRHandlers;\n  IntervalList<uint64_t> ForceTSOValidRanges; // The ranges for which ForceTSOInstructions has populated data\n  fextl::set<uint64_t> ForceTSOInstructions;\n\n  bool MonoDetected = false;\n  std::atomic<uint64_t> MonoBackpatcherBlock;\n\n  std::mutex CodeBufferListLock;\n  fextl::vector<std::weak_ptr<CPU::CodeBuffer>> CodeBufferList;\n};\n} // namespace FEXCore::Context\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/Addressing.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Interface/Core/Addressing.h\"\n\n#include \"Interface/IR/IREmitter.h\"\n#include \"FEXCore/Utils/MathUtils.h\"\n#include \"Interface/IR/IR.h\"\n\nnamespace FEXCore::IR {\n\nRef LoadEffectiveAddress(IREmitter* IREmit, const AddressMode& A, IR::OpSize GPRSize, bool AddSegmentBase, bool AllowUpperGarbage) {\n  Ref Tmp = A.Base;\n\n  if (A.Offset) {\n    Tmp = Tmp ? IREmit->Add(GPRSize, Tmp, A.Offset) : IREmit->Constant(A.Offset);\n  }\n\n  if (A.Index) {\n    if (A.IndexScale != 1) {\n      uint32_t Log2 = FEXCore::ilog2(A.IndexScale);\n\n      if (Tmp) {\n        Tmp = IREmit->_AddShift(GPRSize, Tmp, A.Index, ShiftType::LSL, Log2);\n      } else {\n        Tmp = IREmit->_Lshl(GPRSize, A.Index, IREmit->Constant(Log2));\n      }\n    } else {\n      Tmp = Tmp ? IREmit->Add(GPRSize, Tmp, A.Index) : A.Index;\n    }\n  }\n\n  // For 64-bit AddrSize can be 32-bit or 64-bit\n  // For 32-bit AddrSize can be 32-bit or 16-bit\n  //\n  // If the AddrSize is not the GPRSize then we need to clear the upper bits.\n  if ((A.AddrSize < GPRSize) && !AllowUpperGarbage && Tmp) {\n    uint32_t Bits = IR::OpSizeAsBits(A.AddrSize);\n\n    if (A.Base || A.Index) {\n      Tmp = IREmit->_Bfe(GPRSize, Bits, 0, Tmp);\n    } else if (A.Offset) {\n      uint64_t X = A.Offset;\n      X &= (1ull << Bits) - 1;\n      Tmp = IREmit->Constant(X);\n    }\n  }\n\n  if (A.Segment && AddSegmentBase) {\n    Tmp = Tmp ? IREmit->Add(GPRSize, Tmp, A.Segment) : A.Segment;\n  }\n\n  return Tmp ?: IREmit->Constant(0);\n}\n\nAddressMode SelectAddressMode(IREmitter* IREmit, const AddressMode& A, IR::OpSize GPRSize, bool HostSupportsTSOImm9, bool AtomicTSO,\n                              bool Vector, IR::OpSize AccessSize) {\n  const auto Is32Bit = GPRSize == OpSize::i32Bit;\n  const auto GPRSizeMatchesAddrSize = A.AddrSize == GPRSize;\n  const auto OffsetIndexToLargeFor32Bit = Is32Bit && (A.Offset <= -16384 || A.Offset >= 16384);\n  if (!GPRSizeMatchesAddrSize || OffsetIndexToLargeFor32Bit) {\n    // If address size doesn't match GPR size then no optimizations can occur.\n    return {\n      .Base = LoadEffectiveAddress(IREmit, A, GPRSize, true),\n      .Index = IREmit->Invalid(),\n    };\n  }\n\n  // Loadstore rules:\n  // Non-TSO GPR:\n  // * LDR/STR:   [Reg]\n  // * LDR/STR:   [Reg + Reg, {Shift <AccessSize>}]\n  //   * Can't use with 32-bit\n  // * LDR/STR:   [Reg + [0,4095] * <AccessSize>]\n  //   * Imm must be smaller than 16k with 32-bit\n  // * LDUR/STUR: [Reg + [-256, 255]]\n  //\n  // TSO GPR:\n  // * ARMv8.0:\n  //  LDAR/STLR: [Reg]\n  // * FEAT_LRCPC:\n  //  LDAPR: [Reg]\n  // * FEAT_LRCPC2:\n  //  LDAPUR/STLUR: [Reg + [-256, 255]]\n  //\n  // Non-TSO Vector:\n  // * LDR/STR: [Reg + [0,4095] * <AccessSize>]\n  // * LDUR/STUR: [Reg + [-256,255]]\n  //\n  // TSO Vector:\n  // * ARMv8.0:\n  //   Just DMB + previous\n  // * FEAT_LRCPC3 (Unsupported by FEXCore currently):\n  //   LDAPUR/STLUR: [Reg + [-256,255]]\n\n  const auto AccessSizeAsImm = OpSizeToSize(AccessSize);\n  const bool OffsetIsSIMM9 = A.Offset && A.Offset >= -256 && A.Offset <= 255;\n  const bool OffsetIsUnsignedScaled = A.Offset > 0 && (A.Offset & (AccessSizeAsImm - 1)) == 0 && (A.Offset / AccessSizeAsImm) <= 4095;\n\n  if ((AtomicTSO && !Vector && HostSupportsTSOImm9 && OffsetIsSIMM9) || (!AtomicTSO && (OffsetIsSIMM9 || OffsetIsUnsignedScaled))) {\n    // Peel off the offset\n    AddressMode B = A;\n    B.Offset = 0;\n\n    return {\n      .Base = LoadEffectiveAddress(IREmit, B, GPRSize, true /* AddSegmentBase */, false),\n      .Index = IREmit->Constant(A.Offset),\n      .IndexType = MemOffsetType::SXTX,\n      .IndexScale = 1,\n    };\n  }\n\n  if (AtomicTSO) {\n    // TODO: LRCPC3 support for vector Imm9.\n  } else if (!Is32Bit && A.Base && (A.Index || A.Segment) && !A.Offset && (A.IndexScale == 1 || A.IndexScale == AccessSizeAsImm)) {\n    AddressMode B = A;\n\n    // ScaledRegisterLoadstore\n    if (B.Index && B.Segment) {\n      B.Base = IREmit->Add(GPRSize, B.Base, B.Segment);\n    } else if (B.Segment) {\n      B.Index = B.Segment;\n      B.IndexScale = 1;\n    }\n\n    return B;\n  }\n\n  if (Vector || !AtomicTSO) {\n    if ((A.Base || A.Segment) && A.Offset) {\n      const bool Const_16K = A.Offset > -16384 && A.Offset < 16384 && GPRSizeMatchesAddrSize && Is32Bit;\n\n      if (!Is32Bit || Const_16K) {\n        // Peel off the offset\n        AddressMode B = A;\n        B.Offset = 0;\n\n        return {\n          .Base = LoadEffectiveAddress(IREmit, B, GPRSize, true /* AddSegmentBase */, false),\n          .Index = IREmit->Constant(A.Offset),\n          .IndexType = MemOffsetType::SXTX,\n          .IndexScale = 1,\n        };\n      }\n    }\n  }\n\n  // Fallback on software address calculation\n  return {\n    .Base = LoadEffectiveAddress(IREmit, A, GPRSize, true),\n    .Index = IREmit->Invalid(),\n  };\n}\n\n\n}; // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/Addressing.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"Interface/IR/IR.h\"\n#include <cstdint>\n\nnamespace FEXCore::IR {\nclass IREmitter;\n\nstruct AddressMode {\n  Ref Segment {nullptr};\n  Ref Base {nullptr};\n  Ref Index {nullptr};\n  int64_t Offset = 0;\n\n  MemOffsetType IndexType = MemOffsetType::SXTX;\n  uint8_t IndexScale = 1;\n\n  // Size in bytes for the address calculation. 8 for an arm64 hardware mode.\n  IR::OpSize AddrSize;\n  bool NonTSO;\n};\n\nRef LoadEffectiveAddress(IREmitter* IREmit, const AddressMode& A, IR::OpSize GPRSize, bool AddSegmentBase, bool AllowUpperGarbage = false);\nAddressMode SelectAddressMode(IREmitter* IREmit, const AddressMode& A, IR::OpSize GPRSize, bool HostSupportsTSOImm9, bool AtomicTSO,\n                              bool Vector, IR::OpSize AccessSize);\n\n} // namespace FEXCore::IR"
  },
  {
    "path": "FEXCore/Source/Interface/Core/ArchHelpers/Arm64Emitter.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Interface/Core/ArchHelpers/Arm64Emitter.h\"\n#include \"Interface/Core/Dispatcher/Dispatcher.h\"\n#include \"Interface/Context/Context.h\"\n\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n\n#include <FEXHeaderUtils/BitUtils.h>\n#include <CodeEmitter/Emitter.h>\n#include <CodeEmitter/Registers.h>\n\n#ifdef VIXL_DISASSEMBLER\n#include <aarch64/cpu-aarch64.h>\n#include <aarch64/instructions-aarch64.h>\n#include <cpu-features.h>\n#include <utils-vixl.h>\n#endif\n\n#include <array>\n#include <tuple>\n#include <utility>\n\nnamespace FEXCore::CPU {\n\n// LLVM's preserve_all doc, this is used throughout this file and reproduced\n// here for reference:\n//\n//    the callee preserve all general purpose registers,\n//    except X0-X8 and X16-X18. Furthermore it also preserves lower 128 bits of\n//    V8-V31 SIMD - floating point registers.\n//\n// Note that the call necessarily also clobbers x30, the link register (LR)\n// which is not considered general purpose.\n//\n// Meanwhile, for non-preserve_all, the AAPCS64 ABI says:\n//\n//    A subroutine invocation must preserve the contents of the registers\n//    r19-r29 and SP.\n\nnamespace x64 {\n#ifndef ARCHITECTURE_arm64ec\n  // All but x19 and x29 are caller saved\n  // Note that rax/rdx are rearranged here so we can coalesce cmpxchg.\n  constexpr std::array<ARMEmitter::Register, 18> SRA = {\n    ARMEmitter::Reg::r4,\n    ARMEmitter::Reg::r7,\n    ARMEmitter::Reg::r5,\n    ARMEmitter::Reg::r6,\n    ARMEmitter::Reg::r8,\n    ARMEmitter::Reg::r9,\n    ARMEmitter::Reg::r10,\n    ARMEmitter::Reg::r11,\n    ARMEmitter::Reg::r12,\n    ARMEmitter::Reg::r13,\n    ARMEmitter::Reg::r14,\n    ARMEmitter::Reg::r15,\n    ARMEmitter::Reg::r16,\n    ARMEmitter::Reg::r17,\n    ARMEmitter::Reg::r19,\n    ARMEmitter::Reg::r29,\n    // PF/AF must be last.\n    REG_PF,\n    REG_AF,\n  };\n\n  // I wish this could get constexpr generated from SRA's definition but impossible until libstdc++12, libc++15.\n  // SRA GPRs that need to be spilled when calling a function with `preserve_all` ABI.\n  constexpr std::array<ARMEmitter::Register, 7> PreserveAll_SRA = {\n    ARMEmitter::Reg::r4, ARMEmitter::Reg::r5,  ARMEmitter::Reg::r6,  ARMEmitter::Reg::r7,\n    ARMEmitter::Reg::r8, ARMEmitter::Reg::r16, ARMEmitter::Reg::r17,\n  };\n\n  constexpr std::array<ARMEmitter::Register, 7> RA = {\n    // All these callee saved\n    ARMEmitter::Reg::r20, ARMEmitter::Reg::r21, ARMEmitter::Reg::r22, ARMEmitter::Reg::r23,\n    ARMEmitter::Reg::r24, ARMEmitter::Reg::r30, ARMEmitter::Reg::r18,\n  };\n\n  constexpr unsigned RAPairs = 4;\n\n  // Dynamic GPRs\n  constexpr std::array<ARMEmitter::Register, 2> PreserveAll_Dynamic = {\n    ARMEmitter::Reg::r18,\n    ARMEmitter::Reg::r30,\n  };\n\n  constexpr std::array<ARMEmitter::Register, 2> NotPreserved_Dynamic = PreserveAll_Dynamic;\n\n  // All are caller saved\n  constexpr std::array<ARMEmitter::VRegister, 16> SRAFPR = {\n    ARMEmitter::VReg::v16, ARMEmitter::VReg::v17, ARMEmitter::VReg::v18, ARMEmitter::VReg::v19,\n    ARMEmitter::VReg::v20, ARMEmitter::VReg::v21, ARMEmitter::VReg::v22, ARMEmitter::VReg::v23,\n    ARMEmitter::VReg::v24, ARMEmitter::VReg::v25, ARMEmitter::VReg::v26, ARMEmitter::VReg::v27,\n    ARMEmitter::VReg::v28, ARMEmitter::VReg::v29, ARMEmitter::VReg::v30, ARMEmitter::VReg::v31};\n\n  // SRA FPRs that need to be spilled when calling a function with `preserve_all` ABI.\n  constexpr std::array<ARMEmitter::Register, 0> PreserveAll_SRAFPR = {\n    // None.\n  };\n\n  //  v8..v15 = (lower 64bits) Callee saved\n  constexpr std::array<ARMEmitter::VRegister, 14> RAFPR = {\n    // v0 ~ v1 are used as temps.\n    // ARMEmitter::VReg::v0, ARMEmitter::VReg::v1,\n\n    ARMEmitter::VReg::v2,  ARMEmitter::VReg::v3,  ARMEmitter::VReg::v4,  ARMEmitter::VReg::v5,  ARMEmitter::VReg::v6,\n    ARMEmitter::VReg::v7,  ARMEmitter::VReg::v8,  ARMEmitter::VReg::v9,  ARMEmitter::VReg::v10, ARMEmitter::VReg::v11,\n    ARMEmitter::VReg::v12, ARMEmitter::VReg::v13, ARMEmitter::VReg::v14, ARMEmitter::VReg::v15,\n  };\n\n  constexpr std::array<ARMEmitter::VRegister, 6> PreserveAll_DynamicFPR = {\n    ARMEmitter::VReg::v2, ARMEmitter::VReg::v3, ARMEmitter::VReg::v4, ARMEmitter::VReg::v5, ARMEmitter::VReg::v6, ARMEmitter::VReg::v7,\n  };\n#else\n  constexpr std::array<ARMEmitter::Register, 18> SRA = {\n    ARMEmitter::Reg::r8,\n    ARMEmitter::Reg::r0,\n    ARMEmitter::Reg::r1,\n    ARMEmitter::Reg::r27,\n    // SP's register location isn't specified by the ARM64EC ABI, we choose to use r23\n    ARMEmitter::Reg::r23,\n    ARMEmitter::Reg::r29,\n    ARMEmitter::Reg::r25,\n    ARMEmitter::Reg::r26,\n    ARMEmitter::Reg::r2,\n    ARMEmitter::Reg::r3,\n    ARMEmitter::Reg::r4,\n    ARMEmitter::Reg::r5,\n    ARMEmitter::Reg::r19,\n    ARMEmitter::Reg::r20,\n    ARMEmitter::Reg::r21,\n    ARMEmitter::Reg::r22,\n    // PF/AF must be last.\n    REG_PF,\n    REG_AF,\n  };\n\n  constexpr std::array<ARMEmitter::Register, 7> PreserveAll_SRA = {\n    ARMEmitter::Reg::r0, ARMEmitter::Reg::r1, ARMEmitter::Reg::r2, ARMEmitter::Reg::r3,\n    ARMEmitter::Reg::r4, ARMEmitter::Reg::r5, ARMEmitter::Reg::r8,\n  };\n\n  constexpr std::array<ARMEmitter::Register, 6> RA = {\n    ARMEmitter::Reg::r6, ARMEmitter::Reg::r7, ARMEmitter::Reg::r14, ARMEmitter::Reg::r15, ARMEmitter::Reg::r16, ARMEmitter::Reg::r30,\n  };\n\n  constexpr std::array<ARMEmitter::Register, 5> PreserveAll_Dynamic = {ARMEmitter::Reg::r6, ARMEmitter::Reg::r7, ARMEmitter::Reg::r16,\n                                                                       ARMEmitter::Reg::r17, ARMEmitter::Reg::r30};\n\n  constexpr std::array<ARMEmitter::Register, 7> NotPreserved_Dynamic = {ARMEmitter::Reg::r6,  ARMEmitter::Reg::r7,  ARMEmitter::Reg::r14,\n                                                                        ARMEmitter::Reg::r15, ARMEmitter::Reg::r16, ARMEmitter::Reg::r17,\n                                                                        ARMEmitter::Reg::r30};\n\n  constexpr unsigned RAPairs = 4;\n\n  constexpr std::array<ARMEmitter::VRegister, 16> SRAFPR = {\n    ARMEmitter::VReg::v0,  ARMEmitter::VReg::v1,  ARMEmitter::VReg::v2,  ARMEmitter::VReg::v3,\n    ARMEmitter::VReg::v4,  ARMEmitter::VReg::v5,  ARMEmitter::VReg::v6,  ARMEmitter::VReg::v7,\n    ARMEmitter::VReg::v8,  ARMEmitter::VReg::v9,  ARMEmitter::VReg::v10, ARMEmitter::VReg::v11,\n    ARMEmitter::VReg::v12, ARMEmitter::VReg::v13, ARMEmitter::VReg::v14, ARMEmitter::VReg::v15,\n  };\n\n  constexpr std::array<ARMEmitter::VRegister, 8> PreserveAll_SRAFPR = {\n    ARMEmitter::VReg::v0, ARMEmitter::VReg::v1, ARMEmitter::VReg::v2, ARMEmitter::VReg::v3,\n    ARMEmitter::VReg::v4, ARMEmitter::VReg::v5, ARMEmitter::VReg::v6, ARMEmitter::VReg::v7,\n  };\n\n  constexpr std::array<ARMEmitter::VRegister, 14> RAFPR = {\n    ARMEmitter::VReg::v18, ARMEmitter::VReg::v19, ARMEmitter::VReg::v20, ARMEmitter::VReg::v21, ARMEmitter::VReg::v22,\n    ARMEmitter::VReg::v23, ARMEmitter::VReg::v24, ARMEmitter::VReg::v25, ARMEmitter::VReg::v26, ARMEmitter::VReg::v27,\n    ARMEmitter::VReg::v28, ARMEmitter::VReg::v29, ARMEmitter::VReg::v30, ARMEmitter::VReg::v31};\n\n  constexpr std::array<ARMEmitter::VRegister, 0> PreserveAll_DynamicFPR = {\n    // None\n  };\n#endif\n\n  constexpr uint32_t PreserveAll_SRAMask = {[]() -> uint32_t {\n    uint32_t Mask {};\n    for (auto Reg : PreserveAll_SRA) {\n      switch (Reg.Idx()) {\n      case 0:\n      case 1:\n      case 2:\n      case 3:\n      case 4:\n      case 5:\n      case 6:\n      case 7:\n      case 8:\n      case 16:\n      case 17: Mask |= (1U << Reg.Idx()); break;\n      default: break;\n      }\n    }\n\n    return Mask;\n  }()};\n\n  constexpr uint32_t PreserveAll_SRAFPRMask = {[]() -> uint32_t {\n    uint32_t Mask {};\n    for (auto Reg : PreserveAll_SRAFPR) {\n      Mask |= (1U << Reg.Idx());\n    }\n    return Mask;\n  }()};\n\n  // SRA FPRs that need to be spilled when the host supports SVE-256bit with `preserve_all` ABI.\n  // This is /all/ of the SRA registers\n  constexpr std::array<ARMEmitter::VRegister, 16> PreserveAll_SRAFPRSVE = SRAFPR;\n\n  constexpr uint32_t PreserveAll_SRAFPRSVEMask = {[]() -> uint32_t {\n    uint32_t Mask {};\n    for (auto Reg : PreserveAll_SRAFPRSVE) {\n      Mask |= (1U << Reg.Idx());\n    }\n    return Mask;\n  }()};\n\n  // Dynamic FPRs when the host supports SVE-256bit.\n  constexpr std::array<ARMEmitter::VRegister, 14> PreserveAll_DynamicFPRSVE = {\n    // v0 ~ v1 are used as temps.\n    ARMEmitter::VReg::v2,  ARMEmitter::VReg::v3,  ARMEmitter::VReg::v4,  ARMEmitter::VReg::v5,  ARMEmitter::VReg::v6,\n    ARMEmitter::VReg::v7,  ARMEmitter::VReg::v8,  ARMEmitter::VReg::v9,  ARMEmitter::VReg::v10, ARMEmitter::VReg::v11,\n    ARMEmitter::VReg::v12, ARMEmitter::VReg::v13, ARMEmitter::VReg::v14, ARMEmitter::VReg::v15,\n  };\n} // namespace x64\n\nnamespace x32 {\n  // All but x19 and x29 are caller saved. eax/edx rearranged for cmpxchg.\n  constexpr std::array<ARMEmitter::Register, 10> SRA = {\n    ARMEmitter::Reg::r4,\n    ARMEmitter::Reg::r7,\n    ARMEmitter::Reg::r5,\n    ARMEmitter::Reg::r6,\n    ARMEmitter::Reg::r8,\n    ARMEmitter::Reg::r9,\n    ARMEmitter::Reg::r10,\n    ARMEmitter::Reg::r11,\n    // PF/AF must be last.\n    REG_PF,\n    REG_AF,\n  };\n\n  constexpr std::array<ARMEmitter::Register, 14> RA = {\n    // All these callee saved\n    ARMEmitter::Reg::r20,\n    ARMEmitter::Reg::r21,\n    ARMEmitter::Reg::r22,\n    ARMEmitter::Reg::r23,\n\n    // Registers only available on 32-bit\n    // All these are caller saved (except for r19).\n    ARMEmitter::Reg::r12,\n    ARMEmitter::Reg::r13,\n    ARMEmitter::Reg::r14,\n    ARMEmitter::Reg::r15,\n    ARMEmitter::Reg::r16,\n    ARMEmitter::Reg::r17,\n    ARMEmitter::Reg::r29,\n    ARMEmitter::Reg::r30,\n\n    ARMEmitter::Reg::r24,\n    ARMEmitter::Reg::r19,\n  };\n\n  constexpr std::array<ARMEmitter::Register, 7> NotPreserved_Dynamic = {\n    ARMEmitter::Reg::r12, ARMEmitter::Reg::r13, ARMEmitter::Reg::r14, ARMEmitter::Reg::r15,\n    ARMEmitter::Reg::r16, ARMEmitter::Reg::r17, ARMEmitter::Reg::r30,\n  };\n\n  constexpr unsigned RAPairs = 10;\n\n  // All are caller saved\n  constexpr std::array<ARMEmitter::VRegister, 8> SRAFPR = {\n    ARMEmitter::VReg::v16, ARMEmitter::VReg::v17, ARMEmitter::VReg::v18, ARMEmitter::VReg::v19,\n    ARMEmitter::VReg::v20, ARMEmitter::VReg::v21, ARMEmitter::VReg::v22, ARMEmitter::VReg::v23,\n  };\n\n  //  v8..v15 = (lower 64bits) Callee saved\n  constexpr std::array<ARMEmitter::VRegister, 22> RAFPR = {\n    // v0 ~ v1 are used as temps.\n    // ARMEmitter::VReg::v0, ARMEmitter::VReg::v1,\n\n    ARMEmitter::VReg::v2,  ARMEmitter::VReg::v3,  ARMEmitter::VReg::v4,  ARMEmitter::VReg::v5,  ARMEmitter::VReg::v6,\n    ARMEmitter::VReg::v7,  ARMEmitter::VReg::v8,  ARMEmitter::VReg::v9,  ARMEmitter::VReg::v10, ARMEmitter::VReg::v11,\n    ARMEmitter::VReg::v12, ARMEmitter::VReg::v13, ARMEmitter::VReg::v14, ARMEmitter::VReg::v15,\n\n    ARMEmitter::VReg::v24, ARMEmitter::VReg::v25, ARMEmitter::VReg::v26, ARMEmitter::VReg::v27, ARMEmitter::VReg::v28,\n    ARMEmitter::VReg::v29, ARMEmitter::VReg::v30, ARMEmitter::VReg::v31};\n\n  // I wish this could get constexpr generated from SRA's definition but impossible until libstdc++12, libc++15.\n  // SRA GPRs that need to be spilled when calling a function with `preserve_all` ABI.\n  constexpr std::array<ARMEmitter::Register, 5> PreserveAll_SRA = {\n    ARMEmitter::Reg::r4, ARMEmitter::Reg::r5, ARMEmitter::Reg::r6, ARMEmitter::Reg::r7, ARMEmitter::Reg::r8,\n  };\n\n  constexpr uint32_t PreserveAll_SRAMask = {[]() -> uint32_t {\n    uint32_t Mask {};\n    for (auto Reg : PreserveAll_SRA) {\n      switch (Reg.Idx()) {\n      case 0:\n      case 1:\n      case 2:\n      case 3:\n      case 4:\n      case 5:\n      case 6:\n      case 7:\n      case 8:\n      case 16:\n      case 17: Mask |= (1U << Reg.Idx()); break;\n      default: break;\n      }\n    }\n\n    return Mask;\n  }()};\n\n  // Dynamic GPRs\n  constexpr std::array<ARMEmitter::Register, 3> PreserveAll_Dynamic = {ARMEmitter::Reg::r16, ARMEmitter::Reg::r17, ARMEmitter::Reg::r30};\n\n  // SRA FPRs that need to be spilled when calling a function with `preserve_all` ABI.\n  constexpr uint32_t PreserveAll_SRAFPRMask = 0;\n\n  // Dynamic FPRs\n  // - v0-v7\n  constexpr std::array<ARMEmitter::VRegister, 6> PreserveAll_DynamicFPR = {\n    // v0 ~ v1 are temps\n    ARMEmitter::VReg::v2, ARMEmitter::VReg::v3, ARMEmitter::VReg::v4, ARMEmitter::VReg::v5, ARMEmitter::VReg::v6, ARMEmitter::VReg::v7,\n  };\n\n  // SRA FPRs that need to be spilled when the host supports SVE-256bit with `preserve_all` ABI.\n  // This is /all/ of the SRA registers\n  constexpr std::array<ARMEmitter::VRegister, 8> PreserveAll_SRAFPRSVE = SRAFPR;\n\n  constexpr uint32_t PreserveAll_SRAFPRSVEMask = {[]() -> uint32_t {\n    uint32_t Mask {};\n    for (auto Reg : PreserveAll_SRAFPRSVE) {\n      Mask |= (1U << Reg.Idx());\n    }\n    return Mask;\n  }()};\n\n  // Dynamic FPRs when the host supports SVE-256bit.\n  constexpr std::array<ARMEmitter::VRegister, 22> PreserveAll_DynamicFPRSVE = {\n    // v0 ~ v1 are used as temps.\n    ARMEmitter::VReg::v2,  ARMEmitter::VReg::v3,  ARMEmitter::VReg::v4,  ARMEmitter::VReg::v5,  ARMEmitter::VReg::v6,\n    ARMEmitter::VReg::v7,  ARMEmitter::VReg::v8,  ARMEmitter::VReg::v9,  ARMEmitter::VReg::v10, ARMEmitter::VReg::v11,\n    ARMEmitter::VReg::v12, ARMEmitter::VReg::v13, ARMEmitter::VReg::v14, ARMEmitter::VReg::v15,\n\n    ARMEmitter::VReg::v24, ARMEmitter::VReg::v25, ARMEmitter::VReg::v26, ARMEmitter::VReg::v27, ARMEmitter::VReg::v28,\n    ARMEmitter::VReg::v29, ARMEmitter::VReg::v30, ARMEmitter::VReg::v31};\n} // namespace x32\n\n// We want vixl to not allocate a default buffer. Jit and dispatcher will manually create one.\nArm64Emitter::Arm64Emitter(FEXCore::Context::ContextImpl* ctx, void* EmissionPtr, size_t size)\n  : Emitter(static_cast<uint8_t*>(EmissionPtr), size)\n  , EmitterCTX {ctx}\n#ifdef VIXL_SIMULATOR\n  , Simulator {&SimDecoder, stdout, vixl::aarch64::SimStack(SimulatorStackSize).Allocate()}\n#endif\n{\n#ifdef VIXL_SIMULATOR\n  FEX_CONFIG_OPT(ForceSVEWidth, FORCESVEWIDTH);\n  // Hardcode a 256-bit vector width if we are running in the simulator.\n  // Allow the user to override this.\n  Simulator.SetVectorLengthInBits(ForceSVEWidth() ? ForceSVEWidth() : 256);\n  // FEX doesn't support GCS.\n  Simulator.DisableGCSCheck();\n#endif\n#ifdef VIXL_DISASSEMBLER\n  // Only setup the disassembler if enabled.\n  // vixl's decoder is expensive to setup.\n  if (Disassemble()) {\n    DisasmBuffer.resize(DISASM_BUFFER_SIZE);\n    Disasm = fextl::make_unique<vixl::aarch64::Disassembler>(DisasmBuffer.data(), DISASM_BUFFER_SIZE);\n    DisasmDecoder = fextl::make_unique<vixl::aarch64::Decoder>();\n    DisasmDecoder->AppendVisitor(Disasm.get());\n  }\n#endif\n\n  // Number of register available is dependent on what operating mode the proccess is in.\n  if (EmitterCTX->Config.Is64BitMode()) {\n    StaticRegisters = x64::SRA;\n    GeneralRegisters = x64::RA;\n    GeneralRegistersNotPreserved = x64::NotPreserved_Dynamic;\n    StaticFPRegisters = x64::SRAFPR;\n    GeneralFPRegisters = x64::RAFPR;\n    PairRegisters = x64::RAPairs;\n  } else {\n    PairRegisters = x32::RAPairs;\n\n    StaticRegisters = x32::SRA;\n    GeneralRegisters = x32::RA;\n    GeneralRegistersNotPreserved = x32::NotPreserved_Dynamic;\n\n    StaticFPRegisters = x32::SRAFPR;\n    GeneralFPRegisters = x32::RAFPR;\n  }\n}\n\nFEXCore::X86State::X86Reg Arm64Emitter::GetX86RegRelationToARMReg(ARMEmitter::Register Reg) {\n  for (size_t i = 0; i < StaticRegisters.size(); ++i) {\n    const auto& RegI = StaticRegisters[i];\n    if (RegI == Reg) {\n      // X86 Registers are mapped linerally from the StaticRegisters span.\n      // Directly correlating Enum index to span index.\n      return static_cast<FEXCore::X86State::X86Reg>(FEXCore::ToUnderlying(FEXCore::X86State::X86Reg::REG_RAX) + i);\n    }\n  }\n\n  // Unmapped register.\n  return FEXCore::X86State::X86Reg::REG_INVALID;\n}\n\nvoid Arm64Emitter::LoadConstant(ARMEmitter::Size s, ARMEmitter::Register Reg, uint64_t Constant, PadType Pad, int MaxBytes) {\n  bool NOPPad = false;\n  if (Pad == PadType::DOPAD) {\n    NOPPad = true;\n  } else if (Pad == PadType::NOPAD) {\n    NOPPad = false;\n  } else if (Pad == PadType::AUTOPAD) {\n    // Force NOP padding to ensure relocated constants always have enough encoding space available\n    NOPPad = EnableCodeCaching;\n  }\n\n  bool Is64Bit = s == ARMEmitter::Size::i64Bit;\n  const auto UpperBound = Is64Bit ? 4 : 2;\n  int Segments = MaxBytes ? (MaxBytes / 2) : UpperBound;\n\n  LOGMAN_THROW_A_FMT(MaxBytes >= 0 && MaxBytes <= (UpperBound * 2) && (MaxBytes & 1) == 0,\n                     \"MaxBytes must be bounded in the range of [0, {}] and 16-bit aligned\", UpperBound);\n  // If MaxBytes specified then make sure to sanity check incoming data.\n  LOGMAN_THROW_A_FMT(MaxBytes == 0 || (Constant >> (MaxBytes * 8)) == 0, \"MaxBytes provided but data can't fit within provided range.\");\n\n  if (Is64Bit && ((~Constant) >> 16) == 0) {\n    if (NOPPad) {\n      nop();\n      nop();\n      nop();\n    }\n\n    movn(s, Reg, (~Constant) & 0xFFFF);\n    return;\n  }\n\n  if ((Constant >> 32) == 0 && !NOPPad) {\n    // If the upper 32-bits is all zero, we can now switch to a 32-bit move.\n    // NOTE: The NOP padding code does not appropriately adjust to this yet,\n    //       so we skip this optimization in that case\n    s = ARMEmitter::Size::i32Bit;\n    Is64Bit = false;\n    Segments = std::min(Segments, 2);\n  }\n\n  if (!Is64Bit && ((~Constant) & 0xFFFF0000) == 0) {\n    if (NOPPad) {\n      nop();\n      nop();\n      nop();\n    }\n\n    movn(s, Reg.W(), (~Constant) & 0xFFFF);\n    return;\n  }\n\n  int RequiredMoveSegments {};\n\n  // Count the number of move segments\n  // We only want to use ADRP+ADD if we have more than 1 segment\n  for (size_t i = 0; i < Segments; ++i) {\n    uint16_t Part = (Constant >> (i * 16)) & 0xFFFF;\n    if (Part != 0) {\n      ++RequiredMoveSegments;\n    }\n  }\n\n  // If this can be loaded with a mov bitmask.\n  if (RequiredMoveSegments > 1) {\n    // Only try to use this path if the number of segments is > 1.\n    // `movz` is better than `orr` since hardware will rename or merge if possible when `movz` is used.\n    const auto IsImm = ARMEmitter::Emitter::IsImmLogical(Constant, RegSizeInBits(s));\n    if (IsImm) {\n      if (NOPPad) {\n        nop();\n        nop();\n        nop();\n      }\n      orr(s, Reg, ARMEmitter::Reg::zr, Constant);\n      return;\n    }\n  }\n\n  // If we can't handle negatives with the orr, try with movn+movk\n  if (Is64Bit && ((~Constant) >> 32) == 0) {\n    if (NOPPad) {\n      nop();\n      nop();\n    }\n    movn(s, Reg, (~Constant) & 0xFFFF);\n    movk(s, Reg, (Constant >> 16) & 0xFFFF, 16);\n    return;\n  }\n\n  // ADRP+ADD is specifically optimized in hardware\n  // Check if we can use this\n  auto PC = GetCursorAddress<uint64_t>();\n\n  // PC aligned to page\n  uint64_t AlignedPC = PC & ~0xFFFULL;\n\n  // Offset from aligned PC\n  auto AlignedOffset = std::bit_cast<int64_t>(Constant - AlignedPC);\n\n  int NumMoves = 0;\n\n  // If the aligned offset is within the 4GB window then we can use ADRP+ADD\n  // and the number of move segments more than 1\n  // NOTE: JIT output is moved to a different buffer after compilation, so the\n  //       current cursor address doesn't match the runtime instruction address.\n  //       Hence this optimization is disabled until we enable code relocation patches.\n  if (RequiredMoveSegments > 1 && ARMEmitter::Emitter::IsInt32(AlignedOffset) && false) {\n    // If this is 4k page aligned then we only need ADRP\n    if ((AlignedOffset & 0xFFF) == 0) {\n      adrp(Reg, AlignedOffset >> 12);\n    } else {\n      // If the constant is within 1MB of PC then we can still use ADR to load in a single instruction\n      // 21-bit signed integer here\n      auto SmallOffset = std::bit_cast<int64_t>(Constant - PC);\n      if (ARMEmitter::Emitter::IsInt21(SmallOffset)) {\n        adr(Reg, SmallOffset);\n      } else {\n        // Need to use ADRP + ADD\n        adrp(Reg, AlignedOffset >> 12);\n        add(s, Reg, Reg, Constant & 0xFFF);\n        NumMoves = 2;\n      }\n    }\n  } else {\n    int CurrentSegment = 0;\n    for (; CurrentSegment < Segments; ++CurrentSegment) {\n      uint16_t Part = (Constant >> (CurrentSegment * 16)) & 0xFFFF;\n      if (Part) {\n        movz(s, Reg, Part, CurrentSegment * 16);\n        ++CurrentSegment;\n        ++NumMoves;\n        break;\n      }\n    }\n\n    for (; CurrentSegment < Segments; ++CurrentSegment) {\n      uint16_t Part = (Constant >> (CurrentSegment * 16)) & 0xFFFF;\n      if (Part) {\n        movk(s, Reg, Part, CurrentSegment * 16);\n        ++NumMoves;\n      }\n    }\n\n    if (NumMoves == 0) {\n      // If we didn't move anything that means this is a zero move. Special case this.\n      movz(s, Reg, 0);\n      ++NumMoves;\n    }\n  }\n\n  if (NOPPad) {\n    for (int i = NumMoves; i < Segments; ++i) {\n      nop();\n    }\n  }\n}\n\nvoid Arm64Emitter::PushCalleeSavedRegisters() {\n  // We need to save pairs of registers\n  // We save r19-r30\n  constexpr static std::array<std::pair<ARMEmitter::XRegister, ARMEmitter::XRegister>, 6> CalleeSaved = {{\n    {ARMEmitter::XReg::x19, ARMEmitter::XReg::x20},\n    {ARMEmitter::XReg::x21, ARMEmitter::XReg::x22},\n    {ARMEmitter::XReg::x23, ARMEmitter::XReg::x24},\n    {ARMEmitter::XReg::x25, ARMEmitter::XReg::x26},\n    {ARMEmitter::XReg::x27, ARMEmitter::XReg::x28},\n    {ARMEmitter::XReg::x29, ARMEmitter::XReg::x30},\n  }};\n\n  for (auto& RegPair : CalleeSaved) {\n    stp<ARMEmitter::IndexType::PRE>(RegPair.first, RegPair.second, ARMEmitter::Reg::rsp, -16);\n  }\n\n  // Additionally we need to store the lower 64bits of v8-v15\n  // Here's a fun thing, we can use two ST4 instructions to store everything\n  // We just need a single sub to sp before that\n  constexpr static std::array< std::tuple<ARMEmitter::DRegister, ARMEmitter::DRegister, ARMEmitter::DRegister, ARMEmitter::DRegister>, 2> FPRs = {{\n    {ARMEmitter::DReg::d8, ARMEmitter::DReg::d9, ARMEmitter::DReg::d10, ARMEmitter::DReg::d11},\n    {ARMEmitter::DReg::d12, ARMEmitter::DReg::d13, ARMEmitter::DReg::d14, ARMEmitter::DReg::d15},\n  }};\n\n  uint32_t VectorSaveSize = sizeof(uint64_t) * 8;\n  sub(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, ARMEmitter::Reg::rsp, VectorSaveSize);\n  // SP supporting move\n  // We just saved x19 so it is safe\n  add(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r19, ARMEmitter::Reg::rsp, 0);\n\n  for (auto& RegQuad : FPRs) {\n    st4(ARMEmitter::SubRegSize::i64Bit, std::get<0>(RegQuad), std::get<1>(RegQuad), std::get<2>(RegQuad), std::get<3>(RegQuad), 0,\n        ARMEmitter::Reg::r19, 32);\n  }\n}\n\nvoid Arm64Emitter::PopCalleeSavedRegisters() {\n  constexpr static std::array< std::tuple<ARMEmitter::DRegister, ARMEmitter::DRegister, ARMEmitter::DRegister, ARMEmitter::DRegister>, 2> FPRs = {{\n    {ARMEmitter::DReg::d8, ARMEmitter::DReg::d9, ARMEmitter::DReg::d10, ARMEmitter::DReg::d11},\n    {ARMEmitter::DReg::d12, ARMEmitter::DReg::d13, ARMEmitter::DReg::d14, ARMEmitter::DReg::d15},\n  }};\n\n  for (auto& RegQuad : FPRs) {\n    ld4(ARMEmitter::SubRegSize::i64Bit, std::get<0>(RegQuad), std::get<1>(RegQuad), std::get<2>(RegQuad), std::get<3>(RegQuad), 0,\n        ARMEmitter::Reg::rsp, 32);\n  }\n\n  constexpr static std::array<std::pair<ARMEmitter::XRegister, ARMEmitter::XRegister>, 6> CalleeSaved = {{\n    {ARMEmitter::XReg::x29, ARMEmitter::XReg::x30},\n    {ARMEmitter::XReg::x27, ARMEmitter::XReg::x28},\n    {ARMEmitter::XReg::x25, ARMEmitter::XReg::x26},\n    {ARMEmitter::XReg::x23, ARMEmitter::XReg::x24},\n    {ARMEmitter::XReg::x21, ARMEmitter::XReg::x22},\n    {ARMEmitter::XReg::x19, ARMEmitter::XReg::x20},\n  }};\n\n  for (auto& RegPair : CalleeSaved) {\n    ldp<ARMEmitter::IndexType::POST>(RegPair.first, RegPair.second, ARMEmitter::Reg::rsp, 16);\n  }\n}\n\nvoid Arm64Emitter::FillSpecialRegs(ARMEmitter::Register TmpReg, ARMEmitter::Register TmpReg2, bool SetFIZ, bool SetPredRegs) {\n#ifndef VIXL_SIMULATOR\n  if (EmitterCTX->HostFeatures.SupportsAFP) {\n    // Enable AFP features when filling JIT state.\n    mrs(TmpReg, ARMEmitter::SystemRegister::FPCR);\n\n    // Enable FPCR.NEP and FPCR.AH\n    // NEP(2): Changes ASIMD scalar instructions to insert in to the lower bits of the destination.\n    // AH(1):  Changes NaN behaviour in some instructions. Specifically fmin, fmax.\n    //\n    // Additional interesting AFP bits:\n    // FIZ(0): Flush Inputs to Zero\n    orr(ARMEmitter::Size::i64Bit, TmpReg, TmpReg,\n        (1U << 2) |   // NEP\n          (1U << 1)); // AH\n\n    if (SetFIZ) {\n      // Insert MXCSR.DAZ in to FIZ\n      ldr(TmpReg2.W(), STATE.R(), offsetof(FEXCore::Core::CPUState, mxcsr));\n      bfxil(ARMEmitter::Size::i64Bit, TmpReg, TmpReg2, 6, 1);\n    }\n\n    msr(ARMEmitter::SystemRegister::FPCR, TmpReg);\n  }\n#endif\n\n  if (SetPredRegs && (EmitterCTX->HostFeatures.SupportsSVE256 || EmitterCTX->HostFeatures.SupportsSVE128)) {\n    // Set up predicate registers.\n    // We don't bother spilling these in SpillStaticRegs,\n    // since all that matters is we restore them on a fill.\n    // It's not a concern if they get trounced by something else.\n    if (EmitterCTX->HostFeatures.SupportsSVE256) {\n      ptrue(ARMEmitter::SubRegSize::i8Bit, PRED_TMP_32B, ARMEmitter::PredicatePattern::SVE_VL32);\n    }\n\n    if (EmitterCTX->HostFeatures.SupportsSVE128) {\n      ptrue(ARMEmitter::SubRegSize::i8Bit, PRED_TMP_16B, ARMEmitter::PredicatePattern::SVE_VL16);\n    }\n\n    // Fill in the predicate register for the x87 ldst SVE optimization.\n    ptrue(ARMEmitter::SubRegSize::i16Bit, PRED_X87_SVEOPT, ARMEmitter::PredicatePattern::SVE_VL5);\n  }\n}\n\nvoid Arm64Emitter::SpillStaticRegs(ARMEmitter::Register TmpReg, SpillStaticRegOptions Options) {\n#ifndef VIXL_SIMULATOR\n  if (EmitterCTX->HostFeatures.SupportsAFP) {\n    // Disable AFP features when spilling registers.\n    //\n    // Disable FPCR.NEP and FPCR.AH and FPCR.FIZ\n    // NEP(2): Changes ASIMD scalar instructions to insert in to the lower bits of the destination.\n    // AH(1):  Changes NaN behaviour in some instructions. Specifically fmin, fmax.\n    //         Also interacts with RPRES to change reciprocal/rsqrt precision from 8-bit mantissa to 12-bit.\n    //\n    // Additional interesting AFP bits:\n    // FIZ(0): Flush Inputs to Zero\n    mrs(TmpReg, ARMEmitter::SystemRegister::FPCR);\n    bic(ARMEmitter::Size::i64Bit, TmpReg, TmpReg,\n        (1U << 2) |   // NEP\n          (1U << 1) | // AH\n          (1U << 0)); // FIZ\n    msr(ARMEmitter::SystemRegister::FPCR, TmpReg);\n  }\n#endif\n\n  if (Options.NZCV) {\n    // Regardless of what GPRs/FPRs we're spilling, we need to spill NZCV since it\n    // is always static and almost certainly clobbered by the subsequent code.\n    //\n    // TODO: Can we prove that NZCV is not used across a call in some cases and\n    // omit this? Might help x87 perf? Future idea.\n    mrs(TmpReg, ARMEmitter::SystemRegister::NZCV);\n    str(TmpReg.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n  }\n\n  // PF/AF are special, remove them from the mask\n  uint32_t PFAFMask = ((1u << REG_PF.Idx()) | ((1u << REG_AF.Idx())));\n  unsigned PFAFSpillMask = Options.GPRSpillMask & PFAFMask;\n  Options.GPRSpillMask &= ~PFAFSpillMask;\n\n  str(REG_CALLRET_SP, STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.callret_sp));\n\n  for (size_t i = 0; i < StaticRegisters.size(); i += 2) {\n    auto Reg1 = StaticRegisters[i];\n    auto Reg2 = StaticRegisters[i + 1];\n    if (((1U << Reg1.Idx()) & Options.GPRSpillMask) && ((1U << Reg2.Idx()) & Options.GPRSpillMask)) {\n      stp<ARMEmitter::IndexType::OFFSET>(Reg1.X(), Reg2.X(), STATE.R(), ARRAY_OFFSETOF(FEXCore::Core::CpuStateFrame, State.gregs, i));\n    } else if (((1U << Reg1.Idx()) & Options.GPRSpillMask)) {\n      str(Reg1.X(), STATE.R(), ARRAY_OFFSETOF(FEXCore::Core::CpuStateFrame, State.gregs, i));\n    } else if (((1U << Reg2.Idx()) & Options.GPRSpillMask)) {\n      str(Reg2.X(), STATE.R(), ARRAY_OFFSETOF(FEXCore::Core::CpuStateFrame, State.gregs, i + 1));\n    }\n  }\n\n  // Now handle PF/AF\n  if (Options.NZCV && PFAFSpillMask) {\n    auto PFOffset = offsetof(FEXCore::Core::CpuStateFrame, State.pf_raw);\n    auto AFOffset = offsetof(FEXCore::Core::CpuStateFrame, State.af_raw);\n    LOGMAN_THROW_A_FMT(PFAFSpillMask == PFAFMask, \"PF/AF not spilled together\");\n    LOGMAN_THROW_A_FMT(AFOffset == PFOffset + 4, \"PF/AF are together\");\n\n    stp<ARMEmitter::IndexType::OFFSET>(REG_PF.W(), REG_AF.W(), STATE.R(), PFOffset);\n  }\n\n  if (Options.FPRs) {\n    if (EmitterCTX->HostFeatures.SupportsAVX && EmitterCTX->HostFeatures.SupportsSVE256) {\n      for (size_t i = 0; i < StaticFPRegisters.size(); i++) {\n        const auto Reg = StaticFPRegisters[i];\n\n        if (((1U << Reg.Idx()) & Options.FPRSpillMask) != 0) {\n          mov(ARMEmitter::Size::i64Bit, TmpReg, ARRAY_OFFSETOF(Core::CpuStateFrame, State.xmm.avx.data, i));\n          st1b<ARMEmitter::SubRegSize::i8Bit>(Reg.Z(), PRED_TMP_32B, STATE.R(), TmpReg);\n        }\n      }\n    } else {\n      if (Options.GPRSpillMask && Options.FPRSpillMask == ~0U) {\n        // Optimize the common case where we can spill four registers per instruction\n        // Load the sse offset in to the temporary register\n        add(ARMEmitter::Size::i64Bit, TmpReg, STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.xmm.sse.data));\n        for (size_t i = 0; i < StaticFPRegisters.size(); i += 4) {\n          const auto Reg1 = StaticFPRegisters[i];\n          const auto Reg2 = StaticFPRegisters[i + 1];\n          const auto Reg3 = StaticFPRegisters[i + 2];\n          const auto Reg4 = StaticFPRegisters[i + 3];\n          st1<ARMEmitter::SubRegSize::i64Bit>(Reg1.Q(), Reg2.Q(), Reg3.Q(), Reg4.Q(), TmpReg, 64);\n        }\n      } else {\n        for (size_t i = 0; i < StaticFPRegisters.size(); i += 2) {\n          const auto Reg1 = StaticFPRegisters[i];\n          const auto Reg2 = StaticFPRegisters[i + 1];\n\n          if (((1U << Reg1.Idx()) & Options.FPRSpillMask) && ((1U << Reg2.Idx()) & Options.FPRSpillMask)) {\n            stp<ARMEmitter::IndexType::OFFSET>(Reg1.Q(), Reg2.Q(), STATE.R(), ARRAY_OFFSETOF(FEXCore::Core::CpuStateFrame, State.xmm.sse.data, i));\n          } else if (((1U << Reg1.Idx()) & Options.FPRSpillMask)) {\n            str(Reg1.Q(), STATE.R(), ARRAY_OFFSETOF(FEXCore::Core::CpuStateFrame, State.xmm.sse.data, i));\n          } else if (((1U << Reg2.Idx()) & Options.FPRSpillMask)) {\n            str(Reg2.Q(), STATE.R(), ARRAY_OFFSETOF(FEXCore::Core::CpuStateFrame, State.xmm.sse.data, i + 1));\n          }\n        }\n      }\n    }\n  }\n}\n\nvoid Arm64Emitter::FillStaticRegs(FillStaticRegOptions Options) {\n  auto FindTempReg = [this](uint32_t* GPRFillMask) -> std::optional<ARMEmitter::Register> {\n    for (auto Reg : StaticRegisters) {\n      if (((1U << Reg.Idx()) & *GPRFillMask)) {\n        *GPRFillMask &= ~(1U << Reg.Idx());\n        return std::make_optional(Reg);\n      }\n    }\n    return std::nullopt;\n  };\n\n  LOGMAN_THROW_A_FMT(Options.GPRFillMask != 0, \"Must fill at least 2 GPRs for a temp\");\n  uint32_t TempGPRFillMask = Options.GPRFillMask;\n  if (!Options.OptionalReg.has_value()) {\n    Options.OptionalReg = FindTempReg(&TempGPRFillMask);\n  }\n\n  if (!Options.OptionalReg2.has_value()) {\n    Options.OptionalReg2 = FindTempReg(&TempGPRFillMask);\n  }\n  LOGMAN_THROW_A_FMT(Options.OptionalReg.has_value() && Options.OptionalReg2.has_value(), \"Didn't have an SRA register to use as a \"\n                                                                                          \"temporary while \"\n                                                                                          \"spilling!\");\n\n  auto TmpReg = *Options.OptionalReg;\n  auto TmpReg2 = *Options.OptionalReg2;\n\n#ifdef ARCHITECTURE_arm64ec\n  // Load STATE in from the CPU area as x28 is not callee saved in the ARM64EC ABI.\n  ldr(TmpReg.X(), ARMEmitter::Reg::r18, TEB_CPU_AREA_OFFSET);\n  ldr(STATE, TmpReg, CPU_AREA_EMULATOR_DATA_OFFSET);\n#endif\n\n  ldr(REG_CALLRET_SP, STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.callret_sp));\n\n  if (Options.NZCV) {\n    // Regardless of what GPRs/FPRs we're filling, we need to fill NZCV since it\n    // is always static and was almost certainly clobbered.\n    //\n    // TODO: Can we prove that NZCV is not used across a call in some cases and\n    // omit this? Might help x87 perf? Future idea.\n    ldr(TmpReg.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n    msr(ARMEmitter::SystemRegister::NZCV, TmpReg);\n  }\n\n  FillSpecialRegs(TmpReg, TmpReg2, true, Options.FPRs);\n\n  if (Options.FPRs) {\n    if (EmitterCTX->HostFeatures.SupportsAVX && EmitterCTX->HostFeatures.SupportsSVE256) {\n      for (size_t i = 0; i < StaticFPRegisters.size(); i++) {\n        const auto Reg = StaticFPRegisters[i];\n        if (((1U << Reg.Idx()) & Options.FPRFillMask) != 0) {\n          mov(ARMEmitter::Size::i64Bit, TmpReg, ARRAY_OFFSETOF(Core::CpuStateFrame, State.xmm.avx.data, i));\n          ld1b<ARMEmitter::SubRegSize::i8Bit>(Reg.Z(), PRED_TMP_32B.Zeroing(), STATE.R(), TmpReg);\n        }\n      }\n    } else {\n      if (Options.GPRFillMask && Options.FPRFillMask == ~0U) {\n        // Optimize the common case where we can fill four registers per instruction.\n        // Use one of the filling static registers before we fill it.\n        // Load the sse offset in to the temporary register\n        add(ARMEmitter::Size::i64Bit, TmpReg, STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.xmm.sse.data));\n        for (size_t i = 0; i < StaticFPRegisters.size(); i += 4) {\n          const auto Reg1 = StaticFPRegisters[i];\n          const auto Reg2 = StaticFPRegisters[i + 1];\n          const auto Reg3 = StaticFPRegisters[i + 2];\n          const auto Reg4 = StaticFPRegisters[i + 3];\n          ld1<ARMEmitter::SubRegSize::i64Bit>(Reg1.Q(), Reg2.Q(), Reg3.Q(), Reg4.Q(), TmpReg, 64);\n        }\n      } else {\n        for (size_t i = 0; i < StaticFPRegisters.size(); i += 2) {\n          const auto Reg1 = StaticFPRegisters[i];\n          const auto Reg2 = StaticFPRegisters[i + 1];\n\n          if (((1U << Reg1.Idx()) & Options.FPRFillMask) && ((1U << Reg2.Idx()) & Options.FPRFillMask)) {\n            ldp<ARMEmitter::IndexType::OFFSET>(Reg1.Q(), Reg2.Q(), STATE.R(), ARRAY_OFFSETOF(FEXCore::Core::CpuStateFrame, State.xmm.sse.data, i));\n          } else if (((1U << Reg1.Idx()) & Options.FPRFillMask)) {\n            ldr(Reg1.Q(), STATE.R(), ARRAY_OFFSETOF(FEXCore::Core::CpuStateFrame, State.xmm.sse.data, i));\n          } else if (((1U << Reg2.Idx()) & Options.FPRFillMask)) {\n            ldr(Reg2.Q(), STATE.R(), ARRAY_OFFSETOF(FEXCore::Core::CpuStateFrame, State.xmm.sse.data, i + 1));\n          }\n        }\n      }\n    }\n  }\n\n  // PF/AF are special, remove them from the mask\n  uint32_t PFAFMask = ((1u << REG_PF.Idx()) | ((1u << REG_AF.Idx())));\n  uint32_t PFAFFillMask = Options.GPRFillMask & PFAFMask;\n  Options.GPRFillMask &= ~PFAFMask;\n\n  for (size_t i = 0; i < StaticRegisters.size(); i += 2) {\n    auto Reg1 = StaticRegisters[i];\n    auto Reg2 = StaticRegisters[i + 1];\n    if (((1U << Reg1.Idx()) & Options.GPRFillMask) && ((1U << Reg2.Idx()) & Options.GPRFillMask)) {\n      ldp<ARMEmitter::IndexType::OFFSET>(Reg1.X(), Reg2.X(), STATE.R(), ARRAY_OFFSETOF(FEXCore::Core::CpuStateFrame, State.gregs, i));\n    } else if ((1U << Reg1.Idx()) & Options.GPRFillMask) {\n      ldr(Reg1.X(), STATE.R(), ARRAY_OFFSETOF(FEXCore::Core::CpuStateFrame, State.gregs, i));\n    } else if ((1U << Reg2.Idx()) & Options.GPRFillMask) {\n      ldr(Reg2.X(), STATE.R(), ARRAY_OFFSETOF(FEXCore::Core::CpuStateFrame, State.gregs, i + 1));\n    }\n  }\n\n  // Now handle PF/AF\n  if (Options.NZCV && PFAFFillMask) {\n    LOGMAN_THROW_A_FMT(PFAFFillMask == PFAFMask, \"PF/AF not filled together\");\n\n    ldp<ARMEmitter::IndexType::OFFSET>(REG_PF.W(), REG_AF.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.pf_raw));\n  }\n}\n\nvoid Arm64Emitter::PushVectorRegisters(ARMEmitter::Register TmpReg, bool SVE256Regs, std::span<const ARMEmitter::VRegister> VRegs) {\n  if (SVE256Regs) {\n    size_t i = 0;\n\n    for (; i < (VRegs.size() % 4); i += 2) {\n      const auto Reg1 = VRegs[i];\n      const auto Reg2 = VRegs[i + 1];\n      st2b(Reg1.Z(), Reg2.Z(), PRED_TMP_32B, TmpReg, 0);\n      add(ARMEmitter::Size::i64Bit, TmpReg, TmpReg, 32 * 2);\n    }\n\n    for (; i < VRegs.size(); i += 4) {\n      const auto Reg1 = VRegs[i];\n      const auto Reg2 = VRegs[i + 1];\n      const auto Reg3 = VRegs[i + 2];\n      const auto Reg4 = VRegs[i + 3];\n      st4b(Reg1.Z(), Reg2.Z(), Reg3.Z(), Reg4.Z(), PRED_TMP_32B, TmpReg, 0);\n      add(ARMEmitter::Size::i64Bit, TmpReg, TmpReg, 32 * 4);\n    }\n  } else {\n    size_t i = 0;\n    for (; i < (VRegs.size() % 4); i += 2) {\n      const auto Reg1 = VRegs[i];\n      const auto Reg2 = VRegs[i + 1];\n      st1<ARMEmitter::SubRegSize::i64Bit>(Reg1.Q(), Reg2.Q(), TmpReg, 32);\n    }\n\n    for (; i < VRegs.size(); i += 4) {\n      const auto Reg1 = VRegs[i];\n      const auto Reg2 = VRegs[i + 1];\n      const auto Reg3 = VRegs[i + 2];\n      const auto Reg4 = VRegs[i + 3];\n      st1<ARMEmitter::SubRegSize::i64Bit>(Reg1.Q(), Reg2.Q(), Reg3.Q(), Reg4.Q(), TmpReg, 64);\n    }\n  }\n}\n\nvoid Arm64Emitter::PushGeneralRegisters(ARMEmitter::Register TmpReg, std::span<const ARMEmitter::Register> Regs) {\n  size_t i = 0;\n  for (; i < (Regs.size() % 2); ++i) {\n    const auto Reg1 = Regs[i];\n    str<ARMEmitter::IndexType::POST>(Reg1.X(), TmpReg, 16);\n  }\n\n  for (; i < Regs.size(); i += 2) {\n    const auto Reg1 = Regs[i];\n    const auto Reg2 = Regs[i + 1];\n    stp<ARMEmitter::IndexType::POST>(Reg1.X(), Reg2.X(), TmpReg, 16);\n  }\n}\n\nvoid Arm64Emitter::PopVectorRegisters(bool SVE256Regs, std::span<const ARMEmitter::VRegister> VRegs) {\n  if (SVE256Regs) {\n    size_t i = 0;\n    for (; i < (VRegs.size() % 4); i += 2) {\n      const auto Reg1 = VRegs[i];\n      const auto Reg2 = VRegs[i + 1];\n      ld2b(Reg1.Z(), Reg2.Z(), PRED_TMP_32B.Zeroing(), ARMEmitter::Reg::rsp);\n      add(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, ARMEmitter::Reg::rsp, 32 * 2);\n    }\n\n    for (; i < VRegs.size(); i += 4) {\n      const auto Reg1 = VRegs[i];\n      const auto Reg2 = VRegs[i + 1];\n      const auto Reg3 = VRegs[i + 2];\n      const auto Reg4 = VRegs[i + 3];\n      ld4b(Reg1.Z(), Reg2.Z(), Reg3.Z(), Reg4.Z(), PRED_TMP_32B.Zeroing(), ARMEmitter::Reg::rsp);\n      add(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, ARMEmitter::Reg::rsp, 32 * 4);\n    }\n  } else {\n    size_t i = 0;\n    for (; i < (VRegs.size() % 4); i += 2) {\n      const auto Reg1 = VRegs[i];\n      const auto Reg2 = VRegs[i + 1];\n      ld1<ARMEmitter::SubRegSize::i64Bit>(Reg1.Q(), Reg2.Q(), ARMEmitter::Reg::rsp, 32);\n    }\n\n    for (; i < VRegs.size(); i += 4) {\n      const auto Reg1 = VRegs[i];\n      const auto Reg2 = VRegs[i + 1];\n      const auto Reg3 = VRegs[i + 2];\n      const auto Reg4 = VRegs[i + 3];\n      ld1<ARMEmitter::SubRegSize::i64Bit>(Reg1.Q(), Reg2.Q(), Reg3.Q(), Reg4.Q(), ARMEmitter::Reg::rsp, 64);\n    }\n  }\n}\n\nvoid Arm64Emitter::PopGeneralRegisters(std::span<const ARMEmitter::Register> Regs) {\n  size_t i = 0;\n  for (; i < (Regs.size() % 2); ++i) {\n    const auto Reg1 = Regs[i];\n    ldr<ARMEmitter::IndexType::POST>(Reg1.X(), ARMEmitter::Reg::rsp, 16);\n  }\n  for (; i < Regs.size(); i += 2) {\n    const auto Reg1 = Regs[i];\n    const auto Reg2 = Regs[i + 1];\n    ldp<ARMEmitter::IndexType::POST>(Reg1.X(), Reg2.X(), ARMEmitter::Reg::rsp, 16);\n  }\n}\n\nsize_t Arm64Emitter::PushDynamicRegs(ARMEmitter::Register TmpReg) {\n  const auto CanUseSVE256 = EmitterCTX->HostFeatures.SupportsSVE256;\n  const auto GPRSize = GeneralRegistersNotPreserved.size() * Core::CPUState::GPR_REG_SIZE;\n  const auto FPRRegSize = CanUseSVE256 ? 32 : 16;\n  const auto FPRSize = GeneralFPRegisters.size() * FPRRegSize;\n  const uint64_t SPOffset = AlignUp(GPRSize + FPRSize, 16);\n\n  sub(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, ARMEmitter::Reg::rsp, SPOffset);\n\n  // rsp capable move\n  add(ARMEmitter::Size::i64Bit, TmpReg, ARMEmitter::Reg::rsp, 0);\n\n  LOGMAN_THROW_A_FMT(GeneralFPRegisters.size() % 2 == 0, \"Needs to have multiple of 2 FPRs for RA\");\n\n  // Push the vector registers\n  PushVectorRegisters(TmpReg, CanUseSVE256, GeneralFPRegisters);\n\n  // Push the general registers.\n  PushGeneralRegisters(TmpReg, GeneralRegistersNotPreserved);\n\n  return SPOffset;\n}\n\nvoid Arm64Emitter::PopDynamicRegs() {\n  const auto CanUseSVE256 = EmitterCTX->HostFeatures.SupportsSVE256;\n\n  // Pop vectors first\n  PopVectorRegisters(CanUseSVE256, GeneralFPRegisters);\n\n  // Pop GPRs second\n  PopGeneralRegisters(GeneralRegistersNotPreserved);\n}\n\nsize_t Arm64Emitter::SpillForPreserveAllABICall(ARMEmitter::Register TmpReg, bool FPRs) {\n  const auto CanUseSVE256 = EmitterCTX->HostFeatures.SupportsSVE256;\n  const auto FPRRegSize = CanUseSVE256 ? 32 : 16;\n\n  std::span<const ARMEmitter::Register> DynamicGPRs {};\n  std::span<const ARMEmitter::VRegister> DynamicFPRs {};\n  uint32_t PreserveSRAMask {};\n  uint32_t PreserveSRAFPRMask {};\n  if (EmitterCTX->Config.Is64BitMode()) {\n    DynamicGPRs = x64::PreserveAll_Dynamic;\n    DynamicFPRs = x64::PreserveAll_DynamicFPR;\n    PreserveSRAMask = x64::PreserveAll_SRAMask;\n    PreserveSRAFPRMask = x64::PreserveAll_SRAFPRMask;\n\n    if (CanUseSVE256) {\n      DynamicFPRs = x64::PreserveAll_DynamicFPRSVE;\n      PreserveSRAFPRMask = x64::PreserveAll_SRAFPRSVEMask;\n    }\n  } else {\n    DynamicGPRs = x32::PreserveAll_Dynamic;\n    DynamicFPRs = x32::PreserveAll_DynamicFPR;\n    PreserveSRAMask = x32::PreserveAll_SRAMask;\n    PreserveSRAFPRMask = x32::PreserveAll_SRAFPRMask;\n\n    if (CanUseSVE256) {\n      DynamicFPRs = x32::PreserveAll_DynamicFPRSVE;\n      PreserveSRAFPRMask = x32::PreserveAll_SRAFPRSVEMask;\n    }\n  }\n\n  const auto GPRSize = AlignUp(DynamicGPRs.size(), 2) * Core::CPUState::GPR_REG_SIZE;\n  const auto FPRSize = DynamicFPRs.size() * FPRRegSize;\n  const uint64_t SPOffset = AlignUp(GPRSize + FPRSize, 16);\n\n  // Spill the static registers.\n  SpillStaticRegs(TmpReg, {\n                            .GPRSpillMask = PreserveSRAMask,\n                            .FPRSpillMask = PreserveSRAFPRMask,\n                          });\n\n  sub(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, ARMEmitter::Reg::rsp, SPOffset);\n\n  // rsp capable move\n  add(ARMEmitter::Size::i64Bit, TmpReg, ARMEmitter::Reg::rsp, 0);\n\n  // Push the vector registers.\n  PushVectorRegisters(TmpReg, CanUseSVE256, DynamicFPRs);\n\n  // Push the general registers.\n  PushGeneralRegisters(TmpReg, DynamicGPRs);\n\n  return SPOffset;\n}\n\nvoid Arm64Emitter::FillForPreserveAllABICall(bool FPRs) {\n  const auto CanUseSVE256 = EmitterCTX->HostFeatures.SupportsSVE256;\n\n  std::span<const ARMEmitter::Register> DynamicGPRs {};\n  std::span<const ARMEmitter::VRegister> DynamicFPRs {};\n  uint32_t PreserveSRAMask {};\n  uint32_t PreserveSRAFPRMask {};\n\n  if (EmitterCTX->Config.Is64BitMode()) {\n    DynamicGPRs = x64::PreserveAll_Dynamic;\n    DynamicFPRs = x64::PreserveAll_DynamicFPR;\n    PreserveSRAMask = x64::PreserveAll_SRAMask;\n    PreserveSRAFPRMask = x64::PreserveAll_SRAFPRMask;\n\n    if (CanUseSVE256) {\n      DynamicFPRs = x64::PreserveAll_DynamicFPRSVE;\n      PreserveSRAFPRMask = x64::PreserveAll_SRAFPRSVEMask;\n    }\n  } else {\n    DynamicGPRs = x32::PreserveAll_Dynamic;\n    DynamicFPRs = x32::PreserveAll_DynamicFPR;\n    PreserveSRAMask = x32::PreserveAll_SRAMask;\n    PreserveSRAFPRMask = x32::PreserveAll_SRAFPRMask;\n\n    if (CanUseSVE256) {\n      DynamicFPRs = x32::PreserveAll_DynamicFPRSVE;\n      PreserveSRAFPRMask = x32::PreserveAll_SRAFPRSVEMask;\n    }\n  }\n\n  // Fill the static registers.\n  FillStaticRegs({\n    .GPRFillMask = PreserveSRAMask,\n    .FPRFillMask = PreserveSRAFPRMask,\n    .FPRs = FPRs,\n  });\n\n  // Pop the vector registers.\n  PopVectorRegisters(CanUseSVE256, DynamicFPRs);\n\n  // Pop the general registers.\n  PopGeneralRegisters(DynamicGPRs);\n}\n\nvoid Arm64Emitter::Align16B() {\n  uint64_t CurrentOffset = GetCursorAddress<uint64_t>();\n  for (uint64_t i = (-CurrentOffset & 0xF); i != 0; i -= 4) {\n    nop();\n  }\n}\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/ArchHelpers/Arm64Emitter.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Config/Config.h>\n\n#ifdef VIXL_DISASSEMBLER\n#include <aarch64/disasm-aarch64.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/vector.h>\n#endif\n#ifdef VIXL_SIMULATOR\n#include <aarch64/simulator-aarch64.h>\n#include <aarch64/simulator-constants-aarch64.h>\n#endif\n\n#include <CodeEmitter/Emitter.h>\n#include <CodeEmitter/Registers.h>\n\n#include <cstddef>\n#include <cstdint>\n#include <optional>\n#include <span>\n\nnamespace FEXCore::Context {\nclass ContextImpl;\n}\nnamespace FEXCore::X86State {\nenum X86Reg : uint32_t;\n}\n\nnamespace FEXCore::CPU {\n// Contains the address to the currently available CPU state\nconstexpr auto STATE = ARMEmitter::XReg::x28;\n\n#ifndef ARCHITECTURE_arm64ec\n// GPR temporaries. Only x3 can be used across spill boundaries\n// so if these ever need to change, be very careful about that.\nconstexpr auto TMP1 = ARMEmitter::XReg::x0;\nconstexpr auto TMP2 = ARMEmitter::XReg::x1;\nconstexpr auto TMP3 = ARMEmitter::XReg::x2;\nconstexpr auto TMP4 = ARMEmitter::XReg::x3;\nconstexpr bool TMP_ABIARGS = true;\n\n// We pin r26/r27 as PF/AF respectively, this is internal FEX ABI.\nconstexpr auto REG_PF = ARMEmitter::Reg::r26;\nconstexpr auto REG_AF = ARMEmitter::Reg::r27;\n\nconstexpr auto REG_CALLRET_SP = ARMEmitter::XReg::x25;\n\n// Vector temporaries\nconstexpr auto VTMP1 = ARMEmitter::VReg::v0;\nconstexpr auto VTMP2 = ARMEmitter::VReg::v1;\n\n// Predicate register for X87 SVE Optimization\nconstexpr auto SVE_OPT_PRED = ARMEmitter::PReg::p2;\n\n#else\nconstexpr auto TMP1 = ARMEmitter::XReg::x10;\nconstexpr auto TMP2 = ARMEmitter::XReg::x11;\nconstexpr auto TMP3 = ARMEmitter::XReg::x12;\nconstexpr auto TMP4 = ARMEmitter::XReg::x13;\nconstexpr bool TMP_ABIARGS = false;\n\n// We pin r11/r12 as PF/AF respectively for arm64ec, as r26/r27 are used for SRA.\nconstexpr auto REG_PF = ARMEmitter::Reg::r9;\nconstexpr auto REG_AF = ARMEmitter::Reg::r24;\n\nconstexpr auto REG_CALLRET_SP = ARMEmitter::XReg::x17;\n\n// Vector temporaries\nconstexpr auto VTMP1 = ARMEmitter::VReg::v16;\nconstexpr auto VTMP2 = ARMEmitter::VReg::v17;\n\n// Entry/Exit ABI\nconstexpr auto EC_CALL_CHECKER_PC_REG = ARMEmitter::XReg::x9;\nconstexpr auto EC_ENTRY_CPUAREA_REG = ARMEmitter::XReg::x17;\n\n// Predicate register for X87 SVE Optimization\nconstexpr auto SVE_OPT_PRED = ARMEmitter::PReg::p2;\n\n// These structures are not included in the standard Windows headers, define the offsets of members we care about for EC here.\nconstexpr size_t TEB_CPU_AREA_OFFSET = 0x1788;\nconstexpr size_t TEB_PEB_OFFSET = 0x60;\nconstexpr size_t PEB_EC_CODE_BITMAP_OFFSET = 0x368;\nconstexpr size_t CPU_AREA_IN_SYSCALL_CALLBACK_OFFSET = 0x1;\nconstexpr size_t CPU_AREA_EMULATOR_STACK_BASE_OFFSET = 0x8;\nconstexpr size_t CPU_AREA_EMULATOR_DATA_OFFSET = 0x30;\n\nconstexpr uint64_t EC_CODE_BITMAP_MAX_ADDRESS = 1ULL << 47;\n#endif\n\n// Will force one single instruction block to be generated first if set when entering the JIT filling SRA.\n// FillStaticRegs must preserve this\nconstexpr auto ENTRY_FILL_SRA_SINGLE_INST_REG = TMP2;\n\n// Predicate to use in the X87 SVE optimization\nconstexpr ARMEmitter::PRegister PRED_X87_SVEOPT = ARMEmitter::PReg::p2;\n\n// Predicate register temporaries (used when AVX support is enabled)\n// PRED_TMP_16B indicates a predicate register that indicates the first 16 bytes set to 1.\n// PRED_TMP_32B indicates a predicate register that indicates the first 32 bytes set to 1.\nconstexpr ARMEmitter::PRegister PRED_TMP_16B = ARMEmitter::PReg::p6;\nconstexpr ARMEmitter::PRegister PRED_TMP_32B = ARMEmitter::PReg::p7;\n\n\n// This class contains common emitter utility functions that can\n// be used by both Arm64 JIT and ARM64 Dispatcher\nclass Arm64Emitter : public ARMEmitter::Emitter {\npublic:\n  Arm64Emitter(FEXCore::Context::ContextImpl* ctx, void* EmissionPtr = nullptr, size_t size = 0);\n\n  enum class PadType {\n    // Explicitly does not need padding, even if code-caching is enabled.\n    NOPAD,\n    // Explicitly needs padding, even if code-caching is disabled.\n    DOPAD,\n    // Choose to pad or not depending on if code-caching is enabled.\n    AUTOPAD,\n  };\n  void LoadConstant(ARMEmitter::Size s, ARMEmitter::Register Reg, uint64_t Constant, PadType Pad = PadType::NOPAD, int MaxBytes = 0);\n\nprotected:\n  FEXCore::Context::ContextImpl* EmitterCTX;\n\n  std::span<const ARMEmitter::Register> StaticRegisters {};\n  std::span<const ARMEmitter::Register> GeneralRegisters {};\n  std::span<const ARMEmitter::Register> GeneralRegistersNotPreserved {};\n  std::span<const ARMEmitter::VRegister> StaticFPRegisters {};\n  std::span<const ARMEmitter::VRegister> GeneralFPRegisters {};\n  uint32_t PairRegisters = 0;\n\n  void FillSpecialRegs(ARMEmitter::Register TmpReg, ARMEmitter::Register TmpReg2, bool SetFIZ, bool SetPredRegs);\n\n  // Correlate an ARM register back to an x86 register index.\n  // Returning REG_INVALID if there was no mapping.\n  FEXCore::X86State::X86Reg GetX86RegRelationToARMReg(ARMEmitter::Register Reg);\n\n  struct SpillStaticRegOptions final {\n    uint32_t GPRSpillMask {~0U};\n    uint32_t FPRSpillMask {~0U};\n    bool FPRs {true};\n    bool NZCV {true};\n  };\n\n  struct FillStaticRegOptions final {\n    std::optional<ARMEmitter::Register> OptionalReg {std::nullopt};\n    std::optional<ARMEmitter::Register> OptionalReg2 {std::nullopt};\n    uint32_t GPRFillMask {~0U};\n    uint32_t FPRFillMask {~0U};\n    bool FPRs {true};\n    bool NZCV {true};\n  };\n\n  void SpillStaticRegs(ARMEmitter::Register TmpReg, SpillStaticRegOptions Options);\n  void FillStaticRegs(FillStaticRegOptions Options);\n\n\n  void SpillStaticRegs(ARMEmitter::Register TmpReg) {\n    // Work around a clang bug: https://bugs.llvm.org/show_bug.cgi?id=36684\n    SpillStaticRegs(TmpReg, {});\n  }\n\n  void FillStaticRegs() {\n    // Work around a clang bug: https://bugs.llvm.org/show_bug.cgi?id=36684\n    FillStaticRegs({});\n  }\n\n  // Register 0-18 + 29 + 30 are caller saved\n  static constexpr uint32_t CALLER_GPR_MASK = 0b0110'0000'0000'0111'1111'1111'1111'1111U;\n\n  // This isn't technically true because the lower 64-bits of v8..v15 are callee saved\n  // We can't guarantee only the lower 64bits are used so flush everything\n  static constexpr uint32_t CALLER_FPR_MASK = ~0U;\n\n  // Generic push and pop vector registers.\n  void PushVectorRegisters(ARMEmitter::Register TmpReg, bool SVERegs, std::span<const ARMEmitter::VRegister> VRegs);\n  void PushGeneralRegisters(ARMEmitter::Register TmpReg, std::span<const ARMEmitter::Register> Regs);\n\n  void PopVectorRegisters(bool SVERegs, std::span<const ARMEmitter::VRegister> VRegs);\n  void PopGeneralRegisters(std::span<const ARMEmitter::Register> Regs);\n\n  // Returns stack size consumed for pushing dynamic registers.\n  size_t PushDynamicRegs(ARMEmitter::Register TmpReg);\n  void PopDynamicRegs();\n\n  void PushCalleeSavedRegisters();\n  void PopCalleeSavedRegisters();\n\n  // Spills and fills SRA/Dynamic registers that are required for Arm64 `preserve_all` ABI.\n  // This ABI changes most registers to be callee saved.\n  // Caller Saved:\n  // - X0-X8, X16-X18, X30.\n  // - v0-v7\n  // - For 256-bit SVE hosts: top 128-bits of v8-v31\n  //\n  // Callee Saved:\n  // - X9-X15, X19-X29, X31\n  // - Low 128-bits of v8-v31\n  size_t SpillForPreserveAllABICall(ARMEmitter::Register TmpReg, bool FPRs = true);\n  void FillForPreserveAllABICall(bool FPRs = true);\n\n  size_t SpillForABICall(bool SupportsPreserveAllABI, ARMEmitter::Register TmpReg, bool FPRs = true) {\n    if (SupportsPreserveAllABI) {\n      return SpillForPreserveAllABICall(TmpReg, FPRs);\n    } else {\n      SpillStaticRegs(TmpReg, {\n                                .FPRs = FPRs,\n                              });\n      return PushDynamicRegs(TmpReg);\n    }\n  }\n\n  void FillForABICall(bool SupportsPreserveAllABI, bool FPRs = true) {\n    if (SupportsPreserveAllABI) {\n      FillForPreserveAllABICall(FPRs);\n    } else {\n      PopDynamicRegs();\n      FillStaticRegs({.FPRs = FPRs});\n    }\n  }\n\n  void Align16B();\n\n#ifdef VIXL_SIMULATOR\n  // Generates a vixl simulator runtime call.\n  //\n  // This matches behaviour of vixl's macro assembler, but we need to reimplement it since we aren't using the macro assembler.\n  // This isn't too complex with how vixl emits this.\n  //\n  // Emit:\n  // 1) hlt(kRuntimeCallOpcode)\n  // 2) Simulator wrapper handler\n  // 3) Function to call\n  // 4) Style of the function call (Call versus tail-call)\n\n  template<typename R, typename... P>\n  void GenerateRuntimeCall(R (*Function)(P...)) {\n    uintptr_t SimulatorWrapperAddress = reinterpret_cast<uintptr_t>(&(vixl::aarch64::Simulator::RuntimeCallStructHelper<R, P...>::Wrapper));\n\n    uintptr_t FunctionAddress = reinterpret_cast<uintptr_t>(Function);\n\n    hlt(vixl::aarch64::kRuntimeCallOpcode);\n\n    // Simulator wrapper address pointer.\n    dc64(SimulatorWrapperAddress);\n\n    // Runtime function address to call\n    dc64(FunctionAddress);\n\n    // Call type\n    dc32(vixl::aarch64::kCallRuntime);\n  }\n\n  template<typename R, typename... P>\n  void GenerateIndirectRuntimeCall(ARMEmitter::Register Reg) {\n    uintptr_t SimulatorWrapperAddress = reinterpret_cast<uintptr_t>(&(vixl::aarch64::Simulator::RuntimeCallStructHelper<R, P...>::Wrapper));\n\n    hlt(vixl::aarch64::kIndirectRuntimeCallOpcode);\n\n    // Simulator wrapper address pointer.\n    dc64(SimulatorWrapperAddress);\n\n    // Register that contains the function to call\n    dc32(Reg.Idx());\n\n    // Call type\n    dc32(vixl::aarch64::kCallRuntime);\n  }\n\n  template<>\n  void GenerateIndirectRuntimeCall<float, __uint128_t>(ARMEmitter::Register Reg) {\n    uintptr_t SimulatorWrapperAddress =\n      reinterpret_cast<uintptr_t>(&(vixl::aarch64::Simulator::RuntimeCallStructHelper<float, __uint128_t>::Wrapper));\n\n    hlt(vixl::aarch64::kIndirectRuntimeCallOpcode);\n\n    // Simulator wrapper address pointer.\n    dc64(SimulatorWrapperAddress);\n\n    // Register that contains the function to call\n    dc32(Reg.Idx());\n\n    // Call type\n    dc32(vixl::aarch64::kCallRuntime);\n  }\n#else\n  template<typename R, typename... P>\n  void GenerateRuntimeCall(R (*Function)(P...)) {\n    // Explicitly doing nothing.\n  }\n  template<typename R, typename... P>\n  void GenerateIndirectRuntimeCall(ARMEmitter::Register Reg) {\n    // Explicitly doing nothing.\n  }\n#endif\n\n#ifdef VIXL_SIMULATOR\n  vixl::aarch64::Decoder SimDecoder;\n  vixl::aarch64::Simulator Simulator;\n  constexpr static size_t SimulatorStackSize = 8 * 1024 * 1024;\n#endif\n\n#ifdef VIXL_DISASSEMBLER\n  fextl::vector<char> DisasmBuffer;\n  constexpr static int DISASM_BUFFER_SIZE {256};\n  fextl::unique_ptr<vixl::aarch64::Disassembler> Disasm;\n  fextl::unique_ptr<vixl::aarch64::Decoder> DisasmDecoder;\n\n  FEX_CONFIG_OPT(Disassemble, DISASSEMBLE);\n#endif\n\n  FEX_CONFIG_OPT(EnableCodeCaching, ENABLECODECACHINGWIP);\n};\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/CPUBackend.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"FEXCore/Config/Config.h\"\n#include \"Interface/Context/Context.h\"\n#include \"Interface/Core/CPUBackend.h\"\n#include \"Interface/Core/LookupCache.h\"\n#include \"Interface/Core/Dispatcher/Dispatcher.h\"\n\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/Utils/AllocatorHooks.h>\n#include <FEXCore/Utils/PrctlUtils.h>\n\n#include <cstdint>\n\n#ifndef _WIN32\n#include <linux/prctl.h>\n#include <sys/prctl.h>\n#endif\n\nnamespace FEXCore {\nnamespace CPU {\n\n  static constexpr size_t INITIAL_CODE_SIZE = 1024 * 1024 * 16;\n  // We don't want to move above 128MB atm because that means we will have to encode longer jumps\n  static constexpr size_t MAX_CODE_SIZE = 1024 * 1024 * 128;\n\n  constexpr static uint64_t NamedVectorConstants[FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_CONST_POOL_MAX][2] = {\n    {0x0003'0002'0001'0000ULL, 0x0007'0006'0005'0004ULL}, // NAMED_VECTOR_INCREMENTAL_U16_INDEX\n    {0x000B'000A'0009'0008ULL, 0x000F'000E'000D'000CULL}, // NAMED_VECTOR_INCREMENTAL_U16_INDEX_UPPER\n    {0x0000'0000'8000'0000ULL, 0x0000'0000'8000'0000ULL}, // NAMED_VECTOR_PADDSUBPS_INVERT\n    {0x0000'0000'8000'0000ULL, 0x0000'0000'8000'0000ULL}, // NAMED_VECTOR_PADDSUBPS_INVERT_UPPER\n    {0x8000'0000'0000'0000ULL, 0x0000'0000'0000'0000ULL}, // NAMED_VECTOR_PADDSUBPD_INVERT\n    {0x8000'0000'0000'0000ULL, 0x0000'0000'0000'0000ULL}, // NAMED_VECTOR_PADDSUBPD_INVERT_UPPER\n    {0x8000'0000'0000'0000ULL, 0x8000'0000'0000'0000ULL}, // NAMED_VECTOR_PSUBADDPS_INVERT\n    {0x8000'0000'0000'0000ULL, 0x8000'0000'0000'0000ULL}, // NAMED_VECTOR_PSUBADDPS_INVERT_UPPER\n    {0x0000'0000'0000'0000ULL, 0x8000'0000'0000'0000ULL}, // NAMED_VECTOR_PSUBADDPD_INVERT\n    {0x0000'0000'0000'0000ULL, 0x8000'0000'0000'0000ULL}, // NAMED_VECTOR_PSUBADDPD_INVERT_UPPER\n    {0x0000'0001'0000'0000ULL, 0x0000'0003'0000'0002ULL}, // NAMED_VECTOR_MOVMSKPS_SHIFT\n    {0x040B'0E01'0B0E'0104ULL, 0x0C03'0609'0306'090CULL}, // NAMED_VECTOR_AESKEYGENASSIST_SWIZZLE\n    {0x0706'0504'FFFF'FFFFULL, 0xFFFF'FFFF'0B0A'0908ULL}, // NAMED_VECTOR_BLENDPS_0110B\n    {0x0706'0504'0302'0100ULL, 0xFFFF'FFFF'0B0A'0908ULL}, // NAMED_VECTOR_BLENDPS_0111B\n    {0xFFFF'FFFF'0302'0100ULL, 0x0F0E'0D0C'FFFF'FFFFULL}, // NAMED_VECTOR_BLENDPS_1001B\n    {0x0706'0504'0302'0100ULL, 0x0F0E'0D0C'FFFF'FFFFULL}, // NAMED_VECTOR_BLENDPS_1011B\n    {0xFFFF'FFFF'0302'0100ULL, 0x0F0E'0D0C'0B0A'0908ULL}, // NAMED_VECTOR_BLENDPS_1101B\n    {0x0706'0504'FFFF'FFFFULL, 0x0F0E'0D0C'0B0A'0908ULL}, // NAMED_VECTOR_BLENDPS_1110B\n    {0x8040'2010'0804'0201ULL, 0x8040'2010'0804'0201ULL}, // NAMED_VECTOR_MOVMASKB\n    {0x8040'2010'0804'0201ULL, 0x8040'2010'0804'0201ULL}, // NAMED_VECTOR_MOVMASKB_UPPER\n    {0x8000'0000'0000'0000ULL, 0x0000'0000'0000'3FFFULL}, // NAMED_VECTOR_X87_ONE\n    {0xD49A'784B'CD1B'8AFEULL, 0x0000'0000'0000'4000ULL}, // NAMED_VECTOR_X87_LOG2_10\n    {0xB8AA'3B29'5C17'F0BCULL, 0x0000'0000'0000'3FFFULL}, // NAMED_VECTOR_X87_LOG2_E\n    {0xC90F'DAA2'2168'C235ULL, 0x0000'0000'0000'4000ULL}, // NAMED_VECTOR_X87_PI\n    {0x9A20'9A84'FBCF'F799ULL, 0x0000'0000'0000'3FFDULL}, // NAMED_VECTOR_X87_LOG10_2\n    {0xB172'17F7'D1CF'79ACULL, 0x0000'0000'0000'3FFEULL}, // NAMED_VECTOR_X87_LOG_2\n    {0x4F00'0000'4F00'0000ULL, 0x4F00'0000'4F00'0000ULL}, // NAMED_VECTOR_CVTMAX_F32_I32\n    {0x4F00'0000'4F00'0000ULL, 0x4F00'0000'4F00'0000ULL}, // NAMED_VECTOR_CVTMAX_F32_I32_UPPER\n    {0x5F00'0000'5F00'0000ULL, 0x5F00'0000'5F00'0000ULL}, // NAMED_VECTOR_CVTMAX_F32_I64\n    {0x41E0'0000'0000'0000ULL, 0x41E0'0000'0000'0000ULL}, // NAMED_VECTOR_CVTMAX_F64_I32\n    {0x41E0'0000'0000'0000ULL, 0x41E0'0000'0000'0000ULL}, // NAMED_VECTOR_CVTMAX_F64_I32_UPPER\n    {0x43E0'0000'0000'0000ULL, 0x43E0'0000'0000'0000ULL}, // NAMED_VECTOR_CVTMAX_F64_I64\n    {0x8000'0000'8000'0000ULL, 0x8000'0000'8000'0000ULL}, // NAMED_VECTOR_CVTMAX_I32\n    {0x8000'0000'0000'0000ULL, 0x8000'0000'0000'0000ULL}, // NAMED_VECTOR_CVTMAX_I64\n    {0x0000'0000'0000'0000ULL, 0x0000'0000'0000'8000ULL}, // NAMED_VECTOR_F80_SIGN_MASK\n    {0x5A82'7999'5A82'7999ULL, 0x5A82'7999'5A82'7999ULL}, // NAMED_VECTOR_SHA1RNDS_K0\n    {0x6ED9'EBA1'6ED9'EBA1ULL, 0x6ED9'EBA1'6ED9'EBA1ULL}, // NAMED_VECTOR_SHA1RNDS_K1\n    {0x8F1B'BCDC'8F1B'BCDCULL, 0x8F1B'BCDC'8F1B'BCDCULL}, // NAMED_VECTOR_SHA1RNDS_K2\n    {0xCA62'C1D6'CA62'C1D6ULL, 0xCA62'C1D6'CA62'C1D6ULL}, // NAMED_VECTOR_SHA1RNDS_K3\n  };\n\n  constexpr static auto PSHUFLW_LUT {[]() consteval {\n    struct LUTType {\n      uint64_t Val[2];\n    };\n    // Expectation for this LUT is to simulate PSHUFLW with ARM's TBL (single register) instruction\n    // PSHUFLW behaviour:\n    // 16-bit words in [63:48], [47:32], [31:16], [15:0] are selected using the 8-bit Index.\n    // For 128-bit PSHUFLW, bits [127:64] are identity copied.\n    constexpr uint64_t IdentityCopyUpper = 0x0f'0e'0d'0c'0b'0a'09'08;\n    std::array<LUTType, 256> TotalLUT {};\n    uint64_t WordSelection[4] = {\n      0x01'00,\n      0x03'02,\n      0x05'04,\n      0x07'06,\n    };\n    for (size_t i = 0; i < 256; ++i) {\n      auto& LUT = TotalLUT[i];\n      const auto Word0 = (i >> 0) & 0b11;\n      const auto Word1 = (i >> 2) & 0b11;\n      const auto Word2 = (i >> 4) & 0b11;\n      const auto Word3 = (i >> 6) & 0b11;\n\n      LUT.Val[0] = (WordSelection[Word0] << 0) | (WordSelection[Word1] << 16) | (WordSelection[Word2] << 32) | (WordSelection[Word3] << 48);\n\n      LUT.Val[1] = IdentityCopyUpper;\n    }\n    return TotalLUT;\n  }()};\n\n  constexpr static auto PSHUFHW_LUT {[]() consteval {\n    struct LUTType {\n      uint64_t Val[2];\n    };\n    // Expectation for this LUT is to simulate PSHUFHW with ARM's TBL (single register) instruction\n    // PSHUFHW behaviour:\n    // 16-bit words in [127:112], [111:96], [95:80], [79:64] are selected using the 8-bit Index.\n    // Incoming words come from bits [127:64] of the source.\n    // Bits [63:0] are identity copied.\n    constexpr uint64_t IdentityCopyLower = 0x07'06'05'04'03'02'01'00;\n    std::array<LUTType, 256> TotalLUT {};\n    uint64_t WordSelection[4] = {\n      0x09'08,\n      0x0b'0a,\n      0x0d'0c,\n      0x0f'0e,\n    };\n    for (size_t i = 0; i < 256; ++i) {\n      auto& LUT = TotalLUT[i];\n      const auto Word0 = (i >> 0) & 0b11;\n      const auto Word1 = (i >> 2) & 0b11;\n      const auto Word2 = (i >> 4) & 0b11;\n      const auto Word3 = (i >> 6) & 0b11;\n\n      LUT.Val[0] = IdentityCopyLower;\n\n      LUT.Val[1] = (WordSelection[Word0] << 0) | (WordSelection[Word1] << 16) | (WordSelection[Word2] << 32) | (WordSelection[Word3] << 48);\n    }\n    return TotalLUT;\n  }()};\n\n  constexpr static auto PSHUFD_LUT {[]() consteval {\n    struct LUTType {\n      uint64_t Val[2];\n    };\n    // Expectation for this LUT is to simulate PSHUFD with ARM's TBL (single register) instruction\n    // PSHUFD behaviour:\n    // 32-bit words in [127:96], [95:64], [63:32], [31:0] are selected using the 8-bit Index.\n    std::array<LUTType, 256> TotalLUT {};\n    uint64_t WordSelection[4] = {\n      0x03'02'01'00,\n      0x07'06'05'04,\n      0x0b'0a'09'08,\n      0x0f'0e'0d'0c,\n    };\n    for (size_t i = 0; i < 256; ++i) {\n      auto& LUT = TotalLUT[i];\n      const auto Word0 = (i >> 0) & 0b11;\n      const auto Word1 = (i >> 2) & 0b11;\n      const auto Word2 = (i >> 4) & 0b11;\n      const auto Word3 = (i >> 6) & 0b11;\n\n      LUT.Val[0] = (WordSelection[Word0] << 0) | (WordSelection[Word1] << 32);\n\n      LUT.Val[1] = (WordSelection[Word2] << 0) | (WordSelection[Word3] << 32);\n    }\n    return TotalLUT;\n  }()};\n\n  constexpr static auto SHUFPS_LUT {[]() consteval {\n    struct LUTType {\n      uint64_t Val[2];\n    };\n    // 32-bit words in [127:96], [95:64], [63:32], [31:0] are selected using the 8-bit Index.\n    // Expectation for this LUT is to simulate SHUFPS with ARM's TBL (two register) instruction.\n    // SHUFPS behaviour:\n    // Two 32-bits words from each source are selected from each source in the lower and upper halves of the 128-bit destination.\n    // Dest[31:0]   = Src1[<Word0>]\n    // Dest[63:32]  = Src1[<Word1>]\n    // Dest[95:64]  = Src2[<Word2>]\n    // Dest[127:96] = Src2[<Word3>]\n\n    std::array<LUTType, 256> TotalLUT {};\n    const uint64_t WordSelectionSrc1[4] = {\n      0x03'02'01'00,\n      0x07'06'05'04,\n      0x0b'0a'09'08,\n      0x0f'0e'0d'0c,\n    };\n\n    // Src2 needs to offset each byte index by 16-bytes to pull from the second source.\n    const uint64_t WordSelectionSrc2[4] = {\n      0x03'02'01'00 + (0x10101010),\n      0x07'06'05'04 + (0x10101010),\n      0x0b'0a'09'08 + (0x10101010),\n      0x0f'0e'0d'0c + (0x10101010),\n    };\n\n    for (size_t i = 0; i < 256; ++i) {\n      auto& LUT = TotalLUT[i];\n      const auto Word0 = (i >> 0) & 0b11;\n      const auto Word1 = (i >> 2) & 0b11;\n      const auto Word2 = (i >> 4) & 0b11;\n      const auto Word3 = (i >> 6) & 0b11;\n\n      LUT.Val[0] = (WordSelectionSrc1[Word0] << 0) | (WordSelectionSrc1[Word1] << 32);\n\n      LUT.Val[1] = (WordSelectionSrc2[Word2] << 0) | (WordSelectionSrc2[Word3] << 32);\n    }\n    return TotalLUT;\n  }()};\n\n  constexpr static auto DPPS_MASK {[]() consteval {\n    struct LUTType {\n      uint32_t Val[4];\n    };\n\n    std::array<LUTType, 16> TotalLUT {};\n    for (size_t i = 0; i < TotalLUT.size(); ++i) {\n      auto& LUT = TotalLUT[i];\n      constexpr auto GetLUT = [](size_t i, size_t Index) {\n        if (i & (1U << Index)) {\n          return -1U;\n        }\n        return 0U;\n      };\n\n      LUT.Val[0] = GetLUT(i, 0);\n      LUT.Val[1] = GetLUT(i, 1);\n      LUT.Val[2] = GetLUT(i, 2);\n      LUT.Val[3] = GetLUT(i, 3);\n    }\n    return TotalLUT;\n  }()};\n\n  constexpr static auto DPPD_MASK {[]() consteval {\n    struct LUTType {\n      uint64_t Val[2];\n    };\n\n    std::array<LUTType, 4> TotalLUT {};\n    for (size_t i = 0; i < TotalLUT.size(); ++i) {\n      auto& LUT = TotalLUT[i];\n      constexpr auto GetLUT = [](size_t i, size_t Index) {\n        if (i & (1U << Index)) {\n          return -1ULL;\n        }\n        return 0ULL;\n      };\n\n      LUT.Val[0] = GetLUT(i, 0);\n      LUT.Val[1] = GetLUT(i, 1);\n    }\n    return TotalLUT;\n  }()};\n\n  constexpr static auto PBLENDW_LUT {[]() consteval {\n    struct LUTType {\n      uint16_t Val[8];\n    };\n    // 16-bit words in [127:112], [111:96], [95:80], [79:64], [63:48], [47:32], [31:16], [15:0] are selected using 8-bit swizzle.\n    // Expectation for this LUT is to simulate PBLENDW with ARM's TBX (one register) instruction.\n    // PBLENDW behaviour:\n    // 16-bit words from the source is moved in to the destination based on the bit in the swizzle.\n    // Dest[15:0]    = Swizzle[0] ? Src[15:0] : Dest[15:0]\n    // Dest[31:16]   = Swizzle[1] ? Src[31:16] : Dest[31:16]\n    // Dest[47:32]   = Swizzle[2] ? Src[47:32] : Dest[47:32]\n    // Dest[63:48]   = Swizzle[3] ? Src[63:48] : Dest[63:48]\n    // Dest[79:64]   = Swizzle[4] ? Src[79:64] : Dest[79:64]\n    // Dest[95:80]   = Swizzle[5] ? Src[95:80] : Dest[95:80]\n    // Dest[111:96]  = Swizzle[6] ? Src[111:96] : Dest[111:96]\n    // Dest[127:112] = Swizzle[7] ? Src[127:112] : Dest[127:112]\n\n    std::array<LUTType, 256> TotalLUT {};\n    const uint16_t WordSelectionSrc[8] = {\n      0x01'00, 0x03'02, 0x05'04, 0x07'06, 0x09'08, 0x0B'0A, 0x0D'0C, 0x0F'0E,\n    };\n\n    constexpr uint16_t OriginalDest = 0xFF'FF;\n\n    for (size_t i = 0; i < 256; ++i) {\n      auto& LUT = TotalLUT[i];\n      for (size_t j = 0; j < 8; ++j) {\n        LUT.Val[j] = ((i >> j) & 1) ? WordSelectionSrc[j] : OriginalDest;\n      }\n    }\n    return TotalLUT;\n  }()};\n\n  CPUBackend::CPUBackend(CodeBufferManager& CodeBuffers, FEXCore::Core::InternalThreadState* ThreadState)\n    : ThreadState(ThreadState)\n    , CodeBuffers(CodeBuffers) {\n\n    auto& Ptrs = ThreadState->CurrentFrame->Pointers;\n\n    // Initialize named vector constants.\n    for (size_t i = 0; i < FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_CONST_POOL_MAX; ++i) {\n      Ptrs.NamedVectorConstantPointers[i] = reinterpret_cast<uint64_t>(NamedVectorConstants[i]);\n    }\n\n    // Copy named vector constants.\n    memcpy(Ptrs.NamedVectorConstants, NamedVectorConstants, sizeof(NamedVectorConstants));\n\n    // Initialize Indexed named vector constants.\n    Ptrs.IndexedNamedVectorConstantPointers[FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_PSHUFLW] =\n      reinterpret_cast<uint64_t>(PSHUFLW_LUT.data());\n    Ptrs.IndexedNamedVectorConstantPointers[FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_PSHUFHW] =\n      reinterpret_cast<uint64_t>(PSHUFHW_LUT.data());\n    Ptrs.IndexedNamedVectorConstantPointers[FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_PSHUFD] =\n      reinterpret_cast<uint64_t>(PSHUFD_LUT.data());\n    Ptrs.IndexedNamedVectorConstantPointers[FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_SHUFPS] =\n      reinterpret_cast<uint64_t>(SHUFPS_LUT.data());\n    Ptrs.IndexedNamedVectorConstantPointers[FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_DPPS_MASK] =\n      reinterpret_cast<uint64_t>(DPPS_MASK.data());\n    Ptrs.IndexedNamedVectorConstantPointers[FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_DPPD_MASK] =\n      reinterpret_cast<uint64_t>(DPPD_MASK.data());\n    Ptrs.IndexedNamedVectorConstantPointers[FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_PBLENDW] =\n      reinterpret_cast<uint64_t>(PBLENDW_LUT.data());\n\n#ifndef FEX_DISABLE_TELEMETRY\n    // Fill in telemetry values\n    for (size_t i = 0; i < FEXCore::Telemetry::TYPE_LAST; ++i) {\n      auto& Telem = FEXCore::Telemetry::GetTelemetryValue(static_cast<FEXCore::Telemetry::TelemetryType>(i));\n      Ptrs.TelemetryValueAddresses[i] = reinterpret_cast<uint64_t>(&Telem);\n    }\n#endif\n  }\n\n  CPUBackend::~CPUBackend() = default;\n\n  auto CPUBackend::GetEmptyCodeBuffer() -> CodeBuffer* {\n    auto PrevCodeBuffer = CurrentCodeBuffer;\n\n    // Resize the code buffer and reallocate our code size\n    CurrentCodeBuffer = CodeBuffers.StartLargerCodeBuffer();\n\n    RegisterForSignalHandler(std::move(PrevCodeBuffer));\n    return CurrentCodeBuffer.get();\n  }\n\n  void CPUBackend::RegisterForSignalHandler(fextl::shared_ptr<CodeBuffer> CodeBuffer) {\n    if (ThreadState->CurrentFrame->SignalHandlerRefCounter != 0) {\n      // We have signal handlers that have generated code\n      // This means that we can not safely clear the code at this point in time\n      // Keep a reference to the old code buffer to delay deallocation\n      SignalHandlerCodeBuffers.push_back(std::move(CodeBuffer));\n    } else {\n      SignalHandlerCodeBuffers.clear();\n    }\n  }\n\n  fextl::shared_ptr<CodeBuffer> CPUBackend::CheckCodeBufferUpdate() {\n    auto NewCodeBuffer = CodeBuffers.GetLatest();\n    if (CurrentCodeBuffer != NewCodeBuffer) {\n      RegisterForSignalHandler(CurrentCodeBuffer);\n      return std::exchange(CurrentCodeBuffer, NewCodeBuffer);\n    }\n    return nullptr;\n  }\n\n  GuestToHostMap& GetLookupCache(const CodeBuffer& Buffer) {\n    return *Buffer.LookupCache;\n  }\n\n  CodeBuffer::CodeBuffer(size_t Size)\n    : AllocatedSize(Size) {\n    Ptr = static_cast<uint8_t*>(FEXCore::Allocator::VirtualAlloc(Size, true));\n    LOGMAN_THROW_A_FMT(!!Ptr, \"Couldn't allocate code buffer\");\n\n    // Protect the last page of the allocated buffer to trigger SIGSEGV on write access\n    uintptr_t LastPageAddr = AlignDown(reinterpret_cast<uintptr_t>(Ptr) + Size - 1, FEXCore::Utils::FEX_PAGE_SIZE);\n    if (!FEXCore::Allocator::VirtualProtect(reinterpret_cast<void*>(LastPageAddr), FEXCore::Utils::FEX_PAGE_SIZE,\n                                            FEXCore::Allocator::ProtectOptions::None)) {\n      LogMan::Msg::EFmt(\"Failed to mprotect last page of code buffer.\");\n    }\n\n    FEXCore::Allocator::VirtualName(\"FEXMemJIT\", reinterpret_cast<void*>(Ptr), Size);\n\n    // Huge-pages reduce the amount of iTLB misses dramatically when it works.\n    FEXCore::Allocator::VirtualTHPControl(reinterpret_cast<void*>(Ptr), Size, FEXCore::Allocator::THPControl::Enable);\n\n    LookupCache = fextl::make_unique<GuestToHostMap>();\n  }\n\n  CodeBuffer::~CodeBuffer() {\n    FEXCore::Allocator::VirtualFree(Ptr, AllocatedSize);\n  }\n\n  auto CodeBufferManager::AllocateNew(size_t Size) -> fextl::shared_ptr<CodeBuffer> {\n#ifndef _WIN32\n// MDWE (Memory-Deny-Write-Execute) is a new Linux 6.3 feature.\n// It's equivalent to systemd's `MemoryDenyWriteExecute` but implemented entirely in the kernel.\n//\n// MDWE prevents applications from creating RWX memory mappings.\n// This prevents FEX from doing anything JIT related, as FEX uses RWX for JIT memory mappings.\n//\n// A potential workaround to make FEX work with MDWE is to call mprotect every time we need to write or modify code.\n// Alternatively, FEX could use a memory mirror where one half is mapped as RW and the other is RX.\n//\n// Once MDWE is enabled with the prctl, the feature is sealed and it can /NOT/ be turned off.\n//\n// Status of MDWE is queried through prctl using `PR_GET_MDWE`:\n// -1: The kernel doesn't support MDWE\n// 0: MDWE is supported but disabled\n// >0: MDWE is enabled, hence prohibiting RWX mappings\n#ifndef PR_GET_MDWE\n#define PR_GET_MDWE 66\n#endif\n    int MDWE = ::prctl(PR_GET_MDWE, 0, 0, 0, 0);\n    if (MDWE != -1 && MDWE != 0) {\n      LogMan::Msg::EFmt(\"MDWE was set to 0x{:x} which means FEX can't allocate executable memory\", MDWE);\n    }\n#endif\n\n    auto Buffer = fextl::make_shared<CodeBuffer>(Size);\n\n    Latest = Buffer;\n    LatestOffset = 0;\n\n    OnCodeBufferAllocated(Buffer);\n\n    return Buffer;\n  }\n\n  fextl::shared_ptr<CodeBuffer> CodeBufferManager::GetLatest() {\n    if (!Latest) {\n      if (FEXCore::Config::Get_ENABLECODECACHINGWIP()) {\n        // Start with a larger code buffer to avoid resizes that would discard\n        // code loaded from caches\n        AllocateNew(MAX_CODE_SIZE);\n      } else {\n        AllocateNew(INITIAL_CODE_SIZE);\n      }\n    }\n    return Latest;\n  }\n\n  fextl::shared_ptr<CodeBuffer> CodeBufferManager::StartLargerCodeBuffer() {\n    if (!Latest) {\n      // Allocate initial CodeBuffer and return it\n      return GetLatest();\n    }\n\n    auto NewCodeBufferSize = GetLatest()->AllocatedSize;\n    NewCodeBufferSize = std::min<size_t>(NewCodeBufferSize * 2, MAX_CODE_SIZE);\n    return AllocateNew(NewCodeBufferSize);\n  }\n\n\n  bool CPUBackend::IsAddressInCodeBuffer(uintptr_t Address) const {\n    auto CheckCodeBuffer = [](CodeBuffer& Buffer, uintptr_t Address) {\n      // The last page of the code buffer is protected, so we need to exclude it from the valid range\n      // when checking if the address is in the code buffer.\n      uintptr_t LastPageAddr = AlignDown(reinterpret_cast<uintptr_t>(Buffer.Ptr) + Buffer.AllocatedSize - 1, FEXCore::Utils::FEX_PAGE_SIZE);\n      return (Address >= reinterpret_cast<uintptr_t>(Buffer.Ptr) && Address < LastPageAddr);\n    };\n\n    if (CheckCodeBuffer(*CurrentCodeBuffer, Address)) {\n      return true;\n    }\n    for (auto& Buffer : SignalHandlerCodeBuffers) {\n      if (CheckCodeBuffer(*Buffer, Address)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n} // namespace CPU\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/CPUBackend.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ncategory: backend ~ IR to host code generation\ntags: backend|shared\n$end_info$\n*/\n\n#pragma once\n\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/SignalScopeGuards.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXCore/fextl/map.h>\n\n#include <cstdint>\n\nnamespace FEXCore::CPU {\nunion Relocation;\n}\n\nnamespace FEXCore {\n\nnamespace IR {\n  class IRListView;\n} // namespace IR\n\nnamespace Core {\n  struct DebugData;\n  struct ThreadState;\n  struct CpuStateFrame;\n  struct InternalThreadState;\n} // namespace Core\n\nnamespace CodeSerialize {\n  struct CodeObjectFileSection;\n}\n\nstruct GuestToHostMap;\n\nnamespace CPU {\n  struct CodeBuffer {\n    uint8_t* Ptr;\n    size_t AllocatedSize; // including guard page; see UsableSize()\n\n    fextl::unique_ptr<GuestToHostMap> LookupCache;\n\n    CodeBuffer(size_t Size);\n    CodeBuffer(const CodeBuffer&) = delete;\n    CodeBuffer& operator=(const CodeBuffer&) = delete;\n    CodeBuffer(CodeBuffer&& oth) = delete;\n    CodeBuffer& operator=(CodeBuffer&&) = delete;\n\n    ~CodeBuffer();\n\n    /// Returns the number of bytes available for storing code\n    size_t UsableSize() const {\n      return AllocatedSize - FEXCore::Utils::FEX_PAGE_SIZE;\n    }\n  };\n\n  /**\n   * A manager that coordinates access to the CodeBuffer used for compiling new code across threads.\n   *\n   * The CodeBuffer is managed as a partially persistent data structure:\n   * - Exactly one CodeBuffer is now designated as \"active\", which means data can be appended to it\n   * - Lossy modifications to the active CodeBuffer will not invalidate any data in use by other threads (which is what enables save CodeBuffer sharing across threads)\n   * - Instead, such lossy modifications trigger a new \"version\" of the data in the modifying thread. Old versions of the CodeBuffer persist as read-only data for use by the other threads.\n   * - The other threads can update their version of the CodeBuffer. This will decrease the reference count and eventually trigger deallocation of the old version\n   */\n  class CodeBufferManager {\n  public:\n    // Get the CodeBuffer that was most recently allocated.\n    // This is the only CodeBuffer that data may be written to.\n    fextl::shared_ptr<CodeBuffer> GetLatest();\n\n    // Allocate a new CodeBuffer with geometric growth up to an internal maximum.\n    // Subsequent calls to GetLatest will point to the returned buffer.\n    fextl::shared_ptr<CodeBuffer> StartLargerCodeBuffer();\n\n    // Write offset into the latest CodeBuffer\n    std::size_t LatestOffset {};\n\n    // Protects writes to the latest CodeBuffer and changes to LatestOffset\n    FEXCore::ForkableUniqueMutex CodeBufferWriteMutex;\n\n    virtual void OnCodeBufferAllocated(const std::shared_ptr<CodeBuffer>&) {};\n\n  private:\n    fextl::shared_ptr<CodeBuffer> Latest;\n\n    fextl::shared_ptr<CodeBuffer> AllocateNew(size_t Size);\n  };\n\n  class CPUBackend {\n  public:\n\n    CPUBackend(CodeBufferManager&, FEXCore::Core::InternalThreadState*);\n\n    virtual ~CPUBackend();\n\n    struct CompiledCode {\n      // Where this code block begins.\n      uint8_t* BlockBegin;\n      fextl::map<uint64_t, uint8_t*> EntryPoints;\n      // The total size of the codeblock from [BlockBegin, BlockBegin+Size).\n      size_t Size;\n    };\n\n    // Header that can live at the start of a JIT block.\n    // We want the header to be quite small, with most data living in the tail object.\n    struct JITCodeHeader {\n      // Offset from the start of this header to where the tail lives.\n      // Only 32-bit since the tail block won't ever be more than 4GB away.\n      uint32_t OffsetToBlockTail;\n    };\n\n    // Header that can live at the end of the JIT block.\n    // For any state reconstruction or other data, this is where it should live.\n    // Any data that is explicitly tied to the JIT code and needs to be cached with it\n    // should end up in this data structure.\n    struct JITCodeTail {\n      // The total size of the codeblock from [BlockBegin, BlockBegin+Size).\n      size_t Size;\n\n      // RIP that the block's entry comes from.\n      uint64_t RIP;\n\n      // The length of the guest code for this block.\n      size_t GuestSize;\n\n      // Number of RIP entries for this JIT Code section.\n      uint32_t NumberOfRIPEntries;\n\n      // Offset after this block to the start of the RIP entries.\n      uint32_t OffsetToRIPEntries;\n\n      // Shared-code modification spin-loop futex.\n      uint32_t SpinLockFutex;\n\n      // If this block represents a single guest instruction.\n      bool SingleInst;\n\n      uint8_t _Pad[3];\n    };\n\n    /**\n     * @brief Tells this CPUBackend to compile code for the provided IR and DebugData\n     *\n     * The returned pointer needs to be long lived and be executable in the host environment\n     * FEXCore's frontend will store this pointer in to a cache for the current RIP when this was executed\n     *\n     * This is a thread specific compilation unit since there is one CPUBackend per guest thread\n     *\n     * @param Size - The byte size of the guest code for this block\n     * @param SingleInst - If this block represents a single guest instruction\n     * @param IR -  IR that maps to the IR for this RIP\n     * @param DebugData - Debug data that is available for this IR indirectly\n     * @param CheckTF - If EFLAGS.TF checks should be emitted at the start of the block\n     *\n     * @return Information about the compiled code block.\n     */\n    [[nodiscard]]\n    virtual CompiledCode CompileCode(uint64_t Entry, uint64_t Size, bool SingleInst, const FEXCore::IR::IRListView* IR,\n                                     FEXCore::Core::DebugData* DebugData, bool CheckTF) = 0;\n\n    virtual fextl::vector<FEXCore::CPU::Relocation> TakeRelocations(uint64_t GuestBaseAddress) = 0;\n\n    virtual void ClearCache() {}\n\n    /**\n     * @brief Clear any relocations after JIT compiling\n     */\n    virtual void ClearRelocations() {}\n\n    bool IsAddressInCodeBuffer(uintptr_t Address) const;\n\n    // Updates the CodeBuffer if needed and returns a reference to the old one.\n    // The returned reference should be kept alive carefully to avoid early deletion of resources.\n    [[nodiscard]]\n    fextl::shared_ptr<CodeBuffer> CheckCodeBufferUpdate();\n\n  protected:\n    // Max spill slot size in bytes. We need at most 32 bytes\n    // to be able to handle a 256-bit vector store to a slot.\n    constexpr static uint32_t MaxSpillSlotSize = 32;\n\n    FEXCore::Core::InternalThreadState* ThreadState;\n\n    [[nodiscard]]\n    CodeBuffer* GetEmptyCodeBuffer();\n\n    // This is the code buffer containing the main code under execution by this thread.\n    // CheckCodeBufferUpdate must be used before compiling new code.\n    fextl::shared_ptr<CodeBuffer> CurrentCodeBuffer;\n\n    // Old CodeBuffer generations required to be valid until returning from signal handlers\n    fextl::vector<fextl::shared_ptr<CodeBuffer>> SignalHandlerCodeBuffers;\n\n    CodeBufferManager& CodeBuffers;\n\n  private:\n    void RegisterForSignalHandler(fextl::shared_ptr<CodeBuffer>);\n  };\n\n} // namespace CPU\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/CPUID.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: opcodes|cpuid\ndesc: Handles presented capability bits for guest cpu\n$end_info$\n*/\n\n#include \"Common/StringConv.h\"\n#include \"Interface/Context/Context.h\"\n#include \"Interface/Core/CPUID.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/CPUID.h>\n#include <FEXCore/Core/HostFeatures.h>\n#include <FEXCore/Utils/FileLoading.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include \"git_version.h\"\n\n#include <cstring>\n\nnamespace FEXCore {\nnamespace ProductNames {\n#ifdef ARCHITECTURE_arm64\n  static const char ARM_UNKNOWN[] = \"Unknown ARM CPU\";\n  static const char ARM_A57[] = \"Cortex-A57\";\n  static const char ARM_A72[] = \"Cortex-A72\";\n  static const char ARM_A73[] = \"Cortex-A73\";\n  static const char ARM_A75[] = \"Cortex-A75\";\n  static const char ARM_A76[] = \"Cortex-A76\";\n  static const char ARM_A76AE[] = \"Cortex-A76AE\";\n  static const char ARM_V1[] = \"Neoverse V1\";\n  static const char ARM_V2[] = \"Neoverse V2\";\n  static const char ARM_V3[] = \"Neoverse V3\";\n  static const char ARM_V3AE[] = \"Neoverse V3AE\";\n  static const char ARM_A77[] = \"Cortex-A77\";\n  static const char ARM_A78[] = \"Cortex-A78\";\n  static const char ARM_A78AE[] = \"Cortex-A78AE\";\n  static const char ARM_A78C[] = \"Cortex-A78C\";\n  static const char ARM_A710[] = \"Cortex-A710\";\n  static const char ARM_A715[] = \"Cortex-A715\";\n  static const char ARM_A720[] = \"Cortex-A720\";\n  static const char ARM_A725[] = \"Cortex-A725\";\n  static const char ARM_C1Pro[] = \"C1-Pro\";\n  static const char ARM_C1Premium[] = \"C1-Premium\";\n  static const char ARM_X1[] = \"Cortex-X1\";\n  static const char ARM_X1C[] = \"Cortex-X1C\";\n  static const char ARM_X2[] = \"Cortex-X2\";\n  static const char ARM_X3[] = \"Cortex-X3\";\n  static const char ARM_X4[] = \"Cortex-X4\";\n  static const char ARM_X925[] = \"Cortex-X925\";\n  static const char ARM_C1Ultra[] = \"C1-Ultra\";\n  static const char ARM_N1[] = \"Neoverse N1\";\n  static const char ARM_N2[] = \"Neoverse N2\";\n  static const char ARM_N3[] = \"Neoverse N3\";\n  static const char ARM_E1[] = \"Neoverse E1\";\n  static const char ARM_A35[] = \"Cortex-A35\";\n  static const char ARM_A53[] = \"Cortex-A53\";\n  static const char ARM_A55[] = \"Cortex-A55\";\n  static const char ARM_A65[] = \"Cortex-A65\";\n  static const char ARM_A510[] = \"Cortex-A510\";\n  static const char ARM_A520[] = \"Cortex-A520\";\n  static const char ARM_C1Nano[] = \"C1-Nano\";\n\n  static const char ARM_Kryo200[] = \"Kryo 2xx\";\n  static const char ARM_Kryo300[] = \"Kryo 3xx\";\n  static const char ARM_Kryo400[] = \"Kryo 4xx/5xx\";\n\n  static const char ARM_Kryo200S[] = \"Kryo 2xx S\";\n  static const char ARM_Kryo300S[] = \"Kryo 3xx S\";\n  static const char ARM_Kryo400S[] = \"Kryo 4xx/5xx S\";\n\n  static const char ARM_Denver[] = \"Nvidia Denver\";\n  static const char ARM_Carmel[] = \"Nvidia Carmel\";\n  static const char ARM_Olympus[] = \"Nvidia Olympus\";\n\n  static const char ARM_Firestorm_M1[] = \"Apple Firestorm (M1)\";\n  static const char ARM_Icestorm_M1[] = \"Apple Icestorm (M1)\";\n  static const char ARM_Firestorm_M1Pro[] = \"Apple Firestorm (M1 Pro)\";\n  static const char ARM_Icestorm_M1Pro[] = \"Apple Icestorm (M1 Pro)\";\n  static const char ARM_Firestorm_M1Max[] = \"Apple Firestorm (M1 Max)\";\n  static const char ARM_Icestorm_M1Max[] = \"Apple Icestorm (M1 Max)\";\n  static const char ARM_Avalanche_M2[] = \"Apple Avalanche (M2)\";\n  static const char ARM_Blizzard_M2[] = \"Apple Blizzard (M2)\";\n  static const char ARM_Avalanche_M2Pro[] = \"Apple Avalanche (M2 Pro)\";\n  static const char ARM_Blizzard_M2Pro[] = \"Apple Blizzard (M2 Pro)\";\n  static const char ARM_Avalanche_M2Max[] = \"Apple Avalanche (M2 Max)\";\n  static const char ARM_Blizzard_M2Max[] = \"Apple Blizzard (M2 Max)\";\n  static const char ARM_AppleSilicon[] = \"Apple Silicon\";\n\n  static const char ARM_ORYON_1[] = \"Oryon-1\";\n  static const char ARM_Ampere_1[] = \"AmpereOne\";\n  static const char ARM_Ampere_1A[] = \"AmpereOneA\";\n  static const char ARM_Ampere_1B[] = \"AmpereOneB\";\n  static const char ARM_Ampere_1C[] = \"AmpereOneC\";\n#endif\n} // namespace ProductNames\n\nuint32_t GetCPUID_Syscall() {\n  uint32_t CPU {};\n  FHU::Syscalls::getcpu(&CPU, nullptr);\n  return CPU;\n}\n\nstruct CPUFamily {\n  uint32_t Stepping         : 4;\n  uint32_t Model            : 4;\n  uint32_t ExtendedModel    : 4;\n  uint32_t FamilyID         : 4;\n  uint32_t ExtendedFamilyID : 8;\n  uint32_t ProcessorType    : 4;\n};\n\nconstexpr static uint32_t GenerateFamily(const CPUFamily Family) {\n  return Family.Stepping | (Family.Model << 4) | (Family.FamilyID << 8) | (Family.ProcessorType << 12) | (Family.ExtendedModel << 16) |\n         (Family.ExtendedFamilyID << 20);\n}\n\n#ifdef CPUID_AMD\nconstexpr uint32_t FAMILY_IDENTIFIER = GenerateFamily(CPUFamily {\n  .Stepping = 0,\n  .Model = 0xA,\n  .ExtendedModel = 0,\n  .FamilyID = 0xF,\n  .ExtendedFamilyID = 1,\n  .ProcessorType = 0,\n});\n\n#else\nconstexpr uint32_t FAMILY_IDENTIFIER = GenerateFamily(CPUFamily {\n  .Stepping = 1,\n  .Model = 6,\n  .ExtendedModel = 0xA,\n  .FamilyID = 6,\n  .ExtendedFamilyID = 0,\n  .ProcessorType = 0,\n});\n#endif\n\n#ifdef ARCHITECTURE_arm64\nuint64_t GetCycleCounterFrequency() {\n  uint64_t Result {};\n  __asm(\"mrs %[Res], CNTFRQ_EL0\" : [Res] \"=r\"(Result));\n  return Result;\n}\n\nuint32_t GetCPUID_TPIDRRO() {\n  uint64_t Result {};\n  __asm(\"mrs %[Res], TPIDRRO_EL0\" : [Res] \"=r\"(Result));\n  return Result;\n}\n\nvoid CPUIDEmu::SetupHostHybridFlag() {\n  FEX_CONFIG_OPT(HideHybrid, HIDEHYBRID);\n  PerCPUData.resize(Cores);\n\n  uint64_t MIDR {};\n  for (size_t i = 0; i < Cores; ++i) {\n    auto NewMIDR = CTX->HostFeatures.CPUMIDRs[i];\n    if (MIDR != 0 && MIDR != NewMIDR) {\n      // CPU mismatch, claim hybrid\n      Hybrid = true;\n    }\n\n    // Truncate to 32-bits, top 32-bits are all reserved in MIDR\n    PerCPUData[i].ProductName = ProductNames::ARM_UNKNOWN;\n    PerCPUData[i].MIDR = NewMIDR;\n    MIDR = NewMIDR;\n  }\n\n  if (HideHybrid()) {\n    // Hide the hybrid flag.\n    Hybrid = false;\n  }\n\n  struct CPUMIDR {\n    uint8_t Implementer;\n    uint16_t Part;\n    bool DefaultBig; // Defaults to a big core\n    const char* ProductName {};\n  };\n\n  // CPU priority order\n  // This is mostly arbitrary but will sort by some sort of CPU priority by performance\n  // Relative list so things they will commonly end up in big.little configurations sort of relate\n  static constexpr std::array<CPUMIDR, 67> CPUMIDRs = {{\n    // Typically big CPU cores\n    {0x51, 0x001, 1, ProductNames::ARM_ORYON_1}, // Qualcomm Oryon-1\n\n    {0x61, 0x039, 1, ProductNames::ARM_Avalanche_M2Max}, // Apple Avalanche (M2 Max)\n    {0x61, 0x035, 1, ProductNames::ARM_Avalanche_M2Pro}, // Apple Avalanche (M2 Pro)\n    {0x61, 0x033, 1, ProductNames::ARM_Avalanche_M2},    // Apple Avalanche (M2)\n    {0x61, 0x029, 1, ProductNames::ARM_Firestorm_M1Max}, // Apple Firestorm (M1 Max)\n    {0x61, 0x025, 1, ProductNames::ARM_Firestorm_M1Pro}, // Apple Firestorm (M1 Pro)\n    {0x61, 0x023, 1, ProductNames::ARM_Firestorm_M1},    // Apple Firestorm (M1)\n    {0x61, 0, 1, ProductNames::ARM_AppleSilicon},        // QEmu Apple Silicon\n\n    {0x41, 0xd8c, 1, ProductNames::ARM_C1Ultra},   // C1-Ultra\n    {0x41, 0xd90, 1, ProductNames::ARM_C1Premium}, // C1-Premium\n    {0x41, 0xd8b, 1, ProductNames::ARM_C1Pro},     // C1-Pro\n    {0x41, 0xd85, 1, ProductNames::ARM_X925},      // X925\n    {0x41, 0xd87, 1, ProductNames::ARM_A725},      // A725\n    {0x41, 0xd84, 1, ProductNames::ARM_V3},        // V3\n    {0x41, 0xd83, 1, ProductNames::ARM_V3AE},      // V3AE\n    {0x41, 0xd8e, 1, ProductNames::ARM_N3},        // N3\n    {0x41, 0xd82, 1, ProductNames::ARM_X4},        // X4\n    {0x41, 0xd81, 1, ProductNames::ARM_A720},      // A720\n    {0x41, 0xd4e, 1, ProductNames::ARM_X3},        // X3\n    {0x41, 0xd4d, 1, ProductNames::ARM_A715},      // A715\n    {0x41, 0xd4f, 1, ProductNames::ARM_V2},        // V2\n    {0x41, 0xd4b, 1, ProductNames::ARM_A78C},      // A78C\n    {0x41, 0xd4a, 1, ProductNames::ARM_E1},        // E1\n    {0x41, 0xd49, 1, ProductNames::ARM_N2},        // N2\n    {0x41, 0xd48, 1, ProductNames::ARM_X2},        // X2\n    {0x41, 0xd47, 1, ProductNames::ARM_A710},      // A710\n    {0x41, 0xd4C, 1, ProductNames::ARM_X1C},       // X1C\n    {0x41, 0xd44, 1, ProductNames::ARM_X1},        // X1\n    {0x41, 0xd42, 1, ProductNames::ARM_A78AE},     // A78AE\n    {0x41, 0xd41, 1, ProductNames::ARM_A78},       // A78\n    {0x41, 0xd40, 1, ProductNames::ARM_V1},        // V1\n    {0x41, 0xd0e, 1, ProductNames::ARM_A76AE},     // A76AE\n    {0x41, 0xd0d, 1, ProductNames::ARM_A77},       // A77\n    {0x41, 0xd0c, 1, ProductNames::ARM_N1},        // N1\n    {0x41, 0xd0b, 1, ProductNames::ARM_A76},       // A76\n    {0x51, 0x804, 1, ProductNames::ARM_Kryo400},   // Kryo 4xx Gold (A76 based)\n    {0x41, 0xd0a, 1, ProductNames::ARM_A75},       // A75\n    {0x51, 0x802, 1, ProductNames::ARM_Kryo300},   // Kryo 3xx Gold (A75 based)\n    {0x41, 0xd09, 1, ProductNames::ARM_A73},       // A73\n    {0x51, 0x800, 1, ProductNames::ARM_Kryo200},   // Kryo 2xx Gold (A73 based)\n    {0x41, 0xd08, 1, ProductNames::ARM_A72},       // A72\n\n    {0xc0, 0xac3, 1, ProductNames::ARM_Ampere_1},  // AmpereOne\n    {0xc0, 0xac4, 1, ProductNames::ARM_Ampere_1A}, // AmpereOneA\n    {0xc0, 0xac5, 1, ProductNames::ARM_Ampere_1B}, // AmpereOneB\n    {0xc0, 0xac7, 1, ProductNames::ARM_Ampere_1C}, // AmpereOneC\n\n    {0x4e, 0x010, 1, ProductNames::ARM_Olympus}, // Olympus\n    {0x4e, 0x004, 1, ProductNames::ARM_Carmel},  // Carmel\n\n    // Denver rated above A57 to match TX2 weirdness\n    {0x4e, 0x003, 1, ProductNames::ARM_Denver}, // Denver\n\n    {0x41, 0xd07, 1, ProductNames::ARM_A57}, // A57\n\n    // Typically Little CPU cores\n    {0x61, 0x038, 0, ProductNames::ARM_Blizzard_M2Max}, // Apple Blizzard (M2 Max)\n    {0x61, 0x034, 0, ProductNames::ARM_Blizzard_M2Pro}, // Apple Blizzard (M2 Pro)\n    {0x61, 0x032, 0, ProductNames::ARM_Blizzard_M2},    // Apple Blizzard (M2)\n    {0x61, 0x028, 0, ProductNames::ARM_Icestorm_M1Max}, // Apple Icestorm (M1 Max)\n    {0x61, 0x024, 0, ProductNames::ARM_Icestorm_M1Pro}, // Apple Icestorm (M1 Pro)\n    {0x61, 0x022, 0, ProductNames::ARM_Icestorm_M1},    // Apple Icestorm (M1)\n\n    {0x41, 0xd8a, 1, ProductNames::ARM_C1Nano},   // C1-Nano\n    {0x41, 0xd80, 0, ProductNames::ARM_A520},     // A520\n    {0x41, 0xd46, 0, ProductNames::ARM_A510},     // A510\n    {0x41, 0xd06, 0, ProductNames::ARM_A65},      // A65\n    {0x41, 0xd05, 0, ProductNames::ARM_A55},      // A55\n    {0x51, 0x805, 0, ProductNames::ARM_Kryo400S}, // Kryo 4xx/5xx Silver (A55 based)\n    {0x51, 0x803, 0, ProductNames::ARM_Kryo300S}, // Kryo 3xx Silver (A55 based)\n    {0x41, 0xd03, 0, ProductNames::ARM_A53},      // A53\n    {0x51, 0x801, 0, ProductNames::ARM_Kryo200S}, // Kryo 2xx Silver (A53 based)\n    {0x41, 0xd04, 0, ProductNames::ARM_A35},      // A35\n\n    {0x41, 0, 0, ProductNames::ARM_UNKNOWN}, // Invalid CPU or Apple CPU inside Parallels VM\n    {0x0, 0, 0, ProductNames::ARM_UNKNOWN},  // Invalid starting point is lowest ranked\n  }};\n\n  auto FindDefinedMIDR = [](uint32_t MIDR) -> const CPUMIDR* {\n    uint8_t Implementer = MIDR >> 24;\n    uint16_t Part = (MIDR >> 4) & 0xFFF;\n\n    for (auto& MIDROption : CPUMIDRs) {\n      if (MIDROption.Implementer == Implementer && MIDROption.Part == Part) {\n        return &MIDROption;\n      }\n    }\n\n    return nullptr;\n  };\n\n  if (Hybrid) {\n    // Walk the MIDRs and calculate big little designs\n    fextl::vector<const CPUMIDR*> BigCores;\n    fextl::vector<const CPUMIDR*> LittleCores;\n\n    // Separate CPU cores out to big or little selected\n    for (size_t i = 0; i < Cores; ++i) {\n      uint32_t MIDR = PerCPUData[i].MIDR;\n      auto MIDROption = FindDefinedMIDR(MIDR);\n      if (MIDROption) {\n        // Found one\n        if (MIDROption->DefaultBig) {\n          BigCores.emplace_back(MIDROption);\n        } else {\n          LittleCores.emplace_back(MIDROption);\n        }\n      } else {\n        // If we didn't insert this MIDR then claim it is a little core.\n        LittleCores.emplace_back(&CPUMIDRs.back());\n      }\n    }\n\n    if (LittleCores.empty()) {\n      // If we only ended up with big cores then we need to move some to be little cores\n      uint32_t LowestMIDR = ~0U;\n      uint32_t LowestMIDRIdx = 0;\n      // Walk all the big cores\n      for (size_t i = 0; i < BigCores.size(); ++i) {\n        uint8_t Implementer = BigCores[i]->Implementer;\n        uint16_t Part = BigCores[i]->Part;\n\n        // Walk our list of CPUMIDRs to find the most little core\n        for (size_t j = LowestMIDRIdx; j < CPUMIDRs.size(); ++j) {\n          auto& MIDROption = CPUMIDRs[i];\n          if ((MIDROption.Implementer == Implementer && MIDROption.Part == Part) || (MIDROption.Implementer == 0 && MIDROption.Part == 0)) {\n\n            LowestMIDRIdx = j;\n            LowestMIDR = MIDR;\n            break;\n          }\n        }\n      }\n\n      // Now we WILL have found a big core to demote to little status\n      // Demote them\n      std::erase_if(BigCores, [&LittleCores, LowestMIDR](auto* Entry) {\n        // Demote by erase copy to little array\n        uint8_t Implementer = LowestMIDR >> 24;\n        uint16_t Part = (LowestMIDR >> 4) & 0xFFF;\n\n        if (Entry->Implementer == Implementer && Entry->Part == Part) {\n          // Add it to the BigCore list\n          LittleCores.emplace_back(Entry);\n          return true;\n        }\n        return false;\n      });\n    }\n\n    if (BigCores.empty()) {\n      // We never found a CPU core we understand\n      // Grab the first core, consider it as little, move everything else to Big\n      uint32_t LittleMIDR = PerCPUData[0].MIDR;\n      // Now walk the little cores and move them to Big if they don't match\n      std::erase_if(LittleCores, [&BigCores, LittleMIDR](auto* Entry) {\n        // You're promoted now\n        uint8_t Implementer = LittleMIDR >> 24;\n        uint16_t Part = (LittleMIDR >> 4) & 0xFFF;\n\n        if (Entry->Implementer != Implementer || Entry->Part != Part) {\n          // Add it to the BigCore list\n          BigCores.emplace_back(Entry);\n          return true;\n        }\n        return false;\n      });\n    }\n\n    // Now walk the per CPU data one more time and set if it is big or little\n    for (auto& Data : PerCPUData) {\n      uint8_t Implementer = Data.MIDR >> 24;\n      uint16_t Part = (Data.MIDR >> 4) & 0xFFF;\n\n      bool FoundBig {};\n      const CPUMIDR* MIDR {};\n      for (auto Big : BigCores) {\n        if (Big->Implementer == Implementer && Big->Part == Part) {\n          FoundBig = true;\n          MIDR = Big;\n          break;\n        }\n      }\n\n      if (!FoundBig) {\n        for (auto Little : LittleCores) {\n          if (Little->Implementer == Implementer && Little->Part == Part) {\n            MIDR = Little;\n            break;\n          }\n        }\n      }\n\n      Data.IsBig = FoundBig;\n      if (MIDR) {\n        Data.ProductName = MIDR->ProductName ?: ProductNames::ARM_UNKNOWN;\n      } else {\n        Data.ProductName = ProductNames::ARM_UNKNOWN;\n      }\n    }\n  } else {\n    // If we aren't hybrid then just claim everything is big\n    for (size_t i = 0; i < Cores; ++i) {\n      const auto MIDRIndex = HideHybrid() ? 0 : i;\n      uint32_t MIDR = PerCPUData[MIDRIndex].MIDR;\n      auto MIDROption = FindDefinedMIDR(MIDR);\n\n      PerCPUData[i].IsBig = true;\n      if (MIDROption) {\n        PerCPUData[i].ProductName = MIDROption->ProductName ?: ProductNames::ARM_UNKNOWN;\n      } else {\n        PerCPUData[i].ProductName = ProductNames::ARM_UNKNOWN;\n      }\n    }\n  }\n}\n\n#else\nuint64_t GetCycleCounterFrequency() {\n  return 0;\n}\n\nvoid CPUIDEmu::SetupHostHybridFlag() {}\n\n#endif\n\n\nvoid CPUIDEmu::SetupFeatures() {\n  if (CTX->HostFeatures.SupportsAVX) {\n    XCR0 |= XCR0_AVX;\n  }\n\n  Features.SHA = CTX->HostFeatures.SupportsSHA;\n}\n\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_0h(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n\n  // EBX, EDX, ECX become the manufacturer id string\n#ifdef CPUID_AMD\n  Res.eax = 0x0D; // Let's say we are a Zen+\n  Res.ebx = CPUID_VENDOR_AMD1;\n  Res.edx = CPUID_VENDOR_AMD2;\n  Res.ecx = CPUID_VENDOR_AMD3;\n#else\n  Res.eax = 0x16; // Let's say we are a Skylake\n  Res.ebx = CPUID_VENDOR_INTEL1;\n  Res.edx = CPUID_VENDOR_INTEL2;\n  Res.ecx = CPUID_VENDOR_INTEL3;\n#endif\n  return Res;\n}\n\n// Processor Info and Features bits\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_01h(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n\n  // Hypervisor bit is normally set but some applications have issues with it.\n  uint32_t Hypervisor = HideHypervisorBit() ? 0 : 1;\n\n  Res.eax = FAMILY_IDENTIFIER;\n\n  Res.ebx = 0 |                 // Brand index\n            (8 << 8) |          // Cache line size in bytes\n            (Cores << 16) |     // Number of addressable IDs for the logical cores in the physical CPU\n            (GetCPUID() << 24); // Local APIC ID\n\n  Res.ecx = (1 << 0) |                                      // SSE3\n            (CTX->HostFeatures.SupportsPMULL_128Bit << 1) | // PCLMULQDQ\n            (1 << 2) |                                      // DS area supports 64bit layout\n            (1 << 3) |                                      // MWait\n            (0 << 4) |                                      // DS-CPL\n            (0 << 5) |                                      // VMX\n            (0 << 6) |                                      // SMX\n            (0 << 7) |                                      // Intel SpeedStep\n            (1 << 8) |                                      // Thermal Monitor 2\n            (1 << 9) |                                      // SSSE3\n            (0 << 10) |                                     // L1 context ID\n            (0 << 11) |                                     // Silicon debug\n            (SupportsAVX() << 12) |                         // FMA3\n            (1 << 13) |                                     // CMPXCHG16B\n            (0 << 14) |                                     // xTPR update control\n            (0 << 15) |                                     // Perfmon and debug capability\n            (0 << 16) |                                     // Reserved\n            (0 << 17) |                                     // Process-context identifiers\n            (0 << 18) |                                     // Prefetching from memory mapped device\n            (1 << 19) |                                     // SSE4.1\n            (CTX->HostFeatures.SupportsCRC << 20) |         // SSE4.2\n            (0 << 21) |                                     // X2APIC\n            (1 << 22) |                                     // MOVBE\n            (1 << 23) |                                     // POPCNT\n            (0 << 24) |                                     // APIC TSC-Deadline\n            (CTX->HostFeatures.SupportsAES << 25) |         // AES\n            (SupportsAVX() << 26) |                         // XSAVE\n            (SupportsAVX() << 27) |                         // OSXSAVE\n            (SupportsAVX() << 28) |                         // AVX\n            (SupportsAVX() << 29) |                         // F16C\n            (CTX->HostFeatures.SupportsRAND << 30) |        // RDRAND\n            (Hypervisor << 31);\n\n  Res.edx = (1 << 0) |  // FPU\n            (1 << 1) |  // Virtual 8086 mode enhancements\n            (0 << 2) |  // Debugging extensions\n            (0 << 3) |  // Page size extension\n            (1 << 4) |  // RDTSC supported\n            (1 << 5) |  // MSR supported\n            (1 << 6) |  // PAE\n            (1 << 7) |  // Machine Check exception\n            (1 << 8) |  // CMPXCHG8B\n            (1 << 9) |  // APIC on-chip\n            (0 << 10) | // Reserved\n            (1 << 11) | // SYSENTER/SYSEXIT\n            (1 << 12) | // Memory Type Range registers, MTRRs are supported\n            (1 << 13) | // Page Global bit\n            (1 << 14) | // Machine Check architecture\n            (1 << 15) | // CMOV\n            (1 << 16) | // Page Attribute Table\n            (1 << 17) | // 36bit page size extension\n            (0 << 18) | // Processor serial number\n            (1 << 19) | // CLFLUSH\n            (0 << 20) | // Reserved\n            (0 << 21) | // Debug store\n            (0 << 22) | // Thermal monitor and software controled clock\n            (1 << 23) | // MMX\n            (1 << 24) | // FXSAVE/FXRSTOR\n            (1 << 25) | // SSE\n            (1 << 26) | // SSE2\n            (0 << 27) | // Self Snoop\n            (0 << 28) | // (HTT) Max APIC IDs reserved field is valid\n            (1 << 29) | // Thermal monitor\n            (0 << 30) | // Reserved\n            (0 << 31);  // Pending break enable\n  return Res;\n}\n\n// 2: Cache and TLB information\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_02h(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n\n  // returns default values from i7 model 1Ah\n  Res.eax = 0x1 | // Number of iterations needed for all descriptors\n            (0x5A << 8) | (0x03 << 16) | (0x55 << 24);\n\n  Res.ebx = 0xE4 | (0xB2 << 8) | (0xF0 << 16) | (0 << 24);\n\n  Res.ecx = 0; // null descriptors\n\n  Res.edx = 0x2C | (0x21 << 8) | (0xCA << 16) | (0x09 << 24);\n\n  return Res;\n}\n\n// 4: Deterministic cache parameters for each level\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_04h(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n  constexpr uint32_t CacheType_Data = 1;\n  constexpr uint32_t CacheType_Instruction = 2;\n  constexpr uint32_t CacheType_Unified = 3;\n\n  if (Leaf == 0) {\n    // Report L1D\n    uint32_t CoreCount = Cores - 1;\n\n    Res.eax = CacheType_Data |   // Cache type\n              (0b001 << 5) |     // Cache level\n              (1 << 8) |         // Self initializing cache level\n              (0 << 9) |         // Fully associative\n              (0 << 14) |        // Maximum number of addressable IDs for logical processors sharing this cache (With SMT this would be 1)\n              (CoreCount << 26); // Maximum number of addressable IDs for processor cores in the physical package\n\n    Res.ebx = (63 << 0) | // Line Size - 1 : Claiming 64 byte\n              (0 << 12) | // Physical Line partitions\n              (7 << 22);  // Associativity - 1 : Claiming 8 way\n\n    // 32KB\n    Res.ecx = 63; // Number of sets - 1 : Claiming 64 sets\n\n    Res.edx = (0 << 0) | // Write-back invalidate\n              (0 << 1) | // Cache inclusiveness - Includes lower caches\n              (0 << 2);  // Complex cache indexing - 0: Direct, 1: Complex\n  } else if (Leaf == 1) {\n    // Report L1I\n    uint32_t CoreCount = Cores - 1;\n\n    Res.eax = CacheType_Instruction | // Cache type\n              (0b001 << 5) |          // Cache level\n              (1 << 8) |              // Self initializing cache level\n              (0 << 9) |              // Fully associative\n              (0 << 14) |        // Maximum number of addressable IDs for logical processors sharing this cache (With SMT this would be 1)\n              (CoreCount << 26); // Maximum number of addressable IDs for processor cores in the physical package\n\n    Res.ebx = (63 << 0) | // Line Size - 1 : Claiming 64 byte\n              (0 << 12) | // Physical Line partitions\n              (7 << 22);  // Associativity - 1 : Claiming 8 way\n\n    // 32KB\n    Res.ecx = 63; // Number of sets - 1 : Claiming 64 sets\n\n    Res.edx = (0 << 0) | // Write-back invalidate\n              (0 << 1) | // Cache inclusiveness - Includes lower caches\n              (0 << 2);  // Complex cache indexing - 0: Direct, 1: Complex\n  } else if (Leaf == 2) {\n    // Report L2\n    uint32_t CoreCount = Cores - 1;\n\n    Res.eax = CacheType_Unified | // Cache type\n              (0b010 << 5) |      // Cache level\n              (1 << 8) |          // Self initializing cache level\n              (0 << 9) |          // Fully associative\n              (0 << 14) |         // Maximum number of addressable IDs for logical processors sharing this cache\n              (CoreCount << 26);  // Maximum number of addressable IDs for processor cores in the physical package\n\n    Res.ebx = (63 << 0) | // Line Size - 1 : Claiming 64 byte\n              (0 << 12) | // Physical Line partitions\n              (7 << 22);  // Associativity - 1 : Claiming 8 way\n\n    // 512KB\n    Res.ecx = 0x3FF; // Number of sets - 1 : Claiming 1024 sets\n\n    Res.edx = (0 << 0) | // Write-back invalidate\n              (0 << 1) | // Cache inclusiveness - Includes lower caches\n              (0 << 2);  // Complex cache indexing - 0: Direct, 1: Complex\n  } else if (Leaf == 3) {\n    // Report L3\n    uint32_t CoreCount = Cores - 1;\n\n    Res.eax = CacheType_Unified | // Cache type\n              (0b011 << 5) |      // Cache level\n              (1 << 8) |          // Self initializing cache level\n              (0 << 9) |          // Fully associative\n              (CoreCount << 14) | // Maximum number of addressable IDs for logical processors sharing this cache\n              (CoreCount << 26);  // Maximum number of addressable IDs for processor cores in the physical package\n\n    Res.ebx = (63 << 0) | // Line Size - 1 : Claiming 64 byte\n              (0 << 12) | // Physical Line partitions\n              (7 << 22);  // Associativity - 1 : Claiming 8 way\n\n    // 8MB\n    Res.ecx = 0x4000; // Number of sets - 1 : Claiming 16384 sets\n\n    Res.edx = (0 << 0) | // Write-back invalidate\n              (0 << 1) | // Cache inclusiveness - Includes lower caches\n              (1 << 2);  // Complex cache indexing - 0: Direct, 1: Complex\n  }\n\n  return Res;\n}\n\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_06h(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n  Res.eax = (1 << 2); // Always running APIC\n  Res.ecx = (0 << 3); // Intel performance energy bias preference (EPB)\n  return Res;\n}\n\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_07h(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n  if (Leaf == 0) {\n    // Disable Enhanced REP MOVS when TSO is enabled.\n    // vcruntime140 memmove will use `rep movsb` in this case which completely destroys perf in Hades(appId 1145360)\n    // This is due to LRCPC performance on Cortex being abysmal.\n    // Only enable EnhancedREPMOVS if atomic memcpy tso emulation isn't enabled.\n    const uint32_t SupportsEnhancedREPMOVS = CTX->IsMemcpyAtomicTSOEnabled() == false;\n    const uint32_t SupportsVPCLMULQDQ = CTX->HostFeatures.SupportsPMULL_128Bit && SupportsAVX();\n    const uint32_t SupportsWFXT = CTX->HostFeatures.SupportsWFXT;\n\n    // Number of subfunctions\n    Res.eax = 0x0;\n    Res.ebx = (1 << 0) |                               // FS/GS support\n              (0 << 1) |                               // TSC adjust MSR\n              (0 << 2) |                               // SGX\n              (SupportsAVX() << 3) |                   // BMI1\n              (0 << 4) |                               // Intel Hardware Lock Elison\n              (SupportsAVX() << 5) |                   // AVX2 support\n              (1 << 6) |                               // FPU data pointer updated only on exception\n              (1 << 7) |                               // SMEP support\n              (SupportsAVX() << 8) |                   // BMI2\n              (SupportsEnhancedREPMOVS << 9) |         // Enhanced REP MOVSB/STOSB\n              (1 << 10) |                              // INVPCID for system software control of process-context\n              (0 << 11) |                              // Restricted transactional memory\n              (0 << 12) |                              // Intel resource directory technology Monitoring\n              (1 << 13) |                              // Deprecates FPU CS and DS\n              (0 << 14) |                              // Intel MPX\n              (0 << 15) |                              // Intel Resource Directory Technology Allocation\n              (0 << 16) |                              // AVX512-F\n              (0 << 17) |                              // AVX512-DQ\n              (CTX->HostFeatures.SupportsRAND << 18) | // RDSEED\n              (1 << 19) |                              // ADCX and ADOX instructions\n              (0 << 20) |                              // SMAP Supervisor mode access prevention and CLAC/STAC instructions\n              (0 << 21) |                              // AVX512-IFMA\n              (0 << 22) |                              // PCOMMIT (deprecated?)\n              (1 << 23) |                              // CLFLUSHOPT instruction\n              (1 << 24) |                              // CLWB instruction\n              (0 << 25) |                              // Intel processor trace\n              (0 << 26) |                              // AVX512-PF\n              (0 << 27) |                              // AVX512-ER\n              (0 << 28) |                              // AVX512-CD\n              (Features.SHA << 29) |                   // SHA instructions\n              (0 << 30) |                              // AVX512-BW\n              (0 << 31);                               // AVX512-VL\n\n    Res.ecx = (1 << 0) |                                // PREFETCHWT1\n              (0 << 1) |                                // AVX512VBMI\n              (0 << 2) |                                // Usermode instruction prevention\n              (0 << 3) |                                // Protection keys for user mode pages\n              (0 << 4) |                                // OS protection keys\n              (SupportsWFXT << 5) |                     // waitpkg\n              (0 << 6) |                                // AVX512-VBMI2\n              (0 << 7) |                                // CET shadow stack\n              (0 << 8) |                                // GFNI\n              (CTX->HostFeatures.SupportsAES256 << 9) | // VAES\n              (SupportsVPCLMULQDQ << 10) |              // VPCLMULQDQ\n              (0 << 11) |                               // AVX512-VNNI\n              (0 << 12) |                               // AVX512-BITALG\n              (0 << 13) |                               // Intel Total Memory Encryption\n              (0 << 14) |                               // AVX512-VPOPCNTDQ\n              (0 << 15) |                               // FZM (TDX)\n              (0 << 16) |                               // 5 Level page tables\n              (0 << 17) |                               // MPX MAWAU\n              (0 << 18) |                               // MPX MAWAU\n              (0 << 19) |                               // MPX MAWAU\n              (0 << 20) |                               // MPX MAWAU\n              (0 << 21) |                               // MPX MAWAU\n              (1 << 22) |                               // RDPID Read Processor ID\n              (0 << 23) |                               // AES Key Locker\n              (1 << 24) |                               // bus-lock-detect\n              (0 << 25) |                               // CLDEMOTE\n              (0 << 26) |                               // MPRR (TDX)\n              (0 << 27) |                               // MOVDIRI\n              (0 << 28) |                               // MOVDIR64B\n              (0 << 29) |                               // ENQCMD\n              (0 << 30) |                               // SGX Launch configuration\n              (0 << 31);                                // PKS\n\n    Res.edx = (0 << 0) |                   // SGX-TEM (TDX)\n              (0 << 1) |                   // SGX-KEYS\n              (0 << 2) |                   // AVX512-4VNNIW\n              (0 << 3) |                   // AVX512-4FMAPS\n              (1 << 4) |                   // Fast Short Rep Mov\n              (0 << 5) |                   // UINTR\n              (0 << 6) |                   // Reserved\n              (0 << 7) |                   // Reserved\n              (0 << 8) |                   // AVX512-VP2INTERSECT\n              (0 << 9) |                   // SRBDS_CTRL (Special Register Buffer Data Sampling Mitigations)\n              (0 << 10) |                  // VERW clears CPU buffers\n              (0 << 11) |                  // rtm-always-abort\n              (0 << 12) |                  // Reserved\n              (0 << 13) |                  // TSX Force Abort (TSX will force abort if attempted)\n              (0 << 14) |                  // SERIALIZE instruction\n              ((Hybrid ? 1U : 0U) << 15) | // Hybrid\n              (0 << 16) |                  // TSXLDTRK (TSX Suspend load address tracking) - Allows untracked memory loads inside TSX region\n              (0 << 17) |                  // Reserved\n              (0 << 18) |                  // Intel PCONFIG\n              (0 << 19) |                  // Intel Architectural LBR\n              (0 << 20) |                  // Intel CET\n              (0 << 21) |                  // Reserved\n              (0 << 22) |                  // AMX-BF16 - Tile computation on bfloat16\n              (0 << 23) |                  // AVX512-FP16 - FP16 AVX512 instructions\n              (0 << 24) |                  // AMX-tile - If AMX is implemented\n              (0 << 25) |                  // AMX-int8 - AMX on 8-bit integers\n              (0 << 26) |                  // IBRS_IBPB - Speculation control\n              (0 << 27) |                  // STIBP - Single Thread Indirect Branch Predictor, Part of IBC\n              (0 << 28) |                  // L1D Flush\n              (0 << 29) |                  // Arch capabilities - Speculative side channel mitigations\n              (0 << 30) |                  // Arch capabilities - MSR module specific\n              (0 << 31);                   // SSBD - Speculative Store Bypass Disable\n  }\n\n  return Res;\n}\n\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_0Dh(uint32_t Leaf) const {\n  // Leaf 0\n  FEXCore::CPUID::FunctionResults Res {};\n\n  uint32_t XFeatureSupportedSizeMax = SupportsAVX() ? 0x0000'0340 : 0x0000'0240; // XFeatureEnabledSizeMax: Legacy Header + FPU/SSE + AVX\n  if (Leaf == 0) {\n    // XFeatureSupportedMask[31:0]\n    Res.eax = (1 << 0) |             // X87 support\n              (1 << 1) |             // 128-bit SSE support\n              (SupportsAVX() << 2) | // 256-bit AVX support\n              (0b00 << 3) |          // MPX State\n              (0b000 << 5) |         // AVX-512 state\n              (0 << 8) |             // \"Used for IA32_XSS\" ... Used for what?\n              (0 << 9);              // PKRU state\n\n    // EBX and ECX doesn't need to match if a feature is supported but not enabled\n    Res.ebx = XFeatureSupportedSizeMax;\n    Res.ecx = XFeatureSupportedSizeMax; // XFeatureSupportedSizeMax: Size in bytes of XSAVE/XRSTOR area\n\n    // XFeatureSupportedMask[63:32]\n    Res.edx = 0; // Upper 32-bits of XFeatureSupportedMask\n  } else if (Leaf == 1) {\n    Res.eax = (1 << 0) | // XSAVEOPT\n              (0 << 1) | // XSAVEC (and XRSTOR)\n              (0 << 2) | // XGETBV - XGETBV with ECX=1 supported\n              (0 << 3);  // XSAVES - XSAVES, XRSTORS, and IA32_XSS supported\n\n    // Same information as Leaf 0 for ebx\n    Res.ebx = XFeatureSupportedSizeMax;\n\n    // Lower supported 32bits of IA32_XSS MSR. IA32_XSS[n] can only be set to 1 if ECX[n] is 1\n    Res.ecx = (0b0000'0000 << 0) | // Used for XCR0\n              (0 << 8) |           // PT state\n              (0 << 9);            // Used for XCR0\n\n    // Upper supported 32bits of IA32_XSS MSR. IA32_XSS[n+32] can only be set to 1 if EDX[n] is 1\n    // Entirely reserved atm\n    Res.edx = 0;\n  } else if (Leaf == 2) {\n    Res.eax = SupportsAVX() ? 0x0000'0100 : 0; // YmmSaveStateSize\n    Res.ebx = SupportsAVX() ? 0x0000'0240 : 0; // YmmSaveStateOffset\n\n    // Reserved\n    Res.ecx = 0;\n    Res.edx = 0;\n  }\n  return Res;\n}\n\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_15h(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n  // TSC frequency = ECX * EBX / EAX\n  uint64_t FrequencyHz = GetCycleCounterFrequency();\n  if (FrequencyHz) {\n    Res.eax = 1;\n    Res.ebx = 1U << CTX->Config.TSCScale;\n    Res.ecx = FrequencyHz;\n  }\n  return Res;\n}\n\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_1Ah(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n  if (Hybrid) {\n    uint32_t CPU = GetCPUID();\n    auto& Data = PerCPUData[CPU];\n    // 0x40 is a big CPU\n    // 0x20 is a little CPU\n    Res.eax |= (Data.IsBig ? 0x40 : 0x20) << 24;\n  }\n  return Res;\n}\n\n// Hypervisor CPUID information leaf\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_4000_0000h(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n  // Maximum supported hypervisor leafs\n  // We only expose the information leaf\n  //\n  // Common courtesy to follow VMWare's \"Hypervisor CPUID Interface proposal\"\n  // 4000_0000h - Information leaf. Advertising to the software which hypervisor this is\n  // 4000_0001h - 4000_000Fh - Hypervisor specific leafs. FEX can use these for anything\n  // 4000_0010h - 4000_00FFh - \"Generic Leafs\" - Try not to overwrite, other hypervisors might expect information in these\n  //\n  // CPUID documentation information:\n  // 4000_0000h - 4FFF_FFFFh - No existing or future CPU will return information in this range\n  // Reserved entirely for VMs to do whatever they want.\n  Res.eax = 0x40000001;\n\n  // EBX, EDX, ECX become the hypervisor ID signature\n  constexpr static char HypervisorID[12] = \"FEXIFEXIEMU\";\n  memcpy(&Res.ebx, HypervisorID, sizeof(HypervisorID));\n  return Res;\n}\n\nconstexpr std::array<char, std::char_traits<char>::length(GIT_DESCRIBE_STRING) + 1> GitString = {GIT_DESCRIBE_STRING};\nstatic_assert(GitString.size() < 32);\n\n// Hypervisor CPUID information leaf\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_4000_0001h(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n  constexpr uint32_t MaximumSubLeafNumber = 2;\n  if (Leaf == 0) {\n    // EAX[3:0] Is the host architecture that FEX is running under\n#ifdef ARCHITECTURE_x86_64\n    // EAX[3:0] = 1 = x86_64 host architecture\n    Res.eax |= 0b0001;\n#elif defined(ARCHITECTURE_arm64)\n    // EAX[3:0] = 2 = AArch64 host architecture\n    Res.eax |= 0b0010;\n#else\n    // EAX[3:0] = 0 = Unknown architecture\n#endif\n\n    // EAX[15:4] = Reserved\n\n    // EAX[31:16] = Maximum sub-leaf value.\n    Res.eax |= MaximumSubLeafNumber << 16;\n  } else if (Leaf == 1) {\n    memcpy(&Res, GitString.data(), std::min<size_t>(GitString.size(), sizeof(FEXCore::CPUID::FunctionResults)));\n  } else if (Leaf == 2) {\n    memcpy(&Res, GitString.data() + 16, std::min<size_t>(std::max<ssize_t>(0, GitString.size() - 16), sizeof(FEXCore::CPUID::FunctionResults)));\n  }\n\n  return Res;\n}\n\n// Highest extended function implemented\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_8000_0000h(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n  Res.eax = 0x8000001F;\n\n  // EBX, EDX, ECX become the manufacturer id string\n  // Just like cpuid function 0\n#ifdef CPUID_AMD\n  Res.ebx = CPUID_VENDOR_AMD1;\n  Res.edx = CPUID_VENDOR_AMD2;\n  Res.ecx = CPUID_VENDOR_AMD3;\n#else\n  Res.ebx = CPUID_VENDOR_INTEL1;\n  Res.edx = CPUID_VENDOR_INTEL2;\n  Res.ecx = CPUID_VENDOR_INTEL3;\n#endif\n  return Res;\n}\n\n// Extended processor and feature bits\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_8000_0001h(uint32_t Leaf) const {\n\n#ifndef _WIN32\n  constexpr uint32_t SUPPORTS_RDTSCP = 1;\n#else\n  // RDTSCP under WIN32 is only supported if CPUIndex is available in TPIDRRO.\n  const uint32_t SUPPORTS_RDTSCP = SupportsCPUIndexInTPIDRRO;\n#endif\n  FEXCore::CPUID::FunctionResults Res {};\n\n  Res.eax = FAMILY_IDENTIFIER;\n\n  Res.ecx = (1 << 0) |                               // LAHF/SAHF\n            (1 << 1) |                               // 0 = Single core product, 1 = multi core product\n            (0 << 2) |                               // SVM\n            (1 << 3) |                               // Extended APIC register space\n            (0 << 4) |                               // LOCK MOV CR0 means MOV CR8\n            (1 << 5) |                               // ABM instructions\n            (CTX->HostFeatures.SupportsSSE4a << 6) | // SSE4a\n            (0 << 7) |                               // Misaligned SSE mode\n            (1 << 8) |                               // PREFETCHW\n            (0 << 9) |                               // OS visible workaround support\n            (0 << 10) |                              // Instruction based sampling support\n            (0 << 11) |                              // XOP\n            (0 << 12) |                              // SKINIT\n            (0 << 13) |                              // Watchdog timer support\n            (0 << 14) |                              // Reserved\n            (0 << 15) |                              // Lightweight profiling support\n            (0 << 16) |                              // FMA4\n            (1 << 17) |                              // Translation cache extension\n            (0 << 18) |                              // Reserved\n            (0 << 19) |                              // Reserved\n            (0 << 20) |                              // Reserved\n            (0 << 21) |                              // XOP-TBM\n            (0 << 22) |                              // Topology extensions support\n            (0 << 23) |                              // Core performance counter extensions\n            (0 << 24) |                              // NB performance counter extensions\n            (0 << 25) |                              // Reserved\n            (0 << 26) |                              // Data breakpoints extensions\n            (0 << 27) |                              // Performance TSC\n            (0 << 28) |                              // L2 perf counter extensions\n            (0 << 29) |                              // MONITORX\n            (0 << 30) |                              // Reserved\n            (0 << 31);                               // Reserved\n\n  Res.edx = (1 << 0) |                                // FPU\n            (1 << 1) |                                // Virtual mode extensions\n            (1 << 2) |                                // Debugging extensions\n            (1 << 3) |                                // Page size extensions\n            (1 << 4) |                                // TSC\n            (1 << 5) |                                // MSR support\n            (1 << 6) |                                // PAE\n            (1 << 7) |                                // Machine Check Exception\n            (1 << 8) |                                // CMPXCHG8B\n            (1 << 9) |                                // APIC\n            (0 << 10) |                               // Reserved\n            (1 << 11) |                               // SYSCALL/SYSRET\n            (1 << 12) |                               // MTRR\n            (1 << 13) |                               // Page global extension\n            (1 << 14) |                               // Machine Check architecture\n            (1 << 15) |                               // CMOV\n            (1 << 16) |                               // Page attribute table\n            (1 << 17) |                               // Page-size extensions\n            (0 << 18) |                               // Reserved\n            (0 << 19) |                               // Reserved\n            (1 << 20) |                               // NX\n            (0 << 21) |                               // Reserved\n            (1 << 22) |                               // MMXExt\n            (1 << 23) |                               // MMX\n            (1 << 24) |                               // FXSAVE/FXRSTOR\n            (1 << 25) |                               // FXSAVE/FXRSTOR Optimizations\n            (0 << 26) |                               // 1 gigabit pages\n            (SUPPORTS_RDTSCP << 27) |                 // RDTSCP\n            (0 << 28) |                               // Reserved\n            (1 << 29) |                               // Long Mode\n            (CTX->HostFeatures.Supports3DNow << 30) | // 3DNow! Extensions\n            (CTX->HostFeatures.Supports3DNow << 31);  // 3DNow!\n  return Res;\n}\n\n// Processor brand string\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_8000_0002h(uint32_t Leaf) const {\n  return Function_8000_0002h(Leaf, GetCPUID());\n}\n\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_8000_0003h(uint32_t Leaf) const {\n  return Function_8000_0003h(Leaf, GetCPUID());\n}\n\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_8000_0004h(uint32_t Leaf) const {\n  return Function_8000_0004h(Leaf, GetCPUID());\n}\n\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_8000_0002h(uint32_t Leaf, uint32_t CPU) const {\n  FEXCore::CPUID::FunctionResults Res {};\n  auto& Data = PerCPUData[CPU];\n  memcpy(&Res, Data.ProductName, std::min(strlen(Data.ProductName), sizeof(FEXCore::CPUID::FunctionResults)));\n  return Res;\n}\n\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_8000_0003h(uint32_t Leaf, uint32_t CPU) const {\n  FEXCore::CPUID::FunctionResults Res {};\n  auto& Data = PerCPUData[CPU];\n  const auto RemainingStringSize = std::max<ssize_t>(0, strlen(Data.ProductName) - 16);\n  memcpy(&Res, Data.ProductName + 16, std::min<size_t>(RemainingStringSize, sizeof(FEXCore::CPUID::FunctionResults)));\n  return Res;\n}\n\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_8000_0004h(uint32_t Leaf, uint32_t CPU) const {\n  FEXCore::CPUID::FunctionResults Res {};\n  auto& Data = PerCPUData[CPU];\n  const auto RemainingStringSize = std::max<ssize_t>(0, strlen(Data.ProductName) - 32);\n  memcpy(&Res, Data.ProductName + 32, std::min<size_t>(RemainingStringSize, sizeof(FEXCore::CPUID::FunctionResults)));\n  return Res;\n}\n\n// L1 Cache and TLB identifiers\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_8000_0005h(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n\n  // L1 TLB Information for 2MB and 4MB pages\n  Res.eax = (64 << 0) |  // Number of TLB instruction entries\n            (255 << 8) | // instruction TLB associativity type (full)\n            (64 << 16) | // Number of TLB data entries\n            (255 << 24); // data TLB associativity type (full)\n\n  // L1 TLB Information for 4KB pages\n  Res.ebx = (64 << 0) |  // Number of TLB instruction entries\n            (255 << 8) | // instruction TLB associativity type (full)\n            (64 << 16) | // Number of TLB data entries\n            (255 << 24); // data TLB associativity type (full)\n\n  // L1 data cache identifiers\n  Res.ecx = (64 << 0) | // L1 data cache size line in bytes\n            (1 << 8) |  // L1 data cachelines per tag\n            (8 << 16) | // L1 data cache associativity\n            (32 << 24); // L1 data cache size in KB\n\n  // L1 instruction cache identifiers\n  Res.edx = (64 << 0) | // L1 instruction cache line size in bytes\n            (1 << 8) |  // L1 instruction cachelines per tag\n            (4 << 16) | // L1 instruction cache associativity\n            (64 << 24); // L1 instruction cache size in KB\n\n  return Res;\n}\n\n// L2 Cache identifiers\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_8000_0006h(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n\n  // L2 TLB Information for 2MB and 4MB pages\n  Res.eax = (1024 << 0) |  // Number of TLB instruction entries\n            (6 << 12) |    // instruction TLB associativity type\n            (1536 << 16) | // Number of TLB data entries\n            (3 << 28);     // data TLB associativity type\n\n  // L2 TLB Information for 4KB pages\n  Res.ebx = (1024 << 0) |  // Number of TLB instruction entries\n            (6 << 12) |    // instruction TLB associativity type\n            (1536 << 16) | // Number of TLB data entries\n            (5 << 28);     // data TLB associativity type\n\n  // L2 cache identifiers\n  Res.ecx = (64 << 0) |  // cacheline size\n            (1 << 8) |   // cachelines per tag\n            (6 << 12) |  // cache associativity\n            (512 << 16); // L2 cache size in KB\n\n  // L3 cache identifiers\n  Res.edx = (64 << 0) | // cacheline size\n            (1 << 8) |  // cachelines per tag\n            (6 << 12) | // cache associativity\n            (16 << 18); // L2 cache size in KB\n  return Res;\n}\n\n// Advanced power management\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_8000_0007h(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n  Res.eax = (1 << 2); // APIC timer not affected by p-state\n  Res.edx = (1 << 8); // Invariant TSC\n  return Res;\n}\n\n// Virtual and physical address sizes\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_8000_0008h(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n  Res.eax = (48 << 0) | // PhysAddrSize = 48-bit\n            (48 << 8) | // LinAddrSize = 48-bit\n            (0 << 16);  // GuestPhysAddrSize == PhysAddrSize\n\n  Res.ebx = (0 << 2) |                               // XSaveErPtr: Saving and restoring error pointers\n            (0 << 1) |                               // IRPerf: Instructions retired count support\n            (CTX->HostFeatures.SupportsCLZERO << 0); // CLZERO support\n\n  uint32_t CoreCount = Cores - 1;\n  Res.ecx = (0 << 16) |                    // PerfTscSize: Performance timestamp count size\n            (std::bit_ceil(Cores) << 12) | // ApicIdSize: Number of bits in ApicID\n            (CoreCount << 0);              // Count count subtract one\n\n  return Res;\n}\n\n// TLB 1GB page identifiers\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_8000_0019h(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n  Res.eax = (0xF << 28) | // L1 DTLB associativity for 1GB pages\n            (64 << 16) |  // L1 DTLB entry count for 1GB pages\n            (0xF << 12) | // L1 ITLB associativity for 1GB pages\n            (64 << 0);    // L1 ITLB entry count for 1GB pages\n\n  Res.ebx = (0 << 28) | // L2 DTLB associativity for 1GB pages\n            (0 << 16) | // L2 DTLB entry count for 1GB pages\n            (0 << 12) | // L2 ITLB associativity for 1GB pages\n            (0 << 0);   // L2 ITLB entry count for 1GB pages\n  return Res;\n}\n\n// Deterministic cache parameters for each level\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_8000_001Dh(uint32_t Leaf) const {\n  // This is nearly a copy of CPUID function 4h\n  // There are some minor changes though\n\n  FEXCore::CPUID::FunctionResults Res {};\n  constexpr uint32_t CacheType_Data = 1;\n  constexpr uint32_t CacheType_Instruction = 2;\n  constexpr uint32_t CacheType_Unified = 3;\n\n  if (Leaf == 0) {\n    // Report L1D\n    Res.eax = CacheType_Data | // Cache type\n              (0b001 << 5) |   // Cache level\n              (1 << 8) |       // Self initializing cache level\n              (0 << 9) |       // Fully associative\n              (0 << 14);       // Maximum number of addressable IDs for logical processors sharing this cache (With SMT this would be 1)\n\n    Res.ebx = (63 << 0) | // Line Size - 1 : Claiming 64 byte\n              (0 << 12) | // Physical Line partitions\n              (7 << 22);  // Associativity - 1 : Claiming 8 way\n\n    // 32KB\n    Res.ecx = 63; // Number of sets - 1 : Claiming 64 sets\n\n    Res.edx = (0 << 0) | // Write-back invalidate\n              (0 << 1);  // Cache inclusiveness - Includes lower caches\n  } else if (Leaf == 1) {\n    // Report L1I\n    Res.eax = CacheType_Instruction | // Cache type\n              (0b001 << 5) |          // Cache level\n              (1 << 8) |              // Self initializing cache level\n              (0 << 9) |              // Fully associative\n              (0 << 14); // Maximum number of addressable IDs for logical processors sharing this cache (With SMT this would be 1)\n\n    Res.ebx = (63 << 0) | // Line Size - 1 : Claiming 64 byte\n              (0 << 12) | // Physical Line partitions\n              (7 << 22);  // Associativity - 1 : Claiming 8 way\n\n    // 32KB\n    Res.ecx = 63; // Number of sets - 1 : Claiming 64 sets\n\n    Res.edx = (0 << 0) | // Write-back invalidate\n              (0 << 1);  // Cache inclusiveness - Includes lower caches\n  } else if (Leaf == 2) {\n    // Report L2\n    Res.eax = CacheType_Unified | // Cache type\n              (0b010 << 5) |      // Cache level\n              (1 << 8) |          // Self initializing cache level\n              (0 << 9) |          // Fully associative\n              (0 << 14);          // Maximum number of addressable IDs for logical processors sharing this cache\n\n    Res.ebx = (63 << 0) | // Line Size - 1 : Claiming 64 byte\n              (0 << 12) | // Physical Line partitions\n              (7 << 22);  // Associativity - 1 : Claiming 8 way\n\n    // 512KB\n    Res.ecx = 0x3FF; // Number of sets - 1 : Claiming 1024 sets\n\n    Res.edx = (0 << 0) | // Write-back invalidate\n              (0 << 1);  // Cache inclusiveness - Includes lower caches\n  } else if (Leaf == 3) {\n    // Report L3\n    uint32_t CoreCount = Cores - 1;\n\n    Res.eax = CacheType_Unified | // Cache type\n              (0b011 << 5) |      // Cache level\n              (1 << 8) |          // Self initializing cache level\n              (0 << 9) |          // Fully associative\n              (CoreCount << 14);  // Maximum number of addressable IDs for logical processors sharing this cache\n\n    Res.ebx = (63 << 0) | // Line Size - 1 : Claiming 64 byte\n              (0 << 12) | // Physical Line partitions\n              (7 << 22);  // Associativity - 1 : Claiming 8 way\n\n    // 8MB\n    Res.ecx = 0x4000; // Number of sets - 1 : Claiming 16384 sets\n\n    Res.edx = (0 << 0) | // Write-back invalidate\n              (0 << 1);  // Cache inclusiveness - Includes lower caches\n  }\n\n  return Res;\n}\n\nFEXCore::CPUID::FunctionResults CPUIDEmu::Function_Reserved(uint32_t Leaf) const {\n  FEXCore::CPUID::FunctionResults Res {};\n  return Res;\n}\n\nFEXCore::CPUID::XCRResults CPUIDEmu::XCRFunction_0h() const {\n  // This just returns XCR0\n  FEXCore::CPUID::XCRResults Res {\n    .eax = static_cast<uint32_t>(XCR0),\n    .edx = static_cast<uint32_t>(XCR0 >> 32),\n  };\n\n  return Res;\n}\n\nCPUIDEmu::CPUIDEmu(const FEXCore::Context::ContextImpl* ctx)\n  : CTX {ctx}\n  , SupportsCPUIndexInTPIDRRO {CTX->HostFeatures.SupportsCPUIndexInTPIDRRO}\n  , GetCPUID {GetCPUID_Syscall} {\n  Cores = CTX->HostFeatures.CPUMIDRs.size();\n\n  // Setup some state tracking\n  SetupHostHybridFlag();\n\n  SetupFeatures();\n\n#ifdef ARCHITECTURE_arm64\n  if (SupportsCPUIndexInTPIDRRO) {\n    GetCPUID = GetCPUID_TPIDRRO;\n  }\n#endif\n}\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/CPUID.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Core/CPUID.h>\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <cstdint>\n#include <unordered_map>\n#include <utility>\n\nnamespace FEXCore {\nnamespace Context {\n  class ContextImpl;\n}\n\nuint64_t GetCycleCounterFrequency();\n\n// Debugging define to switch what family of CPU we execute as.\n// Might be useful if an application makes an assumption about a CPU.\n// #define CPUID_AMD\nclass CPUIDEmu final {\nprivate:\n  constexpr static uint32_t CPUID_VENDOR_INTEL1 = 0x756E6547; // \"Genu\"\n  constexpr static uint32_t CPUID_VENDOR_INTEL2 = 0x49656E69; // \"ineI\"\n  constexpr static uint32_t CPUID_VENDOR_INTEL3 = 0x6C65746E; // \"ntel\"\n\n  constexpr static uint32_t CPUID_VENDOR_AMD1 = 0x68747541; // \"Auth\"\n  constexpr static uint32_t CPUID_VENDOR_AMD2 = 0x69746E65; // \"enti\"\n  constexpr static uint32_t CPUID_VENDOR_AMD3 = 0x444D4163; // \"cAMD\"\n\npublic:\n  CPUIDEmu(const FEXCore::Context::ContextImpl* ctx);\n\n  // X86 cacheline size effectively has to be hardcoded to 64\n  // if we report anything differently then applications are likely to break\n  constexpr static uint64_t CACHELINE_SIZE = 64;\n\n  FEXCore::CPUID::FunctionResults RunFunction(uint32_t Function, uint32_t Leaf) const {\n    if (Function < Primary.size()) {\n      const auto Handler = Primary[Function];\n      return (this->*Handler)(Leaf);\n    }\n\n    constexpr uint32_t HypervisorBase = 0x4000'0000;\n    if (Function >= HypervisorBase && Function < (HypervisorBase + Hypervisor.size())) {\n      const auto Handler = Hypervisor[Function - HypervisorBase];\n      return (this->*Handler)(Leaf);\n    }\n\n    constexpr uint32_t ExtendedBase = 0x8000'0000;\n    if (Function >= ExtendedBase && Function < (ExtendedBase + Extended.size())) {\n      const auto Handler = Extended[Function - ExtendedBase];\n      return (this->*Handler)(Leaf);\n    }\n\n    return Function_Reserved(Leaf);\n  }\n\n  FEXCore::CPUID::FunctionResults RunFunctionName(uint32_t Function, uint32_t Leaf, uint32_t CPU) const {\n    if (Function == 0x8000'0002U) {\n      return Function_8000_0002h(Leaf, CPU % PerCPUData.size());\n    } else if (Function == 0x8000'0003U) {\n      return Function_8000_0003h(Leaf, CPU % PerCPUData.size());\n    } else {\n      return Function_8000_0004h(Leaf, CPU % PerCPUData.size());\n    }\n  }\n\n  FEXCore::CPUID::XCRResults RunXCRFunction(uint32_t Function) const {\n    if (Function >= 1) {\n      // XCR function 1 is not yet supported.\n      return {};\n    }\n\n    return XCRFunction_0h();\n  }\n\n  bool DoesXCRFunctionReportConstantData(uint32_t Function) const {\n    // Every function currently returns constant data.\n    return true;\n  }\n\n  enum class SupportsConstant {\n    CONSTANT,\n    NONCONSTANT,\n  };\n  enum class NeedsLeafConstant {\n    NEEDSLEAFCONSTANT,\n    NOLEAFCONSTANT,\n  };\n  struct FunctionConstant {\n    SupportsConstant SupportsConstantFunction;\n    NeedsLeafConstant NeedsLeaf;\n  };\n\n  static constexpr FunctionConstant DoesFunctionReportConstantData(uint32_t Function) {\n    if (Function < Primary.size()) {\n      return Primary_Constant[Function];\n    }\n\n    constexpr uint32_t HypervisorBase = 0x4000'0000;\n    if (Function >= HypervisorBase && Function < (HypervisorBase + Hypervisor.size())) {\n      return Hypervisor_Constant[Function - HypervisorBase];\n    }\n\n    constexpr uint32_t ExtendedBase = 0x8000'0000;\n    if (Function >= ExtendedBase && Function < (ExtendedBase + Extended.size())) {\n      return Extended_Constant[Function - ExtendedBase];\n    }\n\n    // Anything unsupported is known constant return of reserved data.\n    return {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT};\n  }\n\nprivate:\n  const FEXCore::Context::ContextImpl* CTX;\n  [[maybe_unused]] bool SupportsCPUIndexInTPIDRRO {};\n  bool Hybrid {};\n  uint32_t Cores {};\n  FEX_CONFIG_OPT(HideHypervisorBit, HIDEHYPERVISORBIT);\n\n  // XFEATURE_ENABLED_MASK\n  // Mask that configures what features are enabled on the CPU.\n  // Affects XSAVE and XRSTOR when modified.\n  // Bit layout is as follows.\n  // [0]     - x87 enabled\n  // [1]     - SSE enabled\n  // [2]     - YMM enabled (256-bit SSE)\n  // [8:3]   - Reserved. MBZ.\n  // [9]     - MPK\n  // [10]    - Reserved. MBZ.\n  // [11]    - CET_U\n  // [12]    - CET_S\n  // [61:13] - Reserved. MBZ.\n  // [62]    - LWP (Lightweight profiling)\n  // [63]    - Reserved for XCR bit vector expansion. MBZ.\n  // Always enable x87 and SSE by default.\n  constexpr static uint64_t XCR0_X87 = 1ULL << 0;\n  constexpr static uint64_t XCR0_SSE = 1ULL << 1;\n  constexpr static uint64_t XCR0_AVX = 1ULL << 2;\n\n  struct FeaturesConfig {\n    uint64_t SHA  : 1;\n    uint64_t _pad : 63;\n  };\n\n  FeaturesConfig Features {\n    .SHA = 1,\n  };\n\n  uint64_t XCR0 {XCR0_X87 | XCR0_SSE};\n\n  uint32_t SupportsAVX() const {\n    return (XCR0 & XCR0_AVX) ? 1 : 0;\n  }\n\n  using FunctionHandler = FEXCore::CPUID::FunctionResults (CPUIDEmu::*)(uint32_t Leaf) const;\n\n  struct CPUData {\n    const char* ProductName {};\n#ifdef ARCHITECTURE_arm64\n    uint32_t MIDR {};\n#endif\n    bool IsBig {};\n  };\n  fextl::vector<CPUData> PerCPUData {};\n\n  // Functions\n  FEXCore::CPUID::FunctionResults Function_0h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_01h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_02h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_04h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_06h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_07h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_0Dh(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_15h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_1Ah(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_4000_0000h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_4000_0001h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_8000_0000h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_8000_0001h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_8000_0002h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_8000_0003h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_8000_0004h(uint32_t Leaf) const;\n\n  FEXCore::CPUID::FunctionResults Function_8000_0002h(uint32_t Leaf, uint32_t CPU) const;\n  FEXCore::CPUID::FunctionResults Function_8000_0003h(uint32_t Leaf, uint32_t CPU) const;\n  FEXCore::CPUID::FunctionResults Function_8000_0004h(uint32_t Leaf, uint32_t CPU) const;\n\n  FEXCore::CPUID::FunctionResults Function_8000_0005h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_8000_0006h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_8000_0007h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_8000_0008h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_8000_0019h(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_8000_001Dh(uint32_t Leaf) const;\n  FEXCore::CPUID::FunctionResults Function_Reserved(uint32_t Leaf) const;\n\n  FEXCore::CPUID::XCRResults XCRFunction_0h() const;\n\n  void SetupHostHybridFlag();\n  void SetupFeatures();\n  static constexpr size_t PRIMARY_FUNCTION_COUNT = 27;\n  static constexpr size_t HYPERVISOR_FUNCTION_COUNT = 2;\n  static constexpr size_t EXTENDED_FUNCTION_COUNT = 32;\n  static constexpr std::array<FunctionHandler, PRIMARY_FUNCTION_COUNT> Primary = {\n    // 0: Highest function parameter and ID\n    &CPUIDEmu::Function_0h,\n    // 1: Processor info\n    &CPUIDEmu::Function_01h,\n    // 2: Cache and TLB info\n    &CPUIDEmu::Function_02h,\n    // 3: Serial Number(previously), now reserved\n    &CPUIDEmu::Function_Reserved,\n#ifndef CPUID_AMD\n    // 4: Deterministic cache parameters for each level\n    &CPUIDEmu::Function_04h,\n#else\n    &CPUIDEmu::Function_Reserved,\n#endif\n    // 5: Monitor/mwait\n    &CPUIDEmu::Function_Reserved,\n    // 6: Thermal and power management\n    &CPUIDEmu::Function_06h,\n    // 7: Extended feature flags\n    &CPUIDEmu::Function_07h,\n    // 0x08: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 9: Direct Cache Access information\n    &CPUIDEmu::Function_Reserved,\n    // 0x0A: Architectural performance monitoring\n    &CPUIDEmu::Function_Reserved,\n    // 0x0B: Extended topology enumeration\n    &CPUIDEmu::Function_Reserved,\n    // 0x0C: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x0D: Processor extended state enumeration\n    &CPUIDEmu::Function_0Dh,\n    // 0x0E: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x0F: Intel RDT monitoring\n    &CPUIDEmu::Function_Reserved,\n    // 0x10: Intel RDT allocation enumeration\n    &CPUIDEmu::Function_Reserved,\n    // 0x12: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x12: Intel SGX capability enumeration\n    &CPUIDEmu::Function_Reserved,\n    // 0x13: Reserved\n    &CPUIDEmu::Function_Reserved,\n    // 0x14: Intel Processor trace\n    &CPUIDEmu::Function_Reserved,\n#ifndef CPUID_AMD\n    // Timestamp counter information\n    // Doesn't exist on AMD hardware\n    &CPUIDEmu::Function_15h,\n#else\n    &CPUIDEmu::Function_Reserved,\n#endif\n    // 0x16: Processor frequency information\n    &CPUIDEmu::Function_Reserved,\n    // 0x17: SoC vendor attribute enumeration\n    &CPUIDEmu::Function_Reserved,\n    // 0x18: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x19: Reserved?\n    &CPUIDEmu::Function_Reserved,\n#ifndef CPUID_AMD\n    // 0x1A: Hybrid Information Sub-leaf\n    &CPUIDEmu::Function_1Ah,\n#else\n    &CPUIDEmu::Function_Reserved,\n#endif\n  };\n\n  static constexpr std::array<FunctionConstant, PRIMARY_FUNCTION_COUNT> Primary_Constant = {{\n    // 0: Highest function parameter and ID\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 1: Processor info\n    {SupportsConstant::NONCONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 2: Cache and TLB info\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 3: Serial Number(previously), now reserved\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n#ifndef CPUID_AMD\n    // 4: Deterministic cache parameters for each level\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NEEDSLEAFCONSTANT},\n#else\n    // 4: Reserved\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n#endif\n    // 5: Monitor/mwait\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 6: Thermal and power management\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 7: Extended feature flags\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NEEDSLEAFCONSTANT},\n    // 0x08: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 9: Direct Cache Access information\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x0A: Architectural performance monitoring\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x0B: Extended topology enumeration\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x0C: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x0D: Processor extended state enumeration\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NEEDSLEAFCONSTANT},\n    // 0x0E: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x0F: Intel RDT monitoring\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x10: Intel RDT allocation enumeration\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x12: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x12: Intel SGX capability enumeration\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x13: Reserved\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x14: Intel Processor trace\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n#ifndef CPUID_AMD\n    // 0x15: Timestamp counter information\n    // Doesn't exist on AMD hardware\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n#else\n    // 0x15: Reserved\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n#endif\n    // 0x16: Processor frequency information\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x17: SoC vendor attribute enumeration\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x18: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x19: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n#ifndef CPUID_AMD\n    // 0x1A: Hybrid Information Sub-leaf\n    {SupportsConstant::NONCONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n#else\n    // 0x1A: Reserved\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n#endif\n  }};\n\n  static constexpr std::array<FunctionHandler, HYPERVISOR_FUNCTION_COUNT> Hypervisor = {\n    // Hypervisor CPUID information leaf\n    &CPUIDEmu::Function_4000_0000h,\n    // FEX-Emu specific leaf\n    &CPUIDEmu::Function_4000_0001h,\n  };\n\n  static constexpr std::array<FunctionConstant, HYPERVISOR_FUNCTION_COUNT> Hypervisor_Constant = {{\n    // Hypervisor CPUID information leaf\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // FEX-Emu specific leaf\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NEEDSLEAFCONSTANT},\n  }};\n\n  static constexpr std::array<FunctionHandler, EXTENDED_FUNCTION_COUNT> Extended = {\n    // Largest extended function number\n    &CPUIDEmu::Function_8000_0000h,\n    // Processor vendor\n    &CPUIDEmu::Function_8000_0001h,\n    // Processor brand string\n    &CPUIDEmu::Function_8000_0002h,\n    // Processor brand string continued\n    &CPUIDEmu::Function_8000_0003h,\n    // Processor brand string continued\n    &CPUIDEmu::Function_8000_0004h,\n#ifdef CPUID_AMD\n    // 0x8000'0005: L1 Cache and TLB identifiers\n    &CPUIDEmu::Function_8000_0005h,\n#else\n    &CPUIDEmu::Function_Reserved,\n#endif\n    // 0x8000'0006: L2 Cache identifiers\n    &CPUIDEmu::Function_8000_0006h,\n    // 0x8000'0007: Advanced power management information\n    &CPUIDEmu::Function_8000_0007h,\n    // 0x8000'0008: Virtual and physical address sizes\n    &CPUIDEmu::Function_8000_0008h,\n    // 0x8000'0009: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'000A: SVM Revision\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'000B: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'000C: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'000D: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'000E: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'000F: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'0010: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'0011: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'0012: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'0013: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'0014: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'0015: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'0016: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'0017: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'0018: Reserved?\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'0019: TLB 1GB page identifiers\n    &CPUIDEmu::Function_8000_0019h,\n    // 0x8000'001A: Performance optimization identifiers\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'001B: Instruction based sampling identifiers\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'001C: Lightweight profiling capabilities\n    &CPUIDEmu::Function_Reserved,\n#ifdef CPUID_AMD\n    // 0x8000'001D: Cache properties\n    &CPUIDEmu::Function_8000_001Dh,\n#else\n    &CPUIDEmu::Function_Reserved,\n#endif\n    // 0x8000'001E: Extended APIC ID\n    &CPUIDEmu::Function_Reserved,\n    // 0x8000'001F: AMD Secure Encryption\n    &CPUIDEmu::Function_Reserved,\n  };\n\n  static constexpr std::array<FunctionConstant, EXTENDED_FUNCTION_COUNT> Extended_Constant = {{\n    // Largest extended function number\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // Processor vendor\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // Processor brand string\n    {SupportsConstant::NONCONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // Processor brand string continued\n    {SupportsConstant::NONCONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // Processor brand string continued\n    {SupportsConstant::NONCONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n#ifdef CPUID_AMD\n    // 0x8000'0005: L1 Cache and TLB identifiers\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n#else\n    // 0x8000'0005: Reserved\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n#endif\n    // 0x8000'0006: L2 Cache identifiers\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'0007: Advanced power management information\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'0008: Virtual and physical address sizes\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'0009: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'000A: SVM Revision\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'000B: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'000C: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'000D: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'000E: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'000F: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'0010: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'0011: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'0012: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'0013: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'0014: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'0015: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'0016: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'0017: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'0018: Reserved?\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'0019: TLB 1GB page identifiers\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'001A: Performance optimization identifiers\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'001B: Instruction based sampling identifiers\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'001C: Lightweight profiling capabilities\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n#ifdef CPUID_AMD\n    // 0x8000'001D: Cache properties\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NEEDSLEAFCONSTANT},\n#else\n    // 0x8000'001D: Reserved\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n#endif\n    // 0x8000'001E: Extended APIC ID\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n    // 0x8000'001F: AMD Secure Encryption\n    {SupportsConstant::CONSTANT, NeedsLeafConstant::NOLEAFCONSTANT},\n  }};\n\n  using GetCPUIDPtr = uint32_t (*)();\n  GetCPUIDPtr GetCPUID;\n};\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/CodeCache.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Utils/SpinWaitLock.h\"\n\n#include <Interface/Context/Context.h>\n#include <Interface/Core/ArchHelpers/Arm64Emitter.h>\n#include <Interface/Core/Dispatcher/Dispatcher.h>\n#include <Interface/Core/JIT/DebugData.h>\n#include <Interface/Core/JIT/Relocations.h>\n#include <Interface/Core/LookupCache.h>\n#include <Interface/Core/OpcodeDispatcher.h>\n#include <Interface/IR/PassManager.h>\n\n#include <FEXCore/Core/Thunks.h>\n#include <FEXCore/HLE/SourcecodeResolver.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n\n#include <FEXHeaderUtils/Filesystem.h>\n\n#include <git_version.h>\n\n#include <xxhash.h>\n\n#include <fstream>\n\nnamespace FEXCore {\n\n#if __clang_major__ < 16\nExecutableFileInfo::ExecutableFileInfo(fextl::unique_ptr<HLE::SourcecodeMap> Map, uint64_t FileId, fextl::string Filename)\n  : SourcecodeMap(std::move(Map))\n  , FileId(FileId)\n  , Filename(Filename) {}\n#endif\nExecutableFileInfo::~ExecutableFileInfo() = default;\n\nfextl::string CodeMap::GetBaseFilename(const ExecutableFileInfo& MainExecutable, bool AddNombSuffix) {\n  auto FileId = MainExecutable.FileId;\n\n  std::string_view base_filename = FHU::Filesystem::GetFilename(std::string_view {MainExecutable.Filename});\n  if (FileId != 0xffff'ffff'ffff'ffff) {\n    return fextl::fmt::format(\"{}-{:016x}{}\", base_filename, MainExecutable.FileId, AddNombSuffix ? \"-nomb\" : \"\");\n  }\n\n  return \"\";\n}\n\nfextl::map<CodeMapFileId, CodeMap::ParsedContents> CodeMap::ParseCodeMap(std::ifstream& File) {\n  fextl::map<CodeMapFileId, CodeMap::ParsedContents> Ret;\n  while (true) {\n    Entry Entry;\n    File.read(reinterpret_cast<char*>(&Entry), sizeof(Entry));\n    if (!File) {\n      break;\n    }\n\n    if (Entry.FileId == LoadExternalLibrary.FileId && Entry.BlockOffset == LoadExternalLibrary.BlockOffset) {\n      ExternalLibraryInfo Info;\n      File.read(reinterpret_cast<char*>(&Info), sizeof(Info));\n\n      fextl::string Filename;\n      std::getline(File, Filename, '\\0');\n\n      // Align to 4-byte boundary\n      char Null[4];\n      File.read(Null, AlignUp(Filename.size() + 1, 4) - Filename.size() - 1);\n      if (!File) {\n        break;\n      }\n      Ret[Info.ExternalFileId].Filename = std::move(Filename);\n    } else if (Entry.FileId == SetExecutableFileId {}.Marker.FileId && Entry.BlockOffset == SetExecutableFileId {}.Marker.BlockOffset) {\n      CodeMapFileId ExecutableFileId;\n      File.read(reinterpret_cast<char*>(&ExecutableFileId), sizeof(ExecutableFileId));\n      if (!File) {\n        break;\n      }\n      Ret[ExecutableFileId].IsExecutable = true;\n    } else {\n      if (!Ret.contains(Entry.FileId)) {\n        LogMan::Msg::EFmt(\"Code map referenced unknown file id {:016x}\", Entry.FileId);\n      } else {\n        Ret[Entry.FileId].Blocks.insert(Entry.BlockOffset);\n      }\n    }\n\n    if (!File) {\n      break;\n    }\n  }\n  return Ret;\n}\n\nCodeMapWriter::CodeMapWriter(CodeMapOpener& Opener, bool OpenEagerly)\n  : Buffer(4096)\n  , FileOpener(Opener) {\n  if (OpenEagerly) {\n    CodeMapFD = FileOpener.OpenCodeMapFile();\n  }\n}\n\nCodeMapWriter::~CodeMapWriter() {\n  if (CodeMapFD.value_or(-1) != -1) {\n    Flush(BufferOffset);\n    close(*CodeMapFD);\n  }\n}\n\nbool CodeMapWriter::IsWriteEnabled(const ExecutableFileSectionInfo& Section) {\n  if (CodeMapFD == -1) {\n    return false;\n  }\n\n  // PV libraries can't yet be read by FEXServer, so skip dumping them\n  if (Section.FileInfo.Filename.starts_with(\"/run/pressure-vessel\")) {\n    return false;\n  }\n\n  if (CodeMapFD) {\n    return true;\n  }\n\n  // Acquire mutex and re-check CodeMapFD to avoid race conditions\n  auto lk = std::unique_lock {Mutex};\n  if (!CodeMapFD) {\n    CodeMapFD = FileOpener.OpenCodeMapFile();\n  }\n\n  return CodeMapFD != -1;\n}\n\nvoid CodeMapWriter::Flush(size_t Offset) {\n  // Acquire exclusive lock and flush circular buffer\n  std::unique_lock Lock {Mutex};\n  Flush(Offset, Lock);\n}\n\nvoid CodeMapWriter::Flush(size_t Offset, std::unique_lock<std::shared_mutex>&) {\n  write(*CodeMapFD, Buffer.data(), Offset);\n  BufferOffset = 0;\n}\n\nvoid CodeMapWriter::AppendBlock(const FEXCore::ExecutableFileSectionInfo& SectionInfo, uint64_t BlockEntry) {\n  if (!IsWriteEnabled(SectionInfo)) {\n    return;\n  }\n\n  BlockEntry -= SectionInfo.FileStartVA;\n  if (BlockEntry > std::numeric_limits<uint32_t>::max()) {\n    ERROR_AND_DIE_FMT(\"Cannot write code map\");\n  }\n\n  // Register new library if not already known\n  bool NewLibraryLoad = false;\n  {\n    // Check prior registration with shared lock\n    std::shared_lock Lock {Mutex};\n    NewLibraryLoad = !KnownFileIds.contains(SectionInfo.FileInfo.FileId);\n  }\n  if (NewLibraryLoad) {\n    // Register to map with exclusive lock\n    std::unique_lock Lock {Mutex};\n    NewLibraryLoad &= KnownFileIds.insert(SectionInfo.FileInfo.FileId).second;\n  }\n  if (NewLibraryLoad) {\n    // Add entry to code map\n    AppendLibraryLoad(SectionInfo.FileInfo);\n  }\n\n  // Register the actual code block\n  CodeMap::Entry DataEntry {SectionInfo.FileInfo.FileId, static_cast<uint32_t>(BlockEntry)};\n  AppendData(std::as_bytes(std::span {&DataEntry, 1}));\n}\n\nvoid CodeMapWriter::AppendLibraryLoad(const FEXCore::ExecutableFileInfo& FileInfo) {\n  // See CodeMap::ExternalLibraryInfo\n  auto ExternalFileId = FileInfo.FileId;\n  auto TotalSize = AlignUp(sizeof(CodeMap::LoadExternalLibrary) + sizeof(ExternalFileId) + FileInfo.Filename.size() + 1, 4);\n  const auto Data = reinterpret_cast<char*>(alloca(TotalSize));\n  auto WritePtr = std::copy_n(reinterpret_cast<const char*>(&CodeMap::LoadExternalLibrary), sizeof(CodeMap::LoadExternalLibrary), Data);\n  WritePtr = std::copy_n(reinterpret_cast<const char*>(&ExternalFileId), sizeof(ExternalFileId), WritePtr);\n  WritePtr = std::copy(FileInfo.Filename.begin(), FileInfo.Filename.end(), WritePtr);\n  std::fill(WritePtr, Data + TotalSize, 0);\n  AppendData(std::as_bytes(std::span {Data, TotalSize}));\n}\n\nvoid CodeMapWriter::AppendSetMainExecutable(const FEXCore::ExecutableFileInfo& FileInfo) {\n  CodeMap::SetExecutableFileId Data {.ExecutableFileId = FileInfo.FileId};\n  AppendData(std::span {reinterpret_cast<const std::byte*>(&Data), sizeof(Data)});\n}\n\nvoid CodeMapWriter::AppendData(std::span<const std::byte> Data) {\n  std::shared_lock Lock {Mutex};\n  auto Offset = BufferOffset.fetch_add(Data.size_bytes());\n  if (Offset + Data.size_bytes() > Buffer.size()) {\n    // Acquire exclusive lock and flush the buffer.\n    // Under heavy pressure, multiple threads may observe an exhausted buffer simultaneously.\n    // The thread with the last in-bounds Offset is responsible for flushing the buffer.\n    Lock.unlock();\n    bool IsResponsibleForFlush = false;\n    {\n      std::unique_lock ExclusiveLock {Mutex};\n      IsResponsibleForFlush = (Offset <= Buffer.size());\n      if (IsResponsibleForFlush) {\n        Flush(Offset, ExclusiveLock);\n      }\n    }\n    if (!IsResponsibleForFlush) {\n      // Wait for the buffer to be flushed on the responsible thread\n      Utils::SpinWaitLock::WaitPred<std::less_equal<>, size_t>(reinterpret_cast<size_t*>(&BufferOffset), Buffer.size());\n    }\n    AppendData(Data);\n    return;\n  }\n\n  memcpy(&Buffer.at(Offset), Data.data(), Data.size_bytes());\n}\n\n} // namespace FEXCore\n\nnamespace FEXCore::Context {\n\nCodeCache::CodeCache(ContextImpl& CTX_)\n  : CTX(CTX_) {}\nCodeCache::~CodeCache() = default;\n\nuint64_t CodeCache::ComputeCodeMapId(std::string_view Filename, int FD) {\n  if (Filename.empty()) {\n    return 0xffff'ffff'ffff'ffff;\n  }\n\n  // For now, we just use the file path as an identifier.\n  // TODO: Ensure the hash is unique enough to distinguish executables while remaining independent of the installation location\n  return XXH3_64bits(Filename.data(), Filename.size());\n}\n\nstruct CodeCacheHeader {\n  std::array<char, 4> Magic = ExpectedMagic;\n  uint32_t FormatVersion = 1;\n  uint8_t FEXVersion[20] = {};\n  uint32_t NumBlocks;\n  uint32_t NumCodePages;\n  uint32_t CodeBufferSize;\n  uint32_t NumRelocations;\n  uint32_t padding;\n  uint64_t SerializedBaseAddress;\n  // TODO: Consider including information from LookupCache.BlockLinks\n\n  static constexpr std::array<char, 4> ExpectedMagic = {'F', 'X', 'C', 'C'};\n};\n\ntemplate<typename T>\nconcept OrderedContainer = requires { typename T::key_compare; };\n\nbool CodeCache::SaveData(Core::InternalThreadState& Thread, int fd, const ExecutableFileSectionInfo& SourceBinary, uint64_t SerializedBaseAddress) {\n  auto CodeBuffer = CTX.GetLatest();\n  auto& LookupCache = *Thread.LookupCache->Shared;\n  auto Relocations = Thread.CPUBackend->TakeRelocations(SourceBinary.FileStartVA);\n\n  // Write file header\n  CodeCacheHeader header {};\n  static_assert(GIT_HASH.size() == sizeof(header.FEXVersion));\n  std::ranges::copy(GIT_HASH, header.FEXVersion);\n  header.NumBlocks = LookupCache.BlockList.size();\n  header.NumCodePages = LookupCache.CodePages.size();\n  header.CodeBufferSize = CTX.LatestOffset;\n  header.NumRelocations = Relocations.size();\n  header.SerializedBaseAddress = SerializedBaseAddress;\n  ::write(fd, &header, sizeof(header));\n\n  // Dump guest<->host block mappings\n  {\n    // Cache contents must be deterministic, so copy the unordered block list and then sort by key\n    static_assert(!OrderedContainer<decltype(LookupCache.BlockList)>, \"Already deterministic; drop temporary container\");\n    fextl::vector<std::pair<uint64_t, const GuestToHostMap::BlockEntry*>> BlockList;\n    BlockList.reserve(LookupCache.BlockList.size());\n    for (auto& [Guest, BlockEntry] : LookupCache.BlockList) {\n      static_assert(sizeof(Guest) == 8, \"Breaking change in code cache data layout\");\n      BlockList.emplace_back(Guest, &BlockEntry);\n    }\n    std::ranges::sort(BlockList);\n\n    for (auto [Guest, Host] : BlockList) {\n      static_assert(sizeof(Host->HostCode) == 8, \"Breaking change in code cache data layout\");\n      static_assert(sizeof(Host->CodePages[0]) == 8, \"Breaking change in code cache data layout\");\n\n      Guest -= SourceBinary.FileStartVA;\n      ::write(fd, &Guest, sizeof(Guest));\n      uint64_t HostCode = Host->HostCode - reinterpret_cast<uintptr_t>(CodeBuffer->Ptr);\n      ::write(fd, &HostCode, sizeof(HostCode));\n      uint64_t NumCodePages = Host->CodePages.size();\n      ::write(fd, &NumCodePages, sizeof(NumCodePages));\n      LOGMAN_THROW_A_FMT(std::ranges::is_sorted(Host->CodePages), \"Code pages aren't sorted\");\n      for (auto CodePage : Host->CodePages) {\n        CodePage -= SourceBinary.FileStartVA;\n        ::write(fd, &CodePage, sizeof(CodePage));\n      }\n    }\n  }\n\n  // Dump relocations\n  static_assert(sizeof(Relocations[0]) == 48, \"Breaking change in code cache data layout\");\n  ::write(fd, Relocations.data(), Relocations.size() * sizeof(Relocations[0]));\n\n  // Pad to next page in file so that the CodeBuffer can be mmap'ed into process on load\n  char Zero[64] {};\n  auto Off = lseek(fd, 0, SEEK_CUR);\n  while (Off != AlignUp(Off, Utils::FEX_PAGE_SIZE)) {\n    auto BytesToWrite = std::min(AlignUp(Off, Utils::FEX_PAGE_SIZE) - Off, sizeof(Zero));\n    ::write(fd, Zero, BytesToWrite);\n    Off += BytesToWrite;\n  }\n\n  // Dump the host code (relocated for position-independent serialization)\n  std::span CodeBufferData(reinterpret_cast<std::byte*>(CodeBuffer->Ptr), reinterpret_cast<std::byte*>(CodeBuffer->Ptr) + CTX.LatestOffset);\n  if (!ApplyCodeRelocations(SerializedBaseAddress, CodeBufferData, Relocations, true)) {\n    LOGMAN_THROW_A_FMT(false, \"Failed to apply code relocations\");\n    return false;\n  }\n  ::write(fd, CodeBufferData.data(), CodeBufferData.size());\n\n  // Dump code pages\n  static_assert(OrderedContainer<decltype(LookupCache.CodePages)>, \"Non-deterministic data source\");\n  for (const auto& [PageIndex, Entrypoints] : LookupCache.CodePages) {\n    uint64_t PageAddr = (PageIndex << 12) - SourceBinary.FileStartVA;\n    ::write(fd, &PageAddr, sizeof(PageAddr));\n    uint64_t NumEntrypoints = Entrypoints.size();\n    ::write(fd, &NumEntrypoints, sizeof(NumEntrypoints));\n    for (uint64_t Entrypoint : Entrypoints) {\n      Entrypoint -= SourceBinary.FileStartVA;\n      ::write(fd, &Entrypoint, sizeof(Entrypoint));\n    }\n  }\n\n  return true;\n}\n\nbool CodeCache::LoadData(Core::InternalThreadState* Thread, std::byte* MappedCacheFile, const ExecutableFileSectionInfo& BinarySection) {\n  if (!EnableCodeCaching) {\n    return true;\n  }\n\n  namespace ranges = std::ranges;\n\n  // Read file header\n  CodeCacheHeader header {};\n  ::memcpy(&header, MappedCacheFile, sizeof(header));\n  MappedCacheFile += sizeof(header);\n\n  LogMan::Msg::IFmt(\"Cache load: {:5} blocks; base={:#14x}; off={:#9x}-{:#09x}; {:016x} {}\", header.NumBlocks, BinarySection.FileStartVA,\n                    BinarySection.BeginVA - BinarySection.FileStartVA, BinarySection.EndVA - BinarySection.FileStartVA,\n                    BinarySection.FileInfo.FileId, BinarySection.FileInfo.Filename);\n\n  if (!ranges::equal(header.Magic, header.ExpectedMagic)) {\n    LogMan::Msg::EFmt(\"Invalid cache file header\");\n    return false;\n  }\n\n  if (!ranges::equal(header.FEXVersion, GIT_HASH)) {\n    LogMan::Msg::IFmt(\"Cache generated from old FEX version {:02x}, current is {:02x}; skipping\", fmt::join(header.FEXVersion, \"\"),\n                      fmt::join(GIT_HASH, \"\"));\n    return false;\n  }\n\n  if (header.NumBlocks == 0) {\n    // Valid caches are never empty\n    LogMan::Msg::IFmt(\"Code cache empty, aborting\");\n    return false;\n  }\n\n  // Read guest<->host block mappings\n  using BlockListEntry = decltype(GuestToHostMap::BlockList)::value_type;\n  fextl::vector<BlockListEntry> BlockList(header.NumBlocks);\n  {\n    for (auto& BlockPtr : BlockList) {\n      ::memcpy(&BlockPtr.first, MappedCacheFile, sizeof(BlockPtr.first));\n      MappedCacheFile += sizeof(BlockPtr.first);\n      ::memcpy(&BlockPtr.second.HostCode, MappedCacheFile, sizeof(BlockPtr.second.HostCode));\n      MappedCacheFile += sizeof(BlockPtr.second.HostCode);\n      uint64_t NumGuestPages;\n      ::memcpy(&NumGuestPages, MappedCacheFile, sizeof(NumGuestPages));\n      MappedCacheFile += sizeof(NumGuestPages);\n\n      BlockPtr.second.CodePages.resize(NumGuestPages);\n      ::memcpy(BlockPtr.second.CodePages.data(), MappedCacheFile, std::span {BlockPtr.second.CodePages}.size_bytes());\n      MappedCacheFile += std::span {BlockPtr.second.CodePages}.size_bytes();\n    }\n\n    // Consistency check: VMA regions at the top and end should belong to the same file\n    auto [min_val, max_val] = ranges::minmax_element(BlockList, std::less {}, &decltype(BlockList)::value_type::first);\n    auto MinBound = CTX.SyscallHandler->LookupExecutableFileSection(Thread, min_val->first + BinarySection.FileStartVA);\n    auto MaxBound = CTX.SyscallHandler->LookupExecutableFileSection(Thread, max_val->first + BinarySection.FileStartVA);\n    if (&MinBound->FileInfo != &BinarySection.FileInfo || &MaxBound->FileInfo != &BinarySection.FileInfo) {\n      ERROR_AND_DIE_FMT(\"Cached blocks offsets {:#x}-{:#x} out of bounds for guest library {} ({:016x} @ {:#x}) while trying to load \"\n                        \"section {:#x}-{:#x}!\",\n                        min_val->first, max_val->first, BinarySection.FileInfo.Filename, BinarySection.FileInfo.FileId,\n                        BinarySection.FileStartVA, BinarySection.BeginVA, BinarySection.EndVA);\n    }\n\n    // Constrain BlockList to the given ExecutableFileSectionInfo\n    LOGMAN_THROW_A_FMT(ranges::is_sorted(BlockList, [](auto& a, auto& b) { return a.first < b.first; }), \"Expected sorted block list\");\n    auto begin = ranges::lower_bound(BlockList, BinarySection.BeginVA - BinarySection.FileStartVA, std::less {}, &BlockListEntry::first);\n    auto end =\n      ranges::upper_bound(begin, BlockList.end(), BinarySection.EndVA - BinarySection.FileStartVA - 1, std::less {}, &BlockListEntry::first);\n    BlockList.erase(end, BlockList.end());\n    BlockList.erase(BlockList.begin(), begin);\n    if (BlockList.empty()) {\n      // Not an error since there is just no data to load\n      LogMan::Msg::IFmt(\"No blocks cached in this range, aborting\");\n      return true;\n    }\n  }\n\n  // Read relocations\n  fextl::vector<FEXCore::CPU::Relocation> Relocations(header.NumRelocations, FEXCore::CPU::Relocation::Default());\n  ::memcpy(Relocations.data(), MappedCacheFile, Relocations.size() * sizeof(Relocations[0]));\n  MappedCacheFile += Relocations.size() * sizeof(Relocations[0]);\n\n  // Pad to next page in file, which contains CodeBuffer data\n  MappedCacheFile = reinterpret_cast<std::byte*>(AlignUp(reinterpret_cast<uintptr_t>(MappedCacheFile), Utils::FEX_PAGE_SIZE));\n\n  // Prepare CodeBuffer: Page aligned and big enough to hold all cached data\n  auto Lock = std::unique_lock {CTX.CodeBufferWriteMutex};\n  if (Thread) {\n    if (auto Prev = Thread->CPUBackend->CheckCodeBufferUpdate()) {\n      Allocator::VirtualDontNeed(Thread->CallRetStackBase, FEXCore::Core::InternalThreadState::CALLRET_STACK_SIZE);\n      auto lk = Thread->LookupCache->AcquireWriteLock();\n      Thread->LookupCache->ChangeGuestToHostMapping(*Prev, *CTX.GetLatest()->LookupCache, lk);\n    }\n  }\n\n  auto CodeBuffer = CTX.GetLatest();\n  LOGMAN_THROW_A_FMT(reinterpret_cast<uintptr_t>(CodeBuffer->Ptr) % 0x1000 == 0, \"Expected CodeBuffer base to be page-aligned\");\n  const auto Delta = AlignUp(CTX.LatestOffset, 0x1000) - CTX.LatestOffset;\n  CTX.LatestOffset += Delta;\n\n  while (CTX.LatestOffset + header.CodeBufferSize > CodeBuffer->UsableSize()) {\n    if (Thread) {\n      CTX.ClearCodeCache(Thread);\n      CodeBuffer = CTX.GetLatest();\n      LogMan::Msg::IFmt(\"Increased code buffer size to {} MiB for cache load\", CodeBuffer->AllocatedSize / 1024 / 1024);\n    } else {\n      ERROR_AND_DIE_FMT(\"Cannot extend codebuffer without thread!\");\n    }\n  }\n\n  // Read CodeBuffer data from file. Make sure the destination is page-aligned.\n  // TODO: Only load the data needed for the selected section\n  auto CodeBufferRange =\n    std::as_writable_bytes(std::span {CodeBuffer->Ptr, CodeBuffer->UsableSize()}).subspan(CTX.LatestOffset, header.CodeBufferSize);\n  ::memcpy(CodeBufferRange.data(), MappedCacheFile, header.CodeBufferSize);\n  MappedCacheFile += header.CodeBufferSize;\n  CTX.LatestOffset += header.CodeBufferSize;\n\n  // Apply FEX relocations\n  auto Ret = ApplyCodeRelocations(BinarySection.FileStartVA, CodeBufferRange, Relocations, false);\n  LOGMAN_THROW_A_FMT(Ret == true, \"Failed to apply code cache relocations\");\n\n  {\n    auto& LookupCache = *CodeBuffer->LookupCache;\n    auto WriteLock = LookupCache.AcquireWriteLock();\n\n    // Register blocks to LookupCache\n    for (auto& [Guest, Host] : BlockList) {\n      for (auto& CodePage : Host.CodePages) {\n        CodePage += BinarySection.FileStartVA;\n      }\n      auto HostCode = reinterpret_cast<void*>(Host.HostCode + reinterpret_cast<uintptr_t>(CodeBufferRange.data()));\n      LookupCache.AddBlockMapping(Guest + BinarySection.FileStartVA, std::move(Host.CodePages), HostCode, WriteLock);\n    }\n\n    // Register loaded code ranges\n    fextl::vector<uint64_t> Entrypoints;\n    for (uint32_t i = 0; i < header.NumCodePages; ++i) {\n      uint64_t CodePage;\n      memcpy(&CodePage, MappedCacheFile, sizeof(CodePage));\n      CodePage += BinarySection.FileStartVA;\n      MappedCacheFile += sizeof(CodePage);\n\n      uint64_t NumEntrypoints;\n      memcpy(&NumEntrypoints, MappedCacheFile, sizeof(NumEntrypoints));\n      MappedCacheFile += sizeof(NumEntrypoints);\n\n      Entrypoints.resize(NumEntrypoints);\n      memcpy(Entrypoints.data(), MappedCacheFile, NumEntrypoints * sizeof(Entrypoints[0]));\n      MappedCacheFile += NumEntrypoints * sizeof(Entrypoints[0]);\n      for (auto& Entrypoint : Entrypoints) {\n        Entrypoint += BinarySection.FileStartVA;\n      }\n\n      if (LookupCache.AddBlockExecutableRange(Entrypoints, CodePage, FEXCore::Utils::FEX_PAGE_SIZE, WriteLock)) {\n        CTX.SyscallHandler->MarkGuestExecutableRange(Thread, CodePage, FEXCore::Utils::FEX_PAGE_SIZE);\n      }\n    }\n  }\n\n  if (EnableCodeCacheValidation) {\n    fextl::set<uint64_t> GuestBlocks, HostBlocks;\n    for (auto& [Guest, Host] : BlockList) {\n      GuestBlocks.insert(Guest + BinarySection.FileStartVA);\n      HostBlocks.insert(Host.HostCode);\n    }\n\n    Validate(BinarySection, std::move(GuestBlocks), HostBlocks, CodeBufferRange);\n  }\n\n  return true;\n}\n\nvoid CodeCache::Validate(const ExecutableFileSectionInfo& Section, fextl::set<uint64_t> GuestBlocks, const fextl::set<uint64_t>& HostBlocks,\n                         std::span<std::byte> CachedCode) {\n  LOGMAN_THROW_A_FMT(!HostBlocks.empty(), \"Tried to validate without any host blocks\");\n  // Skip any cached data before the first host block\n  CachedCode = CachedCode.subspan(*HostBlocks.begin() - sizeof(CPU::CPUBackend::JITCodeHeader));\n\n  if (!ValidationCTX) {\n    ValidationCTX.reset(static_cast<ContextImpl*>(FEXCore::Context::Context::CreateNewContext(CTX.HostFeatures).release()));\n    ValidationCTX->SetSignalDelegator(CTX.SignalDelegation);\n    ValidationCTX->SetSyscallHandler(CTX.SyscallHandler);\n    ValidationCTX->SetThunkHandler(CTX.ThunkHandler);\n    if (!ValidationCTX->InitCore()) {\n      ERROR_AND_DIE_FMT(\"Failed to create cache load validation context\");\n    }\n\n    ValidationThread.reset(ValidationCTX->CreateThread(0, 0, nullptr));\n\n    auto Frame = ValidationThread->CurrentFrame;\n    Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_GDT] = &ValidationGDT[0];\n    Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_LDT] = &ValidationGDT[0];\n    Frame->State.cs_idx = 0;\n    Frame->State.cs_cached = 0;\n\n    if (ValidationCTX->Config.Is64BitMode()) {\n      ValidationGDT[0].L = 1; // L = Long Mode = 64-bit\n      ValidationGDT[0].D = 0; // D = Default Operand Size = Reserved\n    } else {\n      ValidationGDT[0].L = 0; // L = Long Mode = 32-bit\n      ValidationGDT[0].D = 1; // D = Default Operand Size = 32-bit\n    }\n  }\n\n  auto NewCodeBuffer = ValidationCTX->GetLatest();\n  while (CachedCode.size_bytes() > NewCodeBuffer->UsableSize()) {\n    ValidationCTX->ClearCodeCache(ValidationThread.get());\n    NewCodeBuffer = ValidationCTX->GetLatest();\n    LogMan::Msg::IFmt(\"Increased cache validation code buffer size to {} MiB\", NewCodeBuffer->AllocatedSize / 1024 / 1024);\n  }\n\n  std::span<std::byte> CodeBufferRangeRef =\n    std::as_writable_bytes(std::span {NewCodeBuffer->Ptr, NewCodeBuffer->Ptr + NewCodeBuffer->UsableSize()}).subspan(0, CachedCode.size_bytes());\n\n  while (!GuestBlocks.empty()) {\n    auto [CompiledBlocks, _, _2, _3, _4] = ValidationCTX->CompileCode(ValidationThread.get(), *GuestBlocks.begin(), 0 /* TODO: Set MaxInst? */);\n    for (auto& Entry : CompiledBlocks.EntryPoints) {\n      GuestBlocks.erase(Entry.first);\n    }\n  }\n\n  // Patch FEX-internal function addresses with values from the main Context to ensure the code blocks are comparable\n  auto NewRelocations = ValidationThread->CPUBackend->TakeRelocations(Section.FileStartVA);\n  NewRelocations.erase(std::remove_if(NewRelocations.begin(), NewRelocations.end(), [](const CPU::Relocation& Reloc) {\n    return Reloc.Header.Type != CPU::RelocationTypes::RELOC_NAMED_SYMBOL_LITERAL && Reloc.Header.Type != CPU::RelocationTypes::RELOC_NAMED_THUNK_MOVE;\n  }));\n  (void)ApplyCodeRelocations(Section.FileStartVA, CodeBufferRangeRef, NewRelocations, false);\n\n  if (ValidationCTX->LatestOffset <= CodeBufferRangeRef.size()) {\n    // Reference compilation produced fewer bytes than our cache, so validation is going to fail.\n    // Make sure we don't output any garbage bytes though.\n    CodeBufferRangeRef = CodeBufferRangeRef.subspan(0, ValidationCTX->LatestOffset);\n  }\n\n  auto [Mismatch, _] = std::mismatch(CodeBufferRangeRef.begin(), CodeBufferRangeRef.end(), CachedCode.begin());\n  if (Mismatch != CodeBufferRangeRef.end()) {\n    // Align down to instruction size\n    auto Idx = AlignDown(std::distance(CodeBufferRangeRef.begin(), Mismatch), 4);\n\n    auto BlockIt = std::prev(HostBlocks.lower_bound(*HostBlocks.begin() + Idx + 1));\n    std::optional<uint64_t> GuestBlockAddr;\n    std::optional<uint64_t> GuestBlockAddrRef;\n    if (BlockIt != HostBlocks.end()) {\n      for (int i : {0, 1}) {\n        std::span Buffer = (i == 0 ? CachedCode : CodeBufferRangeRef);\n\n        // Second instruction is always a constant load for relative offset to the (multi)block start\n        int32_t addr = (*reinterpret_cast<uint32_t*>(&Buffer[*BlockIt - *HostBlocks.begin() + 4]) & 0x3ff'ffe0) << 11;\n        addr >>= 14;\n        auto header = reinterpret_cast<CPU::CPUBackend::JITCodeHeader*>(&Buffer[*BlockIt - *HostBlocks.begin() + 4 + addr]);\n        auto tail = reinterpret_cast<CPU::CPUBackend::JITCodeTail*>(reinterpret_cast<uintptr_t>(header) + header->OffsetToBlockTail);\n        (i == 0 ? GuestBlockAddr : GuestBlockAddrRef) = tail->RIP - Section.FileStartVA;\n        LogMan::Msg::EFmt(\"Recorded rip {}: {:#x} (offset {:#x})\", i, tail->RIP, tail->RIP - Section.FileStartVA);\n\n        if (i == 1) {\n          if (tail->RIP >= Section.BeginVA && tail->RIP < Section.EndVA) {\n            auto [IRView, TotalInstructions, TotalInstructionsLength, StartAddr, Length, _] =\n              ValidationCTX->GenerateIR(ValidationThread.get(), tail->RIP, false, FEXCore::Config::Get_MAXINST());\n            fextl::stringstream ss;\n            FEXCore::IR::Dump(&ss, &*IRView);\n            LogMan::Msg::EFmt(\"IR:\\n{}\", ss.str());\n          } else {\n            LogMan::Msg::EFmt(\"Can't dump IR for out-of-range RIP {:#x}\", tail->RIP);\n          }\n        }\n      }\n    }\n\n    fextl::string GuestBlockInfo = \"UNKNOWN\";\n    if (GuestBlockAddr) {\n      GuestBlockInfo = fextl::fmt::format(\"{:#x}\", GuestBlockAddr.value());\n    }\n    if (GuestBlockAddr != GuestBlockAddrRef) {\n      GuestBlockInfo += \" (MISMATCH)\";\n    }\n    ERROR_AND_DIE_FMT(\"Cache validation failed at offset {:#x}: {:02x} <-> {:02x} (at {} <-> {}, guest block {})\", Idx,\n                      fmt::join(CachedCode.subspan(Idx, 4), \"\"), fmt::join(CodeBufferRangeRef.subspan(Idx, 4), \"\"),\n                      fmt::ptr(CachedCode.data()), fmt::ptr(CodeBufferRangeRef.data()), GuestBlockInfo);\n  }\n\n  // Reset Context state for next validation\n  ValidationThread->LookupCache->ClearCache(ValidationThread->LookupCache->AcquireWriteLock());\n  ValidationCTX->LatestOffset = 0;\n\n  LogMan::Msg::IFmt(\"\\tSuccessfully validated cache\");\n}\n\nbool CodeCache::ApplyCodeRelocations(uint64_t GuestEntry, std::span<std::byte> Code,\n                                     std::span<const FEXCore::CPU::Relocation> EntryRelocations, bool ForStorage) {\n  CPU::Arm64Emitter Emitter(&CTX, Code.data(), Code.size_bytes());\n  for (size_t j = 0; j < EntryRelocations.size(); ++j) {\n    const FEXCore::CPU::Relocation& Reloc = EntryRelocations[j];\n    Emitter.SetCursorOffset(Reloc.Header.Offset);\n\n    switch (Reloc.Header.Type) {\n    case FEXCore::CPU::RelocationTypes::RELOC_NAMED_SYMBOL_LITERAL: {\n      // Generate a literal so we can place it\n      uint64_t Pointer = ForStorage ? 0 : GetNamedSymbolLiteral(CTX, Reloc.NamedSymbolLiteral.Symbol);\n      Emitter.dc64(Pointer);\n      break;\n    }\n    case FEXCore::CPU::RelocationTypes::RELOC_NAMED_THUNK_MOVE: {\n      uint64_t Pointer = ForStorage ? 0 : reinterpret_cast<uint64_t>(CTX.ThunkHandler->LookupThunk(Reloc.NamedThunkMove.Symbol));\n      if (Pointer == ~0ULL) {\n        return false;\n      }\n      // TODO: Pointers are required to fit within 48-bit VA space.\n      // But forcing 6-byte broke relocations.\n      Emitter.LoadConstant(ARMEmitter::Size::i64Bit, ARMEmitter::Register(Reloc.NamedThunkMove.RegisterIndex), Pointer,\n                           CPU::Arm64Emitter::PadType::DOPAD);\n      break;\n    }\n    case FEXCore::CPU::RelocationTypes::RELOC_GUEST_RIP_LITERAL: {\n      Emitter.dc64(GuestEntry + Reloc.GuestRIP.GuestRIP);\n      break;\n    }\n    case FEXCore::CPU::RelocationTypes::RELOC_GUEST_RIP_MOVE: {\n      uint64_t Pointer = Reloc.GuestRIP.GuestRIP + GuestEntry;\n      // TODO: Pointers are required to fit within 48-bit VA space.\n      // But forcing 6-byte broke relocations.\n      Emitter.LoadConstant(ARMEmitter::Size::i64Bit, ARMEmitter::Register(Reloc.GuestRIP.RegisterIndex), Pointer, CPU::Arm64Emitter::PadType::DOPAD);\n      break;\n    }\n\n    default: ERROR_AND_DIE_FMT(\"Unknown relocation type {}\", ToUnderlying(Reloc.Header.Type));\n    }\n  }\n\n  return true;\n}\n\n} // namespace FEXCore::Context\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/Core.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ncategory: glue ~ Logic that binds various parts together\nmeta: glue|driver ~ Emulation mainloop related glue logic\ntags: glue|driver\ndesc: Glues Frontend, OpDispatcher and IR Opts & Compilation, LookupCache, Dispatcher and provides the Execution loop entrypoint\n$end_info$\n*/\n\n#include <cstdint>\n#ifdef ZYDIS_DISASSEMBLER\n#include <Zydis/Zydis.h>\n#endif\n#include \"Interface/Core/ArchHelpers/Arm64Emitter.h\"\n#include \"Interface/Core/LookupCache.h\"\n#include \"Interface/Core/CPUBackend.h\"\n#include \"Interface/Core/CPUID.h\"\n#include \"Interface/Core/Frontend.h\"\n#include \"Interface/Core/OpcodeDispatcher.h\"\n#include \"Interface/Core/JIT/JITClass.h\"\n#include \"Interface/Core/Dispatcher/Dispatcher.h\"\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include <Interface/GDBJIT/GDBJIT.h>\n#include \"Interface/IR/IR.h\"\n#include \"Interface/IR/IREmitter.h\"\n#include \"Interface/IR/Passes/RegisterAllocationPass.h\"\n#include \"Interface/IR/Passes.h\"\n#include \"Interface/IR/PassManager.h\"\n#include \"Interface/IR/RegisterAllocationData.h\"\n#include \"Utils/Allocator.h\"\n#include \"Utils/Allocator/HostAllocator.h\"\n#include \"Utils/SpinWaitLock.h\"\n#include \"Utils/variable_length_integer.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/SignalDelegator.h>\n#include <FEXCore/Core/Thunks.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n#include <FEXCore/HLE/SourcecodeResolver.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/Event.h>\n#include <FEXCore/Utils/File.h>\n#include <FEXCore/Utils/LogManager.h>\n#include \"FEXCore/Utils/SignalScopeGuards.h\"\n#include <FEXCore/Utils/Threads.h>\n#include <FEXCore/Utils/Profiler.h>\n#include <FEXCore/Utils/SHMStats.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/set.h>\n#include <FEXCore/fextl/sstream.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <algorithm>\n#include <array>\n#include <atomic>\n#include <chrono>\n#include <condition_variable>\n#include <fcntl.h>\n#include <functional>\n#include <mutex>\n#include <queue>\n#include <shared_mutex>\n#include <signal.h>\n#include <stdio.h>\n#include <string_view>\n#include <sys/stat.h>\n#include <type_traits>\n#include <unistd.h>\n#include <unordered_map>\n#include <utility>\n#include <xxhash.h>\n\nnamespace FEXCore::Context {\nContextImpl::ContextImpl(const FEXCore::HostFeatures& Features)\n  : HostFeatures {Features}\n  , CPUID {this}\n  , CodeCache {*this} {\n  if (!Config.Is64BitMode()) {\n    // When operating in 32-bit mode, the virtual memory we care about is only the lower 32-bits.\n    Config.VirtualMemSize = 1ULL << 32;\n  }\n\n  if (Config.BlockJITNaming() || Config.GlobalJITNaming() || Config.LibraryJITNaming()) {\n    // Only initialize symbols file if enabled. Ensures we don't pollute /tmp with empty files.\n    Symbols.InitFile();\n  }\n\n  uint64_t FrequencyCounter = FEXCore::GetCycleCounterFrequency();\n  if (FrequencyCounter && FrequencyCounter < FEXCore::Context::TSC_SCALE_MAXIMUM && Config.SmallTSCScale()) {\n    // Scale TSC until it is at the minimum required.\n    while (FrequencyCounter < FEXCore::Context::TSC_SCALE_MAXIMUM) {\n      FrequencyCounter <<= 1;\n      ++Config.TSCScale;\n    }\n  }\n\n  // Track atomic TSO emulation configuration.\n  UpdateAtomicTSOEmulationConfig();\n}\n\nstruct GetFrameBlockInfoResult {\n  const CPU::CPUBackend::JITCodeHeader* InlineHeader;\n  const CPU::CPUBackend::JITCodeTail* InlineTail;\n};\nstatic GetFrameBlockInfoResult GetFrameBlockInfo(FEXCore::Core::CpuStateFrame* Frame) {\n  const uint64_t BlockBegin = Frame->State.InlineJITBlockHeader;\n  auto InlineHeader = reinterpret_cast<const CPU::CPUBackend::JITCodeHeader*>(BlockBegin);\n\n  if (InlineHeader) {\n    auto InlineTail = reinterpret_cast<const CPU::CPUBackend::JITCodeTail*>(Frame->State.InlineJITBlockHeader + InlineHeader->OffsetToBlockTail);\n    return {InlineHeader, InlineTail};\n  }\n\n  return {InlineHeader, nullptr};\n}\n\nbool ContextImpl::IsAddressInCurrentBlock(FEXCore::Core::InternalThreadState* Thread, uint64_t Address, uint64_t Size) {\n  auto [_, InlineTail] = GetFrameBlockInfo(Thread->CurrentFrame);\n  return InlineTail && (Address + Size > InlineTail->RIP && Address < InlineTail->RIP + InlineTail->GuestSize);\n}\n\nbool ContextImpl::IsCurrentBlockSingleInst(FEXCore::Core::InternalThreadState* Thread) {\n  auto [_, InlineTail] = GetFrameBlockInfo(Thread->CurrentFrame);\n  return InlineTail && InlineTail->SingleInst;\n}\n\nuint64_t ContextImpl::GetGuestBlockEntry(FEXCore::Core::InternalThreadState* Thread) {\n  auto [_, InlineTail] = GetFrameBlockInfo(Thread->CurrentFrame);\n  return InlineTail ? InlineTail->RIP : 0;\n}\n\nuint64_t ContextImpl::RestoreRIPFromHostPC(FEXCore::Core::InternalThreadState* Thread, uint64_t HostPC) {\n  const auto Frame = Thread->CurrentFrame;\n  const uint64_t BlockBegin = Frame->State.InlineJITBlockHeader;\n  auto [InlineHeader, InlineTail] = GetFrameBlockInfo(Thread->CurrentFrame);\n\n  if (InlineHeader) {\n    // Check if the host PC is currently within a code block.\n    // If it is then RIP can be reconstructed from the beginning of the code block.\n    // This is currently as close as FEX can get RIP reconstructions.\n    if (HostPC >= reinterpret_cast<uint64_t>(BlockBegin) && HostPC < reinterpret_cast<uint64_t>(BlockBegin + InlineTail->Size)) {\n\n      auto RIPEntry =\n        reinterpret_cast<const uint8_t*>(Frame->State.InlineJITBlockHeader + InlineHeader->OffsetToBlockTail + InlineTail->OffsetToRIPEntries);\n\n      // Reconstruct RIP from JIT entries for this block.\n      uint64_t StartingHostPC = BlockBegin;\n      uint64_t StartingGuestRIP = InlineTail->RIP;\n\n      for (uint32_t i = 0; i < InlineTail->NumberOfRIPEntries; ++i) {\n        auto Offset = FEXCore::Utils::vl64pair::Decode(RIPEntry);\n        RIPEntry += Offset.Size;\n        if (HostPC >= (StartingHostPC + Offset.IntegerARMPC)) {\n          // We are beyond this entry, keep going forward.\n          StartingHostPC += Offset.IntegerARMPC;\n          StartingGuestRIP += Offset.IntegerX86RIP;\n        } else {\n          // Passed where the Host PC is at. Break now.\n          break;\n        }\n      }\n      return StartingGuestRIP;\n    }\n  }\n\n  // Fallback to what is stored in the RIP currently.\n  return Frame->State.rip;\n}\n\nuint32_t ContextImpl::ReconstructCompactedEFLAGS(FEXCore::Core::InternalThreadState* Thread, bool WasInJIT, const uint64_t* HostGPRs,\n                                                 uint64_t PSTATE) {\n  const auto Frame = Thread->CurrentFrame;\n  uint32_t EFLAGS {};\n\n  // Currently these flags just map 1:1 inside of the resulting value.\n  for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_EFLAG_BITS; ++i) {\n    switch (i) {\n    case X86State::RFLAG_CF_RAW_LOC:\n    case X86State::RFLAG_PF_RAW_LOC:\n    case X86State::RFLAG_AF_RAW_LOC:\n    case X86State::RFLAG_TF_RAW_LOC:\n    case X86State::RFLAG_ZF_RAW_LOC:\n    case X86State::RFLAG_SF_RAW_LOC:\n    case X86State::RFLAG_OF_RAW_LOC:\n    case X86State::RFLAG_DF_RAW_LOC:\n      // Intentionally do nothing.\n      // These contain multiple bits which can corrupt other members when compacted.\n      break;\n    default: EFLAGS |= uint32_t {Frame->State.flags[i]} << i; break;\n    }\n  }\n\n  uint32_t Packed_NZCV {};\n  if (WasInJIT) {\n    // If we were in the JIT then NZCV is in the CPU's PSTATE object.\n    // Packed in to the same bit locations as RFLAG_NZCV_LOC.\n    Packed_NZCV = PSTATE;\n\n    // If we were in the JIT then PF and AF are in registers.\n    // Move them to the CPUState frame now.\n    Frame->State.pf_raw = HostGPRs[CPU::REG_PF.Idx()];\n    Frame->State.af_raw = HostGPRs[CPU::REG_AF.Idx()];\n  } else {\n    // If we were not in the JIT then the NZCV state is stored in the CPUState RFLAG_NZCV_LOC.\n    // SF/ZF/CF/OF are packed in a 32-bit value in RFLAG_NZCV_LOC.\n    memcpy(&Packed_NZCV, &Frame->State.flags[X86State::RFLAG_NZCV_LOC], sizeof(Packed_NZCV));\n  }\n\n  uint32_t OF = (Packed_NZCV >> IR::OpDispatchBuilder::IndexNZCV(X86State::RFLAG_OF_RAW_LOC)) & 1;\n  uint32_t CF = (Packed_NZCV >> IR::OpDispatchBuilder::IndexNZCV(X86State::RFLAG_CF_RAW_LOC)) & 1;\n  uint32_t ZF = (Packed_NZCV >> IR::OpDispatchBuilder::IndexNZCV(X86State::RFLAG_ZF_RAW_LOC)) & 1;\n  uint32_t SF = (Packed_NZCV >> IR::OpDispatchBuilder::IndexNZCV(X86State::RFLAG_SF_RAW_LOC)) & 1;\n\n  // CF is inverted in our representation, undo the invert here.\n  CF ^= 1;\n\n  // Pack in to EFLAGS\n  EFLAGS |= OF << X86State::RFLAG_OF_RAW_LOC;\n  EFLAGS |= CF << X86State::RFLAG_CF_RAW_LOC;\n  EFLAGS |= ZF << X86State::RFLAG_ZF_RAW_LOC;\n  EFLAGS |= SF << X86State::RFLAG_SF_RAW_LOC;\n\n  // PF calculation is deferred, calculate it now.\n  // Popcount the 8-bit flag and then extract the lower bit.\n  uint32_t PFByte = Frame->State.pf_raw & 0xff;\n  uint32_t PF = std::popcount(PFByte ^ 1) & 1;\n  EFLAGS |= PF << X86State::RFLAG_PF_RAW_LOC;\n\n  // AF calculation is deferred, calculate it now.\n  // XOR with PF byte and extract bit 4.\n  uint32_t AF = ((Frame->State.af_raw ^ PFByte) & (1 << 4)) ? 1 : 0;\n  EFLAGS |= AF << X86State::RFLAG_AF_RAW_LOC;\n\n  uint8_t TFByte = Frame->State.flags[X86State::RFLAG_TF_RAW_LOC];\n  EFLAGS |= (TFByte & 1) << X86State::RFLAG_TF_RAW_LOC;\n\n  // DF is pretransformed, undo the transform from 1/-1 back to 0/1\n  uint8_t DFByte = Frame->State.flags[X86State::RFLAG_DF_RAW_LOC];\n  if (DFByte & 0x80) {\n    EFLAGS |= 1 << X86State::RFLAG_DF_RAW_LOC;\n  }\n\n  return EFLAGS;\n}\n\nvoid ContextImpl::ReconstructXMMRegisters(const FEXCore::Core::InternalThreadState* Thread, __uint128_t* XMM_Low, __uint128_t* YMM_High) {\n  const size_t MaximumRegisters = Config.Is64BitMode ? FEXCore::Core::CPUState::NUM_XMMS : 8;\n\n  if (YMM_High != nullptr && HostFeatures.SupportsAVX) {\n    const bool SupportsConvergedRegisters = HostFeatures.SupportsSVE256;\n\n    if (SupportsConvergedRegisters) {\n      ///< Output wants to de-interleave\n      for (size_t i = 0; i < MaximumRegisters; ++i) {\n        memcpy(&XMM_Low[i], &Thread->CurrentFrame->State.xmm.avx.data[i][0], sizeof(__uint128_t));\n        memcpy(&YMM_High[i], &Thread->CurrentFrame->State.xmm.avx.data[i][2], sizeof(__uint128_t));\n      }\n    } else {\n      ///< Matches what FEX wants with non-converged registers\n      for (size_t i = 0; i < MaximumRegisters; ++i) {\n        memcpy(&XMM_Low[i], &Thread->CurrentFrame->State.xmm.sse.data[i][0], sizeof(__uint128_t));\n        memcpy(&YMM_High[i], &Thread->CurrentFrame->State.avx_high[i][0], sizeof(__uint128_t));\n      }\n    }\n  } else {\n    // Only support SSE, no AVX here, even if requested.\n    memcpy(XMM_Low, Thread->CurrentFrame->State.xmm.sse.data, MaximumRegisters * sizeof(__uint128_t));\n  }\n}\n\nvoid ContextImpl::SetXMMRegistersFromState(FEXCore::Core::InternalThreadState* Thread, const __uint128_t* XMM_Low, const __uint128_t* YMM_High) {\n  const size_t MaximumRegisters = Config.Is64BitMode ? FEXCore::Core::CPUState::NUM_XMMS : 8;\n  if (YMM_High != nullptr && HostFeatures.SupportsAVX) {\n    const bool SupportsConvergedRegisters = HostFeatures.SupportsSVE256;\n\n    if (SupportsConvergedRegisters) {\n      ///< Output wants to de-interleave\n      for (size_t i = 0; i < MaximumRegisters; ++i) {\n        memcpy(&Thread->CurrentFrame->State.xmm.avx.data[i][0], &XMM_Low[i], sizeof(__uint128_t));\n        memcpy(&Thread->CurrentFrame->State.xmm.avx.data[i][2], &YMM_High[i], sizeof(__uint128_t));\n      }\n    } else {\n      ///< Matches what FEX wants with non-converged registers\n      for (size_t i = 0; i < MaximumRegisters; ++i) {\n        memcpy(&Thread->CurrentFrame->State.xmm.sse.data[i][0], &XMM_Low[i], sizeof(__uint128_t));\n        memcpy(&Thread->CurrentFrame->State.avx_high[i][0], &YMM_High[i], sizeof(__uint128_t));\n      }\n    }\n  } else {\n    // Only support SSE, no AVX here, even if requested.\n    memcpy(Thread->CurrentFrame->State.xmm.sse.data, XMM_Low, MaximumRegisters * sizeof(__uint128_t));\n  }\n}\n\nvoid ContextImpl::SetFlagsFromCompactedEFLAGS(FEXCore::Core::InternalThreadState* Thread, uint32_t EFLAGS) {\n  const auto Frame = Thread->CurrentFrame;\n  for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_EFLAG_BITS; ++i) {\n    switch (i) {\n    case X86State::RFLAG_OF_RAW_LOC:\n    case X86State::RFLAG_CF_RAW_LOC:\n    case X86State::RFLAG_ZF_RAW_LOC:\n    case X86State::RFLAG_SF_RAW_LOC:\n      // Intentionally do nothing.\n      break;\n    case X86State::RFLAG_AF_RAW_LOC:\n      // AF stored in bit 4 in our internal representation. It is also\n      // XORed with byte 4 of the PF byte, but we write that as zero here so\n      // we don't need any special handling for that.\n      Frame->State.af_raw = (EFLAGS & (1U << i)) ? (1 << 4) : 0;\n      break;\n    case X86State::RFLAG_PF_RAW_LOC:\n      // PF is inverted in our internal representation.\n      Frame->State.pf_raw = (EFLAGS & (1U << i)) ? 0 : 1;\n      break;\n    case X86State::RFLAG_DF_RAW_LOC:\n      // DF is encoded as 1/-1\n      Frame->State.flags[i] = (EFLAGS & (1U << i)) ? 0xff : 1;\n      break;\n    default: Frame->State.flags[i] = (EFLAGS & (1U << i)) ? 1 : 0; break;\n    }\n  }\n\n  // Calculate packed NZCV. Note CF is inverted.\n  uint32_t Packed_NZCV {};\n  Packed_NZCV |= (EFLAGS & (1U << X86State::RFLAG_OF_RAW_LOC)) ? 1U << IR::OpDispatchBuilder::IndexNZCV(X86State::RFLAG_OF_RAW_LOC) : 0;\n  Packed_NZCV |= (EFLAGS & (1U << X86State::RFLAG_CF_RAW_LOC)) ? 0 : 1U << IR::OpDispatchBuilder::IndexNZCV(X86State::RFLAG_CF_RAW_LOC);\n  Packed_NZCV |= (EFLAGS & (1U << X86State::RFLAG_ZF_RAW_LOC)) ? 1U << IR::OpDispatchBuilder::IndexNZCV(X86State::RFLAG_ZF_RAW_LOC) : 0;\n  Packed_NZCV |= (EFLAGS & (1U << X86State::RFLAG_SF_RAW_LOC)) ? 1U << IR::OpDispatchBuilder::IndexNZCV(X86State::RFLAG_SF_RAW_LOC) : 0;\n  memcpy(&Frame->State.flags[X86State::RFLAG_NZCV_LOC], &Packed_NZCV, sizeof(Packed_NZCV));\n\n  // Reserved, Read-As-1, Write-as-1\n  Frame->State.flags[X86State::RFLAG_RESERVED_LOC] = 1;\n  // Interrupt Flag. Can't be written by CPL-3 userland.\n  Frame->State.flags[X86State::RFLAG_IF_LOC] = 1;\n}\n\nbool ContextImpl::InitCore() {\n  // Initialize the CPU core signal handlers & DispatcherConfig\n  Dispatcher = FEXCore::CPU::Dispatcher::Create(this);\n\n  // Set up the SignalDelegator config since core is initialized.\n  SignalDelegation->SetConfig(Dispatcher->MakeSignalDelegatorConfig());\n\n#if defined(_WIN32) && !defined(ARCHITECTURE_arm64ec)\n  // WOW64 always needs the interrupt fault check to be enabled.\n  Config.NeedsPendingInterruptFaultCheck = true;\n#endif\n\n  if (Config.GdbServer) {\n    // If gdbserver is enabled then this needs to be enabled.\n    Config.NeedsPendingInterruptFaultCheck = true;\n  }\n\n  return true;\n}\n\nvoid ContextImpl::HandleCallback(FEXCore::Core::InternalThreadState* Thread, uint64_t RIP) {\n  static_cast<ContextImpl*>(Thread->CTX)->Dispatcher->ExecuteJITCallback(Thread->CurrentFrame, RIP);\n}\n\nvoid ContextImpl::ExecuteThread(FEXCore::Core::InternalThreadState* Thread) {\n  // Update the thread pointer for Thunk return to the latest.\n  Thread->CurrentFrame->Pointers.ThunkCallbackRet = SignalDelegation->GetThunkCallbackRET();\n\n  Dispatcher->ExecuteDispatch(Thread->CurrentFrame);\n\n  // If it is the parent thread that died then just leave\n  // TODO: This doesn't make sense when the parent thread doesn't outlive its children\n}\n\nvoid ContextImpl::InitializeCompiler(FEXCore::Core::InternalThreadState* Thread) {\n  Thread->OpDispatcher = fextl::make_unique<FEXCore::IR::OpDispatchBuilder>(this);\n  Thread->OpDispatcher->SetMultiblock(Config.Multiblock);\n  Thread->LookupCache = fextl::make_unique<FEXCore::LookupCache>(this);\n  Thread->FrontendDecoder = fextl::make_unique<FEXCore::Frontend::Decoder>(Thread);\n  Thread->PassManager = fextl::make_unique<FEXCore::IR::PassManager>();\n\n  Thread->CurrentFrame->State.L1Pointer = Thread->LookupCache->GetL1Pointer();\n  Thread->CurrentFrame->State.L1Mask = Thread->LookupCache->GetScaledL1PointerMask();\n\n  Thread->CurrentFrame->Pointers.L2Pointer = Thread->LookupCache->GetPagePointer();\n\n  Dispatcher->InitThreadPointers(Thread);\n\n  Thread->PassManager->AddDefaultPasses(this);\n  Thread->PassManager->AddDefaultValidationPasses();\n\n  Thread->PassManager->RegisterSyscallHandler(SyscallHandler);\n\n  // Create CPU backend\n  Thread->PassManager->InsertRegisterAllocationPass(this);\n  Thread->CPUBackend = FEXCore::CPU::CreateArm64JITCore(this, Thread);\n\n  Thread->PassManager->Finalize();\n}\n\nFEXCore::Core::InternalThreadState*\nContextImpl::CreateThread(uint64_t InitialRIP, uint64_t StackPointer, const FEXCore::Core::CPUState* NewThreadState) {\n  FEXCore::Core::InternalThreadState* Thread = new FEXCore::Core::InternalThreadState {\n    .CTX = this,\n  };\n  FEXCore::Allocator::VirtualName(\"FEXMem_ThreadState\", Thread, sizeof(*Thread));\n\n  Thread->CurrentFrame->State.gregs[X86State::REG_RSP] = StackPointer;\n  Thread->CurrentFrame->State.rip = InitialRIP;\n\n  // Copy over the new thread state to the new object\n  if (NewThreadState) {\n    memcpy(&Thread->CurrentFrame->State, NewThreadState, sizeof(FEXCore::Core::CPUState));\n  }\n\n  // Set up the thread manager state\n  Thread->CurrentFrame->Thread = Thread;\n\n  InitializeCompiler(Thread);\n\n  Thread->CurrentFrame->State.DeferredSignalRefCount.Store(0);\n\n  if (Config.BlockJITNaming() || Config.GlobalJITNaming() || Config.LibraryJITNaming()) {\n    // Allocate a JIT symbol buffer only if enabled.\n    Thread->SymbolBuffer = JITSymbols::AllocateBuffer();\n  }\n\n  return Thread;\n}\n\nvoid ContextImpl::DestroyThread(FEXCore::Core::InternalThreadState* Thread) {\n  FEXCore::Allocator::VirtualProtect(&Thread->InterruptFaultPage, sizeof(Thread->InterruptFaultPage),\n                                     Allocator::ProtectOptions::Read | Allocator::ProtectOptions::Write);\n  delete Thread;\n}\n\n#ifndef _WIN32\nvoid ContextImpl::UnlockAfterFork(FEXCore::Core::InternalThreadState* LiveThread, bool Child) {\n  Allocator::UnlockAfterFork(LiveThread, Child);\n\n  Profiler::PostForkAction(Child);\n  if (Child) {\n    if (CodeMapWriter) {\n      CodeMapWriter->ResetAfterFork();\n    }\n\n    CodeInvalidationMutex.StealAndDropActiveLocks();\n    if (Config.StrictInProcessSplitLocks) {\n      StrictSplitLockMutex = 0;\n    }\n  } else {\n    CodeInvalidationMutex.unlock();\n    if (Config.StrictInProcessSplitLocks) {\n      FEXCore::Utils::SpinWaitLock::unlock(&StrictSplitLockMutex);\n    }\n    return;\n  }\n}\n\nvoid ContextImpl::LockBeforeFork(FEXCore::Core::InternalThreadState* Thread) {\n  CodeInvalidationMutex.lock();\n  Allocator::LockBeforeFork(Thread);\n  if (Config.StrictInProcessSplitLocks) {\n    FEXCore::Utils::SpinWaitLock::lock(&StrictSplitLockMutex);\n  }\n}\n#endif\n\nvoid ContextImpl::OnCodeBufferAllocated(const fextl::shared_ptr<CPU::CodeBuffer>& Buffer) {\n  if (Config.GlobalJITNaming()) {\n    Symbols.RegisterJITSpace(Buffer->Ptr, Buffer->AllocatedSize);\n  }\n\n  {\n    std::scoped_lock lk {CodeBufferListLock};\n    CodeBufferList.emplace_back(Buffer);\n  }\n}\n\nvoid ContextImpl::ClearCodeCache(FEXCore::Core::InternalThreadState* Thread, bool NewCodeBuffer) {\n  FEXCORE_PROFILE_INSTANT(\"ClearCodeCache\");\n\n  if (NewCodeBuffer) {\n    // Allocate new CodeBuffer + L3 LookupCache and clear L1+L2 caches\n    Thread->CPUBackend->ClearCache();\n  } else {\n    // Clear L1+L2 cache of this thread, and clear L3 cache across any threads using it\n    auto lk = Thread->LookupCache->AcquireWriteLock();\n    Thread->LookupCache->ClearCache(lk);\n  }\n  Allocator::VirtualDontNeed(Thread->CallRetStackBase, FEXCore::Core::InternalThreadState::CALLRET_STACK_SIZE);\n}\n\nstatic void IRDumper(FEXCore::Core::InternalThreadState* Thread, IR::IREmitter* IREmitter, uint64_t GuestRIP) {\n  FEXCore::File::File FD = FEXCore::File::File::GetStdERR();\n  fextl::stringstream out;\n  auto NewIR = IREmitter->ViewIR();\n  FEXCore::IR::Dump(&out, &NewIR);\n  fextl::fmt::print(FD, \"IR-ShouldDump-{} 0x{:x}:\\n{}\\n@@@@@\\n\", NewIR.PostRA() ? \"post\" : \"pre\", GuestRIP, out.str());\n};\n\nbool ContextImpl::CheckIfBlockIsCacheable(FEXCore::Core::InternalThreadState& Thread, uint64_t GuestRIP, uint64_t MaxInst) {\n  return Thread.FrontendDecoder->CheckIfCacheable(Thread, reinterpret_cast<const uint8_t*>(GuestRIP), GuestRIP, MaxInst);\n}\n\nContextImpl::GenerateIRResult\nContextImpl::GenerateIR(FEXCore::Core::InternalThreadState* Thread, uint64_t GuestRIP, bool ExtendedDebugInfo, uint64_t MaxInst) {\n  FEXCORE_PROFILE_SCOPED(\"GenerateIR\");\n\n  Thread->OpDispatcher->ResetWorkingList();\n\n  uint64_t TotalInstructions {0};\n  uint64_t TotalInstructionsLength {0};\n\n  bool HasCustomIR {};\n\n  if (HasCustomIRHandlers.load(std::memory_order_relaxed)) {\n    std::shared_lock lk(CustomIRMutex);\n    auto Handler = CustomIRHandlers.find(GuestRIP);\n    if (Handler != CustomIRHandlers.end()) {\n      TotalInstructions = 1;\n      TotalInstructionsLength = 1;\n      Handler->second.Handler(GuestRIP, Thread->OpDispatcher.get());\n      HasCustomIR = true;\n    }\n  }\n\n  if (!HasCustomIR) {\n    const uint8_t* GuestCode {};\n    GuestCode = reinterpret_cast<const uint8_t*>(GuestRIP);\n\n    bool HadDispatchError {false};\n    bool HadInvalidInst {false};\n\n    Thread->FrontendDecoder->DecodeInstructionsAtEntry(Thread, GuestCode, GuestRIP, MaxInst);\n\n    auto BlockInfo = Thread->FrontendDecoder->GetDecodedBlockInfo();\n    auto CodeBlocks = &BlockInfo->Blocks;\n\n    Thread->OpDispatcher->BeginFunction(GuestRIP, CodeBlocks, BlockInfo->TotalInstructionCount, BlockInfo->Is64BitMode,\n                                        AreMonoHacksActive() && MonoBackpatcherBlock.load(std::memory_order_relaxed) == GuestRIP);\n\n    const auto GPRSize = Thread->OpDispatcher->GetGPROpSize();\n\n#ifdef ZYDIS_DISASSEMBLER\n    const auto ZydisMachineMode = Config.Is64BitMode ? ZYDIS_MACHINE_MODE_LONG_64 : ZYDIS_MACHINE_MODE_LEGACY_32;\n    if (FEXCore::Config::Get_X86DISASSEMBLE()) {\n      const uint64_t DecodedMin = Thread->FrontendDecoder->DecodedMinAddress;\n      const uint64_t DecodedMax = Thread->FrontendDecoder->DecodedMaxAddress;\n      LogMan::Msg::IFmt(\"Guest x86 Begin (RIP={:#x}, {:#x}-{:#x})\", GuestRIP, DecodedMin, DecodedMax);\n    }\n#endif\n\n    for (size_t j = 0; j < CodeBlocks->size(); ++j) {\n      const FEXCore::Frontend::Decoder::DecodedBlocks& Block = CodeBlocks->at(j);\n\n#ifdef ZYDIS_DISASSEMBLER\n      if (FEXCore::Config::Get_X86DISASSEMBLE() && CodeBlocks->size() > 1) {\n        LogMan::Msg::IFmt(\"  Block {} Entry={:#x} NumInsts={}\", j, Block.Entry, Block.NumInstructions);\n      }\n#endif\n\n      bool BlockInForceTSOValidRange = false;\n      auto InstForceTSOIt = ForceTSOInstructions.end();\n      if (ForceTSOValidRanges.Contains({Block.Entry, Block.Entry + Block.Size})) {\n        if (auto It = ForceTSOInstructions.lower_bound(Block.Entry); *It < Block.Entry + Block.Size) {\n          InstForceTSOIt = It;\n          BlockInForceTSOValidRange = true;\n        }\n      }\n\n      // Set the block entry point\n      Thread->OpDispatcher->SetNewBlockIfChanged(Block.Entry);\n\n      uint64_t BlockInstructionsLength {};\n\n      // Reset any block-specific state\n      Thread->OpDispatcher->StartNewBlock();\n\n      uint64_t InstsInBlock = Block.NumInstructions;\n\n      if (InstsInBlock == 0) {\n        // Special case for an empty instruction block.\n        Thread->OpDispatcher->ExitFunction(Thread->OpDispatcher->_InlineEntrypointOffset(GPRSize, Block.Entry - GuestRIP));\n      }\n\n      for (size_t i = 0; i < InstsInBlock; ++i) {\n        uint64_t InstAddress = Block.Entry + BlockInstructionsLength;\n        const FEXCore::X86Tables::X86InstInfo* TableInfo {nullptr};\n        const FEXCore::X86Tables::DecodedInst* DecodedInfo {nullptr};\n\n        TableInfo = Block.DecodedInstructions[i].TableInfo;\n        DecodedInfo = &Block.DecodedInstructions[i];\n\n#ifdef ZYDIS_DISASSEMBLER\n        if (FEXCore::Config::Get_X86DISASSEMBLE()) {\n          const uint8_t* InstBytes = reinterpret_cast<const uint8_t*>(InstAddress);\n          ZydisDisassembledInstruction ZydisInst;\n          if (ZYAN_SUCCESS(ZydisDisassembleIntel(ZydisMachineMode, InstAddress, InstBytes, DecodedInfo->InstSize, &ZydisInst))) {\n            LogMan::Msg::IFmt(\"    {:#x}: {}\", InstAddress, ZydisInst.text);\n          } else {\n            LogMan::Msg::IFmt(\"    {:#x}: (decode failed, {} bytes)\", InstAddress, DecodedInfo->InstSize);\n          }\n        }\n#endif\n\n        bool IsLocked = DecodedInfo->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_LOCK;\n\n        // Do a partial register cache flush before every instruction. This\n        // prevents cross-instruction static register caching, while allowing\n        // context load/stores to be optimized within a block. Theoretically,\n        // this flush is not required for correctness, all mandatory flushes are\n        // included in instruction-specific handlers. Instead, this is a blunt\n        // heuristic to make the register cache less aggressive, as the current\n        // RA generates bad code in common cases with tied registers otherwise.\n        //\n        // However, it makes our exception handling behaviour more predictable.\n        // It is potentially correctness bearing in that sense, but that is a\n        // side effect here and (if that behaviour is required) we should handle\n        // that more explicitly later.\n        Thread->OpDispatcher->FlushRegisterCache(true);\n\n        if (ExtendedDebugInfo || Thread->OpDispatcher->CanHaveSideEffects(TableInfo, DecodedInfo)) {\n          Thread->OpDispatcher->_GuestOpcode(InstAddress - GuestRIP);\n        }\n\n        if (Config.SMCChecks == FEXCore::Config::CONFIG_SMC_FULL || Block.ForceFullSMCDetection) {\n          auto ExistingCodePtr = reinterpret_cast<uint8_t*>(Block.Entry + BlockInstructionsLength);\n          auto InstAddressReg = Thread->OpDispatcher->_EntrypointOffset(GPRSize, InstAddress - GuestRIP);\n          std::array<uint8_t, 0x10> CodeOriginal;\n          memcpy(CodeOriginal.data(), ExistingCodePtr, DecodedInfo->InstSize);\n          auto CodeChanged = Thread->OpDispatcher->_ValidateCode(CodeOriginal, InstAddressReg, DecodedInfo->InstSize);\n\n          auto InvalidateCodeCond = Thread->OpDispatcher->CondJump(CodeChanged);\n\n          auto CurrentBlock = Thread->OpDispatcher->GetCurrentBlock();\n          auto CodeWasChangedBlock = Thread->OpDispatcher->CreateNewCodeBlockAtEnd();\n          Thread->OpDispatcher->SetTrueJumpTarget(InvalidateCodeCond, CodeWasChangedBlock);\n\n          Thread->OpDispatcher->SetCurrentCodeBlock(CodeWasChangedBlock);\n          Thread->OpDispatcher->_ThreadRemoveCodeEntry();\n          Thread->OpDispatcher->ExitFunction(Thread->OpDispatcher->_InlineEntrypointOffset(GPRSize, InstAddress - GuestRIP));\n\n          auto NextOpBlock = Thread->OpDispatcher->CreateNewCodeBlockAfter(CurrentBlock);\n\n          Thread->OpDispatcher->SetFalseJumpTarget(InvalidateCodeCond, NextOpBlock);\n          Thread->OpDispatcher->SetCurrentCodeBlock(NextOpBlock);\n        }\n\n        if (TableInfo && TableInfo->OpcodeDispatcher.OpDispatch) {\n          auto Fn = TableInfo->OpcodeDispatcher.OpDispatch;\n          Thread->OpDispatcher->ResetHandledLock();\n          Thread->OpDispatcher->ResetDecodeFailure();\n          IR::ForceTSOMode ForceTSO = IR::ForceTSOMode::NoOverride;\n          if (BlockInForceTSOValidRange) {\n            if (InstForceTSOIt != ForceTSOInstructions.end() && *InstForceTSOIt == InstAddress) {\n              ForceTSO = IR::ForceTSOMode::ForceEnabled;\n            } else {\n              ForceTSO = IR::ForceTSOMode::ForceDisabled;\n            }\n          } else if (DecodedInfo->Flags & X86Tables::DecodeFlags::FLAG_FORCE_TSO) {\n            ForceTSO = IR::ForceTSOMode::ForceEnabled;\n          }\n\n          Thread->OpDispatcher->SetForceTSO(ForceTSO);\n          std::invoke(Fn, Thread->OpDispatcher, DecodedInfo);\n          if (Thread->OpDispatcher->HadDecodeFailure()) {\n            HadDispatchError = true;\n          } else {\n            if (Thread->OpDispatcher->HasHandledLock() != IsLocked) {\n              HadDispatchError = true;\n              LogMan::Msg::EFmt(\"Missing LOCK HANDLER at 0x{:x}{{'{}'}}\", InstAddress, TableInfo->Name ?: \"UND\");\n            }\n            BlockInstructionsLength += DecodedInfo->InstSize;\n            TotalInstructionsLength += DecodedInfo->InstSize;\n            ++TotalInstructions;\n\n            // Walk InstForceTSOIt forward past the handled instruction\n            InstForceTSOIt =\n              std::find_if(InstForceTSOIt, ForceTSOInstructions.end(), [&](auto Val) { return Val >= Block.Entry + BlockInstructionsLength; });\n          }\n        } else {\n          // Invalid instruction\n          if (!BlockInstructionsLength) {\n            // SMC can modify block contents and patch invalid instructions to valid ones inline.\n            // End blocks upon encountering them and only emit an invalid opcode exception if there are no prior instructions in the block (that could have modified it to be valid).\n\n            if (TableInfo) {\n              LogMan::Msg::EFmt(\"Invalid or Unknown instruction: {} 0x{:x}\", TableInfo->Name ?: \"UND\", Block.Entry - GuestRIP);\n            }\n\n            if (Block.BlockStatus == Frontend::Decoder::DecodedBlockStatus::INVALID_INST ||\n                Block.BlockStatus == Frontend::Decoder::DecodedBlockStatus::BAD_RELOCATION) {\n              Thread->OpDispatcher->InvalidOp(DecodedInfo);\n            } else {\n              Thread->OpDispatcher->NoExecOp(DecodedInfo);\n            }\n          }\n\n          HadInvalidInst = true;\n        }\n\n        const bool NeedsBlockEnd = (HadDispatchError && TotalInstructions > 0) ||\n                                   (Thread->OpDispatcher->NeedsBlockEnder() && i + 1 == InstsInBlock) || HadInvalidInst;\n\n        // If we had a dispatch error then leave early\n        if (HadDispatchError && TotalInstructions == 0) {\n          // Couldn't handle any instruction in op dispatcher\n          Thread->OpDispatcher->DelayedDisownBuffer();\n          return {std::nullopt, 0, 0, 0, 0};\n        }\n\n        if (NeedsBlockEnd) {\n          // We had some instructions. Early exit\n          Thread->OpDispatcher->ExitFunction(\n            Thread->OpDispatcher->_InlineEntrypointOffset(GPRSize, Block.Entry + BlockInstructionsLength - GuestRIP));\n          break;\n        }\n\n\n        if (Thread->OpDispatcher->FinishOp(DecodedInfo->PC + DecodedInfo->InstSize, i + 1 == InstsInBlock)) {\n          break;\n        }\n      }\n    }\n\n#ifdef ZYDIS_DISASSEMBLER\n    if (FEXCore::Config::Get_X86DISASSEMBLE()) {\n      LogMan::Msg::IFmt(\"Guest x86 End\");\n    }\n#endif\n\n    Thread->OpDispatcher->Finalize();\n\n    Thread->FrontendDecoder->DelayedDisownBuffer();\n  }\n\n  IR::IREmitter* IREmitter = Thread->OpDispatcher.get();\n\n  auto ShouldDump = Thread->OpDispatcher->ShouldDumpIR();\n  // Debug\n  if (ShouldDump) {\n    IRDumper(Thread, IREmitter, GuestRIP);\n  }\n\n  // Run the passmanager over the IR from the dispatcher\n  Thread->PassManager->Run(IREmitter);\n\n  // Debug\n  if (ShouldDump) {\n    IRDumper(Thread, IREmitter, GuestRIP);\n  }\n\n  return {\n    .IRView = IREmitter->ViewIR(),\n    .TotalInstructions = TotalInstructions,\n    .TotalInstructionsLength = TotalInstructionsLength,\n    .StartAddr = Thread->FrontendDecoder->DecodedMinAddress,\n    .Length = Thread->FrontendDecoder->DecodedMaxAddress - Thread->FrontendDecoder->DecodedMinAddress,\n    .NeedsAddGuestCodeRanges = !HasCustomIR,\n  };\n}\n\nContextImpl::CompileCodeResult ContextImpl::CompileCode(FEXCore::Core::InternalThreadState* Thread, uint64_t GuestRIP, uint64_t MaxInst) {\n  if (SourcecodeResolver && Config.GDBSymbols()) {\n    auto MappedSection = SyscallHandler->LookupExecutableFileSection(Thread, GuestRIP);\n    if (MappedSection) {\n      MappedSection->FileInfo.SourcecodeMap =\n        SourcecodeResolver->GenerateMap(MappedSection->FileInfo.Filename, CodeMap::GetBaseFilename(MappedSection->FileInfo, false));\n    }\n  }\n\n  // Generate IR + Meta Info\n  auto [IRView, TotalInstructions, TotalInstructionsLength, StartAddr, Length, NeedsAddGuestCodeRanges] =\n    GenerateIR(Thread, GuestRIP, Config.GDBSymbols(), MaxInst);\n  if (!IRView) {\n    // OpDispatcher IR already released in this case.\n    return {{}, nullptr, 0, 0, false};\n  }\n\n  // Attempt to get the CPU backend to compile this code\n  // Re-check if another thread raced us in compiling this block.\n  // We could lock CodeBufferWriteMutex earlier to prevent this from happening,\n  // but this would increase lock contention. Redundant frontend runs aren't\n  // as expensive and are easily reverted.\n  if (MaxInst != 1) {\n    if (auto Block = Thread->LookupCache->FindBlock(Thread, GuestRIP)) {\n      // Raced to compile, release the OpDispatcher IR.\n      Thread->OpDispatcher->DelayedDisownBuffer();\n      return {.CompiledCode = {.BlockBegin = reinterpret_cast<uint8_t*>(Block), .EntryPoints = {{GuestRIP, reinterpret_cast<uint8_t*>(Block)}}},\n              .DebugData = nullptr,\n              .StartAddr = 0,\n              .Length = 0,\n              .NeedsAddGuestCodeRanges = false};\n    }\n  }\n\n  auto DebugData = fextl::make_unique<FEXCore::Core::DebugData>();\n\n  // If the trap flag is set we generate single instruction blocks that each check to generate a single step exception.\n  bool TFSet = Thread->CurrentFrame->State.flags[X86State::RFLAG_TF_RAW_LOC];\n\n  auto CompiledCode = Thread->CPUBackend->CompileCode(GuestRIP, Length, TotalInstructions == 1, &*IRView, DebugData.get(), TFSet);\n\n  // Release the IR\n  Thread->OpDispatcher->DelayedDisownBuffer();\n\n  return {\n    .CompiledCode = std::move(CompiledCode),\n    .DebugData = std::move(DebugData),\n    .StartAddr = StartAddr,\n    .Length = Length,\n    .NeedsAddGuestCodeRanges = NeedsAddGuestCodeRanges,\n  };\n}\n\nuintptr_t ContextImpl::CompileBlock(FEXCore::Core::CpuStateFrame* Frame, uint64_t GuestRIP, uint64_t MaxInst) {\n  auto Thread = Frame->Thread;\n  FEXCORE_PROFILE_SCOPED(\"CompileBlock\");\n  FEXCORE_PROFILE_ACCUMULATION(Thread, AccumulatedJITTime);\n\n  static_cast<ContextImpl*>(Thread->CTX)->SyscallHandler->PreCompile();\n\n  // Invalidate might take a unique lock on this, to guarantee that during invalidation no code gets compiled\n  auto lk = GuardSignalDeferringSection<std::shared_lock>(CodeInvalidationMutex, Thread);\n\n  // Is the code in the cache?\n  // The backends only check L1 and L2, not L3\n  if (auto HostCode = Thread->LookupCache->FindBlock(Thread, GuestRIP)) {\n    return HostCode;\n  }\n\n  // Accumulate a JIT count now, as even if another thread raced us, it should count as a compile.\n  FEXCORE_PROFILE_INSTANT_INCREMENT(Thread, AccumulatedJITCount, 1);\n\n  auto [CompiledCode, DebugData, StartAddr, Length, NeedsAddGuestCodeRanges] = CompileCode(Thread, GuestRIP, MaxInst);\n  auto CodePtr = CompiledCode.EntryPoints[GuestRIP];\n  if (CodePtr == nullptr) {\n    return 0;\n  } else if (!DebugData) {\n    // DebugData wasn't populated, indicating another thread raced us for compiling this block\n    return reinterpret_cast<uintptr_t>(CodePtr);\n  }\n\n  // The core managed to compile the code.\n  if (Config.BlockJITNaming()) {\n    auto FragmentBasePtr = CompiledCode.BlockBegin;\n\n    auto GuestRIPLookup = SyscallHandler->LookupExecutableFileSection(Thread, GuestRIP);\n\n    if (DebugData->Subblocks.size()) {\n      for (auto& Subblock : DebugData->Subblocks) {\n        auto BlockBasePtr = FragmentBasePtr + Subblock.HostCodeOffset;\n        if (GuestRIPLookup) {\n          Symbols.Register(Thread->SymbolBuffer.get(), BlockBasePtr, CompiledCode.Size, GuestRIPLookup->FileInfo.Filename,\n                           GuestRIP - GuestRIPLookup->FileStartVA);\n        } else {\n          Symbols.Register(Thread->SymbolBuffer.get(), BlockBasePtr, GuestRIP, Subblock.HostCodeSize);\n        }\n      }\n    } else {\n      if (GuestRIPLookup) {\n        Symbols.Register(Thread->SymbolBuffer.get(), FragmentBasePtr, CompiledCode.Size, GuestRIPLookup->FileInfo.Filename,\n                         GuestRIP - GuestRIPLookup->FileStartVA);\n      } else {\n        Symbols.Register(Thread->SymbolBuffer.get(), FragmentBasePtr, GuestRIP, CompiledCode.Size);\n      }\n    }\n  }\n\n  if (Config.LibraryJITNaming() || Config.GDBSymbols()) {\n    auto MappedSection = SyscallHandler->LookupExecutableFileSection(Thread, GuestRIP);\n    if (MappedSection) {\n      if (Config.LibraryJITNaming()) {\n        Symbols.RegisterNamedRegion(Thread->SymbolBuffer.get(), CodePtr, DebugData->HostCodeSize, MappedSection->FileInfo.Filename);\n      }\n\n      if (Config.GDBSymbols()) {\n        GDBJITRegister(MappedSection->FileInfo, MappedSection->FileStartVA, GuestRIP, (uintptr_t)CodePtr, *DebugData);\n      }\n    }\n  }\n\n  // Clear any relocations that might have been generated\n  if (!CodeCache.IsGeneratingCache) {\n    Thread->CPUBackend->ClearRelocations();\n  }\n\n  fextl::vector<uint64_t> CodePages;\n\n  if (NeedsAddGuestCodeRanges) {\n    // Track in the guest to host map all entrypoints for all pages the compiled block touches, if any page didn't previously\n    // contain code, inform the frontend so it can setup SMC detection.\n    auto BlockInfo = Thread->FrontendDecoder->GetDecodedBlockInfo();\n    CodePages.reserve(BlockInfo->CodePages.size());\n    CodePages.insert(CodePages.end(), BlockInfo->CodePages.begin(), BlockInfo->CodePages.end());\n    for (auto CodePage : BlockInfo->CodePages) {\n      if (Thread->LookupCache->AddBlockExecutableRange(Thread, BlockInfo->EntryPoints, CodePage, FEXCore::Utils::FEX_PAGE_SIZE)) {\n        SyscallHandler->MarkGuestExecutableRange(Thread, CodePage, FEXCore::Utils::FEX_PAGE_SIZE);\n      }\n    }\n  }\n\n  // Insert to lookup cache\n\n  for (auto [GuestAddr, HostAddr] : CompiledCode.EntryPoints) {\n    Thread->LookupCache->AddBlockMapping(Thread, GuestAddr, CodePages, HostAddr);\n  }\n\n  if (CodeMapWriter) {\n    auto Region = SyscallHandler->LookupExecutableFileSection(Thread, GuestRIP);\n    if (Region && Region->FileStartVA != 0) {\n      CodeMapWriter->AppendBlock(*Region, GuestRIP);\n    }\n  }\n\n  return (uintptr_t)CodePtr;\n}\n\nuintptr_t ContextImpl::CompileSingleStep(FEXCore::Core::CpuStateFrame* Frame, uint64_t GuestRIP) {\n  FEXCORE_PROFILE_SCOPED(\"CompileSingleStep\");\n  auto Thread = Frame->Thread;\n\n  static_cast<ContextImpl*>(Thread->CTX)->SyscallHandler->PreCompile();\n\n  // Invalidate might take a unique lock on this, to guarantee that during invalidation no code gets compiled\n  auto lk = GuardSignalDeferringSection<std::shared_lock>(CodeInvalidationMutex, Thread);\n\n  auto [CompiledCode, DebugData, StartAddr, Length, _] = CompileCode(Thread, GuestRIP, 1);\n  auto CodePtr = CompiledCode.EntryPoints[GuestRIP];\n  if (CodePtr == nullptr) {\n    return 0;\n  }\n\n  // Clear any relocations that might have been generated\n  Thread->CPUBackend->ClearRelocations();\n\n  return (uintptr_t)CodePtr;\n}\n\nvoid ContextImpl::InvalidateCodeBuffersCodeRange(uint64_t Start, uint64_t Length) {\n  FEXCORE_PROFILE_SCOPED(\"InvalidateCodeBuffersCodeRange\");\n\n  LOGMAN_THROW_A_FMT(CodeInvalidationMutex.try_lock() == false, \"CodeInvalidationMutex needs to be unique_locked here\");\n  std::scoped_lock lk {CodeBufferListLock};\n  auto it = CodeBufferList.begin();\n  while (it != CodeBufferList.end()) {\n    if (auto Strong = it->lock()) {\n      Strong->LookupCache->InvalidateRange(Start, Length);\n      it++;\n    } else {\n      it = CodeBufferList.erase(it);\n    }\n  }\n}\n\nvoid ContextImpl::InvalidateThreadCachedCodeRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Start, uint64_t Length) {\n  LOGMAN_THROW_A_FMT(CodeInvalidationMutex.try_lock() == false, \"CodeInvalidationMutex needs to be unique_locked here\");\n\n  // Ensures now-modified mappings aren't cached as being in their previous non-executable state.\n  // Accessing FrontendDecoder is safe as the thread's code invalidation mutex must be locked here.\n  Thread->FrontendDecoder->ResetExecutableRangeCache();\n\n  if (Thread->LookupCache->InvalidateCacheRange(Start, Length)) {\n    FEXCORE_PROFILE_SCOPED(\"InvalidateCallRet\");\n\n    // This may cause access violations in the thread on Windows as zeroing is not atomic, this is handled by the frontend\n    Allocator::VirtualDontNeed(Thread->CallRetStackBase, FEXCore::Core::InternalThreadState::CALLRET_STACK_SIZE);\n  }\n}\n\nvoid ContextImpl::ThreadRemoveCodeEntryFromJit(FEXCore::Core::CpuStateFrame* Frame, uint64_t GuestRIP) {\n  static_cast<ContextImpl*>(Frame->Thread->CTX)->SyscallHandler->InvalidateGuestCodeRange(Frame->Thread, GuestRIP, 1);\n}\n\nstd::optional<CustomIRResult>\nContextImpl::AddCustomIREntrypoint(uintptr_t Entrypoint, CustomIREntrypointHandler Handler, void* Creator, void* Data) {\n  LOGMAN_THROW_A_FMT(Config.Is64BitMode || !(Entrypoint >> 32), \"64-bit Entrypoint in 32-bit mode {:x}\", Entrypoint);\n\n  std::unique_lock lk(CustomIRMutex);\n\n  auto InsertedIterator = CustomIRHandlers.emplace(Entrypoint, CustomIRHandlerEntry {Handler, Creator, Data});\n  HasCustomIRHandlers = true;\n\n  if (!InsertedIterator.second) {\n    const auto& [fn, Creator, Data] = InsertedIterator.first->second;\n    return CustomIRResult(Creator, Data);\n  }\n\n  return std::nullopt;\n}\n\nvoid ContextImpl::AddThunkTrampolineIRHandler(uintptr_t Entrypoint, uintptr_t GuestThunkEntrypoint) {\n  LOGMAN_THROW_A_FMT(Entrypoint, \"Tried to link null pointer address to guest function\");\n  LOGMAN_THROW_A_FMT(GuestThunkEntrypoint, \"Tried to link address to null pointer guest function\");\n  if (!Config.Is64BitMode) {\n    LOGMAN_THROW_A_FMT((Entrypoint >> 32) == 0, \"Tried to link 64-bit address in 32-bit mode\");\n    LOGMAN_THROW_A_FMT((GuestThunkEntrypoint >> 32) == 0, \"Tried to link 64-bit address in 32-bit mode\");\n  }\n\n  LogMan::Msg::DFmt(\"Thunks: Adding guest trampoline from address {:#x} to guest function {:#x}\", Entrypoint, GuestThunkEntrypoint);\n\n  auto Result = AddCustomIREntrypoint(\n    Entrypoint,\n    [this, GuestThunkEntrypoint](uintptr_t Entrypoint, FEXCore::IR::IREmitter* emit) {\n      auto IRHeader = emit->_IRHeader(emit->Invalid(), Entrypoint, 0, 0, 0, 0);\n      auto Block = emit->CreateCodeNode(true, 0);\n      IRHeader.first->Blocks = emit->WrapNode(Block);\n      emit->SetCurrentCodeBlock(Block);\n\n      const auto GPRSize = this->Config.Is64BitMode ? IR::OpSize::i64Bit : IR::OpSize::i32Bit;\n\n      // Thunk entry-points don't get cached, don't need to be padded.\n      if (GPRSize == IR::OpSize::i64Bit) {\n        IR::Ref R = emit->_StoreRegister(emit->Constant(Entrypoint), GPRSize);\n        R->Reg = IR::PhysicalRegister(IR::RegClass::GPRFixed, X86State::REG_R11).Raw;\n      } else {\n        emit->_StoreContextFPR(GPRSize, emit->_VCastFromGPR(IR::OpSize::i64Bit, IR::OpSize::i64Bit, emit->Constant(Entrypoint)),\n                               offsetof(Core::CPUState, mm[0][0]));\n      }\n      emit->_ExitFunction(IR::OpSize::i64Bit, emit->Constant(GuestThunkEntrypoint), IR::BranchHint::None, emit->Invalid(), emit->Invalid());\n    },\n    ThunkHandler, (void*)GuestThunkEntrypoint);\n\n  if (Result.has_value()) {\n    if (Result->Creator != ThunkHandler) {\n      ERROR_AND_DIE_FMT(\"Input address for AddThunkTrampoline is already linked by another module\");\n    }\n    if (Result->Data != (void*)GuestThunkEntrypoint) {\n      // NOTE: This may happen in Vulkan thunks if the Vulkan driver resolves two different symbols\n      //       to the same function (e.g. vkGetPhysicalDeviceFeatures2/vkGetPhysicalDeviceFeatures2KHR)\n      LogMan::Msg::EFmt(\"Input address for AddThunkTrampoline is already linked elsewhere\");\n    }\n  }\n}\n\nvoid ContextImpl::AddForceTSOInformation(const IntervalList<uint64_t>& ValidRanges, fextl::set<uint64_t>&& Instructions) {\n  LogMan::Throw::AFmt(CodeInvalidationMutex.try_lock() == false, \"CodeInvalidationMutex needs to be unique_locked here\");\n  ForceTSOValidRanges.Insert(ValidRanges);\n  ForceTSOInstructions.merge(std::move(Instructions));\n}\n\nvoid ContextImpl::RemoveForceTSOInformation(uint64_t Address, uint64_t Size) {\n  LogMan::Throw::AFmt(CodeInvalidationMutex.try_lock() == false, \"CodeInvalidationMutex needs to be unique_locked here\");\n\n  ForceTSOValidRanges.Remove({Address, Address + Size});\n  ForceTSOInstructions.erase(ForceTSOInstructions.lower_bound(Address), ForceTSOInstructions.upper_bound(Address + Size));\n}\n\nvoid ContextImpl::MarkMonoBackpatcherBlock(uint64_t BlockEntry) {\n  MonoBackpatcherBlock.store(BlockEntry, std::memory_order_relaxed);\n}\n\nvoid ContextImpl::RemoveCustomIREntrypoint(FEXCore::Core::InternalThreadState* Thread, uintptr_t Entrypoint) {\n  LOGMAN_THROW_A_FMT(Config.Is64BitMode || !(Entrypoint >> 32), \"64-bit Entrypoint in 32-bit mode {:x}\", Entrypoint);\n\n  std::scoped_lock lk(CustomIRMutex);\n\n  CustomIRHandlers.erase(Entrypoint);\n  HasCustomIRHandlers = !CustomIRHandlers.empty();\n  SyscallHandler->InvalidateGuestCodeRange(Thread, Entrypoint, 1);\n}\n\nvoid ContextImpl::MonoBackpatcherWrite(FEXCore::Core::CpuStateFrame* Frame, uint8_t Size, uint64_t Address, uint64_t Value) {\n  auto Thread = Frame->Thread;\n  auto CTX = static_cast<ContextImpl*>(Thread->CTX);\n  {\n    auto lk = GuardSignalDeferringSection(CTX->CodeInvalidationMutex, Thread);\n\n    if (Size == 8) {\n      *reinterpret_cast<uint64_t*>(Address) = Value;\n    } else if (Size == 4) {\n      *reinterpret_cast<uint32_t*>(Address) = Value;\n    } else {\n      ERROR_AND_DIE_FMT(\"Unexpected write size for backpatcher: {}\", Size);\n    }\n  }\n\n  CTX->SyscallHandler->InvalidateGuestCodeRange(Thread, Address, Size);\n}\n\nvoid ContextImpl::ConfigureAOTGen(FEXCore::Core::InternalThreadState* Thread, fextl::set<uint64_t>* ExternalBranches, uint64_t SectionMaxAddress) {\n  Thread->FrontendDecoder->SetExternalBranches(ExternalBranches);\n}\n} // namespace FEXCore::Context\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/Dispatcher/Dispatcher.cpp",
    "content": "// SPDX-License-Identifier: MIT\n\n#include \"Common/VectorRegType.h\"\n#include \"Interface/Context/Context.h\"\n#include \"Interface/Core/CPUBackend.h\"\n#include \"Interface/Core/Dispatcher/Dispatcher.h\"\n#include \"Interface/Core/LookupCache.h\"\n#include \"Utils/MemberFunctionToPointer.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/SignalDelegator.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n#include <FEXCore/Utils/Event.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <CodeEmitter/Emitter.h>\n\n#ifdef VIXL_SIMULATOR\n#include <aarch64/simulator-aarch64.h>\n#endif\n\n#include <array>\n#include <bit>\n#include <cstring>\n\nnamespace FEXCore::CPU {\n\nstatic void SleepThread(FEXCore::Context::ContextImpl* CTX, FEXCore::Core::CpuStateFrame* Frame) {\n  CTX->SyscallHandler->SleepThread(CTX, Frame);\n}\n\nconstexpr size_t MAX_DISPATCHER_CODE_SIZE = FEXCore::Utils::FEX_PAGE_SIZE * 4;\n\nDispatcher::Dispatcher(FEXCore::Context::ContextImpl* ctx)\n  : Arm64Emitter(ctx, FEXCore::Allocator::VirtualAlloc(MAX_DISPATCHER_CODE_SIZE, true), MAX_DISPATCHER_CODE_SIZE)\n  , CTX {ctx} {\n  EmitDispatcher();\n\n  FEXCore::Allocator::VirtualName(\"FEXMem_Misc\", reinterpret_cast<void*>(GetBufferBase()), MAX_DISPATCHER_CODE_SIZE);\n}\n\nDispatcher::~Dispatcher() {\n  auto BufferSize = GetBufferSize();\n  if (BufferSize) {\n    FEXCore::Allocator::VirtualFree(GetBufferBase(), BufferSize);\n  }\n}\n\nvoid Dispatcher::EmitDispatcher() {\n  // Don't modify TMP3 since it contains our RIP once the block doesn't exist\n  auto RipReg = TMP3;\n#ifdef VIXL_DISASSEMBLER\n  const auto DisasmBegin = GetCursorAddress<const vixl::aarch64::Instruction*>();\n#endif\n\n  DispatchPtr = GetCursorAddress<AsmDispatch>();\n\n  // while (true) {\n  //    Ptr = FindBlock(RIP)\n  //    if (!Ptr)\n  //      Ptr = CTX->CompileBlock(RIP);\n  //\n  //    Ptr();\n  // }\n\n  ARMEmitter::ForwardLabel l_CTX;\n  ARMEmitter::ForwardLabel l_Sleep;\n  ARMEmitter::ForwardLabel l_CompileBlock;\n  ARMEmitter::ForwardLabel l_CompileSingleStep;\n\n  // Push all the register we need to save\n  PushCalleeSavedRegisters();\n\n  // Push our memory base to the correct register\n  // Move our thread pointer to the correct register\n  // This is passed in to parameter 0 (x0)\n  mov(STATE, ARMEmitter::XReg::x0);\n\n  // Save this stack pointer so we can cleanly shutdown the emulation with a long jump\n  // regardless of where we were in the stack\n  add(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r0, ARMEmitter::Reg::rsp, 0);\n  str(ARMEmitter::XReg::x0, STATE_PTR(CpuStateFrame, ReturningStackLocation));\n\n  ARMEmitter::ForwardLabel CompileSingleStep;\n  AbsoluteLoopTopAddressFillSRA = GetCursorAddress<uint64_t>();\n\n  FillStaticRegs();\n  ldr(RipReg, STATE_PTR(CpuStateFrame, State.rip));\n  (void)cbnz(ARMEmitter::Size::i32Bit, ENTRY_FILL_SRA_SINGLE_INST_REG, &CompileSingleStep);\n\n  ARMEmitter::BiDirectionalLabel LoopTop {};\n\n#ifdef ARCHITECTURE_arm64ec\n  (void)b(&LoopTop);\n\n  AbsoluteLoopTopAddressEnterECFillSRA = GetCursorAddress<uint64_t>();\n  ldr(STATE, EC_ENTRY_CPUAREA_REG, CPU_AREA_EMULATOR_DATA_OFFSET);\n  FillStaticRegs();\n\n  ldr(RipReg, STATE_PTR(CpuStateFrame, State.rip));\n  // Force a single instruction block if ENTRY_FILL_SRA_SINGLE_INST_REG is nonzero entering the JIT, used for inline SMC handling.\n  (void)cbnz(ARMEmitter::Size::i32Bit, ENTRY_FILL_SRA_SINGLE_INST_REG, &CompileSingleStep);\n\n  // Enter JIT\n  (void)b(&LoopTop);\n\n  AbsoluteLoopTopAddressEnterEC = GetCursorAddress<uint64_t>();\n  // Load ThreadState and write the target PC there\n  ldr(STATE, EC_ENTRY_CPUAREA_REG, CPU_AREA_EMULATOR_DATA_OFFSET);\n  str(EC_CALL_CHECKER_PC_REG, STATE_PTR(CpuStateFrame, State.rip));\n\n  // Swap stacks to the emulator stack\n  ldr(TMP1, EC_ENTRY_CPUAREA_REG, CPU_AREA_EMULATOR_STACK_BASE_OFFSET);\n  add(ARMEmitter::Size::i64Bit, StaticRegisters[X86State::REG_RSP], ARMEmitter::Reg::rsp, 0);\n  add(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, TMP1, 0);\n\n  ldr(REG_CALLRET_SP, STATE_PTR(CpuStateFrame, State.callret_sp));\n\n  FillSpecialRegs(TMP1, TMP2, false, true);\n\n  // As ARM64EC uses this as an entrypoint for both guest calls and host returns, opportunistically try to return\n  // using the call-ret stack to avoid unbalancing it.\n  ldp<ARMEmitter::IndexType::OFFSET>(TMP1, TMP2, REG_CALLRET_SP);\n  // EC_CALL_CHECKER_PC_REG is REG_PF which isn't touched by any of the above\n  sub(ARMEmitter::Size::i64Bit, TMP1, EC_CALL_CHECKER_PC_REG, TMP1);\n  (void)cbnz(ARMEmitter::Size::i64Bit, TMP1, &LoopTop);\n\n  // If the entry at the TOS is for the target address, pop it and return to the JIT code\n  add(ARMEmitter::Size::i64Bit, REG_CALLRET_SP, REG_CALLRET_SP, 0x10);\n  ret(TMP2);\n\n  // Enter JIT\n#endif\n\n  // We want to ensure that we are 16 byte aligned at the top of this loop\n  Align16B();\n\n  (void)Bind(&LoopTop);\n  AbsoluteLoopTopAddress = GetCursorAddress<uint64_t>();\n\n  // Load in our RIP\n  ldr(RipReg, STATE_PTR(CpuStateFrame, State.rip));\n\n#ifdef ARCHITECTURE_arm64ec\n  // Clobbers TMP1/2\n  // Check the EC code bitmap incase we need to exit the JIT to call into native code.\n  ARMEmitter::ForwardLabel l_NotECCode;\n  ldr(TMP1, ARMEmitter::XReg::x18, TEB_PEB_OFFSET);\n  ldr(TMP1, TMP1, PEB_EC_CODE_BITMAP_OFFSET);\n\n  lsr(ARMEmitter::Size::i64Bit, TMP2, RipReg, 15);\n  and_(ARMEmitter::Size::i64Bit, TMP2, TMP2, 0x1fffffffffff8);\n  ldr(TMP1, TMP1, TMP2, ARMEmitter::ExtendedType::LSL_64, 0);\n  lsr(ARMEmitter::Size::i64Bit, TMP2, RipReg, 12);\n  lsrv(ARMEmitter::Size::i64Bit, TMP1, TMP1, TMP2);\n  (void)tbz(TMP1, 0, &l_NotECCode);\n\n  str(REG_CALLRET_SP, STATE_PTR(CpuStateFrame, State.callret_sp));\n\n  add(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, StaticRegisters[X86State::REG_RSP], 0);\n  mov(EC_CALL_CHECKER_PC_REG, RipReg);\n  ldr(TMP2, STATE_PTR(CpuStateFrame, Pointers.ExitFunctionEC));\n  br(TMP2);\n\n  (void)Bind(&l_NotECCode);\n#endif\n\n  ldrb(TMP1, STATE_PTR(CpuStateFrame, State.flags[X86State::RFLAG_TF_RAW_LOC]));\n  (void)cbnz(ARMEmitter::Size::i32Bit, TMP1, &CompileSingleStep);\n\n  ARMEmitter::ForwardLabel NoBlock;\n\n  if (DisableL2Cache()) {\n    (void)b(&NoBlock);\n  } else {\n    // This is the block cache lookup routine\n    // It matches what is going on it LookupCache.h::FindBlock\n    ldr(TMP1, STATE_PTR(CpuStateFrame, Pointers.L2Pointer));\n\n    // Mask the address by the virtual address size so we can check for aliases\n    uint64_t VirtualMemorySize = CTX->Config.VirtualMemSize;\n    if (std::popcount(VirtualMemorySize) == 1) {\n      and_(ARMEmitter::Size::i64Bit, TMP4, RipReg.R(), VirtualMemorySize - 1);\n    } else {\n      LoadConstant(ARMEmitter::Size::i64Bit, TMP4, VirtualMemorySize);\n      and_(ARMEmitter::Size::i64Bit, TMP4, RipReg.R(), TMP4);\n    }\n\n    {\n      // Offset the address and add to our page pointer\n      lsr(ARMEmitter::Size::i64Bit, TMP2, TMP4, 12);\n\n      // Load the pointer from the offset\n      ldr(TMP1, TMP1, TMP2, ARMEmitter::ExtendedType::LSL_64, 3);\n\n      // If page pointer is zero then we have no block\n      (void)cbz(ARMEmitter::Size::i64Bit, TMP1, &NoBlock);\n\n      // Steal the page offset\n      and_(ARMEmitter::Size::i64Bit, TMP2, TMP4, 0x0FFF);\n\n      // Shift the offset by the size of the block cache entry\n      add(TMP1, TMP1, TMP2, ARMEmitter::ShiftType::LSL, FEXCore::ilog2(sizeof(LookupCache::LookupCacheEntry)));\n\n      // The the full LookupCacheEntry with a single LDP.\n      // Check the guest address first to ensure it maps to the address we are currently at.\n      // This fixes aliasing problems\n      ldp<ARMEmitter::IndexType::OFFSET>(TMP4, TMP2, TMP1, 0);\n\n      // If the guest address doesn't match, Compile the block.\n      sub(TMP2, TMP2, RipReg);\n      (void)cbnz(ARMEmitter::Size::i64Bit, TMP2, &NoBlock);\n\n      // Check the host address to see if it matches, else compile the block.\n      (void)cbz(ARMEmitter::Size::i64Bit, TMP4, &NoBlock);\n\n      // If we've made it here then we have a real compiled block\n      {\n        // update L1 cache\n        ldp<ARMEmitter::IndexType::OFFSET>(TMP1, TMP2, STATE, offsetof(FEXCore::Core::CpuStateFrame, State.L1Pointer));\n\n        // Calculate (tmp1 + ((ripreg & L1_ENTRIES_MASK) << 4)) for the address\n        // L1Mask is pre-shifted.\n        and_(ARMEmitter::Size::i64Bit, TMP2, TMP2, RipReg.R(), ARMEmitter::ShiftType::LSL, FEXCore::ilog2(sizeof(LookupCache::LookupCacheEntry)));\n        add(TMP1, TMP1, TMP2);\n\n        stp<ARMEmitter::IndexType::OFFSET>(TMP4, RipReg, TMP1);\n\n        // Jump to the block\n        br(TMP4);\n      }\n    }\n  }\n\n  {\n    ThreadStopHandlerAddressSpillSRA = GetCursorAddress<uint64_t>();\n    SpillStaticRegs(TMP1);\n\n    ThreadStopHandlerAddress = GetCursorAddress<uint64_t>();\n\n    PopCalleeSavedRegisters();\n\n    // Return from the function\n    // LR is set to the correct return location now\n    ret();\n  }\n\n  // Clobbers TMP1/2\n  auto EmitSignalGuardedRegion = [&](auto Body) {\n#ifndef _WIN32\n    ldr(TMP2, STATE, offsetof(FEXCore::Core::CPUState, DeferredSignalRefCount));\n    add(ARMEmitter::Size::i64Bit, TMP2, TMP2, 1);\n    str(TMP2, STATE, offsetof(FEXCore::Core::CPUState, DeferredSignalRefCount));\n#endif\n\n#ifdef ARCHITECTURE_arm64ec\n    ldr(TMP2, ARMEmitter::XReg::x18, TEB_CPU_AREA_OFFSET);\n    LoadConstant(ARMEmitter::Size::i32Bit, TMP1, 1);\n    strb(TMP1.W(), TMP2, CPU_AREA_IN_SYSCALL_CALLBACK_OFFSET);\n#endif\n\n    Body();\n\n#ifdef ARCHITECTURE_arm64ec\n    ldr(TMP2, ARMEmitter::XReg::x18, TEB_CPU_AREA_OFFSET);\n    strb(ARMEmitter::WReg::zr, TMP2, CPU_AREA_IN_SYSCALL_CALLBACK_OFFSET);\n#endif\n\n#ifndef _WIN32\n    ldr(TMP2, STATE, offsetof(FEXCore::Core::CPUState, DeferredSignalRefCount));\n    sub(ARMEmitter::Size::i64Bit, TMP2, TMP2, 1);\n    str(TMP2, STATE, offsetof(FEXCore::Core::CPUState, DeferredSignalRefCount));\n\n    // Trigger segfault if any deferred signals are pending\n    strb(ARMEmitter::XReg::zr, STATE,\n         offsetof(FEXCore::Core::InternalThreadState, InterruptFaultPage) - offsetof(FEXCore::Core::InternalThreadState, BaseFrameState));\n#endif\n  };\n\n  {\n    ExitFunctionLinkerAddress = GetCursorAddress<uint64_t>();\n    EmitSignalGuardedRegion([&]() {\n      SpillStaticRegs(TMP1);\n\n      mov(ARMEmitter::XReg::x0, STATE);\n      mov(ARMEmitter::XReg::x1, ARMEmitter::XReg::lr);\n\n      ldr(ARMEmitter::XReg::x2, STATE_PTR(CpuStateFrame, Pointers.ExitFunctionLink));\n      if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n        GenerateIndirectRuntimeCall<uintptr_t, void*, void*>(ARMEmitter::Reg::r2);\n      } else {\n        blr(ARMEmitter::Reg::r2);\n      }\n\n      if (!TMP_ABIARGS) {\n        mov(TMP1, ARMEmitter::XReg::x0);\n      }\n\n      FillStaticRegs();\n    });\n\n    br(TMP1);\n  }\n\n  // Need to create the block\n  {\n    (void)Bind(&NoBlock);\n\n    EmitSignalGuardedRegion([&]() {\n      SpillStaticRegs(TMP1);\n\n      if (!TMP_ABIARGS) {\n        mov(ARMEmitter::XReg::x2, RipReg);\n      }\n\n      ldr(ARMEmitter::XReg::x0, &l_CTX);\n      mov(ARMEmitter::XReg::x1, STATE);\n      // x2 contains guest RIP\n      mov(ARMEmitter::XReg::x3, 0);\n      ldr(ARMEmitter::XReg::x4, &l_CompileBlock);\n\n      if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n        GenerateIndirectRuntimeCall<uintptr_t, void*, void*, uint64_t, uint64_t>(ARMEmitter::Reg::r4);\n      } else {\n        blr(ARMEmitter::Reg::r4); // { CTX, Frame, RIP, MaxInst }\n      }\n\n      // Result is now in x0\n      if (!TMP_ABIARGS) {\n        mov(TMP1, ARMEmitter::XReg::x0);\n      }\n\n      FillStaticRegs();\n    });\n\n    // Jump to the compiled block\n    br(TMP1);\n  }\n\n  {\n    (void)Bind(&CompileSingleStep);\n\n    EmitSignalGuardedRegion([&]() {\n      SpillStaticRegs(TMP1);\n\n      if (!TMP_ABIARGS) {\n        mov(ARMEmitter::XReg::x2, RipReg);\n      }\n\n      ldr(ARMEmitter::XReg::x0, &l_CTX);\n      mov(ARMEmitter::XReg::x1, STATE);\n      // x2 contains guest RIP\n      ldr(ARMEmitter::XReg::x4, &l_CompileSingleStep);\n\n      if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n        GenerateIndirectRuntimeCall<uintptr_t, void*, void*, uint64_t, uint64_t>(ARMEmitter::Reg::r4);\n      } else {\n        blr(ARMEmitter::Reg::r4); // { CTX, Frame, RIP }\n      }\n\n      // Result is now in x0\n      if (!TMP_ABIARGS) {\n        mov(TMP1, ARMEmitter::XReg::x0);\n      }\n\n      FillStaticRegs();\n    });\n\n    // Jump to the compiled block\n    br(TMP1);\n  }\n\n  {\n    SignalHandlerReturnAddress = GetCursorAddress<uint64_t>();\n\n    // Now to get back to our old location we need to do a fault dance\n    // We can't use SIGTRAP here since gdb catches it and never gives it to the application!\n    hlt(0);\n  }\n\n  {\n    SignalHandlerReturnAddressRT = GetCursorAddress<uint64_t>();\n\n    // Now to get back to our old location we need to do a fault dance\n    // We can't use SIGTRAP here since gdb catches it and never gives it to the application!\n    hlt(0);\n  }\n\n  {\n    // Guest SIGILL handler\n    // Needs to be distinct from the SignalHandlerReturnAddress\n    GuestSignal_SIGILL = GetCursorAddress<uint64_t>();\n\n    SpillStaticRegs(TMP1);\n\n    hlt(0);\n  }\n\n  {\n    // Guest SIGTRAP handler\n    // Needs to be distinct from the SignalHandlerReturnAddress\n    GuestSignal_SIGTRAP = GetCursorAddress<uint64_t>();\n\n    SpillStaticRegs(TMP1);\n\n    brk(0);\n  }\n\n  {\n    // Guest Overflow handler\n    // Needs to be distinct from the SignalHandlerReturnAddress\n    GuestSignal_SIGSEGV = GetCursorAddress<uint64_t>();\n\n    SpillStaticRegs(TMP1);\n\n    // hlt/udf = SIGILL\n    // brk = SIGTRAP\n    // ??? = SIGSEGV\n    // Force a SIGSEGV by loading zero\n    if (CTX->ExitOnHLTEnabled()) {\n      ldr(ARMEmitter::XReg::x0, STATE_PTR(CpuStateFrame, ReturningStackLocation));\n      add(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, ARMEmitter::Reg::r0, 0);\n      PopCalleeSavedRegisters();\n      ret();\n    } else {\n      LoadConstant(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r1, 0);\n      ldr(ARMEmitter::XReg::x1, ARMEmitter::Reg::r1);\n    }\n  }\n\n  {\n    ThreadPauseHandlerAddressSpillSRA = GetCursorAddress<uint64_t>();\n    SpillStaticRegs(TMP1);\n\n    ThreadPauseHandlerAddress = GetCursorAddress<uint64_t>();\n    // We are pausing, this means the frontend should be waiting for this thread to idle\n    // We will have faulted and jumped to this location at this point\n\n    // Call our sleep handler\n    ldr(ARMEmitter::XReg::x0, &l_CTX);\n    mov(ARMEmitter::XReg::x1, STATE);\n    ldr(ARMEmitter::XReg::x2, &l_Sleep);\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      GenerateIndirectRuntimeCall<void, void*, void*>(ARMEmitter::Reg::r2);\n    } else {\n      blr(ARMEmitter::Reg::r2);\n    }\n\n    PauseReturnInstruction = GetCursorAddress<uint64_t>();\n    // Fault to start running again\n    hlt(0);\n  }\n\n  {\n    // The expectation here is that a thunked function needs to call back in to the JIT in a reentrant safe way\n    // To do this safely we need to do some state tracking and register saving\n    //\n    // eg:\n    // JIT Call->\n    //  Thunk->\n    //    Thunk callback->\n    //\n    // The thunk callback needs to execute JIT code and when it returns, it needs to safely return to the thunk rather than JIT space\n    // This is handled by pushing a return address trampoline to the stack so when the guest address returns it hits our custom thunk return\n    //  - This will safely return us to the thunk\n    //\n    // On return to the thunk, the thunk can get whatever its return value is from the thread context depending on ABI handling on its end\n    // When the thunk itself returns, it'll do its regular return logic there\n    // void ReentrantCallback(FEXCore::Core::InternalThreadState *Thread, uint64_t RIP);\n    CallbackPtr = GetCursorAddress<JITCallback>();\n\n    // We expect the thunk to have previously pushed the registers it was using\n    PushCalleeSavedRegisters();\n\n    // First thing we need to move the thread state pointer back in to our register\n    mov(STATE, ARMEmitter::XReg::x0);\n\n    // Make sure to adjust the refcounter so we don't clear the cache now\n    ldr(ARMEmitter::WReg::w2, STATE_PTR(CpuStateFrame, SignalHandlerRefCounter));\n    add(ARMEmitter::Size::i32Bit, ARMEmitter::Reg::r2, ARMEmitter::Reg::r2, 1);\n    str(ARMEmitter::WReg::w2, STATE_PTR(CpuStateFrame, SignalHandlerRefCounter));\n\n    // Now push the callback return trampoline to the guest stack\n    // Guest will be misaligned because calling a thunk won't correct the guest's stack once we call the callback from the host\n    ldr(ARMEmitter::XReg::x0, STATE_PTR(CpuStateFrame, Pointers.ThunkCallbackRet));\n\n    ldr(ARMEmitter::XReg::x2, STATE_PTR(CpuStateFrame, State.gregs[X86State::REG_RSP]));\n    sub(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r2, ARMEmitter::Reg::r2, CTX->Config.Is64BitMode ? 16 : 12);\n    str(ARMEmitter::XReg::x2, STATE_PTR(CpuStateFrame, State.gregs[X86State::REG_RSP]));\n\n    // Store the trampoline to the guest stack\n    // Guest stack is now correctly misaligned after a regular call instruction\n    str(ARMEmitter::XReg::x0, ARMEmitter::Reg::r2, 0);\n\n    // Store RIP to the context state\n    str(ARMEmitter::XReg::x1, STATE_PTR(CpuStateFrame, State.rip));\n\n    // load static regs\n    FillStaticRegs();\n    stp<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::zr, ARMEmitter::XReg::zr, REG_CALLRET_SP, -0x10);\n\n    // Now go back to the regular dispatcher loop\n    (void)b(&LoopTop);\n  }\n\n  auto EmitLongALUOpHandler = [&](auto R, auto Offset) {\n    auto Address = GetCursorAddress<uint64_t>();\n\n    PushDynamicRegs(TMP4);\n    SpillStaticRegs(TMP4);\n\n    if (!TMP_ABIARGS) {\n      mov(ARMEmitter::XReg::x0, TMP1);\n      mov(ARMEmitter::XReg::x1, TMP2);\n      mov(ARMEmitter::XReg::x2, TMP3);\n    }\n\n    ldr(ARMEmitter::XReg::x3, R, Offset);\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      GenerateIndirectRuntimeCall<__uint128_t, uint64_t, uint64_t, uint64_t>(ARMEmitter::Reg::r3);\n    } else {\n      blr(ARMEmitter::Reg::r3);\n    }\n\n    // Result is now in x0, x1\n    if (!TMP_ABIARGS) {\n      mov(TMP1, ARMEmitter::XReg::x0);\n      mov(TMP2, ARMEmitter::XReg::x1);\n    }\n\n    FillStaticRegs();\n\n    // Fix the stack and any values that were stepped on\n    PopDynamicRegs();\n\n    // Go back to our code block\n    ret();\n    return Address;\n  };\n\n  LUDIVHandlerAddress = EmitLongALUOpHandler(STATE_PTR(CpuStateFrame, Pointers.LUDIV));\n  LDIVHandlerAddress = EmitLongALUOpHandler(STATE_PTR(CpuStateFrame, Pointers.LDIV));\n\n  EmitF64Sin();\n  EmitF64Cos();\n  EmitF64Tan();\n\n  // Interpreter fallbacks\n  {\n    constexpr static std::array<FallbackABI, FABI_UNKNOWN> ABIS {{\n      FABI_F80_I16_F32_PTR,\n      FABI_F80_I16_F64_PTR,\n      FABI_F80_I16_I16_PTR,\n      FABI_F80_I16_I32_PTR,\n      FABI_F32_I16_F80_PTR,\n      FABI_F64_I16_F80_PTR,\n      FABI_F64_F64_PTR,\n      FABI_F64_F64_F64_PTR,\n      FABI_I16_I16_F80_PTR,\n      FABI_I32_I16_F80_PTR,\n      FABI_I64_I16_F80_PTR,\n      FABI_I64_I16_F80_F80_PTR,\n      FABI_F80_I16_F80_PTR,\n      FABI_F80_I16_F80_F80_PTR,\n      FABI_F80x2_I16_F80_PTR,\n      FABI_F64x2_F64_PTR,\n      FABI_I32_I64_I64_V128_V128_I16,\n      FABI_I32_V128_V128_I16,\n    }};\n\n    for (auto ABI : ABIS) {\n      ABIPointers[ABI] = GenerateABICall(ABI);\n    }\n  }\n\n  (void)Bind(&l_CTX);\n  dc64(reinterpret_cast<uintptr_t>(CTX));\n  (void)Bind(&l_Sleep);\n  dc64(reinterpret_cast<uint64_t>(SleepThread));\n  (void)Bind(&l_CompileBlock);\n  FEXCore::Utils::MemberFunctionToPointerCast PMFCompileBlock(&FEXCore::Context::ContextImpl::CompileBlock);\n  dc64(PMFCompileBlock.GetConvertedPointer());\n  (void)Bind(&l_CompileSingleStep);\n\n  FEXCore::Utils::MemberFunctionToPointerCast PMFCompileSingleStep(&FEXCore::Context::ContextImpl::CompileSingleStep);\n  dc64(PMFCompileSingleStep.GetConvertedPointer());\n\n  Start = reinterpret_cast<uint64_t>(DispatchPtr);\n  End = GetCursorAddress<uint64_t>();\n  ClearICache(reinterpret_cast<void*>(DispatchPtr), End - reinterpret_cast<uint64_t>(DispatchPtr));\n\n  if (CTX->Config.BlockJITNaming()) {\n    fextl::string Name = fextl::fmt::format(\"Dispatch_{}\", FHU::Syscalls::gettid());\n    CTX->Symbols.RegisterNamedRegion(reinterpret_cast<void*>(DispatchPtr), End - reinterpret_cast<uint64_t>(DispatchPtr), Name);\n  }\n  if (CTX->Config.GlobalJITNaming()) {\n    CTX->Symbols.RegisterJITSpace(reinterpret_cast<void*>(DispatchPtr), End - reinterpret_cast<uint64_t>(DispatchPtr));\n  }\n\n#ifdef VIXL_DISASSEMBLER\n  if (Disassemble() & FEXCore::Config::Disassemble::DISPATCHER) {\n    const auto DisasmEnd = GetCursorAddress<const vixl::aarch64::Instruction*>();\n    for (auto PCToDecode = DisasmBegin; PCToDecode < DisasmEnd; PCToDecode += 4) {\n      DisasmDecoder->Decode(PCToDecode);\n      auto Output = Disasm->GetOutput();\n      LogMan::Msg::IFmt(\"{}\", Output);\n    }\n  }\n#endif\n}\n\n#ifdef VIXL_SIMULATOR\nvoid Dispatcher::ExecuteDispatch(FEXCore::Core::CpuStateFrame* Frame) {\n  Simulator.WriteXRegister(0, reinterpret_cast<int64_t>(Frame));\n  Simulator.WriteXRegister(1, 0);\n  Simulator.RunFrom(reinterpret_cast< const vixl::aarch64::Instruction*>(DispatchPtr));\n}\n\nvoid Dispatcher::ExecuteJITCallback(FEXCore::Core::CpuStateFrame* Frame, uint64_t RIP) {\n  Simulator.WriteXRegister(0, reinterpret_cast<int64_t>(Frame));\n  Simulator.WriteXRegister(1, RIP);\n  Simulator.RunFrom(reinterpret_cast< const vixl::aarch64::Instruction*>(CallbackPtr));\n}\n\n#endif\n\nvoid Dispatcher::EmitI32ToExtF80() {\n  ARMEmitter::ForwardLabel ZeroCase;\n  ARMEmitter::ForwardLabel Done;\n\n  (void)cbz(ARMEmitter::Size::i32Bit, TMP2, &ZeroCase);\n\n  lsr(ARMEmitter::Size::i32Bit, TMP4, TMP2, 31);\n  tst(ARMEmitter::Size::i32Bit, TMP2, TMP2);\n  neg(ARMEmitter::Size::i32Bit, TMP3, TMP2);\n  csel(ARMEmitter::Size::i32Bit, TMP3, TMP3, TMP2, ARMEmitter::Condition::CC_MI);\n\n  clz(ARMEmitter::Size::i32Bit, TMP1, TMP3);\n\n  mov(ARMEmitter::Size::i32Bit, TMP2, 0x401E);\n  sub(ARMEmitter::Size::i32Bit, TMP2, TMP2, TMP1);\n  orr(ARMEmitter::Size::i32Bit, TMP2, TMP2, TMP4, ARMEmitter::ShiftType::LSL, 15);\n\n  lslv(ARMEmitter::Size::i32Bit, TMP3, TMP3, TMP1);\n\n  lsl(ARMEmitter::Size::i64Bit, TMP3, TMP3, 32);\n\n  fmov(ARMEmitter::Size::i64Bit, VTMP1.D(), TMP3);\n  ins(ARMEmitter::SubRegSize::i16Bit, VTMP1, 4, TMP2);\n\n  (void)b(&Done);\n\n  (void)Bind(&ZeroCase);\n  movi(ARMEmitter::SubRegSize::i64Bit, VTMP1.Q(), 0);\n\n  (void)Bind(&Done);\n}\n\nvoid Dispatcher::EmitI16ToExtF80() {\n  sxth(ARMEmitter::Size::i32Bit, TMP2, TMP2);\n\n  ARMEmitter::ForwardLabel ZeroCase;\n  ARMEmitter::ForwardLabel Done;\n\n  (void)cbz(ARMEmitter::Size::i32Bit, TMP2, &ZeroCase);\n\n  lsr(ARMEmitter::Size::i32Bit, TMP4, TMP2, 31);\n  tst(ARMEmitter::Size::i32Bit, TMP2, TMP2);\n  neg(ARMEmitter::Size::i32Bit, TMP3, TMP2);\n  csel(ARMEmitter::Size::i32Bit, TMP3, TMP3, TMP2, ARMEmitter::Condition::CC_MI);\n\n  clz(ARMEmitter::Size::i32Bit, TMP1, TMP3);\n\n  mov(ARMEmitter::Size::i32Bit, TMP2, 0x401E);\n  sub(ARMEmitter::Size::i32Bit, TMP2, TMP2, TMP1);\n  orr(ARMEmitter::Size::i32Bit, TMP2, TMP2, TMP4, ARMEmitter::ShiftType::LSL, 15);\n\n  lslv(ARMEmitter::Size::i32Bit, TMP3, TMP3, TMP1);\n\n  lsl(ARMEmitter::Size::i64Bit, TMP3, TMP3, 32);\n\n  fmov(ARMEmitter::Size::i64Bit, VTMP1.D(), TMP3);\n  ins(ARMEmitter::SubRegSize::i16Bit, VTMP1, 4, TMP2);\n\n  (void)b(&Done);\n\n  (void)Bind(&ZeroCase);\n  movi(ARMEmitter::SubRegSize::i64Bit, VTMP1.Q(), 0);\n\n  (void)Bind(&Done);\n}\n\nvoid Dispatcher::EmitF32ToExtF80() {\n  ARMEmitter::ForwardLabel InfNaN;\n  ARMEmitter::ForwardLabel ZeroDenormal;\n  ARMEmitter::ForwardLabel Denormal;\n  ARMEmitter::ForwardLabel NaN;\n  ARMEmitter::ForwardLabel Done;\n  ARMEmitter::BiDirectionalLabel NormalPath;\n  ARMEmitter::ForwardLabel ZeroResult;\n\n  fmov(ARMEmitter::Size::i32Bit, TMP1, VTMP1.S());\n\n  ubfx(ARMEmitter::Size::i32Bit, TMP2, TMP1, 23, 8);\n  and_(ARMEmitter::Size::i32Bit, TMP3, TMP1, 0x007FFFFF);\n  lsr(ARMEmitter::Size::i32Bit, TMP4, TMP1, 31);\n\n  cmp(ARMEmitter::Size::i32Bit, TMP2, 0xFF);\n  (void)b(ARMEmitter::Condition::CC_EQ, &InfNaN);\n\n  (void)cbz(ARMEmitter::Size::i32Bit, TMP2, &ZeroDenormal);\n\n  (void)Bind(&NormalPath);\n  // Exponent bias adjustment, where bias is 0x3F80\n  LoadConstant(ARMEmitter::Size::i32Bit, TMP1, 0x3F80);\n  add(ARMEmitter::Size::i32Bit, TMP2, TMP2, TMP1);\n  orr(ARMEmitter::Size::i32Bit, TMP2, TMP2, TMP4, ARMEmitter::ShiftType::LSL, 15);\n\n  // Set implicit bit and shift fraction to extF80 position\n  LoadConstant(ARMEmitter::Size::i64Bit, TMP1, 0x00800000ULL);\n  orr(ARMEmitter::Size::i64Bit, TMP3, TMP3, TMP1);\n  lsl(ARMEmitter::Size::i64Bit, TMP3, TMP3, 40);\n\n  fmov(ARMEmitter::Size::i64Bit, VTMP1.D(), TMP3);\n  ins(ARMEmitter::SubRegSize::i16Bit, VTMP1, 4, TMP2);\n  (void)b(&Done);\n\n  (void)Bind(&ZeroDenormal);\n  (void)cbz(ARMEmitter::Size::i32Bit, TMP3, &ZeroResult);\n\n  (void)Bind(&Denormal);\n  clz(ARMEmitter::Size::i32Bit, TMP1, TMP3);\n  sub(ARMEmitter::Size::i32Bit, TMP1, TMP1, 8);\n  mov(ARMEmitter::Size::i32Bit, TMP2, 1);\n  sub(ARMEmitter::Size::i32Bit, TMP2, TMP2, TMP1);\n  lslv(ARMEmitter::Size::i32Bit, TMP3, TMP3, TMP1);\n  (void)b(&NormalPath);\n\n  (void)Bind(&ZeroResult);\n  lsl(ARMEmitter::Size::i32Bit, TMP2, TMP4, 15);\n  movi(ARMEmitter::SubRegSize::i64Bit, VTMP1.Q(), 0);\n  ins(ARMEmitter::SubRegSize::i16Bit, VTMP1, 4, TMP2);\n  (void)b(&Done);\n\n  (void)Bind(&InfNaN);\n  (void)cbnz(ARMEmitter::Size::i32Bit, TMP3, &NaN);\n\n  lsl(ARMEmitter::Size::i32Bit, TMP2, TMP4, 15);\n  orr(ARMEmitter::Size::i32Bit, TMP2, TMP2, 0x7FFF);\n\n  LoadConstant(ARMEmitter::Size::i64Bit, TMP3, 0x8000000000000000ULL);\n  fmov(ARMEmitter::Size::i64Bit, VTMP1.D(), TMP3);\n  ins(ARMEmitter::SubRegSize::i16Bit, VTMP1, 4, TMP2);\n  (void)b(&Done);\n\n  (void)Bind(&NaN);\n  lsl(ARMEmitter::Size::i32Bit, TMP2, TMP4, 15);\n  orr(ARMEmitter::Size::i32Bit, TMP2, TMP2, 0x7FFF);\n\n  lsl(ARMEmitter::Size::i64Bit, TMP3, TMP3, 40);\n  LoadConstant(ARMEmitter::Size::i64Bit, TMP1, 0xC000000000000000ULL);\n  orr(ARMEmitter::Size::i64Bit, TMP3, TMP3, TMP1);\n\n  fmov(ARMEmitter::Size::i64Bit, VTMP1.D(), TMP3);\n  ins(ARMEmitter::SubRegSize::i16Bit, VTMP1, 4, TMP2);\n\n  (void)Bind(&Done);\n}\n\nvoid Dispatcher::EmitF64ToExtF80() {\n  ARMEmitter::ForwardLabel InfNaN;\n  ARMEmitter::ForwardLabel ZeroDenormal;\n  ARMEmitter::ForwardLabel Denormal;\n  ARMEmitter::ForwardLabel NaN;\n  ARMEmitter::ForwardLabel Done;\n  ARMEmitter::BiDirectionalLabel NormalPath;\n  ARMEmitter::ForwardLabel ZeroResult;\n\n  fmov(ARMEmitter::Size::i64Bit, TMP1, VTMP1.D());\n\n  lsr(ARMEmitter::Size::i64Bit, TMP4, TMP1, 63);\n  ubfx(ARMEmitter::Size::i64Bit, TMP2, TMP1, 52, 11);\n  LoadConstant(ARMEmitter::Size::i64Bit, TMP3, 0x000FFFFFFFFFFFFFULL);\n  and_(ARMEmitter::Size::i64Bit, TMP3, TMP1, TMP3);\n\n  cmp(ARMEmitter::Size::i64Bit, TMP2, 0x7FF);\n  (void)b(ARMEmitter::Condition::CC_EQ, &InfNaN);\n\n  (void)cbz(ARMEmitter::Size::i64Bit, TMP2, &ZeroDenormal);\n\n  (void)Bind(&NormalPath);\n  // Exponent bias adjustment where bias difference is 0x3C00\n  add(ARMEmitter::Size::i64Bit, TMP2, TMP2, 0x3000);\n  add(ARMEmitter::Size::i64Bit, TMP2, TMP2, 0xC00);\n  orr(ARMEmitter::Size::i64Bit, TMP2, TMP2, TMP4, ARMEmitter::ShiftType::LSL, 15);\n\n  LoadConstant(ARMEmitter::Size::i64Bit, TMP1, 0x0010000000000000ULL);\n  orr(ARMEmitter::Size::i64Bit, TMP3, TMP3, TMP1);\n  lsl(ARMEmitter::Size::i64Bit, TMP3, TMP3, 11);\n\n  fmov(ARMEmitter::Size::i64Bit, VTMP1.D(), TMP3);\n  ins(ARMEmitter::SubRegSize::i16Bit, VTMP1, 4, TMP2);\n  (void)b(&Done);\n\n  (void)Bind(&ZeroDenormal);\n  (void)cbz(ARMEmitter::Size::i64Bit, TMP3, &ZeroResult);\n\n  (void)Bind(&Denormal);\n  clz(ARMEmitter::Size::i64Bit, TMP1, TMP3);\n  sub(ARMEmitter::Size::i64Bit, TMP1, TMP1, 11);\n  mov(ARMEmitter::Size::i64Bit, TMP2, 1);\n  sub(ARMEmitter::Size::i64Bit, TMP2, TMP2, TMP1);\n  lslv(ARMEmitter::Size::i64Bit, TMP3, TMP3, TMP1);\n  (void)b(&NormalPath);\n\n  (void)Bind(&ZeroResult);\n  lsl(ARMEmitter::Size::i64Bit, TMP2, TMP4, 15);\n  movi(ARMEmitter::SubRegSize::i64Bit, VTMP1.Q(), 0);\n  ins(ARMEmitter::SubRegSize::i16Bit, VTMP1, 4, TMP2);\n  (void)b(&Done);\n\n  (void)Bind(&InfNaN);\n  (void)cbnz(ARMEmitter::Size::i64Bit, TMP3, &NaN);\n\n  lsl(ARMEmitter::Size::i64Bit, TMP2, TMP4, 15);\n  orr(ARMEmitter::Size::i64Bit, TMP2, TMP2, 0x7FFF);\n\n  LoadConstant(ARMEmitter::Size::i64Bit, TMP3, 0x8000000000000000ULL);\n  fmov(ARMEmitter::Size::i64Bit, VTMP1.D(), TMP3);\n  ins(ARMEmitter::SubRegSize::i16Bit, VTMP1, 4, TMP2);\n  (void)b(&Done);\n\n  (void)Bind(&NaN);\n  lsl(ARMEmitter::Size::i64Bit, TMP2, TMP4, 15);\n  orr(ARMEmitter::Size::i64Bit, TMP2, TMP2, 0x7FFF);\n\n  lsl(ARMEmitter::Size::i64Bit, TMP3, TMP3, 11);\n  LoadConstant(ARMEmitter::Size::i64Bit, TMP1, 0xC000000000000000ULL);\n  orr(ARMEmitter::Size::i64Bit, TMP3, TMP3, TMP1);\n\n  fmov(ARMEmitter::Size::i64Bit, VTMP1.D(), TMP3);\n  ins(ARMEmitter::SubRegSize::i16Bit, VTMP1, 4, TMP2);\n\n  (void)Bind(&Done);\n}\n\nvoid Dispatcher::EmitF64Sin() {\n  F64SinHandlerAddress = GetCursorAddress<uint64_t>();\n\n  constexpr auto V2 = ARMEmitter::VReg::v2;\n  constexpr auto V3 = ARMEmitter::VReg::v3;\n  constexpr auto V4 = ARMEmitter::VReg::v4;\n  constexpr auto V5 = ARMEmitter::VReg::v5;\n\n  ARMEmitter::ForwardLabel Fallback, NonZero;\n  ARMEmitter::ForwardLabel InvPiPi1Label, Pi23Label;\n  ARMEmitter::ForwardLabel C0Label, C1Label, C2Label, C3Label, C4Label, C5Label, C6Label;\n  ARMEmitter::ForwardLabel RangeLabel;\n\n  // sin(+/-0) = +/-0\n  fmov(ARMEmitter::Size::i64Bit, TMP1, VTMP1.D());\n  lsl(ARMEmitter::Size::i64Bit, TMP1, TMP1, 1);\n  (void)cbnz(ARMEmitter::Size::i64Bit, TMP1, &NonZero);\n  ret();\n  (void)Bind(&NonZero);\n\n  // Save q2-q5.\n  stp<ARMEmitter::IndexType::PRE>(ARMEmitter::QReg::q2, ARMEmitter::QReg::q3, ARMEmitter::Reg::rsp, -64);\n  stp<ARMEmitter::IndexType::OFFSET>(ARMEmitter::QReg::q4, ARMEmitter::QReg::q5, ARMEmitter::Reg::rsp, 32);\n\n  // save nzcv\n  mrs(TMP1, ARMEmitter::SystemRegister::NZCV);\n  str(TMP1.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n\n  // Range check: fall back for |x| >= 2^23, NaN, and inf.\n  fabs(VTMP2.D(), VTMP1.D());\n  ldr(V2.D(), &RangeLabel);\n  fcmp(VTMP2.D(), V2.D());\n  (void)b(ARMEmitter::Condition::CC_HS, &Fallback);\n\n  // n = rint(x/pi).\n  ldr(V2.Q(), &InvPiPi1Label); // q2 = {inv_pi, pi_1}\n  fmul(VTMP2.D(), VTMP1.D(), V2.D());\n  frinta(VTMP2.D(), VTMP2.D());\n\n  // odd = (int(n) & 1) << 63.\n  fcvtzs(ARMEmitter::Size::i64Bit, TMP1, VTMP2.D());\n  lsl(ARMEmitter::Size::i64Bit, TMP1, TMP1, 63);\n\n  // r = x - n*pi (range reduction) via .2D lane-indexed FMLS.\n  ldr(V3.Q(), &Pi23Label);                                            // q3 = {pi_2, pi_3}\n  fmov(V4.D(), VTMP1.D());                                            // r = x\n  fmls(ARMEmitter::SubRegSize::i64Bit, V4.Q(), VTMP2.Q(), V2.Q(), 1); // r -= n * pi_1\n  fmls(ARMEmitter::SubRegSize::i64Bit, V4.Q(), VTMP2.Q(), V3.Q(), 0); // r -= n * pi_2\n  fmls(ARMEmitter::SubRegSize::i64Bit, V4.Q(), VTMP2.Q(), V3.Q(), 1); // r -= n * pi_3\n\n  // r^2, r^4.\n  fmul(V5.D(), V4.D(), V4.D());\n  fmov(ARMEmitter::Size::i64Bit, TMP2, V4.D());\n  fmul(V3.D(), V5.D(), V5.D());\n\n  // Estrin polynomial: p = c0 + r2*c1 + r4*(c2 + r2*c3) + r8*(c4 + r2*c5 + r4*c6).\n  // Level 1 (independent FMAs).\n  ldr(VTMP1.D(), &C0Label);\n  ldr(VTMP2.D(), &C1Label);\n  fmadd(VTMP1.D(), V5.D(), VTMP2.D(), VTMP1.D()); // p01 = c0 + r2*c1\n\n  ldr(VTMP2.D(), &C2Label);\n  ldr(V2.D(), &C3Label);\n  fmadd(VTMP2.D(), V5.D(), V2.D(), VTMP2.D()); // p23 = c2 + r2*c3\n\n  ldr(V2.D(), &C4Label);\n  ldr(V4.D(), &C5Label);\n  fmadd(V2.D(), V5.D(), V4.D(), V2.D()); // p45 = c4 + r2*c5\n\n  // Level 2 (serial).\n  ldr(V4.D(), &C6Label);\n  fmadd(V2.D(), V3.D(), V4.D(), V2.D());          // p46 = p45 + r4*c6\n  fmadd(VTMP2.D(), V3.D(), V2.D(), VTMP2.D());    // p26 = p23 + r4*p46\n  fmadd(VTMP1.D(), V3.D(), VTMP2.D(), VTMP1.D()); // p06 = p01 + r4*p26\n\n  // y = r + r^3 * p06.\n  fmov(ARMEmitter::Size::i64Bit, V4.D(), TMP2);\n  fmul(V5.D(), V5.D(), V4.D());\n  fmadd(VTMP1.D(), V5.D(), VTMP1.D(), V4.D());\n\n  // result = y XOR odd.\n  fmov(ARMEmitter::Size::i64Bit, TMP2, VTMP1.D());\n  eor(ARMEmitter::Size::i64Bit, TMP2, TMP2, TMP1);\n  fmov(ARMEmitter::Size::i64Bit, VTMP1.D(), TMP2);\n\n  // restore nzcv\n  ldr(TMP1.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n  msr(ARMEmitter::SystemRegister::NZCV, TMP1);\n\n  // Restore q2-q5 and return.\n  ldp<ARMEmitter::IndexType::OFFSET>(ARMEmitter::QReg::q4, ARMEmitter::QReg::q5, ARMEmitter::Reg::rsp, 32);\n  ldp<ARMEmitter::IndexType::POST>(ARMEmitter::QReg::q2, ARMEmitter::QReg::q3, ARMEmitter::Reg::rsp, 64);\n  ret();\n\n  // Fallback path.\n  (void)Bind(&Fallback);\n  ldp<ARMEmitter::IndexType::OFFSET>(ARMEmitter::QReg::q4, ARMEmitter::QReg::q5, ARMEmitter::Reg::rsp, 32);\n  ldp<ARMEmitter::IndexType::POST>(ARMEmitter::QReg::q2, ARMEmitter::QReg::q3, ARMEmitter::Reg::rsp, 64);\n  str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n  ldr(TMP1, STATE_PTR(CpuStateFrame, Pointers.FallbackHandlerPointers[FEXCore::Core::OPINDEX_F64SIN].ABIHandler));\n  ldr(TMP4, STATE_PTR(CpuStateFrame, Pointers.FallbackHandlerPointers[FEXCore::Core::OPINDEX_F64SIN].Func));\n  blr(TMP1);\n  ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n  ret();\n\n  // Constant pool.\n  Align(16);\n  (void)Bind(&InvPiPi1Label);\n  dc64(0x3FD4'5F30'6DC9'C883ULL); // inv_pi\n  dc64(0x4009'21FB'5444'2D18ULL); // pi_1\n  (void)Bind(&Pi23Label);\n  dc64(0x3CA1'A626'3314'5C06ULL); // pi_2\n  dc64(0x395C'1CD1'2902'4E09ULL); // pi_3\n  (void)Bind(&C0Label);\n  dc64(0xBFC5'5555'5555'547BULL); // c0\n  (void)Bind(&C1Label);\n  dc64(0x3F81'1111'1110'8A4DULL); // c1\n  (void)Bind(&C2Label);\n  dc64(0xBF2A'01A0'1993'6F27ULL); // c2\n  (void)Bind(&C3Label);\n  dc64(0x3EC7'1DE3'7A97'D93EULL); // c3\n  (void)Bind(&C4Label);\n  dc64(0xBE5A'E633'9199'87C6ULL); // c4\n  (void)Bind(&C5Label);\n  dc64(0x3DE6'0E27'7AE0'7CECULL); // c5\n  (void)Bind(&C6Label);\n  dc64(0xBD69'E954'0300'A100ULL); // c6\n  (void)Bind(&RangeLabel);\n  dc64(0x4160'0000'0000'0000ULL); // 2^23\n}\n\nvoid Dispatcher::EmitF64Cos() {\n  F64CosHandlerAddress = GetCursorAddress<uint64_t>();\n\n  constexpr auto Accum = ARMEmitter::VReg::v2;\n\n  ARMEmitter::ForwardLabel Fallback;\n  ARMEmitter::ForwardLabel RangeLabel, InvPiLabel;\n  ARMEmitter::ForwardLabel Pi1Label, Pi2Label, Pi3Label;\n  ARMEmitter::ForwardLabel C0Label, C1Label, C2Label, C3Label, C4Label, C5Label, C6Label;\n\n  // Save q2 for use as accumulator\n  str<ARMEmitter::IndexType::PRE>(ARMEmitter::QReg::q2, ARMEmitter::Reg::rsp, -16);\n\n  // save nzcv\n  mrs(TMP1, ARMEmitter::SystemRegister::NZCV);\n  str(TMP1.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n\n  // Range check: fall back for |x| >= 2^23, NaN, and inf.\n  fabs(VTMP2.D(), VTMP1.D());\n  ldr(Accum.D(), &RangeLabel);\n  fcmp(VTMP2.D(), Accum.D());\n  (void)b(ARMEmitter::Condition::CC_HS, &Fallback);\n\n  // n = rint(x * (1/pi) + 0.5).\n  ldr(Accum.D(), &InvPiLabel);\n  fmov(ARMEmitter::ScalarRegSize::i64Bit, VTMP2, 0.5f);\n  fmadd(VTMP2.D(), VTMP1.D(), Accum.D(), VTMP2.D());\n  frinta(VTMP2.D(), VTMP2.D());\n\n  // odd = (int(n) & 1) << 63.\n  fcvtzs(ARMEmitter::Size::i64Bit, TMP1, VTMP2.D());\n  lsl(ARMEmitter::Size::i64Bit, TMP1, TMP1, 63);\n\n  // Save input to Accum before overwriting VTMP1.\n  fmov(Accum.D(), VTMP1.D());\n\n  // n = n - 0.5.\n  fmov(ARMEmitter::ScalarRegSize::i64Bit, VTMP1, 0.5f);\n  fsub(VTMP2.D(), VTMP2.D(), VTMP1.D());\n\n  // r = x - n*pi (range reduction), in extended precision.\n  ldr(VTMP1.D(), &Pi1Label);\n  fmsub(Accum.D(), VTMP2.D(), VTMP1.D(), Accum.D());\n  ldr(VTMP1.D(), &Pi2Label);\n  fmsub(Accum.D(), VTMP2.D(), VTMP1.D(), Accum.D());\n  ldr(VTMP1.D(), &Pi3Label);\n  fmsub(Accum.D(), VTMP2.D(), VTMP1.D(), Accum.D());\n\n  // sin(r) poly approx.\n  fmul(VTMP1.D(), Accum.D(), Accum.D());\n  fmov(ARMEmitter::Size::i64Bit, TMP2, Accum.D());\n\n  // Horner: p = c6 + r2*(c5 + r2*(... + r2*c0)).\n  ldr(VTMP2.D(), &C6Label);\n  ldr(Accum.D(), &C5Label);\n  fmadd(VTMP2.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n  ldr(Accum.D(), &C4Label);\n  fmadd(VTMP2.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n  ldr(Accum.D(), &C3Label);\n  fmadd(VTMP2.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n  ldr(Accum.D(), &C2Label);\n  fmadd(VTMP2.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n  ldr(Accum.D(), &C1Label);\n  fmadd(VTMP2.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n  ldr(Accum.D(), &C0Label);\n  fmadd(VTMP2.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n\n  // y = r + r^3 * p.\n  fmov(ARMEmitter::Size::i64Bit, Accum.D(), TMP2);\n  fmul(VTMP1.D(), VTMP1.D(), Accum.D());\n  fmadd(Accum.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n\n  // result = y XOR odd.\n  fmov(ARMEmitter::Size::i64Bit, TMP2, Accum.D());\n  eor(ARMEmitter::Size::i64Bit, TMP2, TMP2, TMP1);\n  fmov(ARMEmitter::Size::i64Bit, VTMP1.D(), TMP2);\n\n  // restore nzcv\n  ldr(TMP1.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n  msr(ARMEmitter::SystemRegister::NZCV, TMP1);\n\n  // Restore q2 and return.\n  ldr<ARMEmitter::IndexType::POST>(ARMEmitter::QReg::q2, ARMEmitter::Reg::rsp, 16);\n  ret();\n\n  // Fallback path.\n  (void)Bind(&Fallback);\n  ldr<ARMEmitter::IndexType::POST>(ARMEmitter::QReg::q2, ARMEmitter::Reg::rsp, 16);\n  str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n  ldr(TMP1, STATE_PTR(CpuStateFrame, Pointers.FallbackHandlerPointers[FEXCore::Core::OPINDEX_F64COS].ABIHandler));\n  ldr(TMP4, STATE_PTR(CpuStateFrame, Pointers.FallbackHandlerPointers[FEXCore::Core::OPINDEX_F64COS].Func));\n  blr(TMP1);\n  ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n  ret();\n\n  // Constant pool.\n  Align(16);\n  (void)Bind(&InvPiLabel);\n  dc64(0x3FD4'5F30'6DC9'C883ULL); // inv_pi\n  (void)Bind(&Pi1Label);\n  dc64(0x4009'21FB'5444'2D18ULL); // pi_1\n  (void)Bind(&Pi2Label);\n  dc64(0x3CA1'A626'3314'5C06ULL); // pi_2\n  (void)Bind(&Pi3Label);\n  dc64(0x395C'1CD1'2902'4E09ULL); // pi_3\n  (void)Bind(&C0Label);\n  dc64(0xBFC5'5555'5555'547BULL); // c0\n  (void)Bind(&C1Label);\n  dc64(0x3F81'1111'1110'8A4DULL); // c1\n  (void)Bind(&C2Label);\n  dc64(0xBF2A'01A0'1993'6F27ULL); // c2\n  (void)Bind(&C3Label);\n  dc64(0x3EC7'1DE3'7A97'D93EULL); // c3\n  (void)Bind(&C4Label);\n  dc64(0xBE5A'E633'9199'87C6ULL); // c4\n  (void)Bind(&C5Label);\n  dc64(0x3DE6'0E27'7AE0'7CECULL); // c5\n  (void)Bind(&C6Label);\n  dc64(0xBD69'E954'0300'A100ULL); // c6\n  (void)Bind(&RangeLabel);\n  dc64(0x4160'0000'0000'0000ULL); // 2^23\n}\n\nvoid Dispatcher::EmitF64Tan() {\n  F64TanHandlerAddress = GetCursorAddress<uint64_t>();\n\n  constexpr auto Accum = ARMEmitter::VReg::v2;\n\n  ARMEmitter::ForwardLabel Fallback, NonZero;\n  ARMEmitter::ForwardLabel RangeLabel, TwoOverPiLabel;\n  ARMEmitter::ForwardLabel HalfPi0Label, HalfPi1Label;\n  ARMEmitter::ForwardLabel C0Label, C1Label, C2Label, C3Label, C4Label, C5Label, C6Label, C7Label, C8Label;\n\n  // tan(+/-0) = +/-0\n  fmov(ARMEmitter::Size::i64Bit, TMP1, VTMP1.D());\n  lsl(ARMEmitter::Size::i64Bit, TMP1, TMP1, 1);\n  (void)cbnz(ARMEmitter::Size::i64Bit, TMP1, &NonZero);\n  ret();\n  (void)Bind(&NonZero);\n\n  // Save q2 for use as accumulator\n  str<ARMEmitter::IndexType::PRE>(ARMEmitter::QReg::q2, ARMEmitter::Reg::rsp, -16);\n\n  // save nzcv\n  mrs(TMP1, ARMEmitter::SystemRegister::NZCV);\n  str(TMP1.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n\n  // Range check: fall back for |x| >= 2^23, NaN, and inf.\n  fabs(VTMP2.D(), VTMP1.D());\n  ldr(Accum.D(), &RangeLabel);\n  fcmp(VTMP2.D(), Accum.D());\n  (void)b(ARMEmitter::Condition::CC_HS, &Fallback);\n\n  // q = nearest integer to 2 * x / pi.\n  ldr(VTMP2.D(), &TwoOverPiLabel);\n  fmul(VTMP2.D(), VTMP1.D(), VTMP2.D());\n  frinta(VTMP2.D(), VTMP2.D());\n\n  // qi = int(q).\n  fcvtzs(ARMEmitter::Size::i64Bit, TMP1, VTMP2.D());\n\n  // r = x - q * pi/2 (range reduction), in extended precision.\n  fmov(Accum.D(), VTMP1.D());\n  ldr(VTMP1.D(), &HalfPi0Label);\n  fmsub(Accum.D(), VTMP2.D(), VTMP1.D(), Accum.D());\n  ldr(VTMP1.D(), &HalfPi1Label);\n  fmsub(Accum.D(), VTMP2.D(), VTMP1.D(), Accum.D());\n\n  // Further reduce r to [-pi/8, pi/8].\n  fmov(ARMEmitter::ScalarRegSize::i64Bit, VTMP1, 0.5f);\n  fmul(Accum.D(), Accum.D(), VTMP1.D());\n\n  // Approximate tan(r) using order 8 polynomial.\n  fmul(VTMP1.D(), Accum.D(), Accum.D());\n  fmov(ARMEmitter::Size::i64Bit, TMP2, Accum.D());\n\n  // Horner: p = C8 + r2*(C7 + r2*(... + r2*C0)).\n  ldr(VTMP2.D(), &C8Label);\n  ldr(Accum.D(), &C7Label);\n  fmadd(VTMP2.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n  ldr(Accum.D(), &C6Label);\n  fmadd(VTMP2.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n  ldr(Accum.D(), &C5Label);\n  fmadd(VTMP2.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n  ldr(Accum.D(), &C4Label);\n  fmadd(VTMP2.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n  ldr(Accum.D(), &C3Label);\n  fmadd(VTMP2.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n  ldr(Accum.D(), &C2Label);\n  fmadd(VTMP2.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n  ldr(Accum.D(), &C1Label);\n  fmadd(VTMP2.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n  ldr(Accum.D(), &C0Label);\n  fmadd(VTMP2.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n\n  // p = r + r^3 * p.\n  fmov(ARMEmitter::Size::i64Bit, Accum.D(), TMP2);\n  fmul(VTMP1.D(), VTMP1.D(), Accum.D());\n  fmadd(Accum.D(), VTMP1.D(), VTMP2.D(), Accum.D());\n\n  // Double-angle reconstruction: tan(2x) = 2*tan(x) / (1 - tan^2(x)).\n  fadd(VTMP1.D(), Accum.D(), Accum.D());\n  fmul(VTMP2.D(), Accum.D(), Accum.D());\n  fmov(ARMEmitter::ScalarRegSize::i64Bit, Accum, 1.0f);\n  fsub(VTMP2.D(), VTMP2.D(), Accum.D());\n\n  ARMEmitter::ForwardLabel SkipSwap;\n  (void)tbnz(TMP1, 0, &SkipSwap);\n\n  fneg(Accum.D(), VTMP1.D());\n  fmov(VTMP1.D(), VTMP2.D());\n  fmov(VTMP2.D(), Accum.D());\n\n  (void)Bind(&SkipSwap);\n\n  // result = numerator / denominator -> VTMP1.\n  fdiv(VTMP1.D(), VTMP2.D(), VTMP1.D());\n\n  // restore nzcv\n  ldr(TMP1.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n  msr(ARMEmitter::SystemRegister::NZCV, TMP1);\n\n  // Restore q2 and return.\n  ldr<ARMEmitter::IndexType::POST>(ARMEmitter::QReg::q2, ARMEmitter::Reg::rsp, 16);\n  ret();\n\n  // Fallback path.\n  (void)Bind(&Fallback);\n  ldr<ARMEmitter::IndexType::POST>(ARMEmitter::QReg::q2, ARMEmitter::Reg::rsp, 16);\n  str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n  ldr(TMP1, STATE_PTR(CpuStateFrame, Pointers.FallbackHandlerPointers[FEXCore::Core::OPINDEX_F64TAN].ABIHandler));\n  ldr(TMP4, STATE_PTR(CpuStateFrame, Pointers.FallbackHandlerPointers[FEXCore::Core::OPINDEX_F64TAN].Func));\n  blr(TMP1);\n  ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n  ret();\n\n  // Constant pool.\n  Align(16);\n  (void)Bind(&TwoOverPiLabel);\n  dc64(0x3FE4'5F30'6DC9'C883ULL); // two_over_pi\n  (void)Bind(&HalfPi0Label);\n  dc64(0x3FF9'21FB'5444'2D18ULL); // half_pi[0]\n  (void)Bind(&HalfPi1Label);\n  dc64(0x3C91'A626'3314'5C07ULL); // half_pi[1]\n  (void)Bind(&C0Label);\n  dc64(0x3FD5'5555'5555'5556ULL); // C0\n  (void)Bind(&C1Label);\n  dc64(0x3FC1'1111'1111'0A63ULL); // C1\n  (void)Bind(&C2Label);\n  dc64(0x3FAB'A1BA'1BB4'6414ULL); // C2\n  (void)Bind(&C3Label);\n  dc64(0x3F96'64F4'7E5B'5445ULL); // C3\n  (void)Bind(&C4Label);\n  dc64(0x3F82'26E5'E5EC'DFA3ULL); // C4\n  (void)Bind(&C5Label);\n  dc64(0x3F6D'6C7D'DBF8'7047ULL); // C5\n  (void)Bind(&C6Label);\n  dc64(0x3F57'EA75'D05B'583EULL); // C6\n  (void)Bind(&C7Label);\n  dc64(0x3F42'89F2'2964'A03CULL); // C7\n  (void)Bind(&C8Label);\n  dc64(0x3F34'E4FD'1414'7622ULL); // C8\n  (void)Bind(&RangeLabel);\n  dc64(0x4160'0000'0000'0000ULL); // 2^23\n}\n\nuint64_t Dispatcher::GenerateABICall(FallbackABI ABI) {\n  auto Address = GetCursorAddress<uint64_t>();\n  constexpr static auto FallbackPointerReg = TMP4;\n  constexpr static auto ABI1 = ARMEmitter::XReg::x0;\n  constexpr static auto ABI2 = ARMEmitter::XReg::x1;\n  constexpr static auto ABI3 = ARMEmitter::XReg::x2;\n\n  constexpr static auto VABI1 = ARMEmitter::VReg::v0;\n  constexpr static auto VABI2 = ARMEmitter::VReg::v1;\n\n  auto FillF80x2Result = [&]() {\n    if (!TMP_ABIARGS) {\n      mov(VTMP1.Q(), VABI1.Q());\n      mov(VTMP2.Q(), VABI2.Q());\n    }\n    FillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, true);\n  };\n\n  auto FillF64x2Result = [&]() {\n    if (!TMP_ABIARGS) {\n      fmov(VTMP1.D(), VABI1.D());\n      fmov(VTMP2.D(), VABI2.D());\n    }\n    FillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, true);\n  };\n\n  auto FillF80Result = [&]() {\n    if (VTMP1 != VABI1) {\n      mov(VTMP1.Q(), VABI1.Q());\n    }\n    FillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, true);\n  };\n\n  auto FillF64Result = [&]() {\n    if (!TMP_ABIARGS) {\n      fmov(VTMP1.D(), VABI1.D());\n    }\n    FillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, true);\n  };\n\n  auto FillF32Result = [&]() {\n    if (!TMP_ABIARGS) {\n      fmov(VTMP1.S(), VABI1.S());\n    }\n    FillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, true);\n  };\n\n  auto FillI64Result = [&]() {\n    if (!TMP_ABIARGS) {\n      mov(TMP1, ARMEmitter::XReg::x0);\n    }\n    FillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, true);\n  };\n\n  auto FillI32Result = [&]() {\n    if (!TMP_ABIARGS) {\n      mov(TMP1.W(), ARMEmitter::WReg::w0);\n    }\n    FillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, true);\n  };\n\n  auto FillI16Result = [&]() {\n    if (!TMP_ABIARGS) {\n      mov(TMP1, ARMEmitter::XReg::x0);\n    }\n    FillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, true);\n  };\n\n  switch (ABI) {\n  case FABI_F80_I16_F32_PTR: {\n    // Save NZCV - it's a static register (guest x86 flags) and the inline code clobbers it\n    mrs(TMP1, ARMEmitter::SystemRegister::NZCV);\n    str(TMP1.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n    EmitF32ToExtF80();\n    ldr(TMP1.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n    msr(ARMEmitter::SystemRegister::NZCV, TMP1);\n  } break;\n  case FABI_F80_I16_F64_PTR: {\n    mrs(TMP1, ARMEmitter::SystemRegister::NZCV);\n    str(TMP1.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n    EmitF64ToExtF80();\n    ldr(TMP1.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n    msr(ARMEmitter::SystemRegister::NZCV, TMP1);\n  } break;\n  case FABI_F80_I16_I16_PTR: {\n    mrs(TMP1, ARMEmitter::SystemRegister::NZCV);\n    str(TMP1.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n    EmitI16ToExtF80();\n    ldr(TMP1.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n    msr(ARMEmitter::SystemRegister::NZCV, TMP1);\n  } break;\n  case FABI_F80_I16_I32_PTR: {\n    mrs(TMP1, ARMEmitter::SystemRegister::NZCV);\n    str(TMP1.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n    EmitI32ToExtF80();\n    ldr(TMP1.W(), STATE.R(), offsetof(FEXCore::Core::CpuStateFrame, State.flags[24]));\n    msr(ARMEmitter::SystemRegister::NZCV, TMP1);\n  } break;\n  case FABI_F32_I16_F80_PTR: {\n    // Linux Reg/Win32 Reg:\n    // tmp4 (x4/x13): FallbackHandler\n    // x30: return\n    // vtmp1 (v0/v16): source\n    SpillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, TMP3, true);\n\n    ldrh(ARMEmitter::WReg::w0, STATE, offsetof(FEXCore::Core::CPUState, FCW));\n    if (!TMP_ABIARGS) {\n      mov(VABI1.Q(), VTMP1.Q());\n    }\n\n    mov(ARMEmitter::XReg::x1, STATE);\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      GenerateIndirectRuntimeCall<float, uint16_t, FEXCore::VectorRegType, uint64_t>(FallbackPointerReg);\n    } else {\n      blr(FallbackPointerReg);\n    }\n\n    FillF32Result();\n  } break;\n  case FABI_F64_I16_F80_PTR: {\n    // Linux Reg/Win32 Reg:\n    // tmp4 (x4/x13): FallbackHandler\n    // x30: return\n    // vtmp1 (v0/v16): source\n    SpillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, TMP3, true);\n\n    ldrh(ARMEmitter::WReg::w0, STATE, offsetof(FEXCore::Core::CPUState, FCW));\n    if (!TMP_ABIARGS) {\n      mov(VABI1.Q(), VTMP1.Q());\n    }\n    mov(ARMEmitter::XReg::x1, STATE);\n\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      GenerateIndirectRuntimeCall<double, uint16_t, FEXCore::VectorRegType, uint64_t>(FallbackPointerReg);\n    } else {\n      blr(FallbackPointerReg);\n    }\n\n    FillF64Result();\n  } break;\n  case FABI_F64_F64_PTR: {\n    // Linux Reg/Win32 Reg:\n    // tmp4 (x4/x13): FallbackHandler\n    // x30: return\n    // vtmp1 (v0/v16): vector source\n    SpillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, TMP3, true);\n\n    if (!TMP_ABIARGS) {\n      fmov(VABI1.D(), VTMP1.D());\n    }\n    mov(ARMEmitter::XReg::x0, STATE);\n\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      GenerateIndirectRuntimeCall<double, double, uint64_t>(FallbackPointerReg);\n    } else {\n      blr(FallbackPointerReg);\n    }\n\n    FillF64Result();\n  } break;\n  case FABI_F64_F64_F64_PTR: {\n    // Linux Reg/Win32 Reg:\n    // tmp4 (x4/x13): FallbackHandler\n    // x30: return\n    // vtmp1 (v0/v16): vector source 1\n    // vtmp2 (v1/v17): vector source 2\n    SpillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, TMP3, true);\n\n    if (!TMP_ABIARGS) {\n      fmov(VABI1.D(), VTMP1.D());\n      fmov(VABI2.D(), VTMP2.D());\n    }\n\n    mov(ARMEmitter::XReg::x0, STATE);\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      GenerateIndirectRuntimeCall<double, double, double, uint64_t>(FallbackPointerReg);\n    } else {\n      blr(FallbackPointerReg);\n    }\n\n    FillF64Result();\n  } break;\n  case FABI_I16_I16_F80_PTR: {\n    // Linux Reg/Win32 Reg:\n    // tmp4 (x4/x13): FallbackHandler\n    // x30: return\n    // vtmp1 (v0/v16): source\n    SpillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, TMP3, true);\n\n    ldrh(ARMEmitter::WReg::w0, STATE, offsetof(FEXCore::Core::CPUState, FCW));\n    if (!TMP_ABIARGS) {\n      mov(VABI1.Q(), VTMP1.Q());\n    }\n    mov(ARMEmitter::XReg::x1, STATE);\n\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      GenerateIndirectRuntimeCall<uint32_t, uint16_t, FEXCore::VectorRegType, uint64_t>(FallbackPointerReg);\n    } else {\n      blr(FallbackPointerReg);\n    }\n\n    FillI16Result();\n  } break;\n  case FABI_I32_I16_F80_PTR: {\n    // Linux Reg/Win32 Reg:\n    // tmp4 (x4/x13): FallbackHandler\n    // x30: return\n    // vtmp1 (v0/v16): source\n    SpillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, TMP3, true);\n\n    ldrh(ARMEmitter::WReg::w0, STATE, offsetof(FEXCore::Core::CPUState, FCW));\n    if (!TMP_ABIARGS) {\n      mov(VABI1.Q(), VTMP1.Q());\n    }\n    mov(ARMEmitter::XReg::x1, STATE);\n\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      GenerateIndirectRuntimeCall<uint32_t, uint16_t, FEXCore::VectorRegType, uint64_t>(FallbackPointerReg);\n    } else {\n      blr(FallbackPointerReg);\n    }\n\n    FillI32Result();\n  } break;\n  case FABI_I64_I16_F80_PTR: {\n    // Linux Reg/Win32 Reg:\n    // tmp4 (x4/x13): FallbackHandler\n    // x30: return\n    // vtmp1 (v0/v16): source\n    SpillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, TMP3, true);\n\n    ldrh(ARMEmitter::WReg::w0, STATE, offsetof(FEXCore::Core::CPUState, FCW));\n    if (!TMP_ABIARGS) {\n      mov(VABI1.Q(), VTMP1.Q());\n    }\n    mov(ARMEmitter::XReg::x1, STATE);\n\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      GenerateIndirectRuntimeCall<uint64_t, uint16_t, FEXCore::VectorRegType, uint64_t>(FallbackPointerReg);\n    } else {\n      blr(FallbackPointerReg);\n    }\n\n    FillI64Result();\n  } break;\n  case FABI_I64_I16_F80_F80_PTR: {\n    // Linux Reg/Win32 Reg:\n    // tmp4 (x4/x13): FallbackHandler\n    // x30: return\n    // vtmp1 (v0/v16): vector source 1\n    // vtmp2 (v1/v17): vector source 2\n    SpillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, TMP3, true);\n\n    ldrh(ARMEmitter::WReg::w0, STATE, offsetof(FEXCore::Core::CPUState, FCW));\n    if (!TMP_ABIARGS) {\n      mov(VABI1.Q(), VTMP1.Q());\n      mov(VABI2.Q(), VTMP2.Q());\n    }\n    mov(ARMEmitter::XReg::x1, STATE);\n\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      GenerateIndirectRuntimeCall<uint64_t, uint16_t, FEXCore::VectorRegType, FEXCore::VectorRegType, uint64_t>(FallbackPointerReg);\n    } else {\n      blr(FallbackPointerReg);\n    }\n\n    FillI64Result();\n  } break;\n  case FABI_F80_I16_F80_PTR: {\n    // Linux Reg/Win32 Reg:\n    // tmp4 (x4/x13): FallbackHandler\n    // x30: return\n    // vtmp1 (v0/v16): vector source 1\n    SpillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, TMP3, true);\n\n    ldrh(ARMEmitter::WReg::w0, STATE, offsetof(FEXCore::Core::CPUState, FCW));\n    mov(ARMEmitter::XReg::x1, STATE);\n    if (!TMP_ABIARGS) {\n      mov(VABI1.Q(), VTMP1.Q());\n    }\n\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      GenerateIndirectRuntimeCall<FEXCore::VectorRegType, uint16_t, FEXCore::VectorRegType, uint64_t>(FallbackPointerReg);\n    } else {\n      blr(FallbackPointerReg);\n    }\n\n    FillF80Result();\n  } break;\n  case FABI_F80_I16_F80_F80_PTR: {\n    // Linux Reg/Win32 Reg:\n    // tmp4 (x4/x13): FallbackHandler\n    // x30: return\n    // vtmp1 (v0/v16): vector source 1\n    // vtmp2 (v1/v17): vector source 2\n    SpillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, TMP3, true);\n\n    ldrh(ARMEmitter::WReg::w0, STATE, offsetof(FEXCore::Core::CPUState, FCW));\n    if (!TMP_ABIARGS) {\n      mov(VABI1.Q(), VTMP1.Q());\n      mov(VABI2.Q(), VTMP2.Q());\n    }\n    mov(ARMEmitter::XReg::x1, STATE);\n\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      GenerateIndirectRuntimeCall<FEXCore::VectorRegType, uint16_t, FEXCore::VectorRegType, FEXCore::VectorRegType, uint64_t>(FallbackPointerReg);\n    } else {\n      blr(FallbackPointerReg);\n    }\n\n    FillF80Result();\n  } break;\n  case FABI_F80x2_I16_F80_PTR: {\n    // Linux Reg/Win32 Reg:\n    // tmp4 (x4/x13): FallbackHandler\n    // x30: return\n    // vtmp1 (v0/v16): vector source 1\n    // vtmp2 (v1/v16): vector source 2\n\n    SpillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, TMP3, true);\n\n    ldrh(ARMEmitter::WReg::w0, STATE, offsetof(FEXCore::Core::CPUState, FCW));\n    mov(ARMEmitter::XReg::x1, STATE);\n    if (!TMP_ABIARGS) {\n      mov(VABI1.Q(), VTMP1.Q());\n    }\n\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      // GenerateIndirectRuntimeCall<FEXCore::VectorRegPairType, uint16_t, FEXCore::VectorRegType, uint64_t>(FallbackPointerReg);\n    } else {\n      blr(FallbackPointerReg);\n    }\n\n    FillF80x2Result();\n  } break;\n  case FABI_F64x2_F64_PTR: {\n    // Linux Reg/Win32 Reg:\n    // tmp4 (x4/x13): FallbackHandler\n    // x30: return\n    // vtmp1 (v0/v16): vector source 1\n    // vtmp2 (v1/v16): vector source 2\n\n    SpillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, TMP3, true);\n\n    mov(ARMEmitter::XReg::x0, STATE);\n    if (!TMP_ABIARGS) {\n      fmov(VABI1.D(), VTMP1.D());\n    }\n\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      // GenerateIndirectRuntimeCall<FEXCore::VectorScalarF64Pair, FEXCore::VectorRegType, uint64_t>(FallbackPointerReg);\n    } else {\n      blr(FallbackPointerReg);\n    }\n\n    FillF64x2Result();\n  } break;\n  case FABI_I32_I64_I64_V128_V128_I16: {\n    // Linux Reg/Win32 Reg:\n    // stack: FallbackHandler\n    // x30: return\n    // vtmp1 (v0/v16): vector source 1\n    // vtmp2 (v1/v17): vector source 2\n    // tmp1 (x0/x10): source 1\n    // tmp2 (x1/x11): source 2\n    // tmp3 (x2/x12): source 3\n\n    const size_t OriginalSPOffset = SpillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, TMP4, true);\n\n    // Load the Fallback handler pointer from the stack.\n    ldr(FallbackPointerReg, ARMEmitter::XReg::rsp, OriginalSPOffset);\n\n    if (!TMP_ABIARGS) {\n      mov(ABI1, TMP1);\n      mov(ABI2, TMP2);\n      mov(ABI3, TMP3);\n      mov(VABI1.Q(), VTMP1.Q());\n      mov(VABI2.Q(), VTMP2.Q());\n    }\n\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      GenerateIndirectRuntimeCall<uint32_t, uint64_t, uint64_t, FEXCore::VectorRegType, FEXCore::VectorRegType, uint16_t>(FallbackPointerReg);\n    } else {\n      blr(FallbackPointerReg);\n    }\n\n    FillI32Result();\n  } break;\n  case FABI_I32_V128_V128_I16: {\n    // Linux Reg/Win32 Reg:\n    // tmp4 (x4/x13): FallbackHandler\n    // x30: return\n    // vtmp1 (v0/v16): vector source 1\n    // vtmp2 (v1/v17): vector source 2\n    // tmp1 (x0/x10): source 1\n    SpillForABICall(CTX->HostFeatures.SupportsPreserveAllABI, TMP3, true);\n\n    if (!TMP_ABIARGS) {\n      mov(VABI1.Q(), VTMP1.Q());\n      mov(VABI2.Q(), VTMP2.Q());\n      mov(ABI1, TMP1);\n    }\n\n    if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n      GenerateIndirectRuntimeCall<uint32_t, FEXCore::VectorRegType, FEXCore::VectorRegType, uint16_t>(FallbackPointerReg);\n    } else {\n      blr(FallbackPointerReg);\n    }\n\n    FillI32Result();\n  } break;\n  case FABI_UNKNOWN:\n  default:\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    LOGMAN_MSG_A_FMT(\"Unhandled IR Fallback ABI: {}\", ToUnderlying(ABI));\n#endif\n    break;\n  }\n\n  // Return to JIT\n  ret();\n\n  return Address;\n}\n\nvoid Dispatcher::InitThreadPointers(FEXCore::Core::InternalThreadState* Thread) {\n  // Setup dispatcher specific pointers that need to be accessed from JIT code\n  {\n    auto& Ptrs = Thread->CurrentFrame->Pointers;\n\n    Ptrs.DispatcherLoopTop = AbsoluteLoopTopAddress;\n    Ptrs.DispatcherLoopTopFillSRA = AbsoluteLoopTopAddressFillSRA;\n    Ptrs.DispatcherLoopTopEnterEC = AbsoluteLoopTopAddressEnterEC;\n    Ptrs.DispatcherLoopTopEnterECFillSRA = AbsoluteLoopTopAddressEnterECFillSRA;\n    Ptrs.ExitFunctionLinker = ExitFunctionLinkerAddress;\n    Ptrs.ThreadStopHandlerSpillSRA = ThreadStopHandlerAddressSpillSRA;\n    Ptrs.ThreadPauseHandlerSpillSRA = ThreadPauseHandlerAddressSpillSRA;\n    Ptrs.GuestSignal_SIGILL = GuestSignal_SIGILL;\n    Ptrs.GuestSignal_SIGTRAP = GuestSignal_SIGTRAP;\n    Ptrs.GuestSignal_SIGSEGV = GuestSignal_SIGSEGV;\n    Ptrs.SignalReturnHandler = SignalHandlerReturnAddress;\n    Ptrs.SignalReturnHandlerRT = SignalHandlerReturnAddressRT;\n    Ptrs.LUDIVHandler = LUDIVHandlerAddress;\n    Ptrs.LDIVHandler = LDIVHandlerAddress;\n    Ptrs.F64SinHandler = F64SinHandlerAddress;\n    Ptrs.F64CosHandler = F64CosHandlerAddress;\n    Ptrs.F64TanHandler = F64TanHandlerAddress;\n\n    // Fill in the fallback handlers\n    InterpreterOps::FillFallbackIndexPointers(Ptrs.FallbackHandlerPointers, &ABIPointers[0]);\n  }\n}\n\nSignalDelegatorConfig Dispatcher::MakeSignalDelegatorConfig() const {\n  // PF/AF are the final two SRA registers. We only want GPRs\n  const auto GPRCount = uint16_t(StaticRegisters.size() - 2);\n  const auto FPRCount = uint16_t(StaticFPRegisters.size());\n\n  const auto GetSRAGPRMapping = [GPRCount, this] {\n    SignalDelegatorConfig::SRAIndexMapping Mapping {};\n    for (size_t i = 0; i < GPRCount; ++i) {\n      Mapping[i] = StaticRegisters[i].Idx();\n    }\n    return Mapping;\n  };\n\n  const auto GetSRAFPRMapping = [FPRCount, this] {\n    SignalDelegatorConfig::SRAIndexMapping Mapping {};\n    for (size_t i = 0; i < FPRCount; ++i) {\n      Mapping[i] = StaticFPRegisters[i].Idx();\n    }\n    return Mapping;\n  };\n\n  return FEXCore::SignalDelegatorConfig {\n    .DispatcherBegin = Start,\n    .DispatcherEnd = End,\n\n    .AbsoluteLoopTopAddress = AbsoluteLoopTopAddress,\n    .AbsoluteLoopTopAddressFillSRA = AbsoluteLoopTopAddressFillSRA,\n    .SignalHandlerReturnAddress = SignalHandlerReturnAddress,\n    .SignalHandlerReturnAddressRT = SignalHandlerReturnAddressRT,\n\n    .PauseReturnInstruction = PauseReturnInstruction,\n    .ThreadPauseHandlerAddressSpillSRA = ThreadPauseHandlerAddressSpillSRA,\n    .ThreadPauseHandlerAddress = ThreadPauseHandlerAddress,\n\n    // Stop handlers.\n    .ThreadStopHandlerAddressSpillSRA = ThreadStopHandlerAddressSpillSRA,\n    .ThreadStopHandlerAddress = ThreadStopHandlerAddress,\n\n    // SRA information.\n    .SRAGPRCount = GPRCount,\n    .SRAFPRCount = FPRCount,\n\n    .SRAGPRMapping = GetSRAGPRMapping(),\n    .SRAFPRMapping = GetSRAFPRMapping(),\n  };\n}\n\nfextl::unique_ptr<Dispatcher> Dispatcher::Create(FEXCore::Context::ContextImpl* CTX) {\n  return fextl::make_unique<Dispatcher>(CTX);\n}\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/Dispatcher/Dispatcher.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"Interface/Core/ArchHelpers/Arm64Emitter.h\"\n#include \"Interface/Core/Interpreter/InterpreterOps.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/fextl/memory.h>\n\n#include <array>\n#include <cstddef>\n#include <cstdint>\n\nnamespace FEXCore {\nstruct GuestSigAction;\nstruct SignalDelegatorConfig;\n} // namespace FEXCore\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\nstruct InternalThreadState;\n} // namespace FEXCore::Core\n\nnamespace FEXCore::Context {\nclass ContextImpl;\n}\n\nnamespace FEXCore::CPU {\n\n#define STATE_PTR(STATE_TYPE, FIELD) STATE.R(), offsetof(FEXCore::Core::STATE_TYPE, FIELD)\n#define STATE_PTR_IDX(STATE_TYPE, FIELD, INDEX) STATE.R(), ARRAY_OFFSETOF(FEXCore::Core::STATE_TYPE, FIELD, INDEX)\n#define FALLBACK_HANDLER_OFFSET(INDEX, FIELD) \\\n  STATE.R(),                                  \\\n    (ARRAY_OFFSETOF(FEXCore::Core::CpuStateFrame, Pointers.FallbackHandlerPointers, INDEX) + offsetof(FEXCore::Core::FallbackABIInfo, FIELD))\n\nclass Dispatcher final : public Arm64Emitter {\npublic:\n  static fextl::unique_ptr<Dispatcher> Create(FEXCore::Context::ContextImpl* CTX);\n\n  Dispatcher(FEXCore::Context::ContextImpl* ctx);\n  ~Dispatcher();\n\n  void InitThreadPointers(FEXCore::Core::InternalThreadState* Thread);\n\n#ifdef VIXL_SIMULATOR\n  void ExecuteDispatch(FEXCore::Core::CpuStateFrame* Frame);\n  void ExecuteJITCallback(FEXCore::Core::CpuStateFrame* Frame, uint64_t RIP);\n#else\n  void ExecuteDispatch(FEXCore::Core::CpuStateFrame* Frame) {\n    DispatchPtr(Frame, false);\n  }\n\n  void ExecuteJITCallback(FEXCore::Core::CpuStateFrame* Frame, uint64_t RIP) {\n    CallbackPtr(Frame, RIP);\n  }\n#endif\n\n  uint64_t GetExitFunctionLinkerAddress() const {\n    return ExitFunctionLinkerAddress;\n  }\n\n  SignalDelegatorConfig MakeSignalDelegatorConfig() const;\n\nprotected:\n  FEXCore::Context::ContextImpl* CTX;\n\n  using AsmDispatch = void (*)(FEXCore::Core::CpuStateFrame* Frame, bool SingleInst);\n  using JITCallback = void (*)(FEXCore::Core::CpuStateFrame* Frame, uint64_t RIP);\n\n  AsmDispatch DispatchPtr;\n  JITCallback CallbackPtr;\nprivate:\n  /**\n   * @name Dispatch Helper functions\n   * @{ */\n  uint64_t ThreadStopHandlerAddress {};\n  uint64_t ThreadStopHandlerAddressSpillSRA {};\n  uint64_t AbsoluteLoopTopAddress {};\n  uint64_t AbsoluteLoopTopAddressFillSRA {};\n  uint64_t AbsoluteLoopTopAddressEnterEC {};\n  uint64_t AbsoluteLoopTopAddressEnterECFillSRA {};\n  uint64_t ThreadPauseHandlerAddress {};\n  uint64_t ThreadPauseHandlerAddressSpillSRA {};\n  uint64_t ExitFunctionLinkerAddress {};\n  uint64_t SignalHandlerReturnAddress {};\n  uint64_t SignalHandlerReturnAddressRT {};\n  uint64_t GuestSignal_SIGILL {};\n  uint64_t GuestSignal_SIGTRAP {};\n  uint64_t GuestSignal_SIGSEGV {};\n\n  uint64_t PauseReturnInstruction {};\n  std::array<uint64_t, FallbackABI::FABI_UNKNOWN> ABIPointers {};\n  /**  @} */\n\n  uint64_t Start {};\n  uint64_t End {};\n\n  // Long division helpers\n  uint64_t LUDIVHandlerAddress {};\n  uint64_t LDIVHandlerAddress {};\n\n  // F64 trig shared handlers\n  uint64_t F64SinHandlerAddress {};\n  uint64_t F64CosHandlerAddress {};\n  uint64_t F64TanHandlerAddress {};\n\n  void EmitDispatcher();\n  uint64_t GenerateABICall(FallbackABI ABI);\n\n  // Inline softfloat conversion emitters - avoid FPCR save/restore overhead\n  // These emit ARM64 code that performs the conversion using only integer ops\n  void EmitI16ToExtF80();\n  void EmitI32ToExtF80();\n  void EmitF32ToExtF80();\n  void EmitF64ToExtF80();\n\n  void EmitF64Sin();\n  void EmitF64Cos();\n  void EmitF64Tan();\n\n  FEX_CONFIG_OPT(DisableL2Cache, DISABLEL2CACHE);\n};\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/Frontend.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-meta-blocks\ndesc: Extracts instruction & block meta info, frontend multiblock logic\n$end_info$\n*/\n\n#include \"Interface/Context/Context.h\"\n#include \"Interface/Core/Frontend.h\"\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/Core/LookupCache.h\"\n\n#include <array>\n#include <algorithm>\n#include <cstring>\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/Profiler.h>\n#include <FEXCore/Utils/Telemetry.h>\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/fextl/set.h>\n\nnamespace FEXCore::Frontend {\n#include \"Interface/Core/VSyscall/VSyscall.inc\"\n\nusing namespace FEXCore::X86Tables;\n\nstatic uint32_t MapModRMToReg(uint8_t REX, uint8_t bits, bool HighBits, bool HasREX, bool HasXMM, bool HasMM, uint8_t InvalidOffset = 16) {\n  using GPRArray = std::array<uint32_t, 16>;\n\n  static constexpr GPRArray GPR8BitHighIndexes = {\n    // Classical ordering?\n    FEXCore::X86State::REG_RAX, FEXCore::X86State::REG_RCX, FEXCore::X86State::REG_RDX, FEXCore::X86State::REG_RBX,\n    FEXCore::X86State::REG_RAX, FEXCore::X86State::REG_RCX, FEXCore::X86State::REG_RDX, FEXCore::X86State::REG_RBX,\n    FEXCore::X86State::REG_R8,  FEXCore::X86State::REG_R9,  FEXCore::X86State::REG_R10, FEXCore::X86State::REG_R11,\n    FEXCore::X86State::REG_R12, FEXCore::X86State::REG_R13, FEXCore::X86State::REG_R14, FEXCore::X86State::REG_R15,\n  };\n\n  uint8_t Offset = (REX << 3) | bits;\n\n  if (Offset == InvalidOffset) {\n    return FEXCore::X86State::REG_INVALID;\n  }\n\n  if (HasXMM) {\n    return FEXCore::X86State::REG_XMM_0 + Offset;\n  } else if (HasMM) {\n    return FEXCore::X86State::REG_MM_0 + bits; // Ignore REX extension for MMX registers\n  } else if (!(HighBits && !HasREX)) {\n    return FEXCore::X86State::REG_RAX + Offset;\n  }\n\n  return GPR8BitHighIndexes[Offset];\n}\n\nstatic uint32_t MapVEXToReg(uint8_t vvvv, bool HasXMM) {\n  if (HasXMM) {\n    return FEXCore::X86State::REG_XMM_0 + vvvv;\n  } else {\n    return FEXCore::X86State::REG_RAX + vvvv;\n  }\n}\n\nDecoder::Decoder(FEXCore::Core::InternalThreadState* Thread)\n  : Thread {Thread}\n  , CTX {static_cast<FEXCore::Context::ContextImpl*>(Thread->CTX)}\n  , OSABI {CTX->SyscallHandler ? CTX->SyscallHandler->GetOSABI() : FEXCore::HLE::SyscallOSABI::OS_UNKNOWN}\n  , PoolObject {CTX->FrontendAllocator, sizeof(FEXCore::X86Tables::DecodedInst) * DefaultDecodedBufferSize} {\n\n  FEX_CONFIG_OPT(ReducedPrecision, X87REDUCEDPRECISION);\n  if (ReducedPrecision) {\n    X87Table = &FEXCore::X86Tables::X87F64Ops;\n  } else {\n    X87Table = &FEXCore::X86Tables::X87F80Ops;\n  }\n\n  if (CTX->HostFeatures.SupportsAVX && CTX->HostFeatures.SupportsSVE256) {\n    VEXTable = &FEXCore::X86Tables::VEXTableOps;\n    VEXTableGroup = &FEXCore::X86Tables::VEXTableGroupOps;\n  } else if (CTX->HostFeatures.SupportsAVX) {\n    VEXTable = &FEXCore::X86Tables::VEXTableOps_AVX128;\n    VEXTableGroup = &FEXCore::X86Tables::VEXTableGroupOps_AVX128;\n  }\n}\n\nbool Decoder::CheckRangeExecutable(uint64_t Address, uint64_t Size) {\n  while (Address < ExecutableRangeBase || Address + Size > ExecutableRangeEnd) {\n    auto RangeInfo = CTX->SyscallHandler->QueryGuestExecutableRange(Thread, Address);\n    ExecutableRangeBase = RangeInfo.Base;\n    ExecutableRangeEnd = RangeInfo.Base + RangeInfo.Size;\n    ExecutableRangeWritable = RangeInfo.Writable;\n\n    if (RangeInfo.Size == 0) {\n      return false;\n    }\n\n    uint64_t RangeRemainingSize = ExecutableRangeEnd - Address;\n    if (Size > RangeRemainingSize) {\n      Size -= RangeRemainingSize;\n      Address += RangeRemainingSize;\n    }\n  }\n\n  return true;\n}\n\nuint8_t Decoder::ReadByte() {\n  LOGMAN_THROW_A_FMT(InstructionSize < MAX_INST_SIZE, \"Max instruction size exceeded!\");\n  std::optional<uint8_t> Byte = PeekByte(0);\n  if (!Byte) {\n    HitNonExecutableRange = true;\n    // Pretend we read 0, the main decode loop will see HitNonExecutableRange and rollback the instruction.\n    return 0;\n  }\n\n  Instruction[InstructionSize] = *Byte;\n  InstructionSize++;\n  return *Byte;\n}\n\nstd::optional<uint8_t> Decoder::PeekByte(uint8_t Offset) {\n  uint64_t ByteAddress = reinterpret_cast<uint64_t>(InstStream + InstructionSize + Offset);\n  if (CheckRangeExecutable(ByteAddress, 1)) {\n    return InstStream[InstructionSize + Offset];\n  } else {\n    return std::nullopt;\n  }\n}\n\nstd::pair<uint64_t, bool> Decoder::ReadData(uint8_t Size) {\n  LOGMAN_THROW_A_FMT(Size != 0 && Size <= sizeof(uint64_t), \"Unknown data size to read\");\n\n  uint64_t Res = 0;\n  uint64_t Address = reinterpret_cast<uint64_t>(InstStream + InstructionSize);\n  if (CheckRangeExecutable(Address, Size)) {\n    std::memcpy(&Res, &InstStream[InstructionSize], Size);\n  } else {\n    HitNonExecutableRange = true;\n    // See PeekByte, this specific case may cause some executable memory to read as 0 but it doesn't matter as the entire instruction will be rolled back anyway.\n    Res = 0;\n  }\n\n\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  for (size_t i = 0; i < Size; ++i) {\n    ReadByte();\n  }\n#else\n  SkipBytes(Size);\n#endif\n\n  if (Relocations) {\n    uint32_t SectionOffset = static_cast<uint32_t>(Address - SectionMinAddress);\n    if (auto It = Relocations->find(SectionOffset); It != Relocations->end()) {\n      if (It->second == GuestRelocationType::Rel32 && Size == 4) {\n        return {static_cast<int64_t>(static_cast<int32_t>(Res) - static_cast<int32_t>(EntryPoint)), true};\n      } else if (It->second == GuestRelocationType::Rel64 && Size == 8) {\n        return {static_cast<int64_t>(Res) - static_cast<int64_t>(EntryPoint), true};\n      } else {\n        HitBadRelocation = true;\n        Res = 0;\n      }\n    }\n  }\n\n  return {Res, false};\n}\n\nvoid Decoder::DecodeModRM_16(X86Tables::DecodedOperand* Operand, X86Tables::ModRMDecoded ModRM) {\n  // 16bit modrm behaves similar to SIB but encoded directly in modrm\n  // mod != 0b11 case\n  // RM    | Result\n  // ===============\n  // 0b000 | [BX + SI]\n  // 0b001 | [BX + DI]\n  // 0b010 | [BP + SI]\n  // 0b011 | [BP + DI]\n  // 0b100 | [SI]\n  // 0b101 | [DI]\n  // 0b110 | {[BP], disp16}\n  // 0b111 | [BX]\n  // if mod = 0b00\n  //    0b110 = disp16\n  // if mod = 0b01\n  //    All encodings gain 8bit displacement\n  //    0b110 = [BP] + disp8\n  // if mod = 0b10\n  //    All encodings gain 16bit displacement\n  //    0b110 = [BP] + disp16\n  uint32_t Literal {};\n  uint8_t DisplacementSize {};\n  if ((ModRM.mod == 0 && ModRM.rm == 0b110) || ModRM.mod == 0b10) {\n    DisplacementSize = 2;\n  } else if (ModRM.mod == 0b01) {\n    DisplacementSize = 1;\n  }\n  if (DisplacementSize) {\n    bool IsRelocation = false;\n    std::tie(Literal, IsRelocation) = ReadData(DisplacementSize);\n    LOGMAN_THROW_A_FMT(!IsRelocation, \"1/2 byte relocations unsupported\");\n    if (DisplacementSize == 1) {\n      Literal = static_cast<int8_t>(Literal);\n    }\n  }\n\n  Operand->Type = DecodedOperand::OpType::SIB;\n  Operand->Data.SIB.Scale = 1;\n  Operand->Data.SIB.Offset = Literal;\n\n  // Only called when ModRM.mod != 0b11\n  struct Encodings {\n    uint8_t Base;\n    uint8_t Index;\n  };\n  constexpr static std::array<Encodings, 24> Lookup = {{\n    // Mod = 0b00\n    {FEXCore::X86State::REG_RBX, FEXCore::X86State::REG_RSI},\n    {FEXCore::X86State::REG_RBX, FEXCore::X86State::REG_RDI},\n    {FEXCore::X86State::REG_RBP, FEXCore::X86State::REG_RSI},\n    {FEXCore::X86State::REG_RBP, FEXCore::X86State::REG_RDI},\n    {FEXCore::X86State::REG_RSI, FEXCore::X86State::REG_INVALID},\n    {FEXCore::X86State::REG_RDI, FEXCore::X86State::REG_INVALID},\n    {FEXCore::X86State::REG_INVALID, FEXCore::X86State::REG_INVALID},\n    {FEXCore::X86State::REG_RBX, FEXCore::X86State::REG_INVALID},\n    // Mod = 0b01\n    {FEXCore::X86State::REG_RBX, FEXCore::X86State::REG_RSI},\n    {FEXCore::X86State::REG_RBX, FEXCore::X86State::REG_RDI},\n    {FEXCore::X86State::REG_RBP, FEXCore::X86State::REG_RSI},\n    {FEXCore::X86State::REG_RBP, FEXCore::X86State::REG_RDI},\n    {FEXCore::X86State::REG_RSI, FEXCore::X86State::REG_INVALID},\n    {FEXCore::X86State::REG_RDI, FEXCore::X86State::REG_INVALID},\n    {FEXCore::X86State::REG_RBP, FEXCore::X86State::REG_INVALID},\n    {FEXCore::X86State::REG_RBX, FEXCore::X86State::REG_INVALID},\n    // Mod = 0b10\n    {FEXCore::X86State::REG_RBX, FEXCore::X86State::REG_RSI},\n    {FEXCore::X86State::REG_RBX, FEXCore::X86State::REG_RDI},\n    {FEXCore::X86State::REG_RBP, FEXCore::X86State::REG_RSI},\n    {FEXCore::X86State::REG_RBP, FEXCore::X86State::REG_RDI},\n    {FEXCore::X86State::REG_RSI, FEXCore::X86State::REG_INVALID},\n    {FEXCore::X86State::REG_RDI, FEXCore::X86State::REG_INVALID},\n    {FEXCore::X86State::REG_RBP, FEXCore::X86State::REG_INVALID},\n    {FEXCore::X86State::REG_RBX, FEXCore::X86State::REG_INVALID},\n  }};\n\n  uint8_t LookupIndex = ModRM.mod << 3 | ModRM.rm;\n  auto it = Lookup[LookupIndex];\n  Operand->Data.SIB.Base = it.Base;\n  Operand->Data.SIB.Index = it.Index;\n}\n\nvoid Decoder::DecodeModRM_64(X86Tables::DecodedOperand* Operand, X86Tables::ModRMDecoded ModRM) {\n  uint8_t Displacement {};\n  // Do we have an offset?\n  if (ModRM.mod == 0b01) {\n    Displacement = 1;\n  } else if (ModRM.mod == 0b10) {\n    Displacement = 4;\n  } else if (ModRM.mod == 0 && ModRM.rm == 0b101) {\n    Displacement = 4;\n  }\n\n  // Calculate SIB\n  bool HasSIB = ((ModRM.mod != 0b11) && (ModRM.rm == 0b100));\n\n  if (HasSIB) {\n    FEXCore::X86Tables::SIBDecoded SIB;\n    if (DecodeInst->Flags & DecodeFlags::FLAG_DECODED_SIB) {\n      SIB.Hex = DecodeInst->SIB;\n    } else {\n      // Haven't yet grabbed SIB, pull it now\n      DecodeInst->SIB = ReadByte();\n      SIB.Hex = DecodeInst->SIB;\n      DecodeInst->Flags |= DecodeFlags::FLAG_DECODED_SIB;\n    }\n\n    // If the SIB base is 0b101, aka BP or R13 then we have a 32bit displacement\n    if (ModRM.mod == 0b00 && ModRM.rm == 0b100 && SIB.base == 0b101) {\n      Displacement = 4;\n    }\n\n    // SIB\n    Operand->Type = DecodedOperand::OpType::SIB;\n    Operand->Data.SIB.Scale = 1 << SIB.scale;\n\n    // The invalid encoding types are described at Table 1-12. \"promoted nsigned is always non-zero\"\n    {\n      // If we have a VSIB byte (as opposed to SIB), then the index register is a vector.\n      // DecodeInst->TableInfo may be null in the case of 3DNow! ModRM decoding.\n      const bool IsIndexVector = DecodeInst->TableInfo && (DecodeInst->TableInfo->Flags & InstFlags::FLAGS_VEX_VSIB) != 0;\n      uint8_t InvalidSIBIndex = 0b100; ///< SIB Index where there is no register encoding.\n      if (IsIndexVector) {\n        DecodeInst->Flags |= X86Tables::DecodeFlags::FLAG_VSIB_BYTE;\n        InvalidSIBIndex = ~0; ///< No Invalid SIB Index with Index Vectors.\n      }\n\n      const uint8_t IndexREX = (DecodeInst->Flags & DecodeFlags::FLAG_REX_XGPR_X) != 0 ? 1 : 0;\n      const uint8_t BaseREX = (DecodeInst->Flags & DecodeFlags::FLAG_REX_XGPR_B) != 0 ? 1 : 0;\n\n      Operand->Data.SIB.Index = MapModRMToReg(IndexREX, SIB.index, false, false, IsIndexVector, false, InvalidSIBIndex);\n      Operand->Data.SIB.Base = MapModRMToReg(BaseREX, SIB.base, false, false, false, false, ModRM.mod == 0 ? 0b101 : 16);\n    }\n\n    LOGMAN_THROW_A_FMT(Displacement <= 4, \"Number of bytes should be <= 4 for literal src\");\n\n    if (Displacement) {\n      auto [Literal, IsRelocation] = ReadData(Displacement);\n      if (IsRelocation) {\n        Operand->Type = DecodedOperand::OpType::SIBRelocation;\n      }\n      if (Displacement == 1) {\n        Literal = static_cast<int8_t>(Literal);\n      }\n      Operand->Data.SIB.Offset = Literal;\n    }\n  } else if (ModRM.mod == 0) {\n    // Explained in Table 1-14. \"Operand Addressing Using ModRM and SIB Bytes\"\n    if (ModRM.rm == 0b101) {\n      // 32bit Displacement\n      auto [Literal, IsRelocation] = ReadData(4);\n      Operand->Type = IsRelocation ? DecodedOperand::OpType::RIPRelativeRelocation : DecodedOperand::OpType::RIPRelative;\n      Operand->Data.RIPLiteral.Value = Literal;\n    } else {\n      // Register-direct addressing\n      Operand->Type = DecodedOperand::OpType::GPRDirect;\n      Operand->Data.GPR.GPR = MapModRMToReg(DecodeInst->Flags & DecodeFlags::FLAG_REX_XGPR_B ? 1 : 0, ModRM.rm, false, false, false, false);\n    }\n  } else {\n    uint8_t DisplacementSize = ModRM.mod == 1 ? 1 : 4;\n    auto [Literal, IsRelocation] = ReadData(DisplacementSize);\n    if (DisplacementSize == 1) {\n      Literal = static_cast<int8_t>(Literal);\n    }\n\n    Operand->Type = IsRelocation ? DecodedOperand::OpType::GPRIndirectRelocation : DecodedOperand::OpType::GPRIndirect;\n    Operand->Data.GPRIndirect.GPR = MapModRMToReg(DecodeInst->Flags & DecodeFlags::FLAG_REX_XGPR_B ? 1 : 0, ModRM.rm, false, false, false, false);\n    Operand->Data.GPRIndirect.Displacement = Literal;\n  }\n}\n\nbool Decoder::NormalOp(const FEXCore::X86Tables::X86InstInfo* Info, uint16_t Op, DecodedHeader Options) {\n  if (Info->Type == FEXCore::X86Tables::TYPE_ARCH_DISPATCHER) [[unlikely]] {\n    // Dispatcher Op.\n    // TODO: Move this in to `NormalOpHeader`, Dispatch tables have a bug currently where some subtables don't inherit flags correctly.\n    // Can be seen by running FEX asm tests if this is removed.\n    return NormalOp(&Info->OpcodeDispatcher.Indirect[BlockInfo.Is64BitMode ? 1 : 0], Op);\n  }\n\n  DecodeInst->OP = Op;\n  DecodeInst->TableInfo = Info;\n\n  if (Info->Type == FEXCore::X86Tables::TYPE_UNKNOWN) {\n    return false;\n  }\n\n  if (Info->Type == FEXCore::X86Tables::TYPE_INVALID) {\n    return false;\n  }\n\n  LOGMAN_THROW_A_FMT(!(Info->Type >= FEXCore::X86Tables::TYPE_GROUP_1 && Info->Type <= FEXCore::X86Tables::TYPE_GROUP_P), \"Group Ops \"\n                                                                                                                          \"should have \"\n                                                                                                                          \"been decoded \"\n                                                                                                                          \"before this!\");\n\n  uint8_t DestSize {};\n  const bool HasWideningDisplacement =\n    (FEXCore::X86Tables::DecodeFlags::GetOpAddr(DecodeInst->Flags, 0) & FEXCore::X86Tables::DecodeFlags::FLAG_WIDENING_SIZE_LAST) != 0 ||\n    (Options.w && BlockInfo.Is64BitMode);\n  const bool HasNarrowingDisplacement =\n    (FEXCore::X86Tables::DecodeFlags::GetOpAddr(DecodeInst->Flags, 0) & FEXCore::X86Tables::DecodeFlags::FLAG_OPERAND_SIZE_LAST) != 0;\n\n  const bool HasXMMFlags = (Info->Flags & InstFlags::FLAGS_XMM_FLAGS) != 0;\n  bool HasXMMSrc =\n    HasXMMFlags && !HAS_XMM_SUBFLAG(Info->Flags, InstFlags::FLAGS_SF_SRC_GPR) && !HAS_XMM_SUBFLAG(Info->Flags, InstFlags::FLAGS_SF_MMX_SRC);\n  bool HasXMMDst =\n    HasXMMFlags && !HAS_XMM_SUBFLAG(Info->Flags, InstFlags::FLAGS_SF_DST_GPR) && !HAS_XMM_SUBFLAG(Info->Flags, InstFlags::FLAGS_SF_MMX_DST);\n  bool HasMMSrc =\n    HasXMMFlags && !HAS_XMM_SUBFLAG(Info->Flags, InstFlags::FLAGS_SF_SRC_GPR) && HAS_XMM_SUBFLAG(Info->Flags, InstFlags::FLAGS_SF_MMX_SRC);\n  bool HasMMDst =\n    HasXMMFlags && !HAS_XMM_SUBFLAG(Info->Flags, InstFlags::FLAGS_SF_DST_GPR) && HAS_XMM_SUBFLAG(Info->Flags, InstFlags::FLAGS_SF_MMX_DST);\n\n  // Is ModRM present via explicit instruction encoded or REX?\n  const bool HasMODRM = !!(Info->Flags & FEXCore::X86Tables::InstFlags::FLAGS_MODRM);\n\n  const bool HasREX = !!(DecodeInst->Flags & DecodeFlags::FLAG_REX_PREFIX);\n  const bool Has16BitAddressing = !BlockInfo.Is64BitMode && DecodeInst->Flags & DecodeFlags::FLAG_ADDRESS_SIZE;\n\n  if (Options.w && (Info->Flags & InstFlags::FLAGS_REX_W_0)) {\n    return false;\n  } else if (!Options.w && (Info->Flags & InstFlags::FLAGS_REX_W_1)) {\n    return false;\n  }\n\n  if (Options.L && (Info->Flags & InstFlags::FLAGS_VEX_L_0)) {\n    return false;\n  } else if (!Options.L && (Info->Flags & InstFlags::FLAGS_VEX_L_1)) {\n    return false;\n  }\n\n  const bool UseVEXL = Options.L && !(Info->Flags & InstFlags::FLAGS_VEX_L_IGNORE);\n\n  // This is used for ModRM register modification\n  // For both modrm.reg and modrm.rm(when mod == 0b11) when value is >= 0b100\n  // then it changes from expected registers to the high 8bits of the lower registers\n  // Bit annoying to support\n  // In the case of no modrm (REX in byte situation) then it is unaffected\n  bool Is8BitSrc {};\n  bool Is8BitDest {};\n\n  // If we require ModRM and haven't decoded it yet, do it now\n  // Some instructions have to read modrm upfront, others do it later\n  if (HasMODRM && !(DecodeInst->Flags & DecodeFlags::FLAG_DECODED_MODRM)) {\n    DecodeInst->ModRM = ReadByte();\n    DecodeInst->Flags |= DecodeFlags::FLAG_DECODED_MODRM;\n  }\n\n  // New instruction size decoding\n  {\n    // Decode destinations first\n    const auto DstSizeFlag = FEXCore::X86Tables::InstFlags::GetSizeDstFlags(Info->Flags);\n    const auto SrcSizeFlag = FEXCore::X86Tables::InstFlags::GetSizeSrcFlags(Info->Flags);\n\n    if (DstSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_8BIT) {\n      DecodeInst->Flags |= DecodeFlags::GenSizeDstSize(DecodeFlags::SIZE_8BIT);\n      DestSize = 1;\n      Is8BitDest = true;\n    } else if (DstSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_16BIT) {\n      DecodeInst->Flags |= DecodeFlags::GenSizeDstSize(DecodeFlags::SIZE_16BIT);\n      DestSize = 2;\n    } else if (DstSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_128BIT) {\n      if (UseVEXL) {\n        DecodeInst->Flags |= DecodeFlags::GenSizeDstSize(DecodeFlags::SIZE_256BIT);\n        DestSize = 32;\n      } else {\n        DecodeInst->Flags |= DecodeFlags::GenSizeDstSize(DecodeFlags::SIZE_128BIT);\n        DestSize = 16;\n      }\n    } else if (DstSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_256BIT) {\n      DecodeInst->Flags |= DecodeFlags::GenSizeDstSize(DecodeFlags::SIZE_256BIT);\n      DestSize = 32;\n    } else if (HasNarrowingDisplacement &&\n               (DstSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_DEF || DstSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_64BITDEF)) {\n      // See table 1-2. Operand-Size Overrides for this decoding\n      // If the default operating mode is 32bit and we have the operand size flag then the operating size drops to 16bit\n      DecodeInst->Flags |= DecodeFlags::GenSizeDstSize(DecodeFlags::SIZE_16BIT);\n      DestSize = 2;\n    } else if ((HasXMMDst || HasMMDst || BlockInfo.Is64BitMode) && (HasWideningDisplacement || DstSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_64BIT ||\n                                                                    DstSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_64BITDEF)) {\n      DecodeInst->Flags |= DecodeFlags::GenSizeDstSize(DecodeFlags::SIZE_64BIT);\n      DestSize = 8;\n    } else {\n      DecodeInst->Flags |= DecodeFlags::GenSizeDstSize(DecodeFlags::SIZE_32BIT);\n      DestSize = 4;\n    }\n\n    // Decode sources\n    if (SrcSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_8BIT) {\n      DecodeInst->Flags |= DecodeFlags::GenSizeSrcSize(DecodeFlags::SIZE_8BIT);\n      Is8BitSrc = true;\n    } else if (SrcSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_16BIT) {\n      DecodeInst->Flags |= DecodeFlags::GenSizeSrcSize(DecodeFlags::SIZE_16BIT);\n    } else if (SrcSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_128BIT) {\n      if (UseVEXL) {\n        DecodeInst->Flags |= DecodeFlags::GenSizeSrcSize(DecodeFlags::SIZE_256BIT);\n      } else {\n        DecodeInst->Flags |= DecodeFlags::GenSizeSrcSize(DecodeFlags::SIZE_128BIT);\n      }\n    } else if (SrcSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_256BIT) {\n      DecodeInst->Flags |= DecodeFlags::GenSizeSrcSize(DecodeFlags::SIZE_256BIT);\n    } else if (HasNarrowingDisplacement &&\n               (SrcSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_DEF || SrcSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_64BITDEF)) {\n      // See table 1-2. Operand-Size Overrides for this decoding\n      // If the default operating mode is 32bit and we have the operand size flag then the operating size drops to 16bit\n      DecodeInst->Flags |= DecodeFlags::GenSizeSrcSize(DecodeFlags::SIZE_16BIT);\n    } else if ((HasXMMSrc || HasMMSrc || BlockInfo.Is64BitMode) && (HasWideningDisplacement || SrcSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_64BIT ||\n                                                                    SrcSizeFlag == FEXCore::X86Tables::InstFlags::SIZE_64BITDEF)) {\n      DecodeInst->Flags |= DecodeFlags::GenSizeSrcSize(DecodeFlags::SIZE_64BIT);\n    } else {\n      DecodeInst->Flags |= DecodeFlags::GenSizeSrcSize(DecodeFlags::SIZE_32BIT);\n    }\n  }\n\n  auto* CurrentDest = &DecodeInst->Dest;\n\n  if (HAS_NON_XMM_SUBFLAG(Info->Flags, FEXCore::X86Tables::InstFlags::FLAGS_SF_DST_RAX) ||\n      HAS_NON_XMM_SUBFLAG(Info->Flags, FEXCore::X86Tables::InstFlags::FLAGS_SF_DST_RDX)) {\n    // Some instructions hardcode their destination as RAX\n    CurrentDest->Type = DecodedOperand::OpType::GPR;\n    CurrentDest->Data.GPR.HighBits = false;\n    CurrentDest->Data.GPR.GPR =\n      HAS_NON_XMM_SUBFLAG(Info->Flags, FEXCore::X86Tables::InstFlags::FLAGS_SF_DST_RAX) ? FEXCore::X86State::REG_RAX : FEXCore::X86State::REG_RDX;\n    CurrentDest = &DecodeInst->Src[0];\n  } else if (HAS_NON_XMM_SUBFLAG(Info->Flags, FEXCore::X86Tables::InstFlags::FLAGS_SF_REX_IN_BYTE)) {\n    LOGMAN_THROW_A_FMT(!HasMODRM, \"This instruction shouldn't have ModRM!\");\n\n    // If the REX is in the byte that means the lower nibble of the OP contains the destination GPR\n    // This also means that the destination is always a GPR on these ones\n    // ADDITIONALLY:\n    // If there is a REX prefix then that allows extended GPR usage\n    CurrentDest->Type = DecodedOperand::OpType::GPR;\n    DecodeInst->Dest.Data.GPR.HighBits = (Is8BitDest && !HasREX && (Op & 0b111) >= 0b100);\n    CurrentDest->Data.GPR.GPR =\n      MapModRMToReg(DecodeInst->Flags & DecodeFlags::FLAG_REX_XGPR_B ? 1 : 0, Op & 0b111, Is8BitDest, HasREX, false, false);\n\n    if (CurrentDest->Data.GPR.GPR == FEXCore::X86State::REG_INVALID) {\n      return false;\n    }\n  }\n\n  uint8_t Bytes = Info->MoreBytes;\n\n  if ((Info->Flags & FEXCore::X86Tables::InstFlags::FLAGS_DISPLACE_SIZE_MUL_2) && HasWideningDisplacement) {\n    Bytes <<= 1;\n  }\n  if ((Info->Flags & FEXCore::X86Tables::InstFlags::FLAGS_DISPLACE_SIZE_DIV_2) && HasNarrowingDisplacement) {\n    Bytes >>= 1;\n  }\n\n  if ((Info->Flags & FEXCore::X86Tables::InstFlags::FLAGS_MEM_OFFSET) && (DecodeInst->Flags & DecodeFlags::FLAG_ADDRESS_SIZE)) {\n    // If we have a memory offset and have the address size override then divide it just like narrowing displacement\n    Bytes >>= 1;\n  }\n\n  auto ModRMOperand = [&](FEXCore::X86Tables::DecodedOperand& GPR, FEXCore::X86Tables::DecodedOperand& NonGPR, bool HasXMMGPR,\n                          bool HasXMMNonGPR, bool HasMMGPR, bool HasMMNonGPR, bool GPR8Bit, bool NonGPR8Bit) {\n    FEXCore::X86Tables::ModRMDecoded ModRM;\n    ModRM.Hex = DecodeInst->ModRM;\n\n    if (ModRM.reg != 0b000 && (Info->Flags & FEXCore::X86Tables::InstFlags::FLAGS_SF_MOD_ZERO_REG)) {\n      return false;\n    }\n\n    if (ModRM.mod == 0b11 && (Info->Flags & FEXCore::X86Tables::InstFlags::FLAGS_SF_MOD_MEM_ONLY)) {\n      return false;\n    }\n\n    if (ModRM.mod != 0b11 && (Info->Flags & FEXCore::X86Tables::InstFlags::FLAGS_SF_MOD_REG_ONLY)) {\n      return false;\n    }\n\n    // Decode the GPR source first\n    GPR.Type = DecodedOperand::OpType::GPR;\n    GPR.Data.GPR.HighBits = (GPR8Bit && ModRM.reg >= 0b100 && !HasREX);\n    GPR.Data.GPR.GPR = MapModRMToReg(DecodeInst->Flags & DecodeFlags::FLAG_REX_XGPR_R ? 1 : 0, ModRM.reg, GPR8Bit, HasREX, HasXMMGPR, HasMMGPR);\n\n    if (GPR.Data.GPR.GPR == FEXCore::X86State::REG_INVALID) {\n      return false;\n    }\n\n    // ModRM.mod == 0b11 == Register\n    // ModRM.Mod != 0b11 == Register-direct addressing\n    if (ModRM.mod == 0b11) {\n      NonGPR.Type = DecodedOperand::OpType::GPR;\n      NonGPR.Data.GPR.HighBits = (NonGPR8Bit && ModRM.rm >= 0b100 && !HasREX);\n      NonGPR.Data.GPR.GPR =\n        MapModRMToReg(DecodeInst->Flags & DecodeFlags::FLAG_REX_XGPR_B ? 1 : 0, ModRM.rm, NonGPR8Bit, HasREX, HasXMMNonGPR, HasMMNonGPR);\n      if (NonGPR.Data.GPR.GPR == FEXCore::X86State::REG_INVALID) {\n        return false;\n      }\n    } else {\n      // Only decode if we haven't pre-decoded\n      if (NonGPR.IsNone()) {\n        auto Disp = DecodeModRMs_Disp[Has16BitAddressing];\n        (this->*Disp)(&NonGPR, ModRM);\n      }\n    }\n\n    return true;\n  };\n\n  size_t CurrentSrc = 0;\n\n  const auto VEXOperand = Info->Flags & FEXCore::X86Tables::InstFlags::FLAGS_VEX_SRC_MASK;\n  if (VEXOperand == FEXCore::X86Tables::InstFlags::FLAGS_VEX_NO_OPERAND && Options.vvvv) {\n    return false;\n  }\n\n  if (VEXOperand == FEXCore::X86Tables::InstFlags::FLAGS_VEX_1ST_SRC) {\n    DecodeInst->Src[CurrentSrc].Type = DecodedOperand::OpType::GPR;\n    DecodeInst->Src[CurrentSrc].Data.GPR.HighBits = false;\n\n    // If we have XMM flags at all, then SRC 1 cannot be a GPR. The only case where\n    // this is possible is with BMI1 and BMI2 instructions (which are all GPR-based\n    // and don't use XMM flags)\n    DecodeInst->Src[CurrentSrc].Data.GPR.GPR = MapVEXToReg(Options.vvvv, HasXMMFlags);\n\n    ++CurrentSrc;\n  }\n\n  if (Info->Flags & FEXCore::X86Tables::InstFlags::FLAGS_MODRM) {\n    if (Info->Flags & FEXCore::X86Tables::InstFlags::FLAGS_SF_MOD_DST) {\n      if (!ModRMOperand(DecodeInst->Src[CurrentSrc], DecodeInst->Dest, HasXMMSrc, HasXMMDst, HasMMSrc, HasMMDst, Is8BitSrc, Is8BitDest)) {\n        return false;\n      }\n    } else {\n      if (!ModRMOperand(DecodeInst->Dest, DecodeInst->Src[CurrentSrc], HasXMMDst, HasXMMSrc, HasMMDst, HasMMSrc, Is8BitDest, Is8BitSrc)) {\n        return false;\n      }\n    }\n    ++CurrentSrc;\n  }\n\n  if (VEXOperand == FEXCore::X86Tables::InstFlags::FLAGS_VEX_2ND_SRC) {\n    DecodeInst->Src[CurrentSrc].Type = DecodedOperand::OpType::GPR;\n    DecodeInst->Src[CurrentSrc].Data.GPR.HighBits = false;\n    DecodeInst->Src[CurrentSrc].Data.GPR.GPR = MapVEXToReg(Options.vvvv, HasXMMSrc);\n    ++CurrentSrc;\n  }\n\n  if (HAS_NON_XMM_SUBFLAG(Info->Flags, FEXCore::X86Tables::InstFlags::FLAGS_SF_SRC_RAX)) {\n    DecodeInst->Src[CurrentSrc].Type = DecodedOperand::OpType::GPR;\n    DecodeInst->Src[CurrentSrc].Data.GPR.HighBits = false;\n    DecodeInst->Src[CurrentSrc].Data.GPR.GPR = FEXCore::X86State::REG_RAX;\n    ++CurrentSrc;\n  } else if (HAS_NON_XMM_SUBFLAG(Info->Flags, FEXCore::X86Tables::InstFlags::FLAGS_SF_SRC_RCX)) {\n    DecodeInst->Src[CurrentSrc].Type = DecodedOperand::OpType::GPR;\n    DecodeInst->Src[CurrentSrc].Data.GPR.HighBits = false;\n    DecodeInst->Src[CurrentSrc].Data.GPR.GPR = FEXCore::X86State::REG_RCX;\n    ++CurrentSrc;\n  }\n\n  if (VEXOperand == FEXCore::X86Tables::InstFlags::FLAGS_VEX_DST) {\n    CurrentDest->Type = DecodedOperand::OpType::GPR;\n    CurrentDest->Data.GPR.HighBits = false;\n    CurrentDest->Data.GPR.GPR = MapVEXToReg(Options.vvvv, HasXMMDst);\n  }\n\n  if (Bytes != 0) {\n    LOGMAN_THROW_A_FMT(Bytes <= 8, \"Number of bytes should be <= 8 for literal src\");\n\n\n    auto [Literal, IsRelocation] = ReadData(Bytes);\n    if (IsRelocation) {\n      DecodeInst->Src[CurrentSrc].Type = DecodedOperand::OpType::LiteralRelocation;\n      DecodeInst->Src[CurrentSrc].Data.LiteralRelocation.EntrypointOffset = Literal;\n    } else {\n      DecodeInst->Src[CurrentSrc].Data.Literal.Size = Bytes;\n\n      if ((Info->Flags & FEXCore::X86Tables::InstFlags::FLAGS_SRC_SEXT) ||\n          (DecodeFlags::GetSizeDstFlags(DecodeInst->Flags) == DecodeFlags::SIZE_64BIT &&\n           Info->Flags & FEXCore::X86Tables::InstFlags::FLAGS_SRC_SEXT64BIT)) {\n        if (Bytes == 1) {\n          Literal = static_cast<int8_t>(Literal);\n        } else if (Bytes == 2) {\n          Literal = static_cast<int16_t>(Literal);\n        } else {\n          Literal = static_cast<int32_t>(Literal);\n        }\n        DecodeInst->Src[CurrentSrc].Data.Literal.Size = DestSize;\n      }\n\n      DecodeInst->Src[CurrentSrc].Type = DecodedOperand::OpType::Literal;\n      DecodeInst->Src[CurrentSrc].Data.Literal.Value = Literal;\n    }\n\n    Bytes = 0;\n  }\n\n  LOGMAN_THROW_A_FMT(Bytes == 0, \"Inst at 0x{:x}: 0x{:04x} '{}' Had an instruction of size {} with {} remaining\", DecodeInst->PC,\n                     DecodeInst->OP, DecodeInst->TableInfo->Name ?: \"UND\", InstructionSize, Bytes);\n  DecodeInst->InstSize = InstructionSize;\n  return true;\n}\n\nbool Decoder::NormalOpHeader(const FEXCore::X86Tables::X86InstInfo* Info, uint16_t Op) {\n  DecodeInst->OPRaw = DecodeInst->OP = Op;\n  DecodeInst->TableInfo = Info;\n\n  if (Info->Type == FEXCore::X86Tables::TYPE_UNKNOWN) {\n    return false;\n  }\n\n  if (Info->Type == FEXCore::X86Tables::TYPE_INVALID) {\n    return false;\n  }\n\n  LOGMAN_THROW_A_FMT(Info->Type != FEXCore::X86Tables::TYPE_REX_PREFIX, \"REX PREFIX should have been decoded before this!\");\n\n  // A normal instruction is the most likely.\n  if (Info->Type == FEXCore::X86Tables::TYPE_INST) [[likely]] {\n    return NormalOp(Info, Op);\n  } else if (Info->Type == FEXCore::X86Tables::TYPE_ARCH_DISPATCHER) [[unlikely]] {\n    // Dispatcher Op.\n    return NormalOp(&Info->OpcodeDispatcher.Indirect[BlockInfo.Is64BitMode ? 1 : 0], Op);\n  } else if (Info->Type >= FEXCore::X86Tables::TYPE_GROUP_1 && Info->Type <= FEXCore::X86Tables::TYPE_GROUP_11) {\n    uint8_t ModRMByte = ReadByte();\n    DecodeInst->ModRM = ModRMByte;\n    DecodeInst->Flags |= DecodeFlags::FLAG_DECODED_MODRM;\n\n    FEXCore::X86Tables::ModRMDecoded ModRM;\n    ModRM.Hex = DecodeInst->ModRM;\n\n#define OPD(group, prefix, Reg) (((group - FEXCore::X86Tables::TYPE_GROUP_1) << 6) | (prefix) << 3 | (Reg))\n    Op = OPD(Info->Type, Info->MoreBytes, ModRM.reg);\n    return NormalOp(&PrimaryInstGroupOps[Op], Op);\n#undef OPD\n  } else if (Info->Type >= FEXCore::X86Tables::TYPE_GROUP_6 && Info->Type <= FEXCore::X86Tables::TYPE_GROUP_P) {\n#define OPD(group, prefix, Reg) (((group - FEXCore::X86Tables::TYPE_GROUP_6) << 5) | (prefix) << 3 | (Reg))\n    constexpr uint16_t PF_NONE = 0;\n    constexpr uint16_t PF_F3 = 1;\n    constexpr uint16_t PF_66 = 2;\n    constexpr uint16_t PF_F2 = 3;\n\n    uint16_t PrefixType = PF_NONE;\n    if (LastEscapePrefix == 0xF3) {\n      PrefixType = PF_F3;\n    } else if (LastEscapePrefix == 0xF2) {\n      PrefixType = PF_F2;\n    } else if (LastEscapePrefix == 0x66) {\n      PrefixType = PF_66;\n    }\n\n    // We have ModRM\n    uint8_t ModRMByte = ReadByte();\n    DecodeInst->ModRM = ModRMByte;\n    DecodeInst->Flags |= DecodeFlags::FLAG_DECODED_MODRM;\n\n    FEXCore::X86Tables::ModRMDecoded ModRM;\n    ModRM.Hex = DecodeInst->ModRM;\n\n    uint16_t LocalOp = OPD(Info->Type, PrefixType, ModRM.reg);\n    const FEXCore::X86Tables::X86InstInfo* LocalInfo = &SecondInstGroupOps[LocalOp];\n#undef OPD\n    if (LocalInfo->Type == FEXCore::X86Tables::TYPE_SECOND_GROUP_MODRM && ModRM.mod == 0b11) {\n      // Everything in this group is privileged instructions aside from XGETBV\n      constexpr std::array<uint8_t, 8> RegToField = {\n        255, 0, 1, 2, 255, 255, 255, 3,\n      };\n      uint8_t Field = RegToField[ModRM.reg];\n      if (Field == 255) {\n        return false;\n      }\n\n      LocalOp = (Field << 3) | ModRM.rm;\n      return NormalOp(&SecondModRMTableOps[LocalOp], LocalOp);\n    } else {\n      return NormalOp(&SecondInstGroupOps[LocalOp], LocalOp);\n    }\n  } else if (Info->Type == FEXCore::X86Tables::TYPE_X87_TABLE_PREFIX) {\n    // We have ModRM\n    uint8_t ModRMByte = ReadByte();\n    DecodeInst->ModRM = ModRMByte;\n    DecodeInst->Flags |= DecodeFlags::FLAG_DECODED_MODRM;\n\n    uint16_t X87Op = ((Op - 0xD8) << 8) | ModRMByte;\n    return NormalOp(&(*X87Table)[X87Op], X87Op);\n  } else if (Info->Type == FEXCore::X86Tables::TYPE_VEX_TABLE_PREFIX) {\n    if (!VEXTable) {\n      // AVX not enabled.\n      return false;\n    }\n\n    uint16_t map_select = 1;\n    uint16_t pp = 0;\n    const uint8_t Byte1 = ReadByte();\n    DecodedHeader options {};\n\n    if ((Byte1 & 0b10000000) == 0) {\n      if (!BlockInfo.Is64BitMode) {\n        return false;\n      }\n\n      DecodeInst->Flags |= DecodeFlags::FLAG_REX_XGPR_R;\n    }\n\n    if (Op == 0xC5) { // Two byte VEX\n      pp = Byte1 & 0b11;\n      const uint8_t vvvv = ((Byte1 & 0b01111000) >> 3);\n      if (!BlockInfo.Is64BitMode && vvvv <= 0b0111) {\n        // Invalid on 32-bit, can't use the high registers.\n        return false;\n      }\n      options.vvvv = 15 - vvvv;\n      options.L = (Byte1 & 0b100) != 0;\n    } else { // 0xC4 = Three byte VEX\n      const uint8_t Byte2 = ReadByte();\n      pp = Byte2 & 0b11;\n      map_select = Byte1 & 0b11111;\n      const uint8_t vvvv = ((Byte2 & 0b01111000) >> 3);\n      if (!BlockInfo.Is64BitMode && vvvv <= 0b0111) {\n        // Invalid on 32-bit, can't use the high registers.\n        return false;\n      }\n      options.vvvv = 15 - vvvv;\n      options.w = (Byte2 & 0b10000000) != 0;\n      options.L = (Byte2 & 0b100) != 0;\n      if ((Byte1 & 0b01000000) == 0) {\n        if (!BlockInfo.Is64BitMode) {\n          return false;\n        }\n        DecodeInst->Flags |= DecodeFlags::FLAG_REX_XGPR_X;\n      }\n      if (BlockInfo.Is64BitMode && (Byte1 & 0b00100000) == 0) {\n        DecodeInst->Flags |= DecodeFlags::FLAG_REX_XGPR_B;\n      }\n      if (options.w) {\n        DecodeInst->Flags |= DecodeFlags::FLAG_OPTION_AVX_W;\n      }\n      if (!(map_select >= 1 && map_select <= 3)) {\n        return false;\n      }\n    }\n\n    uint16_t VEXOp = ReadByte();\n#define OPD(map_select, pp, opcode) (((map_select - 1) << 10) | (pp << 8) | (opcode))\n    Op = OPD(map_select, pp, VEXOp);\n#undef OPD\n\n    const FEXCore::X86Tables::X86InstInfo* LocalInfo = &(*VEXTable)[Op];\n\n    if (LocalInfo->Type >= FEXCore::X86Tables::TYPE_VEX_GROUP_12 && LocalInfo->Type <= FEXCore::X86Tables::TYPE_VEX_GROUP_17) {\n      // We have ModRM\n      uint8_t ModRMByte = ReadByte();\n      DecodeInst->ModRM = ModRMByte;\n      DecodeInst->Flags |= DecodeFlags::FLAG_DECODED_MODRM;\n\n      FEXCore::X86Tables::ModRMDecoded ModRM;\n      ModRM.Hex = DecodeInst->ModRM;\n\n#define OPD(group, pp, opcode) (((group - TYPE_VEX_GROUP_12) << 4) | (pp << 3) | (opcode))\n      Op = OPD(LocalInfo->Type, pp, ModRM.reg);\n#undef OPD\n      return NormalOp(&(*VEXTableGroup)[Op], Op, options);\n    } else {\n      return NormalOp(LocalInfo, Op, options);\n    }\n  } else if (Info->Type == FEXCore::X86Tables::TYPE_GROUP_EVEX) {\n    FEXCORE_TELEMETRY_SET(TYPE_USES_EVEX_OPS, 1);\n    // EVEX unsupported\n    return false;\n  }\n\n  LOGMAN_MSG_A_FMT(\"Invalid instruction decoding type\");\n  FEX_UNREACHABLE;\n}\n\nbool Decoder::DecodeInstructionImpl(uint64_t PC) {\n  InstructionSize = 0;\n  LastEscapePrefix = 0;\n  Instruction.fill(0);\n\n  DecodeInst = &DecodedBuffer[DecodedSize];\n  memset(DecodeInst, 0, sizeof(DecodedInst));\n  DecodeInst->PC = PC;\n\n  for (;;) {\n    if (InstructionSize >= MAX_INST_SIZE) {\n      return false;\n    }\n    uint8_t Op = ReadByte();\n    switch (Op) {\n    case 0x0F: { // Escape Op\n      uint8_t EscapeOp = ReadByte();\n      switch (EscapeOp) {\n      case 0x0F:\n        [[unlikely]] { // 3DNow!\n          DecodeREXIfValid(-2);\n          // 3DNow! Instruction Encoding: 0F 0F [ModRM] [SIB] [Displacement] [Opcode]\n          // Decode ModRM\n          uint8_t ModRMByte = ReadByte();\n          DecodeInst->ModRM = ModRMByte;\n          DecodeInst->Flags |= DecodeFlags::FLAG_DECODED_MODRM;\n\n          FEXCore::X86Tables::ModRMDecoded ModRM;\n          ModRM.Hex = DecodeInst->ModRM;\n\n          const bool Has16BitAddressing = !BlockInfo.Is64BitMode && DecodeInst->Flags & DecodeFlags::FLAG_ADDRESS_SIZE;\n\n          // All 3DNow! instructions have the second argument as the rm handler\n          // We need to decode it upfront to get the displacement out of the way\n          if (ModRM.mod != 0b11) {\n            auto Disp = DecodeModRMs_Disp[Has16BitAddressing];\n            (this->*Disp)(&DecodeInst->Src[0], ModRM);\n          }\n\n          // Take a peek at the op just past the displacement\n          uint8_t LocalOp = ReadByte();\n          return NormalOpHeader(&FEXCore::X86Tables::DDDNowOps[LocalOp], LocalOp);\n          break;\n        }\n      case 0x38: { // F38 Table!\n        DecodeREXIfValid(-2);\n        constexpr uint16_t PF_38_NONE = 0;\n        constexpr uint16_t PF_38_66 = (1U << 0);\n        constexpr uint16_t PF_38_F2 = (1U << 1);\n        constexpr uint16_t PF_38_F3 = (1U << 2);\n\n        uint16_t Prefix = PF_38_NONE;\n        if (DecodeInst->Flags & DecodeFlags::FLAG_OPERAND_SIZE) {\n          Prefix |= PF_38_66;\n        }\n        if (DecodeInst->Flags & DecodeFlags::FLAG_REPNE_PREFIX) {\n          Prefix |= PF_38_F2;\n        }\n        if (DecodeInst->Flags & DecodeFlags::FLAG_REP_PREFIX) {\n          Prefix |= PF_38_F3;\n        }\n\n        uint16_t LocalOp = (Prefix << 8) | ReadByte();\n\n        bool NoOverlay66 = (FEXCore::X86Tables::H0F38TableOps[LocalOp].Flags & InstFlags::FLAGS_NO_OVERLAY66) != 0;\n        if (LastEscapePrefix == 0x66 && NoOverlay66) { // Operand Size\n          // Remove prefix so it doesn't effect calculations.\n          // This is only an escape prefix rather than modifier now\n          DecodeInst->Flags &= ~DecodeFlags::FLAG_OPERAND_SIZE;\n          DecodeFlags::PopOpAddrIf(&DecodeInst->Flags, DecodeFlags::FLAG_OPERAND_SIZE_LAST);\n        }\n        return NormalOpHeader(&FEXCore::X86Tables::H0F38TableOps[LocalOp], LocalOp);\n        break;\n      }\n      case 0x3A: { // F3A Table!\n        DecodeREXIfValid(-2);\n        constexpr uint16_t PF_3A_NONE = 0;\n        constexpr uint16_t PF_3A_66 = (1 << 0);\n        constexpr uint16_t PF_3A_REX = (1 << 1);\n\n        uint16_t Prefix = PF_3A_NONE;\n        if (LastEscapePrefix == 0x66) { // Operand Size\n          Prefix = PF_3A_66;\n        }\n\n        if (DecodeInst->Flags & DecodeFlags::FLAG_REX_WIDENING) {\n          Prefix |= PF_3A_REX;\n        }\n\n        uint16_t LocalOp = (Prefix << 8) | ReadByte();\n        return NormalOpHeader(&FEXCore::X86Tables::H0F3ATableOps[LocalOp], LocalOp);\n        break;\n      }\n      default:\n        [[likely]] { // Two byte table!\n          // x86-64 abuses three legacy prefixes to extend the table encodings\n          // 0x66 - Operand Size prefix\n          // 0xF2 - REPNE prefix\n          // 0xF3 - REP prefix\n          // If any of these three prefixes are used then it falls down the subtable\n          // Additionally: If you hit repeat of differnt prefixes then only the LAST one before this one works for subtable selection\n\n          bool NoOverlay = (FEXCore::X86Tables::SecondBaseOps[EscapeOp].Flags & InstFlags::FLAGS_NO_OVERLAY) != 0;\n          bool NoOverlay66 = (FEXCore::X86Tables::SecondBaseOps[EscapeOp].Flags & InstFlags::FLAGS_NO_OVERLAY66) != 0;\n\n          DecodeREXIfValid(-2);\n          if (NoOverlay) { // This section of the table ignores prefix extention\n            return NormalOpHeader(&FEXCore::X86Tables::SecondBaseOps[EscapeOp], EscapeOp);\n          } else if (LastEscapePrefix == 0xF3) { // REP\n            // Remove prefix so it doesn't effect calculations.\n            // This is only an escape prefix rather tan modifier now\n            DecodeInst->Flags &= ~DecodeFlags::FLAG_REP_PREFIX;\n            return NormalOpHeader(&FEXCore::X86Tables::RepModOps[EscapeOp], EscapeOp);\n          } else if (LastEscapePrefix == 0xF2) { // REPNE\n            // Remove prefix so it doesn't effect calculations.\n            // This is only an escape prefix rather tan modifier now\n            DecodeInst->Flags &= ~DecodeFlags::FLAG_REPNE_PREFIX;\n            return NormalOpHeader(&FEXCore::X86Tables::RepNEModOps[EscapeOp], EscapeOp);\n          } else if (LastEscapePrefix == 0x66 && !NoOverlay66) { // Operand Size\n            // Remove prefix so it doesn't effect calculations.\n            // This is only an escape prefix rather tan modifier now\n            DecodeInst->Flags &= ~DecodeFlags::FLAG_OPERAND_SIZE;\n            DecodeFlags::PopOpAddrIf(&DecodeInst->Flags, DecodeFlags::FLAG_OPERAND_SIZE_LAST);\n            return NormalOpHeader(&FEXCore::X86Tables::OpSizeModOps[EscapeOp], EscapeOp);\n          } else {\n            return NormalOpHeader(&FEXCore::X86Tables::SecondBaseOps[EscapeOp], EscapeOp);\n          }\n          break;\n        }\n      }\n      break;\n    }\n    case 0x66: // Operand Size prefix\n      DecodeInst->Flags |= DecodeFlags::FLAG_OPERAND_SIZE;\n      LastEscapePrefix = Op;\n      DecodeFlags::PushOpAddr(&DecodeInst->Flags, DecodeFlags::FLAG_OPERAND_SIZE_LAST);\n      break;\n    case 0x67: // Address Size override prefix\n      DecodeInst->Flags |= DecodeFlags::FLAG_ADDRESS_SIZE;\n      break;\n    case 0x26: // ES legacy prefix\n      if (!BlockInfo.Is64BitMode) {\n        DecodeInst->Flags = (DecodeInst->Flags & ~FEXCore::X86Tables::DecodeFlags::FLAG_SEGMENTS) | DecodeFlags::FLAG_ES_PREFIX;\n      }\n      break;\n    case 0x2E: // CS legacy prefix\n      if (!BlockInfo.Is64BitMode) {\n        DecodeInst->Flags = (DecodeInst->Flags & ~FEXCore::X86Tables::DecodeFlags::FLAG_SEGMENTS) | DecodeFlags::FLAG_CS_PREFIX;\n      }\n      break;\n    case 0x36: // SS legacy prefix\n      if (!BlockInfo.Is64BitMode) {\n        DecodeInst->Flags = (DecodeInst->Flags & ~FEXCore::X86Tables::DecodeFlags::FLAG_SEGMENTS) | DecodeFlags::FLAG_SS_PREFIX;\n      }\n      break;\n    case 0x3E: // DS legacy prefix\n      if (!BlockInfo.Is64BitMode) {\n        DecodeInst->Flags = (DecodeInst->Flags & ~FEXCore::X86Tables::DecodeFlags::FLAG_SEGMENTS) | DecodeFlags::FLAG_DS_PREFIX;\n      }\n      break;\n    case 0xF0: // LOCK prefix\n      DecodeInst->Flags |= DecodeFlags::FLAG_LOCK;\n      break;\n    case 0xF2: // REPNE prefix\n      DecodeInst->Flags |= DecodeFlags::FLAG_REPNE_PREFIX;\n      LastEscapePrefix = Op;\n      break;\n    case 0xF3: // REP prefix\n      DecodeInst->Flags |= DecodeFlags::FLAG_REP_PREFIX;\n      LastEscapePrefix = Op;\n      break;\n    case 0x64: // FS prefix\n      DecodeInst->Flags = (DecodeInst->Flags & ~FEXCore::X86Tables::DecodeFlags::FLAG_SEGMENTS) | DecodeFlags::FLAG_FS_PREFIX;\n      break;\n    case 0x65: // GS prefix\n      DecodeInst->Flags = (DecodeInst->Flags & ~FEXCore::X86Tables::DecodeFlags::FLAG_SEGMENTS) | DecodeFlags::FLAG_GS_PREFIX;\n      break;\n    default:\n      [[likely]] { // Default base table\n        const X86InstInfo* Info = &FEXCore::X86Tables::BaseOps[Op];\n        if (Info->Type == FEXCore::X86Tables::TYPE_ARCH_DISPATCHER) {\n          Info = &Info->OpcodeDispatcher.Indirect[BlockInfo.Is64BitMode ? 1 : 0];\n        }\n\n        if (Info->Type == FEXCore::X86Tables::TYPE_REX_PREFIX) {\n          DecodeInst->REXIndex = InstructionSize;\n        } else {\n          DecodeREXIfValid();\n          return NormalOpHeader(Info, Op);\n        }\n\n        break;\n      }\n    }\n  }\n\n  if (DecodeInst->Dest.IsGPR()) {\n    return false;\n  }\n\n  return true;\n}\n\nvoid Decoder::DecodeREXIfValid(int8_t ExpectedOffset) {\n  LOGMAN_THROW_A_FMT(ExpectedOffset < 0, \"Expecting an negative offset for the REX offset!\");\n  const int8_t REXIndex = InstructionSize + ExpectedOffset;\n\n  if (DecodeInst->REXIndex != 0 && DecodeInst->REXIndex == REXIndex) {\n    const uint8_t Op = Instruction[REXIndex - 1];\n    DecodeInst->Flags |= DecodeFlags::FLAG_REX_PREFIX;\n\n    // Widening displacement\n    if (Op & 0b1000) {\n      DecodeInst->Flags |= DecodeFlags::FLAG_REX_WIDENING;\n      DecodeFlags::PushOpAddr(&DecodeInst->Flags, DecodeFlags::FLAG_WIDENING_SIZE_LAST);\n    }\n\n    // XGPR_B bit set\n    if (Op & 0b0001) {\n      DecodeInst->Flags |= DecodeFlags::FLAG_REX_XGPR_B;\n    }\n\n    // XGPR_X bit set\n    if (Op & 0b0010) {\n      DecodeInst->Flags |= DecodeFlags::FLAG_REX_XGPR_X;\n    }\n\n    // XGPR_R bit set\n    if (Op & 0b0100) {\n      DecodeInst->Flags |= DecodeFlags::FLAG_REX_XGPR_R;\n    }\n  }\n}\n\nDecoder::DecodedBlockStatus Decoder::DecodeInstruction(uint64_t PC) {\n  // Will be set if DecodeInstructionImpl tries to read non-executable memory\n  HitNonExecutableRange = false;\n  HitBadRelocation = false;\n  bool ErrorDuringDecoding = !DecodeInstructionImpl(PC);\n\n  if (ErrorDuringDecoding || HitNonExecutableRange || HitBadRelocation) [[unlikely]] {\n    // Put an invalid instruction in the stream so the core can raise SIGILL if hit\n    // Error while decoding instruction. We don't know the table or instruction size\n    DecodeInst->TableInfo = nullptr;\n    auto Result = ErrorDuringDecoding   ? DecodedBlockStatus::INVALID_INST :\n                  DecodeInst->InstSize  ? DecodedBlockStatus::PARTIAL_DECODE_INST :\n                  HitNonExecutableRange ? DecodedBlockStatus::NOEXEC_INST :\n                                          DecodedBlockStatus::BAD_RELOCATION;\n    DecodeInst->InstSize = 0;\n    return Result;\n  } else if (!DecodeInst->TableInfo || (DecodeInst->TableInfo->Type == TYPE_INST && !DecodeInst->TableInfo->OpcodeDispatcher.OpDispatch)) {\n    // If there wasn't an error during decoding but we have no dispatcher for the instruction then claim invalid instruction.\n    return DecodedBlockStatus::INVALID_INST;\n  }\n\n  if (CTX->AreMonoHacksActive()) {\n    // Unity uses a standard SPSC ringbuffer with cached read/write pointers and thread waiting flags at the following\n    // offsets, which are consistent between 32-bit and 64-bit Unity versions from 2015 onwards.\n    auto IsKnownAtomicDisplacement = [](uint64_t Displacement) {\n      return Displacement == 0x80 || Displacement == 0x84 || Displacement == 0xC0 || Displacement == 0xC4;\n    };\n\n    if (DecodeInst->OP == 0x8b && DecodeInst->Src[0].IsGPRIndirect() &&\n        IsKnownAtomicDisplacement(DecodeInst->Src[0].Data.GPRIndirect.Displacement)) {\n      DecodeInst->Flags |= X86Tables::DecodeFlags::FLAG_FORCE_TSO;\n    }\n    if (DecodeInst->OP == 0x89 && DecodeInst->Dest.IsGPRIndirect() && IsKnownAtomicDisplacement(DecodeInst->Dest.Data.GPRIndirect.Displacement)) {\n      DecodeInst->Flags |= X86Tables::DecodeFlags::FLAG_FORCE_TSO;\n    }\n  }\n\n  return DecodedBlockStatus::SUCCESS;\n}\n\nvoid Decoder::BranchTargetInMultiblockRange() {\n  if (!CTX->Config.Multiblock) {\n    return;\n  }\n\n  // If the RIP setting is conditional AND within our symbol range then it can be considered for multiblock\n  uint64_t TargetRIP = 0;\n  const auto GPRSize = GetGPROpSize();\n  bool Conditional = true;\n  const auto InstEnd = DecodeInst->PC + DecodeInst->InstSize;\n\n  if (DecodeInst->TableInfo->Flags & FEXCore::X86Tables::InstFlags::FLAGS_CALL) {\n    if (ExecutableRangeWritable && CTX->AreMonoHacksActive()) {\n      // Mono generated code often contains noreturn calls with garbage following them, and calls are always backpatched\n      // after CIL compilation leading to n recompiles for a multiblock with n calls. Choose to minimize stutters over\n      // raw performance and disable tracking past calls for mono generated code.\n      return;\n    }\n\n    AddBranchTarget(InstEnd);\n    BlockInfo.EntryPoints.emplace(InstEnd);\n    return;\n  }\n\n  // Calls are handled above\n  switch (DecodeInst->OP) {\n  case 0x70 ... 0x7F:   // Conditional JUMP\n  case 0x80 ... 0x8F: { // More conditional\n    // Source is a literal\n    // auto RIPOffset = LoadSource(Op, Op->Src[0], Op->Flags);\n    // auto RIPTargetConst = Constant(Op->PC + Op->InstSize);\n    // Target offset is PC + InstSize + Literal\n    TargetRIP = InstEnd + DecodeInst->Src[0].Literal();\n    break;\n  }\n  case 0xE9:\n  case 0xEB: // Both are unconditional JMP instructions\n    TargetRIP = InstEnd + DecodeInst->Src[0].Literal();\n    Conditional = false;\n    break;\n  case 0xC2: // RET imm\n  case 0xC3: // RET\n  default: return; break;\n  }\n\n  if (GPRSize == IR::OpSize::i32Bit) {\n    // If we are running a 32bit guest then wrap around addresses that go above 32bit\n    TargetRIP &= 0xFFFFFFFFU;\n  }\n\n  if (Conditional) {\n    // If we are conditional then a target can be the instruction past the conditional instruction\n    AddBranchTarget(InstEnd);\n  }\n\n  // If the target RIP is x86 code within the symbol ranges then we are golden\n  // Forbid distant branches to have the cost code better match the guest code layout, avoiding massive (range-wise) code\n  // blocks in highly fragmented guest code. Such branches are often not-taken branches to garbage in obfuscated code.\n  constexpr uint64_t MAX_FORWARD_BRANCH_DIST = FEXCore::Utils::FEX_PAGE_SIZE * 4;\n  bool ValidMultiblockMember = TargetRIP >= EntryPoint && TargetRIP < std::min(InstEnd + MAX_FORWARD_BRANCH_DIST, SectionMaxAddress);\n\n#ifdef ARCHITECTURE_arm64ec\n  ValidMultiblockMember = ValidMultiblockMember && !RtlIsEcCode(TargetRIP);\n#endif\n\n  if (ValidMultiblockMember) {\n    // Update our conditional branch ranges before we return\n    if (Conditional) {\n      MaxCondBranchForward = std::max(MaxCondBranchForward, TargetRIP);\n      MaxCondBranchBackwards = std::min(MaxCondBranchBackwards, TargetRIP);\n    }\n\n    AddBranchTarget(TargetRIP);\n  } else {\n    if (ExternalBranches) {\n      ExternalBranches->insert(TargetRIP);\n    }\n  }\n}\n\nbool Decoder::IsBranchMonoTailcall(uint64_t NumInstructions) const {\n  // While the mono call backpatching block can easily be detected due it being the only one to contain SMC-faulting\n  // atomics, that can't be said for the tailcall jump backpatcher which has changed several times across versions and\n  // can be partially inlined. To work around this, instead detect the tailcall site itself and force full non-signal-based\n  // SMC detection for that single block.\n  if (!ExecutableRangeWritable) {\n    // We only care about jitted code\n    return false;\n  }\n\n  // See mini-{amd64,x86}.c in the mono codebase, specifically where METHOD_JUMP patches are emitted.\n  if (GetGPROpSize() == IR::OpSize::i32Bit) {\n    // Matches:\n    // LEAVE\n    // <none> / NOP / MOV EAX, EAX / LEA EBP, [EBP+0]\n    // JMP imm32\n    if (DecodeInst->OP != 0xE9 || NumInstructions < 2) {\n      return false;\n    }\n\n    auto PrevInst = std::prev(DecodeInst);\n    if (PrevInst->OP == 0xC9) {\n      return true;\n    }\n\n    if (NumInstructions < 3 || std::prev(PrevInst)->OP != 0xC9) {\n      return false;\n    }\n\n    return PrevInst->OP == 0x90 || (PrevInst->OP == 0x8B && PrevInst->ModRM == 0xC0) ||\n           (PrevInst->OP == 0x8D && PrevInst->ModRM == 0x6D && PrevInst->Src[1].IsLiteral() && PrevInst->Src[1].Literal() == 0);\n  } else {\n    FEXCore::X86Tables::ModRMDecoded ModRM;\n    ModRM.Hex = DecodeInst->ModRM;\n    if (DecodeInst->OPRaw == 0xFF && ModRM.reg == 4 && DecodeInst->Src[0].IsGPR()) {\n      if (DecodeInst->Src[0].Data.GPR.GPR == FEXCore::X86State::REG_RAX) {\n        // Found in versions of mono from 2024 onwards - matches:\n        // REX.W JMP rax\n        return (DecodeInst->Flags & (DecodeFlags::FLAG_REX_PREFIX | DecodeFlags::FLAG_REX_WIDENING | DecodeFlags::FLAG_REX_XGPR_B |\n                                     DecodeFlags::FLAG_REX_XGPR_X | DecodeFlags::FLAG_REX_XGPR_R)) ==\n               (DecodeFlags::FLAG_REX_PREFIX | DecodeFlags::FLAG_REX_WIDENING);\n      } else if (NumInstructions > 1 && DecodeInst->Src[0].Data.GPR.GPR == FEXCore::X86State::REG_R11) {\n        // Found in older versions of mono - match:\n        // MOV r11, imm64\n        // JMP r11\n        auto PrevInst = std::prev(DecodeInst);\n        return PrevInst->OP == 0xBB && PrevInst->Dest.IsGPR() && PrevInst->Dest.Data.GPR.GPR == FEXCore::X86State::REG_R11;\n      }\n    }\n  }\n\n  return false;\n}\n\nbool Decoder::InstCanContinue() const {\n  if (DecodeInst->PC + DecodeInst->InstSize == NextBlockStartAddress) {\n    return false;\n  }\n\n  if (!(DecodeInst->TableInfo->Flags & (FEXCore::X86Tables::InstFlags::FLAGS_BLOCK_END | FEXCore::X86Tables::InstFlags::FLAGS_SETS_RIP))) {\n    return true;\n  }\n\n  uint64_t TargetRIP = 0;\n  const auto GPRSize = GetGPROpSize();\n\n  if (DecodeInst->OP == 0xE8) { // Call - immediate target\n    const uint64_t NextRIP = DecodeInst->PC + DecodeInst->InstSize;\n    TargetRIP = DecodeInst->PC + DecodeInst->InstSize + DecodeInst->Src[0].Literal();\n\n    if (GPRSize == IR::OpSize::i32Bit) {\n      // If we are running a 32bit guest then wrap around addresses that go above 32bit\n      TargetRIP &= 0xFFFFFFFFU;\n    }\n\n    if (TargetRIP == NextRIP) {\n      // Optimize the case that the instruction is jumping just after itself.\n      // This is a GOT calculation which we can optimize out.\n      // Optimization occurs inside of the OpDispatcher implementation\n      return true;\n    }\n  }\n\n  return false;\n}\n\nvoid Decoder::AddBranchTarget(uint64_t Target) {\n  if (VisitedBlocks.contains(Target)) {\n    return;\n  }\n\n  auto BlockSuccIt = std::lower_bound(BlockInfo.Blocks.begin(), BlockInfo.Blocks.end(), Target,\n                                      [](const auto& a, uint64_t Address) { return a.Entry < Address; });\n\n  LOGMAN_THROW_A_FMT(BlockSuccIt == BlockInfo.Blocks.end() || BlockSuccIt->Entry != Target, \"unexpected\");\n\n  if (BlockSuccIt != BlockInfo.Blocks.begin()) {\n    auto BlockIt = std::prev(BlockSuccIt);\n    if (BlockIt->Entry + BlockIt->Size > Target) {\n      uint64_t SplitIdx = 0;\n      uint64_t SplitAddr = BlockIt->Entry;\n      // Find the instruction boundary of the split\n      for (; SplitIdx < BlockIt->NumInstructions && SplitAddr < Target; SplitIdx++) {\n        SplitAddr += BlockIt->DecodedInstructions[SplitIdx].InstSize;\n      }\n      uint64_t SplitOffset = SplitAddr - BlockIt->Entry;\n\n      LOGMAN_THROW_A_FMT(SplitIdx != 0, \"unexpected\");\n\n      if (SplitAddr == Target) {\n        // Split at the boundary\n        DecodedBlocks SplitBlock {\n          .Entry = SplitAddr,\n          .Size = BlockIt->Size - SplitOffset,\n          .NumInstructions = BlockIt->NumInstructions - SplitIdx,\n          .DecodedInstructions = BlockIt->DecodedInstructions + SplitIdx,\n          .BlockStatus = BlockIt->BlockStatus,\n        };\n\n        BlockIt->Size = SplitOffset;\n        BlockIt->NumInstructions = SplitIdx;\n\n        BlockInfo.Blocks.insert(BlockSuccIt, SplitBlock);\n      } // else misaligned, leave as a branch out of the block\n\n      // If we split a block then the target has already been visited as part of that, if it was\n      // misaligned the jump will just leave the multiblock, mark it as visited to avoid running\n      // this code path again and just bail out early.\n      VisitedBlocks.insert(Target);\n      return;\n    }\n  }\n\n  CurrentBlockTargets.insert(Target);\n  if (Target >= DecodeInst->PC + DecodeInst->InstSize && Target < NextBlockStartAddress) {\n    NextBlockStartAddress = Target;\n  }\n}\n\nconst uint8_t* Decoder::AdjustAddrForSpecialRegion(const uint8_t* _InstStream, uint64_t EntryPoint, uint64_t RIP) {\n  constexpr uint64_t VSyscall_Base = 0xFFFF'FFFF'FF60'0000ULL;\n  constexpr uint64_t VSyscall_End = VSyscall_Base + 0x1000;\n\n  if (OSABI == FEXCore::HLE::SyscallOSABI::OS_LINUX64 && RIP >= VSyscall_Base && RIP < VSyscall_End) {\n    // VSyscall\n    // This doesn't exist on AArch64 and on x86_64 hosts this is emulated with faults to a region mapped with --xp permissions\n    // Offset     0: vgettimeofday\n    // Offset 0x400: vtime\n    // Offset 0x800: vgetcpu\n    uint64_t Offset = RIP - VSyscall_Base;\n    return VSyscallData + Offset;\n  }\n\n  return _InstStream - EntryPoint + RIP;\n}\n\nbool Decoder::CheckIfCacheable(FEXCore::Core::InternalThreadState& Thread, const uint8_t* InstStream, uint64_t PC, uint64_t MaxInst) {\n  DecodeInstructionsAtEntry(&Thread, InstStream, PC, MaxInst);\n  bool Uncacheable = HitBadRelocation;\n  DelayedDisownBuffer();\n  return !Uncacheable;\n}\n\nvoid Decoder::DecodeInstructionsAtEntry(FEXCore::Core::InternalThreadState* Thread, const uint8_t* _InstStream, uint64_t PC, uint64_t MaxInst) {\n  FEXCORE_PROFILE_SCOPED(\"DecodeInstructions\");\n  BlockInfo.TotalInstructionCount = 0;\n  BlockInfo.Blocks.clear();\n  VisitedBlocks.clear();\n  // Reset internal state management\n  DecodedSize = 0;\n  MaxCondBranchForward = 0;\n  MaxCondBranchBackwards = ~0ULL;\n  DecodedBuffer = PoolObject.ReownOrClaimBuffer();\n\n  // Decode operating mode from thread's CS segment.\n  const auto CSSegment = Core::CPUState::GetSegmentFromIndex(Thread->CurrentFrame->State, Thread->CurrentFrame->State.cs_idx);\n  BlockInfo.Is64BitMode = CSSegment->L == 1;\n  LOGMAN_THROW_A_FMT(BlockInfo.Is64BitMode == CTX->Config.Is64BitMode, \"Expected operating mode to not change at runtime!\");\n\n  EntryPoint = PC;\n  BlockInfo.EntryPoints = {PC};\n  InstStream = _InstStream;\n\n  uint64_t TotalInstructions {};\n\n  SectionMinAddress = 0;\n  SectionMaxAddress = ~0ULL;\n  Relocations = nullptr;\n\n  if (CTX->GetCodeCache().IsGeneratingCache || EnableCodeCacheValidation) {\n    // If generating cache, attempt to load section bounds and relocations\n    if (auto SectionInfo = CTX->SyscallHandler->LookupExecutableFileSection(Thread, EntryPoint)) {\n      SectionMinAddress = SectionInfo->FileStartVA;\n      SectionMaxAddress = SectionInfo->EndVA;\n      Relocations = &SectionInfo->FileInfo.Relocations;\n    }\n  }\n\n  DecodedMinAddress = EntryPoint;\n  DecodedMaxAddress = EntryPoint;\n\n  // Entry is a jump target\n  BlocksToDecode = {PC};\n\n  uint64_t CurrentCodePage = PC & FEXCore::Utils::FEX_PAGE_MASK;\n\n  BlockInfo.CodePages = {CurrentCodePage};\n\n  if (MaxInst == 0) {\n    MaxInst = CTX->Config.MaxInstPerBlock;\n  }\n\n  bool EntryBlock {true};\n  bool FinalInstruction {false};\n\n  while (!FinalInstruction && !BlocksToDecode.empty()) {\n    auto BlockDecodeIt = BlocksToDecode.begin();\n    uint64_t RIPToDecode = *BlockDecodeIt;\n    BlocksToDecode.erase(BlockDecodeIt);\n    VisitedBlocks.emplace(RIPToDecode);\n\n    auto BlockSuccIt = std::lower_bound(BlockInfo.Blocks.begin(), BlockInfo.Blocks.end(), RIPToDecode,\n                                        [](const auto& a, uint64_t Address) { return a.Entry < Address; });\n\n    LOGMAN_THROW_A_FMT(BlockSuccIt == BlockInfo.Blocks.end() || BlockSuccIt->Entry != RIPToDecode, \"unexpected\");\n\n    NextBlockStartAddress = ~0ULL;\n    if (!BlocksToDecode.empty()) {\n      // We just erased the lowest, the front is then the second lowest\n      NextBlockStartAddress = *BlocksToDecode.begin();\n    }\n    if (BlockSuccIt != BlockInfo.Blocks.end() && BlockSuccIt->Entry < NextBlockStartAddress) {\n      NextBlockStartAddress = BlockSuccIt->Entry;\n    }\n    LOGMAN_THROW_A_FMT(NextBlockStartAddress > RIPToDecode, \"unexpected\");\n\n    // Insert the block now so it can be looked up and split if necessary on a backward edge\n    auto BlockIt = BlockInfo.Blocks.emplace(BlockSuccIt);\n\n    BlockIt->Entry = RIPToDecode;\n    BlockIt->Size = 0;\n    BlockIt->IsEntryPoint = EntryBlock;\n\n    uint64_t PCOffset = 0;\n    uint64_t BlockStartOffset = DecodedSize;\n    bool EraseBlock = true; // Unset once the block contains an instruction\n\n    BlockIt->DecodedInstructions = &DecodedBuffer[BlockStartOffset];\n    BlockIt->NumInstructions = 0;\n\n    // Do a bit of pointer math to figure out where we are in code\n    InstStream = AdjustAddrForSpecialRegion(_InstStream, EntryPoint, RIPToDecode);\n\n    while (1) {\n      InstructionSize = 0;\n\n      // MAX_INST_SIZE assumes worst case\n      auto OpAddress = RIPToDecode + PCOffset;\n      auto OpMaxAddress = OpAddress + MAX_INST_SIZE;\n\n      auto OpMinPage = OpAddress & FEXCore::Utils::FEX_PAGE_MASK;\n      auto OpMaxPage = OpMaxAddress & FEXCore::Utils::FEX_PAGE_MASK;\n\n      if (!EntryBlock && OpMinPage == OpMaxPage && PeekByte(0).value_or(0) == 0 && PeekByte(1).value_or(0) == 0) [[unlikely]] {\n        // End the multiblock early if we hit 2 consecutive null bytes (add [rax], al) in the same page with the\n        // assumption we are most likely trying to explore garbage code.\n        break;\n      }\n\n      if (OpMinPage != CurrentCodePage) {\n        CurrentCodePage = OpMinPage;\n        BlockInfo.CodePages.insert(CurrentCodePage);\n      }\n\n      if (OpMaxPage != CurrentCodePage) {\n        CurrentCodePage = OpMaxPage;\n        BlockInfo.CodePages.insert(CurrentCodePage);\n      }\n\n      BlockIt->BlockStatus = DecodeInstruction(OpAddress);\n      if (HitBadRelocation) {\n        BlockInfo.TotalInstructionCount = 0;\n        BlockInfo.Blocks = {*BlockIt};\n        BlockInfo.EntryPoints.clear();\n        BlockInfo.CodePages.clear();\n        return;\n      }\n      uint64_t OpEndAddress = OpAddress + DecodeInst->InstSize;\n\n      DecodedMinAddress = std::min(DecodedMinAddress, OpAddress);\n      DecodedMaxAddress = std::max(DecodedMaxAddress, OpEndAddress);\n\n      if (OpEndAddress > NextBlockStartAddress) {\n        // This instruction would overlap with another so skip adding it to the multiblock\n        break;\n      }\n\n      EraseBlock = false; // Block contains at least one valid instruction, so unset erase\n      ++TotalInstructions;\n      ++DecodedSize;\n      ++BlockIt->NumInstructions;\n      BlockIt->Size += DecodeInst->InstSize;\n\n      // Can not continue this block at all on invalid instruction\n      if (BlockIt->BlockStatus != DecodedBlockStatus::SUCCESS) [[unlikely]] {\n        if (!EntryBlock && BlockIt->BlockStatus != DecodedBlockStatus::BAD_RELOCATION) {\n          // In multiblock configurations, we can early terminate any non-entrypoint blocks with the expectation that this won't get hit.\n          // Improves compile-times.\n          // Just need to undo additions that this block decoding has caused.\n          TotalInstructions -= BlockIt->NumInstructions;\n          DecodedSize = BlockStartOffset;\n          InstStream -= PCOffset;\n          EraseBlock = true;\n        } else {\n          LogMan::Msg::EFmt(\"{} instruction in entry block: {:X}\",\n                            BlockIt->BlockStatus == DecodedBlockStatus::INVALID_INST   ? \"Invalid\" :\n                            BlockIt->BlockStatus == DecodedBlockStatus::NOEXEC_INST    ? \"NoExec\" :\n                            BlockIt->BlockStatus == DecodedBlockStatus::BAD_RELOCATION ? \"BadRelocation\" :\n                                                                                         \"PartialDecode\",\n                            OpAddress);\n        }\n        break;\n      }\n\n      // Check if we need to end the entire multiblock\n      FinalInstruction = DecodedSize >= MaxInst || DecodedSize >= DefaultDecodedBufferSize || TotalInstructions >= MaxInst;\n      if (FinalInstruction) {\n        break;\n      }\n\n      if (!InstCanContinue()) {\n        if (DecodeInst->TableInfo->Flags & FEXCore::X86Tables::InstFlags::FLAGS_SETS_RIP) {\n          // If we have multiblock enabled\n          // If the branch target is within our multiblock range then we can keep going on\n          // We don't want to short circuit this since we want to calculate our ranges still\n          // NOTE: This will invalidate BlockIt, this is fine as we immediately break from the loop and EraseBlock cannot be true\n          BlockIt->ForceFullSMCDetection = CTX->AreMonoHacksActive() && IsBranchMonoTailcall(BlockIt->NumInstructions);\n          BranchTargetInMultiblockRange();\n        }\n\n        break;\n      }\n\n      PCOffset += DecodeInst->InstSize;\n      InstStream += DecodeInst->InstSize;\n    }\n\n    // NOTE: BlockIt is only valid here in the EraseBlock case\n    if (EraseBlock) {\n      BlockInfo.Blocks.erase(BlockIt);\n    } else {\n      BlocksToDecode.merge(CurrentBlockTargets);\n    }\n\n    CurrentBlockTargets.clear();\n    EntryBlock = false;\n  }\n\n  BlockInfo.TotalInstructionCount = TotalInstructions;\n\n  for (auto& Block : BlockInfo.Blocks) {\n    Block.IsEntryPoint = BlockInfo.EntryPoints.contains(Block.Entry);\n  }\n}\n\n} // namespace FEXCore::Frontend\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/Frontend.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/IR/IR.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/CodeCache.h>\n#include <FEXCore/Utils/ThreadPoolAllocator.h>\n#include <FEXCore/fextl/set.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXCore/fextl/robin_map.h>\n\n#include <array>\n#include <cstddef>\n#include <cstdint>\n#include <optional>\n\nnamespace FEXCore::Context {\nclass ContextImpl;\n}\nnamespace FEXCore::HLE {\nenum class SyscallOSABI;\n}\n\nnamespace FEXCore::Frontend {\nclass Decoder final {\npublic:\n  enum class DecodedBlockStatus {\n    SUCCESS,\n    INVALID_INST,\n    NOEXEC_INST,\n    PARTIAL_DECODE_INST,\n    BAD_RELOCATION,\n  };\n\n  // New Frontend decoding\n  struct DecodedBlocks final {\n    uint64_t Entry {};\n    uint64_t Size {};\n    uint64_t NumInstructions {};\n    FEXCore::X86Tables::DecodedInst* DecodedInstructions;\n    DecodedBlockStatus BlockStatus;\n    bool IsEntryPoint {};\n    bool ForceFullSMCDetection {};\n  };\n\n  struct DecodedBlockInformation final {\n    uint64_t TotalInstructionCount;\n    bool Is64BitMode {};\n    fextl::vector<DecodedBlocks> Blocks;\n    fextl::set<uint64_t> EntryPoints;\n    fextl::set<uint64_t> CodePages; // Start addresses of all pages touching the block\n  };\n\n  Decoder(FEXCore::Core::InternalThreadState* Thread);\n  bool CheckIfCacheable(FEXCore::Core::InternalThreadState&, const uint8_t* InstStream, uint64_t PC, uint64_t MaxInst);\n  void DecodeInstructionsAtEntry(FEXCore::Core::InternalThreadState* Thread, const uint8_t* InstStream, uint64_t PC, uint64_t MaxInst);\n\n  const DecodedBlockInformation* GetDecodedBlockInfo() const {\n    return &BlockInfo;\n  }\n\n  uint64_t DecodedMinAddress {};\n  uint64_t DecodedMaxAddress {~0ULL};\n\n  void SetExternalBranches(fextl::set<uint64_t>* v) {\n    ExternalBranches = v;\n  }\n\n  void DelayedDisownBuffer() {\n    PoolObject.DelayedDisownBuffer();\n  }\n\n  void ResetExecutableRangeCache() {\n    ExecutableRangeBase = ExecutableRangeEnd = 0;\n  }\n\nprivate:\n  // To pass any information from instruction prefixes\n  // down into the actual instruction handling machinery.\n  struct DecodedHeader {\n    uint8_t vvvv; // Encoded operand in a VEX prefix.\n    bool w;       // VEX.W bit.\n    bool L;       // VEX.L bit (if set then 256 bit operation, if unset then scalar or 128-bit operation)\n  };\n\n  FEXCore::Core::InternalThreadState* Thread;\n  FEXCore::Context::ContextImpl* CTX;\n  const FEXCore::HLE::SyscallOSABI OSABI {};\n\n  FEX_CONFIG_OPT(EnableCodeCacheValidation, ENABLECODECACHEVALIDATION);\n\n  bool DecodeInstructionImpl(uint64_t PC);\n  DecodedBlockStatus DecodeInstruction(uint64_t PC);\n\n  void BranchTargetInMultiblockRange();\n  bool IsBranchMonoTailcall(uint64_t NumInstructions) const;\n  bool InstCanContinue() const;\n\n  void AddBranchTarget(uint64_t Target);\n\n  bool CheckRangeExecutable(uint64_t Address, uint64_t Size);\n\n  uint8_t ReadByte();\n  std::optional<uint8_t> PeekByte(uint8_t Offset);\n  std::pair<uint64_t, bool> ReadData(uint8_t Size);\n\n  void SkipBytes(uint8_t Size) {\n    InstructionSize += Size;\n  }\n\n  bool NormalOp(const FEXCore::X86Tables::X86InstInfo* Info, uint16_t Op, DecodedHeader Options = {});\n  bool NormalOpHeader(const FEXCore::X86Tables::X86InstInfo* Info, uint16_t Op);\n\n  void DecodeREXIfValid(int8_t ExpectedOffset = -1);\n\n  static constexpr size_t DefaultDecodedBufferSize = 0x10000;\n  FEXCore::X86Tables::DecodedInst* DecodedBuffer {};\n  Utils::PoolBufferWithTimedRetirement<FEXCore::X86Tables::DecodedInst*, 5000, 500> PoolObject;\n  size_t DecodedSize {};\n\n  uint64_t ExecutableRangeBase {};\n  uint64_t ExecutableRangeEnd {};\n  bool ExecutableRangeWritable {};\n  bool HitNonExecutableRange {};\n  bool HitBadRelocation {};\n\n  const uint8_t* InstStream {};\n  IR::OpSize GetGPROpSize() const {\n    return BlockInfo.Is64BitMode ? IR::OpSize::i64Bit : IR::OpSize::i32Bit;\n  }\n\n  static constexpr size_t MAX_INST_SIZE = 15;\n  uint8_t InstructionSize {};\n  std::array<uint8_t, MAX_INST_SIZE> Instruction;\n  uint8_t LastEscapePrefix {};\n  FEXCore::X86Tables::DecodedInst* DecodeInst;\n\n  // This is for multiblock data tracking\n  uint64_t EntryPoint {};\n  uint64_t MaxCondBranchForward {};\n  uint64_t MaxCondBranchBackwards {~0ULL};\n  uint64_t SectionMaxAddress {~0ULL};\n  uint64_t SectionMinAddress {};\n  uint64_t NextBlockStartAddress {~0ULL};\n\n  DecodedBlockInformation BlockInfo;\n  fextl::set<uint64_t> CurrentBlockTargets;\n  fextl::set<uint64_t> BlocksToDecode;\n  fextl::set<uint64_t> VisitedBlocks;\n  fextl::set<uint64_t>* ExternalBranches {nullptr};\n\n  const fextl::robin_map<uint32_t, GuestRelocationType>* Relocations {nullptr};\n\n  // ModRM rm decoding\n  using DecodeModRMPtr = void (FEXCore::Frontend::Decoder::*)(X86Tables::DecodedOperand* Operand, X86Tables::ModRMDecoded ModRM);\n  void DecodeModRM_16(X86Tables::DecodedOperand* Operand, X86Tables::ModRMDecoded ModRM);\n  void DecodeModRM_64(X86Tables::DecodedOperand* Operand, X86Tables::ModRMDecoded ModRM);\n\n  static constexpr std::array<DecodeModRMPtr, 2> DecodeModRMs_Disp {\n    &FEXCore::Frontend::Decoder::DecodeModRM_64,\n    &FEXCore::Frontend::Decoder::DecodeModRM_16,\n  };\n\n  const std::array<X86Tables::X86InstInfo, X86Tables::MAX_X87_TABLE_SIZE>* X87Table;\n\n  const std::array<X86Tables::X86InstInfo, X86Tables::MAX_VEX_TABLE_SIZE>* VEXTable {};\n  const std::array<X86Tables::X86InstInfo, X86Tables::MAX_VEX_GROUP_TABLE_SIZE>* VEXTableGroup {};\n\n  const uint8_t* AdjustAddrForSpecialRegion(const uint8_t* _InstStream, uint64_t EntryPoint, uint64_t RIP);\n};\n} // namespace FEXCore::Frontend\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/Interpreter/Fallbacks/F80Fallbacks.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include \"Common/SoftFloat.h\"\n\n#include \"Interface/Core/Interpreter/Fallbacks/FallbackOpHandler.h\"\n#include \"Interface/IR/IR.h\"\n\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/Utils/SHMStats.h>\n\nnamespace FEXCore::CPU {\nFEXCORE_PRESERVE_ALL_ATTR static softfloat_state SoftFloatStateFromFCW(uint16_t FCW, bool Force80BitPrecision = false) {\n  softfloat_state State {};\n  State.detectTininess = softfloat_tininess_afterRounding;\n  State.exceptionFlags = 0;\n  State.roundingPrecision = 80;\n\n  if (!Force80BitPrecision) {\n    auto PC = (FCW >> 8) & 3;\n    switch (PC) {\n    case 0: State.roundingPrecision = 32; break;\n    case 2: State.roundingPrecision = 64; break;\n    case 3: State.roundingPrecision = 80; break;\n    case 1: LOGMAN_MSG_A_FMT(\"Invalid x87 precision mode, {}\", PC);\n    }\n  }\n\n  auto RC = (FCW >> 10) & 3;\n  switch (RC) {\n  case 0: State.roundingMode = softfloat_round_near_even; break;\n  case 1: State.roundingMode = softfloat_round_min; break;\n  case 2: State.roundingMode = softfloat_round_max; break;\n  case 3: State.roundingMode = softfloat_round_minMag; break;\n  }\n\n  return State;\n}\n\nFEXCORE_PRESERVE_ALL_ATTR static void HandleX87Exception(const softfloat_state& State, FEXCore::Core::CpuStateFrame* Frame) {\n  // Check for Invalid Operation exception (bit 0 of X87 status word)\n  if (State.exceptionFlags & softfloat_flag_invalid) {\n    Frame->State.flags[FEXCore::X86State::X87FLAG_IE_LOC] = 1;\n  }\n}\n\n// Wrapper for SoftFloat state to handle X87 exceptions\nclass ScopedSoftFloatState {\npublic:\n  FEXCORE_PRESERVE_ALL_ATTR ScopedSoftFloatState(uint16_t FCW, FEXCore::Core::CpuStateFrame* Frame, bool Force80BitPrecision = false)\n    : State(SoftFloatStateFromFCW(FCW, Force80BitPrecision))\n    , Frame(Frame) {}\n\n  FEXCORE_PRESERVE_ALL_ATTR ~ScopedSoftFloatState() {\n    HandleX87Exception(State, Frame);\n  }\n\n  // Disable copy and move to ensure RAII semantics\n  ScopedSoftFloatState(const ScopedSoftFloatState&) = delete;\n  ScopedSoftFloatState& operator=(const ScopedSoftFloatState&) = delete;\n  ScopedSoftFloatState(ScopedSoftFloatState&&) = delete;\n  ScopedSoftFloatState& operator=(ScopedSoftFloatState&&) = delete;\n\n  softfloat_state State;\n\nprivate:\n  FEXCore::Core::CpuStateFrame* Frame;\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80CVTTO> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle4(uint16_t FCW, float src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n    return X80SoftFloat(&State.State, src);\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle8(uint16_t FCW, double src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n    return X80SoftFloat(&State.State, src);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80CMP> {\n  FEXCORE_PRESERVE_ALL_ATTR static uint64_t handle(uint16_t FCW, VectorRegType Src1, VectorRegType Src2, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n\n    bool eq, lt, nan;\n    uint64_t ResultFlags = 0;\n\n    X80SoftFloat::FCMP(&State.State, Src1, Src2, &eq, &lt, &nan);\n    if (lt) {\n      ResultFlags |= (1 << IR::FCMP_FLAG_LT);\n    }\n    if (nan) {\n      ResultFlags |= (1 << IR::FCMP_FLAG_UNORDERED);\n    }\n    if (eq) {\n      ResultFlags |= (1 << IR::FCMP_FLAG_EQ);\n    }\n    return ResultFlags;\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80CVT> {\n  FEXCORE_PRESERVE_ALL_ATTR static float handle4(uint16_t FCW, VectorRegType src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n    return X80SoftFloat(src).ToF32(&State.State);\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static double handle8(uint16_t FCW, VectorRegType src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n    return X80SoftFloat(src).ToF64(&State.State);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80CVTINT> {\n  FEXCORE_PRESERVE_ALL_ATTR static int16_t handle2(uint16_t FCW, VectorRegType src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n    return X80SoftFloat(src).ToI16(&State.State);\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static int32_t handle4(uint16_t FCW, VectorRegType src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n    return X80SoftFloat(src).ToI32(&State.State);\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static int64_t handle8(uint16_t FCW, VectorRegType src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n    return X80SoftFloat(src).ToI64(&State.State);\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static int16_t handle2t(uint16_t FCW, VectorRegType src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n    auto rv = extF80_to_i32(&State.State, X80SoftFloat(src), softfloat_round_minMag, false);\n\n    if (rv > INT16_MAX || rv < INT16_MIN) {\n      ///< Indefinite value for 16-bit conversions.\n      return INT16_MIN;\n    } else {\n      return rv;\n    }\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static int32_t handle4t(uint16_t FCW, VectorRegType src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n    return extF80_to_i32(&State.State, X80SoftFloat(src), softfloat_round_minMag, false);\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static int64_t handle8t(uint16_t FCW, VectorRegType src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n    return extF80_to_i64(&State.State, X80SoftFloat(src), softfloat_round_minMag, false);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80CVTTOINT> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle2(uint16_t FCW, int16_t src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    return X80SoftFloat(src);\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle4(uint16_t FCW, int32_t src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    return X80SoftFloat(src);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80ROUND> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame, true};\n    return X80SoftFloat::FRNDINT(&State.State, Src1);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80F2XM1> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame, true};\n    return X80SoftFloat::F2XM1(&State.State, Src1);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80TAN> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame, true};\n    return X80SoftFloat::FTAN(&State.State, Src1);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80SQRT> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n    return X80SoftFloat::FSQRT(&State.State, Src1);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80SIN> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame, true};\n    return X80SoftFloat::FSIN(&State.State, Src1);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80COS> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame, true};\n    return X80SoftFloat::FCOS(&State.State, Src1);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80SINCOS> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegPairType handle(uint16_t FCW, VectorRegType Src1, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame, true};\n    return FEXCore::MakeVectorRegPair(X80SoftFloat::FSIN(&State.State, Src1), X80SoftFloat::FCOS(&State.State, Src1));\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80XTRACT_EXP> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    return X80SoftFloat::FXTRACT_EXP(Src1);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80XTRACT_SIG> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    return X80SoftFloat::FXTRACT_SIG(Src1);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80ADD> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, VectorRegType Src2, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n    return X80SoftFloat::FADD(&State.State, Src1, Src2);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80SUB> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, VectorRegType Src2, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n    return X80SoftFloat::FSUB(&State.State, Src1, Src2);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80MUL> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, VectorRegType Src2, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n    return X80SoftFloat::FMUL(&State.State, Src1, Src2);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80DIV> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, VectorRegType Src2, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame};\n    return X80SoftFloat::FDIV(&State.State, Src1, Src2);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80FYL2X> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, VectorRegType Src2, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame, true};\n    return X80SoftFloat::FYL2X(&State.State, Src1, Src2);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80ATAN> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, VectorRegType Src2, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame, true};\n    return X80SoftFloat::FATAN(&State.State, Src1, Src2);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80FPREM1> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, VectorRegType Src2, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame, true};\n    return X80SoftFloat::FREM1(&State.State, Src1, Src2);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80FPREM> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, VectorRegType Src2, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame, true};\n    return X80SoftFloat::FREM(&State.State, Src1, Src2);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80SCALE> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1, VectorRegType Src2, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    ScopedSoftFloatState State {FCW, Frame, true};\n    return X80SoftFloat::FSCALE(&State.State, Src1, Src2);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F64SIN> {\n  FEXCORE_PRESERVE_ALL_ATTR static double handle(double src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    return sin(src);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F64COS> {\n  FEXCORE_PRESERVE_ALL_ATTR static double handle(double src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    return cos(src);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F64SINCOS> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorScalarF64Pair handle(double src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    double sin, cos;\n#ifdef _WIN32\n    sin = ::sin(src);\n    cos = ::cos(src);\n#else\n    sincos(src, &sin, &cos);\n#endif\n    return VectorScalarF64Pair {sin, cos};\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F64TAN> {\n  FEXCORE_PRESERVE_ALL_ATTR static double handle(double src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    return tan(src);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F64F2XM1> {\n  FEXCORE_PRESERVE_ALL_ATTR static double handle(double src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    return exp2(src) - 1.0;\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F64ATAN> {\n  FEXCORE_PRESERVE_ALL_ATTR static double handle(double src1, double src2, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    return atan2(src1, src2);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F64FPREM> {\n  FEXCORE_PRESERVE_ALL_ATTR static double handle(double src1, double src2, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    return fmod(src1, src2);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F64FPREM1> {\n  FEXCORE_PRESERVE_ALL_ATTR static double handle(double src1, double src2, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    return remainder(src1, src2);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F64FYL2X> {\n  FEXCORE_PRESERVE_ALL_ATTR static double handle(double src1, double src2, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    return src2 * log2(src1);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F64SCALE> {\n  FEXCORE_PRESERVE_ALL_ATTR static double handle(double src1, double src2, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    if (src1 == 0.0) { // src1 might be +/- zero\n      return src1;     // this will return negative or positive zero if when appropriate\n    }\n    double trun = trunc(src2);\n    return src1 * exp2(trun);\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80BCDSTORE> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src1q, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    X80SoftFloat Src1 = Src1q;\n    ScopedSoftFloatState State {FCW, Frame};\n    bool Negative = Src1.Top.Sign;\n\n    Src1 = X80SoftFloat::FRNDINT(&State.State, Src1);\n\n    // Clear the Sign bit\n    Src1.Top.Sign = 0;\n\n    uint64_t Tmp = Src1.ToI64(&State.State);\n    X80SoftFloat Rv;\n    uint8_t* BCD = reinterpret_cast<uint8_t*>(&Rv);\n\n    for (size_t i = 0; i < 9; ++i) {\n      if (Tmp == 0) {\n        // Nothing left? Just leave\n        break;\n      }\n      // Extract the lower 100 values\n      uint8_t Digit = Tmp % 100;\n\n      // Now divide it for the next iteration\n      Tmp /= 100;\n\n      uint8_t UpperNibble = Digit / 10;\n      uint8_t LowerNibble = Digit % 10;\n\n      // Now store the BCD\n      BCD[i] = (UpperNibble << 4) | LowerNibble;\n    }\n\n    // Set negative flag once converted to x87\n    BCD[9] = Negative ? 0x80 : 0;\n\n    return Rv;\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_F80BCDLOAD> {\n  FEXCORE_PRESERVE_ALL_ATTR static VectorRegType handle(uint16_t FCW, VectorRegType Src, FEXCore::Core::CpuStateFrame* Frame) {\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Frame->Thread, AccumulatedFloatFallbackCount, 1);\n    uint8_t* Src1 = reinterpret_cast<uint8_t*>(&Src);\n    uint64_t BCD {};\n    // We walk through each uint8_t and pull out the BCD encoding\n    // Each 4bit split is a digit\n    // Only 0-9 is supported, A-F results in undefined data\n    // | 4 bit     | 4 bit    |\n    // | 10s place | 1s place |\n    // EG 0x48 = 48\n    // EG 0x4847 = 4847\n    // This gives us an 18digit value encoded in BCD\n    // The last byte lets us know if it negative or not\n    for (size_t i = 0; i < 9; ++i) {\n      uint8_t Digit = Src1[8 - i];\n      // First shift our last value over\n      BCD *= 100;\n\n      // Add the tens place digit\n      BCD += (Digit >> 4) * 10;\n\n      // Add the ones place digit\n      BCD += Digit & 0xF;\n    }\n\n    // Set negative flag once converted to x87\n    bool Negative = Src1[9] & 0x80;\n    X80SoftFloat Tmp;\n\n    Tmp = BCD;\n    Tmp.Top.Sign = Negative;\n    return Tmp;\n  }\n};\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/Interpreter/Fallbacks/FallbackOpHandler.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <cstdint>\n\nnamespace FEXCore::IR {\nenum IROps : uint16_t;\n}\n\nnamespace FEXCore::CPU {\n\n// Base template for fallback handling.\n//\n// Registering and hooking up fallback is currently like so:\n//\n// 1. Go to InterpreterFallbacks.cpp and create a template specialization of\n//    the GetFallbackInfo member function.\n//\n//    This member function should reasonably define what the fallback you're\n//    going to create will take as parameters and return as a result. For example:\n//\n//    template<>\n//    FallbackInfo GetFallbackInfo(X80SoftFloat(*fn)(double), Core::FallbackHandlerIndex Index) {\n//      return {FABI_F80_F64, (void*)fn, Index};\n//    }\n//\n//    Defines info about a fallback that takes a double as an argument and\n//    returns a X80SoftFloat instance.\n//\n//    You will also want to define a new FallbackHandlerIndex enum member and use it\n//    to set up the new info handler into the Info array in FillFallbackIndexPointers.\n//\n// 1.1. (potentially optional). Define a new ABI element in the FallbackAPI enum.\n//      This ABI enum value will be used to tell the JITs how to handle the fallback\n//      properly. These enum values specify the return type followed by its argument types.\n//\n//      So, FABI_I64_F80_F80, for example indicates that the function will behave like a\n//      function as if were defined as:\n//\n//      uint64_t fn(X80SoftFloat, X80SoftFloat)\n//\n// 1.2. (potentially optional). If you needed to define a new enum ABI type like in 1.1, then\n//      you need to add the handling for it in the JITs, which can be found in the respective\n//      JIT's JIT.cpp file in a function called Op_Unhandled\n//\n//      You need to add a new case to the ABI switch statement using the new ABI type\n//      and do the necessary moving of data from register-allocated JIT parameters\n//      into that platform's registers that respects the calling convention. After this is\n//      done, most of the necessary background boilerplate is finished.\n//\n// 2. Now, make a specialization of this class with a member function named 'handle()'\n//    that takes the same parameters as the ones described in the fallback info function\n//    specialization.\n//\n//    For example, if you have the fallback info from the example in step 1, it would be:\n//\n//    template <>\n//    struct OpHandlers<IR::CoolNewIROpcode> {\n//      static X80SoftFloat handle(double src) {\n//        return ...;\n//      }\n//    };\n//\n// 3. Fill out the behavior of the OpHandler specialization to perform what you would like\n//    the fallback to do.\n//\n// 4. Add an implementation of the IR op to the Interpreter that passes through to the\n//    OpHandler implementation.\n//\n// 5. Done.\n//\ntemplate<IR::IROps Op>\nstruct OpHandlers {};\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/Interpreter/Fallbacks/InterpreterFallbacks.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXCore/Core/CoreState.h>\n\n#include \"Interface/Core/Interpreter/InterpreterOps.h\"\n#include \"Interface/Core/Interpreter/Fallbacks/F80Fallbacks.h\"\n#include \"Interface/Core/Interpreter/Fallbacks/VectorFallbacks.h\"\n\n#include <cstddef>\n#include <cstdint>\n\nnamespace FEXCore::CPU {\n\ntemplate<typename R, typename... Args>\nstatic FallbackInfo GetFallbackInfo(R (*fn)(Args...), FEXCore::Core::FallbackHandlerIndex HandlerIndex) {\n  return {FABI_UNKNOWN, HandlerIndex};\n}\n\nvoid InterpreterOps::FillFallbackIndexPointers(Core::FallbackABIInfo* Info, uint64_t* ABIHandlers) {\n  Info[Core::OPINDEX_F80CVTTO_4] = {ABIHandlers[FABI_F80_I16_F32_PTR],\n                                    reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80CVTTO>::handle4)};\n  Info[Core::OPINDEX_F80CVTTO_8] = {ABIHandlers[FABI_F80_I16_F64_PTR],\n                                    reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80CVTTO>::handle8)};\n  Info[Core::OPINDEX_F80CVT_4] = {ABIHandlers[FABI_F32_I16_F80_PTR], reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80CVT>::handle4)};\n  Info[Core::OPINDEX_F80CVT_8] = {ABIHandlers[FABI_F64_I16_F80_PTR], reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80CVT>::handle8)};\n  Info[Core::OPINDEX_F80CVTINT_2] = {ABIHandlers[FABI_I16_I16_F80_PTR],\n                                     reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80CVTINT>::handle2)};\n  Info[Core::OPINDEX_F80CVTINT_4] = {ABIHandlers[FABI_I32_I16_F80_PTR],\n                                     reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80CVTINT>::handle4)};\n  Info[Core::OPINDEX_F80CVTINT_8] = {ABIHandlers[FABI_I64_I16_F80_PTR],\n                                     reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80CVTINT>::handle8)};\n  Info[Core::OPINDEX_F80CVTINT_TRUNC2] = {ABIHandlers[FABI_I16_I16_F80_PTR],\n                                          reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80CVTINT>::handle2t)};\n  Info[Core::OPINDEX_F80CVTINT_TRUNC4] = {ABIHandlers[FABI_I32_I16_F80_PTR],\n                                          reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80CVTINT>::handle4t)};\n  Info[Core::OPINDEX_F80CVTINT_TRUNC8] = {ABIHandlers[FABI_I64_I16_F80_PTR],\n                                          reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80CVTINT>::handle8t)};\n  Info[Core::OPINDEX_F80CMP] = {ABIHandlers[FABI_I64_I16_F80_F80_PTR],\n                                reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80CMP>::handle)};\n  Info[Core::OPINDEX_F80CVTTOINT_2] = {ABIHandlers[FABI_F80_I16_I16_PTR],\n                                       reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80CVTTOINT>::handle2)};\n  Info[Core::OPINDEX_F80CVTTOINT_4] = {ABIHandlers[FABI_F80_I16_I32_PTR],\n                                       reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80CVTTOINT>::handle4)};\n\n  // Unary\n  Info[Core::OPINDEX_F80ROUND] = {ABIHandlers[FABI_F80_I16_F80_PTR],\n                                  reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80ROUND>::handle)};\n  Info[Core::OPINDEX_F80F2XM1] = {ABIHandlers[FABI_F80_I16_F80_PTR],\n                                  reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80F2XM1>::handle)};\n  Info[Core::OPINDEX_F80TAN] = {ABIHandlers[FABI_F80_I16_F80_PTR], reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80TAN>::handle)};\n  Info[Core::OPINDEX_F80SQRT] = {ABIHandlers[FABI_F80_I16_F80_PTR], reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80SQRT>::handle)};\n  Info[Core::OPINDEX_F80SIN] = {ABIHandlers[FABI_F80_I16_F80_PTR], reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80SIN>::handle)};\n  Info[Core::OPINDEX_F80COS] = {ABIHandlers[FABI_F80_I16_F80_PTR], reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80COS>::handle)};\n  Info[Core::OPINDEX_F80SINCOS] = {ABIHandlers[FABI_F80x2_I16_F80_PTR],\n                                   reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80SINCOS>::handle)};\n  Info[Core::OPINDEX_F80XTRACT_EXP] = {ABIHandlers[FABI_F80_I16_F80_PTR],\n                                       reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80XTRACT_EXP>::handle)};\n  Info[Core::OPINDEX_F80XTRACT_SIG] = {ABIHandlers[FABI_F80_I16_F80_PTR],\n                                       reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80XTRACT_SIG>::handle)};\n  Info[Core::OPINDEX_F80BCDSTORE] = {ABIHandlers[FABI_F80_I16_F80_PTR],\n                                     reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80BCDSTORE>::handle)};\n  Info[Core::OPINDEX_F80BCDLOAD] = {ABIHandlers[FABI_F80_I16_F80_PTR],\n                                    reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80BCDLOAD>::handle)};\n\n  // Binary\n  Info[Core::OPINDEX_F80ADD] = {ABIHandlers[FABI_F80_I16_F80_F80_PTR],\n                                reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80ADD>::handle)};\n  Info[Core::OPINDEX_F80SUB] = {ABIHandlers[FABI_F80_I16_F80_F80_PTR],\n                                reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80SUB>::handle)};\n  Info[Core::OPINDEX_F80MUL] = {ABIHandlers[FABI_F80_I16_F80_F80_PTR],\n                                reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80MUL>::handle)};\n  Info[Core::OPINDEX_F80DIV] = {ABIHandlers[FABI_F80_I16_F80_F80_PTR],\n                                reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80DIV>::handle)};\n  Info[Core::OPINDEX_F80FYL2X] = {ABIHandlers[FABI_F80_I16_F80_F80_PTR],\n                                  reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80FYL2X>::handle)};\n  Info[Core::OPINDEX_F80ATAN] = {ABIHandlers[FABI_F80_I16_F80_F80_PTR],\n                                 reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80ATAN>::handle)};\n  Info[Core::OPINDEX_F80FPREM1] = {ABIHandlers[FABI_F80_I16_F80_F80_PTR],\n                                   reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80FPREM1>::handle)};\n  Info[Core::OPINDEX_F80FPREM] = {ABIHandlers[FABI_F80_I16_F80_F80_PTR],\n                                  reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80FPREM>::handle)};\n  Info[Core::OPINDEX_F80SCALE] = {ABIHandlers[FABI_F80_I16_F80_F80_PTR],\n                                  reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F80SCALE>::handle)};\n\n  // Double Precision Unary\n  Info[Core::OPINDEX_F64SIN] = {ABIHandlers[FABI_F64_F64_PTR], reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F64SIN>::handle)};\n  Info[Core::OPINDEX_F64COS] = {ABIHandlers[FABI_F64_F64_PTR], reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F64COS>::handle)};\n  Info[Core::OPINDEX_F64SINCOS] = {ABIHandlers[FABI_F64x2_F64_PTR],\n                                   reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F64SINCOS>::handle)};\n  Info[Core::OPINDEX_F64TAN] = {ABIHandlers[FABI_F64_F64_PTR], reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F64TAN>::handle)};\n  Info[Core::OPINDEX_F64F2XM1] = {ABIHandlers[FABI_F64_F64_PTR], reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F64F2XM1>::handle)};\n\n  // Double Precision Binary\n  Info[Core::OPINDEX_F64ATAN] = {ABIHandlers[FABI_F64_F64_F64_PTR], reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F64ATAN>::handle)};\n  Info[Core::OPINDEX_F64FPREM] = {ABIHandlers[FABI_F64_F64_F64_PTR],\n                                  reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F64FPREM>::handle)};\n  Info[Core::OPINDEX_F64FPREM1] = {ABIHandlers[FABI_F64_F64_F64_PTR],\n                                   reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F64FPREM1>::handle)};\n  Info[Core::OPINDEX_F64FYL2X] = {ABIHandlers[FABI_F64_F64_F64_PTR],\n                                  reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F64FYL2X>::handle)};\n  Info[Core::OPINDEX_F64SCALE] = {ABIHandlers[FABI_F64_F64_F64_PTR],\n                                  reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_F64SCALE>::handle)};\n\n  // SSE4.2 string instructions\n  Info[Core::OPINDEX_VPCMPESTRX] = {ABIHandlers[FABI_I32_I64_I64_V128_V128_I16],\n                                    reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_VPCMPESTRX>::handle)};\n  Info[Core::OPINDEX_VPCMPISTRX] = {ABIHandlers[FABI_I32_V128_V128_I16],\n                                    reinterpret_cast<uint64_t>(&FEXCore::CPU::OpHandlers<IR::OP_VPCMPISTRX>::handle)};\n}\n\nbool InterpreterOps::GetFallbackHandler(const IR::IROp_Header* IROp, FallbackInfo* Info) {\n  const auto OpSize = IROp->Size;\n  switch (IROp->Op) {\n  case IR::OP_F80CVTTO: {\n    auto Op = IROp->C<IR::IROp_F80CVTTo>();\n\n    switch (Op->SrcSize) {\n    case IR::OpSize::i32Bit: {\n      *Info = {FABI_F80_I16_F32_PTR, Core::OPINDEX_F80CVTTO_4};\n      return true;\n    }\n    case IR::OpSize::i64Bit: {\n      *Info = {FABI_F80_I16_F64_PTR, Core::OPINDEX_F80CVTTO_8};\n      return true;\n    }\n    default: LogMan::Msg::DFmt(\"Unhandled size: {}\", OpSize);\n    }\n    break;\n  }\n  case IR::OP_F80CVT: {\n    switch (OpSize) {\n    case IR::OpSize::i32Bit: {\n      *Info = {FABI_F32_I16_F80_PTR, Core::OPINDEX_F80CVT_4};\n      return true;\n    }\n    case IR::OpSize::i64Bit: {\n      *Info = {FABI_F64_I16_F80_PTR, Core::OPINDEX_F80CVT_8};\n      return true;\n    }\n    default: LogMan::Msg::DFmt(\"Unhandled size: {}\", OpSize);\n    }\n    break;\n  }\n  case IR::OP_F80CVTINT: {\n    auto Op = IROp->C<IR::IROp_F80CVTInt>();\n\n    switch (OpSize) {\n    case IR::OpSize::i16Bit: {\n      if (Op->Truncate) {\n        *Info = {FABI_I16_I16_F80_PTR, Core::OPINDEX_F80CVTINT_TRUNC2};\n      } else {\n        *Info = {FABI_I16_I16_F80_PTR, Core::OPINDEX_F80CVTINT_2};\n      }\n      return true;\n    }\n    case IR::OpSize::i32Bit: {\n      if (Op->Truncate) {\n        *Info = {FABI_I32_I16_F80_PTR, Core::OPINDEX_F80CVTINT_TRUNC4};\n      } else {\n        *Info = {FABI_I32_I16_F80_PTR, Core::OPINDEX_F80CVTINT_4};\n      }\n      return true;\n    }\n    case IR::OpSize::i64Bit: {\n      if (Op->Truncate) {\n        *Info = {FABI_I64_I16_F80_PTR, Core::OPINDEX_F80CVTINT_TRUNC8};\n      } else {\n        *Info = {FABI_I64_I16_F80_PTR, Core::OPINDEX_F80CVTINT_8};\n      }\n      return true;\n    }\n    default: LogMan::Msg::DFmt(\"Unhandled size: {}\", OpSize);\n    }\n    break;\n  }\n  case IR::OP_F80CMP: {\n    *Info = {FABI_I64_I16_F80_F80_PTR, (Core::FallbackHandlerIndex)(Core::OPINDEX_F80CMP)};\n    return true;\n  }\n\n  case IR::OP_F80CVTTOINT: {\n    auto Op = IROp->C<IR::IROp_F80CVTToInt>();\n\n    switch (Op->SrcSize) {\n    case IR::OpSize::i16Bit: {\n      *Info = {FABI_F80_I16_I16_PTR, Core::OPINDEX_F80CVTTOINT_2};\n      return true;\n    }\n    case IR::OpSize::i32Bit: {\n      *Info = {FABI_F80_I16_I32_PTR, Core::OPINDEX_F80CVTTOINT_4};\n      return true;\n    }\n    default: LogMan::Msg::DFmt(\"Unhandled size: {}\", OpSize);\n    }\n    break;\n  }\n\n#define COMMON_UNARY_X87_OP(OP)                            \\\n  case IR::OP_F80##OP: {                                   \\\n    *Info = {FABI_F80_I16_F80_PTR, Core::OPINDEX_F80##OP}; \\\n    return true;                                           \\\n  }\n\n#define COMMON_UNARYPAIR_X87_OP(OP)                          \\\n  case IR::OP_F80##OP: {                                     \\\n    *Info = {FABI_F80x2_I16_F80_PTR, Core::OPINDEX_F80##OP}; \\\n    return true;                                             \\\n  }\n\n#define COMMON_BINARY_X87_OP(OP)                               \\\n  case IR::OP_F80##OP: {                                       \\\n    *Info = {FABI_F80_I16_F80_F80_PTR, Core::OPINDEX_F80##OP}; \\\n    return true;                                               \\\n  }\n\n#define COMMON_F64_OP(OP)                                                                              \\\n  case IR::OP_F64##OP: {                                                                               \\\n    *Info = GetFallbackInfo(&FEXCore::CPU::OpHandlers<IR::OP_F64##OP>::handle, Core::OPINDEX_F64##OP); \\\n    return true;                                                                                       \\\n  }\n\n#define COMMON_UNARY_F64_OP(OP)                        \\\n  case IR::OP_F64##OP: {                               \\\n    *Info = {FABI_F64_F64_PTR, Core::OPINDEX_F64##OP}; \\\n    return true;                                       \\\n  }\n#define COMMON_UNARYPAIR_F64_OP(OP)                      \\\n  case IR::OP_F64##OP: {                                 \\\n    *Info = {FABI_F64x2_F64_PTR, Core::OPINDEX_F64##OP}; \\\n    return true;                                         \\\n  }\n\n#define COMMON_BINARY_F64_OP(OP)                           \\\n  case IR::OP_F64##OP: {                                   \\\n    *Info = {FABI_F64_F64_F64_PTR, Core::OPINDEX_F64##OP}; \\\n    return true;                                           \\\n  }\n\n    // Unary\n    COMMON_UNARY_X87_OP(ROUND)\n    COMMON_UNARY_X87_OP(F2XM1)\n    COMMON_UNARY_X87_OP(TAN)\n    COMMON_UNARY_X87_OP(SQRT)\n    COMMON_UNARY_X87_OP(SIN)\n    COMMON_UNARY_X87_OP(COS)\n    COMMON_UNARYPAIR_X87_OP(SINCOS)\n    COMMON_UNARY_X87_OP(XTRACT_EXP)\n    COMMON_UNARY_X87_OP(XTRACT_SIG)\n    COMMON_UNARY_X87_OP(BCDSTORE)\n    COMMON_UNARY_X87_OP(BCDLOAD)\n\n    // Binary\n    COMMON_BINARY_X87_OP(ADD)\n    COMMON_BINARY_X87_OP(SUB)\n    COMMON_BINARY_X87_OP(MUL)\n    COMMON_BINARY_X87_OP(DIV)\n    COMMON_BINARY_X87_OP(FYL2X)\n    COMMON_BINARY_X87_OP(ATAN)\n    COMMON_BINARY_X87_OP(FPREM1)\n    COMMON_BINARY_X87_OP(FPREM)\n    COMMON_BINARY_X87_OP(SCALE)\n\n    // Double Precision Unary\n    COMMON_UNARY_F64_OP(F2XM1)\n    COMMON_UNARY_F64_OP(TAN)\n    COMMON_UNARY_F64_OP(SIN)\n    COMMON_UNARY_F64_OP(COS)\n    COMMON_UNARYPAIR_F64_OP(SINCOS)\n\n    // Double Precision Binary\n    COMMON_BINARY_F64_OP(FYL2X)\n    COMMON_BINARY_F64_OP(ATAN)\n    COMMON_BINARY_F64_OP(FPREM1)\n    COMMON_BINARY_F64_OP(FPREM)\n    COMMON_BINARY_F64_OP(SCALE)\n\n  // SSE4.2 Fallbacks\n  case IR::OP_VPCMPESTRX: *Info = {FABI_I32_I64_I64_V128_V128_I16, Core::OPINDEX_VPCMPESTRX}; return true;\n  case IR::OP_VPCMPISTRX: *Info = {FABI_I32_V128_V128_I16, Core::OPINDEX_VPCMPISTRX}; return true;\n\n  default: break;\n  }\n\n  return false;\n}\n\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/Interpreter/Fallbacks/StringCompareFallbacks.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Interface/Core/Interpreter/Fallbacks/VectorFallbacks.h\"\n#include \"Interface/IR/IR.h\"\n\n#ifdef ARCHITECTURE_arm64\n#include <arm_neon.h>\n#endif\n\n#include <cstring>\n\nnamespace FEXCore::CPU {\n#ifdef ARCHITECTURE_arm64\nFEXCORE_PRESERVE_ALL_ATTR static int32_t GetImplicitLength(FEXCore::VectorRegType data, uint16_t control) {\n  const auto is_using_words = (control & 1) != 0;\n\n  if (is_using_words) {\n    uint16x8_t a = vreinterpretq_u16_u8(data);\n    uint16x8_t VIndexes {};\n    const uint16x8_t VIndex16 = vdupq_n_u16(8);\n    uint16_t Indexes[8] = {\n      0, 1, 2, 3, 4, 5, 6, 7,\n    };\n    memcpy(&VIndexes, Indexes, sizeof(VIndexes));\n    auto MaskResult = vceqzq_u16(a);\n    auto SelectResult = vbslq_u16(MaskResult, VIndexes, VIndex16);\n    return vminvq_u16(SelectResult);\n  } else {\n    uint8x16_t VIndexes {};\n    const uint8x16_t VIndex16 = vdupq_n_u8(16);\n    uint8_t Indexes[16] = {\n      0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n    };\n    memcpy(&VIndexes, Indexes, sizeof(VIndexes));\n    auto MaskResult = vceqzq_u8(data);\n    auto SelectResult = vbslq_u8(MaskResult, VIndexes, VIndex16);\n    return vminvq_u8(SelectResult);\n  }\n}\n#else\nFEXCORE_PRESERVE_ALL_ATTR static int32_t GetImplicitLength(FEXCore::VectorRegType data, uint16_t control) {\n  const auto* data_u8 = reinterpret_cast<const uint8_t*>(&data);\n  const auto is_using_words = (control & 1) != 0;\n\n  int32_t length = 0;\n\n  if (is_using_words) {\n    const auto get_word = [data_u8](int32_t index) {\n      const auto* src = data_u8 + (index * sizeof(uint16_t));\n\n      uint16_t element {};\n      std::memcpy(&element, src, sizeof(uint16_t));\n      return element;\n    };\n\n    while (length < 8 && get_word(length) != 0) {\n      length++;\n    }\n  } else {\n    while (length < 16 && data_u8[length] != 0) {\n      length++;\n    }\n  }\n\n  return length;\n}\n#endif\n\n// Essentially the same in terms of behavior with VPCMPESTRX instructions,\n// with the only difference being that the length of the string is encoded\n// as part of the data vectors passed in.\n//\n// i.e. Length is determined by the presence of a NUL (all-zero) character\n//      within the data.\n//\n//      If no NUL character exists, then the length of the strings are assumed\n//      to be the max length possible for the given character size specified\n//      in the control flags (16 characters for 8-bit, and 8 characters for 16-bit).\n//\nFEXCORE_PRESERVE_ALL_ATTR uint32_t OpHandlers<IR::OP_VPCMPISTRX>::handle(FEXCore::VectorRegType lhs, FEXCore::VectorRegType rhs, uint16_t control) {\n  // Subtract by 1 in order to make validity limits 0-based\n  const auto valid_lhs = GetImplicitLength(lhs, control) - 1;\n  const auto valid_rhs = GetImplicitLength(rhs, control) - 1;\n  __uint128_t lhs_i;\n  memcpy(&lhs_i, &lhs, sizeof(lhs_i));\n  __uint128_t rhs_i;\n  memcpy(&rhs_i, &rhs, sizeof(rhs_i));\n\n  return OpHandlers<IR::OP_VPCMPESTRX>::MainBody(lhs_i, valid_lhs, rhs_i, valid_rhs, control);\n}\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/Interpreter/Fallbacks/VectorFallbacks.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <algorithm>\n#include <cstddef>\n#include <cstdint>\n#include <cstdlib>\n#include <cstring>\n\n#include \"Interface/Core/Interpreter/Fallbacks/FallbackOpHandler.h\"\n#include \"Interface/IR/IR.h\"\n#include \"Common/VectorRegType.h\"\n\nnamespace FEXCore::CPU {\n\ntemplate<>\nstruct OpHandlers<IR::OP_VPCMPESTRX> {\n  enum class AggregationOp {\n    EqualAny = 0b00,\n    Ranges = 0b01,\n    EqualEach = 0b10,\n    EqualOrdered = 0b11,\n  };\n\n  enum class SourceData {\n    U8,\n    U16,\n    S8,\n    S16,\n  };\n\n  enum class Polarity {\n    Positive,\n    Negative,\n    PositiveMasked,\n    NegativeMasked,\n  };\n\n  FEXCORE_PRESERVE_ALL_ATTR static uint32_t handle(uint64_t RAX, uint64_t RDX, VectorRegType lhs_v, VectorRegType rhs_v, uint16_t control) {\n    __uint128_t lhs;\n    memcpy(&lhs, &lhs_v, sizeof(lhs));\n    __uint128_t rhs;\n    memcpy(&rhs, &rhs_v, sizeof(rhs));\n\n    // Subtract by 1 in order to make validity limits 0-based\n    const auto valid_lhs = GetExplicitLength(RAX, control) - 1;\n    const auto valid_rhs = GetExplicitLength(RDX, control) - 1;\n\n    return MainBody(lhs, valid_lhs, rhs, valid_rhs, control);\n  }\n\n  // Main PCMPXSTRX algorithm body. Allows for reuse with both implicit and explicit length variants.\n  FEXCORE_PRESERVE_ALL_ATTR static uint32_t MainBody(const __uint128_t& lhs, int valid_lhs, const __uint128_t& rhs, int valid_rhs, uint16_t control) {\n    const uint32_t aggregation = PerformAggregation(lhs, valid_lhs, rhs, valid_rhs, control);\n    const int32_t upper_limit = (16 >> (control & 1)) - 1;\n\n    // Bits are arranged as:\n    // Bit #:   3    2    1    0\n    //         [SF | ZF | CF | OF]\n    uint32_t flags = 0;\n    flags |= (valid_rhs < upper_limit) ? 0b0100 : 0b0000;\n    flags |= (valid_lhs < upper_limit) ? 0b1000 : 0b0000;\n\n    const uint32_t result = HandlePolarity(aggregation, control, upper_limit, valid_rhs);\n    if (result != 0) {\n      flags |= 0b0010;\n    }\n    if ((result & 1) != 0) {\n      flags |= 0b0001;\n    }\n\n    // We track the flags in the usual NZCV bit position so we can msr them\n    // later. Avoids handling flags natively in JIT.\n    return result | (flags << 28);\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static int32_t GetExplicitLength(uint64_t reg, uint16_t control) {\n    // Bit 8 controls whether or not the reg value is 64-bit or 32-bit.\n    int64_t value = 0;\n    if (((control >> 8) & 1) != 0) {\n      value = static_cast<int64_t>(reg);\n    } else {\n      // We need a sign extend in this case.\n      value = static_cast<int32_t>(reg);\n    }\n\n    // If control[0] is set, then we're dealing with words instead of bytes\n    const int64_t limit = (control & 1) != 0 ? 8 : 16;\n\n    // Length needs to saturate to 16 (if bytes) or 8 (if words)\n    // when the length value is greater than 16 (if bytes)/8 (if words)\n    // or if the length value is less than -16 (if bytes)/-8 (if words).\n    if (value < -limit || value > limit) {\n      return limit;\n    }\n\n    return std::abs(static_cast<int>(value));\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static int32_t GetElement(const __uint128_t& vec, int32_t index, uint16_t control) {\n    const auto* vec_ptr = reinterpret_cast<const uint8_t*>(&vec);\n\n    // Control bits [1:0] define the data type being dealt with.\n    switch (static_cast<SourceData>(control & 0b11)) {\n    case SourceData::U8: return static_cast<int32_t>(vec_ptr[index]);\n    case SourceData::U16: {\n      uint16_t value {};\n      std::memcpy(&value, vec_ptr + (sizeof(uint16_t) * static_cast<size_t>(index)), sizeof(value));\n      return value;\n    }\n    case SourceData::S8: return static_cast<int8_t>(vec_ptr[index]);\n    case SourceData::S16:\n    default: {\n      int16_t value {};\n      std::memcpy(&value, vec_ptr + (sizeof(int16_t) * static_cast<size_t>(index)), sizeof(value));\n      return value;\n    }\n    }\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static uint32_t\n  PerformAggregation(const __uint128_t& lhs, int32_t valid_lhs, const __uint128_t& rhs, int32_t valid_rhs, uint16_t control) {\n    switch (static_cast<AggregationOp>((control >> 2) & 0b11)) {\n    case AggregationOp::EqualAny: return HandleEqualAny(lhs, valid_lhs, rhs, valid_rhs, control);\n    case AggregationOp::Ranges: return HandleRanges(lhs, valid_lhs, rhs, valid_rhs, control);\n    case AggregationOp::EqualEach: return HandleEqualEach(lhs, valid_lhs, rhs, valid_rhs, control);\n    case AggregationOp::EqualOrdered:\n    default: return HandleEqualOrdered(lhs, valid_lhs, rhs, valid_rhs, control);\n    }\n  }\n\n  FEXCORE_PRESERVE_ALL_ATTR static uint32_t HandlePolarity(uint32_t value, uint16_t control, int upper_limit, int valid_rhs) {\n    switch (static_cast<Polarity>((control >> 4) & 0b11)) {\n    case Polarity::Negative: return value ^ ((2U << upper_limit) - 1);\n    case Polarity::NegativeMasked: return value ^ ((1U << (valid_rhs + 1)) - 1);\n    case Polarity::Positive:\n    case Polarity::PositiveMasked:\n    default:\n      // Both positive masking and positive polarity are documented\n      // as both being equivalent to \"IntRes2 = IntRes1\", where IntRes1\n      // is our 'value' parameter, so we don't need to do anything in\n      // these cases except return the same value.\n      return value;\n    }\n  }\n\n  // Finds characters from an overall character set.\n  //\n  // Scans through RHS trying to find any characters contained in LHS.\n  // Think of this as a sort of vectorized version of strspn (kind of).\n  //\n  // e.g. Assume operating on two character vectors as unsigned words\n  //\n  //         0  1  2  3  4  5  6  7\n  // LHS -> [a, b, c, d, e, f, g, n]\n  // RHS -> [z, k, v, c, d, o, p, n]\n  //\n  // With both explicit lengths for each string being 8 (the max length for words),\n  // this would result in an intermediate result like:\n  //\n  //            0b1001'1000\n  //              │  │ │\n  // 'n' match ───┘  │ │\n  //                 │ │\n  // 'd' match ──────┘ │\n  //                   │\n  // 'c' match ────────┘\n  //\n  FEXCORE_PRESERVE_ALL_ATTR static uint32_t\n  HandleEqualAny(const __uint128_t& lhs, int32_t valid_lhs, const __uint128_t& rhs, int32_t valid_rhs, uint16_t control) {\n    uint32_t result = 0;\n\n    for (int j = valid_rhs; j >= 0; j--) {\n      result <<= 1;\n\n      const int rhs_value = GetElement(rhs, j, control);\n      for (int i = valid_lhs; i >= 0; i--) {\n        const int lhs_value = GetElement(lhs, i, control);\n        result |= static_cast<uint32_t>(rhs_value == lhs_value);\n      }\n    }\n\n    return result;\n  }\n\n  // Determines if a character falls within a limited range\n  //\n  // Scans through rhs using a range denoted by two elements\n  // in lhs and determines if the respective character in rhs\n  // falls within its range.\n  //\n  // i.e.\n  //      lhs_upper_bound >= rhs_value && lhs_lower_bound <= rhs_value\n  //\n  // e.g. Assume operating on two character vectors as unsigned words\n  //\n  //         0  1  2  3  4  5  6  7\n  // LHS -> [a, z, A, Z, 0, 0, 0, 0]\n  // RHS -> [z, k, ., C, M, ;, \\, ']\n  //\n  // With LHS's length being 4 and RHS's lenth being 8,\n  // this would result in an intermediate result like:\n  //\n  //                          0b0001'1011\n  //                               │ │ ││\n  // 'z' >= 'M' && 'a' <= 'M' ─────┘ │ ││\n  //                                 │ ││\n  // 'z' >= 'C' && 'a' <= 'C' ───────┘ ││\n  //                                   ││\n  // 'Z' >= 'k' && 'A' <= 'k' ─────────┘│\n  //                                    │\n  // 'Z' >= 'z' && 'A' <= 'z' ──────────┘\n  //\n  FEXCORE_PRESERVE_ALL_ATTR static uint32_t\n  HandleRanges(const __uint128_t& lhs, int32_t valid_lhs, const __uint128_t& rhs, int32_t valid_rhs, uint16_t control) {\n    uint32_t result = 0;\n\n    for (int j = valid_rhs; j >= 0; j--) {\n      result <<= 1;\n\n      const int element = GetElement(rhs, j, control);\n      for (int i = (valid_lhs - 1) | 1; i >= 0; i -= 2) {\n        const int upper_bound = GetElement(lhs, i - 0, control);\n        const int lower_bound = GetElement(lhs, i - 1, control);\n\n        const bool ge = upper_bound >= element;\n        const bool le = lower_bound <= element;\n\n        result |= static_cast<uint32_t>(ge && le);\n      }\n    }\n\n    return result;\n  }\n\n  // Determines if each character is equal to one another (string compare)\n  //\n  // Essentially the PCMPXSTRX variant of memcmp/strcmp. Sets the bit of the\n  // resulting mask if both elements are equal to one another. Otherwise\n  // sets it to false.\n  //\n  // e.g. Assume operating on two character vectors as unsigned words\n  //\n  //         0  1  2  3  4  5  6  7\n  // LHS -> [a, b, c, d, e, f, g, n]\n  // RHS -> [a, b, c, d, e, f, e, x]\n  //\n  // With both explicit lengths for each string being 8 (the max length for words),\n  // this would result in an intermediate result like:\n  //\n  //            0b0011'1111\n  //                ││ ││││\n  // 'f' == 'f' ────┘│ ││││\n  //                 │ ││││\n  // 'e' == 'e' ─────┘ ││││\n  //                   ││││\n  // 'd' == 'd' ───────┘│││\n  //                    │││\n  // 'c' == 'c' ────────┘││\n  //                     ││\n  // 'b' == 'b' ─────────┘│\n  //                      │\n  // 'a' == 'a' ──────────┘\n  //\n  FEXCORE_PRESERVE_ALL_ATTR static uint32_t\n  HandleEqualEach(const __uint128_t& lhs, int32_t valid_lhs, const __uint128_t& rhs, int32_t valid_rhs, uint16_t control) {\n    const auto upper_limit = (16 >> (control & 1)) - 1;\n    const auto max_valid = std::max(valid_lhs, valid_rhs);\n    const auto min_valid = std::min(valid_lhs, valid_rhs);\n\n    // All values past the end of string must be forced to true.\n    // (See 4.1.6 Valid/Invalid Override of Comparisons in the Intel Software Development Manual)\n    // So we can calculate this part of the mask ahead of time and set all those to-be bits to true\n    // and then progressively shift them into place over the course of execution.\n    uint32_t result = (1U << (upper_limit - max_valid)) - 1;\n    result <<= (max_valid - min_valid);\n\n    for (int i = min_valid; i >= 0; i--) {\n      const int lhs_element = GetElement(lhs, i, control);\n      const int rhs_element = GetElement(rhs, i, control);\n\n      result <<= 1;\n      result |= static_cast<uint32_t>(lhs_element == rhs_element);\n    }\n\n    return result;\n  }\n\n  // Determines if a substring exists within an overall string\n  //\n  // Somewhat equivalent to the behavior of strstr.\n  //\n  // Sets the corresponding index in the result where a substring is found.\n  //\n  // e.g. Assume operating on two character vectors as unsigned words\n  //\n  //         0  1  2  3  4  5  6  7\n  // LHS -> [b, a, x, z, y, v, o, m]\n  // RHS -> [b, a, d, b, a, n, k, s]\n  //\n  // With the length of LHS being 2 and the length of RHS being 8, we have a composition like:\n  //\n  //      Substring to look for\n  //       ┌──┴──┐\n  // LHS -> [b, a, x, z, y, v, o, m]\n  // RHS -> [b, a, d, b, a, n, k, s]\n  //       └───────────┬────────────┘\n  //         Entire string to search\n  //\n  // And we end up with a result like:\n  //\n  //            0b0000'1001\n  //                   │  │\n  // At index 3 ───────┘  │\n  //                      │\n  // At index 0 ──────────┘\n  //\n  FEXCORE_PRESERVE_ALL_ATTR static uint32_t\n  HandleEqualOrdered(const __uint128_t& lhs, int32_t valid_lhs, const __uint128_t& rhs, int32_t valid_rhs, uint16_t control) {\n    const auto upper_limit = (16 >> (control & 1)) - 1;\n\n    // Edge case!\n    // If we have *no* valid characters in our inner string, then\n    // we need to return the intermediate result as\n    // 0xFF (if operating on words) or 0xFFFF (if operating on bytes)\n    if (valid_lhs == -1) {\n      return (2U << upper_limit) - 1;\n    }\n\n    uint32_t result = 0;\n    const int initial = valid_rhs == upper_limit ? valid_rhs : valid_rhs - valid_lhs;\n    for (int j = initial; j >= 0; j--) {\n      result <<= 1;\n\n      uint32_t value = 1;\n      const int start = std::min(valid_rhs - j, valid_lhs);\n      for (int i = start; i >= 0; i--) {\n        const int lhs_value = GetElement(lhs, i + 0, control);\n        const int rhs_value = GetElement(rhs, i + j, control);\n\n        value &= static_cast<uint32_t>(lhs_value == rhs_value);\n      }\n\n      result |= value;\n    }\n\n    return result;\n  }\n};\n\ntemplate<>\nstruct OpHandlers<IR::OP_VPCMPISTRX> {\n  FEXCORE_PRESERVE_ALL_ATTR static uint32_t handle(VectorRegType lhs, VectorRegType rhs, uint16_t control);\n};\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/Interpreter/InterpreterOps.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <cstdint>\n\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/IR/IR.h>\n\nnamespace FEXCore::IR {\nclass IRListView;\nstruct IROp_Header;\n} // namespace FEXCore::IR\n\nnamespace FEXCore::CPU {\nenum FallbackABI {\n  FABI_F80_I16_F32_PTR,\n  FABI_F80_I16_F64_PTR,\n  FABI_F80_I16_I16_PTR,\n  FABI_F80_I16_I32_PTR,\n  FABI_F32_I16_F80_PTR,\n  FABI_F64_I16_F80_PTR,\n  FABI_F64_F64_PTR,\n  FABI_F64_F64_F64_PTR,\n  FABI_I16_I16_F80_PTR,\n  FABI_I32_I16_F80_PTR,\n  FABI_I64_I16_F80_PTR,\n  FABI_I64_I16_F80_F80_PTR,\n  FABI_F80_I16_F80_PTR,\n  FABI_F80_I16_F80_F80_PTR,\n  FABI_F80x2_I16_F80_PTR,\n  FABI_F64x2_F64_PTR,\n  FABI_I32_I64_I64_V128_V128_I16,\n  FABI_I32_V128_V128_I16,\n  FABI_UNKNOWN,\n};\nstruct FallbackInfo {\n  FallbackABI ABI;\n  FEXCore::Core::FallbackHandlerIndex HandlerIndex;\n};\n\nclass InterpreterOps {\npublic:\n  static void FillFallbackIndexPointers(Core::FallbackABIInfo* Info, uint64_t* ABIHandlers);\n  static bool GetFallbackHandler(const IR::IROp_Header* IROp, FallbackInfo* Info);\n};\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/JIT/ALUOps.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: backend|arm64\n$end_info$\n*/\n\n#include \"CodeEmitter/Emitter.h\"\n#include \"FEXCore/IR/IR.h\"\n#include \"Interface/Context/Context.h\"\n#include \"Interface/Core/JIT/JITClass.h\"\n#include \"Interface/IR/Passes/RegisterAllocationPass.h\"\n\nnamespace FEXCore::CPU {\n\n#define GRD(Node) (IROp->Size <= 4 ? GetDst<RA_32>(Node) : GetDst<RA_64>(Node))\n#define GRS(Node) (IROp->Size <= 4 ? GetReg<RA_32>(Node) : GetReg<RA_64>(Node))\n\n#define DEF_BINOP_WITH_CONSTANT(FEXOp, VarOp, ConstOp)                                    \\\n  DEF_OP(FEXOp) {                                                                         \\\n    auto Op = IROp->C<IR::IROp_##FEXOp>();                                                \\\n                                                                                          \\\n    uint64_t Const;                                                                       \\\n    if (IsInlineConstant(Op->Src2, &Const)) {                                             \\\n      ConstOp(ConvertSize(IROp), GetReg(Node), GetReg(Op->Src1), Const);                  \\\n    } else {                                                                              \\\n      VarOp(ConvertSize(IROp), GetReg(Node), GetZeroableReg(Op->Src1), GetReg(Op->Src2)); \\\n    }                                                                                     \\\n  }\n\nDEF_BINOP_WITH_CONSTANT(Add, add, add)\nDEF_BINOP_WITH_CONSTANT(Sub, sub, sub)\nDEF_BINOP_WITH_CONSTANT(AddWithFlags, adds, adds)\nDEF_BINOP_WITH_CONSTANT(SubWithFlags, subs, subs)\nDEF_BINOP_WITH_CONSTANT(Or, orr, orr)\nDEF_BINOP_WITH_CONSTANT(And, and_, and_)\nDEF_BINOP_WITH_CONSTANT(Andn, bic, bic)\nDEF_BINOP_WITH_CONSTANT(Xor, eor, eor)\nDEF_BINOP_WITH_CONSTANT(Lshl, lslv, lsl)\nDEF_BINOP_WITH_CONSTANT(Lshr, lsrv, lsr)\nDEF_BINOP_WITH_CONSTANT(Ror, rorv, ror)\n\nDEF_OP(Constant) {\n  auto Op = IROp->C<IR::IROp_Constant>();\n  auto Dst = GetReg(Node);\n\n  const auto PadType = [Pad = Op->Pad]() {\n    switch (Pad) {\n    case IR::ConstPad::NoPad: return CPU::Arm64Emitter::PadType::NOPAD;\n    case IR::ConstPad::DoPad: return CPU::Arm64Emitter::PadType::DOPAD;\n    default: return CPU::Arm64Emitter::PadType::AUTOPAD;\n    }\n  }();\n  LoadConstant(ARMEmitter::Size::i64Bit, Dst, Op->Constant, PadType, Op->MaxBytes);\n}\n\nDEF_OP(EntrypointOffset) {\n  auto Op = IROp->C<IR::IROp_EntrypointOffset>();\n\n  auto Constant = Entry + Op->Offset;\n  uint64_t Mask = ~0ULL;\n  const auto OpSize = IROp->Size;\n  if (OpSize == IR::OpSize::i32Bit) {\n    Mask = 0xFFFF'FFFFULL;\n  }\n\n  InsertGuestRIPMove(GetReg(Node), Constant & Mask);\n}\n\nDEF_OP(InlineConstant) {\n  // nop\n}\n\nDEF_OP(InlineEntrypointOffset) {\n  // nop\n}\n\nDEF_OP(CycleCounter) {\n  auto Op = IROp->C<IR::IROp_CycleCounter>();\n  if (CTX->HostFeatures.SupportsECV && Op->SelfSynchronizingLoads) {\n    // CNTVCTSS_EL0 is \"self-synchronizing\", which means loads can't speculate past this instruction.\n    // Stores still aren't synchronized although.\n    mrs(GetReg(Node), ARMEmitter::SystemRegister::CNTVCTSS_EL0);\n  } else {\n    if (Op->SelfSynchronizingLoads) {\n      // If ECV isn't supported then an ISB must be emitted to synchronize all instructions and loads before the cycle read.\n      isb();\n    }\n    mrs(GetReg(Node), ARMEmitter::SystemRegister::CNTVCT_EL0);\n  }\n}\n\nDEF_OP(AddShift) {\n  auto Op = IROp->C<IR::IROp_AddShift>();\n\n  add(ConvertSize48(IROp), GetReg(Node), GetReg(Op->Src1), GetReg(Op->Src2), ConvertIRShiftType(Op->Shift), Op->ShiftAmount);\n}\n\nDEF_OP(AddNZCV) {\n  auto Op = IROp->C<IR::IROp_AddNZCV>();\n\n  const auto EmitSize = ConvertSize(IROp);\n  auto Src1 = GetReg(Op->Src1);\n\n  uint64_t Const;\n  if (IsInlineConstant(Op->Src2, &Const)) {\n    LOGMAN_THROW_A_FMT(IROp->Size >= IR::OpSize::i32Bit, \"Constant not allowed here\");\n    cmn(EmitSize, Src1, Const);\n  } else if (IROp->Size < IR::OpSize::i32Bit) {\n    unsigned Shift = 32 - IR::OpSizeAsBits(IROp->Size);\n\n    lsl(ARMEmitter::Size::i32Bit, TMP1, Src1, Shift);\n    cmn(EmitSize, TMP1, GetReg(Op->Src2), ARMEmitter::ShiftType::LSL, Shift);\n  } else {\n    cmn(EmitSize, Src1, GetReg(Op->Src2));\n  }\n}\n\nDEF_OP(AdcNZCV) {\n  auto Op = IROp->C<IR::IROp_AdcNZCV>();\n\n  adcs(ConvertSize48(IROp), ARMEmitter::Reg::zr, GetReg(Op->Src1), GetReg(Op->Src2));\n}\n\nDEF_OP(AdcWithFlags) {\n  auto Op = IROp->C<IR::IROp_AdcWithFlags>();\n\n  adcs(ConvertSize48(IROp), GetReg(Node), GetZeroableReg(Op->Src1), GetReg(Op->Src2));\n}\n\nDEF_OP(AdcZeroWithFlags) {\n  auto Op = IROp->C<IR::IROp_AdcZeroWithFlags>();\n  auto Size = ConvertSize48(IROp);\n\n  cset(Size, TMP1, ARMEmitter::Condition::CC_CC);\n  adds(Size, GetReg(Node), GetReg(Op->Src1), TMP1);\n}\n\nDEF_OP(AdcZero) {\n  auto Op = IROp->C<IR::IROp_AdcZero>();\n  auto Size = ConvertSize48(IROp);\n\n  cinc(Size, GetReg(Node), GetReg(Op->Src1), ARMEmitter::Condition::CC_CC);\n}\n\nDEF_OP(Adc) {\n  auto Op = IROp->C<IR::IROp_Adc>();\n\n  adc(ConvertSize48(IROp), GetReg(Node), GetZeroableReg(Op->Src1), GetReg(Op->Src2));\n}\n\nDEF_OP(SbbWithFlags) {\n  auto Op = IROp->C<IR::IROp_SbbWithFlags>();\n\n  sbcs(ConvertSize48(IROp), GetReg(Node), GetReg(Op->Src1), GetReg(Op->Src2));\n}\n\nDEF_OP(SbbNZCV) {\n  auto Op = IROp->C<IR::IROp_SbbNZCV>();\n\n  sbcs(ConvertSize48(IROp), ARMEmitter::Reg::zr, GetReg(Op->Src1), GetReg(Op->Src2));\n}\n\nDEF_OP(Sbb) {\n  auto Op = IROp->C<IR::IROp_Sbb>();\n\n  sbc(ConvertSize48(IROp), GetReg(Node), GetZeroableReg(Op->Src1), GetReg(Op->Src2));\n}\n\nDEF_OP(TestNZ) {\n  auto Op = IROp->C<IR::IROp_TestNZ>();\n  const auto EmitSize = ConvertSize(IROp);\n\n  uint64_t Const;\n  auto Src1 = GetReg(Op->Src1);\n\n  // Shift the sign bit into place, clearing out the garbage in upper bits.\n  // Adding zero does an effective test, setting NZ according to the result and\n  // zeroing CV.\n  if (IROp->Size < IR::OpSize::i32Bit) {\n    // Cheaper to and+cmn than to lsl+lsl+tst, so do the and ourselves if\n    // needed.\n    if (Op->Src1 != Op->Src2) {\n      if (IsInlineConstant(Op->Src2, &Const)) {\n        and_(EmitSize, TMP1, Src1, Const);\n      } else {\n        auto Src2 = GetReg(Op->Src2);\n        and_(EmitSize, TMP1, Src1, Src2);\n      }\n\n      Src1 = TMP1;\n    }\n\n    unsigned Shift = 32 - IR::OpSizeAsBits(IROp->Size);\n    cmn(EmitSize, ARMEmitter::Reg::zr, Src1, ARMEmitter::ShiftType::LSL, Shift);\n  } else {\n    if (IsInlineConstant(Op->Src2, &Const)) {\n      tst(EmitSize, Src1, Const);\n    } else {\n      const auto Src2 = GetReg(Op->Src2);\n      tst(EmitSize, Src1, Src2);\n    }\n  }\n}\n\nDEF_OP(TestZ) {\n  auto Op = IROp->C<IR::IROp_TestZ>();\n  LOGMAN_THROW_A_FMT(IROp->Size < IR::OpSize::i32Bit, \"TestNZ used at higher sizes\");\n  const auto EmitSize = ARMEmitter::Size::i32Bit;\n\n  uint64_t Const;\n  uint64_t Mask = IROp->Size == IR::OpSize::i64Bit ? ~0ULL : ((1ull << IR::OpSizeAsBits(IROp->Size)) - 1);\n  auto Src1 = GetReg(Op->Src1);\n\n  if (IsInlineConstant(Op->Src2, &Const)) {\n    // We can promote 8/16-bit tests to 32-bit since the constant is masked.\n    LOGMAN_THROW_A_FMT(!(Const & ~Mask), \"constant is already masked\");\n    tst(EmitSize, Src1, Const);\n  } else {\n    const auto Src2 = GetReg(Op->Src2);\n    if (Src1 == Src2) {\n      tst(EmitSize, Src1 /* Src2 */, Mask);\n    } else {\n      and_(EmitSize, TMP1, Src1, Src2);\n      tst(EmitSize, TMP1, Mask);\n    }\n  }\n}\n\nDEF_OP(SubShift) {\n  auto Op = IROp->C<IR::IROp_SubShift>();\n\n  sub(ConvertSize48(IROp), GetReg(Node), GetReg(Op->Src1), GetReg(Op->Src2), ConvertIRShiftType(Op->Shift), Op->ShiftAmount);\n}\n\nDEF_OP(SubNZCV) {\n  auto Op = IROp->C<IR::IROp_SubNZCV>();\n  const auto OpSize = IROp->Size;\n  const auto EmitSize = ConvertSize(IROp);\n\n  uint64_t Const;\n  if (IsInlineConstant(Op->Src2, &Const)) {\n    LOGMAN_THROW_A_FMT(OpSize >= IR::OpSize::i32Bit, \"Constant not allowed here\");\n    cmp(EmitSize, GetReg(Op->Src1), Const);\n  } else {\n    unsigned Shift = OpSize < IR::OpSize::i32Bit ? (32 - IR::OpSizeAsBits(OpSize)) : 0;\n    ARMEmitter::Register ShiftedSrc1 = GetZeroableReg(Op->Src1);\n\n    // Shift to fix flags for <32-bit ops.\n    // Any shift of zero is still zero so optimize out silly zero shifts.\n    if (OpSize < IR::OpSize::i32Bit && ShiftedSrc1 != ARMEmitter::Reg::zr) {\n      lsl(ARMEmitter::Size::i32Bit, TMP1, ShiftedSrc1, Shift);\n      ShiftedSrc1 = TMP1;\n    }\n\n    if (OpSize < IR::OpSize::i32Bit) {\n      cmp(EmitSize, ShiftedSrc1, GetReg(Op->Src2), ARMEmitter::ShiftType::LSL, Shift);\n    } else {\n      cmp(EmitSize, ShiftedSrc1, GetReg(Op->Src2));\n    }\n  }\n}\n\nDEF_OP(CmpPairZ) {\n  auto Op = IROp->C<IR::IROp_CmpPairZ>();\n  const auto EmitSize = ConvertSize(IROp);\n\n  // Save NZCV\n  mrs(TMP1, ARMEmitter::SystemRegister::NZCV);\n\n  // Compare, setting Z and clobbering NzCV\n  cmp(EmitSize, GetReg(Op->Src1Lo), GetReg(Op->Src2Lo));\n  ccmp(EmitSize, GetReg(Op->Src1Hi), GetReg(Op->Src2Hi), ARMEmitter::StatusFlags::None, ARMEmitter::Condition::CC_EQ);\n\n  // Restore NzCV\n  if (CTX->HostFeatures.SupportsFlagM) {\n    rmif(TMP1, 0, 0xb /* NzCV */);\n  } else {\n    cset(ARMEmitter::Size::i32Bit, TMP2, ARMEmitter::Condition::CC_EQ);\n    bfi(ARMEmitter::Size::i32Bit, TMP1, TMP2, 30 /* lsb: Z */, 1);\n    msr(ARMEmitter::SystemRegister::NZCV, TMP1);\n  }\n}\n\nDEF_OP(CarryInvert) {\n  LOGMAN_THROW_A_FMT(CTX->HostFeatures.SupportsFlagM, \"Unsupported flagm op\");\n  cfinv();\n}\n\nDEF_OP(RmifNZCV) {\n  auto Op = IROp->C<IR::IROp_RmifNZCV>();\n  LOGMAN_THROW_A_FMT(CTX->HostFeatures.SupportsFlagM, \"Unsupported flagm op\");\n\n  rmif(GetZeroableReg(Op->Src).X(), Op->Rotate, Op->Mask);\n}\n\nDEF_OP(SetSmallNZV) {\n  auto Op = IROp->C<IR::IROp_SetSmallNZV>();\n  LOGMAN_THROW_A_FMT(CTX->HostFeatures.SupportsFlagM, \"Unsupported flagm op\");\n\n  const auto OpSize = IROp->Size;\n  LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i8Bit || OpSize == IR::OpSize::i16Bit, \"Unsupported {} size: {}\", __func__, OpSize);\n\n  if (OpSize == IR::OpSize::i8Bit) {\n    setf8(GetReg(Op->Src).W());\n  } else {\n    setf16(GetReg(Op->Src).W());\n  }\n}\n\nDEF_OP(AXFlag) {\n  if (CTX->HostFeatures.SupportsFlagM2) {\n    axflag();\n  } else {\n    // AXFLAG is defined in the Arm spec as\n    //\n    //   gt: nzCv -> nzCv\n    //   lt: Nzcv -> nzcv  <==>  1 + 0\n    //   eq: nZCv -> nZCv  <==>  1 + (~0)\n    //   un: nzCV -> nZcv  <==>  0 + 0\n    //\n    // For the latter 3 cases, we therefore get the right NZCV by adding V_inv\n    // to (eq ? ~0 : 0). The remaining case is forced with ccmn.\n    auto V_inv = GetReg(IROp->Args[0]);\n    csetm(ARMEmitter::Size::i64Bit, TMP1, ARMEmitter::Condition::CC_EQ);\n    ccmn(ARMEmitter::Size::i64Bit, V_inv, TMP1, ARMEmitter::StatusFlags {0x2} /* nzCv */, ARMEmitter::Condition::CC_LE);\n  }\n}\n\nDEF_OP(Parity) {\n  auto Op = IROp->C<IR::IROp_Parity>();\n  auto Raw = GetReg(Op->Raw);\n  auto Dest = GetReg(Node);\n\n  // Cascade to calculate parity of bottom 8-bits to bottom bit.\n  eor(ARMEmitter::Size::i32Bit, TMP1, Raw, Raw, ARMEmitter::ShiftType::LSR, 4);\n  eor(ARMEmitter::Size::i32Bit, TMP1, TMP1, TMP1, ARMEmitter::ShiftType::LSR, 2);\n\n  if (Op->Invert) {\n    eon(ARMEmitter::Size::i32Bit, Dest, TMP1, TMP1, ARMEmitter::ShiftType::LSR, 1);\n  } else {\n    eor(ARMEmitter::Size::i32Bit, Dest, TMP1, TMP1, ARMEmitter::ShiftType::LSR, 1);\n  }\n\n  // The above sequence leaves garbage in the upper bits.\n  if (Op->Mask) {\n    and_(ARMEmitter::Size::i32Bit, Dest, Dest, 1);\n  }\n}\n\nDEF_OP(CondAddNZCV) {\n  auto Op = IROp->C<IR::IROp_CondAddNZCV>();\n\n  ARMEmitter::StatusFlags Flags = (ARMEmitter::StatusFlags)Op->FalseNZCV;\n  uint64_t Const = 0;\n  auto Src1 = GetZeroableReg(Op->Src1);\n\n  if (IsInlineConstant(Op->Src2, &Const)) {\n    ccmn(ConvertSize48(IROp), Src1, Const, Flags, MapCC(Op->Cond));\n  } else {\n    ccmn(ConvertSize48(IROp), Src1, GetReg(Op->Src2), Flags, MapCC(Op->Cond));\n  }\n}\n\nDEF_OP(CondSubNZCV) {\n  auto Op = IROp->C<IR::IROp_CondSubNZCV>();\n\n  ARMEmitter::StatusFlags Flags = (ARMEmitter::StatusFlags)Op->FalseNZCV;\n  uint64_t Const = 0;\n  auto Src1 = GetZeroableReg(Op->Src1);\n\n  if (IsInlineConstant(Op->Src2, &Const)) {\n    ccmp(ConvertSize48(IROp), Src1, Const, Flags, MapCC(Op->Cond));\n  } else {\n    ccmp(ConvertSize48(IROp), Src1, GetReg(Op->Src2), Flags, MapCC(Op->Cond));\n  }\n}\n\nDEF_OP(Neg) {\n  auto Op = IROp->C<IR::IROp_Neg>();\n\n  if (Op->Cond == IR::CondClass::AL) {\n    neg(ConvertSize48(IROp), GetReg(Node), GetReg(Op->Src));\n  } else {\n    cneg(ConvertSize48(IROp), GetReg(Node), GetReg(Op->Src), MapCC(Op->Cond));\n  }\n}\n\nDEF_OP(Mul) {\n  auto Op = IROp->C<IR::IROp_Mul>();\n\n  mul(ConvertSize48(IROp), GetReg(Node), GetReg(Op->Src1), GetReg(Op->Src2));\n}\n\nDEF_OP(UMul) {\n  auto Op = IROp->C<IR::IROp_UMul>();\n\n  mul(ConvertSize48(IROp), GetReg(Node), GetReg(Op->Src1), GetReg(Op->Src2));\n}\n\nDEF_OP(UMull) {\n  auto Op = IROp->C<IR::IROp_UMull>();\n  umull(GetReg(Node).X(), GetReg(Op->Src1).W(), GetReg(Op->Src2).W());\n}\n\nDEF_OP(SMull) {\n  auto Op = IROp->C<IR::IROp_SMull>();\n  smull(GetReg(Node).X(), GetReg(Op->Src1).W(), GetReg(Op->Src2).W());\n}\n\nDEF_OP(MulH) {\n  auto Op = IROp->C<IR::IROp_MulH>();\n  const auto OpSize = IROp->Size;\n\n  LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i32Bit || OpSize == IR::OpSize::i64Bit, \"Unsupported {} size: {}\", __func__, OpSize);\n\n  const auto Dst = GetReg(Node);\n  const auto Src1 = GetReg(Op->Src1);\n  const auto Src2 = GetReg(Op->Src2);\n\n  if (OpSize == IR::OpSize::i32Bit) {\n    sxtw(TMP1, Src1.W());\n    sxtw(TMP2, Src2.W());\n    mul(ARMEmitter::Size::i32Bit, Dst, TMP1, TMP2);\n    ubfx(ARMEmitter::Size::i32Bit, Dst, Dst, 32, 32);\n  } else {\n    smulh(Dst.X(), Src1.X(), Src2.X());\n  }\n}\n\nDEF_OP(UMulH) {\n  auto Op = IROp->C<IR::IROp_UMulH>();\n  const auto OpSize = IROp->Size;\n\n  LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i32Bit || OpSize == IR::OpSize::i64Bit, \"Unsupported {} size: {}\", __func__, OpSize);\n\n  const auto Dst = GetReg(Node);\n  const auto Src1 = GetReg(Op->Src1);\n  const auto Src2 = GetReg(Op->Src2);\n\n  if (OpSize == IR::OpSize::i32Bit) {\n    uxtw(ARMEmitter::Size::i64Bit, TMP1, Src1);\n    uxtw(ARMEmitter::Size::i64Bit, TMP2, Src2);\n    mul(ARMEmitter::Size::i64Bit, Dst, TMP1, TMP2);\n    ubfx(ARMEmitter::Size::i64Bit, Dst, Dst, 32, 32);\n  } else {\n    umulh(Dst.X(), Src1.X(), Src2.X());\n  }\n}\n\nDEF_OP(Orlshl) {\n  auto Op = IROp->C<IR::IROp_Orlshl>();\n  const auto Dst = GetReg(Node);\n  const auto Src1 = GetReg(Op->Src1);\n\n  uint64_t Const;\n  if (IsInlineConstant(Op->Src2, &Const)) {\n    orr(ConvertSize(IROp), Dst, Src1, Const << Op->BitShift);\n  } else {\n    const auto Src2 = GetReg(Op->Src2);\n    orr(ConvertSize(IROp), Dst, Src1, Src2, ARMEmitter::ShiftType::LSL, Op->BitShift);\n  }\n}\n\nDEF_OP(Orlshr) {\n  auto Op = IROp->C<IR::IROp_Orlshr>();\n\n  const auto Dst = GetReg(Node);\n  const auto Src1 = GetReg(Op->Src1);\n\n  uint64_t Const;\n  if (IsInlineConstant(Op->Src2, &Const)) {\n    orr(ConvertSize(IROp), Dst, Src1, Const >> Op->BitShift);\n  } else {\n    const auto Src2 = GetReg(Op->Src2);\n    orr(ConvertSize(IROp), Dst, Src1, Src2, ARMEmitter::ShiftType::LSR, Op->BitShift);\n  }\n}\n\nDEF_OP(Ornror) {\n  auto Op = IROp->C<IR::IROp_Ornror>();\n\n  const auto Dst = GetReg(Node);\n  const auto Src1 = GetReg(Op->Src1);\n\n  const auto Src2 = GetReg(Op->Src2);\n  orn(ConvertSize(IROp), Dst, Src1, Src2, ARMEmitter::ShiftType::ROR, Op->BitShift);\n}\n\nDEF_OP(AndWithFlags) {\n  auto Op = IROp->C<IR::IROp_AndWithFlags>();\n  const auto OpSize = IROp->Size;\n  const auto EmitSize = ConvertSize(IROp);\n\n  uint64_t Const;\n  const auto Dst = GetReg(Node);\n  auto Src1 = GetReg(Op->Src1);\n\n  // See TestNZ\n  if (OpSize < IR::OpSize::i32Bit) {\n    if (IsInlineConstant(Op->Src2, &Const)) {\n      and_(EmitSize, Dst, Src1, Const);\n    } else {\n      auto Src2 = GetReg(Op->Src2);\n\n      if (Src1 != Src2) {\n        and_(EmitSize, Dst, Src1, Src2);\n      } else if (Dst != Src1) {\n        mov(ARMEmitter::Size::i64Bit, Dst, Src1);\n      }\n    }\n\n    unsigned Shift = 32 - IR::OpSizeAsBits(OpSize);\n    cmn(EmitSize, ARMEmitter::Reg::zr, Dst, ARMEmitter::ShiftType::LSL, Shift);\n  } else {\n    if (IsInlineConstant(Op->Src2, &Const)) {\n      ands(EmitSize, Dst, Src1, Const);\n    } else {\n      const auto Src2 = GetReg(Op->Src2);\n      ands(EmitSize, Dst, Src1, Src2);\n    }\n  }\n}\n\nDEF_OP(AndShift) {\n  auto Op = IROp->C<IR::IROp_XorShift>();\n\n  and_(ConvertSize48(IROp), GetReg(Node), GetReg(Op->Src1), GetReg(Op->Src2), ConvertIRShiftType(Op->Shift), Op->ShiftAmount);\n}\n\nDEF_OP(XorShift) {\n  auto Op = IROp->C<IR::IROp_XorShift>();\n\n  eor(ConvertSize48(IROp), GetReg(Node), GetReg(Op->Src1), GetReg(Op->Src2), ConvertIRShiftType(Op->Shift), Op->ShiftAmount);\n}\n\nDEF_OP(XornShift) {\n  auto Op = IROp->C<IR::IROp_XornShift>();\n\n  eon(ConvertSize48(IROp), GetReg(Node), GetReg(Op->Src1), GetReg(Op->Src2), ConvertIRShiftType(Op->Shift), Op->ShiftAmount);\n}\n\nDEF_OP(Ashr) {\n  auto Op = IROp->C<IR::IROp_Ashr>();\n  const auto OpSize = IROp->Size;\n  const auto EmitSize = ConvertSize(IROp);\n\n  const auto Dst = GetReg(Node);\n  const auto Src1 = GetReg(Op->Src1);\n\n  uint64_t Const;\n  if (IsInlineConstant(Op->Src2, &Const)) {\n    if (OpSize >= IR::OpSize::i32Bit) {\n      asr(EmitSize, Dst, Src1, (unsigned int)Const);\n    } else {\n      sbfx(EmitSize, TMP1, Src1, 0, IR::OpSizeAsBits(OpSize));\n      asr(EmitSize, Dst, TMP1, (unsigned int)Const);\n      ubfx(EmitSize, Dst, Dst, 0, IR::OpSizeAsBits(OpSize));\n    }\n  } else {\n    const auto Src2 = GetReg(Op->Src2);\n    if (OpSize >= IR::OpSize::i32Bit) {\n      asrv(EmitSize, Dst, Src1, Src2);\n    } else {\n      sbfx(EmitSize, TMP1, Src1, 0, IR::OpSizeAsBits(OpSize));\n      asrv(EmitSize, Dst, TMP1, Src2);\n      ubfx(EmitSize, Dst, Dst, 0, IR::OpSizeAsBits(OpSize));\n    }\n  }\n}\n\nDEF_OP(ShiftFlags) {\n  auto Op = IROp->C<IR::IROp_ShiftFlags>();\n  const auto OpSize = Op->Size;\n  const auto EmitSize = OpSize == IR::OpSize::i64Bit ? ARMEmitter::Size::i64Bit : ARMEmitter::Size::i32Bit;\n\n  const auto PFOutput = GetReg(Node);\n  const auto PFInput = GetReg(Op->PFInput);\n  const auto Dst = GetReg(Op->Result);\n  const auto Src1 = GetReg(Op->Src1);\n  const auto Src2 = GetReg(Op->Src2);\n\n  bool PFBlocked = (PFOutput == Dst) || (PFOutput == Src1) || (PFOutput == Src2);\n  const auto PFTemp = PFBlocked ? TMP4 : PFOutput;\n\n  // Set the output outside the branch to avoid needing an extra leg of the\n  // branch. We specifically do not hardcode the PF register anywhere (relying\n  // on a tied SRA register instead) to avoid fighting with RA.\n  if (PFTemp != PFInput) {\n    mov(ARMEmitter::Size::i64Bit, PFTemp, PFInput);\n  }\n\n  // We need to mask the source before comparing it. We don't just skip flag\n  // updates for Src2=0 but anything that masks to zero.\n  and_(ARMEmitter::Size::i32Bit, TMP1, Src2, OpSize == IR::OpSize::i64Bit ? 0x3f : 0x1f);\n\n  ARMEmitter::ForwardLabel Done;\n  (void)cbz(EmitSize, TMP1, &Done);\n  {\n    // PF/SF/ZF/OF\n    if (OpSize >= IR::OpSize::i32Bit) {\n      ands(EmitSize, PFTemp, Dst, Dst);\n    } else {\n      unsigned Shift = 32 - (IR::OpSizeToSize(OpSize) * 8);\n      cmn(EmitSize, ARMEmitter::Reg::zr, Dst, ARMEmitter::ShiftType::LSL, Shift);\n      mov(ARMEmitter::Size::i64Bit, PFTemp, Dst);\n    }\n\n    auto CFWord = TMP1;\n    unsigned CFBit = 0;\n\n    // Extract the last bit shifted in to CF\n    if (Op->Shift == IR::ShiftType::LSL) {\n      if (OpSize >= IR::OpSize::i32Bit) {\n        neg(EmitSize, CFWord, Src2);\n        lsrv(EmitSize, CFWord, Src1, CFWord);\n      } else {\n        CFWord = Dst.X();\n        CFBit = IR::OpSizeToSize(OpSize) * 8;\n      }\n    } else {\n      sub(ARMEmitter::Size::i64Bit, CFWord, Src2, 1);\n      lsrv(EmitSize, CFWord, Src1, CFWord);\n    }\n\n    if (Op->InvertCF) {\n      mvn(ARMEmitter::Size::i64Bit, TMP1, CFWord);\n      CFWord = TMP1;\n    }\n\n    bool SetOF = Op->Shift != IR::ShiftType::ASR;\n    if (SetOF) {\n      // Only defined when Shift is 1 else undefined\n      // OF flag is set if a sign change occurred\n      eor(EmitSize, TMP3, Src1, Dst);\n    }\n\n    if (CTX->HostFeatures.SupportsFlagM) {\n      rmif(CFWord, (CFBit - 1) % 64, (1 << 1) /* C */);\n\n      if (SetOF) {\n        rmif(TMP3, IR::OpSizeToSize(OpSize) * 8 - 1, (1 << 0) /* V */);\n      }\n    } else {\n      mrs(TMP2, ARMEmitter::SystemRegister::NZCV);\n\n      if (CFBit != 0) {\n        lsr(ARMEmitter::Size::i64Bit, TMP1, CFWord, CFBit);\n        CFWord = TMP1;\n      }\n\n      bfi(ARMEmitter::Size::i32Bit, TMP2, CFWord, 29 /* C */, 1);\n\n      if (SetOF) {\n        lsr(EmitSize, TMP3, TMP3, IR::OpSizeToSize(OpSize) * 8 - 1);\n        bfi(ARMEmitter::Size::i32Bit, TMP2, TMP3, 28 /* V */, 1);\n      }\n\n      msr(ARMEmitter::SystemRegister::NZCV, TMP2);\n    }\n  }\n  (void)Bind(&Done);\n\n  // TODO: Make RA less dumb so this can't happen (e.g. with late-kill).\n  if (PFOutput != PFTemp) {\n    mov(ARMEmitter::Size::i64Bit, PFOutput, PFTemp);\n  }\n}\n\nDEF_OP(RotateFlags) {\n  auto Op = IROp->C<IR::IROp_RotateFlags>();\n  const auto Result = GetReg(Op->Result);\n  const auto Shift = GetReg(Op->Shift);\n  const bool Left = Op->Left;\n  const auto EmitSize = Op->Size == IR::OpSize::i64Bit ? ARMEmitter::Size::i64Bit : ARMEmitter::Size::i32Bit;\n\n  // If shift=0, flags are unaffected. Wrap the whole implementation in a cbz.\n  ARMEmitter::ForwardLabel Done;\n  (void)cbz(EmitSize, Shift, &Done);\n  {\n    // Extract the last bit shifted in to CF\n    const auto BitSize = IR::OpSizeToSize(Op->Size) * 8;\n    unsigned CFBit = Left ? 0 : BitSize - 1;\n\n    // For ROR, OF is the XOR of the new CF bit and the most significant bit of the result.\n    // For ROL, OF is the LSB and MSB XOR'd together.\n    // OF is architecturally only defined for 1-bit rotate.\n    eor(ARMEmitter::Size::i64Bit, TMP1, Result, Result, ARMEmitter::ShiftType::LSR, Left ? BitSize - 1 : 1);\n    unsigned OFBit = Left ? 0 : BitSize - 2;\n\n    // Invert result so we get inverted carry.\n    mvn(ARMEmitter::Size::i64Bit, TMP2, Result);\n\n    if (CTX->HostFeatures.SupportsFlagM) {\n      rmif(TMP2, (CFBit - 1) % 64, 1 << 1 /* nzCv */);\n      rmif(TMP1, OFBit, 1 << 0 /* nzcV */);\n    } else {\n      if (OFBit != 0) {\n        lsr(EmitSize, TMP1, TMP1, OFBit);\n      }\n      if (CFBit != 0) {\n        lsr(EmitSize, TMP2, TMP2, CFBit);\n      }\n\n      mrs(TMP3, ARMEmitter::SystemRegister::NZCV);\n      bfi(ARMEmitter::Size::i32Bit, TMP3, TMP1, 28 /* V */, 1);\n      bfi(ARMEmitter::Size::i32Bit, TMP3, TMP2, 29 /* C */, 1);\n      msr(ARMEmitter::SystemRegister::NZCV, TMP3);\n    }\n  }\n  (void)Bind(&Done);\n}\n\nDEF_OP(Extr) {\n  auto Op = IROp->C<IR::IROp_Extr>();\n  const auto Dst = GetReg(Node);\n  const auto Upper = GetReg(Op->Upper);\n  const auto Lower = GetReg(Op->Lower);\n\n  extr(ConvertSize48(IROp), Dst, Upper, Lower, Op->LSB);\n}\n\nDEF_OP(PDep) {\n  auto Op = IROp->C<IR::IROp_PExt>();\n  const auto EmitSize = ConvertSize48(IROp);\n\n  const auto Dest = GetReg(Node);\n\n  // We can't clobber these\n  const auto OrigInput = GetReg(Op->Input);\n  const auto OrigMask = GetReg(Op->Mask);\n\n  if (CTX->HostFeatures.SupportsSVEBitPerm) {\n    // SVE added support for PDEP but it needs to be done in a vector register.\n    if (EmitSize == ARMEmitter::Size::i32Bit) {\n      fmov(ARMEmitter::Size::i32Bit, VTMP1.S(), OrigInput.W());\n      fmov(ARMEmitter::Size::i32Bit, VTMP2.S(), OrigMask.W());\n      bdep(ARMEmitter::SubRegSize::i32Bit, VTMP1.Z(), VTMP1.Z(), VTMP2.Z());\n      umov<ARMEmitter::SubRegSize::i32Bit>(Dest, VTMP1, 0);\n    } else {\n      fmov(ARMEmitter::Size::i64Bit, VTMP1.D(), OrigInput.X());\n      fmov(ARMEmitter::Size::i64Bit, VTMP2.D(), OrigMask.X());\n      bdep(ARMEmitter::SubRegSize::i64Bit, VTMP1.Z(), VTMP1.Z(), VTMP2.Z());\n      umov<ARMEmitter::SubRegSize::i64Bit>(Dest, VTMP1, 0);\n    }\n  } else {\n    // PDep implementation follows the ideas from\n    // http://0x80.pl/articles/pdep-soft-emu.html ... Basically, iterate the *set*\n    // bits only, which will be faster than the naive implementation as long as\n    // there are enough holes in the mask.\n    //\n    // The specific arm64 assembly used is based on the sequence that clang\n    // generates for the C code, giving context to the scheduling yielding better\n    // ILP than I would do by hand. The registers are allocated by hand however,\n    // to fit within the tight constraints we have here withot spilling. Also, we\n    // use cbz/cbnz for conditional branching to avoid clobbering NZCV.\n\n    // So we have shadow as temporaries\n    const auto Input = TMP1.R();\n    const auto Mask = TMP2.R();\n\n    // these get used variously as scratch\n    const auto T0 = TMP3.R();\n    const auto T1 = TMP4.R();\n\n    ARMEmitter::BackwardLabel NextBit;\n    ARMEmitter::ForwardLabel Done;\n\n    // First, copy the input/mask, since we'll be clobbering. Copy as 64-bit to\n    // make this 0-uop on Firestorm.\n    mov(ARMEmitter::Size::i64Bit, Input, OrigInput);\n    mov(ARMEmitter::Size::i64Bit, Mask, OrigMask);\n\n    // Now, they're copied, so we can start setting Dest (even if it overlaps with\n    // one of them).  Handle early exit case\n    mov(EmitSize, Dest, 0);\n    (void)cbz(EmitSize, OrigMask, &Done);\n\n    // Setup for first iteration\n    neg(EmitSize, T0, Mask);\n    and_(EmitSize, T0, T0, Mask);\n\n    // Main loop\n    (void)Bind(&NextBit);\n    sbfx(EmitSize, T1, Input, 0, 1);\n    eor(EmitSize, Mask, Mask, T0);\n    and_(EmitSize, T0, T1, T0);\n    neg(EmitSize, T1, Mask);\n    orr(EmitSize, Dest, Dest, T0);\n    lsr(EmitSize, Input, Input, 1);\n    and_(EmitSize, T0, Mask, T1);\n    (void)cbnz(EmitSize, T0, &NextBit);\n\n    // All done with nothing to do.\n    (void)Bind(&Done);\n  }\n}\n\nDEF_OP(PExt) {\n  auto Op = IROp->C<IR::IROp_PExt>();\n  const auto OpSize = IROp->Size;\n  const auto OpSizeBitsM1 = IR::OpSizeAsBits(OpSize) - 1;\n  const auto EmitSize = ConvertSize48(IROp);\n\n  const auto Input = GetReg(Op->Input);\n  const auto Mask = GetReg(Op->Mask);\n  const auto Dest = GetReg(Node);\n\n  if (CTX->HostFeatures.SupportsSVEBitPerm) {\n    // SVE added support for PEXT but it needs to be done in a vector register.\n    if (EmitSize == ARMEmitter::Size::i32Bit) {\n      fmov(ARMEmitter::Size::i32Bit, VTMP1.S(), Input.W());\n      fmov(ARMEmitter::Size::i32Bit, VTMP2.S(), Mask.W());\n      bext(ARMEmitter::SubRegSize::i32Bit, VTMP1.Z(), VTMP1.Z(), VTMP2.Z());\n      umov<ARMEmitter::SubRegSize::i32Bit>(Dest, VTMP1, 0);\n    } else {\n      fmov(ARMEmitter::Size::i64Bit, VTMP1.D(), Input.X());\n      fmov(ARMEmitter::Size::i64Bit, VTMP2.D(), Mask.X());\n      bext(ARMEmitter::SubRegSize::i64Bit, VTMP1.Z(), VTMP1.Z(), VTMP2.Z());\n      umov<ARMEmitter::SubRegSize::i64Bit>(Dest, VTMP1, 0);\n    }\n  } else {\n    const auto MaskReg = TMP1;\n    const auto BitReg = TMP2;\n    const auto ValueReg = TMP3;\n\n    ARMEmitter::ForwardLabel EarlyExit;\n    ARMEmitter::BackwardLabel NextBit;\n    ARMEmitter::ForwardLabel Done;\n\n    (void)cbz(EmitSize, Mask, &EarlyExit);\n    mov(EmitSize, MaskReg, Mask);\n    mov(EmitSize, ValueReg, Input);\n    mov(EmitSize, Dest, ARMEmitter::Reg::zr);\n\n    // Main loop\n    (void)Bind(&NextBit);\n    (void)cbz(EmitSize, MaskReg, &Done);\n    clz(EmitSize, BitReg, MaskReg);\n    lslv(EmitSize, ValueReg, ValueReg, BitReg);\n    lslv(EmitSize, MaskReg, MaskReg, BitReg);\n    extr(EmitSize, Dest, Dest, ValueReg, OpSizeBitsM1);\n    bfc(EmitSize, MaskReg, OpSizeBitsM1, 1);\n    (void)b(&NextBit);\n\n    // Early exit\n    (void)Bind(&EarlyExit);\n    mov(EmitSize, Dest, ARMEmitter::Reg::zr);\n\n    // All done with nothing to do.\n    (void)Bind(&Done);\n  }\n}\n\nDEF_OP(Div) {\n  auto Op = IROp->C<IR::IROp_Div>();\n  const auto OpSize = IROp->Size;\n\n  const auto Quotient = GetReg(Op->OutQuotient);\n  const auto Remainder = GetReg(Op->OutRemainder);\n  auto Lower = GetReg(Op->Lower);\n  auto Divisor = GetReg(Op->Divisor);\n\n  if (Op->Upper.IsInvalid()) {\n    const auto EmitSize = ConvertSize(IROp);\n\n    if (OpSize == IR::OpSize::i8Bit) {\n      sxtb(EmitSize, TMP1, Lower);\n      sxtb(EmitSize, TMP2, Divisor);\n\n      Lower = TMP1;\n      Divisor = TMP2;\n    } else if (OpSize == IR::OpSize::i16Bit) {\n      sxth(EmitSize, TMP1, Lower);\n      sxth(EmitSize, TMP2, Divisor);\n\n      Lower = TMP1;\n      Divisor = TMP2;\n    }\n\n    sdiv(EmitSize, Quotient, Lower, Divisor);\n    msub(EmitSize, Remainder, Quotient, Divisor, Lower);\n    return;\n  }\n\n  const auto EmitSize = OpSize >= IR::OpSize::i32Bit ? ARMEmitter::Size::i64Bit : ARMEmitter::Size::i32Bit;\n  const auto Upper = GetReg(Op->Upper);\n\n  // Each source is OpSize in size\n  // So you can have up to a 128bit divide from x86-64\n  switch (OpSize) {\n  case IR::OpSize::i16Bit: {\n    uxth(EmitSize, TMP1, Lower);\n    bfi(EmitSize, TMP1, Upper, 16, 16);\n    sxth(EmitSize, TMP2, Divisor);\n    sdiv(EmitSize, Quotient, TMP1, TMP2);\n    msub(EmitSize, Remainder, Quotient, TMP2, TMP1);\n    break;\n  }\n  case IR::OpSize::i32Bit: {\n    // TODO: 32-bit operation should be guaranteed not to leave garbage in the upper bits.\n    mov(EmitSize, TMP1, Lower);\n    bfi(EmitSize, TMP1, Upper, 32, 32);\n    sxtw(TMP2, Divisor.W());\n    sdiv(EmitSize, Quotient, TMP1, TMP2);\n    msub(EmitSize, Remainder, Quotient, TMP2, TMP1);\n    break;\n  }\n  case IR::OpSize::i64Bit: {\n    ARMEmitter::ForwardLabel Only64Bit {};\n    ARMEmitter::ForwardLabel LongDIVRet {};\n\n    // Check if the upper bits match the top bit of the lower 64-bits\n    // Sign extend the top bit of lower bits\n    sbfx(EmitSize, TMP1, Lower, 63, 1);\n    eor(EmitSize, TMP1, TMP1, Upper);\n\n    // If the sign bit matches then the result is zero\n    (void)cbz(EmitSize, TMP1, &Only64Bit);\n\n    // Long divide\n    {\n      mov(EmitSize, TMP1, Upper);\n      mov(EmitSize, TMP2, Lower);\n      mov(EmitSize, TMP3, Divisor);\n\n      ldr(TMP4, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.LDIVHandler));\n\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n      blr(TMP4);\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n\n      // Move results to the destination registers\n      mov(EmitSize, Quotient, TMP1);\n      mov(EmitSize, Remainder, TMP2);\n\n      // Skip 64-bit path\n      (void)b(&LongDIVRet);\n    }\n\n    (void)Bind(&Only64Bit);\n    // 64-Bit only\n    {\n      sdiv(EmitSize, Quotient, Lower, Divisor);\n      msub(EmitSize, Remainder, Quotient, Divisor, Lower);\n    }\n\n    (void)Bind(&LongDIVRet);\n    break;\n  }\n  default: LOGMAN_MSG_A_FMT(\"Unknown DIV Size: {}\", OpSize); break;\n  }\n}\n\nDEF_OP(UDiv) {\n  auto Op = IROp->C<IR::IROp_UDiv>();\n  const auto OpSize = IROp->Size;\n\n  const auto Quotient = GetReg(Op->OutQuotient);\n  const auto Remainder = GetReg(Op->OutRemainder);\n  const auto Lower = GetReg(Op->Lower);\n  const auto Divisor = GetReg(Op->Divisor);\n\n  // Each source is OpSize in size\n  // So you can have up to a 128bit divide from x86-64=\n  if (Op->Upper.IsInvalid()) {\n    const auto EmitSize = ConvertSize(IROp);\n    udiv(EmitSize, Quotient, Lower, Divisor);\n    msub(EmitSize, Remainder, Quotient, Divisor, Lower);\n    return;\n  }\n\n  const auto EmitSize = OpSize >= IR::OpSize::i32Bit ? ARMEmitter::Size::i64Bit : ARMEmitter::Size::i32Bit;\n  const auto Upper = GetReg(Op->Upper);\n\n  switch (OpSize) {\n  case IR::OpSize::i16Bit: {\n    uxth(EmitSize, TMP1, Lower);\n    bfi(EmitSize, TMP1, Upper, 16, 16);\n    udiv(EmitSize, Quotient, TMP1, Divisor);\n    msub(EmitSize, Remainder, Quotient, Divisor, TMP1);\n    break;\n  }\n  case IR::OpSize::i32Bit: {\n    // We need to mask divisor if we have Upper bits, since the frontend does\n    // not on the hope that we can optimize to use the path above.\n    mov(ARMEmitter::Size::i32Bit, TMP2, Divisor);\n\n    // TODO: 32-bit operation should be guaranteed not to leave garbage in the upper bits.\n    mov(EmitSize, TMP1, Lower);\n    bfi(EmitSize, TMP1, Upper, 32, 32);\n    udiv(EmitSize, Quotient, TMP1, TMP2);\n    msub(EmitSize, Remainder, Quotient, TMP2, TMP1);\n    break;\n  }\n  case IR::OpSize::i64Bit: {\n    ARMEmitter::ForwardLabel Only64Bit {};\n    ARMEmitter::ForwardLabel LongDIVRet {};\n\n    // Check the upper bits for zero\n    // If the upper bits are zero then we can do a 64-bit divide\n    (void)cbz(EmitSize, Upper, &Only64Bit);\n\n    // Long divide\n    {\n      mov(EmitSize, TMP1, Upper);\n      mov(EmitSize, TMP2, Lower);\n      mov(EmitSize, TMP3, Divisor);\n\n      ldr(TMP4, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.LUDIVHandler));\n\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n      blr(TMP4);\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n\n      // Move results to the destination registers\n      mov(EmitSize, Quotient, TMP1);\n      mov(EmitSize, Remainder, TMP2);\n\n      // Skip 64-bit path\n      (void)b(&LongDIVRet);\n    }\n\n    (void)Bind(&Only64Bit);\n    // 64-Bit only\n    {\n      udiv(EmitSize, Quotient, Lower, Divisor);\n      msub(EmitSize, Remainder, Quotient, Divisor, Lower);\n    }\n\n    (void)Bind(&LongDIVRet);\n    break;\n  }\n  default: LOGMAN_MSG_A_FMT(\"Unknown LUDIV Size: {}\", OpSize); break;\n  }\n}\n\nDEF_OP(Not) {\n  auto Op = IROp->C<IR::IROp_Not>();\n\n  const auto Dst = GetReg(Node);\n  const auto Src = GetReg(Op->Src);\n\n  mvn(ConvertSize48(IROp), Dst, Src);\n}\n\nDEF_OP(Popcount) {\n  auto Op = IROp->C<IR::IROp_Popcount>();\n  const auto OpSize = IROp->Size;\n\n  const auto Dst = GetReg(Node);\n  const auto Src = GetReg(Op->Src);\n\n  if (CTX->HostFeatures.SupportsCSSC) {\n    switch (OpSize) {\n    case IR::OpSize::i8Bit:\n      uxtb(ARMEmitter::Size::i32Bit, Dst, Src);\n      cnt(ARMEmitter::Size::i32Bit, Dst, Dst);\n      break;\n    case IR::OpSize::i16Bit:\n      uxth(ARMEmitter::Size::i32Bit, Dst, Src);\n      cnt(ARMEmitter::Size::i32Bit, Dst, Dst);\n      break;\n    case IR::OpSize::i32Bit: cnt(ARMEmitter::Size::i32Bit, Dst, Src); break;\n    case IR::OpSize::i64Bit: cnt(ARMEmitter::Size::i64Bit, Dst, Src); break;\n    default: LOGMAN_MSG_A_FMT(\"Unsupported Popcount size: {}\", OpSize);\n    }\n  } else {\n    switch (OpSize) {\n    case IR::OpSize::i8Bit:\n      fmov(ARMEmitter::Size::i32Bit, VTMP1.S(), Src);\n      // only use lowest byte\n      cnt(ARMEmitter::SubRegSize::i8Bit, VTMP1.D(), VTMP1.D());\n      break;\n    case IR::OpSize::i16Bit:\n      fmov(ARMEmitter::Size::i32Bit, VTMP1.S(), Src);\n      cnt(ARMEmitter::SubRegSize::i8Bit, VTMP1.D(), VTMP1.D());\n      // only count two lowest bytes\n      addp(ARMEmitter::SubRegSize::i8Bit, VTMP1.D(), VTMP1.D(), VTMP1.D());\n      break;\n    case IR::OpSize::i32Bit:\n      fmov(ARMEmitter::Size::i32Bit, VTMP1.S(), Src);\n      cnt(ARMEmitter::SubRegSize::i8Bit, VTMP1.D(), VTMP1.D());\n      // fmov has zero extended, unused bytes are zero\n      addv(ARMEmitter::SubRegSize::i8Bit, VTMP1.D(), VTMP1.D());\n      break;\n    case IR::OpSize::i64Bit:\n      fmov(ARMEmitter::Size::i64Bit, VTMP1.D(), Src);\n      cnt(ARMEmitter::SubRegSize::i8Bit, VTMP1.D(), VTMP1.D());\n      // fmov has zero extended, unused bytes are zero\n      addv(ARMEmitter::SubRegSize::i8Bit, VTMP1.D(), VTMP1.D());\n      break;\n    default: LOGMAN_MSG_A_FMT(\"Unsupported Popcount size: {}\", OpSize);\n    }\n\n    umov<ARMEmitter::SubRegSize::i8Bit>(Dst, VTMP1, 0);\n  }\n}\n\nDEF_OP(FindLSB) {\n  auto Op = IROp->C<IR::IROp_FindLSB>();\n  const auto EmitSize = ConvertSize(IROp);\n\n  const auto Dst = GetReg(Node);\n  const auto Src = GetReg(Op->Src);\n\n  // We assume the source is nonzero, so we can just rbit+clz without worrying\n  // about upper garbage for smaller types.\n  rbit(EmitSize, TMP1, Src);\n  clz(EmitSize, Dst, TMP1);\n}\n\nDEF_OP(FindMSB) {\n  auto Op = IROp->C<IR::IROp_FindMSB>();\n  const auto OpSize = IROp->Size;\n\n  LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i16Bit || OpSize == IR::OpSize::i32Bit || OpSize == IR::OpSize::i64Bit,\n                     \"Unsupported {} size: {}\", __func__, OpSize);\n  const auto EmitSize = ConvertSize(IROp);\n\n  const auto Dst = GetReg(Node);\n  const auto Src = GetReg(Op->Src);\n\n  movz(ARMEmitter::Size::i64Bit, TMP1, IR::OpSizeAsBits(OpSize) - 1);\n\n  if (OpSize == IR::OpSize::i16Bit) {\n    lsl(EmitSize, Dst, Src, 16);\n    clz(EmitSize, Dst, Dst);\n  } else {\n    clz(EmitSize, Dst, Src);\n  }\n\n  sub(ARMEmitter::Size::i64Bit, Dst, TMP1, Dst);\n}\n\nDEF_OP(FindTrailingZeroes) {\n  auto Op = IROp->C<IR::IROp_FindTrailingZeroes>();\n  const auto OpSize = IROp->Size;\n\n  LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i16Bit || OpSize == IR::OpSize::i32Bit || OpSize == IR::OpSize::i64Bit,\n                     \"Unsupported {} size: {}\", __func__, OpSize);\n  const auto EmitSize = ConvertSize(IROp);\n\n  const auto Dst = GetReg(Node);\n  const auto Src = GetReg(Op->Src);\n\n  rbit(EmitSize, Dst, Src);\n\n  if (OpSize == IR::OpSize::i16Bit) {\n    // This orr does two things. First, if the (masked) source is zero, it\n    // reverses to zero in the top so it forces clz to return 16. Second, it\n    // ensures garbage in the upper bits of the source don't affect clz, because\n    // they'll rbit to garbage in the bottom below the 0x8000 and be ignored by\n    // the clz. So we handle Src upper garbage without explicitly masking.\n    orr(EmitSize, Dst, Dst, 0x8000);\n  }\n\n  clz(EmitSize, Dst, Dst);\n}\n\nDEF_OP(CountLeadingZeroes) {\n  auto Op = IROp->C<IR::IROp_CountLeadingZeroes>();\n  const auto OpSize = IROp->Size;\n\n  LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i16Bit || OpSize == IR::OpSize::i32Bit || OpSize == IR::OpSize::i64Bit,\n                     \"Unsupported {} size: {}\", __func__, OpSize);\n  const auto EmitSize = ConvertSize(IROp);\n\n  const auto Dst = GetReg(Node);\n  const auto Src = GetReg(Op->Src);\n\n  if (OpSize == IR::OpSize::i16Bit) {\n    // Expressing as lsl+orr+clz clears away any garbage in the upper bits\n    // (alternatively could do uxth+clz+sub.. equal cost in total).\n    lsl(EmitSize, Dst, Src, 16);\n    orr(EmitSize, Dst, Dst, 0x8000);\n    clz(EmitSize, Dst, Dst);\n  } else {\n    clz(EmitSize, Dst, Src);\n  }\n}\n\nDEF_OP(Rev) {\n  auto Op = IROp->C<IR::IROp_Rev>();\n  const auto OpSize = IROp->Size;\n\n  LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i16Bit || OpSize == IR::OpSize::i32Bit || OpSize == IR::OpSize::i64Bit,\n                     \"Unsupported {} size: {}\", __func__, OpSize);\n  const auto EmitSize = ConvertSize(IROp);\n\n  const auto Dst = GetReg(Node);\n  const auto Src = GetReg(Op->Src);\n\n  rev(EmitSize, Dst, Src);\n  if (OpSize == IR::OpSize::i16Bit) {\n    lsr(EmitSize, Dst, Dst, 16);\n  }\n}\n\nDEF_OP(Rbit) {\n  auto Op = IROp->C<IR::IROp_Rbit>();\n  const auto OpSize = IROp->Size;\n\n  LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i32Bit || OpSize == IR::OpSize::i64Bit, \"Unsupported {} size: {}\", __func__, OpSize);\n  const auto EmitSize = ConvertSize48(IROp);\n\n  const auto Dst = GetReg(Node);\n  const auto Src = GetReg(Op->Src);\n\n  rbit(EmitSize, Dst, Src);\n}\n\nDEF_OP(Bfi) {\n  auto Op = IROp->C<IR::IROp_Bfi>();\n  const auto EmitSize = ConvertSize(IROp);\n\n  const auto Dst = GetReg(Node);\n  const auto SrcDst = GetReg(Op->Dest);\n  const auto Src = GetReg(Op->Src);\n\n  if (Dst == SrcDst) {\n    // If Dst and SrcDst match then this turns in to a simple BFI instruction.\n    bfi(EmitSize, Dst, Src, Op->lsb, Op->Width);\n  } else if (Dst != Src) {\n    // If the destination isn't the source then we can move the DstSrc and insert directly.\n    //\n    // The move is 64-bit to allow register renaming, the upper bits don't\n    // matter because of the bfi's EmitSize.\n    mov(ARMEmitter::Size::i64Bit, Dst, SrcDst);\n    bfi(EmitSize, Dst, Src, Op->lsb, Op->Width);\n  } else {\n    // Destination didn't match the dst source register.\n    // TODO: Inefficient until FEX can have RA constraints here.\n    mov(EmitSize, TMP1, SrcDst);\n    bfi(EmitSize, TMP1, Src, Op->lsb, Op->Width);\n\n    if (IROp->Size >= IR::OpSize::i32Bit) {\n      mov(EmitSize, Dst, TMP1.R());\n    } else {\n      ubfx(EmitSize, Dst, TMP1, 0, IR::OpSizeAsBits(IROp->Size));\n    }\n  }\n}\n\nDEF_OP(Bfxil) {\n  auto Op = IROp->C<IR::IROp_Bfxil>();\n  const auto EmitSize = ConvertSize(IROp);\n\n  const auto Dst = GetReg(Node);\n  const auto SrcDst = GetReg(Op->Dest);\n  const auto Src = GetReg(Op->Src);\n\n  if (Dst == SrcDst) {\n    // If Dst and SrcDst match then this turns in to a single instruction.\n    bfxil(EmitSize, Dst, Src, Op->lsb, Op->Width);\n  } else if (Dst != Src) {\n    // If the destination isn't the source then we can move the DstSrc and insert directly.\n    mov(EmitSize, Dst, SrcDst);\n    bfxil(EmitSize, Dst, Src, Op->lsb, Op->Width);\n  } else {\n    // Destination didn't match the dst source register.\n    // TODO: Inefficient until FEX can have RA constraints here.\n    mov(EmitSize, TMP1, SrcDst);\n    bfxil(EmitSize, TMP1, Src, Op->lsb, Op->Width);\n    mov(EmitSize, Dst, TMP1.R());\n  }\n}\n\nDEF_OP(Bfe) {\n  auto Op = IROp->C<IR::IROp_Bfe>();\n  LOGMAN_THROW_A_FMT(IROp->Size <= IR::OpSize::i64Bit, \"OpSize is too large for BFE: {}\", IROp->Size);\n  LOGMAN_THROW_A_FMT(Op->Width != 0, \"Invalid BFE width of 0\");\n  const auto EmitSize = ConvertSize(IROp);\n\n  const auto Dst = GetReg(Node);\n  const auto Src = GetReg(Op->Src);\n\n  if (Op->lsb == 0 && Op->Width == 32) {\n    mov(ARMEmitter::Size::i32Bit, Dst, Src);\n  } else if (Op->lsb == 0 && Op->Width == 64) {\n    LOGMAN_THROW_A_FMT(IROp->Size == IR::OpSize::i64Bit, \"Must be 64-bit wide register\");\n    mov(ARMEmitter::Size::i64Bit, Dst, Src);\n  } else {\n    ubfx(EmitSize, Dst, Src, Op->lsb, Op->Width);\n  }\n}\n\nDEF_OP(Sbfe) {\n  auto Op = IROp->C<IR::IROp_Sbfe>();\n  const auto Dst = GetReg(Node);\n  const auto Src = GetReg(Op->Src);\n\n  sbfx(ConvertSize(IROp), Dst, Src, Op->lsb, Op->Width);\n}\n\nDEF_OP(MaskGenerateFromBitWidth) {\n  auto Op = IROp->C<IR::IROp_MaskGenerateFromBitWidth>();\n  auto BitWidth = GetReg(Op->BitWidth);\n\n  LoadConstant(ARMEmitter::Size::i64Bit, TMP1, -1);\n  cmp(ARMEmitter::Size::i64Bit, BitWidth, 0);\n  lslv(ARMEmitter::Size::i64Bit, TMP2, TMP1, BitWidth);\n  csinv(ARMEmitter::Size::i64Bit, GetReg(Node), TMP1, TMP2, ARMEmitter::Condition::CC_EQ);\n}\n\nDEF_OP(Select) {\n  auto Op = IROp->C<IR::IROp_Select>();\n  const auto OpSize = IROp->Size;\n  const auto EmitSize = ConvertSize(IROp);\n  const auto CompareEmitSize = Op->CompareSize == IR::OpSize::i64Bit ? ARMEmitter::Size::i64Bit : ARMEmitter::Size::i32Bit;\n\n  uint64_t Const;\n  auto cc = MapCC(Op->Cond);\n\n  if (IsGPR(Op->Cmp1)) {\n    const auto Src1 = GetReg(Op->Cmp1);\n\n    if (IsInlineConstant(Op->Cmp2, &Const)) {\n      cmp(CompareEmitSize, Src1, Const);\n    } else {\n      const auto Src2 = GetReg(Op->Cmp2);\n      cmp(CompareEmitSize, Src1, Src2);\n    }\n  } else if (IsFPR(Op->Cmp1)) {\n    const auto Src1 = GetVReg(Op->Cmp1);\n    const auto Src2 = GetVReg(Op->Cmp2);\n    fcmp(Op->CompareSize == IR::OpSize::i64Bit ? ARMEmitter::ScalarRegSize::i64Bit : ARMEmitter::ScalarRegSize::i32Bit, Src1, Src2);\n  } else {\n    LOGMAN_MSG_A_FMT(\"Select: Expected GPR or FPR\");\n  }\n\n  uint64_t const_true, const_false;\n  bool is_const_true = IsInlineConstant(Op->TrueVal, &const_true);\n  bool is_const_false = IsInlineConstant(Op->FalseVal, &const_false);\n\n  uint64_t all_ones = OpSize == IR::OpSize::i64Bit ? 0xffff'ffff'ffff'ffffull : 0xffff'ffffull;\n\n  ARMEmitter::Register Dst = GetReg(Node);\n\n  if (is_const_true || is_const_false) {\n    if (is_const_false != true || is_const_true != true || !(const_true == 1 || const_true == all_ones) || const_false != 0) {\n      LOGMAN_MSG_A_FMT(\"Select: Unsupported compare inline parameters\");\n    }\n\n    if (const_true == all_ones) {\n      csetm(EmitSize, Dst, cc);\n    } else {\n      cset(EmitSize, Dst, cc);\n    }\n  } else {\n    csel(EmitSize, Dst, GetReg(Op->TrueVal), GetReg(Op->FalseVal), cc);\n  }\n}\n\nDEF_OP(NZCVSelect) {\n  auto Op = IROp->C<IR::IROp_NZCVSelect>();\n  const auto EmitSize = ConvertSize(IROp);\n\n  auto cc = MapCC(Op->Cond);\n\n  uint64_t const_true, const_false;\n  bool is_const_true = IsInlineConstant(Op->TrueVal, &const_true);\n  bool is_const_false = IsInlineConstant(Op->FalseVal, &const_false);\n\n  uint64_t all_ones = IROp->Size == IR::OpSize::i64Bit ? 0xffff'ffff'ffff'ffffull : 0xffff'ffffull;\n\n  ARMEmitter::Register Dst = GetReg(Node);\n\n  if (is_const_true) {\n    if (is_const_false != true || !(const_true == 1 || const_true == all_ones) || const_false != 0) {\n      LOGMAN_MSG_A_FMT(\"NZCVSelect: Unsupported constant\");\n    }\n\n    if (const_true == all_ones) {\n      csetm(EmitSize, Dst, cc);\n    } else {\n      cset(EmitSize, Dst, cc);\n    }\n  } else {\n    csel(EmitSize, Dst, GetReg(Op->TrueVal), GetZeroableReg(Op->FalseVal), cc);\n  }\n}\n\nDEF_OP(NZCVSelectV) {\n  auto Op = IROp->C<IR::IROp_NZCVSelectV>();\n\n  auto cc = MapCC(Op->Cond);\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n  fcsel(SubRegSize.Scalar, GetVReg(Node), GetVReg(Op->TrueVal), GetVReg(Op->FalseVal), cc);\n}\n\nDEF_OP(NZCVSelectIncrement) {\n  auto Op = IROp->C<IR::IROp_NZCVSelectIncrement>();\n\n  csinc(ConvertSize(IROp), GetReg(Node), GetReg(Op->TrueVal), GetZeroableReg(Op->FalseVal), MapCC(Op->Cond));\n}\n\nDEF_OP(VExtractToGPR) {\n  const auto Op = IROp->C<IR::IROp_VExtractToGPR>();\n  const auto OpSize = IROp->Size;\n\n  constexpr auto AVXRegBitSize = Core::CPUState::XMM_AVX_REG_SIZE * 8;\n  constexpr auto SSERegBitSize = Core::CPUState::XMM_SSE_REG_SIZE * 8;\n  const auto ElementSizeBits = IR::OpSizeAsBits(Op->Header.ElementSize);\n\n  const auto Offset = ElementSizeBits * Op->Index;\n  const auto Is256Bit = Offset >= SSERegBitSize;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  const auto PerformMove = [&](const ARMEmitter::VRegister reg, int index) {\n    switch (OpSize) {\n    case IR::OpSize::i8Bit: umov<ARMEmitter::SubRegSize::i8Bit>(Dst, Vector, index); break;\n    case IR::OpSize::i16Bit: umov<ARMEmitter::SubRegSize::i16Bit>(Dst, Vector, index); break;\n    case IR::OpSize::i32Bit: umov<ARMEmitter::SubRegSize::i32Bit>(Dst, Vector, index); break;\n    case IR::OpSize::i64Bit: umov<ARMEmitter::SubRegSize::i64Bit>(Dst, Vector, index); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled ExtractElementSize: {}\", OpSize); break;\n    }\n  };\n\n  if (Offset < SSERegBitSize) {\n    // Desired data lies within the lower 128-bit lane, so we\n    // can treat the operation as a 128-bit operation, even\n    // when acting on larger register sizes.\n    PerformMove(Vector, Op->Index);\n  } else {\n    LOGMAN_THROW_A_FMT(Is256Bit, \"Can't perform 256-bit extraction with op side: {}\", OpSize);\n    LOGMAN_THROW_A_FMT(Offset < AVXRegBitSize, \"Trying to extract element outside bounds of register. Offset={}, Index={}\", Offset, Op->Index);\n\n    // We need to use the upper 128-bit lane, so lets move it down.\n    // Inverting our dedicated predicate for 128-bit operations selects\n    // all of the top lanes. We can then compact those into a temporary.\n    const auto CompactPred = ARMEmitter::PReg::p0;\n    not_(CompactPred, PRED_TMP_32B.Zeroing(), PRED_TMP_16B);\n    compact(ARMEmitter::SubRegSize::i64Bit, VTMP1.Z(), CompactPred, Vector.Z());\n\n    // Sanitize the zero-based index to work on the now-moved\n    // upper half of the vector.\n    const auto SanitizedIndex = [OpSize, Op] {\n      switch (OpSize) {\n      case IR::OpSize::i8Bit: return Op->Index - 16;\n      case IR::OpSize::i16Bit: return Op->Index - 8;\n      case IR::OpSize::i32Bit: return Op->Index - 4;\n      case IR::OpSize::i64Bit: return Op->Index - 2;\n      default: LOGMAN_MSG_A_FMT(\"Unhandled OpSize: {}\", OpSize); return 0;\n      }\n    }();\n\n    // Move the value from the now-low-lane data.\n    PerformMove(VTMP1, SanitizedIndex);\n  }\n}\n\nDEF_OP(Float_ToGPR_ZS) {\n  auto Op = IROp->C<IR::IROp_Float_ToGPR_ZS>();\n\n  ARMEmitter::Register Dst = GetReg(Node);\n  ARMEmitter::VRegister Src = GetVReg(Op->Scalar);\n\n  if (Op->SrcElementSize == IR::OpSize::i64Bit) {\n    fcvtzs(ConvertSize(IROp), Dst, Src.D());\n  } else {\n    fcvtzs(ConvertSize(IROp), Dst, Src.S());\n  }\n}\n\nDEF_OP(Float_ToGPR_S) {\n  auto Op = IROp->C<IR::IROp_Float_ToGPR_S>();\n\n  ARMEmitter::Register Dst = GetReg(Node);\n  ARMEmitter::VRegister Src = GetVReg(Op->Scalar);\n\n  if (Op->SrcElementSize == IR::OpSize::i64Bit) {\n    frinti(VTMP1.D(), Src.D());\n    fcvtzs(ConvertSize(IROp), Dst, VTMP1.D());\n  } else {\n    frinti(VTMP1.S(), Src.S());\n    fcvtzs(ConvertSize(IROp), Dst, VTMP1.S());\n  }\n}\n\nDEF_OP(FCmp) {\n  auto Op = IROp->C<IR::IROp_FCmp>();\n  const auto EmitSubSize = Op->ElementSize == IR::OpSize::i64Bit ? ARMEmitter::ScalarRegSize::i64Bit : ARMEmitter::ScalarRegSize::i32Bit;\n\n  ARMEmitter::VRegister Scalar1 = GetVReg(Op->Scalar1);\n  ARMEmitter::VRegister Scalar2 = GetVReg(Op->Scalar2);\n\n  fcmp(EmitSubSize, Scalar1, Scalar2);\n}\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/JIT/Arm64Relocations.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: backend|arm64\ndesc: relocation logic of the arm64 splatter backend\n$end_info$\n*/\n#include \"Interface/Context/Context.h\"\n#include \"Interface/Core/JIT/JITClass.h\"\n\n#include <FEXCore/Core/Thunks.h>\n\nnamespace FEXCore::CPU {\nuint64_t GetNamedSymbolLiteral(FEXCore::Context::ContextImpl& CTX, FEXCore::CPU::RelocNamedSymbolLiteral::NamedSymbol Op) {\n  switch (Op) {\n  case FEXCore::CPU::RelocNamedSymbolLiteral::NamedSymbol::SYMBOL_LITERAL_EXITFUNCTION_LINKER:\n    return CTX.Dispatcher->GetExitFunctionLinkerAddress();\n\n  default: ERROR_AND_DIE_FMT(\"Unknown named symbol literal: {}\", static_cast<uint32_t>(Op));\n  }\n}\n\nvoid Arm64JITCore::InsertNamedThunkRelocation(ARMEmitter::Register Reg, const IR::SHA256Sum& Sum) {\n  Relocation MoveABI {};\n  MoveABI.NamedThunkMove.Header = {.Offset = GetCursorOffset(), .Type = FEXCore::CPU::RelocationTypes::RELOC_NAMED_THUNK_MOVE};\n  MoveABI.NamedThunkMove.Symbol = Sum;\n  MoveABI.NamedThunkMove.RegisterIndex = Reg.Idx();\n\n  uint64_t Pointer = reinterpret_cast<uint64_t>(EmitterCTX->ThunkHandler->LookupThunk(Sum));\n\n  // Pointers are required to fit within 48-bit VA space.\n  // TODO: Force 6-byte `MaxSize`, with zext extension to 64-bit. Current code not smart enough to handle negatives.\n  LoadConstant(ARMEmitter::Size::i64Bit, Reg, Pointer, FEXCore::CPU::Arm64Emitter::PadType::AUTOPAD);\n  Relocations.emplace_back(MoveABI);\n}\n\nArm64JITCore::NamedSymbolLiteralPair Arm64JITCore::InsertNamedSymbolLiteral(FEXCore::CPU::RelocNamedSymbolLiteral::NamedSymbol Op) {\n  uint64_t Pointer = GetNamedSymbolLiteral(*CTX, Op);\n\n  NamedSymbolLiteralPair Lit {\n    .Lit = Pointer,\n    .MoveABI =\n      {\n        .NamedSymbolLiteral =\n          {\n            .Header =\n              {\n                .Offset = 0, // Set by PlaceNamedSymbolLiteral\n                .Type = FEXCore::CPU::RelocationTypes::RELOC_NAMED_SYMBOL_LITERAL,\n              },\n            .Symbol = Op,\n          },\n      },\n  };\n  return Lit;\n}\n\nvoid Arm64JITCore::PlaceNamedSymbolLiteral(NamedSymbolLiteralPair Lit) {\n  switch (Lit.MoveABI.Header.Type) {\n  case RelocationTypes::RELOC_NAMED_SYMBOL_LITERAL:\n  case RelocationTypes::RELOC_GUEST_RIP_LITERAL: {\n    Lit.MoveABI.Header.Offset = GetCursorOffset();\n    break;\n  }\n\n  default: ERROR_AND_DIE_FMT(\"Unknown relocation type for {}\", __FUNCTION__);\n  }\n\n  BindOrRestart(&Lit.Loc);\n  dc64(Lit.Lit);\n  Relocations.emplace_back(Lit.MoveABI);\n}\n\nauto Arm64JITCore::InsertGuestRIPLiteral(uint64_t GuestRIP) -> NamedSymbolLiteralPair {\n  return {\n    .Lit = GuestRIP,\n    .MoveABI =\n      {\n        .GuestRIP = {.Header =\n                       {\n                         .Offset = 0, // Set by PlaceNamedSymbolLiteral\n                         .Type = FEXCore::CPU::RelocationTypes::RELOC_GUEST_RIP_LITERAL,\n                       },\n                     // NOTE: Cache serialization will subtract the guest binary base address later to produce consistency results\n                     .GuestRIP = GuestRIP},\n      },\n  };\n}\n\nvoid Arm64JITCore::InsertGuestRIPMove(ARMEmitter::Register Reg, uint64_t Constant) {\n  Relocation MoveABI {};\n  MoveABI.GuestRIP.Header = {.Offset = GetCursorOffset(), .Type = FEXCore::CPU::RelocationTypes::RELOC_GUEST_RIP_MOVE};\n  // NOTE: Cache serialization will subtract the guest binary base address later to produce consistency results\n  MoveABI.GuestRIP.GuestRIP = Constant;\n  MoveABI.GuestRIP.RegisterIndex = Reg.Idx();\n\n  // Pointers are required to fit within 48-bit VA space.\n  // TODO: Force 6-byte `MaxSize`, with sign extension to 64-bit. Current code not smart enough to handle negatives.\n  // 48-bit sign extension works because x86-64 guests only receive 47-bit VA space, with 48-bit being reserved for kernel.\n  // Additional quirk, \"canonical\" 48-bit pointers on x86-64, sign extend the 48-bit as well (Which is why kernel pointers are negative).\n  LoadConstant(ARMEmitter::Size::i64Bit, Reg, Constant, FEXCore::CPU::Arm64Emitter::PadType::AUTOPAD);\n  Relocations.emplace_back(MoveABI);\n}\n\nfextl::vector<FEXCore::CPU::Relocation> Arm64JITCore::TakeRelocations(uint64_t GuestBaseAddress) {\n  // Rebase relocations to library base address\n  for (auto& Relocation : Relocations) {\n    switch (Relocation.Header.Type) {\n    case FEXCore::CPU::RelocationTypes::RELOC_GUEST_RIP_MOVE:\n    case FEXCore::CPU::RelocationTypes::RELOC_GUEST_RIP_LITERAL: {\n      Relocation.GuestRIP.GuestRIP -= GuestBaseAddress;\n      break;\n    }\n    default:;\n    }\n  }\n\n  return std::move(Relocations);\n}\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/JIT/AtomicOps.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: backend|arm64\n$end_info$\n*/\n\n#include \"Interface/Context/Context.h\"\n#include \"Interface/Core/Dispatcher/Dispatcher.h\"\n#include \"Interface/Core/JIT/JITClass.h\"\n\nnamespace FEXCore::CPU {\nDEF_OP(CASPair) {\n  auto Op = IROp->C<IR::IROp_CASPair>();\n  LOGMAN_THROW_A_FMT(IROp->ElementSize == IR::OpSize::i32Bit || IROp->ElementSize == IR::OpSize::i64Bit, \"Wrong element size\");\n  // Size is the size of each pair element\n  auto Dst0 = GetReg(Op->OutLo);\n  auto Dst1 = GetReg(Op->OutHi);\n  auto Expected0 = GetReg(Op->ExpectedLo);\n  auto Expected1 = GetReg(Op->ExpectedHi);\n  auto Desired0 = GetReg(Op->DesiredLo);\n  auto Desired1 = GetReg(Op->DesiredHi);\n  auto MemSrc = GetReg(Op->Addr);\n\n  const auto EmitSize = IROp->ElementSize == IR::OpSize::i64Bit ? ARMEmitter::Size::i64Bit : ARMEmitter::Size::i32Bit;\n  if (CTX->HostFeatures.SupportsAtomics) {\n    // RA has heuristics to try to pair sources, but we need to handle the cases\n    // where they fail. We do so by moving to temporaries. Note we use 64-bit\n    // moves here even for 32-bit cmpxchg, for the Firestorm register renamer.\n    if (Desired1.Idx() != (Desired0.Idx() + 1) || Desired0.Idx() & 1) {\n      mov(ARMEmitter::Size::i64Bit, TMP1, Desired0);\n      mov(ARMEmitter::Size::i64Bit, TMP2, Desired1);\n      Desired0 = TMP1;\n      Desired1 = TMP2;\n    }\n\n    auto CaspalDst0 = Dst0;\n    auto CaspalDst1 = Dst1;\n    if (CaspalDst1.Idx() != (CaspalDst0.Idx() + 1) || CaspalDst0.Idx() & 1) {\n      CaspalDst0 = TMP3;\n      CaspalDst1 = TMP4;\n    }\n\n    // We can't clobber the source, these moves are inherently required due to\n    // ISA limitations. But by making them 64-bit, Firestorm can rename.\n    mov(ARMEmitter::Size::i64Bit, CaspalDst0, Expected0);\n    mov(ARMEmitter::Size::i64Bit, CaspalDst1, Expected1);\n    caspal(EmitSize, CaspalDst0, CaspalDst1, Desired0, Desired1, MemSrc);\n\n    if (CaspalDst0 != Dst0) {\n      mov(ARMEmitter::Size::i64Bit, Dst0, CaspalDst0);\n      mov(ARMEmitter::Size::i64Bit, Dst1, CaspalDst1);\n    }\n  } else {\n    // Save NZCV so we don't have to mark this op as clobbering NZCV (the\n    // SupportsAtomics does not clobber atomics and this !SupportsAtomics path\n    // is so slow it's not worth the complexity of splitting the IR op.). We\n    // clobber NZCV inside the hot loop and we can't replace cmp/ccmp/b.ne with\n    // something NZCV-preserving without requiring an extra instruction.\n    mrs(TMP1, ARMEmitter::SystemRegister::NZCV);\n\n    ARMEmitter::BackwardLabel LoopTop;\n    ARMEmitter::ForwardLabel LoopNotExpected;\n    ARMEmitter::ForwardLabel LoopExpected;\n    (void)Bind(&LoopTop);\n\n    // This instruction sequence must be synced with HandleCASPAL_Armv8.\n    ldaxp(EmitSize, TMP2, TMP3, MemSrc);\n    cmp(EmitSize, TMP2, Expected0);\n    ccmp(EmitSize, TMP3, Expected1, ARMEmitter::StatusFlags::None, ARMEmitter::Condition::CC_EQ);\n    (void)b(ARMEmitter::Condition::CC_NE, &LoopNotExpected);\n    stlxp(EmitSize, TMP2, Desired0, Desired1, MemSrc);\n    (void)cbnz(EmitSize, TMP2, &LoopTop);\n    mov(EmitSize, Dst0, Expected0);\n    mov(EmitSize, Dst1, Expected1);\n\n    (void)b(&LoopExpected);\n\n    (void)Bind(&LoopNotExpected);\n    mov(EmitSize, Dst0, TMP2.R());\n    mov(EmitSize, Dst1, TMP3.R());\n    // exclusive monitor needs to be cleared here\n    // Might have hit the case where ldaxr was hit but stlxr wasn't\n    clrex();\n    (void)Bind(&LoopExpected);\n\n    // Restore\n    msr(ARMEmitter::SystemRegister::NZCV, TMP1);\n  }\n}\n\nDEF_OP(CAS) {\n  auto Op = IROp->C<IR::IROp_CAS>();\n  const auto EmitSize = ConvertSize(IROp);\n  const auto SubEmitSize = ConvertSubRegSize8(IROp->Size);\n  // DataSrc = *Src1\n  // if (DataSrc == Src3) { *Src1 == Src2; } Src2 = DataSrc\n  // This will write to memory! Careful!\n\n  auto Expected = GetReg(Op->Expected);\n  auto Desired = GetReg(Op->Desired);\n  auto MemSrc = GetReg(Op->Addr);\n  auto Dst = GetReg(Node);\n\n  if (CTX->HostFeatures.SupportsAtomics) {\n    if (Expected == Dst && Dst != MemSrc && Dst != Desired) {\n      casal(SubEmitSize, Dst, Desired, MemSrc);\n    } else {\n      mov(EmitSize, TMP2, Expected);\n      casal(SubEmitSize, TMP2, Desired, MemSrc);\n      mov(EmitSize, Dst, TMP2.R());\n    }\n  } else {\n    ARMEmitter::BackwardLabel LoopTop;\n    ARMEmitter::ForwardLabel LoopNotExpected;\n    ARMEmitter::ForwardLabel LoopExpected;\n    (void)Bind(&LoopTop);\n    ldaxr(SubEmitSize, TMP2, MemSrc);\n    if (IROp->Size == IR::OpSize::i8Bit) {\n      cmp(EmitSize, TMP2, Expected, ARMEmitter::ExtendedType::UXTB, 0);\n    } else if (IROp->Size == IR::OpSize::i16Bit) {\n      cmp(EmitSize, TMP2, Expected, ARMEmitter::ExtendedType::UXTH, 0);\n    } else {\n      cmp(EmitSize, TMP2, Expected);\n    }\n    (void)b(ARMEmitter::Condition::CC_NE, &LoopNotExpected);\n    stlxr(SubEmitSize, TMP3, Desired, MemSrc);\n    (void)cbnz(EmitSize, TMP3, &LoopTop);\n    mov(EmitSize, Dst, Expected);\n    (void)b(&LoopExpected);\n\n    (void)Bind(&LoopNotExpected);\n    mov(EmitSize, Dst, TMP2.R());\n    // exclusive monitor needs to be cleared here\n    // Might have hit the case where ldaxr was hit but stlxr wasn't\n    clrex();\n    (void)Bind(&LoopExpected);\n  }\n}\n\nDEF_OP(AtomicSwap) {\n  auto Op = IROp->C<IR::IROp_AtomicSwap>();\n  const auto OpSize = IROp->Size;\n  LOGMAN_THROW_A_FMT(\n    OpSize == IR::OpSize::i64Bit || OpSize == IR::OpSize::i32Bit || OpSize == IR::OpSize::i16Bit || OpSize == IR::OpSize::i8Bit, \"Unexpecte\"\n                                                                                                                                 \"d CAS \"\n                                                                                                                                 \"size\");\n\n  auto MemSrc = GetReg(Op->Addr);\n  auto Src = GetReg(Op->Value);\n\n  const auto EmitSize = ConvertSize(IROp);\n  const auto SubEmitSize = OpSize == IR::OpSize::i64Bit ? ARMEmitter::SubRegSize::i64Bit :\n                           OpSize == IR::OpSize::i32Bit ? ARMEmitter::SubRegSize::i32Bit :\n                           OpSize == IR::OpSize::i16Bit ? ARMEmitter::SubRegSize::i16Bit :\n                                                          ARMEmitter::SubRegSize::i8Bit;\n\n  if (CTX->HostFeatures.SupportsAtomics) {\n    ldswpal(SubEmitSize, Src, GetReg(Node), MemSrc);\n  } else {\n    ARMEmitter::BackwardLabel LoopTop;\n    (void)Bind(&LoopTop);\n    ldaxr(SubEmitSize, TMP2, MemSrc);\n    stlxr(SubEmitSize, TMP4, Src, MemSrc);\n    (void)cbnz(EmitSize, TMP4, &LoopTop);\n    ubfm(EmitSize, GetReg(Node), TMP2, 0, IR::OpSizeAsBits(OpSize) - 1);\n  }\n}\n\nDEF_OP(AtomicFetchAdd) {\n  auto Op = IROp->C<IR::IROp_AtomicFetchAdd>();\n  const auto EmitSize = ConvertSize(IROp);\n  const auto SubEmitSize = ConvertSubRegSize8(IROp->Size);\n\n  auto MemSrc = GetReg(Op->Addr);\n  auto Src = GetReg(Op->Value);\n\n  if (CTX->HostFeatures.SupportsAtomics) {\n    ldaddal(SubEmitSize, Src, GetReg(Node), MemSrc);\n  } else {\n    ARMEmitter::BackwardLabel LoopTop;\n    (void)Bind(&LoopTop);\n    ldaxr(SubEmitSize, TMP2, MemSrc);\n    add(EmitSize, TMP3, TMP2, Src);\n    stlxr(SubEmitSize, TMP4, TMP3, MemSrc);\n    (void)cbnz(EmitSize, TMP4, &LoopTop);\n    mov(EmitSize, GetReg(Node), TMP2.R());\n  }\n}\n\nDEF_OP(AtomicFetchSub) {\n  auto Op = IROp->C<IR::IROp_AtomicFetchSub>();\n  const auto EmitSize = ConvertSize(IROp);\n  const auto SubEmitSize = ConvertSubRegSize8(IROp->Size);\n\n  auto MemSrc = GetReg(Op->Addr);\n  auto Src = GetReg(Op->Value);\n\n  if (CTX->HostFeatures.SupportsAtomics) {\n    neg(EmitSize, TMP2, Src);\n    ldaddal(SubEmitSize, TMP2, GetReg(Node), MemSrc);\n  } else {\n    ARMEmitter::BackwardLabel LoopTop;\n    (void)Bind(&LoopTop);\n    ldaxr(SubEmitSize, TMP2, MemSrc);\n    sub(EmitSize, TMP3, TMP2, Src);\n    stlxr(SubEmitSize, TMP4, TMP3, MemSrc);\n    (void)cbnz(EmitSize, TMP4, &LoopTop);\n    mov(EmitSize, GetReg(Node), TMP2.R());\n  }\n}\n\nDEF_OP(AtomicFetchAnd) {\n  auto Op = IROp->C<IR::IROp_AtomicFetchAnd>();\n  const auto EmitSize = ConvertSize(IROp);\n  const auto SubEmitSize = ConvertSubRegSize8(IROp->Size);\n\n  auto MemSrc = GetReg(Op->Addr);\n  auto Src = GetReg(Op->Value);\n\n  if (CTX->HostFeatures.SupportsAtomics) {\n    mvn(EmitSize, TMP2, Src);\n    ldclral(SubEmitSize, TMP2, GetReg(Node), MemSrc);\n  } else {\n    ARMEmitter::BackwardLabel LoopTop;\n    (void)Bind(&LoopTop);\n    ldaxr(SubEmitSize, TMP2, MemSrc);\n    and_(EmitSize, TMP3, TMP2, Src);\n    stlxr(SubEmitSize, TMP4, TMP3, MemSrc);\n    (void)cbnz(EmitSize, TMP4, &LoopTop);\n    mov(EmitSize, GetReg(Node), TMP2.R());\n  }\n}\n\nDEF_OP(AtomicFetchCLR) {\n  auto Op = IROp->C<IR::IROp_AtomicFetchCLR>();\n  const auto EmitSize = ConvertSize(IROp);\n  const auto SubEmitSize = ConvertSubRegSize8(IROp->Size);\n\n  auto MemSrc = GetReg(Op->Addr);\n  auto Src = GetReg(Op->Value);\n\n  if (CTX->HostFeatures.SupportsAtomics) {\n    ldclral(SubEmitSize, Src, GetReg(Node), MemSrc);\n  } else {\n    ARMEmitter::BackwardLabel LoopTop;\n    (void)Bind(&LoopTop);\n    ldaxr(SubEmitSize, TMP2, MemSrc);\n    bic(EmitSize, TMP3, TMP2, Src);\n    stlxr(SubEmitSize, TMP4, TMP3, MemSrc);\n    (void)cbnz(EmitSize, TMP4, &LoopTop);\n    mov(EmitSize, GetReg(Node), TMP2.R());\n  }\n}\n\nDEF_OP(AtomicFetchOr) {\n  auto Op = IROp->C<IR::IROp_AtomicFetchOr>();\n  const auto EmitSize = ConvertSize(IROp);\n  const auto SubEmitSize = ConvertSubRegSize8(IROp->Size);\n\n  auto MemSrc = GetReg(Op->Addr);\n  auto Src = GetReg(Op->Value);\n\n  if (CTX->HostFeatures.SupportsAtomics) {\n    ldsetal(SubEmitSize, Src, GetReg(Node), MemSrc);\n  } else {\n    ARMEmitter::BackwardLabel LoopTop;\n    (void)Bind(&LoopTop);\n    ldaxr(SubEmitSize, TMP2, MemSrc);\n    orr(EmitSize, TMP3, TMP2, Src);\n    stlxr(SubEmitSize, TMP4, TMP3, MemSrc);\n    (void)cbnz(EmitSize, TMP4, &LoopTop);\n    mov(EmitSize, GetReg(Node), TMP2.R());\n  }\n}\n\nDEF_OP(AtomicFetchXor) {\n  auto Op = IROp->C<IR::IROp_AtomicFetchXor>();\n  const auto EmitSize = ConvertSize(IROp);\n  const auto SubEmitSize = ConvertSubRegSize8(IROp->Size);\n\n  auto MemSrc = GetReg(Op->Addr);\n  auto Src = GetReg(Op->Value);\n\n  if (CTX->HostFeatures.SupportsAtomics) {\n    ldeoral(SubEmitSize, Src, GetReg(Node), MemSrc);\n  } else {\n    ARMEmitter::BackwardLabel LoopTop;\n    (void)Bind(&LoopTop);\n    ldaxr(SubEmitSize, TMP2, MemSrc);\n    eor(EmitSize, TMP3, TMP2, Src);\n    stlxr(SubEmitSize, TMP4, TMP3, MemSrc);\n    (void)cbnz(EmitSize, TMP4, &LoopTop);\n    mov(EmitSize, GetReg(Node), TMP2.R());\n  }\n}\n\nDEF_OP(AtomicFetchNeg) {\n  auto Op = IROp->C<IR::IROp_AtomicFetchNeg>();\n  const auto EmitSize = ConvertSize(IROp);\n  const auto SubEmitSize = ConvertSubRegSize8(IROp->Size);\n\n  auto MemSrc = GetReg(Op->Addr);\n\n  if (CTX->HostFeatures.SupportsAtomics) {\n    // Use a CAS loop to avoid needing to emulate unaligned LLSC atomics\n    ldr(SubEmitSize, TMP2, MemSrc);\n    ARMEmitter::BackwardLabel LoopTop;\n    (void)Bind(&LoopTop);\n    mov(EmitSize, TMP4, TMP2);\n    neg(EmitSize, TMP3, TMP2);\n    casal(SubEmitSize, TMP2, TMP3, MemSrc);\n    sub(EmitSize, TMP3, TMP2, TMP4);\n    (void)cbnz(EmitSize, TMP3, &LoopTop);\n    mov(EmitSize, GetReg(Node), TMP2.R());\n  } else {\n    ARMEmitter::BackwardLabel LoopTop;\n    (void)Bind(&LoopTop);\n    ldaxr(SubEmitSize, TMP2, MemSrc);\n    neg(EmitSize, TMP3, TMP2);\n    stlxr(SubEmitSize, TMP4, TMP3, MemSrc);\n    (void)cbnz(EmitSize, TMP4, &LoopTop);\n    mov(EmitSize, GetReg(Node), TMP2.R());\n  }\n}\n\nDEF_OP(TelemetrySetValue) {\n#ifndef FEX_DISABLE_TELEMETRY\n  auto Op = IROp->C<IR::IROp_TelemetrySetValue>();\n  auto Src = GetReg(Op->Value);\n\n  ldr(TMP2, STATE_PTR_IDX(CpuStateFrame, Pointers.TelemetryValueAddresses, Op->TelemetryValueIndex));\n\n  // Cortex fuses cmp+cset.\n  cmp(ARMEmitter::Size::i32Bit, Src, 0);\n  cset(ARMEmitter::Size::i32Bit, TMP1, ARMEmitter::Condition::CC_NE);\n\n  if (CTX->HostFeatures.SupportsAtomics) {\n    stsetl(ARMEmitter::SubRegSize::i64Bit, TMP1, TMP2);\n  } else {\n    ARMEmitter::BackwardLabel LoopTop;\n    (void)Bind(&LoopTop);\n    ldaxr(ARMEmitter::SubRegSize::i64Bit, TMP3, TMP2);\n    orr(ARMEmitter::Size::i32Bit, TMP3, TMP3, Src);\n    stlxr(ARMEmitter::SubRegSize::i64Bit, TMP3, TMP3, TMP2);\n    (void)cbnz(ARMEmitter::Size::i32Bit, TMP3, &LoopTop);\n  }\n#endif\n}\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/JIT/BranchOps.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: backend|arm64\n$end_info$\n*/\n\n#include \"Interface/Context/Context.h\"\n#include \"FEXCore/IR/IR.h\"\n#include \"Interface/Core/LookupCache.h\"\n\n#include \"Interface/Core/JIT/JITClass.h\"\n\n#include <FEXCore/Core/Thunks.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n#include <FEXCore/Utils/MathUtils.h>\n\nnamespace FEXCore::CPU {\n\nDEF_OP(CallbackReturn) {\n  // spill back to CTX\n  SpillStaticRegs(TMP1);\n\n  // First we must reset the stack\n  ResetStack();\n\n  // We can now lower the ref counter again\n\n  ldr(ARMEmitter::WReg::w2, STATE, offsetof(FEXCore::Core::CpuStateFrame, SignalHandlerRefCounter));\n  sub(ARMEmitter::Size::i32Bit, ARMEmitter::Reg::r2, ARMEmitter::Reg::r2, 1);\n  str(ARMEmitter::WReg::w2, STATE, offsetof(FEXCore::Core::CpuStateFrame, SignalHandlerRefCounter));\n\n  // We need to adjust an additional 8 bytes to get back to the original \"misaligned\" RSP state\n  ldr(ARMEmitter::XReg::x2, STATE, offsetof(FEXCore::Core::CpuStateFrame, State.gregs[X86State::REG_RSP]));\n  add(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r2, ARMEmitter::Reg::r2, 8);\n  str(ARMEmitter::XReg::x2, STATE, offsetof(FEXCore::Core::CpuStateFrame, State.gregs[X86State::REG_RSP]));\n\n  PopCalleeSavedRegisters();\n\n  // Return to the thunk\n  ret();\n}\n\nDEF_OP(ExitFunction) {\n  auto Op = IROp->C<IR::IROp_ExitFunction>();\n\n  ResetStack();\n\n  if (CTX->HostFeatures.IsInstCountCI) [[unlikely]] {\n    // Emit function end marker\n    udf(0x420F);\n  }\n\n  uint64_t NewRIP;\n\n  if (IsInlineConstant(Op->NewRIP, &NewRIP) || IsInlineEntrypointOffset(Op->NewRIP, &NewRIP)) {\n#ifdef ARCHITECTURE_arm64ec\n    if (NewRIP < EC_CODE_BITMAP_MAX_ADDRESS && RtlIsEcCode(NewRIP)) {\n      str(REG_CALLRET_SP, STATE_PTR(CpuStateFrame, State.callret_sp));\n      add(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, StaticRegisters[X86State::REG_RSP], 0);\n      InsertGuestRIPMove(EC_CALL_CHECKER_PC_REG, NewRIP);\n      ldr(TMP2, STATE_PTR(CpuStateFrame, Pointers.ExitFunctionEC));\n      br(TMP2);\n    } else {\n#endif\n      // In order to support direct branches without constantly hitting the L1 cache, we emit a call to a block linker,\n      // this will compile the branch target block when it is hit and replace the branch to the linker at the callsite\n      // with a direct branch to the destination block. Upon invalidation of the target block the backpatch is undone.\n      //\n      // In addition, to avoid needing to lookup in the cache for returns and any indirect branch prediction penalty,\n      // a shadow stack of <GuestReturnRIP, HostReturnPC> pairs is maintained, acting as a first level cache for any\n      // return operations. As the guest may not balance calls and returns exactly, an exception handler is expected to\n      // be installed by the frontend, to reset the shadow stack to the middle of its valid bounds on overflow/underflow.\n      // This shadow stack is also cleared on block invalidation operations or codebuffer switches, to ensure all pointed-to\n      // host code is always valid.\n\n      // This code will be backpatched by Arm64JITCore_ExitFunctionLink, below is an enumeration of all the possible cases.\n      // Jump thunks are emitted in JIT.cpp after compilation of the entire multiblock.\n      //\n      // Call with known return block - unlinked\n      //    00: adr TMP1, 0xC\n      //    04: stp RetReg, TMP1, [SpReg, -0x10]!\n      //    08: bl JmpThunk00\n      //    JmpThunk00:\n      //    00: b 0x8\n      //    04: br TMP1\n      //    08: ldr TMP1, <Shared exit linker>\n      //    0c: blr TMP1\n      //    10: HostCode\n      //    18: GuestRIP\n      //    20: CallerOffset\n      //\n      // Call with known return block after backpatching - linked in branch immediate range\n      //    00: adr TMP1, 0xC\n      //    04: stp RetReg, TMP1, [SpReg, -0x10]!\n      //    08: bl HostCode                                        - MODIFIED\n      //\n      // Call with known return block after backpatching - linked out of range\n      //    00: adr TMP1, 0xC\n      //    04: stp RetReg, TMP1, [SpReg, -0x10]!\n      //    08: bl JmpThunk00\n      //    JmpThunk00:\n      //    00: ldr TMP1, 0x10                                     - MODIFIED 2nd\n      //    04: br TMP1\n      //    08: ldr TMP1, <Shared exit linker>\n      //    0c: blr TMP1\n      //    10: HostCode                                           - MODIFIED 1st\n      //    18: GuestRIP\n      //    20: CallerOffset\n      //\n      // Jump - unlinked\n      //    00: b JmpThunk00\n      //    JmpThunk00:\n      //    00: b 0x8\n      //    04: br TMP1\n      //    08: ldr TMP1, <Shared exit linker>\n      //    0c: blr TMP1\n      //    10: HostCode\n      //    18: GuestRIP\n      //    20: CallerOffset\n      //\n      // Jump after backpatching - linked in branch immediate range\n      //    00: b HostCode                                         - MODIFIED\n      //\n      // Jump after backpatching - linked out of range\n      //    00: b JmpThunk00\n      //    JmpThunk00:\n      //    00: ldr TMP1, 0x10                                     - MODIFIED 2nd\n      //    04: br TMP1\n      //    08: ldr TMP1, <Shared exit linker>\n      //    0c: blr TMP1\n      //    10: HostCode                                           - MODIFIED 1st\n      //    18: GuestRIP\n      //    20: CallerOffset\n\n      ARMEmitter::ForwardLabel l_BranchHost;\n      ARMEmitter::ForwardLabel l_CallReturn;\n      if (Op->Hint == IR::BranchHint::Call) {\n        if (!Op->CallReturnBlock.IsInvalid()) {\n          auto CallReturnAddressReg = GetReg(Op->CallReturnAddress).X();\n          PendingCallReturnTargetLabel = &CallReturnTargets.try_emplace(Op->CallReturnBlock.ID()).first->second;\n          (void)adr(TMP1, &l_CallReturn);\n          stp<ARMEmitter::IndexType::PRE>(CallReturnAddressReg, TMP1, REG_CALLRET_SP, -0x10);\n        } else {\n          stp<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::zr, ARMEmitter::XReg::zr, REG_CALLRET_SP, -0x10);\n        }\n      } else if (Op->Hint == IR::BranchHint::CheckTF) {\n        ARMEmitter::ForwardLabel TFUnset;\n        ldrb(TMP1, STATE_PTR(CpuStateFrame, State.flags[X86State::RFLAG_TF_RAW_LOC]));\n        (void)cbz(ARMEmitter::Size::i32Bit, TMP1, &TFUnset);\n        InsertGuestRIPMove(TMP1, NewRIP);\n        str(TMP1, STATE, offsetof(FEXCore::Core::CpuStateFrame, State.rip));\n        ldr(TMP2, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.DispatcherLoopTop));\n        blr(TMP2);\n        (void)Bind(&TFUnset);\n      }\n\n      EmitLinkedBranch(NewRIP, Op->Hint == IR::BranchHint::Call);\n      (void)Bind(&l_CallReturn);\n#ifdef ARCHITECTURE_arm64ec\n    }\n#endif\n  } else {\n    ARMEmitter::ForwardLabel SkipFullLookup;\n    auto RipReg = GetReg(Op->NewRIP);\n\n    if (Op->Hint == IR::BranchHint::Return) {\n      // First try to pop from the call-ret stack, otherwise follow the normal path (but ending in a ret)\n      ldp<ARMEmitter::IndexType::POST>(TMP1, TMP2, REG_CALLRET_SP, 0x10);\n      sub(TMP1, TMP1, RipReg.X());\n      (void)cbz(ARMEmitter::Size::i64Bit, TMP1, &SkipFullLookup);\n    }\n\n    // L1 Cache\n    ldp<ARMEmitter::IndexType::OFFSET>(TMP1, TMP2, STATE, offsetof(FEXCore::Core::CpuStateFrame, State.L1Pointer));\n\n    // Calculate (tmp1 + ((ripreg & L1_ENTRIES_MASK) << 4)) for the address\n    // L1Mask is pre-shifted.\n    and_(ARMEmitter::Size::i64Bit, TMP2, TMP2, RipReg, ARMEmitter::ShiftType::LSL, FEXCore::ilog2(sizeof(LookupCache::LookupCacheEntry)));\n    add(TMP1, TMP1, TMP2);\n\n    ldp<ARMEmitter::IndexType::OFFSET>(TMP2, TMP1, TMP1, 0);\n\n    // Note: sub+cbnz used over cmp+br to preserve flags.\n    sub(TMP1, TMP1, RipReg.X());\n    (void)cbz(ARMEmitter::Size::i64Bit, TMP1, &SkipFullLookup);\n    ldr(TMP2, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.DispatcherLoopTop));\n    str(RipReg.X(), STATE, offsetof(FEXCore::Core::CpuStateFrame, State.rip));\n\n    (void)Bind(&SkipFullLookup);\n    if (Op->Hint == IR::BranchHint::Call) {\n      ARMEmitter::ForwardLabel l_CallReturn;\n      if (!Op->CallReturnBlock.IsInvalid()) {\n        auto CallReturnAddressReg = GetReg(Op->CallReturnAddress).X();\n        PendingCallReturnTargetLabel = &CallReturnTargets.try_emplace(Op->CallReturnBlock.ID()).first->second;\n        (void)adr(TMP1, &l_CallReturn);\n        stp<ARMEmitter::IndexType::PRE>(CallReturnAddressReg, TMP1, REG_CALLRET_SP, -0x10);\n      } else {\n        stp<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::zr, ARMEmitter::XReg::zr, REG_CALLRET_SP, -0x10);\n      }\n      blr(TMP2);\n      (void)Bind(&l_CallReturn);\n    } else if (Op->Hint == IR::BranchHint::Return) {\n      ret(TMP2);\n    } else {\n      br(TMP2);\n    }\n  }\n}\n\nDEF_OP(Jump) {\n  const auto Op = IROp->C<IR::IROp_Jump>();\n\n  PendingTargetLabel = JumpTarget(Op->TargetBlock);\n}\n\nDEF_OP(CondJump) {\n  auto Op = IROp->C<IR::IROp_CondJump>();\n\n  auto TrueTargetLabel = JumpTarget(Op->TrueBlock);\n\n  if (Op->FromNZCV) {\n    b_OrRestart(MapCC(Op->Cond), TrueTargetLabel);\n  } else {\n    uint64_t Const;\n    const bool isConst = IsInlineConstant(Op->Cmp2, &Const);\n\n    auto Reg = GetReg(Op->Cmp1);\n    const auto Size = Op->CompareSize == IR::OpSize::i32Bit ? ARMEmitter::Size::i32Bit : ARMEmitter::Size::i64Bit;\n\n    LOGMAN_THROW_A_FMT(IsGPR(Op->Cmp1), \"CondJump: Expected GPR\");\n    LOGMAN_THROW_A_FMT(isConst, \"CondJump: Expected constant source\");\n\n    if (Op->Cond == IR::CondClass::EQ) {\n      LOGMAN_THROW_A_FMT(Const == 0, \"CondJump: Expected 0 source\");\n      cbz_OrRestart(Size, Reg, TrueTargetLabel);\n    } else if (Op->Cond == IR::CondClass::NEQ) {\n      LOGMAN_THROW_A_FMT(Const == 0, \"CondJump: Expected 0 source\");\n      cbnz_OrRestart(Size, Reg, TrueTargetLabel);\n    } else if (Op->Cond == IR::CondClass::TSTZ) {\n      LOGMAN_THROW_A_FMT(Const < 64, \"CondJump: Expected valid bit source\");\n      tbz_OrRestart(Reg, Const, TrueTargetLabel);\n    } else if (Op->Cond == IR::CondClass::TSTNZ) {\n      LOGMAN_THROW_A_FMT(Const < 64, \"CondJump: Expected valid bit source\");\n      tbnz_OrRestart(Reg, Const, TrueTargetLabel);\n    } else {\n      LOGMAN_THROW_A_FMT(false, \"CondJump expected simple condition\");\n    }\n  }\n\n  PendingTargetLabel = JumpTarget(Op->FalseBlock);\n}\n\nDEF_OP(Syscall) {\n  auto Op = IROp->C<IR::IROp_Syscall>();\n  // Arguments are passed as follows:\n  // X0: SyscallHandler\n  // X1: ThreadState\n  // X2: Pointer to SyscallArguments\n\n  PushDynamicRegs(TMP1);\n\n  uint32_t GPRSpillMask = ~0U;\n  uint32_t FPRSpillMask = ~0U;\n\n  SpillStaticRegs(TMP1, {\n                          .GPRSpillMask = GPRSpillMask,\n                          .FPRSpillMask = FPRSpillMask,\n                        });\n\n  // Now that we are spilled, store in the state that we are in a syscall\n  // Still without overwriting registers that matter\n  // 16bit LoadConstant to be a single instruction\n  // This gives the signal handler a value to check to see if we are in a syscall at all\n  LoadConstant(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r0, GPRSpillMask & 0xFFFF);\n  str(ARMEmitter::XReg::x0, STATE, offsetof(FEXCore::Core::CpuStateFrame, InSyscallInfo));\n\n  uint64_t SPOffset = AlignUp(FEXCore::HLE::SyscallArguments::MAX_ARGS * 8, 16);\n  sub(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, ARMEmitter::Reg::rsp, SPOffset);\n  for (uint32_t i = 0; i < FEXCore::HLE::SyscallArguments::MAX_ARGS; ++i) {\n    if (Op->Header.Args[i].IsInvalid()) {\n      continue;\n    }\n    str(GetReg(Op->Header.Args[i]).X(), ARMEmitter::Reg::rsp, i * 8);\n  }\n\n  ldr(ARMEmitter::XReg::x0, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.SyscallHandlerObj));\n  ldr(ARMEmitter::XReg::x3, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.SyscallHandlerFunc));\n  mov(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r1, STATE.R());\n\n  // SP supporting move\n  add(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r2, ARMEmitter::Reg::rsp, 0);\n  if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n    GenerateIndirectRuntimeCall<uint64_t, void*, void*, void*>(ARMEmitter::Reg::r3);\n  } else {\n    blr(ARMEmitter::Reg::r3);\n  }\n\n  add(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, ARMEmitter::Reg::rsp, SPOffset);\n\n  // Result is now in x0\n  // Fix the stack and any values that were stepped on\n  FillStaticRegs({\n    .OptionalReg = ARMEmitter::Reg::r1,\n    .OptionalReg2 = ARMEmitter::Reg::r2,\n    .GPRFillMask = GPRSpillMask,\n    .FPRFillMask = FPRSpillMask,\n  });\n\n  // Now the registers we've spilled are back in their original host registers\n  // We can safely claim we are no longer in a syscall\n  str(ARMEmitter::XReg::zr, STATE, offsetof(FEXCore::Core::CpuStateFrame, InSyscallInfo));\n\n  PopDynamicRegs();\n\n  const auto OSABI = CTX->SyscallHandler->GetOSABI();\n\n  if (OSABI != FEXCore::HLE::SyscallOSABI::OS_GENERIC) {\n    // Move result to its destination register.\n    // Only if `NORETURNEDRESULT` wasn't set, otherwise we might overwrite the CPUState refilled with `FillStaticRegs`\n    mov(ARMEmitter::Size::i64Bit, GetReg(Node), ARMEmitter::Reg::r0);\n  }\n}\n\nDEF_OP(Thunk) {\n  auto Op = IROp->C<IR::IROp_Thunk>();\n  // Arguments are passed as follows:\n  // X0: CTX\n  // X1: Args (from guest stack)\n\n  // spill to ctx before ra64 spill\n  SpillStaticRegs(TMP1, {\n                          .NZCV = false,\n                        });\n\n  PushDynamicRegs(TMP1);\n\n  mov(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r0, GetReg(Op->ArgPtr));\n\n  InsertNamedThunkRelocation(ARMEmitter::Reg::r2, Op->ThunkNameHash);\n  if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n    GenerateIndirectRuntimeCall<void, void*, void*>(ARMEmitter::Reg::r2);\n  } else {\n    blr(ARMEmitter::Reg::r2);\n  }\n\n  PopDynamicRegs();\n\n  // load from ctx after ra64 refill\n  FillStaticRegs({\n    .NZCV = false,\n  });\n}\n\nDEF_OP(ValidateCode) {\n  auto Op = IROp->C<IR::IROp_ValidateCode>();\n  auto OldCode = Op->CodeOriginal.data();\n  auto Base = GetReg(Op->Header.Args[0]).X();\n  int len = Op->CodeLength;\n  int Offset = 0;\n  ARMEmitter::ForwardLabel Fail;\n\n  const auto Dst = GetReg(Node);\n\n  auto EmitCheck = [&](size_t Size, auto&& LoadData) {\n    while (len >= Size) {\n      LoadData();\n      sub(ARMEmitter::Size::i64Bit, TMP1, TMP1, TMP2);\n      cbnz_OrRestart(ARMEmitter::Size::i64Bit, TMP1, &Fail);\n      len -= Size;\n      Offset += Size;\n    }\n  };\n\n  EmitCheck(8, [&]() {\n    ldr(TMP1, Base, Offset);\n    LoadConstant(ARMEmitter::Size::i64Bit, TMP2, *(const uint64_t*)(OldCode + Offset));\n  });\n\n  EmitCheck(4, [&]() {\n    ldr(TMP1.W(), Base, Offset);\n    LoadConstant(ARMEmitter::Size::i32Bit, TMP2, *(const uint32_t*)(OldCode + Offset));\n  });\n\n  EmitCheck(2, [&]() {\n    ldrh(TMP1.W(), Base, Offset);\n    LoadConstant(ARMEmitter::Size::i32Bit, TMP2, *(const uint16_t*)(OldCode + Offset));\n  });\n\n  EmitCheck(1, [&]() {\n    ldrb(TMP1.W(), Base, Offset);\n    LoadConstant(ARMEmitter::Size::i32Bit, TMP2, *(const uint8_t*)(OldCode + Offset));\n  });\n\n  ARMEmitter::ForwardLabel End;\n  LoadConstant(ARMEmitter::Size::i32Bit, Dst, 0);\n  b_OrRestart(&End);\n  BindOrRestart(&Fail);\n  LoadConstant(ARMEmitter::Size::i32Bit, Dst, 1);\n  BindOrRestart(&End);\n}\n\nDEF_OP(ThreadRemoveCodeEntry) {\n  PushDynamicRegs(TMP4);\n  SpillStaticRegs(TMP4);\n\n  // Arguments are passed as follows:\n  // X0: Thread\n  // X1: RIP\n  mov(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r0, STATE.R());\n\n  // TODO: Relocations don't seem to be wired up to this...?\n  LoadConstant(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r1, Entry, CPU::Arm64Emitter::PadType::AUTOPAD);\n\n  ldr(ARMEmitter::XReg::x2, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.ThreadRemoveCodeEntryFromJIT));\n  if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n    GenerateIndirectRuntimeCall<void, void*, void*>(ARMEmitter::Reg::r2);\n  } else {\n    blr(ARMEmitter::Reg::r2);\n  }\n  FillStaticRegs();\n\n  // Fix the stack and any values that were stepped on\n  PopDynamicRegs();\n}\n\nDEF_OP(CPUID) {\n  auto Op = IROp->C<IR::IROp_CPUID>();\n\n  isb();\n  mov(ARMEmitter::Size::i64Bit, TMP2, GetReg(Op->Function));\n  mov(ARMEmitter::Size::i64Bit, TMP3, GetReg(Op->Leaf));\n\n  PushDynamicRegs(TMP4);\n  SpillStaticRegs(TMP4);\n\n  // x0 = CPUID Handler\n  // x1 = CPUID Function\n  // x2 = CPUID Leaf\n  ldr(ARMEmitter::XReg::x0, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.CPUIDObj));\n  ldr(ARMEmitter::XReg::x3, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.CPUIDFunction));\n\n  if (!TMP_ABIARGS) {\n    mov(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r1, TMP2);\n    mov(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r2, TMP3);\n  }\n\n  if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n    GenerateIndirectRuntimeCall<__uint128_t, void*, uint64_t, uint64_t>(ARMEmitter::Reg::r3);\n  } else {\n    blr(ARMEmitter::Reg::r3);\n  }\n\n  if (!TMP_ABIARGS) {\n    mov(ARMEmitter::Size::i64Bit, TMP1, ARMEmitter::Reg::r0);\n    mov(ARMEmitter::Size::i64Bit, TMP2, ARMEmitter::Reg::r1);\n  }\n\n  FillStaticRegs();\n\n  PopDynamicRegs();\n\n  // Results are in x0, x1\n  // Results want to be 4xi32 scalars\n  mov(ARMEmitter::Size::i32Bit, GetReg(Op->OutEAX), TMP1);\n  mov(ARMEmitter::Size::i32Bit, GetReg(Op->OutECX), TMP2);\n  ubfx(ARMEmitter::Size::i64Bit, GetReg(Op->OutEBX), TMP1, 32, 32);\n  ubfx(ARMEmitter::Size::i64Bit, GetReg(Op->OutEDX), TMP2, 32, 32);\n}\n\nDEF_OP(XGetBV) {\n  auto Op = IROp->C<IR::IROp_XGetBV>();\n\n  PushDynamicRegs(TMP4);\n  SpillStaticRegs(TMP4);\n\n  mov(ARMEmitter::Size::i32Bit, ARMEmitter::Reg::r1, GetReg(Op->Function));\n\n  // x0 = CPUID Handler\n  // x1 = XCR Function\n  ldr(ARMEmitter::XReg::x0, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.CPUIDObj));\n  ldr(ARMEmitter::XReg::x2, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.XCRFunction));\n  if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n    GenerateIndirectRuntimeCall<uint64_t, void*, uint32_t>(ARMEmitter::Reg::r2);\n  } else {\n    blr(ARMEmitter::Reg::r2);\n  }\n\n  if (!TMP_ABIARGS) {\n    mov(ARMEmitter::Size::i64Bit, TMP1, ARMEmitter::Reg::r0);\n  }\n\n  FillStaticRegs();\n\n  PopDynamicRegs();\n\n  // Results are in x0, need to split into i32 parts\n  mov(ARMEmitter::Size::i32Bit, GetReg(Op->OutEAX), TMP1);\n  ubfx(ARMEmitter::Size::i64Bit, GetReg(Op->OutEDX), TMP1, 32, 32);\n}\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/JIT/ConversionOps.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: backend|arm64\n$end_info$\n*/\n\n#include \"Interface/Core/JIT/JITClass.h\"\n#include \"Interface/Context/Context.h\"\n\nnamespace FEXCore::CPU {\nDEF_OP(VInsGPR) {\n  const auto Op = IROp->C<IR::IROp_VInsGPR>();\n  const auto OpSize = IROp->Size;\n\n  const auto DestIdx = Op->DestIdx;\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto SubEmitSize = ConvertSubRegSize8(IROp);\n  const auto ElementsPer128Bit = IR::NumElements(IR::OpSize::i128Bit, ElementSize);\n\n  const auto Dst = GetVReg(Node);\n  const auto DestVector = GetVReg(Op->DestVector);\n  const auto Src = GetReg(Op->Src);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto ElementSizeBits = IR::OpSizeAsBits(ElementSize);\n    const auto Offset = ElementSizeBits * DestIdx;\n\n    const auto SSEBitSize = Core::CPUState::XMM_SSE_REG_SIZE * 8;\n    const auto InUpperLane = Offset >= SSEBitSize;\n\n    // This is going to be a little gross. Pls forgive me.\n    // Since SVE has the whole vector length agnostic programming\n    // thing going on, we can't exactly freely insert entries into\n    // arbitrary locations in the vector.\n    //\n    // SVE *does* have INSR, however this only shifts the entire\n    // vector to the left by an element size and inserts a value\n    // at the beginning of the vector. Not *quite* what we need.\n    // (though INSR *is* very useful for other things).\n    //\n    // The idea is (in the case of the upper lane), move the upper\n    // lane down, insert into it and recombine with the lower lane.\n    //\n    // In the case of the lower lane, insert and then recombine with\n    // the upper lane.\n\n    if (InUpperLane) {\n      // Move the upper lane down for the insertion.\n      const auto CompactPred = ARMEmitter::PReg::p0;\n      not_(CompactPred, PRED_TMP_32B.Zeroing(), PRED_TMP_16B);\n      compact(ARMEmitter::SubRegSize::i64Bit, VTMP1.Z(), CompactPred, DestVector.Z());\n    }\n\n    // Put data in place for destructive SPLICE below.\n    mov(Dst.Z(), DestVector.Z());\n\n    // Inserts the GPR value into the given V register.\n    // Also automatically adjusts the index in the case of using the\n    // moved upper lane.\n    const auto Insert = [&](const ARMEmitter::VRegister& reg, int index) {\n      if (InUpperLane) {\n        index -= ElementsPer128Bit;\n      }\n      ins(SubEmitSize, reg, index, Src);\n    };\n\n    if (InUpperLane) {\n      Insert(VTMP1, DestIdx);\n      splice<ARMEmitter::OpType::Destructive>(ARMEmitter::SubRegSize::i64Bit, Dst.Z(), PRED_TMP_16B, Dst.Z(), VTMP1.Z());\n    } else {\n      Insert(Dst, DestIdx);\n      splice<ARMEmitter::OpType::Destructive>(ARMEmitter::SubRegSize::i64Bit, Dst.Z(), PRED_TMP_16B, Dst.Z(), DestVector.Z());\n    }\n  } else {\n    // No need to move if Dst and DestVector alias one another.\n    if (Dst != DestVector) {\n      mov(Dst.Q(), DestVector.Q());\n    }\n    ins(SubEmitSize, Dst, DestIdx, Src);\n  }\n}\n\nDEF_OP(VCastFromGPR) {\n  auto Op = IROp->C<IR::IROp_VCastFromGPR>();\n  auto Dst = GetVReg(Node);\n  auto Src = GetReg(Op->Src);\n\n  switch (Op->Header.ElementSize) {\n  case IR::OpSize::i8Bit:\n    uxtb(ARMEmitter::Size::i32Bit, TMP1, Src);\n    fmov(ARMEmitter::Size::i32Bit, Dst.S(), TMP1);\n    break;\n  case IR::OpSize::i16Bit:\n    uxth(ARMEmitter::Size::i32Bit, TMP1, Src);\n    fmov(ARMEmitter::Size::i32Bit, Dst.S(), TMP1);\n    break;\n  case IR::OpSize::i32Bit: fmov(ARMEmitter::Size::i32Bit, Dst.S(), Src); break;\n  case IR::OpSize::i64Bit: fmov(ARMEmitter::Size::i64Bit, Dst.D(), Src); break;\n  default: LOGMAN_MSG_A_FMT(\"Unknown castGPR element size: {}\", Op->Header.ElementSize);\n  }\n}\n\nDEF_OP(VLoadTwoGPRs) {\n  const auto Op = IROp->C<IR::IROp_VLoadTwoGPRs>();\n\n  const auto Dst = GetVReg(Node);\n  const auto SrcLower = GetReg(Op->Lower);\n  const auto SrcUpper = GetReg(Op->Upper);\n  fmov(ARMEmitter::Size::i64Bit, Dst.D(), SrcLower);\n  fmov(ARMEmitter::Size::i64Bit, Dst.D(), SrcUpper, true);\n}\n\nDEF_OP(VDupFromGPR) {\n  const auto Op = IROp->C<IR::IROp_VDupFromGPR>();\n  const auto OpSize = IROp->Size;\n\n  const auto Dst = GetVReg(Node);\n  const auto Src = GetReg(Op->Src);\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto SubEmitSize = ConvertSubRegSize8(IROp);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    dup(SubEmitSize, Dst.Z(), Src);\n  } else {\n    dup(SubEmitSize, Dst.Q(), Src);\n  }\n}\n\nDEF_OP(Float_FromGPR_S) {\n  const auto Op = IROp->C<IR::IROp_Float_FromGPR_S>();\n\n  const uint16_t ElementSize = IR::OpSizeToSize(Op->Header.ElementSize);\n  const uint16_t Conv = (ElementSize << 8) | IR::OpSizeToSize(Op->SrcElementSize);\n\n  auto Dst = GetVReg(Node);\n  auto Src = GetReg(Op->Src);\n\n  switch (Conv) {\n  case 0x0204: { // Half <- int32_t\n    scvtf(ARMEmitter::Size::i32Bit, Dst.H(), Src);\n    break;\n  }\n  case 0x0208: { // Half <- int64_t\n    scvtf(ARMEmitter::Size::i64Bit, Dst.H(), Src);\n    break;\n  }\n  case 0x0404: { // Float <- int32_t\n    scvtf(ARMEmitter::Size::i32Bit, Dst.S(), Src);\n    break;\n  }\n  case 0x0408: { // Float <- int64_t\n    scvtf(ARMEmitter::Size::i64Bit, Dst.S(), Src);\n    break;\n  }\n  case 0x0804: { // Double <- int32_t\n    scvtf(ARMEmitter::Size::i32Bit, Dst.D(), Src);\n    break;\n  }\n  case 0x0808: { // Double <- int64_t\n    scvtf(ARMEmitter::Size::i64Bit, Dst.D(), Src);\n    break;\n  }\n  default:\n    LOGMAN_MSG_A_FMT(\"Unhandled conversion mask: Mask=0x{:04x}, ElementSize={}, SrcElementSize={}\", Conv, ElementSize, Op->SrcElementSize);\n    break;\n  }\n}\n\nDEF_OP(Float_FToF) {\n  auto Op = IROp->C<IR::IROp_Float_FToF>();\n  const uint16_t Conv = (IR::OpSizeToSize(Op->Header.ElementSize) << 8) | IR::OpSizeToSize(Op->SrcElementSize);\n\n  auto Dst = GetVReg(Node);\n  auto Src = GetVReg(Op->Scalar);\n\n  switch (Conv) {\n  case 0x0204: { // Half <- Float\n    fcvt(Dst.H(), Src.S());\n    break;\n  }\n  case 0x0208: { // Half <- Double\n    fcvt(Dst.H(), Src.D());\n    break;\n  }\n  case 0x0402: { // Float <- Half\n    fcvt(Dst.S(), Src.H());\n    break;\n  }\n  case 0x0802: { // Double <- Half\n    fcvt(Dst.D(), Src.H());\n    break;\n  }\n  case 0x0804: { // Double <- Float\n    fcvt(Dst.D(), Src.S());\n    break;\n  }\n  case 0x0408: { // Float <- Double\n    fcvt(Dst.S(), Src.D());\n    break;\n  }\n  default: LOGMAN_MSG_A_FMT(\"Unknown FCVT sizes: 0x{:x}\", Conv);\n  }\n}\n\nDEF_OP(Vector_SToF) {\n  const auto Op = IROp->C<IR::IROp_Vector_SToF>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubEmitSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B;\n    scvtf(Dst.Z(), SubEmitSize, Mask.Merging(), Vector.Z(), SubEmitSize);\n  } else {\n    if (OpSize == ElementSize) {\n      if (ElementSize == IR::OpSize::i64Bit) {\n        scvtf(ARMEmitter::ScalarRegSize::i64Bit, Dst.D(), Vector.D());\n      } else if (ElementSize == IR::OpSize::i32Bit) {\n        scvtf(ARMEmitter::ScalarRegSize::i32Bit, Dst.S(), Vector.S());\n      } else {\n        scvtf(ARMEmitter::ScalarRegSize::i16Bit, Dst.H(), Vector.H());\n      }\n    } else {\n      if (OpSize == IR::OpSize::i64Bit) {\n        scvtf(SubEmitSize, Dst.D(), Vector.D());\n      } else {\n        scvtf(SubEmitSize, Dst.Q(), Vector.Q());\n      }\n    }\n  }\n}\n\nDEF_OP(Vector_FToZS) {\n  const auto Op = IROp->C<IR::IROp_Vector_FToZS>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubEmitSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B;\n    fcvtzs(Dst.Z(), SubEmitSize, Mask.Merging(), Vector.Z(), SubEmitSize);\n  } else {\n    if (OpSize == ElementSize) {\n      if (ElementSize == IR::OpSize::i64Bit) {\n        fcvtzs(ARMEmitter::ScalarRegSize::i64Bit, Dst.D(), Vector.D());\n      } else if (ElementSize == IR::OpSize::i32Bit) {\n        fcvtzs(ARMEmitter::ScalarRegSize::i32Bit, Dst.S(), Vector.S());\n      } else {\n        fcvtzs(ARMEmitter::ScalarRegSize::i16Bit, Dst.H(), Vector.H());\n      }\n    } else {\n      if (OpSize == IR::OpSize::i64Bit) {\n        fcvtzs(SubEmitSize, Dst.D(), Vector.D());\n      } else {\n        fcvtzs(SubEmitSize, Dst.Q(), Vector.Q());\n      }\n    }\n  }\n}\n\nDEF_OP(Vector_FToS) {\n  const auto Op = IROp->C<IR::IROp_Vector_FToS>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto SubEmitSize = ConvertSubRegSize248(IROp);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B;\n    frinti(SubEmitSize, Dst.Z(), Mask.Merging(), Vector.Z());\n    fcvtzs(Dst.Z(), SubEmitSize, Mask.Merging(), Dst.Z(), SubEmitSize);\n  } else {\n    const auto Dst = GetVReg(Node);\n    const auto Vector = GetVReg(Op->Vector);\n    if (OpSize == IR::OpSize::i64Bit) {\n      frinti(SubEmitSize, Dst.D(), Vector.D());\n      fcvtzs(SubEmitSize, Dst.D(), Dst.D());\n    } else {\n      frinti(SubEmitSize, Dst.Q(), Vector.Q());\n      fcvtzs(SubEmitSize, Dst.Q(), Dst.Q());\n    }\n  }\n}\n\nDEF_OP(Vector_FToF) {\n  const auto Op = IROp->C<IR::IROp_Vector_FToF>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubEmitSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Conv = (IR::OpSizeToSize(ElementSize) << 8) | IR::OpSizeToSize(Op->SrcElementSize);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    // Curiously, FCVTLT and FCVTNT have no bottom variants,\n    // and also interesting is that FCVTLT will iterate the\n    // source vector by accessing each odd element and storing\n    // them consecutively in the destination.\n    //\n    // FCVTNT is somewhat like the opposite. It will read each\n    // consecutive element, but store each result into every odd\n    // element in the destination vector.\n    //\n    // We need to undo the behavior of FCVTNT with UZP2. In the case\n    // of FCVTLT, we instead need to set the vector up with ZIP1, so\n    // that the elements will be processed correctly.\n\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    switch (Conv) {\n    case 0x0402: { // Float <- Half\n      zip1(ARMEmitter::SubRegSize::i16Bit, Dst.Z(), Vector.Z(), Vector.Z());\n      fcvtlt(ARMEmitter::SubRegSize::i32Bit, Dst.Z(), Mask, Dst.Z());\n      break;\n    }\n    case 0x0804: { // Double <- Float\n      zip1(ARMEmitter::SubRegSize::i32Bit, Dst.Z(), Vector.Z(), Vector.Z());\n      fcvtlt(ARMEmitter::SubRegSize::i64Bit, Dst.Z(), Mask, Dst.Z());\n      break;\n    }\n    case 0x0204: { // Half <- Float\n      fcvtnt(ARMEmitter::SubRegSize::i16Bit, Dst.Z(), Mask, Vector.Z());\n      uzp2(ARMEmitter::SubRegSize::i16Bit, Dst.Z(), Dst.Z(), Dst.Z());\n      break;\n    }\n    case 0x0408: { // Float <- Double\n      fcvtnt(ARMEmitter::SubRegSize::i32Bit, Dst.Z(), Mask, Vector.Z());\n      uzp2(ARMEmitter::SubRegSize::i32Bit, Dst.Z(), Dst.Z(), Dst.Z());\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unknown Vector_FToF Type : 0x{:04x}\", Conv); break;\n    }\n  } else {\n    switch (Conv) {\n    case 0x0402:   // Float <- Half\n    case 0x0804: { // Double <- Float\n      fcvtl(SubEmitSize, Dst.D(), Vector.D());\n      break;\n    }\n    case 0x0204:   // Half <- Float\n    case 0x0408: { // Float <- Double\n      fcvtn(SubEmitSize, Dst.D(), Vector.D());\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unknown Vector_FToF Type : 0x{:04x}\", Conv); break;\n    }\n  }\n}\n\nDEF_OP(VFCVTL2) {\n  const auto Op = IROp->C<IR::IROp_VFCVTL2>();\n\n  const auto SubEmitSize = ConvertSubRegSize248(IROp);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  fcvtl2(SubEmitSize, Dst.D(), Vector.D());\n}\n\nDEF_OP(VFCVTN2) {\n  const auto Op = IROp->C<IR::IROp_VFCVTN2>();\n\n  const auto SubEmitSize = ConvertSubRegSize248(IROp);\n\n  const auto Dst = GetVReg(Node);\n  const auto VectorLower = GetVReg(Op->VectorLower);\n  const auto VectorUpper = GetVReg(Op->VectorUpper);\n\n  auto Lower = VectorLower;\n  if (Dst != VectorLower) {\n    mov(VTMP1.Q(), VectorLower.Q());\n    Lower = VTMP1;\n  }\n\n  fcvtn2(SubEmitSize, Lower.Q(), VectorUpper.Q());\n\n  if (Dst != VectorLower) {\n    mov(Dst.Q(), Lower.Q());\n  }\n}\n\nDEF_OP(Vector_FToI) {\n  const auto Op = IROp->C<IR::IROp_Vector_FToI>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubEmitSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    switch (Op->Round) {\n    case IR::RoundMode::Nearest: frintn(SubEmitSize, Dst.Z(), Mask, Vector.Z()); break;\n    case IR::RoundMode::NegInfinity: frintm(SubEmitSize, Dst.Z(), Mask, Vector.Z()); break;\n    case IR::RoundMode::PosInfinity: frintp(SubEmitSize, Dst.Z(), Mask, Vector.Z()); break;\n    case IR::RoundMode::TowardsZero: frintz(SubEmitSize, Dst.Z(), Mask, Vector.Z()); break;\n    case IR::RoundMode::Host: frinti(SubEmitSize, Dst.Z(), Mask, Vector.Z()); break;\n    }\n  } else {\n    const auto IsScalar = ElementSize == OpSize;\n\n    if (IsScalar) {\n// Since we have multiple overloads of the same name (e.g.\n// frinti having AdvSIMD, AdvSIMD scalar, and an SVE version),\n// we can't just use a lambda without some seriously ugly casting.\n// This is fairly self-contained otherwise.\n#define ROUNDING_FN(name)                         \\\n  if (ElementSize == IR::OpSize::i16Bit) {        \\\n    name(Dst.H(), Vector.H());                    \\\n  } else if (ElementSize == IR::OpSize::i32Bit) { \\\n    name(Dst.S(), Vector.S());                    \\\n  } else if (ElementSize == IR::OpSize::i64Bit) { \\\n    name(Dst.D(), Vector.D());                    \\\n  } else {                                        \\\n    FEX_UNREACHABLE;                              \\\n  }\n\n      switch (Op->Round) {\n      case IR::RoundMode::Nearest: ROUNDING_FN(frintn); break;\n      case IR::RoundMode::NegInfinity: ROUNDING_FN(frintm); break;\n      case IR::RoundMode::PosInfinity: ROUNDING_FN(frintp); break;\n      case IR::RoundMode::TowardsZero: ROUNDING_FN(frintz); break;\n      case IR::RoundMode::Host: ROUNDING_FN(frinti); break;\n      }\n\n#undef ROUNDING_FN\n    } else {\n      switch (Op->Round) {\n      case IR::RoundMode::Nearest: frintn(SubEmitSize, Dst.Q(), Vector.Q()); break;\n      case IR::RoundMode::NegInfinity: frintm(SubEmitSize, Dst.Q(), Vector.Q()); break;\n      case IR::RoundMode::PosInfinity: frintp(SubEmitSize, Dst.Q(), Vector.Q()); break;\n      case IR::RoundMode::TowardsZero: frintz(SubEmitSize, Dst.Q(), Vector.Q()); break;\n      case IR::RoundMode::Host: frinti(SubEmitSize, Dst.Q(), Vector.Q()); break;\n      }\n    }\n  }\n}\n\nDEF_OP(Vector_FToISized) {\n  const auto Op = IROp->C<IR::IROp_Vector_FToISized>();\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubEmitSize = ConvertSubRegSize248(IROp);\n  LOGMAN_THROW_A_FMT(IROp->Size != IR::OpSize::i256Bit, \"256-bit not wired up, though we could change that\");\n  LOGMAN_THROW_A_FMT(CTX->HostFeatures.SupportsFRINTTS, \"Need FRINTTS for Vector_FToISized\");\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (ElementSize == IROp->Size) {\n// See above\n#define ROUNDING_FN(name)                         \\\n  if (ElementSize == IR::OpSize::i32Bit) {        \\\n    name(Dst.S(), Vector.S());                    \\\n  } else if (ElementSize == IR::OpSize::i64Bit) { \\\n    name(Dst.D(), Vector.D());                    \\\n  } else {                                        \\\n    FEX_UNREACHABLE;                              \\\n  }\n\n    if (Op->IntSize == IR::OpSize::i64Bit) {\n      if (Op->HostRound) {\n        ROUNDING_FN(frint64x);\n      } else {\n        ROUNDING_FN(frint64z);\n      }\n    } else {\n      if (Op->HostRound) {\n        ROUNDING_FN(frint32x);\n      } else {\n        ROUNDING_FN(frint32z);\n      }\n    }\n\n#undef ROUNDING_FN\n  } else {\n    if (Op->IntSize == IR::OpSize::i64Bit) {\n      if (Op->HostRound) {\n        frint64x(SubEmitSize, Dst.Q(), Vector.Q());\n      } else {\n        frint64z(SubEmitSize, Dst.Q(), Vector.Q());\n      }\n    } else {\n      if (Op->HostRound) {\n        frint32x(SubEmitSize, Dst.Q(), Vector.Q());\n      } else {\n        frint32z(SubEmitSize, Dst.Q(), Vector.Q());\n      }\n    }\n  }\n}\n\nDEF_OP(Vector_F64ToI32) {\n  const auto Op = IROp->C<IR::IROp_Vector_F64ToI32>();\n  const auto OpSize = IROp->Size;\n  const auto Round = Op->Round;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n  if (HostSupportsSVE128 || HostSupportsSVE256) {\n    const auto Mask = Is256Bit ? PRED_TMP_32B.Merging() : PRED_TMP_16B.Merging();\n    // First step is to round the f64 values to integrals (frint*)\n    // Then convert to integers using fcvtzs.\n    auto CVTReg = Dst.Z();\n    switch (Round) {\n    case IR::RoundMode::Nearest: frintn(ARMEmitter::SubRegSize::i64Bit, Dst.Z(), Mask, Vector.Z()); break;\n    case IR::RoundMode::NegInfinity: frintm(ARMEmitter::SubRegSize::i64Bit, Dst.Z(), Mask, Vector.Z()); break;\n    case IR::RoundMode::PosInfinity: frintp(ARMEmitter::SubRegSize::i64Bit, Dst.Z(), Mask, Vector.Z()); break;\n    case IR::RoundMode::TowardsZero: CVTReg = Vector.Z(); break;\n    case IR::RoundMode::Host: frinti(ARMEmitter::SubRegSize::i64Bit, Dst.Z(), Mask, Vector.Z()); break;\n    }\n\n    fcvtzs(Dst.Z(), ARMEmitter::SubRegSize::i32Bit, Mask, CVTReg, ARMEmitter::SubRegSize::i64Bit);\n\n    ///< Fixup format of register that fcvtzs returns.\n    uzp1(ARMEmitter::SubRegSize::i32Bit, Dst.Z(), Dst.Z(), Dst.Z());\n    if (Op->EnsureZeroUpperHalf) {\n      ///< Match CVTPD2DQ/CVTTPD2DQ behaviour if necessary by zeroing the upper bits here.\n      if (Is256Bit) {\n        mov(Dst.Q(), Dst.Q());\n      } else {\n        mov(Dst.D(), Dst.D());\n      }\n    }\n  } else {\n    // This has a known precision issue that isn't easily resolvable without throwing away performance.\n    // Doing the conversion in multi-stage steps has an issue that you can lose precision in the f32->i32 step if your source was f64.\n    // To get around this with ASIMD FEX needs to use fcvtzs (Scalar, Integer, to GPR) for each F64 to be directly converted to i32.\n    // This is a very costly transform that the SVE path doesn't need to do since it supports f64->i32 directly.\n    // If this precision issue is necessary then we can add an option for it in the future.\n\n    ///< Round float to integral depending on rounding mode.\n    switch (Round) {\n    case IR::RoundMode::Nearest: frintn(ARMEmitter::SubRegSize::i64Bit, Dst.Q(), Vector.Q()); break;\n    case IR::RoundMode::NegInfinity: frintm(ARMEmitter::SubRegSize::i64Bit, Dst.Q(), Vector.Q()); break;\n    case IR::RoundMode::PosInfinity: frintp(ARMEmitter::SubRegSize::i64Bit, Dst.Q(), Vector.Q()); break;\n    case IR::RoundMode::TowardsZero: frintz(ARMEmitter::SubRegSize::i64Bit, Dst.Q(), Vector.Q()); break;\n    case IR::RoundMode::Host: frinti(ARMEmitter::SubRegSize::i64Bit, Dst.Q(), Vector.Q()); break;\n    }\n\n    // Now narrow from f64 to f32.\n    fcvtn(ARMEmitter::SubRegSize::i32Bit, Dst.Q(), Dst.Q());\n\n    ///< Convert the two F32 integrals to real integers.\n    fcvtzs(ARMEmitter::SubRegSize::i32Bit, Dst.D(), Dst.D());\n  }\n}\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/JIT/DebugData.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/AllocatorHooks.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <cstdint>\n\nnamespace FEXCore::CPU {\nunion Relocation;\n} // namespace FEXCore::CPU\n\nnamespace FEXCore::Core {\nstruct DebugDataSubblock {\n  uint32_t HostCodeOffset;\n  uint32_t HostCodeSize;\n};\n\nstruct DebugDataGuestOpcode {\n  uint64_t GuestEntryOffset;\n  ptrdiff_t HostEntryOffset;\n};\n\n/**\n * @brief Contains debug data for a block of code for later debugger analysis\n *\n * Needs to remain around for as long as the code could be executed at least\n */\nstruct DebugData : public FEXCore::Allocator::FEXAllocOperators {\n  uint64_t HostCodeSize; ///< The size of the code generated in the host JIT\n  fextl::vector<DebugDataSubblock> Subblocks;\n  fextl::vector<DebugDataGuestOpcode> GuestOpcodes;\n  fextl::vector<FEXCore::CPU::Relocation>* Relocations;\n};\n} // namespace FEXCore::Core\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/JIT/EncryptionOps.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: backend|arm64\n$end_info$\n*/\n\n#include \"Interface/Core/JIT/JITClass.h\"\n\nnamespace FEXCore::CPU {\n\nDEF_OP(VAESImc) {\n  auto Op = IROp->C<IR::IROp_VAESImc>();\n  aesimc(GetVReg(Node), GetVReg(Op->Vector));\n}\n\nDEF_OP(VAESEnc) {\n  const auto Op = IROp->C<IR::IROp_VAESEnc>();\n  const auto OpSize = IROp->Size;\n\n  const auto Dst = GetVReg(Node);\n  const auto Key = GetVReg(Op->Key);\n  const auto State = GetVReg(Op->State);\n  const auto ZeroReg = GetVReg(Op->ZeroReg);\n\n  LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i128Bit, \"Currently only supports 128-bit operations.\");\n\n  if (Dst == State && Dst != Key) {\n    // Optimal case in which Dst already contains the starting state.\n    // This matches the common case of XMM AES.\n    aese(Dst.Q(), ZeroReg.Q());\n    aesmc(Dst.Q(), Dst.Q());\n    eor(Dst.Q(), Dst.Q(), Key.Q());\n  } else {\n    mov(VTMP1.Q(), State.Q());\n    aese(VTMP1, ZeroReg.Q());\n    aesmc(VTMP1, VTMP1);\n    eor(Dst.Q(), VTMP1.Q(), Key.Q());\n  }\n}\n\nDEF_OP(VAESEncLast) {\n  const auto Op = IROp->C<IR::IROp_VAESEncLast>();\n  const auto OpSize = IROp->Size;\n\n  const auto Dst = GetVReg(Node);\n  const auto Key = GetVReg(Op->Key);\n  const auto State = GetVReg(Op->State);\n  const auto ZeroReg = GetVReg(Op->ZeroReg);\n\n  LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i128Bit, \"Currently only supports 128-bit operations.\");\n\n  if (Dst == State && Dst != Key) {\n    // Optimal case in which Dst already contains the starting state.\n    // This matches the common case of XMM AES.\n    aese(Dst.Q(), ZeroReg.Q());\n    eor(Dst.Q(), Dst.Q(), Key.Q());\n  } else {\n    mov(VTMP1.Q(), State.Q());\n    aese(VTMP1, ZeroReg.Q());\n    eor(Dst.Q(), VTMP1.Q(), Key.Q());\n  }\n}\n\nDEF_OP(VAESDec) {\n  const auto Op = IROp->C<IR::IROp_VAESDec>();\n  const auto OpSize = IROp->Size;\n\n  const auto Dst = GetVReg(Node);\n  const auto Key = GetVReg(Op->Key);\n  const auto State = GetVReg(Op->State);\n  const auto ZeroReg = GetVReg(Op->ZeroReg);\n\n  LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i128Bit, \"Currently only supports 128-bit operations.\");\n\n  if (Dst == State && Dst != Key) {\n    // Optimal case in which Dst already contains the starting state.\n    // This matches the common case of XMM AES.\n    aesd(Dst.Q(), ZeroReg.Q());\n    aesimc(Dst.Q(), Dst.Q());\n    eor(Dst.Q(), Dst.Q(), Key.Q());\n  } else {\n    mov(VTMP1.Q(), State.Q());\n    aesd(VTMP1, ZeroReg.Q());\n    aesimc(VTMP1, VTMP1);\n    eor(Dst.Q(), VTMP1.Q(), Key.Q());\n  }\n}\n\nDEF_OP(VAESDecLast) {\n  const auto Op = IROp->C<IR::IROp_VAESDecLast>();\n  const auto OpSize = IROp->Size;\n\n  const auto Dst = GetVReg(Node);\n  const auto Key = GetVReg(Op->Key);\n  const auto State = GetVReg(Op->State);\n  const auto ZeroReg = GetVReg(Op->ZeroReg);\n\n  LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i128Bit, \"Currently only supports 128-bit operations.\");\n\n  if (Dst == State && Dst != Key) {\n    // Optimal case in which Dst already contains the starting state.\n    // This matches the common case of XMM AES.\n    aesd(Dst.Q(), ZeroReg.Q());\n    eor(Dst.Q(), Dst.Q(), Key.Q());\n  } else {\n    mov(VTMP1.Q(), State.Q());\n    aesd(VTMP1, ZeroReg.Q());\n    eor(Dst.Q(), VTMP1.Q(), Key.Q());\n  }\n}\n\nDEF_OP(VAESKeyGenAssist) {\n  auto Op = IROp->C<IR::IROp_VAESKeyGenAssist>();\n  const auto Dst = GetVReg(Node);\n  const auto Src = GetVReg(Op->Src);\n  const auto Swizzle = GetVReg(Op->KeyGenTBLSwizzle);\n  auto ZeroReg = GetVReg(Op->ZeroReg);\n\n  if (Dst == ZeroReg) {\n    // Seriously? ZeroReg ended up being the destination register?\n    // Just copy it over in this case...\n    mov(VTMP1.Q(), ZeroReg.Q());\n    ZeroReg = VTMP1;\n  }\n\n  if (Dst != Src) {\n    mov(Dst.Q(), Src.Q());\n  }\n\n  // Do a \"regular\" AESE step\n  aese(Dst, ZeroReg.Q());\n\n  // Now EOR in the RCON\n  if (Op->RCON) {\n    tbl(Dst.Q(), Dst.Q(), Swizzle.Q());\n\n    LoadConstant(ARMEmitter::Size::i64Bit, TMP1, static_cast<uint64_t>(Op->RCON) << 32);\n    dup(ARMEmitter::SubRegSize::i64Bit, VTMP2.Q(), TMP1);\n    eor(Dst.Q(), Dst.Q(), VTMP2.Q());\n  } else {\n    tbl(Dst.Q(), Dst.Q(), Swizzle.Q());\n  }\n}\n\nDEF_OP(CRC32) {\n  auto Op = IROp->C<IR::IROp_CRC32>();\n\n  const auto Dst = GetReg(Node);\n  const auto Src1 = GetReg(Op->Src1);\n  const auto Src2 = GetReg(Op->Src2);\n\n  switch (Op->SrcSize) {\n  case IR::OpSize::i8Bit: crc32cb(Dst.W(), Src1.W(), Src2.W()); break;\n  case IR::OpSize::i16Bit: crc32ch(Dst.W(), Src1.W(), Src2.W()); break;\n  case IR::OpSize::i32Bit: crc32cw(Dst.W(), Src1.W(), Src2.W()); break;\n  case IR::OpSize::i64Bit: crc32cx(Dst.X(), Src1.X(), Src2.X()); break;\n  default: LOGMAN_MSG_A_FMT(\"Unknown CRC32 size: {}\", Op->SrcSize);\n  }\n}\n\nDEF_OP(VSha1H) {\n  auto Op = IROp->C<IR::IROp_VSha1H>();\n\n  const auto Dst = GetVReg(Node);\n  const auto Src = GetVReg(Op->Src);\n\n  sha1h(Dst.S(), Src.S());\n}\n\nDEF_OP(VSha1C) {\n  auto Op = IROp->C<IR::IROp_VSha1C>();\n\n  const auto Dst = GetVReg(Node);\n  const auto Src1 = GetVReg(Op->Src1);\n  const auto Src2 = GetVReg(Op->Src2);\n  const auto Src3 = GetVReg(Op->Src3);\n\n  if (Dst == Src1) {\n    sha1c(Dst, Src2.S(), Src3);\n  } else if (Dst != Src2 && Dst != Src3) {\n    mov(Dst.Q(), Src1.Q());\n    sha1c(Dst, Src2.S(), Src3);\n  } else {\n    mov(VTMP1.Q(), Src1.Q());\n    sha1c(VTMP1, Src2.S(), Src3);\n    mov(Dst.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VSha1M) {\n  auto Op = IROp->C<IR::IROp_VSha1M>();\n\n  const auto Dst = GetVReg(Node);\n  const auto Src1 = GetVReg(Op->Src1);\n  const auto Src2 = GetVReg(Op->Src2);\n  const auto Src3 = GetVReg(Op->Src3);\n\n  if (Dst == Src1) {\n    sha1m(Dst, Src2.S(), Src3);\n  } else if (Dst != Src2 && Dst != Src3) {\n    mov(Dst.Q(), Src1.Q());\n    sha1m(Dst, Src2.S(), Src3);\n  } else {\n    mov(VTMP1.Q(), Src1.Q());\n    sha1m(VTMP1, Src2.S(), Src3);\n    mov(Dst.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VSha1P) {\n  auto Op = IROp->C<IR::IROp_VSha1P>();\n\n  const auto Dst = GetVReg(Node);\n  const auto Src1 = GetVReg(Op->Src1);\n  const auto Src2 = GetVReg(Op->Src2);\n  const auto Src3 = GetVReg(Op->Src3);\n\n  if (Dst == Src1) {\n    sha1p(Dst, Src2.S(), Src3);\n  } else if (Dst != Src2 && Dst != Src3) {\n    mov(Dst.Q(), Src1.Q());\n    sha1p(Dst, Src2.S(), Src3);\n  } else {\n    mov(VTMP1.Q(), Src1.Q());\n    sha1p(VTMP1, Src2.S(), Src3);\n    mov(Dst.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VSha1SU1) {\n  auto Op = IROp->C<IR::IROp_VSha1SU1>();\n\n  const auto Dst = GetVReg(Node);\n  const auto Src1 = GetVReg(Op->Src1);\n  const auto Src2 = GetVReg(Op->Src2);\n\n  if (Dst == Src1) {\n    sha1su1(Dst, Src2);\n  } else if (Dst != Src2) {\n    mov(Dst.Q(), Src1.Q());\n    sha1su1(Dst, Src2);\n  } else {\n    mov(VTMP1.Q(), Src1.Q());\n    sha1su1(VTMP1, Src2);\n    mov(Dst.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VSha256H) {\n  auto Op = IROp->C<IR::IROp_VSha256H>();\n\n  const auto Dst = GetVReg(Node);\n  const auto Src1 = GetVReg(Op->Src1);\n  const auto Src2 = GetVReg(Op->Src2);\n  const auto Src3 = GetVReg(Op->Src3);\n\n  if (Dst == Src1) {\n    sha256h(Dst, Src2, Src3);\n  } else if (Dst != Src2 && Dst != Src3) {\n    mov(Dst.Q(), Src1.Q());\n    sha256h(Dst, Src2, Src3);\n  } else {\n    mov(VTMP1.Q(), Src1.Q());\n    sha256h(VTMP1, Src2, Src3);\n    mov(Dst.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VSha256H2) {\n  auto Op = IROp->C<IR::IROp_VSha256H2>();\n\n  const auto Dst = GetVReg(Node);\n  const auto Src1 = GetVReg(Op->Src1);\n  const auto Src2 = GetVReg(Op->Src2);\n  const auto Src3 = GetVReg(Op->Src3);\n\n  if (Dst == Src1) {\n    sha256h2(Dst, Src2, Src3);\n  } else if (Dst != Src2 && Dst != Src3) {\n    mov(Dst.Q(), Src1.Q());\n    sha256h2(Dst, Src2, Src3);\n  } else {\n    mov(VTMP1.Q(), Src1.Q());\n    sha256h2(VTMP1, Src2, Src3);\n    mov(Dst.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VSha256U0) {\n  auto Op = IROp->C<IR::IROp_VSha256U0>();\n\n  const auto Dst = GetVReg(Node);\n  const auto Src1 = GetVReg(Op->Src1);\n  const auto Src2 = GetVReg(Op->Src2);\n\n  if (Dst == Src1) {\n    sha256su0(Dst, Src2);\n  } else {\n    mov(VTMP1.Q(), Src1.Q());\n    sha256su0(VTMP1, Src2);\n    mov(Dst.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VSha256U1) {\n  auto Op = IROp->C<IR::IROp_VSha256U1>();\n\n  const auto Dst = GetVReg(Node);\n  const auto Src1 = GetVReg(Op->Src1);\n  const auto Src2 = GetVReg(Op->Src2);\n\n  if (Dst != Src1 && Dst != Src2) {\n    movi(ARMEmitter::SubRegSize::i64Bit, Dst.Q(), 0);\n    sha256su1(Dst, Src1, Src2);\n  } else {\n    movi(ARMEmitter::SubRegSize::i64Bit, VTMP1.Q(), 0);\n    sha256su1(VTMP1, Src1, Src2);\n    mov(Dst.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(PCLMUL) {\n  const auto Op = IROp->C<IR::IROp_PCLMUL>();\n  const auto OpSize = IROp->Size;\n\n  const auto Dst = GetVReg(Node);\n  const auto Src1 = GetVReg(Op->Src1);\n  const auto Src2 = GetVReg(Op->Src2);\n\n  LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i128Bit, \"Currently only supports 128-bit operations.\");\n\n  switch (Op->Selector) {\n  case 0b00000000: pmull(ARMEmitter::SubRegSize::i128Bit, Dst.D(), Src1.D(), Src2.D()); break;\n  case 0b00000001:\n    dup(ARMEmitter::SubRegSize::i64Bit, VTMP1.Q(), Src1.Q(), 1);\n    pmull(ARMEmitter::SubRegSize::i128Bit, Dst.D(), VTMP1.D(), Src2.D());\n    break;\n  case 0b00010000:\n    dup(ARMEmitter::SubRegSize::i64Bit, VTMP1.Q(), Src2.Q(), 1);\n    pmull(ARMEmitter::SubRegSize::i128Bit, Dst.D(), VTMP1.D(), Src1.D());\n    break;\n  case 0b00010001: pmull2(ARMEmitter::SubRegSize::i128Bit, Dst.Q(), Src1.Q(), Src2.Q()); break;\n  default: LOGMAN_MSG_A_FMT(\"Unknown PCLMUL selector: {}\", Op->Selector); break;\n  }\n}\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/JIT/JIT.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\nglossary: Splatter ~ a code generator backend that concatenates configurable macros instead of doing isel\nglossary: IR ~ Intermediate Representation, our high-level opcode representation, loosely modeling arm64\nglossary: SSA ~ Single Static Assignment, a form of representing IR in memory\nglossary: Basic Block ~ A block of instructions with no control flow, terminated by control flow\nglossary: Fragment ~ A Collection of basic blocks, possibly an entire guest function or a subset of it\ntags: backend|arm64\ndesc: Main glue logic of the arm64 splatter backend\n$end_info$\n*/\n\n#include \"Interface/Context/Context.h\"\n#include \"Interface/Core/LookupCache.h\"\n#include \"Interface/Core/Dispatcher/Dispatcher.h\"\n#include \"Interface/Core/Interpreter/InterpreterOps.h\"\n#include \"Interface/Core/JIT/DebugData.h\"\n#include \"Interface/Core/JIT/JITClass.h\"\n#include \"Interface/IR/Passes/RegisterAllocationPass.h\"\n\n#include \"Utils/MemberFunctionToPointer.h\"\n#include \"Utils/variable_length_integer.h\"\n\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/EnumUtils.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/LongJump.h>\n#include <FEXCore/Utils/Profiler.h>\n#include <FEXCore/Utils/Telemetry.h>\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n\n#include <cstdio>\n#include <cstring>\n#include <unistd.h>\n\nnamespace {\nstruct DivRem {\n  uint64_t Quotient;\n  uint64_t Remainder;\n};\n\nstatic struct DivRem LUDIV(uint64_t SrcHigh, uint64_t SrcLow, uint64_t Divisor) {\n  __uint128_t Source = (static_cast<__uint128_t>(SrcHigh) << 64) | SrcLow;\n\n  return {\n    .Quotient = (uint64_t)(Source / Divisor),\n    .Remainder = (uint64_t)(Source % Divisor),\n  };\n}\n\nstatic struct DivRem\nLDIV(uint64_t SrcHigh, uint64_t SrcLow, int64_t Divisor) {\n  __int128_t Source = (static_cast<__uint128_t>(SrcHigh) << 64) | SrcLow;\n\n  return {\n    .Quotient = (uint64_t)(Source / Divisor),\n    .Remainder = (uint64_t)(Source % Divisor),\n  };\n}\n\nstatic void\nPrintValue(uint64_t Value) {\n  LogMan::Msg::DFmt(\"Value: 0x{:x}\", Value);\n}\n\nstatic void PrintVectorValue(uint64_t Value, uint64_t ValueUpper) {\n  LogMan::Msg::DFmt(\"Value: 0x{:016x}'{:016x}\", ValueUpper, Value);\n}\n} // namespace\n\nnamespace FEXCore::CPU {\n\nvoid Arm64JITCore::Op_Unhandled(const IR::IROp_Header* IROp, IR::Ref Node) {\n  FallbackInfo Info;\n  if (!InterpreterOps::GetFallbackHandler(IROp, &Info)) {\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    LOGMAN_MSG_A_FMT(\"Unhandled IR Op: {}\", FEXCore::IR::GetName(IROp->Op));\n#endif\n  } else {\n    auto FillF80x2Result = [&](auto DstLo, auto DstHi) {\n      mov(DstLo.Q(), VTMP1.Q());\n      mov(DstHi.Q(), VTMP2.Q());\n    };\n\n    auto FillF64x2Result = [&](auto DstLo, auto DstHi) {\n      fmov(DstLo.D(), VTMP1.D());\n      fmov(DstHi.D(), VTMP2.D());\n    };\n\n    auto FillF80Result = [&]() {\n      const auto Dst = GetVReg(Node);\n      mov(Dst.Q(), VTMP1.Q());\n    };\n\n    auto FillF64Result = [&]() {\n      const auto Dst = GetVReg(Node);\n      fmov(Dst.D(), VTMP1.D());\n    };\n\n    auto FillF32Result = [&]() {\n      const auto Dst = GetVReg(Node);\n      fmov(Dst.S(), VTMP1.S());\n    };\n\n    auto FillI64Result = [&]() {\n      const auto Dst = GetReg(Node);\n      mov(Dst.X(), TMP1);\n    };\n\n    auto FillI32Result = [&]() {\n      const auto Dst = GetReg(Node);\n      mov(Dst.W(), TMP1.W());\n    };\n\n    auto FillI16Result = [&]() {\n      const auto Dst = GetReg(Node);\n      mov(Dst.W(), TMP1.W());\n    };\n\n    switch (Info.ABI) {\n    case FABI_F80_I16_F32_PTR: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): source\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetVReg(IROp->Args[0]);\n      fmov(VTMP1.S(), Src1.S());\n\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP1);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillF80Result();\n    } break;\n\n    case FABI_F80_I16_F64_PTR: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): source\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetVReg(IROp->Args[0]);\n      fmov(VTMP1.D(), Src1.D());\n\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP1);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillF80Result();\n    } break;\n\n    case FABI_F80_I16_I16_PTR:\n    case FABI_F80_I16_I32_PTR: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // tmp2 (x1/x11): source\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetReg(IROp->Args[0]);\n\n      // Need to sign or zero extend this for the dispatcher handler.\n      if (Info.ABI == FABI_F80_I16_I16_PTR) {\n        sxth(ARMEmitter::Size::i32Bit, TMP2, Src1);\n      } else {\n        mov(ARMEmitter::Size::i32Bit, TMP2, Src1);\n      }\n\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP1);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillF80Result();\n    } break;\n\n    case FABI_F32_I16_F80_PTR: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): source\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetVReg(IROp->Args[0]);\n      mov(VTMP1.Q(), Src1.Q());\n\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP1);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillF32Result();\n    } break;\n\n    case FABI_F64_I16_F80_PTR: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): source\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetVReg(IROp->Args[0]);\n      mov(VTMP1.Q(), Src1.Q());\n\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP1);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillF64Result();\n    } break;\n\n    case FABI_F64_F64_PTR: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): vector source\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetVReg(IROp->Args[0]);\n      fmov(VTMP1.D(), Src1.D());\n\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP1);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillF64Result();\n    } break;\n    case FABI_F64x2_F64_PTR: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): vector source\n      // vtmp2 (v1/v16): vector source\n#ifdef VIXL_SIMULATOR\n      LOGMAN_THROW_A_FMT(CTX->Config.DisableVixlIndirectCalls, \"Vector register pairs unsupported by simulator currently\");\n#endif\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetVReg(IROp->Args[0]);\n      const auto DstLo = GetVReg(IROp->Args[1]);\n      const auto DstHi = GetVReg(IROp->Args[2]);\n\n      fmov(VTMP1.D(), Src1.D());\n\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP1);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillF64x2Result(DstLo, DstHi);\n    } break;\n\n    case FABI_F64_F64_F64_PTR: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): vector source 1\n      // vtmp2 (v1/v17): vector source 2\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetVReg(IROp->Args[0]);\n      const auto Src2 = GetVReg(IROp->Args[1]);\n\n      fmov(VTMP1.D(), Src1.D());\n      fmov(VTMP2.D(), Src2.D());\n\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP1);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillF64Result();\n    } break;\n\n    case FABI_I16_I16_F80_PTR: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): source\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetVReg(IROp->Args[0]);\n      mov(VTMP1.Q(), Src1.Q());\n\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP1);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillI16Result();\n    } break;\n\n    case FABI_I32_I16_F80_PTR: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): source\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetVReg(IROp->Args[0]);\n      mov(VTMP1.Q(), Src1.Q());\n\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP1);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillI32Result();\n    } break;\n\n    case FABI_I64_I16_F80_PTR: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): source\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetVReg(IROp->Args[0]);\n      mov(VTMP1.Q(), Src1.Q());\n\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP1);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillI64Result();\n    } break;\n\n    case FABI_I64_I16_F80_F80_PTR: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): vector source 1\n      // vtmp2 (v1/v17): vector source 2\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetVReg(IROp->Args[0]);\n      const auto Src2 = GetVReg(IROp->Args[1]);\n      mov(VTMP1.Q(), Src1.Q());\n      mov(VTMP2.Q(), Src2.Q());\n\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP1);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillI64Result();\n    } break;\n\n    case FABI_F80_I16_F80_PTR: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): vector source 1\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetVReg(IROp->Args[0]);\n      mov(VTMP1.Q(), Src1.Q());\n\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP1);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillF80Result();\n    } break;\n\n    case FABI_F80x2_I16_F80_PTR: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): vector source 1\n      // vtmp2 (v1/v16): vector source 2\n#ifdef VIXL_SIMULATOR\n      LOGMAN_THROW_A_FMT(CTX->Config.DisableVixlIndirectCalls, \"Vector register pairs unsupported by simulator currently\");\n#endif\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetVReg(IROp->Args[0]);\n      const auto DstLo = GetVReg(IROp->Args[1]);\n      const auto DstHi = GetVReg(IROp->Args[2]);\n\n      mov(VTMP1.Q(), Src1.Q());\n\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP1);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillF80x2Result(DstLo, DstHi);\n    } break;\n\n    case FABI_F80_I16_F80_F80_PTR: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): vector source 1\n      // vtmp2 (v1/v17): vector source 2\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetVReg(IROp->Args[0]);\n      const auto Src2 = GetVReg(IROp->Args[1]);\n\n      mov(VTMP1.Q(), Src1.Q());\n      mov(VTMP2.Q(), Src2.Q());\n\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP1);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillF80Result();\n    } break;\n\n    case FABI_I32_I64_I64_V128_V128_I16: {\n      // Linux Reg/Win32 Reg:\n      // stack: FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): vector source 1\n      // vtmp2 (v1/v17): vector source 2\n      // tmp1 (x0/x10): source 1\n      // tmp2 (x1/x11): source 2\n      // tmp3 (x2/x12): source 3\n      const auto Op = IROp->C<IR::IROp_VPCMPESTRX>();\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP1, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n\n      stp<ARMEmitter::IndexType::PRE>(TMP1, ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto SrcRAX = GetReg(Op->RAX);\n      const auto SrcRDX = GetReg(Op->RDX);\n      const auto Control = Op->Control;\n\n      mov(TMP1, SrcRAX.X());\n      mov(TMP2, SrcRDX.X());\n      movz(ARMEmitter::Size::i32Bit, TMP3, Control);\n\n      const auto Src1 = GetVReg(Op->LHS);\n      const auto Src2 = GetVReg(Op->RHS);\n\n      mov(VTMP1.Q(), Src1.Q());\n      mov(VTMP2.Q(), Src2.Q());\n\n      blr(TMP4);\n\n      ldp<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::zr, ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillI32Result();\n    } break;\n    case FABI_I32_V128_V128_I16: {\n      // Linux Reg/Win32 Reg:\n      // tmp4 (x4/x13): FallbackHandler\n      // x30: return\n      // vtmp1 (v0/v16): vector source 1\n      // vtmp2 (v1/v17): vector source 2\n      // tmp1 (x0/x10): source 1\n      const auto Op = IROp->C<IR::IROp_VPCMPISTRX>();\n      str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n\n      const auto Src1 = GetVReg(Op->LHS);\n      const auto Src2 = GetVReg(Op->RHS);\n      const auto Control = Op->Control;\n\n      mov(VTMP1.Q(), Src1.Q());\n      mov(VTMP2.Q(), Src2.Q());\n      movz(ARMEmitter::Size::i32Bit, TMP1, Control);\n\n      ldr(TMP2, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, ABIHandler));\n      ldr(TMP4, FALLBACK_HANDLER_OFFSET(Info.HandlerIndex, Func));\n      blr(TMP2);\n\n      ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n      FillI32Result();\n    } break;\n    case FABI_UNKNOWN:\n    default:\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n      LOGMAN_MSG_A_FMT(\"Unhandled IR Fallback ABI: {} {}\", FEXCore::IR::GetName(IROp->Op), ToUnderlying(Info.ABI));\n#endif\n      break;\n    }\n  }\n}\n\nstatic void DirectBlockDelinker(FEXCore::Context::ExitFunctionLinkData* Record, bool Call) {\n  uintptr_t JumpThunkStartAddress = reinterpret_cast<uintptr_t>(Record) - 0x10;\n  uintptr_t CallerAddress = JumpThunkStartAddress + Record->CallerOffset;\n  auto BranchOffset = JumpThunkStartAddress / 4 - CallerAddress / 4;\n\n  // Replace the patched callsite with a branch to the jump thunk.\n  uint32_t BranchInst = 0;\n  ARMEmitter::Emitter BranchEmit(reinterpret_cast<uint8_t*>(&BranchInst), 4);\n  if (Call) {\n    BranchEmit.bl(BranchOffset);\n  } else {\n    BranchEmit.b(BranchOffset);\n  }\n\n  std::atomic_ref<uint32_t>(*reinterpret_cast<uint32_t*>(CallerAddress)).store(BranchInst, std::memory_order::relaxed);\n  ARMEmitter::Emitter::ClearICache(reinterpret_cast<void*>(CallerAddress), 4);\n}\n\nstatic void IndirectBlockDelinker(FEXCore::Context::ExitFunctionLinkData* Record) {\n  uintptr_t JumpThunkStartAddress = reinterpret_cast<uintptr_t>(Record) - 0x10;\n  uint32_t BranchInst = 0;\n  ARMEmitter::Emitter BranchEmit(reinterpret_cast<uint8_t*>(&BranchInst), 4);\n  // Restore branch +2 instructions to jump to the linker block\n  BranchEmit.b(0x2);\n\n  std::atomic_ref<uint32_t>(*reinterpret_cast<uint32_t*>(JumpThunkStartAddress)).store(BranchInst, std::memory_order::relaxed);\n  ARMEmitter::Emitter::ClearICache(reinterpret_cast<void*>(JumpThunkStartAddress), 4);\n\n  // No need to reset HostCode here as the exit linker pointer is stored separately, and if the block is relinked it will be updated.\n}\n\nuint64_t Arm64JITCore::ExitFunctionLink(FEXCore::Core::CpuStateFrame* Frame, FEXCore::Context::ExitFunctionLinkData* Record) {\n  auto Thread = Frame->Thread;\n  bool TFSet = Thread->CurrentFrame->State.flags[X86State::RFLAG_TF_RAW_LOC];\n  uintptr_t HostCode {};\n  auto GuestRip = Record->GuestRIP;\n\n  if (TFSet) {\n    // If TF is set, the cache must be skipped as different code needs to be generated.\n    Frame->State.rip = GuestRip;\n    return Frame->Pointers.DispatcherLoopTop;\n  } else {\n    {\n      // Guard the LookupCache lock with the code invalidation mutex, to avoid issues with forking\n      auto lk_inval =\n        GuardSignalDeferringSection<std::shared_lock>(static_cast<Context::ContextImpl*>(Thread->CTX)->CodeInvalidationMutex, Thread);\n      HostCode = Thread->LookupCache->FindBlock(Thread, GuestRip);\n    }\n    if (!HostCode) {\n      // Hold a reference to the code buffer, to avoid linking unmapped code if compilation triggers a recreation.\n      auto CodeBuffer = static_cast<Arm64JITCore*>(Thread->CPUBackend.get())->CurrentCodeBuffer;\n      HostCode = static_cast<Context::ContextImpl*>(Thread->CTX)->CompileBlock(Frame, GuestRip, 0);\n      if (Thread->LookupCache->Shared != CodeBuffer->LookupCache.get()) {\n        return HostCode;\n      }\n    }\n  }\n\n  // See ExitFunction in BranchOps.cpp for an assembly level view of the handled cases.\n  uintptr_t JumpThunkStartAddress = reinterpret_cast<uintptr_t>(Record) - 0x10;\n  uintptr_t CallerAddress = JumpThunkStartAddress + Record->CallerOffset;\n  auto BranchOffset = HostCode / 4 - CallerAddress / 4;\n\n  uint32_t ExpectedKnownCallMarkerInst = 0;\n  ARMEmitter::Emitter ExpectedKnownCallMarkerEmit(reinterpret_cast<uint8_t*>(&ExpectedKnownCallMarkerInst), 4);\n  ExpectedKnownCallMarkerEmit.adr(TMP1, 0xC);\n\n  // Guard the LookupCache lock with the code invalidation mutex, to avoid issues with forking\n  auto lk_inval = GuardSignalDeferringSection<std::shared_lock>(static_cast<Context::ContextImpl*>(Thread->CTX)->CodeInvalidationMutex, Thread);\n\n  // Lock here is necessary to prevent simultaneous linking and delinking\n  auto lk = Thread->LookupCache->AcquireWriteLock();\n\n  // For non-calls, this would extend into the block's code, however that's fine as an out-of-range adr would never\n  // be generated avoiding any false positives.\n  uintptr_t KnownCallMarkerAddr = CallerAddress - 0x8;\n  uint32_t KnownCallMarkerInst = *reinterpret_cast<uint32_t*>(KnownCallMarkerAddr);\n  if (ARMEmitter::Emitter::IsInt26(BranchOffset)) {\n    // Directly patch the callsite with the appropriate branch instruction.\n    uint32_t BranchInst = 0;\n    ARMEmitter::Emitter BranchEmit(reinterpret_cast<uint8_t*>(&BranchInst), 4);\n\n    if (KnownCallMarkerInst == ExpectedKnownCallMarkerInst) {\n      BranchEmit.bl(BranchOffset);\n      Thread->LookupCache->AddBlockLink(\n        GuestRip, Record, [](FEXCore::Context::ExitFunctionLinkData* Record) { DirectBlockDelinker(Record, true); }, lk);\n    } else {\n      BranchEmit.b(BranchOffset);\n      Thread->LookupCache->AddBlockLink(\n        GuestRip, Record, [](FEXCore::Context::ExitFunctionLinkData* Record) { DirectBlockDelinker(Record, false); }, lk);\n    }\n\n    std::atomic_ref<uint32_t>(*reinterpret_cast<uint32_t*>(CallerAddress)).store(BranchInst, std::memory_order::relaxed);\n    ARMEmitter::Emitter::ClearICache(reinterpret_cast<void*>(CallerAddress), 4);\n  } else {\n    // This case is common between calls and jumps as the thunk callsite can be left untouched.\n    std::atomic_ref<uint64_t>(Record->HostCode).store(HostCode, std::memory_order::seq_cst);\n#ifdef ARCHITECTURE_arm64\n    // Make memory write visible to other threads reading the same location\n    asm volatile(\"dc cvau, %0; dsb ish\" : : \"r\"(Record->HostCode) :);\n#endif\n\n    uint32_t LdrInst = 0;\n    ARMEmitter::Emitter LdrEmit(reinterpret_cast<uint8_t*>(&LdrInst), 4);\n    LdrEmit.ldr(TMP1, reinterpret_cast<uint64_t>(&Record->HostCode) - JumpThunkStartAddress);\n    std::atomic_ref<uint32_t>(*reinterpret_cast<uint32_t*>(JumpThunkStartAddress)).store(LdrInst, std::memory_order::relaxed);\n    ARMEmitter::Emitter::ClearICache(reinterpret_cast<void*>(JumpThunkStartAddress), 4);\n\n    Thread->LookupCache->AddBlockLink(GuestRip, Record, IndirectBlockDelinker, lk);\n  }\n\n  return HostCode;\n}\n\nvoid Arm64JITCore::Op_NoOp(const IR::IROp_Header* IROp, IR::Ref Node) {}\n\nArm64JITCore::Arm64JITCore(FEXCore::Context::ContextImpl* ctx, FEXCore::Core::InternalThreadState* Thread)\n  : CPUBackend(*ctx, Thread)\n  , Arm64Emitter(ctx)\n  , HostSupportsSVE128 {ctx->HostFeatures.SupportsSVE128}\n  , HostSupportsSVE256 {ctx->HostFeatures.SupportsSVE256}\n  , HostSupportsAVX256 {ctx->HostFeatures.SupportsAVX && ctx->HostFeatures.SupportsSVE256}\n  , HostSupportsRPRES {ctx->HostFeatures.SupportsRPRES}\n  , HostSupportsAFP {ctx->HostFeatures.SupportsAFP}\n  , CTX {ctx}\n  , TempAllocator(ctx->CPUBackendAllocator, 0) {\n\n  RAPass = Thread->PassManager->GetPass<IR::RegisterAllocationPass>(\"RA\");\n\n  RAPass->AddRegisters(IR::RegClass::GPR, GeneralRegisters.size());\n  RAPass->AddRegisters(IR::RegClass::GPRFixed, StaticRegisters.size());\n  RAPass->AddRegisters(IR::RegClass::FPR, GeneralFPRegisters.size());\n  RAPass->AddRegisters(IR::RegClass::FPRFixed, StaticFPRegisters.size());\n  RAPass->PairRegs = PairRegisters;\n\n  {\n    // Set up pointers that the JIT needs to load\n\n    // Common\n    auto& Ptrs = ThreadState->CurrentFrame->Pointers;\n\n    Ptrs.PrintValue = reinterpret_cast<uint64_t>(PrintValue);\n    Ptrs.PrintVectorValue = reinterpret_cast<uint64_t>(PrintVectorValue);\n    Ptrs.ThreadRemoveCodeEntryFromJIT = reinterpret_cast<uintptr_t>(&Context::ContextImpl::ThreadRemoveCodeEntryFromJit);\n    Ptrs.MonoBackpatcherWrite = reinterpret_cast<uint64_t>(&Context::ContextImpl::MonoBackpatcherWrite);\n    Ptrs.CPUIDObj = reinterpret_cast<uint64_t>(&CTX->CPUID);\n\n    {\n      FEXCore::Utils::MemberFunctionToPointerCast PMF(&FEXCore::CPUIDEmu::RunFunction);\n      Ptrs.CPUIDFunction = PMF.GetConvertedPointer();\n    }\n\n    {\n      FEXCore::Utils::MemberFunctionToPointerCast PMF(&FEXCore::CPUIDEmu::RunXCRFunction);\n      Ptrs.XCRFunction = PMF.GetConvertedPointer();\n    }\n\n    {\n      FEXCore::Utils::MemberFunctionToPointerCast PMF(&FEXCore::HLE::SyscallHandler::HandleSyscall);\n      Ptrs.SyscallHandlerObj = reinterpret_cast<uint64_t>(CTX->SyscallHandler);\n      Ptrs.SyscallHandlerFunc = PMF.GetVTableEntry(CTX->SyscallHandler);\n    }\n    Ptrs.ExitFunctionLink = reinterpret_cast<uintptr_t>(&Arm64JITCore::ExitFunctionLink);\n    Ptrs.LUDIV = reinterpret_cast<uint64_t>(LUDIV);\n    Ptrs.LDIV = reinterpret_cast<uint64_t>(LDIV);\n  }\n\n  CurrentCodeBuffer = CodeBuffers.GetLatest();\n  ThreadState->LookupCache->Shared = CurrentCodeBuffer->LookupCache.get();\n}\n\nvoid Arm64JITCore::EmitDetectionString() {\n  const char JITString[] = \"FEXJIT::Arm64JITCore::\";\n  EmitString(JITString);\n  Align();\n}\n\nvoid Arm64JITCore::ClearCache() {\n  // NOTE: Holding on to the reference here is required to ensure validity of the WriteLock mutex\n  auto PrevCodeBuffer = CurrentCodeBuffer;\n  auto lk = PrevCodeBuffer->LookupCache->AcquireWriteLock();\n\n  auto CodeBuffer = GetEmptyCodeBuffer();\n  SetBuffer(CodeBuffer->Ptr, CodeBuffer->AllocatedSize);\n  EmitDetectionString();\n\n  ThreadState->LookupCache->ChangeGuestToHostMapping(*PrevCodeBuffer, *CurrentCodeBuffer->LookupCache, lk);\n}\n\nArm64JITCore::~Arm64JITCore() {}\n\nbool Arm64JITCore::IsInlineConstant(const IR::OrderedNodeWrapper& WNode, uint64_t* Value) const {\n  if (WNode.IsImmediate()) {\n    return false;\n  }\n\n  auto OpHeader = IR->GetOp<IR::IROp_Header>(WNode);\n\n  if (OpHeader->Op == IR::IROps::OP_INLINECONSTANT) {\n    auto Op = OpHeader->C<IR::IROp_InlineConstant>();\n    if (Value) {\n      *Value = Op->Constant;\n    }\n    return true;\n  } else {\n    return false;\n  }\n}\n\nbool Arm64JITCore::IsInlineEntrypointOffset(const IR::OrderedNodeWrapper& WNode, uint64_t* Value) const {\n  if (WNode.IsImmediate()) {\n    return false;\n  }\n\n  auto OpHeader = IR->GetOp<IR::IROp_Header>(WNode);\n\n  if (OpHeader->Op == IR::IROps::OP_INLINEENTRYPOINTOFFSET) {\n    auto Op = OpHeader->C<IR::IROp_InlineEntrypointOffset>();\n    if (Value) {\n      uint64_t Mask = ~0ULL;\n      const auto Size = OpHeader->Size;\n      if (Size == IR::OpSize::i32Bit) {\n        Mask = 0xFFFF'FFFFULL;\n      }\n      *Value = (Entry + Op->Offset) & Mask;\n    }\n    return true;\n  } else {\n    return false;\n  }\n}\n\nvoid Arm64JITCore::EmitTFCheck() {\n  ARMEmitter::ForwardLabel l_TFUnset;\n  ARMEmitter::ForwardLabel l_TFBlocked;\n\n  // Note that this needs to be before the below suspend checks, as X86 checks this flag immediately after executing an instruction.\n  ldrb(TMP1, STATE_PTR(CpuStateFrame, State.flags[X86State::RFLAG_TF_RAW_LOC]));\n\n  (void)cbz(ARMEmitter::Size::i32Bit, TMP1, &l_TFUnset);\n\n  // X86 semantically checks TF after executing each instruction, so e.g. setting a context with TF set will execute a single instruction\n  // and then raise an exception. However on the FEX side this is simpler to implement by checking at the start of each instruction, handle this by having bit 1 being unset in the flag state indicate that TF is blocked for a single instruction.\n  (void)tbz(TMP1, 1, &l_TFBlocked);\n\n  // Block TF for a single instruction when the frontend jumps to a new context by unsetting bit 1.\n  ldrb(TMP1, STATE_PTR(CpuStateFrame, State.flags[X86State::RFLAG_TF_RAW_LOC]));\n  and_(ARMEmitter::Size::i32Bit, TMP1, TMP1, ~(1 << 1));\n  strb(TMP1, STATE_PTR(CpuStateFrame, State.flags[X86State::RFLAG_TF_RAW_LOC]));\n\n  Core::CpuStateFrame::SynchronousFaultDataStruct State = {\n    .FaultToTopAndGeneratedException = 1,\n    .Signal = Core::FAULT_SIGTRAP,\n    .TrapNo = X86State::X86_TRAPNO_DB,\n    .si_code = 2,\n    .err_code = 0,\n  };\n\n  uint64_t Constant {};\n  memcpy(&Constant, &State, sizeof(State));\n\n  LoadConstant(ARMEmitter::Size::i64Bit, TMP1, Constant);\n  str(TMP1, STATE, offsetof(FEXCore::Core::CpuStateFrame, SynchronousFaultData));\n  ldr(TMP1, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.GuestSignal_SIGTRAP));\n  br(TMP1);\n\n  (void)Bind(&l_TFBlocked);\n  // If TF was blocked for this instruction, unblock it for the next.\n  LoadConstant(ARMEmitter::Size::i32Bit, TMP1, 0b11);\n  strb(TMP1, STATE_PTR(CpuStateFrame, State.flags[X86State::RFLAG_TF_RAW_LOC]));\n  (void)Bind(&l_TFUnset);\n}\n\nvoid Arm64JITCore::EmitSuspendInterruptCheck() {\n  if (CTX->Config.NeedsPendingInterruptFaultCheck) {\n    // Trigger a fault if there are any pending interrupts\n    // Used only for suspend on WIN32 at the moment\n    strb(ARMEmitter::XReg::zr, STATE,\n         offsetof(FEXCore::Core::InternalThreadState, InterruptFaultPage) - offsetof(FEXCore::Core::InternalThreadState, BaseFrameState));\n  }\n\n#ifdef ARCHITECTURE_arm64ec\n  static constexpr uint16_t SuspendMagic {0xCAFE};\n\n  ldr(TMP2.W(), STATE_PTR(CpuStateFrame, SuspendDoorbell));\n  ARMEmitter::ForwardLabel l_NoSuspend;\n  (void)cbz(ARMEmitter::Size::i32Bit, TMP2, &l_NoSuspend);\n  brk(SuspendMagic);\n  (void)Bind(&l_NoSuspend);\n#endif\n}\n\nvoid Arm64JITCore::EmitEntryPoint(ARMEmitter::BackwardLabel& HeaderLabel, bool CheckTF) {\n  // Get the address of the JITCodeHeader and store in to the core state.\n  // Two instruction cost, each 1 cycle.\n  adr_OrRestart(TMP1, &HeaderLabel);\n  str(TMP1, STATE, offsetof(FEXCore::Core::CPUState, InlineJITBlockHeader));\n\n  if (CheckTF) {\n    EmitTFCheck();\n  }\n\n  if (SpillSlots) {\n    const auto TotalSpillSlotsSize = SpillSlots * MaxSpillSlotSize;\n\n    if (ARMEmitter::IsImmAddSub(TotalSpillSlotsSize)) {\n      sub(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, ARMEmitter::Reg::rsp, TotalSpillSlotsSize);\n    } else {\n      LoadConstant(ARMEmitter::Size::i64Bit, TMP1, TotalSpillSlotsSize);\n      sub(ARMEmitter::Size::i64Bit, ARMEmitter::XReg::rsp, ARMEmitter::XReg::rsp, TMP1, ARMEmitter::ExtendedType::LSL_64, 0);\n    }\n  }\n\n  EmitSuspendInterruptCheck();\n}\n\nCPUBackend::CompiledCode Arm64JITCore::CompileCode(uint64_t Entry, uint64_t Size, bool SingleInst, const FEXCore::IR::IRListView* IR,\n                                                   FEXCore::Core::DebugData* DebugData, bool CheckTF) {\n  FEXCORE_PROFILE_SCOPED(\"Arm64::CompileCode\");\n\n  const auto PrevNumAllocations = Relocations.size();\n\n  this->Entry = Entry;\n  this->DebugData = DebugData;\n  this->IR = IR;\n  RequiresFarARM64Jumps = false;\n  SSANodeMultiplier = 24;\n\n  // Prepare restart via long jump in case branch encoding fails.\n  // This uses UncheckedLongJump since we don't implement std::longjmp in WoA setups\n  switch (static_cast<RestartOptions::Control>(FEXCore::UncheckedLongJump::SetJump(ThreadState->RestartJump))) {\n  case RestartOptions::Control::Incoming:\n    // Nothing\n    break;\n  case RestartOptions::Control::EnableFarARM64Jumps: RequiresFarARM64Jumps = true; break;\n  case RestartOptions::Control::NeedsLargerJITSpace:\n    // Get rid of the claimed buffer immediately, we can't fit in it at all.\n    TempAllocator.UnclaimBuffer();\n    SSANodeMultiplier *= 2;\n    break;\n  default: LOGMAN_MSG_A_FMT(\"Unhandled Arm64 restart condition!\");\n  }\n\n  uint32_t SSACount = IR->GetSSACount();\n  JumpTargets.clear();\n  CallReturnTargets.clear();\n  PendingJumpThunks.clear();\n  JumpTargets.resize(IR->GetHeader()->BlockCount, {});\n  Relocations.resize(PrevNumAllocations, FEXCore::CPU::Relocation::Default()); // Discard any relocations generated from a previous attempt\n\n  CodeData.EntryPoints.clear();\n\n  // Fairly excessive buffer range to make sure we don't overflow\n  // One page baseline, plus SSANodeMultipler bytes, plus another page for guard page.\n  const uint32_t DesiredBufferRange = AlignUp(FEXCore::Utils::FEX_PAGE_SIZE * 2 + SSACount * SSANodeMultiplier, FEXCore::Utils::FEX_PAGE_SIZE);\n\n  // JIT output is first written to a temporary buffer and later relocated to the CodeBuffer.\n  // This minimizes lock contention of CodeBufferWriteMutex.\n  auto TempCodeBufferInfo = TempAllocator.ReownOrClaimBufferWithSize(DesiredBufferRange);\n  auto TempCodeBuffer = TempCodeBufferInfo.Ptr;\n  const uint32_t UsableBufferRange = TempCodeBufferInfo.Size - FEXCore::Utils::FEX_PAGE_SIZE;\n\n  SetBuffer(TempCodeBuffer, UsableBufferRange);\n\n  ThreadState->JITGuardPage = reinterpret_cast<uintptr_t>(TempCodeBuffer) + UsableBufferRange;\n  ThreadState->JITGuardOverflowArgument = FEXCore::ToUnderlying(RestartOptions::Control::NeedsLargerJITSpace);\n\n  CodeData.BlockBegin = GetCursorAddress<uint8_t*>();\n\n  // Put the code header at the start of the data block.\n  ARMEmitter::BackwardLabel JITCodeHeaderLabel {};\n  (void)Bind(&JITCodeHeaderLabel);\n  JITCodeHeader* CodeHeader = GetCursorAddress<JITCodeHeader*>();\n  CursorIncrement(sizeof(JITCodeHeader));\n\n  auto CodeBegin = GetCursorAddress<uint8_t*>();\n\n  // AAPCS64\n  // r30      = LR\n  // r29      = FP\n  // r19..r28 = Callee saved\n  // r18      = Platform Register (Matters if we target Windows or iOS)\n  // r16..r17 = Inter-procedure scratch\n  //  r9..r15 = Temp\n  //  r8      = Indirect Result\n  //  r0...r7 = Parameter/Results\n  //\n  //  FPRS:\n  //  v8..v15 = (lower 64bits) Callee saved\n\n  // Our allocation:\n  // X0 = ThreadState\n  // X1 = MemBase\n  //\n  // X1-X3 = Temp\n  // X4-r18 = RA\n\n  SpillSlots = IR->SpillSlots();\n\n  PendingTargetLabel = nullptr;\n  PendingCallReturnTargetLabel = nullptr;\n\n  for (auto [BlockNode, BlockHeader] : IR->GetBlocks()) {\n    using namespace FEXCore::IR;\n    auto BlockIROp = BlockHeader->CW<FEXCore::IR::IROp_CodeBlock>();\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    LOGMAN_THROW_A_FMT(BlockIROp->Header.Op == IR::OP_CODEBLOCK, \"IR type failed to be a code block\");\n#endif\n\n    auto BlockStartHostCode = GetCursorAddress<uint8_t*>();\n    {\n      const auto Node = IR->GetID(BlockNode);\n      const auto Target = &JumpTargets[BlockIROp->ID];\n\n      // if there's a pending branch, and it is not fall-through\n      if (PendingTargetLabel && PendingTargetLabel != Target) {\n        if (PendingTargetLabel->Backward.Location) {\n          EmitSuspendInterruptCheck();\n        }\n        b_OrRestart(PendingTargetLabel);\n        PendingTargetLabel = nullptr;\n      }\n\n      if (BlockIROp->EntryPoint) {\n        uint64_t BlockStartRIP = Entry + BlockIROp->GuestEntryOffset;\n\n        const auto IsReturnTarget = CallReturnTargets.try_emplace(Node).first;\n        if (PendingTargetLabel) {\n          // If there is a fallthrough branch to this block, skip over the entrypoint code.\n          b_OrRestart(Target);\n        } else if (PendingCallReturnTargetLabel && PendingCallReturnTargetLabel != &IsReturnTarget->second) {\n          // If we just emitted a call, but the block we're now emitting is not the return block so don't fallthrough.\n          b_OrRestart(PendingCallReturnTargetLabel);\n        }\n        PendingCallReturnTargetLabel = nullptr;\n\n        BindOrRestart(&IsReturnTarget->second);\n        CodeData.EntryPoints.emplace(BlockStartRIP, GetCursorAddress<uint8_t*>());\n        DebugData->GuestOpcodes.push_back({BlockIROp->GuestEntryOffset, GetCursorAddress<uint8_t*>() - CodeData.BlockBegin});\n\n        EmitEntryPoint(JITCodeHeaderLabel, CheckTF);\n      }\n\n      if (PendingCallReturnTargetLabel) {\n        // If there is still a pending call return target, then the block we're emitting is not the return block so don't fallthrough.\n        b_OrRestart(PendingCallReturnTargetLabel);\n        PendingCallReturnTargetLabel = nullptr;\n      }\n      PendingTargetLabel = nullptr;\n\n      BindOrRestart(Target);\n    }\n\n    for (auto [CodeNode, IROp] : IR->GetCode(BlockNode)) {\n      switch (IROp->Op) {\n#define REGISTER_OP(op, x) \\\n  case FEXCore::IR::IROps::OP_##op: Op_##x(IROp, CodeNode); break\n\n#define IROP_DISPATCH_DISPATCH\n#include <FEXCore/IR/IRDefines_Dispatch.inc>\n#undef REGISTER_OP\n\n      default: Op_Unhandled(IROp, CodeNode); break;\n      }\n    }\n\n    DebugData->Subblocks.push_back({static_cast<uint32_t>(BlockStartHostCode - CodeData.BlockBegin),\n                                    static_cast<uint32_t>(GetCursorAddress<uint8_t*>() - BlockStartHostCode)});\n  }\n\n  // Make sure last branch is generated. It certainly can't be eliminated here.\n  if (PendingTargetLabel) {\n    if (PendingTargetLabel->Backward.Location) {\n      EmitSuspendInterruptCheck();\n    }\n    b_OrRestart(PendingTargetLabel);\n  }\n  PendingTargetLabel = nullptr;\n\n  ARMEmitter::ForwardLabel l_ExitLink;\n  for (auto& PendingJumpThunk : PendingJumpThunks) {\n    // Align as 64-bit atomics are used on the HostCode field.\n    Align(8);\n\n    ARMEmitter::ForwardLabel l_DoLink;\n    uint64_t ThunkAddress = GetCursorAddress<uint64_t>();\n    BindOrRestart(&PendingJumpThunk.Label);\n    b_OrRestart(&l_DoLink);\n    br(TMP1);\n    BindOrRestart(&l_DoLink);\n    ldr(TMP1, &l_ExitLink);\n    blr(TMP1);\n\n    // This is a ExitFunctionLinkData struct\n    BindOrRestart(&l_ExitLink);\n    dc64(0);                                                                   // HostCode\n    PlaceNamedSymbolLiteral(InsertGuestRIPLiteral(PendingJumpThunk.GuestRIP)); // GuestRIP\n    dc64(PendingJumpThunk.CallerAddress - ThunkAddress);                       // CallerOffset\n  }\n\n  BindOrRestart(&l_ExitLink);\n  PlaceNamedSymbolLiteral(InsertNamedSymbolLiteral(RelocNamedSymbolLiteral::NamedSymbol::SYMBOL_LITERAL_EXITFUNCTION_LINKER));\n\n  // CodeSize not including the header or tail data.\n  const uint64_t CodeOnlySize = GetCursorAddress<uint8_t*>() - CodeBegin;\n\n  // Add the JitCodeTail (written later)\n  Align(alignof(JITCodeTail));\n  const auto JITBlockTailLocation = GetCursorAddress<uint8_t*>();\n  CodeHeader->OffsetToBlockTail = JITBlockTailLocation - CodeData.BlockBegin;\n\n  JITCodeTail JITBlockTail {\n    .RIP = Entry,\n    .GuestSize = Size,\n    .SpinLockFutex = 0,\n    .SingleInst = SingleInst,\n  };\n\n  // Entries that live after the JITCodeTail.\n  // These entries correlate JIT code regions with guest RIP regions.\n  // Using these entries FEX is able to reconstruct the guest RIP accurately when an instruction cause a signal fault.\n  // Packed using two variable length integer entries to ensure the size isn't too large.\n  // These smaller sizes means that each entry is relative to each other instead of absolute offset from the start of the JIT block.\n  // When reconstructing the RIP, each entry must be walked linearly and accumulated with the previous entries.\n  // This is a trade-off between compression inside the JIT code space and execution time when reconstruction the RIP.\n  // RIP reconstruction when faulting is less likely so we are requiring the accumulation.\n  //\n  // struct {\n  //   // The Host PC offset from the previous entry.\n  //   FEXCore::Utils::vl64 HostPCOffset;\n  //   // How much to offset the RIP from the previous entry.\n  //   FEXCore::Utils::vl64 GuestRIPOffset;\n  // };\n\n  const auto JITRIPEntriesBegin = JITBlockTailLocation + sizeof(JITBlockTail);\n  auto JITRIPEntriesLocation = JITRIPEntriesBegin;\n\n  {\n    // Store the RIP entries.\n    JITBlockTail.NumberOfRIPEntries = DebugData->GuestOpcodes.size();\n    JITBlockTail.OffsetToRIPEntries = JITRIPEntriesBegin - JITBlockTailLocation;\n    uintptr_t CurrentRIPOffset = 0;\n    uint64_t CurrentPCOffset = 0;\n\n    for (size_t i = 0; i < DebugData->GuestOpcodes.size(); i++) {\n      const auto& GuestOpcode = DebugData->GuestOpcodes[i];\n      int64_t HostPCOffset = GuestOpcode.HostEntryOffset - CurrentPCOffset;\n      int64_t GuestRIPOffset = GuestOpcode.GuestEntryOffset - CurrentRIPOffset;\n\n      JITRIPEntriesLocation += FEXCore::Utils::vl64pair::Encode(JITRIPEntriesLocation, HostPCOffset, GuestRIPOffset);\n\n      CurrentPCOffset = GuestOpcode.HostEntryOffset;\n      CurrentRIPOffset = GuestOpcode.GuestEntryOffset;\n    }\n  }\n\n  SetCursorOffset(JITRIPEntriesLocation - CodeData.BlockBegin);\n  Align();\n\n  CodeData.Size = GetCursorAddress<uint8_t*>() - CodeData.BlockBegin;\n\n  // Finalize and write block tail data\n  JITBlockTail.Size = CodeData.Size;\n  {\n    auto PrevCur = GetCursorOffset();\n    memcpy(JITBlockTailLocation, &JITBlockTail, sizeof(JITBlockTail));\n    SetCursorOffset(JITBlockTailLocation - CodeData.BlockBegin + offsetof(JITCodeTail, RIP));\n    PlaceNamedSymbolLiteral(InsertGuestRIPLiteral(JITBlockTail.RIP));\n    SetCursorOffset(PrevCur);\n  }\n\n  // Migrate the compile output from temporary storage to the actual CodeBuffer.\n  // This can block progress in other compiling threads, so the duration of the lock should be as small as possible.\n  {\n    auto CodeBufferLock = std::unique_lock {CodeBuffers.CodeBufferWriteMutex};\n\n    // Query size of generated code\n    const auto TempSize = GetCursorOffset();\n\n    // Bring CodeBuffer up to date\n    {\n      LOGMAN_THROW_A_FMT(CurrentCodeBuffer->LookupCache.get() == ThreadState->LookupCache->Shared, \"INVARIANT VIOLATED: SharedLookupCache \"\n                                                                                                   \"doesn't match up!\\n\");\n      if (auto Prev = CheckCodeBufferUpdate()) {\n        Allocator::VirtualDontNeed(ThreadState->CallRetStackBase, FEXCore::Core::InternalThreadState::CALLRET_STACK_SIZE);\n        auto lk = ThreadState->LookupCache->AcquireWriteLock();\n        ThreadState->LookupCache->ChangeGuestToHostMapping(*Prev, *CurrentCodeBuffer->LookupCache, lk);\n      }\n\n      // NOTE: 16-byte alignment of the new cursor offset must be preserved for block linking records\n      SetBuffer(CurrentCodeBuffer->Ptr, CurrentCodeBuffer->AllocatedSize);\n      SetCursorOffset(CodeBuffers.LatestOffset);\n      Align16B();\n      if ((GetCursorOffset() + TempSize) > CurrentCodeBuffer->UsableSize()) {\n        CTX->ClearCodeCache(ThreadState);\n      }\n\n      CodeBuffers.LatestOffset = GetCursorOffset();\n    }\n\n    // Adjust host addresses\n    const auto Delta = GetCursorAddress<uint8_t*>() - CodeData.BlockBegin;\n    CodeData.BlockBegin += Delta;\n    for (auto& EntryPoint : CodeData.EntryPoints) {\n      EntryPoint.second += Delta;\n    }\n    CodeBegin += Delta;\n\n    for (std::size_t Idx = PrevNumAllocations; Idx != Relocations.size(); ++Idx) {\n      Relocations[Idx].Header.Offset += CodeBuffers.LatestOffset;\n    }\n\n    // Copy over CodeBuffer contents\n    memcpy(GetCursorAddress<uint8_t*>(), TempCodeBuffer, TempSize);\n    SetCursorOffset(CodeBuffers.LatestOffset + TempSize);\n\n    CodeBuffers.LatestOffset = GetCursorOffset();\n  }\n\n  TempAllocator.DelayedDisownBuffer();\n\n  ClearICache(CodeBegin, CodeOnlySize);\n\n#ifdef VIXL_DISASSEMBLER\n  if (Disassemble() & FEXCore::Config::Disassemble::STATS) {\n    auto HeaderOp = IR->GetHeader();\n    LOGMAN_THROW_A_FMT(HeaderOp->Header.Op == IR::OP_IRHEADER, \"First op wasn't IRHeader\");\n\n    LogMan::Msg::IFmt(\"RIP: 0x{:x}\", Entry);\n    LogMan::Msg::IFmt(\"Guest Code instructions: {}\", HeaderOp->NumHostInstructions);\n    LogMan::Msg::IFmt(\"Host Code instructions: {}\", CodeOnlySize >> 2);\n    LogMan::Msg::IFmt(\"Blow-up Amt: {}x\", double(CodeOnlySize >> 2) / double(HeaderOp->NumHostInstructions));\n  }\n\n  if (Disassemble() & FEXCore::Config::Disassemble::BLOCKS) {\n    const auto DisasmBegin = reinterpret_cast<const vixl::aarch64::Instruction*>(CodeBegin);\n    const auto DisasmEnd = reinterpret_cast<const vixl::aarch64::Instruction*>(CodeBegin + CodeOnlySize);\n    LogMan::Msg::IFmt(\"Disassemble Begin\");\n    for (auto PCToDecode = DisasmBegin; PCToDecode < DisasmEnd; PCToDecode += 4) {\n      DisasmDecoder->Decode(PCToDecode);\n      auto Output = Disasm->GetOutput();\n      LogMan::Msg::IFmt(\"{}\", Output);\n    }\n    LogMan::Msg::IFmt(\"Disassemble End\");\n  }\n#endif\n\n  DebugData->HostCodeSize = CodeData.Size;\n  DebugData->Relocations = &Relocations;\n\n  this->IR = nullptr;\n\n  return std::move(CodeData);\n}\n\nvoid Arm64JITCore::ResetStack() {\n  if (SpillSlots == 0) {\n    return;\n  }\n\n  const auto TotalSpillSlotsSize = SpillSlots * MaxSpillSlotSize;\n\n  if (ARMEmitter::IsImmAddSub(TotalSpillSlotsSize)) {\n    add(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, ARMEmitter::Reg::rsp, TotalSpillSlotsSize);\n  } else {\n    // Too big to fit in a 12bit immediate\n    LoadConstant(ARMEmitter::Size::i64Bit, TMP1, TotalSpillSlotsSize);\n    add(ARMEmitter::Size::i64Bit, ARMEmitter::XReg::rsp, ARMEmitter::XReg::rsp, TMP1, ARMEmitter::ExtendedType::LSL_64, 0);\n  }\n}\n\nfextl::unique_ptr<CPUBackend> CreateArm64JITCore(FEXCore::Context::ContextImpl* ctx, FEXCore::Core::InternalThreadState* Thread) {\n  return fextl::make_unique<Arm64JITCore>(ctx, Thread);\n}\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/JIT/JITClass.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: backend|arm64\n$end_info$\n*/\n\n#pragma once\n\n#include \"Interface/Core/ArchHelpers/Arm64Emitter.h\"\n#include \"Interface/Core/CPUBackend.h\"\n#include \"Interface/Core/Dispatcher/Dispatcher.h\"\n#include \"Interface/Core/JIT/Relocations.h\"\n#include \"Interface/IR/IR.h\"\n#include \"Interface/IR/IntrusiveIRList.h\"\n#include \"Interface/IR/RegisterAllocationData.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXCore/Utils/LongJump.h>\n\n#include <CodeEmitter/Emitter.h>\n\n#include <array>\n#include <cstdint>\n#include <functional>\n#include <optional>\n#include <utility>\n#include <variant>\n\nnamespace FEXCore::Core {\nstruct InternalThreadState;\n}\nnamespace FEXCore::Context {\nstruct ExitFunctionLinkData;\n}\nnamespace FEXCore::IR {\nclass RegisterAllocationPass;\n}\n\nnamespace FEXCore::CPU {\nclass Arm64JITCore final : public CPUBackend, public Arm64Emitter {\npublic:\n  explicit Arm64JITCore(FEXCore::Context::ContextImpl* ctx, FEXCore::Core::InternalThreadState* Thread);\n  ~Arm64JITCore() override;\n\n  [[nodiscard]]\n  CPUBackend::CompiledCode CompileCode(uint64_t Entry, uint64_t Size, bool SingleInst, const FEXCore::IR::IRListView* IR,\n                                       FEXCore::Core::DebugData* DebugData, bool CheckTF) override;\n\n  void ClearCache() override;\n\n  void ClearRelocations() override {\n    Relocations.clear();\n  }\n\nprivate:\n  const bool HostSupportsSVE128 {};\n  const bool HostSupportsSVE256 {};\n  const bool HostSupportsAVX256 {};\n  const bool HostSupportsRPRES {};\n  const bool HostSupportsAFP {};\n\n  struct RestartOptions {\n    enum class Control : uint64_t {\n      Incoming = 0,\n      EnableFarARM64Jumps = 1,\n      NeedsLargerJITSpace = 2,\n    };\n  };\n\n  // FEXCore makes assumptions in the JIT about certain conditions being true.\n  // In the rare case when those assumptions are broken, FEX needs to safely restart the JIT.\n  RestartOptions RestartControl {};\n  bool RequiresFarARM64Jumps {};\n  // Default to 6 instructions per SSA node.\n  uint32_t SSANodeMultiplier {24};\n\n  ARMEmitter::BiDirectionalLabel* PendingTargetLabel {};\n  ARMEmitter::BiDirectionalLabel* PendingCallReturnTargetLabel {};\n  FEXCore::Context::ContextImpl* CTX {};\n  const FEXCore::IR::IRListView* IR {};\n  uint64_t Entry {};\n  CPUBackend::CompiledCode CodeData {};\n\n  fextl::vector<ARMEmitter::BiDirectionalLabel> JumpTargets;\n\n  ARMEmitter::BiDirectionalLabel* JumpTarget(IR::OrderedNodeWrapper Node) {\n    auto Block = IR->GetOp<IR::IROp_CodeBlock>(Node);\n    return &JumpTargets[Block->ID];\n  }\n\n  fextl::map<IR::NodeID, ARMEmitter::BiDirectionalLabel> CallReturnTargets;\n\n  struct PendingJumpThunk {\n    uint64_t CallerAddress;\n    uint64_t GuestRIP;\n    ARMEmitter::ForwardLabel Label;\n  };\n  fextl::vector<PendingJumpThunk> PendingJumpThunks;\n\n  Utils::PoolBufferWithTimedRetirement<uint8_t*, 5000, 500> TempAllocator;\n\n  static uint64_t ExitFunctionLink(FEXCore::Core::CpuStateFrame* Frame, FEXCore::Context::ExitFunctionLinkData* Record);\n\n  [[nodiscard]]\n  ARMEmitter::Register GetReg(IR::PhysicalRegister Reg) const {\n    const auto RegClass = Reg.AsRegClass();\n\n    LOGMAN_THROW_A_FMT(RegClass == IR::RegClass::GPRFixed || RegClass == IR::RegClass::GPR, \"Unexpected Class: {}\", Reg.Class);\n\n    if (RegClass == IR::RegClass::GPRFixed) {\n      return StaticRegisters[Reg.Reg];\n    } else if (RegClass == IR::RegClass::GPR) {\n      return GeneralRegisters[Reg.Reg];\n    }\n\n    FEX_UNREACHABLE;\n  }\n\n  [[nodiscard]]\n  ARMEmitter::Register GetReg(IR::Ref Node) const {\n    return GetReg(IR::PhysicalRegister(Node));\n  }\n\n  [[nodiscard]]\n  ARMEmitter::Register GetReg(IR::OrderedNodeWrapper Wrap) const {\n    return GetReg(IR::PhysicalRegister(Wrap));\n  }\n\n  [[nodiscard]]\n  ARMEmitter::VRegister GetVReg(IR::PhysicalRegister Reg) const {\n    const auto RegClass = Reg.AsRegClass();\n\n    LOGMAN_THROW_A_FMT(RegClass == IR::RegClass::FPRFixed || RegClass == IR::RegClass::FPR, \"Unexpected Class: {}\", Reg.Class);\n\n    if (RegClass == IR::RegClass::FPRFixed) {\n      return StaticFPRegisters[Reg.Reg];\n    } else if (RegClass == IR::RegClass::FPR) {\n      return GeneralFPRegisters[Reg.Reg];\n    }\n\n    FEX_UNREACHABLE;\n  }\n\n  [[nodiscard]]\n  ARMEmitter::VRegister GetVReg(IR::Ref Node) const {\n    return GetVReg(IR::PhysicalRegister(Node));\n  }\n\n  [[nodiscard]]\n  ARMEmitter::VRegister GetVReg(IR::OrderedNodeWrapper Wrap) const {\n    return GetVReg(IR::PhysicalRegister(Wrap));\n  }\n\n  [[nodiscard]]\n  static IR::RegClass GetRegClass(IR::Ref Node) {\n    return IR::PhysicalRegister(Node).AsRegClass();\n  }\n\n  [[nodiscard]]\n  ARMEmitter::Register GetZeroableReg(IR::OrderedNodeWrapper Src) const {\n    uint64_t Const;\n    if (IsInlineConstant(Src, &Const)) {\n      LOGMAN_THROW_A_FMT(Const == 0, \"Only valid constant\");\n      return ARMEmitter::Reg::zr;\n    } else {\n      return GetReg(Src);\n    }\n  }\n\n  // Converts IR-base shift type to ARMEmitter shift type.\n  // Will be a no-op, only a type conversion since the two definitions match.\n  [[nodiscard]]\n  static ARMEmitter::ShiftType ConvertIRShiftType(IR::ShiftType Shift) {\n    return Shift == IR::ShiftType::LSL ? ARMEmitter::ShiftType::LSL :\n           Shift == IR::ShiftType::LSR ? ARMEmitter::ShiftType::LSR :\n           Shift == IR::ShiftType::ASR ? ARMEmitter::ShiftType::ASR :\n                                         ARMEmitter::ShiftType::ROR;\n  }\n\n  [[nodiscard]]\n  static ARMEmitter::Size ConvertSize(const IR::IROp_Header* Op) {\n    return Op->Size == IR::OpSize::i64Bit ? ARMEmitter::Size::i64Bit : ARMEmitter::Size::i32Bit;\n  }\n\n  [[nodiscard]]\n  static ARMEmitter::Size ConvertSize48(const IR::IROp_Header* Op) {\n    LOGMAN_THROW_A_FMT(Op->Size == IR::OpSize::i32Bit || Op->Size == IR::OpSize::i64Bit, \"Invalid size\");\n    return ConvertSize(Op);\n  }\n\n  [[nodiscard]]\n  static ARMEmitter::Size ConvertSize(IR::OpSize Size) {\n    return Size == IR::OpSize::i64Bit ? ARMEmitter::Size::i64Bit : ARMEmitter::Size::i32Bit;\n  }\n\n  [[nodiscard]]\n  static ARMEmitter::SubRegSize ConvertSubRegSize16(IR::OpSize ElementSize) {\n    LOGMAN_THROW_A_FMT(ElementSize == IR::OpSize::i8Bit || ElementSize == IR::OpSize::i16Bit || ElementSize == IR::OpSize::i32Bit ||\n                         ElementSize == IR::OpSize::i64Bit || ElementSize == IR::OpSize::i128Bit,\n                       \"Invalid size\");\n    return ElementSize == IR::OpSize::i8Bit  ? ARMEmitter::SubRegSize::i8Bit :\n           ElementSize == IR::OpSize::i16Bit ? ARMEmitter::SubRegSize::i16Bit :\n           ElementSize == IR::OpSize::i32Bit ? ARMEmitter::SubRegSize::i32Bit :\n           ElementSize == IR::OpSize::i64Bit ? ARMEmitter::SubRegSize::i64Bit :\n                                               ARMEmitter::SubRegSize::i128Bit;\n  }\n\n  [[nodiscard]]\n  static ARMEmitter::SubRegSize ConvertSubRegSize16(const IR::IROp_Header* Op) {\n    return ConvertSubRegSize16(Op->ElementSize);\n  }\n\n  [[nodiscard]]\n  static ARMEmitter::SubRegSize ConvertSubRegSize8(IR::OpSize ElementSize) {\n    LOGMAN_THROW_A_FMT(ElementSize != IR::OpSize::i128Bit, \"Invalid size\");\n    return ConvertSubRegSize16(ElementSize);\n  }\n\n  [[nodiscard]]\n  static ARMEmitter::SubRegSize ConvertSubRegSize8(const IR::IROp_Header* Op) {\n    return ConvertSubRegSize8(Op->ElementSize);\n  }\n\n  [[nodiscard]]\n  static ARMEmitter::SubRegSize ConvertSubRegSize4(const IR::IROp_Header* Op) {\n    LOGMAN_THROW_A_FMT(Op->ElementSize != IR::OpSize::i64Bit, \"Invalid size\");\n    return ConvertSubRegSize8(Op);\n  }\n\n  [[nodiscard]]\n  static ARMEmitter::SubRegSize ConvertSubRegSize248(const IR::IROp_Header* Op) {\n    LOGMAN_THROW_A_FMT(Op->ElementSize != IR::OpSize::i8Bit, \"Invalid size\");\n    return ConvertSubRegSize8(Op);\n  }\n\n  [[nodiscard]]\n  static ARMEmitter::VectorRegSizePair ConvertSubRegSizePair16(const IR::IROp_Header* Op) {\n    return ARMEmitter::ToVectorSizePair(ConvertSubRegSize16(Op));\n  }\n\n  [[nodiscard]]\n  static ARMEmitter::VectorRegSizePair ConvertSubRegSizePair8(const IR::IROp_Header* Op) {\n    LOGMAN_THROW_A_FMT(Op->ElementSize != IR::OpSize::i128Bit, \"Invalid size\");\n    return ConvertSubRegSizePair16(Op);\n  }\n\n  [[nodiscard]]\n  static ARMEmitter::VectorRegSizePair ConvertSubRegSizePair248(const IR::IROp_Header* Op) {\n    LOGMAN_THROW_A_FMT(Op->ElementSize != IR::OpSize::i8Bit, \"Invalid size\");\n    return ConvertSubRegSizePair8(Op);\n  }\n\n  [[nodiscard]]\n  static ARMEmitter::Condition MapCC(IR::CondClass Cond) {\n    switch (Cond) {\n    case IR::CondClass::EQ: return ARMEmitter::Condition::CC_EQ;\n    case IR::CondClass::NEQ: return ARMEmitter::Condition::CC_NE;\n    case IR::CondClass::SGE: return ARMEmitter::Condition::CC_GE;\n    case IR::CondClass::SLT: return ARMEmitter::Condition::CC_LT;\n    case IR::CondClass::SGT: return ARMEmitter::Condition::CC_GT;\n    case IR::CondClass::SLE: return ARMEmitter::Condition::CC_LE;\n    case IR::CondClass::UGE: return ARMEmitter::Condition::CC_CS;\n    case IR::CondClass::ULT: return ARMEmitter::Condition::CC_CC;\n    case IR::CondClass::UGT: return ARMEmitter::Condition::CC_HI;\n    case IR::CondClass::ULE: return ARMEmitter::Condition::CC_LS;\n    case IR::CondClass::FLU: return ARMEmitter::Condition::CC_LT;\n    case IR::CondClass::FGE: return ARMEmitter::Condition::CC_GE;\n    case IR::CondClass::FLEU: return ARMEmitter::Condition::CC_LE;\n    case IR::CondClass::FGT: return ARMEmitter::Condition::CC_GT;\n    case IR::CondClass::FU:\n    case IR::CondClass::VS: return ARMEmitter::Condition::CC_VS;\n    case IR::CondClass::FNU:\n    case IR::CondClass::VC: return ARMEmitter::Condition::CC_VC;\n    case IR::CondClass::MI: return ARMEmitter::Condition::CC_MI;\n    case IR::CondClass::PL: return ARMEmitter::Condition::CC_PL;\n    default: LOGMAN_MSG_A_FMT(\"Unsupported compare type\"); return ARMEmitter::Condition::CC_NV;\n    }\n  }\n\n  [[nodiscard]]\n  static bool IsFPR(IR::RegClass Class) {\n    return Class == IR::RegClass::FPR || Class == IR::RegClass::FPRFixed;\n  }\n\n  [[nodiscard]]\n  static bool IsGPR(IR::RegClass Class) {\n    return Class == IR::RegClass::GPR || Class == IR::RegClass::GPRFixed;\n  }\n\n  [[nodiscard]]\n  static bool IsGPR(IR::Ref Node) {\n    return IsGPR(GetRegClass(Node));\n  }\n\n  [[nodiscard]]\n  static bool IsFPR(IR::Ref Node) {\n    return IsFPR(GetRegClass(Node));\n  }\n\n  [[nodiscard]]\n  static bool IsGPR(IR::OrderedNodeWrapper Wrap) {\n    return IsGPR(IR::PhysicalRegister(Wrap).AsRegClass());\n  }\n\n  [[nodiscard]]\n  static bool IsFPR(IR::OrderedNodeWrapper Wrap) {\n    return IsFPR(IR::PhysicalRegister(Wrap).AsRegClass());\n  }\n\n  [[nodiscard]]\n  ARMEmitter::ExtendedMemOperand GenerateMemOperand(IR::OpSize AccessSize, ARMEmitter::Register Base, IR::OrderedNodeWrapper Offset,\n                                                    IR::MemOffsetType OffsetType, uint8_t OffsetScale);\n\n  [[nodiscard]]\n  ARMEmitter::Register ApplyMemOperand(IR::OpSize AccessSize, ARMEmitter::Register Base, ARMEmitter::Register Tmp,\n                                       IR::OrderedNodeWrapper Offset, IR::MemOffsetType OffsetType, uint8_t OffsetScale);\n\n  // NOTE: Will use TMP1 as a way to encode immediates that happen to fall outside\n  //       the limits of the scalar plus immediate variant of SVE load/stores.\n  //\n  //       TMP1 is safe to use again once this memory operand is used with its\n  //       equivalent loads or stores that this was called for.\n  [[nodiscard]]\n  ARMEmitter::SVEMemOperand GenerateSVEMemOperand(IR::OpSize AccessSize, ARMEmitter::Register Base, IR::OrderedNodeWrapper Offset,\n                                                  IR::MemOffsetType OffsetType, uint8_t OffsetScale);\n\n  [[nodiscard]]\n  bool IsInlineConstant(const IR::OrderedNodeWrapper& Node, uint64_t* Value = nullptr) const;\n  [[nodiscard]]\n  bool IsInlineEntrypointOffset(const IR::OrderedNodeWrapper& WNode, uint64_t* Value) const;\n\n  struct LiveRange {\n    uint32_t Begin;\n    uint32_t End;\n  };\n\n  void EmitLinkedBranch(uint64_t GuestRIP, bool Call) {\n    PendingJumpThunks.push_back({GetCursorAddress<uint64_t>(), GuestRIP, {}});\n    auto& Thunk = PendingJumpThunks.back();\n    BindOrRestart(&Thunk.Label);\n    if (Call) {\n      bl_OrRestart(&Thunk.Label);\n    } else {\n      b_OrRestart(&Thunk.Label);\n    }\n  }\n\n  // Restart helpers\n  template<ARMEmitter::IsLabel T>\n  void bl_OrRestart(T* Label) {\n    if (bl(Label) == ARMEmitter::BranchEncodeSucceeded::Success) {\n      return;\n    }\n\n    // We can support this but currently unnecessary.\n    ERROR_AND_DIE_FMT(\"Tried to branch larger than 128MB away!\");\n    FEXCore::UncheckedLongJump::LongJump(ThreadState->RestartJump, FEXCore::ToUnderlying(RestartOptions::Control::EnableFarARM64Jumps));\n  }\n\n  template<ARMEmitter::IsLabel T>\n  void b_OrRestart(T* Label) {\n    if (b(Label) == ARMEmitter::BranchEncodeSucceeded::Success) {\n      return;\n    }\n\n    // We can support this but currently unnecessary.\n    ERROR_AND_DIE_FMT(\"Tried to branch larger than 128MB away!\");\n    FEXCore::UncheckedLongJump::LongJump(ThreadState->RestartJump, FEXCore::ToUnderlying(RestartOptions::Control::EnableFarARM64Jumps));\n  }\n\n  template<ARMEmitter::IsLabel T>\n  void b_OrRestart(ARMEmitter::Condition Cond, T* Label) {\n    if (RequiresFarARM64Jumps) {\n      ARMEmitter::ForwardLabel Skip {};\n      // Wrap a manual Cond check around an unconditional branch; this can encode larger offsets\n      (void)b(InvertCondition(Cond), &Skip);\n      if (b(Label) == ARMEmitter::BranchEncodeSucceeded::Failure) {\n        ERROR_AND_DIE_FMT(\"Tried to branch larger than 128MB away!\");\n      }\n\n      (void)Bind(&Skip);\n      return;\n    }\n\n    if (b(Cond, Label) == ARMEmitter::BranchEncodeSucceeded::Success) {\n      return;\n    }\n\n    FEXCore::UncheckedLongJump::LongJump(ThreadState->RestartJump, FEXCore::ToUnderlying(RestartOptions::Control::EnableFarARM64Jumps));\n  }\n\n  template<ARMEmitter::IsLabel T>\n  void cbz_OrRestart(ARMEmitter::Size s, ARMEmitter::Register rt, T* Label) {\n    if (RequiresFarARM64Jumps) {\n      ARMEmitter::ForwardLabel Skip {};\n      // Wrap a manual Cond check around an unconditional branch; this can encode larger offsets\n      (void)cbnz(s, rt, &Skip);\n      if (b(Label) == ARMEmitter::BranchEncodeSucceeded::Failure) {\n        ERROR_AND_DIE_FMT(\"Tried to branch larger than 128MB away!\");\n      }\n\n      (void)Bind(&Skip);\n      return;\n    }\n\n    if (cbz(s, rt, Label) == ARMEmitter::BranchEncodeSucceeded::Success) {\n      return;\n    }\n\n    FEXCore::UncheckedLongJump::LongJump(ThreadState->RestartJump, FEXCore::ToUnderlying(RestartOptions::Control::EnableFarARM64Jumps));\n  }\n\n  template<ARMEmitter::IsLabel T>\n  void cbnz_OrRestart(ARMEmitter::Size s, ARMEmitter::Register rt, T* Label) {\n    if (RequiresFarARM64Jumps) {\n      ARMEmitter::ForwardLabel Skip {};\n      // Wrap a manual Cond check around an unconditional branch; this can encode larger offsets\n      (void)cbz(s, rt, &Skip);\n      if (b(Label) == ARMEmitter::BranchEncodeSucceeded::Failure) {\n        ERROR_AND_DIE_FMT(\"Tried to branch larger than 128MB away!\");\n      }\n\n      (void)Bind(&Skip);\n      return;\n    }\n\n    if (cbnz(s, rt, Label) == ARMEmitter::BranchEncodeSucceeded::Success) {\n      return;\n    }\n\n    FEXCore::UncheckedLongJump::LongJump(ThreadState->RestartJump, FEXCore::ToUnderlying(RestartOptions::Control::EnableFarARM64Jumps));\n  }\n\n  template<ARMEmitter::IsLabel T>\n  void tbz_OrRestart(ARMEmitter::Register rt, uint32_t Bit, T* Label) {\n    if (RequiresFarARM64Jumps) {\n      ARMEmitter::ForwardLabel Skip {};\n      // Wrap a manual Cond check around an unconditional branch; this can encode larger offsets\n      (void)tbnz(rt, Bit, &Skip);\n      if (b(Label) == ARMEmitter::BranchEncodeSucceeded::Failure) {\n        ERROR_AND_DIE_FMT(\"Tried to branch larger than 128MB away!\");\n      }\n\n      (void)Bind(&Skip);\n      return;\n    }\n\n    if (tbz(rt, Bit, Label) == ARMEmitter::BranchEncodeSucceeded::Success) {\n      return;\n    }\n\n    FEXCore::UncheckedLongJump::LongJump(ThreadState->RestartJump, FEXCore::ToUnderlying(RestartOptions::Control::EnableFarARM64Jumps));\n  }\n\n  template<ARMEmitter::IsLabel T>\n  void tbnz_OrRestart(ARMEmitter::Register rt, uint32_t Bit, T* Label) {\n    if (RequiresFarARM64Jumps) {\n      ARMEmitter::ForwardLabel Skip {};\n      // Wrap a manual Cond check around an unconditional branch; this can encode larger offsets\n      (void)tbz(rt, Bit, &Skip);\n      if (b(Label) == ARMEmitter::BranchEncodeSucceeded::Failure) {\n        ERROR_AND_DIE_FMT(\"Tried to branch larger than 128MB away!\");\n      }\n\n      (void)Bind(&Skip);\n      return;\n    }\n\n    if (tbnz(rt, Bit, Label) == ARMEmitter::BranchEncodeSucceeded::Success) {\n      return;\n    }\n\n    FEXCore::UncheckedLongJump::LongJump(ThreadState->RestartJump, FEXCore::ToUnderlying(RestartOptions::Control::EnableFarARM64Jumps));\n  }\n\n  template<ARMEmitter::IsLabel T>\n  void adr_OrRestart(ARMEmitter::Register rd, T* Label) {\n    if (RequiresFarARM64Jumps) {\n      if (LongAddressGen(rd, Label) == ARMEmitter::BranchEncodeSucceeded::Failure) {\n        ERROR_AND_DIE_FMT(\"Unable to encode long ADR.\");\n      }\n      return;\n    }\n    if (adr(rd, Label) == ARMEmitter::BranchEncodeSucceeded::Success) {\n      return;\n    }\n\n    FEXCore::UncheckedLongJump::LongJump(ThreadState->RestartJump, FEXCore::ToUnderlying(RestartOptions::Control::EnableFarARM64Jumps));\n  }\n\n  template<ARMEmitter::IsLabel T>\n  void adrp_OrRestart(ARMEmitter::Register rd, T* Label) {\n    if (RequiresFarARM64Jumps) {\n      if (LongAddressGen(rd, Label) == ARMEmitter::BranchEncodeSucceeded::Failure) {\n        ERROR_AND_DIE_FMT(\"Unable to encode long ADRP.\");\n      }\n      return;\n    }\n    if (adrp(rd, Label) == ARMEmitter::BranchEncodeSucceeded::Success) {\n      return;\n    }\n\n    FEXCore::UncheckedLongJump::LongJump(ThreadState->RestartJump, FEXCore::ToUnderlying(RestartOptions::Control::EnableFarARM64Jumps));\n  }\n\n  template<ARMEmitter::IsLabel T>\n  void BindOrRestart(T* Label) {\n    if (Bind(Label)) {\n      return;\n    }\n\n    if (RequiresFarARM64Jumps) {\n      // This should have been caught before this point.\n      ERROR_AND_DIE_FMT(\"Unhandled long bind\");\n      return;\n    }\n\n    FEXCore::UncheckedLongJump::LongJump(ThreadState->RestartJump, FEXCore::ToUnderlying(RestartOptions::Control::EnableFarARM64Jumps));\n  }\n\n  // This is purely a debugging aid for developers to see if they are in JIT code space when inspecting raw memory\n  void EmitDetectionString();\n  IR::RegisterAllocationPass* RAPass {};\n  FEXCore::Core::DebugData* DebugData {};\n\n  void ResetStack();\n  /**\n   * @name Relocations\n   * @{ */\n\n  /**\n   * @brief A literal pair relocation object for named symbol literals\n   */\n  struct NamedSymbolLiteralPair {\n    ARMEmitter::ForwardLabel Loc;\n    uint64_t Lit;\n    Relocation MoveABI {};\n  };\n\n  /**\n   * @brief Inserts a thunk relocation\n   *\n   * @param Reg - The GPR to move the thunk handler in to\n   * @param Sum - The hash of the thunk\n   */\n  void InsertNamedThunkRelocation(ARMEmitter::Register Reg, const IR::SHA256Sum& Sum);\n\n  /**\n   * @brief Inserts a guest GPR move relocation\n   *\n   * @param Reg - The GPR to move the guest RIP in to\n   * @param Constant - The guest RIP that will be relocated\n   */\n  void InsertGuestRIPMove(ARMEmitter::Register Reg, uint64_t Constant);\n\n  /**\n   * @brief Inserts a named symbol as a literal in memory\n   *\n   * Need to use `PlaceNamedSymbolLiteral` with the return value to place the literal in the desired location\n   *\n   * @param Op The named symbol to place\n   *\n   * @return A temporary `NamedSymbolLiteralPair`\n   */\n  NamedSymbolLiteralPair InsertNamedSymbolLiteral(FEXCore::CPU::RelocNamedSymbolLiteral::NamedSymbol Op);\n\n  /**\n   * @brief Inserts a relocation for a constant value relative to the guest entrypoint\n   *\n   * @param Reg - The GPR to move the guest RIP in to\n   * @param Constant - The guest RIP that will be relocated\n   */\n  NamedSymbolLiteralPair InsertGuestRIPLiteral(uint64_t GuestRIP);\n\n  /**\n   * @brief Place the named symbol literal relocation in memory\n   *\n   * @param Lit - Which literal to place\n   */\n  void PlaceNamedSymbolLiteral(NamedSymbolLiteralPair Lit);\n\n  fextl::vector<FEXCore::CPU::Relocation> Relocations;\n\n  /**\n   * Returns any relocations generated since the last call to TakeRelocations.\n   *\n   * GuestBaseAddress must match the base virtual address to which the\n   * input x86 binary is mapped.\n   */\n  fextl::vector<FEXCore::CPU::Relocation> TakeRelocations(uint64_t GuestBaseAddress) override;\n\n  /**  @} */\n\n  uint32_t SpillSlots {};\n  using OpType = void (Arm64JITCore::*)(const IR::IROp_Header* IROp, IR::Ref Node);\n\n  using ScalarFMAOpCaller =\n    std::function<void(ARMEmitter::VRegister Dst, ARMEmitter::VRegister Src1, ARMEmitter::VRegister Src2, ARMEmitter::VRegister Src3)>;\n  void VFScalarFMAOperation(IR::OpSize OpSize, IR::OpSize ElementSize, ScalarFMAOpCaller ScalarEmit, ARMEmitter::VRegister Dst,\n                            ARMEmitter::VRegister Upper, ARMEmitter::VRegister Vector1, ARMEmitter::VRegister Vector2,\n                            ARMEmitter::VRegister Addend);\n  using ScalarBinaryOpCaller = std::function<void(ARMEmitter::VRegister Dst, ARMEmitter::VRegister Src1, ARMEmitter::VRegister Src2)>;\n  void VFScalarOperation(IR::OpSize OpSize, IR::OpSize ElementSize, bool ZeroUpperBits, ScalarBinaryOpCaller ScalarEmit,\n                         ARMEmitter::VRegister Dst, ARMEmitter::VRegister Vector1, ARMEmitter::VRegister Vector2);\n  using ScalarUnaryOpCaller = std::function<void(ARMEmitter::VRegister Dst, std::variant<ARMEmitter::VRegister, ARMEmitter::Register> SrcVar)>;\n  void VFScalarUnaryOperation(IR::OpSize OpSize, IR::OpSize ElementSize, bool ZeroUpperBits, ScalarUnaryOpCaller ScalarEmit,\n                              ARMEmitter::VRegister Dst, ARMEmitter::VRegister Vector1,\n                              std::variant<ARMEmitter::VRegister, ARMEmitter::Register> Vector2);\n\n  void Emulate128BitGather(IR::OpSize Size, IR::OpSize ElementSize, ARMEmitter::VRegister Dst, ARMEmitter::VRegister IncomingDst,\n                           std::optional<ARMEmitter::Register> BaseAddr, ARMEmitter::VRegister VectorIndexLow,\n                           std::optional<ARMEmitter::VRegister> VectorIndexHigh, ARMEmitter::VRegister MaskReg, IR::OpSize VectorIndexSize,\n                           size_t DataElementOffsetStart, size_t IndexElementOffsetStart, uint8_t OffsetScale, IR::OpSize AddrSize);\n\n  void EmitTFCheck();\n\n  void EmitSuspendInterruptCheck();\n\n  void EmitEntryPoint(ARMEmitter::BackwardLabel& HeaderLabel, bool CheckTF);\n\n#define DEF_OP(x) void Op_##x(IR::IROp_Header const* IROp, IR::Ref Node)\n\n  ///< Unhandled handler\n  DEF_OP(Unhandled);\n\n  ///< No-op Handler\n  DEF_OP(NoOp);\n\n#define IROP_DISPATCH_DEFS\n#include <FEXCore/IR/IRDefines_Dispatch.inc>\n#undef DEF_OP\n};\n\n#define DEF_OP(x) void Arm64JITCore::Op_##x(IR::IROp_Header const* IROp, IR::Ref Node)\n\n[[nodiscard]]\nfextl::unique_ptr<CPUBackend> CreateArm64JITCore(FEXCore::Context::ContextImpl* ctx, FEXCore::Core::InternalThreadState* Thread);\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/JIT/MemoryOps.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: backend|arm64\n$end_info$\n*/\n\n#include \"FEXCore/Core/X86Enums.h\"\n#include \"FEXCore/Utils/LogManager.h\"\n#include \"Interface/Context/Context.h\"\n#include \"Interface/Core/ArchHelpers/Arm64Emitter.h\"\n#include \"Interface/Core/CPUID.h\"\n#include \"Interface/Core/JIT/JITClass.h\"\n#include \"Interface/IR/RegisterAllocationData.h\"\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/MathUtils.h>\n\nnamespace FEXCore::CPU {\n\nDEF_OP(LoadContext) {\n  const auto Op = IROp->C<IR::IROp_LoadContext>();\n  const auto OpSize = IROp->Size;\n\n  if (Op->Class == IR::RegClass::GPR) {\n    auto Dst = GetReg(Node);\n\n    switch (OpSize) {\n    case IR::OpSize::i8Bit: ldrb(Dst, STATE, Op->Offset); break;\n    case IR::OpSize::i16Bit: ldrh(Dst, STATE, Op->Offset); break;\n    case IR::OpSize::i32Bit: ldr(Dst.W(), STATE, Op->Offset); break;\n    case IR::OpSize::i64Bit: ldr(Dst.X(), STATE, Op->Offset); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled LoadContext size: {}\", OpSize); break;\n    }\n  } else {\n    auto Dst = GetVReg(Node);\n\n    switch (OpSize) {\n    case IR::OpSize::i8Bit: ldrb(Dst, STATE, Op->Offset); break;\n    case IR::OpSize::i16Bit: ldrh(Dst, STATE, Op->Offset); break;\n    case IR::OpSize::i32Bit: ldr(Dst.S(), STATE, Op->Offset); break;\n    case IR::OpSize::i64Bit: ldr(Dst.D(), STATE, Op->Offset); break;\n    case IR::OpSize::i128Bit: ldr(Dst.Q(), STATE, Op->Offset); break;\n    case IR::OpSize::i256Bit:\n      mov(TMP1, Op->Offset);\n      ld1b<ARMEmitter::SubRegSize::i8Bit>(Dst.Z(), PRED_TMP_32B.Zeroing(), STATE, TMP1);\n      break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled LoadContext size: {}\", OpSize); break;\n    }\n  }\n}\n\nDEF_OP(LoadContextPair) {\n  const auto Op = IROp->C<IR::IROp_LoadContextPair>();\n\n  if (Op->Class == IR::RegClass::GPR) {\n    const auto Dst1 = GetReg(Op->OutValue1);\n    const auto Dst2 = GetReg(Op->OutValue2);\n\n    switch (IROp->Size) {\n    case IR::OpSize::i32Bit: ldp<ARMEmitter::IndexType::OFFSET>(Dst1.W(), Dst2.W(), STATE, Op->Offset); break;\n    case IR::OpSize::i64Bit: ldp<ARMEmitter::IndexType::OFFSET>(Dst1.X(), Dst2.X(), STATE, Op->Offset); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled LoadMemPair size: {}\", IROp->Size); break;\n    }\n  } else {\n    const auto Dst1 = GetVReg(Op->OutValue1);\n    const auto Dst2 = GetVReg(Op->OutValue2);\n\n    switch (IROp->Size) {\n    case IR::OpSize::i32Bit: ldp<ARMEmitter::IndexType::OFFSET>(Dst1.S(), Dst2.S(), STATE, Op->Offset); break;\n    case IR::OpSize::i64Bit: ldp<ARMEmitter::IndexType::OFFSET>(Dst1.D(), Dst2.D(), STATE, Op->Offset); break;\n    case IR::OpSize::i128Bit: ldp<ARMEmitter::IndexType::OFFSET>(Dst1.Q(), Dst2.Q(), STATE, Op->Offset); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled LoadMemPair size: {}\", IROp->Size); break;\n    }\n  }\n}\n\nDEF_OP(StoreContext) {\n  const auto Op = IROp->C<IR::IROp_StoreContext>();\n  const auto OpSize = IROp->Size;\n\n  if (Op->Class == IR::RegClass::GPR) {\n    auto Src = GetZeroableReg(Op->Value);\n\n    switch (OpSize) {\n    case IR::OpSize::i8Bit: strb(Src, STATE, Op->Offset); break;\n    case IR::OpSize::i16Bit: strh(Src, STATE, Op->Offset); break;\n    case IR::OpSize::i32Bit: str(Src.W(), STATE, Op->Offset); break;\n    case IR::OpSize::i64Bit: str(Src.X(), STATE, Op->Offset); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled StoreContext size: {}\", OpSize); break;\n    }\n  } else {\n    const auto Src = GetVReg(Op->Value);\n\n    switch (OpSize) {\n    case IR::OpSize::i8Bit: strb(Src, STATE, Op->Offset); break;\n    case IR::OpSize::i16Bit: strh(Src, STATE, Op->Offset); break;\n    case IR::OpSize::i32Bit: str(Src.S(), STATE, Op->Offset); break;\n    case IR::OpSize::i64Bit: str(Src.D(), STATE, Op->Offset); break;\n    case IR::OpSize::i128Bit: str(Src.Q(), STATE, Op->Offset); break;\n    case IR::OpSize::i256Bit:\n      mov(TMP1, Op->Offset);\n      st1b<ARMEmitter::SubRegSize::i8Bit>(Src.Z(), PRED_TMP_32B, STATE, TMP1);\n      break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled StoreContext size: {}\", OpSize); break;\n    }\n  }\n}\n\nDEF_OP(StoreContextPair) {\n  const auto Op = IROp->C<IR::IROp_StoreContextPair>();\n  const auto OpSize = IROp->Size;\n\n  if (Op->Class == IR::RegClass::GPR) {\n    auto Src1 = GetZeroableReg(Op->Value1);\n    auto Src2 = GetZeroableReg(Op->Value2);\n\n    switch (OpSize) {\n    case IR::OpSize::i32Bit: stp<ARMEmitter::IndexType::OFFSET>(Src1.W(), Src2.W(), STATE, Op->Offset); break;\n    case IR::OpSize::i64Bit: stp<ARMEmitter::IndexType::OFFSET>(Src1.X(), Src2.X(), STATE, Op->Offset); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled StoreContext size: {}\", OpSize); break;\n    }\n  } else {\n    const auto Src1 = GetVReg(Op->Value1);\n    const auto Src2 = GetVReg(Op->Value2);\n\n    switch (OpSize) {\n    case IR::OpSize::i32Bit: stp<ARMEmitter::IndexType::OFFSET>(Src1.S(), Src2.S(), STATE, Op->Offset); break;\n    case IR::OpSize::i64Bit: stp<ARMEmitter::IndexType::OFFSET>(Src1.D(), Src2.D(), STATE, Op->Offset); break;\n    case IR::OpSize::i128Bit: stp<ARMEmitter::IndexType::OFFSET>(Src1.Q(), Src2.Q(), STATE, Op->Offset); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled StoreContextPair size: {}\", OpSize); break;\n    }\n  }\n}\n\nDEF_OP(LoadRegister) {\n  const auto Op = IROp->C<IR::IROp_LoadRegister>();\n\n  if (Op->Class == IR::RegClass::GPR) {\n    LOGMAN_THROW_A_FMT(Op->Reg < StaticRegisters.size(), \"out of range reg\");\n\n    mov(GetReg(Node).X(), StaticRegisters[Op->Reg].X());\n  } else if (Op->Class == IR::RegClass::FPR) {\n    const auto regSize = HostSupportsAVX256 ? IR::OpSize::i256Bit : IR::OpSize::i128Bit;\n    LOGMAN_THROW_A_FMT(Op->Reg < StaticFPRegisters.size(), \"out of range reg\");\n    LOGMAN_THROW_A_FMT(IROp->Size == regSize, \"expected sized\");\n\n    const auto guest = StaticFPRegisters[Op->Reg];\n    const auto host = GetVReg(Node);\n\n    if (HostSupportsAVX256) {\n      mov(ARMEmitter::SubRegSize::i64Bit, host.Z(), PRED_TMP_32B.Merging(), guest.Z());\n    } else {\n      mov(host.Q(), guest.Q());\n    }\n  } else {\n    LOGMAN_THROW_A_FMT(false, \"Unhandled Op->Class {}\", Op->Class);\n  }\n}\n\nDEF_OP(LoadPF) {\n  const auto reg = StaticRegisters[StaticRegisters.size() - 2];\n\n  if (GetReg(Node).Idx() != reg.Idx()) {\n    mov(GetReg(Node).X(), reg.X());\n  }\n}\n\nDEF_OP(LoadAF) {\n  const auto reg = StaticRegisters[StaticRegisters.size() - 1];\n\n  if (GetReg(Node).Idx() != reg.Idx()) {\n    mov(GetReg(Node).X(), reg.X());\n  }\n}\n\nDEF_OP(StoreRegister) {\n  const auto Op = IROp->C<IR::IROp_StoreRegister>();\n  const auto Reg = IR::PhysicalRegister(Node);\n  const auto RegClass = Reg.AsRegClass();\n\n  if (RegClass == IR::RegClass::GPRFixed) {\n    // Always use 64-bit, it's faster. Upper bits ignored for 32-bit mode.\n    mov(ARMEmitter::Size::i64Bit, GetReg(Reg), GetReg(Op->Value));\n  } else if (RegClass == IR::RegClass::FPRFixed) {\n    const auto regSize = HostSupportsAVX256 ? IR::OpSize::i256Bit : IR::OpSize::i128Bit;\n    LOGMAN_THROW_A_FMT(IROp->Size == regSize, \"expected sized\");\n\n    const auto guest = GetVReg(Reg);\n    const auto host = GetVReg(Op->Value);\n\n    if (HostSupportsAVX256) {\n      mov(ARMEmitter::SubRegSize::i64Bit, guest.Z(), PRED_TMP_32B.Merging(), host.Z());\n    } else {\n      mov(guest.Q(), host.Q());\n    }\n  } else {\n    LOGMAN_THROW_A_FMT(false, \"Unhandled Op->Class {}\", RegClass);\n  }\n}\n\nDEF_OP(StorePF) {\n  const auto Op = IROp->C<IR::IROp_StorePF>();\n  const auto reg = StaticRegisters[StaticRegisters.size() - 2];\n  const auto Src = GetReg(Op->Value);\n\n  if (Src.Idx() != reg.Idx()) {\n    // Always use 64-bit, it's faster. Upper bits ignored for 32-bit mode.\n    mov(ARMEmitter::Size::i64Bit, reg, Src);\n  }\n}\n\nDEF_OP(StoreAF) {\n  const auto Op = IROp->C<IR::IROp_StoreAF>();\n  const auto reg = StaticRegisters[StaticRegisters.size() - 1];\n  const auto Src = GetReg(Op->Value);\n\n  if (Src.Idx() != reg.Idx()) {\n    // Always use 64-bit, it's faster. Upper bits ignored for 32-bit mode.\n    mov(ARMEmitter::Size::i64Bit, reg, Src);\n  }\n}\n\nDEF_OP(LoadContextIndexed) {\n  const auto Op = IROp->C<IR::IROp_LoadContextIndexed>();\n  const auto OpSize = IROp->Size;\n\n  const auto Index = GetReg(Op->Index);\n\n  if (Op->Class == IR::RegClass::GPR) {\n    switch (Op->Stride) {\n    case 1:\n    case 2:\n    case 4:\n    case 8: {\n      add(ARMEmitter::Size::i64Bit, TMP1, STATE, Index, ARMEmitter::ShiftType::LSL, FEXCore::ilog2(Op->Stride));\n      const auto Dst = GetReg(Node);\n      switch (OpSize) {\n      case IR::OpSize::i8Bit: ldrb(Dst, TMP1, Op->BaseOffset); break;\n      case IR::OpSize::i16Bit: ldrh(Dst, TMP1, Op->BaseOffset); break;\n      case IR::OpSize::i32Bit: ldr(Dst.W(), TMP1, Op->BaseOffset); break;\n      case IR::OpSize::i64Bit: ldr(Dst.X(), TMP1, Op->BaseOffset); break;\n      default: LOGMAN_MSG_A_FMT(\"Unhandled LoadContextIndexed size: {}\", OpSize); break;\n      }\n      break;\n    }\n    case 16: LOGMAN_MSG_A_FMT(\"Invalid Class load of size 16\"); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled LoadContextIndexed stride: {}\", Op->Stride); break;\n    }\n  } else {\n    switch (Op->Stride) {\n    case 1:\n    case 2:\n    case 4:\n    case 8:\n    case 16:\n    case 32: {\n      add(ARMEmitter::Size::i64Bit, TMP1, STATE, Index, ARMEmitter::ShiftType::LSL, FEXCore::ilog2(Op->Stride));\n      const auto Dst = GetVReg(Node);\n\n      switch (OpSize) {\n      case IR::OpSize::i8Bit: ldrb(Dst, TMP1, Op->BaseOffset); break;\n      case IR::OpSize::i16Bit: ldrh(Dst, TMP1, Op->BaseOffset); break;\n      case IR::OpSize::i32Bit: ldr(Dst.S(), TMP1, Op->BaseOffset); break;\n      case IR::OpSize::i64Bit: ldr(Dst.D(), TMP1, Op->BaseOffset); break;\n      case IR::OpSize::i128Bit:\n        if (Op->BaseOffset % 16 == 0) {\n          ldr(Dst.Q(), TMP1, Op->BaseOffset);\n        } else {\n          add(ARMEmitter::Size::i64Bit, TMP1, TMP1, Op->BaseOffset);\n          ldur(Dst.Q(), TMP1, Op->BaseOffset);\n        }\n        break;\n      case IR::OpSize::i256Bit:\n        mov(TMP2, Op->BaseOffset);\n        ld1b<ARMEmitter::SubRegSize::i8Bit>(Dst.Z(), PRED_TMP_32B.Zeroing(), TMP1, TMP2);\n        break;\n      default: LOGMAN_MSG_A_FMT(\"Unhandled LoadContextIndexed size: {}\", OpSize); break;\n      }\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unhandled LoadContextIndexed stride: {}\", Op->Stride); break;\n    }\n  }\n}\n\nDEF_OP(StoreContextIndexed) {\n  const auto Op = IROp->C<IR::IROp_StoreContextIndexed>();\n  const auto OpSize = IROp->Size;\n\n  const auto Index = GetReg(Op->Index);\n\n  if (Op->Class == IR::RegClass::GPR) {\n    const auto Value = GetReg(Op->Value);\n\n    switch (Op->Stride) {\n    case 1:\n    case 2:\n    case 4:\n    case 8: {\n      add(ARMEmitter::Size::i64Bit, TMP1, STATE, Index, ARMEmitter::ShiftType::LSL, FEXCore::ilog2(Op->Stride));\n\n      switch (OpSize) {\n      case IR::OpSize::i8Bit: strb(Value, TMP1, Op->BaseOffset); break;\n      case IR::OpSize::i16Bit: strh(Value, TMP1, Op->BaseOffset); break;\n      case IR::OpSize::i32Bit: str(Value.W(), TMP1, Op->BaseOffset); break;\n      case IR::OpSize::i64Bit: str(Value.X(), TMP1, Op->BaseOffset); break;\n      default: LOGMAN_MSG_A_FMT(\"Unhandled StoreContextIndexed size: {}\", OpSize); break;\n      }\n      break;\n    }\n    case 16: LOGMAN_MSG_A_FMT(\"Invalid Class store of size 16\"); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled StoreContextIndexed stride: {}\", Op->Stride); break;\n    }\n  } else {\n    const auto Value = GetVReg(Op->Value);\n\n    switch (Op->Stride) {\n    case 1:\n    case 2:\n    case 4:\n    case 8:\n    case 16:\n    case 32: {\n      add(ARMEmitter::Size::i64Bit, TMP1, STATE, Index, ARMEmitter::ShiftType::LSL, FEXCore::ilog2(Op->Stride));\n\n      switch (OpSize) {\n      case IR::OpSize::i8Bit: strb(Value, TMP1, Op->BaseOffset); break;\n      case IR::OpSize::i16Bit: strh(Value, TMP1, Op->BaseOffset); break;\n      case IR::OpSize::i32Bit: str(Value.S(), TMP1, Op->BaseOffset); break;\n      case IR::OpSize::i64Bit: str(Value.D(), TMP1, Op->BaseOffset); break;\n      case IR::OpSize::i128Bit:\n        if (Op->BaseOffset % 16 == 0) {\n          str(Value.Q(), TMP1, Op->BaseOffset);\n        } else {\n          add(ARMEmitter::Size::i64Bit, TMP1, TMP1, Op->BaseOffset);\n          stur(Value.Q(), TMP1, Op->BaseOffset);\n        }\n        break;\n      case IR::OpSize::i256Bit:\n        mov(TMP2, Op->BaseOffset);\n        st1b<ARMEmitter::SubRegSize::i8Bit>(Value.Z(), PRED_TMP_32B, TMP1, TMP2);\n        break;\n      default: LOGMAN_MSG_A_FMT(\"Unhandled StoreContextIndexed size: {}\", OpSize); break;\n      }\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unhandled StoreContextIndexed stride: {}\", Op->Stride); break;\n    }\n  }\n}\n\nDEF_OP(FormContextAddress) {\n  const auto Op = IROp->C<IR::IROp_FormContextAddress>();\n  const auto Index = GetReg(Op->Index);\n  const auto Dst = GetReg(Node);\n\n  switch (Op->Stride) {\n  case 1:\n  case 2:\n  case 4:\n  case 8:\n  case 16:\n  case 32: {\n    add(ARMEmitter::Size::i64Bit, Dst, STATE, Index, ARMEmitter::ShiftType::LSL, FEXCore::ilog2(Op->Stride));\n    break;\n  }\n  default: LOGMAN_MSG_A_FMT(\"Unhandled FormContextAddress stride: {}\", Op->Stride); break;\n  }\n}\n\nDEF_OP(SpillRegister) {\n  const auto Op = IROp->C<IR::IROp_SpillRegister>();\n  const auto OpSize = IROp->Size;\n  const uint32_t SlotOffset = Op->Slot * MaxSpillSlotSize;\n\n  if (Op->Class == IR::RegClass::GPR) {\n    const auto Src = GetReg(Op->Value);\n    switch (OpSize) {\n    case IR::OpSize::i8Bit: {\n      if (SlotOffset > LSByteMaxUnsignedOffset) {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, SlotOffset);\n        strb(Src, ARMEmitter::Reg::rsp, TMP1.R(), ARMEmitter::ExtendedType::LSL_64, 0);\n      } else {\n        strb(Src, ARMEmitter::Reg::rsp, SlotOffset);\n      }\n      break;\n    }\n    case IR::OpSize::i16Bit: {\n      if (SlotOffset > LSHalfMaxUnsignedOffset) {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, SlotOffset);\n        strh(Src, ARMEmitter::Reg::rsp, TMP1.R(), ARMEmitter::ExtendedType::LSL_64, 0);\n      } else {\n        strh(Src, ARMEmitter::Reg::rsp, SlotOffset);\n      }\n      break;\n    }\n    case IR::OpSize::i32Bit: {\n      if (SlotOffset > LSWordMaxUnsignedOffset) {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, SlotOffset);\n        str(Src.W(), ARMEmitter::Reg::rsp, TMP1.R(), ARMEmitter::ExtendedType::LSL_64, 0);\n      } else {\n        str(Src.W(), ARMEmitter::Reg::rsp, SlotOffset);\n      }\n      break;\n    }\n    case IR::OpSize::i64Bit: {\n      if (SlotOffset > LSDWordMaxUnsignedOffset) {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, SlotOffset);\n        str(Src.X(), ARMEmitter::Reg::rsp, TMP1.R(), ARMEmitter::ExtendedType::LSL_64, 0);\n      } else {\n        str(Src.X(), ARMEmitter::Reg::rsp, SlotOffset);\n      }\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unhandled SpillRegister size: {}\", OpSize); break;\n    }\n  } else if (Op->Class == FEXCore::IR::RegClass::FPR) {\n    const auto Src = GetVReg(Op->Value);\n\n    switch (OpSize) {\n    case IR::OpSize::i32Bit: {\n      if (SlotOffset > LSWordMaxUnsignedOffset) {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, SlotOffset);\n        str(Src.S(), ARMEmitter::Reg::rsp, TMP1.R(), ARMEmitter::ExtendedType::LSL_64, 0);\n      } else {\n        str(Src.S(), ARMEmitter::Reg::rsp, SlotOffset);\n      }\n      break;\n    }\n    case IR::OpSize::i64Bit: {\n      if (SlotOffset > LSDWordMaxUnsignedOffset) {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, SlotOffset);\n        str(Src.D(), ARMEmitter::Reg::rsp, TMP1.R(), ARMEmitter::ExtendedType::LSL_64, 0);\n      } else {\n        str(Src.D(), ARMEmitter::Reg::rsp, SlotOffset);\n      }\n      break;\n    }\n    case IR::OpSize::i128Bit: {\n      if (SlotOffset > LSQWordMaxUnsignedOffset) {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, SlotOffset);\n        str(Src.Q(), ARMEmitter::Reg::rsp, TMP1.R(), ARMEmitter::ExtendedType::LSL_64, 0);\n      } else {\n        str(Src.Q(), ARMEmitter::Reg::rsp, SlotOffset);\n      }\n      break;\n    }\n    case IR::OpSize::i256Bit: {\n      mov(TMP3, SlotOffset);\n      st1b<ARMEmitter::SubRegSize::i8Bit>(Src.Z(), PRED_TMP_32B, ARMEmitter::Reg::rsp, TMP3);\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unhandled SpillRegister size: {}\", OpSize); break;\n    }\n  } else {\n    LOGMAN_MSG_A_FMT(\"Unhandled SpillRegister class: {}\", Op->Class);\n  }\n}\n\nDEF_OP(FillRegister) {\n  const auto Op = IROp->C<IR::IROp_FillRegister>();\n  const auto OpSize = IROp->Size;\n  const uint32_t SlotOffset = Op->Slot * MaxSpillSlotSize;\n\n  if (Op->Class == IR::RegClass::GPR) {\n    const auto Dst = GetReg(Node);\n    switch (OpSize) {\n    case IR::OpSize::i8Bit: {\n      if (SlotOffset > LSByteMaxUnsignedOffset) {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, SlotOffset);\n        ldrb(Dst, ARMEmitter::Reg::rsp, TMP1.R(), ARMEmitter::ExtendedType::LSL_64, 0);\n      } else {\n        ldrb(Dst, ARMEmitter::Reg::rsp, SlotOffset);\n      }\n      break;\n    }\n    case IR::OpSize::i16Bit: {\n      if (SlotOffset > LSHalfMaxUnsignedOffset) {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, SlotOffset);\n        ldrh(Dst, ARMEmitter::Reg::rsp, TMP1.R(), ARMEmitter::ExtendedType::LSL_64, 0);\n      } else {\n        ldrh(Dst, ARMEmitter::Reg::rsp, SlotOffset);\n      }\n      break;\n    }\n    case IR::OpSize::i32Bit: {\n      if (SlotOffset > LSWordMaxUnsignedOffset) {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, SlotOffset);\n        ldr(Dst.W(), ARMEmitter::Reg::rsp, TMP1.R(), ARMEmitter::ExtendedType::LSL_64, 0);\n      } else {\n        ldr(Dst.W(), ARMEmitter::Reg::rsp, SlotOffset);\n      }\n      break;\n    }\n    case IR::OpSize::i64Bit: {\n      if (SlotOffset > LSDWordMaxUnsignedOffset) {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, SlotOffset);\n        ldr(Dst.X(), ARMEmitter::Reg::rsp, TMP1.R(), ARMEmitter::ExtendedType::LSL_64, 0);\n      } else {\n        ldr(Dst.X(), ARMEmitter::Reg::rsp, SlotOffset);\n      }\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unhandled FillRegister size: {}\", OpSize); break;\n    }\n  } else if (Op->Class == FEXCore::IR::RegClass::FPR) {\n    const auto Dst = GetVReg(Node);\n\n    switch (OpSize) {\n    case IR::OpSize::i32Bit: {\n      if (SlotOffset > LSWordMaxUnsignedOffset) {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, SlotOffset);\n        ldr(Dst.S(), ARMEmitter::Reg::rsp, TMP1.R(), ARMEmitter::ExtendedType::LSL_64, 0);\n      } else {\n        ldr(Dst.S(), ARMEmitter::Reg::rsp, SlotOffset);\n      }\n      break;\n    }\n    case IR::OpSize::i64Bit: {\n      if (SlotOffset > LSDWordMaxUnsignedOffset) {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, SlotOffset);\n        ldr(Dst.D(), ARMEmitter::Reg::rsp, TMP1.R(), ARMEmitter::ExtendedType::LSL_64, 0);\n      } else {\n        ldr(Dst.D(), ARMEmitter::Reg::rsp, SlotOffset);\n      }\n      break;\n    }\n    case IR::OpSize::i128Bit: {\n      if (SlotOffset > LSQWordMaxUnsignedOffset) {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, SlotOffset);\n        ldr(Dst.Q(), ARMEmitter::Reg::rsp, TMP1.R(), ARMEmitter::ExtendedType::LSL_64, 0);\n      } else {\n        ldr(Dst.Q(), ARMEmitter::Reg::rsp, SlotOffset);\n      }\n      break;\n    }\n    case IR::OpSize::i256Bit: {\n      mov(TMP3, SlotOffset);\n      ld1b<ARMEmitter::SubRegSize::i8Bit>(Dst.Z(), PRED_TMP_32B.Zeroing(), ARMEmitter::Reg::rsp, TMP3);\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unhandled FillRegister size: {}\", OpSize); break;\n    }\n  } else {\n    LOGMAN_MSG_A_FMT(\"Unhandled FillRegister class: {}\", Op->Class);\n  }\n}\n\nDEF_OP(LoadNZCV) {\n  auto Dst = GetReg(Node);\n\n  mrs(Dst, ARMEmitter::SystemRegister::NZCV);\n}\n\nDEF_OP(StoreNZCV) {\n  auto Op = IROp->C<IR::IROp_StoreNZCV>();\n\n  msr(ARMEmitter::SystemRegister::NZCV, GetReg(Op->Value));\n}\n\nDEF_OP(LoadDF) {\n  auto Dst = GetReg(Node);\n  auto Flag = X86State::RFLAG_DF_RAW_LOC;\n\n  // DF needs sign extension to turn 0x1/0xFF into 1/-1\n  ldrsb(Dst.X(), STATE, ARRAY_OFFSETOF(FEXCore::Core::CPUState, flags, Flag));\n}\n\nDEF_OP(ContextClear) {\n  auto Op = IROp->C<IR::IROp_ContextClear>();\n  if (CTX->HostFeatures.SupportsCLZERO) {\n    // We can use CLZero directly when hardware supports it.\n    // Provides a fairly generous speed-up on Ampere1A hardware.\n    // TODO: When FEAT_MOPS hardware ships, test memset using MOPS.\n    for (size_t i = 0; i < Op->Size; i += 64) {\n      add(ARMEmitter::Size::i64Bit, TMP1, STATE.R(), Op->Offset + i);\n      dc(ARMEmitter::DataCacheOperation::ZVA, TMP1);\n    }\n  } else {\n    movi(ARMEmitter::SubRegSize::i64Bit, VTMP1.Q(), 0);\n    for (size_t i = 0; i < Op->Size; i += 32) {\n      stp<ARMEmitter::IndexType::OFFSET>(VTMP1.Q(), VTMP1.Q(), STATE.R(), Op->Offset + i);\n    }\n  }\n}\n\nARMEmitter::ExtendedMemOperand Arm64JITCore::GenerateMemOperand(\n  IR::OpSize AccessSize, ARMEmitter::Register Base, IR::OrderedNodeWrapper Offset, IR::MemOffsetType OffsetType, uint8_t OffsetScale) {\n  if (Offset.IsInvalid()) {\n    return ARMEmitter::ExtendedMemOperand(Base.X(), ARMEmitter::IndexType::OFFSET, 0);\n  } else {\n    if (OffsetScale != 1 && OffsetScale != IR::OpSizeToSize(AccessSize)) {\n      LOGMAN_MSG_A_FMT(\"Unhandled GenerateMemOperand OffsetScale: {}\", OffsetScale);\n    }\n    uint64_t Const;\n    if (IsInlineConstant(Offset, &Const)) {\n      return ARMEmitter::ExtendedMemOperand(Base.X(), ARMEmitter::IndexType::OFFSET, Const);\n    } else {\n      auto RegOffset = GetReg(Offset);\n      switch (OffsetType) {\n      case IR::MemOffsetType::SXTX:\n        return ARMEmitter::ExtendedMemOperand(Base.X(), RegOffset.X(), ARMEmitter::ExtendedType::SXTX, FEXCore::ilog2(OffsetScale));\n      case IR::MemOffsetType::UXTW:\n        return ARMEmitter::ExtendedMemOperand(Base.X(), RegOffset.X(), ARMEmitter::ExtendedType::UXTW, FEXCore::ilog2(OffsetScale));\n      case IR::MemOffsetType::SXTW:\n        return ARMEmitter::ExtendedMemOperand(Base.X(), RegOffset.X(), ARMEmitter::ExtendedType::SXTW, FEXCore::ilog2(OffsetScale));\n      default: LOGMAN_MSG_A_FMT(\"Unhandled GenerateMemOperand OffsetType: {}\", OffsetType); break;\n      }\n    }\n  }\n\n  FEX_UNREACHABLE;\n}\n\nARMEmitter::Register Arm64JITCore::ApplyMemOperand(IR::OpSize AccessSize, ARMEmitter::Register Base, ARMEmitter::Register Tmp,\n                                                   IR::OrderedNodeWrapper Offset, IR::MemOffsetType OffsetType, uint8_t OffsetScale) {\n  if (Offset.IsInvalid()) {\n    return Base;\n  }\n\n  if (OffsetScale != 1 && OffsetScale != IR::OpSizeToSize(AccessSize)) {\n    LOGMAN_MSG_A_FMT(\"Unhandled OffsetScale: {}\", OffsetScale);\n  }\n\n  uint64_t Const;\n  if (IsInlineConstant(Offset, &Const)) {\n    if (Const == 0) {\n      return Base;\n    }\n    LoadConstant(ARMEmitter::Size::i64Bit, Tmp, Const);\n    add(ARMEmitter::Size::i64Bit, Tmp, Base, Tmp, ARMEmitter::ShiftType::LSL, FEXCore::ilog2(OffsetScale));\n  } else {\n    auto RegOffset = GetReg(Offset);\n    switch (OffsetType) {\n    case IR::MemOffsetType::SXTX:\n      add(ARMEmitter::Size::i64Bit, Tmp, Base, RegOffset, ARMEmitter::ExtendedType::SXTX, FEXCore::ilog2(OffsetScale));\n      break;\n\n    case IR::MemOffsetType::UXTW:\n      add(ARMEmitter::Size::i64Bit, Tmp, Base, RegOffset, ARMEmitter::ExtendedType::UXTW, FEXCore::ilog2(OffsetScale));\n      break;\n\n    case IR::MemOffsetType::SXTW:\n      add(ARMEmitter::Size::i64Bit, Tmp, Base, RegOffset, ARMEmitter::ExtendedType::SXTW, FEXCore::ilog2(OffsetScale));\n      break;\n\n    default: LOGMAN_MSG_A_FMT(\"Unhandled OffsetType: {}\", OffsetType); break;\n    }\n  }\n  return Tmp;\n}\n\nARMEmitter::SVEMemOperand Arm64JITCore::GenerateSVEMemOperand(IR::OpSize AccessSize, ARMEmitter::Register Base, IR::OrderedNodeWrapper Offset,\n                                                              IR::MemOffsetType OffsetType, [[maybe_unused]] uint8_t OffsetScale) {\n  if (Offset.IsInvalid()) {\n    return ARMEmitter::SVEMemOperand(Base.X(), 0);\n  }\n\n  uint64_t Const {};\n  if (IsInlineConstant(Offset, &Const)) {\n    if (Const == 0) {\n      return ARMEmitter::SVEMemOperand(Base.X(), 0);\n    }\n\n    const auto SignedConst = static_cast<int64_t>(Const);\n    const auto SignedSVESize = static_cast<int64_t>(HostSupportsSVE256 ? Core::CPUState::XMM_AVX_REG_SIZE : Core::CPUState::XMM_SSE_REG_SIZE);\n\n    const auto IsCleanlyDivisible = (SignedConst % SignedSVESize) == 0;\n    const auto Index = SignedConst / SignedSVESize;\n\n    // SVE's immediate variants of load stores are quite limited in terms\n    // of immediate range. They also operate on a by-vector-length basis.\n    //\n    // e.g. On a 256-bit SVE capable system:\n    //\n    //      LD1B Dst.B, Predicate/Z, [Reg, #1, MUL VL]\n    //\n    //      Will add 32 to the base register as the offset\n    //\n    // So if we have a constant that cleanly lies along a 256-bit offset\n    // and is also within the limitations of the immediate of -8 to 7\n    // then we can encode it as an immediate offset.\n    //\n    if (IsCleanlyDivisible && Index >= -8 && Index <= 7) {\n      return ARMEmitter::SVEMemOperand(Base.X(), static_cast<uint64_t>(Index));\n    }\n\n    // If we can't do that for whatever reason, then unfortunately, we need\n    // to move it over to a temporary to use as an offset.\n    mov(TMP1, Const);\n    return ARMEmitter::SVEMemOperand(Base.X(), TMP1);\n  }\n\n  // Otherwise handle it like normal.\n  // Note that we do nothing with the offset type and offset scale,\n  // since SVE loads and stores don't have the ability to perform an\n  // optional extension or shift as part of their behavior.\n  LOGMAN_THROW_A_FMT(OffsetType == IR::MemOffsetType::SXTX, \"Currently only the default offset type (SXTX) is supported.\");\n\n  const auto RegOffset = GetReg(Offset);\n  return ARMEmitter::SVEMemOperand(Base.X(), RegOffset.X());\n}\n\nDEF_OP(LoadMem) {\n  const auto Op = IROp->C<IR::IROp_LoadMem>();\n  const auto OpSize = IROp->Size;\n\n  const auto MemReg = GetReg(Op->Addr);\n  const auto MemSrc = GenerateMemOperand(OpSize, MemReg, Op->Offset, Op->OffsetType, Op->OffsetScale);\n\n  if (Op->Class == IR::RegClass::GPR) {\n    const auto Dst = GetReg(Node);\n\n    switch (OpSize) {\n    case IR::OpSize::i8Bit: ldrb(Dst, MemSrc); break;\n    case IR::OpSize::i16Bit: ldrh(Dst, MemSrc); break;\n    case IR::OpSize::i32Bit: ldr(Dst.W(), MemSrc); break;\n    case IR::OpSize::i64Bit: ldr(Dst.X(), MemSrc); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled LoadMem size: {}\", OpSize); break;\n    }\n  } else {\n    const auto Dst = GetVReg(Node);\n\n    switch (OpSize) {\n    case IR::OpSize::i8Bit: ldrb(Dst, MemSrc); break;\n    case IR::OpSize::i16Bit: ldrh(Dst, MemSrc); break;\n    case IR::OpSize::i32Bit: ldr(Dst.S(), MemSrc); break;\n    case IR::OpSize::i64Bit: ldr(Dst.D(), MemSrc); break;\n    case IR::OpSize::i128Bit: ldr(Dst.Q(), MemSrc); break;\n    case IR::OpSize::i256Bit: {\n      LOGMAN_THROW_A_FMT(HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n      const auto Operand = GenerateSVEMemOperand(OpSize, MemReg, Op->Offset, Op->OffsetType, Op->OffsetScale);\n      ld1b<ARMEmitter::SubRegSize::i8Bit>(Dst.Z(), PRED_TMP_32B.Zeroing(), Operand);\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unhandled LoadMem size: {}\", OpSize); break;\n    }\n  }\n}\n\nDEF_OP(LoadMemPair) {\n  const auto Op = IROp->C<IR::IROp_LoadMemPair>();\n  const auto Addr = GetReg(Op->Addr);\n\n  if (Op->Class == IR::RegClass::GPR) {\n    const auto Dst1 = GetReg(Op->OutValue1);\n    const auto Dst2 = GetReg(Op->OutValue2);\n\n    switch (IROp->Size) {\n    case IR::OpSize::i32Bit: ldp<ARMEmitter::IndexType::OFFSET>(Dst1.W(), Dst2.W(), Addr, Op->Offset); break;\n    case IR::OpSize::i64Bit: ldp<ARMEmitter::IndexType::OFFSET>(Dst1.X(), Dst2.X(), Addr, Op->Offset); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled LoadMemPair size: {}\", IROp->Size); break;\n    }\n  } else {\n    const auto Dst1 = GetVReg(Op->OutValue1);\n    const auto Dst2 = GetVReg(Op->OutValue2);\n\n    switch (IROp->Size) {\n    case IR::OpSize::i32Bit: ldp<ARMEmitter::IndexType::OFFSET>(Dst1.S(), Dst2.S(), Addr, Op->Offset); break;\n    case IR::OpSize::i64Bit: ldp<ARMEmitter::IndexType::OFFSET>(Dst1.D(), Dst2.D(), Addr, Op->Offset); break;\n    case IR::OpSize::i128Bit: ldp<ARMEmitter::IndexType::OFFSET>(Dst1.Q(), Dst2.Q(), Addr, Op->Offset); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled LoadMemPair size: {}\", IROp->Size); break;\n    }\n  }\n}\n\nDEF_OP(LoadMemTSO) {\n  const auto Op = IROp->C<IR::IROp_LoadMemTSO>();\n  const auto OpSize = IROp->Size;\n\n  const auto MemReg = GetReg(Op->Addr);\n\n  if (Op->Class == IR::RegClass::GPR) {\n    LOGMAN_THROW_A_FMT(Op->Offset.IsInvalid() || CTX->HostFeatures.SupportsTSOImm9, \"unexpected offset\");\n    LOGMAN_THROW_A_FMT(Op->OffsetScale == 1, \"unexpected offset scale\");\n    LOGMAN_THROW_A_FMT(Op->OffsetType == IR::MemOffsetType::SXTX, \"unexpected offset type\");\n  }\n\n  if (CTX->HostFeatures.SupportsTSOImm9 && Op->Class == IR::RegClass::GPR) {\n    const auto Dst = GetReg(Node);\n    uint64_t Offset = 0;\n    if (!Op->Offset.IsInvalid()) {\n      bool IsInline = IsInlineConstant(Op->Offset, &Offset);\n      LOGMAN_THROW_A_FMT(IsInline, \"expected immediate\");\n    }\n\n    if (OpSize == IR::OpSize::i8Bit) {\n      // 8bit load is always aligned to natural alignment\n      const auto Dst = GetReg(Node);\n      ldapurb(Dst, MemReg, Offset);\n    } else {\n      switch (OpSize) {\n      case IR::OpSize::i16Bit: ldapurh(Dst, MemReg, Offset); break;\n      case IR::OpSize::i32Bit: ldapur(Dst.W(), MemReg, Offset); break;\n      case IR::OpSize::i64Bit: ldapur(Dst.X(), MemReg, Offset); break;\n      default: LOGMAN_MSG_A_FMT(\"Unhandled LoadMemTSO size: {}\", OpSize); break;\n      }\n      // Half-barrier once back-patched.\n      nop();\n    }\n  } else if (CTX->HostFeatures.SupportsRCPC && Op->Class == IR::RegClass::GPR) {\n    const auto Dst = GetReg(Node);\n    if (OpSize == IR::OpSize::i8Bit) {\n      // 8bit load is always aligned to natural alignment\n      ldaprb(Dst.W(), MemReg);\n    } else {\n      switch (OpSize) {\n      case IR::OpSize::i16Bit: ldaprh(Dst.W(), MemReg); break;\n      case IR::OpSize::i32Bit: ldapr(Dst.W(), MemReg); break;\n      case IR::OpSize::i64Bit: ldapr(Dst.X(), MemReg); break;\n      default: LOGMAN_MSG_A_FMT(\"Unhandled LoadMemTSO size: {}\", OpSize); break;\n      }\n      // Half-barrier once back-patched.\n      nop();\n    }\n  } else if (Op->Class == IR::RegClass::GPR) {\n    const auto Dst = GetReg(Node);\n    if (OpSize == IR::OpSize::i8Bit) {\n      // 8bit load is always aligned to natural alignment\n      ldarb(Dst, MemReg);\n    } else {\n      switch (OpSize) {\n      case IR::OpSize::i16Bit: ldarh(Dst, MemReg); break;\n      case IR::OpSize::i32Bit: ldar(Dst.W(), MemReg); break;\n      case IR::OpSize::i64Bit: ldar(Dst.X(), MemReg); break;\n      default: LOGMAN_MSG_A_FMT(\"Unhandled LoadMemTSO size: {}\", OpSize); break;\n      }\n      // Half-barrier once back-patched.\n      nop();\n    }\n  } else {\n    const auto Dst = GetVReg(Node);\n    const auto MemSrc = GenerateMemOperand(OpSize, MemReg, Op->Offset, Op->OffsetType, Op->OffsetScale);\n    switch (OpSize) {\n    case IR::OpSize::i8Bit: ldrb(Dst, MemSrc); break;\n    case IR::OpSize::i16Bit: ldrh(Dst, MemSrc); break;\n    case IR::OpSize::i32Bit: ldr(Dst.S(), MemSrc); break;\n    case IR::OpSize::i64Bit: ldr(Dst.D(), MemSrc); break;\n    case IR::OpSize::i128Bit: ldr(Dst.Q(), MemSrc); break;\n    case IR::OpSize::i256Bit: {\n      LOGMAN_THROW_A_FMT(HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n      const auto MemSrc = GenerateSVEMemOperand(OpSize, MemReg, Op->Offset, Op->OffsetType, Op->OffsetScale);\n      ld1b<ARMEmitter::SubRegSize::i8Bit>(Dst.Z(), PRED_TMP_32B.Zeroing(), MemSrc);\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unhandled LoadMemTSO size: {}\", OpSize); break;\n    }\n    if (CTX->IsVectorAtomicTSOEnabled()) {\n      // Half-barrier.\n      dmb(ARMEmitter::BarrierScope::ISHLD);\n    }\n  }\n}\n\nDEF_OP(VLoadVectorMasked) {\n\n  const auto Op = IROp->C<IR::IROp_VLoadVectorMasked>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n\n  const auto CMPPredicate = ARMEmitter::PReg::p0;\n  const auto GoverningPredicate = Is256Bit ? PRED_TMP_32B : PRED_TMP_16B;\n\n  const auto Dst = GetVReg(Node);\n  const auto MaskReg = GetVReg(Op->Mask);\n  const auto MemReg = GetReg(Op->Addr);\n\n  if (HostSupportsSVE128 || HostSupportsSVE256) {\n    const auto MemSrc = GenerateSVEMemOperand(OpSize, MemReg, Op->Offset, Op->OffsetType, Op->OffsetScale);\n\n    // Check if the sign bit is set for the given element size.\n    cmplt(SubRegSize, CMPPredicate, GoverningPredicate.Zeroing(), MaskReg.Z(), 0);\n\n    switch (IROp->ElementSize) {\n    case IR::OpSize::i8Bit: {\n      ld1b<ARMEmitter::SubRegSize::i8Bit>(Dst.Z(), CMPPredicate.Zeroing(), MemSrc);\n      break;\n    }\n    case IR::OpSize::i16Bit: {\n      ld1h<ARMEmitter::SubRegSize::i16Bit>(Dst.Z(), CMPPredicate.Zeroing(), MemSrc);\n      break;\n    }\n    case IR::OpSize::i32Bit: {\n      ld1w<ARMEmitter::SubRegSize::i32Bit>(Dst.Z(), CMPPredicate.Zeroing(), MemSrc);\n      break;\n    }\n    case IR::OpSize::i64Bit: {\n      ld1d(Dst.Z(), CMPPredicate.Zeroing(), MemSrc);\n      break;\n    }\n    default: break;\n    }\n  } else {\n    const auto PerformMove = [this](IR::OpSize ElementSize, const ARMEmitter::Register Dst, const ARMEmitter::VRegister Vector, int index) {\n      switch (ElementSize) {\n      case IR::OpSize::i8Bit: umov<ARMEmitter::SubRegSize::i8Bit>(Dst, Vector, index); break;\n      case IR::OpSize::i16Bit: umov<ARMEmitter::SubRegSize::i16Bit>(Dst, Vector, index); break;\n      case IR::OpSize::i32Bit: umov<ARMEmitter::SubRegSize::i32Bit>(Dst, Vector, index); break;\n      case IR::OpSize::i64Bit: umov<ARMEmitter::SubRegSize::i64Bit>(Dst, Vector, index); break;\n      default: LOGMAN_MSG_A_FMT(\"Unhandled ExtractElementSize: {}\", ElementSize); break;\n      }\n    };\n\n    // Prepare yourself adventurer. For a masked load without instructions that implement it.\n    LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i128Bit, \"Only supports 128-bit without SVE256\");\n    size_t NumElements = IR::NumElements(IROp->Size, IROp->ElementSize);\n\n    // Use VTMP1 as the temporary destination\n    auto TempDst = VTMP1;\n    auto WorkingReg = TMP1;\n    auto TempMemReg = MemReg;\n    movi(ARMEmitter::SubRegSize::i64Bit, TempDst.Q(), 0);\n    uint64_t Const {};\n    if (Op->Offset.IsInvalid()) {\n      // Intentional no-op.\n    } else if (IsInlineConstant(Op->Offset, &Const)) {\n      TempMemReg = TMP2;\n      add(ARMEmitter::Size::i64Bit, TMP2, MemReg, Const);\n    } else {\n      LOGMAN_MSG_A_FMT(\"Complex addressing requested and not supported!\");\n    }\n\n    const uint64_t ElementSizeInBits = IR::OpSizeAsBits(IROp->ElementSize);\n    for (size_t i = 0; i < NumElements; ++i) {\n      // Extract the mask element.\n      PerformMove(IROp->ElementSize, WorkingReg, MaskReg, i);\n\n      // If the sign bit is zero then skip the load\n      ARMEmitter::ForwardLabel Skip {};\n      (void)tbz(WorkingReg, ElementSizeInBits - 1, &Skip);\n      // Do the gather load for this element into the destination\n      switch (IROp->ElementSize) {\n      case IR::OpSize::i8Bit: ld1<ARMEmitter::SubRegSize::i8Bit>(TempDst.Q(), i, TempMemReg); break;\n      case IR::OpSize::i16Bit: ld1<ARMEmitter::SubRegSize::i16Bit>(TempDst.Q(), i, TempMemReg); break;\n      case IR::OpSize::i32Bit: ld1<ARMEmitter::SubRegSize::i32Bit>(TempDst.Q(), i, TempMemReg); break;\n      case IR::OpSize::i64Bit: ld1<ARMEmitter::SubRegSize::i64Bit>(TempDst.Q(), i, TempMemReg); break;\n      case IR::OpSize::i128Bit: ldr(TempDst.Q(), TempMemReg, 0); break;\n      default: LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, IROp->ElementSize); return;\n      }\n\n      (void)Bind(&Skip);\n\n      if ((i + 1) != NumElements) {\n        // Handle register rename to save a move.\n        auto WorkingReg = TempMemReg;\n        TempMemReg = TMP2;\n        add(ARMEmitter::Size::i64Bit, TempMemReg, WorkingReg, IR::OpSizeToSize(IROp->ElementSize));\n      }\n    }\n\n    // Move result.\n    mov(Dst.Q(), TempDst.Q());\n  }\n}\n\nDEF_OP(VStoreVectorMasked) {\n  const auto Op = IROp->C<IR::IROp_VStoreVectorMasked>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n\n  const auto CMPPredicate = ARMEmitter::PReg::p0;\n  const auto GoverningPredicate = Is256Bit ? PRED_TMP_32B : PRED_TMP_16B;\n\n  const auto RegData = GetVReg(Op->Data);\n  const auto MaskReg = GetVReg(Op->Mask);\n  const auto MemReg = GetReg(Op->Addr);\n  if (HostSupportsSVE128 || HostSupportsSVE256) {\n    const auto MemDst = GenerateSVEMemOperand(OpSize, MemReg, Op->Offset, Op->OffsetType, Op->OffsetScale);\n\n    // Check if the sign bit is set for the given element size.\n    cmplt(SubRegSize, CMPPredicate, GoverningPredicate.Zeroing(), MaskReg.Z(), 0);\n\n    switch (IROp->ElementSize) {\n    case IR::OpSize::i8Bit: {\n      st1b<ARMEmitter::SubRegSize::i8Bit>(RegData.Z(), CMPPredicate.Zeroing(), MemDst);\n      break;\n    }\n    case IR::OpSize::i16Bit: {\n      st1h<ARMEmitter::SubRegSize::i16Bit>(RegData.Z(), CMPPredicate.Zeroing(), MemDst);\n      break;\n    }\n    case IR::OpSize::i32Bit: {\n      st1w<ARMEmitter::SubRegSize::i32Bit>(RegData.Z(), CMPPredicate.Zeroing(), MemDst);\n      break;\n    }\n    case IR::OpSize::i64Bit: {\n      st1d(RegData.Z(), CMPPredicate.Zeroing(), MemDst);\n      break;\n    }\n    default: break;\n    }\n  } else {\n    const auto PerformMove = [this](IR::OpSize ElementSize, const ARMEmitter::Register Dst, const ARMEmitter::VRegister Vector, int index) {\n      switch (ElementSize) {\n      case IR::OpSize::i8Bit: umov<ARMEmitter::SubRegSize::i8Bit>(Dst, Vector, index); break;\n      case IR::OpSize::i16Bit: umov<ARMEmitter::SubRegSize::i16Bit>(Dst, Vector, index); break;\n      case IR::OpSize::i32Bit: umov<ARMEmitter::SubRegSize::i32Bit>(Dst, Vector, index); break;\n      case IR::OpSize::i64Bit: umov<ARMEmitter::SubRegSize::i64Bit>(Dst, Vector, index); break;\n      default: LOGMAN_MSG_A_FMT(\"Unhandled ExtractElementSize: {}\", ElementSize); break;\n      }\n    };\n\n    // Prepare yourself adventurer. For a masked store without instructions that implement it.\n    LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i128Bit, \"Only supports 128-bit without SVE256\");\n    size_t NumElements = IR::NumElements(IROp->Size, IROp->ElementSize);\n\n    // Use VTMP1 as the temporary destination\n    auto WorkingReg = TMP1;\n    auto TempMemReg = MemReg;\n\n    uint64_t Const {};\n    if (Op->Offset.IsInvalid()) {\n      // Intentional no-op.\n    } else if (IsInlineConstant(Op->Offset, &Const)) {\n      TempMemReg = TMP2;\n      add(ARMEmitter::Size::i64Bit, TMP2, MemReg, Const);\n    } else {\n      LOGMAN_MSG_A_FMT(\"Complex addressing requested and not supported!\");\n    }\n\n    const uint64_t ElementSizeInBits = IR::OpSizeAsBits(IROp->ElementSize);\n    for (size_t i = 0; i < NumElements; ++i) {\n      // Extract the mask element.\n      PerformMove(IROp->ElementSize, WorkingReg, MaskReg, i);\n\n      // If the sign bit is zero then skip the load\n      ARMEmitter::ForwardLabel Skip {};\n      (void)tbz(WorkingReg, ElementSizeInBits - 1, &Skip);\n      // Do the gather load for this element into the destination\n      switch (IROp->ElementSize) {\n      case IR::OpSize::i8Bit: st1<ARMEmitter::SubRegSize::i8Bit>(RegData.Q(), i, TempMemReg); break;\n      case IR::OpSize::i16Bit: st1<ARMEmitter::SubRegSize::i16Bit>(RegData.Q(), i, TempMemReg); break;\n      case IR::OpSize::i32Bit: st1<ARMEmitter::SubRegSize::i32Bit>(RegData.Q(), i, TempMemReg); break;\n      case IR::OpSize::i64Bit: st1<ARMEmitter::SubRegSize::i64Bit>(RegData.Q(), i, TempMemReg); break;\n      case IR::OpSize::i128Bit: str(RegData.Q(), TempMemReg, 0); break;\n      default: LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, IROp->ElementSize); return;\n      }\n\n      (void)Bind(&Skip);\n\n      if ((i + 1) != NumElements) {\n        // Handle register rename to save a move.\n        auto WorkingReg = TempMemReg;\n        TempMemReg = TMP2;\n        add(ARMEmitter::Size::i64Bit, TempMemReg, WorkingReg, IR::OpSizeToSize(IROp->ElementSize));\n      }\n    }\n  }\n}\n\nvoid Arm64JITCore::Emulate128BitGather(IR::OpSize Size, IR::OpSize ElementSize, ARMEmitter::VRegister Dst,\n                                       ARMEmitter::VRegister IncomingDst, std::optional<ARMEmitter::Register> BaseAddr,\n                                       ARMEmitter::VRegister VectorIndexLow, std::optional<ARMEmitter::VRegister> VectorIndexHigh,\n                                       ARMEmitter::VRegister MaskReg, IR::OpSize VectorIndexSize, size_t DataElementOffsetStart,\n                                       size_t IndexElementOffsetStart, uint8_t OffsetScale, IR::OpSize AddrSize) {\n  LOGMAN_THROW_A_FMT(ElementSize >= IR::OpSize::i8Bit && ElementSize <= IR::OpSize::i64Bit, \"Invalid element size\");\n\n  const auto PerformSMove = [this](IR::OpSize ElementSize, const ARMEmitter::Register Dst, const ARMEmitter::VRegister Vector, int index) {\n    switch (ElementSize) {\n    case IR::OpSize::i8Bit: smov<ARMEmitter::SubRegSize::i8Bit>(Dst.X(), Vector, index); break;\n    case IR::OpSize::i16Bit: smov<ARMEmitter::SubRegSize::i16Bit>(Dst.X(), Vector, index); break;\n    case IR::OpSize::i32Bit: smov<ARMEmitter::SubRegSize::i32Bit>(Dst.X(), Vector, index); break;\n    case IR::OpSize::i64Bit: umov<ARMEmitter::SubRegSize::i64Bit>(Dst.X(), Vector, index); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled ExtractElementSize: {}\", ElementSize); break;\n    }\n  };\n\n  const auto PerformMove = [this](IR::OpSize ElementSize, const ARMEmitter::Register Dst, const ARMEmitter::VRegister Vector, int index) {\n    switch (ElementSize) {\n    case IR::OpSize::i8Bit: umov<ARMEmitter::SubRegSize::i8Bit>(Dst, Vector, index); break;\n    case IR::OpSize::i16Bit: umov<ARMEmitter::SubRegSize::i16Bit>(Dst, Vector, index); break;\n    case IR::OpSize::i32Bit: umov<ARMEmitter::SubRegSize::i32Bit>(Dst, Vector, index); break;\n    case IR::OpSize::i64Bit: umov<ARMEmitter::SubRegSize::i64Bit>(Dst, Vector, index); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled ExtractElementSize: {}\", ElementSize); break;\n    }\n  };\n\n  // FEX needs to use a temporary destination vector register in a couple of instances.\n  // When Dst overlaps MaskReg, VectorIndexLow, or VectorIndexHigh\n  // Due to x86 gather instruction limitations, it is highly likely that a destination temporary isn't required.\n  const bool NeedsDestTmp = Dst == MaskReg || Dst == VectorIndexLow || (VectorIndexHigh.has_value() && Dst == *VectorIndexHigh);\n\n  // If the incoming destination isn't the destination then we need to move.\n  const bool NeedsIncomingDestMove = Dst != IncomingDst || NeedsDestTmp;\n\n  ///< Adventurers beware, emulated ASIMD style gather masked load operation.\n  // Number of elements to load is calculated by the number of index elements available.\n  size_t NumAddrElements = (VectorIndexHigh.has_value() ? 32 : 16) / IR::OpSizeToSize(VectorIndexSize);\n  // The number of elements is clamped by the resulting register size.\n  size_t NumDataElements = std::min<size_t>(IR::OpSizeToSize(Size) / IR::OpSizeToSize(ElementSize), NumAddrElements);\n\n  size_t IndexElementsSizeBytes = NumAddrElements * IR::OpSizeToSize(VectorIndexSize);\n  if (IndexElementsSizeBytes > 16) {\n    // We must have a high register in this case.\n    LOGMAN_THROW_A_FMT(VectorIndexHigh.has_value(), \"Need High vector index register!\");\n  }\n\n  auto ResultReg = Dst;\n  if (NeedsDestTmp) {\n    // Use VTMP1 as the temporary destination\n    ResultReg = VTMP1;\n  }\n  auto WorkingReg = TMP1;\n  auto TempMemReg = TMP2;\n  const uint64_t ElementSizeInBits = IR::OpSizeToSize(ElementSize) * 8;\n\n  if (NeedsIncomingDestMove) {\n    mov(ResultReg.Q(), IncomingDst.Q());\n  }\n\n  for (size_t i = DataElementOffsetStart, IndexElement = IndexElementOffsetStart; i < NumDataElements; ++i, ++IndexElement) {\n    ARMEmitter::ForwardLabel Skip {};\n    // Extract mask element\n    PerformMove(ElementSize, WorkingReg, MaskReg, i);\n\n    // Skip if the mask's sign bit isn't set\n    (void)tbz(WorkingReg, ElementSizeInBits - 1, &Skip);\n\n    // Extract Index Element\n    if ((IndexElement * IR::OpSizeToSize(VectorIndexSize)) >= 16) {\n      // Fetch from the high index register.\n      PerformSMove(VectorIndexSize, WorkingReg, *VectorIndexHigh, IndexElement - (16 / IR::OpSizeToSize(VectorIndexSize)));\n    } else {\n      // Fetch from the low index register.\n      PerformSMove(VectorIndexSize, WorkingReg, VectorIndexLow, IndexElement);\n    }\n\n    // Calculate memory position for this gather load\n    if (BaseAddr.has_value()) {\n      if (VectorIndexSize == IR::OpSize::i32Bit) {\n        add(ConvertSize(AddrSize), TempMemReg, *BaseAddr, WorkingReg, ARMEmitter::ExtendedType::SXTW, FEXCore::ilog2(OffsetScale));\n      } else {\n        add(ConvertSize(AddrSize), TempMemReg, *BaseAddr, WorkingReg, ARMEmitter::ShiftType::LSL, FEXCore::ilog2(OffsetScale));\n      }\n    } else {\n      ///< In this case we have no base address, All addresses come from the vector register itself\n      if (VectorIndexSize == IR::OpSize::i32Bit) {\n        // Sign extend and shift in to the 64-bit register\n        sbfiz(ConvertSize(AddrSize), TempMemReg, WorkingReg, FEXCore::ilog2(OffsetScale), 32);\n      } else {\n        lsl(ConvertSize(AddrSize), TempMemReg, WorkingReg, FEXCore::ilog2(OffsetScale));\n      }\n    }\n\n    // Now that the address is calculated. Do the load.\n    switch (ElementSize) {\n    case IR::OpSize::i8Bit: ld1<ARMEmitter::SubRegSize::i8Bit>(ResultReg.Q(), i, TempMemReg); break;\n    case IR::OpSize::i16Bit: ld1<ARMEmitter::SubRegSize::i16Bit>(ResultReg.Q(), i, TempMemReg); break;\n    case IR::OpSize::i32Bit: ld1<ARMEmitter::SubRegSize::i32Bit>(ResultReg.Q(), i, TempMemReg); break;\n    case IR::OpSize::i64Bit: ld1<ARMEmitter::SubRegSize::i64Bit>(ResultReg.Q(), i, TempMemReg); break;\n    case IR::OpSize::i128Bit: ldr(ResultReg.Q(), TempMemReg, 0); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, ElementSize); FEX_UNREACHABLE;\n    }\n\n    (void)Bind(&Skip);\n  }\n\n  if (NeedsDestTmp) {\n    // Move result.\n    mov(Dst.Q(), ResultReg.Q());\n  }\n}\n\nDEF_OP(VLoadVectorGatherMasked) {\n  const auto Op = IROp->C<IR::IROp_VLoadVectorGatherMasked>();\n  const auto OpSize = IROp->Size;\n\n  const auto VectorIndexSize = Op->VectorIndexElementSize;\n  const auto OffsetScale = Op->OffsetScale;\n  const auto DataElementOffsetStart = Op->DataElementOffsetStart;\n  const auto IndexElementOffsetStart = Op->IndexElementOffsetStart;\n\n  ///< This IR operation handles discontiguous masked gather loadstore instructions. Some things to note about its behaviour.\n  ///  - VSIB behaviour is mostly entirely exposed in the IR operation directly.\n  ///    - Displacement is the only value missing as that can be added directly to AddrBase.\n  ///  - VectorIndex{Low,High} contains the index offsets for each element getting loaded.\n  ///     - These element sizes are decoupled from the resulting element size. These can be 32-bit or 64-bit.\n  ///     - When the element size is 32-bit then the value is zero-extended to the full 64-bit address calculation\n  ///     - When loading a 128-bit result with 64-bit VectorIndex Elements, this requires the use of both VectorIndexLow and VectorIndexHigh\n  ///     to get enough pointers.\n  ///  - When VectorIndexElementSize and OffsetScale matches Arm64 SVE behaviour then the operation becomes more optimal\n  ///     - When the behaviour doesn't match then it gets decomposed to ASIMD style masked load.\n  ///  - AddrBase also doesn't need to exist\n  ///     - If the instruction is using 64-bit vector indexing or 32-bit addresses where the top-bit isn't set then this is valid!\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto IncomingDst = GetVReg(Op->Incoming);\n\n  const auto MaskReg = GetVReg(Op->Mask);\n  std::optional<ARMEmitter::Register> BaseAddr = !Op->AddrBase.IsInvalid() ? std::make_optional(GetReg(Op->AddrBase)) : std::nullopt;\n  const auto VectorIndexLow = GetVReg(Op->VectorIndexLow);\n  std::optional<ARMEmitter::VRegister> VectorIndexHigh =\n    !Op->VectorIndexHigh.IsInvalid() ? std::make_optional(GetVReg(Op->VectorIndexHigh)) : std::nullopt;\n\n  ///< If the host supports SVE and the offset scale matches SVE limitations then it can do an SVE style load.\n  const bool SupportsSVELoad = (HostSupportsSVE128 || HostSupportsSVE256) &&\n                               (OffsetScale == 1 || OffsetScale == IR::OpSizeToSize(VectorIndexSize)) &&\n                               VectorIndexSize == IROp->ElementSize && Op->AddrSize == IR::OpSize::i64Bit;\n\n  if (SupportsSVELoad) {\n    uint8_t SVEScale = FEXCore::ilog2(OffsetScale);\n    ARMEmitter::SVEModType ModType = ARMEmitter::SVEModType::MOD_NONE;\n    if (VectorIndexSize == IR::OpSize::i32Bit) {\n      ModType = ARMEmitter::SVEModType::MOD_SXTW;\n    } else if (VectorIndexSize == IR::OpSize::i64Bit && OffsetScale != 1) {\n      ModType = ARMEmitter::SVEModType::MOD_LSL;\n    }\n\n    const auto SubRegSize = ConvertSubRegSize8(IROp);\n\n    const auto CMPPredicate = ARMEmitter::PReg::p0;\n    const auto GoverningPredicate = Is256Bit ? PRED_TMP_32B : PRED_TMP_16B;\n\n    // Check if the sign bit is set for the given element size.\n    cmplt(SubRegSize, CMPPredicate, GoverningPredicate.Zeroing(), MaskReg.Z(), 0);\n    auto TempDst = VTMP1;\n\n    // No need to load a temporary register in the case that we weren't provided a base address and there is no scaling.\n    ARMEmitter::SVEMemOperand MemDst {ARMEmitter::SVEMemOperand(VectorIndexLow.Z(), 0)};\n    if (BaseAddr.has_value() || OffsetScale != 1) {\n      ARMEmitter::Register AddrReg = TMP1;\n      if (BaseAddr.has_value()) {\n        AddrReg = GetReg(Op->AddrBase);\n      } else {\n        ///< OpcodeDispatcher didn't provide a Base address while SVE requires one.\n        LoadConstant(ARMEmitter::Size::i64Bit, AddrReg, 0);\n      }\n      MemDst = ARMEmitter::SVEMemOperand(AddrReg.X(), VectorIndexLow.Z(), ModType, SVEScale);\n    }\n\n    switch (IROp->ElementSize) {\n    case IR::OpSize::i8Bit: {\n      ld1b<ARMEmitter::SubRegSize::i8Bit>(TempDst.Z(), CMPPredicate.Zeroing(), MemDst);\n      break;\n    }\n    case IR::OpSize::i16Bit: {\n      ld1h<ARMEmitter::SubRegSize::i16Bit>(TempDst.Z(), CMPPredicate.Zeroing(), MemDst);\n      break;\n    }\n    case IR::OpSize::i32Bit: {\n      ld1w<ARMEmitter::SubRegSize::i32Bit>(TempDst.Z(), CMPPredicate.Zeroing(), MemDst);\n      break;\n    }\n    case IR::OpSize::i64Bit: {\n      ld1d(TempDst.Z(), CMPPredicate.Zeroing(), MemDst);\n      break;\n    }\n    default: break;\n    }\n\n    ///< Merge elements based on predicate.\n    sel(SubRegSize, Dst.Z(), CMPPredicate, TempDst.Z(), IncomingDst.Z());\n  } else {\n    LOGMAN_THROW_A_FMT(!Is256Bit, \"Can't emulate this gather load in the backend! Programming error!\");\n    Emulate128BitGather(IROp->Size, IROp->ElementSize, Dst, IncomingDst, BaseAddr, VectorIndexLow, VectorIndexHigh, MaskReg,\n                        VectorIndexSize, DataElementOffsetStart, IndexElementOffsetStart, OffsetScale, Op->AddrSize);\n  }\n}\n\nDEF_OP(VLoadVectorGatherMaskedQPS) {\n  const auto Op = IROp->C<IR::IROp_VLoadVectorGatherMaskedQPS>();\n\n  /// This instruction behaves similarly to the non-QPS version except for some STRICT limitations\n  /// - Only supports 32-bit element data size!\n  /// - Only supports 64-bit element address size!\n  /// - Only masks elements based on 32-bit element data size! (NOT ADDR SIZE!)\n  /// - Optimally uses SVE's `ld1w {zt.D}` variant instruction!\n  /// - Only outputs a single 128-bit result, while consuming 128-bit or 256-bit of address indexes!\n  /// - Matches VGATHERQPS/VPGATHERQD behaviour!\n  const auto OffsetScale = Op->OffsetScale;\n  const auto Dst = GetVReg(Node);\n  const auto IncomingDst = GetVReg(Op->Incoming);\n\n  const auto MaskReg = GetVReg(Op->MaskReg);\n  std::optional<ARMEmitter::Register> BaseAddr = !Op->AddrBase.IsInvalid() ? std::make_optional(GetReg(Op->AddrBase)) : std::nullopt;\n  const auto VectorIndexLow = GetVReg(Op->VectorIndexLow);\n  std::optional<ARMEmitter::VRegister> VectorIndexHigh =\n    !Op->VectorIndexHigh.IsInvalid() ? std::make_optional(GetVReg(Op->VectorIndexHigh)) : std::nullopt;\n\n  ///< If the host supports SVE and the offset scale matches SVE limitations then it can do an SVE style load.\n  const bool SupportsSVELoad = HostSupportsSVE128 && (OffsetScale == 1 || OffsetScale == 4) && Op->AddrSize == IR::OpSize::i64Bit;\n\n  if (SupportsSVELoad) {\n    ARMEmitter::SVEModType ModType = ARMEmitter::SVEModType::MOD_NONE;\n    if (OffsetScale != 1) {\n      ModType = ARMEmitter::SVEModType::MOD_LSL;\n    }\n\n    const auto CMPPredicate = ARMEmitter::PReg::p0;\n    const auto CMPPredicate2 = ARMEmitter::PReg::p1;\n\n    const auto GoverningPredicate = PRED_TMP_16B;\n\n    // Check if the sign bit is set for the given element size.\n    // This will set the predicate bits for elements [0, 1, 2, 3]\n    // We then use punpklo to extend the low results to be for 64-bit elements.\n    cmplt(ARMEmitter::SubRegSize::i32Bit, CMPPredicate, GoverningPredicate.Zeroing(), MaskReg.Z(), 0);\n    punpklo(CMPPredicate2, CMPPredicate);\n    auto TempDst = VTMP1;\n\n    auto GatherExtend = [this](ARMEmitter::VRegister Dst, std::optional<ARMEmitter::Register> BaseAddr, ARMEmitter::VRegister VectorIndex,\n                               ARMEmitter::PRegister CMPPredicate, ARMEmitter::SVEModType ModType, uint8_t OffsetScale) {\n      // No need to load a temporary register in the case that we weren't provided a base address and there is no scaling.\n      uint8_t SVEScale = FEXCore::ilog2(OffsetScale);\n      ARMEmitter::SVEMemOperand MemDst {ARMEmitter::SVEMemOperand(VectorIndex.Z(), 0)};\n      if (BaseAddr.has_value() || OffsetScale != 1) {\n        ARMEmitter::Register AddrReg = TMP1;\n        if (BaseAddr.has_value()) {\n          AddrReg = *BaseAddr;\n        } else {\n          ///< OpcodeDispatcher didn't provide a Base address while SVE requires one.\n          LoadConstant(ARMEmitter::Size::i64Bit, AddrReg, 0);\n        }\n        MemDst = ARMEmitter::SVEMemOperand(AddrReg.X(), VectorIndex.Z(), ModType, SVEScale);\n      }\n\n      ld1w<ARMEmitter::SubRegSize::i64Bit>(Dst.Z(), CMPPredicate.Zeroing(), MemDst);\n    };\n\n    GatherExtend(TempDst, BaseAddr, VectorIndexLow, CMPPredicate2, ModType, OffsetScale);\n\n    if (VectorIndexHigh.has_value()) {\n      punpkhi(CMPPredicate2, CMPPredicate);\n      GatherExtend(VTMP2, BaseAddr, *VectorIndexHigh, CMPPredicate2, ModType, OffsetScale);\n      // Move elements to the lower half.\n      uzp1(ARMEmitter::SubRegSize::i32Bit, TempDst.Q(), TempDst.Q(), VTMP2.Q());\n      ///< Merge elements based on predicate.\n      sel(ARMEmitter::SubRegSize::i32Bit, Dst.Z(), CMPPredicate, TempDst.Z(), IncomingDst.Z());\n    } else {\n      // Move elements to the lower half.\n      xtn(ARMEmitter::SubRegSize::i32Bit, TempDst.Q(), TempDst.Q());\n      ///< Merge elements based on predicate.\n      sel(ARMEmitter::SubRegSize::i32Bit, Dst.Z(), CMPPredicate, TempDst.Z(), IncomingDst.Z());\n    }\n  } else {\n    Emulate128BitGather(IR::OpSize::i128Bit, IR::OpSize::i32Bit, Dst, IncomingDst, BaseAddr, VectorIndexLow, VectorIndexHigh, MaskReg,\n                        IR::OpSize::i64Bit, 0, 0, OffsetScale, Op->AddrSize);\n  }\n}\n\nDEF_OP(VLoadVectorElement) {\n  const auto Op = IROp->C<IR::IROp_VLoadVectorElement>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  const auto ElementSize = IROp->ElementSize;\n\n  const auto Dst = GetVReg(Node);\n  const auto DstSrc = GetVReg(Op->DstSrc);\n  const auto MemReg = GetReg(Op->Addr);\n\n  LOGMAN_THROW_A_FMT(ElementSize == IR::OpSize::i8Bit || ElementSize == IR::OpSize::i16Bit || ElementSize == IR::OpSize::i32Bit ||\n                       ElementSize == IR::OpSize::i64Bit || ElementSize == IR::OpSize::i128Bit,\n                     \"Invalid element \"\n                     \"size\");\n\n  if (Is256Bit) {\n    LOGMAN_MSG_A_FMT(\"Unsupported 256-bit VLoadVectorElement\");\n  } else {\n    if (Dst != DstSrc && ElementSize != IR::OpSize::i128Bit) {\n      mov(Dst.Q(), DstSrc.Q());\n    }\n    switch (ElementSize) {\n    case IR::OpSize::i8Bit: ld1<ARMEmitter::SubRegSize::i8Bit>(Dst.Q(), Op->Index, MemReg); break;\n    case IR::OpSize::i16Bit: ld1<ARMEmitter::SubRegSize::i16Bit>(Dst.Q(), Op->Index, MemReg); break;\n    case IR::OpSize::i32Bit: ld1<ARMEmitter::SubRegSize::i32Bit>(Dst.Q(), Op->Index, MemReg); break;\n    case IR::OpSize::i64Bit: ld1<ARMEmitter::SubRegSize::i64Bit>(Dst.Q(), Op->Index, MemReg); break;\n    case IR::OpSize::i128Bit: ldr(Dst.Q(), MemReg); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, ElementSize); return;\n    }\n  }\n\n  // Emit a half-barrier if TSO is enabled.\n  if (CTX->IsVectorAtomicTSOEnabled()) {\n    dmb(ARMEmitter::BarrierScope::ISHLD);\n  }\n}\n\nDEF_OP(VStoreVectorElement) {\n  const auto Op = IROp->C<IR::IROp_VStoreVectorElement>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  const auto ElementSize = IROp->ElementSize;\n\n  const auto Value = GetVReg(Op->Value);\n  const auto MemReg = GetReg(Op->Addr);\n\n  LOGMAN_THROW_A_FMT(ElementSize == IR::OpSize::i8Bit || ElementSize == IR::OpSize::i16Bit || ElementSize == IR::OpSize::i32Bit ||\n                       ElementSize == IR::OpSize::i64Bit || ElementSize == IR::OpSize::i128Bit,\n                     \"Invalid element \"\n                     \"size\");\n\n  // Emit a half-barrier if TSO is enabled.\n  if (CTX->IsVectorAtomicTSOEnabled()) {\n    dmb(ARMEmitter::BarrierScope::ISH);\n  }\n\n  if (Is256Bit) {\n    LOGMAN_MSG_A_FMT(\"Unsupported 256-bit {}\", __func__);\n  } else {\n    switch (ElementSize) {\n    case IR::OpSize::i8Bit: st1<ARMEmitter::SubRegSize::i8Bit>(Value.Q(), Op->Index, MemReg); break;\n    case IR::OpSize::i16Bit: st1<ARMEmitter::SubRegSize::i16Bit>(Value.Q(), Op->Index, MemReg); break;\n    case IR::OpSize::i32Bit: st1<ARMEmitter::SubRegSize::i32Bit>(Value.Q(), Op->Index, MemReg); break;\n    case IR::OpSize::i64Bit: st1<ARMEmitter::SubRegSize::i64Bit>(Value.Q(), Op->Index, MemReg); break;\n    case IR::OpSize::i128Bit: str(Value.Q(), MemReg); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, ElementSize); return;\n    }\n  }\n}\n\nDEF_OP(VBroadcastFromMem) {\n  const auto Op = IROp->C<IR::IROp_VBroadcastFromMem>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n  const auto ElementSize = IROp->ElementSize;\n\n  const auto Dst = GetVReg(Node);\n  const auto MemReg = GetReg(Op->Address);\n\n  LOGMAN_THROW_A_FMT(ElementSize == IR::OpSize::i8Bit || ElementSize == IR::OpSize::i16Bit || ElementSize == IR::OpSize::i32Bit ||\n                       ElementSize == IR::OpSize::i64Bit || ElementSize == IR::OpSize::i128Bit,\n                     \"Invalid element \"\n                     \"size\");\n\n  if (Is256Bit && HostSupportsSVE256) {\n    const auto GoverningPredicate = PRED_TMP_32B.Zeroing();\n\n    switch (ElementSize) {\n    case IR::OpSize::i8Bit: ld1rb(ARMEmitter::SubRegSize::i8Bit, Dst.Z(), GoverningPredicate, MemReg); break;\n    case IR::OpSize::i16Bit: ld1rh(ARMEmitter::SubRegSize::i16Bit, Dst.Z(), GoverningPredicate, MemReg); break;\n    case IR::OpSize::i32Bit: ld1rw(ARMEmitter::SubRegSize::i32Bit, Dst.Z(), GoverningPredicate, MemReg); break;\n    case IR::OpSize::i64Bit: ld1rd(Dst.Z(), GoverningPredicate, MemReg); break;\n    case IR::OpSize::i128Bit: ld1rqb(Dst.Z(), GoverningPredicate, MemReg); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled VBroadcastFromMem size: {}\", ElementSize); return;\n    }\n  } else {\n    switch (ElementSize) {\n    case IR::OpSize::i8Bit: ld1r<ARMEmitter::SubRegSize::i8Bit>(Dst.Q(), MemReg); break;\n    case IR::OpSize::i16Bit: ld1r<ARMEmitter::SubRegSize::i16Bit>(Dst.Q(), MemReg); break;\n    case IR::OpSize::i32Bit: ld1r<ARMEmitter::SubRegSize::i32Bit>(Dst.Q(), MemReg); break;\n    case IR::OpSize::i64Bit: ld1r<ARMEmitter::SubRegSize::i64Bit>(Dst.Q(), MemReg); break;\n    case IR::OpSize::i128Bit:\n      // Normal load, like ld1rqb with 128-bit regs.\n      ldr(Dst.Q(), MemReg);\n      break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled VBroadcastFromMem size: {}\", ElementSize); return;\n    }\n  }\n\n  // Emit a half-barrier if TSO is enabled.\n  if (CTX->IsVectorAtomicTSOEnabled()) {\n    dmb(ARMEmitter::BarrierScope::ISHLD);\n  }\n}\n\nDEF_OP(Push) {\n  const auto Op = IROp->C<IR::IROp_Push>();\n  const auto ValueSize = IR::OpSizeToSize(Op->ValueSize);\n  auto Src = GetReg(Op->Value);\n  const auto AddrSrc = GetReg(Op->Addr);\n  const auto Dst = GetReg(Node);\n\n  bool NeedsMoveAfterwards = false;\n  if (Dst != AddrSrc) {\n    if (Dst == Src) {\n      NeedsMoveAfterwards = true;\n      // Need to be careful here, incoming source might be reused afterwards.\n    } else {\n      // RA constraints would let this always be true.\n      mov(IROp->Size == IR::OpSize::i64Bit ? ARMEmitter::Size::i64Bit : ARMEmitter::Size::i32Bit, Dst, AddrSrc);\n    }\n  }\n\n  if (Src == AddrSrc) {\n    // If the data source is the address source then we need to do some additional work.\n    // This is because it is undefined behaviour to do a writeback on store operation where dest == src.\n    // In the case of writeback where the source is the address there are multiple behaviours.\n    // - SIGILL - Apple Silicon Behaviour\n    // - Stores original value - Cortex behaviour\n    // - Stores value after pre-index adjust adjust - Vixl simulator behaviour.\n    // - Undefined value stored\n    // - Undefined behaviour(!)\n\n    // In this path Src can end up overlapping both AddrSrc and Dst.\n    // Move the data to a temporary and store from there instead.\n    mov(TMP1, Src.X());\n    Src = TMP1;\n  }\n\n  if (NeedsMoveAfterwards) {\n    switch (ValueSize) {\n    case 1: {\n      sturb(Src.W(), AddrSrc, -ValueSize);\n      break;\n    }\n    case 2: {\n      sturh(Src.W(), AddrSrc, -ValueSize);\n      break;\n    }\n    case 4: {\n      stur(Src.W(), AddrSrc, -ValueSize);\n      break;\n    }\n    case 8: {\n      stur(Src.X(), AddrSrc, -ValueSize);\n      break;\n    }\n    default: {\n      LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, ValueSize);\n      break;\n    }\n    }\n\n    sub(IROp->Size == IR::OpSize::i64Bit ? ARMEmitter::Size::i64Bit : ARMEmitter::Size::i32Bit, Dst, AddrSrc, ValueSize);\n  } else {\n    switch (ValueSize) {\n    case 1: {\n      strb<ARMEmitter::IndexType::PRE>(Src.W(), Dst, -ValueSize);\n      break;\n    }\n    case 2: {\n      strh<ARMEmitter::IndexType::PRE>(Src.W(), Dst, -ValueSize);\n      break;\n    }\n    case 4: {\n      str<ARMEmitter::IndexType::PRE>(Src.W(), Dst, -ValueSize);\n      break;\n    }\n    case 8: {\n      str<ARMEmitter::IndexType::PRE>(Src.X(), Dst, -ValueSize);\n      break;\n    }\n    default: {\n      LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, ValueSize);\n      break;\n    }\n    }\n  }\n}\n\nDEF_OP(PushTwo) {\n  const auto Op = IROp->C<IR::IROp_PushTwo>();\n  const auto ValueSize = IR::OpSizeToSize(Op->ValueSize);\n  auto Src1 = GetReg(Op->Value1);\n  auto Src2 = GetReg(Op->Value2);\n  const auto Dst = GetReg(Op->Addr);\n\n  switch (ValueSize) {\n  case 4: {\n    stp<ARMEmitter::IndexType::PRE>(Src1.W(), Src2.W(), Dst, -2 * ValueSize);\n    break;\n  }\n  case 8: {\n    stp<ARMEmitter::IndexType::PRE>(Src1.X(), Src2.X(), Dst, -2 * ValueSize);\n    break;\n  }\n  default: {\n    LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, ValueSize);\n    break;\n  }\n  }\n}\n\nDEF_OP(Pop) {\n  const auto Op = IROp->C<IR::IROp_Pop>();\n  const auto Size = IR::OpSizeToSize(Op->Size);\n  const auto Addr = GetReg(Op->InoutAddr);\n  const auto Dst = GetReg(Op->OutValue);\n\n  LOGMAN_THROW_A_FMT(Dst != Addr, \"Invalid\");\n\n  switch (Size) {\n  case 1: {\n    ldrb<ARMEmitter::IndexType::POST>(Dst.W(), Addr, Size);\n    break;\n  }\n  case 2: {\n    ldrh<ARMEmitter::IndexType::POST>(Dst.W(), Addr, Size);\n    break;\n  }\n  case 4: {\n    ldr<ARMEmitter::IndexType::POST>(Dst.W(), Addr, Size);\n    break;\n  }\n  case 8: {\n    ldr<ARMEmitter::IndexType::POST>(Dst.X(), Addr, Size);\n    break;\n  }\n  default: {\n    LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, Op->Size);\n    break;\n  }\n  }\n}\n\nDEF_OP(PopTwo) {\n  const auto Op = IROp->C<IR::IROp_PopTwo>();\n  const auto Size = IR::OpSizeToSize(Op->Size);\n  const auto Addr = GetReg(Op->InoutAddr);\n  auto Dst1 = GetReg(Op->OutValue1);\n  const auto Dst2 = GetReg(Op->OutValue2);\n\n  // ldp x, x is invalid. Explicitly discard the first destination to encode.\n  if (Dst1 == Dst2) {\n    Dst1 = ARMEmitter::Reg::zr;\n  }\n\n  LOGMAN_THROW_A_FMT(Dst1 != Addr && Dst2 != Addr, \"Invalid\");\n  LOGMAN_THROW_A_FMT(Dst1 != Dst2, \"Invalid\");\n\n  switch (Size) {\n  case 4: {\n    ldp<ARMEmitter::IndexType::POST>(Dst1.W(), Dst2.W(), Addr, 2 * Size);\n    break;\n  }\n  case 8: {\n    ldp<ARMEmitter::IndexType::POST>(Dst1.X(), Dst2.X(), Addr, 2 * Size);\n    break;\n  }\n  default: {\n    LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, Op->Size);\n    break;\n  }\n  }\n}\n\nDEF_OP(StoreMem) {\n  const auto Op = IROp->C<IR::IROp_StoreMem>();\n  const auto OpSize = IROp->Size;\n\n  const auto MemReg = GetReg(Op->Addr);\n  const auto MemSrc = GenerateMemOperand(OpSize, MemReg, Op->Offset, Op->OffsetType, Op->OffsetScale);\n\n  if (Op->Class == IR::RegClass::GPR) {\n    const auto Src = GetZeroableReg(Op->Value);\n    switch (OpSize) {\n    case IR::OpSize::i8Bit: strb(Src, MemSrc); break;\n    case IR::OpSize::i16Bit: strh(Src, MemSrc); break;\n    case IR::OpSize::i32Bit: str(Src.W(), MemSrc); break;\n    case IR::OpSize::i64Bit: str(Src.X(), MemSrc); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled StoreMem size: {}\", OpSize); break;\n    }\n  } else {\n    const auto Src = GetVReg(Op->Value);\n\n    switch (OpSize) {\n    case IR::OpSize::i8Bit: {\n      strb(Src, MemSrc);\n      break;\n    }\n    case IR::OpSize::i16Bit: {\n      strh(Src, MemSrc);\n      break;\n    }\n    case IR::OpSize::i32Bit: {\n      str(Src.S(), MemSrc);\n      break;\n    }\n    case IR::OpSize::i64Bit: {\n      str(Src.D(), MemSrc);\n      break;\n    }\n    case IR::OpSize::i128Bit: {\n      str(Src.Q(), MemSrc);\n      break;\n    }\n    case IR::OpSize::i256Bit: {\n      LOGMAN_THROW_A_FMT(HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n      const auto MemSrc = GenerateSVEMemOperand(OpSize, MemReg, Op->Offset, Op->OffsetType, Op->OffsetScale);\n      st1b<ARMEmitter::SubRegSize::i8Bit>(Src.Z(), PRED_TMP_32B, MemSrc);\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unhandled StoreMem size: {}\", OpSize); break;\n    }\n  }\n}\n\nDEF_OP(StoreMemX87SVEOptPredicate) {\n  const auto Op = IROp->C<IR::IROp_StoreMemX87SVEOptPredicate>();\n  const auto Predicate = PRED_X87_SVEOPT;\n\n  LOGMAN_THROW_A_FMT(HostSupportsSVE128 || HostSupportsSVE256, \"StoreMemX87SVEOptPredicate needs SVE support\");\n\n  const auto RegData = GetVReg(Op->Value);\n  const auto MemReg = GetReg(Op->Addr);\n  const auto MemDst = ARMEmitter::SVEMemOperand(MemReg.X(), 0);\n\n  switch (IROp->ElementSize) {\n  case IR::OpSize::i8Bit: {\n    st1b<ARMEmitter::SubRegSize::i8Bit>(RegData.Z(), Predicate, MemDst);\n    break;\n  }\n  case IR::OpSize::i16Bit: {\n    st1h<ARMEmitter::SubRegSize::i16Bit>(RegData.Z(), Predicate, MemDst);\n    break;\n  }\n  case IR::OpSize::i32Bit: {\n    st1w<ARMEmitter::SubRegSize::i32Bit>(RegData.Z(), Predicate, MemDst);\n    break;\n  }\n  case IR::OpSize::i64Bit: {\n    st1d(RegData.Z(), Predicate, MemDst);\n    break;\n  }\n  default: LOGMAN_MSG_A_FMT(\"Unhandled {} element size: {}\", __func__, IROp->ElementSize); break;\n  }\n}\n\nDEF_OP(LoadMemX87SVEOptPredicate) {\n  const auto Op = IROp->C<IR::IROp_LoadMemX87SVEOptPredicate>();\n  const auto Dst = GetVReg(Node);\n  const auto Predicate = PRED_X87_SVEOPT;\n  const auto MemReg = GetReg(Op->Addr);\n\n  LOGMAN_THROW_A_FMT(HostSupportsSVE128 || HostSupportsSVE256, \"LoadMemX87SVEOptPredicate needs SVE support\");\n\n  const auto MemDst = ARMEmitter::SVEMemOperand(MemReg.X(), 0);\n\n  switch (IROp->ElementSize) {\n  case IR::OpSize::i8Bit: {\n    ld1b<ARMEmitter::SubRegSize::i8Bit>(Dst.Z(), Predicate.Zeroing(), MemDst);\n    break;\n  }\n  case IR::OpSize::i16Bit: {\n    ld1h<ARMEmitter::SubRegSize::i16Bit>(Dst.Z(), Predicate.Zeroing(), MemDst);\n    break;\n  }\n  case IR::OpSize::i32Bit: {\n    ld1w<ARMEmitter::SubRegSize::i32Bit>(Dst.Z(), Predicate.Zeroing(), MemDst);\n    break;\n  }\n  case IR::OpSize::i64Bit: {\n    ld1d(Dst.Z(), Predicate.Zeroing(), MemDst);\n    break;\n  }\n  default: LOGMAN_MSG_A_FMT(\"Unhandled {} element size: {}\", __func__, IROp->ElementSize); break;\n  }\n}\n\nDEF_OP(StoreMemPair) {\n  const auto Op = IROp->C<IR::IROp_StoreMemPair>();\n  const auto OpSize = IROp->Size;\n  const auto Addr = GetReg(Op->Addr);\n\n  if (Op->Class == IR::RegClass::GPR) {\n    const auto Src1 = GetZeroableReg(Op->Value1);\n    const auto Src2 = GetZeroableReg(Op->Value2);\n    switch (OpSize) {\n    case IR::OpSize::i32Bit: stp<ARMEmitter::IndexType::OFFSET>(Src1.W(), Src2.W(), Addr, Op->Offset); break;\n    case IR::OpSize::i64Bit: stp<ARMEmitter::IndexType::OFFSET>(Src1.X(), Src2.X(), Addr, Op->Offset); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled StoreMem size: {}\", OpSize); break;\n    }\n  } else {\n    const auto Src1 = GetVReg(Op->Value1);\n    const auto Src2 = GetVReg(Op->Value2);\n\n    switch (OpSize) {\n    case IR::OpSize::i32Bit: stp<ARMEmitter::IndexType::OFFSET>(Src1.S(), Src2.S(), Addr, Op->Offset); break;\n    case IR::OpSize::i64Bit: stp<ARMEmitter::IndexType::OFFSET>(Src1.D(), Src2.D(), Addr, Op->Offset); break;\n    case IR::OpSize::i128Bit: stp<ARMEmitter::IndexType::OFFSET>(Src1.Q(), Src2.Q(), Addr, Op->Offset); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled StoreMemPair size: {}\", OpSize); break;\n    }\n  }\n}\n\nDEF_OP(StoreMemTSO) {\n  const auto Op = IROp->C<IR::IROp_StoreMemTSO>();\n  const auto OpSize = IROp->Size;\n\n  const auto MemReg = GetReg(Op->Addr);\n\n  if (Op->Class == IR::RegClass::GPR) {\n    LOGMAN_THROW_A_FMT(Op->Offset.IsInvalid() || CTX->HostFeatures.SupportsTSOImm9, \"unexpected offset\");\n    LOGMAN_THROW_A_FMT(Op->OffsetScale == 1, \"unexpected offset scale\");\n    LOGMAN_THROW_A_FMT(Op->OffsetType == IR::MemOffsetType::SXTX, \"unexpected offset type\");\n  }\n\n  if (CTX->HostFeatures.SupportsTSOImm9 && Op->Class == IR::RegClass::GPR) {\n    const auto Src = GetZeroableReg(Op->Value);\n    uint64_t Offset = 0;\n    if (!Op->Offset.IsInvalid()) {\n      bool IsInline = IsInlineConstant(Op->Offset, &Offset);\n      LOGMAN_THROW_A_FMT(IsInline, \"expected immediate\");\n    }\n\n    if (OpSize == IR::OpSize::i8Bit) {\n      // 8bit load is always aligned to natural alignment\n      stlurb(Src, MemReg, Offset);\n    } else {\n      // Half-barrier once back-patched.\n      nop();\n      switch (OpSize) {\n      case IR::OpSize::i16Bit: stlurh(Src, MemReg, Offset); break;\n      case IR::OpSize::i32Bit: stlur(Src.W(), MemReg, Offset); break;\n      case IR::OpSize::i64Bit: stlur(Src.X(), MemReg, Offset); break;\n      default: LOGMAN_MSG_A_FMT(\"Unhandled StoreMemTSO size: {}\", OpSize); break;\n      }\n    }\n  } else if (Op->Class == IR::RegClass::GPR) {\n    const auto Src = GetZeroableReg(Op->Value);\n\n    if (OpSize == IR::OpSize::i8Bit) {\n      // 8bit load is always aligned to natural alignment\n      stlrb(Src, MemReg);\n    } else {\n      // Half-barrier once back-patched.\n      nop();\n      switch (OpSize) {\n      case IR::OpSize::i16Bit: stlrh(Src, MemReg); break;\n      case IR::OpSize::i32Bit: stlr(Src.W(), MemReg); break;\n      case IR::OpSize::i64Bit: stlr(Src.X(), MemReg); break;\n      default: LOGMAN_MSG_A_FMT(\"Unhandled StoreMemTSO size: {}\", OpSize); break;\n      }\n    }\n  } else {\n    if (CTX->IsVectorAtomicTSOEnabled()) {\n      // Half-Barrier.\n      dmb(ARMEmitter::BarrierScope::ISH);\n    }\n    const auto Src = GetVReg(Op->Value);\n    const auto MemSrc = GenerateMemOperand(OpSize, MemReg, Op->Offset, Op->OffsetType, Op->OffsetScale);\n    switch (OpSize) {\n    case IR::OpSize::i8Bit: strb(Src, MemSrc); break;\n    case IR::OpSize::i16Bit: strh(Src, MemSrc); break;\n    case IR::OpSize::i32Bit: str(Src.S(), MemSrc); break;\n    case IR::OpSize::i64Bit: str(Src.D(), MemSrc); break;\n    case IR::OpSize::i128Bit: str(Src.Q(), MemSrc); break;\n    case IR::OpSize::i256Bit: {\n      LOGMAN_THROW_A_FMT(HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n      const auto Operand = GenerateSVEMemOperand(OpSize, MemReg, Op->Offset, Op->OffsetType, Op->OffsetScale);\n      st1b<ARMEmitter::SubRegSize::i8Bit>(Src.Z(), PRED_TMP_32B, Operand);\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unhandled StoreMemTSO size: {}\", OpSize); break;\n    }\n  }\n}\n\nDEF_OP(MemSet) {\n  const auto Op = IROp->C<IR::IROp_MemSet>();\n\n  const bool IsAtomic = CTX->IsMemcpyAtomicTSOEnabled();\n  const auto Size = IR::OpSizeToSize(Op->Size);\n  const auto MemReg = GetReg(Op->Addr);\n  const auto Value = GetZeroableReg(Op->Value);\n  const auto Length = GetReg(Op->Length);\n  const auto Dst = GetReg(Node);\n\n  uint64_t DirectionConstant;\n  bool DirectionIsInline = IsInlineConstant(Op->Direction, &DirectionConstant);\n  ARMEmitter::Register DirectionReg = ARMEmitter::Reg::r0;\n  if (!DirectionIsInline) {\n    DirectionReg = GetReg(Op->Direction);\n  }\n\n  // If Direction > 0 then:\n  //   MemReg is incremented (by size)\n  // else:\n  //   MemReg is decremented (by size)\n  //\n  // Counter is decremented regardless.\n\n  ARMEmitter::ForwardLabel BackwardImpl {};\n  ARMEmitter::ForwardLabel Done {};\n\n  mov(TMP1, Length.X());\n  if (Op->Prefix.IsInvalid()) {\n    mov(TMP2, MemReg.X());\n  } else {\n    const auto Prefix = GetReg(Op->Prefix);\n    add(TMP2, Prefix.X(), MemReg.X());\n  }\n\n  if (!DirectionIsInline) {\n    // Backward or forwards implementation depends on flag\n    (void)tbnz(DirectionReg, 1, &BackwardImpl);\n  }\n\n  auto MemStore = [this](auto Value, uint32_t OpSize, int32_t Size) {\n    switch (OpSize) {\n    case 1: strb<ARMEmitter::IndexType::POST>(Value.W(), TMP2, Size); break;\n    case 2: strh<ARMEmitter::IndexType::POST>(Value.W(), TMP2, Size); break;\n    case 4: str<ARMEmitter::IndexType::POST>(Value.W(), TMP2, Size); break;\n    case 8: str<ARMEmitter::IndexType::POST>(Value.X(), TMP2, Size); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, Size); break;\n    }\n  };\n\n  auto MemStoreTSO = [this](auto Value, uint32_t OpSize, int32_t Size) {\n    if (OpSize == 1) {\n      // 8bit load is always aligned to natural alignment\n      stlrb(Value.W(), TMP2);\n    } else {\n      nop();\n      switch (OpSize) {\n      case 2: stlrh(Value.W(), TMP2); break;\n      case 4: stlr(Value.W(), TMP2); break;\n      case 8: stlr(Value.X(), TMP2); break;\n      default: LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, Size); break;\n      }\n    }\n\n    if (Size >= 0) {\n      add(ARMEmitter::Size::i64Bit, TMP2, TMP2, OpSize);\n    } else {\n      sub(ARMEmitter::Size::i64Bit, TMP2, TMP2, OpSize);\n    }\n  };\n\n  const auto SubRegSize = Size == 1 ? ARMEmitter::SubRegSize::i8Bit :\n                          Size == 2 ? ARMEmitter::SubRegSize::i16Bit :\n                          Size == 4 ? ARMEmitter::SubRegSize::i32Bit :\n                          Size == 8 ? ARMEmitter::SubRegSize::i64Bit :\n                                      ARMEmitter::SubRegSize::i8Bit;\n\n  auto EmitMemset = [&](int32_t Direction) {\n    const int32_t SizeDirection = Size * Direction;\n    const bool IsBackwards = Direction == -1;\n\n    // Sets the result to the final address written depending on\n    // whether or not the memset is forwards or backwards.\n    const auto MakeFinalAddress = [&] {\n      if (IsBackwards) {\n        switch (Size) {\n        case 1: sub(Dst.X(), MemReg.X(), Length.X()); break;\n        case 2:\n        case 4:\n        case 8: sub(Dst.X(), MemReg.X(), Length.X(), ARMEmitter::ShiftType::LSL, FEXCore::ilog2(Size)); break;\n        default: LOGMAN_MSG_A_FMT(\"Unhandled MemSet size: {}\", Size); break;\n        }\n      } else {\n        switch (Size) {\n        case 1: add(Dst.X(), MemReg.X(), Length.X()); break;\n        case 2:\n        case 4:\n        case 8: add(Dst.X(), MemReg.X(), Length.X(), ARMEmitter::ShiftType::LSL, FEXCore::ilog2(Size)); break;\n        default: LOGMAN_MSG_A_FMT(\"Unhandled MemSet size: {}\", Size); break;\n        }\n      }\n    };\n\n    ARMEmitter::BiDirectionalLabel AgainInternal {};\n    ARMEmitter::ForwardLabel DoneInternal {};\n\n    // Early exit if zero count.\n    (void)cbz(ARMEmitter::Size::i64Bit, TMP1, &DoneInternal);\n\n    if (!IsAtomic) {\n      if (CTX->HostFeatures.SupportsMOPS) {\n        const bool Is8Bit = SubRegSize == ARMEmitter::SubRegSize::i8Bit;\n\n        // We can handle 8-bit memsets and any other size that happens\n        // to be using an inlined zero value (resulting in the use of ZR).\n        //\n        // NOTE:\n        // Strictly speaking, this can also be trivially expanded to handle other sizes\n        // that happen to use any value that could fit inside a byte if the need\n        // arises. This does increase branching and code generation, however, since\n        // we'd still need to emit the fallback in the event a value for a larger size\n        // falls outside the range of a byte instead of only generating the MOPS code.\n        if (Is8Bit || Value == ARMEmitter::Reg::zr) {\n          // If we're performing a non-byte-sized zeroing operation then we need to\n          // scale the counter accordingly. (e.g. a 64-bit memset of size 2 needs to\n          // be turned into an 8-bit memset of size 16)\n          if (!Is8Bit) {\n            lsl(ARMEmitter::Size::i64Bit, TMP1, TMP1, FEXCore::ToUnderlying(SubRegSize));\n          }\n\n          // If backwards, then we need to adjust the starting address because\n          // set{p, m, e} memset forwards, so we need to slide this bad boy\n          // back like: (address - count) + 1.\n          //\n          // This lets us offset the address such that we can treat a backwards\n          // memset as if it were a forwards one.\n          if (IsBackwards) {\n            sub(TMP2, TMP2, TMP1);\n            add(ARMEmitter::Size::i64Bit, TMP2, TMP2, 1);\n          }\n\n          // Unfortunately set operations fiddle with NZCV, so we need to preserve it.\n          mrs(TMP3, ARMEmitter::SystemRegister::NZCV);\n          setp(TMP2, TMP1, Value.X());\n          setm(TMP2, TMP1, Value.X());\n          sete(TMP2, TMP1, Value.X());\n          msr(ARMEmitter::SystemRegister::NZCV, TMP3);\n\n          MakeFinalAddress();\n          (void)Bind(&DoneInternal);\n          return;\n        }\n      }\n\n      ARMEmitter::ForwardLabel AgainInternal256Exit {};\n      ARMEmitter::BackwardLabel AgainInternal256 {};\n      ARMEmitter::ForwardLabel AgainInternal128Exit {};\n      ARMEmitter::BackwardLabel AgainInternal128 {};\n\n      if (IsBackwards) {\n        sub(ARMEmitter::Size::i64Bit, TMP2, TMP2, 32 - Size);\n      }\n\n      // Keep the counter one copy ahead, so that underflow can be used to detect when to fallback\n      // to the copy unit size copy loop for the last chunk.\n      // Do this in two parts, to fallback to the byte by byte loop if size < 32, and to the\n      // single copy loop if size < 64.\n      sub(ARMEmitter::Size::i64Bit, TMP1, TMP1, 32 / Size);\n      (void)tbnz(TMP1, 63, &AgainInternal128Exit);\n\n      // Fill VTMP2 with the set pattern\n      dup(SubRegSize, VTMP2.Q(), Value);\n\n      sub(ARMEmitter::Size::i64Bit, TMP1, TMP1, 32 / Size);\n      (void)tbnz(TMP1, 63, &AgainInternal256Exit);\n\n      (void)Bind(&AgainInternal256);\n      stp<ARMEmitter::IndexType::POST>(VTMP2.Q(), VTMP2.Q(), TMP2, 32 * Direction);\n      stp<ARMEmitter::IndexType::POST>(VTMP2.Q(), VTMP2.Q(), TMP2, 32 * Direction);\n      sub(ARMEmitter::Size::i64Bit, TMP1, TMP1, 64 / Size);\n      (void)tbz(TMP1, 63, &AgainInternal256);\n\n      (void)Bind(&AgainInternal256Exit);\n      add(ARMEmitter::Size::i64Bit, TMP1, TMP1, 64 / Size);\n      (void)cbz(ARMEmitter::Size::i64Bit, TMP1, &DoneInternal);\n\n      sub(ARMEmitter::Size::i64Bit, TMP1, TMP1, 32 / Size);\n      (void)tbnz(TMP1, 63, &AgainInternal128Exit);\n      (void)Bind(&AgainInternal128);\n      stp<ARMEmitter::IndexType::POST>(VTMP2.Q(), VTMP2.Q(), TMP2, 32 * Direction);\n      sub(ARMEmitter::Size::i64Bit, TMP1, TMP1, 32 / Size);\n      (void)tbz(TMP1, 63, &AgainInternal128);\n\n      (void)Bind(&AgainInternal128Exit);\n      add(ARMEmitter::Size::i64Bit, TMP1, TMP1, 32 / Size);\n      (void)cbz(ARMEmitter::Size::i64Bit, TMP1, &DoneInternal);\n\n      if (IsBackwards) {\n        add(ARMEmitter::Size::i64Bit, TMP2, TMP2, 32 - Size);\n      }\n    }\n\n    (void)Bind(&AgainInternal);\n    if (IsAtomic) {\n      MemStoreTSO(Value, Size, SizeDirection);\n    } else {\n      MemStore(Value, Size, SizeDirection);\n    }\n    sub(ARMEmitter::Size::i64Bit, TMP1, TMP1, 1);\n    (void)cbnz(ARMEmitter::Size::i64Bit, TMP1, &AgainInternal);\n\n    (void)Bind(&DoneInternal);\n\n    MakeFinalAddress();\n  };\n\n  if (DirectionIsInline) {\n    LOGMAN_THROW_A_FMT(DirectionConstant == 1 || DirectionConstant == -1, \"unexpected direction\");\n    EmitMemset(DirectionConstant);\n  } else {\n    // Emit forward direction memset then backward direction memset.\n    for (int32_t Direction : {1, -1}) {\n      EmitMemset(Direction);\n\n      if (Direction == 1) {\n        (void)b(&Done);\n        (void)Bind(&BackwardImpl);\n      }\n    }\n\n    (void)Bind(&Done);\n    // Destination already set to the final pointer.\n  }\n}\n\nDEF_OP(MemCpy) {\n  const auto Op = IROp->C<IR::IROp_MemCpy>();\n\n  const bool IsAtomic = CTX->IsMemcpyAtomicTSOEnabled();\n  const auto Size = IR::OpSizeToSize(Op->Size);\n  const auto MemRegDest = GetReg(Op->Dest);\n  const auto MemRegSrc = GetReg(Op->Src);\n\n  const auto Length = GetReg(Op->Length);\n  uint64_t DirectionConstant;\n  bool DirectionIsInline = IsInlineConstant(Op->Direction, &DirectionConstant);\n  ARMEmitter::Register DirectionReg = ARMEmitter::Reg::r0;\n  if (!DirectionIsInline) {\n    DirectionReg = GetReg(Op->Direction);\n  }\n\n  auto Dst0 = GetReg(Op->OutDstAddress);\n  auto Dst1 = GetReg(Op->OutSrcAddress);\n  // If Direction > 0 then:\n  //   MemRegDest is incremented (by size)\n  //   MemRegSrc is incremented (by size)\n  // else:\n  //   MemRegDest is decremented (by size)\n  //   MemRegSrc is decremented (by size)\n  //\n  // Counter is decremented regardless.\n\n  ARMEmitter::ForwardLabel BackwardImpl {};\n  ARMEmitter::ForwardLabel Done {};\n\n  mov(TMP1, Length.X());\n  mov(TMP2, MemRegDest.X());\n  mov(TMP3, MemRegSrc.X());\n\n  // TMP1 = Length\n  // TMP2 = Dest\n  // TMP3 = Src\n  // TMP4 = load+store temp value\n\n  if (!DirectionIsInline) {\n    // Backward or forwards implementation depends on flag\n    (void)tbnz(DirectionReg, 1, &BackwardImpl);\n  }\n\n  auto MemCpy = [this](uint32_t OpSize, int32_t Size) {\n    switch (OpSize) {\n    case 1:\n      ldrb<ARMEmitter::IndexType::POST>(TMP4.W(), TMP3, Size);\n      strb<ARMEmitter::IndexType::POST>(TMP4.W(), TMP2, Size);\n      break;\n    case 2:\n      ldrh<ARMEmitter::IndexType::POST>(TMP4.W(), TMP3, Size);\n      strh<ARMEmitter::IndexType::POST>(TMP4.W(), TMP2, Size);\n      break;\n    case 4:\n      ldr<ARMEmitter::IndexType::POST>(TMP4.W(), TMP3, Size);\n      str<ARMEmitter::IndexType::POST>(TMP4.W(), TMP2, Size);\n      break;\n    case 8:\n      ldr<ARMEmitter::IndexType::POST>(TMP4, TMP3, Size);\n      str<ARMEmitter::IndexType::POST>(TMP4, TMP2, Size);\n      break;\n    case 32:\n      ldp<ARMEmitter::IndexType::POST>(VTMP1.Q(), VTMP2.Q(), TMP3, Size);\n      stp<ARMEmitter::IndexType::POST>(VTMP1.Q(), VTMP2.Q(), TMP2, Size);\n      break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, Size); break;\n    }\n  };\n\n  auto MemCpyTSO = [this](uint32_t OpSize, int32_t Size) {\n    if (CTX->HostFeatures.SupportsRCPC) {\n      if (OpSize == 1) {\n        // 8bit load is always aligned to natural alignment\n        ldaprb(TMP4.W(), TMP3);\n        stlrb(TMP4.W(), TMP2);\n      } else {\n        switch (OpSize) {\n        case 2: ldaprh(TMP4.W(), TMP3); break;\n        case 4: ldapr(TMP4.W(), TMP3); break;\n        case 8: ldapr(TMP4, TMP3); break;\n        default: LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, Size); break;\n        }\n\n        // Placeholders for backpatching barriers (one per load/store)\n        nop();\n        nop();\n\n        switch (OpSize) {\n        case 2: stlrh(TMP4.W(), TMP2); break;\n        case 4: stlr(TMP4.W(), TMP2); break;\n        case 8: stlr(TMP4, TMP2); break;\n        default: LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, Size); break;\n        }\n      }\n    } else {\n      if (OpSize == 1) {\n        // 8bit load is always aligned to natural alignment\n        ldarb(TMP4.W(), TMP3);\n        stlrb(TMP4.W(), TMP2);\n      } else {\n        switch (OpSize) {\n        case 2: ldarh(TMP4.W(), TMP3); break;\n        case 4: ldar(TMP4.W(), TMP3); break;\n        case 8: ldar(TMP4, TMP3); break;\n        default: LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, Size); break;\n        }\n\n        // Placeholders for backpatching barriers (one per load/store)\n        nop();\n        nop();\n\n        switch (OpSize) {\n        case 2: stlrh(TMP4.W(), TMP2); break;\n        case 4: stlr(TMP4.W(), TMP2); break;\n        case 8: stlr(TMP4, TMP2); break;\n        default: LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, Size); break;\n        }\n      }\n    }\n\n    if (Size >= 0) {\n      add(ARMEmitter::Size::i64Bit, TMP2, TMP2, OpSize);\n      add(ARMEmitter::Size::i64Bit, TMP3, TMP3, OpSize);\n    } else {\n      sub(ARMEmitter::Size::i64Bit, TMP2, TMP2, OpSize);\n      sub(ARMEmitter::Size::i64Bit, TMP3, TMP3, OpSize);\n    }\n  };\n\n  auto EmitMemcpy = [&](int32_t Direction) {\n    const int32_t SizeDirection = Size * Direction;\n    const bool IsBackwards = Direction == -1;\n\n    const auto FinalizeAddresses = [&] {\n      if (IsBackwards) {\n        switch (Size) {\n        case 1:\n          sub(Dst0.X(), TMP1, TMP3);\n          sub(Dst1.X(), TMP2, TMP3);\n          break;\n        case 2:\n        case 4:\n        case 8:\n          sub(Dst0.X(), TMP1, TMP3, ARMEmitter::ShiftType::LSL, FEXCore::ilog2(Size));\n          sub(Dst1.X(), TMP2, TMP3, ARMEmitter::ShiftType::LSL, FEXCore::ilog2(Size));\n          break;\n        default: LOGMAN_MSG_A_FMT(\"Unhandled MemCpy size: {}\", Size); break;\n        }\n      } else {\n        switch (Size) {\n        case 1:\n          add(Dst0.X(), TMP1, TMP3);\n          add(Dst1.X(), TMP2, TMP3);\n          break;\n        case 2:\n        case 4:\n        case 8:\n          add(Dst0.X(), TMP1, TMP3, ARMEmitter::ShiftType::LSL, FEXCore::ilog2(Size));\n          add(Dst1.X(), TMP2, TMP3, ARMEmitter::ShiftType::LSL, FEXCore::ilog2(Size));\n          break;\n        default: LOGMAN_MSG_A_FMT(\"Unhandled MemCpy size: {}\", Size); break;\n        }\n      }\n    };\n\n    ARMEmitter::BiDirectionalLabel AgainInternal {};\n    ARMEmitter::ForwardLabel DoneInternal {};\n\n    // Early exit if zero count.\n    (void)cbz(ARMEmitter::Size::i64Bit, TMP1, &DoneInternal);\n\n    if (!IsAtomic) {\n      if (CTX->HostFeatures.SupportsMOPS) {\n        // In the event we have an overlap (gross), we need to fall back\n        // to the non-mops copy handler. Since the overlap check needs to\n        // make use of NZCV, we need to save it. This can be avoided with\n        // ARMv9.6+'s FEAT_CMPBR, but alas, we don't have access to that right now.\n        //\n        // NOTE: That we need to temporarily trash TMP1 and restore it after the\n        //       comparison.\n        ARMEmitter::ForwardLabel OverlapCase;\n        mrs(TMP4, ARMEmitter::SystemRegister::NZCV);\n        sub(ARMEmitter::Size::i64Bit, TMP1, TMP2, TMP3);\n        cmp(ARMEmitter::Size::i64Bit, TMP1, Length.X());\n        mov(TMP1, Length.X());\n        (void)bc(ARMEmitter::Condition::CC_LT, &OverlapCase);\n\n        // If doing something larger than a byte copy, then we need to scale\n        // the counter value accordingly to convert it to bytes.\n        if (Size > 1) {\n          lsl(ARMEmitter::Size::i64Bit, TMP1, TMP1, FEXCore::ilog2(Size));\n        }\n\n        // Adjust addresses so that we treat the backward copy as a forward copy\n        if (IsBackwards) {\n          sub(ARMEmitter::Size::i64Bit, TMP2, TMP2, TMP1);\n          sub(ARMEmitter::Size::i64Bit, TMP3, TMP3, TMP1);\n          add(ARMEmitter::Size::i64Bit, TMP2, TMP2, Size);\n          add(ARMEmitter::Size::i64Bit, TMP3, TMP3, Size);\n        }\n\n        // Unfortunately copy operations fiddle with NZCV, so we need to preserve it.\n        cpyfp(TMP2, TMP3, TMP1);\n        cpyfm(TMP2, TMP3, TMP1);\n        cpyfe(TMP2, TMP3, TMP1);\n        msr(ARMEmitter::SystemRegister::NZCV, TMP4);\n\n        (void)b(&DoneInternal);\n\n        // Turns out we overlap and need to fall back. Make sure to restore NZCV.\n        (void)Bind(&OverlapCase);\n        msr(ARMEmitter::SystemRegister::NZCV, TMP4);\n      }\n\n      ARMEmitter::ForwardLabel AbsPos {};\n      ARMEmitter::ForwardLabel AgainInternal256Exit {};\n      ARMEmitter::ForwardLabel AgainInternal128Exit {};\n      ARMEmitter::BackwardLabel AgainInternal128 {};\n      ARMEmitter::BackwardLabel AgainInternal256 {};\n\n      sub(ARMEmitter::Size::i64Bit, TMP4, TMP2, TMP3);\n      (void)tbz(TMP4, 63, &AbsPos);\n      neg(ARMEmitter::Size::i64Bit, TMP4, TMP4);\n      (void)Bind(&AbsPos);\n      sub(ARMEmitter::Size::i64Bit, TMP4, TMP4, 32);\n      (void)tbnz(TMP4, 63, &AgainInternal);\n\n      if (IsBackwards) {\n        sub(ARMEmitter::Size::i64Bit, TMP2, TMP2, 32 - Size);\n        sub(ARMEmitter::Size::i64Bit, TMP3, TMP3, 32 - Size);\n      }\n\n      // Keep the counter one copy ahead, so that underflow can be used to detect when to fallback\n      // to the copy unit size copy loop for the last chunk.\n      // Do this in two parts, to fallback to the byte by byte loop if size < 32, and to the\n      // single copy loop if size < 64.\n      sub(ARMEmitter::Size::i64Bit, TMP1, TMP1, 32 / Size);\n      (void)tbnz(TMP1, 63, &AgainInternal128Exit);\n      sub(ARMEmitter::Size::i64Bit, TMP1, TMP1, 32 / Size);\n      (void)tbnz(TMP1, 63, &AgainInternal256Exit);\n\n      (void)Bind(&AgainInternal256);\n      MemCpy(32, 32 * Direction);\n      MemCpy(32, 32 * Direction);\n      sub(ARMEmitter::Size::i64Bit, TMP1, TMP1, 64 / Size);\n      (void)tbz(TMP1, 63, &AgainInternal256);\n\n      (void)Bind(&AgainInternal256Exit);\n      add(ARMEmitter::Size::i64Bit, TMP1, TMP1, 64 / Size);\n      (void)cbz(ARMEmitter::Size::i64Bit, TMP1, &DoneInternal);\n\n      sub(ARMEmitter::Size::i64Bit, TMP1, TMP1, 32 / Size);\n      (void)tbnz(TMP1, 63, &AgainInternal128Exit);\n      (void)Bind(&AgainInternal128);\n      MemCpy(32, 32 * Direction);\n      sub(ARMEmitter::Size::i64Bit, TMP1, TMP1, 32 / Size);\n      (void)tbz(TMP1, 63, &AgainInternal128);\n\n      (void)Bind(&AgainInternal128Exit);\n      add(ARMEmitter::Size::i64Bit, TMP1, TMP1, 32 / Size);\n      (void)cbz(ARMEmitter::Size::i64Bit, TMP1, &DoneInternal);\n\n      if (IsBackwards) {\n        add(ARMEmitter::Size::i64Bit, TMP2, TMP2, 32 - Size);\n        add(ARMEmitter::Size::i64Bit, TMP3, TMP3, 32 - Size);\n      }\n    }\n\n    (void)Bind(&AgainInternal);\n    if (IsAtomic) {\n      MemCpyTSO(Size, SizeDirection);\n    } else {\n      MemCpy(Size, SizeDirection);\n    }\n    sub(ARMEmitter::Size::i64Bit, TMP1, TMP1, 1);\n    (void)cbnz(ARMEmitter::Size::i64Bit, TMP1, &AgainInternal);\n\n    (void)Bind(&DoneInternal);\n\n    // Needs to use temporaries just in case of overwrite\n    mov(TMP1, MemRegDest.X());\n    mov(TMP2, MemRegSrc.X());\n    mov(TMP3, Length.X());\n\n    FinalizeAddresses();\n  };\n\n  if (DirectionIsInline) {\n    LOGMAN_THROW_A_FMT(DirectionConstant == 1 || DirectionConstant == -1, \"unexpected direction\");\n    EmitMemcpy(DirectionConstant);\n  } else {\n    // Emit forward direction memcpy then backward direction memcpy.\n    for (int32_t Direction : {1, -1}) {\n      EmitMemcpy(Direction);\n      if (Direction == 1) {\n        (void)b(&Done);\n        (void)Bind(&BackwardImpl);\n      }\n    }\n    (void)Bind(&Done);\n    // Destination already set to the final pointer.\n  }\n}\n\nDEF_OP(CacheLineClear) {\n  if (!CTX->HostFeatures.SupportsCacheMaintenanceOps) {\n    dmb(ARMEmitter::BarrierScope::SY);\n    return;\n  }\n\n  auto Op = IROp->C<IR::IROp_CacheLineClear>();\n\n  auto MemReg = GetReg(Op->Addr);\n\n  // Clear dcache only\n  // icache doesn't matter here since the guest application shouldn't be calling clflush on JIT code.\n  if (CTX->HostFeatures.DCacheLineSize >= 64U) {\n    dc(ARMEmitter::DataCacheOperation::CIVAC, MemReg);\n  } else {\n    auto CurrentWorkingReg = MemReg.X();\n    for (size_t i = 0; i < std::max(1U, CTX->HostFeatures.DCacheLineSize / 64U); ++i) {\n      dc(ARMEmitter::DataCacheOperation::CIVAC, TMP1);\n      add(ARMEmitter::Size::i64Bit, TMP1, CurrentWorkingReg, CTX->HostFeatures.DCacheLineSize);\n      CurrentWorkingReg = TMP1;\n    }\n  }\n\n  if (Op->Serialize) {\n    // If requested, serialized all of the data cache operations.\n    dsb(ARMEmitter::BarrierScope::ISH);\n  }\n}\n\nDEF_OP(CacheLineClean) {\n  if (!CTX->HostFeatures.SupportsCacheMaintenanceOps) {\n    dmb(ARMEmitter::BarrierScope::ST);\n    return;\n  }\n\n  auto Op = IROp->C<IR::IROp_CacheLineClean>();\n\n  auto MemReg = GetReg(Op->Addr);\n\n  // Clean dcache only\n  if (CTX->HostFeatures.DCacheLineSize >= 64U) {\n    dc(ARMEmitter::DataCacheOperation::CVAC, MemReg);\n  } else {\n    auto CurrentWorkingReg = MemReg.X();\n    for (size_t i = 0; i < std::max(1U, CTX->HostFeatures.DCacheLineSize / 64U); ++i) {\n      dc(ARMEmitter::DataCacheOperation::CVAC, TMP1);\n      add(ARMEmitter::Size::i64Bit, TMP1, CurrentWorkingReg, CTX->HostFeatures.DCacheLineSize);\n      CurrentWorkingReg = TMP1;\n    }\n  }\n}\n\nDEF_OP(CacheLineZero) {\n  auto Op = IROp->C<IR::IROp_CacheLineZero>();\n\n  auto MemReg = GetReg(Op->Addr);\n\n  if (CTX->HostFeatures.SupportsCLZERO) {\n    // We can use this instruction directly\n    dc(ARMEmitter::DataCacheOperation::ZVA, MemReg);\n  } else {\n    // We must walk the cacheline ourselves\n    // Force cacheline alignment\n    and_(ARMEmitter::Size::i64Bit, TMP1, MemReg, ~(CPUIDEmu::CACHELINE_SIZE - 1));\n    // This will end up being four STPs\n    // Depending on uarch it could be slightly more efficient in instructions emitted\n    // and uops to use vector pair STP, but we want the non-temporal bit specifically here\n    for (size_t i = 0; i < CPUIDEmu::CACHELINE_SIZE; i += 16) {\n      stnp(ARMEmitter::XReg::zr, ARMEmitter::XReg::zr, TMP1, i);\n    }\n  }\n}\n\nDEF_OP(Prefetch) {\n  auto Op = IROp->C<IR::IROp_Prefetch>();\n  const auto MemReg = GetReg(Op->Addr);\n\n  // Access size is only ever handled as 8-byte. Even though it is accesssed as a cacheline.\n  const auto MemSrc = GenerateMemOperand(IR::OpSize::i64Bit, MemReg, Op->Offset, Op->OffsetType, Op->OffsetScale);\n\n  size_t LUT = (Op->Stream ? 1 : 0) | ((Op->CacheLevel - 1) << 1) | (Op->ForStore ? 1U << 3 : 0);\n\n  constexpr static std::array<ARMEmitter::Prefetch, 14> PrefetchType = {\n    ARMEmitter::Prefetch::PLDL1KEEP,\n    ARMEmitter::Prefetch::PLDL1STRM,\n\n    ARMEmitter::Prefetch::PLDL2KEEP,\n    ARMEmitter::Prefetch::PLDL2STRM,\n\n    ARMEmitter::Prefetch::PLDL3KEEP,\n    ARMEmitter::Prefetch::PLDL3STRM,\n\n    // Gap of two.\n    // 0b0'11'0\n    ARMEmitter::Prefetch::PLDL1STRM,\n    // 0b0'11'1\n    ARMEmitter::Prefetch::PLDL1STRM,\n\n    ARMEmitter::Prefetch::PSTL1KEEP,\n    ARMEmitter::Prefetch::PSTL1STRM,\n\n    ARMEmitter::Prefetch::PSTL2KEEP,\n    ARMEmitter::Prefetch::PSTL2STRM,\n\n    ARMEmitter::Prefetch::PSTL3KEEP,\n    ARMEmitter::Prefetch::PSTL3STRM,\n  };\n\n  prfm(PrefetchType[LUT], MemSrc);\n}\n\nDEF_OP(VStoreNonTemporal) {\n  const auto Op = IROp->C<IR::IROp_VStoreNonTemporal>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n  const auto Is128Bit = OpSize == IR::OpSize::i128Bit;\n\n  const auto Value = GetVReg(Op->Value);\n  const auto MemReg = GetReg(Op->Addr);\n  const auto Offset = Op->Offset;\n\n  if (Is256Bit) {\n    const auto GoverningPredicate = PRED_TMP_32B.Zeroing();\n    const auto OffsetScaled = Offset / 32;\n    stnt1b(Value.Z(), GoverningPredicate, MemReg, OffsetScaled);\n  } else if (Is128Bit && HostSupportsSVE128) {\n    const auto GoverningPredicate = PRED_TMP_16B.Zeroing();\n    const auto OffsetScaled = Offset / 16;\n    stnt1b(Value.Z(), GoverningPredicate, MemReg, OffsetScaled);\n  } else {\n    // Treat the non-temporal store as a regular vector store in this case for compatibility\n    str(Value.Q(), MemReg, Offset);\n  }\n}\n\nDEF_OP(VStoreNonTemporalPair) {\n  const auto Op = IROp->C<IR::IROp_VStoreNonTemporalPair>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is128Bit = OpSize == IR::OpSize::i128Bit;\n  LOGMAN_THROW_A_FMT(Is128Bit, \"This IR operation only operates at 128-bit wide\");\n\n  const auto ValueLow = GetVReg(Op->ValueLow);\n  const auto ValueHigh = GetVReg(Op->ValueHigh);\n\n  const auto MemReg = GetReg(Op->Addr);\n  const auto Offset = Op->Offset;\n\n  stnp(ValueLow.Q(), ValueHigh.Q(), MemReg, Offset);\n}\n\nDEF_OP(VLoadNonTemporal) {\n  const auto Op = IROp->C<IR::IROp_VLoadNonTemporal>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n  const auto Is128Bit = OpSize == IR::OpSize::i128Bit;\n\n  const auto Dst = GetVReg(Node);\n  const auto MemReg = GetReg(Op->Addr);\n  const auto Offset = Op->Offset;\n\n  if (Is256Bit) {\n    const auto GoverningPredicate = PRED_TMP_32B.Zeroing();\n    const auto OffsetScaled = Offset / 32;\n    ldnt1b(Dst.Z(), GoverningPredicate, MemReg, OffsetScaled);\n  } else if (Is128Bit && HostSupportsSVE128) {\n    const auto GoverningPredicate = PRED_TMP_16B.Zeroing();\n    const auto OffsetScaled = Offset / 16;\n    ldnt1b(Dst.Z(), GoverningPredicate, MemReg, OffsetScaled);\n  } else {\n    // Treat the non-temporal store as a regular vector store in this case for compatibility\n    ldr(Dst.Q(), MemReg, Offset);\n  }\n}\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/JIT/MiscOps.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: backend|arm64\n$end_info$\n*/\n\n#ifndef _WIN32\n#include <syscall.h>\n#endif\n\n#include \"Interface/Context/Context.h\"\n#include \"Interface/Core/JIT/DebugData.h\"\n#include \"Interface/Core/JIT/JITClass.h\"\n\n#include <FEXCore/Core/SignalDelegator.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/Utils/EnumUtils.h>\n\nnamespace FEXCore::CPU {\n\nDEF_OP(WFET) {\n  auto Op = IROp->C<IR::IROp_WFET>();\n  const auto Lower = GetReg(Op->Lower);\n  const auto Upper = GetReg(Op->Upper);\n\n  // Combine registers.\n  mov(ARMEmitter::Size::i64Bit, TMP1, Lower);\n  bfi(ARMEmitter::Size::i64Bit, TMP1, Upper, 32, 32);\n  if (CTX->Config.TSCScale) {\n    // Scale back to ARM64 TSC scale if necessary\n    lsr(ARMEmitter::Size::i64Bit, TMP1, TMP1, CTX->Config.TSCScale);\n  }\n\n  // Clear the exclusive monitor so it can't spuriously wake up with that event.\n  clrex();\n\n  // Execute wfet to wait until the TSC.\n  wfet(TMP1);\n}\n\nDEF_OP(GuestOpcode) {\n  auto Op = IROp->C<IR::IROp_GuestOpcode>();\n  // metadata\n  DebugData->GuestOpcodes.push_back({Op->GuestEntryOffset, GetCursorAddress<uint8_t*>() - CodeData.BlockBegin});\n}\n\nDEF_OP(Fence) {\n  auto Op = IROp->C<IR::IROp_Fence>();\n  switch (Op->Fence) {\n  case IR::FenceType::Load: dmb(ARMEmitter::BarrierScope::LD); break;\n  case IR::FenceType::LoadStore: dmb(ARMEmitter::BarrierScope::SY); break;\n  case IR::FenceType::Store: dmb(ARMEmitter::BarrierScope::ST); break;\n  case IR::FenceType::Inst: isb(); break;\n  default: LOGMAN_MSG_A_FMT(\"Unknown Fence: {}\", Op->Fence); break;\n  }\n}\n\nDEF_OP(Break) {\n  auto Op = IROp->C<IR::IROp_Break>();\n\n  // First we must reset the stack\n  ResetStack();\n\n  Core::CpuStateFrame::SynchronousFaultDataStruct State = {\n    .FaultToTopAndGeneratedException = 1,\n    .Signal = Op->Reason.Signal,\n    .TrapNo = Op->Reason.TrapNumber,\n    .si_code = Op->Reason.si_code,\n    .err_code = Op->Reason.ErrorRegister,\n  };\n\n  uint64_t Constant {};\n  memcpy(&Constant, &State, sizeof(State));\n\n  LoadConstant(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r1, Constant);\n  str(ARMEmitter::XReg::x1, STATE, offsetof(FEXCore::Core::CpuStateFrame, SynchronousFaultData));\n\n  switch (Op->Reason.Signal) {\n  case Core::FAULT_SIGILL:\n    ldr(TMP1, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.GuestSignal_SIGILL));\n    br(TMP1);\n    break;\n  case Core::FAULT_SIGTRAP:\n    ldr(TMP1, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.GuestSignal_SIGTRAP));\n    br(TMP1);\n    break;\n  case Core::FAULT_SIGSEGV:\n    ldr(TMP1, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.GuestSignal_SIGSEGV));\n    br(TMP1);\n    break;\n  default:\n    ldr(TMP1, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.GuestSignal_SIGTRAP));\n    br(TMP1);\n    break;\n  }\n}\n\nDEF_OP(GetRoundingMode) {\n  auto Dst = GetReg(Node);\n  mrs(Dst, ARMEmitter::SystemRegister::FPCR);\n  ubfx(ARMEmitter::Size::i64Bit, Dst, Dst, 22, 3);\n\n  // FTZ is already in the correct location\n  // Rounding mode is different\n  //\n  // Need to remap rounding mode from order nearest, pos inf, neg inf, toward\n  // zero. Just swapping 01 and 10. That's a bitfield reverse. Round mode is in\n  // bottom two bits. After reversing as a 32-bit operation, it'll be in [31:30]\n  // and ripe for reinsertion back at 0.\n  static_assert(FEXCore::ToUnderlying(IR::RoundMode::Nearest) == 0);\n  static_assert(FEXCore::ToUnderlying(IR::RoundMode::NegInfinity) == 1);\n  static_assert(FEXCore::ToUnderlying(IR::RoundMode::PosInfinity) == 2);\n  static_assert(FEXCore::ToUnderlying(IR::RoundMode::TowardsZero) == 3);\n\n  rbit(ARMEmitter::Size::i32Bit, TMP1, Dst);\n  bfi(ARMEmitter::Size::i64Bit, Dst, TMP1, 30, 2);\n}\n\nDEF_OP(SetRoundingMode) {\n  auto Op = IROp->C<IR::IROp_SetRoundingMode>();\n  auto Src = GetReg(Op->RoundMode);\n  auto MXCSR = GetReg(Op->MXCSR);\n\n  // As above, setup the rounding flags in [31:30]\n  rbit(ARMEmitter::Size::i32Bit, TMP2, Src);\n  // and extract\n  lsr(ARMEmitter::Size::i32Bit, TMP2, TMP2, 30);\n\n  mrs(TMP1, ARMEmitter::SystemRegister::FPCR);\n\n  // vixl simulator doesn't support anything beyond ties-to-even rounding\n  if (CTX->Config.DisableVixlIndirectCalls) [[likely]] {\n    // Insert the rounding flags\n    bfi(ARMEmitter::Size::i64Bit, TMP1, TMP2, 22, 2);\n  }\n\n  // Insert the FTZ flag\n  lsr(ARMEmitter::Size::i64Bit, TMP2, Src, 2);\n  bfi(ARMEmitter::Size::i64Bit, TMP1, TMP2, 24, 1);\n\n  if (Op->SetDAZ && HostSupportsAFP) {\n    // Extract DAZ from MXCSR and insert to in FPCR.FIZ\n    bfxil(ARMEmitter::Size::i64Bit, TMP1, MXCSR, 6, 1);\n  }\n\n  // Now save the new FPCR\n  msr(ARMEmitter::SystemRegister::FPCR, TMP1);\n}\n\nDEF_OP(PushRoundingMode) {\n  auto Op = IROp->C<IR::IROp_PushRoundingMode>();\n  auto Dest = GetReg(Node);\n\n  // Save the old rounding mode\n  mrs(Dest, ARMEmitter::SystemRegister::FPCR);\n\n  // vixl simulator doesn't support anything beyond ties-to-even rounding\n  if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n    return;\n  }\n\n  // Insert the rounding flags, reversing the mode bits as above\n  if (Op->RoundMode == 3) {\n    orr(ARMEmitter::Size::i64Bit, TMP1, Dest, 3 << 22);\n  } else if (Op->RoundMode == 0) {\n    and_(ARMEmitter::Size::i64Bit, TMP1, Dest, ~(3 << 22));\n  } else {\n    LOGMAN_THROW_A_FMT(Op->RoundMode == 1 || Op->RoundMode == 2, \"expect a valid round mode\");\n\n    and_(ARMEmitter::Size::i64Bit, TMP1, Dest, ~(Op->RoundMode << 22));\n    orr(ARMEmitter::Size::i64Bit, TMP1, TMP1, (Op->RoundMode == 2 ? 1 : 2) << 22);\n  }\n\n  // Now save the new FPCR\n  msr(ARMEmitter::SystemRegister::FPCR, TMP1);\n}\n\nDEF_OP(PopRoundingMode) {\n  auto Op = IROp->C<IR::IROp_PopRoundingMode>();\n  msr(ARMEmitter::SystemRegister::FPCR, GetReg(Op->FPCR));\n}\n\nDEF_OP(Print) {\n  auto Op = IROp->C<IR::IROp_Print>();\n\n  PushDynamicRegs(TMP1);\n  SpillStaticRegs(TMP1);\n\n  if (IsGPR(Op->Value)) {\n    mov(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r0, GetReg(Op->Value));\n    ldr(ARMEmitter::XReg::x3, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.PrintValue));\n  } else {\n    fmov(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r0, GetVReg(Op->Value), false);\n    fmov(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r1, GetVReg(Op->Value), true);\n    ldr(ARMEmitter::XReg::x3, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.PrintVectorValue));\n  }\n\n  if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n    if (IsGPR(Op->Value)) {\n      GenerateIndirectRuntimeCall<void, uint64_t>(ARMEmitter::Reg::r3);\n    } else {\n      GenerateIndirectRuntimeCall<void, uint64_t, uint64_t>(ARMEmitter::Reg::r3);\n    }\n  } else {\n    blr(ARMEmitter::Reg::r3);\n  }\n\n  FillStaticRegs();\n  PopDynamicRegs();\n}\n\nDEF_OP(ProcessorID) {\n  if (CTX->HostFeatures.SupportsCPUIndexInTPIDRRO) {\n    mrs(GetReg(Node), ARMEmitter::SystemRegister::TPIDRRO_EL0);\n    return;\n  }\n#ifdef _WIN32\n  else {\n    // If on Windows and TPIDRRO isn't supported (like in wine), then this is a programming error.\n    ERROR_AND_DIE_FMT(\"Unsupported\");\n  }\n#else\n  // We always need to spill x8 since we can't know if it is live at this SSA location\n  uint32_t SpillMask = 1U << 8;\n\n  // Ordering is incredibly important here\n  // We must spill any overlapping registers first THEN claim we are in a syscall without invalidating state at all\n  // Only spill the registers that intersect with our usage\n  SpillStaticRegs(TMP1, {\n                          .GPRSpillMask = SpillMask,\n                          .FPRs = false,\n                        });\n\n  // Now that we are spilled, store in the state that we are in a syscall\n  // Still without overwriting registers that matter\n  // 16bit LoadConstant to be a single instruction\n  // We must always spill at least one register (x8) so this value always has a bit set\n  // This gives the signal handler a value to check to see if we are in a syscall at all\n  LoadConstant(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r0, SpillMask & 0xFFFF);\n  str(ARMEmitter::XReg::x0, STATE, offsetof(FEXCore::Core::CpuStateFrame, InSyscallInfo));\n\n  // Allocate some temporary space for storing the uint32_t CPU and Node IDs\n  sub(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, ARMEmitter::Reg::rsp, 16);\n\n  // Load the getcpu syscall number\n#if defined(ARCHITECTURE_x86_64)\n  // Just to ensure the syscall number doesn't change if compiled for an x86_64 host.\n  constexpr auto GetCPUSyscallNum = 0xa8;\n#else\n  constexpr auto GetCPUSyscallNum = SYS_getcpu;\n#endif\n  LoadConstant(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r8, GetCPUSyscallNum);\n\n  // CPU pointer in x0\n  add(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r0, ARMEmitter::Reg::rsp, 0);\n  // Node in x1\n  add(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r1, ARMEmitter::Reg::rsp, 4);\n\n  svc(0);\n  // On updated signal mask we can receive a signal RIGHT HERE\n\n  // Load the values returned by the kernel\n  ldp<ARMEmitter::IndexType::OFFSET>(ARMEmitter::WReg::w0, ARMEmitter::WReg::w1, ARMEmitter::Reg::rsp);\n  // Deallocate stack space\n  sub(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, ARMEmitter::Reg::rsp, 16);\n\n  // Now that we are done in the syscall we need to carefully peel back the state\n  // First unspill the registers from before\n\n  FillStaticRegs({\n    .OptionalReg = ARMEmitter::Reg::r8,\n    .OptionalReg2 = ARMEmitter::Reg::r2,\n    .GPRFillMask = SpillMask,\n    .FPRs = false,\n  });\n\n  // Now the registers we've spilled are back in their original host registers\n  // We can safely claim we are no longer in a syscall\n  str(ARMEmitter::XReg::zr, STATE, offsetof(FEXCore::Core::CpuStateFrame, InSyscallInfo));\n\n  // Now store the result in the destination in the expected format\n  // uint32_t Res = (node << 12) | cpu;\n  // CPU is in w0\n  // Node is in w1\n  orr(ARMEmitter::Size::i64Bit, GetReg(Node), ARMEmitter::Reg::r0, ARMEmitter::Reg::r1, ARMEmitter::ShiftType::LSL, 12);\n#endif\n}\n\nDEF_OP(RDRAND) {\n  auto Op = IROp->C<IR::IROp_RDRAND>();\n\n  mrs(GetReg(Node), Op->GetReseeded ? ARMEmitter::SystemRegister::RNDRRS : ARMEmitter::SystemRegister::RNDR);\n}\n\nDEF_OP(Yield) {\n  yield();\n}\n\nDEF_OP(MonoBackpatcherWrite) {\n  auto Op = IROp->C<IR::IROp_MonoBackpatcherWrite>();\n\n  mov(ARMEmitter::Size::i64Bit, TMP3, GetReg(Op->Addr));\n  mov(ARMEmitter::Size::i64Bit, TMP4, GetReg(Op->Value));\n\n  PushDynamicRegs(TMP1);\n  SpillStaticRegs(TMP1);\n\n  mov(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r0, STATE.R());\n  mov(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r1, IR::OpSizeToSize(Op->Size));\n\n  if (!TMP_ABIARGS) {\n    mov(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r2, TMP3);\n    mov(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::r3, TMP4);\n  }\n\n#ifdef ARCHITECTURE_arm64ec\n  ldr(TMP2, ARMEmitter::XReg::x18, TEB_CPU_AREA_OFFSET);\n  LoadConstant(ARMEmitter::Size::i32Bit, TMP1, 1);\n  strb(TMP1.W(), TMP2, CPU_AREA_IN_SYSCALL_CALLBACK_OFFSET);\n#endif\n\n  ldr(ARMEmitter::XReg::x4, STATE, offsetof(FEXCore::Core::CpuStateFrame, Pointers.MonoBackpatcherWrite));\n  if (!CTX->Config.DisableVixlIndirectCalls) [[unlikely]] {\n    GenerateIndirectRuntimeCall<void, void*, uint8_t, uint64_t, uint64_t>(ARMEmitter::Reg::r4);\n  } else {\n    blr(ARMEmitter::Reg::r4);\n  }\n\n#ifdef ARCHITECTURE_arm64ec\n  ldr(TMP2, ARMEmitter::XReg::x18, TEB_CPU_AREA_OFFSET);\n  strb(ARMEmitter::WReg::zr, TMP2, CPU_AREA_IN_SYSCALL_CALLBACK_OFFSET);\n#endif\n\n  FillStaticRegs();\n  PopDynamicRegs();\n}\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/JIT/MoveOps.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: backend|arm64\n$end_info$\n*/\n\n#include \"Interface/Core/JIT/JITClass.h\"\n\nnamespace FEXCore::CPU {\nDEF_OP(Copy) {\n  auto Op = IROp->C<IR::IROp_Copy>();\n\n  mov(ARMEmitter::Size::i64Bit, GetReg(Node), GetReg(Op->Source));\n}\n\nDEF_OP(RMWHandle) {\n  mov(ARMEmitter::Size::i64Bit, GetReg(Node), GetReg(IROp->Args[0]));\n}\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/JIT/Relocations.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n\nnamespace FEXCore::Context {\nclass ContextImpl;\n}\n\nnamespace FEXCore::CPU {\nenum class RelocationTypes : uint32_t {\n  // 8 byte literal in memory for symbol\n  // Aligned to struct RelocNamedSymbolLiteral\n  RELOC_NAMED_SYMBOL_LITERAL,\n\n  // Fixed size named thunk move\n  // 4 instruction constant generation\n  // Aligned to struct RelocNamedThunkMove\n  RELOC_NAMED_THUNK_MOVE,\n\n  // 8 byte literal (relative to binary base address)\n  RELOC_GUEST_RIP_LITERAL,\n\n  // Fixed size guest RIP move\n  // 4 instruction constant generation\n  // Aligned to struct RelocGuestRIP\n  RELOC_GUEST_RIP_MOVE,\n};\n\nstruct FEX_PACKED RelocationHeader final {\n  // Offset to the relocated host code data\n  uint64_t Offset {};\n\n  RelocationTypes Type;\n};\n\nstruct RelocNamedSymbolLiteral final {\n  enum class NamedSymbol : uint32_t {\n    ///< Thread specific relocations\n    // JIT Literal pointers\n    SYMBOL_LITERAL_EXITFUNCTION_LINKER,\n  };\n\n  RelocationHeader Header {};\n\n  NamedSymbol Symbol;\n\n  uint32_t Pad[8];\n};\n\nstruct RelocNamedThunkMove final {\n  RelocationHeader Header {};\n\n  // GPR index the constant is being moved to\n  uint32_t RegisterIndex;\n\n  // The thunk SHA256 hash\n  IR::SHA256Sum Symbol;\n};\n\nstruct RelocGuestRIP final {\n  RelocationHeader Header {};\n\n  // GPR index the constant is being moved to (for non-literal relocations)\n  uint8_t RegisterIndex;\n\n  char Pad[3];\n\n  // The base RIP (to be moved by the register for non-literal relocations).\n  // In a serialized code cache, this is relative to the binary base address.\n  uint64_t GuestRIP;\n\n  uint32_t pad2[6] {};\n};\n\nunion Relocation {\n  // Clang 16 Can't default-initialize this union\n  static Relocation Default() {\n#if __clang_major__ < 17\n    Relocation Ret {.Header {}};\n    memset(&Ret, 0, sizeof(Ret));\n    return Ret;\n#else\n    return {};\n#endif\n  }\n\n  RelocationHeader Header {};\n\n  RelocNamedSymbolLiteral NamedSymbolLiteral;\n  // This makes our union of relocations at least 48 bytes\n  // It might be more efficient to not use a union\n  RelocNamedThunkMove NamedThunkMove;\n\n  RelocGuestRIP GuestRIP;\n};\n\nuint64_t GetNamedSymbolLiteral(FEXCore::Context::ContextImpl&, RelocNamedSymbolLiteral::NamedSymbol);\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/JIT/VectorOps.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: backend|arm64\n$end_info$\n*/\n\n#include \"Interface/Core/Dispatcher/Dispatcher.h\"\n#include \"Interface/Core/JIT/JITClass.h\"\n\n#include <FEXCore/Utils/MathUtils.h>\n\nnamespace FEXCore::CPU {\n\n#define DEF_UNOP(FEXOp, ARMOp, ScalarCase)                                                                                          \\\n  DEF_OP(FEXOp) {                                                                                                                   \\\n    const auto Op = IROp->C<IR::IROp_##FEXOp>();                                                                                    \\\n    const auto OpSize = IROp->Size;                                                                                                 \\\n                                                                                                                                    \\\n    const auto ElementSize = Op->Header.ElementSize;                                                                                \\\n    const auto Is256Bit = OpSize == IR::OpSize::i256Bit;                                                                            \\\n    LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__); \\\n    const auto SubRegSize = ConvertSubRegSize8(IROp);                                                                               \\\n                                                                                                                                    \\\n    const auto Dst = GetVReg(Node);                                                                                                 \\\n    const auto Src = GetVReg(Op->Vector);                                                                                           \\\n                                                                                                                                    \\\n    if (HostSupportsSVE256 && Is256Bit) {                                                                                           \\\n      ARMOp(SubRegSize, Dst.Z(), PRED_TMP_32B.Merging(), Src.Z());                                                                  \\\n    } else {                                                                                                                        \\\n      if (ElementSize == OpSize && ScalarCase) {                                                                                    \\\n        ARMOp(SubRegSize, Dst.D(), Src.D());                                                                                        \\\n      } else {                                                                                                                      \\\n        ARMOp(SubRegSize, Dst.Q(), Src.Q());                                                                                        \\\n      }                                                                                                                             \\\n    }                                                                                                                               \\\n  }\n\n#define DEF_BITOP(FEXOp, ARMOp)                                                                                                     \\\n  DEF_OP(FEXOp) {                                                                                                                   \\\n    const auto Op = IROp->C<IR::IROp_##FEXOp>();                                                                                    \\\n    const auto OpSize = IROp->Size;                                                                                                 \\\n    const auto Is256Bit = OpSize == IR::OpSize::i256Bit;                                                                            \\\n    const auto Is128Bit = OpSize == IR::OpSize::i128Bit;                                                                            \\\n    LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__); \\\n                                                                                                                                    \\\n    const auto Dst = GetVReg(Node);                                                                                                 \\\n    const auto Vector1 = GetVReg(Op->Vector1);                                                                                      \\\n    const auto Vector2 = GetVReg(Op->Vector2);                                                                                      \\\n                                                                                                                                    \\\n    if (HostSupportsSVE256 && Is256Bit) {                                                                                           \\\n      ARMOp(Dst.Z(), Vector1.Z(), Vector2.Z());                                                                                     \\\n    } else if (Is128Bit) {                                                                                                          \\\n      ARMOp(Dst.Q(), Vector1.Q(), Vector2.Q());                                                                                     \\\n    } else {                                                                                                                        \\\n      ARMOp(Dst.D(), Vector1.D(), Vector2.D());                                                                                     \\\n    }                                                                                                                               \\\n  }\n\n#define DEF_BINOP(FEXOp, ARMOp)                                                                                                     \\\n  DEF_OP(FEXOp) {                                                                                                                   \\\n    const auto Op = IROp->C<IR::IROp_##FEXOp>();                                                                                    \\\n    const auto OpSize = IROp->Size;                                                                                                 \\\n                                                                                                                                    \\\n    const auto Is256Bit = OpSize == IR::OpSize::i256Bit;                                                                            \\\n    LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__); \\\n    const auto SubRegSize = ConvertSubRegSize8(IROp);                                                                               \\\n                                                                                                                                    \\\n    const auto Dst = GetVReg(Node);                                                                                                 \\\n    const auto Vector1 = GetVReg(Op->Vector1);                                                                                      \\\n    const auto Vector2 = GetVReg(Op->Vector2);                                                                                      \\\n                                                                                                                                    \\\n    if (HostSupportsSVE256 && Is256Bit) {                                                                                           \\\n      ARMOp(SubRegSize, Dst.Z(), Vector1.Z(), Vector2.Z());                                                                         \\\n    } else {                                                                                                                        \\\n      ARMOp(SubRegSize, Dst.Q(), Vector1.Q(), Vector2.Q());                                                                         \\\n    }                                                                                                                               \\\n  }\n\n#define DEF_ZIPOP(FEXOp, ARMOp)                                                                                                     \\\n  DEF_OP(FEXOp) {                                                                                                                   \\\n    const auto Op = IROp->C<IR::IROp_##FEXOp>();                                                                                    \\\n    const auto OpSize = IROp->Size;                                                                                                 \\\n                                                                                                                                    \\\n    const auto SubRegSize = ConvertSubRegSize8(IROp);                                                                               \\\n    const auto Is256Bit = OpSize == IR::OpSize::i256Bit;                                                                            \\\n    LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__); \\\n                                                                                                                                    \\\n    const auto Dst = GetVReg(Node);                                                                                                 \\\n    const auto VectorLower = GetVReg(Op->VectorLower);                                                                              \\\n    const auto VectorUpper = GetVReg(Op->VectorUpper);                                                                              \\\n                                                                                                                                    \\\n    if (HostSupportsSVE256 && Is256Bit) {                                                                                           \\\n      ARMOp(SubRegSize, Dst.Z(), VectorLower.Z(), VectorUpper.Z());                                                                 \\\n    } else {                                                                                                                        \\\n      if (OpSize == IR::OpSize::i64Bit) {                                                                                           \\\n        ARMOp(SubRegSize, Dst.D(), VectorLower.D(), VectorUpper.D());                                                               \\\n      } else {                                                                                                                      \\\n        ARMOp(SubRegSize, Dst.Q(), VectorLower.Q(), VectorUpper.Q());                                                               \\\n      }                                                                                                                             \\\n    }                                                                                                                               \\\n  }\n\n#define DEF_FUNOP(FEXOp, ARMOp)                                                                                                     \\\n  DEF_OP(FEXOp) {                                                                                                                   \\\n    const auto Op = IROp->C<IR::IROp_##FEXOp>();                                                                                    \\\n    const auto OpSize = IROp->Size;                                                                                                 \\\n                                                                                                                                    \\\n    const auto ElementSize = Op->Header.ElementSize;                                                                                \\\n    const auto SubRegSize = ConvertSubRegSize248(IROp);                                                                             \\\n    const auto Is256Bit = OpSize == IR::OpSize::i256Bit;                                                                            \\\n    LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__); \\\n                                                                                                                                    \\\n    const auto Dst = GetVReg(Node);                                                                                                 \\\n    const auto Src = GetVReg(Op->Vector);                                                                                           \\\n                                                                                                                                    \\\n    if (HostSupportsSVE256 && Is256Bit) {                                                                                           \\\n      ARMOp(SubRegSize, Dst.Z(), PRED_TMP_32B.Merging(), Src.Z());                                                                  \\\n    } else {                                                                                                                        \\\n      if (ElementSize == OpSize) {                                                                                                  \\\n        switch (ElementSize) {                                                                                                      \\\n        case IR::OpSize::i16Bit: {                                                                                                  \\\n          ARMOp(Dst.H(), Src.H());                                                                                                  \\\n          break;                                                                                                                    \\\n        }                                                                                                                           \\\n        case IR::OpSize::i32Bit: {                                                                                                  \\\n          ARMOp(Dst.S(), Src.S());                                                                                                  \\\n          break;                                                                                                                    \\\n        }                                                                                                                           \\\n        case IR::OpSize::i64Bit: {                                                                                                  \\\n          ARMOp(Dst.D(), Src.D());                                                                                                  \\\n          break;                                                                                                                    \\\n        }                                                                                                                           \\\n        default: break;                                                                                                             \\\n        }                                                                                                                           \\\n      } else {                                                                                                                      \\\n        ARMOp(SubRegSize, Dst.Q(), Src.Q());                                                                                        \\\n      }                                                                                                                             \\\n    }                                                                                                                               \\\n  }\n\n#define DEF_FBINOP(FEXOp, ARMOp)                                                                                                    \\\n  DEF_OP(FEXOp) {                                                                                                                   \\\n    const auto Op = IROp->C<IR::IROp_##FEXOp>();                                                                                    \\\n    const auto OpSize = IROp->Size;                                                                                                 \\\n                                                                                                                                    \\\n    const auto ElementSize = Op->Header.ElementSize;                                                                                \\\n    const auto SubRegSize = ConvertSubRegSize248(IROp);                                                                             \\\n    const auto Is256Bit = OpSize == IR::OpSize::i256Bit;                                                                            \\\n    LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__); \\\n    const auto IsScalar = ElementSize == OpSize;                                                                                    \\\n                                                                                                                                    \\\n    const auto Dst = GetVReg(Node);                                                                                                 \\\n    const auto Vector1 = GetVReg(Op->Vector1);                                                                                      \\\n    const auto Vector2 = GetVReg(Op->Vector2);                                                                                      \\\n                                                                                                                                    \\\n    if (HostSupportsSVE256 && Is256Bit) {                                                                                           \\\n      ARMOp(SubRegSize, Dst.Z(), Vector1.Z(), Vector2.Z());                                                                         \\\n    } else {                                                                                                                        \\\n      if (IsScalar) {                                                                                                               \\\n        switch (ElementSize) {                                                                                                      \\\n        case IR::OpSize::i16Bit: {                                                                                                  \\\n          ARMOp(Dst.H(), Vector1.H(), Vector2.H());                                                                                 \\\n          break;                                                                                                                    \\\n        }                                                                                                                           \\\n        case IR::OpSize::i32Bit: {                                                                                                  \\\n          ARMOp(Dst.S(), Vector1.S(), Vector2.S());                                                                                 \\\n          break;                                                                                                                    \\\n        }                                                                                                                           \\\n        case IR::OpSize::i64Bit: {                                                                                                  \\\n          ARMOp(Dst.D(), Vector1.D(), Vector2.D());                                                                                 \\\n          break;                                                                                                                    \\\n        }                                                                                                                           \\\n        default: break;                                                                                                             \\\n        }                                                                                                                           \\\n      } else {                                                                                                                      \\\n        ARMOp(SubRegSize, Dst.Q(), Vector1.Q(), Vector2.Q());                                                                       \\\n      }                                                                                                                             \\\n    }                                                                                                                               \\\n  }\n\n#define DEF_FBINOP_SCALAR_INSERT(FEXOp, ARMOp)                                                                                \\\n  DEF_OP(FEXOp) {                                                                                                             \\\n    const auto Op = IROp->C<IR::IROp_##FEXOp>();                                                                              \\\n    const auto ElementSize = Op->Header.ElementSize;                                                                          \\\n    const auto SubRegSize = ConvertSubRegSizePair248(IROp);                                                                   \\\n                                                                                                                              \\\n    auto ScalarEmit = [this, SubRegSize](ARMEmitter::VRegister Dst, ARMEmitter::VRegister Src1, ARMEmitter::VRegister Src2) { \\\n      ARMOp(SubRegSize.Scalar, Dst, Src1, Src2);                                                                              \\\n    };                                                                                                                        \\\n                                                                                                                              \\\n    const auto Dst = GetVReg(Node);                                                                                           \\\n    const auto Vector1 = GetVReg(Op->Vector1);                                                                                \\\n    const auto Vector2 = GetVReg(Op->Vector2);                                                                                \\\n                                                                                                                              \\\n    VFScalarOperation(IROp->Size, ElementSize, Op->ZeroUpperBits, ScalarEmit, Dst, Vector1, Vector2);                         \\\n  }\n\n#define DEF_FMAOP_SCALAR_INSERT(FEXOp, ARMOp)                                                                                \\\n  DEF_OP(FEXOp) {                                                                                                            \\\n    const auto Op = IROp->C<IR::IROp_##FEXOp>();                                                                             \\\n    const auto ElementSize = Op->Header.ElementSize;                                                                         \\\n                                                                                                                             \\\n    auto ScalarEmit = [this, ElementSize](ARMEmitter::VRegister Dst, ARMEmitter::VRegister Src1, ARMEmitter::VRegister Src2, \\\n                                          ARMEmitter::VRegister Src3) {                                                      \\\n      if (ElementSize == IR::OpSize::i16Bit) {                                                                               \\\n        ARMOp(Dst.H(), Src1.H(), Src2.H(), Src3.H());                                                                        \\\n      } else if (ElementSize == IR::OpSize::i32Bit) {                                                                        \\\n        ARMOp(Dst.S(), Src1.S(), Src2.S(), Src3.S());                                                                        \\\n      } else if (ElementSize == IR::OpSize::i64Bit) {                                                                        \\\n        ARMOp(Dst.D(), Src1.D(), Src2.D(), Src3.D());                                                                        \\\n      }                                                                                                                      \\\n    };                                                                                                                       \\\n                                                                                                                             \\\n    const auto Dst = GetVReg(Node);                                                                                          \\\n    const auto Upper = GetVReg(Op->Upper);                                                                                   \\\n    const auto Vector1 = GetVReg(Op->Vector1);                                                                               \\\n    const auto Vector2 = GetVReg(Op->Vector2);                                                                               \\\n    const auto Addend = GetVReg(Op->Addend);                                                                                 \\\n                                                                                                                             \\\n    VFScalarFMAOperation(IROp->Size, ElementSize, ScalarEmit, Dst, Upper, Vector1, Vector2, Addend);                         \\\n  }\n\nDEF_UNOP(VAbs, abs, true)\nDEF_UNOP(VPopcount, cnt, true)\nDEF_UNOP(VNeg, neg, false)\nDEF_UNOP(VFNeg, fneg, false)\n\nDEF_BITOP(VAnd, and_)\nDEF_BITOP(VAndn, bic)\nDEF_BITOP(VOr, orr)\nDEF_BITOP(VXor, eor)\n\nDEF_BINOP(VAdd, add)\nDEF_BINOP(VSub, sub)\nDEF_BINOP(VUQAdd, uqadd)\nDEF_BINOP(VUQSub, uqsub)\nDEF_BINOP(VSQAdd, sqadd)\nDEF_BINOP(VSQSub, sqsub)\n\nDEF_ZIPOP(VZip, zip1)\nDEF_ZIPOP(VZip2, zip2)\nDEF_ZIPOP(VUnZip, uzp1)\nDEF_ZIPOP(VUnZip2, uzp2)\nDEF_ZIPOP(VTrn, trn1)\nDEF_ZIPOP(VTrn2, trn2)\n\nDEF_FUNOP(VFSqrt, fsqrt)\nDEF_FUNOP(VFAbs, fabs)\n\nDEF_FBINOP(VFAdd, fadd)\nDEF_FBINOP(VFSub, fsub)\nDEF_FBINOP(VFMul, fmul)\n\nDEF_FBINOP_SCALAR_INSERT(VFAddScalarInsert, fadd)\nDEF_FBINOP_SCALAR_INSERT(VFSubScalarInsert, fsub)\nDEF_FBINOP_SCALAR_INSERT(VFMulScalarInsert, fmul)\nDEF_FBINOP_SCALAR_INSERT(VFDivScalarInsert, fdiv)\n\nDEF_FMAOP_SCALAR_INSERT(VFMLAScalarInsert, fmadd)\nDEF_FMAOP_SCALAR_INSERT(VFMLSScalarInsert, fnmsub)\nDEF_FMAOP_SCALAR_INSERT(VFNMLAScalarInsert, fmsub)\nDEF_FMAOP_SCALAR_INSERT(VFNMLSScalarInsert, fnmadd)\n\nvoid Arm64JITCore::VFScalarFMAOperation(IR::OpSize OpSize, IR::OpSize ElementSize, ScalarFMAOpCaller ScalarEmit, ARMEmitter::VRegister Dst,\n                                        ARMEmitter::VRegister Upper, ARMEmitter::VRegister Vector1, ARMEmitter::VRegister Vector2,\n                                        ARMEmitter::VRegister Addend) {\n  LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i128Bit, \"256-bit unsupported\", __func__);\n\n  LOGMAN_THROW_A_FMT(ElementSize == IR::OpSize::i16Bit || ElementSize == IR::OpSize::i32Bit || ElementSize == IR::OpSize::i64Bit, \"Invalid \"\n                                                                                                                                  \"size\");\n  const auto SubRegSize = ARMEmitter::ToVectorSizePair(ElementSize == IR::OpSize::i16Bit ? ARMEmitter::SubRegSize::i16Bit :\n                                                       ElementSize == IR::OpSize::i32Bit ? ARMEmitter::SubRegSize::i32Bit :\n                                                                                           ARMEmitter::SubRegSize::i64Bit);\n\n  if (Dst != Upper) {\n    // If destination is not tied, move the upper bits to the destination first.\n    mov(Dst.Q(), Upper.Q());\n  }\n\n  if (HostSupportsAFP && Dst == Addend) {\n    ///< Exactly matches ARM scalar FMA semantics\n    // If the host CPU supports AFP then scalar does an insert without modifying upper bits.\n    ScalarEmit(Dst, Vector1, Vector2, Addend);\n  } else {\n    // Host doesn't support AFP, need to emit in to a temporary then insert.\n    ScalarEmit(VTMP1, Vector1, Vector2, Addend);\n    ins(SubRegSize.Vector, Dst.Q(), 0, VTMP1.Q(), 0);\n  }\n}\n\n// VFScalarOperation performs the operation described through ScalarEmit between Vector1 and Vector2,\n// storing it into Dst. This is a scalar operation, so the only lowest element of each vector is used for the operation.\n// The result is stored into the destination. The untouched bits of the destination come from Vector1, unless it's a 256 vector\n// and ZeroUpperBits is true, in which case the upper bits are zero.\nvoid Arm64JITCore::VFScalarOperation(IR::OpSize OpSize, IR::OpSize ElementSize, bool ZeroUpperBits, ScalarBinaryOpCaller ScalarEmit,\n                                     ARMEmitter::VRegister Dst, ARMEmitter::VRegister Vector1, ARMEmitter::VRegister Vector2) {\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n  LOGMAN_THROW_A_FMT(Is256Bit || !ZeroUpperBits, \"128-bit operation doesn't support ZeroUpperBits in {}\", __func__);\n\n  // Bit of a tricky detail.\n  // The upper bits of the destination comes from Vector1.\n  LOGMAN_THROW_A_FMT(ElementSize == IR::OpSize::i16Bit || ElementSize == IR::OpSize::i32Bit || ElementSize == IR::OpSize::i64Bit, \"Invalid \"\n                                                                                                                                  \"size\");\n  const auto SubRegSize = ARMEmitter::ToVectorSizePair(ElementSize == IR::OpSize::i16Bit ? ARMEmitter::SubRegSize::i16Bit :\n                                                       ElementSize == IR::OpSize::i32Bit ? ARMEmitter::SubRegSize::i32Bit :\n                                                                                           ARMEmitter::SubRegSize::i64Bit);\n\n  constexpr auto Predicate = ARMEmitter::PReg::p0;\n\n  if (Dst == Vector1) {\n    if (ZeroUpperBits) {\n      // When zeroing the upper 128-bits we just use an ASIMD move.\n      mov(Dst.Q(), Vector1.Q());\n    }\n\n    if (HostSupportsAFP) {\n      // If the host CPU supports AFP then scalar does an insert without modifying upper bits.\n      ScalarEmit(Dst, Vector1, Vector2);\n    } else {\n      // If AFP is unsupported then the operation result goes in to a temporary.\n      // and then it gets inserted.\n      ScalarEmit(VTMP1, Vector1, Vector2);\n      if (!ZeroUpperBits && Is256Bit) {\n        ptrue(SubRegSize.Vector, Predicate, ARMEmitter::PredicatePattern::SVE_VL1);\n        mov(SubRegSize.Vector, Dst.Z(), Predicate.Merging(), VTMP1.Z());\n      } else {\n        ins(SubRegSize.Vector, Dst.Q(), 0, VTMP1.Q(), 0);\n      }\n    }\n  } else if (Dst != Vector2) { // Dst different from both Vector1 and Vector2\n    if (Is256Bit && !ZeroUpperBits) {\n      mov(Dst.Z(), Vector1.Z());\n    } else {\n      mov(Dst.Q(), Vector1.Q());\n    }\n\n    if (HostSupportsAFP) {\n      ScalarEmit(Dst, Vector1, Vector2);\n    } else {\n      ScalarEmit(VTMP1, Vector1, Vector2);\n      if (!ZeroUpperBits && Is256Bit) {\n        ptrue(SubRegSize.Vector, Predicate, ARMEmitter::PredicatePattern::SVE_VL1);\n        mov(SubRegSize.Vector, Dst.Z(), Predicate.Merging(), VTMP1.Z());\n      } else {\n        ins(SubRegSize.Vector, Dst.Q(), 0, VTMP1.Q(), 0);\n      }\n    }\n  } else { // Dst same as Vector2\n\n    ScalarEmit(VTMP1, Vector1, Vector2);\n\n    if (!ZeroUpperBits && Is256Bit) {\n      mov(Dst.Z(), Vector1.Z());\n      ptrue(SubRegSize.Vector, Predicate, ARMEmitter::PredicatePattern::SVE_VL1);\n      mov(SubRegSize.Vector, Dst.Z(), Predicate.Merging(), VTMP1.Z());\n    } else {\n      mov(Dst.Q(), Vector1.Q());\n      ins(SubRegSize.Vector, Dst.Q(), 0, VTMP1.Q(), 0);\n    }\n  }\n}\n\n// Similarly to VFScalarOperation it performs the operation described through ScalarEmit operating on Vector2.\n// However the result of the scalar operation is inserted into Vector1 and moved to Destination.\n// The untouched bits of the destination come from Vector1, unless it's a 256 vector\n// and ZeroUpperBits is true, in which case the upper bits are zero.\nvoid Arm64JITCore::VFScalarUnaryOperation(IR::OpSize OpSize, IR::OpSize ElementSize, bool ZeroUpperBits, ScalarUnaryOpCaller ScalarEmit,\n                                          ARMEmitter::VRegister Dst, ARMEmitter::VRegister Vector1,\n                                          std::variant<ARMEmitter::VRegister, ARMEmitter::Register> Vector2) {\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n  LOGMAN_THROW_A_FMT(Is256Bit || !ZeroUpperBits, \"128-bit operation doesn't support ZeroUpperBits in {}\", __func__);\n\n  LOGMAN_THROW_A_FMT(ElementSize == IR::OpSize::i16Bit || ElementSize == IR::OpSize::i32Bit || ElementSize == IR::OpSize::i64Bit, \"Invalid \"\n                                                                                                                                  \"size\");\n  const auto SubRegSize = ARMEmitter::ToVectorSizePair(ElementSize == IR::OpSize::i16Bit ? ARMEmitter::SubRegSize::i16Bit :\n                                                       ElementSize == IR::OpSize::i32Bit ? ARMEmitter::SubRegSize::i32Bit :\n                                                                                           ARMEmitter::SubRegSize::i64Bit);\n\n  constexpr auto Predicate = ARMEmitter::PReg::p0;\n  bool DstOverlapsVector2 = false;\n  if (const auto* Vector2Reg = std::get_if<ARMEmitter::VRegister>(&Vector2)) {\n    DstOverlapsVector2 = Dst == *Vector2Reg;\n  }\n\n  if (Dst == Vector1) {\n    if (ZeroUpperBits) {\n      // When zeroing the upper 128-bits we just use an ASIMD move.\n      mov(Dst.Q(), Vector1.Q());\n    }\n\n    if (HostSupportsAFP) { // or Dst (here Dst == Vector1)\n      // If the host CPU supports AFP then scalar does an insert without modifying upper bits.\n      ScalarEmit(Dst, Vector2);\n    } else {\n      // If AFP is unsupported then the operation result goes in to a temporary.\n      // and then it gets inserted.\n      ScalarEmit(VTMP1, Vector2);\n      if (!ZeroUpperBits && Is256Bit) {\n        ptrue(SubRegSize.Vector, Predicate, ARMEmitter::PredicatePattern::SVE_VL1);\n        mov(SubRegSize.Vector, Dst.Z(), Predicate.Merging(), VTMP1.Z());\n      } else {\n        ins(SubRegSize.Vector, Dst.Q(), 0, VTMP1.Q(), 0);\n      }\n    }\n  } else if (!DstOverlapsVector2) {\n    if (!ZeroUpperBits && Is256Bit) {\n      mov(Dst.Z(), Vector1.Z());\n    } else {\n      mov(Dst.Q(), Vector1.Q());\n    }\n\n    if (HostSupportsAFP) {\n      ScalarEmit(Dst, Vector2);\n    } else {\n      ScalarEmit(VTMP1, Vector2);\n      if (!ZeroUpperBits && Is256Bit) {\n        ptrue(SubRegSize.Vector, Predicate, ARMEmitter::PredicatePattern::SVE_VL1);\n        mov(SubRegSize.Vector, Dst.Z(), Predicate.Merging(), VTMP1.Z());\n      } else {\n        ins(SubRegSize.Vector, Dst.Q(), 0, VTMP1.Q(), 0);\n      }\n    }\n  } else {\n    // Destination intersects Vector2, can't do anything optimal in this case.\n    // Do the scalar operation first and then move and insert.\n    ScalarEmit(VTMP1, Vector2);\n\n    if (!ZeroUpperBits && Is256Bit) {\n      mov(Dst.Z(), Vector1.Z());\n      ptrue(SubRegSize.Vector, Predicate, ARMEmitter::PredicatePattern::SVE_VL1);\n      mov(SubRegSize.Vector, Dst.Z(), Predicate.Merging(), VTMP1.Z());\n    } else {\n      mov(Dst.Q(), Vector1.Q());\n      ins(SubRegSize.Vector, Dst.Q(), 0, VTMP1.Q(), 0);\n    }\n  }\n}\n\nDEF_OP(VFMinScalarInsert) {\n  const auto Op = IROp->C<IR::IROp_VFMinScalarInsert>();\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n\n  auto ScalarEmit = [this, SubRegSize](ARMEmitter::VRegister Dst, ARMEmitter::VRegister Src1, ARMEmitter::VRegister Src2) {\n    if (HostSupportsAFP) {\n      // AFP.AH lets fmin behave like x86 min\n      fmin(SubRegSize.Scalar, Dst, Src1, Src2);\n    } else {\n      // Only take the first operand if it is strictly less. Otherwise take\n      // the second. This emulates all the weird x86 rules for signed zero and\n      // NaNs. No, they're not IEEE-754 semantics.\n      fcmp(SubRegSize.Scalar, Src1, Src2);\n      fcsel(SubRegSize.Scalar, Dst, Src1, Src2, ARMEmitter::Condition::CC_MI);\n    }\n  };\n\n  // Bit of a tricky detail.\n  // The upper bits of the destination comes from the first source.\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  VFScalarOperation(IROp->Size, ElementSize, Op->ZeroUpperBits, ScalarEmit, Dst, Vector1, Vector2);\n}\n\nDEF_OP(VFMaxScalarInsert) {\n  const auto Op = IROp->C<IR::IROp_VFMaxScalarInsert>();\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n\n  // AFP can make this more optimal.\n  auto ScalarEmit = [this, SubRegSize](ARMEmitter::VRegister Dst, ARMEmitter::VRegister Src1, ARMEmitter::VRegister Src2) {\n    if (HostSupportsAFP) {\n      // AFP.AH lets fmax behave like x86 max\n      fmax(SubRegSize.Scalar, Dst, Src1, Src2);\n    } else {\n      // Only take the first operand if it is strictly greater. See fmin.\n      fcmp(SubRegSize.Scalar, Src1, Src2);\n      fcsel(SubRegSize.Scalar, Dst, Src1, Src2, ARMEmitter::Condition::CC_GT);\n    }\n  };\n\n  // Bit of a tricky detail.\n  // The upper bits of the destination comes from the first source.\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  VFScalarOperation(IROp->Size, ElementSize, Op->ZeroUpperBits, ScalarEmit, Dst, Vector1, Vector2);\n}\n\nDEF_OP(VFSqrtScalarInsert) {\n  const auto Op = IROp->C<IR::IROp_VFSqrtScalarInsert>();\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n\n  auto ScalarEmit = [this, SubRegSize](ARMEmitter::VRegister Dst, std::variant<ARMEmitter::VRegister, ARMEmitter::Register> SrcVar) {\n    auto Src = *std::get_if<ARMEmitter::VRegister>(&SrcVar);\n    fsqrt(SubRegSize.Scalar, Dst, Src);\n  };\n\n  // Bit of a tricky detail.\n  // The upper bits of the destination comes from the first source.\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  VFScalarUnaryOperation(IROp->Size, ElementSize, Op->ZeroUpperBits, ScalarEmit, Dst, Vector1, Vector2);\n}\n\nDEF_OP(VFRSqrtScalarInsert) {\n  const auto Op = IROp->C<IR::IROp_VFRSqrtScalarInsert>();\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n\n  auto ScalarEmit = [this, SubRegSize](ARMEmitter::VRegister Dst, std::variant<ARMEmitter::VRegister, ARMEmitter::Register> SrcVar) {\n    auto Src = *std::get_if<ARMEmitter::VRegister>(&SrcVar);\n\n    fmov(SubRegSize.Scalar, VTMP1.Q(), 1.0f);\n    fsqrt(SubRegSize.Scalar, VTMP2, Src);\n    if (HostSupportsAFP) {\n      fdiv(SubRegSize.Scalar, VTMP1, VTMP1, VTMP2);\n      ins(SubRegSize.Vector, Dst, 0, VTMP1, 0);\n    } else {\n      fdiv(SubRegSize.Scalar, Dst, VTMP1, VTMP2);\n    }\n  };\n\n  auto ScalarEmitRPRES = [this, SubRegSize](ARMEmitter::VRegister Dst, std::variant<ARMEmitter::VRegister, ARMEmitter::Register> SrcVar) {\n    auto Src = *std::get_if<ARMEmitter::VRegister>(&SrcVar);\n    frsqrte(SubRegSize.Scalar, Dst.D(), Src.D());\n  };\n\n  std::array<ScalarUnaryOpCaller, 2> Handlers = {\n    ScalarEmit,\n    ScalarEmitRPRES,\n  };\n  const auto HandlerIndex = ElementSize == IR::OpSize::i32Bit && HostSupportsRPRES ? 1 : 0;\n\n  // Bit of a tricky detail.\n  // The upper bits of the destination comes from the first source.\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  VFScalarUnaryOperation(IROp->Size, ElementSize, Op->ZeroUpperBits, Handlers[HandlerIndex], Dst, Vector1, Vector2);\n}\n\nDEF_OP(VFRecpScalarInsert) {\n  const auto Op = IROp->C<IR::IROp_VFRecpScalarInsert>();\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n\n  auto ScalarEmit = [this, SubRegSize](ARMEmitter::VRegister Dst, std::variant<ARMEmitter::VRegister, ARMEmitter::Register> SrcVar) {\n    auto Src = *std::get_if<ARMEmitter::VRegister>(&SrcVar);\n\n    fmov(SubRegSize.Scalar, VTMP1.Q(), 1.0f);\n    if (HostSupportsAFP) {\n      fdiv(SubRegSize.Scalar, VTMP1, VTMP1, Src);\n      ins(SubRegSize.Vector, Dst, 0, VTMP1, 0);\n    } else {\n      fdiv(SubRegSize.Scalar, Dst, VTMP1, Src);\n    }\n  };\n\n  auto ScalarEmitRPRES = [this, SubRegSize](ARMEmitter::VRegister Dst, std::variant<ARMEmitter::VRegister, ARMEmitter::Register> SrcVar) {\n    auto Src = *std::get_if<ARMEmitter::VRegister>(&SrcVar);\n    frecpe(SubRegSize.Scalar, Dst, Src);\n  };\n\n  std::array<ScalarUnaryOpCaller, 2> Handlers = {\n    ScalarEmit,\n    ScalarEmitRPRES,\n  };\n  const auto HandlerIndex = ElementSize == IR::OpSize::i32Bit && HostSupportsRPRES ? 1 : 0;\n\n  // Bit of a tricky detail.\n  // The upper bits of the destination comes from the first source.\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  VFScalarUnaryOperation(IROp->Size, ElementSize, Op->ZeroUpperBits, Handlers[HandlerIndex], Dst, Vector1, Vector2);\n}\n\nDEF_OP(VFToFScalarInsert) {\n  const auto Op = IROp->C<IR::IROp_VFToFScalarInsert>();\n  const auto ElementSize = Op->Header.ElementSize;\n  const uint16_t Conv = (IR::OpSizeToSize(Op->Header.ElementSize) << 8) | IR::OpSizeToSize(Op->SrcElementSize);\n\n  auto ScalarEmit = [this, Conv](ARMEmitter::VRegister Dst, std::variant<ARMEmitter::VRegister, ARMEmitter::Register> SrcVar) {\n    auto Src = *std::get_if<ARMEmitter::VRegister>(&SrcVar);\n\n    switch (Conv) {\n    case 0x0204: { // Half <- Float\n      fcvt(Dst.H(), Src.S());\n      break;\n    }\n    case 0x0208: { // Half <- Double\n      fcvt(Dst.H(), Src.D());\n      break;\n    }\n    case 0x0402: { // Float <- Half\n      fcvt(Dst.S(), Src.H());\n      break;\n    }\n    case 0x0802: { // Double <- Half\n      fcvt(Dst.D(), Src.H());\n      break;\n    }\n    case 0x0804: { // Double <- Float\n      fcvt(Dst.D(), Src.S());\n      break;\n    }\n    case 0x0408: { // Float <- Double\n      fcvt(Dst.S(), Src.D());\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unknown FCVT sizes: 0x{:x}\", Conv);\n    }\n  };\n\n  // Bit of a tricky detail.\n  // The upper bits of the destination comes from the first source.\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  VFScalarUnaryOperation(IROp->Size, ElementSize, Op->ZeroUpperBits, ScalarEmit, Dst, Vector1, Vector2);\n}\n\nDEF_OP(VSToFVectorInsert) {\n  const auto Op = IROp->C<IR::IROp_VSToFVectorInsert>();\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto HasTwoElements = Op->HasTwoElements;\n\n  LOGMAN_THROW_A_FMT(ElementSize == IR::OpSize::i32Bit || ElementSize == IR::OpSize::i64Bit, \"Invalid size\");\n  if (HasTwoElements) {\n    LOGMAN_THROW_A_FMT(ElementSize == IR::OpSize::i32Bit, \"Can't have two elements for 8-byte size\");\n  }\n\n  auto ScalarEmit = [this, ElementSize, HasTwoElements](ARMEmitter::VRegister Dst, std::variant<ARMEmitter::VRegister, ARMEmitter::Register> SrcVar) {\n    auto Src = *std::get_if<ARMEmitter::VRegister>(&SrcVar);\n    if (ElementSize == IR::OpSize::i32Bit) {\n      if (HasTwoElements) {\n        scvtf(ARMEmitter::SubRegSize::i32Bit, Dst.D(), Src.D());\n      } else {\n        scvtf(ARMEmitter::ScalarRegSize::i32Bit, Dst.S(), Src.S());\n      }\n    } else {\n      scvtf(ARMEmitter::ScalarRegSize::i64Bit, Dst.D(), Src.D());\n    }\n  };\n\n  // Bit of a tricky detail.\n  // The upper bits of the destination comes from the first source.\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  // Claim the element size is 8-bytes.\n  // Might be scalar 8-byte (cvtsi2ss xmm0, rax)\n  // Might be vector i32v2 (cvtpi2ps xmm0, mm0)\n  if (!HasTwoElements) {\n    VFScalarUnaryOperation(IROp->Size, ElementSize, Op->ZeroUpperBits, ScalarEmit, Dst, Vector1, Vector2);\n    return;\n  }\n\n  // Dealing with the odd case of this being actually a vector operation rather than scalar.\n  const auto Is256Bit = IROp->Size == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n  constexpr auto Predicate = ARMEmitter::PReg::p0;\n\n  ScalarEmit(VTMP1, Vector2);\n  if (!Op->ZeroUpperBits && Is256Bit) {\n    if (Dst != Vector1) {\n      mov(Dst.Z(), Vector1.Z());\n    }\n    ptrue(ARMEmitter::SubRegSize::i64Bit, Predicate, ARMEmitter::PredicatePattern::SVE_VL1);\n    mov(ARMEmitter::SubRegSize::i64Bit, Dst.Z(), Predicate.Merging(), VTMP1.Z());\n  } else {\n    if (Dst != Vector1) {\n      mov(Dst.Q(), Vector1.Q());\n    }\n    ins(ARMEmitter::SubRegSize::i64Bit, Dst.Q(), 0, VTMP1.Q(), 0);\n  }\n}\n\nDEF_OP(VSToFGPRInsert) {\n  const auto Op = IROp->C<IR::IROp_VSToFGPRInsert>();\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const uint16_t Conv = (IR::OpSizeToSize(ElementSize) << 8) | IR::OpSizeToSize(Op->SrcElementSize);\n\n  auto ScalarEmit = [this, Conv](ARMEmitter::VRegister Dst, std::variant<ARMEmitter::VRegister, ARMEmitter::Register> SrcVar) {\n    auto Src = *std::get_if<ARMEmitter::Register>(&SrcVar);\n\n    switch (Conv) {\n    case 0x0204: { // Half <- int32_t\n      scvtf(ARMEmitter::Size::i32Bit, Dst.H(), Src);\n      break;\n    }\n    case 0x0208: { // Half <- int64_t\n      scvtf(ARMEmitter::Size::i64Bit, Dst.H(), Src);\n      break;\n    }\n    case 0x0404: { // Float <- int32_t\n      scvtf(ARMEmitter::Size::i32Bit, Dst.S(), Src);\n      break;\n    }\n    case 0x0408: { // Float <- int64_t\n      scvtf(ARMEmitter::Size::i64Bit, Dst.S(), Src);\n      break;\n    }\n    case 0x0804: { // Double <- int32_t\n      scvtf(ARMEmitter::Size::i32Bit, Dst.D(), Src);\n      break;\n    }\n    case 0x0808: { // Double <- int64_t\n      scvtf(ARMEmitter::Size::i64Bit, Dst.D(), Src);\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unhandled conversion mask: Mask=0x{:04x}\", Conv); break;\n    }\n  };\n\n\n  // Bit of a tricky detail.\n  // The upper bits of the destination comes from the first source.\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n  const auto GPR = GetReg(Op->Src);\n\n  VFScalarUnaryOperation(IROp->Size, ElementSize, Op->ZeroUpperBits, ScalarEmit, Dst, Vector, GPR);\n}\n\nDEF_OP(VFToIScalarInsert) {\n  const auto Op = IROp->C<IR::IROp_VFToIScalarInsert>();\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n  const auto RoundMode = Op->Round;\n\n  auto ScalarEmit = [this, SubRegSize, RoundMode](ARMEmitter::VRegister Dst, std::variant<ARMEmitter::VRegister, ARMEmitter::Register> SrcVar) {\n    auto Src = *std::get_if<ARMEmitter::VRegister>(&SrcVar);\n\n    switch (RoundMode) {\n    case IR::RoundMode::Nearest: frintn(SubRegSize.Scalar, Dst, Src); break;\n    case IR::RoundMode::NegInfinity: frintm(SubRegSize.Scalar, Dst, Src); break;\n    case IR::RoundMode::PosInfinity: frintp(SubRegSize.Scalar, Dst, Src); break;\n    case IR::RoundMode::TowardsZero: frintz(SubRegSize.Scalar, Dst, Src); break;\n    case IR::RoundMode::Host: frinti(SubRegSize.Scalar, Dst, Src); break;\n    }\n  };\n\n  // Bit of a tricky detail.\n  // The upper bits of the destination comes from the first source.\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  VFScalarUnaryOperation(IROp->Size, ElementSize, Op->ZeroUpperBits, ScalarEmit, Dst, Vector1, Vector2);\n}\n\nDEF_OP(VFCMPScalarInsert) {\n  const auto Op = IROp->C<IR::IROp_VFCMPScalarInsert>();\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n\n  const auto ZeroUpperBits = Op->ZeroUpperBits;\n  const auto Is256Bit = IROp->Size == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  auto ScalarEmitEQ = [this, SubRegSize](ARMEmitter::VRegister Dst, ARMEmitter::VRegister Src1, ARMEmitter::VRegister Src2) {\n    switch (SubRegSize.Scalar) {\n    case ARMEmitter::ScalarRegSize::i16Bit: {\n      fcmeq(Dst.H(), Src2.H(), Src1.H());\n      break;\n    }\n    case ARMEmitter::ScalarRegSize::i32Bit:\n    case ARMEmitter::ScalarRegSize::i64Bit: fcmeq(SubRegSize.Scalar, Dst, Src2, Src1); break;\n    default: break;\n    }\n  };\n  auto ScalarEmitLT = [this, SubRegSize](ARMEmitter::VRegister Dst, ARMEmitter::VRegister Src1, ARMEmitter::VRegister Src2) {\n    switch (SubRegSize.Scalar) {\n    case ARMEmitter::ScalarRegSize::i16Bit: {\n      fcmgt(Dst.H(), Src2.H(), Src1.H());\n      break;\n    }\n    case ARMEmitter::ScalarRegSize::i32Bit:\n    case ARMEmitter::ScalarRegSize::i64Bit: fcmgt(SubRegSize.Scalar, Dst, Src2, Src1); break;\n    default: break;\n    }\n  };\n  auto ScalarEmitLE = [this, SubRegSize](ARMEmitter::VRegister Dst, ARMEmitter::VRegister Src1, ARMEmitter::VRegister Src2) {\n    switch (SubRegSize.Scalar) {\n    case ARMEmitter::ScalarRegSize::i16Bit: {\n      fcmge(Dst.H(), Src2.H(), Src1.H());\n      break;\n    }\n    case ARMEmitter::ScalarRegSize::i32Bit:\n    case ARMEmitter::ScalarRegSize::i64Bit: fcmge(SubRegSize.Scalar, Dst, Src2, Src1); break;\n    default: break;\n    }\n  };\n  auto ScalarEmitUNO = [this, SubRegSize, ZeroUpperBits, Is256Bit](ARMEmitter::VRegister Dst, ARMEmitter::VRegister Src1,\n                                                                   ARMEmitter::VRegister Src2) {\n    switch (SubRegSize.Scalar) {\n    case ARMEmitter::ScalarRegSize::i16Bit: {\n      fcmge(VTMP1.H(), Src1.H(), Src2.H());\n      fcmgt(VTMP2.H(), Src2.H(), Src1.H());\n      break;\n    }\n    case ARMEmitter::ScalarRegSize::i32Bit:\n    case ARMEmitter::ScalarRegSize::i64Bit:\n      fcmge(SubRegSize.Scalar, VTMP1, Src1, Src2);\n      fcmgt(SubRegSize.Scalar, VTMP2, Src2, Src1);\n      break;\n    default: break;\n    }\n    // If the destination is a temporary then it is going to do an insert after the operation.\n    // This means this operation can avoid a redundant insert in this case.\n    const bool DstIsTemp = Dst == VTMP1;\n\n    // Combine results and invert directly in VTMP1.\n    orr(VTMP1.D(), VTMP1.D(), VTMP2.D());\n    mvn(ARMEmitter::SubRegSize::i8Bit, VTMP1.D(), VTMP1.D());\n\n    if (!DstIsTemp) {\n      // If the destination doesn't overlap VTMP1, then we need to insert the final result.\n      // This only happens in the case that the host supports AFP.\n      if (!ZeroUpperBits && Is256Bit) {\n        constexpr auto Predicate = ARMEmitter::PReg::p0;\n        ptrue(SubRegSize.Vector, Predicate, ARMEmitter::PredicatePattern::SVE_VL1);\n        mov(SubRegSize.Vector, Dst.Z(), Predicate.Merging(), VTMP1.Z());\n      } else {\n        ins(SubRegSize.Vector, Dst.Q(), 0, VTMP1.Q(), 0);\n      }\n    }\n  };\n  auto ScalarEmitNEQ = [this, SubRegSize, ZeroUpperBits, Is256Bit](ARMEmitter::VRegister Dst, ARMEmitter::VRegister Src1,\n                                                                   ARMEmitter::VRegister Src2) {\n    switch (SubRegSize.Scalar) {\n    case ARMEmitter::ScalarRegSize::i16Bit: {\n      fcmeq(VTMP1.H(), Src2.H(), Src1.H());\n      break;\n    }\n    case ARMEmitter::ScalarRegSize::i32Bit:\n    case ARMEmitter::ScalarRegSize::i64Bit: fcmeq(SubRegSize.Scalar, VTMP1, Src2, Src1); break;\n    default: break;\n    }\n    // If the destination is a temporary then it is going to do an insert after the operation.\n    // This means this operation can avoid a redundant insert in this case.\n    const bool DstIsTemp = Dst == VTMP1;\n\n    // Invert directly in VTMP1.\n    mvn(ARMEmitter::SubRegSize::i8Bit, VTMP1.D(), VTMP1.D());\n\n    if (!DstIsTemp) {\n      // If the destination doesn't overlap VTMP1, then we need to insert the final result.\n      // This only happens in the case that the host supports AFP.\n      if (!ZeroUpperBits && Is256Bit) {\n        constexpr auto Predicate = ARMEmitter::PReg::p0;\n        ptrue(SubRegSize.Vector, Predicate, ARMEmitter::PredicatePattern::SVE_VL1);\n        mov(SubRegSize.Vector, Dst.Z(), Predicate.Merging(), VTMP1.Z());\n      } else {\n        ins(SubRegSize.Vector, Dst.Q(), 0, VTMP1.Q(), 0);\n      }\n    }\n  };\n  auto ScalarEmitORD = [this, SubRegSize, ZeroUpperBits, Is256Bit](ARMEmitter::VRegister Dst, ARMEmitter::VRegister Src1,\n                                                                   ARMEmitter::VRegister Src2) {\n    switch (SubRegSize.Scalar) {\n    case ARMEmitter::ScalarRegSize::i16Bit: {\n      fcmge(VTMP1.H(), Src1.H(), Src2.H());\n      fcmgt(VTMP2.H(), Src2.H(), Src1.H());\n      break;\n    }\n    case ARMEmitter::ScalarRegSize::i32Bit:\n    case ARMEmitter::ScalarRegSize::i64Bit:\n      fcmge(SubRegSize.Scalar, VTMP1, Src1, Src2);\n      fcmgt(SubRegSize.Scalar, VTMP2, Src2, Src1);\n      break;\n    default: break;\n    }\n    // If the destination is a temporary then it is going to do an insert after the operation.\n    // This means this operation can avoid a redundant insert in this case.\n    const bool DstIsTemp = Dst == VTMP1;\n\n    // Combine results directly in VTMP1.\n    orr(VTMP1.D(), VTMP1.D(), VTMP2.D());\n\n    if (!DstIsTemp) {\n      // If the destination doesn't overlap VTMP1, then we need to insert the final result.\n      // This only happens in the case that the host supports AFP.\n      if (!ZeroUpperBits && Is256Bit) {\n        constexpr auto Predicate = ARMEmitter::PReg::p0;\n        ptrue(SubRegSize.Vector, Predicate, ARMEmitter::PredicatePattern::SVE_VL1);\n        mov(SubRegSize.Vector, Dst.Z(), Predicate.Merging(), VTMP1.Z());\n      } else {\n        ins(SubRegSize.Vector, Dst.Q(), 0, VTMP1.Q(), 0);\n      }\n    }\n  };\n\n  std::array<ScalarBinaryOpCaller, 6> Funcs = {{\n    ScalarEmitEQ,\n    ScalarEmitLT,\n    ScalarEmitLE,\n    ScalarEmitUNO,\n    ScalarEmitNEQ,\n    ScalarEmitORD,\n  }};\n\n  // Bit of a tricky detail.\n  // The upper bits of the destination comes from the first source.\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  VFScalarOperation(IROp->Size, ElementSize, Op->ZeroUpperBits, Funcs[FEXCore::ToUnderlying(Op->Op)], Dst, Vector1, Vector2);\n}\n\nDEF_OP(VectorImm) {\n  const auto Op = IROp->C<IR::IROp_VectorImm>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n\n  const auto Dst = GetVReg(Node);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    LOGMAN_THROW_A_FMT(Op->ShiftAmount == 0, \"SVE VectorImm doesn't support a shift\");\n    if (ElementSize > IR::OpSize::i8Bit && (Op->Immediate & 0x80)) {\n      // SVE dup uses sign extension where VectorImm wants zext\n      LoadConstant(ARMEmitter::Size::i64Bit, TMP1, Op->Immediate);\n      dup(SubRegSize, Dst.Z(), TMP1);\n    } else {\n      dup_imm(SubRegSize, Dst.Z(), static_cast<int8_t>(Op->Immediate));\n    }\n  } else {\n    if (ElementSize == IR::OpSize::i64Bit) {\n      // movi with 64bit element size doesn't do what we want here\n      LoadConstant(ARMEmitter::Size::i64Bit, TMP1, static_cast<uint64_t>(Op->Immediate) << Op->ShiftAmount);\n      dup(SubRegSize, Dst.Q(), TMP1.R());\n    } else {\n      movi(SubRegSize, Dst.Q(), Op->Immediate, Op->ShiftAmount);\n    }\n  }\n}\n\nDEF_OP(LoadNamedVectorConstant) {\n  const auto Op = IROp->C<IR::IROp_LoadNamedVectorConstant>();\n  const auto OpSize = IROp->Size;\n\n  const auto Dst = GetVReg(Node);\n  switch (Op->Constant) {\n  case FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_ZERO: movi(ARMEmitter::SubRegSize::i64Bit, Dst.Q(), 0); return;\n  default:\n    // Intentionally doing nothing.\n    break;\n  }\n\n  if (HostSupportsSVE128) {\n    switch (Op->Constant) {\n    case FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_MOVMSKPS_SHIFT: index(ARMEmitter::SubRegSize::i32Bit, Dst.Z(), 0, 1); return;\n    default:\n      // Intentionally doing nothing.\n      break;\n    }\n  }\n  // Load the pointer.\n  auto GenerateMemOperand = [this](IR::OpSize OpSize, uint32_t NamedConstant, ARMEmitter::Register Base) {\n    const auto ConstantOffset = ARRAY_OFFSETOF(FEXCore::Core::CpuStateFrame, Pointers.NamedVectorConstants, NamedConstant);\n\n    if (ConstantOffset <= 255 || // Unscaled 9-bit signed\n        ((ConstantOffset & (IR::OpSizeToSize(OpSize) - 1)) == 0 &&\n         FEXCore::DividePow2(ConstantOffset, IR::OpSizeToSize(OpSize)) <= 4095)) /* 12-bit unsigned scaled */ {\n      return ARMEmitter::ExtendedMemOperand(Base.X(), ARMEmitter::IndexType::OFFSET, ConstantOffset);\n    }\n\n    ldr(TMP1, STATE_PTR_IDX(CpuStateFrame, Pointers.NamedVectorConstantPointers, NamedConstant));\n    return ARMEmitter::ExtendedMemOperand(TMP1, ARMEmitter::IndexType::OFFSET, 0);\n  };\n\n  if (OpSize == IR::OpSize::i256Bit) {\n    // Handle SVE 32-byte variant upfront.\n    ldr(TMP1, STATE_PTR_IDX(CpuStateFrame, Pointers.NamedVectorConstantPointers, Op->Constant));\n    ld1b<ARMEmitter::SubRegSize::i8Bit>(Dst.Z(), PRED_TMP_32B.Zeroing(), TMP1, 0);\n    return;\n  }\n\n  auto MemOperand = GenerateMemOperand(OpSize, Op->Constant, STATE);\n  switch (OpSize) {\n  case IR::OpSize::i8Bit: ldrb(Dst, MemOperand); break;\n  case IR::OpSize::i16Bit: ldrh(Dst, MemOperand); break;\n  case IR::OpSize::i32Bit: ldr(Dst.S(), MemOperand); break;\n  case IR::OpSize::i64Bit: ldr(Dst.D(), MemOperand); break;\n  case IR::OpSize::i128Bit: ldr(Dst.Q(), MemOperand); break;\n  default: LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, OpSize); break;\n  }\n}\nDEF_OP(LoadNamedVectorIndexedConstant) {\n  const auto Op = IROp->C<IR::IROp_LoadNamedVectorIndexedConstant>();\n  const auto OpSize = IROp->Size;\n\n  const auto Dst = GetVReg(Node);\n\n  // Load the pointer.\n  ldr(TMP1, STATE_PTR_IDX(CpuStateFrame, Pointers.IndexedNamedVectorConstantPointers, Op->Constant));\n\n  switch (OpSize) {\n  case IR::OpSize::i8Bit: ldrb(Dst, TMP1, Op->Index); break;\n  case IR::OpSize::i16Bit: ldrh(Dst, TMP1, Op->Index); break;\n  case IR::OpSize::i32Bit: ldr(Dst.S(), TMP1, Op->Index); break;\n  case IR::OpSize::i64Bit: ldr(Dst.D(), TMP1, Op->Index); break;\n  case IR::OpSize::i128Bit: ldr(Dst.Q(), TMP1, Op->Index); break;\n  case IR::OpSize::i256Bit: {\n    add(ARMEmitter::Size::i64Bit, TMP1, TMP1, Op->Index);\n    ld1b<ARMEmitter::SubRegSize::i8Bit>(Dst.Z(), PRED_TMP_32B.Zeroing(), TMP1, 0);\n    break;\n  }\n  default: LOGMAN_MSG_A_FMT(\"Unhandled {} size: {}\", __func__, OpSize); break;\n  }\n}\n\nDEF_OP(VMov) {\n  const auto Op = IROp->C<IR::IROp_VMov>();\n  const auto OpSize = IROp->Size;\n\n  const auto Dst = GetVReg(Node);\n  const auto Source = GetVReg(Op->Source);\n\n  switch (OpSize) {\n  case IR::OpSize::i8Bit: {\n    movi(ARMEmitter::SubRegSize::i64Bit, VTMP1.Q(), 0);\n    ins(ARMEmitter::SubRegSize::i8Bit, VTMP1, 0, Source, 0);\n    mov(Dst.Q(), VTMP1.Q());\n    break;\n  }\n  case IR::OpSize::i16Bit: {\n    movi(ARMEmitter::SubRegSize::i64Bit, VTMP1.Q(), 0);\n    ins(ARMEmitter::SubRegSize::i16Bit, VTMP1, 0, Source, 0);\n    mov(Dst.Q(), VTMP1.Q());\n    break;\n  }\n  case IR::OpSize::i32Bit: {\n    movi(ARMEmitter::SubRegSize::i64Bit, VTMP1.Q(), 0);\n    ins(ARMEmitter::SubRegSize::i32Bit, VTMP1, 0, Source, 0);\n    mov(Dst.Q(), VTMP1.Q());\n    break;\n  }\n  case IR::OpSize::i64Bit: {\n    mov(Dst.D(), Source.D());\n    break;\n  }\n  case IR::OpSize::i128Bit: {\n    if (HostSupportsSVE256 || Dst.Idx() != Source.Idx()) {\n      mov(Dst.Q(), Source.Q());\n    }\n    break;\n  }\n  case IR::OpSize::i256Bit: {\n    // NOTE: If, in the distant future we support larger moves, or registers\n    //       (*cough* AVX-512 *cough*) make sure to change this to treat\n    //       256-bit moves with zero extending behavior instead of doing only\n    //       a regular SVE move into a 512-bit register.\n    if (Dst.Idx() != Source.Idx()) {\n      mov(Dst.Z(), Source.Z());\n    }\n    break;\n  }\n  default: LOGMAN_MSG_A_FMT(\"Unknown Op Size: {}\", OpSize); break;\n  }\n}\n\nDEF_OP(VAddP) {\n  const auto Op = IROp->C<IR::IROp_VAddP>();\n  const auto OpSize = IROp->Size;\n  const auto IsScalar = OpSize == IR::OpSize::i64Bit;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n\n  const auto Dst = GetVReg(Node);\n  const auto VectorLower = GetVReg(Op->VectorLower);\n  const auto VectorUpper = GetVReg(Op->VectorUpper);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Pred = PRED_TMP_32B.Merging();\n\n    // SVE ADDP is a destructive operation, so we need a temporary\n    movprfx(VTMP1.Z(), VectorLower.Z());\n\n    // Unlike Adv. SIMD's version of ADDP, which acts like it concats the\n    // upper vector onto the end of the lower vector and then performs\n    // pairwise addition, the SVE version actually interleaves the\n    // results of the pairwise addition (gross!), so we need to undo that.\n    addp(SubRegSize, VTMP1.Z(), Pred, VTMP1.Z(), VectorUpper.Z());\n    uzp1(SubRegSize, Dst.Z(), VTMP1.Z(), VTMP1.Z());\n    uzp2(SubRegSize, VTMP2.Z(), VTMP1.Z(), VTMP1.Z());\n\n    // Merge upper half with lower half.\n    splice<ARMEmitter::OpType::Destructive>(ARMEmitter::SubRegSize::i64Bit, Dst.Z(), PRED_TMP_16B, Dst.Z(), VTMP2.Z());\n  } else {\n    if (IsScalar) {\n      addp(SubRegSize, Dst.D(), VectorLower.D(), VectorUpper.D());\n    } else {\n      addp(SubRegSize, Dst.Q(), VectorLower.Q(), VectorUpper.Q());\n    }\n  }\n}\n\nDEF_OP(VOrn) {\n  const auto Op = IROp->C<IR::IROp_VOrn>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  const auto Is128Bit = OpSize == IR::OpSize::i128Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Pred = PRED_TMP_32B.Merging();\n    not_(ARMEmitter::SubRegSize::i8Bit, VTMP1.Z(), Pred, Vector2.Z());\n    orr(Dst.Z(), Vector1.Z(), VTMP1.Z());\n  } else if (Is128Bit) {\n    orn(Dst.Q(), Vector1.Q(), Vector2.Q());\n  } else {\n    orn(Dst.D(), Vector1.D(), Vector2.D());\n  }\n}\n\nDEF_OP(VFAddV) {\n  const auto Op = IROp->C<IR::IROp_VFAddV>();\n  const auto OpSize = IROp->Size;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  LOGMAN_THROW_A_FMT(OpSize == IR::OpSize::i128Bit || OpSize == IR::OpSize::i256Bit, \"Only AVX and SSE size supported\");\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Pred = PRED_TMP_32B.Merging();\n    faddv(SubRegSize.Vector, Dst, Pred, Vector.Z());\n  }\n  if (HostSupportsSVE128) {\n    const auto Pred = PRED_TMP_16B.Merging();\n    faddv(SubRegSize.Vector, Dst, Pred, Vector.Z());\n  } else {\n    // ASIMD doesn't support faddv, need to use multiple faddp to match behaviour.\n    if (ElementSize == IR::OpSize::i32Bit) {\n      faddp(SubRegSize.Vector, Dst.Q(), Vector.Q(), Vector.Q());\n      faddp(SubRegSize.Scalar, Dst, Dst);\n    } else {\n      faddp(SubRegSize.Scalar, Dst, Vector);\n    }\n  }\n}\n\nDEF_OP(VAddV) {\n  const auto Op = IROp->C<IR::IROp_VAddV>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    // SVE doesn't have an equivalent ADDV instruction, so we make do\n    // by performing two Adv. SIMD ADDV operations on the high and low\n    // 128-bit lanes and then sum them up.\n\n    const auto Mask = PRED_TMP_32B.Zeroing();\n    const auto CompactPred = ARMEmitter::PReg::p0;\n\n    // Select all our upper elements to run ADDV over them.\n    not_(CompactPred, Mask, PRED_TMP_16B);\n    compact(ARMEmitter::SubRegSize::i64Bit, VTMP1.Z(), CompactPred, Vector.Z());\n\n    addv(SubRegSize.Vector, VTMP2.Q(), Vector.Q());\n    addv(SubRegSize.Vector, VTMP1.Q(), VTMP1.Q());\n    add(SubRegSize.Vector, Dst.Q(), VTMP1.Q(), VTMP2.Q());\n  } else {\n    if (ElementSize == IR::OpSize::i64Bit) {\n      addp(SubRegSize.Scalar, Dst, Vector);\n    } else {\n      addv(SubRegSize.Vector, Dst.Q(), Vector.Q());\n    }\n  }\n}\n\nDEF_OP(VUMinV) {\n  const auto Op = IROp->C<IR::IROp_VUMinV>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Pred = PRED_TMP_32B;\n    uminv(SubRegSize, Dst, Pred, Vector.Z());\n  } else {\n    // Vector\n    uminv(SubRegSize, Dst.Q(), Vector.Q());\n  }\n}\n\nDEF_OP(VUMaxV) {\n  const auto Op = IROp->C<IR::IROp_VUMaxV>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Pred = PRED_TMP_32B;\n    umaxv(SubRegSize, Dst, Pred, Vector.Z());\n  } else {\n    // Vector\n    umaxv(SubRegSize, Dst.Q(), Vector.Q());\n  }\n}\n\nDEF_OP(VURAvg) {\n  const auto Op = IROp->C<IR::IROp_VURAvg>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    // Trivial cases where we already have source data to be averaged in\n    // the destination register. We can just do the operation in place.\n    if (Dst == Vector1) {\n      urhadd(SubRegSize, Dst.Z(), Mask, Dst.Z(), Vector2.Z());\n    } else if (Dst == Vector2) {\n      urhadd(SubRegSize, Dst.Z(), Mask, Dst.Z(), Vector1.Z());\n    } else {\n      // SVE URHADD is a destructive operation, but we know that\n      // we don't have any source/destination aliasing happening here\n      // so we can safely move one of the source operands into the destination.\n      movprfx(Dst.Z(), Vector1.Z());\n      urhadd(SubRegSize, Dst.Z(), Mask, Dst.Z(), Vector2.Z());\n    }\n  } else {\n    urhadd(SubRegSize, Dst.Q(), Vector1.Q(), Vector2.Q());\n  }\n}\n\nDEF_OP(VFAddP) {\n  const auto Op = IROp->C<IR::IROp_VFAddP>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n\n  const auto Dst = GetVReg(Node);\n  const auto VectorLower = GetVReg(Op->VectorLower);\n  const auto VectorUpper = GetVReg(Op->VectorUpper);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Pred = PRED_TMP_32B.Merging();\n\n    // SVE FADDP is a destructive operation, so we need a temporary\n    movprfx(VTMP1.Z(), VectorLower.Z());\n\n    // Unlike Adv. SIMD's version of FADDP, which acts like it concats the\n    // upper vector onto the end of the lower vector and then performs\n    // pairwise addition, the SVE version actually interleaves the\n    // results of the pairwise addition (gross!), so we need to undo that.\n    faddp(SubRegSize, VTMP1.Z(), Pred, VTMP1.Z(), VectorUpper.Z());\n    uzp1(SubRegSize, Dst.Z(), VTMP1.Z(), VTMP1.Z());\n    uzp2(SubRegSize, VTMP2.Z(), VTMP1.Z(), VTMP1.Z());\n\n    // Merge upper half with lower half.\n    splice<ARMEmitter::OpType::Destructive>(ARMEmitter::SubRegSize::i64Bit, Dst.Z(), PRED_TMP_16B, Dst.Z(), VTMP2.Z());\n  } else {\n    faddp(SubRegSize, Dst.Q(), VectorLower.Q(), VectorUpper.Q());\n  }\n}\n\nDEF_OP(VFDiv) {\n  const auto Op = IROp->C<IR::IROp_VFDiv>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    if (Dst == Vector1) {\n      // Trivial case where we already have source data to be divided in the\n      // destination register. We can just divide by Vector2 and be done with it.\n      fdiv(SubRegSize, Dst.Z(), Mask, Dst.Z(), Vector2.Z());\n    } else if (Dst == Vector2) {\n      // If the destination aliases the second vector, then we need\n      // to use a temp.\n      movprfx(VTMP1.Z(), Vector1.Z());\n      fdiv(SubRegSize, VTMP1.Z(), Mask, VTMP1.Z(), Vector2.Z());\n      mov(Dst.Z(), VTMP1.Z());\n    } else {\n      // If no registers alias the destination, then we can move directly\n      // into the destination and then divide.\n      movprfx(Dst.Z(), Vector1.Z());\n      fdiv(SubRegSize, Dst.Z(), Mask, Dst.Z(), Vector2.Z());\n    }\n  } else {\n    if (IsScalar) {\n      switch (ElementSize) {\n      case IR::OpSize::i16Bit: {\n        fdiv(Dst.H(), Vector1.H(), Vector2.H());\n        break;\n      }\n      case IR::OpSize::i32Bit: {\n        fdiv(Dst.S(), Vector1.S(), Vector2.S());\n        break;\n      }\n      case IR::OpSize::i64Bit: {\n        fdiv(Dst.D(), Vector1.D(), Vector2.D());\n        break;\n      }\n      default: break;\n      }\n    } else {\n      fdiv(SubRegSize, Dst.Q(), Vector1.Q(), Vector2.Q());\n    }\n  }\n}\n\nDEF_OP(VFMin) {\n  const auto Op = IROp->C<IR::IROp_VFMin>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  // NOTE: We don't directly use FMIN** here for any of the implementations,\n  //       because it has undesirable NaN handling behavior (it sets\n  //       entries either to the incoming NaN value*, or the default NaN\n  //       depending on FPCR flags set). We want behavior that sets NaN\n  //       entries to zero for the comparison result.\n  //\n  // * - Not exactly (differs slightly with SNaNs), but close enough for the explanation\n  // ** - Unless the host supports AFP.AH, which allows FMIN/FMAX to select the second source element as expected of x86.\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B;\n    const auto ComparePred = ARMEmitter::PReg::p0;\n\n    // General idea:\n    // 1. Compare greater than against the two vectors\n    // 2. Invert the resulting values in the predicate register.\n    // 3. Move the first vector into a temporary\n    // 4. Merge all the elements that correspond to the inverted\n    //    predicate bits from the second vector into the\n    //    same temporary.\n    // 5. Move temporary into the destination register and we're done.\n    fcmgt(SubRegSize, ComparePred, Mask.Zeroing(), Vector2.Z(), Vector1.Z());\n    not_(ComparePred, Mask.Zeroing(), ComparePred);\n\n    if (Dst == Vector1) {\n      // Trivial case where Vector1 is also the destination.\n      // We don't need to move any data around in this case (aside from the merge).\n      mov(SubRegSize, Dst.Z(), ComparePred.Merging(), Vector2.Z());\n    } else {\n      mov(VTMP1.Z(), Vector1.Z());\n      mov(SubRegSize, VTMP1.Z(), ComparePred.Merging(), Vector2.Z());\n      mov(Dst.Z(), VTMP1.Z());\n    }\n  } else {\n    LOGMAN_THROW_A_FMT(!IsScalar, \"should use VFMinScalarInsert instead\");\n\n    if (HostSupportsAFP) {\n      // AFP.AH lets fmin behave like x86 min\n      fmin(SubRegSize, Dst.Q(), Vector1.Q(), Vector2.Q());\n      return;\n    }\n\n    if (Dst == Vector1) {\n      // Destination is already Vector1, need to insert Vector2 on false.\n      fcmgt(SubRegSize, VTMP1.Q(), Vector2.Q(), Vector1.Q());\n      bif(Dst.Q(), Vector2.Q(), VTMP1.Q());\n    } else if (Dst == Vector2) {\n      // Destination is already Vector2, Invert arguments and insert Vector1 on false.\n      fcmgt(SubRegSize, VTMP1.Q(), Vector1.Q(), Vector2.Q());\n      bif(Dst.Q(), Vector1.Q(), VTMP1.Q());\n    } else {\n      // Dst is not either source, need a move.\n      fcmgt(SubRegSize, VTMP1.Q(), Vector2.Q(), Vector1.Q());\n      mov(Dst.Q(), Vector1.Q());\n      bif(Dst.Q(), Vector2.Q(), VTMP1.Q());\n    }\n  }\n}\n\nDEF_OP(VFMax) {\n  const auto Op = IROp->C<IR::IROp_VFMax>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  // NOTE: See VFMin implementation for reasons why we\n  //       don't just use FMAX/FMIN for these implementations.\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B;\n    const auto ComparePred = ARMEmitter::PReg::p0;\n\n    fcmgt(SubRegSize, ComparePred, Mask.Zeroing(), Vector2.Z(), Vector1.Z());\n\n    if (Dst == Vector1) {\n      // Trivial case where Vector1 is also the destination.\n      // We don't need to move any data around in this case (aside from the merge).\n      mov(SubRegSize, Dst.Z(), ComparePred.Merging(), Vector2.Z());\n    } else {\n      mov(VTMP1.Z(), Vector1.Z());\n      mov(SubRegSize, VTMP1.Z(), ComparePred.Merging(), Vector2.Z());\n      mov(Dst.Z(), VTMP1.Z());\n    }\n  } else {\n    LOGMAN_THROW_A_FMT(!IsScalar, \"should use VFMaxScalarInsert instead\");\n\n    if (HostSupportsAFP) {\n      // AFP.AH lets fmax behave like x86 max\n      fmax(SubRegSize, Dst.Q(), Vector1.Q(), Vector2.Q());\n      return;\n    }\n\n    if (Dst == Vector1) {\n      // Destination is already Vector1, need to insert Vector2 on true.\n      fcmgt(SubRegSize, VTMP1.Q(), Vector2.Q(), Vector1.Q());\n      bit(Dst.Q(), Vector2.Q(), VTMP1.Q());\n    } else if (Dst == Vector2) {\n      // Destination is already Vector2, Invert arguments and insert Vector1 on true.\n      fcmgt(SubRegSize, VTMP1.Q(), Vector1.Q(), Vector2.Q());\n      bit(Dst.Q(), Vector1.Q(), VTMP1.Q());\n    } else {\n      // Dst is not either source, need a move.\n      fcmgt(SubRegSize, VTMP1.Q(), Vector2.Q(), Vector1.Q());\n      mov(Dst.Q(), Vector1.Q());\n      bit(Dst.Q(), Vector2.Q(), VTMP1.Q());\n    }\n  }\n}\n\nDEF_OP(VFRecp) {\n  const auto Op = IROp->C<IR::IROp_VFRecp>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair16(IROp);\n  const auto IsScalar = Op->Header.ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Pred = PRED_TMP_32B.Merging();\n\n    if (ElementSize == IR::OpSize::i32Bit && HostSupportsRPRES) {\n      // RPRES gives enough precision for this.\n      frecpe(SubRegSize.Vector, Dst.Z(), Vector.Z());\n      return;\n    }\n\n    fmov(SubRegSize.Vector, VTMP1.Z(), 1.0);\n    fdiv(SubRegSize.Vector, VTMP1.Z(), Pred, VTMP1.Z(), Vector.Z());\n    mov(Dst.Z(), VTMP1.Z());\n  } else {\n    if (IsScalar) {\n      if (ElementSize == IR::OpSize::i32Bit && HostSupportsRPRES) {\n        // RPRES gives enough precision for this.\n        frecpe(SubRegSize.Scalar, Dst.S(), Vector.S());\n        return;\n      }\n\n      fmov(SubRegSize.Scalar, VTMP1.Q(), 1.0f);\n      switch (ElementSize) {\n      case IR::OpSize::i16Bit: {\n        fdiv(Dst.H(), VTMP1.H(), Vector.H());\n        break;\n      }\n      case IR::OpSize::i32Bit: {\n        fdiv(Dst.S(), VTMP1.S(), Vector.S());\n        break;\n      }\n      case IR::OpSize::i64Bit: {\n        fdiv(Dst.D(), VTMP1.D(), Vector.D());\n        break;\n      }\n      default: {\n        LOGMAN_MSG_A_FMT(\"Unexpected ElementSize for {}\", __func__);\n        FEX_UNREACHABLE;\n      }\n      }\n    } else {\n      if (ElementSize == IR::OpSize::i32Bit && HostSupportsRPRES) {\n        // RPRES gives enough precision for this.\n        if (OpSize == IR::OpSize::i64Bit) {\n          frecpe(SubRegSize.Vector, Dst.D(), Vector.D());\n        } else {\n          frecpe(SubRegSize.Vector, Dst.Q(), Vector.Q());\n        }\n        return;\n      }\n\n      fmov(SubRegSize.Vector, VTMP1.Q(), 1.0f);\n      fdiv(SubRegSize.Vector, Dst.Q(), VTMP1.Q(), Vector.Q());\n    }\n  }\n}\n\nDEF_OP(VFRecpPrecision) {\n  const auto Op = IROp->C<IR::IROp_VFRecpPrecision>();\n  const auto OpSize = IROp->Size;\n  const auto ElementSize = Op->Header.ElementSize;\n\n  LOGMAN_THROW_A_FMT((OpSize == IR::OpSize::i64Bit || OpSize == IR::OpSize::i32Bit) && ElementSize == IR::OpSize::i32Bit,\n                     \"Unexpected sizes for operation.\", __func__);\n\n  const auto SubRegSize = ConvertSubRegSizePair16(IROp);\n  const auto IsScalar = OpSize == ElementSize;\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (IsScalar) {\n    if (ElementSize == IR::OpSize::i32Bit && HostSupportsRPRES) {\n      // Not enough precision so we need to improve it with frecps\n      frecpe(SubRegSize.Scalar, VTMP1.S(), Vector.S());\n      frecps(SubRegSize.Scalar, VTMP2.S(), VTMP1.S(), Vector.S());\n      fmul(SubRegSize.Scalar, Dst.S(), VTMP1.S(), VTMP2.S());\n      return;\n    }\n\n    fmov(SubRegSize.Scalar, VTMP1.Q(), 1.0f);\n    // Element size is known to be 32bits\n    fdiv(Dst.S(), VTMP1.S(), Vector.S());\n  } else { // Vector operation - Opsize 64bits, elementsize 32bits\n    if (HostSupportsRPRES) {\n      frecpe(SubRegSize.Vector, VTMP1.D(), Vector.D());\n      frecps(SubRegSize.Vector, VTMP2.D(), VTMP1.D(), Vector.D());\n      fmul(SubRegSize.Vector, Dst.D(), VTMP1.D(), VTMP2.D());\n      return;\n    }\n\n    // No RPRES, so normal division\n    fmov(SubRegSize.Vector, VTMP1.Q(), 1.0f);\n    fdiv(SubRegSize.Vector, Dst.Q(), VTMP1.Q(), Vector.Q());\n  }\n}\n\nDEF_OP(VFRSqrt) {\n  const auto Op = IROp->C<IR::IROp_VFRSqrt>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair16(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Pred = PRED_TMP_32B.Merging();\n    if (ElementSize == IR::OpSize::i32Bit && HostSupportsRPRES) {\n      // RPRES gives enough precision for this.\n      frsqrte(SubRegSize.Vector, Dst.Z(), Vector.Z());\n      return;\n    }\n\n    fsqrt(SubRegSize.Vector, VTMP1.Z(), Pred, Vector.Z());\n    fmov(SubRegSize.Vector, Dst.Z(), 1.0);\n    fdiv(SubRegSize.Vector, Dst.Z(), Pred, Dst.Z(), VTMP1.Z());\n  } else {\n    if (IsScalar) {\n      if (ElementSize == IR::OpSize::i32Bit && HostSupportsRPRES) {\n        // RPRES gives enough precision for this.\n        frsqrte(SubRegSize.Scalar, Dst.S(), Vector.S());\n        return;\n      }\n\n      fmov(SubRegSize.Scalar, VTMP1.Q(), 1.0);\n      switch (ElementSize) {\n      case IR::OpSize::i16Bit: {\n        fsqrt(VTMP2.H(), Vector.H());\n        fdiv(Dst.H(), VTMP1.H(), VTMP2.H());\n        break;\n      }\n      case IR::OpSize::i32Bit: {\n        fsqrt(VTMP2.S(), Vector.S());\n        fdiv(Dst.S(), VTMP1.S(), VTMP2.S());\n        break;\n      }\n      case IR::OpSize::i64Bit: {\n        fsqrt(VTMP2.D(), Vector.D());\n        fdiv(Dst.D(), VTMP1.D(), VTMP2.D());\n        break;\n      }\n      default: break;\n      }\n    } else {\n      if (ElementSize == IR::OpSize::i32Bit && HostSupportsRPRES) {\n        // RPRES gives enough precision for this.\n        if (OpSize == IR::OpSize::i64Bit) {\n          frsqrte(SubRegSize.Vector, Dst.D(), Vector.D());\n        } else {\n          frsqrte(SubRegSize.Vector, Dst.Q(), Vector.Q());\n        }\n        return;\n      }\n\n      fmov(SubRegSize.Vector, VTMP1.Q(), 1.0);\n      fsqrt(SubRegSize.Vector, VTMP2.Q(), Vector.Q());\n      fdiv(SubRegSize.Vector, Dst.Q(), VTMP1.Q(), VTMP2.Q());\n    }\n  }\n}\n\nDEF_OP(VFRSqrtPrecision) {\n  const auto Op = IROp->C<IR::IROp_VFRSqrtPrecision>();\n  const auto OpSize = IROp->Size;\n  const auto ElementSize = Op->Header.ElementSize;\n\n\n  LOGMAN_THROW_A_FMT((OpSize == IR::OpSize::i64Bit || OpSize == IR::OpSize::i32Bit) && ElementSize == IR::OpSize::i32Bit,\n                     \"Unexpected sizes for operation.\", __func__);\n\n  const auto SubRegSize = ConvertSubRegSizePair16(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (IsScalar) {\n    if (HostSupportsRPRES) {\n      frsqrte(SubRegSize.Scalar, VTMP1.S(), Vector.S());\n      // Improve initial estimate which is not good enough.\n      fmul(SubRegSize.Scalar, VTMP2.S(), VTMP1.S(), VTMP1.S());\n      frsqrts(SubRegSize.Scalar, VTMP2.S(), VTMP2.S(), Vector.S());\n      fmul(SubRegSize.Scalar, Dst.S(), VTMP1.S(), VTMP2.S());\n      return;\n    }\n\n    fmov(SubRegSize.Scalar, VTMP1.Q(), 1.0);\n    // element size is known to be 32bits\n    fsqrt(VTMP2.S(), Vector.S());\n    fdiv(Dst.S(), VTMP1.S(), VTMP2.S());\n  } else {\n    if (HostSupportsRPRES) {\n      frsqrte(SubRegSize.Vector, VTMP1.D(), Vector.D());\n      // Improve initial estimate which is not good enough.\n      fmul(SubRegSize.Vector, VTMP2.D(), VTMP1.D(), VTMP1.D());\n      frsqrts(SubRegSize.Vector, VTMP2.D(), VTMP2.D(), Vector.D());\n      fmul(SubRegSize.Vector, Dst.D(), VTMP1.D(), VTMP2.D());\n      return;\n    }\n    fmov(SubRegSize.Vector, VTMP1.Q(), 1.0);\n    fsqrt(SubRegSize.Vector, VTMP2.Q(), Vector.Q());\n    fdiv(SubRegSize.Vector, Dst.Q(), VTMP1.Q(), VTMP2.Q());\n  }\n}\n\nDEF_OP(VNot) {\n  const auto Op = IROp->C<IR::IROp_VNot>();\n  const auto OpSize = IROp->Size;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    not_(ARMEmitter::SubRegSize::i8Bit, Dst.Z(), PRED_TMP_32B.Merging(), Vector.Z());\n  } else {\n    mvn(ARMEmitter::SubRegSize::i8Bit, Dst.Q(), Vector.Q());\n  }\n}\n\nDEF_OP(VUMin) {\n  const auto Op = IROp->C<IR::IROp_VUMin>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize16(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Pred = PRED_TMP_32B.Merging();\n\n    // In any case where the destination aliases one of the source vectors\n    // then we can just perform the UMIN in place.\n    if (Dst == Vector1) {\n      umin(SubRegSize, Dst.Z(), Pred, Dst.Z(), Vector2.Z());\n    } else if (Dst == Vector2) {\n      umin(SubRegSize, Dst.Z(), Pred, Dst.Z(), Vector1.Z());\n    } else {\n      // SVE UMIN is a destructive operation, but we know nothing is\n      // aliasing the destination by this point, so we can move into\n      // the destination without needing a temporary.\n      movprfx(Dst.Z(), Vector1.Z());\n      umin(SubRegSize, Dst.Z(), Pred, Dst.Z(), Vector2.Z());\n    }\n  } else {\n    switch (ElementSize) {\n    case IR::OpSize::i8Bit:\n    case IR::OpSize::i16Bit:\n    case IR::OpSize::i32Bit: {\n      umin(SubRegSize, Dst.Q(), Vector1.Q(), Vector2.Q());\n      break;\n    }\n    case IR::OpSize::i64Bit: {\n      cmhi(SubRegSize, VTMP1.Q(), Vector2.Q(), Vector1.Q());\n      mov(VTMP2.Q(), Vector1.Q());\n      bif(VTMP2.Q(), Vector2.Q(), VTMP1.Q());\n      mov(Dst.Q(), VTMP2.Q());\n      break;\n    }\n    default: break;\n    }\n  }\n}\n\nDEF_OP(VSMin) {\n  const auto Op = IROp->C<IR::IROp_VSMin>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize16(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Pred = PRED_TMP_32B.Merging();\n\n    // In any case where the destination aliases one of the source vectors\n    // then we can just perform the SMIN in place.\n    if (Dst == Vector1) {\n      smin(SubRegSize, Dst.Z(), Pred, Dst.Z(), Vector2.Z());\n    } else if (Dst == Vector2) {\n      smin(SubRegSize, Dst.Z(), Pred, Dst.Z(), Vector1.Z());\n    } else {\n      // SVE SMIN is a destructive operation, but we know nothing is\n      // aliasing the destination by this point, so we can move into\n      // the destination without needing a temporary.\n      movprfx(Dst.Z(), Vector1.Z());\n      smin(SubRegSize, Dst.Z(), Pred, Dst.Z(), Vector2.Z());\n    }\n  } else {\n    switch (ElementSize) {\n    case IR::OpSize::i8Bit:\n    case IR::OpSize::i16Bit:\n    case IR::OpSize::i32Bit: {\n      smin(SubRegSize, Dst.Q(), Vector1.Q(), Vector2.Q());\n      break;\n    }\n    case IR::OpSize::i64Bit: {\n      cmgt(SubRegSize, VTMP1.Q(), Vector1.Q(), Vector2.Q());\n      mov(VTMP2.Q(), Vector1.Q());\n      bif(VTMP2.Q(), Vector2.Q(), VTMP1.Q());\n      mov(Dst.Q(), VTMP2.Q());\n      break;\n    }\n    default: break;\n    }\n  }\n}\n\nDEF_OP(VUMax) {\n  const auto Op = IROp->C<IR::IROp_VUMax>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize16(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Pred = PRED_TMP_32B.Merging();\n\n    // In any case where the destination aliases one of the source vectors\n    // then we can just perform the UMAX in place.\n    if (Dst == Vector1) {\n      umax(SubRegSize, Dst.Z(), Pred, Dst.Z(), Vector2.Z());\n    } else if (Dst == Vector2) {\n      umax(SubRegSize, Dst.Z(), Pred, Dst.Z(), Vector1.Z());\n    } else {\n      // SVE UMAX is a destructive operation, but we know nothing is\n      // aliasing the destination by this point, so we can move into\n      // the destination without needing a temporary.\n      movprfx(Dst.Z(), Vector1.Z());\n      umax(SubRegSize, Dst.Z(), Pred, Dst.Z(), Vector2.Z());\n    }\n  } else {\n    switch (ElementSize) {\n    case IR::OpSize::i8Bit:\n    case IR::OpSize::i16Bit:\n    case IR::OpSize::i32Bit: {\n      umax(SubRegSize, Dst.Q(), Vector1.Q(), Vector2.Q());\n      break;\n    }\n    case IR::OpSize::i64Bit: {\n      cmhi(SubRegSize, VTMP1.Q(), Vector2.Q(), Vector1.Q());\n      mov(VTMP2.Q(), Vector1.Q());\n      bif(VTMP2.Q(), Vector2.Q(), VTMP1.Q());\n      mov(Dst.Q(), VTMP2.Q());\n      break;\n    }\n    default: break;\n    }\n  }\n}\n\nDEF_OP(VSMax) {\n  const auto Op = IROp->C<IR::IROp_VSMax>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize16(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Pred = PRED_TMP_32B.Merging();\n\n    // In any case where the destination aliases one of the source vectors\n    // then we can just perform the SMAX in place.\n    if (Dst == Vector1) {\n      smax(SubRegSize, Dst.Z(), Pred, Dst.Z(), Vector2.Z());\n    } else if (Dst == Vector2) {\n      smax(SubRegSize, Dst.Z(), Pred, Dst.Z(), Vector1.Z());\n    } else {\n      // SVE SMAX is a destructive operation, but we know nothing is\n      // aliasing the destination by this point, so we can move into\n      // the destination without needing a temporary.\n      movprfx(Dst.Z(), Vector1.Z());\n      smax(SubRegSize, Dst.Z(), Pred, Dst.Z(), Vector2.Z());\n    }\n  } else {\n    switch (ElementSize) {\n    case IR::OpSize::i8Bit:\n    case IR::OpSize::i16Bit:\n    case IR::OpSize::i32Bit: {\n      smax(SubRegSize, Dst.Q(), Vector1.Q(), Vector2.Q());\n      break;\n    }\n    case IR::OpSize::i64Bit: {\n      cmgt(SubRegSize, VTMP1.Q(), Vector2.Q(), Vector1.Q());\n      mov(VTMP2.Q(), Vector1.Q());\n      bif(VTMP2.Q(), Vector2.Q(), VTMP1.Q());\n      mov(Dst.Q(), VTMP2.Q());\n      break;\n    }\n    default: break;\n    }\n  }\n}\n\nDEF_OP(VBSL) {\n  const auto Op = IROp->C<IR::IROp_VBSL>();\n  const auto OpSize = IROp->Size;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Is128Bit = OpSize == IR::OpSize::i128Bit;\n\n  const auto Dst = GetVReg(Node);\n  const auto VectorFalse = GetVReg(Op->VectorFalse);\n  const auto VectorTrue = GetVReg(Op->VectorTrue);\n  const auto VectorMask = GetVReg(Op->VectorMask);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    // NOTE: Slight parameter difference from ASIMD\n    //       ASIMD -> BSL Mask, True, False\n    //       SVE   -> BSL True, True, False, Mask\n    //       ASIMD -> BIT True, False, Mask\n    //       ASIMD -> BIF False, True, Mask\n    if (Dst == VectorTrue) {\n      // Trivial case where we can perform the operation in place.\n      bsl(Dst.Z(), Dst.Z(), VectorFalse.Z(), VectorMask.Z());\n    } else {\n      movprfx(VTMP1.Z(), VectorTrue.Z());\n      bsl(VTMP1.Z(), VTMP1.Z(), VectorFalse.Z(), VectorMask.Z());\n      mov(Dst.Z(), VTMP1.Z());\n    }\n  } else if (!HostSupportsSVE256 && HostSupportsSVE128 && Is128Bit && Dst != VectorFalse && Dst != VectorTrue && Dst != VectorMask) {\n    // Needs to move but SVE movprfx+bsl is slightly more efficient than ASIMD mov+bsl on CPUs that support\n    // movprfx fusion and NOT zero-cycle vector register moves.\n    movprfx(Dst.Z(), VectorTrue.Z());\n    bsl(Dst.Z(), Dst.Z(), VectorFalse.Z(), VectorMask.Z());\n  } else {\n    if (VectorMask == Dst) {\n      // Can use BSL without any moves.\n      if (OpSize == IR::OpSize::i64Bit) {\n        bsl(Dst.D(), VectorTrue.D(), VectorFalse.D());\n      } else {\n        bsl(Dst.Q(), VectorTrue.Q(), VectorFalse.Q());\n      }\n    } else if (VectorTrue == Dst) {\n      // Can use BIF without any moves.\n      if (OpSize == IR::OpSize::i64Bit) {\n        bif(Dst.D(), VectorFalse.D(), VectorMask.D());\n      } else {\n        bif(Dst.Q(), VectorFalse.Q(), VectorMask.Q());\n      }\n    } else if (VectorFalse == Dst) {\n      // Can use BIT without any moves.\n      if (OpSize == IR::OpSize::i64Bit) {\n        bit(Dst.D(), VectorTrue.D(), VectorMask.D());\n      } else {\n        bit(Dst.Q(), VectorTrue.Q(), VectorMask.Q());\n      }\n    } else {\n      // Needs moves.\n      if (OpSize == IR::OpSize::i64Bit) {\n        mov(Dst.D(), VectorMask.D());\n        bsl(Dst.D(), VectorTrue.D(), VectorFalse.D());\n      } else {\n        mov(Dst.Q(), VectorMask.Q());\n        bsl(Dst.Q(), VectorTrue.Q(), VectorFalse.Q());\n      }\n    }\n  }\n}\n\nDEF_OP(VCMPEQ) {\n  const auto Op = IROp->C<IR::IROp_VCMPEQ>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair16(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    // FIXME: We should rework this op to avoid the NZCV spill/fill dance.\n    mrs(TMP1, ARMEmitter::SystemRegister::NZCV);\n\n    const auto Mask = PRED_TMP_32B.Zeroing();\n    const auto ComparePred = ARMEmitter::PReg::p0;\n\n    // General idea is to compare for equality, not the equal vals\n    // from one of the registers, then or both together to make the\n    // relevant equal entries all 1s.\n    cmpeq(SubRegSize.Vector, ComparePred, Mask, Vector1.Z(), Vector2.Z());\n    not_(SubRegSize.Vector, VTMP1.Z(), ComparePred.Merging(), Vector1.Z());\n    movprfx(SubRegSize.Vector, Dst.Z(), ComparePred.Zeroing(), Vector1.Z());\n    orr(SubRegSize.Vector, Dst.Z(), ComparePred.Merging(), Dst.Z(), VTMP1.Z());\n\n    // Restore NZCV\n    msr(ARMEmitter::SystemRegister::NZCV, TMP1);\n  } else {\n    if (IsScalar) {\n      cmeq(SubRegSize.Scalar, Dst, Vector1, Vector2);\n    } else {\n      cmeq(SubRegSize.Vector, Dst.Q(), Vector1.Q(), Vector2.Q());\n    }\n  }\n}\n\nDEF_OP(VCMPEQZ) {\n  const auto Op = IROp->C<IR::IROp_VCMPEQZ>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair16(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Zeroing();\n    const auto ComparePred = ARMEmitter::PReg::p0;\n\n    // FIXME: We should rework this op to avoid the NZCV spill/fill dance.\n    mrs(TMP1, ARMEmitter::SystemRegister::NZCV);\n\n    // Ensure no junk is in the temp (important for ensuring\n    // non-equal entries remain as zero).\n    mov_imm(ARMEmitter::SubRegSize::i64Bit, VTMP1.Z(), 0);\n    // Unlike with VCMPEQ, we can skip needing to bitwise OR the\n    // final results, since if our elements are equal to zero,\n    // we just need to bitwise NOT them and they're already set\n    // to all 1s.\n    cmpeq(SubRegSize.Vector, ComparePred, Mask, Vector.Z(), 0);\n    not_(SubRegSize.Vector, VTMP1.Z(), ComparePred.Merging(), Vector.Z());\n    mov(Dst.Z(), VTMP1.Z());\n\n    // Restore NZCV\n    msr(ARMEmitter::SystemRegister::NZCV, TMP1);\n  } else {\n    if (IsScalar) {\n      cmeq(SubRegSize.Scalar, Dst, Vector);\n    } else {\n      cmeq(SubRegSize.Vector, Dst.Q(), Vector.Q());\n    }\n  }\n}\n\nDEF_OP(VCMPGT) {\n  const auto Op = IROp->C<IR::IROp_VCMPGT>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair16(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Zeroing();\n    const auto ComparePred = ARMEmitter::PReg::p0;\n\n    // FIXME: We should rework this op to avoid the NZCV spill/fill dance.\n    mrs(TMP1, ARMEmitter::SystemRegister::NZCV);\n\n    // General idea is to compare for greater-than, bitwise NOT\n    // the valid values, then ORR the NOTed values with the original\n    // values to form entries that are all 1s.\n    cmpgt(SubRegSize.Vector, ComparePred, Mask, Vector1.Z(), Vector2.Z());\n    not_(SubRegSize.Vector, VTMP1.Z(), ComparePred.Merging(), Vector1.Z());\n    movprfx(SubRegSize.Vector, Dst.Z(), ComparePred.Zeroing(), Vector1.Z());\n    orr(SubRegSize.Vector, Dst.Z(), ComparePred.Merging(), Dst.Z(), VTMP1.Z());\n\n    // Restore NZCV\n    msr(ARMEmitter::SystemRegister::NZCV, TMP1);\n  } else {\n    if (IsScalar) {\n      cmgt(SubRegSize.Scalar, Dst, Vector1, Vector2);\n    } else {\n      cmgt(SubRegSize.Vector, Dst.Q(), Vector1.Q(), Vector2.Q());\n    }\n  }\n}\n\nDEF_OP(VCMPGTZ) {\n  const auto Op = IROp->C<IR::IROp_VCMPGTZ>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair16(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Zeroing();\n    const auto ComparePred = ARMEmitter::PReg::p0;\n\n    // FIXME: We should rework this op to avoid the NZCV spill/fill dance.\n    mrs(TMP1, ARMEmitter::SystemRegister::NZCV);\n\n    // Ensure no junk is in the temp (important for ensuring\n    // non greater-than values remain as zero).\n    mov_imm(ARMEmitter::SubRegSize::i64Bit, VTMP1.Z(), 0);\n    cmpgt(SubRegSize.Vector, ComparePred, Mask, Vector.Z(), 0);\n    not_(SubRegSize.Vector, VTMP1.Z(), ComparePred.Merging(), Vector.Z());\n    orr(SubRegSize.Vector, VTMP1.Z(), ComparePred.Merging(), VTMP1.Z(), Vector.Z());\n    mov(Dst.Z(), VTMP1.Z());\n\n    // Restore NZCV\n    msr(ARMEmitter::SystemRegister::NZCV, TMP1);\n  } else {\n    if (IsScalar) {\n      cmgt(SubRegSize.Scalar, Dst, Vector);\n    } else {\n      cmgt(SubRegSize.Vector, Dst.Q(), Vector.Q());\n    }\n  }\n}\n\nDEF_OP(VCMPLTZ) {\n  const auto Op = IROp->C<IR::IROp_VCMPLTZ>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair16(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Zeroing();\n    const auto ComparePred = ARMEmitter::PReg::p0;\n\n    // FIXME: We should rework this op to avoid the NZCV spill/fill dance.\n    mrs(TMP1, ARMEmitter::SystemRegister::NZCV);\n\n    // Ensure no junk is in the temp (important for ensuring\n    // non less-than values remain as zero).\n    mov_imm(ARMEmitter::SubRegSize::i64Bit, VTMP1.Z(), 0);\n    cmplt(SubRegSize.Vector, ComparePred, Mask, Vector.Z(), 0);\n    not_(SubRegSize.Vector, VTMP1.Z(), ComparePred.Merging(), Vector.Z());\n    orr(SubRegSize.Vector, VTMP1.Z(), ComparePred.Merging(), VTMP1.Z(), Vector.Z());\n    mov(Dst.Z(), VTMP1.Z());\n\n    // Restore NZCV\n    msr(ARMEmitter::SystemRegister::NZCV, TMP1);\n  } else {\n    if (IsScalar) {\n      cmlt(SubRegSize.Scalar, Dst, Vector);\n    } else {\n      cmlt(SubRegSize.Vector, Dst.Q(), Vector.Q());\n    }\n  }\n}\n\nDEF_OP(VFCMPEQ) {\n  const auto Op = IROp->C<IR::IROp_VFCMPEQ>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Zeroing();\n    const auto ComparePred = ARMEmitter::PReg::p0;\n\n    fcmeq(SubRegSize.Vector, ComparePred, Mask, Vector1.Z(), Vector2.Z());\n    not_(SubRegSize.Vector, VTMP1.Z(), ComparePred.Merging(), Vector1.Z());\n    movprfx(SubRegSize.Vector, Dst.Z(), ComparePred.Zeroing(), Vector1.Z());\n    orr(SubRegSize.Vector, Dst.Z(), ComparePred.Merging(), Dst.Z(), VTMP1.Z());\n  } else {\n    if (IsScalar) {\n      switch (ElementSize) {\n      case IR::OpSize::i16Bit: {\n        fcmeq(Dst.H(), Vector1.H(), Vector2.H());\n        break;\n      }\n      case IR::OpSize::i32Bit:\n      case IR::OpSize::i64Bit: fcmeq(SubRegSize.Scalar, Dst, Vector1, Vector2); break;\n      default: break;\n      }\n    } else {\n      fcmeq(SubRegSize.Vector, Dst.Q(), Vector1.Q(), Vector2.Q());\n    }\n  }\n}\n\nDEF_OP(VFCMPNEQ) {\n  const auto Op = IROp->C<IR::IROp_VFCMPNEQ>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Zeroing();\n    const auto ComparePred = ARMEmitter::PReg::p0;\n\n    fcmne(SubRegSize.Vector, ComparePred, Mask, Vector1.Z(), Vector2.Z());\n    not_(SubRegSize.Vector, VTMP1.Z(), ComparePred.Merging(), Vector1.Z());\n    movprfx(SubRegSize.Vector, Dst.Z(), ComparePred.Zeroing(), Vector1.Z());\n    orr(SubRegSize.Vector, Dst.Z(), ComparePred.Merging(), Dst.Z(), VTMP1.Z());\n  } else {\n    if (IsScalar) {\n      switch (ElementSize) {\n      case IR::OpSize::i16Bit: {\n        fcmeq(Dst.H(), Vector1.H(), Vector2.H());\n        break;\n      }\n      case IR::OpSize::i32Bit:\n      case IR::OpSize::i64Bit: fcmeq(SubRegSize.Scalar, Dst, Vector1, Vector2); break;\n      default: break;\n      }\n      mvn(ARMEmitter::SubRegSize::i8Bit, Dst.D(), Dst.D());\n    } else {\n      fcmeq(SubRegSize.Vector, Dst.Q(), Vector1.Q(), Vector2.Q());\n      mvn(ARMEmitter::SubRegSize::i8Bit, Dst.Q(), Dst.Q());\n    }\n  }\n}\n\nDEF_OP(VFCMPLT) {\n  const auto Op = IROp->C<IR::IROp_VFCMPLT>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Zeroing();\n    const auto ComparePred = ARMEmitter::PReg::p0;\n\n    fcmgt(SubRegSize.Vector, ComparePred, Mask, Vector2.Z(), Vector1.Z());\n    not_(SubRegSize.Vector, VTMP1.Z(), ComparePred.Merging(), Vector2.Z());\n    movprfx(SubRegSize.Vector, Dst.Z(), ComparePred.Zeroing(), Vector2.Z());\n    orr(SubRegSize.Vector, Dst.Z(), ComparePred.Merging(), Dst.Z(), VTMP1.Z());\n  } else {\n    if (IsScalar) {\n      switch (ElementSize) {\n      case IR::OpSize::i16Bit: {\n        fcmgt(Dst.H(), Vector2.H(), Vector1.H());\n        break;\n      }\n      case IR::OpSize::i32Bit:\n      case IR::OpSize::i64Bit: fcmgt(SubRegSize.Scalar, Dst, Vector2, Vector1); break;\n      default: break;\n      }\n    } else {\n      fcmgt(SubRegSize.Vector, Dst.Q(), Vector2.Q(), Vector1.Q());\n    }\n  }\n}\n\nDEF_OP(VFCMPGT) {\n  const auto Op = IROp->C<IR::IROp_VFCMPGT>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Zeroing();\n    const auto ComparePred = ARMEmitter::PReg::p0;\n\n    fcmgt(SubRegSize.Vector, ComparePred, Mask, Vector1.Z(), Vector2.Z());\n    not_(SubRegSize.Vector, VTMP1.Z(), ComparePred.Merging(), Vector1.Z());\n    movprfx(SubRegSize.Vector, Dst.Z(), ComparePred.Zeroing(), Vector1.Z());\n    orr(SubRegSize.Vector, Dst.Z(), ComparePred.Merging(), Dst.Z(), VTMP1.Z());\n  } else {\n    if (IsScalar) {\n      switch (ElementSize) {\n      case IR::OpSize::i16Bit: {\n        fcmgt(Dst.H(), Vector1.H(), Vector2.H());\n        break;\n      }\n      case IR::OpSize::i32Bit:\n      case IR::OpSize::i64Bit: fcmgt(SubRegSize.Scalar, Dst, Vector1, Vector2); break;\n      default: break;\n      }\n    } else {\n      fcmgt(SubRegSize.Vector, Dst.Q(), Vector1.Q(), Vector2.Q());\n    }\n  }\n}\n\nDEF_OP(VFCMPLE) {\n  const auto Op = IROp->C<IR::IROp_VFCMPLE>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Zeroing();\n    const auto ComparePred = ARMEmitter::PReg::p0;\n\n    fcmge(SubRegSize.Vector, ComparePred, Mask, Vector2.Z(), Vector1.Z());\n    not_(SubRegSize.Vector, VTMP1.Z(), ComparePred.Merging(), Vector2.Z());\n    movprfx(SubRegSize.Vector, Dst.Z(), ComparePred.Zeroing(), Vector2.Z());\n    orr(SubRegSize.Vector, Dst.Z(), ComparePred.Merging(), Dst.Z(), VTMP1.Z());\n  } else {\n    if (IsScalar) {\n      switch (ElementSize) {\n      case IR::OpSize::i16Bit: {\n        fcmge(Dst.H(), Vector2.H(), Vector1.H());\n        break;\n      }\n      case IR::OpSize::i32Bit:\n      case IR::OpSize::i64Bit: fcmge(SubRegSize.Scalar, Dst, Vector2, Vector1); break;\n      default: break;\n      }\n    } else {\n      fcmge(SubRegSize.Vector, Dst.Q(), Vector2.Q(), Vector1.Q());\n    }\n  }\n}\n\nDEF_OP(VFCMPORD) {\n  const auto Op = IROp->C<IR::IROp_VFCMPORD>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Zeroing();\n    const auto ComparePred = ARMEmitter::PReg::p0;\n\n    // The idea is like comparing for unordered, but we just\n    // invert the predicate from the comparison to instead\n    // select all ordered elements in the vector.\n    fcmuo(SubRegSize.Vector, ComparePred, Mask, Vector1.Z(), Vector2.Z());\n    not_(ComparePred, Mask, ComparePred);\n    not_(SubRegSize.Vector, VTMP1.Z(), ComparePred.Merging(), Vector1.Z());\n    movprfx(SubRegSize.Vector, Dst.Z(), ComparePred.Zeroing(), Vector1.Z());\n    orr(SubRegSize.Vector, Dst.Z(), ComparePred.Merging(), Dst.Z(), VTMP1.Z());\n  } else {\n    if (IsScalar) {\n      switch (ElementSize) {\n      case IR::OpSize::i16Bit: {\n        fcmge(VTMP1.H(), Vector1.H(), Vector2.H());\n        fcmgt(VTMP2.H(), Vector2.H(), Vector1.H());\n        orr(Dst.D(), VTMP1.D(), VTMP2.D());\n        break;\n      }\n      case IR::OpSize::i32Bit:\n      case IR::OpSize::i64Bit:\n        fcmge(SubRegSize.Scalar, VTMP1, Vector1, Vector2);\n        fcmgt(SubRegSize.Scalar, VTMP2, Vector2, Vector1);\n        orr(Dst.D(), VTMP1.D(), VTMP2.D());\n        break;\n      default: break;\n      }\n    } else {\n      fcmge(SubRegSize.Vector, VTMP1.Q(), Vector1.Q(), Vector2.Q());\n      fcmgt(SubRegSize.Vector, VTMP2.Q(), Vector2.Q(), Vector1.Q());\n      orr(Dst.Q(), VTMP1.Q(), VTMP2.Q());\n    }\n  }\n}\n\nDEF_OP(VFCMPUNO) {\n  const auto Op = IROp->C<IR::IROp_VFCMPUNO>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSizePair248(IROp);\n  const auto IsScalar = ElementSize == OpSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Zeroing();\n    const auto ComparePred = ARMEmitter::PReg::p0;\n\n    fcmuo(SubRegSize.Vector, ComparePred, Mask, Vector1.Z(), Vector2.Z());\n    not_(SubRegSize.Vector, VTMP1.Z(), ComparePred.Merging(), Vector1.Z());\n    movprfx(SubRegSize.Vector, Dst.Z(), ComparePred.Zeroing(), Vector1.Z());\n    orr(SubRegSize.Vector, Dst.Z(), ComparePred.Merging(), Dst.Z(), VTMP1.Z());\n  } else {\n    if (IsScalar) {\n      switch (ElementSize) {\n      case IR::OpSize::i16Bit: {\n        fcmge(VTMP1.H(), Vector1.H(), Vector2.H());\n        fcmgt(VTMP2.H(), Vector2.H(), Vector1.H());\n        orr(Dst.D(), VTMP1.D(), VTMP2.D());\n        mvn(ARMEmitter::SubRegSize::i8Bit, Dst.D(), Dst.D());\n        break;\n      }\n      case IR::OpSize::i32Bit:\n      case IR::OpSize::i64Bit:\n        fcmge(SubRegSize.Scalar, VTMP1, Vector1, Vector2);\n        fcmgt(SubRegSize.Scalar, VTMP2, Vector2, Vector1);\n        orr(Dst.D(), VTMP1.D(), VTMP2.D());\n        mvn(ARMEmitter::SubRegSize::i8Bit, Dst.D(), Dst.D());\n        break;\n      default: break;\n      }\n    } else {\n      fcmge(SubRegSize.Vector, VTMP1.Q(), Vector1.Q(), Vector2.Q());\n      fcmgt(SubRegSize.Vector, VTMP2.Q(), Vector2.Q(), Vector1.Q());\n      orr(Dst.Q(), VTMP1.Q(), VTMP2.Q());\n      mvn(ARMEmitter::SubRegSize::i8Bit, Dst.Q(), Dst.Q());\n    }\n  }\n}\n\nDEF_OP(VUShl) {\n  const auto Op = IROp->C<IR::IROp_VUShl>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = IROp->ElementSize;\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto MaxShift = IR::OpSizeAsBits(ElementSize);\n\n  const auto Dst = GetVReg(Node);\n  auto ShiftVector = GetVReg(Op->ShiftVector);\n  const auto Vector = GetVReg(Op->Vector);\n  const auto RangeCheck = Op->RangeCheck;\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    if (RangeCheck) {\n      dup_imm(SubRegSize, VTMP2.Z(), MaxShift);\n      umin(SubRegSize, VTMP2.Z(), Mask, VTMP2.Z(), ShiftVector.Z());\n      ShiftVector = VTMP2;\n    }\n\n    if (Dst == ShiftVector) {\n      // If destination aliases the shift vector then we need to move it temporarily.\n      mov(VTMP2.Z(), ShiftVector.Z());\n      ShiftVector = VTMP2;\n    }\n\n    // If Dst aliases Vector, then we can skip the move.\n    if (Dst != Vector) {\n      movprfx(Dst.Z(), Vector.Z());\n    }\n    lsl(SubRegSize, Dst.Z(), Mask, Dst.Z(), ShiftVector.Z());\n  } else {\n    if (RangeCheck) {\n      if (ElementSize < IR::OpSize::i64Bit) {\n        movi(SubRegSize, VTMP1.Q(), MaxShift);\n        umin(SubRegSize, VTMP1.Q(), VTMP1.Q(), ShiftVector.Q());\n      } else {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, MaxShift);\n        dup(SubRegSize, VTMP1.Q(), TMP1.R());\n\n        // UMIN is silly on Adv.SIMD and doesn't have a variant that handles 64-bit elements\n        cmhi(SubRegSize, VTMP2.Q(), ShiftVector.Q(), VTMP1.Q());\n        bif(VTMP1.Q(), ShiftVector.Q(), VTMP2.Q());\n      }\n      ShiftVector = VTMP1;\n    }\n\n    ushl(SubRegSize, Dst.Q(), Vector.Q(), ShiftVector.Q());\n  }\n}\n\nDEF_OP(VUShr) {\n  const auto Op = IROp->C<IR::IROp_VUShr>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = IROp->ElementSize;\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto MaxShift = IR::OpSizeAsBits(ElementSize);\n\n  const auto Dst = GetVReg(Node);\n  auto ShiftVector = GetVReg(Op->ShiftVector);\n  const auto Vector = GetVReg(Op->Vector);\n  const auto RangeCheck = Op->RangeCheck;\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    if (RangeCheck) {\n      dup_imm(SubRegSize, VTMP2.Z(), MaxShift);\n      umin(SubRegSize, VTMP2.Z(), Mask, VTMP2.Z(), ShiftVector.Z());\n      ShiftVector = VTMP2;\n    }\n\n    if (Dst == ShiftVector) {\n      // If destination aliases the shift vector then we need to move it temporarily.\n      mov(VTMP2.Z(), ShiftVector.Z());\n      ShiftVector = VTMP2;\n    }\n\n    // If Dst aliases Vector, then we can skip the move.\n    if (Dst != Vector) {\n      movprfx(Dst.Z(), Vector.Z());\n    }\n    lsr(SubRegSize, Dst.Z(), Mask, Dst.Z(), ShiftVector.Z());\n  } else {\n    if (RangeCheck) {\n      if (ElementSize < IR::OpSize::i64Bit) {\n        movi(SubRegSize, VTMP1.Q(), MaxShift);\n        umin(SubRegSize, VTMP1.Q(), VTMP1.Q(), ShiftVector.Q());\n      } else {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, MaxShift);\n        dup(SubRegSize, VTMP1.Q(), TMP1.R());\n\n        // UMIN is silly on Adv.SIMD and doesn't have a variant that handles 64-bit elements\n        cmhi(SubRegSize, VTMP2.Q(), ShiftVector.Q(), VTMP1.Q());\n        bif(VTMP1.Q(), ShiftVector.Q(), VTMP2.Q());\n      }\n      ShiftVector = VTMP1;\n    }\n\n    // Need to invert shift values to perform a right shift with USHL\n    // (USHR only has an immediate variant).\n    neg(SubRegSize, VTMP1.Q(), ShiftVector.Q());\n    ushl(SubRegSize, Dst.Q(), Vector.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VSShr) {\n  const auto Op = IROp->C<IR::IROp_VSShr>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = IROp->ElementSize;\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto MaxShift = IR::OpSizeAsBits(ElementSize) - 1;\n  const auto RangeCheck = Op->RangeCheck;\n\n  const auto Dst = GetVReg(Node);\n  auto ShiftVector = GetVReg(Op->ShiftVector);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    if (RangeCheck) {\n      dup_imm(SubRegSize, VTMP1.Z(), MaxShift);\n      umin(SubRegSize, VTMP1.Z(), Mask, VTMP1.Z(), ShiftVector.Z());\n      ShiftVector = VTMP1;\n    }\n\n    if (Dst == ShiftVector) {\n      // If destination aliases the shift vector then we need to move it temporarily.\n      mov(VTMP1.Z(), ShiftVector.Z());\n      ShiftVector = VTMP1;\n    }\n\n    // If Dst aliases Vector, then we can skip the move.\n    if (Dst != Vector) {\n      movprfx(Dst.Z(), Vector.Z());\n    }\n    asr(SubRegSize, Dst.Z(), Mask, Dst.Z(), ShiftVector.Z());\n  } else {\n    if (RangeCheck) {\n      if (ElementSize < IR::OpSize::i64Bit) {\n        movi(SubRegSize, VTMP1.Q(), MaxShift);\n        umin(SubRegSize, VTMP1.Q(), VTMP1.Q(), ShiftVector.Q());\n      } else {\n        LoadConstant(ARMEmitter::Size::i64Bit, TMP1, MaxShift);\n        dup(SubRegSize, VTMP1.Q(), TMP1.R());\n\n        // UMIN is silly on Adv.SIMD and doesn't have a variant that handles 64-bit elements\n        cmhi(SubRegSize, VTMP2.Q(), ShiftVector.Q(), VTMP1.Q());\n        bif(VTMP1.Q(), ShiftVector.Q(), VTMP2.Q());\n      }\n      ShiftVector = VTMP1;\n    }\n\n    // Need to invert shift values to perform a right shift with SSHL\n    // (SSHR only has an immediate variant).\n    neg(SubRegSize, VTMP1.Q(), ShiftVector.Q());\n    sshl(SubRegSize, Dst.Q(), Vector.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VUShlS) {\n  const auto Op = IROp->C<IR::IROp_VUShlS>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize16(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto ShiftScalar = GetVReg(Op->ShiftScalar);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    // NOTE: SVE LSL is a destructive operation, so we need to\n    //       move the vector into the destination if they don't\n    //       already alias.\n    dup(SubRegSize, VTMP1.Z(), ShiftScalar.Z(), 0);\n    if (Dst != Vector) {\n      movprfx(Dst.Z(), Vector.Z());\n    }\n    lsl(SubRegSize, Dst.Z(), Mask, Dst.Z(), VTMP1.Z());\n  } else {\n    dup(SubRegSize, VTMP1.Q(), ShiftScalar.Q(), 0);\n    ushl(SubRegSize, Dst.Q(), Vector.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VUShrS) {\n  const auto Op = IROp->C<IR::IROp_VUShrS>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize16(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto ShiftScalar = GetVReg(Op->ShiftScalar);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    // NOTE: SVE LSR is a destructive operation, so we need to\n    //       move the vector into the destination if they don't\n    //       already alias.\n    dup(SubRegSize, VTMP1.Z(), ShiftScalar.Z(), 0);\n    if (Dst != Vector) {\n      movprfx(Dst.Z(), Vector.Z());\n    }\n    lsr(SubRegSize, Dst.Z(), Mask, Dst.Z(), VTMP1.Z());\n  } else {\n    dup(SubRegSize, VTMP1.Q(), ShiftScalar.Q(), 0);\n    neg(SubRegSize, VTMP1.Q(), VTMP1.Q());\n    ushl(SubRegSize, Dst.Q(), Vector.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VUShrSWide) {\n  const auto Op = IROp->C<IR::IROp_VUShrSWide>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto ShiftScalar = GetVReg(Op->ShiftScalar);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    dup(ARMEmitter::SubRegSize::i64Bit, VTMP1.Z(), ShiftScalar.Z(), 0);\n    if (Dst != Vector) {\n      // NOTE: SVE LSR is a destructive operation.\n      movprfx(Dst.Z(), Vector.Z());\n    }\n    if (ElementSize == IR::OpSize::i64Bit) {\n      lsr(SubRegSize, Dst.Z(), Mask, Dst.Z(), VTMP1.Z());\n    } else {\n      lsr_wide(SubRegSize, Dst.Z(), Mask, Dst.Z(), VTMP1.Z());\n    }\n  } else if (HostSupportsSVE128) {\n    const auto Mask = PRED_TMP_16B.Merging();\n\n    auto ShiftRegister = ShiftScalar;\n    if (OpSize > IR::OpSize::i64Bit) {\n      // SVE wide shifts don't need to duplicate the low bits unless the OpSize is 16-bytes\n      // Slightly more optimal for 8-byte opsize.\n      dup(ARMEmitter::SubRegSize::i64Bit, VTMP1.Z(), ShiftScalar.Z(), 0);\n      ShiftRegister = VTMP1;\n    }\n\n    if (Dst == ShiftRegister) {\n      // If destination aliases the shift vector then we need to move it temporarily.\n      mov(VTMP1.Z(), ShiftRegister.Z());\n      ShiftRegister = VTMP1;\n    }\n\n    if (Dst != Vector) {\n      // NOTE: SVE LSR is a destructive operation.\n      movprfx(Dst.Z(), Vector.Z());\n    }\n    if (ElementSize == IR::OpSize::i64Bit) {\n      lsr(SubRegSize, Dst.Z(), Mask, Dst.Z(), ShiftRegister.Z());\n    } else {\n      lsr_wide(SubRegSize, Dst.Z(), Mask, Dst.Z(), ShiftRegister.Z());\n    }\n  } else {\n    // uqshl + ushr of 57-bits leaves 7-bits remaining.\n    // This saturates the 64-bit shift value from an arbitrary 64-bit length\n    // variable to maximum of 0x7F.\n    // This allows the shift to fit within the width of the signed 8-bits\n    // that ASIMD's vector shift requires.\n    uqshl(ARMEmitter::ScalarRegSize::i64Bit, VTMP1, ShiftScalar, 57);\n    ushr(ARMEmitter::ScalarRegSize::i64Bit, VTMP1, VTMP1, 57);\n    dup(SubRegSize, VTMP1.Q(), VTMP1.Q(), 0);\n    neg(SubRegSize, VTMP1.Q(), VTMP1.Q());\n    ushl(SubRegSize, Dst.Q(), Vector.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VSShrSWide) {\n  const auto Op = IROp->C<IR::IROp_VSShrSWide>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto ShiftScalar = GetVReg(Op->ShiftScalar);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    dup(ARMEmitter::SubRegSize::i64Bit, VTMP1.Z(), ShiftScalar.Z(), 0);\n    if (Dst != Vector) {\n      // NOTE: SVE LSR is a destructive operation.\n      movprfx(Dst.Z(), Vector.Z());\n    }\n    if (ElementSize == IR::OpSize::i64Bit) {\n      asr(SubRegSize, Dst.Z(), Mask, Dst.Z(), VTMP1.Z());\n    } else {\n      asr_wide(SubRegSize, Dst.Z(), Mask, Dst.Z(), VTMP1.Z());\n    }\n  } else if (HostSupportsSVE128) {\n    const auto Mask = PRED_TMP_16B.Merging();\n\n    auto ShiftRegister = ShiftScalar;\n    if (OpSize > IR::OpSize::i64Bit) {\n      // SVE wide shifts don't need to duplicate the low bits unless the OpSize is 16-bytes\n      // Slightly more optimal for 8-byte opsize.\n      dup(ARMEmitter::SubRegSize::i64Bit, VTMP1.Z(), ShiftScalar.Z(), 0);\n      ShiftRegister = VTMP1;\n    }\n\n    if (Dst == ShiftRegister) {\n      // If destination aliases the shift vector then we need to move it temporarily.\n      mov(VTMP1.Z(), ShiftRegister.Z());\n      ShiftRegister = VTMP1;\n    }\n\n    if (Dst != Vector) {\n      // NOTE: SVE LSR is a destructive operation.\n      movprfx(Dst.Z(), Vector.Z());\n    }\n    if (ElementSize == IR::OpSize::i64Bit) {\n      asr(SubRegSize, Dst.Z(), Mask, Dst.Z(), ShiftRegister.Z());\n    } else {\n      asr_wide(SubRegSize, Dst.Z(), Mask, Dst.Z(), ShiftRegister.Z());\n    }\n  } else {\n    // uqshl + ushr of 57-bits leaves 7-bits remaining.\n    // This saturates the 64-bit shift value from an arbitrary 64-bit length\n    // variable to maximum of 0x7F.\n    // This allows the shift to fit within the width of the signed 8-bits\n    // that ASIMD's vector shift requires.\n    uqshl(ARMEmitter::ScalarRegSize::i64Bit, VTMP1, ShiftScalar, 57);\n    ushr(ARMEmitter::ScalarRegSize::i64Bit, VTMP1, VTMP1, 57);\n    dup(SubRegSize, VTMP1.Q(), VTMP1.Q(), 0);\n    neg(SubRegSize, VTMP1.Q(), VTMP1.Q());\n    sshl(SubRegSize, Dst.Q(), Vector.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VUShlSWide) {\n  const auto Op = IROp->C<IR::IROp_VUShlSWide>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto ShiftScalar = GetVReg(Op->ShiftScalar);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    dup(ARMEmitter::SubRegSize::i64Bit, VTMP1.Z(), ShiftScalar.Z(), 0);\n    if (Dst != Vector) {\n      // NOTE: SVE LSR is a destructive operation.\n      movprfx(Dst.Z(), Vector.Z());\n    }\n    if (ElementSize == IR::OpSize::i64Bit) {\n      lsl(SubRegSize, Dst.Z(), Mask, Dst.Z(), VTMP1.Z());\n    } else {\n      lsl_wide(SubRegSize, Dst.Z(), Mask, Dst.Z(), VTMP1.Z());\n    }\n  } else if (HostSupportsSVE128) {\n    const auto Mask = PRED_TMP_16B.Merging();\n\n    auto ShiftRegister = ShiftScalar;\n    if (OpSize > IR::OpSize::i64Bit) {\n      // SVE wide shifts don't need to duplicate the low bits unless the OpSize is 16-bytes\n      // Slightly more optimal for 8-byte opsize.\n      dup(ARMEmitter::SubRegSize::i64Bit, VTMP1.Z(), ShiftScalar.Z(), 0);\n      ShiftRegister = VTMP1;\n    }\n\n    if (Dst == ShiftRegister) {\n      // If destination aliases the shift vector then we need to move it temporarily.\n      mov(VTMP1.Z(), ShiftRegister.Z());\n      ShiftRegister = VTMP1;\n    }\n\n    if (Dst != Vector) {\n      // NOTE: SVE LSR is a destructive operation.\n      movprfx(Dst.Z(), Vector.Z());\n    }\n    if (ElementSize == IR::OpSize::i64Bit) {\n      lsl(SubRegSize, Dst.Z(), Mask, Dst.Z(), ShiftRegister.Z());\n    } else {\n      lsl_wide(SubRegSize, Dst.Z(), Mask, Dst.Z(), ShiftRegister.Z());\n    }\n  } else {\n    // uqshl + ushr of 57-bits leaves 7-bits remaining.\n    // This saturates the 64-bit shift value from an arbitrary 64-bit length\n    // variable to maximum of 0x7F.\n    // This allows the shift to fit within the width of the signed 8-bits\n    // that ASIMD's vector shift requires.\n    uqshl(ARMEmitter::ScalarRegSize::i64Bit, VTMP1, ShiftScalar, 57);\n    ushr(ARMEmitter::ScalarRegSize::i64Bit, VTMP1, VTMP1, 57);\n    dup(SubRegSize, VTMP1.Q(), VTMP1.Q(), 0);\n    ushl(SubRegSize, Dst.Q(), Vector.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VSShrS) {\n  const auto Op = IROp->C<IR::IROp_VSShrS>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize16(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto ShiftScalar = GetVReg(Op->ShiftScalar);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    // NOTE: SVE ASR is a destructive operation, so we need to\n    //       move the vector into the destination if they don't\n    //       already alias.\n    dup(SubRegSize, VTMP1.Z(), ShiftScalar.Z(), 0);\n    if (Dst != Vector) {\n      movprfx(Dst.Z(), Vector.Z());\n    }\n    asr(SubRegSize, Dst.Z(), Mask, Dst.Z(), VTMP1.Z());\n  } else {\n    dup(SubRegSize, VTMP1.Q(), ShiftScalar.Q(), 0);\n    neg(SubRegSize, VTMP1.Q(), VTMP1.Q());\n    sshl(SubRegSize, Dst.Q(), Vector.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VInsElement) {\n  const auto Op = IROp->C<IR::IROp_VInsElement>();\n  const auto OpSize = IROp->Size;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize16(IROp);\n\n  const uint32_t DestIdx = Op->DestIdx;\n  const uint32_t SrcIdx = Op->SrcIdx;\n\n  const auto Dst = GetVReg(Node);\n  const auto SrcVector = GetVReg(Op->SrcVector);\n  auto Reg = GetVReg(Op->DestVector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    // Broadcast our source value across a temporary,\n    // then combine with the destination.\n    dup(SubRegSize, VTMP2.Z(), SrcVector.Z(), SrcIdx);\n\n    // We don't need to move the data unnecessarily if\n    // DestVector just so happens to also be the IR op\n    // destination.\n    if (Dst != Reg) {\n      mov(Dst.Z(), Reg.Z());\n    }\n\n    constexpr auto Predicate = ARMEmitter::PReg::p0;\n\n    if (ElementSize == IR::OpSize::i128Bit) {\n      if (DestIdx == 0) {\n        mov(ARMEmitter::SubRegSize::i8Bit, Dst.Z(), PRED_TMP_16B.Merging(), VTMP2.Z());\n      } else {\n        not_(Predicate, PRED_TMP_32B.Zeroing(), PRED_TMP_16B);\n        mov(ARMEmitter::SubRegSize::i8Bit, Dst.Z(), Predicate.Merging(), VTMP2.Z());\n      }\n    } else {\n      const auto UpperBound = 16 >> FEXCore::ilog2(IR::OpSizeToSize(ElementSize));\n      const auto TargetElement = static_cast<int>(DestIdx) - UpperBound;\n\n      // FIXME: We should rework this op to avoid the NZCV spill/fill dance.\n      mrs(TMP1, ARMEmitter::SystemRegister::NZCV);\n\n      index(SubRegSize, VTMP1.Z(), -UpperBound, 1);\n      cmpeq(SubRegSize, Predicate, PRED_TMP_32B.Zeroing(), VTMP1.Z(), TargetElement);\n      mov(SubRegSize, Dst.Z(), Predicate.Merging(), VTMP2.Z());\n\n      // Restore NZCV\n      msr(ARMEmitter::SystemRegister::NZCV, TMP1);\n    }\n  } else {\n    // If nothing aliases the destination, then we can just\n    // move the DestVector over and directly insert.\n    if (Dst != Reg && Dst != SrcVector) {\n      mov(Dst.Q(), Reg.Q());\n      ins(SubRegSize, Dst.Q(), DestIdx, SrcVector.Q(), SrcIdx);\n      return;\n    }\n\n    // If our vector data to insert into is within a register\n    // that aliases the destination, then we can avoid using a\n    // temporary and just perform the insert.\n    //\n    // Otherwise, if the source vector to select from aliases\n    // the destination, then we hit the worst case where we\n    // need to use a temporary to avoid clobbering data.\n    if (Dst != Reg) {\n      mov(VTMP1.Q(), Reg.Q());\n      Reg = VTMP1;\n    }\n\n    ins(SubRegSize, Reg.Q(), DestIdx, SrcVector.Q(), SrcIdx);\n\n    if (Dst != Reg) {\n      mov(Dst.Q(), Reg.Q());\n    }\n  }\n}\n\nDEF_OP(VDupElement) {\n  const auto Op = IROp->C<IR::IROp_VDupElement>();\n  const auto OpSize = IROp->Size;\n\n  const auto Index = Op->Index;\n  const auto SubRegSize = ConvertSubRegSize16(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Is128Bit = OpSize == IR::OpSize::i128Bit;\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    dup(SubRegSize, Dst.Z(), Vector.Z(), Index);\n  } else {\n    if (Is128Bit) {\n      dup(SubRegSize, Dst.Q(), Vector.Q(), Index);\n    } else {\n      dup(SubRegSize, Dst.D(), Vector.D(), Index);\n    }\n  }\n}\n\nDEF_OP(VExtr) {\n  const auto Op = IROp->C<IR::IROp_VExtr>();\n  const auto OpSize = IROp->Size;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  // AArch64 ext op has bit arrangement as [Vm:Vn] so arguments need to be swapped\n  const auto Dst = GetVReg(Node);\n  auto UpperBits = GetVReg(Op->VectorLower);\n  auto LowerBits = GetVReg(Op->VectorUpper);\n\n  const auto ElementSize = Op->Header.ElementSize;\n  auto Index = Op->Index;\n\n  if (Index >= IR::OpSizeToSize(OpSize)) {\n    // Upper bits have moved in to the lower bits\n    LowerBits = UpperBits;\n\n    // Upper bits are all now zero\n    UpperBits = VTMP1;\n    movi(ARMEmitter::SubRegSize::i64Bit, VTMP1.Q(), 0);\n    Index -= IR::OpSizeToSize(OpSize);\n  }\n\n  const auto CopyFromByte = Index * IR::OpSizeToSize(ElementSize);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    if (Dst == LowerBits) {\n      // Trivial case where we don't need to do any moves\n      ext<ARMEmitter::OpType::Destructive>(Dst.Z(), Dst.Z(), UpperBits.Z(), CopyFromByte);\n    } else if (Dst == UpperBits) {\n      movprfx(VTMP2.Z(), LowerBits.Z());\n      ext<ARMEmitter::OpType::Destructive>(VTMP2.Z(), VTMP2.Z(), UpperBits.Z(), CopyFromByte);\n      mov(Dst.Z(), VTMP2.Z());\n    } else {\n      // No registers alias the destination, so we can safely move into it.\n      movprfx(Dst.Z(), LowerBits.Z());\n      ext<ARMEmitter::OpType::Destructive>(Dst.Z(), Dst.Z(), UpperBits.Z(), CopyFromByte);\n    }\n  } else {\n    if (OpSize == IR::OpSize::i64Bit) {\n      ext(Dst.D(), LowerBits.D(), UpperBits.D(), CopyFromByte);\n    } else {\n      ext(Dst.Q(), LowerBits.Q(), UpperBits.Q(), CopyFromByte);\n    }\n  }\n}\n\nDEF_OP(VUShrI) {\n  const auto Op = IROp->C<IR::IROp_VUShrI>();\n  const auto OpSize = IROp->Size;\n\n  const auto BitShift = Op->BitShift;\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (BitShift >= IR::OpSizeAsBits(ElementSize)) {\n    movi(ARMEmitter::SubRegSize::i64Bit, Dst.Q(), 0);\n  } else {\n    if (HostSupportsSVE256 && Is256Bit) {\n      const auto Mask = PRED_TMP_32B.Merging();\n\n      if (BitShift == 0) {\n        if (Dst != Vector) {\n          mov(Dst.Z(), Vector.Z());\n        }\n      } else {\n        // SVE LSR is destructive, so lets set up the destination if\n        // Vector doesn't already alias it.\n        if (Dst != Vector) {\n          movprfx(Dst.Z(), Vector.Z());\n        }\n        lsr(SubRegSize, Dst.Z(), Mask, Dst.Z(), BitShift);\n      }\n    } else {\n      if (BitShift == 0) {\n        if (Dst != Vector) {\n          mov(Dst.Q(), Vector.Q());\n        }\n      } else {\n        ushr(SubRegSize, Dst.Q(), Vector.Q(), BitShift);\n      }\n    }\n  }\n}\n\nDEF_OP(VUShraI) {\n  const auto Op = IROp->C<IR::IROp_VUShraI>();\n  const auto OpSize = IROp->Size;\n\n  const auto BitShift = Op->BitShift;\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto DestVector = GetVReg(Op->DestVector);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    if (Dst == DestVector) {\n      usra(SubRegSize, Dst.Z(), Vector.Z(), BitShift);\n    } else {\n      if (Dst != Vector) {\n        mov(Dst.Z(), DestVector.Z());\n        usra(SubRegSize, Dst.Z(), Vector.Z(), BitShift);\n      } else {\n        mov(VTMP1.Z(), DestVector.Z());\n        usra(SubRegSize, Dst.Z(), Vector.Z(), BitShift);\n        mov(Dst.Z(), VTMP1.Z());\n      }\n    }\n  } else {\n    if (Dst == DestVector) {\n      usra(SubRegSize, Dst.Q(), Vector.Q(), BitShift);\n    } else {\n      if (Dst != Vector) {\n        mov(Dst.Q(), DestVector.Q());\n        usra(SubRegSize, Dst.Q(), Vector.Q(), BitShift);\n      } else {\n        mov(VTMP1.Q(), DestVector.Q());\n        usra(SubRegSize, VTMP1.Q(), Vector.Q(), BitShift);\n        mov(Dst.Q(), VTMP1.Q());\n      }\n    }\n  }\n}\n\nDEF_OP(VSShrI) {\n  const auto Op = IROp->C<IR::IROp_VSShrI>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  LOGMAN_THROW_A_FMT(ElementSize >= IR::OpSize::i8Bit && ElementSize <= IR::OpSize::i64Bit, \"Invalid element size\");\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Shift = std::min<uint8_t>(IR::OpSizeAsBits(ElementSize) - 1, Op->BitShift);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    if (Shift == 0) {\n      if (Dst != Vector) {\n        mov(Dst.Z(), Vector.Z());\n      }\n    } else {\n      // SVE ASR is destructive, so lets set up the destination if\n      // Vector doesn't already alias it.\n      if (Dst != Vector) {\n        movprfx(Dst.Z(), Vector.Z());\n      }\n      asr(SubRegSize, Dst.Z(), Mask, Dst.Z(), Shift);\n    }\n  } else {\n    if (Shift == 0) {\n      if (Dst != Vector) {\n        mov(Dst.Q(), Vector.Q());\n      }\n    } else {\n      sshr(SubRegSize, Dst.Q(), Vector.Q(), Shift);\n    }\n  }\n}\n\nDEF_OP(VShlI) {\n  const auto Op = IROp->C<IR::IROp_VShlI>();\n  const auto OpSize = IROp->Size;\n\n  const auto BitShift = Op->BitShift;\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (BitShift >= IR::OpSizeAsBits(ElementSize)) {\n    movi(ARMEmitter::SubRegSize::i64Bit, Dst.Q(), 0);\n  } else {\n    if (HostSupportsSVE256 && Is256Bit) {\n      const auto Mask = PRED_TMP_32B.Merging();\n\n      if (BitShift == 0) {\n        if (Dst != Vector) {\n          mov(Dst.Z(), Vector.Z());\n        }\n      } else {\n        // SVE LSL is destructive, so lets set up the destination if\n        // Vector doesn't already alias it.\n        if (Dst != Vector) {\n          movprfx(Dst.Z(), Vector.Z());\n        }\n        lsl(SubRegSize, Dst.Z(), Mask, Dst.Z(), BitShift);\n      }\n    } else {\n      if (BitShift == 0) {\n        if (Dst != Vector) {\n          mov(Dst.Q(), Vector.Q());\n        }\n      } else {\n        shl(SubRegSize, Dst.Q(), Vector.Q(), BitShift);\n      }\n    }\n  }\n}\n\nDEF_OP(VUShrNI) {\n  const auto Op = IROp->C<IR::IROp_VUShrNI>();\n  const auto OpSize = IROp->Size;\n\n  const auto BitShift = Op->BitShift;\n  const auto SubRegSize = ConvertSubRegSize4(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    shrnb(SubRegSize, Dst.Z(), Vector.Z(), BitShift);\n    uzp1(SubRegSize, Dst.Z(), Dst.Z(), Dst.Z());\n  } else {\n    if (BitShift == 0) {\n      xtn(SubRegSize, Dst.D(), Vector.D());\n    } else {\n      shrn(SubRegSize, Dst.D(), Vector.D(), BitShift);\n    }\n  }\n}\n\nDEF_OP(VUShrNI2) {\n  const auto Op = IROp->C<IR::IROp_VUShrNI2>();\n  const auto OpSize = IROp->Size;\n\n  const auto BitShift = Op->BitShift;\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto VectorLower = GetVReg(Op->VectorLower);\n  const auto VectorUpper = GetVReg(Op->VectorUpper);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_16B;\n\n    shrnb(SubRegSize, VTMP2.Z(), VectorUpper.Z(), BitShift);\n    uzp1(SubRegSize, VTMP2.Z(), VTMP2.Z(), VTMP2.Z());\n\n    if (Dst != VectorLower) {\n      movprfx(Dst.Z(), VectorLower.Z());\n    }\n    splice<ARMEmitter::OpType::Destructive>(SubRegSize, Dst.Z(), Mask, Dst.Z(), VTMP2.Z());\n  } else {\n    auto Lower = VectorLower;\n    if (Dst != VectorLower) {\n      mov(VTMP1.Q(), VectorLower.Q());\n      Lower = VTMP1;\n    }\n\n    shrn2(SubRegSize, Lower.Q(), VectorUpper.Q(), BitShift);\n\n    if (Dst != VectorLower) {\n      mov(Dst.Q(), Lower.Q());\n    }\n  }\n}\n\nDEF_OP(VSXTL) {\n  const auto Op = IROp->C<IR::IROp_VSXTL>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if ((HostSupportsSVE128 && !Is256Bit && !HostSupportsSVE256) || (HostSupportsSVE256 && Is256Bit)) {\n    sunpklo(SubRegSize, Dst.Z(), Vector.Z());\n  } else {\n    sxtl(SubRegSize, Dst.D(), Vector.D());\n  }\n}\n\nDEF_OP(VSXTL2) {\n  const auto Op = IROp->C<IR::IROp_VSXTL2>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if ((HostSupportsSVE128 && !Is256Bit && !HostSupportsSVE256) || (HostSupportsSVE256 && Is256Bit)) {\n    sunpkhi(SubRegSize, Dst.Z(), Vector.Z());\n  } else {\n    sxtl2(SubRegSize, Dst.Q(), Vector.Q());\n  }\n}\n\nDEF_OP(VSSHLL) {\n  const auto Op = IROp->C<IR::IROp_VSSHLL>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n  const auto BitShift = Op->BitShift;\n  LOGMAN_THROW_A_FMT(BitShift < IR::OpSizeAsBits(IROp->ElementSize / 2), \"Bitshift size too large for source element size: {} < {}\",\n                     BitShift, IR::OpSizeAsBits(IROp->ElementSize / 2));\n\n  if (Is256Bit) {\n    sunpklo(SubRegSize, Dst.Z(), Vector.Z());\n    lsl(SubRegSize, Dst.Z(), Dst.Z(), BitShift);\n  } else {\n    sshll(SubRegSize, Dst.D(), Vector.D(), BitShift);\n  }\n}\n\nDEF_OP(VSSHLL2) {\n  const auto Op = IROp->C<IR::IROp_VSSHLL2>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n  const auto BitShift = Op->BitShift;\n  LOGMAN_THROW_A_FMT(BitShift < IR::OpSizeAsBits(IROp->ElementSize / 2), \"Bitshift size too large for source element size: {} < {}\",\n                     BitShift, IR::OpSizeAsBits(IROp->ElementSize / 2));\n\n  if (Is256Bit) {\n    sunpkhi(SubRegSize, Dst.Z(), Vector.Z());\n    lsl(SubRegSize, Dst.Z(), Dst.Z(), BitShift);\n  } else {\n    sshll2(SubRegSize, Dst.Q(), Vector.Q(), BitShift);\n  }\n}\n\nDEF_OP(VUXTL) {\n  const auto Op = IROp->C<IR::IROp_VUXTL>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if ((HostSupportsSVE128 && !Is256Bit && !HostSupportsSVE256) || (HostSupportsSVE256 && Is256Bit)) {\n    uunpklo(SubRegSize, Dst.Z(), Vector.Z());\n  } else {\n    uxtl(SubRegSize, Dst.D(), Vector.D());\n  }\n}\n\nDEF_OP(VUXTL2) {\n  const auto Op = IROp->C<IR::IROp_VUXTL2>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if ((HostSupportsSVE128 && !Is256Bit && !HostSupportsSVE256) || (HostSupportsSVE256 && Is256Bit)) {\n    uunpkhi(SubRegSize, Dst.Z(), Vector.Z());\n  } else {\n    uxtl2(SubRegSize, Dst.Q(), Vector.Q());\n  }\n}\n\nDEF_OP(VSQXTN) {\n  const auto Op = IROp->C<IR::IROp_VSQXTN>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize4(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    // Note that SVE SQXTNB and SQXTNT are a tad different\n    // in behavior compared to most other [name]B and [name]T\n    // instructions.\n    //\n    // Most other bottom and top instructions operate\n    // on even (bottom) or odd (top) elements and store each\n    // result into the next subsequent element in the destination\n    // vector\n    //\n    // SQXTNB and SQXTNT will operate on the same elements regardless\n    // of which one is chosen, but will instead place results from\n    // the operation into either each subsequent even (bottom) element\n    // or odd (top) element. However the bottom instruction will zero the\n    // odd elements out in the destination vector, while the top instruction\n    // will leave the even elements alone (in a behavior similar to Adv.SIMD's\n    // SQXTN/SQXTN2 instructions).\n    //\n    // e.g. consider this 64-bit (for brevity) vector with four 16-bit elements:\n    //\n    // ╔═══════════╗╔═══════════╗╔═══════════╗╔═══════════╗\n    // ║  Value 3  ║║  Value 2  ║║  Value 1  ║║  Value 0  ║\n    // ╚═══════════╝╚═══════════╝╚═══════════╝╚═══════════╝\n    //\n    // SQXTNB Dst.VnB, Src.VnH will result in:\n    //\n    // ╔═════╗╔═════╗╔═════╗╔═════╗╔═════╗╔═════╗╔═════╗╔═════╗\n    // ║  0  ║║ V3  ║║  0  ║║ V2  ║║  0  ║║ V1  ║║  0  ║║ V0  ║\n    // ╚═════╝╚═════╝╚═════╝╚═════╝╚═════╝╚═════╝╚═════╝╚═════╝\n    //\n    // This is kind of convenient, considering we only need\n    // to use the bottom variant and then concatenate all the\n    // even elements with SVE UZP1.\n\n    sqxtnb(SubRegSize, Dst.Z(), Vector.Z());\n    uzp1(SubRegSize, Dst.Z(), Dst.Z(), Dst.Z());\n  } else {\n    sqxtn(SubRegSize, Dst, Vector);\n  }\n}\n\nDEF_OP(VSQXTN2) {\n  const auto Op = IROp->C<IR::IROp_VSQXTN2>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize4(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto VectorLower = GetVReg(Op->VectorLower);\n  const auto VectorUpper = GetVReg(Op->VectorUpper);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    // We use the 16 byte mask due to how SPLICE works. We only\n    // want to get at the first 16 bytes in the lower vector, so\n    // that SPLICE will then begin copying the first 16 bytes\n    // from the upper vector and begin placing them after the\n    // previously copied lower 16 bytes.\n    const auto Mask = PRED_TMP_16B;\n\n    sqxtnb(SubRegSize, VTMP2.Z(), VectorUpper.Z());\n    uzp1(SubRegSize, VTMP2.Z(), VTMP2.Z(), VTMP2.Z());\n\n    // Need to use the destructive variant of SPLICE, since\n    // the constructive variant requires a register list, and\n    // we can't guarantee VectorLower and VectorUpper will always\n    // have consecutive indexes with one another.\n    if (Dst != VectorLower) {\n      movprfx(Dst.Z(), VectorLower.Z());\n    }\n    splice<ARMEmitter::OpType::Destructive>(SubRegSize, Dst.Z(), Mask, Dst.Z(), VTMP2.Z());\n  } else {\n    if (OpSize == IR::OpSize::i64Bit) {\n      sqxtn(SubRegSize, VTMP2, VectorUpper);\n      mov(Dst.Q(), VectorLower.Q());\n      ins(ARMEmitter::SubRegSize::i32Bit, Dst, 1, VTMP2, 0);\n    } else {\n      mov(VTMP1.Q(), VectorLower.Q());\n      sqxtn2(SubRegSize, VTMP1, VectorUpper);\n      mov(Dst.Q(), VTMP1.Q());\n    }\n  }\n}\n\nDEF_OP(VSQXTNPair) {\n  const auto Op = IROp->C<IR::IROp_VSQXTNPair>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize4(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto VectorLower = GetVReg(Op->VectorLower);\n  auto VectorUpper = GetVReg(Op->VectorUpper);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    // This combines the SVE versions of VSQXTN/VSQXTN2.\n    // Upper VSQXTN2 handling.\n    // Doing upper first to ensure it doesn't get overwritten by lower calculation.\n    const auto Mask = PRED_TMP_16B;\n\n    sqxtnb(SubRegSize, VTMP2.Z(), VectorUpper.Z());\n    uzp1(SubRegSize, VTMP2.Z(), VTMP2.Z(), VTMP2.Z());\n\n    // Look at those implementations for details about this.\n    // Lower VSQXTN handling.\n    sqxtnb(SubRegSize, Dst.Z(), VectorLower.Z());\n    uzp1(SubRegSize, Dst.Z(), Dst.Z(), Dst.Z());\n\n    // Merge.\n    splice<ARMEmitter::OpType::Destructive>(SubRegSize, Dst.Z(), Mask, Dst.Z(), VTMP2.Z());\n  } else {\n    if (OpSize == IR::OpSize::i64Bit) {\n      zip1(ARMEmitter::SubRegSize::i64Bit, Dst.Q(), VectorLower.Q(), VectorUpper.Q());\n      sqxtn(SubRegSize, Dst, Dst);\n    } else {\n      if (Dst == VectorUpper) {\n        // If the destination overlaps the upper then we need to move it temporarily.\n        mov(VTMP1.Q(), VectorUpper.Q());\n        VectorUpper = VTMP1;\n      }\n      sqxtn(SubRegSize, Dst, VectorLower);\n      sqxtn2(SubRegSize, Dst, VectorUpper);\n    }\n  }\n}\n\nDEF_OP(VSQXTUN) {\n  const auto Op = IROp->C<IR::IROp_VSQXTUN>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    sqxtunb(SubRegSize, Dst.Z(), Vector.Z());\n    uzp1(SubRegSize, Dst.Z(), Dst.Z(), Dst.Z());\n  } else {\n    sqxtun(SubRegSize, Dst, Vector);\n  }\n}\n\nDEF_OP(VSQXTUN2) {\n  const auto Op = IROp->C<IR::IROp_VSQXTUN2>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto VectorLower = GetVReg(Op->VectorLower);\n  const auto VectorUpper = GetVReg(Op->VectorUpper);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    // NOTE: See VSQXTN2 implementation for an in-depth explanation\n    //       of everything going on here.\n\n    const auto Mask = PRED_TMP_16B;\n\n    sqxtunb(SubRegSize, VTMP2.Z(), VectorUpper.Z());\n    uzp1(SubRegSize, VTMP2.Z(), VTMP2.Z(), VTMP2.Z());\n\n    if (Dst != VectorLower) {\n      movprfx(Dst.Z(), VectorLower.Z());\n    }\n    splice<ARMEmitter::OpType::Destructive>(SubRegSize, Dst.Z(), Mask, Dst.Z(), VTMP2.Z());\n  } else {\n    if (OpSize == IR::OpSize::i64Bit) {\n      sqxtun(SubRegSize, VTMP2, VectorUpper);\n      mov(Dst.Q(), VectorLower.Q());\n      ins(ARMEmitter::SubRegSize::i32Bit, Dst, 1, VTMP2, 0);\n    } else {\n      auto Lower = VectorLower;\n      if (Dst != VectorLower) {\n        mov(VTMP1.Q(), VectorLower.Q());\n        Lower = VTMP1;\n      }\n\n      sqxtun2(SubRegSize, Lower, VectorUpper);\n\n      if (Dst != VectorLower) {\n        mov(Dst.Q(), Lower.Q());\n      }\n    }\n  }\n}\n\nDEF_OP(VSQXTUNPair) {\n  const auto Op = IROp->C<IR::IROp_VSQXTUNPair>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize4(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto VectorLower = GetVReg(Op->VectorLower);\n  auto VectorUpper = GetVReg(Op->VectorUpper);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    // This combines the SVE versions of VSQXTUN/VSQXTUN2.\n    // Upper VSQXTUN2 handling.\n    // Doing upper first to ensure it doesn't get overwritten by lower calculation.\n    const auto Mask = PRED_TMP_16B;\n\n    sqxtunb(SubRegSize, VTMP2.Z(), VectorUpper.Z());\n    uzp1(SubRegSize, VTMP2.Z(), VTMP2.Z(), VTMP2.Z());\n\n    // Look at those implementations for details about this.\n    // Lower VSQXTUN handling.\n    sqxtunb(SubRegSize, Dst.Z(), VectorLower.Z());\n    uzp1(SubRegSize, Dst.Z(), Dst.Z(), Dst.Z());\n\n    // Merge.\n    splice<ARMEmitter::OpType::Destructive>(SubRegSize, Dst.Z(), Mask, Dst.Z(), VTMP2.Z());\n  } else {\n    if (OpSize == IR::OpSize::i64Bit) {\n      zip1(ARMEmitter::SubRegSize::i64Bit, Dst.Q(), VectorLower.Q(), VectorUpper.Q());\n      sqxtun(SubRegSize, Dst, Dst);\n    } else {\n      if (Dst == VectorUpper) {\n        // If the destination overlaps the upper then we need to move it temporarily.\n        mov(VTMP1.Q(), VectorUpper.Q());\n        VectorUpper = VTMP1;\n      }\n      sqxtun(SubRegSize, Dst, VectorLower);\n      sqxtun2(SubRegSize, Dst, VectorUpper);\n    }\n  }\n}\n\nDEF_OP(VSRSHR) {\n  const auto Op = IROp->C<IR::IROp_VSRSHR>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto SubRegSize = ConvertSubRegSize16(IROp);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n  const auto BitShift = Op->BitShift;\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n    // SVE SRSHR is destructive, so lets set up the destination\n    // in the event we Dst and Vector don't alias.\n    if (Dst != Vector) {\n      movprfx(Dst.Z(), Vector.Z());\n    }\n    srshr(SubRegSize, Dst.Z(), Mask, Dst.Z(), BitShift);\n  } else {\n    if (OpSize == IR::OpSize::i64Bit) {\n      srshr(SubRegSize, Dst.D(), Vector.D(), BitShift);\n    } else {\n      srshr(SubRegSize, Dst.Q(), Vector.Q(), BitShift);\n    }\n  }\n}\n\nDEF_OP(VSQSHL) {\n  const auto Op = IROp->C<IR::IROp_VSQSHL>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n  const auto BitShift = Op->BitShift;\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n    // SVE SQSHL is destructive, so lets set up the destination\n    // in the event Dst and Vector don't alias\n    if (Dst != Vector) {\n      movprfx(Dst.Z(), Vector.Z());\n    }\n    sqshl(SubRegSize, Dst.Z(), Mask, Dst.Z(), BitShift);\n  } else {\n    if (OpSize == IR::OpSize::i64Bit) {\n      sqshl(SubRegSize, Dst.D(), Vector.D(), BitShift);\n    } else {\n      sqshl(SubRegSize, Dst.Q(), Vector.Q(), BitShift);\n    }\n  }\n}\n\nDEF_OP(VMul) {\n  const auto Op = IROp->C<IR::IROp_VMul>();\n  const auto OpSize = IROp->Size;\n\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto SubRegSize = ConvertSubRegSize16(IROp);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    mul(SubRegSize, Dst.Z(), Vector1.Z(), Vector2.Z());\n  } else {\n    mul(SubRegSize, Dst.Q(), Vector1.Q(), Vector2.Q());\n  }\n}\n\nDEF_OP(VUMull) {\n  const auto Op = IROp->C<IR::IROp_VUMull>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    umullb(SubRegSize, VTMP1.Z(), Vector1.Z(), Vector2.Z());\n    umullt(SubRegSize, VTMP2.Z(), Vector1.Z(), Vector2.Z());\n    zip1(SubRegSize, Dst.Z(), VTMP1.Z(), VTMP2.Z());\n  } else {\n    umull(SubRegSize, Dst.D(), Vector1.D(), Vector2.D());\n  }\n}\n\nDEF_OP(VSMull) {\n  const auto Op = IROp->C<IR::IROp_VSMull>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    smullb(SubRegSize, VTMP1.Z(), Vector1.Z(), Vector2.Z());\n    smullt(SubRegSize, VTMP2.Z(), Vector1.Z(), Vector2.Z());\n    zip1(SubRegSize, Dst.Z(), VTMP1.Z(), VTMP2.Z());\n  } else {\n    smull(SubRegSize, Dst.D(), Vector1.D(), Vector2.D());\n  }\n}\n\nDEF_OP(VUMull2) {\n  const auto Op = IROp->C<IR::IROp_VUMull2>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    umullb(SubRegSize, VTMP1.Z(), Vector1.Z(), Vector2.Z());\n    umullt(SubRegSize, VTMP2.Z(), Vector1.Z(), Vector2.Z());\n    zip2(SubRegSize, Dst.Z(), VTMP1.Z(), VTMP2.Z());\n  } else {\n    umull2(SubRegSize, Dst.Q(), Vector1.Q(), Vector2.Q());\n  }\n}\n\nDEF_OP(VSMull2) {\n  const auto Op = IROp->C<IR::IROp_VSMull2>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    smullb(SubRegSize, VTMP1.Z(), Vector1.Z(), Vector2.Z());\n    smullt(SubRegSize, VTMP2.Z(), Vector1.Z(), Vector2.Z());\n    zip2(SubRegSize, Dst.Z(), VTMP1.Z(), VTMP2.Z());\n  } else {\n    smull2(SubRegSize, Dst.Q(), Vector1.Q(), Vector2.Q());\n  }\n}\n\nDEF_OP(VUMulH) {\n  const auto Op = IROp->C<IR::IROp_VUMulH>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Is128Bit = OpSize == IR::OpSize::i128Bit;\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  const auto SubRegSizeLarger = ElementSize == IR::OpSize::i8Bit  ? ARMEmitter::SubRegSize::i16Bit :\n                                ElementSize == IR::OpSize::i16Bit ? ARMEmitter::SubRegSize::i32Bit :\n                                ElementSize == IR::OpSize::i32Bit ? ARMEmitter::SubRegSize::i64Bit :\n                                                                    ARMEmitter::SubRegSize::i8Bit;\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    umulh(SubRegSize, Dst.Z(), Vector1.Z(), Vector2.Z());\n  } else if (HostSupportsSVE128 && Is128Bit) {\n    if (HostSupportsSVE256) {\n      // Do predicated to ensure upper-bits get zero as expected\n      const auto Mask = PRED_TMP_16B.Merging();\n\n      if (Dst == Vector1) {\n        umulh(SubRegSize, Dst.Z(), Mask, Dst.Z(), Vector2.Z());\n      } else if (Dst == Vector2) {\n        umulh(SubRegSize, Dst.Z(), Mask, Dst.Z(), Vector1.Z());\n      } else {\n        // Destination register doesn't overlap either source.\n        // NOTE: SVE umulh (predicated) is a destructive operation.\n        movprfx(Dst.Z(), Vector1.Z());\n        umulh(SubRegSize, Dst.Z(), Mask, Dst.Z(), Vector2.Z());\n      }\n    } else {\n      umulh(SubRegSize, Dst.Z(), Vector1.Z(), Vector2.Z());\n    }\n  } else if (OpSize == IR::OpSize::i64Bit) {\n    umull(SubRegSizeLarger, Dst.D(), Vector1.D(), Vector2.D());\n    shrn(SubRegSize, Dst.D(), Dst.D(), IR::OpSizeAsBits(ElementSize));\n  } else {\n    // ASIMD doesn't have a umulh. Need to emulate.\n    umull2(SubRegSizeLarger, VTMP1.Q(), Vector1.Q(), Vector2.Q());\n    umull(SubRegSizeLarger, Dst.D(), Vector1.D(), Vector2.D());\n    uzp2(SubRegSize, Dst.Q(), Dst.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VSMulH) {\n  const auto Op = IROp->C<IR::IROp_VSMulH>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize8(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Is128Bit = OpSize == IR::OpSize::i128Bit;\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  const auto SubRegSizeLarger = ElementSize == IR::OpSize::i8Bit  ? ARMEmitter::SubRegSize::i16Bit :\n                                ElementSize == IR::OpSize::i16Bit ? ARMEmitter::SubRegSize::i32Bit :\n                                ElementSize == IR::OpSize::i32Bit ? ARMEmitter::SubRegSize::i64Bit :\n                                                                    ARMEmitter::SubRegSize::i8Bit;\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    smulh(SubRegSize, Dst.Z(), Vector1.Z(), Vector2.Z());\n  } else if (HostSupportsSVE128 && Is128Bit) {\n    if (HostSupportsSVE256) {\n      // Do predicated to ensure upper-bits get zero as expected\n      const auto Mask = PRED_TMP_16B.Merging();\n\n      if (Dst == Vector1) {\n        smulh(SubRegSize, Dst.Z(), Mask, Dst.Z(), Vector2.Z());\n      } else if (Dst == Vector2) {\n        smulh(SubRegSize, Dst.Z(), Mask, Dst.Z(), Vector1.Z());\n      } else {\n        // Destination register doesn't overlap either source.\n        // NOTE: SVE umulh (predicated) is a destructive operation.\n        movprfx(Dst.Z(), Vector1.Z());\n        smulh(SubRegSize, Dst.Z(), Mask, Dst.Z(), Vector2.Z());\n      }\n    } else {\n      smulh(SubRegSize, Dst.Z(), Vector1.Z(), Vector2.Z());\n    }\n  } else if (OpSize == IR::OpSize::i64Bit) {\n    smull(SubRegSizeLarger, Dst.D(), Vector1.D(), Vector2.D());\n    shrn(SubRegSize, Dst.D(), Dst.D(), IR::OpSizeAsBits(ElementSize));\n  } else {\n    // ASIMD doesn't have a umulh. Need to emulate.\n    smull2(SubRegSizeLarger, VTMP1.Q(), Vector1.Q(), Vector2.Q());\n    smull(SubRegSizeLarger, Dst.D(), Vector1.D(), Vector2.D());\n    uzp2(SubRegSize, Dst.Q(), Dst.Q(), VTMP1.Q());\n  }\n}\n\nDEF_OP(VUABDL) {\n  const auto Op = IROp->C<IR::IROp_VUABDL>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    // To mimic the behavior of AdvSIMD UABDL, we need to get the\n    // absolute difference of the even elements (UADBLB), get the\n    // absolute difference of the odd elemenets (UABDLT), then\n    // interleave the results in both vectors together.\n\n    uabdlb(SubRegSize, VTMP1.Z(), Vector1.Z(), Vector2.Z());\n    uabdlt(SubRegSize, VTMP2.Z(), Vector1.Z(), Vector2.Z());\n    zip1(SubRegSize, Dst.Z(), VTMP1.Z(), VTMP2.Z());\n  } else {\n    uabdl(SubRegSize, Dst.D(), Vector1.D(), Vector2.D());\n  }\n}\n\nDEF_OP(VUABDL2) {\n  const auto Op = IROp->C<IR::IROp_VUABDL2>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    // To mimic the behavior of AdvSIMD UABDL, we need to get the\n    // absolute difference of the even elements (UADBLB), get the\n    // absolute difference of the odd elemenets (UABDLT), then\n    // interleave the results in both vectors together.\n\n    uabdlb(SubRegSize, VTMP1.Z(), Vector1.Z(), Vector2.Z());\n    uabdlt(SubRegSize, VTMP2.Z(), Vector1.Z(), Vector2.Z());\n    zip2(SubRegSize, Dst.Z(), VTMP1.Z(), VTMP2.Z());\n  } else {\n    uabdl2(SubRegSize, Dst.Q(), Vector1.Q(), Vector2.Q());\n  }\n}\n\nDEF_OP(VTBL1) {\n  const auto Op = IROp->C<IR::IROp_VTBL1>();\n  const auto OpSize = IROp->Size;\n\n  const auto Dst = GetVReg(Node);\n  const auto VectorIndices = GetVReg(Op->VectorIndices);\n  const auto VectorTable = GetVReg(Op->VectorTable);\n\n  switch (OpSize) {\n  case IR::OpSize::i64Bit: {\n    tbl(Dst.D(), VectorTable.Q(), VectorIndices.D());\n    break;\n  }\n  case IR::OpSize::i128Bit: {\n    tbl(Dst.Q(), VectorTable.Q(), VectorIndices.Q());\n    break;\n  }\n  case IR::OpSize::i256Bit: {\n    LOGMAN_THROW_A_FMT(HostSupportsSVE256, \"Host does not support SVE. Cannot perform 256-bit table lookup\");\n\n    tbl(ARMEmitter::SubRegSize::i8Bit, Dst.Z(), VectorTable.Z(), VectorIndices.Z());\n    break;\n  }\n  default: LOGMAN_MSG_A_FMT(\"Unknown OpSize: {}\", OpSize); break;\n  }\n}\n\nDEF_OP(VTBL2) {\n  const auto Op = IROp->C<IR::IROp_VTBL2>();\n  const auto OpSize = IROp->Size;\n\n  const auto Dst = GetVReg(Node);\n  const auto VectorIndices = GetVReg(Op->VectorIndices);\n  auto VectorTable1 = GetVReg(Op->VectorTable1);\n  auto VectorTable2 = GetVReg(Op->VectorTable2);\n\n  if (!ARMEmitter::AreVectorsSequential(VectorTable1, VectorTable2)) {\n    // Vector registers aren't sequential, need to move to temporaries.\n    if (OpSize == IR::OpSize::i256Bit) {\n      mov(VTMP1.Z(), VectorTable1.Z());\n      mov(VTMP2.Z(), VectorTable2.Z());\n    } else {\n      mov(VTMP1.Q(), VectorTable1.Q());\n      mov(VTMP2.Q(), VectorTable2.Q());\n    }\n\n    static_assert(ARMEmitter::AreVectorsSequential(VTMP1, VTMP2), \"VTMP1 and VTMP2 must be sequential in order to use double-table \"\n                                                                  \"TBL\");\n    VectorTable1 = VTMP1;\n    VectorTable2 = VTMP2;\n  }\n\n  switch (OpSize) {\n  case IR::OpSize::i64Bit: {\n    tbl(Dst.D(), VectorTable1.Q(), VectorTable2.Q(), VectorIndices.D());\n    break;\n  }\n  case IR::OpSize::i128Bit: {\n    tbl(Dst.Q(), VectorTable1.Q(), VectorTable2.Q(), VectorIndices.Q());\n    break;\n  }\n  case IR::OpSize::i256Bit: {\n    LOGMAN_THROW_A_FMT(HostSupportsSVE256, \"Host does not support SVE. Cannot perform 256-bit table lookup\");\n\n    tbl(ARMEmitter::SubRegSize::i8Bit, Dst.Z(), VectorTable1.Z(), VectorTable2.Z(), VectorIndices.Z());\n    break;\n  }\n  default: LOGMAN_MSG_A_FMT(\"Unknown OpSize: {}\", OpSize); break;\n  }\n}\n\nDEF_OP(VTBX1) {\n  const auto Op = IROp->C<IR::IROp_VTBX1>();\n  const auto OpSize = IROp->Size;\n\n  const auto Dst = GetVReg(Node);\n  const auto VectorSrcDst = GetVReg(Op->VectorSrcDst);\n  const auto VectorIndices = GetVReg(Op->VectorIndices);\n  const auto VectorTable = GetVReg(Op->VectorTable);\n\n  if (Dst != VectorSrcDst) {\n    switch (OpSize) {\n    case IR::OpSize::i64Bit: {\n      mov(VTMP1.D(), VectorSrcDst.D());\n      tbx(VTMP1.D(), VectorTable.Q(), VectorIndices.D());\n      mov(Dst.D(), VTMP1.D());\n      break;\n    }\n    case IR::OpSize::i128Bit: {\n      mov(VTMP1.Q(), VectorSrcDst.Q());\n      tbx(VTMP1.Q(), VectorTable.Q(), VectorIndices.Q());\n      mov(Dst.Q(), VTMP1.Q());\n      break;\n    }\n    case IR::OpSize::i256Bit: {\n      LOGMAN_THROW_A_FMT(HostSupportsSVE256, \"Host does not support SVE. Cannot perform 256-bit table lookup\");\n      mov(VTMP1.Z(), VectorSrcDst.Z());\n      tbx(ARMEmitter::SubRegSize::i8Bit, VTMP1.Z(), VectorTable.Z(), VectorIndices.Z());\n      mov(Dst.Z(), VTMP1.Z());\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unknown OpSize: {}\", OpSize); break;\n    }\n  } else {\n    switch (OpSize) {\n    case IR::OpSize::i64Bit: {\n      tbx(VectorSrcDst.D(), VectorTable.Q(), VectorIndices.D());\n      break;\n    }\n    case IR::OpSize::i128Bit: {\n      tbx(VectorSrcDst.Q(), VectorTable.Q(), VectorIndices.Q());\n      break;\n    }\n    case IR::OpSize::i256Bit: {\n      LOGMAN_THROW_A_FMT(HostSupportsSVE256, \"Host does not support SVE. Cannot perform 256-bit table lookup\");\n\n      tbx(ARMEmitter::SubRegSize::i8Bit, VectorSrcDst.Z(), VectorTable.Z(), VectorIndices.Z());\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unknown OpSize: {}\", OpSize); break;\n    }\n  }\n}\n\nDEF_OP(VRev32) {\n  const auto Op = IROp->C<IR::IROp_VRev32>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  LOGMAN_THROW_A_FMT(ElementSize == IR::OpSize::i8Bit || ElementSize == IR::OpSize::i16Bit, \"Invalid size\");\n  const auto SubRegSize = ElementSize == IR::OpSize::i8Bit ? ARMEmitter::SubRegSize::i8Bit : ARMEmitter::SubRegSize::i16Bit;\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    switch (ElementSize) {\n    case IR::OpSize::i8Bit: {\n      revb(ARMEmitter::SubRegSize::i32Bit, Dst.Z(), Mask, Vector.Z());\n      break;\n    }\n    case IR::OpSize::i16Bit: {\n      revh(ARMEmitter::SubRegSize::i32Bit, Dst.Z(), Mask, Vector.Z());\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Invalid Element Size: {}\", ElementSize); break;\n    }\n  } else {\n    if (OpSize == IR::OpSize::i64Bit) {\n      rev32(SubRegSize, Dst.D(), Vector.D());\n    } else {\n      rev32(SubRegSize, Dst.Q(), Vector.Q());\n    }\n  }\n}\n\n\nDEF_OP(VRev64) {\n  const auto Op = IROp->C<IR::IROp_VRev64>();\n  const auto OpSize = IROp->Size;\n\n  const auto ElementSize = Op->Header.ElementSize;\n  const auto SubRegSize = ConvertSubRegSize4(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector = GetVReg(Op->Vector);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    switch (ElementSize) {\n    case IR::OpSize::i8Bit: {\n      revb(ARMEmitter::SubRegSize::i64Bit, Dst.Z(), Mask, Vector.Z());\n      break;\n    }\n    case IR::OpSize::i16Bit: {\n      revh(ARMEmitter::SubRegSize::i64Bit, Dst.Z(), Mask, Vector.Z());\n      break;\n    }\n    case IR::OpSize::i32Bit: {\n      revw(ARMEmitter::SubRegSize::i64Bit, Dst.Z(), Mask, Vector.Z());\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Invalid Element Size: {}\", ElementSize); break;\n    }\n  } else {\n    if (OpSize == IR::OpSize::i64Bit) {\n      rev64(SubRegSize, Dst.D(), Vector.D());\n    } else {\n      rev64(SubRegSize, Dst.Q(), Vector.Q());\n    }\n  }\n}\n\nDEF_OP(VFCADD) {\n  const auto Op = IROp->C<IR::IROp_VFCADD>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n\n  LOGMAN_THROW_A_FMT(Op->Rotate == 90 || Op->Rotate == 270, \"Invalidate Rotate\");\n  const auto Rotate = Op->Rotate == 90 ? ARMEmitter::Rotation::ROTATE_90 : ARMEmitter::Rotation::ROTATE_270;\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n\n    if (Dst == Vector1) {\n      // Trivial case where we already have first vector in the destination\n      // register. We can just do the operation in place.\n      fcadd(SubRegSize, Dst.Z(), Mask, Vector1.Z(), Vector2.Z(), Rotate);\n    } else if (Dst == Vector2) {\n      // SVE FCADD is a destructive operation, so we need\n      // a temporary for performing operations.\n      movprfx(VTMP1.Z(), Vector1.Z());\n      fcadd(SubRegSize, VTMP1.Z(), Mask, VTMP1.Z(), Vector2.Z(), Rotate);\n      mov(Dst.Z(), VTMP1.Z());\n    } else {\n      // We have no source/dest aliasing, so we can move into the destination.\n      movprfx(Dst.Z(), Vector1.Z());\n      fcadd(SubRegSize, Dst.Z(), Mask, Dst.Z(), Vector2.Z(), Rotate);\n    }\n  } else {\n    if (OpSize == IR::OpSize::i64Bit) {\n      fcadd(SubRegSize, Dst.D(), Vector1.D(), Vector2.D(), Rotate);\n    } else {\n      fcadd(SubRegSize, Dst.Q(), Vector1.Q(), Vector2.Q(), Rotate);\n    }\n  }\n}\n\nDEF_OP(VFMLA) {\n  ///< Dest = (Vector1 * Vector2) + Addend\n  // Matches:\n  // - SVE    - FMLA\n  // - ASIMD  - FMLA\n  // - Scalar - FMADD\n  const auto Op = IROp->C<IR::IROp_VFMLA>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n  const auto VectorAddend = GetVReg(Op->Addend);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n    ARMEmitter::VRegister DestTmp = Dst;\n    if (Dst != VectorAddend) {\n      if (Dst != Vector1 && Dst != Vector2) {\n        DestTmp = Dst;\n      } else {\n        DestTmp = VTMP1;\n      }\n      mov(DestTmp.Z(), VectorAddend.Z());\n    }\n\n    fmla(SubRegSize, DestTmp.Z(), Mask, Vector1.Z(), Vector2.Z());\n    if (Dst != DestTmp) {\n      mov(Dst.Z(), DestTmp.Z());\n    }\n  } else {\n    if (IROp->ElementSize == OpSize) {\n      if (IROp->ElementSize == IR::OpSize::i16Bit) {\n        fmadd(Dst.H(), Vector1.H(), Vector2.H(), VectorAddend.H());\n      } else if (IROp->ElementSize == IR::OpSize::i32Bit) {\n        fmadd(Dst.S(), Vector1.S(), Vector2.S(), VectorAddend.S());\n      } else if (IROp->ElementSize == IR::OpSize::i64Bit) {\n        fmadd(Dst.D(), Vector1.D(), Vector2.D(), VectorAddend.D());\n      }\n      return;\n    }\n    ARMEmitter::VRegister DestTmp = Dst;\n    if (Dst != VectorAddend) {\n      if (Dst != Vector1 && Dst != Vector2) {\n        DestTmp = Dst;\n      } else {\n        DestTmp = VTMP1;\n      }\n      mov(DestTmp.Q(), VectorAddend.Q());\n    }\n    if (OpSize == IR::OpSize::i128Bit) {\n      fmla(SubRegSize, DestTmp.Q(), Vector1.Q(), Vector2.Q());\n    } else {\n      fmla(SubRegSize, DestTmp.D(), Vector1.D(), Vector2.D());\n    }\n\n    if (Dst != DestTmp) {\n      mov(Dst.Q(), DestTmp.Q());\n    }\n  }\n}\n\nDEF_OP(VFMLS) {\n  ///< Dest = (Vector1 * Vector2) - Addend\n  // Matches:\n  // - SVE    - FNMLS\n  // - ASIMD  - FMLA (With negated addend)\n  // - Scalar - FNMSUB\n  const auto Op = IROp->C<IR::IROp_VFMLS>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is128Bit = OpSize == IR::OpSize::i128Bit;\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n  const auto VectorAddend = GetVReg(Op->Addend);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n    ARMEmitter::VRegister DestTmp = Dst;\n    if (Dst != VectorAddend) {\n      if (Dst != Vector1 && Dst != Vector2) {\n        DestTmp = Dst;\n      } else {\n        DestTmp = VTMP1;\n      }\n      mov(DestTmp.Z(), VectorAddend.Z());\n    }\n\n    fnmls(SubRegSize, DestTmp.Z(), Mask, Vector1.Z(), Vector2.Z());\n    if (Dst != DestTmp) {\n      mov(Dst.Z(), DestTmp.Z());\n    }\n  } else if (HostSupportsSVE128 && Is128Bit) {\n    const auto Mask = PRED_TMP_16B.Merging();\n    ARMEmitter::VRegister DestTmp = Dst;\n    if (Dst != VectorAddend) {\n      if (Dst != Vector1 && Dst != Vector2) {\n        DestTmp = Dst;\n      } else {\n        DestTmp = VTMP1;\n      }\n      mov(DestTmp.Z(), VectorAddend.Z());\n    }\n\n    fnmls(SubRegSize, DestTmp.Z(), Mask, Vector1.Z(), Vector2.Z());\n    if (Dst != DestTmp) {\n      mov(Dst.Z(), DestTmp.Z());\n    }\n  } else {\n    if (IROp->ElementSize == OpSize) {\n      if (IROp->ElementSize == IR::OpSize::i16Bit) {\n        fnmsub(Dst.H(), Vector1.H(), Vector2.H(), VectorAddend.H());\n      } else if (IROp->ElementSize == IR::OpSize::i32Bit) {\n        fnmsub(Dst.S(), Vector1.S(), Vector2.S(), VectorAddend.S());\n      } else if (IROp->ElementSize == IR::OpSize::i64Bit) {\n        fnmsub(Dst.D(), Vector1.D(), Vector2.D(), VectorAddend.D());\n      }\n      return;\n    }\n\n    // Addend needs to get negated to match correct behaviour here.\n    ARMEmitter::VRegister DestTmp = Dst;\n    if (Dst == Vector1 || Dst == Vector2) {\n      DestTmp = VTMP1;\n    }\n\n    if (Is128Bit) {\n      fneg(SubRegSize, DestTmp.Q(), VectorAddend.Q());\n    } else {\n      fneg(SubRegSize, DestTmp.D(), VectorAddend.D());\n    }\n\n    if (Is128Bit) {\n      fmla(SubRegSize, DestTmp.Q(), Vector1.Q(), Vector2.Q());\n    } else {\n      fmla(SubRegSize, DestTmp.D(), Vector1.D(), Vector2.D());\n    }\n\n    if (DestTmp != Dst) {\n      if (Is128Bit) {\n        mov(Dst.Q(), DestTmp.Q());\n      } else {\n        mov(Dst.D(), DestTmp.D());\n      }\n    }\n  }\n}\n\nDEF_OP(VFNMLA) {\n  ///< Dest = (-Vector1 * Vector2) + Addend\n  // Matches:\n  // - SVE    - FMLS\n  // - ASIMD  - FMLS\n  // - Scalar - FMSUB\n  const auto Op = IROp->C<IR::IROp_VFMLA>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n  const auto VectorAddend = GetVReg(Op->Addend);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n    ARMEmitter::VRegister DestTmp = Dst;\n    if (Dst != VectorAddend) {\n      if (Dst != Vector1 && Dst != Vector2) {\n        DestTmp = Dst;\n      } else {\n        DestTmp = VTMP1;\n      }\n      mov(DestTmp.Z(), VectorAddend.Z());\n    }\n\n    fmls(SubRegSize, DestTmp.Z(), Mask, Vector1.Z(), Vector2.Z());\n    if (Dst != DestTmp) {\n      mov(Dst.Z(), DestTmp.Z());\n    }\n  } else {\n    if (IROp->ElementSize == OpSize) {\n      if (IROp->ElementSize == IR::OpSize::i16Bit) {\n        fmsub(Dst.H(), Vector1.H(), Vector2.H(), VectorAddend.H());\n      } else if (IROp->ElementSize == IR::OpSize::i32Bit) {\n        fmsub(Dst.S(), Vector1.S(), Vector2.S(), VectorAddend.S());\n      } else if (IROp->ElementSize == IR::OpSize::i64Bit) {\n        fmsub(Dst.D(), Vector1.D(), Vector2.D(), VectorAddend.D());\n      }\n      return;\n    }\n\n    ARMEmitter::VRegister DestTmp = Dst;\n    if (Dst != VectorAddend) {\n      if (Dst != Vector1 && Dst != Vector2) {\n        DestTmp = Dst;\n      } else {\n        DestTmp = VTMP1;\n      }\n      mov(DestTmp.Q(), VectorAddend.Q());\n    }\n    if (OpSize == IR::OpSize::i128Bit) {\n      fmls(SubRegSize, DestTmp.Q(), Vector1.Q(), Vector2.Q());\n    } else {\n      fmls(SubRegSize, DestTmp.D(), Vector1.D(), Vector2.D());\n    }\n\n    if (Dst != DestTmp) {\n      mov(Dst.Q(), DestTmp.Q());\n    }\n  }\n}\n\nDEF_OP(VFNMLS) {\n  ///< Dest = (-Vector1 * Vector2) - Addend\n  // Matches:\n  // - SVE    - FNMLA\n  // - ASIMD  - FMLS (With Negated addend)\n  // - Scalar - FNMADD\n\n  const auto Op = IROp->C<IR::IROp_VFMLS>();\n  const auto OpSize = IROp->Size;\n\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n  const auto Is256Bit = OpSize == IR::OpSize::i256Bit;\n  LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, \"Need SVE256 support in order to use {} with 256-bit operation\", __func__);\n\n  const auto Is128Bit = OpSize == IR::OpSize::i128Bit;\n\n  const auto Dst = GetVReg(Node);\n  const auto Vector1 = GetVReg(Op->Vector1);\n  const auto Vector2 = GetVReg(Op->Vector2);\n  const auto VectorAddend = GetVReg(Op->Addend);\n\n  if (HostSupportsSVE256 && Is256Bit) {\n    const auto Mask = PRED_TMP_32B.Merging();\n    ARMEmitter::VRegister DestTmp = Dst;\n    if (Dst != VectorAddend) {\n      if (Dst != Vector1 && Dst != Vector2) {\n        DestTmp = Dst;\n      } else {\n        DestTmp = VTMP1;\n      }\n      mov(DestTmp.Z(), VectorAddend.Z());\n    }\n\n    fnmla(SubRegSize, DestTmp.Z(), Mask, Vector1.Z(), Vector2.Z());\n    if (Dst != DestTmp) {\n      mov(Dst.Z(), DestTmp.Z());\n    }\n  } else if (HostSupportsSVE128 && Is128Bit) {\n    const auto Mask = PRED_TMP_16B.Merging();\n    ARMEmitter::VRegister DestTmp = Dst;\n    if (Dst != VectorAddend) {\n      if (Dst != Vector1 && Dst != Vector2) {\n        DestTmp = Dst;\n      } else {\n        DestTmp = VTMP1;\n      }\n      mov(DestTmp.Z(), VectorAddend.Z());\n    }\n\n    fnmla(SubRegSize, DestTmp.Z(), Mask, Vector1.Z(), Vector2.Z());\n    if (Dst != DestTmp) {\n      mov(Dst.Z(), DestTmp.Z());\n    }\n  } else {\n    if (IROp->ElementSize == OpSize) {\n      if (IROp->ElementSize == IR::OpSize::i16Bit) {\n        fnmadd(Dst.H(), Vector1.H(), Vector2.H(), VectorAddend.H());\n      } else if (IROp->ElementSize == IR::OpSize::i32Bit) {\n        fnmadd(Dst.S(), Vector1.S(), Vector2.S(), VectorAddend.S());\n      } else if (IROp->ElementSize == IR::OpSize::i64Bit) {\n        fnmadd(Dst.D(), Vector1.D(), Vector2.D(), VectorAddend.D());\n      }\n      return;\n    }\n\n    // Addend needs to get negated to match correct behaviour here.\n    ARMEmitter::VRegister DestTmp = Dst;\n    if (Dst == Vector1 || Dst == Vector2) {\n      DestTmp = VTMP1;\n    }\n\n    if (Is128Bit) {\n      fneg(SubRegSize, DestTmp.Q(), VectorAddend.Q());\n    } else {\n      fneg(SubRegSize, DestTmp.D(), VectorAddend.D());\n    }\n\n    if (Is128Bit) {\n      fmls(SubRegSize, DestTmp.Q(), Vector1.Q(), Vector2.Q());\n    } else {\n      fmls(SubRegSize, DestTmp.D(), Vector1.D(), Vector2.D());\n    }\n\n    if (DestTmp != Dst) {\n      if (Is128Bit) {\n        mov(Dst.Q(), DestTmp.Q());\n      } else {\n        mov(Dst.D(), DestTmp.D());\n      }\n    }\n  }\n}\n\nDEF_OP(VFCopySign) {\n  auto Op = IROp->C<IR::IROp_VFCopySign>();\n  const auto OpSize = IROp->Size;\n  const auto SubRegSize = ConvertSubRegSize248(IROp);\n\n  ARMEmitter::VRegister Magnitude = GetVReg(Op->Vector1);\n  ARMEmitter::VRegister Sign = GetVReg(Op->Vector2);\n\n  //  We don't assign explicity to Dst but Dst and Magniture are tied to the same register.\n  //  Similar in semantics to C's copysignf.\n  switch (OpSize) {\n  case IR::OpSize::i64Bit:\n    movi(SubRegSize, VTMP1.D(), 0x80, 24);\n    bit(Magnitude.D(), Sign.D(), VTMP1.D());\n    break;\n  case IR::OpSize::i128Bit:\n    movi(SubRegSize, VTMP1.Q(), 0x80, 24);\n    bit(Magnitude.Q(), Sign.Q(), VTMP1.Q());\n    break;\n  default: LOGMAN_MSG_A_FMT(\"Unsupported element size for operation {}\", __func__); FEX_UNREACHABLE;\n  }\n}\n\nDEF_OP(F64SIN) {\n  const auto Op = IROp->C<IR::IROp_F64SIN>();\n  const auto Src = GetVReg(Op->Src);\n  const auto Dst = GetVReg(Node);\n\n  fmov(VTMP1.D(), Src.D());\n  ldr(TMP1, STATE_PTR(CpuStateFrame, Pointers.F64SinHandler));\n  str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n  blr(TMP1);\n  ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n  fmov(Dst.D(), VTMP1.D());\n}\n\nDEF_OP(F64COS) {\n  const auto Op = IROp->C<IR::IROp_F64COS>();\n  const auto Src = GetVReg(Op->Src);\n  const auto Dst = GetVReg(Node);\n\n  fmov(VTMP1.D(), Src.D());\n  ldr(TMP1, STATE_PTR(CpuStateFrame, Pointers.F64CosHandler));\n  str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n  blr(TMP1);\n  ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n  fmov(Dst.D(), VTMP1.D());\n}\n\nDEF_OP(F64TAN) {\n  const auto Op = IROp->C<IR::IROp_F64TAN>();\n  const auto Src = GetVReg(Op->Src);\n  const auto Dst = GetVReg(Node);\n\n  fmov(VTMP1.D(), Src.D());\n  ldr(TMP1, STATE_PTR(CpuStateFrame, Pointers.F64TanHandler));\n  str<ARMEmitter::IndexType::PRE>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, -16);\n  blr(TMP1);\n  ldr<ARMEmitter::IndexType::POST>(ARMEmitter::XReg::lr, ARMEmitter::Reg::rsp, 16);\n  fmov(Dst.D(), VTMP1.D());\n}\n\n\n} // namespace FEXCore::CPU\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/LookupCache.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: glue|block-database\ndesc: Stores information about blocks, and provides C++ implementations to lookup the blocks\n$end_info$\n*/\n\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n\n#include \"Interface/Context/Context.h\"\n#include \"Interface/Core/LookupCache.h\"\n\nnamespace FEXCore {\nGuestToHostMap::GuestToHostMap()\n  : BlockLinks_mbr {\"FEXMem_BlockLinks\"} {\n  BlockLinks_pma = fextl::make_unique<std::pmr::polymorphic_allocator<std::byte>>(&BlockLinks_mbr);\n  // Setup our PMR map.\n  BlockLinks = BlockLinks_pma->new_object<BlockLinksMapType>();\n}\n\nLookupCache::LookupCache(FEXCore::Context::ContextImpl* CTX)\n  : ctx {CTX} {\n\n  TotalCacheSize = ctx->Config.VirtualMemSize / FEXCore::Utils::FEX_PAGE_SIZE * 8 + CODE_SIZE + MAX_L1_SIZE;\n\n  // Block cache ends up looking like this\n  // PageMemoryMap[VirtualMemoryRegion >> 12]\n  //       |\n  //       v\n  // PageMemory[Memory & (VIRTUAL_PAGE_SIZE - 1)]\n  //       |\n  //       v\n  // Pointer to Code\n  //\n  // Allocate a region of memory that we can use to back our block pointers\n  // We need one pointer per page of virtual memory\n  // At 64GB of virtual memory this will allocate 128MB of virtual memory space\n  PagePointer = reinterpret_cast<uintptr_t>(FEXCore::Allocator::VirtualAlloc(TotalCacheSize, false, false));\n  LOGMAN_THROW_A_FMT(PagePointer != -1ULL, \"Failed to allocate PagePointer\");\n\n  // Disable THP on the Lookup cache.\n  FEXCore::Allocator::VirtualTHPControl(reinterpret_cast<void*>(PagePointer), TotalCacheSize, FEXCore::Allocator::THPControl::Disable);\n\n  FEXCore::Allocator::VirtualName(\"FEXMem_Lookup\", reinterpret_cast<void*>(PagePointer),\n                                  ctx->Config.VirtualMemSize / FEXCore::Utils::FEX_PAGE_SIZE * 8 + CODE_SIZE);\n  CTX->SyscallHandler->MarkOvercommitRange(PagePointer, TotalCacheSize);\n\n  // Allocate our memory backing our pages\n  // We need 32KB per guest page (One pointer per byte)\n  // XXX: We can drop down to 16KB if we store 4byte offsets from the code base\n  // We currently limit to 128MB of real memory for caching for the total cache size.\n  // Can end up being inefficient if we compile a small number of blocks per page\n  PageMemory = PagePointer + ctx->Config.VirtualMemSize / FEXCore::Utils::FEX_PAGE_SIZE * 8;\n\n  // L1 Cache\n  L1Pointer = PageMemory + CODE_SIZE;\n  FEXCore::Allocator::VirtualName(\"FEXMem_Lookup_L1\", reinterpret_cast<void*>(L1Pointer), MAX_L1_SIZE);\n\n  VirtualMemSize = ctx->Config.VirtualMemSize;\n\n  if (DynamicL1Cache()) {\n    // Start at minimum size when dynamic.\n    L1PointerMask = MIN_L1_ENTRIES - 1;\n  } else {\n    // Start at maximum instead.\n    L1PointerMask = MAX_L1_ENTRIES - 1;\n  }\n}\n\nLookupCache::~LookupCache() {\n  FEXCore::Allocator::VirtualFree(reinterpret_cast<void*>(PagePointer), TotalCacheSize);\n  ctx->SyscallHandler->UnmarkOvercommitRange(PagePointer, TotalCacheSize);\n\n  // No need to free BlockLinks map.\n  // These will get freed when their memory allocators are deallocated.\n}\n\nvoid LookupCache::ClearL2Cache(const FEXCore::LookupCacheBaseLockToken& lk) {\n  // Clear out the page memory\n  // PagePointer and PageMemory are sequential with each other. Clear both at once.\n  FEXCore::Allocator::VirtualDontNeed(reinterpret_cast<void*>(PagePointer),\n                                      ctx->Config.VirtualMemSize / FEXCore::Utils::FEX_PAGE_SIZE * 8 + CODE_SIZE, false);\n  AllocateOffset = 0;\n}\n\nvoid LookupCache::ClearThreadLocalCaches(const LookupCacheWriteLockToken&) {\n  // Clear L1 and L2 by clearing the full cache.\n  FEXCore::Allocator::VirtualDontNeed(reinterpret_cast<void*>(PagePointer), TotalCacheSize, false);\n  CachedCodePages.clear();\n}\n\nvoid LookupCache::ClearCache(const LookupCacheWriteLockToken& lk) {\n  // Clear L1 and L2 by clearing the full cache.\n  ClearThreadLocalCaches(lk);\n  Shared->ClearCache(lk);\n}\n\nvoid GuestToHostMap::ClearCache(const LookupCacheWriteLockToken&) {\n  // Allocate a new pointer from the BlockLinks pma again.\n  BlockLinks = BlockLinks_pma->new_object<BlockLinksMapType>();\n  // All code is gone, clear the block list\n  BlockList.clear();\n}\n\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/LookupCache.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include \"Interface/Context/Context.h\"\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/SHMStats.h>\n#include \"Utils/WritePriorityMutex.h\"\n\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/memory_resource.h>\n#include <FEXCore/fextl/robin_map.h>\n#include <FEXCore/fextl/robin_set.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXCore/fextl/memory_resource.h>\n\n#include <cstdint>\n#include <stddef.h>\n#include <utility>\n#include <mutex>\n\nnamespace FEXCore {\nstruct LookupCacheBaseLockToken {\nprotected:\n  // Protected constructor - only derived classes can construct\n  LookupCacheBaseLockToken() = default;\n};\n\nstruct LookupCacheWriteLockToken : public LookupCacheBaseLockToken {\nprivate:\n  // Only constructible by GuestToHostMap\n  friend struct GuestToHostMap;\n  LookupCacheWriteLockToken(FEXCore::Utils::WritePriorityMutex::Mutex& Mutex)\n    : Lock {Mutex} {}\n  std::lock_guard<FEXCore::Utils::WritePriorityMutex::Mutex> Lock;\n};\n\nstruct LookupCacheReadLockToken : public LookupCacheBaseLockToken {\nprivate:\n  // Only constructible by GuestToHostMap\n  friend struct GuestToHostMap;\n  LookupCacheReadLockToken(FEXCore::Utils::WritePriorityMutex::Mutex& Mutex)\n    : Lock {Mutex} {}\n  std::shared_lock<FEXCore::Utils::WritePriorityMutex::Mutex> Lock;\n};\n\nstruct GuestToHostMap {\n  FEXCore::Utils::WritePriorityMutex::Mutex Lock {};\n\n  [[nodiscard]]\n  LookupCacheWriteLockToken AcquireWriteLock() {\n    return LookupCacheWriteLockToken {Lock};\n  }\n\n  [[nodiscard]]\n  LookupCacheReadLockToken AcquireReadLock() {\n    return LookupCacheReadLockToken {Lock};\n  }\n\n  struct BlockLinkTag {\n    uint64_t GuestDestination;\n    FEXCore::Context::ExitFunctionLinkData* HostLink;\n\n    bool operator<(const BlockLinkTag& other) const {\n      if (GuestDestination < other.GuestDestination) {\n        return true;\n      } else if (GuestDestination == other.GuestDestination) {\n        return HostLink < other.HostLink;\n      } else {\n        return false;\n      }\n    }\n  };\n\n  // Use a monotonic buffer resource to allocate both the std::pmr::map and its members.\n  // This allows us to quickly clear the block link map by clearing the monotonic allocator.\n  // If we had allocated the block link map without the MBR, then clearing the map would require slowly\n  // walking each block member and destructing objects.\n  //\n  // This makes `BlockLinks` look like a raw pointer that could memory leak, but since it is backed by the MBR, it won't.\n  fextl::pmr::named_monotonic_page_buffer_resource BlockLinks_mbr;\n  using BlockLinksMapType = std::pmr::map<BlockLinkTag, FEXCore::Context::BlockDelinkerFunc>;\n  fextl::unique_ptr<std::pmr::polymorphic_allocator<std::byte>> BlockLinks_pma;\n  BlockLinksMapType* BlockLinks;\n\n  struct BlockEntry {\n    uint64_t HostCode;\n    fextl::vector<uint64_t> CodePages;\n  };\n\n  fextl::robin_map<uint64_t, BlockEntry> BlockList;\n\n  fextl::map<uint64_t, fextl::vector<uint64_t>> CodePages;\n\n  GuestToHostMap();\n\n  // Adds to Guest -> Host code mapping\n  const BlockEntry& AddBlockMapping(uint64_t Address, const fextl::vector<uint64_t>& CodePages, void* HostCode, const LookupCacheWriteLockToken&) {\n    // This may replace an existing mapping\n    // NOTE: Generally no previous entry should exist, however there is one exception:\n    //       If the backend updates the active thread's CodeBuffer, the new associated LookupCache\n    //       may already contain the block address. Since is comparatively rare, we'll just leak\n    //       one of the two blocks in this case.\n    return BlockList.insert_or_assign(Address, BlockEntry {(uintptr_t)HostCode, CodePages}).first->second;\n  }\n\n  const BlockEntry* FindBlock(uint64_t Address, const LookupCacheReadLockToken&) {\n    auto HostCode = BlockList.find(Address);\n    if (HostCode == BlockList.end()) {\n      return nullptr;\n    }\n    return &HostCode->second;\n  }\n\n  bool Erase(uint64_t Address, const LookupCacheWriteLockToken&) {\n    // Sever any links to this block\n    auto lower = BlockLinks->lower_bound({Address, nullptr});\n    auto upper = BlockLinks->upper_bound({Address, reinterpret_cast<FEXCore::Context::ExitFunctionLinkData*>(UINTPTR_MAX)});\n    for (auto it = lower; it != upper; it = BlockLinks->erase(it)) {\n      it->second(it->first.HostLink);\n    }\n\n    // Remove from BlockList\n    return BlockList.erase(Address) != 0;\n  }\n\n  void InvalidateRange(uint64_t Start, uint64_t Length) {\n    auto lk = AcquireWriteLock();\n\n    auto lower = CodePages.lower_bound(Start >> 12);\n    auto upper = CodePages.upper_bound((Start + Length - 1) >> 12);\n\n    for (auto it = lower; it != upper; it++) {\n      for (const auto& Entry : it->second) {\n        Erase(Entry, lk);\n      }\n    }\n    CodePages.erase(lower, upper);\n  }\n\n  void AddBlockLink(uint64_t GuestDestination, FEXCore::Context::ExitFunctionLinkData* HostLink,\n                    const FEXCore::Context::BlockDelinkerFunc& delinker, const LookupCacheWriteLockToken&) {\n    BlockLinks->insert({{GuestDestination, HostLink}, delinker});\n  }\n\n  bool AddBlockExecutableRange(const std::ranges::input_range auto& Addresses, uint64_t Start, uint64_t Length, const LookupCacheWriteLockToken&) {\n    bool rv = false;\n\n    for (auto CurrentPage = Start >> 12, EndPage = (Start + Length - 1) >> 12; CurrentPage <= EndPage; CurrentPage++) {\n      auto& CodePage = CodePages[CurrentPage];\n      rv |= CodePage.empty();\n      CodePage.insert(CodePage.end(), Addresses.begin(), Addresses.end());\n    }\n\n    return rv;\n  }\n\n  void ClearCache(const LookupCacheWriteLockToken&);\n};\n\nclass LookupCache {\npublic:\n  struct LookupCacheEntry {\n    uintptr_t HostCode;\n    uintptr_t GuestCode;\n  };\n\n  LookupCache(FEXCore::Context::ContextImpl* CTX);\n  ~LookupCache();\n\n  // Swaps out the underlying GuestToHostMap and clears all associated caches.\n  // This interface requires the previous CodeBuffer to be provided despite not using it. This ensures the shared write lock is still valid.\n  void ChangeGuestToHostMapping([[maybe_unused]] CPU::CodeBuffer& Prev, GuestToHostMap& NewMap, const LookupCacheWriteLockToken& lk) {\n    ClearThreadLocalCaches(lk);\n    Shared = &NewMap;\n  }\n\n  uintptr_t FindBlock(FEXCore::Core::InternalThreadState* Thread, uint64_t Address) {\n    // Try L1, no lock needed\n    auto& L1Entry = reinterpret_cast<LookupCacheEntry*>(L1Pointer)[Address & L1PointerMask];\n    if (L1Entry.GuestCode == Address) {\n      return L1Entry.HostCode;\n    }\n\n    // L2 and L3 need to be locked\n    uintptr_t HostPtr {};\n    {\n      std::optional<FEXCore::SHMStats::AccumulationBlock<uint64_t>> LockTime(\n        Thread->ThreadStats ? &Thread->ThreadStats->AccumulatedCacheReadLockTime : nullptr);\n      auto lk = Shared->AcquireReadLock();\n      LockTime.reset();\n\n      if (!DisableL2Cache()) {\n        // Try L2\n        const auto PageIndex = (Address & (VirtualMemSize - 1)) >> 12;\n        const auto PageOffset = Address & (0x0FFF);\n\n        const auto Pointers = reinterpret_cast<uintptr_t*>(PagePointer);\n        auto LocalPagePointer = Pointers[PageIndex];\n\n        // Do we a page pointer for this address?\n        if (LocalPagePointer) {\n          // Find there pointer for the address in the blocks\n          auto BlockPointers = reinterpret_cast<LookupCacheEntry*>(LocalPagePointer);\n\n          if (BlockPointers[PageOffset].GuestCode == Address) {\n            L1Entry.GuestCode = Address;\n            L1Entry.HostCode = BlockPointers[PageOffset].HostCode;\n            HostPtr = L1Entry.HostCode;\n          }\n        }\n      }\n\n      if (!HostPtr) {\n        // Try L3\n        auto Entry = Shared->FindBlock(Address, lk);\n        if (Entry) {\n          CacheBlockMapping(Address, *Entry, false, lk);\n          HostPtr = Entry->HostCode;\n        }\n      }\n    }\n\n    if (HostPtr && DynamicL1Cache()) {\n      UpdateDynamicL1Stats(Thread);\n    }\n\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Thread, AccumulatedCacheMissCount, 1);\n\n    return HostPtr;\n  }\n\n  void UpdateDynamicL1Stats(FEXCore::Core::InternalThreadState* Thread) {\n    // If host pointer was found in L2 or L3, then add it to the counter.\n    // Keeping track not L1 misses, but specifically L2/L3 hits.\n    ++L2L3CacheHits;\n\n    const auto CurrentTime = std::chrono::system_clock::now();\n    const auto Period = CurrentTime - LastPeriod;\n    if (Period >= SamplePeriod) {\n      // If larger than the sample period then check if we need to increase L1 cache size.\n      const double AveragePerSecond = static_cast<double>(L2L3CacheHits) /\n                                      static_cast<double>(std::chrono::duration_cast<std::chrono::milliseconds>(Period).count()) * 1000.0;\n\n      if (AveragePerSecond >= DynamicL1CacheIncreaseCountHeuristic()) {\n        if (CurrentL1Entries < MAX_L1_ENTRIES) {\n          CurrentL1Entries <<= 1;\n          L1PointerMask = CurrentL1Entries - 1;\n\n          // Update the thread's L1 pointer mask to increase how much cache it uses.\n          // Since we're in C-code, this is safe to update here.\n          Thread->CurrentFrame->State.L1Mask = GetScaledL1PointerMask();\n        }\n      } else if (AveragePerSecond < DynamicL1CacheDecreaseCountHeuristic()) {\n        if (CurrentL1Entries > MIN_L1_ENTRIES) {\n          CurrentL1Entries >>= 1;\n          L1PointerMask = CurrentL1Entries - 1;\n\n          // Madvise the entries that we are dropping. Gives the memory back to the OS.\n          LookupCacheEntry* FirstZeroL1Entry = &reinterpret_cast<LookupCacheEntry*>(L1Pointer)[CurrentL1Entries];\n          size_t ZeroMemorySize = (MAX_L1_ENTRIES - CurrentL1Entries) * sizeof(LookupCacheEntry);\n          FEXCore::Allocator::VirtualDontNeed(FirstZeroL1Entry, ZeroMemorySize, false);\n\n          // Update the thread's L1 pointer mask to increase how much cache it uses.\n          // Since we're in C-code, this is safe to update here.\n          Thread->CurrentFrame->State.L1Mask = GetScaledL1PointerMask();\n        }\n      }\n\n      // Update Last period to start again.\n      LastPeriod = CurrentTime;\n      L2L3CacheHits = 0;\n    }\n  }\n\n  GuestToHostMap* Shared = nullptr;\n\n  // Appends a list of Block {Address} to CodePages [Start, Start + Length)\n  // Returns true if new pages are marked as containing code\n  bool AddBlockExecutableRange(FEXCore::Core::InternalThreadState* Thread, const fextl::set<uint64_t>& Addresses, uint64_t Start, uint64_t Length) {\n    std::optional<FEXCore::SHMStats::AccumulationBlock<uint64_t>> LockTime(\n      Thread->ThreadStats ? &Thread->ThreadStats->AccumulatedCacheWriteLockTime : nullptr);\n    auto lk = Shared->AcquireWriteLock();\n    LockTime.reset();\n\n    return Shared->AddBlockExecutableRange(Addresses, Start, Length, lk);\n  }\n\n  // Adds to Guest -> Host code mapping\n  void AddBlockMapping(FEXCore::Core::InternalThreadState* Thread, uint64_t Address, const fextl::vector<uint64_t>& CodePages, void* HostCode) {\n    std::optional<FEXCore::SHMStats::AccumulationBlock<uint64_t>> LockTime(\n      Thread->ThreadStats ? &Thread->ThreadStats->AccumulatedCacheWriteLockTime : nullptr);\n    auto lk = Shared->AcquireWriteLock();\n    LockTime.reset();\n\n    const auto& Entry = Shared->AddBlockMapping(Address, CodePages, HostCode, lk);\n\n    // There is no need to update L1 or L2, they will get updated on first lookup\n    // However, adding to L1 here increases performance\n    CacheBlockMapping(Address, Entry, true, lk);\n  }\n\n  // Invalidates L1/L2 for a given guest block\n  void InvalidateCache(uint64_t Address, const LookupCacheWriteLockToken& lk) {\n    // Do L1\n    auto& L1Entry = reinterpret_cast<LookupCacheEntry*>(L1Pointer)[Address & L1PointerMask];\n    if (L1Entry.GuestCode == Address) {\n      L1Entry.GuestCode = 0;\n      // Leave L1Entry.HostCode as is, so that concurrent lookups won't read a null pointer\n      // This is a soft guarantee for cross thread invalidation, as atomics are not used\n      // and it hasn't been thoroughly tested\n    }\n\n    if (!DisableL2Cache()) {\n      // Do full map\n      Address = Address & (VirtualMemSize - 1);\n      uint64_t PageOffset = Address & (0x0FFF);\n      Address >>= 12;\n\n      uintptr_t* Pointers = reinterpret_cast<uintptr_t*>(PagePointer);\n      uint64_t LocalPagePointer = Pointers[Address];\n      if (!LocalPagePointer) {\n        // Page for this code didn't even exist, nothing to do\n        return;\n      }\n\n      // Page exists, just set the offset to zero\n      auto BlockPointers = reinterpret_cast<LookupCacheEntry*>(LocalPagePointer);\n      BlockPointers[PageOffset].GuestCode = 0;\n      BlockPointers[PageOffset].HostCode = 0;\n    }\n  }\n\n  // Invalidates all L1/L2 entries for all guest block that intersect the given range\n  bool InvalidateCacheRange(uint64_t Start, uint64_t Length) {\n    auto lk = Shared->AcquireWriteLock();\n\n    auto lower = CachedCodePages.lower_bound(Start >> 12);\n    auto upper = CachedCodePages.upper_bound((Start + Length - 1) >> 12);\n\n    for (auto it = lower; it != upper; it++) {\n      for (const auto& Entry : it->second) {\n        InvalidateCache(Entry, lk);\n      }\n    }\n    bool ret = upper != lower;\n    CachedCodePages.erase(lower, upper);\n    return ret;\n  }\n\n  void AddBlockLink(uint64_t GuestDestination, FEXCore::Context::ExitFunctionLinkData* HostLink,\n                    const FEXCore::Context::BlockDelinkerFunc& delinker, const LookupCacheWriteLockToken& lk) {\n    Shared->AddBlockLink(GuestDestination, HostLink, delinker, lk);\n  }\n\n  void ClearCache(const LookupCacheWriteLockToken&);\n  void ClearL2Cache(const LookupCacheBaseLockToken&);\n  void ClearThreadLocalCaches(const LookupCacheWriteLockToken&);\n\n  uintptr_t GetL1Pointer() const {\n    return L1Pointer;\n  }\n  uintptr_t GetScaledL1PointerMask() const {\n    return L1PointerMask << FEXCore::ilog2(sizeof(LookupCache::LookupCacheEntry));\n  }\n  uintptr_t GetPagePointer() const {\n    return PagePointer;\n  }\n  uintptr_t GetVirtualMemorySize() const {\n    return VirtualMemSize;\n  }\n\n  // This needs to be taken before reads or writes to L2, L3, CodePages,\n  // and before writes to L1. Concurrent access from a thread that this LookupCache doesn't belong to\n  // may only happen during cross thread invalidation (::Erase).\n  // All other operations must be done from the owning thread.\n  // Some care is taken so that L1 lookups can be done without locks, and even tearing is unlikely to lead to a crash.\n  // This approach has not been fully vetted yet.\n  // Also note that L1 lookups might be inlined in the JIT Dispatcher and/or block ends.\n  auto AcquireWriteLock() {\n    return Shared->AcquireWriteLock();\n  }\n\nprivate:\n  void CacheBlockMapping(uint64_t Address, const GuestToHostMap::BlockEntry& Entry, bool L1Only, const LookupCacheBaseLockToken& lk) {\n    for (const auto& CodePage : Entry.CodePages) {\n      CachedCodePages[CodePage >> 12].insert(Address);\n    }\n\n    // Do L1\n    auto& L1Entry = reinterpret_cast<LookupCacheEntry*>(L1Pointer)[Address & L1PointerMask];\n    L1Entry.GuestCode = Address;\n    L1Entry.HostCode = Entry.HostCode;\n\n    if (!DisableL2Cache() && !L1Only) {\n      // Do ful map\n      auto FullAddress = Address;\n      Address = Address & (VirtualMemSize - 1);\n\n      uint64_t PageOffset = Address & (0x0FFF);\n      Address >>= 12;\n\n      uintptr_t* Pointers = reinterpret_cast<uintptr_t*>(PagePointer);\n      uint64_t LocalPagePointer = Pointers[Address];\n      if (!LocalPagePointer) {\n        // We don't have a page pointer for this address\n        // Allocate one now if we can\n        uintptr_t NewPageBacking = AllocateBackingForPage();\n        if (!NewPageBacking) {\n          // Couldn't allocate, clear L2 and retry\n          ClearL2Cache(lk);\n          CacheBlockMapping(FullAddress, Entry, false, lk);\n          return;\n        }\n        Pointers[Address] = NewPageBacking;\n        LocalPagePointer = NewPageBacking;\n      }\n\n      // Add the new pointer to the page block\n      auto BlockPointers = reinterpret_cast<LookupCacheEntry*>(LocalPagePointer);\n\n      // This silently replaces existing mappings\n      BlockPointers[PageOffset].GuestCode = FullAddress;\n      BlockPointers[PageOffset].HostCode = Entry.HostCode;\n    }\n  }\n\n  uintptr_t AllocateBackingForPage() {\n    uintptr_t NewBase = AllocateOffset;\n    uintptr_t NewEnd = AllocateOffset + SIZE_PER_PAGE;\n\n    if (NewEnd >= CODE_SIZE) {\n      // We ran out of block backing space. Need to clear the block cache and tell the JIT cores to clear their caches as well\n      // Tell whatever is calling this that it needs to do it.\n      return 0;\n    }\n\n    AllocateOffset = NewEnd;\n    return PageMemory + NewBase;\n  }\n\n  // Maps from a page index to all blocks in the page that have at some point been fetched into L1/L2\n  fextl::map<uint64_t, fextl::robin_set<uint64_t>> CachedCodePages;\n\n  uintptr_t PagePointer;\n  uintptr_t PageMemory;\n  uintptr_t L1Pointer;\n  uintptr_t L1PointerMask;\n\n  size_t TotalCacheSize;\n\n  // Start with 8k entries in L1 to give 128KB of L1 cache to each thread.\n  // Max out at 1 million entries to give each thread 16MB of L1 cache maximum.\n  constexpr static size_t MIN_L1_ENTRIES = 8 * 1024;        // Must be a power of 2\n  constexpr static size_t MAX_L1_ENTRIES = 1 * 1024 * 1024; // Must be a power of 2\n\n  constexpr static size_t CODE_SIZE = 128 * 1024 * 1024;\n  constexpr static size_t SIZE_PER_PAGE = FEXCore::Utils::FEX_PAGE_SIZE * sizeof(LookupCacheEntry);\n  constexpr static size_t MAX_L1_SIZE = MAX_L1_ENTRIES * sizeof(LookupCacheEntry);\n\n  size_t AllocateOffset {};\n\n  FEXCore::Context::ContextImpl* ctx;\n  uint64_t VirtualMemSize {};\n\n  size_t CurrentL1Entries = MIN_L1_ENTRIES;\n  uint64_t L2L3CacheHits {};\n  std::chrono::time_point<std::chrono::system_clock> LastPeriod {};\n  constexpr static std::chrono::seconds SamplePeriod {1};\n  FEX_CONFIG_OPT(DynamicL1CacheIncreaseCountHeuristic, DYNAMICL1CACHEINCREASECOUNTHEURISTIC);\n  FEX_CONFIG_OPT(DynamicL1CacheDecreaseCountHeuristic, DYNAMICL1CACHEDECREASECOUNTHEURISTIC);\n\n  FEX_CONFIG_OPT(DynamicL1Cache, DYNAMICL1CACHE);\n  FEX_CONFIG_OPT(DisableL2Cache, DISABLEL2CACHE);\n};\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher/AVX_128.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-to-ir, opcodes|dispatcher-implementations\ndesc: Handles x86/64 AVX instructions to 128-bit IR\n$end_info$\n*/\n\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n\n#include <FEXCore/Utils/LogManager.h>\n#include \"Interface/Core/OpcodeDispatcher.h\"\n\n#include <array>\n#include <cstdint>\n#include <tuple>\n#include <utility>\n\nnamespace FEXCore::IR {\nclass OrderedNode;\n\n#define OpcodeArgs [[maybe_unused]] FEXCore::X86Tables::DecodedOp Op\n\nOpDispatchBuilder::RefPair OpDispatchBuilder::AVX128_LoadSource_WithOpSize(\n  const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand, uint32_t Flags, bool NeedsHigh, MemoryAccessType AccessType) {\n\n  if (Operand.IsGPR()) {\n    const auto gpr = Operand.Data.GPR.GPR;\n    LOGMAN_THROW_A_FMT(gpr >= FEXCore::X86State::REG_XMM_0 && gpr <= FEXCore::X86State::REG_XMM_15, \"must be AVX reg\");\n    const auto gprIndex = gpr - X86State::REG_XMM_0;\n    return {\n      .Low = AVX128_LoadXMMRegister(gprIndex, false),\n      .High = NeedsHigh ? AVX128_LoadXMMRegister(gprIndex, true) : nullptr,\n    };\n  } else {\n    LOGMAN_THROW_A_FMT(IsOperandMem(Operand, true), \"only memory sources\");\n\n    if (Operand.IsSIB()) {\n      const bool IsVSIB = (Op->Flags & X86Tables::DecodeFlags::FLAG_VSIB_BYTE) != 0;\n      LOGMAN_THROW_A_FMT(!IsVSIB, \"VSIB uses LoadVSIB instead\");\n    }\n\n    const AddressMode A = DecodeAddress(Op, Operand, AccessType, true /* IsLoad */);\n    if (NeedsHigh) {\n      return _LoadMemPairFPRAutoTSO(OpSize::i128Bit, A, OpSize::i8Bit);\n    } else {\n      return {.Low = _LoadMemFPRAutoTSO(OpSize::i128Bit, A, OpSize::i8Bit)};\n    }\n  }\n}\n\nOpDispatchBuilder::RefVSIB\nOpDispatchBuilder::AVX128_LoadVSIB(const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand, uint32_t Flags, bool NeedsHigh) {\n  const bool IsVSIB = (Op->Flags & X86Tables::DecodeFlags::FLAG_VSIB_BYTE) != 0;\n  LOGMAN_THROW_A_FMT((Operand.IsSIB() || Operand.IsSIBRelocation()) && IsVSIB, \"Trying to load VSIB for something that isn't the correct \"\n                                                                               \"type!\");\n\n  // VSIB is a very special case which has a ton of encoded data.\n  // Get it in a format we can reason about.\n\n  const auto Index_gpr = Operand.Data.SIB.Index;\n  const auto Base_gpr = Operand.Data.SIB.Base;\n  LOGMAN_THROW_A_FMT(Index_gpr >= FEXCore::X86State::REG_XMM_0 && Index_gpr <= FEXCore::X86State::REG_XMM_15, \"must be AVX reg\");\n  LOGMAN_THROW_A_FMT(Base_gpr == FEXCore::X86State::REG_INVALID || (Base_gpr >= FEXCore::X86State::REG_RAX && Base_gpr <= FEXCore::X86State::REG_R15),\n                     \"Base must be a GPR.\");\n  const auto Index_XMM_gpr = Index_gpr - X86State::REG_XMM_0;\n\n  OpDispatchBuilder::RefVSIB A {\n    .Low = AVX128_LoadXMMRegister(Index_XMM_gpr, false),\n    .High = NeedsHigh ? AVX128_LoadXMMRegister(Index_XMM_gpr, true) : Invalid(),\n    .BaseAddr = Base_gpr != FEXCore::X86State::REG_INVALID ? LoadGPRRegister(Base_gpr, OpSize::i64Bit, 0, false) : nullptr,\n    .Scale = Operand.Data.SIB.Scale,\n  };\n\n  if (Operand.IsSIBRelocation()) {\n    auto EPOffset = _EntrypointOffset(OpSize::i64Bit, Operand.Data.SIB.Offset);\n    if (A.BaseAddr) {\n      A.BaseAddr = Add(OpSize::i64Bit, EPOffset, A.BaseAddr);\n    } else {\n      A.BaseAddr = EPOffset;\n    }\n  } else {\n    A.Displacement = static_cast<int32_t>(Operand.Data.SIB.Offset);\n  }\n\n  return A;\n}\n\nvoid OpDispatchBuilder::AVX128_StoreResult_WithOpSize(FEXCore::X86Tables::DecodedOp Op, const FEXCore::X86Tables::DecodedOperand& Operand,\n                                                      const RefPair Src, MemoryAccessType AccessType) {\n  if (Operand.IsGPR()) {\n    const auto gpr = Operand.Data.GPR.GPR;\n    LOGMAN_THROW_A_FMT(gpr >= FEXCore::X86State::REG_XMM_0 && gpr <= FEXCore::X86State::REG_XMM_15, \"expected AVX register\");\n    const auto gprIndex = gpr - X86State::REG_XMM_0;\n\n    if (Src.Low) {\n      AVX128_StoreXMMRegister(gprIndex, Src.Low, false);\n    }\n\n    if (Src.High) {\n      AVX128_StoreXMMRegister(gprIndex, Src.High, true);\n    }\n  } else {\n    AddressMode A = DecodeAddress(Op, Operand, AccessType, false /* IsLoad */);\n\n    if (Src.High) {\n      _StoreMemPairFPRAutoTSO(OpSize::i128Bit, A, Src.Low, Src.High, OpSize::i8Bit);\n    } else {\n      _StoreMemFPRAutoTSO(OpSize::i128Bit, A, Src.Low, OpSize::i8Bit);\n    }\n  }\n}\n\nRef OpDispatchBuilder::AVX128_LoadXMMRegister(uint32_t XMM, bool High) {\n  if (High) {\n    return LoadContext(AVXHigh0Index + XMM);\n  } else {\n    return LoadXMMRegister(XMM);\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_StoreXMMRegister(uint32_t XMM, const Ref Src, bool High) {\n  if (High) {\n    StoreContext(AVXHigh0Index + XMM, Src);\n  } else {\n    StoreXMMRegister(XMM, Src);\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_VMOVAPS(OpcodeArgs) {\n  // Reg <- Mem or Reg <- Reg\n  const auto SrcSize = GetSrcSize(Op);\n  const auto Is128Bit = SrcSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  if (Is128Bit) {\n    // Zero upper 128-bits\n    auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false);\n\n    ///< Zero upper bits when destination is GPR.\n    if (Op->Dest.IsGPR()) {\n      Src.High = LoadZeroVector(OpSize::i128Bit);\n    }\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, Src);\n  } else {\n    // Copy or memory load\n    auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, true);\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, Src);\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_VMOVScalarImpl(OpcodeArgs, IR::OpSize ElementSize) {\n  if (Op->Dest.IsGPR() && Op->Src[0].IsGPR() && Op->Src[1].IsGPR()) {\n    // VMOVSS/SD xmm1, xmm2, xmm3\n    // Lower 128-bits are merged\n    // Upper 128-bits are zero'd\n    auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false);\n    auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, false);\n    Ref Result = _VInsElement(OpSize::i128Bit, ElementSize, 0, 0, Src1.Low, Src2.Low);\n    auto High = LoadZeroVector(OpSize::i128Bit);\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, RefPair {.Low = Result, .High = High});\n  } else if (Op->Dest.IsGPR()) {\n    // VMOVSS/SD xmm1, mem32/mem64\n    Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[1], ElementSize, Op->Flags);\n    auto High = LoadZeroVector(OpSize::i128Bit);\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, RefPair {.Low = Src, .High = High});\n  } else {\n    // VMOVSS/SD mem32/mem64, xmm1\n    auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, false);\n    StoreResultFPR_WithOpSize(Op, Op->Dest, Src.Low, ElementSize);\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_VMOVSD(OpcodeArgs) {\n  AVX128_VMOVScalarImpl(Op, OpSize::i64Bit);\n}\n\nvoid OpDispatchBuilder::AVX128_VMOVSS(OpcodeArgs) {\n  AVX128_VMOVScalarImpl(Op, OpSize::i32Bit);\n}\n\nvoid OpDispatchBuilder::AVX128_VectorALU(OpcodeArgs, IROps IROp, IR::OpSize ElementSize) {\n  const auto SrcSize = GetSrcSize(Op);\n  const auto Is128Bit = SrcSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, !Is128Bit);\n  DeriveOp(Result_Low, IROp, _VAdd(OpSize::i128Bit, ElementSize, Src1.Low, Src2.Low));\n\n  if (Is128Bit) {\n    auto High = LoadZeroVector(OpSize::i128Bit);\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, RefPair {.Low = Result_Low, .High = High});\n  } else {\n    DeriveOp(Result_High, IROp, _VAdd(OpSize::i128Bit, ElementSize, Src1.High, Src2.High));\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, RefPair {.Low = Result_Low, .High = Result_High});\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_VectorUnary(OpcodeArgs, IROps IROp, IR::OpSize ElementSize) {\n  const auto SrcSize = GetSrcSize(Op);\n  const auto Is128Bit = SrcSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  DeriveOp(Result_Low, IROp, _VFSqrt(OpSize::i128Bit, ElementSize, Src.Low));\n\n  if (Is128Bit) {\n    auto High = LoadZeroVector(OpSize::i128Bit);\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, RefPair {.Low = Result_Low, .High = High});\n  } else {\n    DeriveOp(Result_High, IROp, _VFSqrt(OpSize::i128Bit, ElementSize, Src.High));\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, RefPair {.Low = Result_Low, .High = Result_High});\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_VectorUnaryImpl(OpcodeArgs, IR::OpSize SrcSize, IR::OpSize ElementSize,\n                                               std::function<Ref(IR::OpSize ElementSize, Ref Src)> Helper) {\n  const auto Is128Bit = SrcSize == OpSize::i128Bit;\n\n  auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  RefPair Result {};\n  Result.Low = Helper(ElementSize, Src.Low);\n\n  if (Is128Bit) {\n    Result.High = LoadZeroVector(OpSize::i128Bit);\n  } else {\n    Result.High = Helper(ElementSize, Src.High);\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VectorBinaryImpl(OpcodeArgs, IR::OpSize SrcSize, IR::OpSize ElementSize,\n                                                std::function<Ref(IR::OpSize ElementSize, Ref Src1, Ref Src2)> Helper) {\n  const auto Is128Bit = SrcSize == OpSize::i128Bit;\n\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, !Is128Bit);\n  RefPair Result {};\n  Result.Low = Helper(ElementSize, Src1.Low, Src2.Low);\n\n  if (Is128Bit) {\n    Result.High = LoadZeroVector(OpSize::i128Bit);\n  } else {\n    Result.High = Helper(ElementSize, Src1.High, Src2.High);\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VectorTrinaryImpl(OpcodeArgs, IR::OpSize SrcSize, IR::OpSize ElementSize, Ref Src3,\n                                                 std::function<Ref(IR::OpSize ElementSize, Ref Src1, Ref Src2, Ref Src3)> Helper) {\n  const auto Is128Bit = SrcSize == OpSize::i128Bit;\n\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, !Is128Bit);\n  RefPair Result {};\n  Result.Low = Helper(ElementSize, Src1.Low, Src2.Low, Src3);\n\n  if (Is128Bit) {\n    Result.High = LoadZeroVector(OpSize::i128Bit);\n  } else {\n    Result.High = Helper(ElementSize, Src1.High, Src2.High, Src3);\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VectorShiftWideImpl(OpcodeArgs, IR::OpSize ElementSize, IROps IROp) {\n  const auto Is128Bit = GetSrcSize(Op) == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, false);\n\n  // Incoming element size for the shift source is always 8-bytes in the lower register.\n  DeriveOp(Low, IROp, _VUShrSWide(OpSize::i128Bit, ElementSize, Src1.Low, Src2.Low));\n\n  RefPair Result {};\n  Result.Low = Low;\n\n  if (Is128Bit) {\n    Result.High = LoadZeroVector(OpSize::i128Bit);\n  } else {\n    DeriveOp(High, IROp, _VUShrSWide(OpSize::i128Bit, ElementSize, Src1.High, Src2.Low));\n    Result.High = High;\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VectorShiftImmImpl(OpcodeArgs, IR::OpSize ElementSize, IROps IROp) {\n  const auto DstSize = GetDstSize(Op);\n  const auto Is128Bit = DstSize == Core::CPUState::XMM_SSE_REG_SIZE;\n  const uint64_t ShiftConstant = Op->Src[1].Literal();\n\n  auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  RefPair Result {};\n\n  if (ShiftConstant == 0) [[unlikely]] {\n    Result = Src;\n  } else {\n    DeriveOp(Low, IROp, _VUShrI(OpSize::i128Bit, ElementSize, Src.Low, ShiftConstant));\n    Result.Low = Low;\n\n    if (!Is128Bit) {\n      DeriveOp(High, IROp, _VUShrI(OpSize::i128Bit, ElementSize, Src.High, ShiftConstant));\n      Result.High = High;\n    }\n  }\n\n  if (Is128Bit) {\n    Result.High = LoadZeroVector(OpSize::i128Bit);\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VectorXOR(OpcodeArgs) {\n  // Special case for vector xor with itself being the optimal way for x86 to zero vector registers.\n  if (Op->Src[0].IsGPR() && Op->Src[1].IsGPR() && Op->Src[0].Data.GPR.GPR == Op->Src[1].Data.GPR.GPR) {\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, AVX128_Zext(LoadZeroVector(OpSize::i128Bit)));\n    return;\n  }\n\n  ///< Regular code path\n  AVX128_VectorALU(Op, OP_VXOR, OpSize::i128Bit);\n}\n\nvoid OpDispatchBuilder::AVX128_VZERO(OpcodeArgs) {\n  const auto DstSize = GetDstSize(Op);\n  const auto IsVZEROALL = DstSize == Core::CPUState::XMM_AVX_REG_SIZE;\n  const auto NumRegs = Is64BitMode ? 16U : 8U;\n\n  if (IsVZEROALL) {\n    // NOTE: Despite the name being VZEROALL, this will still only ever\n    //       zero out up to the first 16 registers (even on AVX-512, where we have 32 registers)\n    Ref ZeroVector {};\n\n    for (uint32_t i = 0; i < NumRegs; i++) {\n      // Explicitly not caching named vector zero. This ensures that every register gets movi #0.0 directly.\n      ZeroVector = LoadUncachedZeroVector(OpSize::i128Bit);\n      AVX128_StoreXMMRegister(i, ZeroVector, false);\n    }\n\n    InvalidateHighAVXRegisters();\n    _ContextClear(offsetof(FEXCore::Core::CPUState, avx_high), sizeof(FEXCore::Core::CPUState::avx_high[0]) * NumRegs);\n  } else {\n    // Likewise, VZEROUPPER will only ever zero only up to the first 16 registers\n    InvalidateHighAVXRegisters();\n    _ContextClear(offsetof(FEXCore::Core::CPUState, avx_high), sizeof(FEXCore::Core::CPUState::avx_high[0]) * NumRegs);\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_MOVVectorNT(OpcodeArgs) {\n  const auto SrcSize = GetSrcSize(Op);\n  const auto Is128Bit = SrcSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  if (Op->Dest.IsGPR()) {\n    ///< MOVNTDQA load non-temporal comes from SSE4.1 and is extended by AVX/AVX2.\n    RefPair Src {};\n    Ref SrcAddr = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.LoadData = false});\n    Src.Low = _VLoadNonTemporal(OpSize::i128Bit, SrcAddr, 0);\n\n    if (Is128Bit) {\n      Src.High = LoadZeroVector(OpSize::i128Bit);\n    } else {\n      Src.High = _VLoadNonTemporal(OpSize::i128Bit, SrcAddr, 16);\n    }\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, Src);\n  } else {\n    auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit, MemoryAccessType::STREAM);\n    Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.LoadData = false});\n\n    if (Is128Bit) {\n      // Single store non-temporal for 128-bit operations.\n      _VStoreNonTemporal(OpSize::i128Bit, Src.Low, Dest, 0);\n    } else {\n      // For a 256-bit store, use a non-temporal store pair\n      _VStoreNonTemporalPair(OpSize::i128Bit, Src.Low, Src.High, Dest, 0);\n    }\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_MOVQ(OpcodeArgs) {\n  RefPair Src {};\n  if (Op->Src[0].IsGPR()) {\n    Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false);\n  } else {\n    Src.Low = LoadSourceFPR_WithOpSize(Op, Op->Src[0], OpSize::i64Bit, Op->Flags);\n  }\n\n  // This instruction is a bit special that if the destination is a register then it'll ZEXT the 64bit source to 256bit\n  if (Op->Dest.IsGPR()) {\n    // Zero bits [127:64] as well.\n    Src.Low = VZeroExtendOperand(OpSize::i64Bit, Op->Src[0], Src.Low);\n    Ref ZeroVector = LoadZeroVector(OpSize::i128Bit);\n    Src.High = ZeroVector;\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, Src);\n  } else {\n    StoreResultFPR_WithOpSize(Op, Op->Dest, Src.Low, OpSize::i64Bit, OpSize::i64Bit);\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_VMOVLP(OpcodeArgs) {\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false);\n\n  if (!Op->Dest.IsGPR()) {\n    ///< VMOVLPS/PD mem64, xmm1\n    StoreResultFPR_WithOpSize(Op, Op->Dest, Src1.Low, OpSize::i64Bit, OpSize::i64Bit);\n  } else if (!Op->Src[1].IsGPR()) {\n    ///< VMOVLPS/PD xmm1, xmm2, mem64\n    // Bits[63:0] come from Src2[63:0]\n    // Bits[127:64] come from Src1[127:64]\n    auto Src2 = MakeSegmentAddress(Op, Op->Src[1]);\n    Ref Result_Low = _VLoadVectorElement(OpSize::i128Bit, OpSize::i64Bit, Src1.Low, 0, Src2);\n    Ref ZeroVector = LoadZeroVector(OpSize::i128Bit);\n\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, RefPair {.Low = Result_Low, .High = ZeroVector});\n  } else {\n    ///< VMOVHLPS/PD xmm1, xmm2, xmm3\n    auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, false);\n\n    Ref Result_Low = _VInsElement(OpSize::i128Bit, OpSize::i64Bit, 0, 1, Src1.Low, Src2.Low);\n    Ref ZeroVector = LoadZeroVector(OpSize::i128Bit);\n\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, RefPair {.Low = Result_Low, .High = ZeroVector});\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_VMOVHP(OpcodeArgs) {\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false);\n\n  if (!Op->Dest.IsGPR()) {\n    ///< VMOVHPS/PD mem64, xmm1\n    // Need to store Bits[127:64]. Use a vector element store.\n    auto Dest = MakeSegmentAddress(Op, Op->Dest);\n    _VStoreVectorElement(OpSize::i128Bit, OpSize::i64Bit, Src1.Low, 1, Dest);\n  } else if (!Op->Src[1].IsGPR()) {\n    ///< VMOVHPS/PD xmm2, xmm1, mem64\n    auto Src2 = MakeSegmentAddress(Op, Op->Src[1]);\n\n    // Bits[63:0] come from Src1[63:0]\n    // Bits[127:64] come from Src2[63:0]\n    Ref Result_Low = _VLoadVectorElement(OpSize::i128Bit, OpSize::i64Bit, Src1.Low, 1, Src2);\n    Ref ZeroVector = LoadZeroVector(OpSize::i128Bit);\n\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, RefPair {.Low = Result_Low, .High = ZeroVector});\n  } else {\n    // VMOVLHPS xmm1, xmm2, xmm3\n    auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, false);\n\n    Ref Result_Low = _VZip(OpSize::i128Bit, OpSize::i64Bit, Src1.Low, Src2.Low);\n    Ref ZeroVector = LoadZeroVector(OpSize::i128Bit);\n\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, RefPair {.Low = Result_Low, .High = ZeroVector});\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_VMOVDDUP(OpcodeArgs) {\n  const auto SrcSize = GetSrcSize(Op);\n  const auto Is128Bit = SrcSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  const auto IsSrcGPR = Op->Src[0].IsGPR();\n\n  RefPair Src {};\n  if (IsSrcGPR) {\n    Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  } else {\n    // Accesses from memory are a little weird.\n    // 128-bit operation only loads 8-bytes.\n    // 256-bit operation loads a full 32-bytes.\n    if (Is128Bit) {\n      Src.Low = LoadSourceFPR_WithOpSize(Op, Op->Src[0], OpSize::i64Bit, Op->Flags);\n    } else {\n      Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, true);\n    }\n  }\n\n  if (Is128Bit) {\n    // Duplicate Src[63:0] in to low 128-bits\n    auto Result_Low = _VDupElement(OpSize::i128Bit, OpSize::i64Bit, Src.Low, 0);\n    Ref ZeroVector = LoadZeroVector(OpSize::i128Bit);\n\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, RefPair {.Low = Result_Low, .High = ZeroVector});\n  } else {\n    // Duplicate Src.Low[63:0] in to low 128-bits\n    auto Result_Low = _VDupElement(OpSize::i128Bit, OpSize::i64Bit, Src.Low, 0);\n    // Duplicate Src.High[63:0] in to high 128-bits\n    auto Result_High = _VDupElement(OpSize::i128Bit, OpSize::i64Bit, Src.High, 0);\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, RefPair {.Low = Result_Low, .High = Result_High});\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_VMOVSLDUP(OpcodeArgs) {\n  AVX128_VectorUnaryImpl(Op, OpSizeFromSrc(Op), OpSize::i32Bit,\n                         [this](IR::OpSize ElementSize, Ref Src) { return _VTrn(OpSize::i128Bit, ElementSize, Src, Src); });\n}\n\nvoid OpDispatchBuilder::AVX128_VMOVSHDUP(OpcodeArgs) {\n  AVX128_VectorUnaryImpl(Op, OpSizeFromSrc(Op), OpSize::i32Bit,\n                         [this](IR::OpSize ElementSize, Ref Src) { return _VTrn2(OpSize::i128Bit, ElementSize, Src, Src); });\n}\n\nvoid OpDispatchBuilder::AVX128_VBROADCAST(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto DstSize = GetDstSize(Op);\n  const auto Is128Bit = DstSize == Core::CPUState::XMM_SSE_REG_SIZE;\n  RefPair Src {};\n\n  if (Op->Src[0].IsGPR()) {\n    Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false);\n    if (ElementSize != OpSize::i128Bit) {\n      // Only duplicate if not VBROADCASTF128.\n      Src.Low = _VDupElement(OpSize::i128Bit, ElementSize, Src.Low, 0);\n    }\n  } else {\n    // Get the address to broadcast from into a GPR.\n    Ref Address = MakeSegmentAddress(Op, Op->Src[0], GetGPROpSize());\n    Src.Low = _VBroadcastFromMem(OpSize::i128Bit, ElementSize, Address);\n  }\n\n  if (Is128Bit) {\n    Src.High = LoadZeroVector(OpSize::i128Bit);\n  } else {\n    Src.High = Src.Low;\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Src);\n}\n\nvoid OpDispatchBuilder::AVX128_VPUNPCKL(OpcodeArgs, IR::OpSize ElementSize) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromSrc(Op), ElementSize,\n                          [this](IR::OpSize _ElementSize, Ref Src1, Ref Src2) { return _VZip(OpSize::i128Bit, _ElementSize, Src1, Src2); });\n}\n\nvoid OpDispatchBuilder::AVX128_VPUNPCKH(OpcodeArgs, IR::OpSize ElementSize) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromSrc(Op), ElementSize,\n                          [this](IR::OpSize _ElementSize, Ref Src1, Ref Src2) { return _VZip2(OpSize::i128Bit, _ElementSize, Src1, Src2); });\n}\n\nvoid OpDispatchBuilder::AVX128_MOVVectorUnaligned(OpcodeArgs) {\n  const auto SrcSize = GetSrcSize(Op);\n  const auto Is128Bit = SrcSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  if (!Is128Bit && Op->Dest.IsGPR() && Op->Src[0].IsGPR() && Op->Dest.Data.GPR.GPR == Op->Src[0].Data.GPR.GPR) {\n    // Nop\n    return;\n  }\n\n  auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n\n  if (Is128Bit) {\n    Src.High = LoadZeroVector(OpSize::i128Bit);\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Src);\n}\n\nvoid OpDispatchBuilder::AVX128_InsertCVTGPR_To_FPR(OpcodeArgs, IR::OpSize DstElementSize) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto DstSize = OpSizeFromDst(Op);\n\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false);\n\n  RefPair Result {};\n\n  if (Op->Src[1].IsGPR()) {\n    // If the source is a GPR then convert directly from the GPR.\n    auto Src2 = LoadSourceGPR_WithOpSize(Op, Op->Src[1], GetGPROpSize(), Op->Flags);\n    Result.Low = _VSToFGPRInsert(OpSize::i128Bit, DstElementSize, SrcSize, Src1.Low, Src2, false);\n  } else if (SrcSize != DstElementSize) {\n    // If the source is from memory but the Source size and destination size aren't the same,\n    // then it is more optimal to load in to a GPR and convert between GPR->FPR.\n    // ARM GPR->FPR conversion supports different size source and destinations while FPR->FPR doesn't.\n    auto Src2 = LoadSourceGPR(Op, Op->Src[1], Op->Flags);\n    Result.Low = _VSToFGPRInsert(DstSize, DstElementSize, SrcSize, Src1.Low, Src2, false);\n  } else {\n    // In the case of cvtsi2s{s,d} where the source and destination are the same size,\n    // then it is more optimal to load in to the FPR register directly and convert there.\n    auto Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n    // Always signed\n    Result.Low = _VSToFVectorInsert(DstSize, DstElementSize, DstElementSize, Src1.Low, Src2, false, false);\n  }\n\n  const auto Is128Bit = DstSize == OpSize::i128Bit;\n  LOGMAN_THROW_A_FMT(Is128Bit, \"Programming Error: This should never occur!\");\n  Result.High = LoadZeroVector(OpSize::i128Bit);\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_CVTFPR_To_GPR(OpcodeArgs, IR::OpSize SrcElementSize, bool HostRoundingMode) {\n  // If loading a vector, use the full size, so we don't\n  // unnecessarily zero extend the vector. Otherwise, if\n  // memory, then we want to load the element size exactly.\n  RefPair Src {};\n  if (Op->Src[0].IsGPR()) {\n    Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false);\n  } else {\n    Src.Low = LoadSourceFPR_WithOpSize(Op, Op->Src[0], SrcElementSize, Op->Flags);\n  }\n\n  Ref Result = CVTFPR_To_GPRImpl(Op, Src.Low, SrcElementSize, HostRoundingMode);\n  StoreResultGPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VANDN(OpcodeArgs) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromSrc(Op), OpSize::i128Bit,\n                          [this](IR::OpSize _ElementSize, Ref Src1, Ref Src2) { return _VAndn(OpSize::i128Bit, _ElementSize, Src2, Src1); });\n}\n\nvoid OpDispatchBuilder::AVX128_VPACKSS(OpcodeArgs, IR::OpSize ElementSize) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromSrc(Op), ElementSize, [this](IR::OpSize _ElementSize, Ref Src1, Ref Src2) {\n    return _VSQXTNPair(OpSize::i128Bit, _ElementSize, Src1, Src2);\n  });\n}\n\nvoid OpDispatchBuilder::AVX128_VPACKUS(OpcodeArgs, IR::OpSize ElementSize) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromSrc(Op), ElementSize, [this](IR::OpSize _ElementSize, Ref Src1, Ref Src2) {\n    return _VSQXTUNPair(OpSize::i128Bit, _ElementSize, Src1, Src2);\n  });\n}\n\nRef OpDispatchBuilder::AVX128_PSIGNImpl(IR::OpSize ElementSize, Ref Src1, Ref Src2) {\n  Ref Control = _VSQSHL(OpSize::i128Bit, ElementSize, Src2, IR::OpSizeAsBits(ElementSize) - 1);\n  Control = _VSRSHR(OpSize::i128Bit, ElementSize, Control, IR::OpSizeAsBits(ElementSize) - 1);\n  return _VMul(OpSize::i128Bit, ElementSize, Src1, Control);\n}\n\nvoid OpDispatchBuilder::AVX128_VPSIGN(OpcodeArgs, IR::OpSize ElementSize) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromSrc(Op), ElementSize,\n                          [this](IR::OpSize _ElementSize, Ref Src1, Ref Src2) { return AVX128_PSIGNImpl(_ElementSize, Src1, Src2); });\n}\n\nvoid OpDispatchBuilder::AVX128_UCOMISx(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto SrcSize = Op->Src[0].IsGPR() ? GetGuestVectorLength() : ElementSize;\n\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Dest, Op->Flags, false);\n\n  RefPair Src2 {};\n\n  // Careful here, if the source is from a GPR then we want to load the full 128-bit lower half.\n  // If it is memory then we only want to load the element size.\n  if (Op->Src[0].IsGPR()) {\n    Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false);\n  } else {\n    Src2.Low = LoadSourceFPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags);\n  }\n\n  Comiss(ElementSize, Src1.Low, Src2.Low);\n}\n\nvoid OpDispatchBuilder::AVX128_VectorScalarInsertALU(OpcodeArgs, FEXCore::IR::IROps IROp, IR::OpSize ElementSize) {\n  // We load the full vector width when dealing with a source vector,\n  // so that we don't do any unnecessary zero extension to the scalar\n  // element that we're going to operate on.\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false);\n  RefPair Src2 {};\n  if (Op->Src[1].IsGPR()) {\n    Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, false);\n  } else {\n    Src2.Low = LoadSourceFPR_WithOpSize(Op, Op->Src[1], SrcSize, Op->Flags);\n  }\n\n  // If OpSize == ElementSize then it only does the lower scalar op\n  DeriveOp(Result_Low, IROp, _VFAddScalarInsert(OpSize::i128Bit, ElementSize, Src1.Low, Src2.Low, false));\n  auto High = LoadZeroVector(OpSize::i128Bit);\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, RefPair {.Low = Result_Low, .High = High});\n}\n\nvoid OpDispatchBuilder::AVX128_VFCMP(OpcodeArgs, IR::OpSize ElementSize) {\n  const uint8_t CompType = Op->Src[2].Literal();\n\n  struct {\n    FEXCore::X86Tables::DecodedOp Op;\n    uint32_t CompType {};\n  } Capture {\n    .Op = Op,\n    .CompType = CompType & 0b11111u,\n  };\n\n  AVX128_VectorBinaryImpl(Op, OpSizeFromSrc(Op), ElementSize, [this, &Capture](IR::OpSize _ElementSize, Ref Src1, Ref Src2) {\n    return VFCMPOpImpl(OpSize::i128Bit, _ElementSize, Src1, Src2, Capture.CompType);\n  });\n}\n\nvoid OpDispatchBuilder::AVX128_InsertScalarFCMP(OpcodeArgs, IR::OpSize ElementSize) {\n  // We load the full vector width when dealing with a source vector,\n  // so that we don't do any unnecessary zero extension to the scalar\n  // element that we're going to operate on.\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false);\n  RefPair Src2 {};\n\n  if (Op->Src[1].IsGPR()) {\n    Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, false);\n  } else {\n    Src2.Low = LoadSourceFPR_WithOpSize(Op, Op->Src[1], SrcSize, Op->Flags);\n  }\n\n  const uint8_t CompType = Op->Src[2].Literal();\n\n  RefPair Result {};\n  Result.Low = InsertScalarFCMPOpImpl(OpSize::i128Bit, OpSize::i128Bit, ElementSize, Src1.Low, Src2.Low, CompType & 0b11111, false);\n  Result.High = LoadZeroVector(OpSize::i128Bit);\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_MOVBetweenGPR_FPR(OpcodeArgs) {\n  if (Op->Dest.IsGPR() && Op->Dest.Data.GPR.GPR >= FEXCore::X86State::REG_XMM_0) {\n    ///< XMM <- Reg/Mem\n\n    RefPair Result {};\n    if (Op->Src[0].IsGPR()) {\n      // Loading from GPR and moving to Vector.\n      Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], GetGPROpSize(), Op->Flags);\n      // zext to 128bit\n      Result.Low = _VCastFromGPR(OpSize::i128Bit, OpSizeFromSrc(Op), Src);\n    } else {\n      // Loading from Memory as a scalar. Zero extend\n      Result.Low = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    }\n\n    Result.High = LoadZeroVector(OpSize::i128Bit);\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n  } else {\n    ///< Reg/Mem <- XMM\n    auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false);\n\n    if (Op->Dest.IsGPR()) {\n      auto ElementSize = OpSizeFromDst(Op);\n      // Extract element from GPR. Zero extending in the process.\n      Src.Low = _VExtractToGPR(OpSizeFromSrc(Op), ElementSize, Src.Low, 0);\n      StoreResultGPR(Op, Op->Dest, Src.Low);\n    } else {\n      // Storing first element to memory.\n      Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.LoadData = false});\n      _StoreMemFPR(OpSizeFromDst(Op), Dest, Src.Low, OpSize::i8Bit);\n    }\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_PExtr(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto DstSize = OpSizeFromDst(Op);\n\n  auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false);\n  uint64_t Index = Op->Src[1].Literal();\n\n  // Fixup of 32-bit element size.\n  // When the element size is 32-bit then it can be overriden as 64-bit because the encoding of PEXTRD/PEXTRQ\n  // is the same except that REX.W or VEX.W is set to 1. Incredibly frustrating.\n  // Use the destination size as the element size in this case.\n  auto OverridenElementSize = ElementSize;\n  if (ElementSize == OpSize::i32Bit) {\n    OverridenElementSize = DstSize;\n  }\n\n  // AVX version only operates on 128-bit.\n  const uint8_t NumElements = IR::NumElements(std::min(OpSizeFromSrc(Op), OpSize::i128Bit), OverridenElementSize);\n  Index &= NumElements - 1;\n\n  if (Op->Dest.IsGPR()) {\n    const auto GPRSize = GetGPROpSize();\n    // Extract already zero extends the result.\n    Ref Result = _VExtractToGPR(OpSize::i128Bit, OverridenElementSize, Src.Low, Index);\n    StoreResultGPR_WithOpSize(Op, Op->Dest, Result, GPRSize);\n    return;\n  }\n\n  // If we are storing to memory then we store the size of the element extracted\n  Ref Dest = MakeSegmentAddress(Op, Op->Dest);\n  _VStoreVectorElement(OpSize::i128Bit, OverridenElementSize, Src.Low, Index, Dest);\n}\n\nvoid OpDispatchBuilder::AVX128_ExtendVectorElements(OpcodeArgs, IR::OpSize ElementSize, IR::OpSize DstElementSize, bool Signed) {\n  const auto DstSize = OpSizeFromDst(Op);\n\n  const auto GetSrc = [&] {\n    if (Op->Src[0].IsGPR()) {\n      return AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false).Low;\n    } else {\n      // For memory operands the 256-bit variant loads twice the size specified in the table.\n      const auto Is256Bit = DstSize == OpSize::i256Bit;\n      const auto SrcSize = OpSizeFromSrc(Op);\n      const auto LoadSize = Is256Bit ? IR::SizeToOpSize(IR::OpSizeToSize(SrcSize) * 2) : SrcSize;\n\n      return LoadSourceFPR_WithOpSize(Op, Op->Src[0], LoadSize, Op->Flags);\n    }\n  };\n\n  auto Transform = [=, this](Ref Src) {\n    for (auto CurrentElementSize = ElementSize; CurrentElementSize != DstElementSize; CurrentElementSize = CurrentElementSize << 1) {\n      if (Signed) {\n        Src = _VSXTL(OpSize::i128Bit, CurrentElementSize, Src);\n      } else {\n        Src = _VUXTL(OpSize::i128Bit, CurrentElementSize, Src);\n      }\n    }\n    return Src;\n  };\n\n  Ref Src = GetSrc();\n  RefPair Result {};\n\n  if (DstSize == OpSize::i128Bit) {\n    // 128-bit operation is easy, it stays within the single register.\n    Result.Low = Transform(Src);\n  } else {\n    // 256-bit operation is a bit special. It splits the incoming source between lower and upper registers.\n    size_t TotalElementCount = IR::NumElements(OpSize::i256Bit, DstElementSize);\n    size_t TotalElementsToSplitSize = (TotalElementCount / 2) * IR::OpSizeToSize(ElementSize);\n\n    // Split the number of elements in half between lower and upper.\n    Ref SrcHigh = _VDupElement(OpSize::i128Bit, IR::SizeToOpSize(TotalElementsToSplitSize), Src, 1);\n    Result.Low = Transform(Src);\n    Result.High = Transform(SrcHigh);\n  }\n\n  if (DstSize == OpSize::i128Bit) {\n    // Regular zero-extending semantics.\n    Result.High = LoadZeroVector(OpSize::i128Bit);\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_MOVMSK(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto Is128Bit = SrcSize == OpSize::i128Bit;\n\n  auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n\n  auto Mask8Byte = [this](Ref Src) {\n    // UnZip2 the 64-bit elements as 32-bit to get the sign bits closer.\n    // Sign bits are now in bit positions 31 and 63 after this.\n    Src = _VUnZip2(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n\n    // Extract the low 64-bits to GPR in one move.\n    Ref GPR = _VExtractToGPR(OpSize::i128Bit, OpSize::i64Bit, Src, 0);\n    // BFI the sign bit in 31 in to 62.\n    // Inserting the full lower 32-bits offset 31 so the sign bit ends up at offset 63.\n    GPR = _Bfi(OpSize::i64Bit, 32, 31, GPR, GPR);\n    // Shift right to only get the two sign bits we care about.\n    return _Lshr(OpSize::i64Bit, GPR, Constant(62));\n  };\n\n  auto Mask4Byte = [this](Ref Src) {\n    // Shift all the sign bits to the bottom of their respective elements.\n    Src = _VUShrI(OpSize::i128Bit, OpSize::i32Bit, Src, 31);\n    // Load the specific 128-bit movmskps shift elements operator.\n    auto ConstantUSHL = LoadAndCacheNamedVectorConstant(OpSize::i128Bit, NAMED_VECTOR_MOVMSKPS_SHIFT);\n    // Shift the sign bits in to specific locations.\n    Src = _VUShl(OpSize::i128Bit, OpSize::i32Bit, Src, ConstantUSHL, false);\n    // Add across the vector so the sign bits will end up in bits [3:0]\n    Src = _VAddV(OpSize::i128Bit, OpSize::i32Bit, Src);\n    // Extract to a GPR.\n    return _VExtractToGPR(OpSize::i128Bit, OpSize::i32Bit, Src, 0);\n  };\n\n  Ref GPR {};\n  if (Is128Bit) {\n    if (ElementSize == OpSize::i64Bit) {\n      GPR = Mask8Byte(Src.Low);\n    } else {\n      GPR = Mask4Byte(Src.Low);\n    }\n  } else if (ElementSize == OpSize::i32Bit) {\n    auto GPRLow = Mask4Byte(Src.Low);\n    auto GPRHigh = Mask4Byte(Src.High);\n    GPR = _Orlshl(OpSize::i64Bit, GPRLow, GPRHigh, 4);\n  } else {\n    auto GPRLow = Mask8Byte(Src.Low);\n    auto GPRHigh = Mask8Byte(Src.High);\n    GPR = _Orlshl(OpSize::i64Bit, GPRLow, GPRHigh, 2);\n  }\n  StoreResultGPR_WithOpSize(Op, Op->Dest, GPR, GetGPROpSize());\n}\n\nvoid OpDispatchBuilder::AVX128_MOVMSKB(OpcodeArgs) {\n  const auto SrcSize = GetSrcSize(Op);\n  const auto Is128Bit = SrcSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  Ref VMask = LoadAndCacheNamedVectorConstant(OpSize::i128Bit, NAMED_VECTOR_MOVMASKB);\n\n  auto Mask1Byte = [this](Ref Src, Ref VMask) {\n    auto VCMP = _VCMPLTZ(OpSize::i128Bit, OpSize::i8Bit, Src);\n    auto VAnd = _VAnd(OpSize::i128Bit, OpSize::i8Bit, VCMP, VMask);\n\n    auto VAdd1 = _VAddP(OpSize::i128Bit, OpSize::i8Bit, VAnd, VAnd);\n    auto VAdd2 = _VAddP(OpSize::i128Bit, OpSize::i8Bit, VAdd1, VAdd1);\n    auto VAdd3 = _VAddP(OpSize::i64Bit, OpSize::i8Bit, VAdd2, VAdd2);\n\n    ///< 16-bits of data per 128-bit\n    return _VExtractToGPR(OpSize::i128Bit, OpSize::i16Bit, VAdd3, 0);\n  };\n\n  Ref Result = Mask1Byte(Src.Low, VMask);\n\n  if (!Is128Bit) {\n    auto ResultHigh = Mask1Byte(Src.High, VMask);\n    Result = _Orlshl(OpSize::i64Bit, Result, ResultHigh, 16);\n  }\n\n  StoreResultGPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_PINSRImpl(OpcodeArgs, IR::OpSize ElementSize, const X86Tables::DecodedOperand& Src1Op,\n                                         const X86Tables::DecodedOperand& Src2Op, const X86Tables::DecodedOperand& Imm) {\n  const auto NumElements = IR::NumElements(OpSize::i128Bit, ElementSize);\n  const uint64_t Index = Imm.Literal() & (NumElements - 1);\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Src1Op, Op->Flags, false);\n\n  RefPair Result {};\n\n  if (Src2Op.IsGPR()) {\n    // If the source is a GPR then convert directly from the GPR.\n    auto Src2 = LoadSourceGPR_WithOpSize(Op, Src2Op, GetGPROpSize(), Op->Flags);\n    Result.Low = _VInsGPR(OpSize::i128Bit, ElementSize, Index, Src1.Low, Src2);\n  } else {\n    // If loading from memory then we only load the element size\n    auto Src2 = MakeSegmentAddress(Op, Src2Op);\n    Result.Low = _VLoadVectorElement(OpSize::i128Bit, ElementSize, Src1.Low, Index, Src2);\n  }\n\n  Result.High = LoadZeroVector(OpSize::i128Bit);\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VPINSRB(OpcodeArgs) {\n  AVX128_PINSRImpl(Op, OpSize::i8Bit, Op->Src[0], Op->Src[1], Op->Src[2]);\n}\n\nvoid OpDispatchBuilder::AVX128_VPINSRW(OpcodeArgs) {\n  AVX128_PINSRImpl(Op, OpSize::i16Bit, Op->Src[0], Op->Src[1], Op->Src[2]);\n}\n\nvoid OpDispatchBuilder::AVX128_VPINSRDQ(OpcodeArgs) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  AVX128_PINSRImpl(Op, SrcSize, Op->Src[0], Op->Src[1], Op->Src[2]);\n}\n\nvoid OpDispatchBuilder::AVX128_VariableShiftImpl(OpcodeArgs, IROps IROp) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromDst(Op), OpSizeFromSrc(Op), [this, IROp](IR::OpSize ElementSize, Ref Src1, Ref Src2) {\n    DeriveOp(Shift, IROp, _VUShr(OpSize::i128Bit, ElementSize, Src1, Src2, true));\n    return Shift;\n  });\n}\n\nvoid OpDispatchBuilder::AVX128_ShiftDoubleImm(OpcodeArgs, ShiftDirection Dir) {\n  const auto DstSize = GetDstSize(Op);\n  const auto Is128Bit = DstSize == Core::CPUState::XMM_SSE_REG_SIZE;\n  const bool Right = Dir == ShiftDirection::RIGHT;\n\n  const uint64_t Shift = Op->Src[1].Literal();\n  const uint64_t ExtrShift = Right ? Shift : IR::OpSizeToSize(OpSize::i128Bit) - Shift;\n\n  auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n\n  RefPair Result {};\n  if (Shift == 0) [[unlikely]] {\n    Result = Src;\n  } else if (Shift >= Core::CPUState::XMM_SSE_REG_SIZE) {\n    Result.Low = LoadZeroVector(OpSize::i128Bit);\n    Result.High = Result.Low;\n  } else {\n    Ref ZeroVector = LoadZeroVector(OpSize::i128Bit);\n    RefPair Zero {ZeroVector, ZeroVector};\n    RefPair Src1 = Right ? Zero : Src;\n    RefPair Src2 = Right ? Src : Zero;\n\n    Result.Low = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src1.Low, Src2.Low, ExtrShift);\n    if (!Is128Bit) {\n      Result.High = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src1.High, Src2.High, ExtrShift);\n    }\n  }\n\n  if (Is128Bit) {\n    Result.High = LoadZeroVector(OpSize::i128Bit);\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VINSERT(OpcodeArgs) {\n  const auto DstSize = GetDstSize(Op);\n  const auto Is128Bit = DstSize == Core::CPUState::XMM_SSE_REG_SIZE;\n  const auto Selector = Op->Src[2].Literal() & 1;\n\n  auto Result = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, false);\n\n  if (Selector == 0) {\n    // Insert in to Low bits\n    Result.Low = Src2.Low;\n  } else {\n    // Insert in to the High bits\n    Result.High = Src2.Low;\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VINSERTPS(OpcodeArgs) {\n  Ref Result = InsertPSOpImpl(Op, Op->Src[0], Op->Src[1], Op->Src[2]);\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, AVX128_Zext(Result));\n}\n\nvoid OpDispatchBuilder::AVX128_VPHSUB(OpcodeArgs, IR::OpSize ElementSize) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromDst(Op), ElementSize, [this](IR::OpSize _ElementSize, Ref Src1, Ref Src2) {\n    return PHSUBOpImpl(OpSize::i128Bit, Src1, Src2, _ElementSize);\n  });\n}\n\nvoid OpDispatchBuilder::AVX128_VPHSUBSW(OpcodeArgs) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromDst(Op), OpSize::i16Bit,\n                          [this](IR::OpSize _ElementSize, Ref Src1, Ref Src2) { return PHSUBSOpImpl(OpSize::i128Bit, Src1, Src2); });\n}\n\nvoid OpDispatchBuilder::AVX128_VADDSUBP(OpcodeArgs, IR::OpSize ElementSize) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromDst(Op), ElementSize, [this](IR::OpSize _ElementSize, Ref Src1, Ref Src2) {\n    return ADDSUBPOpImpl(OpSize::i128Bit, _ElementSize, Src1, Src2);\n  });\n}\n\nvoid OpDispatchBuilder::AVX128_VPMULL(OpcodeArgs, IR::OpSize ElementSize, bool Signed) {\n  LOGMAN_THROW_A_FMT(ElementSize == OpSize::i32Bit, \"Currently only handles 32-bit -> 64-bit\");\n\n  AVX128_VectorBinaryImpl(Op, OpSizeFromDst(Op), ElementSize, [&](IR::OpSize _ElementSize, Ref Src1, Ref Src2) -> Ref {\n    return PMULLOpImpl(OpSize::i128Bit, _ElementSize, Signed, Src1, Src2);\n  });\n}\n\nvoid OpDispatchBuilder::AVX128_VPMULHRSW(OpcodeArgs) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromDst(Op), OpSize::i16Bit,\n                          [this](IR::OpSize _ElementSize, Ref Src1, Ref Src2) -> Ref { return PMULHRSWOpImpl(OpSize::i128Bit, Src1, Src2); });\n}\n\nvoid OpDispatchBuilder::AVX128_VPMULHW(OpcodeArgs, bool Signed) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromDst(Op), OpSize::i16Bit, [&](IR::OpSize _ElementSize, Ref Src1, Ref Src2) -> Ref {\n    if (Signed) {\n      return _VSMulH(OpSize::i128Bit, _ElementSize, Src1, Src2);\n    } else {\n      return _VUMulH(OpSize::i128Bit, _ElementSize, Src1, Src2);\n    }\n  });\n}\n\nvoid OpDispatchBuilder::AVX128_InsertScalar_CVT_Float_To_Float(OpcodeArgs, IR::OpSize DstElementSize, IR::OpSize SrcElementSize) {\n  // Gotta be careful with this operation.\n  // It inserts in to the lowest element, retaining the remainder of the lower 128-bits.\n  // Then zero extends the top 128-bit.\n  const auto SrcSize = Op->Src[1].IsGPR() ? OpSize::i128Bit : SrcElementSize;\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false);\n  Ref Src2 = LoadSourceFPR_WithOpSize(Op, Op->Src[1], SrcSize, Op->Flags, {.AllowUpperGarbage = true});\n\n  Ref Result = _VFToFScalarInsert(OpSize::i128Bit, DstElementSize, SrcElementSize, Src1.Low, Src2, false);\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, AVX128_Zext(Result));\n}\n\nvoid OpDispatchBuilder::AVX128_Vector_CVT_Float_To_Float(OpcodeArgs, IR::OpSize DstElementSize, IR::OpSize SrcElementSize) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto DstSize = OpSizeFromDst(Op);\n\n  const auto IsFloatSrc = SrcElementSize == OpSize::i32Bit;\n  auto Is128BitSrc = SrcSize == OpSize::i128Bit;\n  auto Is128BitDst = DstSize == OpSize::i128Bit;\n\n  ///< Decompose correctly.\n  if (DstElementSize > SrcElementSize && !Is128BitDst) {\n    Is128BitSrc = true;\n  } else if (SrcElementSize > DstElementSize && !Is128BitSrc) {\n    Is128BitDst = true;\n  }\n\n  const auto LoadSize = IsFloatSrc && !Op->Src[0].IsGPR() ? IR::SizeToOpSize(IR::OpSizeToSize(SrcSize) / 2) : SrcSize;\n\n  RefPair Src {};\n  if (Op->Src[0].IsGPR() || LoadSize >= OpSize::i128Bit) {\n    Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128BitSrc);\n  } else {\n    // Handle 64-bit memory source.\n    // In the case of cvtps2pd xmm, m64.\n    Src.Low = LoadSourceFPR_WithOpSize(Op, Op->Src[0], LoadSize, Op->Flags);\n  }\n\n  RefPair Result {};\n\n  auto TransformLow = [&](Ref Src) -> Ref {\n    return _Vector_FToF(OpSize::i128Bit, DstElementSize, Src, SrcElementSize);\n  };\n\n  auto TransformHigh = [&](Ref Src) -> Ref {\n    return _VFCVTL2(OpSize::i128Bit, SrcElementSize, Src);\n  };\n\n  Result.Low = TransformLow(Src.Low);\n  if (Is128BitSrc) {\n    if (Is128BitDst) {\n      // cvtps2pd xmm, xmm or cvtpd2ps xmm, xmm\n      // Done here\n    } else {\n      LOGMAN_THROW_A_FMT(DstElementSize > SrcElementSize, \"cvtpd2ps ymm, xmm doesn't exist\");\n\n      // cvtps2pd ymm, xmm\n      Result.High = TransformHigh(Src.Low);\n    }\n  } else {\n    // 256-bit src\n    LOGMAN_THROW_A_FMT(Is128BitDst, \"Not real: cvt{ps2pd,pd2ps} ymm, ymm\");\n    LOGMAN_THROW_A_FMT(DstElementSize < SrcElementSize, \"cvtps2pd xmm, ymm doesn't exist\");\n\n    // cvtpd2ps xmm, ymm\n    Result.Low = _VInsElement(OpSize::i128Bit, OpSize::i64Bit, 1, 0, Result.Low, TransformLow(Src.High));\n  }\n\n  if (Is128BitDst) {\n    Result = AVX128_Zext(Result.Low);\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_Vector_CVT_Float_To_Int(OpcodeArgs, IR::OpSize SrcElementSize, bool HostRoundingMode) {\n  const auto SrcSize = GetSrcSize(Op);\n\n  const auto Is128BitSrc = SrcSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  // VCVTPD2DQ/VCVTTPD2DQ only use the bottom lane, even for the 256-bit version.\n  auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128BitSrc);\n  RefPair Result {};\n\n  Result.Low = Vector_CVT_Float_To_Int32Impl(Op, OpSize::i128Bit, Src.Low, OpSize::i128Bit, SrcElementSize, HostRoundingMode, Is128BitSrc);\n  if (Is128BitSrc) {\n    // Zero the upper 128-bit lane of the result.\n    Result = AVX128_Zext(Result.Low);\n  } else {\n    Result.High = Vector_CVT_Float_To_Int32Impl(Op, OpSize::i128Bit, Src.High, OpSize::i128Bit, SrcElementSize, HostRoundingMode, false);\n    // Also convert the upper 128-bit lane\n    if (SrcElementSize == OpSize::i64Bit) {\n      // Zip the two halves together in to the lower 128-bits\n      Result.Low = _VZip(OpSize::i128Bit, OpSize::i64Bit, Result.Low, Result.High);\n\n      // Zero the upper 128-bit lane of the result.\n      Result = AVX128_Zext(Result.Low);\n    }\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_Vector_CVT_Int_To_Float(OpcodeArgs, IR::OpSize SrcElementSize, bool Widen) {\n  const auto Size = OpSizeFromDst(Op);\n  const auto Is128Bit = Size == OpSize::i128Bit;\n\n  RefPair Src = [&] {\n    if (Widen && !Op->Src[0].IsGPR()) {\n      // If loading a vector, use the full size, so we don't\n      // unnecessarily zero extend the vector. Otherwise, if\n      // memory, then we want to load the element size exactly.\n      const auto LoadSize = IR::SizeToOpSize(8 * (IR::OpSizeToSize(Size) / 16));\n      return RefPair {.Low = LoadSourceFPR_WithOpSize(Op, Op->Src[0], LoadSize, Op->Flags)};\n    } else {\n      return AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n    }\n  }();\n\n  auto Convert = [&](Ref Src, IROps Op) -> Ref {\n    auto ElementSize = SrcElementSize;\n    if (Widen) {\n      DeriveOp(Extended, Op, _VSXTL(OpSize::i128Bit, ElementSize, Src));\n      Src = Extended;\n      ElementSize = ElementSize << 1;\n    }\n\n    return _Vector_SToF(OpSize::i128Bit, ElementSize, Src);\n  };\n\n  RefPair Result {};\n  Result.Low = Convert(Src.Low, IROps::OP_VSXTL);\n\n  if (Is128Bit) {\n    Result = AVX128_Zext(Result.Low);\n  } else {\n    if (Widen) {\n      Result.High = Convert(Src.Low, IROps::OP_VSXTL2);\n    } else {\n      Result.High = Convert(Src.High, IROps::OP_VSXTL);\n    }\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VEXTRACT128(OpcodeArgs) {\n  const auto DstIsXMM = Op->Dest.IsGPR();\n  const auto Selector = Op->Src[1].Literal() & 0b1;\n\n  auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, true);\n\n  RefPair Result {};\n  if (Selector == 0) {\n    Result.Low = Src.Low;\n  } else {\n    Result.Low = Src.High;\n  }\n\n  if (DstIsXMM) {\n    // Only zero the upper-half when destination is XMM, otherwise this is a memory store.\n    Result = AVX128_Zext(Result.Low);\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VAESImc(OpcodeArgs) {\n  ///< 128-bit only.\n  AVX128_VectorUnaryImpl(Op, OpSize::i128Bit, OpSize::i128Bit, [this](IR::OpSize, Ref Src) { return _VAESImc(Src); });\n}\n\nvoid OpDispatchBuilder::AVX128_VAESEnc(OpcodeArgs) {\n  AVX128_VectorTrinaryImpl(Op, OpSizeFromDst(Op), OpSize::i128Bit, LoadZeroVector(OpSize::i128Bit),\n                           [this](IR::OpSize, Ref Src1, Ref Src2, Ref Src3) { return _VAESEnc(OpSize::i128Bit, Src1, Src2, Src3); });\n}\n\nvoid OpDispatchBuilder::AVX128_VAESEncLast(OpcodeArgs) {\n  AVX128_VectorTrinaryImpl(Op, OpSizeFromDst(Op), OpSize::i128Bit, LoadZeroVector(OpSize::i128Bit),\n                           [this](IR::OpSize, Ref Src1, Ref Src2, Ref Src3) { return _VAESEncLast(OpSize::i128Bit, Src1, Src2, Src3); });\n}\n\nvoid OpDispatchBuilder::AVX128_VAESDec(OpcodeArgs) {\n  AVX128_VectorTrinaryImpl(Op, OpSizeFromDst(Op), OpSize::i128Bit, LoadZeroVector(OpSize::i128Bit),\n                           [this](IR::OpSize, Ref Src1, Ref Src2, Ref Src3) { return _VAESDec(OpSize::i128Bit, Src1, Src2, Src3); });\n}\n\nvoid OpDispatchBuilder::AVX128_VAESDecLast(OpcodeArgs) {\n  AVX128_VectorTrinaryImpl(Op, OpSizeFromDst(Op), OpSize::i128Bit, LoadZeroVector(OpSize::i128Bit),\n                           [this](IR::OpSize, Ref Src1, Ref Src2, Ref Src3) { return _VAESDecLast(OpSize::i128Bit, Src1, Src2, Src3); });\n}\n\nvoid OpDispatchBuilder::AVX128_VAESKeyGenAssist(OpcodeArgs) {\n  ///< 128-bit only.\n  const uint64_t RCON = Op->Src[1].Literal();\n  auto ZeroRegister = LoadZeroVector(OpSize::i128Bit);\n  auto KeyGenSwizzle = LoadAndCacheNamedVectorConstant(OpSize::i128Bit, NAMED_VECTOR_AESKEYGENASSIST_SWIZZLE);\n\n  struct {\n    Ref ZeroRegister;\n    Ref KeyGenSwizzle;\n    uint64_t RCON;\n  } Capture {\n    .ZeroRegister = ZeroRegister,\n    .KeyGenSwizzle = KeyGenSwizzle,\n    .RCON = RCON,\n  };\n\n  AVX128_VectorUnaryImpl(Op, OpSize::i128Bit, OpSize::i128Bit, [this, &Capture](IR::OpSize, Ref Src) {\n    return _VAESKeyGenAssist(Src, Capture.KeyGenSwizzle, Capture.ZeroRegister, Capture.RCON);\n  });\n}\n\nvoid OpDispatchBuilder::AVX128_VPCMPESTRI(OpcodeArgs) {\n  PCMPXSTRXOpImpl(Op, true, false);\n\n  ///< Does not zero anything.\n}\n\nvoid OpDispatchBuilder::AVX128_VPCMPESTRM(OpcodeArgs) {\n  PCMPXSTRXOpImpl(Op, true, true);\n\n  ///< Zero the upper 128-bits of hardcoded YMM0\n  AVX128_StoreXMMRegister(0, LoadZeroVector(OpSize::i128Bit), true);\n}\n\nvoid OpDispatchBuilder::AVX128_VPCMPISTRI(OpcodeArgs) {\n  PCMPXSTRXOpImpl(Op, false, false);\n\n  ///< Does not zero anything.\n}\n\nvoid OpDispatchBuilder::AVX128_VPCMPISTRM(OpcodeArgs) {\n  PCMPXSTRXOpImpl(Op, false, true);\n\n  ///< Zero the upper 128-bits of hardcoded YMM0\n  AVX128_StoreXMMRegister(0, LoadZeroVector(OpSize::i128Bit), true);\n}\n\nvoid OpDispatchBuilder::AVX128_PHMINPOSUW(OpcodeArgs) {\n  Ref Result = PHMINPOSUWOpImpl(Op);\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, AVX128_Zext(Result));\n}\n\nvoid OpDispatchBuilder::AVX128_VectorRound(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto Size = OpSizeFromSrc(Op);\n  const auto Mode = Op->Src[1].Literal();\n\n  AVX128_VectorUnaryImpl(Op, Size, ElementSize,\n                         [this, Mode](IR::OpSize ElementSize, Ref Src) { return VectorRoundImpl(OpSize::i128Bit, ElementSize, Src, Mode); });\n}\n\nvoid OpDispatchBuilder::AVX128_InsertScalarRound(OpcodeArgs, IR::OpSize ElementSize) {\n  // We load the full vector width when dealing with a source vector,\n  // so that we don't do any unnecessary zero extension to the scalar\n  // element that we're going to operate on.\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false);\n  RefPair Src2 {};\n  if (Op->Src[1].IsGPR()) {\n    Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, false);\n  } else {\n    Src2.Low = LoadSourceFPR_WithOpSize(Op, Op->Src[1], SrcSize, Op->Flags);\n  }\n\n  // If OpSize == ElementSize then it only does the lower scalar op\n  const auto SourceMode = TranslateRoundType(Op->Src[2].Literal());\n\n  Ref Result = _VFToIScalarInsert(OpSize::i128Bit, ElementSize, Src1.Low, Src2.Low, SourceMode, false);\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, AVX128_Zext(Result));\n}\n\nvoid OpDispatchBuilder::AVX128_VDPP(OpcodeArgs, IR::OpSize ElementSize) {\n  const uint64_t Literal = Op->Src[2].Literal();\n\n  AVX128_VectorBinaryImpl(Op, OpSizeFromSrc(Op), ElementSize, [this, Literal](IR::OpSize ElementSize, Ref Src1, Ref Src2) {\n    return DPPOpImpl(OpSize::i128Bit, Src1, Src2, Literal, ElementSize);\n  });\n}\n\nvoid OpDispatchBuilder::AVX128_VPERMQ(OpcodeArgs) {\n  ///< Only ever 256-bit.\n  auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, true);\n  const auto Selector = Op->Src[1].Literal();\n\n  RefPair Result {};\n\n  // Crack the operation in to two halves and implement per half\n  uint8_t SelectorLow = Selector & 0b1111;\n  uint8_t SelectorHigh = (Selector >> 4) & 0b1111;\n  auto SelectLane = [this](uint8_t Selector, RefPair Src) -> Ref {\n    LOGMAN_THROW_A_FMT(Selector < 16, \"Selector too large!\");\n\n    switch (Selector) {\n    case 0b00'00: return _VDupElement(OpSize::i128Bit, OpSize::i64Bit, Src.Low, 0);\n    case 0b00'01: return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src.Low, Src.Low, 8);\n    case 0b00'10: return _VZip(OpSize::i128Bit, OpSize::i64Bit, Src.High, Src.Low);\n    case 0b00'11: return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src.Low, Src.High, 8);\n    case 0b01'00: return Src.Low;\n    case 0b01'01: return _VDupElement(OpSize::i128Bit, OpSize::i64Bit, Src.Low, 1);\n    case 0b01'10: return _VInsElement(OpSize::i128Bit, OpSize::i64Bit, 1, 1, Src.High, Src.Low);\n    case 0b01'11: return _VTrn2(OpSize::i128Bit, OpSize::i64Bit, Src.High, Src.Low);\n    case 0b10'00: return _VZip(OpSize::i128Bit, OpSize::i64Bit, Src.Low, Src.High);\n    case 0b10'01: return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src.High, Src.Low, 8);\n    case 0b10'10: return _VDupElement(OpSize::i128Bit, OpSize::i64Bit, Src.High, 0);\n    case 0b10'11: return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src.High, Src.High, 8);\n    case 0b11'00: return _VInsElement(OpSize::i128Bit, OpSize::i64Bit, 1, 1, Src.Low, Src.High);\n    case 0b11'01: return _VTrn2(OpSize::i128Bit, OpSize::i64Bit, Src.Low, Src.High);\n    case 0b11'10: return Src.High;\n    case 0b11'11: return _VDupElement(OpSize::i128Bit, OpSize::i64Bit, Src.High, 1);\n    default: FEX_UNREACHABLE;\n    }\n  };\n\n  Result.Low = SelectLane(SelectorLow, Src);\n  Result.High = SelectorLow == SelectorHigh ? Result.Low : SelectLane(SelectorHigh, Src);\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VPSHUFW(OpcodeArgs, bool Low) {\n  auto Shuffle = Op->Src[1].Literal();\n\n  struct DataPacking {\n    OpDispatchBuilder* This;\n    uint8_t Shuffle;\n    bool Low;\n  };\n\n  DataPacking Pack {\n    .This = this,\n    .Shuffle = static_cast<uint8_t>(Shuffle),\n    .Low = Low,\n  };\n\n  AVX128_VectorUnaryImpl(Op, OpSizeFromSrc(Op), OpSize::i16Bit, [Pack](IR::OpSize, Ref Src) {\n    const auto IndexedVectorConstant = Pack.Low ? FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_PSHUFLW :\n                                                  FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_PSHUFHW;\n\n    return Pack.This->PShufWLane(OpSize::i128Bit, IndexedVectorConstant, Pack.Low, Src, Pack.Shuffle);\n  });\n}\n\nvoid OpDispatchBuilder::AVX128_VSHUF(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto SrcSize = GetSrcSize(Op);\n  const auto Is128Bit = SrcSize == Core::CPUState::XMM_SSE_REG_SIZE;\n  auto Shuffle = Op->Src[2].Literal();\n\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, !Is128Bit);\n\n  RefPair Result {};\n  Result.Low = SHUFOpImpl(Op, OpSize::i128Bit, ElementSize, Src1.Low, Src2.Low, Shuffle);\n\n  if (Is128Bit) {\n    Result.High = LoadZeroVector(OpSize::i128Bit);\n  } else {\n    const uint8_t ShiftAmount = ElementSize == OpSize::i32Bit ? 0 : 2;\n    Result.High = SHUFOpImpl(Op, OpSize::i128Bit, ElementSize, Src1.High, Src2.High, Shuffle >> ShiftAmount);\n  }\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VPERMILImm(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto SrcSize = GetSrcSize(Op);\n  const auto Is128Bit = SrcSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  const auto Selector = Op->Src[1].Literal() & 0xFF;\n  auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n\n  RefPair Result = AVX128_Zext(LoadZeroVector(OpSize::i128Bit));\n\n  if (ElementSize == OpSize::i64Bit) {\n    auto DoSwizzle64 = [this](Ref Src, uint8_t Selector) -> Ref {\n      switch (Selector) {\n      case 0b00:\n      case 0b11: return _VDupElement(OpSize::i128Bit, OpSize::i64Bit, Src, Selector & 1);\n      case 0b01: return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Src, 8);\n      case 0b10:\n        // No swizzle\n        return Src;\n      default: FEX_UNREACHABLE;\n      }\n    };\n    Result.Low = DoSwizzle64(Src.Low, Selector & 0b11);\n\n    if (!Is128Bit) {\n      Result.High = DoSwizzle64(Src.High, (Selector >> 2) & 0b11);\n    }\n  } else {\n    Result.Low = Single128Bit4ByteVectorShuffle(Src.Low, Selector);\n\n    if (!Is128Bit) {\n      Result.High = Single128Bit4ByteVectorShuffle(Src.High, Selector);\n    }\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VHADDP(OpcodeArgs, IROps IROp, IR::OpSize ElementSize) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromSrc(Op), ElementSize, [&](IR::OpSize ElementSize, Ref Src1, Ref Src2) {\n    DeriveOp(Res, IROp, _VFAddP(OpSize::i128Bit, ElementSize, Src1, Src2));\n    return Res;\n  });\n}\n\nvoid OpDispatchBuilder::AVX128_VPHADDSW(OpcodeArgs) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromDst(Op), OpSize::i16Bit,\n                          [this](IR::OpSize _ElementSize, Ref Src1, Ref Src2) { return PHADDSOpImpl(OpSize::i128Bit, Src1, Src2); });\n}\n\nvoid OpDispatchBuilder::AVX128_VPMADDUBSW(OpcodeArgs) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromDst(Op), OpSize::i128Bit,\n                          [this](IR::OpSize _ElementSize, Ref Src1, Ref Src2) { return PMADDUBSWOpImpl(OpSize::i128Bit, Src1, Src2); });\n}\n\nvoid OpDispatchBuilder::AVX128_VPMADDWD(OpcodeArgs) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromDst(Op), OpSize::i128Bit,\n                          [this](IR::OpSize _ElementSize, Ref Src1, Ref Src2) { return PMADDWDOpImpl(OpSize::i128Bit, Src1, Src2); });\n}\n\nvoid OpDispatchBuilder::AVX128_VBLEND(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto Is128Bit = SrcSize == OpSize::i128Bit;\n  const uint64_t Selector = Op->Src[2].Literal();\n\n  ///< High Selector shift depends on element size:\n  /// i16Bit: Reuses same bits, no shift\n  /// i32Bit: Shift by 4\n  /// i64Bit: Shift by 2\n  const uint64_t SelectorShift = ElementSize == OpSize::i64Bit ? 2 : ElementSize == OpSize::i32Bit ? 4 : 0;\n\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, !Is128Bit);\n\n  RefPair Result {};\n  Result.Low = VectorBlend(OpSize::i128Bit, ElementSize, Src1.Low, Src2.Low, Selector);\n\n  if (Is128Bit) {\n    Result = AVX128_Zext(Result.Low);\n  } else {\n    Result.High = VectorBlend(OpSize::i128Bit, ElementSize, Src1.High, Src2.High, (Selector >> SelectorShift));\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VHSUBP(OpcodeArgs, IR::OpSize ElementSize) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromDst(Op), ElementSize,\n                          [&](IR::OpSize, Ref Src1, Ref Src2) { return HSUBPOpImpl(OpSize::i128Bit, ElementSize, Src1, Src2); });\n}\n\nvoid OpDispatchBuilder::AVX128_VPSHUFB(OpcodeArgs) {\n  auto MaskVector = GeneratePSHUFBMask(OpSize::i128Bit);\n  AVX128_VectorBinaryImpl(Op, OpSizeFromDst(Op), OpSize::i8Bit, [this, MaskVector](IR::OpSize, Ref Src1, Ref Src2) {\n    return PSHUFBOpImpl(OpSize::i128Bit, Src1, Src2, MaskVector);\n  });\n}\n\nvoid OpDispatchBuilder::AVX128_VPSADBW(OpcodeArgs) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromDst(Op), OpSize::i8Bit,\n                          [this](IR::OpSize, Ref Src1, Ref Src2) { return PSADBWOpImpl(OpSize::i128Bit, Src1, Src2); });\n}\n\nvoid OpDispatchBuilder::AVX128_VMPSADBW(OpcodeArgs) {\n  const auto SrcSize = GetSrcSize(Op);\n  const auto Is128Bit = SrcSize == Core::CPUState::XMM_SSE_REG_SIZE;\n  const uint64_t Selector = Op->Src[2].Literal();\n\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, !Is128Bit);\n\n  RefPair Result {};\n  auto ZeroRegister = LoadZeroVector(OpSize::i128Bit);\n\n  Result.Low = MPSADBWOpImpl(OpSize::i128Bit, Src1.Low, Src2.Low, Selector);\n\n  if (Is128Bit) {\n    Result.High = ZeroRegister;\n  } else {\n    Result.High = MPSADBWOpImpl(OpSize::i128Bit, Src1.High, Src2.High, Selector >> 3);\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VPALIGNR(OpcodeArgs) {\n  const auto Index = Op->Src[2].Literal();\n  const auto Size = OpSizeFromDst(Op);\n  const auto SanitizedDstSize = std::min(Size, OpSize::i128Bit);\n\n  AVX128_VectorBinaryImpl(Op, Size, SanitizedDstSize, [this, Index](IR::OpSize SanitizedDstSize, Ref Src1, Ref Src2) -> Ref {\n    if (Index >= (IR::OpSizeToSize(SanitizedDstSize) * 2)) {\n      // If the immediate is greater than both vectors combined then it zeroes the vector\n      return LoadZeroVector(OpSize::i128Bit);\n    }\n\n    if (Index == 0) {\n      return Src2;\n    }\n\n    if (Index == 16) {\n      return Src1;\n    }\n\n    auto SanitizedIndex = Index;\n    if (Index > 16) {\n      Src2 = Src1;\n      Src1 = LoadZeroVector(OpSize::i128Bit);\n      SanitizedIndex -= 16;\n    }\n\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src1, Src2, SanitizedIndex);\n  });\n}\n\nvoid OpDispatchBuilder::AVX128_VMASKMOVImpl(OpcodeArgs, IR::OpSize ElementSize, IR::OpSize DstSize, bool IsStore,\n                                            const X86Tables::DecodedOperand& MaskOp, const X86Tables::DecodedOperand& DataOp) {\n  const auto Is128Bit = DstSize == OpSize::i128Bit;\n\n  auto Mask = AVX128_LoadSource_WithOpSize(Op, MaskOp, Op->Flags, !Is128Bit);\n\n  const auto MakeAddress = [this, Op](const X86Tables::DecodedOperand& Data) {\n    return MakeSegmentAddress(Op, Data, GetGPROpSize());\n  };\n\n  if (IsStore) {\n    auto Address = MakeAddress(Op->Dest);\n\n    auto Data = AVX128_LoadSource_WithOpSize(Op, DataOp, Op->Flags, !Is128Bit);\n    _VStoreVectorMasked(OpSize::i128Bit, ElementSize, Mask.Low, Data.Low, Address, Invalid(), MemOffsetType::SXTX, 1);\n    if (!Is128Bit) {\n      _VStoreVectorMasked(OpSize::i128Bit, ElementSize, Mask.High, Data.High, Address, _InlineConstant(16), MemOffsetType::SXTX, 1);\n    }\n  } else {\n    auto Address = MakeAddress(DataOp);\n\n    RefPair Result {};\n    Result.Low = _VLoadVectorMasked(OpSize::i128Bit, ElementSize, Mask.Low, Address, Invalid(), MemOffsetType::SXTX, 1);\n\n    if (Is128Bit) {\n      Result.High = LoadZeroVector(OpSize::i128Bit);\n    } else {\n      Result.High = _VLoadVectorMasked(OpSize::i128Bit, ElementSize, Mask.High, Address, _InlineConstant(16), MemOffsetType::SXTX, 1);\n    }\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_VPMASKMOV(OpcodeArgs, bool IsStore) {\n  AVX128_VMASKMOVImpl(Op, OpSizeFromSrc(Op), OpSizeFromDst(Op), IsStore, Op->Src[0], Op->Src[1]);\n}\n\nvoid OpDispatchBuilder::AVX128_VMASKMOV(OpcodeArgs, IR::OpSize ElementSize, bool IsStore) {\n  AVX128_VMASKMOVImpl(Op, ElementSize, OpSizeFromDst(Op), IsStore, Op->Src[0], Op->Src[1]);\n}\n\nvoid OpDispatchBuilder::AVX128_MASKMOV(OpcodeArgs) {\n  ///< This instruction only supports 128-bit.\n  const auto Size = OpSizeFromSrc(Op);\n  const auto Is128Bit = Size == OpSize::i128Bit;\n\n  auto MaskSrc = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n\n  // Mask only cares about the top bit of each byte\n  MaskSrc.Low = _VCMPLTZ(Size, OpSize::i8Bit, MaskSrc.Low);\n\n  // Vector that will overwrite byte elements.\n  auto VectorSrc = AVX128_LoadSource_WithOpSize(Op, Op->Dest, Op->Flags, !Is128Bit);\n\n  // RDI source (DS prefix by default)\n  auto MemDest = MakeSegmentAddress(X86State::REG_RDI, Op->Flags, X86Tables::DecodeFlags::FLAG_DS_PREFIX);\n\n  Ref XMMReg = _LoadMemFPR(Size, MemDest, OpSize::i8Bit);\n\n  // If the Mask element high bit is set then overwrite the element with the source, else keep the memory variant\n  XMMReg = _VBSL(Size, MaskSrc.Low, VectorSrc.Low, XMMReg);\n  _StoreMemFPR(Size, MemDest, XMMReg, OpSize::i8Bit);\n}\n\nvoid OpDispatchBuilder::AVX128_VectorVariableBlend(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto Size = OpSizeFromSrc(Op);\n  const auto Is128Bit = Size == OpSize::i128Bit;\n  const auto Src3Selector = Op->Src[2].Literal();\n\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, !Is128Bit);\n\n  uint8_t MaskRegister = (Src3Selector >> 4) & 0b1111;\n  RefPair Mask {.Low = AVX128_LoadXMMRegister(MaskRegister, false)};\n\n  if (!Is128Bit) {\n    Mask.High = AVX128_LoadXMMRegister(MaskRegister, true);\n  }\n\n  auto Convert = [&](Ref Src1, Ref Src2, Ref Mask) {\n    const auto ElementSizeBits = IR::OpSizeAsBits(ElementSize);\n    Ref Shifted = _VSShrI(OpSize::i128Bit, ElementSize, Mask, ElementSizeBits - 1);\n    return _VBSL(OpSize::i128Bit, Shifted, Src2, Src1);\n  };\n\n  RefPair Result {};\n  Result.Low = Convert(Src1.Low, Src2.Low, Mask.Low);\n  if (!Is128Bit) {\n    Result.High = Convert(Src1.High, Src2.High, Mask.High);\n  } else {\n    Result = AVX128_Zext(Result.Low);\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_SaveAVXState(Ref MemBase) {\n  const auto NumRegs = Is64BitMode ? 16U : 8U;\n\n  for (uint32_t i = 0; i < NumRegs; i += 2) {\n    RefPair Pair = LoadContextPair(OpSize::i128Bit, AVXHigh0Index + i);\n    _StoreMemPairFPR(OpSize::i128Bit, Pair.Low, Pair.High, MemBase, i * 16 + 576);\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_RestoreAVXState(Ref MemBase) {\n  const auto NumRegs = Is64BitMode ? 16U : 8U;\n\n  for (uint32_t i = 0; i < NumRegs; i += 2) {\n    auto YMMHRegs = LoadMemPairFPR(OpSize::i128Bit, MemBase, i * 16 + 576);\n\n    AVX128_StoreXMMRegister(i, YMMHRegs.Low, true);\n    AVX128_StoreXMMRegister(i + 1, YMMHRegs.High, true);\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_DefaultAVXState() {\n  const auto NumRegs = Is64BitMode ? 16U : 8U;\n\n  auto ZeroRegister = LoadZeroVector(OpSize::i128Bit);\n  for (uint32_t i = 0; i < NumRegs; i++) {\n    AVX128_StoreXMMRegister(i, ZeroRegister, true);\n  }\n}\n\nvoid OpDispatchBuilder::AVX128_VPERM2(OpcodeArgs) {\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, true);\n  auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, true);\n  const auto Selector = Op->Src[2].Literal();\n\n  RefPair Result = AVX128_Zext(LoadZeroVector(OpSize::i128Bit));\n  Ref Elements[4] = {Src1.Low, Src1.High, Src2.Low, Src2.High};\n\n  if ((Selector & 0b00001000) == 0) {\n    Result.Low = Elements[Selector & 0b11];\n  }\n\n  if ((Selector & 0b10000000) == 0) {\n    Result.High = Elements[(Selector >> 4) & 0b11];\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VTESTP(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto Size = GetSrcSize(Op);\n  const auto Is128Bit = Size == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Dest, Op->Flags, !Is128Bit);\n  auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n\n  // For 128-bit, we use the common path.\n  if (Is128Bit) {\n    VTESTOpImpl(OpSize::i128Bit, ElementSize, Src1.Low, Src2.Low);\n    return;\n  }\n\n  // For 256-bit, we need to split up the operation. This is nontrivial.\n  // Let's go the simple route here.\n  Ref ZF, CFInv;\n\n  const auto ElementSizeInBits = IR::OpSizeAsBits(ElementSize);\n\n  {\n    // Calculate ZF first.\n    auto AndLow = _VAnd(OpSize::i128Bit, OpSize::i8Bit, Src2.Low, Src1.Low);\n    auto AndHigh = _VAnd(OpSize::i128Bit, OpSize::i8Bit, Src2.High, Src1.High);\n\n    auto ShiftLow = _VUShrI(OpSize::i128Bit, ElementSize, AndLow, ElementSizeInBits - 1);\n    auto ShiftHigh = _VUShrI(OpSize::i128Bit, ElementSize, AndHigh, ElementSizeInBits - 1);\n    // Only have the signs now, add it all\n    auto AddResult = _VAdd(OpSize::i128Bit, ElementSize, ShiftHigh, ShiftLow);\n    Ref AddWide {};\n    if (ElementSize == OpSize::i32Bit) {\n      AddWide = _VAddV(OpSize::i128Bit, ElementSize, AddResult);\n    } else {\n      AddWide = _VAddP(OpSize::i128Bit, ElementSize, AddResult, AddResult);\n    }\n\n    // ExtGPR will either be [0, 8] or [0, 16] If 0 then set Flag.\n    ZF = _VExtractToGPR(OpSize::i128Bit, ElementSize, AddWide, 0);\n  }\n\n  {\n    // Calculate CF Second\n    auto AndLow = _VAndn(OpSize::i128Bit, OpSize::i8Bit, Src2.Low, Src1.Low);\n    auto AndHigh = _VAndn(OpSize::i128Bit, OpSize::i8Bit, Src2.High, Src1.High);\n\n    auto ShiftLow = _VUShrI(OpSize::i128Bit, ElementSize, AndLow, ElementSizeInBits - 1);\n    auto ShiftHigh = _VUShrI(OpSize::i128Bit, ElementSize, AndHigh, ElementSizeInBits - 1);\n    // Only have the signs now, add it all\n    auto AddResult = _VAdd(OpSize::i128Bit, ElementSize, ShiftHigh, ShiftLow);\n    Ref AddWide {};\n    if (ElementSize == OpSize::i32Bit) {\n      AddWide = _VAddV(OpSize::i128Bit, ElementSize, AddResult);\n    } else {\n      AddWide = _VAddP(OpSize::i128Bit, ElementSize, AddResult, AddResult);\n    }\n\n    // ExtGPR will either be [0, 8] or [0, 16] If 0 then set Flag.\n    auto ExtGPR = _VExtractToGPR(OpSize::i128Bit, ElementSize, AddWide, 0);\n    CFInv = To01(OpSize::i64Bit, ExtGPR);\n  }\n\n  // As in PTest, this sets Z appropriately while zeroing the rest of NZCV.\n  SetNZ_ZeroCV(OpSize::i32Bit, ZF);\n  SetCFInverted(CFInv);\n  ZeroPF_AF();\n}\n\nvoid OpDispatchBuilder::AVX128_PTest(OpcodeArgs) {\n  const auto Size = GetSrcSize(Op);\n  const auto Is128Bit = Size == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Dest, Op->Flags, !Is128Bit);\n  auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n\n  // For 128-bit, use the common path.\n  if (Is128Bit) {\n    PTestOpImpl(OpSize::i128Bit, Src1.Low, Src2.Low);\n    return;\n  }\n\n  // For 256-bit, we need to unroll. This is nontrivial.\n  Ref Test1Low = _VAnd(OpSize::i128Bit, OpSize::i8Bit, Src1.Low, Src2.Low);\n  Ref Test2Low = _VAndn(OpSize::i128Bit, OpSize::i8Bit, Src2.Low, Src1.Low);\n\n  Ref Test1High = _VAnd(OpSize::i128Bit, OpSize::i8Bit, Src1.High, Src2.High);\n  Ref Test2High = _VAndn(OpSize::i128Bit, OpSize::i8Bit, Src2.High, Src1.High);\n\n  // Element size must be less than 32-bit for the sign bit tricks.\n  Ref Test1Max = _VUMax(OpSize::i128Bit, OpSize::i16Bit, Test1Low, Test1High);\n  Ref Test2Max = _VUMax(OpSize::i128Bit, OpSize::i16Bit, Test2Low, Test2High);\n\n  Ref Test1 = _VUMaxV(OpSize::i128Bit, OpSize::i16Bit, Test1Max);\n  Ref Test2 = _VUMaxV(OpSize::i128Bit, OpSize::i16Bit, Test2Max);\n\n  Test1 = _VExtractToGPR(OpSize::i128Bit, OpSize::i16Bit, Test1, 0);\n  Test2 = _VExtractToGPR(OpSize::i128Bit, OpSize::i16Bit, Test2, 0);\n\n  Test2 = To01(OpSize::i64Bit, Test2);\n\n  // Careful, these flags are different between {V,}PTEST and VTESTP{S,D}\n  // Set ZF according to Test1. SF will be zeroed since we do a 32-bit test on\n  // the results of a 16-bit value from the UMaxV, so the 32-bit sign bit is\n  // cleared even if the 16-bit scalars were negative.\n  SetNZ_ZeroCV(OpSize::i32Bit, Test1);\n  SetCFInverted(Test2);\n  ZeroPF_AF();\n}\n\nvoid OpDispatchBuilder::AVX128_VPERMILReg(OpcodeArgs, IR::OpSize ElementSize) {\n  AVX128_VectorBinaryImpl(Op, OpSizeFromSrc(Op), ElementSize, [this](IR::OpSize _ElementSize, Ref Src, Ref Indices) {\n    return VPERMILRegOpImpl(OpSize::i128Bit, _ElementSize, Src, Indices);\n  });\n}\n\nvoid OpDispatchBuilder::AVX128_VPERMD(OpcodeArgs) {\n  // Only 256-bit\n  auto Indices = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, true);\n  auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, true);\n\n  auto DoPerm = [this](RefPair Src, Ref Indices, Ref IndexMask, Ref AddVector) {\n    Ref FinalIndices = VPERMDIndices(OpSize::i128Bit, Indices, IndexMask, AddVector);\n    return _VTBL2(OpSize::i128Bit, Src.Low, Src.High, FinalIndices);\n  };\n\n  RefPair Result {};\n\n  Ref IndexMask = _VectorImm(OpSize::i128Bit, OpSize::i32Bit, 0b111);\n  Ref AddConst = Constant(0x03020100);\n  Ref Repeating3210 = _VDupFromGPR(OpSize::i128Bit, OpSize::i32Bit, AddConst);\n\n  Result.Low = DoPerm(Src, Indices.Low, IndexMask, Repeating3210);\n  Result.High = DoPerm(Src, Indices.High, IndexMask, Repeating3210);\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VPCLMULQDQ(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsPMULL_128Bit) {\n    UnimplementedOp(Op);\n    return;\n  }\n\n  const auto Selector = static_cast<uint8_t>(Op->Src[2].Literal());\n\n  AVX128_VectorBinaryImpl(Op, OpSizeFromSrc(Op), OpSize::iInvalid, [this, Selector](IR::OpSize, Ref Src1, Ref Src2) {\n    return _PCLMUL(OpSize::i128Bit, Src1, Src2, Selector & 0b1'0001);\n  });\n}\n\n// FMA differences between AArch64 and x86 make this really confusing to remember how things match.\n// Here's a little guide for remembering how these instructions related across the architectures.\n//\n///< AArch64 Vector FMA behaviour\n// FMLA vd, vn, vm\n// - vd = (vn * vm) + vd\n// FMLS vd, vn, vm\n// - vd = (-vn * vm) + vd\n//\n// SVE ONLY! No FNMLA or FNMLS variants until SVE!\n// FMLA zda, pg/m, zn, zm - Ignore predicate here\n// - zda = (zn * zm) + zda\n// FMLS zda, pg/m, zn, zm - Ignore predicate here\n// - zda = (-zn * zm) + zda\n// FNMLA zda, pg/m, zn, zm - Ignore predicate here\n// - zda = (-zn * zm) - zda\n// FNMLS zda, pg/m, zn, zm - Ignore predicate here\n// - zda = (zn * zm) - zda\n//\n///< AArch64 Scalar FMA behaviour (FMA4 versions!)\n// All variants support 16-bit, 32-bit, and 64-bit.\n// FMADD d, n, m, a\n// - d = (n * m) + a\n// FMSUB d, n, m, a\n// - d = (-n * m) + a\n// FNMADD d, n, m, a\n// - d = (-n * m) - a\n// FNMSUB d, n, m, a\n// - d = (n * m) - a\n//\n///< x86 FMA behaviour\n// ## Packed variants\n// - VFMADD{PD,PS}suffix src1, src2, src3/mem\n// - 132 - src1 = (src1 * src3) + src2\n// - 213 - src1 = (src2 * src1) + src3\n// - 231 - src1 = (src2 * src3) + src1\n//   ^ Matches ARM FMLA\n//\n// - VFMSUB{PD,PS}suffix src1, src2, src3/mem\n// - 132 - src1 = (src1 * src3) - src2\n// - 213 - src1 = (src2 * src1) - src3\n// - 231 - src1 = (src2 * src3) - src1\n//   ^ Matches ARM FMLA with addend negated first\n//   ^ Or just SVE FNMLS\n//   ^ or scalar FNMSUB\n//\n// - VFNMADD{PD,PS}suffix src1, src2, src3/mem\n// - 132 - src1 = (-src1 * src3) + src2\n// - 213 - src1 = (-src2 * src1) + src3\n// - 231 - src1 = (-src2 * src3) + src1\n//   ^ Matches ARM FMLS behaviour! (REALLY CONFUSINGLY NAMED!)\n//   ^ Or Scalar FMSUB\n//\n// - VFNMSUB{PD,PS}suffix src1, src2, src3/mem\n// - 132 - src1 = (-src1 * src3) - src2\n// - 213 - src1 = (-src2 * src1) - src3\n// - 231 - src1 = (-src2 * src3) - src1\n//   ^ Matches ARM FMLS behaviour with addend negated first! (REALLY CONFUSINGLY NAMED!)\n//   ^ Or just SVE FNMLA\n//   ^ Or scalar FNMADD\n//\n// - VFNMADDSUB{PD,PS}suffix src1, src2, src3/mem\n// - 132 - src1.odd  = (src1.odd  * src3.odd)  + src2.odd\n//       - src1.even = (src1.even * src3.even) - src2.even\n// - 213 - src1.odd  = (src2.odd  * src1.odd)  + src3.odd\n//       - src1.even = (src2.even * src1.even) - src3.even\n// - 231 - src1.odd  = (src2.odd  * src3.odd)  + src1.odd\n//       - src1.even = (src2.even * src3.even) - src1.even\n//   ^ Matches ARM FMLA behaviour with addend.even negated first!\n//\n// - VFNMSUBADD{PD,PS}suffix src1, src2, src3/mem\n// - 132 - src1.odd  = (src1.odd  * src3.odd)  - src2.odd\n//       - src1.even = (src1.even * src3.even) + src2.even\n// - 213 - src1.odd  = (src2.odd  * src1.odd)  - src3.odd\n//       - src1.even = (src2.even * src1.even) + src3.even\n// - 231 - src1.odd  = (src2.odd  * src3.odd)  - src1.odd\n//       - src1.even = (src2.even * src3.even) + src1.even\n//   ^ Matches ARM FMLA behaviour with addend.odd negated first!\n//\n// As shown only the 231 suffixed instructions matches AArch64 behaviour.\n// FEX will insert moves to transpose the vectors to match AArch64 behaviour for 132 and 213 variants.\n\nvoid OpDispatchBuilder::AVX128_VFMAImpl(OpcodeArgs, IROps IROp, uint8_t Src1Idx, uint8_t Src2Idx, uint8_t AddendIdx) {\n  const auto Size = GetDstSize(Op);\n  const auto Is128Bit = Size == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  const OpSize ElementSize = Op->Flags & X86Tables::DecodeFlags::FLAG_OPTION_AVX_W ? OpSize::i64Bit : OpSize::i32Bit;\n\n\n  auto Dest = AVX128_LoadSource_WithOpSize(Op, Op->Dest, Op->Flags, !Is128Bit);\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, !Is128Bit);\n\n  RefPair Sources[3] = {Dest, Src1, Src2};\n\n  RefPair Result {};\n  DeriveOp(Result_Low, IROp, _VFMLA(OpSize::i128Bit, ElementSize, Sources[Src1Idx - 1].Low, Sources[Src2Idx - 1].Low, Sources[AddendIdx - 1].Low));\n  Result.Low = Result_Low;\n  if (Is128Bit) {\n    Result.High = LoadZeroVector(OpSize::i128Bit);\n  } else {\n    DeriveOp(Result_High, IROp,\n             _VFMLA(OpSize::i128Bit, ElementSize, Sources[Src1Idx - 1].High, Sources[Src2Idx - 1].High, Sources[AddendIdx - 1].High));\n    Result.High = Result_High;\n  }\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VFMAScalarImpl(OpcodeArgs, IROps IROp, uint8_t Src1Idx, uint8_t Src2Idx, uint8_t AddendIdx) {\n  const OpSize ElementSize = Op->Flags & X86Tables::DecodeFlags::FLAG_OPTION_AVX_W ? OpSize::i64Bit : OpSize::i32Bit;\n\n  auto Dest = AVX128_LoadSource_WithOpSize(Op, Op->Dest, Op->Flags, false).Low;\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, false).Low;\n  Ref Src2 {};\n  if (Op->Src[1].IsGPR()) {\n    Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, false).Low;\n  } else {\n    Src2 = LoadSourceFPR_WithOpSize(Op, Op->Src[1], ElementSize, Op->Flags);\n  }\n\n  Ref Sources[3] = {Dest, Src1, Src2};\n\n  DeriveOp(Result_Low, IROp,\n           _VFMLAScalarInsert(OpSize::i128Bit, ElementSize, Dest, Sources[Src1Idx - 1], Sources[Src2Idx - 1], Sources[AddendIdx - 1]));\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, AVX128_Zext(Result_Low));\n}\n\nvoid OpDispatchBuilder::AVX128_VFMAddSubImpl(OpcodeArgs, bool AddSub, uint8_t Src1Idx, uint8_t Src2Idx, uint8_t AddendIdx) {\n  const auto Size = GetDstSize(Op);\n  const auto Is128Bit = Size == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  const OpSize ElementSize = Op->Flags & X86Tables::DecodeFlags::FLAG_OPTION_AVX_W ? OpSize::i64Bit : OpSize::i32Bit;\n\n  auto Dest = AVX128_LoadSource_WithOpSize(Op, Op->Dest, Op->Flags, !Is128Bit);\n  auto Src1 = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128Bit);\n  auto Src2 = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, !Is128Bit);\n\n  RefPair Sources[3] = {\n    Dest,\n    Src1,\n    Src2,\n  };\n\n  RefPair Result {};\n\n  Ref ConstantEOR {};\n  if (AddSub) {\n    ConstantEOR = LoadAndCacheNamedVectorConstant(\n      OpSize::i128Bit, ElementSize == OpSize::i32Bit ? NAMED_VECTOR_PADDSUBPS_INVERT : NAMED_VECTOR_PADDSUBPD_INVERT);\n  } else {\n    ConstantEOR = LoadAndCacheNamedVectorConstant(\n      OpSize::i128Bit, ElementSize == OpSize::i32Bit ? NAMED_VECTOR_PSUBADDPS_INVERT : NAMED_VECTOR_PSUBADDPD_INVERT);\n  }\n  auto InvertedSourceLow = _VXor(OpSize::i128Bit, ElementSize, Sources[AddendIdx - 1].Low, ConstantEOR);\n\n  Result.Low = _VFMLA(OpSize::i128Bit, ElementSize, Sources[Src1Idx - 1].Low, Sources[Src2Idx - 1].Low, InvertedSourceLow);\n  if (Is128Bit) {\n    Result.High = LoadZeroVector(OpSize::i128Bit);\n  } else {\n    auto InvertedSourceHigh = _VXor(OpSize::i128Bit, ElementSize, Sources[AddendIdx - 1].High, ConstantEOR);\n    Result.High = _VFMLA(OpSize::i128Bit, ElementSize, Sources[Src1Idx - 1].High, Sources[Src2Idx - 1].High, InvertedSourceHigh);\n  }\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nOpDispatchBuilder::RefPair OpDispatchBuilder::AVX128_VPGatherImpl(OpcodeArgs, OpSize Size, OpSize ElementLoadSize, OpSize AddrElementSize,\n                                                                  RefPair Dest, RefPair Mask, RefVSIB VSIB) {\n  LOGMAN_THROW_A_FMT(AddrElementSize == OpSize::i32Bit || AddrElementSize == OpSize::i64Bit, \"Unknown address element size\");\n  const auto Is128Bit = Size == OpSize::i128Bit;\n\n  ///< BaseAddr doesn't need to exist, calculate that here.\n  Ref BaseAddr = VSIB.BaseAddr;\n  if (BaseAddr && VSIB.Displacement) {\n    BaseAddr = Add(OpSize::i64Bit, BaseAddr, VSIB.Displacement);\n  } else if (VSIB.Displacement) {\n    BaseAddr = Constant(VSIB.Displacement);\n  } else if (!BaseAddr) {\n    BaseAddr = Invalid();\n  }\n\n  if (CTX->HostFeatures.SupportsSVE128) {\n    if (ElementLoadSize == OpSize::i64Bit && AddrElementSize == OpSize::i32Bit) {\n      // In the case that FEX is loading double the amount of data than the number of address bits then we can optimize this case.\n      // For 256-bits of data we need to sign extend all four 32-bit address elements to be 64-bit.\n      // For 128-bits of data we only need to sign extend the lower two 32-bit address elements.\n      LOGMAN_THROW_A_FMT(VSIB.High == Invalid(), \"Need to not have a high VSIB source\");\n\n      if (!Is128Bit) {\n        VSIB.High = _VSSHLL2(OpSize::i128Bit, OpSize::i32Bit, VSIB.Low, FEXCore::ilog2(VSIB.Scale));\n      }\n      VSIB.Low = _VSSHLL(OpSize::i128Bit, OpSize::i32Bit, VSIB.Low, FEXCore::ilog2(VSIB.Scale));\n\n      ///< Set the scale to one now that it has been prescaled as well.\n      VSIB.Scale = 1;\n\n      // Set the address element size to 64-bit now that the elements are extended.\n      AddrElementSize = OpSize::i64Bit;\n    } else if (ElementLoadSize == OpSize::i64Bit && AddrElementSize == OpSize::i64Bit && (VSIB.Scale == 2 || VSIB.Scale == 4)) {\n      // SVE gather instructions don't support scaling their vector elements by anything other than 1 or the address element size.\n      // Pre-scale 64-bit addresses in the case that scale doesn't match in-order to hit SVE code paths more frequently.\n      // Only hit this path if the host supports SVE. Otherwise it's a degradation for the ASIMD codepath.\n      VSIB.Low = _VShlI(OpSize::i128Bit, OpSize::i64Bit, VSIB.Low, FEXCore::ilog2(VSIB.Scale));\n      if (!Is128Bit) {\n        VSIB.High = _VShlI(OpSize::i128Bit, OpSize::i64Bit, VSIB.High, FEXCore::ilog2(VSIB.Scale));\n      }\n      ///< Set the scale to one now that it has been prescaled.\n      VSIB.Scale = 1;\n    }\n  }\n\n  const auto GPRSize = GetGPROpSize();\n  auto AddrSize = (Op->Flags & X86Tables::DecodeFlags::FLAG_ADDRESS_SIZE) != 0 ? (GPRSize >> 1) : GPRSize;\n\n  RefPair Result {};\n  ///< Calculate the low-half.\n  Result.Low = _VLoadVectorGatherMasked(OpSize::i128Bit, ElementLoadSize, Dest.Low, Mask.Low, BaseAddr, VSIB.Low, VSIB.High,\n                                        AddrElementSize, VSIB.Scale, 0, 0, AddrSize);\n\n  if (Is128Bit) {\n    Result.High = LoadZeroVector(OpSize::i128Bit);\n    if (AddrElementSize == OpSize::i64Bit && ElementLoadSize == OpSize::i32Bit) {\n      // Special case for the 128-bit gather load using 64-bit address indexes with 32-bit results.\n      // Only loads two 32-bit elements in to the lower 64-bits of the first destination.\n      // Bits [255:65] all become zero.\n      Result.Low = _VZip(OpSize::i128Bit, OpSize::i64Bit, Result.Low, Result.High);\n    }\n  } else {\n    RefPair AddrAddressing {};\n\n    Ref DestReg = Dest.High;\n    Ref MaskReg = Mask.High;\n    uint8_t IndexElementOffset {};\n    uint8_t DataElementOffset {};\n    if (AddrElementSize == ElementLoadSize) {\n      // If the address size matches the loading element size then it will be fetching at the same rate between low and high\n      AddrAddressing.Low = VSIB.High;\n      AddrAddressing.High = Invalid();\n    } else if (AddrElementSize == OpSize::i32Bit && ElementLoadSize == OpSize::i64Bit) {\n      // If the address element size if half the size of the Element load size then we need to start fetching half-way through the low register.\n      AddrAddressing.Low = VSIB.Low;\n      AddrAddressing.High = VSIB.High;\n      IndexElementOffset = IR::NumElements(OpSize::i128Bit, AddrElementSize) / 2;\n    } else if (AddrElementSize == OpSize::i64Bit && ElementLoadSize == OpSize::i32Bit) {\n      AddrAddressing.Low = VSIB.High;\n      AddrAddressing.High = Invalid();\n      DestReg = Result.Low; ///< Start mixing with the low register.\n      MaskReg = Mask.Low;   ///< Mask starts with the low mask here.\n      IndexElementOffset = 0;\n      DataElementOffset = IR::NumElements(OpSize::i128Bit, ElementLoadSize) / 2;\n    }\n\n    ///< Calculate the high-half.\n    auto ResultHigh = _VLoadVectorGatherMasked(OpSize::i128Bit, ElementLoadSize, DestReg, MaskReg, BaseAddr, AddrAddressing.Low,\n                                               AddrAddressing.High, AddrElementSize, VSIB.Scale, DataElementOffset, IndexElementOffset, AddrSize);\n\n    if (AddrElementSize == OpSize::i64Bit && ElementLoadSize == OpSize::i32Bit) {\n      // If we only fetched 128-bits worth of data then the upper-result is all zero.\n      Result = AVX128_Zext(ResultHigh);\n    } else {\n      Result.High = ResultHigh;\n    }\n  }\n\n  return Result;\n}\n\nOpDispatchBuilder::RefPair OpDispatchBuilder::AVX128_VPGatherQPSImpl(OpcodeArgs, Ref Dest, Ref Mask, RefVSIB VSIB) {\n\n  ///< BaseAddr doesn't need to exist, calculate that here.\n  Ref BaseAddr = VSIB.BaseAddr;\n  if (BaseAddr && VSIB.Displacement) {\n    BaseAddr = Add(OpSize::i64Bit, BaseAddr, VSIB.Displacement);\n  } else if (VSIB.Displacement) {\n    BaseAddr = Constant(VSIB.Displacement);\n  } else if (!BaseAddr) {\n    BaseAddr = Invalid();\n  }\n\n  bool NeedsSVEScale = (VSIB.Scale == 2 || VSIB.Scale == 8) || (BaseAddr == Invalid() && VSIB.Scale != 1);\n\n  if (CTX->HostFeatures.SupportsSVE128 && NeedsSVEScale) {\n    // SVE gather instructions don't support scaling their vector elements by anything other than 1 or the address element size.\n    // Pre-scale 64-bit addresses in the case that scale doesn't match in-order to hit SVE code paths more frequently.\n    // Only hit this path if the host supports SVE. Otherwise it's a degradation for the ASIMD codepath.\n    VSIB.Low = _VShlI(OpSize::i128Bit, OpSize::i64Bit, VSIB.Low, FEXCore::ilog2(VSIB.Scale));\n    if (VSIB.High != Invalid()) {\n      VSIB.High = _VShlI(OpSize::i128Bit, OpSize::i64Bit, VSIB.High, FEXCore::ilog2(VSIB.Scale));\n    }\n    ///< Set the scale to one now that it has been prescaled.\n    VSIB.Scale = 1;\n  }\n\n  RefPair Result {};\n\n  const auto GPRSize = GetGPROpSize();\n  auto AddrSize = (Op->Flags & X86Tables::DecodeFlags::FLAG_ADDRESS_SIZE) != 0 ? (GPRSize >> 1) : GPRSize;\n\n  ///< Calculate the low-half.\n  Result.Low = _VLoadVectorGatherMaskedQPS(OpSize::i128Bit, OpSize::i32Bit, Dest, Mask, BaseAddr, VSIB.Low, VSIB.High, VSIB.Scale, AddrSize);\n  Result.High = LoadZeroVector(OpSize::i128Bit);\n  if (VSIB.High == Invalid()) {\n    // Special case for only loading two floats.\n    // The upper 64-bits of the lower lane also gets zero.\n    Result.Low = _VZip(OpSize::i128Bit, OpSize::i64Bit, Result.Low, Result.High);\n  }\n\n  return Result;\n}\n\nvoid OpDispatchBuilder::AVX128_VPGATHER(OpcodeArgs, OpSize AddrElementSize) {\n\n  const auto Size = OpSizeFromDst(Op);\n  const auto Is128Bit = Size == OpSize::i128Bit;\n\n  ///< Element size is determined by W flag.\n  const OpSize ElementLoadSize = Op->Flags & X86Tables::DecodeFlags::FLAG_OPTION_AVX_W ? OpSize::i64Bit : OpSize::i32Bit;\n\n  // We only need the high address register if the number of data elements is more than what the low half can consume.\n  // But also the number of address elements is clamped by the destination size as well.\n  const size_t NumDataElements = IR::NumElements(Size, ElementLoadSize);\n  const size_t NumAddrElementBytes = std::min<size_t>(IR::OpSizeToSize(Size), (NumDataElements * IR::OpSizeToSize(AddrElementSize)));\n  const bool NeedsHighAddrBytes = NumAddrElementBytes > IR::OpSizeToSize(OpSize::i128Bit);\n\n  auto Dest = AVX128_LoadSource_WithOpSize(Op, Op->Dest, Op->Flags, !Is128Bit);\n  auto VSIB = AVX128_LoadVSIB(Op, Op->Src[0], Op->Flags, NeedsHighAddrBytes);\n  auto Mask = AVX128_LoadSource_WithOpSize(Op, Op->Src[1], Op->Flags, !Is128Bit);\n\n  bool NeedsSVEScale = (VSIB.Scale == 2 || VSIB.Scale == 8) || (VSIB.BaseAddr == Invalid() && VSIB.Scale != 1);\n\n  const bool NeedsExplicitSVEPath =\n    CTX->HostFeatures.SupportsSVE128 && AddrElementSize == OpSize::i32Bit && ElementLoadSize == OpSize::i32Bit && NeedsSVEScale;\n\n  RefPair Result {};\n  if (NeedsExplicitSVEPath) {\n    // Special case for VGATHERDPS/VPGATHERDD (32-bit addresses loading 32-bit elements) that can't use the SVE codepath.\n    // The problem is due to the scale not matching SVE limitations, we need to prescale the addresses to be 64-bit.\n    auto ScaleVSIBHalf = [this](Ref VSIB, Ref BaseAddr, int32_t Displacement, uint8_t Scale) -> RefVSIB {\n      RefVSIB Result {};\n      Result.High = _VSSHLL2(OpSize::i128Bit, OpSize::i32Bit, VSIB, FEXCore::ilog2(Scale));\n      Result.Low = _VSSHLL(OpSize::i128Bit, OpSize::i32Bit, VSIB, FEXCore::ilog2(Scale));\n\n      Result.Displacement = Displacement;\n      Result.BaseAddr = BaseAddr;\n\n      ///< Set the scale to one now that it has been prescaled as well.\n      Result.Scale = 1;\n      return Result;\n    };\n\n    RefVSIB VSIBLow = ScaleVSIBHalf(VSIB.Low, VSIB.BaseAddr, VSIB.Displacement, VSIB.Scale);\n    RefVSIB VSIBHigh {};\n\n    if (NeedsHighAddrBytes) {\n      VSIBHigh = ScaleVSIBHalf(VSIB.High, VSIB.BaseAddr, VSIB.Displacement, VSIB.Scale);\n    }\n\n    ///< AddressElementSize is now OpSize::i64Bit\n    Result = AVX128_VPGatherQPSImpl(Op, Dest.Low, Mask.Low, VSIBLow);\n    if (NeedsHighAddrBytes) {\n      auto Res = AVX128_VPGatherQPSImpl(Op, Dest.High, Mask.High, VSIBHigh);\n      Result.High = Res.Low;\n    }\n  } else if (AddrElementSize == OpSize::i64Bit && ElementLoadSize == OpSize::i32Bit) {\n    Result = AVX128_VPGatherQPSImpl(Op, Dest.Low, Mask.Low, VSIB);\n  } else {\n    Result = AVX128_VPGatherImpl(Op, Size, ElementLoadSize, AddrElementSize, Dest, Mask, VSIB);\n  }\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n\n  ///< Assume non-faulting behaviour and clear the mask register.\n  RefPair ZeroPair {};\n  ZeroPair.Low = LoadZeroVector(OpSize::i128Bit);\n  ZeroPair.High = ZeroPair.Low;\n  AVX128_StoreResult_WithOpSize(Op, Op->Src[1], ZeroPair);\n}\n\nvoid OpDispatchBuilder::AVX128_VCVTPH2PS(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto SrcSize = IR::SizeToOpSize(IR::OpSizeToSize(DstSize) / 2);\n  const auto Is128BitSrc = SrcSize == OpSize::i128Bit;\n  const auto Is128BitDst = DstSize == OpSize::i128Bit;\n\n  RefPair Src {};\n  if (Op->Src[0].IsGPR()) {\n    Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128BitSrc);\n  } else {\n    // In the event that a memory operand is used as the source operand,\n    // the access width will always be half the size of the destination vector width\n    // (i.e. 128-bit vector -> 64-bit mem, 256-bit vector -> 128-bit mem)\n    Src.Low = LoadSourceFPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags);\n  }\n\n  RefPair Result {};\n  Result.Low = _Vector_FToF(OpSize::i128Bit, OpSize::i32Bit, Src.Low, OpSize::i16Bit);\n\n  if (Is128BitSrc) {\n    Result.High = _VFCVTL2(OpSize::i128Bit, OpSize::i16Bit, Src.Low);\n  }\n\n  if (Is128BitDst) {\n    Result = AVX128_Zext(Result.Low);\n  }\n\n  AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::AVX128_VCVTPS2PH(OpcodeArgs) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto Is128BitSrc = SrcSize == OpSize::i128Bit;\n  const auto StoreSize = Op->Dest.IsGPR() ? OpSize::i128Bit : IR::SizeToOpSize(IR::OpSizeToSize(SrcSize) / 2);\n\n  const auto Imm8 = Op->Src[1].Literal();\n  const auto UseMXCSR = (Imm8 & 0b100) != 0;\n\n  auto Src = AVX128_LoadSource_WithOpSize(Op, Op->Src[0], Op->Flags, !Is128BitSrc);\n\n  RefPair Result {};\n\n  Ref OldFPCR {};\n  if (!UseMXCSR) {\n    // No ARM float conversion instructions allow passing in\n    // a rounding mode as an immediate. All of them depend on\n    // the RM field in the FPCR. And so! We have to do some ugly\n    // rounding mode shuffling.\n    const auto NewRMode = Imm8 & 0b11;\n    OldFPCR = _PushRoundingMode(NewRMode);\n  }\n\n  Result.Low = _Vector_FToF(OpSize::i128Bit, OpSize::i16Bit, Src.Low, OpSize::i32Bit);\n  if (!Is128BitSrc) {\n    Result.Low = _VFCVTN2(OpSize::i128Bit, OpSize::i32Bit, Result.Low, Src.High);\n  }\n\n  if (!UseMXCSR) {\n    _PopRoundingMode(OldFPCR);\n  }\n\n  // We need to eliminate upper junk if we're storing into a register with\n  // a 256-bit source (VCVTPS2PH's destination for registers is an XMM).\n  if (Op->Src[0].IsGPR() && SrcSize == OpSize::i256Bit) {\n    Result = AVX128_Zext(Result.Low);\n  }\n\n  if (!Op->Dest.IsGPR()) {\n    StoreResultFPR_WithOpSize(Op, Op->Dest, Result.Low, StoreSize);\n  } else {\n    AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result);\n  }\n}\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher/BaseTables.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include \"Interface/Core/OpcodeDispatcher.h\"\n\nnamespace FEXCore::IR {\nconstexpr inline DispatchTableEntry OpDispatch_BaseOpTable[] = {\n  // Instructions\n  {0x00, 6, &OpDispatchBuilder::Bind<&OpDispatchBuilder::ALUOp, FEXCore::IR::IROps::OP_ADD, FEXCore::IR::IROps::OP_ATOMICFETCHADD, 0>},\n\n  {0x08, 6, &OpDispatchBuilder::Bind<&OpDispatchBuilder::ALUOp, FEXCore::IR::IROps::OP_OR, FEXCore::IR::IROps::OP_ATOMICFETCHOR, 0>},\n\n  {0x10, 6, &OpDispatchBuilder::Bind<&OpDispatchBuilder::ADCOp, 0>},\n\n  {0x18, 6, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SBBOp, 0>},\n\n  {0x20, 6, &OpDispatchBuilder::Bind<&OpDispatchBuilder::ALUOp, FEXCore::IR::IROps::OP_ANDWITHFLAGS, FEXCore::IR::IROps::OP_ATOMICFETCHAND, 0>},\n\n  {0x28, 6, &OpDispatchBuilder::Bind<&OpDispatchBuilder::ALUOp, FEXCore::IR::IROps::OP_SUB, FEXCore::IR::IROps::OP_ATOMICFETCHSUB, 0>},\n\n  {0x30, 6, &OpDispatchBuilder::Bind<&OpDispatchBuilder::ALUOp, FEXCore::IR::IROps::OP_XOR, FEXCore::IR::IROps::OP_ATOMICFETCHXOR, 0>},\n\n  {0x38, 6, &OpDispatchBuilder::Bind<&OpDispatchBuilder::CMPOp, 0>},\n  {0x50, 8, &OpDispatchBuilder::PUSHREGOp},\n  {0x58, 8, &OpDispatchBuilder::POPOp},\n  {0x68, 1, &OpDispatchBuilder::PUSHOp},\n  {0x69, 1, &OpDispatchBuilder::IMUL2SrcOp},\n  {0x6A, 1, &OpDispatchBuilder::PUSHOp},\n  {0x6B, 1, &OpDispatchBuilder::IMUL2SrcOp},\n  {0x6C, 4, &OpDispatchBuilder::PermissionRestrictedOp},\n\n  {0x70, 16, &OpDispatchBuilder::CondJUMPOp},\n  {0x84, 2, &OpDispatchBuilder::Bind<&OpDispatchBuilder::TESTOp, 0>},\n  {0x86, 2, &OpDispatchBuilder::XCHGOp},\n  {0x88, 4, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVGPROp, 0>},\n\n  {0x8C, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVSegOp, false>},\n  {0x8D, 1, &OpDispatchBuilder::LEAOp},\n  {0x8E, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVSegOp, true>},\n  {0x8F, 1, &OpDispatchBuilder::POPOp},\n  {0x90, 8, &OpDispatchBuilder::XCHGOp},\n\n  {0x98, 1, &OpDispatchBuilder::CDQOp},\n  {0x99, 1, &OpDispatchBuilder::CQOOp},\n  {0x9B, 1, &OpDispatchBuilder::NOPOp},\n  {0x9C, 1, &OpDispatchBuilder::PUSHFOp},\n  {0x9D, 1, &OpDispatchBuilder::POPFOp},\n  {0x9E, 1, &OpDispatchBuilder::SAHFOp},\n  {0x9F, 1, &OpDispatchBuilder::LAHFOp},\n  {0xA4, 2, &OpDispatchBuilder::MOVSOp},\n\n  {0xA6, 2, &OpDispatchBuilder::CMPSOp},\n  {0xA8, 2, &OpDispatchBuilder::Bind<&OpDispatchBuilder::TESTOp, 0>},\n  {0xAA, 2, &OpDispatchBuilder::STOSOp},\n  {0xAC, 2, &OpDispatchBuilder::LODSOp},\n  {0xAE, 2, &OpDispatchBuilder::SCASOp},\n  {0xB0, 16, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVGPROp, 0>},\n  {0xC2, 2, &OpDispatchBuilder::RETOp},\n  {0xC8, 1, &OpDispatchBuilder::EnterOp},\n  {0xC9, 1, &OpDispatchBuilder::LEAVEOp},\n  {0xCA, 2, &OpDispatchBuilder::RETFARIndirectOp},\n  {0xCC, 2, &OpDispatchBuilder::INTOp},\n  {0xCF, 1, &OpDispatchBuilder::IRETOp},\n  {0xD7, 2, &OpDispatchBuilder::XLATOp},\n  {0xE0, 3, &OpDispatchBuilder::LoopOp},\n  {0xE3, 1, &OpDispatchBuilder::CondJUMPRCXOp},\n  {0xE4, 4, &OpDispatchBuilder::PermissionRestrictedOp},\n  {0xE8, 1, &OpDispatchBuilder::CALLOp},\n  {0xE9, 1, &OpDispatchBuilder::JUMPOp},\n  {0xEB, 1, &OpDispatchBuilder::JUMPOp},\n  {0xEC, 4, &OpDispatchBuilder::PermissionRestrictedOp},\n  {0xF1, 1, &OpDispatchBuilder::INTOp},\n  {0xF4, 1, &OpDispatchBuilder::INTOp},\n\n  {0xF5, 1, &OpDispatchBuilder::FLAGControlOp},\n  {0xF8, 2, &OpDispatchBuilder::FLAGControlOp},\n  {0xFA, 2, &OpDispatchBuilder::PermissionRestrictedOp},\n  {0xFC, 2, &OpDispatchBuilder::FLAGControlOp},\n};\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher/Crypto.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-to-ir, opcodes|dispatcher-implementations\ndesc: Handles x86/64 Crypto instructions to IR\n$end_info$\n*/\n\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n\n#include <FEXCore/Utils/LogManager.h>\n#include \"Interface/Core/OpcodeDispatcher.h\"\n\n#include <cstdint>\n\nnamespace FEXCore::IR {\nclass OrderedNode;\n\n#define OpcodeArgs [[maybe_unused]] FEXCore::X86Tables::DecodedOp Op\n\nvoid OpDispatchBuilder::SHA1NEXTEOp(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsSHA) {\n    UnimplementedOp(Op);\n    return;\n  }\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  // ARMv8 SHA1 extension provides a `SHA1H` instruction which does a fixed rotate by 30.\n  // This only operates on element 0 rather than element 3. We don't have the luxury of rewriting the x86 SHA algorithm to take advantage of this.\n  // Move the element to zero, rotate, and then move back (Using duplicates).\n  // Saves one instruction versus that path that doesn't support SHA extension.\n  auto Duplicated = _VDupElement(OpSize::i128Bit, OpSize::i32Bit, Dest, 3);\n  auto Sha1HRotated = _VSha1H(Duplicated);\n  auto RotatedNode = _VDupElement(OpSize::i128Bit, OpSize::i32Bit, Sha1HRotated, 0);\n  auto Tmp = _VAdd(OpSize::i128Bit, OpSize::i32Bit, Src, RotatedNode);\n  auto Result = _VInsElement(OpSize::i128Bit, OpSize::i32Bit, 3, 3, Src, Tmp);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::SHA1MSG1Op(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsSHA) {\n    UnimplementedOp(Op);\n    return;\n  }\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  Ref NewVec = _VExtr(OpSize::i128Bit, OpSize::i64Bit, Dest, Src, 1);\n\n  // [W0, W1, W2, W3] ^ [W2, W3, W4, W5]\n  Ref Result = _VXor(OpSize::i128Bit, OpSize::i8Bit, Dest, NewVec);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::SHA1MSG2Op(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsSHA) {\n    UnimplementedOp(Op);\n    return;\n  }\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  // ARM SHA1 mostly matches x86 semantics, except the input and outputs are both flipped from elements 0,1,2,3 to 3,2,1,0.\n  auto Src1 = SHADataShuffle(Dest);\n  auto Src2 = SHADataShuffle(Src);\n\n  // The result is swizzled differently than expected\n  auto Result = SHADataShuffle(_VSha1SU1(Src1, Src2));\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::SHA1RNDS4Op(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsSHA) {\n    UnimplementedOp(Op);\n    return;\n  }\n  const uint64_t Imm8 = Op->Src[1].Literal() & 0b11;\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  Ref Result {};\n  Ref ConstantVector {};\n  switch (Imm8) {\n  case 0:\n    ConstantVector = LoadAndCacheNamedVectorConstant(OpSize::i128Bit, FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_SHA1RNDS_K0);\n    break;\n  case 1:\n    ConstantVector = LoadAndCacheNamedVectorConstant(OpSize::i128Bit, FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_SHA1RNDS_K1);\n    break;\n  case 2:\n    ConstantVector = LoadAndCacheNamedVectorConstant(OpSize::i128Bit, FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_SHA1RNDS_K2);\n    break;\n  case 3:\n    ConstantVector = LoadAndCacheNamedVectorConstant(OpSize::i128Bit, FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_SHA1RNDS_K3);\n    break;\n  }\n\n  const auto ZeroRegister = LoadZeroVector(OpSize::i32Bit);\n\n  Ref Src1 = SHADataShuffle(Dest);\n  Ref Src2 = SHADataShuffle(Src);\n  Src2 = _VAdd(OpSize::i128Bit, OpSize::i32Bit, Src2, ConstantVector);\n\n  switch (Imm8) {\n  case 0: Result = SHADataShuffle(_VSha1C(Src1, ZeroRegister, Src2)); break;\n  case 2: Result = SHADataShuffle(_VSha1M(Src1, ZeroRegister, Src2)); break;\n  case 1:\n  case 3: Result = SHADataShuffle(_VSha1P(Src1, ZeroRegister, Src2)); break;\n  }\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::SHA256MSG1Op(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsSHA) {\n    UnimplementedOp(Op);\n    return;\n  }\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  auto Result = _VSha256U0(Dest, Src);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::SHA256MSG2Op(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsSHA) {\n    UnimplementedOp(Op);\n    return;\n  }\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  auto Src1 = _VExtr(OpSize::i128Bit, OpSize::i32Bit, Dest, Dest, 3);\n  auto DupDst = _VDupElement(OpSize::i128Bit, OpSize::i32Bit, Dest, 3);\n  auto Src2 = _VZip2(OpSize::i128Bit, OpSize::i64Bit, DupDst, Src);\n\n  auto Result = _VSha256U1(Src1, Src2);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::SHA256RNDS2Op(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsSHA) {\n    UnimplementedOp(Op);\n    return;\n  }\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  // Hardcoded to XMM0\n  auto XMM0 = LoadXMMRegister(0);\n\n  auto shuffle_abcd = [this](Ref Src1, Ref Src2) -> Ref {\n    // Generates a suitable SHA256 `abcd` configuration from x86 format.\n    auto Tmp = _VZip2(OpSize::i128Bit, OpSize::i64Bit, Src2, Src1);\n    return _VRev64(OpSize::i128Bit, OpSize::i32Bit, Tmp);\n  };\n\n  auto shuffle_efgh = [this](Ref Src1, Ref Src2) -> Ref {\n    // Generates a suitable SHA256 `efgh` configuration from x86 format.\n    auto Tmp = _VZip(OpSize::i128Bit, OpSize::i64Bit, Src2, Src1);\n    return _VRev64(OpSize::i128Bit, OpSize::i32Bit, Tmp);\n  };\n\n  auto ABCD = shuffle_abcd(Dest, Src);\n  auto EFGH = shuffle_efgh(Dest, Src);\n\n  // x86 uses only the bottom 64-bits of the key, so duplicate to match ARM64 semantics.\n  auto Key = _VDupElement(OpSize::i128Bit, OpSize::i64Bit, XMM0, 0);\n\n  auto A = _VSha256H(ABCD, EFGH, Key);\n  auto B = _VSha256H2(EFGH, ABCD, Key);\n  auto Result = shuffle_abcd(A, B);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::AESImcOp(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsAES) {\n    UnimplementedOp(Op);\n    return;\n  }\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = _VAESImc(Src);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::AESEncOp(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsAES) {\n    UnimplementedOp(Op);\n    return;\n  }\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = _VAESEnc(OpSize::i128Bit, Dest, Src, LoadZeroVector(OpSize::i128Bit));\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VAESEncOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto Is128Bit = DstSize == OpSize::i128Bit;\n\n  // TODO: Handle 256-bit VAESENC.\n  LOGMAN_THROW_A_FMT(Is128Bit, \"256-bit VAESENC unimplemented\");\n\n  Ref State = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Key = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Result = _VAESEnc(DstSize, State, Key, LoadZeroVector(DstSize));\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::AESEncLastOp(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsAES) {\n    UnimplementedOp(Op);\n    return;\n  }\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = _VAESEncLast(OpSize::i128Bit, Dest, Src, LoadZeroVector(OpSize::i128Bit));\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VAESEncLastOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto Is128Bit = DstSize == OpSize::i128Bit;\n\n  // TODO: Handle 256-bit VAESENCLAST.\n  LOGMAN_THROW_A_FMT(Is128Bit, \"256-bit VAESENCLAST unimplemented\");\n\n  Ref State = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Key = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Result = _VAESEncLast(DstSize, State, Key, LoadZeroVector(DstSize));\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::AESDecOp(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsAES) {\n    UnimplementedOp(Op);\n    return;\n  }\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = _VAESDec(OpSize::i128Bit, Dest, Src, LoadZeroVector(OpSize::i128Bit));\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VAESDecOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto Is128Bit = DstSize == OpSize::i128Bit;\n\n  // TODO: Handle 256-bit VAESDEC.\n  LOGMAN_THROW_A_FMT(Is128Bit, \"256-bit VAESDEC unimplemented\");\n\n  Ref State = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Key = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Result = _VAESDec(DstSize, State, Key, LoadZeroVector(DstSize));\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::AESDecLastOp(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsAES) {\n    UnimplementedOp(Op);\n    return;\n  }\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = _VAESDecLast(OpSize::i128Bit, Dest, Src, LoadZeroVector(OpSize::i128Bit));\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VAESDecLastOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto Is128Bit = DstSize == OpSize::i128Bit;\n\n  // TODO: Handle 256-bit VAESDECLAST.\n  LOGMAN_THROW_A_FMT(Is128Bit, \"256-bit VAESDECLAST unimplemented\");\n\n  Ref State = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Key = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Result = _VAESDecLast(DstSize, State, Key, LoadZeroVector(DstSize));\n\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::AESKeyGenAssistImpl(OpcodeArgs) {\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  const uint64_t RCON = Op->Src[1].Literal();\n\n  auto KeyGenSwizzle = LoadAndCacheNamedVectorConstant(OpSize::i128Bit, NAMED_VECTOR_AESKEYGENASSIST_SWIZZLE);\n  return _VAESKeyGenAssist(Src, KeyGenSwizzle, LoadZeroVector(OpSize::i128Bit), RCON);\n}\n\nvoid OpDispatchBuilder::AESKeyGenAssist(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsAES) {\n    UnimplementedOp(Op);\n    return;\n  }\n\n  Ref Result = AESKeyGenAssistImpl(Op);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::PCLMULQDQOp(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsPMULL_128Bit) {\n    UnimplementedOp(Op);\n    return;\n  }\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  const auto Selector = static_cast<uint8_t>(Op->Src[1].Literal());\n\n  auto Res = _PCLMUL(OpSize::i128Bit, Dest, Src, Selector & 0b1'0001);\n  StoreResultFPR(Op, Res);\n}\n\nvoid OpDispatchBuilder::VPCLMULQDQOp(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsPMULL_128Bit) {\n    UnimplementedOp(Op);\n    return;\n  }\n  const auto DstSize = OpSizeFromDst(Op);\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  const auto Selector = static_cast<uint8_t>(Op->Src[2].Literal());\n\n  Ref Res = _PCLMUL(DstSize, Src1, Src2, Selector & 0b1'0001);\n  StoreResultFPR(Op, Res);\n}\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher/DDDTables.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include \"Interface/Core/OpcodeDispatcher.h\"\n\nnamespace FEXCore::IR {\nconstexpr DispatchTableEntry OpDispatch_DDDTable[] = {\n  {0x0C, 1, &OpDispatchBuilder::PI2FWOp},\n  {0x0D, 1, &OpDispatchBuilder::Vector_CVT_Int_To_Float<OpSize::i32Bit, false>},\n  {0x1C, 1, &OpDispatchBuilder::PF2IWOp},\n  {0x1D, 1, &OpDispatchBuilder::Vector_CVT_Float_To_Int<OpSize::i32Bit, false>},\n\n  {0x86, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorUnaryOp, IR::OP_VFRECPPRECISION, OpSize::i32Bit>},\n  {0x87, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::RSqrt3DNowOp, false>},\n\n  {0x8A, 1, &OpDispatchBuilder::PFNACCOp},\n  {0x8E, 1, &OpDispatchBuilder::PFPNACCOp},\n\n  {0x90, 1, &OpDispatchBuilder::VPFCMPOp<1>},\n  {0x94, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFMIN, OpSize::i32Bit>},\n  {0x96, 1, &OpDispatchBuilder::VectorUnaryDuplicateOp<IR::OP_VFRECPPRECISION, OpSize::i32Bit>},\n  {0x97, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::RSqrt3DNowOp, true>},\n\n  {0x9A, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFSUB, OpSize::i32Bit>},\n  {0x9E, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFADD, OpSize::i32Bit>},\n\n  {0xA0, 1, &OpDispatchBuilder::VPFCMPOp<2>},\n  {0xA4, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFMAX, OpSize::i32Bit>},\n  // Can be treated as a move\n  {0xA6, 1, &OpDispatchBuilder::MOVVectorUnalignedOp},\n  {0xA7, 1, &OpDispatchBuilder::MOVVectorUnalignedOp},\n\n  {0xAA, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUROp, IR::OP_VFSUB, OpSize::i32Bit>},\n  {0xAE, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFADDP, OpSize::i32Bit>},\n\n  {0xB0, 1, &OpDispatchBuilder::VPFCMPOp<0>},\n  {0xB4, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFMUL, OpSize::i32Bit>},\n  // Can be treated as a move\n  {0xB6, 1, &OpDispatchBuilder::MOVVectorUnalignedOp},\n  {0xB7, 1, &OpDispatchBuilder::PMULHRWOp},\n\n  {0xBB, 1, &OpDispatchBuilder::PSWAPDOp},\n  {0xBF, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VURAVG, OpSize::i8Bit>},\n};\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-to-ir, opcodes|dispatcher-implementations\ndesc: Handles x86/64 flag generation\n$end_info$\n*/\n\n#include \"Interface/Core/OpcodeDispatcher.h\"\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Utils/LogManager.h>\n\n#include <array>\n#include <cstdint>\n\nnamespace FEXCore::IR {\nconstexpr std::array<uint32_t, 17> FlagOffsets = {\n  FEXCore::X86State::RFLAG_CF_RAW_LOC, FEXCore::X86State::RFLAG_PF_RAW_LOC, FEXCore::X86State::RFLAG_AF_RAW_LOC,\n  FEXCore::X86State::RFLAG_ZF_RAW_LOC, FEXCore::X86State::RFLAG_SF_RAW_LOC, FEXCore::X86State::RFLAG_TF_RAW_LOC,\n  FEXCore::X86State::RFLAG_IF_LOC,     FEXCore::X86State::RFLAG_DF_RAW_LOC, FEXCore::X86State::RFLAG_OF_RAW_LOC,\n  FEXCore::X86State::RFLAG_IOPL_LOC,   FEXCore::X86State::RFLAG_NT_LOC,     FEXCore::X86State::RFLAG_RF_LOC,\n  FEXCore::X86State::RFLAG_VM_LOC,     FEXCore::X86State::RFLAG_AC_LOC,     FEXCore::X86State::RFLAG_VIF_LOC,\n  FEXCore::X86State::RFLAG_VIP_LOC,    FEXCore::X86State::RFLAG_ID_LOC,\n};\n\nvoid OpDispatchBuilder::ZeroPF_AF() {\n  // PF is stored inverted, so invert it when we zero.\n  SetRFLAG<FEXCore::X86State::RFLAG_PF_RAW_LOC>(Constant(1));\n  SetAF(0);\n}\n\nvoid OpDispatchBuilder::SetPackedRFLAG(bool Lower8, Ref Src) {\n  size_t NumFlags = FlagOffsets.size();\n  if (Lower8) {\n    // Calculate flags early.\n    // This is only a partial overwrite of flags since OF isn't stored here.\n    CalculateDeferredFlags();\n    NumFlags = 5;\n  }\n\n  // PF and CF are both stored inverted, so hoist the invert.\n  auto SrcInverted = _Not(OpSize::i32Bit, Src);\n\n  for (size_t i = 0; i < NumFlags; ++i) {\n    const auto FlagOffset = FlagOffsets[i];\n\n    if (FlagOffset == FEXCore::X86State::RFLAG_AF_RAW_LOC) {\n      // AF is in bit 4 architecturally, and we need to store it to bit 4 of our\n      // AF register, with garbage in the other bits. The extract is deferred.\n      // We also defer a XOR with the result bit, which is implemented as XOR\n      // with PF[4]. But the _Bfe below reliably zeros bit 4 of the PF byte, so\n      // that will be a no-op and we get the right result.\n      //\n      // So we write out the whole flags byte to AF without an extract.\n      static_assert(FEXCore::X86State::RFLAG_AF_RAW_LOC == 4);\n      SetRFLAG(Src, FEXCore::X86State::RFLAG_AF_RAW_LOC);\n    } else if (FlagOffset == FEXCore::X86State::RFLAG_PF_RAW_LOC || FlagOffset == FEXCore::X86State::RFLAG_CF_RAW_LOC) {\n      // PF and CF are both stored parity flipped.\n      SetRFLAG(SrcInverted, FlagOffset, FlagOffset, true);\n    } else {\n      SetRFLAG(Src, FlagOffset, FlagOffset, true);\n    }\n  }\n\n  CFInverted = true;\n}\n\nRef OpDispatchBuilder::GetPackedRFLAG(uint32_t FlagsMask) {\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  // SF/ZF and N/Z are together on both arm64 and x86_64, so we special case that.\n  bool GetNZ = (FlagsMask & (1 << FEXCore::X86State::RFLAG_SF_RAW_LOC)) && (FlagsMask & (1 << FEXCore::X86State::RFLAG_ZF_RAW_LOC));\n\n  // Handle CF first, since it's at bit 0 and hence doesn't need shift or OR.\n  LOGMAN_THROW_A_FMT(FlagsMask & (1 << FEXCore::X86State::RFLAG_CF_RAW_LOC), \"CF always handled\");\n  static_assert(FEXCore::X86State::RFLAG_CF_RAW_LOC == 0);\n  Ref Original = GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC);\n\n  for (size_t i = 0; i < FlagOffsets.size(); ++i) {\n    const auto FlagOffset = FlagOffsets[i];\n    if (!((1U << FlagOffset) & FlagsMask)) {\n      continue;\n    }\n\n    if ((GetNZ && (FlagOffset == FEXCore::X86State::RFLAG_SF_RAW_LOC || FlagOffset == FEXCore::X86State::RFLAG_ZF_RAW_LOC)) ||\n        FlagOffset == FEXCore::X86State::RFLAG_CF_RAW_LOC || FlagOffset == FEXCore::X86State::RFLAG_PF_RAW_LOC) {\n      // Already handled\n      continue;\n    }\n\n    // Note that the Bfi only considers the bottom bit of the flag, the rest of\n    // the byte is allowed to be garbage.\n    Ref Flag;\n    if (FlagOffset == FEXCore::X86State::RFLAG_AF_RAW_LOC) {\n      Flag = LoadAF();\n    } else {\n      Flag = GetRFLAG(FlagOffset);\n    }\n\n    Original = _Orlshl(OpSize::i64Bit, Original, Flag, FlagOffset);\n  }\n\n  // Raw PF value needs to have its bottom bit masked out and inverted. The\n  // naive sequence is and/eor/orlshl. But we can do the inversion implicitly\n  // instead.\n  if (FlagsMask & (1 << FEXCore::X86State::RFLAG_PF_RAW_LOC)) {\n    // Set every bit except the bottommost.\n    auto OnesInvPF = _Or(OpSize::i64Bit, LoadPFRaw(false, false), _InlineConstant(~1ull));\n\n    // Rotate the bottom bit to the appropriate location for PF, so we get\n    // something like 111P1111. Then invert that to get 000p0000. Then OR that\n    // into the flags. This is 1 A64 instruction :-)\n    auto RightRotation = 64 - FEXCore::X86State::RFLAG_PF_RAW_LOC;\n    Original = _Ornror(OpSize::i64Bit, Original, OnesInvPF, RightRotation);\n  }\n\n  // OR in the SF/ZF flags at the end, allowing the lshr to fold with the OR\n  if (GetNZ) {\n    static_assert(FEXCore::X86State::RFLAG_SF_RAW_LOC == (FEXCore::X86State::RFLAG_ZF_RAW_LOC + 1));\n    auto NZCV = GetNZCV();\n    auto NZ = _And(OpSize::i64Bit, NZCV, _InlineConstant(0b11u << 30));\n    Original = _Orlshr(OpSize::i64Bit, Original, NZ, 31 - FEXCore::X86State::RFLAG_SF_RAW_LOC);\n  }\n\n  // The constant is OR'ed in at the end, to avoid a pointless or xzr, #2.\n  if ((1U << X86State::RFLAG_RESERVED_LOC) & FlagsMask) {\n    Original = _Or(OpSize::i64Bit, Original, _InlineConstant(2));\n  }\n\n  return Original;\n}\n\nvoid OpDispatchBuilder::CalculateOF(IR::OpSize SrcSize, Ref Res, Ref Src1, Ref Src2, bool Sub) {\n  LOGMAN_THROW_A_FMT(SrcSize >= IR::OpSize::i8Bit && SrcSize <= IR::OpSize::i64Bit, \"Invalid size\");\n  const auto OpSize = SrcSize == OpSize::i64Bit ? OpSize::i64Bit : OpSize::i32Bit;\n  const uint64_t SignBit = IR::OpSizeAsBits(SrcSize) - 1;\n  Ref Anded = nullptr;\n\n  // For add, OF is set iff the sources have the same sign but the destination\n  // sign differs. If we know a source sign, we can simplify the expression: if\n  // source 2 is known to be positive, we set OF if source 1 is positive and\n  // source 2 is negative. Similarly if source 2 is known negative.\n  //\n  // For sub, OF is set iff the sources have differing signs and the destination\n  // sign matches the second source. If source 2 is known positive, set iff\n  // source 1 negative and source 2 positive.\n  uint64_t Const;\n  if (IsValueConstant(WrapNode(Src2), &Const)) {\n    bool Negative = (Const & (1ull << SignBit)) != 0;\n\n    if (Negative ^ Sub) {\n      Anded = _Andn(OpSize, Src1, Res);\n    } else {\n      Anded = _Andn(OpSize, Res, Src1);\n    }\n  } else {\n    auto XorOp1 = _Xor(OpSize, Src1, Src2);\n    auto XorOp2 = _Xor(OpSize, Res, Src1);\n\n    if (Sub) {\n      Anded = _And(OpSize, XorOp2, XorOp1);\n    } else {\n      Anded = _Andn(OpSize, XorOp2, XorOp1);\n    }\n  }\n\n  SetRFLAG<FEXCore::X86State::RFLAG_OF_RAW_LOC>(Anded, SignBit, true);\n}\n\nRef OpDispatchBuilder::LoadPFRaw(bool Mask, bool Invert) {\n  // Most blocks do not read parity, so PF optimization is gated on this flag.\n  CurrentHeader->ReadsParity = true;\n\n  // Evaluate parity on the deferred raw value.\n  return _Parity(GetRFLAG(FEXCore::X86State::RFLAG_PF_RAW_LOC), Mask, Invert);\n}\n\nRef OpDispatchBuilder::LoadAF() {\n  // Read the stored value. This is the XOR of the arguments.\n  auto AFWord = GetRFLAG(FEXCore::X86State::RFLAG_AF_RAW_LOC);\n\n  // Read the result, stored for PF.\n  auto Result = GetRFLAG(FEXCore::X86State::RFLAG_PF_RAW_LOC);\n\n  // What's left is to XOR and extract. This is the deferred part. We\n  // specifically use a 64-bit Xor here as we don't need masking.\n  return _Bfe(OpSize::i32Bit, 1, 4, _Xor(OpSize::i64Bit, AFWord, Result));\n}\n\nvoid OpDispatchBuilder::FixupAF() {\n  // The caller has set a desired value of AF in AF[4], regardless of the value\n  // of PF. We need to fixup AF[4] so that we get the right value when we XOR in\n  // PF[4] later. The easiest solution is to XOR by PF[4], since:\n  //\n  //  (AF[4] ^ PF[4]) ^ PF[4] = AF[4]\n\n  auto PFRaw = GetRFLAG(FEXCore::X86State::RFLAG_PF_RAW_LOC);\n  auto AFRaw = GetRFLAG(FEXCore::X86State::RFLAG_AF_RAW_LOC);\n\n  // Again 64-bit as masking is more expensive.\n  Ref XorRes = _Xor(OpSize::i64Bit, AFRaw, PFRaw);\n  SetRFLAG<FEXCore::X86State::RFLAG_AF_RAW_LOC>(XorRes);\n}\n\nvoid OpDispatchBuilder::SetAFAndFixup(Ref AF) {\n  // We have a value of AF, we shift into AF[4].  We need to fixup AF[4] so that\n  // we get the right value when we XOR in PF[4] later. The easiest solution is\n  // to XOR by PF[4], since:\n  //\n  //  (AF[4] ^ PF[4]) ^ PF[4] = AF[4]\n\n  auto PFRaw = GetRFLAG(FEXCore::X86State::RFLAG_PF_RAW_LOC);\n\n  Ref XorRes = _XorShift(OpSize::i32Bit, PFRaw, AF, ShiftType::LSL, 4);\n  SetRFLAG<FEXCore::X86State::RFLAG_AF_RAW_LOC>(XorRes);\n}\n\nvoid OpDispatchBuilder::CalculatePF(Ref Res) {\n  // Calculation is entirely deferred until load, just store the 8-bit result.\n  SetRFLAG<FEXCore::X86State::RFLAG_PF_RAW_LOC>(Res);\n}\n\nvoid OpDispatchBuilder::CalculateAF(Ref Src1, Ref Src2) {\n  // We only care about bit 4 in the subsequent XOR. If we'll XOR with 0,\n  // there's no sense XOR'ing at all. If we'll XOR with 1, that's just\n  // inverting.\n  for (unsigned i = 0; i < 2; ++i) {\n    Ref SrcA = i ? Src1 : Src2;\n    Ref SrcB = i ? Src2 : Src1;\n\n    uint64_t Const;\n    if (IsValueConstant(WrapNode(SrcA), &Const)) {\n      if (Const & (1u << 4)) {\n        SetRFLAG<FEXCore::X86State::RFLAG_AF_RAW_LOC>(_Not(OpSize::i32Bit, SrcB));\n      } else {\n        SetRFLAG<FEXCore::X86State::RFLAG_AF_RAW_LOC>(SrcB);\n      }\n\n      return;\n    }\n  }\n\n  // We store the XOR of the arguments. At read time, we XOR with the\n  // appropriate bit of the result (available as the PF flag) and extract the\n  // appropriate bit. Again 64-bit to avoid masking.\n  Ref XorRes = Src1 == Src2 ? Constant(0) : _Xor(OpSize::i64Bit, Src1, Src2);\n  SetRFLAG<FEXCore::X86State::RFLAG_AF_RAW_LOC>(XorRes);\n}\n\nvoid OpDispatchBuilder::CalculateDeferredFlags() {\n  if (NZCVDirty && CachedNZCV) {\n    _StoreNZCV(CachedNZCV);\n  }\n\n  CachedNZCV = nullptr;\n  NZCVDirty = false;\n}\n\nRef OpDispatchBuilder::IncrementByCarry(OpSize OpSize, Ref Src) {\n  // If CF not inverted, we use .cc since the increment happens when the\n  // condition is false. If CF inverted, invert to use .cs. A bit mindbendy.\n  return _NZCVSelectIncrement(OpSize, CFInverted ? CondClass::UGE : CondClass::ULT, Src, Src);\n}\n\nRef OpDispatchBuilder::CalculateFlags_ADC(IR::OpSize SrcSize, Ref Src1, Ref Src2) {\n  auto OpSize = SrcSize == OpSize::i64Bit ? OpSize::i64Bit : OpSize::i32Bit;\n  Ref Res;\n\n  CalculateAF(Src1, Src2);\n\n  if (SrcSize >= OpSize::i32Bit) {\n    RectifyCarryInvert(false);\n    HandleNZCV_RMW();\n    Res = _AdcWithFlags(OpSize, Src1, Src2);\n    CFInverted = false;\n  } else {\n    // Need to zero-extend for correct comparisons below\n    Src2 = ARef(Src2).Bfe(0, IR::OpSizeAsBits(SrcSize)).Ref();\n\n    // Note that we do not extend Src2PlusCF, since we depend on proper\n    // 32-bit arithmetic to correctly handle the Src2 = 0xffff case.\n    Ref Src2PlusCF = IncrementByCarry(OpSize, Src2);\n\n    // Need to zero-extend for the comparison.\n    Res = Add(OpSize, Src1, Src2PlusCF);\n    Res = _Bfe(OpSize, IR::OpSizeAsBits(SrcSize), 0, Res);\n\n    // TODO: We can fold that second Bfe in (cmp uxth).\n    auto SelectCFInv = Select01(OpSize, CondClass::UGE, Res, Src2PlusCF);\n\n    SetNZ_ZeroCV(SrcSize, Res);\n    SetCFInverted(SelectCFInv);\n    CalculateOF(SrcSize, Res, Src1, Src2, false);\n  }\n\n  CalculatePF(Res);\n  return Res;\n}\n\nRef OpDispatchBuilder::CalculateFlags_SBB(IR::OpSize SrcSize, Ref Src1, Ref Src2) {\n  auto OpSize = SrcSize == OpSize::i64Bit ? OpSize::i64Bit : OpSize::i32Bit;\n\n  CalculateAF(Src1, Src2);\n\n  Ref Res;\n  if (SrcSize >= OpSize::i32Bit) {\n    // Arm's subtraction has inverted CF from x86, so rectify the input and\n    // invert the output.\n    RectifyCarryInvert(true);\n    HandleNZCV_RMW();\n    Res = _SbbWithFlags(OpSize, Src1, Src2);\n    CFInverted = true;\n  } else {\n    // Zero extend for correct comparison behaviour with Src1 = 0xffff.\n    Src1 = _Bfe(OpSize, IR::OpSizeAsBits(SrcSize), 0, Src1);\n    Src2 = ARef(Src2).Bfe(0, IR::OpSizeAsBits(SrcSize)).Ref();\n\n    auto Src2PlusCF = IncrementByCarry(OpSize, Src2);\n\n    Res = Sub(OpSize, Src1, Src2PlusCF);\n    Res = _Bfe(OpSize, IR::OpSizeAsBits(SrcSize), 0, Res);\n\n    auto SelectCFInv = Select01(OpSize, CondClass::UGE, Src1, Src2PlusCF);\n\n    SetNZ_ZeroCV(SrcSize, Res);\n    SetCFInverted(SelectCFInv);\n    CalculateOF(SrcSize, Res, Src1, Src2, true);\n  }\n\n  CalculatePF(Res);\n  return Res;\n}\n\nRef OpDispatchBuilder::CalculateFlags_SUB(IR::OpSize SrcSize, Ref Src1, Ref Src2, bool UpdateCF) {\n  // Stash CF before stomping over it\n  auto OldCFInv = UpdateCF ? nullptr : GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC, true);\n\n  HandleNZCVWrite();\n\n  CalculateAF(Src1, Src2);\n\n  Ref Res;\n  if (SrcSize >= OpSize::i32Bit) {\n    Res = SubWithFlags(SrcSize, Src1, Src2);\n  } else {\n    _SubNZCV(SrcSize, Src1, Src2);\n    Res = Sub(OpSize::i32Bit, Src1, Src2);\n  }\n\n  CalculatePF(Res);\n\n  // If we're updating CF, we need it to be inverted because SubNZCV is inverted\n  // from x86. If we're not updating CF, we need to restore the CF since we\n  // stomped over it.\n  if (UpdateCF) {\n    CFInverted = true;\n  } else {\n    SetCFInverted(OldCFInv);\n  }\n\n  return Res;\n}\n\nRef OpDispatchBuilder::CalculateFlags_ADD(IR::OpSize SrcSize, Ref Src1, Ref Src2, bool UpdateCF) {\n  // Stash CF before stomping over it\n  auto OldCFInv = UpdateCF ? nullptr : GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC, true);\n\n  HandleNZCVWrite();\n\n  CalculateAF(Src1, Src2);\n\n  Ref Res;\n  if (SrcSize >= OpSize::i32Bit) {\n    Res = AddWithFlags(SrcSize, Src1, Src2);\n  } else {\n    _AddNZCV(SrcSize, Src1, Src2);\n    Res = Add(OpSize::i32Bit, Src1, Src2);\n  }\n\n  CalculatePF(Res);\n\n  // We stomped over CF while calculation flags, restore it.\n  if (UpdateCF) {\n    // Adds match between x86 and arm64.\n    CFInverted = false;\n  } else {\n    SetCFInverted(OldCFInv);\n  }\n\n  return Res;\n}\n\nvoid OpDispatchBuilder::CalculateFlags_MUL(IR::OpSize SrcSize, Ref Res, Ref High) {\n  HandleNZCVWrite();\n  InvalidatePF_AF();\n\n  // CF and OF are set if the result of the operation can't be fit in to the destination register\n  // If the value can fit then the top bits will be zero\n  auto SignBit = _Sbfe(OpSize::i64Bit, 1, IR::OpSizeAsBits(SrcSize) - 1, Res);\n  _SubNZCV(OpSize::i64Bit, High, SignBit);\n\n  // If High = SignBit, then sets to nZCv. Else sets to nzcV. Since SF/ZF\n  // undefined, this does what we need after inverting carry.\n  auto Zero = _InlineConstant(0);\n  _CondSubNZCV(OpSize::i64Bit, Zero, Zero, CondClass::EQ, 0x1 /* nzcV */);\n  CFInverted = true;\n}\n\nvoid OpDispatchBuilder::CalculateFlags_UMUL(Ref High) {\n  HandleNZCVWrite();\n  InvalidatePF_AF();\n\n  auto Zero = _InlineConstant(0);\n  const auto Size = GetOpSize(High);\n\n  // CF and OF are set if the result of the operation can't be fit in to the destination register\n  // The result register will be all zero if it can't fit due to how multiplication behaves\n  _SubNZCV(Size, High, Zero);\n\n  // If High = 0, then sets to nZCv. Else sets to nzcV. Since SF/ZF undefined,\n  // this does what we need.\n  _CondSubNZCV(Size, Zero, Zero, CondClass::EQ, 0x1 /* nzcV */);\n  CFInverted = true;\n}\n\nvoid OpDispatchBuilder::CalculateFlags_Logical(IR::OpSize SrcSize, Ref Res) {\n  InvalidateAF();\n  SetNZP_ZeroCV(SrcSize, Res);\n}\n\nvoid OpDispatchBuilder::CalculateFlags_ShiftLeftImmediate(IR::OpSize SrcSize, Ref UnmaskedRes, Ref Src1, uint64_t Shift) {\n  // No flags changed if shift is zero\n  if (Shift == 0) {\n    return;\n  }\n\n  auto OpSize = SrcSize == OpSize::i64Bit ? OpSize::i64Bit : OpSize::i32Bit;\n\n  SetNZ_ZeroCV(SrcSize, UnmaskedRes);\n\n  // CF\n  {\n    // Extract the last bit shifted in to CF. Shift is already masked, but for\n    // 8/16-bit it might be >= SrcSizeBits, in which case CF is cleared. There's\n    // nothing to do in that case since we already cleared CF above.\n    const auto SrcSizeBits = IR::OpSizeAsBits(SrcSize);\n    if (Shift < SrcSizeBits) {\n      SetCFDirect(Src1, SrcSizeBits - Shift, true);\n    }\n  }\n\n  CalculatePF(UnmaskedRes);\n  InvalidateAF();\n\n  // OF\n  // In the case of left shift. OF is only set from the result of <Top Source Bit> XOR <Top Result Bit>\n  if (Shift == 1) {\n    auto Xor = _Xor(OpSize, UnmaskedRes, Src1);\n    SetRFLAG<FEXCore::X86State::RFLAG_OF_RAW_LOC>(Xor, IR::OpSizeAsBits(SrcSize) - 1, true);\n  } else {\n    // Undefined, we choose to zero as part of SetNZ_ZeroCV\n  }\n}\n\nvoid OpDispatchBuilder::CalculateFlags_SignShiftRightImmediate(IR::OpSize SrcSize, Ref Res, Ref Src1, uint64_t Shift) {\n  // No flags changed if shift is zero\n  if (Shift == 0) {\n    return;\n  }\n\n  SetNZ_ZeroCV(SrcSize, Res);\n\n  // Extract the last bit shifted in to CF\n  SetCFDirect(Src1, Shift - 1, true);\n\n  CalculatePF(Res);\n  InvalidateAF();\n\n  // OF\n  // Only defined when Shift is 1 else undefined. Only is set if the top bit was set to 1 when\n  // shifted So it is set to zero.  In the undefined case we choose to zero as well. Since it was\n  // already zeroed there's nothing to do here.\n}\n\nvoid OpDispatchBuilder::CalculateFlags_ShiftRightImmediateCommon(IR::OpSize SrcSize, Ref Res, Ref Src1, uint64_t Shift) {\n  // Set SF and PF. Clobbers OF, but OF only defined for Shift = 1 where it is\n  // set below.\n  SetNZ_ZeroCV(SrcSize, Res);\n\n  // Extract the last bit shifted in to CF\n  SetCFDirect(Src1, Shift - 1, true);\n\n  CalculatePF(Res);\n  InvalidateAF();\n}\n\nvoid OpDispatchBuilder::CalculateFlags_ShiftRightImmediate(IR::OpSize SrcSize, Ref Res, Ref Src1, uint64_t Shift) {\n  // No flags changed if shift is zero\n  if (Shift == 0) {\n    return;\n  }\n\n  CalculateFlags_ShiftRightImmediateCommon(SrcSize, Res, Src1, Shift);\n\n  // OF\n  {\n    // Only defined when Shift is 1 else undefined\n    // Is set to the MSB of the original value\n    if (Shift == 1) {\n      SetRFLAG<FEXCore::X86State::RFLAG_OF_RAW_LOC>(Src1, IR::OpSizeAsBits(SrcSize) - 1, true);\n    }\n  }\n}\n\nvoid OpDispatchBuilder::CalculateFlags_ShiftRightDoubleImmediate(IR::OpSize SrcSize, Ref Res, Ref Src1, uint64_t Shift) {\n  // No flags changed if shift is zero\n  if (Shift == 0) {\n    return;\n  }\n\n  const auto OpSize = SrcSize == OpSize::i64Bit ? OpSize::i64Bit : OpSize::i32Bit;\n  CalculateFlags_ShiftRightImmediateCommon(SrcSize, Res, Src1, Shift);\n\n  // OF\n  {\n    // Only defined when Shift is 1 else undefined\n    // Is set if the MSB bit changes.\n    // XOR of Result and Src1\n    if (Shift == 1) {\n      auto val = _Xor(OpSize, Src1, Res);\n      SetRFLAG<FEXCore::X86State::RFLAG_OF_RAW_LOC>(val, IR::OpSizeAsBits(SrcSize) - 1, true);\n    }\n  }\n}\n\nvoid OpDispatchBuilder::CalculateFlags_ZCNT(IR::OpSize SrcSize, Ref Result) {\n  // OF, SF, AF, PF all undefined\n  // Test ZF of result, SF is undefined so this is ok.\n  SetNZ_ZeroCV(SrcSize, Result);\n\n  // Now set CF if the Result = SrcSize * 8. Since SrcSize is a power-of-two and\n  // Result is <= SrcSize * 8, we equivalently check if the log2(SrcSize * 8)\n  // bit is set. No masking is needed because no higher bits could be set.\n  unsigned CarryBit = FEXCore::ilog2(IR::OpSizeAsBits(SrcSize));\n  SetCFDirect(Result, CarryBit);\n}\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher/H0F38Tables.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include \"Interface/Core/OpcodeDispatcher.h\"\n\nnamespace FEXCore::IR {\n#define OPD(prefix, opcode) (((prefix) << 8) | opcode)\nconstexpr uint16_t PF_38_NONE = 0;\nconstexpr uint16_t PF_38_66 = (1U << 0);\nconstexpr uint16_t PF_38_F2 = (1U << 1);\nconstexpr uint16_t PF_38_F3 = (1U << 2);\n\nconstexpr DispatchTableEntry OpDispatch_H0F38Table[] = {\n  {OPD(PF_38_NONE, 0x00), 1, &OpDispatchBuilder::PSHUFBOp},\n  {OPD(PF_38_66, 0x00), 1, &OpDispatchBuilder::PSHUFBOp},\n  {OPD(PF_38_NONE, 0x01), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VADDP, OpSize::i16Bit>},\n  {OPD(PF_38_66, 0x01), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VADDP, OpSize::i16Bit>},\n  {OPD(PF_38_NONE, 0x02), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VADDP, OpSize::i32Bit>},\n  {OPD(PF_38_66, 0x02), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VADDP, OpSize::i32Bit>},\n  {OPD(PF_38_NONE, 0x03), 1, &OpDispatchBuilder::PHADDS},\n  {OPD(PF_38_66, 0x03), 1, &OpDispatchBuilder::PHADDS},\n  {OPD(PF_38_NONE, 0x04), 1, &OpDispatchBuilder::PMADDUBSW},\n  {OPD(PF_38_66, 0x04), 1, &OpDispatchBuilder::PMADDUBSW},\n  {OPD(PF_38_NONE, 0x05), 1, &OpDispatchBuilder::PHSUB<OpSize::i16Bit>},\n  {OPD(PF_38_66, 0x05), 1, &OpDispatchBuilder::PHSUB<OpSize::i16Bit>},\n  {OPD(PF_38_NONE, 0x06), 1, &OpDispatchBuilder::PHSUB<OpSize::i32Bit>},\n  {OPD(PF_38_66, 0x06), 1, &OpDispatchBuilder::PHSUB<OpSize::i32Bit>},\n  {OPD(PF_38_NONE, 0x07), 1, &OpDispatchBuilder::PHSUBS},\n  {OPD(PF_38_66, 0x07), 1, &OpDispatchBuilder::PHSUBS},\n  {OPD(PF_38_NONE, 0x08), 1, &OpDispatchBuilder::PSIGN<OpSize::i8Bit>},\n  {OPD(PF_38_66, 0x08), 1, &OpDispatchBuilder::PSIGN<OpSize::i8Bit>},\n  {OPD(PF_38_NONE, 0x09), 1, &OpDispatchBuilder::PSIGN<OpSize::i16Bit>},\n  {OPD(PF_38_66, 0x09), 1, &OpDispatchBuilder::PSIGN<OpSize::i16Bit>},\n  {OPD(PF_38_NONE, 0x0A), 1, &OpDispatchBuilder::PSIGN<OpSize::i32Bit>},\n  {OPD(PF_38_66, 0x0A), 1, &OpDispatchBuilder::PSIGN<OpSize::i32Bit>},\n  {OPD(PF_38_NONE, 0x0B), 1, &OpDispatchBuilder::PMULHRSW},\n  {OPD(PF_38_66, 0x0B), 1, &OpDispatchBuilder::PMULHRSW},\n  {OPD(PF_38_66, 0x10), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorVariableBlend, OpSize::i8Bit>},\n  {OPD(PF_38_66, 0x14), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorVariableBlend, OpSize::i32Bit>},\n  {OPD(PF_38_66, 0x15), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorVariableBlend, OpSize::i64Bit>},\n  {OPD(PF_38_66, 0x17), 1, &OpDispatchBuilder::PTestOp},\n  {OPD(PF_38_NONE, 0x1C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorUnaryOp, IR::OP_VABS, OpSize::i8Bit>},\n  {OPD(PF_38_66, 0x1C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorUnaryOp, IR::OP_VABS, OpSize::i8Bit>},\n  {OPD(PF_38_NONE, 0x1D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorUnaryOp, IR::OP_VABS, OpSize::i16Bit>},\n  {OPD(PF_38_66, 0x1D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorUnaryOp, IR::OP_VABS, OpSize::i16Bit>},\n  {OPD(PF_38_NONE, 0x1E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorUnaryOp, IR::OP_VABS, OpSize::i32Bit>},\n  {OPD(PF_38_66, 0x1E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorUnaryOp, IR::OP_VABS, OpSize::i32Bit>},\n  {OPD(PF_38_66, 0x20), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i16Bit, true>},\n  {OPD(PF_38_66, 0x21), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i32Bit, true>},\n  {OPD(PF_38_66, 0x22), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i64Bit, true>},\n  {OPD(PF_38_66, 0x23), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i16Bit, OpSize::i32Bit, true>},\n  {OPD(PF_38_66, 0x24), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i16Bit, OpSize::i64Bit, true>},\n  {OPD(PF_38_66, 0x25), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i32Bit, OpSize::i64Bit, true>},\n  {OPD(PF_38_66, 0x28), 1, &OpDispatchBuilder::PMULLOp<OpSize::i32Bit, true>},\n  {OPD(PF_38_66, 0x29), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VCMPEQ, OpSize::i64Bit>},\n  {OPD(PF_38_66, 0x2A), 1, &OpDispatchBuilder::MOVVectorNTOp},\n  {OPD(PF_38_66, 0x2B), 1, &OpDispatchBuilder::PACKUSOp<OpSize::i32Bit>},\n  {OPD(PF_38_66, 0x30), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i16Bit, false>},\n  {OPD(PF_38_66, 0x31), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i32Bit, false>},\n  {OPD(PF_38_66, 0x32), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i64Bit, false>},\n  {OPD(PF_38_66, 0x33), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i16Bit, OpSize::i32Bit, false>},\n  {OPD(PF_38_66, 0x34), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i16Bit, OpSize::i64Bit, false>},\n  {OPD(PF_38_66, 0x35), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i32Bit, OpSize::i64Bit, false>},\n  {OPD(PF_38_66, 0x37), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VCMPGT, OpSize::i64Bit>},\n  {OPD(PF_38_66, 0x38), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSMIN, OpSize::i8Bit>},\n  {OPD(PF_38_66, 0x39), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSMIN, OpSize::i32Bit>},\n  {OPD(PF_38_66, 0x3A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUMIN, OpSize::i16Bit>},\n  {OPD(PF_38_66, 0x3B), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUMIN, OpSize::i32Bit>},\n  {OPD(PF_38_66, 0x3C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSMAX, OpSize::i8Bit>},\n  {OPD(PF_38_66, 0x3D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSMAX, OpSize::i32Bit>},\n  {OPD(PF_38_66, 0x3E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUMAX, OpSize::i16Bit>},\n  {OPD(PF_38_66, 0x3F), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUMAX, OpSize::i32Bit>},\n  {OPD(PF_38_66, 0x40), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VMUL, OpSize::i32Bit>},\n  {OPD(PF_38_66, 0x41), 1, &OpDispatchBuilder::PHMINPOSUWOp},\n\n  {OPD(PF_38_NONE, 0xC8), 1, &OpDispatchBuilder::SHA1NEXTEOp},\n  {OPD(PF_38_NONE, 0xC9), 1, &OpDispatchBuilder::SHA1MSG1Op},\n  {OPD(PF_38_NONE, 0xCA), 1, &OpDispatchBuilder::SHA1MSG2Op},\n  {OPD(PF_38_NONE, 0xCB), 1, &OpDispatchBuilder::SHA256RNDS2Op},\n  {OPD(PF_38_NONE, 0xCC), 1, &OpDispatchBuilder::SHA256MSG1Op},\n  {OPD(PF_38_NONE, 0xCD), 1, &OpDispatchBuilder::SHA256MSG2Op},\n\n  {OPD(PF_38_66, 0xDB), 1, &OpDispatchBuilder::AESImcOp},\n  {OPD(PF_38_66, 0xDC), 1, &OpDispatchBuilder::AESEncOp},\n  {OPD(PF_38_66, 0xDD), 1, &OpDispatchBuilder::AESEncLastOp},\n  {OPD(PF_38_66, 0xDE), 1, &OpDispatchBuilder::AESDecOp},\n  {OPD(PF_38_66, 0xDF), 1, &OpDispatchBuilder::AESDecLastOp},\n\n  {OPD(PF_38_NONE, 0xF0), 2, &OpDispatchBuilder::MOVBEOp},\n  {OPD(PF_38_66, 0xF0), 2, &OpDispatchBuilder::MOVBEOp},\n\n  {OPD(PF_38_F2, 0xF0), 1, &OpDispatchBuilder::CRC32},\n  {OPD(PF_38_F2, 0xF1), 1, &OpDispatchBuilder::CRC32},\n\n  {OPD(PF_38_66 | PF_38_F2, 0xF0), 1, &OpDispatchBuilder::CRC32},\n  {OPD(PF_38_66 | PF_38_F2, 0xF1), 1, &OpDispatchBuilder::CRC32},\n\n  {OPD(PF_38_66, 0xF6), 1, &OpDispatchBuilder::ADXOp},\n  {OPD(PF_38_F3, 0xF6), 1, &OpDispatchBuilder::ADXOp},\n};\n#undef OPD\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher/H0F3ATables.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include \"Interface/Core/OpcodeDispatcher.h\"\n\nnamespace FEXCore::IR {\n#define OPD(REX, prefix, opcode) ((REX << 9) | (prefix << 8) | opcode)\n#define PF_3A_NONE 0\n#define PF_3A_66 1\nconstexpr auto OpDispatchTableGenH0F3A = []() consteval {\n  constexpr auto OpDispatchTableGenH0F3AREX = []<uint16_t REX>() consteval {\n    constexpr DispatchTableEntry Table[] = {\n      {OPD(REX, PF_3A_66, 0x08), 1, &OpDispatchBuilder::VectorRound<OpSize::i32Bit>},\n      {OPD(REX, PF_3A_66, 0x09), 1, &OpDispatchBuilder::VectorRound<OpSize::i64Bit>},\n      {OPD(REX, PF_3A_66, 0x0A), 1, &OpDispatchBuilder::InsertScalarRound<OpSize::i32Bit>},\n      {OPD(REX, PF_3A_66, 0x0B), 1, &OpDispatchBuilder::InsertScalarRound<OpSize::i64Bit>},\n      {OPD(REX, PF_3A_66, 0x0C), 1, &OpDispatchBuilder::VectorBlend<OpSize::i32Bit>},\n      {OPD(REX, PF_3A_66, 0x0D), 1, &OpDispatchBuilder::VectorBlend<OpSize::i64Bit>},\n      {OPD(REX, PF_3A_66, 0x0E), 1, &OpDispatchBuilder::VectorBlend<OpSize::i16Bit>},\n\n      {OPD(REX, PF_3A_NONE, 0x0F), 1, &OpDispatchBuilder::PAlignrOp},\n      {OPD(REX, PF_3A_66, 0x0F), 1, &OpDispatchBuilder::PAlignrOp},\n\n      {OPD(REX, PF_3A_66, 0x14), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PExtrOp, OpSize::i8Bit>},\n      {OPD(REX, PF_3A_66, 0x15), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PExtrOp, OpSize::i16Bit>},\n      {OPD(REX, PF_3A_66, 0x17), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PExtrOp, OpSize::i32Bit>},\n\n      {OPD(REX, PF_3A_66, 0x20), 1, &OpDispatchBuilder::PINSROp<OpSize::i8Bit>},\n      {OPD(REX, PF_3A_66, 0x21), 1, &OpDispatchBuilder::InsertPSOp},\n      {OPD(REX, PF_3A_66, 0x40), 1, &OpDispatchBuilder::DPPOp<OpSize::i32Bit>},\n      {OPD(REX, PF_3A_66, 0x41), 1, &OpDispatchBuilder::DPPOp<OpSize::i64Bit>},\n      {OPD(REX, PF_3A_66, 0x42), 1, &OpDispatchBuilder::MPSADBWOp},\n      {OPD(REX, PF_3A_66, 0x44), 1, &OpDispatchBuilder::PCLMULQDQOp},\n\n      {OPD(REX, PF_3A_66, 0x60), 1, &OpDispatchBuilder::VPCMPESTRMOp},\n      {OPD(REX, PF_3A_66, 0x61), 1, &OpDispatchBuilder::VPCMPESTRIOp},\n      {OPD(REX, PF_3A_66, 0x62), 1, &OpDispatchBuilder::VPCMPISTRMOp},\n      {OPD(REX, PF_3A_66, 0x63), 1, &OpDispatchBuilder::VPCMPISTRIOp},\n\n      {OPD(REX, PF_3A_NONE, 0xCC), 1, &OpDispatchBuilder::SHA1RNDS4Op},\n      {OPD(REX, PF_3A_66, 0xDF), 1, &OpDispatchBuilder::AESKeyGenAssist},\n\n    };\n    return std::to_array(Table);\n  };\n\n  auto REX0 = OpDispatchTableGenH0F3AREX.template operator()<0>();\n  auto REX1 = OpDispatchTableGenH0F3AREX.template operator()<1>();\n  auto concat = []<typename T, size_t N1, size_t N2>(const std::array<T, N1>& lhs,\n                                                     const std::array<T, N2>& rhs) consteval -> std::array<T, N1 + N2> {\n    std::array<T, N1 + N2> Table {};\n    for (size_t i = 0; i < N1; ++i) {\n      Table[i] = lhs[i];\n    }\n\n    for (size_t i = 0; i < N2; ++i) {\n      Table[N1 + i] = rhs[i];\n    }\n\n    return Table;\n  };\n  return concat(REX0, REX1);\n};\n\nconstexpr auto OpDispatch_H0F3ATableIgnoreREX = OpDispatchTableGenH0F3A();\n\nconstexpr DispatchTableEntry OpDispatch_H0F3ATableNeedsREX0[] = {\n  {OPD(0, PF_3A_66, 0x16), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PExtrOp, OpSize::i32Bit>},\n  {OPD(0, PF_3A_66, 0x22), 1, &OpDispatchBuilder::PINSROp<OpSize::i32Bit>},\n};\n\n#undef PF_3A_NONE\n#undef PF_3A_66\n\n#undef OPD\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher/PrimaryGroupTables.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include \"Interface/Core/OpcodeDispatcher.h\"\n\nnamespace FEXCore::IR {\nusing X86Tables::OpToIndex;\n#define OPD(group, prefix, Reg) (((group - FEXCore::X86Tables::TYPE_GROUP_1) << 6) | (prefix) << 3 | (Reg))\nconstexpr DispatchTableEntry OpDispatch_PrimaryGroupTables[] = {\n  // GROUP 1\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x80), 0), 1, &OpDispatchBuilder::SecondaryALUOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x80), 1), 1, &OpDispatchBuilder::SecondaryALUOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x80), 2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::ADCOp, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x80), 3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SBBOp, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x80), 4), 1, &OpDispatchBuilder::SecondaryALUOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x80), 5), 1, &OpDispatchBuilder::SecondaryALUOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x80), 6), 1, &OpDispatchBuilder::SecondaryALUOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x80), 7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::CMPOp, 1>}, // CMP\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x81), 0), 1, &OpDispatchBuilder::SecondaryALUOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x81), 1), 1, &OpDispatchBuilder::SecondaryALUOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x81), 2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::ADCOp, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x81), 3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SBBOp, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x81), 4), 1, &OpDispatchBuilder::SecondaryALUOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x81), 5), 1, &OpDispatchBuilder::SecondaryALUOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x81), 6), 1, &OpDispatchBuilder::SecondaryALUOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x81), 7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::CMPOp, 1>},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x83), 0), 1, &OpDispatchBuilder::SecondaryALUOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x83), 1), 1, &OpDispatchBuilder::SecondaryALUOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x83), 2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::ADCOp, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x83), 3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SBBOp, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x83), 4), 1, &OpDispatchBuilder::SecondaryALUOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x83), 5), 1, &OpDispatchBuilder::SecondaryALUOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x83), 6), 1, &OpDispatchBuilder::SecondaryALUOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x83), 7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::CMPOp, 1>},\n\n  // GROUP 2\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC0), 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::RotateOp, true, true, false>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC0), 1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::RotateOp, false, true, false>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC0), 2), 1, &OpDispatchBuilder::RCLOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC0), 3), 1, &OpDispatchBuilder::RCROp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC0), 4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SHLImmediateOp, false>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC0), 5), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SHRImmediateOp, false>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC0), 6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SHLImmediateOp, false>}, // SAL\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC0), 7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::ASHROp, true, false>}, // SAR\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC1), 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::RotateOp, true, true, false>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC1), 1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::RotateOp, false, true, false>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC1), 2), 1, &OpDispatchBuilder::RCLOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC1), 3), 1, &OpDispatchBuilder::RCROp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC1), 4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SHLImmediateOp, false>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC1), 5), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SHRImmediateOp, false>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC1), 6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SHLImmediateOp, false>}, // SAL\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xC1), 7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::ASHROp, true, false>}, // SAR\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD0), 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::RotateOp, true, true, true>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD0), 1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::RotateOp, false, true, true>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD0), 2), 1, &OpDispatchBuilder::RCLOp1Bit},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD0), 3), 1, &OpDispatchBuilder::RCROp8x1Bit},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD0), 4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SHLImmediateOp, true>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD0), 5), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SHRImmediateOp, true>}, // 1Bit SHR\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD0), 6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SHLImmediateOp, true>}, // SAL\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD0), 7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::ASHROp, true, true>},   // SAR\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD1), 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::RotateOp, true, true, true>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD1), 1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::RotateOp, false, true, true>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD1), 2), 1, &OpDispatchBuilder::RCLOp1Bit},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD1), 3), 1, &OpDispatchBuilder::RCROp1Bit},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD1), 4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SHLImmediateOp, true>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD1), 5), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SHRImmediateOp, true>}, // 1Bit SHR\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD1), 6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SHLImmediateOp, true>}, // SAL\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD1), 7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::ASHROp, true, true>},   // SAR\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD2), 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::RotateOp, true, false, false>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD2), 1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::RotateOp, false, false, false>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD2), 2), 1, &OpDispatchBuilder::RCLSmallerOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD2), 3), 1, &OpDispatchBuilder::RCRSmallerOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD2), 4), 1, &OpDispatchBuilder::SHLOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD2), 5), 1, &OpDispatchBuilder::SHROp}, // SHR by CL\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD2), 6), 1, &OpDispatchBuilder::SHLOp}, // SAL\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD2), 7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::ASHROp, false, false>}, // SAR\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD3), 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::RotateOp, true, false, false>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD3), 1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::RotateOp, false, false, false>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD3), 2), 1, &OpDispatchBuilder::RCLOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD3), 3), 1, &OpDispatchBuilder::RCROp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD3), 4), 1, &OpDispatchBuilder::SHLOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD3), 5), 1, &OpDispatchBuilder::SHROp}, // SHR by CL\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD3), 6), 1, &OpDispatchBuilder::SHLOp}, // SAL\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_2, OpToIndex(0xD3), 7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::ASHROp, false, false>}, // SAR\n\n  // GROUP 3\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF6), 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::TESTOp, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF6), 1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::TESTOp, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF6), 2), 1, &OpDispatchBuilder::NOTOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF6), 3), 1, &OpDispatchBuilder::NEGOp}, // NEG\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF6), 4), 1, &OpDispatchBuilder::MULOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF6), 5), 1, &OpDispatchBuilder::IMULOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF6), 6), 1, &OpDispatchBuilder::DIVOp},  // DIV\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF6), 7), 1, &OpDispatchBuilder::IDIVOp}, // IDIV\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF7), 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::TESTOp, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF7), 1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::TESTOp, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF7), 2), 1, &OpDispatchBuilder::NOTOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF7), 3), 1, &OpDispatchBuilder::NEGOp}, // NEG\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF7), 4), 1, &OpDispatchBuilder::MULOp}, // MUL\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF7), 5), 1, &OpDispatchBuilder::IMULOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF7), 6), 1, &OpDispatchBuilder::DIVOp},  // DIV\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_3, OpToIndex(0xF7), 7), 1, &OpDispatchBuilder::IDIVOp}, // IDIV\n\n  // GROUP 4\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_4, OpToIndex(0xFE), 0), 1, &OpDispatchBuilder::INCOp}, // INC\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_4, OpToIndex(0xFE), 1), 1, &OpDispatchBuilder::DECOp}, // DEC\n\n  // GROUP 5\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_5, OpToIndex(0xFF), 0), 1, &OpDispatchBuilder::INCOp}, // INC\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_5, OpToIndex(0xFF), 1), 1, &OpDispatchBuilder::DECOp}, // DEC\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_5, OpToIndex(0xFF), 2), 1, &OpDispatchBuilder::CALLAbsoluteOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_5, OpToIndex(0xFF), 3), 1, &OpDispatchBuilder::CALLFARIndirectOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_5, OpToIndex(0xFF), 4), 1, &OpDispatchBuilder::JUMPAbsoluteOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_5, OpToIndex(0xFF), 5), 1, &OpDispatchBuilder::JUMPFARIndirectOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_5, OpToIndex(0xFF), 6), 1, &OpDispatchBuilder::PUSHOp},\n\n  // GROUP 11\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_11, OpToIndex(0xC6), 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVGPROp, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_11, OpToIndex(0xC7), 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVGPROp, 1>},\n};\n#undef OPD\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher/SecondaryGroupTables.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include \"Interface/Core/OpcodeDispatcher.h\"\n\nnamespace FEXCore::IR {\n#define OPD(group, prefix, Reg) (((group - FEXCore::X86Tables::TYPE_GROUP_6) << 5) | (prefix) << 3 | (Reg))\nconstexpr uint16_t PF_NONE = 0;\nconstexpr uint16_t PF_F3 = 1;\nconstexpr uint16_t PF_66 = 2;\nconstexpr uint16_t PF_F2 = 3;\nconstexpr DispatchTableEntry OpDispatch_SecondaryGroupTables[] = {\n  // GROUP 6\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_6, PF_NONE, 3), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_6, PF_F3, 3), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_6, PF_66, 3), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_6, PF_F2, 3), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n\n  // GROUP 7\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_NONE, 0), 1, &OpDispatchBuilder::SGDTOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_F3, 0), 1, &OpDispatchBuilder::SGDTOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_66, 0), 1, &OpDispatchBuilder::SGDTOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_F2, 0), 1, &OpDispatchBuilder::SGDTOp},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_NONE, 1), 1, &OpDispatchBuilder::SIDTOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_F3, 1), 1, &OpDispatchBuilder::SIDTOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_66, 1), 1, &OpDispatchBuilder::SIDTOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_F2, 1), 1, &OpDispatchBuilder::SIDTOp},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_NONE, 3), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_F3, 3), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_66, 3), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_F2, 3), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_NONE, 4), 1, &OpDispatchBuilder::SMSWOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_F3, 4), 1, &OpDispatchBuilder::SMSWOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_66, 4), 1, &OpDispatchBuilder::SMSWOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_F2, 4), 1, &OpDispatchBuilder::SMSWOp},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_NONE, 6), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_F3, 6), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_66, 6), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_F2, 6), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_NONE, 7), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_F3, 7), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_66, 7), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_7, PF_F2, 7), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n\n  // GROUP 8\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_NONE, 4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTNone>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_F3, 4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTNone>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_66, 4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTNone>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_F2, 4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTNone>},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_NONE, 5), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTSet>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_F3, 5), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTSet>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_66, 5), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTSet>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_F2, 5), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTSet>},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_NONE, 6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTClear>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_F3, 6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTClear>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_66, 6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTClear>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_F2, 6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTClear>},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_NONE, 7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTComplement>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_F3, 7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTComplement>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_66, 7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTComplement>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_8, PF_F2, 7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 1, BTAction::BTComplement>},\n\n  // GROUP 9\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_9, PF_NONE, 1), 1, &OpDispatchBuilder::CMPXCHGPairOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_9, PF_NONE, 6), 1, &OpDispatchBuilder::RDRANDOp<false>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_9, PF_NONE, 7), 1, &OpDispatchBuilder::RDRANDOp<true>},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_9, PF_66, 1), 1, &OpDispatchBuilder::CMPXCHGPairOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_9, PF_66, 6), 1, &OpDispatchBuilder::RDRANDOp<false>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_9, PF_66, 7), 1, &OpDispatchBuilder::RDRANDOp<true>},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_9, PF_F2, 1), 1, &OpDispatchBuilder::CMPXCHGPairOp},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_9, PF_F3, 1), 1, &OpDispatchBuilder::CMPXCHGPairOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_9, PF_F3, 7), 1, &OpDispatchBuilder::RDPIDOp},\n\n  // GROUP 12\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_12, PF_NONE, 2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRLI, OpSize::i16Bit>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_12, PF_NONE, 4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRAIOp, OpSize::i16Bit>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_12, PF_NONE, 6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSLLI, OpSize::i16Bit>},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_12, PF_66, 2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRLI, OpSize::i16Bit>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_12, PF_66, 4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRAIOp, OpSize::i16Bit>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_12, PF_66, 6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSLLI, OpSize::i16Bit>},\n\n  // GROUP 13\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_13, PF_NONE, 2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRLI, OpSize::i32Bit>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_13, PF_NONE, 4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRAIOp, OpSize::i32Bit>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_13, PF_NONE, 6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSLLI, OpSize::i32Bit>},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_13, PF_66, 2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRLI, OpSize::i32Bit>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_13, PF_66, 4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRAIOp, OpSize::i32Bit>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_13, PF_66, 6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSLLI, OpSize::i32Bit>},\n\n  // GROUP 14\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_14, PF_NONE, 2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRLI, OpSize::i64Bit>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_14, PF_NONE, 6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSLLI, OpSize::i64Bit>},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_14, PF_66, 2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRLI, OpSize::i64Bit>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_14, PF_66, 3), 1, &OpDispatchBuilder::PSRLDQ},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_14, PF_66, 6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSLLI, OpSize::i64Bit>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_14, PF_66, 7), 1, &OpDispatchBuilder::PSLLDQ},\n\n  // GROUP 15\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_15, PF_NONE, 0), 1, &OpDispatchBuilder::FXSaveOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_15, PF_NONE, 1), 1, &OpDispatchBuilder::FXRStoreOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_15, PF_NONE, 2), 1, &OpDispatchBuilder::LDMXCSR},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_15, PF_NONE, 3), 1, &OpDispatchBuilder::STMXCSR},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_15, PF_NONE, 4), 1, &OpDispatchBuilder::XSaveOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_15, PF_NONE, 5), 1, &OpDispatchBuilder::LoadFenceOrXRSTOR},   // LFENCE (or XRSTOR)\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_15, PF_NONE, 6), 1, &OpDispatchBuilder::MemFenceOrXSAVEOPT},  // MFENCE (or XSAVEOPT)\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_15, PF_NONE, 7), 1, &OpDispatchBuilder::StoreFenceOrCLFlush}, // SFENCE (or CLFLUSH)\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_15, PF_F3, 5), 1, &OpDispatchBuilder::UnimplementedOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_15, PF_F3, 6), 1, &OpDispatchBuilder::UMonitorOrCLRSSBSY},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_15, PF_66, 6), 1, &OpDispatchBuilder::CLWBOrTPause},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_15, PF_66, 7), 1, &OpDispatchBuilder::CLFLUSHOPT},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_15, PF_F2, 6), 1, &OpDispatchBuilder::UMWaitOp},\n\n  // GROUP 16\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_NONE, 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, true, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_NONE, 1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, false, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_NONE, 2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, false, 2>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_NONE, 3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, false, 3>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_NONE, 4), 4, &OpDispatchBuilder::NOPOp},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_F3, 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, true, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_F3, 1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, false, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_F3, 2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, false, 2>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_F3, 3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, false, 3>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_F3, 4), 4, &OpDispatchBuilder::NOPOp},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_66, 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, true, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_66, 1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, false, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_66, 2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, false, 2>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_66, 3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, false, 3>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_66, 4), 4, &OpDispatchBuilder::NOPOp},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_F2, 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, true, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_F2, 1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, false, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_F2, 2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, false, 2>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_F2, 3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, false, 3>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_F2, 4), 4, &OpDispatchBuilder::NOPOp},\n\n  // GROUP 17\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_17, PF_66, 0), 1, &OpDispatchBuilder::Extrq_imm},\n\n  // GROUP P\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_P, PF_NONE, 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, false, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_P, PF_NONE, 1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, true, false, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_P, PF_NONE, 2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, true, false, 1>},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_P, PF_NONE, 3), 5, &OpDispatchBuilder::NOPOp},\n\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_P, PF_F3, 0), 8, &OpDispatchBuilder::NOPOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_P, PF_66, 0), 8, &OpDispatchBuilder::NOPOp},\n  {OPD(FEXCore::X86Tables::TYPE_GROUP_P, PF_F2, 0), 8, &OpDispatchBuilder::NOPOp},\n};\n\n#undef OPD\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher/SecondaryModRMTables.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include \"Interface/Core/OpcodeDispatcher.h\"\n\nnamespace FEXCore::IR {\nconstexpr DispatchTableEntry OpDispatch_SecondaryModRMTables[] = {\n  // REG /1\n  {((0 << 3) | 0), 1, &OpDispatchBuilder::UnimplementedOp},\n  {((0 << 3) | 1), 1, &OpDispatchBuilder::UnimplementedOp},\n\n  // REG /2\n  {((1 << 3) | 0), 1, &OpDispatchBuilder::XGetBVOp},\n\n  // REG /3\n  {((2 << 3) | 7), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n\n  // REG /7\n  {((3 << 3) | 0), 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {((3 << 3) | 1), 1, &OpDispatchBuilder::RDTSCPOp},\n  {((3 << 3) | 4), 1, &OpDispatchBuilder::CLZeroOp},\n};\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher/SecondaryTables.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include \"Interface/Core/OpcodeDispatcher.h\"\n\nnamespace FEXCore::IR {\nconstexpr DispatchTableEntry OpDispatch_TwoByteOpTable[] = {\n  // Instructions\n  {0x03, 1, &OpDispatchBuilder::LSLOp},\n  {0x06, 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {0x07, 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {0x0B, 1, &OpDispatchBuilder::INTOp},\n  {0x0E, 1, &OpDispatchBuilder::X87EMMS},\n\n  {0x19, 7, &OpDispatchBuilder::NOPOp}, // NOP with ModRM\n\n  {0x20, 4, &OpDispatchBuilder::PermissionRestrictedOp},\n\n  {0x30, 1, &OpDispatchBuilder::PermissionRestrictedOp},\n  {0x31, 1, &OpDispatchBuilder::RDTSCOp},\n  {0x32, 2, &OpDispatchBuilder::PermissionRestrictedOp},\n  {0x34, 3, &OpDispatchBuilder::UnimplementedOp},\n\n  {0x40, 16, &OpDispatchBuilder::CMOVOp},\n  {0x6E, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVBetweenGPR_FPR, OpDispatchBuilder::VectorOpType::MMX>},\n  {0x6F, 1, &OpDispatchBuilder::MOVQMMXOp},\n  {0x7E, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVBetweenGPR_FPR, OpDispatchBuilder::VectorOpType::MMX>},\n  {0x7F, 1, &OpDispatchBuilder::MOVQMMXOp},\n  {0x80, 16, &OpDispatchBuilder::CondJUMPOp},\n  {0x90, 16, &OpDispatchBuilder::SETccOp},\n  {0xA2, 1, &OpDispatchBuilder::CPUIDOp},\n  {0xA3, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 0, BTAction::BTNone>}, // BT\n  {0xA4, 1, &OpDispatchBuilder::SHLDImmediateOp},\n  {0xA5, 1, &OpDispatchBuilder::SHLDOp},\n  {0xAB, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 0, BTAction::BTSet>}, // BTS\n  {0xAC, 1, &OpDispatchBuilder::SHRDImmediateOp},\n  {0xAD, 1, &OpDispatchBuilder::SHRDOp},\n  {0xAF, 1, &OpDispatchBuilder::IMUL1SrcOp},\n  {0xB0, 2, &OpDispatchBuilder::CMPXCHGOp},                                            // CMPXCHG\n  {0xB3, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 0, BTAction::BTClear>}, // BTR\n  {0xB6, 2, &OpDispatchBuilder::MOVZXOp},\n  {0xBB, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::BTOp, 0, BTAction::BTComplement>}, // BTC\n  {0xBC, 1, &OpDispatchBuilder::BSFOp},                                                     // BSF\n  {0xBD, 1, &OpDispatchBuilder::BSROp},                                                     // BSF\n  {0xBE, 2, &OpDispatchBuilder::MOVSXOp},\n  {0xC0, 2, &OpDispatchBuilder::XADDOp},\n  {0xC3, 1, &OpDispatchBuilder::MOVGPRNTOp},\n  {0xC4, 1, &OpDispatchBuilder::PINSROp<OpSize::i16Bit>},\n  {0xC5, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PExtrOp, OpSize::i16Bit>},\n  {0xC8, 8, &OpDispatchBuilder::BSWAPOp},\n\n  // SSE\n  {0x10, 2, &OpDispatchBuilder::MOVVectorUnalignedOp},\n  {0x12, 2, &OpDispatchBuilder::MOVLPOp},\n  {0x14, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKLOp, OpSize::i32Bit>},\n  {0x15, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKHOp, OpSize::i32Bit>},\n  {0x16, 2, &OpDispatchBuilder::MOVHPDOp},\n  {0x28, 2, &OpDispatchBuilder::MOVVectorAlignedOp},\n  {0x2A, 1, &OpDispatchBuilder::InsertMMX_To_XMM_Vector_CVT_Int_To_Float},\n  {0x2B, 1, &OpDispatchBuilder::MOVVectorNTOp},\n  {0x2C, 1, &OpDispatchBuilder::XMM_To_MMX_Vector_CVT_Float_To_Int<OpSize::i32Bit, false>},\n  {0x2D, 1, &OpDispatchBuilder::XMM_To_MMX_Vector_CVT_Float_To_Int<OpSize::i32Bit, true>},\n  {0x2E, 2, &OpDispatchBuilder::UCOMISxOp<OpSize::i32Bit>},\n  {0x50, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVMSKOp, OpSize::i32Bit>},\n  {0x51, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorUnaryOp, IR::OP_VFSQRT, OpSize::i32Bit>},\n  {0x52, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorUnaryOp, IR::OP_VFRSQRT, OpSize::i32Bit>},\n  {0x53, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorUnaryOp, IR::OP_VFRECP, OpSize::i32Bit>},\n  {0x54, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VAND, OpSize::i128Bit>},\n  {0x55, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUROp, IR::OP_VANDN, OpSize::i64Bit>},\n  {0x56, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VOR, OpSize::i128Bit>},\n  {0x57, 1, &OpDispatchBuilder::VectorXOROp},\n  {0x58, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFADD, OpSize::i32Bit>},\n  {0x59, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFMUL, OpSize::i32Bit>},\n  {0x5A, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Vector_CVT_Float_To_Float, OpSize::i64Bit, OpSize::i32Bit, false>},\n  {0x5B, 1, &OpDispatchBuilder::Vector_CVT_Int_To_Float<OpSize::i32Bit, false>},\n  {0x5C, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFSUB, OpSize::i32Bit>},\n  {0x5D, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFMIN, OpSize::i32Bit>},\n  {0x5E, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFDIV, OpSize::i32Bit>},\n  {0x5F, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFMAX, OpSize::i32Bit>},\n  {0x60, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKLOp, OpSize::i8Bit>},\n  {0x61, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKLOp, OpSize::i16Bit>},\n  {0x62, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKLOp, OpSize::i32Bit>},\n  {0x63, 1, &OpDispatchBuilder::PACKSSOp<OpSize::i16Bit>},\n  {0x64, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VCMPGT, OpSize::i8Bit>},\n  {0x65, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VCMPGT, OpSize::i16Bit>},\n  {0x66, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VCMPGT, OpSize::i32Bit>},\n  {0x67, 1, &OpDispatchBuilder::PACKUSOp<OpSize::i16Bit>},\n  {0x68, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKHOp, OpSize::i8Bit>},\n  {0x69, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKHOp, OpSize::i16Bit>},\n  {0x6A, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKHOp, OpSize::i32Bit>},\n  {0x6B, 1, &OpDispatchBuilder::PACKSSOp<OpSize::i32Bit>},\n  {0x70, 1, &OpDispatchBuilder::PSHUFW8ByteOp},\n\n  {0x74, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VCMPEQ, OpSize::i8Bit>},\n  {0x75, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VCMPEQ, OpSize::i16Bit>},\n  {0x76, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VCMPEQ, OpSize::i32Bit>},\n  {0x77, 1, &OpDispatchBuilder::X87EMMS},\n\n  {0xC2, 1, &OpDispatchBuilder::VFCMPOp<OpSize::i32Bit>},\n  {0xC6, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SHUFOp, OpSize::i32Bit>},\n\n  {0xD1, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRLDOp, OpSize::i16Bit>},\n  {0xD2, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRLDOp, OpSize::i32Bit>},\n  {0xD3, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRLDOp, OpSize::i64Bit>},\n  {0xD4, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VADD, OpSize::i64Bit>},\n  {0xD5, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VMUL, OpSize::i16Bit>},\n  {0xD7, 1, &OpDispatchBuilder::MOVMSKOpOne}, // PMOVMSKB\n  {0xD8, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUQSUB, OpSize::i8Bit>},\n  {0xD9, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUQSUB, OpSize::i16Bit>},\n  {0xDA, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUMIN, OpSize::i8Bit>},\n  {0xDB, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VAND, OpSize::i64Bit>},\n  {0xDC, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUQADD, OpSize::i8Bit>},\n  {0xDD, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUQADD, OpSize::i16Bit>},\n  {0xDE, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUMAX, OpSize::i8Bit>},\n  {0xDF, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUROp, IR::OP_VANDN, OpSize::i64Bit>},\n  {0xE0, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VURAVG, OpSize::i8Bit>},\n  {0xE1, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRAOp, OpSize::i16Bit>},\n  {0xE2, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRAOp, OpSize::i32Bit>},\n  {0xE3, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VURAVG, OpSize::i16Bit>},\n  {0xE4, 1, &OpDispatchBuilder::PMULHW<false>},\n  {0xE5, 1, &OpDispatchBuilder::PMULHW<true>},\n  {0xE7, 1, &OpDispatchBuilder::MOVVectorNTOp},\n  {0xE8, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSQSUB, OpSize::i8Bit>},\n  {0xE9, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSQSUB, OpSize::i16Bit>},\n  {0xEA, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSMIN, OpSize::i16Bit>},\n  {0xEB, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VOR, OpSize::i64Bit>},\n  {0xEC, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSQADD, OpSize::i8Bit>},\n  {0xED, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSQADD, OpSize::i16Bit>},\n  {0xEE, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSMAX, OpSize::i16Bit>},\n  {0xEF, 1, &OpDispatchBuilder::VectorXOROp},\n\n  {0xF1, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSLL, OpSize::i16Bit>},\n  {0xF2, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSLL, OpSize::i32Bit>},\n  {0xF3, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSLL, OpSize::i64Bit>},\n  {0xF4, 1, &OpDispatchBuilder::PMULLOp<OpSize::i32Bit, false>},\n  {0xF5, 1, &OpDispatchBuilder::PMADDWD},\n  {0xF6, 1, &OpDispatchBuilder::PSADBW},\n  {0xF7, 1, &OpDispatchBuilder::MASKMOVOp},\n  {0xF8, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSUB, OpSize::i8Bit>},\n  {0xF9, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSUB, OpSize::i16Bit>},\n  {0xFA, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSUB, OpSize::i32Bit>},\n  {0xFB, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSUB, OpSize::i64Bit>},\n  {0xFC, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VADD, OpSize::i8Bit>},\n  {0xFD, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VADD, OpSize::i16Bit>},\n  {0xFE, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VADD, OpSize::i32Bit>},\n\n#ifndef _WIN32\n  // FEX reserved instructions\n  {0x3E, 1, &OpDispatchBuilder::CallbackReturnOp},\n  {0x3F, 1, &OpDispatchBuilder::ThunkOp},\n#endif\n};\n\nconstexpr DispatchTableEntry OpDispatch_SecondaryRepModTables[] = {\n  {0x10, 2, &OpDispatchBuilder::MOVSSOp},\n  {0x12, 1, &OpDispatchBuilder::VMOVSLDUPOp},\n  {0x16, 1, &OpDispatchBuilder::VMOVSHDUPOp},\n  {0x2A, 1, &OpDispatchBuilder::InsertCVTGPR_To_FPR<OpSize::i32Bit>},\n  {0x2B, 1, &OpDispatchBuilder::MOVVectorNTOp},\n  {0x2C, 1, &OpDispatchBuilder::CVTFPR_To_GPR<OpSize::i32Bit, false>},\n  {0x2D, 1, &OpDispatchBuilder::CVTFPR_To_GPR<OpSize::i32Bit, true>},\n  {0x51, 1, &OpDispatchBuilder::VectorScalarUnaryInsertALUOp<IR::OP_VFSQRTSCALARINSERT, OpSize::i32Bit>},\n  {0x52, 1, &OpDispatchBuilder::VectorScalarUnaryInsertALUOp<IR::OP_VFRSQRTSCALARINSERT, OpSize::i32Bit>},\n  {0x53, 1, &OpDispatchBuilder::VectorScalarUnaryInsertALUOp<IR::OP_VFRECPSCALARINSERT, OpSize::i32Bit>},\n  {0x58, 1, &OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFADDSCALARINSERT, OpSize::i32Bit>},\n  {0x59, 1, &OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFMULSCALARINSERT, OpSize::i32Bit>},\n  {0x5A, 1, &OpDispatchBuilder::InsertScalar_CVT_Float_To_Float<OpSize::i64Bit, OpSize::i32Bit>},\n  {0x5B, 1, &OpDispatchBuilder::Vector_CVT_Float_To_Int<OpSize::i32Bit, false>},\n  {0x5C, 1, &OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFSUBSCALARINSERT, OpSize::i32Bit>},\n  {0x5D, 1, &OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFMINSCALARINSERT, OpSize::i32Bit>},\n  {0x5E, 1, &OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFDIVSCALARINSERT, OpSize::i32Bit>},\n  {0x5F, 1, &OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFMAXSCALARINSERT, OpSize::i32Bit>},\n  {0x6F, 1, &OpDispatchBuilder::MOVVectorUnalignedOp},\n  {0x70, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSHUFWOp, false>},\n  {0x7E, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVQOp, OpDispatchBuilder::VectorOpType::SSE>},\n  {0x7F, 1, &OpDispatchBuilder::MOVVectorUnalignedOp},\n  {0xB8, 1, &OpDispatchBuilder::PopcountOp},\n  {0xBC, 1, &OpDispatchBuilder::TZCNT},\n  {0xBD, 1, &OpDispatchBuilder::LZCNT},\n  {0xC2, 1, &OpDispatchBuilder::InsertScalarFCMPOp<OpSize::i32Bit>},\n  {0xD6, 1, &OpDispatchBuilder::MOVQ2DQ<true>},\n  {0xE6, 1, &OpDispatchBuilder::Vector_CVT_Int_To_Float<OpSize::i32Bit, true>},\n};\n\nconstexpr DispatchTableEntry OpDispatch_SecondaryRepNEModTables[] = {\n  {0x10, 2, &OpDispatchBuilder::MOVSDOp},\n  {0x12, 1, &OpDispatchBuilder::MOVDDUPOp},\n  {0x2A, 1, &OpDispatchBuilder::InsertCVTGPR_To_FPR<OpSize::i64Bit>},\n  {0x2B, 1, &OpDispatchBuilder::MOVVectorNTOp},\n  {0x2C, 1, &OpDispatchBuilder::CVTFPR_To_GPR<OpSize::i64Bit, false>},\n  {0x2D, 1, &OpDispatchBuilder::CVTFPR_To_GPR<OpSize::i64Bit, true>},\n  {0x51, 1, &OpDispatchBuilder::VectorScalarUnaryInsertALUOp<IR::OP_VFSQRTSCALARINSERT, OpSize::i64Bit>},\n  // x52 = Invalid\n  {0x58, 1, &OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFADDSCALARINSERT, OpSize::i64Bit>},\n  {0x59, 1, &OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFMULSCALARINSERT, OpSize::i64Bit>},\n  {0x5A, 1, &OpDispatchBuilder::InsertScalar_CVT_Float_To_Float<OpSize::i32Bit, OpSize::i64Bit>},\n  {0x5C, 1, &OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFSUBSCALARINSERT, OpSize::i64Bit>},\n  {0x5D, 1, &OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFMINSCALARINSERT, OpSize::i64Bit>},\n  {0x5E, 1, &OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFDIVSCALARINSERT, OpSize::i64Bit>},\n  {0x5F, 1, &OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFMAXSCALARINSERT, OpSize::i64Bit>},\n  {0x70, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSHUFWOp, true>},\n  {0x78, 1, &OpDispatchBuilder::Insertq_imm},\n  {0x79, 1, &OpDispatchBuilder::Insertq},\n  {0x7C, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFADDP, OpSize::i32Bit>},\n  {0x7D, 1, &OpDispatchBuilder::HSUBP<OpSize::i32Bit>},\n  {0xD0, 1, &OpDispatchBuilder::ADDSUBPOp<OpSize::i32Bit>},\n  {0xD6, 1, &OpDispatchBuilder::MOVQ2DQ<false>},\n  {0xC2, 1, &OpDispatchBuilder::InsertScalarFCMPOp<OpSize::i64Bit>},\n  {0xE6, 1, &OpDispatchBuilder::Vector_CVT_Float_To_Int<OpSize::i64Bit, true>},\n  {0xF0, 1, &OpDispatchBuilder::MOVVectorUnalignedOp},\n};\n\nconstexpr DispatchTableEntry OpDispatch_SecondaryOpSizeModTables[] = {\n  {0x10, 2, &OpDispatchBuilder::MOVVectorUnalignedOp},\n  {0x12, 2, &OpDispatchBuilder::MOVLPOp},\n  {0x14, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKLOp, OpSize::i64Bit>},\n  {0x15, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKHOp, OpSize::i64Bit>},\n  {0x16, 2, &OpDispatchBuilder::MOVHPDOp},\n  {0x28, 2, &OpDispatchBuilder::MOVVectorAlignedOp},\n  {0x2A, 1, &OpDispatchBuilder::MMX_To_XMM_Vector_CVT_Int_To_Float},\n  {0x2B, 1, &OpDispatchBuilder::MOVVectorNTOp},\n  {0x2C, 1, &OpDispatchBuilder::XMM_To_MMX_Vector_CVT_Float_To_Int<OpSize::i64Bit, false>},\n  {0x2D, 1, &OpDispatchBuilder::XMM_To_MMX_Vector_CVT_Float_To_Int<OpSize::i64Bit, true>},\n  {0x2E, 2, &OpDispatchBuilder::UCOMISxOp<OpSize::i64Bit>},\n\n  {0x50, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVMSKOp, OpSize::i64Bit>},\n  {0x51, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorUnaryOp, IR::OP_VFSQRT, OpSize::i64Bit>},\n  {0x54, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VAND, OpSize::i128Bit>},\n  {0x55, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUROp, IR::OP_VANDN, OpSize::i64Bit>},\n  {0x56, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VOR, OpSize::i128Bit>},\n  {0x57, 1, &OpDispatchBuilder::VectorXOROp},\n  {0x58, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFADD, OpSize::i64Bit>},\n  {0x59, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFMUL, OpSize::i64Bit>},\n  {0x5A, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Vector_CVT_Float_To_Float, OpSize::i32Bit, OpSize::i64Bit, false>},\n  {0x5B, 1, &OpDispatchBuilder::Vector_CVT_Float_To_Int<OpSize::i32Bit, true>},\n  {0x5C, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFSUB, OpSize::i64Bit>},\n  {0x5D, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFMIN, OpSize::i64Bit>},\n  {0x5E, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFDIV, OpSize::i64Bit>},\n  {0x5F, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFMAX, OpSize::i64Bit>},\n  {0x60, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKLOp, OpSize::i8Bit>},\n  {0x61, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKLOp, OpSize::i16Bit>},\n  {0x62, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKLOp, OpSize::i32Bit>},\n  {0x63, 1, &OpDispatchBuilder::PACKSSOp<OpSize::i16Bit>},\n  {0x64, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VCMPGT, OpSize::i8Bit>},\n  {0x65, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VCMPGT, OpSize::i16Bit>},\n  {0x66, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VCMPGT, OpSize::i32Bit>},\n  {0x67, 1, &OpDispatchBuilder::PACKUSOp<OpSize::i16Bit>},\n  {0x68, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKHOp, OpSize::i8Bit>},\n  {0x69, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKHOp, OpSize::i16Bit>},\n  {0x6A, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKHOp, OpSize::i32Bit>},\n  {0x6B, 1, &OpDispatchBuilder::PACKSSOp<OpSize::i32Bit>},\n  {0x6C, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKLOp, OpSize::i64Bit>},\n  {0x6D, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PUNPCKHOp, OpSize::i64Bit>},\n  {0x6E, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVBetweenGPR_FPR, OpDispatchBuilder::VectorOpType::SSE>},\n  {0x6F, 1, &OpDispatchBuilder::MOVVectorAlignedOp},\n  {0x70, 1, &OpDispatchBuilder::PSHUFDOp},\n\n  {0x74, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VCMPEQ, OpSize::i8Bit>},\n  {0x75, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VCMPEQ, OpSize::i16Bit>},\n  {0x76, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VCMPEQ, OpSize::i32Bit>},\n  {0x78, 1, nullptr}, // GROUP 17\n  {0x79, 1, &OpDispatchBuilder::Extrq},\n  {0x7C, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFADDP, OpSize::i64Bit>},\n  {0x7D, 1, &OpDispatchBuilder::HSUBP<OpSize::i64Bit>},\n  {0x7E, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVBetweenGPR_FPR, OpDispatchBuilder::VectorOpType::SSE>},\n  {0x7F, 1, &OpDispatchBuilder::MOVVectorAlignedOp},\n  {0xC2, 1, &OpDispatchBuilder::VFCMPOp<OpSize::i64Bit>},\n  {0xC4, 1, &OpDispatchBuilder::PINSROp<OpSize::i16Bit>},\n  {0xC5, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PExtrOp, OpSize::i16Bit>},\n  {0xC6, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::SHUFOp, OpSize::i64Bit>},\n\n  {0xD0, 1, &OpDispatchBuilder::ADDSUBPOp<OpSize::i64Bit>},\n  {0xD1, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRLDOp, OpSize::i16Bit>},\n  {0xD2, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRLDOp, OpSize::i32Bit>},\n  {0xD3, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRLDOp, OpSize::i64Bit>},\n  {0xD4, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VADD, OpSize::i64Bit>},\n  {0xD5, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VMUL, OpSize::i16Bit>},\n  {0xD6, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVQOp, OpDispatchBuilder::VectorOpType::SSE>},\n  {0xD7, 1, &OpDispatchBuilder::MOVMSKOpOne}, // PMOVMSKB\n  {0xD8, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUQSUB, OpSize::i8Bit>},\n  {0xD9, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUQSUB, OpSize::i16Bit>},\n  {0xDA, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUMIN, OpSize::i8Bit>},\n  {0xDB, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VAND, OpSize::i128Bit>},\n  {0xDC, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUQADD, OpSize::i8Bit>},\n  {0xDD, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUQADD, OpSize::i16Bit>},\n  {0xDE, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VUMAX, OpSize::i8Bit>},\n  {0xDF, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUROp, IR::OP_VANDN, OpSize::i64Bit>},\n  {0xE0, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VURAVG, OpSize::i8Bit>},\n  {0xE1, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRAOp, OpSize::i16Bit>},\n  {0xE2, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSRAOp, OpSize::i32Bit>},\n  {0xE3, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VURAVG, OpSize::i16Bit>},\n  {0xE4, 1, &OpDispatchBuilder::PMULHW<false>},\n  {0xE5, 1, &OpDispatchBuilder::PMULHW<true>},\n  {0xE6, 1, &OpDispatchBuilder::Vector_CVT_Float_To_Int<OpSize::i64Bit, false>},\n  {0xE7, 1, &OpDispatchBuilder::MOVVectorNTOp},\n  {0xE8, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSQSUB, OpSize::i8Bit>},\n  {0xE9, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSQSUB, OpSize::i16Bit>},\n  {0xEA, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSMIN, OpSize::i16Bit>},\n  {0xEB, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VOR, OpSize::i128Bit>},\n  {0xEC, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSQADD, OpSize::i8Bit>},\n  {0xED, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSQADD, OpSize::i16Bit>},\n  {0xEE, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSMAX, OpSize::i16Bit>},\n  {0xEF, 1, &OpDispatchBuilder::VectorXOROp},\n\n  {0xF1, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSLL, OpSize::i16Bit>},\n  {0xF2, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSLL, OpSize::i32Bit>},\n  {0xF3, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSLL, OpSize::i64Bit>},\n  {0xF4, 1, &OpDispatchBuilder::PMULLOp<OpSize::i32Bit, false>},\n  {0xF5, 1, &OpDispatchBuilder::PMADDWD},\n  {0xF6, 1, &OpDispatchBuilder::PSADBW},\n  {0xF7, 1, &OpDispatchBuilder::MASKMOVOp},\n  {0xF8, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSUB, OpSize::i8Bit>},\n  {0xF9, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSUB, OpSize::i16Bit>},\n  {0xFA, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSUB, OpSize::i32Bit>},\n  {0xFB, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VSUB, OpSize::i64Bit>},\n  {0xFC, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VADD, OpSize::i8Bit>},\n  {0xFD, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VADD, OpSize::i16Bit>},\n  {0xFE, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VADD, OpSize::i32Bit>},\n};\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher/VEXTables.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include \"Interface/Core/OpcodeDispatcher.h\"\n\nnamespace FEXCore::IR {\n#define OPD(map_select, pp, opcode) (((map_select - 1) << 10) | (pp << 8) | (opcode))\nconstexpr DispatchTableEntry OpDispatch_VEXTable[] = {\n  {OPD(2, 0b00, 0xF2), 1, &OpDispatchBuilder::ANDNBMIOp}, {OPD(2, 0b00, 0xF5), 1, &OpDispatchBuilder::BZHI},\n  {OPD(2, 0b10, 0xF5), 1, &OpDispatchBuilder::PEXT},      {OPD(2, 0b11, 0xF5), 1, &OpDispatchBuilder::PDEP},\n  {OPD(2, 0b11, 0xF6), 1, &OpDispatchBuilder::MULX},      {OPD(2, 0b00, 0xF7), 1, &OpDispatchBuilder::BEXTRBMIOp},\n  {OPD(2, 0b01, 0xF7), 1, &OpDispatchBuilder::BMI2Shift}, {OPD(2, 0b10, 0xF7), 1, &OpDispatchBuilder::BMI2Shift},\n  {OPD(2, 0b11, 0xF7), 1, &OpDispatchBuilder::BMI2Shift},\n\n  {OPD(3, 0b11, 0xF0), 1, &OpDispatchBuilder::RORX},\n};\n#undef OPD\n\n#define OPD(group, pp, opcode) (((group - X86Tables::InstType::TYPE_VEX_GROUP_12) << 4) | (pp << 3) | (opcode))\nconstexpr DispatchTableEntry OpDispatch_VEXGroupTable[] = {\n  {OPD(X86Tables::InstType::TYPE_VEX_GROUP_17, 0, 0b001), 1, &OpDispatchBuilder::BLSRBMIOp},\n  {OPD(X86Tables::InstType::TYPE_VEX_GROUP_17, 0, 0b010), 1, &OpDispatchBuilder::BLSMSKBMIOp},\n  {OPD(X86Tables::InstType::TYPE_VEX_GROUP_17, 0, 0b011), 1, &OpDispatchBuilder::BLSIBMIOp},\n};\n#undef OPD\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-to-ir, opcodes|dispatcher-implementations\ndesc: Handles x86/64 Vector instructions to IR\n$end_info$\n*/\n\n#include \"Interface/Context/Context.h\"\n#include \"Interface/Core/OpcodeDispatcher.h\"\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/IR/IR.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Utils/LogManager.h>\n\n#include <array>\n#include <bit>\n#include <cstdint>\n#include <stddef.h>\n\nnamespace FEXCore::IR {\n#define OpcodeArgs [[maybe_unused]] FEXCore::X86Tables::DecodedOp Op\n\nvoid OpDispatchBuilder::MOVVectorAlignedOp(OpcodeArgs) {\n  if (Op->Dest.IsGPR() && Op->Src[0].IsGPR() && Op->Dest.Data.GPR.GPR == Op->Src[0].Data.GPR.GPR) {\n    // Nop\n    return;\n  }\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  StoreResultFPR(Op, Src);\n}\n\nvoid OpDispatchBuilder::MOVVectorUnalignedOp(OpcodeArgs) {\n  if (Op->Dest.IsGPR() && Op->Src[0].IsGPR() && Op->Dest.Data.GPR.GPR == Op->Src[0].Data.GPR.GPR) {\n    // Nop\n    return;\n  }\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags, {.Align = OpSize::i8Bit});\n  StoreResultFPR(Op, Src, OpSize::i8Bit);\n}\n\nvoid OpDispatchBuilder::MOVVectorNTOp(OpcodeArgs) {\n  const auto Size = OpSizeFromDst(Op);\n\n  if (Op->Dest.IsGPR() && Size >= OpSize::i128Bit) {\n    ///< MOVNTDQA load non-temporal comes from SSE4.1 and is extended by AVX/AVX2.\n    Ref SrcAddr = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.LoadData = false});\n    auto Src = _VLoadNonTemporal(Size, SrcAddr, 0);\n\n    StoreResultFPR(Op, Src, OpSize::i8Bit, MemoryAccessType::STREAM);\n  } else if (Op->Dest.IsGPR()) {\n    Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags, {.Align = OpSize::i8Bit, .AccessType = MemoryAccessType::STREAM});\n    StoreResultFPR(Op, Src, OpSize::i8Bit, MemoryAccessType::STREAM);\n  } else {\n    LOGMAN_THROW_A_FMT(!Op->Dest.IsGPR(), \"Destination can't be GPR for non-temporal stores\");\n    Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags, {.Align = OpSize::i8Bit, .AccessType = MemoryAccessType::STREAM});\n    if (Size < OpSize::i128Bit) {\n      // Normal streaming store if less than 128-bit\n      // XMM Scalar 32-bit and 64-bit comes from SSE4a MOVNTSS, MOVNTSD\n      // MMX 64-bit comes from MOVNTQ\n      StoreResultFPR(Op, Src, OpSize::i8Bit, MemoryAccessType::STREAM);\n    } else {\n      Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.LoadData = false});\n\n      // Single store non-temporal for larger operations.\n      _VStoreNonTemporal(Size, Src, Dest, 0);\n    }\n  }\n}\n\nvoid OpDispatchBuilder::VMOVAPS_VMOVAPDOp(OpcodeArgs) {\n  const auto SrcSize = GetSrcSize(Op);\n  const auto Is128Bit = SrcSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  if (Is128Bit && Op->Dest.IsGPR()) {\n    Src = VZeroExtendOperand(OpSize::i128Bit, Op->Src[0], Src);\n  }\n  StoreResultFPR(Op, Src);\n}\n\nvoid OpDispatchBuilder::VMOVUPS_VMOVUPDOp(OpcodeArgs) {\n  const auto SrcSize = GetSrcSize(Op);\n  const auto Is128Bit = SrcSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags, {.Align = OpSize::i8Bit});\n\n  if (Is128Bit && Op->Dest.IsGPR()) {\n    Src = VZeroExtendOperand(OpSize::i128Bit, Op->Src[0], Src);\n  }\n  StoreResultFPR(Op, Src, OpSize::i8Bit);\n}\n\nvoid OpDispatchBuilder::MOVHPDOp(OpcodeArgs) {\n  if (Op->Dest.IsGPR()) {\n    if (Op->Src[0].IsGPR()) {\n      // MOVLHPS between two vector registers.\n      Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n      Ref Dest = LoadSourceFPR_WithOpSize(Op, Op->Dest, OpSize::i128Bit, Op->Flags);\n      auto Result = _VInsElement(OpSize::i128Bit, OpSize::i64Bit, 1, 0, Dest, Src);\n      StoreResultFPR(Op, Result);\n    } else {\n      // If the destination is a GPR then the source is memory\n      // xmm1[127:64] = src\n      Ref Src = MakeSegmentAddress(Op, Op->Src[0]);\n      Ref Dest = LoadSourceFPR_WithOpSize(Op, Op->Dest, OpSize::i128Bit, Op->Flags);\n      auto Result = _VLoadVectorElement(OpSize::i128Bit, OpSize::i64Bit, Dest, 1, Src);\n      StoreResultFPR(Op, Result);\n    }\n  } else {\n    // In this case memory is the destination and the high bits of the XMM are source\n    // Mem64 = xmm1[127:64]\n    Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    Ref Dest = MakeSegmentAddress(Op, Op->Dest);\n    _VStoreVectorElement(OpSize::i128Bit, OpSize::i64Bit, Src, 1, Dest);\n  }\n}\n\nvoid OpDispatchBuilder::VMOVHPOp(OpcodeArgs) {\n  if (Op->Dest.IsGPR()) {\n    Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags, {.Align = OpSize::i128Bit});\n    Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags, {.Align = OpSize::i64Bit});\n    Ref Result = _VInsElement(OpSize::i128Bit, OpSize::i64Bit, 1, 0, Src1, Src2);\n\n    StoreResultFPR(Op, Result);\n  } else {\n    Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags, {.Align = OpSize::i128Bit});\n    Ref Result = _VInsElement(OpSize::i128Bit, OpSize::i64Bit, 0, 1, Src, Src);\n    StoreResultFPR_WithOpSize(Op, Op->Dest, Result, OpSize::i64Bit, OpSize::i64Bit);\n  }\n}\n\nvoid OpDispatchBuilder::MOVLPOp(OpcodeArgs) {\n  if (Op->Dest.IsGPR()) {\n    // xmm, xmm is movhlps special case\n    if (Op->Src[0].IsGPR()) {\n      Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags, {.Align = OpSize::i128Bit});\n      Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags, {.Align = OpSize::i128Bit});\n      auto Result = _VInsElement(OpSize::i128Bit, OpSize::i64Bit, 0, 1, Dest, Src);\n      StoreResultFPR_WithOpSize(Op, Op->Dest, Result, OpSize::i128Bit, OpSize::i128Bit);\n    } else {\n      const auto DstSize = OpSizeFromDst(Op);\n      Ref Src = MakeSegmentAddress(Op, Op->Src[0]);\n      Ref Dest = LoadSourceFPR_WithOpSize(Op, Op->Dest, DstSize, Op->Flags);\n      auto Result = _VLoadVectorElement(OpSize::i128Bit, OpSize::i64Bit, Dest, 0, Src);\n      StoreResultFPR(Op, Result);\n    }\n  } else {\n    Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags, {.Align = OpSize::i64Bit});\n    StoreResultFPR_WithOpSize(Op, Op->Dest, Src, OpSize::i64Bit, OpSize::i64Bit);\n  }\n}\n\nvoid OpDispatchBuilder::VMOVLPOp(OpcodeArgs) {\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags, {.Align = OpSize::i128Bit});\n\n  if (!Op->Dest.IsGPR()) {\n    ///< VMOVLPS/PD mem64, xmm1\n    StoreResultFPR_WithOpSize(Op, Op->Dest, Src1, OpSize::i64Bit, OpSize::i64Bit);\n  } else if (!Op->Src[1].IsGPR()) {\n    ///< VMOVLPS/PD xmm1, xmm2, mem64\n    // Bits[63:0] come from Src2[63:0]\n    // Bits[127:64] come from Src1[127:64]\n    Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags, {.Align = OpSize::i64Bit});\n    Ref Result = _VInsElement(OpSize::i128Bit, OpSize::i64Bit, 1, 1, Src2, Src1);\n    StoreResultFPR(Op, Result);\n  } else {\n    ///< VMOVHLPS/PD xmm1, xmm2, xmm3\n    Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags, {.Align = OpSize::i128Bit});\n    Ref Result = _VInsElement(OpSize::i128Bit, OpSize::i64Bit, 0, 1, Src1, Src2);\n    StoreResultFPR(Op, Result);\n  }\n}\n\nvoid OpDispatchBuilder::VMOVSHDUPOp(OpcodeArgs) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = _VTrn2(SrcSize, OpSize::i32Bit, Src, Src);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VMOVSLDUPOp(OpcodeArgs) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = _VTrn(SrcSize, OpSize::i32Bit, Src, Src);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::MOVScalarOpImpl(OpcodeArgs, IR::OpSize ElementSize) {\n  if (Op->Dest.IsGPR() && Op->Src[0].IsGPR()) {\n    // MOVSS/SD xmm1, xmm2\n    Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n    Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    auto Result = _VInsElement(OpSize::i128Bit, ElementSize, 0, 0, Dest, Src);\n    StoreResultFPR(Op, Result);\n  } else if (Op->Dest.IsGPR()) {\n    // MOVSS/SD xmm1, mem32/mem64\n    // xmm1[127:0] <- zext(mem32/mem64)\n    Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], ElementSize, Op->Flags);\n    StoreResultFPR(Op, Src);\n  } else {\n    // MOVSS/SD mem32/mem64, xmm1\n    Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    StoreResultFPR_WithOpSize(Op, Op->Dest, Src, ElementSize);\n  }\n}\n\nvoid OpDispatchBuilder::MOVSSOp(OpcodeArgs) {\n  MOVScalarOpImpl(Op, OpSize::i32Bit);\n}\n\nvoid OpDispatchBuilder::MOVSDOp(OpcodeArgs) {\n  MOVScalarOpImpl(Op, OpSize::i64Bit);\n}\n\nvoid OpDispatchBuilder::VMOVScalarOpImpl(OpcodeArgs, IR::OpSize ElementSize) {\n  if (Op->Dest.IsGPR() && Op->Src[0].IsGPR() && Op->Src[1].IsGPR()) {\n    // VMOVSS/SD xmm1, xmm2, xmm3\n    Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n    Ref Result = _VInsElement(OpSize::i128Bit, ElementSize, 0, 0, Src1, Src2);\n    StoreResultFPR(Op, Result);\n  } else if (Op->Dest.IsGPR()) {\n    // VMOVSS/SD xmm1, mem32/mem64\n    Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[1], ElementSize, Op->Flags);\n    StoreResultFPR(Op, Src);\n  } else {\n    // VMOVSS/SD mem32/mem64, xmm1\n    Ref Src = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n    StoreResultFPR_WithOpSize(Op, Op->Dest, Src, ElementSize);\n  }\n}\n\nvoid OpDispatchBuilder::VMOVSDOp(OpcodeArgs) {\n  VMOVScalarOpImpl(Op, OpSize::i64Bit);\n}\n\nvoid OpDispatchBuilder::VMOVSSOp(OpcodeArgs) {\n  VMOVScalarOpImpl(Op, OpSize::i32Bit);\n}\n\nvoid OpDispatchBuilder::VectorALUOp(OpcodeArgs, IROps IROp, IR::OpSize ElementSize) {\n  const auto Size = OpSizeFromSrc(Op);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n\n  DeriveOp(ALUOp, IROp, _VAdd(Size, ElementSize, Dest, Src));\n\n  StoreResultFPR(Op, ALUOp);\n}\n\nvoid OpDispatchBuilder::VectorXOROp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  // Special case for vector xor with itself being the optimal way for x86 to zero vector registers.\n  if (Op->Dest.IsGPR() && Op->Src[0].IsGPR() && Op->Dest.Data.GPR.GPR == Op->Src[0].Data.GPR.GPR) {\n    const auto ZeroRegister = LoadZeroVector(Size);\n    StoreResultFPR(Op, ZeroRegister);\n    return;\n  }\n\n  ///< Regular code path\n  VectorALUOp(Op, OP_VXOR, Size);\n}\n\nvoid OpDispatchBuilder::AVXVectorALUOp(OpcodeArgs, IROps IROp, IR::OpSize ElementSize) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  DeriveOp(ALUOp, IROp, _VAdd(Size, ElementSize, Src1, Src2));\n\n  StoreResultFPR(Op, ALUOp);\n}\n\nvoid OpDispatchBuilder::AVXVectorXOROp(OpcodeArgs) {\n  // Special case for vector xor with itself being the optimal way for x86 to zero vector registers.\n  if (Op->Src[0].IsGPR() && Op->Src[1].IsGPR() && Op->Src[0].Data.GPR.GPR == Op->Src[1].Data.GPR.GPR) {\n    const auto DstSize = OpSizeFromDst(Op);\n    const auto ZeroRegister = LoadZeroVector(DstSize);\n    StoreResultFPR(Op, ZeroRegister);\n    return;\n  }\n\n  ///< Regular code path\n  AVXVectorALUOp(Op, OP_VXOR, OpSize::i128Bit);\n}\n\nvoid OpDispatchBuilder::VectorALUROp(OpcodeArgs, IROps IROp, IR::OpSize ElementSize) {\n  const auto Size = OpSizeFromSrc(Op);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n\n  DeriveOp(ALUOp, IROp, _VAdd(Size, ElementSize, Src, Dest));\n\n  StoreResultFPR(Op, ALUOp);\n}\n\nRef OpDispatchBuilder::VectorScalarInsertALUOpImpl(OpcodeArgs, IROps IROp, IR::OpSize DstSize, IR::OpSize ElementSize,\n                                                   const X86Tables::DecodedOperand& Src1Op, const X86Tables::DecodedOperand& Src2Op,\n                                                   bool ZeroUpperBits) {\n  // We load the full vector width when dealing with a source vector,\n  // so that we don't do any unnecessary zero extension to the scalar\n  // element that we're going to operate on.\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  Ref Src1 = LoadSourceFPR_WithOpSize(Op, Src1Op, DstSize, Op->Flags);\n  Ref Src2 = LoadSourceFPR_WithOpSize(Op, Src2Op, SrcSize, Op->Flags, {.AllowUpperGarbage = true});\n\n  // If OpSize == ElementSize then it only does the lower scalar op\n  DeriveOp(ALUOp, IROp, _VFAddScalarInsert(DstSize, ElementSize, Src1, Src2, ZeroUpperBits));\n  return ALUOp;\n}\n\ntemplate<IROps IROp, IR::OpSize ElementSize>\nvoid OpDispatchBuilder::VectorScalarInsertALUOp(OpcodeArgs) {\n  const auto DstSize = GetGuestVectorLength();\n  auto Result = VectorScalarInsertALUOpImpl(Op, IROp, DstSize, ElementSize, Op->Dest, Op->Src[0], false);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, DstSize);\n}\n\ntemplate void OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFADDSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFADDSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFSUBSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFSUBSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFMULSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFMULSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFDIVSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFDIVSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFMINSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFMINSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFMAXSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFMAXSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\n\ntemplate<IROps IROp, IR::OpSize ElementSize>\nvoid OpDispatchBuilder::AVXVectorScalarInsertALUOp(OpcodeArgs) {\n  const auto DstSize = GetGuestVectorLength();\n  auto Result = VectorScalarInsertALUOpImpl(Op, IROp, DstSize, ElementSize, Op->Src[0], Op->Src[1], true);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, DstSize);\n}\n\ntemplate void OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFADDSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFADDSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFSUBSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFSUBSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFMULSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFMULSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFDIVSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFDIVSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFMINSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFMINSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFMAXSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFMAXSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\n\nRef OpDispatchBuilder::VectorScalarUnaryInsertALUOpImpl(OpcodeArgs, IROps IROp, IR::OpSize DstSize, IR::OpSize ElementSize,\n                                                        const X86Tables::DecodedOperand& Src1Op, const X86Tables::DecodedOperand& Src2Op,\n                                                        bool ZeroUpperBits) {\n  // We load the full vector width when dealing with a source vector,\n  // so that we don't do any unnecessary zero extension to the scalar\n  // element that we're going to operate on.\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  Ref Src1 = LoadSourceFPR_WithOpSize(Op, Src1Op, DstSize, Op->Flags);\n  Ref Src2 = LoadSourceFPR_WithOpSize(Op, Src2Op, SrcSize, Op->Flags, {.AllowUpperGarbage = true});\n\n  // If OpSize == ElementSize then it only does the lower scalar op\n  DeriveOp(ALUOp, IROp, _VFSqrtScalarInsert(DstSize, ElementSize, Src1, Src2, ZeroUpperBits));\n  return ALUOp;\n}\n\ntemplate<IROps IROp, IR::OpSize ElementSize>\nvoid OpDispatchBuilder::VectorScalarUnaryInsertALUOp(OpcodeArgs) {\n  const auto DstSize = GetGuestVectorLength();\n  auto Result = VectorScalarInsertALUOpImpl(Op, IROp, DstSize, ElementSize, Op->Dest, Op->Src[0], false);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, DstSize);\n}\n\ntemplate void OpDispatchBuilder::VectorScalarUnaryInsertALUOp<IR::OP_VFSQRTSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorScalarUnaryInsertALUOp<IR::OP_VFSQRTSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\n\ntemplate void OpDispatchBuilder::VectorScalarUnaryInsertALUOp<IR::OP_VFRSQRTSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorScalarUnaryInsertALUOp<IR::OP_VFRSQRTSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\n\ntemplate void OpDispatchBuilder::VectorScalarUnaryInsertALUOp<IR::OP_VFRECPSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorScalarUnaryInsertALUOp<IR::OP_VFRECPSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\n\ntemplate<IROps IROp, IR::OpSize ElementSize>\nvoid OpDispatchBuilder::AVXVectorScalarUnaryInsertALUOp(OpcodeArgs) {\n  const auto DstSize = GetGuestVectorLength();\n  auto Result = VectorScalarInsertALUOpImpl(Op, IROp, DstSize, ElementSize, Op->Src[0], Op->Src[1], true);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, DstSize);\n}\n\ntemplate void OpDispatchBuilder::AVXVectorScalarUnaryInsertALUOp<IR::OP_VFSQRTSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVectorScalarUnaryInsertALUOp<IR::OP_VFSQRTSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\n\ntemplate void OpDispatchBuilder::AVXVectorScalarUnaryInsertALUOp<IR::OP_VFRSQRTSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVectorScalarUnaryInsertALUOp<IR::OP_VFRSQRTSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\n\ntemplate void OpDispatchBuilder::AVXVectorScalarUnaryInsertALUOp<IR::OP_VFRECPSCALARINSERT, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVectorScalarUnaryInsertALUOp<IR::OP_VFRECPSCALARINSERT, OpSize::i64Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::InsertMMX_To_XMM_Vector_CVT_Int_To_Float(OpcodeArgs) {\n  // We load the full vector width when dealing with a source vector,\n  // so that we don't do any unnecessary zero extension to the scalar\n  // element that we're going to operate on.\n  const auto DstSize = GetGuestVectorLength();\n  const auto SrcSize = Op->Src[0].IsGPR() ? OpSize::i64Bit : OpSizeFromSrc(Op);\n\n  Ref Dest = LoadSourceFPR_WithOpSize(Op, Op->Dest, DstSize, Op->Flags);\n  Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags);\n\n  // Always 32-bit.\n  const auto ElementSize = OpSize::i32Bit;\n  // Always signed\n  Dest = _VSToFVectorInsert(DstSize, ElementSize, ElementSize, Dest, Src, true, false);\n\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Dest, DstSize);\n}\n\nRef OpDispatchBuilder::InsertCVTGPR_To_FPRImpl(OpcodeArgs, IR::OpSize DstSize, IR::OpSize DstElementSize, const X86Tables::DecodedOperand& Src1Op,\n                                               const X86Tables::DecodedOperand& Src2Op, bool ZeroUpperBits) {\n  // We load the full vector width when dealing with a source vector,\n  // so that we don't do any unnecessary zero extension to the scalar\n  // element that we're going to operate on.\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  Ref Src1 = LoadSourceFPR_WithOpSize(Op, Src1Op, DstSize, Op->Flags);\n\n  if (Src2Op.IsGPR()) {\n    // If the source is a GPR then convert directly from the GPR.\n    auto Src2 = LoadSourceGPR_WithOpSize(Op, Src2Op, GetGPROpSize(), Op->Flags);\n    return _VSToFGPRInsert(DstSize, DstElementSize, SrcSize, Src1, Src2, ZeroUpperBits);\n  } else if (SrcSize != DstElementSize) {\n    // If the source is from memory but the Source size and destination size aren't the same,\n    // then it is more optimal to load in to a GPR and convert between GPR->FPR.\n    // ARM GPR->FPR conversion supports different size source and destinations while FPR->FPR doesn't.\n    auto Src2 = LoadSourceGPR(Op, Src2Op, Op->Flags);\n    return _VSToFGPRInsert(DstSize, DstElementSize, SrcSize, Src1, Src2, ZeroUpperBits);\n  }\n\n  // In the case of cvtsi2s{s,d} where the source and destination are the same size,\n  // then it is more optimal to load in to the FPR register directly and convert there.\n  auto Src2 = LoadSourceFPR(Op, Src2Op, Op->Flags);\n  // Always signed\n  return _VSToFVectorInsert(DstSize, DstElementSize, DstElementSize, Src1, Src2, false, ZeroUpperBits);\n}\n\ntemplate<IR::OpSize DstElementSize>\nvoid OpDispatchBuilder::InsertCVTGPR_To_FPR(OpcodeArgs) {\n  const auto DstSize = GetGuestVectorLength();\n  auto Result = InsertCVTGPR_To_FPRImpl(Op, DstSize, DstElementSize, Op->Dest, Op->Src[0], false);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, DstSize);\n}\n\ntemplate void OpDispatchBuilder::InsertCVTGPR_To_FPR<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::InsertCVTGPR_To_FPR<OpSize::i64Bit>(OpcodeArgs);\n\ntemplate<IR::OpSize DstElementSize>\nvoid OpDispatchBuilder::AVXInsertCVTGPR_To_FPR(OpcodeArgs) {\n  const auto DstSize = GetGuestVectorLength();\n  Ref Result = InsertCVTGPR_To_FPRImpl(Op, DstSize, DstElementSize, Op->Src[0], Op->Src[1], true);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, DstSize);\n}\ntemplate void OpDispatchBuilder::AVXInsertCVTGPR_To_FPR<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXInsertCVTGPR_To_FPR<OpSize::i64Bit>(OpcodeArgs);\n\nRef OpDispatchBuilder::InsertScalar_CVT_Float_To_FloatImpl(OpcodeArgs, IR::OpSize DstSize, IR::OpSize DstElementSize,\n                                                           IR::OpSize SrcElementSize, const X86Tables::DecodedOperand& Src1Op,\n                                                           const X86Tables::DecodedOperand& Src2Op, bool ZeroUpperBits) {\n\n  // We load the full vector width when dealing with a source vector,\n  // so that we don't do any unnecessary zero extension to the scalar\n  // element that we're going to operate on.\n  const auto SrcSize = Src2Op.IsGPR() ? OpSize::i128Bit : SrcElementSize;\n\n  Ref Src1 = LoadSourceFPR_WithOpSize(Op, Src1Op, DstSize, Op->Flags);\n  Ref Src2 = LoadSourceFPR_WithOpSize(Op, Src2Op, SrcSize, Op->Flags, {.AllowUpperGarbage = true});\n\n  return _VFToFScalarInsert(DstSize, DstElementSize, SrcElementSize, Src1, Src2, ZeroUpperBits);\n}\n\ntemplate<IR::OpSize DstElementSize, IR::OpSize SrcElementSize>\nvoid OpDispatchBuilder::InsertScalar_CVT_Float_To_Float(OpcodeArgs) {\n  const auto DstSize = GetGuestVectorLength();\n  Ref Result = InsertScalar_CVT_Float_To_FloatImpl(Op, DstSize, DstElementSize, SrcElementSize, Op->Dest, Op->Src[0], false);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, DstSize);\n}\n\ntemplate void OpDispatchBuilder::InsertScalar_CVT_Float_To_Float<OpSize::i32Bit, OpSize::i64Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::InsertScalar_CVT_Float_To_Float<OpSize::i64Bit, OpSize::i32Bit>(OpcodeArgs);\n\ntemplate<IR::OpSize DstElementSize, IR::OpSize SrcElementSize>\nvoid OpDispatchBuilder::AVXInsertScalar_CVT_Float_To_Float(OpcodeArgs) {\n  const auto DstSize = GetGuestVectorLength();\n  Ref Result = InsertScalar_CVT_Float_To_FloatImpl(Op, DstSize, DstElementSize, SrcElementSize, Op->Src[0], Op->Src[1], true);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, DstSize);\n}\n\ntemplate void OpDispatchBuilder::AVXInsertScalar_CVT_Float_To_Float<OpSize::i32Bit, OpSize::i64Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXInsertScalar_CVT_Float_To_Float<OpSize::i64Bit, OpSize::i32Bit>(OpcodeArgs);\n\nRoundMode OpDispatchBuilder::TranslateRoundType(uint8_t Mode) {\n  const uint64_t RoundControlSource = (Mode >> 2) & 1;\n  uint64_t RoundControl = Mode & 0b11;\n\n  static constexpr std::array SourceModes = {\n    RoundMode::Nearest,\n    RoundMode::NegInfinity,\n    RoundMode::PosInfinity,\n    RoundMode::TowardsZero,\n  };\n\n  return RoundControlSource ? RoundMode::Host : SourceModes[RoundControl];\n}\n\nRef OpDispatchBuilder::InsertScalarRoundImpl(OpcodeArgs, IR::OpSize DstSize, IR::OpSize ElementSize, const X86Tables::DecodedOperand& Src1Op,\n                                             const X86Tables::DecodedOperand& Src2Op, uint64_t Mode, bool ZeroUpperBits) {\n  // We load the full vector width when dealing with a source vector,\n  // so that we don't do any unnecessary zero extension to the scalar\n  // element that we're going to operate on.\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  Ref Src1 = LoadSourceFPR_WithOpSize(Op, Src1Op, DstSize, Op->Flags);\n  Ref Src2 = LoadSourceFPR_WithOpSize(Op, Src2Op, SrcSize, Op->Flags, {.AllowUpperGarbage = true});\n\n  const auto SourceMode = TranslateRoundType(Mode);\n  auto ALUOp = _VFToIScalarInsert(DstSize, ElementSize, Src1, Src2, SourceMode, ZeroUpperBits);\n\n  return ALUOp;\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::InsertScalarRound(OpcodeArgs) {\n  const uint64_t Mode = Op->Src[1].Literal();\n  const auto DstSize = GetGuestVectorLength();\n\n  Ref Result = InsertScalarRoundImpl(Op, DstSize, ElementSize, Op->Dest, Op->Src[0], Mode, false);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, DstSize);\n}\n\ntemplate void OpDispatchBuilder::InsertScalarRound<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::InsertScalarRound<OpSize::i64Bit>(OpcodeArgs);\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::AVXInsertScalarRound(OpcodeArgs) {\n  const uint64_t Mode = Op->Src[2].Literal();\n  const auto DstSize = GetGuestVectorLength();\n\n  Ref Result = InsertScalarRoundImpl(Op, DstSize, ElementSize, Op->Src[0], Op->Src[1], Mode, true);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, DstSize);\n}\n\ntemplate void OpDispatchBuilder::AVXInsertScalarRound<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXInsertScalarRound<OpSize::i64Bit>(OpcodeArgs);\n\n\nRef OpDispatchBuilder::InsertScalarFCMPOpImpl(OpSize Size, IR::OpSize OpDstSize, IR::OpSize ElementSize, Ref Src1, Ref Src2,\n                                              uint8_t CompType, bool ZeroUpperBits) {\n  switch (static_cast<VectorCompareType>(CompType)) {\n  case VectorCompareType::EQ_OQ:\n  case VectorCompareType::EQ_OS: return _VFCMPScalarInsert(Size, ElementSize, Src1, Src2, FloatCompareOp::EQ, ZeroUpperBits);\n  case VectorCompareType::LT_OS: // GT(Swapped operand)\n  case VectorCompareType::LT_OQ: return _VFCMPScalarInsert(Size, ElementSize, Src1, Src2, FloatCompareOp::LT, ZeroUpperBits);\n  case VectorCompareType::LE_OS: // GE(Swapped operand)\n  case VectorCompareType::LE_OQ: return _VFCMPScalarInsert(Size, ElementSize, Src1, Src2, FloatCompareOp::LE, ZeroUpperBits);\n  case VectorCompareType::UNORD_Q:\n  case VectorCompareType::UNORD_S: return _VFCMPScalarInsert(Size, ElementSize, Src1, Src2, FloatCompareOp::UNO, ZeroUpperBits);\n  case VectorCompareType::NEQ_UQ:\n  case VectorCompareType::NEQ_US: return _VFCMPScalarInsert(Size, ElementSize, Src1, Src2, FloatCompareOp::NEQ, ZeroUpperBits);\n  case VectorCompareType::NLT_US: // NGT(Swapped operand)\n  case VectorCompareType::NLT_UQ: {\n    Ref Result = _VFCMPLT(ElementSize, ElementSize, Src1, Src2);\n    Result = _VNot(ElementSize, ElementSize, Result);\n    // Insert the lower bits\n    return _VInsElement(OpDstSize, ElementSize, 0, 0, Src1, Result);\n  }\n  case VectorCompareType::NLE_US: // NGE(Swapped operand)\n  case VectorCompareType::NLE_UQ: {\n    Ref Result = _VFCMPLE(ElementSize, ElementSize, Src1, Src2);\n    Result = _VNot(ElementSize, ElementSize, Result);\n    // Insert the lower bits\n    return _VInsElement(OpDstSize, ElementSize, 0, 0, Src1, Result);\n  }\n  case VectorCompareType::ORD_Q:\n  case VectorCompareType::ORD_S: return _VFCMPScalarInsert(Size, ElementSize, Src1, Src2, FloatCompareOp::ORD, ZeroUpperBits);\n  case VectorCompareType::NGT_UQ:\n  case VectorCompareType::NGT_US: {\n    Ref Result = _VFCMPLT(ElementSize, ElementSize, Src2, Src1);\n    Result = _VNot(ElementSize, ElementSize, Result);\n    // Insert the lower bits\n    return _VInsElement(OpDstSize, ElementSize, 0, 0, Src1, Result);\n  }\n  case VectorCompareType::NGE_UQ:\n  case VectorCompareType::NGE_US: {\n    Ref Result = _VFCMPLE(ElementSize, ElementSize, Src2, Src1);\n    Result = _VNot(ElementSize, ElementSize, Result);\n    // Insert the lower bits\n    return _VInsElement(OpDstSize, ElementSize, 0, 0, Src1, Result);\n  }\n  case VectorCompareType::GT_OQ:\n  case VectorCompareType::GT_OS: {\n    Ref Result = _VFCMPLT(ElementSize, ElementSize, Src2, Src1);\n    // Insert the lower bits\n    return _VInsElement(OpDstSize, ElementSize, 0, 0, Src1, Result);\n  }\n  case VectorCompareType::GE_OQ:\n  case VectorCompareType::GE_OS: {\n    Ref Result = _VFCMPLE(ElementSize, ElementSize, Src2, Src1);\n    // Insert the lower bits\n    return _VInsElement(OpDstSize, ElementSize, 0, 0, Src1, Result);\n  }\n  case VectorCompareType::EQ_UQ:\n  case VectorCompareType::EQ_US: {\n    // If either of the sources are unordered, then returns true.\n    Ref Src1_U = _VFCMPEQ(Size, ElementSize, Src1, Src1);\n    Ref Src2_U = _VFCMPEQ(Size, ElementSize, Src2, Src2);\n    auto Ordered = _VAnd(Size, ElementSize, Src1_U, Src2_U);\n\n    Ref Compare_Ordered = _VFCMPEQ(Size, ElementSize, Src1, Src2);\n    Ref Result = _VOrn(Size, ElementSize, Compare_Ordered, Ordered);\n\n    // Insert the lower bits\n    return _VInsElement(OpDstSize, ElementSize, 0, 0, Src1, Result);\n  }\n  case VectorCompareType::NEQ_OQ:\n  case VectorCompareType::NEQ_OS: {\n    // If either of the sources are unordered, then returns false.\n    Ref Src1_U = _VFCMPEQ(Size, ElementSize, Src1, Src1);\n    Ref Src2_U = _VFCMPEQ(Size, ElementSize, Src2, Src2);\n\n    Ref Compare_Ordered = _VFCMPEQ(Size, ElementSize, Src1, Src2);\n    Ref Result = _VAndn(Size, ElementSize, Src1_U, Compare_Ordered);\n    Result = _VAnd(Size, ElementSize, Result, Src2_U);\n\n    // Insert the lower bits\n    return _VInsElement(OpDstSize, ElementSize, 0, 0, Src1, Result);\n  }\n  case VectorCompareType::FALSE_OQ:\n  case VectorCompareType::FALSE_OS: return _VInsElement(OpDstSize, ElementSize, 0, 0, Src1, LoadZeroVector(OpSize::i128Bit));\n  case VectorCompareType::TRUE_UQ:\n  case VectorCompareType::TRUE_US:\n    return _VInsElement(OpDstSize, ElementSize, 0, 0, Src1, _VectorImm(OpSize::i128Bit, OpSize::i8Bit, -1, 0));\n  }\n  FEX_UNREACHABLE;\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::InsertScalarFCMPOp(OpcodeArgs) {\n  const uint8_t CompType = Op->Src[1].Literal();\n  const auto DstSize = GetGuestVectorLength();\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  Ref Src1 = LoadSourceFPR_WithOpSize(Op, Op->Dest, DstSize, Op->Flags);\n  Ref Src2 = LoadSourceFPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags, {.AllowUpperGarbage = true});\n\n  Ref Result = InsertScalarFCMPOpImpl(DstSize, OpSizeFromDst(Op), ElementSize, Src1, Src2, CompType & 0b111, false);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, DstSize);\n}\n\ntemplate void OpDispatchBuilder::InsertScalarFCMPOp<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::InsertScalarFCMPOp<OpSize::i64Bit>(OpcodeArgs);\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::AVXInsertScalarFCMPOp(OpcodeArgs) {\n  const uint8_t CompType = Op->Src[2].Literal();\n  const auto DstSize = GetGuestVectorLength();\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  // We load the full vector width when dealing with a source vector,\n  // so that we don't do any unnecessary zero extension to the scalar\n  // element that we're going to operate on.\n  Ref Src1 = LoadSourceFPR_WithOpSize(Op, Op->Src[0], DstSize, Op->Flags);\n  Ref Src2 = LoadSourceFPR_WithOpSize(Op, Op->Src[1], SrcSize, Op->Flags, {.AllowUpperGarbage = true});\n\n  Ref Result = InsertScalarFCMPOpImpl(DstSize, OpSizeFromDst(Op), ElementSize, Src1, Src2, CompType & 0b11111, true);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, DstSize);\n}\n\ntemplate void OpDispatchBuilder::AVXInsertScalarFCMPOp<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXInsertScalarFCMPOp<OpSize::i64Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::RSqrt3DNowOp(OpcodeArgs, bool Duplicate) {\n  const auto Size = OpSizeFromSrc(Op);\n  const auto ElementSize = OpSize::i32Bit;\n\n  Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], Size, Op->Flags);\n\n  // For the sqrt reciprocal in 3DNow!, if the source is negative,\n  // then the result has the same sign as the source but the result is always calculated\n  // as if the source was positive.\n  Ref AbsSrc = _VFAbs(Size, ElementSize, Src);\n  Ref PosRSqrt = _VFRSqrtPrecision(Size, ElementSize, AbsSrc);\n  Ref Result = _VFCopySign(Size, ElementSize, PosRSqrt, Src);\n\n  if (Duplicate) {\n    Result = _VDupElement(Size, ElementSize, Result, 0);\n  }\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VectorUnaryOp(OpcodeArgs, IROps IROp, IR::OpSize ElementSize) {\n  // In the event of a scalar operation and a vector source, then\n  // we can specify the entire vector length in order to avoid\n  // unnecessary sign extension on the element to be operated on.\n  // In the event of a memory operand, we load the exact element size.\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], Size, Op->Flags);\n\n  DeriveOp(ALUOp, IROp, _VFSqrt(Size, ElementSize, Src));\n  StoreResultFPR(Op, ALUOp);\n}\n\nvoid OpDispatchBuilder::AVXVectorUnaryOp(OpcodeArgs, IROps IROp, IR::OpSize ElementSize) {\n  // In the event of a scalar operation and a vector source, then\n  // we can specify the entire vector length in order to avoid\n  // unnecessary sign extension on the element to be operated on.\n  // In the event of a memory operand, we load the exact element size.\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags);\n\n  DeriveOp(ALUOp, IROp, _VFSqrt(SrcSize, ElementSize, Src));\n\n  // NOTE: We don't need to clear the upper lanes here, since the\n  //       IR ops make use of 128-bit AdvSimd for 128-bit cases,\n  //       which, on hardware with SVE, zero-extends as part of\n  //       storing into the destination.\n\n  StoreResultFPR(Op, ALUOp);\n}\n\nvoid OpDispatchBuilder::VectorUnaryDuplicateOpImpl(OpcodeArgs, IROps IROp, IR::OpSize ElementSize) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  DeriveOp(ALUOp, IROp, _VFSqrt(ElementSize, ElementSize, Src));\n\n  // Duplicate the lower bits\n  auto Result = _VDupElement(Size, ElementSize, ALUOp, 0);\n  StoreResultFPR(Op, Result);\n}\n\ntemplate<IROps IROp, IR::OpSize ElementSize>\nvoid OpDispatchBuilder::VectorUnaryDuplicateOp(OpcodeArgs) {\n  VectorUnaryDuplicateOpImpl(Op, IROp, ElementSize);\n}\n\n// TODO: there's only one instantiation of this template. Lets remove it.\ntemplate void OpDispatchBuilder::VectorUnaryDuplicateOp<IR::OP_VFRECPPRECISION, OpSize::i32Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::MOVQOp(OpcodeArgs, VectorOpType VectorType) {\n  const auto SrcSize = Op->Src[0].IsGPR() ? OpSize::i128Bit : OpSizeFromSrc(Op);\n  Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags);\n  // This instruction is a bit special that if the destination is a register then it'll ZEXT the 64bit source to 128bit\n  if (Op->Dest.IsGPR()) {\n    const auto gpr = Op->Dest.Data.GPR.GPR;\n    const auto gprIndex = gpr - X86State::REG_XMM_0;\n\n    auto Reg = VZeroExtendOperand(OpSize::i64Bit, Op->Src[0], Src);\n    StoreXMMRegister_WithAVXInsert(VectorType, gprIndex, Reg);\n  } else {\n    // This is simple, just store the result\n    StoreResultFPR(Op, Src);\n  }\n}\n\nvoid OpDispatchBuilder::MOVQMMXOp(OpcodeArgs) {\n  // Partial store into bottom 64-bits, leave the upper bits unaffected.\n  if (MMXState == MMXState_X87) {\n    ChgStateX87_MMX();\n  }\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags, {.Align = OpSize::i8Bit});\n  StoreResultFPR(Op, Src, OpSize::i8Bit);\n}\n\nvoid OpDispatchBuilder::MOVMSKOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto Size = OpSizeFromSrc(Op);\n  const auto NumElements = IR::NumElements(Size, ElementSize);\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  if (Size == OpSize::i128Bit && ElementSize == OpSize::i64Bit) {\n    // UnZip2 the 64-bit elements as 32-bit to get the sign bits closer.\n    // Sign bits are now in bit positions 31 and 63 after this.\n    Src = _VUnZip2(Size, OpSize::i32Bit, Src, Src);\n\n    // Extract the low 64-bits to GPR in one move.\n    Ref GPR = _VExtractToGPR(Size, OpSize::i64Bit, Src, 0);\n    // BFI the sign bit in 31 in to 62.\n    // Inserting the full lower 32-bits offset 31 so the sign bit ends up at offset 63.\n    GPR = _Bfi(OpSize::i64Bit, 32, 31, GPR, GPR);\n    // Shift right to only get the two sign bits we care about.\n    GPR = _Lshr(OpSize::i64Bit, GPR, Constant(62));\n    StoreResultGPR_WithOpSize(Op, Op->Dest, GPR, GetGPROpSize());\n  } else if (Size == OpSize::i128Bit && ElementSize == OpSize::i32Bit) {\n    // Shift all the sign bits to the bottom of their respective elements.\n    Src = _VUShrI(Size, OpSize::i32Bit, Src, 31);\n    // Load the specific 128-bit movmskps shift elements operator.\n    auto ConstantUSHL = LoadAndCacheNamedVectorConstant(Size, NAMED_VECTOR_MOVMSKPS_SHIFT);\n    // Shift the sign bits in to specific locations.\n    Src = _VUShl(Size, OpSize::i32Bit, Src, ConstantUSHL, false);\n    // Add across the vector so the sign bits will end up in bits [3:0]\n    Src = _VAddV(Size, OpSize::i32Bit, Src);\n    // Extract to a GPR.\n    Ref GPR = _VExtractToGPR(Size, OpSize::i32Bit, Src, 0);\n    StoreResultGPR_WithOpSize(Op, Op->Dest, GPR, GetGPROpSize());\n  } else {\n    Ref CurrentVal = Constant(0);\n\n    for (unsigned i = 0; i < NumElements; ++i) {\n      // Extract the top bit of the element\n      Ref Tmp = _VExtractToGPR(Size, ElementSize, Src, i);\n      Tmp = _Bfe(ElementSize, 1, IR::OpSizeAsBits(ElementSize) - 1, Tmp);\n\n      // Shift it to the correct location and or it with the current value\n      if (i != 0) {\n        CurrentVal = _Orlshl(OpSize::i64Bit, CurrentVal, Tmp, i);\n      } else {\n        CurrentVal = Tmp;\n      }\n    }\n    StoreResultGPR(Op, CurrentVal);\n  }\n}\n\nvoid OpDispatchBuilder::MOVMSKOpOne(OpcodeArgs) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto Is256Bit = SrcSize == OpSize::i256Bit;\n  const auto ExtractSize = Is256Bit ? OpSize::i32Bit : OpSize::i16Bit;\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref VMask = LoadAndCacheNamedVectorConstant(SrcSize, NAMED_VECTOR_MOVMASKB);\n\n  auto VCMP = _VCMPLTZ(SrcSize, OpSize::i8Bit, Src);\n  auto VAnd = _VAnd(SrcSize, OpSize::i8Bit, VCMP, VMask);\n\n  // Since we also handle the MM MOVMSKB here too,\n  // we need to clamp the lower bound.\n  const auto VAdd1Size = std::max(SrcSize, OpSize::i128Bit);\n  const auto VAdd2Size = std::max(SrcSize >> 1, OpSize::i64Bit);\n\n  auto VAdd1 = _VAddP(VAdd1Size, OpSize::i8Bit, VAnd, VAnd);\n  auto VAdd2 = _VAddP(VAdd2Size, OpSize::i8Bit, VAdd1, VAdd1);\n  auto VAdd3 = _VAddP(OpSize::i64Bit, OpSize::i8Bit, VAdd2, VAdd2);\n\n  auto Result = _VExtractToGPR(SrcSize, ExtractSize, VAdd3, 0);\n\n  StoreResultGPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::PUNPCKLOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  auto ALUOp = _VZip(Size, ElementSize, Dest, Src);\n  StoreResultFPR(Op, ALUOp);\n}\n\nvoid OpDispatchBuilder::VPUNPCKLOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto Is128Bit = SrcSize == OpSize::i128Bit;\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  Ref Result {};\n  if (Is128Bit) {\n    Result = _VZip(SrcSize, ElementSize, Src1, Src2);\n  } else {\n    Ref ZipLo = _VZip(SrcSize, ElementSize, Src1, Src2);\n    Ref ZipHi = _VZip2(SrcSize, ElementSize, Src1, Src2);\n\n    Result = _VInsElement(SrcSize, OpSize::i128Bit, 1, 0, ZipLo, ZipHi);\n  }\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::PUNPCKHOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto Size = OpSizeFromSrc(Op);\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  auto ALUOp = _VZip2(Size, ElementSize, Dest, Src);\n  StoreResultFPR(Op, ALUOp);\n}\n\nvoid OpDispatchBuilder::VPUNPCKHOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto Is128Bit = SrcSize == OpSize::i128Bit;\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  Ref Result {};\n  if (Is128Bit) {\n    Result = _VZip2(SrcSize, ElementSize, Src1, Src2);\n  } else {\n    Ref ZipLo = _VZip(SrcSize, ElementSize, Src1, Src2);\n    Ref ZipHi = _VZip2(SrcSize, ElementSize, Src1, Src2);\n\n    Result = _VInsElement(SrcSize, OpSize::i128Bit, 0, 1, ZipHi, ZipLo);\n  }\n\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::GeneratePSHUFBMask(IR::OpSize SrcSize) {\n  // PSHUFB doesn't 100% match VTBL behaviour\n  // VTBL will set the element zero if the index is greater than\n  // the number of elements in the array\n  //\n  // Bit 7 is the only bit that is supposed to set elements to zero with PSHUFB\n  // Mask the selection bits and top bit correctly\n  // Bits [6:4] is reserved for 128-bit/256-bit\n  // Bits [6:3] is reserved for 64-bit\n  const uint8_t MaskImm = SrcSize == OpSize::i64Bit ? 0b1000'0111 : 0b1000'1111;\n\n  return _VectorImm(SrcSize, OpSize::i8Bit, MaskImm);\n}\n\nRef OpDispatchBuilder::PSHUFBOpImpl(IR::OpSize SrcSize, Ref Src1, Ref Src2, Ref MaskVector) {\n  const auto Is256Bit = SrcSize == OpSize::i256Bit;\n\n  // We perform the 256-bit version as two 128-bit operations due to\n  // the lane splitting behavior, so cap the maximum size at 16.\n  const auto SanitizedSrcSize = std::min(SrcSize, OpSize::i128Bit);\n\n  Ref MaskedIndices = _VAnd(SrcSize, SrcSize, Src2, MaskVector);\n\n  Ref Low = _VTBL1(SanitizedSrcSize, Src1, MaskedIndices);\n  if (!Is256Bit) {\n    return Low;\n  }\n\n  Ref HighSrc1 = _VInsElement(SrcSize, OpSize::i128Bit, 0, 1, Src1, Src1);\n  Ref High = _VTBL1(SanitizedSrcSize, HighSrc1, MaskedIndices);\n  return _VInsElement(SrcSize, OpSize::i128Bit, 1, 0, Low, High);\n}\n\nvoid OpDispatchBuilder::PSHUFBOp(OpcodeArgs) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  Ref Src1 = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  Ref Result = PSHUFBOpImpl(SrcSize, Src1, Src2, GeneratePSHUFBMask(SrcSize));\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPSHUFBOp(OpcodeArgs) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  Ref Result = PSHUFBOpImpl(SrcSize, Src1, Src2, GeneratePSHUFBMask(SrcSize));\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::PShufWLane(IR::OpSize Size, FEXCore::IR::IndexNamedVectorConstant IndexConstant, bool LowLane, Ref IncomingLane,\n                                  uint8_t Shuffle) {\n  constexpr auto IdentityCopy = 0b11'10'01'00;\n\n  const bool Is128BitLane = Size == OpSize::i128Bit;\n  const auto NumElements = IR::NumElements(Size, IR::OpSize::i16Bit);\n  const auto HalfNumElements = NumElements >> 1;\n\n  // TODO: There can be more optimized copies here.\n  switch (Shuffle) {\n  case IdentityCopy: {\n    // Special case identity copy.\n    return IncomingLane;\n  }\n  case 0b00'00'00'00:\n  case 0b01'01'01'01:\n  case 0b10'10'10'10:\n  case 0b11'11'11'11: {\n    // Special case element duplicate and broadcast to low or high 64-bits.\n    Ref Dup = _VDupElement(Size, OpSize::i16Bit, IncomingLane, (LowLane ? 0 : HalfNumElements) + (Shuffle & 0b11));\n    if (Is128BitLane) {\n      if (LowLane) {\n        // DUP goes low.\n        // Source goes high.\n        Dup = _VTrn2(Size, OpSize::i64Bit, Dup, IncomingLane);\n      } else {\n        // DUP goes high.\n        // Source goes low.\n        Dup = _VTrn(Size, OpSize::i64Bit, IncomingLane, Dup);\n      }\n    }\n\n    return Dup;\n  }\n  default: {\n    // PSHUFLW needs to scale index by 16.\n    // PSHUFHW needs to scale index by 16.\n    // PSHUFW (mmx) also needs to scale by 16 to get correct low element.\n    auto LookupIndexes = LoadAndCacheIndexedNamedVectorConstant(Size, IndexConstant, Shuffle * 16);\n    return _VTBL1(Size, IncomingLane, LookupIndexes);\n  }\n  }\n}\n\nvoid OpDispatchBuilder::PSHUFW8ByteOp(OpcodeArgs) {\n  uint16_t Shuffle = Op->Src[1].Data.Literal.Value;\n  const auto Size = OpSizeFromSrc(Op);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Dest = PShufWLane(Size, FEXCore::IR::INDEXED_NAMED_VECTOR_PSHUFLW, true, Src, Shuffle);\n  StoreResultFPR(Op, Dest);\n}\n\nvoid OpDispatchBuilder::PSHUFWOp(OpcodeArgs, bool Low) {\n  uint16_t Shuffle = Op->Src[1].Data.Literal.Value;\n  const auto Size = OpSizeFromSrc(Op);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  const auto IndexedVectorConstant = Low ? FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_PSHUFLW :\n                                           FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_PSHUFHW;\n\n  Ref Dest = PShufWLane(Size, IndexedVectorConstant, Low, Src, Shuffle);\n\n  StoreResultFPR(Op, Dest);\n}\n\nRef OpDispatchBuilder::Single128Bit4ByteVectorShuffle(Ref Src, uint8_t Shuffle) {\n  constexpr auto IdentityCopy = 0b11'10'01'00;\n\n  // TODO: There can be more optimized copies here.\n  switch (Shuffle) {\n  case IdentityCopy: {\n    // Special case identity copy.\n    return Src;\n  }\n  case 0b00'00'00'00:\n  case 0b01'01'01'01:\n  case 0b10'10'10'10:\n  case 0b11'11'11'11: {\n    // Special case element duplicate and broadcast to low or high 64-bits.\n    return _VDupElement(OpSize::i128Bit, OpSize::i32Bit, Src, Shuffle & 0b11);\n  }\n  case 0b00'00'10'10: {\n    // Weird reverse low elements and broadcast to each half of the register\n    Ref Tmp = _VUnZip(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n    Tmp = _VRev64(OpSize::i128Bit, OpSize::i32Bit, Tmp);\n    return _VZip(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp);\n  }\n  case 0b00'00'11'10: {\n    // First element duplicated and shifted in to the top.\n    auto Dup = _VDupElement(OpSize::i128Bit, OpSize::i32Bit, Src, 0);\n    return _VExtr(OpSize::i128Bit, OpSize::i32Bit, Dup, Src, 2);\n  }\n  case 0b00'01'00'01: {\n    ///< Weird reversed low elements and broadcast\n    Ref Tmp = _VRev64(OpSize::i128Bit, OpSize::i32Bit, Src);\n    return _VZip(OpSize::i128Bit, OpSize::i64Bit, Tmp, Tmp);\n  }\n  case 0b00'01'01'00: {\n    ///< Weird reverse low two elements in to high half\n    Ref Tmp = _VZip(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 4);\n  }\n  case 0b00'01'10'11: {\n    // Inverse elements\n    Ref Tmp = _VRev64(OpSize::i128Bit, OpSize::i32Bit, Src);\n    return _VExtr(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp, 2);\n  }\n  case 0b00'10'00'10: {\n    ///< Weird reversed even elements and broadcast\n    Ref Tmp = _VUnZip(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 4);\n  }\n  case 0b00'10'10'00: {\n    // Weird reversed low elements in upper half of the register\n    Ref Tmp = _VUnZip(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n    Tmp = _VZip(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 4);\n  }\n  case 0b00'11'00'11: {\n    ///< Weird Low plus high element reversed and broadcast\n    Ref Tmp = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Src, 4);\n    return _VZip2(OpSize::i128Bit, OpSize::i64Bit, Tmp, Tmp);\n  }\n  case 0b00'11'10'01:\n    ///< Vector rotate - One element\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Src, 4);\n  case 0b00'11'11'00: {\n    // Weird reversed low and high elements in upper half of the register\n    Ref Tmp = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Src, 4);\n    Tmp = _VZip2(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 12);\n  }\n  case 0b01'00'00'01: {\n    ///< Weird duplicate bottom two elements, then rotate in the low half\n    Ref Tmp = _VZip(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 12);\n  }\n  case 0b01'00'01'00:\n    ///< Duplicate bottom 64-bits\n    return _VDupElement(OpSize::i128Bit, OpSize::i64Bit, Src, 0);\n  case 0b01'00'11'10:\n    ///< Vector rotate - Two elements\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Src, 8);\n  case 0b01'01'00'00: {\n    // Zip with self.\n    // Dest[0] = Src[0]\n    // Dest[1] = Src[0]\n    // Dest[2] = Src[1]\n    // Dest[3] = Src[1]\n    return _VZip(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n  }\n  case 0b01'01'10'10: {\n    ///< Weird reverse middle elements and broadcast to each half of the register\n    Ref Tmp = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Src, 4);\n    Tmp = _VRev64(OpSize::i128Bit, OpSize::i32Bit, Tmp);\n    return _VZip(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp);\n  }\n  case 0b01'01'11'11: {\n    ///< Weird reverse odd elements and broadcast to each half of the register\n    Ref Tmp = _VUnZip2(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n    Tmp = _VRev64(OpSize::i128Bit, OpSize::i32Bit, Tmp);\n    return _VZip(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp);\n  }\n  case 0b01'10'01'10: {\n    ///< Weird middle elements swizzle plus broadcast\n    Ref Tmp = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Src, 4);\n    Tmp = _VRev64(OpSize::i128Bit, OpSize::i32Bit, Tmp);\n    return _VZip(OpSize::i128Bit, OpSize::i64Bit, Tmp, Tmp);\n  }\n  case 0b01'10'10'01: {\n    ///< Weird middle elements swizzle plus broadcast and reverse\n    Ref Tmp = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Src, 4);\n    Tmp = _VZip(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 4);\n  }\n  case 0b01'11'01'11: {\n    ///< Weird reversed odd elements and broadcast\n    Ref Tmp = _VUnZip2(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 4);\n  }\n  case 0b01'11'11'01: {\n    ///< Weird odd elements swizzle plus broadcast and reverse\n    Ref Tmp = _VUnZip2(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n    Tmp = _VZip(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 4);\n  }\n  case 0b10'00'00'10: {\n    ///< Weird even elements swizzle plus broadcast and reverse\n    Ref Tmp = _VUnZip(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n    Tmp = _VZip(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 12);\n  }\n  case 0b10'00'10'00:\n    ///< Even elements broadcast\n    return _VUnZip(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n  case 0b10'01'00'11:\n    ///< Vector rotate - Three elements\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Src, 12);\n\n  case 0b10'01'01'10: {\n    ///< Weird odd elements swizzle plus broadcast and reverse\n    Ref Tmp = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Src, 4);\n    Tmp = _VZip(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 12);\n  }\n  case 0b10'01'10'01: {\n    ///< Middle two elements broadcast\n    Ref Tmp = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Src, 4);\n    return _VZip(OpSize::i128Bit, OpSize::i64Bit, Tmp, Tmp);\n  }\n  case 0b10'10'00'00: {\n    ///< Broadcast even elements to each half of the register\n    Ref Tmp = _VUnZip(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n    return _VZip(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp);\n  }\n  case 0b10'10'01'01: {\n    ///< Broadcast middle elements to each half of the register\n    Ref Tmp = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Src, 4);\n    return _VZip(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp);\n  }\n  case 0b10'10'11'11: {\n    ///< Reverse top two elements and broadcast to each half of the register\n    Ref Tmp = _VZip2(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 8);\n  }\n  case 0b10'11'00'01: {\n    // Reverse each 64-bit lane.\n    return _VRev64(OpSize::i128Bit, OpSize::i32Bit, Src);\n  }\n  case 0b10'11'10'11: {\n    ///< Weird top two elements reverse and broadcast\n    Ref Tmp = _VZip2(OpSize::i128Bit, OpSize::i64Bit, Src, Src);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 4);\n  }\n  case 0b10'11'11'10: {\n    ///< Weird move top two elements to bottom and reverse in the top half\n    Ref Tmp = _VZip2(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 4);\n  }\n  case 0b11'00'00'11: {\n    ///< Weird low plus high elements swizzle plus broadcast and reverse\n    Ref Tmp = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Src, 4);\n    Tmp = _VZip2(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 4);\n  }\n  case 0b11'00'11'00: {\n    ///< Weird low plus high element broadcast\n    Ref Tmp = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Src, 4);\n    Tmp = _VZip2(OpSize::i128Bit, OpSize::i64Bit, Tmp, Tmp);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 4);\n  }\n  case 0b11'01'01'11: {\n    ///< Weird odd elements swizzle plus broadcast and reverse\n    Ref Tmp = _VUnZip2(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n    Tmp = _VZip(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 12);\n  }\n  case 0b11'01'11'01:\n    ///< Odd elements broadcast\n    return _VUnZip2(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n  case 0b11'10'10'11: {\n    ///< Rotate top two elements in to bottom half of the register\n    Ref Tmp = _VZip2(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n    return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 12);\n  }\n  case 0b11'10'11'10:\n    ///< Duplicate Top 64-bits\n    return _VDupElement(OpSize::i128Bit, OpSize::i64Bit, Src, 1);\n  case 0b11'11'00'00: {\n    ///< Weird Broadcast bottom and top element to each half of the register\n    Ref Tmp = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Src, 12);\n    Tmp = _VRev64(OpSize::i128Bit, OpSize::i32Bit, Tmp);\n    return _VZip(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp);\n  }\n  case 0b11'11'01'01: {\n    ///< Broadcast odd elements to each half of the register\n    Ref Tmp = _VUnZip2(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n    return _VZip(OpSize::i128Bit, OpSize::i32Bit, Tmp, Tmp);\n  }\n  case 0b11'11'10'10:\n    ///< Broadcast top two elements to each half of the register\n    return _VZip2(OpSize::i128Bit, OpSize::i32Bit, Src, Src);\n  default: {\n    // PSHUFD needs to scale index by 16.\n    auto LookupIndexes =\n      LoadAndCacheIndexedNamedVectorConstant(OpSize::i128Bit, FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_PSHUFD, Shuffle * 16);\n    return _VTBL1(OpSize::i128Bit, Src, LookupIndexes);\n  }\n  }\n}\n\nvoid OpDispatchBuilder::PSHUFDOp(OpcodeArgs) {\n  uint16_t Shuffle = Op->Src[1].Data.Literal.Value;\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  StoreResultFPR(Op, Single128Bit4ByteVectorShuffle(Src, Shuffle));\n}\n\nvoid OpDispatchBuilder::VPSHUFWOp(OpcodeArgs, IR::OpSize ElementSize, bool Low) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto Is256Bit = SrcSize == OpSize::i256Bit;\n  auto Shuffle = Op->Src[1].Literal();\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  // Note/TODO: With better immediate facilities or vector loading in our IR\n  //            much of this can be reduced to setting up a table index register\n  //            and then using TBL\n  //\n  //            SVE has the INDEX instruction that works essentially like\n  //            std::iota (setting a range to an initial value and progressively\n  //            incrementing each successive element), so it's well suited for this.\n  //            It's just a matter of exposing these facilities in a way that works\n  //            well together.\n  //\n  //            Should be much nicer than doing repeated inserts in any case.\n\n  const size_t BaseElement = Low ? 0 : 4;\n  Ref Result = Src;\n  if (Is256Bit) {\n    for (size_t i = 0; i < 4; i++) {\n      const auto Index = Shuffle & 0b11;\n      const auto UpperLaneOffset = IR::NumElements(OpSize::i128Bit, ElementSize);\n\n      const auto LowDstIndex = BaseElement + i;\n      const auto LowSrcIndex = BaseElement + Index;\n\n      const auto HighDstIndex = BaseElement + UpperLaneOffset + i;\n      const auto HighSrcIndex = BaseElement + UpperLaneOffset + Index;\n\n      // Take care of both lanes per iteration\n      Result = _VInsElement(SrcSize, ElementSize, LowDstIndex, LowSrcIndex, Result, Src);\n      Result = _VInsElement(SrcSize, ElementSize, HighDstIndex, HighSrcIndex, Result, Src);\n\n      Shuffle >>= 2;\n    }\n  } else {\n    for (size_t i = 0; i < 4; i++) {\n      const auto Index = Shuffle & 0b11;\n      Result = _VInsElement(SrcSize, ElementSize, BaseElement + i, BaseElement + Index, Result, Src);\n      Shuffle >>= 2;\n    }\n  }\n\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::SHUFOpImpl(OpcodeArgs, IR::OpSize DstSize, IR::OpSize ElementSize, Ref Src1, Ref Src2, uint8_t Shuffle) {\n  // Since 256-bit variants and up don't lane cross, we can construct\n  // everything in terms of the 128-variant, as each lane is essentially\n  // its own 128-bit segment.\n  const uint8_t NumElements = IR::NumElements(OpSize::i128Bit, ElementSize);\n  const uint8_t HalfNumElements = NumElements >> 1;\n\n  const bool Is256Bit = DstSize == OpSize::i256Bit;\n\n  std::array<Ref, 4> Srcs {};\n  for (size_t i = 0; i < HalfNumElements; ++i) {\n    Srcs[i] = Src1;\n  }\n  for (size_t i = HalfNumElements; i < NumElements; ++i) {\n    Srcs[i] = Src2;\n  }\n\n  Ref Dest = Src1;\n  const uint8_t SelectionMask = NumElements - 1;\n  const uint8_t ShiftAmount = std::popcount(SelectionMask);\n\n  if (Is256Bit) {\n    for (uint8_t Element = 0; Element < NumElements; ++Element) {\n      const auto SrcIndex1 = Shuffle & SelectionMask;\n\n      // AVX differs the behavior of VSHUFPD and VSHUFPS.\n      // The same immediate bits are used for both lanes with VSHUFPS,\n      // but VSHUFPD uses different immediate bits for each lane.\n      const auto SrcIndex2 = ElementSize == OpSize::i32Bit ? SrcIndex1 : ((Shuffle >> 2) & SelectionMask);\n\n      Ref Insert = _VInsElement(DstSize, ElementSize, Element, SrcIndex1, Dest, Srcs[Element]);\n      Dest = _VInsElement(DstSize, ElementSize, Element + NumElements, SrcIndex2 + NumElements, Insert, Srcs[Element]);\n\n      Shuffle >>= ShiftAmount;\n    }\n  } else {\n    if (ElementSize == OpSize::i32Bit) {\n      // We can shuffle optimally in a lot of cases.\n      // TODO: We can optimize more of these cases.\n      switch (Shuffle) {\n      case 0b01'00'01'00:\n        // Combining of low 64-bits.\n        // Dest[63:0]   = Src1[63:0]\n        // Dest[127:64] = Src2[63:0]\n        return _VZip(DstSize, OpSize::i64Bit, Src1, Src2);\n      case 0b11'10'11'10:\n        // Combining of high 64-bits.\n        // Dest[63:0]   = Src1[127:64]\n        // Dest[127:64] = Src2[127:64]\n        return _VZip2(DstSize, OpSize::i64Bit, Src1, Src2);\n      case 0b11'10'01'00:\n        // Mixing Low and high elements\n        // Dest[63:0]   = Src1[63:0]\n        // Dest[127:64] = Src2[127:64]\n        return _VInsElement(DstSize, OpSize::i64Bit, 1, 1, Src1, Src2);\n      case 0b01'00'11'10:\n        // Mixing Low and high elements, inverse of above\n        // Dest[63:0]   = Src1[127:64]\n        // Dest[127:64] = Src2[63:0]\n        return _VExtr(DstSize, OpSize::i8Bit, Src2, Src1, 8);\n      case 0b10'00'10'00:\n        // Mixing even elements.\n        // Dest[31:0]   = Src1[31:0]\n        // Dest[63:32]  = Src1[95:64]\n        // Dest[95:64]  = Src2[31:0]\n        // Dest[127:96] = Src2[95:64]\n        return _VUnZip(DstSize, ElementSize, Src1, Src2);\n      case 0b11'01'11'01:\n        // Mixing odd elements.\n        // Dest[31:0]   = Src1[63:32]\n        // Dest[63:32]  = Src1[127:96]\n        // Dest[95:64]  = Src2[63:32]\n        // Dest[127:96] = Src2[127:96]\n        return _VUnZip2(DstSize, ElementSize, Src1, Src2);\n      case 0b11'10'00'00:\n      case 0b11'10'01'01:\n      case 0b11'10'10'10:\n      case 0b11'10'11'11: {\n        // Bottom elements duplicated, Top 64-bits inserted\n        auto DupSrc1 = _VDupElement(DstSize, ElementSize, Src1, Shuffle & 0b11);\n        return _VZip2(DstSize, OpSize::i64Bit, DupSrc1, Src2);\n      }\n      case 0b01'00'00'00:\n      case 0b01'00'01'01:\n      case 0b01'00'10'10:\n      case 0b01'00'11'11: {\n        // Bottom elements duplicated, Bottom 64-bits inserted\n        auto DupSrc1 = _VDupElement(DstSize, ElementSize, Src1, Shuffle & 0b11);\n        return _VZip(DstSize, OpSize::i64Bit, DupSrc1, Src2);\n      }\n      case 0b00'00'01'00:\n      case 0b01'01'01'00:\n      case 0b10'10'01'00:\n      case 0b11'11'01'00: {\n        // Top elements duplicated, Bottom 64-bits inserted\n        auto DupSrc2 = _VDupElement(DstSize, ElementSize, Src2, (Shuffle >> 4) & 0b11);\n        return _VZip(DstSize, OpSize::i64Bit, Src1, DupSrc2);\n      }\n      case 0b00'00'11'10:\n      case 0b01'01'11'10:\n      case 0b10'10'11'10:\n      case 0b11'11'11'10: {\n        // Top elements duplicated, Top 64-bits inserted\n        auto DupSrc2 = _VDupElement(DstSize, ElementSize, Src2, (Shuffle >> 4) & 0b11);\n        return _VZip2(DstSize, OpSize::i64Bit, Src1, DupSrc2);\n      }\n      case 0b01'00'01'11: {\n        // TODO: This doesn't generate optimal code.\n        // RA doesn't understand that Src1 is dead after VInsElement due to SRA class differences.\n        // With RA fixes this would be 2 instructions.\n        // Odd elements inverted, Low 64-bits inserted\n        Src1 = _VInsElement(DstSize, OpSize::i32Bit, 0, 3, Src1, Src1);\n        return _VZip(DstSize, OpSize::i64Bit, Src1, Src2);\n      }\n      case 0b11'10'01'11: {\n        // TODO: This doesn't generate optimal code.\n        // RA doesn't understand that Src1 is dead after VInsElement due to SRA class differences.\n        // With RA fixes this would be 2 instructions.\n        // Odd elements inverted, Top 64-bits inserted\n        Src1 = _VInsElement(DstSize, OpSize::i32Bit, 0, 3, Src1, Src1);\n        return _VInsElement(DstSize, OpSize::i64Bit, 1, 1, Src1, Src2);\n      }\n      case 0b01'00'00'01: {\n        // Lower 32-bit elements inverted, low 64-bits inserted\n        Src1 = _VRev64(DstSize, OpSize::i32Bit, Src1);\n        return _VZip(DstSize, OpSize::i64Bit, Src1, Src2);\n      }\n      case 0b11'10'00'01: {\n        // TODO: This doesn't generate optimal code.\n        // RA doesn't understand that Src1 is dead after VInsElement due to SRA class differences.\n        // With RA fixes this would be 2 instructions.\n        // Lower 32-bit elements inverted, Top 64-bits inserted\n        Src1 = _VRev64(DstSize, OpSize::i32Bit, Src1);\n        return _VInsElement(DstSize, OpSize::i64Bit, 1, 1, Src1, Src2);\n      }\n      case 0b00'00'00'00:\n      case 0b00'00'01'01:\n      case 0b00'00'10'10:\n      case 0b00'00'11'11:\n      case 0b01'01'00'00:\n      case 0b01'01'01'01:\n      case 0b01'01'10'10:\n      case 0b01'01'11'11:\n      case 0b10'10'00'00:\n      case 0b10'10'01'01:\n      case 0b10'10'10'10:\n      case 0b10'10'11'11:\n      case 0b11'11'00'00:\n      case 0b11'11'01'01:\n      case 0b11'11'10'10:\n      case 0b11'11'11'11: {\n        // Duplicate element in upper and lower across each 64-bit segment.\n        auto DupSrc1 = _VDupElement(DstSize, ElementSize, Src1, Shuffle & 0b11);\n        auto DupSrc2 = _VDupElement(DstSize, ElementSize, Src2, (Shuffle >> 4) & 0b11);\n        return _VZip(DstSize, OpSize::i64Bit, DupSrc1, DupSrc2);\n      }\n      default:\n        // Use a TBL2 operation to handle this implementation.\n        auto LookupIndexes =\n          LoadAndCacheIndexedNamedVectorConstant(DstSize, FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_SHUFPS, Shuffle * 16);\n        return _VTBL2(DstSize, Src1, Src2, LookupIndexes);\n      }\n    } else {\n      switch (Shuffle & 0b11) {\n      case 0b00:\n        // Low 64-bits of each source interleaved.\n        return _VZip(DstSize, ElementSize, Src1, Src2);\n      case 0b01:\n        // Upper 64-bits of Src1 in lower bits\n        // Lower 64-bits of Src2 in upper bits.\n        return _VExtr(DstSize, OpSize::i8Bit, Src2, Src1, 8);\n      case 0b10:\n        // Lower 32-bits of Src1 in lower bits.\n        // Upper 64-bits of Src2 in upper bits.\n        return _VInsElement(DstSize, ElementSize, 1, 1, Src1, Src2);\n      case 0b11:\n        // Upper 64-bits of each source interleaved.\n        return _VZip2(DstSize, ElementSize, Src1, Src2);\n      }\n    }\n\n    for (uint8_t Element = 0; Element < NumElements; ++Element) {\n      const auto SrcIndex = Shuffle & SelectionMask;\n      Dest = _VInsElement(DstSize, ElementSize, Element, SrcIndex, Dest, Srcs[Element]);\n      Shuffle >>= ShiftAmount;\n    }\n  }\n\n  return Dest;\n}\n\nvoid OpDispatchBuilder::SHUFOp(OpcodeArgs, IR::OpSize ElementSize) {\n  Ref Src1Node = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src2Node = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  uint8_t Shuffle = Op->Src[1].Literal();\n\n  Ref Result = SHUFOpImpl(Op, OpSizeFromDst(Op), ElementSize, Src1Node, Src2Node, Shuffle);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VSHUFOp(OpcodeArgs, IR::OpSize ElementSize) {\n  Ref Src1Node = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2Node = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  uint8_t Shuffle = Op->Src[2].Literal();\n\n  Ref Result = SHUFOpImpl(Op, OpSizeFromDst(Op), ElementSize, Src1Node, Src2Node, Shuffle);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VANDNOp(OpcodeArgs) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Dest = _VAndn(SrcSize, SrcSize, Src2, Src1);\n\n  StoreResultFPR(Op, Dest);\n}\n\ntemplate<IROps IROp, IR::OpSize ElementSize>\nvoid OpDispatchBuilder::VHADDPOp(OpcodeArgs) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto Is256Bit = SrcSize == OpSize::i256Bit;\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  DeriveOp(Res, IROp, _VFAddP(SrcSize, ElementSize, Src1, Src2));\n\n  Ref Dest = Res;\n  if (Is256Bit) {\n    Dest = _VInsElement(SrcSize, OpSize::i64Bit, 1, 2, Res, Res);\n    Dest = _VInsElement(SrcSize, OpSize::i64Bit, 2, 1, Dest, Res);\n  }\n\n  StoreResultFPR(Op, Dest);\n}\n\ntemplate void OpDispatchBuilder::VHADDPOp<IR::OP_VADDP, OpSize::i16Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VHADDPOp<IR::OP_VADDP, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VHADDPOp<IR::OP_VFADDP, OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VHADDPOp<IR::OP_VFADDP, OpSize::i64Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::VBROADCASTOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto DstSize = OpSizeFromDst(Op);\n  Ref Result {};\n\n  if (Op->Src[0].IsGPR()) {\n    Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    Result = _VDupElement(DstSize, ElementSize, Src, 0);\n  } else {\n    // Get the address to broadcast from into a GPR.\n    Ref Address = MakeSegmentAddress(Op, Op->Src[0], GetGPROpSize());\n    Result = _VBroadcastFromMem(DstSize, ElementSize, Address);\n  }\n\n  // No need to zero-extend result, since implementations\n  // use zero extending AdvSIMD or zeroing SVE loads internally.\n\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::PINSROpImpl(OpcodeArgs, IR::OpSize ElementSize, const X86Tables::DecodedOperand& Src1Op,\n                                   const X86Tables::DecodedOperand& Src2Op, const X86Tables::DecodedOperand& Imm) {\n  const auto Size = OpSizeFromDst(Op);\n  const auto NumElements = IR::NumElements(Size, ElementSize);\n  const uint64_t Index = Imm.Literal() & (NumElements - 1);\n  Ref Src1 = LoadSourceFPR_WithOpSize(Op, Src1Op, Size, Op->Flags);\n\n  if (Src2Op.IsGPR()) {\n    // If the source is a GPR then convert directly from the GPR.\n    auto Src2 = LoadSourceGPR_WithOpSize(Op, Src2Op, GetGPROpSize(), Op->Flags);\n    return _VInsGPR(Size, ElementSize, Index, Src1, Src2);\n  }\n\n  // If loading from memory then we only load the element size\n  Ref Src2 = MakeSegmentAddress(Op, Src2Op);\n  return _VLoadVectorElement(Size, ElementSize, Src1, Index, Src2);\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::PINSROp(OpcodeArgs) {\n  Ref Result = PINSROpImpl(Op, ElementSize, Op->Dest, Op->Src[0], Op->Src[1]);\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::PINSROp<OpSize::i8Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::PINSROp<OpSize::i16Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::PINSROp<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::PINSROp<OpSize::i64Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::VPINSRBOp(OpcodeArgs) {\n  Ref Result = PINSROpImpl(Op, OpSize::i8Bit, Op->Src[0], Op->Src[1], Op->Src[2]);\n  if (Op->Dest.Data.GPR.GPR == Op->Src[0].Data.GPR.GPR) {\n    Result = _VMov(OpSize::i128Bit, Result);\n  }\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPINSRDQOp(OpcodeArgs) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  Ref Result = PINSROpImpl(Op, SrcSize, Op->Src[0], Op->Src[1], Op->Src[2]);\n  if (Op->Dest.Data.GPR.GPR == Op->Src[0].Data.GPR.GPR) {\n    Result = _VMov(OpSize::i128Bit, Result);\n  }\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPINSRWOp(OpcodeArgs) {\n  Ref Result = PINSROpImpl(Op, OpSize::i16Bit, Op->Src[0], Op->Src[1], Op->Src[2]);\n  if (Op->Dest.Data.GPR.GPR == Op->Src[0].Data.GPR.GPR) {\n    Result = _VMov(OpSize::i128Bit, Result);\n  }\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::InsertPSOpImpl(OpcodeArgs, const X86Tables::DecodedOperand& Src1, const X86Tables::DecodedOperand& Src2,\n                                      const X86Tables::DecodedOperand& Imm) {\n  const uint8_t ImmValue = Imm.Literal();\n  uint8_t CountS = (ImmValue >> 6);\n  uint8_t CountD = (ImmValue >> 4) & 0b11;\n  const uint8_t ZMask = ImmValue & 0xF;\n\n  const auto DstSize = OpSizeFromDst(Op);\n\n  Ref Dest {};\n  if (ZMask != 0xF) {\n    // Only need to load destination if it isn't a full zero\n    Dest = LoadSourceFPR_WithOpSize(Op, Src1, DstSize, Op->Flags);\n  }\n\n  if ((ZMask & (1 << CountD)) == 0) {\n    // In the case that ZMask overwrites the destination element, then don't even insert\n    Ref Src {};\n    if (Src2.IsGPR()) {\n      Src = LoadSourceFPR(Op, Src2, Op->Flags);\n    } else {\n      // If loading from memory then CountS is forced to zero\n      CountS = 0;\n      Src = LoadSourceFPR_WithOpSize(Op, Src2, OpSize::i32Bit, Op->Flags);\n    }\n\n    Dest = _VInsElement(DstSize, OpSize::i32Bit, CountD, CountS, Dest, Src);\n  }\n\n  // ZMask happens after insert\n  if (ZMask == 0xF) {\n    return LoadZeroVector(DstSize);\n  }\n\n  if (ZMask) {\n    auto Zero = LoadZeroVector(DstSize);\n    for (size_t i = 0; i < 4; ++i) {\n      if ((ZMask & (1 << i)) != 0) {\n        Dest = _VInsElement(DstSize, OpSize::i32Bit, i, 0, Dest, Zero);\n      }\n    }\n  }\n\n  return Dest;\n}\n\nvoid OpDispatchBuilder::InsertPSOp(OpcodeArgs) {\n  Ref Result = InsertPSOpImpl(Op, Op->Dest, Op->Src[0], Op->Src[1]);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VINSERTPSOp(OpcodeArgs) {\n  Ref Result = InsertPSOpImpl(Op, Op->Src[0], Op->Src[1], Op->Src[2]);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::PExtrOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto DstSize = OpSizeFromDst(Op);\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  uint64_t Index = Op->Src[1].Literal();\n\n  // Fixup of 32-bit element size.\n  // When the element size is 32-bit then it can be overriden as 64-bit because the encoding of PEXTRD/PEXTRQ\n  // is the same except that REX.W or VEX.W is set to 1. Incredibly frustrating.\n  // Use the destination size as the element size in this case.\n  auto OverridenElementSize = ElementSize;\n  if (ElementSize == OpSize::i32Bit) {\n    OverridenElementSize = DstSize;\n  }\n\n  // AVX version only operates on 128-bit.\n  const uint8_t NumElements = IR::NumElements(std::min(OpSizeFromSrc(Op), OpSize::i128Bit), OverridenElementSize);\n  Index &= NumElements - 1;\n\n  if (Op->Dest.IsGPR()) {\n    const auto GPRSize = GetGPROpSize();\n    // Extract already zero extends the result.\n    Ref Result = _VExtractToGPR(OpSize::i128Bit, OverridenElementSize, Src, Index);\n    StoreResultGPR_WithOpSize(Op, Op->Dest, Result, GPRSize);\n    return;\n  }\n\n  // If we are storing to memory then we store the size of the element extracted\n  Ref Dest = MakeSegmentAddress(Op, Op->Dest);\n  _VStoreVectorElement(OpSize::i128Bit, OverridenElementSize, Src, Index, Dest);\n}\n\nvoid OpDispatchBuilder::VEXTRACT128Op(OpcodeArgs) {\n  const auto DstIsXMM = Op->Dest.IsGPR();\n  const auto StoreSize = DstIsXMM ? OpSize::i256Bit : OpSize::i128Bit;\n  const auto Selector = Op->Src[1].Literal() & 0b1;\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  // A selector of zero is the same as doing a 128-bit vector move.\n  if (Selector == 0) {\n    Ref Result = DstIsXMM ? _VMov(OpSize::i128Bit, Src) : Src;\n    StoreResultFPR_WithOpSize(Op, Op->Dest, Result, StoreSize);\n    return;\n  }\n\n  // Otherwise replicate the element and only store the first 128-bits.\n  Ref Result = _VDupElement(OpSize::i256Bit, OpSize::i128Bit, Src, Selector);\n  if (DstIsXMM) {\n    Result = _VMov(OpSize::i128Bit, Result);\n  }\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, StoreSize);\n}\n\nRef OpDispatchBuilder::PSIGNImpl(OpcodeArgs, IR::OpSize ElementSize, Ref Src1, Ref Src2) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Control = _VSQSHL(Size, ElementSize, Src2, IR::OpSizeAsBits(ElementSize) - 1);\n  Control = _VSRSHR(Size, ElementSize, Control, IR::OpSizeAsBits(ElementSize) - 1);\n  return _VMul(Size, ElementSize, Src1, Control);\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::PSIGN(OpcodeArgs) {\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Res = PSIGNImpl(Op, ElementSize, Dest, Src);\n\n  StoreResultFPR(Op, Res);\n}\n\ntemplate void OpDispatchBuilder::PSIGN<OpSize::i8Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::PSIGN<OpSize::i16Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::PSIGN<OpSize::i32Bit>(OpcodeArgs);\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::VPSIGN(OpcodeArgs) {\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Res = PSIGNImpl(Op, ElementSize, Src1, Src2);\n\n  StoreResultFPR(Op, Res);\n}\n\ntemplate void OpDispatchBuilder::VPSIGN<OpSize::i8Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VPSIGN<OpSize::i16Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VPSIGN<OpSize::i32Bit>(OpcodeArgs);\n\nRef OpDispatchBuilder::PSRLDOpImpl(OpcodeArgs, IR::OpSize ElementSize, Ref Src, Ref ShiftVec) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  // Incoming element size for the shift source is always 8\n  return _VUShrSWide(Size, ElementSize, Src, ShiftVec);\n}\n\nvoid OpDispatchBuilder::PSRLDOp(OpcodeArgs, IR::OpSize ElementSize) {\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = PSRLDOpImpl(Op, ElementSize, Dest, Src);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPSRLDOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto DstSize = GetDstSize(Op);\n  const auto Is128Bit = DstSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Shift = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Result = PSRLDOpImpl(Op, ElementSize, Src, Shift);\n\n  if (Is128Bit) {\n    Result = _VMov(OpSize::i128Bit, Result);\n  }\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::PSRLI(OpcodeArgs, IR::OpSize ElementSize) {\n  const uint64_t ShiftConstant = Op->Src[1].Literal();\n  if (ShiftConstant == 0) [[unlikely]] {\n    // Nothing to do, value is already in Dest.\n    return;\n  }\n\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Shift = _VUShrI(Size, ElementSize, Dest, ShiftConstant);\n  StoreResultFPR(Op, Shift);\n}\n\nvoid OpDispatchBuilder::VPSRLIOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto Size = OpSizeFromSrc(Op);\n  const auto Is128Bit = Size == OpSize::i128Bit;\n  const uint64_t ShiftConstant = Op->Src[1].Literal();\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = Src;\n\n  if (ShiftConstant != 0) [[likely]] {\n    Result = _VUShrI(Size, ElementSize, Src, ShiftConstant);\n  } else {\n    if (Is128Bit) {\n      Result = _VMov(OpSize::i128Bit, Result);\n    }\n  }\n\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::PSLLIImpl(OpcodeArgs, IR::OpSize ElementSize, Ref Src, uint64_t Shift) {\n  if (Shift == 0) [[unlikely]] {\n    // If zero-shift then just return the source.\n    return Src;\n  }\n  const auto Size = OpSizeFromSrc(Op);\n  return _VShlI(Size, ElementSize, Src, Shift);\n}\n\nvoid OpDispatchBuilder::PSLLI(OpcodeArgs, IR::OpSize ElementSize) {\n  const uint64_t ShiftConstant = Op->Src[1].Literal();\n  if (ShiftConstant == 0) [[unlikely]] {\n    // Nothing to do, value is already in Dest.\n    return;\n  }\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Result = PSLLIImpl(Op, ElementSize, Dest, ShiftConstant);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPSLLIOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const uint64_t ShiftConstant = Op->Src[1].Literal();\n  const auto DstSize = GetDstSize(Op);\n  const auto Is128Bit = DstSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = PSLLIImpl(Op, ElementSize, Src, ShiftConstant);\n  if (ShiftConstant == 0 && Is128Bit) {\n    Result = _VMov(OpSize::i128Bit, Result);\n  }\n\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::PSLLImpl(OpcodeArgs, IR::OpSize ElementSize, Ref Src, Ref ShiftVec) {\n  const auto Size = OpSizeFromDst(Op);\n\n  // Incoming element size for the shift source is always 8\n  return _VUShlSWide(Size, ElementSize, Src, ShiftVec);\n}\n\nvoid OpDispatchBuilder::PSLL(OpcodeArgs, IR::OpSize ElementSize) {\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = PSLLImpl(Op, ElementSize, Dest, Src);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPSLLOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto DstSize = GetDstSize(Op);\n  const auto Is128Bit = DstSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR_WithOpSize(Op, Op->Src[1], OpSize::i128Bit, Op->Flags);\n  Ref Result = PSLLImpl(Op, ElementSize, Src1, Src2);\n\n  if (Is128Bit) {\n    Result = _VMov(OpSize::i128Bit, Result);\n  }\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::PSRAOpImpl(OpcodeArgs, IR::OpSize ElementSize, Ref Src, Ref ShiftVec) {\n  const auto Size = OpSizeFromDst(Op);\n\n  // Incoming element size for the shift source is always 8\n  return _VSShrSWide(Size, ElementSize, Src, ShiftVec);\n}\n\nvoid OpDispatchBuilder::PSRAOp(OpcodeArgs, IR::OpSize ElementSize) {\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = PSRAOpImpl(Op, ElementSize, Dest, Src);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPSRAOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto DstSize = GetDstSize(Op);\n  const auto Is128Bit = DstSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Result = PSRAOpImpl(Op, ElementSize, Src1, Src2);\n\n  if (Is128Bit) {\n    Result = _VMov(OpSize::i128Bit, Result);\n  }\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::PSRLDQ(OpcodeArgs) {\n  const uint64_t Shift = Op->Src[1].Literal();\n  if (Shift == 0) [[unlikely]] {\n    // Nothing to do, value is already in Dest.\n    return;\n  }\n\n  const auto Size = OpSizeFromDst(Op);\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Result = LoadZeroVector(Size);\n\n  if (Shift < IR::OpSizeToSize(Size)) {\n    Result = _VExtr(Size, OpSize::i8Bit, Result, Dest, Shift);\n  }\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPSRLDQOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto Is128Bit = DstSize == OpSize::i128Bit;\n  const uint64_t Shift = Op->Src[1].Literal();\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  Ref Result {};\n  if (Shift == 0) [[unlikely]] {\n    if (Is128Bit) {\n      Result = _VMov(OpSize::i128Bit, Src);\n    } else {\n      Result = Src;\n    }\n  } else {\n    Result = LoadZeroVector(DstSize);\n\n    if (Is128Bit) {\n      if (Shift < IR::OpSizeToSize(DstSize)) {\n        Result = _VExtr(DstSize, OpSize::i8Bit, Result, Src, Shift);\n      }\n    } else {\n      if (Shift < Core::CPUState::XMM_SSE_REG_SIZE) {\n        Ref ResultBottom = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Result, Src, Shift);\n        Ref ResultTop = _VExtr(DstSize, OpSize::i8Bit, Result, Src, 16 + Shift);\n\n        Result = _VInsElement(DstSize, OpSize::i128Bit, 1, 0, ResultBottom, ResultTop);\n      }\n    }\n  }\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::PSLLDQ(OpcodeArgs) {\n  const uint64_t Shift = Op->Src[1].Literal();\n  if (Shift == 0) [[unlikely]] {\n    // Nothing to do, value is already in Dest.\n    return;\n  }\n\n  const auto Size = OpSizeFromDst(Op);\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Result = LoadZeroVector(Size);\n  if (Shift < IR::OpSizeToSize(Size)) {\n    Result = _VExtr(Size, OpSize::i8Bit, Dest, Result, IR::OpSizeToSize(Size) - Shift);\n  }\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPSLLDQOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto DstSizeInt = IR::OpSizeToSize(DstSize);\n  const auto Is128Bit = DstSize == OpSize::i128Bit;\n  const uint64_t Shift = Op->Src[1].Literal();\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  Ref Result = Src;\n\n  if (Shift == 0) {\n    if (Is128Bit) {\n      Result = _VMov(OpSize::i128Bit, Result);\n    }\n  } else {\n    Result = LoadZeroVector(DstSize);\n    if (Is128Bit) {\n      if (Shift < DstSizeInt) {\n        Result = _VExtr(DstSize, OpSize::i8Bit, Src, Result, DstSizeInt - Shift);\n      }\n    } else {\n      if (Shift < Core::CPUState::XMM_SSE_REG_SIZE) {\n        Ref ResultBottom = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src, Result, 16 - Shift);\n        Ref ResultTop = _VExtr(DstSize, OpSize::i8Bit, Src, Result, DstSizeInt - Shift);\n\n        Result = _VInsElement(DstSize, OpSize::i128Bit, 1, 0, ResultBottom, ResultTop);\n      }\n    }\n  }\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::PSRAIOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const uint64_t Shift = Op->Src[1].Literal();\n  if (Shift == 0) [[unlikely]] {\n    // Nothing to do, value is already in Dest.\n    return;\n  }\n\n  const auto Size = OpSizeFromDst(Op);\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Result = _VSShrI(Size, ElementSize, Dest, Shift);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPSRAIOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const uint64_t Shift = Op->Src[1].Literal();\n  const auto Size = OpSizeFromDst(Op);\n  const auto Is128Bit = Size == OpSize::i128Bit;\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = Src;\n\n  if (Shift != 0) [[likely]] {\n    Result = _VSShrI(Size, ElementSize, Src, Shift);\n  } else {\n    if (Is128Bit) {\n      Result = _VMov(OpSize::i128Bit, Result);\n    }\n  }\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::AVXVariableShiftImpl(OpcodeArgs, IROps IROp) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  Ref Vector = LoadSourceFPR_WithOpSize(Op, Op->Src[0], DstSize, Op->Flags);\n  Ref ShiftVector = LoadSourceFPR_WithOpSize(Op, Op->Src[1], DstSize, Op->Flags);\n\n  DeriveOp(Shift, IROp, _VUShr(DstSize, SrcSize, Vector, ShiftVector, true));\n\n  StoreResultFPR(Op, Shift);\n}\n\nvoid OpDispatchBuilder::VPSLLVOp(OpcodeArgs) {\n  AVXVariableShiftImpl(Op, IROps::OP_VUSHL);\n}\n\nvoid OpDispatchBuilder::VPSRAVDOp(OpcodeArgs) {\n  AVXVariableShiftImpl(Op, IROps::OP_VSSHR);\n}\n\nvoid OpDispatchBuilder::VPSRLVOp(OpcodeArgs) {\n  AVXVariableShiftImpl(Op, IROps::OP_VUSHR);\n}\n\nvoid OpDispatchBuilder::MOVDDUPOp(OpcodeArgs) {\n  // If loading a vector, use the full size, so we don't\n  // unnecessarily zero extend the vector. Otherwise, if\n  // memory, then we want to load the element size exactly.\n  const auto SrcSize = Op->Src[0].IsGPR() ? OpSize::i128Bit : OpSizeFromSrc(Op);\n  Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags);\n  Ref Res = _VDupElement(OpSize::i128Bit, OpSizeFromSrc(Op), Src, 0);\n\n  StoreResultFPR(Op, Res);\n}\n\nvoid OpDispatchBuilder::VMOVDDUPOp(OpcodeArgs) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto IsSrcGPR = Op->Src[0].IsGPR();\n  const auto Is256Bit = SrcSize == OpSize::i256Bit;\n  const auto MemSize = Is256Bit ? OpSize::i256Bit : OpSize::i64Bit;\n\n  const auto LoadSize = IsSrcGPR ? SrcSize : MemSize;\n  Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], LoadSize, Op->Flags);\n\n  Ref Res {};\n  if (Is256Bit) {\n    Res = _VTrn(SrcSize, OpSize::i64Bit, Src, Src);\n  } else {\n    Res = _VDupElement(SrcSize, OpSize::i64Bit, Src, 0);\n  }\n\n  StoreResultFPR(Op, Res);\n}\n\nRef OpDispatchBuilder::CVTGPR_To_FPRImpl(OpcodeArgs, IR::OpSize DstElementSize, const X86Tables::DecodedOperand& Src1Op,\n                                         const X86Tables::DecodedOperand& Src2Op) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  Ref Src1 = LoadSourceFPR_WithOpSize(Op, Src1Op, OpSize::i128Bit, Op->Flags);\n  Ref Converted {};\n  if (Src2Op.IsGPR()) {\n    // If the source is a GPR then convert directly from the GPR.\n    auto Src2 = LoadSourceGPR_WithOpSize(Op, Src2Op, GetGPROpSize(), Op->Flags);\n    Converted = _Float_FromGPR_S(DstElementSize, SrcSize, Src2);\n  } else if (SrcSize != DstElementSize) {\n    // If the source is from memory but the Source size and destination size aren't the same,\n    // then it is more optimal to load in to a GPR and convert between GPR->FPR.\n    // ARM GPR->FPR conversion supports different size source and destinations while FPR->FPR doesn't.\n    auto Src2 = LoadSourceGPR(Op, Src2Op, Op->Flags);\n    Converted = _Float_FromGPR_S(DstElementSize, SrcSize, Src2);\n  } else {\n    // In the case of cvtsi2s{s,d} where the source and destination are the same size,\n    // then it is more optimal to load in to the FPR register directly and convert there.\n    auto Src2 = LoadSourceFPR(Op, Src2Op, Op->Flags);\n    Converted = _Vector_SToF(SrcSize, SrcSize, Src2);\n  }\n\n  return _VInsElement(OpSize::i128Bit, DstElementSize, 0, 0, Src1, Converted);\n}\n\ntemplate<IR::OpSize DstElementSize>\nvoid OpDispatchBuilder::CVTGPR_To_FPR(OpcodeArgs) {\n  Ref Result = CVTGPR_To_FPRImpl(Op, DstElementSize, Op->Dest, Op->Src[0]);\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::CVTGPR_To_FPR<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::CVTGPR_To_FPR<OpSize::i64Bit>(OpcodeArgs);\n\ntemplate<IR::OpSize DstElementSize>\nvoid OpDispatchBuilder::AVXCVTGPR_To_FPR(OpcodeArgs) {\n  Ref Result = CVTGPR_To_FPRImpl(Op, DstElementSize, Op->Src[0], Op->Src[1]);\n  StoreResultFPR(Op, Result);\n}\ntemplate void OpDispatchBuilder::AVXCVTGPR_To_FPR<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXCVTGPR_To_FPR<OpSize::i64Bit>(OpcodeArgs);\n\nRef OpDispatchBuilder::CVTFPR_To_GPRImpl(OpcodeArgs, Ref Src, IR::OpSize SrcElementSize, bool HostRoundingMode) {\n  // GPR size is determined by REX.W\n  // Source Element size is determined by instruction\n  const auto GPRSize = OpSizeFromDst(Op);\n\n  if (CTX->HostFeatures.SupportsFRINTTS) {\n    // When we have FRINTTS, this is a two-step process. First, we round to the\n    // right integer (where _Vector_FToISized matches x86 semantics), then just\n    // convert that to a GPR.\n    Src = _Vector_FToISized(SrcElementSize, SrcElementSize, Src, HostRoundingMode, GPRSize);\n    return _Float_ToGPR_ZS(GPRSize, SrcElementSize, Src);\n  } else {\n    // When we lack hardware support, we need a bit of a convoluted sequence of\n    // fixups before before and after conversion to emulate x86 semantics.\n    if (HostRoundingMode) {\n      Src = _Vector_FToI(SrcElementSize, SrcElementSize, Src, RoundMode::Host);\n    }\n\n    Ref Converted = _Float_ToGPR_ZS(GPRSize, SrcElementSize, Src);\n\n    bool Dst32 = GPRSize == OpSize::i32Bit;\n    Ref MaxI = Dst32 ? Constant(0x80000000) : Constant(0x8000000000000000);\n    Ref MaxF = LoadAndCacheNamedVectorConstant(SrcElementSize, (SrcElementSize == OpSize::i32Bit) ?\n                                                                 (Dst32 ? NAMED_VECTOR_CVTMAX_F32_I32 : NAMED_VECTOR_CVTMAX_F32_I64) :\n                                                                 (Dst32 ? NAMED_VECTOR_CVTMAX_F64_I32 : NAMED_VECTOR_CVTMAX_F64_I64));\n    return _Select(GPRSize, SrcElementSize, CondClass::FGT, MaxF, Src, Converted, MaxI);\n  }\n}\n\ntemplate<IR::OpSize SrcElementSize, bool HostRoundingMode>\nvoid OpDispatchBuilder::CVTFPR_To_GPR(OpcodeArgs) {\n  // If loading a vector, use the full size, so we don't\n  // unnecessarily zero extend the vector. Otherwise, if\n  // memory, then we want to load the element size exactly.\n  const auto SrcSize = Op->Src[0].IsGPR() ? OpSize::i128Bit : SrcElementSize;\n  Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags);\n  Ref Result = CVTFPR_To_GPRImpl(Op, Src, SrcElementSize, HostRoundingMode);\n  StoreResultGPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::CVTFPR_To_GPR<OpSize::i32Bit, true>(OpcodeArgs);\ntemplate void OpDispatchBuilder::CVTFPR_To_GPR<OpSize::i32Bit, false>(OpcodeArgs);\n\ntemplate void OpDispatchBuilder::CVTFPR_To_GPR<OpSize::i64Bit, true>(OpcodeArgs);\ntemplate void OpDispatchBuilder::CVTFPR_To_GPR<OpSize::i64Bit, false>(OpcodeArgs);\n\nRef OpDispatchBuilder::Vector_CVT_Int_To_FloatImpl(OpcodeArgs, IR::OpSize SrcElementSize, bool Widen) {\n  const auto Size = OpSizeFromDst(Op);\n\n  Ref Src = [&] {\n    if (Widen) {\n      // If loading a vector, use the full size, so we don't\n      // unnecessarily zero extend the vector. Otherwise, if\n      // memory, then we want to load the element size exactly.\n      const auto LoadSize = Op->Src[0].IsGPR() ? OpSize::i128Bit : IR::SizeToOpSize(8 * (IR::OpSizeToSize(Size) / 16));\n      return LoadSourceFPR_WithOpSize(Op, Op->Src[0], LoadSize, Op->Flags);\n    } else {\n      return LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    }\n  }();\n\n  auto ElementSize = SrcElementSize;\n  if (Widen) {\n    Src = _VSXTL(Size, ElementSize, Src);\n    ElementSize = ElementSize << 1;\n  }\n\n  return _Vector_SToF(Size, ElementSize, Src);\n}\n\ntemplate<IR::OpSize SrcElementSize, bool Widen>\nvoid OpDispatchBuilder::Vector_CVT_Int_To_Float(OpcodeArgs) {\n  Ref Result = Vector_CVT_Int_To_FloatImpl(Op, SrcElementSize, Widen);\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::Vector_CVT_Int_To_Float<OpSize::i32Bit, true>(OpcodeArgs);\ntemplate void OpDispatchBuilder::Vector_CVT_Int_To_Float<OpSize::i32Bit, false>(OpcodeArgs);\n\nRef OpDispatchBuilder::Vector_CVT_Float_To_Int32Impl(OpcodeArgs, IR::OpSize DstSize, Ref Src, IR::OpSize SrcSize, IR::OpSize SrcElementSize,\n                                                     bool HostRoundingMode, bool ZeroUpperHalf) {\n  if (CTX->HostFeatures.SupportsFRINTTS && SrcSize != OpSize::i256Bit) {\n    // If we have FRINTS, this is the usual 2-step\n    Src = _Vector_FToISized(SrcSize, SrcElementSize, Src, HostRoundingMode, OpSize::i32Bit);\n    Ref Dst = _Vector_FToZS(SrcSize, SrcElementSize, Src);\n    if (SrcElementSize == OpSize::i32Bit) {\n      // Return 32-bit result as-is\n      return Dst;\n    } else {\n      // Down step from 64-bit ints to 32-bit ints\n      return _VUShrNI(DstSize, SrcElementSize, Dst, 0);\n    }\n  } else {\n    // Otherwise, we have to do all the fixups, but vectorized.\n    if (HostRoundingMode) {\n      Src = _Vector_FToI(SrcSize, SrcElementSize, Src, RoundMode::Host);\n    }\n\n    OpSize OverflowConstSize = ZeroUpperHalf && SrcElementSize == OpSize::i64Bit ? DstSize / 2 : DstSize;\n    Ref MaxI = LoadAndCacheNamedVectorConstant(OverflowConstSize, NAMED_VECTOR_CVTMAX_I32);\n    Ref Converted {}, Cmp {};\n    if (SrcElementSize == OpSize::i64Bit) {\n      Ref MaxF = LoadAndCacheNamedVectorConstant(SrcSize, NAMED_VECTOR_CVTMAX_F64_I32);\n      Converted = _Vector_F64ToI32(DstSize, Src, RoundMode::TowardsZero, ZeroUpperHalf);\n\n      Cmp = _VFCMPGT(SrcSize, OpSize::i64Bit, MaxF, Src);\n      Cmp = _VUShrNI(DstSize, OpSize::i64Bit, Cmp, 32);\n    } else {\n      Ref MaxF = LoadAndCacheNamedVectorConstant(DstSize, NAMED_VECTOR_CVTMAX_F32_I32);\n      Converted = _Vector_FToZS(DstSize, OpSize::i32Bit, Src);\n      Cmp = _VFCMPGT(DstSize, OpSize::i32Bit, MaxF, Src);\n    }\n    return _VBSL(DstSize, Cmp, Converted, MaxI);\n  }\n}\n\ntemplate<IR::OpSize SrcElementSize, bool HostRoundingMode>\nvoid OpDispatchBuilder::Vector_CVT_Float_To_Int(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = Vector_CVT_Float_To_Int32Impl(Op, DstSize, Src, OpSizeFromSrc(Op), SrcElementSize, HostRoundingMode, true);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, DstSize);\n}\n\ntemplate void OpDispatchBuilder::Vector_CVT_Float_To_Int<OpSize::i32Bit, false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::Vector_CVT_Float_To_Int<OpSize::i32Bit, true>(OpcodeArgs);\n\ntemplate void OpDispatchBuilder::Vector_CVT_Float_To_Int<OpSize::i64Bit, true>(OpcodeArgs);\ntemplate void OpDispatchBuilder::Vector_CVT_Float_To_Int<OpSize::i64Bit, false>(OpcodeArgs);\n\nRef OpDispatchBuilder::Scalar_CVT_Float_To_FloatImpl(OpcodeArgs, IR::OpSize DstElementSize, IR::OpSize SrcElementSize,\n                                                     const X86Tables::DecodedOperand& Src1Op, const X86Tables::DecodedOperand& Src2Op) {\n  // In the case of vectors, we can just specify the full vector length,\n  // so that we don't unnecessarily zero-extend the entire vector.\n  // Otherwise, if it's a memory load, then we only want to load its exact size.\n  const auto Src2Size = Src2Op.IsGPR() ? OpSize::i128Bit : SrcElementSize;\n\n  Ref Src1 = LoadSourceFPR_WithOpSize(Op, Src1Op, OpSize::i128Bit, Op->Flags);\n  Ref Src2 = LoadSourceFPR_WithOpSize(Op, Src2Op, Src2Size, Op->Flags);\n\n  Ref Converted = _Float_FToF(DstElementSize, SrcElementSize, Src2);\n\n  return _VInsElement(OpSize::i128Bit, DstElementSize, 0, 0, Src1, Converted);\n}\n\ntemplate<IR::OpSize DstElementSize, IR::OpSize SrcElementSize>\nvoid OpDispatchBuilder::Scalar_CVT_Float_To_Float(OpcodeArgs) {\n  Ref Result = Scalar_CVT_Float_To_FloatImpl(Op, DstElementSize, SrcElementSize, Op->Dest, Op->Src[0]);\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::Scalar_CVT_Float_To_Float<OpSize::i32Bit, OpSize::i64Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::Scalar_CVT_Float_To_Float<OpSize::i64Bit, OpSize::i32Bit>(OpcodeArgs);\n\ntemplate<IR::OpSize DstElementSize, IR::OpSize SrcElementSize>\nvoid OpDispatchBuilder::AVXScalar_CVT_Float_To_Float(OpcodeArgs) {\n  Ref Result = Scalar_CVT_Float_To_FloatImpl(Op, DstElementSize, SrcElementSize, Op->Src[0], Op->Src[1]);\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::AVXScalar_CVT_Float_To_Float<OpSize::i32Bit, OpSize::i64Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXScalar_CVT_Float_To_Float<OpSize::i64Bit, OpSize::i32Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::Vector_CVT_Float_To_Float(OpcodeArgs, IR::OpSize DstElementSize, IR::OpSize SrcElementSize, bool IsAVX) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  const auto IsFloatSrc = SrcElementSize == OpSize::i32Bit;\n  const auto Is128Bit = SrcSize == OpSize::i128Bit;\n\n  const auto LoadSize = IsFloatSrc && !Op->Src[0].IsGPR() ? (SrcSize >> 1) : SrcSize;\n\n  Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], LoadSize, Op->Flags);\n\n  Ref Result {};\n  if (DstElementSize > SrcElementSize) {\n    Result = _Vector_FToF(SrcSize, SrcElementSize << 1, Src, SrcElementSize);\n  } else {\n    Result = _Vector_FToF(SrcSize, SrcElementSize >> 1, Src, SrcElementSize);\n  }\n\n  if (IsAVX) {\n    if (!IsFloatSrc && !Is128Bit) {\n      // VCVTPD2PS path\n      Result = _VMov(OpSize::i128Bit, Result);\n    } else if (IsFloatSrc && Is128Bit) {\n      // VCVTPS2PD path\n      Result = _VMov(OpSize::i128Bit, Result);\n    }\n  }\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::MMX_To_XMM_Vector_CVT_Int_To_Float(OpcodeArgs) {\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  // Always 32-bit.\n  auto ElementSize = OpSize::i32Bit;\n  const auto DstSize = OpSizeFromDst(Op);\n\n  Src = _VSXTL(DstSize, ElementSize, Src);\n  ElementSize = ElementSize << 1;\n\n  // Always signed\n  Src = _Vector_SToF(DstSize, ElementSize, Src);\n\n  StoreResultFPR(Op, Src);\n}\n\ntemplate<IR::OpSize SrcElementSize, bool HostRoundingMode>\nvoid OpDispatchBuilder::XMM_To_MMX_Vector_CVT_Float_To_Int(OpcodeArgs) {\n  // This function causes a change in MMX state from X87 to MMX\n  if (MMXState == MMXState_X87) {\n    ChgStateX87_MMX();\n  }\n\n  // If loading a vector, use the full size, so we don't\n  // unnecessarily zero extend the vector. Otherwise, if\n  // memory, then we want to load the element size exactly.\n  const auto SrcSize = Op->Src[0].IsGPR() ? OpSize::i128Bit : OpSizeFromSrc(Op);\n  const auto DstSize = OpSizeFromDst(Op);\n  Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags);\n  Ref Result = Vector_CVT_Float_To_Int32Impl(Op, DstSize, Src, SrcSize, SrcElementSize, HostRoundingMode, false /* TODO? */);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, DstSize);\n}\n\ntemplate void OpDispatchBuilder::XMM_To_MMX_Vector_CVT_Float_To_Int<OpSize::i32Bit, false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::XMM_To_MMX_Vector_CVT_Float_To_Int<OpSize::i32Bit, true>(OpcodeArgs);\ntemplate void OpDispatchBuilder::XMM_To_MMX_Vector_CVT_Float_To_Int<OpSize::i64Bit, false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::XMM_To_MMX_Vector_CVT_Float_To_Int<OpSize::i64Bit, true>(OpcodeArgs);\n\nvoid OpDispatchBuilder::MASKMOVOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref MaskSrc = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n  // Mask only cares about the top bit of each byte\n  MaskSrc = _VCMPLTZ(Size, OpSize::i8Bit, MaskSrc);\n\n  // Vector that will overwrite byte elements.\n  Ref VectorSrc = LoadSourceGPR(Op, Op->Dest, Op->Flags);\n\n  // RDI source (DS prefix by default)\n  auto MemDest = MakeSegmentAddress(X86State::REG_RDI, Op->Flags, X86Tables::DecodeFlags::FLAG_DS_PREFIX);\n\n  Ref XMMReg = _LoadMemFPR(Size, MemDest, OpSize::i8Bit);\n\n  // If the Mask element high bit is set then overwrite the element with the source, else keep the memory variant\n  XMMReg = _VBSL(Size, MaskSrc, VectorSrc, XMMReg);\n  _StoreMemFPR(Size, MemDest, XMMReg, OpSize::i8Bit);\n}\n\nvoid OpDispatchBuilder::VMASKMOVOpImpl(OpcodeArgs, IR::OpSize ElementSize, IR::OpSize DataSize, bool IsStore,\n                                       const X86Tables::DecodedOperand& MaskOp, const X86Tables::DecodedOperand& DataOp) {\n\n  const auto MakeAddress = [this, Op](const X86Tables::DecodedOperand& Data) {\n    return MakeSegmentAddress(Op, Data, GetGPROpSize());\n  };\n\n  Ref Mask = LoadSourceFPR_WithOpSize(Op, MaskOp, DataSize, Op->Flags);\n\n  if (IsStore) {\n    Ref Data = LoadSourceFPR_WithOpSize(Op, DataOp, DataSize, Op->Flags);\n    Ref Address = MakeAddress(Op->Dest);\n    _VStoreVectorMasked(DataSize, ElementSize, Mask, Data, Address, Invalid(), MemOffsetType::SXTX, 1);\n  } else {\n    const auto Is128Bit = GetDstSize(Op) == Core::CPUState::XMM_SSE_REG_SIZE;\n\n    Ref Address = MakeAddress(DataOp);\n    Ref Result = _VLoadVectorMasked(DataSize, ElementSize, Mask, Address, Invalid(), MemOffsetType::SXTX, 1);\n\n    if (Is128Bit) {\n      Result = _VMov(OpSize::i128Bit, Result);\n    }\n    StoreResultFPR(Op, Result);\n  }\n}\n\ntemplate<IR::OpSize ElementSize, bool IsStore>\nvoid OpDispatchBuilder::VMASKMOVOp(OpcodeArgs) {\n  VMASKMOVOpImpl(Op, ElementSize, OpSizeFromDst(Op), IsStore, Op->Src[0], Op->Src[1]);\n}\ntemplate void OpDispatchBuilder::VMASKMOVOp<OpSize::i32Bit, false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VMASKMOVOp<OpSize::i32Bit, true>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VMASKMOVOp<OpSize::i64Bit, false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VMASKMOVOp<OpSize::i64Bit, true>(OpcodeArgs);\n\ntemplate<bool IsStore>\nvoid OpDispatchBuilder::VPMASKMOVOp(OpcodeArgs) {\n  VMASKMOVOpImpl(Op, OpSizeFromSrc(Op), OpSizeFromDst(Op), IsStore, Op->Src[0], Op->Src[1]);\n}\ntemplate void OpDispatchBuilder::VPMASKMOVOp<false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VPMASKMOVOp<true>(OpcodeArgs);\n\nvoid OpDispatchBuilder::MOVBetweenGPR_FPR(OpcodeArgs, VectorOpType VectorType) {\n  if (Op->Dest.IsGPR() && Op->Dest.Data.GPR.GPR >= FEXCore::X86State::REG_XMM_0) {\n    Ref Result {};\n    if (Op->Src[0].IsGPR()) {\n      // Loading from GPR and moving to Vector.\n      Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], GetGPROpSize(), Op->Flags);\n      // zext to 128bit\n      Result = _VCastFromGPR(OpSize::i128Bit, OpSizeFromSrc(Op), Src);\n    } else {\n      // Loading from Memory as a scalar. Zero extend\n      Result = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    }\n\n    StoreResult_WithAVXInsert(VectorType, RegClass::FPR, Op, Result);\n  } else {\n    Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n    if (Op->Dest.IsGPR()) {\n      const auto ElementSize = OpSizeFromDst(Op);\n      // Extract element from GPR. Zero extending in the process.\n      Src = _VExtractToGPR(OpSizeFromSrc(Op), ElementSize, Src, 0);\n      StoreResultGPR(Op, Op->Dest, Src);\n    } else {\n      // Storing first element to memory.\n      Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.LoadData = false});\n      _StoreMemFPR(OpSizeFromDst(Op), Dest, Src, OpSize::i8Bit);\n    }\n  }\n}\n\nRef OpDispatchBuilder::VFCMPOpImpl(OpSize Size, IR::OpSize ElementSize, Ref Src1, Ref Src2, uint8_t CompType) {\n  switch (static_cast<VectorCompareType>(CompType)) {\n  case VectorCompareType::EQ_OQ:\n  case VectorCompareType::EQ_OS: return _VFCMPEQ(Size, ElementSize, Src1, Src2);\n  case VectorCompareType::LT_OS: // GT(Swapped operand)\n  case VectorCompareType::LT_OQ: return _VFCMPLT(Size, ElementSize, Src1, Src2);\n  case VectorCompareType::LE_OS: // GE(Swapped operand)\n  case VectorCompareType::LE_OQ: return _VFCMPLE(Size, ElementSize, Src1, Src2);\n  case VectorCompareType::UNORD_Q:\n  case VectorCompareType::UNORD_S: return _VFCMPUNO(Size, ElementSize, Src1, Src2);\n  case VectorCompareType::NEQ_UQ:\n  case VectorCompareType::NEQ_US: return _VFCMPNEQ(Size, ElementSize, Src1, Src2);\n  case VectorCompareType::NLT_US: // NGT(Swapped operand)\n  case VectorCompareType::NLT_UQ: {\n    Ref Result = _VFCMPLT(Size, ElementSize, Src1, Src2);\n    return _VNot(Size, ElementSize, Result);\n  }\n  case VectorCompareType::NLE_US: // NGE(Swapped operand)\n  case VectorCompareType::NLE_UQ: {\n    Ref Result = _VFCMPLE(Size, ElementSize, Src1, Src2);\n    return _VNot(Size, ElementSize, Result);\n  }\n  case VectorCompareType::ORD_Q:\n  case VectorCompareType::ORD_S: return _VFCMPORD(Size, ElementSize, Src1, Src2);\n  case VectorCompareType::NGT_UQ:\n  case VectorCompareType::NGT_US: {\n    Ref Result = _VFCMPLT(Size, ElementSize, Src2, Src1);\n    return _VNot(Size, ElementSize, Result);\n  }\n  case VectorCompareType::NGE_UQ:\n  case VectorCompareType::NGE_US: {\n    Ref Result = _VFCMPLE(Size, ElementSize, Src2, Src1);\n    return _VNot(Size, ElementSize, Result);\n  }\n  case VectorCompareType::GT_OQ:\n  case VectorCompareType::GT_OS: return _VFCMPLT(Size, ElementSize, Src2, Src1);\n  case VectorCompareType::GE_OQ:\n  case VectorCompareType::GE_OS: return _VFCMPLE(Size, ElementSize, Src2, Src1);\n  case VectorCompareType::EQ_UQ:\n  case VectorCompareType::EQ_US: {\n    // If either of the sources are unordered, then returns true.\n    Ref Src1_U = _VFCMPEQ(Size, ElementSize, Src1, Src1);\n    Ref Src2_U = _VFCMPEQ(Size, ElementSize, Src2, Src2);\n    auto Ordered = _VAnd(Size, ElementSize, Src1_U, Src2_U);\n\n    Ref Compare_Ordered = _VFCMPEQ(Size, ElementSize, Src1, Src2);\n    return _VOrn(Size, ElementSize, Compare_Ordered, Ordered);\n  }\n  case VectorCompareType::NEQ_OQ:\n  case VectorCompareType::NEQ_OS: {\n    // If either of the sources are unordered, then returns false.\n    Ref Src1_U = _VFCMPEQ(Size, ElementSize, Src1, Src1);\n    Ref Src2_U = _VFCMPEQ(Size, ElementSize, Src2, Src2);\n\n    Ref Compare_Ordered = _VFCMPEQ(Size, ElementSize, Src1, Src2);\n    Ref Result = _VAndn(Size, ElementSize, Src1_U, Compare_Ordered);\n    return _VAnd(Size, ElementSize, Result, Src2_U);\n  }\n  case VectorCompareType::FALSE_OQ:\n  case VectorCompareType::FALSE_OS: return LoadZeroVector(Size);\n  case VectorCompareType::TRUE_UQ:\n  case VectorCompareType::TRUE_US: return _VectorImm(Size, OpSize::i8Bit, -1, 0);\n  }\n  FEX_UNREACHABLE;\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::VFCMPOp(OpcodeArgs) {\n  // No need for zero-extending in the scalar case, since\n  // all we need is an insert at the end of the operation.\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto DstSize = OpSizeFromDst(Op);\n\n  Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags);\n  Ref Dest = LoadSourceFPR_WithOpSize(Op, Op->Dest, DstSize, Op->Flags);\n  const uint8_t CompType = Op->Src[1].Data.Literal.Value;\n\n  Ref Result = VFCMPOpImpl(OpSizeFromSrc(Op), ElementSize, Dest, Src, CompType & 0b111);\n\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::VFCMPOp<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VFCMPOp<OpSize::i64Bit>(OpcodeArgs);\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::AVXVFCMPOp(OpcodeArgs) {\n  // No need for zero-extending in the scalar case, since\n  // all we need is an insert at the end of the operation.\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto DstSize = OpSizeFromDst(Op);\n  const uint8_t CompType = Op->Src[2].Literal();\n\n  Ref Src1 = LoadSourceFPR_WithOpSize(Op, Op->Src[0], DstSize, Op->Flags);\n  Ref Src2 = LoadSourceFPR_WithOpSize(Op, Op->Src[1], SrcSize, Op->Flags);\n  Ref Result = VFCMPOpImpl(OpSizeFromSrc(Op), ElementSize, Src1, Src2, CompType & 0b11111);\n\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::AVXVFCMPOp<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVFCMPOp<OpSize::i64Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::FXSaveOp(OpcodeArgs) {\n  Ref Mem = MakeSegmentAddress(Op, Op->Dest);\n\n  SaveX87State(Op, Mem);\n  SaveSSEState(Mem);\n  SaveMXCSRState(Mem);\n}\n\nvoid OpDispatchBuilder::XSaveOp(OpcodeArgs) {\n  XSaveOpImpl(Op);\n}\n\nRef OpDispatchBuilder::XSaveBase(X86Tables::DecodedOp Op) {\n  return MakeSegmentAddress(Op, Op->Dest);\n}\n\nvoid OpDispatchBuilder::XSaveOpImpl(OpcodeArgs) {\n  // NOTE: Mask should be EAX and EDX concatenated, but we only need to test\n  //       for features that are in the lower 32 bits, so EAX only is sufficient.\n  const auto OpSize = GetGPROpSize();\n\n  const auto StoreIfFlagSet = [this, OpSize](uint32_t BitIndex, auto fn, uint32_t FieldSize = 1) {\n    Ref Mask = LoadGPRRegister(X86State::REG_RAX);\n    Ref BitFlag = _Bfe(OpSize, FieldSize, BitIndex, Mask);\n    auto CondJump_ = CondJump(BitFlag, CondClass::NEQ);\n\n    auto StoreBlock = CreateNewCodeBlockAfter(GetCurrentBlock());\n    SetTrueJumpTarget(CondJump_, StoreBlock);\n    SetCurrentCodeBlock(StoreBlock);\n    StartNewBlock();\n    { fn(); }\n    auto Jump_ = Jump();\n    auto NextJumpTarget = CreateNewCodeBlockAfter(StoreBlock);\n    SetJumpTarget(Jump_, NextJumpTarget);\n    SetFalseJumpTarget(CondJump_, NextJumpTarget);\n    SetCurrentCodeBlock(NextJumpTarget);\n    StartNewBlock();\n  };\n\n  // x87\n  {\n    StoreIfFlagSet(0, [this, Op] { SaveX87State(Op, XSaveBase(Op)); });\n  }\n  // SSE\n  {\n    StoreIfFlagSet(1, [this, Op] { SaveSSEState(XSaveBase(Op)); });\n  }\n  // AVX\n  if (CTX->HostFeatures.SupportsAVX) {\n    StoreIfFlagSet(2, [this, Op] { std::invoke(SaveAVXStateFunc, this, XSaveBase(Op)); });\n  }\n\n  // We need to save MXCSR and MXCSR_MASK if either SSE or AVX are requested to be saved\n  {\n    StoreIfFlagSet(1, [this, Op] { SaveMXCSRState(XSaveBase(Op)); }, 2);\n  }\n\n  // Update XSTATE_BV region of the XSAVE header\n  {\n    Ref Base = XSaveBase(Op);\n\n    // NOTE: We currently only support the first 3 bits (x87, SSE, and AVX)\n    Ref Mask = LoadGPRRegister(X86State::REG_RAX);\n    Ref RequestedFeatures = _Bfe(OpSize, 3, 0, Mask);\n\n    // XSTATE_BV section of the header is 8 bytes in size, but we only really\n    // care about setting at most 3 bits in the first byte. We zero out the rest.\n    _StoreMemGPR(OpSize::i64Bit, RequestedFeatures, Base, Constant(512), OpSize::i8Bit, MemOffsetType::SXTX, 1);\n  }\n}\n\nvoid OpDispatchBuilder::SaveX87State(OpcodeArgs, Ref MemBase) {\n  _SyncStackToSlow();\n\n  // Saves 512bytes to the memory location provided\n  // Header changes depending on if REX.W is set or not\n  if (Op->Flags & X86Tables::DecodeFlags::FLAG_REX_WIDENING) {\n    // BYTE | 0 1 | 2 3 | 4   | 5     | 6 7 | 8 9 | a b | c d | e f |\n    // ------------------------------------------\n    //   00 | FCW | FSW | FTW | <R>   | FOP | FIP                   |\n    //   16 | FDP                           | MXCSR     | MXCSR_MASK|\n  } else {\n    // BYTE | 0 1 | 2 3 | 4   | 5     | 6 7 | 8 9 | a b | c d | e f |\n    // ------------------------------------------\n    //   00 | FCW | FSW | FTW | <R>   | FOP | FIP[31:0] | FCS | <R> |\n    //   16 | FDP[31:0] | FDS         | <R> | MXCSR     | MXCSR_MASK|\n  }\n\n  {\n    auto FCW = _LoadContextGPR(OpSize::i16Bit, offsetof(FEXCore::Core::CPUState, FCW));\n    _StoreMemGPR(OpSize::i16Bit, MemBase, FCW, OpSize::i16Bit);\n  }\n\n  { _StoreMemGPR(OpSize::i16Bit, ReconstructFSW_Helper(), MemBase, Constant(2), OpSize::i16Bit, MemOffsetType::SXTX, 1); }\n\n  {\n    // Abridged FTW\n    auto FTW = _LoadContextGPR(OpSize::i8Bit, offsetof(FEXCore::Core::CPUState, AbridgedFTW));\n    _StoreMemGPR(OpSize::i8Bit, FTW, MemBase, Constant(4), OpSize::i8Bit, MemOffsetType::SXTX, 1);\n  }\n\n  // BYTE | 0 1 | 2 3 | 4   | 5     | 6 7 | 8 9 | a b | c d | e f |\n  // ------------------------------------------\n  //   32 | ST0/MM0                             | <R>\n  //   48 | ST1/MM1                             | <R>\n  //   64 | ST2/MM2                             | <R>\n  //   80 | ST3/MM3                             | <R>\n  //   96 | ST4/MM4                             | <R>\n  //  112 | ST5/MM5                             | <R>\n  //  128 | ST6/MM6                             | <R>\n  //  144 | ST7/MM7                             | <R>\n  //  160 | XMM0\n  //  173 | XMM1\n  //  192 | XMM2\n  //  208 | XMM3\n  //  224 | XMM4\n  //  240 | XMM5\n  //  256 | XMM6\n  //  272 | XMM7\n  //  288 | 64BitMode ? <R> : XMM8\n  //  304 | 64BitMode ? <R> : XMM9\n  //  320 | 64BitMode ? <R> : XMM10\n  //  336 | 64BitMode ? <R> : XMM11\n  //  352 | 64BitMode ? <R> : XMM12\n  //  368 | 64BitMode ? <R> : XMM13\n  //  384 | 64BitMode ? <R> : XMM14\n  //  400 | 64BitMode ? <R> : XMM15\n  //  416 | <R>\n  //  432 | <R>\n  //  448 | <R>\n  //  464 | Available\n  //  480 | Available\n  //  496 | Available\n  // FCW: x87 FPU control word\n  // FSW: x87 FPU status word\n  // FTW: x87 FPU Tag word (Abridged)\n  // FOP: x87 FPU opcode. Lower 11 bits of the opcode\n  // FIP: x87 FPU instructyion pointer offset\n  // FCS: x87 FPU instruction pointer selector. If CPUID_0000_0007_0000_00000:EBX[bit 13] = 1 then this is deprecated and stores as 0\n  // FDP: x87 FPU instruction operand (data) pointer offset\n  // FDS: x87 FPU instruction operand (data) pointer selector. Same deprecation as FCS\n  // MXCSR: If OSFXSR bit in CR4 is not set then this may not be saved\n  // MXCSR_MASK: Mask for writes to the MXCSR register\n  // If OSFXSR bit in CR4 is not set than FXSAVE /may/ not save the XMM registers\n  // This is implementation dependent\n  //\n  // x87 registers are stored rotated depending on the current TOP.\n  Ref Top = GetX87Top();\n  auto SevenConst = Constant(7);\n  const auto LoadSize = ReducedPrecisionMode ? OpSize::i64Bit : OpSize::i128Bit;\n\n  for (uint32_t i = 0; i < Core::CPUState::NUM_MMS; ++i) {\n    Ref data = _LoadContextFPRIndexed(Top, LoadSize, MMBaseOffset(), IR::OpSizeToSize(OpSize::i128Bit));\n    if (ReducedPrecisionMode) {\n      data = _F80CVTTo(data, OpSize::i64Bit);\n    }\n    _StoreMemFPR(OpSize::i128Bit, data, MemBase, Constant(16 * i + 32), OpSize::i8Bit, MemOffsetType::SXTX, 1);\n    Top = _And(OpSize::i32Bit, Add(OpSize::i32Bit, Top, 1), SevenConst);\n  }\n}\n\nvoid OpDispatchBuilder::SaveSSEState(Ref MemBase) {\n  const auto NumRegs = Is64BitMode ? 16U : 8U;\n\n  for (uint32_t i = 0; i < NumRegs; i += 2) {\n    _StoreMemPairFPR(OpSize::i128Bit, LoadXMMRegister(i), LoadXMMRegister(i + 1), MemBase, i * 16 + 160);\n  }\n}\n\nvoid OpDispatchBuilder::SaveMXCSRState(Ref MemBase) {\n  // Store MXCSR and the mask for all bits.\n  _StoreMemPairGPR(OpSize::i32Bit, GetMXCSR(), Constant(0xFFFF), MemBase, 24);\n}\n\nvoid OpDispatchBuilder::SaveAVXState(Ref MemBase) {\n  const auto NumRegs = Is64BitMode ? 16U : 8U;\n\n  for (uint32_t i = 0; i < NumRegs; i += 2) {\n    Ref Upper0 = _VDupElement(OpSize::i256Bit, OpSize::i128Bit, LoadXMMRegister(i + 0), 1);\n    Ref Upper1 = _VDupElement(OpSize::i256Bit, OpSize::i128Bit, LoadXMMRegister(i + 1), 1);\n\n    _StoreMemPairFPR(OpSize::i128Bit, Upper0, Upper1, MemBase, i * 16 + 576);\n  }\n}\n\nRef OpDispatchBuilder::GetMXCSR() {\n  Ref MXCSR = _LoadContextGPR(OpSize::i32Bit, offsetof(FEXCore::Core::CPUState, mxcsr));\n  // Mask out unsupported bits\n  // Keeps FZ, RC, exception masks, and DAZ\n  MXCSR = _And(OpSize::i32Bit, MXCSR, Constant(0xFFC0));\n  return MXCSR;\n}\n\nvoid OpDispatchBuilder::FXRStoreOp(OpcodeArgs) {\n  Ref Mem = MakeSegmentAddress(Op, Op->Src[0]);\n\n  RestoreX87State(Mem);\n  RestoreSSEState(Mem);\n\n  Ref MXCSR = _LoadMemGPR(OpSize::i32Bit, Mem, Constant(24), OpSize::i32Bit, MemOffsetType::SXTX, 1);\n  RestoreMXCSRState(MXCSR);\n}\n\nvoid OpDispatchBuilder::XRstorOpImpl(OpcodeArgs) {\n  const auto OpSize = GetGPROpSize();\n\n  // If a bit in our XSTATE_BV is set, then we restore from that region of the XSAVE area,\n  // otherwise, if not set, then we need to set the relevant data the bit corresponds to\n  // to it's defined initial configuration.\n  const auto RestoreIfFlagSetOrDefault = [this, Op, OpSize](uint32_t BitIndex, auto restore_fn, auto default_fn, uint32_t FieldSize = 1) {\n    // Set up base address for the XSAVE region to restore from, and also read\n    // the XSTATE_BV bit flags out of the XSTATE header.\n    //\n    // Note: we rematerialize Base/Mask in each block to avoid crossblock\n    // liveness.\n    Ref Base = XSaveBase(Op);\n    Ref Mask = _LoadMemGPR(OpSize::i64Bit, Base, Constant(512), OpSize::i64Bit, MemOffsetType::SXTX, 1);\n\n    Ref BitFlag = _Bfe(OpSize, FieldSize, BitIndex, Mask);\n    auto CondJump_ = CondJump(BitFlag, CondClass::NEQ);\n\n    auto RestoreBlock = CreateNewCodeBlockAfter(GetCurrentBlock());\n    SetTrueJumpTarget(CondJump_, RestoreBlock);\n    SetCurrentCodeBlock(RestoreBlock);\n    StartNewBlock();\n    { restore_fn(); }\n    auto RestoreExitJump = Jump();\n    auto DefaultBlock = CreateNewCodeBlockAfter(RestoreBlock);\n    auto ExitBlock = CreateNewCodeBlockAfter(DefaultBlock);\n    SetJumpTarget(RestoreExitJump, ExitBlock);\n    SetFalseJumpTarget(CondJump_, DefaultBlock);\n    SetCurrentCodeBlock(DefaultBlock);\n    StartNewBlock();\n    { default_fn(); }\n    auto DefaultExitJump = Jump();\n    SetJumpTarget(DefaultExitJump, ExitBlock);\n    SetCurrentCodeBlock(ExitBlock);\n    StartNewBlock();\n  };\n\n  // x87\n  {\n    RestoreIfFlagSetOrDefault(0, [this, Op] { RestoreX87State(XSaveBase(Op)); }, [this, Op] { DefaultX87State(Op); });\n  }\n  // SSE\n  {\n    RestoreIfFlagSetOrDefault(1, [this, Op] { RestoreSSEState(XSaveBase(Op)); }, [this] { DefaultSSEState(); });\n  }\n  // AVX\n  if (CTX->HostFeatures.SupportsAVX) {\n    RestoreIfFlagSetOrDefault(\n      2, [this, Op] { std::invoke(RestoreAVXStateFunc, this, XSaveBase(Op)); }, [this] { std::invoke(DefaultAVXStateFunc, this); });\n  }\n\n  {\n    // We need to restore the MXCSR if either SSE or AVX are requested to be saved\n    RestoreIfFlagSetOrDefault(\n      1,\n      [this, Op] {\n        Ref Base = XSaveBase(Op);\n        Ref MXCSR = _LoadMemGPR(OpSize::i32Bit, Base, Constant(24), OpSize::i32Bit, MemOffsetType::SXTX, 1);\n        RestoreMXCSRState(MXCSR);\n      },\n      [] { /* Intentionally do nothing*/ }, 2);\n  }\n}\n\nvoid OpDispatchBuilder::RestoreX87State(Ref MemBase) {\n  _StackForceSlow();\n\n  auto NewFCW = _LoadMemGPR(OpSize::i16Bit, MemBase, OpSize::i16Bit);\n  _StoreContextGPR(OpSize::i16Bit, NewFCW, offsetof(FEXCore::Core::CPUState, FCW));\n\n  {\n    auto NewFSW = _LoadMemGPR(OpSize::i16Bit, MemBase, Constant(2), OpSize::i16Bit, MemOffsetType::SXTX, 1);\n    ReconstructX87StateFromFSW_Helper(NewFSW);\n  }\n\n  {\n    // Abridged FTW\n    auto NewFTW = _LoadMemGPR(OpSize::i8Bit, MemBase, Constant(4), OpSize::i8Bit, MemOffsetType::SXTX, 1);\n    _StoreContextGPR(OpSize::i8Bit, NewFTW, offsetof(FEXCore::Core::CPUState, AbridgedFTW));\n  }\n\n  for (uint32_t i = 0; i < Core::CPUState::NUM_MMS; i += 2) {\n    auto MMRegs = LoadMemPairFPR(OpSize::i128Bit, MemBase, i * 16 + 32);\n    _StoreContextFPR(OpSize::i128Bit, MMRegs.Low, MMBaseOffset() + i * 16);\n    _StoreContextFPR(OpSize::i128Bit, MMRegs.High, MMBaseOffset() + (i + 1) * 16);\n  }\n}\n\nvoid OpDispatchBuilder::RestoreSSEState(Ref MemBase) {\n  const auto NumRegs = Is64BitMode ? 16U : 8U;\n\n  for (uint32_t i = 0; i < NumRegs; i += 2) {\n    auto XMMRegs = LoadMemPairFPR(OpSize::i128Bit, MemBase, i * 16 + 160);\n\n    StoreXMMRegister(i, XMMRegs.Low);\n    StoreXMMRegister(i + 1, XMMRegs.High);\n  }\n}\n\nvoid OpDispatchBuilder::RestoreMXCSRState(Ref MXCSR) {\n  // Mask out unsupported bits\n  MXCSR = _And(OpSize::i32Bit, MXCSR, Constant(0xFFC0));\n\n  _StoreContextGPR(OpSize::i32Bit, MXCSR, offsetof(FEXCore::Core::CPUState, mxcsr));\n  // We only support the rounding mode and FTZ bit being set\n  Ref RoundingMode = _Bfe(OpSize::i32Bit, 3, 13, MXCSR);\n  _SetRoundingMode(RoundingMode, true, MXCSR);\n}\n\nvoid OpDispatchBuilder::RestoreAVXState(Ref MemBase) {\n  const auto NumRegs = Is64BitMode ? 16U : 8U;\n\n  for (uint32_t i = 0; i < NumRegs; i += 2) {\n    Ref XMMReg0 = LoadXMMRegister(i + 0);\n    Ref XMMReg1 = LoadXMMRegister(i + 1);\n    auto YMMHRegs = LoadMemPairFPR(OpSize::i128Bit, MemBase, i * 16 + 576);\n    StoreXMMRegister(i + 0, _VInsElement(OpSize::i256Bit, OpSize::i128Bit, 1, 0, XMMReg0, YMMHRegs.Low));\n    StoreXMMRegister(i + 1, _VInsElement(OpSize::i256Bit, OpSize::i128Bit, 1, 0, XMMReg1, YMMHRegs.High));\n  }\n}\n\nvoid OpDispatchBuilder::DefaultX87State(OpcodeArgs) {\n  // We can piggy-back on FNINIT's implementation, since\n  // it performs the same behavior as required by XRSTOR for resetting flags\n  FNINIT(Op);\n\n  // On top of resetting the flags to a default state, we also need to clear\n  // all of the ST0-7/MM0-7 registers to zero.\n  Ref ZeroVector = LoadZeroVector(OpSize::i64Bit);\n  for (uint32_t i = 0; i < Core::CPUState::NUM_MMS; ++i) {\n    _StoreContextFPR(OpSize::i128Bit, ZeroVector, MMBaseOffset() + i * 16);\n  }\n}\n\nvoid OpDispatchBuilder::DefaultSSEState() {\n  const auto NumRegs = Is64BitMode ? 16U : 8U;\n\n  Ref ZeroVector = LoadZeroVector(OpSize::i128Bit);\n  for (uint32_t i = 0; i < NumRegs; ++i) {\n    StoreXMMRegister(i, ZeroVector);\n  }\n}\n\nvoid OpDispatchBuilder::DefaultAVXState() {\n  const auto NumRegs = Is64BitMode ? 16U : 8U;\n\n  for (uint32_t i = 0; i < NumRegs; i++) {\n    Ref Reg = LoadXMMRegister(i);\n    Ref Dst = _VMov(OpSize::i128Bit, Reg);\n    StoreXMMRegister(i, Dst);\n  }\n}\n\nRef OpDispatchBuilder::PALIGNROpImpl(OpcodeArgs, const X86Tables::DecodedOperand& Src1, const X86Tables::DecodedOperand& Src2,\n                                     const X86Tables::DecodedOperand& Imm, bool IsAVX) {\n  // For the 256-bit case we handle it as pairs of 128-bit halves.\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto SanitizedDstSize = std::min(DstSize, OpSize::i128Bit);\n\n  const auto Is256Bit = DstSize == OpSize::i256Bit;\n  const auto Index = Imm.Literal();\n\n  Ref Src2Node = LoadSourceFPR(Op, Src2, Op->Flags);\n  if (Index == 0) {\n    if (IsAVX && !Is256Bit) {\n      // 128-bit AVX needs to zero the upper bits.\n      return _VMov(OpSize::i128Bit, Src2Node);\n    } else {\n      return Src2Node;\n    }\n  }\n  Ref Src1Node = LoadSourceFPR(Op, Src1, Op->Flags);\n\n  if (Index >= (IR::OpSizeToSize(SanitizedDstSize) * 2)) {\n    // If the immediate is greater than both vectors combined then it zeroes the vector\n    return LoadZeroVector(DstSize);\n  }\n\n  Ref Low = _VExtr(SanitizedDstSize, OpSize::i8Bit, Src1Node, Src2Node, Index);\n  if (!Is256Bit) {\n    return Low;\n  }\n\n  Ref HighSrc1 = _VInsElement(DstSize, OpSize::i128Bit, 0, 1, Src1Node, Src1Node);\n  Ref HighSrc2 = _VInsElement(DstSize, OpSize::i128Bit, 0, 1, Src2Node, Src2Node);\n  Ref High = _VExtr(SanitizedDstSize, OpSize::i8Bit, HighSrc1, HighSrc2, Index);\n  return _VInsElement(DstSize, OpSize::i128Bit, 1, 0, Low, High);\n}\n\nvoid OpDispatchBuilder::PAlignrOp(OpcodeArgs) {\n  Ref Result = PALIGNROpImpl(Op, Op->Dest, Op->Src[0], Op->Src[1], false);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPALIGNROp(OpcodeArgs) {\n  Ref Result = PALIGNROpImpl(Op, Op->Src[0], Op->Src[1], Op->Src[2], true);\n  StoreResultFPR(Op, Result);\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::UCOMISxOp(OpcodeArgs) {\n  const auto SrcSize = Op->Src[0].IsGPR() ? GetGuestVectorLength() : ElementSize;\n  Ref Src1 = LoadSourceFPR_WithOpSize(Op, Op->Dest, GetGuestVectorLength(), Op->Flags);\n  Ref Src2 = LoadSourceFPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags);\n\n  Comiss(ElementSize, Src1, Src2);\n}\n\ntemplate void OpDispatchBuilder::UCOMISxOp<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::UCOMISxOp<OpSize::i64Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::LDMXCSR(OpcodeArgs) {\n  Ref Dest = LoadSourceGPR_WithOpSize(Op, Op->Dest, OpSize::i32Bit, Op->Flags);\n  RestoreMXCSRState(Dest);\n}\n\nvoid OpDispatchBuilder::STMXCSR(OpcodeArgs) {\n  StoreResultGPR_WithOpSize(Op, Op->Dest, GetMXCSR(), OpSize::i32Bit);\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::PACKUSOp(OpcodeArgs) {\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = _VSQXTUNPair(OpSizeFromSrc(Op), ElementSize, Dest, Src);\n\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::PACKUSOp<OpSize::i16Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::PACKUSOp<OpSize::i32Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::VPACKUSOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto Is256Bit = DstSize == OpSize::i256Bit;\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Result = _VSQXTUNPair(OpSizeFromSrc(Op), ElementSize, Src1, Src2);\n\n  if (Is256Bit) {\n    // We do a little cheeky 64-bit swapping to interleave the result.\n    Ref Swapped = _VInsElement(DstSize, OpSize::i64Bit, 2, 1, Result, Result);\n    Result = _VInsElement(DstSize, OpSize::i64Bit, 1, 2, Swapped, Result);\n  }\n  StoreResultFPR(Op, Result);\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::PACKSSOp(OpcodeArgs) {\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = _VSQXTNPair(OpSizeFromSrc(Op), ElementSize, Dest, Src);\n\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::PACKSSOp<OpSize::i16Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::PACKSSOp<OpSize::i32Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::VPACKSSOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto Is256Bit = DstSize == OpSize::i256Bit;\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Result = _VSQXTNPair(OpSizeFromSrc(Op), ElementSize, Src1, Src2);\n\n  if (Is256Bit) {\n    // We do a little cheeky 64-bit swapping to interleave the result.\n    Ref Swapped = _VInsElement(DstSize, OpSize::i64Bit, 2, 1, Result, Result);\n    Result = _VInsElement(DstSize, OpSize::i64Bit, 1, 2, Swapped, Result);\n  }\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::PMULLOpImpl(OpSize Size, IR::OpSize ElementSize, bool Signed, Ref Src1, Ref Src2) {\n  if (Size == OpSize::i64Bit) {\n    if (Signed) {\n      return _VSMull(OpSize::i128Bit, ElementSize, Src1, Src2);\n    } else {\n      return _VUMull(OpSize::i128Bit, ElementSize, Src1, Src2);\n    }\n  } else {\n    auto InsSrc1 = _VUnZip(Size, ElementSize, Src1, Src1);\n    auto InsSrc2 = _VUnZip(Size, ElementSize, Src2, Src2);\n\n    if (Signed) {\n      return _VSMull(Size, ElementSize, InsSrc1, InsSrc2);\n    } else {\n      return _VUMull(Size, ElementSize, InsSrc1, InsSrc2);\n    }\n  }\n}\n\ntemplate<IR::OpSize ElementSize, bool Signed>\nvoid OpDispatchBuilder::PMULLOp(OpcodeArgs) {\n  static_assert(ElementSize == OpSize::i32Bit, \"Currently only handles 32-bit -> 64-bit\");\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Res = PMULLOpImpl(OpSizeFromSrc(Op), ElementSize, Signed, Src1, Src2);\n\n  StoreResultFPR(Op, Res);\n}\n\ntemplate void OpDispatchBuilder::PMULLOp<OpSize::i32Bit, false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::PMULLOp<OpSize::i32Bit, true>(OpcodeArgs);\n\ntemplate<IR::OpSize ElementSize, bool Signed>\nvoid OpDispatchBuilder::VPMULLOp(OpcodeArgs) {\n  static_assert(ElementSize == OpSize::i32Bit, \"Currently only handles 32-bit -> 64-bit\");\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Result = PMULLOpImpl(OpSizeFromSrc(Op), ElementSize, Signed, Src1, Src2);\n\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::VPMULLOp<OpSize::i32Bit, false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VPMULLOp<OpSize::i32Bit, true>(OpcodeArgs);\n\ntemplate<bool ToXMM>\nvoid OpDispatchBuilder::MOVQ2DQ(OpcodeArgs) {\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  // This instruction is a bit special in that if the source is MMX then it zexts to 128bit\n  if constexpr (ToXMM) {\n    const auto Index = Op->Dest.Data.GPR.GPR - FEXCore::X86State::REG_XMM_0;\n\n    Src = VZeroExtendOperand(OpSize::i128Bit, Op->Src[0], Src);\n    StoreXMMRegister(Index, Src);\n  } else {\n    // This is simple, just store the result\n    StoreResultFPR(Op, Src);\n  }\n}\n\ntemplate void OpDispatchBuilder::MOVQ2DQ<false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::MOVQ2DQ<true>(OpcodeArgs);\n\nRef OpDispatchBuilder::ADDSUBPOpImpl(OpSize Size, IR::OpSize ElementSize, Ref Src1, Ref Src2) {\n  if (CTX->HostFeatures.SupportsFCMA) {\n    if (ElementSize == OpSize::i32Bit) {\n      auto Swizzle = _VRev64(Size, OpSize::i32Bit, Src2);\n      return _VFCADD(Size, ElementSize, Src1, Swizzle, 90);\n    } else {\n      auto Swizzle = _VExtr(Size, OpSize::i8Bit, Src2, Src2, 8);\n      return _VFCADD(Size, ElementSize, Src1, Swizzle, 90);\n    }\n  } else {\n    auto ConstantEOR =\n      LoadAndCacheNamedVectorConstant(Size, ElementSize == OpSize::i32Bit ? NAMED_VECTOR_PADDSUBPS_INVERT : NAMED_VECTOR_PADDSUBPD_INVERT);\n    auto InvertedSource = _VXor(Size, ElementSize, Src2, ConstantEOR);\n    return _VFAdd(Size, ElementSize, Src1, InvertedSource);\n  }\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::ADDSUBPOp(OpcodeArgs) {\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = ADDSUBPOpImpl(OpSizeFromSrc(Op), ElementSize, Dest, Src);\n\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::ADDSUBPOp<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::ADDSUBPOp<OpSize::i64Bit>(OpcodeArgs);\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::VADDSUBPOp(OpcodeArgs) {\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Result = ADDSUBPOpImpl(OpSizeFromSrc(Op), ElementSize, Src1, Src2);\n\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::VADDSUBPOp<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VADDSUBPOp<OpSize::i64Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::PFNACCOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  auto DestUnzip = _VUnZip(Size, OpSize::i32Bit, Dest, Src);\n  auto SrcUnzip = _VUnZip2(Size, OpSize::i32Bit, Dest, Src);\n  auto Result = _VFSub(Size, OpSize::i32Bit, DestUnzip, SrcUnzip);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::PFPNACCOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  Ref ResAdd {};\n  Ref ResSub {};\n  auto UpperSubDest = _VDupElement(Size, OpSize::i32Bit, Dest, 1);\n\n  ResSub = _VFSub(OpSize::i32Bit, OpSize::i32Bit, Dest, UpperSubDest);\n  ResAdd = _VFAddP(Size, OpSize::i32Bit, Src, Src);\n\n  auto Result = _VInsElement(OpSize::i64Bit, OpSize::i32Bit, 1, 0, ResSub, ResAdd);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::PSWAPDOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  auto Result = _VRev64(Size, OpSize::i32Bit, Src);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::PI2FWOp(OpcodeArgs) {\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  const auto Size = OpSizeFromDst(Op);\n\n  // We now need to transpose the lower 16-bits of each element together\n  // Only needing to move the upper element down in this case\n  Src = _VUnZip(Size, OpSize::i16Bit, Src, Src);\n\n  // Now we need to sign extend the 16bit value to 32-bit\n  Src = _VSXTL(Size, OpSize::i16Bit, Src);\n\n  // int32_t to float\n  Src = _Vector_SToF(Size, OpSize::i32Bit, Src);\n\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Src, Size);\n}\n\nvoid OpDispatchBuilder::PF2IWOp(OpcodeArgs) {\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  const auto Size = OpSizeFromDst(Op);\n\n  // Float to int32_t\n  Src = _Vector_FToZS(Size, OpSize::i32Bit, Src);\n\n  // We now need to transpose the lower 16-bits of each element together\n  // Only needing to move the upper element down in this case\n  Src = _VUnZip(Size, OpSize::i16Bit, Src, Src);\n\n  // Now we need to sign extend the 16bit value to 32-bit\n  Src = _VSXTL(Size, OpSize::i16Bit, Src);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Src, Size);\n}\n\nvoid OpDispatchBuilder::PMULHRWOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  Ref Res {};\n\n  // Implementation is more efficient for 8byte registers\n  // Multiplies 4 16bit values in to 4 32bit values\n  Res = _VSMull(Size << 1, OpSize::i16Bit, Dest, Src);\n\n  // Load 0x0000_8000 in to each 32-bit element.\n  Ref VConstant = _VectorImm(OpSize::i128Bit, OpSize::i32Bit, 0x80, 8);\n\n  Res = _VAdd(Size << 1, OpSize::i32Bit, Res, VConstant);\n\n  // Now shift and narrow to convert 32-bit values to 16bit, storing the top 16bits\n  Res = _VUShrNI(Size << 1, OpSize::i32Bit, Res, 16);\n\n  StoreResultFPR(Op, Res);\n}\n\ntemplate<uint8_t CompType>\nvoid OpDispatchBuilder::VPFCMPOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Dest = LoadSourceFPR_WithOpSize(Op, Op->Dest, OpSizeFromDst(Op), Op->Flags);\n\n  Ref Result {};\n  // This maps 1:1 to an AArch64 NEON Op\n  // auto ALUOp = _VCMPGT(Size, 4, Dest, Src);\n  switch (CompType) {\n  case 0x00: // EQ\n    Result = _VFCMPEQ(Size, OpSize::i32Bit, Dest, Src);\n    break;\n  case 0x01: // GE(Swapped operand)\n    Result = _VFCMPLE(Size, OpSize::i32Bit, Src, Dest);\n    break;\n  case 0x02: // GT\n    Result = _VFCMPGT(Size, OpSize::i32Bit, Dest, Src);\n    break;\n  default: LOGMAN_MSG_A_FMT(\"Unknown Comparison type: {}\", CompType); break;\n  }\n\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::VPFCMPOp<0>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VPFCMPOp<1>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VPFCMPOp<2>(OpcodeArgs);\n\nRef OpDispatchBuilder::PMADDWDOpImpl(IR::OpSize Size, Ref Src1, Ref Src2) {\n  // This is a pretty curious operation\n  // Does two MADD operations across 4 16bit signed integers and accumulates to 32bit integers in the destination\n  //\n  // x86 PMADDWD: xmm1, xmm2\n  //              xmm1[31:0]  = (xmm1[15:0] * xmm2[15:0]) + (xmm1[31:16] * xmm2[31:16])\n  //              xmm1[63:32] = (xmm1[47:32] * xmm2[47:32]) + (xmm1[63:48] * xmm2[63:48])\n  //              etc.. for larger registers\n\n  if (Size == OpSize::i64Bit) {\n    // MMX implementation can be slightly more optimal\n    Size = Size >> 1;\n    auto MullResult = _VSMull(Size, OpSize::i16Bit, Src1, Src2);\n    return _VAddP(Size, OpSize::i32Bit, MullResult, MullResult);\n  }\n\n  auto Lower = _VSMull(Size, OpSize::i16Bit, Src1, Src2);\n  auto Upper = _VSMull2(Size, OpSize::i16Bit, Src1, Src2);\n\n  // [15:0 ] + [31:16], [32:47 ] + [63:48  ], [79:64] + [95:80], [111:96] + [127:112]\n  return _VAddP(Size, OpSize::i32Bit, Lower, Upper);\n}\n\nvoid OpDispatchBuilder::PMADDWD(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  Ref Result = PMADDWDOpImpl(Size, Src1, Src2);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPMADDWDOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  Ref Result = PMADDWDOpImpl(Size, Src1, Src2);\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::PMADDUBSWOpImpl(IR::OpSize Size, Ref Src1, Ref Src2) {\n  if (Size == OpSize::i64Bit) {\n    const auto MultSize = Size << 1;\n    // 64bit is more efficient\n\n    // Src1 is unsigned\n    auto Src1_16b = _VUXTL(MultSize, OpSize::i8Bit, Src1); // [7:0 ], [15:8], [23:16], [31:24], [39:32], [47:40], [55:48], [63:56]\n\n    // Src2 is signed\n    auto Src2_16b = _VSXTL(MultSize, OpSize::i8Bit, Src2); // [7:0 ], [15:8], [23:16], [31:24], [39:32], [47:40], [55:48], [63:56]\n\n    auto ResMul_L = _VSMull(MultSize, OpSize::i16Bit, Src1_16b, Src2_16b);\n    auto ResMul_H = _VSMull2(MultSize, OpSize::i16Bit, Src1_16b, Src2_16b);\n\n    // Now add pairwise across the vector\n    auto ResAdd = _VAddP(MultSize, OpSize::i32Bit, ResMul_L, ResMul_H);\n\n    // Add saturate back down to 16bit\n    return _VSQXTN(MultSize, OpSize::i32Bit, ResAdd);\n  }\n\n  // V{U,S}XTL{,2}/ and VUnZip{,2} can be optimized in this solution to save about one instruction.\n  // We can up-front zero extend and sign extend the elements in-place.\n  // This means extracting even and odd elements up-front so the unzips aren't required.\n  // Requires implementing IR ops for BIC (vector, immediate) although.\n\n  // Src1 is unsigned\n  auto Src1_16b_L = _VUXTL(Size, OpSize::i8Bit, Src1); // [7:0 ], [15:8], [23:16], [31:24], [39:32], [47:40], [55:48], [63:56]\n  auto Src2_16b_L = _VSXTL(Size, OpSize::i8Bit, Src2); // [7:0 ], [15:8], [23:16], [31:24], [39:32], [47:40], [55:48], [63:56]\n  auto ResMul_L = _VMul(Size, OpSize::i16Bit, Src1_16b_L, Src2_16b_L);\n\n  // Src2 is signed\n  auto Src1_16b_H = _VUXTL2(Size, OpSize::i8Bit, Src1); // Offset to +64bits [7:0 ], [15:8], [23:16], [31:24], [39:32], [47:40], [55:48], [63:56]\n  auto Src2_16b_H = _VSXTL2(Size, OpSize::i8Bit, Src2); // Offset to +64bits [7:0 ], [15:8], [23:16], [31:24], [39:32], [47:40], [55:48], [63:56]\n  auto ResMul_L_H = _VMul(Size, OpSize::i16Bit, Src1_16b_H, Src2_16b_H);\n\n  auto TmpZip1 = _VUnZip(Size, OpSize::i16Bit, ResMul_L, ResMul_L_H);\n  auto TmpZip2 = _VUnZip2(Size, OpSize::i16Bit, ResMul_L, ResMul_L_H);\n\n  return _VSQAdd(Size, OpSize::i16Bit, TmpZip1, TmpZip2);\n}\n\nvoid OpDispatchBuilder::PMADDUBSW(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  Ref Result = PMADDUBSWOpImpl(Size, Src1, Src2);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPMADDUBSWOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  Ref Result = PMADDUBSWOpImpl(Size, Src1, Src2);\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::PMULHWOpImpl(OpcodeArgs, bool Signed, Ref Src1, Ref Src2) {\n  const auto Size = OpSizeFromSrc(Op);\n  if (Signed) {\n    return _VSMulH(Size, OpSize::i16Bit, Src1, Src2);\n  } else {\n    return _VUMulH(Size, OpSize::i16Bit, Src1, Src2);\n  }\n}\n\ntemplate<bool Signed>\nvoid OpDispatchBuilder::PMULHW(OpcodeArgs) {\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = PMULHWOpImpl(Op, Signed, Dest, Src);\n\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::PMULHW<false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::PMULHW<true>(OpcodeArgs);\n\ntemplate<bool Signed>\nvoid OpDispatchBuilder::VPMULHWOp(OpcodeArgs) {\n  const auto DstSize = GetDstSize(Op);\n  const auto Is128Bit = DstSize == Core::CPUState::XMM_SSE_REG_SIZE;\n\n  Ref Dest = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Result = PMULHWOpImpl(Op, Signed, Dest, Src);\n\n  if (Is128Bit) {\n    Result = _VMov(OpSize::i128Bit, Result);\n  }\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::VPMULHWOp<false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VPMULHWOp<true>(OpcodeArgs);\n\nRef OpDispatchBuilder::PMULHRSWOpImpl(OpSize Size, Ref Src1, Ref Src2) {\n  Ref Res {};\n  if (Size == OpSize::i64Bit) {\n    // Implementation is more efficient for 8byte registers\n    Res = _VSMull(Size << 1, OpSize::i16Bit, Src1, Src2);\n    Res = _VSShrI(Size << 1, OpSize::i32Bit, Res, 14);\n    auto OneVector = _VectorImm(Size << 1, OpSize::i32Bit, 1);\n    Res = _VAdd(Size << 1, OpSize::i32Bit, Res, OneVector);\n    return _VUShrNI(Size << 1, OpSize::i32Bit, Res, 1);\n  } else {\n    // 128-bit and 256-bit are less efficient\n    Ref ResultLow;\n    Ref ResultHigh;\n\n    ResultLow = _VSMull(Size, OpSize::i16Bit, Src1, Src2);\n    ResultHigh = _VSMull2(Size, OpSize::i16Bit, Src1, Src2);\n\n    ResultLow = _VSShrI(Size, OpSize::i32Bit, ResultLow, 14);\n    ResultHigh = _VSShrI(Size, OpSize::i32Bit, ResultHigh, 14);\n    auto OneVector = _VectorImm(Size, OpSize::i32Bit, 1);\n\n    ResultLow = _VAdd(Size, OpSize::i32Bit, ResultLow, OneVector);\n    ResultHigh = _VAdd(Size, OpSize::i32Bit, ResultHigh, OneVector);\n\n    // Combine the results\n    Res = _VUShrNI(Size, OpSize::i32Bit, ResultLow, 1);\n    return _VUShrNI2(Size, OpSize::i32Bit, Res, ResultHigh, 1);\n  }\n}\n\nvoid OpDispatchBuilder::PMULHRSW(OpcodeArgs) {\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = PMULHRSWOpImpl(OpSizeFromSrc(Op), Dest, Src);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPMULHRSWOp(OpcodeArgs) {\n  Ref Dest = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Result = PMULHRSWOpImpl(OpSizeFromSrc(Op), Dest, Src);\n\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::HSUBPOpImpl(OpSize SrcSize, IR::OpSize ElementSize, Ref Src1, Ref Src2) {\n  auto Even = _VUnZip(SrcSize, ElementSize, Src1, Src2);\n  auto Odd = _VUnZip2(SrcSize, ElementSize, Src1, Src2);\n  return _VFSub(SrcSize, ElementSize, Even, Odd);\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::HSUBP(OpcodeArgs) {\n  Ref Src1 = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = HSUBPOpImpl(OpSizeFromSrc(Op), ElementSize, Src1, Src2);\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::HSUBP<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::HSUBP<OpSize::i64Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::VHSUBPOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto Is256Bit = DstSize == OpSize::i256Bit;\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  Ref Result = HSUBPOpImpl(OpSizeFromSrc(Op), ElementSize, Src1, Src2);\n  Ref Dest = Result;\n  if (Is256Bit) {\n    Dest = _VInsElement(DstSize, OpSize::i64Bit, 1, 2, Result, Result);\n    Dest = _VInsElement(DstSize, OpSize::i64Bit, 2, 1, Dest, Result);\n  }\n\n  StoreResultFPR(Op, Dest);\n}\n\nRef OpDispatchBuilder::PHSUBOpImpl(OpSize Size, Ref Src1, Ref Src2, IR::OpSize ElementSize) {\n  auto Even = _VUnZip(Size, ElementSize, Src1, Src2);\n  auto Odd = _VUnZip2(Size, ElementSize, Src1, Src2);\n  return _VSub(Size, ElementSize, Even, Odd);\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::PHSUB(OpcodeArgs) {\n  Ref Src1 = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = PHSUBOpImpl(OpSizeFromSrc(Op), Src1, Src2, ElementSize);\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::PHSUB<OpSize::i16Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::PHSUB<OpSize::i32Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::VPHSUBOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto Is256Bit = DstSize == OpSize::i256Bit;\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Result = PHSUBOpImpl(OpSizeFromSrc(Op), Src1, Src2, ElementSize);\n  if (Is256Bit) {\n    Ref Inserted = _VInsElement(DstSize, OpSize::i64Bit, 1, 2, Result, Result);\n    Result = _VInsElement(DstSize, OpSize::i64Bit, 2, 1, Inserted, Result);\n  }\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::PHADDSOpImpl(OpSize Size, Ref Src1, Ref Src2) {\n  const auto ElementSize = OpSize::i16Bit;\n\n  auto Even = _VUnZip(Size, ElementSize, Src1, Src2);\n  auto Odd = _VUnZip2(Size, ElementSize, Src1, Src2);\n\n  // Saturate back down to the result\n  return _VSQAdd(Size, ElementSize, Even, Odd);\n}\n\nvoid OpDispatchBuilder::PHADDS(OpcodeArgs) {\n  Ref Src1 = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  Ref Result = PHADDSOpImpl(OpSizeFromSrc(Op), Src1, Src2);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPHADDSWOp(OpcodeArgs) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto Is256Bit = SrcSize == OpSize::i256Bit;\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  Ref Result = PHADDSOpImpl(OpSizeFromSrc(Op), Src1, Src2);\n  Ref Dest = Result;\n\n  if (Is256Bit) {\n    Dest = _VInsElement(SrcSize, OpSize::i64Bit, 1, 2, Result, Result);\n    Dest = _VInsElement(SrcSize, OpSize::i64Bit, 2, 1, Dest, Result);\n  }\n\n  StoreResultFPR(Op, Dest);\n}\n\nRef OpDispatchBuilder::PHSUBSOpImpl(OpSize Size, Ref Src1, Ref Src2) {\n  const auto ElementSize = OpSize::i16Bit;\n\n  auto Even = _VUnZip(Size, ElementSize, Src1, Src2);\n  auto Odd = _VUnZip2(Size, ElementSize, Src1, Src2);\n\n  // Saturate back down to the result\n  return _VSQSub(Size, ElementSize, Even, Odd);\n}\n\nvoid OpDispatchBuilder::PHSUBS(OpcodeArgs) {\n  Ref Src1 = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = PHSUBSOpImpl(OpSizeFromSrc(Op), Src1, Src2);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPHSUBSWOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto Is256Bit = DstSize == OpSize::i256Bit;\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  Ref Result = PHSUBSOpImpl(OpSizeFromSrc(Op), Src1, Src2);\n\n  Ref Dest = Result;\n  if (Is256Bit) {\n    Dest = _VInsElement(DstSize, OpSize::i64Bit, 1, 2, Result, Result);\n    Dest = _VInsElement(DstSize, OpSize::i64Bit, 2, 1, Dest, Result);\n  }\n\n  StoreResultFPR(Op, Dest);\n}\n\nRef OpDispatchBuilder::PSADBWOpImpl(IR::OpSize Size, Ref Src1, Ref Src2) {\n  // The documentation is actually incorrect in how this instruction operates\n  // It strongly implies that the `abs(dest[i] - src[i])` operates in 8bit space\n  // but it actually operates in more than 8bit space\n  // This can be seen with `abs(0 - 0xFF)` returning a different result depending\n  // on bit length\n  const auto Is128Bit = Size == OpSize::i128Bit;\n\n  if (Size == OpSize::i64Bit) {\n    auto AbsResult = _VUABDL(Size << 1, OpSize::i8Bit, Src1, Src2);\n\n    // Now vector-wide add the results for each\n    return _VAddV(Size << 1, OpSize::i16Bit, AbsResult);\n  }\n\n  auto AbsResult_Low = _VUABDL(Size, OpSize::i8Bit, Src1, Src2);\n  auto AbsResult_High = _VUABDL2(Size, OpSize::i8Bit, Src1, Src2);\n\n  Ref Result_Low = _VAddV(OpSize::i128Bit, OpSize::i16Bit, AbsResult_Low);\n  Ref Result_High = _VAddV(OpSize::i128Bit, OpSize::i16Bit, AbsResult_High);\n  auto Low = _VZip(Size, OpSize::i64Bit, Result_Low, Result_High);\n\n  if (Is128Bit) {\n    return Low;\n  }\n\n  Ref HighSrc1 = _VDupElement(Size, OpSize::i128Bit, AbsResult_Low, 1);\n  Ref HighSrc2 = _VDupElement(Size, OpSize::i128Bit, AbsResult_High, 1);\n\n  Ref HighResult_Low = _VAddV(OpSize::i128Bit, OpSize::i16Bit, HighSrc1);\n  Ref HighResult_High = _VAddV(OpSize::i128Bit, OpSize::i16Bit, HighSrc2);\n\n  Ref High = _VInsElement(Size, OpSize::i64Bit, 1, 0, HighResult_Low, HighResult_High);\n  Ref Full = _VInsElement(Size, OpSize::i128Bit, 1, 0, Low, High);\n\n  Ref Tmp = _VInsElement(Size, OpSize::i64Bit, 2, 1, Full, Full);\n  return _VInsElement(Size, OpSize::i64Bit, 1, 2, Tmp, Full);\n}\n\nvoid OpDispatchBuilder::PSADBW(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  Ref Result = PSADBWOpImpl(Size, Src1, Src2);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPSADBWOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  Ref Result = PSADBWOpImpl(Size, Src1, Src2);\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::ExtendVectorElementsImpl(OpcodeArgs, IR::OpSize ElementSize, IR::OpSize DstElementSize, bool Signed) {\n  const auto DstSize = OpSizeFromDst(Op);\n\n  const auto GetSrc = [&] {\n    if (Op->Src[0].IsGPR()) {\n      return LoadSourceFPR_WithOpSize(Op, Op->Src[0], DstSize, Op->Flags);\n    } else {\n      // For memory operands the 256-bit variant loads twice the size specified in the table.\n      const auto Is256Bit = DstSize == OpSize::i256Bit;\n      const auto SrcSize = OpSizeFromSrc(Op);\n      const auto LoadSize = Is256Bit ? IR::SizeToOpSize(IR::OpSizeToSize(SrcSize) * 2) : SrcSize;\n\n      return LoadSourceFPR_WithOpSize(Op, Op->Src[0], LoadSize, Op->Flags);\n    }\n  };\n\n  Ref Src = GetSrc();\n  Ref Result {Src};\n\n  for (auto CurrentElementSize = ElementSize; CurrentElementSize != DstElementSize; CurrentElementSize = CurrentElementSize << 1) {\n    if (Signed) {\n      Result = _VSXTL(DstSize, CurrentElementSize, Result);\n    } else {\n      Result = _VUXTL(DstSize, CurrentElementSize, Result);\n    }\n  }\n\n  return Result;\n}\n\ntemplate<IR::OpSize ElementSize, IR::OpSize DstElementSize, bool Signed>\nvoid OpDispatchBuilder::ExtendVectorElements(OpcodeArgs) {\n  Ref Result = ExtendVectorElementsImpl(Op, ElementSize, DstElementSize, Signed);\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i16Bit, false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i32Bit, false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i64Bit, false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::ExtendVectorElements<OpSize::i16Bit, OpSize::i32Bit, false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::ExtendVectorElements<OpSize::i16Bit, OpSize::i64Bit, false>(OpcodeArgs);\ntemplate void OpDispatchBuilder::ExtendVectorElements<OpSize::i32Bit, OpSize::i64Bit, false>(OpcodeArgs);\n\ntemplate void OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i16Bit, true>(OpcodeArgs);\ntemplate void OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i32Bit, true>(OpcodeArgs);\ntemplate void OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i64Bit, true>(OpcodeArgs);\ntemplate void OpDispatchBuilder::ExtendVectorElements<OpSize::i16Bit, OpSize::i32Bit, true>(OpcodeArgs);\ntemplate void OpDispatchBuilder::ExtendVectorElements<OpSize::i16Bit, OpSize::i64Bit, true>(OpcodeArgs);\ntemplate void OpDispatchBuilder::ExtendVectorElements<OpSize::i32Bit, OpSize::i64Bit, true>(OpcodeArgs);\n\nRef OpDispatchBuilder::VectorRoundImpl(OpSize Size, IR::OpSize ElementSize, Ref Src, uint64_t Mode) {\n  return _Vector_FToI(Size, ElementSize, Src, TranslateRoundType(Mode));\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::VectorRound(OpcodeArgs) {\n  // No need to zero extend the vector in the event we have a\n  // scalar source, especially since it's only inserted into another vector.\n  const auto SrcSize = OpSizeFromSrc(Op);\n  Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags);\n\n  const uint64_t Mode = Op->Src[1].Literal();\n  Src = VectorRoundImpl(OpSizeFromDst(Op), ElementSize, Src, Mode);\n\n  StoreResultFPR(Op, Src);\n}\n\ntemplate void OpDispatchBuilder::VectorRound<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorRound<OpSize::i64Bit>(OpcodeArgs);\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::AVXVectorRound(OpcodeArgs) {\n  const auto Mode = Op->Src[1].Literal();\n\n  // No need to zero extend the vector in the event we have a\n  // scalar source, especially since it's only inserted into another vector.\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags);\n  Ref Result = VectorRoundImpl(OpSizeFromDst(Op), ElementSize, Src, Mode);\n\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::AVXVectorRound<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::AVXVectorRound<OpSize::i64Bit>(OpcodeArgs);\n\nRef OpDispatchBuilder::VectorBlend(OpSize Size, IR::OpSize ElementSize, Ref Src1, Ref Src2, uint8_t Selector) {\n  if (ElementSize == OpSize::i32Bit) {\n    Selector &= 0b1111;\n    switch (Selector) {\n    case 0b0000:\n      // Dest[31:0]   = Src1[31:0]\n      // Dest[63:32]  = Src1[63:32]\n      // Dest[95:64]  = Src1[95:64]\n      // Dest[127:96] = Src1[127:96]\n      // Copy\n      return Src1;\n    case 0b0001:\n      // Dest[31:0]   = Src2[31:0]\n      // Dest[63:32]  = Src1[63:32]\n      // Dest[95:64]  = Src1[95:64]\n      // Dest[127:96] = Src1[127:96]\n      return _VInsElement(Size, ElementSize, 0, 0, Src1, Src2);\n    case 0b0010:\n      // Dest[31:0]   = Src1[31:0]\n      // Dest[63:32]  = Src2[63:32]\n      // Dest[95:64]  = Src1[95:64]\n      // Dest[127:96] = Src1[127:96]\n      return _VInsElement(Size, ElementSize, 1, 1, Src1, Src2);\n    case 0b0011:\n      // Dest[31:0]   = Src2[31:0]\n      // Dest[63:32]  = Src2[63:32]\n      // Dest[95:64]  = Src1[95:64]\n      // Dest[127:96] = Src1[127:96]\n      return _VInsElement(Size, OpSize::i64Bit, 0, 0, Src1, Src2);\n    case 0b0100:\n      // Dest[31:0]   = Src1[31:0]\n      // Dest[63:32]  = Src1[63:32]\n      // Dest[95:64]  = Src2[95:64]\n      // Dest[127:96] = Src1[127:96]\n      return _VInsElement(Size, ElementSize, 2, 2, Src1, Src2);\n    case 0b0101: {\n      // Dest[31:0]   = Src2[31:0]\n      // Dest[63:32]  = Src1[63:32]\n      // Dest[95:64]  = Src2[95:64]\n      // Dest[127:96] = Src1[127:96]\n      // Rotate the elements of the incoming source so they end up in the correct location.\n      // Then trn2 keeps the destination results in the expected location.\n      auto Temp = _VRev64(Size, OpSize::i32Bit, Src2);\n      return _VTrn2(Size, ElementSize, Temp, Src1);\n    }\n    case 0b0110: {\n      // Dest[31:0]   = Src1[31:0]\n      // Dest[63:32]  = Src2[63:32]\n      // Dest[95:64]  = Src2[95:64]\n      // Dest[127:96] = Src1[127:96]\n      auto ConstantSwizzle = LoadAndCacheNamedVectorConstant(Size, FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_BLENDPS_0110B);\n      return _VTBX1(Size, Src1, Src2, ConstantSwizzle);\n    }\n    case 0b0111: {\n      // Dest[31:0]   = Src2[31:0]\n      // Dest[63:32]  = Src2[63:32]\n      // Dest[95:64]  = Src2[95:64]\n      // Dest[127:96] = Src1[127:96]\n      auto ConstantSwizzle = LoadAndCacheNamedVectorConstant(Size, FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_BLENDPS_0111B);\n      return _VTBX1(Size, Src1, Src2, ConstantSwizzle);\n    }\n    case 0b1000:\n      // Dest[31:0]   = Src1[31:0]\n      // Dest[63:32]  = Src1[63:32]\n      // Dest[95:64]  = Src1[95:64]\n      // Dest[127:96] = Src2[127:96]\n      return _VInsElement(Size, ElementSize, 3, 3, Src1, Src2);\n    case 0b1001: {\n      // Dest[31:0]   = Src2[31:0]\n      // Dest[63:32]  = Src1[63:32]\n      // Dest[95:64]  = Src1[95:64]\n      // Dest[127:96] = Src2[127:96]\n      auto ConstantSwizzle = LoadAndCacheNamedVectorConstant(Size, FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_BLENDPS_1001B);\n      return _VTBX1(Size, Src1, Src2, ConstantSwizzle);\n    }\n    case 0b1010: {\n      // Dest[31:0]   = Src1[31:0]\n      // Dest[63:32]  = Src2[63:32]\n      // Dest[95:64]  = Src1[95:64]\n      // Dest[127:96] = Src2[127:96]\n      // Rotate the elements of the incoming destination so they end up in the correct location.\n      // Then trn2 keeps the source results in the expected location.\n      auto Temp = _VRev64(Size, OpSize::i32Bit, Src1);\n      return _VTrn2(Size, ElementSize, Temp, Src2);\n    }\n    case 0b1011: {\n      // Dest[31:0]   = Src2[31:0]\n      // Dest[63:32]  = Src2[63:32]\n      // Dest[95:64]  = Src1[95:64]\n      // Dest[127:96] = Src2[127:96]\n      auto ConstantSwizzle = LoadAndCacheNamedVectorConstant(Size, FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_BLENDPS_1011B);\n      return _VTBX1(Size, Src1, Src2, ConstantSwizzle);\n    }\n    case 0b1100:\n      // Dest[31:0]   = Src1[31:0]\n      // Dest[63:32]  = Src1[63:32]\n      // Dest[95:64]  = Src2[95:64]\n      // Dest[127:96] = Src2[127:96]\n      return _VInsElement(Size, OpSize::i64Bit, 1, 1, Src1, Src2);\n    case 0b1101: {\n      // Dest[31:0]   = Src2[31:0]\n      // Dest[63:32]  = Src1[63:32]\n      // Dest[95:64]  = Src2[95:64]\n      // Dest[127:96] = Src2[127:96]\n      auto ConstantSwizzle = LoadAndCacheNamedVectorConstant(Size, FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_BLENDPS_1101B);\n      return _VTBX1(Size, Src1, Src2, ConstantSwizzle);\n    }\n    case 0b1110: {\n      // Dest[31:0]   = Src1[31:0]\n      // Dest[63:32]  = Src2[63:32]\n      // Dest[95:64]  = Src2[95:64]\n      // Dest[127:96] = Src2[127:96]\n      auto ConstantSwizzle = LoadAndCacheNamedVectorConstant(Size, FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_BLENDPS_1110B);\n      return _VTBX1(Size, Src1, Src2, ConstantSwizzle);\n    }\n    case 0b1111:\n      // Dest[31:0]   = Src2[31:0]\n      // Dest[63:32]  = Src2[63:32]\n      // Dest[95:64]  = Src2[95:64]\n      // Dest[127:96] = Src2[127:96]\n      // Copy\n      return Src2;\n    default: break;\n    }\n  } else if (ElementSize == OpSize::i64Bit) {\n    Selector &= 0b11;\n    switch (Selector) {\n    case 0b00:\n      // No-op\n      return Src1;\n    case 0b01:\n      // Dest[63:0]   = Src2[63:0]\n      // Dest[127:64] = Src1[127:64]\n      return _VInsElement(Size, ElementSize, 0, 0, Src1, Src2);\n    case 0b10:\n      // Dest[63:0]   = Src1[63:0]\n      // Dest[127:64] = Src2[127:64]\n      return _VInsElement(Size, ElementSize, 1, 1, Src1, Src2);\n    case 0b11:\n      // Copy\n      return Src2;\n    }\n  } else {\n    ///< Zero instruction copies\n    switch (Selector) {\n    case 0b0000'0000: return Src1;\n    case 0b1111'1111: return Src2;\n    default: break;\n    }\n\n    ///< Single instruction implementation\n    switch (Selector) {\n    case 0b0000'0001:\n    case 0b0000'0010:\n    case 0b0000'0100:\n    case 0b0000'1000:\n    case 0b0001'0000:\n    case 0b0010'0000:\n    case 0b0100'0000:\n    case 0b1000'0000: {\n      // Single 16-bit element insert.\n      const auto Element = FEXCore::ilog2(Selector);\n      return _VInsElement(Size, ElementSize, Element, Element, Src1, Src2);\n    }\n    case 0b1111'1110:\n    case 0b1111'1101:\n    case 0b1111'1011:\n    case 0b1111'0111:\n    case 0b1110'1111:\n    case 0b1101'1111:\n    case 0b1011'1111:\n    case 0b0111'1111: {\n      // Single 16-bit element insert, inverted\n      uint8_t SelectorInvert = ~Selector;\n      const auto Element = FEXCore::ilog2(SelectorInvert);\n      return _VInsElement(Size, ElementSize, Element, Element, Src2, Src1);\n    }\n    case 0b0000'0011:\n    case 0b0000'1100:\n    case 0b0011'0000:\n    case 0b1100'0000: {\n      // Single 32-bit element insert.\n      const auto Element = std::countr_zero(Selector) / 2;\n      return _VInsElement(Size, OpSize::i32Bit, Element, Element, Src1, Src2);\n    }\n    case 0b1111'1100:\n    case 0b1111'0011:\n    case 0b1100'1111:\n    case 0b0011'1111: {\n      // Single 32-bit element insert, inverted\n      uint8_t SelectorInvert = ~Selector;\n      const auto Element = std::countr_zero(SelectorInvert) / 2;\n      return _VInsElement(Size, OpSize::i32Bit, Element, Element, Src2, Src1);\n    }\n    case 0b0000'1111:\n    case 0b1111'0000: {\n      // Single 64-bit element insert.\n      const auto Element = std::countr_zero(Selector) / 4;\n      return _VInsElement(Size, OpSize::i64Bit, Element, Element, Src1, Src2);\n    }\n    default: break;\n    }\n\n    ///< Two instruction implementation\n    switch (Selector) {\n    ///< Fancy double VExtr\n    case 0b0'0'0'0'0'1'1'1: {\n      auto Tmp = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src2, Src1, 6);\n      return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 10);\n    }\n    case 0b0'0'0'1'1'1'1'1: {\n      auto Tmp = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src2, Src1, 10);\n      return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 6);\n    }\n    case 0b1'1'1'0'0'0'0'0: {\n      auto Tmp = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src1, Src2, 10);\n      return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 6);\n    }\n    case 0b1'1'1'1'1'0'0'0: {\n      auto Tmp = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src1, Src2, 6);\n      return _VExtr(OpSize::i128Bit, OpSize::i8Bit, Tmp, Tmp, 10);\n    }\n    default: break;\n    }\n\n    // TODO: There are some of these swizzles that can be more optimal.\n    // NamedConstant + VTBX1 is quite quick already.\n    // Implement more if it becomes relevant.\n    auto ConstantSwizzle =\n      LoadAndCacheIndexedNamedVectorConstant(Size, FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_PBLENDW, Selector * 16);\n    return _VTBX1(Size, Src1, Src2, ConstantSwizzle);\n  }\n\n  FEX_UNREACHABLE;\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::VectorBlend(OpcodeArgs) {\n  uint8_t Select = Op->Src[1].Literal();\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Dest = VectorBlend(OpSize::i128Bit, ElementSize, Dest, Src, Select);\n  StoreResultFPR(Op, Dest);\n}\n\ntemplate void OpDispatchBuilder::VectorBlend<OpSize::i16Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorBlend<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VectorBlend<OpSize::i64Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::VectorVariableBlend(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  auto Mask = LoadXMMRegister(0);\n\n  // Each element is selected by the high bit of that element size\n  // Dest[ElementIdx] = Xmm0[ElementIndex][HighBit] ? Src : Dest;\n  //\n  // To emulate this on AArch64\n  // Arithmetic shift right by the element size, then use BSL to select the registers\n  Mask = _VSShrI(Size, ElementSize, Mask, IR::OpSizeAsBits(ElementSize) - 1);\n\n  auto Result = _VBSL(Size, Mask, Src, Dest);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::AVXVectorVariableBlend(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto ElementSizeBits = IR::OpSizeAsBits(ElementSize);\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  // Mask register is encoded within bits [7:4] of the selector\n  const auto Src3Selector = Op->Src[2].Literal();\n  Ref Mask = LoadXMMRegister((Src3Selector >> 4) & 0b1111);\n\n  Ref Shifted = _VSShrI(SrcSize, ElementSize, Mask, ElementSizeBits - 1);\n  Ref Result = _VBSL(SrcSize, Shifted, Src2, Src1);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::PTestOpImpl(OpSize Size, Ref Dest, Ref Src) {\n  Ref Test1 = _VAnd(Size, OpSize::i8Bit, Dest, Src);\n  Ref Test2 = _VAndn(Size, OpSize::i8Bit, Src, Dest);\n\n  // Element size must be less than 32-bit for the sign bit tricks.\n  Test1 = _VUMaxV(Size, OpSize::i16Bit, Test1);\n  Test2 = _VUMaxV(Size, OpSize::i16Bit, Test2);\n\n  Test1 = _VExtractToGPR(Size, OpSize::i16Bit, Test1, 0);\n  Test2 = _VExtractToGPR(Size, OpSize::i16Bit, Test2, 0);\n\n  Test2 = To01(OpSize::i64Bit, Test2);\n\n  // Careful, these flags are different between {V,}PTEST and VTESTP{S,D}\n  // Set ZF according to Test1. SF will be zeroed since we do a 32-bit test on\n  // the results of a 16-bit value from the UMaxV, so the 32-bit sign bit is\n  // cleared even if the 16-bit scalars were negative.\n  SetNZ_ZeroCV(OpSize::i32Bit, Test1);\n  SetCFInverted(Test2);\n  ZeroPF_AF();\n}\n\nvoid OpDispatchBuilder::PTestOp(OpcodeArgs) {\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  PTestOpImpl(OpSizeFromSrc(Op), Dest, Src);\n}\n\nvoid OpDispatchBuilder::VTESTOpImpl(OpSize SrcSize, IR::OpSize ElementSize, Ref Src1, Ref Src2) {\n  LOGMAN_THROW_A_FMT(ElementSize >= IR::OpSize::i8Bit && ElementSize <= IR::OpSize::i64Bit, \"Invalid size\");\n  const auto ElementSizeInBits = IR::OpSizeAsBits(ElementSize);\n  const auto MaskConstant = uint64_t {1} << (ElementSizeInBits - 1);\n\n  Ref Mask = _VDupFromGPR(SrcSize, ElementSize, Constant(MaskConstant));\n\n  Ref AndTest = _VAnd(SrcSize, OpSize::i8Bit, Src2, Src1);\n  Ref AndNotTest = _VAndn(SrcSize, OpSize::i8Bit, Src2, Src1);\n\n  Ref MaskedAnd = _VAnd(SrcSize, OpSize::i8Bit, AndTest, Mask);\n  Ref MaskedAndNot = _VAnd(SrcSize, OpSize::i8Bit, AndNotTest, Mask);\n\n  Ref MaxAnd = _VUMaxV(SrcSize, OpSize::i16Bit, MaskedAnd);\n  Ref MaxAndNot = _VUMaxV(SrcSize, OpSize::i16Bit, MaskedAndNot);\n\n  Ref AndGPR = _VExtractToGPR(SrcSize, OpSize::i16Bit, MaxAnd, 0);\n  Ref AndNotGPR = _VExtractToGPR(SrcSize, OpSize::i16Bit, MaxAndNot, 0);\n\n  Ref CFInv = To01(OpSize::i64Bit, AndNotGPR);\n\n  // As in PTest, this sets Z appropriately while zeroing the rest of NZCV.\n  SetNZ_ZeroCV(OpSize::i32Bit, AndGPR);\n  SetCFInverted(CFInv);\n  ZeroPF_AF();\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::VTESTPOp(OpcodeArgs) {\n  Ref Src1 = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  VTESTOpImpl(OpSizeFromSrc(Op), ElementSize, Src1, Src2);\n}\ntemplate void OpDispatchBuilder::VTESTPOp<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VTESTPOp<OpSize::i64Bit>(OpcodeArgs);\n\nRef OpDispatchBuilder::PHMINPOSUWOpImpl(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  // Setup a vector swizzle\n  // Initially load a 64-bit mask of immediates\n  // Then zero-extend that to 128-bit mask with the immediates in the lower 16-bits of each element\n  auto ConstantSwizzle = LoadAndCacheNamedVectorConstant(Size, FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_INCREMENTAL_U16_INDEX);\n\n  // We now need to zip the vector sources together to become two uint32x4_t vectors\n  // Upper:\n  // [127:96]: ([127:112] << 16) | (7)\n  // [95:64] : ([111:96]  << 16) | (6)\n  // [63:32] : ([95:80]   << 16) | (5)\n  // [31:0]  : ([79:64]   << 16) | (4)\n\n  // Lower:\n  // [127:96]: ([63:48] << 16) | (3)\n  // [95:64] : ([47:32] << 16) | (2)\n  // [63:32] : ([31:16] << 16) | (1)\n  // [31:0]  : ([15:0]  << 16) | (0)\n\n  auto ZipLower = _VZip(Size, OpSize::i16Bit, ConstantSwizzle, Src);\n  auto ZipUpper = _VZip2(Size, OpSize::i16Bit, ConstantSwizzle, Src);\n  // The elements are now 32-bit between two vectors.\n  auto MinBetween = _VUMin(Size, OpSize::i32Bit, ZipLower, ZipUpper);\n\n  // Now do a horizontal vector minimum\n  auto Min = _VUMinV(Size, OpSize::i32Bit, MinBetween);\n\n  // We now have a value in the bottom 32-bits in the order of:\n  // [31:0]: (Src[<Min>] << 16) | <Index>\n  // This instruction wants it in the form of:\n  // [31:0]: (<Index> << 16) | Src[<Min>]\n  // Rev32 does this for us\n  return _VRev32(Size, OpSize::i16Bit, Min);\n}\n\nvoid OpDispatchBuilder::PHMINPOSUWOp(OpcodeArgs) {\n  Ref Result = PHMINPOSUWOpImpl(Op);\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::DPPOpImpl(IR::OpSize DstSize, Ref Src1, Ref Src2, uint8_t Mask, IR::OpSize ElementSize) {\n  const auto SizeMask = [ElementSize]() {\n    if (ElementSize == OpSize::i32Bit) {\n      return 0b1111;\n    }\n    return 0b11;\n  }();\n\n  const uint8_t SrcMask = (Mask >> 4) & SizeMask;\n  const uint8_t DstMask = Mask & SizeMask;\n\n  const auto NamedIndexMask = [ElementSize]() {\n    if (ElementSize == OpSize::i32Bit) {\n      return FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_DPPS_MASK;\n    }\n\n    return FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_DPPD_MASK;\n  }();\n\n  Ref ZeroVec = LoadZeroVector(DstSize);\n  if (SrcMask == 0 || DstMask == 0) {\n    // What are you even doing here? Go away.\n    return ZeroVec;\n  }\n\n  // First step is to do an FMUL\n  Ref Temp = _VFMul(DstSize, ElementSize, Src1, Src2);\n\n  // Now mask results based on IndexMask.\n  if (SrcMask != SizeMask) {\n    auto InputMask = LoadAndCacheIndexedNamedVectorConstant(DstSize, NamedIndexMask, SrcMask * 16);\n    Temp = _VAnd(DstSize, ElementSize, Temp, InputMask);\n  }\n\n  // Now due a float reduction\n  Temp = _VFAddV(DstSize, ElementSize, Temp);\n\n  // Now using the destination mask we choose where the result ends up\n  // It can duplicate and zero results\n  if (ElementSize == OpSize::i64Bit) {\n    switch (DstMask) {\n    case 0b01:\n      // Dest[63:0] = Result\n      // Dest[127:64] = Zero\n      return _VZip(DstSize, ElementSize, Temp, ZeroVec);\n    case 0b10:\n      // Dest[63:0] = Zero\n      // Dest[127:64] = Result\n      return _VZip(DstSize, ElementSize, ZeroVec, Temp);\n    case 0b11:\n      // Broadcast\n      // Dest[63:0] = Result\n      // Dest[127:64] = Result\n      return _VDupElement(DstSize, ElementSize, Temp, 0);\n    case 0:\n    default: LOGMAN_MSG_A_FMT(\"Unsupported\");\n    }\n  } else {\n    auto BadPath = [&]() {\n      Ref Result = ZeroVec;\n\n      for (size_t i = 0; i < IR::NumElements(DstSize, ElementSize); ++i) {\n        const auto Bit = 1U << (i % 4);\n\n        if ((DstMask & Bit) != 0) {\n          Result = _VInsElement(DstSize, ElementSize, i, 0, Result, Temp);\n        }\n      }\n\n      return Result;\n    };\n    switch (DstMask) {\n    case 0b0001:\n      // Dest[31:0]   = Result\n      // Dest[63:32]  = Zero\n      // Dest[95:64]  = Zero\n      // Dest[127:96] = Zero\n      return _VZip(DstSize, ElementSize, Temp, ZeroVec);\n    case 0b0010:\n      // Dest[31:0]   = Zero\n      // Dest[63:32]  = Result\n      // Dest[95:64]  = Zero\n      // Dest[127:96] = Zero\n      return _VZip(DstSize >> 1, ElementSize, ZeroVec, Temp);\n    case 0b0011:\n      // Dest[31:0]   = Result\n      // Dest[63:32]  = Result\n      // Dest[95:64]  = Zero\n      // Dest[127:96] = Zero\n      return _VDupElement(DstSize >> 1, ElementSize, Temp, 0);\n    case 0b0100:\n      // Dest[31:0]   = Zero\n      // Dest[63:32]  = Zero\n      // Dest[95:64]  = Result\n      // Dest[127:96] = Zero\n      return _VZip(DstSize, OpSize::i64Bit, ZeroVec, Temp);\n    case 0b0101:\n      // Dest[31:0]   = Result\n      // Dest[63:32]  = Zero\n      // Dest[95:64]  = Result\n      // Dest[127:96] = Zero\n      return _VZip(DstSize, OpSize::i64Bit, Temp, Temp);\n    case 0b0110:\n      // Dest[31:0]   = Zero\n      // Dest[63:32]  = Result\n      // Dest[95:64]  = Result\n      // Dest[127:96] = Zero\n      return BadPath();\n    case 0b0111:\n      // Dest[31:0]   = Result\n      // Dest[63:32]  = Result\n      // Dest[95:64]  = Result\n      // Dest[127:96] = Zero\n      Temp = _VDupElement(DstSize, ElementSize, Temp, 0);\n      return _VInsElement(DstSize, ElementSize, 3, 0, Temp, ZeroVec);\n    case 0b1000:\n      // Dest[31:0]   = Zero\n      // Dest[63:32]  = Zero\n      // Dest[95:64]  = Zero\n      // Dest[127:96] = Result\n      return _VExtr(DstSize, OpSize::i8Bit, Temp, ZeroVec, 4);\n    case 0b1001:\n      // Dest[31:0]   = Result\n      // Dest[63:32]  = Zero\n      // Dest[95:64]  = Zero\n      // Dest[127:96] = Result\n      return BadPath();\n    case 0b1010:\n      // Dest[31:0]   = Zero\n      // Dest[63:32]  = Result\n      // Dest[95:64]  = Zero\n      // Dest[127:96] = Result\n      Temp = _VDupElement(DstSize, ElementSize, Temp, 0);\n      return _VZip(DstSize, OpSize::i32Bit, ZeroVec, Temp);\n    case 0b1011:\n      // Dest[31:0]   = Result\n      // Dest[63:32]  = Result\n      // Dest[95:64]  = Zero\n      // Dest[127:96] = Result\n      Temp = _VDupElement(DstSize, ElementSize, Temp, 0);\n      return _VInsElement(DstSize, ElementSize, 2, 0, Temp, ZeroVec);\n    case 0b1100:\n      // Dest[31:0]   = Zero\n      // Dest[63:32]  = Zero\n      // Dest[95:64]  = Result\n      // Dest[127:96] = Result\n      Temp = _VDupElement(DstSize, ElementSize, Temp, 0);\n      return _VZip(DstSize, OpSize::i64Bit, ZeroVec, Temp);\n    case 0b1101:\n      // Dest[31:0]   = Result\n      // Dest[63:32]  = Zero\n      // Dest[95:64]  = Result\n      // Dest[127:96] = Result\n      Temp = _VDupElement(DstSize, ElementSize, Temp, 0);\n      return _VInsElement(DstSize, ElementSize, 1, 0, Temp, ZeroVec);\n    case 0b1110:\n      // Dest[31:0]   = Zero\n      // Dest[63:32]  = Result\n      // Dest[95:64]  = Result\n      // Dest[127:96] = Result\n      Temp = _VDupElement(DstSize, ElementSize, Temp, 0);\n      return _VInsElement(DstSize, ElementSize, 0, 0, Temp, ZeroVec);\n    case 0b1111:\n      // Broadcast\n      // Dest[31:0]   = Result\n      // Dest[63:32]  = Zero\n      // Dest[95:64]  = Zero\n      // Dest[127:96] = Zero\n      return _VDupElement(DstSize, ElementSize, Temp, 0);\n    case 0:\n    default: LOGMAN_MSG_A_FMT(\"Unsupported\");\n    }\n  }\n  FEX_UNREACHABLE;\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::DPPOp(OpcodeArgs) {\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  Ref Result = DPPOpImpl(OpSizeFromDst(Op), Dest, Src, Op->Src[1].Literal(), ElementSize);\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::DPPOp<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::DPPOp<OpSize::i64Bit>(OpcodeArgs);\n\nRef OpDispatchBuilder::VDPPSOpImpl(OpcodeArgs, const X86Tables::DecodedOperand& Src1, const X86Tables::DecodedOperand& Src2,\n                                   const X86Tables::DecodedOperand& Imm) {\n  constexpr auto ElementSize = OpSize::i32Bit;\n  const uint8_t Mask = Imm.Literal();\n  const uint8_t SrcMask = Mask >> 4;\n  const uint8_t DstMask = Mask & 0xF;\n\n  const auto DstSize = OpSizeFromDst(Op);\n\n  Ref Src1V = LoadSourceFPR(Op, Src1, Op->Flags);\n  Ref Src2V = LoadSourceFPR(Op, Src2, Op->Flags);\n\n  Ref ZeroVec = LoadZeroVector(DstSize);\n\n  // First step is to do an FMUL\n  Ref Temp = _VFMul(DstSize, ElementSize, Src1V, Src2V);\n\n  // Now we zero out elements based on src mask\n  for (size_t i = 0; i < IR::NumElements(DstSize, ElementSize); ++i) {\n    const auto Bit = 1U << (i % 4);\n\n    if ((SrcMask & Bit) == 0) {\n      Temp = _VInsElement(DstSize, ElementSize, i, 0, Temp, ZeroVec);\n    }\n  }\n\n  // Now we need to do a horizontal add of the elements\n  // We only have pairwise float add so this needs to be done in steps\n  Temp = _VFAddP(DstSize, ElementSize, Temp, ZeroVec);\n\n  if (ElementSize == OpSize::i32Bit) {\n    // For 32-bit float we need one more step to add all four results together\n    Temp = _VFAddP(DstSize, ElementSize, Temp, ZeroVec);\n  }\n\n  // Now using the destination mask we choose where the result ends up\n  // It can duplicate and zero results\n  Ref Result = ZeroVec;\n\n  for (size_t i = 0; i < IR::NumElements(DstSize, ElementSize); ++i) {\n    const auto Bit = 1U << (i % 4);\n\n    if ((DstMask & Bit) != 0) {\n      Result = _VInsElement(DstSize, ElementSize, i, 0, Result, Temp);\n    }\n  }\n\n  return Result;\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::VDPPOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n\n  Ref Result {};\n  if (ElementSize == OpSize::i32Bit && DstSize == OpSize::i256Bit) {\n    // 256-bit DPPS isn't handled by the 128-bit solution.\n    Result = VDPPSOpImpl(Op, Op->Src[0], Op->Src[1], Op->Src[2]);\n  } else {\n    Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n    Result = DPPOpImpl(DstSize, Src1, Src2, Op->Src[2].Literal(), ElementSize);\n  }\n\n  // We don't need to emit a _VMov to clear the upper lane, since DPPOpImpl uses a zero vector\n  // to construct the results, so the upper lane will always be cleared for the 128-bit version.\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::VDPPOp<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VDPPOp<OpSize::i64Bit>(OpcodeArgs);\n\nRef OpDispatchBuilder::MPSADBWOpImpl(IR::OpSize SrcSize, Ref Src1, Ref Src2, uint8_t Select) {\n  const auto LaneHelper = [&, this](uint32_t Selector_Src1, uint32_t Selector_Src2, Ref Src1, Ref Src2) {\n    // Src2 will grab a 32bit element and duplicate it across the 128bits\n    Ref DupSrc = _VDupElement(OpSize::i128Bit, OpSize::i32Bit, Src2, Selector_Src2);\n\n    // Src1/Dest needs a bunch of magic\n\n    // Shift right by selected bytes\n    // This will give us Dest[15:0], and Dest[79:64]\n    Ref Dest1 = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src1, Src1, Selector_Src1 + 0);\n    // This will give us Dest[31:16], and Dest[95:80]\n    Ref Dest2 = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src1, Src1, Selector_Src1 + 1);\n    // This will give us Dest[47:32], and Dest[111:96]\n    Ref Dest3 = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src1, Src1, Selector_Src1 + 2);\n    // This will give us Dest[63:48], and Dest[127:112]\n    Ref Dest4 = _VExtr(OpSize::i128Bit, OpSize::i8Bit, Src1, Src1, Selector_Src1 + 3);\n\n    // For each shifted section, we now have two 32-bit values per vector that can be used\n    // Dest1.S[0] and Dest1.S[1] = Bytes - 0,1,2,3:4,5,6,7\n    // Dest2.S[0] and Dest2.S[1] = Bytes - 1,2,3,4:5,6,7,8\n    // Dest3.S[0] and Dest3.S[1] = Bytes - 2,3,4,5:6,7,8,9\n    // Dest4.S[0] and Dest4.S[1] = Bytes - 3,4,5,6:7,8,9,10\n    Dest1 = _VUABDL(OpSize::i128Bit, OpSize::i8Bit, Dest1, DupSrc);\n    Dest2 = _VUABDL(OpSize::i128Bit, OpSize::i8Bit, Dest2, DupSrc);\n    Dest3 = _VUABDL(OpSize::i128Bit, OpSize::i8Bit, Dest3, DupSrc);\n    Dest4 = _VUABDL(OpSize::i128Bit, OpSize::i8Bit, Dest4, DupSrc);\n\n    // Dest[1,2,3,4] Now contains the data prior to combining\n    // Temp[0,1,2,3] for each step\n\n    // Each destination now has 16bit x 8 elements in it that were the absolute difference for each byte\n    // Needs each to be 16bit to store the next step\n    // Next stage is to sum pairwise\n    // Dest1:\n    //  ADDP Dest3, Dest1: TmpCombine1\n    //  ADDP Dest4, Dest2: TmpCombine2\n    //    TmpCombine1.8H[0] = Dest1.8H[0] + Dest1.8H[1];\n    //    TmpCombine1.8H[1] = Dest1.8H[2] + Dest1.8H[3];\n    //    TmpCombine1.8H[2] = Dest1.8H[4] + Dest1.8H[5];\n    //    TmpCombine1.8H[3] = Dest1.8H[6] + Dest1.8H[7];\n    //    TmpCombine1.8H[4] = Dest3.8H[0] + Dest3.8H[1];\n    //    TmpCombine1.8H[5] = Dest3.8H[2] + Dest3.8H[3];\n    //    TmpCombine1.8H[6] = Dest3.8H[4] + Dest3.8H[5];\n    //    TmpCombine1.8H[7] = Dest3.8H[6] + Dest3.8H[7];\n    //    <Repeat for Dest4 and Dest3>\n    auto TmpCombine1 = _VAddP(OpSize::i128Bit, OpSize::i16Bit, Dest1, Dest3);\n    auto TmpCombine2 = _VAddP(OpSize::i128Bit, OpSize::i16Bit, Dest2, Dest4);\n\n    // TmpTranspose1:\n    // VTrn TmpCombine1, TmpCombine2: TmpTranspose1\n    // Transposes Even and odd elements so we can use vaddp for final results.\n    auto TmpTranspose1 = _VTrn(OpSize::i128Bit, OpSize::i32Bit, TmpCombine1, TmpCombine2);\n    auto TmpTranspose2 = _VTrn2(OpSize::i128Bit, OpSize::i32Bit, TmpCombine1, TmpCombine2);\n\n    // ADDP TmpTranspose1, TmpTranspose2: FinalCombine\n    //    FinalCombine.8H[0] = TmpTranspose1.8H[0] + TmpTranspose1.8H[1]\n    //    FinalCombine.8H[1] = TmpTranspose1.8H[2] + TmpTranspose1.8H[3]\n    //    FinalCombine.8H[2] = TmpTranspose1.8H[4] + TmpTranspose1.8H[5]\n    //    FinalCombine.8H[3] = TmpTranspose1.8H[6] + TmpTranspose1.8H[7]\n    //    FinalCombine.8H[4] = TmpTranspose2.8H[0] + TmpTranspose2.8H[1]\n    //    FinalCombine.8H[5] = TmpTranspose2.8H[2] + TmpTranspose2.8H[3]\n    //    FinalCombine.8H[6] = TmpTranspose2.8H[4] + TmpTranspose2.8H[5]\n    //    FinalCombine.8H[7] = TmpTranspose2.8H[6] + TmpTranspose2.8H[7]\n\n    return _VAddP(OpSize::i128Bit, OpSize::i16Bit, TmpTranspose1, TmpTranspose2);\n  };\n\n  const auto Is128Bit = SrcSize == OpSize::i128Bit;\n\n  // Src1 needs to be in byte offset\n  const uint8_t Select_Src1_Low = ((Select & 0b100) >> 2) * 32 / 8;\n  const uint8_t Select_Src2_Low = Select & 0b11;\n\n  Ref Lower = LaneHelper(Select_Src1_Low, Select_Src2_Low, Src1, Src2);\n  if (Is128Bit) {\n    return Lower;\n  }\n\n  const uint8_t Select_Src1_High = ((Select & 0b100000) >> 5) * 32 / 8;\n  const uint8_t Select_Src2_High = (Select & 0b11000) >> 3;\n\n  Ref UpperSrc1 = _VDupElement(OpSize::i256Bit, OpSize::i128Bit, Src1, 1);\n  Ref UpperSrc2 = _VDupElement(OpSize::i256Bit, OpSize::i128Bit, Src2, 1);\n  Ref Upper = LaneHelper(Select_Src1_High, Select_Src2_High, UpperSrc1, UpperSrc2);\n  return _VInsElement(OpSize::i256Bit, OpSize::i128Bit, 1, 0, Lower, Upper);\n}\n\nvoid OpDispatchBuilder::MPSADBWOp(OpcodeArgs) {\n  const uint8_t Select = Op->Src[1].Literal();\n  const auto SrcSize = OpSizeFromSrc(Op);\n  Ref Src1 = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  Ref Result = MPSADBWOpImpl(SrcSize, Src1, Src2, Select);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VMPSADBWOp(OpcodeArgs) {\n  const uint8_t Select = Op->Src[2].Literal();\n  const auto SrcSize = OpSizeFromSrc(Op);\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  Ref Result = MPSADBWOpImpl(SrcSize, Src1, Src2, Select);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VINSERTOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR_WithOpSize(Op, Op->Src[1], OpSize::i128Bit, Op->Flags);\n\n  const auto Selector = Op->Src[2].Literal() & 1;\n  Ref Result = _VInsElement(DstSize, OpSize::i128Bit, Selector, 0, Src1, Src2);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VCVTPH2PSOp(OpcodeArgs) {\n  // In the event that a memory operand is used as the source operand,\n  // the access width will always be half the size of the destination vector width\n  // (i.e. 128-bit vector -> 64-bit mem, 256-bit vector -> 128-bit mem)\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto SrcLoadSize = Op->Src[0].IsGPR() ? DstSize : IR::SizeToOpSize(IR::OpSizeToSize(DstSize) / 2);\n\n  Ref Src = LoadSourceFPR_WithOpSize(Op, Op->Src[0], SrcLoadSize, Op->Flags);\n  Ref Result = _Vector_FToF(DstSize, OpSize::i32Bit, Src, OpSize::i16Bit);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VCVTPS2PHOp(OpcodeArgs) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto StoreSize = Op->Dest.IsGPR() ? OpSize::i128Bit : IR::SizeToOpSize(IR::OpSizeToSize(SrcSize) / 2);\n\n  const auto Imm8 = Op->Src[1].Literal();\n  const auto UseMXCSR = (Imm8 & 0b100) != 0;\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  Ref Result = nullptr;\n  if (UseMXCSR) {\n    Result = _Vector_FToF(SrcSize, OpSize::i16Bit, Src, OpSize::i32Bit);\n  } else {\n    // No ARM float conversion instructions allow passing in\n    // a rounding mode as an immediate. All of them depend on\n    // the RM field in the FPCR. And so! We have to do some ugly\n    // rounding mode shuffling.\n    const auto NewRMode = Imm8 & 0b11;\n    Ref SavedFPCR = _PushRoundingMode(NewRMode);\n\n    Result = _Vector_FToF(SrcSize, OpSize::i16Bit, Src, OpSize::i32Bit);\n    _PopRoundingMode(SavedFPCR);\n  }\n\n  // We need to eliminate upper junk if we're storing into a register with\n  // a 256-bit source (VCVTPS2PH's destination for registers is an XMM).\n  if (Op->Src[0].IsGPR() && SrcSize == OpSize::i256Bit) {\n    Result = _VMov(OpSize::i128Bit, Result);\n  }\n\n  StoreResultFPR_WithOpSize(Op, Op->Dest, Result, StoreSize);\n}\n\nvoid OpDispatchBuilder::VPERM2Op(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  const auto Selector = Op->Src[2].Literal();\n  Ref Result = LoadZeroVector(DstSize);\n\n  const auto SelectElement = [&](uint64_t Index, uint64_t SelectorIdx) {\n    switch (SelectorIdx) {\n    case 0:\n    case 1: return _VInsElement(DstSize, OpSize::i128Bit, Index, SelectorIdx, Result, Src1);\n    case 2:\n    case 3:\n    default: return _VInsElement(DstSize, OpSize::i128Bit, Index, SelectorIdx - 2, Result, Src2);\n    }\n  };\n\n  if ((Selector & 0b00001000) == 0) {\n    Result = SelectElement(0, Selector & 0b11);\n  }\n  if ((Selector & 0b10000000) == 0) {\n    Result = SelectElement(1, (Selector >> 4) & 0b11);\n  }\n\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::VPERMDIndices(OpSize DstSize, Ref Indices, Ref IndexMask, Ref Repeating3210) {\n  // Get rid of any junk unrelated to the relevant selector index bits (bits [2:0])\n  Ref SanitizedIndices = _VAnd(DstSize, OpSize::i8Bit, Indices, IndexMask);\n\n  // Build up the broadcasted index mask. e.g. On x86-64, the selector index\n  // is always in the lower 3 bits of a 32-bit element. However, in order to\n  // build up a vector we can use with the ARMv8 TBL instruction, we need the\n  // selector index for each particular element to be within each byte of the\n  // 32-bit element.\n  //\n  // We can do this by TRN-ing the selector index vector twice. Once using byte elements\n  // then once more using half-word elements.\n  //\n  // The first pass creates the half-word elements, and then the second pass uses those\n  // halfword elements to place the indices in the top part of the 32-bit element.\n  //\n  // e.g. Consider a selector vector with indices in 32-bit elements like:\n  //\n  // ╔═══════════╗╔═══════════╗╔═══════════╗╔═══════════╗╔═══════════╗╔═══════════╗╔═══════════╗╔═══════════╗\n  // ║     4     ║║     1     ║║     2     ║║     6     ║║     7     ║║     0     ║║     3     ║║     5     ║\n  // ╚═══════════╝╚═══════════╝╚═══════════╝╚═══════════╝╚═══════════╝╚═══════════╝╚═══════════╝╚═══════════╝\n  //\n  // TRNing once using byte elements by itself will create a vector with 8-bit elements like:\n  // ╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗\n  // ║ 0 ║║ 0 ║║ 4 ║║ 4 ║║ 0 ║║ 0 ║║ 1 ║║ 1 ║║ 0 ║║ 0 ║║ 2 ║║ 2 ║║ 0 ║║ 0 ║║ 6 ║║ 6 ║║ 0 ║║ 0 ║║ 7 ║║ 7 ║║ 0 ║║ 0 ║║ 0 ║║ 0 ║║ 0 ║║ 0 ║║ 3 ║║ 3 ║║ 0 ║║ 0 ║║ 5 ║║ 5 ║\n  // ╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝\n  //\n  // TRNing once using half-word elements by itself will then transform the vector into:\n  // ╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗╔═══╗\n  // ║ 4 ║║ 4 ║║ 4 ║║ 4 ║║ 1 ║║ 1 ║║ 1 ║║ 1 ║║ 2 ║║ 2 ║║ 2 ║║ 2 ║║ 6 ║║ 6 ║║ 6 ║║ 6 ║║ 7 ║║ 7 ║║ 7 ║║ 7 ║║ 0 ║║ 0 ║║ 0 ║║ 0 ║║ 3 ║║ 3 ║║ 3 ║║ 3 ║║ 5 ║║ 5 ║║ 5 ║║ 5 ║\n  // ╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝╚═══╝\n  //\n  // Cool! We now have everything we need to take this further.\n\n  Ref IndexTrn1 = _VTrn(DstSize, OpSize::i8Bit, SanitizedIndices, SanitizedIndices);\n  Ref IndexTrn2 = _VTrn(DstSize, OpSize::i16Bit, IndexTrn1, IndexTrn1);\n\n  // Now that we have the indices set up, now we need to multiply each\n  // element by 4 to convert the elements into byte indices rather than\n  // 32-bit word indices.\n  //\n  // e.g. We turn our vector into:\n  // ╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗\n  // ║ 16 ║║ 16 ║║ 16 ║║ 16 ║║ 4  ║║ 4  ║║ 4  ║║ 4  ║║ 8  ║║ 8  ║║ 8  ║║ 8  ║║ 24 ║║ 24 ║║ 24 ║║ 24 ║║ 28 ║║ 28 ║║ 28 ║║ 28 ║║ 0  ║║ 0  ║║ 00 ║║ 0  ║║ 12 ║║ 12 ║║ 12 ║║ 12 ║║ 20 ║║ 20 ║║ 20 ║║ 20 ║\n  // ╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝\n  //\n  Ref ShiftedIndices = _VShlI(DstSize, OpSize::i8Bit, IndexTrn2, 2);\n\n  // Now we need to add a byte vector containing [3, 2, 1, 0] repeating for the\n  // entire length of it, to the index register, so that we specify the bytes\n  // that make up the entire word in the source register.\n  //\n  // e.g. Our vector finally looks like so:\n  //\n  // ╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗╔════╗\n  // ║ 19 ║║ 18 ║║ 17 ║║ 16 ║║ 7  ║║ 6  ║║ 5  ║║ 4  ║║ 11 ║║ 10 ║║ 9  ║║ 8  ║║ 27 ║║ 26 ║║ 25 ║║ 24 ║║ 31 ║║ 30 ║║ 29 ║║ 28 ║║ 3  ║║ 2  ║║ 01 ║║ 0  ║║ 15 ║║ 14 ║║ 13 ║║ 12 ║║ 23 ║║ 22 ║║ 21 ║║ 20 ║\n  // ╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝\n  //\n  // Which finally lets us permute the source vector and be done with everything.\n  return _VAdd(DstSize, OpSize::i8Bit, ShiftedIndices, Repeating3210);\n}\n\nvoid OpDispatchBuilder::VPERMDOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n\n  Ref Indices = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  // Get rid of any junk unrelated to the relevant selector index bits (bits [2:0])\n  Ref IndexMask = _VectorImm(DstSize, OpSize::i32Bit, 0b111);\n\n  Ref AddConst = Constant(0x03020100);\n  Ref Repeating3210 = _VDupFromGPR(DstSize, OpSize::i32Bit, AddConst);\n  Ref FinalIndices = VPERMDIndices(OpSizeFromDst(Op), Indices, IndexMask, Repeating3210);\n\n  // Now lets finally shuffle this bad boy around.\n  Ref Result = _VTBL1(DstSize, Src, FinalIndices);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPERMQOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  const auto Selector = Op->Src[1].Literal();\n  Ref Result {};\n\n  // If we're just broadcasting one element in particular across the vector\n  // then this can be done fairly simply without any individual inserts.\n  if (Selector == 0x00 || Selector == 0x55 || Selector == 0xAA || Selector == 0xFF) {\n    const auto Index = Selector & 0b11;\n    Result = _VDupElement(DstSize, OpSize::i64Bit, Src, Index);\n  } else {\n    Result = LoadZeroVector(DstSize);\n    for (size_t i = 0; i < IR::NumElements(DstSize, IR::OpSize::i64Bit); i++) {\n      const auto SrcIndex = (Selector >> (i * 2)) & 0b11;\n      Result = _VInsElement(DstSize, OpSize::i64Bit, i, SrcIndex, Result, Src);\n    }\n  }\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::VBLENDOpImpl(IR::OpSize VecSize, IR::OpSize ElementSize, Ref Src1, Ref Src2, Ref ZeroRegister, uint64_t Selector) {\n  const std::array Sources {Src1, Src2};\n\n  Ref Result = ZeroRegister;\n  const auto NumElements = IR::NumElements(VecSize, ElementSize);\n  for (int i = 0; i < NumElements; i++) {\n    const auto SelectorIndex = (Selector >> i) & 1;\n\n    Result = _VInsElement(VecSize, ElementSize, i, i, Result, Sources[SelectorIndex]);\n  }\n\n  return Result;\n}\n\nvoid OpDispatchBuilder::VBLENDPDOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto Is256Bit = DstSize == OpSize::i256Bit;\n  const auto Selector = Op->Src[2].Literal();\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  if (Selector == 0) {\n    Ref Result = Is256Bit ? Src1 : _VMov(OpSize::i128Bit, Src1);\n    StoreResultFPR(Op, Result);\n    return;\n  }\n  // Only the first four bits of the 8-bit immediate are used, so only check them.\n  if (((Selector & 0b11) == 0b11 && !Is256Bit) || (Selector & 0b1111) == 0b1111) {\n    Ref Result = Is256Bit ? Src2 : _VMov(OpSize::i128Bit, Src2);\n    StoreResultFPR(Op, Result);\n    return;\n  }\n\n  const auto ZeroRegister = LoadZeroVector(DstSize);\n  Ref Result = VBLENDOpImpl(DstSize, OpSize::i64Bit, Src1, Src2, ZeroRegister, Selector);\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPBLENDDOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto Is256Bit = DstSize == OpSize::i256Bit;\n  const auto Selector = Op->Src[2].Literal();\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  // Each bit in the selector chooses between Src1 and Src2.\n  // If a bit is set, then we select it's corresponding 32-bit element from Src2\n  // If a bit is not set, then we select it's corresponding 32-bit element from Src1\n\n  // Cases where we can exit out early, since the selector is indicating a copy\n  // of an entire input vector. Unlikely to occur, since it's slower than\n  // just an equivalent vector move instruction. but just in case something\n  // silly is happening, we have your back.\n\n  if (Selector == 0) {\n    Ref Result = Is256Bit ? Src1 : _VMov(OpSize::i128Bit, Src1);\n    StoreResultFPR(Op, Result);\n    return;\n  }\n  if (Selector == 0xFF && Is256Bit) {\n    StoreResultFPR(Op, Src2);\n    return;\n  }\n  // The only bits we care about from the 8-bit immediate for 128-bit operations\n  // are the first four bits. We do a bitwise check here to catch cases where\n  // silliness is going on and the upper bits are being set even when they'll\n  // be ignored\n  if ((Selector & 0xF) == 0xF && !Is256Bit) {\n    StoreResultFPR(Op, _VMov(OpSize::i128Bit, Src2));\n    return;\n  }\n\n  const auto ZeroRegister = LoadZeroVector(DstSize);\n  Ref Result = VBLENDOpImpl(DstSize, OpSize::i32Bit, Src1, Src2, ZeroRegister, Selector);\n  if (!Is256Bit) {\n    Result = _VMov(OpSize::i128Bit, Result);\n  }\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VPBLENDWOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto Is128Bit = DstSize == OpSize::i128Bit;\n  const auto Selector = Op->Src[2].Literal();\n\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  if (Selector == 0) {\n    Ref Result = Is128Bit ? _VMov(OpSize::i128Bit, Src1) : Src1;\n    StoreResultFPR(Op, Result);\n    return;\n  }\n  if (Selector == 0xFF) {\n    Ref Result = Is128Bit ? _VMov(OpSize::i128Bit, Src2) : Src2;\n    StoreResultFPR(Op, Result);\n    return;\n  }\n\n  // 256-bit VPBLENDW acts as if the 8-bit selector values were also applied\n  // to the upper bits, so we can just replicate the bits by forming a 16-bit\n  // imm for the helper function to use.\n  const auto NewSelector = Selector << 8 | Selector;\n\n  const auto ZeroRegister = LoadZeroVector(DstSize);\n  Ref Result = VBLENDOpImpl(DstSize, OpSize::i16Bit, Src1, Src2, ZeroRegister, NewSelector);\n  if (Is128Bit) {\n    Result = _VMov(OpSize::i128Bit, Result);\n  }\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VZEROOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto IsVZEROALL = DstSize == OpSize::i256Bit;\n  const auto NumRegs = Is64BitMode ? 16U : 8U;\n\n  if (IsVZEROALL) {\n    // NOTE: Despite the name being VZEROALL, this will still only ever\n    //       zero out up to the first 16 registers (even on AVX-512, where we have 32 registers)\n\n    for (uint32_t i = 0; i < NumRegs; i++) {\n      // Explicitly not caching named vector zero. This ensures that every register gets movi #0.0 directly.\n      Ref ZeroVector = LoadUncachedZeroVector(DstSize);\n      StoreXMMRegister(i, ZeroVector);\n    }\n  } else {\n    // Likewise, VZEROUPPER will only ever zero only up to the first 16 registers\n\n    for (uint32_t i = 0; i < NumRegs; i++) {\n      Ref Reg = LoadXMMRegister(i);\n      Ref Dst = _VMov(OpSize::i128Bit, Reg);\n      StoreXMMRegister(i, Dst);\n    }\n  }\n}\n\nvoid OpDispatchBuilder::VPERMILImmOp(OpcodeArgs, IR::OpSize ElementSize) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto Is256Bit = DstSize == OpSize::i256Bit;\n  const auto Selector = Op->Src[1].Literal() & 0xFF;\n\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Result = LoadZeroVector(DstSize);\n\n  if (ElementSize == OpSize::i64Bit) {\n    Result = _VInsElement(DstSize, ElementSize, 0, Selector & 0b0001, Result, Src);\n    Result = _VInsElement(DstSize, ElementSize, 1, (Selector & 0b0010) >> 1, Result, Src);\n\n    if (Is256Bit) {\n      Result = _VInsElement(DstSize, ElementSize, 2, ((Selector & 0b0100) >> 2) + 2, Result, Src);\n      Result = _VInsElement(DstSize, ElementSize, 3, ((Selector & 0b1000) >> 3) + 2, Result, Src);\n    }\n  } else {\n    Result = _VInsElement(DstSize, ElementSize, 0, Selector & 0b00000011, Result, Src);\n    Result = _VInsElement(DstSize, ElementSize, 1, (Selector & 0b00001100) >> 2, Result, Src);\n    Result = _VInsElement(DstSize, ElementSize, 2, (Selector & 0b00110000) >> 4, Result, Src);\n    Result = _VInsElement(DstSize, ElementSize, 3, (Selector & 0b11000000) >> 6, Result, Src);\n\n    if (Is256Bit) {\n      Result = _VInsElement(DstSize, ElementSize, 4, (Selector & 0b00000011) + 4, Result, Src);\n      Result = _VInsElement(DstSize, ElementSize, 5, ((Selector & 0b00001100) >> 2) + 4, Result, Src);\n      Result = _VInsElement(DstSize, ElementSize, 6, ((Selector & 0b00110000) >> 4) + 4, Result, Src);\n      Result = _VInsElement(DstSize, ElementSize, 7, ((Selector & 0b11000000) >> 6) + 4, Result, Src);\n    }\n  }\n\n  StoreResultFPR(Op, Result);\n}\n\nRef OpDispatchBuilder::VPERMILRegOpImpl(OpSize DstSize, IR::OpSize ElementSize, Ref Src, Ref Indices) {\n  // NOTE: See implementation of VPERMD for the gist of what we do to make this work.\n  //\n  //       The only difference here is that we need to add 16 to the upper lane\n  //       before doing the final addition to build up the indices for TBL.\n\n  const auto Is256Bit = DstSize == OpSize::i256Bit;\n  auto IsPD = ElementSize == OpSize::i64Bit;\n\n  if (IsPD) {\n    // VPERMILPD stores the selector in the second bit, rather than the\n    // first bit of each element in the index vector. So move it over by one.\n    Indices = _VUShrI(DstSize, ElementSize, Indices, 1);\n  }\n\n  // Sanitize indices first\n  const auto ShiftAmount = 0b11 >> static_cast<uint32_t>(IsPD);\n  Ref IndexMask = _VectorImm(DstSize, ElementSize, ShiftAmount);\n  Ref SanitizedIndices = _VAnd(DstSize, OpSize::i8Bit, Indices, IndexMask);\n\n  Ref IndexTrn1 = _VTrn(DstSize, OpSize::i8Bit, SanitizedIndices, SanitizedIndices);\n  Ref IndexTrn2 = _VTrn(DstSize, OpSize::i16Bit, IndexTrn1, IndexTrn1);\n  Ref IndexTrn3 = IndexTrn2;\n  if (IsPD) {\n    IndexTrn3 = _VTrn(DstSize, OpSize::i32Bit, IndexTrn2, IndexTrn2);\n  }\n\n  auto IndexShift = IsPD ? 3 : 2;\n  Ref ShiftedIndices = _VShlI(DstSize, OpSize::i8Bit, IndexTrn3, IndexShift);\n\n  uint64_t VConstant = IsPD ? 0x0706050403020100 : 0x03020100;\n  Ref VectorConst = _VDupFromGPR(DstSize, ElementSize, Constant(VConstant));\n  Ref FinalIndices {};\n\n  if (Is256Bit) {\n    const auto ZeroRegister = LoadZeroVector(DstSize);\n    Ref Vector16 = _VInsElement(DstSize, OpSize::i128Bit, 1, 0, ZeroRegister, _VectorImm(DstSize, OpSize::i8Bit, 16));\n    Ref IndexOffsets = _VAdd(DstSize, OpSize::i8Bit, VectorConst, Vector16);\n\n    FinalIndices = _VAdd(DstSize, OpSize::i8Bit, IndexOffsets, ShiftedIndices);\n  } else {\n    FinalIndices = _VAdd(DstSize, OpSize::i8Bit, VectorConst, ShiftedIndices);\n  }\n\n  return _VTBL1(DstSize, Src, FinalIndices);\n}\n\ntemplate<IR::OpSize ElementSize>\nvoid OpDispatchBuilder::VPERMILRegOp(OpcodeArgs) {\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Indices = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  Ref Result = VPERMILRegOpImpl(OpSizeFromDst(Op), ElementSize, Src, Indices);\n  StoreResultFPR(Op, Result);\n}\n\ntemplate void OpDispatchBuilder::VPERMILRegOp<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VPERMILRegOp<OpSize::i64Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::PCMPXSTRXOpImpl(OpcodeArgs, bool IsExplicit, bool IsMask) {\n  const uint16_t Control = Op->Src[1].Literal();\n\n  // NOTE: Unlike most other SSE/AVX instructions, the SSE4.2 string and text\n  //       instructions do *not* require memory operands to be aligned on a 16 byte\n  //       boundary (see \"Other Exceptions\" descriptions for the relevant\n  //       instructions in the Intel Software Development Manual).\n  //\n  //       So, we specify Src2 as having an alignment of 1 to indicate this.\n  Ref Src1 = LoadSourceFPR_WithOpSize(Op, Op->Dest, OpSize::i128Bit, Op->Flags);\n  Ref Src2 = LoadSourceFPR_WithOpSize(Op, Op->Src[0], OpSize::i128Bit, Op->Flags, {.Align = OpSize::i8Bit});\n\n  Ref IntermediateResult {};\n  if (IsExplicit) {\n    // Will be 4 in the absence of a REX.W bit and 8 in the presence of a REX.W bit.\n    //\n    // While the control bit immediate for the instruction itself is only ever 8 bits\n    // in size, we use it as a 16-bit value so that we can use the 8th bit to signify\n    // whether or not RAX and RDX should be interpreted as a 64-bit value.\n    const auto SrcSize = OpSizeFromSrc(Op);\n    const auto Is64Bit = SrcSize == OpSize::i64Bit;\n    const auto NewControl = uint16_t(Control | (uint16_t(Is64Bit) << 8));\n\n    Ref SrcRAX = LoadGPRRegister(X86State::REG_RAX);\n    Ref SrcRDX = LoadGPRRegister(X86State::REG_RDX);\n\n    IntermediateResult = _VPCMPESTRX(Src1, Src2, SrcRAX, SrcRDX, NewControl);\n  } else {\n    IntermediateResult = _VPCMPISTRX(Src1, Src2, Control);\n  }\n\n  Ref ZeroConst = Constant(0);\n\n  if (IsMask) {\n    // For the masked variant of the instructions, if control[6] is set, then we\n    // need to expand the intermediate result into a byte or word mask (depending\n    // on data size specified in control[1]) along the entire length of XMM0,\n    // where set bits in the intermediate result set the corresponding entry\n    // in XMM0 to all 1s and unset bits set the corresponding entry to all 0s.\n    //\n    // If control[6] is not set, then we just store the intermediate result as-is\n    // into the least significant bits of XMM0 and zero extend it.\n    const auto IsExpandedMask = (Control & 0b0100'0000) != 0;\n\n    if (IsExpandedMask) {\n      // We need to iterate over the intermediate result and\n      // expand the mask into XMM0 elements.\n      const auto ElementSize = 1U << (Control & 1);\n      const auto NumElements = 16U >> (Control & 1);\n\n      Ref Result = LoadZeroVector(OpSize::i128Bit);\n      for (uint32_t i = 0; i < NumElements; i++) {\n        Ref SignBit = _Sbfe(OpSize::i64Bit, 1, i, IntermediateResult);\n        Result = _VInsGPR(OpSize::i128Bit, IR::SizeToOpSize(ElementSize), i, Result, SignBit);\n      }\n      StoreXMMRegister(0, Result);\n    } else {\n      // We insert the intermediate result as-is.\n      StoreXMMRegister(0, _VCastFromGPR(OpSize::i128Bit, OpSize::i16Bit, IntermediateResult));\n    }\n  } else {\n    // For the indexed variant of the instructions, if control[6] is set, then we\n    // store the index of the most significant bit into ECX. If it's not set,\n    // then we store the least significant bit.\n    const auto UseMSBIndex = (Control & 0b0100'0000) != 0;\n\n    Ref ResultNoFlags = _Bfe(OpSize::i32Bit, 16, 0, IntermediateResult);\n\n    Ref IfZero = Constant(16 >> (Control & 1));\n    Ref IfNotZero = UseMSBIndex ? _FindMSB(IR::OpSize::i32Bit, ResultNoFlags) : _FindLSB(IR::OpSize::i32Bit, ResultNoFlags);\n    Ref Result = _Select(OpSize::i64Bit, OpSize::i64Bit, CondClass::EQ, ResultNoFlags, ZeroConst, IfZero, IfNotZero);\n\n    // Store the result, it is already zero-extended to 64-bit implicitly.\n    StoreGPRRegister(X86State::REG_RCX, Result);\n  }\n\n  // Set all of the necessary flags. NZCV stored in bits 28...31 like the hw op.\n  SetNZCV(IntermediateResult);\n  CFInverted = false;\n  ZeroPF_AF();\n}\n\nvoid OpDispatchBuilder::VPCMPESTRIOp(OpcodeArgs) {\n  PCMPXSTRXOpImpl(Op, true, false);\n}\nvoid OpDispatchBuilder::VPCMPESTRMOp(OpcodeArgs) {\n  PCMPXSTRXOpImpl(Op, true, true);\n}\nvoid OpDispatchBuilder::VPCMPISTRIOp(OpcodeArgs) {\n  PCMPXSTRXOpImpl(Op, false, false);\n}\nvoid OpDispatchBuilder::VPCMPISTRMOp(OpcodeArgs) {\n  PCMPXSTRXOpImpl(Op, false, true);\n}\n\nvoid OpDispatchBuilder::VFMAImpl(OpcodeArgs, IROps IROp, bool Scalar, uint8_t Src1Idx, uint8_t Src2Idx, uint8_t AddendIdx) {\n  const auto Size = OpSizeFromDst(Op);\n  const auto Is256Bit = Size == OpSize::i256Bit;\n\n  const OpSize ElementSize = Op->Flags & X86Tables::DecodeFlags::FLAG_OPTION_AVX_W ? OpSize::i64Bit : OpSize::i32Bit;\n\n  Ref Dest = LoadSourceFPR_WithOpSize(Op, Op->Dest, Size, Op->Flags);\n  Ref Src1 = LoadSourceFPR_WithOpSize(Op, Op->Src[0], Size, Op->Flags);\n  Ref Src2 {};\n  if (Op->Src[1].IsGPR()) {\n    Src2 = LoadSourceFPR_WithOpSize(Op, Op->Src[1], Size, Op->Flags);\n  } else {\n    Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n  }\n\n  Ref Sources[3] = {\n    Dest,\n    Src1,\n    Src2,\n  };\n\n  DeriveOp(FMAResult, IROp, _VFMLA(Size, ElementSize, Sources[Src1Idx - 1], Sources[Src2Idx - 1], Sources[AddendIdx - 1]));\n  Ref Result = FMAResult;\n  if (Scalar) {\n    // Special case, scalar inserts in to the low bits of the destination.\n    Result = _VInsElement(OpSize::i128Bit, ElementSize, 0, 0, Dest, Result);\n  }\n\n  if (!Is256Bit) {\n    Result = _VMov(OpSize::i128Bit, Result);\n  }\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::VFMAddSubImpl(OpcodeArgs, bool AddSub, uint8_t Src1Idx, uint8_t Src2Idx, uint8_t AddendIdx) {\n  const auto Size = OpSizeFromDst(Op);\n  const auto Is256Bit = Size == OpSize::i256Bit;\n\n  const OpSize ElementSize = Op->Flags & X86Tables::DecodeFlags::FLAG_OPTION_AVX_W ? OpSize::i64Bit : OpSize::i32Bit;\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src1 = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  Ref Src2 = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  Ref Sources[3] = {\n    Dest,\n    Src1,\n    Src2,\n  };\n\n  Ref ConstantEOR {};\n  if (AddSub) {\n    ConstantEOR =\n      LoadAndCacheNamedVectorConstant(Size, ElementSize == OpSize::i32Bit ? NAMED_VECTOR_PADDSUBPS_INVERT : NAMED_VECTOR_PADDSUBPD_INVERT);\n  } else {\n    ConstantEOR =\n      LoadAndCacheNamedVectorConstant(Size, ElementSize == OpSize::i32Bit ? NAMED_VECTOR_PSUBADDPS_INVERT : NAMED_VECTOR_PSUBADDPD_INVERT);\n  }\n\n  auto InvertedSourc = _VXor(Size, ElementSize, Sources[AddendIdx - 1], ConstantEOR);\n\n  Ref Result = _VFMLA(Size, ElementSize, Sources[Src1Idx - 1], Sources[Src2Idx - 1], InvertedSourc);\n  if (!Is256Bit) {\n    Result = _VMov(OpSize::i128Bit, Result);\n  }\n  StoreResultFPR(Op, Result);\n}\n\nOpDispatchBuilder::RefVSIB OpDispatchBuilder::LoadVSIB(const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand, uint32_t Flags) {\n  const bool IsVSIB = (Op->Flags & X86Tables::DecodeFlags::FLAG_VSIB_BYTE) != 0;\n  LOGMAN_THROW_A_FMT((Operand.IsSIB() || Operand.IsSIBRelocation()) && IsVSIB, \"Trying to load VSIB for something that isn't the correct \"\n                                                                               \"type!\");\n\n  // VSIB is a very special case which has a ton of encoded data.\n  // Get it in a format we can reason about.\n\n  const auto Index_gpr = Operand.Data.SIB.Index;\n  const auto Base_gpr = Operand.Data.SIB.Base;\n  LOGMAN_THROW_A_FMT(Index_gpr >= FEXCore::X86State::REG_XMM_0 && Index_gpr <= FEXCore::X86State::REG_XMM_15, \"must be AVX reg\");\n  LOGMAN_THROW_A_FMT(Base_gpr == FEXCore::X86State::REG_INVALID || (Base_gpr >= FEXCore::X86State::REG_RAX && Base_gpr <= FEXCore::X86State::REG_R15),\n                     \"Base must be a GPR.\");\n  const auto Index_XMM_gpr = Index_gpr - X86State::REG_XMM_0;\n\n  OpDispatchBuilder::RefVSIB A {\n    .Low = LoadXMMRegister(Index_XMM_gpr),\n    .BaseAddr = Base_gpr != FEXCore::X86State::REG_INVALID ? LoadGPRRegister(Base_gpr, OpSize::i64Bit, 0, false) : nullptr,\n    .Scale = Operand.Data.SIB.Scale,\n  };\n\n  if (Operand.IsSIBRelocation()) {\n    auto EPOffset = _EntrypointOffset(OpSize::i64Bit, Operand.Data.SIB.Offset);\n    if (A.BaseAddr) {\n      A.BaseAddr = Add(OpSize::i64Bit, EPOffset, A.BaseAddr);\n    } else {\n      A.BaseAddr = EPOffset;\n    }\n  } else {\n    A.Displacement = static_cast<int32_t>(Operand.Data.SIB.Offset);\n  }\n\n  return A;\n}\n\ntemplate<OpSize AddrElementSize>\nvoid OpDispatchBuilder::VPGATHER(OpcodeArgs) {\n  LOGMAN_THROW_A_FMT(AddrElementSize == OpSize::i32Bit || AddrElementSize == OpSize::i64Bit, \"Unknown address element size\");\n\n  const auto Size = OpSizeFromDst(Op);\n  const auto Is128Bit = Size == OpSize::i128Bit;\n  const auto GPRSize = GetGPROpSize();\n  auto AddrSize = (Op->Flags & X86Tables::DecodeFlags::FLAG_ADDRESS_SIZE) != 0 ? (GPRSize >> 1) : GPRSize;\n\n  ///< Element size is determined by W flag.\n  const OpSize ElementLoadSize = Op->Flags & X86Tables::DecodeFlags::FLAG_OPTION_AVX_W ? OpSize::i64Bit : OpSize::i32Bit;\n\n  // We only need the high address register if the number of data elements is more than what the low half can consume.\n  // But also the number of address elements is clamped by the destination size as well.\n  const size_t NumDataElements = IR::NumElements(Size, ElementLoadSize);\n  const size_t NumAddrElementBytes = std::min<size_t>(IR::OpSizeToSize(Size), (NumDataElements * IR::OpSizeToSize(AddrElementSize)));\n  const bool Needs128BitHighAddrBytes = NumAddrElementBytes > IR::OpSizeToSize(OpSize::i128Bit);\n\n  auto VSIB = LoadVSIB(Op, Op->Src[0], Op->Flags);\n\n  const bool SupportsSVELoad = (VSIB.Scale == 1 || VSIB.Scale == IR::OpSizeToSize(AddrElementSize)) && (AddrElementSize == ElementLoadSize);\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Mask = LoadSourceFPR(Op, Op->Src[1], Op->Flags);\n\n  Ref Result {};\n  if (!SupportsSVELoad) {\n    // We need to go down the fallback path in the case that we don't hit the backend's SVE mode.\n    RefPair Dest128 {\n      .Low = Dest,\n      .High = _VDupElement(OpSize::i256Bit, OpSize::i128Bit, Dest, 1),\n    };\n\n    RefPair Mask128 {\n      .Low = Mask,\n      .High = _VDupElement(OpSize::i256Bit, OpSize::i128Bit, Mask, 1),\n    };\n\n    RefVSIB VSIB128 = VSIB;\n    VSIB128.High = Invalid();\n\n    if (Needs128BitHighAddrBytes) {\n      if (Is128Bit) {\n        ///< A bit careful for the VSIB index register duplicating.\n        VSIB128.High = VSIB128.Low;\n      } else {\n        VSIB128.High = _VDupElement(OpSize::i256Bit, OpSize::i128Bit, VSIB128.Low, 1);\n      }\n    }\n\n    auto Result128 = AVX128_VPGatherImpl(Op, Size, ElementLoadSize, AddrElementSize, Dest128, Mask128, VSIB128);\n    // The registers are current split, need to merge them.\n    Result = _VInsElement(OpSize::i256Bit, OpSize::i128Bit, 1, 0, Result128.Low, Result128.High);\n  } else {\n    ///< Calculate the full operation.\n    ///< BaseAddr doesn't need to exist, calculate that here.\n    Ref BaseAddr = VSIB.BaseAddr;\n    if (BaseAddr && VSIB.Displacement) {\n      BaseAddr = Add(OpSize::i64Bit, BaseAddr, VSIB.Displacement);\n    } else if (VSIB.Displacement) {\n      BaseAddr = Constant(VSIB.Displacement);\n    } else if (!BaseAddr) {\n      BaseAddr = Invalid();\n    }\n\n    Result =\n      _VLoadVectorGatherMasked(Size, ElementLoadSize, Dest, Mask, BaseAddr, VSIB.Low, Invalid(), AddrElementSize, VSIB.Scale, 0, 0, AddrSize);\n  }\n\n  if (Is128Bit) {\n    if (AddrElementSize == OpSize::i64Bit && ElementLoadSize == OpSize::i32Bit) {\n      // Special case for the 128-bit gather load using 64-bit address indexes with 32-bit results.\n      // Only loads two 32-bit elements in to the lower 64-bits of the first destination.\n      // Bits [255:65] all become zero.\n      Result = _VMov(OpSize::i64Bit, Result);\n    } else {\n      Result = _VMov(OpSize::i128Bit, Result);\n    }\n  } else {\n    if (AddrElementSize == OpSize::i64Bit && ElementLoadSize == OpSize::i32Bit) {\n      // If we only fetched 128-bits worth of data then the upper-result is all zero.\n      Result = _VMov(OpSize::i128Bit, Result);\n    }\n  }\n\n  StoreResultFPR(Op, Result);\n\n  ///< Assume non-faulting behaviour and clear the mask register.\n  auto Zero = LoadZeroVector(Size);\n  StoreResultFPR_WithOpSize(Op, Op->Src[1], Zero, Size);\n}\n\ntemplate void OpDispatchBuilder::VPGATHER<OpSize::i32Bit>(OpcodeArgs);\ntemplate void OpDispatchBuilder::VPGATHER<OpSize::i64Bit>(OpcodeArgs);\n\nvoid OpDispatchBuilder::Extrq_imm(OpcodeArgs) {\n  const uint8_t MaskWidth = Op->Src[1].Literal() & 0x3F;\n  const uint8_t Shift = (Op->Src[1].Literal() >> 8) & 0x3F;\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Result = Dest;\n  if (Shift > 0) {\n    Result = _VUShrI(OpSize::i64Bit, OpSize::i64Bit, Dest, Shift);\n  }\n\n  const uint64_t Mask = ~0ULL >> (MaskWidth == 0 ? 0 : (64 - MaskWidth));\n  const Ref MaskVector = _VCastFromGPR(OpSize::i128Bit, OpSize::i64Bit, _Constant(Mask));\n  Result = _VAnd(OpSize::i128Bit, OpSize::i64Bit, Result, MaskVector);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::Insertq_imm(OpcodeArgs) {\n  const uint8_t MaskWidth = Op->Src[1].Literal() & 0x3F;\n  const uint8_t Shift = (Op->Src[1].Literal() >> 8) & 0x3F;\n\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  const uint64_t Mask = ~0ULL >> (MaskWidth == 0 ? 0 : (64 - MaskWidth));\n  Ref MaskVector = _VCastFromGPR(OpSize::i128Bit, OpSize::i64Bit, _Constant(Mask));\n\n  // Mask incoming source.\n  Src = _VAnd(OpSize::i64Bit, OpSize::i64Bit, Src, MaskVector);\n\n  // If shifting then shift source and mask in to the correct location.\n  if (Shift) {\n    Src = _VShlI(OpSize::i64Bit, OpSize::i64Bit, Src, Shift);\n    MaskVector = _VShlI(OpSize::i128Bit, OpSize::i64Bit, MaskVector, Shift);\n  }\n\n  // Negate the mask.\n  MaskVector = _VNot(OpSize::i64Bit, OpSize::i64Bit, MaskVector);\n\n  Dest = _VAnd(OpSize::i64Bit, OpSize::i64Bit, Dest, MaskVector);\n  const Ref Result = _VOr(OpSize::i64Bit, OpSize::i64Bit, Dest, Src);\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::Extrq(OpcodeArgs) {\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  const Ref ElementMask = _VectorImm(OpSize::i64Bit, OpSize::i64Bit, 0x3F);\n\n  auto GenerateMask = [this](Ref VectorWidthInBits) -> Ref {\n    const Ref VectorWidth = _VExtractToGPR(OpSize::i64Bit, OpSize::i64Bit, VectorWidthInBits, 0);\n    return _VCastFromGPR(OpSize::i128Bit, OpSize::i64Bit, _MaskGenerateFromBitWidth(VectorWidth));\n  };\n\n  // Bits[5:0] = Mask width in bits\n  const Ref MaskWidthBits = _VAnd(OpSize::i64Bit, OpSize::i64Bit, Src, ElementMask);\n\n  // Bits[13:8] = Shift right in bits\n  const Ref ShiftBits = _VAnd(OpSize::i64Bit, OpSize::i64Bit, _VUShrI(OpSize::i64Bit, OpSize::i64Bit, Src, 8), ElementMask);\n\n  // First shift in to the correct position.\n  Ref Result = _VUShr(OpSize::i64Bit, OpSize::i64Bit, Dest, ShiftBits, false);\n\n  Result = _VAnd(OpSize::i128Bit, OpSize::i64Bit, Result, GenerateMask(MaskWidthBits));\n\n  StoreResultFPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::Insertq(OpcodeArgs) {\n  Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);\n  Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n\n  auto SelectorBits = _VDupElement(OpSize::i128Bit, OpSize::i64Bit, Src, 1);\n\n  const Ref ElementMask = _VectorImm(OpSize::i64Bit, OpSize::i64Bit, 0x3F);\n\n  auto GenerateMask = [this](Ref VectorWidthInBits) -> Ref {\n    const Ref VectorWidth = _VExtractToGPR(OpSize::i64Bit, OpSize::i64Bit, VectorWidthInBits, 0);\n    return _VCastFromGPR(OpSize::i128Bit, OpSize::i64Bit, _MaskGenerateFromBitWidth(VectorWidth));\n  };\n\n  // Bits[5:0] = Mask width in bits\n  const Ref MaskWidthBits = _VAnd(OpSize::i64Bit, OpSize::i64Bit, SelectorBits, ElementMask);\n\n  // Bits[13:8] = Shift right in bits\n  const Ref ShiftBits = _VAnd(OpSize::i64Bit, OpSize::i64Bit, _VUShrI(OpSize::i64Bit, OpSize::i64Bit, SelectorBits, 8), ElementMask);\n\n  // Extract the source data and put in to the correct location\n  const Ref SrcMask = GenerateMask(MaskWidthBits);\n  Ref SrcData = _VAnd(OpSize::i128Bit, OpSize::i64Bit, Src, SrcMask);\n  SrcData = _VUShl(OpSize::i128Bit, OpSize::i64Bit, SrcData, ShiftBits, false);\n\n  // Generate a destination mask\n  const Ref DstMask = _VNot(OpSize::i64Bit, OpSize::i64Bit, _VUShl(OpSize::i128Bit, OpSize::i64Bit, SrcMask, ShiftBits, false));\n\n  Ref Result = _VAnd(OpSize::i64Bit, OpSize::i64Bit, Dest, DstMask);\n  Result = _VOr(OpSize::i64Bit, OpSize::i64Bit, Result, SrcData);\n  StoreResultFPR(Op, Result);\n}\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher/X87.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-to-ir, opcodes|dispatcher-implementations\ndesc: Handles x86/64 x87 to IR\n$end_info$\n*/\n\n#include \"Interface/Core/OpcodeDispatcher.h\"\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/IR/IR.h\"\n#include \"Interface/Core/Addressing.h\"\n\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Utils/EnumUtils.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/FPState.h>\n\n#include <stddef.h>\n#include <stdint.h>\n\nnamespace FEXCore::IR {\nclass OrderedNode;\n#define OpcodeArgs [[maybe_unused]] FEXCore::X86Tables::DecodedOp Op\n\nRef OpDispatchBuilder::GetX87Top() {\n  // Yes, we are storing 3 bits in a single flag register.\n  // Deal with it\n  return _LoadContextGPR(OpSize::i8Bit, offsetof(FEXCore::Core::CPUState, flags) + FEXCore::X86State::X87FLAG_TOP_LOC);\n}\n\nvoid OpDispatchBuilder::SetX87FTW(Ref FTW) {\n  _StackForceSlow(); // Invalidate x87 FTW register cache\n\n  // For the output, we want a 1-bit for each pair not equal to 11 (Empty).\n  static_assert(static_cast<uint8_t>(FPState::X87Tag::Empty) == 0b11);\n\n  // Make even bits 1 if the pair is equal to 11, and 0 otherwise.\n  FTW = _AndShift(OpSize::i32Bit, FTW, FTW, ShiftType::LSR, 1);\n\n  // Invert FTW and clear the odd bits. Even bits are 1 if the pair\n  // is not equal to 11, and odd bits are 0.\n  FTW = _Andn(OpSize::i32Bit, Constant(0x55555555), FTW);\n\n  // All that's left is to compact away the odd bits. That is a Morton\n  // deinterleave operation, which has a standard solution. See\n  // https://stackoverflow.com/questions/3137266/how-to-de-interleave-bits-unmortonizing\n  FTW = _And(OpSize::i32Bit, _Orlshr(OpSize::i32Bit, FTW, FTW, 1), Constant(0x33333333));\n  FTW = _And(OpSize::i32Bit, _Orlshr(OpSize::i32Bit, FTW, FTW, 2), Constant(0x0f0f0f0f));\n  FTW = _Orlshr(OpSize::i32Bit, FTW, FTW, 4);\n\n  // ...and that's it. StoreContext implicitly does the final masking.\n  _StoreContextGPR(OpSize::i8Bit, FTW, offsetof(FEXCore::Core::CPUState, AbridgedFTW));\n}\n\nvoid OpDispatchBuilder::SetX87Top(Ref Value) {\n  _StoreContextGPR(OpSize::i8Bit, Value, offsetof(FEXCore::Core::CPUState, flags) + FEXCore::X86State::X87FLAG_TOP_LOC);\n}\n\n// Float LoaD operation with memory operand\nvoid OpDispatchBuilder::FLD(OpcodeArgs, IR::OpSize Width) {\n  Ref Data = LoadSourceFPR_WithOpSize(Op, Op->Src[0], Width, Op->Flags);\n  Ref ConvertedData = Data;\n  // Convert to 80bit float\n  if (Width == OpSize::i32Bit || Width == OpSize::i64Bit) {\n    ConvertedData = _F80CVTTo(Data, Width);\n  }\n  _PushStack(ConvertedData, Data, Width);\n}\n\n// Float LoaD operation with memory operand\nvoid OpDispatchBuilder::FLDFromStack(OpcodeArgs) {\n  _CopyPushStack(Op->OP & 7);\n}\n\nvoid OpDispatchBuilder::FBLD(OpcodeArgs) {\n  // Read from memory\n  Ref Data = LoadSourceFPR_WithOpSize(Op, Op->Src[0], OpSize::f80Bit, Op->Flags);\n  Ref ConvertedData = _F80BCDLoad(Data);\n  _PushStack(ConvertedData, Invalid(), OpSize::iInvalid);\n}\n\nvoid OpDispatchBuilder::FBSTP(OpcodeArgs) {\n  Ref converted = _F80BCDStore(_ReadStackValue(0));\n  StoreResultFPR_WithOpSize(Op, Op->Dest, converted, OpSize::f80Bit, OpSize::i8Bit);\n  _PopStackDestroy();\n}\n\nvoid OpDispatchBuilder::FLD_Const(OpcodeArgs, NamedVectorConstant K) {\n  // Update TOP\n  Ref Data = LoadAndCacheNamedVectorConstant(OpSize::i128Bit, K);\n  _PushStack(Data, Data, OpSize::f80Bit);\n}\n\nvoid OpDispatchBuilder::FILD(OpcodeArgs) {\n  const auto ReadWidth = OpSizeFromSrc(Op);\n  // Read from memory\n  Ref Data = LoadSourceGPR_WithOpSize(Op, Op->Src[0], ReadWidth, Op->Flags);\n\n  // Sign extend to 64bits\n  if (ReadWidth != OpSize::i64Bit) {\n    Data = _Sbfe(OpSize::i64Bit, IR::OpSizeAsBits(ReadWidth), 0, Data);\n  }\n\n  // We're about to clobber flags to grab the sign, so save NZCV.\n  SaveNZCV();\n\n  // Extract sign and make integer absolute\n  auto zero = Constant(0);\n  _SubNZCV(OpSize::i64Bit, Data, zero);\n  auto sign = _NZCVSelect(OpSize::i64Bit, CondClass::SLT, Constant(0x8000), zero);\n  auto absolute = _Neg(OpSize::i64Bit, Data, CondClass::MI);\n\n  // left justify the absolute integer\n  auto shift = Sub(OpSize::i64Bit, Constant(63), _FindMSB(IR::OpSize::i64Bit, absolute));\n  auto shifted = _Lshl(OpSize::i64Bit, absolute, shift);\n\n  auto adjusted_exponent = Sub(OpSize::i64Bit, Constant(0x3fff + 63), shift);\n  auto zeroed_exponent = _Select(OpSize::i64Bit, OpSize::i64Bit, CondClass::EQ, absolute, zero, zero, adjusted_exponent);\n  auto upper = _Or(OpSize::i64Bit, sign, zeroed_exponent);\n\n  Ref ConvertedData = _VLoadTwoGPRs(shifted, upper);\n  _PushStack(ConvertedData, Invalid(), OpSize::iInvalid);\n}\n\nvoid OpDispatchBuilder::FST(OpcodeArgs, IR::OpSize Width) {\n  LOGMAN_THROW_A_FMT(Width == OpSize::i32Bit || Width == OpSize::i64Bit || Width == OpSize::f80Bit, \"Invalid store width for FST\");\n  const auto SourceSize = ReducedPrecisionMode ? OpSize::i64Bit : OpSize::f80Bit;\n  AddressMode A = DecodeAddress(Op, Op->Dest, MemoryAccessType::DEFAULT, false);\n\n  A = SelectAddressMode(this, A, GetGPROpSize(), CTX->HostFeatures.SupportsTSOImm9, false, false, Width);\n  _StoreStackMem(SourceSize, Width, A.Base, A.Index, OpSize::iInvalid, A.IndexType, A.IndexScale);\n\n  if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n    _PopStackDestroy();\n  }\n}\n\nvoid OpDispatchBuilder::FSTToStack(OpcodeArgs) {\n  const uint8_t Offset = Op->OP & 7;\n  if (Offset != 0) {\n    _StoreStackToStack(Offset);\n  }\n\n  if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n    _PopStackDestroy();\n  }\n}\n\n// Store integer to memory (possibly with truncation)\nvoid OpDispatchBuilder::FIST(OpcodeArgs, bool Truncate) {\n  const auto Size = OpSizeFromSrc(Op);\n  Ref Data = _ReadStackValue(0);\n\n  // For 16-bit integers, we need to manually check for overflow\n  // since _F80CVTInt doesn't handle 16-bit overflow detection properly\n  if (Size == OpSize::i16Bit) {\n    // Extract the 80-bit float value to check for special cases\n    // Get the upper 64 bits which contain sign and exponent and then the exponent from upper.\n    Ref Upper = _VExtractToGPR(OpSize::i128Bit, OpSize::i64Bit, Data, 1);\n    Ref Exponent = _And(OpSize::i64Bit, Upper, Constant(0x7fff));\n\n    // Check for NaN/Infinity: exponent = 0x7fff\n    SaveNZCV();\n    _TestNZ(OpSize::i64Bit, Exponent, Constant(0x7fff));\n    Ref IsSpecial = _NZCVSelect01(CondClass::EQ);\n\n    // For overflow detection, check if exponent indicates a value >= 2^15\n    // Biased exponent for 2^15 is 0x3fff + 15 = 0x400e\n    SubWithFlags(OpSize::i64Bit, Exponent, 0x400e);\n    Ref IsOverflow = _NZCVSelect01(CondClass::UGE);\n\n    // Set Invalid Operation flag if overflow or special value\n    Ref InvalidFlag = _Or(OpSize::i64Bit, IsSpecial, IsOverflow);\n    SetRFLAG<FEXCore::X86State::X87FLAG_IE_LOC>(InvalidFlag);\n  }\n\n  Data = _F80CVTInt(Size, Data, Truncate);\n\n  StoreResultGPR_WithOpSize(Op, Op->Dest, Data, Size, OpSize::i8Bit);\n\n  if ((Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) != 0) {\n    _PopStackDestroy();\n  }\n}\n\nvoid OpDispatchBuilder::FADD(OpcodeArgs, IR::OpSize Width, bool Integer, OpDispatchBuilder::OpResult ResInST0) {\n  if (Op->Src[0].IsNone()) { // Implicit argument case\n    auto Offset = Op->OP & 7;\n    auto St0 = 0;\n    if (ResInST0 == OpResult::RES_STI) {\n      _F80AddStack(Offset, St0);\n    } else {\n      _F80AddStack(St0, Offset);\n    }\n    if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n      _PopStackDestroy();\n    }\n    return;\n  }\n\n  LOGMAN_THROW_A_FMT(Width != OpSize::f80Bit, \"No 80-bit floats from memory\");\n  // We have one memory argument\n  Ref Arg {};\n  if (Integer) {\n    Arg = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n    Arg = _F80CVTToInt(Arg, Width);\n  } else {\n    Arg = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    Arg = _F80CVTTo(Arg, Width);\n  }\n\n  // top of stack is at offset zero\n  _F80AddValue(0, Arg);\n}\n\nvoid OpDispatchBuilder::FMUL(OpcodeArgs, IR::OpSize Width, bool Integer, OpDispatchBuilder::OpResult ResInST0) {\n  if (Op->Src[0].IsNone()) { // Implicit argument case\n    auto offset = Op->OP & 7;\n    auto st0 = 0;\n    if (ResInST0 == OpResult::RES_STI) {\n      _F80MulStack(offset, st0);\n    } else {\n      _F80MulStack(st0, offset);\n    }\n    if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n      _PopStackDestroy();\n    }\n    return;\n  }\n\n  LOGMAN_THROW_A_FMT(Width != OpSize::f80Bit, \"No 80-bit floats from memory\");\n  // We have one memory argument\n  Ref arg {};\n  if (Integer) {\n    arg = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n    arg = _F80CVTToInt(arg, Width);\n  } else {\n    arg = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    arg = _F80CVTTo(arg, Width);\n  }\n\n  // top of stack is at offset zero\n  _F80MulValue(0, arg);\n\n  if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n    _PopStackDestroy();\n  }\n}\n\nvoid OpDispatchBuilder::FDIV(OpcodeArgs, IR::OpSize Width, bool Integer, bool Reverse, OpDispatchBuilder::OpResult ResInST0) {\n  if (Op->Src[0].IsNone()) {\n    const uint8_t Offset = Op->OP & 7;\n    const uint8_t St0 = 0;\n    const uint8_t Result = (ResInST0 == OpResult::RES_STI) ? Offset : St0;\n\n    if (Reverse ^ (ResInST0 == OpResult::RES_STI)) {\n      _F80DivStack(Result, Offset, St0);\n    } else {\n      _F80DivStack(Result, St0, Offset);\n    }\n\n    if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n      _PopStackDestroy();\n    }\n    return;\n  }\n\n  LOGMAN_THROW_A_FMT(Width != OpSize::f80Bit, \"No 80-bit floats from memory\");\n  // We have one memory argument\n  Ref arg {};\n  if (Integer) {\n    arg = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n    arg = _F80CVTToInt(arg, Width);\n  } else {\n    arg = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    arg = _F80CVTTo(arg, Width);\n  }\n\n  // top of stack is at offset zero\n  if (Reverse) {\n    _F80DivRValue(arg, 0);\n  } else {\n    _F80DivValue(0, arg);\n  }\n\n  if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n    _PopStackDestroy();\n  }\n}\n\nvoid OpDispatchBuilder::FSUB(OpcodeArgs, IR::OpSize Width, bool Integer, bool Reverse, OpDispatchBuilder::OpResult ResInST0) {\n  if (Op->Src[0].IsNone()) {\n    const auto Offset = Op->OP & 7;\n    const auto St0 = 0;\n    const auto Result = (ResInST0 == OpResult::RES_STI) ? Offset : St0;\n\n    if (Reverse ^ (ResInST0 == OpResult::RES_STI)) {\n      _F80SubStack(Result, Offset, St0);\n    } else {\n      _F80SubStack(Result, St0, Offset);\n    }\n\n    if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n      _PopStackDestroy();\n    }\n    return;\n  }\n\n  LOGMAN_THROW_A_FMT(Width != OpSize::f80Bit, \"No 80-bit floats from memory\");\n  // We have one memory argument\n  Ref Arg {};\n  if (Integer) {\n    Arg = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n    Arg = _F80CVTToInt(Arg, Width);\n  } else {\n    Arg = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    Arg = _F80CVTTo(Arg, Width);\n  }\n\n  // top of stack is at offset zero\n  if (Reverse) {\n    _F80SubRValue(Arg, 0);\n  } else {\n    _F80SubValue(0, Arg);\n  }\n\n  if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n    _PopStackDestroy();\n  }\n}\n\nRef OpDispatchBuilder::GetX87FTW_Helper() {\n  // AbridgedFTWIndex has 1-bit per slot (8 slots). Duplicate each bit to get\n  // 2-bits per slot (16-bit result). Duplicating bits is equivalent to\n  // Morton interleaving a number with itself. To interleave efficiently two\n  // bytes, we use the well-known bit twiddling algorithm:\n  //\n  // https://graphics.stanford.edu/~seander/bithacks.html#InterleaveBMN\n  Ref X = _LoadContextGPR(OpSize::i8Bit, offsetof(FEXCore::Core::CPUState, AbridgedFTW));\n  X = _Orlshl(OpSize::i32Bit, X, X, 4);\n  X = _And(OpSize::i32Bit, X, Constant(0x0f0f0f0f));\n  X = _Orlshl(OpSize::i32Bit, X, X, 2);\n  X = _And(OpSize::i32Bit, X, Constant(0x33333333));\n  X = _Orlshl(OpSize::i32Bit, X, X, 1);\n  X = _And(OpSize::i32Bit, X, Constant(0x55555555));\n  X = _Orlshl(OpSize::i32Bit, X, X, 1);\n\n  // The above sequence sets valid to 11 and empty to 00, so invert to finalize.\n  static_assert(static_cast<uint8_t>(FPState::X87Tag::Valid) == 0b00);\n  static_assert(static_cast<uint8_t>(FPState::X87Tag::Empty) == 0b11);\n  return _Xor(OpSize::i32Bit, X, Constant(0xffff));\n}\n\nvoid OpDispatchBuilder::X87FNSTENV(OpcodeArgs) {\n\n\n  // 14 bytes for 16bit\n  // 2 Bytes : FCW\n  // 2 Bytes : FSW\n  // 2 bytes : FTW\n  // 2 bytes : Instruction offset\n  // 2 bytes : Instruction CS selector\n  // 2 bytes : Data offset\n  // 2 bytes : Data selector\n\n  // 28 bytes for 32bit\n  // 4 bytes : FCW\n  // 4 bytes : FSW\n  // 4 bytes : FTW\n  // 4 bytes : Instruction pointer\n  // 2 bytes : Instruction pointer selector\n  // 2 bytes : Opcode\n  // 4 bytes : data pointer offset\n  // 4 bytes : data pointer selector\n\n  // Before we store anything we need to sync our stack to the registers.\n  _SyncStackToSlow();\n\n  const auto Size = OpSizeFromSrc(Op);\n  Ref Mem = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.LoadData = false});\n  Mem = AppendSegmentOffset(Mem, Op->Flags);\n\n  {\n    auto FCW = _LoadContextGPR(OpSize::i16Bit, offsetof(FEXCore::Core::CPUState, FCW));\n    _StoreMemGPR(Size, Mem, FCW, Size);\n  }\n\n  { _StoreMemGPR(Size, ReconstructFSW_Helper(), Mem, Constant(IR::OpSizeToSize(Size) * 1), Size, MemOffsetType::SXTX, 1); }\n\n  auto ZeroConst = Constant(0);\n\n  {\n    // FTW\n    _StoreMemGPR(Size, GetX87FTW_Helper(), Mem, Constant(IR::OpSizeToSize(Size) * 2), Size, MemOffsetType::SXTX, 1);\n  }\n\n  {\n    // Instruction Offset\n    _StoreMemGPR(Size, ZeroConst, Mem, Constant(IR::OpSizeToSize(Size) * 3), Size, MemOffsetType::SXTX, 1);\n  }\n\n  {\n    // Instruction CS selector (+ Opcode)\n    _StoreMemGPR(Size, ZeroConst, Mem, Constant(IR::OpSizeToSize(Size) * 4), Size, MemOffsetType::SXTX, 1);\n  }\n\n  {\n    // Data pointer offset\n    _StoreMemGPR(Size, ZeroConst, Mem, Constant(IR::OpSizeToSize(Size) * 5), Size, MemOffsetType::SXTX, 1);\n  }\n\n  {\n    // Data pointer selector\n    _StoreMemGPR(Size, ZeroConst, Mem, Constant(IR::OpSizeToSize(Size) * 6), Size, MemOffsetType::SXTX, 1);\n  }\n}\n\nRef OpDispatchBuilder::ReconstructX87StateFromFSW_Helper(Ref FSW) {\n  auto Top = _Bfe(OpSize::i32Bit, 3, 11, FSW);\n  SetX87Top(Top);\n\n  auto C0 = _Bfe(OpSize::i32Bit, 1, 8, FSW);\n  auto C1 = _Bfe(OpSize::i32Bit, 1, 9, FSW);\n  auto C2 = _Bfe(OpSize::i32Bit, 1, 10, FSW);\n  auto C3 = _Bfe(OpSize::i32Bit, 1, 14, FSW);\n  auto IE = _Bfe(OpSize::i32Bit, 1, 0, FSW);\n\n  SetRFLAG<FEXCore::X86State::X87FLAG_C0_LOC>(C0);\n  SetRFLAG<FEXCore::X86State::X87FLAG_C1_LOC>(C1);\n  SetRFLAG<FEXCore::X86State::X87FLAG_C2_LOC>(C2);\n  SetRFLAG<FEXCore::X86State::X87FLAG_C3_LOC>(C3);\n  SetRFLAG<FEXCore::X86State::X87FLAG_IE_LOC>(IE);\n  return Top;\n}\n\nvoid OpDispatchBuilder::X87LDENV(OpcodeArgs) {\n  _StackForceSlow();\n\n  const auto Size = OpSizeFromSrc(Op);\n  Ref Mem = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.LoadData = false});\n  Mem = AppendSegmentOffset(Mem, Op->Flags);\n\n  auto NewFCW = _LoadMemGPR(OpSize::i16Bit, Mem, OpSize::i16Bit);\n  _StoreContextGPR(OpSize::i16Bit, NewFCW, offsetof(FEXCore::Core::CPUState, FCW));\n\n  Ref MemLocation = Add(OpSize::i64Bit, Mem, IR::OpSizeToSize(Size) * 1);\n  auto NewFSW = _LoadMemGPR(Size, MemLocation, Size);\n  ReconstructX87StateFromFSW_Helper(NewFSW);\n\n  {\n    // FTW\n    Ref MemLocation = Add(OpSize::i64Bit, Mem, IR::OpSizeToSize(Size) * 2);\n    SetX87FTW(_LoadMemGPR(Size, MemLocation, Size));\n  }\n}\n\nvoid OpDispatchBuilder::X87FNSAVE(OpcodeArgs) {\n  _SyncStackToSlow();\n\n  // 14 bytes for 16bit\n  // 2 Bytes : FCW\n  // 2 Bytes : FSW\n  // 2 bytes : FTW\n  // 2 bytes : Instruction offset\n  // 2 bytes : Instruction CS selector\n  // 2 bytes : Data offset\n  // 2 bytes : Data selector\n\n  // 28 bytes for 32bit\n  // 4 bytes : FCW\n  // 4 bytes : FSW\n  // 4 bytes : FTW\n  // 4 bytes : Instruction pointer\n  // 2 bytes : instruction pointer selector\n  // 2 bytes : Opcode\n  // 4 bytes : data pointer offset\n  // 4 bytes : data pointer selector\n  const auto Size = OpSizeFromDst(Op);\n  Ref Mem = MakeSegmentAddress(Op, Op->Dest);\n  Ref Top = GetX87Top();\n  {\n    auto FCW = _LoadContextGPR(OpSize::i16Bit, offsetof(FEXCore::Core::CPUState, FCW));\n    _StoreMemGPR(Size, Mem, FCW, Size);\n  }\n\n  { _StoreMemGPR(Size, ReconstructFSW_Helper(), Mem, Constant(IR::OpSizeToSize(Size) * 1), Size, MemOffsetType::SXTX, 1); }\n\n  auto ZeroConst = Constant(0);\n\n  {\n    // FTW\n    _StoreMemGPR(Size, GetX87FTW_Helper(), Mem, Constant(IR::OpSizeToSize(Size) * 2), Size, MemOffsetType::SXTX, 1);\n  }\n\n  {\n    // Instruction Offset\n    _StoreMemGPR(Size, ZeroConst, Mem, Constant(IR::OpSizeToSize(Size) * 3), Size, MemOffsetType::SXTX, 1);\n  }\n\n  {\n    // Instruction CS selector (+ Opcode)\n    _StoreMemGPR(Size, ZeroConst, Mem, Constant(IR::OpSizeToSize(Size) * 4), Size, MemOffsetType::SXTX, 1);\n  }\n\n  {\n    // Data pointer offset\n    _StoreMemGPR(Size, ZeroConst, Mem, Constant(IR::OpSizeToSize(Size) * 5), Size, MemOffsetType::SXTX, 1);\n  }\n\n  {\n    // Data pointer selector\n    _StoreMemGPR(Size, ZeroConst, Mem, Constant(IR::OpSizeToSize(Size) * 6), Size, MemOffsetType::SXTX, 1);\n  }\n\n  auto SevenConst = Constant(7);\n  const auto LoadSize = ReducedPrecisionMode ? OpSize::i64Bit : OpSize::i128Bit;\n  for (int i = 0; i < 7; ++i) {\n    Ref data = _LoadContextFPRIndexed(Top, LoadSize, MMBaseOffset(), IR::OpSizeToSize(OpSize::i128Bit));\n    if (ReducedPrecisionMode) {\n      data = _F80CVTTo(data, OpSize::i64Bit);\n    }\n    _StoreMemFPR(OpSize::i128Bit, data, Mem, Constant((IR::OpSizeToSize(Size) * 7) + (10 * i)), OpSize::i8Bit, MemOffsetType::SXTX, 1);\n    Top = _And(OpSize::i32Bit, Add(OpSize::i32Bit, Top, 1), SevenConst);\n  }\n\n  // The final st(7) needs a bit of special handling here\n  Ref data = _LoadContextFPRIndexed(Top, LoadSize, MMBaseOffset(), IR::OpSizeToSize(OpSize::i128Bit));\n  if (ReducedPrecisionMode) {\n    data = _F80CVTTo(data, OpSize::i64Bit);\n  }\n  // ST7 broken in to two parts\n  // Lower 64bits [63:0]\n  // upper 16 bits [79:64]\n  _StoreMemFPR(OpSize::i64Bit, data, Mem, Constant((IR::OpSizeToSize(Size) * 7) + (7 * 10)), OpSize::i8Bit, MemOffsetType::SXTX, 1);\n  auto topBytes = _VDupElement(OpSize::i128Bit, OpSize::i16Bit, data, 4);\n  _StoreMemFPR(OpSize::i16Bit, topBytes, Mem, Constant((IR::OpSizeToSize(Size) * 7) + (7 * 10) + 8), OpSize::i8Bit, MemOffsetType::SXTX, 1);\n\n  // reset to default\n  FNINIT(Op);\n}\n\nvoid OpDispatchBuilder::X87FRSTOR(OpcodeArgs) {\n  _StackForceSlow();\n  const auto Size = OpSizeFromSrc(Op);\n  Ref Mem = MakeSegmentAddress(Op, Op->Src[0]);\n\n  auto NewFCW = _LoadMemGPR(OpSize::i16Bit, Mem, OpSize::i16Bit);\n  _StoreContextGPR(OpSize::i16Bit, NewFCW, offsetof(FEXCore::Core::CPUState, FCW));\n  if (ReducedPrecisionMode) {\n    // ignore the rounding precision, we're always 64-bit in F64.\n    // extract rounding mode\n    Ref roundingMode = NewFCW;\n    auto roundShift = Constant(10);\n    auto roundMask = Constant(3);\n    roundingMode = _Lshr(OpSize::i32Bit, roundingMode, roundShift);\n    roundingMode = _And(OpSize::i32Bit, roundingMode, roundMask);\n    _SetRoundingMode(roundingMode, false, roundingMode);\n  }\n\n  auto NewFSW = _LoadMemGPR(Size, Mem, Constant(IR::OpSizeToSize(Size) * 1), Size, MemOffsetType::SXTX, 1);\n  Ref Top = ReconstructX87StateFromFSW_Helper(NewFSW);\n  {\n    // FTW\n    SetX87FTW(_LoadMemGPR(Size, Mem, Constant(IR::OpSizeToSize(Size) * 2), Size, MemOffsetType::SXTX, 1));\n  }\n\n  auto SevenConst = Constant(7);\n  auto low = Constant(~0ULL);\n  auto high = Constant(0xFFFF);\n  Ref Mask = _VLoadTwoGPRs(low, high);\n  const auto StoreSize = ReducedPrecisionMode ? OpSize::i64Bit : OpSize::i128Bit;\n  for (int i = 0; i < 7; ++i) {\n    Ref Reg = _LoadMemFPR(OpSize::i128Bit, Mem, Constant((IR::OpSizeToSize(Size) * 7) + (10 * i)), OpSize::i8Bit, MemOffsetType::SXTX, 1);\n    // Mask off the top bits\n    Reg = _VAnd(OpSize::i128Bit, OpSize::i128Bit, Reg, Mask);\n    if (ReducedPrecisionMode) {\n      // Convert to double precision\n      Reg = _F80CVT(OpSize::i64Bit, Reg);\n    }\n    _StoreContextFPRIndexed(Reg, Top, StoreSize, MMBaseOffset(), IR::OpSizeToSize(OpSize::i128Bit));\n\n    Top = _And(OpSize::i32Bit, Add(OpSize::i32Bit, Top, 1), SevenConst);\n  }\n\n  // The final st(7) needs a bit of special handling here\n  // ST7 broken in to two parts\n  // Lower 64bits [63:0]\n  // upper 16 bits [79:64]\n  Ref Reg = _LoadMemFPR(OpSize::i64Bit, Mem, Constant((IR::OpSizeToSize(Size) * 7) + (10 * 7)), OpSize::i8Bit, MemOffsetType::SXTX, 1);\n  Ref RegHigh = _LoadMemFPR(OpSize::i16Bit, Mem, Constant((IR::OpSizeToSize(Size) * 7) + (10 * 7) + 8), OpSize::i8Bit, MemOffsetType::SXTX, 1);\n  Reg = _VInsElement(OpSize::i128Bit, OpSize::i16Bit, 4, 0, Reg, RegHigh);\n  if (ReducedPrecisionMode) {\n    Reg = _F80CVT(OpSize::i64Bit, Reg); // Convert to double precision\n  }\n  _StoreContextFPRIndexed(Reg, Top, StoreSize, MMBaseOffset(), IR::OpSizeToSize(OpSize::i128Bit));\n}\n\n// Load / Store Control Word\nvoid OpDispatchBuilder::X87FSTCW(OpcodeArgs) {\n  auto FCW = _LoadContextGPR(OpSize::i16Bit, offsetof(FEXCore::Core::CPUState, FCW));\n  StoreResultGPR(Op, FCW);\n}\n\nvoid OpDispatchBuilder::X87FLDCW(OpcodeArgs) {\n  // FIXME: Because loading control flags will affect several instructions in fast path, we might have\n  // to switch for now to slow mode whenever these are manually changed.\n  // Remove the next line and try DF_04.asm in fast path.\n  _StackForceSlow();\n  Ref NewFCW = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n  _StoreContextGPR(OpSize::i16Bit, NewFCW, offsetof(FEXCore::Core::CPUState, FCW));\n}\n\nvoid OpDispatchBuilder::FXCH(OpcodeArgs) {\n  uint8_t Offset = Op->OP & 7;\n  // fxch st0, st0 is for us essentially a nop\n  if (Offset != 0) {\n    _F80StackXchange(Offset);\n  }\n  SetRFLAG<FEXCore::X86State::X87FLAG_C1_LOC>(Constant(0));\n}\n\nvoid OpDispatchBuilder::X87FYL2X(OpcodeArgs, bool IsFYL2XP1) {\n  if (IsFYL2XP1) {\n    // create an add between top of stack and 1.\n    Ref One = ReducedPrecisionMode ? _VCastFromGPR(OpSize::i64Bit, OpSize::i64Bit, Constant(0x3FF0000000000000)) :\n                                     LoadAndCacheNamedVectorConstant(OpSize::i128Bit, NamedVectorConstant::NAMED_VECTOR_X87_ONE);\n    _F80AddValue(0, One);\n  }\n\n  _F80FYL2XStack();\n}\n\nvoid OpDispatchBuilder::FCOMI(OpcodeArgs, IR::OpSize Width, bool Integer, OpDispatchBuilder::FCOMIFlags WhichFlags, bool PopTwice) {\n  Ref arg {};\n  Ref b {};\n\n  Ref Res {};\n  if (Op->Src[0].IsNone()) {\n    // Implicit arg\n    uint8_t Offset = Op->OP & 7;\n    Res = _F80CmpStack(Offset);\n  } else {\n    if (Width == OpSize::i16Bit || Width == OpSize::i32Bit || Width == OpSize::i64Bit) {\n      // Memory arg\n      if (Integer) {\n        arg = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n        b = _F80CVTToInt(arg, Width);\n      } else {\n        arg = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n        b = _F80CVTTo(arg, Width);\n      }\n    } else {\n      FEX_UNREACHABLE;\n    }\n    Res = _F80CmpValue(b);\n  }\n\n  Ref HostFlag_CF = _Bfe(OpSize::i64Bit, 1, FCMP_FLAG_LT, Res);\n  Ref HostFlag_ZF = _Bfe(OpSize::i64Bit, 1, FCMP_FLAG_EQ, Res);\n  Ref HostFlag_Unordered = _Bfe(OpSize::i64Bit, 1, FCMP_FLAG_UNORDERED, Res);\n  HostFlag_CF = _Or(OpSize::i32Bit, HostFlag_CF, HostFlag_Unordered);\n  HostFlag_ZF = _Or(OpSize::i32Bit, HostFlag_ZF, HostFlag_Unordered);\n\n  if (WhichFlags == FCOMIFlags::FLAGS_X87) {\n    SetRFLAG<FEXCore::X86State::X87FLAG_C0_LOC>(HostFlag_CF);\n    SetRFLAG<FEXCore::X86State::X87FLAG_C1_LOC>(Constant(0));\n    SetRFLAG<FEXCore::X86State::X87FLAG_C2_LOC>(HostFlag_Unordered);\n    SetRFLAG<FEXCore::X86State::X87FLAG_C3_LOC>(HostFlag_ZF);\n  } else {\n    // OF, SF, AF, PF all undefined\n    SetCFDirect(HostFlag_CF);\n    SetRFLAG<FEXCore::X86State::RFLAG_ZF_RAW_LOC>(HostFlag_ZF);\n\n    // PF is stored inverted, so invert from the host flag.\n    // TODO: This could perhaps be optimized?\n    auto PF = _Xor(OpSize::i32Bit, HostFlag_Unordered, Constant(1));\n    SetRFLAG<FEXCore::X86State::RFLAG_PF_RAW_LOC>(PF);\n  }\n\n  // Set Invalid Operation flag when unordered (NaN comparison)\n  SetRFLAG<FEXCore::X86State::X87FLAG_IE_LOC>(HostFlag_Unordered);\n\n  if (PopTwice) {\n    _PopStackDestroy();\n    _PopStackDestroy();\n  } else if ((Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) != 0) {\n    _PopStackDestroy();\n  }\n}\n\nvoid OpDispatchBuilder::FTST(OpcodeArgs) {\n  Ref Res = _F80StackTest(0);\n\n  Ref HostFlag_CF = _Bfe(OpSize::i64Bit, 1, FCMP_FLAG_LT, Res);\n  Ref HostFlag_ZF = _Bfe(OpSize::i64Bit, 1, FCMP_FLAG_EQ, Res);\n  Ref HostFlag_Unordered = _Bfe(OpSize::i64Bit, 1, FCMP_FLAG_UNORDERED, Res);\n  HostFlag_CF = _Or(OpSize::i32Bit, HostFlag_CF, HostFlag_Unordered);\n  HostFlag_ZF = _Or(OpSize::i32Bit, HostFlag_ZF, HostFlag_Unordered);\n\n  SetRFLAG<FEXCore::X86State::X87FLAG_C0_LOC>(HostFlag_CF);\n  SetRFLAG<FEXCore::X86State::X87FLAG_C1_LOC>(Constant(0));\n  SetRFLAG<FEXCore::X86State::X87FLAG_C2_LOC>(HostFlag_Unordered);\n  SetRFLAG<FEXCore::X86State::X87FLAG_C3_LOC>(HostFlag_ZF);\n\n  // Set Invalid Operation flag when unordered (NaN comparison)\n  SetRFLAG<FEXCore::X86State::X87FLAG_IE_LOC>(HostFlag_Unordered);\n}\n\nvoid OpDispatchBuilder::X87OpHelper(OpcodeArgs, FEXCore::IR::IROps IROp, bool ZeroC2) {\n  DeriveOp(Result, IROp, _F80SCALEStack());\n  if (ZeroC2) {\n    SetRFLAG<FEXCore::X86State::X87FLAG_C2_LOC>(Constant(0));\n  }\n}\n\nvoid OpDispatchBuilder::X87ModifySTP(OpcodeArgs, bool Inc) {\n  if (Inc) {\n    _IncStackTop();\n  } else {\n    _DecStackTop();\n  }\n}\n\n// Operations dealing with loading and storing environment pieces\n\n// Reconstruct as a constant the Status Word of the FPU.\n// We only track stack top and each of the code conditions (C flags)\n// Top is 3 bits at bit 11.\n// C0 is 1 bit at bit 8.\n// C1 is 1 bit at bit 9.\n// C2 is 1 bit at bit 10.\n// C3 is 1 bit at bit 14.\n// Optionally we can pass a pre calculated value for Top, otherwise we calculate it\n// during the function runtime.\nRef OpDispatchBuilder::ReconstructFSW_Helper(Ref T) {\n  // Start with the top value\n  auto Top = T ? T : GetX87Top();\n  Ref FSW = _Lshl(OpSize::i64Bit, Top, Constant(11));\n\n  // We must construct the FSW from our various bits\n  auto C0 = GetRFLAG(FEXCore::X86State::X87FLAG_C0_LOC);\n  FSW = _Orlshl(OpSize::i64Bit, FSW, C0, 8);\n\n  auto C1 = GetRFLAG(FEXCore::X86State::X87FLAG_C1_LOC);\n  FSW = _Orlshl(OpSize::i64Bit, FSW, C1, 9);\n\n  auto C2 = GetRFLAG(FEXCore::X86State::X87FLAG_C2_LOC);\n  FSW = _Orlshl(OpSize::i64Bit, FSW, C2, 10);\n\n  auto C3 = GetRFLAG(FEXCore::X86State::X87FLAG_C3_LOC);\n  FSW = _Orlshl(OpSize::i64Bit, FSW, C3, 14);\n\n  auto IE = GetRFLAG(FEXCore::X86State::X87FLAG_IE_LOC);\n  FSW = _Or(OpSize::i64Bit, FSW, IE);\n\n  return FSW;\n}\n\n// Store Status Word\n// There's no load Status Word instruction but you can load it through frstor\n// or fldenv.\nvoid OpDispatchBuilder::X87FNSTSW(OpcodeArgs) {\n  Ref TopValue = _SyncStackToSlow();\n  Ref StatusWord = ReconstructFSW_Helper(TopValue);\n  StoreResultGPR(Op, StatusWord);\n}\n\nvoid OpDispatchBuilder::FNCLEX(OpcodeArgs) {\n  // Clear the exception flag bit\n  SetRFLAG<FEXCore::X86State::X87FLAG_IE_LOC>(_Constant(0));\n}\n\nvoid OpDispatchBuilder::FNINIT(OpcodeArgs) {\n  _SyncStackToSlow(); // Invalidate x87 register caches\n\n  auto Zero = Constant(0);\n\n  if (ReducedPrecisionMode) {\n    _SetRoundingMode(Zero, false, Zero);\n  }\n\n  // Init FCW to 0x037F\n  auto NewFCW = Constant(0x037F);\n  _StoreContextGPR(OpSize::i16Bit, NewFCW, offsetof(FEXCore::Core::CPUState, FCW));\n\n  // Set top to zero\n  SetX87Top(Zero);\n  // Tags all get marked as invalid\n  _StoreContextGPR(OpSize::i8Bit, Zero, offsetof(FEXCore::Core::CPUState, AbridgedFTW));\n\n  // Reinits the simulated stack\n  _InitStack();\n\n  SetRFLAG<FEXCore::X86State::X87FLAG_C0_LOC>(Zero);\n  SetRFLAG<FEXCore::X86State::X87FLAG_C1_LOC>(Zero);\n  SetRFLAG<FEXCore::X86State::X87FLAG_C2_LOC>(Zero);\n  SetRFLAG<FEXCore::X86State::X87FLAG_C3_LOC>(Zero);\n  SetRFLAG<FEXCore::X86State::X87FLAG_IE_LOC>(Zero);\n}\n\nvoid OpDispatchBuilder::X87FFREE(OpcodeArgs) {\n  _InvalidateStack(Op->OP & 7);\n}\n\nvoid OpDispatchBuilder::X87EMMS(OpcodeArgs) {\n  // Tags all get set to 0b11\n  _InvalidateStack(0xff);\n}\n\nvoid OpDispatchBuilder::X87FCMOV(OpcodeArgs) {\n  CalculateDeferredFlags();\n\n  uint16_t Opcode = Op->OP & 0b1111'1111'1000;\n  uint8_t CC = 0;\n\n  switch (Opcode) {\n  case 0x3'C0:\n    CC = 0x3; // JNC\n    break;\n  case 0x2'C0:\n    CC = 0x2; // JC\n    break;\n  case 0x2'C8:\n    CC = 0x4; // JE\n    break;\n  case 0x3'C8:\n    CC = 0x5; // JNE\n    break;\n  case 0x2'D0:\n    CC = 0x6; // JNA\n    break;\n  case 0x3'D0:\n    CC = 0x7; // JA\n    break;\n  case 0x2'D8:\n    CC = 0xA; // JP\n    break;\n  case 0x3'D8:\n    CC = 0xB; // JNP\n    break;\n  default: LOGMAN_MSG_A_FMT(\"Unhandled FCMOV op: 0x{:x}\", Opcode); break;\n  }\n\n  Ref VecCond = _VDupFromGPR(OpSize::i128Bit, OpSize::i64Bit, SelectCC0All1(CC));\n  _F80VBSLStack(OpSize::i128Bit, VecCond, Op->OP & 7, 0);\n}\n\nvoid OpDispatchBuilder::X87FXAM(OpcodeArgs) {\n  auto a = _ReadStackValue(0);\n  Ref Result =\n    ReducedPrecisionMode ? _VExtractToGPR(OpSize::i64Bit, OpSize::i64Bit, a, 0) : _VExtractToGPR(OpSize::i128Bit, OpSize::i64Bit, a, 1);\n\n  // Extract the sign bit\n  Result = ReducedPrecisionMode ? _Bfe(OpSize::i64Bit, 1, 63, Result) : _Bfe(OpSize::i64Bit, 1, 15, Result);\n  SetRFLAG<FEXCore::X86State::X87FLAG_C1_LOC>(Result);\n\n  // Claim this is a normal number\n  // We don't support anything else\n  auto TopValid = _StackValidTag(0);\n\n  // In the case of top being invalid then C3:C2:C0 is 0b101\n  auto C3 = Select01(OpSize::i32Bit, CondClass::NEQ, TopValid, Constant(1));\n\n  auto C2 = TopValid;\n  auto C0 = C3; // Mirror C3 until something other than zero is supported\n  SetRFLAG<FEXCore::X86State::X87FLAG_C0_LOC>(C0);\n  SetRFLAG<FEXCore::X86State::X87FLAG_C2_LOC>(C2);\n  SetRFLAG<FEXCore::X86State::X87FLAG_C3_LOC>(C3);\n}\n\nvoid OpDispatchBuilder::X87FXTRACT(OpcodeArgs) {\n  auto Top = _ReadStackValue(0);\n\n  _PopStackDestroy();\n  auto Exp = _F80XTRACT_EXP(Top);\n  auto Sig = _F80XTRACT_SIG(Top);\n  _PushStack(Exp, Invalid(), OpSize::iInvalid);\n  _PushStack(Sig, Invalid(), OpSize::iInvalid);\n}\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher/X87F64.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-to-ir, opcodes|dispatcher-implementations\ndesc: Handles x86/64 x87 to IR\n$end_info$\n*/\n\n#include \"Interface/Core/OpcodeDispatcher.h\"\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/IR/IR.h\"\n\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Utils/EnumUtils.h>\n#include <FEXCore/Utils/LogManager.h>\n\n#include <stddef.h>\n#include <stdint.h>\n\nnamespace FEXCore::IR {\nclass OrderedNode;\n\n#define OpcodeArgs [[maybe_unused]] FEXCore::X86Tables::DecodedOp Op\n\nvoid OpDispatchBuilder::X87LDENVF64(OpcodeArgs) {\n  _StackForceSlow();\n\n  const auto Size = OpSizeFromSrc(Op);\n  Ref Mem = MakeSegmentAddress(Op, Op->Src[0]);\n\n  auto NewFCW = _LoadMemGPR(OpSize::i16Bit, Mem, OpSize::i16Bit);\n  // ignore the rounding precision, we're always 64-bit in F64.\n  // extract rounding mode\n  Ref roundingMode = _Bfe(OpSize::i32Bit, 3, 10, NewFCW);\n  _SetRoundingMode(roundingMode, false, roundingMode);\n  _StoreContextGPR(OpSize::i16Bit, NewFCW, offsetof(FEXCore::Core::CPUState, FCW));\n\n  auto NewFSW = _LoadMemGPR(Size, Mem, Constant(IR::OpSizeToSize(Size)), Size, MemOffsetType::SXTX, 1);\n  ReconstructX87StateFromFSW_Helper(NewFSW);\n\n  {\n    // FTW\n    SetX87FTW(_LoadMemGPR(Size, Mem, Constant(IR::OpSizeToSize(Size) * 2), Size, MemOffsetType::SXTX, 1));\n  }\n}\n\nvoid OpDispatchBuilder::X87FLDCWF64(OpcodeArgs) {\n  _StackForceSlow();\n\n  Ref NewFCW = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n  // ignore the rounding precision, we're always 64-bit in F64.\n  // extract rounding mode\n  Ref roundingMode = _Bfe(OpSize::i32Bit, 3, 10, NewFCW);\n  _SetRoundingMode(roundingMode, false, roundingMode);\n  _StoreContextGPR(OpSize::i16Bit, NewFCW, offsetof(FEXCore::Core::CPUState, FCW));\n}\n\n// F64 ops\n// Float load op with memory operand\nvoid OpDispatchBuilder::FLDF64(OpcodeArgs, IR::OpSize Width) {\n  Ref Data = LoadSourceFPR_WithOpSize(Op, Op->Src[0], Width, Op->Flags);\n  // Convert to 64bit float\n  Ref ConvertedData = Data;\n  if (Width == OpSize::i32Bit) {\n    ConvertedData = _Float_FToF(OpSize::i64Bit, OpSize::i32Bit, Data);\n  } else if (Width == OpSize::f80Bit) {\n    ConvertedData = _F80CVT(OpSize::i64Bit, Data);\n  }\n  _PushStack(ConvertedData, Data, Width);\n}\n\nvoid OpDispatchBuilder::FBLDF64(OpcodeArgs) {\n  // Read from memory\n  Ref Data = LoadSourceFPR_WithOpSize(Op, Op->Src[0], OpSize::f80Bit, Op->Flags);\n  Ref ConvertedData = _F80BCDLoad(Data);\n  ConvertedData = _F80CVT(OpSize::i64Bit, ConvertedData);\n  _PushStack(ConvertedData, Invalid(), OpSize::iInvalid);\n}\n\nvoid OpDispatchBuilder::FBSTPF64(OpcodeArgs) {\n  Ref converted = _F80CVTTo(_ReadStackValue(0), OpSize::i64Bit);\n  converted = _F80BCDStore(converted);\n  StoreResultFPR_WithOpSize(Op, Op->Dest, converted, OpSize::f80Bit, OpSize::i8Bit);\n  _PopStackDestroy();\n}\n\nvoid OpDispatchBuilder::FLDF64_Const(OpcodeArgs, uint64_t Num) {\n  auto Data = _VCastFromGPR(OpSize::i64Bit, OpSize::i64Bit, Constant(Num));\n  _PushStack(Data, Data, OpSize::i64Bit);\n}\n\nvoid OpDispatchBuilder::FILDF64(OpcodeArgs) {\n  const auto ReadWidth = OpSizeFromSrc(Op);\n\n  // Read from memory\n  Ref Data = LoadSourceGPR_WithOpSize(Op, Op->Src[0], ReadWidth, Op->Flags);\n  if (ReadWidth == OpSize::i16Bit) {\n    Data = _Sbfe(OpSize::i64Bit, IR::OpSizeAsBits(ReadWidth), 0, Data);\n  }\n  auto ConvertedData = _Float_FromGPR_S(OpSize::i64Bit, ReadWidth == OpSize::i32Bit ? OpSize::i32Bit : OpSize::i64Bit, Data);\n  _PushStack(ConvertedData, Invalid(), OpSize::iInvalid);\n}\n\nvoid OpDispatchBuilder::FISTF64(OpcodeArgs, bool Truncate) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref data = _ReadStackValue(0);\n  if (Truncate) {\n    data = _Float_ToGPR_ZS(Size == OpSize::i32Bit ? OpSize::i32Bit : OpSize::i64Bit, OpSize::i64Bit, data);\n  } else {\n    data = _Float_ToGPR_S(Size == OpSize::i32Bit ? OpSize::i32Bit : OpSize::i64Bit, OpSize::i64Bit, data);\n  }\n  StoreResultGPR_WithOpSize(Op, Op->Dest, data, Size, OpSize::i8Bit);\n\n  if ((Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) != 0) {\n    _PopStackDestroy();\n  }\n}\n\nvoid OpDispatchBuilder::FADDF64(OpcodeArgs, IR::OpSize Width, bool Integer, OpDispatchBuilder::OpResult ResInST0) {\n  if (Op->Src[0].IsNone()) { // Implicit argument case\n    auto Offset = Op->OP & 7;\n    auto St0 = 0;\n    if (ResInST0 == OpResult::RES_STI) {\n      _F80AddStack(Offset, St0);\n    } else {\n      _F80AddStack(St0, Offset);\n    }\n    if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n      _PopStackDestroy();\n    }\n    return;\n  }\n\n  // We have one memory argument\n  Ref arg {};\n\n  if (Integer) {\n    arg = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n    if (Width == OpSize::i16Bit) {\n      arg = _Sbfe(OpSize::i64Bit, 16, 0, arg);\n    }\n    arg = _Float_FromGPR_S(OpSize::i64Bit, Width == OpSize::i64Bit ? OpSize::i64Bit : OpSize::i32Bit, arg);\n  } else if (Width == OpSize::i32Bit) {\n    arg = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    arg = _Float_FToF(OpSize::i64Bit, OpSize::i32Bit, arg);\n  } else if (Width == OpSize::i64Bit) {\n    arg = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  } else {\n    FEX_UNREACHABLE;\n  }\n\n  // top of stack is at offset zero\n  _F80AddValue(0, arg);\n}\n\n// FIXME: following is very similar to FADDF64\nvoid OpDispatchBuilder::FMULF64(OpcodeArgs, IR::OpSize Width, bool Integer, OpDispatchBuilder::OpResult ResInST0) {\n  if (Op->Src[0].IsNone()) { // Implicit argument case\n    auto offset = Op->OP & 7;\n    auto st0 = 0;\n    if (ResInST0 == OpResult::RES_STI) {\n      _F80MulStack(offset, st0);\n    } else {\n      _F80MulStack(st0, offset);\n    }\n    if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n      _PopStackDestroy();\n    }\n    return;\n  }\n\n  // We have one memory argument\n  Ref arg {};\n\n  if (Integer) {\n    arg = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n    if (Width == OpSize::i16Bit) {\n      arg = _Sbfe(OpSize::i64Bit, 16, 0, arg);\n    }\n    arg = _Float_FromGPR_S(OpSize::i64Bit, Width == OpSize::i64Bit ? OpSize::i64Bit : OpSize::i32Bit, arg);\n  } else if (Width == OpSize::i32Bit) {\n    arg = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    arg = _Float_FToF(OpSize::i64Bit, OpSize::i32Bit, arg);\n  } else if (Width == OpSize::i64Bit) {\n    arg = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n  } else {\n    FEX_UNREACHABLE;\n  }\n\n  // top of stack is at offset zero\n  _F80MulValue(0, arg);\n\n  if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n    _PopStackDestroy();\n  }\n}\n\nvoid OpDispatchBuilder::FDIVF64(OpcodeArgs, IR::OpSize Width, bool Integer, bool Reverse, OpDispatchBuilder::OpResult ResInST0) {\n  if (Op->Src[0].IsNone()) {\n    const auto offset = Op->OP & 7;\n    const auto st0 = 0;\n\n    if (Reverse) {\n      if (ResInST0 == OpResult::RES_STI) {\n        _F80DivStack(offset, st0, offset);\n      } else {\n        _F80DivStack(st0, offset, st0);\n      }\n    } else {\n      if (ResInST0 == OpResult::RES_STI) {\n        _F80DivStack(offset, offset, st0);\n      } else {\n        _F80DivStack(st0, st0, offset);\n      }\n    }\n\n    if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n      _PopStackDestroy();\n    }\n    return;\n  }\n\n  // We have one memory argument\n  Ref Arg {};\n\n  if (Width == OpSize::i16Bit || Width == OpSize::i32Bit || Width == OpSize::i64Bit) {\n    if (Integer) {\n      Arg = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n      if (Width == OpSize::i16Bit) {\n        Arg = _Sbfe(OpSize::i64Bit, 16, 0, Arg);\n      }\n      Arg = _Float_FromGPR_S(OpSize::i64Bit, Width == OpSize::i64Bit ? OpSize::i64Bit : OpSize::i32Bit, Arg);\n    } else if (Width == OpSize::i32Bit) {\n      Arg = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n      Arg = _Float_FToF(OpSize::i64Bit, OpSize::i32Bit, Arg);\n    } else if (Width == OpSize::i64Bit) {\n      Arg = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    }\n  } else {\n    FEX_UNREACHABLE;\n  }\n\n  // top of stack is at offset zero\n  if (Reverse) {\n    _F80DivRValue(Arg, 0);\n  } else {\n    _F80DivValue(0, Arg);\n  }\n\n  if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n    _PopStackDestroy();\n  }\n}\n\nvoid OpDispatchBuilder::FSUBF64(OpcodeArgs, IR::OpSize Width, bool Integer, bool Reverse, OpDispatchBuilder::OpResult ResInST0) {\n  if (Op->Src[0].IsNone()) {\n    const auto Offset = Op->OP & 7;\n    const auto St0 = 0;\n\n    if (Reverse) {\n      if (ResInST0 == OpResult::RES_STI) {\n        _F80SubStack(Offset, St0, Offset);\n      } else {\n        _F80SubStack(St0, Offset, St0);\n      }\n    } else {\n      if (ResInST0 == OpResult::RES_STI) {\n        _F80SubStack(Offset, Offset, St0);\n      } else {\n        _F80SubStack(St0, St0, Offset);\n      }\n    }\n\n    if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n      _PopStackDestroy();\n    }\n    return;\n  }\n\n  // We have one memory argument\n  Ref arg {};\n\n  if (Width == OpSize::i16Bit || Width == OpSize::i32Bit || Width == OpSize::i64Bit) {\n    if (Integer) {\n      arg = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n      if (Width == OpSize::i16Bit) {\n        arg = _Sbfe(OpSize::i64Bit, 16, 0, arg);\n      }\n      arg = _Float_FromGPR_S(OpSize::i64Bit, Width == OpSize::i64Bit ? OpSize::i64Bit : OpSize::i32Bit, arg);\n    } else if (Width == OpSize::i32Bit) {\n      arg = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n      arg = _Float_FToF(OpSize::i64Bit, OpSize::i32Bit, arg);\n    } else if (Width == OpSize::i64Bit) {\n      arg = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    }\n  } else {\n    FEX_UNREACHABLE;\n  }\n\n  // top of stack is at offset zero\n  if (Reverse) {\n    _F80SubRValue(arg, 0);\n  } else {\n    _F80SubValue(0, arg);\n  }\n\n  if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) {\n    _PopStackDestroy();\n  }\n}\n\nvoid OpDispatchBuilder::FTSTF64(OpcodeArgs) {\n  // We are going to clobber NZCV, make sure it's in a GPR first.\n  SaveNZCV();\n\n  // Now we do our comparison.\n  _F80StackTest(0);\n  ConvertNZCVToX87();\n}\n\nvoid OpDispatchBuilder::FCOMIF64(OpcodeArgs, IR::OpSize Width, bool Integer, OpDispatchBuilder::FCOMIFlags WhichFlags, bool PopTwice) {\n  Ref arg {};\n  Ref b {};\n\n  if (Op->Src[0].IsNone()) {\n    // Implicit arg\n    uint8_t offset = Op->OP & 7;\n    b = _ReadStackValue(offset);\n  } else if (Width == OpSize::i16Bit || Width == OpSize::i32Bit || Width == OpSize::i64Bit) {\n    // Memory arg\n    if (Integer) {\n      arg = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n      if (Width == OpSize::i16Bit) {\n        arg = _Sbfe(OpSize::i64Bit, 16, 0, arg);\n      }\n      b = _Float_FromGPR_S(OpSize::i64Bit, Width == OpSize::i64Bit ? OpSize::i64Bit : OpSize::i32Bit, arg);\n    } else if (Width == OpSize::i32Bit) {\n      arg = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n      b = _Float_FToF(OpSize::i64Bit, OpSize::i32Bit, arg);\n    } else if (Width == OpSize::i64Bit) {\n      b = LoadSourceFPR(Op, Op->Src[0], Op->Flags);\n    }\n  } else {\n    FEX_UNREACHABLE;\n  }\n\n  if (WhichFlags == FCOMIFlags::FLAGS_X87) {\n    // We are going to clobber NZCV, make sure it's in a GPR first.\n    SaveNZCV();\n\n    _F80CmpValue(b);\n    ConvertNZCVToX87();\n  } else {\n    HandleNZCVWrite();\n    _F80CmpValue(b);\n    ComissFlags(true /* InvalidateAF */);\n  }\n\n  if (PopTwice) {\n    _PopStackDestroy();\n    _PopStackDestroy();\n  } else if ((Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) != 0) {\n    _PopStackDestroy();\n  }\n}\n\nvoid OpDispatchBuilder::X87FXTRACTF64(OpcodeArgs) {\n  // Split node into SIG and EXP while handling the special zero case.\n  // i.e. if val == 0.0, then sig = 0.0, exp = -inf\n  // if val == -0.0, then sig = -0.0, exp = -inf\n  // otherwise we just extract the 64-bit sig and exp as normal.\n  Ref Node = _ReadStackValue(0);\n\n  Ref Gpr = _VExtractToGPR(OpSize::i64Bit, OpSize::i64Bit, Node, 0);\n\n  // zero case\n  Ref ExpZV = _VCastFromGPR(OpSize::i64Bit, OpSize::i64Bit, Constant(0xfff0'0000'0000'0000UL));\n  Ref SigZV = Node;\n\n  // non zero case\n  Ref ExpNZ = _Bfe(OpSize::i64Bit, 11, 52, Gpr);\n  ExpNZ = Sub(OpSize::i64Bit, ExpNZ, Constant(1023));\n  Ref ExpNZV = _Float_FromGPR_S(OpSize::i64Bit, OpSize::i64Bit, ExpNZ);\n\n  Ref SigNZ = _And(OpSize::i64Bit, Gpr, Constant(0x800f'ffff'ffff'ffffLL));\n  SigNZ = _Or(OpSize::i64Bit, SigNZ, Constant(0x3ff0'0000'0000'0000LL));\n  Ref SigNZV = _VCastFromGPR(OpSize::i64Bit, OpSize::i64Bit, SigNZ);\n\n  // Comparison and select to push onto stack\n  SaveNZCV();\n  _TestNZ(OpSize::i64Bit, Gpr, Constant(0x7fff'ffff'ffff'ffffUL));\n\n  Ref Sig = _NZCVSelectV(OpSize::i64Bit, CondClass::EQ, SigZV, SigNZV);\n  Ref Exp = _NZCVSelectV(OpSize::i64Bit, CondClass::EQ, ExpZV, ExpNZV);\n\n  _PopStackDestroy();\n  _PushStack(Exp, Invalid(), OpSize::iInvalid);\n  _PushStack(Sig, Invalid(), OpSize::iInvalid);\n}\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-to-ir, opcodes|dispatcher-implementations\ndesc: Handles x86/64 ops to IR, no-pf opt, local-flags opt\n$end_info$\n*/\n\n#include \"FEXCore/Core/HostFeatures.h\"\n#include \"FEXCore/Utils/Telemetry.h\"\n#include \"Interface/Context/Context.h\"\n#include \"Interface/Core/OpcodeDispatcher.h\"\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/IR/IR.h\"\n#include \"Interface/IR/IREmitter.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/Utils/EnumUtils.h>\n#include <FEXCore/Utils/LogManager.h>\n\n#include <FEXHeaderUtils/BitUtils.h>\n\n#include <algorithm>\n#include <array>\n#include <cstdint>\n\nnamespace FEXCore::IR {\n\nusing X86Tables::OpToIndex;\n\n#define OpcodeArgs [[maybe_unused]] FEXCore::X86Tables::DecodedOp Op\n\nvoid OpDispatchBuilder::SyscallOp(OpcodeArgs, bool IsSyscallInst) {\n  constexpr size_t SyscallArgs = 7;\n  using SyscallArray = std::array<uint64_t, SyscallArgs>;\n\n  size_t NumArguments {};\n  const SyscallArray* GPRIndexes {};\n  static constexpr SyscallArray GPRIndexes_64 = {\n    FEXCore::X86State::REG_RAX, FEXCore::X86State::REG_RDI, FEXCore::X86State::REG_RSI, FEXCore::X86State::REG_RDX,\n    FEXCore::X86State::REG_R10, FEXCore::X86State::REG_R8,  FEXCore::X86State::REG_R9,\n  };\n  static constexpr SyscallArray GPRIndexes_32 = {\n    FEXCore::X86State::REG_RAX, FEXCore::X86State::REG_RBX, FEXCore::X86State::REG_RCX, FEXCore::X86State::REG_RDX,\n    FEXCore::X86State::REG_RSI, FEXCore::X86State::REG_RDI, FEXCore::X86State::REG_RBP,\n  };\n\n  const auto OSABI = CTX->SyscallHandler->GetOSABI();\n  if (OSABI == FEXCore::HLE::SyscallOSABI::OS_LINUX64) {\n    NumArguments = GPRIndexes_64.size();\n    GPRIndexes = &GPRIndexes_64;\n  } else if (OSABI == FEXCore::HLE::SyscallOSABI::OS_LINUX32) {\n    NumArguments = GPRIndexes_32.size();\n    GPRIndexes = &GPRIndexes_32;\n  } else if (OSABI == FEXCore::HLE::SyscallOSABI::OS_GENERIC) {\n    // All registers will be spilled before the syscall and filled afterwards so no JIT-side argument handling is necessary.\n    NumArguments = 0;\n    GPRIndexes = nullptr;\n  } else {\n    ERROR_AND_DIE_FMT(\"Unhandled OSABI syscall\");\n  }\n\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  const auto GPRSize = GetGPROpSize();\n  auto NewRIP = GetRelocatedPC(Op, -Op->InstSize);\n  _StoreContextGPR(GPRSize, NewRIP, offsetof(FEXCore::Core::CPUState, rip));\n\n  Ref Arguments[SyscallArgs] {\n    InvalidNode, InvalidNode, InvalidNode, InvalidNode, InvalidNode, InvalidNode, InvalidNode,\n  };\n  for (size_t i = 0; i < NumArguments; ++i) {\n    Arguments[i] = LoadGPRRegister(GPRIndexes->at(i));\n  }\n\n  if (IsSyscallInst) {\n    // If this is the `Syscall` instruction rather than `int 0x80` then we need to do some additional work.\n    // RCX = RIP after this instruction\n    // R11 = EFlags\n    // Calculate flags.\n    CalculateDeferredFlags();\n\n    auto RFLAG = GetPackedRFLAG();\n    StoreGPRRegister(X86State::REG_R11, RFLAG, OpSize::i64Bit);\n\n    auto RIPAfterInst = GetRelocatedPC(Op);\n    StoreGPRRegister(X86State::REG_RCX, RIPAfterInst, OpSize::i64Bit);\n  }\n\n  FlushRegisterCache();\n  auto SyscallOp = _Syscall(Arguments[0], Arguments[1], Arguments[2], Arguments[3], Arguments[4], Arguments[5], Arguments[6]);\n\n  // Generic ABI doesn't store result in RAX.\n  if (OSABI != FEXCore::HLE::SyscallOSABI::OS_GENERIC) {\n    StoreGPRRegister(X86State::REG_RAX, SyscallOp);\n  }\n\n  if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_BLOCK_END) {\n    // RIP could have been updated after coming back from the Syscall.\n    NewRIP = _LoadContextGPR(GPRSize, offsetof(FEXCore::Core::CPUState, rip));\n    ExitFunction(NewRIP);\n  }\n}\n\nvoid OpDispatchBuilder::ThunkOp(OpcodeArgs) {\n  const auto GPRSize = GetGPROpSize();\n  uint8_t* sha256 = (uint8_t*)(Op->PC + 2);\n\n  if (Is64BitMode) {\n    // x86-64 ABI puts the function argument in RDI\n    Thunk(LoadGPRRegister(X86State::REG_RDI), *reinterpret_cast<SHA256Sum*>(sha256));\n  } else {\n    // x86 fastcall ABI puts the function argument in ECX\n    Thunk(LoadGPRRegister(X86State::REG_RCX), *reinterpret_cast<SHA256Sum*>(sha256));\n  }\n\n  auto NewRIP = Pop(GPRSize);\n\n  // Store the new RIP\n  ExitFunction(NewRIP, BranchHint::Return);\n  BlockSetRIP = true;\n}\n\nvoid OpDispatchBuilder::LEAOp(OpcodeArgs) {\n  // LEA specifically ignores segment prefixes\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto OpAddr = X86Tables::DecodeFlags::GetOpAddr(Op->Flags, 0);\n  OpSize DstSize {};\n\n  if (Is64BitMode) {\n    DstSize = OpAddr == X86Tables::DecodeFlags::FLAG_OPERAND_SIZE_LAST  ? OpSize::i16Bit :\n              OpAddr == X86Tables::DecodeFlags::FLAG_WIDENING_SIZE_LAST ? OpSize::i64Bit :\n                                                                          OpSize::i32Bit;\n  } else {\n    DstSize = OpAddr == X86Tables::DecodeFlags::FLAG_OPERAND_SIZE_LAST ? OpSize::i16Bit : OpSize::i32Bit;\n  }\n\n  auto Src = LoadSourceGPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags, {.LoadData = false, .AllowUpperGarbage = SrcSize > DstSize});\n  StoreResultGPR_WithOpSize(Op, Op->Dest, Src, DstSize);\n}\n\nvoid OpDispatchBuilder::NOPOp(OpcodeArgs) {}\n\nvoid OpDispatchBuilder::RETOp(OpcodeArgs) {\n  const auto GPRSize = GetGPROpSize();\n\n  Ref SP = _RMWHandle(LoadGPRRegister(X86State::REG_RSP));\n  Ref NewRIP = Pop(GPRSize, SP);\n\n  if (Op->OP == 0xC2) {\n    auto Offset = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n    SP = Add(GPRSize, SP, Offset);\n  }\n\n  // Store the new stack pointer\n  StoreGPRRegister(X86State::REG_RSP, SP);\n\n  // Store the new RIP\n  ExitFunction(NewRIP, BranchHint::Return);\n  BlockSetRIP = true;\n}\n\n/*\nstack contains:\nSize of each member is 64-bit, 32-bit, or 16-bit depending on operating size\nRIP\nCS\nEFLAGS\nRSP\nSS\n*/\nvoid OpDispatchBuilder::IRETOp(OpcodeArgs) {\n  // Operand Size override unsupported!\n  if ((Op->Flags & X86Tables::DecodeFlags::FLAG_OPERAND_SIZE) != 0) {\n    LogMan::Msg::EFmt(\"IRET only implemented for 64bit and 32bit sizes\");\n    DecodeFailure = true;\n    return;\n  }\n\n  const auto GPRSize = GetGPROpSize();\n\n  Ref SP = _RMWHandle(LoadGPRRegister(X86State::REG_RSP));\n\n  // RIP (64/32/16 bits)\n  auto NewRIP = Pop(GPRSize, SP);\n  // CS (lower 16 used)\n  auto NewSegmentCS = Pop(GPRSize, SP);\n  _StoreContextGPR(OpSize::i16Bit, NewSegmentCS, offsetof(FEXCore::Core::CPUState, cs_idx));\n  UpdatePrefixFromSegment(NewSegmentCS, FEXCore::X86Tables::DecodeFlags::FLAG_CS_PREFIX);\n\n  // eflags (lower 16 used)\n  SetPackedRFLAG(false, Pop(GPRSize, SP));\n\n  if (Is64BitMode) {\n    // RSP and SS only happen in 64-bit mode or if this is a CPL mode jump!\n    // FEX doesn't support a CPL mode switch, so don't need to worry about this on 32-bit\n    StoreGPRRegister(X86State::REG_RSP, Pop(GPRSize, SP));\n\n    // ss\n    auto NewSegmentSS = Pop(GPRSize, SP);\n    _StoreContextGPR(OpSize::i16Bit, NewSegmentSS, offsetof(FEXCore::Core::CPUState, ss_idx));\n    UpdatePrefixFromSegment(NewSegmentSS, FEXCore::X86Tables::DecodeFlags::FLAG_SS_PREFIX);\n  } else {\n    // Store the stack in 32-bit mode\n    StoreGPRRegister(X86State::REG_RSP, SP);\n  }\n\n  ExitFunction(NewRIP);\n  BlockSetRIP = true;\n}\n\nvoid OpDispatchBuilder::CallbackReturnOp(OpcodeArgs) {\n  const auto GPRSize = GetGPROpSize();\n  // Store the new RIP\n  _CallbackReturn();\n  auto NewRIP = _LoadContextGPR(GPRSize, offsetof(FEXCore::Core::CPUState, rip));\n  // This ExitFunction won't actually get hit but needs to exist\n  ExitFunction(NewRIP);\n  BlockSetRIP = true;\n}\n\nvoid OpDispatchBuilder::SecondaryALUOp(OpcodeArgs) {\n  FEXCore::IR::IROps IROp, AtomicIROp;\n#define OPD(group, prefix, Reg) (((group - FEXCore::X86Tables::TYPE_GROUP_1) << 6) | (prefix) << 3 | (Reg))\n  switch (Op->OP) {\n  case OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x80), 0):\n  case OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x81), 0):\n  case OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x83), 0):\n    IROp = FEXCore::IR::IROps::OP_ADD;\n    AtomicIROp = FEXCore::IR::IROps::OP_ATOMICFETCHADD;\n    break;\n  case OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x80), 1):\n  case OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x81), 1):\n  case OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x83), 1):\n    IROp = FEXCore::IR::IROps::OP_OR;\n    AtomicIROp = FEXCore::IR::IROps::OP_ATOMICFETCHOR;\n    break;\n  case OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x80), 4):\n  case OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x81), 4):\n  case OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x83), 4):\n    IROp = FEXCore::IR::IROps::OP_ANDWITHFLAGS;\n    AtomicIROp = FEXCore::IR::IROps::OP_ATOMICFETCHAND;\n    break;\n  case OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x80), 5):\n  case OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x81), 5):\n  case OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x83), 5):\n    IROp = FEXCore::IR::IROps::OP_SUB;\n    AtomicIROp = FEXCore::IR::IROps::OP_ATOMICFETCHSUB;\n    break;\n  case OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x80), 6):\n  case OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x81), 6):\n  case OPD(FEXCore::X86Tables::TYPE_GROUP_1, OpToIndex(0x83), 6):\n    IROp = FEXCore::IR::IROps::OP_XOR;\n    AtomicIROp = FEXCore::IR::IROps::OP_ATOMICFETCHXOR;\n    break;\n  default:\n    IROp = FEXCore::IR::IROps::OP_LAST;\n    AtomicIROp = FEXCore::IR::IROps::OP_LAST;\n    LogMan::Msg::EFmt(\"Unknown ALU Op: 0x{:x}\", Op->OP);\n    DecodeFailure = true;\n    return;\n  };\n#undef OPD\n\n  ALUOp(Op, IROp, AtomicIROp, 1);\n}\n\nvoid OpDispatchBuilder::ADCOp(OpcodeArgs, uint32_t SrcIndex) {\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  Ref Src = LoadSourceGPR(Op, Op->Src[SrcIndex], Op->Flags, {.AllowUpperGarbage = true});\n  const auto Size = OpSizeFromDst(Op);\n  const auto OpSize = std::max(OpSize::i32Bit, Size);\n\n  Ref Before {};\n  if (DestIsLockedMem(Op)) {\n    auto ALUOp = IncrementByCarry(OpSize, Src);\n    HandledLock = true;\n\n    Ref DestMem = MakeSegmentAddress(Op, Op->Dest);\n    Before = _AtomicFetchAdd(Size, ALUOp, DestMem);\n  } else {\n    Before = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n  }\n\n  Ref Result;\n  if (!DestIsLockedMem(Op) && Op->Src[SrcIndex].IsLiteral() && Op->Src[SrcIndex].Literal() == 0 && Size >= OpSize::i32Bit) {\n    HandleNZCV_RMW();\n    RectifyCarryInvert(true);\n    Result = _AdcZeroWithFlags(OpSize, Before);\n    SetRFLAG<FEXCore::X86State::RFLAG_AF_RAW_LOC>(Before);\n    CalculatePF(Result);\n    CFInverted = false;\n  } else {\n    Result = CalculateFlags_ADC(Size, Before, Src);\n  }\n\n  if (!DestIsLockedMem(Op)) {\n    StoreResultGPR(Op, Result);\n  }\n}\n\nvoid OpDispatchBuilder::SBBOp(OpcodeArgs, uint32_t SrcIndex) {\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  Ref Src = LoadSourceGPR(Op, Op->Src[SrcIndex], Op->Flags, {.AllowUpperGarbage = true});\n  const auto Size = OpSizeFromDst(Op);\n  const auto OpSize = std::max(OpSize::i32Bit, Size);\n\n  Ref Result {};\n  Ref Before {};\n  if (DestIsLockedMem(Op)) {\n    HandledLock = true;\n\n    Ref DestMem = MakeSegmentAddress(Op, Op->Dest);\n    auto SrcPlusCF = IncrementByCarry(OpSize, Src);\n    Before = _AtomicFetchSub(Size, SrcPlusCF, DestMem);\n  } else {\n    Before = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n  }\n\n  Result = CalculateFlags_SBB(Size, Before, Src);\n\n  if (!DestIsLockedMem(Op)) {\n    StoreResultGPR(Op, Result);\n  }\n}\n\nvoid OpDispatchBuilder::SALCOp(OpcodeArgs) {\n  CalculateDeferredFlags();\n\n  auto Result = NZCVSelect(OpSize::i32Bit, CondClass::UGE /* CF = 1 */, _InlineConstant(0xffffffff), _InlineConstant(0));\n\n  StoreResultGPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::PUSHOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Push(Size, LoadSourceGPR(Op, Op->Src[0], Op->Flags));\n}\n\nvoid OpDispatchBuilder::PUSHREGOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Push(Size, LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true}));\n}\n\nvoid OpDispatchBuilder::PUSHAOp(OpcodeArgs) {\n  // 32bit only\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref OldSP = _Copy(LoadGPRRegister(X86State::REG_RSP));\n\n  Push(Size, LoadGPRRegister(X86State::REG_RAX));\n  Push(Size, LoadGPRRegister(X86State::REG_RCX));\n  Push(Size, LoadGPRRegister(X86State::REG_RDX));\n  Push(Size, LoadGPRRegister(X86State::REG_RBX));\n  Push(Size, OldSP);\n  Push(Size, LoadGPRRegister(X86State::REG_RBP));\n  Push(Size, LoadGPRRegister(X86State::REG_RSI));\n  Push(Size, LoadGPRRegister(X86State::REG_RDI));\n}\n\nvoid OpDispatchBuilder::PUSHSegmentOp(OpcodeArgs, uint32_t SegmentReg) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto DstSize = OpSizeFromDst(Op);\n\n  Ref Src {};\n  if (!Is64BitMode) {\n    switch (SegmentReg) {\n    case FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX: {\n      Src = _LoadContextGPR(SrcSize, offsetof(FEXCore::Core::CPUState, es_idx));\n      break;\n    }\n    case FEXCore::X86Tables::DecodeFlags::FLAG_CS_PREFIX: {\n      Src = _LoadContextGPR(SrcSize, offsetof(FEXCore::Core::CPUState, cs_idx));\n      break;\n    }\n    case FEXCore::X86Tables::DecodeFlags::FLAG_SS_PREFIX: {\n      Src = _LoadContextGPR(SrcSize, offsetof(FEXCore::Core::CPUState, ss_idx));\n      break;\n    }\n    case FEXCore::X86Tables::DecodeFlags::FLAG_DS_PREFIX: {\n      Src = _LoadContextGPR(SrcSize, offsetof(FEXCore::Core::CPUState, ds_idx));\n      break;\n    }\n    case FEXCore::X86Tables::DecodeFlags::FLAG_FS_PREFIX: {\n      Src = _LoadContextGPR(SrcSize, offsetof(FEXCore::Core::CPUState, fs_idx));\n      break;\n    }\n    case FEXCore::X86Tables::DecodeFlags::FLAG_GS_PREFIX: {\n      Src = _LoadContextGPR(SrcSize, offsetof(FEXCore::Core::CPUState, gs_idx));\n      break;\n    }\n    default: FEX_UNREACHABLE;\n    }\n  } else {\n    switch (SegmentReg) {\n    case FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX:\n      Src = _LoadContextGPR(SrcSize, offsetof(FEXCore::Core::CPUState, es_cached));\n      break;\n    case FEXCore::X86Tables::DecodeFlags::FLAG_CS_PREFIX:\n      Src = _LoadContextGPR(SrcSize, offsetof(FEXCore::Core::CPUState, cs_cached));\n      break;\n    case FEXCore::X86Tables::DecodeFlags::FLAG_SS_PREFIX:\n      Src = _LoadContextGPR(SrcSize, offsetof(FEXCore::Core::CPUState, ss_cached));\n      break;\n    case FEXCore::X86Tables::DecodeFlags::FLAG_DS_PREFIX:\n      Src = _LoadContextGPR(SrcSize, offsetof(FEXCore::Core::CPUState, ds_cached));\n      break;\n    case FEXCore::X86Tables::DecodeFlags::FLAG_FS_PREFIX:\n      Src = _LoadContextGPR(SrcSize, offsetof(FEXCore::Core::CPUState, fs_cached));\n      break;\n    case FEXCore::X86Tables::DecodeFlags::FLAG_GS_PREFIX:\n      Src = _LoadContextGPR(SrcSize, offsetof(FEXCore::Core::CPUState, gs_cached));\n      break;\n    default: FEX_UNREACHABLE;\n    }\n  }\n\n  // Store our value to the new stack location\n  // AMD hardware zexts segment selector to 32bit\n  // Intel hardware inserts segment selector\n  Push(DstSize, Src);\n}\n\nvoid OpDispatchBuilder::POPOp(OpcodeArgs) {\n  Ref Value = Pop(OpSizeFromSrc(Op));\n  StoreResultGPR(Op, Value);\n}\n\nvoid OpDispatchBuilder::POPAOp(OpcodeArgs) {\n  // 32bit only\n  const auto Size = OpSizeFromSrc(Op);\n\n  Ref SP = _RMWHandle(LoadGPRRegister(X86State::REG_RSP));\n\n  StoreGPRRegister(X86State::REG_RDI, Pop(Size, SP), Size);\n  StoreGPRRegister(X86State::REG_RSI, Pop(Size, SP), Size);\n  StoreGPRRegister(X86State::REG_RBP, Pop(Size, SP), Size);\n\n  // Skip loading RSP because it'll be correct at the end\n  SP = _RMWHandle(Add(OpSize::i64Bit, SP, IR::OpSizeToSize(Size)));\n\n  StoreGPRRegister(X86State::REG_RBX, Pop(Size, SP), Size);\n  StoreGPRRegister(X86State::REG_RDX, Pop(Size, SP), Size);\n  StoreGPRRegister(X86State::REG_RCX, Pop(Size, SP), Size);\n  StoreGPRRegister(X86State::REG_RAX, Pop(Size, SP), Size);\n\n  // Store the new stack pointer\n  StoreGPRRegister(X86State::REG_RSP, SP);\n}\n\nvoid OpDispatchBuilder::POPSegmentOp(OpcodeArgs, uint32_t SegmentReg) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto DstSize = OpSizeFromDst(Op);\n\n  auto NewSegment = Pop(SrcSize);\n\n  switch (SegmentReg) {\n  case FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX:\n    _StoreContextGPR(DstSize, NewSegment, offsetof(FEXCore::Core::CPUState, es_idx));\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_CS_PREFIX:\n    _StoreContextGPR(DstSize, NewSegment, offsetof(FEXCore::Core::CPUState, cs_idx));\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_SS_PREFIX:\n    // Unset the 'active' bit in the packed TF, skipping the single step exception after this instruction\n    SetRFLAG<FEXCore::X86State::RFLAG_TF_RAW_LOC>(_And(OpSize::i32Bit, GetRFLAG(FEXCore::X86State::RFLAG_TF_RAW_LOC), Constant(1)));\n    _StoreContextGPR(DstSize, NewSegment, offsetof(FEXCore::Core::CPUState, ss_idx));\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_DS_PREFIX:\n    _StoreContextGPR(DstSize, NewSegment, offsetof(FEXCore::Core::CPUState, ds_idx));\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_FS_PREFIX:\n    _StoreContextGPR(DstSize, NewSegment, offsetof(FEXCore::Core::CPUState, fs_idx));\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_GS_PREFIX:\n    _StoreContextGPR(DstSize, NewSegment, offsetof(FEXCore::Core::CPUState, gs_idx));\n    break;\n  default: break; // Do nothing\n  }\n\n  UpdatePrefixFromSegment(NewSegment, SegmentReg);\n}\n\nvoid OpDispatchBuilder::LEAVEOp(OpcodeArgs) {\n  const auto GPRSize = GetGPROpSize();\n  const auto OperandSize = (Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_OPERAND_SIZE) ? OpSize::i16Bit : GPRSize;\n\n  // First we move RBP in to RSP and then behave effectively like a pop\n  auto SP = _RMWHandle(LoadGPRRegister(X86State::REG_RBP));\n  auto NewGPR = Pop(OperandSize, SP);\n\n  // Store the new stack pointer\n  StoreGPRRegister(X86State::REG_RSP, SP, OperandSize);\n\n  // Store what we loaded to RBP\n  StoreGPRRegister(X86State::REG_RBP, NewGPR, OperandSize);\n}\n\nvoid OpDispatchBuilder::CALLOp(OpcodeArgs) {\n  const auto GPRSize = GetGPROpSize();\n\n  BlockSetRIP = true;\n\n  // Call instruction only uses up to 32-bit signed displacement\n  const int64_t TargetOffset = Op->Src[0].Literal();\n\n  const auto ConstantPC = GetRelocatedPC(Op);\n\n  // Push the return address.\n  Push(GPRSize, ConstantPC);\n\n  if (TargetOffset != 0) {\n    // Store the RIP\n    const uint64_t NextRIP = Op->PC + Op->InstSize;\n\n    ExitRelocatedPC(Op, TargetOffset, BranchHint::Call, ConstantPC, [&]() {\n      auto CallReturnJumpTarget = JumpTargets.find(NextRIP);\n      if (CallReturnJumpTarget != JumpTargets.end() && CallReturnJumpTarget->second.IsEntryPoint) {\n        return CallReturnJumpTarget->second.BlockEntry;\n      }\n      return InvalidNode;\n    }());\n  } else {\n    NeedsBlockEnd = true;\n  }\n}\n\nvoid OpDispatchBuilder::CALLAbsoluteOp(OpcodeArgs) {\n  BlockSetRIP = true;\n\n  const auto Size = OpSizeFromSrc(Op);\n  Ref JMPPCOffset = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n\n  // Push the return address.\n  auto ConstantPC = GetRelocatedPC(Op);\n  Push(Size, ConstantPC);\n\n  // Store the RIP\n  const uint64_t NextRIP = Op->PC + Op->InstSize;\n  ExitFunction(JMPPCOffset, BranchHint::Call, ConstantPC, [&]() {\n    auto CallReturnJumpTarget = JumpTargets.find(NextRIP);\n    if (CallReturnJumpTarget != JumpTargets.end() && CallReturnJumpTarget->second.IsEntryPoint) {\n      return CallReturnJumpTarget->second.BlockEntry;\n    }\n    return InvalidNode;\n  }());\n}\n\nstd::optional<CondClass> OpDispatchBuilder::DecodeNZCVCondition(uint8_t OP) {\n  switch (OP) {\n  case 0x0: { // JO - Jump if OF == 1\n    return CondClass::FU;\n  }\n  case 0x1: { // JNO - Jump if OF == 0\n    return CondClass::FNU;\n  }\n  case 0x2: { // JC - Jump if CF == 1\n    return CFInverted ? CondClass::ULT : CondClass::UGE;\n  }\n  case 0x3: { // JNC - Jump if CF == 0\n    return CFInverted ? CondClass::UGE : CondClass::ULT;\n  }\n  case 0x4: { // JE - Jump if ZF == 1\n    return CondClass::EQ;\n  }\n  case 0x5: { // JNE - Jump if ZF == 0\n    return CondClass::NEQ;\n  }\n  case 0x6: { // JNA - Jump if CF == 1 || ZF == 1\n    // With CF, we want (C == 0 || Z == 1). By De Morgan's, that's\n    // equivalent to !(C == 1 && Z == 0). That's .ls\n    RectifyCarryInvert(true);\n    return CondClass::ULE;\n  }\n  case 0x7: { // JA - Jump if CF == 0 && ZF == 0\n    // With CF inverted, we want (C == 1 && Z == 0). That's .hi\n    RectifyCarryInvert(true);\n    return CondClass::UGT;\n  }\n  case 0x8: { // JS - Jump if SF == 1\n    return CondClass::MI;\n  }\n  case 0x9: { // JNS - Jump if SF == 0\n    return CondClass::PL;\n  }\n  case 0xC: { // SF <> OF\n    return CondClass::SLT;\n  }\n  case 0xD: { // SF = OF\n    return CondClass::SGE;\n  }\n  case 0xE: { // ZF = 1 || SF <> OF\n    return CondClass::SLE;\n  }\n  case 0xF: { // ZF = 0 && SF = OF\n    return CondClass::SGT;\n  }\n  default:\n    // Other conditions do not map directly, caller gets to deal with it.\n    return std::nullopt;\n  }\n}\n\nstatic bool ParityJumpIsJP(uint8_t OP) {\n  LOGMAN_THROW_A_FMT(OP == 0xA || OP == 0xB, \"JP or JNP\");\n  return OP == 0xA;\n}\n\nRef OpDispatchBuilder::SelectCC0All1(uint8_t OP) {\n  if (auto Cond = DecodeNZCVCondition(OP); Cond) {\n    // Use raw select since DecodeNZCVCondition handles the carry invert\n    return _NZCVSelect(OpSize::i64Bit, *Cond, _InlineConstant(~0ULL), _InlineConstant(0));\n  } else {\n    // Raw value contains inverted PF in bottom bit\n    return _Sbfe(OpSize::i64Bit, 1, 0, LoadPFRaw(false, ParityJumpIsJP(OP)));\n  }\n}\n\nvoid OpDispatchBuilder::SETccOp(OpcodeArgs) {\n  CalculateDeferredFlags();\n\n  Ref SrcCond;\n  if (auto Cond = DecodeNZCVCondition(Op->OP & 0xf); Cond) {\n    // Use raw select since DecodeNZCVCondition handles the carry invert\n    SrcCond = _NZCVSelect01(*Cond);\n  } else {\n    SrcCond = LoadPFRaw(true, ParityJumpIsJP(Op->OP & 0xf));\n  }\n\n  StoreResultGPR(Op, SrcCond);\n}\n\nvoid OpDispatchBuilder::CMOVOp(OpcodeArgs) {\n  const auto GPRSize = GetGPROpSize();\n  const auto OP = Op->OP & 0xF;\n  const auto ResultSize = std::max(OpSize::i32Bit, OpSizeFromSrc(Op));\n\n  CalculateDeferredFlags();\n\n  // Destination is always a GPR.\n  Ref Dest = LoadSourceGPR_WithOpSize(Op, Op->Dest, GPRSize, Op->Flags);\n  Ref Src {}, SrcCond {};\n  if (Op->Src[0].IsGPR()) {\n    Src = LoadSourceGPR_WithOpSize(Op, Op->Src[0], GPRSize, Op->Flags);\n  } else {\n    Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n  }\n\n  if (auto Cond = DecodeNZCVCondition(OP); Cond) {\n    // Use raw select since DecodeNZCVCondition handles the carry invert\n    SrcCond = _NZCVSelect(ResultSize, *Cond, Src, Dest);\n  } else {\n    // Raw value contains inverted PF in bottom bit\n    Ref Cmp = LoadPFRaw(false, ParityJumpIsJP(OP));\n    SaveNZCV();\n\n    // Because we're only clobbering NZCV internally, we ignore all carry flag\n    // shenanigans and just use the raw test and raw select.\n    _TestNZ(OpSize::i32Bit, Cmp, _InlineConstant(1));\n    SrcCond = _NZCVSelect(ResultSize, CondClass::NEQ, Src, Dest);\n  }\n\n  StoreResultGPR(Op, SrcCond);\n}\n\nvoid OpDispatchBuilder::CondJUMPOp(OpcodeArgs) {\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  BlockSetRIP = true;\n\n  // Jump instruction only uses up to 32-bit signed displacement\n  int64_t TargetOffset = Op->Src[0].Literal();\n  uint64_t InstRIP = Op->PC + Op->InstSize;\n  uint64_t Target = InstRIP + TargetOffset;\n\n  if (GetGPROpSize() == OpSize::i32Bit) {\n    // If the GPRSize is 4 then we need to be careful about PC wrapping\n    if (TargetOffset < 0 && -TargetOffset > InstRIP) {\n      // Invert the signed value if we are underflowing\n      TargetOffset = 0x1'0000'0000ULL + TargetOffset;\n    } else if (TargetOffset >= 0 && Target >= 0x1'0000'0000ULL) {\n      // We are overflowing, wrap around\n      TargetOffset = TargetOffset - 0x1'0000'0000ULL;\n    }\n    Target &= 0xFFFFFFFFU;\n  }\n\n  FlushRegisterCache();\n  auto TrueBlock = JumpTargets.find(Target);\n  auto FalseBlock = JumpTargets.find(Op->PC + Op->InstSize);\n\n  auto CurrentBlock = GetCurrentBlock();\n\n  {\n    IRPair<IR::IROp_CondJump> CondJump_;\n    auto OP = Op->OP & 0xF;\n    auto Cond = DecodeNZCVCondition(OP);\n    if (Cond) {\n      CondJump_ = CondJumpNZCV(*Cond);\n    } else {\n      LOGMAN_THROW_A_FMT(OP == 0xA || OP == 0xB, \"only PF left\");\n      CondJump_ = CondJumpBit(LoadPFRaw(false, false), 0, OP == 0xB);\n    }\n\n    // Taking branch block\n    if (TrueBlock != JumpTargets.end()) {\n      SetTrueJumpTarget(CondJump_, TrueBlock->second.BlockEntry);\n    } else {\n      // Make sure to start a new block after ending this one\n      auto JumpTarget = CreateNewCodeBlockAtEnd();\n      SetTrueJumpTarget(CondJump_, JumpTarget);\n      SetCurrentCodeBlock(JumpTarget);\n      StartNewBlock();\n\n      // Store the new RIP\n      ExitRelocatedPC(Op, TargetOffset);\n    }\n\n    // Failure to take branch\n    if (FalseBlock != JumpTargets.end()) {\n      SetFalseJumpTarget(CondJump_, FalseBlock->second.BlockEntry);\n    } else {\n      // Make sure to start a new block after ending this one\n      // Place it after this block for fallthrough optimization\n      auto JumpTarget = CreateNewCodeBlockAfter(CurrentBlock);\n      SetFalseJumpTarget(CondJump_, JumpTarget);\n      SetCurrentCodeBlock(JumpTarget);\n      StartNewBlock();\n\n      // Leave block & store the new RIP\n      ExitRelocatedPC(Op);\n    }\n  }\n}\n\nvoid OpDispatchBuilder::CondJUMPRCXOp(OpcodeArgs) {\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  BlockSetRIP = true;\n  auto JcxGPRSize = GetGPROpSize();\n  JcxGPRSize = (Op->Flags & X86Tables::DecodeFlags::FLAG_ADDRESS_SIZE) ? (JcxGPRSize >> 1) : JcxGPRSize;\n\n  uint64_t Target = Op->PC + Op->InstSize + Op->Src[0].Literal();\n\n  Ref CondReg = LoadGPRRegister(X86State::REG_RCX, JcxGPRSize);\n\n  auto TrueBlock = JumpTargets.find(Target);\n  auto FalseBlock = JumpTargets.find(Op->PC + Op->InstSize);\n\n  auto CurrentBlock = GetCurrentBlock();\n\n  {\n    auto CondJump_ = CondJump(CondReg, CondClass::EQ);\n\n    // Taking branch block\n    if (TrueBlock != JumpTargets.end()) {\n      SetTrueJumpTarget(CondJump_, TrueBlock->second.BlockEntry);\n    } else {\n      // Make sure to start a new block after ending this one\n      auto JumpTarget = CreateNewCodeBlockAtEnd();\n      SetTrueJumpTarget(CondJump_, JumpTarget);\n      SetCurrentCodeBlock(JumpTarget);\n      StartNewBlock();\n\n      // Store the new RIP\n      ExitRelocatedPC(Op, Op->Src[0].Literal());\n    }\n\n    // Failure to take branch\n    if (FalseBlock != JumpTargets.end()) {\n      SetFalseJumpTarget(CondJump_, FalseBlock->second.BlockEntry);\n    } else {\n      // Make sure to start a new block after ending this one\n      // Place it after the current block for fallthrough behavior\n      auto JumpTarget = CreateNewCodeBlockAfter(CurrentBlock);\n      SetFalseJumpTarget(CondJump_, JumpTarget);\n      SetCurrentCodeBlock(JumpTarget);\n      StartNewBlock();\n\n      // Leave block & store the new RIP\n      ExitRelocatedPC(Op);\n    }\n  }\n}\n\nvoid OpDispatchBuilder::LoopOp(OpcodeArgs) {\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  bool CheckZF = Op->OP != 0xE2;\n  bool ZFTrue = Op->OP == 0xE1;\n\n  BlockSetRIP = true;\n  auto SrcSize = (Op->Flags & X86Tables::DecodeFlags::FLAG_ADDRESS_SIZE) ? OpSize::i32Bit : OpSize::i64Bit;\n  auto OpSize = SrcSize == OpSize::i64Bit ? OpSize::i64Bit : OpSize::i32Bit;\n\n  if (!Is64BitMode) {\n    // RCX size is 32-bit or 16-bit when executing in 32-bit mode.\n    SrcSize = IR::SizeToOpSize(IR::OpSizeToSize(SrcSize) >> 1);\n    OpSize = OpSize::i32Bit;\n  }\n\n  uint64_t Target = Op->PC + Op->InstSize + Op->Src[1].Literal();\n\n  Ref CondReg = LoadSourceGPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags);\n  CondReg = Sub(OpSize, CondReg, 1);\n  StoreResultGPR(Op, Op->Src[0], CondReg);\n\n  // If LOOPE then jumps to target if RCX != 0 && ZF == 1\n  // If LOOPNE then jumps to target if RCX != 0 && ZF == 0\n  //\n  // To handle efficiently, smash RCX to zero if ZF is wrong (1 csel).\n  if (CheckZF) {\n    const auto cond = ZFTrue ? CondClass::EQ : CondClass::NEQ;\n    CondReg = NZCVSelect(OpSize, cond, CondReg, _InlineConstant(0));\n  }\n\n  CalculateDeferredFlags();\n  auto TrueBlock = JumpTargets.find(Target);\n  auto FalseBlock = JumpTargets.find(Op->PC + Op->InstSize);\n\n  {\n    auto CondJump_ = CondJump(CondReg);\n\n    // Taking branch block\n    if (TrueBlock != JumpTargets.end()) {\n      SetTrueJumpTarget(CondJump_, TrueBlock->second.BlockEntry);\n    } else {\n      // Make sure to start a new block after ending this one\n      auto JumpTarget = CreateNewCodeBlockAtEnd();\n      SetTrueJumpTarget(CondJump_, JumpTarget);\n      SetCurrentCodeBlock(JumpTarget);\n      StartNewBlock();\n\n      // Store the new RIP\n      ExitRelocatedPC(Op, Op->Src[1].Literal());\n    }\n\n    // Failure to take branch\n    if (FalseBlock != JumpTargets.end()) {\n      SetFalseJumpTarget(CondJump_, FalseBlock->second.BlockEntry);\n    } else {\n      // Make sure to start a new block after ending this one\n      // Place after this block for fallthrough behavior\n      auto JumpTarget = CreateNewCodeBlockAfter(GetCurrentBlock());\n      SetFalseJumpTarget(CondJump_, JumpTarget);\n      SetCurrentCodeBlock(JumpTarget);\n      StartNewBlock();\n\n      // Leave block & store the new RIP\n      ExitRelocatedPC(Op);\n    }\n  }\n}\n\nvoid OpDispatchBuilder::JUMPOp(OpcodeArgs) {\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  BlockSetRIP = true;\n\n  // Jump instruction only uses up to 32-bit signed displacement\n  int64_t TargetOffset = Op->Src[0].Literal();\n  uint64_t InstRIP = Op->PC + Op->InstSize;\n  uint64_t TargetRIP = InstRIP + TargetOffset;\n\n  if (GetGPROpSize() == OpSize::i32Bit) {\n    // If the GPRSize is 4 then we need to be careful about PC wrapping\n    if (TargetOffset < 0 && -TargetOffset > InstRIP) {\n      // Invert the signed value if we are underflowing\n      TargetOffset = 0x1'0000'0000ULL + TargetOffset;\n    } else if (TargetOffset >= 0 && TargetRIP >= 0x1'0000'0000ULL) {\n      // We are overflowing, wrap around\n      TargetOffset = TargetOffset - 0x1'0000'0000ULL;\n    }\n\n    TargetRIP &= 0xFFFFFFFFU;\n  }\n\n  CalculateDeferredFlags();\n  // This is just an unconditional relative literal jump\n  if (Multiblock) {\n    auto JumpBlock = JumpTargets.find(TargetRIP);\n    if (JumpBlock != JumpTargets.end()) {\n      Jump(GetNewJumpBlock(TargetRIP));\n    } else {\n      // If the block isn't a jump target then we need to create an exit block\n      auto Jump_ = Jump();\n\n      // Place after this block for fallthrough behavior\n      auto JumpTarget = CreateNewCodeBlockAfter(GetCurrentBlock());\n      SetJumpTarget(Jump_, JumpTarget);\n      SetCurrentCodeBlock(JumpTarget);\n      StartNewBlock();\n      ExitRelocatedPC(Op, TargetOffset);\n    }\n  } else {\n    ExitRelocatedPC(Op, TargetOffset);\n  }\n}\n\nvoid OpDispatchBuilder::JUMPAbsoluteOp(OpcodeArgs) {\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  BlockSetRIP = true;\n  // This is just an unconditional jump\n  // This uses ModRM to determine its location\n  // No way to use this effectively in multiblock\n  auto RIPOffset = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n\n  // Store the new RIP\n  ExitFunction(RIPOffset);\n}\n\nvoid OpDispatchBuilder::JUMPFARIndirectOp(OpcodeArgs) {\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  BlockSetRIP = true;\n  // This is just an unconditional jump\n  // This uses ModRM to determine its location\n  // No way to use this effectively in multiblock\n  Ref Src = MakeSegmentAddress(Op, Op->Dest);\n  AddressMode SrcCS = {.Base = Src, .Offset = 4, .AddrSize = OpSize::i64Bit};\n  auto RIPOffset = _LoadMemGPRAutoTSO(OpSize::i32Bit, Src, OpSize::i8Bit);\n  auto NewSegmentCS = _LoadMemGPRAutoTSO(OpSize::i16Bit, SrcCS, OpSize::i8Bit);\n\n  // Set up the new CSSegment.\n  _StoreContextGPR(OpSize::i16Bit, NewSegmentCS, offsetof(FEXCore::Core::CPUState, cs_idx));\n  UpdatePrefixFromSegment(NewSegmentCS, FEXCore::X86Tables::DecodeFlags::FLAG_CS_PREFIX);\n\n  // Store the new RIP\n  ExitFunction(RIPOffset);\n}\n\nvoid OpDispatchBuilder::CALLFARIndirectOp(OpcodeArgs) {\n  const auto SrcSize = Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_REX_WIDENING ? OpSize::i64Bit : OpSize::i32Bit;\n\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  BlockSetRIP = true;\n\n  Ref Src = MakeSegmentAddress(Op, Op->Dest);\n  AddressMode SrcCS = {.Base = Src, .Offset = 4, .AddrSize = OpSize::i64Bit};\n  auto RIPOffset = _LoadMemGPRAutoTSO(OpSize::i32Bit, Src, OpSize::i8Bit);\n  auto NewSegmentCS = _LoadMemGPRAutoTSO(OpSize::i16Bit, SrcCS, OpSize::i8Bit);\n  auto CurrentCS = _LoadContextGPR(OpSize::i16Bit, offsetof(FEXCore::Core::CPUState, cs_idx));\n\n  auto NewRIP = GetRelocatedPC(Op);\n\n  // Push the current CS\n  Push(SrcSize, CurrentCS);\n\n  // Push the return address.\n  Push(SrcSize, NewRIP);\n\n  // Set up the new CSSegment.\n  _StoreContextGPR(OpSize::i16Bit, NewSegmentCS, offsetof(FEXCore::Core::CPUState, cs_idx));\n  UpdatePrefixFromSegment(NewSegmentCS, FEXCore::X86Tables::DecodeFlags::FLAG_CS_PREFIX);\n\n  // Store the new RIP\n  ExitFunction(RIPOffset);\n}\n\nvoid OpDispatchBuilder::RETFARIndirectOp(OpcodeArgs) {\n  const auto GPRSize = GetGPROpSize();\n  const auto SrcSize = Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_REX_WIDENING ? OpSize::i64Bit : OpSize::i32Bit;\n\n  Ref SP = _RMWHandle(LoadGPRRegister(X86State::REG_RSP));\n  Ref NewRIP = Pop(SrcSize, SP);\n  Ref NewSegmentCS = Pop(SrcSize, SP);\n\n  // Optional SP offset.\n  if (Op->Src[0].IsLiteral()) {\n    SP = Add(GPRSize, SP, Op->Src[0].Literal());\n  }\n\n  // Store the new stack pointer\n  StoreGPRRegister(X86State::REG_RSP, SP);\n\n  _StoreContextGPR(OpSize::i16Bit, NewSegmentCS, offsetof(FEXCore::Core::CPUState, cs_idx));\n  UpdatePrefixFromSegment(NewSegmentCS, FEXCore::X86Tables::DecodeFlags::FLAG_CS_PREFIX);\n\n  // Store the new RIP\n  ExitFunction(NewRIP);\n  BlockSetRIP = true;\n}\n\nvoid OpDispatchBuilder::TESTOp(OpcodeArgs, uint32_t SrcIndex) {\n  // TEST is an instruction that does an AND between the sources\n  // Result isn't stored in result, only writes to flags\n  Ref Src = LoadSourceGPR(Op, Op->Src[SrcIndex], Op->Flags, {.AllowUpperGarbage = true});\n  Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n\n  const auto Size = OpSizeFromDst(Op);\n  LOGMAN_THROW_A_FMT(Size >= IR::OpSize::i8Bit && Size <= IR::OpSize::i64Bit, \"Invalid size\");\n\n  uint64_t Const;\n  bool AlwaysNonnegative = false;\n  if (IsValueConstant(WrapNode(Src), &Const)) {\n    // Optimize out masking constants\n    if (Const == (Size == OpSize::i64Bit ? ~0ULL : ((1ull << IR::OpSizeAsBits(Size)) - 1))) {\n      Src = Dest;\n    }\n\n    // Optimize test with non-sign bits\n    AlwaysNonnegative = (Const & (1ull << (IR::OpSizeAsBits(Size) - 1))) == 0;\n  }\n\n  if (Dest == Src) {\n    // Optimize out the AND.\n    SetNZP_ZeroCV(Size, Src);\n  } else if (Size < OpSize::i32Bit && AlwaysNonnegative) {\n    // If we know the result is always nonnegative, we can use a 32-bit test.\n    auto Res = _And(OpSize::i32Bit, Dest, Src);\n    CalculatePF(Res);\n    SetNZ_ZeroCV(OpSize::i32Bit, Res);\n  } else {\n    HandleNZ00Write();\n    CalculatePF(_AndWithFlags(Size, Dest, Src));\n  }\n\n  InvalidateAF();\n}\n\nvoid OpDispatchBuilder::ARPLOp(OpcodeArgs) {\n  // ARPL r/m16, r16\n  // If the RPL field in the destination selector is less privileged than the\n  // RPL field in the source selector, then adjust destination RPL to match\n  // source RPL and set ZF=1. Otherwise ZF=0 and destination is unchanged.\n  //\n  // Only ZF is modified by ARPL.\n  constexpr auto Size = OpSize::i16Bit;\n\n  Ref Dest = LoadSourceGPR_WithOpSize(Op, Op->Dest, Size, Op->Flags, {.AllowUpperGarbage = true});\n  Ref Src = LoadSourceGPR_WithOpSize(Op, Op->Src[0], Size, Op->Flags, {.AllowUpperGarbage = true});\n\n  // RPL is the low two bits of the selector.\n  Ref DestRPL = _Bfe(OpSize::i32Bit, 2, 0, Dest);\n  Ref SrcRPL = _Bfe(OpSize::i32Bit, 2, 0, Src);\n\n  // NeedUpdate is 1 when DestRPL < SrcRPL, else 0.\n  Ref NeedUpdate = _Select(OpSize::i32Bit, OpSize::i32Bit, CondClass::ULT, DestRPL, SrcRPL, Constant(1), Constant(0));\n  SetRFLAG<FEXCore::X86State::RFLAG_ZF_RAW_LOC>(NeedUpdate);\n\n  // Compute adjusted destination selector: (Dest & ~3) | SrcRPL.\n  auto NewDest = _Bfxil(OpSize::i32Bit, 2, 0, Dest, SrcRPL);\n\n  // Conditionally select updated selector based on NeedUpdate.\n  Ref FinalDest = _Select(OpSize::i32Bit, OpSize::i32Bit, CondClass::NEQ, NeedUpdate, Constant(0), NewDest, Dest);\n  StoreResultGPR_WithOpSize(Op, Op->Dest, FinalDest, Size);\n}\n\nvoid OpDispatchBuilder::MOVSXDOp(OpcodeArgs) {\n  // This instruction is a bit special\n  // if SrcSize == 2\n  //  Then lower 16 bits of destination is written without changing the upper 48 bits\n  // else /* Size == 4 */\n  //  if REX_WIDENING:\n  //   Sext(32, Src)\n  //  else\n  //   Zext(32, Src)\n  //\n  auto Size = std::min<IR::OpSize>(OpSize::i32Bit, OpSizeFromSrc(Op));\n  bool Sext = (Size != OpSize::i16Bit) && Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_REX_WIDENING;\n\n  Ref Src = LoadSourceGPR_WithOpSize(Op, Op->Src[0], Size, Op->Flags, {.AllowUpperGarbage = Sext});\n  if (Size == OpSize::i16Bit) {\n    // This'll make sure to insert in to the lower 16bits without modifying upper bits\n    StoreResultGPR_WithOpSize(Op, Op->Dest, Src, Size);\n  } else if (Sext) {\n    // With REX.W then Sext\n    Src = _Sbfe(OpSize::i64Bit, IR::OpSizeAsBits(Size), 0, Src);\n    StoreResultGPR(Op, Src);\n  } else {\n    // Without REX.W then Zext (store result implicitly zero extends)\n    StoreResultGPR(Op, Src);\n  }\n}\n\nvoid OpDispatchBuilder::MOVSXOp(OpcodeArgs) {\n  // Load garbage in upper bits, since we're sign extending anyway\n  const auto Size = OpSizeFromSrc(Op);\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n\n  // Sign-extend to DstSize and zero-extend to the register size, using a fast\n  // path for 32-bit dests where the native 32-bit Sbfe zero extends the top.\n  const auto DstSize = OpSizeFromDst(Op);\n  Src = _Sbfe(DstSize == OpSize::i64Bit ? OpSize::i64Bit : OpSize::i32Bit, IR::OpSizeAsBits(Size), 0, Src);\n  StoreResultGPR(Op, Op->Dest, Src);\n}\n\nvoid OpDispatchBuilder::MOVZXOp(OpcodeArgs) {\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n  // Store result implicitly zero extends\n  StoreResultGPR(Op, Src);\n}\n\nvoid OpDispatchBuilder::CMPOp(OpcodeArgs, uint32_t SrcIndex) {\n  // CMP is an instruction that does a SUB between the sources\n  // Result isn't stored in result, only writes to flags\n  Ref Src = LoadSourceGPR(Op, Op->Src[SrcIndex], Op->Flags, {.AllowUpperGarbage = true});\n  Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n  CalculateFlags_SUB(OpSizeFromSrc(Op), Dest, Src);\n}\n\nvoid OpDispatchBuilder::CQOOp(OpcodeArgs) {\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n  auto Size = OpSizeFromSrc(Op);\n  Ref Upper = _Sbfe(std::max(OpSize::i32Bit, Size), 1, GetSrcBitSize(Op) - 1, Src);\n\n  StoreResultGPR(Op, Upper);\n}\n\nvoid OpDispatchBuilder::XCHGOp(OpcodeArgs) {\n  // Load both the source and the destination\n  if (Op->OP == 0x90 && Op->Src[0].IsGPR() && Op->Src[0].Data.GPR.GPR == FEXCore::X86State::REG_RAX && Op->Dest.IsGPR() &&\n      Op->Dest.Data.GPR.GPR == FEXCore::X86State::REG_RAX) {\n    // This is one heck of a sucky special case\n    // If we are the 0x90 XCHG opcode (Meaning source is GPR RAX)\n    // and destination register is ALSO RAX\n    // and in this very specific case we are 32bit or above\n    // Then this is a no-op\n    // This is because 0x90 without a prefix is technically `xchg eax, eax`\n    // But this would result in a zext on 64bit, which would ruin the no-op nature of the instruction\n    // So x86-64 spec mandates this special case that even though it is a 32bit instruction and\n    // is supposed to zext the result, it is a true no-op\n    //\n    // x86 spec text here:\n    //\n    //    XCHG (E)AX, (E)AX (encoded instruction byte is 90H) is an alias for\n    //    NOP regardless of data size prefixes, including REX.W.\n    //\n    // Note that also includes 16-bit so we don't gate this on size. The\n    // sequence (66 90) is a valid two-byte nop that we also ignore.\n    if (Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_REP_PREFIX) {\n      // If this instruction has a REP prefix then this is architecturally\n      // defined to be a `PAUSE` instruction. On older processors this ends up\n      // being a true `REP NOP` which is why they stuck this here.\n      _Yield();\n    }\n    return;\n  }\n\n  // AllowUpperGarbage: OK to allow as it will be overwritten by StoreResult.\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n  if (DestIsMem(Op)) {\n    HandledLock = (Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_LOCK) != 0;\n\n    Ref Dest = MakeSegmentAddress(Op, Op->Dest);\n    if (IsMonoBackpatcherBlock) {\n      _MonoBackpatcherWrite(OpSizeFromSrc(Op), Src, Dest);\n    } else {\n      auto Result = _AtomicSwap(OpSizeFromSrc(Op), Src, Dest);\n      StoreResultGPR(Op, Op->Src[0], Result);\n    }\n  } else {\n    // AllowUpperGarbage: OK to allow as it will be overwritten by StoreResult.\n    Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n\n    // Swap the contents\n    // Order matters here since we don't want to swap context contents for one that effects the other\n    StoreResultGPR(Op, Op->Dest, Src);\n    StoreResultGPR(Op, Op->Src[0], Dest);\n  }\n}\n\nvoid OpDispatchBuilder::CDQOp(OpcodeArgs) {\n  const auto DstSize = OpSizeFromDst(Op);\n  const auto SrcSize = DstSize / 2;\n  Ref Src = LoadGPRRegister(X86State::REG_RAX, SrcSize, 0, true);\n\n  Src = _Sbfe(DstSize <= OpSize::i32Bit ? OpSize::i32Bit : OpSize::i64Bit, IR::OpSizeAsBits(SrcSize), 0, Src);\n\n  StoreResultGPR_WithOpSize(Op, Op->Dest, Src, DstSize);\n}\n\nvoid OpDispatchBuilder::SAHFOp(OpcodeArgs) {\n  // Extract AH\n  Ref Src = LoadGPRRegister(X86State::REG_RAX, OpSize::i8Bit, 8);\n\n  // Clear bits that aren't supposed to be set\n  Src = _Andn(OpSize::i64Bit, Src, Constant(0b101000));\n\n  // Set the bit that is always set here\n  Src = _Or(OpSize::i64Bit, Src, _InlineConstant(0b10));\n\n  // Store the lower 8 bits in to RFLAGS\n  SetPackedRFLAG(true, Src);\n}\nvoid OpDispatchBuilder::LAHFOp(OpcodeArgs) {\n  // Load the lower 8 bits of the Rflags register\n  auto RFLAG = GetPackedRFLAG(0xFF);\n\n  // Store the lower 8 bits of the rflags register in to AH\n  StoreGPRRegister(X86State::REG_RAX, RFLAG, OpSize::i8Bit, 8);\n}\n\nvoid OpDispatchBuilder::FLAGControlOp(OpcodeArgs) {\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  switch (Op->OP) {\n  case 0xF5: // CMC\n    CarryInvert();\n    break;\n  case 0xF8: // CLC\n    SetCFInverted(Constant(1));\n    break;\n  case 0xF9: // STC\n    SetCFInverted(Constant(0));\n    break;\n  case 0xFC: // CLD\n    // Transformed\n    StoreDF(Constant(1));\n    break;\n  case 0xFD: // STD\n    StoreDF(Constant(-1));\n    break;\n  }\n}\n\n\nvoid OpDispatchBuilder::MOVSegOp(OpcodeArgs, bool ToSeg) {\n  // In x86-64 mode the accesses to the segment registers end up being constant zero moves\n  // Aside from FS/GS\n  // In x86-64 mode the accesses to segment registers can actually still touch the segments\n  // These write to the selector portion of the register\n  //\n  // FS and GS are specially handled here though\n  // AMD documentation is /wrong/ in this regard\n  // AMD documentation claims that the MOV to SReg and POP SReg registers will load a 32bit\n  // value in to the HIDDEN portions of the FS and GS registers /OR/ ignored if a null selector is\n  // selected for the registers\n  // This statement is actually untrue, the instructions will /actually/ load 16bits in to the selector portion of the register!\n  // Tested on a Zen+ CPU, the selector is the portion that is modified!\n  // We don't currently support FS/GS selector modifying, so this needs to be asserted out\n  // The loads here also load the selector, NOT the base\n\n  if (ToSeg) {\n    Ref Src = LoadSourceGPR_WithOpSize(Op, Op->Src[0], OpSize::i16Bit, Op->Flags);\n\n    switch (Op->Dest.Data.GPR.GPR) {\n    case FEXCore::X86State::REG_RAX: // ES\n    case FEXCore::X86State::REG_R8:  // ES\n      _StoreContextGPR(OpSize::i16Bit, Src, offsetof(FEXCore::Core::CPUState, es_idx));\n      UpdatePrefixFromSegment(Src, FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX);\n      break;\n    case FEXCore::X86State::REG_RBX: // DS\n    case FEXCore::X86State::REG_R11: // DS\n      _StoreContextGPR(OpSize::i16Bit, Src, offsetof(FEXCore::Core::CPUState, ds_idx));\n      UpdatePrefixFromSegment(Src, FEXCore::X86Tables::DecodeFlags::FLAG_DS_PREFIX);\n      break;\n    case FEXCore::X86State::REG_RCX: // CS\n    case FEXCore::X86State::REG_R9:  // CS\n      // CPL3 can't write to this\n      Break(FEXCore::IR::BreakDefinition {\n        .ErrorRegister = 0,\n        .Signal = SIGILL,\n        .TrapNumber = 0,\n        .si_code = 0,\n      });\n      break;\n    case FEXCore::X86State::REG_RDX: // SS\n    case FEXCore::X86State::REG_R10: // SS\n      _StoreContextGPR(OpSize::i16Bit, Src, offsetof(FEXCore::Core::CPUState, ss_idx));\n      UpdatePrefixFromSegment(Src, FEXCore::X86Tables::DecodeFlags::FLAG_SS_PREFIX);\n      break;\n    case FEXCore::X86State::REG_RBP: // GS\n    case FEXCore::X86State::REG_R13: // GS\n      if (!Is64BitMode) {\n        _StoreContextGPR(OpSize::i16Bit, Src, offsetof(FEXCore::Core::CPUState, gs_idx));\n        UpdatePrefixFromSegment(Src, FEXCore::X86Tables::DecodeFlags::FLAG_GS_PREFIX);\n      } else {\n        LogMan::Msg::EFmt(\"We don't support modifying GS selector in 64bit mode!\");\n        DecodeFailure = true;\n      }\n      break;\n    case FEXCore::X86State::REG_RSP: // FS\n    case FEXCore::X86State::REG_R12: // FS\n      if (!Is64BitMode) {\n        _StoreContextGPR(OpSize::i16Bit, Src, offsetof(FEXCore::Core::CPUState, fs_idx));\n        UpdatePrefixFromSegment(Src, FEXCore::X86Tables::DecodeFlags::FLAG_FS_PREFIX);\n      } else {\n        LogMan::Msg::EFmt(\"We don't support modifying FS selector in 64bit mode!\");\n        DecodeFailure = true;\n      }\n      break;\n    default: UnimplementedOp(Op); return;\n    }\n  } else {\n    Ref Segment {};\n\n    switch (Op->Src[0].Data.GPR.GPR) {\n    case FEXCore::X86State::REG_RAX: // ES\n    case FEXCore::X86State::REG_R8:  // ES\n      Segment = _LoadContextGPR(OpSize::i16Bit, offsetof(FEXCore::Core::CPUState, es_idx));\n      break;\n    case FEXCore::X86State::REG_RBX: // DS\n    case FEXCore::X86State::REG_R11: // DS\n      Segment = _LoadContextGPR(OpSize::i16Bit, offsetof(FEXCore::Core::CPUState, ds_idx));\n      break;\n    case FEXCore::X86State::REG_RCX: // CS\n    case FEXCore::X86State::REG_R9:  // CS\n      Segment = _LoadContextGPR(OpSize::i16Bit, offsetof(FEXCore::Core::CPUState, cs_idx));\n      break;\n    case FEXCore::X86State::REG_RDX: // SS\n    case FEXCore::X86State::REG_R10: // SS\n      Segment = _LoadContextGPR(OpSize::i16Bit, offsetof(FEXCore::Core::CPUState, ss_idx));\n      break;\n    case FEXCore::X86State::REG_RBP: // GS\n    case FEXCore::X86State::REG_R13: // GS\n      if (Is64BitMode) {\n        Segment = Constant(0);\n      } else {\n        Segment = _LoadContextGPR(OpSize::i16Bit, offsetof(FEXCore::Core::CPUState, gs_idx));\n      }\n      break;\n    case FEXCore::X86State::REG_RSP: // FS\n    case FEXCore::X86State::REG_R12: // FS\n      if (Is64BitMode) {\n        Segment = Constant(0);\n      } else {\n        Segment = _LoadContextGPR(OpSize::i16Bit, offsetof(FEXCore::Core::CPUState, fs_idx));\n      }\n      break;\n    default: UnimplementedOp(Op); return;\n    }\n    if (DestIsMem(Op)) {\n      // If the destination is memory then we always store 16-bits only\n      StoreResultGPR_WithOpSize(Op, Op->Dest, Segment, OpSize::i16Bit);\n    } else {\n      // If the destination is a GPR then we follow register storing rules\n      StoreResultGPR(Op, Segment);\n    }\n  }\n}\n\nvoid OpDispatchBuilder::MOVOffsetOp(OpcodeArgs) {\n  switch (Op->OP) {\n  case 0xA0:\n  case 0xA1: {\n    // Source is memory(literal)\n    // Dest is GPR\n    auto Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.ForceLoad = true});\n    StoreResultGPR(Op, Op->Dest, Src);\n    break;\n  }\n  case 0xA2:\n  case 0xA3: {\n    // Source is GPR\n    // Dest is memory(literal)\n    Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n\n    // This one is a bit special since the destination is a literal\n    // So the destination gets stored in Src[1]\n    StoreResultGPR(Op, Op->Src[1], Src);\n    break;\n  }\n  }\n}\n\nvoid OpDispatchBuilder::CPUIDOp(OpcodeArgs) {\n  const auto GPRSize = GetGPROpSize();\n\n  Ref Src = LoadSourceGPR_WithOpSize(Op, Op->Src[0], GPRSize, Op->Flags);\n  Ref Leaf = LoadGPRRegister(X86State::REG_RCX);\n\n  Ref RAX = _AllocateGPR(false);\n  Ref RBX = _AllocateGPR(false);\n  Ref RCX = _AllocateGPR(false);\n  Ref RDX = _AllocateGPR(false);\n\n  _CPUID(Src, Leaf, RAX, RBX, RCX, RDX);\n\n  StoreGPRRegister(X86State::REG_RAX, RAX);\n  StoreGPRRegister(X86State::REG_RBX, RBX);\n  StoreGPRRegister(X86State::REG_RCX, RCX);\n  StoreGPRRegister(X86State::REG_RDX, RDX);\n}\n\nuint32_t OpDispatchBuilder::GetConstantShift(X86Tables::DecodedOp Op, bool Is1Bit) {\n  if (Is1Bit) {\n    return 1;\n  } else {\n    // x86 masks the shift by 0x3F or 0x1F depending on size of op\n    const auto Size = OpSizeFromSrc(Op);\n    uint64_t Mask = Size == OpSize::i64Bit ? 0x3F : 0x1F;\n\n    return Op->Src[1].Literal() & Mask;\n  }\n}\n\nvoid OpDispatchBuilder::XGetBVOp(OpcodeArgs) {\n  Ref Function = LoadGPRRegister(X86State::REG_RCX);\n\n  auto RAX = _AllocateGPR(false);\n  auto RDX = _AllocateGPR(false);\n  _XGetBV(Function, RAX, RDX);\n\n  StoreGPRRegister(X86State::REG_RAX, RAX);\n  StoreGPRRegister(X86State::REG_RDX, RDX);\n}\n\nvoid OpDispatchBuilder::SHLOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n  auto Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n  auto Src = LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true});\n\n  Ref Result = _Lshl(Size == OpSize::i64Bit ? OpSize::i64Bit : OpSize::i32Bit, Dest, Src);\n  HandleShift(Op, Result, Dest, ShiftType::LSL, Src);\n}\n\nvoid OpDispatchBuilder::SHLImmediateOp(OpcodeArgs, bool SHL1Bit) {\n  Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n\n  uint64_t Shift = GetConstantShift(Op, SHL1Bit);\n  const auto Size = GetSrcBitSize(Op);\n\n  Ref Result = _Lshl(Size == 64 ? OpSize::i64Bit : OpSize::i32Bit, Dest, Constant(Shift));\n\n  CalculateFlags_ShiftLeftImmediate(OpSizeFromSrc(Op), Result, Dest, Shift);\n  CalculateDeferredFlags();\n  StoreResultGPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::SHROp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n  auto Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = Size >= OpSize::i32Bit});\n  auto Src = LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true});\n\n  auto ALUOp = _Lshr(std::max(OpSize::i32Bit, Size), Dest, Src);\n  HandleShift(Op, ALUOp, Dest, ShiftType::LSR, Src);\n}\n\nvoid OpDispatchBuilder::SHRImmediateOp(OpcodeArgs, bool SHR1Bit) {\n  const auto Size = GetSrcBitSize(Op);\n  auto Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = Size >= 32});\n\n  uint64_t Shift = GetConstantShift(Op, SHR1Bit);\n  auto ALUOp = _Lshr(Size == 64 ? OpSize::i64Bit : OpSize::i32Bit, Dest, Constant(Shift));\n\n  CalculateFlags_ShiftRightImmediate(OpSizeFromSrc(Op), ALUOp, Dest, Shift);\n  CalculateDeferredFlags();\n  StoreResultGPR(Op, ALUOp);\n}\n\nvoid OpDispatchBuilder::SHLDOp(OpcodeArgs) {\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  const auto Size = GetSrcBitSize(Op);\n\n  // Allow garbage on the Src if it will be ignored by the Lshr below\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = Size >= 32});\n  Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags);\n\n  // Allow garbage on the shift, we're masking it anyway.\n  Ref Shift = LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true});\n\n  // x86 masks the shift by 0x3F or 0x1F depending on size of op.\n  if (Size == 64) {\n    Shift = _And(OpSize::i64Bit, Shift, _InlineConstant(0x3F));\n  } else {\n    Shift = _And(OpSize::i64Bit, Shift, _InlineConstant(0x1F));\n  }\n\n  // a64 masks the bottom bits, so if we're using a native 32/64-bit shift, we\n  // can negate to do the subtract (it's congruent), which saves a constant.\n  auto ShiftRight = Size >= 32 ? _Neg(OpSize::i64Bit, Shift) : Sub(OpSize::i64Bit, Constant(Size), Shift);\n\n  auto Tmp1 = _Lshl(OpSize::i64Bit, Dest, Shift);\n  auto Tmp2 = _Lshr(Size == 64 ? OpSize::i64Bit : OpSize::i32Bit, Src, ShiftRight);\n\n  Ref Res = _Or(OpSize::i64Bit, Tmp1, Tmp2);\n\n  // If shift count was zero then output doesn't change\n  // Needs to be checked for the 32bit operand case\n  // where shift = 0 and the source register still gets Zext\n  //\n  // TODO: With a backwards pass ahead-of-time, we could stick this in the\n  // if(shift) used for flags.\n  //\n  // TODO: This whole function wants to be wrapped in the if. Maybe b/w pass is\n  // a good idea after all.\n  Res = _Select(OpSize::i64Bit, OpSize::i64Bit, CondClass::EQ, Shift, Constant(0), Dest, Res);\n\n  HandleShift(Op, Res, Dest, ShiftType::LSL, Shift);\n}\n\nvoid OpDispatchBuilder::SHLDImmediateOp(OpcodeArgs) {\n  uint64_t Shift = GetConstantShift(Op, false);\n  const auto Size = GetSrcBitSize(Op);\n\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = Size >= 32});\n  Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = Size >= 32});\n\n  if (Shift != 0) {\n    Ref Res {};\n    if (Size < 32) {\n      Ref ShiftLeft = Constant(Shift);\n      auto ShiftRight = Size - Shift;\n\n      auto Tmp1 = _Lshl(OpSize::i64Bit, Dest, ShiftLeft);\n      Ref Tmp2 = ShiftRight ? _Lshr(OpSize::i32Bit, Src, Constant(ShiftRight)) : Src;\n\n      Res = _Or(OpSize::i64Bit, Tmp1, Tmp2);\n    } else {\n      // 32-bit and 64-bit SHLD behaves like an EXTR where the lower bits are filled from the source.\n      Res = _Extr(OpSizeFromSrc(Op), Dest, Src, Size - Shift);\n    }\n\n    CalculateFlags_ShiftLeftImmediate(OpSizeFromSrc(Op), Res, Dest, Shift);\n    CalculateDeferredFlags();\n    StoreResultGPR(Op, Res);\n  } else if (Shift == 0 && Size == 32) {\n    // Ensure Zext still occurs\n    StoreResultGPR(Op, Dest);\n  }\n}\n\nvoid OpDispatchBuilder::SHRDOp(OpcodeArgs) {\n  // Calculate flags early.\n  // This instruction conditionally generates flags so we need to insure sane state going in.\n  CalculateDeferredFlags();\n\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n  Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags);\n\n  Ref Shift = LoadGPRRegister(X86State::REG_RCX);\n\n  const auto Size = GetDstBitSize(Op);\n\n  // x86 masks the shift by 0x3F or 0x1F depending on size of op\n  if (Size == 64) {\n    Shift = _And(OpSize::i64Bit, Shift, _InlineConstant(0x3F));\n  } else {\n    Shift = _And(OpSize::i64Bit, Shift, _InlineConstant(0x1F));\n  }\n\n  auto ShiftLeft = Sub(OpSize::i64Bit, Constant(Size), Shift);\n\n  auto Tmp1 = _Lshr(Size == 64 ? OpSize::i64Bit : OpSize::i32Bit, Dest, Shift);\n  auto Tmp2 = _Lshl(OpSize::i64Bit, Src, ShiftLeft);\n\n  Ref Res = _Or(OpSize::i64Bit, Tmp1, Tmp2);\n\n  // If shift count was zero then output doesn't change\n  // Needs to be checked for the 32bit operand case\n  // where shift = 0 and the source register still gets Zext\n  Res = _Select(OpSize::i64Bit, OpSize::i64Bit, CondClass::EQ, Shift, Constant(0), Dest, Res);\n\n  HandleShift(Op, Res, Dest, ShiftType::LSR, Shift);\n}\n\nvoid OpDispatchBuilder::SHRDImmediateOp(OpcodeArgs) {\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n  Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags);\n\n  uint64_t Shift = GetConstantShift(Op, false);\n  const auto Size = GetSrcBitSize(Op);\n\n  if (Shift != 0) {\n    Ref Res {};\n    if (Size < 32) {\n      Ref ShiftRight = Constant(Shift);\n      auto ShiftLeft = Constant(Size - Shift);\n\n      auto Tmp1 = _Lshr(OpSize::i32Bit, Dest, ShiftRight);\n      auto Tmp2 = _Lshl(OpSize::i64Bit, Src, ShiftLeft);\n\n      Res = _Or(OpSize::i64Bit, Tmp1, Tmp2);\n    } else {\n      // 32-bit and 64-bit SHRD behaves like an EXTR where the upper bits are filled from the source.\n      Res = _Extr(OpSizeFromSrc(Op), Src, Dest, Shift);\n    }\n\n    StoreResultGPR(Op, Res);\n    CalculateFlags_ShiftRightDoubleImmediate(OpSizeFromSrc(Op), Res, Dest, Shift);\n  } else if (Shift == 0 && Size == 32) {\n    // Ensure Zext still occurs\n    StoreResultGPR(Op, Dest);\n  }\n}\n\nvoid OpDispatchBuilder::ASHROp(OpcodeArgs, bool Immediate, bool SHR1Bit) {\n  const auto Size = OpSizeFromSrc(Op);\n  const auto OpSize = std::max(OpSize::i32Bit, OpSizeFromDst(Op));\n\n  // If Size < 4, then we Sbfe the Dest so we can have garbage.\n  // Otherwise, if Size = Opsize, then both are 4 or 8 and match the a64\n  // semantics directly, so again we can have garbage. The only case where we\n  // need zero-extension here is when the sizes mismatch.\n  auto Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = (OpSize == Size) || (Size < OpSize::i32Bit)});\n\n  if (Size < OpSize::i32Bit) {\n    Dest = _Sbfe(OpSize::i64Bit, IR::OpSizeAsBits(Size), 0, Dest);\n  }\n\n  if (Immediate) {\n    uint64_t Shift = GetConstantShift(Op, SHR1Bit);\n    Ref Result = _Ashr(OpSize, Dest, Constant(Shift));\n\n    CalculateFlags_SignShiftRightImmediate(OpSizeFromSrc(Op), Result, Dest, Shift);\n    CalculateDeferredFlags();\n    StoreResultGPR(Op, Result);\n  } else {\n    auto Src = LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true});\n    Ref Result = _Ashr(OpSize, Dest, Src);\n\n    HandleShift(Op, Result, Dest, ShiftType::ASR, Src);\n  }\n}\n\nvoid OpDispatchBuilder::RotateOp(OpcodeArgs, bool Left, bool IsImmediate, bool Is1Bit) {\n  CalculateDeferredFlags();\n\n  const uint32_t Size = GetSrcBitSize(Op);\n  const auto OpSize = Size == 64 ? OpSize::i64Bit : OpSize::i32Bit;\n  uint64_t UnmaskedConst {};\n\n  // x86 masks the shift by 0x3F or 0x1F depending on size of op. But it's\n  // equivalent to mask to the actual size of the op, that way we can bound\n  // things tighter for 8-bit later in the function.\n  uint64_t Mask = Size == 8 ? 7 : (Size == 64 ? 0x3F : 0x1F);\n\n  ArithRef UnmaskedSrc;\n  if (Is1Bit || IsImmediate) {\n    UnmaskedConst = GetConstantShift(Op, Is1Bit);\n    UnmaskedSrc = ARef(UnmaskedConst);\n  } else {\n    UnmaskedSrc = ARef(LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true}));\n  }\n  auto Src = UnmaskedSrc.And(Mask);\n\n  // We fill the upper bits so we allow garbage on load.\n  auto Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n\n  if (Size < 32) {\n    // ARM doesn't support 8/16bit rotates. Emulate with an insert\n    // StoreResult truncates back to a 8/16 bit value\n    Dest = _Bfi(OpSize, Size, Left ? (32 - Size) : Size, Dest, Dest);\n  }\n\n  // To rotate 64-bits left, right-rotate by (64 - Shift) = -Shift mod 64.\n  auto Res = _Ror(OpSize, Dest, (Left ? Src.Neg() : Src).Ref());\n  StoreResultGPR(Op, Res);\n\n  if (Is1Bit || IsImmediate) {\n    if (UnmaskedSrc.C) {\n      // Extract the last bit shifted in to CF\n      SetCFDirect(Res, Left ? 0 : Size - 1, true);\n\n      // For ROR, OF is the XOR of the new CF bit and the most significant bit of the result.\n      // For ROL, OF is the LSB and MSB XOR'd together.\n      // OF is architecturally only defined for 1-bit rotate.\n      if (UnmaskedSrc.C == 1) {\n        auto NewOF = _XorShift(OpSize, Res, Res, ShiftType::LSR, Left ? Size - 1 : 1);\n        SetRFLAG<FEXCore::X86State::RFLAG_OF_RAW_LOC>(NewOF, Left ? 0 : Size - 2, true);\n      }\n    }\n  } else {\n    HandleNZCVWrite();\n    RectifyCarryInvert(true);\n\n    // We deferred the masking for 8-bit to the flag section, do it here.\n    if (Size == 8) {\n      Src = UnmaskedSrc.And(0x1F);\n    }\n\n    _RotateFlags(OpSizeFromSrc(Op), Res, Src.Ref(), Left);\n  }\n}\n\nvoid OpDispatchBuilder::ANDNBMIOp(OpcodeArgs) {\n  auto* Src1 = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n  auto* Src2 = LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true});\n\n  auto Dest = _Andn(OpSizeFromSrc(Op), Src2, Src1);\n\n  StoreResultGPR(Op, Dest);\n  CalculateFlags_Logical(OpSizeFromSrc(Op), Dest);\n}\n\nvoid OpDispatchBuilder::BEXTRBMIOp(OpcodeArgs) {\n  // Essentially (Src1 >> Start) & ((1 << Length) - 1)\n  // along with some edge-case handling and flag setting.\n\n  LOGMAN_THROW_A_FMT(Op->InstSize >= 4, \"No masking needed\");\n  auto* Src1 = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n  auto* Src2 = LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true});\n\n  const auto Size = OpSizeFromSrc(Op);\n  const auto SrcSize = IR::OpSizeAsBits(Size);\n  const auto MaxSrcBit = SrcSize - 1;\n  auto MaxSrcBitOp = Constant(MaxSrcBit);\n\n  // Shift the operand down to the starting bit\n  auto Start = _Bfe(OpSizeFromSrc(Op), 8, 0, Src2);\n  auto Shifted = _Lshr(Size, Src1, Start);\n\n  // Shifts larger than operand size need to be set to zero.\n  auto SanitizedShifted = _Select(Size, Size, CondClass::ULE, Start, MaxSrcBitOp, Shifted, Constant(0));\n\n  // Now handle the length specifier.\n  auto Length = _Bfe(Size, 8, 8, Src2);\n\n  // Now build up the mask\n  // (1 << Length) - 1 = ~(~0 << Length)\n  auto AllOnes = Constant(~0ull);\n  auto InvertedMask = _Lshl(Size, AllOnes, Length);\n\n  // Now put it all together and make the result.\n  auto Masked = _Andn(Size, SanitizedShifted, InvertedMask);\n\n  // Sanitize the length. If it is above the max, we don't do the masking.\n  auto Dest = _Select(Size, Size, CondClass::ULE, Length, MaxSrcBitOp, Masked, SanitizedShifted);\n\n  // Finally store the result.\n  StoreResultGPR(Op, Dest);\n\n  // ZF is set properly. CF and OF are defined as being set to zero. SF, PF, and\n  // AF are undefined.\n  SetNZ_ZeroCV(GetOpSize(Dest), Dest);\n  InvalidatePF_AF();\n}\n\nvoid OpDispatchBuilder::BLSIBMIOp(OpcodeArgs) {\n  // Equivalent to performing: SRC & -SRC\n  LOGMAN_THROW_A_FMT(Op->InstSize >= 4, \"No masking needed\");\n  const auto Size = OpSizeFromSrc(Op);\n\n  auto* Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n  auto NegatedSrc = _Neg(Size, Src);\n  auto Result = _And(Size, Src, NegatedSrc);\n\n  StoreResultGPR(Op, Result);\n\n  // CF is cleared if Src is zero, otherwise it's set. However, Src is zero iff\n  // Result is zero, so we can test the result instead. So, CF is just the\n  // inverted ZF.\n  //\n  // ZF/SF/OF set as usual.\n  SetNZ_ZeroCV(Size, Result);\n  InvalidatePF_AF();\n  SetCFInverted(GetRFLAG(X86State::RFLAG_ZF_RAW_LOC));\n}\n\nvoid OpDispatchBuilder::BLSMSKBMIOp(OpcodeArgs) {\n  // Equivalent to: (Src - 1) ^ Src\n  LOGMAN_THROW_A_FMT(Op->InstSize >= 4, \"No masking needed\");\n  const auto Size = OpSizeFromSrc(Op);\n\n  auto* Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n  auto Result = _Xor(Size, Sub(Size, Src, 1), Src);\n\n  StoreResultGPR(Op, Result);\n  InvalidatePF_AF();\n\n  // CF set according to the Src\n  auto CFInv = To01(OpSize::i64Bit, Src);\n\n  // The output of BLSMSK is always nonzero, so TST will clear Z (along with C\n  // and O) while setting S.\n  SetNZ_ZeroCV(Size, Result);\n  SetCFInverted(CFInv);\n}\n\nvoid OpDispatchBuilder::BLSRBMIOp(OpcodeArgs) {\n  // Equivalent to: (Src - 1) & Src\n  LOGMAN_THROW_A_FMT(Op->InstSize >= 4, \"No masking needed\");\n  const auto Size = OpSizeFromSrc(Op);\n\n  auto* Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n  auto Result = _And(Size, Sub(Size, Src, 1), Src);\n\n  StoreResultGPR(Op, Result);\n\n  auto CFInv = To01(OpSize::i64Bit, Src);\n\n  SetNZ_ZeroCV(Size, Result);\n  SetCFInverted(CFInv);\n  InvalidatePF_AF();\n}\n\n// Handles SARX, SHLX, and SHRX\nvoid OpDispatchBuilder::BMI2Shift(OpcodeArgs) {\n  // In the event the source is a memory operand, use the\n  // exact width instead of the GPR size.\n  const auto GPRSize = GetGPROpSize();\n  const auto Size = OpSizeFromSrc(Op);\n  const auto SrcSize = Op->Src[0].IsGPR() ? GPRSize : Size;\n\n  auto* Src = LoadSourceGPR_WithOpSize(Op, Op->Src[0], SrcSize, Op->Flags);\n  auto* Shift = LoadSourceGPR_WithOpSize(Op, Op->Src[1], GPRSize, Op->Flags, {.AllowUpperGarbage = true});\n\n  Ref Result;\n  if (Op->OP == 0x6F7) {\n    // SARX\n    Result = _Ashr(Size, Src, Shift);\n  } else if (Op->OP == 0x5F7) {\n    // SHLX\n    Result = _Lshl(Size, Src, Shift);\n  } else {\n    // SHRX\n    Result = _Lshr(Size, Src, Shift);\n  }\n\n  StoreResultGPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::BZHI(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n  const auto OperandSize = IR::OpSizeAsBits(Size);\n\n  // In 32-bit mode we only look at bottom 32-bit, no 8 or 16-bit BZHI so no\n  // need to zero-extend sources\n  auto* Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n\n  auto* Index = LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true});\n\n  // Clear the high bits specified by the index. A64 only considers bottom bits\n  // of the shift, so we don't need to mask bottom 8-bits ourselves.\n  // Out-of-bounds results ignored after.\n  auto Mask = _Lshl(Size, Constant(-1), Index);\n  auto MaskResult = _Andn(Size, Src, Mask);\n\n  // If the index is above OperandSize, we don't clear anything. BZHI only\n  // considers the bottom 8-bits, so we really want to know if the bottom 8-bits\n  // have their top bits set. Test exactly that.\n  //\n  // Because we're clobbering flags internally we ignore all carry invert\n  // shenanigans and use the raw versions here.\n  _TestNZ(OpSize::i64Bit, Index, Constant(0xFF & ~(OperandSize - 1)));\n  auto Result = _NZCVSelect(Size, CondClass::NEQ, Src, MaskResult);\n  StoreResultGPR(Op, Result);\n\n  auto CFInv = _NZCVSelect01(CondClass::EQ);\n\n  InvalidatePF_AF();\n  SetNZ_ZeroCV(Size, Result);\n  SetCFInverted(CFInv);\n}\n\nvoid OpDispatchBuilder::RORX(OpcodeArgs) {\n  const auto SrcSize = OpSizeFromSrc(Op);\n  const auto SrcSizeBits = IR::OpSizeAsBits(SrcSize);\n  const auto Amount = Op->Src[1].Literal() & (SrcSizeBits - 1);\n  const auto GPRSize = GetGPROpSize();\n\n  const auto DoRotation = Amount != 0 && Amount < SrcSizeBits;\n  const auto IsSameGPR = Op->Src[0].IsGPR() && Op->Dest.IsGPR() && Op->Src[0].Data.GPR.GPR == Op->Dest.Data.GPR.GPR;\n  const auto SrcSizeIsGPRSize = SrcSize == GPRSize;\n\n  // If we don't need to rotate and our source is the same as the destination\n  // then we don't need to do anything at all. We still need to be careful,\n  // since 32-bit operations on 64-bit mode still need to zero-extend the\n  // destination register. So also compare source size and GPR size.\n  //\n  // Very unlikely, but hey, we can do nothing faster.\n  if (!DoRotation && IsSameGPR && SrcSizeIsGPRSize) [[unlikely]] {\n    return;\n  }\n\n  auto* Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n  auto* Result = Src;\n  if (DoRotation) [[likely]] {\n    Result = _Ror(OpSizeFromSrc(Op), Src, _InlineConstant(Amount));\n  }\n\n  StoreResultGPR(Op, Result);\n}\n\nvoid OpDispatchBuilder::MULX(OpcodeArgs) {\n  // RDX is the implied source operand in the instruction\n  const auto OpSize = OpSizeFromSrc(Op);\n\n  // Src1 can be a memory operand, so ensure we constrain to the\n  // absolute width of the access in that scenario.\n  const auto GPRSize = GetGPROpSize();\n  const auto Src1Size = Op->Src[1].IsGPR() ? GPRSize : OpSize;\n\n  Ref Src1 = LoadSourceGPR_WithOpSize(Op, Op->Src[1], Src1Size, Op->Flags);\n  Ref Src2 = LoadGPRRegister(X86State::REG_RDX, GPRSize);\n\n  // As per the Intel Software Development Manual, if the destination and\n  // first operand correspond to the same register, then the result\n  // will be the high half of the multiplication result.\n  if (Op->Dest.Data.GPR.GPR == Op->Src[0].Data.GPR.GPR) {\n    Ref ResultHi = _UMulH(OpSize, Src1, Src2);\n    StoreResultGPR(Op, Op->Dest, ResultHi);\n  } else {\n    Ref ResultLo = _UMul(OpSize, Src1, Src2);\n    Ref ResultHi = _UMulH(OpSize, Src1, Src2);\n\n    StoreResultGPR(Op, Op->Src[0], ResultLo);\n    StoreResultGPR(Op, Op->Dest, ResultHi);\n  }\n}\n\nvoid OpDispatchBuilder::PDEP(OpcodeArgs) {\n  LOGMAN_THROW_A_FMT(Op->InstSize >= 4, \"No masking needed\");\n  auto* Input = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n  auto* Mask = LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true});\n  auto Result = _PDep(OpSizeFromSrc(Op), Input, Mask);\n\n  StoreResultGPR(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::PEXT(OpcodeArgs) {\n  LOGMAN_THROW_A_FMT(Op->InstSize >= 4, \"No masking needed\");\n  auto* Input = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n  auto* Mask = LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true});\n  auto Result = _PExt(OpSizeFromSrc(Op), Input, Mask);\n\n  StoreResultGPR(Op, Op->Dest, Result);\n}\n\nvoid OpDispatchBuilder::ADXOp(OpcodeArgs) {\n  const auto OpSize = OpSizeFromSrc(Op);\n\n  // Only 32/64-bit anyway so allow garbage, we use 32-bit ops.\n  auto* Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n  auto* Before = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n\n  // Handles ADCX and ADOX\n  const bool IsADCX = Op->OP == 0x1F6;\n  auto Zero = Constant(0);\n\n  // Before we go trashing NZCV, save the current NZCV state.\n  Ref OldNZCV = GetNZCV();\n\n  // We want to use arm64 adc. For ADOX, copy the overflow flag into CF.  For\n  // ADCX, we just rectify the carry.\n  if (IsADCX) {\n    RectifyCarryInvert(false);\n  } else {\n    // If overflow, 0 - 0 sets carry. Else, forces carry to 0.\n    _CondSubNZCV(OpSize::i32Bit, Zero, Zero, CondClass::FU, 0x0 /* nzcv */);\n  }\n\n  // Do the actual add.\n  HandleNZCV_RMW();\n  auto Result = _AdcWithFlags(OpSize, Src, Before);\n  StoreResultGPR(Op, Result);\n\n  // Now restore all flags except the one we're updating.\n  if (CTX->HostFeatures.SupportsFlagM) {\n    // For ADOX, we need to copy the new carry into the overflow flag. If carry is clear (ULT with uninverted\n    // carry), 0 - 0 clears overflow. Else, force overflow on.\n    if (!IsADCX) {\n      _CondSubNZCV(OpSize::i32Bit, Zero, Zero, CondClass::ULT, 0x1 /* nzcV */);\n    }\n\n    _RmifNZCV(OldNZCV, 28, IsADCX ? 0xd /* NzcV */ : 0xe /* NZCv */);\n  } else {\n    // For either operation, insert the new flag into the old NZCV.\n    bool SavedCFInvert = CFInverted;\n    CFInverted = false;\n    Ref OutputCF = GetRFLAG(X86State::RFLAG_CF_RAW_LOC, IsADCX);\n    CFInverted = IsADCX ? true : SavedCFInvert;\n\n    Ref NewNZCV = _Bfi(OpSize::i32Bit, 1, IsADCX ? 29 : 28, OldNZCV, OutputCF);\n    SetNZCV(NewNZCV);\n  }\n}\n\nvoid OpDispatchBuilder::RCROp1Bit(OpcodeArgs) {\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  // We expliclty mask for <32-bit so allow garbage\n  Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n  const auto Size = GetSrcBitSize(Op);\n  auto CF = GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC);\n  Ref Res;\n\n  // Our new CF will be bit 0 of the source. Set upfront to avoid a move.\n  SetCFDirect(Dest, 0, true);\n\n  uint32_t Shift = 1;\n\n  if (Size == 32 || Size == 64) {\n    // Rotate and insert CF in the upper bit\n    Res = _Extr(OpSizeFromSrc(Op), CF, Dest, Shift);\n  } else {\n    // Res = Src >> Shift\n    Res = _Bfe(OpSize::i32Bit, Size - Shift, Shift, Dest);\n\n    // inject the CF\n    Res = _Orlshl(OpSize::i32Bit, Res, CF, Size - Shift);\n  }\n\n  StoreResultGPR(Op, Res);\n\n  // OF is the top two MSBs XOR'd together\n  // Only when Shift == 1, it is undefined otherwise\n  SetRFLAG<FEXCore::X86State::RFLAG_OF_RAW_LOC>(_XorShift(OpSize::i64Bit, Res, Res, ShiftType::LSR, 1), Size - 2, true);\n}\n\nvoid OpDispatchBuilder::RCROp8x1Bit(OpcodeArgs) {\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags);\n  const auto SizeBit = GetSrcBitSize(Op);\n  auto CF = GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC);\n\n  // Our new CF will be bit (Shift - 1) of the source\n  SetCFDirect(Dest, 0, true);\n\n  // Rotate and insert CF in the upper bit\n  Ref Res = _Bfe(OpSize::i32Bit, 7, 1, Dest);\n  Res = _Bfi(OpSize::i32Bit, 1, 7, Res, CF);\n\n  StoreResultGPR(Op, Res);\n\n  // OF is the top two MSBs XOR'd together\n  SetRFLAG<FEXCore::X86State::RFLAG_OF_RAW_LOC>(_XorShift(OpSize::i32Bit, Res, Res, ShiftType::LSR, 1), SizeBit - 2, true);\n}\n\nvoid OpDispatchBuilder::RCROp(OpcodeArgs) {\n  const auto Size = GetSrcBitSize(Op);\n\n  if (Size == 8 || Size == 16) {\n    RCRSmallerOp(Op);\n    return;\n  }\n\n  const auto Mask = (Size == 64) ? 0x3F : 0x1F;\n\n  // Calculate flags early.\n  CalculateDeferredFlags();\n  const auto OpSize = OpSizeFromSrc(Op);\n\n  Ref Src = LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true});\n  uint64_t Const;\n  if (IsValueConstant(WrapNode(Src), &Const)) {\n    Const &= Mask;\n    if (!Const) {\n      ZeroShiftResult(Op);\n      return;\n    }\n\n    Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n\n    // Res = Src >> Shift\n    Ref Res = _Lshr(OpSize, Dest, Src);\n    auto CF = GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC);\n\n    // Constant folded version of the above, with fused shifts.\n    if (Const > 1) {\n      Res = _Orlshl(OpSize, Res, Dest, Size + 1 - Const);\n    }\n\n    // Our new CF will be bit (Shift - 1) of the source.\n    SetCFDirect(Dest, Const - 1, true);\n\n    // Since shift != 0 we can inject the CF\n    Res = _Orlshl(OpSize, Res, CF, Size - Const);\n\n    // OF is the top two MSBs XOR'd together\n    // Only when Shift == 1, it is undefined otherwise\n    if (Const == 1) {\n      auto Xor = _XorShift(OpSize, Res, Res, ShiftType::LSR, 1);\n      SetRFLAG<FEXCore::X86State::RFLAG_OF_RAW_LOC>(Xor, Size - 2, true);\n    }\n\n    StoreResultGPR(Op, Res);\n    return;\n  }\n\n  Ref SrcMasked = _And(OpSize, Src, _InlineConstant(Mask));\n  Calculate_ShiftVariable(\n    Op, SrcMasked,\n    [this, Op, Size, OpSize]() {\n      // Rematerialize loads to avoid crossblock liveness\n      Ref Src = LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true});\n      Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n\n      // Res = Src >> Shift\n      Ref Res = _Lshr(OpSize, Dest, Src);\n      auto CF = GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC);\n\n      // Res |= (Dest << (Size - Shift + 1));\n      // Expressed as Res | ((Src << (Size - Shift)) << 1) to get correct\n      // behaviour for Shift without clobbering NZCV. Then observe that modulo\n      // Size, Size - Shift = -Shift so we can use a simple Neg.\n      //\n      // The masking of Lshl means we don't need mask the source, since:\n      //\n      //  -(x & Mask) & Mask = (-x) & Mask\n      Ref NegSrc = _Neg(OpSize, Src);\n      Res = _Orlshl(OpSize, Res, _Lshl(OpSize, Dest, NegSrc), 1);\n\n      // Our new CF will be bit (Shift - 1) of the source. this is hoisted up to\n      // avoid the need to copy the source. Again, the Lshr absorbs the masking.\n      auto NewCF = _Lshr(OpSize, Dest, Sub(OpSize, Src, 1));\n      SetCFDirect(NewCF, 0, true);\n\n      // Since shift != 0 we can inject the CF\n      Res = _Or(OpSize, Res, _Lshl(OpSize, CF, NegSrc));\n\n      // OF is the top two MSBs XOR'd together\n      // Only when Shift == 1, it is undefined otherwise\n      auto Xor = _XorShift(OpSize, Res, Res, ShiftType::LSR, 1);\n      SetRFLAG<FEXCore::X86State::RFLAG_OF_RAW_LOC>(Xor, Size - 2, true);\n\n      StoreResultGPR(Op, Res);\n    },\n    OpSizeFromSrc(Op) == OpSize::i32Bit ? std::make_optional(&OpDispatchBuilder::ZeroShiftResult) : std::nullopt);\n}\n\nvoid OpDispatchBuilder::RCRSmallerOp(OpcodeArgs) {\n  CalculateDeferredFlags();\n\n  const auto Size = GetSrcBitSize(Op);\n\n  // x86 masks the shift by 0x3F or 0x1F depending on size of op\n  auto Src = ARef(LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true}));\n  Src = Src.And(0x1F);\n\n  // CF only changes if we actually shifted. OF undefined if we didn't shift.\n  // The result is unchanged if we didn't shift. So branch over the whole thing.\n  Calculate_ShiftVariable(Op, Src.Ref(), [this, Op, Size]() {\n    // Rematerialized to avoid crossblock liveness\n    auto Src = ARef(LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true}));\n    Src = Src.And(0x1F);\n\n    auto CF = GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC);\n\n    Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags);\n    Ref Tmp {};\n\n    // Insert the incoming value across the temporary 64bit source\n    // Make sure to insert at <BitSize> + 1 offsets\n    // We need to cover 32bits plus the amount that could rotate in\n\n    if (Size == 8) {\n      // 8-bit optimal cascade\n      // Cascade: 0\n      //   Data: -> [7:0]\n      //   CF:   -> [8:8]\n      // Cascade: 1\n      //   Data: -> [16:9]\n      //   CF:   -> [17:17]\n      // Cascade: 2\n      //   Data: -> [25:18]\n      //   CF:   -> [26:26]\n      // Cascade: 3\n      //   Data: -> [34:27]\n      //   CF:   -> [35:35]\n      // Cascade: 4\n      //   Data: -> [43:36]\n      //   CF:   -> [44:44]\n\n      // Insert CF, Destination already at [7:0]\n      Tmp = _Bfi(OpSize::i64Bit, 1, 8, Dest, CF);\n\n      // First Cascade, copies 9 bits from itself.\n      Tmp = _Bfi(OpSize::i64Bit, 9, 9, Tmp, Tmp);\n\n      // Second cascade, copies 18 bits from itself.\n      Tmp = _Bfi(OpSize::i64Bit, 18, 18, Tmp, Tmp);\n\n      // Final cascade, copies 9 bits again from itself.\n      Tmp = _Bfi(OpSize::i64Bit, 9, 36, Tmp, Tmp);\n    } else {\n      // 16-bit optimal cascade\n      // Cascade: 0\n      //   Data: -> [15:0]\n      //   CF:   -> [16:16]\n      // Cascade: 1\n      //   Data: -> [32:17]\n      //   CF:   -> [33:33]\n      // Cascade: 2\n      //   Data: -> [49:34]\n      //   CF:   -> [50:50]\n\n      // Insert CF, Destination already at [15:0]\n      Tmp = _Bfi(OpSize::i64Bit, 1, 16, Dest, CF);\n\n      // First Cascade, copies 17 bits from itself.\n      Tmp = _Bfi(OpSize::i64Bit, 17, 17, Tmp, Tmp);\n\n      // Final Cascade, copies 17 bits from itself again.\n      Tmp = _Bfi(OpSize::i64Bit, 17, 34, Tmp, Tmp);\n    }\n\n    // Entire bitfield has been setup. Just extract the 8 or 16bits we need.\n    // 64-bit shift used because we want to rotate in our cascaded upper bits\n    // rather than zeroes.\n    Ref Res = _Lshr(OpSize::i64Bit, Tmp, Src.Ref());\n\n    StoreResultGPR(Op, Res);\n\n    // Our new CF will be bit (Shift - 1) of the source. 32-bit Lshr masks the\n    // same as x86, but if we constant fold we must mask ourselves.\n    if (Src.IsConstant) {\n      SetCFDirect(Tmp, (Src.C & 0x1f) - 1, true);\n    } else {\n      auto NewCF = _Lshr(OpSize::i32Bit, Tmp, Sub(OpSize::i32Bit, Src.Ref(), 1));\n      SetCFDirect(NewCF, 0, true);\n    }\n\n    // OF is the top two MSBs XOR'd together\n    // Only when Shift == 1, it is undefined otherwise\n    if (!Src.IsConstant || Src.C == 1) {\n      auto NewOF = _XorShift(OpSize::i32Bit, Res, Res, ShiftType::LSR, 1);\n      SetRFLAG<FEXCore::X86State::RFLAG_OF_RAW_LOC>(NewOF, Size - 2, true);\n    }\n  });\n}\n\nvoid OpDispatchBuilder::RCLOp1Bit(OpcodeArgs) {\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags);\n  const auto Size = GetSrcBitSize(Op);\n  const auto OpSize = Size == 64 ? OpSize::i64Bit : OpSize::i32Bit;\n  auto CF = GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC);\n\n  // Rotate left and insert CF in to lowest bit\n  // TODO: Use `adc Res, xzr, Dest, lsl 1` to save an instruction\n  Ref Res = _Orlshl(OpSize, CF, Dest, 1);\n\n  // Our new CF will be the top bit of the source\n  SetCFDirect(Dest, Size - 1, true);\n\n  // OF is the top two MSBs XOR'd together\n  // Top two MSBs is CF and top bit of result\n  SetRFLAG<FEXCore::X86State::RFLAG_OF_RAW_LOC>(_Xor(OpSize, Res, Dest), Size - 1, true);\n\n  StoreResultGPR(Op, Res);\n}\n\nvoid OpDispatchBuilder::RCLOp(OpcodeArgs) {\n  const auto Size = GetSrcBitSize(Op);\n\n  if (Size == 8 || Size == 16) {\n    RCLSmallerOp(Op);\n    return;\n  }\n\n  const auto Mask = (Size == 64) ? 0x3F : 0x1F;\n\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  Ref Src = LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true});\n  const auto OpSize = OpSizeFromSrc(Op);\n\n  uint64_t Const;\n  if (IsValueConstant(WrapNode(Src), &Const)) {\n    Const &= Mask;\n    if (!Const) {\n      ZeroShiftResult(Op);\n      return;\n    }\n\n    // Res = Src << Shift\n    Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n    Ref Res = _Lshl(OpSize, Dest, Src);\n    auto CF = GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC);\n\n    // Res |= (Src << (Size - Shift + 1));\n    if (Const > 1) {\n      Res = _Orlshr(OpSize, Res, Dest, Size + 1 - Const);\n    }\n\n    // Our new CF will be bit (Shift - 1) of the source\n    SetCFDirect(Dest, Size - Const, true);\n\n    // Since Shift != 0 we can inject the CF\n    Res = _Orlshl(OpSize, Res, CF, Const - 1);\n\n    // OF is the top two MSBs XOR'd together\n    // Only when Shift == 1, it is undefined otherwise\n    if (Const == 1) {\n      auto NewOF = _Xor(OpSize, Res, Dest);\n      SetRFLAG<FEXCore::X86State::RFLAG_OF_RAW_LOC>(NewOF, Size - 1, true);\n    }\n\n    StoreResultGPR(Op, Res);\n    return;\n  }\n\n  Ref SrcMasked = _And(OpSize, Src, _InlineConstant(Mask));\n  Calculate_ShiftVariable(\n    Op, SrcMasked,\n    [this, Op, Size, OpSize]() {\n      // Rematerialized to avoid crossblock liveness\n      Ref Src = LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true});\n\n      // Res = Src << Shift\n      Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n      Ref Res = _Lshl(OpSize, Dest, Src);\n      auto CF = GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC);\n\n      // Res |= (Dest >> (Size - Shift + 1)), expressed as\n      // Res | ((Dest >> (-Shift)) >> 1), since Size - Shift = -Shift mod\n      // Size. The shift aborbs the masking.\n      auto NegSrc = _Neg(OpSize, Src);\n      Res = _Orlshr(OpSize, Res, _Lshr(OpSize, Dest, NegSrc), 1);\n\n      // Our new CF will be bit (Shift - 1) of the source\n      auto NewCF = _Lshr(OpSize, Dest, NegSrc);\n      SetCFDirect(NewCF, 0, true);\n\n      // Since Shift != 0 we can inject the CF. Shift absorbs the masking.\n      Ref CFShl = Sub(OpSize, Src, 1);\n      auto TmpCF = _Lshl(OpSize, CF, CFShl);\n      Res = _Or(OpSize, Res, TmpCF);\n\n      // OF is the top two MSBs XOR'd together\n      // Only when Shift == 1, it is undefined otherwise\n      //\n      // Note that NewCF has garbage in the upper bits, but we ignore them here\n      // and mask as part of the set after.\n      auto NewOF = _XorShift(OpSize, Res, NewCF, ShiftType::LSL, Size - 1);\n      SetRFLAG<FEXCore::X86State::RFLAG_OF_RAW_LOC>(NewOF, Size - 1, true);\n\n      StoreResultGPR(Op, Res);\n    },\n    OpSizeFromSrc(Op) == OpSize::i32Bit ? std::make_optional(&OpDispatchBuilder::ZeroShiftResult) : std::nullopt);\n}\n\nvoid OpDispatchBuilder::RCLSmallerOp(OpcodeArgs) {\n  CalculateDeferredFlags();\n\n  const auto Size = GetSrcBitSize(Op);\n\n  // x86 masks the shift by 0x3F or 0x1F depending on size of op\n  auto Src = ARef(LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true}));\n  Src = Src.And(0x1F);\n\n  // CF only changes if we actually shifted. OF undefined if we didn't shift.\n  // The result is unchanged if we didn't shift. So branch over the whole thing.\n  Calculate_ShiftVariable(Op, Src.Ref(), [this, Op, Size]() {\n    // Rematerialized to avoid crossblock liveness\n    auto Src = ARef(LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true}));\n    Src = Src.And(0x1F);\n    Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags);\n\n    auto CF = GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC);\n\n    Ref Tmp = Constant(0);\n\n    for (size_t i = 0; i < (32 + Size + 1); i += (Size + 1)) {\n      // Insert incoming value\n      Tmp = _Bfi(OpSize::i64Bit, Size, 63 - i - Size, Tmp, Dest);\n\n      // Insert CF\n      Tmp = _Bfi(OpSize::i64Bit, 1, 63 - i, Tmp, CF);\n    }\n\n    // Insert incoming value\n    Tmp = _Bfi(OpSize::i64Bit, Size, 0, Tmp, Dest);\n\n    // The data is now set up like this\n    // [Data][CF]:[Data][CF]:[Data][CF]:[Data][CF]\n    // Shift 1 more bit that expected to get our result\n    // Shifting to the right will now behave like a rotate to the left\n    // Which we emulate with a _Ror\n    Ref Res = _Ror(OpSize::i64Bit, Tmp, Src.Neg().Ref());\n\n    StoreResultGPR(Op, Res);\n\n    // Our new CF is now at the bit position that we are shifting\n    // Either 0 if CF hasn't changed (CF is living in bit 0)\n    // or higher\n    auto NewCF = _Ror(OpSize::i64Bit, Tmp, Src.Presub(63).Ref());\n    SetCFDirect(NewCF, 0, true);\n\n    // OF is the XOR of the NewCF and the MSB of the result\n    // Only defined for 1-bit rotates.\n    if (!Src.IsConstant || Src.C == 1) {\n      auto NewOF = _XorShift(OpSize::i64Bit, NewCF, Res, ShiftType::LSR, Size - 1);\n      SetRFLAG<FEXCore::X86State::RFLAG_OF_RAW_LOC>(NewOF, 0, true);\n    }\n  });\n}\n\nvoid OpDispatchBuilder::BTOp(OpcodeArgs, uint32_t SrcIndex, BTAction Action) {\n  Ref Value;\n  ArithRef Src;\n  bool IsNonconstant = Op->Src[SrcIndex].IsGPR();\n\n  const uint32_t Size = GetDstBitSize(Op);\n  const uint32_t Mask = Size - 1;\n\n  if (IsNonconstant) {\n    // Because we mask explicitly with And/Bfe/Sbfe after, we can allow garbage here.\n    Src = ARef(LoadSourceGPR(Op, Op->Src[SrcIndex], Op->Flags, {.AllowUpperGarbage = true}));\n  } else {\n    // Can only be an immediate\n    // Masked by operand size\n    Src = ARef(Op->Src[SrcIndex].Literal() & Mask);\n  }\n\n  if (Op->Dest.IsGPR()) {\n    // When the destination is a GPR, we don't care about garbage in the upper bits.\n    // Load the full register.\n    auto Dest = LoadSourceGPR_WithOpSize(Op, Op->Dest, GetGPROpSize(), Op->Flags);\n    Value = Dest;\n\n    // Get the bit selection from the src. We need to mask for 8/16-bit, but\n    // rely on the implicit masking of Lshr for native sizes.\n    unsigned LshrSize = std::max<uint8_t>(IR::OpSizeToSize(OpSize::i32Bit), Size / 8);\n    auto BitSelect = (Size == (LshrSize * 8)) ? Src : Src.And(Mask);\n    auto LshrOpSize = IR::SizeToOpSize(LshrSize);\n\n    // OF/SF/AF/PF undefined. ZF must be preserved. We choose to preserve OF/SF\n    // too since we just use an rmif to insert into CF directly. We could\n    // optimize perhaps.\n    //\n    // Set CF before the action to save a move, except for complements where we\n    // can reuse the invert.\n    if (Action != BTAction::BTComplement) {\n      if (IsNonconstant) {\n        Value = _Lshr(IR::SizeToOpSize(LshrSize), Value, BitSelect.Ref());\n      }\n\n      SetRFLAG(Value, X86State::RFLAG_CF_RAW_LOC, Src.IsConstant ? Src.C : 0, true);\n      CFInverted = false;\n    }\n\n    switch (Action) {\n    case BTAction::BTNone: {\n      /* Nothing to do */\n      break;\n    }\n\n    case BTAction::BTClear: {\n      Dest = _Andn(LshrOpSize, Dest, BitSelect.MaskBit(LshrOpSize).Ref());\n      StoreResultGPR(Op, Dest);\n      break;\n    }\n\n    case BTAction::BTSet: {\n      Dest = _Or(LshrOpSize, Dest, BitSelect.MaskBit(LshrOpSize).Ref());\n      StoreResultGPR(Op, Dest);\n      break;\n    }\n\n    case BTAction::BTComplement: {\n      Dest = _Xor(LshrOpSize, Dest, BitSelect.MaskBit(LshrOpSize).Ref());\n\n      if (IsNonconstant) {\n        Value = _Lshr(LshrOpSize, Dest, BitSelect.Ref());\n      } else {\n        Value = Dest;\n      }\n\n      SetRFLAG(Value, X86State::RFLAG_CF_RAW_LOC, Src.IsConstant ? Src.C : 0, true);\n      CFInverted = true;\n\n      StoreResultGPR(Op, Dest);\n      break;\n    }\n    }\n  } else {\n    // Load the address to the memory location\n    Ref Dest = MakeSegmentAddress(Op, Op->Dest);\n    // Get the bit selection from the src\n    auto BitSelect = Src.Bfe(0, 3);\n\n    // Address is provided as bits we want BYTE offsets\n    // Extract Signed offset\n    Src = Src.Sbfe(3, Size - 3);\n\n    // Get the address offset by shifting out the size of the op (To shift out the bit selection)\n    // Then use that to index in to the memory location by size of op\n    AddressMode Address = {.Base = Dest, .Index = Src.Ref(), .AddrSize = OpSize::i64Bit};\n\n    switch (Action) {\n    case BTAction::BTNone: {\n      Value = _LoadMemGPRAutoTSO(OpSize::i8Bit, Address, OpSize::i8Bit);\n      break;\n    }\n\n    case BTAction::BTClear: {\n      Ref BitMask = BitSelect.MaskBit(OpSize::i64Bit).Ref();\n\n      if (DestIsLockedMem(Op)) {\n        HandledLock = true;\n        Value = _AtomicFetchCLR(OpSize::i8Bit, BitMask, LoadEffectiveAddress(this, Address, GetGPROpSize(), true));\n      } else {\n        Value = _LoadMemGPRAutoTSO(OpSize::i8Bit, Address, OpSize::i8Bit);\n\n        auto Modified = _Andn(OpSize::i64Bit, Value, BitMask);\n        _StoreMemGPRAutoTSO(OpSize::i8Bit, Address, Modified, OpSize::i8Bit);\n      }\n      break;\n    }\n\n    case BTAction::BTSet: {\n      Ref BitMask = BitSelect.MaskBit(OpSize::i64Bit).Ref();\n\n      if (DestIsLockedMem(Op)) {\n        HandledLock = true;\n        Value = _AtomicFetchOr(OpSize::i8Bit, BitMask, LoadEffectiveAddress(this, Address, GetGPROpSize(), true));\n      } else {\n        Value = _LoadMemGPRAutoTSO(OpSize::i8Bit, Address, OpSize::i8Bit);\n\n        auto Modified = _Or(OpSize::i64Bit, Value, BitMask);\n        _StoreMemGPRAutoTSO(OpSize::i8Bit, Address, Modified, OpSize::i8Bit);\n      }\n      break;\n    }\n\n    case BTAction::BTComplement: {\n      Ref BitMask = BitSelect.MaskBit(OpSize::i64Bit).Ref();\n\n      if (DestIsLockedMem(Op)) {\n        HandledLock = true;\n        Value = _AtomicFetchXor(OpSize::i8Bit, BitMask, LoadEffectiveAddress(this, Address, GetGPROpSize(), true));\n      } else {\n        Value = _LoadMemGPRAutoTSO(OpSize::i8Bit, Address, OpSize::i8Bit);\n\n        auto Modified = _Xor(OpSize::i64Bit, Value, BitMask);\n        _StoreMemGPRAutoTSO(OpSize::i8Bit, Address, Modified, OpSize::i8Bit);\n      }\n      break;\n    }\n    }\n\n    // Now shift in to the correct bit location\n    if (!BitSelect.IsDefinitelyZero()) {\n      Value = _Lshr(std::max(OpSize::i32Bit, GetOpSize(Value)), Value, BitSelect.Ref());\n    }\n\n    // OF/SF/ZF/AF/PF undefined.\n    SetCFDirect(Value, 0, true);\n  }\n}\n\nvoid OpDispatchBuilder::IMUL1SrcOp(OpcodeArgs) {\n  /* We're just going to sign-extend the non-garbage anyway.. */\n  Ref Src1 = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n  Ref Src2 = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n\n  const auto Size = OpSizeFromSrc(Op);\n  const auto SizeBits = IR::OpSizeAsBits(Size);\n\n  Ref Dest {};\n  Ref ResultHigh {};\n  switch (Size) {\n  case OpSize::i8Bit:\n  case OpSize::i16Bit: {\n    Src1 = _Sbfe(OpSize::i64Bit, SizeBits, 0, Src1);\n    Src2 = _Sbfe(OpSize::i64Bit, SizeBits, 0, Src2);\n    Dest = _Mul(OpSize::i64Bit, Src1, Src2);\n    ResultHigh = _Sbfe(OpSize::i64Bit, SizeBits, SizeBits, Dest);\n    break;\n  }\n  case OpSize::i32Bit: {\n    ResultHigh = _SMull(Src1, Src2);\n    ResultHigh = _Sbfe(OpSize::i64Bit, SizeBits, SizeBits, ResultHigh);\n    // Flipped order to save a move\n    Dest = _Mul(OpSize::i32Bit, Src1, Src2);\n    break;\n  }\n  case OpSize::i64Bit: {\n    ResultHigh = _MulH(OpSize::i64Bit, Src1, Src2);\n    // Flipped order to save a move\n    Dest = _Mul(OpSize::i64Bit, Src1, Src2);\n    break;\n  }\n  default: FEX_UNREACHABLE;\n  }\n\n  StoreResultGPR(Op, Dest);\n  CalculateFlags_MUL(Size, Dest, ResultHigh);\n}\n\nvoid OpDispatchBuilder::IMUL2SrcOp(OpcodeArgs) {\n  Ref Src1 = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n  Ref Src2 = LoadSourceGPR(Op, Op->Src[1], Op->Flags, {.AllowUpperGarbage = true});\n\n  const auto Size = OpSizeFromSrc(Op);\n  const auto SizeBits = IR::OpSizeAsBits(Size);\n\n  Ref Dest {};\n  Ref ResultHigh {};\n\n  switch (Size) {\n  case OpSize::i8Bit:\n  case OpSize::i16Bit: {\n    Src1 = _Sbfe(OpSize::i64Bit, SizeBits, 0, Src1);\n    Src2 = ARef(Src2).Sbfe(0, SizeBits).Ref();\n    Dest = _Mul(OpSize::i64Bit, Src1, Src2);\n    ResultHigh = _Sbfe(OpSize::i64Bit, SizeBits, SizeBits, Dest);\n    break;\n  }\n  case OpSize::i32Bit: {\n    ResultHigh = _SMull(Src1, Src2);\n    ResultHigh = _Sbfe(OpSize::i64Bit, SizeBits, SizeBits, ResultHigh);\n    // Flipped order to save a move\n    Dest = _Mul(OpSize::i32Bit, Src1, Src2);\n    break;\n  }\n  case OpSize::i64Bit: {\n    ResultHigh = _MulH(OpSize::i64Bit, Src1, Src2);\n    // Flipped order to save a move\n    Dest = _Mul(OpSize::i64Bit, Src1, Src2);\n    break;\n  }\n  default: FEX_UNREACHABLE;\n  }\n\n  StoreResultGPR(Op, Dest);\n  CalculateFlags_MUL(Size, Dest, ResultHigh);\n}\n\nvoid OpDispatchBuilder::IMULOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n  const auto SizeBits = IR::OpSizeAsBits(Size);\n\n  Ref Src1 = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n  Ref Src2 = LoadGPRRegister(X86State::REG_RAX);\n\n  if (Size != OpSize::i64Bit) {\n    Src1 = _Sbfe(OpSize::i64Bit, SizeBits, 0, Src1);\n    Src2 = _Sbfe(OpSize::i64Bit, SizeBits, 0, Src2);\n  }\n\n  // 64-bit special cased to save a move\n  Ref Result {};\n  if (Size < OpSize::i64Bit) {\n    Result = _Mul(OpSize::i64Bit, Src1, Src2);\n  }\n  Ref ResultHigh {};\n  if (Size == OpSize::i8Bit) {\n    // Result is stored in AX\n    StoreGPRRegister(X86State::REG_RAX, Result, OpSize::i16Bit);\n    ResultHigh = _Sbfe(OpSize::i64Bit, 8, 8, Result);\n  } else if (Size == OpSize::i16Bit) {\n    // 16bits stored in AX\n    // 16bits stored in DX\n    StoreGPRRegister(X86State::REG_RAX, Result, Size);\n    ResultHigh = _Sbfe(OpSize::i64Bit, 16, 16, Result);\n    StoreGPRRegister(X86State::REG_RDX, ResultHigh, Size);\n  } else if (Size == OpSize::i32Bit) {\n    // 32bits stored in EAX\n    // 32bits stored in EDX\n    // Make sure they get Zext correctly\n    auto LocalResult = _Bfe(OpSize::i64Bit, 32, 0, Result);\n    auto LocalResultHigh = _Bfe(OpSize::i64Bit, 32, 32, Result);\n    ResultHigh = _Sbfe(OpSize::i64Bit, 32, 32, Result);\n    Result = _Sbfe(OpSize::i64Bit, 32, 0, Result);\n    StoreGPRRegister(X86State::REG_RAX, LocalResult);\n    StoreGPRRegister(X86State::REG_RDX, LocalResultHigh);\n  } else if (Size == OpSize::i64Bit) {\n    if (!Is64BitMode) {\n      LogMan::Msg::EFmt(\"Doesn't exist in 32bit mode\");\n      DecodeFailure = true;\n      return;\n    }\n    // 64bits stored in RAX\n    // 64bits stored in RDX\n    ResultHigh = _MulH(OpSize::i64Bit, Src1, Src2);\n    Result = _Mul(OpSize::i64Bit, Src1, Src2);\n    StoreGPRRegister(X86State::REG_RAX, Result);\n    StoreGPRRegister(X86State::REG_RDX, ResultHigh);\n  }\n\n  CalculateFlags_MUL(Size, Result, ResultHigh);\n}\n\nvoid OpDispatchBuilder::MULOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n  const auto SizeBits = IR::OpSizeAsBits(Size);\n\n  Ref Src1 = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n  Ref Src2 = LoadGPRRegister(X86State::REG_RAX);\n  Ref Result {};\n\n  if (Size != OpSize::i64Bit) {\n    Src1 = _Bfe(OpSize::i64Bit, SizeBits, 0, Src1);\n    Src2 = _Bfe(OpSize::i64Bit, SizeBits, 0, Src2);\n    Result = _UMul(OpSize::i64Bit, Src1, Src2);\n  }\n  Ref ResultHigh {};\n\n  if (Size == OpSize::i8Bit) {\n    // Result is stored in AX\n    StoreGPRRegister(X86State::REG_RAX, Result, OpSize::i16Bit);\n    ResultHigh = _Bfe(OpSize::i64Bit, 8, 8, Result);\n  } else if (Size == OpSize::i16Bit) {\n    // 16bits stored in AX\n    // 16bits stored in DX\n    StoreGPRRegister(X86State::REG_RAX, Result, Size);\n    ResultHigh = _Bfe(OpSize::i64Bit, 16, 16, Result);\n    StoreGPRRegister(X86State::REG_RDX, ResultHigh, Size);\n  } else if (Size == OpSize::i32Bit) {\n    // 32bits stored in EAX\n    // 32bits stored in EDX\n    Ref ResultLow = _Bfe(OpSize::i64Bit, 32, 0, Result);\n    ResultHigh = _Bfe(OpSize::i64Bit, 32, 32, Result);\n    StoreGPRRegister(X86State::REG_RAX, ResultLow);\n    StoreGPRRegister(X86State::REG_RDX, ResultHigh);\n  } else if (Size == OpSize::i64Bit) {\n    if (!Is64BitMode) {\n      LogMan::Msg::EFmt(\"Doesn't exist in 32bit mode\");\n      DecodeFailure = true;\n      return;\n    }\n    // 64bits stored in RAX\n    // 64bits stored in RDX\n    //\n    // Calculate high first to allow better RA.\n    ResultHigh = _UMulH(OpSize::i64Bit, Src1, Src2);\n    Result = _UMul(OpSize::i64Bit, Src1, Src2);\n    StoreGPRRegister(X86State::REG_RAX, Result);\n    StoreGPRRegister(X86State::REG_RDX, ResultHigh);\n  }\n\n  CalculateFlags_UMUL(ResultHigh);\n}\n\nvoid OpDispatchBuilder::NOTOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n  const auto SizeBits = IR::OpSizeAsBits(Size);\n  LOGMAN_THROW_A_FMT(Size >= IR::OpSize::i8Bit && Size <= IR::OpSize::i64Bit, \"Invalid size\");\n\n  Ref MaskConst {};\n  if (Size == OpSize::i64Bit) {\n    MaskConst = Constant(~0ULL);\n  } else {\n    MaskConst = Constant((1ULL << SizeBits) - 1);\n  }\n\n  if (DestIsLockedMem(Op)) {\n    HandledLock = true;\n    Ref DestMem = MakeSegmentAddress(Op, Op->Dest);\n    // Result unused\n    _AtomicFetchXor(Size, MaskConst, DestMem);\n  } else if (!Op->Dest.IsGPR()) {\n    // GPR version plays fast and loose with sizes, be safe for memory tho.\n    Ref Src = LoadSourceGPR(Op, Op->Dest, Op->Flags);\n    Src = _Xor(OpSize::i64Bit, Src, MaskConst);\n    StoreResultGPR(Op, Src);\n  } else {\n    // Specially handle high bits so we can invert in place with the correct\n    // mask and a larger type.\n    auto Dest = Op->Dest;\n    if (Dest.Data.GPR.HighBits) {\n      LOGMAN_THROW_A_FMT(Size == OpSize::i8Bit, \"Only 8-bit GPRs get high bits\");\n      MaskConst = Constant(0xFF00);\n      Dest.Data.GPR.HighBits = false;\n    }\n\n    // Always load full size, we explicitly want the upper bits to get the\n    // insert behaviour for free/implicitly.\n    const auto GPRSize = GetGPROpSize();\n    Ref Src = LoadSourceGPR_WithOpSize(Op, Dest, GPRSize, Op->Flags);\n\n    // For 8/16-bit, use 64-bit invert so we invert in place, while getting\n    // insert behaviour. For 32-bit, use 32-bit invert to zero the upper bits.\n    const auto EffectiveSize = Size == OpSize::i32Bit ? OpSize::i32Bit : GPRSize;\n\n    // If we're inverting the whole thing, use Not instead of Xor to save a constant.\n    if (Size >= OpSize::i32Bit) {\n      Src = _Not(EffectiveSize, Src);\n    } else {\n      Src = _Xor(EffectiveSize, Src, MaskConst);\n    }\n\n    // Always store 64-bit, the Not/Xor correctly handle the upper bits and this\n    // way we can delete the store.\n    StoreResultGPR_WithOpSize(Op, Dest, Src, GPRSize);\n  }\n}\n\nvoid OpDispatchBuilder::XADDOp(OpcodeArgs) {\n  Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.LoadData = false});\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n  Ref Result;\n\n  if (Op->Dest.IsGPR()) {\n    // If this is a GPR then we can just do an Add\n    Result = CalculateFlags_ADD(OpSizeFromSrc(Op), Dest, Src);\n\n    // Previous value in dest gets stored in src\n    StoreResultGPR(Op, Op->Src[0], Dest);\n\n    // Calculated value gets stored in dst (order is important if dst is same as src)\n    StoreResultGPR(Op, Result);\n  } else {\n    HandledLock = Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_LOCK;\n    Dest = AppendSegmentOffset(Dest, Op->Flags);\n    auto Before = _AtomicFetchAdd(OpSizeFromSrc(Op), Src, Dest);\n    CalculateFlags_ADD(OpSizeFromSrc(Op), Before, Src);\n    StoreResultGPR(Op, Op->Src[0], Before);\n  }\n}\n\nvoid OpDispatchBuilder::PopcountOp(OpcodeArgs) {\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = CTX->HostFeatures.SupportsCSSC || GetSrcSize(Op) >= 4});\n  Src = _Popcount(OpSizeFromSrc(Op), Src);\n  StoreResultGPR(Op, Src);\n\n  // We need to set ZF while clearing the rest of NZCV. The result of a popcount\n  // is in the range [0, 63]. In particular, it is always positive. So a\n  // combined NZ test will correctly zero SF/CF/OF while setting ZF.\n  SetNZ_ZeroCV(OpSize::i32Bit, Src);\n  ZeroPF_AF();\n}\n\nRef OpDispatchBuilder::CalculateAFForDecimal(Ref A) {\n  auto Nibble = _And(OpSize::i64Bit, A, Constant(0xF));\n  auto Greater = Select01(OpSize::i64Bit, CondClass::UGT, Nibble, Constant(9));\n\n  return _Or(OpSize::i64Bit, LoadAF(), Greater);\n}\n\nvoid OpDispatchBuilder::DAAOp(OpcodeArgs) {\n  CalculateDeferredFlags();\n  auto AL = LoadGPRRegister(X86State::REG_RAX, OpSize::i8Bit);\n  auto CFInv = GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC, true);\n  auto AF = CalculateAFForDecimal(AL);\n\n  // CF |= (AL > 0x99);\n  CFInv = _And(OpSize::i64Bit, CFInv, Select01(OpSize::i64Bit, CondClass::ULE, AL, Constant(0x99)));\n\n  // AL = AF ? (AL + 0x6) : AL;\n  AL = _Select(OpSize::i64Bit, OpSize::i64Bit, CondClass::NEQ, AF, Constant(0), Add(OpSize::i64Bit, AL, 0x6), AL);\n\n  // AL = CF ? (AL + 0x60) : AL;\n  AL = _Select(OpSize::i64Bit, OpSize::i64Bit, CondClass::EQ, CFInv, Constant(0), Add(OpSize::i64Bit, AL, 0x60), AL);\n\n  // SF, ZF, PF set according to result. CF set per above. OF undefined.\n  StoreGPRRegister(X86State::REG_RAX, AL, OpSize::i8Bit);\n  SetNZ_ZeroCV(OpSize::i8Bit, AL);\n  SetCFInverted(CFInv);\n  CalculatePF(AL);\n  SetAFAndFixup(AF);\n}\n\nvoid OpDispatchBuilder::DASOp(OpcodeArgs) {\n  CalculateDeferredFlags();\n  auto AL = LoadGPRRegister(X86State::REG_RAX, OpSize::i8Bit);\n  auto CF = GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC);\n  auto AF = CalculateAFForDecimal(AL);\n\n  // CF |= (AL > 0x99);\n  CF = _Or(OpSize::i64Bit, CF, Select01(OpSize::i64Bit, CondClass::UGT, AL, Constant(0x99)));\n\n  // NewCF = CF | (AF && (Borrow from AL - 6))\n  auto NewCF = _Or(OpSize::i32Bit, CF, _Select(OpSize::i64Bit, OpSize::i64Bit, CondClass::ULT, AL, Constant(6), AF, CF));\n\n  // AL = AF ? (AL - 0x6) : AL;\n  AL = _Select(OpSize::i64Bit, OpSize::i64Bit, CondClass::NEQ, AF, Constant(0), Sub(OpSize::i64Bit, AL, 0x6), AL);\n\n  // AL = CF ? (AL - 0x60) : AL;\n  AL = _Select(OpSize::i64Bit, OpSize::i64Bit, CondClass::NEQ, CF, Constant(0), Sub(OpSize::i64Bit, AL, 0x60), AL);\n\n  // SF, ZF, PF set according to result. CF set per above. OF undefined.\n  StoreGPRRegister(X86State::REG_RAX, AL, OpSize::i8Bit);\n  SetNZ_ZeroCV(OpSize::i8Bit, AL);\n  SetCFDirect(NewCF);\n  CalculatePF(AL);\n  SetAFAndFixup(AF);\n}\n\nvoid OpDispatchBuilder::AAAOp(OpcodeArgs) {\n  auto A = LoadGPRRegister(X86State::REG_RAX);\n  auto AF = CalculateAFForDecimal(A);\n\n  // CF = AF, OF/SF/ZF/PF undefined\n  SetCFDirect_InvalidateNZV(AF);\n  SetAFAndFixup(AF);\n  CalculateDeferredFlags();\n\n  // AX = CF ? (AX + 0x106) : 0\n  A = NZCVSelect(OpSize::i32Bit, CondClass::UGE /* CF = 1 */, Add(OpSize::i32Bit, A, 0x106), A);\n\n  // AL = AL & 0x0F\n  A = _And(OpSize::i32Bit, A, Constant(0xFF0F));\n  StoreGPRRegister(X86State::REG_RAX, A, OpSize::i16Bit);\n}\n\nvoid OpDispatchBuilder::AASOp(OpcodeArgs) {\n  auto A = LoadGPRRegister(X86State::REG_RAX);\n  auto AF = CalculateAFForDecimal(A);\n\n  // CF = AF, OF/SF/ZF/PF undefined\n  SetCFDirect_InvalidateNZV(AF);\n  SetAFAndFixup(AF);\n  CalculateDeferredFlags();\n\n  // AX = CF ? (AX - 0x106) : 0\n  A = NZCVSelect(OpSize::i32Bit, CondClass::UGE /* CF = 1 */, Sub(OpSize::i32Bit, A, 0x106), A);\n\n  // AL = AL & 0x0F\n  A = _And(OpSize::i32Bit, A, Constant(0xFF0F));\n  StoreGPRRegister(X86State::REG_RAX, A, OpSize::i16Bit);\n}\n\nvoid OpDispatchBuilder::AAMOp(OpcodeArgs) {\n  auto AL = LoadGPRRegister(X86State::REG_RAX, OpSize::i8Bit);\n  auto Imm8 = Constant(Op->Src[0].Literal() & 0xFF);\n  Ref Quotient = _AllocateGPR(true);\n  Ref Remainder = _AllocateGPR(true);\n  _UDiv(OpSize::i64Bit, AL, Invalid(), Imm8, Quotient, Remainder);\n  auto Res = _AddShift(OpSize::i64Bit, Remainder, Quotient, ShiftType::LSL, 8);\n  StoreGPRRegister(X86State::REG_RAX, Res, OpSize::i16Bit);\n\n  SetNZ_ZeroCV(OpSize::i8Bit, Res);\n  CalculatePF(Res);\n  InvalidateAF();\n}\n\nvoid OpDispatchBuilder::AADOp(OpcodeArgs) {\n  auto A = LoadGPRRegister(X86State::REG_RAX);\n  auto AH = _Lshr(OpSize::i32Bit, A, Constant(8));\n  auto Imm8 = Constant(Op->Src[0].Literal() & 0xFF);\n  auto NewAL = Add(OpSize::i64Bit, A, _Mul(OpSize::i64Bit, AH, Imm8));\n  auto Result = _And(OpSize::i64Bit, NewAL, Constant(0xFF));\n  StoreGPRRegister(X86State::REG_RAX, Result, OpSize::i16Bit);\n\n  SetNZ_ZeroCV(OpSize::i8Bit, Result);\n  CalculatePF(Result);\n  InvalidateAF();\n}\n\nvoid OpDispatchBuilder::XLATOp(OpcodeArgs) {\n  Ref Src = MakeSegmentAddress(X86State::REG_RBX, Op->Flags, X86Tables::DecodeFlags::FLAG_DS_PREFIX);\n  Ref Offset = LoadGPRRegister(X86State::REG_RAX, OpSize::i8Bit);\n\n  AddressMode A = {.Base = Src, .Index = Offset, .AddrSize = OpSize::i64Bit};\n  auto Res = _LoadMemGPRAutoTSO(OpSize::i8Bit, A, OpSize::i8Bit);\n\n  StoreGPRRegister(X86State::REG_RAX, Res, OpSize::i8Bit);\n}\n\nvoid OpDispatchBuilder::ReadSegmentReg(OpcodeArgs, OpDispatchBuilder::Segment Seg) {\n  // 64-bit only\n  // Doesn't hit the segment register optimization\n  const auto Size = OpSizeFromSrc(Op);\n  Ref Src {};\n  if (Seg == Segment::FS) {\n    Src = _LoadContextGPR(Size, offsetof(FEXCore::Core::CPUState, fs_cached));\n  } else {\n    Src = _LoadContextGPR(Size, offsetof(FEXCore::Core::CPUState, gs_cached));\n  }\n\n  StoreResultGPR(Op, Src);\n}\n\nvoid OpDispatchBuilder::WriteSegmentReg(OpcodeArgs, OpDispatchBuilder::Segment Seg) {\n  // Documentation claims that the 32-bit version of this instruction inserts in to the lower 32-bits of the segment\n  // This is incorrect and it instead zero extends the 32-bit value to 64-bit\n  const auto Size = OpSizeFromDst(Op);\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n  if (Seg == Segment::FS) {\n    _StoreContextGPR(Size, Src, offsetof(FEXCore::Core::CPUState, fs_cached));\n  } else {\n    _StoreContextGPR(Size, Src, offsetof(FEXCore::Core::CPUState, gs_cached));\n  }\n}\n\nvoid OpDispatchBuilder::EnterOp(OpcodeArgs) {\n  const auto GPRSize = GetGPROpSize();\n  const auto OperandSize = (Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_OPERAND_SIZE) ? OpSize::i16Bit : GPRSize;\n  const uint64_t Value = Op->Src[0].Literal();\n\n  const uint16_t AllocSpace = Value & 0xFFFF;\n  const uint8_t Level = (Value >> 16) & 0x1F;\n\n  const auto PushValue = [&](IR::OpSize Size, Ref Src) -> Ref {\n    auto OldSP = LoadGPRRegister(X86State::REG_RSP);\n    auto NewSP = _Push(GPRSize, Size, Src, OldSP);\n\n    // Store the new stack pointer\n    StoreGPRRegister(X86State::REG_RSP, NewSP);\n    return NewSP;\n  };\n\n  auto OldBP = LoadGPRRegister(X86State::REG_RBP);\n  auto NewSP = PushValue(OperandSize, OldBP);\n  auto temp_RBP = NewSP;\n\n  if (Level > 0) {\n    for (uint8_t i = 1; i < Level; ++i) {\n      auto MemLoc = Sub(GPRSize, OldBP, i * IR::OpSizeToSize(OperandSize));\n      auto Mem = _LoadMemGPR(OperandSize, MemLoc, OperandSize);\n      NewSP = PushValue(OperandSize, Mem);\n    }\n    NewSP = PushValue(OperandSize, temp_RBP);\n  }\n  NewSP = Sub(GPRSize, NewSP, AllocSpace);\n  StoreGPRRegister(X86State::REG_RSP, NewSP);\n  StoreGPRRegister(X86State::REG_RBP, temp_RBP);\n}\n\nvoid OpDispatchBuilder::SGDTOp(OpcodeArgs) {\n  auto DestAddress = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.LoadData = false});\n\n  // Store an emulated value in the format of:\n  // uint16_t Limit;\n  // {uint32_t,uint64_t} Base;\n  //\n  // Limit is always 0\n  // Base is always in kernel space at: 0xFFFFFFFFFFFE0000ULL\n  //\n  // Operand size prefix is ignored on this instruction, size purely depends on operating mode.\n  uint64_t GDTAddress = 0xFFFFFFFFFFFE0000ULL;\n  auto GDTStoreSize = OpSize::i64Bit;\n  if (!Is64BitMode) {\n    // Mask off upper bits if 32-bit result.\n    GDTAddress &= ~0U;\n    GDTStoreSize = OpSize::i32Bit;\n  }\n\n  _StoreMemGPRAutoTSO(OpSize::i16Bit, DestAddress, Constant(0));\n  _StoreMemGPRAutoTSO(GDTStoreSize, AddressMode {.Base = DestAddress, .Offset = 2, .AddrSize = OpSize::i64Bit}, Constant(GDTAddress));\n}\n\nvoid OpDispatchBuilder::SIDTOp(OpcodeArgs) {\n  auto DestAddress = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.LoadData = false});\n\n  // See SGDTOp, matches Linux in reported values\n  uint64_t IDTAddress = 0xFFFFFE0000000000ULL;\n  auto IDTStoreSize = OpSize::i64Bit;\n  if (!Is64BitMode) {\n    // Mask off upper bits if 32-bit result.\n    IDTAddress &= ~0U;\n    IDTStoreSize = OpSize::i32Bit;\n  }\n\n  _StoreMemGPRAutoTSO(OpSize::i16Bit, DestAddress, Constant(0xfff));\n  _StoreMemGPRAutoTSO(IDTStoreSize, AddressMode {.Base = DestAddress, .Offset = 2, .AddrSize = OpSize::i64Bit}, Constant(IDTAddress));\n}\n\nvoid OpDispatchBuilder::SMSWOp(OpcodeArgs) {\n  const bool IsMemDst = DestIsMem(Op);\n\n  IR::OpSize DstSize {OpSize::iInvalid};\n  Ref Const = Constant((1U << 31) | ///< PG - Paging\n                       (0U << 30) | ///< CD - Cache Disable\n                       (0U << 29) | ///< NW - Not Writethrough (Legacy, now ignored)\n                       ///< [28:19] - Reserved\n                       (1U << 18) | ///< AM - Alignment Mask\n                       ///< 17 - Reserved\n                       (1U << 16) | ///< WP - Write Protect\n                       ///< [15:6] - Reserved\n                       (1U << 5) | ///< NE - Numeric Error\n                       (1U << 4) | ///< ET - Extension Type (Legacy, now reserved and 1)\n                       (0U << 3) | ///< TS - Task Switched\n                       (0U << 2) | ///< EM - Emulation\n                       (1U << 1) | ///< MP - Monitor Coprocessor\n                       (1U << 0)); ///< PE - Protection Enabled\n  const auto OpAddr = X86Tables::DecodeFlags::GetOpAddr(Op->Flags, 0);\n  if (Is64BitMode) {\n    DstSize = OpAddr == X86Tables::DecodeFlags::FLAG_OPERAND_SIZE_LAST  ? OpSize::i16Bit :\n              OpAddr == X86Tables::DecodeFlags::FLAG_WIDENING_SIZE_LAST ? OpSize::i64Bit :\n                                                                          OpSize::i32Bit;\n\n    if (!IsMemDst && DstSize == OpSize::i32Bit) {\n      // Special-case version of `smsw ebx`. This instruction does an insert in to the lower 32-bits on 64-bit hosts.\n      // Override and insert.\n      auto Dest = LoadSourceGPR_WithOpSize(Op, Op->Dest, GetGPROpSize(), Op->Flags);\n      Const = _Bfi(OpSize::i64Bit, 32, 0, Dest, Const);\n      DstSize = OpSize::i64Bit;\n    }\n  } else {\n    DstSize = OpAddr == X86Tables::DecodeFlags::FLAG_OPERAND_SIZE_LAST ? OpSize::i16Bit : OpSize::i32Bit;\n  }\n\n  if (IsMemDst) {\n    // Memory destinatino always writes only 16-bits.\n    DstSize = OpSize::i16Bit;\n  }\n\n  StoreResultGPR_WithOpSize(Op, Op->Dest, Const, DstSize);\n}\n\nOpDispatchBuilder::CycleCounterPair OpDispatchBuilder::CycleCounter(bool SelfSynchronizingLoads) {\n  Ref CounterLow {};\n  Ref CounterHigh {};\n  auto Counter = _CycleCounter(SelfSynchronizingLoads);\n  if (CTX->Config.TSCScale) {\n    CounterLow = _Lshl(OpSize::i32Bit, Counter, Constant(CTX->Config.TSCScale));\n    CounterHigh = _Lshr(OpSize::i64Bit, Counter, Constant(32 - CTX->Config.TSCScale));\n  } else {\n    CounterLow = _Bfe(OpSize::i64Bit, 32, 0, Counter);\n    CounterHigh = _Bfe(OpSize::i64Bit, 32, 32, Counter);\n  }\n\n  return {\n    .CounterLow = CounterLow,\n    .CounterHigh = CounterHigh,\n  };\n}\n\nvoid OpDispatchBuilder::RDTSCOp(OpcodeArgs) {\n  auto Counter = CycleCounter(false);\n  StoreGPRRegister(X86State::REG_RAX, Counter.CounterLow);\n  StoreGPRRegister(X86State::REG_RDX, Counter.CounterHigh);\n}\n\nvoid OpDispatchBuilder::INCOp(OpcodeArgs) {\n  Ref Dest;\n  Ref Result;\n  const auto Size = GetSrcBitSize(Op);\n  const bool IsLocked = DestIsLockedMem(Op);\n\n  if (IsLocked) {\n    HandledLock = true;\n\n    Ref DestAddress = MakeSegmentAddress(Op, Op->Dest);\n    Dest = _AtomicFetchAdd(OpSizeFromSrc(Op), Constant(1), DestAddress);\n  } else {\n    Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = Size >= 32});\n  }\n\n  CalculateDeferredFlags();\n\n  if (Size < 32 && CTX->HostFeatures.SupportsFlagM) {\n    // Addition producing upper garbage\n    Result = Add(OpSize::i32Bit, Dest, 1);\n    CalculatePF(Result);\n    CalculateAF(Dest, Constant(1));\n\n    // Correctly set NZ flags, preserving C\n    HandleNZCV_RMW();\n    _SetSmallNZV(OpSizeFromSrc(Op), Result);\n\n    // Fix up V flag. INC overflows only when incrementing a positive and\n    // getting a negative. So compare the sign bits to calculate V.\n    _RmifNZCV(_Andn(OpSize::i32Bit, Result, Dest), Size - 1, 1);\n  } else {\n    Result = CalculateFlags_ADD(OpSizeFromSrc(Op), Dest, Constant(1), false);\n  }\n\n  if (!IsLocked) {\n    StoreResultGPR(Op, Result);\n  }\n}\n\nvoid OpDispatchBuilder::DECOp(OpcodeArgs) {\n  Ref Dest;\n  Ref Result;\n  const auto Size = GetSrcBitSize(Op);\n  const bool IsLocked = DestIsLockedMem(Op);\n\n  if (IsLocked) {\n    HandledLock = true;\n\n    Ref DestAddress = MakeSegmentAddress(Op, Op->Dest);\n\n    // Use Add instead of Sub to avoid a NEG\n    Dest = _AtomicFetchAdd(OpSizeFromSrc(Op), Constant(Size == 64 ? -1 : ((1ULL << Size) - 1)), DestAddress);\n  } else {\n    Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = Size >= 32});\n  }\n\n  CalculateDeferredFlags();\n\n  if (Size < 32 && CTX->HostFeatures.SupportsFlagM) {\n    // Subtraction producing upper garbage\n    Result = Sub(OpSize::i32Bit, Dest, 1);\n    CalculatePF(Result);\n    CalculateAF(Dest, Constant(1));\n\n    // Correctly set NZ flags, preserving C\n    HandleNZCV_RMW();\n    _SetSmallNZV(OpSizeFromSrc(Op), Result);\n\n    // Fix up V flag. DEC overflows only when decrementing a negative and\n    // getting a positive. So compare the sign bits to calculate V.\n    _RmifNZCV(_Andn(OpSize::i32Bit, Dest, Result), Size - 1, 1);\n  } else {\n    Result = CalculateFlags_SUB(OpSizeFromSrc(Op), Dest, Constant(1), false);\n  }\n\n  if (!IsLocked) {\n    StoreResultGPR(Op, Result);\n  }\n}\n\nvoid OpDispatchBuilder::STOSOp(OpcodeArgs) {\n  if (Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_ADDRESS_SIZE) {\n    LogMan::Msg::EFmt(\"STOSOp: Can't handle address size override (OP: 0x{:04X}, Flags: 0x{:08X})\", Op->OP, Op->Flags);\n    DecodeFailure = true;\n    return;\n  }\n\n  const auto Size = OpSizeFromSrc(Op);\n  const bool Repeat = (Op->Flags & (FEXCore::X86Tables::DecodeFlags::FLAG_REP_PREFIX | FEXCore::X86Tables::DecodeFlags::FLAG_REPNE_PREFIX)) != 0;\n\n  if (!Repeat) {\n    // Src is used only for a store of the same size so allow garbage\n    Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n\n    // Only ES prefix\n    Ref Dest = MakeSegmentAddress(X86State::REG_RDI, 0, X86Tables::DecodeFlags::FLAG_ES_PREFIX, true);\n\n    // Store to memory where RDI points\n    if (CTX->IsMemcpyAtomicTSOEnabled()) {\n      _StoreMemGPRAutoTSO(Size, Dest, Src, Size);\n    } else {\n      _StoreMem(RegClass::GPR, Size, Src, Dest, Invalid(), OpSize::i8Bit, MemOffsetType::SXTX, 1);\n    }\n\n    // Offset the pointer\n    Ref TailDest = LoadGPRRegister(X86State::REG_RDI);\n    StoreGPRRegister(X86State::REG_RDI, OffsetByDir(TailDest, IR::OpSizeToSize(Size)));\n  } else {\n    // FEX doesn't support partial faulting REP instructions.\n    // Converting this to a `MemSet` IR op optimizes this quite significantly in our codegen.\n    // If FEX is to gain support for faulting REP instructions, then this implementation needs to change significantly.\n    Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n    Ref Dest = LoadGPRRegister(X86State::REG_RDI);\n\n    // Only ES prefix\n    auto Segment = GetSegment(0, FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX, true);\n\n    Ref Counter = LoadGPRRegister(X86State::REG_RCX);\n\n    auto Result = _MemSet(CTX->IsAtomicTSOEnabled(), Size, Segment ?: InvalidNode, Dest, Src, Counter, LoadDir(1));\n    StoreGPRRegister(X86State::REG_RCX, Constant(0));\n    StoreGPRRegister(X86State::REG_RDI, Result);\n  }\n}\n\nvoid OpDispatchBuilder::MOVSOp(OpcodeArgs) {\n  if (Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_ADDRESS_SIZE) {\n    LogMan::Msg::EFmt(\"MOVSOp: Can't handle address size override (OP: 0x{:04X}, Flags: 0x{:08X})\", Op->OP, Op->Flags);\n    DecodeFailure = true;\n    return;\n  }\n\n  // RA now can handle these to be here, to avoid DF accesses\n  const auto Size = OpSizeFromSrc(Op);\n\n  if (Op->Flags & (FEXCore::X86Tables::DecodeFlags::FLAG_REP_PREFIX | FEXCore::X86Tables::DecodeFlags::FLAG_REPNE_PREFIX)) {\n    auto SrcAddr = LoadGPRRegister(X86State::REG_RSI);\n    auto DstAddr = LoadGPRRegister(X86State::REG_RDI);\n    auto Counter = LoadGPRRegister(X86State::REG_RCX);\n\n    auto DstSegment = GetSegment(0, FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX, true);\n    auto SrcSegment = GetSegment(Op->Flags, FEXCore::X86Tables::DecodeFlags::FLAG_DS_PREFIX);\n\n    if (DstSegment) {\n      DstAddr = Add(OpSize::i64Bit, DstAddr, DstSegment);\n    }\n\n    if (SrcSegment) {\n      SrcAddr = Add(OpSize::i64Bit, SrcAddr, SrcSegment);\n    }\n\n    Ref Result_Src = _AllocateGPR(false);\n    Ref Result_Dst = _AllocateGPR(false);\n    _MemCpy(CTX->IsAtomicTSOEnabled(), Size, DstAddr, SrcAddr, Counter, LoadDir(1), Result_Dst, Result_Src);\n\n    if (DstSegment) {\n      Result_Dst = Sub(OpSize::i64Bit, Result_Dst, DstSegment);\n    }\n\n    if (SrcSegment) {\n      Result_Src = Sub(OpSize::i64Bit, Result_Src, SrcSegment);\n    }\n\n    StoreGPRRegister(X86State::REG_RCX, Constant(0));\n    StoreGPRRegister(X86State::REG_RDI, Result_Dst);\n    StoreGPRRegister(X86State::REG_RSI, Result_Src);\n  } else {\n    Ref RSI = MakeSegmentAddress(X86State::REG_RSI, Op->Flags, X86Tables::DecodeFlags::FLAG_DS_PREFIX);\n    Ref RDI = MakeSegmentAddress(X86State::REG_RDI, 0, X86Tables::DecodeFlags::FLAG_ES_PREFIX, true);\n\n    if (CTX->IsMemcpyAtomicTSOEnabled()) {\n      auto Src = _LoadMemGPRAutoTSO(Size, RSI, Size);\n\n      // Store to memory where RDI points\n      _StoreMemGPRAutoTSO(Size, RDI, Src, Size);\n    } else {\n      auto Src = _LoadMem(RegClass::GPR, Size, RSI, Invalid(), OpSize::i8Bit, MemOffsetType::SXTX, 1);\n      _StoreMem(RegClass::GPR, Size, Src, RDI, Invalid(), OpSize::i8Bit, MemOffsetType::SXTX, 1);\n    }\n\n    RSI = OffsetByDir(RSI, IR::OpSizeToSize(Size));\n    RDI = OffsetByDir(RDI, IR::OpSizeToSize(Size));\n\n    StoreGPRRegister(X86State::REG_RSI, RSI);\n    StoreGPRRegister(X86State::REG_RDI, RDI);\n  }\n}\n\nIR::OpSize OpDispatchBuilder::GetStringOpSize(X86Tables::DecodedOp Op) const {\n  LOGMAN_THROW_A_FMT(Is64BitMode || !(Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_ADDRESS_SIZE), \"Invalid modifier on 32bit address\");\n  return !Is64BitMode || (Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_ADDRESS_SIZE) ? OpSize::i32Bit : OpSize::i64Bit;\n}\n\nvoid OpDispatchBuilder::CMPSOp(OpcodeArgs) {\n  if (!Is64BitMode && (Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_ADDRESS_SIZE)) {\n    LogMan::Msg::EFmt(\"CMPSOp: Address size override (0x67) not supported in 32-bit mode (OP: 0x{:04X}).\", Op->OP);\n    DecodeFailure = true;\n    return;\n  }\n\n  const auto Size = OpSizeFromSrc(Op);\n  OpSize AddrSize = GetStringOpSize(Op);\n\n  bool Repeat = Op->Flags & (FEXCore::X86Tables::DecodeFlags::FLAG_REPNE_PREFIX | FEXCore::X86Tables::DecodeFlags::FLAG_REP_PREFIX);\n  if (!Repeat) {\n    Ref Src_RSI = LoadGPRRegister(X86State::REG_RSI, AddrSize);\n    Ref Src_RDI = LoadGPRRegister(X86State::REG_RDI, AddrSize);\n\n    Ref Dest_RSI = AppendSegmentOffset(Src_RSI, Op->Flags, X86Tables::DecodeFlags::FLAG_DS_PREFIX);\n    Ref Dest_RDI = AppendSegmentOffset(Src_RDI, 0, X86Tables::DecodeFlags::FLAG_ES_PREFIX, true);\n\n    auto Src1 = _LoadMemGPRAutoTSO(Size, Dest_RDI, Size);\n    auto Src2 = _LoadMemGPRAutoTSO(Size, Dest_RSI, Size);\n\n    CalculateFlags_SUB(OpSizeFromSrc(Op), Src2, Src1);\n\n    Dest_RDI = OffsetByDir(Src_RDI, IR::OpSizeToSize(Size));\n    if (Is64BitMode && AddrSize == OpSize::i32Bit) {\n      Dest_RDI = _Bfe(OpSize::i64Bit, 32, 0, Dest_RDI);\n      StoreGPRRegister(X86State::REG_RDI, Dest_RDI);\n    } else {\n      StoreGPRRegister(X86State::REG_RDI, Dest_RDI, AddrSize);\n    }\n\n    Dest_RSI = OffsetByDir(Src_RSI, IR::OpSizeToSize(Size));\n    if (Is64BitMode && AddrSize == OpSize::i32Bit) {\n      Dest_RSI = _Bfe(OpSize::i64Bit, 32, 0, Dest_RSI);\n      StoreGPRRegister(X86State::REG_RSI, Dest_RSI);\n    } else {\n      StoreGPRRegister(X86State::REG_RSI, Dest_RSI, AddrSize);\n    }\n  } else {\n    // Calculate flags early.\n    CalculateDeferredFlags();\n\n    bool REPE = Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_REP_PREFIX;\n\n    // If rcx = 0, skip the whole loop.\n    Ref Counter = LoadGPRRegister(X86State::REG_RCX);\n    auto OuterJump = CondJump(Counter, CondClass::EQ);\n\n    auto BeforeLoop = CreateNewCodeBlockAfter(GetCurrentBlock());\n    SetFalseJumpTarget(OuterJump, BeforeLoop);\n    SetCurrentCodeBlock(BeforeLoop);\n    StartNewBlock();\n\n    ForeachDirection([this, Op, Size, AddrSize, REPE](int32_t PtrDir) {\n      IRPair<IROp_CondJump> InnerJump;\n      auto JumpIntoLoop = Jump();\n\n      // Setup for the loop\n      auto LoopHeader = CreateNewCodeBlockAfter(GetCurrentBlock());\n      SetCurrentCodeBlock(LoopHeader);\n      StartNewBlock();\n      SetJumpTarget(JumpIntoLoop, LoopHeader);\n\n      // Working loop\n      {\n        Ref Src_RSI = LoadGPRRegister(X86State::REG_RSI, AddrSize);\n        Ref Src_RDI = LoadGPRRegister(X86State::REG_RDI, AddrSize);\n\n        Ref Dest_RSI = AppendSegmentOffset(Src_RSI, Op->Flags, X86Tables::DecodeFlags::FLAG_DS_PREFIX);\n        Ref Dest_RDI = AppendSegmentOffset(Src_RDI, 0, X86Tables::DecodeFlags::FLAG_ES_PREFIX, true);\n\n        auto Src1 = _LoadMemGPRAutoTSO(Size, Dest_RDI, Size);\n        auto Src2 = _LoadMemGPR(Size, Dest_RSI, Size);\n\n        // We'll calculate PF/AF after the loop, so use them as temporaries here.\n        StoreRegister(Core::CPUState::PF_AS_GREG, false, Src1);\n        StoreRegister(Core::CPUState::AF_AS_GREG, false, Src2);\n\n        Ref TailCounter = LoadGPRRegister(X86State::REG_RCX);\n\n        // Decrement counter\n        TailCounter = SubWithFlags(OpSize::i64Bit, TailCounter, 1);\n\n        // Store the counter since we don't have phis\n        StoreGPRRegister(X86State::REG_RCX, TailCounter);\n\n        Dest_RDI = Add(AddrSize, Src_RDI, PtrDir * static_cast<int32_t>(IR::OpSizeToSize(Size)));\n        if (Is64BitMode && AddrSize == OpSize::i32Bit) {\n          Dest_RDI = _Bfe(OpSize::i64Bit, 32, 0, Dest_RDI);\n          StoreGPRRegister(X86State::REG_RDI, Dest_RDI);\n        } else {\n          StoreGPRRegister(X86State::REG_RDI, Dest_RDI, AddrSize);\n        }\n\n        Dest_RSI = Add(AddrSize, Src_RSI, PtrDir * static_cast<int32_t>(IR::OpSizeToSize(Size)));\n        if (Is64BitMode && AddrSize == OpSize::i32Bit) {\n          Dest_RSI = _Bfe(OpSize::i64Bit, 32, 0, Dest_RSI);\n          StoreGPRRegister(X86State::REG_RSI, Dest_RSI);\n        } else {\n          StoreGPRRegister(X86State::REG_RSI, Dest_RSI, AddrSize);\n        }\n\n        // If TailCounter != 0, compare sources.\n        // If TailCounter == 0, set ZF iff that would break.\n        _CondSubNZCV(OpSize::i64Bit, Src2, Src1, CondClass::NEQ, REPE ? 0 : (1 << 2) /* Z */);\n        CachedNZCV = nullptr;\n        NZCVDirty = false;\n        InnerJump = CondJumpNZCV(REPE ? CondClass::EQ : CondClass::NEQ);\n\n        // Jump back to the start if we have more work to do\n        SetTrueJumpTarget(InnerJump, LoopHeader);\n      }\n\n      // Make sure to start a new block after ending this one\n      auto LoopEnd = CreateNewCodeBlockAfter(GetCurrentBlock());\n      SetFalseJumpTarget(InnerJump, LoopEnd);\n      SetCurrentCodeBlock(LoopEnd);\n      StartNewBlock();\n    });\n\n    // Make sure to start a new block after ending this one\n    {\n      // Grab the sources from the last iteration so we can set flags.\n      auto Src1 = LoadGPR(Core::CPUState::PF_AS_GREG);\n      auto Src2 = LoadGPR(Core::CPUState::AF_AS_GREG);\n      CalculateFlags_SUB(OpSizeFromSrc(Op), Src2, Src1);\n    }\n    auto Jump_ = Jump();\n\n    auto Exit = CreateNewCodeBlockAfter(GetCurrentBlock());\n    SetJumpTarget(Jump_, Exit);\n    SetTrueJumpTarget(OuterJump, Exit);\n    SetCurrentCodeBlock(Exit);\n    StartNewBlock();\n  }\n}\n\nvoid OpDispatchBuilder::LODSOp(OpcodeArgs) {\n  if (Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_ADDRESS_SIZE) {\n    LogMan::Msg::EFmt(\"LODSOp: Can't handle address size override (OP: 0x{:04X}, Flags: 0x{:08X})\", Op->OP, Op->Flags);\n    DecodeFailure = true;\n    return;\n  }\n\n  const auto Size = OpSizeFromSrc(Op);\n  const bool Repeat = (Op->Flags & (FEXCore::X86Tables::DecodeFlags::FLAG_REP_PREFIX | FEXCore::X86Tables::DecodeFlags::FLAG_REPNE_PREFIX)) != 0;\n\n  if (!Repeat) {\n    Ref Dest_RSI = MakeSegmentAddress(X86State::REG_RSI, Op->Flags, X86Tables::DecodeFlags::FLAG_DS_PREFIX);\n\n    auto Src = _LoadMemGPRAutoTSO(Size, Dest_RSI, Size);\n\n    StoreResultGPR(Op, Src);\n\n    // Offset the pointer\n    Ref TailDest_RSI = LoadGPRRegister(X86State::REG_RSI);\n    StoreGPRRegister(X86State::REG_RSI, OffsetByDir(TailDest_RSI, IR::OpSizeToSize(Size)));\n  } else {\n    // Calculate flags early. because end of block\n    CalculateDeferredFlags();\n\n    ForeachDirection([this, Op, Size](int32_t PtrDir) {\n      // XXX: Theoretically LODS could be optimized to\n      // RSI += {-}(RCX * Size)\n      // RAX = [RSI - Size]\n      // But this might violate the case of an application scanning pages for read permission and catching the fault\n      // May or may not matter\n\n      auto JumpStart = Jump();\n      // Make sure to start a new block after ending this one\n      auto LoopStart = CreateNewCodeBlockAfter(GetCurrentBlock());\n      SetJumpTarget(JumpStart, LoopStart);\n      SetCurrentCodeBlock(LoopStart);\n      StartNewBlock();\n\n      Ref Counter = LoadGPRRegister(X86State::REG_RCX);\n\n      // Can we end the block?\n\n      // We leave if RCX = 0\n      auto CondJump_ = CondJump(Counter, CondClass::EQ);\n\n      auto LoopTail = CreateNewCodeBlockAfter(LoopStart);\n      SetFalseJumpTarget(CondJump_, LoopTail);\n      SetCurrentCodeBlock(LoopTail);\n      StartNewBlock();\n\n      // Working loop\n      {\n        Ref Dest_RSI = MakeSegmentAddress(X86State::REG_RSI, Op->Flags, X86Tables::DecodeFlags::FLAG_DS_PREFIX);\n\n        auto Src = _LoadMemGPRAutoTSO(Size, Dest_RSI, Size);\n\n        StoreResultGPR(Op, Src);\n\n        Ref TailCounter = LoadGPRRegister(X86State::REG_RCX);\n        Ref TailDest_RSI = LoadGPRRegister(X86State::REG_RSI);\n\n        // Decrement counter\n        TailCounter = Sub(OpSize::i64Bit, TailCounter, 1);\n\n        // Store the counter since we don't have phis\n        StoreGPRRegister(X86State::REG_RCX, TailCounter);\n\n        // Offset the pointer\n        TailDest_RSI = Add(OpSize::i64Bit, TailDest_RSI, PtrDir * static_cast<int32_t>(IR::OpSizeToSize(Size)));\n        StoreGPRRegister(X86State::REG_RSI, TailDest_RSI);\n\n        // Jump back to the start, we have more work to do\n        Jump(LoopStart);\n      }\n      // Make sure to start a new block after ending this one\n      auto LoopEnd = CreateNewCodeBlockAfter(LoopTail);\n      SetTrueJumpTarget(CondJump_, LoopEnd);\n      SetCurrentCodeBlock(LoopEnd);\n      StartNewBlock();\n    });\n  }\n}\n\nvoid OpDispatchBuilder::SCASOp(OpcodeArgs) {\n  if (!Is64BitMode && (Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_ADDRESS_SIZE)) {\n    LogMan::Msg::EFmt(\"SCASOp: Address size override (0x67) not supported in 32-bit mode (OP: 0x{:04X}).\", Op->OP);\n    DecodeFailure = true;\n    return;\n  }\n\n  const auto Size = OpSizeFromSrc(Op);\n  OpSize AddrSize = GetStringOpSize(Op);\n  const bool Repeat = (Op->Flags & (FEXCore::X86Tables::DecodeFlags::FLAG_REPNE_PREFIX | FEXCore::X86Tables::DecodeFlags::FLAG_REP_PREFIX)) != 0;\n\n  if (!Repeat) {\n    Ref Src_RDI = LoadGPRRegister(X86State::REG_RDI, AddrSize);\n    Ref Dest_RDI = AppendSegmentOffset(Src_RDI, 0, X86Tables::DecodeFlags::FLAG_ES_PREFIX, true);\n\n    auto Src1 = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n    auto Src2 = _LoadMemGPRAutoTSO(Size, Dest_RDI, Size);\n\n    CalculateFlags_SUB(OpSizeFromSrc(Op), Src1, Src2);\n\n    Ref TailDest_RDI = OffsetByDir(Src_RDI, IR::OpSizeToSize(Size));\n    if (Is64BitMode && AddrSize == OpSize::i32Bit) {\n      TailDest_RDI = _Bfe(OpSize::i64Bit, 32, 0, TailDest_RDI);\n      StoreGPRRegister(X86State::REG_RDI, TailDest_RDI);\n    } else {\n      StoreGPRRegister(X86State::REG_RDI, TailDest_RDI, AddrSize);\n    }\n  } else {\n    // Calculate flags early. because end of block\n    CalculateDeferredFlags();\n\n    ForeachDirection([this, Op, Size, AddrSize](int32_t Dir) {\n      bool REPE = Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_REP_PREFIX;\n\n      auto JumpStart = Jump();\n      // Make sure to start a new block after ending this one\n      auto LoopStart = CreateNewCodeBlockAfter(GetCurrentBlock());\n      SetJumpTarget(JumpStart, LoopStart);\n      SetCurrentCodeBlock(LoopStart);\n      StartNewBlock();\n\n      Ref Counter = LoadGPRRegister(X86State::REG_RCX);\n\n      // Can we end the block?\n      // We leave if RCX = 0\n      auto CondJump_ = CondJump(Counter, CondClass::EQ);\n      IRPair<IROp_CondJump> InternalCondJump;\n\n      auto LoopTail = CreateNewCodeBlockAfter(LoopStart);\n      SetFalseJumpTarget(CondJump_, LoopTail);\n      SetCurrentCodeBlock(LoopTail);\n      StartNewBlock();\n\n      // Working loop\n      {\n        Ref Src_RDI = LoadGPRRegister(X86State::REG_RDI, AddrSize);\n        Ref Dest_RDI = AppendSegmentOffset(Src_RDI, 0, X86Tables::DecodeFlags::FLAG_ES_PREFIX, true);\n\n        auto Src1 = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n        auto Src2 = _LoadMemGPRAutoTSO(Size, Dest_RDI, Size);\n\n        CalculateFlags_SUB(OpSizeFromSrc(Op), Src1, Src2);\n\n        // Calculate flags early.\n        CalculateDeferredFlags();\n\n        Ref TailCounter = LoadGPRRegister(X86State::REG_RCX);\n        Ref Src_RDI_Tail = LoadGPRRegister(X86State::REG_RDI, AddrSize);\n\n        // Decrement counter\n        TailCounter = Sub(OpSize::i64Bit, TailCounter, 1);\n\n        // Store the counter since we don't have phis\n        StoreGPRRegister(X86State::REG_RCX, TailCounter);\n\n        Ref TailDest_RDI = Add(AddrSize, Src_RDI_Tail, Dir * static_cast<int32_t>(IR::OpSizeToSize(Size)));\n        if (Is64BitMode && AddrSize == OpSize::i32Bit) {\n          TailDest_RDI = _Bfe(OpSize::i64Bit, 32, 0, TailDest_RDI);\n          StoreGPRRegister(X86State::REG_RDI, TailDest_RDI);\n        } else {\n          StoreGPRRegister(X86State::REG_RDI, TailDest_RDI, AddrSize);\n        }\n\n        CalculateDeferredFlags();\n        InternalCondJump = CondJumpNZCV(REPE ? CondClass::EQ : CondClass::NEQ);\n\n        // Jump back to the start if we have more work to do\n        SetTrueJumpTarget(InternalCondJump, LoopStart);\n      }\n      // Make sure to start a new block after ending this one\n      auto LoopEnd = CreateNewCodeBlockAfter(LoopTail);\n      SetTrueJumpTarget(CondJump_, LoopEnd);\n\n      SetFalseJumpTarget(InternalCondJump, LoopEnd);\n\n      SetCurrentCodeBlock(LoopEnd);\n      StartNewBlock();\n    });\n  }\n}\n\nvoid OpDispatchBuilder::BSWAPOp(OpcodeArgs) {\n  Ref Dest;\n  const auto Size = OpSizeFromSrc(Op);\n  if (Size == OpSize::i16Bit) {\n    // BSWAP of 16bit is undef. ZEN+ causes the lower 16bits to get zero'd\n    Dest = Constant(0);\n  } else {\n    Dest = LoadSourceGPR_WithOpSize(Op, Op->Dest, GetGPROpSize(), Op->Flags);\n    Dest = _Rev(Size, Dest);\n  }\n  StoreResultGPR(Op, Dest);\n}\n\nvoid OpDispatchBuilder::PUSHFOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n\n  Push(Size, GetPackedRFLAG());\n}\n\nvoid OpDispatchBuilder::POPFOp(OpcodeArgs) {\n  const auto Size = OpSizeFromSrc(Op);\n  Ref Src = Pop(Size);\n\n  // Add back our flag constants\n  // Bit 1 is always 1\n  // Bit 9 is always 1 because we always have interrupts enabled\n\n  Src = _Or(OpSize::i64Bit, Src, Constant(0x202));\n\n  SetPackedRFLAG(false, Src);\n\n  auto NewRIP = GetRelocatedPC(Op);\n  ExitFunction(NewRIP, BranchHint::CheckTF);\n  BlockSetRIP = true;\n}\n\nvoid OpDispatchBuilder::NEGOp(OpcodeArgs) {\n  HandledLock = (Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_LOCK) != 0;\n\n  const auto Size = OpSizeFromSrc(Op);\n  auto ZeroConst = Constant(0);\n\n  if (DestIsLockedMem(Op)) {\n    Ref DestMem = MakeSegmentAddress(Op, Op->Dest);\n    Ref Dest = _AtomicFetchNeg(Size, DestMem);\n    CalculateFlags_SUB(Size, ZeroConst, Dest);\n  } else {\n    Ref Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n    Ref Result = CalculateFlags_SUB(Size, ZeroConst, Dest);\n\n    StoreResultGPR(Op, Result);\n  }\n}\n\nvoid OpDispatchBuilder::DIVOp(OpcodeArgs) {\n  const auto GPRSize = GetGPROpSize();\n  auto Size = OpSizeFromSrc(Op);\n\n  // This loads the divisor. 32-bit/64-bit paths mask inside the JIT, 8/16 do not.\n  Ref Divisor = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = Size >= OpSize::i32Bit});\n\n  if (Size == OpSize::i64Bit && !Is64BitMode) {\n    LogMan::Msg::EFmt(\"Doesn't exist in 32bit mode\");\n    DecodeFailure = true;\n    return;\n  }\n\n  Ref Quotient = _AllocateGPR(true);\n  Ref Remainder = _AllocateGPR(true);\n\n  if (Size == OpSize::i8Bit) {\n    Ref Src1 = LoadGPRRegister(X86State::REG_RAX, OpSize::i16Bit);\n\n    _UDiv(OpSize::i16Bit, Src1, Invalid(), Divisor, Quotient, Remainder);\n\n    // AX[15:0] = concat<URem[7:0]:UDiv[7:0]>\n    auto ResultAX = _Bfi(GPRSize, 8, 8, Quotient, Remainder);\n    StoreGPRRegister(X86State::REG_RAX, ResultAX, OpSize::i16Bit);\n  } else {\n    Ref Src1 = LoadGPRRegister(X86State::REG_RAX);\n    Ref Src2 = LoadGPRRegister(X86State::REG_RDX);\n\n    _UDiv(Size, Src1, Src2, Divisor, Quotient, Remainder);\n\n    if (Size == OpSize::i32Bit) {\n      Quotient = _Bfe(OpSize::i32Bit, IR::OpSizeAsBits(Size), 0, Quotient);\n      Remainder = _Bfe(OpSize::i32Bit, IR::OpSizeAsBits(Size), 0, Remainder);\n      Size = OpSize::iInvalid;\n    }\n\n    StoreGPRRegister(X86State::REG_RAX, Quotient, Size);\n    StoreGPRRegister(X86State::REG_RDX, Remainder, Size);\n  }\n}\n\nvoid OpDispatchBuilder::IDIVOp(OpcodeArgs) {\n  // This loads the divisor\n  Ref Divisor = LoadSourceGPR(Op, Op->Dest, Op->Flags);\n\n  const auto GPRSize = GetGPROpSize();\n  auto Size = OpSizeFromSrc(Op);\n\n  if (Size == OpSize::i64Bit && !Is64BitMode) {\n    LogMan::Msg::EFmt(\"Doesn't exist in 32bit mode\");\n    DecodeFailure = true;\n    return;\n  }\n\n  Ref Quotient = _AllocateGPR(true);\n  Ref Remainder = _AllocateGPR(true);\n\n  if (Size == OpSize::i8Bit) {\n    Ref Src1 = LoadGPRRegister(X86State::REG_RAX);\n    Src1 = _Sbfe(OpSize::i64Bit, 16, 0, Src1);\n    Divisor = _Sbfe(OpSize::i64Bit, 8, 0, Divisor);\n\n    _Div(OpSize::i64Bit, Src1, Invalid(), Divisor, Quotient, Remainder);\n\n    // AX[15:0] = concat<URem[7:0]:UDiv[7:0]>\n    auto ResultAX = _Bfi(GPRSize, 8, 8, Quotient, Remainder);\n    StoreGPRRegister(X86State::REG_RAX, ResultAX, OpSize::i16Bit);\n  } else {\n    Ref Src1 = LoadGPRRegister(X86State::REG_RAX);\n    Ref Src2 = LoadGPRRegister(X86State::REG_RDX);\n\n    _Div(Size, Src1, Src2, Divisor, Quotient, Remainder);\n\n    if (Size == OpSize::i32Bit) {\n      Quotient = _Bfe(OpSize::i32Bit, IR::OpSizeAsBits(Size), 0, Quotient);\n      Remainder = _Bfe(OpSize::i32Bit, IR::OpSizeAsBits(Size), 0, Remainder);\n      Size = OpSize::iInvalid;\n    }\n\n    StoreGPRRegister(X86State::REG_RAX, Quotient, Size);\n    StoreGPRRegister(X86State::REG_RDX, Remainder, Size);\n  }\n}\n\nvoid OpDispatchBuilder::BSFOp(OpcodeArgs) {\n  const auto GPRSize = GetGPROpSize();\n  const auto DstSize = OpSizeFromDst(Op) == OpSize::i16Bit ? OpSize::i16Bit : GPRSize;\n  Ref Dest = LoadSourceGPR_WithOpSize(Op, Op->Dest, DstSize, Op->Flags, {.AllowUpperGarbage = true});\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n\n  // Find the LSB of this source\n  auto Result = _FindLSB(OpSizeFromSrc(Op), Src);\n\n  // OF, SF, AF, PF, CF all undefined\n  // ZF is set to 1 if the source was zero\n  SetZ_InvalidateNCV(OpSizeFromSrc(Op), Src);\n\n  // If Src was zero then the destination doesn't get modified.\n  //\n  // Although Intel does not guarantee that semantic, AMD does and Intel\n  // hardware satisfies it. We provide the stronger AMD behaviour as\n  // applications might rely on that in the wild.\n  auto SelectOp = NZCVSelect(GPRSize, CondClass::EQ, Dest, Result);\n  StoreResultGPR_WithOpSize(Op, Op->Dest, SelectOp, DstSize);\n}\n\nvoid OpDispatchBuilder::BSROp(OpcodeArgs) {\n  const auto GPRSize = GetGPROpSize();\n  const auto DstSize = OpSizeFromDst(Op) == OpSize::i16Bit ? OpSize::i16Bit : GPRSize;\n  Ref Dest = LoadSourceGPR_WithOpSize(Op, Op->Dest, DstSize, Op->Flags, {.AllowUpperGarbage = true});\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n\n  // Find the MSB of this source\n  auto Result = _FindMSB(OpSizeFromSrc(Op), Src);\n\n  // OF, SF, AF, PF, CF all undefined\n  // ZF is set to 1 if the source was zero\n  SetZ_InvalidateNCV(OpSizeFromSrc(Op), Src);\n\n  // If Src was zero then the destination doesn't get modified\n  auto SelectOp = NZCVSelect(GPRSize, CondClass::EQ, Dest, Result);\n  StoreResultGPR_WithOpSize(Op, Op->Dest, SelectOp, DstSize);\n}\n\nvoid OpDispatchBuilder::CMPXCHGOp(OpcodeArgs) {\n  // CMPXCHG ModRM, reg, {RAX}\n  // MemData = *ModRM.dest\n  // if (RAX == MemData)\n  //    modRM.dest = reg;\n  //    ZF = 1\n  // else\n  //    ZF = 0\n  // RAX = MemData\n  //\n  // CASL Xs, Xt, Xn\n  // MemData = *Xn\n  // if (MemData == Xs)\n  //    *Xn = Xt\n  // Xs = MemData\n\n  const auto GPRSize = GetGPROpSize();\n  auto Size = OpSizeFromSrc(Op);\n\n  if (Op->Dest.IsGPR()) {\n    // This is our source register\n    Ref Src2 = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n    Ref Src3 = LoadGPRRegister(X86State::REG_RAX);\n\n    // If the destination is also the accumulator, we get some algebraic\n    // simplifications. Not sure if this is actually hit but it's in\n    // InstCountCI.\n    bool Trivial = Op->Dest.Data.GPR.GPR == X86State::REG_RAX && !Op->Dest.IsGPRDirect() && !Op->Dest.Data.GPR.HighBits;\n\n    Ref Src1 {};\n    Ref Src1Lower {};\n\n    if (GPRSize == OpSize::i64Bit && Size == OpSize::i32Bit) {\n      Src1 = LoadSourceGPR_WithOpSize(Op, Op->Dest, GPRSize, Op->Flags, {.AllowUpperGarbage = true});\n      Src1Lower = Trivial ? Src1 : _Bfe(GPRSize, IR::OpSizeAsBits(Size), 0, Src1);\n    } else {\n      Src1 = LoadSourceGPR_WithOpSize(Op, Op->Dest, Size, Op->Flags, {.AllowUpperGarbage = true});\n      Src1Lower = Src1;\n    }\n\n    // Compare RAX with the destination, setting flags accordingly.\n    CalculateFlags_SUB(OpSizeFromSrc(Op), Src3, Src1Lower);\n    CalculateDeferredFlags();\n\n    if (!Trivial) {\n      if (GPRSize == OpSize::i64Bit && Size == OpSize::i32Bit) {\n        // This allows us to only hit the ZEXT case on failure\n        Ref RAXResult = NZCVSelect(OpSize::i64Bit, CondClass::EQ, Src3, Src1Lower);\n\n        // When the size is 4 we need to make sure not zext the GPR when the comparison fails\n        StoreGPRRegister(X86State::REG_RAX, RAXResult);\n      } else {\n        StoreGPRRegister(X86State::REG_RAX, Src1Lower, Size);\n      }\n    }\n\n    // Op1 = RAX == Op1 ? Op2 : Op1\n    // If they match then set the rm operand to the input\n    // else don't set the rm operand\n    Ref Src2Lower = Src2;\n    if (GPRSize == OpSize::i64Bit && Size == OpSize::i32Bit) {\n      Src2Lower = _Bfe(GPRSize, IR::OpSizeAsBits(Size), 0, Src2);\n    }\n    Ref DestResult = Trivial ? Src2 : NZCVSelect(OpSize::i64Bit, CondClass::EQ, Src2Lower, Src1);\n\n    // Store in to GPR Dest\n    if (GPRSize == OpSize::i64Bit && Size == OpSize::i32Bit) {\n      StoreResultGPR_WithOpSize(Op, Op->Dest, DestResult, GPRSize);\n    } else {\n      StoreResultGPR(Op, DestResult);\n    }\n  } else {\n    Ref Src2 = LoadSourceGPR(Op, Op->Src[0], Op->Flags);\n    HandledLock = Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_LOCK;\n\n    auto Src3 = LoadGPRRegister(X86State::REG_RAX);\n    auto Src3Lower = _Bfe(OpSize::i64Bit, OpSizeAsBits(Size), 0, Src3);\n\n    // If this is a memory location then we want the pointer to it\n    Ref Src1 = MakeSegmentAddress(Op, Op->Dest);\n\n    // DataSrc = *Src1\n    // if (DataSrc == Src3) { *Src1 == Src2; } Src2 = DataSrc\n    // This will write to memory! Careful!\n    // Third operand must be a calculated guest memory address\n    Ref CASResult = _CAS(Size, Src3, Src2, Src1);\n    Ref RAXResult = CASResult;\n\n    CalculateFlags_SUB(OpSizeFromSrc(Op), Src3Lower, CASResult);\n    CalculateDeferredFlags();\n\n    if (GPRSize == OpSize::i64Bit && Size == OpSize::i32Bit) {\n      // This allows us to only hit the ZEXT case on failure\n      RAXResult = _NZCVSelect(OpSize::i64Bit, CondClass::EQ, Src3, CASResult);\n      Size = OpSize::i64Bit;\n    }\n\n    // RAX gets the result of the CAS op\n    StoreGPRRegister(X86State::REG_RAX, RAXResult, Size);\n  }\n}\n\nvoid OpDispatchBuilder::CMPXCHGPairOp(OpcodeArgs) {\n  // Calculate flags early.\n  CalculateDeferredFlags();\n\n  // REX.W used to determine if it is 16byte or 8byte\n  // Unlike CMPXCHG, the destination can only be a memory location\n  const auto Size = Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_REX_WIDENING ? OpSize::i64Bit : OpSize::i32Bit;\n\n  HandledLock = (Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_LOCK) != 0;\n\n  // If this is a memory location then we want the pointer to it\n  Ref Src1 = MakeSegmentAddress(Op, Op->Dest);\n\n  // Load the full 64-bit registers, all the users ignore the upper 32-bits for\n  // 32-bit only cmpxchg. This saves some zero extension.\n  Ref Expected_Lower = LoadGPRRegister(X86State::REG_RAX);\n  Ref Expected_Upper = LoadGPRRegister(X86State::REG_RDX);\n  Ref Desired_Lower = LoadGPRRegister(X86State::REG_RBX);\n  Ref Desired_Upper = LoadGPRRegister(X86State::REG_RCX);\n\n  // ssa0 = Expected\n  // ssa1 = Desired\n  // ssa2 = MemoryLocation\n\n  // DataSrc = *MemSrc\n  // if (DataSrc == Expected) { *MemSrc == Desired; } Expected = DataSrc\n  // This will write to memory! Careful!\n  // Third operand must be a calculated guest memory address\n\n  Ref Result_Lower = _AllocateGPR(true);\n  Ref Result_Upper = _AllocateGPRAfter(Result_Lower);\n  _CASPair(Size, Expected_Lower, Expected_Upper, Desired_Lower, Desired_Upper, Src1, Result_Lower, Result_Upper);\n\n  HandleNZCV_RMW();\n  _CmpPairZ(Size, Result_Lower, Result_Upper, Expected_Lower, Expected_Upper);\n  CalculateDeferredFlags();\n\n  auto UpdateIfNotZF = [this](auto Reg, auto Value) {\n    // Always use 64-bit csel to preserve existing upper bits. If we have a\n    // 32-bit cmpxchg in a 64-bit context, Value will be zeroed in upper bits.\n    StoreGPRRegister(Reg, NZCVSelect(OpSize::i64Bit, CondClass::NEQ, Value, LoadGPRRegister(Reg)));\n  };\n\n  UpdateIfNotZF(X86State::REG_RAX, Result_Lower);\n  UpdateIfNotZF(X86State::REG_RDX, Result_Upper);\n}\n\nvoid OpDispatchBuilder::CreateJumpBlocks(const fextl::vector<FEXCore::Frontend::Decoder::DecodedBlocks>* Blocks) {\n  Ref PrevCodeBlock {};\n  for (auto& Target : *Blocks) {\n    auto CodeNode = CreateCodeNode(Target.IsEntryPoint, Target.Entry - Entry);\n\n    JumpTargets.try_emplace(Target.Entry, JumpTargetInfo {CodeNode, false, Target.IsEntryPoint});\n\n    if (PrevCodeBlock) {\n      LinkCodeBlocks(PrevCodeBlock, CodeNode);\n    }\n\n    PrevCodeBlock = CodeNode;\n  }\n}\n\nvoid OpDispatchBuilder::BeginFunction(uint64_t RIP, const fextl::vector<FEXCore::Frontend::Decoder::DecodedBlocks>* Blocks,\n                                      uint32_t NumInstructions, bool _Is64BitMode, bool MonoBackpatcherBlock) {\n  Entry = RIP;\n  Is64BitMode = _Is64BitMode;\n  LOGMAN_THROW_A_FMT(Is64BitMode == CTX->Config.Is64BitMode, \"Expected operating mode to not change at runtime!\");\n  IsMonoBackpatcherBlock = MonoBackpatcherBlock;\n  auto IRHeader = _IRHeader(InvalidNode, RIP, 0, NumInstructions, 0, 0);\n  CreateJumpBlocks(Blocks);\n\n  auto Block = GetNewJumpBlock(RIP);\n  SetCurrentCodeBlock(Block);\n  IRHeader.first->Blocks = Block->Wrapped(DualListData.ListBegin());\n  CurrentHeader = IRHeader.first;\n}\n\nvoid OpDispatchBuilder::Finalize() {\n  // This usually doesn't emit any IR but in the case of hitting the block instruction limit it will\n  FlushRegisterCache();\n  const auto GPRSize = GetGPROpSize();\n\n  // Node 0 is invalid node\n  Ref RealNode = reinterpret_cast<Ref>(GetNode(1));\n\n  const FEXCore::IR::IROp_Header* IROp = RealNode->Op(DualListData.DataBegin());\n  LOGMAN_THROW_A_FMT(IROp->Op == OP_IRHEADER, \"First op in function must be our header\");\n\n  // Let's walk the jump blocks and see if we have handled every block target\n  for (auto& Handler : JumpTargets) {\n    if (Handler.second.HaveEmitted) {\n      continue;\n    }\n\n    // We haven't emitted. Dump out to the dispatcher\n    SetCurrentCodeBlock(Handler.second.BlockEntry);\n    ExitFunction(_InlineEntrypointOffset(GPRSize, Handler.first - Entry));\n  }\n}\n\nuint8_t OpDispatchBuilder::GetDstSize(X86Tables::DecodedOp Op) const {\n  const uint32_t DstSizeFlag = X86Tables::DecodeFlags::GetSizeDstFlags(Op->Flags);\n  LOGMAN_THROW_A_FMT(DstSizeFlag != 0 && DstSizeFlag != X86Tables::DecodeFlags::SIZE_MASK, \"Invalid destination size for op\");\n  return 1u << (DstSizeFlag - 1);\n}\n\nuint8_t OpDispatchBuilder::GetSrcSize(X86Tables::DecodedOp Op) const {\n  const uint32_t SrcSizeFlag = X86Tables::DecodeFlags::GetSizeSrcFlags(Op->Flags);\n  LOGMAN_THROW_A_FMT(SrcSizeFlag != 0 && SrcSizeFlag != X86Tables::DecodeFlags::SIZE_MASK, \"Invalid destination size for op\");\n  return 1u << (SrcSizeFlag - 1);\n}\n\nuint32_t OpDispatchBuilder::GetSrcBitSize(X86Tables::DecodedOp Op) const {\n  return GetSrcSize(Op) * 8;\n}\n\nuint32_t OpDispatchBuilder::GetDstBitSize(X86Tables::DecodedOp Op) const {\n  return GetDstSize(Op) * 8;\n}\n\nRef OpDispatchBuilder::GetSegment(uint32_t Flags, uint32_t DefaultPrefix, bool Override) {\n  const auto GPRSize = GetGPROpSize();\n  uint32_t Prefix = Flags & FEXCore::X86Tables::DecodeFlags::FLAG_SEGMENTS;\n\n  if (Is64BitMode) {\n    if (Prefix == FEXCore::X86Tables::DecodeFlags::FLAG_FS_PREFIX) {\n      return _LoadContextGPR(GPRSize, offsetof(FEXCore::Core::CPUState, fs_cached));\n    } else if (Prefix == FEXCore::X86Tables::DecodeFlags::FLAG_GS_PREFIX) {\n      return _LoadContextGPR(GPRSize, offsetof(FEXCore::Core::CPUState, gs_cached));\n    }\n    // If there was any other segment in 64bit then it is ignored\n  } else {\n    if (Prefix == FEXCore::X86Tables::DecodeFlags::FLAG_NO_PREFIX || Override) {\n      // If there was no prefix then use the default one if available\n      // Or the argument only uses a specific prefix (with override set)\n      Prefix = DefaultPrefix;\n    }\n    // With the segment register optimization we store the GDT bases directly in the segment register to remove indexed loads\n    Ref SegmentResult {};\n    switch (Prefix) {\n    [[likely]] case FEXCore::X86Tables::DecodeFlags::FLAG_NO_PREFIX:\n      return nullptr;\n    case FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX:\n      SegmentResult = _LoadContextGPR(GPRSize, offsetof(FEXCore::Core::CPUState, es_cached));\n      break;\n    case FEXCore::X86Tables::DecodeFlags::FLAG_CS_PREFIX:\n      SegmentResult = _LoadContextGPR(GPRSize, offsetof(FEXCore::Core::CPUState, cs_cached));\n      break;\n    case FEXCore::X86Tables::DecodeFlags::FLAG_SS_PREFIX:\n      SegmentResult = _LoadContextGPR(GPRSize, offsetof(FEXCore::Core::CPUState, ss_cached));\n      break;\n    case FEXCore::X86Tables::DecodeFlags::FLAG_DS_PREFIX:\n      SegmentResult = _LoadContextGPR(GPRSize, offsetof(FEXCore::Core::CPUState, ds_cached));\n      break;\n    case FEXCore::X86Tables::DecodeFlags::FLAG_FS_PREFIX:\n      SegmentResult = _LoadContextGPR(GPRSize, offsetof(FEXCore::Core::CPUState, fs_cached));\n      break;\n    case FEXCore::X86Tables::DecodeFlags::FLAG_GS_PREFIX:\n      SegmentResult = _LoadContextGPR(GPRSize, offsetof(FEXCore::Core::CPUState, gs_cached));\n      break;\n    default: FEX_UNREACHABLE;\n    }\n\n    CheckLegacySegmentRead(SegmentResult, Prefix);\n    return SegmentResult;\n  }\n  return nullptr;\n}\n\nRef OpDispatchBuilder::AppendSegmentOffset(Ref Value, uint32_t Flags, uint32_t DefaultPrefix, bool Override) {\n  auto Segment = GetSegment(Flags, DefaultPrefix, Override);\n  if (Segment) {\n    Value = Add(std::max(OpSize::i32Bit, std::max(GetOpSize(Value), GetOpSize(Segment))), Value, Segment);\n  }\n\n  return Value;\n}\n\n\nvoid OpDispatchBuilder::CheckLegacySegmentRead(Ref NewNode, uint32_t SegmentReg) {\n#ifndef FEX_DISABLE_TELEMETRY\n  if (SegmentReg == FEXCore::X86Tables::DecodeFlags::FLAG_FS_PREFIX || SegmentReg == FEXCore::X86Tables::DecodeFlags::FLAG_GS_PREFIX) {\n    // FS and GS segments aren't considered legacy.\n    return;\n  }\n\n  if (!(SegmentsNeedReadCheck & SegmentReg)) {\n    // If the block has done multiple reads of a segment register then skip redundant read checks.\n    // Segment write will cause another read check.\n    return;\n  }\n\n  if (CTX->Config.DisableTelemetry()) {\n    // Telemetry disabled at runtime.\n    return;\n  }\n\n  FEXCore::Telemetry::TelemetryType TelemIndex {};\n  switch (SegmentReg) {\n  case FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX:\n    TelemIndex = FEXCore::Telemetry::TelemetryType::TYPE_USES_32BIT_SEGMENT_ES;\n    SegmentsNeedReadCheck &= ~FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX;\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_CS_PREFIX:\n    TelemIndex = FEXCore::Telemetry::TelemetryType::TYPE_USES_32BIT_SEGMENT_CS;\n    SegmentsNeedReadCheck &= ~FEXCore::X86Tables::DecodeFlags::FLAG_CS_PREFIX;\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_SS_PREFIX:\n    TelemIndex = FEXCore::Telemetry::TelemetryType::TYPE_USES_32BIT_SEGMENT_SS;\n    SegmentsNeedReadCheck &= ~FEXCore::X86Tables::DecodeFlags::FLAG_SS_PREFIX;\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_DS_PREFIX:\n    TelemIndex = FEXCore::Telemetry::TelemetryType::TYPE_USES_32BIT_SEGMENT_DS;\n    SegmentsNeedReadCheck &= ~FEXCore::X86Tables::DecodeFlags::FLAG_DS_PREFIX;\n    break;\n  default: FEX_UNREACHABLE;\n  }\n\n  // Will set the telemetry value if NewNode is != 0\n  _TelemetrySetValue(NewNode, TelemIndex);\n  // Telemetry will dirty flags, and user code does not expect LoadSource to clobber flags, fix that up here as this is an edge case.\n  CalculateDeferredFlags();\n#endif\n}\n\nvoid OpDispatchBuilder::CheckLegacySegmentWrite(Ref NewNode, uint32_t SegmentReg) {\n#ifndef FEX_DISABLE_TELEMETRY\n  if (SegmentReg == FEXCore::X86Tables::DecodeFlags::FLAG_FS_PREFIX || SegmentReg == FEXCore::X86Tables::DecodeFlags::FLAG_GS_PREFIX) {\n    // FS and GS segments aren't considered legacy.\n    return;\n  }\n\n  if (CTX->Config.DisableTelemetry()) {\n    // Telemetry disabled at runtime.\n    return;\n  }\n\n  FEXCore::Telemetry::TelemetryType TelemIndex {};\n  switch (SegmentReg) {\n  case FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX:\n    TelemIndex = FEXCore::Telemetry::TelemetryType::TYPE_WRITES_32BIT_SEGMENT_ES;\n    SegmentsNeedReadCheck |= FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX;\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_CS_PREFIX:\n    TelemIndex = FEXCore::Telemetry::TelemetryType::TYPE_WRITES_32BIT_SEGMENT_CS;\n    SegmentsNeedReadCheck |= FEXCore::X86Tables::DecodeFlags::FLAG_CS_PREFIX;\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_SS_PREFIX:\n    TelemIndex = FEXCore::Telemetry::TelemetryType::TYPE_WRITES_32BIT_SEGMENT_SS;\n    SegmentsNeedReadCheck |= FEXCore::X86Tables::DecodeFlags::FLAG_SS_PREFIX;\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_DS_PREFIX:\n    TelemIndex = FEXCore::Telemetry::TelemetryType::TYPE_WRITES_32BIT_SEGMENT_DS;\n    SegmentsNeedReadCheck |= FEXCore::X86Tables::DecodeFlags::FLAG_DS_PREFIX;\n    break;\n  default: FEX_UNREACHABLE;\n  }\n\n  // Will set the telemetry value if NewNode is != 0\n  _TelemetrySetValue(NewNode, TelemIndex);\n  // Telemetry will dirty flags, and user code does not expect LoadSource to clobber flags, fix that up here as this is an edge case.\n  CalculateDeferredFlags();\n#endif\n}\n\nvoid OpDispatchBuilder::UpdatePrefixFromSegment(Ref Segment, uint32_t SegmentReg) {\n  // Use BFE to extract the selector index in bits [15,3] of the segment register.\n  // In some cases the upper 16-bits of the 32-bit GPR contain garbage to ignore.\n  auto GDT = _Bfe(OpSize::i32Bit, 1, 2, Segment);\n  // Fun quirk, if we mask the selector then it is premultiplied by 8 which we need to do for accessing anyway.\n  auto SegmentOffset = _And(OpSize::i32Bit, Segment, _Constant(0xfff8));\n  Ref SegmentBase = _LoadContextGPRIndexed(GDT, OpSize::i64Bit, offsetof(FEXCore::Core::CPUState, segment_arrays[0]), 8);\n  Ref NewSegment = _LoadMemGPR(OpSize::i64Bit, SegmentBase, SegmentOffset, OpSize::i8Bit, MemOffsetType::UXTW, 1);\n  CheckLegacySegmentWrite(NewSegment, SegmentReg);\n\n  // Extract the 32-bit base from the GDT segment.\n  auto Upper32 = _Lshr(OpSize::i64Bit, NewSegment, _Constant(32));\n  auto Masked = _And(OpSize::i32Bit, Upper32, _Constant(0xFF00'0000));\n  Ref Merged = _Orlshr(OpSize::i32Bit, Masked, NewSegment, 16);\n  NewSegment = _Bfi(OpSize::i32Bit, 8, 16, Merged, Upper32);\n\n  switch (SegmentReg) {\n  case FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX:\n    _StoreContextGPR(OpSize::i32Bit, NewSegment, offsetof(FEXCore::Core::CPUState, es_cached));\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_CS_PREFIX:\n    _StoreContextGPR(OpSize::i32Bit, NewSegment, offsetof(FEXCore::Core::CPUState, cs_cached));\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_SS_PREFIX:\n    _StoreContextGPR(OpSize::i32Bit, NewSegment, offsetof(FEXCore::Core::CPUState, ss_cached));\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_DS_PREFIX:\n    _StoreContextGPR(OpSize::i32Bit, NewSegment, offsetof(FEXCore::Core::CPUState, ds_cached));\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_FS_PREFIX:\n    _StoreContextGPR(OpSize::i32Bit, NewSegment, offsetof(FEXCore::Core::CPUState, fs_cached));\n    break;\n  case FEXCore::X86Tables::DecodeFlags::FLAG_GS_PREFIX:\n    _StoreContextGPR(OpSize::i32Bit, NewSegment, offsetof(FEXCore::Core::CPUState, gs_cached));\n    break;\n  default: break; // Do nothing\n  }\n}\n\nAddressMode OpDispatchBuilder::DecodeAddress(const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand,\n                                             MemoryAccessType AccessType, bool IsLoad) {\n  const auto GPRSize = GetGPROpSize();\n\n  AddressMode A {};\n  A.Segment = GetSegment(Op->Flags);\n  A.AddrSize = (Op->Flags & X86Tables::DecodeFlags::FLAG_ADDRESS_SIZE) != 0 ? (GPRSize >> 1) : GPRSize;\n  A.NonTSO = AccessType == MemoryAccessType::NONTSO || AccessType == MemoryAccessType::STREAM;\n\n  if (Operand.IsLiteral()) {\n    A.Offset = Operand.Literal();\n\n    if (Operand.Data.Literal.Size != 8 && IsLoad) {\n      // zero extend\n      uint64_t width = Operand.Data.Literal.Size * 8;\n      A.Offset &= ((1ULL << width) - 1);\n    }\n  } else if (Operand.IsGPR()) {\n    // Not an address, let the caller deal with it\n    A.AddrSize = GPRSize;\n  } else if (Operand.IsGPRDirect()) {\n    A.Base = LoadGPRRegister(Operand.Data.GPR.GPR, GPRSize);\n    A.NonTSO |= IsNonTSOReg(AccessType, Operand.Data.GPR.GPR);\n  } else if (Operand.IsGPRIndirect() || Operand.IsGPRIndirectRelocation()) {\n    A.Base = LoadGPRRegister(Operand.Data.GPRIndirect.GPR, GPRSize);\n    if (Operand.IsGPRIndirectRelocation()) {\n      A.Base = Add(GPRSize, _EntrypointOffset(GPRSize, Operand.Data.GPRIndirect.Displacement), A.Base);\n    } else {\n      A.Offset = static_cast<int32_t>(Operand.Data.GPRIndirect.Displacement);\n    }\n    A.NonTSO |= IsNonTSOReg(AccessType, Operand.Data.GPRIndirect.GPR);\n  } else if (Operand.IsRIPRelative() || Operand.IsRIPRelativeRelocation()) {\n    if (Is64BitMode) {\n      A.Base = GetRelocatedPC(Op, static_cast<int32_t>(Operand.Data.RIPLiteral.Value));\n    } else {\n      // 32bit this isn't RIP relative but instead absolute\n      if (Operand.IsRIPRelativeRelocation()) {\n        A.Base = _EntrypointOffset(GPRSize, Operand.Data.RIPLiteral.Value);\n      } else {\n        A.Offset = Operand.Data.RIPLiteral.Value;\n      }\n    }\n  } else if (Operand.IsSIB() || Operand.IsSIBRelocation()) {\n    const bool IsVSIB = IsLoad && ((Op->Flags & X86Tables::DecodeFlags::FLAG_VSIB_BYTE) != 0);\n\n    if (Operand.Data.SIB.Base != FEXCore::X86State::REG_INVALID) {\n      A.Base = LoadGPRRegister(Operand.Data.SIB.Base, GPRSize);\n    }\n\n    // NOTE: VSIB cannot have the index * scale portion calculated ahead of time,\n    //       since the index in this case is a vector. So, we can't just apply the scale\n    //       to it, since this needs to be applied to each element in the index register\n    //       after said element has been sign extended. So, we pass this through for the\n    //       instruction implementation to handle.\n    //\n    //       What we do handle though, is the applying the displacement value to\n    //       the base register (if a base register is provided), since this is a\n    //       part of the address calculation that can be done ahead of time.\n    if (!IsVSIB && Operand.Data.SIB.Index != FEXCore::X86State::REG_INVALID) {\n      A.Index = LoadGPRRegister(Operand.Data.SIB.Index, GPRSize);\n      A.IndexScale = Operand.Data.SIB.Scale;\n    }\n\n    if (Operand.IsSIBRelocation()) {\n      auto EPOffset = _EntrypointOffset(GPRSize, Operand.Data.SIB.Offset);\n      if (A.Base) {\n        A.Base = Add(GPRSize, EPOffset, A.Base);\n      } else {\n        A.Base = EPOffset;\n      }\n    } else {\n      A.Offset = static_cast<int32_t>(Operand.Data.SIB.Offset);\n    }\n\n    A.NonTSO |= IsNonTSOReg(AccessType, Operand.Data.SIB.Base) || IsNonTSOReg(AccessType, Operand.Data.SIB.Index);\n  } else if (Operand.IsLiteralRelocation()) {\n    A.Base = _EntrypointOffset(GPRSize, Operand.Data.LiteralRelocation.EntrypointOffset);\n  } else {\n    LOGMAN_MSG_A_FMT(\"Unknown Src Type: {}\\n\", Operand.Type);\n  }\n\n  return A;\n}\n\n\nRef OpDispatchBuilder::LoadSource_WithOpSize(RegClass Class, const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand,\n                                             IR::OpSize OpSize, uint32_t Flags, const LoadSourceOptions& Options) {\n  auto [Align, LoadData, ForceLoad, AccessType, AllowUpperGarbage] = Options;\n  AddressMode A = DecodeAddress(Op, Operand, AccessType, true /* IsLoad */);\n\n  if (Operand.IsGPR()) {\n    const auto gpr = Operand.Data.GPR.GPR;\n    const auto highIndex = Operand.Data.GPR.HighBits ? 1 : 0;\n\n    if (gpr >= FEXCore::X86State::REG_MM_0) {\n      LOGMAN_THROW_A_FMT(OpSize == OpSize::i64Bit, \"full\");\n\n      if (MMXState != MMXState_MMX) {\n        ChgStateX87_MMX();\n      }\n\n      A.Base = LoadContext(OpSize::i64Bit, MM0Index + gpr - FEXCore::X86State::REG_MM_0);\n    } else if (gpr >= FEXCore::X86State::REG_XMM_0) {\n      const auto gprIndex = gpr - X86State::REG_XMM_0;\n\n      // Load the full register size if it is a XMM register source.\n      A.Base = LoadXMMRegister(gprIndex);\n\n      // Now extract the subregister if it was a partial load /smaller/ than SSE size\n      // TODO: Instead of doing the VMov implicitly on load, hunt down all use cases that require partial loads and do it after load.\n      // We don't have information here to know if the operation needs zero upper bits or can contain data.\n      if (!AllowUpperGarbage && OpSize < OpSize::i128Bit) {\n        A.Base = _VMov(OpSize, A.Base);\n      }\n    } else {\n      A.Base = LoadGPRRegister(gpr, OpSize, highIndex ? 8 : 0, AllowUpperGarbage);\n    }\n  }\n\n  if ((IsOperandMem(Operand, true) && LoadData) || ForceLoad) {\n    if (OpSize == OpSize::f80Bit) {\n      Ref MemSrc = LoadEffectiveAddress(this, A, GetGPROpSize(), true);\n      if (CTX->HostFeatures.SupportsSVE128 || CTX->HostFeatures.SupportsSVE256) {\n        return _LoadMemX87SVEOptPredicate(OpSize::i128Bit, OpSize::i16Bit, MemSrc);\n      } else {\n        // For X87 extended doubles, Split the load.\n        auto Res = _LoadMem(Class, OpSize::i64Bit, MemSrc, Align == OpSize::iInvalid ? OpSize : Align);\n        return _VLoadVectorElement(OpSize::i128Bit, OpSize::i16Bit, Res, 4, Add(OpSize::i64Bit, MemSrc, 8));\n      }\n    }\n\n    return _LoadMemAutoTSO(Class, OpSize, A, Align == OpSize::iInvalid ? OpSize : Align);\n  } else {\n    return LoadEffectiveAddress(this, A, GetGPROpSize(), false, AllowUpperGarbage);\n  }\n}\n\nRef OpDispatchBuilder::LoadGPRRegister(uint32_t GPR, IR::OpSize Size, uint8_t Offset, bool AllowUpperGarbage) {\n  const auto GPRSize = GetGPROpSize();\n  if (Size == OpSize::iInvalid) {\n    Size = GPRSize;\n  }\n  Ref Reg = LoadGPR(GPR);\n\n  if ((!AllowUpperGarbage && (Size != GPRSize)) || Offset != 0) {\n    // Extract the subregister if requested.\n    const auto OpSize = std::max(OpSize::i32Bit, Size);\n    if (AllowUpperGarbage) {\n      Reg = _Lshr(OpSize, Reg, Constant(Offset));\n    } else {\n      Reg = _Bfe(OpSize, IR::OpSizeAsBits(Size), Offset, Reg);\n    }\n  }\n  return Reg;\n}\n\nvoid OpDispatchBuilder::StoreGPRRegister(uint32_t GPR, const Ref Src, IR::OpSize Size, uint8_t Offset) {\n  const auto GPRSize = GetGPROpSize();\n  if (Size == OpSize::iInvalid) {\n    Size = GPRSize;\n  }\n\n  Ref Reg = Src;\n  if (Size != GPRSize || Offset != 0) {\n    // Need to do an insert if not automatic size or zero offset.\n    Reg = ARef(Reg).BfiInto(LoadGPRRegister(GPR), Offset, IR::OpSizeAsBits(Size));\n  }\n\n  StoreRegister(GPR, false, Reg);\n}\n\nvoid OpDispatchBuilder::StoreXMMRegister(uint32_t XMM, const Ref Src) {\n  StoreRegister(XMM, true, Src);\n}\n\nRef OpDispatchBuilder::LoadSource(RegClass Class, const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand, uint32_t Flags,\n                                  const LoadSourceOptions& Options) {\n  const auto OpSize = OpSizeFromSrc(Op);\n  return LoadSource_WithOpSize(Class, Op, Operand, OpSize, Flags, Options);\n}\n\nvoid OpDispatchBuilder::StoreResult_WithOpSize(RegClass Class, FEXCore::X86Tables::DecodedOp Op, const X86Tables::DecodedOperand& Operand,\n                                               Ref Src, IR::OpSize OpSize, IR::OpSize Align, MemoryAccessType AccessType) {\n  if (Operand.IsGPR()) {\n    // 8Bit and 16bit destination types store their result without effecting the upper bits\n    // 32bit ops ZEXT the result to 64bit\n    const auto GPRSize = GetGPROpSize();\n\n    const auto gpr = Operand.Data.GPR.GPR;\n    if (gpr >= FEXCore::X86State::REG_MM_0) {\n      LOGMAN_THROW_A_FMT(OpSize == OpSize::i64Bit, \"full\");\n      LOGMAN_THROW_A_FMT(Class == RegClass::FPR, \"MMX is floaty\");\n\n      if (MMXState != MMXState_MMX) {\n        ChgStateX87_MMX();\n      }\n\n      uint8_t Index = MM0Index + gpr - FEXCore::X86State::REG_MM_0;\n      StoreContext(Index, Src);\n      RegCache.Partial |= (1ull << (uint64_t)Index);\n    } else if (gpr >= FEXCore::X86State::REG_XMM_0) {\n      const auto gprIndex = gpr - X86State::REG_XMM_0;\n      const auto VectorSize = GetGuestVectorLength();\n\n      auto Result = Src;\n      if (OpSize != VectorSize) {\n        // Partial writes can come from FPRs.\n        // TODO: Fix the instructions doing partial writes rather than dealing with it here.\n\n        LOGMAN_THROW_A_FMT(Class != RegClass::GPR, \"Partial writes from GPR not allowed. Instruction: {}\", Op->TableInfo->Name);\n\n        // XMM-size is handled in implementations.\n        if (VectorSize != OpSize::i256Bit || OpSize != OpSize::i128Bit) {\n          auto SrcVector = LoadXMMRegister(gprIndex);\n          Result = _VInsElement(VectorSize, OpSize, 0, 0, SrcVector, Src);\n        }\n      }\n\n      StoreXMMRegister(gprIndex, Result);\n    } else {\n      if (GPRSize == OpSize::i64Bit && OpSize == OpSize::i32Bit) {\n        // If the Source IR op is 64 bits, we need to zext the upper bits\n        // For all other sizes, the upper bits are guaranteed to already be zero\n        Ref Value = GetOpSize(Src) == OpSize::i64Bit ? ARef(Src).Bfe(0, 32).Ref() : Src;\n        StoreGPRRegister(gpr, Value, GPRSize);\n\n        LOGMAN_THROW_A_FMT(!Operand.Data.GPR.HighBits, \"Can't handle 32bit store to high 8bit register\");\n      } else {\n        LOGMAN_THROW_A_FMT(!(GPRSize == OpSize::i32Bit && OpSize > OpSize::i32Bit), \"Oops had a {} GPR load\", OpSize);\n\n        if (GPRSize != OpSize) {\n          // if the GPR isn't the full size then we need to insert.\n          // eg:\n          // mov al, 2 ; Move in to lower 8-bits.\n          // mov ah, 2 ; Move in to upper 8-bits of 16-bit reg.\n          // mov ax, 2 ; Move in to lower 16-bits of reg.\n          StoreGPRRegister(gpr, Src, OpSize, Operand.Data.GPR.HighBits * 8);\n        } else {\n          StoreGPRRegister(gpr, Src, std::min(GPRSize, OpSize));\n        }\n      }\n    }\n    return;\n  }\n\n  AddressMode A = DecodeAddress(Op, Operand, AccessType, false /* IsLoad */);\n\n  if (OpSize == OpSize::f80Bit) {\n    Ref MemStoreDst = LoadEffectiveAddress(this, A, GetGPROpSize(), true);\n    if (CTX->HostFeatures.SupportsSVE128 || CTX->HostFeatures.SupportsSVE256) {\n      _StoreMemX87SVEOptPredicate(OpSize::i128Bit, OpSize::i16Bit, Src, MemStoreDst);\n    } else {\n      // For X87 extended doubles, split before storing\n      _StoreMemFPR(OpSize::i64Bit, MemStoreDst, Src, Align);\n      auto Upper = _VExtractToGPR(OpSize::i128Bit, OpSize::i64Bit, Src, 1);\n      _StoreMemGPR(OpSize::i16Bit, Upper, MemStoreDst, Constant(8), std::min(Align, OpSize::i64Bit), MemOffsetType::SXTX, 1);\n    }\n  } else {\n    _StoreMemAutoTSO(Class, OpSize, A, Src, Align == OpSize::iInvalid ? OpSize : Align);\n  }\n}\n\nvoid OpDispatchBuilder::StoreResult(RegClass Class, X86Tables::DecodedOp Op, const X86Tables::DecodedOperand& Operand, Ref Src,\n                                    IR::OpSize Align, MemoryAccessType AccessType) {\n  StoreResult_WithOpSize(Class, Op, Operand, Src, OpSizeFromDst(Op), Align, AccessType);\n}\n\nvoid OpDispatchBuilder::StoreResult(RegClass Class, X86Tables::DecodedOp Op, Ref Src, IR::OpSize Align, MemoryAccessType AccessType) {\n  StoreResult(Class, Op, Op->Dest, Src, Align, AccessType);\n}\n\nOpDispatchBuilder::OpDispatchBuilder(FEXCore::Context::ContextImpl* ctx)\n  : IREmitter {ctx->OpDispatcherAllocator, ctx->HostFeatures.SupportsTSOImm9}\n  , CTX {ctx} {\n  if (CTX->HostFeatures.SupportsAVX && CTX->HostFeatures.SupportsSVE256) {\n    SaveAVXStateFunc = &OpDispatchBuilder::SaveAVXState;\n    RestoreAVXStateFunc = &OpDispatchBuilder::RestoreAVXState;\n    DefaultAVXStateFunc = &OpDispatchBuilder::DefaultAVXState;\n  } else if (CTX->HostFeatures.SupportsAVX) {\n    SaveAVXStateFunc = &OpDispatchBuilder::AVX128_SaveAVXState;\n    RestoreAVXStateFunc = &OpDispatchBuilder::AVX128_RestoreAVXState;\n    DefaultAVXStateFunc = &OpDispatchBuilder::AVX128_DefaultAVXState;\n  }\n}\n\nvoid OpDispatchBuilder::ResetWorkingList() {\n  IREmitter::ReownOrClaimBuffer();\n\n  JumpTargets.clear();\n  BlockSetRIP = false;\n  DecodeFailure = false;\n  ShouldDump = false;\n  CurrentCodeBlock = nullptr;\n  RegCache.Written = 0;\n  RegCache.Cached = 0;\n}\n\nvoid OpDispatchBuilder::UnhandledOp(OpcodeArgs) {\n  DecodeFailure = true;\n}\n\nvoid OpDispatchBuilder::MOVGPROp(OpcodeArgs, uint32_t SrcIndex) {\n  // StoreResult will store with the same size as the input, so we allow upper\n  // garbage on the input. The zero extension would be pointless.\n  Ref Src = LoadSourceGPR(Op, Op->Src[SrcIndex], Op->Flags, {.Align = OpSize::i8Bit, .AllowUpperGarbage = true});\n  StoreResultGPR(Op, Src, OpSize::i8Bit);\n}\n\nvoid OpDispatchBuilder::MOVGPRNTOp(OpcodeArgs) {\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.Align = OpSize::i8Bit});\n  StoreResultGPR(Op, Src, OpSize::i8Bit, MemoryAccessType::STREAM);\n}\n\nvoid OpDispatchBuilder::ALUOp(OpcodeArgs, FEXCore::IR::IROps ALUIROp, FEXCore::IR::IROps AtomicFetchOp, unsigned SrcIdx) {\n  // On x86, the canonical way to zero a register is XOR with itself. Detect and\n  // emit optimal arm64 assembly.\n  if (!DestIsLockedMem(Op) && ALUIROp == FEXCore::IR::IROps::OP_XOR && Op->Dest.IsGPR() && Op->Src[SrcIdx].IsGPR() &&\n      Op->Dest.Data.GPR == Op->Src[SrcIdx].Data.GPR) {\n\n    // Set flags for zero result with inverted carry. We subtract an arbitrary\n    // register from itself to get the zero, since `subs wzr, #0` is not\n    // encodable. This is optimal and works regardless of the opsize.\n    auto Zero = LoadGPR(Op->Dest.Data.GPR.GPR);\n    HandleNZ00Write();\n    InvalidateAF();\n    CalculatePF(SubWithFlags(OpSize::i32Bit, Zero, Zero));\n    CFInverted = true;\n    FlushRegisterCache();\n\n    // Move 0 into the register\n    StoreResultGPR(Op, Constant(0));\n    return;\n  }\n\n  auto Size = OpSizeFromDst(Op);\n  auto ResultSize = Size;\n\n  auto RoundedSize = Size;\n  if (ALUIROp != FEXCore::IR::IROps::OP_ANDWITHFLAGS) {\n    RoundedSize = std::max(OpSize::i32Bit, RoundedSize);\n  }\n\n  // X86 basic ALU ops just do the operation between the destination and a single source\n  Ref Src = LoadSourceGPR(Op, Op->Src[SrcIdx], Op->Flags, {.AllowUpperGarbage = true});\n\n  // Try to eliminate the masking after 8/16-bit operations with constants, by\n  // promoting to a full size operation that preserves the upper bits.\n  uint64_t Const;\n  bool IsConst = IsValueConstant(WrapNode(Src), &Const);\n  if (Size < OpSize::i32Bit && !DestIsLockedMem(Op) && Op->Dest.IsGPR() && !Op->Dest.Data.GPR.HighBits && IsConst &&\n      (ALUIROp == IR::IROps::OP_XOR || ALUIROp == IR::IROps::OP_OR || ALUIROp == IR::IROps::OP_ANDWITHFLAGS)) {\n\n    RoundedSize = ResultSize = GetGPROpSize();\n    LOGMAN_THROW_A_FMT(Const < (1ull << IR::OpSizeAsBits(Size)), \"does not clobber\");\n\n    // For AND, we can play the same trick but we instead need the upper bits of\n    // the constant to be all-1s instead of all-0s to preserve. We also can't\n    // use andwithflags in this case, since we've promoted to 64-bit so the\n    // negate flag would be wrong, but using the regular logical operation path\n    // instead still ends up a net win for uops.\n    //\n    // In the common case where the constant is of the form (1 << x) - 1, the\n    // adjusted constant here will inline into the arm64 and instruction, so if\n    // flags are not needed, we save an instruction overall.\n    if (ALUIROp == IR::IROps::OP_ANDWITHFLAGS) {\n      Src = Constant(Const | ~((1ull << IR::OpSizeAsBits(Size)) - 1));\n      ALUIROp = IR::IROps::OP_AND;\n    }\n  }\n\n  Ref Result {};\n  Ref Dest {};\n\n  if (DestIsLockedMem(Op)) {\n    HandledLock = true;\n    Ref DestMem = MakeSegmentAddress(Op, Op->Dest);\n    DeriveOp(FetchOp, AtomicFetchOp, _AtomicFetchAdd(Size, Src, DestMem));\n    Dest = FetchOp;\n  } else {\n    Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags, {.AllowUpperGarbage = true});\n  }\n\n  const auto OpSize = RoundedSize;\n  uint64_t Mask = Size == OpSize::i64Bit ? ~0ull : ((1ull << IR::OpSizeAsBits(Size)) - 1);\n  if (IsConst && Const == Mask && !DestIsLockedMem(Op) && ALUIROp == IR::IROps::OP_XOR && Size >= OpSize::i32Bit) {\n    Result = _Not(OpSize, Dest);\n  } else if (IsConst && Const == Mask && !DestIsLockedMem(Op) && ALUIROp == IR::IROps::OP_AND) {\n    Result = Dest;\n  } else {\n    DeriveOp(ALUOp, ALUIROp, _AndWithFlags(OpSize, Dest, Src));\n    Result = ALUOp;\n  }\n\n  // Flags set\n  switch (ALUIROp) {\n  case FEXCore::IR::IROps::OP_ADD: Result = CalculateFlags_ADD(Size, Dest, Src); break;\n  case FEXCore::IR::IROps::OP_SUB: Result = CalculateFlags_SUB(Size, Dest, Src); break;\n  case FEXCore::IR::IROps::OP_XOR:\n  case FEXCore::IR::IROps::OP_AND:\n  case FEXCore::IR::IROps::OP_OR: {\n    CalculateFlags_Logical(Size, Result);\n    break;\n  }\n  case FEXCore::IR::IROps::OP_ANDWITHFLAGS: {\n    HandleNZ00Write();\n    CalculatePF(Result);\n    InvalidateAF();\n    break;\n  }\n  default: break;\n  }\n\n  if (!DestIsLockedMem(Op)) {\n    StoreResultGPR_WithOpSize(Op, Op->Dest, Result, ResultSize, OpSize::iInvalid, MemoryAccessType::DEFAULT);\n  }\n}\n\nvoid OpDispatchBuilder::LSLOp(OpcodeArgs) {\n  // Emulate by always returning failure, this deviates from both Linux and Windows but\n  // shouldn't be depended on by anything.\n  SetRFLAG<FEXCore::X86State::RFLAG_ZF_RAW_LOC>(Constant(0));\n}\n\nvoid OpDispatchBuilder::INTOp(OpcodeArgs) {\n  IR::BreakDefinition Reason;\n  bool SetRIPToNext = false;\n\n  switch (Op->OP) {\n  case 0xCD: { // INT imm8\n    uint8_t Literal = Op->Src[0].Literal();\n\n#ifndef _WIN32\n    constexpr uint8_t SYSCALL_LITERAL = 0x80;\n    if (Literal == SYSCALL_LITERAL) {\n      if (Is64BitMode) [[unlikely]] {\n        LogMan::Msg::EFmt(\"[Unsupported] Trying to execute 32-bit syscall from a 64-bit process.\");\n        UnhandledOp(Op);\n        return;\n      }\n      // Syscall on linux\n      SyscallOp(Op, false);\n      return;\n    }\n#else\n    constexpr uint8_t SYSCALL_LITERAL = 0x2E;\n    if (Literal == SYSCALL_LITERAL) {\n      // Can be used for both 64-bit and 32-bit syscalls on windows\n      SyscallOp(Op, false);\n      return;\n    }\n#endif\n\n#ifdef ARCHITECTURE_arm64ec\n    // This is used when QueryPerformanceCounter is called on recent Windows versions, it causes CNTVCT to be written into RAX.\n    constexpr uint8_t GET_CNTVCT_LITERAL = 0x81;\n    if (Literal == GET_CNTVCT_LITERAL) {\n      StoreGPRRegister(X86State::REG_RAX, _CycleCounter(false));\n      return;\n    }\n#endif\n\n    Reason.ErrorRegister = Literal << 3 | (0b010);\n    Reason.Signal = Core::FAULT_SIGSEGV;\n    // GP is raised when task-gate isn't setup to be valid\n    Reason.TrapNumber = X86State::X86_TRAPNO_GP;\n    Reason.si_code = 0x80;\n    break;\n  }\n  case 0xCE: // INTO\n    Reason.ErrorRegister = 0;\n    Reason.Signal = Core::FAULT_SIGSEGV;\n    Reason.TrapNumber = X86State::X86_TRAPNO_OF;\n    Reason.si_code = 0x80;\n    break;\n  case 0xF1: // INT1\n    Reason.ErrorRegister = 0;\n    Reason.Signal = Core::FAULT_SIGTRAP;\n    Reason.TrapNumber = X86State::X86_TRAPNO_DB;\n    Reason.si_code = 1;\n    SetRIPToNext = true;\n    break;\n  case 0xF4: { // HLT\n    Reason.ErrorRegister = 0;\n    Reason.Signal = Core::FAULT_SIGSEGV;\n    Reason.TrapNumber = X86State::X86_TRAPNO_GP;\n    Reason.si_code = 0x80;\n    break;\n  }\n  case 0x0B: // UD2\n    Reason.ErrorRegister = 0;\n    Reason.Signal = Core::FAULT_SIGILL;\n    Reason.TrapNumber = X86State::X86_TRAPNO_UD;\n    Reason.si_code = 2;\n    break;\n  case 0xCC: // INT3\n    Reason.ErrorRegister = 0;\n    Reason.Signal = Core::FAULT_SIGTRAP;\n    Reason.TrapNumber = X86State::X86_TRAPNO_BP;\n    Reason.si_code = 0x80;\n    SetRIPToNext = true;\n    break;\n  default: FEX_UNREACHABLE;\n  }\n\n  // Calculate flags early.\n  FlushRegisterCache();\n\n  const auto GPRSize = GetGPROpSize();\n\n  if (SetRIPToNext) {\n    BlockSetRIP = SetRIPToNext;\n\n    // We want to set RIP to the next instruction after INT3/INT1\n    auto NewRIP = GetRelocatedPC(Op);\n    _StoreContextGPR(GPRSize, NewRIP, offsetof(FEXCore::Core::CPUState, rip));\n  } else if (Op->OP != 0xCE) {\n    auto NewRIP = GetRelocatedPC(Op, -Op->InstSize);\n    _StoreContextGPR(GPRSize, NewRIP, offsetof(FEXCore::Core::CPUState, rip));\n  }\n\n  if (Op->OP == 0xCE) { // Conditional to only break if Overflow == 1\n    CalculateDeferredFlags();\n\n    // If condition doesn't hold then keep going\n    // CondClass::FNU means OF == 0\n    auto CondJump_ = CondJumpNZCV(CondClass::FNU);\n    auto FalseBlock = CreateNewCodeBlockAfter(GetCurrentBlock());\n    SetFalseJumpTarget(CondJump_, FalseBlock);\n    SetCurrentCodeBlock(FalseBlock);\n    StartNewBlock();\n\n    auto NewRIP = GetRelocatedPC(Op);\n    _StoreContextGPR(GPRSize, NewRIP, offsetof(FEXCore::Core::CPUState, rip));\n    Break(Reason);\n\n    // Make sure to start a new block after ending this one\n    auto JumpTarget = CreateNewCodeBlockAfter(FalseBlock);\n    SetTrueJumpTarget(CondJump_, JumpTarget);\n    SetCurrentCodeBlock(JumpTarget);\n    StartNewBlock();\n  } else {\n    BlockSetRIP = true;\n    Break(Reason);\n  }\n}\n\nvoid OpDispatchBuilder::TZCNT(OpcodeArgs) {\n  // _FindTrailingZeroes ignores upper garbage so we don't need to mask\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n\n  Src = _FindTrailingZeroes(OpSizeFromSrc(Op), Src);\n  StoreResultGPR(Op, Src);\n\n  CalculateFlags_ZCNT(OpSizeFromSrc(Op), Src);\n}\n\nvoid OpDispatchBuilder::LZCNT(OpcodeArgs) {\n  // _CountLeadingZeroes clears upper garbage so we don't need to mask\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});\n\n  auto Res = _CountLeadingZeroes(OpSizeFromSrc(Op), Src);\n  StoreResultGPR(Op, Res);\n  CalculateFlags_ZCNT(OpSizeFromSrc(Op), Res);\n}\n\nvoid OpDispatchBuilder::MOVBEOp(OpcodeArgs) {\n  const auto GPRSize = GetGPROpSize();\n  const auto SrcSize = OpSizeFromSrc(Op);\n\n  Ref Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.Align = OpSize::i8Bit});\n\n  if (DestIsMem(Op) || SrcSize != OpSize::i16Bit) {\n    Src = _Rev(SrcSize, Src);\n    StoreResultGPR(Op, Op->Dest, Src);\n  } else {\n    Src = _Rev(std::max(OpSize::i32Bit, SrcSize), Src);\n    // 16-bit does an insert.\n    // Rev of 16-bit value as 32-bit replaces the result in the upper 16-bits of the result.\n    // bfxil the 16-bit result in to the GPR.\n    Ref Dest = LoadSourceGPR_WithOpSize(Op, Op->Dest, GPRSize, Op->Flags);\n    auto Result = _Bfxil(GPRSize, 16, 16, Dest, Src);\n    StoreResultGPR_WithOpSize(Op, Op->Dest, Result, GPRSize);\n  }\n}\n\nvoid OpDispatchBuilder::CLWBOrTPause(OpcodeArgs) {\n  if (DestIsMem(Op)) {\n    Ref DestMem = MakeSegmentAddress(Op, Op->Dest);\n    _CacheLineClean(DestMem);\n  } else {\n    if (!CTX->HostFeatures.SupportsWFXT) {\n      UnimplementedOp(Op);\n    } else {\n      auto RAX = LoadGPRRegister(X86State::REG_RAX);\n      auto RDX = LoadGPRRegister(X86State::REG_RDX);\n\n      // Incoming source register is unused.\n      _WFET(RDX, RAX);\n\n      // OF, SF, ZF, AF, PF, CF all zero.\n      // CF is used if the OS deadline is set, which we don't do anything with.\n      ZeroPF_AF();\n      ZeroNZCV();\n    }\n  }\n}\n\nvoid OpDispatchBuilder::CLFLUSHOPT(OpcodeArgs) {\n  Ref DestMem = MakeSegmentAddress(Op, Op->Dest);\n  _CacheLineClear(DestMem, false);\n}\n\nvoid OpDispatchBuilder::LoadFenceOrXRSTOR(OpcodeArgs) {\n  // 0xE8 signifies LFENCE\n  if (Op->ModRM == 0xE8) {\n    _Fence(FenceType::Load);\n  } else {\n    XRstorOpImpl(Op);\n  }\n}\n\nvoid OpDispatchBuilder::MemFenceOrXSAVEOPT(OpcodeArgs) {\n  if (Op->ModRM == 0xF0) {\n    // 0xF0 is MFENCE\n    _Fence(FenceType::LoadStore);\n  } else {\n    XSaveOp(Op);\n  }\n}\n\nvoid OpDispatchBuilder::StoreFenceOrCLFlush(OpcodeArgs) {\n  if (Op->ModRM == 0xF8) {\n    // 0xF8 is SFENCE\n    _Fence(FenceType::Store);\n  } else {\n    // This is a CLFlush\n    Ref DestMem = MakeSegmentAddress(Op, Op->Dest);\n    _CacheLineClear(DestMem, true);\n  }\n}\n\nvoid OpDispatchBuilder::UMonitorOrCLRSSBSY(OpcodeArgs) {\n  if (DestIsMem(Op) || !CTX->HostFeatures.SupportsWFXT) {\n    // CLRSSBSY\n    UnimplementedOp(Op);\n  } else {\n    // Explicit NOP implementation of umonitor.\n  }\n}\n\nvoid OpDispatchBuilder::UMWaitOp(OpcodeArgs) {\n  if (DestIsMem(Op) || !CTX->HostFeatures.SupportsWFXT) {\n    UnimplementedOp(Op);\n  } else {\n    // Explicit NOP implementation of umwait.\n    // Still zero flags.\n    //\n    // OF, SF, ZF, AF, PF, CF all zero.\n    ZeroPF_AF();\n    ZeroNZCV();\n  }\n}\n\nvoid OpDispatchBuilder::CLZeroOp(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsCLZERO) {\n    UnimplementedOp(Op);\n    return;\n  }\n  Ref DestMem = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.LoadData = false});\n  _CacheLineZero(DestMem);\n}\n\nvoid OpDispatchBuilder::Prefetch(OpcodeArgs, bool ForStore, bool Stream, uint8_t Level) {\n  Ref DestMem = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.LoadData = false});\n  _Prefetch(ForStore, Stream, Level, DestMem, Invalid(), MemOffsetType::SXTX, 1);\n}\n\nvoid OpDispatchBuilder::RDTSCPOp(OpcodeArgs) {\n  // RDTSCP is slightly different than RDTSC\n  // IA32_TSC_AUX is returned in RCX\n  // All previous loads are globally visible\n  //  - Explicitly does not wait for stores to be globally visible\n  //  - Explicitly use an MFENCE before this instruction if you want this behaviour\n  // This instruction is not an execution fence, so subsequent instructions can execute after this\n  //  - Explicitly use an LFENCE after RDTSCP if you want to block this behaviour\n\n  auto Counter = CycleCounter(true);\n\n  auto ID = _ProcessorID();\n  StoreGPRRegister(X86State::REG_RAX, Counter.CounterLow);\n  StoreGPRRegister(X86State::REG_RCX, ID);\n  StoreGPRRegister(X86State::REG_RDX, Counter.CounterHigh);\n}\n\nvoid OpDispatchBuilder::RDPIDOp(OpcodeArgs) {\n  StoreResultGPR(Op, _ProcessorID());\n}\n\nvoid OpDispatchBuilder::CRC32(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsCRC) {\n    UnimplementedOp(Op);\n    return;\n  }\n  const auto GPRSize = GetGPROpSize();\n\n  // Destination GPR size is always 4 or 8 bytes depending on widening\n  const auto DstSize = Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_REX_WIDENING ? OpSize::i64Bit : OpSize::i32Bit;\n  Ref Dest = LoadSourceGPR_WithOpSize(Op, Op->Dest, GPRSize, Op->Flags);\n\n  // Incoming memory is 8, 16, 32, or 64\n  Ref Src {};\n  if (Op->Src[0].IsGPR()) {\n    Src = LoadSourceGPR_WithOpSize(Op, Op->Src[0], GPRSize, Op->Flags);\n  } else {\n    Src = LoadSourceGPR(Op, Op->Src[0], Op->Flags, {.Align = OpSize::i8Bit});\n  }\n  auto Result = _CRC32(Dest, Src, OpSizeFromSrc(Op));\n  StoreResultGPR_WithOpSize(Op, Op->Dest, Result, DstSize);\n}\n\ntemplate<bool Reseed>\nvoid OpDispatchBuilder::RDRANDOp(OpcodeArgs) {\n  if (!CTX->HostFeatures.SupportsRAND) {\n    UnimplementedOp(Op);\n    return;\n  }\n\n  StoreResultGPR(Op, _RDRAND(Reseed));\n\n  // If the rng number is valid then NZCV is 0b0000, otherwise NZCV is 0b0100\n  auto CF_inv = GetRFLAG(X86State::RFLAG_ZF_RAW_LOC);\n\n  // OF, SF, ZF, AF, PF all zero. CF indicates if valid.\n  ZeroPF_AF();\n\n  if (!CTX->HostFeatures.SupportsFlagM) {\n    ZeroNZCV();\n    SetCFInverted(CF_inv);\n  } else {\n    // Accelerated path. Invalid is 0 or 1, so set NZCV with a single rmif.\n    HandleNZCVWrite();\n    _RmifNZCV(CF_inv, (64 - 1) /* rotate bit 0 into bit 1 = C */, 0xf);\n    CFInverted = true;\n  }\n}\n\ntemplate void OpDispatchBuilder::RDRANDOp<true>(OpcodeArgs);\ntemplate void OpDispatchBuilder::RDRANDOp<false>(OpcodeArgs);\n\nvoid OpDispatchBuilder::BreakOp(OpcodeArgs, FEXCore::IR::BreakDefinition BreakDefinition) {\n  const auto GPRSize = GetGPROpSize();\n\n  // We don't actually support this instruction\n  // Multiblock may hit it though\n  _StoreContextGPR(GPRSize, GetRelocatedPC(Op, -Op->InstSize), offsetof(FEXCore::Core::CPUState, rip));\n  Break(BreakDefinition);\n\n\n  if (Multiblock) {\n    auto NextBlock = CreateNewCodeBlockAfter(GetCurrentBlock());\n    SetCurrentCodeBlock(NextBlock);\n    StartNewBlock();\n  } else {\n    BlockSetRIP = true;\n  }\n}\n\nvoid OpDispatchBuilder::UnimplementedOp(OpcodeArgs) {\n  BreakOp(Op, FEXCore::IR::BreakDefinition {\n                .ErrorRegister = 0,\n                .Signal = SIGILL,\n                .TrapNumber = X86State::X86_TRAPNO_UD,\n                .si_code = 2, ///< ILL_ILLOPN\n              });\n}\n\nvoid OpDispatchBuilder::PermissionRestrictedOp(OpcodeArgs) {\n  BreakOp(Op, FEXCore::IR::BreakDefinition {\n                .ErrorRegister = 0,\n                .Signal = SIGSEGV,\n                .TrapNumber = X86State::X86_TRAPNO_GP,\n                .si_code = 0x80,\n              });\n}\n\nvoid OpDispatchBuilder::InvalidOp(OpcodeArgs) {\n  BreakOp(Op, FEXCore::IR::BreakDefinition {\n                .ErrorRegister = 0,\n                .Signal = SIGILL,\n                .TrapNumber = 0,\n                .si_code = 0,\n              });\n}\n\nvoid OpDispatchBuilder::NoExecOp(OpcodeArgs) {\n  BreakOp(Op, FEXCore::IR::BreakDefinition {\n                .ErrorRegister = X86State::X86_PF_PROT | X86State::X86_PF_USER | X86State::X86_PF_INSTR,\n                .Signal = Core::FAULT_SIGSEGV,\n                .TrapNumber = X86State::X86_TRAPNO_PF,\n                .si_code = 2, // SEGV_ACCERR\n              });\n}\n\n#undef OpcodeArgs\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/OpcodeDispatcher.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"Interface/Core/Frontend.h\"\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/Core/Addressing.h\"\n#include \"Interface/Context/Context.h\"\n#include \"Interface/IR/IR.h\"\n#include \"Interface/IR/IREmitter.h\"\n#include \"Interface/IR/RegisterAllocationData.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/IR/IR.h>\n\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <bit>\n#include <cstdint>\n#include <fmt/format.h>\n#include <stddef.h>\n#include <utility>\n#include <xxhash.h>\n\nnamespace FEXCore::IR {\nenum class VectorCompareType {\n  // SSE comparisons.\n  EQ_OQ = 0,\n  LT_OS = 1,\n  LE_OS = 2,\n  UNORD_Q = 3,\n  NEQ_UQ = 4,\n  NLT_US = 5,\n  NLE_US = 6,\n  ORD_Q = 7,\n  // AVX-only comparisons.\n  EQ_UQ = 8,\n  NGE_US = 9,\n  NGT_US = 10,\n  FALSE_OQ = 11,\n  NEQ_OQ = 12,\n  GE_OS = 13,\n  GT_OS = 14,\n  TRUE_UQ = 15,\n  EQ_OS = 16,\n  LT_OQ = 17,\n  LE_OQ = 18,\n  UNORD_S = 19,\n  NEQ_US = 20,\n  NLT_UQ = 21,\n  NLE_UQ = 22,\n  ORD_S = 23,\n  EQ_US = 24,\n  NGE_UQ = 25,\n  NGT_UQ = 26,\n  FALSE_OS = 27,\n  NEQ_OS = 28,\n  GE_OQ = 29,\n  GT_OQ = 30,\n  TRUE_US = 31,\n};\n\nenum class MemoryAccessType {\n  // Choose TSO or Non-TSO depending on access type\n  DEFAULT,\n  // TSO access behaviour\n  TSO,\n  // Non-TSO access behaviour\n  NONTSO,\n  // Non-temporal streaming\n  STREAM,\n};\n\nenum class BTAction {\n  BTNone,\n  BTClear,\n  BTSet,\n  BTComplement,\n};\n\nenum class ForceTSOMode {\n  NoOverride,\n  ForceDisabled,\n  ForceEnabled,\n};\n\nstruct LoadSourceOptions {\n  // Alignment of the load in bytes. iInvalid signifies opsize aligned.\n  IR::OpSize Align = OpSize::iInvalid;\n\n  // Whether or not to load the data if a memory access occurs.\n  // If set to false, then the address that would have been loaded from\n  // will be returned instead.\n  //\n  // Note: If returning the address, make sure to apply the segment offset\n  //       after with AppendSegmentOffset().\n  //\n  bool LoadData = true;\n\n  // Use to force a load even if the underlying type isn't loadable.\n  bool ForceLoad = false;\n\n  // Specifies the access type of the load.\n  MemoryAccessType AccessType = MemoryAccessType::DEFAULT;\n\n  // Whether or not a zero extend should clear the upper bits\n  // in the register (e.g. an 8-bit load would clear the upper 24 bits\n  // or 56 bits depending on the operating mode).\n  // If true, no zero-extension occurs.\n  bool AllowUpperGarbage = false;\n};\n\nstruct DispatchTableEntry {\n  uint16_t Op;\n  uint8_t Count;\n  X86Tables::OpDispatchPtr Ptr;\n};\n\nclass OpDispatchBuilder final : public IREmitter {\npublic:\n  Ref GetNewJumpBlock(uint64_t RIP) {\n    auto it = JumpTargets.find(RIP);\n    LOGMAN_THROW_A_FMT(it != JumpTargets.end(), \"Couldn't find block generated for 0x{:x}\", RIP);\n    return it->second.BlockEntry;\n  }\n\n  void SetNewBlockIfChanged(uint64_t RIP) {\n    auto it = JumpTargets.find(RIP);\n    if (it == JumpTargets.end()) {\n      return;\n    }\n\n    it->second.HaveEmitted = true;\n\n    if (CurrentCodeBlock->Wrapped(DualListData.ListBegin()).ID() == it->second.BlockEntry->Wrapped(DualListData.ListBegin()).ID()) {\n      return;\n    }\n\n    // We have hit a RIP that is a jump target\n    // Thus we need to end up in a new block\n    SetCurrentCodeBlock(it->second.BlockEntry);\n  }\n\n  void StartNewBlock() {\n    // If we loaded flags but didn't change them, invalidate the cached copy and move on.\n    // Changes get stored out by CalculateDeferredFlags.\n    CachedNZCV = nullptr;\n    CFInverted = CFInvertedABI;\n\n    FlushRegisterCache();\n\n    // Start block in X87 state.\n    // This is important to ensure that blocks always start with the same state independently of predecessors\n    // which allows independent compilation of blocks.\n    // Starting in the X87 state is better than starting in MMX state because\n    // MMX state is more work to initialize.\n    MMXState = MMXState_X87;\n\n    // New block needs to reset segment telemetry.\n    SegmentsNeedReadCheck = ~0U;\n\n    // Need to clear any named constants that were cached.\n    ClearCachedNamedConstants();\n  }\n\n  IRPair<IROp_Jump> Jump() {\n    FlushRegisterCache();\n    return _Jump();\n  }\n  IRPair<IROp_Jump> Jump(Ref _TargetBlock) {\n    FlushRegisterCache();\n    return _Jump(_TargetBlock);\n  }\n  IRPair<IROp_CondJump> CondJump(Ref _Cmp1, Ref _Cmp2, Ref _TrueBlock, Ref _FalseBlock, CondClass _Cond = CondClass::NEQ,\n                                 IR::OpSize _CompareSize = OpSize::iInvalid) {\n    FlushRegisterCache();\n    return _CondJump(_Cmp1, _Cmp2, _TrueBlock, _FalseBlock, _Cond, _CompareSize);\n  }\n  IRPair<IROp_CondJump> CondJump(Ref ssa0, CondClass cond = CondClass::NEQ) {\n    FlushRegisterCache();\n    return _CondJump(ssa0, cond);\n  }\n  IRPair<IROp_CondJump> CondJump(Ref ssa0, Ref ssa1, Ref ssa2, CondClass cond = CondClass::NEQ) {\n    FlushRegisterCache();\n    return _CondJump(ssa0, ssa1, ssa2, cond);\n  }\n  IRPair<IROp_CondJump> CondJumpNZCV(CondClass Cond) {\n    FlushRegisterCache();\n    return _CondJump(InvalidNode, InvalidNode, InvalidNode, InvalidNode, Cond, OpSize::iInvalid, true);\n  }\n  IRPair<IROp_CondJump> CondJumpBit(Ref Src, unsigned Bit, bool Set) {\n    FlushRegisterCache();\n    auto InlineConst = _InlineConstant(Bit);\n    auto Cond = Set ? CondClass::TSTNZ : CondClass::TSTZ;\n    return _CondJump(Src, InlineConst, InvalidNode, InvalidNode, Cond, OpSize::iInvalid, false);\n  }\n  IRPair<IROp_ExitFunction> ExitFunction(Ref NewRIP, BranchHint Hint = BranchHint::None) {\n    FlushRegisterCache();\n    return _ExitFunction(GetOpSize(NewRIP), NewRIP, Hint, InvalidNode, InvalidNode);\n  }\n  IRPair<IROp_ExitFunction> ExitFunction(Ref NewRIP, BranchHint Hint, Ref CallReturnAddress, Ref CallReturnBlock) {\n    FlushRegisterCache();\n    return _ExitFunction(GetOpSize(NewRIP), NewRIP, Hint, CallReturnAddress, CallReturnBlock);\n  }\n  IRPair<IROp_Break> Break(BreakDefinition Reason) {\n    FlushRegisterCache();\n    return _Break(Reason);\n  }\n  IRPair<IROp_Thunk> Thunk(Ref ArgPtr, SHA256Sum ThunkNameHash) {\n    FlushRegisterCache();\n    return _Thunk(ArgPtr, ThunkNameHash);\n  }\n\n  bool FinishOp(uint64_t NextRIP, bool LastOp) {\n    // If we are switching to a new block and this current block has yet to set a RIP\n    // Then we need to insert an unconditional jump from the current block to the one we are going to\n    // This happens most frequently when an instruction jumps backwards to another location\n    // eg:\n    //\n    //  nop dword [rax], eax\n    // .label:\n    //  rdi, 0x8\n    //  cmp qword [rdi-8], 0\n    //  jne .label\n    if (LastOp && !BlockSetRIP) {\n      auto it = JumpTargets.find(NextRIP);\n      if (it == JumpTargets.end()) {\n\n        const auto GPRSize = GetGPROpSize();\n        // If we don't have a jump target to a new block then we have to leave\n        // Set the RIP to the next instruction and leave\n        ExitFunction(_InlineEntrypointOffset(GPRSize, NextRIP - Entry));\n      } else if (it != JumpTargets.end()) {\n        Jump(it->second.BlockEntry);\n        return true;\n      }\n    }\n\n    BlockSetRIP = false;\n\n    return false;\n  }\n\n  static bool CanHaveSideEffects(const FEXCore::X86Tables::X86InstInfo* TableInfo, FEXCore::X86Tables::DecodedOp Op) {\n    if (TableInfo) {\n      if (TableInfo->Flags & X86Tables::InstFlags::FLAGS_DEBUG_MEM_ACCESS) {\n        // If it is marked as having memory access then always say it has a side-effect.\n        // Not always true but better to be safe.\n        return true;\n      }\n\n      if (TableInfo->Flags & (X86Tables::InstFlags::FLAGS_SETS_RIP | X86Tables::InstFlags::FLAGS_BLOCK_END)) {\n        // Cooperative suspend interrupts can be triggered at any back-edge, the RIP must be reconstructed correctly in such cases\n        return true;\n      }\n    }\n\n    auto CanHaveSideEffects = false;\n\n    auto HasPotentialMemoryAccess = [](const X86Tables::DecodedOperand& Operand) -> bool {\n      if (Operand.IsNone()) {\n        return false;\n      }\n\n      // This isn't guaranteed that all of these types will access memory, but be safe.\n      return Operand.IsGPRDirect() || Operand.IsGPRIndirect() || Operand.IsRIPRelative() || Operand.IsSIB();\n    };\n\n    CanHaveSideEffects |= HasPotentialMemoryAccess(Op->Dest);\n    CanHaveSideEffects |= HasPotentialMemoryAccess(Op->Src[0]);\n    CanHaveSideEffects |= HasPotentialMemoryAccess(Op->Src[1]);\n    CanHaveSideEffects |= HasPotentialMemoryAccess(Op->Src[2]);\n    return CanHaveSideEffects;\n  }\n\n  template<typename F>\n  void ForeachDirection(F&& Routine) {\n    // Otherwise, prepare to branch.\n    auto Zero = Constant(0);\n\n    // If the shift is zero, do not touch the flags.\n    auto ForwardBlock = CreateNewCodeBlockAfter(GetCurrentBlock());\n    auto BackwardBlock = CreateNewCodeBlockAfter(ForwardBlock);\n    auto ExitBlock = CreateNewCodeBlockAfter(BackwardBlock);\n\n    auto DF = GetRFLAG(X86State::RFLAG_DF_RAW_LOC);\n    CondJump(DF, Zero, ForwardBlock, BackwardBlock, CondClass::EQ);\n\n    for (auto D = 0; D < 2; ++D) {\n      SetCurrentCodeBlock(D ? BackwardBlock : ForwardBlock);\n      StartNewBlock();\n      {\n        Routine(D ? -1 : 1);\n        Jump(ExitBlock);\n      }\n    }\n\n    SetCurrentCodeBlock(ExitBlock);\n    StartNewBlock();\n  }\n\n  OpDispatchBuilder(FEXCore::Context::ContextImpl* ctx);\n\n  // Should only be called at the start of IR Emission.\n  void ResetWorkingList();\n\n  void ResetDecodeFailure() {\n    NeedsBlockEnd = DecodeFailure = false;\n  }\n  bool HadDecodeFailure() const {\n    return DecodeFailure;\n  }\n  bool NeedsBlockEnder() const {\n    return NeedsBlockEnd;\n  }\n\n  void ResetHandledLock() {\n    HandledLock = false;\n  }\n  bool HasHandledLock() const {\n    return HandledLock;\n  }\n\n  void SetForceTSO(ForceTSOMode Mode) {\n    ForceTSO = Mode;\n  }\n  ForceTSOMode GetForceTSO() const {\n    return ForceTSO;\n  }\n\n  void SetDumpIR(bool DumpIR) {\n    ShouldDump = DumpIR;\n  }\n  bool ShouldDumpIR() const {\n    return ShouldDump;\n  }\n\n  void BeginFunction(uint64_t RIP, const fextl::vector<FEXCore::Frontend::Decoder::DecodedBlocks>* Blocks, uint32_t NumInstructions,\n                     bool Is64BitMode, bool MonoBackpatcherBlock);\n  void Finalize();\n\n  // Dispatch builder functions\n#define OpcodeArgs [[maybe_unused]] FEXCore::X86Tables::DecodedOp Op\n\n  /**\n   * Binds a sequence of compile-time constants as arguments to another member function.\n   * This allows to construct OpDispatchPtrs that are specialized for the given set of arguments.\n   */\n  template<auto Fn, auto... Args>\n  void Bind(OpcodeArgs) {\n    [[clang::noinline]] (this->*Fn)(Op, Args...);\n  };\n\n  void UnhandledOp(OpcodeArgs);\n  void MOVGPROp(OpcodeArgs, uint32_t SrcIndex);\n  void MOVGPRNTOp(OpcodeArgs);\n  void MOVVectorAlignedOp(OpcodeArgs);\n  void MOVVectorUnalignedOp(OpcodeArgs);\n  void MOVVectorNTOp(OpcodeArgs);\n  void ALUOp(OpcodeArgs, FEXCore::IR::IROps ALUIROp, FEXCore::IR::IROps AtomicFetchOp, unsigned SrcIdx);\n  void LSLOp(OpcodeArgs);\n  void INTOp(OpcodeArgs);\n  void SyscallOp(OpcodeArgs, bool IsSyscallInst);\n  void ThunkOp(OpcodeArgs);\n  void LEAOp(OpcodeArgs);\n  void NOPOp(OpcodeArgs);\n  void RETOp(OpcodeArgs);\n  void IRETOp(OpcodeArgs);\n  void CallbackReturnOp(OpcodeArgs);\n  void SecondaryALUOp(OpcodeArgs);\n  void ADCOp(OpcodeArgs, uint32_t SrcIndex);\n  void SBBOp(OpcodeArgs, uint32_t SrcIndex);\n  void SALCOp(OpcodeArgs);\n  void PUSHOp(OpcodeArgs);\n  void PUSHREGOp(OpcodeArgs);\n  void PUSHAOp(OpcodeArgs);\n  void PUSHSegmentOp(OpcodeArgs, uint32_t SegmentReg);\n  void POPOp(OpcodeArgs);\n  void POPAOp(OpcodeArgs);\n  void POPSegmentOp(OpcodeArgs, uint32_t SegmentReg);\n  void LEAVEOp(OpcodeArgs);\n  void CALLOp(OpcodeArgs);\n  void CALLAbsoluteOp(OpcodeArgs);\n  void CondJUMPOp(OpcodeArgs);\n  void CondJUMPRCXOp(OpcodeArgs);\n  void LoopOp(OpcodeArgs);\n  void JUMPOp(OpcodeArgs);\n  void JUMPAbsoluteOp(OpcodeArgs);\n  void JUMPFARIndirectOp(OpcodeArgs);\n  void CALLFARIndirectOp(OpcodeArgs);\n  void RETFARIndirectOp(OpcodeArgs);\n  void TESTOp(OpcodeArgs, uint32_t SrcIndex);\n  void ARPLOp(OpcodeArgs);\n  void MOVSXDOp(OpcodeArgs);\n  void MOVSXOp(OpcodeArgs);\n  void MOVZXOp(OpcodeArgs);\n  void CMPOp(OpcodeArgs, uint32_t SrcIndex);\n  void SETccOp(OpcodeArgs);\n  void CQOOp(OpcodeArgs);\n  void CDQOp(OpcodeArgs);\n  void XCHGOp(OpcodeArgs);\n  void SAHFOp(OpcodeArgs);\n  void LAHFOp(OpcodeArgs);\n  void MOVSegOp(OpcodeArgs, bool ToSeg);\n  void FLAGControlOp(OpcodeArgs);\n  void MOVOffsetOp(OpcodeArgs);\n  void CMOVOp(OpcodeArgs);\n  void CPUIDOp(OpcodeArgs);\n  void XGetBVOp(OpcodeArgs);\n  uint32_t GetConstantShift(X86Tables::DecodedOp Op, bool Is1Bit);\n  void SHLOp(OpcodeArgs);\n  void SHLImmediateOp(OpcodeArgs, bool SHL1Bit);\n  void SHROp(OpcodeArgs);\n  void SHRImmediateOp(OpcodeArgs, bool SHR1Bit);\n  void SHLDOp(OpcodeArgs);\n  void SHLDImmediateOp(OpcodeArgs);\n  void SHRDOp(OpcodeArgs);\n  void SHRDImmediateOp(OpcodeArgs);\n  void ASHROp(OpcodeArgs, bool IsImmediate, bool Is1Bit);\n  void RotateOp(OpcodeArgs, bool Left, bool IsImmediate, bool Is1Bit);\n  void RCROp1Bit(OpcodeArgs);\n  void RCROp8x1Bit(OpcodeArgs);\n  void RCROp(OpcodeArgs);\n  void RCRSmallerOp(OpcodeArgs);\n  void RCLOp1Bit(OpcodeArgs);\n  void RCLOp(OpcodeArgs);\n  void RCLSmallerOp(OpcodeArgs);\n\n  void BTOp(OpcodeArgs, uint32_t SrcIndex, enum BTAction Action);\n\n  void IMUL1SrcOp(OpcodeArgs);\n  void IMUL2SrcOp(OpcodeArgs);\n  void IMULOp(OpcodeArgs);\n  void STOSOp(OpcodeArgs);\n  void MOVSOp(OpcodeArgs);\n  void CMPSOp(OpcodeArgs);\n  void LODSOp(OpcodeArgs);\n  void SCASOp(OpcodeArgs);\n  void BSWAPOp(OpcodeArgs);\n  void PUSHFOp(OpcodeArgs);\n  void POPFOp(OpcodeArgs);\n\n  struct CycleCounterPair {\n    Ref CounterLow;\n    Ref CounterHigh;\n  };\n  CycleCounterPair CycleCounter(bool SelfSynchronizingLoads);\n  void RDTSCOp(OpcodeArgs);\n  void INCOp(OpcodeArgs);\n  void DECOp(OpcodeArgs);\n  void NEGOp(OpcodeArgs);\n  void DIVOp(OpcodeArgs);\n  void IDIVOp(OpcodeArgs);\n  void BSFOp(OpcodeArgs);\n  void BSROp(OpcodeArgs);\n  void CMPXCHGOp(OpcodeArgs);\n  void CMPXCHGPairOp(OpcodeArgs);\n  void MULOp(OpcodeArgs);\n  void NOTOp(OpcodeArgs);\n  void XADDOp(OpcodeArgs);\n  void PopcountOp(OpcodeArgs);\n  void DAAOp(OpcodeArgs);\n  void DASOp(OpcodeArgs);\n  void AAAOp(OpcodeArgs);\n  void AASOp(OpcodeArgs);\n  void AAMOp(OpcodeArgs);\n  void AADOp(OpcodeArgs);\n  void XLATOp(OpcodeArgs);\n  template<bool Reseed>\n  void RDRANDOp(OpcodeArgs);\n\n  enum class Segment {\n    FS,\n    GS,\n  };\n  void ReadSegmentReg(OpcodeArgs, Segment Seg);\n  void WriteSegmentReg(OpcodeArgs, Segment Seg);\n  void EnterOp(OpcodeArgs);\n\n  void SGDTOp(OpcodeArgs);\n  void SIDTOp(OpcodeArgs);\n  void SMSWOp(OpcodeArgs);\n\n  enum class VectorOpType {\n    MMX,\n    SSE,\n    AVX,\n  };\n  // SSE\n  void MOVLPOp(OpcodeArgs);\n  void MOVHPDOp(OpcodeArgs);\n  void MOVSDOp(OpcodeArgs);\n  void MOVSSOp(OpcodeArgs);\n  void VectorALUOp(OpcodeArgs, IROps IROp, IR::OpSize ElementSize);\n  void VectorXOROp(OpcodeArgs);\n\n  void VectorALUROp(OpcodeArgs, IROps IROp, IR::OpSize ElementSize);\n  void VectorUnaryOp(OpcodeArgs, IROps IROp, IR::OpSize ElementSize);\n  void RSqrt3DNowOp(OpcodeArgs, bool Duplicate);\n  template<FEXCore::IR::IROps IROp, IR::OpSize ElementSize>\n  void VectorUnaryDuplicateOp(OpcodeArgs);\n\n  void MOVQOp(OpcodeArgs, VectorOpType VectorType);\n  void MOVQMMXOp(OpcodeArgs);\n  void MOVMSKOp(OpcodeArgs, IR::OpSize ElementSize);\n  void MOVMSKOpOne(OpcodeArgs);\n  void PUNPCKLOp(OpcodeArgs, IR::OpSize ElementSize);\n  void PUNPCKHOp(OpcodeArgs, IR::OpSize ElementSize);\n  void PSHUFBOp(OpcodeArgs);\n  Ref PShufWLane(IR::OpSize Size, FEXCore::IR::IndexNamedVectorConstant IndexConstant, bool LowLane, Ref IncomingLane, uint8_t Shuffle);\n  void PSHUFWOp(OpcodeArgs, bool Low);\n  void PSHUFW8ByteOp(OpcodeArgs);\n  void PSHUFDOp(OpcodeArgs);\n  void PSRLDOp(OpcodeArgs, IR::OpSize ElementSize);\n  void PSRLI(OpcodeArgs, IR::OpSize ElementSize);\n  void PSLLI(OpcodeArgs, IR::OpSize ElementSize);\n  void PSLL(OpcodeArgs, IR::OpSize ElementSize);\n  void PSRAOp(OpcodeArgs, IR::OpSize ElementSize);\n  void PSRLDQ(OpcodeArgs);\n  void PSLLDQ(OpcodeArgs);\n  void PSRAIOp(OpcodeArgs, IR::OpSize ElementSize);\n  void MOVDDUPOp(OpcodeArgs);\n  template<IR::OpSize DstElementSize>\n  void CVTGPR_To_FPR(OpcodeArgs);\n  template<IR::OpSize SrcElementSize, bool HostRoundingMode>\n  void CVTFPR_To_GPR(OpcodeArgs);\n  template<IR::OpSize SrcElementSize, bool Widen>\n  void Vector_CVT_Int_To_Float(OpcodeArgs);\n  template<IR::OpSize DstElementSize, IR::OpSize SrcElementSize>\n  void Scalar_CVT_Float_To_Float(OpcodeArgs);\n  void Vector_CVT_Float_To_Float(OpcodeArgs, IR::OpSize DstElementSize, IR::OpSize SrcElementSize, bool IsAVX);\n  template<IR::OpSize SrcElementSize, bool HostRoundingMode>\n  void Vector_CVT_Float_To_Int(OpcodeArgs);\n  void MMX_To_XMM_Vector_CVT_Int_To_Float(OpcodeArgs);\n  template<IR::OpSize SrcElementSize, bool HostRoundingMode>\n  void XMM_To_MMX_Vector_CVT_Float_To_Int(OpcodeArgs);\n  void MASKMOVOp(OpcodeArgs);\n  void MOVBetweenGPR_FPR(OpcodeArgs, VectorOpType VectorType);\n  void TZCNT(OpcodeArgs);\n  void LZCNT(OpcodeArgs);\n  template<IR::OpSize ElementSize>\n  void VFCMPOp(OpcodeArgs);\n  void SHUFOp(OpcodeArgs, IR::OpSize ElementSize);\n  template<IR::OpSize ElementSize>\n  void PINSROp(OpcodeArgs);\n  void InsertPSOp(OpcodeArgs);\n  void PExtrOp(OpcodeArgs, IR::OpSize ElementSize);\n\n  template<IR::OpSize ElementSize>\n  void PSIGN(OpcodeArgs);\n  template<IR::OpSize ElementSize>\n  void VPSIGN(OpcodeArgs);\n\n  // BMI1 Ops\n  void ANDNBMIOp(OpcodeArgs);\n  void BEXTRBMIOp(OpcodeArgs);\n  void BLSIBMIOp(OpcodeArgs);\n  void BLSMSKBMIOp(OpcodeArgs);\n  void BLSRBMIOp(OpcodeArgs);\n\n  // BMI2 Ops\n  void BMI2Shift(OpcodeArgs);\n  void BZHI(OpcodeArgs);\n  void MULX(OpcodeArgs);\n  void PDEP(OpcodeArgs);\n  void PEXT(OpcodeArgs);\n  void RORX(OpcodeArgs);\n\n  // ADX Ops\n  void ADXOp(OpcodeArgs);\n\n  // AVX Ops\n  void AVXVectorXOROp(OpcodeArgs);\n\n  template<IR::OpSize ElementSize>\n  void AVXVectorRound(OpcodeArgs);\n\n  template<IR::OpSize DstElementSize, IR::OpSize SrcElementSize>\n  void AVXScalar_CVT_Float_To_Float(OpcodeArgs);\n\n  template<FEXCore::IR::IROps IROp, IR::OpSize ElementSize>\n  void VectorScalarInsertALUOp(OpcodeArgs);\n  template<FEXCore::IR::IROps IROp, IR::OpSize ElementSize>\n  void AVXVectorScalarInsertALUOp(OpcodeArgs);\n\n  template<FEXCore::IR::IROps IROp, IR::OpSize ElementSize>\n  void VectorScalarUnaryInsertALUOp(OpcodeArgs);\n  template<FEXCore::IR::IROps IROp, IR::OpSize ElementSize>\n  void AVXVectorScalarUnaryInsertALUOp(OpcodeArgs);\n\n  void InsertMMX_To_XMM_Vector_CVT_Int_To_Float(OpcodeArgs);\n  template<IR::OpSize DstElementSize>\n  void InsertCVTGPR_To_FPR(OpcodeArgs);\n  template<IR::OpSize DstElementSize>\n  void AVXInsertCVTGPR_To_FPR(OpcodeArgs);\n\n  template<IR::OpSize DstElementSize, IR::OpSize SrcElementSize>\n  void InsertScalar_CVT_Float_To_Float(OpcodeArgs);\n  template<IR::OpSize DstElementSize, IR::OpSize SrcElementSize>\n  void AVXInsertScalar_CVT_Float_To_Float(OpcodeArgs);\n\n  RoundMode TranslateRoundType(uint8_t Mode);\n\n  template<IR::OpSize ElementSize>\n  void InsertScalarRound(OpcodeArgs);\n  template<IR::OpSize ElementSize>\n  void AVXInsertScalarRound(OpcodeArgs);\n\n  template<IR::OpSize ElementSize>\n  void InsertScalarFCMPOp(OpcodeArgs);\n  template<IR::OpSize ElementSize>\n  void AVXInsertScalarFCMPOp(OpcodeArgs);\n\n  template<IR::OpSize DstElementSize>\n  void AVXCVTGPR_To_FPR(OpcodeArgs);\n\n  template<IR::OpSize ElementSize>\n  void AVXVFCMPOp(OpcodeArgs);\n\n  template<IR::OpSize ElementSize>\n  void VADDSUBPOp(OpcodeArgs);\n\n  void VAESDecOp(OpcodeArgs);\n  void VAESDecLastOp(OpcodeArgs);\n  void VAESEncOp(OpcodeArgs);\n  void VAESEncLastOp(OpcodeArgs);\n\n  void VANDNOp(OpcodeArgs);\n\n  Ref VBLENDOpImpl(IR::OpSize VecSize, IR::OpSize ElementSize, Ref Src1, Ref Src2, Ref ZeroRegister, uint64_t Selector);\n  void VBLENDPDOp(OpcodeArgs);\n  void VPBLENDDOp(OpcodeArgs);\n  void VPBLENDWOp(OpcodeArgs);\n\n  void VBROADCASTOp(OpcodeArgs, IR::OpSize ElementSize);\n\n  template<IR::OpSize ElementSize>\n  void VDPPOp(OpcodeArgs);\n\n  void VEXTRACT128Op(OpcodeArgs);\n\n  template<IROps IROp, IR::OpSize ElementSize>\n  void VHADDPOp(OpcodeArgs);\n  void VHSUBPOp(OpcodeArgs, IR::OpSize ElementSize);\n\n  void VINSERTOp(OpcodeArgs);\n  void VINSERTPSOp(OpcodeArgs);\n\n  template<IR::OpSize ElementSize, bool IsStore>\n  void VMASKMOVOp(OpcodeArgs);\n\n  void VMOVHPOp(OpcodeArgs);\n  void VMOVLPOp(OpcodeArgs);\n\n  void VMOVDDUPOp(OpcodeArgs);\n  void VMOVSHDUPOp(OpcodeArgs);\n  void VMOVSLDUPOp(OpcodeArgs);\n\n  void VMOVSDOp(OpcodeArgs);\n  void VMOVSSOp(OpcodeArgs);\n\n  void VMOVAPS_VMOVAPDOp(OpcodeArgs);\n  void VMOVUPS_VMOVUPDOp(OpcodeArgs);\n\n  void VMPSADBWOp(OpcodeArgs);\n\n  void VPACKSSOp(OpcodeArgs, IR::OpSize ElementSize);\n\n  void VPACKUSOp(OpcodeArgs, IR::OpSize ElementSize);\n\n  void VPALIGNROp(OpcodeArgs);\n\n  void VPCMPESTRIOp(OpcodeArgs);\n  void VPCMPESTRMOp(OpcodeArgs);\n  void VPCMPISTRIOp(OpcodeArgs);\n  void VPCMPISTRMOp(OpcodeArgs);\n\n  void VCVTPH2PSOp(OpcodeArgs);\n  void VCVTPS2PHOp(OpcodeArgs);\n\n  Ref VPERMDIndices(OpSize DstSize, Ref Indices, Ref IndexMask, Ref Repeating3210);\n  void VPERM2Op(OpcodeArgs);\n  void VPERMDOp(OpcodeArgs);\n  void VPERMQOp(OpcodeArgs);\n\n  void VPERMILImmOp(OpcodeArgs, IR::OpSize ElementSize);\n\n  Ref VPERMILRegOpImpl(OpSize DstSize, IR::OpSize ElementSize, Ref Src, Ref Indices);\n  template<IR::OpSize ElementSize>\n  void VPERMILRegOp(OpcodeArgs);\n\n  void VPHADDSWOp(OpcodeArgs);\n\n  void VPHSUBOp(OpcodeArgs, IR::OpSize ElementSize);\n  void VPHSUBSWOp(OpcodeArgs);\n\n  void VPINSRBOp(OpcodeArgs);\n  void VPINSRDQOp(OpcodeArgs);\n  void VPINSRWOp(OpcodeArgs);\n\n  void VPMADDUBSWOp(OpcodeArgs);\n  void VPMADDWDOp(OpcodeArgs);\n\n  template<bool IsStore>\n  void VPMASKMOVOp(OpcodeArgs);\n\n  void VPMULHRSWOp(OpcodeArgs);\n\n  template<bool Signed>\n  void VPMULHWOp(OpcodeArgs);\n\n  template<IR::OpSize ElementSize, bool Signed>\n  void VPMULLOp(OpcodeArgs);\n\n  void VPSADBWOp(OpcodeArgs);\n\n  void VPSHUFBOp(OpcodeArgs);\n\n  void VPSHUFWOp(OpcodeArgs, IR::OpSize ElementSize, bool Low);\n\n  void VPSLLOp(OpcodeArgs, IR::OpSize ElementSize);\n  void VPSLLDQOp(OpcodeArgs);\n  void VPSLLIOp(OpcodeArgs, IR::OpSize ElementSize);\n  void VPSLLVOp(OpcodeArgs);\n\n  void VPSRAOp(OpcodeArgs, IR::OpSize ElementSize);\n\n  void VPSRAIOp(OpcodeArgs, IR::OpSize ElementSize);\n\n  void VPSRAVDOp(OpcodeArgs);\n  void VPSRLVOp(OpcodeArgs);\n\n  void VPSRLDOp(OpcodeArgs, IR::OpSize ElementSize);\n  void VPSRLDQOp(OpcodeArgs);\n\n  void VPUNPCKHOp(OpcodeArgs, IR::OpSize ElementSize);\n\n  void VPUNPCKLOp(OpcodeArgs, IR::OpSize ElementSize);\n\n  void VPSRLIOp(OpcodeArgs, IR::OpSize ElementSize);\n\n  void VSHUFOp(OpcodeArgs, IR::OpSize ElementSize);\n\n  template<IR::OpSize ElementSize>\n  void VTESTPOp(OpcodeArgs);\n\n  void VZEROOp(OpcodeArgs);\n\n  // X87 Ops\n  Ref ReconstructFSW_Helper(Ref T = nullptr);\n  // Returns new x87 stack top from FSW.\n  Ref ReconstructX87StateFromFSW_Helper(Ref FSW);\n  void FLD(OpcodeArgs, IR::OpSize Width);\n  void FLDFromStack(OpcodeArgs);\n  void FLD_Const(OpcodeArgs, NamedVectorConstant K);\n\n  void FBLD(OpcodeArgs);\n  void FBSTP(OpcodeArgs);\n\n  void FILD(OpcodeArgs);\n\n  void FST(OpcodeArgs, IR::OpSize Width);\n  void FSTToStack(OpcodeArgs);\n\n  void FIST(OpcodeArgs, bool Truncate);\n\n  // OpResult is used for Stack operations,\n  // describes if the result of the operation is stored in ST(0) or ST(i),\n  // where ST(i) is one of the arguments to the operation.\n  enum class OpResult {\n    RES_ST0,\n    RES_STI,\n  };\n\n  void FADD(OpcodeArgs, IR::OpSize Width, bool Integer, OpResult ResInST0);\n  void FDIV(OpcodeArgs, IR::OpSize Width, bool Integer, bool Reverse, OpResult ResInST0);\n  void FMUL(OpcodeArgs, IR::OpSize Width, bool Integer, OpResult ResInST0);\n  void FNCLEX(OpcodeArgs);\n  void FNINIT(OpcodeArgs);\n  void FSUB(OpcodeArgs, IR::OpSize Width, bool Integer, bool Reverse, OpResult ResInST0);\n  void FTST(OpcodeArgs);\n  void FXCH(OpcodeArgs);\n  void X87EMMS(OpcodeArgs);\n  void X87FCMOV(OpcodeArgs);\n  void X87FFREE(OpcodeArgs);\n  void X87FLDCW(OpcodeArgs);\n  void X87FNSAVE(OpcodeArgs);\n  void X87FNSTENV(OpcodeArgs);\n  void X87FNSTSW(OpcodeArgs);\n  void X87FRSTOR(OpcodeArgs);\n  void X87FSTCW(OpcodeArgs);\n  void X87FXAM(OpcodeArgs);\n  void X87FXTRACT(OpcodeArgs);\n  void X87FYL2X(OpcodeArgs, bool IsFYL2XP1);\n  void X87LDENV(OpcodeArgs);\n  void X87ModifySTP(OpcodeArgs, bool Inc);\n  void X87OpHelper(OpcodeArgs, FEXCore::IR::IROps IROp, bool ZeroC2);\n\n  enum class FCOMIFlags {\n    FLAGS_X87,\n    FLAGS_RFLAGS,\n  };\n  void FCOMI(OpcodeArgs, IR::OpSize Width, bool Integer, FCOMIFlags WhichFlags, bool PopTwice);\n\n  // F64 X87 Ops\n  void FADDF64(OpcodeArgs, IR::OpSize Width, bool Integer, OpResult ResInST0);\n  void FBLDF64(OpcodeArgs);\n  void FBSTPF64(OpcodeArgs);\n  void FCOMIF64(OpcodeArgs, IR::OpSize width, bool Integer, FCOMIFlags whichflags, bool poptwice);\n  void FDIVF64(OpcodeArgs, IR::OpSize Width, bool Integer, bool Reverse, OpResult ResInST0);\n  void FILDF64(OpcodeArgs);\n  void FISTF64(OpcodeArgs, bool Truncate);\n  void FLDF64_Const(OpcodeArgs, uint64_t Num);\n  void FLDF64(OpcodeArgs, IR::OpSize Width);\n  void FMULF64(OpcodeArgs, IR::OpSize Width, bool Integer, OpResult ResInST0);\n  void FSUBF64(OpcodeArgs, IR::OpSize Width, bool Integer, bool Reverse, OpResult ResInST0);\n  void FTSTF64(OpcodeArgs);\n  void X87FLDCWF64(OpcodeArgs);\n  void X87FXTRACTF64(OpcodeArgs);\n  void X87LDENVF64(OpcodeArgs);\n\n  void FXSaveOp(OpcodeArgs);\n  void FXRStoreOp(OpcodeArgs);\n\n  Ref XSaveBase(X86Tables::DecodedOp Op);\n  void XSaveOp(OpcodeArgs);\n\n  void PAlignrOp(OpcodeArgs);\n  template<IR::OpSize ElementSize>\n  void UCOMISxOp(OpcodeArgs);\n  void LDMXCSR(OpcodeArgs);\n  void STMXCSR(OpcodeArgs);\n\n  template<IR::OpSize ElementSize>\n  void PACKUSOp(OpcodeArgs);\n\n  template<IR::OpSize ElementSize>\n  void PACKSSOp(OpcodeArgs);\n\n  template<IR::OpSize ElementSize, bool Signed>\n  void PMULLOp(OpcodeArgs);\n\n  template<bool ToXMM>\n  void MOVQ2DQ(OpcodeArgs);\n\n  template<IR::OpSize ElementSize>\n  void ADDSUBPOp(OpcodeArgs);\n\n  void PFNACCOp(OpcodeArgs);\n  void PFPNACCOp(OpcodeArgs);\n  void PSWAPDOp(OpcodeArgs);\n\n  template<uint8_t CompType>\n  void VPFCMPOp(OpcodeArgs);\n  void PI2FWOp(OpcodeArgs);\n  void PF2IWOp(OpcodeArgs);\n\n  void PMULHRWOp(OpcodeArgs);\n\n  void PMADDWD(OpcodeArgs);\n  void PMADDUBSW(OpcodeArgs);\n\n  template<bool Signed>\n  void PMULHW(OpcodeArgs);\n\n  void PMULHRSW(OpcodeArgs);\n\n  void MOVBEOp(OpcodeArgs);\n  template<IR::OpSize ElementSize>\n  void HSUBP(OpcodeArgs);\n  template<IR::OpSize ElementSize>\n  void PHSUB(OpcodeArgs);\n\n  void PHADDS(OpcodeArgs);\n  void PHSUBS(OpcodeArgs);\n\n  void CLWBOrTPause(OpcodeArgs);\n  void CLFLUSHOPT(OpcodeArgs);\n  void LoadFenceOrXRSTOR(OpcodeArgs);\n  void MemFenceOrXSAVEOPT(OpcodeArgs);\n  void StoreFenceOrCLFlush(OpcodeArgs);\n  void UMonitorOrCLRSSBSY(OpcodeArgs);\n  void UMWaitOp(OpcodeArgs);\n  void CLZeroOp(OpcodeArgs);\n  void RDTSCPOp(OpcodeArgs);\n  void RDPIDOp(OpcodeArgs);\n\n  void Prefetch(OpcodeArgs, bool ForStore, bool Stream, uint8_t Level);\n\n  void PSADBW(OpcodeArgs);\n\n  void SHA1NEXTEOp(OpcodeArgs);\n  void SHA1MSG1Op(OpcodeArgs);\n  void SHA1MSG2Op(OpcodeArgs);\n  void SHA1RNDS4Op(OpcodeArgs);\n\n  void SHA256MSG1Op(OpcodeArgs);\n  void SHA256MSG2Op(OpcodeArgs);\n  void SHA256RNDS2Op(OpcodeArgs);\n\n  void AESImcOp(OpcodeArgs);\n  void AESEncOp(OpcodeArgs);\n  void AESEncLastOp(OpcodeArgs);\n  void AESDecOp(OpcodeArgs);\n  void AESDecLastOp(OpcodeArgs);\n  void AESKeyGenAssist(OpcodeArgs);\n\n  void VFMAImpl(OpcodeArgs, IROps IROp, bool Scalar, uint8_t Src1Idx, uint8_t Src2Idx, uint8_t AddendIdx);\n  void VFMAddSubImpl(OpcodeArgs, bool AddSub, uint8_t Src1Idx, uint8_t Src2Idx, uint8_t AddendIdx);\n\n  struct RefVSIB {\n    Ref Low, High;\n    Ref BaseAddr;\n    int32_t Displacement;\n    uint8_t Scale;\n  };\n\n  RefVSIB LoadVSIB(const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand, uint32_t Flags);\n  template<OpSize AddrElementSize>\n  void VPGATHER(OpcodeArgs);\n\n  template<IR::OpSize ElementSize, IR::OpSize DstElementSize, bool Signed>\n  void ExtendVectorElements(OpcodeArgs);\n  template<IR::OpSize ElementSize>\n  void VectorRound(OpcodeArgs);\n\n  Ref VectorBlend(OpSize Size, IR::OpSize ElementSize, Ref Src1, Ref Src2, uint8_t Selector);\n\n  template<IR::OpSize ElementSize>\n  void VectorBlend(OpcodeArgs);\n\n  void VectorVariableBlend(OpcodeArgs, IR::OpSize ElementSize);\n  void PTestOpImpl(OpSize Size, Ref Dest, Ref Src);\n  void PTestOp(OpcodeArgs);\n  void PHMINPOSUWOp(OpcodeArgs);\n  template<IR::OpSize ElementSize>\n  void DPPOp(OpcodeArgs);\n\n  void MPSADBWOp(OpcodeArgs);\n  void PCLMULQDQOp(OpcodeArgs);\n  void VPCLMULQDQOp(OpcodeArgs);\n\n  void CRC32(OpcodeArgs);\n  void Extrq_imm(OpcodeArgs);\n  void Insertq_imm(OpcodeArgs);\n  void Extrq(OpcodeArgs);\n  void Insertq(OpcodeArgs);\n\n  void BreakOp(OpcodeArgs, FEXCore::IR::BreakDefinition BreakDefinition);\n  void UnimplementedOp(OpcodeArgs);\n  void PermissionRestrictedOp(OpcodeArgs);\n\n  ///< Helper for PSHUD and VPERMILPS(imm) since they are the same instruction\n  Ref Single128Bit4ByteVectorShuffle(Ref Src, uint8_t Shuffle);\n  // AVX 128-bit operations\n  Ref AVX128_LoadXMMRegister(uint32_t XMM, bool High);\n  void AVX128_StoreXMMRegister(uint32_t XMM, const Ref Src, bool High);\n\n  struct RefPair {\n    Ref Low, High;\n  };\n\n  RefPair AVX128_Zext(Ref R) {\n    RefPair Pair;\n    Pair.Low = R;\n    Pair.High = LoadZeroVector(OpSize::i128Bit);\n    return Pair;\n  }\n\n  Ref SHADataShuffle(Ref Src) {\n    // SHA data shuffle matches PSHUFD shuffle where elements are inverted.\n    // Because this shuffle mask gets reused multiple times per instruction, it's always a win to load the mask once and reuse it.\n    const uint32_t Shuffle = 0b00'01'10'11;\n    auto LookupIndexes =\n      LoadAndCacheIndexedNamedVectorConstant(OpSize::i128Bit, FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_PSHUFD, Shuffle * 16);\n    return _VTBL1(OpSize::i128Bit, Src, LookupIndexes);\n  }\n\n  RefPair AVX128_LoadSource_WithOpSize(const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand, uint32_t Flags,\n                                       bool NeedsHigh, MemoryAccessType AccessType = MemoryAccessType::DEFAULT);\n\n  RefVSIB AVX128_LoadVSIB(const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand, uint32_t Flags, bool NeedsHigh);\n  void AVX128_StoreResult_WithOpSize(FEXCore::X86Tables::DecodedOp Op, const FEXCore::X86Tables::DecodedOperand& Operand, const RefPair Src,\n                                     MemoryAccessType AccessType = MemoryAccessType::DEFAULT);\n  void AVX128_VMOVScalarImpl(OpcodeArgs, IR::OpSize ElementSize);\n  void AVX128_VectorALU(OpcodeArgs, IROps IROp, IR::OpSize ElementSize);\n  void AVX128_VectorUnary(OpcodeArgs, IROps IROp, IR::OpSize ElementSize);\n  void AVX128_VectorUnaryImpl(OpcodeArgs, IR::OpSize SrcSize, IR::OpSize ElementSize, std::function<Ref(IR::OpSize ElementSize, Ref Src)> Helper);\n  void AVX128_VectorBinaryImpl(OpcodeArgs, IR::OpSize SrcSize, IR::OpSize ElementSize,\n                               std::function<Ref(IR::OpSize ElementSize, Ref Src1, Ref Src2)> Helper);\n  void AVX128_VectorShiftWideImpl(OpcodeArgs, IR::OpSize ElementSize, IROps IROp);\n  void AVX128_VectorShiftImmImpl(OpcodeArgs, IR::OpSize ElementSize, IROps IROp);\n  void AVX128_VectorTrinaryImpl(OpcodeArgs, IR::OpSize SrcSize, IR::OpSize ElementSize, Ref Src3,\n                                std::function<Ref(IR::OpSize ElementSize, Ref Src1, Ref Src2, Ref Src3)> Helper);\n\n  enum class ShiftDirection { RIGHT, LEFT };\n  void AVX128_ShiftDoubleImm(OpcodeArgs, ShiftDirection Dir);\n\n  void AVX128_VMOVAPS(OpcodeArgs);\n  void AVX128_VMOVSD(OpcodeArgs);\n  void AVX128_VMOVSS(OpcodeArgs);\n\n  void AVX128_VectorXOR(OpcodeArgs);\n\n  void AVX128_VZERO(OpcodeArgs);\n  void AVX128_MOVVectorNT(OpcodeArgs);\n  void AVX128_MOVQ(OpcodeArgs);\n  void AVX128_VMOVLP(OpcodeArgs);\n  void AVX128_VMOVHP(OpcodeArgs);\n  void AVX128_VMOVDDUP(OpcodeArgs);\n  void AVX128_VMOVSLDUP(OpcodeArgs);\n  void AVX128_VMOVSHDUP(OpcodeArgs);\n  void AVX128_VBROADCAST(OpcodeArgs, IR::OpSize ElementSize);\n  void AVX128_VPUNPCKL(OpcodeArgs, IR::OpSize ElementSize);\n  void AVX128_VPUNPCKH(OpcodeArgs, IR::OpSize ElementSize);\n  void AVX128_MOVVectorUnaligned(OpcodeArgs);\n  void AVX128_InsertCVTGPR_To_FPR(OpcodeArgs, IR::OpSize DstElementSize);\n  void AVX128_CVTFPR_To_GPR(OpcodeArgs, IR::OpSize SrcElementSize, bool HostRoundingMode);\n  void AVX128_VANDN(OpcodeArgs);\n  void AVX128_VPACKSS(OpcodeArgs, IR::OpSize ElementSize);\n  void AVX128_VPACKUS(OpcodeArgs, IR::OpSize ElementSize);\n  Ref AVX128_PSIGNImpl(IR::OpSize ElementSize, Ref Src1, Ref Src2);\n  void AVX128_VPSIGN(OpcodeArgs, IR::OpSize ElementSize);\n  void AVX128_UCOMISx(OpcodeArgs, IR::OpSize ElementSize);\n  void AVX128_VectorScalarInsertALU(OpcodeArgs, FEXCore::IR::IROps IROp, IR::OpSize ElementSize);\n  void AVX128_VFCMP(OpcodeArgs, IR::OpSize ElementSize);\n  void AVX128_InsertScalarFCMP(OpcodeArgs, IR::OpSize ElementSize);\n  void AVX128_MOVBetweenGPR_FPR(OpcodeArgs);\n  void AVX128_PExtr(OpcodeArgs, IR::OpSize ElementSize);\n  void AVX128_ExtendVectorElements(OpcodeArgs, IR::OpSize ElementSize, IR::OpSize DstElementSize, bool Signed);\n  void AVX128_MOVMSK(OpcodeArgs, IR::OpSize ElementSize);\n  void AVX128_MOVMSKB(OpcodeArgs);\n  void AVX128_PINSRImpl(OpcodeArgs, IR::OpSize ElementSize, const X86Tables::DecodedOperand& Src1Op,\n                        const X86Tables::DecodedOperand& Src2Op, const X86Tables::DecodedOperand& Imm);\n  void AVX128_VPINSRB(OpcodeArgs);\n  void AVX128_VPINSRW(OpcodeArgs);\n  void AVX128_VPINSRDQ(OpcodeArgs);\n\n  void AVX128_VariableShiftImpl(OpcodeArgs, IROps IROp);\n\n  void AVX128_VINSERT(OpcodeArgs);\n  void AVX128_VINSERTPS(OpcodeArgs);\n\n  void AVX128_VPHSUB(OpcodeArgs, IR::OpSize ElementSize);\n  void AVX128_VPHSUBSW(OpcodeArgs);\n\n  void AVX128_VADDSUBP(OpcodeArgs, IR::OpSize ElementSize);\n\n  void AVX128_VPMULL(OpcodeArgs, IR::OpSize ElementSize, bool Signed);\n\n  void AVX128_VPMULHRSW(OpcodeArgs);\n\n  void AVX128_VPMULHW(OpcodeArgs, bool Signed);\n\n  void AVX128_InsertScalar_CVT_Float_To_Float(OpcodeArgs, IR::OpSize DstElementSize, IR::OpSize SrcElementSize);\n\n  void AVX128_Vector_CVT_Float_To_Float(OpcodeArgs, IR::OpSize DstElementSize, IR::OpSize SrcElementSize);\n\n  void AVX128_Vector_CVT_Float_To_Int(OpcodeArgs, IR::OpSize SrcElementSize, bool HostRoundingMode);\n\n  void AVX128_Vector_CVT_Int_To_Float(OpcodeArgs, IR::OpSize SrcElementSize, bool Widen);\n\n  void AVX128_VEXTRACT128(OpcodeArgs);\n  void AVX128_VAESImc(OpcodeArgs);\n  void AVX128_VAESEnc(OpcodeArgs);\n  void AVX128_VAESEncLast(OpcodeArgs);\n  void AVX128_VAESDec(OpcodeArgs);\n  void AVX128_VAESDecLast(OpcodeArgs);\n  void AVX128_VAESKeyGenAssist(OpcodeArgs);\n\n  void AVX128_VPCMPESTRI(OpcodeArgs);\n  void AVX128_VPCMPESTRM(OpcodeArgs);\n  void AVX128_VPCMPISTRI(OpcodeArgs);\n  void AVX128_VPCMPISTRM(OpcodeArgs);\n\n  void AVX128_PHMINPOSUW(OpcodeArgs);\n\n  void AVX128_VectorRound(OpcodeArgs, IR::OpSize ElementSize);\n  void AVX128_InsertScalarRound(OpcodeArgs, IR::OpSize ElementSize);\n\n  void AVX128_VDPP(OpcodeArgs, IR::OpSize ElementSize);\n  void AVX128_VPERMQ(OpcodeArgs);\n\n  void AVX128_VPSHUFW(OpcodeArgs, bool Low);\n\n  void AVX128_VSHUF(OpcodeArgs, IR::OpSize ElementSize);\n\n  void AVX128_VPERMILImm(OpcodeArgs, IR::OpSize ElementSize);\n\n  void AVX128_VHADDP(OpcodeArgs, IROps IROp, IR::OpSize ElementSize);\n\n  void AVX128_VPHADDSW(OpcodeArgs);\n\n  void AVX128_VPMADDUBSW(OpcodeArgs);\n  void AVX128_VPMADDWD(OpcodeArgs);\n\n  void AVX128_VBLEND(OpcodeArgs, IR::OpSize ElementSize);\n\n  void AVX128_VHSUBP(OpcodeArgs, IR::OpSize ElementSize);\n\n  void AVX128_VPSHUFB(OpcodeArgs);\n  void AVX128_VPSADBW(OpcodeArgs);\n\n  void AVX128_VMPSADBW(OpcodeArgs);\n  void AVX128_VPALIGNR(OpcodeArgs);\n\n  void AVX128_VMASKMOVImpl(OpcodeArgs, IR::OpSize ElementSize, IR::OpSize DstSize, bool IsStore, const X86Tables::DecodedOperand& MaskOp,\n                           const X86Tables::DecodedOperand& DataOp);\n\n  void AVX128_VPMASKMOV(OpcodeArgs, bool IsStore);\n\n  void AVX128_VMASKMOV(OpcodeArgs, IR::OpSize ElementSize, bool IsStore);\n\n  void AVX128_MASKMOV(OpcodeArgs);\n\n  void AVX128_VectorVariableBlend(OpcodeArgs, IR::OpSize ElementSize);\n\n  void AVX128_SaveAVXState(Ref MemBase);\n  void AVX128_RestoreAVXState(Ref MemBase);\n  void AVX128_DefaultAVXState();\n\n  void AVX128_VPERM2(OpcodeArgs);\n  void AVX128_VTESTP(OpcodeArgs, IR::OpSize ElementSize);\n  void AVX128_PTest(OpcodeArgs);\n\n  void AVX128_VPERMILReg(OpcodeArgs, IR::OpSize ElementSize);\n\n  void AVX128_VPERMD(OpcodeArgs);\n\n  void AVX128_VPCLMULQDQ(OpcodeArgs);\n\n  void AVX128_VFMAImpl(OpcodeArgs, IROps IROp, uint8_t Src1Idx, uint8_t Src2Idx, uint8_t AddendIdx);\n  void AVX128_VFMAScalarImpl(OpcodeArgs, IROps IROp, uint8_t Src1Idx, uint8_t Src2Idx, uint8_t AddendIdx);\n  void AVX128_VFMAddSubImpl(OpcodeArgs, bool AddSub, uint8_t Src1Idx, uint8_t Src2Idx, uint8_t AddendIdx);\n\n  RefPair AVX128_VPGatherQPSImpl(OpcodeArgs, Ref Dest, Ref Mask, RefVSIB VSIB);\n  RefPair AVX128_VPGatherImpl(OpcodeArgs, OpSize Size, OpSize ElementLoadSize, OpSize AddrElementSize, RefPair Dest, RefPair Mask, RefVSIB VSIB);\n\n  void AVX128_VPGATHER(OpcodeArgs, OpSize AddrElementSize);\n\n  void AVX128_VCVTPH2PS(OpcodeArgs);\n  void AVX128_VCVTPS2PH(OpcodeArgs);\n\n  // End of AVX 128-bit implementation\n\n  // AVX 256-bit operations\n  void StoreResult_WithAVXInsert(VectorOpType Type, RegClass Class, FEXCore::X86Tables::DecodedOp Op, Ref Value,\n                                 IR::OpSize Align = IR::OpSize::iInvalid, MemoryAccessType AccessType = MemoryAccessType::DEFAULT) {\n    if (Op->Dest.IsGPR() && Op->Dest.Data.GPR.GPR >= X86State::REG_XMM_0 && Op->Dest.Data.GPR.GPR <= X86State::REG_XMM_15 &&\n        GetGuestVectorLength() == OpSize::i256Bit && Type == VectorOpType::SSE) {\n      const auto gpr = Op->Dest.Data.GPR.GPR;\n      const auto gprIndex = gpr - X86State::REG_XMM_0;\n      auto DestVector = LoadXMMRegister(gprIndex);\n      Value = _VInsElement(GetGuestVectorLength(), OpSize::i128Bit, 0, 0, DestVector, Value);\n      StoreXMMRegister(gprIndex, Value);\n      return;\n    }\n\n    StoreResult(Class, Op, Value, Align, AccessType);\n  }\n\n  void StoreXMMRegister_WithAVXInsert(VectorOpType Type, uint32_t XMM, Ref Value) {\n    if (GetGuestVectorLength() == OpSize::i256Bit && Type == VectorOpType::SSE) {\n      ///< SSE vector stores need to insert in the low 128-bit lane of the 256-bit register.\n      auto DestVector = LoadXMMRegister(XMM);\n      Value = _VInsElement(GetGuestVectorLength(), OpSize::i128Bit, 0, 0, DestVector, Value);\n      StoreXMMRegister(XMM, Value);\n      return;\n    }\n    StoreXMMRegister(XMM, Value);\n  }\n\n  void AVXVectorALUOp(OpcodeArgs, IROps IROp, IR::OpSize ElementSize);\n  void AVXVectorUnaryOp(OpcodeArgs, IROps IROp, IR::OpSize ElementSize);\n  void AVXVectorVariableBlend(OpcodeArgs, IR::OpSize ElementSize);\n\n  // End of AVX 256-bit implementation\n\n  void InvalidOp(OpcodeArgs);\n  void NoExecOp(OpcodeArgs);\n\n  void SetPackedRFLAG(bool Lower8, Ref Src);\n  Ref GetPackedRFLAG(uint32_t FlagsMask = ~0U);\n\n  void SetMultiblock(bool _Multiblock) {\n    Multiblock = _Multiblock;\n  }\n\n  static inline constexpr unsigned IndexNZCV(unsigned BitOffset) {\n    switch (BitOffset) {\n    case FEXCore::X86State::RFLAG_OF_RAW_LOC: return 28;\n    case FEXCore::X86State::RFLAG_CF_RAW_LOC: return 29;\n    case FEXCore::X86State::RFLAG_ZF_RAW_LOC: return 30;\n    case FEXCore::X86State::RFLAG_SF_RAW_LOC: return 31;\n    default: FEX_UNREACHABLE;\n    }\n  }\n\n  void StoreContextHelper(IR::OpSize Size, RegClass Class, Ref Value, uint32_t Offset) {\n    // For i128Bit, we won't see a normal Constant to inline, but as a special\n    // case we can replace with a 2x64-bit store which can use inline zeroes.\n    if (Size == OpSize::i128Bit) {\n      auto Header = GetOpHeader(WrapNode(Value));\n      const auto MAX_STP_OFFSET = (252 * 4);\n\n      if (Offset <= MAX_STP_OFFSET && Header->Op == OP_LOADNAMEDVECTORCONSTANT) {\n        auto Const = Header->C<IR::IROp_LoadNamedVectorConstant>();\n\n        if (Const->Constant == IR::NamedVectorConstant::NAMED_VECTOR_ZERO) {\n          Ref Zero = _Constant(0);\n          Ref STP = _StoreContextPair(IR::OpSize::i64Bit, RegClass::GPR, Zero, Zero, Offset);\n\n          // XXX: This works around InlineConstant not having an associated\n          // register class, else we'd just do InlineConstant above.\n          Ref InlineZero = _InlineConstant(0);\n          ReplaceNodeArgument(STP, 0, InlineZero);\n          ReplaceNodeArgument(STP, 1, InlineZero);\n          return;\n        }\n      }\n    }\n\n    _StoreContext(Size, Class, Value, Offset);\n  }\n\n  void FlushRegisterCache(bool SRAOnly = false, bool MMXOnly = false) {\n    // At block boundaries, fix up the carry flag.\n    if (!SRAOnly) {\n      RectifyCarryInvert(CFInvertedABI);\n    }\n\n    if (!MMXOnly) {\n      CalculateDeferredFlags();\n    }\n\n    const auto GPRSize = GetGPROpSize();\n    const auto VectorSize = GetGuestVectorLength();\n\n    // Write backwards. This is a heuristic to improve coalescing, since we\n    // often copy from (low) fixed GPRs to (high) PF/AF for celebrity\n    // instructions like \"add rax, 1\". This hack will go away with clauses.\n    uint64_t Bits = RegCache.Written;\n\n    // We have an SRA only mode that exists as a hack to make register caching\n    // less aggressive. We should get rid of this once RA can take it.\n    uint64_t Mask = ~0ULL;\n\n    if (SRAOnly) {\n      const uint64_t GPRMask = ((1ull << (AFIndex - GPR0Index + 1)) - 1) << GPR0Index;\n      const uint64_t FPRMask = ((1ull << (FPR15Index - FPR0Index + 1)) - 1) << FPR0Index;\n\n      Mask &= (GPRMask | FPRMask);\n      Bits &= Mask;\n    }\n\n    if (MMXOnly) {\n      Mask &= ((1ull << (MM7Index - MM0Index + 1)) - 1) << MM0Index;\n      Bits &= Mask;\n    }\n\n    while (Bits != 0) {\n      uint32_t Index = 63 - std::countl_zero(Bits);\n      Ref Value = RegCache.Value[Index];\n\n      if (Index >= GPR0Index && Index <= GPR15Index) {\n        Ref R = _StoreRegister(Value, GPRSize);\n        R->Reg = PhysicalRegister(RegClass::GPRFixed, Index - GPR0Index).Raw;\n      } else if (Index == PFIndex) {\n        _StorePF(Value, GPRSize);\n      } else if (Index == AFIndex) {\n        _StoreAF(Value, GPRSize);\n      } else if (Index >= FPR0Index && Index <= FPR15Index) {\n        Ref R = _StoreRegister(Value, VectorSize);\n        R->Reg = PhysicalRegister(RegClass::FPRFixed, Index - FPR0Index).Raw;\n      } else if (Index == DFIndex) {\n        _StoreContextGPR(OpSize::i8Bit, Value, offsetof(Core::CPUState, flags[X86State::RFLAG_DF_RAW_LOC]));\n      } else {\n        bool Partial = RegCache.Partial & (1ull << Index);\n        auto Size = Partial ? OpSize::i64Bit : CacheIndexToOpSize(Index);\n        uint64_t NextBit = (1ull << (Index - 1));\n        uint32_t Offset = CacheIndexToContextOffset(Index);\n        auto Class = CacheIndexClass(Index);\n        LOGMAN_THROW_A_FMT(Offset != ~0U, \"Invalid offset\");\n\n        // Use stp where possible to store multiple values at a time. This accelerates AVX.\n        // TODO: this is all really confusing because of backwards iteration,\n        // can we peel back that hack?\n        const auto SizeInt = IR::OpSizeToSize(Size);\n        if ((Bits & NextBit) && !Partial && Size >= OpSize::i32Bit && CacheIndexToContextOffset(Index - 1) == Offset - SizeInt &&\n            (Offset - SizeInt) / SizeInt < 64) {\n          LOGMAN_THROW_A_FMT(CacheIndexClass(Index - 1) == Class, \"construction\");\n          LOGMAN_THROW_A_FMT((Offset % SizeInt) == 0, \"construction\");\n          Ref ValueNext = RegCache.Value[Index - 1];\n\n          _StoreContextPair(Size, Class, ValueNext, Value, Offset - SizeInt);\n          Bits &= ~NextBit;\n        } else {\n          StoreContextHelper(Size, Class, Value, Offset);\n          // If Partial and MMX register, then we need to store all 1s in bits 64-80\n          if (Partial && Index >= MM0Index && Index <= MM7Index) {\n            _StoreContextGPR(OpSize::i16Bit, Constant(0xFFFF), Offset + 8);\n          }\n        }\n      }\n\n      Bits &= ~(1ull << Index);\n    }\n\n    RegCache.Written &= ~Mask;\n    RegCache.Cached &= ~Mask;\n    RegCache.Partial &= ~Mask;\n  }\n\n  IR::OpSize GetGPROpSize() const {\n    return Is64BitMode ? IR::OpSize::i64Bit : IR::OpSize::i32Bit;\n  }\n\nprotected:\n  void RecordX87Use() override {\n    CurrentHeader->HasX87 = true;\n  }\n\n  void SaveNZCV(IROps Op = OP_DUMMY) override {\n    /* Some opcodes are conservatively marked as clobbering flags, but in fact\n     * do not clobber flags in certain conditions. Check for that here as an\n     * optimization.\n     */\n    switch (Op) {\n    case OP_VFMINSCALARINSERT:\n    case OP_VFMAXSCALARINSERT:\n      /* On AFP platforms, becomes fmin/fmax and preserves NZCV. Otherwise\n       * becomes fcmp and clobbers.\n       */\n      if (CTX->HostFeatures.SupportsAFP) {\n        return;\n      }\n      break;\n\n    case OP_VLOADVECTORMASKED:\n    case OP_VLOADVECTORGATHERMASKED:\n    case OP_VLOADVECTORGATHERMASKEDQPS:\n    case OP_VSTOREVECTORMASKED:\n      /* On ASIMD platforms, the emulation happens to preserve NZCV, unlike the\n       * more optimal SVE implementation that clobbers.\n       */\n      if (!CTX->HostFeatures.SupportsSVE128 && !CTX->HostFeatures.SupportsSVE256) {\n        return;\n      }\n\n      break;\n    default: break;\n    }\n\n    // Invariant: When executing instructions that clobber NZCV, the flags must\n    // be resident in a GPR, which is equivalent to CachedNZCV != nullptr. Get\n    // the NZCV which fills the cache if necessary.\n    if (CachedNZCV == nullptr) {\n      GetNZCV();\n    }\n\n    // Assume we'll need a reload.\n    NZCVDirty = true;\n  }\n\nprivate:\n  FEX_CONFIG_OPT(ReducedPrecisionMode, X87REDUCEDPRECISION);\n\n  struct JumpTargetInfo {\n    Ref BlockEntry;\n    bool HaveEmitted;\n    bool IsEntryPoint;\n  };\n\n  FEXCore::Context::ContextImpl* CTX {};\n\n  constexpr static unsigned FullNZCVMask = (1U << FEXCore::X86State::RFLAG_CF_RAW_LOC) | (1U << FEXCore::X86State::RFLAG_ZF_RAW_LOC) |\n                                           (1U << FEXCore::X86State::RFLAG_SF_RAW_LOC) | (1U << FEXCore::X86State::RFLAG_OF_RAW_LOC);\n\n  static bool ContainsNZCV(unsigned BitMask) {\n    return (BitMask & FullNZCVMask) != 0;\n  }\n\n  static bool IsNZCV(unsigned BitOffset) {\n    return BitOffset < 32 && ContainsNZCV(1U << BitOffset);\n  }\n\n  Ref CachedNZCV {};\n  bool NZCVDirty {};\n\n  // Set if the host carry is inverted from the guest carry. This is set after\n  // subtraction, because arm64 and x86 have inverted borrow flags, but clear\n  // after addition.\n  //\n  // All CF access needs to maintain this flag. cfinv may be inserted at the end\n  // of a block to rectify to the FEX convention (current convention: NOT\n  // INVERTED).\n  bool CFInverted {};\n\n  // FEX convention for CF at the end of blocks: INVERTED.\n  const bool CFInvertedABI {true};\n\n  fextl::map<uint64_t, JumpTargetInfo> JumpTargets;\n  bool HandledLock {false};\n  bool DecodeFailure {false};\n  bool NeedsBlockEnd {false};\n  ForceTSOMode ForceTSO {ForceTSOMode::NoOverride};\n  // Used during new op bringup\n  bool ShouldDump {false};\n\n  using SaveStoreAVXStatePtr = void (OpDispatchBuilder::*)(Ref MemBase);\n  using DefaultAVXStatePtr = void (OpDispatchBuilder::*)();\n  SaveStoreAVXStatePtr SaveAVXStateFunc {&OpDispatchBuilder::SaveAVXState};\n  SaveStoreAVXStatePtr RestoreAVXStateFunc {&OpDispatchBuilder::RestoreAVXState};\n  DefaultAVXStatePtr DefaultAVXStateFunc {&OpDispatchBuilder::DefaultAVXState};\n\n  // Opcode helpers for generalizing behavior across VEX and non-VEX variants.\n\n  Ref ADDSUBPOpImpl(OpSize Size, IR::OpSize ElementSize, Ref Src1, Ref Src2);\n\n  void AVXVariableShiftImpl(OpcodeArgs, IROps IROp);\n\n  Ref AESKeyGenAssistImpl(OpcodeArgs);\n\n  Ref CVTGPR_To_FPRImpl(OpcodeArgs, IR::OpSize DstElementSize, const X86Tables::DecodedOperand& Src1Op, const X86Tables::DecodedOperand& Src2Op);\n\n  Ref DPPOpImpl(IR::OpSize DstSize, Ref Src1, Ref Src2, uint8_t Mask, IR::OpSize ElementSize);\n\n  Ref VDPPSOpImpl(OpcodeArgs, const X86Tables::DecodedOperand& Src1, const X86Tables::DecodedOperand& Src2, const X86Tables::DecodedOperand& Imm);\n\n  Ref ExtendVectorElementsImpl(OpcodeArgs, IR::OpSize ElementSize, IR::OpSize DstElementSize, bool Signed);\n\n  Ref HSUBPOpImpl(OpSize Size, IR::OpSize ElementSize, Ref Src1, Ref Src2);\n\n  Ref InsertPSOpImpl(OpcodeArgs, const X86Tables::DecodedOperand& Src1, const X86Tables::DecodedOperand& Src2,\n                     const X86Tables::DecodedOperand& Imm);\n\n  Ref MPSADBWOpImpl(IR::OpSize SrcSize, Ref Src1, Ref Src2, uint8_t Select);\n\n  Ref PALIGNROpImpl(OpcodeArgs, const X86Tables::DecodedOperand& Src1, const X86Tables::DecodedOperand& Src2,\n                    const X86Tables::DecodedOperand& Imm, bool IsAVX);\n\n  void PCMPXSTRXOpImpl(OpcodeArgs, bool IsExplicit, bool IsMask);\n\n  Ref PHADDSOpImpl(OpSize Size, Ref Src1, Ref Src2);\n\n  Ref PHMINPOSUWOpImpl(OpcodeArgs);\n\n  Ref PHSUBOpImpl(OpSize Size, Ref Src1, Ref Src2, IR::OpSize ElementSize);\n\n  Ref PHSUBSOpImpl(OpSize Size, Ref Src1, Ref Src2);\n\n  Ref PINSROpImpl(OpcodeArgs, IR::OpSize ElementSize, const X86Tables::DecodedOperand& Src1Op, const X86Tables::DecodedOperand& Src2Op,\n                  const X86Tables::DecodedOperand& Imm);\n\n  Ref PMADDWDOpImpl(IR::OpSize Size, Ref Src1, Ref Src2);\n\n  Ref PMADDUBSWOpImpl(IR::OpSize Size, Ref Src1, Ref Src2);\n\n  Ref PMULHRSWOpImpl(OpSize Size, Ref Src1, Ref Src2);\n\n  Ref PMULHWOpImpl(OpcodeArgs, bool Signed, Ref Src1, Ref Src2);\n\n  Ref PMULLOpImpl(OpSize Size, IR::OpSize ElementSize, bool Signed, Ref Src1, Ref Src2);\n\n  Ref PSADBWOpImpl(IR::OpSize Size, Ref Src1, Ref Src2);\n\n  Ref GeneratePSHUFBMask(IR::OpSize SrcSize);\n  Ref PSHUFBOpImpl(IR::OpSize SrcSize, Ref Src1, Ref Src2, Ref MaskVector);\n\n  Ref PSIGNImpl(OpcodeArgs, IR::OpSize ElementSize, Ref Src1, Ref Src2);\n\n  Ref PSLLIImpl(OpcodeArgs, IR::OpSize ElementSize, Ref Src, uint64_t Shift);\n\n  Ref PSLLImpl(OpcodeArgs, IR::OpSize ElementSize, Ref Src, Ref ShiftVec);\n\n  Ref PSRAOpImpl(OpcodeArgs, IR::OpSize ElementSize, Ref Src, Ref ShiftVec);\n\n  Ref PSRLDOpImpl(OpcodeArgs, IR::OpSize ElementSize, Ref Src, Ref ShiftVec);\n\n  Ref SHUFOpImpl(OpcodeArgs, IR::OpSize DstSize, IR::OpSize ElementSize, Ref Src1, Ref Src2, uint8_t Shuffle);\n\n  void VMASKMOVOpImpl(OpcodeArgs, IR::OpSize ElementSize, IR::OpSize DataSize, bool IsStore, const X86Tables::DecodedOperand& MaskOp,\n                      const X86Tables::DecodedOperand& DataOp);\n\n  void MOVScalarOpImpl(OpcodeArgs, IR::OpSize ElementSize);\n  void VMOVScalarOpImpl(OpcodeArgs, IR::OpSize ElementSize);\n\n  Ref VFCMPOpImpl(OpSize Size, IR::OpSize ElementSize, Ref Src1, Ref Src2, uint8_t CompType);\n\n  void VTESTOpImpl(OpSize SrcSize, IR::OpSize ElementSize, Ref Src1, Ref Src2);\n\n  void VectorUnaryDuplicateOpImpl(OpcodeArgs, IROps IROp, IR::OpSize ElementSize);\n\n  // x86 ALU scalar operations operate in three different ways\n  // - AVX512: Writemask shenanigans that we don't care about.\n  // - AVX/VEX: Two source\n  //   - Example 32bit VADDSS Dest, Src1, Src2\n  //   - Dest[31:0] = Src1[31:0] + Src2[31:0]\n  //   - Dest[127:32] = Src1[127:32]\n  // - SSE: Scalar operation inserts in to the low bits, upper bits completely unaffected.\n  //   - Example 32bit ADDSS Dest, Src\n  //   - Dest[31:0] = Dest[31:0] + Src[31:0]\n  //   - Dest[{256,128}:32] = (Unmodified)\n  Ref VectorScalarInsertALUOpImpl(OpcodeArgs, IROps IROp, IR::OpSize DstSize, IR::OpSize ElementSize,\n                                  const X86Tables::DecodedOperand& Src1Op, const X86Tables::DecodedOperand& Src2Op, bool ZeroUpperBits);\n\n  Ref VectorScalarUnaryInsertALUOpImpl(OpcodeArgs, IROps IROp, IR::OpSize DstSize, IR::OpSize ElementSize,\n                                       const X86Tables::DecodedOperand& Src1Op, const X86Tables::DecodedOperand& Src2Op, bool ZeroUpperBits);\n\n  Ref InsertCVTGPR_To_FPRImpl(OpcodeArgs, IR::OpSize DstSize, IR::OpSize DstElementSize, const X86Tables::DecodedOperand& Src1Op,\n                              const X86Tables::DecodedOperand& Src2Op, bool ZeroUpperBits);\n\n  Ref InsertScalar_CVT_Float_To_FloatImpl(OpcodeArgs, IR::OpSize DstSize, IR::OpSize DstElementSize, IR::OpSize SrcElementSize,\n                                          const X86Tables::DecodedOperand& Src1Op, const X86Tables::DecodedOperand& Src2Op, bool ZeroUpperBits);\n  Ref InsertScalarRoundImpl(OpcodeArgs, IR::OpSize DstSize, IR::OpSize ElementSize, const X86Tables::DecodedOperand& Src1Op,\n                            const X86Tables::DecodedOperand& Src2Op, uint64_t Mode, bool ZeroUpperBits);\n\n  Ref InsertScalarFCMPOpImpl(OpSize Size, IR::OpSize OpDstSize, IR::OpSize ElementSize, Ref Src1, Ref Src2, uint8_t CompType, bool ZeroUpperBits);\n\n  Ref VectorRoundImpl(OpSize Size, IR::OpSize ElementSize, Ref Src, uint64_t Mode);\n\n  Ref Scalar_CVT_Float_To_FloatImpl(OpcodeArgs, IR::OpSize DstElementSize, IR::OpSize SrcElementSize,\n                                    const X86Tables::DecodedOperand& Src1Op, const X86Tables::DecodedOperand& Src2Op);\n\n  Ref CVTFPR_To_GPRImpl(OpcodeArgs, Ref Src, IR::OpSize SrcElementSize, bool HostRoundingMode);\n\n  Ref Vector_CVT_Float_To_Int32Impl(OpcodeArgs, IR::OpSize DstSize, Ref Src, IR::OpSize SrcSize, IR::OpSize SrcElementSize,\n                                    bool HostRoundingMode, bool ZeroUpperHalf);\n\n  Ref Vector_CVT_Int_To_FloatImpl(OpcodeArgs, IR::OpSize SrcElementSize, bool Widen);\n\n  void XSaveOpImpl(OpcodeArgs);\n  void SaveX87State(OpcodeArgs, Ref MemBase);\n  void SaveSSEState(Ref MemBase);\n  void SaveMXCSRState(Ref MemBase);\n  void SaveAVXState(Ref MemBase);\n\n  void XRstorOpImpl(OpcodeArgs);\n  void RestoreX87State(Ref MemBase);\n  void RestoreSSEState(Ref MemBase);\n  void RestoreMXCSRState(Ref MXCSR);\n  void RestoreAVXState(Ref MemBase);\n  void DefaultX87State(OpcodeArgs);\n  void DefaultSSEState();\n  void DefaultAVXState();\n\n  Ref GetMXCSR();\n\n#undef OpcodeArgs\n\n  Ref AppendSegmentOffset(Ref Value, uint32_t Flags, uint32_t DefaultPrefix = 0, bool Override = false);\n  Ref GetSegment(uint32_t Flags, uint32_t DefaultPrefix = FEXCore::X86Tables::DecodeFlags::FLAG_NO_PREFIX, bool Override = false);\n\n  void UpdatePrefixFromSegment(Ref Segment, uint32_t SegmentReg);\n\n  Ref LoadGPRRegister(uint32_t GPR, IR::OpSize Size = OpSize::iInvalid, uint8_t Offset = 0, bool AllowUpperGarbage = false);\n  void StoreGPRRegister(uint32_t GPR, const Ref Src, IR::OpSize Size = OpSize::iInvalid, uint8_t Offset = 0);\n  void StoreXMMRegister(uint32_t XMM, const Ref Src);\n\n  Ref _GetRelocatedPC(const FEXCore::X86Tables::DecodedOp& Op, int64_t Offset, bool Inline) {\n    const auto GPRSize = GetGPROpSize();\n    const auto Offs = Op->PC + Op->InstSize + Offset - Entry;\n    return Inline ? _InlineEntrypointOffset(GPRSize, Offs) : _EntrypointOffset(GPRSize, Offs);\n  }\n\n  Ref GetRelocatedPC(const FEXCore::X86Tables::DecodedOp& Op, int64_t Offset = 0) {\n    return _GetRelocatedPC(Op, Offset, false);\n  }\n\n  void ExitRelocatedPC(const FEXCore::X86Tables::DecodedOp& Op, int64_t Offset = 0) {\n    ExitFunction(_GetRelocatedPC(Op, Offset, true /* Inline */));\n  }\n\n  void ExitRelocatedPC(const FEXCore::X86Tables::DecodedOp& Op, int64_t Offset, BranchHint Hint, Ref CallReturnAddress, Ref CallReturnBlock) {\n    ExitFunction(_GetRelocatedPC(Op, Offset, true /* Inline */), Hint, CallReturnAddress, CallReturnBlock);\n  }\n\n  [[nodiscard]]\n  static bool IsOperandMem(const X86Tables::DecodedOperand& Operand, bool Load) {\n    // Literals are immediates as sources but memory addresses as destinations.\n    return !(Load && (Operand.IsLiteral() || Operand.IsLiteralRelocation())) && !Operand.IsGPR();\n  }\n\n  [[nodiscard]]\n  static bool IsNonTSOReg(MemoryAccessType Access, uint8_t Reg) {\n    return Access == MemoryAccessType::DEFAULT && Reg == X86State::REG_RSP;\n  }\n\n  AddressMode DecodeAddress(const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand, MemoryAccessType AccessType, bool IsLoad);\n\n  Ref LoadSource(RegClass Class, const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand, uint32_t Flags,\n                 const LoadSourceOptions& Options = {});\n  Ref LoadSourceGPR(const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand, uint32_t Flags,\n                    const LoadSourceOptions& Options = {}) {\n    return LoadSource(RegClass::GPR, Op, Operand, Flags, Options);\n  }\n  Ref LoadSourceFPR(const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand, uint32_t Flags,\n                    const LoadSourceOptions& Options = {}) {\n    return LoadSource(RegClass::FPR, Op, Operand, Flags, Options);\n  }\n\n  Ref LoadSource_WithOpSize(RegClass Class, const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand, IR::OpSize OpSize,\n                            uint32_t Flags, const LoadSourceOptions& Options = {});\n  Ref LoadSourceGPR_WithOpSize(const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand, IR::OpSize OpSize, uint32_t Flags,\n                               const LoadSourceOptions& Options = {}) {\n    return LoadSource_WithOpSize(RegClass::GPR, Op, Operand, OpSize, Flags, Options);\n  }\n  Ref LoadSourceFPR_WithOpSize(const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand, IR::OpSize OpSize, uint32_t Flags,\n                               const LoadSourceOptions& Options = {}) {\n    return LoadSource_WithOpSize(RegClass::FPR, Op, Operand, OpSize, Flags, Options);\n  }\n\n  void StoreResult_WithOpSize(RegClass Class, X86Tables::DecodedOp Op, const X86Tables::DecodedOperand& Operand, Ref Src, IR::OpSize OpSize,\n                              IR::OpSize Align, MemoryAccessType AccessType = MemoryAccessType::DEFAULT);\n  void StoreResultGPR_WithOpSize(X86Tables::DecodedOp Op, const X86Tables::DecodedOperand& Operand, Ref Src, IR::OpSize OpSize,\n                                 IR::OpSize Align = IR::OpSize::iInvalid, MemoryAccessType AccessType = MemoryAccessType::DEFAULT) {\n    StoreResult_WithOpSize(RegClass::GPR, Op, Operand, Src, OpSize, Align, AccessType);\n  }\n  void StoreResultFPR_WithOpSize(X86Tables::DecodedOp Op, const X86Tables::DecodedOperand& Operand, Ref Src, IR::OpSize OpSize,\n                                 IR::OpSize Align = IR::OpSize::iInvalid, MemoryAccessType AccessType = MemoryAccessType::DEFAULT) {\n    StoreResult_WithOpSize(RegClass::FPR, Op, Operand, Src, OpSize, Align, AccessType);\n  }\n\n  void StoreResult(RegClass Class, X86Tables::DecodedOp Op, const X86Tables::DecodedOperand& Operand, Ref Src, OpSize Align,\n                   MemoryAccessType AccessType = MemoryAccessType::DEFAULT);\n  void StoreResultGPR(X86Tables::DecodedOp Op, const X86Tables::DecodedOperand& Operand, Ref Src, OpSize Align = OpSize::iInvalid,\n                      MemoryAccessType AccessType = MemoryAccessType::DEFAULT) {\n    StoreResult(RegClass::GPR, Op, Operand, Src, Align, AccessType);\n  }\n  void StoreResultFPR(X86Tables::DecodedOp Op, const X86Tables::DecodedOperand& Operand, Ref Src, OpSize Align = OpSize::iInvalid,\n                      MemoryAccessType AccessType = MemoryAccessType::DEFAULT) {\n    StoreResult(RegClass::FPR, Op, Operand, Src, Align, AccessType);\n  }\n\n  void StoreResult(RegClass Class, X86Tables::DecodedOp Op, Ref Src, OpSize Align, MemoryAccessType AccessType = MemoryAccessType::DEFAULT);\n  void StoreResultGPR(X86Tables::DecodedOp Op, Ref Src, OpSize Align = OpSize::iInvalid, MemoryAccessType AccessType = MemoryAccessType::DEFAULT) {\n    StoreResult(RegClass::GPR, Op, Src, Align, AccessType);\n  }\n  void StoreResultFPR(X86Tables::DecodedOp Op, Ref Src, OpSize Align = OpSize::iInvalid, MemoryAccessType AccessType = MemoryAccessType::DEFAULT) {\n    StoreResult(RegClass::FPR, Op, Src, Align, AccessType);\n  }\n\n  // In several instances, it's desirable to get a base address with the segment offset\n  // applied to it. This pulls all the common-case appending into a single set of functions.\n  [[nodiscard]]\n  Ref MakeSegmentAddress(const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand, IR::OpSize OpSize) {\n    Ref Mem = LoadSourceGPR_WithOpSize(Op, Operand, OpSize, Op->Flags, {.LoadData = false});\n    return AppendSegmentOffset(Mem, Op->Flags);\n  }\n  [[nodiscard]]\n  Ref MakeSegmentAddress(const X86Tables::DecodedOp& Op, const X86Tables::DecodedOperand& Operand) {\n    return MakeSegmentAddress(Op, Operand, OpSizeFromSrc(Op));\n  }\n  [[nodiscard]]\n  Ref MakeSegmentAddress(X86State::X86Reg Reg, uint32_t Flags, uint32_t DefaultPrefix = 0, bool Override = false) {\n    Ref Address = LoadGPRRegister(Reg);\n    return AppendSegmentOffset(Address, Flags, DefaultPrefix, Override);\n  }\n\n  constexpr OpSize GetGuestVectorLength() const {\n    return (CTX->HostFeatures.SupportsSVE256 && CTX->HostFeatures.SupportsAVX) ? OpSize::i256Bit : OpSize::i128Bit;\n  }\n\n  [[nodiscard]]\n  static uint32_t GPROffset(X86State::X86Reg reg) {\n    LOGMAN_THROW_A_FMT(reg <= X86State::X86Reg::REG_R15, \"Invalid reg used\");\n    return static_cast<uint32_t>(ARRAY_OFFSETOF(Core::CPUState, gregs, reg));\n  }\n\n  [[nodiscard]]\n  static uint32_t MMBaseOffset() {\n    return static_cast<uint32_t>(offsetof(Core::CPUState, mm[0][0]));\n  }\n\n  [[nodiscard]]\n  uint8_t GetDstSize(X86Tables::DecodedOp Op) const;\n  [[nodiscard]]\n  uint8_t GetSrcSize(X86Tables::DecodedOp Op) const;\n  [[nodiscard]]\n  uint32_t GetDstBitSize(X86Tables::DecodedOp Op) const;\n  [[nodiscard]]\n  uint32_t GetSrcBitSize(X86Tables::DecodedOp Op) const;\n  [[nodiscard]]\n  IR::OpSize OpSizeFromDst(X86Tables::DecodedOp Op) const {\n    return IR::SizeToOpSize(GetDstSize(Op));\n  }\n  [[nodiscard]]\n  IR::OpSize OpSizeFromSrc(X86Tables::DecodedOp Op) const {\n    return IR::SizeToOpSize(GetSrcSize(Op));\n  }\n\n  [[nodiscard]]\n  IR::OpSize GetStringOpSize(X86Tables::DecodedOp Op) const;\n\n  // Set flag tracking to prepare for an operation that directly writes NZCV.\n  void HandleNZCVWrite() {\n    CachedNZCV = nullptr;\n    NZCVDirty = false;\n  }\n\n  // Set flag tracking to prepare for a read-modify-write operation on NZCV.\n  void HandleNZCV_RMW() {\n    CalculateDeferredFlags();\n\n    if (NZCVDirty && CachedNZCV) {\n      _StoreNZCV(CachedNZCV);\n    }\n\n    HandleNZCVWrite();\n  }\n\n  // Special case of the above where we are known to zero C/V\n  void HandleNZ00Write() {\n    HandleNZCVWrite();\n\n    // Host carry will be implicitly zeroed, and we want guest carry zeroed as\n    // well. So do not invert.\n    CFInverted = false;\n  }\n\n  Ref GetNZCV() {\n    if (!CachedNZCV) {\n      CachedNZCV = _LoadNZCV();\n    }\n\n    return CachedNZCV;\n  }\n\n  void SetNZCV(Ref Value) {\n    CachedNZCV = Value;\n    NZCVDirty = true;\n  }\n\n  void ZeroNZCV() {\n    CachedNZCV = Constant(0);\n    NZCVDirty = true;\n  }\n\n  void SetNZ_ZeroCV(IR::OpSize SrcSize, Ref Res, bool SetPF = false) {\n    HandleNZ00Write();\n\n    // x - 0 = x. NZ set according to Res. C always set. V always unset. This\n    // matches what we want since we want carry inverted.\n    //\n    // This is currently worse for 8/16-bit, but that should be optimized. TODO\n    if (SrcSize >= OpSize::i32Bit) {\n      if (SetPF) {\n        CalculatePF(SubWithFlags(SrcSize, Res, (uint64_t)0));\n      } else {\n        _SubNZCV(SrcSize, Res, Constant(0));\n      }\n\n      CFInverted = true;\n    } else {\n      _TestNZ(SrcSize, Res, Res);\n      CFInverted = false;\n\n      if (SetPF) {\n        CalculatePF(Res);\n      }\n    }\n  }\n\n  void SetNZP_ZeroCV(IR::OpSize SrcSize, Ref Res) {\n    SetNZ_ZeroCV(SrcSize, Res, true);\n  }\n\n  void InsertNZCV(unsigned BitOffset, Ref Value, signed FlagOffset, bool MustMask) {\n    signed Bit = IndexNZCV(BitOffset);\n\n    // Heuristic to choose rmif vs msr.\n    bool PreferRmif = !NZCVDirty || FlagOffset || MustMask;\n\n    if (CTX->HostFeatures.SupportsFlagM && PreferRmif) {\n      // Update NZCV\n      if (NZCVDirty && CachedNZCV) {\n        _StoreNZCV(CachedNZCV);\n      }\n\n      CachedNZCV = nullptr;\n      NZCVDirty = false;\n\n      // Insert as NZCV.\n      signed RmifBit = Bit - 28;\n      _RmifNZCV(Value, (64 + FlagOffset - RmifBit) % 64, 1u << RmifBit);\n      CachedNZCV = nullptr;\n    } else {\n      // Insert as GPR\n      if (FlagOffset || MustMask) {\n        Value = _Bfe(OpSize::i64Bit, 1, FlagOffset, Value);\n      }\n\n      SetNZCV(_Bfi(OpSize::i32Bit, 1, Bit, GetNZCV(), Value));\n    }\n  }\n\n  // If we don't care about N/C/V and just need Z, we can test with a simple\n  // mask without any shifting.\n  void SetZ_InvalidateNCV(IR::OpSize Size, Ref Src) {\n    HandleNZCVWrite();\n    CFInverted = true;\n\n    if (Size < OpSize::i32Bit) {\n      _TestNZ(OpSize::i32Bit, Src, _InlineConstant((1u << (IR::OpSizeAsBits(Size))) - 1));\n    } else {\n      _TestNZ(Size, Src, Src);\n    }\n  }\n\n  // Ensure the carry invert flag matches the desired form. Used before an\n  // operation reading carry or at the end of a block.\n  void RectifyCarryInvert(bool RequiredInvert) {\n    if (CFInverted != RequiredInvert) {\n      if (CTX->HostFeatures.SupportsFlagM && !NZCVDirty) {\n        // Invert as NZCV.\n        _CarryInvert();\n        CachedNZCV = nullptr;\n      } else {\n        // Invert as a GPR\n        unsigned Bit = IndexNZCV(FEXCore::X86State::RFLAG_CF_RAW_LOC);\n        SetNZCV(_Xor(OpSize::i32Bit, GetNZCV(), Constant(1u << Bit)));\n        CalculateDeferredFlags();\n      }\n\n      CFInverted ^= true;\n    }\n\n    LOGMAN_THROW_A_FMT(CFInverted == RequiredInvert, \"post condition\");\n  }\n\n  void CarryInvert() {\n    CFInverted ^= true;\n  }\n\n  template<unsigned BitOffset>\n  void SetRFLAG(Ref Value, unsigned ValueOffset = 0, bool MustMask = false) {\n    SetRFLAG(Value, BitOffset, ValueOffset, MustMask);\n  }\n\n  void SetCFDirect(Ref Value, unsigned ValueOffset = 0, bool MustMask = false) {\n    Value = _Xor(OpSize::i64Bit, Value, _InlineConstant(1ull << ValueOffset));\n    SetRFLAG(Value, X86State::RFLAG_CF_RAW_LOC, ValueOffset, MustMask);\n    CFInverted = true;\n  }\n\n  // Set CF directly to the given 0/1 value. This needs to respect the\n  // invert. We use a subtraction:\n  //\n  //     0 - x = 0 + (~x) + 1.\n  //\n  // If x = 0, then 0 + (~0) + 1 = 0x100000000 so hardware C is set.\n  // If x = 1, then 0 + (~1) + 1 = 0x0ffffffff so hardware C is not set.\n  void SetCFDirect_InvalidateNZV(Ref Value, unsigned ValueOffset = 0, bool MustMask = false) {\n    if (ValueOffset || MustMask) {\n      Value = _Bfe(OpSize::i64Bit, 1, ValueOffset, Value);\n    }\n\n    HandleNZCVWrite();\n    _SubNZCV(OpSize::i32Bit, Constant(0), Value);\n    CFInverted = true;\n  }\n\n  void SetCFInverted(Ref Value, unsigned ValueOffset = 0, bool MustMask = false) {\n    SetRFLAG(Value, X86State::RFLAG_CF_RAW_LOC, ValueOffset, MustMask);\n    CFInverted = true;\n  }\n\n  void SetRFLAG(Ref Value, unsigned BitOffset, unsigned ValueOffset = 0, bool MustMask = false) {\n    if (IsNZCV(BitOffset)) {\n      InsertNZCV(BitOffset, Value, ValueOffset, MustMask);\n      return;\n    }\n\n    if (ValueOffset || MustMask) {\n      Value = _Bfe(OpSize::i32Bit, 1, ValueOffset, Value);\n    }\n\n    if (BitOffset == FEXCore::X86State::RFLAG_PF_RAW_LOC) {\n      StoreRegister(Core::CPUState::PF_AS_GREG, false, Value);\n    } else if (BitOffset == FEXCore::X86State::RFLAG_AF_RAW_LOC) {\n      StoreRegister(Core::CPUState::AF_AS_GREG, false, Value);\n    } else if (BitOffset == FEXCore::X86State::RFLAG_DF_RAW_LOC) {\n      // For DF, we need to transform 0/1 into 1/-1\n      StoreDF(_SubShift(OpSize::i64Bit, Constant(1), Value, ShiftType::LSL, 1));\n    } else if (BitOffset == FEXCore::X86State::RFLAG_TF_RAW_LOC) {\n      auto PackedTF = _LoadContextGPR(OpSize::i8Bit, ARRAY_OFFSETOF(FEXCore::Core::CPUState, flags, BitOffset));\n      // An exception should still be raised after an instruction that unsets TF, leave the unblocked bit set but unset\n      // the TF bit to cause such behaviour. The handling code at the start of the next block will then unset the\n      // unblocked bit before raising the exception.\n      auto NewPackedTF =\n        _Select(OpSize::i64Bit, OpSize::i64Bit, CondClass::EQ, Value, Constant(0), _And(OpSize::i32Bit, PackedTF, Constant(~1)), Constant(1));\n      _StoreContextGPR(OpSize::i8Bit, NewPackedTF, ARRAY_OFFSETOF(FEXCore::Core::CPUState, flags, BitOffset));\n    } else {\n      _StoreContextGPR(OpSize::i8Bit, Value, ARRAY_OFFSETOF(FEXCore::Core::CPUState, flags, BitOffset));\n    }\n  }\n\n  void SetAF(unsigned K) {\n    // AF is stored in bit 4 of the AF flag byte, with garbage in the other\n    // bits. This allows us to defer the extract in the usual case. When it is\n    // read, bit 4 is extracted.  In order to write a constant value of AF, that\n    // means we need to left-shift here to compensate.\n    SetRFLAG<FEXCore::X86State::RFLAG_AF_RAW_LOC>(Constant(K << 4));\n  }\n\n  void ZeroPF_AF();\n\n  void InvalidateAF() {\n    _InvalidateFlags((1u << X86State::RFLAG_AF_RAW_LOC));\n    InvalidateReg(Core::CPUState::AF_AS_GREG);\n  }\n\n  void InvalidatePF_AF() {\n    _InvalidateFlags((1u << X86State::RFLAG_PF_RAW_LOC) | (1u << X86State::RFLAG_AF_RAW_LOC));\n    InvalidateReg(Core::CPUState::PF_AS_GREG);\n    InvalidateReg(Core::CPUState::AF_AS_GREG);\n  }\n\n  [[nodiscard]]\n  static CondClass CondForNZCVBit(unsigned BitOffset, bool Invert) {\n    switch (BitOffset) {\n    case X86State::RFLAG_SF_RAW_LOC: return Invert ? CondClass::PL : CondClass::MI;\n    case X86State::RFLAG_ZF_RAW_LOC: return Invert ? CondClass::NEQ : CondClass::EQ;\n    case X86State::RFLAG_CF_RAW_LOC: return Invert ? CondClass::ULT : CondClass::UGE;\n    case X86State::RFLAG_OF_RAW_LOC: return Invert ? CondClass::FNU : CondClass::FU;\n    default: FEX_UNREACHABLE;\n    }\n  }\n\n  /* Layout of cache indices. We use a single 64-bit bitmask for the cache */\n  static const int GPR0Index = 0;\n  static const int GPR15Index = 15;\n  static const int PFIndex = 16;\n  static const int AFIndex = 17;\n  /* Gap 18..19 */\n  /* Note this range is only valid if MMXState = MMXState_MMX */\n  static const int MM0Index = 20;\n  static const int MM7Index = 27;\n  /* Gap 28..30 */\n  static const int DFIndex = 31;\n  static const int FPR0Index = 32;\n  static const int FPR15Index = 47;\n  static const int AVXHigh0Index = 48;\n  static const int AVXHigh15Index = 63;\n\n  [[nodiscard]]\n  static uint32_t CacheIndexToContextOffset(int Index) {\n    switch (Index) {\n    case MM0Index ... MM7Index: return ARRAY_OFFSETOF(FEXCore::Core::CPUState, mm, Index - MM0Index);\n    case AVXHigh0Index ... AVXHigh15Index: return ARRAY_OFFSETOF(FEXCore::Core::CPUState, avx_high, Index - AVXHigh0Index);\n    default: return ~0U;\n    }\n  }\n\n  [[nodiscard]]\n  static RegClass CacheIndexClass(int Index) {\n    if ((Index >= MM0Index && Index <= MM7Index) || Index >= FPR0Index) {\n      return RegClass::FPR;\n    } else {\n      return RegClass::GPR;\n    }\n  }\n\n  [[nodiscard]]\n  static IR::OpSize CacheIndexToOpSize(int Index) {\n    // MMX registers are rounded up to 128-bit since they are shared with 80-bit\n    // x87 registers, even though MMX is logically only 64-bit.\n    if (Index >= AVXHigh0Index || ((Index >= MM0Index && Index <= MM7Index))) {\n      return OpSize::i128Bit;\n    } else {\n      return OpSize::i8Bit;\n    }\n  }\n\n  struct {\n    uint64_t Cached;\n    uint64_t Written;\n\n    // Indicates that Value contains only the lower 64-bit of the full 80-bit\n    // register. Used for MMX/x87 optimization.\n    uint64_t Partial;\n\n    Ref Value[64];\n  } RegCache {};\n\n  void InvalidateReg(uint8_t Index) {\n    uint64_t Bit = (1ull << (uint64_t)Index);\n    RegCache.Cached &= ~Bit;\n    RegCache.Written &= ~Bit;\n  }\n\n  Ref LoadRegCache(uint64_t Offset, uint8_t Index, RegClass Class, IR::OpSize Size) {\n    LOGMAN_THROW_A_FMT(Index < 64, \"valid index\");\n    uint64_t Bit = (1ull << (uint64_t)Index);\n\n    if (Size == OpSize::i128Bit && (RegCache.Partial & Bit)) {\n      // We need to load the full register extend if we previously did a partial access.\n      Ref Value = RegCache.Value[Index];\n      Ref Full = _LoadContext(Size, Class, Offset);\n\n      // If we did a partial store, we're inserting into the full register\n      if (RegCache.Written & Bit) {\n        Full = _VInsElement(OpSize::i128Bit, OpSize::i64Bit, 0, 0, Full, Value);\n      }\n\n      RegCache.Value[Index] = Full;\n    }\n\n    if (!(RegCache.Cached & Bit)) {\n      if (Index == DFIndex) {\n        RegCache.Value[Index] = _LoadDF();\n      } else if ((Index >= MM0Index && Index <= MM7Index) || Index >= AVXHigh0Index) {\n        RegCache.Value[Index] = _LoadContext(Size, Class, Offset);\n\n        // We may have done a partial load, this requires special handling.\n        if (Size == OpSize::i64Bit) {\n          RegCache.Partial |= Bit;\n        }\n      } else if (Index == PFIndex) {\n        RegCache.Value[Index] = _LoadPF(Size);\n      } else if (Index == AFIndex) {\n        RegCache.Value[Index] = _LoadAF(Size);\n      } else {\n        RegCache.Value[Index] = _LoadRegister(Offset, Class, Size);\n      }\n\n      RegCache.Cached |= Bit;\n    }\n\n    return RegCache.Value[Index];\n  }\n\n  RefPair AllocatePair(RegClass Class, IR::OpSize Size) {\n    if (Class == RegClass::FPR) {\n      return {_AllocateFPR(Size, Size), _AllocateFPR(Size, Size)};\n    } else {\n      return {_AllocateGPR(false), _AllocateGPR(false)};\n    }\n  }\n\n  RefPair LoadContextPair_Uncached(RegClass Class, IR::OpSize Size, unsigned Offset) {\n    RefPair Values = AllocatePair(Class, Size);\n    _LoadContextPair(Size, Class, Offset, Values.Low, Values.High);\n    return Values;\n  }\n\n  RefPair LoadRegCachePair(uint64_t Offset, uint8_t Index, RegClass Class, IR::OpSize Size) {\n    LOGMAN_THROW_A_FMT(Index != DFIndex, \"must be pairable\");\n    LOGMAN_THROW_A_FMT(Size != IR::OpSize::iUnsized, \"Invalid size!\");\n\n    // Try to load a pair into the cache\n    uint64_t Bits = (3ull << (uint64_t)Index);\n    const auto SizeInt = IR::OpSizeToSize(Size);\n    if (((RegCache.Partial | RegCache.Cached) & Bits) == 0 && ((Offset / SizeInt) < 64)) {\n      auto Values = LoadContextPair_Uncached(Class, Size, Offset);\n      RegCache.Value[Index] = Values.Low;\n      RegCache.Value[Index + 1] = Values.High;\n      RegCache.Cached |= Bits;\n      if (Size == OpSize::i64Bit) {\n        RegCache.Partial |= Bits;\n      }\n      return Values;\n    }\n\n    // Fallback on a pair of loads\n    return {\n      .Low = LoadRegCache(Offset, Index, Class, Size),\n      .High = LoadRegCache(Offset + SizeInt, Index + 1, Class, Size),\n    };\n  }\n\n  Ref LoadGPR(uint8_t Reg) {\n    return LoadRegCache(Reg, GPR0Index + Reg, RegClass::GPR, GetGPROpSize());\n  }\n\n  Ref LoadContext(IR::OpSize Size, uint8_t Index) {\n    return LoadRegCache(CacheIndexToContextOffset(Index), Index, CacheIndexClass(Index), Size);\n  }\n\n  RefPair LoadContextPair(IR::OpSize Size, uint8_t Index) {\n    return LoadRegCachePair(CacheIndexToContextOffset(Index), Index, CacheIndexClass(Index), Size);\n  }\n\n  Ref LoadContext(uint8_t Index) {\n    return LoadContext(CacheIndexToOpSize(Index), Index);\n  }\n\n  Ref LoadXMMRegister(uint8_t Reg) {\n    return LoadRegCache(Reg, FPR0Index + Reg, RegClass::FPR, GetGuestVectorLength());\n  }\n\n  Ref LoadDF() {\n    return LoadGPR(DFIndex);\n  }\n\n  void StoreContext(uint8_t Index, Ref Value) {\n    LOGMAN_THROW_A_FMT(Index < 64, \"valid index\");\n    LOGMAN_THROW_A_FMT(Value != InvalidNode, \"storing valid\");\n\n    uint64_t Bit = (1ull << (uint64_t)Index);\n\n    RegCache.Value[Index] = Value;\n    RegCache.Cached |= Bit;\n    RegCache.Written |= Bit;\n  }\n\n  void InvalidateHighAVXRegisters() {\n    for (size_t i = 0; i < 16; ++i) {\n      InvalidateReg(AVXHigh0Index + i);\n    }\n  }\n\n  void StoreRegister(uint8_t Reg, bool FPR, Ref Value) {\n    StoreContext(Reg + (FPR ? FPR0Index : GPR0Index), Value);\n  }\n\n  void StoreDF(Ref Value) {\n    StoreContext(DFIndex, Value);\n  }\n\n  Ref GetRFLAG(unsigned BitOffset, bool Invert = false) {\n    if (IsNZCV(BitOffset)) {\n      // Handle the CFInverted state internally so GetRFLAG is safe regardless\n      // of the invert state. This simplifies the call sites.\n      if (BitOffset == X86State::RFLAG_CF_RAW_LOC) {\n        Invert ^= CFInverted;\n      }\n\n      if (NZCVDirty) {\n        auto Value = _Bfe(OpSize::i32Bit, 1, IndexNZCV(BitOffset), GetNZCV());\n\n        if (Invert) {\n          return _Xor(OpSize::i32Bit, Value, Constant(1));\n        } else {\n          return Value;\n        }\n      } else {\n        // Because we explicitly inverted for CF above, we use the unsafe\n        // _NZCVSelect rather than the safe CF-aware version.\n        return _NZCVSelect01(CondForNZCVBit(BitOffset, Invert));\n      }\n    } else if (BitOffset == FEXCore::X86State::RFLAG_PF_RAW_LOC) {\n      return LoadGPR(Core::CPUState::PF_AS_GREG);\n    } else if (BitOffset == FEXCore::X86State::RFLAG_AF_RAW_LOC) {\n      return LoadGPR(Core::CPUState::AF_AS_GREG);\n    } else if (BitOffset == FEXCore::X86State::RFLAG_DF_RAW_LOC) {\n      // Recover the sign bit, it is the logical DF value\n      return _Lshr(OpSize::i64Bit, LoadDF(), Constant(63));\n    } else {\n      return _LoadContextGPR(OpSize::i8Bit, ARRAY_OFFSETOF(Core::CPUState, flags, BitOffset));\n    }\n  }\n\n  // Returns (DF ? -Size : Size)\n  Ref LoadDir(const unsigned Size) {\n    return ARef(LoadDF()).Lshl(FEXCore::ilog2(Size)).Ref();\n  }\n\n  // Returns DF ? (X - Size) : (X + Size)\n  Ref OffsetByDir(Ref X, const unsigned Size) {\n    auto Shift = FEXCore::ilog2(Size);\n\n    return _AddShift(OpSize::i64Bit, X, LoadDF(), ShiftType::LSL, Shift);\n  }\n\n  // Safe version of NZCVSelect that handles inverted carries automatically.\n  Ref NZCVSelect(OpSize OpSize, CondClass Cond, Ref TrueV, Ref FalseV, bool CarryIsInverted = false) {\n    switch (Cond) {\n    case CondClass::UGE: /* cs */\n    case CondClass::ULT: /* cc */\n      // Invert the condition to match our expectations.\n      if (CarryIsInverted != CFInverted) {\n        Cond = (Cond == CondClass::UGE) ? CondClass::ULT : CondClass::UGE;\n      }\n      break;\n\n    case CondClass::UGT: /* hi */\n    case CondClass::ULE: /* ls */\n      // No clever optimization we can do here, rectify carry itself.\n      RectifyCarryInvert(CarryIsInverted);\n      break;\n\n    default:\n      // No other condition codes read carry so no need to rectify.\n      break;\n    }\n\n    return _NZCVSelect(OpSize, Cond, TrueV, FalseV);\n  }\n\n  // Compares two floats and sets flags for a COMISS instruction\n  void Comiss(IR::OpSize ElementSize, Ref Src1, Ref Src2, bool InvalidateAF = false) {\n    // First, set flags according to Arm FCMP.\n    HandleNZCVWrite();\n    _FCmp(ElementSize, Src1, Src2);\n    CFInverted = false;\n    ComissFlags(InvalidateAF);\n  }\n\n  // Sets flags for a COMISS instruction\n  void ComissFlags(bool InvalidateAF = false) {\n    LOGMAN_THROW_A_FMT(!NZCVDirty, \"only expected after fcmp\");\n\n    // We need to set PF according to the unordered flag. We'd rather do this\n    // after axflag, since some impls fuse fcmp+axflag, so we want to do this\n    // after. We can recover \"unordered\" after axflag as (Z && !C), but\n    // there's no condition code for this so it would take 2 instructions\n    // instead of one, which seems worse than doing 1 op before and breaking\n    // the fusion.\n    //\n    // We set PF to unordered (V), but our PF representation is inverted so we\n    // actually set to !V. This is one instruction with the VC cond code.\n    Ref V_inv = GetRFLAG(FEXCore::X86State::RFLAG_OF_RAW_LOC, true);\n    SetRFLAG<FEXCore::X86State::RFLAG_PF_RAW_LOC>(V_inv);\n\n    if (!InvalidateAF) {\n      // Zero AF. Note that the comparison sets the raw PF to 0/1 above, so\n      // PF[4] is 0 so the XOR with PF will have no effect, so setting the AF\n      // byte to zero will indeed zero AF as intended.\n      SetRFLAG<FEXCore::X86State::RFLAG_AF_RAW_LOC>(Constant(0));\n    }\n\n    // Convert NZCV from the Arm representation to an eXternal representation\n    // that's totally not a euphemism for x86, nuh-uh. But maps to exactly we\n    // need, what a coincidence!\n    //\n    // Our AXFlag emulation on FlagM2-less systems needs V_inv passed.\n    _AXFlag(CTX->HostFeatures.SupportsFlagM2 ? Invalid() : V_inv);\n    CFInverted = true;\n  }\n\n  // Set x87 comparison flags based on the result set by Arm FCMP. Clobbers\n  // NZCV on flagm2 platforms.\n  void ConvertNZCVToX87() {\n    LOGMAN_THROW_A_FMT(NZCVDirty && CachedNZCV, \"NZCV must be saved\");\n\n    Ref V = _NZCVSelect01(CondForNZCVBit(FEXCore::X86State::RFLAG_OF_RAW_LOC, false));\n\n    if (CTX->HostFeatures.SupportsFlagM2) {\n      // Convert to x86 flags, saves us from or'ing after.\n      _AXFlag(Invalid());\n    }\n\n    // CF is inverted after FCMP\n    Ref C = _NZCVSelect01(CondForNZCVBit(FEXCore::X86State::RFLAG_CF_RAW_LOC, true));\n    Ref Z = _NZCVSelect01(CondForNZCVBit(FEXCore::X86State::RFLAG_ZF_RAW_LOC, false));\n\n    if (!CTX->HostFeatures.SupportsFlagM2) {\n      C = _Or(OpSize::i32Bit, C, V);\n      Z = _Or(OpSize::i32Bit, Z, V);\n    }\n\n    SetRFLAG<FEXCore::X86State::X87FLAG_C0_LOC>(C);\n    SetRFLAG<FEXCore::X86State::X87FLAG_C1_LOC>(Constant(0));\n    SetRFLAG<FEXCore::X86State::X87FLAG_C2_LOC>(V);\n    SetRFLAG<FEXCore::X86State::X87FLAG_C3_LOC>(Z);\n  }\n\n  // Helper to store a variable shift and calculate its flags for a variable\n  // shift, with correct PF handling.\n  void HandleShift(X86Tables::DecodedOp Op, Ref Result, Ref Dest, ShiftType Shift, Ref Src) {\n\n    auto OldPF = GetRFLAG(X86State::RFLAG_PF_RAW_LOC);\n\n    HandleNZCV_RMW();\n    CalculatePF(_ShiftFlags(OpSizeFromSrc(Op), Result, Dest, Shift, Src, OldPF, CFInverted));\n    StoreResultGPR(Op, Result);\n  }\n\n  // Helper to derive Dest by a given builder-using Expression with the opcode\n  // replaced with NewOp. Useful for generic building code. Not safe in general.\n  // but does the right handling of ImplicitFlagClobber at least and must be\n  // used instead of raw Op mutation.\n#define DeriveOp(Dest, NewOp, Expr)                \\\n  if (ImplicitFlagClobber(NewOp)) SaveNZCV(NewOp); \\\n  auto Dest = (Expr);                              \\\n  Dest.first->Header.Op = (NewOp)\n\n  // Named constant cache for the current block.\n  // Different arrays for sizes 1,2,4,8,16,32.\n  Ref CachedNamedVectorConstants[FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_MAX][6] {};\n  struct IndexNamedVectorMapKey {\n    uint32_t Index {};\n    FEXCore::IR::IndexNamedVectorConstant NamedIndexedConstant;\n    uint8_t log2_size_in_bytes {};\n    uint16_t _pad {};\n\n    bool operator==(const IndexNamedVectorMapKey&) const = default;\n  };\n  struct IndexNamedVectorMapKeyHasher {\n    std::size_t operator()(const IndexNamedVectorMapKey& k) const noexcept {\n      return XXH3_64bits(&k, sizeof(k));\n    }\n  };\n  fextl::unordered_map<IndexNamedVectorMapKey, Ref, IndexNamedVectorMapKeyHasher> CachedIndexedNamedVectorConstants;\n\n  // Load and cache a named vector constant.\n  Ref LoadAndCacheNamedVectorConstant(IR::OpSize Size, FEXCore::IR::NamedVectorConstant NamedConstant) {\n    auto log2_size_bytes = FEXCore::ilog2(IR::OpSizeToSize(Size));\n    if (CachedNamedVectorConstants[NamedConstant][log2_size_bytes]) {\n      return CachedNamedVectorConstants[NamedConstant][log2_size_bytes];\n    }\n\n    auto K = _LoadNamedVectorConstant(Size, NamedConstant);\n    CachedNamedVectorConstants[NamedConstant][log2_size_bytes] = K;\n    return K;\n  }\n  Ref LoadAndCacheIndexedNamedVectorConstant(IR::OpSize Size, FEXCore::IR::IndexNamedVectorConstant NamedIndexedConstant, uint32_t Index) {\n    IndexNamedVectorMapKey Key {\n      .Index = Index,\n      .NamedIndexedConstant = NamedIndexedConstant,\n      .log2_size_in_bytes = FEXCore::ilog2(IR::OpSizeToSize(Size)),\n    };\n    auto it = CachedIndexedNamedVectorConstants.find(Key);\n\n    if (it != CachedIndexedNamedVectorConstants.end()) {\n      return it->second;\n    }\n\n    auto K = _LoadNamedVectorIndexedConstant(Size, NamedIndexedConstant, Index);\n    CachedIndexedNamedVectorConstants.insert_or_assign(Key, K);\n    return K;\n  }\n\n  Ref LoadUncachedZeroVector(IR::OpSize Size) {\n    return _LoadNamedVectorConstant(Size, IR::NamedVectorConstant::NAMED_VECTOR_ZERO);\n  }\n\n  Ref LoadZeroVector(IR::OpSize Size) {\n    return LoadAndCacheNamedVectorConstant(Size, IR::NamedVectorConstant::NAMED_VECTOR_ZERO);\n  }\n\n  // Reset the named vector constants cache array.\n  // These are only cached per block.\n  void ClearCachedNamedConstants() {\n    memset(CachedNamedVectorConstants, 0, sizeof(CachedNamedVectorConstants));\n    CachedIndexedNamedVectorConstants.clear();\n  }\n\n  std::optional<CondClass> DecodeNZCVCondition(uint8_t OP);\n  Ref SelectCC0All1(uint8_t OP);\n\n  /**\n   * @brief Flushes NZCV. Mostly vestigial.\n   */\n  void CalculateDeferredFlags();\n\n  void ZeroShiftResult(FEXCore::X86Tables::DecodedOp Op) {\n    // In the case of zero-rotate, we need to store the destination still to deal with 32-bit semantics.\n    const auto Size = OpSizeFromSrc(Op);\n    if (Size != OpSize::i32Bit) {\n      return;\n    }\n    auto Dest = LoadSourceGPR(Op, Op->Dest, Op->Flags);\n    StoreResultGPR(Op, Dest);\n  }\n\n  using ZeroShiftFunctionPtr = void (OpDispatchBuilder::*)(FEXCore::X86Tables::DecodedOp Op);\n\n  template<typename F>\n  void Calculate_ShiftVariable(FEXCore::X86Tables::DecodedOp Op, Ref Shift, F&& Calculate,\n                               std::optional<ZeroShiftFunctionPtr> ZeroShiftResult = std::nullopt) {\n    // RCR can call this with constants, so handle that without branching.\n    uint64_t Const;\n    if (IsValueConstant(WrapNode(Shift), &Const)) {\n      if (Const) {\n        Calculate();\n      } else if (ZeroShiftResult) {\n        (this->*(*ZeroShiftResult))(Op);\n      }\n\n      return;\n    }\n\n    // Otherwise, prepare to branch.\n    auto Zero = Constant(0);\n\n    // If the shift is zero, do not touch the flags.\n    auto SetBlock = CreateNewCodeBlockAfter(GetCurrentBlock());\n    IRPair<IROp_CodeBlock> NextBlock = SetBlock;\n    IRPair<IROp_CodeBlock> ZeroShiftBlock;\n    if (ZeroShiftResult) {\n      ZeroShiftBlock = CreateNewCodeBlockAfter(NextBlock);\n      NextBlock = ZeroShiftBlock;\n    }\n    auto EndBlock = CreateNewCodeBlockAfter(NextBlock);\n\n    ///< Jump to zeroshift block or end block depending on if it was provided.\n    IRPair<IROp_CodeBlock> TailHandling = ZeroShiftResult ? ZeroShiftBlock : EndBlock;\n    CondJump(Shift, Zero, TailHandling, SetBlock, CondClass::EQ);\n\n    SetCurrentCodeBlock(SetBlock);\n    StartNewBlock();\n    {\n      Calculate();\n      Jump(EndBlock);\n    }\n\n    if (ZeroShiftResult) {\n      SetCurrentCodeBlock(ZeroShiftBlock);\n      StartNewBlock();\n      {\n        (this->*(*ZeroShiftResult))(Op);\n        Jump(EndBlock);\n      }\n    }\n\n    SetCurrentCodeBlock(EndBlock);\n    StartNewBlock();\n  }\n\n  /**\n   * @name These functions are used by the deferred flag handling while it is calculating and storing flags in to RFLAGs.\n   * @{ */\n  Ref LoadPFRaw(bool Mask, bool Invert);\n  Ref LoadAF();\n  void FixupAF();\n  void SetAFAndFixup(Ref AF);\n  Ref CalculateAFForDecimal(Ref A);\n  void CalculatePF(Ref Res);\n  void CalculateAF(Ref Src1, Ref Src2);\n\n  Ref IncrementByCarry(OpSize OpSize, Ref Src);\n\n  void CalculateOF(IR::OpSize SrcSize, Ref Res, Ref Src1, Ref Src2, bool Sub);\n  Ref CalculateFlags_ADC(IR::OpSize SrcSize, Ref Src1, Ref Src2);\n  Ref CalculateFlags_SBB(IR::OpSize SrcSize, Ref Src1, Ref Src2);\n  Ref CalculateFlags_SUB(IR::OpSize SrcSize, Ref Src1, Ref Src2, bool UpdateCF = true);\n  Ref CalculateFlags_ADD(IR::OpSize SrcSize, Ref Src1, Ref Src2, bool UpdateCF = true);\n  void CalculateFlags_MUL(IR::OpSize SrcSize, Ref Res, Ref High);\n  void CalculateFlags_UMUL(Ref High);\n  void CalculateFlags_Logical(IR::OpSize SrcSize, Ref Res);\n  void CalculateFlags_ShiftLeftImmediate(IR::OpSize SrcSize, Ref Res, Ref Src1, uint64_t Shift);\n  void CalculateFlags_ShiftRightImmediate(IR::OpSize SrcSize, Ref Res, Ref Src1, uint64_t Shift);\n  void CalculateFlags_ShiftRightDoubleImmediate(IR::OpSize SrcSize, Ref Res, Ref Src1, uint64_t Shift);\n  void CalculateFlags_ShiftRightImmediateCommon(IR::OpSize SrcSize, Ref Res, Ref Src1, uint64_t Shift);\n  void CalculateFlags_SignShiftRightImmediate(IR::OpSize SrcSize, Ref Res, Ref Src1, uint64_t Shift);\n  void CalculateFlags_ZCNT(IR::OpSize SrcSize, Ref Result);\n  /**  @} */\n\n  Ref GetX87Top();\n  void SetX87FTW(Ref FTW);\n  Ref GetX87FTW_Helper();\n  void SetX87Top(Ref Value);\n\n  void ChgStateX87_MMX() override {\n    LOGMAN_THROW_A_FMT(MMXState == MMXState_X87, \"Expected state to be x87\");\n    _StackForceSlow();\n    SetX87Top(Constant(0)); // top reset to zero\n    _StoreContextGPR(OpSize::i8Bit, Constant(0xFFFFUL), offsetof(FEXCore::Core::CPUState, AbridgedFTW));\n    MMXState = MMXState_MMX;\n  }\n\n  void ChgStateMMX_X87() override {\n    LOGMAN_THROW_A_FMT(MMXState == MMXState_MMX, \"Expected state to be MMX\");\n    // The opcode dispatcher register cache is used for MMX, but the x87 pass register cache is used for x87, spill to\n    // context to ensure coherence.\n    FlushRegisterCache(false, true);\n    // We explicitly initialize to x87 state in StartNewBlock.\n    // So if we ever change this to do something else, we need to\n    // make sure that we consider if we need to explicitly set it there.\n    MMXState = MMXState_X87;\n  }\n\n  bool DestIsLockedMem(FEXCore::X86Tables::DecodedOp Op) const {\n    return DestIsMem(Op) && (Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_LOCK) != 0;\n  }\n\n  bool DestIsMem(FEXCore::X86Tables::DecodedOp Op) const {\n    return !Op->Dest.IsGPR();\n  }\n\n  void CreateJumpBlocks(const fextl::vector<FEXCore::Frontend::Decoder::DecodedBlocks>* Blocks);\n  bool BlockSetRIP {false};\n\n  bool Multiblock {};\n  bool Is64BitMode {};\n  uint64_t Entry {};\n\n  // Set if mono hacks are enabled and the current block is the mono callsite backpatcher, in which case the\n  // XCHG ops that would patch code are replaced with a hook that performs the write and manually invalidates\n  // the target address.\n  bool IsMonoBackpatcherBlock {false};\n  IROp_IRHeader* CurrentHeader {};\n\n  [[nodiscard]]\n  bool IsTSOEnabled(RegClass Class) const {\n    if (ForceTSO == ForceTSOMode::ForceEnabled) {\n      return true;\n    } else if (ForceTSO == ForceTSOMode::ForceDisabled) {\n      return false;\n    } else if (Class == RegClass::FPR) {\n      return CTX->IsVectorAtomicTSOEnabled();\n    } else {\n      return CTX->IsAtomicTSOEnabled();\n    }\n  }\n\n  Ref _StoreMemAutoTSO(RegClass Class, OpSize Size, Ref Addr, Ref Value, OpSize Align = OpSize::i8Bit) {\n    if (IsTSOEnabled(Class)) {\n      return _StoreMemTSO(Class, Size, Value, Addr, Invalid(), Align, MemOffsetType::SXTX, 1);\n    } else {\n      return _StoreMem(Class, Size, Value, Addr, Invalid(), Align, MemOffsetType::SXTX, 1);\n    }\n  }\n  Ref _StoreMemGPRAutoTSO(OpSize Size, Ref Addr, Ref Value, OpSize Align = OpSize::i8Bit) {\n    return _StoreMemAutoTSO(RegClass::GPR, Size, Addr, Value, Align);\n  }\n  Ref _StoreMemFPRAutoTSO(OpSize Size, Ref Addr, Ref Value, OpSize Align = OpSize::i8Bit) {\n    return _StoreMemAutoTSO(RegClass::FPR, Size, Addr, Value, Align);\n  }\n\n  Ref _LoadMemAutoTSO(RegClass Class, OpSize Size, Ref ssa0, OpSize Align = OpSize::i8Bit) {\n    if (IsTSOEnabled(Class)) {\n      return _LoadMemTSO(Class, Size, ssa0, Invalid(), Align, MemOffsetType::SXTX, 1);\n    } else {\n      return _LoadMem(Class, Size, ssa0, Invalid(), Align, MemOffsetType::SXTX, 1);\n    }\n  }\n  Ref _LoadMemGPRAutoTSO(OpSize Size, Ref ssa0, OpSize Align = OpSize::i8Bit) {\n    return _LoadMemAutoTSO(RegClass::GPR, Size, ssa0, Align);\n  }\n  Ref _LoadMemFPRAutoTSO(OpSize Size, Ref ssa0, OpSize Align = OpSize::i8Bit) {\n    return _LoadMemAutoTSO(RegClass::FPR, Size, ssa0, Align);\n  }\n\n  Ref _LoadMemAutoTSO(RegClass Class, OpSize Size, const AddressMode& A, OpSize Align = OpSize::i8Bit) {\n    const bool AtomicTSO = IsTSOEnabled(Class) && !A.NonTSO;\n    const auto B = SelectAddressMode(this, A, GetGPROpSize(), CTX->HostFeatures.SupportsTSOImm9, AtomicTSO, Class != RegClass::GPR, Size);\n\n    if (AtomicTSO) {\n      return _LoadMemTSO(Class, Size, B.Base, B.Index, Align, B.IndexType, B.IndexScale);\n    } else {\n      return _LoadMem(Class, Size, B.Base, B.Index, Align, B.IndexType, B.IndexScale);\n    }\n  }\n  Ref _LoadMemGPRAutoTSO(OpSize Size, const AddressMode& A, OpSize Align = OpSize::i8Bit) {\n    return _LoadMemAutoTSO(RegClass::GPR, Size, A, Align);\n  }\n  Ref _LoadMemFPRAutoTSO(OpSize Size, const AddressMode& A, OpSize Align = OpSize::i8Bit) {\n    return _LoadMemAutoTSO(RegClass::FPR, Size, A, Align);\n  }\n\n  AddressMode SelectPairAddressMode(AddressMode A, IR::OpSize Size) {\n    LOGMAN_THROW_A_FMT(Size != IR::OpSize::iUnsized, \"Invalid size!\");\n    const auto SizeInt = IR::OpSizeToSize(Size);\n    AddressMode Out {};\n\n    signed OffsetEl = A.Offset / SizeInt;\n    if ((A.Offset % SizeInt) == 0 && OffsetEl >= -64 && OffsetEl < 64) {\n      Out.Offset = A.Offset;\n      A.Offset = 0;\n    }\n\n    Out.Base = LoadEffectiveAddress(this, A, GetGPROpSize(), true, false);\n    return Out;\n  }\n\n\n  RefPair LoadMemPair(RegClass Class, OpSize Size, Ref Base, uint32_t Offset) {\n    RefPair Values = AllocatePair(Class, Size);\n    _LoadMemPair(Class, Size, Base, Offset, Values.Low, Values.High);\n    return Values;\n  }\n  RefPair LoadMemPairFPR(OpSize Size, Ref Base, uint32_t Offset) {\n    return LoadMemPair(RegClass::FPR, Size, Base, Offset);\n  }\n\n  RefPair _LoadMemPairAutoTSO(RegClass Class, OpSize Size, const AddressMode& A, OpSize Align = OpSize::i8Bit) {\n    const bool AtomicTSO = IsTSOEnabled(Class) && !A.NonTSO;\n\n    // Use ldp if possible, otherwise fallback on two loads.\n    if (!AtomicTSO && !A.Segment && Size >= OpSize::i32Bit && Size <= OpSize::i128Bit) {\n      const auto B = SelectPairAddressMode(A, Size);\n      return LoadMemPair(Class, Size, B.Base, B.Offset);\n    }\n\n    AddressMode HighA = A;\n    HighA.Offset += 16;\n\n    return {\n      .Low = _LoadMemAutoTSO(Class, Size, A, Align),\n      .High = _LoadMemAutoTSO(Class, Size, HighA, Align),\n    };\n  }\n  RefPair _LoadMemPairFPRAutoTSO(OpSize Size, const AddressMode& A, OpSize Align = OpSize::i8Bit) {\n    return _LoadMemPairAutoTSO(RegClass::FPR, Size, A, Align);\n  }\n\n  Ref _StoreMemAutoTSO(RegClass Class, OpSize Size, const AddressMode& A, Ref Value, OpSize Align = OpSize::i8Bit) {\n    const bool AtomicTSO = IsTSOEnabled(Class) && !A.NonTSO;\n    const auto B = SelectAddressMode(this, A, GetGPROpSize(), CTX->HostFeatures.SupportsTSOImm9, AtomicTSO, Class != RegClass::GPR, Size);\n\n    if (AtomicTSO) {\n      return _StoreMemTSO(Class, Size, Value, B.Base, B.Index, Align, B.IndexType, B.IndexScale);\n    } else {\n      return _StoreMem(Class, Size, Value, B.Base, B.Index, Align, B.IndexType, B.IndexScale);\n    }\n  }\n  Ref _StoreMemGPRAutoTSO(OpSize Size, const AddressMode& A, Ref Value, OpSize Align = OpSize::i8Bit) {\n    return _StoreMemAutoTSO(RegClass::GPR, Size, A, Value, Align);\n  }\n  Ref _StoreMemFPRAutoTSO(OpSize Size, const AddressMode& A, Ref Value, OpSize Align = OpSize::i8Bit) {\n    return _StoreMemAutoTSO(RegClass::FPR, Size, A, Value, Align);\n  }\n\n  void _StoreMemPairAutoTSO(RegClass Class, OpSize Size, const AddressMode& A, Ref Value1, Ref Value2, OpSize Align = OpSize::i8Bit) {\n    const auto SizeInt = IR::OpSizeToSize(Size);\n    const bool AtomicTSO = IsTSOEnabled(Class) && !A.NonTSO;\n\n    // Use stp if possible, otherwise fallback on two stores.\n    if (!AtomicTSO && !A.Segment && Size >= OpSize::i32Bit && Size <= OpSize::i128Bit) {\n      const auto B = SelectPairAddressMode(A, Size);\n      _StoreMemPair(Class, Size, Value1, Value2, B.Base, B.Offset);\n    } else {\n      auto B = A;\n\n      _StoreMemAutoTSO(Class, Size, B, Value1, OpSize::i8Bit);\n      B.Offset += SizeInt;\n      _StoreMemAutoTSO(Class, Size, B, Value2, OpSize::i8Bit);\n    }\n  }\n  void _StoreMemPairFPRAutoTSO(OpSize Size, const AddressMode& A, Ref Value1, Ref Value2, OpSize Align = OpSize::i8Bit) {\n    return _StoreMemPairAutoTSO(RegClass::FPR, Size, A, Value1, Value2, Align);\n  }\n\n  Ref Pop(IR::OpSize Size, Ref SP_RMW) {\n    Ref Value = _AllocateGPR(false);\n    _Pop(Size, SP_RMW, Value);\n    return Value;\n  }\n\n  Ref Pop(IR::OpSize Size) {\n    Ref SP = _RMWHandle(LoadGPRRegister(X86State::REG_RSP));\n    Ref Value = _AllocateGPR(false);\n\n    _Pop(Size, SP, Value);\n\n    // Store the new stack pointer\n    StoreGPRRegister(X86State::REG_RSP, SP);\n    return Value;\n  }\n\n  Ref VZeroExtendOperand(OpSize Size, X86Tables::DecodedOperand Op, Ref Value) {\n    bool IsMMX = Op.IsGPR() && Op.Data.GPR.GPR >= X86State::REG_MM_0;\n    bool AlreadyExtended = Op.IsGPRDirect() || Op.IsGPRIndirect() || IsMMX;\n\n    return AlreadyExtended ? Value : _VMov(Size, Value);\n  }\n\n  void Push(IR::OpSize Size, Ref Value) {\n    auto OldSP = LoadGPRRegister(X86State::REG_RSP);\n    auto NewSP = _Push(GetGPROpSize(), Size, Value, OldSP);\n    StoreGPRRegister(X86State::REG_RSP, NewSP);\n    FlushRegisterCache();\n  }\n\n  struct ArithRef {\n    IREmitter* E {};\n    bool IsConstant {};\n    union {\n      Ref R {};\n      uint64_t C;\n    };\n\n    ArithRef() {}\n\n    ArithRef(IREmitter* IREmit, Ref Reference)\n      : E(IREmit)\n      , IsConstant(false)\n      , R(Reference) {}\n\n    ArithRef(IREmitter* IREmit, uint64_t K)\n      : E(IREmit)\n      , IsConstant(true)\n      , C(K) {}\n\n    ArithRef Neg() {\n      return IsConstant ? ArithRef(E, -C) : ArithRef(E, E->_Neg(OpSize::i64Bit, R));\n    }\n\n    ArithRef And(uint64_t K) {\n      return IsConstant ? ArithRef(E, C & K) : ArithRef(E, E->_And(OpSize::i64Bit, R, E->Constant(K)));\n    }\n\n    ArithRef Presub(uint64_t K) {\n      return IsConstant ? ArithRef(E, K - C) : ArithRef(E, E->Sub(OpSize::i64Bit, E->Constant(K), R));\n    }\n\n    ArithRef Lshl(uint64_t Shift) {\n      if (Shift == 0) {\n        return *this;\n      } else if (IsConstant) {\n        return ArithRef(E, C << Shift);\n      } else {\n        return ArithRef(E, E->_Lshl(OpSize::i64Bit, R, E->Constant(Shift)));\n      }\n    }\n\n    ArithRef Bfe(unsigned Start, unsigned Size) {\n      if (IsConstant) {\n        return ArithRef(E, (C >> Start) & ((1ull << Size) - 1));\n      } else {\n        return ArithRef(E, E->_Bfe(OpSize::i64Bit, Size, Start, R));\n      }\n    }\n\n    ArithRef Sbfe(unsigned Start, unsigned Size) {\n      if (IsConstant) {\n        uint64_t SourceMask = Size == 64 ? ~0ULL : ((1ULL << Size) - 1);\n        SourceMask <<= Start;\n\n        int64_t NewConstant = (C & SourceMask) >> Start;\n        NewConstant <<= 64 - Size;\n        NewConstant >>= 64 - Size;\n\n        return ArithRef(E, NewConstant);\n      } else {\n        return ArithRef(E, E->_Sbfe(OpSize::i64Bit, Size, Start, R));\n      }\n    }\n\n    Ref BfiInto(Ref Bitfield, unsigned Start, unsigned Size) {\n      if (IsConstant && (Size > 0 && Size < 64)) {\n        uint64_t SourceMask = (1ULL << Size) - 1;\n        uint64_t SourceMaskShifted = SourceMask << Start;\n\n        if (C == 0) {\n          return E->_And(OpSize::i64Bit, Bitfield, E->_InlineConstant(~SourceMaskShifted));\n        } else if (C == SourceMask) {\n          return E->_Or(OpSize::i64Bit, Bitfield, E->_InlineConstant(SourceMaskShifted));\n        }\n      }\n\n      if (IsConstant) {\n        return E->_Bfi(OpSize::i64Bit, Size, Start, Bitfield, E->Constant(C));\n      } else {\n        return E->_Bfi(OpSize::i64Bit, Size, Start, Bitfield, R);\n      }\n    }\n\n    ArithRef MaskBit(OpSize Size) {\n      if (IsConstant) {\n        uint64_t ShiftMask = Size == OpSize::i64Bit ? 63 : 31;\n        uint64_t Result = 1ull << (C & ShiftMask);\n        if (ShiftMask == 31) {\n          Result &= ((1ull << 32) - 1);\n        }\n\n        return ArithRef(E, Result);\n      } else {\n        return ArithRef(E, E->_Lshl(Size, E->Constant(1), R));\n      }\n    }\n\n    Ref Ref() {\n      return IsConstant ? E->Constant(C) : R;\n    }\n\n    bool IsDefinitelyZero() const {\n      return IsConstant && C == 0;\n    }\n  };\n\n  ArithRef ARef(Ref R) {\n    uint64_t C;\n\n    if (IsValueConstant(WrapNode(R), &C)) {\n      return ARef(C);\n    } else {\n      return ArithRef(this, R);\n    }\n  }\n\n  ArithRef ARef(uint64_t K) {\n    return ArithRef(this, K);\n  }\n\n  ///< Segment telemetry tracking\n  uint32_t SegmentsNeedReadCheck {~0U};\n  void CheckLegacySegmentWrite(Ref NewNode, uint32_t SegmentReg);\n  void CheckLegacySegmentRead(Ref NewNode, uint32_t SegmentReg);\n};\n\nconstexpr inline void InstallToTable(auto& FinalTable, const auto& LocalTable) {\n  for (const auto& Op : LocalTable) {\n    auto OpNum = Op.Op;\n    auto Dispatcher = Op.Ptr;\n    for (uint8_t i = 0; i < Op.Count; ++i) {\n      auto& TableOp = FinalTable[OpNum + i];\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n      if (TableOp.OpcodeDispatcher.OpDispatch) {\n        ERROR_AND_DIE_FMT(\"Duplicate Entry {}\", TableOp.Name);\n      }\n#endif\n\n      TableOp.OpcodeDispatcher.OpDispatch = Dispatcher;\n    }\n  }\n}\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/VSyscall/VSyscall.inc",
    "content": "// SPDX-License-Identifier: MIT\n// This is the vsyscall page for x86_64 guest code\n// This was compiled with nasm with the following source then exported to binary\n\n//BITS 64;\n//\n//align 4096, db 0xcc\n//  ; __NR_gettimeofday\n//  mov rax, 96\n//  syscall\n//  ret\n//\n//align 1024, db 0xcc\n//  ; __NR_time\n//  mov rax, 201\n//  syscall\n//  ret\n//\n//align 1024, db 0xcc\n//  ; __NR_getcpu\n//  mov rax, 309\n//  syscall\n//  ret\n//\n//align 4096, db 0xcc\n\n// We only want one of these pages per FEX process\n// One page\nconst static uint8_t VSyscallData[0x1000] = {\n\t0xB8, 0x60, 0x00, 0x00, 0x00, 0x0F, 0x05, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xB8, 0xC9, 0x00, 0x00, 0x00, 0x0F, 0x05, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xB8, 0x35, 0x01, 0x00, 0x00, 0x0F, 0x05, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n\t0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC\n};\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/X86Tables/BaseTables.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-tables\n$end_info$\n*/\n\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/Core/OpcodeDispatcher/BaseTables.h\"\n\n#include <FEXCore/Core/Context.h>\n\n#include <iterator>\n\nnamespace FEXCore::X86Tables {\nusing namespace InstFlags;\n\nenum Primary_LUT {\n  ENTRY_06,\n  ENTRY_07,\n  ENTRY_0E,\n  ENTRY_16,\n  ENTRY_17,\n  ENTRY_1E,\n  ENTRY_1F,\n  ENTRY_27,\n  ENTRY_2F,\n  ENTRY_37,\n  ENTRY_3F,\n  ENTRY_40,\n  ENTRY_48,\n  ENTRY_60,\n  ENTRY_61,\n  ENTRY_63,\n  ENTRY_9A,\n  ENTRY_A0,\n  ENTRY_A1,\n  ENTRY_A2,\n  ENTRY_A3,\n  ENTRY_CE,\n  ENTRY_D4,\n  ENTRY_D5,\n  ENTRY_D6,\n  ENTRY_EA,\n  ENTRY_MAX,\n};\n\nconstexpr std::array<X86InstInfo[2], ENTRY_MAX> Primary_ArchSelect_LUT = {{\n  // ENTRY_06\n  {\n    {\"PUSH ES\",  TYPE_INST, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_DEBUG_MEM_ACCESS, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::PUSHSegmentOp, FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX> } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_07\n  {\n    {\"POP ES\",   TYPE_INST, GenFlagsSizes(SIZE_16BIT, SIZE_DEF) | FLAGS_DEBUG_MEM_ACCESS, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::POPSegmentOp, FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX> } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_0E\n  {\n    {\"PUSH CS\",  TYPE_INST, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_DEBUG_MEM_ACCESS, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::PUSHSegmentOp, FEXCore::X86Tables::DecodeFlags::FLAG_CS_PREFIX> } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_16\n  {\n    {\"PUSH SS\",  TYPE_INST, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_DEBUG_MEM_ACCESS, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::PUSHSegmentOp, FEXCore::X86Tables::DecodeFlags::FLAG_SS_PREFIX> } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_17\n  {\n    {\"POP SS\",   TYPE_INST, GenFlagsSizes(SIZE_16BIT, SIZE_DEF) | FLAGS_DEBUG_MEM_ACCESS, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::POPSegmentOp, FEXCore::X86Tables::DecodeFlags::FLAG_SS_PREFIX> } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_1E\n  {\n    {\"PUSH DS\",  TYPE_INST, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_DEBUG_MEM_ACCESS, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::PUSHSegmentOp, FEXCore::X86Tables::DecodeFlags::FLAG_DS_PREFIX> } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_1F\n  {\n    {\"POP DS\",   TYPE_INST, GenFlagsSizes(SIZE_16BIT, SIZE_DEF) | FLAGS_DEBUG_MEM_ACCESS, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::POPSegmentOp, FEXCore::X86Tables::DecodeFlags::FLAG_DS_PREFIX> } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_27\n  {\n    {\"DAA\",      TYPE_INST, GenFlagsDstSize(SIZE_8BIT) | FLAGS_SF_DST_RAX, 0, { .OpDispatch = &IR::OpDispatchBuilder::DAAOp } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_2F\n  {\n    {\"DAS\",      TYPE_INST, GenFlagsDstSize(SIZE_8BIT) | FLAGS_SF_DST_RAX, 0, { .OpDispatch = &IR::OpDispatchBuilder::DASOp } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_37\n  {\n    {\"AAA\",      TYPE_INST, GenFlagsDstSize(SIZE_16BIT) | FLAGS_SF_DST_RAX, 0, { .OpDispatch = &IR::OpDispatchBuilder::AAAOp } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_3F\n  {\n    {\"AAS\",      TYPE_INST, GenFlagsDstSize(SIZE_16BIT) | FLAGS_SF_DST_RAX, 0, { .OpDispatch = &IR::OpDispatchBuilder::AASOp } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_40\n  {\n    {\"INC\",    TYPE_INST, FLAGS_SF_REX_IN_BYTE, 0, { .OpDispatch = &IR::OpDispatchBuilder::INCOp } },\n    // REX\n    {\"\", TYPE_REX_PREFIX, FLAGS_NONE, 0},\n  },\n  // ENTRY_48\n  {\n    {\"DEC\",    TYPE_INST, FLAGS_SF_REX_IN_BYTE, 0, { .OpDispatch = &IR::OpDispatchBuilder::DECOp } },\n    {\"\", TYPE_REX_PREFIX, FLAGS_NONE, 0},\n  },\n  // ENTRY_60\n  {\n    {\"PUSHA\",  TYPE_INST, FLAGS_DEBUG_MEM_ACCESS, 0, { .OpDispatch = &IR::OpDispatchBuilder::PUSHAOp } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_61\n  {\n    {\"POPA\",   TYPE_INST, FLAGS_DEBUG_MEM_ACCESS, 0, { .OpDispatch = &IR::OpDispatchBuilder::POPAOp } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_63\n  {\n    {\"ARPL\",   TYPE_INST, GenFlagsSameSize(SIZE_16BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST, 0, { .OpDispatch = &IR::OpDispatchBuilder::ARPLOp } },\n    {\"MOVSXD\", TYPE_INST, GenFlagsDstSize(SIZE_64BIT) | FLAGS_MODRM, 0, { .OpDispatch = &IR::OpDispatchBuilder::MOVSXDOp } },\n  },\n  // ENTRY_9A\n  {\n    {\"CALLF\",  TYPE_INST, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_A0\n  {\n    {\"MOV\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_DST_RAX | FLAGS_MEM_OFFSET, 4, { .OpDispatch = &IR::OpDispatchBuilder::MOVOffsetOp } },\n    {\"MOV\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_DST_RAX | FLAGS_MEM_OFFSET, 8, { .OpDispatch = &IR::OpDispatchBuilder::MOVOffsetOp } },\n  },\n  // ENTRY_A1\n  {\n    {\"MOV\",    TYPE_INST, FLAGS_SF_DST_RAX | FLAGS_MEM_OFFSET, 4, { .OpDispatch = &IR::OpDispatchBuilder::MOVOffsetOp } },\n    {\"MOV\",    TYPE_INST, FLAGS_SF_DST_RAX | FLAGS_MEM_OFFSET, 8, { .OpDispatch = &IR::OpDispatchBuilder::MOVOffsetOp } },\n  },\n  // ENTRY_A2\n  {\n    {\"MOV\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_SRC_RAX | FLAGS_MEM_OFFSET, 4, { .OpDispatch = &IR::OpDispatchBuilder::MOVOffsetOp } },\n    {\"MOV\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_SRC_RAX | FLAGS_MEM_OFFSET, 8, { .OpDispatch = &IR::OpDispatchBuilder::MOVOffsetOp } },\n  },\n  // ENTRY_A3\n  {\n    {\"MOV\",    TYPE_INST, FLAGS_SF_SRC_RAX | FLAGS_MEM_OFFSET, 4, { .OpDispatch = &IR::OpDispatchBuilder::MOVOffsetOp } },\n    {\"MOV\",    TYPE_INST, FLAGS_SF_SRC_RAX | FLAGS_MEM_OFFSET, 8, { .OpDispatch = &IR::OpDispatchBuilder::MOVOffsetOp } },\n  },\n  // ENTRY_CE\n  {\n    {\"INTO\",   TYPE_INST, FLAGS_NONE, 0, { .OpDispatch = &IR::OpDispatchBuilder::INTOp } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_D4\n  {\n    {\"AAM\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_DST_RAX, 1, { .OpDispatch = &IR::OpDispatchBuilder::AAMOp } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_D5\n  {\n    {\"AAD\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_DST_RAX, 1, { .OpDispatch = &IR::OpDispatchBuilder::AADOp } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_D6\n  {\n    {\"SALC\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_DST_RAX | FLAGS_SF_SRC_RAX, 0, { .OpDispatch = &IR::OpDispatchBuilder::SALCOp } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  // ENTRY_EA\n  {\n    {\"JMPF\",   TYPE_INST, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n}};\n\nconst std::array<X86InstInfo, MAX_PRIMARY_TABLE_SIZE> BaseOps = []() consteval {\n  std::array<X86InstInfo, MAX_PRIMARY_TABLE_SIZE> Table{};\n\n  constexpr U8U8InfoStruct BaseOpTable[] = {\n    // Prefixes\n    // Operand size overide\n    {0x66, 1, X86InstInfo{\"\",      TYPE_PREFIX, FLAGS_NONE,        0}},\n    // Address size override\n    {0x67, 1, X86InstInfo{\"\",      TYPE_PREFIX, FLAGS_NONE,        0}},\n    {0x26, 1, X86InstInfo{\"ES\",    TYPE_LEGACY_PREFIX, FLAGS_NONE, 0}},\n    {0x2E, 1, X86InstInfo{\"CS\",    TYPE_LEGACY_PREFIX, FLAGS_NONE, 0}},\n    {0x36, 1, X86InstInfo{\"SS\",    TYPE_LEGACY_PREFIX, FLAGS_NONE, 0}},\n    {0x3E, 1, X86InstInfo{\"DS\",    TYPE_LEGACY_PREFIX, FLAGS_NONE, 0}},\n    // These are still invalid on 64bit\n    {0x64, 1, X86InstInfo{\"FS\",    TYPE_PREFIX, FLAGS_NONE,        0}},\n    {0x65, 1, X86InstInfo{\"GS\",    TYPE_PREFIX, FLAGS_NONE,        0}},\n    {0xF0, 1, X86InstInfo{\"LOCK\",  TYPE_PREFIX, FLAGS_NONE,        0}},\n    {0xF2, 1, X86InstInfo{\"REPNE\", TYPE_PREFIX, FLAGS_NONE,        0}},\n    {0xF3, 1, X86InstInfo{\"REP\",   TYPE_PREFIX, FLAGS_NONE,        0}},\n\n    // Instructions\n    {0x00, 1, X86InstInfo{\"ADD\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                   0}},\n    {0x01, 1, X86InstInfo{\"ADD\",    TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_DISPLACE_SIZE_DIV_2,                                       0}},\n    {0x02, 1, X86InstInfo{\"ADD\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM,                                                   0}},\n    {0x03, 1, X86InstInfo{\"ADD\",    TYPE_INST, FLAGS_MODRM,                                                                   0}},\n    {0x04, 1, X86InstInfo{\"ADD\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_DST_RAX  ,                              1}},\n    {0x05, 1, X86InstInfo{\"ADD\",    TYPE_INST, FLAGS_SF_DST_RAX | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2, 4}},\n\n    {0x06, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_06] }}},\n    {0x07, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_07] }}},\n\n    {0x08, 1, X86InstInfo{\"OR\",     TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                   0}},\n    {0x09, 1, X86InstInfo{\"OR\",     TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                                   0}},\n    {0x0A, 1, X86InstInfo{\"OR\",     TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM,                                                   0}},\n    {0x0B, 1, X86InstInfo{\"OR\",     TYPE_INST, FLAGS_MODRM,                                                                   0}},\n    {0x0C, 1, X86InstInfo{\"OR\",     TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_DST_RAX ,                              1}},\n    {0x0D, 1, X86InstInfo{\"OR\",     TYPE_INST, FLAGS_SF_DST_RAX | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2, 4}},\n    {0x0E, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_0E] }}},\n\n    {0x10, 1, X86InstInfo{\"ADC\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                   0}},\n    {0x11, 1, X86InstInfo{\"ADC\",    TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_DISPLACE_SIZE_DIV_2,                                       0}},\n    {0x12, 1, X86InstInfo{\"ADC\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM,                                                   0}},\n    {0x13, 1, X86InstInfo{\"ADC\",    TYPE_INST, FLAGS_MODRM,                                                                   0}},\n    {0x14, 1, X86InstInfo{\"ADC\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_DST_RAX  ,                              1}},\n    {0x15, 1, X86InstInfo{\"ADC\",    TYPE_INST, FLAGS_SF_DST_RAX | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2, 4}},\n    {0x16, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_16] }}},\n    {0x17, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_17] }}},\n\n    {0x18, 1, X86InstInfo{\"SBB\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                   0}},\n    {0x19, 1, X86InstInfo{\"SBB\",    TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_DISPLACE_SIZE_DIV_2,                                       0}},\n    {0x1A, 1, X86InstInfo{\"SBB\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM,                                                   0}},\n    {0x1B, 1, X86InstInfo{\"SBB\",    TYPE_INST, FLAGS_MODRM,                                                                   0}},\n    {0x1C, 1, X86InstInfo{\"SBB\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_DST_RAX  ,                              1}},\n    {0x1D, 1, X86InstInfo{\"SBB\",    TYPE_INST, FLAGS_SF_DST_RAX | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2, 4}},\n    {0x1E, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_1E] }}},\n    {0x1F, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_1F] }}},\n\n    {0x20, 1, X86InstInfo{\"AND\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                   0}},\n    {0x21, 1, X86InstInfo{\"AND\",    TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                                   0}},\n    {0x22, 1, X86InstInfo{\"AND\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM,                                                   0}},\n    {0x23, 1, X86InstInfo{\"AND\",    TYPE_INST, FLAGS_MODRM,                                                                   0}},\n    {0x24, 1, X86InstInfo{\"AND\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_DST_RAX  ,                              1}},\n    {0x25, 1, X86InstInfo{\"AND\",    TYPE_INST, FLAGS_SF_DST_RAX | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2, 4}},\n\n    {0x27, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_27] }}},\n    {0x28, 1, X86InstInfo{\"SUB\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                   0}},\n    {0x29, 1, X86InstInfo{\"SUB\",    TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                                   0}},\n    {0x2A, 1, X86InstInfo{\"SUB\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM,                                                   0}},\n    {0x2B, 1, X86InstInfo{\"SUB\",    TYPE_INST, FLAGS_MODRM,                                                                   0}},\n    {0x2C, 1, X86InstInfo{\"SUB\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_DST_RAX ,                              1}},\n    {0x2D, 1, X86InstInfo{\"SUB\",    TYPE_INST, FLAGS_SF_DST_RAX | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2, 4}},\n    {0x2F, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_2F] }}},\n\n    {0x30, 1, X86InstInfo{\"XOR\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                   0}},\n    {0x31, 1, X86InstInfo{\"XOR\",    TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                                   0}},\n    {0x32, 1, X86InstInfo{\"XOR\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM,                                                   0}},\n    {0x33, 1, X86InstInfo{\"XOR\",    TYPE_INST, FLAGS_MODRM,                                                                   0}},\n    {0x34, 1, X86InstInfo{\"XOR\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_DST_RAX  ,                              1}},\n    {0x35, 1, X86InstInfo{\"XOR\",    TYPE_INST, FLAGS_SF_DST_RAX | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2, 4}},\n\n    {0x37, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_37] }}},\n    {0x38, 1, X86InstInfo{\"CMP\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                   0}},\n    {0x39, 1, X86InstInfo{\"CMP\",    TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                                   0}},\n    {0x3A, 1, X86InstInfo{\"CMP\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM,                                                   0}},\n    {0x3B, 1, X86InstInfo{\"CMP\",    TYPE_INST, FLAGS_MODRM,                                                                   0}},\n    {0x3C, 1, X86InstInfo{\"CMP\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_DST_RAX  ,                              1}},\n    {0x3D, 1, X86InstInfo{\"CMP\",    TYPE_INST, FLAGS_SF_DST_RAX | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2, 4}},\n    {0x3F, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_3F] }}},\n\n    {0x40, 8, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_40] }}},\n    {0x48, 8, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_48] }}},\n\n    {0x50, 8, X86InstInfo{\"PUSH\",   TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SF_REX_IN_BYTE | FLAGS_DEBUG_MEM_ACCESS ,                    0}},\n    {0x58, 8, X86InstInfo{\"POP\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SF_REX_IN_BYTE | FLAGS_DEBUG_MEM_ACCESS ,                    0}},\n\n\n    {0x60, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_60] }}},\n    {0x61, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_61] }}},\n    {0x62, 1, X86InstInfo{\"\",       TYPE_GROUP_EVEX, FLAGS_NONE,                                                                           0}},\n    {0x63, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_63] }}},\n\n    {0x68, 1, X86InstInfo{\"PUSH\",   TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_SRC_SEXT, 4}},\n    {0x69, 1, X86InstInfo{\"IMUL\",   TYPE_INST, FLAGS_MODRM | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2,        4}},\n    {0x6A, 1, X86InstInfo{\"PUSH\",   TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_SRC_SEXT ,            1}},\n    {0x6B, 1, X86InstInfo{\"IMUL\",   TYPE_INST, FLAGS_MODRM | FLAGS_SRC_SEXT ,                                    1}},\n\n    // This should just throw a GP\n    {0x6C, 1, X86InstInfo{\"INSB\",   TYPE_INST, FLAGS_BLOCK_END, 0}},\n    {0x6D, 1, X86InstInfo{\"INSW\",   TYPE_INST, FLAGS_BLOCK_END, 0}},\n    {0x6E, 1, X86InstInfo{\"OUTS\",   TYPE_INST, FLAGS_BLOCK_END, 0}},\n    {0x6F, 1, X86InstInfo{\"OUTS\",   TYPE_INST, FLAGS_BLOCK_END, 0}},\n\n    {0x70, 1, X86InstInfo{\"JO\",     TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n    {0x71, 1, X86InstInfo{\"JNO\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n    {0x72, 1, X86InstInfo{\"JB\",     TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n    {0x73, 1, X86InstInfo{\"JNB\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n    {0x74, 1, X86InstInfo{\"JZ\",     TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n    {0x75, 1, X86InstInfo{\"JNZ\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n    {0x76, 1, X86InstInfo{\"JBE\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n    {0x77, 1, X86InstInfo{\"JNBE\",   TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n    {0x78, 1, X86InstInfo{\"JS\",     TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n    {0x79, 1, X86InstInfo{\"JNS\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n    {0x7A, 1, X86InstInfo{\"JP\",     TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n    {0x7B, 1, X86InstInfo{\"JNP\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n    {0x7C, 1, X86InstInfo{\"JL\",     TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n    {0x7D, 1, X86InstInfo{\"JNL\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n    {0x7E, 1, X86InstInfo{\"JLE\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n    {0x7F, 1, X86InstInfo{\"JNLE\",   TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT , 1}},\n\n    {0x84, 1, X86InstInfo{\"TEST\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,         0}},\n    {0x85, 1, X86InstInfo{\"TEST\",   TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                         0}},\n    {0x86, 1, X86InstInfo{\"XCHG\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,         0}},\n    {0x87, 1, X86InstInfo{\"XCHG\",   TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                         0}},\n\n    {0x88, 1, X86InstInfo{\"MOV\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,         0}},\n    {0x89, 1, X86InstInfo{\"MOV\",    TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                         0}},\n    {0x8A, 1, X86InstInfo{\"MOV\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM,         0}},\n    {0x8B, 1, X86InstInfo{\"MOV\",    TYPE_INST, FLAGS_MODRM,                         0}},\n    {0x8C, 1, X86InstInfo{\"MOV\",    TYPE_INST, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                      0}},\n    {0x8D, 1, X86InstInfo{\"LEA\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_MODRM,                         0}},\n    {0x8E, 1, X86InstInfo{\"MOV\",    TYPE_INST, GenFlagsSameSize(SIZE_16BIT) | FLAGS_MODRM,                      0}},\n    {0x8F, 1, X86InstInfo{\"POP\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_ZERO_REG | FLAGS_DEBUG_MEM_ACCESS, 0}},\n    {0x90, 8, X86InstInfo{\"XCHG\",   TYPE_INST, FLAGS_SF_REX_IN_BYTE | FLAGS_SF_SRC_RAX, 0}},\n    {0x98, 1, X86InstInfo{\"CDQE\",   TYPE_INST, FLAGS_SF_DST_RAX | FLAGS_SF_SRC_RAX,     0}},\n    {0x99, 1, X86InstInfo{\"CQO\",    TYPE_INST, FLAGS_SF_DST_RDX | FLAGS_SF_SRC_RAX,     0}},\n\n    // These three are all X87 instructions\n    {0x9B, 1, X86InstInfo{\"FWAIT\",  TYPE_INST, FLAGS_NONE,                              0}},\n    {0x9C, 1, X86InstInfo{\"PUSHF\",  TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF),         0}},\n    {0x9D, 1, X86InstInfo{\"POPF\",   TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_BLOCK_END,         0}},\n\n    {0x9E, 1, X86InstInfo{\"SAHF\",   TYPE_INST, FLAGS_NONE,                              0}},\n    {0x9F, 1, X86InstInfo{\"LAHF\",   TYPE_INST, FLAGS_NONE,                              0}},\n\n    {0xA0, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_A0] }}},\n    {0xA1, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_A1] }}},\n    {0xA2, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_A2] }}},\n    {0xA3, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_A3] }}},\n\n    {0xA4, 1, X86InstInfo{\"MOVSB\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_DEBUG_MEM_ACCESS,                                            0}},\n    {0xA5, 1, X86InstInfo{\"MOVS\",   TYPE_INST, FLAGS_DEBUG_MEM_ACCESS,                                                            0}},\n    {0xA6, 1, X86InstInfo{\"CMPSB\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_DEBUG_MEM_ACCESS,                                            0}},\n    {0xA7, 1, X86InstInfo{\"CMPS\",   TYPE_INST, FLAGS_DEBUG_MEM_ACCESS,                                                            0}},\n\n    {0xA8, 1, X86InstInfo{\"TEST\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_DST_RAX ,                                             1}},\n    {0xA9, 1, X86InstInfo{\"TEST\",   TYPE_INST, FLAGS_SF_DST_RAX | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2,                4}},\n    {0xAA, 1, X86InstInfo{\"STOS\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_SF_SRC_RAX,                   0}},\n    {0xAB, 1, X86InstInfo{\"STOS\",   TYPE_INST, FLAGS_DEBUG_MEM_ACCESS | FLAGS_SF_SRC_RAX,                                   0}},\n    {0xAC, 1, X86InstInfo{\"LODS\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_DST_RAX | FLAGS_DEBUG_MEM_ACCESS,                                                      0}},\n    {0xAD, 1, X86InstInfo{\"LODS\",   TYPE_INST, FLAGS_SF_DST_RAX | FLAGS_DEBUG_MEM_ACCESS,                                                      0}},\n    {0xAE, 1, X86InstInfo{\"SCAS\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_SF_SRC_RAX,                                   0}},\n    {0xAF, 1, X86InstInfo{\"SCAS\",   TYPE_INST, FLAGS_DEBUG_MEM_ACCESS | FLAGS_SF_SRC_RAX,                                   0}},\n\n    {0xB0, 8, X86InstInfo{\"MOV\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_SF_REX_IN_BYTE ,                                         1}},\n    {0xB8, 8, X86InstInfo{\"MOV\",    TYPE_INST, FLAGS_SF_REX_IN_BYTE | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_DISPLACE_SIZE_MUL_2, 4}},\n\n    {0xC2, 1, X86InstInfo{\"RET\",    TYPE_INST, FLAGS_SETS_RIP | FLAGS_BLOCK_END,                                             2}},\n    {0xC3, 1, X86InstInfo{\"RET\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_BLOCK_END ,                                                0}},\n    {0xC8, 1, X86InstInfo{\"ENTER\",  TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_DEBUG_MEM_ACCESS ,                                      3}},\n    {0xC9, 1, X86InstInfo{\"LEAVE\",  TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_DEBUG_MEM_ACCESS ,                                                0}},\n    {0xCA, 1, X86InstInfo{\"RETF\",   TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_BLOCK_END,                                                              2}},\n    {0xCB, 1, X86InstInfo{\"RETF\",   TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_BLOCK_END,                                                              0}},\n    {0xCC, 1, X86InstInfo{\"INT3\",   TYPE_INST, FLAGS_BLOCK_END,                                                                                      0}},\n    {0xCD, 1, X86InstInfo{\"INT\",    TYPE_INST, DEFAULT_SYSCALL_FLAGS,                                                                  1}},\n    {0xCE, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_CE] }}},\n    {0xCF, 1, X86InstInfo{\"IRET\",   TYPE_INST, FLAGS_SETS_RIP | FLAGS_BLOCK_END,                                                                                    0}},\n\n    {0xD4, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_D4] }}},\n    {0xD5, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_D5] }}},\n    {0xD6, 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Primary_ArchSelect_LUT[ENTRY_D6] }}},\n    {0xD7, 1, X86InstInfo{\"XLAT\",   TYPE_INST, FLAGS_DEBUG_MEM_ACCESS,                                                                           0}},\n\n    {0xE0, 1, X86InstInfo{\"LOOPNE\", TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_SF_SRC_RCX,                             1}},\n    {0xE1, 1, X86InstInfo{\"LOOPE\",  TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_SF_SRC_RCX,                             1}},\n    {0xE2, 1, X86InstInfo{\"LOOP\",   TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_SF_SRC_RCX,                             1}},\n    {0xE3, 1, X86InstInfo{\"JrCXZ\",  TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT ,                             1}},\n\n    // Should just throw GP\n    {0xE4, 2, X86InstInfo{\"IN\",     TYPE_INST, FLAGS_BLOCK_END,                                                                                                      1}},\n    {0xE6, 2, X86InstInfo{\"OUT\",    TYPE_INST, FLAGS_BLOCK_END,                                                                                                      1}},\n\n    {0xE8, 1, X86InstInfo{\"CALL\",   TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_BLOCK_END | FLAGS_CALL , 4}},\n    {0xE9, 1, X86InstInfo{\"JMP\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_BLOCK_END , 4}},\n    {0xEB, 1, X86InstInfo{\"JMP\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_BLOCK_END ,                             1}},\n\n    // Should just throw GP\n    {0xEC, 2, X86InstInfo{\"IN\",     TYPE_INST, FLAGS_BLOCK_END,             0}},\n    {0xEE, 2, X86InstInfo{\"OUT\",    TYPE_INST, FLAGS_BLOCK_END,             0}},\n\n    {0xF1, 1, X86InstInfo{\"INT1\",   TYPE_INST, FLAGS_BLOCK_END,               0}},\n    {0xF4, 1, X86InstInfo{\"HLT\",    TYPE_INST, FLAGS_BLOCK_END,               0}},\n    {0xF5, 1, X86InstInfo{\"CMC\",    TYPE_INST, FLAGS_NONE,                0}},\n    {0xF8, 1, X86InstInfo{\"CLC\",    TYPE_INST, FLAGS_NONE,                0}},\n    {0xF9, 1, X86InstInfo{\"STC\",    TYPE_INST, FLAGS_NONE,                0}},\n    {0xFA, 1, X86InstInfo{\"CLI\",    TYPE_INST, FLAGS_NONE,                0}},\n    {0xFB, 1, X86InstInfo{\"STI\",    TYPE_INST, FLAGS_NONE,                0}},\n    {0xFC, 1, X86InstInfo{\"CLD\",    TYPE_INST, FLAGS_NONE,                0}},\n    {0xFD, 1, X86InstInfo{\"STD\",    TYPE_INST, FLAGS_NONE,                0}},\n\n    // Two Byte table\n    {0x0F, 1, X86InstInfo{\"\",   TYPE_SECONDARY_TABLE_PREFIX, FLAGS_NONE,  0}},\n\n    // x87 table\n    {0xD8, 8, X86InstInfo{\"\",   TYPE_X87_TABLE_PREFIX, FLAGS_MODRM,        0}},\n\n    // ModRM table\n    // MoreBytes field repurposed for valid bits mask\n    {0x80, 1, X86InstInfo{\"\",   TYPE_GROUP_1, FLAGS_MODRM, 0}},\n    {0x81, 1, X86InstInfo{\"\",   TYPE_GROUP_1, FLAGS_MODRM, 1}},\n    {0x82, 1, X86InstInfo{\"\",   TYPE_GROUP_1, FLAGS_MODRM, 2}},\n    {0x83, 1, X86InstInfo{\"\",   TYPE_GROUP_1, FLAGS_MODRM, 3}},\n    {0xC0, 1, X86InstInfo{\"\",   TYPE_GROUP_2, FLAGS_MODRM, 0}},\n    {0xC1, 1, X86InstInfo{\"\",   TYPE_GROUP_2, FLAGS_MODRM, 1}},\n    {0xD0, 1, X86InstInfo{\"\",   TYPE_GROUP_2, FLAGS_MODRM, 2}},\n    {0xD1, 1, X86InstInfo{\"\",   TYPE_GROUP_2, FLAGS_MODRM, 3}},\n    {0xD2, 1, X86InstInfo{\"\",   TYPE_GROUP_2, FLAGS_MODRM, 4}},\n    {0xD3, 1, X86InstInfo{\"\",   TYPE_GROUP_2, FLAGS_MODRM, 5}},\n    {0xF6, 1, X86InstInfo{\"\",   TYPE_GROUP_3, FLAGS_MODRM, 0}},\n    {0xF7, 1, X86InstInfo{\"\",   TYPE_GROUP_3, FLAGS_MODRM, 1}},\n    {0xFE, 1, X86InstInfo{\"\",   TYPE_GROUP_4, FLAGS_MODRM, 0}},\n    {0xFF, 1, X86InstInfo{\"\",   TYPE_GROUP_5, FLAGS_MODRM, 0}},\n\n    // Group 11\n    {0xC6, 1, X86InstInfo{\"\",   TYPE_GROUP_11, FLAGS_MODRM, 0}},\n    {0xC7, 1, X86InstInfo{\"\",   TYPE_GROUP_11, FLAGS_MODRM, 1}},\n\n    // VEX table\n    {0xC4, 2, X86InstInfo{\"\",   TYPE_VEX_TABLE_PREFIX, FLAGS_NONE, 0}},\n  };\n\n  GenerateTable(Table.data(), BaseOpTable, std::size(BaseOpTable));\n  IR::InstallToTable(Table, IR::OpDispatch_BaseOpTable);\n\n  return Table;\n}();\n\n}\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/X86Tables/DDDTables.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-tables\n$end_info$\n*/\n\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/Core/OpcodeDispatcher/DDDTables.h\"\n\n#include <iterator>\n\nnamespace FEXCore::X86Tables {\nusing namespace InstFlags;\n\nconstexpr std::array<X86InstInfo, MAX_3DNOW_TABLE_SIZE> DDDNowOps = []() consteval {\n  std::array<X86InstInfo, MAX_3DNOW_TABLE_SIZE> Table{};\n  constexpr U8U8InfoStruct DDDNowOpTable[] = {\n    {0x0C, 1, X86InstInfo{\"PI2FW\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0x0D, 1, X86InstInfo{\"PI2FD\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0x1C, 1, X86InstInfo{\"PF2IW\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0x1D, 1, X86InstInfo{\"PF2ID\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n\n    // Inverse 3DNow! These two instructions are Geode product line specific\n    // No CPUID for these, you're expected to read ID_CONFIG_MSR (1250h) bit 1\n    {0x86, 1, X86InstInfo{\"PFRCPV\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0x87, 1, X86InstInfo{\"PFRSQRTV\", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n\n    {0x8A, 1, X86InstInfo{\"PFNACC\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0x8E, 1, X86InstInfo{\"PFPNACC\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n\n    {0x90, 1, X86InstInfo{\"PFCMPGE\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0x94, 1, X86InstInfo{\"PFMIN\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0x96, 1, X86InstInfo{\"PFRCP\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0x97, 1, X86InstInfo{\"PFRSQRT\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n\n    {0x9A, 1, X86InstInfo{\"PFSUB\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0x9E, 1, X86InstInfo{\"PFADD\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n\n    {0xA0, 1, X86InstInfo{\"PFCMPGT\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0xA4, 1, X86InstInfo{\"PFMAX\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0xA6, 1, X86InstInfo{\"PFRCPIT1\", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0xA7, 1, X86InstInfo{\"PFRSQIT1\", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n\n    {0xAA, 1, X86InstInfo{\"PFSUBR\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0xAE, 1, X86InstInfo{\"PFACC\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n\n    {0xB0, 1, X86InstInfo{\"PFCMPEQ\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0xB4, 1, X86InstInfo{\"PFMUL\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0xB6, 1, X86InstInfo{\"PFRCPIT2\", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0xB7, 1, X86InstInfo{\"PMULHRW\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n\n    {0xBB, 1, X86InstInfo{\"PSWAPD\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0xBF, 1, X86InstInfo{\"PAVGUSB\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n  };\n\n  GenerateTable(Table.data(), DDDNowOpTable, std::size(DDDNowOpTable));\n\n  IR::InstallToTable(Table, IR::OpDispatch_DDDTable);\n  return Table;\n}();\n\n}\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/X86Tables/H0F38Tables.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-tables\n$end_info$\n*/\n\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/Core/OpcodeDispatcher/H0F38Tables.h\"\n\n#include <iterator>\n#include <stdint.h>\n\nnamespace FEXCore::X86Tables {\nusing namespace InstFlags;\nconstexpr std::array<X86InstInfo, MAX_0F_38_TABLE_SIZE> H0F38TableOps = []() consteval {\n  std::array<X86InstInfo, MAX_0F_38_TABLE_SIZE> Table{};\n\n#define OPD(prefix, opcode) (((prefix) << 8) | opcode)\n  constexpr uint16_t PF_38_NONE = 0;\n  constexpr uint16_t PF_38_66   = (1U << 0);\n  constexpr uint16_t PF_38_F2   = (1U << 1);\n  constexpr uint16_t PF_38_F3   = (1U << 2);\n\n  constexpr U16U8InfoStruct H0F38Table[] = {\n    {OPD(PF_38_NONE, 0x00), 1, X86InstInfo{\"PSHUFB\",     TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {OPD(PF_38_66,   0x00), 1, X86InstInfo{\"PSHUFB\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0x01), 1, X86InstInfo{\"PHADDW\",     TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {OPD(PF_38_66,   0x01), 1, X86InstInfo{\"PHADDW\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0x02), 1, X86InstInfo{\"PHADDD\",     TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {OPD(PF_38_66,   0x02), 1, X86InstInfo{\"PHADDD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0x03), 1, X86InstInfo{\"PHADDSW\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {OPD(PF_38_66,   0x03), 1, X86InstInfo{\"PHADDSW\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0x04), 1, X86InstInfo{\"PMADDUBSW\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {OPD(PF_38_66,   0x04), 1, X86InstInfo{\"PMADDUBSW\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0x05), 1, X86InstInfo{\"PHSUBW\",     TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {OPD(PF_38_66,   0x05), 1, X86InstInfo{\"PHSUBW\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0x06), 1, X86InstInfo{\"PHSUBD\",     TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {OPD(PF_38_66,   0x06), 1, X86InstInfo{\"PHSUBD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0x07), 1, X86InstInfo{\"PHSUBSW\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {OPD(PF_38_66,   0x07), 1, X86InstInfo{\"PHSUBSW\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0x08), 1, X86InstInfo{\"PSIGNB\",     TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {OPD(PF_38_66,   0x08), 1, X86InstInfo{\"PSIGNB\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0x09), 1, X86InstInfo{\"PSIGNW\",     TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {OPD(PF_38_66,   0x09), 1, X86InstInfo{\"PSIGNW\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0x0A), 1, X86InstInfo{\"PSIGND\",     TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {OPD(PF_38_66,   0x0A), 1, X86InstInfo{\"PSIGND\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0x0B), 1, X86InstInfo{\"PMULHRSW\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {OPD(PF_38_66,   0x0B), 1, X86InstInfo{\"PMULHRSW\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(PF_38_66,   0x10), 1, X86InstInfo{\"PBLENDVB\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x14), 1, X86InstInfo{\"BLENDVPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x15), 1, X86InstInfo{\"BLENDVPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x17), 1, X86InstInfo{\"PTEST\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0x1C), 1, X86InstInfo{\"PABSB\",      TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {OPD(PF_38_66,   0x1C), 1, X86InstInfo{\"PABSB\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0x1D), 1, X86InstInfo{\"PABSW\",      TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {OPD(PF_38_66,   0x1D), 1, X86InstInfo{\"PABSW\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0x1E), 1, X86InstInfo{\"PABSD\",      TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {OPD(PF_38_66,   0x1E), 1, X86InstInfo{\"PABSD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(PF_38_66,   0x20), 1, X86InstInfo{\"PMOVSXBW\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x21), 1, X86InstInfo{\"PMOVSXBD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x22), 1, X86InstInfo{\"PMOVSXBQ\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_16BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x23), 1, X86InstInfo{\"PMOVSXWD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x24), 1, X86InstInfo{\"PMOVSXWQ\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x25), 1, X86InstInfo{\"PMOVSXDQ\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x28), 1, X86InstInfo{\"PMULDQ\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x29), 1, X86InstInfo{\"PCMPEQQ\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x2A), 1, X86InstInfo{\"MOVNTDQA\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x2B), 1, X86InstInfo{\"PACKUSDW\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(PF_38_66,   0x30), 1, X86InstInfo{\"PMOVZXBW\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x31), 1, X86InstInfo{\"PMOVZXBD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x32), 1, X86InstInfo{\"PMOVZXBQ\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_16BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x33), 1, X86InstInfo{\"PMOVZXWD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x34), 1, X86InstInfo{\"PMOVZXWQ\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x35), 1, X86InstInfo{\"PMOVZXDQ\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x37), 1, X86InstInfo{\"PCMPGTQ\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x38), 1, X86InstInfo{\"PMINSB\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x39), 1, X86InstInfo{\"PMINSD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x3A), 1, X86InstInfo{\"PMINUW\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x3B), 1, X86InstInfo{\"PMINUD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x3C), 1, X86InstInfo{\"PMAXSB\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x3D), 1, X86InstInfo{\"PMAXSD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x3E), 1, X86InstInfo{\"PMAXUW\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x3F), 1, X86InstInfo{\"PMAXUD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(PF_38_66,   0x40), 1, X86InstInfo{\"PMULLD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0x41), 1, X86InstInfo{\"PHMINPOSUW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(PF_38_NONE, 0xC8), 1, X86InstInfo{\"SHA1NEXTE\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0xC9), 1, X86InstInfo{\"SHA1MSG1\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0xCA), 1, X86InstInfo{\"SHA1MSG2\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(PF_38_NONE, 0xCB), 1, X86InstInfo{\"SHA256RNDS2\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0xCC), 1, X86InstInfo{\"SHA256MSG1\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_NONE, 0xCD), 1, X86InstInfo{\"SHA256MSG2\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(PF_38_66,   0xDB), 1, X86InstInfo{\"AESIMC\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0xDC), 1, X86InstInfo{\"AESENC\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0xDD), 1, X86InstInfo{\"AESENCLAST\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0xDE), 1, X86InstInfo{\"AESDEC\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(PF_38_66,   0xDF), 1, X86InstInfo{\"AESDECLAST\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(PF_38_NONE, 0xF0), 1, X86InstInfo{\"MOVBE\",      TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(PF_38_NONE, 0xF1), 1, X86InstInfo{\"MOVBE\",      TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_MEM_ONLY, 0}},\n\n    {OPD(PF_38_66, 0xF0), 1, X86InstInfo{\"MOVBE\",      TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(PF_38_66, 0xF1), 1, X86InstInfo{\"MOVBE\",      TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_MEM_ONLY, 0}},\n\n    {OPD(PF_38_F2,   0xF0), 1, X86InstInfo{\"CRC32\",      TYPE_INST, GenFlagsSizes(SIZE_DEF, SIZE_8BIT) | FLAGS_MODRM, 0}},\n    {OPD(PF_38_F2,   0xF1), 1, X86InstInfo{\"CRC32\",      TYPE_INST, FLAGS_MODRM, 0}},\n    {OPD(PF_38_66 | PF_38_F2,   0xF0), 1, X86InstInfo{\"CRC32\",      TYPE_INST, GenFlagsSizes(SIZE_DEF, SIZE_8BIT) | FLAGS_MODRM, 0}},\n    {OPD(PF_38_66 | PF_38_F2,   0xF1), 1, X86InstInfo{\"CRC32\",      TYPE_INST, FLAGS_MODRM, 0}},\n\n    {OPD(PF_38_66,   0xF6), 1, X86InstInfo{\"ADCX\",       TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY66, 0}},\n    {OPD(PF_38_F3,   0xF6), 1, X86InstInfo{\"ADOX\",       TYPE_INST, FLAGS_MODRM, 0}},\n  };\n#undef OPD\n\n  GenerateTable(Table.data(), H0F38Table, std::size(H0F38Table));\n\n  IR::InstallToTable(Table, IR::OpDispatch_H0F38Table);\n  return Table;\n}();\n\n}\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/X86Tables/H0F3ATables.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-tables\n$end_info$\n*/\n\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/Core/OpcodeDispatcher/H0F3ATables.h\"\n\n#include <FEXCore/Core/Context.h>\n\n#include <iterator>\n#include <stdint.h>\n\nnamespace FEXCore::X86Tables {\nusing namespace InstFlags;\n#define OPD(REX, prefix, opcode) ((REX << 9) | (prefix << 8) | opcode)\nconstexpr uint16_t PF_3A_NONE = 0;\nconstexpr uint16_t PF_3A_66   = 1;\n\nenum H0F3A_LUT {\n  ENTRY_1_3A_66_16,\n  ENTRY_1_3A_66_22,\n  ENTRY_MAX,\n};\n\nconstexpr std::array<X86InstInfo[2], ENTRY_MAX> H0F3A_ArchSelect_LUT = {{\n  // ENTRY_1_3A_66_16\n  {\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n    {\"PEXTRQ\",          TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_DST_GPR | FLAGS_XMM_FLAGS, 1, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::PExtrOp, IR::OpSize::i64Bit> }},\n  },\n  // ENTRY_1_3A_66_22\n  {\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n    {\"PINSRQ\",          TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_SRC_GPR, 1, { .OpDispatch = &IR::OpDispatchBuilder::PINSROp<IR::OpSize::i64Bit> }},\n  },\n}};\n\nconstexpr std::array<X86InstInfo, MAX_0F_3A_TABLE_SIZE> H0F3ATableOps = []() consteval {\n  std::array<X86InstInfo, MAX_0F_3A_TABLE_SIZE> Table{};\n  auto TableGen = []<uint16_t REX>() consteval {\n    constexpr U16U8InfoStruct Table[] = {\n      {OPD(REX, PF_3A_NONE, 0x0F), 1, X86InstInfo{\"PALIGNR\",         TYPE_INST, GenFlagsSameSize(SIZE_64BIT)  | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 1}},\n      {OPD(REX, PF_3A_66,   0x08), 1, X86InstInfo{\"ROUNDPS\",         TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n      {OPD(REX, PF_3A_66,   0x09), 1, X86InstInfo{\"ROUNDPD\",         TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n      {OPD(REX, PF_3A_66,   0x0A), 1, X86InstInfo{\"ROUNDSS\",         TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n      {OPD(REX, PF_3A_66,   0x0B), 1, X86InstInfo{\"ROUNDSD\",         TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n      {OPD(REX, PF_3A_66,   0x0C), 1, X86InstInfo{\"BLENDPS\",         TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,           1}},\n      {OPD(REX, PF_3A_66,   0x0D), 1, X86InstInfo{\"BLENDPD\",         TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,           1}},\n      {OPD(REX, PF_3A_66,   0x0E), 1, X86InstInfo{\"PBLENDW\",         TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,           1}},\n      {OPD(REX, PF_3A_66,   0x0F), 1, X86InstInfo{\"PALIGNR\",         TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n\n      {OPD(REX, PF_3A_66,   0x14), 1, X86InstInfo{\"PEXTRB\",          TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_DST_GPR | FLAGS_XMM_FLAGS, 1}},\n      {OPD(REX, PF_3A_66,   0x15), 1, X86InstInfo{\"PEXTRW\",          TYPE_INST, GenFlagsSizes(SIZE_16BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_DST_GPR | FLAGS_XMM_FLAGS, 1}},\n      {OPD(REX, PF_3A_66,   0x17), 1, X86InstInfo{\"EXTRACTPS\",       TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_DST_GPR | FLAGS_XMM_FLAGS, 1}},\n\n      {OPD(REX, PF_3A_66,   0x20), 1, X86InstInfo{\"PINSRB\",          TYPE_INST, GenFlagsDstSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_SRC_GPR,           1}},\n      {OPD(REX, PF_3A_66,   0x21), 1, X86InstInfo{\"INSERTPS\",        TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,           1}},\n      {OPD(REX, PF_3A_66,   0x40), 1, X86InstInfo{\"DPPS\",            TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n      {OPD(REX, PF_3A_66,   0x41), 1, X86InstInfo{\"DPPD\",            TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n      {OPD(REX, PF_3A_66,   0x42), 1, X86InstInfo{\"MPSADBW\",         TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n      {OPD(REX, PF_3A_66,   0x44), 1, X86InstInfo{\"PCLMULQDQ\",       TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n\n      {OPD(REX, PF_3A_66,   0x60), 1, X86InstInfo{\"PCMPESTRM\",       TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n      {OPD(REX, PF_3A_66,   0x61), 1, X86InstInfo{\"PCMPESTRI\",       TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n      {OPD(REX, PF_3A_66,   0x62), 1, X86InstInfo{\"PCMPISTRM\",       TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n      {OPD(REX, PF_3A_66,   0x63), 1, X86InstInfo{\"PCMPISTRI\",       TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n\n      {OPD(REX, PF_3A_NONE, 0xCC), 1, X86InstInfo{\"SHA1RNDS4\",       TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n\n      {OPD(REX, PF_3A_66,   0xDF), 1, X86InstInfo{\"AESKEYGENASSIST\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n    };\n    return std::to_array(Table);\n  };\n  constexpr auto H0F3ATable_IgnoresREX0 = TableGen.template operator()<0>();\n  constexpr auto H0F3ATable_IgnoresREX1 = TableGen.template operator()<1>();\n\n  GenerateTable(Table.data(), H0F3ATable_IgnoresREX0.data(), H0F3ATable_IgnoresREX0.size());\n  GenerateTable(Table.data(), H0F3ATable_IgnoresREX1.data(), H0F3ATable_IgnoresREX1.size());\n\n  constexpr U16U8InfoStruct TableNeedsREX0[] = {\n    {OPD(0, PF_3A_66,   0x16), 1, X86InstInfo{\"PEXTRD\",          TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_DST_GPR | FLAGS_XMM_FLAGS, 1}},\n    {OPD(0, PF_3A_66,   0x22), 1, X86InstInfo{\"PINSRD\",          TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_SRC_GPR,           1}},\n  };\n  GenerateTable(Table.data(), TableNeedsREX0, std::size(TableNeedsREX0));\n\n  constexpr U16U8InfoStruct TableNeedsREX1[] = {\n    {OPD(1, PF_3A_66,   0x16), 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = H0F3A_ArchSelect_LUT[ENTRY_1_3A_66_16] }}},\n    {OPD(1, PF_3A_66,   0x22), 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = H0F3A_ArchSelect_LUT[ENTRY_1_3A_66_22] }}},\n  };\n  GenerateTable(Table.data(), TableNeedsREX1, std::size(TableNeedsREX1));\n\n  IR::InstallToTable(Table, IR::OpDispatch_H0F3ATableIgnoreREX);\n  IR::InstallToTable(Table, IR::OpDispatch_H0F3ATableNeedsREX0);\n\n  return Table;\n}();\n}\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/X86Tables/PrimaryGroupTables.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-tables\n$end_info$\n*/\n\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/Core/OpcodeDispatcher/PrimaryGroupTables.h\"\n\n#include <FEXCore/Core/Context.h>\n\n#include <iterator>\n\nnamespace FEXCore::X86Tables {\nusing namespace InstFlags;\nenum PrimaryGroup_LUT {\n  ENTRY_1_82_0,\n  ENTRY_1_82_1,\n  ENTRY_1_82_2,\n  ENTRY_1_82_3,\n  ENTRY_1_82_4,\n  ENTRY_1_82_5,\n  ENTRY_1_82_6,\n  ENTRY_1_82_7,\n  ENTRY_MAX,\n};\n\nconstexpr std::array<X86InstInfo[2], ENTRY_MAX> PrimaryGroup_ArchSelect_LUT = {{\n  {\n    {\"ADD\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST, 1, { .OpDispatch = &IR::OpDispatchBuilder::SecondaryALUOp }},\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  {\n    {\"OR\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST, 1, { .OpDispatch = &IR::OpDispatchBuilder::SecondaryALUOp }},\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  {\n    {\"ADC\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST, 1, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::ADCOp, 1> }},\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  {\n    {\"SBB\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST, 1, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::SBBOp, 1> }},\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  {\n    {\"AND\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST, 1, { .OpDispatch = &IR::OpDispatchBuilder::SecondaryALUOp }},\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  {\n    {\"SUB\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST, 1, { .OpDispatch = &IR::OpDispatchBuilder::SecondaryALUOp }},\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  {\n    {\"XOR\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST, 1, { .OpDispatch = &IR::OpDispatchBuilder::SecondaryALUOp }},\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n  {\n    {\"CMP\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST, 1, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::CMPOp, 1> }},\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n  },\n}};\n\nconstexpr std::array<X86InstInfo, MAX_INST_GROUP_TABLE_SIZE> PrimaryInstGroupOps = []() consteval {\n  std::array<X86InstInfo, MAX_INST_GROUP_TABLE_SIZE> Table{};\n#define OPD(group, prefix, Reg) (((group - FEXCore::X86Tables::TYPE_GROUP_1) << 6) | (prefix) << 3 | (Reg))\n  constexpr U16U8InfoStruct PrimaryGroupOpTable[] = {\n    // GROUP_1 | 0x80 | reg\n    {OPD(TYPE_GROUP_1, OpToIndex(0x80), 0), 1, X86InstInfo{\"ADD\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x80), 1), 1, X86InstInfo{\"OR\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x80), 2), 1, X86InstInfo{\"ADC\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x80), 3), 1, X86InstInfo{\"SBB\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x80), 4), 1, X86InstInfo{\"AND\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x80), 5), 1, X86InstInfo{\"SUB\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x80), 6), 1, X86InstInfo{\"XOR\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x80), 7), 1, X86InstInfo{\"CMP\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n\n    {OPD(TYPE_GROUP_1, OpToIndex(0x81), 0), 1, X86InstInfo{\"ADD\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SRC_SEXT64BIT | FLAGS_DISPLACE_SIZE_DIV_2,                          4}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x81), 1), 1, X86InstInfo{\"OR\",   TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SRC_SEXT64BIT | FLAGS_DISPLACE_SIZE_DIV_2,                          4}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x81), 2), 1, X86InstInfo{\"ADC\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SRC_SEXT64BIT | FLAGS_DISPLACE_SIZE_DIV_2,                          4}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x81), 3), 1, X86InstInfo{\"SBB\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SRC_SEXT64BIT | FLAGS_DISPLACE_SIZE_DIV_2,                          4}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x81), 4), 1, X86InstInfo{\"AND\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SRC_SEXT64BIT | FLAGS_DISPLACE_SIZE_DIV_2,                          4}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x81), 5), 1, X86InstInfo{\"SUB\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SRC_SEXT64BIT | FLAGS_DISPLACE_SIZE_DIV_2,                          4}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x81), 6), 1, X86InstInfo{\"XOR\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SRC_SEXT64BIT | FLAGS_DISPLACE_SIZE_DIV_2,                          4}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x81), 7), 1, X86InstInfo{\"CMP\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SRC_SEXT64BIT | FLAGS_DISPLACE_SIZE_DIV_2,                          4}},\n\n    // Duplicates the 0x80 opcode group\n    {OPD(TYPE_GROUP_1, OpToIndex(0x82), 0), 1, X86InstInfo{\"\",  TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = PrimaryGroup_ArchSelect_LUT[ENTRY_1_82_0] }}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x82), 1), 1, X86InstInfo{\"\",  TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = PrimaryGroup_ArchSelect_LUT[ENTRY_1_82_1] }}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x82), 2), 1, X86InstInfo{\"\",  TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = PrimaryGroup_ArchSelect_LUT[ENTRY_1_82_2] }}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x82), 3), 1, X86InstInfo{\"\",  TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = PrimaryGroup_ArchSelect_LUT[ENTRY_1_82_3] }}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x82), 4), 1, X86InstInfo{\"\",  TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = PrimaryGroup_ArchSelect_LUT[ENTRY_1_82_4] }}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x82), 5), 1, X86InstInfo{\"\",  TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = PrimaryGroup_ArchSelect_LUT[ENTRY_1_82_5] }}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x82), 6), 1, X86InstInfo{\"\",  TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = PrimaryGroup_ArchSelect_LUT[ENTRY_1_82_6] }}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x82), 7), 1, X86InstInfo{\"\",  TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = PrimaryGroup_ArchSelect_LUT[ENTRY_1_82_7] }}},\n\n    {OPD(TYPE_GROUP_1, OpToIndex(0x83), 0), 1, X86InstInfo{\"ADD\",  TYPE_INST, FLAGS_SRC_SEXT | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                     1}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x83), 1), 1, X86InstInfo{\"OR\",   TYPE_INST, FLAGS_SRC_SEXT | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                     1}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x83), 2), 1, X86InstInfo{\"ADC\",  TYPE_INST, FLAGS_SRC_SEXT | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                     1}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x83), 3), 1, X86InstInfo{\"SBB\",  TYPE_INST, FLAGS_SRC_SEXT | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                     1}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x83), 4), 1, X86InstInfo{\"AND\",  TYPE_INST, FLAGS_SRC_SEXT | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                     1}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x83), 5), 1, X86InstInfo{\"SUB\",  TYPE_INST, FLAGS_SRC_SEXT | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                     1}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x83), 6), 1, X86InstInfo{\"XOR\",  TYPE_INST, FLAGS_SRC_SEXT | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                     1}},\n    {OPD(TYPE_GROUP_1, OpToIndex(0x83), 7), 1, X86InstInfo{\"CMP\",  TYPE_INST, FLAGS_SRC_SEXT | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                     1}},\n\n    // GROUP 2\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC0), 0), 1, X86InstInfo{\"ROL\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC0), 1), 1, X86InstInfo{\"ROR\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC0), 2), 1, X86InstInfo{\"RCL\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC0), 3), 1, X86InstInfo{\"RCR\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC0), 4), 1, X86InstInfo{\"SHL\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC0), 5), 1, X86InstInfo{\"SHR\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC0), 6), 1, X86InstInfo{\"SHL\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC0), 7), 1, X86InstInfo{\"SAR\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC1), 0), 1, X86InstInfo{\"ROL\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      1}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC1), 1), 1, X86InstInfo{\"ROR\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      1}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC1), 2), 1, X86InstInfo{\"RCL\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      1}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC1), 3), 1, X86InstInfo{\"RCR\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      1}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC1), 4), 1, X86InstInfo{\"SHL\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      1}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC1), 5), 1, X86InstInfo{\"SHR\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      1}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC1), 6), 1, X86InstInfo{\"SHL\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      1}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xC1), 7), 1, X86InstInfo{\"SAR\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      1}},\n\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD0), 0), 1, X86InstInfo{\"ROL\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD0), 1), 1, X86InstInfo{\"ROR\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD0), 2), 1, X86InstInfo{\"RCL\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD0), 3), 1, X86InstInfo{\"RCR\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD0), 4), 1, X86InstInfo{\"SHL\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD0), 5), 1, X86InstInfo{\"SHR\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD0), 6), 1, X86InstInfo{\"SHL\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD0), 7), 1, X86InstInfo{\"SAR\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      0}},\n\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD1), 0), 1, X86InstInfo{\"ROL\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD1), 1), 1, X86InstInfo{\"ROR\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD1), 2), 1, X86InstInfo{\"RCL\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD1), 3), 1, X86InstInfo{\"RCR\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD1), 4), 1, X86InstInfo{\"SHL\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD1), 5), 1, X86InstInfo{\"SHR\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD1), 6), 1, X86InstInfo{\"SHL\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD1), 7), 1, X86InstInfo{\"SAR\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      0}},\n\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD2), 0), 1, X86InstInfo{\"ROL\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                   0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD2), 1), 1, X86InstInfo{\"ROR\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                   0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD2), 2), 1, X86InstInfo{\"RCL\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                   0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD2), 3), 1, X86InstInfo{\"RCR\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                   0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD2), 4), 1, X86InstInfo{\"SHL\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                   0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD2), 5), 1, X86InstInfo{\"SHR\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                   0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD2), 6), 1, X86InstInfo{\"SHL\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                   0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD2), 7), 1, X86InstInfo{\"SAR\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                   0}},\n\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD3), 0), 1, X86InstInfo{\"ROL\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                                   0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD3), 1), 1, X86InstInfo{\"ROR\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                                   0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD3), 2), 1, X86InstInfo{\"RCL\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                                   0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD3), 3), 1, X86InstInfo{\"RCR\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                                   0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD3), 4), 1, X86InstInfo{\"SHL\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                                   0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD3), 5), 1, X86InstInfo{\"SHR\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                                   0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD3), 6), 1, X86InstInfo{\"SHL\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                                   0}},\n    {OPD(TYPE_GROUP_2, OpToIndex(0xD3), 7), 1, X86InstInfo{\"SAR\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX,                                   0}},\n\n    // GROUP 3\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF6), 0), 1, X86InstInfo{\"TEST\", TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF6), 1), 1, X86InstInfo{\"TEST\", TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      1}},\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF6), 2), 1, X86InstInfo{\"NOT\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      0}},\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF6), 3), 1, X86InstInfo{\"NEG\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      0}},\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF6), 4), 1, X86InstInfo{\"MUL\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      0}},\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF6), 5), 1, X86InstInfo{\"IMUL\", TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      0}},\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF6), 6), 1, X86InstInfo{\"DIV\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      0}},\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF6), 7), 1, X86InstInfo{\"IDIV\", TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                      0}},\n\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF7), 0), 1, X86InstInfo{\"TEST\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SRC_SEXT64BIT | FLAGS_DISPLACE_SIZE_DIV_2,                          4}},\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF7), 1), 1, X86InstInfo{\"TEST\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SRC_SEXT64BIT | FLAGS_DISPLACE_SIZE_DIV_2,                          4}},\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF7), 2), 1, X86InstInfo{\"NOT\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      0}},\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF7), 3), 1, X86InstInfo{\"NEG\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      0}},\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF7), 4), 1, X86InstInfo{\"MUL\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      0}},\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF7), 5), 1, X86InstInfo{\"IMUL\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      0}},\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF7), 6), 1, X86InstInfo{\"DIV\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      0}},\n    {OPD(TYPE_GROUP_3, OpToIndex(0xF7), 7), 1, X86InstInfo{\"IDIV\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                      0}},\n\n    // GROUP 4\n    {OPD(TYPE_GROUP_4, OpToIndex(0xFE), 0), 1, X86InstInfo{\"INC\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                     0}},\n    {OPD(TYPE_GROUP_4, OpToIndex(0xFE), 1), 1, X86InstInfo{\"DEC\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                     0}},\n    {OPD(TYPE_GROUP_4, OpToIndex(0xFE), 2), 6, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                                       0}},\n\n    // GROUP 5\n    {OPD(TYPE_GROUP_5, OpToIndex(0xFF), 0), 1, X86InstInfo{\"INC\",   TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                     0}},\n    {OPD(TYPE_GROUP_5, OpToIndex(0xFF), 1), 1, X86InstInfo{\"DEC\",   TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                     0}},\n    {OPD(TYPE_GROUP_5, OpToIndex(0xFF), 2), 1, X86InstInfo{\"CALL\",  TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_MODRM | FLAGS_BLOCK_END | FLAGS_CALL , 0}},\n    {OPD(TYPE_GROUP_5, OpToIndex(0xFF), 3), 1, X86InstInfo{\"CALLF\", TYPE_INST, FLAGS_SETS_RIP | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_MEM_ONLY | FLAGS_BLOCK_END,                  0}},\n    {OPD(TYPE_GROUP_5, OpToIndex(0xFF), 4), 1, X86InstInfo{\"JMP\",   TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_MODRM | FLAGS_BLOCK_END , 0}},\n    {OPD(TYPE_GROUP_5, OpToIndex(0xFF), 5), 1, X86InstInfo{\"JMPF\",  TYPE_INST, FLAGS_SETS_RIP | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_MEM_ONLY | FLAGS_BLOCK_END,                  0}},\n    {OPD(TYPE_GROUP_5, OpToIndex(0xFF), 6), 1, X86InstInfo{\"PUSH\",  TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_MODRM,                                                     0}},\n    {OPD(TYPE_GROUP_5, OpToIndex(0xFF), 7), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                                       0}},\n\n    // GROUP 11\n    {OPD(TYPE_GROUP_11, OpToIndex(0xC6), 0), 1, X86InstInfo{\"MOV\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST  | FLAGS_SRC_SEXT,                   1}},\n    {OPD(TYPE_GROUP_11, OpToIndex(0xC6), 1), 5, X86InstInfo{\"\",     TYPE_INVALID, FLAGS_NONE,                                                       0}},\n    {OPD(TYPE_GROUP_11, OpToIndex(0xC6), 7), 1, X86InstInfo{\"XABORT\", TYPE_INST, FLAGS_MODRM,                                                       1}},\n    {OPD(TYPE_GROUP_11, OpToIndex(0xC7), 0), 1, X86InstInfo{\"MOV\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2,                                   4}},\n    {OPD(TYPE_GROUP_11, OpToIndex(0xC7), 1), 5, X86InstInfo{\"\",     TYPE_INVALID, FLAGS_NONE,                                                       0}},\n    {OPD(TYPE_GROUP_11, OpToIndex(0xC7), 7), 1, X86InstInfo{\"XBEGIN\", TYPE_INST, FLAGS_MODRM | FLAGS_SRC_SEXT | FLAGS_SETS_RIP | FLAGS_DISPLACE_SIZE_DIV_2,                                                       4}},\n  };\n\n  GenerateTable(Table.data(), PrimaryGroupOpTable, std::size(PrimaryGroupOpTable));\n\n  IR::InstallToTable(Table, IR::OpDispatch_PrimaryGroupTables);\n  return Table;\n}();\n\n}\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/X86Tables/SecondaryGroupTables.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-tables\n$end_info$\n*/\n\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/Core/OpcodeDispatcher/SecondaryGroupTables.h\"\n\n#include <iterator>\n#include <stdint.h>\n\nnamespace FEXCore::X86Tables {\nusing namespace InstFlags;\nconstexpr uint16_t PF_NONE = 0;\nconstexpr uint16_t PF_F3   = 1;\nconstexpr uint16_t PF_66   = 2;\nconstexpr uint16_t PF_F2   = 3;\n#define OPD(group, prefix, Reg) (((group - FEXCore::X86Tables::TYPE_GROUP_6) << 5) | (prefix) << 3 | (Reg))\n\nenum SecondGroup_LUT {\n  ENTRY_15_F3_0,\n  ENTRY_15_F3_1,\n  ENTRY_15_F3_2,\n  ENTRY_15_F3_3,\n  ENTRY_MAX,\n};\n\nconstexpr std::array<X86InstInfo[2], ENTRY_MAX> SecondGroup_ArchSelect_LUT = {{\n  // ENTRY_15_F3_0\n  {\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n    {\"RDFSBASE\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::ReadSegmentReg, IR::OpDispatchBuilder::Segment::FS> } },\n  },\n  // ENTRY_15_F3_1\n  {\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n    {\"RDGSBASE\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::ReadSegmentReg, IR::OpDispatchBuilder::Segment::GS> } },\n  },\n  // ENTRY_15_F3_2\n  {\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n    {\"WRFSBASE\", TYPE_INST, GenFlagsDstSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::WriteSegmentReg, IR::OpDispatchBuilder::Segment::FS> } },\n  },\n  // ENTRY_15_F3_3\n  {\n    {\"\", TYPE_INVALID, FLAGS_NONE, 0, { .OpDispatch = nullptr } },\n    {\"WRGSBASE\", TYPE_INST, GenFlagsDstSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::WriteSegmentReg, IR::OpDispatchBuilder::Segment::GS> } },\n  },\n}};\n\nconstexpr std::array<X86InstInfo, MAX_INST_SECOND_GROUP_TABLE_SIZE> SecondInstGroupOps = []() consteval {\n  std::array<X86InstInfo, MAX_INST_SECOND_GROUP_TABLE_SIZE> Table{};\n  constexpr U16U8InfoStruct SecondaryExtensionOpTable[] = {\n    // GROUP 1\n    // GROUP 2\n    // GROUP 3\n    // GROUP 4\n    // GROUP 5\n    // Pulls from other MODRM table\n\n    // GROUP 6\n    {OPD(TYPE_GROUP_6, PF_NONE, 0), 1, X86InstInfo{\"SLDT\",  TYPE_UNDEC, FLAGS_MODRM | FLAGS_SF_MOD_DST, 0}},\n    {OPD(TYPE_GROUP_6, PF_NONE, 1), 1, X86InstInfo{\"STR\",   TYPE_PRIV, FLAGS_MODRM | FLAGS_SF_MOD_DST,  0}},\n    {OPD(TYPE_GROUP_6, PF_NONE, 2), 1, X86InstInfo{\"LLDT\",  TYPE_PRIV, FLAGS_NONE,       0}},\n    {OPD(TYPE_GROUP_6, PF_NONE, 3), 1, X86InstInfo{\"LTR\",   TYPE_INST, FLAGS_NONE,       0}},\n    {OPD(TYPE_GROUP_6, PF_NONE, 4), 1, X86InstInfo{\"VERR\",  TYPE_UNDEC, FLAGS_MODRM, 0}},\n    {OPD(TYPE_GROUP_6, PF_NONE, 5), 1, X86InstInfo{\"VERW\",  TYPE_UNDEC, FLAGS_MODRM, 0}},\n    {OPD(TYPE_GROUP_6, PF_NONE, 6), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,    0}},\n    {OPD(TYPE_GROUP_6, PF_NONE, 7), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,    0}},\n\n    {OPD(TYPE_GROUP_6, PF_F3, 0), 1, X86InstInfo{\"SLDT\",    TYPE_UNDEC, FLAGS_MODRM | FLAGS_SF_MOD_DST, 0}},\n    {OPD(TYPE_GROUP_6, PF_F3, 1), 1, X86InstInfo{\"STR\",     TYPE_PRIV, FLAGS_MODRM | FLAGS_SF_MOD_DST,  0}},\n    {OPD(TYPE_GROUP_6, PF_F3, 2), 1, X86InstInfo{\"LLDT\",    TYPE_PRIV, FLAGS_NONE,       0}},\n    {OPD(TYPE_GROUP_6, PF_F3, 3), 1, X86InstInfo{\"LTR\",     TYPE_INST, FLAGS_NONE,       0}},\n    {OPD(TYPE_GROUP_6, PF_F3, 4), 1, X86InstInfo{\"VERR\",    TYPE_UNDEC, FLAGS_MODRM, 0}},\n    {OPD(TYPE_GROUP_6, PF_F3, 5), 1, X86InstInfo{\"VERW\",    TYPE_UNDEC, FLAGS_MODRM, 0}},\n    {OPD(TYPE_GROUP_6, PF_F3, 6), 1, X86InstInfo{\"\",        TYPE_INVALID, FLAGS_NONE,    0}},\n    {OPD(TYPE_GROUP_6, PF_F3, 7), 1, X86InstInfo{\"\",        TYPE_INVALID, FLAGS_NONE,    0}},\n\n    {OPD(TYPE_GROUP_6, PF_66, 0), 1, X86InstInfo{\"SLDT\",    TYPE_UNDEC, FLAGS_MODRM | FLAGS_SF_MOD_DST, 0}},\n    {OPD(TYPE_GROUP_6, PF_66, 1), 1, X86InstInfo{\"STR\",     TYPE_PRIV, FLAGS_MODRM | FLAGS_SF_MOD_DST,  0}},\n    {OPD(TYPE_GROUP_6, PF_66, 2), 1, X86InstInfo{\"LLDT\",    TYPE_PRIV, FLAGS_NONE,       0}},\n    {OPD(TYPE_GROUP_6, PF_66, 3), 1, X86InstInfo{\"LTR\",     TYPE_INST, FLAGS_NONE,       0}},\n    {OPD(TYPE_GROUP_6, PF_66, 4), 1, X86InstInfo{\"VERR\",    TYPE_UNDEC, FLAGS_MODRM, 0}},\n    {OPD(TYPE_GROUP_6, PF_66, 5), 1, X86InstInfo{\"VERW\",    TYPE_UNDEC, FLAGS_MODRM, 0}},\n    {OPD(TYPE_GROUP_6, PF_66, 6), 1, X86InstInfo{\"\",        TYPE_INVALID, FLAGS_NONE,    0}},\n    {OPD(TYPE_GROUP_6, PF_66, 7), 1, X86InstInfo{\"\",        TYPE_INVALID, FLAGS_NONE,    0}},\n\n    {OPD(TYPE_GROUP_6, PF_F2, 0), 1, X86InstInfo{\"SLDT\",    TYPE_UNDEC, FLAGS_MODRM | FLAGS_SF_MOD_DST, 0}},\n    {OPD(TYPE_GROUP_6, PF_F2, 1), 1, X86InstInfo{\"STR\",     TYPE_PRIV, FLAGS_MODRM | FLAGS_SF_MOD_DST,  0}},\n    {OPD(TYPE_GROUP_6, PF_F2, 2), 1, X86InstInfo{\"LLDT\",    TYPE_PRIV, FLAGS_NONE,       0}},\n    {OPD(TYPE_GROUP_6, PF_F2, 3), 1, X86InstInfo{\"LTR\",     TYPE_INST, FLAGS_NONE,       0}},\n    {OPD(TYPE_GROUP_6, PF_F2, 4), 1, X86InstInfo{\"VERR\",    TYPE_UNDEC, FLAGS_MODRM, 0}},\n    {OPD(TYPE_GROUP_6, PF_F2, 5), 1, X86InstInfo{\"VERW\",    TYPE_UNDEC, FLAGS_MODRM, 0}},\n    {OPD(TYPE_GROUP_6, PF_F2, 6), 1, X86InstInfo{\"\",        TYPE_INVALID, FLAGS_NONE,    0}},\n    {OPD(TYPE_GROUP_6, PF_F2, 7), 1, X86InstInfo{\"\",        TYPE_INVALID, FLAGS_NONE,    0}},\n\n    // GROUP 7\n    {OPD(TYPE_GROUP_7, PF_NONE, 0), 1, X86InstInfo{\"SGDT\", TYPE_SECOND_GROUP_MODRM, FLAGS_MODRM | FLAGS_SF_MOD_DST,         0}},\n    {OPD(TYPE_GROUP_7, PF_NONE, 1), 1, X86InstInfo{\"SIDT\", TYPE_SECOND_GROUP_MODRM, FLAGS_MODRM | FLAGS_SF_MOD_DST,         0}},\n    {OPD(TYPE_GROUP_7, PF_NONE, 2), 1, X86InstInfo{\"\",     TYPE_SECOND_GROUP_MODRM, FLAGS_NONE, 0}},\n    {OPD(TYPE_GROUP_7, PF_NONE, 3), 1, X86InstInfo{\"\",     TYPE_SECOND_GROUP_MODRM, FLAGS_NONE, 0}},\n    {OPD(TYPE_GROUP_7, PF_NONE, 4), 1, X86InstInfo{\"SMSW\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,          0}},\n    {OPD(TYPE_GROUP_7, PF_NONE, 5), 1, X86InstInfo{\"\",     TYPE_INVALID, FLAGS_NONE,            0}},\n    {OPD(TYPE_GROUP_7, PF_NONE, 6), 1, X86InstInfo{\"LMSW\", TYPE_INST, FLAGS_MODRM,          0}},\n    {OPD(TYPE_GROUP_7, PF_NONE, 7), 1, X86InstInfo{\"INVLPG\", TYPE_SECOND_GROUP_MODRM, FLAGS_MODRM | FLAGS_SF_MOD_DST, 0}},\n\n    {OPD(TYPE_GROUP_7, PF_F3, 0), 1, X86InstInfo{\"SGDT\", TYPE_SECOND_GROUP_MODRM, FLAGS_MODRM | FLAGS_SF_MOD_DST,           0}},\n    {OPD(TYPE_GROUP_7, PF_F3, 1), 1, X86InstInfo{\"SIDT\", TYPE_SECOND_GROUP_MODRM, FLAGS_MODRM | FLAGS_SF_MOD_DST,           0}},\n    {OPD(TYPE_GROUP_7, PF_F3, 2), 1, X86InstInfo{\"\",     TYPE_SECOND_GROUP_MODRM, FLAGS_NONE,   0}},\n    {OPD(TYPE_GROUP_7, PF_F3, 3), 1, X86InstInfo{\"\",     TYPE_SECOND_GROUP_MODRM, FLAGS_NONE,   0}},\n    {OPD(TYPE_GROUP_7, PF_F3, 4), 1, X86InstInfo{\"SMSW\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,            0}},\n    {OPD(TYPE_GROUP_7, PF_F3, 5), 1, X86InstInfo{\"\",     TYPE_INVALID, FLAGS_NONE,              0}},\n    {OPD(TYPE_GROUP_7, PF_F3, 6), 1, X86InstInfo{\"LMSW\", TYPE_INST, FLAGS_MODRM,            0}},\n    {OPD(TYPE_GROUP_7, PF_F3, 7), 1, X86InstInfo{\"INVLPG\", TYPE_SECOND_GROUP_MODRM, FLAGS_MODRM | FLAGS_SF_MOD_DST,   0}},\n\n    {OPD(TYPE_GROUP_7, PF_66, 0), 1, X86InstInfo{\"SGDT\", TYPE_SECOND_GROUP_MODRM, FLAGS_MODRM | FLAGS_SF_MOD_DST,           0}},\n    {OPD(TYPE_GROUP_7, PF_66, 1), 1, X86InstInfo{\"SIDT\", TYPE_SECOND_GROUP_MODRM, FLAGS_MODRM | FLAGS_SF_MOD_DST,           0}},\n    {OPD(TYPE_GROUP_7, PF_66, 2), 1, X86InstInfo{\"\",     TYPE_SECOND_GROUP_MODRM, FLAGS_NONE,   0}},\n    {OPD(TYPE_GROUP_7, PF_66, 3), 1, X86InstInfo{\"\",     TYPE_SECOND_GROUP_MODRM, FLAGS_NONE,   0}},\n    {OPD(TYPE_GROUP_7, PF_66, 4), 1, X86InstInfo{\"SMSW\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,            0}},\n    {OPD(TYPE_GROUP_7, PF_66, 5), 1, X86InstInfo{\"\",     TYPE_INVALID, FLAGS_NONE,              0}},\n    {OPD(TYPE_GROUP_7, PF_66, 6), 1, X86InstInfo{\"LMSW\", TYPE_INST, FLAGS_MODRM,            0}},\n    {OPD(TYPE_GROUP_7, PF_66, 7), 1, X86InstInfo{\"INVLPG\", TYPE_SECOND_GROUP_MODRM, FLAGS_MODRM | FLAGS_SF_MOD_DST,   0}},\n\n    {OPD(TYPE_GROUP_7, PF_F2, 0), 1, X86InstInfo{\"SGDT\", TYPE_SECOND_GROUP_MODRM, FLAGS_MODRM | FLAGS_SF_MOD_DST,           0}},\n    {OPD(TYPE_GROUP_7, PF_F2, 1), 1, X86InstInfo{\"SIDT\", TYPE_SECOND_GROUP_MODRM, FLAGS_MODRM | FLAGS_SF_MOD_DST,           0}},\n    {OPD(TYPE_GROUP_7, PF_F2, 2), 1, X86InstInfo{\"\",     TYPE_SECOND_GROUP_MODRM, FLAGS_NONE,   0}},\n    {OPD(TYPE_GROUP_7, PF_F2, 3), 1, X86InstInfo{\"\",     TYPE_SECOND_GROUP_MODRM, FLAGS_NONE,   0}},\n    {OPD(TYPE_GROUP_7, PF_F2, 4), 1, X86InstInfo{\"SMSW\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,            0}},\n    {OPD(TYPE_GROUP_7, PF_F2, 5), 1, X86InstInfo{\"\",     TYPE_INVALID, FLAGS_NONE,              0}},\n    {OPD(TYPE_GROUP_7, PF_F2, 6), 1, X86InstInfo{\"LMSW\", TYPE_INST, FLAGS_MODRM,            0}},\n    {OPD(TYPE_GROUP_7, PF_F2, 7), 1, X86InstInfo{\"INVLPG\", TYPE_SECOND_GROUP_MODRM, FLAGS_MODRM | FLAGS_SF_MOD_DST,   0}},\n\n    // GROUP 8\n    {OPD(TYPE_GROUP_8, PF_NONE, 0), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,   0}},\n    {OPD(TYPE_GROUP_8, PF_NONE, 1), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,   0}},\n    {OPD(TYPE_GROUP_8, PF_NONE, 2), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,   0}},\n    {OPD(TYPE_GROUP_8, PF_NONE, 3), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,   0}},\n    {OPD(TYPE_GROUP_8, PF_NONE, 4), 1, X86InstInfo{\"BT\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST, 1}},\n    {OPD(TYPE_GROUP_8, PF_NONE, 5), 1, X86InstInfo{\"BTS\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST, 1}},\n    {OPD(TYPE_GROUP_8, PF_NONE, 6), 1, X86InstInfo{\"BTR\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST, 1}},\n    {OPD(TYPE_GROUP_8, PF_NONE, 7), 1, X86InstInfo{\"BTC\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST, 1}},\n\n    {OPD(TYPE_GROUP_8, PF_F3, 0), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_8, PF_F3, 1), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_8, PF_F3, 2), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_8, PF_F3, 3), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_8, PF_F3, 4), 1, X86InstInfo{\"BT\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,   1}},\n    {OPD(TYPE_GROUP_8, PF_F3, 5), 1, X86InstInfo{\"BTS\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,   1}},\n    {OPD(TYPE_GROUP_8, PF_F3, 6), 1, X86InstInfo{\"BTR\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,   1}},\n    {OPD(TYPE_GROUP_8, PF_F3, 7), 1, X86InstInfo{\"BTC\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,   1}},\n\n    {OPD(TYPE_GROUP_8, PF_66, 0), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_8, PF_66, 1), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_8, PF_66, 2), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_8, PF_66, 3), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_8, PF_66, 4), 1, X86InstInfo{\"BT\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,   1}},\n    {OPD(TYPE_GROUP_8, PF_66, 5), 1, X86InstInfo{\"BTS\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,   1}},\n    {OPD(TYPE_GROUP_8, PF_66, 6), 1, X86InstInfo{\"BTR\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,   1}},\n    {OPD(TYPE_GROUP_8, PF_66, 7), 1, X86InstInfo{\"BTC\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,   1}},\n\n    {OPD(TYPE_GROUP_8, PF_F2, 0), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_8, PF_F2, 1), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_8, PF_F2, 2), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_8, PF_F2, 3), 1, X86InstInfo{\"\",    TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_8, PF_F2, 4), 1, X86InstInfo{\"BT\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,   1}},\n    {OPD(TYPE_GROUP_8, PF_F2, 5), 1, X86InstInfo{\"BTS\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,   1}},\n    {OPD(TYPE_GROUP_8, PF_F2, 6), 1, X86InstInfo{\"BTR\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,   1}},\n    {OPD(TYPE_GROUP_8, PF_F2, 7), 1, X86InstInfo{\"BTC\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,   1}},\n\n    // GROUP 9\n\n    // AMD documentation is a bit broken for Group 9\n    // Claims the entire group has n/a applied for the prefix (Implies that the prefix is ignored)\n    // RDRAND/RDSEED only work with no prefix (Other than 66h)\n    // CMPXCHG8B/16B works with all prefixes\n    // Tooling fails to decode CMPXCHG with prefix\n    {OPD(TYPE_GROUP_9, PF_NONE, 0), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,   0}},\n    {OPD(TYPE_GROUP_9, PF_NONE, 1), 1, X86InstInfo{\"CMPXCHG8B/16B\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_9, PF_NONE, 2), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,   0}},\n    {OPD(TYPE_GROUP_9, PF_NONE, 3), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,   0}},\n    {OPD(TYPE_GROUP_9, PF_NONE, 4), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,   0}},\n    {OPD(TYPE_GROUP_9, PF_NONE, 5), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,   0}},\n    {OPD(TYPE_GROUP_9, PF_NONE, 6), 1, X86InstInfo{\"RDRAND\",     TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY, 0}},\n    {OPD(TYPE_GROUP_9, PF_NONE, 7), 1, X86InstInfo{\"RDSEED\",     TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY, 0}},\n\n    {OPD(TYPE_GROUP_9, PF_F3, 0), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_F3, 1), 1, X86InstInfo{\"CMPXCHG8B/16B\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_9, PF_F3, 2), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_F3, 3), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_F3, 4), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_F3, 5), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_F3, 6), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_F3, 7), 1, X86InstInfo{\"RDPID\",      TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY, 0}},\n\n    {OPD(TYPE_GROUP_9, PF_66, 0), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_66, 1), 1, X86InstInfo{\"CMPXCHG8B/16B\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_9, PF_66, 2), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_66, 3), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_66, 4), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_66, 5), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_66, 6), 1, X86InstInfo{\"RDRAND\",     TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY, 0}},\n    {OPD(TYPE_GROUP_9, PF_66, 7), 1, X86InstInfo{\"RDSEED\",     TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY, 0}},\n\n    {OPD(TYPE_GROUP_9, PF_F2, 0), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_F2, 1), 1, X86InstInfo{\"CMPXCHG8B/16B\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_9, PF_F2, 2), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_F2, 3), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_F2, 4), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_F2, 5), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_F2, 6), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n    {OPD(TYPE_GROUP_9, PF_F2, 7), 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,     0}},\n\n    // GROUP 10\n    {OPD(TYPE_GROUP_10, PF_NONE, 0), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END, 0}},\n    {OPD(TYPE_GROUP_10, PF_NONE, 1), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END, 0}},\n    {OPD(TYPE_GROUP_10, PF_NONE, 2), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END, 0}},\n    {OPD(TYPE_GROUP_10, PF_NONE, 3), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END, 0}},\n    {OPD(TYPE_GROUP_10, PF_NONE, 4), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END, 0}},\n    {OPD(TYPE_GROUP_10, PF_NONE, 5), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END, 0}},\n    {OPD(TYPE_GROUP_10, PF_NONE, 6), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END, 0}},\n    {OPD(TYPE_GROUP_10, PF_NONE, 7), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END, 0}},\n\n    {OPD(TYPE_GROUP_10, PF_F3, 0), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_F3, 1), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_F3, 2), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_F3, 3), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_F3, 4), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_F3, 5), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_F3, 6), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_F3, 7), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n\n    {OPD(TYPE_GROUP_10, PF_66, 0), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_66, 1), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_66, 2), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_66, 3), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_66, 4), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_66, 5), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_66, 6), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_66, 7), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n\n    {OPD(TYPE_GROUP_10, PF_F2, 0), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_F2, 1), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_F2, 2), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_F2, 3), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_F2, 4), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_F2, 5), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_F2, 6), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n    {OPD(TYPE_GROUP_10, PF_F2, 7), 1, X86InstInfo{\"UD1\", TYPE_INST, FLAGS_BLOCK_END,   0}},\n\n    // GROUP 12\n    {OPD(TYPE_GROUP_12, PF_NONE, 0), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n    {OPD(TYPE_GROUP_12, PF_NONE, 1), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n    {OPD(TYPE_GROUP_12, PF_NONE, 2), 1, X86InstInfo{\"PSRLW\", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 1}},\n    {OPD(TYPE_GROUP_12, PF_NONE, 3), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n    {OPD(TYPE_GROUP_12, PF_NONE, 4), 1, X86InstInfo{\"PSRAW\", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 1}},\n    {OPD(TYPE_GROUP_12, PF_NONE, 5), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n    {OPD(TYPE_GROUP_12, PF_NONE, 6), 1, X86InstInfo{\"PSLLW\", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 1}},\n    {OPD(TYPE_GROUP_12, PF_NONE, 7), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n\n    {OPD(TYPE_GROUP_12, PF_66, 0), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {OPD(TYPE_GROUP_12, PF_66, 1), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {OPD(TYPE_GROUP_12, PF_66, 2), 1, X86InstInfo{\"PSRLW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS,  1}},\n    {OPD(TYPE_GROUP_12, PF_66, 3), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {OPD(TYPE_GROUP_12, PF_66, 4), 1, X86InstInfo{\"PSRAW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS,  1}},\n    {OPD(TYPE_GROUP_12, PF_66, 5), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {OPD(TYPE_GROUP_12, PF_66, 6), 1, X86InstInfo{\"PSLLW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS,  1}},\n    {OPD(TYPE_GROUP_12, PF_66, 7), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                        0}},\n\n    {OPD(TYPE_GROUP_12, PF_F3, 0), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_12, PF_F3, 1), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_12, PF_F3, 2), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_12, PF_F3, 3), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_12, PF_F3, 4), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_12, PF_F3, 5), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_12, PF_F3, 6), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_12, PF_F3, 7), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n\n    {OPD(TYPE_GROUP_12, PF_F2, 0), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_12, PF_F2, 1), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_12, PF_F2, 2), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_12, PF_F2, 3), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_12, PF_F2, 4), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_12, PF_F2, 5), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_12, PF_F2, 6), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_12, PF_F2, 7), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n\n    // GROUP 13\n    {OPD(TYPE_GROUP_13, PF_NONE, 0), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n    {OPD(TYPE_GROUP_13, PF_NONE, 1), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n    {OPD(TYPE_GROUP_13, PF_NONE, 2), 1, X86InstInfo{\"PSRLD\", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 1}},\n    {OPD(TYPE_GROUP_13, PF_NONE, 3), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n    {OPD(TYPE_GROUP_13, PF_NONE, 4), 1, X86InstInfo{\"PSRAD\", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 1}},\n    {OPD(TYPE_GROUP_13, PF_NONE, 5), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n    {OPD(TYPE_GROUP_13, PF_NONE, 6), 1, X86InstInfo{\"PSLLD\", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 1}},\n    {OPD(TYPE_GROUP_13, PF_NONE, 7), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n\n    {OPD(TYPE_GROUP_13, PF_66, 0), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {OPD(TYPE_GROUP_13, PF_66, 1), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {OPD(TYPE_GROUP_13, PF_66, 2), 1, X86InstInfo{\"PSRLD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS,  1}},\n    {OPD(TYPE_GROUP_13, PF_66, 3), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {OPD(TYPE_GROUP_13, PF_66, 4), 1, X86InstInfo{\"PSRAD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS,  1}},\n    {OPD(TYPE_GROUP_13, PF_66, 5), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {OPD(TYPE_GROUP_13, PF_66, 6), 1, X86InstInfo{\"PSLLD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS,  1}},\n    {OPD(TYPE_GROUP_13, PF_66, 7), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                        0}},\n\n    {OPD(TYPE_GROUP_13, PF_F3, 0), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_13, PF_F3, 1), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_13, PF_F3, 2), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_13, PF_F3, 3), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_13, PF_F3, 4), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_13, PF_F3, 5), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_13, PF_F3, 6), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_13, PF_F3, 7), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n\n    {OPD(TYPE_GROUP_13, PF_F2, 0), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_13, PF_F2, 1), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_13, PF_F2, 2), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_13, PF_F2, 3), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_13, PF_F2, 4), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_13, PF_F2, 5), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_13, PF_F2, 6), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_13, PF_F2, 7), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n\n    // GROUP 14\n    {OPD(TYPE_GROUP_14, PF_NONE, 0), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n    {OPD(TYPE_GROUP_14, PF_NONE, 1), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n    {OPD(TYPE_GROUP_14, PF_NONE, 2), 1, X86InstInfo{\"PSRLQ\", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 1}},\n    {OPD(TYPE_GROUP_14, PF_NONE, 3), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n    {OPD(TYPE_GROUP_14, PF_NONE, 4), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n    {OPD(TYPE_GROUP_14, PF_NONE, 5), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n    {OPD(TYPE_GROUP_14, PF_NONE, 6), 1, X86InstInfo{\"PSLLQ\", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 1}},\n    {OPD(TYPE_GROUP_14, PF_NONE, 7), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                      0}},\n\n    {OPD(TYPE_GROUP_14, PF_66, 0), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {OPD(TYPE_GROUP_14, PF_66, 1), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {OPD(TYPE_GROUP_14, PF_66, 2), 1, X86InstInfo{\"PSRLQ\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS,  1}},\n    {OPD(TYPE_GROUP_14, PF_66, 3), 1, X86InstInfo{\"PSRLDQ\",TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS,  1}},\n    {OPD(TYPE_GROUP_14, PF_66, 4), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {OPD(TYPE_GROUP_14, PF_66, 5), 1, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {OPD(TYPE_GROUP_14, PF_66, 6), 1, X86InstInfo{\"PSLLQ\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS,  1}},\n    {OPD(TYPE_GROUP_14, PF_66, 7), 1, X86InstInfo{\"PSLLDQ\",TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS,  1}},\n\n    {OPD(TYPE_GROUP_14, PF_F3, 0), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_14, PF_F3, 1), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_14, PF_F3, 2), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_14, PF_F3, 3), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_14, PF_F3, 4), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_14, PF_F3, 5), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_14, PF_F3, 6), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_14, PF_F3, 7), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n\n    {OPD(TYPE_GROUP_14, PF_F2, 0), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_14, PF_F2, 1), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_14, PF_F2, 2), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_14, PF_F2, 3), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_14, PF_F2, 4), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_14, PF_F2, 5), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_14, PF_F2, 6), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n    {OPD(TYPE_GROUP_14, PF_F2, 7), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                             0}},\n\n    // GROUP 15\n    {OPD(TYPE_GROUP_15, PF_NONE, 0), 1, X86InstInfo{\"FXSAVE\",          TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,       0}}, // MMX/x87\n    {OPD(TYPE_GROUP_15, PF_NONE, 1), 1, X86InstInfo{\"FXRSTOR\",         TYPE_INST, FLAGS_MODRM,       0}}, // MMX/x87\n    {OPD(TYPE_GROUP_15, PF_NONE, 2), 1, X86InstInfo{\"LDMXCSR\",         TYPE_INST, GenFlagsSameSize(SIZE_32BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_15, PF_NONE, 3), 1, X86InstInfo{\"STMXCSR\",         TYPE_INST, GenFlagsSameSize(SIZE_32BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_15, PF_NONE, 4), 1, X86InstInfo{\"XSAVE\",           TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,      0}},\n    {OPD(TYPE_GROUP_15, PF_NONE, 5), 1, X86InstInfo{\"LFENCE/XRSTOR\",   TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,      0}},\n    {OPD(TYPE_GROUP_15, PF_NONE, 6), 1, X86InstInfo{\"MFENCE/XSAVEOPT\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,      0}},\n    {OPD(TYPE_GROUP_15, PF_NONE, 7), 1, X86InstInfo{\"SFENCE/CLFLUSH\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,      0}},\n\n    {OPD(TYPE_GROUP_15, PF_F3, 0), 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = SecondGroup_ArchSelect_LUT[ENTRY_15_F3_0] }}},\n    {OPD(TYPE_GROUP_15, PF_F3, 1), 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = SecondGroup_ArchSelect_LUT[ENTRY_15_F3_1] }}},\n    {OPD(TYPE_GROUP_15, PF_F3, 2), 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = SecondGroup_ArchSelect_LUT[ENTRY_15_F3_2] }}},\n    {OPD(TYPE_GROUP_15, PF_F3, 3), 1, X86InstInfo{\"\", TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = SecondGroup_ArchSelect_LUT[ENTRY_15_F3_3] }}},\n    {OPD(TYPE_GROUP_15, PF_F3, 4), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                    0}},\n    {OPD(TYPE_GROUP_15, PF_F3, 5), 1, X86InstInfo{\"INCSSPQ\", TYPE_INST, FLAGS_MODRM,                    0}},\n    {OPD(TYPE_GROUP_15, PF_F3, 6), 1, X86InstInfo{\"UMONITOR/CLRSSBSY\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,       0}},\n    {OPD(TYPE_GROUP_15, PF_F3, 7), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                    0}},\n\n    {OPD(TYPE_GROUP_15, PF_66, 0), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                    0}},\n    {OPD(TYPE_GROUP_15, PF_66, 1), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                    0}},\n    {OPD(TYPE_GROUP_15, PF_66, 2), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                    0}},\n    {OPD(TYPE_GROUP_15, PF_66, 3), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                    0}},\n    {OPD(TYPE_GROUP_15, PF_66, 4), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                    0}},\n    {OPD(TYPE_GROUP_15, PF_66, 5), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                    0}},\n    {OPD(TYPE_GROUP_15, PF_66, 6), 1, X86InstInfo{\"CLWB\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,      0}},\n    {OPD(TYPE_GROUP_15, PF_66, 7), 1, X86InstInfo{\"CLFLUSHOPT\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,      0}},\n\n    {OPD(TYPE_GROUP_15, PF_F2, 0), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                    0}},\n    {OPD(TYPE_GROUP_15, PF_F2, 1), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                    0}},\n    {OPD(TYPE_GROUP_15, PF_F2, 2), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                    0}},\n    {OPD(TYPE_GROUP_15, PF_F2, 3), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                    0}},\n    {OPD(TYPE_GROUP_15, PF_F2, 4), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                    0}},\n    {OPD(TYPE_GROUP_15, PF_F2, 5), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                    0}},\n    {OPD(TYPE_GROUP_15, PF_F2, 6), 1, X86InstInfo{\"UMWAIT\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST,       0}},\n    {OPD(TYPE_GROUP_15, PF_F2, 7), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                    0}},\n\n    // GROUP 16\n    // AMD documentation claims again that this entire group is n/a to prefix\n    // Tooling once again fails to disassemble oens with the prefix. Disable until proven otherwise\n    {OPD(TYPE_GROUP_16, PF_NONE, 0), 1, X86InstInfo{\"PREFETCH NTA\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_16, PF_NONE, 1), 1, X86InstInfo{\"PREFETCH T0\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_16, PF_NONE, 2), 1, X86InstInfo{\"PREFETCH T1\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_16, PF_NONE, 3), 1, X86InstInfo{\"PREFETCH T2\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_16, PF_NONE, 4), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM, 0}},\n    {OPD(TYPE_GROUP_16, PF_NONE, 5), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM, 0}},\n    {OPD(TYPE_GROUP_16, PF_NONE, 6), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM, 0}},\n    {OPD(TYPE_GROUP_16, PF_NONE, 7), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM, 0}},\n\n    {OPD(TYPE_GROUP_16, PF_F3, 0), 1, X86InstInfo{\"PREFETCH NTA\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_16, PF_F3, 1), 1, X86InstInfo{\"PREFETCH T0\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_16, PF_F3, 2), 1, X86InstInfo{\"PREFETCH T1\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_16, PF_F3, 3), 1, X86InstInfo{\"PREFETCH T2\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_16, PF_F3, 4), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM,   0}},\n    {OPD(TYPE_GROUP_16, PF_F3, 5), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM,   0}},\n    {OPD(TYPE_GROUP_16, PF_F3, 6), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM,   0}},\n    {OPD(TYPE_GROUP_16, PF_F3, 7), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM,   0}},\n\n    {OPD(TYPE_GROUP_16, PF_66, 0), 1, X86InstInfo{\"PREFETCH NTA\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_16, PF_66, 1), 1, X86InstInfo{\"PREFETCH T0\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_16, PF_66, 2), 1, X86InstInfo{\"PREFETCH T1\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_16, PF_66, 3), 1, X86InstInfo{\"PREFETCH T2\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_16, PF_66, 4), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM,   0}},\n    {OPD(TYPE_GROUP_16, PF_66, 5), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM,   0}},\n    {OPD(TYPE_GROUP_16, PF_66, 6), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM,   0}},\n    {OPD(TYPE_GROUP_16, PF_66, 7), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM,   0}},\n\n    {OPD(TYPE_GROUP_16, PF_F2, 0), 1, X86InstInfo{\"PREFETCH NTA\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_16, PF_F2, 1), 1, X86InstInfo{\"PREFETCH T0\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_16, PF_F2, 2), 1, X86InstInfo{\"PREFETCH T1\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_16, PF_F2, 3), 1, X86InstInfo{\"PREFETCH T2\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_16, PF_F2, 4), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM,   0}},\n    {OPD(TYPE_GROUP_16, PF_F2, 5), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM,   0}},\n    {OPD(TYPE_GROUP_16, PF_F2, 6), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM,   0}},\n    {OPD(TYPE_GROUP_16, PF_F2, 7), 1, X86InstInfo{\"NOP\",          TYPE_INST, FLAGS_MODRM,   0}},\n\n    // GROUP 17\n    {OPD(TYPE_GROUP_17, PF_NONE, 0), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                          0}},\n    {OPD(TYPE_GROUP_17, PF_NONE, 1), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                          0}},\n    {OPD(TYPE_GROUP_17, PF_NONE, 2), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                          0}},\n    {OPD(TYPE_GROUP_17, PF_NONE, 3), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                          0}},\n    {OPD(TYPE_GROUP_17, PF_NONE, 4), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                          0}},\n    {OPD(TYPE_GROUP_17, PF_NONE, 5), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                          0}},\n    {OPD(TYPE_GROUP_17, PF_NONE, 6), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                          0}},\n    {OPD(TYPE_GROUP_17, PF_NONE, 7), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                          0}},\n\n    {OPD(TYPE_GROUP_17, PF_F3, 0), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_F3, 1), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_F3, 2), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_F3, 3), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_F3, 4), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_F3, 5), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_F3, 6), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_F3, 7), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n\n    {OPD(TYPE_GROUP_17, PF_66, 0), 1, X86InstInfo{\"EXTRQ\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS, 2}},\n    {OPD(TYPE_GROUP_17, PF_66, 1), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_66, 2), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_66, 3), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_66, 4), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_66, 5), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_66, 6), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_66, 7), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n\n    {OPD(TYPE_GROUP_17, PF_F2, 0), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_F2, 1), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_F2, 2), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_F2, 3), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_F2, 4), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_F2, 5), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_F2, 6), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n    {OPD(TYPE_GROUP_17, PF_F2, 7), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE,                                            0}},\n\n    // GROUP P\n    // AMD documentation claims n/a for all instructions in Group P\n    // It also claims that instructions /2, /4, /5, /6, /7 all alias to /0\n    // It claims that /3 is still Prefetch Mod\n    // Tooling fails to decode past the /2 encoding but runs fine in hardware\n    // Hardware also runs all the prefixes correctly\n    {OPD(TYPE_GROUP_P, PF_NONE, 0), 1, X86InstInfo{\"PREFETCH Ex\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_P, PF_NONE, 1), 1, X86InstInfo{\"PREFETCH Mod\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_P, PF_NONE, 2), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_P, PF_NONE, 3), 1, X86InstInfo{\"PREFETCH Mod\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_P, PF_NONE, 4), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_P, PF_NONE, 5), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_P, PF_NONE, 6), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_GROUP_P, PF_NONE, 7), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY, 0}},\n\n    {OPD(TYPE_GROUP_P, PF_F3, 0), 1, X86InstInfo{\"PREFETCH Ex\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_F3, 1), 1, X86InstInfo{\"PREFETCH Mod\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_F3, 2), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_F3, 3), 1, X86InstInfo{\"PREFETCH Mod\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_F3, 4), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_F3, 5), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_F3, 6), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_F3, 7), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n\n    {OPD(TYPE_GROUP_P, PF_66, 0), 1, X86InstInfo{\"PREFETCH Ex\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_66, 1), 1, X86InstInfo{\"PREFETCH Mod\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_66, 2), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_66, 3), 1, X86InstInfo{\"PREFETCH Mod\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_66, 4), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_66, 5), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_66, 6), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_66, 7), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n\n    {OPD(TYPE_GROUP_P, PF_F2, 0), 1, X86InstInfo{\"PREFETCH Ex\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_F2, 1), 1, X86InstInfo{\"PREFETCH Mod\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_F2, 2), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_F2, 3), 1, X86InstInfo{\"PREFETCH Mod\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_F2, 4), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_F2, 5), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_F2, 6), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n    {OPD(TYPE_GROUP_P, PF_F2, 7), 1, X86InstInfo{\"PREFETCH Res\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY,   0}},\n  };\n#undef OPD\n\n  GenerateTable(Table.data(), SecondaryExtensionOpTable, std::size(SecondaryExtensionOpTable));\n\n  IR::InstallToTable(Table, IR::OpDispatch_SecondaryGroupTables);\n  return Table;\n}();\n\n}\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/X86Tables/SecondaryModRMTables.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-tables\n$end_info$\n*/\n\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/Core/OpcodeDispatcher/SecondaryModRMTables.h\"\n\n#include <iterator>\n\nnamespace FEXCore::X86Tables {\nusing namespace InstFlags;\nconstexpr std::array<X86InstInfo, MAX_SECOND_MODRM_TABLE_SIZE> SecondModRMTableOps = []() consteval {\n  std::array<X86InstInfo, MAX_SECOND_MODRM_TABLE_SIZE> Table{};\n  constexpr U8U8InfoStruct SecondaryModRMExtensionOpTable[] = {\n    // REG /1\n    {((0 << 3) | 0), 1, X86InstInfo{\"MONITOR\",  TYPE_INST,    FLAGS_NONE, 0}},\n    {((0 << 3) | 1), 1, X86InstInfo{\"MWAIT\",    TYPE_INST,    FLAGS_NONE, 0}},\n    {((0 << 3) | 2), 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE, 0}},\n    {((0 << 3) | 3), 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE, 0}},\n    {((0 << 3) | 4), 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE, 0}},\n    {((0 << 3) | 5), 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE, 0}},\n    {((0 << 3) | 6), 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE, 0}},\n    {((0 << 3) | 7), 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE, 0}},\n\n    // REG /2\n    {((1 << 3) | 0), 1, X86InstInfo{\"XGETBV\",   TYPE_INST,    FLAGS_NONE, 0}},\n    {((1 << 3) | 1), 1, X86InstInfo{\"XSETBV\",   TYPE_PRIV,    FLAGS_NONE, 0}},\n    {((1 << 3) | 2), 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE, 0}},\n    {((1 << 3) | 3), 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE, 0}},\n    {((1 << 3) | 4), 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE, 0}},\n    {((1 << 3) | 5), 1, X86InstInfo{\"XEND\",     TYPE_INST, FLAGS_NONE, 0}},\n    {((1 << 3) | 6), 1, X86InstInfo{\"XTEST\",    TYPE_INST, FLAGS_NONE, 0}},\n    {((1 << 3) | 7), 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE, 0}},\n\n    // REG /3\n    {((2 << 3) | 0), 1, X86InstInfo{\"VMRUN\",    TYPE_PRIV,    FLAGS_NONE, 0}},\n    {((2 << 3) | 1), 1, X86InstInfo{\"VMMCALL\",  TYPE_PRIV,    FLAGS_NONE, 0}},\n    {((2 << 3) | 2), 1, X86InstInfo{\"VMLOAD\",   TYPE_PRIV,    FLAGS_NONE, 0}},\n    {((2 << 3) | 3), 1, X86InstInfo{\"VMSAVE\",   TYPE_PRIV,    FLAGS_NONE, 0}},\n    {((2 << 3) | 4), 1, X86InstInfo{\"STGI\",     TYPE_PRIV,    FLAGS_NONE, 0}},\n    {((2 << 3) | 5), 1, X86InstInfo{\"CLGI\",     TYPE_PRIV,    FLAGS_NONE, 0}},\n    {((2 << 3) | 6), 1, X86InstInfo{\"SKINIT\",   TYPE_PRIV,    FLAGS_NONE, 0}},\n    {((2 << 3) | 7), 1, X86InstInfo{\"INVLPGA\",  TYPE_INST,    FLAGS_NONE, 0}},\n\n    // REG /7\n    {((3 << 3) | 0), 1, X86InstInfo{\"SWAPGS\",   TYPE_INST,    FLAGS_NONE, 0}},\n    {((3 << 3) | 1), 1, X86InstInfo{\"RDTSCP\",   TYPE_INST,    FLAGS_NONE, 0}},\n    {((3 << 3) | 2), 1, X86InstInfo{\"MONITORX\", TYPE_PRIV,    FLAGS_NONE, 0}},\n    {((3 << 3) | 3), 1, X86InstInfo{\"MWAITX\",   TYPE_PRIV,    FLAGS_NONE, 0}},\n    {((3 << 3) | 4), 1, X86InstInfo{\"CLZERO\",   TYPE_INST,    GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SF_SRC_RAX | FLAGS_DEBUG_MEM_ACCESS, 0}},\n    {((3 << 3) | 5), 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE, 0}},\n    {((3 << 3) | 6), 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE, 0}},\n    {((3 << 3) | 7), 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE, 0}},\n  };\n\n  GenerateTable(Table.data(), SecondaryModRMExtensionOpTable, std::size(SecondaryModRMExtensionOpTable));\n\n  IR::InstallToTable(Table, IR::OpDispatch_SecondaryModRMTables);\n  return Table;\n}();\n\n}\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/X86Tables/SecondaryTables.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-tables\n$end_info$\n*/\n\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/Core/OpcodeDispatcher/SecondaryTables.h\"\n\n#include <FEXCore/Core/Context.h>\n\n#include <iterator>\n\nnamespace FEXCore::X86Tables {\nusing namespace InstFlags;\n\nenum Secondary_LUT {\n  ENTRY_05,\n  ENTRY_A0,\n  ENTRY_A1,\n  ENTRY_A8,\n  ENTRY_A9,\n  ENTRY_MAX,\n};\n\nconstexpr std::array<X86InstInfo[2], ENTRY_MAX> Secondary_ArchSelect_LUT = {{\n  {\n    {\"SYSCALL\", TYPE_INST, DEFAULT_SYSCALL_FLAGS, 0, { .OpDispatch = &IR::OpDispatchBuilder::NOPOp } },\n    {\"SYSCALL\", TYPE_INST, DEFAULT_SYSCALL_FLAGS, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::SyscallOp, true> } },\n  },\n  {\n    {\"PUSH FS\", TYPE_INST, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::PUSHSegmentOp, FEXCore::X86Tables::DecodeFlags::FLAG_FS_PREFIX> } },\n    {\"PUSH FS\", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::PUSHSegmentOp, FEXCore::X86Tables::DecodeFlags::FLAG_FS_PREFIX> } },\n  },\n  {\n    {\"POP FS\",  TYPE_INST, GenFlagsSizes(SIZE_16BIT, SIZE_DEF) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::POPSegmentOp, FEXCore::X86Tables::DecodeFlags::FLAG_FS_PREFIX> } },\n    {\"POP FS\",  TYPE_INST, GenFlagsSizes(SIZE_16BIT, SIZE_64BIT) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::POPSegmentOp, FEXCore::X86Tables::DecodeFlags::FLAG_FS_PREFIX> } },\n  },\n  {\n    {\"PUSH GS\", TYPE_INST, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::PUSHSegmentOp, FEXCore::X86Tables::DecodeFlags::FLAG_GS_PREFIX> } },\n    {\"PUSH GS\", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::PUSHSegmentOp, FEXCore::X86Tables::DecodeFlags::FLAG_GS_PREFIX> } },\n  },\n  {\n    {\"POP GS\",  TYPE_INST, GenFlagsSizes(SIZE_16BIT, SIZE_DEF) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::POPSegmentOp, FEXCore::X86Tables::DecodeFlags::FLAG_GS_PREFIX> } },\n    {\"POP GS\",  TYPE_INST, GenFlagsSizes(SIZE_16BIT, SIZE_64BIT) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, { .OpDispatch = &IR::OpDispatchBuilder::Bind<&IR::OpDispatchBuilder::POPSegmentOp, FEXCore::X86Tables::DecodeFlags::FLAG_GS_PREFIX> } },\n  },\n}};\n\nconstexpr std::array<X86InstInfo, MAX_SECOND_TABLE_SIZE> SecondBaseOps = []() consteval {\n  std::array<X86InstInfo, MAX_SECOND_TABLE_SIZE> Table{};\n\n  constexpr U8U8InfoStruct TwoByteOpTable[] = {\n    // Instructions\n    {0x00, 1, X86InstInfo{\"\",           TYPE_GROUP_6, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                                                 0}},\n    {0x01, 1, X86InstInfo{\"\",           TYPE_GROUP_7, FLAGS_NO_OVERLAY,                                                                                 0}},\n    // These two load segment register data\n    {0x02, 1, X86InstInfo{\"LAR\",        TYPE_UNDEC, FLAGS_NO_OVERLAY,                                                                                   0}},\n    {0x03, 1, X86InstInfo{\"LSL\",        TYPE_INST, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                                                    0}},\n    {0x04, 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NO_OVERLAY,                                                                                 0}},\n    {0x05, 1, X86InstInfo{\"\",           TYPE_ARCH_DISPATCHER, FLAGS_NONE, 0, { .Indirect = Secondary_ArchSelect_LUT[ENTRY_05] }}},\n    {0x06, 1, X86InstInfo{\"CLTS\",       TYPE_INST, FLAGS_NO_OVERLAY,                                                                                    0}},\n    {0x07, 1, X86InstInfo{\"SYSRET\",     TYPE_INST, FLAGS_NO_OVERLAY,                                                                                    0}},\n    {0x08, 1, X86InstInfo{\"INVD\",       TYPE_PRIV, FLAGS_NO_OVERLAY,                                                                                    0}},\n    {0x09, 1, X86InstInfo{\"WBINVD\",     TYPE_PRIV, FLAGS_NO_OVERLAY,                                                                                    0}},\n    {0x0A, 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NO_OVERLAY,                                                                                 0}},\n    {0x0B, 1, X86InstInfo{\"UD2\",        TYPE_INST, FLAGS_BLOCK_END | FLAGS_NO_OVERLAY,                                                    0}},\n    {0x0C, 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NO_OVERLAY,                                                                                 0}},\n    {0x0D, 1, X86InstInfo{\"\",           TYPE_GROUP_P, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                                                 0}},\n    {0x0E, 1, X86InstInfo{\"FEMMS\",      TYPE_INST, FLAGS_NO_OVERLAY,                                                            0}},\n    {0x0F, 1, X86InstInfo{\"\",           TYPE_3DNOW_TABLE, FLAGS_NO_OVERLAY,                                                                             0}},\n\n    {0x10, 1, X86InstInfo{\"MOVUPS\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x11, 1, X86InstInfo{\"MOVUPS\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x12, 1, X86InstInfo{\"MOVLPS\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                              0}},\n    {0x13, 1, X86InstInfo{\"MOVLPS\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS,                              0}},\n    {0x14, 1, X86InstInfo{\"UNPCKLPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x15, 1, X86InstInfo{\"UNPCKHPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x16, 1, X86InstInfo{\"MOVLHPS\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x17, 1, X86InstInfo{\"MOVHPS\",     TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 0}},\n    {0x18, 1, X86InstInfo{\"\",           TYPE_GROUP_16, FLAGS_NO_OVERLAY,                                                                                      0}},\n    {0x19, 7, X86InstInfo{\"NOP\",        TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                                                     0}},\n\n    {0x20, 2, X86InstInfo{\"MOV\",        TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_NO_OVERLAY,                                                     0}},\n    {0x22, 2, X86InstInfo{\"MOV\",        TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_NO_OVERLAY,                                                     0}},\n    {0x24, 4, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,                                                                                       0}},\n    {0x28, 1, X86InstInfo{\"MOVAPS\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x29, 1, X86InstInfo{\"MOVAPS\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x2A, 1, X86InstInfo{\"CVTPI2PS\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX_SRC,                                                   0}},\n    {0x2B, 1, X86InstInfo{\"MOVNTPS\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS,                              0}},\n    {0x2C, 1, X86InstInfo{\"CVTTPS2PI\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX_DST,                                                   0}},\n    {0x2D, 1, X86InstInfo{\"CVTPS2PI\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX_DST,                                                   0}},\n    {0x2E, 1, X86InstInfo{\"UCOMISS\",    TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                                   0}},\n    {0x2F, 1, X86InstInfo{\"COMISS\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                                   0}},\n\n    {0x30, 1, X86InstInfo{\"WRMSR\",      TYPE_INST, FLAGS_NO_OVERLAY,                                                                             0}},\n    {0x31, 1, X86InstInfo{\"RDTSC\",      TYPE_INST, FLAGS_NO_OVERLAY,                                                               0}},\n    {0x32, 1, X86InstInfo{\"RDMSR\",      TYPE_INST, FLAGS_NO_OVERLAY,                                                                             0}},\n    {0x33, 1, X86InstInfo{\"RDPMC\",      TYPE_INST, FLAGS_NO_OVERLAY,                                                                             0}},\n    {0x34, 1, X86InstInfo{\"SYSENTER\",   TYPE_INST, FLAGS_NO_OVERLAY,                                                                             0}},\n    {0x35, 1, X86InstInfo{\"SYSEXIT\",    TYPE_INST, FLAGS_NO_OVERLAY,                                                                             0}},\n    {0x36, 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NO_OVERLAY,                                                                          0}},\n    {0x37, 1, X86InstInfo{\"GETSEC\",     TYPE_INVALID, FLAGS_NO_OVERLAY,                                                                          0}},\n    {0x38, 1, X86InstInfo{\"\",           TYPE_0F38_TABLE, FLAGS_NO_OVERLAY,                                                                       0}},\n    {0x39, 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NO_OVERLAY,                                                                          0}},\n    {0x3A, 1, X86InstInfo{\"\",           TYPE_0F3A_TABLE, FLAGS_NO_OVERLAY,                                                                       0}},\n    {0x3B, 3, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NO_OVERLAY,                                                                          0}},\n\n    {0x40, 1, X86InstInfo{\"CMOVO\",      TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n    {0x41, 1, X86InstInfo{\"CMOVNO\",     TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n    {0x42, 1, X86InstInfo{\"CMOVB\",      TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n    {0x43, 1, X86InstInfo{\"CMOVNB\",     TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n    {0x44, 1, X86InstInfo{\"CMOVZ\",      TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n    {0x45, 1, X86InstInfo{\"CMOVNZ\",     TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n    {0x46, 1, X86InstInfo{\"CMOVBE\",     TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n    {0x47, 1, X86InstInfo{\"CMOVNBE\",    TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n    {0x48, 1, X86InstInfo{\"CMOVS\",      TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n    {0x49, 1, X86InstInfo{\"CMOVNS\",     TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n    {0x4A, 1, X86InstInfo{\"CMOVP\",      TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n    {0x4B, 1, X86InstInfo{\"CMOVNP\",     TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n    {0x4C, 1, X86InstInfo{\"CMOVL\",      TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n    {0x4D, 1, X86InstInfo{\"CMOVNL\",     TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n    {0x4E, 1, X86InstInfo{\"CMOVLE\",     TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n    {0x4F, 1, X86InstInfo{\"CMOVNLE\",    TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                               0}},\n\n    {0x50, 1, X86InstInfo{\"MOVMSKPS\",   TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR,      0}},\n    {0x51, 1, X86InstInfo{\"SQRTPS\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x52, 1, X86InstInfo{\"RSQRTPS\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x53, 1, X86InstInfo{\"RCPPS\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x54, 1, X86InstInfo{\"ANDPS\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x55, 1, X86InstInfo{\"ANDNPS\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x56, 1, X86InstInfo{\"ORPS\",       TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x57, 1, X86InstInfo{\"XORPS\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x58, 1, X86InstInfo{\"ADDPS\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x59, 1, X86InstInfo{\"MULPS\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x5A, 1, X86InstInfo{\"CVTPS2PD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x5B, 1, X86InstInfo{\"CVTDQ2PS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x5C, 1, X86InstInfo{\"SUBPS\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x5D, 1, X86InstInfo{\"MINPS\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x5E, 1, X86InstInfo{\"DIVPS\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n    {0x5F, 1, X86InstInfo{\"MAXPS\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                 0}},\n\n    {0x60, 1, X86InstInfo{\"PUNPCKLBW\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                   0}},\n    {0x61, 1, X86InstInfo{\"PUNPCKLWD\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                   0}},\n    {0x62, 1, X86InstInfo{\"PUNPCKLDQ\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                   0}},\n    {0x63, 1, X86InstInfo{\"PACKSSWB\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                   0}},\n    {0x64, 1, X86InstInfo{\"PCMPGTB\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                   0}},\n    {0x65, 1, X86InstInfo{\"PCMPGTW\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                   0}},\n    {0x66, 1, X86InstInfo{\"PCMPGTD\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                   0}},\n    {0x67, 1, X86InstInfo{\"PACKUSWB\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                   0}},\n    {0x68, 1, X86InstInfo{\"PUNPCKHBW\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                   0}},\n    {0x69, 1, X86InstInfo{\"PUNPCKHWD\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                   0}},\n    {0x6A, 1, X86InstInfo{\"PUNPCKHDQ\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                   0}},\n    {0x6B, 1, X86InstInfo{\"PACKSSDW\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                   0}},\n    {0x6C, 2, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,                                                                                       0}},\n    {0x6E, 1, X86InstInfo{\"MOVD\",       TYPE_INST, GenFlagsDstSize(SIZE_64BIT)   | FLAGS_MODRM | FLAGS_SF_SRC_GPR | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                0}},\n    {0x6F, 1, X86InstInfo{\"MOVQ\",       TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                   0}},\n\n    {0x70, 1, X86InstInfo{\"PSHUFW\",     TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                   1}},\n    {0x71, 1, X86InstInfo{\"\",           TYPE_GROUP_12, FLAGS_NO_OVERLAY,                                                                                0}},\n    {0x72, 1, X86InstInfo{\"\",           TYPE_GROUP_13, FLAGS_NO_OVERLAY,                                                                                0}},\n    {0x73, 1, X86InstInfo{\"\",           TYPE_GROUP_14, FLAGS_NO_OVERLAY,                                                                                0}},\n    {0x74, 1, X86InstInfo{\"PCMPEQB\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                         0}},\n    {0x75, 1, X86InstInfo{\"PCMPEQW\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                         0}},\n    {0x76, 1, X86InstInfo{\"PCMPEQD\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                         0}},\n    {0x77, 1, X86InstInfo{\"EMMS\",       TYPE_INST, FLAGS_NONE,                                                                                    0}},\n    {0x78, 6, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,                                                                                       0}},\n    {0x7E, 1, X86InstInfo{\"MOVD\",       TYPE_INST, GenFlagsSrcSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_DST_GPR | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0}},\n    {0x7F, 1, X86InstInfo{\"MOVQ\",       TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                    0}},\n\n    {0x80, 1, X86InstInfo{\"JO\",      TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n    {0x81, 1, X86InstInfo{\"JNO\",     TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n    {0x82, 1, X86InstInfo{\"JB\",      TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n    {0x83, 1, X86InstInfo{\"JNB\",     TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n    {0x84, 1, X86InstInfo{\"JZ\",      TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n    {0x85, 1, X86InstInfo{\"JNZ\",     TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n    {0x86, 1, X86InstInfo{\"JBE\",     TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n    {0x87, 1, X86InstInfo{\"JNBE\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n    {0x88, 1, X86InstInfo{\"JS\",      TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n    {0x89, 1, X86InstInfo{\"JNS\",     TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n    {0x8A, 1, X86InstInfo{\"JP\",      TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n    {0x8B, 1, X86InstInfo{\"JNP\",     TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n    {0x8C, 1, X86InstInfo{\"JL\",      TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n    {0x8D, 1, X86InstInfo{\"JNL\",     TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n    {0x8E, 1, X86InstInfo{\"JLE\",     TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n    {0x8F, 1, X86InstInfo{\"JNLE\",    TYPE_INST, GenFlagsSameSize(SIZE_64BITDEF) | FLAGS_SETS_RIP | FLAGS_SRC_SEXT | FLAGS_DISPLACE_SIZE_DIV_2 | FLAGS_NO_OVERLAY,    4}},\n\n    {0x90, 1, X86InstInfo{\"SETO\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n    {0x91, 1, X86InstInfo{\"SETNO\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n    {0x92, 1, X86InstInfo{\"SETB\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n    {0x93, 1, X86InstInfo{\"SETNB\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n    {0x94, 1, X86InstInfo{\"SETZ\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n    {0x95, 1, X86InstInfo{\"SETNZ\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n    {0x96, 1, X86InstInfo{\"SETBE\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n    {0x97, 1, X86InstInfo{\"SETNBE\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n    {0x98, 1, X86InstInfo{\"SETS\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n    {0x99, 1, X86InstInfo{\"SETNS\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n    {0x9A, 1, X86InstInfo{\"SETP\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n    {0x9B, 1, X86InstInfo{\"SETNP\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n    {0x9C, 1, X86InstInfo{\"SETL\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n    {0x9D, 1, X86InstInfo{\"SETNL\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n    {0x9E, 1, X86InstInfo{\"SETLE\",   TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n    {0x9F, 1, X86InstInfo{\"SETNLE\",  TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                        0}},\n\n    {0xA0, 1, X86InstInfo{\"\",        TYPE_ARCH_DISPATCHER, FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, { .Indirect = Secondary_ArchSelect_LUT[ENTRY_A0] }}},\n    {0xA1, 1, X86InstInfo{\"\",        TYPE_ARCH_DISPATCHER, FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, { .Indirect = Secondary_ArchSelect_LUT[ENTRY_A1] }}},\n    {0xA2, 1, X86InstInfo{\"CPUID\",   TYPE_INST,     FLAGS_SF_SRC_RAX | FLAGS_NO_OVERLAY,                                              0}},\n    {0xA3, 1, X86InstInfo{\"BT\",      TYPE_INST,     FLAGS_DEBUG_MEM_ACCESS | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                     0}},\n    {0xA4, 1, X86InstInfo{\"SHLD\",    TYPE_INST,     FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                                              1}},\n    {0xA5, 1, X86InstInfo{\"SHLD\",    TYPE_INST,     FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX | FLAGS_NO_OVERLAY,                           0}},\n    {0xA6, 2, X86InstInfo{\"\",        TYPE_INVALID,  FLAGS_NO_OVERLAY,                                                                               0}},\n    {0xA8, 1, X86InstInfo{\"\",        TYPE_ARCH_DISPATCHER, FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, { .Indirect = Secondary_ArchSelect_LUT[ENTRY_A8] }}},\n    {0xA9, 1, X86InstInfo{\"\",        TYPE_ARCH_DISPATCHER, FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, { .Indirect = Secondary_ArchSelect_LUT[ENTRY_A9] }}},\n    {0xAA, 1, X86InstInfo{\"RSM\",     TYPE_PRIV,     FLAGS_NO_OVERLAY,                                                                               0}},\n    {0xAB, 1, X86InstInfo{\"BTS\",     TYPE_INST,     FLAGS_DEBUG_MEM_ACCESS | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                     0}},\n    {0xAC, 1, X86InstInfo{\"SHRD\",    TYPE_INST,     FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                                              1}},\n    {0xAD, 1, X86InstInfo{\"SHRD\",    TYPE_INST,     FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_SRC_RCX | FLAGS_NO_OVERLAY,                           0}},\n    {0xAE, 1, X86InstInfo{\"\",        TYPE_GROUP_15, FLAGS_NO_OVERLAY,                                                                               0}},\n    {0xAF, 1, X86InstInfo{\"IMUL\",    TYPE_INST,     FLAGS_MODRM | FLAGS_NO_OVERLAY,                                                                 0}},\n\n    {0xB0, 1, X86InstInfo{\"CMPXCHG\", TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                    0}},\n    {0xB1, 1, X86InstInfo{\"CMPXCHG\", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                                                  0}},\n    {0xB2, 1, X86InstInfo{\"LSS\",     TYPE_INVALID, FLAGS_NO_OVERLAY,                                                                                0}},\n    {0xB3, 1, X86InstInfo{\"BTR\",     TYPE_INST, FLAGS_DEBUG_MEM_ACCESS | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                         0}},\n    {0xB4, 1, X86InstInfo{\"LFS\",     TYPE_INVALID, FLAGS_NO_OVERLAY,                                                                                0}},\n    {0xB5, 1, X86InstInfo{\"LGS\",     TYPE_INVALID, FLAGS_NO_OVERLAY,                                                                                0}},\n    {0xB6, 1, X86InstInfo{\"MOVZX\",   TYPE_INST, GenFlagsSrcSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_NO_OVERLAY,                                        0}},\n    {0xB7, 1, X86InstInfo{\"MOVZX\",   TYPE_INST, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM | FLAGS_NO_OVERLAY,                                       0}},\n    {0xB8, 1, X86InstInfo{\"\",        TYPE_INVALID, FLAGS_NONE,                                                                                      0}},\n    {0xB9, 1, X86InstInfo{\"\",        TYPE_GROUP_10, FLAGS_NO_OVERLAY,                                                                               0}},\n    {0xBA, 1, X86InstInfo{\"\",        TYPE_GROUP_8, FLAGS_NO_OVERLAY,                                                                                0}},\n    {0xBB, 1, X86InstInfo{\"BTC\",     TYPE_INST, FLAGS_DEBUG_MEM_ACCESS | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                         0}},\n    {0xBC, 1, X86InstInfo{\"BSF\",     TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY66,                                                                   0}},\n    {0xBD, 1, X86InstInfo{\"BSR\",     TYPE_INST, FLAGS_MODRM | FLAGS_NO_OVERLAY66,                                                                   0}},\n    {0xBE, 1, X86InstInfo{\"MOVSX\",   TYPE_INST, GenFlagsSrcSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_NO_OVERLAY,                                        0}},\n    {0xBF, 1, X86InstInfo{\"MOVSX\",   TYPE_INST, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM | FLAGS_NO_OVERLAY,                                       0}},\n\n    {0xC0, 1, X86InstInfo{\"XADD\",    TYPE_INST, GenFlagsSameSize(SIZE_8BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST,                                                       0}},\n    {0xC1, 1, X86InstInfo{\"XADD\",    TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_NO_OVERLAY,                                                                 0}},\n    {0xC2, 1, X86InstInfo{\"CMPPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                     1}},\n    {0xC3, 1, X86InstInfo{\"MOVNTI\",  TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST,                                                            0}},\n    {0xC4, 1, X86InstInfo{\"PINSRW\",  TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_16BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX | FLAGS_SF_SRC_GPR,           1}},\n    {0xC5, 1, X86InstInfo{\"PEXTRW\",  TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_SF_DST_GPR | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 1}},\n    {0xC6, 1, X86InstInfo{\"SHUFPS\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                                                     1}},\n    {0xC7, 1, X86InstInfo{\"\",        TYPE_GROUP_9, FLAGS_NO_OVERLAY,                                                                                               0}},\n    {0xC8, 8, X86InstInfo{\"BSWAP\",   TYPE_INST, FLAGS_SF_REX_IN_BYTE | FLAGS_NO_OVERLAY,                                                                           0}},\n\n    {0xD0, 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE,                                                                                         0}},\n    {0xD1, 1, X86InstInfo{\"PSRLW\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xD2, 1, X86InstInfo{\"PSRLD\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xD3, 1, X86InstInfo{\"PSRLQ\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xD4, 1, X86InstInfo{\"PADDQ\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xD5, 1, X86InstInfo{\"PMULLW\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xD6, 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE,                                                                                         0}},\n    {0xD7, 1, X86InstInfo{\"PMOVMSKB\", TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR | FLAGS_SF_MMX_SRC,                                  0}},\n    {0xD8, 1, X86InstInfo{\"PSUBUSB\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xD9, 1, X86InstInfo{\"PSUBUSW\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xDA, 1, X86InstInfo{\"PMINUB\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xDB, 1, X86InstInfo{\"PAND\",     TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xDC, 1, X86InstInfo{\"PADDUSB\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xDD, 1, X86InstInfo{\"PADDUSW\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xDE, 1, X86InstInfo{\"PMAXUB\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xDF, 1, X86InstInfo{\"PANDN\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n\n    {0xE0, 1, X86InstInfo{\"PAVGB\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xE1, 1, X86InstInfo{\"PSRAW\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xE2, 1, X86InstInfo{\"PSRAD\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xE3, 1, X86InstInfo{\"PAVGW\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                       0}},\n    {0xE4, 1, X86InstInfo{\"PMULHUW\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xE5, 1, X86InstInfo{\"PMULHW\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xE6, 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE,                                                                                         0}},\n    {0xE7, 1, X86InstInfo{\"MOVNTQ\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                   0}},\n    {0xE8, 1, X86InstInfo{\"PSUBSB\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xE9, 1, X86InstInfo{\"PSUBSW\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xEA, 1, X86InstInfo{\"PMINSW\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xEB, 1, X86InstInfo{\"POR\",      TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xEC, 1, X86InstInfo{\"PADDSB\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xED, 1, X86InstInfo{\"PADDSW\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xEE, 1, X86InstInfo{\"PMAXSW\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xEF, 1, X86InstInfo{\"PXOR\",     TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n\n    {0xF0, 1, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE,                                                                                         0}},\n    {0xF1, 1, X86InstInfo{\"PSLLW\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xF2, 1, X86InstInfo{\"PSLLD\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xF3, 1, X86InstInfo{\"PSLLQ\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xF4, 1, X86InstInfo{\"PMULUDQ\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xF5, 1, X86InstInfo{\"PMADDWD\",  TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xF6, 1, X86InstInfo{\"PSADBW\",   TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xF7, 1, X86InstInfo{\"MASKMOVQ\", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xF8, 1, X86InstInfo{\"PSUBB\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xF9, 1, X86InstInfo{\"PSUBW\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xFA, 1, X86InstInfo{\"PSUBD\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xFB, 1, X86InstInfo{\"PSUBQ\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xFC, 1, X86InstInfo{\"PADDB\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xFD, 1, X86InstInfo{\"PADDW\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xFE, 1, X86InstInfo{\"PADDD\",    TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX,                                      0}},\n    {0xFF, 1, X86InstInfo{\"UD0\",      TYPE_INST, FLAGS_BLOCK_END,                                                                                           0}},\n\n#ifndef _WIN32\n    // FEX reserved instructions\n    // Unused x86 encoding instruction.\n\n    {0x3E, 1, X86InstInfo{\"CALLBACKRET\",  TYPE_INST, FLAGS_BLOCK_END | FLAGS_NO_OVERLAY | FLAGS_SETS_RIP,                                                                          0}},\n\n    // This was originally used by VIA to jump to its alternative instruction set. Used for OP_THUNK\n    {0x3F, 1, X86InstInfo{\"ALTINST\",      TYPE_INST, FLAGS_BLOCK_END | FLAGS_NO_OVERLAY | FLAGS_SETS_RIP,                                                            0}},\n#endif\n  };\n\n  GenerateTable(Table.data(), TwoByteOpTable, std::size(TwoByteOpTable));\n\n  IR::InstallToTable(Table, IR::OpDispatch_TwoByteOpTable);\n\n  return Table;\n}();\n\nconstexpr std::array<X86InstInfo, MAX_REP_MOD_TABLE_SIZE> RepModOps = []() consteval {\n  std::array<X86InstInfo, MAX_REP_MOD_TABLE_SIZE> Table{};\n\n  constexpr U8U8InfoStruct RepModOpTable[] = {\n    {0x0, 16, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                     0}},\n\n    {0x10, 1, X86InstInfo{\"MOVSS\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n    {0x11, 1, X86InstInfo{\"MOVSS\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS,                    0}},\n    {0x12, 1, X86InstInfo{\"MOVSLDUP\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,  0}},\n    {0x13, 3, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0x16, 1, X86InstInfo{\"MOVSHDUP\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,  0}},\n    {0x17, 2, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0x19, 7, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                     0}},\n\n    {0x20, 4, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                     0}},\n    {0x24, 6, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0x2A, 1, X86InstInfo{\"CVTSI2SS\",  TYPE_INST, GenFlagsDstSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_SRC_GPR, 0}},\n    {0x2B, 1, X86InstInfo{\"MOVNTSS\",   TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 0}},\n    {0x2C, 1, X86InstInfo{\"CVTTSS2SI\", TYPE_INST, FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR, 0}},\n    {0x2D, 1, X86InstInfo{\"CVTSS2SI\",  TYPE_INST, FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR, 0}},\n    {0x2E, 2, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n\n    {0x30, 16, X86InstInfo{\"\",         TYPE_COPY_OTHER, FLAGS_NONE,                                     0}},\n    {0x40, 16, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE,                                        0}},\n\n    {0x50, 1, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0x51, 1, X86InstInfo{\"SQRTSS\",    TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n    {0x52, 1, X86InstInfo{\"RSQRTSS\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n    {0x53, 1, X86InstInfo{\"RCPSS\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n    {0x54, 4, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0x58, 1, X86InstInfo{\"ADDSS\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n    {0x59, 1, X86InstInfo{\"MULSS\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n    {0x5A, 1, X86InstInfo{\"CVTSS2SD\",  TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,   0}},\n    {0x5B, 1, X86InstInfo{\"CVTTPS2DQ\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,  0}},\n    {0x5C, 1, X86InstInfo{\"SUBSS\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n    {0x5D, 1, X86InstInfo{\"MINSS\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n    {0x5E, 1, X86InstInfo{\"DIVSS\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n    {0x5F, 1, X86InstInfo{\"MAXSS\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n\n    {0x60, 8, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0x68, 7, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0x6F, 1, X86InstInfo{\"MOVDQU\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,  0}},\n\n    {0x70, 1, X86InstInfo{\"PSHUFHW\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,  1}},\n    {0x71, 3, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                     0}},\n    {0x74, 4, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0x78, 6, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0x7E, 1, X86InstInfo{\"MOVQ\",      TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,   0}},\n    {0x7F, 1, X86InstInfo{\"MOVDQU\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS,  0}},\n\n    {0x80, 16, X86InstInfo{\"\",         TYPE_COPY_OTHER, FLAGS_NONE,                                     0}},\n    {0x90, 16, X86InstInfo{\"\",         TYPE_COPY_OTHER, FLAGS_NONE,                                     0}},\n    {0xA0, 16, X86InstInfo{\"\",         TYPE_COPY_OTHER, FLAGS_NONE,                                     0}},\n\n    {0xB0, 8, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                     0}},\n    {0xB8, 1, X86InstInfo{\"POPCNT\",    TYPE_INST, FLAGS_MODRM,                                      0}},\n    {0xB9, 1, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                        0}},\n    {0xBA, 1, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                        0}},\n    {0xBB, 1, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0xBC, 1, X86InstInfo{\"TZCNT\",     TYPE_INST, FLAGS_MODRM,                                      0}},\n    {0xBD, 1, X86InstInfo{\"LZCNT\",     TYPE_INST, FLAGS_MODRM,                                      0}},\n    {0xBE, 2, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n\n    {0xC0, 2, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                     0}},\n    {0xC2, 1, X86InstInfo{\"CMPSS\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    1}},\n    {0xC3, 5, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0xC8, 8, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                     0}},\n\n    {0xD0, 6, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0xD6, 1, X86InstInfo{\"MOVQ2DQ\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX_SRC, 0}},\n    {0xD7, 1, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0xD8, 8, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n\n    {0xE0, 6, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0xE6, 1, X86InstInfo{\"CVTDQ2PD\",  TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,  0}},\n    {0xE7, 1, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0xE8, 8, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n\n    {0xF0, 8, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0xF8, 7, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n    {0xFF, 1, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                     0}},\n  };\n\n  GenerateTableWithCopy(Table.data(), RepModOpTable, std::size(RepModOpTable), SecondBaseOps.data());\n\n  IR::InstallToTable(Table, IR::OpDispatch_SecondaryRepModTables);\n  return Table;\n}();\n\nconstexpr std::array<X86InstInfo, MAX_REPNE_MOD_TABLE_SIZE> RepNEModOps = []() consteval {\n  std::array<X86InstInfo, MAX_REPNE_MOD_TABLE_SIZE> Table{};\n\n  constexpr U8U8InfoStruct RepNEModOpTable[] = {\n    {0x0, 16, X86InstInfo{\"\",           TYPE_COPY_OTHER, FLAGS_NONE,                                                     0}},\n\n    {0x10, 1, X86InstInfo{\"MOVSD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                  0}},\n    {0x11, 1, X86InstInfo{\"MOVSD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS,                  0}},\n    {0x12, 1, X86InstInfo{\"MOVDDUP\",    TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                  0}},\n    {0x13, 6, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,                                                        0}},\n    {0x19, 7, X86InstInfo{\"\",           TYPE_COPY_OTHER, FLAGS_NONE,                                                     0}},\n\n    {0x20, 4, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                                      0}},\n    {0x24, 6, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n    {0x2A, 1, X86InstInfo{\"CVTSI2SD\",  TYPE_INST, GenFlagsDstSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_SRC_GPR,                    0}},\n    {0x2B, 1, X86InstInfo{\"MOVNTSD\",   TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 0}},\n    {0x2C, 1, X86InstInfo{\"CVTTSD2SI\", TYPE_INST, FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR, 0}},\n    {0x2D, 1, X86InstInfo{\"CVTSD2SI\",  TYPE_INST, FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR, 0}},\n    {0x2E, 2, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n\n    {0x30, 16, X86InstInfo{\"\",         TYPE_COPY_OTHER, FLAGS_NONE,                                                      0}},\n    {0x40, 16, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE,                                                         0}},\n\n    {0x50, 1, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n    {0x51, 1, X86InstInfo{\"SQRTSD\",    TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {0x52, 6, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n    {0x58, 1, X86InstInfo{\"ADDSD\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n    {0x59, 1, X86InstInfo{\"MULSD\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n    {0x5A, 1, X86InstInfo{\"CVTSD2SS\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n    {0x5B, 1, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n    {0x5C, 1, X86InstInfo{\"SUBSD\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n    {0x5D, 1, X86InstInfo{\"MINSD\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n    {0x5E, 1, X86InstInfo{\"DIVSD\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n    {0x5F, 1, X86InstInfo{\"MAXSD\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    0}},\n\n    {0x60, 16, X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE,                                                         0}},\n\n    {0x70, 1, X86InstInfo{\"PSHUFLW\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                   1}},\n    {0x71, 3, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                                      0}},\n    {0x74, 4, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n    {0x78, 1, X86InstInfo{\"INSERTQ\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS,2}},\n    {0x79, 1, X86InstInfo{\"INSERTQ\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS, 0}},\n    {0x7A, 2, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n    {0x7C, 1, X86InstInfo{\"HADDPS\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                   0}},\n    {0x7D, 1, X86InstInfo{\"HSUBPS\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                   0}},\n    {0x7E, 2, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n\n    {0x80, 16, X86InstInfo{\"\",         TYPE_COPY_OTHER, FLAGS_NONE,                                                      0}},\n    {0x90, 16, X86InstInfo{\"\",         TYPE_COPY_OTHER, FLAGS_NONE,                                                      0}},\n    {0xA0, 16, X86InstInfo{\"\",         TYPE_COPY_OTHER, FLAGS_NONE,                                                      0}},\n    {0xB0, 8,  X86InstInfo{\"\",         TYPE_COPY_OTHER, FLAGS_NONE,                                                      0}},\n    {0xB8, 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,                                                               0}},\n    {0xB9, 1, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                        0}},\n    {0xBA, 1, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                        0}},\n    {0xBB, 5,  X86InstInfo{\"\",         TYPE_INVALID, FLAGS_NONE,                                                         0}},\n    {0xC0, 2, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                                      0}},\n    {0xC2, 1, X86InstInfo{\"CMPSD\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                    1}},\n    {0xC3, 5, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n    {0xC8, 8, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                                      0}},\n\n    {0xD0, 1, X86InstInfo{\"ADDSUBPS\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                   0}},\n    {0xD1, 5, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n    {0xD6, 1, X86InstInfo{\"MOVDQ2Q\",   TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX_DST,     0}},\n    {0xD7, 1, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n    {0xD8, 8, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n\n    {0xE0, 6, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n    {0xE6, 1, X86InstInfo{\"CVTPD2DQ\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                   0}},\n    {0xE7, 1, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n    {0xE8, 8, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n\n    {0xF0, 1, X86InstInfo{\"LDDQU\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_XMM_FLAGS,0}},\n    {0xF1, 7, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n    {0xF8, 8, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                                         0}},\n  };\n\n  GenerateTableWithCopy(Table.data(), RepNEModOpTable,   std::size(RepNEModOpTable), SecondBaseOps.data());\n\n  IR::InstallToTable(Table, IR::OpDispatch_SecondaryRepNEModTables);\n  return Table;\n}();\n\nconstexpr std::array<X86InstInfo, MAX_OPSIZE_MOD_TABLE_SIZE> OpSizeModOps = []() consteval {\n  std::array<X86InstInfo, MAX_OPSIZE_MOD_TABLE_SIZE> Table{};\n\n  constexpr U8U8InfoStruct OpSizeModOpTable[] = {\n    {0x0, 16, X86InstInfo{\"\",           TYPE_COPY_OTHER, FLAGS_NONE,                                                            0}},\n\n    {0x10, 1, X86InstInfo{\"MOVUPD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x11, 1, X86InstInfo{\"MOVUPD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS,                         0}},\n    {0x12, 1, X86InstInfo{\"MOVLPD\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_XMM_FLAGS,      0}},\n    {0x13, 1, X86InstInfo{\"MOVLPD\",     TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS,      0}},\n    {0x14, 1, X86InstInfo{\"UNPCKLPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x15, 1, X86InstInfo{\"UNPCKHPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x16, 1, X86InstInfo{\"MOVHPD\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_XMM_FLAGS,      0}},\n    {0x17, 1, X86InstInfo{\"MOVHPD\",     TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS,      0}},\n    {0x18, 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,                                                               0}},\n    {0x19, 7, X86InstInfo{\"\",           TYPE_COPY_OTHER, FLAGS_NONE,                                                            0}},\n\n    {0x20, 4, X86InstInfo{\"\",           TYPE_COPY_OTHER, FLAGS_NONE,                                                            0}},\n    {0x24, 4, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,                                                               0}},\n\n    {0x28, 1, X86InstInfo{\"MOVAPD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x29, 1, X86InstInfo{\"MOVAPD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS,                         0}},\n    {0x2A, 1, X86InstInfo{\"CVTPI2PD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX_SRC,                                                                   0}},\n    {0x2B, 1, X86InstInfo{\"MOVNTPD\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS,      0}},\n    {0x2C, 1, X86InstInfo{\"CVTTPD2PI\",  TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX_DST,                          0}},\n    {0x2D, 1, X86InstInfo{\"CVTPD2PI\",   TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX_DST,                          0}},\n    {0x2E, 1, X86InstInfo{\"UCOMISD\",    TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                          0}},\n    {0x2F, 1, X86InstInfo{\"COMISD\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                          0}},\n\n    {0x30, 16, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                                            0}},\n    {0x40, 16, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                                            0}},\n\n    {0x50, 1, X86InstInfo{\"MOVMSKPD\",   TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR,     0}},\n    {0x51, 1, X86InstInfo{\"SQRTPD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x52, 2, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,                                                               0}},\n    {0x54, 1, X86InstInfo{\"ANDPD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                        0}},\n    {0x55, 1, X86InstInfo{\"ANDNPD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x56, 1, X86InstInfo{\"ORPD\",       TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x57, 1, X86InstInfo{\"XORPD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x58, 1, X86InstInfo{\"ADDPD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x59, 1, X86InstInfo{\"MULPD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x5A, 1, X86InstInfo{\"CVTPD2PS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x5B, 1, X86InstInfo{\"CVTPS2DQ\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x5C, 1, X86InstInfo{\"SUBPD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x5D, 1, X86InstInfo{\"MINPD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x5E, 1, X86InstInfo{\"DIVPD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x5F, 1, X86InstInfo{\"MAXPD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n\n    {0x60, 1, X86InstInfo{\"PUNPCKLBW\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x61, 1, X86InstInfo{\"PUNPCKLWD\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x62, 1, X86InstInfo{\"PUNPCKLDQ\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x63, 1, X86InstInfo{\"PACKSSWB\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x64, 1, X86InstInfo{\"PCMPGTB\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x65, 1, X86InstInfo{\"PCMPGTW\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x66, 1, X86InstInfo{\"PCMPGTD\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x67, 1, X86InstInfo{\"PACKUSWB\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x68, 1, X86InstInfo{\"PUNPCKHBW\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x69, 1, X86InstInfo{\"PUNPCKHWD\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x6A, 1, X86InstInfo{\"PUNPCKHDQ\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x6B, 1, X86InstInfo{\"PACKSSDW\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x6C, 1, X86InstInfo{\"PUNPCKLQDQ\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x6D, 1, X86InstInfo{\"PUNPCKHQDQ\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x6E, 1, X86InstInfo{\"MOVD\",       TYPE_INST, GenFlagsDstSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_SRC_GPR | FLAGS_XMM_FLAGS,      0}},\n    {0x6F, 1, X86InstInfo{\"MOVDQA\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n\n    {0x70, 1, X86InstInfo{\"PSHUFD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         1}},\n    {0x71, 3, X86InstInfo{\"\",           TYPE_COPY_OTHER, FLAGS_NONE,                                                            0}},\n    {0x74, 1, X86InstInfo{\"PCMPEQB\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x75, 1, X86InstInfo{\"PCMPEQW\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x76, 1, X86InstInfo{\"PCMPEQD\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x77, 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,                                                               0}},\n    {0x78, 1, X86InstInfo{\"\",           TYPE_GROUP_17, FLAGS_NONE,                                                              0}},\n\n    {0x79, 1, X86InstInfo{\"EXTRQ\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS,                         0}},\n    {0x7A, 2, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,                                                               0}},\n    {0x7C, 1, X86InstInfo{\"HADDPD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x7D, 1, X86InstInfo{\"HSUBPD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0x7E, 1, X86InstInfo{\"MOVD\",       TYPE_INST, GenFlagsSrcSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_DST_GPR | FLAGS_XMM_FLAGS,      0}},\n    {0x7F, 1, X86InstInfo{\"MOVDQA\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS,                         0}},\n\n    {0x80, 16, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                                            0}},\n    {0x90, 16, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                                            0}},\n    {0xA0, 16, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                                            0}},\n    {0xB0, 8, X86InstInfo{\"\",           TYPE_COPY_OTHER, FLAGS_NONE,                                                            0}},\n    {0xB8, 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,                                                               0}},\n    {0xB9, 1, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                        0}},\n    {0xBA, 1, X86InstInfo{\"\",          TYPE_COPY_OTHER, FLAGS_NONE,                                        0}},\n    {0xBB, 5, X86InstInfo{\"\",          TYPE_INVALID, FLAGS_NONE,                                        0}},\n\n    {0xC0, 2, X86InstInfo{\"\",           TYPE_COPY_OTHER, FLAGS_NONE,                                                            0}},\n    {0xC2, 1, X86InstInfo{\"CMPPD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         1}},\n    {0xC3, 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,                                                               0}},\n    {0xC4, 1, X86InstInfo{\"PINSRW\",     TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_16BIT) | FLAGS_MODRM | FLAGS_SF_SRC_GPR | FLAGS_XMM_FLAGS,      1}},\n    {0xC5, 1, X86InstInfo{\"PEXTRW\",     TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_SF_DST_GPR | FLAGS_XMM_FLAGS,      1}},\n    {0xC6, 1, X86InstInfo{\"SHUFPD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         1}},\n    {0xC7, 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,                                                               0}},\n    {0xC8, 8, X86InstInfo{\"\",           TYPE_COPY_OTHER, FLAGS_NONE,                                                            0}},\n\n    {0xD0, 1, X86InstInfo{\"ADDSUBPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xD1, 1, X86InstInfo{\"PSRLW\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xD2, 1, X86InstInfo{\"PSRLD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xD3, 1, X86InstInfo{\"PSRLQ\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xD4, 1, X86InstInfo{\"PADDQ\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xD5, 1, X86InstInfo{\"PMULLW\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xD6, 1, X86InstInfo{\"MOVQ\",       TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS,       0}},\n    {0xD7, 1, X86InstInfo{\"PMOVMSKB\",   TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR,      0}},\n    {0xD8, 1, X86InstInfo{\"PSUBUSB\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xD9, 1, X86InstInfo{\"PSUBUSW\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xDA, 1, X86InstInfo{\"PMINUB\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xDB, 1, X86InstInfo{\"PAND\",       TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xDC, 1, X86InstInfo{\"PADDUSB\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xDD, 1, X86InstInfo{\"PADDUSW\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xDE, 1, X86InstInfo{\"PMAXUB\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xDF, 1, X86InstInfo{\"PANDN\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n\n    {0xE0, 1, X86InstInfo{\"PAVGB\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xE1, 1, X86InstInfo{\"PSRAW\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xE2, 1, X86InstInfo{\"PSRAD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xE3, 1, X86InstInfo{\"PAVGW\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xE4, 1, X86InstInfo{\"PMULHUW\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xE5, 1, X86InstInfo{\"PMULHW\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xE6, 1, X86InstInfo{\"CVTTPD2DQ\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xE7, 1, X86InstInfo{\"MOVNTDQ\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS,      0}},\n    {0xE8, 1, X86InstInfo{\"PSUBSB\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xE9, 1, X86InstInfo{\"PSUBSW\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xEA, 1, X86InstInfo{\"PMINSW\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xEB, 1, X86InstInfo{\"POR\",        TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xEC, 1, X86InstInfo{\"PADDSB\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xED, 1, X86InstInfo{\"PADDSW\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xEE, 1, X86InstInfo{\"PMAXSW\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xEF, 1, X86InstInfo{\"PXOR\",       TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n\n    {0xF0, 1, X86InstInfo{\"\",           TYPE_INVALID, FLAGS_NONE,                                                               0}},\n    {0xF1, 1, X86InstInfo{\"PSLLW\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xF2, 1, X86InstInfo{\"PSLLD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xF3, 1, X86InstInfo{\"PSLLQ\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xF4, 1, X86InstInfo{\"PMULUDQ\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xF5, 1, X86InstInfo{\"PMADDWD\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xF6, 1, X86InstInfo{\"PSADBW\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xF7, 1, X86InstInfo{\"MASKMOVDQU\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS,                         0}},\n    {0xF8, 1, X86InstInfo{\"PSUBB\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xF9, 1, X86InstInfo{\"PSUBW\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xFA, 1, X86InstInfo{\"PSUBD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xFB, 1, X86InstInfo{\"PSUBQ\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xFC, 1, X86InstInfo{\"PADDB\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xFD, 1, X86InstInfo{\"PADDW\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,                         0}},\n    {0xFE, 1, X86InstInfo{\"PADDD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS,       0}},\n    {0xFF, 1, X86InstInfo{\"\",           TYPE_COPY_OTHER, FLAGS_NONE,                                                            0}},\n  };\n\n  GenerateTableWithCopy(Table.data(), OpSizeModOpTable, std::size(OpSizeModOpTable), SecondBaseOps.data());\n\n  IR::InstallToTable(Table, IR::OpDispatch_SecondaryOpSizeModTables);\n  return Table;\n}();\n}\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-tables\n$end_info$\n*/\n\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/Core/OpcodeDispatcher/VEXTables.h\"\n\n#include <iterator>\n\nnamespace FEXCore::X86Tables {\nusing namespace InstFlags;\n\nnamespace AVX128 {\n  using namespace IR;\n#define OPD(map_select, pp, opcode) (((map_select - 1) << 10) | (pp << 8) | (opcode))\n  constexpr DispatchTableEntry BaseTable[] = {\n    {OPD(1, 0b00, 0x10), 1, &OpDispatchBuilder::AVX128_VMOVAPS},\n    {OPD(1, 0b01, 0x10), 1, &OpDispatchBuilder::AVX128_VMOVAPS},\n    {OPD(1, 0b10, 0x10), 1, &OpDispatchBuilder::AVX128_VMOVSS},\n    {OPD(1, 0b11, 0x10), 1, &OpDispatchBuilder::AVX128_VMOVSD},\n    {OPD(1, 0b00, 0x11), 1, &OpDispatchBuilder::AVX128_VMOVAPS},\n    {OPD(1, 0b01, 0x11), 1, &OpDispatchBuilder::AVX128_VMOVAPS},\n    {OPD(1, 0b10, 0x11), 1, &OpDispatchBuilder::AVX128_VMOVSS},\n    {OPD(1, 0b11, 0x11), 1, &OpDispatchBuilder::AVX128_VMOVSD},\n\n    {OPD(1, 0b00, 0x12), 1, &OpDispatchBuilder::AVX128_VMOVLP},\n    {OPD(1, 0b01, 0x12), 1, &OpDispatchBuilder::AVX128_VMOVLP},\n    {OPD(1, 0b10, 0x12), 1, &OpDispatchBuilder::AVX128_VMOVSLDUP},\n    {OPD(1, 0b11, 0x12), 1, &OpDispatchBuilder::AVX128_VMOVDDUP},\n    {OPD(1, 0b00, 0x13), 1, &OpDispatchBuilder::AVX128_VMOVLP},\n    {OPD(1, 0b01, 0x13), 1, &OpDispatchBuilder::AVX128_VMOVLP},\n\n    {OPD(1, 0b00, 0x14), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPUNPCKL, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x14), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPUNPCKL, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x15), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPUNPCKH, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x15), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPUNPCKH, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x16), 1, &OpDispatchBuilder::AVX128_VMOVHP},\n    {OPD(1, 0b01, 0x16), 1, &OpDispatchBuilder::AVX128_VMOVHP},\n    {OPD(1, 0b10, 0x16), 1, &OpDispatchBuilder::AVX128_VMOVSHDUP},\n    {OPD(1, 0b00, 0x17), 1, &OpDispatchBuilder::AVX128_VMOVHP},\n    {OPD(1, 0b01, 0x17), 1, &OpDispatchBuilder::AVX128_VMOVHP},\n\n    {OPD(1, 0b00, 0x28), 1, &OpDispatchBuilder::AVX128_VMOVAPS},\n    {OPD(1, 0b01, 0x28), 1, &OpDispatchBuilder::AVX128_VMOVAPS},\n    {OPD(1, 0b00, 0x29), 1, &OpDispatchBuilder::AVX128_VMOVAPS},\n    {OPD(1, 0b01, 0x29), 1, &OpDispatchBuilder::AVX128_VMOVAPS},\n\n    {OPD(1, 0b10, 0x2A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_InsertCVTGPR_To_FPR, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x2A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_InsertCVTGPR_To_FPR, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x2B), 1, &OpDispatchBuilder::AVX128_MOVVectorNT},\n    {OPD(1, 0b01, 0x2B), 1, &OpDispatchBuilder::AVX128_MOVVectorNT},\n\n    {OPD(1, 0b10, 0x2C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_CVTFPR_To_GPR, OpSize::i32Bit, false>},\n    {OPD(1, 0b11, 0x2C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_CVTFPR_To_GPR, OpSize::i64Bit, false>},\n\n    {OPD(1, 0b10, 0x2D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_CVTFPR_To_GPR, OpSize::i32Bit, true>},\n    {OPD(1, 0b11, 0x2D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_CVTFPR_To_GPR, OpSize::i64Bit, true>},\n\n    {OPD(1, 0b00, 0x2E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_UCOMISx, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x2E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_UCOMISx, OpSize::i64Bit>},\n    {OPD(1, 0b00, 0x2F), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_UCOMISx, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x2F), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_UCOMISx, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x50), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_MOVMSK, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x50), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_MOVMSK, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x51), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorUnary, IR::OP_VFSQRT, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x51), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorUnary, IR::OP_VFSQRT, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0x51), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFSQRTSCALARINSERT, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x51), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFSQRTSCALARINSERT, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x52), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorUnary, IR::OP_VFRSQRT, OpSize::i32Bit>},\n    {OPD(1, 0b10, 0x52), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFRSQRTSCALARINSERT, OpSize::i32Bit>},\n\n    {OPD(1, 0b00, 0x53), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorUnary, IR::OP_VFRECP, OpSize::i32Bit>},\n    {OPD(1, 0b10, 0x53), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFRECPSCALARINSERT, OpSize::i32Bit>},\n\n    {OPD(1, 0b00, 0x54), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VAND, OpSize::i128Bit>},\n    {OPD(1, 0b01, 0x54), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VAND, OpSize::i128Bit>},\n\n    {OPD(1, 0b00, 0x55), 1, &OpDispatchBuilder::AVX128_VANDN},\n    {OPD(1, 0b01, 0x55), 1, &OpDispatchBuilder::AVX128_VANDN},\n\n    {OPD(1, 0b00, 0x56), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VOR, OpSize::i128Bit>},\n    {OPD(1, 0b01, 0x56), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VOR, OpSize::i128Bit>},\n\n    {OPD(1, 0b00, 0x57), 1, &OpDispatchBuilder::AVX128_VectorXOR},\n    {OPD(1, 0b01, 0x57), 1, &OpDispatchBuilder::AVX128_VectorXOR},\n\n    {OPD(1, 0b00, 0x58), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VFADD, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x58), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VFADD, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0x58), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFADDSCALARINSERT, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x58), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFADDSCALARINSERT, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x59), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VFMUL, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x59), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VFMUL, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0x59), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFMULSCALARINSERT, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x59), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFMULSCALARINSERT, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x5A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_Vector_CVT_Float_To_Float, OpSize::i64Bit, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x5A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_Vector_CVT_Float_To_Float, OpSize::i32Bit, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0x5A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_InsertScalar_CVT_Float_To_Float, OpSize::i64Bit, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x5A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_InsertScalar_CVT_Float_To_Float, OpSize::i32Bit, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x5B), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_Vector_CVT_Int_To_Float, OpSize::i32Bit, false>},\n    {OPD(1, 0b01, 0x5B), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_Vector_CVT_Float_To_Int, OpSize::i32Bit, true>},\n    {OPD(1, 0b10, 0x5B), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_Vector_CVT_Float_To_Int, OpSize::i32Bit, false>},\n\n    {OPD(1, 0b00, 0x5C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VFSUB, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x5C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VFSUB, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0x5C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFSUBSCALARINSERT, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x5C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFSUBSCALARINSERT, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x5D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VFMIN, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x5D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VFMIN, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0x5D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFMINSCALARINSERT, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x5D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFMINSCALARINSERT, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x5E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VFDIV, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x5E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VFDIV, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0x5E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFDIVSCALARINSERT, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x5E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFDIVSCALARINSERT, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x5F), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VFMAX, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x5F), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VFMAX, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0x5F), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFMAXSCALARINSERT, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x5F), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorScalarInsertALU, IR::OP_VFMAXSCALARINSERT, OpSize::i64Bit>},\n\n    {OPD(1, 0b01, 0x60), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPUNPCKL, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0x61), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPUNPCKL, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0x62), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPUNPCKL, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x63), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPACKSS, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0x64), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VCMPGT, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0x65), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VCMPGT, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0x66), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VCMPGT, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x67), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPACKUS, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0x68), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPUNPCKH, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0x69), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPUNPCKH, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0x6A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPUNPCKH, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x6B), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPACKSS, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x6C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPUNPCKL, OpSize::i64Bit>},\n    {OPD(1, 0b01, 0x6D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPUNPCKH, OpSize::i64Bit>},\n    {OPD(1, 0b01, 0x6E), 1, &OpDispatchBuilder::AVX128_MOVBetweenGPR_FPR},\n\n    {OPD(1, 0b01, 0x6F), 1, &OpDispatchBuilder::AVX128_VMOVAPS},\n    {OPD(1, 0b10, 0x6F), 1, &OpDispatchBuilder::AVX128_VMOVAPS},\n\n    {OPD(1, 0b01, 0x70), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPERMILImm, OpSize::i32Bit>},\n    {OPD(1, 0b10, 0x70), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPSHUFW, false>},\n    {OPD(1, 0b11, 0x70), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPSHUFW, true>},\n\n    {OPD(1, 0b01, 0x74), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VCMPEQ, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0x75), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VCMPEQ, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0x76), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VCMPEQ, OpSize::i32Bit>},\n\n    {OPD(1, 0b00, 0x77), 1, &OpDispatchBuilder::AVX128_VZERO},\n\n    {OPD(1, 0b01, 0x7C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VHADDP, IR::OP_VFADDP, OpSize::i64Bit>},\n    {OPD(1, 0b11, 0x7C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VHADDP, IR::OP_VFADDP, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x7D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VHSUBP, OpSize::i64Bit>},\n    {OPD(1, 0b11, 0x7D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VHSUBP, OpSize::i32Bit>},\n\n    {OPD(1, 0b01, 0x7E), 1, &OpDispatchBuilder::AVX128_MOVBetweenGPR_FPR},\n    {OPD(1, 0b10, 0x7E), 1, &OpDispatchBuilder::AVX128_MOVQ},\n\n    {OPD(1, 0b01, 0x7F), 1, &OpDispatchBuilder::AVX128_VMOVAPS},\n    {OPD(1, 0b10, 0x7F), 1, &OpDispatchBuilder::AVX128_VMOVAPS},\n\n    {OPD(1, 0b00, 0xC2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFCMP, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0xC2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFCMP, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0xC2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_InsertScalarFCMP, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0xC2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_InsertScalarFCMP, OpSize::i64Bit>},\n\n    {OPD(1, 0b01, 0xC4), 1, &OpDispatchBuilder::AVX128_VPINSRW},\n    {OPD(1, 0b01, 0xC5), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_PExtr, OpSize::i16Bit>},\n\n    {OPD(1, 0b00, 0xC6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VSHUF, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0xC6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VSHUF, OpSize::i64Bit>},\n\n    {OPD(1, 0b01, 0xD0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VADDSUBP, OpSize::i64Bit>},\n    {OPD(1, 0b11, 0xD0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VADDSUBP, OpSize::i32Bit>},\n\n    {OPD(1, 0b01, 0xD1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftWideImpl, OpSize::i16Bit, IROps::OP_VUSHRSWIDE>}, // VPSRL\n    {OPD(1, 0b01, 0xD2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftWideImpl, OpSize::i32Bit, IROps::OP_VUSHRSWIDE>}, // VPSRL\n    {OPD(1, 0b01, 0xD3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftWideImpl, OpSize::i64Bit, IROps::OP_VUSHRSWIDE>}, // VPSRL\n    {OPD(1, 0b01, 0xD4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VADD, OpSize::i64Bit>},\n    {OPD(1, 0b01, 0xD5), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VMUL, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xD6), 1, &OpDispatchBuilder::AVX128_MOVQ},\n    {OPD(1, 0b01, 0xD7), 1, &OpDispatchBuilder::AVX128_MOVMSKB},\n\n    {OPD(1, 0b01, 0xD8), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VUQSUB, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xD9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VUQSUB, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xDA), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VUMIN, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xDB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VAND, OpSize::i128Bit>},\n    {OPD(1, 0b01, 0xDC), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VUQADD, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xDD), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VUQADD, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xDE), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VUMAX, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xDF), 1, &OpDispatchBuilder::AVX128_VANDN},\n\n    {OPD(1, 0b01, 0xE0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VURAVG, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xE1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftWideImpl, OpSize::i16Bit, IROps::OP_VSSHRSWIDE>}, // VPSRA\n    {OPD(1, 0b01, 0xE2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftWideImpl, OpSize::i32Bit, IROps::OP_VSSHRSWIDE>}, // VPSRA\n    {OPD(1, 0b01, 0xE3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VURAVG, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xE4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPMULHW, false>},\n    {OPD(1, 0b01, 0xE5), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPMULHW, true>},\n\n    {OPD(1, 0b01, 0xE6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_Vector_CVT_Float_To_Int, OpSize::i64Bit, false>},\n    {OPD(1, 0b10, 0xE6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_Vector_CVT_Int_To_Float, OpSize::i32Bit, true>},\n    {OPD(1, 0b11, 0xE6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_Vector_CVT_Float_To_Int, OpSize::i64Bit, true>},\n\n    {OPD(1, 0b01, 0xE7), 1, &OpDispatchBuilder::AVX128_MOVVectorNT},\n\n    {OPD(1, 0b01, 0xE8), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VSQSUB, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xE9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VSQSUB, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xEA), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VSMIN, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xEB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VOR, OpSize::i128Bit>},\n    {OPD(1, 0b01, 0xEC), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VSQADD, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xED), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VSQADD, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xEE), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VSMAX, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xEF), 1, &OpDispatchBuilder::AVX128_VectorXOR},\n\n    {OPD(1, 0b11, 0xF0), 1, &OpDispatchBuilder::AVX128_MOVVectorUnaligned},\n    {OPD(1, 0b01, 0xF1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftWideImpl, OpSize::i16Bit, IROps::OP_VUSHLSWIDE>}, // VPSLL\n    {OPD(1, 0b01, 0xF2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftWideImpl, OpSize::i32Bit, IROps::OP_VUSHLSWIDE>}, // VPSLL\n    {OPD(1, 0b01, 0xF3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftWideImpl, OpSize::i64Bit, IROps::OP_VUSHLSWIDE>}, // VPSLL\n    {OPD(1, 0b01, 0xF4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPMULL, OpSize::i32Bit, false>},\n    {OPD(1, 0b01, 0xF5), 1, &OpDispatchBuilder::AVX128_VPMADDWD},\n    {OPD(1, 0b01, 0xF6), 1, &OpDispatchBuilder::AVX128_VPSADBW},\n    {OPD(1, 0b01, 0xF7), 1, &OpDispatchBuilder::AVX128_MASKMOV},\n\n    {OPD(1, 0b01, 0xF8), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VSUB, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xF9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VSUB, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xFA), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VSUB, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0xFB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VSUB, OpSize::i64Bit>},\n    {OPD(1, 0b01, 0xFC), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VADD, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xFD), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VADD, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xFE), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VADD, OpSize::i32Bit>},\n\n    {OPD(2, 0b01, 0x00), 1, &OpDispatchBuilder::AVX128_VPSHUFB},\n    {OPD(2, 0b01, 0x01), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VHADDP, IR::OP_VADDP, OpSize::i16Bit>},\n    {OPD(2, 0b01, 0x02), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VHADDP, IR::OP_VADDP, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x03), 1, &OpDispatchBuilder::AVX128_VPHADDSW},\n    {OPD(2, 0b01, 0x04), 1, &OpDispatchBuilder::AVX128_VPMADDUBSW},\n\n    {OPD(2, 0b01, 0x05), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPHSUB, OpSize::i16Bit>},\n    {OPD(2, 0b01, 0x06), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPHSUB, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x07), 1, &OpDispatchBuilder::AVX128_VPHSUBSW},\n\n    {OPD(2, 0b01, 0x08), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPSIGN, OpSize::i8Bit>},\n    {OPD(2, 0b01, 0x09), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPSIGN, OpSize::i16Bit>},\n    {OPD(2, 0b01, 0x0A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPSIGN, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x0B), 1, &OpDispatchBuilder::AVX128_VPMULHRSW},\n    {OPD(2, 0b01, 0x0C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPERMILReg, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x0D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPERMILReg, OpSize::i64Bit>},\n    {OPD(2, 0b01, 0x0E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VTESTP, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x0F), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VTESTP, OpSize::i64Bit>},\n\n\n    {OPD(2, 0b01, 0x13), 1, &OpDispatchBuilder::AVX128_VCVTPH2PS},\n    {OPD(2, 0b01, 0x16), 1, &OpDispatchBuilder::AVX128_VPERMD},\n    {OPD(2, 0b01, 0x17), 1, &OpDispatchBuilder::AVX128_PTest},\n    {OPD(2, 0b01, 0x18), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VBROADCAST, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x19), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VBROADCAST, OpSize::i64Bit>},\n    {OPD(2, 0b01, 0x1A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VBROADCAST, OpSize::i128Bit>},\n    {OPD(2, 0b01, 0x1C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorUnary, IR::OP_VABS, OpSize::i8Bit>},\n    {OPD(2, 0b01, 0x1D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorUnary, IR::OP_VABS, OpSize::i16Bit>},\n    {OPD(2, 0b01, 0x1E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorUnary, IR::OP_VABS, OpSize::i32Bit>},\n\n    {OPD(2, 0b01, 0x20), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_ExtendVectorElements, OpSize::i8Bit, OpSize::i16Bit, true>},\n    {OPD(2, 0b01, 0x21), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_ExtendVectorElements, OpSize::i8Bit, OpSize::i32Bit, true>},\n    {OPD(2, 0b01, 0x22), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_ExtendVectorElements, OpSize::i8Bit, OpSize::i64Bit, true>},\n    {OPD(2, 0b01, 0x23), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_ExtendVectorElements, OpSize::i16Bit, OpSize::i32Bit, true>},\n    {OPD(2, 0b01, 0x24), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_ExtendVectorElements, OpSize::i16Bit, OpSize::i64Bit, true>},\n    {OPD(2, 0b01, 0x25), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_ExtendVectorElements, OpSize::i32Bit, OpSize::i64Bit, true>},\n\n    {OPD(2, 0b01, 0x28), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPMULL, OpSize::i32Bit, true>},\n    {OPD(2, 0b01, 0x29), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VCMPEQ, OpSize::i64Bit>},\n    {OPD(2, 0b01, 0x2A), 1, &OpDispatchBuilder::AVX128_MOVVectorNT},\n    {OPD(2, 0b01, 0x2B), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPACKUS, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x2C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VMASKMOV, OpSize::i32Bit, false>},\n    {OPD(2, 0b01, 0x2D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VMASKMOV, OpSize::i64Bit, false>},\n    {OPD(2, 0b01, 0x2E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VMASKMOV, OpSize::i32Bit, true>},\n    {OPD(2, 0b01, 0x2F), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VMASKMOV, OpSize::i64Bit, true>},\n\n    {OPD(2, 0b01, 0x30), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_ExtendVectorElements, OpSize::i8Bit, OpSize::i16Bit, false>},\n    {OPD(2, 0b01, 0x31), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_ExtendVectorElements, OpSize::i8Bit, OpSize::i32Bit, false>},\n    {OPD(2, 0b01, 0x32), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_ExtendVectorElements, OpSize::i8Bit, OpSize::i64Bit, false>},\n    {OPD(2, 0b01, 0x33), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_ExtendVectorElements, OpSize::i16Bit, OpSize::i32Bit, false>},\n    {OPD(2, 0b01, 0x34), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_ExtendVectorElements, OpSize::i16Bit, OpSize::i64Bit, false>},\n    {OPD(2, 0b01, 0x35), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_ExtendVectorElements, OpSize::i32Bit, OpSize::i64Bit, false>},\n    {OPD(2, 0b01, 0x36), 1, &OpDispatchBuilder::AVX128_VPERMD},\n\n    {OPD(2, 0b01, 0x37), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VCMPGT, OpSize::i64Bit>},\n    {OPD(2, 0b01, 0x38), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VSMIN, OpSize::i8Bit>},\n    {OPD(2, 0b01, 0x39), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VSMIN, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x3A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VUMIN, OpSize::i16Bit>},\n    {OPD(2, 0b01, 0x3B), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VUMIN, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x3C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VSMAX, OpSize::i8Bit>},\n    {OPD(2, 0b01, 0x3D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VSMAX, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x3E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VUMAX, OpSize::i16Bit>},\n    {OPD(2, 0b01, 0x3F), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VUMAX, OpSize::i32Bit>},\n\n    {OPD(2, 0b01, 0x40), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorALU, IR::OP_VMUL, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x41), 1, &OpDispatchBuilder::AVX128_PHMINPOSUW},\n    {OPD(2, 0b01, 0x45), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VariableShiftImpl, IROps::OP_VUSHR>}, // VPSRLV\n    {OPD(2, 0b01, 0x46), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VariableShiftImpl, IROps::OP_VSSHR>}, // VPSRAVD\n    {OPD(2, 0b01, 0x47), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VariableShiftImpl, IROps::OP_VUSHL>}, // VPSLLV\n\n    {OPD(2, 0b01, 0x58), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VBROADCAST, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x59), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VBROADCAST, OpSize::i64Bit>},\n    {OPD(2, 0b01, 0x5A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VBROADCAST, OpSize::i128Bit>},\n\n    {OPD(2, 0b01, 0x78), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VBROADCAST, OpSize::i8Bit>},\n    {OPD(2, 0b01, 0x79), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VBROADCAST, OpSize::i16Bit>},\n\n    {OPD(2, 0b01, 0x8C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPMASKMOV, false>},\n    {OPD(2, 0b01, 0x8E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPMASKMOV, true>},\n\n    {OPD(2, 0b01, 0x90), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPGATHER, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x91), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPGATHER, OpSize::i64Bit>},\n    {OPD(2, 0b01, 0x92), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPGATHER, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x93), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPGATHER, OpSize::i64Bit>},\n\n    {OPD(2, 0b01, 0x96), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAddSubImpl, true, 1, 3, 2>},  // VFMADDSUB\n    {OPD(2, 0b01, 0x97), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAddSubImpl, false, 1, 3, 2>}, // VFMSUBADD\n\n    {OPD(2, 0b01, 0x98), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAImpl, IR::OP_VFMLA, 1, 3, 2>}, // VFMADD\n    {OPD(2, 0b01, 0x99), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAScalarImpl, IR::OP_VFMLASCALARINSERT, 1, 3, 2>}, // VFMADD\n    {OPD(2, 0b01, 0x9A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAImpl, IR::OP_VFMLS, 1, 3, 2>}, // VFMSUB\n    {OPD(2, 0b01, 0x9B), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAScalarImpl, IR::OP_VFMLSSCALARINSERT, 1, 3, 2>}, // VFMSUB\n    {OPD(2, 0b01, 0x9C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAImpl, IR::OP_VFNMLA, 1, 3, 2>}, // VFNMADD\n    {OPD(2, 0b01, 0x9D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAScalarImpl, IR::OP_VFNMLASCALARINSERT, 1, 3, 2>}, // VFNMADD\n    {OPD(2, 0b01, 0x9E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAImpl, IR::OP_VFNMLS, 1, 3, 2>}, // VFNMSUB\n    {OPD(2, 0b01, 0x9F), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAScalarImpl, IR::OP_VFNMLSSCALARINSERT, 1, 3, 2>}, // VFNMSUB\n\n    {OPD(2, 0b01, 0xA8), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAImpl, IR::OP_VFMLA, 2, 1, 3>}, // VFMADD\n    {OPD(2, 0b01, 0xA9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAScalarImpl, IR::OP_VFMLASCALARINSERT, 2, 1, 3>}, // VFMADD\n    {OPD(2, 0b01, 0xAA), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAImpl, IR::OP_VFMLS, 2, 1, 3>}, // VFMSUB\n    {OPD(2, 0b01, 0xAB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAScalarImpl, IR::OP_VFMLSSCALARINSERT, 2, 1, 3>}, // VFMSUB\n    {OPD(2, 0b01, 0xAC), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAImpl, IR::OP_VFNMLA, 2, 1, 3>}, // VFNMADD\n    {OPD(2, 0b01, 0xAD), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAScalarImpl, IR::OP_VFNMLASCALARINSERT, 2, 1, 3>}, // VFNMADD\n    {OPD(2, 0b01, 0xAE), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAImpl, IR::OP_VFNMLS, 2, 1, 3>}, // VFNMSUB\n    {OPD(2, 0b01, 0xAF), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAScalarImpl, IR::OP_VFNMLSSCALARINSERT, 2, 1, 3>}, // VFNMSUB\n\n    {OPD(2, 0b01, 0xB8), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAImpl, IR::OP_VFMLA, 2, 3, 1>}, // VFMADD\n    {OPD(2, 0b01, 0xB9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAScalarImpl, IR::OP_VFMLASCALARINSERT, 2, 3, 1>}, // VFMADD\n    {OPD(2, 0b01, 0xBA), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAImpl, IR::OP_VFMLS, 2, 3, 1>}, // VFMSUB\n    {OPD(2, 0b01, 0xBB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAScalarImpl, IR::OP_VFMLSSCALARINSERT, 2, 3, 1>}, // VFMSUB\n    {OPD(2, 0b01, 0xBC), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAImpl, IR::OP_VFNMLA, 2, 3, 1>}, // VFNMADD\n    {OPD(2, 0b01, 0xBD), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAScalarImpl, IR::OP_VFNMLASCALARINSERT, 2, 3, 1>}, // VFNMADD\n    {OPD(2, 0b01, 0xBE), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAImpl, IR::OP_VFNMLS, 2, 3, 1>}, // VFNMSUB\n    {OPD(2, 0b01, 0xBF), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAScalarImpl, IR::OP_VFNMLSSCALARINSERT, 2, 3, 1>}, // VFNMSUB\n\n    {OPD(2, 0b01, 0xA6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAddSubImpl, true, 2, 1, 3>},  // VFMADDSUB\n    {OPD(2, 0b01, 0xA7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAddSubImpl, false, 2, 1, 3>}, // VFMSUBADD\n\n    {OPD(2, 0b01, 0xB6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAddSubImpl, true, 2, 3, 1>},  // VFMADDSUB\n    {OPD(2, 0b01, 0xB7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VFMAddSubImpl, false, 2, 3, 1>}, // VFMSUBADD\n\n    {OPD(2, 0b01, 0xDB), 1, &OpDispatchBuilder::AVX128_VAESImc},\n    {OPD(2, 0b01, 0xDC), 1, &OpDispatchBuilder::AVX128_VAESEnc},\n    {OPD(2, 0b01, 0xDD), 1, &OpDispatchBuilder::AVX128_VAESEncLast},\n    {OPD(2, 0b01, 0xDE), 1, &OpDispatchBuilder::AVX128_VAESDec},\n    {OPD(2, 0b01, 0xDF), 1, &OpDispatchBuilder::AVX128_VAESDecLast},\n\n    {OPD(3, 0b01, 0x00), 1, &OpDispatchBuilder::AVX128_VPERMQ},\n    {OPD(3, 0b01, 0x01), 1, &OpDispatchBuilder::AVX128_VPERMQ},\n    {OPD(3, 0b01, 0x02), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VBLEND, OpSize::i32Bit>},\n    {OPD(3, 0b01, 0x04), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPERMILImm, OpSize::i32Bit>},\n    {OPD(3, 0b01, 0x05), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VPERMILImm, OpSize::i64Bit>},\n    {OPD(3, 0b01, 0x06), 1, &OpDispatchBuilder::AVX128_VPERM2},\n    {OPD(3, 0b01, 0x08), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorRound, OpSize::i32Bit>},\n    {OPD(3, 0b01, 0x09), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorRound, OpSize::i64Bit>},\n    {OPD(3, 0b01, 0x0A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_InsertScalarRound, OpSize::i32Bit>},\n    {OPD(3, 0b01, 0x0B), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_InsertScalarRound, OpSize::i64Bit>},\n    {OPD(3, 0b01, 0x0C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VBLEND, OpSize::i32Bit>},\n    {OPD(3, 0b01, 0x0D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VBLEND, OpSize::i64Bit>},\n    {OPD(3, 0b01, 0x0E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VBLEND, OpSize::i16Bit>},\n    {OPD(3, 0b01, 0x0F), 1, &OpDispatchBuilder::AVX128_VPALIGNR},\n\n    {OPD(3, 0b01, 0x14), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_PExtr, OpSize::i8Bit>},\n    {OPD(3, 0b01, 0x15), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_PExtr, OpSize::i16Bit>},\n    {OPD(3, 0b01, 0x16), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_PExtr, OpSize::i32Bit>},\n    {OPD(3, 0b01, 0x17), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_PExtr, OpSize::i32Bit>},\n\n    {OPD(3, 0b01, 0x18), 1, &OpDispatchBuilder::AVX128_VINSERT},\n    {OPD(3, 0b01, 0x19), 1, &OpDispatchBuilder::AVX128_VEXTRACT128},\n    {OPD(3, 0b01, 0x1D), 1, &OpDispatchBuilder::AVX128_VCVTPS2PH},\n    {OPD(3, 0b01, 0x20), 1, &OpDispatchBuilder::AVX128_VPINSRB},\n    {OPD(3, 0b01, 0x21), 1, &OpDispatchBuilder::AVX128_VINSERTPS},\n    {OPD(3, 0b01, 0x22), 1, &OpDispatchBuilder::AVX128_VPINSRDQ},\n\n    {OPD(3, 0b01, 0x38), 1, &OpDispatchBuilder::AVX128_VINSERT},\n    {OPD(3, 0b01, 0x39), 1, &OpDispatchBuilder::AVX128_VEXTRACT128},\n\n    {OPD(3, 0b01, 0x40), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VDPP, OpSize::i32Bit>},\n    {OPD(3, 0b01, 0x41), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VDPP, OpSize::i64Bit>},\n    {OPD(3, 0b01, 0x42), 1, &OpDispatchBuilder::AVX128_VMPSADBW},\n    {OPD(3, 0b01, 0x44), 1, &OpDispatchBuilder::AVX128_VPCLMULQDQ},\n\n    {OPD(3, 0b01, 0x46), 1, &OpDispatchBuilder::AVX128_VPERM2},\n\n    {OPD(3, 0b01, 0x4A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorVariableBlend, OpSize::i32Bit>},\n    {OPD(3, 0b01, 0x4B), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorVariableBlend, OpSize::i64Bit>},\n    {OPD(3, 0b01, 0x4C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorVariableBlend, OpSize::i8Bit>},\n\n    {OPD(3, 0b01, 0x60), 1, &OpDispatchBuilder::AVX128_VPCMPESTRM},\n    {OPD(3, 0b01, 0x61), 1, &OpDispatchBuilder::AVX128_VPCMPESTRI},\n    {OPD(3, 0b01, 0x62), 1, &OpDispatchBuilder::AVX128_VPCMPISTRM},\n    {OPD(3, 0b01, 0x63), 1, &OpDispatchBuilder::AVX128_VPCMPISTRI},\n\n    {OPD(3, 0b01, 0xDF), 1, &OpDispatchBuilder::AVX128_VAESKeyGenAssist},\n  };\n#undef OPD\n\n#define OPD(group, pp, opcode) (((group - X86Tables::TYPE_VEX_GROUP_12) << 4) | (pp << 3) | (opcode))\n  constexpr DispatchTableEntry TableGroupOps[] {\n    // VPSRLI\n    {OPD(X86Tables::TYPE_VEX_GROUP_12, 1, 0b010), 1,\n     &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftImmImpl, OpSize::i16Bit, IROps::OP_VUSHRI>},\n    // VPSLLI\n    {OPD(X86Tables::TYPE_VEX_GROUP_12, 1, 0b110), 1,\n     &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftImmImpl, OpSize::i16Bit, IROps::OP_VSHLI>},\n    // VPSRAI\n    {OPD(X86Tables::TYPE_VEX_GROUP_12, 1, 0b100), 1,\n     &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftImmImpl, OpSize::i16Bit, IROps::OP_VSSHRI>},\n\n    // VPSRLI\n    {OPD(X86Tables::TYPE_VEX_GROUP_13, 1, 0b010), 1,\n     &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftImmImpl, OpSize::i32Bit, IROps::OP_VUSHRI>},\n    // VPSLLI\n    {OPD(X86Tables::TYPE_VEX_GROUP_13, 1, 0b110), 1,\n     &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftImmImpl, OpSize::i32Bit, IROps::OP_VSHLI>},\n    // VPSRAI\n    {OPD(X86Tables::TYPE_VEX_GROUP_13, 1, 0b100), 1,\n     &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftImmImpl, OpSize::i32Bit, IROps::OP_VSSHRI>},\n\n    // VPSRLI\n    {OPD(X86Tables::TYPE_VEX_GROUP_14, 1, 0b010), 1,\n     &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftImmImpl, OpSize::i64Bit, IROps::OP_VUSHRI>},\n    // VPSRLDQ\n    {OPD(X86Tables::TYPE_VEX_GROUP_14, 1, 0b011), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_ShiftDoubleImm, OpDispatchBuilder::ShiftDirection::RIGHT>},\n    // VPSLLI\n    {OPD(X86Tables::TYPE_VEX_GROUP_14, 1, 0b110), 1,\n     &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_VectorShiftImmImpl, OpSize::i64Bit, IROps::OP_VSHLI>},\n    // VPSLLDQ\n    {OPD(X86Tables::TYPE_VEX_GROUP_14, 1, 0b111), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVX128_ShiftDoubleImm, OpDispatchBuilder::ShiftDirection::LEFT>},\n\n    ///< Use the regular implementation. It just happens to be in the VEX table.\n    {OPD(X86Tables::TYPE_VEX_GROUP_15, 0, 0b010), 1, &OpDispatchBuilder::LDMXCSR},\n    {OPD(X86Tables::TYPE_VEX_GROUP_15, 0, 0b011), 1, &OpDispatchBuilder::STMXCSR},\n  };\n#undef OPD\n}\n\nnamespace AVX256 {\n  using namespace IR;\n#define OPD(map_select, pp, opcode) (((map_select - 1) << 10) | (pp << 8) | (opcode))\n  constexpr DispatchTableEntry BaseTable[] = {\n    {OPD(1, 0b00, 0x10), 1, &OpDispatchBuilder::VMOVUPS_VMOVUPDOp},\n    {OPD(1, 0b01, 0x10), 1, &OpDispatchBuilder::VMOVUPS_VMOVUPDOp},\n    {OPD(1, 0b10, 0x10), 1, &OpDispatchBuilder::VMOVSSOp},\n    {OPD(1, 0b11, 0x10), 1, &OpDispatchBuilder::VMOVSDOp},\n    {OPD(1, 0b00, 0x11), 1, &OpDispatchBuilder::VMOVUPS_VMOVUPDOp},\n    {OPD(1, 0b01, 0x11), 1, &OpDispatchBuilder::VMOVUPS_VMOVUPDOp},\n    {OPD(1, 0b10, 0x11), 1, &OpDispatchBuilder::VMOVSSOp},\n    {OPD(1, 0b11, 0x11), 1, &OpDispatchBuilder::VMOVSDOp},\n\n    {OPD(1, 0b00, 0x12), 1, &OpDispatchBuilder::VMOVLPOp},\n    {OPD(1, 0b01, 0x12), 1, &OpDispatchBuilder::VMOVLPOp},\n    {OPD(1, 0b10, 0x12), 1, &OpDispatchBuilder::VMOVSLDUPOp},\n    {OPD(1, 0b11, 0x12), 1, &OpDispatchBuilder::VMOVDDUPOp},\n    {OPD(1, 0b00, 0x13), 1, &OpDispatchBuilder::VMOVLPOp},\n    {OPD(1, 0b01, 0x13), 1, &OpDispatchBuilder::VMOVLPOp},\n\n    {OPD(1, 0b00, 0x14), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPUNPCKLOp, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x14), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPUNPCKLOp, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x15), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPUNPCKHOp, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x15), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPUNPCKHOp, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x16), 1, &OpDispatchBuilder::VMOVHPOp},\n    {OPD(1, 0b01, 0x16), 1, &OpDispatchBuilder::VMOVHPOp},\n    {OPD(1, 0b10, 0x16), 1, &OpDispatchBuilder::VMOVSHDUPOp},\n    {OPD(1, 0b00, 0x17), 1, &OpDispatchBuilder::VMOVHPOp},\n    {OPD(1, 0b01, 0x17), 1, &OpDispatchBuilder::VMOVHPOp},\n\n    {OPD(1, 0b00, 0x28), 1, &OpDispatchBuilder::VMOVAPS_VMOVAPDOp},\n    {OPD(1, 0b01, 0x28), 1, &OpDispatchBuilder::VMOVAPS_VMOVAPDOp},\n    {OPD(1, 0b00, 0x29), 1, &OpDispatchBuilder::VMOVAPS_VMOVAPDOp},\n    {OPD(1, 0b01, 0x29), 1, &OpDispatchBuilder::VMOVAPS_VMOVAPDOp},\n\n    {OPD(1, 0b10, 0x2A), 1, &OpDispatchBuilder::AVXInsertCVTGPR_To_FPR<OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x2A), 1, &OpDispatchBuilder::AVXInsertCVTGPR_To_FPR<OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x2B), 1, &OpDispatchBuilder::MOVVectorNTOp},\n    {OPD(1, 0b01, 0x2B), 1, &OpDispatchBuilder::MOVVectorNTOp},\n\n    {OPD(1, 0b10, 0x2C), 1, &OpDispatchBuilder::CVTFPR_To_GPR<OpSize::i32Bit, false>},\n    {OPD(1, 0b11, 0x2C), 1, &OpDispatchBuilder::CVTFPR_To_GPR<OpSize::i64Bit, false>},\n\n    {OPD(1, 0b10, 0x2D), 1, &OpDispatchBuilder::CVTFPR_To_GPR<OpSize::i32Bit, true>},\n    {OPD(1, 0b11, 0x2D), 1, &OpDispatchBuilder::CVTFPR_To_GPR<OpSize::i64Bit, true>},\n\n    {OPD(1, 0b00, 0x2E), 1, &OpDispatchBuilder::UCOMISxOp<OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x2E), 1, &OpDispatchBuilder::UCOMISxOp<OpSize::i64Bit>},\n    {OPD(1, 0b00, 0x2F), 1, &OpDispatchBuilder::UCOMISxOp<OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x2F), 1, &OpDispatchBuilder::UCOMISxOp<OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x50), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVMSKOp, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x50), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVMSKOp, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x51), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorUnaryOp, IR::OP_VFSQRT, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x51), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorUnaryOp, IR::OP_VFSQRT, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0x51), 1, &OpDispatchBuilder::AVXVectorScalarUnaryInsertALUOp<IR::OP_VFSQRTSCALARINSERT, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x51), 1, &OpDispatchBuilder::AVXVectorScalarUnaryInsertALUOp<IR::OP_VFSQRTSCALARINSERT, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x52), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorUnaryOp, IR::OP_VFRSQRT, OpSize::i32Bit>},\n    {OPD(1, 0b10, 0x52), 1, &OpDispatchBuilder::AVXVectorScalarUnaryInsertALUOp<IR::OP_VFRSQRTSCALARINSERT, OpSize::i32Bit>},\n\n    {OPD(1, 0b00, 0x53), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorUnaryOp, IR::OP_VFRECP, OpSize::i32Bit>},\n    {OPD(1, 0b10, 0x53), 1, &OpDispatchBuilder::AVXVectorScalarUnaryInsertALUOp<IR::OP_VFRECPSCALARINSERT, OpSize::i32Bit>},\n\n    {OPD(1, 0b00, 0x54), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VAND, OpSize::i128Bit>},\n    {OPD(1, 0b01, 0x54), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VAND, OpSize::i128Bit>},\n\n    {OPD(1, 0b00, 0x55), 1, &OpDispatchBuilder::VANDNOp},\n    {OPD(1, 0b01, 0x55), 1, &OpDispatchBuilder::VANDNOp},\n\n    {OPD(1, 0b00, 0x56), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VOR, OpSize::i128Bit>},\n    {OPD(1, 0b01, 0x56), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VOR, OpSize::i128Bit>},\n\n    {OPD(1, 0b00, 0x57), 1, &OpDispatchBuilder::AVXVectorXOROp},\n    {OPD(1, 0b01, 0x57), 1, &OpDispatchBuilder::AVXVectorXOROp},\n\n    {OPD(1, 0b00, 0x58), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VFADD, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x58), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VFADD, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0x58), 1, &OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFADDSCALARINSERT, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x58), 1, &OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFADDSCALARINSERT, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x59), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VFMUL, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x59), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VFMUL, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0x59), 1, &OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFMULSCALARINSERT, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x59), 1, &OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFMULSCALARINSERT, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x5A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Vector_CVT_Float_To_Float, OpSize::i64Bit, OpSize::i32Bit, true>},\n    {OPD(1, 0b01, 0x5A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Vector_CVT_Float_To_Float, OpSize::i32Bit, OpSize::i64Bit, true>},\n    {OPD(1, 0b10, 0x5A), 1, &OpDispatchBuilder::AVXInsertScalar_CVT_Float_To_Float<OpSize::i64Bit, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x5A), 1, &OpDispatchBuilder::AVXInsertScalar_CVT_Float_To_Float<OpSize::i32Bit, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x5B), 1, &OpDispatchBuilder::Vector_CVT_Int_To_Float<OpSize::i32Bit, false>},\n    {OPD(1, 0b01, 0x5B), 1, &OpDispatchBuilder::Vector_CVT_Float_To_Int<OpSize::i32Bit, true>},\n    {OPD(1, 0b10, 0x5B), 1, &OpDispatchBuilder::Vector_CVT_Float_To_Int<OpSize::i32Bit, false>},\n\n    {OPD(1, 0b00, 0x5C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VFSUB, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x5C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VFSUB, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0x5C), 1, &OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFSUBSCALARINSERT, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x5C), 1, &OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFSUBSCALARINSERT, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x5D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VFMIN, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x5D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VFMIN, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0x5D), 1, &OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFMINSCALARINSERT, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x5D), 1, &OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFMINSCALARINSERT, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x5E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VFDIV, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x5E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VFDIV, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0x5E), 1, &OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFDIVSCALARINSERT, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x5E), 1, &OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFDIVSCALARINSERT, OpSize::i64Bit>},\n\n    {OPD(1, 0b00, 0x5F), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VFMAX, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x5F), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VFMAX, OpSize::i64Bit>},\n    {OPD(1, 0b10, 0x5F), 1, &OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFMAXSCALARINSERT, OpSize::i32Bit>},\n    {OPD(1, 0b11, 0x5F), 1, &OpDispatchBuilder::AVXVectorScalarInsertALUOp<IR::OP_VFMAXSCALARINSERT, OpSize::i64Bit>},\n\n    {OPD(1, 0b01, 0x60), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPUNPCKLOp, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0x61), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPUNPCKLOp, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0x62), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPUNPCKLOp, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x63), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPACKSSOp, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0x64), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VCMPGT, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0x65), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VCMPGT, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0x66), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VCMPGT, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x67), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPACKUSOp, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0x68), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPUNPCKHOp, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0x69), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPUNPCKHOp, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0x6A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPUNPCKHOp, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x6B), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPACKSSOp, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x6C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPUNPCKLOp, OpSize::i64Bit>},\n    {OPD(1, 0b01, 0x6D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPUNPCKHOp, OpSize::i64Bit>},\n    {OPD(1, 0b01, 0x6E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVBetweenGPR_FPR, OpDispatchBuilder::VectorOpType::AVX>},\n\n    {OPD(1, 0b01, 0x6F), 1, &OpDispatchBuilder::VMOVAPS_VMOVAPDOp},\n    {OPD(1, 0b10, 0x6F), 1, &OpDispatchBuilder::VMOVUPS_VMOVUPDOp},\n\n    {OPD(1, 0b01, 0x70), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSHUFWOp, OpSize::i32Bit, true>},\n    {OPD(1, 0b10, 0x70), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSHUFWOp, OpSize::i16Bit, false>},\n    {OPD(1, 0b11, 0x70), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSHUFWOp, OpSize::i16Bit, true>},\n\n    {OPD(1, 0b01, 0x74), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VCMPEQ, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0x75), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VCMPEQ, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0x76), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VCMPEQ, OpSize::i32Bit>},\n\n    {OPD(1, 0b00, 0x77), 1, &OpDispatchBuilder::VZEROOp},\n\n    {OPD(1, 0b01, 0x7C), 1, &OpDispatchBuilder::VHADDPOp<IR::OP_VFADDP, OpSize::i64Bit>},\n    {OPD(1, 0b11, 0x7C), 1, &OpDispatchBuilder::VHADDPOp<IR::OP_VFADDP, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0x7D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VHSUBPOp, OpSize::i64Bit>},\n    {OPD(1, 0b11, 0x7D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VHSUBPOp, OpSize::i32Bit>},\n\n    {OPD(1, 0b01, 0x7E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVBetweenGPR_FPR, OpDispatchBuilder::VectorOpType::AVX>},\n    {OPD(1, 0b10, 0x7E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVQOp, OpDispatchBuilder::VectorOpType::AVX>},\n\n    {OPD(1, 0b01, 0x7F), 1, &OpDispatchBuilder::VMOVAPS_VMOVAPDOp},\n    {OPD(1, 0b10, 0x7F), 1, &OpDispatchBuilder::VMOVUPS_VMOVUPDOp},\n\n    {OPD(1, 0b00, 0xC2), 1, &OpDispatchBuilder::AVXVFCMPOp<OpSize::i32Bit>},\n    {OPD(1, 0b01, 0xC2), 1, &OpDispatchBuilder::AVXVFCMPOp<OpSize::i64Bit>},\n    {OPD(1, 0b10, 0xC2), 1, &OpDispatchBuilder::AVXInsertScalarFCMPOp<OpSize::i32Bit>},\n    {OPD(1, 0b11, 0xC2), 1, &OpDispatchBuilder::AVXInsertScalarFCMPOp<OpSize::i64Bit>},\n\n    {OPD(1, 0b01, 0xC4), 1, &OpDispatchBuilder::VPINSRWOp},\n    {OPD(1, 0b01, 0xC5), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PExtrOp, OpSize::i16Bit>},\n\n    {OPD(1, 0b00, 0xC6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VSHUFOp, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0xC6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VSHUFOp, OpSize::i64Bit>},\n\n    {OPD(1, 0b01, 0xD0), 1, &OpDispatchBuilder::VADDSUBPOp<OpSize::i64Bit>},\n    {OPD(1, 0b11, 0xD0), 1, &OpDispatchBuilder::VADDSUBPOp<OpSize::i32Bit>},\n\n    {OPD(1, 0b01, 0xD1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSRLDOp, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xD2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSRLDOp, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0xD3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSRLDOp, OpSize::i64Bit>},\n    {OPD(1, 0b01, 0xD4), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VADD, OpSize::i64Bit>},\n    {OPD(1, 0b01, 0xD5), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VMUL, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xD6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVQOp, OpDispatchBuilder::VectorOpType::AVX>},\n    {OPD(1, 0b01, 0xD7), 1, &OpDispatchBuilder::MOVMSKOpOne},\n\n    {OPD(1, 0b01, 0xD8), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VUQSUB, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xD9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VUQSUB, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xDA), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VUMIN, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xDB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VAND, OpSize::i128Bit>},\n    {OPD(1, 0b01, 0xDC), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VUQADD, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xDD), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VUQADD, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xDE), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VUMAX, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xDF), 1, &OpDispatchBuilder::VANDNOp},\n\n    {OPD(1, 0b01, 0xE0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VURAVG, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xE1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSRAOp, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xE2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSRAOp, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0xE3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VURAVG, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xE4), 1, &OpDispatchBuilder::VPMULHWOp<false>},\n    {OPD(1, 0b01, 0xE5), 1, &OpDispatchBuilder::VPMULHWOp<true>},\n\n    {OPD(1, 0b01, 0xE6), 1, &OpDispatchBuilder::Vector_CVT_Float_To_Int<OpSize::i64Bit, false>},\n    {OPD(1, 0b10, 0xE6), 1, &OpDispatchBuilder::Vector_CVT_Int_To_Float<OpSize::i32Bit, true>},\n    {OPD(1, 0b11, 0xE6), 1, &OpDispatchBuilder::Vector_CVT_Float_To_Int<OpSize::i64Bit, true>},\n\n    {OPD(1, 0b01, 0xE7), 1, &OpDispatchBuilder::MOVVectorNTOp},\n\n    {OPD(1, 0b01, 0xE8), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VSQSUB, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xE9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VSQSUB, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xEA), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VSMIN, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xEB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VOR, OpSize::i128Bit>},\n    {OPD(1, 0b01, 0xEC), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VSQADD, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xED), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VSQADD, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xEE), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VSMAX, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xEF), 1, &OpDispatchBuilder::AVXVectorXOROp},\n\n    {OPD(1, 0b11, 0xF0), 1, &OpDispatchBuilder::MOVVectorUnalignedOp},\n    {OPD(1, 0b01, 0xF1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSLLOp, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xF2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSLLOp, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0xF3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSLLOp, OpSize::i64Bit>},\n    {OPD(1, 0b01, 0xF4), 1, &OpDispatchBuilder::VPMULLOp<OpSize::i32Bit, false>},\n    {OPD(1, 0b01, 0xF5), 1, &OpDispatchBuilder::VPMADDWDOp},\n    {OPD(1, 0b01, 0xF6), 1, &OpDispatchBuilder::VPSADBWOp},\n    {OPD(1, 0b01, 0xF7), 1, &OpDispatchBuilder::MASKMOVOp},\n\n    {OPD(1, 0b01, 0xF8), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VSUB, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xF9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VSUB, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xFA), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VSUB, OpSize::i32Bit>},\n    {OPD(1, 0b01, 0xFB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VSUB, OpSize::i64Bit>},\n    {OPD(1, 0b01, 0xFC), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VADD, OpSize::i8Bit>},\n    {OPD(1, 0b01, 0xFD), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VADD, OpSize::i16Bit>},\n    {OPD(1, 0b01, 0xFE), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VADD, OpSize::i32Bit>},\n\n    {OPD(2, 0b01, 0x00), 1, &OpDispatchBuilder::VPSHUFBOp},\n    {OPD(2, 0b01, 0x01), 1, &OpDispatchBuilder::VHADDPOp<IR::OP_VADDP, OpSize::i16Bit>},\n    {OPD(2, 0b01, 0x02), 1, &OpDispatchBuilder::VHADDPOp<IR::OP_VADDP, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x03), 1, &OpDispatchBuilder::VPHADDSWOp},\n    {OPD(2, 0b01, 0x04), 1, &OpDispatchBuilder::VPMADDUBSWOp},\n\n    {OPD(2, 0b01, 0x05), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPHSUBOp, OpSize::i16Bit>},\n    {OPD(2, 0b01, 0x06), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPHSUBOp, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x07), 1, &OpDispatchBuilder::VPHSUBSWOp},\n\n    {OPD(2, 0b01, 0x08), 1, &OpDispatchBuilder::VPSIGN<OpSize::i8Bit>},\n    {OPD(2, 0b01, 0x09), 1, &OpDispatchBuilder::VPSIGN<OpSize::i16Bit>},\n    {OPD(2, 0b01, 0x0A), 1, &OpDispatchBuilder::VPSIGN<OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x0B), 1, &OpDispatchBuilder::VPMULHRSWOp},\n    {OPD(2, 0b01, 0x0C), 1, &OpDispatchBuilder::VPERMILRegOp<OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x0D), 1, &OpDispatchBuilder::VPERMILRegOp<OpSize::i64Bit>},\n    {OPD(2, 0b01, 0x0E), 1, &OpDispatchBuilder::VTESTPOp<OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x0F), 1, &OpDispatchBuilder::VTESTPOp<OpSize::i64Bit>},\n\n    {OPD(2, 0b01, 0x13), 1, &OpDispatchBuilder::VCVTPH2PSOp},\n    {OPD(2, 0b01, 0x16), 1, &OpDispatchBuilder::VPERMDOp},\n    {OPD(2, 0b01, 0x17), 1, &OpDispatchBuilder::PTestOp},\n    {OPD(2, 0b01, 0x18), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VBROADCASTOp, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x19), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VBROADCASTOp, OpSize::i64Bit>},\n    {OPD(2, 0b01, 0x1A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VBROADCASTOp, OpSize::i128Bit>},\n    {OPD(2, 0b01, 0x1C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorUnaryOp, IR::OP_VABS, OpSize::i8Bit>},\n    {OPD(2, 0b01, 0x1D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorUnaryOp, IR::OP_VABS, OpSize::i16Bit>},\n    {OPD(2, 0b01, 0x1E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorUnaryOp, IR::OP_VABS, OpSize::i32Bit>},\n\n    {OPD(2, 0b01, 0x20), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i16Bit, true>},\n    {OPD(2, 0b01, 0x21), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i32Bit, true>},\n    {OPD(2, 0b01, 0x22), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i64Bit, true>},\n    {OPD(2, 0b01, 0x23), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i16Bit, OpSize::i32Bit, true>},\n    {OPD(2, 0b01, 0x24), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i16Bit, OpSize::i64Bit, true>},\n    {OPD(2, 0b01, 0x25), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i32Bit, OpSize::i64Bit, true>},\n\n    {OPD(2, 0b01, 0x28), 1, &OpDispatchBuilder::VPMULLOp<OpSize::i32Bit, true>},\n    {OPD(2, 0b01, 0x29), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VCMPEQ, OpSize::i64Bit>},\n    {OPD(2, 0b01, 0x2A), 1, &OpDispatchBuilder::MOVVectorNTOp},\n    {OPD(2, 0b01, 0x2B), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPACKUSOp, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x2C), 1, &OpDispatchBuilder::VMASKMOVOp<OpSize::i32Bit, false>},\n    {OPD(2, 0b01, 0x2D), 1, &OpDispatchBuilder::VMASKMOVOp<OpSize::i64Bit, false>},\n    {OPD(2, 0b01, 0x2E), 1, &OpDispatchBuilder::VMASKMOVOp<OpSize::i32Bit, true>},\n    {OPD(2, 0b01, 0x2F), 1, &OpDispatchBuilder::VMASKMOVOp<OpSize::i64Bit, true>},\n\n    {OPD(2, 0b01, 0x30), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i16Bit, false>},\n    {OPD(2, 0b01, 0x31), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i32Bit, false>},\n    {OPD(2, 0b01, 0x32), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i8Bit, OpSize::i64Bit, false>},\n    {OPD(2, 0b01, 0x33), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i16Bit, OpSize::i32Bit, false>},\n    {OPD(2, 0b01, 0x34), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i16Bit, OpSize::i64Bit, false>},\n    {OPD(2, 0b01, 0x35), 1, &OpDispatchBuilder::ExtendVectorElements<OpSize::i32Bit, OpSize::i64Bit, false>},\n    {OPD(2, 0b01, 0x36), 1, &OpDispatchBuilder::VPERMDOp},\n\n    {OPD(2, 0b01, 0x37), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VCMPGT, OpSize::i64Bit>},\n    {OPD(2, 0b01, 0x38), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VSMIN, OpSize::i8Bit>},\n    {OPD(2, 0b01, 0x39), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VSMIN, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x3A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VUMIN, OpSize::i16Bit>},\n    {OPD(2, 0b01, 0x3B), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VUMIN, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x3C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VSMAX, OpSize::i8Bit>},\n    {OPD(2, 0b01, 0x3D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VSMAX, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x3E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VUMAX, OpSize::i16Bit>},\n    {OPD(2, 0b01, 0x3F), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VUMAX, OpSize::i32Bit>},\n\n    {OPD(2, 0b01, 0x40), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorALUOp, IR::OP_VMUL, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x41), 1, &OpDispatchBuilder::PHMINPOSUWOp},\n    {OPD(2, 0b01, 0x45), 1, &OpDispatchBuilder::VPSRLVOp},\n    {OPD(2, 0b01, 0x46), 1, &OpDispatchBuilder::VPSRAVDOp},\n    {OPD(2, 0b01, 0x47), 1, &OpDispatchBuilder::VPSLLVOp},\n\n    {OPD(2, 0b01, 0x58), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VBROADCASTOp, OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x59), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VBROADCASTOp, OpSize::i64Bit>},\n    {OPD(2, 0b01, 0x5A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VBROADCASTOp, OpSize::i128Bit>},\n\n    {OPD(2, 0b01, 0x78), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VBROADCASTOp, OpSize::i8Bit>},\n    {OPD(2, 0b01, 0x79), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VBROADCASTOp, OpSize::i16Bit>},\n\n    {OPD(2, 0b01, 0x8C), 1, &OpDispatchBuilder::VPMASKMOVOp<false>},\n    {OPD(2, 0b01, 0x8E), 1, &OpDispatchBuilder::VPMASKMOVOp<true>},\n\n    {OPD(2, 0b01, 0x90), 1, &OpDispatchBuilder::VPGATHER<OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x91), 1, &OpDispatchBuilder::VPGATHER<OpSize::i64Bit>},\n    {OPD(2, 0b01, 0x92), 1, &OpDispatchBuilder::VPGATHER<OpSize::i32Bit>},\n    {OPD(2, 0b01, 0x93), 1, &OpDispatchBuilder::VPGATHER<OpSize::i64Bit>},\n\n    {OPD(2, 0b01, 0x96), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAddSubImpl, true, 1, 3, 2>},  // VFMADDSUB\n    {OPD(2, 0b01, 0x97), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAddSubImpl, false, 1, 3, 2>}, // VFMSUBADD\n\n    {OPD(2, 0b01, 0x98), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFMLA, false, 1, 3, 2>},  // VFMADD\n    {OPD(2, 0b01, 0x99), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFMLA, true, 1, 3, 2>},   // VFMADD\n    {OPD(2, 0b01, 0x9A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFMLS, false, 1, 3, 2>},  // VFMSUB\n    {OPD(2, 0b01, 0x9B), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFMLS, true, 1, 3, 2>},   // VFMSUB\n    {OPD(2, 0b01, 0x9C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFNMLA, false, 1, 3, 2>}, // VFNMADD\n    {OPD(2, 0b01, 0x9D), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFNMLA, true, 1, 3, 2>},  // VFNMADD\n    {OPD(2, 0b01, 0x9E), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFNMLS, false, 1, 3, 2>}, // VFNMSUB\n    {OPD(2, 0b01, 0x9F), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFNMLS, true, 1, 3, 2>},  // VFNMSUB\n\n    {OPD(2, 0b01, 0xA8), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFMLA, false, 2, 1, 3>},  // VFMADD\n    {OPD(2, 0b01, 0xA9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFMLA, true, 2, 1, 3>},   // VFMADD\n    {OPD(2, 0b01, 0xAA), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFMLS, false, 2, 1, 3>},  // VFMSUB\n    {OPD(2, 0b01, 0xAB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFMLS, true, 2, 1, 3>},   // VFMSUB\n    {OPD(2, 0b01, 0xAC), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFNMLA, false, 2, 1, 3>}, // VFNMADD\n    {OPD(2, 0b01, 0xAD), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFNMLA, true, 2, 1, 3>},  // VFNMADD\n    {OPD(2, 0b01, 0xAE), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFNMLS, false, 2, 1, 3>}, // VFNMSUB\n    {OPD(2, 0b01, 0xAF), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFNMLS, true, 2, 1, 3>},  // VFNMSUB\n\n    {OPD(2, 0b01, 0xB8), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFMLA, false, 2, 3, 1>},  // VFMADD\n    {OPD(2, 0b01, 0xB9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFMLA, true, 2, 3, 1>},   // VFMADD\n    {OPD(2, 0b01, 0xBA), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFMLS, false, 2, 3, 1>},  // VFMSUB\n    {OPD(2, 0b01, 0xBB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFMLS, true, 2, 3, 1>},   // VFMSUB\n    {OPD(2, 0b01, 0xBC), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFNMLA, false, 2, 3, 1>}, // VFNMADD\n    {OPD(2, 0b01, 0xBD), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFNMLA, true, 2, 3, 1>},  // VFNMADD\n    {OPD(2, 0b01, 0xBE), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFNMLS, false, 2, 3, 1>}, // VFNMSUB\n    {OPD(2, 0b01, 0xBF), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAImpl, IR::OP_VFNMLS, true, 2, 3, 1>},  // VFNMSUB\n\n    {OPD(2, 0b01, 0xA6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAddSubImpl, true, 2, 1, 3>},  // VFMADDSUB\n    {OPD(2, 0b01, 0xA7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAddSubImpl, false, 2, 1, 3>}, // VFMSUBADD\n\n    {OPD(2, 0b01, 0xB6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAddSubImpl, true, 2, 3, 1>},  // VFMADDSUB\n    {OPD(2, 0b01, 0xB7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAddSubImpl, false, 2, 3, 1>}, // VFMSUBADD\n\n    {OPD(2, 0b01, 0xDB), 1, &OpDispatchBuilder::AESImcOp},\n    {OPD(2, 0b01, 0xDC), 1, &OpDispatchBuilder::VAESEncOp},\n    {OPD(2, 0b01, 0xDD), 1, &OpDispatchBuilder::VAESEncLastOp},\n    {OPD(2, 0b01, 0xDE), 1, &OpDispatchBuilder::VAESDecOp},\n    {OPD(2, 0b01, 0xDF), 1, &OpDispatchBuilder::VAESDecLastOp},\n\n    {OPD(3, 0b01, 0x00), 1, &OpDispatchBuilder::VPERMQOp},\n    {OPD(3, 0b01, 0x01), 1, &OpDispatchBuilder::VPERMQOp},\n    {OPD(3, 0b01, 0x02), 1, &OpDispatchBuilder::VPBLENDDOp},\n    {OPD(3, 0b01, 0x04), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPERMILImmOp, OpSize::i32Bit>},\n    {OPD(3, 0b01, 0x05), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPERMILImmOp, OpSize::i64Bit>},\n    {OPD(3, 0b01, 0x06), 1, &OpDispatchBuilder::VPERM2Op},\n    {OPD(3, 0b01, 0x08), 1, &OpDispatchBuilder::AVXVectorRound<OpSize::i32Bit>},\n    {OPD(3, 0b01, 0x09), 1, &OpDispatchBuilder::AVXVectorRound<OpSize::i64Bit>},\n    {OPD(3, 0b01, 0x0A), 1, &OpDispatchBuilder::AVXInsertScalarRound<OpSize::i32Bit>},\n    {OPD(3, 0b01, 0x0B), 1, &OpDispatchBuilder::AVXInsertScalarRound<OpSize::i64Bit>},\n    {OPD(3, 0b01, 0x0C), 1, &OpDispatchBuilder::VPBLENDDOp},\n    {OPD(3, 0b01, 0x0D), 1, &OpDispatchBuilder::VBLENDPDOp},\n    {OPD(3, 0b01, 0x0E), 1, &OpDispatchBuilder::VPBLENDWOp},\n    {OPD(3, 0b01, 0x0F), 1, &OpDispatchBuilder::VPALIGNROp},\n\n    {OPD(3, 0b01, 0x14), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PExtrOp, OpSize::i8Bit>},\n    {OPD(3, 0b01, 0x15), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PExtrOp, OpSize::i16Bit>},\n    {OPD(3, 0b01, 0x16), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PExtrOp, OpSize::i32Bit>},\n    {OPD(3, 0b01, 0x17), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PExtrOp, OpSize::i32Bit>},\n\n    {OPD(3, 0b01, 0x18), 1, &OpDispatchBuilder::VINSERTOp},\n    {OPD(3, 0b01, 0x19), 1, &OpDispatchBuilder::VEXTRACT128Op},\n    {OPD(3, 0b01, 0x1D), 1, &OpDispatchBuilder::VCVTPS2PHOp},\n    {OPD(3, 0b01, 0x20), 1, &OpDispatchBuilder::VPINSRBOp},\n    {OPD(3, 0b01, 0x21), 1, &OpDispatchBuilder::VINSERTPSOp},\n    {OPD(3, 0b01, 0x22), 1, &OpDispatchBuilder::VPINSRDQOp},\n\n    {OPD(3, 0b01, 0x38), 1, &OpDispatchBuilder::VINSERTOp},\n    {OPD(3, 0b01, 0x39), 1, &OpDispatchBuilder::VEXTRACT128Op},\n\n    {OPD(3, 0b01, 0x40), 1, &OpDispatchBuilder::VDPPOp<OpSize::i32Bit>},\n    {OPD(3, 0b01, 0x41), 1, &OpDispatchBuilder::VDPPOp<OpSize::i64Bit>},\n    {OPD(3, 0b01, 0x42), 1, &OpDispatchBuilder::VMPSADBWOp},\n    {OPD(3, 0b01, 0x44), 1, &OpDispatchBuilder::VPCLMULQDQOp},\n\n    {OPD(3, 0b01, 0x46), 1, &OpDispatchBuilder::VPERM2Op},\n\n    {OPD(3, 0b01, 0x4A), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorVariableBlend, OpSize::i32Bit>},\n    {OPD(3, 0b01, 0x4B), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorVariableBlend, OpSize::i64Bit>},\n    {OPD(3, 0b01, 0x4C), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorVariableBlend, OpSize::i8Bit>},\n\n    {OPD(3, 0b01, 0x60), 1, &OpDispatchBuilder::VPCMPESTRMOp},\n    {OPD(3, 0b01, 0x61), 1, &OpDispatchBuilder::VPCMPESTRIOp},\n    {OPD(3, 0b01, 0x62), 1, &OpDispatchBuilder::VPCMPISTRMOp},\n    {OPD(3, 0b01, 0x63), 1, &OpDispatchBuilder::VPCMPISTRIOp},\n\n    {OPD(3, 0b01, 0xDF), 1, &OpDispatchBuilder::AESKeyGenAssist},\n  };\n#undef OPD\n\n#define OPD(group, pp, opcode) (((group - X86Tables::TYPE_VEX_GROUP_12) << 4) | (pp << 3) | (opcode))\n  constexpr DispatchTableEntry TableGroupOps[] {\n    {OPD(X86Tables::TYPE_VEX_GROUP_12, 1, 0b010), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSRLIOp, OpSize::i16Bit>},\n    {OPD(X86Tables::TYPE_VEX_GROUP_12, 1, 0b110), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSLLIOp, OpSize::i16Bit>},\n    {OPD(X86Tables::TYPE_VEX_GROUP_12, 1, 0b100), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSRAIOp, OpSize::i16Bit>},\n\n    {OPD(X86Tables::TYPE_VEX_GROUP_13, 1, 0b010), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSRLIOp, OpSize::i32Bit>},\n    {OPD(X86Tables::TYPE_VEX_GROUP_13, 1, 0b110), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSLLIOp, OpSize::i32Bit>},\n    {OPD(X86Tables::TYPE_VEX_GROUP_13, 1, 0b100), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSRAIOp, OpSize::i32Bit>},\n\n    {OPD(X86Tables::TYPE_VEX_GROUP_14, 1, 0b010), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSRLIOp, OpSize::i64Bit>},\n    {OPD(X86Tables::TYPE_VEX_GROUP_14, 1, 0b011), 1, &OpDispatchBuilder::VPSRLDQOp},\n    {OPD(X86Tables::TYPE_VEX_GROUP_14, 1, 0b110), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPSLLIOp, OpSize::i64Bit>},\n    {OPD(X86Tables::TYPE_VEX_GROUP_14, 1, 0b111), 1, &OpDispatchBuilder::VPSLLDQOp},\n\n    {OPD(X86Tables::TYPE_VEX_GROUP_15, 0, 0b010), 1, &OpDispatchBuilder::LDMXCSR},\n    {OPD(X86Tables::TYPE_VEX_GROUP_15, 0, 0b011), 1, &OpDispatchBuilder::STMXCSR},\n  };\n#undef OPD\n}\n\nauto BaseTableLambda = [](const auto RuntimeTable) consteval {\n  std::array<X86InstInfo, MAX_VEX_TABLE_SIZE> Table{};\n#define OPD(map_select, pp, opcode) (((map_select - 1) << 10) | (pp << 8) | (opcode))\n  constexpr U16U8InfoStruct VEXTable[] = {\n    // Map 0 (Reserved)\n    // VEX Map 1\n    {OPD(1, 0b00, 0x10), 1, X86InstInfo{\"VMOVUPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x10), 1, X86InstInfo{\"VMOVUPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x10), 1, X86InstInfo{\"VMOVSS\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(1, 0b11, 0x10), 1, X86InstInfo{\"VMOVSD\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b00, 0x11), 1, X86InstInfo{\"VMOVUPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x11), 1, X86InstInfo{\"VMOVUPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x11), 1, X86InstInfo{\"VMOVSS\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(1, 0b11, 0x11), 1, X86InstInfo{\"VMOVSD\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b00, 0x12), 1, X86InstInfo{\"VMOVLPS\",TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_VEX_1ST_SRC | FLAGS_VEX_L_0, 0}},\n    {OPD(1, 0b01, 0x12), 1, X86InstInfo{\"VMOVLPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MOD_MEM_ONLY | FLAGS_VEX_1ST_SRC | FLAGS_VEX_L_0, 0}},\n    {OPD(1, 0b10, 0x12), 1, X86InstInfo{\"VMOVSLDUP\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b11, 0x12), 1, X86InstInfo{\"VMOVDDUP\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b00, 0x13), 1, X86InstInfo{\"VMOVLPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS | FLAGS_VEX_L_0, 0}},\n    {OPD(1, 0b01, 0x13), 1, X86InstInfo{\"VMOVLPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS | FLAGS_VEX_L_0, 0}},\n\n    {OPD(1, 0b00, 0x14), 1, X86InstInfo{\"VUNPCKLPS\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x14), 1, X86InstInfo{\"VUNPCKLPD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b00, 0x15), 1, X86InstInfo{\"VUNPCKHPS\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x15), 1, X86InstInfo{\"VUNPCKHPD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b00, 0x16), 1, X86InstInfo{\"VMOV(L)HPS\",TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_VEX_1ST_SRC | FLAGS_VEX_L_0, 0}},\n    {OPD(1, 0b01, 0x16), 1, X86InstInfo{\"VMOVHPD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_XMM_FLAGS | FLAGS_VEX_1ST_SRC | FLAGS_VEX_L_0, 0}},\n    {OPD(1, 0b10, 0x16), 1, X86InstInfo{\"VMOVSHDUP\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b00, 0x17), 1, X86InstInfo{\"VMOVHPS\",   TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS | FLAGS_VEX_L_0, 0}},\n    {OPD(1, 0b01, 0x17), 1, X86InstInfo{\"VMOVHPD\",   TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS | FLAGS_VEX_L_0, 0}},\n\n    {OPD(1, 0b00, 0x50), 1, X86InstInfo{\"VMOVMSKPS\", TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR, 0}},\n    {OPD(1, 0b01, 0x50), 1, X86InstInfo{\"VMOVMSKPD\", TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR, 0}},\n\n    {OPD(1, 0b00, 0x51), 1, X86InstInfo{\"VSQRTPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x51), 1, X86InstInfo{\"VSQRTPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x51), 1, X86InstInfo{\"VSQRTSS\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(1, 0b11, 0x51), 1, X86InstInfo{\"VSQRTSD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b00, 0x52), 1, X86InstInfo{\"VRSQRTPS\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x52), 1, X86InstInfo{\"VRSQRTSS\",  TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b00, 0x53), 1, X86InstInfo{\"VRCPPS\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x53), 1, X86InstInfo{\"VRCPSS\",    TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b00, 0x54), 1, X86InstInfo{\"VANDPS\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x54), 1, X86InstInfo{\"VANDPD\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b00, 0x55), 1, X86InstInfo{\"VANDNPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x55), 1, X86InstInfo{\"VANDNPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b00, 0x56), 1, X86InstInfo{\"VORPS\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x56), 1, X86InstInfo{\"VORPD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b00, 0x57), 1, X86InstInfo{\"VXORPS\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x57), 1, X86InstInfo{\"VXORPD\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b01, 0x60), 1, X86InstInfo{\"VPUNPCKLBW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x61), 1, X86InstInfo{\"VPUNPCKLWD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x62), 1, X86InstInfo{\"VPUNPCKLDQ\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x63), 1, X86InstInfo{\"VPACKSSWB\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x64), 1, X86InstInfo{\"VPCMPGTB\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x65), 1, X86InstInfo{\"VPCMPGTW\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x66), 1, X86InstInfo{\"VPCMPGTD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x67), 1, X86InstInfo{\"VPACKUSWB\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b01, 0x70), 1, X86InstInfo{\"VPSHUFD\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n    {OPD(1, 0b10, 0x70), 1, X86InstInfo{\"VPSHUFHW\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n    {OPD(1, 0b11, 0x70), 1, X86InstInfo{\"VPSHUFLW\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n\n    {OPD(1, 0b01, 0x71), 1, X86InstInfo{\"\",           TYPE_VEX_GROUP_12, FLAGS_NONE, 0}}, // VEX Group 12\n    {OPD(1, 0b01, 0x72), 1, X86InstInfo{\"\",           TYPE_VEX_GROUP_13, FLAGS_NONE, 0}}, // VEX Group 13\n    {OPD(1, 0b01, 0x73), 1, X86InstInfo{\"\",           TYPE_VEX_GROUP_14, FLAGS_NONE, 0}}, // VEX Group 14\n\n    {OPD(1, 0b01, 0x74), 1, X86InstInfo{\"VPCMPEQB\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x75), 1, X86InstInfo{\"VPCMPEQW\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x76), 1, X86InstInfo{\"VPCMPEQD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b00, 0x77), 1, X86InstInfo{\"VZERO*\",     TYPE_INST, GenFlagsDstSize(SIZE_128BIT), 0}},\n\n    {OPD(1, 0b00, 0xC2), 1, X86InstInfo{\"VCMPccPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(1, 0b01, 0xC2), 1, X86InstInfo{\"VCMPccPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(1, 0b10, 0xC2), 1, X86InstInfo{\"VCMPccSS\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_L_IGNORE | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(1, 0b11, 0xC2), 1, X86InstInfo{\"VCMPccSD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_VEX_L_IGNORE | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n\n    {OPD(1, 0b01, 0xC4), 1, X86InstInfo{\"VPINSRW\",    TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_16BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_SF_SRC_GPR | FLAGS_XMM_FLAGS | FLAGS_VEX_L_0, 1}},\n    {OPD(1, 0b01, 0xC5), 1, X86InstInfo{\"VPEXTRW\",    TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_SF_DST_GPR | FLAGS_XMM_FLAGS | FLAGS_VEX_L_0, 1}},\n\n    {OPD(1, 0b00, 0xC6), 1, X86InstInfo{\"VSHUFPS\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(1, 0b01, 0xC6), 1, X86InstInfo{\"VSHUFPD\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n\n    // The above ops are defined from `Table A-17. VEX Opcode Map 1, Low Nibble = [0h:7h]` of AMD Architecture programmer's manual Volume 3\n    // This table doesn't state which VEX.pp is for which instruction\n    // XXX: Confirm all the above encoding opcodes\n\n    {OPD(1, 0b00, 0x28), 1, X86InstInfo{\"VMOVAPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x28), 1, X86InstInfo{\"VMOVAPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b00, 0x29), 1, X86InstInfo{\"VMOVAPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x29), 1, X86InstInfo{\"VMOVAPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b10, 0x2A), 1, X86InstInfo{\"VCVTSI2SS\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_SF_SRC_GPR | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(1, 0b11, 0x2A), 1, X86InstInfo{\"VCVTSI2SD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_SF_SRC_GPR | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b00, 0x2B), 1, X86InstInfo{\"VMOVNTPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x2B), 1, X86InstInfo{\"VMOVNTPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b10, 0x2C), 1, X86InstInfo{\"VCVTTSS2SI\",   TYPE_INST, FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(1, 0b11, 0x2C), 1, X86InstInfo{\"VCVTTSD2SI\",   TYPE_INST, FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b10, 0x2D), 1, X86InstInfo{\"VCVTSS2SI\",   TYPE_INST, FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(1, 0b11, 0x2D), 1, X86InstInfo{\"VCVTSD2SI\",   TYPE_INST, FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b00, 0x2E), 1, X86InstInfo{\"VUCOMISS\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(1, 0b01, 0x2E), 1, X86InstInfo{\"VUCOMISD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b00, 0x2F), 1, X86InstInfo{\"VCOMISS\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(1, 0b01, 0x2F), 1, X86InstInfo{\"VCOMISD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b00, 0x58), 1, X86InstInfo{\"VADDPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x58), 1, X86InstInfo{\"VADDPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x58), 1, X86InstInfo{\"VADDSS\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(1, 0b11, 0x58), 1, X86InstInfo{\"VADDSD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b00, 0x59), 1, X86InstInfo{\"VMULPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x59), 1, X86InstInfo{\"VMULPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x59), 1, X86InstInfo{\"VMULSS\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(1, 0b11, 0x59), 1, X86InstInfo{\"VMULSD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b00, 0x5A), 1, X86InstInfo{\"VCVTPS2PD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x5A), 1, X86InstInfo{\"VCVTPD2PS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x5A), 1, X86InstInfo{\"VCVTSS2SD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_L_IGNORE | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b11, 0x5A), 1, X86InstInfo{\"VCVTSD2SS\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_VEX_L_IGNORE |FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b00, 0x5B), 1, X86InstInfo{\"VCVTDQ2PS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x5B), 1, X86InstInfo{\"VCVTPS2DQ\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x5B), 1, X86InstInfo{\"VCVTTPS2DQ\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b00, 0x5C), 1, X86InstInfo{\"VSUBPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x5C), 1, X86InstInfo{\"VSUBPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x5C), 1, X86InstInfo{\"VSUBSS\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(1, 0b11, 0x5C), 1, X86InstInfo{\"VSUBSD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b00, 0x5D), 1, X86InstInfo{\"VMINPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x5D), 1, X86InstInfo{\"VMINPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x5D), 1, X86InstInfo{\"VMINSS\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(1, 0b11, 0x5D), 1, X86InstInfo{\"VMINSD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b00, 0x5E), 1, X86InstInfo{\"VDIVPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x5E), 1, X86InstInfo{\"VDIVPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x5E), 1, X86InstInfo{\"VDIVSS\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(1, 0b11, 0x5E), 1, X86InstInfo{\"VDIVSD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b00, 0x5F), 1, X86InstInfo{\"VMAXPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x5F), 1, X86InstInfo{\"VMAXPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x5F), 1, X86InstInfo{\"VMAXSS\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(1, 0b11, 0x5F), 1, X86InstInfo{\"VMAXSD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(1, 0b01, 0x68), 1, X86InstInfo{\"VPUNPCKHBW\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x69), 1, X86InstInfo{\"VPUNPCKHWD\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x6A), 1, X86InstInfo{\"VPUNPCKHDQ\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x6B), 1, X86InstInfo{\"VPACKSSDW\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x6C), 1, X86InstInfo{\"VPUNPCKLQDQ\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x6D), 1, X86InstInfo{\"VPUNPCKHQDQ\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0x6E), 1, X86InstInfo{\"VMOV*\",       TYPE_INST, GenFlagsDstSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_VEX_L_0 | FLAGS_SF_SRC_GPR, 0}},\n\n    {OPD(1, 0b01, 0x6F), 1, X86InstInfo{\"VMOVDQA\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x6F), 1, X86InstInfo{\"VMOVDQU\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b01, 0x7C), 1, X86InstInfo{\"VHADDPD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b11, 0x7C), 1, X86InstInfo{\"VHADDPS\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b01, 0x7D), 1, X86InstInfo{\"VHSUBPD\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b11, 0x7D), 1, X86InstInfo{\"VHSUBPS\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b01, 0x7E), 1, X86InstInfo{\"VMOV*\",     TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_DST_GPR | FLAGS_VEX_L_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x7E), 1, X86InstInfo{\"VMOVQ\",     TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b01, 0x7F), 1, X86InstInfo{\"VMOVDQA\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0x7F), 1, X86InstInfo{\"VMOVDQU\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b00, 0xAE), 1, X86InstInfo{\"\",     TYPE_VEX_GROUP_15, FLAGS_NONE, 0}}, // VEX Group 15\n    {OPD(1, 0b01, 0xAE), 1, X86InstInfo{\"\",     TYPE_VEX_GROUP_15, FLAGS_NONE, 0}}, // VEX Group 15\n    {OPD(1, 0b10, 0xAE), 1, X86InstInfo{\"\",     TYPE_VEX_GROUP_15, FLAGS_NONE, 0}}, // VEX Group 15\n    {OPD(1, 0b11, 0xAE), 1, X86InstInfo{\"\",     TYPE_VEX_GROUP_15, FLAGS_NONE, 0}}, // VEX Group 15\n\n    {OPD(1, 0b01, 0xD0), 1, X86InstInfo{\"VADDSUBPD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b11, 0xD0), 1, X86InstInfo{\"VADDSUBPS\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b01, 0xD1), 1, X86InstInfo{\"VPSRLW\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xD2), 1, X86InstInfo{\"VPSRLD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xD3), 1, X86InstInfo{\"VPSRLQ\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xD4), 1, X86InstInfo{\"VPADDQ\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xD5), 1, X86InstInfo{\"VPMULLW\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xD6), 1, X86InstInfo{\"VMOVQ\",       TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_VEX_L_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xD7), 1, X86InstInfo{\"VPMOVMSKB\",   TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR | FLAGS_SF_MOD_REG_ONLY, 0}},\n\n    {OPD(1, 0b01, 0xD8), 1, X86InstInfo{\"VPSUBUSB\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xD9), 1, X86InstInfo{\"VPSUBUSW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xDA), 1, X86InstInfo{\"VPMINUB\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xDB), 1, X86InstInfo{\"VPAND\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xDC), 1, X86InstInfo{\"VPADDUSB\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xDD), 1, X86InstInfo{\"VPADDUSW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xDE), 1, X86InstInfo{\"VPMAXUB\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xDF), 1, X86InstInfo{\"VPANDN\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b01, 0xE0), 1, X86InstInfo{\"VPAVGB\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xE1), 1, X86InstInfo{\"VPSRAW\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xE2), 1, X86InstInfo{\"VPSRAD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xE3), 1, X86InstInfo{\"VPAVGW\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xE4), 1, X86InstInfo{\"VPMULHUW\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xE5), 1, X86InstInfo{\"VPMULHW\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b01, 0xE6), 1, X86InstInfo{\"VCVTTPD2DQ\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b10, 0xE6), 1, X86InstInfo{\"VCVTDQ2PD\",   TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b11, 0xE6), 1, X86InstInfo{\"VCVTPD2DQ\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b01, 0xE7), 1, X86InstInfo{\"VMOVNTDQ\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_MOD_MEM_ONLY | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b01, 0xE8), 1, X86InstInfo{\"VPSUBSB\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xE9), 1, X86InstInfo{\"VPSUBSW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xEA), 1, X86InstInfo{\"VPMINSW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xEB), 1, X86InstInfo{\"VPOR\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xEC), 1, X86InstInfo{\"VPADDSB\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xED), 1, X86InstInfo{\"VPADDSW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xEE), 1, X86InstInfo{\"VPMAXSW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xEF), 1, X86InstInfo{\"VPXOR\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b11, 0xF0), 1, X86InstInfo{\"VLDDQU\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(1, 0b01, 0xF1), 1, X86InstInfo{\"VPSLLW\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xF2), 1, X86InstInfo{\"VPSLLD\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xF3), 1, X86InstInfo{\"VPSLLQ\",      TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xF4), 1, X86InstInfo{\"VPMULUDQ\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xF5), 1, X86InstInfo{\"VPMADDWD\",    TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xF6), 1, X86InstInfo{\"VPSADBW\",     TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xF7), 1, X86InstInfo{\"VMASKMOVDQU\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_VEX_L_0, 0}},\n\n    {OPD(1, 0b01, 0xF8), 1, X86InstInfo{\"VPSUBB\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xF9), 1, X86InstInfo{\"VPSUBW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xFA), 1, X86InstInfo{\"VPSUBD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xFB), 1, X86InstInfo{\"VPSUBQ\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xFC), 1, X86InstInfo{\"VPADDB\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xFD), 1, X86InstInfo{\"VPADDW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(1, 0b01, 0xFE), 1, X86InstInfo{\"VPADDD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    // VEX Map 2\n    {OPD(2, 0b01, 0x00), 1, X86InstInfo{\"VPSHUFB\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x01), 1, X86InstInfo{\"VPHADDW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x02), 1, X86InstInfo{\"VPHADDD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x03), 1, X86InstInfo{\"VPHADDSW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x04), 1, X86InstInfo{\"VPMADDUBSW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x05), 1, X86InstInfo{\"VPHSUBW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x06), 1, X86InstInfo{\"VPHSUBD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x07), 1, X86InstInfo{\"VPHSUBSW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0x08), 1, X86InstInfo{\"VPSIGNB\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x09), 1, X86InstInfo{\"VPSIGNW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x0A), 1, X86InstInfo{\"VPSIGND\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x0B), 1, X86InstInfo{\"VPMULHRSW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x0C), 1, X86InstInfo{\"VPERMILPS\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x0D), 1, X86InstInfo{\"VPERMILPD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x0E), 1, X86InstInfo{\"VTESTPS\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x0F), 1, X86InstInfo{\"VTESTPD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0x13), 1, X86InstInfo{\"VCVTPH2PS\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x16), 1, X86InstInfo{\"VPERMPS\", TYPE_INST, GenFlagsSameSize(SIZE_256BIT) | FLAGS_MODRM | FLAGS_VEX_L_1 | FLAGS_VEX_1ST_SRC | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x17), 1, X86InstInfo{\"VPTEST\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0x18), 1, X86InstInfo{\"VBROADCASTSS\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x19), 1, X86InstInfo{\"VBROADCASTSD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_L_1 | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x1A), 1, X86InstInfo{\"VBROADCASTF128\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_L_1 | FLAGS_SF_MOD_MEM_ONLY | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x1C), 1, X86InstInfo{\"VPABSB\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x1D), 1, X86InstInfo{\"VPABSW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x1E), 1, X86InstInfo{\"VPABSD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0x20), 1, X86InstInfo{\"VPMOVSXBW\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x21), 1, X86InstInfo{\"VPMOVSXBD\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x22), 1, X86InstInfo{\"VPMOVSXBQ\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_16BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x23), 1, X86InstInfo{\"VPMOVSXWD\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x24), 1, X86InstInfo{\"VPMOVSXWQ\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x25), 1, X86InstInfo{\"VPMOVSXDQ\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0x28), 1, X86InstInfo{\"VPMULDQ\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x29), 1, X86InstInfo{\"VPCMPEQQ\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x2A), 1, X86InstInfo{\"VMOVNTDQA\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x2B), 1, X86InstInfo{\"VPACKUSDW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x2C), 1, X86InstInfo{\"VMASKMOVPS\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_VEX_1ST_SRC | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x2D), 1, X86InstInfo{\"VMASKMOVPD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_VEX_1ST_SRC | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x2E), 1, X86InstInfo{\"VMASKMOVPS\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_VEX_1ST_SRC | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x2F), 1, X86InstInfo{\"VMASKMOVPD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_VEX_1ST_SRC | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0x30), 1, X86InstInfo{\"VPMOVZXBW\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x31), 1, X86InstInfo{\"VPMOVZXBD\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x32), 1, X86InstInfo{\"VPMOVZXBQ\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_16BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x33), 1, X86InstInfo{\"VPMOVZXWD\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x34), 1, X86InstInfo{\"VPMOVZXWQ\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x35), 1, X86InstInfo{\"VPMOVZXDQ\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x36), 1, X86InstInfo{\"VPERMD\", TYPE_INST, GenFlagsSameSize(SIZE_256BIT) | FLAGS_MODRM | FLAGS_VEX_L_1 | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x37), 1, X86InstInfo{\"VPCMPGTQ\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0x38), 1, X86InstInfo{\"VPMINSB\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x39), 1, X86InstInfo{\"VPMINSD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x3A), 1, X86InstInfo{\"VPMINUW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x3B), 1, X86InstInfo{\"VPMINUD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x3C), 1, X86InstInfo{\"VPMAXSB\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x3D), 1, X86InstInfo{\"VPMAXSD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x3E), 1, X86InstInfo{\"VPMAXUW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x3F), 1, X86InstInfo{\"VPMAXUD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0x40), 1, X86InstInfo{\"VPMULLD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x41), 1, X86InstInfo{\"VPHMINPOSUW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_VEX_L_0, 0}},\n    {OPD(2, 0b01, 0x45), 1, X86InstInfo{\"VPSRLV\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x46), 1, X86InstInfo{\"VPSRAVD\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x47), 1, X86InstInfo{\"VPSLLV\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0x58), 1, X86InstInfo{\"VPBROADCASTD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x59), 1, X86InstInfo{\"VPBROADCASTQ\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x5A), 1, X86InstInfo{\"VBROADCASTI128\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_L_1 | FLAGS_SF_MOD_MEM_ONLY | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0x78), 1, X86InstInfo{\"VPBROADCASTB\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x79), 1, X86InstInfo{\"VPBROADCASTW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0x8C), 1, X86InstInfo{\"VPMASKMOV\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x8E), 1, X86InstInfo{\"VPMASKMOV\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0x90), 1, X86InstInfo{\"VPGATHERDD/Q\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_2ND_SRC | FLAGS_VEX_VSIB | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x91), 1, X86InstInfo{\"VPGATHERQD/Q\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_2ND_SRC | FLAGS_VEX_VSIB | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x92), 1, X86InstInfo{\"VGATHERDPS/D\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_2ND_SRC | FLAGS_VEX_VSIB | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x93), 1, X86InstInfo{\"VGATHERQPS/D\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_2ND_SRC | FLAGS_VEX_VSIB | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0x96), 1, X86InstInfo{\"VFMADDSUB132\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x97), 1, X86InstInfo{\"VFMSUBADD132\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0x98), 1, X86InstInfo{\"VFMADD132\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x99), 1, X86InstInfo{\"VFMADD132_S\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(2, 0b01, 0x9A), 1, X86InstInfo{\"VFMSUB132\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x9B), 1, X86InstInfo{\"VFMSUB132_S\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(2, 0b01, 0x9C), 1, X86InstInfo{\"VFNMADD132\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x9D), 1, X86InstInfo{\"VFNMADD132_S\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(2, 0b01, 0x9E), 1, X86InstInfo{\"VFNMSUB132\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0x9F), 1, X86InstInfo{\"VFNMSUB132_S\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(2, 0b01, 0xA8), 1, X86InstInfo{\"VFMADD213\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0xA9), 1, X86InstInfo{\"VFMADD213_S\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(2, 0b01, 0xAA), 1, X86InstInfo{\"VFMSUB213\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0xAB), 1, X86InstInfo{\"VFMSUB213_S\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(2, 0b01, 0xAC), 1, X86InstInfo{\"VFNMADD213\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0xAD), 1, X86InstInfo{\"VFNMADD213_S\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(2, 0b01, 0xAE), 1, X86InstInfo{\"VFNMSUB213\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0xAF), 1, X86InstInfo{\"VFNMSUB213_S\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(2, 0b01, 0xB8), 1, X86InstInfo{\"VFMADD231\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0xB9), 1, X86InstInfo{\"VFMADD231_S\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(2, 0b01, 0xBA), 1, X86InstInfo{\"VFMSUB231\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0xBB), 1, X86InstInfo{\"VFMSUB231_S\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(2, 0b01, 0xBC), 1, X86InstInfo{\"VFNMADD231\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0xBD), 1, X86InstInfo{\"VFNMADD231_S\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n    {OPD(2, 0b01, 0xBE), 1, X86InstInfo{\"VFNMSUB231\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0xBF), 1, X86InstInfo{\"VFNMSUB231_S\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_IGNORE, 0}},\n\n    {OPD(2, 0b01, 0xA6), 1, X86InstInfo{\"VFMADDSUB213\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0xA7), 1, X86InstInfo{\"VFMSUBADD213\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0xB6), 1, X86InstInfo{\"VFMADDSUB231\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0xB7), 1, X86InstInfo{\"VFMSUBADD231\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b01, 0xDB), 1, X86InstInfo{\"VAESIMC\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0xDC), 1, X86InstInfo{\"VAESENC\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0xDD), 1, X86InstInfo{\"VAESENCLAST\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0xDE), 1, X86InstInfo{\"VAESDEC\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n    {OPD(2, 0b01, 0xDF), 1, X86InstInfo{\"VAESDECLAST\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0}},\n\n    {OPD(2, 0b00, 0xF2), 1, X86InstInfo{\"ANDN\", TYPE_INST, FLAGS_MODRM | FLAGS_VEX_1ST_SRC, 0}},\n\n    {OPD(2, 0b00, 0xF3), 1, X86InstInfo{\"\", TYPE_VEX_GROUP_17, FLAGS_NONE, 0}}, // VEX Group 17\n    {OPD(2, 0b01, 0xF3), 1, X86InstInfo{\"\", TYPE_VEX_GROUP_17, FLAGS_NONE, 0}}, // VEX Group 17\n    {OPD(2, 0b10, 0xF3), 1, X86InstInfo{\"\", TYPE_VEX_GROUP_17, FLAGS_NONE, 0}}, // VEX Group 17\n    {OPD(2, 0b11, 0xF3), 1, X86InstInfo{\"\", TYPE_VEX_GROUP_17, FLAGS_NONE, 0}}, // VEX Group 17\n\n    {OPD(2, 0b00, 0xF5), 1, X86InstInfo{\"BZHI\", TYPE_INST, FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_VEX_2ND_SRC, 0}},\n    // AMD reference manual is incorrect. PEXT actually maps to 0b10, not 0b01.\n    {OPD(2, 0b10, 0xF5), 1, X86InstInfo{\"PEXT\", TYPE_INST, FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_VEX_1ST_SRC, 0}},\n    {OPD(2, 0b11, 0xF5), 1, X86InstInfo{\"PDEP\", TYPE_INST, FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_VEX_1ST_SRC, 0}},\n\n    {OPD(2, 0b11, 0xF6), 1, X86InstInfo{\"MULX\", TYPE_INST, FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_VEX_1ST_SRC, 0}},\n\n    {OPD(2, 0b00, 0xF7), 1, X86InstInfo{\"BEXTR\", TYPE_INST, FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_VEX_2ND_SRC, 0}},\n    {OPD(2, 0b01, 0xF7), 1, X86InstInfo{\"SHLX\", TYPE_INST, FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_VEX_2ND_SRC, 0}},\n    {OPD(2, 0b10, 0xF7), 1, X86InstInfo{\"SARX\", TYPE_INST, FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_VEX_2ND_SRC, 0}},\n    {OPD(2, 0b11, 0xF7), 1, X86InstInfo{\"SHRX\", TYPE_INST, FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_VEX_2ND_SRC, 0}},\n\n    // VEX Map 3\n    {OPD(3, 0b01, 0x00), 1, X86InstInfo{\"VPERMQ\", TYPE_INST, GenFlagsSameSize(SIZE_256BIT) | FLAGS_MODRM | FLAGS_VEX_L_1 | FLAGS_REX_W_1 | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x01), 1, X86InstInfo{\"VPERMPD\", TYPE_INST, GenFlagsSameSize(SIZE_256BIT) | FLAGS_MODRM | FLAGS_VEX_L_1 | FLAGS_REX_W_1 | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x02), 1, X86InstInfo{\"VPBLENDD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x04), 1, X86InstInfo{\"VPERMILPS\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x05), 1, X86InstInfo{\"VPERMILPD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x06), 1, X86InstInfo{\"VPERM2F128\", TYPE_INST, GenFlagsSameSize(SIZE_256BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_REX_W_0 | FLAGS_XMM_FLAGS | FLAGS_VEX_L_1, 1}},\n\n    {OPD(3, 0b01, 0x08), 1, X86InstInfo{\"VROUNDPS\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x09), 1, X86InstInfo{\"VROUNDPD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x0A), 1, X86InstInfo{\"VROUNDSS\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x0B), 1, X86InstInfo{\"VROUNDSD\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x0C), 1, X86InstInfo{\"VBLENDPS\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x0D), 1, X86InstInfo{\"VBLENDPD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x0E), 1, X86InstInfo{\"VPBLENDW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x0F), 1, X86InstInfo{\"VPALIGNR\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n\n    {OPD(3, 0b01, 0x14), 1, X86InstInfo{\"VPEXTRB\", TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_SF_MOD_DST | FLAGS_SF_DST_GPR | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x15), 1, X86InstInfo{\"VPEXTRW\", TYPE_INST, GenFlagsSizes(SIZE_16BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_SF_MOD_DST | FLAGS_SF_DST_GPR | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x16), 1, X86InstInfo{\"VPEXTRD\", TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_SF_MOD_DST | FLAGS_SF_DST_GPR | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x17), 1, X86InstInfo{\"VEXTRACTPS\", TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_SF_MOD_DST | FLAGS_SF_DST_GPR | FLAGS_XMM_FLAGS, 1}},\n\n    {OPD(3, 0b01, 0x18), 1, X86InstInfo{\"VINSERTF128\", TYPE_INST, GenFlagsSameSize(SIZE_256BIT) | FLAGS_MODRM | FLAGS_VEX_L_1 | FLAGS_REX_W_0 | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x19), 1, X86InstInfo{\"VEXTRACTF128\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_256BIT) | FLAGS_MODRM | FLAGS_VEX_L_1 | FLAGS_REX_W_0 | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x1D), 1, X86InstInfo{\"VCVTPS2PH\", TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_REX_W_0 | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 1}},\n\n    {OPD(3, 0b01, 0x20), 1, X86InstInfo{\"VPINSRB\", TYPE_INST, GenFlagsDstSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_SF_SRC_GPR, 1}},\n    {OPD(3, 0b01, 0x21), 1, X86InstInfo{\"VINSERTPS\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x22), 1, X86InstInfo{\"VPINSR{D,Q}\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_SF_SRC_GPR, 1}},\n\n    {OPD(3, 0b01, 0x38), 1, X86InstInfo{\"VINSERTI128\", TYPE_INST, GenFlagsSameSize(SIZE_256BIT) | FLAGS_MODRM | FLAGS_VEX_L_1 | FLAGS_REX_W_0 | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x39), 1, X86InstInfo{\"VEXTRACTI128\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_256BIT) | FLAGS_MODRM | FLAGS_VEX_L_1 | FLAGS_REX_W_0 | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 1}},\n\n    {OPD(3, 0b01, 0x40), 1, X86InstInfo{\"VDPPS\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x41), 1, X86InstInfo{\"VDPPD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS | FLAGS_VEX_L_0, 1}},\n    {OPD(3, 0b01, 0x42), 1, X86InstInfo{\"VMPSADBW\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x44), 1, X86InstInfo{\"VPCLMULQDQ\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x46), 1, X86InstInfo{\"VPERM2I128\", TYPE_INST, GenFlagsSameSize(SIZE_256BIT) | FLAGS_MODRM | FLAGS_VEX_L_1 | FLAGS_REX_W_0 | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n\n    {OPD(3, 0b01, 0x4A), 1, X86InstInfo{\"VBLENDVPS\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_REX_W_0 | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x4B), 1, X86InstInfo{\"VBLENDVPD\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_REX_W_0 | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n    {OPD(3, 0b01, 0x4C), 1, X86InstInfo{\"VPBLENDVB\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_REX_W_0 | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 1}},\n\n    {OPD(3, 0b01, 0x5C), 1, X86InstInfo{\"VFMADDSUBPS\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x5D), 1, X86InstInfo{\"VFMADDSUBPD\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x5E), 1, X86InstInfo{\"VFMSUBADDPS\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x5F), 1, X86InstInfo{\"VFMSUBADDPD\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n\n    {OPD(3, 0b01, 0x60), 1, X86InstInfo{\"VPCMPESTRM\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_VEX_L_0, 1}},\n    {OPD(3, 0b01, 0x61), 1, X86InstInfo{\"VPCMPESTRI\", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_VEX_L_0, 1}},\n    {OPD(3, 0b01, 0x62), 1, X86InstInfo{\"VPCMPISTRM\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_VEX_L_0, 1}},\n    {OPD(3, 0b01, 0x63), 1, X86InstInfo{\"VPCMPISTRI\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_VEX_L_0, 1}},\n\n    {OPD(3, 0b01, 0x68), 1, X86InstInfo{\"VFMADDPS\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x69), 1, X86InstInfo{\"VFMADDPD\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x6A), 1, X86InstInfo{\"VFMADDSS\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x6B), 1, X86InstInfo{\"VFMADDSD\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x6C), 1, X86InstInfo{\"VFMSUBPS\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x6D), 1, X86InstInfo{\"VFMSUBPD\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x6E), 1, X86InstInfo{\"VFMSUBSS\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x6F), 1, X86InstInfo{\"VFMSUBSD\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n\n    {OPD(3, 0b01, 0x78), 1, X86InstInfo{\"VFNMADDPS\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x79), 1, X86InstInfo{\"VFNMADDPD\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x7A), 1, X86InstInfo{\"VFNMADDSS\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x7B), 1, X86InstInfo{\"VFNMADDSD\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x7C), 1, X86InstInfo{\"VFNMSUBPS\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x7D), 1, X86InstInfo{\"VFNMSUBPD\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x7E), 1, X86InstInfo{\"VFNMSUBSS\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n    {OPD(3, 0b01, 0x7F), 1, X86InstInfo{\"VFNMSUBSD\", TYPE_UNDEC, FLAGS_NONE, 0}}, ///< FMA4\n\n    {OPD(3, 0b01, 0xDF), 1, X86InstInfo{\"VAESKEYGENASSIST\", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_L_0 | FLAGS_XMM_FLAGS, 1}},\n\n    {OPD(3, 0b11, 0xF0), 1, X86InstInfo{\"RORX\", TYPE_INST, FLAGS_MODRM | FLAGS_VEX_L_0, 1}},\n\n    // VEX Map 4 - 31 (Reserved)\n  };\n#undef OPD\n\n  GenerateTable(Table.data(), VEXTable, std::size(VEXTable));\n\n  IR::InstallToTable(Table, IR::OpDispatch_VEXTable);\n  IR::InstallToTable(Table, RuntimeTable);\n  return Table;\n};\n\nauto GroupTableLambda = [](const auto RuntimeTable) consteval {\n  std::array<X86InstInfo, MAX_VEX_GROUP_TABLE_SIZE> Table{};\n\n#define OPD(group, pp, opcode) (((group - TYPE_VEX_GROUP_12) << 4) | (pp << 3) | (opcode))\n  constexpr U8U8InfoStruct VEXGroupTable[] = {\n    {OPD(TYPE_VEX_GROUP_12, 1, 0b010), 1, X86InstInfo{\"VPSRLW\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_VEX_DST | FLAGS_XMM_FLAGS, 1}},\n    {OPD(TYPE_VEX_GROUP_12, 1, 0b100), 1, X86InstInfo{\"VPSRAW\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_VEX_DST | FLAGS_XMM_FLAGS, 1}},\n    {OPD(TYPE_VEX_GROUP_12, 1, 0b110), 1, X86InstInfo{\"VPSLLW\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_VEX_DST | FLAGS_XMM_FLAGS, 1}},\n\n    {OPD(TYPE_VEX_GROUP_13, 1, 0b010), 1, X86InstInfo{\"VPSRLD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_VEX_DST | FLAGS_XMM_FLAGS, 1}},\n    {OPD(TYPE_VEX_GROUP_13, 1, 0b100), 1, X86InstInfo{\"VPSRAD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_VEX_DST | FLAGS_XMM_FLAGS, 1}},\n    {OPD(TYPE_VEX_GROUP_13, 1, 0b110), 1, X86InstInfo{\"VPSLLD\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_VEX_DST | FLAGS_XMM_FLAGS, 1}},\n\n    {OPD(TYPE_VEX_GROUP_14, 1, 0b010), 1, X86InstInfo{\"VPSRLQ\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_VEX_DST | FLAGS_XMM_FLAGS, 1}},\n    {OPD(TYPE_VEX_GROUP_14, 1, 0b011), 1, X86InstInfo{\"VPSRLDQ\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_VEX_DST | FLAGS_XMM_FLAGS, 1}},\n    {OPD(TYPE_VEX_GROUP_14, 1, 0b110), 1, X86InstInfo{\"VPSLLQ\",   TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_VEX_DST | FLAGS_XMM_FLAGS, 1}},\n    {OPD(TYPE_VEX_GROUP_14, 1, 0b111), 1, X86InstInfo{\"VPSLLDQ\",  TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_VEX_DST | FLAGS_XMM_FLAGS, 1}},\n\n    {OPD(TYPE_VEX_GROUP_15, 0, 0b010), 1, X86InstInfo{\"VLDMXCSR\", TYPE_INST, GenFlagsSameSize(SIZE_32BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_VEX_L_0 | FLAGS_SF_MOD_MEM_ONLY, 0}},\n    {OPD(TYPE_VEX_GROUP_15, 0, 0b011), 1, X86InstInfo{\"VSTMXCSR\", TYPE_INST, GenFlagsSameSize(SIZE_32BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_VEX_L_0 | FLAGS_SF_MOD_MEM_ONLY, 0}},\n\n    {OPD(TYPE_VEX_GROUP_17, 0, 0b001), 1, X86InstInfo{\"BLSR\",     TYPE_INST, FLAGS_MODRM | FLAGS_VEX_DST, 0}},\n    {OPD(TYPE_VEX_GROUP_17, 0, 0b010), 1, X86InstInfo{\"BLSMSK\",   TYPE_INST, FLAGS_MODRM | FLAGS_VEX_DST, 0}},\n    {OPD(TYPE_VEX_GROUP_17, 0, 0b011), 1, X86InstInfo{\"BLSI\",     TYPE_INST, FLAGS_MODRM | FLAGS_VEX_DST, 0}},\n  };\n#undef OPD\n\n  GenerateTable(Table.data(), VEXGroupTable, std::size(VEXGroupTable));\n\n  IR::InstallToTable(Table, IR::OpDispatch_VEXGroupTable);\n  IR::InstallToTable(Table, RuntimeTable);\n  return Table;\n};\n\nconst std::array<X86InstInfo, MAX_VEX_TABLE_SIZE> VEXTableOps = BaseTableLambda(std::to_array(AVX256::BaseTable));\nconst std::array<X86InstInfo, MAX_VEX_GROUP_TABLE_SIZE> VEXTableGroupOps = GroupTableLambda(std::to_array(AVX256::TableGroupOps));\n\nconst std::array<X86InstInfo, MAX_VEX_TABLE_SIZE> VEXTableOps_AVX128 = BaseTableLambda(std::to_array(AVX128::BaseTable));\nconst std::array<X86InstInfo, MAX_VEX_GROUP_TABLE_SIZE> VEXTableGroupOps_AVX128 = GroupTableLambda(std::to_array(AVX128::TableGroupOps));\n}\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/X86Tables/X86Tables.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-tables\n$end_info$\n*/\n\n#pragma once\n\n#include <FEXCore/Utils/EnumUtils.h>\n#include <FEXCore/Utils/LogManager.h>\n\n#include <array>\n#include <cstddef>\n#include <cstdint>\n#include <cstring>\n#include <type_traits>\n\nnamespace FEXCore::IR {\nclass OpDispatchBuilder;\n}\n\nnamespace FEXCore::X86Tables {\nstruct X86InstInfo;\n\nnamespace DecodeFlags {\n  constexpr uint32_t FLAG_OPERAND_SIZE = (1 << 0);\n  constexpr uint32_t FLAG_ADDRESS_SIZE = (1 << 1);\n  constexpr uint32_t FLAG_LOCK = (1 << 2);\n  constexpr uint32_t FLAG_LEGACY_PREFIX = (1 << 3);\n  constexpr uint32_t FLAG_REX_PREFIX = (1 << 4);\n  constexpr uint32_t FLAG_VSIB_BYTE = (1 << 5);\n  constexpr uint32_t FLAG_OPTION_AVX_W = (1 << 6);\n  constexpr uint32_t FLAG_REX_WIDENING = (1 << 7);\n  constexpr uint32_t FLAG_REX_XGPR_B = (1 << 8);\n  constexpr uint32_t FLAG_REX_XGPR_X = (1 << 9);\n  constexpr uint32_t FLAG_REX_XGPR_R = (1 << 10);\n  constexpr uint32_t FLAG_NO_PREFIX = (0b000 << 11);\n  constexpr uint32_t FLAG_ES_PREFIX = (0b001 << 11);\n  constexpr uint32_t FLAG_CS_PREFIX = (0b010 << 11);\n  constexpr uint32_t FLAG_SS_PREFIX = (0b011 << 11);\n  constexpr uint32_t FLAG_DS_PREFIX = (0b100 << 11);\n  constexpr uint32_t FLAG_FS_PREFIX = (0b101 << 11);\n  constexpr uint32_t FLAG_GS_PREFIX = (0b110 << 11);\n  constexpr uint32_t FLAG_SEGMENTS = (0b111 << 11);\n  constexpr uint32_t FLAG_FORCE_TSO = (1 << 14);\n  constexpr uint32_t FLAG_DECODED_MODRM = (1 << 15);\n  constexpr uint32_t FLAG_DECODED_SIB = (1 << 16);\n  constexpr uint32_t FLAG_REP_PREFIX = (1 << 17);\n  constexpr uint32_t FLAG_REPNE_PREFIX = (1 << 18);\n  // Size flags\n  constexpr uint32_t FLAG_SIZE_DST_OFF = 19;\n  constexpr uint32_t FLAG_SIZE_SRC_OFF = FLAG_SIZE_DST_OFF + 3;\n  constexpr uint32_t SIZE_MASK = 0b111;\n  constexpr uint32_t SIZE_DEF = 0b000; // This should be invalid past decoding\n  constexpr uint32_t SIZE_8BIT = 0b001;\n  constexpr uint32_t SIZE_16BIT = 0b010;\n  constexpr uint32_t SIZE_32BIT = 0b011;\n  constexpr uint32_t SIZE_64BIT = 0b100;\n  constexpr uint32_t SIZE_128BIT = 0b101;\n  constexpr uint32_t SIZE_256BIT = 0b110;\n\n  constexpr uint32_t FLAG_OPADDR_OFF = (FLAG_SIZE_SRC_OFF + 3);\n  constexpr uint32_t FLAG_OPADDR_STACKSIZE = 4; // Two level deep stack\n  constexpr uint32_t FLAG_OPADDR_FLAG_SIZE = 2;\n  constexpr uint32_t FLAG_OPADDR_MASK = (((1 << FLAG_OPADDR_STACKSIZE) - 1) << FLAG_OPADDR_OFF);\n\n  // 00 = NONE\n  constexpr uint32_t FLAG_OPERAND_SIZE_LAST = 0b01;\n  constexpr uint32_t FLAG_WIDENING_SIZE_LAST = 0b10;\n\n  constexpr uint32_t GetSizeDstFlags(uint32_t Flags) {\n    return (Flags >> FLAG_SIZE_DST_OFF) & SIZE_MASK;\n  }\n  constexpr uint32_t GetSizeSrcFlags(uint32_t Flags) {\n    return (Flags >> FLAG_SIZE_SRC_OFF) & SIZE_MASK;\n  }\n\n  constexpr uint32_t GenSizeDstSize(uint32_t Size) {\n    return Size << FLAG_SIZE_DST_OFF;\n  }\n  constexpr uint32_t GenSizeSrcSize(uint32_t Size) {\n    return Size << FLAG_SIZE_SRC_OFF;\n  }\n\n  constexpr uint32_t GetOpAddr(uint32_t Flags, uint32_t Index) {\n    return (((Flags & FLAG_OPADDR_MASK) >> FLAG_OPADDR_OFF) >> (Index * 2)) & ((1 << FLAG_OPADDR_FLAG_SIZE) - 1);\n  }\n\n  inline void PushOpAddr(uint32_t* Flags, uint32_t Flag) {\n    uint32_t TmpFlags = *Flags;\n    uint32_t BottomOfStack = ((TmpFlags & FLAG_OPADDR_MASK) >> FLAG_OPADDR_OFF) & ((1 << FLAG_OPADDR_FLAG_SIZE) - 1);\n\n    TmpFlags &= ~(FLAG_OPADDR_MASK);\n    TmpFlags |= (BottomOfStack << (FLAG_OPADDR_OFF + FLAG_OPADDR_FLAG_SIZE)) | (Flag << FLAG_OPADDR_OFF);\n\n    *Flags = TmpFlags;\n  }\n\n  inline void PopOpAddrIf(uint32_t* Flags, uint32_t Flag) {\n    uint32_t TmpFlags = *Flags;\n    uint32_t BottomOfStack = ((TmpFlags & FLAG_OPADDR_MASK) >> FLAG_OPADDR_OFF) & ((1 << FLAG_OPADDR_FLAG_SIZE) - 1);\n\n    // Only pop the stack if the bottom flag is the one we care about\n    // Necessary for escape prefixes that overlap regular prefixes\n    if (BottomOfStack != Flag) {\n      return;\n    }\n\n    uint32_t TopOfStack = ((TmpFlags & FLAG_OPADDR_MASK) >> (FLAG_OPADDR_OFF + FLAG_OPADDR_FLAG_SIZE)) & ((1 << FLAG_OPADDR_FLAG_SIZE) - 1);\n\n    TmpFlags &= ~(FLAG_OPADDR_MASK);\n    TmpFlags |= (TopOfStack << FLAG_OPADDR_OFF);\n\n    *Flags = TmpFlags;\n  }\n\n} // namespace DecodeFlags\n\nstruct DecodedOperand {\n  enum class OpType : uint8_t {\n    Nothing,\n    GPR,\n    GPRDirect,\n    GPRIndirect,\n    GPRIndirectRelocation,\n    RIPRelative,\n    RIPRelativeRelocation,\n    Literal,\n    LiteralRelocation,\n    SIB,\n    SIBRelocation\n  };\n\n  bool IsNone() const {\n    return Type == OpType::Nothing;\n  }\n  bool IsGPR() const {\n    return Type == OpType::GPR;\n  }\n  bool IsGPRDirect() const {\n    return Type == OpType::GPRDirect;\n  }\n  bool IsGPRIndirect() const {\n    return Type == OpType::GPRIndirect;\n  }\n  bool IsGPRIndirectRelocation() const {\n    return Type == OpType::GPRIndirectRelocation;\n  }\n  bool IsRIPRelative() const {\n    return Type == OpType::RIPRelative;\n  }\n  bool IsRIPRelativeRelocation() const {\n    return Type == OpType::RIPRelativeRelocation;\n  }\n  bool IsLiteral() const {\n    return Type == OpType::Literal;\n  }\n  bool IsLiteralRelocation() const {\n    return Type == OpType::LiteralRelocation;\n  }\n  bool IsSIB() const {\n    return Type == OpType::SIB;\n  }\n  bool IsSIBRelocation() const {\n    return Type == OpType::SIBRelocation;\n  }\n\n  uint64_t Literal() const {\n    LOGMAN_THROW_A_FMT(IsLiteral(), \"Precondition: must be a literal\");\n    return Data.Literal.Value;\n  }\n\n  union TypeUnion {\n    struct GPRType {\n      bool HighBits;\n      uint8_t GPR;\n      auto operator<=>(const GPRType&) const = default;\n    } GPR;\n\n    struct {\n      int64_t Displacement;\n      uint8_t GPR;\n    } GPRIndirect; // Shared with GPRIndirectRelocation\n\n    struct {\n      int64_t Value;\n    } RIPLiteral; // Shared with RIPLiteralRelocation\n\n    struct LiteralType {\n      uint64_t Value;\n      uint8_t Size;\n    } Literal;\n\n    struct {\n      int64_t EntrypointOffset;\n    } LiteralRelocation;\n\n    struct {\n      int64_t Offset;\n      uint8_t Scale;\n      uint8_t Index; // ~0 invalid\n      uint8_t Base;  // ~0 invalid\n    } SIB;           // Shared with SIBRelocation\n  };\n\n  TypeUnion Data;\n  OpType Type;\n};\n\nstruct DecodedInst {\n  uint64_t PC;\n\n  DecodedOperand Dest;\n  DecodedOperand Src[3];\n\n  // Constains the dispatcher handler pointer\n  const X86InstInfo* TableInfo;\n\n  uint32_t Flags;\n  uint16_t OP;\n  uint8_t OPRaw;\n\n  uint8_t ModRM;\n  uint8_t SIB;\n  uint8_t InstSize;\n  int8_t REXIndex;\n};\n\nunion ModRMDecoded {\n  uint8_t Hex {};\n  struct {\n    uint8_t rm  : 3;\n    uint8_t reg : 3;\n    uint8_t mod : 2;\n  };\n};\n\nunion SIBDecoded {\n  uint8_t Hex {};\n  struct {\n    uint8_t base  : 3;\n    uint8_t index : 3;\n    uint8_t scale : 2;\n  };\n};\n\nenum InstType {\n  TYPE_UNKNOWN,\n  TYPE_LEGACY_PREFIX,\n  TYPE_PREFIX,\n  TYPE_REX_PREFIX,\n  TYPE_SECONDARY_TABLE_PREFIX,\n  TYPE_X87_TABLE_PREFIX,\n  TYPE_VEX_TABLE_PREFIX,\n  TYPE_INST,\n  TYPE_X87 = TYPE_INST,\n  TYPE_INVALID,\n  TYPE_COPY_OTHER,\n  // Changes `X86InstInfo::OpcodeDispatcher` member to use the `Indirect` version.\n  // Points to a 2 member array of X86InstInfo to choose instruction description based on executing bitness.\n  TYPE_ARCH_DISPATCHER,\n\n  // Must be in order\n  // Groups 1, 1a, 2, 3, 4, 5, 11 are for the primary op table\n  // Groups 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, p are for the secondary op table\n  TYPE_GROUP_1,\n  TYPE_GROUP_1A,\n  TYPE_GROUP_2,\n  TYPE_GROUP_3,\n  TYPE_GROUP_4,\n  TYPE_GROUP_5,\n  TYPE_GROUP_11,\n\n  // Must be in order\n  // Groups 6-p Are for the secondary op table\n  TYPE_GROUP_6,\n  TYPE_GROUP_7,\n  TYPE_GROUP_8,\n  TYPE_GROUP_9,\n  TYPE_GROUP_10,\n  TYPE_GROUP_12,\n  TYPE_GROUP_13,\n  TYPE_GROUP_14,\n  TYPE_GROUP_15,\n  TYPE_GROUP_16,\n  TYPE_GROUP_17,\n  TYPE_GROUP_P,\n\n  // The secondary op extension table allows further extensions\n  // Group 7 allows additional extensions to this table\n  TYPE_SECOND_GROUP_MODRM,\n\n  TYPE_VEX_GROUP_12,\n  TYPE_VEX_GROUP_13,\n  TYPE_VEX_GROUP_14,\n  TYPE_VEX_GROUP_15,\n  TYPE_VEX_GROUP_17,\n\n  TYPE_GROUP_EVEX,\n\n  // Exists in the table but isn't decoded correctly\n  TYPE_UNDEC = TYPE_INVALID,\n  TYPE_MMX = TYPE_INVALID,\n  TYPE_PRIV = TYPE_INVALID,\n  TYPE_0F38_TABLE = TYPE_INVALID,\n  TYPE_0F3A_TABLE = TYPE_INVALID,\n  TYPE_3DNOW_TABLE = TYPE_INVALID,\n};\n\nnamespace InstFlags {\n\n  using InstFlagType = uint64_t;\n\n  constexpr InstFlagType FLAGS_NONE = 0;\n  // The secondary Opcode Map uses prefix bytes to overlay more instruction\n  // But some instructions need to ignore this overlay and consume these prefixes.\n  constexpr InstFlagType FLAGS_NO_OVERLAY = (1ULL << 0);\n  // Some instructions partially ignore overlay\n  // Ignore OpSize (0x66) in this case\n  constexpr InstFlagType FLAGS_NO_OVERLAY66 = (1ULL << 1);\n  constexpr InstFlagType FLAGS_DEBUG_MEM_ACCESS = (1ULL << 2);\n  // Only SEXT if the instruction is operating in 64bit operand size\n  constexpr InstFlagType FLAGS_SRC_SEXT64BIT = (1ULL << 3);\n  constexpr InstFlagType FLAGS_BLOCK_END = (1ULL << 4);\n  constexpr InstFlagType FLAGS_SETS_RIP = (1ULL << 5);\n\n  constexpr InstFlagType FLAGS_DISPLACE_SIZE_MUL_2 = (1ULL << 6);\n  constexpr InstFlagType FLAGS_DISPLACE_SIZE_DIV_2 = (1ULL << 7);\n  constexpr InstFlagType FLAGS_SRC_SEXT = (1ULL << 8);\n  constexpr InstFlagType FLAGS_MEM_OFFSET = (1ULL << 9);\n\n  // Enables XMM based subflags\n  // Current reserved range for this SF is [10, 15]\n  constexpr InstFlagType FLAGS_XMM_FLAGS = (1ULL << 10);\n\n  // X87 flags aliased to XMM flags selection\n  // Allows X87 instruction table that is abusing the flag for 64BIT selection to work\n  constexpr InstFlagType FLAGS_X87_FLAGS = (1ULL << 10);\n\n  // Non-XMM subflags\n  constexpr InstFlagType FLAGS_SF_DST_RAX = (1ULL << 11);\n  constexpr InstFlagType FLAGS_SF_DST_RDX = (1ULL << 12);\n  constexpr InstFlagType FLAGS_SF_SRC_RAX = (1ULL << 13);\n  constexpr InstFlagType FLAGS_SF_SRC_RCX = (1ULL << 14);\n  constexpr InstFlagType FLAGS_SF_REX_IN_BYTE = (1ULL << 15);\n\n  // XMM subflags\n  constexpr InstFlagType FLAGS_SF_UNUSED = (1ULL << 11); // No assigned behavior yet\n  constexpr InstFlagType FLAGS_SF_DST_GPR = (1ULL << 12);\n  constexpr InstFlagType FLAGS_SF_SRC_GPR = (1ULL << 13);\n  constexpr InstFlagType FLAGS_SF_MMX_DST = (1ULL << 14);\n  constexpr InstFlagType FLAGS_SF_MMX_SRC = (1ULL << 15);\n  constexpr InstFlagType FLAGS_SF_MMX = FLAGS_SF_MMX_DST | FLAGS_SF_MMX_SRC;\n\n  // Enables MODRM specific subflags\n  // Current reserved range for this SF is [14, 17]\n  constexpr InstFlagType FLAGS_MODRM = (1ULL << 16);\n\n  // With ModRM SF flag enabled\n  // Direction of ModRM. Dst ^ Src\n  // Set means destination is rm bits\n  // Unset means src is rm bits\n  constexpr InstFlagType FLAGS_SF_MOD_DST = (1ULL << 17);\n\n  // If the instruction is restricted to mem or reg only\n  // 0b00 = Regular ModRM support\n  // 0b01 = Memory accesses only\n  // 0b10 = Register accesses only\n  // 0b11 = <Reserved>\n  constexpr InstFlagType FLAGS_SF_MOD_MEM_ONLY = (1ULL << 18);\n  constexpr InstFlagType FLAGS_SF_MOD_REG_ONLY = (1ULL << 19);\n\n  constexpr InstFlagType FLAGS_SF_MOD_ZERO_REG = (1ULL << 20);\n\n  // x87\n  constexpr InstFlagType FLAGS_POP = (1ULL << 21);\n\n  // Whether or not the instruction has a VEX prefix for the dest, first, or second source.\n  constexpr InstFlagType FLAGS_VEX_SRC_MASK = (0b11ULL << 22);\n  constexpr InstFlagType FLAGS_VEX_NO_OPERAND = (0b00ULL << 22);\n  constexpr InstFlagType FLAGS_VEX_DST = (0b01ULL << 22);\n  constexpr InstFlagType FLAGS_VEX_1ST_SRC = (0b10ULL << 22);\n  constexpr InstFlagType FLAGS_VEX_2ND_SRC = (0b11ULL << 22);\n  // Whether or not the instruction has a VSIB byte\n  constexpr InstFlagType FLAGS_VEX_VSIB = (1ULL << 24);\n  constexpr InstFlagType FLAGS_VEX_L_IGNORE = (1ULL << 25);\n  constexpr InstFlagType FLAGS_VEX_L_0 = (1ULL << 26);\n  constexpr InstFlagType FLAGS_VEX_L_1 = (1ULL << 27);\n\n  constexpr InstFlagType FLAGS_REX_W_0 = (1ULL << 28);\n  constexpr InstFlagType FLAGS_REX_W_1 = (1ULL << 29);\n\n  constexpr InstFlagType FLAGS_CALL = (1ULL << 30);\n\n  constexpr InstFlagType FLAGS_SIZE_DST_OFF = 58;\n  constexpr InstFlagType FLAGS_SIZE_SRC_OFF = FLAGS_SIZE_DST_OFF + 3;\n\n  constexpr InstFlagType SIZE_MASK = 0b111;\n  constexpr InstFlagType SIZE_DEF = 0b000;\n  constexpr InstFlagType SIZE_8BIT = 0b001;\n  constexpr InstFlagType SIZE_16BIT = 0b010;\n  constexpr InstFlagType SIZE_32BIT = 0b011;\n  constexpr InstFlagType SIZE_64BIT = 0b100;\n  constexpr InstFlagType SIZE_128BIT = 0b101;\n  constexpr InstFlagType SIZE_256BIT = 0b110;\n  constexpr InstFlagType SIZE_64BITDEF = 0b111; // Default mode is 64bit instead of typical 32bit\n\n#ifndef _WIN32\n  constexpr uint32_t DEFAULT_SYSCALL_FLAGS = FLAGS_NO_OVERLAY;\n#else\n                                                // Syscall ends a block on WIN32 because the instruction can update the CPU's RIP.\n  constexpr uint32_t DEFAULT_SYSCALL_FLAGS = FLAGS_NO_OVERLAY | FLAGS_BLOCK_END;\n#endif\n\n  constexpr InstFlagType GetSizeDstFlags(InstFlagType Flags) {\n    return (Flags >> FLAGS_SIZE_DST_OFF) & SIZE_MASK;\n  }\n  constexpr InstFlagType GetSizeSrcFlags(InstFlagType Flags) {\n    return (Flags >> FLAGS_SIZE_SRC_OFF) & SIZE_MASK;\n  }\n\n  constexpr InstFlagType GenFlagsDstSize(InstFlagType Size) {\n    return Size << FLAGS_SIZE_DST_OFF;\n  }\n  constexpr InstFlagType GenFlagsSrcSize(InstFlagType Size) {\n    return Size << FLAGS_SIZE_SRC_OFF;\n  }\n  constexpr InstFlagType GenFlagsSameSize(InstFlagType Size) {\n    return (Size << FLAGS_SIZE_DST_OFF) | (Size << FLAGS_SIZE_SRC_OFF);\n  }\n  constexpr InstFlagType GenFlagsSizes(InstFlagType Dest, InstFlagType Src) {\n    return (Dest << FLAGS_SIZE_DST_OFF) | (Src << FLAGS_SIZE_SRC_OFF);\n  }\n\n// If it has an xmm subflag\n#define HAS_XMM_SUBFLAG(x, flag) \\\n  (((x) & (FEXCore::X86Tables::InstFlags::FLAGS_XMM_FLAGS | (flag))) == (FEXCore::X86Tables::InstFlags::FLAGS_XMM_FLAGS | (flag)))\n\n// If it has non-xmm subflag\n#define HAS_NON_XMM_SUBFLAG(x, flag) (((x) & (FEXCore::X86Tables::InstFlags::FLAGS_XMM_FLAGS | (flag))) == (flag))\n} // namespace InstFlags\n\nconstexpr uint8_t OpToIndex(uint8_t Op) {\n  switch (Op) {\n  // Group 1\n  case 0x80: return 0;\n  case 0x81: return 1;\n  case 0x82: return 2;\n  case 0x83: return 3;\n  // Group 2\n  case 0xC0: return 0;\n  case 0xC1: return 1;\n  case 0xD0: return 2;\n  case 0xD1: return 3;\n  case 0xD2: return 4;\n  case 0xD3: return 5;\n  // Group 3\n  case 0xF6: return 0;\n  case 0xF7: return 1;\n  // Group 4\n  case 0xFE: return 0;\n  // Group 5\n  case 0xFF: return 0;\n  // Group 11\n  case 0xC6: return 0;\n  case 0xC7: return 1;\n  }\n  return 0;\n}\n\nusing DecodedOp = const DecodedInst*;\nusing OpDispatchPtr = void (IR::OpDispatchBuilder::*)(DecodedOp);\n\nunion OpDispatchPtrWrapper {\n  OpDispatchPtr OpDispatch;\n  const struct X86InstInfo* Indirect;\n};\n\nstruct X86InstInfo {\n  const char* Name;\n  InstType Type;\n  InstFlags::InstFlagType Flags; ///< Must be larger than InstFlags enum\n  uint8_t MoreBytes;\n  OpDispatchPtrWrapper OpcodeDispatcher;\n\n  bool operator==(const X86InstInfo& b) const {\n    if (strcmp(Name, b.Name) != 0 || Type != b.Type || Flags != b.Flags || MoreBytes != b.MoreBytes) {\n      return false;\n    }\n\n    // We don't care if the opcode dispatcher differs\n    return true;\n  }\n  bool operator!=(const X86InstInfo& b) const {\n    return !operator==(b);\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<X86InstInfo>);\n\nconstexpr size_t MAX_PRIMARY_TABLE_SIZE = 256;\nconstexpr size_t MAX_SECOND_TABLE_SIZE = 256;\nconstexpr size_t MAX_REP_MOD_TABLE_SIZE = 256;\nconstexpr size_t MAX_REPNE_MOD_TABLE_SIZE = 256;\nconstexpr size_t MAX_OPSIZE_MOD_TABLE_SIZE = 256;\n// 6 (groups) | 6 (max indexes) | 8 ops = 0b111'111'111 = 9 bits\nconstexpr size_t MAX_INST_GROUP_TABLE_SIZE = 512;\n// 12 (groups) | 3(max indexes) | 8 ops = 0b1111'11'111 = 9 bits\nconstexpr size_t MAX_INST_SECOND_GROUP_TABLE_SIZE = 512;\nconstexpr size_t MAX_X87_TABLE_SIZE = 1 << 11;\nconstexpr size_t MAX_SECOND_MODRM_TABLE_SIZE = 32;\n// (3 bit prefixes) | 8 bit opcode\nconstexpr size_t MAX_0F_38_TABLE_SIZE = (1 << 11);\n// 1 REX | 1 prefixes | 8 bit opcode\nconstexpr size_t MAX_0F_3A_TABLE_SIZE = (1 << 11);\nconstexpr size_t MAX_3DNOW_TABLE_SIZE = 256;\n// VEX\n// map_select(2 bits for now) | vex.pp (2 bits) | opcode (8bit)\nconstexpr size_t MAX_VEX_TABLE_SIZE = (1 << 13);\n// VEX group ops\n// group select (3 bits for now) | ModRM opcode (3 bits)\nconstexpr size_t MAX_VEX_GROUP_TABLE_SIZE = (1 << 7);\n\nextern const std::array<X86InstInfo, MAX_PRIMARY_TABLE_SIZE> BaseOps;\nextern const std::array<X86InstInfo, MAX_SECOND_TABLE_SIZE> SecondBaseOps;\nextern const std::array<X86InstInfo, MAX_REP_MOD_TABLE_SIZE> RepModOps;\nextern const std::array<X86InstInfo, MAX_REPNE_MOD_TABLE_SIZE> RepNEModOps;\nextern const std::array<X86InstInfo, MAX_OPSIZE_MOD_TABLE_SIZE> OpSizeModOps;\n\nextern const std::array<X86InstInfo, MAX_INST_GROUP_TABLE_SIZE> PrimaryInstGroupOps;\nextern const std::array<X86InstInfo, MAX_INST_SECOND_GROUP_TABLE_SIZE> SecondInstGroupOps;\nextern const std::array<X86InstInfo, MAX_SECOND_MODRM_TABLE_SIZE> SecondModRMTableOps;\nextern const std::array<X86InstInfo, MAX_X87_TABLE_SIZE> X87F80Ops;\nextern const std::array<X86InstInfo, MAX_X87_TABLE_SIZE> X87F64Ops;\nextern const std::array<X86InstInfo, MAX_3DNOW_TABLE_SIZE> DDDNowOps;\nextern const std::array<X86InstInfo, MAX_0F_38_TABLE_SIZE> H0F38TableOps;\nextern const std::array<X86InstInfo, MAX_0F_3A_TABLE_SIZE> H0F3ATableOps;\n\n// VEX\nextern const std::array<X86InstInfo, MAX_VEX_TABLE_SIZE> VEXTableOps;\nextern const std::array<X86InstInfo, MAX_VEX_GROUP_TABLE_SIZE> VEXTableGroupOps;\n\nextern const std::array<X86InstInfo, MAX_VEX_TABLE_SIZE> VEXTableOps_AVX128;\nextern const std::array<X86InstInfo, MAX_VEX_GROUP_TABLE_SIZE> VEXTableGroupOps_AVX128;\n\ntemplate<typename OpcodeType>\nstruct X86TablesInfoStruct {\n  OpcodeType first;\n  uint8_t second;\n  X86InstInfo Info;\n};\nusing U8U8InfoStruct = X86TablesInfoStruct<uint8_t>;\nusing U16U8InfoStruct = X86TablesInfoStruct<uint16_t>;\n\ntemplate<typename OpcodeType>\nconstexpr static inline void GenerateTable(X86InstInfo* FinalTable, const X86TablesInfoStruct<OpcodeType>* LocalTable, size_t TableSize) {\n  for (size_t j = 0; j < TableSize; ++j) {\n    const X86TablesInfoStruct<OpcodeType>& Op = LocalTable[j];\n    auto OpNum = Op.first;\n    const X86InstInfo& Info = Op.Info;\n    for (uint32_t i = 0; i < Op.second; ++i) {\n      if (FinalTable[OpNum + i].Type != TYPE_UNKNOWN) {\n        LOGMAN_MSG_A_FMT(\"Duplicate Entry {}->{}\", FinalTable[OpNum + i].Name, Info.Name);\n      }\n      if (FinalTable[OpNum + i].OpcodeDispatcher.OpDispatch) {\n        LOGMAN_MSG_A_FMT(\"Already installed an OpcodeDispatcher for 0x{:x}\", OpNum + i);\n      }\n      FinalTable[OpNum + i] = Info;\n    }\n  }\n};\n\ntemplate<typename OpcodeType>\nconstexpr static inline void GenerateTableWithCopy(X86InstInfo* FinalTable, const X86TablesInfoStruct<OpcodeType>* LocalTable,\n                                                   size_t TableSize, const X86InstInfo* OtherLocal) {\n  for (size_t j = 0; j < TableSize; ++j) {\n    const X86TablesInfoStruct<OpcodeType>& Op = LocalTable[j];\n    auto OpNum = Op.first;\n    const X86InstInfo& Info = Op.Info;\n    for (uint32_t i = 0; i < Op.second; ++i) {\n      if (FinalTable[OpNum + i].Type != TYPE_UNKNOWN) {\n        LOGMAN_MSG_A_FMT(\"Duplicate Entry {}->{}\", FinalTable[OpNum + i].Name, Info.Name);\n      }\n      if (Info.Type == TYPE_COPY_OTHER) {\n        FinalTable[OpNum + i] = OtherLocal[OpNum + i];\n      } else {\n        FinalTable[OpNum + i] = Info;\n      }\n    }\n  }\n};\n\ntemplate<typename OpcodeType>\nconstexpr static inline void GenerateX87Table(X86InstInfo* FinalTable, const X86TablesInfoStruct<OpcodeType>* LocalTable, size_t TableSize) {\n  for (size_t j = 0; j < TableSize; ++j) {\n    const X86TablesInfoStruct<OpcodeType>& Op = LocalTable[j];\n    auto OpNum = Op.first;\n    const X86InstInfo& Info = Op.Info;\n    for (uint32_t i = 0; i < Op.second; ++i) {\n      if (FinalTable[OpNum + i].Type != TYPE_UNKNOWN) {\n        LOGMAN_MSG_A_FMT(\"Duplicate Entry {}->{}\", FinalTable[OpNum + i].Name, Info.Name);\n      }\n      if ((OpNum & 0b11'000'000) == 0b11'000'000) {\n        // If the mod field is 0b11 then it is a regular op\n        FinalTable[OpNum + i] = Info;\n      } else {\n        // If the mod field is !0b11 then this instruction is duplicated through the whole mod [0b00, 0b10] range\n        // and the modrm.rm space because that is used part of the instruction encoding\n        if ((OpNum & 0b11'000'000) != 0) {\n          ERROR_AND_DIE_FMT(\"Only support mod field of zero in this path\");\n        }\n        for (uint16_t mod = 0b00'000'000; mod < 0b11'000'000; mod += 0b01'000'000) {\n          for (uint16_t rm = 0b000; rm < 0b1'000; ++rm) {\n            FinalTable[(OpNum | mod | rm) + i] = Info;\n          }\n        }\n      }\n    }\n  }\n};\n\nFEX_DEFINE_ENUM_FMT_PASSTHROUGH(FEXCore::X86Tables::DecodedOperand::OpType);\n\n} // namespace FEXCore::X86Tables\n"
  },
  {
    "path": "FEXCore/Source/Interface/Core/X86Tables/X87Tables.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: frontend|x86-tables\n$end_info$\n*/\n\n#include \"Interface/Core/X86Tables/X86Tables.h\"\n#include \"Interface/Core/OpcodeDispatcher.h\"\n\n#include <iterator>\n\nnamespace FEXCore::X86Tables {\nusing namespace InstFlags;\nusing namespace IR;\n// Top bit indicating if it needs to be repeated with {0x40, 0x80} or'd in\n// All OPDReg versions need it\n#define OPDReg(op, reg) ((1 << 15) | ((op - 0xD8) << 8) | (reg << 3))\n#define OPD(op, modrmop) (((op - 0xD8) << 8) | modrmop)\nconstexpr std::array<DispatchTableEntry, 140> X87F64OpTable = {{\n  {OPDReg(0xD8, 0) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FADDF64, OpSize::i32Bit, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xD8, 1) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FMULF64, OpSize::i32Bit, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xD8, 2) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::i32Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xD8, 3) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::i32Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xD8, 4) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUBF64, OpSize::i32Bit, false, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xD8, 5) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUBF64, OpSize::i32Bit, false, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xD8, 6) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIVF64, OpSize::i32Bit, false, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xD8, 7) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIVF64, OpSize::i32Bit, false, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPD(0xD8, 0xC0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FADDF64, OpSize::f80Bit, false, OpDispatchBuilder::OpResult::RES_ST0>},\n  {OPD(0xD8, 0xC8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FMULF64, OpSize::f80Bit, false, OpDispatchBuilder::OpResult::RES_ST0>},\n  {OPD(0xD8, 0xD0), 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n  {OPD(0xD8, 0xD8), 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n  {OPD(0xD8, 0xE0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUBF64, OpSize::f80Bit, false, false, OpDispatchBuilder::OpResult::RES_ST0>},\n  {OPD(0xD8, 0xE8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUBF64, OpSize::f80Bit, false, true, OpDispatchBuilder::OpResult::RES_ST0>},\n  {OPD(0xD8, 0xF0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIVF64, OpSize::f80Bit, false, false, OpDispatchBuilder::OpResult::RES_ST0>},\n  {OPD(0xD8, 0xF8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIVF64, OpSize::f80Bit, false, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xD9, 0) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLDF64, OpSize::i32Bit>},\n\n  // 1 = Invalid\n\n  {OPDReg(0xD9, 2) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FST, OpSize::i32Bit>},\n\n  {OPDReg(0xD9, 3) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FST, OpSize::i32Bit>},\n\n  {OPDReg(0xD9, 4) | 0x00, 8, &OpDispatchBuilder::X87LDENVF64},\n\n  {OPDReg(0xD9, 5) | 0x00, 8, &OpDispatchBuilder::X87FLDCWF64},\n\n  {OPDReg(0xD9, 6) | 0x00, 8, &OpDispatchBuilder::X87FNSTENV},\n\n  {OPDReg(0xD9, 7) | 0x00, 8, &OpDispatchBuilder::X87FSTCW},\n\n  {OPD(0xD9, 0xC0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLDFromStack>},\n  {OPD(0xD9, 0xC8), 8, &OpDispatchBuilder::FXCH},\n  {OPD(0xD9, 0xD0), 1, &OpDispatchBuilder::NOPOp}, // FNOP\n  // D1 = Invalid\n  // D8 = Invalid\n  {OPD(0xD9, 0xE0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80STACKCHANGESIGN, false>},\n  {OPD(0xD9, 0xE1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80STACKABS, false>},\n  // E2 = Invalid\n  {OPD(0xD9, 0xE4), 1, &OpDispatchBuilder::FTSTF64},\n  {OPD(0xD9, 0xE5), 1, &OpDispatchBuilder::X87FXAM},\n  // E6 = Invalid\n  {OPD(0xD9, 0xE8), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLDF64_Const, 0x3FF0000000000000>}, // 1.0\n  {OPD(0xD9, 0xE9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLDF64_Const, 0x400A934F0979A372>}, // log2l(10)\n  {OPD(0xD9, 0xEA), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLDF64_Const, 0x3FF71547652B82FE>}, // log2l(e)\n  {OPD(0xD9, 0xEB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLDF64_Const, 0x400921FB54442D18>}, // pi\n  {OPD(0xD9, 0xEC), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLDF64_Const, 0x3FD34413509F79FF>}, // log10l(2)\n  {OPD(0xD9, 0xED), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLDF64_Const, 0x3FE62E42FEFA39EF>}, // log(2)\n  {OPD(0xD9, 0xEE), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLDF64_Const, 0>},                  // 0.0\n\n  // EF = Invalid\n  {OPD(0xD9, 0xF0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80F2XM1STACK, false>},\n  {OPD(0xD9, 0xF1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87FYL2X, false>},\n  {OPD(0xD9, 0xF2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80PTANSTACK, true>},\n  {OPD(0xD9, 0xF3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80ATANSTACK, false>},\n  {OPD(0xD9, 0xF4), 1, &OpDispatchBuilder::X87FXTRACTF64},\n  {OPD(0xD9, 0xF5), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80FPREM1STACK, true>},\n  {OPD(0xD9, 0xF6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87ModifySTP, false>},\n  {OPD(0xD9, 0xF7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87ModifySTP, true>},\n  {OPD(0xD9, 0xF8), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80FPREMSTACK, true>},\n  {OPD(0xD9, 0xF9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87FYL2X, true>},\n  {OPD(0xD9, 0xFA), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80SQRTSTACK, false>},\n  {OPD(0xD9, 0xFB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80SINCOSSTACK, true>},\n  {OPD(0xD9, 0xFC), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80ROUNDSTACK, false>},\n  {OPD(0xD9, 0xFD), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80SCALESTACK, false>},\n  {OPD(0xD9, 0xFE), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80SINSTACK, true>},\n  {OPD(0xD9, 0xFF), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80COSSTACK, true>},\n\n  {OPDReg(0xDA, 0) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FADDF64, OpSize::i32Bit, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDA, 1) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FMULF64, OpSize::i32Bit, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDA, 2) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::i32Bit, true, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xDA, 3) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::i32Bit, true, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xDA, 4) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUBF64, OpSize::i32Bit, true, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDA, 5) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUBF64, OpSize::i32Bit, true, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDA, 6) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIVF64, OpSize::i32Bit, true, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDA, 7) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIVF64, OpSize::i32Bit, true, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPD(0xDA, 0xC0), 8, &OpDispatchBuilder::X87FCMOV},\n  {OPD(0xDA, 0xC8), 8, &OpDispatchBuilder::X87FCMOV},\n  {OPD(0xDA, 0xD0), 8, &OpDispatchBuilder::X87FCMOV},\n  {OPD(0xDA, 0xD8), 8, &OpDispatchBuilder::X87FCMOV},\n  // E0 = Invalid\n  // E8 = Invalid\n  {OPD(0xDA, 0xE9), 1,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, true>},\n  // EA = Invalid\n  // F0 = Invalid\n  // F8 = Invalid\n\n  {OPDReg(0xDB, 0) | 0x00, 8, &OpDispatchBuilder::FILDF64},\n\n  {OPDReg(0xDB, 1) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FISTF64, true>},\n\n  {OPDReg(0xDB, 2) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FISTF64, false>},\n\n  {OPDReg(0xDB, 3) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FISTF64, false>},\n\n  // 4 = Invalid\n\n  {OPDReg(0xDB, 5) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLDF64, OpSize::f80Bit>},\n\n  // 6 = Invalid\n\n  {OPDReg(0xDB, 7) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FST, OpSize::f80Bit>},\n\n\n  {OPD(0xDB, 0xC0), 8, &OpDispatchBuilder::X87FCMOV},\n  {OPD(0xDB, 0xC8), 8, &OpDispatchBuilder::X87FCMOV},\n  {OPD(0xDB, 0xD0), 8, &OpDispatchBuilder::X87FCMOV},\n  {OPD(0xDB, 0xD8), 8, &OpDispatchBuilder::X87FCMOV},\n  // E0 = Invalid\n  {OPD(0xDB, 0xE2), 1, &OpDispatchBuilder::FNCLEX},\n  {OPD(0xDB, 0xE3), 1, &OpDispatchBuilder::FNINIT},\n  // E4 = Invalid\n  {OPD(0xDB, 0xE8), 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_RFLAGS, false>},\n  {OPD(0xDB, 0xF0), 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_RFLAGS, false>},\n\n  // F8 = Invalid\n\n  {OPDReg(0xDC, 0) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FADDF64, OpSize::i64Bit, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDC, 1) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FMULF64, OpSize::i64Bit, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDC, 2) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::i64Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xDC, 3) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::i64Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xDC, 4) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUBF64, OpSize::i64Bit, false, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDC, 5) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUBF64, OpSize::i64Bit, false, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDC, 6) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIVF64, OpSize::i64Bit, false, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDC, 7) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIVF64, OpSize::i64Bit, false, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPD(0xDC, 0xC0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FADDF64, OpSize::f80Bit, false, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDC, 0xC8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FMULF64, OpSize::f80Bit, false, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDC, 0xD0), 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n  {OPD(0xDC, 0xD8), 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n  {OPD(0xDC, 0xE0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUBF64, OpSize::f80Bit, false, true, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDC, 0xE8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUBF64, OpSize::f80Bit, false, false, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDC, 0xF0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIVF64, OpSize::f80Bit, false, true, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDC, 0xF8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIVF64, OpSize::f80Bit, false, false, OpDispatchBuilder::OpResult::RES_STI>},\n\n  {OPDReg(0xDD, 0) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLDF64, OpSize::i64Bit>},\n\n  {OPDReg(0xDD, 1) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FISTF64, true>},\n\n  {OPDReg(0xDD, 2) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FST, OpSize::i64Bit>},\n\n  {OPDReg(0xDD, 3) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FST, OpSize::i64Bit>},\n\n  {OPDReg(0xDD, 4) | 0x00, 8, &OpDispatchBuilder::X87FRSTOR},\n\n  // 5 = Invalid\n  {OPDReg(0xDD, 6) | 0x00, 8, &OpDispatchBuilder::X87FNSAVE},\n\n  {OPDReg(0xDD, 7) | 0x00, 8, &OpDispatchBuilder::X87FNSTSW},\n\n  {OPD(0xDD, 0xC0), 8, &OpDispatchBuilder::X87FFREE},\n  {OPD(0xDD, 0xC8), 8, &OpDispatchBuilder::FXCH},\n  {OPD(0xDD, 0xD0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSTToStack>}, // register-register from regular X87\n  {OPD(0xDD, 0xD8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSTToStack>}, //^\n\n  {OPD(0xDD, 0xE0), 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n  {OPD(0xDD, 0xE8), 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xDE, 0) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FADDF64, OpSize::i16Bit, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDE, 1) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FMULF64, OpSize::i16Bit, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDE, 2) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::i16Bit, true, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xDE, 3) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::i16Bit, true, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xDE, 4) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUBF64, OpSize::i16Bit, true, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDE, 5) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUBF64, OpSize::i16Bit, true, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDE, 6) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIVF64, OpSize::i16Bit, true, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDE, 7) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIVF64, OpSize::i16Bit, true, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPD(0xDE, 0xC0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FADDF64, OpSize::f80Bit, false, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDE, 0xC8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FMULF64, OpSize::f80Bit, false, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDE, 0xD0), 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n  {OPD(0xDE, 0xD9), 1,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, true>},\n  {OPD(0xDE, 0xE0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUBF64, OpSize::f80Bit, false, true, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDE, 0xE8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUBF64, OpSize::f80Bit, false, false, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDE, 0xF0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIVF64, OpSize::f80Bit, false, true, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDE, 0xF8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIVF64, OpSize::f80Bit, false, false, OpDispatchBuilder::OpResult::RES_STI>},\n\n  {OPDReg(0xDF, 0) | 0x00, 8, &OpDispatchBuilder::FILDF64},\n\n  {OPDReg(0xDF, 1) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FISTF64, true>},\n\n  {OPDReg(0xDF, 2) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FISTF64, false>},\n\n  {OPDReg(0xDF, 3) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FISTF64, false>},\n\n  {OPDReg(0xDF, 4) | 0x00, 8, &OpDispatchBuilder::FBLDF64},\n\n  {OPDReg(0xDF, 5) | 0x00, 8, &OpDispatchBuilder::FILDF64},\n\n  {OPDReg(0xDF, 6) | 0x00, 8, &OpDispatchBuilder::FBSTPF64},\n\n  {OPDReg(0xDF, 7) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FISTF64, false>},\n\n  // XXX: This should also set the x87 tag bits to empty\n  // We don't support this currently, so just pop the stack\n  {OPD(0xDF, 0xC0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87ModifySTP, true>},\n  {OPD(0xDF, 0xC8), 8, &OpDispatchBuilder::FXCH},\n  {OPD(0xDF, 0xD0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSTToStack>},\n  {OPD(0xDF, 0xD8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSTToStack>},\n\n  {OPD(0xDF, 0xE0), 8, &OpDispatchBuilder::X87FNSTSW},\n  {OPD(0xDF, 0xE8), 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_RFLAGS, false>},\n  {OPD(0xDF, 0xF0), 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMIF64, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_RFLAGS, false>},\n}};\n\nconstexpr std::array<DispatchTableEntry, 140> X87F80OpTable = {{\n  {OPDReg(0xD8, 0) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FADD, OpSize::i32Bit, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xD8, 1) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FMUL, OpSize::i32Bit, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xD8, 2) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::i32Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xD8, 3) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::i32Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xD8, 4) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUB, OpSize::i32Bit, false, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xD8, 5) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUB, OpSize::i32Bit, false, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xD8, 6) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIV, OpSize::i32Bit, false, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xD8, 7) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIV, OpSize::i32Bit, false, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPD(0xD8, 0xC0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FADD, OpSize::f80Bit, false, OpDispatchBuilder::OpResult::RES_ST0>},\n  {OPD(0xD8, 0xC8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FMUL, OpSize::f80Bit, false, OpDispatchBuilder::OpResult::RES_ST0>},\n  {OPD(0xD8, 0xD0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n  {OPD(0xD8, 0xD8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n  {OPD(0xD8, 0xE0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUB, OpSize::f80Bit, false, false, OpDispatchBuilder::OpResult::RES_ST0>},\n  {OPD(0xD8, 0xE8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUB, OpSize::f80Bit, false, true, OpDispatchBuilder::OpResult::RES_ST0>},\n  {OPD(0xD8, 0xF0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIV, OpSize::f80Bit, false, false, OpDispatchBuilder::OpResult::RES_ST0>},\n  {OPD(0xD8, 0xF8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIV, OpSize::f80Bit, false, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xD9, 0) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLD, OpSize::i32Bit>},\n\n  // 1 = Invalid\n\n  {OPDReg(0xD9, 2) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FST, OpSize::i32Bit>},\n\n  {OPDReg(0xD9, 3) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FST, OpSize::i32Bit>},\n\n  {OPDReg(0xD9, 4) | 0x00, 8, &OpDispatchBuilder::X87LDENV},\n\n  {OPDReg(0xD9, 5) | 0x00, 8, &OpDispatchBuilder::X87FLDCW}, // XXX: stubbed FLDCW\n\n  {OPDReg(0xD9, 6) | 0x00, 8, &OpDispatchBuilder::X87FNSTENV},\n\n  {OPDReg(0xD9, 7) | 0x00, 8, &OpDispatchBuilder::X87FSTCW},\n\n  {OPD(0xD9, 0xC0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLDFromStack>},\n  {OPD(0xD9, 0xC8), 8, &OpDispatchBuilder::FXCH},\n  {OPD(0xD9, 0xD0), 1, &OpDispatchBuilder::NOPOp}, // FNOP\n  // D1 = Invalid\n  // D8 = Invalid\n  {OPD(0xD9, 0xE0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80STACKCHANGESIGN, false>},\n  {OPD(0xD9, 0xE1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80STACKABS, false>},\n  // E2 = Invalid\n  {OPD(0xD9, 0xE4), 1, &OpDispatchBuilder::FTST},\n  {OPD(0xD9, 0xE5), 1, &OpDispatchBuilder::X87FXAM},\n  // E6 = Invalid\n  {OPD(0xD9, 0xE8), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLD_Const, NamedVectorConstant::NAMED_VECTOR_X87_ONE>},     // 1.0\n  {OPD(0xD9, 0xE9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLD_Const, NamedVectorConstant::NAMED_VECTOR_X87_LOG2_10>}, // log2l(10)\n  {OPD(0xD9, 0xEA), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLD_Const, NamedVectorConstant::NAMED_VECTOR_X87_LOG2_E>}, // log2l(e)\n  {OPD(0xD9, 0xEB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLD_Const, NamedVectorConstant::NAMED_VECTOR_X87_PI>},     // pi\n  {OPD(0xD9, 0xEC), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLD_Const, NamedVectorConstant::NAMED_VECTOR_X87_LOG10_2>}, // log10l(2)\n  {OPD(0xD9, 0xED), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLD_Const, NamedVectorConstant::NAMED_VECTOR_X87_LOG_2>},   // log(2)\n  {OPD(0xD9, 0xEE), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLD_Const, NamedVectorConstant::NAMED_VECTOR_ZERO>},        // 0.0\n\n  // EF = Invalid\n  {OPD(0xD9, 0xF0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80F2XM1STACK, false>},\n  {OPD(0xD9, 0xF1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87FYL2X, false>},\n  {OPD(0xD9, 0xF2), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80PTANSTACK, true>},\n  {OPD(0xD9, 0xF3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80ATANSTACK, false>},\n  {OPD(0xD9, 0xF4), 1, &OpDispatchBuilder::X87FXTRACT},\n  {OPD(0xD9, 0xF5), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80FPREM1STACK, true>},\n  {OPD(0xD9, 0xF6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87ModifySTP, false>},\n  {OPD(0xD9, 0xF7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87ModifySTP, true>},\n  {OPD(0xD9, 0xF8), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80FPREMSTACK, true>},\n  {OPD(0xD9, 0xF9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87FYL2X, true>},\n  {OPD(0xD9, 0xFA), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80SQRTSTACK, false>},\n  {OPD(0xD9, 0xFB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80SINCOSSTACK, true>},\n  {OPD(0xD9, 0xFC), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80ROUNDSTACK, false>},\n  {OPD(0xD9, 0xFD), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80SCALESTACK, false>},\n  {OPD(0xD9, 0xFE), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80SINSTACK, true>},\n  {OPD(0xD9, 0xFF), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87OpHelper, OP_F80COSSTACK, true>},\n\n  {OPDReg(0xDA, 0) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FADD, OpSize::i32Bit, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDA, 1) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FMUL, OpSize::i32Bit, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDA, 2) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::i32Bit, true, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xDA, 3) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::i32Bit, true, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xDA, 4) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUB, OpSize::i32Bit, true, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDA, 5) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUB, OpSize::i32Bit, true, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDA, 6) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIV, OpSize::i32Bit, true, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDA, 7) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIV, OpSize::i32Bit, true, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPD(0xDA, 0xC0), 8, &OpDispatchBuilder::X87FCMOV},\n  {OPD(0xDA, 0xC8), 8, &OpDispatchBuilder::X87FCMOV},\n  {OPD(0xDA, 0xD0), 8, &OpDispatchBuilder::X87FCMOV},\n  {OPD(0xDA, 0xD8), 8, &OpDispatchBuilder::X87FCMOV},\n  // E0 = Invalid\n  // E8 = Invalid\n  {OPD(0xDA, 0xE9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, true>},\n  // EA = Invalid\n  // F0 = Invalid\n  // F8 = Invalid\n\n  {OPDReg(0xDB, 0) | 0x00, 8, &OpDispatchBuilder::FILD},\n\n  {OPDReg(0xDB, 1) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FIST, true>},\n\n  {OPDReg(0xDB, 2) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FIST, false>},\n\n  {OPDReg(0xDB, 3) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FIST, false>},\n\n  // 4 = Invalid\n\n  {OPDReg(0xDB, 5) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLD, OpSize::f80Bit>},\n\n  // 6 = Invalid\n\n  {OPDReg(0xDB, 7) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FST, OpSize::f80Bit>},\n\n\n  {OPD(0xDB, 0xC0), 8, &OpDispatchBuilder::X87FCMOV},\n  {OPD(0xDB, 0xC8), 8, &OpDispatchBuilder::X87FCMOV},\n  {OPD(0xDB, 0xD0), 8, &OpDispatchBuilder::X87FCMOV},\n  {OPD(0xDB, 0xD8), 8, &OpDispatchBuilder::X87FCMOV},\n  // E0 = Invalid\n  {OPD(0xDB, 0xE2), 1, &OpDispatchBuilder::FNCLEX},\n  {OPD(0xDB, 0xE3), 1, &OpDispatchBuilder::FNINIT},\n  // E4 = Invalid\n  {OPD(0xDB, 0xE8), 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_RFLAGS, false>},\n  {OPD(0xDB, 0xF0), 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_RFLAGS, false>},\n\n  // F8 = Invalid\n\n  {OPDReg(0xDC, 0) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FADD, OpSize::i64Bit, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDC, 1) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FMUL, OpSize::i64Bit, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDC, 2) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::i64Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xDC, 3) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::i64Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xDC, 4) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUB, OpSize::i64Bit, false, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDC, 5) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUB, OpSize::i64Bit, false, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDC, 6) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIV, OpSize::i64Bit, false, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDC, 7) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIV, OpSize::i64Bit, false, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPD(0xDC, 0xC0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FADD, OpSize::f80Bit, false, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDC, 0xC8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FMUL, OpSize::f80Bit, false, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDC, 0xD0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n  {OPD(0xDC, 0xD8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n  {OPD(0xDC, 0xE0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUB, OpSize::f80Bit, false, true, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDC, 0xE8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUB, OpSize::f80Bit, false, false, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDC, 0xF0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIV, OpSize::f80Bit, false, true, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDC, 0xF8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIV, OpSize::f80Bit, false, false, OpDispatchBuilder::OpResult::RES_STI>},\n\n  {OPDReg(0xDD, 0) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FLD, OpSize::i64Bit>},\n\n  {OPDReg(0xDD, 1) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FIST, true>},\n\n  {OPDReg(0xDD, 2) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FST, OpSize::i64Bit>},\n\n  {OPDReg(0xDD, 3) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FST, OpSize::i64Bit>},\n\n  {OPDReg(0xDD, 4) | 0x00, 8, &OpDispatchBuilder::X87FRSTOR},\n\n  // 5 = Invalid\n  {OPDReg(0xDD, 6) | 0x00, 8, &OpDispatchBuilder::X87FNSAVE},\n\n  {OPDReg(0xDD, 7) | 0x00, 8, &OpDispatchBuilder::X87FNSTSW},\n\n  {OPD(0xDD, 0xC0), 8, &OpDispatchBuilder::X87FFREE},\n  {OPD(0xDD, 0xC8), 8, &OpDispatchBuilder::FXCH},\n  {OPD(0xDD, 0xD0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSTToStack>},\n  {OPD(0xDD, 0xD8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSTToStack>},\n\n  {OPD(0xDD, 0xE0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n  {OPD(0xDD, 0xE8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xDE, 0) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FADD, OpSize::i16Bit, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDE, 1) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FMUL, OpSize::i16Bit, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDE, 2) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::i16Bit, true, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xDE, 3) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::i16Bit, true, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n\n  {OPDReg(0xDE, 4) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUB, OpSize::i16Bit, true, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDE, 5) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUB, OpSize::i16Bit, true, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDE, 6) | 0x00, 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIV, OpSize::i16Bit, true, false, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPDReg(0xDE, 7) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIV, OpSize::i16Bit, true, true, OpDispatchBuilder::OpResult::RES_ST0>},\n\n  {OPD(0xDE, 0xC0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FADD, OpSize::f80Bit, false, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDE, 0xC8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FMUL, OpSize::f80Bit, false, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDE, 0xD0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, false>},\n  {OPD(0xDE, 0xD9), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_X87, true>},\n  {OPD(0xDE, 0xE0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUB, OpSize::f80Bit, false, true, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDE, 0xE8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSUB, OpSize::f80Bit, false, false, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDE, 0xF0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIV, OpSize::f80Bit, false, true, OpDispatchBuilder::OpResult::RES_STI>},\n  {OPD(0xDE, 0xF8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FDIV, OpSize::f80Bit, false, false, OpDispatchBuilder::OpResult::RES_STI>},\n\n  {OPDReg(0xDF, 0) | 0x00, 8, &OpDispatchBuilder::FILD},\n\n  {OPDReg(0xDF, 1) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FIST, true>},\n\n  {OPDReg(0xDF, 2) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FIST, false>},\n\n  {OPDReg(0xDF, 3) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FIST, false>},\n\n  {OPDReg(0xDF, 4) | 0x00, 8, &OpDispatchBuilder::FBLD},\n\n  {OPDReg(0xDF, 5) | 0x00, 8, &OpDispatchBuilder::FILD},\n\n  {OPDReg(0xDF, 6) | 0x00, 8, &OpDispatchBuilder::FBSTP},\n\n  {OPDReg(0xDF, 7) | 0x00, 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FIST, false>},\n\n  // XXX: This should also set the x87 tag bits to empty\n  // We don't support this currently, so just pop the stack\n  {OPD(0xDF, 0xC0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::X87ModifySTP, true>},\n  {OPD(0xDF, 0xC8), 8, &OpDispatchBuilder::FXCH},\n  {OPD(0xDF, 0xD0), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSTToStack>},\n  {OPD(0xDF, 0xD8), 8, &OpDispatchBuilder::Bind<&OpDispatchBuilder::FSTToStack>},\n\n  {OPD(0xDF, 0xE0), 8, &OpDispatchBuilder::X87FNSTSW},\n  {OPD(0xDF, 0xE8), 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_RFLAGS, false>},\n  {OPD(0xDF, 0xF0), 8,\n   &OpDispatchBuilder::Bind<&OpDispatchBuilder::FCOMI, OpSize::f80Bit, false, OpDispatchBuilder::FCOMIFlags::FLAGS_RFLAGS, false>},\n}};\n#undef OPD\n#undef OPDReg\n\nauto GenerateX87TableLambda = [](const auto DispatchTable) consteval {\n#define OPD(op, modrmop) (((op - 0xD8) << 8) | modrmop)\n#define OPDReg(op, reg) (((op - 0xD8) << 8) | (reg << 3))\n std::array<X86InstInfo, MAX_X87_TABLE_SIZE> Table{};\n  constexpr U16U8InfoStruct X87OpTable[] = {\n    // 0xD8\n    {OPDReg(0xD8, 0), 1, X86InstInfo{\"FADD\",  TYPE_X87, FLAGS_MODRM, 0}},\n    {OPDReg(0xD8, 1), 1, X86InstInfo{\"FMUL\",  TYPE_X87, FLAGS_MODRM, 0}},\n    {OPDReg(0xD8, 2), 1, X86InstInfo{\"FCOM\",  TYPE_X87, FLAGS_MODRM, 0}},\n    {OPDReg(0xD8, 3), 1, X86InstInfo{\"FCOMP\", TYPE_X87, FLAGS_MODRM | FLAGS_POP, 0}},\n    {OPDReg(0xD8, 4), 1, X86InstInfo{\"FSUB\",  TYPE_X87, FLAGS_MODRM, 0}},\n    {OPDReg(0xD8, 5), 1, X86InstInfo{\"FSUBR\", TYPE_X87, FLAGS_MODRM, 0}},\n    {OPDReg(0xD8, 6), 1, X86InstInfo{\"FDIV\",  TYPE_X87, FLAGS_MODRM, 0}},\n    {OPDReg(0xD8, 7), 1, X86InstInfo{\"FDIVR\", TYPE_X87, FLAGS_MODRM, 0}},\n      //  / 0\n      {OPD(0xD8, 0xC0), 8, X86InstInfo{\"FADD\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 1\n      {OPD(0xD8, 0xC8), 8, X86InstInfo{\"FMUL\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 2\n      {OPD(0xD8, 0xD0), 8, X86InstInfo{\"FCOM\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 3\n      {OPD(0xD8, 0xD8), 8, X86InstInfo{\"FCOMP\", TYPE_X87, FLAGS_POP, 0}},\n      //  / 4\n      {OPD(0xD8, 0xE0), 8, X86InstInfo{\"FSUB\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 5\n      {OPD(0xD8, 0xE8), 8, X86InstInfo{\"FSUBR\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 6\n      {OPD(0xD8, 0xF0), 8, X86InstInfo{\"FDIV\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 7\n      {OPD(0xD8, 0xF8), 8, X86InstInfo{\"FDIVR\", TYPE_X87, FLAGS_NONE, 0}},\n    // 0xD9\n    {OPDReg(0xD9, 0), 1, X86InstInfo{\"FLD\",     TYPE_INST, FLAGS_MODRM, 0}},\n    {OPDReg(0xD9, 1), 1, X86InstInfo{\"\",        TYPE_INVALID, FLAGS_NONE, 0}},\n    {OPDReg(0xD9, 2), 1, X86InstInfo{\"FST\",     TYPE_X87, FLAGS_MODRM | FLAGS_SF_MOD_DST, 0}},\n    {OPDReg(0xD9, 3), 1, X86InstInfo{\"FSTP\",    TYPE_X87, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_POP, 0}},\n    {OPDReg(0xD9, 4), 1, X86InstInfo{\"FLDENV\",  TYPE_X87, FLAGS_MODRM, 0}},\n    {OPDReg(0xD9, 5), 1, X86InstInfo{\"FLDCW\",   TYPE_X87, GenFlagsSameSize(SIZE_16BIT) | FLAGS_MODRM, 0}},\n    {OPDReg(0xD9, 6), 1, X86InstInfo{\"FNSTENV\", TYPE_X87, FLAGS_MODRM | FLAGS_SF_MOD_DST, 0}},\n    {OPDReg(0xD9, 7), 1, X86InstInfo{\"FNSTCW\",  TYPE_INST, GenFlagsSameSize(SIZE_16BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST, 0}},\n      //  / 0\n      {OPD(0xD9, 0xC0), 8, X86InstInfo{\"FLD\",   TYPE_INST, FLAGS_NONE, 0}},\n      //  / 1\n      {OPD(0xD9, 0xC8), 8, X86InstInfo{\"FXCH\",  TYPE_X87, FLAGS_NONE, 0}},\n      //  / 2\n      {OPD(0xD9, 0xD0), 1, X86InstInfo{\"FNOP\",  TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xD1), 7, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE, 0}},\n      //  / 3\n      {OPD(0xD9, 0xD8), 8, X86InstInfo{\"\",      TYPE_INVALID, FLAGS_NONE, 0}},\n      //  / 4\n      {OPD(0xD9, 0xE0), 1, X86InstInfo{\"FCHS\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xE1), 1, X86InstInfo{\"FABS\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xE2), 2, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xE4), 1, X86InstInfo{\"FTST\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xE5), 1, X86InstInfo{\"FXAM\", TYPE_INST,  FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xE6), 2, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n      //  / 5\n      {OPD(0xD9, 0xE8), 1, X86InstInfo{\"FLD1\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xE9), 1, X86InstInfo{\"FLDL2T\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xEA), 1, X86InstInfo{\"FLDL2E\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xEB), 1, X86InstInfo{\"FLDPI\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xEC), 1, X86InstInfo{\"FLDLG2\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xED), 1, X86InstInfo{\"FLDLN2\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xEE), 1, X86InstInfo{\"FLDZ\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xEF), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n      //  / 6\n      {OPD(0xD9, 0xF0), 1, X86InstInfo{\"F2XM1\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xF1), 1, X86InstInfo{\"FYL2X\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xF2), 1, X86InstInfo{\"FPTAN\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xF3), 1, X86InstInfo{\"FPATAN\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xF4), 1, X86InstInfo{\"FXTRACT\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xF5), 1, X86InstInfo{\"FPREM1\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xF6), 1, X86InstInfo{\"FDECSTP\", TYPE_X87, FLAGS_POP, 0}},\n      {OPD(0xD9, 0xF7), 1, X86InstInfo{\"FINCSTP\", TYPE_X87, FLAGS_POP, 0}},\n      //  / 7\n      {OPD(0xD9, 0xF8), 1, X86InstInfo{\"FPREM\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xF9), 1, X86InstInfo{\"FYL2XP1\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xFA), 1, X86InstInfo{\"FSQRT\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xFB), 1, X86InstInfo{\"FSINCOS\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xFC), 1, X86InstInfo{\"FRNDINT\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xFD), 1, X86InstInfo{\"FSCALE\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xFE), 1, X86InstInfo{\"FSIN\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xD9, 0xFF), 1, X86InstInfo{\"FCOS\", TYPE_X87, FLAGS_NONE, 0}},\n    // 0xDA\n    {OPDReg(0xDA, 0), 1, X86InstInfo{\"FIADD\", TYPE_X87,  GenFlagsSrcSize(SIZE_32BIT) | FLAGS_MODRM, 0}},\n    {OPDReg(0xDA, 1), 1, X86InstInfo{\"FIMUL\", TYPE_X87,  GenFlagsSrcSize(SIZE_32BIT) | FLAGS_MODRM, 0}},\n    {OPDReg(0xDA, 2), 1, X86InstInfo{\"FICOM\", TYPE_X87,  GenFlagsSrcSize(SIZE_32BIT) | FLAGS_MODRM, 0}},\n    {OPDReg(0xDA, 3), 1, X86InstInfo{\"FICOMP\", TYPE_X87, GenFlagsSrcSize(SIZE_32BIT) | FLAGS_MODRM | FLAGS_POP, 0}},\n    {OPDReg(0xDA, 4), 1, X86InstInfo{\"FISUB\", TYPE_X87,  GenFlagsSrcSize(SIZE_32BIT) | FLAGS_MODRM, 0}},\n    {OPDReg(0xDA, 5), 1, X86InstInfo{\"FISUBR\", TYPE_X87, GenFlagsSrcSize(SIZE_32BIT) | FLAGS_MODRM, 0}},\n    {OPDReg(0xDA, 6), 1, X86InstInfo{\"FIDIV\", TYPE_X87,  GenFlagsSrcSize(SIZE_32BIT) | FLAGS_MODRM, 0}},\n    {OPDReg(0xDA, 7), 1, X86InstInfo{\"FIDIVR\", TYPE_X87, GenFlagsSrcSize(SIZE_32BIT) | FLAGS_MODRM, 0}},\n      //  / 0\n      {OPD(0xDA, 0xC0), 8, X86InstInfo{\"FCMOVB\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 1\n      {OPD(0xDA, 0xC8), 8, X86InstInfo{\"FCMOVE\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 2\n      {OPD(0xDA, 0xD0), 8, X86InstInfo{\"FCMOVBE\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 3\n      {OPD(0xDA, 0xD8), 8, X86InstInfo{\"FCMOVU\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 4\n      {OPD(0xDA, 0xE0), 8, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n      //  / 5\n      {OPD(0xDA, 0xE8), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n      {OPD(0xDA, 0xE9), 1, X86InstInfo{\"FUCOMPP\", TYPE_X87, FLAGS_POP, 0}},\n      {OPD(0xDA, 0xEA), 6, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n      //  / 6\n      {OPD(0xDA, 0xF0), 8, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n      //  / 7\n      {OPD(0xDA, 0xF8), 8, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n    // 0xDB\n    {OPDReg(0xDB, 0), 1, X86InstInfo{\"FILD\",   TYPE_X87, GenFlagsSrcSize(SIZE_32BIT) | FLAGS_MODRM, 0}},\n    {OPDReg(0xDB, 1), 1, X86InstInfo{\"FISTTP\", TYPE_X87, GenFlagsSrcSize(SIZE_32BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_POP, 0}},\n    {OPDReg(0xDB, 2), 1, X86InstInfo{\"FIST\",   TYPE_X87, GenFlagsSrcSize(SIZE_32BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST, 0}},\n    {OPDReg(0xDB, 3), 1, X86InstInfo{\"FISTP\",  TYPE_X87, GenFlagsSrcSize(SIZE_32BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_POP, 0}},\n    {OPDReg(0xDB, 4), 1, X86InstInfo{\"\",       TYPE_INVALID, FLAGS_NONE, 0}},\n    {OPDReg(0xDB, 5), 1, X86InstInfo{\"FLD\",    TYPE_X87,    FLAGS_MODRM, 0}},\n    {OPDReg(0xDB, 6), 1, X86InstInfo{\"\",       TYPE_INVALID, FLAGS_NONE, 0}},\n    {OPDReg(0xDB, 7), 1, X86InstInfo{\"FSTP\",   TYPE_X87,   FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_POP, 0}},\n      //  / 0\n      {OPD(0xDB, 0xC0), 8, X86InstInfo{\"FCMOVNB\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 1\n      {OPD(0xDB, 0xC8), 8, X86InstInfo{\"FCMOVNE\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 2\n      {OPD(0xDB, 0xD0), 8, X86InstInfo{\"FCMOVNBE\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 3\n      {OPD(0xDB, 0xD8), 8, X86InstInfo{\"FCMOVNU\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 4\n      {OPD(0xDB, 0xE0), 2, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n      {OPD(0xDB, 0xE2), 1, X86InstInfo{\"FNCLEX\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xDB, 0xE3), 1, X86InstInfo{\"FNINIT\", TYPE_X87, FLAGS_NONE, 0}},\n      {OPD(0xDB, 0xE4), 4, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n      //  / 5\n      {OPD(0xDB, 0xE8), 8, X86InstInfo{\"FUCOMI\", TYPE_INST, FLAGS_NONE, 0}},\n      //  / 6\n      {OPD(0xDB, 0xF0), 8, X86InstInfo{\"FCOMI\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 7\n      {OPD(0xDB, 0xF8), 8, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n    // 0xDC\n    {OPDReg(0xDC, 0), 1, X86InstInfo{\"FADD\", TYPE_X87, GenFlagsSrcSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_X87_FLAGS, 0}},\n    {OPDReg(0xDC, 1), 1, X86InstInfo{\"FMUL\", TYPE_X87, GenFlagsSrcSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_X87_FLAGS, 0}},\n    {OPDReg(0xDC, 2), 1, X86InstInfo{\"FCOM\", TYPE_X87, GenFlagsSrcSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_X87_FLAGS, 0}},\n    {OPDReg(0xDC, 3), 1, X86InstInfo{\"FCOMP\", TYPE_X87, GenFlagsSrcSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_X87_FLAGS | FLAGS_POP, 0}},\n    {OPDReg(0xDC, 4), 1, X86InstInfo{\"FSUB\", TYPE_X87, GenFlagsSrcSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_X87_FLAGS, 0}},\n    {OPDReg(0xDC, 5), 1, X86InstInfo{\"FSUBR\", TYPE_X87, GenFlagsSrcSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_X87_FLAGS, 0}},\n    {OPDReg(0xDC, 6), 1, X86InstInfo{\"FDIV\", TYPE_X87, GenFlagsSrcSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_X87_FLAGS, 0}},\n    {OPDReg(0xDC, 7), 1, X86InstInfo{\"FDIVR\", TYPE_X87, GenFlagsSrcSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_X87_FLAGS, 0}},\n      //  / 0\n      {OPD(0xDC, 0xC0), 8, X86InstInfo{\"FADD\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 1\n      {OPD(0xDC, 0xC8), 8, X86InstInfo{\"FMUL\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 2\n      {OPD(0xDC, 0xD0), 8, X86InstInfo{\"FCOM\", TYPE_X87, FLAGS_X87_FLAGS, 0}},\n      //  / 3\n      {OPD(0xDC, 0xD8), 8, X86InstInfo{\"FCOMP\", TYPE_X87, FLAGS_X87_FLAGS | FLAGS_POP, 0}},\n      //  / 4\n      {OPD(0xDC, 0xE0), 8, X86InstInfo{\"FSUBR\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 5\n      {OPD(0xDC, 0xE8), 8, X86InstInfo{\"FSUB\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 6\n      {OPD(0xDC, 0xF0), 8, X86InstInfo{\"FDIVR\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 7\n      {OPD(0xDC, 0xF8), 8, X86InstInfo{\"FDIV\", TYPE_X87, FLAGS_NONE, 0}},\n    // 0xDD\n    {OPDReg(0xDD, 0), 1, X86InstInfo{\"FLD\", TYPE_X87, FLAGS_MODRM, 0}},\n    {OPDReg(0xDD, 1), 1, X86InstInfo{\"FISTTP\", TYPE_X87, GenFlagsSrcSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_X87_FLAGS | FLAGS_SF_MOD_DST | FLAGS_POP, 0}},\n    {OPDReg(0xDD, 2), 1, X86InstInfo{\"FST\", TYPE_X87, FLAGS_MODRM | FLAGS_SF_MOD_DST, 0}},\n    {OPDReg(0xDD, 3), 1, X86InstInfo{\"FSTP\", TYPE_X87, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_POP, 0}},\n    {OPDReg(0xDD, 4), 1, X86InstInfo{\"FRSTOR\", TYPE_X87, FLAGS_MODRM, 0}},\n    {OPDReg(0xDD, 5), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n    {OPDReg(0xDD, 6), 1, X86InstInfo{\"FNSAVE\", TYPE_X87, FLAGS_MODRM | FLAGS_SF_MOD_DST, 0}},\n    {OPDReg(0xDD, 7), 1, X86InstInfo{\"FNSTSW\", TYPE_X87, GenFlagsSameSize(SIZE_16BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST, 0}},\n      //  / 0\n      {OPD(0xDD, 0xC0), 8, X86InstInfo{\"FFREE\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 1\n      {OPD(0xDD, 0xC8), 8, X86InstInfo{\"FXCH\",  TYPE_X87, FLAGS_NONE, 0}},\n      //  / 2\n      {OPD(0xDD, 0xD0), 8, X86InstInfo{\"FST\", TYPE_INST, FLAGS_SF_MOD_DST, 0}},\n      //  / 3\n      {OPD(0xDD, 0xD8), 8, X86InstInfo{\"FSTP\", TYPE_X87, FLAGS_SF_MOD_DST | FLAGS_POP, 0}},\n      //  / 4\n      {OPD(0xDD, 0xE0), 8, X86InstInfo{\"FUCOM\", TYPE_X87, FLAGS_NONE, 0}},\n      //  / 5\n      {OPD(0xDD, 0xE8), 8, X86InstInfo{\"FUCOMP\", TYPE_X87, FLAGS_POP, 0}},\n      //  / 6\n      {OPD(0xDD, 0xF0), 8, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n      //  / 7\n      {OPD(0xDD, 0xF8), 8, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n    // 0xDE\n    {OPDReg(0xDE, 0), 1, X86InstInfo{\"FIADD\", TYPE_X87,  GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM, 0}},\n    {OPDReg(0xDE, 1), 1, X86InstInfo{\"FIMUL\", TYPE_X87,  GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM, 0}},\n    {OPDReg(0xDE, 2), 1, X86InstInfo{\"FICOM\", TYPE_X87,  GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM, 0}},\n    {OPDReg(0xDE, 3), 1, X86InstInfo{\"FICOMP\", TYPE_X87, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM | FLAGS_POP, 0}},\n    {OPDReg(0xDE, 4), 1, X86InstInfo{\"FISUB\", TYPE_X87,  GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM, 0}},\n    {OPDReg(0xDE, 5), 1, X86InstInfo{\"FISUBR\", TYPE_X87, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM, 0}},\n    {OPDReg(0xDE, 6), 1, X86InstInfo{\"FIDIV\", TYPE_X87,  GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM, 0}},\n    {OPDReg(0xDE, 7), 1, X86InstInfo{\"FIDIVR\", TYPE_X87, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM, 0}},\n      //  / 0\n      {OPD(0xDE, 0xC0), 8, X86InstInfo{\"FADDP\", TYPE_X87, FLAGS_POP, 0}},\n      //  / 1\n      {OPD(0xDE, 0xC8), 8, X86InstInfo{\"FMULP\", TYPE_X87, FLAGS_POP, 0}},\n      //  / 2\n      {OPD(0xDE, 0xD0), 8, X86InstInfo{\"FCOMP\", TYPE_X87, FLAGS_X87_FLAGS | FLAGS_POP, 0}},\n      //  / 3\n      {OPD(0xDE, 0xD8), 1, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n      {OPD(0xDE, 0xD9), 1, X86InstInfo{\"FCOMPP\", TYPE_X87, FLAGS_POP, 0}},\n      {OPD(0xDE, 0xDA), 6, X86InstInfo{\"\", TYPE_INVALID, FLAGS_NONE, 0}},\n      //  / 4\n      {OPD(0xDE, 0xE0), 8, X86InstInfo{\"FSUBRP\", TYPE_X87, FLAGS_POP, 0}},\n      //  / 5\n      {OPD(0xDE, 0xE8), 8, X86InstInfo{\"FSUBP\", TYPE_X87, FLAGS_POP, 0}},\n      //  / 6\n      {OPD(0xDE, 0xF0), 8, X86InstInfo{\"FDIVRP\", TYPE_X87, FLAGS_POP, 0}},\n      //  / 7\n      {OPD(0xDE, 0xF8), 8, X86InstInfo{\"FDIVP\", TYPE_X87, FLAGS_POP, 0}},\n    // 0xDF\n    {OPDReg(0xDF, 0), 1, X86InstInfo{\"FILD\", TYPE_X87, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM, 0}},\n    {OPDReg(0xDF, 1), 1, X86InstInfo{\"FISTTP\", TYPE_X87, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_POP, 0}},\n    {OPDReg(0xDF, 2), 1, X86InstInfo{\"FIST\",   TYPE_X87, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST, 0}},\n    {OPDReg(0xDF, 3), 1, X86InstInfo{\"FISTP\",  TYPE_X87, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_POP, 0}},\n    {OPDReg(0xDF, 4), 1, X86InstInfo{\"FBLD\", TYPE_X87, FLAGS_MODRM, 0}},\n    {OPDReg(0xDF, 5), 1, X86InstInfo{\"FILD\", TYPE_X87, GenFlagsSrcSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_X87_FLAGS, 0}},\n    {OPDReg(0xDF, 6), 1, X86InstInfo{\"FBSTP\", TYPE_X87, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_POP, 0}},\n    {OPDReg(0xDF, 7), 1, X86InstInfo{\"FISTP\", TYPE_X87, GenFlagsSrcSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_X87_FLAGS | FLAGS_SF_MOD_DST | FLAGS_POP, 0}},\n      //  / 0\n      //  This instruction is a bit special. This is an undocumented(Almost) x87 instruction.\n      //  https://en.wikipedia.org/wiki/X86_instruction_listings#Undocumented_x87_instructions\n      //  https://www.pagetable.com/?p=16\n      //  AMD Athlon Processor x86 Code Optimization Guide - `Use FFREEP Macro to Pop One Register from the FPU Stack`\n      //  ISA architecture manuals don't talk about this instruction at all\n      //  At some point the Nvidia OpenGL binary driver uses this instruction.\n      //  GCC may also end up emitting this instruction in some rare edge case!\n      //  Almost all x86 CPUs implement this, and it is expected to be around\n      {OPD(0xDF, 0xC0), 8, X86InstInfo{\"FFREEP\",  TYPE_X87, FLAGS_POP, 0}},\n      //  / 1\n      {OPD(0xDF, 0xC8), 8, X86InstInfo{\"FXCH\",    TYPE_X87, FLAGS_NONE, 0}},\n      //  / 2\n      {OPD(0xDF, 0xD0), 8, X86InstInfo{\"FSTP\",    TYPE_X87, FLAGS_SF_MOD_DST | FLAGS_POP, 0}},\n      //  / 3\n      {OPD(0xDF, 0xD8), 8, X86InstInfo{\"FSTP\",    TYPE_X87, FLAGS_SF_MOD_DST | FLAGS_POP, 0}},\n      //  / 4\n      {OPD(0xDF, 0xE0), 1, X86InstInfo{\"FNSTSW\",  TYPE_INST, GenFlagsSameSize(SIZE_16BIT) | FLAGS_SF_DST_RAX, 0}},\n      {OPD(0xDF, 0xE1), 7, X86InstInfo{\"\",        TYPE_INVALID, FLAGS_NONE, 0}},\n      //  / 5\n      {OPD(0xDF, 0xE8), 8, X86InstInfo{\"FUCOMIP\", TYPE_INST,    FLAGS_POP, 0}},\n      //  / 6\n      {OPD(0xDF, 0xF0), 8, X86InstInfo{\"FCOMIP\",  TYPE_X87,   FLAGS_POP, 0}},\n      //  / 7\n      {OPD(0xDF, 0xF8), 8, X86InstInfo{\"\",        TYPE_INVALID, FLAGS_NONE, 0}},\n  };\n#undef OPD\n#undef OPDReg\n\n  auto InstallToX87Table = [](auto& FinalTable, auto& LocalTable) {\n    for (auto Op : LocalTable) {\n      auto OpNum = Op.Op;\n      bool Repeat = (OpNum & 0x8000) != 0;\n      OpNum = OpNum & 0x7FF;\n      auto Dispatcher = Op.Ptr;\n      for (uint8_t i = 0; i < Op.Count; ++i) {\n        LOGMAN_THROW_A_FMT(FinalTable[OpNum + i].OpcodeDispatcher.OpDispatch == nullptr, \"Duplicate Entry\");\n\n        FinalTable[OpNum + i].OpcodeDispatcher.OpDispatch = Dispatcher;\n\n        // Flag to indicate if we need to repeat this op in {0x40, 0x80} ranges\n        if (Repeat) {\n          FinalTable[(OpNum | 0x40) + i].OpcodeDispatcher.OpDispatch = Dispatcher;\n          FinalTable[(OpNum | 0x80) + i].OpcodeDispatcher.OpDispatch = Dispatcher;\n        }\n      }\n    }\n  };\n\n  GenerateX87Table(Table.data(), X87OpTable, std::size(X87OpTable));\n  InstallToX87Table(Table, DispatchTable);\n  return Table;\n};\n\nconstexpr std::array<X86InstInfo, MAX_X87_TABLE_SIZE> X87F80Ops = GenerateX87TableLambda(X87F80OpTable);\nconstexpr std::array<X86InstInfo, MAX_X87_TABLE_SIZE> X87F64Ops = GenerateX87TableLambda(X87F64OpTable);\n\n}\n"
  },
  {
    "path": "FEXCore/Source/Interface/GDBJIT/GDBJIT.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"GDBJIT.h\"\n\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/HLE/SourcecodeResolver.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/vector.h>\n\n#if defined(GDB_SYMBOLS_ENABLED)\n\n#include <FEXCore/Debug/GDBReaderInterface.h>\n\nextern \"C\" {\nenum jit_actions_t { JIT_NOACTION = 0, JIT_REGISTER_FN, JIT_UNREGISTER_FN };\n\nstruct jit_code_entry {\n  jit_code_entry* next_entry;\n  jit_code_entry* prev_entry;\n  const char* symfile_addr;\n  uint64_t symfile_size;\n};\n\nstruct jit_descriptor {\n  uint32_t version;\n  /* This type should be jit_actions_t, but we use uint32_t\n     to be explicit about the bitwidth.  */\n  uint32_t action_flag;\n  jit_code_entry* relevant_entry;\n  jit_code_entry* first_entry;\n};\n\n/* Make sure to specify the version statically, because the\n   debugger may check the version before we can set it.  */\n\nconstinit jit_descriptor __jit_debug_descriptor = {.version = 1};\n\n/* GDB puts a breakpoint in this function.  */\nvoid __attribute__((noinline)) __jit_debug_register_code() {\n  asm volatile(\"\" ::\"r\"(&__jit_debug_descriptor));\n};\n}\n\nnamespace FEXCore {\n\nvoid GDBJITRegister(const FEXCore::ExecutableFileInfo& Entry, uintptr_t VAFileStart, uint64_t GuestRIP, uintptr_t HostEntry,\n                    FEXCore::Core::DebugData& DebugData) {\n  auto map = Entry.SourcecodeMap.get();\n\n  if (map) {\n    auto FileOffset = GuestRIP - VAFileStart;\n\n    auto Sym = map->FindSymbolMapping(FileOffset);\n\n    auto SymName = HLE::SourcecodeSymbolMapping::SymName(Sym, Entry.Filename, HostEntry, FileOffset);\n\n    fextl::vector<gdb_line_mapping> Lines;\n    for (const auto& GuestOpcode : DebugData.GuestOpcodes) {\n      auto Line = map->FindLineMapping(GuestRIP + GuestOpcode.GuestEntryOffset - VAFileStart);\n      if (Line) {\n        Lines.push_back({Line->LineNumber, HostEntry + GuestOpcode.HostEntryOffset});\n      }\n    }\n\n    size_t size = sizeof(info_t) + 1 * sizeof(blocks_t) + Lines.size() * sizeof(gdb_line_mapping);\n\n    auto mem = (uint8_t*)malloc(size);\n    auto base = mem;\n    info_t* info = (info_t*)mem;\n    mem += sizeof(info_t);\n\n    strncpy(info->filename, map->SourceFile.c_str(), 511);\n\n    info->nblocks = 1;\n\n    auto blocks = (blocks_t*)mem;\n    info->blocks_ofs = mem - base;\n\n    mem += info->nblocks * sizeof(blocks_t);\n\n    for (int i = 0; i < info->nblocks; i++) {\n      strncpy(blocks[i].name, SymName.c_str(), 511);\n      blocks[i].start = HostEntry;\n      blocks[i].end = HostEntry + DebugData.HostCodeSize;\n    }\n\n    info->nlines = Lines.size();\n\n    auto lines = (gdb_line_mapping*)mem;\n    info->lines_ofs = mem - base;\n    mem += info->nlines * sizeof(gdb_line_mapping);\n\n    if (info->nlines) {\n      memcpy(lines, Lines.data(), info->nlines * sizeof(gdb_line_mapping));\n    }\n\n    auto entry = new jit_code_entry {0, 0, 0, 0};\n\n    entry->symfile_addr = (const char*)info;\n    entry->symfile_size = size;\n\n    if (__jit_debug_descriptor.first_entry) {\n      __jit_debug_descriptor.relevant_entry->next_entry = entry;\n      entry->prev_entry = __jit_debug_descriptor.relevant_entry;\n    } else {\n      __jit_debug_descriptor.first_entry = entry;\n    }\n\n    __jit_debug_descriptor.relevant_entry = entry;\n    __jit_debug_descriptor.action_flag = JIT_REGISTER_FN;\n    __jit_debug_register_code();\n  }\n}\n} // namespace FEXCore\n#else\nnamespace FEXCore {\nvoid GDBJITRegister(const FEXCore::ExecutableFileInfo&, uintptr_t, uint64_t, uintptr_t, FEXCore::Core::DebugData&) {\n  ERROR_AND_DIE_FMT(\"GDBSymbols support not compiled in\");\n}\n} // namespace FEXCore\n#endif\n"
  },
  {
    "path": "FEXCore/Source/Interface/GDBJIT/GDBJIT.h",
    "content": "// SPDX-License-Identifier: MIT\n\n#include <FEXCore/Core/CodeCache.h>\n#include <Interface/Core/JIT/DebugData.h>\n\nnamespace FEXCore {\nvoid GDBJITRegister(const FEXCore::ExecutableFileInfo&, uintptr_t VAFileStart, uint64_t GuestRIP, uintptr_t HostEntry, FEXCore::Core::DebugData&);\n}\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/IR.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/EnumUtils.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/ThreadPoolAllocator.h>\n#include <FEXCore/IR/IR.h>\n\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/sstream.h>\n\n#include <array>\n#include <cstddef>\n#include <cstdint>\n#include <functional>\n#include <iterator>\n#include <type_traits>\n\nnamespace FEXCore::IR {\n\nclass OrderedNode;\n\n/**\n * @brief The IROp_Header is an dynamically sized array\n * At the end it contains a uint8_t for the number of arguments that Op has\n * Then there is an unsized array of NodeWrapper arguments for the number of arguments this op has\n * The op structures that are including the header must ensure that they pad themselves correctly to the number of arguments used\n */\nstruct IROp_Header;\n\n/**\n * @brief Represents the ID of a given IR node.\n *\n * Intended to provide strong typing from other integer values\n * to prevent passing incorrect values to certain API functions.\n */\nstruct NodeID final {\n  using value_type = uint32_t;\n\n  constexpr NodeID() noexcept = default;\n  constexpr explicit NodeID(value_type Value_) noexcept\n    : Value {Value_} {}\n\n  constexpr NodeID(const NodeID&) noexcept = default;\n  constexpr NodeID& operator=(const NodeID&) noexcept = default;\n\n  constexpr NodeID(NodeID&&) noexcept = default;\n  constexpr NodeID& operator=(NodeID&&) noexcept = default;\n\n  [[nodiscard]]\n  constexpr bool IsValid() const noexcept {\n    return Value != 0;\n  }\n  [[nodiscard]]\n  constexpr bool IsInvalid() const noexcept {\n    return !IsValid();\n  }\n  constexpr void Invalidate() noexcept {\n    Value = 0;\n  }\n\n  [[nodiscard]] constexpr auto operator<=>(const NodeID&) const noexcept = default;\n\n  friend std::ostream& operator<<(std::ostream& out, NodeID ID) {\n    out << ID.Value;\n    return out;\n  }\n  friend std::istream& operator>>(std::istream& in, NodeID& ID) {\n    in >> ID.Value;\n    return in;\n  }\n\n  value_type Value {};\n};\n\n/**\n * @brief This is a very simple wrapper for our node pointers\n * You probably don't want to use this directly\n * Use OpNodeWrapper and OrderedNodeWrapper types below instead\n *\n * This is necessary to allow two things\n *  - Reduce memory usage by having the pointer be an 32bit offset rather than the whole 64bit pointer\n *  - Actually use an offset from a base so we aren't storing pointers for everything\n *    - Makes IR list copying be as cheap as a memcpy\n * Downsides\n *  - The IR nodes have to be allocated out of a linear array of memory\n *  - We currently only allow a 32bit offset, so *only* 4 million nodes per list\n *  - We have to have the base offset live somewhere else\n *  - Has to be POD and trivially copyable\n *  - Makes every real node access turn in to a [Base + Offset] access\n *  - Can be confusing if you're mixing OpNodeWrapper and OrderedNodeWrapper usage\n */\ntemplate<typename Type>\nstruct FEX_PACKED NodeWrapperBase final {\n  // 32bit or 64bit offset doesn't matter for addressing.\n  // We use uint32_t to be more memory efficient (Cuts our node list size in half)\n  using NodeOffsetType = uint32_t;\n  NodeOffsetType NodeOffset;\n\n  explicit NodeWrapperBase() = default;\n\n  [[nodiscard]]\n  static NodeWrapperBase WrapOffset(NodeOffsetType Offset) {\n    NodeWrapperBase Wrapped;\n    Wrapped.NodeOffset = Offset;\n    return Wrapped;\n  }\n\n  [[nodiscard]]\n  static NodeWrapperBase WrapPtr(uintptr_t Base, uintptr_t Value) {\n    NodeWrapperBase Wrapped;\n    Wrapped.SetOffset(Base, Value);\n    return Wrapped;\n  }\n\n  [[nodiscard]]\n  static void* UnwrapNode(uintptr_t Base, NodeWrapperBase Node) {\n    return Node.GetNode(Base);\n  }\n\n  [[nodiscard]]\n  NodeID ID() const;\n\n  [[nodiscard]]\n  bool IsInvalid() const {\n    return NodeOffset == 0;\n  }\n\n  [[nodiscard]]\n  bool IsImmediate() const {\n    return NodeOffset & (1u << 31);\n  }\n\n  [[nodiscard]]\n  bool HasKill() const {\n    return NodeOffset & (1u << 30);\n  }\n\n  void ClearKill() {\n    NodeOffset &= ~(1u << 30);\n  }\n\n  void SetKill() {\n    NodeOffset |= (1u << 30);\n  }\n\n  [[nodiscard]]\n  bool IsPointer() const {\n    return !IsImmediate() && !HasKill();\n  }\n\n  [[nodiscard]]\n  Type* GetNode(uintptr_t Base) {\n    LOGMAN_THROW_A_FMT(IsPointer(), \"Precondition\");\n    return reinterpret_cast<Type*>(Base + NodeOffset);\n  }\n  [[nodiscard]]\n  const Type* GetNode(uintptr_t Base) const {\n    LOGMAN_THROW_A_FMT(IsPointer(), \"Precondition\");\n    return reinterpret_cast<const Type*>(Base + NodeOffset);\n  }\n\n  void SetOffset(uintptr_t Base, uintptr_t Value) {\n    NodeOffset = Value - Base;\n    LOGMAN_THROW_A_FMT(IsPointer(), \"Offsets are within 2GiB range\");\n  }\n\n  void SetInvalid() {\n    NodeOffset = 0;\n    LOGMAN_THROW_A_FMT(IsInvalid(), \"Zero state\");\n  }\n\n  void SetImmediate(uint32_t Immediate) {\n    LOGMAN_THROW_A_FMT(Immediate < (1u << 31), \"Bounded\");\n    NodeOffset = Immediate | (1u << 31);\n    LOGMAN_THROW_A_FMT(IsImmediate(), \"Encoded above\");\n  }\n\n  [[nodiscard]]\n  uint32_t GetImmediate() const {\n    LOGMAN_THROW_A_FMT(IsImmediate(), \"Precondition: must be an immediate\");\n    return NodeOffset & ~(1u << 31);\n  }\n\n  [[nodiscard]]\n  friend constexpr bool operator==(const NodeWrapperBase<Type>&, const NodeWrapperBase<Type>&) = default;\n\n  [[nodiscard]]\n  static NodeWrapperBase<Type> FromImmediate(uint32_t Immediate) {\n    NodeWrapperBase<Type> A;\n    A.SetImmediate(Immediate);\n    return A;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<NodeWrapperBase<OrderedNode>>);\n\nstatic_assert(sizeof(NodeWrapperBase<OrderedNode>) == sizeof(uint32_t));\n\nusing OpNodeWrapper = NodeWrapperBase<IROp_Header>;\nusing OrderedNodeWrapper = NodeWrapperBase<OrderedNode>;\n\nstruct OrderedNodeHeader {\n  OpNodeWrapper Value;\n  OrderedNodeWrapper Next;\n  OrderedNodeWrapper Previous;\n};\n\nstatic_assert(sizeof(OrderedNodeHeader) == sizeof(uint32_t) * 3);\n\n/**\n * @brief This is a node in our IR representation\n * Is a doubly linked list node that lives in a representation of a linearly allocated node list\n * The links in the nodes can live in a list independent of the data IR data\n *\n * ex.\n *  Region1 : ... <-> <OrderedNode> <-> <OrderedNode> <-> ...\n *                    | *<Value>        |\n *                    v                 v\n *  Region2 : <IROp>..<IROp>..<IROp>..<IROp>\n *\n *  In this example the OrderedNodes are allocated in one linear memory region (Not necessarily contiguous with one another linking)\n *  The second region is contiguous but they don't have any relationship with one another directly\n */\nclass OrderedNode final {\npublic:\n  // These three values are laid out very specifically to make it fast to access the NodeWrappers specifically\n  OrderedNodeHeader Header;\n  uint32_t NumUses;\n\n  // After RA, the register allocated for the node. This is the register for the\n  // node at the time it is written, even if it is shuffled into other registers\n  // later. In other words, it is the register destination of the instruction\n  // represented by this OrderedNode.\n  //\n  // This is the raw value of a PhysicalRegister data structure.\n  uint8_t Reg;\n  uint8_t Pad[3];\n\n  using value_type = OrderedNodeWrapper;\n\n  OrderedNode() = default;\n\n  /**\n   * @brief Appends a node to this current node\n   *\n   * Before. <Prev> <-> <Current> <-> <Next>\n   * After.  <Prev> <-> <Current> <-> <Node> <-> Next\n   *\n   * @return Pointer to the node being added\n   */\n  value_type append(uintptr_t Base, value_type Node) {\n    // Set Next Node's Previous to incoming node\n    SetPrevious(Base, Header.Next, Node);\n\n    // Set Incoming node's links to this node's links\n    SetPrevious(Base, Node, Wrapped(Base));\n    SetNext(Base, Node, Header.Next);\n\n    // Set this node's next to the incoming node\n    SetNext(Base, Wrapped(Base), Node);\n\n    // Return the node we are appending\n    return Node;\n  }\n\n  OrderedNode* append(uintptr_t Base, OrderedNode* Node) {\n    value_type WNode = Node->Wrapped(Base);\n    // Set Next Node's Previous to incoming node\n    SetPrevious(Base, Header.Next, WNode);\n\n    // Set Incoming node's links to this node's links\n    SetPrevious(Base, WNode, Wrapped(Base));\n    SetNext(Base, WNode, Header.Next);\n\n    // Set this node's next to the incoming node\n    SetNext(Base, Wrapped(Base), WNode);\n\n    // Return the node we are appending\n    return Node;\n  }\n\n  /**\n   * @brief Prepends a node to the current node\n   * Before. <Prev> <-> <Current> <-> <Next>\n   * After.  <Prev> <-> <Node> <-> <Current> <-> Next\n   *\n   * @return Pointer to the node being added\n   */\n  value_type prepend(uintptr_t Base, value_type Node) {\n    // Set the previous node's next to the incoming node\n    SetNext(Base, Header.Previous, Node);\n\n    // Set the incoming node's links\n    SetPrevious(Base, Node, Header.Previous);\n    SetNext(Base, Node, Wrapped(Base));\n\n    // Set the current node's link\n    SetPrevious(Base, Wrapped(Base), Node);\n\n    // Return the node we are prepending\n    return Node;\n  }\n\n  OrderedNode* prepend(uintptr_t Base, OrderedNode* Node) {\n    value_type WNode = Node->Wrapped(Base);\n    // Set the previous node's next to the incoming node\n    SetNext(Base, Header.Previous, WNode);\n\n    // Set the incoming node's links\n    SetPrevious(Base, WNode, Header.Previous);\n    SetNext(Base, WNode, Wrapped(Base));\n\n    // Set the current node's link\n    SetPrevious(Base, Wrapped(Base), WNode);\n\n    // Return the node we are prepending\n    return Node;\n  }\n\n  /**\n   * @brief Gets the remaining size of the blocks from this point onward\n   *\n   * Doesn't find the head of the list\n   *\n   */\n  [[nodiscard]]\n  size_t size(uintptr_t Base) const {\n    size_t Size = 1;\n    // Walk the list forward until we hit a sentinel\n    value_type Current = Header.Next;\n    while (Current.NodeOffset != 0) {\n      ++Size;\n      OrderedNode* RealNode = Current.GetNode(Base);\n      Current = RealNode->Header.Next;\n    }\n    return Size;\n  }\n\n  void Unlink(uintptr_t Base) {\n    // This removes the node from the list. Orphaning it\n    // Before: <Previous> <-> <Current> <-> <Next>\n    // After: <Previous <-> <Next>\n    SetNext(Base, Header.Previous, Header.Next);\n    SetPrevious(Base, Header.Next, Header.Previous);\n  }\n\n  [[nodiscard]]\n  const IROp_Header* Op(uintptr_t Base) const {\n    return Header.Value.GetNode(Base);\n  }\n  [[nodiscard]]\n  IROp_Header* Op(uintptr_t Base) {\n    return Header.Value.GetNode(Base);\n  }\n\n  [[nodiscard]]\n  uint32_t GetUses() const {\n    return NumUses;\n  }\n\n  void AddUse() {\n    ++NumUses;\n  }\n  void RemoveUse() {\n    --NumUses;\n  }\n\n  [[nodiscard]]\n  value_type Wrapped(uintptr_t Base) const {\n    value_type Tmp;\n    Tmp.SetOffset(Base, reinterpret_cast<uintptr_t>(this));\n    return Tmp;\n  }\n\nprivate:\n  [[nodiscard]]\n  value_type WrappedOffset(uint32_t Offset) const {\n    value_type Tmp;\n    Tmp.NodeOffset = Offset;\n    return Tmp;\n  }\n\n  static void SetPrevious(uintptr_t Base, value_type Node, value_type New) {\n    OrderedNode* RealNode = Node.GetNode(Base);\n    RealNode->Header.Previous = New;\n  }\n\n  static void SetNext(uintptr_t Base, value_type Node, value_type New) {\n    OrderedNode* RealNode = Node.GetNode(Base);\n    RealNode->Header.Next = New;\n  }\n\n  void SetUses(uint32_t Uses) {\n    NumUses = Uses;\n  }\n};\n\nstatic_assert(std::is_trivially_constructible_v<OrderedNode>);\nstatic_assert(std::is_trivially_copyable_v<OrderedNode>);\nstatic_assert(offsetof(OrderedNode, Header) == 0);\nstatic_assert(sizeof(OrderedNode) == (sizeof(OrderedNodeHeader) + 2 * sizeof(uint32_t)));\n\n// This is temporary. We are transitioning away from OrderedNode's in favour of\n// flat Ref words. To ease porting, we have this typedef. Eventually OrderedNode\n// will be removed and this typedef will be replaced by something like:\n//\n//  struct Ref {\n//     uint Flags : 1;\n//     uint ID : 23;\n//     uint Reg : 8;\n//  };\nusing Ref = OrderedNode*;\n\n/* This iterator can be used to step though nodes.\n * Due to how our IR is laid out, this can be used to either step\n * though the CodeBlocks or though the code within a single block.\n */\nclass NodeIterator {\npublic:\n  struct value_type final {\n    OrderedNode* Node;\n    IROp_Header* Header;\n  };\n  using size_type = std::size_t;\n  using difference_type = std::ptrdiff_t;\n  using reference = value_type&;\n  using const_reference = const value_type&;\n  using pointer = value_type*;\n  using const_pointer = const value_type*;\n  using iterator = NodeIterator;\n  using const_iterator = const NodeIterator;\n  using reverse_iterator = iterator;\n  using const_reverse_iterator = const_iterator;\n  using iterator_category = std::bidirectional_iterator_tag;\n\n  NodeIterator(uintptr_t Base, uintptr_t IRBase)\n    : BaseList {Base}\n    , IRList {IRBase} {}\n  explicit NodeIterator(uintptr_t Base, uintptr_t IRBase, OrderedNodeWrapper Ptr)\n    : BaseList {Base}\n    , IRList {IRBase}\n    , Node {Ptr} {}\n\n  [[nodiscard]]\n  bool operator==(const NodeIterator& rhs) const {\n    return Node.NodeOffset == rhs.Node.NodeOffset;\n  }\n\n  [[nodiscard]]\n  bool operator!=(const NodeIterator& rhs) const {\n    return !operator==(rhs);\n  }\n\n  NodeIterator operator++() {\n    OrderedNodeHeader* RealNode = reinterpret_cast<OrderedNodeHeader*>(Node.GetNode(BaseList));\n    Node = RealNode->Next;\n    return *this;\n  }\n\n  NodeIterator operator--() {\n    OrderedNodeHeader* RealNode = reinterpret_cast<OrderedNodeHeader*>(Node.GetNode(BaseList));\n    Node = RealNode->Previous;\n    return *this;\n  }\n\n  [[nodiscard]]\n  value_type operator*() {\n    OrderedNode* RealNode = Node.GetNode(BaseList);\n    return {RealNode, RealNode->Op(IRList)};\n  }\n\n  [[nodiscard]]\n  value_type operator()() {\n    OrderedNode* RealNode = Node.GetNode(BaseList);\n    return {RealNode, RealNode->Op(IRList)};\n  }\n\n  [[nodiscard]]\n  NodeID ID() const {\n    return Node.ID();\n  }\n\n  [[nodiscard]]\n  static NodeIterator Invalid() {\n    return NodeIterator(0, 0);\n  }\n\nprotected:\n  uintptr_t BaseList {};\n  uintptr_t IRList {};\n  OrderedNodeWrapper Node {};\n};\n\n// This must directly match bytes to the named opsize.\n// Implicit sized IR operations does math to get between sizes.\nenum class OpSize : uint8_t {\n  iUnsized = 0,\n  i8Bit = 1,\n  i16Bit = 2,\n  i32Bit = 4,\n  i64Bit = 8,\n  f80Bit = 10,\n  i128Bit = 16,\n  i256Bit = 32,\n  iInvalid = 0xFF,\n};\n\nenum class FloatCompareOp : uint8_t {\n  EQ = 0,\n  LT,\n  LE,\n  UNO,\n  NEQ,\n  ORD,\n};\n\nenum class ShiftType : uint8_t {\n  LSL = 0,\n  LSR,\n  ASR,\n  ROR,\n};\n\nenum class BranchHint : uint8_t { None = 0, Call, Return, CheckTF };\n\n\n// Converts a size stored as an integer in to an OpSize enum.\n// This is a nop operation and will be eliminated by the compiler.\nstatic inline OpSize SizeToOpSize(uint8_t Size) {\n  switch (Size) {\n  case 0: return OpSize::iUnsized;\n  case 1: return OpSize::i8Bit;\n  case 2: return OpSize::i16Bit;\n  case 4: return OpSize::i32Bit;\n  case 8: return OpSize::i64Bit;\n  case 10: return OpSize::f80Bit;\n  case 16: return OpSize::i128Bit;\n  case 32: return OpSize::i256Bit;\n  case 0xFF: return OpSize::iInvalid;\n  default: FEX_UNREACHABLE;\n  }\n}\n\n// This is a nop operation and will be eliminated by the compiler.\nstatic inline uint8_t OpSizeToSize(IR::OpSize Size) {\n  switch (Size) {\n  case OpSize::iUnsized: return 0;\n  case OpSize::i8Bit: return 1;\n  case OpSize::i16Bit: return 2;\n  case OpSize::i32Bit: return 4;\n  case OpSize::i64Bit: return 8;\n  case OpSize::f80Bit: return 10;\n  case OpSize::i128Bit: return 16;\n  case OpSize::i256Bit: return 32;\n  case OpSize::iInvalid: return 0xFF;\n  default: FEX_UNREACHABLE;\n  }\n}\n\nstatic inline uint16_t OpSizeAsBits(IR::OpSize Size) {\n  LOGMAN_THROW_A_FMT(Size != IR::OpSize::iInvalid, \"Invalid Size\");\n  return IR::OpSizeToSize(Size) * 8u;\n}\n\ntemplate<typename T>\nrequires (std::is_integral_v<T>)\nstatic inline OpSize operator<<(IR::OpSize Size, T Shift) {\n  LOGMAN_THROW_A_FMT(Size != IR::OpSize::iInvalid, \"Invalid Size\");\n  return IR::SizeToOpSize(IR::OpSizeToSize(Size) << Shift);\n}\n\ntemplate<typename T>\nrequires (std::is_integral_v<T>)\nstatic inline OpSize operator>>(IR::OpSize Size, T Shift) {\n  LOGMAN_THROW_A_FMT(Size != IR::OpSize::iInvalid, \"Invalid Size\");\n  return IR::SizeToOpSize(IR::OpSizeToSize(Size) >> Shift);\n}\n\nstatic inline OpSize operator/(IR::OpSize Size, IR::OpSize Divisor) {\n  LOGMAN_THROW_A_FMT(Size != IR::OpSize::iInvalid, \"Invalid Size\");\n  return IR::SizeToOpSize(IR::OpSizeToSize(Size) / IR::OpSizeToSize(Divisor));\n}\n\ntemplate<typename T>\nrequires (std::is_integral_v<T>)\nstatic inline OpSize operator/(IR::OpSize Size, T Divisor) {\n  LOGMAN_THROW_A_FMT(Size != IR::OpSize::iInvalid, \"Invalid Size\");\n  return IR::SizeToOpSize(IR::OpSizeToSize(Size) / Divisor);\n}\n\nstatic inline uint8_t NumElements(IR::OpSize RegisterSize, IR::OpSize ElementSize) {\n  LOGMAN_THROW_A_FMT(RegisterSize != IR::OpSize::iInvalid && ElementSize != IR::OpSize::iInvalid && RegisterSize != IR::OpSize::iUnsized &&\n                       ElementSize != IR::OpSize::iUnsized,\n                     \"Invalid Size\");\n  return IR::OpSizeToSize(RegisterSize) / IR::OpSizeToSize(ElementSize);\n}\n\n#define IROP_ENUM\n#define IROP_STRUCTS\n#define IROP_SIZES\n#define IROP_REG_CLASSES\n#include <FEXCore/IR/IRDefines.inc>\n\n/* This iterator can be used to step though every single node in a multi-block in SSA order.\n *\n * Iterates in the order of:\n *\n * end <-- CodeBlockA <--> BlockAInst1 <--> BlockAInst2 <--> CodeBlockB <--> BlockBInst1 <--> BlockBInst2 --> end\n */\nclass AllNodesIterator : public NodeIterator {\npublic:\n  AllNodesIterator(uintptr_t Base, uintptr_t IRBase)\n    : NodeIterator(Base, IRBase) {}\n  explicit AllNodesIterator(uintptr_t Base, uintptr_t IRBase, OrderedNodeWrapper Ptr)\n    : NodeIterator(Base, IRBase, Ptr) {}\n  AllNodesIterator(NodeIterator other)\n    : NodeIterator(other) {} // Allow NodeIterator to be upgraded\n\n  AllNodesIterator operator++() {\n    OrderedNodeHeader* RealNode = reinterpret_cast<OrderedNodeHeader*>(Node.GetNode(BaseList));\n    auto IROp = Node.GetNode(BaseList)->Op(IRList);\n\n    // If this is the last node of a codeblock, we need to continue to the next block\n    if (IROp->Op == OP_ENDBLOCK) {\n      auto EndBlock = IROp->C<IROp_EndBlock>();\n\n      auto CurrentBlock = EndBlock->BlockHeader.GetNode(BaseList);\n      Node = CurrentBlock->Header.Next;\n    } else if (IROp->Op == OP_CODEBLOCK) {\n      auto CodeBlock = IROp->C<IROp_CodeBlock>();\n\n      Node = CodeBlock->Begin;\n    } else {\n      Node = RealNode->Next;\n    }\n\n    return *this;\n  }\n\n  AllNodesIterator operator--() {\n    auto IROp = Node.GetNode(BaseList)->Op(IRList);\n\n    if (IROp->Op == OP_BEGINBLOCK) {\n      auto BeginBlock = IROp->C<IROp_EndBlock>();\n\n      Node = BeginBlock->BlockHeader;\n    } else if (IROp->Op == OP_CODEBLOCK) {\n      auto PrevBlockWrapper = Node.GetNode(BaseList)->Header.Previous;\n      auto PrevCodeBlock = PrevBlockWrapper.GetNode(BaseList)->Op(IRList)->C<IROp_CodeBlock>();\n\n      Node = PrevCodeBlock->Last;\n    } else {\n      Node = Node.GetNode(BaseList)->Header.Previous;\n    }\n\n    return *this;\n  }\n\n  [[nodiscard]]\n  static AllNodesIterator Invalid() {\n    return AllNodesIterator(0, 0);\n  }\n};\n\nclass IRListView;\nclass IREmitter;\n\ntemplate<typename Type>\ninline NodeID NodeWrapperBase<Type>::ID() const {\n  return NodeID(NodeOffset / sizeof(IR::OrderedNode));\n}\n\n[[nodiscard]]\nbool IsBlockExit(FEXCore::IR::IROps Op);\n\nvoid Dump(fextl::stringstream* out, const IRListView* IR);\n\nconstexpr auto format_as(FEXCore::IR::NodeID ID) {\n  return ID.Value;\n}\n\nFEX_DEFINE_ENUM_FMT_PASSTHROUGH(FEXCore::IR::FenceType)\nFEX_DEFINE_ENUM_FMT_PASSTHROUGH(FEXCore::IR::MemOffsetType)\nFEX_DEFINE_ENUM_FMT_PASSTHROUGH(FEXCore::IR::OpSize)\nFEX_DEFINE_ENUM_FMT_PASSTHROUGH(FEXCore::IR::RegClass)\n} // namespace FEXCore::IR\n\ntemplate<>\nstruct std::hash<FEXCore::IR::NodeID> {\n  size_t operator()(const FEXCore::IR::NodeID& ID) const noexcept {\n    return std::hash<FEXCore::IR::NodeID::value_type> {}(ID.Value);\n  }\n};\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/IR.json",
    "content": "{\n  \"Docs\": [\n    \"IRTypes define types that can be used directly in the IR.\",\n    \"These will translate to the underlying C types when stored in the op data\",\n    \"\",\n    \"SSA types are special cased\",\n    \"  SSA = untyped\",\n    \"  GPR = GPR class type\",\n    \"  FPR = FPR class type\",\n    \"Declaring the SSA types correctly will allow validation passes to ensure the op is getting passed correct arguments\",\n    \"\",\n    \"Arguments must always follow a particular order. <Type>:<Prefix><Name>\",\n    \"Type must always be an IRType\",\n    \"Prefix currently can be one of the following: #, $\",\n    \"  #: This is a temporary argument that is in the IR Emitter arguments\",\n    \"    - This will not be stored in the resulting IR op data structure\",\n    \"  $: This is a value that will be stored inside of the IR op data structure\",\n    \"    - If it is type SSA, GPR, or FPR then it is an SSA type\",\n    \"    - These will get added to the SSA argument union to ensure RA happens\",\n    \"\",\n    \"IR op definition follows the structure of <SSA Type> = <IROp> <Arguments>\",\n    \"\",\n    \"Eg:\",\n    \"IR op with no result and no arguments\",\n    \"  CallbackReturn\",\n    \"\",\n    \"IR op with result and no arguments\",\n    \"  GPR = ProcessorID\",\n    \"\",\n    \"IR op with no result and non-SSA argument\",\n    \"  Fence FenceType:$Type\",\n    \"\",\n    \"IR op with no result and SSA arguments\",\n    \"  SetRoundingMode GPR:$Mode\",\n    \"\",\n    \"IR op with result and SSA arguments\",\n    \"  GPR = Add GPR:$Src1, GPR:$Src2\",\n\n    \"\",\n    \"## Op members ##\",\n    \"* Desc\",\n    \"  * List of text for documenting this IR op.\",\n    \"* OpClass\",\n    \"  * Textual class to group IR ops by type\",\n    \"* DestClass\",\n    \"  * SSA class of the return when the return type is `SSA`\",\n    \"  * Not used if the destination type is one of {GPR, FPR}\",\n    \"* DestSize\",\n    \"  * The size of the destination type\",\n    \"* EmitValidation\",\n    \"  * List of validations to emit for the IR emitter\",\n    \"  * These are validations that can't be automatically inferred and need to be hand-written\",\n    \"\"\n  ],\n  \"Enums\": {\n    \"class CondClass : uint8_t\": [\n      \"EQ    = 0,\",\n      \"NEQ   = 1,\",\n      \"UGE   = 2,\",\n      \"ULT   = 3,\",\n      \"MI    = 4,\",\n      \"PL    = 5,\",\n      \"VS    = 6,\",\n      \"VC    = 7,\",\n      \"UGT   = 8,\",\n      \"ULE   = 9,\",\n      \"SGE   = 10,\",\n      \"SLT   = 11,\",\n      \"SGT   = 12,\",\n      \"SLE   = 13,\",\n      \"TSTZ  = 14, /* bit test zero */\",\n      \"TSTNZ = 15, /* bit test nonzero */\",\n      \"\",\n      \"FLU   = 16, /* float less or unordered */\",\n      \"FGE   = 17, /* float greater or equal */\",\n      \"FLEU  = 18, /* float less or equal or unordered */\",\n      \"FGT   = 19, /* float greater */\",\n      \"FU    = 20, /* float unordered */\",\n      \"FNU   = 21, /* float not unordered */\",\n      \"\",\n      \"AL    = 32, /* always */\"\n    ],\n    \"class FenceType : uint8_t\": [\n      \"Load      = 0,\",\n      \"Store     = 1,\",\n      \"LoadStore = 2,\",\n      \"Inst      = 3,\"\n    ],\n    \"class MemOffsetType : uint8_t\": [\n      \"SXTX = 0,\",\n      \"UXTW = 1,\",\n      \"SXTW = 2,\"\n    ],\n    \"class RegClass : uint32_t\": [\n      \"Invalid  = 0,\",\n      \"GPR      = 1,\",\n      \"GPRFixed = 2,\",\n      \"FPR      = 3,\",\n      \"FPRFixed = 4,\",\n      \"Complex  = 5,\"\n    ],\n    \"class RoundMode : uint8_t\": [\n      \"Nearest     = 0,\",\n      \"NegInfinity = 1,\",\n      \"PosInfinity = 2,\",\n      \"TowardsZero = 3, /* Truncate */\",\n      \"Host        = 4,\"\n    ],\n    \"class ConstPad : uint8_t\": [\n      \"NoPad = 0,\",\n      \"DoPad = 1,\",\n      \"AutoPad = 2,\"\n    ]\n  },\n  \"Defines\": [\n    \"constexpr uint8_t NumClasses {6}\",\n\n    \"constexpr uint8_t FCMP_FLAG_EQ        = 0\",\n    \"constexpr uint8_t FCMP_FLAG_LT        = 1\",\n    \"constexpr uint8_t FCMP_FLAG_UNORDERED = 2\",\n\n    \"struct BreakDefinition {\",\n    \"  uint16_t ErrorRegister;\",\n    \"  uint8_t Signal;\",\n    \"  uint8_t TrapNumber;\",\n    \"  uint8_t si_code;\",\n    \"};\"\n  ],\n  \"IRTypes\" : {\n    \"i1\":  \"bool\",\n    \"i8\":  \"int8_t\",\n    \"i16\": \"int16_t\",\n    \"i32\": \"int32_t\",\n    \"i64\": \"int64_t\",\n    \"u8\":  \"uint8_t\",\n    \"u16\": \"uint16_t\",\n    \"u32\": \"uint32_t\",\n    \"u64\": \"uint64_t\",\n    \"OpSize\": \"FEXCore::IR::OpSize\",\n    \"SSA\": \"OrderedNode*\",\n    \"GPR\": \"OrderedNode*\",\n    \"FPR\": \"OrderedNode*\",\n    \"FenceType\": \"FenceType\",\n    \"RegisterClass\": \"RegClass\",\n    \"CondClass\": \"CondClass\",\n    \"SHA256Sum\": \"SHA256Sum\",\n    \"MemOffsetType\": \"MemOffsetType\",\n    \"BreakDefinition\": \"BreakDefinition\",\n    \"RoundType\": \"RoundMode\",\n    \"ConstPad\": \"ConstPad\",\n    \"FloatCompareOp\": \"FloatCompareOp\",\n    \"NamedVectorConstant\": \"FEXCore::IR::NamedVectorConstant\",\n    \"IndexNamedVectorConstant\": \"FEXCore::IR::IndexNamedVectorConstant\",\n    \"ShiftType\": \"FEXCore::IR::ShiftType\",\n    \"BranchHint\": \"FEXCore::IR::BranchHint\",\n    \"Array16\": \"std::array<uint8_t, 16>\"\n  },\n  \"Ops\": {\n    \"Misc\": {\n      \"Dummy\": {\n        \"HasSideEffects\": true,\n        \"SwitchGen\": false,\n        \"JITDispatchOverride\": \"NoOp\"\n      },\n      \"IRHeader SSA:$Blocks, u64:$OriginalRIP, u32:$BlockCount, u32:$NumHostInstructions, u32:$SpillSlots, i1:$PostRA{false}, i1:$HasX87{false}, i1:$ReadsParity{false}\": {\n        \"SwitchGen\": false,\n        \"JITDispatchOverride\": \"NoOp\"\n      },\n      \"CodeBlock SSA:$Begin, SSA:$Last, u32:$ID, i1:$EntryPoint{false}, u32:$GuestEntryOffset{0}\": {\n        \"SwitchGen\": false,\n        \"RAOverride\": \"0\",\n        \"JITDispatchOverride\": \"NoOp\"\n      },\n      \"BeginBlock SSA:$BlockHeader\": {\n        \"HasSideEffects\": true,\n        \"SwitchGen\": false,\n        \"RAOverride\": \"0\",\n        \"JITDispatchOverride\": \"NoOp\"\n      },\n      \"InvalidateFlags u64:$Flags\": {\n        \"HasSideEffects\": true,\n        \"JITDispatchOverride\": \"NoOp\"\n      },\n\n      \"EndBlock SSA:$BlockHeader\": {\n        \"HasSideEffects\": true,\n        \"SwitchGen\": false,\n        \"RAOverride\": \"0\",\n        \"JITDispatchOverride\": \"NoOp\"\n      },\n\n      \"GuestOpcode u32:$GuestEntryOffset\": {\n        \"Desc\": [\"Marks the beginning of a guest opcode\"],\n        \"HasSideEffects\": true\n      },\n\n      \"GPR = ValidateCode Array16:$CodeOriginal, GPR:$Address, u8:$CodeLength\": {\n        \"HasSideEffects\": true,\n        \"HasDest\": true,\n        \"DestSize\": \"OpSize::i64Bit\"\n      },\n\n      \"ThreadRemoveCodeEntry\": {\n        \"HasSideEffects\": true\n      },\n\n      \"GPR = ProcessorID\": {\n        \"Desc\": [\"Returns the processor ID correlating to the current running CPU\",\n                 \"This may be out of date by time this instruction is executed so care must be taken\",\n                 \"This same information can be gotten from syscall getcpu(&cpu, &node)\",\n                 \"uint32_t Res = (node << 12) | cpu;\",\n                 \"This means it has a limitation of 4096 CPU cores. Which is fine and matches x86 behaviour\"\n                ],\n        \"DestSize\": \"OpSize::i64Bit\"\n      },\n      \"GPR = GetRoundingMode\": {\n        \"Desc\": [\"Gets the current rounding mode options\"\n                ],\n        \"DestSize\": \"OpSize::i32Bit\"\n      },\n\n      \"SetRoundingMode GPR:$RoundMode, i1:$SetDAZ, GPR:$MXCSR\": {\n        \"Desc\": [\"Sets the current rounding mode options for the thread\"\n                ],\n        \"HasSideEffects\": true\n      },\n      \"GPR = PushRoundingMode u8:$RoundMode\": {\n        \"Desc\": [\"Override the current rounding mode options for the thread, returning old FPCR\"\n                ],\n        \"DestSize\": \"OpSize::i64Bit\",\n        \"HasSideEffects\": true\n      },\n      \"PopRoundingMode GPR:$FPCR\": {\n        \"Desc\": [\"Resets rounding mode after PushRoundingMode operation\"\n                ],\n        \"HasSideEffects\": true\n      },\n      \"Print SSA:$Value\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Debug operation that prints an SSA value to the console\",\n                 \"May only print 64bits of the value\"]\n      },\n      \"GPR = AllocateGPR i1:$ForPair\": {\n        \"Desc\": [\"Silly pseudo-instruction to allocate a register for a future destination\",\n                 \"Note: if an instruction uses allocated destinations-as-sources,\",\n                 \"it cannot use a regular destination too. This ensures RA correctness.\",\n                 \"This is a kludge to deal with the IR's lack of multiple destinations\",\n                 \"If ForPair is set, RA will try to allocate the base of a register pair\"],\n        \"DestSize\": \"OpSize::i64Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = AllocateFPR OpSize:#RegisterSize, OpSize:#ElementSize\": {\n        \"Desc\": [\"Like AllocateGPR, but for FPR\"],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"JITDispatch\": false\n      },\n      \"GPR = AllocateGPRAfter GPR:$After\": {\n        \"Desc\": [\"Silly pseudo-instruction to allocate a register for a future destination\",\n                 \"This is a kludge to deal with the IR's lack of multiple destinations\",\n                 \"RA will attempt to allocate to the register after $After.\",\n                 \"It may not succeed.\"],\n        \"DestSize\": \"OpSize::i64Bit\",\n        \"JITDispatch\": false\n      },\n      \"GPR = RDRAND i1:$GetReseeded\": {\n        \"Desc\": [\"Uses the hardware random number generator to generate a 64bit number\",\n                 \"The boolean argument asks if we should be reading the reseeded number or not\",\n                 \"Reseeded RNG calculation is more expensive and will be heavier to use\",\n                 \"Returns the 64-bit number\",\n                 \"Sets the Z flag if the number is valid.\",\n                 \"RNG hardware is allowed to fail early and return. Software must always check this\"\n                ],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"OpSize::i64Bit\"\n      },\n      \"Yield\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"This is a hint instruction that the CPU is likely to do a spin so it might want to pause to help out SMP\",\n                 \"Can be implemented as a NOP if necessary\"]\n      },\n      \"WFET GPR:$Upper, GPR:$Lower\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\n          \"Implement a low power wait attempting to sleep until RDTSC >= Upper:Lower.\",\n          \"Will spuriously wake up.\"\n\t]\n      },\n      \"MonoBackpatcherWrite OpSize:$Size, GPR:$Value, GPR:$Addr\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [ \"Writes and invalidates the target address with the invalidation mutex locked. This is a fault-avoiding\",\n                  \"replacement for the atomic SMC writes used in the mono callsite backpatcher.\" ],\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      }\n    },\n    \"Branch\": {\n      \"Jump SSA:$TargetBlock\": {\n        \"HasSideEffects\": true,\n        \"RAOverride\": \"0\"\n      },\n      \"CondJump SSA:$Cmp1, SSA:$Cmp2, SSA:$TrueBlock, SSA:$FalseBlock, CondClass:$Cond{CondClass::NEQ}, OpSize:$CompareSize{OpSize::iInvalid}, i1:$FromNZCV{false}\": {\n        \"Inline\": [\"\", \"AddSub\"],\n        \"HasSideEffects\": true,\n        \"RAOverride\": \"2\"\n      },\n      \"ExitFunction OpSize:#Size, GPR:$NewRIP, BranchHint:$Hint, GPR:$CallReturnAddress, SSA:$CallReturnBlock\": {\n        \"Desc\": [\"Exits the current JIT function with a target RIP\"\n                ],\n        \"Inline\": [\"Any\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\",\n        \"RAOverride\": \"2\"\n      },\n      \"Break BreakDefinition:$Reason\": {\n        \"HasSideEffects\": true\n      },\n      \"CallbackReturn\": {\n        \"HasSideEffects\": true\n      },\n      \"GPR = Syscall GPR:$SyscallID, GPR:$Arg0, GPR:$Arg1, GPR:$Arg2, GPR:$Arg3, GPR:$Arg4, GPR:$Arg5\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Dispatches a guest syscall through to the SyscallHandler class\"\n                ],\n        \"DestSize\": \"OpSize::i64Bit\"\n      },\n\n      \"Thunk GPR:$ArgPtr, SHA256Sum:$ThunkNameHash\": {\n        \"HasSideEffects\": true\n      },\n\n      \"GPR:$EAX, GPR:$EBX, GPR:$ECX, GPR:$EDX = CPUID GPR:$Function, GPR:$Leaf\": {\n        \"Desc\": [\"Calls in to the CPUID handler function to return emulated CPUID\"],\n        \"DestSize\": \"OpSize::i32Bit\",\n        \"HasSideEffects\": true\n      },\n      \"GPR:$EAX, GPR:$EDX = XGetBV GPR:$Function\": {\n        \"Desc\": [\"Calls in to the XCR handler function to return emulated XCR\"],\n        \"DestSize\": \"OpSize::i32Bit\",\n        \"HasSideEffects\": true\n      }\n    },\n    \"Moves\": {\n      \"GPR = Copy GPR:$Source\": {\n        \"Desc\": [\"GPR copy, generated by RA to split live ranges\"],\n        \"DestSize\": \"OpSize::i64Bit\"\n      }\n    },\n    \"StaticRA\": {\n      \"SSA = LoadRegister u32:$Reg, RegisterClass:$Class, OpSize:#Size\": {\n        \"Desc\": [\"Loads a value from the given register\",\n                 \"Size must match the execution mode.\"],\n        \"DestSize\": \"Size\"\n      },\n\n      \"GPR = LoadPF OpSize:#Size\": {\n        \"Desc\": [\"Loads raw PF\"],\n        \"DestSize\": \"Size\"\n      },\n\n      \"GPR = LoadAF OpSize:#Size\": {\n        \"Desc\": [\"Loads raw PF\"],\n        \"DestSize\": \"Size\"\n      },\n\n      \"SSA = StoreRegister SSA:$Value, OpSize:#Size\": {\n         \"HasSideEffects\": true,\n        \"Desc\": [\"Stores a value to a given register.\",\n                 \"Size must match the execution mode.\"],\n        \"DestSize\": \"Size\"\n      },\n\n      \"StorePF GPR:$Value, OpSize:#Size\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Stores raw PF\"],\n        \"DestSize\": \"Size\"\n      },\n\n      \"StoreAF GPR:$Value, OpSize:#Size\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Stores raw AF\"],\n        \"DestSize\": \"Size\"\n      }\n    },\n    \"Memory\": {\n      \"SSA = LoadContext OpSize:#ByteSize, RegisterClass:$Class, u32:$Offset\": {\n        \"Desc\": [\"Loads a value from the context with offset\",\n                 \"Dest = Ctx[Offset]\"\n                ],\n        \"DestSize\": \"ByteSize\",\n        \"EmitValidation\": [\n          \"($Class == RegClass::GPR && (#ByteSize == IR::OpSize::i8Bit || #ByteSize == IR::OpSize::i16Bit || #ByteSize == IR::OpSize::i32Bit || #ByteSize == IR::OpSize::i64Bit)) || $Class == RegClass::FPR\",\n          \"($Class == RegClass::FPR && (#ByteSize == IR::OpSize::i8Bit || #ByteSize == IR::OpSize::i16Bit || #ByteSize == IR::OpSize::i32Bit || #ByteSize == IR::OpSize::i64Bit || #ByteSize == IR::OpSize::i128Bit || #ByteSize == IR::OpSize::i256Bit)) || $Class == RegClass::GPR\",\n          \"!($Offset >= offsetof(Core::CPUState, gregs[0]) && $Offset < offsetof(Core::CPUState, gregs[16])) && \\\"Can't LoadContext to GPR\\\"\",\n          \"!($Offset >= offsetof(Core::CPUState, xmm.avx.data[0]) && $Offset < offsetof(Core::CPUState, xmm.avx.data[16])) && \\\"Can't LoadContext to XMM\\\"\"\n        ]\n      },\n\n      \"SSA:$Value1, SSA:$Value2 = LoadContextPair OpSize:#ByteSize, RegisterClass:$Class, u32:$Offset\": {\n        \"Desc\": [\"Loads a pair of values from the context with offset\",\n                 \"Value0 = Ctx[Offset], Value1 = Ctx[Offset + ByteSize]\"\n                ],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"ByteSize\",\n        \"EmitValidation\": [\n          \"($Class == RegClass::GPR && (#ByteSize == IR::OpSize::i8Bit || #ByteSize == IR::OpSize::i16Bit || #ByteSize == IR::OpSize::i32Bit || #ByteSize == IR::OpSize::i64Bit)) || $Class == RegClass::FPR\",\n          \"($Class == RegClass::FPR && (#ByteSize == IR::OpSize::i8Bit || #ByteSize == IR::OpSize::i16Bit || #ByteSize == IR::OpSize::i32Bit || #ByteSize == IR::OpSize::i64Bit || #ByteSize == IR::OpSize::i128Bit || #ByteSize == IR::OpSize::i256Bit)) || $Class == RegClass::GPR\",\n          \"!($Offset >= offsetof(Core::CPUState, gregs[0]) && $Offset < offsetof(Core::CPUState, gregs[16])) && \\\"Can't LoadContext to GPR\\\"\",\n          \"!($Offset >= offsetof(Core::CPUState, xmm.avx.data[0]) && $Offset < offsetof(Core::CPUState, xmm.avx.data[16])) && \\\"Can't LoadContext to XMM\\\"\"\n        ]\n      },\n\n      \"StoreContext OpSize:#ByteSize, RegisterClass:$Class, SSA:$Value, u32:$Offset\": {\n        \"Desc\": [\"Stores a value to the context with offset\",\n                 \"Ctx[Offset] = Value\",\n                 \"Zero Extends if value's type is too small\",\n                 \"Truncates if value's type is too large\"\n                ],\n        \"Inline\": [\"Zero\", \"\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"ByteSize\",\n        \"EmitValidation\": [\n          \"($Class == RegClass::GPR && (#ByteSize == IR::OpSize::i8Bit || #ByteSize == IR::OpSize::i16Bit || #ByteSize == IR::OpSize::i32Bit || #ByteSize == IR::OpSize::i64Bit)) || $Class == RegClass::FPR\",\n          \"($Class == RegClass::FPR && (#ByteSize == IR::OpSize::i8Bit || #ByteSize == IR::OpSize::i16Bit || #ByteSize == IR::OpSize::i32Bit || #ByteSize == IR::OpSize::i64Bit || #ByteSize == IR::OpSize::i128Bit || #ByteSize == IR::OpSize::i256Bit)) || $Class == RegClass::GPR\",\n          \"!($Offset >= offsetof(Core::CPUState, gregs[0]) && $Offset < offsetof(Core::CPUState, gregs[16])) && \\\"Can't StoreContext to GPR\\\"\",\n          \"!($Offset >= offsetof(Core::CPUState, xmm.avx.data[0]) && $Offset < offsetof(Core::CPUState, xmm.avx.data[16])) && \\\"Can't StoreContext to XMM\\\"\"\n        ]\n      },\n\n      \"StoreContextPair OpSize:#ByteSize, RegisterClass:$Class, SSA:$Value1, SSA:$Value2, u32:$Offset\": {\n        \"Desc\": [\"Stores a pair of values to the context with offset\",\n                 \"Ctx[Offset] = Value1, Ctx[Offset + ByteSize] = Value2\",\n                 \"Zero Extends if value's type is too small\",\n                 \"Truncates if value's type is too large\"\n                ],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"ByteSize\",\n        \"EmitValidation\": [\n          \"WalkFindRegClass($Value1) == $Class\",\n          \"WalkFindRegClass($Value2) == $Class\",\n          \"($Class == RegClass::GPR && (#ByteSize == IR::OpSize::i8Bit || #ByteSize == IR::OpSize::i16Bit || #ByteSize == IR::OpSize::i32Bit || #ByteSize == IR::OpSize::i64Bit)) || $Class == RegClass::FPR\",\n          \"($Class == RegClass::FPR && (#ByteSize == IR::OpSize::i8Bit || #ByteSize == IR::OpSize::i16Bit || #ByteSize == IR::OpSize::i32Bit || #ByteSize == IR::OpSize::i64Bit || #ByteSize == IR::OpSize::i128Bit || #ByteSize == IR::OpSize::i256Bit)) || $Class == RegClass::GPR\",\n          \"!($Offset >= offsetof(Core::CPUState, gregs[0]) && $Offset < offsetof(Core::CPUState, gregs[16])) && \\\"Can't StoreContext to GPR\\\"\",\n          \"!($Offset >= offsetof(Core::CPUState, xmm.avx.data[0]) && $Offset < offsetof(Core::CPUState, xmm.avx.data[16])) && \\\"Can't StoreContext to XMM\\\"\"\n        ]\n      },\n\n      \"SSA = LoadContextIndexed GPR:$Index, OpSize:#ByteSize, u32:$BaseOffset, u32:$Stride, RegisterClass:$Class\": {\n        \"Desc\": [\"Loads a value from the context with offset and indexed by SSA value\",\n                 \"Dest = Ctx[BaseOffset + Index * Stride]\"\n                ],\n        \"DestSize\": \"ByteSize\",\n        \"EmitValidation\": [\n          \"($Class == RegClass::GPR && (#ByteSize == IR::OpSize::i8Bit || #ByteSize == IR::OpSize::i16Bit || #ByteSize == IR::OpSize::i32Bit || #ByteSize == IR::OpSize::i64Bit)) || $Class == RegClass::FPR\",\n          \"($Class == RegClass::FPR && (#ByteSize == IR::OpSize::i8Bit || #ByteSize == IR::OpSize::i16Bit || #ByteSize == IR::OpSize::i32Bit || #ByteSize == IR::OpSize::i64Bit || #ByteSize == IR::OpSize::i128Bit || #ByteSize == IR::OpSize::i256Bit)) || $Class == RegClass::GPR\",\n          \"!($BaseOffset >= offsetof(Core::CPUState, gregs[0]) && $BaseOffset < offsetof(Core::CPUState, gregs[16])) && \\\"Can't LoadContextIndexed to GPR\\\"\",\n          \"!($BaseOffset >= offsetof(Core::CPUState, xmm.avx.data[0]) && $BaseOffset < offsetof(Core::CPUState, xmm.avx.data[16])) && \\\"Can't LoadContextIndexed to XMM\\\"\"\n        ]\n      },\n      \"StoreContextIndexed SSA:$Value, GPR:$Index, OpSize:#ByteSize, u32:$BaseOffset, u32:$Stride, RegisterClass:$Class\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Stores a value to the context with offset and indexed by SSA value\",\n                 \"Ctx[BaseOffset + Index * Stride] = Value\"\n                ],\n        \"DestSize\": \"ByteSize\",\n        \"EmitValidation\": [\n          \"WalkFindRegClass($Value) == $Class\",\n          \"($Class == RegClass::GPR && (#ByteSize == IR::OpSize::i8Bit || #ByteSize == IR::OpSize::i16Bit || #ByteSize == IR::OpSize::i32Bit || #ByteSize == IR::OpSize::i64Bit)) || $Class == RegClass::FPR\",\n          \"($Class == RegClass::FPR && (#ByteSize == IR::OpSize::i8Bit || #ByteSize == IR::OpSize::i16Bit || #ByteSize == IR::OpSize::i32Bit || #ByteSize == IR::OpSize::i64Bit || #ByteSize == IR::OpSize::i128Bit || #ByteSize == IR::OpSize::i256Bit)) || $Class == RegClass::GPR\",\n          \"!($BaseOffset >= offsetof(Core::CPUState, gregs[0]) && $BaseOffset < offsetof(Core::CPUState, gregs[16])) && \\\"Can't StoreContextIndexed to GPR\\\"\",\n          \"!($BaseOffset >= offsetof(Core::CPUState, xmm.avx.data[0]) && $BaseOffset < offsetof(Core::CPUState, xmm.avx.data[16])) && \\\"Can't StoreContextIndexed to XMM\\\"\"\n        ]\n      },\n      \"GPR = FormContextAddress OpSize:#Size, GPR:$Index, u32:$Stride\": {\n        \"Desc\": [\"Forms an address into the context structure indexed by SSA value\",\n                 \"Dest = Ctx + Index * Stride\",\n                 \"This allows backends to compute the address once and reuse it for multiple memory operations\",\n                 \"Stride must be a power of 2\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"#Size == IR::OpSize::i64Bit\"\n        ]\n      },\n\n      \"SpillRegister SSA:$Value, u32:$Slot, RegisterClass:$Class\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Spills an SSA value to memory\",\n                 \"Spill slots are register allocated and has live ranges calculated to handle slot calculation\",\n                 \"!Don't use this op. It is for RA to handle spilling and filling!\"\n                ],\n        \"EmitValidation\": [\n          \"WalkFindRegClass($Value) == $Class\"\n        ]\n      },\n\n      \"SSA = FillRegister OpSize:#Size, OpSize:#ElementSize, u32:$Slot, RegisterClass:$Class\": {\n        \"Desc\": [\"Fills a register from a spill slot\",\n                 \"Spill slots are register allocated and has live ranges calculated to handle slot calculation\",\n                 \"!Don't use this op. It is for RA to handle spilling and filling!\"\n                ],\n        \"DestSize\": \"Size\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"GPR = LoadNZCV\": {\n        \"Desc\": [\"Loads value of NZCV register\"],\n        \"DestSize\": \"OpSize::i32Bit\"\n      },\n\n      \"StoreNZCV GPR:$Value\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Stores value to NZCV register\"],\n        \"DestSize\": \"OpSize::i32Bit\"\n      },\n\n      \"GPR = LoadDF\": {\n        \"Desc\": [\"Loads the decimal flag from the context object in -1/1\",\n                  \"representation for easy consumption\"\n                ],\n        \"DestSize\": \"OpSize::i64Bit\"\n      },\n\n      \"SSA = LoadMem RegisterClass:$Class, OpSize:#Size, GPR:$Addr, GPR:$Offset, OpSize:$Align, MemOffsetType:$OffsetType, u8:$OffsetScale\": {\n        \"Inline\": [\"\", \"Mem\"],\n        \"DestSize\": \"Size\"\n      },\n\n      \"SSA:$Value1, SSA:$Value2 = LoadMemPair RegisterClass:$Class, OpSize:#Size, GPR:$Addr, u32:$Offset\": {\n        \"Desc\": [\"Load a pair of values from memory.\"],\n        \"DestSize\": \"Size\",\n        \"HasSideEffects\": true\n      },\n\n      \"StoreMem RegisterClass:$Class, OpSize:#Size, SSA:$Value, GPR:$Addr, GPR:$Offset, OpSize:$Align, MemOffsetType:$OffsetType, u8:$OffsetScale\": {\n        \"Desc\": [ \"Stores a value to memory.\",\n                  \"Zero Extends if value's type is too small\",\n                  \"Truncates if value's type is too large\"\n                ],\n        \"Inline\": [\"Zero\", \"\", \"Mem\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\"\n      },\n\n      \"StoreMemPair RegisterClass:$Class, OpSize:#Size, SSA:$Value1, SSA:$Value2, GPR:$Addr, u32:$Offset\": {\n        \"Desc\": [ \"Stores a pair of values to memory.\",\n                  \"Zero Extends if value's type is too small\",\n                  \"Truncates if value's type is too large\"\n                ],\n        \"Inline\": [\"Zero\", \"Zero\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\"\n      },\n\n      \"StoreMemX87SVEOptPredicate OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Value, GPR:$Addr\": {\n        \"Desc\": [ \"Stores a value to memory using SVE predicate mask that's designed\",\n                  \"specifically for use in the X87 SVE Ldst optimization.\" ],\n        \"DestSize\": \"RegisterSize\",\n        \"HasSideEffects\": true,\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = LoadMemX87SVEOptPredicate OpSize:#RegisterSize, OpSize:#ElementSize, GPR:$Addr\": {\n        \"Desc\": [ \"Loads a value to memory using SVE predicate mask that's designed\",\n                  \"specifically for use in the X87 SVE Ldst optimization.\" ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"SSA = LoadMemTSO RegisterClass:$Class, OpSize:#Size, GPR:$Addr, GPR:$Offset, OpSize:$Align, MemOffsetType:$OffsetType, u8:$OffsetScale\": {\n        \"Desc\": [\"Does a x86 TSO compatible load from memory. Offset must be Invalid().\"\n                ],\n        \"Inline\": [\"\", \"Memtso\"],\n        \"DestSize\": \"Size\"\n      },\n\n      \"StoreMemTSO RegisterClass:$Class, OpSize:#Size, SSA:$Value, GPR:$Addr, GPR:$Offset, OpSize:$Align, MemOffsetType:$OffsetType, u8:$OffsetScale\": {\n        \"Desc\": [\"Does a x86 TSO compatible store to memory. Offset must be Invalid().\"\n                ],\n        \"Inline\": [\"Zero\", \"\", \"Memtso\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\"\n      },\n\n      \"FPR = VLoadVectorMasked OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Mask, GPR:$Addr, GPR:$Offset, MemOffsetType:$OffsetType, u8:$OffsetScale\": {\n        \"Desc\": [\"Does a masked load similar to VPMASKMOV/VMASKMOV where the upper bit of each element\",\n                 \"determines whether or not that element will be loaded from memory\"],\n        \"ImplicitFlagClobber\": true,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"VStoreVectorMasked OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Mask, FPR:$Data, GPR:$Addr, GPR:$Offset, MemOffsetType:$OffsetType, u8:$OffsetScale\": {\n        \"Desc\": [\"Does a masked store similar to VPMASKMOV/VMASKMOV where the upper bit of each element\",\n                 \"determines whether or not that element will be stored to memory\"],\n        \"HasSideEffects\": true,\n        \"ImplicitFlagClobber\": true,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VLoadVectorGatherMasked OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Incoming, FPR:$Mask, GPR:$AddrBase, FPR:$VectorIndexLow, FPR:$VectorIndexHigh, OpSize:$VectorIndexElementSize, u8:$OffsetScale, u8:$DataElementOffsetStart, u8:$IndexElementOffsetStart, OpSize:$AddrSize\": {\n        \"Desc\": [\n          \"Does a masked load similar to VPGATHERD* where the upper bit of each element\",\n          \"determines whether or not that element will be loaded from memory.\",\n          \"Most of VSIB encoding is passed directly through to the IR operation.\"\n        ],\n        \"TiedSource\": 0,\n        \"ImplicitFlagClobber\": true,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"EmitValidation\": [\n          \"$VectorIndexElementSize == OpSize::i32Bit || $VectorIndexElementSize == OpSize::i64Bit\"\n        ]\n      },\n      \"FPR = VLoadVectorGatherMaskedQPS OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Incoming, FPR:$MaskReg, GPR:$AddrBase, FPR:$VectorIndexLow, FPR:$VectorIndexHigh, u8:$OffsetScale, OpSize:$AddrSize\": {\n        \"Desc\": [\n          \"Does a masked load similar to VPGATHERQPS where the upper bit of each element\",\n          \"determines whether or not that element will be loaded from memory.\",\n          \"Most of VSIB encoding is passed directly through to the IR operation.\",\n          \"Only supports the case of 32-bit data element sizes from 64-bit addresses\"\n        ],\n        \"TiedSource\": 0,\n        \"ImplicitFlagClobber\": true,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"EmitValidation\": [\n          \"ElementSize == OpSize::i32Bit\",\n          \"RegisterSize != FEXCore::IR::OpSize::i256Bit && \\\"What does 256-bit mean in this context?\\\"\"\n        ]\n      },\n      \"FPR = VLoadVectorElement OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$DstSrc, u8:$Index, GPR:$Addr\": {\n        \"Desc\": [\"Does a memory load to a single element of a vector.\",\n                 \"Leaves the rest of the vector's data intact.\",\n                 \"Matches arm64 ld1 semantics\"],\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"VStoreVectorElement OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Value, u8:$Index, GPR:$Addr\": {\n        \"Desc\": [\"Does a memory store of a single element of a vector.\",\n                 \"Matches arm64 st1 semantics\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VBroadcastFromMem OpSize:#RegisterSize, OpSize:#ElementSize, GPR:$Address\": {\n        \"Desc\": [\"Broadcasts an ElementSize value from memory into each element of a vector.\"],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"GPR = Push OpSize:#Size, OpSize:$ValueSize, GPR:$Value, GPR:$Addr\": {\n        \"Desc\": [\n          \"Pushes a value to the address, returning the new pointer after incrementing.\",\n          \"The address is decremented by the value size while.\",\n          \"The return value size is the size of the current operating mode\"\n        ],\n        \"TiedSource\": 1,\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\"\n      },\n      \"PushTwo OpSize:#Size, OpSize:$ValueSize, GPR:$Value1, GPR:$Value2, GPR:$Addr\": {\n        \"Desc\": [\n          \"Push two values to the address, incrementing the pointer in the place.\",\n          \"Fused post-RA so doesn't have a destination.\"\n        ],\n        \"HasSideEffects\": true\n      },\n      \"GPR = RMWHandle GPR:$Value\": {\n        \"Desc\": [\n          \"This is a special move that indicates the result will be poisoned by a non-SSA instruction writing to its result.\",\n          \"In effect, it serves to prevent invalid optimizations with non-SSA instructions.\"\n        ],\n        \"DestSize\": \"OpSize::i64Bit\",\n        \"HasSideEffects\": true,\n        \"TiedSource\": 0\n      },\n      \"GPR:$Addr, GPR:$Value = Pop OpSize:$Size, GPR:$Addr\": {\n        \"Desc\": [\n          \"Pops a value from the address, updating the new pointer after incrementing.\",\n          \"The address is incremented by the size via an RMW source/destintaion.\"\n        ],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\"\n      },\n      \"GPR:$Addr, GPR:$Value1, GPR:$Value2 = PopTwo OpSize:$Size, GPR:$Addr\": {\n        \"Desc\": [\"Pop two values from the address. Fused post-RA.\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\"\n      },\n      \"GPR = MemSet i1:$IsAtomic, OpSize:$Size, GPR:$Prefix, GPR:$Addr, GPR:$Value, GPR:$Length, GPR:$Direction\": {\n        \"Desc\": [\"Duplicates behaviour of x86 STOS repeat\",\n                 \"Returns the final address that gets generated without the prefix appended.\"\n                ],\n        \"Inline\": [\"\", \"\", \"Zero\", \"\", \"Any\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"OpSize::i64Bit\"\n      },\n      \"GPR:$DstAddress, GPR:$SrcAddress = MemCpy i1:$IsAtomic, OpSize:$Size, GPR:$Dest, GPR:$Src, GPR:$Length, GPR:$Direction\": {\n        \"Desc\": [\"Duplicates behaviour of x86 MOVS repeat\",\n                 \"Returns the final addresses after they have been incremented or decremented\"\n                ],\n        \"Inline\": [\"\", \"\", \"\", \"Any\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"OpSize::i64Bit\"\n      },\n      \"CacheLineClear GPR:$Addr, i1:$Serialize\": {\n        \"Desc\": [\"Does a 64 byte cacheline clear at the address specified\",\n                 \"Only clears the data cachelines. Doesn't do any zeroing\",\n                 \"Can skip serialization if requested.\"\n                ],\n        \"HasSideEffects\": true\n      },\n      \"CacheLineClean GPR:$Addr\": {\n        \"Desc\": [\"Does a 64 byte cacheline cleanat the address specified\",\n                 \"Only cleans the data cachelines. Doesn't do any zeroing\",\n                 \"Skips the invalidation step of the CacheLineClear operation\"\n                ],\n        \"HasSideEffects\": true\n      },\n      \"CacheLineZero GPR:$Addr\": {\n        \"Desc\": [\"Does a 64 byte zero at the address specified\",\n                 \"Writing zeroes to memory\",\n                 \"It is specifically non-temporal and weakly ordered\",\n                 \"This matches CLZero behaviour\"\n                ],\n        \"HasSideEffects\": true\n      },\n      \"Fence FenceType:$Fence\": {\n        \"Desc\": [\"Does a memory fence operation of the desired type\",\n                 \"FenceType::Load: Ensures load memory operations are serialized\",\n                 \"FenceType::Store: Ensures store memory operations are serialized\",\n                 \"FenceType::LoadStore: Ensures loads and store memory operations are serialized\",\n                 \"FenceType::Inst: Instruction barrier. Ensures all instructions after this point will be explicitly fetched\",\n                 \"Ensures the memory operations are globally visible\"\n                ],\n        \"HasSideEffects\": true\n      },\n      \"Prefetch i1:$ForStore, i1:$Stream, i8:$CacheLevel, GPR:$Addr, GPR:$Offset, MemOffsetType:$OffsetType, u8:$OffsetScale\": {\n        \"Desc\": [\"Does a cacheline prefetch operation\"\n                ],\n        \"Inline\": [\"\", \"Mem\"],\n        \"EmitValidation\": [\"CacheLevel > 0 && CacheLevel < 4\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"OpSize::i64Bit\"\n      },\n      \"VStoreNonTemporal OpSize:#RegisterSize, FPR:$Value, GPR:$Addr, i8:$Offset\": {\n        \"Desc\": [\"Does a non-temporal memory store of a vector.\",\n                 \"Matches arm64 SVE stnt1b semantics.\",\n                 \"Specifically weak-memory model ordered to match x86 non-temporal stores.\"\n        ],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"RegisterSize\",\n        \"EmitValidation\": [\n          \"RegisterSize == FEXCore::IR::OpSize::i128Bit || RegisterSize == FEXCore::IR::OpSize::i256Bit\",\n          \"Offset % IR::OpSizeToSize(RegisterSize) == 0\"\n        ]\n      },\n      \"VStoreNonTemporalPair OpSize:#RegisterSize, FPR:$ValueLow, FPR:$ValueHigh, GPR:$Addr, i8:$Offset\": {\n        \"Desc\": [\"Does a non-temporal memory store of two vector registers.\",\n                 \"Matches arm64 stnp semantics.\",\n                 \"Specifically weak-memory model ordered to match x86 non-temporal stores.\"\n        ],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"RegisterSize\",\n        \"EmitValidation\": [\n          \"RegisterSize == FEXCore::IR::OpSize::i128Bit\",\n          \"Offset % IR::OpSizeToSize(RegisterSize) == 0\"\n        ]\n      },\n      \"FPR = VLoadNonTemporal OpSize:#RegisterSize, GPR:$Addr, i8:$Offset\": {\n        \"Desc\": [\"Does a non-temporal memory load of a vector.\",\n                 \"Matches arm64 SVE ldnt1b semantics.\",\n                 \"Specifically weak-memory model ordered to match x86 non-temporal stores.\"\n        ],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"RegisterSize\",\n        \"EmitValidation\": [\n          \"RegisterSize == FEXCore::IR::OpSize::i128Bit || RegisterSize == FEXCore::IR::OpSize::i256Bit\",\n          \"Offset % IR::OpSizeToSize(RegisterSize) == 0\"\n        ]\n      },\n      \"ContextClear u32:$Offset, u32:$Size\": {\n        \"Desc\": [\n          \"Clears a region of the context by CLZero size\",\n          \"Both the offset and size alignment need to be by CLZero size\"\n        ],\n        \"HasSideEffects\": true,\n        \"EmitValidation\": [\n          \"Offset % 64 == 0\",\n          \"Size % 64 == 0\"\n        ]\n      }\n    },\n    \"Atomic\": {\n      \"GPR = CAS OpSize:#Size, GPR:$Expected, GPR:$Desired, GPR:$Addr\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Does a compare and swap of values to a memory location\",\n                 \"This mostly matches the C++ atomic_compare_exchange_strong function\",\n                 \"Dest = atomic_compare_exchange_strong(%Addr, %Expected, %Desired)\",\n                 \"Depending on if the value in %Addr is Expected the results destination will be different\",\n                 \"Behaves like the following but atomically\",\n                 \"Dest = %Expected\",\n                 \"if (deref(%Addr) != %Expected) Dest = deref(%Addr)\"\n                ],\n        \"TiedSource\": 0,\n        \"DestSize\": \"Size\",\n        \"ImplicitFlagClobber\": true,\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR:$Lo, GPR:$Hi = CASPair OpSize:#Size, GPR:$ExpectedLo, GPR:$ExpectedHi, GPR:$DesiredLo, GPR:$DesiredHi, GPR:$Addr\": {\n        \"Desc\": [\"Does a compare and exchange with two pairs of values\",\n                 \"ssa0 is the comparison value\",\n                 \"ssa1 is the new value\",\n                 \"ssa2 is the memory location\",\n                 \"Returns the lower & upper halves of the value in memory.\"\n                ],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = AtomicSwap OpSize:#Size, GPR:$Value, GPR:$Addr\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Atomic integer swap\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = AtomicFetchAdd OpSize:#Size, GPR:$Value, GPR:$Addr\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Atomic integer fetch and add\",\n                 \"Atomically fetches %Addr and adds %value to the memory location\",\n                 \"Dest is the value prior to operating on the value in memory\",\n                 \"IR layout must match NonFetch-variant, otherwise DCE IR optimization breaks!\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = AtomicFetchSub OpSize:#Size, GPR:$Value, GPR:$Addr\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Atomic integer fetch and sub\",\n                 \"Atomically fetches %Addr and subtracts %value to the memory location\",\n                 \"Dest is the value prior to operating on the value in memory\",\n                 \"IR layout must match NonFetch-variant, otherwise DCE IR optimization breaks!\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = AtomicFetchAnd OpSize:#Size, GPR:$Value, GPR:$Addr\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Atomic integer fetch and binary and\",\n                 \"Atomically fetches %Addr and binary ands %value to the memory location\",\n                 \"Dest is the value prior to operating on the value in memory\",\n                 \"IR layout must match NonFetch-variant, otherwise DCE IR optimization breaks!\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = AtomicFetchCLR OpSize:#Size, GPR:$Value, GPR:$Addr\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Atomic integer fetch and binary clear\",\n                 \"Atomically fetches %Addr and binary clears %value to the memory location\",\n                 \"Dest is the value prior to operating on the value in memory\",\n                 \"Matches ARM ldclral semantics\",\n                 \"eg: Dest[Addr] &= ~Value\",\n                 \"IR layout must match NonFetch-variant, otherwise DCE IR optimization breaks!\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = AtomicFetchOr OpSize:#Size, GPR:$Value, GPR:$Addr\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Atomic integer fetch and binary or\",\n                 \"Atomically fetches %Addr and binary ors %value to the memory location\",\n                 \"Dest is the value prior to operating on the value in memory\",\n                 \"IR layout must match NonFetch-variant, otherwise DCE IR optimization breaks!\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = AtomicFetchXor OpSize:#Size, GPR:$Value, GPR:$Addr\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Atomic integer fetch and binary exclusive or\",\n                 \"Atomically fetches %Addr and binary exclusive ors %value to the memory location\",\n                 \"Dest is the value prior to operating on the value in memory\",\n                 \"IR layout must match NonFetch-variant, otherwise DCE IR optimization breaks!\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = AtomicFetchNeg OpSize:#Size, GPR:$Addr\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Atomic integer fetch and two's complement negate\",\n                 \"Dest is the value prior to operating on the value in memory\",\n                 \"IR layout must match NonFetch-variant, otherwise DCE IR optimization breaks!\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"TelemetrySetValue GPR:$Value, u8:$TelemetryValueIndex\": {\n        \"HasSideEffects\": true,\n        \"Desc\": [\"Set Telemetry value if the passed in 32-bit value isn't zero.\",\n                 \"Only useful for 32-bit applications.\"\n                ],\n        \"ImplicitFlagClobber\": true,\n        \"DestSize\": \"OpSize::i64Bit\"\n      }\n    },\n    \"ALU\": {\n      \"GPR = EntrypointOffset OpSize:#Size, i64:$Offset\": {\n        \"Desc\": [\"Returns the <entrypoint> + Offset address\",\n                 \"When the size is 4 bytes then 32-bit overflow and underflow needs to work\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n\n      \"InlineEntrypointOffset OpSize:#Size, i64:$Offset\": {\n        \"Desc\": [\"Returns the <entrypoint> + Offset address\",\n                 \"When the size is 4 bytes then 32-bit overflow and underflow needs to work\"\n                ],\n        \"HasSideEffects\": true,\n        \"RAOverride\": \"0\",\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n\n      \"GPR = Constant i64:$Constant, ConstPad:$Pad{IR::ConstPad::NoPad}, i32:$MaxBytes{0}\": {\n        \"Desc\": [\"Generates a 64bit constant inside of a GPR\",\n                 \"Unsupported to create a constant in FPR\"\n                ],\n        \"DestSize\": \"OpSize::i64Bit\",\n        \"EmitValidation\": [\n          \"MaxBytes >= 0 && MaxBytes <= 8 && (MaxBytes & 1) == 0\",\n          \"MaxBytes == 0 || (Constant >> (MaxBytes * 8)) == 0\"\n        ]\n      },\n\n      \"InlineConstant i64:$Constant\": {\n        \"Desc\": [\"Generates a 64bit constant to be used directly, non-FPR\"],\n        \"HasSideEffects\": true,\n        \"RAOverride\": \"0\",\n        \"DestSize\": \"OpSize::i64Bit\"\n      },\n\n      \"GPR = CycleCounter i1:$SelfSynchronizingLoads\": {\n        \"Desc\": [\"Returns the host 64bit cycle counter\",\n                 \"Useful when emulating rdtsc\",\n                 \"Be careful, the frequency of this counter changes based on host\",\n                 \"On AArch64 make sure to query the CNTFRQ_EL0 system register to get the frequency\",\n                 \"On x86-64 make sure to query CPUID fn8000_0008[EDX_8] for constant TSC\",\n                 \"x86-64 constant frequency lives in MSR_PLATFORM_INFO. Which is only available to kernel\",\n                 \"Part of the ART frequency equation can be pulled from CPUID fn0000_0015[EBX & EAX]\",\n                 \"But it's missing the ART multiplier still?\",\n                 \"If the self-synchronizing flag is toggled then all instructions and loads must be completed before the cycle counter read\"\n                ],\n        \"DestSize\": \"OpSize::i64Bit\"\n      },\n\n      \"GPR = Neg OpSize:#Size, GPR:$Src, CondClass:$Cond{CondClass::AL}\": {\n        \"Desc\": [\"Integer negation, with optional predication\",\n                 \"Dest = Cond ? -Src : Src\",\n                 \"Will truncate to 64 or 32bits\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Not OpSize:#Size, GPR:$Src\": {\n        \"Desc\": [\"Integer binary not\",\n                 \"op:\",\n                 \"Dest = ~Src\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Popcount OpSize:#Size, GPR:$Src\": {\n        \"Desc\": [\"Population count of source register\",\n                 \"Returns the number of bits set\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = FindLSB OpSize:#Size, GPR:$Src\": {\n        \"Desc\": [\"Find least-significant-bit set\",\n                 \"Returns the index of the least significant bit set\",\n                 \"Undefined result if Src is zero.\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = FindMSB OpSize:#Size, GPR:$Src\": {\n        \"Desc\": [\"Find most-significant-bit set\",\n                 \"Returns the index of the most significant bit set\",\n                 \"Undefined result if Src is zero.\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = FindTrailingZeroes OpSize:#Size, GPR:$Src\": {\n        \"Desc\": [\"Counts the number of trailing zero bits in a GPR\",\n                 \"Returns the number of bits that are zero trailing\",\n                 \"In the case of zero returns the size in bits of the input\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = CountLeadingZeroes OpSize:#Size, GPR:$Src\": {\n        \"Desc\": [\"Counts the number of leading zero bits in a GPR\",\n                 \"Returns the number of bits that are zero leading\",\n                 \"In the case of zero returns the size in bits of the input\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Rev OpSize:#Size, GPR:$Src\": {\n        \"Desc\": [\"Reverses the byte order of the register\",\n                 \"Specifically 8bit byte swap size. (Not 16bit or 32bit word swapping)\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Rbit OpSize:#Size, GPR:$Src\": {\n        \"Desc\": [\"Reverses the bit order of the register\"],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Add OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [ \"Integer Add\",\n                  \"Will truncate to 64 or 32bits\"\n                ],\n        \"Inline\": [\"\", \"LargeAddSub\"],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Adc OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [ \"Integer Add with carry\",\n                  \"Will truncate to 64 or 32bits\"\n                ],\n        \"Inline\": [\"Zero\", \"\"],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Sbb OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [ \"Integer Subtract with carry/borrow\",\n                  \"Will truncate to 64 or 32bits\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = AddShift OpSize:#Size, GPR:$Src1, GPR:$Src2, ShiftType:$Shift{ShiftType::LSL}, u8:$ShiftAmount{0}\": {\n        \"Desc\": [ \"Integer Add with shifted register\",\n                  \"Will truncate to 64 or 32bits\",\n                  \"Dest = Src1 + (Src2 << ShiftAmount)\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\",\n          \"Shift != ShiftType::ROR\"\n        ]\n      },\n      \"GPR = AddWithFlags OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [ \"Integer add. Truncates and sets NZCV per AddNZCV\"],\n        \"Inline\": [\"\", \"LargeAddSub\"],\n        \"DestSize\": \"Size\",\n        \"HasSideEffects\": true,\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"AddNZCV OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Set NZCV for the sum of two GPRs\"],\n        \"Inline\": [\"\", \"LargeAddSub\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\"\n      },\n      \"SetSmallNZV OpSize:#Size, GPR:$Src\": {\n        \"Desc\": [\"Set NZV with a SETF instruction. Preserves CF.\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit\"\n        ]\n      },\n      \"CarryInvert\": {\n        \"Desc\": [\"Invert carry flag in NZCV\"],\n        \"HasSideEffects\": true\n      },\n      \"AXFlag GPR:$V_inv\": {\n        \"Desc\": [\"After an FCmp, converts NZCV flags from the Arm format to a mysterious eXternal format\",\n                 \"On FlagM2-less platforms, takes the inverted 1/0 overflow flag\"],\n        \"HasSideEffects\": true\n      },\n      \"GPR = Parity GPR:$Raw, i1:$Mask, i1:$Invert\": {\n        \"Desc\": [\"Calculates PF\"],\n        \"DestSize\": \"OpSize::i32Bit\"\n      },\n      \"RmifNZCV GPR:$Src, u8:$Rotate, u8:$Mask\": {\n        \"Desc\": [\"Rotate, mask, and insert into NZCV on FlagM platforms\"],\n        \"Inline\": [\"Zero\", \"\"],\n        \"HasSideEffects\": true\n      },\n      \"CondAddNZCV OpSize:#Size, GPR:$Src1, GPR:$Src2, CondClass:$Cond, u8:$FalseNZCV\": {\n        \"Desc\": [\"If condition is true, set NZCV per sum of GPRs, else force NZCV to a constant.\"],\n        \"Inline\": [\"Zero\", \"AddSub\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"CondSubNZCV OpSize:#Size, GPR:$Src1, GPR:$Src2, CondClass:$Cond, u8:$FalseNZCV\": {\n        \"Desc\": [\"If condition is true, set NZCV per difference of GPRs, else force NZCV to a constant.\"],\n        \"Inline\": [\"Zero\", \"AddSub\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = AdcWithFlags OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Adds and set NZCV for the sum of two GPRs and carry-in given as NZCV\"],\n        \"Inline\": [\"Zero\", \"\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = AdcZero OpSize:#Size, GPR:$Src1\": {\n        \"Desc\": [\"Adds GPR with inverted carry-in\"],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = AdcZeroWithFlags OpSize:#Size, GPR:$Src1\": {\n        \"Desc\": [\"Adds and set NZCV for the sum of GPR and inverted carry-in given as NZCV\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = SbbWithFlags OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Subtracts and set NZCV for the difference of two GPRs and carry-in given as NZCV\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"AdcNZCV OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Set NZCV for the sum of two GPRs and carry-in given as NZCV\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"SbbNZCV OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Set NZCV for the difference of two GPRs and carry-in given as NZCV\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Sub OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [ \"Integer Sub\",\n                  \"Will truncate to 64 or 32bits\"\n                ],\n        \"Inline\": [\"SubtractZero\", \"LargeAddSub\"],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = SubShift OpSize:#Size, GPR:$Src1, GPR:$Src2, ShiftType:$Shift{ShiftType::LSL}, u8:$ShiftAmount{0}\": {\n        \"Desc\": [ \"Integer Sub with shifted register\",\n                  \"Will truncate to 64 or 32bits\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\",\n          \"Shift != ShiftType::ROR\"\n        ]\n      },\n      \"GPR = SubWithFlags OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [ \"Integer Sub. Truncates and sets NZCV per SubNZCV\"],\n        \"Inline\": [\"SubtractZero\", \"LargeAddSub\"],\n        \"DestSize\": \"Size\",\n        \"HasSideEffects\": true,\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"CmpPairZ OpSize:#Size, GPR:$Src1Lo, GPR:$Src1Hi, GPR:$Src2Lo, GPR:$Src2Hi\": {\n        \"Desc\": [\"Compares register pairs and sets Z accordingly, preserving N/Z/V.\",\n                 \"This accelerates cmpxchg.\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"Size\"\n      },\n      \"SubNZCV OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Set NZCV for the difference of two GPRs. \",\n                 \"Carry flag uses arm64 definition, inverted x86.\",\n                 \"\"],\n        \"Inline\": [\"Zero\", \"LargeAddSub\"],\n        \"DestSize\": \"Size\",\n        \"HasSideEffects\": true\n      },\n      \"GPR = Or OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Integer binary or\"\n                ],\n        \"DestSize\": \"Size\",\n        \"Inline\": [\"\", \"Logical\"],\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Orlshl OpSize:#Size, GPR:$Src1, GPR:$Src2, u8:$BitShift\": {\n        \"Desc\": [\"Integer binary or with logical shift left\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Orlshr OpSize:#Size, GPR:$Src1, GPR:$Src2, u8:$BitShift\": {\n        \"Desc\": [\"Integer binary or with logical shift right\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Ornror OpSize:#Size, GPR:$Src1, GPR:$Src2, u8:$BitShift\": {\n        \"Desc\": [\"Integer binary or with NOT on second source and rotation right\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Xor OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Integer binary exclusive or\"],\n        \"Inline\": [\"\", \"Logical\"],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = XorShift OpSize:#Size, GPR:$Src1, GPR:$Src2, ShiftType:$Shift{ShiftType::LSL}, u8:$ShiftAmount{0}\": {\n        \"Desc\": [ \"Integer binary exclusive or with shifted register\"],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = XornShift OpSize:#Size, GPR:$Src1, GPR:$Src2, ShiftType:$Shift{ShiftType::LSL}, u8:$ShiftAmount{0}\": {\n        \"Desc\": [ \"Integer binary exclusive or not with shifted register\"],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = And OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Integer binary and\"],\n        \"Inline\": [\"\", \"Logical\"],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = AndShift OpSize:#Size, GPR:$Src1, GPR:$Src2, ShiftType:$Shift{ShiftType::LSL}, u8:$ShiftAmount{0}\": {\n        \"Desc\": [ \"Integer binary and with shifted register\"],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = AndWithFlags OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Integer binary and\"\n                ],\n        \"Inline\": [\"\", \"Logical\"],\n        \"DestSize\": \"Size\",\n        \"TiedSource\": 0,\n        \"HasSideEffects\": true\n      },\n      \"GPR = Andn OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Integer binary AND NOT. Performs the equivalent of Src1 & ~Src2\"],\n        \"DestSize\": \"Size\",\n        \"Inline\": [\"\", \"Logical\"],\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"TestNZ OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Set NZCV for the binary AND of two GPRs, setting N and Z accordingly and zeroing C and V\"],\n        \"Inline\": [\"\", \"Logical\"],\n        \"DestSize\": \"Size\",\n        \"HasSideEffects\": true\n      },\n      \"TestZ OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Set NZCV for the binary AND of two GPRs, setting Z accordingly and zeroing C and V. N is undefined.\"],\n        \"DestSize\": \"Size\",\n        \"HasSideEffects\": true\n      },\n      \"GPR = Lshl OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Integer logical shift left\"],\n        \"Inline\": [\"\", \"Any\"],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Lshr OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Integer logical shift right\"],\n        \"Inline\": [\"\", \"Any\"],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Ashr OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Integer arithmetic shift right\"],\n        \"Inline\": [\"\", \"Any\"],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = ShiftFlags OpSize:$Size, GPR:$Result, GPR:$Src1, ShiftType:$Shift, GPR:$Src2, GPR:$PFInput, i1:$InvertCF\": {\n        \"Desc\": [\"Set NZCV flags for specified variable integer shift with given result.\",\n                 \"Returns updated raw PF.\"],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"OpSize::i64Bit\"\n      },\n      \"RotateFlags OpSize:$Size, GPR:$Result, GPR:$Shift, i1:$Left\": {\n        \"Desc\": [\"Set NZCV flags for specified variable integer rotate with given result.\"],\n        \"HasSideEffects\": true\n      },\n      \"GPR = Ror OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Integer rotate right\"],\n        \"Inline\": [\"\", \"Any\"],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Mul OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Integer signed multiplication\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = UMul OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Integer unsigned multiplication\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = UMull GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Integer unsigned multiplication long\",\n                 \"Multiplies two 32-bit numbers, returning a 64-bit destination register.\"\n                ],\n        \"DestSize\": \"FEXCore::IR::OpSize::i64Bit\"\n      },\n      \"GPR = SMull GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Integer signed multiplication long\",\n                 \"Multiplies two 32-bit numbers, returning a 64-bit destination register.\"\n                ],\n        \"DestSize\": \"FEXCore::IR::OpSize::i64Bit\"\n      },\n      \"GPR = MulH OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Integer signed multiply returning high results\",\n                 \"op:\",\n                 \"Tmp <size * 2> = Src1 * Src2;\",\n                 \"Dest = Tmp >> (size * 8);\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = UMulH OpSize:#Size, GPR:$Src1, GPR:$Src2\": {\n        \"Desc\": [\"Integer unsigned multiply returning high results\",\n                 \"op:\",\n                 \"Tmp <size * 2> = Src1 * Src2;\",\n                 \"Dest = Tmp >> (size * 8);\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Bfi OpSize:#Size, u8:$Width, u8:$lsb, GPR:$Dest, GPR:$Src\": {\n        \"Desc\": [\"Copies a bitfield from one GPR to another\",\n                 \"The source bitfield is from Src[Width:0]\",\n                 \"The bitfield is copied in to Dest[(Width + lsb):lsb]\"\n                ],\n        \"DestSize\": \"Size\",\n        \"TiedSource\": 0,\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\",\n          \"(Width + lsb) <= IR::OpSizeAsBits(Size)\"\n        ]\n      },\n      \"GPR = Bfxil OpSize:#Size, u8:$Width, u8:$lsb, GPR:$Dest, GPR:$Src\": {\n        \"Desc\": [\"Copies a bitfield from one GPR to another\",\n                 \"Inserting in to the low bits of the destination\",\n                 \"The source bitfield is from Src[(Width + lsb):lsb]\",\n                 \"The bitfield is copied in to Dest[Width:0]\"\n                ],\n        \"DestSize\": \"Size\",\n        \"TiedSource\": 0,\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\",\n          \"(Width + lsb) <= IR::OpSizeAsBits(Size)\"\n        ]\n      },\n      \"GPR = Bfe OpSize:#Size, u8:$Width, u8:$lsb, GPR:$Src\": {\n        \"Desc\": [\"Extracts a bitfield from one GPR with zext\",\n                 \"The source bitfield is from Src[Width:0]\",\n                 \"The bitfield is then zero extended\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\",\n          \"(Width + lsb) <= IR::OpSizeAsBits(Size)\"\n        ]\n      },\n      \"GPR = Sbfe OpSize:#Size, u8:$Width, u8:$lsb, GPR:$Src\": {\n        \"Desc\": [\"Extracts a bitfield from one GPR with sext\",\n                 \"The source bitfield is from Src[Width:0]\",\n                 \"The bitfield is then sign extended\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\",\n          \"(Width + lsb) <= IR::OpSizeAsBits(Size)\"\n        ]\n      },\n      \"GPR = NZCVSelect OpSize:#ResultSize, CondClass:$Cond, GPR:$TrueVal, GPR:$FalseVal\": {\n        \"Desc\": [\"Select based on value in NZCV flags\",\n                 \"op:\",\n                 \"Dest = Cond ? TrueVal : FalseVal\"\n                ],\n        \"DestSize\": \"ResultSize\",\n        \"EmitValidation\": [\n          \"ResultSize == FEXCore::IR::OpSize::i32Bit || ResultSize == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"FPR = NZCVSelectV OpSize:#ResultSize, CondClass:$Cond, FPR:$TrueVal, FPR:$FalseVal\": {\n        \"Desc\": [\n          \"Select based on value in NZCV flags, where TrueVal and FalseVal are both FPRs.\",\n          \"op:\",\n          \"Dest = Cond ? TrueVal : FalseVal\"\n        ],\n        \"DestSize\": \"ResultSize\"\n      },\n      \"GPR = NZCVSelectIncrement OpSize:#ResultSize, CondClass:$Cond, GPR:$TrueVal, GPR:$FalseVal\": {\n        \"Desc\": [\"Select and increment based on value in NZCV flags\",\n                 \"op:\",\n                 \"Dest = Cond ? TrueVal : (FalseVal + 1)\"\n                ],\n        \"DestSize\": \"ResultSize\",\n        \"EmitValidation\": [\n          \"ResultSize == FEXCore::IR::OpSize::i32Bit || ResultSize == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = Select OpSize:#ResultSize, OpSize:$CompareSize, CondClass:$Cond, SSA:$Cmp1, SSA:$Cmp2, GPR:$TrueVal, GPR:$FalseVal\": {\n        \"Desc\": [\"Ternary selection of GPRs\",\n                 \"op:\",\n                 \"Dest = Cmp1 <Cond> Cmp2 ? TrueVal : FalseVal\"\n                ],\n        \"Inline\": [\"\", \"AddSub\", \"\", \"\"],\n        \"DestSize\": \"ResultSize\",\n        \"ImplicitFlagClobber\": true,\n        \"EmitValidation\": [\n          \"CompareSize == FEXCore::IR::OpSize::i32Bit || CompareSize == FEXCore::IR::OpSize::i64Bit || CompareSize == FEXCore::IR::OpSize::i128Bit\",\n          \"ResultSize == FEXCore::IR::OpSize::i32Bit || ResultSize == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = MaskGenerateFromBitWidth GPR:$BitWidth\": {\n        \"Desc\": [\"Generates a bit mask from with a value from [0, 63]\",\n                 \"0 is special cased to full-mask\",\n                 \"Special operation for SSE4a bitmask generation.\"\n        ],\n        \"DestSize\": \"FEXCore::IR::OpSize::i64Bit\",\n        \"ImplicitFlagClobber\": true\n      },\n\n      \"GPR = Extr OpSize:#Size, GPR:$Upper, GPR:$Lower, u8:$LSB\": {\n        \"Desc\": [\"Concats the two GPRs to create a value that is the size of the full two GPRs\",\n                 \"It then extracts a bitfield width that size of a GPR from the LSB\",\n                 \"Valid LSB range is 0-31 for 32bit and 0-63 for 64bit\",\n                 \"<Size * 2> ConcatValue = $Upper:$Lower\",\n                 \"Result = ConcatValue<LSB+Size - 1: LSB>\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n      \"GPR = PDep OpSize:#Size, GPR:$Input, GPR:$Mask\": {\n        \"Desc\": [\"Performs a parallel bit deposit.\",\n                 \"Takes the contiguous low-order bits and deposits them into\",\n                 \"the destination at the locations specified by the Mask.\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n\n      \"GPR = PExt OpSize:#Size, GPR:$Input, GPR:$Mask\": {\n        \"Desc\": [\"Performs a parallel bit extract.\",\n                 \"Each bit set in the mask will select the corresponding bit in the Input\",\n                 \"and transfers them to the lower contiguous bits in the destination.\"\n                ],\n        \"DestSize\": \"Size\",\n        \"EmitValidation\": [\n          \"Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n\n      \"GPR:$Quotient, GPR:$Remainder = Div OpSize:#Size, GPR:$Lower, GPR:$Upper, GPR:$Divisor\": {\n        \"Desc\": [\"Integer long signed division returning lower bits\",\n                 \"The Lower and Upper registers will be concated together to generate a dividend twice the size\",\n                 \"Then the divisor divides the temporary dividend and returns the results in the original sized register\",\n                 \"If Upper is invalid, this is a non-long division.\"\n                ],\n        \"DestSize\": \"Size\",\n        \"HasSideEffects\": true\n      },\n      \"GPR:$Quotient, GPR:$Remainder = UDiv OpSize:#Size, GPR:$Lower, GPR:$Upper, GPR:$Divisor\": {\n        \"Desc\": [\"Integer long unsigned division returning lower bits\",\n                 \"The Lower and Upper registers will be concated together to generate a dividend twice the size\",\n                 \"Then the divisor divides the temporary dividend and returns the results in the original sized register\",\n                 \"If Upper is invalid, this is a non-long division.\"\n                ],\n        \"DestSize\": \"Size\",\n        \"HasSideEffects\": true\n      },\n\n      \"Float to GPR\": {\"Ignore\": 1},\n      \"GPR = VExtractToGPR OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, u8:$Index\": {\n        \"Desc\": [\"Extracts an element from a vector and places it in a GPR\",\n                 \"The element that is extracted from the vector is zero extended to the GPR size\"\n                ],\n        \"DestSize\": \"ElementSize\"\n      },\n\n      \"GPR = Float_ToGPR_S OpSize:#DestElementSize, OpSize:$SrcElementSize, FPR:$Scalar\": {\n        \"Desc\": [\"Moves the scalar element to a GPR with conversion\",\n                 \"Converts the 32bit or 64bit float to an signed integer\",\n                 \"Rounding mode determined by host flag's rounding mode\"\n                ],\n        \"DestSize\": \"DestElementSize\"\n      },\n\n      \"GPR = Float_ToGPR_ZS OpSize:#DestElementSize, OpSize:$SrcElementSize, FPR:$Scalar\": {\n        \"Desc\": [\"Moves the scalar element to a GPR with conversion\",\n                 \"Converts the 32bit or 64bit float to an signed integer rounding towards zero (Truncating)\"\n                ],\n        \"DestSize\": \"DestElementSize\"\n      },\n\n      \"FCmp OpSize:$ElementSize, FPR:$Scalar1, FPR:$Scalar2\": {\n        \"Desc\": [\"Does a scalar unordered compare and sets NZCV accordingly.\",\n                 \"NZCV follows Arm conventions, a separate AXFLAG instruction is required for x86\",\n                 \"Ordering flag result is true if either float input is NaN\"\n                ],\n        \"HasSideEffects\": true\n      }\n    },\n    \"VectorScalar\": {\n      \"FPR = VFAddScalarInsert OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, i1:$ZeroUpperBits\": {\n        \"Desc\": [\"Does a scalar 'add' between Vector1 and Vector2.\",\n                 \"Inserting the result in to the lower element of Vector1 and returning the results.\",\n                 \"If ZeroUpperBits is set then in a 256-bit wide operation it will zero the upper 128-bits of the destination.\",\n                 \"For 128-bit operation this matches SSE insert semantics.\",\n                 \"For 256-bit operation with ZeroUpperBits, this matches AVX insert semantics.\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFSubScalarInsert OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, i1:$ZeroUpperBits\": {\n        \"Desc\": [\"Does a scalar 'sub' between Vector1 and Vector2.\",\n                 \"Inserting the result in to the lower element of Vector1 and returning the results.\",\n                 \"If ZeroUpperBits is set then in a 256-bit wide operation it will zero the upper 128-bits of the destination.\",\n                 \"For 128-bit operation this matches SSE insert semantics.\",\n                 \"For 256-bit operation with ZeroUpperBits, this matches AVX insert semantics.\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFMulScalarInsert OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, i1:$ZeroUpperBits\": {\n        \"Desc\": [\"Does a scalar 'mul' between Vector1 and Vector2.\",\n                 \"Inserting the result in to the lower element of Vector1 and returning the results.\",\n                 \"If ZeroUpperBits is set then in a 256-bit wide operation it will zero the upper 128-bits of the destination.\",\n                 \"For 128-bit operation this matches SSE insert semantics.\",\n                 \"For 256-bit operation with ZeroUpperBits, this matches AVX insert semantics.\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFDivScalarInsert OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, i1:$ZeroUpperBits\": {\n        \"Desc\": [\"Does a scalar 'div' between Vector1 and Vector2.\",\n                 \"Inserting the result in to the lower element of Vector1 and returning the results.\",\n                 \"If ZeroUpperBits is set then in a 256-bit wide operation it will zero the upper 128-bits of the destination.\",\n                 \"For 128-bit operation this matches SSE insert semantics.\",\n                 \"For 256-bit operation with ZeroUpperBits, this matches AVX insert semantics.\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFMinScalarInsert OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, i1:$ZeroUpperBits\": {\n        \"Desc\": [\"Does a scalar 'min' between Vector1 and Vector2.\",\n                 \"Inserting the result in to the lower element of Vector1 and returning the results.\",\n                 \"If ZeroUpperBits is set then in a 256-bit wide operation it will zero the upper 128-bits of the destination.\",\n                 \"For 128-bit operation this matches SSE insert semantics.\",\n                 \"For 256-bit operation with ZeroUpperBits, this matches AVX insert semantics.\",\n                 \"Additionally matches x86 zero and NaN semantics\",\n                 \"If both source operands are zero, return the second operand (in the case of negative and positive zero)\",\n                 \"If either source operand is NaN then return the second operand.\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"ImplicitFlagClobber\": true\n      },\n      \"FPR = VFMaxScalarInsert OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, i1:$ZeroUpperBits\": {\n        \"Desc\": [\"Does a scalar 'max' between Vector1 and Vector2.\",\n                 \"Inserting the result in to the lower element of Vector1 and returning the results.\",\n                 \"If ZeroUpperBits is set then in a 256-bit wide operation it will zero the upper 128-bits of the destination.\",\n                 \"For 128-bit operation this matches SSE insert semantics.\",\n                 \"For 256-bit operation with ZeroUpperBits, this matches AVX insert semantics.\",\n                 \"Additionally matches x86 zero and NaN semantics\",\n                 \"If both source operands are zero, return the second operand (in the case of negative and positive zero)\",\n                 \"If either source operand is NaN then return the second operand.\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"ImplicitFlagClobber\": true\n      },\n      \"FPR = VFSqrtScalarInsert OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, i1:$ZeroUpperBits\": {\n        \"Desc\": [\"Does a scalar 'sqrt' on Vector2, inserting in to Vector1 and storing in to the destination.\",\n                 \"Inserting the result in to the lower element of Vector1 and returning the results.\",\n                 \"If ZeroUpperBits is set then in a 256-bit wide operation it will zero the upper 128-bits of the destination.\",\n                 \"For 128-bit operation this matches SSE insert semantics.\",\n                 \"For 256-bit operation with ZeroUpperBits, this matches AVX insert semantics.\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFRSqrtScalarInsert OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, i1:$ZeroUpperBits\": {\n        \"Desc\": [\"Does a scalar 'rsqrt' on Vector2, inserting in to Vector1 and storing in to the destination.\",\n                 \"Inserting the result in to the lower element of Vector1 and returning the results.\",\n                 \"If ZeroUpperBits is set then in a 256-bit wide operation it will zero the upper 128-bits of the destination.\",\n                 \"For 128-bit operation this matches SSE insert semantics.\",\n                 \"For 256-bit operation with ZeroUpperBits, this matches AVX insert semantics.\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFRecpScalarInsert OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, i1:$ZeroUpperBits\": {\n        \"Desc\": [\"Does a scalar 'recip' on Vector2, inserting in to Vector1 and storing in to the destination.\",\n                 \"Inserting the result in to the lower element of Vector1 and returning the results.\",\n                 \"If ZeroUpperBits is set then in a 256-bit wide operation it will zero the upper 128-bits of the destination.\",\n                 \"For 128-bit operation this matches SSE insert semantics.\",\n                 \"For 256-bit operation with ZeroUpperBits, this matches AVX insert semantics.\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFToFScalarInsert OpSize:#RegisterSize, OpSize:#DstElementSize, OpSize:$SrcElementSize, FPR:$Vector1, FPR:$Vector2, i1:$ZeroUpperBits\": {\n        \"Desc\": [\"Does a scalar 'cvt' between Vector1 and Vector2.\",\n                 \"Inserting the result in to the lower element of Vector1 and returning the results.\",\n                 \"If ZeroUpperBits is set then in a 256-bit wide operation it will zero the upper 128-bits of the destination.\",\n                 \"For 128-bit operation this matches SSE insert semantics.\",\n                 \"For 256-bit operation with ZeroUpperBits, this matches AVX insert semantics.\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"DstElementSize\"\n      },\n      \"FPR = VSToFVectorInsert OpSize:#RegisterSize, OpSize:#DstElementSize, OpSize:$SrcElementSize, FPR:$Vector1, FPR:$Vector2, i8:$HasTwoElements, i1:$ZeroUpperBits\": {\n        \"Desc\": [\"Does a Vector 'scvt' between Vector1 and Vector2.\",\n                 \"Inserting the result in to the lower element of Vector1 and returning the results.\",\n                 \"If ZeroUpperBits is set then in a 256-bit wide operation it will zero the upper 128-bits of the destination.\",\n                 \"For 128-bit operation this matches SSE insert semantics.\",\n                 \"For 256-bit operation with ZeroUpperBits, this matches AVX insert semantics.\",\n                 \"HasTwoElements is slightly different than most of these scalar operations.\",\n                 \"Handles the edge case of cvtpi2ps xmm0, mm0 which is two elements in the lower 64-bits\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"DstElementSize\"\n      },\n      \"FPR = VSToFGPRInsert OpSize:#RegisterSize, OpSize:#DstElementSize, OpSize:$SrcElementSize, FPR:$Vector, GPR:$Src, i1:$ZeroUpperBits\": {\n        \"Desc\": [\"Does a scalar 'cvt' between Vector1 and GPR.\",\n                 \"Inserting the result in to the lower element of Vector1 and returning the results.\",\n                 \"If ZeroUpperBits is set then in a 256-bit wide operation it will zero the upper 128-bits of the destination.\",\n                 \"For 128-bit operation this matches SSE insert semantics.\",\n                 \"For 256-bit operation with ZeroUpperBits, this matches AVX insert semantics.\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"DstElementSize\"\n      },\n      \"FPR = VFToIScalarInsert OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, RoundType:$Round, i1:$ZeroUpperBits\": {\n        \"Desc\": [\"Does a scalar round float to integral on Vector2, inserting in to Vector1 and storing in to the destination.\",\n                 \"Rounding mode determined by argument\",\n                 \"Inserting the result in to the lower element of Vector1 and returning the results.\",\n                 \"If ZeroUpperBits is set then in a 256-bit wide operation it will zero the upper 128-bits of the destination.\",\n                 \"For 128-bit operation this matches SSE insert semantics.\",\n                 \"For 256-bit operation with ZeroUpperBits, this matches AVX insert semantics.\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFCMPScalarInsert OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, FloatCompareOp:$Op, i1:$ZeroUpperBits\": {\n        \"Desc\": [\"Does a scalar 'cmp' between Vector1 and Vecto2, inserting in to Vector1 and storing in to the destination.\",\n                 \"Compare op determined by argument\",\n                 \"Inserting the result in to the lower element of Vector1 and returning the results.\",\n                 \"If ZeroUpperBits is set then in a 256-bit wide operation it will zero the upper 128-bits of the destination.\",\n                 \"For 128-bit operation this matches SSE insert semantics.\",\n                 \"For 256-bit operation with ZeroUpperBits, this matches AVX insert semantics.\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFMLAScalarInsert OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Upper, FPR:$Vector1, FPR:$Vector2, FPR:$Addend\": {\n        \"Desc\": [\n          \"Dest = (Vector1 * Vector2) + Addend\",\n          \"This explicitly matches x86 FMA semantics because ARM semantics are mind-bending.\",\n          \"Upper elements copied from Upper\"\n        ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"TiedSource\": 0\n      },\n      \"FPR = VFMLSScalarInsert OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Upper, FPR:$Vector1, FPR:$Vector2, FPR:$Addend\": {\n        \"Desc\": [\n          \"Dest = (Vector1 * Vector2) - Addend\",\n          \"This explicitly matches x86 FMA semantics because ARM semantics are mind-bending.\",\n          \"Upper elements copied from Upper\"\n        ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"TiedSource\": 0\n      },\n      \"FPR = VFNMLAScalarInsert OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Upper, FPR:$Vector1, FPR:$Vector2, FPR:$Addend\": {\n        \"Desc\": [\n          \"Dest = (-Vector1 * Vector2) + Addend\",\n          \"This explicitly matches x86 FMA semantics because ARM semantics are mind-bending.\",\n          \"Upper elements copied from Upper\"\n        ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"TiedSource\": 0\n      },\n      \"FPR = VFNMLSScalarInsert OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Upper, FPR:$Vector1, FPR:$Vector2, FPR:$Addend\": {\n        \"Desc\": [\n          \"Dest = (-Vector1 * Vector2) - Addend\",\n          \"This explicitly matches x86 FMA semantics because ARM semantics are mind-bending.\",\n          \"Upper elements copied from Upper\"\n        ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"TiedSource\": 0\n      },\n      \"FPR = VFCopySign OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1,  FPR:$Vector2\": {\n        \"Desc\": [\"Returns a vector where each element has has the magniture of each corresponding element in vector1 and the sign of vector 2.\"],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"TiedSource\": 0\n      }\n    },\n    \"Vector\": {\n      \"FPR = VMov OpSize:#RegisterSize, FPR:$Source\": {\n        \"Desc\" : [\"Copy vector register\",\n                  \"When Register size is smaller than Source register size,\",\n                  \"this op is defined to truncate and zero extend\"\n                 ],\n        \"DestSize\": \"RegisterSize\"\n      },\n\n      \"FPR = VectorImm OpSize:#RegisterSize, OpSize:#ElementSize, u8:$Immediate, u8:$ShiftAmount{0}\": {\n        \"Desc\": [\"Generates a vector with each element containg the immediate zexted\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = LoadNamedVectorConstant OpSize:#RegisterSize, NamedVectorConstant:$Constant\": {\n        \"Desc\": [\"Load a named vector constant.\",\n                 \"The list of vector constants can be found in <FEXCore/IR/IR.h>\"\n                ],\n        \"DestSize\": \"RegisterSize\"\n      },\n      \"FPR = LoadNamedVectorIndexedConstant OpSize:#RegisterSize, IndexNamedVectorConstant:$Constant, u32:$Index\": {\n        \"Desc\": [\"Load a named vector constant from Indexable table.\",\n                 \"Index needs to be aligned register size.\",\n                 \"The list of indexable vector constants can be found in <FEXCore/IR/IR.h>\"\n                ],\n        \"DestSize\": \"RegisterSize\"\n      },\n      \"FPR = VNeg OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VNot OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VAbs OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\"Does an signed integer absolute\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VPopcount OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\"Does a popcount for each element of the register\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VAddV OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\"Does a horizontal vector add of elements across the source vector\",\n                 \"Result is a zero extended scalar\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VUMinV OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\"Does a horizontal vector unsigned minimum of elements across the source vector\",\n                 \"Result is a zero extended scalar\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VUMaxV OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\"Does a horizontal vector unsigned maximum of elements across the source vector\",\n                 \"Result is a zero extended scalar\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFAbs OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VFNeg OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VFRecp OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\n          \"Reciprocal value - matches the precision required by the x86 spec.\",\n          \"It has a relative error of at most 1.5 * 2^-12\"\n        ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFRecpPrecision OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\n          \"Similar to VFRecp but carrying more precision for 3DNow!\",\n          \"It provides at least 14 bits precision, with a relative error of at most 2^-14\"\n        ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"EmitValidation\": [\n          \"RegisterSize == FEXCore::IR::OpSize::i64Bit || RegisterSize == FEXCore::IR::OpSize::i32Bit\",\n          \"ElementSize == FEXCore::IR::OpSize::i32Bit\"\n        ]\n      },\n\n      \"FPR = VFSqrt OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VFRSqrt OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\n          \"Reciprocal Square Root - matches the precision required by the x86 spec.\",\n          \"It has a relative error of at most 1.5 * 2^-12\"\n        ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFRSqrtPrecision OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\n          \"Similar to VFRSqrt but carrying more precision for 3DNow!\",\n          \"It provides at least 15 bits precision, with a relative error of at most 2^-15\"\n        ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"EmitValidation\": [\n          \"RegisterSize == FEXCore::IR::OpSize::i64Bit || RegisterSize == FEXCore::IR::OpSize::i32Bit\",\n          \"ElementSize == FEXCore::IR::OpSize::i32Bit\"\n        ]\n      },\n\n      \"FPR = VCMPEQZ OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VCMPGTZ OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\"Vector compare signed greater than\",\n                 \"Each element is compared, if the result is true then the resulting element is ~0, else zero\",\n                 \"Compares the vector against zero\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VCMPLTZ OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\"Vector compare signed less than\",\n                 \"Each element is compared, if the result is true then the resulting element is ~0, else zero\",\n                 \"Compares the vector against zero\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VDupElement OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, u8:$Index\": {\n        \"Desc\": [\"Duplicates one element from the source register across the whole register\"],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VShlI OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, u8:$BitShift\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"EmitValidation\": [\n          \"ElementSize >= FEXCore::IR::OpSize::i8Bit && ElementSize <= FEXCore::IR::OpSize::i64Bit\",\n          \"BitShift > 0\"\n        ]\n      },\n      \"FPR = VUShrI OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, u8:$BitShift\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"EmitValidation\": [\n          \"ElementSize >= FEXCore::IR::OpSize::i8Bit && ElementSize <= FEXCore::IR::OpSize::i64Bit\",\n          \"BitShift > 0\"\n        ]\n      },\n      \"FPR = VUShraI OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$DestVector, FPR:$Vector, u8:$BitShift\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"EmitValidation\": [\n          \"ElementSize >= FEXCore::IR::OpSize::i8Bit && ElementSize <= FEXCore::IR::OpSize::i64Bit\",\n          \"BitShift > 0 && BitShift <= IR::OpSizeAsBits(ElementSize)\"\n        ]\n      },\n      \"FPR = VSShrI OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, u8:$BitShift\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"EmitValidation\": [\n          \"ElementSize >= FEXCore::IR::OpSize::i8Bit && ElementSize <= FEXCore::IR::OpSize::i64Bit\",\n          \"BitShift > 0\"\n        ]\n      },\n\n      \"FPR = VUShrNI OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, u8:$BitShift\": {\n        \"TiedSource\": 0,\n        \"Desc\": \"Unsigned shifts right each element and then narrows to the next lower element size\",\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize >> 1\",\n        \"EmitValidation\": [\n          \"ElementSize >= FEXCore::IR::OpSize::i16Bit && ElementSize <= FEXCore::IR::OpSize::i64Bit\",\n          \"BitShift <= IR::OpSizeAsBits(ElementSize)\"\n        ]\n      },\n\n      \"FPR = VUShrNI2 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$VectorLower, FPR:$VectorUpper, u8:$BitShift\": {\n        \"TiedSource\": 0,\n        \"Desc\": [\"Unsigned shifts right each element and then narrows to the next lower element size\",\n                 \"Inserts results in to the high elements of the first argument\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize >> 1\",\n        \"EmitValidation\": [\n          \"ElementSize >= FEXCore::IR::OpSize::i16Bit && ElementSize <= FEXCore::IR::OpSize::i64Bit\",\n          \"BitShift > 0 && BitShift <= IR::OpSizeAsBits(ElementSize)\"\n        ]\n      },\n      \"FPR = VSXTL OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": \"Sign extends elements from the source element size to the next size up\",\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize << 1\"\n      },\n      \"FPR = VSXTL2 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\"Sign extends elements from the source element size to the next size up\",\n                 \"Source elements come from the upper half of the register\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize << 1\"\n      },\n      \"FPR = VSSHLL OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, u8:$BitShift{0}\": {\n        \"Desc\": \"Sign extends elements from the source element size to the next size up\",\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize << 1\"\n      },\n      \"FPR = VSSHLL2 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, u8:$BitShift{0}\": {\n        \"Desc\": [\"Sign extends elements from the source element size to the next size up\",\n                 \"Source elements come from the upper half of the register\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize << 1\"\n      },\n      \"FPR = VUXTL OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": \"Zero extends elements from the source element size to the next size up\",\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize << 1\"\n      },\n      \"FPR = VUXTL2 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\"Zero extends elements from the source element size to the next size up\",\n                 \"Source elements come from the upper half of the register\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize << 1\"\n      },\n      \"FPR = VSQXTN OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize >> 1\"\n      },\n      \"FPR = VSQXTN2 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$VectorLower, FPR:$VectorUpper\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize >> 1\"\n      },\n      \"FPR = VSQXTNPair OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$VectorLower, FPR:$VectorUpper\": {\n        \"Desc\": [\"Does both VSQXTN and VSQXTN2 in a combined operation.\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize >> 1\"\n      },\n      \"FPR = VSQXTUN OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize >> 1\"\n      },\n      \"FPR = VSQXTUN2 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$VectorLower, FPR:$VectorUpper\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize >> 1\"\n      },\n      \"FPR = VSQXTUNPair OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$VectorLower, FPR:$VectorUpper\": {\n        \"Desc\": [\"Does both VSQXTUN and VSQXTUN2 in a combined operation.\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize >> 1\"\n      },\n      \"FPR = VSRSHR OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, u8:$BitShift\": {\n        \"Desc\": [\"Signed rounding shift right by immediate\",\n                 \"Exactly matching Arm64 srshr semantics\"\n                ],\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VSQSHL OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, u8:$BitShift\": {\n        \"Desc\": [\"Signed satuating shift left by immediate\",\n                 \"Exactly matching Arm64 sqshl semantics\"\n                ],\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VRev32 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\" : [\"Reverses elements in 32-bit halfwords\",\n                  \"Available element size: 1byte, 2 byte\"\n                 ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VRev64 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\" : [\"Reverses elements in 64-bit halfwords\",\n                  \"Available element size: 1byte, 2 byte, 4 byte\"\n                 ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VAdd OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VSub OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VAnd OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"EmitValidation\": [\n          \"RegisterSize == FEXCore::IR::OpSize::i256Bit || RegisterSize == FEXCore::IR::OpSize::i128Bit || RegisterSize == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n\n      \"FPR = VAndn OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"EmitValidation\": [\n          \"RegisterSize == FEXCore::IR::OpSize::i256Bit || RegisterSize == FEXCore::IR::OpSize::i128Bit || RegisterSize == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n\n      \"FPR = VOrn OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"EmitValidation\": [\n          \"RegisterSize == FEXCore::IR::OpSize::i256Bit || RegisterSize == FEXCore::IR::OpSize::i128Bit || RegisterSize == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n\n      \"FPR = VOr OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"EmitValidation\": [\n          \"RegisterSize == FEXCore::IR::OpSize::i256Bit || RegisterSize == FEXCore::IR::OpSize::i128Bit || RegisterSize == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n\n      \"FPR = VXor OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"EmitValidation\": [\n          \"RegisterSize == FEXCore::IR::OpSize::i256Bit || RegisterSize == FEXCore::IR::OpSize::i128Bit || RegisterSize == FEXCore::IR::OpSize::i64Bit\"\n        ]\n      },\n\n      \"FPR = VUQAdd OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VUQSub OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VSQAdd OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VSQSub OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VAddP OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$VectorLower, FPR:$VectorUpper\": {\n        \"Desc\": \"Does a horizontal pairwise add of elements across the two source vectors\",\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VURAvg OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"Desc\": [\"Does an unsigned rounded average\", \"dst_elem = (src1_elem + src2_elem + 1) >> 1\"],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VUMin OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VUMax OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VSMin OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VSMax OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VZip OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$VectorLower, FPR:$VectorUpper\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VZip2 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$VectorLower, FPR:$VectorUpper\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VUnZip OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$VectorLower, FPR:$VectorUpper\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VUnZip2 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$VectorLower, FPR:$VectorUpper\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VTrn OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$VectorLower, FPR:$VectorUpper\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VTrn2 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$VectorLower, FPR:$VectorUpper\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VFAdd OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFAddP OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$VectorLower, FPR:$VectorUpper\": {\n        \"Desc\": \"Does a horizontal pairwise add of elements across the two source vectors with float element types\",\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFAddV OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\"Does a horizontal float vector add of elements across the source vector\",\n                 \"Result is a zero extended scalar\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFSub OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFMul OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFDiv OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VFMin OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"TiedSource\": 0\n      },\n      \"FPR = VFMax OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"TiedSource\": 0\n      },\n      \"FPR = VMul OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VUMull OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize << 1\"\n      },\n      \"FPR = VSMull OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"Desc\": [ \"Does a signed integer multiply with extend.\",\n                  \"ElementSize is the source size\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize << 1\"\n      },\n      \"FPR = VUMull2 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"Desc\": \"Multiplies the high elements with size extension\",\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize << 1\"\n      },\n      \"FPR = VSMull2 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"Desc\": \"Multiplies the high elements with size extension\",\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize << 1\"\n      },\n      \"FPR = VUMulH OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"Desc\": \"Wide unsigned multiply returning the high results\",\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VSMulH OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"Desc\": \"Wide signed multiply returning the high results\",\n\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VUABDL OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"Desc\": [\"Unsigned Absolute Difference Long\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize << 1\"\n      },\n      \"FPR = VUABDL2 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"Desc\": [\"Unsigned Absolute Difference Long\",\n                 \"Using the high elements of the source vectors\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize << 1\"\n      },\n      \"FPR = VUShl OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, FPR:$ShiftVector, i1:$RangeCheck\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VUShr OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, FPR:$ShiftVector, i1:$RangeCheck\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VSShr OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, FPR:$ShiftVector, i1:$RangeCheck\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VUShlS OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, FPR:$ShiftScalar\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VUShrS OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, FPR:$ShiftScalar\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VSShrS OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, FPR:$ShiftScalar\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VUShrSWide OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, FPR:$ShiftScalar\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VSShrSWide OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, FPR:$ShiftScalar\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VUShlSWide OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, FPR:$ShiftScalar\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VInsElement OpSize:#RegisterSize, OpSize:#ElementSize, u8:$DestIdx, u8:$SrcIdx, FPR:$DestVector, FPR:$SrcVector\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VInsGPR OpSize:#RegisterSize, OpSize:#ElementSize, u8:$DestIdx, FPR:$DestVector, GPR:$Src\": {\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VExtr OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$VectorLower, FPR:$VectorUpper, u8:$Index\": {\n        \"Desc\": [\"Concats two vector registers together and extracts a full width register from the element index\",\n                 \"Index is an element index. So it is offset by ElementSize argument\",\n                 \"op:\",\n                 \"TmpVector <RegisterSize *2> = concat(Upper:Lower)\",\n                 \"Dest = TmpVector >> (ElementSize * Index * 8); // Or can be thought of `concat(&TmpVector[Index], i128)`\"\n                ],\n        \"TiedSource\": 1,\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VCMPEQ OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VCMPGT OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"Desc\": [\"Vector compare signed greater than\",\n                 \"Each element is compared, if the result is true then the resulting element is ~0, else zero\"\n                ],\n\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFCMPEQ OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFCMPNEQ OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFCMPLT OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFCMPGT OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFCMPLE OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFCMPORD OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFCMPUNO OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VTBL1 OpSize:#RegisterSize, FPR:$VectorTable, FPR:$VectorIndices\": {\n        \"Desc\": [\"Does a vector table lookup from one register in to the destination\",\n                 \"Lookup is byte sized per byte element.\",\n                 \"Any index larger than what the registers provide will result in zero for that element\",\n                 \"Table is always treated as a 128bit register\",\n                 \"Indices matches destination size. Either 64bit or 128bit\"\n                ],\n        \"DestSize\": \"RegisterSize\"\n      },\n      \"FPR = VTBL2 OpSize:#RegisterSize, FPR:$VectorTable1, FPR:$VectorTable2, FPR:$VectorIndices\": {\n        \"Desc\": [\"Does a vector table lookup from two registers in to the destination\",\n                 \"Lookup is byte sized per byte element.\",\n                 \"Any index larger than what the registers provide will result in zero for that element\",\n                 \"Table is always treated as a two 128bit registers\",\n                 \"Indices matches destination size. Either 64bit or 128bit\",\n                 \"Careful about not using sequential table registers, will result in some moves if they aren't sequential.\"\n                ],\n        \"DestSize\": \"RegisterSize\"\n      },\n      \"FPR = VTBX1 OpSize:#RegisterSize, FPR:$VectorSrcDst, FPR:$VectorTable, FPR:$VectorIndices\": {\n        \"Desc\": [\"Does a vector table lookup from one register in to the destination\",\n                 \"Lookup is byte sized per byte element.\",\n                 \"Any index larger than what the registers provide will result in not modifying that element\",\n                 \"Table is always treated as a 128bit register\",\n                 \"Indices matches destination size. Either 64bit or 128bit\"\n                ],\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\"\n      },\n      \"FPR = VBSL OpSize:#RegisterSize, FPR:$VectorMask, FPR:$VectorTrue, FPR:$VectorFalse\": {\n        \"Desc\": [\"Does a vector bitwise select.\",\n                 \"If the bit in the field is 1 then the corresponding bit is pulled from VectorTrue\",\n                 \"If the bit in the field is 0 then the corresponding bit is pulled from VectorFalse\"\n                ],\n        \"TiedSource\": 0,\n        \"DestSize\": \"RegisterSize\"\n      },\n\n      \"GPR = VPCMPESTRX FPR:$LHS, FPR:$RHS, GPR:$RAX, GPR:$RDX, u16:$Control\": {\n        \"Desc\": [\"Performs intermediate behavior analogous to the x86 PCMPESTRI/PCMPESTRM instruction\",\n                 \"This will return the intermediate result of a PCMPESTR-type operation, but NOT the final\",\n                 \"result. This must be derived from the intermediate result\",\n\n                 \"NOTE: On top of returning the intermediate result, the returned value also combines the status\",\n                 \"flags into the upper 16-bits of the 32-bit result, as these can also be derived over the\",\n                 \"course of creating the intermediate result\"\n                ],\n        \"DestSize\": \"OpSize::i32Bit\",\n        \"JITDispatch\": false\n      },\n      \"GPR = VPCMPISTRX FPR:$LHS, FPR:$RHS, u8:$Control\": {\n        \"Desc\": [\"Performs intermediate behavior analogous to the x86 PCMPISTRI/PCMPISTRM instruction\",\n                 \"This will return the intermediate result of a PCMPISTR-type operation, but NOT the final\",\n                 \"result. This must be derived from the intermediate result\",\n\n                 \"NOTE: On top of returning the intermediate result, the returned value also combines the status\",\n                 \"flags into the upper 16-bits of the 32-bit result, as these can also be derived over the\",\n                 \"course of creating the intermediate result\"\n                ],\n        \"DestSize\": \"OpSize::i32Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = VFCADD OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, u16:$Rotate\": {\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = VFMLA OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, FPR:$Addend\": {\n        \"Desc\": [\n          \"Dest = (Vector1 * Vector2) + Addend\",\n          \"This explicitly matches x86 FMA semantics because ARM semantics are mind-bending.\"\n        ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"TiedSource\": 2\n      },\n      \"FPR = VFMLS OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, FPR:$Addend\": {\n        \"Desc\": [\n          \"Dest = (Vector1 * Vector2) - Addend\",\n          \"This explicitly matches x86 FMA semantics because ARM semantics are mind-bending.\"\n        ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"TiedSource\": 2\n      },\n      \"FPR = VFNMLA OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, FPR:$Addend\": {\n        \"Desc\": [\n          \"Dest = (-Vector1 * Vector2) + Addend\",\n          \"This explicitly matches x86 FMA semantics because ARM semantics are mind-bending.\"\n        ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"TiedSource\": 2\n      },\n      \"FPR = VFNMLS OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2, FPR:$Addend\": {\n        \"Desc\": [\n          \"Dest = (-Vector1 * Vector2) - Addend\",\n          \"This explicitly matches x86 FMA semantics because ARM semantics are mind-bending.\"\n        ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\",\n        \"TiedSource\": 2\n      }\n    },\n    \"Conv\": {\n      \"FPR = VCastFromGPR OpSize:#RegisterSize, OpSize:#ElementSize, GPR:$Src\": {\n        \"Desc\": [\"Moves a GPR to a Vector register with zero extension to full length of the register.\",\n                 \"No conversion is done on the data as it moves register files\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VDupFromGPR OpSize:#RegisterSize, OpSize:#ElementSize, GPR:$Src\": {\n        \"Desc\": [\"Broadcasts a value in a GPR into each ElementSize-sized element in a vector\"],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n\n      \"FPR = VLoadTwoGPRs GPR:$Lower, GPR:$Upper\": {\n        \"Desc\": [\"Moves two 64-bit registers to a vector register optimally\"],\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"ElementSize\": \"OpSize::i64Bit\"\n      },\n\n      \"FPR = Float_FromGPR_S OpSize:#DstElementSize, OpSize:$SrcElementSize, GPR:$Src\": {\n        \"Desc\": [\"Scalar op: Converts signed GPR to Scalar float\",\n                 \"Zeroes the upper bits of the vector register\"\n                ],\n        \"DestSize\": \"DstElementSize\"\n      },\n      \"FPR = Float_FToF OpSize:#DstElementSize, OpSize:$SrcElementSize, FPR:$Scalar\": {\n        \"Desc\": [\"Scalar op: Converts float from one size to another\",\n                 \"Zeroes the upper bits of the vector register\"\n                ],\n        \"DestSize\": \"DstElementSize\"\n      },\n\n      \"FPR = Vector_SToF OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": \"Vector op: Converts signed integer to same size float\",\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = Vector_FToS OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\"Vector op: Converts float to signed integer, rounding towards zero\",\n                 \"Rounding mode determined by host rounding mode\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = Vector_FToZS OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": \"Vector op: Converts float to signed integer, rounding towards zero\",\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = Vector_FToF OpSize:#RegisterSize, OpSize:#DestElementSize, FPR:$Vector, OpSize:$SrcElementSize\": {\n        \"Desc\": \"Vector op: Converts float from source element size to destination size (fp32<->fp64)\",\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"DestElementSize\"\n      },\n\n      \"FPR = VFCVTL2 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector\": {\n        \"Desc\": [\n          \"Vector op: Converts float from source element size to destination size (fp32->fp64)\",\n          \"Selecting from the high half of the register.\"\n        ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize << 1\",\n        \"EmitValidation\": [\n          \"RegisterSize != FEXCore::IR::OpSize::i256Bit && \\\"What does 256-bit mean in this context?\\\"\"\n        ]\n      },\n      \"FPR = VFCVTN2 OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$VectorLower, FPR:$VectorUpper\": {\n        \"TiedSource\": 0,\n        \"Desc\": [\n          \"Vector op: Converts float from source element size and inserting in to the high bits.\",\n          \"Bottom half is untouched\",\n          \"Narrowing to the element size below what is passed in.\",\n          \"F64->F32, F32->F16\"\n        ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize >> 1\",\n        \"EmitValidation\": [\n          \"RegisterSize != FEXCore::IR::OpSize::i256Bit && \\\"What does 256-bit mean in this context?\\\"\"\n        ]\n      },\n      \"FPR = Vector_FToI OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, RoundType:$Round\": {\n        \"Desc\": [\"Vector op: Rounds float to integral\",\n                 \"Rounding mode determined by argument\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = Vector_FToISized OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, i1:$HostRound, OpSize:$IntSize\": {\n        \"Desc\": [\"Vector op: Rounds float to sized integral\",\n                 \"Either host rounding or round-to-zero\",\n                 \"Rounding mode determined by argument\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"ElementSize\"\n      },\n      \"FPR = Vector_F64ToI32 OpSize:#RegisterSize, FPR:$Vector, RoundType:$Round, i1:$EnsureZeroUpperHalf\": {\n        \"Desc\": [\"Vector op: Rounds 64-bit float to 32-bit integral with round mode\",\n                 \"Matches CVTPD2DQ/CVTTPD2DQ behaviour\"\n                ],\n        \"DestSize\": \"RegisterSize\",\n        \"ElementSize\": \"FEXCore::IR::OpSize::i32Bit\"\n      }\n    },\n    \"Crypto\": {\n      \"FPR = VAESImc FPR:$Vector\": {\n        \"Desc\": \"Does a stage of the inverse mix column transformation\",\n        \"DestSize\": \"OpSize::i128Bit\"\n      },\n      \"FPR = VAESEnc OpSize:#RegisterSize, FPR:$State, FPR:$Key, FPR:$ZeroReg\": {\n        \"Desc\": \"Does a step of AES encryption\",\n        \"DestSize\": \"RegisterSize\"\n      },\n      \"FPR = VAESEncLast OpSize:#RegisterSize, FPR:$State, FPR:$Key, FPR:$ZeroReg\": {\n        \"Desc\": \"Does the last step of AES encryption\",\n        \"DestSize\": \"RegisterSize\"\n      },\n      \"FPR = VAESDec OpSize:#RegisterSize, FPR:$State, FPR:$Key, FPR:$ZeroReg\": {\n        \"Desc\": \"Does a step of AES decryption\",\n        \"DestSize\": \"RegisterSize\"\n      },\n      \"FPR = VAESDecLast OpSize:#RegisterSize, FPR:$State, FPR:$Key, FPR:$ZeroReg\": {\n        \"Desc\": \"Does the last step of AES decryption\",\n        \"DestSize\": \"RegisterSize\"\n      },\n      \"FPR = VAESKeyGenAssist FPR:$Src, FPR:$KeyGenTBLSwizzle, FPR:$ZeroReg, u8:$RCON\": {\n        \"Desc\": \"Assists in key generation\",\n        \"DestSize\": \"OpSize::i128Bit\"\n      },\n      \"FPR = VSha1H FPR:$Src\": {\n        \"Desc\": \"Does vector scalar SHA1H instruction\",\n        \"DestSize\": \"FEXCore::IR::OpSize::i32Bit\"\n      },\n      \"FPR = VSha1C FPR:$Src1, FPR:$Src2, FPR:$Src3\": {\n        \"Desc\": \"Does vector SHA1C instruction\",\n        \"DestSize\": \"FEXCore::IR::OpSize::i128Bit\",\n        \"TiedSource\": 0\n      },\n      \"FPR = VSha1M FPR:$Src1, FPR:$Src2, FPR:$Src3\": {\n        \"Desc\": \"Does vector SHA1M instruction\",\n        \"DestSize\": \"FEXCore::IR::OpSize::i128Bit\",\n        \"TiedSource\": 0\n      },\n      \"FPR = VSha1P FPR:$Src1, FPR:$Src2, FPR:$Src3\": {\n        \"Desc\": \"Does vector SHA1P instruction\",\n        \"DestSize\": \"FEXCore::IR::OpSize::i128Bit\",\n        \"TiedSource\": 0\n      },\n      \"FPR = VSha1SU1 FPR:$Src1, FPR:$Src2\": {\n        \"Desc\": \"Does vector scalar SHA1H instruction\",\n        \"DestSize\": \"FEXCore::IR::OpSize::i128Bit\",\n        \"TiedSource\": 0\n      },\n      \"FPR = VSha256U0 FPR:$Src1, FPR:$Src2\": {\n        \"Desc\": \"Does vector scalar VSha256U0 instruction\",\n        \"DestSize\": \"FEXCore::IR::OpSize::i128Bit\",\n        \"TiedSource\": 0\n      },\n      \"FPR = VSha256U1 FPR:$Src1, FPR:$Src2\": {\n        \"Desc\": \"Does vector scalar VSha256U1 instruction\",\n        \"DestSize\": \"FEXCore::IR::OpSize::i128Bit\"\n      },\n      \"FPR = VSha256H FPR:$Src1, FPR:$Src2, FPR:$Src3\": {\n        \"Desc\": \"Does vector scalar VSha256H instruction\",\n        \"DestSize\": \"FEXCore::IR::OpSize::i128Bit\",\n        \"TiedSource\": 0\n      },\n      \"FPR = VSha256H2 FPR:$Src1, FPR:$Src2, FPR:$Src3\": {\n        \"Desc\": \"Does vector scalar VSha256H2 instruction\",\n        \"DestSize\": \"FEXCore::IR::OpSize::i128Bit\",\n        \"TiedSource\": 0\n      },\n      \"GPR = CRC32 GPR:$Src1, GPR:$Src2, OpSize:$SrcSize\": {\n        \"Desc\": [\"CRC32 using polynomial 0x1EDC6F41\"\n                ],\n        \"DestSize\": \"OpSize::i32Bit\"\n      },\n      \"FPR = PCLMUL OpSize:#RegisterSize, FPR:$Src1, FPR:$Src2, u8:$Selector\": {\n        \"Desc\": [\n          \"Performs carryless multiplication of 64-bit elements depending on the selector.\",\n          \"Selector = 0b00000000: Uses low 64-bit elements from both input vectors\",\n          \"Selector = 0b00000001: Uses high 64-bit element from Src1 and low 64-bit element from Src2\",\n          \"Selector = 0b00010000: Uses low 64-bit element from Src1 and high 64-bit element from Src2\",\n          \"Selector = 0b00010001: Uses high 64-bit elements from both input vectors\"\n        ],\n        \"DestSize\": \"RegisterSize\"\n      }\n    },\n    \"F64\": {\n      \"FPR = F64ATAN FPR:$Src1, FPR:$Src2\": {\n        \"DestSize\": \"OpSize::i64Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = F64FPREM FPR:$Src1, FPR:$Src2\": {\n        \"DestSize\": \"OpSize::i64Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = F64FPREM1 FPR:$Src1, FPR:$Src2\": {\n        \"DestSize\": \"OpSize::i64Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = F64SCALE FPR:$Src1, FPR:$Src2\": {\n        \"DestSize\": \"OpSize::i64Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = F64F2XM1 FPR:$Src\": {\n        \"DestSize\": \"OpSize::i64Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = F64FYL2X FPR:$Src, FPR:$Src2\": {\n        \"DestSize\": \"OpSize::i64Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = F64TAN FPR:$Src\": {\n        \"DestSize\": \"OpSize::i64Bit\",\n        \"JITDispatch\": true\n      },\n      \"FPR = F64SIN FPR:$Src\": {\n        \"DestSize\": \"OpSize::i64Bit\",\n        \"JITDispatch\": true\n      },\n      \"FPR = F64COS FPR:$Src\": {\n        \"DestSize\": \"OpSize::i64Bit\",\n        \"JITDispatch\": true\n      },\n      \"FPR:$Sin, FPR:$Cos = F64SINCOS FPR:$Src\": {\n        \"DestSize\": \"OpSize::i64Bit\",\n        \"HasSideEffects\": true,\n        \"JITDispatch\": false\n      }\n    },\n    \"F80\": {\n      \"GPR = SyncStackToSlow\": {\n        \"Desc\": [\n          \"Synchronizes the virtual stack environment to the physical registers.\",\n          \"Returns the current stack top.\"\n        ],\n        \"X87\": true,\n        \"HasSideEffects\": true,\n        \"DestSize\": \"OpSize::i64Bit\"\n      },\n      \"StackForceSlow\": {\n        \"Desc\": [\n          \"Forces the slow path.\"\n        ],\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"InitStack\": {\n        \"Desc\": [\n          \"Initializes the stack by marking all tags as invalid and setting top to zero.\"\n        ],\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"IncStackTop\": {\n        \"Desc\": [\n          \"Increase stack top-pointer.\"\n        ],\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"DecStackTop\": {\n        \"Desc\": [\n          \"Decrease stack top-pointer.\"\n        ],\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"InvalidateStack u8:$StackLocation\": {\n        \"Desc\": [\n          \"Marks the value in TOP+$StackLocation as empty / invalid 0b11.\",\n          \"If the StackLocation is 0xff, we invalidate all locations.\"\n        ],\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"PushStack FPR:$X80Src, FPR:$OriginalValue, OpSize:$LoadSize\": {\n        \"Desc\": [\n          \"Pushes the provided X80Src source on to the x87 stack.\",\n          \"Tracks OriginalValue as the original value of X80Src. OriginalValue can be Invalid() in which case no tracking is done.\",\n          \"Opsize is 128bit for F80 values, 64-bit for low precision.\",\n          \"LoadSize the original load size, i.e. of size of OriginalValue.\",\n          \"Float: 80-bit, 64-bit, 32-bit\"\n        ],\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"CopyPushStack u8:$StackLocation\": {\n        \"Desc\": [\n          \"Pushes an element already on the stack onto the top.\"\n        ],\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"StoreStackMem OpSize:$SourceSize, OpSize:$StoreSize, GPR:$Addr, GPR:$Offset, OpSize:$Align, MemOffsetType:$OffsetType, u8:$OffsetScale\": {\n        \"Desc\": [\n          \"Takes the top value off the x87 stack and stores it to memory.\",\n          \"SourceSize is 128bit for F80 values, 64-bit for low precision.\",\n          \"StoreSize is the store size for conversion:\",\n          \"Float: 80-bit, 64-bit, or 32-bit\"\n        ],\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"StoreStackToStack u8:$StackLocation\": {\n        \"Desc\": [\n          \"Takes the top value off the x87 stack and stores it to stack location TOP+StackLocation\",\n          \"Float: 80-bit, 64-bit, or 32-bit\",\n          \"Int: 64-bit, 32-bit, 16-bit\"\n        ],\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"PopStackDestroy\": {\n        \"Desc\": [\n          \"Pops the top value off the stack but doesn't save it anywhere.\"\n        ],\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"FPR = ReadStackValue u8:$StackLocation\": {\n        \"Desc\": [\n          \"Reads a value off the stack at the offset\"\n        ],\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"X87\": true\n      },\n      \"GPR = StackValidTag u8:$StackLocation\": {\n        \"Desc\": [\n          \"Returns 1 if the value in location TOP+$StackLocation is valid, 0 otherwise.\"\n        ],\n        \"DestSize\": \"OpSize::i32Bit\",\n        \"X87\": true\n      },\n      \"F80AddStack u8:$SrcStack1, u8:$SrcStack2\": {\n        \"Desc\": [\n          \"Adds two stack locations together, storing the result in to the first stack location\"\n        ],\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"F80AddValue u8:$SrcStack, FPR:$X80Src\": {\n        \"Desc\": [\n          \"Adds a operand value to a stack location. The result stored in to the stack location provided.\"\n        ],\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"FPR = F80Add FPR:$X80Src1, FPR:$X80Src2\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"F80SubStack u8:$DstStack, u8:$SrcStack1, u8:$SrcStack2\": {\n        \"Desc\": [\n          \"Subtracts the value in stack location TOP+$SrcStack2 from the value in stack location TOP+$SrcStack1.\",\n          \"The result is stored in stack location TOP+$DstStack.\"\n        ],\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"F80SubValue u8:$SrcStack, FPR:$X80Src\": {\n        \"Desc\": [\n          \"Subtracts the value $X80Src from the value in stack location TOP+$SrcStack.\",\n          \"The result is stored in stack location TOP.\"\n        ],\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"F80SubRValue FPR:$X80Src, u8:$SrcStack\": {\n        \"Desc\": [\n          \"Subtracts the value in stack location TOP+$SrcStack from the value $X80Src.\",\n          \"The result is stored in stack location TOP.\"\n        ],\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"FPR = F80Sub FPR:$X80Src1, FPR:$X80Src2\": {\n        \"Desc\": [\n          \"Subtracts the value in $X80Src1 from the value in $X80Src2.\",\n          \"The result is returned.\",\n          \"`FPR = X80Src2 - X80Src1`\"\n        ],\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"F80MulStack u8:$SrcStack1, u8:$SrcStack2\": {\n        \"Desc\": [\n          \"Multiplies two stack locations together, storing the result in to the first stack location\"\n        ],\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"F80MulValue u8:$SrcStack, FPR:$X80Src\": {\n        \"Desc\": [\n          \"Multiplies a operand value to a stack location. The result stored in to the stack location provided.\"\n        ],\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"FPR = F80Mul FPR:$X80Src1, FPR:$X80Src2\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"F80DivStack u8:$DstStack, u8:$SrcStack1, u8:$SrcStack2\": {\n        \"Desc\": [\n          \"Divides the value in stack location TOP+$SrcStack1 by the value in stack location TOP+$SrcStack2.\",\n          \"The result is stored in stack location TOP+$DstStack.\",\n          \"`FPR|Stack[TOP+DstStack] = Stack[TOP+SrcStack1] / Stack[TOP+SrcStack2]`\"\n        ],\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"F80DivValue u8:$SrcStack, FPR:$X80Src\": {\n        \"Desc\": [\n          \"Divides the value in stack location TOP+$SrcStack by the value $X80Src.\",\n          \"The result is stored in stack location TOP and returned.\",\n          \"`FPR|Stack[TOP] = Stack[TOP+SrcStack] / X80Src`\"\n        ],\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"F80DivRValue FPR:$X80Src, u8:$SrcStack\": {\n        \"Desc\": [\n          \"Divides the value X80Src by the value in stack location TOP+$SrcStack.\",\n          \"The result is stored in stack location TOP.\",\n          \"`FPR|Stack[TOP] = X80Src / Stack[TOP+SrcStack]`\"\n        ],\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"FPR = F80Div FPR:$X80Src1, FPR:$X80Src2\": {\n        \"Desc\": [\n          \"Divides the value in $X80Src1 by the value in $X80Src2.\",\n          \"The result is returned.\",\n          \"`FPR = X80Src1 / X80Src2`\"\n        ],\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"F80StackXchange u8:$SrcStack\": {\n        \"Desc\": [\n          \"Exchanges the value at the top of the stack with the value at TOP+$SrcStack.\"\n        ],\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"FPR = F80StackChangeSign\": {\n        \"Desc\": [\n          \"Complements the sign bit of the value at the top of the stack.\",\n          \"Returns the new value at the top of the stack.\"\n        ],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"X87\": true\n      },\n      \"FPR = F80StackAbs\": {\n        \"Desc\": [\n          \"Clears the sign bit of the value at the top of the stack.\",\n          \"Returns the new value at the top of the stack.\"\n        ],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"X87\": true\n      },\n      \"F80PTANStack\": {\n        \"Desc\": [\n          \"Computes the approximate tangent of the source operand in register ST(0), stores the result in ST(0), and pushes a 1.0 onto the FPU register stack.\"\n        ],\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"FPR = F80ATANStack\": {\n        \"Desc\": [\n          \"Computes arctan(st1/st0) and stores it in st0. Then pops the stack.\"\n        ],\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"FPR = F80ATAN FPR:$X80Src1, FPR:$X80Src2\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"F80FPREMStack\": {\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"FPR = F80FPREM FPR:$X80Src1, FPR:$X80Src2\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"F80FPREM1Stack\": {\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"FPR = F80FPREM1 FPR:$X80Src1, FPR:$X80Src2\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"F80SCALEStack\": {\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"FPR = F80SCALE FPR:$X80Src1, FPR:$X80Src2\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = F80CVT OpSize:#Size, FPR:$X80Src\": {\n        \"DestSize\": \"Size\",\n        \"JITDispatch\": false\n      },\n      \"GPR = F80CVTInt OpSize:#Size, FPR:$X80Src, i1:$Truncate\": {\n        \"DestSize\": \"Size\",\n        \"JITDispatch\": false\n      },\n      \"FPR = F80CVTTo FPR:$X80Src, OpSize:$SrcSize\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = F80CVTToInt GPR:$Src, OpSize:$SrcSize\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"F80RoundStack\": {\n        \"Desc\": [\n          \"Replaces the value at the top of the stack with its nearest integral value.\"\n        ],\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"FPR = F80Round FPR:$X80Src\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"F80F2XM1Stack\": {\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"FPR = F80F2XM1 FPR:$X80Src\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = F80TAN FPR:$X80Src\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"F80SINStack\": {\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"FPR = F80SIN FPR:$X80Src\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"F80COSStack\": {\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"FPR = F80COS FPR:$X80Src\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR:$Sin, FPR:$Cos = F80SINCOS FPR:$X80Src\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"HasSideEffects\": true,\n        \"JITDispatch\": false\n      },\n      \"F80SINCOSStack\": {\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"F80SQRTStack\": {\n        \"X87\": true,\n        \"HasSideEffects\": true\n      },\n      \"FPR = F80SQRT FPR:$X80Src\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = F80XTRACT_EXP FPR:$X80Src\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = F80XTRACT_SIG FPR:$X80Src\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"GPR = F80StackTest u8:$SrcStack\": {\n        \"Desc\": [\n          \"Does comparison between value in stack at TOP + SrcStack\"\n        ],\n        \"DestSize\": \"OpSize::i32Bit\",\n        \"X87\": true\n      },\n      \"GPR = F80CmpStack u8:$SrcStack\": {\n        \"Desc\": [\n          \"Does a scalar unordered compare between the value at the top of the stack and the value in stack position TOP+$SrcStack and stores the flags in to a GPR\",\n          \"Ordering flag result is true if either float input is NaN\"\n        ],\n        \"DestSize\": \"OpSize::i32Bit\",\n        \"X87\": true\n      },\n      \"GPR = F80CmpValue FPR:$X80Src\": {\n        \"Desc\": [\n          \"Does a scalar unordered compare between the value at the top of the stack and $X80Src and stores the asked for flags in to a GPR\",\n          \"Ordering flag result is true if either float input is NaN\"\n        ],\n        \"DestSize\": \"OpSize::i32Bit\",\n        \"HasSideEffects\": true,\n        \"X87\": true\n      },\n      \"GPR = F80Cmp FPR:$X80Src1, FPR:$X80Src2\": {\n        \"Desc\": [\"Does a scalar unordered compare and stores the flags in to a GPR\",\n                 \"Ordering flag result is true if either float input is NaN\"\n                ],\n        \"DestSize\": \"OpSize::i32Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = F80BCDLoad FPR:$X80Src\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = F80BCDStore FPR:$X80Src\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"FPR = F80FYL2XStack\": {\n        \"Desc\": [\n          \"Computes ST1 * log2(ST0)\",\n          \"Stores the result in ST1, and pops the top of the stack.\",\n          \"Returns the new value at the top of the stack, i.e. the result of the operation.\"\n        ],\n        \"HasSideEffects\": true,\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"X87\": true\n      },\n      \"FPR = F80FYL2X FPR:$X80Src1, FPR:$X80Src2\": {\n        \"DestSize\": \"OpSize::i128Bit\",\n        \"JITDispatch\": false\n      },\n      \"F80VBSLStack OpSize:#RegisterSize, FPR:$VectorMask, u8:$SrcStack1, u8:$SrcStack2\": {\n        \"Desc\": [\n          \"Does a vector bitwise select.\",\n          \"If the bit in the field is 1 then the corresponding bit is pulled from VectorTrue\",\n          \"If the bit in the field is 0 then the corresponding bit is pulled from VectorFalse\",\n          \"Writes the result to the top of the stack.\"\n        ],\n        \"X87\": true,\n        \"HasSideEffects\": true\n      }\n    },\n    \"Backend\": {\n      \"Last\": {\n        \"HasSideEffects\": true\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/IRDumper.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\nmeta: ir|dumper ~ IR -> Text\ntags: ir|dumper\n$end_info$\n*/\n\n#include \"Interface/IR/IntrusiveIRList.h\"\n#include \"Interface/IR/RegisterAllocationData.h\"\n\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/sstream.h>\n\n#include <algorithm>\n#include <array>\n#include <ostream>\n#include <stdint.h>\n#include <string_view>\n#include <iomanip>\n\nnamespace FEXCore::IR {\n#define IROP_GETNAME_IMPL\n#define IROP_GETRAARGS_IMPL\n#define IROP_REG_CLASSES_IMPL\n#define IROP_HASSIDEEFFECTS_IMPL\n#define IROP_SIZES_IMPL\n#define IROP_GETHASDEST_IMPL\n\n#include <FEXCore/IR/IRDefines.inc>\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, const SHA256Sum& Arg) {\n  *out << fextl::fmt::format(\"sha256:{:02x}\", fmt::join(Arg.data, \"\"));\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, uint64_t Arg) {\n  *out << fextl::fmt::format(\"#{:#x}\", Arg);\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, CondClass Arg) {\n  if (Arg == CondClass::AL) {\n    *out << \"ALWAYS\";\n    return;\n  }\n\n  static constexpr std::array<std::string_view, 22> CondNames = {\"EQ\",  \"NEQ\", \"UGE\",  \"ULT\", \"MI\",  \"PL\",  \"VS\",   \"VC\",\n                                                                 \"UGT\", \"ULE\", \"SGE\",  \"SLT\", \"SGT\", \"SLE\", \"TSTZ\", \"TSTNZ\",\n                                                                 \"FLU\", \"FGE\", \"FLEU\", \"FGT\", \"FU\",  \"FNU\"};\n\n  *out << CondNames[FEXCore::ToUnderlying(Arg)];\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, MemOffsetType Arg) {\n  static constexpr std::array<std::string_view, 3> Names = {\n    \"SXTX\",\n    \"UXTW\",\n    \"SXTW\",\n  };\n\n  *out << Names[FEXCore::ToUnderlying(Arg)];\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, RegClass Arg) {\n  *out << [Arg] {\n    switch (Arg) {\n    case RegClass::Invalid: return \"Invalid\";\n    case RegClass::GPR: return \"GPR\";\n    case RegClass::GPRFixed: return \"GPRFixed\";\n    case RegClass::FPR: return \"FPR\";\n    case RegClass::FPRFixed: return \"FPRFixed\";\n    case RegClass::Complex: return \"Complex\";\n    }\n    return \"<Unknown RegClass Type>\";\n  }();\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView* IR, OrderedNodeWrapper Arg) {\n  if (Arg.IsImmediate()) {\n    auto PhyReg = PhysicalRegister(Arg);\n\n    switch (PhyReg.AsRegClass()) {\n    case RegClass::GPR: *out << \"r\"; break;\n    case RegClass::GPRFixed: *out << \"R\"; break;\n    case RegClass::FPR: *out << \"v\"; break;\n    case RegClass::FPRFixed: *out << \"V\"; break;\n    case RegClass::Complex: *out << \"c\"; break;\n    case RegClass::Invalid: *out << \"invalid\"; break;\n    default: *out << \"unknown\"; break;\n    }\n\n    if (PhyReg.AsRegClass() != RegClass::Invalid) {\n      *out << std::dec << uint32_t(PhyReg.Reg);\n    }\n\n    return;\n  }\n\n  auto [CodeNode, IROp] = IR->at(Arg)();\n  const auto ArgID = Arg.ID();\n\n  if (ArgID.IsInvalid()) {\n    *out << \"%Invalid\";\n  } else {\n    *out << \"%\" << std::dec << ArgID;\n  }\n\n  if (GetHasDest(IROp->Op)) {\n    auto ElementSize = IROp->ElementSize;\n    uint32_t NumElements = 0;\n    if (IROp->ElementSize == OpSize::iUnsized) {\n      ElementSize = IROp->Size;\n    }\n\n    if (ElementSize != OpSize::iUnsized) {\n      NumElements = IR::NumElements(IROp->Size, ElementSize);\n    }\n\n    *out << \" i\" << std::dec << IR::OpSizeAsBits(ElementSize);\n\n    if (NumElements > 1) {\n      *out << \"v\" << std::dec << NumElements;\n    }\n  }\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, FenceType Arg) {\n  *out << [Arg] {\n    switch (Arg) {\n    case FenceType::Load: return \"Loads\";\n    case FenceType::Store: return \"Stores\";\n    case FenceType::LoadStore: return \"LoadStores\";\n    case FenceType::Inst: return \"Instruction\";\n    }\n    return \"<Unknown Fence Type>\";\n  }();\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, RoundMode Arg) {\n  *out << [Arg] {\n    switch (Arg) {\n    case RoundMode::Nearest: return \"Nearest\";\n    case RoundMode::NegInfinity: return \"-Inf\";\n    case RoundMode::PosInfinity: return \"+Inf\";\n    case RoundMode::TowardsZero: return \"Towards Zero\";\n    case RoundMode::Host: return \"Host\";\n    }\n    return \"<Unknown Round Type>\";\n  }();\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, ConstPad Arg) {\n  *out << [Arg] {\n    switch (Arg) {\n    case ConstPad::NoPad: return \"NoPad\";\n    case ConstPad::DoPad: return \"DoPad\";\n    case ConstPad::AutoPad: return \"AutoPad\";\n    }\n    return \"<Unknown ConstPad Type>\";\n  }();\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, NamedVectorConstant Arg) {\n  *out << [Arg] {\n    // clang-format off\n    switch (Arg) {\n      case NamedVectorConstant::NAMED_VECTOR_INCREMENTAL_U16_INDEX:\n        return \"u16_incremental_index\";\n      case NamedVectorConstant::NAMED_VECTOR_INCREMENTAL_U16_INDEX_UPPER:\n        return \"u16_incremental_index_upper\";\n      case NamedVectorConstant::NAMED_VECTOR_PADDSUBPS_INVERT:\n        return \"addsubps_invert\";\n      case NamedVectorConstant::NAMED_VECTOR_PADDSUBPS_INVERT_UPPER:\n        return \"addsubps_invert_upper\";\n      case NamedVectorConstant::NAMED_VECTOR_PADDSUBPD_INVERT:\n        return \"addsubpd_invert\";\n      case NamedVectorConstant::NAMED_VECTOR_PADDSUBPD_INVERT_UPPER:\n        return \"addsubpd_invert_upper\";\n      case NamedVectorConstant::NAMED_VECTOR_PSUBADDPS_INVERT:\n        return \"subaddps_invert\";\n      case NamedVectorConstant::NAMED_VECTOR_PSUBADDPS_INVERT_UPPER:\n        return \"subaddps_invert_upper\";\n      case NamedVectorConstant::NAMED_VECTOR_PSUBADDPD_INVERT:\n        return \"subaddpd_invert\";\n      case NamedVectorConstant::NAMED_VECTOR_PSUBADDPD_INVERT_UPPER:\n        return \"subaddpd_invert_upper\";\n      case NamedVectorConstant::NAMED_VECTOR_MOVMSKPS_SHIFT:\n        return \"movmskps_shift\";\n      case NamedVectorConstant::NAMED_VECTOR_AESKEYGENASSIST_SWIZZLE:\n        return \"aeskeygenassist_swizzle\";\n      case NamedVectorConstant::NAMED_VECTOR_BLENDPS_0110B:\n        return \"blendps_0110b\";\n      case NamedVectorConstant::NAMED_VECTOR_BLENDPS_0111B:\n        return \"blendps_0111b\";\n      case NamedVectorConstant::NAMED_VECTOR_BLENDPS_1001B:\n        return \"blendps_1001b\";\n      case NamedVectorConstant::NAMED_VECTOR_BLENDPS_1011B:\n        return \"blendps_1011b\";\n      case NamedVectorConstant::NAMED_VECTOR_BLENDPS_1101B:\n        return \"blendps_1101b\";\n      case NamedVectorConstant::NAMED_VECTOR_BLENDPS_1110B:\n        return \"blendps_1110b\";\n      case NamedVectorConstant::NAMED_VECTOR_MOVMASKB:\n        return \"movmaskb\";\n      case NamedVectorConstant::NAMED_VECTOR_MOVMASKB_UPPER:\n        return \"movmaskb_upper\";\n      case NamedVectorConstant::NAMED_VECTOR_ZERO:\n        return \"vectorzero\";\n      case NamedVectorConstant::NAMED_VECTOR_X87_ONE:\n        return \"x87_1_0\";\n      case NamedVectorConstant::NAMED_VECTOR_X87_LOG2_10:\n        return \"x87_log2_10\";\n      case NamedVectorConstant::NAMED_VECTOR_X87_LOG2_E:\n        return \"x87_log2_e\";\n      case NamedVectorConstant::NAMED_VECTOR_X87_PI:\n        return \"x87_pi\";\n      case NamedVectorConstant::NAMED_VECTOR_X87_LOG10_2:\n        return \"x87_log10_2\";\n      case NamedVectorConstant::NAMED_VECTOR_X87_LOG_2:\n        return \"x87_log2\";\n      case NamedVectorConstant::NAMED_VECTOR_CVTMAX_F32_I32:\n        return \"cvtmax_f32_i32\";\n      case NamedVectorConstant::NAMED_VECTOR_CVTMAX_F32_I32_UPPER:\n        return \"cvtmax_f32_i32_upper\";\n      case NamedVectorConstant::NAMED_VECTOR_CVTMAX_F32_I64:\n        return \"cvtmax_f32_i64\";\n      case NamedVectorConstant::NAMED_VECTOR_CVTMAX_F64_I32:\n        return \"cvtmax_f64_i32\";\n      case NamedVectorConstant::NAMED_VECTOR_CVTMAX_F64_I32_UPPER:\n        return \"cvtmax_f64_i32_upper\";\n      case NamedVectorConstant::NAMED_VECTOR_CVTMAX_F64_I64:\n        return \"cvtmax_f64_i64\";\n      case NamedVectorConstant::NAMED_VECTOR_CVTMAX_I32:\n        return \"cvtmax_i32\";\n      case NamedVectorConstant::NAMED_VECTOR_CVTMAX_I64:\n        return \"cvtmax_i64\";\n      case NamedVectorConstant::NAMED_VECTOR_F80_SIGN_MASK:\n        return \"f80_sign_mask\";\n      case NamedVectorConstant::NAMED_VECTOR_SHA1RNDS_K0:\n        return \"sha1rnds_k0\";\n      case NamedVectorConstant::NAMED_VECTOR_SHA1RNDS_K1:\n        return \"sha1rnds_k1\";\n      case NamedVectorConstant::NAMED_VECTOR_SHA1RNDS_K2:\n        return \"sha1rnds_k2\";\n      case NamedVectorConstant::NAMED_VECTOR_SHA1RNDS_K3:\n        return \"sha1rnds_k3\";\n      case NamedVectorConstant::NAMED_VECTOR_MAX:\n        return \"<Programming Error: Printing MAX value>\";\n    }\n    return \"<Unknown Named Vector Constant>\";\n    // clang-format on\n  }();\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, IndexNamedVectorConstant Arg) {\n  *out << [Arg] {\n    // clang-format off\n    switch (Arg) {\n    case IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_PSHUFLW:\n      return \"pshuflw\";\n    case IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_PSHUFHW:\n      return \"pshufhw\";\n    case IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_PSHUFD:\n      return \"pshufd\";\n    case IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_SHUFPS:\n      return \"shufps\";\n    case IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_DPPS_MASK:\n      return \"dpps_mask\";\n    case IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_DPPD_MASK:\n      return \"dppd_mask\";\n    case IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_PBLENDW:\n      return \"pblendw\";\n    case INDEXED_NAMED_VECTOR_MAX:\n      return \"<Programming Error: Printing MAX value>\";\n    }\n    return \"<Unknown Indexed Named Vector Constant>\";\n    // clang-format on\n  }();\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, OpSize Arg) {\n  *out << [Arg] {\n    switch (Arg) {\n    case OpSize::iUnsized: return \"Unsized\";\n    case OpSize::i8Bit: return \"i8\";\n    case OpSize::i16Bit: return \"i16\";\n    case OpSize::i32Bit: return \"i32\";\n    case OpSize::i64Bit: return \"i64\";\n    case OpSize::f80Bit: return \"f80\";\n    case OpSize::i128Bit: return \"i128\";\n    case OpSize::i256Bit: return \"i256\";\n    case OpSize::iInvalid: return \"Invalid\";\n    }\n    return \"<Unknown OpSize Type>\";\n  }();\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, FloatCompareOp Arg) {\n  *out << [Arg] {\n    switch (Arg) {\n    case FloatCompareOp::EQ: return \"FEQ\";\n    case FloatCompareOp::LT: return \"FLT\";\n    case FloatCompareOp::LE: return \"FLE\";\n    case FloatCompareOp::UNO: return \"UNO\";\n    case FloatCompareOp::NEQ: return \"NEQ\";\n    case FloatCompareOp::ORD: return \"ORD\";\n    }\n    return \"<Unknown FloatCompareOp Type>\";\n  }();\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, FEXCore::IR::BreakDefinition Arg) {\n  *out << \"{\" << Arg.ErrorRegister << \".\";\n  *out << static_cast<uint32_t>(Arg.Signal) << \".\";\n  *out << static_cast<uint32_t>(Arg.TrapNumber) << \".\";\n  *out << static_cast<uint32_t>(Arg.si_code) << \"}\";\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, ShiftType Arg) {\n  *out << [Arg] {\n    switch (Arg) {\n    case ShiftType::LSL: return \"LSL\";\n    case ShiftType::LSR: return \"LSR\";\n    case ShiftType::ASR: return \"ASR\";\n    case ShiftType::ROR: return \"ROR\";\n    }\n    return \"<Unknown Shift Type>\";\n  }();\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, BranchHint Arg) {\n  *out << [Arg] {\n    switch (Arg) {\n    case BranchHint::None: return \"None\";\n    case BranchHint::Call: return \"Call\";\n    case BranchHint::Return: return \"Return\";\n    case BranchHint::CheckTF: return \"CheckTF\";\n    }\n    return \"<Unknown Branch Hint>\";\n  }();\n}\n\nstatic void PrintArg(fextl::stringstream* out, const IRListView*, const std::array<uint8_t, 0x10>& Arg) {\n  *out << fextl::fmt::format(\"{:02x}\", fmt::join(Arg, \"\"));\n}\n\nvoid Dump(fextl::stringstream* out, const IRListView* IR) {\n  auto HeaderOp = IR->GetHeader();\n\n  int8_t CurrentIndent = 0;\n  auto AddIndent = [&out, &CurrentIndent]() {\n    for (uint8_t i = 0; i < CurrentIndent; ++i) {\n      *out << \"\\t\";\n    }\n  };\n\n  ++CurrentIndent;\n  AddIndent();\n  *out << fextl::fmt::format(\"(%0) IRHeader %{}, #{:#x}, #{}, #{}\\n\", HeaderOp->Blocks.ID(), +HeaderOp->OriginalRIP, +HeaderOp->BlockCount,\n                             +HeaderOp->NumHostInstructions);\n\n  for (auto [BlockNode, BlockHeader] : IR->GetBlocks()) {\n    {\n      auto BlockIROp = BlockHeader->C<FEXCore::IR::IROp_CodeBlock>();\n\n      AddIndent();\n      *out << \"(%\" << IR->GetID(BlockNode) << \") \" << \"CodeBlock \";\n\n      *out << \"%\" << BlockIROp->Begin.ID() << \", \";\n      *out << \"%\" << BlockIROp->Last.ID() << std::endl;\n    }\n\n    ++CurrentIndent;\n    for (auto [CodeNode, IROp] : IR->GetCode(BlockNode)) {\n      const auto ID = IR->GetID(CodeNode);\n      const auto Name = FEXCore::IR::GetName(IROp->Op);\n\n      {\n        AddIndent();\n        if (GetHasDest(IROp->Op)) {\n\n          auto ElementSize = IROp->ElementSize;\n          uint8_t NumElements = 0;\n          if (IROp->ElementSize != OpSize::iUnsized) {\n            ElementSize = IROp->Size;\n          }\n\n          if (ElementSize != OpSize::iUnsized) {\n            NumElements = IR::NumElements(IROp->Size, ElementSize);\n          }\n\n          *out << \"%\" << std::dec << ID;\n\n          auto PhyReg = PhysicalRegister(CodeNode);\n          if (!PhyReg.IsInvalid()) {\n            switch (PhyReg.AsRegClass()) {\n            case RegClass::GPR: *out << \"(r\"; break;\n            case RegClass::GPRFixed: *out << \"(R\"; break;\n            case RegClass::FPR: *out << \"(v\"; break;\n            case RegClass::FPRFixed: *out << \"(V\"; break;\n            case RegClass::Complex: *out << \"(complex\"; break;\n            case RegClass::Invalid: *out << \"(invalid\"; break;\n            default: *out << \"(unknown\"; break;\n            }\n            if (PhyReg.AsRegClass() != RegClass::Invalid) {\n              *out << std::dec << uint32_t(PhyReg.Reg) << \")\";\n            } else {\n              *out << \")\";\n            }\n          }\n\n          *out << \" i\" << std::dec << IR::OpSizeAsBits(ElementSize);\n\n          if (NumElements > 1) {\n            *out << \"v\" << std::dec << NumElements;\n          }\n\n          *out << \" = \";\n        } else {\n\n          auto ElementSize = IROp->ElementSize;\n          if (IROp->ElementSize == OpSize::iUnsized) {\n            ElementSize = IROp->Size;\n          }\n          uint32_t NumElements = 0;\n          if (ElementSize != OpSize::iUnsized) {\n            NumElements = IR::NumElements(IROp->Size, ElementSize);\n          }\n\n          *out << \"(%\" << std::dec << ID << ' ';\n          *out << 'i' << std::dec << IR::OpSizeAsBits(ElementSize);\n          if (NumElements > 1) {\n            *out << 'v' << std::dec << NumElements;\n          }\n          *out << \") \";\n        }\n        *out << Name;\n\n#define IROP_ARGPRINTER_HELPER\n#include <FEXCore/IR/IRDefines.inc>\n      default: *out << \"<Unknown Args>\"; break;\n      }\n\n      //*out << \" (\" <<  std::dec << CodeNode->GetUses() << \")\";\n\n      *out << \"\\n\";\n    }\n  }\n\n  CurrentIndent = std::max(0, CurrentIndent - 1);\n}\n}\n}\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/IREmitter.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\nmeta: ir|emitter ~ C++ Functions to generate IR. See IR.json for spec.\ntags: ir|emitter\n$end_info$\n*/\n\n#include \"Interface/IR/IREmitter.h\"\n\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/Utils/EnumUtils.h>\n#include <FEXCore/Utils/LogManager.h>\n\n#include <cstdint>\n#include <cstring>\n\nnamespace FEXCore::IR {\n\nstatic bool IsFragmentExit(FEXCore::IR::IROps Op) {\n  switch (Op) {\n  case OP_EXITFUNCTION:\n  case OP_BREAK: return true;\n  default: return false;\n  }\n}\n\nbool IsBlockExit(FEXCore::IR::IROps Op) {\n  switch (Op) {\n  case OP_JUMP:\n  case OP_CONDJUMP: return true;\n  default: return IsFragmentExit(Op);\n  }\n}\n\nRegClass IREmitter::WalkFindRegClass(Ref Node) {\n  auto Class = GetOpRegClass(Node);\n  switch (Class) {\n  case RegClass::GPR:\n  case RegClass::FPR:\n  case RegClass::GPRFixed:\n  case RegClass::FPRFixed:\n  case RegClass::Invalid: return Class;\n  default: break;\n  }\n\n  // Complex case, needs to be handled on an op by op basis\n  uintptr_t DataBegin = DualListData.DataBegin();\n\n  FEXCore::IR::IROp_Header* IROp = Node->Op(DataBegin);\n\n  switch (IROp->Op) {\n  case IROps::OP_LOADREGISTER: {\n    auto Op = IROp->C<IROp_LoadRegister>();\n    return Op->Class;\n    break;\n  }\n  case IROps::OP_LOADCONTEXT: {\n    auto Op = IROp->C<IROp_LoadContext>();\n    return Op->Class;\n    break;\n  }\n  case IROps::OP_LOADCONTEXTINDEXED: {\n    auto Op = IROp->C<IROp_LoadContextIndexed>();\n    return Op->Class;\n    break;\n  }\n  case IROps::OP_FILLREGISTER: {\n    auto Op = IROp->C<IROp_FillRegister>();\n    return Op->Class;\n    break;\n  }\n  case IROps::OP_LOADMEM: {\n    auto Op = IROp->C<IROp_LoadMem>();\n    return Op->Class;\n    break;\n  }\n  case IROps::OP_LOADMEMTSO: {\n    auto Op = IROp->C<IROp_LoadMemTSO>();\n    return Op->Class;\n    break;\n  }\n  default: LOGMAN_MSG_A_FMT(\"Unhandled op type: {} {} in argument class validation\", ToUnderlying(IROp->Op), GetOpName(Node)); break;\n  }\n  return RegClass::Invalid;\n}\n\nvoid IREmitter::ResetWorkingList() {\n  DualListData.Reset();\n  CodeBlocks.clear();\n  CurrentWriteCursor = nullptr;\n  // This is necessary since we do \"null\" pointer checks\n  InvalidNode = reinterpret_cast<Ref>(DualListData.ListAllocate(sizeof(OrderedNode)));\n  memset(InvalidNode, 0, sizeof(OrderedNode));\n  CurrentCodeBlock = nullptr;\n}\n\nvoid IREmitter::ReplaceAllUsesWithRange(Ref Node, Ref NewNode, AllNodesIterator Begin, AllNodesIterator End) {\n  uintptr_t ListBegin = DualListData.ListBegin();\n  auto NodeId = Node->Wrapped(ListBegin).ID();\n\n  while (Begin != End) {\n    auto [RealNode, IROp] = Begin();\n\n    const uint8_t NumArgs = IR::GetArgs(IROp->Op);\n    for (uint8_t i = 0; i < NumArgs; ++i) {\n      if (IROp->Args[i].ID() == NodeId) {\n        Node->RemoveUse();\n        NewNode->AddUse();\n        IROp->Args[i].NodeOffset = NewNode->Wrapped(ListBegin).NodeOffset;\n\n        // We can stop searching once all uses of the node are gone.\n        if (Node->NumUses == 0) {\n          return;\n        }\n      }\n    }\n\n    ++Begin;\n  }\n}\n\nvoid IREmitter::ReplaceNodeArgument(Ref Node, uint8_t Arg, Ref NewArg) {\n  uintptr_t ListBegin = DualListData.ListBegin();\n  uintptr_t DataBegin = DualListData.DataBegin();\n\n  FEXCore::IR::IROp_Header* IROp = Node->Op(DataBegin);\n  OrderedNodeWrapper OldArgWrapper = IROp->Args[Arg];\n  Ref OldArg = OldArgWrapper.GetNode(ListBegin);\n  OldArg->RemoveUse();\n  NewArg->AddUse();\n  IROp->Args[Arg].NodeOffset = NewArg->Wrapped(ListBegin).NodeOffset;\n}\n\nvoid IREmitter::RemoveArgUses(Ref Node) {\n  uintptr_t ListBegin = DualListData.ListBegin();\n  uintptr_t DataBegin = DualListData.DataBegin();\n\n  FEXCore::IR::IROp_Header* IROp = Node->Op(DataBegin);\n\n  const uint8_t NumArgs = IR::GetArgs(IROp->Op);\n  for (uint8_t i = 0; i < NumArgs; ++i) {\n    auto ArgNode = IROp->Args[i].GetNode(ListBegin);\n    ArgNode->RemoveUse();\n  }\n}\n\nvoid IREmitter::RemovePostRA(Ref Node) {\n  Node->Unlink(DualListData.ListBegin());\n}\n\nvoid IREmitter::Remove(Ref Node) {\n  RemoveArgUses(Node);\n\n  Node->Unlink(DualListData.ListBegin());\n}\n\nIREmitter::IRPair<IROp_CodeBlock> IREmitter::CreateNewCodeBlockAfter(Ref insertAfter) {\n  auto OldCursor = GetWriteCursor();\n\n  auto CodeNode = CreateCodeNode();\n\n  if (insertAfter) {\n    LinkCodeBlocks(insertAfter, CodeNode);\n  } else {\n    LOGMAN_THROW_A_FMT(CurrentCodeBlock != nullptr, \"CurrentCodeBlock must not be null here\");\n\n    // Find last block\n    auto LastBlock = CurrentCodeBlock;\n\n    while (LastBlock->Header.Next.GetNode(DualListData.ListBegin()) != InvalidNode) {\n      LastBlock = LastBlock->Header.Next.GetNode(DualListData.ListBegin());\n    }\n\n    // Append it after the last block\n    LinkCodeBlocks(LastBlock, CodeNode);\n  }\n\n  SetWriteCursor(OldCursor);\n\n  return CodeNode;\n}\n\nvoid IREmitter::SetCurrentCodeBlock(Ref Node) {\n  CurrentCodeBlock = Node;\n  LOGMAN_THROW_A_FMT(Node->Op(DualListData.DataBegin())->Op == OP_CODEBLOCK, \"Node wasn't codeblock. It was '{}'\",\n                     IR::GetName(Node->Op(DualListData.DataBegin())->Op));\n  SetWriteCursor(Node->Op(DualListData.DataBegin())->CW<IROp_CodeBlock>()->Begin.GetNode(DualListData.ListBegin()));\n\n  // Constants are pooled only within a single block.\n  NrConstants = 0;\n}\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/IREmitter.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"CodeEmitter/Emitter.h\"\n#include \"Interface/IR/IR.h\"\n#include \"Interface/IR/IntrusiveIRList.h\"\n\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/IR/IR.h>\n\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <algorithm>\n#include <stdint.h>\n#include <string.h>\n\nnamespace FEXCore::IR {\n\nclass IREmitter {\npublic:\n  IREmitter(FEXCore::Utils::IntrusivePooledAllocator& ThreadAllocator, bool SupportsTSOImm9)\n    : DualListData {ThreadAllocator, 8 * 1024 * 1024}\n    , SupportsTSOImm9(SupportsTSOImm9) {}\n\n  virtual ~IREmitter() = default;\n\n  void ReownOrClaimBuffer() {\n    DualListData.ReownOrClaimBuffer();\n\n    // Reset the working list on new buffer.\n    ResetWorkingList();\n  }\n\n  void DelayedDisownBuffer() {\n    DualListData.DelayedDisownBuffer();\n  }\n\n  IRListView ViewIR() {\n    return IRListView(&DualListData);\n  }\n\n  /**\n   * @name IR allocation routines\n   *\n   * @{ */\n\n  RegClass WalkFindRegClass(Ref Node);\n\n  // These inlining helpers are used by IRDefines.inc so define first.\n  Ref InlineMem(OpSize Size, Ref Offset, MemOffsetType OffsetType, uint8_t& OffsetScale, bool TSO = false) {\n    uint64_t Imm {};\n    if (OffsetType != MemOffsetType::SXTX || !IsValueConstant(WrapNode(Offset), &Imm)) {\n      return Offset;\n    }\n\n    // The immediate may be scaled in the IR, we need to correct for that.\n    Imm *= OffsetScale;\n\n    // Signed immediate unscaled 9-bit range for both regular and LRCPC2 ops.\n    bool IsSIMM9 = ((int64_t)Imm >= -256) && ((int64_t)Imm <= 255);\n    IsSIMM9 &= (SupportsTSOImm9 || !TSO);\n\n    // Extended offsets for regular loadstore only.\n    LOGMAN_THROW_A_FMT(Size >= IR::OpSize::i8Bit && Size <= IR::OpSize::i256Bit, \"Must be sized\");\n\n    bool IsExtended = (Imm & (IR::OpSizeToSize(Size) - 1)) == 0 && Imm / IR::OpSizeToSize(Size) <= 4095;\n    IsExtended &= !TSO;\n\n    if (IsSIMM9 || IsExtended) {\n      OffsetScale = 1;\n      return _InlineConstant(Imm);\n    } else {\n      return Offset;\n    }\n  }\n\n#define DEF_INLINE(Type, Variable, Filter)                          \\\n  Ref Inline##Type(OpSize Size, Ref Source) {                       \\\n    uint64_t Variable;                                              \\\n    if (IsValueConstant(WrapNode(Source), &Variable) && (Filter)) { \\\n      return _InlineConstant(Variable);                             \\\n    } else {                                                        \\\n      return Source;                                                \\\n    }                                                               \\\n  }\n\n  DEF_INLINE(Any, _, true)\n  DEF_INLINE(Zero, X, X == 0)\n  DEF_INLINE(AddSub, X, ARMEmitter::IsImmAddSub(X))\n  DEF_INLINE(LargeAddSub, X, ARMEmitter::IsImmAddSub(X) && Size >= OpSize::i32Bit);\n  DEF_INLINE(Logical, X, ARMEmitter::Emitter::IsImmLogical(X, std::max((int)IR::OpSizeAsBits(Size), 32)));\n\n  Ref InlineSubtractZero(OpSize Size, Ref Src1, Ref Src2) {\n    // Only inline a zero if we won't inline the other source.\n    return IsValueConstant(WrapNode(Src2)) ? Src1 : InlineZero(Size, Src1);\n  }\n#undef DEF_INLINE\n\n// These handlers add cost to the constructor and destructor\n// If it becomes an issue then blow them away\n// GCC also generates some pretty atrocious code around these\n// Use Clang!\n#define IROP_ALLOCATE_HELPERS\n#define IROP_DISPATCH_HELPERS\n#include <FEXCore/IR/IRDefines.inc>\n  IRPair<IROp_Jump> _Jump() {\n    return _Jump(InvalidNode);\n  }\n  IRPair<IROp_CondJump> _CondJump(Ref ssa0, CondClass cond = CondClass::NEQ) {\n    return _CondJump(ssa0, _Constant(0), InvalidNode, InvalidNode, cond, GetOpSize(ssa0));\n  }\n  IRPair<IROp_CondJump> _CondJump(Ref ssa0, Ref ssa1, Ref ssa2, CondClass cond = CondClass::NEQ) {\n    return _CondJump(ssa0, _Constant(0), ssa1, ssa2, cond, GetOpSize(ssa0));\n  }\n\n  IRPair<IROp_LoadContext> _LoadContextGPR(OpSize ByteSize, uint32_t Offset) {\n    return _LoadContext(ByteSize, RegClass::GPR, Offset);\n  }\n  IRPair<IROp_LoadContext> _LoadContextFPR(OpSize ByteSize, uint32_t Offset) {\n    return _LoadContext(ByteSize, RegClass::FPR, Offset);\n  }\n  IRPair<IROp_StoreContext> _StoreContextGPR(OpSize ByteSize, Ref Value, uint32_t Offset) {\n    return _StoreContext(ByteSize, RegClass::GPR, Value, Offset);\n  }\n  IRPair<IROp_StoreContext> _StoreContextFPR(OpSize ByteSize, Ref Value, uint32_t Offset) {\n    return _StoreContext(ByteSize, RegClass::FPR, Value, Offset);\n  }\n\n  IRPair<IROp_LoadContextIndexed> _LoadContextGPRIndexed(Ref Index, OpSize ByteSize, uint32_t BaseOffset, uint32_t Stride) {\n    return _LoadContextIndexed(Index, ByteSize, BaseOffset, Stride, RegClass::GPR);\n  }\n  IRPair<IROp_LoadContextIndexed> _LoadContextFPRIndexed(Ref Index, OpSize ByteSize, uint32_t BaseOffset, uint32_t Stride) {\n    return _LoadContextIndexed(Index, ByteSize, BaseOffset, Stride, RegClass::FPR);\n  }\n  IRPair<IROp_StoreContextIndexed> _StoreContextGPRIndexed(Ref Value, Ref Index, OpSize ByteSize, uint32_t BaseOffset, uint32_t Stride) {\n    return _StoreContextIndexed(Value, Index, ByteSize, BaseOffset, Stride, RegClass::GPR);\n  }\n  IRPair<IROp_StoreContextIndexed> _StoreContextFPRIndexed(Ref Value, Ref Index, OpSize ByteSize, uint32_t BaseOffset, uint32_t Stride) {\n    return _StoreContextIndexed(Value, Index, ByteSize, BaseOffset, Stride, RegClass::FPR);\n  }\n\n  IRPair<IROp_LoadMem> _LoadMem(RegClass Class, OpSize Size, Ref ssa0, OpSize Align = OpSize::i8Bit) {\n    return _LoadMem(Class, Size, ssa0, Invalid(), Align, MemOffsetType::SXTX, 1);\n  }\n  IRPair<IROp_LoadMem> _LoadMemGPR(OpSize Size, Ref ssa0, OpSize Align = OpSize::i8Bit) {\n    return _LoadMem(RegClass::GPR, Size, ssa0, Invalid(), Align, MemOffsetType::SXTX, 1);\n  }\n  IRPair<IROp_LoadMem> _LoadMemGPR(OpSize Size, Ref Addr, Ref Offset, OpSize Align, MemOffsetType OffsetType, uint8_t OffsetScale) {\n    return _LoadMem(RegClass::GPR, Size, Addr, Offset, Align, OffsetType, OffsetScale);\n  }\n  IRPair<IROp_LoadMem> _LoadMemFPR(OpSize Size, Ref ssa0, OpSize Align = OpSize::i8Bit) {\n    return _LoadMem(RegClass::FPR, Size, ssa0, Invalid(), Align, MemOffsetType::SXTX, 1);\n  }\n  IRPair<IROp_LoadMem> _LoadMemFPR(OpSize Size, Ref Addr, Ref Offset, OpSize Align, MemOffsetType OffsetType, uint8_t OffsetScale) {\n    return _LoadMem(RegClass::FPR, Size, Addr, Offset, Align, OffsetType, OffsetScale);\n  }\n  IRPair<IROp_StoreMem> _StoreMem(RegClass Class, OpSize Size, Ref Addr, Ref Value, OpSize Align = OpSize::i8Bit) {\n    return _StoreMem(Class, Size, Value, Addr, Invalid(), Align, MemOffsetType::SXTX, 1);\n  }\n  IRPair<IROp_StoreMem> _StoreMemGPR(OpSize Size, Ref Addr, Ref Value, OpSize Align = OpSize::i8Bit) {\n    return _StoreMem(RegClass::GPR, Size, Value, Addr, Invalid(), Align, MemOffsetType::SXTX, 1);\n  }\n  IRPair<IROp_StoreMem> _StoreMemGPR(OpSize Size, Ref Value, Ref Addr, Ref Offset, OpSize Align, MemOffsetType OffsetType, uint8_t OffsetScale) {\n    return _StoreMem(RegClass::GPR, Size, Value, Addr, Offset, Align, OffsetType, OffsetScale);\n  }\n  IRPair<IROp_StoreMem> _StoreMemFPR(OpSize Size, Ref Addr, Ref Value, OpSize Align = OpSize::i8Bit) {\n    return _StoreMem(RegClass::FPR, Size, Value, Addr, Invalid(), Align, MemOffsetType::SXTX, 1);\n  }\n  IRPair<IROp_StoreMem> _StoreMemFPR(OpSize Size, Ref Value, Ref Addr, Ref Offset, OpSize Align, MemOffsetType OffsetType, uint8_t OffsetScale) {\n    return _StoreMem(RegClass::FPR, Size, Value, Addr, Offset, Align, OffsetType, OffsetScale);\n  }\n\n  IRPair<IROp_StoreMemPair> _StoreMemPairGPR(OpSize Size, Ref Value1, Ref Value2, Ref Addr, uint32_t Offset) {\n    return _StoreMemPair(RegClass::GPR, Size, Value1, Value2, Addr, Offset);\n  }\n  IRPair<IROp_StoreMemPair> _StoreMemPairFPR(OpSize Size, Ref Value1, Ref Value2, Ref Addr, uint32_t Offset) {\n    return _StoreMemPair(RegClass::FPR, Size, Value1, Value2, Addr, Offset);\n  }\n\n  IRPair<IROp_Select> Select01(FEXCore::IR::OpSize CompareSize, CondClass Cond, OrderedNode* Cmp1, OrderedNode* Cmp2) {\n    return _Select(OpSize::i64Bit, CompareSize, Cond, Cmp1, Cmp2, _InlineConstant(1), _InlineConstant(0));\n  }\n\n  IRPair<IROp_Select> To01(FEXCore::IR::OpSize CompareSize, OrderedNode* Cmp1) {\n    return Select01(CompareSize, CondClass::NEQ, Cmp1, Constant(0));\n  }\n\n  IRPair<IROp_NZCVSelect> _NZCVSelect01(CondClass Cond) {\n    return _NZCVSelect(OpSize::i64Bit, Cond, _InlineConstant(1), _InlineConstant(0));\n  }\n\n  Ref Addsub(IR::OpSize Size, IROps Op, IROps NegatedOp, Ref Src1, uint64_t Src2) {\n    // Sign-extend the constant\n    if (Size == OpSize::i32Bit) {\n      Src2 = (int64_t)(int32_t)Src2;\n    }\n\n    // Negative constants need to be negated to inline.\n    if (Src2 & (1ull << 63) && ARMEmitter::IsImmAddSub(-Src2)) {\n      Op = NegatedOp;\n      Src2 = -Src2;\n    }\n\n    auto Dest = _Add(Size, Src1, Constant(Src2));\n    Dest.first->Header.Op = Op;\n    return Dest;\n  }\n\n  Ref Add(IR::OpSize Size, Ref Src1, uint64_t Src2) {\n    return Addsub(Size, OP_ADD, OP_SUB, Src1, Src2);\n  }\n\n  Ref Sub(IR::OpSize Size, Ref Src1, uint64_t Src2) {\n    return Addsub(Size, OP_SUB, OP_ADD, Src1, Src2);\n  }\n\n  Ref AddWithFlags(IR::OpSize Size, Ref Src1, uint64_t Src2) {\n    return Addsub(Size, OP_ADDWITHFLAGS, OP_SUBWITHFLAGS, Src1, Src2);\n  }\n\n  Ref SubWithFlags(IR::OpSize Size, Ref Src1, uint64_t Src2) {\n    return Addsub(Size, OP_SUBWITHFLAGS, OP_ADDWITHFLAGS, Src1, Src2);\n  }\n\n#define DEF_ADDSUB(Op)                                \\\n  Ref Op(IR::OpSize Size, Ref Src1, Ref Src2) {       \\\n    uint64_t Constant;                                \\\n    if (IsValueConstant(WrapNode(Src2), &Constant)) { \\\n      return Op(Size, Src1, Constant);                \\\n    } else {                                          \\\n      return _##Op(Size, Src1, Src2);                 \\\n    }                                                 \\\n  }\n\n  DEF_ADDSUB(Add)\n  DEF_ADDSUB(Sub)\n  DEF_ADDSUB(AddWithFlags)\n  DEF_ADDSUB(SubWithFlags)\n\n  struct ConstantData {\n    int64_t Value;\n    ConstPad Pad;\n    int32_t MaxBytes;\n    [[nodiscard]] auto operator<=>(const ConstantData&) const noexcept = default;\n  };\n  ConstantData Constants[32];\n  Ref ConstantRefs[32];\n  uint32_t NrConstants;\n\n  Ref Constant(int64_t Value, ConstPad Pad = IR::ConstPad::NoPad, int32_t MaxBytes = 0) {\n    const ConstantData Data {\n      .Value = Value,\n      .Pad = Pad,\n      .MaxBytes = MaxBytes,\n    };\n    // Search for the constant in the pool.\n    for (unsigned i = 0; i < std::min(NrConstants, 32u); ++i) {\n      if (Constants[i] == Data) {\n        return ConstantRefs[i];\n      }\n    }\n\n    // Otherwise, materialize a fresh constant and pool it.\n    Ref R = _Constant(Value, Pad, MaxBytes);\n    unsigned i = (NrConstants++) & 31;\n    Constants[i] = Data;\n    ConstantRefs[i] = R;\n    return R;\n  }\n\n  Ref Invalid() {\n    return InvalidNode;\n  }\n\n  void SetJumpTarget(IR::IROp_Jump* Op, Ref Target) {\n    LOGMAN_THROW_A_FMT(Target->Op(DualListData.DataBegin())->Op == OP_CODEBLOCK, \"Tried setting Jump target to %{} {}\",\n                       Target->Wrapped(DualListData.ListBegin()).ID(), IR::GetName(Target->Op(DualListData.DataBegin())->Op));\n\n    Op->Header.Args[0].NodeOffset = Target->Wrapped(DualListData.ListBegin()).NodeOffset;\n  }\n  void SetTrueJumpTarget(IR::IROp_CondJump* Op, Ref Target) {\n    LOGMAN_THROW_A_FMT(Target->Op(DualListData.DataBegin())->Op == OP_CODEBLOCK, \"Tried setting CondJump target to %{} {}\",\n                       Target->Wrapped(DualListData.ListBegin()).ID(), IR::GetName(Target->Op(DualListData.DataBegin())->Op));\n\n    Op->TrueBlock.NodeOffset = Target->Wrapped(DualListData.ListBegin()).NodeOffset;\n  }\n  void SetFalseJumpTarget(IR::IROp_CondJump* Op, Ref Target) {\n    LOGMAN_THROW_A_FMT(Target->Op(DualListData.DataBegin())->Op == OP_CODEBLOCK, \"Tried setting CondJump target to %{} {}\",\n                       Target->Wrapped(DualListData.ListBegin()).ID(), IR::GetName(Target->Op(DualListData.DataBegin())->Op));\n\n    Op->FalseBlock.NodeOffset = Target->Wrapped(DualListData.ListBegin()).NodeOffset;\n  }\n\n  void SetJumpTarget(IRPair<IROp_Jump> Op, Ref Target) {\n    LOGMAN_THROW_A_FMT(Target->Op(DualListData.DataBegin())->Op == OP_CODEBLOCK, \"Tried setting Jump target to %{} {}\",\n                       Target->Wrapped(DualListData.ListBegin()).ID(), IR::GetName(Target->Op(DualListData.DataBegin())->Op));\n\n    Op.first->Header.Args[0].NodeOffset = Target->Wrapped(DualListData.ListBegin()).NodeOffset;\n  }\n  void SetTrueJumpTarget(IRPair<IROp_CondJump> Op, Ref Target) {\n    LOGMAN_THROW_A_FMT(Target->Op(DualListData.DataBegin())->Op == OP_CODEBLOCK, \"Tried setting CondJump target to %{} {}\",\n                       Target->Wrapped(DualListData.ListBegin()).ID(), IR::GetName(Target->Op(DualListData.DataBegin())->Op));\n    Op.first->TrueBlock.NodeOffset = Target->Wrapped(DualListData.ListBegin()).NodeOffset;\n  }\n  void SetFalseJumpTarget(IRPair<IROp_CondJump> Op, Ref Target) {\n    LOGMAN_THROW_A_FMT(Target->Op(DualListData.DataBegin())->Op == OP_CODEBLOCK, \"Tried setting CondJump target to %{} {}\",\n                       Target->Wrapped(DualListData.ListBegin()).ID(), IR::GetName(Target->Op(DualListData.DataBegin())->Op));\n    Op.first->FalseBlock.NodeOffset = Target->Wrapped(DualListData.ListBegin()).NodeOffset;\n  }\n\n  /**  @} */\n  RegClass WalkFindRegClass(OrderedNodeWrapper ssa) {\n    Ref RealNode = ssa.GetNode(DualListData.ListBegin());\n    return WalkFindRegClass(RealNode);\n  }\n\n  bool IsValueConstant(OrderedNodeWrapper ssa, uint64_t* Constant = nullptr) {\n    Ref RealNode = ssa.GetNode(DualListData.ListBegin());\n    FEXCore::IR::IROp_Header* IROp = RealNode->Op(DualListData.DataBegin());\n    if (IROp->Op == OP_CONSTANT) {\n      auto Op = IROp->C<IR::IROp_Constant>();\n      if (Constant) {\n        *Constant = Op->Constant;\n      }\n      return true;\n    }\n    return false;\n  }\n\n  bool IsValueInlineConstant(OrderedNodeWrapper ssa) {\n    Ref RealNode = ssa.GetNode(DualListData.ListBegin());\n    FEXCore::IR::IROp_Header* IROp = RealNode->Op(DualListData.DataBegin());\n    if (IROp->Op == OP_INLINECONSTANT) {\n      return true;\n    }\n    return false;\n  }\n\n  FEXCore::IR::IROp_Header* GetOpHeader(OrderedNodeWrapper ssa) {\n    Ref RealNode = ssa.GetNode(DualListData.ListBegin());\n    return RealNode->Op(DualListData.DataBegin());\n  }\n\n  Ref UnwrapNode(OrderedNodeWrapper ssa) {\n    return ssa.GetNode(DualListData.ListBegin());\n  }\n\n  OrderedNodeWrapper WrapNode(Ref node) {\n    return node->Wrapped(DualListData.ListBegin());\n  }\n\n  NodeIterator GetIterator(OrderedNodeWrapper wrapper) {\n    return NodeIterator(DualListData.ListBegin(), DualListData.DataBegin(), wrapper);\n  }\n\n  void ReplaceAllUsesWithRange(Ref Node, Ref NewNode, AllNodesIterator Begin, AllNodesIterator End);\n\n  void ReplaceUsesWithAfter(Ref Node, Ref NewNode, AllNodesIterator After) {\n    ++After;\n    ReplaceAllUsesWithRange(Node, NewNode, After, AllNodesIterator(DualListData.ListBegin(), DualListData.DataBegin()));\n  }\n\n  void ReplaceUsesWithAfter(Ref Node, Ref NewNode, Ref After) {\n    auto Wrapped = After->Wrapped(DualListData.ListBegin());\n    AllNodesIterator It = AllNodesIterator(DualListData.ListBegin(), DualListData.DataBegin(), Wrapped);\n\n    ReplaceUsesWithAfter(Node, NewNode, It);\n  }\n\n  void ReplaceNodeArgument(Ref Node, uint8_t Arg, Ref NewArg);\n\n  void Remove(Ref Node);\n  void RemovePostRA(Ref Node);\n\n  void CopyData(const IREmitter& rhs) {\n    LOGMAN_THROW_A_FMT(rhs.DualListData.DataBackingSize() <= DualListData.DataBackingSize(), \"Trying to take ownership of data that is too \"\n                                                                                             \"large\");\n    LOGMAN_THROW_A_FMT(rhs.DualListData.ListBackingSize() <= DualListData.ListBackingSize(), \"Trying to take ownership of data that is too \"\n                                                                                             \"large\");\n    DualListData.CopyData(rhs.DualListData);\n    InvalidNode = rhs.InvalidNode->Wrapped(rhs.DualListData.ListBegin()).GetNode(DualListData.ListBegin());\n    CurrentWriteCursor = rhs.CurrentWriteCursor;\n    CodeBlocks = rhs.CodeBlocks;\n    for (auto& CodeBlock : CodeBlocks) {\n      CodeBlock = CodeBlock->Wrapped(rhs.DualListData.ListBegin()).GetNode(DualListData.ListBegin());\n    }\n  }\n\n  void SetWriteCursor(Ref Node) {\n    CurrentWriteCursor = Node;\n  }\n\n  // Set cursor to write before Node\n  void SetWriteCursorBefore(Ref Node) {\n    auto IR = ViewIR();\n    auto Before = IR.at(Node);\n    --Before;\n\n    SetWriteCursor((*Before).Node);\n  }\n\n  Ref GetWriteCursor() {\n    return CurrentWriteCursor;\n  }\n\n  Ref GetCurrentBlock() {\n    return CurrentCodeBlock;\n  }\n\n  /**\n   * @brief This creates an orphaned code node\n   * The IROp backing is in the correct list but the OrderedNode lives outside of the list\n   *\n   * XXX: This is because we don't want code blocks to interleave with current instruction IR ops currently\n   * We can change this behaviour once we remove the old BeginBlock/EndBlock types\n   *\n   * @return OrderedNode\n   */\n  IRPair<IROp_CodeBlock> CreateCodeNode(bool EntryPoint = false, uint32_t GuestEntryOffset = 0) {\n    SetWriteCursor(nullptr); // Orphan from any previous nodes\n\n    auto ID = ViewIR().GetHeader()->BlockCount++;\n    auto CodeNode = _CodeBlock(InvalidNode, InvalidNode, ID, EntryPoint, GuestEntryOffset);\n\n    CodeBlocks.emplace_back(CodeNode);\n\n    SetWriteCursor(nullptr); // Orphan from any future nodes\n\n    auto Begin = _BeginBlock(CodeNode);\n    CodeNode.first->Begin = Begin.Node->Wrapped(DualListData.ListBegin());\n\n    auto EndBlock = _EndBlock(CodeNode);\n    CodeNode.first->Last = EndBlock.Node->Wrapped(DualListData.ListBegin());\n\n    return CodeNode;\n  }\n\n  /**\n   * @name Links codeblocks together\n   * Codeblocks are singly linked so we need to walk the list forward if the linked block isn't isn't the last\n   *\n   * eq.\n   * CodeNode->Next -> Next\n   * to\n   * CodeNode->Next -> New -> Next\n   *\n   * @{ */\n  /**  @} */\n  void LinkCodeBlocks(Ref CodeNode, Ref Next) {\n    [[maybe_unused]] auto CurrentIROp = CodeNode->Op(DualListData.DataBegin())->CW<FEXCore::IR::IROp_CodeBlock>();\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    LOGMAN_THROW_A_FMT(CurrentIROp->Header.Op == IROps::OP_CODEBLOCK, \"Invalid\");\n#endif\n\n    CodeNode->append(DualListData.ListBegin(), Next);\n  }\n\n  IRPair<IROp_CodeBlock> CreateNewCodeBlockAtEnd() {\n    return CreateNewCodeBlockAfter(nullptr);\n  }\n  IRPair<IROp_CodeBlock> CreateNewCodeBlockAfter(Ref insertAfter);\n  void SetCurrentCodeBlock(Ref Node);\n\nprotected:\n  void RemoveArgUses(Ref Node);\n\n  Ref CreateNode(IROp_Header* Op) {\n    uintptr_t ListBegin = DualListData.ListBegin();\n    size_t Size = sizeof(OrderedNode);\n    void* Ptr = DualListData.ListAllocate(Size);\n    Ref Node = new (Ptr) OrderedNode();\n    Node->Header.Value.SetOffset(DualListData.DataBegin(), reinterpret_cast<uintptr_t>(Op));\n\n    if (CurrentWriteCursor) {\n      CurrentWriteCursor->append(ListBegin, Node);\n    }\n    CurrentWriteCursor = Node;\n    return Node;\n  }\n\n  Ref GetNode(uint32_t SSANode) {\n    uintptr_t ListBegin = DualListData.ListBegin();\n    Ref Node = reinterpret_cast<Ref>(ListBegin + SSANode * sizeof(OrderedNode));\n    return Node;\n  }\n\n  Ref EmplaceOrphanedNode(Ref OldNode) {\n    size_t Size = sizeof(OrderedNode);\n    Ref Ptr = reinterpret_cast<Ref>(DualListData.ListAllocate(Size));\n    memcpy(Ptr, OldNode, Size);\n    return Ptr;\n  }\n\n  // MMX State can be either MMX (for 64bit) or x87 FPU (for 80bit)\n  enum { MMXState_MMX, MMXState_X87 } MMXState = MMXState_MMX;\n\n  // Overriden by dispatcher, stubbed for IR tests\n  virtual void RecordX87Use() {}\n  virtual void ChgStateX87_MMX() {}\n  virtual void ChgStateMMX_X87() {}\n  virtual void SaveNZCV(IROps Op) {}\n\n  Ref CurrentWriteCursor = nullptr;\n\n  // These could be combined with a little bit of work to be more efficient with memory usage. Isn't a big deal\n  DualIntrusiveAllocatorThreadPool DualListData;\n\n  Ref InvalidNode {};\n  Ref CurrentCodeBlock {};\n  fextl::vector<Ref> CodeBlocks;\n  uint64_t Entry {};\n  bool SupportsTSOImm9 {};\n\nprivate:\n  void ResetWorkingList();\n};\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/IntrusiveIRList.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"Interface/IR/IR.h\"\n\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/ThreadPoolAllocator.h>\n\n#include <cstddef>\n#include <cstdint>\n#include <cstring>\n#include <type_traits>\n\nnamespace FEXCore::IR {\n/**\n * @brief This is purely an intrusive allocator\n * This doesn't support any form of ordering at all\n * Just provides a chunk of memory for allocating IR nodes from\n *\n * Can potentially support reallocation if we are smart and make sure to invalidate anything holding a true pointer\n */\nclass DualIntrusiveAllocator {\npublic:\n  [[nodiscard]]\n  bool DataCheckSize(size_t Size) const {\n    size_t NewOffset = DataCurrentOffset + Size;\n    return NewOffset <= MemorySize;\n  }\n\n  [[nodiscard]]\n  bool ListCheckSize(size_t Size) const {\n    size_t NewOffset = ListCurrentOffset + Size;\n    return NewOffset <= MemorySize;\n  }\n\n  [[nodiscard]]\n  void* DataAllocate(size_t Size) {\n    LOGMAN_THROW_A_FMT(DataCheckSize(Size), \"Ran out of space in DualIntrusiveAllocator during allocation\");\n    size_t NewOffset = DataCurrentOffset + Size;\n    uintptr_t NewPointer = Data + DataCurrentOffset;\n    DataCurrentOffset = NewOffset;\n    return reinterpret_cast<void*>(NewPointer);\n  }\n\n  [[nodiscard]]\n  void* ListAllocate(size_t Size) {\n    LOGMAN_THROW_A_FMT(ListCheckSize(Size), \"Ran out of space in DualIntrusiveAllocator during allocation\");\n    size_t NewOffset = ListCurrentOffset + Size;\n    uintptr_t NewPointer = List + ListCurrentOffset;\n    ListCurrentOffset = NewOffset;\n    return reinterpret_cast<void*>(NewPointer);\n  }\n\n  [[nodiscard]]\n  size_t DataSize() const {\n    return DataCurrentOffset;\n  }\n  [[nodiscard]]\n  size_t DataBackingSize() const {\n    return MemorySize;\n  }\n\n  [[nodiscard]]\n  size_t ListSize() const {\n    return ListCurrentOffset;\n  }\n  [[nodiscard]]\n  size_t ListBackingSize() const {\n    return MemorySize;\n  }\n\n  [[nodiscard]]\n  uintptr_t DataBegin() const {\n    return Data;\n  }\n  [[nodiscard]]\n  uintptr_t ListBegin() const {\n    return List;\n  }\n\n  void Reset() {\n    DataCurrentOffset = 0;\n    ListCurrentOffset = 0;\n  }\n\n  void CopyData(const DualIntrusiveAllocator& rhs) {\n    DataCurrentOffset = rhs.DataCurrentOffset;\n    ListCurrentOffset = rhs.ListCurrentOffset;\n    memcpy(reinterpret_cast<void*>(Data), reinterpret_cast<void*>(rhs.Data), DataCurrentOffset);\n    memcpy(reinterpret_cast<void*>(List), reinterpret_cast<void*>(rhs.List), ListCurrentOffset);\n  }\n\nprotected:\n  DualIntrusiveAllocator(size_t Size)\n    : MemorySize {Size} {}\n\n  uintptr_t Data {};\n  uintptr_t List {};\n  size_t DataCurrentOffset {0};\n  size_t ListCurrentOffset {0};\n  size_t MemorySize {};\n};\n\nclass DualIntrusiveAllocatorMalloc final : public DualIntrusiveAllocator {\npublic:\n  DualIntrusiveAllocatorMalloc(size_t Size)\n    : DualIntrusiveAllocator {Size} {\n    Data = reinterpret_cast<uintptr_t>(FEXCore::Allocator::malloc(Size * 2));\n    List = reinterpret_cast<uintptr_t>(Data + Size);\n  }\n\n  ~DualIntrusiveAllocatorMalloc() {\n    FEXCore::Allocator::free(reinterpret_cast<void*>(Data));\n  }\n};\n\nclass DualIntrusiveAllocatorThreadPool final : public DualIntrusiveAllocator {\npublic:\n  DualIntrusiveAllocatorThreadPool(FEXCore::Utils::IntrusivePooledAllocator& ThreadAllocator, size_t Size)\n    : DualIntrusiveAllocator {Size}\n    , PoolObject {ThreadAllocator, Size * 2} {}\n  void ReownOrClaimBuffer() {\n    Data = PoolObject.ReownOrClaimBuffer();\n    List = Data + MemorySize;\n  }\n\n  void DelayedDisownBuffer() {\n    PoolObject.DelayedDisownBuffer();\n  }\n\nprivate:\n  Utils::PoolBufferWithTimedRetirement<uintptr_t, 5000, 500> PoolObject;\n};\n\nclass IRListView final {\npublic:\n  IRListView() = delete;\n\n  IRListView(DualIntrusiveAllocator* Data)\n    : IRListView(reinterpret_cast<void*>(Data->DataBegin()), reinterpret_cast<void*>(Data->ListBegin()), Data->DataSize(), Data->ListSize()) {}\n\n  IRListView(IRListView* Old)\n    : IRListView(Old->IRDataInternal, Old->ListDataInternal, Old->DataSize, Old->ListSize) {}\n\n  IRListView(void* IRData_, void* ListData_, size_t DataSize_, size_t ListSize_)\n    : IRDataInternal(IRData_)\n    , ListDataInternal(ListData_)\n    , DataSize(DataSize_)\n    , ListSize(ListSize_) {}\n\n  [[nodiscard]]\n  size_t GetInlineSize() const {\n    static_assert(sizeof(*this) == 32);\n    return sizeof(*this) + DataSize + ListSize;\n  }\n\n  [[nodiscard]]\n  size_t GetDataSize() const {\n    return DataSize;\n  }\n  [[nodiscard]]\n  size_t GetListSize() const {\n    return ListSize;\n  }\n  [[nodiscard]]\n  size_t GetSSACount() const {\n    return ListSize / sizeof(OrderedNode);\n  }\n\n  [[nodiscard]]\n  NodeID GetID(const Ref Node) const {\n    return Node->Wrapped(GetListData()).ID();\n  }\n\n  [[nodiscard]]\n  Ref GetHeaderNode() const {\n    OrderedNodeWrapper Wrapped;\n    Wrapped.NodeOffset = sizeof(OrderedNode);\n    return Wrapped.GetNode(GetListData());\n  }\n\n  [[nodiscard]]\n  IROp_IRHeader* GetHeader() const {\n    return GetOp<IROp_IRHeader>(GetHeaderNode());\n  }\n\n  [[nodiscard]]\n  unsigned PostRA() const {\n    return GetHeader()->PostRA;\n  }\n\n  [[nodiscard]]\n  unsigned SpillSlots() const {\n    return GetHeader()->SpillSlots;\n  }\n\n  template<typename T>\n  [[nodiscard]]\n  T* GetOp(Ref Node) const {\n    auto OpHeader = Node->Op(GetData());\n    auto Op = OpHeader->template CW<T>();\n\n    // If we are casting to something narrower than just the header, check the opcode.\n    if constexpr (!std::is_same<T, IROp_Header>::value) {\n      LOGMAN_THROW_A_FMT(Op->OPCODE == Op->Header.Op, \"Expected Node to be '{}'. Found '{}' instead\", GetName(Op->OPCODE),\n                         GetName(Op->Header.Op));\n    }\n\n    return Op;\n  }\n\n  template<typename T>\n  [[nodiscard]]\n  T* GetOp(OrderedNodeWrapper Wrapper) const {\n    auto Node = Wrapper.GetNode(GetListData());\n    return GetOp<T>(Node);\n  }\n\n  [[nodiscard]]\n  Ref GetNode(OrderedNodeWrapper Wrapper) const {\n    return Wrapper.GetNode(GetListData());\n  }\n\n  ///< Gets an OrderedNode from the IRListView as an OrderedNodeWrapper.\n  [[nodiscard]]\n  OrderedNodeWrapper WrapNode(Ref Node) const {\n    return Node->Wrapped(GetListData());\n  }\n\nprivate:\n  struct BlockRange {\n    using iterator = NodeIterator;\n    const IRListView* View;\n\n    BlockRange(const IRListView* parent)\n      : View(parent) {};\n\n    [[nodiscard]]\n    iterator begin() const noexcept {\n      auto Header = View->GetHeader();\n      return iterator(View->GetListData(), View->GetData(), Header->Blocks);\n    }\n\n    [[nodiscard]]\n    iterator end() const noexcept {\n      return iterator(View->GetListData(), View->GetData());\n    }\n  };\n\n  struct CodeRange {\n    using iterator = NodeIterator;\n    const IRListView* View;\n    const OrderedNodeWrapper BlockWrapper;\n\n    CodeRange(const IRListView* parent, OrderedNodeWrapper block)\n      : View(parent)\n      , BlockWrapper(block) {};\n\n    [[nodiscard]]\n    iterator begin() const noexcept {\n      auto Block = View->GetOp<IROp_CodeBlock>(BlockWrapper);\n      return iterator(View->GetListData(), View->GetData(), Block->Begin);\n    }\n\n    [[nodiscard]]\n    iterator end() const noexcept {\n      return iterator(View->GetListData(), View->GetData());\n    }\n  };\n\n  struct AllCodeRange {\n    using iterator = AllNodesIterator; // Diffrent Iterator\n    const IRListView* View;\n\n    AllCodeRange(const IRListView* parent)\n      : View(parent) {};\n\n    [[nodiscard]]\n    iterator begin() const noexcept {\n      auto Header = View->GetHeader();\n      return iterator(View->GetListData(), View->GetData(), Header->Blocks);\n    }\n\n    [[nodiscard]]\n    iterator end() const noexcept {\n      return iterator(View->GetListData(), View->GetData());\n    }\n  };\n\npublic:\n  using iterator = NodeIterator;\n\n  [[nodiscard]]\n  BlockRange GetBlocks() const {\n    return BlockRange(this);\n  }\n\n  [[nodiscard]]\n  CodeRange GetCode(const Ref block) const {\n    return CodeRange(this, block->Wrapped(GetListData()));\n  }\n\n  [[nodiscard]]\n  AllCodeRange GetAllCode() const {\n    return AllCodeRange(this);\n  }\n\n  [[nodiscard]]\n  iterator begin() const noexcept {\n    OrderedNodeWrapper Wrapped;\n    Wrapped.NodeOffset = sizeof(OrderedNode);\n    return iterator(GetListData(), GetData(), Wrapped);\n  }\n\n  /**\n   * @brief This is not an iterator that you can reverse iterator through!\n   *\n   * @return Our iterator sentinel to ensure ending correctly\n   */\n  [[nodiscard]]\n  iterator end() const noexcept {\n    OrderedNodeWrapper Wrapped;\n    Wrapped.NodeOffset = 0;\n    return iterator(GetListData(), GetData(), Wrapped);\n  }\n\n  /**\n   * @brief Convert a OrderedNodeWrapper to an interator that we can iterate over\n   * @return Iterator for this op\n   */\n  [[nodiscard]]\n  iterator at(OrderedNodeWrapper Wrapped) const noexcept {\n    return iterator(GetListData(), GetData(), Wrapped);\n  }\n\n  [[nodiscard]]\n  iterator at(NodeID ID) const noexcept {\n    OrderedNodeWrapper Wrapped;\n    Wrapped.NodeOffset = ID.Value * sizeof(OrderedNode);\n    return iterator(GetListData(), GetData(), Wrapped);\n  }\n\n  [[nodiscard]]\n  iterator at(const Ref Node) const noexcept {\n    const auto ListData = GetListData();\n    auto Wrapped = Node->Wrapped(ListData);\n    return iterator(ListData, GetData(), Wrapped);\n  }\n\n  [[nodiscard]]\n  uintptr_t GetData() const {\n    return reinterpret_cast<uintptr_t>(IRDataInternal ? IRDataInternal : InlineData);\n  }\n\n  [[nodiscard]]\n  uintptr_t GetListData() const {\n    return reinterpret_cast<uintptr_t>(ListDataInternal ? ListDataInternal : &InlineData[DataSize]);\n  }\n\nprivate:\n  void* IRDataInternal;\n  void* ListDataInternal;\n  size_t DataSize;\n  size_t ListSize;\n  uint8_t InlineData[0];\n};\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/PassManager.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\nmeta: ir|opts ~ IR to IR Optimization\ntags: ir|opts\ndesc: Defines which passes are run, and runs them\n$end_info$\n*/\n\n#include \"Interface/Context/Context.h\"\n#include \"Interface/IR/PassManager.h\"\n#include \"Interface/IR/Passes.h\"\n#include \"Interface/IR/Passes/RegisterAllocationPass.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Utils/Profiler.h>\n\nnamespace FEXCore::IR {\nclass IREmitter;\n\nvoid PassManager::Finalize() {\n  if (!PassManagerDumpIR()) {\n    // Not configured to dump any IR, just return.\n    return;\n  }\n\n  auto it = Passes.begin();\n  // Walk the passes and add them where asked.\n  if (PassManagerDumpIR() & FEXCore::Config::PassManagerDumpIR::BEFOREOPT) {\n    // Insert at the start.\n    it = InsertAt(it, Debug::CreateIRDumper());\n    ++it; // Skip what we inserted.\n  }\n\n  if ((PassManagerDumpIR() & FEXCore::Config::PassManagerDumpIR::BEFOREPASS) ||\n      (PassManagerDumpIR() & FEXCore::Config::PassManagerDumpIR::AFTERPASS)) {\n\n    bool SkipFirstBefore = PassManagerDumpIR() & FEXCore::Config::PassManagerDumpIR::BEFOREOPT;\n    for (; it != Passes.end();) {\n      if (PassManagerDumpIR() & FEXCore::Config::PassManagerDumpIR::BEFOREPASS) {\n        if (SkipFirstBefore) {\n          // If we need to skip the first one, then continue.\n          SkipFirstBefore = false;\n          ++it;\n          continue;\n        }\n\n        // Insert before\n        it = InsertAt(it, Debug::CreateIRDumper());\n        ++it; // Skip what we inserted.\n      }\n\n      ++it; // Skip current pass.\n      if (PassManagerDumpIR() & FEXCore::Config::PassManagerDumpIR::AFTERPASS) {\n        // Insert after\n        it = InsertAt(it, Debug::CreateIRDumper());\n        ++it; // Skip what we inserted.\n      }\n    }\n  }\n  if (PassManagerDumpIR() & FEXCore::Config::PassManagerDumpIR::AFTEROPT) {\n    if (!(PassManagerDumpIR() & FEXCore::Config::PassManagerDumpIR::AFTERPASS)) {\n      // Insert final IRDumper.\n      InsertAt(Passes.end(), Debug::CreateIRDumper());\n    }\n  }\n}\n\nvoid PassManager::AddDefaultPasses(FEXCore::Context::ContextImpl* ctx) {\n  FEX_CONFIG_OPT(DisablePasses, O0);\n\n  if (!DisablePasses()) {\n    InsertPass(CreateX87StackOptimizationPass(ctx->HostFeatures, ctx->Config.Is64BitMode ? IR::OpSize::i64Bit : IR::OpSize::i32Bit));\n    InsertPass(CreateDeadFlagCalculationEliminination());\n  }\n}\n\nvoid PassManager::AddDefaultValidationPasses() {\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  InsertValidationPass(Validation::CreateIRValidation(), \"IRValidation\");\n#endif\n}\n\nvoid PassManager::InsertRegisterAllocationPass(FEXCore::Context::ContextImpl* ctx) {\n  InsertPass(IR::CreateRegisterAllocationPass(&ctx->CPUID), \"RA\");\n}\n\nvoid PassManager::Run(IREmitter* IREmit) {\n  FEXCORE_PROFILE_SCOPED(\"PassManager::Run\");\n\n  for (const auto& Pass : Passes) {\n    Pass->Run(IREmit);\n  }\n\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  for (const auto& Pass : ValidationPasses) {\n    Pass->Run(IREmit);\n  }\n#endif\n}\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/PassManager.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: ir|opts\n$end_info$\n*/\n\n#pragma once\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Utils/ThreadPoolAllocator.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/unordered_map.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <functional>\n#include <utility>\n\nnamespace FEXCore::Context {\nclass ContextImpl;\n}\n\nnamespace FEXCore::HLE {\nclass SyscallHandler;\n}\n\nnamespace FEXCore::IR {\nclass PassManager;\nclass IREmitter;\n\nclass Pass {\npublic:\n  virtual ~Pass() = default;\n  virtual void Run(IREmitter* IREmit) = 0;\n\n  void RegisterPassManager(PassManager* _Manager) {\n    Manager = _Manager;\n  }\n\nprotected:\n  PassManager* Manager {};\n};\n\nclass PassManager final {\npublic:\n  void AddDefaultPasses(FEXCore::Context::ContextImpl* ctx);\n  void AddDefaultValidationPasses();\n  Pass* InsertPass(fextl::unique_ptr<Pass> Pass, fextl::string Name = \"\") {\n    auto PassPtr = InsertAt(Passes.end(), std::move(Pass))->get();\n\n    if (!Name.empty()) {\n      NameToPassMaping[Name] = PassPtr;\n    }\n    return PassPtr;\n  }\n\n  void InsertRegisterAllocationPass(FEXCore::Context::ContextImpl* ctx);\n\n  void Run(IREmitter* IREmit);\n\n  bool HasPass(fextl::string Name) const {\n    return NameToPassMaping.contains(Name);\n  }\n\n  template<typename T>\n  T* GetPass(fextl::string Name) {\n    return dynamic_cast<T*>(NameToPassMaping[Name]);\n  }\n\n  Pass* GetPass(fextl::string Name) {\n    return NameToPassMaping[Name];\n  }\n\n  void RegisterSyscallHandler(FEXCore::HLE::SyscallHandler* Handler) {\n    SyscallHandler = Handler;\n  }\n\n  void Finalize();\n\nprotected:\n  FEXCore::HLE::SyscallHandler* SyscallHandler {};\n\nprivate:\n  using PassArrayType = fextl::vector<fextl::unique_ptr<Pass>>;\n  PassArrayType::iterator InsertAt(PassArrayType::iterator pos, fextl::unique_ptr<Pass> Pass) {\n    Pass->RegisterPassManager(this);\n    return Passes.insert(pos, std::move(Pass));\n  }\n  PassArrayType Passes;\n  fextl::unordered_map<fextl::string, Pass*> NameToPassMaping;\n\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  fextl::vector<fextl::unique_ptr<Pass>> ValidationPasses;\n  void InsertValidationPass(fextl::unique_ptr<Pass> Pass, fextl::string Name = \"\") {\n    Pass->RegisterPassManager(this);\n    auto PassPtr = ValidationPasses.emplace_back(std::move(Pass)).get();\n\n    if (!Name.empty()) {\n      NameToPassMaping[Name] = PassPtr;\n    }\n  }\n#endif\n\n  FEX_CONFIG_OPT(Is64BitMode, IS64BIT_MODE);\n  FEX_CONFIG_OPT(PassManagerDumpIR, PASSMANAGERDUMPIR);\n};\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/Passes/IRDumperPass.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: ir|debug\ndesc: Prints IR\n$end_info$\n*/\n\n#include \"Interface/IR/IR.h\"\n#include \"Interface/IR/IREmitter.h\"\n#include \"Interface/IR/PassManager.h\"\n#include \"Interface/IR/Passes/RegisterAllocationPass.h\"\n#include \"Interface/Core/OpcodeDispatcher.h\"\n\n#include <FEXCore/IR/IR.h>\n\nnamespace FEXCore::IR::Debug {\nclass IRDumper final : public FEXCore::IR::Pass {\npublic:\n  IRDumper();\n  void Run(IREmitter* IREmit) override;\n\nprivate:\n  FEX_CONFIG_OPT(DumpIR, DUMPIR);\n  bool DumpToFile {};\n  bool DumpToLog {};\n};\n\nIRDumper::IRDumper() {\n  const auto& DumpIRStr = DumpIR();\n  if (DumpIRStr == \"stderr\" || DumpIRStr == \"stdout\" || DumpIRStr == \"no\") {\n    // Intentionally do nothing\n  } else if (DumpIRStr == \"server\") {\n    DumpToLog = true;\n  } else {\n    DumpToFile = true;\n  }\n}\n\nvoid IRDumper::Run(IREmitter* IREmit) {\n  FEXCore::File::File FD {};\n  if (DumpIR() == \"stderr\") {\n    FD = FEXCore::File::File::GetStdERR();\n  } else if (DumpIR() == \"stdout\") {\n    FD = FEXCore::File::File::GetStdOUT();\n  }\n\n  auto IR = IREmit->ViewIR();\n  auto HeaderOp = IR.GetHeader();\n  LOGMAN_THROW_A_FMT(HeaderOp->Header.Op == OP_IRHEADER, \"First op wasn't IRHeader\");\n\n  // DumpIRStr might be no if not dumping but ShouldDump is set in OpDisp\n  if (DumpToFile) {\n    const auto fileName = fextl::fmt::format(\"{}/{:x}{}\", DumpIR(), +HeaderOp->OriginalRIP, IR.PostRA() ? \"-post.ir\" : \"-pre.ir\");\n    FD = FEXCore::File::File(fileName.c_str(),\n                             FEXCore::File::FileModes::WRITE | FEXCore::File::FileModes::CREATE | FEXCore::File::FileModes::TRUNCATE);\n  }\n\n  if (FD.IsValid() || DumpToLog) {\n    fextl::stringstream out;\n    FEXCore::IR::Dump(&out, &IR);\n    if (FD.IsValid()) {\n      fextl::fmt::print(FD, \"IR-{} 0x{:x}:\\n{}\\n@@@@@\\n\", IR.PostRA() ? \"post\" : \"pre\", +HeaderOp->OriginalRIP, out.str());\n    } else {\n      LogMan::Msg::IFmt(\"IR-{} 0x{:x}:\\n{}\\n@@@@@\\n\", IR.PostRA() ? \"post\" : \"pre\", +HeaderOp->OriginalRIP, out.str());\n    }\n  }\n}\n\nfextl::unique_ptr<FEXCore::IR::Pass> CreateIRDumper() {\n  return fextl::make_unique<IRDumper>();\n}\n} // namespace FEXCore::IR::Debug\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/Passes/IRValidation.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: ir|opts\ndesc: Sanity checking pass\n$end_info$\n*/\n\n#include \"Interface/IR/IR.h\"\n#include \"Interface/IR/IREmitter.h\"\n#include \"Interface/IR/PassManager.h\"\n#include \"Interface/IR/RegisterAllocationData.h\"\n#include \"Interface/IR/Passes/IRValidation.h\"\n#include \"Interface/IR/Passes/RegisterAllocationPass.h\"\n\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/Profiler.h>\n#include <FEXCore/fextl/sstream.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <cstdint>\n#include <memory>\n#include <stddef.h>\n#include <unordered_map>\n#include <utility>\n\nnamespace FEXCore::IR::Validation {\n\n\nIRValidation::~IRValidation() {\n  NodeIsLive.Free();\n}\n\nvoid IRValidation::Run(IREmitter* IREmit) {\n  FEXCORE_PROFILE_SCOPED(\"PassManager::IRValidation\");\n\n  bool HadError = false;\n  bool HadWarning = false;\n\n  fextl::ostringstream Errors;\n  fextl::ostringstream Warnings;\n\n  auto CurrentIR = IREmit->ViewIR();\n\n  OffsetToBlockMap.clear();\n  EntryBlock = nullptr;\n\n  uint32_t Count = CurrentIR.GetSSACount();\n  if (Count > MaxNodes) {\n    NodeIsLive.Realloc(Count);\n  }\n\n  fextl::vector<uint32_t> Uses(Count, 0);\n\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  auto HeaderOp = CurrentIR.GetHeader();\n  LOGMAN_THROW_A_FMT(HeaderOp->Header.Op == OP_IRHEADER, \"First op wasn't IRHeader\");\n#endif\n\n  for (auto [BlockNode, BlockHeader] : CurrentIR.GetBlocks()) {\n    auto BlockIROp = BlockHeader->CW<FEXCore::IR::IROp_CodeBlock>();\n    LOGMAN_THROW_A_FMT(BlockIROp->Header.Op == OP_CODEBLOCK, \"IR type failed to be a code block\");\n\n    if (!EntryBlock) {\n      EntryBlock = BlockNode;\n    }\n\n    const auto BlockID = CurrentIR.GetID(BlockNode);\n    BlockInfo* CurrentBlock = &OffsetToBlockMap.try_emplace(BlockID).first->second;\n\n    // We only allow defs local to a single block, so clear live set per block\n    NodeIsLive.MemClear(Count);\n\n    for (auto [CodeNode, IROp] : CurrentIR.GetCode(BlockNode)) {\n      const auto ID = CurrentIR.GetID(CodeNode);\n      const auto OpSize = IROp->Size;\n\n      if (GetHasDest(IROp->Op)) {\n        HadError |= OpSize == IR::OpSize::iInvalid;\n        // Does the op have a destination of size 0?\n        if (OpSize == IR::OpSize::iInvalid) {\n          Errors << \"%\" << ID << \": Had destination but with no size\" << std::endl;\n        }\n\n        // Does the node have zero uses? Should have been DCE'd\n        if (CodeNode->GetUses() == 0) {\n          HadWarning |= true;\n          Warnings << \"%\" << ID << \": Destination created but had no uses\" << std::endl;\n        }\n\n        if (CurrentIR.PostRA()) {\n          // After RA, the destination needs to be assigned a register and class\n          auto PhyReg = PhysicalRegister(CodeNode);\n\n          const auto ExpectedClass = IR::GetRegClass(IROp->Op);\n          const auto AssignedClass = PhyReg.AsRegClass();\n\n          // If no register class was assigned\n          if (AssignedClass == IR::RegClass::Invalid) {\n            HadError |= true;\n            Errors << \"%\" << ID << \": Had destination but with no register class assigned\" << std::endl;\n          }\n\n          // If no physical register was assigned\n          if (PhyReg.IsInvalid()) {\n            HadError |= true;\n            Errors << \"%\" << ID << \": Had destination but with no register assigned\" << std::endl;\n          }\n\n          // Assigned class wasn't the expected class and it is a non-complex op\n          if (AssignedClass != ExpectedClass && ExpectedClass != IR::RegClass::Complex) {\n            HadWarning |= true;\n            Warnings << \"%\" << ID << \": Destination had register class \" << uint32_t(AssignedClass) << \" When register class \"\n                     << uint32_t(ExpectedClass) << \" Was expected\" << std::endl;\n          }\n        }\n      }\n\n      uint8_t NumArgs = IR::GetRAArgs(IROp->Op);\n\n      for (uint32_t i = 0; i < NumArgs; ++i) {\n        OrderedNodeWrapper Arg = IROp->Args[i];\n        const auto ArgID = Arg.ID();\n        if (Arg.IsImmediate()) {\n          continue;\n        }\n\n        IROps Op = CurrentIR.GetOp<IROp_Header>(Arg)->Op;\n\n        if (ArgID.IsValid()) {\n          Uses[ArgID.Value]++;\n        }\n\n        // We do not validate the location of inline constants because it's\n        // irrelevant, they're ignored by RA and always inlined to where they\n        // need to be. This lets us pool inline constants globally.\n        bool Ignore = (Op == OP_IRHEADER || Op == OP_INLINECONSTANT);\n\n        if (!Ignore && ArgID.IsValid() && !NodeIsLive.Get(ArgID.Value)) {\n          HadError |= true;\n          Errors << \"%\" << ID << \": Arg[\" << i << \"] references invalid %\" << ArgID << std::endl;\n        }\n      }\n\n      NodeIsLive.Set(ID.Value);\n\n      switch (IROp->Op) {\n      case IR::OP_EXITFUNCTION: {\n        CurrentBlock->HasExit = true;\n        break;\n      }\n      case IR::OP_CONDJUMP: {\n        auto Op = IROp->C<IR::IROp_CondJump>();\n\n        OrderedNode* TrueTargetNode = CurrentIR.GetNode(Op->TrueBlock);\n        OrderedNode* FalseTargetNode = CurrentIR.GetNode(Op->FalseBlock);\n\n        CurrentBlock->Successors.emplace_back(TrueTargetNode);\n        CurrentBlock->Successors.emplace_back(FalseTargetNode);\n\n        const FEXCore::IR::IROp_Header* TrueTargetOp = CurrentIR.GetOp<IROp_Header>(TrueTargetNode);\n        const FEXCore::IR::IROp_Header* FalseTargetOp = CurrentIR.GetOp<IROp_Header>(FalseTargetNode);\n\n        if (TrueTargetOp->Op != OP_CODEBLOCK) {\n          HadError |= true;\n          Errors << \"CondJump %\" << ID << \": True Target Jumps to Op that isn't the begining of a block\" << std::endl;\n        } else {\n          auto Block = OffsetToBlockMap.try_emplace(Op->TrueBlock.ID()).first;\n          Block->second.Predecessors.emplace_back(BlockNode);\n        }\n\n        if (FalseTargetOp->Op != OP_CODEBLOCK) {\n          HadError |= true;\n          Errors << \"CondJump %\" << ID << \": False Target Jumps to Op that isn't the begining of a block\" << std::endl;\n        } else {\n          auto Block = OffsetToBlockMap.try_emplace(Op->FalseBlock.ID()).first;\n          Block->second.Predecessors.emplace_back(BlockNode);\n        }\n\n        break;\n      }\n      case IR::OP_JUMP: {\n        auto Op = IROp->C<IR::IROp_Jump>();\n        OrderedNode* TargetNode = CurrentIR.GetNode(Op->Header.Args[0]);\n        CurrentBlock->Successors.emplace_back(TargetNode);\n\n        const FEXCore::IR::IROp_Header* TargetOp = CurrentIR.GetOp<IROp_Header>(TargetNode);\n        if (TargetOp->Op != OP_CODEBLOCK) {\n          HadError |= true;\n          Errors << \"Jump %\" << ID << \": Jump to Op that isn't the begining of a block\" << std::endl;\n        } else {\n          auto Block = OffsetToBlockMap.try_emplace(Op->Header.Args[0].ID()).first;\n          Block->second.Predecessors.emplace_back(BlockNode);\n        }\n        break;\n      }\n      default:\n        // LOGMAN_MSG_A_FMT(\"Unknown IR Op: {}({})\", IROp->Op, FEXCore::IR::GetName(IROp->Op));\n        break;\n      }\n    }\n\n    // Blocks can only have zero (Exit), 1 (Unconditional branch) or 2 (Conditional) successors\n    size_t NumSuccessors = CurrentBlock->Successors.size();\n    if (NumSuccessors > 2) {\n      HadError |= true;\n      Errors << \"%\" << BlockID << \" Has \" << NumSuccessors << \" successors which is too many\" << std::endl;\n    }\n\n    {\n      auto GetOp = [](auto Code) {\n        auto [CodeNode, IROp] = Code();\n        return IROp->Op;\n      };\n\n      auto CodeCurrent = CurrentIR.at(BlockIROp->Last);\n\n      // Last instruction in the block must be EndBlock\n      {\n        auto Op = GetOp(CodeCurrent);\n        if (Op != IR::OP_ENDBLOCK) {\n          HadError |= true;\n          Errors << \"%\" << BlockID << \" Failed to end block with EndBlock\" << std::endl;\n        }\n      }\n\n      --CodeCurrent;\n\n      // Blocks need to have an instruction that leaves the block in some way before the EndBlock instruction\n      {\n        auto Op = GetOp(CodeCurrent);\n        if (!IsBlockExit(Op)) {\n          HadError |= true;\n          Errors << \"%\" << BlockID << \" Didn't have a block exit IR op as its last instruction\" << std::endl;\n        }\n      }\n    }\n  }\n\n  // Use counts are only relevant pre-RA.\n  if (!CurrentIR.PostRA()) {\n    for (uint32_t i = 0; i < CurrentIR.GetSSACount(); i++) {\n      auto [Node, IROp] = CurrentIR.at(IR::NodeID {i})();\n      if (Node->NumUses != Uses[i] && IROp->Op != OP_CODEBLOCK && IROp->Op != OP_IRHEADER) {\n        HadError |= true;\n        Errors << \"%\" << i << \" Has \" << Uses[i] << \" Uses, but reports \" << Node->NumUses << std::endl;\n      }\n    }\n  }\n\n  HadWarning = false;\n  if (HadError || HadWarning) {\n    fextl::stringstream Out;\n    FEXCore::IR::Dump(&Out, &CurrentIR);\n\n    if (HadError) {\n      Out << \"Errors:\" << std::endl << Errors.str() << std::endl;\n    }\n\n    if (HadWarning) {\n      Out << \"Warnings:\" << std::endl << Warnings.str() << std::endl;\n    }\n\n    LogMan::Msg::EFmt(\"{}\", Out.str());\n\n    LOGMAN_MSG_A_FMT(\"Encountered IR validation Error\");\n\n    Errors.clear();\n    Warnings.clear();\n  }\n}\n\nfextl::unique_ptr<FEXCore::IR::Pass> CreateIRValidation() {\n  return fextl::make_unique<IRValidation>();\n}\n} // namespace FEXCore::IR::Validation\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/Passes/IRValidation.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"Common/BitSet.h\"\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/fextl/unordered_map.h>\n#include <FEXCore/fextl/vector.h>\n\nnamespace FEXCore::IR::Validation {\n\nstruct BlockInfo {\n  bool HasExit;\n  const OrderedNode* BlockNode;\n\n  fextl::vector<OrderedNode*> Predecessors;\n  fextl::vector<OrderedNode*> Successors;\n};\n\nclass IRValidation final : public FEXCore::IR::Pass {\npublic:\n  ~IRValidation();\n  void Run(IREmitter* IREmit) override;\n\nprivate:\n\n  BitSet<uint64_t> NodeIsLive {};\n  OrderedNode* EntryBlock {};\n  fextl::unordered_map<IR::NodeID, BlockInfo> OffsetToBlockMap;\n  size_t MaxNodes {};\n};\n} // namespace FEXCore::IR::Validation\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/Passes/RedundantFlagCalculationElimination.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: ir|opts\n$end_info$\n*/\n\n#include \"Interface/IR/IR.h\"\n#include \"Interface/IR/IREmitter.h\"\n#include \"Interface/IR/PassManager.h\"\n\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/Profiler.h>\n#include <FEXCore/fextl/deque.h>\n#include <FEXCore/fextl/vector.h>\n\n// Flag bit flags\n#define FLAG_V (1U << 0)\n#define FLAG_C (1U << 1)\n#define FLAG_Z (1U << 2)\n#define FLAG_N (1U << 3)\n#define FLAG_P (1U << 4)\n#define FLAG_A (1U << 5)\n\n#define FLAG_ZCV (FLAG_Z | FLAG_C | FLAG_V)\n#define FLAG_NZCV (FLAG_N | FLAG_ZCV)\n#define FLAG_ALL (FLAG_NZCV | FLAG_A | FLAG_P)\n\nnamespace FEXCore::IR {\n\nstruct FlagInfoUnpacked {\n  // Set of flags read by the instruction.\n  unsigned Read;\n\n  // Set of flags written by the instruction. Happens AFTER the reads.\n  unsigned Write;\n\n  // If true, the instruction can be be eliminated if its flag writes can all be\n  // eliminated.\n  bool CanEliminate;\n\n  // If set, the opcode can be replaced with Replacement if its flag writes can\n  // all be eliminated, or ReplacementNoWrite if its register write can be\n  // eliminated.\n  IROps Replacement;\n  IROps ReplacementNoWrite;\n\n  // Needs speical handling\n  bool Special;\n};\n\nstruct FlagInfo {\n  uint64_t Raw;\n\n  static constexpr struct FlagInfo Pack(struct FlagInfoUnpacked F) {\n    uint64_t R = F.Read | (F.Write << 8) | (F.CanEliminate << 16) | (((uint64_t)F.Replacement) << 32) |\n                 ((uint64_t)F.ReplacementNoWrite << 48) | (F.Special ? (1ull << 63) : 0);\n    return {.Raw = R};\n  }\n\n  bool Trivial() const {\n    return Raw == 0;\n  }\n\n  unsigned Read() const {\n    return Bits(0, 8);\n  }\n\n  unsigned Write() const {\n    return Bits(8, 8);\n  }\n\n  bool CanEliminate() const {\n    return Bits(16, 1);\n  }\n\n  bool Special() const {\n    return Bits(63, 1);\n  }\n\n  IROps Replacement() const {\n    return (IROps)Bits(32, 16);\n  }\n\n  IROps ReplacementNoWrite() const {\n    return (IROps)Bits(48, 16);\n  }\n\nprivate:\n  unsigned Bits(unsigned Start, unsigned Count) const {\n    return (Raw >> Start) & ((1u << Count) - 1);\n  }\n};\n\nstruct BlockInfo {\n  fextl::vector<uint32_t> Predecessors;\n  Ref Node;\n  uint8_t Flags;\n  bool InWorklist;\n};\n\nstruct ControlFlowGraph {\n  fextl::vector<BlockInfo> BlockMap;\n  IRListView& IR;\n\n  void Init(fextl::deque<uint32_t>& Worklist, uint32_t BlockCount) {\n    BlockMap.resize(BlockCount);\n\n    for (unsigned ID = 0; ID < BlockCount; ++ID) {\n      // Add the block with conservative flags and already in the worklist.\n      auto Info = BlockInfo {{}, nullptr, FLAG_ALL, true};\n\n      // Add some initial capacity\n      Info.Predecessors.reserve(2);\n\n      BlockMap[ID] = std::move(Info);\n      Worklist.push_back(ID);\n    }\n  }\n\n  BlockInfo* Get(uint32_t Block) {\n    return &BlockMap[Block];\n  }\n\n  BlockInfo* Get(IROp_CodeBlock* Block) {\n    return &BlockMap[Block->ID];\n  }\n\n  BlockInfo* Get(OrderedNodeWrapper Block) {\n    return Get(IR.GetOp<IR::IROp_CodeBlock>(Block));\n  }\n\n  void RecordEdge(uint32_t From, OrderedNodeWrapper To) {\n    auto Info = Get(To);\n    Info->Predecessors.push_back(From);\n  }\n\n  void AddWorklist(fextl::deque<uint32_t>& Worklist, uint32_t Block) {\n    auto Info = Get(Block);\n    if (!Info->InWorklist) {\n      Info->InWorklist = true;\n      Worklist.push_front(Block);\n    }\n  }\n};\n\nclass DeadFlagCalculationEliminination final : public FEXCore::IR::Pass {\npublic:\n  void Run(IREmitter* IREmit) override;\n\nprivate:\n  FlagInfo Classify(IROp_Header* Node);\n  unsigned FlagsForCondClassType(CondClass Cond);\n  bool EliminateDeadCode(IREmitter* IREmit, Ref CodeNode, IROp_Header* IROp);\n  void FoldBranch(IREmitter* IREmit, IRListView& CurrentIR, IROp_CondJump* Op, Ref CodeNode);\n  CondClass X86ToArmFloatCond(CondClass X86);\n  bool ProcessBlock(IREmitter* IREmit, IRListView& CurrentIR, Ref Block, ControlFlowGraph& CFG);\n  void OptimizeParity(IREmitter* IREmit, IRListView& CurrentIR, ControlFlowGraph& CFG);\n};\n\nunsigned DeadFlagCalculationEliminination::FlagsForCondClassType(CondClass Cond) {\n  switch (Cond) {\n  case CondClass::AL: return 0;\n\n  case CondClass::MI:\n  case CondClass::PL: return FLAG_N;\n\n  case CondClass::EQ:\n  case CondClass::NEQ: return FLAG_Z;\n\n  case CondClass::UGE:\n  case CondClass::ULT: return FLAG_C;\n\n  case CondClass::VS:\n  case CondClass::VC:\n  case CondClass::FU:\n  case CondClass::FNU: return FLAG_V;\n\n  case CondClass::UGT:\n  case CondClass::ULE: return FLAG_Z | FLAG_C;\n\n  case CondClass::SGE:\n  case CondClass::SLT:\n  case CondClass::FLU:\n  case CondClass::FGE: return FLAG_N | FLAG_V;\n\n  case CondClass::SGT:\n  case CondClass::SLE:\n  case CondClass::FLEU:\n  case CondClass::FGT: return FLAG_N | FLAG_Z | FLAG_V;\n\n  default: LOGMAN_THROW_A_FMT(false, \"unknown cond class type\"); return FLAG_NZCV;\n  }\n}\n\nconstexpr FlagInfo ClassifyConst(IROps Op) {\n  switch (Op) {\n  case OP_ANDWITHFLAGS:\n    return FlagInfo::Pack({\n      .Write = FLAG_NZCV,\n      .Replacement = OP_AND,\n      .ReplacementNoWrite = OP_TESTNZ,\n    });\n\n  case OP_ADDWITHFLAGS:\n    return FlagInfo::Pack({\n      .Write = FLAG_NZCV,\n      .Replacement = OP_ADD,\n      .ReplacementNoWrite = OP_ADDNZCV,\n    });\n\n  case OP_SUBWITHFLAGS:\n    return FlagInfo::Pack({\n      .Write = FLAG_NZCV,\n      .Replacement = OP_SUB,\n      .ReplacementNoWrite = OP_SUBNZCV,\n    });\n\n  case OP_ADCWITHFLAGS:\n    return FlagInfo::Pack({\n      .Read = FLAG_C,\n      .Write = FLAG_NZCV,\n      .Replacement = OP_ADC,\n      .ReplacementNoWrite = OP_ADCNZCV,\n    });\n\n  case OP_ADCZEROWITHFLAGS:\n    return FlagInfo::Pack({\n      .Read = FLAG_C,\n      .Write = FLAG_NZCV,\n      .Replacement = OP_ADCZERO,\n    });\n\n  case OP_SBBWITHFLAGS:\n    return FlagInfo::Pack({\n      .Read = FLAG_C,\n      .Write = FLAG_NZCV,\n      .Replacement = OP_SBB,\n      .ReplacementNoWrite = OP_SBBNZCV,\n    });\n\n  case OP_SHIFTFLAGS:\n    // _ShiftFlags conditionally sets NZCV+PF, which we model here as a\n    // read-modify-write. Logically, it also conditionally makes AF undefined,\n    // which we model by omitting AF from both Read and Write sets (since\n    // \"cond ? AF : undef\" may be optimized to \"AF\").\n    return FlagInfo::Pack({\n      .Read = FLAG_NZCV | FLAG_P,\n      .Write = FLAG_NZCV | FLAG_P,\n      .CanEliminate = true,\n    });\n\n  case OP_ROTATEFLAGS:\n    // _RotateFlags conditionally sets CV, again modeled as RMW.\n    return FlagInfo::Pack({\n      .Read = FLAG_C | FLAG_V,\n      .Write = FLAG_C | FLAG_V,\n      .CanEliminate = true,\n    });\n\n  case OP_RDRAND: return FlagInfo::Pack({.Write = FLAG_NZCV});\n\n  case OP_ADDNZCV:\n  case OP_SUBNZCV:\n  case OP_TESTNZ:\n  case OP_FCMP:\n  case OP_STORENZCV:\n    return FlagInfo::Pack({\n      .Write = FLAG_NZCV,\n      .CanEliminate = true,\n    });\n\n  case OP_AXFLAG:\n    // Per the Arm spec, axflag reads Z/V/C but not N. It writes all flags.\n    return FlagInfo::Pack({\n      .Read = FLAG_ZCV,\n      .Write = FLAG_NZCV,\n      .CanEliminate = true,\n    });\n\n  case OP_CMPPAIRZ:\n    return FlagInfo::Pack({\n      .Write = FLAG_Z,\n      .CanEliminate = true,\n    });\n\n  case OP_CARRYINVERT:\n    return FlagInfo::Pack({\n      .Read = FLAG_C,\n      .Write = FLAG_C,\n      .CanEliminate = true,\n    });\n\n  case OP_SETSMALLNZV:\n    return FlagInfo::Pack({\n      .Write = FLAG_N | FLAG_Z | FLAG_V,\n      .CanEliminate = true,\n    });\n\n  case OP_LOADNZCV: return FlagInfo::Pack({.Read = FLAG_NZCV});\n\n  case OP_ADC:\n  case OP_ADCZERO:\n  case OP_SBB: return FlagInfo::Pack({.Read = FLAG_C});\n\n  case OP_ADCNZCV:\n  case OP_SBBNZCV:\n    return FlagInfo::Pack({\n      .Read = FLAG_C,\n      .Write = FLAG_NZCV,\n      .CanEliminate = true,\n    });\n\n  case OP_LOADPF: return FlagInfo::Pack({.Read = FLAG_P});\n  case OP_LOADAF: return FlagInfo::Pack({.Read = FLAG_A});\n  case OP_STOREPF: return FlagInfo::Pack({.Write = FLAG_P, .CanEliminate = true});\n  case OP_STOREAF: return FlagInfo::Pack({.Write = FLAG_A, .CanEliminate = true});\n\n  case OP_NZCVSELECT:\n  case OP_NZCVSELECTV:\n  case OP_NZCVSELECTINCREMENT:\n  case OP_NEG:\n  case OP_CONDJUMP:\n  case OP_CONDSUBNZCV:\n  case OP_CONDADDNZCV:\n  case OP_RMIFNZCV:\n  case OP_INVALIDATEFLAGS: return FlagInfo::Pack({.Special = true});\n  default: return FlagInfo::Pack({});\n  }\n}\n\nconstexpr auto FlagInfos = std::invoke([] {\n  std::array<FlagInfo, OP_LAST> ret = {};\n\n  for (unsigned i = 0; i < OP_LAST; ++i) {\n    ret[i] = ClassifyConst((IROps)i);\n  }\n\n  return ret;\n});\n\nFlagInfo DeadFlagCalculationEliminination::Classify(IROp_Header* IROp) {\n  FlagInfo Info = FlagInfos[IROp->Op];\n  if (!Info.Special()) {\n    return Info;\n  }\n\n  switch (IROp->Op) {\n  case OP_NZCVSELECT:\n  case OP_NZCVSELECTINCREMENT: {\n    auto Op = IROp->CW<IR::IROp_NZCVSelect>();\n    return FlagInfo::Pack({.Read = FlagsForCondClassType(Op->Cond)});\n  }\n\n  case OP_NZCVSELECTV: {\n    auto Op = IROp->CW<IR::IROp_NZCVSelectV>();\n    return FlagInfo::Pack({.Read = FlagsForCondClassType(Op->Cond)});\n  }\n\n  case OP_NEG: {\n    auto Op = IROp->CW<IR::IROp_Neg>();\n    return FlagInfo::Pack({.Read = FlagsForCondClassType(Op->Cond)});\n  }\n\n  case OP_CONDJUMP: {\n    auto Op = IROp->CW<IR::IROp_CondJump>();\n    if (!Op->FromNZCV) {\n      return FlagInfo::Pack({});\n    }\n\n    return FlagInfo::Pack({.Read = FlagsForCondClassType(Op->Cond)});\n  }\n\n  case OP_CONDSUBNZCV:\n  case OP_CONDADDNZCV: {\n    auto Op = IROp->CW<IR::IROp_CondAddNZCV>();\n    return FlagInfo::Pack({\n      .Read = FlagsForCondClassType(Op->Cond),\n      .Write = FLAG_NZCV,\n      .CanEliminate = true,\n    });\n  }\n\n  case OP_RMIFNZCV: {\n    auto Op = IROp->CW<IR::IROp_RmifNZCV>();\n\n    static_assert(FLAG_N == (1 << 3), \"rmif mask lines up with our bits\");\n    static_assert(FLAG_Z == (1 << 2), \"rmif mask lines up with our bits\");\n    static_assert(FLAG_C == (1 << 1), \"rmif mask lines up with our bits\");\n    static_assert(FLAG_V == (1 << 0), \"rmif mask lines up with our bits\");\n\n    return FlagInfo::Pack({\n      .Write = Op->Mask,\n      .CanEliminate = true,\n    });\n  }\n\n  case OP_INVALIDATEFLAGS: {\n    auto Op = IROp->CW<IR::IROp_InvalidateFlags>();\n    unsigned Flags = 0;\n\n    // TODO: Make this translation less silly\n    if (Op->Flags & (1u << X86State::RFLAG_SF_RAW_LOC)) {\n      Flags |= FLAG_N;\n    }\n\n    if (Op->Flags & (1u << X86State::RFLAG_ZF_RAW_LOC)) {\n      Flags |= FLAG_Z;\n    }\n\n    if (Op->Flags & (1u << X86State::RFLAG_CF_RAW_LOC)) {\n      Flags |= FLAG_C;\n    }\n\n    if (Op->Flags & (1u << X86State::RFLAG_OF_RAW_LOC)) {\n      Flags |= FLAG_V;\n    }\n\n    if (Op->Flags & (1u << X86State::RFLAG_PF_RAW_LOC)) {\n      Flags |= FLAG_P;\n    }\n\n    if (Op->Flags & (1u << X86State::RFLAG_AF_RAW_LOC)) {\n      Flags |= FLAG_A;\n    }\n\n    // The mental model of InvalidateFlags is writing undefined values to all\n    // of the selected flags, allowing the write-after-write optimizations to\n    // optimize invalidate-after-write for free.\n    return FlagInfo::Pack({\n      .Write = Flags,\n      .CanEliminate = true,\n    });\n  }\n\n  default: LOGMAN_THROW_A_FMT(false, \"invalid special op\"); FEX_UNREACHABLE;\n  }\n\n  FEX_UNREACHABLE;\n}\n\n// General purpose dead code elimination. Returns whether flag handling should\n// be skipped (because it was removed or could not possibly affect flags).\nbool DeadFlagCalculationEliminination::EliminateDeadCode(IREmitter* IREmit, Ref CodeNode, IROp_Header* IROp) {\n  // Can't remove anything used or with side effects.\n  if (CodeNode->GetUses() > 0 || IR::HasSideEffects(IROp->Op)) {\n    return false;\n  }\n\n  IREmit->Remove(CodeNode);\n  return true;\n}\n\nCondClass DeadFlagCalculationEliminination::X86ToArmFloatCond(CondClass X86) {\n  // Table of x86 condition codes that map to arm64 condition codes, in the\n  // sense that fcmp+axflag+branch(x86) is equivalent to fcmp+branch(arm).\n  //\n  // E would be \"equal or unordered\", no condition code.\n  // G would be \"greater than or less than\", no condition code.\n  //\n  // SF/OF conditions are trivial and therefore shouldn't actually be generated\n  switch (X86) {\n  case CondClass::UGE /* A  */: return CondClass::FGE /* GE */;\n  case CondClass::UGT /* AE */: return CondClass::FGT /* GT */;\n  case CondClass::ULT /* B  */: return CondClass::SLT /* LT */;\n  case CondClass::ULE /* BE */: return CondClass::SLE /* LE */;\n  case CondClass::SLE /* LE */: return CondClass::SLE /* LE */;\n  default: return CondClass::AL;\n  }\n}\n\nvoid DeadFlagCalculationEliminination::FoldBranch(IREmitter* IREmit, IRListView& CurrentIR, IROp_CondJump* Op, Ref CodeNode) {\n  // Skip past StoreRegisters at the end -- they don't touch flags.\n  auto PrevWrap = CodeNode->Header.Previous;\n  while (CurrentIR.GetOp<IR::IROp_Header>(PrevWrap)->Op == OP_STOREREGISTER ||\n         CurrentIR.GetOp<IR::IROp_Header>(PrevWrap)->Op == OP_STOREPF || CurrentIR.GetOp<IR::IROp_Header>(PrevWrap)->Op == OP_STOREAF) {\n    PrevWrap = CurrentIR.GetNode(PrevWrap)->Header.Previous;\n  }\n\n  auto Prev = CurrentIR.GetOp<IR::IROp_Header>(PrevWrap);\n  if (Prev->Op == OP_AXFLAG) {\n    // Pattern match a branch fed by AXFLAG.\n    CondClass ArmCond = X86ToArmFloatCond(Op->Cond);\n    if (ArmCond == CondClass::AL) {\n      return;\n    }\n\n    Op->Cond = ArmCond;\n  } else if (Prev->Op == OP_SUBNZCV) {\n    // Pattern match a branch fed by a compare. We could also handle bit tests\n    // here, but tbz/tbnz has a limited offset range which we don't have a way to\n    // deal with yet. Let's hope that's not a big deal.\n    if (!(Op->Cond == CondClass::NEQ || Op->Cond == CondClass::EQ) || (Prev->Size < OpSize::i32Bit)) {\n      return;\n    }\n\n    auto SecondArg = CurrentIR.GetOp<IR::IROp_Header>(Prev->Args[1]);\n    if (SecondArg->Op != OP_INLINECONSTANT || SecondArg->C<IR::IROp_InlineConstant>()->Constant != 0) {\n      return;\n    }\n\n    // We've matched. Fold the compare into branch.\n    IREmit->ReplaceNodeArgument(CodeNode, 0, CurrentIR.GetNode(Prev->Args[0]));\n    IREmit->ReplaceNodeArgument(CodeNode, 1, CurrentIR.GetNode(Prev->Args[1]));\n    Op->FromNZCV = false;\n    Op->CompareSize = Prev->Size;\n  } else {\n    return;\n  }\n\n  // The compare/test/axflag sets flags but does not write registers. Flags are\n  // dead after the jump. The jump does not read flags anymore.  There is no\n  // intervening instruction. Therefore the compare is dead.\n  IREmit->Remove(CurrentIR.GetNode(PrevWrap));\n}\n\n/**\n * @brief This pass removes dead code locally.\n */\nbool DeadFlagCalculationEliminination::ProcessBlock(IREmitter* IREmit, IRListView& CurrentIR, Ref Block, ControlFlowGraph& CFG) {\n  uint32_t FlagsRead = FLAG_ALL;\n\n  // Reverse iteration is not yet working with the iterators\n  auto BlockIROp = CurrentIR.GetOp<IR::IROp_CodeBlock>(Block);\n\n  // We grab these nodes this way so we can iterate easily\n  auto CodeBegin = CurrentIR.at(BlockIROp->Begin);\n  auto CodeLast = CurrentIR.at(BlockIROp->Last);\n\n  // Advance past EndBlock to get at the exit.\n  --CodeLast;\n\n  // Initialize the FlagsRead mask according to the exit instruction.\n  auto [ExitNode, ExitOp] = CodeLast();\n  if (ExitOp->Op == IR::OP_CONDJUMP) {\n    auto Op = ExitOp->CW<IR::IROp_CondJump>();\n    FlagsRead = CFG.Get(Op->TrueBlock)->Flags | CFG.Get(Op->FalseBlock)->Flags;\n  } else if (ExitOp->Op == IR::OP_JUMP) {\n    FlagsRead = CFG.Get(ExitOp->Args[0])->Flags;\n  }\n\n  // Iterate the block in reverse\n  while (true) {\n    auto [CodeNode, IROp] = CodeLast();\n\n    // Optimizing flags can cause earlier flag reads to become dead but dead\n    // flag reads should not impede optimiation of earlier dead flag writes.\n    // We must DCE as we go to ensure we converge in a single iteration.\n    if (!EliminateDeadCode(IREmit, CodeNode, IROp)) {\n      // Optimiation algorithm: For each flag written...\n      //\n      //  If the flag has a later read (per FlagsRead), remove the flag from\n      //  FlagsRead, since the reader is covered by this write.\n      //\n      //  Else, there is no later read, so remove the flag write (if we can).\n      //  This is the active part of the optimization.\n      //\n      // Then, add each flag read to FlagsRead.\n      //\n      // This order is important: instructions that read-modify-write flags\n      // (like adcs) first read flags, then write flags. Since we're iterating\n      // the block backwards, that means we handle the write first.\n      struct FlagInfo Info = Classify(IROp);\n\n      if (!Info.Trivial()) {\n        bool Eliminated = false;\n\n        if ((FlagsRead & Info.Write()) == 0) {\n          if ((Info.CanEliminate() || Info.Replacement()) && CodeNode->GetUses() == 0) {\n            IREmit->Remove(CodeNode);\n            Eliminated = true;\n          } else if (Info.Replacement()) {\n            IROp->Op = Info.Replacement();\n          }\n        } else if (Info.ReplacementNoWrite() && CodeNode->GetUses() == 0) {\n          IROp->Op = Info.ReplacementNoWrite();\n        }\n\n        // If we don't care about the sign or carry, we can optimize testnz.\n        // Carry is inverted between testz and testnz so we check that too. Note\n        // this flag is outside of the if, since the TestNZ might result from\n        // optimizing AndWithFlags, and we need to converge locally in a single\n        // iteration.\n        if (IROp->Op == OP_TESTNZ && IROp->Size < OpSize::i32Bit && !(FlagsRead & (FLAG_N | FLAG_C))) {\n          IROp->Op = OP_TESTZ;\n        }\n\n        FlagsRead &= ~Info.Write();\n\n        // If we eliminated the instruction, we eliminate its read too. This\n        // check is required to ensure the pass converges locally in a single\n        // iteration.\n        if (!Eliminated) {\n          FlagsRead |= Info.Read();\n        }\n      }\n    }\n\n    // Iterate in reverse\n    if (CodeLast == CodeBegin) {\n      break;\n    }\n    --CodeLast;\n  }\n\n  // For the purposes of global propagation, the content of our progress doesn't\n  // matter -- only the difference in our final FlagsRead contributes to changes\n  // in the predecessors.\n  uint32_t OldFlagsRead = CFG.Get(BlockIROp->ID)->Flags;\n  CFG.Get(BlockIROp->ID)->Flags = FlagsRead;\n  return (OldFlagsRead != FlagsRead);\n}\n\nvoid DeadFlagCalculationEliminination::OptimizeParity(IREmitter* IREmit, IRListView& CurrentIR, ControlFlowGraph& CFG) {\n  // Mapping for flags inside this pass.\n  const uint8_t PARTIAL = 0;\n  const uint8_t FULL = 1;\n\n  // Initialize conservatively: all blocks need full parity. This initialization\n  // matters for proper handling of backedges.\n  for (auto [Block, BlockHeader] : CurrentIR.GetBlocks()) {\n    auto ID = BlockHeader->C<IROp_CodeBlock>()->ID;\n    CFG.Get(ID)->Flags = FULL;\n  }\n\n  for (auto [Block, BlockHeader] : CurrentIR.GetBlocks()) {\n    const auto ID = BlockHeader->C<IROp_CodeBlock>()->ID;\n    const auto& Predecessors = CFG.Get(ID)->Predecessors;\n    bool Full = false;\n\n    if (Predecessors.empty()) {\n      // Conservatively assume there was full parity before the start block\n      Full = true;\n    } else {\n      // If any predecessor needs full parity at the end, we need full parity.\n      for (auto Pred : Predecessors) {\n        Full |= (CFG.Get(Pred)->Flags == FULL);\n      }\n    }\n\n    for (auto [CodeNode, IROp] : CurrentIR.GetCode(Block)) {\n      if (IROp->Op == OP_STOREPF) {\n        auto Op = IROp->CW<IR::IROp_StorePF>();\n        auto Generator = CurrentIR.GetOp<IR::IROp_Header>(Op->Value);\n\n        // Determine if we only write 0/1 to the parity flag.\n        Full = true;\n        if (Generator->Op == OP_NZCVSELECT) {\n          auto C0 = CurrentIR.GetOp<IR::IROp_Header>(Generator->Args[0]);\n          auto C1 = CurrentIR.GetOp<IR::IROp_Header>(Generator->Args[1]);\n          if (C0->Op == C1->Op && C0->Op == OP_INLINECONSTANT) {\n            auto IC0 = CurrentIR.GetOp<IR::IROp_InlineConstant>(Generator->Args[0]);\n            auto IC1 = CurrentIR.GetOp<IR::IROp_InlineConstant>(Generator->Args[1]);\n\n            // We need the full 8 if the constant has upper bits set.\n            Full = (IC0->Constant | IC1->Constant) & ~1;\n          }\n        }\n      } else if (IROp->Op == OP_PARITY && !Full) {\n        // Eliminate parity calculations if it's only 1-bit.\n        auto Parity = IROp->C<IROp_Parity>();\n        Ref Value = CurrentIR.GetNode(Parity->Raw);\n\n        if (Parity->Invert) {\n          IREmit->SetWriteCursor(CodeNode);\n          Value = IREmit->_Xor(OpSize::i32Bit, Value, IREmit->_InlineConstant(1));\n        }\n\n        IREmit->ReplaceUsesWithAfter(CodeNode, Value, CurrentIR.at(CodeNode));\n        IREmit->Remove(CodeNode);\n      }\n    }\n\n    // Record our final state for our successors to read.\n    CFG.Get(ID)->Flags = Full ? FULL : PARTIAL;\n  }\n}\n\nvoid DeadFlagCalculationEliminination::Run(IREmitter* IREmit) {\n  FEXCORE_PROFILE_SCOPED(\"PassManager::DFE\");\n\n  auto CurrentIR = IREmit->ViewIR();\n  fextl::deque<uint32_t> Worklist;\n\n  // Initialize CFG\n  ControlFlowGraph CFG {.IR = CurrentIR};\n  CFG.Init(Worklist, CurrentIR.GetHeader()->BlockCount);\n\n  // Gather CFG\n  for (auto [BlockNode, BlockHeader] : CurrentIR.GetBlocks()) {\n    auto Block = BlockHeader->C<IROp_CodeBlock>();\n    auto CodeLast = CurrentIR.at(Block->Last);\n    --CodeLast;\n    auto [ExitNode, ExitOp] = CodeLast();\n    if (ExitOp->Op == IR::OP_CONDJUMP) {\n      auto Op = ExitOp->CW<IR::IROp_CondJump>();\n\n      CFG.RecordEdge(Block->ID, Op->TrueBlock);\n      CFG.RecordEdge(Block->ID, Op->FalseBlock);\n    } else if (ExitOp->Op == IR::OP_JUMP) {\n      CFG.RecordEdge(Block->ID, ExitOp->Args[0]);\n    }\n\n    CFG.Get(Block->ID)->Node = BlockNode;\n  }\n\n  // After processing a block, if we made progress, we must process its\n  // predecessors to propagate globally. A block will be reprocessed only if\n  // there is a loop backedge.\n  for (; !Worklist.empty(); Worklist.pop_back()) {\n    auto Block = Worklist.back();\n    auto Info = CFG.Get(Block);\n    Info->InWorklist = false;\n\n    if (ProcessBlock(IREmit, CurrentIR, Info->Node, CFG)) {\n      for (auto Pred : Info->Predecessors) {\n        CFG.AddWorklist(Worklist, Pred);\n      }\n    }\n  }\n\n  // Fold compares into branches now that we're otherwise optimized. This needs\n  // to run after eliminating carries etc and it needs the global flag metadata.\n  // But it only needs to run once, we don't do it in the loop.\n  for (auto [Block, _] : CurrentIR.GetBlocks()) {\n    // Grab the jump\n    auto BlockIROp = CurrentIR.GetOp<IR::IROp_CodeBlock>(Block);\n    auto CodeLast = CurrentIR.at(BlockIROp->Last);\n    --CodeLast;\n\n    auto [ExitNode, ExitOp] = CodeLast();\n    if (ExitOp->Op == IR::OP_CONDJUMP) {\n      auto Op = ExitOp->CW<IR::IROp_CondJump>();\n      uint32_t FlagsOut = CFG.Get(Op->TrueBlock)->Flags | CFG.Get(Op->FalseBlock)->Flags;\n\n      if ((FlagsOut & FLAG_NZCV) == 0 && Op->FromNZCV) {\n        FoldBranch(IREmit, CurrentIR, Op, ExitNode);\n      }\n    }\n  }\n\n  if (CurrentIR.GetHeader()->ReadsParity) {\n    OptimizeParity(IREmit, CurrentIR, CFG);\n  }\n}\n\nfextl::unique_ptr<FEXCore::IR::Pass> CreateDeadFlagCalculationEliminination() {\n  return fextl::make_unique<DeadFlagCalculationEliminination>();\n}\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/Passes/RegisterAllocationPass.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: ir|opts\n$end_info$\n*/\n\n#include \"Interface/IR/Passes/RegisterAllocationPass.h\"\n#include \"Interface/IR/IR.h\"\n#include \"Interface/IR/IREmitter.h\"\n#include \"Interface/IR/RegisterAllocationData.h\"\n#include \"Interface/IR/Passes.h\"\n#include \"Interface/Core/CPUID.h\"\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/Utils/EnumUtils.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/Profiler.h>\n#include <FEXCore/fextl/vector.h>\n#include <bit>\n#include <cstdint>\n\nusing namespace FEXCore;\n\nnamespace FEXCore::IR {\nnamespace {\n  struct RegisterClassData {\n    uint32_t Available;\n    uint32_t Count;\n\n    // If bit R of Available is 0, then RegToSSA[R] is the node currently\n    // allocated to R. Else, RegToSSA[R] is UNDEFINED, no need to clear this\n    // when freeing registers.\n    Ref RegToSSA[32];\n  };\n\n  IR::RegClass GetRegClassFromNode(IR::IRListView* IR, IR::IROp_Header* IROp) {\n    const auto Class = IR::GetRegClass(IROp->Op);\n    if (Class != IR::RegClass::Complex) {\n      return Class;\n    }\n\n    // Complex register class handling\n    switch (IROp->Op) {\n    case IR::OP_LOADCONTEXT: return IROp->C<IR::IROp_LoadContext>()->Class;\n    case IR::OP_LOADREGISTER: return IROp->C<IR::IROp_LoadRegister>()->Class;\n    case IR::OP_LOADCONTEXTINDEXED: return IROp->C<IR::IROp_LoadContextIndexed>()->Class;\n    case IR::OP_LOADMEM:\n    case IR::OP_LOADMEMTSO: return IROp->C<IR::IROp_LoadMem>()->Class;\n    case IR::OP_FILLREGISTER: return IROp->C<IR::IROp_FillRegister>()->Class;\n    default: return IR::RegClass::Invalid;\n    }\n  };\n} // Anonymous namespace\n\nclass ConstrainedRAPass final : public RegisterAllocationPass {\npublic:\n  explicit ConstrainedRAPass(const FEXCore::CPUIDEmu* CPUID)\n    : CPUID {CPUID} {}\n  void Run(IREmitter* IREmit) override;\n  void AddRegisters(IR::RegClass Class, uint32_t RegisterCount) override;\n  bool TryPostRAMerge(Ref LastNode, Ref CodeNode, IROp_Header* IROp);\n\nprivate:\n  RegisterClassData Classes[IR::NumClasses];\n\n  IREmitter* IREmit {};\n  IRListView* IR {};\n  const FEXCore::CPUIDEmu* CPUID {};\n\n  // Map of nodes to their preferred register, to coalesce load/store reg.\n  fextl::vector<PhysicalRegister> PreferredReg;\n\n  // Map of assigned registers. Does not grow beyond the initial set.\n  fextl::vector<PhysicalRegister> SSAToReg;\n\n  // Maps defs to their assigned spill slot + 1, or 0 if not spilled.\n  fextl::vector<unsigned> SpillSlots;\n\n  // Next-use distance relative to the block end of each source, last first.\n  fextl::vector<uint32_t> SourcesNextUses;\n\n  // Sources that have been seen\n  fextl::vector<bool> Seen;\n\n  // SourcesNextUses is read backwards, this tracks the index\n  int64_t SourceIndex {};\n\n  bool Rematerializable(IROp_Header* IROp) {\n    return IROp->Op == OP_CONSTANT;\n  }\n\n  Ref InsertFill(Ref Node) {\n    IROp_Header* IROp = IR->GetOp<IROp_Header>(Node);\n\n    // Remat if we can\n    if (Rematerializable(IROp)) {\n      const auto Op = IROp->C<IR::IROp_Constant>();\n      uint64_t Const = Op->Constant;\n      return IREmit->_Constant(Const, Op->Pad, Op->MaxBytes);\n    }\n\n    // Otherwise fill from stack\n    uint32_t SlotPlusOne = SpillSlots[IR->GetID(Node).Value];\n    LOGMAN_THROW_A_FMT(SlotPlusOne >= 1, \"Node must have been spilled\");\n\n    const auto RegClass = GetRegClassFromNode(IR, IROp);\n    return IREmit->_FillRegister(IROp->Size, IROp->ElementSize, SlotPlusOne - 1, RegClass);\n  };\n\n  // IP of next-use of each source. IPs are measured from the end of the\n  // block, so we don't need to size the block up-front.\n  fextl::vector<uint32_t> NextUses;\n\n  bool AnySpilled {};\n\n  bool IsValidArg(OrderedNodeWrapper Arg) {\n    if (Arg.IsInvalid()) {\n      return false;\n    }\n\n    auto Op = IR->GetOp<IROp_Header>(Arg)->Op;\n    return Op != OP_INLINECONSTANT && Op != OP_INLINEENTRYPOINTOFFSET;\n  };\n\n  RegisterClassData* GetClass(PhysicalRegister Reg) {\n    return &Classes[Reg.Class];\n  };\n\n  uint32_t GetRegBits(PhysicalRegister Reg) {\n    return 1 << Reg.Reg;\n  };\n\n  bool IsInRegisterFile(Ref Node) {\n    auto ID = IR->GetID(Node).Value;\n    LOGMAN_THROW_A_FMT(ID < SSAToReg.size(), \"Only old nodes looked up\");\n\n    PhysicalRegister Reg = SSAToReg[ID];\n    RegisterClassData* Class = GetClass(Reg);\n\n    return (Class->Available & GetRegBits(Reg)) == 0 && Class->RegToSSA[Reg.Reg] == Node;\n  };\n\n  void FreeReg(PhysicalRegister Reg) {\n    RegisterClassData* Class = GetClass(Reg);\n    uint32_t RegBits = GetRegBits(Reg);\n\n    LOGMAN_THROW_A_FMT(!(Class->Available & RegBits), \"Register double-free\");\n\n    Class->Available |= RegBits;\n  };\n\n  bool HasSource(IROp_Header* I, PhysicalRegister Reg) {\n    int NumArgs = IR::GetRAArgs(I->Op);\n    for (int s = 0; s < NumArgs; ++s) {\n      if (I->Args[s].IsImmediate()) {\n        // When spilling for a destination, we'll see register sources\n        if (PhysicalRegister(I->Args[s]) == Reg) {\n          return true;\n        }\n      } else {\n        // When spilling for SRA correctness, we'll see SSA sources. This is\n        // pretty obscure.\n        auto V = I->Args[s];\n        V.ClearKill();\n\n        if (IsValidArg(V) && SSAToReg[V.ID().Value] == Reg) {\n          return true;\n        }\n      }\n    }\n\n    return false;\n  };\n\n  Ref DecodeSRANode(const IROp_Header* IROp, Ref Node) {\n    if (IROp->Op == OP_LOADREGISTER || IROp->Op == OP_LOADPF || IROp->Op == OP_LOADAF) {\n      return Node;\n    } else if (IROp->Op == OP_STOREREGISTER) {\n      auto V = IROp->C<IR::IROp_StorePF>()->Value;\n      V.ClearKill();\n      return IR->GetNode(V);\n    } else if (IROp->Op == OP_STOREPF || IROp->Op == OP_STOREAF) {\n      auto V = IROp->C<IR::IROp_StorePF>()->Value;\n      V.ClearKill();\n      return IR->GetNode(V);\n    }\n\n    return nullptr;\n  };\n\n  PhysicalRegister DecodeSRAReg(const IROp_Header* IROp, Ref Node) {\n    uint8_t FlagOffset = Classes[FEXCore::ToUnderlying(RegClass::GPRFixed)].Count - 2;\n\n    if (IROp->Op == OP_STOREREGISTER) {\n      return PhysicalRegister(Node);\n    } else if (IROp->Op == OP_LOADPF || IROp->Op == OP_STOREPF) {\n      return PhysicalRegister {RegClass::GPRFixed, FlagOffset};\n    } else if (IROp->Op == OP_LOADAF || IROp->Op == OP_STOREAF) {\n      return PhysicalRegister {RegClass::GPRFixed, uint8_t(FlagOffset + 1)};\n    } else {\n      const IROp_LoadRegister* Op = IROp->C<IR::IROp_LoadRegister>();\n\n      LOGMAN_THROW_A_FMT(Op->Class == RegClass::GPR || Op->Class == RegClass::FPR, \"SRA classes\");\n      if (Op->Class == RegClass::FPR) {\n        return PhysicalRegister {RegClass::FPRFixed, uint8_t(Op->Reg)};\n      } else {\n        return PhysicalRegister {RegClass::GPRFixed, uint8_t(Op->Reg)};\n      }\n    }\n  };\n\n  bool IsTrivial(Ref Node, const IROp_Header* Header) {\n    switch (Header->Op) {\n    case OP_ALLOCATEGPR: return true;\n    case OP_ALLOCATEGPRAFTER: return true;\n    case OP_ALLOCATEFPR: return true;\n    case OP_RMWHANDLE: return PhysicalRegister(Node) == PhysicalRegister(Header->Args[0]);\n    case OP_LOADREGISTER: return PhysicalRegister(Node) == DecodeSRAReg(Header, Node);\n    case OP_STOREREGISTER: return PhysicalRegister(Header->Args[0]) == DecodeSRAReg(Header, Node);\n    default: return false;\n    }\n  }\n\n  // Helper macro to walk the set bits b in a 32-bit word x, using ffs to get\n  // the next set bit and then clearing on each iteration.\n#define foreach_bit(b, x) for (uint32_t __x = (x), b; ((b) = __builtin_ffs(__x) - 1, __x); __x &= ~(1 << (b)))\n\n  void CalculateNextUses(IROp_CodeBlock* BlockIROp, IROp_Header* Until) {\n    SourcesNextUses.clear();\n    NextUses.resize(IR->GetSSACount(), 0);\n\n    // IP relative to the end of the block.\n    uint32_t IP = 1;\n\n    // We grab these nodes this way so we can iterate easily\n    auto CodeBegin = IR->at(BlockIROp->Begin);\n    auto CodeLast = IR->at(BlockIROp->Last);\n\n    while (1) {\n      auto [CodeNode, IROp] = CodeLast();\n      if (IROp == Until) {\n        break;\n      }\n      // End of iteration gunk\n\n      const int NumArgs = IR::GetRAArgs(IROp->Op);\n      for (int i = NumArgs - 1; i >= 0; --i) {\n        auto V = IROp->Args[i];\n        V.ClearKill();\n\n        if (IsValidArg(V)) {\n          const uint32_t Index = V.ID().Value;\n\n          SourcesNextUses.push_back(NextUses[Index]);\n          NextUses[Index] = IP;\n        }\n      }\n\n      // IP is relative to block end and we iterate backwards, so increment.\n      ++IP;\n\n      // Rest is iteration gunk\n      if (CodeLast == CodeBegin) {\n        break;\n      }\n      --CodeLast;\n    }\n\n    SourceIndex = SourcesNextUses.size();\n  }\n\n  void SpillReg(RegisterClassData* Class, IROp_CodeBlock* Block, IROp_Header* Exclude) {\n    // We're about to use next-use information, so calculate it.\n    if (!AnySpilled) {\n      CalculateNextUses(Block, Exclude);\n    }\n\n    // Find the best node to spill according to the \"furthest-first\" heuristic.\n    // Since we defined IPs relative to the end of the block, the furthest\n    // next-use has the /smallest/ unsigned IP.\n    Ref Candidate = nullptr;\n    uint32_t BestDistance = UINT32_MAX;\n    uint8_t BestReg = ~0;\n    uint32_t Allocated = ((1u << Class->Count) - 1) & ~Class->Available;\n\n    foreach_bit(i, Allocated) {\n      Ref Node = Class->RegToSSA[i];\n      auto Reg = SSAToReg[IR->GetID(Node).Value];\n\n      LOGMAN_THROW_A_FMT(Node != nullptr, \"Invariant3\");\n      LOGMAN_THROW_A_FMT(Reg.Reg == i, \"Invariant4\");\n\n      // Skip any source used by the current instruction, it is unspillable.\n      if (!HasSource(Exclude, Reg)) {\n        uint32_t NextUse = NextUses[IR->GetID(Node).Value];\n\n        // Prioritize remat over spilling. It is typically cheaper to remat a\n        // constant multiple times than to spill a single value.\n        if (!Rematerializable(IR->GetOp<IROp_Header>(Node))) {\n          NextUse += 100000;\n        }\n\n        if (NextUse < BestDistance) {\n          BestDistance = NextUse;\n          BestReg = i;\n          Candidate = Node;\n        }\n      }\n    }\n\n    LOGMAN_THROW_A_FMT(Candidate != nullptr, \"must've found something..\");\n\n    PhysicalRegister Reg = SSAToReg[IR->GetID(Candidate).Value];\n    LOGMAN_THROW_A_FMT(Reg.Reg == BestReg, \"Invariant6\");\n\n    IROp_Header* Header = IR->GetOp<IROp_Header>(Candidate);\n    uint32_t Value = IR->GetID(Candidate).Value;\n    bool Spilled = !SpillSlots.empty() && SpillSlots[Value] != 0;\n\n    // If we already spilled the Candidate, we don't need to spill again.\n    // Similarly, if we can rematerialize the instruction, we don't spill it.\n    if (!Spilled && Header->Op != OP_CONSTANT) {\n      LOGMAN_THROW_A_FMT(Reg.AsRegClass() == GetRegClassFromNode(IR, Header), \"Consistent\");\n\n      // SpillSlots allocation is deferred.\n      if (SpillSlots.empty()) {\n        SpillSlots.resize(IR->GetSSACount(), 0);\n      }\n\n      // TODO: we should colour spill slots\n      uint32_t Slot = IR->GetHeader()->SpillSlots++;\n\n      // We must map here in case we're spilling something we shuffled.\n      auto SpillOp = IREmit->_SpillRegister(OrderedNodeWrapper::FromImmediate(Reg.Raw), Slot, Reg.AsRegClass());\n      SpillOp.first->Header.Size = Header->Size;\n      SpillOp.first->Header.ElementSize = Header->ElementSize;\n      SpillSlots[Value] = Slot + 1;\n    }\n\n    // Now that we've spilled the value, take it out of the register file\n    FreeReg(Reg);\n    AnySpilled = true;\n  };\n\n  void RemapReg(Ref Node, PhysicalRegister Reg) {\n    RegisterClassData* Class = GetClass(Reg);\n    Class->RegToSSA[Reg.Reg] = Node;\n\n    uint32_t Index = IR->GetID(Node).Value;\n    if (Index < SSAToReg.size()) {\n      SSAToReg[Index] = Reg;\n    }\n  };\n\n  // Record a given assignment of register Reg to Node.\n  void SetReg(Ref Node, PhysicalRegister Reg) {\n    RegisterClassData* Class = GetClass(Reg);\n    uint32_t RegBits = GetRegBits(Reg);\n\n    LOGMAN_THROW_A_FMT((Class->Available & RegBits) == RegBits, \"Precondition\");\n\n    Class->Available &= ~RegBits;\n\n    RemapReg(Node, Reg);\n    Node->Reg = Reg.Raw;\n  };\n\n  // Assign a register for a given Node, spilling if necessary.\n  void AssignReg(IROp_Header* IROp, IROp_CodeBlock* Block, Ref CodeNode, IROp_Header* Pivot) {\n    const uint32_t Node = IR->GetID(CodeNode).Value;\n\n    // Prioritize preferred registers.\n    if (Node < PreferredReg.size()) {\n      if (PhysicalRegister Reg = PreferredReg[Node]; !Reg.IsInvalid()) {\n        RegisterClassData* Class = GetClass(Reg);\n        uint32_t RegBits = GetRegBits(Reg);\n\n        if ((Class->Available & RegBits) == RegBits) {\n          SetReg(CodeNode, Reg);\n          return;\n        }\n      }\n    }\n\n    // Try to handle tied registers. This can fail, the JIT will insert moves.\n    if (int TiedIdx = IR::TiedSource(IROp->Op); TiedIdx >= 0) {\n      auto Reg = PhysicalRegister(IROp->Args[TiedIdx]);\n      RegisterClassData* Class = GetClass(Reg);\n      uint32_t RegBits = GetRegBits(Reg);\n\n      if (Reg.AsRegClass() != RegClass::GPRFixed && Reg.AsRegClass() != RegClass::FPRFixed && (Class->Available & RegBits) == RegBits) {\n        SetReg(CodeNode, Reg);\n        return;\n      }\n    }\n\n    // Try to coalesce reserved pairs. Just a heuristic to remove some moves.\n    if (IROp->Op == OP_ALLOCATEGPR && IROp->C<IROp_AllocateGPR>()->ForPair) {\n      uint32_t Available = Classes[FEXCore::ToUnderlying(RegClass::GPR)].Available;\n\n      // Only choose base register R if R and R + 1 are both free\n      Available &= (Available >> 1);\n\n      // Only consider aligned registers in the pair region\n      constexpr uint32_t EVEN_BITS = 0x55555555;\n      Available &= (EVEN_BITS & ((1u << PairRegs) - 1));\n\n      if (Available) {\n        unsigned Reg = std::countr_zero(Available);\n        SetReg(CodeNode, PhysicalRegister(RegClass::GPR, Reg));\n        return;\n      }\n    } else if (IROp->Op == OP_ALLOCATEGPRAFTER) {\n      uint32_t Available = Classes[FEXCore::ToUnderlying(RegClass::GPR)].Available;\n      auto After = PhysicalRegister(IROp->Args[0]);\n      if ((After.Reg & 1) == 0 && Available & (1ull << (After.Reg + 1))) {\n        SetReg(CodeNode, PhysicalRegister(RegClass::GPR, After.Reg + 1));\n        return;\n      }\n    }\n\n    RegClass ClassType = GetRegClassFromNode(IR, IROp);\n    RegisterClassData* Class = &Classes[FEXCore::ToUnderlying(ClassType)];\n\n    // Spill to make room in the register file.\n    if (!Class->Available) {\n      IREmit->SetWriteCursorBefore(CodeNode);\n      SpillReg(Class, Block, Pivot);\n    }\n\n    // Assign a free register in the appropriate class.\n    LOGMAN_THROW_A_FMT(Class->Available != 0, \"Post-condition of spilling\");\n    unsigned Reg = std::countr_zero(Class->Available);\n    SetReg(CodeNode, PhysicalRegister(ClassType, Reg));\n  };\n};\n\nvoid ConstrainedRAPass::AddRegisters(IR::RegClass Class, uint32_t RegisterCount) {\n  LOGMAN_THROW_A_FMT(RegisterCount <= 31, \"Up to 31 regs supported\");\n\n  Classes[FEXCore::ToUnderlying(Class)].Count = RegisterCount;\n}\n\ninline bool KillMove(IROp_Header* LastOp, IROp_Header* IROp, Ref LastNode, Ref CodeNode) {\n  // 32-bit moves in x86_64 are represented as a Bfe, detect them.\n  if (LastOp->Op == OP_BFE && LastOp->C<IR::IROp_Bfe>()->lsb == 0 && LastOp->C<IR::IROp_Bfe>()->Width == 32) {\n    auto Op = IROp->Op;\n\n    if (Op == OP_AND) {\n      // Rewrite \"mov wA, wB; and xA, xA, xC\" into \"and wA, wB, wC\", since\n      // ((b & 0xffffffff) & c) == (b & c) & 0xffffffff.\n      IROp->Size = OpSize::i32Bit;\n      return true;\n    } else if (IROp->Size == OpSize::i32Bit) {\n      return Op == OP_OR || Op == OP_XOR || Op == OP_AND || Op == OP_SUB || Op == OP_LSHL || Op == OP_LSHR || Op == OP_ASHR;\n    }\n  }\n\n  return LastOp->Op == OP_STOREREGISTER;\n}\n\ninline bool IsSignext(const IROp_Header* IROp, OrderedNodeWrapper Src, OpSize Size) {\n  if (IROp->Op == OP_SBFE) {\n    auto Sbfe = IROp->C<IR::IROp_Sbfe>();\n    return Sbfe->Width == 1 && Sbfe->lsb == (IR::OpSizeAsBits(Size) - 1) && Sbfe->Src == Src;\n  } else {\n    return false;\n  }\n}\n\ninline bool IsZero(const IROp_Header* IROp) {\n  return IROp->Op == OP_CONSTANT && IROp->C<IROp_Constant>()->Constant == 0;\n}\n\nbool ConstrainedRAPass::TryPostRAMerge(Ref LastNode, Ref CodeNode, IROp_Header* IROp) {\n  auto LastOp = IR->GetOp<IROp_Header>(LastNode);\n\n  if (IROp->Op == OP_PUSH && LastOp->Op == OP_PUSH) {\n    auto SP = PhysicalRegister(CodeNode);\n    auto Push = IR->GetOp<IROp_Push>(CodeNode);\n    auto LastPush = IR->GetOp<IROp_Push>(LastNode);\n\n    if (LastOp->Size == IROp->Size && LastPush->ValueSize == Push->ValueSize && SP == PhysicalRegister(LastNode) &&\n        SP == PhysicalRegister(IROp->Args[1]) && SP == PhysicalRegister(LastOp->Args[1]) && SP != PhysicalRegister(IROp->Args[0]) &&\n        SP != PhysicalRegister(LastOp->Args[0]) && Push->ValueSize >= OpSize::i32Bit) {\n\n      IREmit->SetWriteCursorBefore(LastNode);\n      IREmit->_PushTwo(IROp->Size, Push->ValueSize, IROp->Args[0], LastOp->Args[0], IROp->Args[1]);\n      IREmit->RemovePostRA(CodeNode);\n      return true;\n    }\n  } else if (IROp->Op == OP_POP) {\n    auto SP = PhysicalRegister(IROp->Args[0]);\n\n    if (LastOp->Op == OP_POP && LastOp->Size == IROp->Size && IROp->Size >= OpSize::i32Bit && SP == PhysicalRegister(LastOp->Args[0])) {\n      IREmit->SetWriteCursorBefore(LastNode);\n      IREmit->_PopTwo(IROp->Size, IROp->Args[0], LastOp->Args[1], IROp->Args[1]);\n      IREmit->RemovePostRA(CodeNode);\n      return true;\n    }\n  } else if ((IROp->Op == OP_DIV || IROp->Op == OP_UDIV) && IROp->Size >= OpSize::i32Bit) {\n    // If Upper came from a sign/zero extension, we only need a 64-bit division.\n    auto Op = IROp->CW<IR::IROp_Div>();\n    if (!Op->Upper.IsInvalid() && PhysicalRegister(Op->Upper) == PhysicalRegister(LastNode)) {\n      if (IROp->Op == OP_DIV ? IsSignext(LastOp, Op->Lower, IROp->Size) : IsZero(LastOp)) {\n        Op->Upper.SetInvalid();\n        return PhysicalRegister(LastNode) == PhysicalRegister(Op->OutRemainder);\n      }\n    }\n  } else if (IROp->Op == OP_XGETBV && PhysicalRegister(IROp->Args[0]) == PhysicalRegister(LastNode) && LastOp->Op == OP_CONSTANT) {\n    // Try to constant fold\n    uint64_t ConstantFunction = LastOp->C<IROp_Constant>()->Constant;\n    auto Op = IROp->CW<IR::IROp_XGetBV>();\n    if (CPUID->DoesXCRFunctionReportConstantData(ConstantFunction)) {\n      const auto Result = CPUID->RunXCRFunction(ConstantFunction);\n      IREmit->SetWriteCursorBefore(CodeNode);\n      IREmit->_Constant(Result.eax).Node->Reg = PhysicalRegister(Op->OutEAX).Raw;\n      IREmit->_Constant(Result.edx).Node->Reg = PhysicalRegister(Op->OutEDX).Raw;\n      IREmit->RemovePostRA(CodeNode);\n      return false;\n    }\n  } else if (IROp->Op == OP_CPUID && PhysicalRegister(IROp->Args[0]) == PhysicalRegister(LastNode) && LastOp->Op == OP_CONSTANT) {\n    // Try to constant fold. As a limitation of merging only 2 instructions, we\n    // can only handle constant functions, not constant leafs. This could be\n    // lifted if we generalized at a (significant) complexity cost.\n    uint64_t ConstantFunction = LastOp->C<IROp_Constant>()->Constant;\n    auto Op = IROp->CW<IR::IROp_CPUID>();\n\n    const auto SupportsConstant = CPUID->DoesFunctionReportConstantData(ConstantFunction);\n    if (SupportsConstant.SupportsConstantFunction == CPUIDEmu::SupportsConstant::CONSTANT &&\n        SupportsConstant.NeedsLeaf != CPUIDEmu::NeedsLeafConstant::NEEDSLEAFCONSTANT) {\n      const auto Result = CPUID->RunFunction(ConstantFunction, 0 /* leaf */);\n\n      IREmit->SetWriteCursorBefore(CodeNode);\n      IREmit->_Fence(IR::FenceType::Inst);\n      IREmit->_Constant(Result.eax).Node->Reg = PhysicalRegister(Op->OutEAX).Raw;\n      IREmit->_Constant(Result.ebx).Node->Reg = PhysicalRegister(Op->OutEBX).Raw;\n      IREmit->_Constant(Result.ecx).Node->Reg = PhysicalRegister(Op->OutECX).Raw;\n      IREmit->_Constant(Result.edx).Node->Reg = PhysicalRegister(Op->OutEDX).Raw;\n      IREmit->RemovePostRA(CodeNode);\n      return false;\n    }\n  }\n\n  // Merge moves that are immediately consumed.\n  //\n  // x86 code inserts such moves to workaround x86's 2-address code. Because\n  // arm64 is 3-address code, we can optimize these out.\n  //\n  // Note we rely on the short-circuiting here.\n  if (PhysicalRegister(LastNode) == PhysicalRegister(CodeNode) && KillMove(LastOp, IROp, LastNode, CodeNode)) {\n    LOGMAN_THROW_A_FMT(!PhysicalRegister(CodeNode).IsInvalid(), \"invariant\");\n\n    int NumArgs = IR::GetRAArgs(IROp->Op);\n    for (int s = 0; s < NumArgs; ++s) {\n      if (IROp->Args[s].IsImmediate() && PhysicalRegister(IROp->Args[s]) == PhysicalRegister(LastNode)) {\n        IROp->Args[s].SetImmediate(PhysicalRegister(LastOp->Args[0]).Raw);\n      }\n    }\n\n    return true;\n  }\n\n  return false;\n}\n\nvoid ConstrainedRAPass::Run(IREmitter* IREmit_) {\n  FEXCORE_PROFILE_SCOPED(\"PassManager::RA\");\n\n  IREmit = IREmit_;\n  auto IR_ = IREmit->ViewIR();\n  IR = &IR_;\n\n  PreferredReg.resize(IR->GetSSACount(), PhysicalRegister::Invalid());\n  SSAToReg.resize(IR->GetSSACount(), PhysicalRegister::Invalid());\n  Seen.resize(IR->GetSSACount(), false);\n\n  for (auto [BlockNode, BlockHeader] : IR->GetBlocks()) {\n    // Spilling is local, so reset this per-block\n    AnySpilled = false;\n\n    // At the start of each block, all registers are available.\n    for (auto& Class : Classes) {\n      Class.Available = (1u << Class.Count) - 1;\n    }\n\n    auto BlockIROp = BlockHeader->CW<IR::IROp_CodeBlock>();\n\n    // Backwards pass: analyze kill bits and SRA affinities\n    {\n      // Reverse iteration is not yet working with the iterators\n      // We grab these nodes this way so we can iterate easily\n      auto CodeBegin = IR->at(BlockIROp->Begin);\n      auto CodeLast = IR->at(BlockIROp->Last);\n\n      while (1) {\n        auto [CodeNode, IROp] = CodeLast();\n        // End of iteration gunk\n\n        // Record preferred registers for SRA. We also record the Node accessing\n        // each register, used below. Since we initialized Class->Available,\n        // RegToSSA is otherwise undefined so we can stash our temps there.\n        if (auto Node = DecodeSRANode(IROp, CodeNode); Node != nullptr) {\n          auto Reg = DecodeSRAReg(IROp, CodeNode);\n\n          PreferredReg[IR->GetID(Node).Value] = Reg;\n          GetClass(Reg)->RegToSSA[Reg.Reg] = CodeNode;\n        }\n\n        // Coalescing an SRA store is equivalent to hoisting the store,\n        // implying write-after-write and read-after-write hazards. We can only\n        // coalesce if there is no intervening load/store.\n        //\n        // Since we're walking backwards, RegToSSA tracks\n        // the first load/store after CodeNode. That first instruction is the\n        // store in question iff there is no intervening load/store.\n        //\n        // Reset PreferredReg if that is not the case, ensuring SRA correctness.\n        if (auto Reg = PreferredReg[IR->GetID(CodeNode).Value]; !Reg.IsInvalid()) {\n          auto Node = GetClass(Reg)->RegToSSA[Reg.Reg];\n          IROp_Header* Header = IR->GetOp<IROp_Header>(Node);\n\n          if (CodeNode != DecodeSRANode(Header, Node)) {\n            PreferredReg[IR->GetID(CodeNode).Value] = PhysicalRegister::Invalid();\n          }\n        }\n\n        const int NumArgs = IR::GetRAArgs(IROp->Op);\n        for (int i = NumArgs - 1; i >= 0; --i) {\n          const auto& Arg = IROp->Args[i];\n          if (!Arg.IsInvalid()) {\n            const uint32_t Index = Arg.ID().Value;\n            if (!Seen[Index]) {\n              Seen[Index] = true;\n              IROp->Args[i].SetKill();\n            }\n          }\n        }\n\n        // Rest is iteration gunk\n        if (CodeLast == CodeBegin) {\n          break;\n        }\n        --CodeLast;\n      }\n    }\n\n    // NextUses currently contains first use distances, the exact initialization\n    // assumed by the forward pass. Do not reset it.\n\n    // Last nontrivial instruction, for merging as we go.\n    Ref LastNode = nullptr;\n\n    // Forward pass: Assign registers, spilling & optimizing as we go.\n    for (auto [CodeNode, IROp] : IR->GetCode(BlockNode)) {\n      bool AnySpilledBeforeThisInstruction = AnySpilled;\n\n      // These do not read or write registers, and must be skipped for merging.\n      // Since we'd be doing this check anyway for merging, do the check now so\n      // we can skip the rest of the logic too.\n      if (IROp->Op == OP_GUESTOPCODE || IROp->Op == OP_INLINECONSTANT) {\n        continue;\n      }\n\n      // Static registers must be consistent at SRA load/store. Evict to ensure.\n      if (auto Node = DecodeSRANode(IROp, CodeNode); Node != nullptr) {\n        auto Reg = DecodeSRAReg(IROp, CodeNode);\n        RegisterClassData* Class = &Classes[Reg.Class];\n\n        if (!(Class->Available & (1u << Reg.Reg))) {\n          Ref Old = Class->RegToSSA[Reg.Reg];\n\n          if (Old != Node) {\n            // Before inserting instructions, we need to set the cursor and\n            // reset LastNode so we don't merge across an inserted copy.\n            // Otherwise, we would erroneously miss the copy when determining if\n            // we can merge, and end up unsoundly merging a mov+xchg sequence.\n            IREmit->SetWriteCursorBefore(CodeNode);\n            LastNode = nullptr;\n\n            Ref Copy;\n\n            if (Reg.AsRegClass() == RegClass::FPRFixed) {\n              IROp_Header* Header = IR->GetOp<IROp_Header>(Old);\n              Copy = IREmit->_VMov(Header->Size, OrderedNodeWrapper::FromImmediate(Reg.Raw));\n            } else {\n              Copy = IREmit->_Copy(OrderedNodeWrapper::FromImmediate(Reg.Raw));\n            }\n\n            FreeReg(Reg);\n            AssignReg(IR->GetOp<IROp_Header>(Copy), BlockIROp, Copy, IROp);\n            RemapReg(Old, PhysicalRegister(Copy));\n          }\n        }\n      }\n\n      // Fill all sources that are not already in the register file.\n      //\n      // This happens before freeing killed sources, since we need all sources in\n      // the register file simultaneously.\n      //\n      // Also update next-use info, again only relevant if we've spilled.\n      int NumArgs = IR::GetRAArgs(IROp->Op);\n\n      if (AnySpilledBeforeThisInstruction) {\n        for (int s = 0; s < NumArgs; ++s) {\n          auto V = IROp->Args[s];\n          V.ClearKill();\n\n          if (!IsValidArg(V)) {\n            continue;\n          }\n\n          Ref Old = IR->GetNode(V);\n\n          SourceIndex--;\n          LOGMAN_THROW_A_FMT(SourceIndex >= 0, \"Consistent source count\");\n          NextUses[V.ID().Value] = SourcesNextUses[SourceIndex];\n\n          if (!IsInRegisterFile(Old)) {\n            IREmit->SetWriteCursorBefore(CodeNode);\n            LastNode = nullptr;\n\n            Ref Fill = InsertFill(Old);\n\n            AssignReg(IR->GetOp<IROp_Header>(Fill), BlockIROp, Fill, IROp);\n            RemapReg(Old, PhysicalRegister(Fill));\n          }\n        }\n      }\n\n      for (int s = 0; s < NumArgs; ++s) {\n        if (IROp->Args[s].IsInvalid()) {\n          continue;\n        }\n\n        bool Kill = IROp->Args[s].HasKill();\n        IROp->Args[s].ClearKill();\n        Ref Node = IR->GetNode(IROp->Args[s]);\n        auto ID = IR->GetID(Node).Value;\n        auto Reg = SSAToReg[ID];\n\n        if (!Reg.IsInvalid()) {\n          if (Kill) {\n            LOGMAN_THROW_A_FMT(IsInRegisterFile(Node), \"sources in file\");\n            FreeReg(Reg);\n          }\n\n          IROp->Args[s].SetImmediate(Reg.Raw);\n        }\n      }\n\n      // Assign destinations.\n      if (GetHasDest(IROp->Op) && PhysicalRegister(CodeNode).IsInvalid()) {\n        AssignReg(IROp, BlockIROp, CodeNode, IROp);\n      }\n\n      if (IsTrivial(CodeNode, IROp)) {\n        // Delete instructions that only exist for RA\n        IREmit->RemovePostRA(CodeNode);\n      } else if (LastNode && TryPostRAMerge(LastNode, CodeNode, IROp)) {\n        // Merge adjacent instructions\n        IREmit->RemovePostRA(LastNode);\n        LastNode = nullptr;\n      } else {\n        LastNode = CodeNode;\n      }\n    }\n\n    if (AnySpilled) {\n      LOGMAN_THROW_A_FMT(SourceIndex == 0, \"Consistent source count in block\");\n    }\n  }\n\n  PreferredReg.clear();\n  SSAToReg.clear();\n  SpillSlots.clear();\n  NextUses.clear();\n  Seen.clear();\n\n  IR->GetHeader()->PostRA = true;\n}\n\nfextl::unique_ptr<IR::RegisterAllocationPass> CreateRegisterAllocationPass(const FEXCore::CPUIDEmu* CPUID) {\n  return fextl::make_unique<ConstrainedRAPass>(CPUID);\n}\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/Passes/RegisterAllocationPass.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: ir|opts\n$end_info$\n*/\n\n#pragma once\n#include \"Interface/IR/PassManager.h\"\n\n#include <memory>\n#include <stdint.h>\n\nnamespace FEXCore::IR {\nenum class RegClass : uint32_t;\n\nclass RegisterAllocationPass : public FEXCore::IR::Pass {\npublic:\n  virtual void AddRegisters(RegClass Class, uint32_t RegisterCount) = 0;\n\n  // Number of GPRs usable for pairs at start of GPR set. Must be even.\n  uint32_t PairRegs {};\n};\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/Passes/x87StackOptimizationPass.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"FEXCore/Utils/LogManager.h\"\n#include \"Interface/Core/Interpreter/Fallbacks/FallbackOpHandler.h\"\n#include \"Interface/IR/IR.h\"\n#include \"Interface/IR/IREmitter.h\"\n#include \"Interface/IR/PassManager.h\"\n#include \"FEXCore/IR/IR.h\"\n#include \"FEXCore/Utils/Profiler.h\"\n#include \"FEXCore/Core/HostFeatures.h\"\n#include \"Interface/Core/Addressing.h\"\n\n#include <array>\n#include <cstddef>\n#include <cstdint>\n#include <stdint.h>\n\n// This file adds a pass to process X87 stack instructions.\n// These instructions are marked in IR.json with `X87: true` and are generated\n// by X87 guest instructions.\n// The way is works is that there's a virtual stack `StackData`, where we load and store\n// and apply the operations in a block of code. Once the block finishes, we emit the necessary operations\n// that we recorded onto the virtual stack. This allows us to save a lot of code movement\n// to and from stack registers, top management and valid flags. It also allows us to\n// perform memcpy optimizations like the one performed in STORESTACKMEM.\n//\n// By default we run on the fast path - i.e. we assume all values are in the stack and we have a complete\n// stack overview. However, if we encounter a value that's not in the virtual stack - maybe it was added\n// to the stack in a previous block, we move onto the slow path which loads and stores values to the stack\n// registers.\n// Once in a slow path, we won't return to the fast pass until the beginning of the following block.\n\nnamespace FEXCore::IR {\n\n// FIXME(pmatos): copy from OpcodeDispatcher.h\ninline uint32_t MMBaseOffset() {\n  return static_cast<uint32_t>(offsetof(Core::CPUState, mm[0][0]));\n}\n\n// Similar helper to the one in OpcodeDispatcher.h except we do not\n// need to handle flags, etc.\ntemplate<typename T>\nvoid DeriveOp(Ref& RefV, IROps NewOp, IREmitter::IRPair<T> Expr) {\n  Expr.first->Header.Op = NewOp;\n  RefV = Expr;\n}\n\nenum class StackSlot { UNUSED, INVALID, VALID };\n// FixedSizeStack is a model of the x87 Stack where each element in this\n// fixed size stack lives at an offset from top. The top of the stack is at\n// index 0.\ntemplate<typename T>\nclass FixedSizeStack {\npublic:\n  struct StackSlotEntry final {\n    StackSlot Type;\n    T Value;\n  };\n\n  static constexpr uint8_t size = 8;\n\n  // Real top as an offset from stored top value (or the one at the beginning of the block)\n  // For example, if we start and push a value to our simulated stack, because we don't\n  // update top straight away the TopOffset is 1.\n  // If SlowPath is true, then TopOffset is always zero.\n  int8_t TopOffset = 0;\n\n  FixedSizeStack()\n    : buffer(FixedSizeStack::size, {StackSlot::UNUSED, T::Invalid}) {}\n\n  void push(const T& Value) {\n    rotate();\n    buffer.front() = {StackSlot::VALID, Value};\n  }\n\n  // Rotate the elements with the direction controlled by Right\n  void rotate(bool Right = true) {\n    if (Right) {\n      std::rotate(buffer.begin(), buffer.end() - 1, buffer.end());\n      TopOffset++;\n    } else {\n      std::rotate(buffer.begin(), buffer.begin() + 1, buffer.end());\n      TopOffset--;\n    }\n  }\n\n  void pop() {\n    buffer.front() = {StackSlot::INVALID, T::Invalid};\n    rotate(false);\n  }\n\n  const StackSlotEntry& top(size_t Offset = 0) const {\n    return buffer[Offset];\n  }\n\n  void setTop(T Value, size_t Offset = 0) {\n    buffer[Offset] = {StackSlot::VALID, Value};\n  }\n\n  bool isValid(size_t Offset) const {\n    return buffer[Offset].first;\n  }\n\n  void clear() {\n    for (auto& Elem : buffer) {\n      Elem = {StackSlot::UNUSED, T::Invalid};\n    }\n    TopOffset = 0;\n  }\n\n  void dump() const {\n    LogMan::Msg::DFmt(\"-- Stack\");\n\n    for (size_t i = 0; i < 8; i++) {\n      const auto& [Valid, Element] = buffer[i];\n      if (Valid == StackSlot::VALID) {\n        LogMan::Msg::DFmt(\"| ST{}: 0x{:x}\", i, (uintptr_t)(Element.StackDataNode));\n      } else if (Valid == StackSlot::INVALID) {\n        LogMan::Msg::DFmt(\"| ST{}: INVALID\", i);\n      }\n    }\n    LogMan::Msg::DFmt(\"--\");\n  }\n\n  void setTagInvalid(size_t Index) {\n    buffer[Index].Type = StackSlot::INVALID;\n  }\n\n  // Returns a mask to set in AbridgedTagWord\n  uint8_t getValidMask() {\n    uint8_t Mask = 0;\n    for (size_t i = 0; i < buffer.size(); i++) {\n      if (buffer[i].Type == StackSlot::VALID) {\n        Mask |= 1U << i;\n      }\n    }\n    return Mask;\n  }\n\n  // Returns a mask to set in AbridgedTagWord\n  uint8_t getInvalidMask() {\n    uint8_t Mask = 0;\n    for (size_t i = 0; i < buffer.size(); i++) {\n      if (buffer[i].Type == StackSlot::INVALID) {\n        Mask |= 1U << i;\n      }\n    }\n    return Mask;\n  }\n\nprivate:\n  fextl::vector<StackSlotEntry> buffer;\n};\n\nclass X87StackOptimization final : public Pass {\npublic:\n  X87StackOptimization(const FEXCore::HostFeatures& Features, OpSize GPROpSize)\n    : Features(Features)\n    , GPROpSize(GPROpSize) {\n    FEX_CONFIG_OPT(ReducedPrecision, X87REDUCEDPRECISION);\n    ReducedPrecisionMode = ReducedPrecision;\n  }\n  void Run(IREmitter* Emit) override;\n\nprivate:\n  const FEXCore::HostFeatures& Features;\n  const OpSize GPROpSize;\n  bool ReducedPrecisionMode;\n  FEX_CONFIG_OPT(DisableVixlIndirectCalls, DISABLE_VIXL_INDIRECT_RUNTIME_CALLS);\n\n  // Helpers\n  Ref RotateRight8(uint32_t V, Ref Amount);\n\n  void F80SplitStore_Helper(const IROp_StoreStackMem* Op, Ref StackNode, Ref AddrNode, Ref Offset, OpSize Align, MemOffsetType OffsetType,\n                            uint8_t OffsetScale) {\n    IREmit->_StoreMemFPR(OpSize::i64Bit, StackNode, AddrNode, Offset, Align, OffsetType, OffsetScale);\n    auto Upper = IREmit->_VExtractToGPR(OpSize::i128Bit, OpSize::i64Bit, StackNode, 1);\n\n    // Store the Upper part of the register (the remaining 2 bytes) into memory.\n    AddressMode A {.Base = AddrNode,\n                   .Index = Op->Offset.IsInvalid() ? nullptr : Offset,\n                   .Offset = 8,\n                   .IndexType = MemOffsetType::SXTX,\n                   .IndexScale = OffsetScale,\n                   .AddrSize = OpSize::i64Bit};\n    A = SelectAddressMode(IREmit, A, GPROpSize, Features.SupportsTSOImm9, false, false, OpSize::i16Bit);\n    IREmit->_StoreMemGPR(OpSize::i16Bit, Upper, A.Base, A.Index, OpSize::i64Bit, MemOffsetType::SXTX, A.IndexScale);\n  }\n\n  void Store80BitToMem(const IROp_StoreStackMem* Op, Ref StackNode, Ref AddrNode, Ref Offset, OpSize Align, MemOffsetType OffsetType,\n                       uint8_t OffsetScale) {\n    if (Features.SupportsSVE128 || Features.SupportsSVE256) {\n      AddressMode A {.Base = AddrNode,\n                     .Index = Op->Offset.IsInvalid() ? nullptr : Offset,\n                     .IndexType = MemOffsetType::SXTX,\n                     .IndexScale = OffsetScale,\n                     .AddrSize = OpSize::i64Bit};\n      AddrNode = LoadEffectiveAddress(IREmit, A, GPROpSize, false);\n      IREmit->_StoreMemX87SVEOptPredicate(OpSize::i128Bit, OpSize::i16Bit, StackNode, AddrNode);\n    } else {\n      F80SplitStore_Helper(Op, StackNode, AddrNode, Offset, Align, OffsetType, OffsetScale);\n    }\n  }\n\n  void StoreStackMem_Helper(const IROp_StoreStackMem* Op, Ref StackNode) {\n    LOGMAN_THROW_A_FMT(!ReducedPrecisionMode, \"Full precision mode expected.\");\n\n    Ref AddrNode = IR->GetNode(Op->Addr);\n    Ref Offset = IR->GetNode(Op->Offset);\n    OpSize Align = Op->Align;\n    MemOffsetType OffsetType = Op->OffsetType;\n    uint8_t OffsetScale = Op->OffsetScale;\n\n    // Normal Precision Mode\n    switch (Op->StoreSize) {\n    case OpSize::i32Bit:\n    case OpSize::i64Bit: {\n      StackNode = IREmit->_F80CVT(Op->StoreSize, StackNode);\n      IREmit->_StoreMemFPR(Op->StoreSize, StackNode, AddrNode, Offset, Align, OffsetType, OffsetScale);\n      break;\n    }\n\n    case OpSize::f80Bit: {\n      Store80BitToMem(Op, StackNode, AddrNode, Offset, Align, OffsetType, OffsetScale);\n      break;\n    }\n    default: ERROR_AND_DIE_FMT(\"Unsupported x87 size\");\n    }\n  }\n\n  // Performs a store to memory from a value the stack passed in as StackNode.\n  // This is the version dealing with the reduced precision case.\n  void StoreStackMem_Reduced_Helper(const IROp_StoreStackMem* Op, Ref StackNode) {\n    LOGMAN_THROW_A_FMT(ReducedPrecisionMode, \"Reduced precision mode expected.\");\n\n    Ref AddrNode = IR->GetNode(Op->Addr);\n    Ref Offset = IR->GetNode(Op->Offset);\n    OpSize Align = Op->Align;\n    MemOffsetType OffsetType = Op->OffsetType;\n    uint8_t OffsetScale = Op->OffsetScale;\n\n    switch (Op->StoreSize) {\n    case OpSize::i32Bit: {\n      StackNode = IREmit->_Float_FToF(OpSize::i32Bit, OpSize::i64Bit, StackNode);\n      [[fallthrough]];\n    }\n    case OpSize::i64Bit: {\n      IREmit->_StoreMemFPR(Op->StoreSize, StackNode, AddrNode, Offset, Align, OffsetType, OffsetScale);\n      break;\n    }\n\n    case OpSize::f80Bit: {\n      StackNode = IREmit->_F80CVTTo(StackNode, OpSize::i64Bit);\n      Store80BitToMem(Op, StackNode, AddrNode, Offset, Align, OffsetType, OffsetScale);\n      break;\n    }\n    default: ERROR_AND_DIE_FMT(\"Unsupported x87 size\");\n    }\n  }\n\n  // Handles a Unary operation.\n  // Takes the op we are handling, the Node for the reduced precision case and the node for the normal case.\n  // Depending on the type of Op64, we might need to pass a couple of extra constant arguments, this happens\n  // when VFOp64 is true.\n  void HandleUnop(IROps Op64, bool VFOp64, IROps Op80);\n  void HandleBinopValue(IROps Op64, bool VFOp64, IROps Op80, uint8_t DestStackOffset, bool MarkDestValid, uint8_t StackOffset,\n                        Ref ValueNode, bool Reverse = false);\n  void HandleBinopStack(IROps Op64, bool VFOp64, IROps Op80, uint8_t DestStackOffset, uint8_t StackOffset1, uint8_t StackOffset2,\n                        bool Reverse = false);\n\n  // Top Management Helpers\n  /// Set the valid tag for Value as valid (if Valid is true), or invalid (if Valid is false).\n  void SetX87ValidTag(uint8_t Offset, bool Valid);\n  // Generates slow code to load/store a value from an offset from the top of the stack\n  Ref LoadStackValueAtOffset_Slow(uint8_t Offset = 0);\n  void StoreStackValueAtOffset_Slow(Ref Value, uint8_t Offset = 0, bool SetValid = true);\n  // Update Top value in slow path for a pop\n  void UpdateTopForPop_Slow();\n  void UpdateTopForPush_Slow();\n  // Synchronizes the current simulated stack with the actual values.\n  // Returns a new value for Top, that's synchronized between the simulated stack\n  // and the actual FPU stack.\n  Ref SynchronizeStackValues();\n  // Moves us from the fast to the slow path if ShouldMigrate is true.\n  void MigrateToSlowPathIf(bool ShouldMigrate);\n  // Top Cache Management\n  Ref GetTopWithCache_Slow();\n  Ref GetOffsetTopWithCache_Slow(uint8_t Offset, bool Reverse = false);\n  Ref GetOffsetTopAddressWithCache_Slow(uint8_t Offset);\n  void SetTopWithCache_Slow(Ref Value);\n  Ref GetX87ValidTag_Slow(uint8_t Offset);\n  // Resets fields to initial values\n  void Reset();\n\n  struct StackMemberInfo {\n    StackMemberInfo() = delete;\n    StackMemberInfo(Ref Data)\n      : StackDataNode(Data) {}\n    StackMemberInfo(Ref Data, Ref Source, OpSize Size)\n      : StackDataNode(Data)\n      , Source({Size, Source}) {}\n    Ref StackDataNode {}; // Reference to the data in the Stack.\n                          // This is the source data node in the stack format, possibly converted to 64/80 bits.\n    struct StackMemberData final {\n      OpSize Size;\n      Ref Node;\n    };\n\n    static const StackMemberInfo Invalid;\n\n    // Tuple is only valid if we have information about the Source of the Stack Data Node.\n    // In it's valid then OpSize is the original source size and Ref is the original source node.\n    std::optional<StackMemberData> Source {};\n  };\n\n  // StackData, TopCache need to be always properly set to ensure\n  // they reflect the current state of the FPU. This sync only makes sense while\n  // taking the fast path. Once in the slow path, these don't make sense anymore\n  // and we are syncing everything.\n\n  // Index on vector is offset to top value at start of block\n  // If slow path is true, then StackData is always empty.\n  FixedSizeStack<StackMemberInfo> StackData;\n\n  void InvalidateCaches();\n  void InvalidateCachedRegs();\n\n  // Path Migration helper management\n  std::optional<StackMemberInfo> MigrateToSlowPath_IfInvalid(uint8_t Offset = 0);\n  Ref LoadStackValue(uint8_t Offset = 0);\n  void StoreStackValue(Ref Value, uint8_t Offset = 0, bool SetValid = false);\n  void StackPop();\n\n  // Cache for Constants\n  // ConstantPoll[i] has IREmit->_Constant(i);\n  std::array<Ref, 8> ConstantPool {};\n  Ref GetConstant(ssize_t Offset);\n\n  // Cached value for Top\n  // If slowpath is false, then TopCache is nullptr.\n  bool FlushTopPending = false;\n  std::array<bool, 8> FlushValuesPending {};\n  bool FlushValidPending = false;\n  void FlushCachedRegs();\n\n  Ref GetFTW();\n\n  Ref FTWCached {};\n  std::array<Ref, 8> TopOffsetCache {};\n  std::array<Ref, 8> TopOffsetAddressCache {};\n  std::array<Ref, 8> TopValueCache {};\n  std::array<StackSlot, 8> TopValidCache {};\n\n  // Are we on the slow path?\n  // Once we enter the slow path, we never come out.\n  // This just simplifies the code atm. If there's a need to return to the fast path in the future\n  // we can implement that but I would expect that there would be very few cases where that's necessary.\n  // On the slow path TopCache is always the last obtained version of top.\n  // TopOffset is ignored\n  bool SlowPath = false;\n  // Keeping IREmitter not to pass arguments around\n  IREmitter* IREmit = nullptr;\n  IRListView* IR = nullptr;\n};\n\ninline const X87StackOptimization::StackMemberInfo X87StackOptimization::StackMemberInfo::Invalid {nullptr};\n\ninline void X87StackOptimization::InvalidateCaches() {\n  InvalidateCachedRegs();\n  ConstantPool.fill(nullptr);\n}\n\ninline void X87StackOptimization::InvalidateCachedRegs() {\n  FlushCachedRegs();\n  FTWCached = {};\n  TopOffsetCache.fill(nullptr);\n  TopOffsetAddressCache.fill(nullptr);\n  TopValueCache.fill(nullptr);\n  TopValidCache.fill(StackSlot::UNUSED);\n}\n\ninline void X87StackOptimization::Reset() {\n  SlowPath = false;\n  StackData.clear();\n  InvalidateCaches();\n}\n\ninline Ref X87StackOptimization::GetConstant(ssize_t Offset) {\n  if (Offset < 0 || Offset >= X87StackOptimization::ConstantPool.size()) {\n    // not dealt by pool\n    return IREmit->_Constant(Offset);\n  }\n  if (ConstantPool[Offset] == nullptr) {\n\n    ConstantPool[Offset] = IREmit->_Constant(Offset);\n  }\n  return ConstantPool[Offset];\n}\n\ninline void X87StackOptimization::MigrateToSlowPathIf(bool ShouldMigrate) {\n  if (ShouldMigrate && !SlowPath) {\n    SynchronizeStackValues();\n    StackData.clear();\n    SlowPath = true;\n  }\n}\n\ninline Ref X87StackOptimization::GetTopWithCache_Slow() {\n  if (!TopOffsetCache[0]) {\n    TopOffsetCache[0] = IREmit->_LoadContextGPR(OpSize::i8Bit, offsetof(FEXCore::Core::CPUState, flags) + FEXCore::X86State::X87FLAG_TOP_LOC);\n  }\n  return TopOffsetCache[0];\n}\n\ninline Ref X87StackOptimization::GetOffsetTopWithCache_Slow(uint8_t Offset, bool Reverse) {\n  if (Reverse) {\n    Offset = 8 - Offset;\n  }\n\n  Offset &= 7;\n\n  if (TopOffsetCache[Offset]) {\n    return TopOffsetCache[Offset];\n  }\n\n  auto* OffsetTop = GetTopWithCache_Slow();\n  if (Offset != 0) {\n    OffsetTop = IREmit->_And(OpSize::i32Bit, IREmit->Add(OpSize::i32Bit, OffsetTop, Offset), GetConstant(7));\n    // GetTopWithCache_Slow already sets the cache so we don't need to set it here for offset == 0\n    TopOffsetCache[Offset] = OffsetTop;\n  }\n\n  return OffsetTop;\n}\n\ninline Ref X87StackOptimization::GetOffsetTopAddressWithCache_Slow(uint8_t Offset) {\n  if (TopOffsetAddressCache[Offset]) {\n    return TopOffsetAddressCache[Offset];\n  }\n\n  Ref OffsetRef = GetOffsetTopWithCache_Slow(Offset);\n  TopOffsetAddressCache[Offset] = IREmit->_FormContextAddress(OpSize::i64Bit, OffsetRef, 16);\n\n  return TopOffsetAddressCache[Offset];\n}\n\ninline void X87StackOptimization::SetTopWithCache_Slow(Ref Value) {\n  InvalidateCachedRegs();\n  TopOffsetCache[0] = Value;\n  FlushTopPending = true;\n}\n\ninline Ref X87StackOptimization::GetFTW() {\n  if (!FTWCached) {\n    FTWCached = IREmit->_LoadContextGPR(OpSize::i8Bit, offsetof(FEXCore::Core::CPUState, AbridgedFTW));\n  }\n  return FTWCached;\n}\n\ninline void X87StackOptimization::SetX87ValidTag(uint8_t Offset, bool Valid) {\n  TopValidCache[Offset] = Valid ? StackSlot::VALID : StackSlot::INVALID;\n  FlushValidPending = true;\n}\n\ninline Ref X87StackOptimization::GetX87ValidTag_Slow(uint8_t Offset) {\n  switch (TopValidCache[Offset]) {\n  case StackSlot::UNUSED:\n    return IREmit->_And(OpSize::i32Bit, IREmit->_Lshr(OpSize::i32Bit, GetFTW(), GetOffsetTopWithCache_Slow(Offset)), GetConstant(1));\n  case StackSlot::INVALID: return GetConstant(0);\n  case StackSlot::VALID: return GetConstant(1);\n  }\n}\n\ninline Ref X87StackOptimization::LoadStackValueAtOffset_Slow(uint8_t Offset) {\n  OrderedNode* TopOffsetAddress = GetOffsetTopAddressWithCache_Slow(Offset);\n  auto Size = ReducedPrecisionMode ? OpSize::i64Bit : OpSize::i128Bit;\n  if (!TopValueCache[Offset]) {\n    TopValueCache[Offset] = IREmit->_LoadMemFPR(Size, TopOffsetAddress, IREmit->_InlineConstant(MMBaseOffset()), Size, MemOffsetType::SXTX, 1);\n  }\n  return TopValueCache[Offset];\n}\n\ninline void X87StackOptimization::StoreStackValueAtOffset_Slow(Ref Value, uint8_t Offset, bool SetValid) {\n  TopValueCache[Offset] = Value;\n  FlushValuesPending[Offset] = true;\n  // mark it valid\n  // In some cases we might already know it has been previously set as valid so we don't need to do it again\n  if (SetValid) {\n    SetX87ValidTag(Offset, true);\n  }\n}\n\ninline Ref X87StackOptimization::RotateRight8(uint32_t V, Ref Amount) {\n  return IREmit->_Lshr(OpSize::i32Bit, GetConstant(V | (V << 8)), Amount);\n}\n\ninline std::optional<X87StackOptimization::StackMemberInfo> X87StackOptimization::MigrateToSlowPath_IfInvalid(uint8_t Offset) {\n  const auto& [Valid, StackMember] = StackData.top(Offset);\n  MigrateToSlowPathIf(Valid != StackSlot::VALID);\n  if (Valid == StackSlot::VALID) {\n    return StackMember;\n  }\n  return {};\n}\n\ninline Ref X87StackOptimization::LoadStackValue(uint8_t Offset) {\n  const auto& StackValue = MigrateToSlowPath_IfInvalid(Offset);\n  return SlowPath ? LoadStackValueAtOffset_Slow(Offset) : StackValue->StackDataNode;\n}\n\ninline void X87StackOptimization::StoreStackValue(Ref Value, uint8_t Offset, bool SetValid) {\n  if (SlowPath) {\n    StoreStackValueAtOffset_Slow(Value, Offset, SetValid);\n  } else {\n    StackData.setTop(StackMemberInfo {Value}, Offset);\n  }\n}\n\ninline void X87StackOptimization::StackPop() {\n  if (SlowPath) {\n    UpdateTopForPop_Slow();\n  } else {\n    StackData.pop();\n  }\n}\n\n\nvoid X87StackOptimization::HandleUnop(IROps Op64, bool VFOp64, IROps Op80) {\n  Ref St0 = LoadStackValue();\n  Ref Value {};\n\n  if (ReducedPrecisionMode) {\n    if (VFOp64) {\n      DeriveOp(Value, Op64, IREmit->_VFSqrt(OpSize::i64Bit, OpSize::i64Bit, St0));\n    } else {\n      DeriveOp(Value, Op64, IREmit->_F64SIN(St0));\n    }\n  } else {\n    DeriveOp(Value, Op80, IREmit->_F80SQRT(St0));\n  }\n\n  StoreStackValue(Value);\n}\n\n\nvoid X87StackOptimization::HandleBinopValue(IROps Op64, bool VFOp64, IROps Op80, uint8_t DestStackOffset, bool MarkDestValid,\n                                            uint8_t StackOffset, Ref ValueNode, bool Reverse) {\n  LOGMAN_THROW_A_FMT(!Reverse || VFOp64, \"There are no reverse operations using non VFOp64 ops\");\n  auto StackNode = LoadStackValue(StackOffset);\n\n  Ref Node = {};\n  if (ReducedPrecisionMode) {\n    if (Reverse) {\n      DeriveOp(Node, Op64, IREmit->_VFAdd(OpSize::i64Bit, OpSize::i64Bit, ValueNode, StackNode));\n    } else {\n      if (VFOp64) {\n        DeriveOp(Node, Op64, IREmit->_VFAdd(OpSize::i64Bit, OpSize::i64Bit, StackNode, ValueNode));\n      } else {\n        DeriveOp(Node, Op64, IREmit->_F64FPREM(StackNode, ValueNode));\n      }\n    }\n  } else {\n    if (Reverse) {\n      DeriveOp(Node, Op80, IREmit->_F80Add(ValueNode, StackNode));\n    } else {\n      DeriveOp(Node, Op80, IREmit->_F80Add(StackNode, ValueNode));\n    }\n  }\n\n  StoreStackValue(Node, DestStackOffset, MarkDestValid && StackOffset != DestStackOffset);\n}\n\nvoid X87StackOptimization::HandleBinopStack(IROps Op64, bool VFOp64, IROps Op80, uint8_t DestStackOffset, uint8_t StackOffset1,\n                                            uint8_t StackOffset2, bool Reverse) {\n  auto StackNode = LoadStackValue(StackOffset2);\n  HandleBinopValue(Op64, VFOp64, Op80, DestStackOffset, StackOffset2 != DestStackOffset, StackOffset1, StackNode, Reverse);\n}\n\ninline void X87StackOptimization::UpdateTopForPop_Slow() {\n  // Pop the top of the x87 stack\n  GetOffsetTopWithCache_Slow(1);\n  std::rotate(TopOffsetCache.begin(), std::next(TopOffsetCache.begin()), TopOffsetCache.end());\n  std::rotate(TopOffsetAddressCache.begin(), std::next(TopOffsetAddressCache.begin()), TopOffsetAddressCache.end());\n  std::rotate(TopValueCache.begin(), std::next(TopValueCache.begin()), TopValueCache.end());\n  std::rotate(FlushValuesPending.begin(), std::next(FlushValuesPending.begin()), FlushValuesPending.end());\n  std::rotate(TopValidCache.begin(), std::next(TopValidCache.begin()), TopValidCache.end());\n  FlushTopPending = true;\n}\n\ninline void X87StackOptimization::UpdateTopForPush_Slow() {\n  // Pop the top of the x87 stack\n  GetOffsetTopWithCache_Slow(1, true);\n  std::rotate(TopOffsetCache.begin(), std::prev(TopOffsetCache.end()), TopOffsetCache.end());\n  std::rotate(TopOffsetAddressCache.begin(), std::prev(TopOffsetAddressCache.end()), TopOffsetAddressCache.end());\n  std::rotate(TopValueCache.begin(), std::prev(TopValueCache.end()), TopValueCache.end());\n  std::rotate(FlushValuesPending.begin(), std::prev(FlushValuesPending.end()), FlushValuesPending.end());\n  std::rotate(TopValidCache.begin(), std::prev(TopValidCache.end()), TopValidCache.end());\n  FlushTopPending = true;\n}\n\nvoid X87StackOptimization::FlushCachedRegs() {\n  if (FlushTopPending) {\n    IREmit->_StoreContextGPR(OpSize::i8Bit, TopOffsetCache[0], offsetof(FEXCore::Core::CPUState, flags) + FEXCore::X86State::X87FLAG_TOP_LOC);\n    FlushTopPending = false;\n  }\n\n  auto Size = ReducedPrecisionMode ? OpSize::i64Bit : OpSize::i128Bit;\n  for (size_t i = 0; i < FlushValuesPending.size(); i++) {\n    if (FlushValuesPending[i]) {\n      OrderedNode* TopOffsetAddress = GetOffsetTopAddressWithCache_Slow(i);\n      IREmit->_StoreMemFPR(Size, TopValueCache[i], TopOffsetAddress, IREmit->_InlineConstant(MMBaseOffset()), Size, MemOffsetType::SXTX, 1);\n      // store\n      FlushValuesPending[i] = false;\n    }\n  }\n\n  if (FlushValidPending) {\n    uint8_t ValidMask = 0;\n    uint8_t InvalidMask = 0;\n    for (auto It = TopValidCache.rbegin(); It != TopValidCache.rend(); It++) {\n      ValidMask <<= 1;\n      InvalidMask <<= 1;\n      if (*It == StackSlot::VALID) {\n        ValidMask |= 1;\n      } else if (*It == StackSlot::INVALID) {\n        InvalidMask |= 1;\n      }\n    }\n\n    if (ValidMask || InvalidMask) {\n      Ref NewFTW = [&]() {\n        if (ValidMask == 0xff || InvalidMask == 0xff) {\n          // If InvalidMask == 0xff then ValidMask = 0\n          return GetConstant(ValidMask);\n        } else {\n          Ref NewFTW = GetFTW();\n          Ref RotAmount {};\n          if (std::popcount(ValidMask) == 1) {\n            uint8_t BitIdx = std::countr_zero(ValidMask);\n            Ref RegMask = IREmit->_Lshl(OpSize::i32Bit, GetConstant(1), GetOffsetTopWithCache_Slow(BitIdx));\n            NewFTW = IREmit->_Or(OpSize::i32Bit, NewFTW, RegMask);\n          } else if (ValidMask) {\n            RotAmount = IREmit->_Sub(OpSize::i32Bit, GetConstant(8), GetTopWithCache_Slow());\n            // perform a rotate right on mask by top\n            NewFTW = IREmit->_Or(OpSize::i32Bit, NewFTW, RotateRight8(ValidMask, RotAmount));\n          }\n\n          if (std::popcount(InvalidMask) == 1) {\n            uint8_t BitIdx = std::countr_zero(InvalidMask);\n            Ref RegMask = IREmit->_Lshl(OpSize::i32Bit, GetConstant(1), GetOffsetTopWithCache_Slow(BitIdx));\n            NewFTW = IREmit->_Andn(OpSize::i32Bit, NewFTW, RegMask);\n          } else if (InvalidMask) {\n            if (!RotAmount) {\n              RotAmount = IREmit->_Sub(OpSize::i32Bit, GetConstant(8), GetTopWithCache_Slow());\n            }\n            NewFTW = IREmit->_Andn(OpSize::i32Bit, NewFTW, RotateRight8(InvalidMask, RotAmount));\n          }\n          return NewFTW;\n        }\n      }();\n\n      IREmit->_StoreContextGPR(OpSize::i8Bit, NewFTW, offsetof(FEXCore::Core::CPUState, AbridgedFTW));\n      FTWCached = NewFTW;\n    }\n\n    FlushValidPending = false;\n  }\n}\n\n// We synchronize stack values in a few occasions but one of the most important of those,\n// is when we move from fast to a slow path and need to make sure that the context is properly\n// written.\nRef X87StackOptimization::SynchronizeStackValues() {\n  if (SlowPath) {\n    return GetTopWithCache_Slow();\n  }\n\n  // Store new top which is now the original top minus recorded top offset\n  // Careful with underflow wraparound.\n  const auto TopOffset = StackData.TopOffset;\n\n  if (TopOffset != 0) {\n    Ref NewTop = GetOffsetTopWithCache_Slow(TopOffset, true);\n    SetTopWithCache_Slow(NewTop);\n  }\n  StackData.TopOffset = 0;\n\n  // Before leaving we need to write the current values in the stack to\n  // context so that the values are correct. Copy SourceDataNode in the\n  // stack to the respective mmX register.\n  Ref TopValue = GetTopWithCache_Slow();\n  for (size_t i = 0; i < StackData.size; ++i) {\n    const auto& [Valid, StackMember] = StackData.top(i);\n\n    if (Valid == StackSlot::VALID) {\n      StoreStackValueAtOffset_Slow(StackMember.StackDataNode, i, false);\n    }\n  }\n  { // Set valid tags\n    uint8_t ValidMask = StackData.getValidMask();\n    uint8_t InvalidMask = StackData.getInvalidMask();\n    for (auto& Elem : TopValidCache) {\n      Elem = (ValidMask & 1) ? StackSlot::VALID : ((InvalidMask & 1) ? StackSlot::INVALID : StackSlot::UNUSED);\n\n      ValidMask >>= 1;\n      InvalidMask >>= 1;\n    }\n    FlushValidPending = true;\n  }\n\n  return TopValue;\n}\n\nvoid X87StackOptimization::Run(IREmitter* Emit) {\n  FEXCORE_PROFILE_SCOPED(\"PassManager::x87StackOpt\");\n\n  auto CurrentIR = Emit->ViewIR();\n  auto* HeaderOp = CurrentIR.GetHeader();\n  LOGMAN_THROW_A_FMT(HeaderOp->Header.Op == OP_IRHEADER, \"First op wasn't IRHeader\");\n\n  if (!HeaderOp->HasX87) {\n    // If there is no x87 in this, just early exit.\n    return;\n  }\n\n  // Initialize IREmit member\n  IREmit = Emit;\n  IR = &CurrentIR;\n\n  // Run optimization proper\n  for (auto [BlockNode, BlockHeader] : CurrentIR.GetBlocks()) {\n    auto BlockIROp = BlockHeader->CW<FEXCore::IR::IROp_CodeBlock>();\n    // Each time we deal with a new block we need to start over.\n    // The optimization should run per-block\n    Reset();\n\n    IREmit->SetCurrentCodeBlock(BlockNode);\n    for (auto [CodeNode, IROp] : CurrentIR.GetCode(BlockNode)) {\n      if (!LoweredX87(IROp->Op)) {\n        continue;\n      }\n      IREmit->SetWriteCursor(CodeNode);\n      switch (IROp->Op) {\n      case OP_F80ADDSTACK: {\n        const auto* Op = IROp->C<IROp_F80AddStack>();\n        HandleBinopStack(OP_VFADD, true, OP_F80ADD, Op->SrcStack1, Op->SrcStack1, Op->SrcStack2);\n        break;\n      }\n\n      case OP_F80SUBSTACK: {\n        const auto* Op = IROp->C<IROp_F80SubStack>();\n        HandleBinopStack(OP_VFSUB, true, OP_F80SUB, Op->DstStack, Op->SrcStack1, Op->SrcStack2);\n        break;\n      }\n\n      case OP_F80MULSTACK: {\n        const auto* Op = IROp->C<IROp_F80MulStack>();\n        HandleBinopStack(OP_VFMUL, true, OP_F80MUL, Op->SrcStack1, Op->SrcStack1, Op->SrcStack2);\n        break;\n      }\n\n      case OP_F80DIVSTACK: {\n        const auto* Op = IROp->C<IROp_F80DivStack>();\n        HandleBinopStack(OP_VFDIV, true, OP_F80DIV, Op->DstStack, Op->SrcStack1, Op->SrcStack2);\n        break;\n      }\n\n      case OP_F80FPREMSTACK: {\n        HandleBinopStack(OP_F64FPREM, false, OP_F80FPREM, 0, 0, 1);\n        break;\n      }\n\n      case OP_F80FPREM1STACK: {\n        HandleBinopStack(OP_F64FPREM1, false, OP_F80FPREM1, 0, 0, 1);\n        break;\n      }\n\n      case OP_F80SCALESTACK: {\n        HandleBinopStack(OP_F64SCALE, false, OP_F80SCALE, 0, 0, 1);\n        break;\n      }\n\n      case OP_F80FYL2XSTACK: {\n        HandleBinopStack(OP_F64FYL2X, false, OP_F80FYL2X, 1, 0, 1);\n        StackPop();\n        break;\n      }\n\n      case OP_F80ATANSTACK: {\n        HandleBinopStack(OP_F64ATAN, false, OP_F80ATAN, 1, 1, 0);\n        StackPop();\n        break;\n      }\n\n      case OP_F80ADDVALUE: {\n        const auto* Op = IROp->C<IROp_F80AddValue>();\n        HandleBinopValue(OP_VFADD, true, OP_F80ADD, 0, true, Op->SrcStack, CurrentIR.GetNode(Op->X80Src));\n        break;\n      }\n\n      case OP_F80SUBRVALUE:\n      case OP_F80SUBVALUE: {\n        const auto* Op = IROp->C<IROp_F80SubValue>();\n        HandleBinopValue(OP_VFSUB, true, OP_F80SUB, 0, true, Op->SrcStack, CurrentIR.GetNode(Op->X80Src), IROp->Op == OP_F80SUBRVALUE);\n        break;\n      }\n\n      case OP_F80DIVRVALUE:\n      case OP_F80DIVVALUE: {\n        const auto* Op = IROp->C<IROp_F80DivValue>();\n        HandleBinopValue(OP_VFDIV, true, OP_F80DIV, 0, true, Op->SrcStack, CurrentIR.GetNode(Op->X80Src), IROp->Op == OP_F80DIVRVALUE);\n        break;\n      }\n\n      case OP_F80MULVALUE: {\n        const auto* Op = IROp->C<IROp_F80MulValue>();\n        HandleBinopValue(OP_VFMUL, true, OP_F80MUL, 0, true, Op->SrcStack, CurrentIR.GetNode(Op->X80Src));\n        break;\n      }\n\n      case OP_F80SQRTSTACK: {\n        HandleUnop(OP_VFSQRT, true, OP_F80SQRT);\n        break;\n      }\n\n      case OP_F80SINSTACK: {\n        HandleUnop(OP_F64SIN, false, OP_F80SIN);\n        break;\n      }\n\n      case OP_F80COSSTACK: {\n        HandleUnop(OP_F64COS, false, OP_F80COS);\n        break;\n      }\n\n      case OP_F80F2XM1STACK: {\n        HandleUnop(OP_F64F2XM1, false, OP_F80F2XM1);\n        break;\n      }\n\n\n      case OP_F80PTANSTACK: {\n        HandleUnop(OP_F64TAN, false, OP_F80TAN);\n        Ref OneConst {};\n        if (ReducedPrecisionMode) {\n          OneConst = IREmit->_VCastFromGPR(OpSize::i64Bit, OpSize::i64Bit, GetConstant(0x3FF0000000000000));\n        } else {\n          OneConst = IREmit->_LoadNamedVectorConstant(OpSize::i128Bit, NamedVectorConstant::NAMED_VECTOR_X87_ONE);\n        }\n\n        if (SlowPath) {\n          UpdateTopForPush_Slow();\n          StoreStackValueAtOffset_Slow(OneConst);\n        } else {\n          StackData.push(StackMemberInfo {OneConst});\n        }\n        break;\n      }\n\n      case OP_F80SINCOSSTACK: {\n        Ref St0 = LoadStackValue();\n\n        Ref SinValue {};\n        Ref CosValue {};\n\n        if (ReducedPrecisionMode) {\n          SinValue = IREmit->_F64SIN(St0);\n          CosValue = IREmit->_F64COS(St0);\n        }\n#ifdef VIXL_SIMULATOR\n        else if (DisableVixlIndirectCalls() == 0) {\n          SinValue = IREmit->_F80SIN(St0);\n          CosValue = IREmit->_F80COS(St0);\n        }\n#endif\n        else {\n          SinValue = IREmit->_AllocateFPR(OpSize::i128Bit, OpSize::i128Bit);\n          CosValue = IREmit->_AllocateFPR(OpSize::i128Bit, OpSize::i128Bit);\n          IREmit->_F80SINCOS(St0, SinValue, CosValue);\n        }\n\n        // Push values\n        if (SlowPath) {\n          StoreStackValueAtOffset_Slow(SinValue, 0, false);\n          UpdateTopForPush_Slow();\n          StoreStackValueAtOffset_Slow(CosValue, 0, true);\n        } else {\n          StackData.setTop(StackMemberInfo {SinValue});\n          StackData.push(StackMemberInfo {CosValue});\n        }\n        break;\n      }\n\n      case OP_INITSTACK: {\n        StackData.clear();\n        InvalidateCachedRegs();\n        break;\n      }\n\n      case OP_INVALIDATESTACK: {\n        const auto* Op = IROp->C<IROp_ReadStackValue>();\n        auto Offset = Op->StackLocation;\n\n        if (Offset != 0xff) { // invalidate single offset\n          if (SlowPath) {\n            SetX87ValidTag(Offset, false);\n          } else {\n            StackData.setTagInvalid(Offset);\n          }\n        } else { // invalidate all\n          if (SlowPath) {\n            TopValidCache.fill(StackSlot::INVALID);\n            FlushValidPending = true;\n          } else {\n            for (size_t i = 0; i < StackData.size; i++) {\n              StackData.setTagInvalid(i);\n            }\n          }\n        }\n        break;\n      }\n\n      case OP_PUSHSTACK: {\n        const auto* Op = IROp->C<IROp_PushStack>();\n        auto* SourceNode = CurrentIR.GetNode(Op->X80Src);\n\n        if (SlowPath) {\n          UpdateTopForPush_Slow();\n          StoreStackValueAtOffset_Slow(SourceNode);\n        } else {\n          auto* SourceNode = CurrentIR.GetNode(Op->X80Src);\n          if (Op->OriginalValue.IsInvalid()) {\n            // No original value to track - just push the converted data\n            StackData.push(StackMemberInfo {SourceNode});\n          } else {\n            auto* OriginalNode = CurrentIR.GetNode(Op->OriginalValue);\n            StackData.push(StackMemberInfo {SourceNode, OriginalNode, Op->LoadSize});\n          }\n        }\n        break;\n      }\n\n      case OP_COPYPUSHSTACK: {\n        const auto* Op = IROp->C<IROp_CopyPushStack>();\n        auto Offset = Op->StackLocation;\n        auto Value = MigrateToSlowPath_IfInvalid(Offset);\n\n        if (SlowPath) {\n          Ref St0 = LoadStackValueAtOffset_Slow(Offset);\n          UpdateTopForPush_Slow();\n          StoreStackValueAtOffset_Slow(St0);\n        } else {\n          StackData.push(*Value);\n        }\n        break;\n      }\n\n      case OP_READSTACKVALUE: {\n        const auto* Op = IROp->C<IROp_ReadStackValue>();\n        auto Offset = Op->StackLocation;\n        Ref NewValue = LoadStackValue(Offset);\n\n        IREmit->ReplaceUsesWithAfter(CodeNode, NewValue, CodeNode);\n        break;\n      }\n\n      case OP_STACKVALIDTAG: {\n        // Returns 0 if value is valid and 1 otherwise.\n        const auto* Op = IROp->C<IROp_StackValidTag>();\n        auto Offset = Op->StackLocation;\n        auto Value = MigrateToSlowPath_IfInvalid(Offset);\n\n        Ref Tag {};\n        if (SlowPath) {\n          Tag = GetX87ValidTag_Slow(Offset);\n        } else {\n          Tag = Value ? GetConstant(1) : GetConstant(0);\n        }\n\n        IREmit->ReplaceUsesWithAfter(CodeNode, Tag, CodeNode);\n        break;\n      }\n\n      case OP_STORESTACKMEM: {\n        const auto* Op = IROp->C<IROp_StoreStackMem>();\n        const auto& Value = MigrateToSlowPath_IfInvalid();\n        Ref StackNode = SlowPath ? LoadStackValueAtOffset_Slow() : Value->StackDataNode;\n        Ref AddrNode = CurrentIR.GetNode(Op->Addr);\n        Ref Offset = CurrentIR.GetNode(Op->Offset);\n        OpSize Align = Op->Align;\n        MemOffsetType OffsetType = Op->OffsetType;\n        uint8_t OffsetScale = Op->OffsetScale;\n\n        // On the fast path we can optimize memory copies.\n        // If we are doing:\n        // fld dword [rax]\n        // fst dword [rbx]\n        // We can optimize this to:\n        // ldr w2, [x0]\n        // str w2, [x1]\n        // or similar. As long as the source size and dest size are one and the same.\n        // This will avoid any conversions between source and stack element size and conversion back.\n        OpSize StoreSize = Op->StoreSize;\n        LOGMAN_THROW_A_FMT(Op->StoreSize == OpSize::i32Bit || Op->StoreSize == OpSize::i64Bit || Op->StoreSize == OpSize::f80Bit,\n                           \"Invalid store size in x87 store stack mem\");\n        if (!SlowPath && Value->Source && Value->Source->Size == StoreSize) {\n          Ref SourceValue = Value->Source->Node;\n          if (Op->StoreSize == OpSize::f80Bit) {\n            Store80BitToMem(Op, SourceValue, AddrNode, Offset, Align, OffsetType, OffsetScale);\n          } else {\n            IREmit->_StoreMemFPR(StoreSize, SourceValue, AddrNode, Offset, Align, OffsetType, OffsetScale);\n          }\n          break;\n        }\n\n        if (ReducedPrecisionMode) {\n          StoreStackMem_Reduced_Helper(Op, StackNode);\n          break;\n        }\n\n        StoreStackMem_Helper(Op, StackNode);\n        break;\n      }\n\n      case OP_STORESTACKTOSTACK: { // stores top of stack in another place in stack.\n        const auto* Op = IROp->C<IROp_StoreStackToStack>();\n        auto Offset = Op->StackLocation;\n\n        if (Offset != 0) {\n          auto Value = MigrateToSlowPath_IfInvalid();\n\n          // Need to store st0 to stack location - basically a copy.\n          if (SlowPath) {\n            StoreStackValueAtOffset_Slow(LoadStackValueAtOffset_Slow(), Offset);\n          } else {\n            StackData.setTop(*Value, Offset);\n          }\n        }\n        break;\n      }\n      case OP_POPSTACKDESTROY: {\n        if (SlowPath) {\n          SetX87ValidTag(0, false);\n        }\n        StackPop();\n        break;\n      }\n\n      case OP_F80STACKXCHANGE: {\n        const auto* Op = IROp->C<IROp_F80StackXchange>();\n        auto Offset = Op->SrcStack;\n\n        if (Offset == 0) {\n          // No-op\n          break;\n        }\n\n        const auto [ValidTop, StackMemberTop] = StackData.top(0);\n        const auto [ValidOffset, StackMemberOffset] = StackData.top(Offset);\n\n        if (ValidTop != StackSlot::VALID || ValidOffset != StackSlot::VALID) {\n          // Slow path: do actual memory operations\n          Ref ValueTop = LoadStackValue();\n          Ref ValueOffset = LoadStackValue(Offset);\n          StoreStackValue(ValueOffset);\n          StoreStackValue(ValueTop, Offset);\n        } else {\n          // Fast path: swap complete StackMemberInfo preserving Source metadata\n          StackData.setTop(StackMemberOffset, 0);\n          StackData.setTop(StackMemberTop, Offset);\n        }\n        break;\n      }\n\n      case OP_F80STACKCHANGESIGN: {\n        Ref Value = LoadStackValue();\n\n        // We need a couple of intermediate instructions to change the sign\n        // of a value\n        Ref ResultNode {};\n        if (ReducedPrecisionMode) {\n          ResultNode = IREmit->_VFNeg(OpSize::i64Bit, OpSize::i64Bit, Value);\n        } else {\n          Ref HelperNode = IREmit->_LoadNamedVectorConstant(OpSize::i128Bit, IR::NamedVectorConstant::NAMED_VECTOR_F80_SIGN_MASK);\n          ResultNode = IREmit->_VXor(OpSize::i128Bit, OpSize::i8Bit, Value, HelperNode);\n        }\n        StoreStackValue(ResultNode);\n        break;\n      }\n\n      case OP_F80STACKABS: {\n        Ref Value = LoadStackValue();\n\n        Ref ResultNode {};\n        if (ReducedPrecisionMode) {\n          ResultNode = IREmit->_VFAbs(OpSize::i64Bit, OpSize::i64Bit, Value);\n        } else {\n          // Intermediate insts\n          Ref HelperNode = IREmit->_LoadNamedVectorConstant(OpSize::i128Bit, IR::NamedVectorConstant::NAMED_VECTOR_F80_SIGN_MASK);\n          ResultNode = IREmit->_VAndn(OpSize::i128Bit, OpSize::i8Bit, Value, HelperNode);\n        }\n        StoreStackValue(ResultNode);\n        break;\n      }\n\n      case OP_F80CMPSTACK: {\n        const auto* Op = IROp->C<IROp_F80CmpStack>();\n        auto Offset = Op->SrcStack;\n        Ref StackValue1 = LoadStackValue();\n        Ref StackValue2 = LoadStackValue(Offset);\n\n        Ref CmpNode {};\n        if (ReducedPrecisionMode) {\n          CmpNode = IREmit->_FCmp(OpSize::i64Bit, StackValue1, StackValue2);\n        } else {\n          CmpNode = IREmit->_F80Cmp(StackValue1, StackValue2);\n        }\n\n        IREmit->ReplaceUsesWithAfter(CodeNode, CmpNode, CodeNode);\n        break;\n      }\n      case OP_F80STACKTEST: {\n        const auto* Op = IROp->C<IROp_F80StackTest>();\n        auto Offset = Op->SrcStack;\n        auto StackNode = LoadStackValue(Offset);\n        Ref ZeroConst = IREmit->_VCastFromGPR(ReducedPrecisionMode ? OpSize::i64Bit : OpSize::i128Bit, OpSize::i64Bit, GetConstant(0));\n\n        Ref CmpNode {};\n        if (ReducedPrecisionMode) {\n          CmpNode = IREmit->_FCmp(OpSize::i64Bit, StackNode, ZeroConst);\n        } else {\n          CmpNode = IREmit->_F80Cmp(StackNode, ZeroConst);\n        }\n        IREmit->ReplaceUsesWithAfter(CodeNode, CmpNode, CodeNode);\n        break;\n      }\n\n\n      case OP_F80CMPVALUE: {\n        const auto* Op = IROp->C<IROp_F80CmpValue>();\n        const auto& Value = CurrentIR.GetNode(Op->X80Src);\n        auto StackNode = LoadStackValue();\n\n        Ref CmpNode {};\n        if (ReducedPrecisionMode) {\n          CmpNode = IREmit->_FCmp(OpSize::i64Bit, StackNode, Value);\n        } else {\n          CmpNode = IREmit->_F80Cmp(StackNode, Value);\n        }\n        IREmit->ReplaceUsesWithAfter(CodeNode, CmpNode, CodeNode);\n        break;\n      }\n\n      case OP_SYNCSTACKTOSLOW: {\n        // This synchronizes stack values but doesn't necessarily moves us off the FastPath!\n        Ref NewTop = SynchronizeStackValues();\n        FlushCachedRegs();\n        IREmit->ReplaceUsesWithAfter(CodeNode, NewTop, CodeNode);\n        break;\n      }\n\n      case OP_STACKFORCESLOW: {\n        MigrateToSlowPathIf(true);\n        InvalidateCachedRegs();\n        break;\n      }\n\n      case OP_INCSTACKTOP: {\n        if (SlowPath) {\n          UpdateTopForPop_Slow();\n        } else {\n          StackData.rotate(false);\n        }\n        break;\n      }\n\n      case OP_DECSTACKTOP: {\n        if (SlowPath) {\n          UpdateTopForPush_Slow();\n        } else {\n          StackData.rotate(true);\n        }\n        break;\n      }\n\n      case OP_F80ROUNDSTACK: {\n        Ref St0 = LoadStackValue();\n\n        Ref Value {};\n        if (ReducedPrecisionMode) {\n          Value = IREmit->_Vector_FToI(OpSize::i64Bit, OpSize::i64Bit, St0, RoundMode::Host);\n        } else {\n          Value = IREmit->_F80Round(St0);\n        }\n        StoreStackValue(Value);\n        break;\n      }\n\n      case OP_F80VBSLSTACK: {\n        const auto* Op = IROp->C<IROp_F80VBSLStack>();\n\n        auto StackOffset1 = Op->SrcStack1;\n        auto StackOffset2 = Op->SrcStack2;\n        Ref Value1 = LoadStackValue(StackOffset1);\n        Ref Value2 = LoadStackValue(StackOffset2);\n\n        Ref StackNode = IREmit->_VBSL(OpSize::i128Bit, CurrentIR.GetNode(Op->VectorMask), Value1, Value2);\n        StoreStackValue(StackNode, 0, StackOffset1 && StackOffset2);\n        break;\n      }\n\n      default: LOGMAN_THROW_A_FMT(false, \"IROp was expected to be lowered\");\n      }\n      IREmit->Remove(CodeNode);\n    }\n\n    auto Last = CurrentIR.at(BlockIROp->Last);\n    --Last;\n    auto [LastCodeNode, LastIROp] = Last();\n    LOGMAN_THROW_A_FMT(IsBlockExit(LastIROp->Op), \"must be exit\");\n    IREmit->SetWriteCursorBefore(LastCodeNode);\n    SynchronizeStackValues();\n    FlushCachedRegs();\n  }\n\n  return;\n}\n\nfextl::unique_ptr<Pass> CreateX87StackOptimizationPass(const FEXCore::HostFeatures& Features, OpSize GPROpSize) {\n  return fextl::make_unique<X87StackOptimization>(Features, GPROpSize);\n}\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/Passes.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/fextl/memory.h>\n\nnamespace FEXCore {\nclass CPUIDEmu;\nstruct HostFeatures;\n} // namespace FEXCore\n\nnamespace FEXCore::Utils {\nclass IntrusivePooledAllocator;\n}\n\nnamespace FEXCore::IR {\nclass Pass;\nclass RegisterAllocationPass;\n\nfextl::unique_ptr<FEXCore::IR::Pass> CreateDeadFlagCalculationEliminination();\nfextl::unique_ptr<FEXCore::IR::RegisterAllocationPass> CreateRegisterAllocationPass(const FEXCore::CPUIDEmu* CPUID);\nfextl::unique_ptr<FEXCore::IR::Pass> CreateX87StackOptimizationPass(const FEXCore::HostFeatures&, OpSize GPROpSize);\n\nnamespace Validation {\n  fextl::unique_ptr<FEXCore::IR::Pass> CreateIRValidation();\n} // namespace Validation\n\nnamespace Debug {\n  fextl::unique_ptr<FEXCore::IR::Pass> CreateIRDumper();\n}\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Interface/IR/RegisterAllocationData.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"IR.h\"\n#include <cstdint>\n\nnamespace FEXCore::IR {\n\nunion PhysicalRegister {\n  uint8_t Raw;\n  struct {\n    // 32 maximum physical registers\n    uint8_t Reg : 5;\n    // 8 Maximum classes\n    uint8_t Class : 3;\n  };\n\n  bool operator==(const PhysicalRegister& Other) const {\n    return Raw == Other.Raw;\n  }\n\n  PhysicalRegister(RegClass Class, uint8_t Reg)\n    : Reg(Reg)\n    , Class(uint8_t(Class)) {}\n\n  PhysicalRegister(OrderedNodeWrapper Arg)\n    : Raw(Arg.GetImmediate()) {}\n\n  PhysicalRegister(Ref Node)\n    : Raw(Node->Reg) {}\n\n  RegClass AsRegClass() const {\n    return RegClass {Class};\n  }\n\n  static const PhysicalRegister Invalid() {\n    return PhysicalRegister(RegClass::Invalid, 0);\n  }\n\n  bool IsInvalid() const {\n    static_assert(uint8_t(RegClass::Invalid) == 0);\n    return Raw == 0;\n  }\n};\n\nstatic_assert(sizeof(PhysicalRegister) == 1);\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/Source/Utils/Allocator/64BitAllocator.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Utils/Allocator/FlexBitSet.h\"\n#include \"Utils/Allocator/HostAllocator.h\"\n#include \"Utils/Allocator/IntrusiveArenaAllocator.h\"\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/SignalScopeGuards.h>\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/fextl/sstream.h>\n#include <FEXHeaderUtils/Syscalls.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <algorithm>\n#include <array>\n#include <cassert>\n#include <cerrno>\n#include <cstddef>\n#include <cstdint>\n#include <list>\n#include <memory>\n#include <mutex>\n#include <new>\n#include <sys/mman.h>\n#include <sys/utsname.h>\n#include <sys/user.h>\n#include <type_traits>\n#include <utility>\n\nnamespace Alloc::OSAllocator {\n\nthread_local FEXCore::Core::InternalThreadState* TLSThread {};\n\nclass OSAllocator_64Bit final : public Alloc::HostAllocator {\npublic:\n  OSAllocator_64Bit();\n  OSAllocator_64Bit(fextl::vector<FEXCore::Allocator::MemoryRegion>& Regions);\n\n  virtual ~OSAllocator_64Bit();\n  void* AllocateSlab(size_t Size) override {\n    return nullptr;\n  }\n  void DeallocateSlab(void* Ptr, size_t Size) override {}\n\n  void* Mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset) override;\n  int Munmap(void* addr, size_t length) override;\n\n  void LockBeforeFork(FEXCore::Core::InternalThreadState* Thread) override {\n    AllocationMutex.lock();\n  }\n\n  void UnlockAfterFork(FEXCore::Core::InternalThreadState* Thread, bool Child) override {\n    if (Child) {\n      AllocationMutex.StealAndDropActiveLocks();\n    } else {\n      AllocationMutex.unlock();\n    }\n  }\n\nprivate:\n  // Upper bound is the maximum virtual address space of the host processor\n  uintptr_t UPPER_BOUND = (1ULL << 57);\n\n  // Lower bound is the starting of the range just past the lower 32bits\n  constexpr static uintptr_t LOWER_BOUND = 0x1'0000'0000ULL;\n\n  uintptr_t UPPER_BOUND_PAGE = UPPER_BOUND / FEXCore::Utils::FEX_PAGE_SIZE;\n  constexpr static uintptr_t LOWER_BOUND_PAGE = LOWER_BOUND / FEXCore::Utils::FEX_PAGE_SIZE;\n\n  struct ReservedVMARegion {\n    uintptr_t Base;\n    // Could be number of pages if we want to pack this in to 12 bytes\n    uint64_t RegionSize;\n  };\n\n  bool MergeReservedRegionIfPossible(ReservedVMARegion* Region, uintptr_t NextPtr, uint64_t NextSize) {\n    constexpr uint64_t MaxReservedRegionSize = 64ULL * 1024 * 1024 * 1024; // 64GB\n    uintptr_t RegionEnd = Region->Base + Region->RegionSize;\n    uint64_t NewRegionSize = Region->RegionSize + NextSize;\n    if (RegionEnd == NextPtr && NewRegionSize <= MaxReservedRegionSize) {\n      // Append the contiguous region\n      Region->RegionSize = NewRegionSize;\n      return true;\n    }\n    return false;\n  }\n\n  struct LiveVMARegion {\n    ReservedVMARegion* SlabInfo;\n    uint64_t FreeSpace {};\n    uint64_t NumManagedPages {};\n    uint32_t LastPageAllocation {};\n    bool HadMunmap {};\n\n    // Align UsedPages so it pads to the next page.\n    // Necessary to take advantage of madvise zero page pooling.\n    using FlexBitElementType = uint64_t;\n    alignas(FEXCore::Utils::FEX_PAGE_SIZE) FEXCore::FlexBitSet<FlexBitElementType> UsedPages;\n\n    // This returns the size of the LiveVMARegion in addition to the flex set that tracks the used data\n    // The LiveVMARegion lives at the start of the VMA region which means on initialization we need to set that\n    // tracked ranged as used immediately\n    static size_t GetFEXManagedVMARegionSize(size_t Size) {\n      // One element per page\n\n      // 0x10'0000'0000 bytes\n      // 0x100'0000 Pages\n      // 1 bit per page for tracking means 0x20'0000 (Pages / 8) bytes of flex space\n      // Which is 2MB of tracking\n      const uint64_t NumElements = Size >> FEXCore::Utils::FEX_PAGE_SHIFT;\n      return sizeof(LiveVMARegion) + FEXCore::FlexBitSet<FlexBitElementType>::SizeInBytes(NumElements);\n    }\n\n    static void InitializeVMARegionUsed(LiveVMARegion* Region, size_t AdditionalSize) {\n      size_t SizeOfLiveRegion =\n        FEXCore::AlignUp(LiveVMARegion::GetFEXManagedVMARegionSize(Region->SlabInfo->RegionSize), FEXCore::Utils::FEX_PAGE_SIZE);\n      size_t SizePlusManagedData = SizeOfLiveRegion + AdditionalSize;\n\n      Region->FreeSpace = Region->SlabInfo->RegionSize - SizePlusManagedData;\n\n      size_t NumManagedPages = SizePlusManagedData >> FEXCore::Utils::FEX_PAGE_SHIFT;\n      size_t ManagedSize = NumManagedPages << FEXCore::Utils::FEX_PAGE_SHIFT;\n\n      // Use madvise to set the full tracking region to zero.\n      // This ensures unused pages are zero, while not having the backing pages consuming memory.\n      ::madvise(Region->UsedPages.Memory + ManagedSize, (Region->SlabInfo->RegionSize >> FEXCore::Utils::FEX_PAGE_SHIFT) - ManagedSize,\n                MADV_DONTNEED);\n\n      // Use madvise to claim WILLNEED on the beginning pages for initial state tracking.\n      // Improves performance of the following MemClear by not doing a page level fault dance for data necessary to track >170TB of used pages.\n      ::madvise(Region->UsedPages.Memory, ManagedSize, MADV_WILLNEED);\n\n      // Set our reserved pages\n      Region->UsedPages.MemSet(NumManagedPages);\n      Region->LastPageAllocation = NumManagedPages;\n      Region->NumManagedPages = NumManagedPages;\n    }\n  };\n\n  static_assert(sizeof(LiveVMARegion) == FEXCore::Utils::FEX_PAGE_SIZE, \"Needs to be the size of a page\");\n\n  static_assert(std::is_trivially_copyable<LiveVMARegion>::value, \"Needs to be trivially copyable\");\n  static_assert(offsetof(LiveVMARegion, UsedPages) == sizeof(LiveVMARegion), \"FlexBitSet needs to be at the end\");\n\n  using ReservedRegionListType = fex_pmr::list<ReservedVMARegion*>;\n  using LiveRegionListType = fex_pmr::list<LiveVMARegion*>;\n  ReservedRegionListType* ReservedRegions {};\n  LiveRegionListType* LiveRegions {};\n\n  Alloc::ForwardOnlyIntrusiveArenaAllocator* ObjectAlloc {};\n  FEXCore::ForkableUniqueMutex AllocationMutex;\n  void DetermineVASize();\n\n  LiveVMARegion* MakeRegionActive(ReservedRegionListType::iterator ReservedIterator, uint64_t UsedSize) {\n    ReservedVMARegion* ReservedRegion = *ReservedIterator;\n\n    ReservedRegions->erase(ReservedIterator);\n\n    // mprotect the new region we've allocated\n    size_t SizeOfLiveRegion =\n      FEXCore::AlignUp(LiveVMARegion::GetFEXManagedVMARegionSize(ReservedRegion->RegionSize), FEXCore::Utils::FEX_PAGE_SIZE);\n    size_t SizePlusManagedData = UsedSize + SizeOfLiveRegion;\n\n    auto Res = mprotect(reinterpret_cast<void*>(ReservedRegion->Base), SizePlusManagedData, PROT_READ | PROT_WRITE);\n    LOGMAN_THROW_A_FMT(Res != -1, \"Couldn't mprotect region: {} '{}' Likely occurs when running out of memory or Maximum VMAs\", errno,\n                       strerror(errno));\n\n    FEXCore::Allocator::VirtualName(\"FEXMem_Misc\", reinterpret_cast<void*>(ReservedRegion->Base), SizePlusManagedData);\n    LiveVMARegion* LiveRange = new (reinterpret_cast<void*>(ReservedRegion->Base)) LiveVMARegion();\n\n    // Copy over the reserved data\n    LiveRange->SlabInfo = ReservedRegion;\n\n    // Initialize VMA\n    LiveVMARegion::InitializeVMARegionUsed(LiveRange, UsedSize);\n\n    // Add to our active tracked ranges\n    auto LiveIter = LiveRegions->emplace_back(LiveRange);\n    return LiveIter;\n  }\n\n  void AllocateMemoryRegions(fextl::vector<FEXCore::Allocator::MemoryRegion>& Ranges);\n  LiveVMARegion* FindLiveRegionForAddress(uintptr_t Addr, uintptr_t AddrEnd);\n};\n\nvoid OSAllocator_64Bit::DetermineVASize() {\n  size_t Bits = FEXCore::Allocator::DetermineVASize();\n  uintptr_t Size = 1ULL << Bits;\n\n  UPPER_BOUND = Size;\n\n#if ARCHITECTURE_x86_64 // Last page cannot be allocated on x86\n  UPPER_BOUND -= FEXCore::Utils::FEX_PAGE_SIZE;\n#endif\n\n  UPPER_BOUND_PAGE = UPPER_BOUND / FEXCore::Utils::FEX_PAGE_SIZE;\n}\n\nOSAllocator_64Bit::LiveVMARegion* OSAllocator_64Bit::FindLiveRegionForAddress(uintptr_t Addr, uintptr_t AddrEnd) {\n  LiveVMARegion* LiveRegion {};\n\n  // Check active slabs to see if we can fit this\n  for (auto it = LiveRegions->begin(); it != LiveRegions->end(); ++it) {\n    uintptr_t RegionBegin = (*it)->SlabInfo->Base;\n    uintptr_t RegionEnd = RegionBegin + (*it)->SlabInfo->RegionSize;\n\n    if (Addr >= RegionBegin && AddrEnd < RegionEnd) {\n      LiveRegion = *it;\n      // Leave our loop\n      break;\n    }\n  }\n\n  // Couldn't find an active region that fit\n  // Check reserved regions\n  if (!LiveRegion) {\n    // Didn't have a slab that fit this range\n    // Check our reserved regions to see if we have one that fits\n    for (auto it = ReservedRegions->begin(); it != ReservedRegions->end(); ++it) {\n      ReservedVMARegion* ReservedRegion = *it;\n      uintptr_t RegionEnd = ReservedRegion->Base + ReservedRegion->RegionSize;\n      if (Addr >= ReservedRegion->Base && AddrEnd < RegionEnd) {\n        // Found one, let's make it active\n        LiveRegion = MakeRegionActive(it, 0);\n        break;\n      }\n    }\n  }\n\n  return LiveRegion;\n}\n\nvoid* OSAllocator_64Bit::Mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset) {\n  if (addr != 0 && addr < reinterpret_cast<void*>(LOWER_BOUND)) {\n    // If we are asked to allocate something outside of the 64-bit space\n    // Then we need to just hand this to the OS\n    return ::mmap(addr, length, prot, flags, fd, offset);\n  }\n\n  uint64_t Addr = reinterpret_cast<uint64_t>(addr);\n  // Addr must be page aligned\n  if (Addr & ~FEXCore::Utils::FEX_PAGE_MASK) {\n    return reinterpret_cast<void*>(-EINVAL);\n  }\n\n  // If FD is provided then offset must also be page aligned\n  if (fd != -1 && offset & ~FEXCore::Utils::FEX_PAGE_MASK) {\n    return reinterpret_cast<void*>(-EINVAL);\n  }\n\n  // 64bit address overflow\n  if (Addr + length < Addr) {\n    return reinterpret_cast<void*>(-EOVERFLOW);\n  }\n\n  bool Fixed = (flags & MAP_FIXED) || (flags & MAP_FIXED_NOREPLACE);\n  length = FEXCore::AlignUp(length, FEXCore::Utils::FEX_PAGE_SIZE);\n\n  uint64_t AddrEnd = Addr + length;\n  size_t NumberOfPages = length / FEXCore::Utils::FEX_PAGE_SIZE;\n\n  // This needs a mutex to be thread safe\n  auto lk = FEXCore::GuardSignalDeferringSectionWithFallback(AllocationMutex, TLSThread);\n\n  uint64_t AllocatedOffset {};\n  LiveVMARegion* LiveRegion {};\n\n  if (Fixed || Addr != 0) {\n    LiveRegion = FindLiveRegionForAddress(Addr, AddrEnd);\n  }\n\nagain:\n\n  struct RangeResult final {\n    LiveVMARegion* RegionInsertedInto;\n    void* Ptr;\n  };\n\n  auto CheckIfRangeFits = [&AllocatedOffset](LiveVMARegion* Region, uint64_t length, int prot, int flags, int fd, off_t offset,\n                                             uint64_t StartingPosition = 0) -> RangeResult {\n    uint64_t AllocatedPage {~0ULL};\n    uint64_t NumberOfPages = length >> FEXCore::Utils::FEX_PAGE_SHIFT;\n\n    if (Region->FreeSpace >= length) {\n      uint64_t LastAllocation =\n        StartingPosition ? (StartingPosition - Region->SlabInfo->Base) >> FEXCore::Utils::FEX_PAGE_SHIFT : Region->LastPageAllocation;\n      size_t RegionNumberOfPages = Region->SlabInfo->RegionSize >> FEXCore::Utils::FEX_PAGE_SHIFT;\n\n\n      if (Region->HadMunmap) {\n        // Backward scan\n        // We need to do a backward scan first to fill any holes\n        // Otherwise we will very quickly run out of VMA regions (65k maximum)\n        auto SearchResult = Region->UsedPages.BackwardScanForRange<true>(LastAllocation, NumberOfPages, Region->NumManagedPages);\n\n        AllocatedPage = SearchResult.FoundElement;\n\n        // If we didn't even have a one page free in the backward search, then unclaim HadMunmap.\n        // Switching over to default forward search.\n        if (SearchResult.FoundElement == ~0ULL && !SearchResult.FoundHole) {\n          Region->HadMunmap = false;\n        }\n      }\n\n      // Foward Scan\n      if (AllocatedPage == ~0ULL) {\n        auto SearchResult = Region->UsedPages.ForwardScanForRange<true>(LastAllocation, NumberOfPages, RegionNumberOfPages);\n        AllocatedPage = SearchResult.FoundElement;\n      }\n\n      if (AllocatedPage != ~0ULL) {\n        AllocatedOffset = Region->SlabInfo->Base + AllocatedPage * FEXCore::Utils::FEX_PAGE_SIZE;\n\n        // We need to setup protections for this\n        void* MMapResult = ::mmap(reinterpret_cast<void*>(AllocatedOffset), length, prot, (flags & ~MAP_FIXED_NOREPLACE) | MAP_FIXED, fd, offset);\n\n        if (MMapResult == MAP_FAILED) {\n          return RangeResult {Region, reinterpret_cast<void*>(-errno)};\n        }\n        return RangeResult {Region, MMapResult};\n      }\n    }\n\n    return {};\n  };\n\n  if (Fixed) {\n    // Found a region let's allocate to it\n    if (LiveRegion) {\n      // Found a slab that fits this\n      if (flags & MAP_FIXED_NOREPLACE) {\n        auto Fits = CheckIfRangeFits(LiveRegion, length, prot, flags, fd, offset, Addr);\n        if (Fits.RegionInsertedInto && Fits.Ptr == reinterpret_cast<void*>(Addr)) {\n          // We fit correctly\n          AllocatedOffset = Addr;\n        } else {\n          // Intersected with something that already existed\n          return reinterpret_cast<void*>(-EEXIST);\n        }\n      } else {\n        // We need to mmap the file to this location\n        void* MMapResult = ::mmap(reinterpret_cast<void*>(Addr), length, prot, (flags & ~MAP_FIXED_NOREPLACE) | MAP_FIXED, fd, offset);\n\n        if (MMapResult == MAP_FAILED) {\n          return reinterpret_cast<void*>(-errno);\n        }\n\n        AllocatedOffset = Addr;\n      }\n      // Fall through to live region tracking\n    }\n  } else {\n    // Check our active slabs to see if we can fit the allocation\n    // Slightly different than fixed since it doesn't need exact placement\n    if (LiveRegion && Addr != 0) {\n      // We found a LiveRegion that could hold this address. Let's try to place it\n      // Check if this area is free\n      auto Fits = CheckIfRangeFits(LiveRegion, length, prot, flags, fd, offset, Addr);\n      if (Fits.RegionInsertedInto && Fits.Ptr == reinterpret_cast<void*>(Addr)) {\n        // We fit correctly\n        AllocatedOffset = Addr;\n      } else {\n        // Couldn't fit\n        // We can continue past this point still\n        LiveRegion = nullptr;\n      }\n    }\n\n    if (!LiveRegion) {\n      for (auto it = LiveRegions->begin(); it != LiveRegions->end(); ++it) {\n        auto Fits = CheckIfRangeFits(*it, length, prot, flags, fd, offset);\n        if (Fits.RegionInsertedInto && Fits.Ptr == reinterpret_cast<void*>(AllocatedOffset)) {\n          // We fit correctly\n          LiveRegion = Fits.RegionInsertedInto;\n          break;\n        }\n\n        // Couldn't fit but mmap gave us an error\n        if (!Fits.RegionInsertedInto && Fits.Ptr) {\n          return Fits.Ptr;\n        }\n\n        // nullptr on both means no error and couldn't fit\n      }\n    }\n\n    if (!LiveRegion) {\n      // Couldn't find a fit in the live regions\n      // Allocate a new reserved region\n      size_t lengthOfLiveRegion = FEXCore::AlignUp(LiveVMARegion::GetFEXManagedVMARegionSize(length), FEXCore::Utils::FEX_PAGE_SIZE);\n      size_t lengthPlusManagedData = length + lengthOfLiveRegion;\n      for (auto it = ReservedRegions->begin(); it != ReservedRegions->end(); ++it) {\n        if ((*it)->RegionSize >= lengthPlusManagedData) {\n          MakeRegionActive(it, 0);\n          goto again;\n        }\n      }\n    }\n  }\n\n  if (LiveRegion) {\n    // Mark the pages as used\n    uintptr_t RegionBegin = LiveRegion->SlabInfo->Base;\n    uintptr_t MappedBegin = (AllocatedOffset - RegionBegin) >> FEXCore::Utils::FEX_PAGE_SHIFT;\n    size_t PagesSet {};\n\n    for (size_t i = 0; i < NumberOfPages; ++i) {\n      PagesSet += LiveRegion->UsedPages.TestAndSet(MappedBegin + i) == false;\n    }\n\n    // Change our last allocation region\n    LiveRegion->LastPageAllocation = MappedBegin + NumberOfPages;\n    LiveRegion->FreeSpace -= PagesSet * FEXCore::Utils::FEX_PAGE_SIZE;\n    LOGMAN_THROW_A_FMT(LiveRegion->FreeSpace <= LiveRegion->SlabInfo->RegionSize,\n                       \"Corrupt LiveRegion free space! 0x{:x} > 0x{:x}. After allocating 0x{:x} (0x{:x} overlapped)\", LiveRegion->FreeSpace,\n                       LiveRegion->SlabInfo->RegionSize, length, PagesSet);\n  }\n\n  if (!AllocatedOffset) {\n    AllocatedOffset = -ENOMEM;\n  }\n  return reinterpret_cast<void*>(AllocatedOffset);\n}\n\nint OSAllocator_64Bit::Munmap(void* addr, size_t length) {\n  if (addr < reinterpret_cast<void*>(LOWER_BOUND)) {\n    // If we are asked to allocate something outside of the 64-bit space\n    // Then we need to just hand this to the OS\n    return ::munmap(addr, length);\n  }\n\n  uint64_t Addr = reinterpret_cast<uint64_t>(addr);\n\n  if (Addr & ~FEXCore::Utils::FEX_PAGE_MASK) {\n    return -EINVAL;\n  }\n\n  if (length & ~FEXCore::Utils::FEX_PAGE_MASK) {\n    return -EINVAL;\n  }\n\n  if (Addr + length < Addr) {\n    return -EOVERFLOW;\n  }\n\n  // This needs a mutex to be thread safe\n  auto lk = FEXCore::GuardSignalDeferringSectionWithFallback(AllocationMutex, TLSThread);\n\n  length = FEXCore::AlignUp(length, FEXCore::Utils::FEX_PAGE_SIZE);\n\n  uintptr_t PtrBegin = reinterpret_cast<uintptr_t>(addr);\n  uintptr_t PtrEnd = PtrBegin + length;\n  // Walk all of the live ranges and find this slab then delete it\n  for (auto it = LiveRegions->begin(); it != LiveRegions->end(); ++it) {\n    uintptr_t RegionBegin = (*it)->SlabInfo->Base;\n    uintptr_t RegionEnd = RegionBegin + (*it)->SlabInfo->RegionSize;\n\n    if (RegionBegin <= PtrBegin && RegionEnd > PtrEnd) {\n      // Live region fully encompasses slab range\n\n      uint64_t FreedPages {};\n      uint32_t SlabPageBegin = (PtrBegin - RegionBegin) >> FEXCore::Utils::FEX_PAGE_SHIFT;\n      uint64_t PagesToFree = length >> FEXCore::Utils::FEX_PAGE_SHIFT;\n\n      for (size_t i = 0; i < PagesToFree; ++i) {\n        FreedPages += (*it)->UsedPages.TestAndClear(SlabPageBegin + i) ? 1 : 0;\n      }\n\n      if (FreedPages != 0) {\n        // If we were contiuous freeing then make sure to give back the physical address space\n        // If the region was locked then madvise won't remove the physical backing\n        // This woul be a bug in the frontend application\n        // So be careful with mlock/munlock\n        ::madvise(addr, length, MADV_DONTNEED);\n        ::mmap(addr, length, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);\n      }\n\n      (*it)->FreeSpace += FreedPages * FEXCore::Utils::FEX_PAGE_SIZE;\n\n      // Set the last allocated page to the minimum of last page allocation or this slab\n      // This will let us more quickly fill holes\n      (*it)->LastPageAllocation = std::min((*it)->LastPageAllocation, SlabPageBegin);\n\n      (*it)->HadMunmap = true;\n\n      // XXX: Move region back to reserved list\n      return 0;\n    }\n  }\n\n  // If it didn't match at all then no error\n  return 0;\n}\n\nvoid OSAllocator_64Bit::AllocateMemoryRegions(fextl::vector<FEXCore::Allocator::MemoryRegion>& Ranges) {\n  // Need to allocate the ObjectAlloc up front. Find a region that is larger than our minimum size first.\n  const size_t ObjectAllocSize = 64 * 1024 * 1024;\n\n  for (auto& it : Ranges) {\n    if (ObjectAllocSize > it.Size) {\n      continue;\n    }\n\n    // Allocate up to 64 MiB the first allocation for an intrusive allocator\n    mprotect(it.Ptr, ObjectAllocSize, PROT_READ | PROT_WRITE);\n\n    // This enables the kernel to use transparent large pages in the allocator which can reduce memory pressure\n    ::madvise(it.Ptr, ObjectAllocSize, MADV_HUGEPAGE);\n\n    FEXCore::Allocator::VirtualName(\"FEXMem_Misc\", reinterpret_cast<void*>(it.Ptr), ObjectAllocSize);\n\n    ObjectAlloc = new (it.Ptr) Alloc::ForwardOnlyIntrusiveArenaAllocator(it.Ptr, ObjectAllocSize);\n    ReservedRegions = ObjectAlloc->new_construct(ReservedRegions, ObjectAlloc);\n    LiveRegions = ObjectAlloc->new_construct(LiveRegions, ObjectAlloc);\n\n    if (it.Size >= ObjectAllocSize) {\n      // Modify region size\n      it.Size -= ObjectAllocSize;\n      (uint8_t*&)it.Ptr += ObjectAllocSize;\n    }\n\n    break;\n  }\n\n  if (!ObjectAlloc) {\n    ERROR_AND_DIE_FMT(\"Couldn't allocate object allocator!\");\n  }\n\n  for (auto [Ptr, AllocationSize] : Ranges) {\n    // Skip using any regions that are <= two pages. FEX's VMA allocator requires two pages\n    // for tracking data. So three pages are minimum for a single page VMA allocation.\n    if (AllocationSize <= (FEXCore::Utils::FEX_PAGE_SIZE * 2)) {\n      continue;\n    }\n\n    ReservedVMARegion* Region = ObjectAlloc->new_construct<ReservedVMARegion>();\n    Region->Base = reinterpret_cast<uint64_t>(Ptr);\n    Region->RegionSize = AllocationSize;\n    ReservedRegions->emplace_back(Region);\n  }\n}\n\n\nOSAllocator_64Bit::OSAllocator_64Bit() {\n  DetermineVASize();\n\n  auto Ranges = FEXCore::Allocator::StealMemoryRegion(LOWER_BOUND, UPPER_BOUND);\n\n  AllocateMemoryRegions(Ranges);\n}\n\nOSAllocator_64Bit::OSAllocator_64Bit(fextl::vector<FEXCore::Allocator::MemoryRegion>& Regions) {\n  AllocateMemoryRegions(Regions);\n}\n\nOSAllocator_64Bit::~OSAllocator_64Bit() {\n  // This needs a mutex to be thread safe\n  auto lk = FEXCore::GuardSignalDeferringSectionWithFallback(AllocationMutex, TLSThread);\n\n  // Walk the pages and deallocate\n  // First walk the live regions\n  for (auto it = LiveRegions->begin(); it != LiveRegions->end(); ++it) {\n    ::munmap(reinterpret_cast<void*>((*it)->SlabInfo->Base), (*it)->SlabInfo->RegionSize);\n  }\n\n  // Now walk the reserved regions\n  for (auto it = ReservedRegions->begin(); it != ReservedRegions->end(); ++it) {\n    ::munmap(reinterpret_cast<void*>((*it)->Base), (*it)->RegionSize);\n  }\n}\n\nfextl::unique_ptr<Alloc::HostAllocator> Create64BitAllocator() {\n  return fextl::make_unique<OSAllocator_64Bit>();\n}\n\ntemplate<class T>\nstruct alloc_delete : public std::default_delete<T> {\n  void operator()(T* ptr) const {\n    if (ptr) {\n      const auto size = sizeof(T);\n      const auto MinPage = FEXCore::AlignUp(size, FEXCore::Utils::FEX_PAGE_SIZE);\n\n      std::destroy_at(ptr);\n      ::munmap(ptr, MinPage);\n    }\n  }\n\n  template<typename U>\n  requires (std::is_base_of_v<U, T>)\n  operator fextl::default_delete<U>() {\n    return fextl::default_delete<U>();\n  }\n};\n\ntemplate<class T, class... Args>\nrequires (!std::is_array_v<T>)\nfextl::unique_ptr<T> make_alloc_unique(FEXCore::Allocator::MemoryRegion& Base, Args&&... args) {\n  const auto size = sizeof(T);\n  const auto MinPage = FEXCore::AlignUp(size, FEXCore::Utils::FEX_PAGE_SIZE);\n  if (Base.Size < size || MinPage != FEXCore::Utils::FEX_PAGE_SIZE) {\n    ERROR_AND_DIE_FMT(\"Couldn't fit allocator in to page!\");\n  }\n\n  auto ptr = ::mmap(Base.Ptr, MinPage, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);\n  if (ptr == MAP_FAILED) {\n    ERROR_AND_DIE_FMT(\"Couldn't allocate memory region\");\n  }\n\n  FEXCore::Allocator::VirtualName(\"FEXMem_Misc\", reinterpret_cast<void*>(ptr), MinPage);\n\n  // Remove the page from the base region.\n  // Could be zero after this.\n  Base.Size -= MinPage;\n  Base.Ptr = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(Base.Ptr) + MinPage);\n\n  auto Result = ::new (ptr) T(std::forward<Args>(args)...);\n  return fextl::unique_ptr<T, alloc_delete<T>>(Result);\n}\n\nfextl::unique_ptr<Alloc::HostAllocator> Create64BitAllocatorWithRegions(fextl::vector<FEXCore::Allocator::MemoryRegion>& Regions) {\n  // This is a bit tricky as we can't allocate memory safely except from the Regions provided. Otherwise we might overwrite memory pages we\n  // don't own. Scan the memory regions and find the smallest one.\n  FEXCore::Allocator::MemoryRegion& Smallest = Regions[0];\n  for (auto& it : Regions) {\n    if (it.Size <= Smallest.Size) {\n      Smallest = it;\n    }\n  }\n\n  return make_alloc_unique<OSAllocator_64Bit>(Smallest, Regions);\n}\n\n} // namespace Alloc::OSAllocator\n\nnamespace FEXCore::Allocator {\nvoid RegisterTLSData(FEXCore::Core::InternalThreadState* Thread) {\n  Alloc::OSAllocator::TLSThread = Thread;\n}\n\nvoid UninstallTLSData(FEXCore::Core::InternalThreadState* Thread) {\n  Alloc::OSAllocator::TLSThread = nullptr;\n}\n} // namespace FEXCore::Allocator\n"
  },
  {
    "path": "FEXCore/Source/Utils/Allocator/FlexBitSet.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/LogManager.h>\n\n#include <cstddef>\n#include <cstdint>\n#include <cstring>\n#include <type_traits>\n\nnamespace FEXCore {\n\ntemplate<typename T>\nstruct FlexBitSet final {\n  using ElementType = T;\n  constexpr static size_t MinimumSize = sizeof(ElementType);\n  constexpr static size_t MinimumSizeBits = sizeof(ElementType) * 8;\n\n  T Memory[];\n\n  bool Get(size_t Element) const {\n    return (Memory[Element / MinimumSizeBits] & (1ULL << (Element % MinimumSizeBits))) != 0;\n  }\n  bool TestAndClear(size_t Element) {\n    bool Value = Get(Element);\n    Memory[Element / MinimumSizeBits] &= ~(1ULL << (Element % MinimumSizeBits));\n    return Value;\n  }\n  bool TestAndSet(size_t Element) {\n    bool Value = Get(Element);\n    Memory[Element / MinimumSizeBits] |= (1ULL << (Element % MinimumSizeBits));\n    return Value;\n  }\n  void Set(size_t Element) {\n    Memory[Element / MinimumSizeBits] |= (1ULL << (Element % MinimumSizeBits));\n  }\n  void Clear(size_t Element) {\n    Memory[Element / MinimumSizeBits] &= ~(1ULL << (Element % MinimumSizeBits));\n  }\n  void MemClear(size_t Elements) {\n    memset(Memory, 0, FEXCore::AlignUp(Elements / MinimumSizeBits, MinimumSizeBits));\n  }\n  void MemSet(size_t Elements) {\n    memset(Memory, 0xFF, FEXCore::AlignUp(Elements / MinimumSizeBits, MinimumSizeBits));\n  }\n\n  // Range scanning results\n  struct BitsetScanResults {\n    // Which element was found. ~0ULL if not found.\n    size_t FoundElement;\n    // During the scan, found a hole in the allocations that didn't fit.\n    bool FoundHole;\n  };\n\n  // TODO: Make {Forward,Backward}ScanForRange faster\n  // Currently these functions test a single bit at a time, which is fairly costly.\n  // The compiler emits a full element load per iteration, wasting a bunch of time on loads.\n  // If we change these functions to have a pre-amble and post-amble to align the primary loop to the element size then this can go\n  // significantly faster.\n  //\n  // Once the element scanning is aligned to the element size, we can then use native count leading zero(CLZ) and count trailing zero(CTZ)\n  // instructions on a full element to scan uint64_t elements per loop iteration.\n\n  // Implementation details:\n  // Template argument WantUnset\n  // Used to determine if the desired range is for set or unset ranges.\n  // Typically `WantUnset` should be true. Used for finding a unset range inside of a range will set elements.\n  //\n  // @param BeginningElement - The first element in the set to start scanning from.\n  // @param ElementCount - How many elements to find a range for fitting.\n  // @param MinimumElement - Minimum element in the set to search to\n  //\n  // @return The scan results\n  template<bool WantUnset>\n  BitsetScanResults BackwardScanForRange(size_t BeginningElement, size_t ElementCount, size_t MinimumElement) {\n    bool FoundHole {};\n\n    // Final element to iterate to.\n    const size_t FinalElement = MinimumElement + ElementCount - 1;\n\n    for (size_t CurrentPage = BeginningElement; CurrentPage >= FinalElement;) {\n      size_t Remaining = ElementCount;\n      LOGMAN_THROW_A_FMT(CurrentPage <= BeginningElement && CurrentPage >= FinalElement, \"BackwardScanForRange: Scanning less than \"\n                                                                                         \"available range\");\n\n      while (Remaining) {\n        if (this->Get(CurrentPage - Remaining + 1) == WantUnset) {\n          // Has an intersecting range\n          break;\n        }\n        --Remaining;\n      }\n\n      if (Remaining) {\n        // If we found at least one Element hole then track that\n        if (Remaining != ElementCount) {\n          FoundHole = true;\n        }\n\n        // Didn't find a slab range\n        CurrentPage -= Remaining;\n      } else {\n        // We have a slab range\n        return BitsetScanResults {CurrentPage - ElementCount + 1, FoundHole};\n      }\n    }\n\n    return BitsetScanResults {~0ULL, FoundHole};\n  }\n\n  // @param BeginningElement - The first element in the set to start scanning from.\n  // @param ElementCount - How many elements to find a range for fitting.\n  // @param ElementsInSet - How many elements are in the full set.\n  //\n  // @return The scan results\n  template<bool WantUnset>\n  BitsetScanResults ForwardScanForRange(size_t BeginningElement, size_t ElementCount, size_t ElementsInSet) {\n    bool FoundHole {};\n\n    // Final element to iterate to.\n    const size_t FinalElement = ElementsInSet - ElementCount + 1;\n\n    for (size_t CurrentElement = BeginningElement; CurrentElement <= FinalElement;) {\n      // If we have enough free space, check if we have enough free pages that are contiguous\n      size_t Remaining = ElementCount;\n\n      LOGMAN_THROW_A_FMT(CurrentElement >= BeginningElement && CurrentElement <= FinalElement, \"ForwardScanForRange: Scanning less than \"\n                                                                                               \"available range\");\n\n      while (Remaining) {\n        if (this->Get(CurrentElement + Remaining - 1) == WantUnset) {\n          // Has an intersecting range\n          break;\n        }\n        --Remaining;\n      }\n\n      if (Remaining) {\n        // If we found at least one Element hole then track that\n        if (Remaining != ElementCount) {\n          FoundHole = true;\n        }\n\n        // Didn't find a slab range\n        CurrentElement += Remaining;\n      } else {\n        // We have a slab range\n        return BitsetScanResults {CurrentElement, FoundHole};\n      }\n    }\n\n    return BitsetScanResults {~0ULL, FoundHole};\n  }\n\n  // This very explicitly doesn't let you take an address\n  // Is only a getter\n  bool operator[](size_t Element) const {\n    return Get(Element);\n  }\n\n  // Returns the number of bits required to hold the number of elements.\n  // Just rounds up to the MinimumSizeInBits.\n  constexpr static size_t SizeInBits(uint64_t Elements) {\n    return FEXCore::AlignUp(Elements, MinimumSizeBits);\n  }\n  // Returns the number of bytes required to hold the number of elements.\n  constexpr static size_t SizeInBytes(uint64_t Elements) {\n    return SizeInBits(Elements) / 8;\n  }\n};\n\nstatic_assert(sizeof(FlexBitSet<uint64_t>) == 0, \"This needs to be a flex member\");\nstatic_assert(std::is_trivially_copyable_v<FlexBitSet<uint64_t>>, \"Needs to be trivially copyable\");\n\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/Source/Utils/Allocator/HostAllocator.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <cstddef>\n#include <sys/types.h>\n\nnamespace FEXCore::Allocator {\nstruct MemoryRegion;\n}\nnamespace FEXCore::Core {\nstruct InternalThreadState;\n}\n\nnamespace Alloc {\n// HostAllocator is just a page pased slab allocator\n// Similar to mmap and munmap only mapping at the page level\nclass HostAllocator {\npublic:\n  HostAllocator() = default;\n  virtual ~HostAllocator() = default;\n  virtual void* AllocateSlab(size_t Size) = 0;\n  virtual void DeallocateSlab(void* Ptr, size_t Size) = 0;\n\n  virtual void* Mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset) {\n    return nullptr;\n  }\n  virtual int Munmap(void* addr, size_t length) {\n    return -1;\n  }\n\n  virtual void LockBeforeFork(FEXCore::Core::InternalThreadState* Thread) {}\n  virtual void UnlockAfterFork(FEXCore::Core::InternalThreadState* Thread, bool Child) {}\n};\n\nclass GlobalAllocator {\npublic:\n  HostAllocator* Alloc {};\n  GlobalAllocator(HostAllocator* _Alloc)\n    : Alloc {_Alloc} {}\n\n  virtual ~GlobalAllocator() = default;\n  virtual void* malloc(size_t Size) = 0;\n  virtual void* calloc(size_t num, size_t size) = 0;\n  virtual void* realloc(void* ptr, size_t size) = 0;\n  virtual void* memalign(size_t alignment, size_t size) = 0;\n  virtual void free(void* ptr) = 0;\n};\n} // namespace Alloc\n\nnamespace Alloc::OSAllocator {\nfextl::unique_ptr<Alloc::HostAllocator> Create64BitAllocator();\nfextl::unique_ptr<Alloc::HostAllocator> Create64BitAllocatorWithRegions(fextl::vector<FEXCore::Allocator::MemoryRegion>& Regions);\nstatic inline void ReleaseAllocatorWorkaround(fextl::unique_ptr<Alloc::HostAllocator> Allocator) {\n  // XXX: This is currently a leak.\n  // We can't work around this yet until static initializers that allocate memory are completely removed from our codebase\n  // The allocator is also intrusively allocated, so the unique_ptr tries to double free the HostAllocator object.\n  // Luckily we only remove this on process shutdown, so the kernel will do the cleanup for us\n  Allocator.release();\n}\n\n} // namespace Alloc::OSAllocator\n"
  },
  {
    "path": "FEXCore/Source/Utils/Allocator/IntrusiveArenaAllocator.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"FlexBitSet.h\"\n#include \"HostAllocator.h\"\n\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/TypeDefines.h>\n\n#include <bitset>\n#include <cstddef>\n#include <memory_resource>\nnamespace fex_pmr = std::pmr;\n#include <sys/user.h>\n\n#include <mutex>\n\nnamespace Alloc {\nclass ForwardOnlyIntrusiveArenaAllocator final : public fex_pmr::memory_resource {\npublic:\n  ForwardOnlyIntrusiveArenaAllocator(void* Ptr, size_t _Size)\n    : Begin {reinterpret_cast<uintptr_t>(Ptr)}\n    , Size {_Size} {\n    LastAllocation = sizeof(ForwardOnlyIntrusiveArenaAllocator);\n  }\n\n  ~ForwardOnlyIntrusiveArenaAllocator() = default;\n\n  template<class U, class... Args>\n  U* new_construct(Args&&... args) {\n    void* Ptr = do_allocate(sizeof(U), alignof(U));\n    return new (Ptr) U(args...);\n  }\n\n  template<class U, class... Args>\n  U* new_construct(U* Class, Args&&... args) {\n    void* Ptr = do_allocate(sizeof(U), alignof(U));\n    return new (Ptr) U(args...);\n  }\n\n  size_t AmountAllocated() const {\n    return LastAllocation;\n  }\n\nprivate:\n  void* do_allocate(std::size_t bytes, std::size_t alignment) override {\n    size_t PreviousAligned = FEXCore::AlignUp(LastAllocation, alignment);\n    size_t NewOffset = PreviousAligned + bytes;\n\n    if (NewOffset > Size) {\n      return nullptr;\n    }\n\n    LastAllocation = NewOffset;\n\n    return reinterpret_cast<void*>(Begin + PreviousAligned);\n  }\n\n  void do_deallocate(void*, std::size_t, std::size_t) override {\n    // Do nothing\n  }\n\n  bool do_is_equal(const fex_pmr::memory_resource& other) const noexcept override {\n    // Only if the allocator pointers are the same are they equal\n    if (this == &other) {\n      return true;\n    }\n    // We don't share state with another allocator so we can't share anything\n    return false;\n  }\n\n  uintptr_t Begin;\n  size_t Size;\n  size_t LastAllocation {};\n};\n\nclass IntrusiveArenaAllocator final : public fex_pmr::memory_resource {\npublic:\n  IntrusiveArenaAllocator(void* Ptr, size_t _Size)\n    : Begin {reinterpret_cast<uintptr_t>(Ptr)}\n    , Size {_Size} {\n    uint64_t NumberOfPages = _Size / FEXCore::Utils::FEX_PAGE_SIZE;\n    uint64_t UsedBits =\n      FEXCore::AlignUp(sizeof(IntrusiveArenaAllocator) + Size / FEXCore::Utils::FEX_PAGE_SIZE / 8, FEXCore::Utils::FEX_PAGE_SIZE);\n    for (size_t i = 0; i < UsedBits; ++i) {\n      UsedPages.Set(i);\n    }\n\n    FreePages = NumberOfPages - UsedBits;\n  }\n\n  template<class U, class... Args>\n  U* new_construct(Args&&... args) {\n    void* Ptr = do_allocate(sizeof(U), alignof(U));\n    return new (Ptr) U(args...);\n  }\n\n  template<class U, class... Args>\n  U* new_construct(U* Class, Args&&... args) {\n    void* Ptr = do_allocate(sizeof(U), alignof(U));\n    return new (Ptr) U(args...);\n  }\n\n  uintptr_t GetSlabBase() const {\n    return Begin;\n  }\n  uint64_t GetSlabSize() const {\n    return Size;\n  }\n  uint64_t GetFreePages() const {\n    return FreePages;\n  }\n\nprivate:\n  void* do_allocate(std::size_t bytes, std::size_t alignment) override {\n    std::scoped_lock<std::mutex> lk {AllocationMutex};\n\n    size_t NumberPages = FEXCore::AlignUp(bytes, FEXCore::Utils::FEX_PAGE_SIZE) / FEXCore::Utils::FEX_PAGE_SIZE;\n\n    uintptr_t AllocatedOffset {};\n\ntry_again:\n    for (uintptr_t CurrentPage = LastAllocatedPageOffset; CurrentPage <= (Size - NumberPages);) {\n      size_t Remaining = NumberPages;\n\n      while (Remaining) {\n        if (UsedPages[CurrentPage + Remaining - 1]) {\n          // Has an intersecting range\n          break;\n        }\n        --Remaining;\n      }\n\n      if (Remaining) {\n        // Didn't find an allocation range\n        CurrentPage += Remaining;\n      } else {\n        // We have a range to allocate\n        AllocatedOffset = CurrentPage;\n        break;\n      }\n    }\n\n    if (!AllocatedOffset && LastAllocatedPageOffset != 0) {\n      // Try again but starting from the beginning\n      LastAllocatedPageOffset = 0;\n      // Using goto so we don't have recursive mutex shenanigans\n      goto try_again;\n    }\n\n    // Allocated offset must be valid or zero at this point\n    if (AllocatedOffset) {\n      // Map the range as no longer available\n      for (size_t i = 0; i < NumberPages; ++i) {\n        UsedPages.Set(AllocatedOffset + i);\n      }\n\n      LastAllocatedPageOffset = AllocatedOffset + NumberPages;\n\n      // Now convert this base page to a pointer and return it\n      return reinterpret_cast<void*>(Begin + AllocatedOffset * FEXCore::Utils::FEX_PAGE_SIZE);\n    }\n\n    return nullptr;\n  }\n\n  void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) override {\n    std::scoped_lock<std::mutex> lk {AllocationMutex};\n\n    uintptr_t PageOffset = (reinterpret_cast<uintptr_t>(p) - Begin) / FEXCore::Utils::FEX_PAGE_SIZE;\n    size_t NumPages = FEXCore::AlignUp(bytes, FEXCore::Utils::FEX_PAGE_SIZE) / FEXCore::Utils::FEX_PAGE_SIZE;\n\n    // Walk the allocation list and deallocate\n    uint64_t FreedPages {};\n    for (size_t i = 0; i < NumPages; ++i) {\n      FreedPages += UsedPages.TestAndClear(PageOffset + i) ? 1 : 0;\n    }\n    FreePages += FreedPages;\n  }\n\n  bool do_is_equal(const fex_pmr::memory_resource& other) const noexcept override {\n    // Only if the allocator pointers are the same are they equal\n    if (this == &other) {\n      return true;\n    }\n    // We don't share state with another allocator so we can't share anything\n    return false;\n  }\n\n  uintptr_t Begin;\n  size_t Size;\n  uint64_t FreePages {};\n  size_t LastAllocatedPageOffset {};\n  std::mutex AllocationMutex {};\n  // For up to 64GB regions this will require up to 2MB tracking\n  // Needs to be the last element\n  FEXCore::FlexBitSet<uint64_t> UsedPages;\n};\n} // namespace Alloc\n"
  },
  {
    "path": "FEXCore/Source/Utils/Allocator.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Utils/Allocator/HostAllocator.h\"\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/PrctlUtils.h>\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/memory_resource.h>\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <algorithm>\n#include <array>\n#include <cctype>\n#include <cerrno>\n#include <charconv>\n#include <cstddef>\n#include <cstdint>\n#include <cstdio>\n#include <fcntl.h>\n#ifndef _WIN32\n#include <sys/mman.h>\n#include <sys/user.h>\n#endif\n\nnamespace fextl::pmr {\nstatic fextl::pmr::default_resource FEXDefaultResource;\nstd::pmr::memory_resource* get_default_resource() {\n  return &FEXDefaultResource;\n}\n} // namespace fextl::pmr\n\n#ifndef _WIN32\nnamespace FEXCore::Allocator {\nMMAP_Hook mmap {::mmap};\nMUNMAP_Hook munmap {::munmap};\n\nuint64_t HostVASize {};\n\nusing GLIBC_MALLOC_Hook = void* (*)(size_t, const void* caller);\nusing GLIBC_REALLOC_Hook = void* (*)(void*, size_t, const void* caller);\nusing GLIBC_FREE_Hook = void (*)(void*, const void* caller);\n\nfextl::unique_ptr<Alloc::HostAllocator> Alloc64 {};\n\nvoid* FEX_mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset) {\n  void* Result = Alloc64->Mmap(addr, length, prot, flags, fd, offset);\n  if (Result >= (void*)-4096) {\n    errno = -(uint64_t)Result;\n    return (void*)-1;\n  }\n\n  if (flags & MAP_ANONYMOUS) {\n    VirtualName(\"FEXMem\", Result, length);\n  }\n  return Result;\n}\n\nvoid VirtualName(const char* Name, void* Ptr, size_t Size) {\n  static bool Supports {true};\n  if (Supports) {\n    auto Result = prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, Ptr, Size, Name);\n    if (Result == -1) {\n      // Disable any additional attempts.\n      Supports = false;\n    }\n  }\n}\n\nint FEX_munmap(void* addr, size_t length) {\n  int Result = Alloc64->Munmap(addr, length);\n\n  if (Result != 0) {\n    errno = -Result;\n    return -1;\n  }\n  return Result;\n}\n\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\n\nstatic void AssignHookOverrides(size_t PageSize) {\n  SetupAllocatorHooks(FEX_mmap, FEX_munmap);\n  FEXCore::Allocator::mmap = FEX_mmap;\n  FEXCore::Allocator::munmap = FEX_munmap;\n  InitializeAllocator(PageSize);\n}\n\nvoid SetupHooks(size_t PageSize) {\n  Alloc64 = Alloc::OSAllocator::Create64BitAllocator();\n  AssignHookOverrides(PageSize);\n}\n\nvoid ClearHooks() {\n  SetupAllocatorHooks(::mmap, ::munmap);\n  FEXCore::Allocator::mmap = ::mmap;\n  FEXCore::Allocator::munmap = ::munmap;\n\n  Alloc::OSAllocator::ReleaseAllocatorWorkaround(std::move(Alloc64));\n}\n#pragma GCC diagnostic pop\n\nFEX_DEFAULT_VISIBILITY size_t DetermineVASize() {\n  if (HostVASize) {\n    return HostVASize;\n  }\n\n  static constexpr std::array<uintptr_t, 7> TLBSizes = {\n    57, 52, 48, 47, 42, 39, 36,\n  };\n\n  for (auto Bits : TLBSizes) {\n    uintptr_t Size = 1ULL << Bits;\n    // Just try allocating\n    // We can't actually determine VA size on ARM safely\n    auto Find = [](uintptr_t Size) -> bool {\n      for (int i = 0; i < 64; ++i) {\n        // Try grabbing a some of the top pages of the range\n        // x86 allocates some high pages in the top end\n        void* Ptr = ::mmap(reinterpret_cast<void*>(Size - FEXCore::Utils::FEX_PAGE_SIZE * i), FEXCore::Utils::FEX_PAGE_SIZE, PROT_NONE,\n                           MAP_FIXED_NOREPLACE | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n        if (Ptr != (void*)~0ULL) {\n          ::munmap(Ptr, FEXCore::Utils::FEX_PAGE_SIZE);\n          if (Ptr == (void*)(Size - FEXCore::Utils::FEX_PAGE_SIZE * i)) {\n            return true;\n          }\n        }\n      }\n      return false;\n    };\n\n    if (Find(Size)) {\n      HostVASize = Bits;\n      return Bits;\n    }\n  }\n\n  LOGMAN_MSG_A_FMT(\"Couldn't determine host VA size\");\n  FEX_UNREACHABLE;\n}\n\n#define STEAL_LOG(...) // fprintf(stderr, __VA_ARGS__)\n\nfextl::vector<MemoryRegion> CollectMemoryGaps(uintptr_t Begin, uintptr_t End, int MapsFD) {\n  fextl::vector<MemoryRegion> Regions;\n\n  uintptr_t RegionEnd = 0;\n\n  char Buffer[2048];\n  const char* Cursor = Buffer;\n  ssize_t Remaining = 0;\n\n  bool EndOfFileReached = false;\n\n  while (true) {\n    const auto line_begin = Cursor;\n    auto line_end = std::find(line_begin, Cursor + Remaining, '\\n');\n\n    // Check if the buffered data covers the entire line.\n    // If not, try buffering more data.\n    if (line_end == Cursor + Remaining) {\n      if (EndOfFileReached) {\n        // No more data to buffer. Add remaining memory and return.\n        const auto MapBegin = std::max(RegionEnd, Begin);\n        STEAL_LOG(\"[%d] EndOfFile; MapBegin: %016lX MapEnd: %016lX\\n\", __LINE__, MapBegin, End);\n        if (End > MapBegin) {\n          Regions.push_back({(void*)MapBegin, End - MapBegin});\n        }\n\n        return Regions;\n      }\n\n      // Move pending content back to the beginning, then buffer more data.\n      std::copy(Cursor, Cursor + Remaining, std::begin(Buffer));\n      auto PendingBytes = Remaining;\n      do {\n        Remaining = read(MapsFD, Buffer + PendingBytes, sizeof(Buffer) - PendingBytes);\n      } while (Remaining == -1 && errno == EAGAIN);\n\n      if (Remaining < sizeof(Buffer) - PendingBytes) {\n        EndOfFileReached = true;\n      }\n\n      Remaining += PendingBytes;\n\n      Cursor = Buffer;\n      continue;\n    }\n\n    // Parse mapped region in the format \"fffff7cc3000-fffff7cc4000 r--p ...\"\n    {\n      uintptr_t RegionBegin {};\n      auto result = std::from_chars(Cursor, line_end, RegionBegin, 16);\n      LogMan::Throw::AFmt(result.ec == std::errc {} && *result.ptr == '-', \"Unexpected line format\");\n      Cursor = result.ptr + 1;\n\n      // Add gap between the previous region and the current one\n      const auto MapBegin = std::max(RegionEnd, Begin);\n      const auto MapEnd = std::min(RegionBegin, End);\n      if (MapEnd > MapBegin) {\n        Regions.push_back({(void*)MapBegin, MapEnd - MapBegin});\n      }\n\n      result = std::from_chars(Cursor, line_end, RegionEnd, 16);\n      LogMan::Throw::AFmt(result.ec == std::errc {} && *result.ptr == ' ', \"Unexpected line format\");\n      Cursor = result.ptr + 1;\n\n      STEAL_LOG(\"[%d] parsed line: RegionBegin=%016lX RegionEnd=%016lX\\n\", __LINE__, RegionBegin, RegionEnd);\n\n      if (RegionEnd >= End) {\n        // Early return if we are completely beyond the allocation space.\n        return Regions;\n      }\n    }\n\n    Remaining -= line_end + 1 - line_begin;\n    Cursor = line_end + 1;\n  }\n  FEX_UNREACHABLE;\n}\n\nfextl::vector<MemoryRegion> StealMemoryRegion(uintptr_t Begin, uintptr_t End) {\n  const uintptr_t StackLocation_u64 = reinterpret_cast<uintptr_t>(alloca(0));\n\n  const int MapsFD = open(\"/proc/self/maps\", O_RDONLY);\n  LogMan::Throw::AFmt(MapsFD != -1, \"Failed to open /proc/self/maps\");\n\n  auto Regions = CollectMemoryGaps(Begin, End, MapsFD);\n  close(MapsFD);\n\n  // If the memory bounds include the stack, blocking all memory regions will\n  // limit the stack size to the current value. To allow some stack growth,\n  // we don't block the memory gap directly below the stack memory but\n  // instead map it as readable+writable.\n  {\n    auto StackRegionIt = std::find_if(Regions.begin(), Regions.end(), [StackLocation_u64](auto& Region) {\n      return reinterpret_cast<uintptr_t>(Region.Ptr) + Region.Size > StackLocation_u64;\n    });\n\n    // If no gap crossing the stack pointer was found but the SP is within\n    // the given bounds, the stack mapping is right after the last gap.\n    bool IsStackMapping = StackRegionIt != Regions.end() || StackLocation_u64 <= End;\n\n    if (IsStackMapping && StackRegionIt != Regions.begin() &&\n        reinterpret_cast<uintptr_t>(std::prev(StackRegionIt)->Ptr) + std::prev(StackRegionIt)->Size <= End) {\n      // Allocate the region under the stack as READ | WRITE so the stack can still grow\n      --StackRegionIt;\n\n      auto Alloc =\n        ::mmap(StackRegionIt->Ptr, StackRegionIt->Size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE | MAP_FIXED, -1, 0);\n\n      LogMan::Throw::AFmt(Alloc != MAP_FAILED, \"StealMemoryRegion:Stack: mmap({}, {:x}) failed: {}\", fmt::ptr(StackRegionIt->Ptr),\n                          StackRegionIt->Size, errno);\n      LogMan::Throw::AFmt(Alloc == StackRegionIt->Ptr, \"mmap returned {} instead of {}\", Alloc, fmt::ptr(StackRegionIt->Ptr));\n\n      Regions.erase(StackRegionIt);\n    }\n  }\n\n  // Block remaining memory gaps\n  for (auto RegionIt = Regions.begin(); RegionIt != Regions.end(); ++RegionIt) {\n    auto Alloc = ::mmap(RegionIt->Ptr, RegionIt->Size, PROT_NONE, MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE | MAP_FIXED_NOREPLACE, -1, 0);\n\n    LogMan::Throw::AFmt(Alloc != MAP_FAILED, \"StealMemoryRegion: mmap({}, {:x}) failed: {}\", fmt::ptr(RegionIt->Ptr), RegionIt->Size, errno);\n    LogMan::Throw::AFmt(Alloc == RegionIt->Ptr, \"mmap returned {} instead of {}\", Alloc, fmt::ptr(RegionIt->Ptr));\n  }\n\n  return Regions;\n}\n\nfextl::vector<MemoryRegion> Setup48BitAllocatorIfExists(size_t PageSize) {\n  size_t Bits = FEXCore::Allocator::DetermineVASize();\n  if (Bits < 48) {\n    return {};\n  }\n\n  uintptr_t Begin48BitVA = 0x0'8000'0000'0000ULL;\n  uintptr_t End48BitVA = 0x1'0000'0000'0000ULL;\n  auto Regions = StealMemoryRegion(Begin48BitVA, End48BitVA);\n\n  Alloc64 = Alloc::OSAllocator::Create64BitAllocatorWithRegions(Regions);\n  AssignHookOverrides(PageSize);\n\n  return Regions;\n}\n\nvoid ReclaimMemoryRegion(const fextl::vector<MemoryRegion>& Regions) {\n  for (const auto& Region : Regions) {\n    ::munmap(Region.Ptr, Region.Size);\n  }\n}\n\nvoid LockBeforeFork(FEXCore::Core::InternalThreadState* Thread) {\n  if (Alloc64) {\n    Alloc64->LockBeforeFork(Thread);\n  }\n}\n\nvoid UnlockAfterFork(FEXCore::Core::InternalThreadState* Thread, bool Child) {\n  if (Alloc64) {\n    Alloc64->UnlockAfterFork(Thread, Child);\n  }\n}\n} // namespace FEXCore::Allocator\n#endif\n"
  },
  {
    "path": "FEXCore/Source/Utils/Allocator.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\nnamespace FEXCore::Core {\nstruct InternalThreadState;\n}\n\nnamespace FEXCore::Allocator {\nvoid LockBeforeFork(FEXCore::Core::InternalThreadState* Thread);\nvoid UnlockAfterFork(FEXCore::Core::InternalThreadState* Thread, bool Child);\n} // namespace FEXCore::Allocator\n"
  },
  {
    "path": "FEXCore/Source/Utils/AllocatorHooks.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#ifdef ENABLE_FEX_ALLOCATOR\n#include <rpmalloc/rpmalloc.h>\n#ifndef _WIN32\n#include <linux/prctl.h>\n#include <sys/prctl.h>\n#include <sys/mman.h>\n#else\n#define NTDDI_VERSION 0x0A000005\n#include <memoryapi.h>\n#endif\n#endif\n\n#include <cstdint>\n#include <malloc.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <unistd.h>\n\nnamespace FEXCore::Allocator {\nusing mmap_hook_type = void* (*)(void* addr, size_t length, int prot, int flags, int fd, off_t offset);\nusing munmap_hook_type = int (*)(void* addr, size_t length);\n\n#ifdef ENABLE_FEX_ALLOCATOR\ntypedef void* (*rp_mmap_hook_type)(size_t size, size_t alignment, size_t* offset, size_t* mapped_size);\ntypedef void (*rp_munmap_hook_type)(void* address, size_t offset, size_t mapped_size);\nextern \"C\" rp_mmap_hook_type rp_mmap_hook;\nextern \"C\" rp_munmap_hook_type rp_munmap_hook;\n\n#ifndef _WIN32\nmmap_hook_type fex_mmap_hook = ::mmap;\nmunmap_hook_type fex_munmap_hook = ::munmap;\n#endif\n\n// Assume a 64KB page size until told otherwise.\nstatic rpmalloc_config_t global_config {\n  .page_size = 64 * 1024,\n  // THP causes crashes for some reason.\n  .enable_huge_pages = 0,\n  .disable_decommit = 0,\n  .page_name = \"FEXAllocator\",\n  .huge_page_name = \"FEXAllocator\",\n  .unmap_on_finalize = 0,\n};\n\nvoid* malloc(size_t size) {\n  return ::rpmalloc(size);\n}\nvoid* calloc(size_t n, size_t size) {\n  return ::rpcalloc(n, size);\n}\nvoid* memalign(size_t align, size_t s) {\n  return ::rpmemalign(align, s);\n}\nvoid* valloc(size_t size) {\n  return ::rpaligned_alloc(global_config.page_size, size);\n}\nint posix_memalign(void** r, size_t a, size_t s) {\n  void* ptr;\n  auto res = ::rpposix_memalign(&ptr, a, s);\n  *r = ptr;\n  return res;\n}\nvoid* realloc(void* ptr, size_t size) {\n  return ::rprealloc(ptr, size);\n}\nvoid free(void* ptr) {\n  return ::rpfree(ptr);\n}\nsize_t malloc_usable_size(void* ptr) {\n  return ::rpmalloc_usable_size(ptr);\n}\nvoid* aligned_alloc(size_t a, size_t s) {\n  return ::rpaligned_alloc(a, s);\n}\nvoid aligned_free(void* ptr) {\n  return ::rpfree(ptr);\n}\n\nvoid InitializeThread() {\n  rpmalloc_thread_initialize();\n}\n\n#ifndef _WIN32\n[[nodiscard]]\nconstexpr uint64_t AlignUp(uint64_t value, uint64_t size) {\n  return value + (size - value % size) % size;\n}\n\nstatic void* FEX_rp_mmap(size_t size, size_t alignment, size_t* offset, size_t* mapped_size) {\n#define pointer_offset(ptr, ofs) (void*)((char*)(ptr) + (ptrdiff_t)(ofs))\n  // If the alignment is less than the operating page size then alignment is guaranteed. Just remove it.\n  if (alignment < global_config.page_size) {\n    alignment = 0;\n  }\n\n  size_t map_size = AlignUp(size + alignment, global_config.page_size);\n  auto ptr = fex_mmap_hook(0, map_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);\n\n  if (ptr == MAP_FAILED) {\n    ptr = nullptr;\n  } else {\n#ifndef PR_SET_VMA\n#define PR_SET_VMA 0x53564d41\n#endif\n\n#ifndef PR_SET_VMA_ANON_NAME\n#define PR_SET_VMA_ANON_NAME 0\n#endif\n    prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, ptr, map_size, global_config.page_name);\n\n    // Disable HUGEPAGE on allocation from rpmalloc.\n    madvise(ptr, map_size, MADV_NOHUGEPAGE);\n  }\n\n  if (ptr == nullptr) {\n    fprintf(stderr, \"Failed to map VMA region.\");\n    return nullptr;\n  }\n\n  if (alignment) {\n    size_t padding = ((uintptr_t)ptr & (uintptr_t)(alignment - 1));\n    if (padding) {\n      padding = alignment - padding;\n    }\n    ptr = pointer_offset(ptr, padding);\n    *offset = padding;\n  }\n  *mapped_size = map_size;\n  return ptr;\n}\n\nstatic void FEX_rp_memory_commit(void* address, size_t size) {\n  // NOP-implementation.\n}\n\nstatic void FEX_rp_memory_decommit(void* address, size_t size) {\n  if (global_config.disable_decommit) {\n    return;\n  }\n\n  if (madvise(address, size, MADV_DONTNEED)) {\n    fprintf(stderr, \"Failed to decommit VMA region.\");\n  }\n}\n\nstatic void FEX_rp_memory_unmap(void* address, size_t offset, size_t mapped_size) {\n  address = pointer_offset(address, -(int32_t)offset);\n  int Result = fex_munmap_hook(address, mapped_size);\n  if (Result == -1) {\n    fprintf(stderr, \"Failed to unmap VMA region.\");\n  }\n#undef pointer_offset\n}\n\nvoid SetupAllocatorHooks(mmap_hook_type MMapHook, munmap_hook_type MunmapHook) {\n  fex_mmap_hook = MMapHook;\n  fex_munmap_hook = MunmapHook;\n}\n\nstatic rpmalloc_interface_t global_interface {\n  .memory_map = FEX_rp_mmap,\n  .memory_commit = FEX_rp_memory_commit,\n  .memory_decommit = FEX_rp_memory_decommit,\n  .memory_unmap = FEX_rp_memory_unmap,\n  .map_fail_callback = nullptr,\n  .error_callback = nullptr,\n};\n\nvoid InitializeAllocator(size_t PageSize) {\n  global_config.page_size = PageSize;\n  rpmalloc_initialize_config(&global_interface, &global_config);\n  rp_mmap_hook = FEX_rp_mmap;\n  rp_munmap_hook = FEX_rp_memory_unmap;\n}\n#endif\n\n#elif defined(_WIN32)\n#error \"Tried building _WIN32 without jemalloc\"\n\n#else\nvoid InitializeThread() {}\n\nvoid* malloc(size_t size) {\n  return ::malloc(size);\n}\nvoid* calloc(size_t n, size_t size) {\n  return ::calloc(n, size);\n}\nvoid* memalign(size_t align, size_t s) {\n  return ::memalign(align, s);\n}\nvoid* valloc(size_t size) {\n  return ::valloc(size);\n}\nint posix_memalign(void** r, size_t a, size_t s) {\n  return ::posix_memalign(r, a, s);\n}\nvoid* realloc(void* ptr, size_t size) {\n  return ::realloc(ptr, size);\n}\nvoid free(void* ptr) {\n  return ::free(ptr);\n}\nsize_t malloc_usable_size(void* ptr) {\n  return ::malloc_usable_size(ptr);\n}\nvoid* aligned_alloc(size_t a, size_t s) {\n  return ::aligned_alloc(a, s);\n}\nvoid aligned_free(void* ptr) {\n  return ::free(ptr);\n}\n\nvoid SetupAllocatorHooks(mmap_hook_type MMapHook, munmap_hook_type MunmapHook) {}\n\nvoid InitializeAllocator(size_t PageSize) {}\n\n#endif\n} // namespace FEXCore::Allocator\n"
  },
  {
    "path": "FEXCore/Source/Utils/AllocatorOverride.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/LogManager.h>\n\n#include <fmt/format.h>\n\n#include <cstddef>\n#include <cstdint>\n#include <sstream>\n#include <unistd.h>\n\nextern \"C\" {\n// The majority of FEX internal code should avoid using the glibc allocator. To ensure glibc allocations don't accidentally slip\n// in, FEX overrides these glibc functions with faulting variants.\n//\n// A notable exception is thunks, which should still use glibc allocations and avoid using `fextl::` namespace.\n//\n// Other minor exceptions throughout FEX use the `YesIKnowImNotSupposedToUseTheGlibcAllocator` helper to temporarily disable faulting.\n#define GLIBC_ALIAS_FUNCTION(func) __attribute__((alias(#func), visibility(\"default\")))\nextern void* __libc_calloc(size_t, size_t);\nvoid* calloc(size_t, size_t) GLIBC_ALIAS_FUNCTION(fault_calloc);\n\nextern void __libc_free(void*);\nvoid free(void*) GLIBC_ALIAS_FUNCTION(fault_free);\n\nextern void* __libc_malloc(size_t);\nvoid* malloc(size_t) GLIBC_ALIAS_FUNCTION(fault_malloc);\n\nextern void* __libc_memalign(size_t, size_t);\nvoid* memalign(size_t, size_t) GLIBC_ALIAS_FUNCTION(fault_memalign);\n\nextern void* __libc_realloc(void*, size_t);\nvoid* realloc(void*, size_t) GLIBC_ALIAS_FUNCTION(fault_realloc);\n\nextern void* __libc_valloc(size_t);\nvoid* valloc(size_t) GLIBC_ALIAS_FUNCTION(fault_valloc);\n\nextern int __posix_memalign(void**, size_t, size_t);\nint posix_memalign(void**, size_t, size_t) GLIBC_ALIAS_FUNCTION(fault_posix_memalign);\n\nextern size_t __malloc_usable_size(void*);\nsize_t malloc_usable_size(void*) GLIBC_ALIAS_FUNCTION(fault_malloc_usable_size);\n\n// Reuse __libc_memalign\nvoid* aligned_alloc(size_t, size_t) GLIBC_ALIAS_FUNCTION(fault_aligned_alloc);\n}\n\nnamespace FEXCore::Allocator {\n// Enable or disable allocation faulting globally.\nstatic bool GlobalEvaluate {};\n\n// Enable or disable allocation faulting per-thread.\nstatic thread_local uint64_t SkipEvalForThread {};\n\n// Internal memory allocation hooks to allow non-faulting allocations through.\nauto calloc_ptr = __libc_calloc;\nauto free_ptr = __libc_free;\nauto malloc_ptr = __libc_malloc;\nauto memalign_ptr = __libc_memalign;\nauto realloc_ptr = __libc_realloc;\nauto valloc_ptr = __libc_valloc;\nauto posix_memalign_ptr = ::posix_memalign;\nauto malloc_usable_size_ptr = ::malloc_usable_size;\nauto aligned_alloc_ptr = __libc_memalign;\n\n// Constructor for per-thread allocation faulting check.\nYesIKnowImNotSupposedToUseTheGlibcAllocator::YesIKnowImNotSupposedToUseTheGlibcAllocator() {\n  ++SkipEvalForThread;\n}\n\n// Destructor for per-thread allocation faulting check.\nYesIKnowImNotSupposedToUseTheGlibcAllocator::~YesIKnowImNotSupposedToUseTheGlibcAllocator() {\n  --SkipEvalForThread;\n}\n\n// Hard disabling of per-thread allocation fault checking.\n// No coming back from this, used on thread destruction.\nFEX_DEFAULT_VISIBILITY void YesIKnowImNotSupposedToUseTheGlibcAllocator::HardDisable() {\n  // Just set it to half of its maximum value so it never wraps back around.\n  SkipEvalForThread = std::numeric_limits<decltype(SkipEvalForThread)>::max() / 2;\n}\n\n// Enable global fault checking.\nvoid SetupFaultEvaluate() {\n  GlobalEvaluate = true;\n}\n\n// Disable global fault checking.\nvoid ClearFaultEvaluate() {\n  GlobalEvaluate = false;\n}\n\n// Evaluate if a glibc hooked allocation should fault.\nvoid EvaluateReturnAddress(void* Return) {\n  if (!GlobalEvaluate) {\n    // Fault evaluation disabled globally.\n    return;\n  }\n\n  if (SkipEvalForThread) {\n    // Fault evaluation currently disabled for this thread.\n    return;\n  }\n\n  // We don't know where we are when allocating. Make sure to be safe and generate the string on the stack.\n  // Print an error message to let a developer know that an allocation faulted.\n  char Tmp[512];\n  auto Res = fmt::format_to_n(Tmp, 512, \"ERROR: Requested memory using non-FEX allocator at 0x{:x}\\n\", reinterpret_cast<uint64_t>(Return));\n  Tmp[Res.size] = 0;\n  write(STDERR_FILENO, Tmp, Res.size);\n\n  // Trap the execution to stop FEX in its tracks.\n  FEX_TRAP_EXECUTION;\n}\n} // namespace FEXCore::Allocator\n\nextern \"C\" {\n// These are the glibc allocator override symbols.\n// These will override the glibc allocators and then check if the allocation should fault.\nvoid* fault_calloc(size_t n, size_t size) {\n  FEXCore::Allocator::EvaluateReturnAddress(__builtin_extract_return_addr(__builtin_return_address(0)));\n  return FEXCore::Allocator::calloc_ptr(n, size);\n}\nvoid fault_free(void* ptr) {\n  FEXCore::Allocator::EvaluateReturnAddress(__builtin_extract_return_addr(__builtin_return_address(0)));\n  FEXCore::Allocator::free_ptr(ptr);\n}\nvoid* fault_malloc(size_t size) {\n  FEXCore::Allocator::EvaluateReturnAddress(__builtin_extract_return_addr(__builtin_return_address(0)));\n  return FEXCore::Allocator::malloc_ptr(size);\n}\nvoid* fault_memalign(size_t align, size_t s) {\n  FEXCore::Allocator::EvaluateReturnAddress(__builtin_extract_return_addr(__builtin_return_address(0)));\n  return FEXCore::Allocator::memalign_ptr(align, s);\n}\nvoid* fault_realloc(void* ptr, size_t size) {\n  FEXCore::Allocator::EvaluateReturnAddress(__builtin_extract_return_addr(__builtin_return_address(0)));\n  return FEXCore::Allocator::realloc_ptr(ptr, size);\n}\nvoid* fault_valloc(size_t size) {\n  FEXCore::Allocator::EvaluateReturnAddress(__builtin_extract_return_addr(__builtin_return_address(0)));\n  return FEXCore::Allocator::valloc_ptr(size);\n}\nint fault_posix_memalign(void** r, size_t a, size_t s) {\n  FEXCore::Allocator::EvaluateReturnAddress(__builtin_extract_return_addr(__builtin_return_address(0)));\n  return FEXCore::Allocator::posix_memalign_ptr(r, a, s);\n}\nsize_t fault_malloc_usable_size(void* ptr) {\n  FEXCore::Allocator::EvaluateReturnAddress(__builtin_extract_return_addr(__builtin_return_address(0)));\n  return FEXCore::Allocator::malloc_usable_size_ptr(ptr);\n}\nvoid* fault_aligned_alloc(size_t a, size_t s) {\n  FEXCore::Allocator::EvaluateReturnAddress(__builtin_extract_return_addr(__builtin_return_address(0)));\n  return FEXCore::Allocator::aligned_alloc_ptr(a, s);\n}\n}\n"
  },
  {
    "path": "FEXCore/Source/Utils/ArchHelpers/Arm64.cpp",
    "content": "// SPDX-License-Identifier: MIT\n\n#include \"Interface/Core/CPUBackend.h\"\n#include \"Interface/Context/Context.h\"\n#include \"Utils/SpinWaitLock.h\"\n\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/Utils/EnumUtils.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/Telemetry.h>\n#include <FEXCore/Utils/ArchHelpers/Arm64.h>\n\n#include <atomic>\n#include <cstdint>\n\nnamespace FEXCore::ArchHelpers::Arm64 {\nconstexpr uint32_t CASPAL_MASK = 0xBF'E0'FC'00;\nconstexpr uint32_t CASPAL_INST = 0x08'60'FC'00;\n\nconstexpr uint32_t CASAL_MASK = 0x3F'E0'FC'00;\nconstexpr uint32_t CASAL_INST = 0x08'E0'FC'00;\n\nconstexpr uint32_t ATOMIC_MEM_MASK = 0x3B200C00;\nconstexpr uint32_t ATOMIC_MEM_INST = 0x38200000;\n\nconstexpr uint32_t RCPC2_MASK = 0x3F'E0'0C'00;\nconstexpr uint32_t LDAPUR_INST = 0x19'40'00'00;\nconstexpr uint32_t STLUR_INST = 0x19'00'00'00;\n\nconstexpr uint32_t LDAXP_MASK = 0xBF'FF'80'00;\nconstexpr uint32_t LDAXP_INST = 0x88'7F'80'00;\n\nconstexpr uint32_t STLXP_MASK = 0xBF'E0'80'00;\nconstexpr uint32_t STLXP_INST = 0x88'20'80'00;\n\nconstexpr uint32_t LDAXR_MASK = 0x3F'FF'FC'00;\nconstexpr uint32_t LDAXR_INST = 0x08'5F'FC'00;\nconstexpr uint32_t LDAR_INST = 0x08'DF'FC'00;\nconstexpr uint32_t LDAPR_INST = 0x38'BF'C0'00;\nconstexpr uint32_t STLR_INST = 0x08'9F'FC'00;\n\nconstexpr uint32_t STLXR_MASK = 0x3F'E0'FC'00;\nconstexpr uint32_t STLXR_INST = 0x08'00'FC'00;\n\n// Load/store register (register offset) (Rm encoded as xzr)\nconstexpr uint32_t LDSTREGISTER_MASK = 0b0011'1111'1111'1111'1111'1100'0000'0000;\nconstexpr uint32_t LDR_INST = 0b0011'1000'0111'1111'0110'1000'0000'0000;\nconstexpr uint32_t STR_INST = 0b0011'1000'0011'1111'0110'1000'0000'0000;\n\nconstexpr uint32_t LDSTUNSCALED_MASK = 0b0011'1011'1110'0000'0000'1100'0000'0000;\nconstexpr uint32_t LDUR_INST = 0b0011'1000'0100'0000'0000'0000'0000'0000;\nconstexpr uint32_t STUR_INST = 0b0011'1000'0000'0000'0000'0000'0000'0000;\n\nconstexpr uint32_t LDSTP_MASK = 0b0011'1011'1000'0000'0000'0000'0000'0000;\nconstexpr uint32_t STP_INST = 0b0010'1001'0000'0000'0000'0000'0000'0000;\n\nconstexpr uint32_t CBNZ_MASK = 0x7F'00'00'00;\nconstexpr uint32_t CBNZ_INST = 0x35'00'00'00;\n\nconstexpr uint32_t ALU_OP_MASK = 0x7F'20'00'00;\nconstexpr uint32_t ADD_INST = 0x0B'00'00'00;\nconstexpr uint32_t SUB_INST = 0x4B'00'00'00;\nconstexpr uint32_t ADD_SHIFT_INST = 0x0B'20'00'00;\nconstexpr uint32_t SUB_SHIFT_INST = 0x4B'20'00'00;\nconstexpr uint32_t CMP_INST = 0x6B'00'00'00;\nconstexpr uint32_t CMP_SHIFT_INST = 0x6B'20'00'00;\nconstexpr uint32_t AND_INST = 0x0A'00'00'00;\nconstexpr uint32_t BIC_INST = 0x0A'20'00'00;\nconstexpr uint32_t OR_INST = 0x2A'00'00'00;\nconstexpr uint32_t ORN_INST = 0x2A'20'00'00;\nconstexpr uint32_t EOR_INST = 0x4A'00'00'00;\nconstexpr uint32_t EON_INST = 0x4A'20'00'00;\n\nconstexpr uint32_t CCMP_MASK = 0x7F'E0'0C'10;\nconstexpr uint32_t CCMP_INST = 0x7A'40'00'00;\n\nconstexpr uint32_t CLREX_MASK = 0xFF'FF'F0'FF;\nconstexpr uint32_t CLREX_INST = 0xD5'03'30'5F;\n\nenum ExclusiveAtomicPairType {\n  TYPE_SWAP,\n  TYPE_ADD,\n  TYPE_SUB,\n  TYPE_AND,\n  TYPE_BIC,\n  TYPE_OR,\n  TYPE_ORN,\n  TYPE_EOR,\n  TYPE_EON,\n  TYPE_NEG, // This is just a sub with zero. Need to know the differences\n};\n\n// Load ops are 4 bits\n// Acquire and release bits are independent on the instruction\nconstexpr uint32_t ATOMIC_ADD_OP = 0b0000;\nconstexpr uint32_t ATOMIC_CLR_OP = 0b0001;\nconstexpr uint32_t ATOMIC_EOR_OP = 0b0010;\nconstexpr uint32_t ATOMIC_SET_OP = 0b0011;\nconstexpr uint32_t ATOMIC_SWAP_OP = 0b1000;\n\nconstexpr uint32_t REGISTER_MASK = 0b11111;\nconstexpr uint32_t RD_OFFSET = 0;\nconstexpr uint32_t RN_OFFSET = 5;\nconstexpr uint32_t RM_OFFSET = 16;\n\nconstexpr uint32_t DMB = 0b1101'0101'0000'0011'0011'0000'1011'1111 | 0b1011'0000'0000; // Inner shareable all\n\nconstexpr uint32_t DMB_LD = 0b1101'0101'0000'0011'0011'0000'1011'1111 | 0b1101'0000'0000; // Inner shareable load\n\nstatic constexpr uint32_t GetRdReg(uint32_t Instr) {\n  return (Instr >> RD_OFFSET) & REGISTER_MASK;\n}\n\nstatic constexpr uint32_t GetRnReg(uint32_t Instr) {\n  return (Instr >> RN_OFFSET) & REGISTER_MASK;\n}\n\nstatic constexpr uint32_t GetRmReg(uint32_t Instr) {\n  return (Instr >> RM_OFFSET) & REGISTER_MASK;\n}\n\nstatic void ClearICache(void* Begin, std::size_t Length) {\n  __builtin___clear_cache(static_cast<char*>(Begin), static_cast<char*>(Begin) + Length);\n}\n\nstatic __uint128_t LoadAcquire128(uint64_t Addr) {\n  __uint128_t Result {};\n  uint64_t Lower;\n  uint64_t Upper;\n  // This specifically avoids using std::atomic<__uint128_t>\n  // std::atomic helper does a ldaxp + stxp pair that crashes when the page is only mapped readable\n  __asm volatile(\n    R\"(\n  ldaxp %[ResultLower], %[ResultUpper], [%[Addr]];\n  clrex;\n)\"\n    : [ResultLower] \"=r\"(Lower), [ResultUpper] \"=r\"(Upper)\n    : [Addr] \"r\"(Addr)\n    : \"memory\");\n  Result = Upper;\n  Result <<= 64;\n  Result |= Lower;\n  return Result;\n}\n\nstatic uint64_t LoadAcquire64(uint64_t Addr) {\n  auto Atom = std::atomic_ref<uint64_t>(*reinterpret_cast<uint64_t*>(Addr));\n  return Atom.load(std::memory_order_acquire);\n}\n\nstatic bool StoreCAS64(uint64_t& Expected, uint64_t Val, uint64_t Addr) {\n  auto Atom = std::atomic_ref<uint64_t>(*reinterpret_cast<uint64_t*>(Addr));\n  return Atom.compare_exchange_strong(Expected, Val);\n}\n\nstatic uint32_t LoadAcquire32(uint64_t Addr) {\n  auto Atom = std::atomic_ref<uint32_t>(*reinterpret_cast<uint32_t*>(Addr));\n  return Atom.load(std::memory_order_acquire);\n}\n\nstatic bool StoreCAS32(uint32_t& Expected, uint32_t Val, uint64_t Addr) {\n  auto Atom = std::atomic_ref<uint32_t>(*reinterpret_cast<uint32_t*>(Addr));\n  return Atom.compare_exchange_strong(Expected, Val);\n}\n\nstatic uint8_t LoadAcquire8(uint64_t Addr) {\n  auto Atom = std::atomic_ref<uint8_t>(*reinterpret_cast<uint8_t*>(Addr));\n  return Atom.load(std::memory_order_acquire);\n}\n\nstatic bool StoreCAS8(uint8_t& Expected, uint8_t Val, uint64_t Addr) {\n  auto Atom = std::atomic_ref<uint8_t>(*reinterpret_cast<uint8_t*>(Addr));\n  return Atom.compare_exchange_strong(Expected, Val);\n}\n\nstatic uint16_t DoLoad16(uint64_t Addr) {\n  uint64_t AlignmentMask = 0b1111;\n  if ((Addr & AlignmentMask) == 15) {\n    // Address crosses over 16byte or 64byte threshold\n    // Needs two loads\n    uint64_t AddrUpper = Addr + 1;\n    uint8_t ActualUpper {};\n    uint8_t ActualLower {};\n    // Careful ordering here\n    ActualUpper = LoadAcquire8(AddrUpper);\n    ActualLower = LoadAcquire8(Addr);\n\n    uint16_t Result = ActualUpper;\n    Result <<= 8;\n    Result |= ActualLower;\n    return Result;\n  } else {\n    AlignmentMask = 0b111;\n    if ((Addr & AlignmentMask) == 7) {\n      // Crosses 8byte boundary\n      // Needs 128bit load\n      // Fits within a 16byte region\n      uint64_t Alignment = Addr & 0b1111;\n      Addr &= ~0b1111ULL;\n\n      __uint128_t TmpResult = LoadAcquire128(Addr);\n\n      // Zexts the result\n      uint16_t Result = TmpResult >> (Alignment * 8);\n      return Result;\n    } else {\n      AlignmentMask = 0b11;\n      if ((Addr & AlignmentMask) == 3) {\n        // Crosses 4byte boundary\n        // Needs 64bit Load\n        uint64_t Alignment = Addr & AlignmentMask;\n        Addr &= ~AlignmentMask;\n\n        auto Atomic = std::atomic_ref<uint64_t>(*reinterpret_cast<uint64_t*>(Addr));\n        uint64_t TmpResult = Atomic.load();\n\n        // Zexts the result\n        uint16_t Result = TmpResult >> (Alignment * 8);\n        return Result;\n      } else {\n        // Fits within 4byte boundary\n        // Only needs 32bit Load\n        // Only alignment offset will be 1 here\n        uint64_t Alignment = Addr & AlignmentMask;\n        Addr &= ~AlignmentMask;\n\n        auto Atomic = std::atomic_ref<uint32_t>(*reinterpret_cast<uint32_t*>(Addr));\n        uint32_t TmpResult = Atomic.load();\n\n        // Zexts the result\n        uint16_t Result = TmpResult >> (Alignment * 8);\n        return Result;\n      }\n    }\n  }\n}\n\nstatic uint32_t DoLoad32(uint64_t Addr) {\n  uint64_t AlignmentMask = 0b1111;\n  if ((Addr & AlignmentMask) > 12) {\n    // Address crosses over 16byte threshold\n    // Needs dual 32bit load\n    uint64_t Alignment = Addr & 0b11;\n    Addr &= ~0b11ULL;\n\n    uint64_t AddrUpper = Addr + 4;\n\n    // Careful ordering here\n    uint32_t ActualUpper = LoadAcquire32(AddrUpper);\n    uint32_t ActualLower = LoadAcquire32(Addr);\n\n    uint64_t Result = ActualUpper;\n    Result <<= 32;\n    Result |= ActualLower;\n    return Result >> (Alignment * 8);\n  } else {\n    AlignmentMask = 0b111;\n    if ((Addr & AlignmentMask) >= 5) {\n      // Crosses 8byte boundary\n      // Needs 128bit load\n      // Fits within a 16byte region\n      uint64_t Alignment = Addr & 0b1111;\n      Addr &= ~0b1111ULL;\n\n      __uint128_t TmpResult = LoadAcquire128(Addr);\n\n      return TmpResult >> (Alignment * 8);\n    } else {\n      // Fits within 8byte boundary\n      // Only needs 64bit CAS\n      // Alignments can be [1,5)\n      uint64_t Alignment = Addr & AlignmentMask;\n      Addr &= ~AlignmentMask;\n\n      auto Atomic = std::atomic_ref<uint64_t>(*reinterpret_cast<uint64_t*>(Addr));\n      uint64_t TmpResult = Atomic.load();\n\n      return TmpResult >> (Alignment * 8);\n    }\n  }\n}\n\nstatic uint64_t DoLoad64(uint64_t Addr) {\n  uint64_t AlignmentMask = 0b1111;\n  if ((Addr & AlignmentMask) > 8) {\n    uint64_t Alignment = Addr & 0b111;\n    Addr &= ~0b111ULL;\n    uint64_t AddrUpper = Addr + 8;\n\n    // Crosses a 16byte boundary\n    // Needs two 8 byte loads\n    uint64_t ActualUpper {};\n    uint64_t ActualLower {};\n    // Careful ordering here\n    ActualUpper = LoadAcquire64(AddrUpper);\n    ActualLower = LoadAcquire64(Addr);\n\n    __uint128_t Result = ActualUpper;\n    Result <<= 64;\n    Result |= ActualLower;\n    return Result >> (Alignment * 8);\n  } else {\n    // Fits within a 16byte region\n    uint64_t Alignment = Addr & AlignmentMask;\n    Addr &= ~AlignmentMask;\n    __uint128_t TmpResult = LoadAcquire128(Addr);\n    uint64_t Result = TmpResult >> (Alignment * 8);\n    return Result;\n  }\n}\n\nstatic __uint128_t DoLoad128(uint64_t Addr) {\n  // Any misalignment here means we cross a 16byte boundary\n  // So we need two 128bit loads\n  uint64_t Alignment = Addr & 0b1111;\n  Addr &= ~0b1111ULL;\n  uint64_t AddrUpper = Addr + 16;\n\n  union AlignedData {\n    struct {\n      __uint128_t Lower;\n      __uint128_t Upper;\n    } Large;\n    struct {\n      uint8_t Data[32];\n    } Bytes;\n  };\n\n  AlignedData* Data = reinterpret_cast<AlignedData*>(alloca(sizeof(AlignedData)));\n  Data->Large.Upper = LoadAcquire128(AddrUpper);\n  Data->Large.Lower = LoadAcquire128(Addr);\n\n  __uint128_t Result {};\n  memcpy(&Result, &Data->Bytes.Data[Alignment], sizeof(Result));\n  return Result;\n}\n\nstatic bool RunCASPAL(uint64_t* GPRs, uint32_t Size, uint32_t DesiredReg1, uint32_t DesiredReg2, uint32_t ExpectedReg1,\n                      uint32_t ExpectedReg2, uint32_t AddressReg, uint32_t* StrictSplitLockMutex) {\n\n  std::optional<FEXCore::Utils::SpinWaitLock::UniqueSpinMutex<uint32_t>> Lock {};\n  if (Size == 0) {\n    // 32bit\n    uint64_t Addr = GPRs[AddressReg];\n\n    uint32_t DesiredLower = GPRs[DesiredReg1];\n    uint32_t DesiredUpper = GPRs[DesiredReg2];\n\n    uint32_t ExpectedLower = GPRs[ExpectedReg1];\n    uint32_t ExpectedUpper = GPRs[ExpectedReg2];\n\n    // Cross-cacheline CAS doesn't work on ARM\n    // It isn't even guaranteed to work on x86\n    // Intel will do a \"split lock\" which locks the full bus\n    // AMD will tear instead\n    // Both cross-cacheline and cross 16byte both need dual CAS loops that can tear\n    // ARMv8.4 LSE2 solves all atomic issues except cross-cacheline\n\n    // Check for Split lock across a cacheline\n    if ((Addr & 63) > 56) {\n      FEXCORE_TELEMETRY_SET(TYPE_HAS_SPLIT_LOCKS, 1);\n      if (StrictSplitLockMutex && !Lock.has_value()) {\n        Lock.emplace(StrictSplitLockMutex);\n      }\n    }\n\n    uint64_t AlignmentMask = 0b1111;\n    if ((Addr & AlignmentMask) > 8) {\n      FEXCORE_TELEMETRY_SET(TYPE_16BYTE_SPLIT, 1);\n      if (StrictSplitLockMutex && !Lock.has_value()) {\n        Lock.emplace(StrictSplitLockMutex);\n      }\n\n      uint64_t Alignment = Addr & 0b111;\n      Addr &= ~0b111ULL;\n      uint64_t AddrUpper = Addr + 8;\n\n      // Crosses a 16byte boundary\n      // Need to do 256bit atomic, but since that doesn't exist we need to do a dual CAS loop\n      __uint128_t Mask = ~0ULL;\n      Mask <<= Alignment * 8;\n      __uint128_t NegMask = ~Mask;\n      __uint128_t TmpExpected {};\n      __uint128_t TmpDesired {};\n\n      __uint128_t Desired = DesiredUpper;\n      Desired <<= 32;\n      Desired |= DesiredLower;\n      Desired <<= Alignment * 8;\n\n      __uint128_t Expected = ExpectedUpper;\n      Expected <<= 32;\n      Expected |= ExpectedLower;\n      Expected <<= Alignment * 8;\n\n      while (1) {\n        __uint128_t LoadOrderUpper = LoadAcquire64(AddrUpper);\n        LoadOrderUpper <<= 64;\n        __uint128_t TmpActual = LoadOrderUpper | LoadAcquire64(Addr);\n\n        // Set up expected\n        TmpExpected = TmpActual;\n        TmpExpected &= NegMask;\n        TmpExpected |= Expected;\n\n        // Set up desired\n        TmpDesired = TmpExpected;\n        TmpDesired &= NegMask;\n        TmpDesired |= Desired;\n\n        uint64_t TmpExpectedLower = TmpExpected;\n        uint64_t TmpExpectedUpper = TmpExpected >> 64;\n\n        uint64_t TmpDesiredLower = TmpDesired;\n        uint64_t TmpDesiredUpper = TmpDesired >> 64;\n\n        if (TmpExpected == TmpActual) {\n          if (StoreCAS64(TmpExpectedUpper, TmpDesiredUpper, AddrUpper)) {\n            if (StoreCAS64(TmpExpectedLower, TmpDesiredLower, Addr)) {\n              // Stored successfully\n              return true;\n            } else {\n              // CAS managed to tear, we can't really solve this\n              // Continue down the path to let the guest know values weren't expected\n              FEXCORE_TELEMETRY_SET(TYPE_CAS_128BIT_TEAR, 1);\n            }\n          }\n\n          TmpExpected = TmpExpectedUpper;\n          TmpExpected <<= 64;\n          TmpExpected |= TmpExpectedLower;\n        } else {\n          // Mismatch up front\n          TmpExpected = TmpActual;\n        }\n\n        // Not successful\n        // Now we need to check the results to see if we need to try again\n        __uint128_t FailedResultOurBits = TmpExpected & Mask;\n        __uint128_t FailedResultNotOurBits = TmpExpected & NegMask;\n\n        __uint128_t FailedDesiredOurBits = TmpDesired & Mask;\n        __uint128_t FailedDesiredNotOurBits = TmpDesired & NegMask;\n        if ((FailedResultNotOurBits ^ FailedDesiredNotOurBits) != 0) {\n          // If the bits changed that weren't part of our regular CAS then we need to try again\n          continue;\n        }\n        if ((FailedResultOurBits ^ FailedDesiredOurBits) != 0) {\n          // If the bits changed that we were wanting to change then we have failed and can return\n          // We need to extract the bits and return them in EXPECTED\n          uint64_t FailedResult = FailedResultOurBits >> (Alignment * 8);\n          GPRs[ExpectedReg1] = FailedResult & ~0U;\n          GPRs[ExpectedReg2] = FailedResult >> 32;\n          return true;\n        }\n\n        // This happens in the case that between Load and CAS that something has store our desired in to the memory location\n        // This means our CAS fails because what we wanted to store was already stored\n        uint64_t FailedResult = FailedResultOurBits >> (Alignment * 8);\n        GPRs[ExpectedReg1] = FailedResult & ~0U;\n        GPRs[ExpectedReg2] = FailedResult >> 32;\n        return true;\n      }\n    } else {\n      // Fits within a 16byte region\n      uint64_t Alignment = Addr & 0b1111;\n      Addr &= ~0b1111ULL;\n      auto Atomic128 = std::atomic_ref<__uint128_t>(*reinterpret_cast<__uint128_t*>(Addr));\n\n      __uint128_t Mask = ~0ULL;\n      Mask <<= Alignment * 8;\n      __uint128_t NegMask = ~Mask;\n      __uint128_t TmpExpected {};\n      __uint128_t TmpDesired {};\n\n      __uint128_t Desired = (uint64_t)DesiredUpper << 32 | DesiredLower;\n      Desired <<= Alignment * 8;\n\n      __uint128_t Expected = (uint64_t)ExpectedUpper << 32 | ExpectedLower;\n      Expected <<= Alignment * 8;\n\n      while (1) {\n        TmpExpected = Atomic128.load();\n\n        // Set up expected\n        TmpExpected &= NegMask;\n        TmpExpected |= Expected;\n\n        // Set up desired\n        TmpDesired = TmpExpected;\n        TmpDesired &= NegMask;\n        TmpDesired |= Desired;\n\n        bool CASResult = Atomic128.compare_exchange_strong(TmpExpected, TmpDesired);\n        if (CASResult) {\n          // Successful, so we are done\n          return true;\n        } else {\n          // Not successful\n          // Now we need to check the results to see if we need to try again\n          __uint128_t FailedResultOurBits = TmpExpected & Mask;\n          __uint128_t FailedResultNotOurBits = TmpExpected & NegMask;\n\n          __uint128_t FailedDesiredNotOurBits = TmpDesired & NegMask;\n          if ((FailedResultNotOurBits ^ FailedDesiredNotOurBits) != 0) {\n            // If the bits changed that weren't part of our regular CAS then we need to try again\n            continue;\n          }\n\n          // This happens in the case that between Load and CAS that something has store our desired in to the memory location\n          // This means our CAS fails because what we wanted to store was already stored\n          uint64_t FailedResult = FailedResultOurBits >> (Alignment * 8);\n          GPRs[ExpectedReg1] = FailedResult & ~0U;\n          GPRs[ExpectedReg2] = FailedResult >> 32;\n          return true;\n        }\n      }\n    }\n  }\n  return false;\n}\n\nstatic bool HandleCASPAL(uint32_t Instr, uint64_t* GPRs, uint32_t* StrictSplitLockMutex) {\n  uint32_t Size = (Instr >> 30) & 1;\n\n  uint32_t DesiredReg1 = Instr & 0b11111;\n  uint32_t DesiredReg2 = DesiredReg1 + 1;\n  uint32_t ExpectedReg1 = (Instr >> 16) & 0b11111;\n  uint32_t ExpectedReg2 = ExpectedReg1 + 1;\n  uint32_t AddressReg = (Instr >> 5) & 0b11111;\n\n  return RunCASPAL(GPRs, Size, DesiredReg1, DesiredReg2, ExpectedReg1, ExpectedReg2, AddressReg, StrictSplitLockMutex);\n}\n\nstatic uint64_t HandleCASPAL_ARMv8(uint32_t Instr, uintptr_t ProgramCounter, uint64_t* GPRs, uint32_t* StrictSplitLockMutex) {\n  // caspair\n  // [1] ldaxp(TMP2.W(), TMP3.W(), MemOperand(MemSrc)); <-- DataReg & AddrReg\n  // [2] cmp(TMP2.W(), Expected.first.W()); <-- ExpectedReg1\n  // [3] ccmp(TMP3.W(), Expected.second.W(), NoFlag, Condition::eq); <-- ExpectedREg2\n  // [4] b(&LoopNotExpected, Condition::ne);\n  // [5] stlxp(TMP2.W(), Desired.first.W(), Desired.second.W(), MemOperand(MemSrc)); <-- DesiredReg\n  // [6] cbnz(TMP2.W(), &LoopTop);\n  // [7] mov(Dst.first.W(), Expected.first.W());\n  // [8] mov(Dst.second.W(), Expected.second.W());\n  // [9] b(&LoopExpected);\n  // [10] mov(Dst.first.W(), TMP2.W());\n  // [11] mov(Dst.second.W(), TMP3.W());\n  // [12] clrex();\n\n  uint32_t* PC = (uint32_t*)ProgramCounter;\n\n  uint32_t Size = (Instr >> 30) & 1;\n  uint32_t AddrReg = (Instr >> 5) & 0x1F;\n  uint32_t DataReg = Instr & 0x1F;\n  uint32_t DataReg2 = (Instr >> 10) & 0x1F;\n\n  uint32_t ExpectedReg1 {};\n  uint32_t ExpectedReg2 {};\n\n  uint32_t DesiredReg1 {};\n  uint32_t DesiredReg2 {};\n\n  if (Size == 1) {\n    // 64-bit pair happens on paranoid vector loads\n    // [1] ldaxp(TMP1, TMP2, MemSrc);\n    // [2] clrex();\n    //\n    // 64-bit pair happens on paranoid vector stores\n    // [1] ldaxp(xzr, TMP3, MemSrc); // <- Can hit SIGBUS\n    // [2] stlxp(TMP3, TMP1, TMP2, MemSrc); // <- Can also hit SIGBUS\n    // [3] cbnz(TMP3, &B); // < Overwritten with DMB\n\n    if (DataReg == 31) {\n    } else {\n      uint32_t NextInstr = PC[1];\n      if ((NextInstr & ArchHelpers::Arm64::CLREX_MASK) == ArchHelpers::Arm64::CLREX_INST) {\n        uint64_t Addr = GPRs[AddrReg];\n\n        auto Res = DoLoad128(Addr);\n        // We set the result register if it isn't a zero register\n        if (DataReg != 31) {\n          GPRs[DataReg] = Res;\n        }\n        if (DataReg2 != 31) {\n          GPRs[DataReg2] = Res >> 64;\n        }\n\n        // Skip ldaxp and clrex\n        return 2 * sizeof(uint32_t);\n      }\n    }\n    return 0;\n  }\n\n  // Only 32-bit pairs\n  for (int i = 1; i < 10; i++) {\n    uint32_t NextInstr = PC[i];\n    if ((NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::CMP_INST ||\n        (NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::CMP_SHIFT_INST) {\n      ExpectedReg1 = GetRmReg(NextInstr);\n    } else if ((NextInstr & ArchHelpers::Arm64::CCMP_MASK) == ArchHelpers::Arm64::CCMP_INST) {\n      ExpectedReg2 = GetRmReg(NextInstr);\n    } else if ((NextInstr & ArchHelpers::Arm64::STLXP_MASK) == ArchHelpers::Arm64::STLXP_INST) {\n      DesiredReg1 = (NextInstr & 0x1F);\n      DesiredReg2 = (NextInstr >> 10) & 0x1F;\n    }\n  }\n\n  // mov expected into the temp registers used by JIT\n  GPRs[DataReg] = GPRs[ExpectedReg1];\n  GPRs[DataReg2] = GPRs[ExpectedReg2];\n\n  if (RunCASPAL(GPRs, Size, DesiredReg1, DesiredReg2, DataReg, DataReg2, AddrReg, StrictSplitLockMutex)) {\n    return 9 * sizeof(uint32_t); // skip to mov + clrex\n  } else {\n    return 0;\n  }\n}\n\ntemplate<typename T>\nusing CASExpectedFn = T (*)(T Src, T Expected);\ntemplate<typename T>\nusing CASDesiredFn = T (*)(T Src, T Desired);\n\ntemplate<bool Retry>\nstatic uint16_t DoCAS16(uint16_t DesiredSrc, uint16_t ExpectedSrc, uint64_t Addr, CASExpectedFn<uint16_t> ExpectedFunction,\n                        CASDesiredFn<uint16_t> DesiredFunction, uint32_t* StrictSplitLockMutex) {\n  std::optional<FEXCore::Utils::SpinWaitLock::UniqueSpinMutex<uint32_t>> Lock {};\n\n  if ((Addr & 63) == 63) {\n    FEXCORE_TELEMETRY_SET(TYPE_HAS_SPLIT_LOCKS, 1);\n    if (StrictSplitLockMutex && !Lock.has_value()) {\n      Lock.emplace(StrictSplitLockMutex);\n    }\n  }\n\n  // 16 bit\n  uint64_t AlignmentMask = 0b1111;\n  if ((Addr & AlignmentMask) == 15) {\n    FEXCORE_TELEMETRY_SET(TYPE_16BYTE_SPLIT, 1);\n    if (StrictSplitLockMutex && !Lock.has_value()) {\n      Lock.emplace(StrictSplitLockMutex);\n    }\n\n    // Address crosses over 16byte or 64byte threshold\n    // Need a dual 8bit CAS loop\n    uint64_t AddrUpper = Addr + 1;\n\n    while (1) {\n      uint8_t ActualUpper {};\n      uint8_t ActualLower {};\n      // Careful ordering here\n      ActualUpper = LoadAcquire8(AddrUpper);\n      ActualLower = LoadAcquire8(Addr);\n\n      uint16_t Actual = ActualUpper;\n      Actual <<= 8;\n      Actual |= ActualLower;\n\n      uint16_t Desired = DesiredFunction(Actual, DesiredSrc);\n      uint8_t DesiredLower = Desired;\n      uint8_t DesiredUpper = Desired >> 8;\n\n      uint16_t Expected = ExpectedFunction(Actual, ExpectedSrc);\n      uint8_t ExpectedLower = Expected;\n      uint8_t ExpectedUpper = Expected >> 8;\n\n      bool Tear = false;\n      if (ActualUpper == ExpectedUpper && ActualLower == ExpectedLower) {\n        if (StoreCAS8(ExpectedUpper, DesiredUpper, AddrUpper)) {\n          if (StoreCAS8(ExpectedLower, DesiredLower, Addr)) {\n            // Stored successfully\n            return Expected;\n          } else {\n            // CAS managed to tear, we can't really solve this\n            // Continue down the path to let the guest know values weren't expected\n            Tear = true;\n            FEXCORE_TELEMETRY_SET(TYPE_CAS_16BIT_TEAR, 1);\n          }\n        }\n\n        ActualLower = ExpectedLower;\n      }\n\n      // If the bits changed that we were wanting to change then we have failed and can return\n      // We need to extract the bits and return them in EXPECTED\n      uint16_t FailedResult = ActualUpper;\n      FailedResult <<= 8;\n      FailedResult |= ActualLower;\n\n      if constexpr (Retry) {\n        if (Tear) {\n          // If we are retrying and tearing then we can't do anything here\n          // XXX: Resolve with TME\n          return FailedResult;\n        } else {\n          // We can retry safely\n        }\n      } else {\n        // Without Retry (CAS) then we have failed regardless of tear\n        // CAS failed but handled successfully\n        return FailedResult;\n      }\n    }\n  } else {\n    AlignmentMask = 0b111;\n    if ((Addr & AlignmentMask) == 7) {\n      // Crosses 8byte boundary\n      // Needs 128bit CAS\n      // Fits within a 16byte region\n      uint64_t Alignment = Addr & 0b1111;\n      Addr &= ~0b1111ULL;\n      auto Atomic128 = std::atomic_ref<__uint128_t>(*reinterpret_cast<__uint128_t*>(Addr));\n\n      __uint128_t Mask = 0xFFFF;\n      Mask <<= Alignment * 8;\n      __uint128_t NegMask = ~Mask;\n      __uint128_t TmpExpected {};\n      __uint128_t TmpDesired {};\n\n      while (1) {\n        TmpExpected = Atomic128.load();\n\n        __uint128_t Desired = DesiredFunction(TmpExpected >> (Alignment * 8), DesiredSrc);\n        Desired <<= Alignment * 8;\n\n        __uint128_t Expected = ExpectedFunction(TmpExpected >> (Alignment * 8), ExpectedSrc);\n        Expected <<= Alignment * 8;\n\n        // Set up expected\n        TmpExpected &= NegMask;\n        TmpExpected |= Expected;\n\n        // Set up desired\n        TmpDesired = TmpExpected;\n        TmpDesired &= NegMask;\n        TmpDesired |= Desired;\n\n        bool CASResult = Atomic128.compare_exchange_strong(TmpExpected, TmpDesired);\n        if (CASResult) {\n          // Successful, so we are done\n          return Expected >> (Alignment * 8);\n        } else {\n          if constexpr (Retry) {\n            // If we failed but we have enabled retry then just retry without checking results\n            // CAS can't retry but atomic memory ops need to retry until passing\n            continue;\n          }\n          // Not successful\n          // Now we need to check the results to see if we need to try again\n          __uint128_t FailedResultOurBits = TmpExpected & Mask;\n          __uint128_t FailedResultNotOurBits = TmpExpected & NegMask;\n\n          __uint128_t FailedDesiredNotOurBits = TmpDesired & NegMask;\n          if ((FailedResultNotOurBits ^ FailedDesiredNotOurBits) != 0) {\n            // If the bits changed that weren't part of our regular CAS then we need to try again\n            continue;\n          }\n\n          // This happens in the case that between Load and CAS that something has store our desired in to the memory location\n          // This means our CAS fails because what we wanted to store was already stored\n          uint16_t FailedResult = FailedResultOurBits >> (Alignment * 8);\n          // CAS failed but handled successfully\n          return FailedResult;\n        }\n      }\n    } else {\n      AlignmentMask = 0b11;\n      if ((Addr & AlignmentMask) == 3) {\n        // Crosses 4byte boundary\n        // Needs 64bit CAS\n        uint64_t Alignment = Addr & AlignmentMask;\n        Addr &= ~AlignmentMask;\n\n        uint64_t Mask = 0xFFFF;\n        Mask <<= Alignment * 8;\n\n        uint64_t NegMask = ~Mask;\n\n        uint64_t TmpExpected {};\n        uint64_t TmpDesired {};\n\n        auto Atomic = std::atomic_ref<uint64_t>(*reinterpret_cast<uint64_t*>(Addr));\n        while (1) {\n          TmpExpected = Atomic.load();\n\n          uint64_t Desired = DesiredFunction(TmpExpected >> (Alignment * 8), DesiredSrc);\n          Desired <<= Alignment * 8;\n\n          uint64_t Expected = ExpectedFunction(TmpExpected >> (Alignment * 8), ExpectedSrc);\n          Expected <<= Alignment * 8;\n\n          // Set up expected\n          TmpExpected &= NegMask;\n          TmpExpected |= Expected;\n\n          // Set up desired\n          TmpDesired = TmpExpected;\n          TmpDesired &= NegMask;\n          TmpDesired |= Desired;\n\n          bool CASResult = Atomic.compare_exchange_strong(TmpExpected, TmpDesired);\n          if (CASResult) {\n            // Successful, so we are done\n            return Expected >> (Alignment * 8);\n          } else {\n            if constexpr (Retry) {\n              // If we failed but we have enabled retry then just retry without checking results\n              // CAS can't retry but atomic memory ops need to retry until passing\n              continue;\n            }\n            // Not successful\n            // Now we need to check the results to see if we can try again\n            uint64_t FailedResultOurBits = TmpExpected & Mask;\n            uint64_t FailedResultNotOurBits = TmpExpected & NegMask;\n\n            uint64_t FailedDesiredNotOurBits = TmpDesired & NegMask;\n\n            if ((FailedResultNotOurBits ^ FailedDesiredNotOurBits) != 0) {\n              // If the bits changed that weren't part of our regular CAS then we need to try again\n              continue;\n            }\n\n            // This happens in the case that between Load and CAS that something has store our desired in to the memory location\n            // This means our CAS fails because what we wanted to store was already stored\n            uint16_t FailedResult = FailedResultOurBits >> (Alignment * 8);\n            // CAS failed but handled successfully\n            return FailedResult;\n          }\n        }\n      } else {\n        // Fits within 4byte boundary\n        // Only needs 32bit CAS\n        // Only alignment offset will be 1 here\n        uint64_t Alignment = Addr & AlignmentMask;\n        Addr &= ~AlignmentMask;\n\n        uint32_t Mask = 0xFFFF;\n        Mask <<= Alignment * 8;\n\n        uint32_t NegMask = ~Mask;\n\n        uint32_t TmpExpected {};\n        uint32_t TmpDesired {};\n\n        auto Atomic = std::atomic_ref<uint32_t>(*reinterpret_cast<uint32_t*>(Addr));\n        while (1) {\n          TmpExpected = Atomic.load();\n\n\n          uint32_t Desired = DesiredFunction(TmpExpected >> (Alignment * 8), DesiredSrc);\n          Desired <<= Alignment * 8;\n\n          uint32_t Expected = ExpectedFunction(TmpExpected >> (Alignment * 8), ExpectedSrc);\n          Expected <<= Alignment * 8;\n\n          // Set up expected\n          TmpExpected &= NegMask;\n          TmpExpected |= Expected;\n\n          // Set up desired\n          TmpDesired = TmpExpected;\n          TmpDesired &= NegMask;\n          TmpDesired |= Desired;\n\n          bool CASResult = Atomic.compare_exchange_strong(TmpExpected, TmpDesired);\n          if (CASResult) {\n            // Successful, so we are done\n            return Expected >> (Alignment * 8);\n          } else {\n            if constexpr (Retry) {\n              // If we failed but we have enabled retry then just retry without checking results\n              // CAS can't retry but atomic memory ops need to retry until passing\n              continue;\n            }\n            // Not successful\n            // Now we need to check the results to see if we can try again\n            uint32_t FailedResultOurBits = TmpExpected & Mask;\n            uint32_t FailedResultNotOurBits = TmpExpected & NegMask;\n\n            uint32_t FailedDesiredNotOurBits = TmpDesired & NegMask;\n\n            if ((FailedResultNotOurBits ^ FailedDesiredNotOurBits) != 0) {\n              // If the bits changed that weren't part of our regular CAS then we need to try again\n              continue;\n            }\n\n            // This happens in the case that between Load and CAS that something has store our desired in to the memory location\n            // This means our CAS fails because what we wanted to store was already stored\n            uint16_t FailedResult = FailedResultOurBits >> (Alignment * 8);\n            // CAS failed but handled successfully\n            return FailedResult;\n          }\n        }\n      }\n    }\n  }\n}\n\ntemplate<bool Retry>\nstatic uint32_t DoCAS32(uint32_t DesiredSrc, uint32_t ExpectedSrc, uint64_t Addr, CASExpectedFn<uint32_t> ExpectedFunction,\n                        CASDesiredFn<uint32_t> DesiredFunction, uint32_t* StrictSplitLockMutex) {\n  std::optional<FEXCore::Utils::SpinWaitLock::UniqueSpinMutex<uint32_t>> Lock {};\n\n  if ((Addr & 63) > 60) {\n    FEXCORE_TELEMETRY_SET(TYPE_HAS_SPLIT_LOCKS, 1);\n    if (StrictSplitLockMutex && !Lock.has_value()) {\n      Lock.emplace(StrictSplitLockMutex);\n    }\n  }\n\n  // 32 bit\n  uint64_t AlignmentMask = 0b1111;\n  if ((Addr & AlignmentMask) > 12) {\n    FEXCORE_TELEMETRY_SET(TYPE_16BYTE_SPLIT, 1);\n    if (StrictSplitLockMutex && !Lock.has_value()) {\n      Lock.emplace(StrictSplitLockMutex);\n    }\n\n    // Address crosses over 16byte threshold\n    // Needs dual 4 byte CAS loop\n    uint64_t Alignment = Addr & 0b11;\n    Addr &= ~0b11;\n\n    uint64_t AddrUpper = Addr + 4;\n\n    uint64_t Mask = ~0U;\n    Mask <<= Alignment * 8;\n    uint64_t NegMask = ~Mask;\n\n    // Careful ordering here\n    while (1) {\n      uint64_t LoadOrderUpper = LoadAcquire32(AddrUpper);\n      LoadOrderUpper <<= 32;\n      uint64_t TmpActual = LoadOrderUpper | LoadAcquire32(Addr);\n\n      uint64_t Desired = DesiredFunction(TmpActual >> (Alignment * 8), DesiredSrc);\n      uint64_t Expected = ExpectedFunction(TmpActual >> (Alignment * 8), ExpectedSrc);\n\n      uint64_t TmpExpected = TmpActual;\n      TmpExpected &= NegMask;\n      TmpExpected |= Expected << (Alignment * 8);\n\n      uint64_t TmpDesired = TmpExpected;\n      TmpDesired &= NegMask;\n      TmpDesired |= Desired << (Alignment * 8);\n\n      bool Tear = false;\n      if (TmpExpected == TmpActual) {\n        uint32_t TmpExpectedLower = TmpExpected;\n        uint32_t TmpExpectedUpper = TmpExpected >> 32;\n\n        uint32_t TmpDesiredLower = TmpDesired;\n        uint32_t TmpDesiredUpper = TmpDesired >> 32;\n\n        if (StoreCAS32(TmpExpectedUpper, TmpDesiredUpper, AddrUpper)) {\n          if (StoreCAS32(TmpExpectedLower, TmpDesiredLower, Addr)) {\n            // Stored successfully\n            return Expected;\n          } else {\n            // CAS managed to tear, we can't really solve this\n            // Continue down the path to let the guest know values weren't expected\n            Tear = true;\n            FEXCORE_TELEMETRY_SET(TYPE_CAS_32BIT_TEAR, 1);\n          }\n        }\n\n        TmpExpected = TmpExpectedUpper;\n        TmpExpected <<= 32;\n        TmpExpected |= TmpExpectedLower;\n      } else {\n        // Mismatch up front\n        TmpExpected = TmpActual;\n      }\n\n      // Not successful\n      // Now we need to check the results to see if we need to try again\n      uint64_t FailedResultOurBits = TmpExpected & Mask;\n      uint64_t FailedResultNotOurBits = TmpExpected & NegMask;\n\n      uint64_t FailedDesiredNotOurBits = TmpDesired & NegMask;\n      if ((FailedResultNotOurBits ^ FailedDesiredNotOurBits) != 0) {\n        // If the bits changed that weren't part of our regular CAS then we need to try again\n        continue;\n      }\n\n      // This happens in the case that between Load and CAS that something has store our desired in to the memory location\n      // This means our CAS fails because what we wanted to store was already stored\n      uint32_t FailedResult = FailedResultOurBits >> (Alignment * 8);\n\n      if constexpr (Retry) {\n        if (Tear) {\n          // If we are retrying and tearing then we can't do anything here\n          // XXX: Resolve with TME\n          return FailedResult;\n        } else {\n          // We can retry safely\n        }\n      } else {\n        // Without Retry (CAS) then we have failed regardless of tear\n        // CAS failed but handled successfully\n        return FailedResult;\n      }\n    }\n  } else {\n    AlignmentMask = 0b111;\n    if ((Addr & AlignmentMask) >= 5) {\n      // Crosses 8byte boundary\n      // Needs 128bit CAS\n      // Fits within a 16byte region\n      uint64_t Alignment = Addr & 0b1111;\n      Addr &= ~0b1111ULL;\n      auto Atomic128 = std::atomic_ref<__uint128_t>(*reinterpret_cast<__uint128_t*>(Addr));\n\n      __uint128_t Mask = ~0U;\n      Mask <<= Alignment * 8;\n      __uint128_t NegMask = ~Mask;\n      __uint128_t TmpExpected {};\n      __uint128_t TmpDesired {};\n\n      while (1) {\n        __uint128_t TmpActual = Atomic128.load();\n\n        __uint128_t Desired = DesiredFunction(TmpActual >> (Alignment * 8), DesiredSrc);\n        __uint128_t Expected = ExpectedFunction(TmpActual >> (Alignment * 8), ExpectedSrc);\n\n        // Set up expected\n        TmpExpected = TmpActual;\n        TmpExpected &= NegMask;\n        TmpExpected |= Expected << (Alignment * 8);\n\n        // Set up desired\n        TmpDesired = TmpExpected;\n        TmpDesired &= NegMask;\n        TmpDesired |= Desired << (Alignment * 8);\n\n        bool CASResult = Atomic128.compare_exchange_strong(TmpExpected, TmpDesired);\n        if (CASResult) {\n          // Stored successfully\n          return Expected;\n        } else {\n          if constexpr (Retry) {\n            // If we failed but we have enabled retry then just retry without checking results\n            // CAS can't retry but atomic memory ops need to retry until passing\n            continue;\n          }\n\n          // Not successful\n          // Now we need to check the results to see if we need to try again\n          __uint128_t FailedResultOurBits = TmpExpected & Mask;\n          __uint128_t FailedResultNotOurBits = TmpExpected & NegMask;\n\n          __uint128_t FailedDesiredNotOurBits = TmpDesired & NegMask;\n          if ((FailedResultNotOurBits ^ FailedDesiredNotOurBits) != 0) {\n            // If the bits changed that weren't part of our regular CAS then we need to try again\n            continue;\n          }\n\n          // This happens in the case that between Load and CAS that something has store our desired in to the memory location\n          // This means our CAS fails because what we wanted to store was already stored\n          uint32_t FailedResult = FailedResultOurBits >> (Alignment * 8);\n          // CAS failed but handled successfully\n          return FailedResult;\n        }\n      }\n    } else {\n      // Fits within 8byte boundary\n      // Only needs 64bit CAS\n      // Alignments can be [1,5)\n      uint64_t Alignment = Addr & AlignmentMask;\n      Addr &= ~AlignmentMask;\n\n      uint64_t Mask = ~0U;\n      Mask <<= Alignment * 8;\n\n      uint64_t NegMask = ~Mask;\n\n      uint64_t TmpExpected {};\n      uint64_t TmpDesired {};\n\n      auto Atomic = std::atomic_ref<uint64_t>(*reinterpret_cast<uint64_t*>(Addr));\n      while (1) {\n        uint64_t TmpActual = Atomic.load();\n\n        uint64_t Desired = DesiredFunction(TmpActual >> (Alignment * 8), DesiredSrc);\n        uint64_t Expected = ExpectedFunction(TmpActual >> (Alignment * 8), ExpectedSrc);\n\n        // Set up expected\n        TmpExpected = TmpActual;\n        TmpExpected &= NegMask;\n        TmpExpected |= Expected << (Alignment * 8);\n\n        // Set up desired\n        TmpDesired = TmpExpected;\n        TmpDesired &= NegMask;\n        TmpDesired |= Desired << (Alignment * 8);\n\n        bool CASResult = Atomic.compare_exchange_strong(TmpExpected, TmpDesired);\n        if (CASResult) {\n          // Stored successfully\n          return Expected;\n        } else {\n          if constexpr (Retry) {\n            // If we failed but we have enabled retry then just retry without checking results\n            // CAS can't retry but atomic memory ops need to retry until passing\n            continue;\n          }\n\n          // Not successful\n          // Now we need to check the results to see if we can try again\n          uint64_t FailedResultOurBits = TmpExpected & Mask;\n          uint64_t FailedResultNotOurBits = TmpExpected & NegMask;\n\n          uint64_t FailedDesiredNotOurBits = TmpDesired & NegMask;\n\n          if ((FailedResultNotOurBits ^ FailedDesiredNotOurBits) != 0) {\n            // If the bits changed that weren't part of our regular CAS then we need to try again\n            continue;\n          }\n\n          // This happens in the case that between Load and CAS that something has store our desired in to the memory location\n          // This means our CAS fails because what we wanted to store was already stored\n          uint32_t FailedResult = FailedResultOurBits >> (Alignment * 8);\n          // CAS failed but handled successfully\n          return FailedResult;\n        }\n      }\n    }\n  }\n}\n\ntemplate<bool Retry>\nstatic uint64_t DoCAS64(uint64_t DesiredSrc, uint64_t ExpectedSrc, uint64_t Addr, CASExpectedFn<uint64_t> ExpectedFunction,\n                        CASDesiredFn<uint64_t> DesiredFunction, uint32_t* StrictSplitLockMutex) {\n  std::optional<FEXCore::Utils::SpinWaitLock::UniqueSpinMutex<uint32_t>> Lock {};\n\n  if ((Addr & 63) > 56) {\n    FEXCORE_TELEMETRY_SET(TYPE_HAS_SPLIT_LOCKS, 1);\n    if (StrictSplitLockMutex && !Lock.has_value()) {\n      Lock.emplace(StrictSplitLockMutex);\n    }\n  }\n\n  // 64bit\n  uint64_t AlignmentMask = 0b1111;\n  if ((Addr & AlignmentMask) > 8) {\n    FEXCORE_TELEMETRY_SET(TYPE_16BYTE_SPLIT, 1);\n    if (StrictSplitLockMutex && !Lock.has_value()) {\n      Lock.emplace(StrictSplitLockMutex);\n    }\n\n    uint64_t Alignment = Addr & 0b111;\n    Addr &= ~0b111ULL;\n    uint64_t AddrUpper = Addr + 8;\n\n    // Crosses a 16byte boundary\n    // Need to do 256bit atomic, but since that doesn't exist we need to do a dual CAS loop\n    __uint128_t Mask = ~0ULL;\n    Mask <<= Alignment * 8;\n    __uint128_t NegMask = ~Mask;\n    __uint128_t TmpExpected {};\n    __uint128_t TmpDesired {};\n\n    while (1) {\n      __uint128_t LoadOrderUpper = LoadAcquire64(AddrUpper);\n      LoadOrderUpper <<= 64;\n      __uint128_t TmpActual = LoadOrderUpper | LoadAcquire64(Addr);\n\n      __uint128_t Desired = DesiredFunction(TmpActual >> (Alignment * 8), DesiredSrc);\n      __uint128_t Expected = ExpectedFunction(TmpActual >> (Alignment * 8), ExpectedSrc);\n\n      // Set up expected\n      TmpExpected = TmpActual;\n      TmpExpected &= NegMask;\n      TmpExpected |= Expected << (Alignment * 8);\n\n      // Set up desired\n      TmpDesired = TmpExpected;\n      TmpDesired &= NegMask;\n      TmpDesired |= Desired << (Alignment * 8);\n\n      uint64_t TmpExpectedLower = TmpExpected;\n      uint64_t TmpExpectedUpper = TmpExpected >> 64;\n\n      uint64_t TmpDesiredLower = TmpDesired;\n      uint64_t TmpDesiredUpper = TmpDesired >> 64;\n\n      bool Tear = false;\n      if (TmpExpected == TmpActual) {\n        if (StoreCAS64(TmpExpectedUpper, TmpDesiredUpper, AddrUpper)) {\n          if (StoreCAS64(TmpExpectedLower, TmpDesiredLower, Addr)) {\n            // Stored successfully\n            return Expected;\n          } else {\n            // CAS managed to tear, we can't really solve this\n            // Continue down the path to let the guest know values weren't expected\n            Tear = true;\n            FEXCORE_TELEMETRY_SET(TYPE_CAS_64BIT_TEAR, 1);\n          }\n        }\n\n        TmpExpected = TmpExpectedUpper;\n        TmpExpected <<= 64;\n        TmpExpected |= TmpExpectedLower;\n      } else {\n        // Mismatch up front\n        TmpExpected = TmpActual;\n      }\n\n      // Not successful\n      // Now we need to check the results to see if we need to try again\n      __uint128_t FailedResultOurBits = TmpExpected & Mask;\n      __uint128_t FailedResultNotOurBits = TmpExpected & NegMask;\n\n      __uint128_t FailedDesiredNotOurBits = TmpDesired & NegMask;\n      if ((FailedResultNotOurBits ^ FailedDesiredNotOurBits) != 0) {\n        // If the bits changed that weren't part of our regular CAS then we need to try again\n        continue;\n      }\n\n      // This happens in the case that between Load and CAS that something has store our desired in to the memory location\n      // This means our CAS fails because what we wanted to store was already stored\n      uint64_t FailedResult = FailedResultOurBits >> (Alignment * 8);\n\n      if constexpr (Retry) {\n        if (Tear) {\n          // If we are retrying and tearing then we can't do anything here\n          // XXX: Resolve with TME\n          return FailedResult;\n        } else {\n          // We can retry safely\n        }\n      } else {\n        // Without Retry (CAS) then we have failed regardless of tear\n        // CAS failed but handled successfully\n        return FailedResult;\n      }\n    }\n  } else {\n    // Fits within a 16byte region\n    uint64_t Alignment = Addr & AlignmentMask;\n    Addr &= ~AlignmentMask;\n    auto Atomic128 = std::atomic_ref<__uint128_t>(*reinterpret_cast<__uint128_t*>(Addr));\n\n    __uint128_t Mask = ~0ULL;\n    Mask <<= Alignment * 8;\n    __uint128_t NegMask = ~Mask;\n    __uint128_t TmpExpected {};\n    __uint128_t TmpDesired {};\n\n    while (1) {\n      __uint128_t TmpActual = Atomic128.load();\n\n      __uint128_t Desired = DesiredFunction(TmpActual >> (Alignment * 8), DesiredSrc);\n      __uint128_t Expected = ExpectedFunction(TmpActual >> (Alignment * 8), ExpectedSrc);\n\n      // Set up expected\n      TmpExpected = TmpActual;\n      TmpExpected &= NegMask;\n      TmpExpected |= Expected << (Alignment * 8);\n\n      // Set up desired\n      TmpDesired = TmpExpected;\n      TmpDesired &= NegMask;\n      TmpDesired |= Desired << (Alignment * 8);\n\n      bool CASResult = Atomic128.compare_exchange_strong(TmpExpected, TmpDesired);\n      if (CASResult) {\n        // Stored successfully\n        return Expected;\n      } else {\n        if constexpr (Retry) {\n          // If we failed but we have enabled retry then just retry without checking results\n          // CAS can't retry but atomic memory ops need to retry until passing\n          continue;\n        }\n\n        // Not successful\n        // Now we need to check the results to see if we need to try again\n        __uint128_t FailedResultOurBits = TmpExpected & Mask;\n        __uint128_t FailedResultNotOurBits = TmpExpected & NegMask;\n\n        __uint128_t FailedDesiredNotOurBits = TmpDesired & NegMask;\n        if ((FailedResultNotOurBits ^ FailedDesiredNotOurBits) != 0) {\n          // If the bits changed that weren't part of our regular CAS then we need to try again\n          continue;\n        }\n\n        // This happens in the case that between Load and CAS that something has store our desired in to the memory location\n        // This means our CAS fails because what we wanted to store was already stored\n        uint64_t FailedResult = FailedResultOurBits >> (Alignment * 8);\n        // CAS failed but handled successfully\n        return FailedResult;\n      }\n    }\n  }\n}\n\nstatic std::optional<uint64_t> DoCAS(uint32_t Size, uint64_t Desired, uint64_t Expected, uint64_t Addr, uint32_t* StrictSplitLockMutex) {\n  // Cross-cacheline CAS doesn't work on ARM\n  // It isn't even guaranteed to work on x86\n  // Intel will do a \"split lock\" which locks the full bus\n  // AMD will tear instead\n  // Both cross-cacheline and cross 16byte both need dual CAS loops that can tear\n  // ARMv8.4 LSE2 solves all atomic issues except cross-cacheline\n  // ARM's TME extension solves the cross-cacheline problem\n\n  // 8bit can't be unaligned\n  // Only need to handle 16, 32, 64\n  if (Size == 2) {\n    auto Res = DoCAS16<false>(\n      Desired, Expected, Addr,\n      [](uint16_t, uint16_t Expected) -> uint16_t {\n        // Expected is just Expected\n        return Expected;\n      },\n      [](uint16_t, uint16_t Desired) -> uint16_t {\n        // Desired is just Desired\n        return Desired;\n      },\n      StrictSplitLockMutex);\n    return Res;\n  } else if (Size == 4) {\n    auto Res = DoCAS32<false>(\n      Desired, Expected, Addr,\n      [](uint32_t, uint32_t Expected) -> uint32_t {\n        // Expected is just Expected\n        return Expected;\n      },\n      [](uint32_t, uint32_t Desired) -> uint32_t {\n        // Desired is just Desired\n        return Desired;\n      },\n      StrictSplitLockMutex);\n    return Res;\n  } else if (Size == 8) {\n    auto Res = DoCAS64<false>(\n      Desired, Expected, Addr,\n      [](uint64_t, uint64_t Expected) -> uint64_t {\n        // Expected is just Expected\n        return Expected;\n      },\n      [](uint64_t, uint64_t Desired) -> uint64_t {\n        // Desired is just Desired\n        return Desired;\n      },\n      StrictSplitLockMutex);\n    return Res;\n  }\n\n  return std::nullopt;\n}\n\nstatic bool RunCASAL(uint64_t* GPRs, uint32_t Size, uint32_t DesiredReg, uint32_t ExpectedReg, uint32_t AddressReg, uint32_t* StrictSplitLockMutex) {\n  std::optional<uint64_t> Res = DoCAS(Size, GPRs[DesiredReg], GPRs[ExpectedReg], GPRs[AddressReg], StrictSplitLockMutex);\n  if (!Res.has_value()) {\n    return false;\n  }\n\n  // Regardless of pass or fail\n  // We set the result register if it isn't a zero register\n  if (ExpectedReg != 31) {\n    GPRs[ExpectedReg] = *Res;\n  }\n  return true;\n}\n\nstatic bool HandleCASAL(uint64_t* GPRs, uint32_t Instr, uint32_t* StrictSplitLockMutex) {\n  uint32_t Size = 1 << (Instr >> 30);\n\n  uint32_t DesiredReg = Instr & 0b11111;\n  uint32_t ExpectedReg = (Instr >> 16) & 0b11111;\n  uint32_t AddressReg = (Instr >> 5) & 0b11111;\n  return RunCASAL(GPRs, Size, DesiredReg, ExpectedReg, AddressReg, StrictSplitLockMutex);\n}\n\nstatic bool HandleAtomicMemOp(uint32_t Instr, uint64_t* GPRs, uint32_t* StrictSplitLockMutex) {\n  uint32_t Size = 1 << (Instr >> 30);\n  uint32_t ResultReg = Instr & 0b11111;\n  uint32_t SourceReg = (Instr >> 16) & 0b11111;\n  uint32_t AddressReg = (Instr >> 5) & 0b11111;\n\n  uint64_t Addr = GPRs[AddressReg];\n\n  uint8_t Op = (Instr >> 12) & 0xF;\n\n  if (Size == 2) {\n    auto NOPExpected = [](uint16_t SrcVal, uint16_t) -> uint16_t {\n      return SrcVal;\n    };\n\n    auto ADDDesired = [](uint16_t SrcVal, uint16_t Desired) -> uint16_t {\n      return SrcVal + Desired;\n    };\n\n    auto CLRDesired = [](uint16_t SrcVal, uint16_t Desired) -> uint16_t {\n      return SrcVal & ~Desired;\n    };\n\n    auto EORDesired = [](uint16_t SrcVal, uint16_t Desired) -> uint16_t {\n      return SrcVal ^ Desired;\n    };\n\n    auto SETDesired = [](uint16_t SrcVal, uint16_t Desired) -> uint16_t {\n      return SrcVal | Desired;\n    };\n\n    auto SWAPDesired = [](uint16_t SrcVal, uint16_t Desired) -> uint16_t {\n      return Desired;\n    };\n\n    CASDesiredFn<uint16_t> DesiredFunction {};\n\n    switch (Op) {\n    case ATOMIC_ADD_OP: DesiredFunction = ADDDesired; break;\n    case ATOMIC_CLR_OP: DesiredFunction = CLRDesired; break;\n    case ATOMIC_EOR_OP: DesiredFunction = EORDesired; break;\n    case ATOMIC_SET_OP: DesiredFunction = SETDesired; break;\n    case ATOMIC_SWAP_OP: DesiredFunction = SWAPDesired; break;\n    default: LogMan::Msg::EFmt(\"Unhandled JIT SIGBUS Atomic mem op 0x{:02x}\", Op); return false;\n    }\n\n    auto Res = DoCAS16<true>(GPRs[SourceReg],\n                             0, // Unused\n                             Addr, NOPExpected, DesiredFunction, StrictSplitLockMutex);\n    // If we passed and our destination register is not zero\n    // Then we need to update the result register with what was in memory\n    if (ResultReg != 31) {\n      GPRs[ResultReg] = Res;\n    }\n    return true;\n  } else if (Size == 4) {\n    auto NOPExpected = [](uint32_t SrcVal, uint32_t) -> uint32_t {\n      return SrcVal;\n    };\n\n    auto ADDDesired = [](uint32_t SrcVal, uint32_t Desired) -> uint32_t {\n      return SrcVal + Desired;\n    };\n\n    auto CLRDesired = [](uint32_t SrcVal, uint32_t Desired) -> uint32_t {\n      return SrcVal & ~Desired;\n    };\n\n    auto EORDesired = [](uint32_t SrcVal, uint32_t Desired) -> uint32_t {\n      return SrcVal ^ Desired;\n    };\n\n    auto SETDesired = [](uint32_t SrcVal, uint32_t Desired) -> uint32_t {\n      return SrcVal | Desired;\n    };\n\n    auto SWAPDesired = [](uint32_t SrcVal, uint32_t Desired) -> uint32_t {\n      return Desired;\n    };\n\n    CASDesiredFn<uint32_t> DesiredFunction {};\n\n    switch (Op) {\n    case ATOMIC_ADD_OP: DesiredFunction = ADDDesired; break;\n    case ATOMIC_CLR_OP: DesiredFunction = CLRDesired; break;\n    case ATOMIC_EOR_OP: DesiredFunction = EORDesired; break;\n    case ATOMIC_SET_OP: DesiredFunction = SETDesired; break;\n    case ATOMIC_SWAP_OP: DesiredFunction = SWAPDesired; break;\n    default: LogMan::Msg::EFmt(\"Unhandled JIT SIGBUS Atomic mem op 0x{:02x}\", Op); return false;\n    }\n\n    auto Res = DoCAS32<true>(GPRs[SourceReg],\n                             0, // Unused\n                             Addr, NOPExpected, DesiredFunction, StrictSplitLockMutex);\n    // If we passed and our destination register is not zero\n    // Then we need to update the result register with what was in memory\n    if (ResultReg != 31) {\n      GPRs[ResultReg] = Res;\n    }\n    return true;\n  } else if (Size == 8) {\n    auto NOPExpected = [](uint64_t SrcVal, uint64_t) -> uint64_t {\n      return SrcVal;\n    };\n\n    auto ADDDesired = [](uint64_t SrcVal, uint64_t Desired) -> uint64_t {\n      return SrcVal + Desired;\n    };\n\n    auto CLRDesired = [](uint64_t SrcVal, uint64_t Desired) -> uint64_t {\n      return SrcVal & ~Desired;\n    };\n\n    auto EORDesired = [](uint64_t SrcVal, uint64_t Desired) -> uint64_t {\n      return SrcVal ^ Desired;\n    };\n\n    auto SETDesired = [](uint64_t SrcVal, uint64_t Desired) -> uint64_t {\n      return SrcVal | Desired;\n    };\n\n    auto SWAPDesired = [](uint64_t SrcVal, uint64_t Desired) -> uint64_t {\n      return Desired;\n    };\n\n    CASDesiredFn<uint64_t> DesiredFunction {};\n\n    switch (Op) {\n    case ATOMIC_ADD_OP: DesiredFunction = ADDDesired; break;\n    case ATOMIC_CLR_OP: DesiredFunction = CLRDesired; break;\n    case ATOMIC_EOR_OP: DesiredFunction = EORDesired; break;\n    case ATOMIC_SET_OP: DesiredFunction = SETDesired; break;\n    case ATOMIC_SWAP_OP: DesiredFunction = SWAPDesired; break;\n    default: LogMan::Msg::EFmt(\"Unhandled JIT SIGBUS Atomic mem op 0x{:02x}\", Op); return false;\n    }\n\n    auto Res = DoCAS64<true>(GPRs[SourceReg],\n                             0, // Unused\n                             Addr, NOPExpected, DesiredFunction, StrictSplitLockMutex);\n    // If we passed and our destination register is not zero\n    // Then we need to update the result register with what was in memory\n    if (ResultReg != 31) {\n      GPRs[ResultReg] = Res;\n    }\n    return true;\n  }\n\n  return false;\n}\n\nstatic bool HandleAtomicLoad(uint32_t Instr, uint64_t* GPRs, int64_t Offset, Core::UnalignedExclusiveStore* Store = nullptr) {\n  uint32_t Size = 1 << (Instr >> 30);\n\n  uint32_t ResultReg = Instr & 0b11111;\n  uint32_t AddressReg = (Instr >> 5) & 0b11111;\n\n  uint64_t Addr = GPRs[AddressReg] + Offset;\n  uint64_t Res;\n\n  if (Size == 2) {\n    Res = DoLoad16(Addr);\n    // We set the result register if it isn't a zero register\n    if (ResultReg != 31) {\n      GPRs[ResultReg] = Res;\n    }\n  } else if (Size == 4) {\n    Res = DoLoad32(Addr);\n    // We set the result register if it isn't a zero register\n    if (ResultReg != 31) {\n      GPRs[ResultReg] = Res;\n    }\n  } else if (Size == 8) {\n    Res = DoLoad64(Addr);\n    // We set the result register if it isn't a zero register\n    if (ResultReg != 31) {\n      GPRs[ResultReg] = Res;\n    }\n  } else {\n    return false;\n  }\n\n  if (Store) {\n    Store->Addr = Addr;\n    Store->Store = Res;\n    Store->Size = Size;\n  }\n  return true;\n}\n\nstatic bool HandleAtomicStore(uint32_t Instr, uint64_t* GPRs, int64_t Offset, uint32_t* StrictSplitLockMutex) {\n  uint32_t Size = 1 << (Instr >> 30);\n\n  uint32_t DataReg = Instr & 0x1F;\n  uint32_t AddressReg = (Instr >> 5) & 0b11111;\n\n  uint64_t Addr = GPRs[AddressReg] + Offset;\n\n  constexpr bool DoRetry = false;\n  if (Size == 2) {\n    DoCAS16<DoRetry>(\n      GPRs[DataReg],\n      0, // Unused\n      Addr,\n      [](uint16_t SrcVal, uint16_t) -> uint16_t {\n        // Expected is just src\n        return SrcVal;\n      },\n      [](uint16_t, uint16_t Desired) -> uint16_t {\n        // Desired is just Desired\n        return Desired;\n      },\n      StrictSplitLockMutex);\n    return true;\n  } else if (Size == 4) {\n    DoCAS32<DoRetry>(\n      GPRs[DataReg],\n      0, // Unused\n      Addr,\n      [](uint32_t SrcVal, uint32_t) -> uint32_t {\n        // Expected is just src\n        return SrcVal;\n      },\n      [](uint32_t, uint32_t Desired) -> uint32_t {\n        // Desired is just Desired\n        return Desired;\n      },\n      StrictSplitLockMutex);\n    return true;\n  } else if (Size == 8) {\n    DoCAS64<DoRetry>(\n      GPRs[DataReg],\n      0, // Unused\n      Addr,\n      [](uint64_t SrcVal, uint64_t) -> uint64_t {\n        // Expected is just src\n        return SrcVal;\n      },\n      [](uint64_t, uint64_t Desired) -> uint64_t {\n        // Desired is just Desired\n        return Desired;\n      },\n      StrictSplitLockMutex);\n    return true;\n  }\n\n  return false;\n}\n\nstatic uint64_t HandleCAS_NoAtomics(uintptr_t ProgramCounter, uint64_t* GPRs, uint32_t* StrictSplitLockMutex) {\n  // ARMv8.0 CAS\n  // [1] ldaxrb(TMP2.W(), MemOperand(MemSrc))\n  // [2] cmp (TMP2.W(), Expected.W())\n  // [3] b\n  // [4] stlxrb(TMP3.W(), Desired.W(), MemOperand(MemSrc)\n  // [5] cbnz\n  // [6] mov\n  // [7] b\n  // [8] mov (.., TMP2.W());\n  // [9] clrex\n\n  uint32_t* PC = (uint32_t*)ProgramCounter;\n  uint32_t Instr = PC[0];\n  uint32_t Size = 1 << (Instr >> 30);\n  uint32_t AddressReg = GetRnReg(Instr);\n  uint32_t ResultReg = GetRdReg(Instr); // TMP2\n  uint32_t DesiredReg = 0;\n  uint32_t ExpectedReg = 0;\n  for (size_t i = 1; i < 6; ++i) {\n    uint32_t NextInstr = PC[i];\n    if ((NextInstr & ArchHelpers::Arm64::STLXR_MASK) == ArchHelpers::Arm64::STLXR_INST) {\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n      // Just double check that the memory destination matches\n      const uint32_t StoreAddressReg = GetRnReg(NextInstr);\n      LOGMAN_THROW_A_FMT(StoreAddressReg == AddressReg, \"StoreExclusive memory register didn't match the store exclusive register\");\n#endif\n      DesiredReg = GetRdReg(NextInstr);\n    } else if ((NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::CMP_INST ||\n               (NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::CMP_SHIFT_INST) {\n      ExpectedReg = GetRmReg(NextInstr);\n    }\n  }\n  // set up CASAL by doing mov(TMP2, Expected)\n  GPRs[ResultReg] = GPRs[ExpectedReg];\n\n  if (RunCASAL(GPRs, Size, DesiredReg, ResultReg, AddressReg, StrictSplitLockMutex)) {\n    return 7 * sizeof(uint32_t); // jump to mov to allocated register\n  } else {\n    return 0;\n  }\n}\n\nstatic uint64_t HandleAtomicLoadstoreExclusive(uintptr_t ProgramCounter, uint64_t* GPRs, uint32_t* StrictSplitLockMutex) {\n  uint32_t* PC = (uint32_t*)ProgramCounter;\n  uint32_t Instr = PC[0];\n\n  // Atomic Add\n  // [1] ldaxrb(TMP2.W(), MemOperand(MemSrc));\n  // [2] add(TMP2.W(), TMP2.W(), GetReg<RA_32>(Op->Header.Args[1].ID()));\n  // [3] stlxrb(TMP2.W(), TMP2.W(), MemOperand(MemSrc));\n  // [4] cbnz(TMP2.W(), &LoopTop);\n  //\n  // Atomic Fetch Add\n  // [1] ldaxrb(TMP2.W(), MemOperand(MemSrc));\n  // [2] add(TMP3.W(), TMP2.W(), GetReg<RA_32>(Op->Header.Args[1].ID()));\n  // [3] stlxrb(TMP4.W(), TMP3.W(), MemOperand(MemSrc));\n  // [4] cbnz(TMP4.W(), &LoopTop);\n  // [5] mov(GetReg<RA_32>(Node), TMP2.W());\n  //\n  // Atomic Swap\n  //\n  // [1] ldaxrb(TMP2.W(), MemOperand(MemSrc));\n  // [2] stlxrb(TMP4.W(), GetReg<RA_32>(Op->Header.Args[1].ID()), MemOperand(MemSrc));\n  // [3] cbnz(TMP4.W(), &LoopTop);\n  // [4] uxtb(GetReg<RA_64>(Node), TMP2.W());\n  //\n  // ASSUMPTIONS:\n  // - Both cases:\n  //   - The [2]ALU op: (Non NEG case)\n  //     - First source is from [1]ldaxr\n  //     - Second source is incoming value\n  //   - The [2]ALU op: (NEG case)\n  //     - First source is zero register\n  //     - The second source is the from [1]ldaxr\n  //   - No ALU op: (SWAP case)\n  //     - No DataSourceRegister\n  //\n  // - In Atomic case (non-fetch)\n  //   - The [3]stlxr instruction status + memory register are the SAME register\n  //\n  // - In Atomic FETCH case\n  //   - The [3]stlxr instruction's status + memory register are never the same register\n  //   - The [5]mov instruction source is always the destination register from [1] ldaxr*\n  uint32_t ResultReg = GetRdReg(Instr);\n  uint32_t AddressReg = GetRnReg(Instr);\n  uint64_t Addr = GPRs[AddressReg];\n\n  size_t NumInstructionsToSkip = 0;\n\n  // Are we an Atomic op or AtomicFetch?\n  bool AtomicFetch = false;\n\n  // This is the register that is the incoming source to the ALU operation\n  // <DataResultReg> = <Load Exclusive Value> <Op> <DataSourceReg>\n  // NEG case is special\n  // <DataResultReg> = Zero <Sub> <Load Exclusive Value>\n  // DataSourceRegister must always be the Rm register\n  uint32_t DataSourceReg {};\n  ExclusiveAtomicPairType AtomicOp {ExclusiveAtomicPairType::TYPE_SWAP};\n\n  // Scan forward at most five instructions to find our instructions\n  for (size_t i = 1; i < 6; ++i) {\n    uint32_t NextInstr = PC[i];\n    if ((NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::ADD_INST ||\n        (NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::ADD_SHIFT_INST) {\n      AtomicOp = ExclusiveAtomicPairType::TYPE_ADD;\n      DataSourceReg = GetRmReg(NextInstr);\n    } else if ((NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::SUB_INST ||\n               (NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::SUB_SHIFT_INST) {\n      uint32_t RnReg = GetRnReg(NextInstr);\n      if (RnReg == REGISTER_MASK) {\n        // Zero reg means neg\n        AtomicOp = ExclusiveAtomicPairType::TYPE_NEG;\n      } else {\n        AtomicOp = ExclusiveAtomicPairType::TYPE_SUB;\n      }\n      DataSourceReg = GetRmReg(NextInstr);\n    } else if ((NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::CMP_INST ||\n               (NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::CMP_SHIFT_INST) {\n      return HandleCAS_NoAtomics(ProgramCounter, GPRs, StrictSplitLockMutex); // ARMv8.0 CAS\n    } else if ((NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::AND_INST) {\n      AtomicOp = ExclusiveAtomicPairType::TYPE_AND;\n      DataSourceReg = GetRmReg(NextInstr);\n    } else if ((NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::BIC_INST) {\n      AtomicOp = ExclusiveAtomicPairType::TYPE_BIC;\n      DataSourceReg = GetRmReg(NextInstr);\n    } else if ((NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::OR_INST) {\n      AtomicOp = ExclusiveAtomicPairType::TYPE_OR;\n      DataSourceReg = GetRmReg(NextInstr);\n    } else if ((NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::ORN_INST) {\n      AtomicOp = ExclusiveAtomicPairType::TYPE_ORN;\n      DataSourceReg = GetRmReg(NextInstr);\n    } else if ((NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::EOR_INST) {\n      AtomicOp = ExclusiveAtomicPairType::TYPE_EOR;\n      DataSourceReg = GetRmReg(NextInstr);\n    } else if ((NextInstr & ArchHelpers::Arm64::ALU_OP_MASK) == ArchHelpers::Arm64::EON_INST) {\n      AtomicOp = ExclusiveAtomicPairType::TYPE_EON;\n      DataSourceReg = GetRmReg(NextInstr);\n    } else if ((NextInstr & ArchHelpers::Arm64::STLXR_MASK) == ArchHelpers::Arm64::STLXR_INST) {\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n      // Just double check that the memory destination matches\n      const uint32_t StoreAddressReg = GetRnReg(NextInstr);\n      LOGMAN_THROW_A_FMT(StoreAddressReg == AddressReg, \"StoreExclusive memory register didn't match the store exclusive register\");\n#endif\n      uint32_t StatusReg = GetRmReg(NextInstr);\n      uint32_t StoreResultReg = GetRdReg(NextInstr);\n      // We are an atomic fetch instruction if the data register isn't the status register\n      AtomicFetch = !(StatusReg == StoreResultReg);\n      if (AtomicOp == ExclusiveAtomicPairType::TYPE_SWAP) {\n        // In the case of swap we don't have an ALU op inbetween\n        // Source is directly in STLXR\n        DataSourceReg = StoreResultReg;\n      }\n    } else if ((NextInstr & ArchHelpers::Arm64::CBNZ_MASK) == ArchHelpers::Arm64::CBNZ_INST) {\n      // Found the CBNZ, we want to skip to just after this instruction when done\n      NumInstructionsToSkip = i + 1;\n      // This is the last instruction we care about. Leave now\n      break;\n    } else {\n      LogMan::Msg::AFmt(\"Unknown instruction 0x{:08x}\", NextInstr);\n    }\n  }\n\n  uint32_t Size = 1 << (Instr >> 30);\n\n  constexpr bool DoRetry = true;\n\n  auto NOPExpected = []<typename AtomicType>(AtomicType SrcVal, AtomicType) -> AtomicType {\n    return SrcVal;\n  };\n\n  auto ADDDesired = []<typename AtomicType>(AtomicType SrcVal, AtomicType Desired) -> AtomicType {\n    return SrcVal + Desired;\n  };\n\n  auto SUBDesired = []<typename AtomicType>(AtomicType SrcVal, AtomicType Desired) -> AtomicType {\n    return SrcVal - Desired;\n  };\n\n  auto ANDDesired = []<typename AtomicType>(AtomicType SrcVal, AtomicType Desired) -> AtomicType {\n    return SrcVal & Desired;\n  };\n\n  auto BICDesired = []<typename AtomicType>(AtomicType SrcVal, AtomicType Desired) -> AtomicType {\n    return SrcVal & ~Desired;\n  };\n\n  auto ORDesired = []<typename AtomicType>(AtomicType SrcVal, AtomicType Desired) -> AtomicType {\n    return SrcVal | Desired;\n  };\n\n  auto ORNDesired = []<typename AtomicType>(AtomicType SrcVal, AtomicType Desired) -> AtomicType {\n    return SrcVal | ~Desired;\n  };\n\n  auto EORDesired = []<typename AtomicType>(AtomicType SrcVal, AtomicType Desired) -> AtomicType {\n    return SrcVal ^ Desired;\n  };\n\n  auto EONDesired = []<typename AtomicType>(AtomicType SrcVal, AtomicType Desired) -> AtomicType {\n    return SrcVal ^ ~Desired;\n  };\n\n  auto NEGDesired = []<typename AtomicType>(AtomicType SrcVal, AtomicType Desired) -> AtomicType {\n    return -SrcVal;\n  };\n\n  auto SWAPDesired = []<typename AtomicType>(AtomicType SrcVal, AtomicType Desired) -> AtomicType {\n    return Desired;\n  };\n\n  if (Size == 2) {\n    using AtomicType = uint16_t;\n    CASDesiredFn<AtomicType> DesiredFunction {};\n\n    switch (AtomicOp) {\n    case ExclusiveAtomicPairType::TYPE_SWAP: DesiredFunction = SWAPDesired; break;\n    case ExclusiveAtomicPairType::TYPE_ADD: DesiredFunction = ADDDesired; break;\n    case ExclusiveAtomicPairType::TYPE_SUB: DesiredFunction = SUBDesired; break;\n    case ExclusiveAtomicPairType::TYPE_AND: DesiredFunction = ANDDesired; break;\n    case ExclusiveAtomicPairType::TYPE_BIC: DesiredFunction = BICDesired; break;\n    case ExclusiveAtomicPairType::TYPE_OR: DesiredFunction = ORDesired; break;\n    case ExclusiveAtomicPairType::TYPE_ORN: DesiredFunction = ORNDesired; break;\n    case ExclusiveAtomicPairType::TYPE_EOR: DesiredFunction = EORDesired; break;\n    case ExclusiveAtomicPairType::TYPE_EON: DesiredFunction = EONDesired; break;\n    case ExclusiveAtomicPairType::TYPE_NEG: DesiredFunction = NEGDesired; break;\n    default: LogMan::Msg::EFmt(\"Unhandled JIT SIGBUS Atomic mem op 0x{:02x}\", FEXCore::ToUnderlying(AtomicOp)); return false;\n    }\n\n    auto Res = DoCAS16<DoRetry>(GPRs[DataSourceReg],\n                                0, // Unused\n                                Addr, NOPExpected, DesiredFunction, StrictSplitLockMutex);\n\n    if (AtomicFetch && ResultReg != 31) {\n      // On atomic fetch then we store the resulting value back in to the loadacquire destination register\n      // We want the memory value BEFORE the ALU op\n      GPRs[ResultReg] = Res;\n    }\n  } else if (Size == 4) {\n    using AtomicType = uint32_t;\n    CASDesiredFn<AtomicType> DesiredFunction {};\n\n    switch (AtomicOp) {\n    case ExclusiveAtomicPairType::TYPE_SWAP: DesiredFunction = SWAPDesired; break;\n    case ExclusiveAtomicPairType::TYPE_ADD: DesiredFunction = ADDDesired; break;\n    case ExclusiveAtomicPairType::TYPE_SUB: DesiredFunction = SUBDesired; break;\n    case ExclusiveAtomicPairType::TYPE_AND: DesiredFunction = ANDDesired; break;\n    case ExclusiveAtomicPairType::TYPE_BIC: DesiredFunction = BICDesired; break;\n    case ExclusiveAtomicPairType::TYPE_OR: DesiredFunction = ORDesired; break;\n    case ExclusiveAtomicPairType::TYPE_ORN: DesiredFunction = ORNDesired; break;\n    case ExclusiveAtomicPairType::TYPE_EOR: DesiredFunction = EORDesired; break;\n    case ExclusiveAtomicPairType::TYPE_EON: DesiredFunction = EONDesired; break;\n    case ExclusiveAtomicPairType::TYPE_NEG: DesiredFunction = NEGDesired; break;\n    default: LogMan::Msg::EFmt(\"Unhandled JIT SIGBUS Atomic mem op 0x{:02x}\", FEXCore::ToUnderlying(AtomicOp)); return false;\n    }\n\n    auto Res = DoCAS32<DoRetry>(GPRs[DataSourceReg],\n                                0, // Unused\n                                Addr, NOPExpected, DesiredFunction, StrictSplitLockMutex);\n\n    if (AtomicFetch && ResultReg != 31) {\n      // On atomic fetch then we store the resulting value back in to the loadacquire destination register\n      // We want the memory value BEFORE the ALU op\n      GPRs[ResultReg] = Res;\n    }\n  } else if (Size == 8) {\n    using AtomicType = uint64_t;\n    CASDesiredFn<AtomicType> DesiredFunction {};\n\n    switch (AtomicOp) {\n    case ExclusiveAtomicPairType::TYPE_SWAP: DesiredFunction = SWAPDesired; break;\n    case ExclusiveAtomicPairType::TYPE_ADD: DesiredFunction = ADDDesired; break;\n    case ExclusiveAtomicPairType::TYPE_SUB: DesiredFunction = SUBDesired; break;\n    case ExclusiveAtomicPairType::TYPE_AND: DesiredFunction = ANDDesired; break;\n    case ExclusiveAtomicPairType::TYPE_BIC: DesiredFunction = BICDesired; break;\n    case ExclusiveAtomicPairType::TYPE_OR: DesiredFunction = ORDesired; break;\n    case ExclusiveAtomicPairType::TYPE_ORN: DesiredFunction = ORNDesired; break;\n    case ExclusiveAtomicPairType::TYPE_EOR: DesiredFunction = EORDesired; break;\n    case ExclusiveAtomicPairType::TYPE_EON: DesiredFunction = EONDesired; break;\n    case ExclusiveAtomicPairType::TYPE_NEG: DesiredFunction = NEGDesired; break;\n    default: LogMan::Msg::EFmt(\"Unhandled JIT SIGBUS Atomic mem op 0x{:02x}\", FEXCore::ToUnderlying(AtomicOp)); return false;\n    }\n\n    auto Res = DoCAS64<DoRetry>(GPRs[DataSourceReg],\n                                0, // Unused\n                                Addr, NOPExpected, DesiredFunction, StrictSplitLockMutex);\n    if (AtomicFetch && ResultReg != 31) {\n      // On atomic fetch then we store the resulting value back in to the loadacquire destination register\n      // We want the memory value BEFORE the ALU op\n      GPRs[ResultReg] = Res;\n    }\n  }\n\n  // Multiply by 4 for number of bytes to skip\n  return NumInstructionsToSkip * 4;\n}\n\n[[nodiscard]]\nstd::optional<int32_t> HandleUnalignedAccess(FEXCore::Core::InternalThreadState* Thread, UnalignedHandlerType HandleType,\n                                             uintptr_t ProgramCounter, uint64_t* GPRs, bool IsJIT) {\n#ifdef ARCHITECTURE_arm64\n  constexpr bool is_arm64 = true;\n#else\n  constexpr bool is_arm64 = false;\n#endif\n\n  if constexpr (!is_arm64) {\n    return std::nullopt;\n  }\n\n  uint32_t* PC = (uint32_t*)ProgramCounter;\n  uint32_t Instr = PC[0];\n\n  // 1 = 16bit\n  // 2 = 32bit\n  // 3 = 64bit\n  uint32_t Size = (Instr & 0xC000'0000) >> 30;\n  uint32_t AddrReg = (Instr >> 5) & 0x1F;\n  uint32_t DataReg = Instr & 0x1F;\n\n  auto CTX = static_cast<Context::ContextImpl*>(Thread->CTX);\n  uint32_t* StrictSplitLockMutex {CTX->Config.StrictInProcessSplitLocks ? &CTX->StrictSplitLockMutex : nullptr};\n\n  if (!IsJIT) [[unlikely]] {\n    if ((Instr & LDAXR_MASK) == LDAR_INST ||  // LDAR*\n        (Instr & LDAXR_MASK) == LDAPR_INST) { // LDAPR*\n      if (ArchHelpers::Arm64::HandleAtomicLoad(Instr, GPRs, 0)) {\n        // Skip this instruction now\n        return 4;\n      } else {\n        LogMan::Msg::EFmt(\"Unhandled JIT SIGBUS LDAR*: PC: 0x{:x} Instruction: 0x{:08x}\\n\", ProgramCounter, PC[0]);\n        return std::nullopt;\n      }\n    } else if ((Instr & LDAXR_MASK) == STLR_INST) { // STLR*\n      if (ArchHelpers::Arm64::HandleAtomicStore(Instr, GPRs, 0, StrictSplitLockMutex)) {\n        // Skip this instruction now\n        return 4;\n      } else {\n        LogMan::Msg::EFmt(\"Unhandled JIT SIGBUS STLR*: PC: 0x{:x} Instruction: 0x{:08x}\\n\", ProgramCounter, PC[0]);\n        return std::nullopt;\n      }\n    } else if ((Instr & RCPC2_MASK) == LDAPUR_INST) { // LDAPUR*\n      // Extract the 9-bit offset from the instruction\n      int32_t Offset = static_cast<int32_t>(Instr) << 11 >> 23;\n      if (ArchHelpers::Arm64::HandleAtomicLoad(Instr, GPRs, Offset)) {\n        // Skip this instruction now\n        return 4;\n      } else {\n        LogMan::Msg::EFmt(\"Unhandled JIT SIGBUS LDAPUR*: PC: 0x{:x} Instruction: 0x{:08x}\\n\", ProgramCounter, PC[0]);\n        return std::nullopt;\n      }\n    } else if ((Instr & RCPC2_MASK) == STLUR_INST) { // STLUR*\n      // Extract the 9-bit offset from the instruction\n      int32_t Offset = static_cast<int32_t>(Instr) << 11 >> 23;\n      if (ArchHelpers::Arm64::HandleAtomicStore(Instr, GPRs, Offset, StrictSplitLockMutex)) {\n        // Skip this instruction now\n        return 4;\n      } else {\n        LogMan::Msg::EFmt(\"Unhandled JIT SIGBUS LDLUR*: PC: 0x{:x} Instruction: 0x{:08x}\\n\", ProgramCounter, PC[0]);\n        return std::nullopt;\n      }\n    } else if ((Instr & ArchHelpers::Arm64::LDAXR_MASK) == ArchHelpers::Arm64::LDAXR_INST) { // LDAXR*\n      if (ArchHelpers::Arm64::HandleAtomicLoad(Instr, GPRs, 0, &Thread->ExclusiveStore)) {\n        return 4;\n      }\n    } else if ((Instr & ArchHelpers::Arm64::STLXR_MASK) == ArchHelpers::Arm64::STLXR_INST) { // STLXR*\n      uint32_t StatusReg = Instr << 11 >> 27;\n      // // Emulate exclusive store by validating the address and value against the last unaligned LDAXR*.\n      if (GPRs[AddrReg] != Thread->ExclusiveStore.Addr || Size > Thread->ExclusiveStore.Size) {\n        if (StatusReg != 31) {\n          GPRs[StatusReg] = 1;\n        }\n        return 4;\n      }\n      if (std::optional<uint64_t> Prev =\n            DoCAS(Size, DataReg == 31 ? 0 : GPRs[DataReg], Thread->ExclusiveStore.Store, GPRs[AddrReg], StrictSplitLockMutex)) {\n        if (StatusReg != 31) {\n          GPRs[StatusReg] = !!memcmp(&Thread->ExclusiveStore.Store, &*Prev, Size);\n        }\n        Thread->ExclusiveStore.Size = 0;\n        return 4;\n      }\n    }\n    return 0;\n  }\n\n  const auto Frame = Thread->CurrentFrame;\n  const uint64_t BlockBegin = Frame->State.InlineJITBlockHeader;\n  auto InlineHeader = reinterpret_cast<const CPU::CPUBackend::JITCodeHeader*>(BlockBegin);\n  auto InlineTail = reinterpret_cast<CPU::CPUBackend::JITCodeTail*>(Frame->State.InlineJITBlockHeader + InlineHeader->OffsetToBlockTail);\n\n  // Check some instructions first that don't do any backpatching.\n  if ((Instr & ArchHelpers::Arm64::CASPAL_MASK) == ArchHelpers::Arm64::CASPAL_INST) { // CASPAL\n    if (ArchHelpers::Arm64::HandleCASPAL(Instr, GPRs, StrictSplitLockMutex)) {\n      // Skip this instruction now\n      return 4;\n    } else {\n      LogMan::Msg::EFmt(\"Unhandled JIT SIGBUS CASPAL: PC: 0x{:x} Instruction: 0x{:08x}\\n\", ProgramCounter, PC[0]);\n      return std::nullopt;\n    }\n  } else if ((Instr & ArchHelpers::Arm64::CASAL_MASK) == ArchHelpers::Arm64::CASAL_INST) { // CASAL\n    if (ArchHelpers::Arm64::HandleCASAL(GPRs, Instr, StrictSplitLockMutex)) {\n      // Skip this instruction now\n      return 4;\n    } else {\n      LogMan::Msg::EFmt(\"Unhandled JIT SIGBUS CASAL: PC: 0x{:x} Instruction: 0x{:08x}\\n\", ProgramCounter, PC[0]);\n      return std::nullopt;\n    }\n  } else if ((Instr & LDAXR_MASK) == LDAR_INST ||  // LDAR*\n             (Instr & LDAXR_MASK) == LDAPR_INST || // LDAPR*\n             (Instr & LDAXR_MASK) == STLR_INST) {  // STLR*\n    // This must fall through to the spin-lock implementation below.\n    // This mask has a partial overlap with ATOMIC_MEM_INST so we need to check this here.\n  } else if ((Instr & ArchHelpers::Arm64::ATOMIC_MEM_MASK) == ArchHelpers::Arm64::ATOMIC_MEM_INST) { // Atomic memory op\n    if (ArchHelpers::Arm64::HandleAtomicMemOp(Instr, GPRs, StrictSplitLockMutex)) {\n      // Skip this instruction now\n      return 4;\n    } else {\n      uint8_t Op = (PC[0] >> 12) & 0xF;\n      LogMan::Msg::EFmt(\"Unhandled JIT SIGBUS Atomic mem op 0x{:02x}: PC: 0x{:x} Instruction: 0x{:08x}\\n\", Op, ProgramCounter, PC[0]);\n      return std::nullopt;\n    }\n  } else if ((Instr & ArchHelpers::Arm64::LDAXR_MASK) == ArchHelpers::Arm64::LDAXR_INST) { // LDAXR*\n    uint64_t BytesToSkip = ArchHelpers::Arm64::HandleAtomicLoadstoreExclusive(ProgramCounter, GPRs, StrictSplitLockMutex);\n    if (BytesToSkip) {\n      // Skip this instruction now\n      return BytesToSkip;\n    }\n    // Explicit fallthrough to the backpatch handler below!\n  } else if ((Instr & ArchHelpers::Arm64::LDAXP_MASK) == ArchHelpers::Arm64::LDAXP_INST) { // LDAXP\n    // Should be compare and swap pair only. LDAXP not used elsewhere\n    uint64_t BytesToSkip = ArchHelpers::Arm64::HandleCASPAL_ARMv8(Instr, ProgramCounter, GPRs, StrictSplitLockMutex);\n    if (BytesToSkip) {\n      // Skip this instruction now\n      return BytesToSkip;\n    } else {\n      LogMan::Msg::EFmt(\"Unhandled JIT SIGBUS CASPAL: PC: 0x{:x} Instruction: 0x{:08x}\\n\", ProgramCounter, PC[0]);\n      return std::nullopt;\n    }\n  }\n\n  // Lock code mutex during any SIGBUS handling that potentially changes code.\n  // Due to code buffer sharing between threads, code must be carefully backpatched from last to first.\n  // Multiple threads can be attempting to handle the SIGBUS or even be executing the code being backpatched.\n  FEXCore::Utils::SpinWaitLock::UniqueSpinMutex lk(&InlineTail->SpinLockFutex);\n\n  if ((Instr & LDAXR_MASK) == LDAR_INST ||  // LDAR*\n      (Instr & LDAXR_MASK) == LDAPR_INST) { // LDAPR*\n    uint32_t LDR = LDR_INST;\n    LDR |= Size << 30;\n    LDR |= AddrReg << 5;\n    LDR |= DataReg;\n    if (HandleType != UnalignedHandlerType::NonAtomic) {\n      // Ordering matters with cross-thread visibility!\n      std::atomic_ref<uint32_t>(PC[1]).store(DMB_LD, std::memory_order_release); // Back-patch the half-barrier.\n    }\n    std::atomic_ref<uint32_t>(PC[0]).store(LDR, std::memory_order_release);\n    ClearICache(&PC[0], 8);\n    // With the instruction modified, now execute again.\n    return 0;\n  } else if ((Instr & LDAXR_MASK) == STLR_INST) { // STLR*\n    uint32_t STR = STR_INST;\n    STR |= Size << 30;\n    STR |= AddrReg << 5;\n    STR |= DataReg;\n    if (HandleType != UnalignedHandlerType::NonAtomic) {\n      std::atomic_ref<uint32_t>(PC[-1]).store(DMB, std::memory_order_release); // Back-patch the half-barrier.\n    }\n    std::atomic_ref<uint32_t>(PC[0]).store(STR, std::memory_order_release);\n    ClearICache(&PC[-1], 8);\n    // Back up one instruction and have another go\n    return -4;\n  } else if ((Instr & RCPC2_MASK) == LDAPUR_INST) { // LDAPUR*\n    // Extract the 9-bit offset from the instruction\n    uint32_t LDUR = LDUR_INST;\n    LDUR |= Size << 30;\n    LDUR |= AddrReg << 5;\n    LDUR |= DataReg;\n    LDUR |= Instr & (0b1'1111'1111 << 12);\n    if (HandleType != UnalignedHandlerType::NonAtomic) {\n      // Ordering matters with cross-thread visibility!\n      std::atomic_ref<uint32_t>(PC[1]).store(DMB_LD, std::memory_order_release); // Back-patch the half-barrier.\n    }\n    std::atomic_ref<uint32_t>(PC[0]).store(LDUR, std::memory_order_release);\n    ClearICache(&PC[0], 8);\n    // With the instruction modified, now execute again.\n    return 0;\n  } else if ((Instr & RCPC2_MASK) == STLUR_INST) { // STLUR*\n    uint32_t STUR = STUR_INST;\n    STUR |= Size << 30;\n    STUR |= AddrReg << 5;\n    STUR |= DataReg;\n    STUR |= Instr & (0b1'1111'1111 << 12);\n    if (HandleType != UnalignedHandlerType::NonAtomic) {\n      std::atomic_ref<uint32_t>(PC[-1]).store(DMB, std::memory_order_release); // Back-patch the half-barrier.\n    }\n    std::atomic_ref<uint32_t>(PC[0]).store(STUR, std::memory_order_release);\n\n    ClearICache(&PC[-1], 8);\n    // Back up one instruction and have another go\n    return -4;\n  }\n\n  // Check if another thread backpatched this instruction before this thread got here\n  // Since we got here, this can happen in a couple situations:\n  // - Unhandled instruction (Shouldn't occur, FEX programmer error added a new unhandled atomic)\n  // - Another thread backpatched an atomic access to be a non-atomic access\n  auto AtomicInst = std::atomic_ref<uint32_t>(PC[0]).load(std::memory_order_acquire);\n  if ((AtomicInst & LDSTREGISTER_MASK) == LDR_INST || (AtomicInst & LDSTUNSCALED_MASK) == LDUR_INST) {\n    // This atomic instruction was backpatched to a load.\n    if (HandleType != UnalignedHandlerType::NonAtomic) {\n      // Check if the next instruction is a DMB.\n      auto DMBInst = std::atomic_ref<uint32_t>(PC[1]).load(std::memory_order_acquire);\n      if (DMBInst == DMB_LD) {\n        return 0;\n      }\n    } else {\n      // No DMB instruction with this HandleType.\n      return 0;\n    }\n  } else if ((AtomicInst & LDSTREGISTER_MASK) == STR_INST || (AtomicInst & LDSTUNSCALED_MASK) == STUR_INST) {\n    if (HandleType != UnalignedHandlerType::NonAtomic) {\n      // Check if the previous instruction is a DMB.\n      auto DMBInst = std::atomic_ref<uint32_t>(PC[-1]).load(std::memory_order_acquire);\n      if (DMBInst == DMB) {\n        // Return handled, make sure to adjust PC so we run the DMB.\n        return -4;\n      }\n    } else {\n      // No DMB instruction with this HandleType.\n      return 0;\n    }\n  } else if (AtomicInst == DMB) {\n    // ARMv8.0-a LDAXP backpatch handling. Will have turned in to the following:\n    // - PC[0] = DMB\n    // - PC[1] = STP\n    // - PC[2] = DMB\n    auto STPInst = std::atomic_ref<uint32_t>(PC[1]).load(std::memory_order_acquire);\n    auto DMBInst = std::atomic_ref<uint32_t>(PC[2]).load(std::memory_order_acquire);\n    if ((STPInst & LDSTP_MASK) == STP_INST && DMBInst == DMB) {\n      // Code that was backpatched is what was expected for ARMv8.0-a LDAXP.\n      return 0;\n    }\n  }\n\n  LogMan::Msg::EFmt(\"Unhandled JIT SIGBUS: PC: 0x{:x} Instruction: 0x{:08x}\\n\", ProgramCounter, PC[0]);\n  return std::nullopt;\n}\n\n\n} // namespace FEXCore::ArchHelpers::Arm64\n"
  },
  {
    "path": "FEXCore/Source/Utils/ArchHelpers/Arm64_stubs.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/ArchHelpers/Arm64.h>\n#include <stdint.h>\n\nnamespace FEXCore::ArchHelpers::Arm64 {\n\n#ifndef ARCHITECTURE_arm64\n// These are stub implementations that exist only to allow instantiating the arm64 jit\n// on non arm platforms.\n\n// Obvously such a configuration can't do the actual arm64-specific stuff\n\nstd::optional<int32_t>\nHandleUnalignedAccess(FEXCore::Core::InternalThreadState* Thread, UnalignedHandlerType HandleType, uintptr_t ProgramCounter, uint64_t* GPRs) {\n  ERROR_AND_DIE_FMT(\"HandleAtomicMemOp Not Implemented\");\n}\n\n#endif\n\n} // namespace FEXCore::ArchHelpers::Arm64\n"
  },
  {
    "path": "FEXCore/Source/Utils/BucketList.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <cstddef>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/memory.h>\n\nnamespace FEXCore {\n\n// BucketList is an optimized container, it includes an inline array of Size\n// and can overflow to a linked list of further buckets\n//\n// To optimize for best performance, Size should be big enough to allocate one or two\n// buckets for the typical case\n// Picking a Size so sizeof(Bucket<...>) is a power of two is also a small win\ntemplate<size_t _Size, typename T = uint32_t>\nstruct BucketList {\n  static constexpr size_t Size = _Size;\n\n  T Items[Size];\n  fextl::unique_ptr<BucketList<Size, T>> Next;\n\n  void Clear() {\n    Items[0] = T {};\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    for (size_t i = 1; i < Size; i++) {\n      Items[i] = T {0xDEADBEEF};\n    }\n#endif\n    Next.reset();\n  }\n\n  BucketList() {\n    Clear();\n  }\n\n  template<typename EnumeratorFn>\n  void Iterate(EnumeratorFn Enumerator) const {\n    size_t i = 0;\n    auto Bucket = this;\n\n    while (true) {\n      auto Item = Bucket->Items[i];\n      if (Item == T {}) {\n        break;\n      }\n\n      Enumerator(Item);\n\n      if (++i == Size) {\n        LOGMAN_THROW_A_FMT(Bucket->Next != nullptr, \"Interference bug\");\n        Bucket = Bucket->Next.get();\n        i = 0;\n      }\n    }\n  }\n\n  template<typename EnumeratorFn>\n  bool Find(EnumeratorFn Enumerator) const {\n    size_t i = 0;\n    auto Bucket = this;\n\n    while (true) {\n      auto Item = Bucket->Items[i];\n      if (Item == T {}) {\n        break;\n      }\n\n      if (Enumerator(Item)) {\n        return true;\n      }\n\n      if (++i == Size) {\n        LOGMAN_THROW_A_FMT(Bucket->Next != nullptr, \"Bucket in bad state\");\n        Bucket = Bucket->Next.get();\n        i = 0;\n      }\n    }\n\n    return false;\n  }\n\n  void Append(T Val) {\n    auto that = this;\n\n    while (that->Next) {\n      that = that->Next.get();\n    }\n\n    size_t i;\n    for (i = 0; i < Size; i++) {\n      if (that->Items[i] == T {}) {\n        that->Items[i] = Val;\n        break;\n      }\n    }\n\n    if (i < (Size - 1)) {\n      that->Items[i + 1] = T {};\n    } else {\n      that->Next = fextl::make_unique<BucketList<Size, T>>();\n    }\n  }\n  void Erase(T Val) {\n    size_t i = 0;\n    auto that = this;\n    auto foundThat = this;\n    size_t foundI = 0;\n\n    while (true) {\n      if (that->Items[i] == Val) {\n        foundThat = that;\n        foundI = i;\n        break;\n      } else if (++i == Size) {\n        i = 0;\n        LOGMAN_THROW_A_FMT(that->Next != nullptr, \"Bucket::Erase but element not contained\");\n        that = that->Next.get();\n      }\n    }\n\n    while (true) {\n      if (that->Items[i] == T {}) {\n        foundThat->Items[foundI] = that->Items[i - 1];\n        that->Items[i - 1] = T {};\n        break;\n      } else if (++i == Size) {\n        if (that->Next->Items[0] == T {}) {\n          that->Next.reset();\n          foundThat->Items[foundI] = that->Items[Size - 1];\n          that->Items[Size - 1] = T {};\n          break;\n        }\n        i = 0;\n        that = that->Next.get();\n      }\n    }\n  }\n};\n\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/Source/Utils/Config.h",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXCore/fextl/string.h>\n\nnamespace FEXCore::Config {\nconst fextl::string& GetTelemetryDirectory();\n}\n"
  },
  {
    "path": "FEXCore/Source/Utils/FileLoading.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXCore/Utils/FileLoading.h>\n\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <fcntl.h>\n#include <sys/stat.h>\n#include <span>\n#include <unistd.h>\n#ifdef _WIN32\n#include <fstream>\n#endif\n\nnamespace FEXCore::FileLoading {\n\n#ifndef _WIN32\ntemplate<typename T>\nstatic bool LoadFileImpl(T& Data, const fextl::string& Filepath, size_t FixedSize) {\n  int FD = open(Filepath.c_str(), O_RDONLY);\n\n  if (FD == -1) {\n    return false;\n  }\n\n  size_t FileSize {};\n  if (FixedSize == 0) {\n    struct stat buf;\n    if (fstat(FD, &buf) == 0) {\n      FileSize = buf.st_size;\n    }\n  } else {\n    FileSize = FixedSize;\n  }\n\n  ssize_t CurrentOffset = 0;\n  ssize_t Read = -1;\n  bool LoadedFile {};\n  if (FileSize) {\n    // File size is known upfront\n    Data.resize(FileSize);\n    size_t Remaining = FileSize;\n    while (CurrentOffset != FileSize && (Read = pread(FD, &Data.at(CurrentOffset), Remaining, CurrentOffset)) > 0) {\n      CurrentOffset += Read;\n      Remaining -= Read;\n    }\n\n    LoadedFile = CurrentOffset == FileSize && Read != -1;\n  } else {\n    // The file is either empty or its size is unknown (e.g. procfs data).\n    // Try reading in chunks instead\n    constexpr size_t READ_SIZE = 4096;\n    Data.resize(READ_SIZE);\n\n    while ((Read = pread(FD, &Data.at(CurrentOffset), READ_SIZE, CurrentOffset)) > 0) {\n      CurrentOffset += Read;\n      if ((CurrentOffset + READ_SIZE) > Data.size()) {\n        Data.resize(CurrentOffset + READ_SIZE);\n      }\n    }\n\n    if (Read == -1) {\n      Data.clear();\n      close(FD);\n      return false;\n    }\n\n    // Final resize to ensure there is no garbage data past the end.\n    Data.resize(CurrentOffset + Read);\n\n    LoadedFile = true;\n  }\n  close(FD);\n  return LoadedFile;\n}\n\nssize_t LoadFileToBuffer(const fextl::string& Filepath, std::span<char> Buffer) {\n  int FD = open(Filepath.c_str(), O_RDONLY);\n\n  if (FD == -1) {\n    return -1;\n  }\n\n  ssize_t Read = pread(FD, Buffer.data(), Buffer.size(), 0);\n  close(FD);\n  return Read;\n}\n\n#else\ntemplate<typename T>\nstatic bool LoadFileImpl(T& Data, const fextl::string& Filepath, size_t FixedSize) {\n  std::ifstream f(Filepath.c_str(), std::ios::binary | std::ios::ate);\n  if (f.fail()) {\n    return false;\n  }\n  auto Size = f.tellg();\n  f.seekg(0, std::ios::beg);\n  Data.resize(Size);\n  f.read(Data.data(), Size);\n  return !f.fail();\n}\n\nssize_t LoadFileToBuffer(const fextl::string& Filepath, std::span<char> Buffer) {\n  std::ifstream f(Filepath.c_str(), std::ios::binary | std::ios::ate);\n  return f.readsome(Buffer.data(), Buffer.size());\n}\n\n#endif\n\nbool LoadFile(fextl::vector<char>& Data, const fextl::string& Filepath, size_t FixedSize) {\n  return LoadFileImpl(Data, Filepath, FixedSize);\n}\n\nbool LoadFile(fextl::string& Data, const fextl::string& Filepath, size_t FixedSize) {\n  return LoadFileImpl(Data, Filepath, FixedSize);\n}\n\n} // namespace FEXCore::FileLoading\n"
  },
  {
    "path": "FEXCore/Source/Utils/ForcedAssert.cpp",
    "content": "// SPDX-License-Identifier: MIT\nnamespace FEXCore::Assert {\n// This function can not be inlined\n[[noreturn]]\n__attribute__((noinline, naked)) void ForcedAssert() {\n#ifdef ARCHITECTURE_x86_64\n  asm volatile(\"ud2\");\n#else\n  asm volatile(\"hlt #1\");\n#endif\n}\n} // namespace FEXCore::Assert\n"
  },
  {
    "path": "FEXCore/Source/Utils/LogManager.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: glue|log-manager\n$end_info$\n*/\n\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/fmt.h>\n\nnamespace LogMan {\n\nnamespace Throw {\n  ThrowHandler Handler {};\n  void InstallHandler(ThrowHandler _Handler) {\n    Handler = _Handler;\n  }\n  void UnInstallHandler() {\n    Handler = nullptr;\n  }\n\n  void MFmt(const char* fmt, const fmt::format_args& args) {\n    if (Handler) {\n      auto msg = fextl::fmt::vformat(fmt, args);\n      Handler(msg.c_str());\n    }\n\n    FEX_TRAP_EXECUTION;\n  }\n} // namespace Throw\n\nnamespace Msg {\n  MsgHandler Handler {};\n  void InstallHandler(MsgHandler _Handler) {\n    Handler = _Handler;\n  }\n  void UnInstallHandler() {\n    Handler = nullptr;\n  }\n\n  void MFmtImpl(DebugLevels level, const char* fmt, const fmt::format_args& args) {\n    if (Handler) {\n      const auto msg = fextl::fmt::vformat(fmt, args);\n      Handler(level, msg.c_str());\n    }\n  }\n\n} // namespace Msg\n} // namespace LogMan\n"
  },
  {
    "path": "FEXCore/Source/Utils/LongJump.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXCore/Utils/LongJump.h>\n#include <FEXCore/Utils/LogManager.h>\n\n#include <cstring>\n\nnamespace FEXCore::UncheckedLongJump {\n#if defined(ARCHITECTURE_arm64)\n[[nodiscard]]\nFEX_DEFAULT_VISIBILITY FEX_NAKED uint64_t SetJump(JumpBuf& Buffer) {\n  __asm volatile(R\"(\n      // x0 contains the jumpbuffer\n      stp x19, x20, [x0, #( 0 * 8)];\n      stp x21, x22, [x0, #( 2 * 8)];\n      stp x23, x24, [x0, #( 4 * 8)];\n      stp x25, x26, [x0, #( 6 * 8)];\n      stp x27, x28, [x0, #( 8 * 8)];\n      stp x29, x30, [x0, #(10 * 8)];\n\n      // FPRs\n      stp d8,   d9, [x0, #(12 * 8)];\n      stp d10, d11, [x0, #(14 * 8)];\n      stp d12, d13, [x0, #(16 * 8)];\n      stp d14, d15, [x0, #(18 * 8)];\n\n      // Move SP in to a temporary to store.\n      mov x1, sp;\n      str x1,  [x0, #(20 * 8)];\n\n      // Return zero to signify this is the SetJump.\n      mov x0, #0;\n      ret;\n    )\" ::\n                   : \"memory\");\n}\n\n[[noreturn]]\nFEX_DEFAULT_VISIBILITY FEX_NAKED void LongJump(const JumpBuf& Buffer, uint64_t Value) {\n  __asm volatile(R\"(\n      // x0 contains the jumpbuffer\n      ldp x19, x20, [x0, #( 0 * 8)];\n      ldp x21, x22, [x0, #( 2 * 8)];\n      ldp x23, x24, [x0, #( 4 * 8)];\n      ldp x25, x26, [x0, #( 6 * 8)];\n      ldp x27, x28, [x0, #( 8 * 8)];\n      ldp x29, x30, [x0, #(10 * 8)];\n\n      // FPRs\n      ldp d8,   d9, [x0, #(12 * 8)];\n      ldp d10, d11, [x0, #(14 * 8)];\n      ldp d12, d13, [x0, #(16 * 8)];\n      ldp d14, d15, [x0, #(18 * 8)];\n\n      // Load SP in to temporary then move\n      ldr x0,  [x0, #(20 * 8)];\n      mov sp, x0;\n\n      // Move value in to result register\n      mov x0, x1;\n      ret;\n    )\" ::\n                   : \"memory\");\n}\n\nFEX_DEFAULT_VISIBILITY void ManuallyLoadJumpBuf(const JumpBuf& Buffer, uint64_t Value, uint64_t* GPRs, __uint128_t* FPRs, uint64_t* PC) {\n  // First 12 values are registers [x19,x30].\n  memcpy(&GPRs[19], &Buffer.Registers[0], sizeof(uint64_t) * 12);\n\n  // Next 8 values are [D8,D15]\n  // Retain upper 64-bits of the register, only modifying lower 64-bits.\n  for (size_t i = 0; i < 8; ++i) {\n    memcpy(&FPRs[8 + i], &Buffer.Registers[12 + i], sizeof(uint64_t));\n  }\n\n  // Last value is stack pointer\n  memcpy(&GPRs[31], &Buffer.Registers[20], sizeof(uint64_t));\n\n  // Load the expected value in to X0\n  GPRs[0] = Value;\n\n  // Load the PC with the current LR.\n  *PC = GPRs[30];\n}\n\n#else\n[[nodiscard]]\nFEX_DEFAULT_VISIBILITY FEX_NAKED uint64_t SetJump(JumpBuf& Buffer) {\n  __asm volatile(R\"(\n    .intel_syntax noprefix;\n    // rdi contains the jumpbuffer\n    mov [rdi + (0 * 8)], rbx;\n    mov [rdi + (1 * 8)], rsp;\n    mov [rdi + (2 * 8)], rbp;\n    mov [rdi + (3 * 8)], r12;\n    mov [rdi + (4 * 8)], r13;\n    mov [rdi + (5 * 8)], r14;\n    mov [rdi + (6 * 8)], r15;\n\n    // Return address is on the stack, load it and store\n    mov rsi, [rsp];\n    mov [rdi + (7 * 8)], rsi;\n\n    // Return zero to signify this is the SetJump.\n    mov rax, 0;\n    ret;\n\n    .att_syntax prefix;\n    )\" ::\n                   : \"memory\");\n}\n\n[[noreturn]]\nFEX_DEFAULT_VISIBILITY FEX_NAKED void LongJump(const JumpBuf& Buffer, uint64_t Value) {\n  __asm volatile(R\"(\n    .intel_syntax noprefix;\n    // rdi contains the jumpbuffer\n    mov rbx, [rdi + (0 * 8)];\n    mov rsp, [rdi + (1 * 8)];\n    mov rbp, [rdi + (2 * 8)];\n    mov r12, [rdi + (3 * 8)];\n    mov r13, [rdi + (4 * 8)];\n    mov r14, [rdi + (5 * 8)];\n    mov r15, [rdi + (6 * 8)];\n\n    // Move value in to result register\n    mov rax, rsi;\n\n    // Pop the dead return address off the stack\n    pop rsi;\n\n    // Load the original return address from the jumpbuffer\n    mov rsi, [rdi + (7 * 8)];\n\n    // Return using a jump\n    jmp rsi;\n\n    .att_syntax prefix;\n    )\" ::\n                   : \"memory\");\n}\n\nFEX_DEFAULT_VISIBILITY void ManuallyLoadJumpBuf(JumpBuf& Buffer, uint64_t Value, uint64_t* GPRs, __uint128_t* FPRs, uint64_t* PC) {\n  LOGMAN_MSG_A_FMT(\"This is unimplemented on x86-64\");\n}\n\n#endif\n} // namespace FEXCore::UncheckedLongJump\n"
  },
  {
    "path": "FEXCore/Source/Utils/MemberFunctionToPointer.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/LogManager.h>\n\n#include <cstdint>\n\nnamespace FEXCore::Utils {\n\n/**\n * @brief Casts a class's member function pointer to a raw pointer that we can JIT\n *\n * Has additional validation to ensure we aren't casting a class member that is invalid\n */\ntemplate<typename PointerToMemberType>\nclass MemberFunctionToPointerCast final {\npublic:\n  MemberFunctionToPointerCast(PointerToMemberType Function) {\n    memcpy(&PMF, &Function, sizeof(PMF));\n  }\n\n  uintptr_t GetConvertedPointer() const {\n#ifdef ARCHITECTURE_x86_64\n    // Itanium C++ ABI (https://itanium-cxx-abi.github.io/cxx-abi/abi.html#member-function-pointers)\n    // Low bit of ptr specifies if this Member function pointer is virtual or not\n    // Throw an assert if we were trying to cast a virtual member\n    LOGMAN_THROW_A_FMT((PMF.ptr & 1) == 0, \"C++ Pointer-To-Member representation didn't have low bit set to 0. Are you trying to cast a \"\n                                           \"virtual member?\");\n#elif defined(ARCHITECTURE_arm64)\n    // C++ ABI for the Arm 64-bit Architecture (IHI 0059E)\n    // 4.2.1 Representation of pointer to member function\n    // Differs from Itanium specification\n    LOGMAN_THROW_A_FMT(PMF.adj == 0, \"C++ Pointer-To-Member representation didn't have adj == 0. Are you trying to cast a virtual member?\");\n#else\n#error \"Don't know how to cast Member to function here. Likely just Itanium\"\n#endif\n    return PMF.ptr;\n  }\n\n  // Gets the vtable entry position of a virtual member function.\n  size_t GetVTableOffset() const {\n#ifdef ARCHITECTURE_x86_64\n    // Itanium C++ ABI (https://itanium-cxx-abi.github.io/cxx-abi/abi.html#member-function-pointers)\n    // Low bit of ptr specifies if this Member function pointer is virtual or not\n    // Throw an assert if we are not loading a virtual member.\n    LOGMAN_THROW_A_FMT((PMF.ptr & 1) == 1, \"C++ Pointer-To-Member representation didn't have low bit set to 1. This cast only works for \"\n                                           \"virtual members.\");\n    return PMF.ptr & ~1ULL;\n#elif defined(ARCHITECTURE_arm64)\n    // C++ ABI for the Arm 64-bit Architecture (IHI 0059E)\n    // 4.2.1 Representation of pointer to member function\n    // Differs from Itanium specification\n    LOGMAN_THROW_A_FMT((PMF.adj & 1) == 1, \"C++ Pointer-To-Member representation didn't have adj == 1. This cast only works for virtual \"\n                                           \"members.\");\n    return PMF.ptr;\n#else\n#error \"Don't know how to cast Member to function here. Likely just Itanium\"\n#endif\n  }\n\n  // Gets the pointer to the vtable entry for the object passed it.\n  template<typename Class>\n  uintptr_t GetVTableEntry(Class* VirtualClass) const {\n    // VTable is always stored at the beginning of a class object.\n    uintptr_t* VTable = *reinterpret_cast<uintptr_t**>(VirtualClass);\n\n    size_t Offset = GetVTableOffset() / sizeof(void*);\n    return VTable[Offset];\n  }\n\nprivate:\n  struct PointerToMember {\n    uintptr_t ptr;\n    uintptr_t adj;\n  };\n\n  PointerToMember PMF;\n\n  // Ensure the representation of PointerToMember matches\n  static_assert(sizeof(PMF) == sizeof(PointerToMemberType));\n};\n} // namespace FEXCore::Utils\n"
  },
  {
    "path": "FEXCore/Source/Utils/Profiler.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <cstdint>\n#include <fcntl.h>\n#ifndef _WIN32\n#include <linux/magic.h>\n#include <sys/stat.h>\n#include <sys/vfs.h>\n#endif\n\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/Profiler.h>\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/string.h>\n\n#ifdef ENABLE_FEXCORE_PROFILER\n#if FEXCORE_PROFILER_BACKEND == FEXCORE_PROFILER_BACKEND_GPUVIS\n#include <array>\n#include <limits.h>\n#include <time.h>\n#ifndef _WIN32\nstatic inline uint64_t GetTime() {\n  // We want the time in the least amount of overhead possible\n  // clock_gettime will do a VDSO call with the least amount of overhead\n  struct timespec ts;\n  clock_gettime(CLOCK_MONOTONIC, &ts);\n  return ts.tv_sec * 1'000'000'000ULL + ts.tv_nsec;\n}\n#else\n\nstatic inline uint64_t GetTime() {\n  // GetTime needs to return nanoseconds, query the interface.\n  static uint64_t FrequencyScale = {};\n  if (!FrequencyScale) [[unlikely]] {\n    LARGE_INTEGER Frequency {};\n    while (!QueryPerformanceFrequency(&Frequency))\n      ;\n    constexpr uint64_t NanosecondsInSecond = 1'000'000'000ULL;\n\n    // On WINE this will always result in a scale of 100.\n    FrequencyScale = NanosecondsInSecond / Frequency.QuadPart;\n  }\n  LARGE_INTEGER ticks;\n  while (!QueryPerformanceCounter(&ticks))\n    ;\n  return ticks.QuadPart * FrequencyScale;\n}\n\n#endif\n\nnamespace FEXCore::Profiler {\nProfilerBlock::ProfilerBlock(const std::string_view Format)\n  : DurationBegin {GetTime()}\n  , Format {Format} {}\n\nProfilerBlock::~ProfilerBlock() {\n  auto Duration = GetTime() - DurationBegin;\n  TraceObject(Format, Duration);\n}\n} // namespace FEXCore::Profiler\n\nnamespace GPUVis {\n// ftrace FD for writing trace data.\n// Needs to be a raw FD since we hold this open for the entire application execution.\nstatic int TraceFD {-1};\n\n// Need to search the paths to find the real trace path\nstatic std::array<const char*, 2> TraceFSDirectories {\n  \"/sys/kernel/tracing\",\n  \"/sys/kernel/debug/tracing\",\n};\n\nvoid Init() {\n  FEX_CONFIG_OPT(EnableGpuvisProfiling, ENABLEGPUVISPROFILING);\n  if (!EnableGpuvisProfiling()) {\n    return;\n  }\n  for (auto Path : TraceFSDirectories) {\n#ifdef _WIN32\n    constexpr auto flags = O_WRONLY;\n#else\n    constexpr auto flags = O_WRONLY | O_CLOEXEC;\n#endif\n    fextl::string FilePath = fextl::fmt::format(\"{}/trace_marker\", Path);\n    TraceFD = open(FilePath.c_str(), flags);\n    if (TraceFD != -1) {\n      // Opened TraceFD, early exit\n      break;\n    }\n  }\n}\n\nvoid Shutdown() {\n  if (TraceFD != -1) {\n    close(TraceFD);\n    TraceFD = -1;\n  }\n}\n\nvoid TraceObject(const std::string_view Format, uint64_t Duration) {\n  if (TraceFD != -1) {\n    // Print the duration as something that began negative duration ago\n    const auto StringSize = Format.size() + strlen(\" (lduration=-)\\n\") + 22;\n    auto Event = reinterpret_cast<char*>(alloca(StringSize));\n    auto Res = ::fmt::format_to_n(Event, StringSize, \"{} (lduration=-{})\\n\", Format, Duration);\n    write(TraceFD, Event, Res.size);\n  }\n}\n\nvoid TraceObject(const std::string_view Format) {\n  if (TraceFD != -1) {\n    const auto StringSize = Format.size() + 1;\n    auto Event = reinterpret_cast<char*>(alloca(StringSize));\n    auto Res = ::fmt::format_to_n(Event, StringSize, \"{}\\n\", Format);\n    write(TraceFD, Event, Res.size);\n  }\n}\n} // namespace GPUVis\n#elif FEXCORE_PROFILER_BACKEND == FEXCORE_PROFILER_BACKEND_TRACY\n#include \"tracy/Tracy.hpp\"\nnamespace Tracy {\nstatic int EnableAfterFork = 0;\nstatic bool Enable = false;\n\nvoid Init(std::string_view ProgramName, std::string_view ProgramPath) {\n  const char* ProfileTargetName = getenv(\"FEX_PROFILE_TARGET_NAME\"); // Match by application name\n  const char* ProfileTargetPath = getenv(\"FEX_PROFILE_TARGET_PATH\"); // Match by path suffix\n  const char* WaitForFork = getenv(\"FEX_PROFILE_WAIT_FOR_FORK\");     // Don't enable profiling until the process forks N times\n  bool Matched = (ProfileTargetName && ProgramName == ProfileTargetName) || (ProfileTargetPath && ProgramPath.ends_with(ProfileTargetPath));\n  if (Matched && WaitForFork) {\n    EnableAfterFork = std::atoi(WaitForFork);\n  }\n  Enable = Matched && !EnableAfterFork;\n  if (Enable) {\n    tracy::StartupProfiler();\n    LogMan::Msg::IFmt(\"Tracy profiling started\");\n  } else if (EnableAfterFork) {\n    LogMan::Msg::IFmt(\"Tracy profiling will start after fork\");\n  }\n}\n\nvoid PostForkAction(bool IsChild) {\n  if (Enable) {\n    // Tracy does not support multiprocess profiling\n    LogMan::Msg::EFmt(\"Warning: Profiling a process with forks is not supported. Set the environment variable \"\n                      \"FEX_PROFILE_WAIT_FOR_FORK=<n> to start profiling after the n-th fork.\");\n  }\n\n  if (IsChild) {\n    Enable = false;\n    return;\n  }\n\n  if (EnableAfterFork > 1) {\n    --EnableAfterFork;\n    LogMan::Msg::IFmt(\"Tracy profiling will start after {} forks\", EnableAfterFork);\n  } else if (EnableAfterFork == 1) {\n    Enable = true;\n    EnableAfterFork = 0;\n    tracy::StartupProfiler();\n    LogMan::Msg::IFmt(\"Tracy profiling started\");\n  }\n}\n\nvoid Shutdown() {\n  if (Tracy::Enable) {\n    LogMan::Msg::IFmt(\"Stopping Tracy profiling\");\n    tracy::ShutdownProfiler();\n  }\n}\n\nvoid TraceObject(const std::string_view Format, uint64_t Duration) {}\n\nvoid TraceObject(const std::string_view Format) {\n  if (Tracy::Enable) {\n    TracyMessage(Format.data(), Format.size());\n  }\n}\n} // namespace Tracy\n#else\n#error Unknown profiler backend\n#endif\n#endif\n\nnamespace FEXCore::Profiler {\n\n#ifdef ENABLE_FEXCORE_PROFILER\nvoid Init(std::string_view ProgramName, std::string_view ProgramPath) {\n#if FEXCORE_PROFILER_BACKEND == FEXCORE_PROFILER_BACKEND_GPUVIS\n  GPUVis::Init();\n#elif FEXCORE_PROFILER_BACKEND == FEXCORE_PROFILER_BACKEND_TRACY\n  Tracy::Init(ProgramName, ProgramPath);\n#endif\n}\n\nvoid PostForkAction(bool IsChild) {\n#if FEXCORE_PROFILER_BACKEND == FEXCORE_PROFILER_BACKEND_TRACY\n  Tracy::PostForkAction(IsChild);\n#endif\n}\n\nbool IsActive() {\n#if FEXCORE_PROFILER_BACKEND == FEXCORE_PROFILER_BACKEND_GPUVIS\n  // Always active\n  return true;\n#elif FEXCORE_PROFILER_BACKEND == FEXCORE_PROFILER_BACKEND_TRACY\n  // Active if previously enabled\n  return Tracy::Enable;\n#endif\n}\n\nvoid Shutdown() {\n#if FEXCORE_PROFILER_BACKEND == FEXCORE_PROFILER_BACKEND_GPUVIS\n  GPUVis::Shutdown();\n#elif FEXCORE_PROFILER_BACKEND == FEXCORE_PROFILER_BACKEND_TRACY\n  Tracy::Shutdown();\n#endif\n}\n\nvoid TraceObject(const std::string_view Format, uint64_t Duration) {\n#if FEXCORE_PROFILER_BACKEND == FEXCORE_PROFILER_BACKEND_GPUVIS\n  GPUVis::TraceObject(Format, Duration);\n#elif FEXCORE_PROFILER_BACKEND == FEXCORE_PROFILER_BACKEND_TRACY\n  Tracy::TraceObject(Format, Duration);\n#endif\n}\n\nvoid TraceObject(const std::string_view Format) {\n#if FEXCORE_PROFILER_BACKEND == FEXCORE_PROFILER_BACKEND_GPUVIS\n  GPUVis::TraceObject(Format);\n#elif FEXCORE_PROFILER_BACKEND == FEXCORE_PROFILER_BACKEND_TRACY\n  Tracy::TraceObject(Format);\n#endif\n}\n\n#endif\n} // namespace FEXCore::Profiler\n"
  },
  {
    "path": "FEXCore/Source/Utils/SpinWaitLock.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Utils/SpinWaitLock.h\"\n\nnamespace FEXCore::Utils::SpinWaitLock {\n#ifdef ARCHITECTURE_arm64\nconstexpr uint64_t NanosecondsInSecond = 1'000'000'000ULL;\n\nstatic uint64_t GetCycleCounterFrequency() {\n  uint64_t Result {};\n  __asm(\"mrs %[Res], CNTFRQ_EL0\" : [Res] \"=r\"(Result));\n  return Result;\n}\n\nstatic uint64_t CalculateCyclesPerNanosecond() {\n  // Snapdragon devices historically use a 19.2Mhz cycle counter frequency\n  // This means that the number of cycles per nanosecond ends up being 52.0833...\n  //\n  // ARMv8.6 and ARMv9.1 requires the cycle counter frequency to be 1Ghz.\n  // This means the number of cycles per nanosecond ends up being 1.\n  uint64_t CounterFrequency = GetCycleCounterFrequency();\n  return NanosecondsInSecond / CounterFrequency;\n}\n\nuint64_t CycleCounterFrequency = GetCycleCounterFrequency();\nuint64_t CyclesPerNanosecond = CalculateCyclesPerNanosecond();\n#endif\n} // namespace FEXCore::Utils::SpinWaitLock\n"
  },
  {
    "path": "FEXCore/Source/Utils/SpinWaitLock.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <atomic>\n#include <chrono>\n#include <mutex>\n#include <type_traits>\n\n#include <FEXCore/fextl/functional.h>\n#include <FEXCore/Utils/EnumUtils.h>\n\nnamespace FEXCore::Utils::SpinWaitLock {\n/**\n * @brief This provides routines to implement implement an \"efficient spin-loop\" using ARM's WFE and exclusive monitor interfaces.\n *\n * Spin-loops on mobile devices with a battery can be a bad idea as they burn a bunch of power. This attempts to mitigate some of the impact\n * by putting the CPU in to a lower-power state using WFE.\n * On platforms tested, WFE will put the CPU in to a lower power state for upwards of 0.11ms(!) per WFE. Which isn't a significant amount of\n * time but should still have power savings. Ideally WFE would be able to keep the CPU in a lower power state for longer. This also has the\n * added benefit that atomics aren't abusing the caches when spinning on a cacheline, which has knock-on powersaving benefits.\n *\n * This short timeout is because the Linux kernel has a 100 microsecond architecture timer which wakes up WFE and WFI. Nothing can be\n * improved beyond that period.\n *\n * FEAT_WFxT adds a new instruction with a timeout, but since the spurious wake-up is so aggressive it isn't worth using.\n *\n * It should be noted that this implementation has a few dozen cycles of start-up time. Which means the overhead for invoking this\n * implementation is slightly higher than a true spin-loop. The hot loop body itself is only three instructions so it is quite efficient.\n *\n * On non-ARM platforms it is truly a spin-loop, which is okay for debugging only.\n */\n#ifdef ARCHITECTURE_arm64\n\n#define LOADEXCLUSIVE(LoadExclusiveOp, RegSize)                 \\\n  /* Prime the exclusive monitor with the passed in address. */ \\\n  #LoadExclusiveOp \" %\" #RegSize \"[Result], [%[Futex]];\\n\"\n\n#define SPINLOOP_BODY(LoadAtomicOp, RegSize)                               \\\n  /* WFE will wait for either the memory to change or spurious wake-up. */ \\\n  \"wfe;\\n\" /* Load with acquire to get the result of memory. */            \\\n    #LoadAtomicOp \" %\" #RegSize \"[Result], [%[Futex]];\\n\"\n\n#define SPINLOOP_WFE_LDX_8BIT LOADEXCLUSIVE(ldaxrb, w)\n#define SPINLOOP_WFE_LDX_16BIT LOADEXCLUSIVE(ldaxrh, w)\n#define SPINLOOP_WFE_LDX_32BIT LOADEXCLUSIVE(ldaxr, w)\n#define SPINLOOP_WFE_LDX_64BIT LOADEXCLUSIVE(ldaxr, x)\n\n#define SPINLOOP_8BIT SPINLOOP_BODY(ldarb, w)\n#define SPINLOOP_16BIT SPINLOOP_BODY(ldarh, w)\n#define SPINLOOP_32BIT SPINLOOP_BODY(ldar, w)\n#define SPINLOOP_64BIT SPINLOOP_BODY(ldar, x)\n\nextern uint64_t CycleCounterFrequency;\nextern uint64_t CyclesPerNanosecond;\n\n///< Get the raw cycle counter which is synchronizing.\n/// `CNTVCTSS_EL0` also does the same thing, but requires the FEAT_ECV feature.\nstatic inline uint64_t GetCycleCounter() {\n  uint64_t Result {};\n  __asm volatile(R\"(\n      isb;\n      mrs %[Res], CNTVCT_EL0;\n    )\"\n                 : [Res] \"=r\"(Result));\n  return Result;\n}\n\n///< Converts nanoseconds to number of cycles.\n/// If the cycle counter is 1Ghz then this is a direct 1:1 map.\nstatic inline uint64_t ConvertNanosecondsToCycles(const std::chrono::nanoseconds& Nanoseconds) {\n  const auto NanosecondCount = Nanoseconds.count();\n  return NanosecondCount / CyclesPerNanosecond;\n}\n\nstatic inline uint8_t LoadExclusive(uint8_t* Futex) {\n  uint8_t Result {};\n  __asm volatile(SPINLOOP_WFE_LDX_8BIT : [Result] \"=r\"(Result), [Futex] \"+r\"(Futex)::\"memory\");\n\n  return Result;\n}\n\nstatic inline uint16_t LoadExclusive(uint16_t* Futex) {\n  uint16_t Result {};\n  __asm volatile(SPINLOOP_WFE_LDX_16BIT : [Result] \"=r\"(Result), [Futex] \"+r\"(Futex)::\"memory\");\n\n  return Result;\n}\n\nstatic inline uint32_t LoadExclusive(uint32_t* Futex) {\n  uint32_t Result {};\n  __asm volatile(SPINLOOP_WFE_LDX_32BIT : [Result] \"=r\"(Result), [Futex] \"+r\"(Futex)::\"memory\");\n\n  return Result;\n}\n\nstatic inline uint64_t LoadExclusive(uint64_t* Futex) {\n  uint64_t Result {};\n  __asm volatile(SPINLOOP_WFE_LDX_64BIT : [Result] \"=r\"(Result), [Futex] \"+r\"(Futex)::\"memory\");\n\n  return Result;\n}\n\nstatic inline uint8_t WFELoadAtomic(uint8_t* Futex) {\n  uint8_t Result {};\n  __asm volatile(SPINLOOP_8BIT : [Result] \"=r\"(Result), [Futex] \"+r\"(Futex)::\"memory\");\n\n  return Result;\n}\n\nstatic inline uint16_t WFELoadAtomic(uint16_t* Futex) {\n  uint16_t Result {};\n  __asm volatile(SPINLOOP_16BIT : [Result] \"=r\"(Result), [Futex] \"+r\"(Futex)::\"memory\");\n\n  return Result;\n}\n\nstatic inline uint32_t WFELoadAtomic(uint32_t* Futex) {\n  uint32_t Result {};\n  __asm volatile(SPINLOOP_32BIT : [Result] \"=r\"(Result), [Futex] \"+r\"(Futex)::\"memory\");\n\n  return Result;\n}\n\nstatic inline uint64_t WFELoadAtomic(uint64_t* Futex) {\n  uint64_t Result {};\n  __asm volatile(SPINLOOP_64BIT : [Result] \"=r\"(Result), [Futex] \"+r\"(Futex)::\"memory\");\n\n  return Result;\n}\n\ntemplate<typename Pred, typename T>\nstatic inline void WaitPred(T* Futex, T ComparisonValue) {\n  auto AtomicFutex = std::atomic_ref<T>(*Futex);\n  T Result = AtomicFutex.load();\n\n  while (!Pred {}(Result, ComparisonValue)) {\n    Result = LoadExclusive(Futex);\n    if (Pred {}(Result, ComparisonValue)) {\n      return;\n    }\n\n    Result = WFELoadAtomic(Futex);\n  }\n}\n\ntemplate<typename T, typename TT>\nstatic inline bool Wait(T* Futex, TT ExpectedValue, const std::chrono::nanoseconds& Timeout) {\n  auto AtomicFutex = std::atomic_ref<T>(*Futex);\n\n  T Result = AtomicFutex.load();\n\n  // Early exit if possible.\n  if (Result == ExpectedValue) {\n    return true;\n  }\n\n  const auto TimeoutCycles = ConvertNanosecondsToCycles(Timeout);\n  const auto Begin = GetCycleCounter();\n\n  do {\n    Result = LoadExclusive(Futex);\n    if (Result == ExpectedValue) {\n      return true;\n    }\n    Result = WFELoadAtomic(Futex);\n\n    const auto CurrentCycleCounter = GetCycleCounter();\n    if ((CurrentCycleCounter - Begin) >= TimeoutCycles) {\n      // Couldn't get value before timeout.\n      return false;\n    }\n  } while (Result != ExpectedValue);\n\n  // We got our result.\n  return true;\n}\n\ntemplate bool Wait<uint8_t>(uint8_t*, uint8_t, const std::chrono::nanoseconds&);\ntemplate bool Wait<uint16_t>(uint16_t*, uint16_t, const std::chrono::nanoseconds&);\ntemplate bool Wait<uint32_t>(uint32_t*, uint32_t, const std::chrono::nanoseconds&);\ntemplate bool Wait<uint64_t>(uint64_t*, uint64_t, const std::chrono::nanoseconds&);\n\ntemplate<typename T>\nstatic inline T OneShotWFEBitComparison(T* Futex, T Mask, T Comp) {\n  auto AtomicFutex = std::atomic_ref<T>(*Futex);\n  T Result = AtomicFutex.load();\n\n  // Early exit if possible.\n  if ((Result & Mask) == Comp) {\n    return Result;\n  }\n\n  Result = LoadExclusive(Futex);\n  if ((Result & Mask) == Comp) {\n    return Result;\n  }\n\n  // Waits for write and returns result.\n  Result = WFELoadAtomic(Futex);\n  return Result;\n}\n\n#else\n\ntemplate<typename Pred, typename T>\nstatic inline void WaitPred(T* Futex, T ComparisonValue) {\n  auto AtomicFutex = std::atomic_ref<T>(*Futex);\n  T Result = AtomicFutex.load();\n\n  while (!Pred {}(Result, ComparisonValue)) {\n    Result = AtomicFutex.load();\n  }\n}\n\ntemplate<typename T, typename TT>\nstatic inline bool Wait(T* Futex, TT ExpectedValue, const std::chrono::nanoseconds& Timeout) {\n  auto AtomicFutex = std::atomic_ref<T>(*Futex);\n\n  T Result = AtomicFutex.load();\n\n  // Early exit if possible.\n  if (Result == ExpectedValue) {\n    return true;\n  }\n\n  const auto Begin = std::chrono::high_resolution_clock::now();\n\n  do {\n    Result = AtomicFutex.load();\n\n    const auto CurrentCycleCounter = std::chrono::high_resolution_clock::now();\n    if ((CurrentCycleCounter - Begin) >= Timeout) {\n      // Couldn't get value before timeout.\n      return false;\n    }\n  } while (Result != ExpectedValue);\n\n  // We got our result.\n  return true;\n}\n#endif\n\ntemplate<typename T, typename TT = T>\nstatic inline void Wait(T* Futex, TT ExpectedValue) {\n  WaitPred<std::equal_to<>, T>(Futex, ExpectedValue);\n}\n\ntemplate void Wait<uint8_t>(uint8_t*, uint8_t);\ntemplate void Wait<uint16_t>(uint16_t*, uint16_t);\ntemplate void Wait<uint32_t>(uint32_t*, uint32_t);\ntemplate void Wait<uint64_t>(uint64_t*, uint64_t);\n\ntemplate<typename T>\nstatic inline void lock(T* Futex) {\n  auto AtomicFutex = std::atomic_ref<T>(*Futex);\n  T Expected {};\n  T Desired {1};\n\n  // Try to CAS immediately.\n  if (AtomicFutex.compare_exchange_strong(Expected, Desired)) {\n    return;\n  }\n\n  do {\n    // Wait until the futex is unlocked.\n    Wait(Futex, 0);\n    Expected = 0;\n  } while (!AtomicFutex.compare_exchange_strong(Expected, Desired));\n}\n\ntemplate<typename T>\nstatic inline bool try_lock(T* Futex) {\n  auto AtomicFutex = std::atomic_ref<T>(*Futex);\n  T Expected {};\n  T Desired {1};\n\n  // Try to CAS immediately.\n  if (AtomicFutex.compare_exchange_strong(Expected, Desired)) {\n    return true;\n  }\n\n  return false;\n}\n\ntemplate<typename T>\nstatic inline void unlock(T* Futex) {\n  auto AtomicFutex = std::atomic_ref<T>(*Futex);\n  AtomicFutex.store(0);\n}\n\n#undef SPINLOOP_8BIT\n#undef SPINLOOP_16BIT\n#undef SPINLOOP_32BIT\n#undef SPINLOOP_64BIT\ntemplate<typename T>\nclass UniqueSpinMutex final {\npublic:\n  // Move-only type\n  UniqueSpinMutex(const UniqueSpinMutex&) = delete;\n  UniqueSpinMutex& operator=(const UniqueSpinMutex&) = delete;\n  UniqueSpinMutex(UniqueSpinMutex&& rhs) = default;\n  UniqueSpinMutex& operator=(UniqueSpinMutex&&) = default;\n\n  UniqueSpinMutex(T* Futex)\n    : Futex {Futex} {\n    FEXCore::Utils::SpinWaitLock::lock(Futex);\n  }\n\n  ~UniqueSpinMutex() {\n    FEXCore::Utils::SpinWaitLock::unlock(Futex);\n  }\nprivate:\n  T* Futex;\n};\n} // namespace FEXCore::Utils::SpinWaitLock\n"
  },
  {
    "path": "FEXCore/Source/Utils/Telemetry.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Utils/File.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/Telemetry.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXHeaderUtils/Filesystem.h>\n\n#include \"Utils/Config.h\"\n\n#include <array>\n#include <stddef.h>\n#include <string_view>\n#include <system_error>\n\nnamespace FEXCore::Telemetry {\n#ifndef FEX_DISABLE_TELEMETRY\nstd::array<Value, FEXCore::Telemetry::TelemetryType::TYPE_LAST> TelemetryValues = {{}};\nconst std::array<std::string_view, FEXCore::Telemetry::TelemetryType::TYPE_LAST> TelemetryNames {\n  \"64byte Split Locks\",\n  \"16byte Split atomics\",\n  \"EVEX instructions (AVX512)\",\n  \"16bit CAS Tear\",\n  \"32bit CAS Tear\",\n  \"64bit CAS Tear\",\n  \"128bit CAS Tear\",\n  \"Crash mask\",\n  \"Write 32-bit Segment ES\",\n  \"Write 32-bit Segment SS\",\n  \"Write 32-bit Segment CS\",\n  \"Write 32-bit Segment DS\",\n  \"Uses 32-bit Segment ES\",\n  \"Uses 32-bit Segment SS\",\n  \"Uses 32-bit Segment CS\",\n  \"Uses 32-bit Segment DS\",\n  \"Non-Canonical 64-bit address access\",\n};\n\nstatic bool Enabled {true};\nvoid Initialize() {\n  FEX_CONFIG_OPT(DisableTelemetry, DISABLETELEMETRY);\n  if (DisableTelemetry) {\n    Enabled = false;\n    return;\n  }\n\n  const auto& DataDirectory = Config::GetTelemetryDirectory();\n\n  // Ensure the folder structure is created for our configuration\n  if (!FHU::Filesystem::Exists(DataDirectory) && !FHU::Filesystem::CreateDirectories(DataDirectory)) {\n    LogMan::Msg::IFmt(\"Couldn't create telemetry Folder\");\n  }\n}\n\nvoid Shutdown(const fextl::string& ApplicationName) {\n  if (!Enabled) {\n    return;\n  }\n\n  auto DataDirectory = Config::GetTelemetryDirectory() + ApplicationName + \".telem\";\n\n  // Retain a single backup if the telemetry already existed.\n  auto Backup = DataDirectory + \".bck\";\n\n  // Failure on rename is okay.\n  (void)FHU::Filesystem::RenameFile(DataDirectory, Backup);\n\n  auto File = FEXCore::File::File(DataDirectory.c_str(),\n                                  FEXCore::File::FileModes::WRITE | FEXCore::File::FileModes::CREATE | FEXCore::File::FileModes::TRUNCATE);\n\n  if (File.IsValid()) {\n    for (size_t i = 0; i < TelemetryType::TYPE_LAST; ++i) {\n      auto& Name = TelemetryNames.at(i);\n      auto& Data = TelemetryValues.at(i);\n      fextl::fmt::print(File, \"{}: {}\\n\", Name, Data.load());\n    }\n    File.Flush();\n  }\n}\n\n#endif\n} // namespace FEXCore::Telemetry\n"
  },
  {
    "path": "FEXCore/Source/Utils/Threads.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/Threads.h>\n#include <FEXCore/fextl/memory.h>\n\n#include <pthread.h>\n#include <unistd.h>\n\nnamespace FEXCore::Threads {\nstatic fextl::unique_ptr<FEXCore::Threads::Thread> CreateThread_Default(ThreadFunc Func, void* Arg) {\n  ERROR_AND_DIE_FMT(\"Frontend didn't setup thread creation!\");\n}\n\nstatic void CleanupAfterFork_Default() {\n  ERROR_AND_DIE_FMT(\"Frontend didn't setup thread creation!\");\n}\n\nstatic FEXCore::Threads::Pointers Ptrs = {\n  .CreateThread = CreateThread_Default,\n  .CleanupAfterFork = CleanupAfterFork_Default,\n};\n\nfextl::unique_ptr<FEXCore::Threads::Thread> FEXCore::Threads::Thread::Create(ThreadFunc Func, void* Arg) {\n  return Ptrs.CreateThread(Func, Arg);\n}\n\nvoid FEXCore::Threads::Thread::CleanupAfterFork() {\n  return Ptrs.CleanupAfterFork();\n}\n\nvoid FEXCore::Threads::Thread::SetInternalPointers(const Pointers& _Ptrs) {\n  Ptrs = _Ptrs;\n}\n} // namespace FEXCore::Threads\n"
  },
  {
    "path": "FEXCore/Source/Utils/WritePriorityMutex.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <atomic>\n#include <cstdint>\n\n#if !defined(_WIN32)\n#include <linux/futex.h> /* Definition of FUTEX_* constants */\n#include <sys/syscall.h> /* Definition of SYS_* constants */\n#include <unistd.h>\n#else\n#include <synchapi.h>\n#endif\n\n#include <FEXCore/Utils/LogManager.h>\n\n#include \"Utils/SpinWaitLock.h\"\n\nnamespace FEXCore::Utils::WritePriorityMutex {\n\n// A custom mutex that prioritizes exclusive locks.\n// In highly contested scenarios, this can help minimize overall contention time.\n//\n// Features:\n//  - Up to 32767 pending exclusive locks (\"writers\")\n//  - Up to 32767 pending shared_locks (\"readers\")\n//  - Low-overhead waiting via WFE with a fallback to futex on timeout\n//  - Direct writer->reader hand-off and vice-versa to further reduce overhead\n//\n// Trade-offs:\n//  - No guaranteed order of wake-ups besides prioritizing writers\n//  - No support for recursive locking\n//  - We can't use FUTEX_LOCK_PI to enable priority inheritance\nclass Mutex final {\npublic:\n  Mutex() = default;\n\n  // Move-only type\n  Mutex(const Mutex&) = delete;\n  Mutex& operator=(const Mutex&) = delete;\n  Mutex(Mutex&& rhs) = delete;\n  Mutex& operator=(Mutex&&) = delete;\n\n  void lock() {\n    // Try a non-blocking lock first.\n    if (try_lock()) {\n      return;\n    }\n\n    // Try a quick WFE write-lock.\n    if (Attempt_WFE_WriteLock()) {\n      return;\n    }\n\n    // Still couldn't get it. Start waiting.\n    auto AtomicFutex = std::atomic_ref<uint32_t>(Futex);\n\n    uint32_t Expected {};\n    uint32_t Desired {};\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    Expected = AtomicFutex.load(std::memory_order_relaxed);\n    do {\n      // Increment the number of write waiters.\n      Desired = Expected + WRITE_WAITER_INCREMENT;\n\n      LOGMAN_THROW_A_FMT((Desired & WRITE_WAITER_COUNT_MASK) != 0, \"Overflow in write-waiters!\");\n    } while (AtomicFutex.compare_exchange_strong(Expected, Desired, std::memory_order_acq_rel, std::memory_order_acquire) == false);\n#else\n    // Increment the number of writers waiting. The following loop will attempt to acquire the write-lock while decrementing the waiter count.\n    Expected = AtomicFutex.fetch_add(WRITE_WAITER_INCREMENT);\n    Desired = Expected + WRITE_WAITER_INCREMENT;\n#endif\n\n    // Thread added to waiter list.\n    Expected = Desired;\n\n    while (true) {\n      bool Sleep = false;\n\n      do {\n        if ((Expected & WRITE_OWNED_BIT) == 0 && (Expected & READ_OWNER_COUNT_MASK) == 0) {\n          // If not write-owned, and no read-owners, try to acquire.\n          LOGMAN_THROW_A_FMT((Expected & WRITE_WAITER_COUNT_MASK) != 0, \"Underflow in write-waiters!\");\n\n          // Add write-owned bit.\n          Desired = Expected | WRITE_OWNED_BIT;\n\n          // Remove ourselves from the wait list.\n          Desired -= WRITE_WAITER_INCREMENT;\n\n          Sleep = false;\n        } else {\n          // Already write-owned or read-locked. Go to sleep.\n          Desired = Expected;\n          Sleep = true;\n          break;\n        }\n\n      } while (AtomicFutex.compare_exchange_strong(Expected, Desired, std::memory_order_acq_rel, std::memory_order_acquire) == false);\n\n      if (!Sleep) {\n        // Acquired early.\n        LOGMAN_THROW_A_FMT((Desired & WRITE_OWNED_BIT) == WRITE_OWNED_BIT, \"Somehow acquired a write-lock without it being set!\");\n        return;\n      }\n\n      // Two paths to get here.\n      // Desired[31] = 1 (WRITE_OWNED_BIT)\n      // OR\n      // Desired[15:0] != 0 (READ_OWNER_COUNT_MASK)\n      // Meaning that there was already a writer that owned the lock, or reads were owning it.\n      // This thread already incremented `WRITE_WAITER_INCREMENT` before this loop.\n      // - Linux waits for the full 32-bits to change (With bitset wakeup).\n      // - Win32 also waits for the full 32-bits to change (with offset addr on the reader side to reduce stampeding).\n      FutexWaitForWriteAvailable(Desired);\n\n      Expected = AtomicFutex.load(std::memory_order_relaxed);\n    }\n  }\n\n  void lock_shared() {\n    // Try an uncontended lock first.\n    if (try_lock_shared()) {\n      return;\n    }\n\n    // Try a quick WFE read-lock.\n    if (Attempt_WFE_ReadLock()) {\n      return;\n    }\n\n    auto AtomicFutex = std::atomic_ref<uint32_t>(Futex);\n\n    uint32_t Expected = AtomicFutex.load(std::memory_order_relaxed);\n    uint32_t Desired {};\n\n    while (true) {\n      bool Sleep = false;\n      do {\n        if ((Expected & WRITE_OWNED_BIT) == 0 && (Expected & WRITE_WAITER_COUNT_MASK) == 0) {\n          // If no write-owner and no write-waiting, try and acquire.\n\n          Desired = Expected + READ_OWNER_INCREMENT;\n          LOGMAN_THROW_A_FMT((Desired & READ_OWNER_COUNT_MASK) != 0, \"Overflow in read-owners!\");\n          Sleep = false;\n        } else {\n          // Waiting for lock to become available. Add to waiters.\n          Desired = Expected | READ_WAITER_BIT;\n          Sleep = true;\n        }\n      } while (AtomicFutex.compare_exchange_strong(Expected, Desired, std::memory_order_acq_rel, std::memory_order_acquire) == false);\n\n      if (!Sleep) {\n        // Acquired early.\n        LOGMAN_THROW_A_FMT((Desired & WRITE_OWNED_BIT) != WRITE_OWNED_BIT, \"Somehow read-locked and got a write lock!\");\n        return;\n      }\n\n      // Only one path to get here.\n      // Desired[31][29:16] != 0 (Either writer-owned, or writer-waiting)\n      // Desired[30][15:0]  == READ_WAIT_BIT and number of read-owners (draining to zero as write-side is set)\n      // - Linux waits for full 32-bit futex.\n      // - Win32 waits for upper 16-bits to not match (Either zero writer owned, writer-wait is draining, and `READ_WAITER_BIT` changed).\n      // Can get some spurious wake-ups which will `or` the `READ_WAITER_BIT` again, which does nothing.\n      FutexWaitForReadAvailable(Desired);\n\n      Expected = AtomicFutex.load(std::memory_order_relaxed);\n    }\n  }\n\n  void unlock() {\n    auto AtomicFutex = std::atomic_ref<uint32_t>(Futex);\n\n    uint32_t Expected = AtomicFutex.load(std::memory_order_relaxed);\n    uint32_t Desired {};\n    do {\n      LOGMAN_THROW_A_FMT((Expected & WRITE_OWNED_BIT) == WRITE_OWNED_BIT, \"Trying to write-unlock something not write-locked!\");\n      // Remove the exclusive lock bit.\n      Desired = Expected & ~WRITE_OWNED_BIT;\n\n      // If no more writers, then make sure to clear the read-waiters bit as well.\n      if ((Desired & WRITE_WAITER_COUNT_MASK) == 0) {\n        Desired &= ~READ_WAITER_BIT;\n      }\n    } while (AtomicFutex.compare_exchange_strong(Expected, Desired, std::memory_order_acq_rel, std::memory_order_acquire) == false);\n\n    // `Expected` has old value. Containing `READ_WAITER_BIT` which was just masked off, and also `WRITE_WAITER_COUNT_MASK`.\n    //\n    // Two paths here to be careful about dead-locking other waiters:\n    // - If there are any writers waiting, those get priority to wake.\n    // - If there are zero writers waiting, and there are read waiters then make sure to wake them all.\n    // Failure to send wake events can cause readers to \"infinitely\" hang! (ignoring spurious wake-up).\n    if ((Expected & WRITE_WAITER_COUNT_MASK)) {\n      // Handle write-write handoff.\n      FutexWakeWriter();\n    } else if ((Expected & READ_WAITER_BIT)) {\n      // Handle write-reader handoff.\n      FutexWakeReaders();\n    }\n  }\n\n  void unlock_shared() {\n    auto AtomicFutex = std::atomic_ref<uint32_t>(Futex);\n\n    uint32_t Desired {};\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    uint32_t Expected = AtomicFutex.load(std::memory_order_relaxed);\n    do {\n      LOGMAN_THROW_A_FMT((Expected & WRITE_OWNED_BIT) != WRITE_OWNED_BIT, \"Trying to read-unlock something write-locked!\");\n      LOGMAN_THROW_A_FMT((Expected & READ_OWNER_COUNT_MASK) != 0, \"Trying to read-unlock something not read-locked!\");\n\n      // Decrement the shared counter.\n      Desired = Expected - READ_OWNER_INCREMENT;\n    } while (AtomicFutex.compare_exchange_strong(Expected, Desired, std::memory_order_acq_rel, std::memory_order_acquire) == false);\n#else\n    Desired = AtomicFutex.fetch_sub(READ_OWNER_INCREMENT) - READ_OWNER_INCREMENT;\n#endif\n\n    // Handle read->write handoff if there are any waiting writers, and no readers left.\n    // Only one path here but still need to be careful to not dead-lock waiting writers.\n    // - If there are waiters /but/ this is not the final unlock_shared, then don't wake writer.\n    //   - Writer would wake and immediately sleep again if we woke on every unlock_shared.\n    // - If there are waiters and this is the final unlock_shared, then wake a /single/ writer.\n    // - We ignore any reader-waiters here as they must wait their turn for writers that are waiting.\n    if ((Desired & WRITE_WAITER_COUNT_MASK) && (Desired & READ_OWNER_COUNT_MASK) == 0) {\n      FutexWakeWriter();\n    }\n  }\n\n  bool try_lock() {\n    auto AtomicFutex = std::atomic_ref<uint32_t>(Futex);\n\n    uint32_t Expected = 0;\n\n    // Try and grab the owned bit.\n    uint32_t Desired = WRITE_OWNED_BIT;\n\n    // try to CAS immediately.\n    return AtomicFutex.compare_exchange_strong(Expected, Desired, std::memory_order_acq_rel, std::memory_order_acquire);\n  }\n\n  // Can race with other threads trying to lock shared!\n  bool try_lock_shared() {\n    auto AtomicFutex = std::atomic_ref<uint32_t>(Futex);\n    uint32_t Expected = AtomicFutex.load(std::memory_order_relaxed);\n\n    // Exclusively owned or has a list of waiting owners. Can't pass.\n    if ((Expected & WRITE_OWNED_BIT) || (Expected & WRITE_WAITER_COUNT_MASK)) {\n      return false;\n    }\n\n    // Try to add reader.\n    uint32_t Desired = Expected + READ_OWNER_INCREMENT;\n    LOGMAN_THROW_A_FMT((Desired & READ_OWNER_COUNT_MASK) != 0, \"Overflow in read-owners!\");\n\n    // Uncontended mutex check\n    return AtomicFutex.compare_exchange_strong(Expected, Desired, std::memory_order_acq_rel, std::memory_order_acquire);\n  }\n\n#if !defined(_WIN32)\n  // Initialize the internal mutex object to its default initializer state.\n  // Should only ever be used in the child process when a Linux fork() has occured.\n  void StealAndDropActiveLocks() {\n    Futex = 0;\n  }\n#endif\n\nprivate:\n\n#if !defined(_WIN32)\n  void FutexWaitForWriteAvailable(uint32_t Expected) {\n    ::syscall(SYS_futex, &Futex, FUTEX_PRIVATE_FLAG | FUTEX_WAIT_BITSET, Expected, nullptr, nullptr, FUTEX_BITSET_WAIT_WRITERS);\n  }\n\n  // Read-lock waiting for writers to drain out.\n  void FutexWaitForReadAvailable(uint32_t Expected) {\n    ::syscall(SYS_futex, &Futex, FUTEX_PRIVATE_FLAG | FUTEX_WAIT_BITSET, Expected, nullptr, nullptr, FUTEX_BITSET_WAIT_READERS);\n  }\n\n  // Read-Lock or Write-lock unlocked, wake one writer.\n  // - Read->Write handoff.\n  // - Write->Write handoff.\n  void FutexWakeWriter() {\n    ::syscall(SYS_futex, &Futex, FUTEX_PRIVATE_FLAG | FUTEX_WAKE_BITSET, 1, nullptr, nullptr, FUTEX_BITSET_WAIT_WRITERS);\n  }\n\n  // Write-lock unlocked, wake read-locks waiting.\n  void FutexWakeReaders() {\n    // Wake all readers.\n    ::syscall(SYS_futex, &Futex, FUTEX_PRIVATE_FLAG | FUTEX_WAKE_BITSET, INT_MAX, nullptr, nullptr, FUTEX_BITSET_WAIT_READERS);\n  }\n#else\n  // Writers wait for the full 32-bit futex.\n  void FutexWaitForWriteAvailable(uint32_t Expected) {\n    WaitOnAddress(&Futex, &Expected, sizeof(Futex), INFINITE);\n  }\n\n  // Readers wait for Futex bits [31:16] to be zero.\n  void FutexWaitForReadAvailable(uint32_t Expected) {\n    auto ReadWaiterAddress = reinterpret_cast<uint8_t*>(&Futex) + 2;\n    uint16_t smol_Expected = Expected >> 16;\n    WaitOnAddress(ReadWaiterAddress, &smol_Expected, sizeof(smol_Expected), INFINITE);\n  }\n\n  void FutexWakeWriter() {\n    WakeByAddressSingle(&Futex);\n  }\n\n  void FutexWakeReaders() {\n    auto ReadWaiterAddress = reinterpret_cast<uint8_t*>(&Futex) + 2;\n    WakeByAddressAll(ReadWaiterAddress);\n  }\n#endif\n\n  // Reuse the SpinWaitLock WFE implementations for read/write lock acquiring with WFE.\n  // Can't reuse the spin-lock directly as some bit-representations are different.\n  // WFE-write-lock is less likely to occur the more read-lock threads are participating. Can still occur so good to try.\n  // WFE-read-lock is actually quite likely to succeed.\n  // Return: true if the lock was acquired.\n  bool Attempt_WFE_WriteLock() {\n#ifdef ARCHITECTURE_arm64\n    const auto Begin = FEXCore::Utils::SpinWaitLock::GetCycleCounter();\n    auto Now = Begin;\n    const auto Duration = FEXCore::Utils::SpinWaitLock::CycleCounterFrequency / CYCLECOUNT_DIVISOR;\n\n    auto AtomicFutex = std::atomic_ref<uint32_t>(Futex);\n    uint32_t Expected = AtomicFutex.load(std::memory_order_relaxed);\n\n    while ((Now - Begin) < Duration) {\n      if (Expected == 0) {\n        // Try and grab the owned bit.\n        uint32_t Desired = WRITE_OWNED_BIT;\n\n        if (AtomicFutex.compare_exchange_strong(Expected, Desired, std::memory_order_acq_rel, std::memory_order_acquire)) {\n          return true;\n        }\n      }\n\n      // One-shot attempt to wait for mask to be zero.\n      Expected = FEXCore::Utils::SpinWaitLock::OneShotWFEBitComparison(&Futex, ~0U, 0U);\n      Now = FEXCore::Utils::SpinWaitLock::GetCycleCounter();\n    }\n#endif\n\n    return false;\n  }\n\n  // Return: true if the lock was acquired.\n  bool Attempt_WFE_ReadLock() {\n#ifdef ARCHITECTURE_arm64\n    // Spin on a WFE for a short-amount of time, waiting for write-owned and writer-count to be zero.\n    //  - Attempt to acquire read-lock at that point.\n    //  - Don't add read-waiters bit on failure, return false.\n    const auto Begin = FEXCore::Utils::SpinWaitLock::GetCycleCounter();\n    auto Now = Begin;\n    const auto Duration = FEXCore::Utils::SpinWaitLock::CycleCounterFrequency / CYCLECOUNT_DIVISOR;\n\n    auto AtomicFutex = std::atomic_ref<uint32_t>(Futex);\n    uint32_t Expected = AtomicFutex.load(std::memory_order_relaxed);\n    uint32_t Desired {};\n\n    while ((Now - Begin) < Duration) {\n      if ((Expected & WRITE_OWNED_BIT) == 0 && (Expected & WRITE_WAITER_COUNT_MASK) == 0) {\n        // If no write-owner and no write-waiting, try and acquire.\n\n        Desired = Expected + READ_OWNER_INCREMENT;\n        LOGMAN_THROW_A_FMT((Desired & READ_OWNER_COUNT_MASK) != 0, \"Overflow in read-owners!\");\n        if (AtomicFutex.compare_exchange_strong(Expected, Desired, std::memory_order_acq_rel, std::memory_order_acquire)) {\n          return true;\n        }\n      }\n\n      // One-shot attempt to wait for mask to be zero.\n      Expected = FEXCore::Utils::SpinWaitLock::OneShotWFEBitComparison(&Futex, WRITE_OWNED_BIT | WRITE_WAITER_COUNT_MASK, 0U);\n      Now = FEXCore::Utils::SpinWaitLock::GetCycleCounter();\n    }\n#endif\n\n    return false;\n  }\n\n  constexpr static uint32_t WRITE_OWNED_BIT = 1U << 31;\n  constexpr static uint32_t READ_WAITER_BIT = 1U << 30;\n  constexpr static uint32_t WRITE_WAITER_OFFSET = 16;\n  constexpr static uint32_t WRITE_WAITER_INCREMENT = 1U << WRITE_WAITER_OFFSET;\n  constexpr static uint32_t READ_OWNER_INCREMENT = 1;\n\n  // Count masks\n  constexpr static uint32_t WRITE_WAITER_COUNT_MASK = 0x3FFFU << WRITE_WAITER_OFFSET;\n  constexpr static uint32_t READ_OWNER_COUNT_MASK = 0xFFFFU;\n\n  // Independent futex bit-set masks.\n  // Wait for readers to drain.\n  constexpr static uint32_t FUTEX_BITSET_WAIT_READERS = 1U << 0;\n  // Wait for writers to drain.\n  constexpr static uint32_t FUTEX_BITSET_WAIT_WRITERS = 1U << 1;\n\n  // Only spin on WFE for 0.01ms (10k ns).\n  constexpr static uint64_t CYCLECOUNT_DIVISOR = 1'000'000'000ULL / 10'000U;\n\n  // Layout:\n  //    Bits[31]: Write-lock bit.\n  //    Bits[30]: Read-waiter bit.\n  // Bits[29:16]: Write-waiter count.\n  //  Bits[15:0]: Read-owner count.\n  uint32_t Futex {};\n};\n} // namespace FEXCore::Utils::WritePriorityMutex\n"
  },
  {
    "path": "FEXCore/Source/Utils/variable_length_integer.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/CompilerDefs.h>\n\n#include <cstdio>\n#include <cstdint>\n#include <cstddef>\n#include <limits>\n\nnamespace FEXCore::Utils {\n// Variable length signed integer\n// The most common encoded size is 8-bit positive, but other values can occur\n//\n// 8-bit:\n// bit[7] = 0 - 8-bit\n// bit[6:0] = 7-bit encoding\n//\n// 16-bit:\n// byte1[7:6] = 0b10 - 16-bit\n// byte1[5:0] = top 6-bits\n// byte2[7:0] = Bottom 8-bits bits\n//\n// 32-bit\n// byte1[7:5] = 0b110 - 32-bit\n// byte1[4:0] = <reserved>\n// word[31:0] = signed word\n//\n// 64-bit\n// byte1[7:5] = 0b111 - 64-bit\n// byte1[4:0] = <reserved>\n// dword[63:0] = signed dword\nstruct vl64 final {\n  static size_t EncodedSize(int64_t Data) {\n    if (Data >= vl8_min && Data <= vl8_max) {\n      return sizeof(vl8_enc);\n    } else if (Data >= vl16_min && Data <= vl16_max) {\n      return sizeof(vl16_enc);\n    } else if (Data >= vl32_min && Data <= vl32_max) {\n      return sizeof(vl32_enc);\n    }\n    return sizeof(vl64_enc);\n  }\n\n  struct Decoded {\n    int64_t Integer;\n    size_t Size;\n  };\n\n  static Decoded Decode(const uint8_t* data) {\n    auto vl8_type = reinterpret_cast<const vl8_enc*>(data);\n    auto vl16_type = reinterpret_cast<const vl16_enc*>(data);\n    auto vl32_type = reinterpret_cast<const vl32_enc*>(data);\n    auto vl64_type = reinterpret_cast<const vl64_enc*>(data);\n\n    if (vl8_type->Type == vl8_type_header) {\n      return {vl8_type->Integer, sizeof(vl8_enc)};\n    } else if (vl16_type->HighBits.Type == vl16_type_header) {\n      return {vl16_type->Integer(), sizeof(vl16_enc)};\n    } else if (vl32_type->Type == vl32_type_header) {\n      return {vl32_type->Integer, sizeof(vl32_enc)};\n    }\n    return {vl64_type->Integer, sizeof(vl64_enc)};\n  }\n\n  static size_t Encode(uint8_t* dst, int64_t Data) {\n    auto vl8_type = reinterpret_cast<vl8_enc*>(dst);\n    auto vl16_type = reinterpret_cast<vl16_enc*>(dst);\n    auto vl32_type = reinterpret_cast<vl32_enc*>(dst);\n    auto vl64_type = reinterpret_cast<vl64_enc*>(dst);\n\n    if (Data >= vl8_min && Data <= vl8_max) {\n      *vl8_type = {\n        .Integer = static_cast<int8_t>(Data),\n        .Type = vl8_type_header,\n      };\n      return sizeof(vl8_enc);\n    } else if (Data >= vl16_min && Data <= vl16_max) {\n      *vl16_type = {\n        .HighBits {\n          .Top = static_cast<int8_t>((Data >> 8) & 0xFF),\n          .Type = vl16_type_header,\n        },\n        .LowBits = static_cast<uint8_t>(Data & 0xFF),\n      };\n      return sizeof(vl16_enc);\n    } else if (Data >= vl32_min && Data <= vl32_max) {\n      *vl32_type = {\n        .Type = vl32_type_header,\n        .Integer = static_cast<int32_t>(Data),\n      };\n      return sizeof(vl32_enc);\n    }\n\n    *vl64_type = {\n      .Type = vl64_type_header,\n      .Integer = Data,\n    };\n    return sizeof(vl64_enc);\n  }\n\nprivate:\n\n  struct vl8_enc {\n    int8_t Integer : 7;\n    uint8_t Type   : 1;\n  };\n  static_assert(sizeof(vl8_enc) == 1);\n\n  struct vl16_enc {\n    struct {\n      int8_t Top   : 6;\n      uint8_t Type : 2;\n    } HighBits;\n    uint8_t LowBits;\n\n    int64_t Integer() const {\n      int16_t Value {};\n      Value |= (HighBits.Top << 8);\n      Value |= LowBits;\n      return (Value << 2) >> 2;\n    }\n  };\n  static_assert(sizeof(vl16_enc) == 2);\n\n  struct FEX_PACKED vl32_enc {\n    uint8_t Type;\n    int32_t Integer;\n  };\n  static_assert(sizeof(vl32_enc) == 5);\n\n  struct FEX_PACKED vl64_enc {\n    uint8_t Type;\n    int64_t Integer;\n  };\n  static_assert(sizeof(vl64_enc) == 9);\n\n  // Maximum ranges for encodings.\n\n  // vl8 can hold a signed 7-bit integer.\n  // Encoded in one 8-bit value.\n  constexpr static int64_t vl8_encoded_bits = 7;\n  constexpr static int64_t vl8_type_header = 0;\n  constexpr static int64_t vl8_min = std::numeric_limits<int64_t>::min() >> ((sizeof(int64_t) * 8) - vl8_encoded_bits);\n  constexpr static int64_t vl8_max = std::numeric_limits<int64_t>::max() >> ((sizeof(int64_t) * 8) - vl8_encoded_bits);\n\n  // vl16 can hold a signed 14-bit integer.\n  // Encoded in one 16-bit value.\n  constexpr static int64_t vl16_encoded_bits = 14;\n  constexpr static int64_t vl16_type_header = 0b10;\n  constexpr static int64_t vl16_min = std::numeric_limits<int64_t>::min() >> ((sizeof(int64_t) * 8) - vl16_encoded_bits);\n  constexpr static int64_t vl16_max = std::numeric_limits<int64_t>::max() >> ((sizeof(int64_t) * 8) - vl16_encoded_bits);\n\n  // vl32 can hold a signed 32-bit integer.\n  // Encoded in 8-bit and 32-bit value;\n  constexpr static int64_t vl32_encoded_bits = 32;\n  constexpr static int64_t vl32_type_header = 0b1100'0000;\n  constexpr static int64_t vl32_min = std::numeric_limits<int32_t>::min();\n  constexpr static int64_t vl32_max = std::numeric_limits<int32_t>::max();\n\n  // vl64 can hold a signed 32-bit integer.\n  // Encoded in 8-bit and 64-bit value.\n  constexpr static int64_t vl64_encoded_bits = 64;\n  constexpr static int64_t vl64_type_header = 0b1110'0000;\n  constexpr static int64_t vl64_min = std::numeric_limits<int64_t>::min();\n  constexpr static int64_t vl64_max = std::numeric_limits<int64_t>::max();\n};\n\n// Variable length pair that optimizes around FEXCore's JITRIPReconstruction.\n//\n// 8-bit:\n// bit[7]   = 0 - 8-bit\n// bit[6:4] = 3-bit unsigned - 1. [1 - 8] range.\n// bit[3:0] = 4-bit unsigned divided by 4 - 1. [4 - 64 byte] range.\n//\n// 16-bit:\n// byte1[7:6] = 0b10 - 16-bit\n// byte1[5:0] = 6-bit signed value [-32 - 31] range\n// byte2[7:0] = 8-bit signed value divided by 4. [-512 - 508] byte range.\n//\n// 32-bit and 64-bit don't attempt to do any compression beyond range checks.\n// 32-bit\n// byte1[7:5] = 0b110 - 32-bit\n// byte1[4:0] = <reserved>\n// word1[31:0] = signed word\n// word2[31:0] = signed word\n//\n// 64-bit\n// byte1[7:5] = 0b111 - 64-bit\n// byte1[4:0] = <reserved>\n// dword1[63:0] = signed dword\n// dword2[63:0] = signed dword\n\nstruct vl64pair final {\npublic:\n  static size_t EncodedSize(uint64_t data_arm, uint64_t data_rip) {\n    if (can_encode_vl8(data_arm, data_rip)) {\n      return sizeof(vl8_enc);\n    } else if (can_encode_vl16(data_arm, data_rip)) {\n      return sizeof(vl16_enc);\n    } else if (can_encode_vl32(data_arm, data_rip)) {\n      return sizeof(vl32_enc);\n    }\n    return sizeof(vl64_enc);\n  }\n\n  struct Decoded {\n    uint64_t IntegerARMPC;\n    uint64_t IntegerX86RIP;\n    size_t Size;\n  };\n\n  static Decoded Decode(const uint8_t* data) {\n    auto vl8_type = reinterpret_cast<const vl8_enc*>(data);\n    auto vl16_type = reinterpret_cast<const vl16_enc*>(data);\n    auto vl32_type = reinterpret_cast<const vl32_enc*>(data);\n    auto vl64_type = reinterpret_cast<const vl64_enc*>(data);\n\n    if (vl8_type->Type == vl8_type_header) {\n      return Decode(vl8_type);\n    } else if (vl16_type->HighBits.Type == vl16_type_header) {\n      return Decode(vl16_type);\n    } else if (vl32_type->Type == vl32_type_header) {\n      return Decode(vl32_type);\n    }\n    return {vl64_type->IntegerARMPC, vl64_type->IntegerX86RIP, sizeof(vl64_enc)};\n  }\n\n  static size_t Encode(uint8_t* dst, uint64_t data_arm, uint64_t data_rip) {\n    auto vl8_type = reinterpret_cast<vl8_enc*>(dst);\n    auto vl16_type = reinterpret_cast<vl16_enc*>(dst);\n    auto vl32_type = reinterpret_cast<vl32_enc*>(dst);\n    auto vl64_type = reinterpret_cast<vl64_enc*>(dst);\n\n    if (can_encode_vl8(data_arm, data_rip)) {\n      *vl8_type = {\n        .IntegerARMPC = static_cast<uint8_t>((data_arm - 1) >> vl8_arm_align_bits),\n        .IntegerX86RIP = static_cast<uint8_t>(data_rip - 1),\n        .Type = vl8_type_header,\n      };\n      return sizeof(vl8_enc);\n    } else if (can_encode_vl16(data_arm, data_rip)) {\n      *vl16_type = {\n        .HighBits {\n          .IntegerX86RIP = static_cast<int8_t>(static_cast<int64_t>(data_rip)),\n          .Type = vl16_type_header,\n        },\n        .IntegerARMPC = static_cast<int8_t>(static_cast<int64_t>(data_arm) >> vl8_arm_align_bits),\n      };\n      return sizeof(vl16_enc);\n    } else if (can_encode_vl32(data_arm, data_rip)) {\n      *vl32_type = {\n        .Type = vl32_type_header,\n        .IntegerARMPC = static_cast<int32_t>(data_arm),\n        .IntegerX86RIP = static_cast<int32_t>(data_rip),\n      };\n      return sizeof(vl32_enc);\n    }\n\n    *vl64_type = {\n      .Type = vl64_type_header,\n      .IntegerARMPC = data_arm,\n      .IntegerX86RIP = data_rip,\n    };\n    return sizeof(vl64_enc);\n  }\n\nprivate:\n  struct vl8_enc {\n    uint8_t IntegerARMPC  : 4;\n    uint8_t IntegerX86RIP : 3;\n    uint8_t Type          : 1;\n  };\n  static_assert(sizeof(vl8_enc) == 1);\n\n  static inline Decoded Decode(const vl8_enc* enc) {\n    const uint64_t data_arm = enc->IntegerARMPC;\n    const uint64_t data_rip = enc->IntegerX86RIP;\n    return {(data_arm + 1) << vl8_arm_align_bits, data_rip + 1, sizeof(vl8_enc)};\n  }\n\n  struct vl16_enc {\n    struct {\n      int8_t IntegerX86RIP : 6;\n      uint8_t Type         : 2;\n    } HighBits;\n    int8_t IntegerARMPC;\n  };\n  static_assert(sizeof(vl16_enc) == 2);\n\n  static inline Decoded Decode(const vl16_enc* enc) {\n    int64_t arm_pc = enc->IntegerARMPC << vl8_arm_align_bits;\n    int64_t x86_rip = enc->HighBits.IntegerX86RIP;\n    return {static_cast<uint64_t>(arm_pc), static_cast<uint64_t>(x86_rip), sizeof(vl16_enc)};\n  }\n\n  struct FEX_PACKED vl32_enc {\n    uint8_t Type;\n    int32_t IntegerARMPC;\n    int32_t IntegerX86RIP;\n  };\n  static_assert(sizeof(vl32_enc) == 9);\n\n  static inline Decoded Decode(const vl32_enc* enc) {\n    int64_t arm_pc = enc->IntegerARMPC;\n    int64_t x86_rip = enc->IntegerX86RIP;\n    return {static_cast<uint64_t>(arm_pc), static_cast<uint64_t>(x86_rip), sizeof(vl32_enc)};\n  }\n\n  struct FEX_PACKED vl64_enc {\n    uint8_t Type;\n    uint64_t IntegerARMPC;\n    uint64_t IntegerX86RIP;\n  };\n  static_assert(sizeof(vl64_enc) == 17);\n\n  // vl8 can hold a two small unsigned integers.\n  // Encoded in 8-bit.\n  constexpr static int64_t vl8_type_header = 0;\n  constexpr static int64_t vl8_arm_min = 1;\n  constexpr static int64_t vl8_arm_max = 16;\n  constexpr static int64_t vl8_arm_align_bits = 2;\n  constexpr static int64_t vl8_arm_shift_mask = (1U << vl8_arm_align_bits) - 1;\n  constexpr static int64_t vl8_pc_min = 1;\n  constexpr static int64_t vl8_pc_max = 8;\n  static bool can_encode_vl8(uint64_t data_arm, uint64_t data_rip) {\n    // GuestPC can only be [1,8] bytes.\n    if (data_rip < vl8_pc_min || data_rip > vl8_pc_max) {\n      return false;\n    }\n    // Unaligned doesn't fit at all.\n    if (data_arm & vl8_arm_shift_mask) {\n      return false;\n    }\n\n    // HostPC can only be [1,16] instructions.\n    int64_t ShiftedHostPC = data_arm >> vl8_arm_align_bits;\n    if (ShiftedHostPC < vl8_arm_min || ShiftedHostPC > vl8_arm_max) {\n      return false;\n    }\n\n    return true;\n  }\n\n  // vl16 can hold a two small signed integers\n  // Encoded in one 16-bit value.\n  constexpr static int64_t vl16_type_header = 0b10;\n  constexpr static int64_t vl16_arm_min = -128;\n  constexpr static int64_t vl16_arm_max = 127;\n  constexpr static int64_t vl16_arm_align_bits = 2;\n  constexpr static int64_t vl16_arm_shift_mask = (1U << vl16_arm_align_bits) - 1;\n  constexpr static int64_t vl16_pc_min = -32;\n  constexpr static int64_t vl16_pc_max = 31;\n  static bool can_encode_vl16(int64_t data_arm, int64_t data_rip) {\n    // GuestPC can only be [-32,31] bytes.\n    if (data_rip < vl16_pc_min || data_rip > vl16_pc_max) {\n      return false;\n    }\n\n    // Unaligned doesn't fit at all.\n    if (data_arm & vl16_arm_shift_mask) {\n      return false;\n    }\n\n    // HostPC can only be [-128,127] instructions.\n    int64_t ShiftedHostPC = data_arm >> vl16_arm_align_bits;\n    if (ShiftedHostPC < vl16_arm_min || ShiftedHostPC > vl16_arm_max) {\n      return false;\n    }\n\n    return true;\n  }\n\n  // vl32 can hold a two 32-bit integers.\n  // Encoded in 8-bit and two 32-bit values.\n  constexpr static int64_t vl32_type_header = 0b1100'0000;\n  constexpr static int64_t vl32_min = std::numeric_limits<int32_t>::min();\n  constexpr static int64_t vl32_max = std::numeric_limits<int32_t>::max();\n  static bool can_encode_vl32(int64_t data_arm, int64_t data_rip) {\n    if (data_rip < vl32_min || data_rip > vl32_max) {\n      return false;\n    }\n    if (data_arm < vl32_min || data_arm > vl32_max) {\n      return false;\n    }\n\n    return true;\n  }\n\n  // vl64 can hold a two 64-bit integers.\n  // Encoded in 8-bit and two 64-bit values.\n  constexpr static int64_t vl64_type_header = 0b1110'0000;\n};\n\n} // namespace FEXCore::Utils\n"
  },
  {
    "path": "FEXCore/docs/CPUBackends.md",
    "content": "# FEXCore CPU Backends\n---\nFEXCore supports multiple CPU emulation backends. All of which ingest the IR that we have been generating.\n\n## IR Interpreter\nThe first one is the easiest. This just walks the IR list and interprets the IR as it goes through it. It isn't meant to be fast and is for debugging purposes.\nThis is used to easily inspect what is going on with the code generation and making sure logic is sound. Will most likely last in to perpetuity since it isn't exactly difficult to maintain and it is useful to have around\n\n## IR JIT\n**Not yet implemented**\nThis is meant to be our first JIT of call and will serve multiple purposes. It'll be the JIT that is used for our runtime compilation of code.\nThis means it needs to be fast during compilation and have decent runtime performance.\nGood chance that we will need to implement multiple of these depending on host architecture with some code reuse between them.\nThis JIT will also be what we use for gathering sampling data for passing off to another JIT for tiered recompilation and offline compilation later.\nShould use xbyak for our x86-64 host and Vixl for our AArch64 host. For other targets in the future we will see what is available\n\n# Future ideas\n---\n* Create an inline ASM or JIT'd dispatcher loop. Will allow our JITs to be more optimal by reserving more registers for guest state.\n* WebAssmembly or other browser language?\n  * Might allow decent runtime performance of things emulated in a browser. Could be interesting.\n"
  },
  {
    "path": "FEXCore/docs/CustomCPUBackend.md",
    "content": "# FEXCore custom CPU backends\n---\nCustom CPU backends can be useful for testing purposes or wanting to support situations that FEXCore doesn't currently understand.\nThe FEXCore::Context namespace provides a `SetCustomCPUBackendFactory` function for providing a factory function pointer to the core. This function will be used if the `DEFAULTCORE` configuration option is set to `CUSTOM`.\nIf the guest code creates more threads then the CPU factory function will be invoked for creating a CPUBackend per thread. If you don't want a unique CPUBackend object per thread then that needs to be handled by the user.\n\nIt's recommended to store the pointers provided to the factory function for later use.\n`FEXCore::Context::Context*` - Is a pointer to previously generated context object\n`FEXCore::Core::ThreadState*` - Is a pointer to a thread's state. Lives for as long as the guest thread is alive.\nTo use this factory, one must override the provided `FEXCore::CPU::CPUBackend` class with a custom one. This factory function then should return a newly allocated class.\n\n`FEXCore::CPU::CPUBackend::GetName` - Returns an `std::string` for the name of this core\n`FEXCore::CPU::CPUBackend::CompileCode` - Provides the CPUBackend with potentially an IR and DebugData for compiling code. Returns a pointer that needs to be long lasting to a piece of code that will be executed for the particular RIP.\n`FEXCore::CPU::CPUBackend::Initialize` - Called after the guest memory is initialized and all state is ready for the code to start initializing. Gets called just before the CPUBackend starts executing code for the first time.\n"
  },
  {
    "path": "FEXCore/docs/Frontend.md",
    "content": "# FEXCore Frontend\n---\nThe FEXCore frontend's job is to translate an incoming x86-64 instruction stream in to a more easily digested version of x86.\nThis effectively expands x86-64 instruction encodings to be more easily ingested later on in the process.\nThis ends up being essential to allowing our IR translation step to be less strenuous. It can decode a \"common\" expanded instruction format rather than various things that x86-supports.\nFor a simple example, x86-64's primary op table has ALU ops that duplicate themselves at least six times with minor differences between each. The frontend is able to decode a large amount of these ops to the \"same\" op that the IR translation understands more readily.\nThis works for most instructions that follow a common decoding scheme, although there are instructions that don't follow the rules and must be handled explicitly elsewhere.\n\nAn example of decoded instructions:\n```\n00 C0: add al,al\n04 01: add al, 0x1\n```\nThese two instructions have a different encoding scheme but they are just an add.\nThey end up decoding to a generic format with the same destination operand but different sources.\nMay look subtle but there end up being far more complex cases and we don't want to handle hundreds of instructions differently.\nAfter the frontend is done decoding the instruction stream, it passes the output over to the OpDispatcher for translating to our IR.\n\n## Multiblock\n---\nThe Frontend has an additional duty. Since it is the main piece of code that understands the guest x86-64 code; It is also what does analysis of control flow to determine if we can end up compiling multiple blocks of guest code.\nThe Frontend already has to determine if it has hit a block ending instruction. This is anything that changes control flow. This feeds in to the analysis system to look at conditional branches to see if we can keep compiling code at the target location in the same functional unit.\n\nShort example:\n```\ntest eax, eax\njne .Continue\nret           <--- We can continue past this instruction, which is an unconditional block ender\n.Continue:\n```\n\nThese sorts of patterns crop up extensively in compiled code. A large amount of traditional JITs will end up ending the block at any sort of conditional branch instruction.\nIf the analysis can determine the target conditional branch location, we can then know that the code can keep compiling past an unconditional block ender instruction.\nThis works for both backwards branches and forward branches.\n\n### Additional reading\n---\nThere are other emulators out there that implement multiblock JIT compilation with some success.\nThe best example of this that I know of is the [Dolphin GameCube and Wii Emulator](https://github.com/dolphin-emu/dolphin) Where I implemented the initial multiblock implementation.\nOne of the major limitations with a console emulator is that you can run in to infinite loops on backedges when using multiblock compilation. This is due to console emulation being able to run an infinite loop and let Interrupts or some other state cause it to break out.\nLuckily since we are a userspace emulator we don't have to deal with this problem. If an application has written an infinite loop, then without another thread running, it'll be a true infinite loop.\nAdditionally luckily is that we are going to emulate the strong memory model of x86-64 and also support true threads, this will mean that we don't need to do any manual thread scheduling in our emulator and switch between virtual threads.\n\n"
  },
  {
    "path": "FEXCore/docs/IR.md",
    "content": "# FEXCore IR\n---\nThe IR for the FEXCore is an SSA based IR that is generated from the incoming x86-64 assembly.\nSSA is quite nice to work with when translating the x86-64 code to the IR, when optimizing that code with custom optimization passes, and also passing that IR to our CPU backends.\n\n## Emulation IR considerations\n* We have explicitly sized IR variables\n  * Supports traditional element sizes of 1,2,4,8 bytes and some 16byte ops\n  * Supports arbitrary number of vector elements\n  * The op determines if something is float or integer based.\n* Clear separation of scalar IR ops and vector IR ops\n  * ex, MUL versus VMUL\n* We have explicit Load/Store context IR ops\n  * This allows us to have a clear separation between guest memory and tracked x86-64 state\n* We have an explicit CPUID IR op\n  * This allows us to return fairly complex data (4 registers of data) and also having an easier optimization for constant CPUID functions\n  * So if we const-prop the CPUID function then it'll just const-prop further along\n* We have an explicit syscall op\n  * The syscall op is fairly complex as well, same with CPUID that if the syscall function is const-prop then we can directly call the syscall handler\n  * Can save overhead by removing call overheads\n* The IR supports branching from one block to another\n  * Has a conditional branch instruction that either branches to the target branch or falls through to the next block\n  * Has an unconditional branch to explicitly jump to a block instead of falling through\n  * **There is a desire to follow LLVM semantics around block limitations but it isn't currently strictly enforced**\n* Supports a debug `Print` Op for printing out values for debug viewing\n* Supports explicit Load/Store memory IR ops\n  * This is for accessing guest memory and will do the memory offset translation in to the VM's memory space\n  * This is done by just adding the VM memory base to the 64bit address passed in\n  * This is done in a manner that the application **can** escape from the VM and isn't meant to be safe\n  * There is an option for JITs to validate the memory region prior to accessing for ensuring correctness\n* IR is generated from a JSON file, fairly straightforward to extend.\n  * Read the python generation file to determine the extent of what it can do\n\n## IR function considerations\nThe first SSA node is a special case node that is considered invalid. This means %0 will always be invalid for \"null\" node checks\nThe first real SSA node also has to be a IRHeader node. This means it is safe to assume that %1 will always be an IRHeader.\n\n\n```(%%1) IRHeader 0x41a9a0, %%2, 5```\n\nThe header provides information about that function like the entry point address.\nAdditionally it also points to the first `CodeBlock` IROp\n\n\n```(%%2) CodeBlock %%7, %%168, %%3```\n\n\n* The `CodeBlock` Op is a jump target and must be treated as if it'll be jumped to from other blocks\n  * It contains pointers to the starting op and ending op and they are inclusive\n  * It also contains a pointer to the next CodeBlock in a singly linked list\n  * The last CodeBlock will point to the InvalidNode as the next block\n\n\n### Example code block\n\n```\n(%%3) CodeBlock %%169, %%173, %%4\n\t(%%169) BeginBlock %3\n\t%170 i64 = Constant 0x41a9e1\n\t(%%171) StoreContext %170 i64, 0x8, 0x0\n\t(%%172) ExitFunction\n\t(%%173) EndBlock %3\n```\n\n* BeginBlock points back to the CodeBlock SSA which helps with iterating across multiple blocks\n* EndBlock the ending op of a CodeBlock and also points back to the CodeBlock SSA.\n* ExitFunction will leave the function immediately and return back to the dispatcher\n* Every IR Op has an SSA value associated with it used for tracking the op itself\n\t* If the IROp doesn't have a real destination then it is invalid to use it as an argument in most other ops\n\n## In-memory representation\n\nThe in-memory representation of the IR may be a bit confusing when initially viewed and once dealing with optimizations then it may be confusing as well.\nCurrently the IR Generation is tied to the `OpDispatchBuilder` class. This class handles translating decoded x86 to our IR representation.\nWhen generating IR inside of the `OpDispatchBuilder` it is straight forward, just call the IR generation ops.\n\n### FEXCore::IR::IntrusiveAllocator\nThis is an intrusive allocator that is used by the `OpDispatchBuilder` for storing IR data. It is a simple linear arena allocator without resizing capabilities.\n\n### OpDispatchBuilder\nOpDispatchBuilder provides `IRListView ViewIR()` for handling the IR outside of the class:\n* Returns a wrapper container class the allows you to view the IR. This doesn't take ownership of the IR data.\n* If the OpDispatcherBuilder changes its IR then changes are also visible to this class\n\nThis class uses two IntrusiveAllocator objects for tracking IR data. `ListData` and `Data` are the object names.\n* `ListData` is for tracking the doubly linked list of nodes\n\t* This ONLY allocates `FEXCore::IR::OrderedNode` objects\n\t* When an OrderedNode is allocated its allocation location (NodeOffset) is just the offset from the base pointer\n\t* This allows us to only use uint32_t memory offsets to compact the IR\n\t* Additionally using offsets allows us the freedom to freely move our IR in memory without costly pointer adjustment\n\t* This means everything is fixed size allocated (SSA Node number calculation is just `AllocationOffset / sizeof(OrderedNode)`\n\t* OrderedNodes are what the SSA arguments are pointing to in the end\n\n\n### OrderedNode\nThis is a doubly linked list of all of our IR nodes. This allows us to walk forward or backward over the IR and they must be ordered correctly to ensure dominance of SSA values.\n* Contains `OrderedNodeHeader`\n\t* Contains `OpNodeWrapper Value`\n\t\t* Points to the `IROp_Header` backing op for this SSA node\n\t* Contains `OrderedNodeWrapper Next`\n\t\t* Points to the next `OrderedNode`\n\t* Contains `OrderedNodeWrapper Previous`\n\t\t* Points to the previous `OrderedNode`\n* Contains the NumUses\n\t* This allows us to easily walk to the list backwards and DCE the ops that have NumUses == 0\n* `IROp_Header *Op(uintptr_t Base)`\n\t* Allows you to get the backing IR data for this SSA value\n\n### NodeWrapperBase<typename Type> - Type for `OrderedNodeHeader` and `OpNodeWrapper`\n* `using OpNodeWrapper = NodeWrapperBase<IROp_Header>`\n* `using OrderedNodeWrapper = NodeWrapperBase<OrderedNode>`\n* This is a class to let you more easily convert NodeOffsets in to their real backing pointer\n* `GetNode(uintptr_t Base)` allows you to pass in the base pointer from the backing Intrusive allocator and get the object\n\t* **This can be confusing**\n\t* A good rule of thumb is to only ever use `GetNode(ListDataBegin)` with OrderedNodeWrapper\n\t* Then once you have the `OrderedNode*` from GetNode, Use the `Op(IRDataBegin)` function to get the IR data.\n\t* I do **NOT** recommend using `GetNode` directly from `OpNodeWrapper` as it is VERY easy to mess it up\n\n### NodeIterator\nProvides a fairly straightforward interface that allows easily walking the IR nodes with C++ increment and decrement operations.\nOnly iterates over a single block\n\n#### Example usage\n```cpp\n\tIR::NodeIterator After = ...;\n\tIR::NodeIterator End = ...;\n\n\twhile (After != End) {\n\t\t// NodeIterator() returns a pair of pointers to the OrderedNode and IROp data\n\t\t// You can unpack the result with structured bindings\n\t\tauto [CodeNode, IROp] = After();\n\n\t\t// IROp_Header contains a bunch of information about the IR object\n\t\t// We can convert it with the object's C<typename Type> or CW<typename Type> functions\n\n\t\tswitch(IROp->Op) {\n\t\t\tcase IR::OP_ADD: {\n\t\t\t\tFEXCore::IR::IROp_Add const *Op = IROp->C<FEXCore::IR::IROp_Add>();\n\t\t\t\t/* We can now access members inside of IROp_Add that were previously unavailable\n\t\t\t\t\t You can still access the header definitions from Op->Header */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t/* ... */\n\t\t}\n\t\t// Go to the next IR Op\n\t\t++After;\n\t}\n\n```\n\n### AllNodesIterator\nThis is like NodeIterator, except that it will cross block boundaries.\n\n### IRListView.GetBlocks()\nProvides a range for easy iterating over all the blocks in a multi-block with NodeIterator\n\n#### Example usage\n```c++\n\tfor (auto [BlockNode, BlockHeader] : CurrentIR.GetBlocks()) {\n\t\t// Do stuff for each block\n\t}\n```\n\n### IRListView.GetCode(BlockNode)\nProvides a range for easy iterating over all the code in a block\n\n#### Example usage\n```c++\n\tfor (auto [CodeNode, IROp] : CurrentIR.GetCode(BlockNode)) {\n\t\t// Do stuff for each op\n\n\t\tswitch(IROp->Op) {\n\t\t\tcase IR::OP_ADD: {\n\t\t\t\tFEXCore::IR::IROp_Add const *Op = IROp->C<FEXCore::IR::IROp_Add>();\n\t\t\t\t// Do stuff for each Add op.\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n```\n\n### IRListView.GetAllCode()\nLike GetCode, except it uses AllNodesIterator to allow easy iterating over every single op in the entire Multiblock\n\n#### Example usage\n```c++\n\tfor (auto [CodeNode, IROp] : CurrentIR.GetAllCode()) {\n\t\t// Do stuff for each op\n\t}\n```\n\n## JSON file\nAn example of what the IR json looks like\n```\n\"StoreContext\": {\n  \"SSAArgs\": \"1\",\n  \"Args\": [\n    \"uint8_t\", \"Size\",\n    \"uint32_t\", \"Offset\"\n  ]\n},\n```\nThe json entry name will be the name of the IR op and the dispatcher function.\nThis means you'll get a `_Add(...)` dispatcher function generated\n\n### JSON IR element options\n* `HasDest`\n  * This is used on ops that return a value. Used for tracking of if ops return data\n* `SSAArgs`\n  * These are the number of arguments that the op consumes that are SSA based\n  * Needs to come from previous ops that had a destination\n* `SSANames`\n  * Allows you to name the SSA arguments in an op\n  * Otherwise the Op names will only be able to be accessed from the Header of the IR through its arguments array\n* `Args`\n  * These are defined arguments that are stored in the IR encoding that aren't SSA based\n  * Useful for things that are constant encoded and won't change after the fact\n* `FixedDestSize`\n  * This allows you to override the op's destination size in bytes\n  * Most ops with implicitly calculate their destination size through the maximum sizes of the IR arguments passed in\n* `DestSize`\n  * This allows an IR size override that isn't just a size in bytes\n  * This can let the size of the op be another argument or something more extensive\n* `RAOverride`\n  * This allows an op to take regular SSA arguments (So optimization passes will still be aware of them) but also not have them be register allocated\n  * Useful for block handling ops, where blocks aren't something that get register allocated but still need to have their uses tracked\n* `HelperGen`\n  * If there is a complex IR Op that needs to be defined but you don't want an automatic dispatcher generated then this disables the generation of the\n    dispatcher\n* `Last`\n  * This is a special element only used for the last element in the list\n"
  },
  {
    "path": "FEXCore/docs/MemoryModelEmulation.md",
    "content": "# What is x86-TSO and what is different compared to ARM's weak memory model?\nx86's memory model is a very strictly coherent memory model that effectively mandates that all memory accesses are \"atomic\". While atomicity is\nactually a bit more strict, we actually need to emulate it in ARM using atomic instructions. We are also required to emulate this strictness with\nunaligned accesses, which is due to x86 CPUs allowing unaligned atomics for \"free\" within a cacheline. Intel also takes this a step more and allowing\nfull atomics with a feature called \"split-locks\", AMD gains this same feature in Zen 5.\n\n# Emulating loads\nDue to x86 SIB addressing, this can happen on most instructions. FEX emulates these in a variety of ways depending on features.\nMost instructions are emulated with an atomic instruction but we also implement a feature called \"half-barrier\" atomics for unaligned atomics.\n\n## Base ARMv8.0\n- Addressing limitations\n  - Register only\nThis is emulated using an atomic load instruction plus a nop.\n- On unaligned access the code gets backpatched to a non-atomic load plus a memory barrier\n\n## FEAT_LRCPC\n- Addressing limitations\n  - Register only\nThis matches the base ARMv8.0 implementation but adds new instructions that match x86-TSO behaviour, making the emulation slightly quicker.\n- On unaligned access it still gets backpatched to non-atomic load plus a memory barrier.\n\n## FEAT_LRCPC2\n- Addressing limitations\n  - Register plus 9-bit signed immediate (-256, 255)\nAdds some new instructions that allow immediate encoding inside of the previous LRCPC instructions\n\n## FEAT_LRCPC3\nAdds a handful of GPR instructions that aren't super interesting\n\nFEX doesn't currently implement these since no hardware supports it.\n\n- ldapr - Post-index load for stack\n- ldiapr - Post-index load pair for stack\n- stilp - pre-index store pair for stack\n- stlr - pre-index store for stack\n\n# Emulating stores\nAgain due to x86 SIB addressing, this can also happen on most instructions. There are less options for FEX with this extension, so in most cases this\njust turns in to an atomic store with half-barrier backpatching for unaligned accesses\n\n## FEAT_LRCPC, FEAT_LRCPC2\nAdds nothing for emulating stores\n\n## FEAT_LRCPC3\n\n# Emulating atomic instructions\nx86 has atomic memory operations that can do a variety of operations. For unaligned atomic operations FEX will emulate the operation inside the signal\nhandler if it happens to be unaligned.\n\n## CASPair - cmpxchg\n\n## Base ARMv8.0\n- Addressing limitations\n  - Register only\nThis is emulated with a ldaxp+stlxp pair of instructions.\n\n## FEAT_LSE\n- Addressing limitations\n  - Register only\nAdds a new caspal instruction that does the operation almost exactly like x86.\n\n## CAS - cmpxchg8b/cmpxchg16b\n\n## Base ARMv8.0\n- Addressing limitations\n  - Register only\nSimilar to CASPair but now only uses a ldaxr+stlxr pair\n\n## FEAT_LSE\n- Addressing limitations\n  - Register only\nSimilar to CASPair adds a new casal instruction that operates basically like x86\n\n# AtomicFetch<Op>\n## Op from the following list\n- Add\n- Sub\n- And\n- CLR\n- Or\n- Xor\n- Neg\n- Swap\n\n## Base ARMv8.0\n- Addressing limitations\n  - Register only\nAll operations get emulated with an ldaxr+stlxr+<op> instruction\n\n## FEAT_LSE\n- Addressing limitations\n  - Register only\nAlmost all operations now have a native atomic memory operation instruction. The only outlier is atomicNeg which doesn't have an LSE equivalent and\nuses the ARMv8.0 implementation.\n\n# Vector loads\nSince almost all memory accesses on x86 are TSO, this includes vector operations.\n\n## Base ARMv8.0\n- Addressing limitations\n  - Register plus 9-bit signed immediate (-256, 255)\n  - Register plus 12-bit unsigned scaled immediate (Scaled by access size)\nEmulated using half-barriers, which means a load+dmb\n\n## FEAT_LRCPC3\n- LDAP1 added for element loads. Register only address encoding\n- LDAPUR added for vector register loads, supports 9-bit simm offset\n\n# Vector stores\nJust like loads, these are emulated using half-barriers\n\n## Base ARMv8.0\n- Addressing limitations\n  - Register plus 9-bit signed immediate (-256, 255)\n  - Register plus 12-bit unsigned scaled immediate (Scaled by access size)\nEmulated using half-barriers, which means a dmb+str\n\n\n## FEAT_LRCPC3\n- STL1 added for element stores. Register only address encoding\n- STLUR added for vector register stores, supports 9-bit simm offset\n\n# Addressing limitations depending on operating mode\n## GPR loadstores\n### TSO Emulation disabled\n- Register only (ldr/str)\n- Register + Register + scale (ldr/str)\n- Register + 9-bit simm (ldur/stru)\n- Register + 12-bit unsigned scaled imm (ldr/str)\n\n### TSO Emulation enabled\n- Register only (ldar/stlr)\n- Register only (ldapr/stlr) - FEAT_LRCPC\n- Register + 9-bit simm (ldapr/stlur) - FEAT_LRCPC2\n\n## Vector loadstores\n### TSO Emulation disabled\n- Register only (ldr/str)\n- Register + Register + scale (ldr/str)\n- Register + 9-bit simm (ldur/stru)\n- Register + 12-bit unsigned scaled imm (ldr/str)\n\n### TSO Emulation enabled\n- Same as TSO emulation disabled due to half-barrier implementation\n\n### TSO Emulation enabled (FEAT_LRCPC3)\n- Register only (ldap1/stl1) - Element loadstore\n- Register + 9-bit simm (ldapur/stlur)\n\n## Atomic memory operations\nAlways TSO emulation enabled, always register only.\n"
  },
  {
    "path": "FEXCore/docs/OpDispatcher.md",
    "content": "# FEXCore OpDispatcher\n---\nThe OpDispatcher is the step of the recompiler that takes the output from the Frontend and translates it to our IR.\nSince the x86-64 instruction set is so large (>1000 instructions in the current FEXCore tables) we need to reduce this down to something more manageable.\nWe will ingest our decoded x86-64 instructions and translate them down to more basic IR operations. The number of IR ops are currently in the dozens which is a lot easier to handle.\nOnce we have translated to the IR then we need to pass the IR over to optimization passes or our JIT cores.\n\nEx:\n```\n mov rax,0x1\n mov rdi,0x1\n mov rsi,0x20\n mov rdx,0x1\n syscall \n hlt\n ```\n Translates to the IR of:\n ```\nBeginBlock\n        %8 i32 = Constant 0x1\n        StoreContext 0x8, 0x8, %8\n        %64 i32 = Constant 0x1\n        StoreContext 0x8, 0x30, %64\n        %120 i32 = Constant 0x1f\n        StoreContext 0x8, 0x28, %120\n        %176 i32 = Constant 0x1\n        StoreContext 0x8, 0x20, %176\n        %232 i64 = LoadContext 0x8, 0x8\n        %264 i64 = LoadContext 0x8, 0x30\n        %296 i64 = LoadContext 0x8, 0x28\n        %328 i64 = LoadContext 0x8, 0x20\n        %360 i64 = LoadContext 0x8, 0x58\n        %392 i64 = LoadContext 0x8, 0x48\n        %424 i64 = LoadContext 0x8, 0x50\n        %456 i64 = Syscall %232, %264, %296, %328, %360, %392, %424\n        StoreContext 0x8, 0x8, %456\n        BeginBlock\n        EndBlock 0x1e\n        ExitFunction\n```\n### Multiblock\n---\nAn additional duty of the OpDispatcher is to handle the metadata that the Frontend provides for supporting multiblock.\nThe IR provides most of the functionality required for supporting robust branching and function creation required for generating large blocks of code translated from x86-64 emulation.\nThis is required since in the ideal situation we will be doing function level translation of x86-64 guest code to our IR.\nThe IR is currently lacking any idea of flags or PHI nodes, which can be problematic when optimizing branch heavy code. The good thing is that the LLVM JIT can use a mem to reg pass to minimize a large number of this code.\nIt **will** be required to improve the IR further once the runtime JIT becomes a higher priority\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Config/Config.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/EnumOperators.h>\n#include <FEXCore/Utils/EnumUtils.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/list.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/unordered_map.h>\n\n#include <algorithm>\n#include <array>\n#include <charconv>\n#include <cstdint>\n#include <optional>\n#include <type_traits>\n#include <variant>\n\nnamespace FEXCore::Config {\nnamespace Handler {\n  static inline std::optional<fextl::string> SMCCheckHandler(std::string_view Value) {\n    if (Value == \"none\") {\n      return \"0\";\n    } else if (Value == \"mtrack\") {\n      return \"1\";\n    } else if (Value == \"full\") {\n      return \"2\";\n    }\n    return \"0\";\n  }\n} // namespace Handler\n\nenum ConfigOption {\n#define OPT_BASE(type, group, enum, json, default) CONFIG_##enum,\n#include <FEXCore/Config/ConfigValues.inl>\n};\n\n#define ENUMDEFINES\n#include <FEXCore/Config/ConfigOptions.inl>\n\nenum ConfigSMCChecks {\n  CONFIG_SMC_NONE,\n  CONFIG_SMC_MTRACK,\n  CONFIG_SMC_FULL,\n};\n\nenum class LayerType {\n  LAYER_GLOBAL_MAIN, ///< /usr/share/fex-emu/Config.json by default\n  LAYER_MAIN,\n  LAYER_ARGUMENTS,\n  LAYER_GLOBAL_STEAM_APP,\n  LAYER_GLOBAL_APP,\n  LAYER_LOCAL_STEAM_APP,\n  LAYER_LOCAL_APP,\n  LAYER_USER_OVERRIDE,\n  LAYER_ENVIRONMENT,\n  LAYER_TOP,\n};\n\ntemplate<typename PairTypes, typename ArrayPairType>\nstatic inline std::optional<fextl::string> EnumParser(const ArrayPairType& EnumPairs, const std::string_view View) {\n  uint64_t EnumMask {};\n  auto Results = std::from_chars(View.data(), View.data() + View.size(), EnumMask);\n  if (Results.ec == std::errc()) {\n    // If the data is a valid number, just pass it through.\n    return std::nullopt;\n  }\n\n  auto Begin = 0;\n  auto End = View.find_first_of(',');\n  std::string_view Option = View.substr(Begin, End);\n  while (Option.size() != 0) {\n    auto EnumValue =\n      std::find_if(EnumPairs.begin(), EnumPairs.end(), [Option](const PairTypes& Value) -> bool { return Value.first == Option; });\n\n    if (EnumValue == EnumPairs.end()) {\n      LogMan::Msg::IFmt(\"Skipping Unknown option: {}\", Option);\n    } else {\n      EnumMask |= FEXCore::ToUnderlying(EnumValue->second);\n    }\n\n    if (End == std::string::npos) {\n      break;\n    }\n    Begin = End + 1;\n    End = View.find_first_of(',', Begin);\n    Option = View.substr(Begin, End - Begin);\n  }\n\n  return fextl::fmt::format(\"{}\", EnumMask);\n}\n\nusing StringArrayType = fextl::list<fextl::string>;\n\nnamespace detail {\n  template<ConfigOption Option>\n  struct ConfigOptionInfo;\n#define DEFINE_METAINFO(type, enum, default)             \\\n  template<>                                             \\\n  struct ConfigOptionInfo<ConfigOption::CONFIG_##enum> { \\\n    using Type = type;                                   \\\n    static auto Default() {                              \\\n      extern default;                                    \\\n      return enum;                                       \\\n    }                                                    \\\n  };\n#define OPT_BASE(type, group, enum, json, default) DEFINE_METAINFO(type, enum, const type enum)\n#define OPT_STR(group, enum, json, default) DEFINE_METAINFO(fextl::string, enum, const std::string_view enum)\n#define OPT_STRARRAY(group, enum, json, default) DEFINE_METAINFO(StringArrayType, enum, const std::string_view enum)\n#include <FEXCore/Config/ConfigValues.inl>\n} // namespace detail\n\nFEX_DEFAULT_VISIBILITY void SetDataDirectory(std::string_view Path, bool Global);\nFEX_DEFAULT_VISIBILITY void SetConfigDirectory(const std::string_view Path, bool Global);\nFEX_DEFAULT_VISIBILITY void SetConfigFileLocation(std::string_view Path, bool Global);\n\nFEX_DEFAULT_VISIBILITY const fextl::string& GetDataDirectory(bool Global = false);\nFEX_DEFAULT_VISIBILITY const fextl::string& GetConfigDirectory(bool Global);\nFEX_DEFAULT_VISIBILITY const fextl::string& GetConfigFileLocation(bool Global = false);\nFEX_DEFAULT_VISIBILITY fextl::string GetApplicationConfig(const std::string_view Program, bool Global);\n\nusing LayerValue = std::variant< fextl::string, StringArrayType, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, bool >;\n\nusing LayerOptions = fextl::unordered_map<ConfigOption, LayerValue>;\n\nclass FEX_DEFAULT_VISIBILITY Layer {\npublic:\n  explicit Layer(const LayerType _Type);\n  virtual ~Layer();\n\n  virtual void Load() = 0;\n\n  bool OptionExists(ConfigOption Option) const {\n    return OptionMap.find(Option) != OptionMap.end();\n  }\n\n  std::optional<StringArrayType*> All(ConfigOption Option) {\n    const auto it = OptionMap.find(Option);\n    if (it == OptionMap.end()) {\n      return std::nullopt;\n    }\n\n    auto& Value = it->second;\n    LOGMAN_THROW_A_FMT(std::holds_alternative<StringArrayType>(Value), \"Tried to get config of invalid type!\");\n\n    return &std::get<StringArrayType>(Value);\n  }\n\n  std::optional<fextl::string*> Get(ConfigOption Option) {\n    const auto it = OptionMap.find(Option);\n    if (it == OptionMap.end()) {\n      return std::nullopt;\n    }\n\n    auto& Value = it->second;\n    LOGMAN_THROW_A_FMT(std::holds_alternative<fextl::string>(Value), \"Tried to get config of invalid type!\");\n\n    return &std::get<fextl::string>(Value);\n  }\n\n  // Set will overwrite the object with a fextl::string without tests.\n  void Set(ConfigOption Option, const char* Data) {\n    LOGMAN_THROW_A_FMT(Data != nullptr, \"Data can't be null\");\n    OptionMap[Option].emplace<fextl::string>(fextl::string(Data));\n  }\n\n  void Set(ConfigOption Option, std::string_view Data) {\n    OptionMap[Option].emplace<fextl::string>(fextl::string(Data));\n  }\n\n  void Set(ConfigOption Option, fextl::string Data) {\n    OptionMap[Option].emplace<fextl::string>(std::move(Data));\n  }\n\n  void Set(ConfigOption Option, std::optional<fextl::string> Data) {\n    if (Data) {\n      OptionMap[Option].emplace<fextl::string>(std::move(*Data));\n    }\n  }\n\n  // AppendStrArrayValue will append strings to its StringArrayType.\n  // If the value was previously a different type, then throw an assert.\n  void AppendStrArrayValue(ConfigOption Option, std::string_view Data) {\n    auto it = OptionMap.find(Option);\n    if (it == OptionMap.end()) {\n      // If the option didn't exist as a StringArrayType yet, emplace it.\n      it = OptionMap.emplace(Option, StringArrayType {}).first;\n    }\n\n    auto& Value = it->second;\n    LOGMAN_THROW_A_FMT(std::holds_alternative<StringArrayType>(Value), \"Tried to get config of invalid type!\");\n    std::get<StringArrayType>(Value).emplace_back(Data);\n  }\n\n  void Erase(ConfigOption Option) {\n    OptionMap.erase(Option);\n  }\n\n  LayerType GetLayerType() const {\n    return Type;\n  }\n  const LayerOptions& GetOptionMap() const {\n    return OptionMap;\n  }\n\nprotected:\n  const LayerType Type;\n  LayerOptions OptionMap;\n};\n\nFEX_DEFAULT_VISIBILITY void Initialize();\nFEX_DEFAULT_VISIBILITY void Shutdown();\n\nFEX_DEFAULT_VISIBILITY void Load();\nFEX_DEFAULT_VISIBILITY void ReloadMetaLayer();\nFEX_DEFAULT_VISIBILITY fextl::string FindContainer();\nFEX_DEFAULT_VISIBILITY fextl::string FindContainerPrefix();\n\nFEX_DEFAULT_VISIBILITY void AddLayer(fextl::unique_ptr<FEXCore::Config::Layer> _Layer);\n\nFEX_DEFAULT_VISIBILITY bool Exists(ConfigOption Option);\nFEX_DEFAULT_VISIBILITY std::optional<StringArrayType*> All(ConfigOption Option);\ntemplate<typename T>\nFEX_DEFAULT_VISIBILITY std::optional<T> GetConv(ConfigOption Option);\nFEX_DEFAULT_VISIBILITY std::optional<fextl::string*> Get(ConfigOption Option);\nFEX_DEFAULT_VISIBILITY void Set(ConfigOption Option, std::string_view Data);\nFEX_DEFAULT_VISIBILITY void Erase(ConfigOption Option);\n\ntemplate<typename T>\nclass FEX_DEFAULT_VISIBILITY Value {\npublic:\n  // Single value type.\n  template<typename TT = T>\n  requires (std::is_fundamental_v<TT> || std::is_same_v<TT, fextl::string>)\n  Value(FEXCore::Config::ConfigOption Option, TT Default) {\n    ValueData = GetIfExists(Option, Default);\n  }\n\n  template<typename TT = T>\n  requires (std::is_fundamental_v<TT> || std::is_same_v<TT, fextl::string>)\n  Value(FEXCore::Config::ConfigOption Option, std::string_view Default) {\n    ValueData = GetIfExists(Option, Default);\n  }\n\n  operator T() const {\n    return ValueData;\n  }\n\n  T operator()() const requires (std::is_fundamental_v<T>)\n  {\n    return ValueData;\n  }\n\n  const fextl::string& operator()() const requires (std::is_same_v<T, fextl::string>)\n  {\n    return ValueData;\n  }\n\n  Value(T Value) requires (!std::is_same_v<T, StringArrayType>)\n  {\n    ValueData = std::move(Value);\n  }\n\n  // Array value types.\n  Value(FEXCore::Config::ConfigOption Option, std::string_view) requires (std::is_same_v<T, StringArrayType>)\n  {\n    GetListIfExists(Option, &ValueData);\n  }\n\n  StringArrayType& All() requires (std::is_same_v<T, StringArrayType>)\n  {\n    return ValueData;\n  }\n\nprivate:\n  T ValueData {};\n\n  static T GetIfExists(FEXCore::Config::ConfigOption Option, T Default);\n  static T GetIfExists(FEXCore::Config::ConfigOption Option, std::string_view Default);\n\n  static void GetListIfExists(FEXCore::Config::ConfigOption Option, StringArrayType* List);\n};\n\n/**\n * Wrapper around Value that automatically picks the default for the given ConfigOption\n */\ntemplate<ConfigOption Option>\nstruct FEX_DEFAULT_VISIBILITY Getter : public Value<typename detail::ConfigOptionInfo<Option>::Type> {\n  using OptionInfo = detail::ConfigOptionInfo<Option>;\n  Getter()\n    : Value<typename OptionInfo::Type> {Option, OptionInfo::Default()} {}\n};\n\n/**\n * Helper for reading a config value with caching.\n *\n * Typically this is used to declare class members so that the value is read\n * on construction of the parent.\n */\n#define FEX_CONFIG_OPT(name, enum) FEXCore::Config::Getter<FEXCore::Config::ConfigOption::CONFIG_##enum> name {}\n\n#define OPT_BASE(type, group, enum, json, default)                              \\\n  /**                                                                           \\\n   *  Helper for reading a config value.                                        \\\n   *                                                                            \\\n   *  In contrast to FEX_CONFIG_OPT, this can be used in arbitrary expressions, \\\n   *  at the expense of not caching the value. Use Getter instead if the value  \\\n   *  is read frequently.                                                       \\\n   */                                                                           \\\n  inline auto Get_##enum() {                                                    \\\n    return Getter<FEXCore::Config::ConfigOption::CONFIG_##enum> {};             \\\n  }\n#include <FEXCore/Config/ConfigValues.inl>\n\n} // namespace FEXCore::Config\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Core/CPUID.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <cstdint>\n\nnamespace FEXCore::CPUID {\nstruct FunctionResults {\n  uint32_t eax, ebx, ecx, edx;\n};\n\nstruct XCRResults {\n  uint32_t eax, edx;\n};\n} // namespace FEXCore::CPUID\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Core/CodeCache.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/fextl/functional.h>\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/set.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXCore/fextl/robin_map.h>\n\n#include <atomic>\n#include <cstdint>\n#include <mutex>\n#include <optional>\n#include <shared_mutex>\n#include <span>\n#include <unistd.h>\n\nnamespace FEXCore {\n\nnamespace Core {\n  struct InternalThreadState;\n} // namespace Core\n\nnamespace HLE {\n  struct SourcecodeMap;\n} // namespace HLE\n\nenum class GuestRelocationType : uint32_t {\n  Rel32,\n  Rel64,\n  // Skip blocks containing this relocation\n  Skip,\n};\n\n// Generic information associated with an executable file.\nstruct ExecutableFileInfo {\n  ~ExecutableFileInfo();\n\n#if __clang_major__ < 16\n  // Workaround for broken aggregate-initialization with std::piecewise_construct\n  ExecutableFileInfo(fextl::unique_ptr<HLE::SourcecodeMap>, uint64_t, fextl::string);\n  ExecutableFileInfo() = default;\n#endif\n\n  // This legacy field must be assignable through const-references\n  mutable fextl::unique_ptr<HLE::SourcecodeMap> SourcecodeMap;\n\n  uint64_t FileId = 0;\n  fextl::string Filename;\n  fextl::robin_map<uint32_t, GuestRelocationType> Relocations;\n};\n\n// Information associated with a specific section of an executable file\nstruct ExecutableFileSectionInfo {\n  const ExecutableFileInfo& FileInfo;\n\n  // Start address that the file is mapped to.\n  // NOTE: Since executable files may be mapped multiple times, this can depend on the queried section.\n  uintptr_t FileStartVA;\n\n  // Start address of the section mapping\n  uintptr_t BeginVA;\n\n  // End address that of the section mapping\n  uintptr_t EndVA;\n};\n\nusing CodeMapFileId = uint64_t;\n\n/**\n * Code maps capture information required for offline code cache generation\n * and are written to disk during execution of FEX.\n *\n * Almost all CodeMap data will be an Entry that indicates blocks to be\n * compiled for cache generation. The reserved value `LoadExternalLibrary`\n * indicates that an instance of ExternalLibraryInfo follows (the entry data\n * itself should be skipped in that case).\n */\nstruct CodeMap {\n  // Describes the location of an entry block compiled during execution\n  struct FEX_PACKED Entry {\n    CodeMapFileId FileId;\n    uint32_t BlockOffset;\n  };\n\n  // Describes an external library referenced during execution\n  struct ExternalLibraryInfo {\n    CodeMapFileId ExternalFileId;\n\n    // null-terminated file path; EITHER relative to the main executable OR an absolute path OR starting with a magic identifier:\n    // - WINE/: Path to Wine/Proton installation\n    // - WINEPREFIX/: Path to Wine/Proton prefix\n    // - SLR/: Path to Steam Linux Runtime\n    // At runtime, FEX will always dump absolute paths\n    char Path[];\n    // Followed by padding to a 4 byte boundary\n  };\n\n  // Followed by ExternalLibraryInfo\n  static constexpr Entry LoadExternalLibrary = {0xffff'ffff'ffff'ffff, 0xffff'ffff};\n\n  struct FEX_PACKED SetExecutableFileId {\n    Entry Marker = {0xffff'ffff'ffff'ffff, 0xffff'fffe};\n    CodeMapFileId ExecutableFileId;\n  };\n\n  struct ParsedContents {\n    fextl::string Filename;\n    fextl::set<uint64_t> Blocks;\n    bool IsExecutable = false;\n  };\n\n  // Follows scheme fileid[-nomb]\n  // The nomb (\"no multiblock\") suffix signifies that the code map is for use without multiblock, only.\n  static fextl::string GetBaseFilename(const ExecutableFileInfo& MainExecutable, bool AddNombSuffix);\n\n  static fextl::map<CodeMapFileId, ParsedContents> ParseCodeMap(std::ifstream& File);\n};\n\nstruct CodeMapOpener {\n  virtual ~CodeMapOpener() = default;\n  virtual int OpenCodeMapFile() = 0;\n};\n\nclass CodeMapWriter {\npublic:\n  CodeMapWriter(CodeMapOpener&, bool OpenEagerly = false);\n  ~CodeMapWriter();\n\n  // Checks if writing is enabled. Calls to this functions may also be interpreted as signals that writes are about to happen\n  bool IsWriteEnabled(const ExecutableFileSectionInfo&);\n\n  void ResetAfterFork() {\n    if (CodeMapFD.value_or(-1) != -1) {\n      close(CodeMapFD.value());\n      CodeMapFD.reset();\n    }\n    BufferOffset = 0;\n    KnownFileIds.clear();\n  }\n\n  bool IsBackingFD(int FD) const {\n    if (FD == CodeMapFD) {\n      LogMan::Msg::DFmt(\"Hiding directory entry for code map FD\");\n      return true;\n    }\n    return false;\n  }\n\n  void AppendBlock(const FEXCore::ExecutableFileSectionInfo&, uint64_t Entry);\n  void AppendLibraryLoad(const FEXCore::ExecutableFileInfo&);\n  void AppendSetMainExecutable(const FEXCore::ExecutableFileInfo&);\n\n  // Thread-safely commit any pending data to disk\n  void Flush(size_t Offset);\n\nprivate:\n  // Queues data into an internal ring buffer.\n  // Call Flush() to commit the data to disk.\n  void AppendData(std::span<const std::byte> Data);\n\n  // Commit given data range to disk\n  void Flush(size_t Offset, std::unique_lock<std::shared_mutex>&);\n\n  std::shared_mutex Mutex;\n  fextl::vector<std::byte> Buffer;\n  std::atomic<size_t> BufferOffset {0};\n\n  fextl::set<CodeMapFileId> KnownFileIds;\n\n  // std::nullopt: We haven't requested a CodeMapFD yet\n  // value is -1:  We requested a CodeMapFD but FEXServer told us not to write any data\n  // other values: Code map writing is active\n  std::optional<int> CodeMapFD;\n\n  CodeMapOpener& FileOpener;\n};\n\nclass AbstractCodeCache {\npublic:\n  virtual ~AbstractCodeCache() = default;\n\n  /**\n   * Computes a unique identifier for the referenced binary file to be used for\n   * generating the code map.\n   * This identifier is independent of FEX build/runtime configuration and\n   * stable across FEX updates.\n   */\n  virtual uint64_t ComputeCodeMapId(std::string_view Filename, int FD) = 0;\n\n  /**\n   * Loads a code cache from mapped memory and appends it to the current Core state.\n   * TODO: Optionally recompiles all contained code blocks at runtime for validation.\n   * Returns false if the provided cache file is invalid, and true otherwise.\n   */\n  virtual bool LoadData(Core::InternalThreadState*, std::byte* MappedCacheFile, const ExecutableFileSectionInfo&) = 0;\n\n  /**\n   * Bundles the current Core state (CodeBuffer, GuestToHostMapping, ...) to a code cache and writes it to the given file descriptor.\n   * Returns true on success.\n   */\n  virtual bool SaveData(Core::InternalThreadState&, int TargetFD, const ExecutableFileSectionInfo&, uint64_t SerializedBaseAddress) = 0;\n\n  /**\n   * Function to be called before compiling any code for caching purposes\n   */\n  virtual void InitiateCacheGeneration() = 0;\n};\n\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Core/Context.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <functional>\n#include <stdint.h>\n\n#include <FEXCore/Core/SignalDelegator.h>\n#include <FEXCore/Core/CodeCache.h>\n#include <FEXCore/Core/CPUID.h>\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/IntervalList.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/set.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n\nnamespace FEXCore {\nstruct HostFeatures;\nclass ForkableSharedMutex;\nclass ThunkHandler;\n} // namespace FEXCore\n\nnamespace FEXCore::Core {\nstruct CPUState;\nstruct InternalThreadState;\n} // namespace FEXCore::Core\n\nnamespace FEXCore::HLE {\nclass SyscallHandler;\n} // namespace FEXCore::HLE\n\nnamespace FEXCore::IR {\nclass IREmitter;\n} // namespace FEXCore::IR\n\nnamespace FEXCore::Context {\n\nenum OperatingMode {\n  MODE_32BIT,\n  MODE_64BIT,\n};\n\nusing CodeRangeInvalidationFn = std::function<void(uint64_t start, uint64_t Length)>;\n\nusing CustomIREntrypointHandler = std::function<void(uintptr_t Entrypoint, IR::IREmitter*)>;\n\nusing ExitHandler = std::function<void(Core::InternalThreadState* Thread)>;\n\nclass Context {\npublic:\n  virtual ~Context() = default;\n  /**\n   * @brief [[threadsafe]] Create a new FEXCore context object\n   *\n   * This is necessary to do when running threaded contexts\n   *\n   * @return a new context object\n   */\n  FEX_DEFAULT_VISIBILITY static fextl::unique_ptr<FEXCore::Context::Context> CreateNewContext(const FEXCore::HostFeatures& Features);\n\n  /**\n   * @brief Allows setting up in memory code and other things prior to launchign code execution\n   *\n   * @param CTX The context that we created\n   * @param Loader The loader that will be doing all the code loading\n   *\n   * @return true if we loaded code\n   */\n  FEX_DEFAULT_VISIBILITY virtual bool InitCore() = 0;\n\n  /**\n   * @brief Executes the supplied thread context on the current thread until a return is requested\n   */\n  FEX_DEFAULT_VISIBILITY virtual void ExecuteThread(FEXCore::Core::InternalThreadState* Thread) = 0;\n\n  FEX_DEFAULT_VISIBILITY virtual bool CheckIfBlockIsCacheable(FEXCore::Core::InternalThreadState& Thread, uint64_t GuestRIP, uint64_t MaxInst) = 0;\n  FEX_DEFAULT_VISIBILITY virtual void CompileRIP(FEXCore::Core::InternalThreadState* Thread, uint64_t GuestRIP) = 0;\n  FEX_DEFAULT_VISIBILITY virtual void CompileRIPCount(FEXCore::Core::InternalThreadState* Thread, uint64_t GuestRIP, uint64_t MaxInst) = 0;\n\n  FEX_DEFAULT_VISIBILITY virtual void HandleCallback(FEXCore::Core::InternalThreadState* Thread, uint64_t RIP) = 0;\n\n  FEX_DEFAULT_VISIBILITY virtual bool IsAddressInCurrentBlock(FEXCore::Core::InternalThreadState* Thread, uint64_t Address, uint64_t Size) = 0;\n  FEX_DEFAULT_VISIBILITY virtual bool IsCurrentBlockSingleInst(FEXCore::Core::InternalThreadState* Thread) = 0;\n  FEX_DEFAULT_VISIBILITY virtual uint64_t GetGuestBlockEntry(FEXCore::Core::InternalThreadState* Thread) = 0;\n\n  ///< State reconstruction helpers\n  ///< Reconstructs the guest RIP from the passed in thread context and related Host PC.\n  FEX_DEFAULT_VISIBILITY virtual uint64_t RestoreRIPFromHostPC(FEXCore::Core::InternalThreadState* Thread, uint64_t HostPC) = 0;\n  /**\n   * @brief Reconstructs a compacted EFLAGS from FEX's internal EFLAG representation.\n   *\n   * @param Thread The thread getting the state reconstructed\n   * @param WasInJIT If the code was in the JIT at the time.\n   * @param HostGPRs The host Arm64 GPRs at the point of state inside the JIT.\n   * @param PSTATE The Arm64 PState value.\n   *\n   * If WasInJIT is false then HostGPRs and PSTATE is ignored, with the assumption that the FEX JIT has already stored all state in to the\n   * ThreadState object.\n   *\n   * @return x86 EFLAGS reconstructed\n   */\n  FEX_DEFAULT_VISIBILITY virtual uint32_t\n  ReconstructCompactedEFLAGS(FEXCore::Core::InternalThreadState* Thread, bool WasInJIT, const uint64_t* HostGPRs, uint64_t PSTATE) = 0;\n  ///< Sets FEX's internal EFLAGS representation to the passed in compacted form.\n  FEX_DEFAULT_VISIBILITY virtual void SetFlagsFromCompactedEFLAGS(FEXCore::Core::InternalThreadState* Thread, uint32_t EFLAGS) = 0;\n\n  FEX_DEFAULT_VISIBILITY virtual void\n  ReconstructXMMRegisters(const FEXCore::Core::InternalThreadState* Thread, __uint128_t* XMM_Low, __uint128_t* YMM_High) = 0;\n  FEX_DEFAULT_VISIBILITY virtual void\n  SetXMMRegistersFromState(FEXCore::Core::InternalThreadState* Thread, const __uint128_t* XMM_Low, const __uint128_t* YMM_High) = 0;\n\n  /**\n   * @brief Create a new thread object that doesn't inherit any state.\n   * Used to create FEX thread objects in preparation for creating a true OS thread.\n   *\n   * @param InitialRIP The starting RIP of this thread\n   * @param StackPointer The starting RSP of this thread\n   * @param NewThreadState The thread state to inherit from if not nullptr.\n   *\n   * @return A new InternalThreadState object for using with a new guest thread.\n   */\n\n  FEX_DEFAULT_VISIBILITY virtual FEXCore::Core::InternalThreadState*\n  CreateThread(uint64_t InitialRIP, uint64_t StackPointer, const FEXCore::Core::CPUState* NewThreadState = nullptr) = 0;\n\n  FEX_DEFAULT_VISIBILITY virtual void DestroyThread(FEXCore::Core::InternalThreadState* Thread) = 0;\n#ifndef _WIN32\n  FEX_DEFAULT_VISIBILITY virtual void LockBeforeFork(FEXCore::Core::InternalThreadState* Thread) {}\n  FEX_DEFAULT_VISIBILITY virtual void UnlockAfterFork(FEXCore::Core::InternalThreadState* Thread, bool Child) {}\n#endif\n  FEX_DEFAULT_VISIBILITY virtual void SetSignalDelegator(FEXCore::SignalDelegator* SignalDelegation) = 0;\n  FEX_DEFAULT_VISIBILITY virtual void SetSyscallHandler(FEXCore::HLE::SyscallHandler* Handler) = 0;\n  FEX_DEFAULT_VISIBILITY virtual void SetThunkHandler(FEXCore::ThunkHandler* Handler) = 0;\n\n  FEX_DEFAULT_VISIBILITY virtual FEXCore::CPUID::FunctionResults RunCPUIDFunction(uint32_t Function, uint32_t Leaf) = 0;\n  FEX_DEFAULT_VISIBILITY virtual FEXCore::CPUID::XCRResults RunXCRFunction(uint32_t Function) = 0;\n  FEX_DEFAULT_VISIBILITY virtual FEXCore::CPUID::FunctionResults RunCPUIDFunctionName(uint32_t Function, uint32_t Leaf, uint32_t CPU) = 0;\n\n  virtual AbstractCodeCache& GetCodeCache() = 0;\n  virtual void SetCodeMapWriter(fextl::unique_ptr<CodeMapWriter>) = 0;\n  virtual void FlushAndCloseCodeMap() = 0;\n\n  FEX_DEFAULT_VISIBILITY virtual void ClearCodeCache(FEXCore::Core::InternalThreadState* Thread, bool NewCodeBuffer = true) = 0;\n  FEX_DEFAULT_VISIBILITY virtual void InvalidateCodeBuffersCodeRange(uint64_t Start, uint64_t Length) = 0;\n  FEX_DEFAULT_VISIBILITY virtual void\n  InvalidateThreadCachedCodeRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Start, uint64_t Length) = 0;\n  FEX_DEFAULT_VISIBILITY virtual FEXCore::ForkableSharedMutex& GetCodeInvalidationMutex() = 0;\n\n  FEX_DEFAULT_VISIBILITY virtual void\n  ConfigureAOTGen(FEXCore::Core::InternalThreadState* Thread, fextl::set<uint64_t>* ExternalBranches, uint64_t SectionMaxAddress) = 0;\n\n  /**\n   * @brief Checks if a PC is inside any code buffer used by the thread's JIT.\n   *\n   * @param Thread Which thread's code buffers to check inside of.\n   * @param Address The PC to check against.\n   *\n   * @return true if PC is inside the thread's code buffers.\n   */\n  FEX_DEFAULT_VISIBILITY virtual bool IsAddressInCodeBuffer(FEXCore::Core::InternalThreadState* Thread, uintptr_t Address) const = 0;\n\n  /**\n   * @brief Informs the context if hardware TSO is supported.\n   * Once hardware TSO is enabled, then TSO emulation through atomics is disabled and relies on the hardware.\n   *\n   * @param HardwareTSOSupported If the hardware supports the TSO memory model or not.\n   */\n  FEX_DEFAULT_VISIBILITY virtual void SetHardwareTSOSupport(bool HardwareTSOSupported) = 0;\n\n  /**\n   * @brief Enable exiting the JIT when HLT is hit.\n   *\n   * This is to workaround a bug in Wine's longjump function which breaks our unittests.\n   *\n   */\n  FEX_DEFAULT_VISIBILITY virtual void EnableExitOnHLT() = 0;\n\n  /**\n   * @brief Adds a new Thunk trampoline handler\n   *\n   * @param Entrypoint The guest PC that the custom thunk trampoline IR handler will be installed at.\n   * @param GuestThunkEntrypoint The thunk entrypoint that the IR handler will redirect to.\n   */\n  FEX_DEFAULT_VISIBILITY virtual void AddThunkTrampolineIRHandler(uintptr_t Entrypoint, uintptr_t GuestThunkEntrypoint) = 0;\n\n  /**\n   * @brief Adds additional per-instruction granularity TSO enable/disable information for the given range.\n   *\n   * @param ValidRanges The set of address ranges covered by this information\n   * @param Instructions The set of instruction addresses within the given ranges for which TSO should be enabled\n   */\n  FEX_DEFAULT_VISIBILITY virtual void AddForceTSOInformation(const IntervalList<uint64_t>& ValidRanges, fextl::set<uint64_t>&& Instructions) = 0;\n\n  FEX_DEFAULT_VISIBILITY virtual void RemoveForceTSOInformation(uint64_t Address, uint64_t Size) = 0;\n\n  FEX_DEFAULT_VISIBILITY virtual void MarkMonoDetected() = 0;\n\n  FEX_DEFAULT_VISIBILITY virtual void MarkMonoBackpatcherBlock(uint64_t BlockEntry) = 0;\nprivate:\n};\n} // namespace FEXCore::Context\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Core/CoreState.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/Telemetry.h>\n\n#include <atomic>\n#include <cstddef>\n#include <cstring>\n#include <stdint.h>\n#include <string_view>\n#include <type_traits>\n\nnamespace FEXCore::Core {\n// Wrapper around std::atomic using std::memory_order_relaxed.\n// This allows compilers to emit more performant code at the expense of visibly tearing.\n// In particular, increments/decrements may visibly tear if a signal is received half-way through.\n//\n// Prefer std::atomic with default memory ordering unless you really know what you're doing.\n// Primarily this ensure program ordering when signals are concerned.\ntemplate<typename T>\nclass NonAtomicRefCounter {\npublic:\n  void Increment(T Value) {\n    // Specifically avoiding fetch_add here because that will turn in to ldxr+stxr or lock xadd.\n    // FEX very specifically wants to use simple loadstore instructions for this\n    //\n    // ARM64 ex:\n    // ldr x0, [x1];\n    // add x0, x0, #1;\n    // str x0, [x1];\n    //\n    // x86-64 ex:\n    // inc qword [rax];\n    auto Current = AtomicVariable.load(std::memory_order_relaxed);\n    AtomicVariable.store(Current + Value, std::memory_order_relaxed);\n  }\n\n  // Returns original value.\n  // x86-64 needs to know the result on decrement.\n  T Decrement(T Value) {\n    // Specifically avoiding fetch_sub here because that will turn into ldxr+stxr or lock xadd.\n    // FEX very specifically wants to use simple loadstore instructions for this\n    //\n    // ARM64 ex:\n    // ldr x0, [x1];\n    // sub x0, x0, #1;\n    // str x0, [x1];\n    //\n    // x86-64 ex:\n    // dec qword [rax];\n    auto Current = AtomicVariable.load(std::memory_order_relaxed);\n    AtomicVariable.store(Current - Value, std::memory_order_relaxed);\n    return Current;\n  }\n\n  T Load() const {\n    return AtomicVariable.load(std::memory_order_relaxed);\n  }\n\n  void Store(T Value) {\n    AtomicVariable.store(Value, std::memory_order_relaxed);\n  }\n\nprivate:\n  std::atomic<T> AtomicVariable;\n};\nstatic_assert(std::is_standard_layout_v<NonAtomicRefCounter<uint64_t>>, \"Needs to be standard layout\");\nstatic_assert(std::is_trivially_copyable_v<NonAtomicRefCounter<uint64_t>>, \"needs to be trivially copyable\");\nstatic_assert(sizeof(NonAtomicRefCounter<uint64_t>) == sizeof(uint64_t), \"Needs to be correct size\");\n\nstruct alignas(64) CPUState {\n  // Allows more efficient handling of the register\n  // file in the event AVX is not supported.\n  union XMMRegs {\n    struct AVX {\n      uint64_t data[16][4];\n    };\n    struct SSE {\n      uint64_t data[16][2];\n      uint64_t pad[16][2];\n    };\n\n    AVX avx;\n    SSE sse;\n  };\n\n  // Cacheline: 0\n  uint64_t InlineJITBlockHeader {};\n  // Reference counter for FEX's per-thread deferred signals.\n  // Counts the nesting depth of program sections that cause signals to be deferred.\n  NonAtomicRefCounter<uint64_t> DeferredSignalRefCount;\n\n  // PF/AF raw values. Really only a byte of each matters, but this layout\n  // (32-bits and in the first 256 bytes) is necessary to use ldp/stp to\n  // spill/fill these togethers efficiently.\n  // pf_raw must be initialized to 1 so that reconstructed PF = 0 (matching x86 reset state).\n  // PF reconstruction: popcount(pf_raw ^ 1) & 1, so pf_raw=1 gives PF=0.\n  uint32_t pf_raw {1};\n  uint32_t af_raw {};\n\n  uint64_t rip {}; ///< Current core's RIP. May not be entirely accurate while JIT is active\n\n  uint64_t gregs[16] {};\n  uint64_t L1Pointer {};\n  uint64_t L1Mask {};\n  uint64_t callret_sp {};\n  uint64_t _pad1 {};\n\n  // Cacheline: 1,2,3,4\n  // The high 128-bits of AVX registers when not being emulated by SVE256.\n  uint64_t avx_high[16][2];\n\n  // Cacheline: 5-12\n  XMMRegs xmm {};\n\n  // Cacheline: 13 and onwards.\n  // Raw segment register indexes\n  uint16_t es_idx {}, cs_idx {}, ss_idx {}, ds_idx {};\n  uint16_t gs_idx {}, fs_idx {};\n  uint32_t mxcsr {};\n\n  // Segment registers holding base addresses\n  uint32_t es_cached {}, cs_cached {}, ss_cached {}, ds_cached {};\n  uint64_t gs_cached {};\n  uint64_t fs_cached {};\n  uint8_t flags[48] {};\n  uint64_t mm[8][2] {};\n\n  // 32bit x86 state\n  struct gdt_segment {\n    uint16_t Limit0;\n    uint16_t Base0;\n    uint16_t Base1  : 8;\n    uint16_t Type   : 4;\n    uint16_t S      : 1;\n    uint16_t DPL    : 2;\n    uint16_t P      : 1;\n    uint16_t Limit1 : 4;\n    uint16_t AVL    : 1;\n    uint16_t L      : 1;\n    uint16_t D      : 1;\n    uint16_t G      : 1;\n    uint16_t Base2  : 8;\n  };\n\n  // Array of segments (Access offset matches segment selector TI bit)\n  // 0 : GDT\n  // 1 : LDT\n  // Segments are global to the process.\n  // GDT segments are only 32-objects in size.\n  //   - Kernel allocates a handful of these for various things.\n  //   - Three are reserved for user-space to setup TLS segments in\n  // LDT segments are entirely controlled by userspace.\n  //   - Kernel allocates up to 8192 ldt segments.\n  gdt_segment* segment_arrays[2] {};\n\n  static gdt_segment* GetSegmentFromIndex(CPUState& State, uint16_t Selector) {\n    auto base = State.segment_arrays[(Selector >> 2) & 1];\n    return &base[Selector >> 3];\n  }\n\n  static uint32_t CalculateGDTBase(gdt_segment GDT) {\n    uint32_t Base {};\n    Base |= GDT.Base2 << 24;\n    Base |= GDT.Base1 << 16;\n    Base |= GDT.Base0;\n    return Base;\n  }\n\n  static uint32_t CalculateGDTLimit(gdt_segment GDT) {\n    uint32_t Limit {};\n    Limit |= GDT.Limit1 << 16;\n    Limit |= GDT.Limit0;\n    return Limit;\n  }\n\n  static void SetGDTBase(gdt_segment* GDT, uint32_t Base) {\n    GDT->Base0 = Base;\n    GDT->Base1 = Base >> 16;\n    GDT->Base2 = Base >> 24;\n  }\n\n  static void SetGDTLimit(gdt_segment* GDT, uint32_t Limit) {\n    GDT->Limit0 = Limit;\n    GDT->Limit1 = Limit >> 16;\n  }\n\n  uint16_t FCW {0x37F};\n  uint8_t AbridgedFTW {};\n\n  uint8_t _pad2[5];\n  // PF/AF are statically mapped as-if they were r16/r17 (which do not exist in\n  // x86 otherwise). This allows a straightforward mapping for SRA.\n  static constexpr uint8_t PF_AS_GREG = 16;\n  static constexpr uint8_t AF_AS_GREG = 17;\n\n  static constexpr size_t FLAG_SIZE = sizeof(flags[0]);\n  static constexpr size_t GDT_SIZE = sizeof(gdt_segment);\n  static_assert(GDT_SIZE == sizeof(uint64_t), \"Segments required to be 8-byte in size.\");\n  static constexpr size_t GPR_REG_SIZE = sizeof(gregs[0]);\n  static constexpr size_t XMM_AVX_REG_SIZE = sizeof(xmm.avx.data[0]);\n  static constexpr size_t XMM_SSE_REG_SIZE = XMM_AVX_REG_SIZE / 2;\n  static constexpr size_t MM_REG_SIZE = sizeof(mm[0]);\n\n  // Only the first 32 bits are defined.\n  static constexpr size_t NUM_EFLAG_BITS = 32;\n  static constexpr size_t NUM_FLAGS = sizeof(flags) / FLAG_SIZE;\n  static constexpr size_t NUM_GPRS = sizeof(gregs) / GPR_REG_SIZE;\n  static constexpr size_t NUM_XMMS = sizeof(xmm) / XMM_AVX_REG_SIZE;\n  static constexpr size_t NUM_MMS = sizeof(mm) / MM_REG_SIZE;\n  CPUState() {\n#ifndef NDEBUG\n    // Initialize default CPU state\n    rip = ~0ULL;\n    // Initialize xmm state with garbage to catch spurious incorrect xmm usage.\n    for (auto& xmm : xmm.avx.data) {\n      xmm[0] = 0xDEADBEEFULL;\n      xmm[1] = 0xBAD0DAD1ULL;\n      xmm[2] = 0xDEADCAFEULL;\n      xmm[3] = 0xBAD2CAD3ULL;\n    }\n#endif\n\n    flags[X86State::RFLAG_RESERVED_LOC] = 1; ///< Reserved - Always 1.\n    flags[X86State::RFLAG_IF_LOC] = 1;       ///< Interrupt flag - Always 1.\n\n    // DF needs to be initialized to 0 to comply with the Linux ABI. However,\n    // we encode DF as 1/-1 within the JIT, so we have to write 0x1 here to\n    // zero DF.\n    flags[X86State::RFLAG_DF_RAW_LOC] = 0x1;\n\n    // Likewise, SF/ZF/CF/OF must be cleared. This would be simply zeroing\n    // NZCV... but we invert CF inside the JIT. So set just bit 29 (carry).\n    flags[X86State::RFLAG_NZCV_3_LOC] = (1 << (29 - 24));\n\n    // Default mxcsr value\n    // All exception masks enabled.\n    mxcsr = 0x1F80;\n  }\n\n  // TODO: This should be moved to the frontend.\n  constexpr static uint32_t DEFAULT_USER_CS = 6;\n\n  // Follows encoding of the TI bit in segment selector encoding.\n  constexpr static uint32_t SEGMENT_ARRAY_INDEX_GDT = 0;\n  constexpr static uint32_t SEGMENT_ARRAY_INDEX_LDT = 1;\n  Core::CPUState::gdt_segment private_gdt[32] {};\n};\nstatic_assert(std::is_trivially_copyable_v<CPUState>, \"Needs to be trivial\");\nstatic_assert(std::is_standard_layout_v<CPUState>, \"This needs to be standard layout\");\nstatic_assert(alignof(CPUState) == 64, \"CPUState needs to be 64-byte aligned!\");\nstatic_assert(offsetof(CPUState, avx_high) % 64 == 0, \"avx_high needs to be 64-byte aligned!\");\nstatic_assert(offsetof(CPUState, xmm) % 32 == 0, \"xmm needs to be 256-bit aligned!\");\nstatic_assert(offsetof(CPUState, mm) % 16 == 0, \"mm needs to be 128-bit aligned!\");\nstatic_assert(offsetof(CPUState, gregs[15]) <= 504, \"gregs maximum offset must be <= 504 for ldp/stp to work\");\nstatic_assert(offsetof(CPUState, DeferredSignalRefCount) % 8 == 0, \"Needs to be 8-byte aligned\");\nstatic_assert(offsetof(CPUState, L1Pointer) <= 504, \"This needs to be <= 504 for ldp\");\nstatic_assert(offsetof(CPUState, L1Mask) == (offsetof(CPUState, L1Pointer) + 8), \"These two variables are paired\");\nstatic_assert(offsetof(CPUState, pf_raw) <= 252, \"pf_raw must be within ldp imm offset range\");\nstatic_assert((offsetof(CPUState, pf_raw) + 4) == offsetof(CPUState, af_raw), \"pf_raw and af_raw must be sequential\");\n\n// Some CPU architectures have a penalty for alignment of ldp/stp not being 2 * <element_size>.\nstatic_assert(offsetof(CPUState, gregs[0]) % 16 == 0, \"gregs should be 16-byte aligned\");\nstatic_assert(offsetof(CPUState, pf_raw) % 8 == 0, \"pf_raw must be 8-byte aligned.\");\n\nstruct InternalThreadState;\n\nenum FallbackHandlerIndex {\n  OPINDEX_F80CVTTO_4 = 0,\n  OPINDEX_F80CVTTO_8,\n  OPINDEX_F80CVT_4,\n  OPINDEX_F80CVT_8,\n  OPINDEX_F80CVTINT_2,\n  OPINDEX_F80CVTINT_4,\n  OPINDEX_F80CVTINT_8,\n  OPINDEX_F80CVTINT_TRUNC2,\n  OPINDEX_F80CVTINT_TRUNC4,\n  OPINDEX_F80CVTINT_TRUNC8,\n  OPINDEX_F80CMP,\n  OPINDEX_F80CVTTOINT_2,\n  OPINDEX_F80CVTTOINT_4,\n\n  // Unary\n  OPINDEX_F80ROUND,\n  OPINDEX_F80F2XM1,\n  OPINDEX_F80TAN,\n  OPINDEX_F80SQRT,\n  OPINDEX_F80SIN,\n  OPINDEX_F80COS,\n  OPINDEX_F80SINCOS,\n  OPINDEX_F80XTRACT_EXP,\n  OPINDEX_F80XTRACT_SIG,\n  OPINDEX_F80BCDSTORE,\n  OPINDEX_F80BCDLOAD,\n\n  // Binary\n  OPINDEX_F80ADD,\n  OPINDEX_F80SUB,\n  OPINDEX_F80MUL,\n  OPINDEX_F80DIV,\n  OPINDEX_F80FYL2X,\n  OPINDEX_F80ATAN,\n  OPINDEX_F80FPREM1,\n  OPINDEX_F80FPREM,\n  OPINDEX_F80SCALE,\n\n  // Double Precision\n  OPINDEX_F64SIN,\n  OPINDEX_F64COS,\n  OPINDEX_F64SINCOS,\n  OPINDEX_F64TAN,\n  OPINDEX_F64ATAN,\n  OPINDEX_F64F2XM1,\n  OPINDEX_F64FYL2X,\n  OPINDEX_F64FPREM,\n  OPINDEX_F64FPREM1,\n  OPINDEX_F64SCALE,\n\n  // SSE4.2 string instructions\n  OPINDEX_VPCMPESTRX,\n  OPINDEX_VPCMPISTRX,\n\n  // Maximum\n  OPINDEX_MAX,\n};\n\nstruct FallbackABIInfo {\n  uint64_t ABIHandler;\n  uint64_t Func;\n};\n\nstruct JITPointers {\n\n  // Process specific\n  uint64_t PrintValue {};\n  uint64_t PrintVectorValue {};\n  uint64_t ThreadRemoveCodeEntryFromJIT {};\n  uint64_t CPUIDObj {};\n  uint64_t CPUIDFunction {};\n  uint64_t XCRFunction {};\n  uint64_t SyscallHandlerObj {};\n  uint64_t SyscallHandlerFunc {};\n  uint64_t ExitFunctionLink {};\n  uint64_t MonoBackpatcherWrite {};\n  uint64_t LUDIV {};\n  uint64_t LDIV {};\n  uint64_t ThunkCallbackRet {};\n\n  // Handles returning/calling ARM64EC code from the JIT, expects the target PC in TMP3\n  uint64_t ExitFunctionEC {};\n\n  FallbackABIInfo FallbackHandlerPointers[FallbackHandlerIndex::OPINDEX_MAX];\n  uint64_t NamedVectorConstantPointers[FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_CONST_POOL_MAX];\n  uint64_t IndexedNamedVectorConstantPointers[FEXCore::IR::IndexNamedVectorConstant::INDEXED_NAMED_VECTOR_MAX];\n  uint64_t TelemetryValueAddresses[FEXCore::Telemetry::TYPE_LAST];\n\n  /**\n   * @name Dispatcher pointers\n   * @{ */\n  uint64_t DispatcherLoopTop {};\n  uint64_t DispatcherLoopTopFillSRA {};\n  uint64_t DispatcherLoopTopEnterEC {};\n  uint64_t DispatcherLoopTopEnterECFillSRA {};\n  uint64_t ExitFunctionLinker {};\n  uint64_t ThreadStopHandlerSpillSRA {};\n  uint64_t ThreadPauseHandlerSpillSRA {};\n  uint64_t GuestSignal_SIGILL {};\n  uint64_t GuestSignal_SIGTRAP {};\n  uint64_t GuestSignal_SIGSEGV {};\n  uint64_t SignalReturnHandler {};\n  uint64_t SignalReturnHandlerRT {};\n  uint64_t L2Pointer {};\n  uint64_t LUDIVHandler {};\n  uint64_t LDIVHandler {};\n  uint64_t F64SinHandler {};\n  uint64_t F64CosHandler {};\n  uint64_t F64TanHandler {};\n  /**  @} */\n\n  // Copy of process-wide named vector constants data.\n  alignas(16) uint64_t NamedVectorConstants[FEXCore::IR::NamedVectorConstant::NAMED_VECTOR_CONST_POOL_MAX][2];\n};\n\n// Each guest JIT frame has one of these\nstruct CpuStateFrame {\n  CPUState State;\n\n  /**\n   * @brief Stack location for the CPU backends to return the stack pointer to\n   *\n   * Allows the CPU cores to do a long jump out of their execution and safely shut down\n   */\n  uint64_t ReturningStackLocation {};\n\n  /**\n   * @brief If we are in an inline syscall we need to store a bit of additional information about this\n   *\n   * ARM64:\n   *  - Bit 15: In syscall\n   *  - Bit 14-0: Number of static registers spilled\n   */\n  uint64_t InSyscallInfo {};\n\n  uint32_t SignalHandlerRefCounter {};\n\n  struct alignas(8) SynchronousFaultDataStruct {\n    bool FaultToTopAndGeneratedException {};\n    uint8_t Signal;\n    uint8_t TrapNo;\n    uint8_t si_code;\n    uint16_t err_code;\n    uint16_t _pad : 16;\n  } SynchronousFaultData;\n\n  InternalThreadState* Thread;\n\n#ifdef ARCHITECTURE_arm64ec\n  // Set by the kernel on ARM64EC whenever the JIT should cooperatively suspend running guest code.\n  uint32_t SuspendDoorbell {};\n#endif\n\n  // Pointers that the JIT needs to load to remove relocations\n  JITPointers Pointers;\n};\nstatic_assert(offsetof(CpuStateFrame, State) == 0, \"CPUState must be first member in CpuStateFrame\");\nstatic_assert(offsetof(CpuStateFrame, Pointers) % 8 == 0, \"JITPointers need to be aligned to 8 bytes\");\nstatic_assert(offsetof(CpuStateFrame, Pointers) + sizeof(CpuStateFrame::Pointers) <= 32760, \"JITPointers maximum pointer needs to be less \"\n                                                                                            \"than architecture maximum 32768\");\n\nstatic_assert(std::is_standard_layout<CpuStateFrame>::value, \"This needs to be standard layout\");\nstatic_assert(sizeof(CpuStateFrame::SynchronousFaultData) == 8, \"This needs to be 8 bytes\");\nstatic_assert(alignof(CpuStateFrame::SynchronousFaultDataStruct) == 8, \"This needs to be 8 bytes\");\nstatic_assert(offsetof(CpuStateFrame, SynchronousFaultData) % 8 == 0, \"This needs to be aligned\");\n} // namespace FEXCore::Core\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Core/HostFeatures.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/fextl/vector.h>\n#include <cstdint>\n\nnamespace FEXCore {\nstruct HostFeatures {\n  /**\n   * @brief Backend features that change how codegen is generated from IR\n   *\n   * Specifically things that affect the IR->Codegen process\n   * Not the x86->IR process\n   */\n  uint32_t DCacheLineSize {};\n  uint32_t ICacheLineSize {};\n  bool SupportsCacheMaintenanceOps {};\n  bool SupportsAES {};\n  bool SupportsCRC {};\n  bool SupportsCLZERO {};\n  bool SupportsAtomics {};\n  bool SupportsRCPC {};\n  bool SupportsTSOImm9 {};\n  bool SupportsRAND {};\n  bool SupportsAVX {};\n  bool SupportsSVE128 {};\n  bool SupportsSVE256 {};\n  bool SupportsSHA {};\n  bool SupportsPMULL_128Bit {};\n  bool SupportsCSSC {};\n  bool SupportsFCMA {};\n  bool SupportsFlagM {};\n  bool SupportsFlagM2 {};\n  bool SupportsRPRES {};\n  bool SupportsPreserveAllABI {};\n  bool SupportsAES256 {};\n  bool SupportsSVEBitPerm {};\n  bool SupportsCPUIndexInTPIDRRO {};\n  bool SupportsFRINTTS {};\n  bool SupportsECV {};\n  bool SupportsWFXT {};\n  bool Supports3DNow {};\n  bool SupportsSSE4a {};\n  bool SupportsMOPS {};\n\n  // Float exception behaviour\n  bool SupportsAFP {};\n  bool SupportsFloatExceptions {};\n\n  // Flag if this is InstCountCI\n  bool IsInstCountCI {};\n\n  // MIDR information\n  // Also used for determining number of CPU cores for CPUID\n  fextl::vector<uint32_t> CPUMIDRs;\n};\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Core/SignalDelegator.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <array>\n#include <cstdint>\n#include <csignal>\n\nnamespace FEXCore {\nnamespace Core {\n  struct InternalThreadState;\n\n  enum SignalNumber {\n#ifndef _WIN32\n    FAULT_SIGSEGV = SIGSEGV,\n    FAULT_SIGTRAP = SIGTRAP,\n    FAULT_SIGILL = SIGILL,\n#else\n    FAULT_SIGSEGV = 11,\n    FAULT_SIGTRAP = 5,\n    FAULT_SIGILL = 4,\n#endif\n  };\n} // namespace Core\n\nstruct SignalDelegatorConfig {\n  using SRAIndexMapping = std::array<uint8_t, 16>;\n\n  // Dispatcher information\n  uint64_t DispatcherBegin;\n  uint64_t DispatcherEnd;\n\n  // Dispatcher entrypoint.\n  uint64_t AbsoluteLoopTopAddress {};\n  uint64_t AbsoluteLoopTopAddressFillSRA {};\n\n  // Signal return pointers.\n  uint64_t SignalHandlerReturnAddress {};\n  uint64_t SignalHandlerReturnAddressRT {};\n\n  // Pause handlers.\n  uint64_t PauseReturnInstruction {};\n  uint64_t ThreadPauseHandlerAddressSpillSRA {};\n  uint64_t ThreadPauseHandlerAddress {};\n\n  // Stop handlers.\n  uint64_t ThreadStopHandlerAddressSpillSRA;\n  uint64_t ThreadStopHandlerAddress {};\n\n  // SRA information.\n  uint16_t SRAGPRCount;\n  uint16_t SRAFPRCount;\n\n  // SRA index mapping.\n  SRAIndexMapping SRAGPRMapping;\n  SRAIndexMapping SRAFPRMapping;\n};\n\nclass SignalDelegator {\npublic:\n  virtual ~SignalDelegator() = default;\n\n  void SetConfig(const SignalDelegatorConfig& Config) {\n    this->Config = Config;\n  }\n\n  const SignalDelegatorConfig& GetConfig() const {\n    return Config;\n  }\n\n  virtual uintptr_t GetThunkCallbackRET() const {\n    return 0;\n  }\n\nprotected:\n  SignalDelegatorConfig Config;\n};\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Core/Thunks.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: glue|thunks\n$end_info$\n*/\n\n#pragma once\n\nnamespace FEXCore::IR {\nstruct SHA256Sum;\n}\n\nnamespace FEXCore {\ntypedef void ThunkedFunction(void* ArgsRv);\n\nclass ThunkHandler {\npublic:\n  virtual ~ThunkHandler() = default;\n  virtual ThunkedFunction* LookupThunk(const IR::SHA256Sum& sha256) = 0;\n};\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Core/X86Enums.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <cstdint>\n\nnamespace FEXCore::X86State {\n/**\n * @name The ordered of the GPRs from name to index\n * @{ */\nenum X86Reg : uint32_t {\n  REG_RAX = 0,\n  REG_RCX = 1,\n  REG_RDX = 2,\n  REG_RBX = 3,\n  REG_RSP = 4,\n  REG_RBP = 5,\n  REG_RSI = 6,\n  REG_RDI = 7,\n  REG_R8 = 8,\n  REG_R9 = 9,\n  REG_R10 = 10,\n  REG_R11 = 11,\n  REG_R12 = 12,\n  REG_R13 = 13,\n  REG_R14 = 14,\n  REG_R15 = 15,\n  REG_XMM_0 = 16,\n  REG_XMM_1 = 17,\n  REG_XMM_2 = 18,\n  REG_XMM_3 = 19,\n  REG_XMM_4 = 20,\n  REG_XMM_5 = 21,\n  REG_XMM_6 = 22,\n  REG_XMM_7 = 23,\n  REG_XMM_8 = 24,\n  REG_XMM_9 = 25,\n  REG_XMM_10 = 26,\n  REG_XMM_11 = 27,\n  REG_XMM_12 = 28,\n  REG_XMM_13 = 29,\n  REG_XMM_14 = 30,\n  REG_XMM_15 = 31,\n  REG_MM_0 = 32,\n  REG_MM_1 = 33,\n  REG_MM_2 = 34,\n  REG_MM_3 = 35,\n  REG_MM_4 = 36,\n  REG_MM_5 = 37,\n  REG_MM_6 = 38,\n  REG_MM_7 = 39,\n  REG_INVALID = 255,\n};\n/**  @} */\n\n/**\n * @name RFLAG register bit locations\n * @{ */\nenum X86RegLocation : uint32_t {\n  RFLAG_CF_RAW_LOC = 0,   // Not used directly, needs to be reconstructed using `ReconstructCompactedEFLAGS`\n  RFLAG_RESERVED_LOC = 1, // Reserved Bit, Read-as-1\n  RFLAG_PF_RAW_LOC = 2,   // Contains multiple bits, needs to be reconstructed using `ReconstructCompactedEFLAGS`\n  RFLAG_AF_RAW_LOC = 4,   // Contains multiple bits, needs to be reconstructed using `ReconstructCompactedEFLAGS`\n  RFLAG_ZF_RAW_LOC = 6,   // Not used directly, needs to be reconstructed using `ReconstructCompactedEFLAGS`\n  RFLAG_SF_RAW_LOC = 7,   // Not used directly, needs to be reconstructed using `ReconstructCompactedEFLAGS`\n  RFLAG_TF_RAW_LOC = 8,   // Contains multiple bits, needs to be reconstructed using `ReconstructCompactedEFLAGS`\n  RFLAG_IF_LOC = 9,\n  RFLAG_DF_RAW_LOC = 10, // Contains multiple bits, needs to be reconstructed using `ReconstructCompactedEFLAGS`\n  RFLAG_OF_RAW_LOC = 11, // Not used directly, needs to be reconstructed using `ReconstructCompactedEFLAGS`\n  RFLAG_IOPL_LOC = 12,\n  RFLAG_NT_LOC = 14,\n  RFLAG_RF_LOC = 16,\n  RFLAG_VM_LOC = 17,\n  RFLAG_AC_LOC = 18,\n  RFLAG_VIF_LOC = 19,\n  RFLAG_VIP_LOC = 20,\n  RFLAG_ID_LOC = 21,\n\n  // So we can implement arm64-like flag manipulaton on the x86 jit..\n  // SF/ZF/CF/OF packed into a 32-bit word, matching arm64's NZCV structure (not semantics).\n  RFLAG_NZCV_LOC = 24,\n  RFLAG_NZCV_1_LOC = 25,\n  RFLAG_NZCV_2_LOC = 26,\n  RFLAG_NZCV_3_LOC = 27,\n\n  // So we can share flag handling logic, we put x87 flags after RFLAGS\n  X87FLAG_BASE = 32,\n  X87FLAG_IE_LOC = 32,\n  X87FLAG_DE_LOC = 33,\n  X87FLAG_ZE_LOC = 34,\n  X87FLAG_OE_LOC = 35,\n  X87FLAG_UE_LOC = 36,\n  X87FLAG_PE_LOC = 37,\n  X87FLAG_SF_LOC = 38,\n  X87FLAG_ES_LOC = 39,\n  X87FLAG_C0_LOC = 40,\n  X87FLAG_C1_LOC = 41,\n  X87FLAG_C2_LOC = 42,\n  X87FLAG_TOP_LOC = 43, // 3 Bits wide\n  X87FLAG_C3_LOC = 46,\n  X87FLAG_B_LOC = 47,\n};\n\n// X86 trap number definitions\nenum X86TrapNo : uint32_t {\n  X86_TRAPNO_DE = 0,        // Divide-by-zero\n  X86_TRAPNO_DB = 1,        // Debug\n  X86_TRAPNO_NMI = 2,       // Non-maskable interrupt\n  X86_TRAPNO_BP = 3,        // Breakpoint\n  X86_TRAPNO_OF = 4,        // Overflow\n  X86_TRAPNO_BR = 5,        // Bound range exceeded\n  X86_TRAPNO_UD = 6,        // Invalid opcode\n  X86_TRAPNO_NM = 7,        // Device not available\n  X86_TRAPNO_DF = 8,        // Double fault\n  X86_TRAPNO_OLD_MF = 9,    // Coprocessor segment overrun\n  X86_TRAPNO_TS = 10,       // Invalid TSS\n  X86_TRAPNO_NP = 11,       // Segment not present\n  X86_TRAPNO_SS = 12,       // Stack segmentation fault\n  X86_TRAPNO_GP = 13,       // General Protection fault\n  X86_TRAPNO_PF = 14,       // Page fault\n  X86_TRAPNO_SPURIOUS = 15, // Spurious interrupt\n  X86_TRAPNO_MF = 16,       // X87 float exception\n  X86_TRAPNO_AC = 17,       // Alignment check\n  X86_TRAPNO_MC = 18,       // Machine check\n  X86_TRAPNO_XF = 19,       // SIMD floating point exception\n  X86_TRAPNO_VE = 20,       // Virtualization exception\n  X86_TRAPNO_CP = 21,       // Control protection exception\n  X86_TRAPNO_VC = 29,       // VMM communication exception\n  X86_TRAPNO_IRET = 32,     // IRET exception\n};\n\n// X86 page fault error code bits\n// Populates siginfo gregs[REG_ERR]\nenum X86PageFaultBit : uint32_t {\n  X86_PF_PROT = (1 << 0),  // 0: No page found 1: protection fault\n  X86_PF_WRITE = (1 << 1), // 0: Access was read 1: Access was write\n  X86_PF_USER = (1 << 2),  // 0: Kernel mode access 1: user-mode access\n  X86_PF_RSV = (1 << 3),   // 1: Reserved bit?\n  X86_PF_INSTR = (1 << 4), // 1: Fault from instruction fetch\n  X86_PF_PK = (1 << 5),    // 1: Protection keys block access\n  X86_PF_SGX = (1 << 6),   // 1: SGX MMU fault\n};\n\n} // namespace FEXCore::X86State\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Debug/GDBReaderInterface.h",
    "content": "// SPDX-License-Identifier: MIT\n#include <cstddef>\n#include <cstdint>\n\n#include <gdb/jit-reader.h>\n\n// everything is stored inline as it is marshaled cross process by gdb\n\nstruct blocks_t {\n  char name[512];\n  GDB_CORE_ADDR start;\n  GDB_CORE_ADDR end;\n};\n\nstruct info_t {\n  char filename[512];\n\n  ptrdiff_t blocks_ofs;\n  ptrdiff_t lines_ofs;\n\n  int nblocks;\n  int nlines;\n};\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Debug/InternalThreadState.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Utils/AllocatorHooks.h>\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXCore/Utils/LongJump.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <cstddef>\n#include <cstdint>\n#include <shared_mutex>\n#include <type_traits>\n\nnamespace FEXCore {\nclass LookupCache;\nclass CompileService;\nstruct JITSymbolBuffer;\n} // namespace FEXCore\n\nnamespace FEXCore::Context {\nclass Context;\n}\n\nnamespace FEXCore::CPU {\nclass CPUBackend;\n} // namespace FEXCore::CPU\n\nnamespace FEXCore::Frontend {\nclass Decoder;\n}\n\nnamespace FEXCore::IR {\nclass OpDispatchBuilder;\nclass PassManager;\n} // namespace FEXCore::IR\n\nnamespace FEXCore::SHMStats {\nstruct ThreadStats;\n};\n\nnamespace FEXCore::Core {\n\n// Special-purpose replacement for std::unique_ptr to allow InternalThreadState to be standard layout.\n// Since a NonMovableUniquePtr is neither copyable nor movable, its only function is to own and release the contained object.\ntemplate<typename T>\nstruct NonMovableUniquePtr {\n  NonMovableUniquePtr() noexcept = default;\n  NonMovableUniquePtr(const NonMovableUniquePtr&) = delete;\n  NonMovableUniquePtr& operator=(const NonMovableUniquePtr& UPtr) = delete;\n\n  NonMovableUniquePtr& operator=(fextl::unique_ptr<T> UPtr) noexcept {\n    Ptr = UPtr.release();\n    return *this;\n  }\n\n  ~NonMovableUniquePtr() {\n    fextl::default_delete<T> {}(Ptr);\n  }\n\n  T* operator->() const noexcept {\n    return Ptr;\n  }\n\n  std::add_lvalue_reference_t<T> operator*() const noexcept {\n    return *Ptr;\n  }\n\n  T* get() const noexcept {\n    return Ptr;\n  }\n\n  explicit operator bool() const noexcept {\n    return Ptr != nullptr;\n  }\n\nprivate:\n  T* Ptr = nullptr;\n};\nstatic_assert(!std::is_move_constructible_v<NonMovableUniquePtr<int>>);\nstatic_assert(!std::is_move_assignable_v<NonMovableUniquePtr<int>>);\n\n// Store used for unaligned LDAXR*/STLXR* emulation.\nstruct UnalignedExclusiveStore {\n  uint64_t Addr;\n  uint64_t Store;\n  uint8_t Size;\n};\n\nstruct alignas(FEXCore::Utils::FEX_PAGE_SIZE) InternalThreadState : public FEXCore::Allocator::FEXAllocOperators {\n  FEXCore::Core::CpuStateFrame* const CurrentFrame = &BaseFrameState;\n\n  FEXCore::Context::Context* const CTX;\n\n  NonMovableUniquePtr<FEXCore::IR::OpDispatchBuilder> OpDispatcher;\n\n  NonMovableUniquePtr<FEXCore::CPU::CPUBackend> CPUBackend;\n  NonMovableUniquePtr<FEXCore::LookupCache> LookupCache;\n\n  NonMovableUniquePtr<FEXCore::Frontend::Decoder> FrontendDecoder;\n  NonMovableUniquePtr<FEXCore::IR::PassManager> PassManager;\n  NonMovableUniquePtr<JITSymbolBuffer> SymbolBuffer;\n\n  std::shared_ptr<FEXCore::CompileService> CompileService;\n\n  std::shared_mutex ObjectCacheRefCounter {};\n\n  // This pointer is owned by the frontend.\n  FEXCore::SHMStats::ThreadStats* ThreadStats {};\n\n  UnalignedExclusiveStore ExclusiveStore;\n\n  ///< Data pointer for exclusive use by the frontend\n  void* FrontendPtr;\n\n  static constexpr size_t CALLRET_STACK_SIZE {0x400000};\n\n  // The low address of the call-ret stack allocation (not including guard pages)\n  void* CallRetStackBase {};\n\n  uintptr_t JITGuardPage {};\n  uint64_t JITGuardOverflowArgument {};\n  FEXCore::UncheckedLongJump::JumpBuf RestartJump;\n\n  // BaseFrameState should always be at the end, directly before the interrupt fault page\n  FEXCore::Core::CpuStateFrame BaseFrameState {};\n\n  // Can be reprotected as RO to trigger an interrupt at generated code block entrypoints\n  alignas(FEXCore::Utils::FEX_PAGE_SIZE) uint8_t InterruptFaultPage[FEXCore::Utils::FEX_PAGE_SIZE];\n};\nstatic_assert(std::is_standard_layout_v<FEXCore::Core::InternalThreadState>);\nstatic_assert((offsetof(FEXCore::Core::InternalThreadState, InterruptFaultPage) - offsetof(FEXCore::Core::InternalThreadState, BaseFrameState)) <\n                FEXCore::Utils::FEX_PAGE_SIZE,\n              \"Fault page is outside of immediate range from CPU state\");\nstatic_assert(sizeof(FEXCore::Core::InternalThreadState) == (FEXCore::Utils::FEX_PAGE_SIZE * 2));\n\n} // namespace FEXCore::Core\n"
  },
  {
    "path": "FEXCore/include/FEXCore/HLE/SourcecodeResolver.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <algorithm>\n#include <memory>\n#include <filesystem>\n\nnamespace FEXCore::HLE {\n\nstruct SourcecodeLineMapping {\n  uintptr_t FileGuestBegin;\n  uintptr_t FileGuestEnd;\n\n  int LineNumber;\n};\n\nstruct SourcecodeSymbolMapping {\n  uintptr_t FileGuestBegin;\n  uintptr_t FileGuestEnd;\n\n  fextl::string Name;\n\n  static fextl::string SymName(const SourcecodeSymbolMapping* Sym, const fextl::string& GuestFilename, uintptr_t HostEntry, uintptr_t FileBegin) {\n    if (Sym) {\n      auto SymOffset = FileBegin - Sym->FileGuestBegin;\n      if (SymOffset) {\n        return fextl::fmt::format(\"{}: {}+{} @{:x}\", std::filesystem::path(GuestFilename).stem().string(), Sym->Name, SymOffset, HostEntry);\n      } else {\n        return fextl::fmt::format(\"{}: {} @{:x}\", std::filesystem::path(GuestFilename).stem().string(), Sym->Name, HostEntry);\n      }\n    } else {\n      return fextl::fmt::format(\"{}: +{} @{:x}\", std::filesystem::path(GuestFilename).stem().string(), FileBegin, HostEntry);\n    }\n  }\n};\n\nstruct SourcecodeMap {\n  fextl::string SourceFile;\n  fextl::vector<SourcecodeLineMapping> SortedLineMappings;\n  fextl::vector<SourcecodeSymbolMapping> SortedSymbolMappings;\n\n  template<typename F>\n  void IterateLineMappings(uintptr_t FileBegin, uintptr_t Size, const F& Callback) const {\n    auto Begin = FileBegin;\n    auto End = FileBegin + Size;\n\n    auto Found = std::lower_bound(SortedLineMappings.cbegin(), SortedLineMappings.cend(), Begin,\n                                  [](const auto& Range, const auto Position) { return Range.FileGuestEnd <= Position; });\n\n    while (Found != SortedLineMappings.cend()) {\n      if (Found->FileGuestBegin < End && Found->FileGuestEnd > Begin) {\n        Callback(Found);\n      } else {\n        break;\n      }\n      Found++;\n    }\n  }\n\n  const SourcecodeLineMapping* FindLineMapping(uintptr_t FileBegin) const {\n    return Find(FileBegin, SortedLineMappings);\n  }\n\n  const SourcecodeSymbolMapping* FindSymbolMapping(uintptr_t FileBegin) const {\n    return Find(FileBegin, SortedSymbolMappings);\n  }\nprivate:\n  template<typename VecT>\n  const typename VecT::value_type* Find(uintptr_t FileBegin, const VecT& SortedMappings) const {\n    auto Found = std::lower_bound(SortedMappings.cbegin(), SortedMappings.cend(), FileBegin,\n                                  [](const auto& Range, const auto Position) { return Range.FileGuestEnd <= Position; });\n\n    if (Found != SortedMappings.end() && Found->FileGuestBegin <= FileBegin && Found->FileGuestEnd > FileBegin) {\n      return &(*Found);\n    } else {\n      return {};\n    }\n  }\n};\n\nclass SourcecodeResolver {\npublic:\n  virtual fextl::unique_ptr<SourcecodeMap> GenerateMap(std::string_view GuestBinaryFile, std::string_view GuestBinaryFileId) = 0;\n};\n} // namespace FEXCore::HLE\n"
  },
  {
    "path": "FEXCore/include/FEXCore/HLE/SyscallHandler.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <cstdint>\n#include <optional>\n\n#include <FEXCore/Core/CodeCache.h>\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/fextl/string.h>\n\nnamespace FEXCore::Context {\nclass Context;\n}\n\nnamespace FEXCore::Core {\nstruct InternalThreadState;\nstruct CpuStateFrame;\n} // namespace FEXCore::Core\n\nnamespace FEXCore::HLE {\nstruct SyscallArguments {\n  static constexpr std::size_t MAX_ARGS = 7;\n  uint64_t Argument[MAX_ARGS];\n};\n\nstruct SyscallABI {\n  // Expectation is that the backend will be aware of how to modify the arguments based on numbering\n  // Only GPRs expected\n  uint8_t NumArgs;\n  // If the syscall has a return then it should be stored in the ABI specific syscall register\n  // Linux = RAX\n  bool HasReturn;\n\n  int32_t HostSyscallNumber;\n};\n\nenum class SyscallOSABI {\n  OS_UNKNOWN,\n  OS_LINUX64,\n  OS_LINUX32,\n  OS_GENERIC, // No JIT-side argument handling, spill/fill all regs.\n};\n\nstruct ExecutableRangeInfo {\n  uint64_t Base;\n  uint64_t Size;\n  bool Writable;\n};\n\nclass SyscallHandler;\nclass SourcecodeResolver;\n\nclass SyscallHandler {\npublic:\n  virtual ~SyscallHandler() = default;\n\n  virtual uint64_t HandleSyscall(FEXCore::Core::CpuStateFrame* Frame, FEXCore::HLE::SyscallArguments* Args) = 0;\n\n  SyscallOSABI GetOSABI() const {\n    return OSABI;\n  }\n  virtual void MarkGuestExecutableRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Start, uint64_t Length) {}\n  virtual void InvalidateGuestCodeRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Start, uint64_t Length) {}\n  virtual void MarkOvercommitRange(uint64_t Start, uint64_t Length) {}\n  virtual void UnmarkOvercommitRange(uint64_t Start, uint64_t Length) {}\n  virtual ExecutableRangeInfo QueryGuestExecutableRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Address) = 0;\n  virtual std::optional<ExecutableFileSectionInfo> LookupExecutableFileSection(Core::InternalThreadState* Thread, uint64_t GuestAddr) = 0;\n\n  virtual void PreCompile() {}\n\n  virtual SourcecodeResolver* GetSourcecodeResolver() {\n    return nullptr;\n  }\n\n  virtual void SleepThread(FEXCore::Context::Context* CTX, FEXCore::Core::CpuStateFrame* Frame) {}\n\nprotected:\n  SyscallOSABI OSABI;\n};\n} // namespace FEXCore::HLE\n"
  },
  {
    "path": "FEXCore/include/FEXCore/IR/IR.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/EnumOperators.h>\n\n#include <compare>\n#include <cstdint>\n#include <cstring>\n\nnamespace FEXCore::IR {\n\n// This enum of named vector constants are linked to an array in CPUBackend.cpp.\n// This is used with the IROp `LoadNamedVectorConstant` to load a vector constant\n// that would otherwise be costly to materialize.\nenum NamedVectorConstant : uint8_t {\n  NAMED_VECTOR_INCREMENTAL_U16_INDEX = 0,\n  NAMED_VECTOR_INCREMENTAL_U16_INDEX_UPPER,\n  NAMED_VECTOR_PADDSUBPS_INVERT,\n  NAMED_VECTOR_PADDSUBPS_INVERT_UPPER,\n  NAMED_VECTOR_PADDSUBPD_INVERT,\n  NAMED_VECTOR_PADDSUBPD_INVERT_UPPER,\n  NAMED_VECTOR_PSUBADDPS_INVERT,\n  NAMED_VECTOR_PSUBADDPS_INVERT_UPPER,\n  NAMED_VECTOR_PSUBADDPD_INVERT,\n  NAMED_VECTOR_PSUBADDPD_INVERT_UPPER,\n  NAMED_VECTOR_MOVMSKPS_SHIFT,\n  NAMED_VECTOR_AESKEYGENASSIST_SWIZZLE,\n  NAMED_VECTOR_BLENDPS_0110B,\n  NAMED_VECTOR_BLENDPS_0111B,\n  NAMED_VECTOR_BLENDPS_1001B,\n  NAMED_VECTOR_BLENDPS_1011B,\n  NAMED_VECTOR_BLENDPS_1101B,\n  NAMED_VECTOR_BLENDPS_1110B,\n  NAMED_VECTOR_MOVMASKB,\n  NAMED_VECTOR_MOVMASKB_UPPER,\n\n  NAMED_VECTOR_X87_ONE,\n  NAMED_VECTOR_X87_LOG2_10,\n  NAMED_VECTOR_X87_LOG2_E,\n  NAMED_VECTOR_X87_PI,\n  NAMED_VECTOR_X87_LOG10_2,\n  NAMED_VECTOR_X87_LOG_2,\n\n  NAMED_VECTOR_CVTMAX_F32_I32,\n  NAMED_VECTOR_CVTMAX_F32_I32_UPPER,\n  NAMED_VECTOR_CVTMAX_F32_I64,\n  NAMED_VECTOR_CVTMAX_F64_I32,\n  NAMED_VECTOR_CVTMAX_F64_I32_UPPER,\n  NAMED_VECTOR_CVTMAX_F64_I64,\n  NAMED_VECTOR_CVTMAX_I32,\n  NAMED_VECTOR_CVTMAX_I64,\n  NAMED_VECTOR_F80_SIGN_MASK,\n  NAMED_VECTOR_SHA1RNDS_K0,\n  NAMED_VECTOR_SHA1RNDS_K1,\n  NAMED_VECTOR_SHA1RNDS_K2,\n  NAMED_VECTOR_SHA1RNDS_K3,\n\n  NAMED_VECTOR_CONST_POOL_MAX,\n  // Beginning of named constants that don't have a constant pool backing.\n  NAMED_VECTOR_ZERO = NAMED_VECTOR_CONST_POOL_MAX,\n  NAMED_VECTOR_MAX,\n};\n\n// This enum of named vector constants are linked to an array in CPUBackend.cpp.\n// This is used with the IROp `LoadNamedVectorIndexedConstant` to load a vector constant\n// that would otherwise be costly to materialize.\nenum IndexNamedVectorConstant : uint8_t {\n  INDEXED_NAMED_VECTOR_PSHUFLW = 0,\n  INDEXED_NAMED_VECTOR_PSHUFHW,\n  INDEXED_NAMED_VECTOR_PSHUFD,\n  INDEXED_NAMED_VECTOR_SHUFPS,\n  INDEXED_NAMED_VECTOR_DPPS_MASK,\n  INDEXED_NAMED_VECTOR_DPPD_MASK,\n  INDEXED_NAMED_VECTOR_PBLENDW,\n  INDEXED_NAMED_VECTOR_MAX,\n};\n\nstruct SHA256Sum final {\n  uint8_t data[32];\n  [[nodiscard]] auto operator<=>(const SHA256Sum&) const noexcept = default;\n};\n\ntypedef void ThunkedFunction(void* ArgsRv);\n\nstruct ThunkDefinition final {\n  SHA256Sum Sum;\n  ThunkedFunction* ThunkFunction;\n};\n\n} // namespace FEXCore::IR\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/Allocator.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <cstdint>\n#include <sys/types.h>\n\nnamespace FEXCore::Core {\nstruct InternalThreadState;\n}\n\nnamespace FEXCore::Allocator {\nFEX_DEFAULT_VISIBILITY void SetupHooks(size_t PageSize);\nFEX_DEFAULT_VISIBILITY void ClearHooks();\n\nFEX_DEFAULT_VISIBILITY size_t DetermineVASize();\n\n#ifdef GLIBC_ALLOCATOR_FAULT\n// Glibc hooks should only fault once we are in main.\n// Required since glibc allocator hooking will catch things before FEX has control.\nFEX_DEFAULT_VISIBILITY void SetupFaultEvaluate();\n// Glibc hook faulting needs to be disabled when leaving main.\n// Required since glibc does some state teardown after main.\nFEX_DEFAULT_VISIBILITY void ClearFaultEvaluate();\n\nclass FEX_DEFAULT_VISIBILITY YesIKnowImNotSupposedToUseTheGlibcAllocator final {\npublic:\n  FEX_DEFAULT_VISIBILITY YesIKnowImNotSupposedToUseTheGlibcAllocator();\n  FEX_DEFAULT_VISIBILITY ~YesIKnowImNotSupposedToUseTheGlibcAllocator();\n  FEX_DEFAULT_VISIBILITY static void HardDisable();\n};\n\nclass FEX_DEFAULT_VISIBILITY GLIBCScopedFault final {\npublic:\n  GLIBCScopedFault() {\n    FEXCore::Allocator::SetupFaultEvaluate();\n  }\n  ~GLIBCScopedFault() {\n    FEXCore::Allocator::ClearFaultEvaluate();\n  }\n};\n#else\nFEX_DEFAULT_VISIBILITY inline void SetupFaultEvaluate() {}\nFEX_DEFAULT_VISIBILITY inline void ClearFaultEvaluate() {}\n\nclass FEX_DEFAULT_VISIBILITY YesIKnowImNotSupposedToUseTheGlibcAllocator final {\npublic:\n  FEX_DEFAULT_VISIBILITY YesIKnowImNotSupposedToUseTheGlibcAllocator() {}\n  FEX_DEFAULT_VISIBILITY ~YesIKnowImNotSupposedToUseTheGlibcAllocator() {}\n  FEX_DEFAULT_VISIBILITY static inline void HardDisable() {}\n};\n\nclass FEX_DEFAULT_VISIBILITY GLIBCScopedFault final {\npublic:\n  GLIBCScopedFault() {\n    // nop\n  }\n  ~GLIBCScopedFault() {\n    // nop\n  }\n};\n#endif\n\nstruct MemoryRegion {\n  void* Ptr;\n  size_t Size;\n};\n\nFEX_DEFAULT_VISIBILITY fextl::vector<MemoryRegion> CollectMemoryGaps(uintptr_t Begin, uintptr_t End, int MapsFD);\nFEX_DEFAULT_VISIBILITY fextl::vector<MemoryRegion> StealMemoryRegion(uintptr_t Begin, uintptr_t End);\nFEX_DEFAULT_VISIBILITY void ReclaimMemoryRegion(const fextl::vector<MemoryRegion>& Regions);\n// When running a 64-bit executable on ARM then userspace guest only gets 47 bits of VA\n// This is a feature of x86-64 where the kernel gets a full 128TB of VA space\n// x86-64 canonical addresses with bit 48 set will sign extend the address (Ignoring LA57)\n// AArch64 canonical addresses are only up to bits 48/52 with the remainder being other things\n// Use this to reserve the top 128TB of VA so the guest never see it\n// Returns nullptr on host VA < 48bits\nFEX_DEFAULT_VISIBILITY fextl::vector<MemoryRegion> Setup48BitAllocatorIfExists(size_t PageSize);\n\n#ifndef _WIN32\nFEX_DEFAULT_VISIBILITY void RegisterTLSData(FEXCore::Core::InternalThreadState* Thread);\nFEX_DEFAULT_VISIBILITY void UninstallTLSData(FEXCore::Core::InternalThreadState* Thread);\n#endif\n} // namespace FEXCore::Allocator\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/AllocatorHooks.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/EnumOperators.h>\n#include <FEXCore/Utils/LogManager.h>\n\n#ifndef _WIN32\n#include <stdlib.h>\n#include <malloc.h>\n#include <sys/mman.h>\n#else\n#define NTDDI_VERSION 0x0A000005\n#include <memoryapi.h>\n#endif\n\n#include <new>\n#include <cstddef>\n#include <cstdint>\n#include <sys/types.h>\n\nnamespace FEXCore::Allocator {\nenum class ProtectOptions : uint32_t {\n  None = 0,\n  Read = (1U << 0),\n  Write = (1U << 1),\n  Exec = (1U << 2),\n};\nFEX_DEF_NUM_OPS(ProtectOptions)\n\nenum class THPControl {\n  Enable,\n  Disable,\n};\n\n#ifdef _WIN32\ninline void* VirtualAlloc(void* Base, size_t Size, bool Execute = false, bool Commit = true) {\n  // Allocate top-down to avoid polluting the lower VA space, as even on 64-bit some programs (i.e. LuaJIT) require allocations below 4GB.\n  DWORD Flags = (Commit ? MEM_COMMIT : 0) | MEM_RESERVE | MEM_TOP_DOWN;\n#ifdef ARCHITECTURE_arm64ec\n  MEM_EXTENDED_PARAMETER Parameter {};\n  if (Execute) {\n    Parameter.Type = MemExtendedParameterAttributeFlags;\n    Parameter.ULong64 = MEM_EXTENDED_PARAMETER_EC_CODE;\n  };\n  return ::VirtualAlloc2(nullptr, Base, Size, Flags, Execute ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE, Execute ? &Parameter : nullptr,\n                         Execute ? 1 : 0);\n#else\n  return ::VirtualAlloc(Base, Size, Flags, Execute ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE);\n#endif\n}\n\ninline void* VirtualAlloc(size_t Size, bool Execute = false, bool Commit = true) {\n  return VirtualAlloc(nullptr, Size, Execute, Commit);\n}\n\ninline void VirtualFree(void* Ptr, size_t Size) {\n  ::VirtualFree(Ptr, 0, MEM_RELEASE);\n}\n\ninline void VirtualDontNeed(void* Ptr, size_t Size, bool Recommit = true) {\n  // Zero the page-aligned region, preserving permissions.\n  MEMORY_BASIC_INFORMATION Info;\n  ::VirtualQuery(Ptr, &Info, sizeof(Info));\n  ::VirtualFree(Ptr, Size, MEM_DECOMMIT);\n  if (Recommit) {\n    ::VirtualAlloc(Ptr, Size, MEM_COMMIT, Info.Protect);\n  }\n}\n\ninline bool VirtualProtect(void* Ptr, size_t Size, ProtectOptions options) {\n  DWORD prot {PAGE_NOACCESS};\n\n  if (options == ProtectOptions::None) {\n    prot = PAGE_NOACCESS;\n  } else if (options == ProtectOptions::Read) {\n    prot = PAGE_READONLY;\n  } else if (options == (ProtectOptions::Read | ProtectOptions::Write)) {\n    prot = PAGE_READWRITE;\n  } else if (options == (ProtectOptions::Read | ProtectOptions::Exec)) {\n    prot = PAGE_EXECUTE_READ;\n  } else if (options == (ProtectOptions::Read | ProtectOptions::Write | ProtectOptions::Exec)) {\n    prot = PAGE_EXECUTE_READWRITE;\n  } else {\n    LOGMAN_MSG_A_FMT(\"Unknown VirtualProtect options combination\");\n  }\n\n  return ::VirtualProtect(Ptr, Size, prot, nullptr) == 0;\n}\n\ninline void VirtualName(const char*, void*, size_t) {}\ninline void VirtualTHPControl(void* Ptr, size_t Size, THPControl Control) {}\n\n#else\nusing MMAP_Hook = void* (*)(void*, size_t, int, int, int, off_t);\nusing MUNMAP_Hook = int (*)(void*, size_t);\n\nFEX_DEFAULT_VISIBILITY extern MMAP_Hook mmap;\nFEX_DEFAULT_VISIBILITY extern MUNMAP_Hook munmap;\nFEX_DEFAULT_VISIBILITY extern void VirtualName(const char* Name, void* Ptr, size_t Size);\n\n// All commit parameters are ignored here, they are unnecessary as Linux supports overcommit\n\ninline void* VirtualAlloc(size_t Size, bool Execute = false, bool Commit = true) {\n  return FEXCore::Allocator::mmap(nullptr, Size, PROT_READ | PROT_WRITE | (Execute ? PROT_EXEC : 0), MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n}\n\ninline void* VirtualAlloc(void* Base, size_t Size, bool Execute = false, bool Commit = true) {\n  return FEXCore::Allocator::mmap(Base, Size, PROT_READ | PROT_WRITE | (Execute ? PROT_EXEC : 0), MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n}\n\ninline void VirtualFree(void* Ptr, size_t Size) {\n  FEXCore::Allocator::munmap(Ptr, Size);\n}\ninline void VirtualDontNeed(void* Ptr, size_t Size, bool Recommit = true) {\n  ::madvise(reinterpret_cast<void*>(Ptr), Size, MADV_DONTNEED);\n}\ninline bool VirtualProtect(void* Ptr, size_t Size, ProtectOptions options) {\n  int prot {PROT_NONE};\n  if ((options & ProtectOptions::Read) == ProtectOptions::Read) {\n    prot |= PROT_READ;\n  }\n  if ((options & ProtectOptions::Write) == ProtectOptions::Write) {\n    prot |= PROT_WRITE;\n  }\n  if ((options & ProtectOptions::Exec) == ProtectOptions::Exec) {\n    prot |= PROT_EXEC;\n  }\n\n  return ::mprotect(Ptr, Size, prot) == 0;\n}\n\ninline void VirtualTHPControl(void* Ptr, size_t Size, THPControl Control) {\n  ::madvise(Ptr, Size, Control == THPControl::Enable ? MADV_HUGEPAGE : MADV_NOHUGEPAGE);\n}\n\n#endif\n\n// Memory allocation routines to be defined externally.\n// This allows to use jemalloc for emulation while using the normal allocator\n// for host tools without building FEXCore twice.\nvoid* malloc(size_t size);\nvoid* calloc(size_t n, size_t size);\nvoid* memalign(size_t align, size_t s);\nvoid* valloc(size_t size);\nint posix_memalign(void** r, size_t a, size_t s);\nvoid* realloc(void* ptr, size_t size);\nvoid free(void* ptr);\nsize_t malloc_usable_size(void* ptr);\nvoid* aligned_alloc(size_t a, size_t s);\nvoid aligned_free(void* ptr);\n\nFEX_DEFAULT_VISIBILITY extern void InitializeThread();\n\n#ifndef _WIN32\nvoid InitializeAllocator(size_t PageSize);\nvoid SetupAllocatorHooks(void* (*)(void* addr, size_t length, int prot, int flags, int fd, off_t offset), int (*)(void* addr, size_t length));\n#endif\n\nstruct FEXAllocOperators {\n  FEXAllocOperators() = default;\n\n  void* operator new(size_t size) {\n    return FEXCore::Allocator::malloc(size);\n  }\n\n  void* operator new(size_t size, std::align_val_t align) {\n    return FEXCore::Allocator::aligned_alloc(static_cast<size_t>(align), size);\n  }\n\n  void operator delete(void* ptr) {\n    return FEXCore::Allocator::free(ptr);\n  }\n\n  void operator delete(void* ptr, std::align_val_t align) {\n    return FEXCore::Allocator::aligned_free(ptr);\n  }\n};\n} // namespace FEXCore::Allocator\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/ArchHelpers/Arm64.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/CompilerDefs.h>\n\n#include <stdint.h>\n#include <optional>\n\nnamespace FEXCore::Core {\nstruct InternalThreadState;\n}\n\nnamespace FEXCore::ArchHelpers::Arm64 {\nenum class UnalignedHandlerType {\n  ///< Backpatch unaligned access to half-barrier based atomic.\n  HalfBarrier,\n  ///< Backpatch unaligned access to non-atomic.\n  NonAtomic,\n};\n\n/**\n * @brief On ARM64 handles an unaligned memory access that the JIT has done.\n *\n * This is an OS agnostic handler where the frontend must provide FEXCore with the information necessary to know if this is safe.\n * This does not check if the PC is within a JIT code buffer, the frontend must provide that safety with `CPUBackend::IsAddressInCodeBuffer`.\n *\n * @param HandleType Type of TSO handling to use.\n * @param ProgramCounter The location in memory for the instruction that did the access\n * @param GPRs The array of GPRs from the signal context. This will be modified and the host context needs to be updated on signal return.\n *\n * @return Returns a value if the unaligned access has been handled with how many bytes to modify the host PC\n * by. FEXCore will return a positive or negative offset depending on internal handling.\n */\n[[nodiscard]]\nFEX_DEFAULT_VISIBILITY std::optional<int32_t> HandleUnalignedAccess(\n  FEXCore::Core::InternalThreadState* Thread, UnalignedHandlerType HandleType, uintptr_t ProgramCounter, uint64_t* GPRs, bool IsJIT = true);\n} // namespace FEXCore::ArchHelpers::Arm64\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/CompilerDefs.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n// Contains general abstractions related to compilers used to build FEX.\n\n// Specifies the minimum alignment for a variable or structure field, measured in bytes.\n#define FEX_ALIGNED(alignment) __attribute__((aligned(alignment)))\n\n// Allows annotating declarations with extra information.\n#define FEX_ANNOTATE(annotation_str) __attribute__((annotate(annotation_str)))\n\n// Makes the attributed entity have the default DSO visibility level.\n// Compiler options can affect the visibility of symbols. This attribute\n// overrides said changes. This gives entities external linkage.\n#define FEX_DEFAULT_VISIBILITY __attribute__((visibility(\"default\")))\n\n// Indicates that the specified function doesn't need a function prologue/epilogue.\n// emitted for it by the compiler.\n#define FEX_NAKED __attribute__((naked))\n\n// Specifies that a structure member or structure itself should have the smallest possible alignment.\n#define FEX_PACKED __attribute__((packed))\n\n// Causes execution to exit abnormally.\n#define FEX_TRAP_EXECUTION FEXCore::Assert::ForcedAssert()\n\n// Dictates to the compiler that the path this is on should not be reachable\n// from normal execution control flow. If normal execution does reach this,\n// then program behavior is undefined.\n#define FEX_UNREACHABLE __builtin_unreachable()\n\n// Like offsetof but for array members with a dynamic element index\n#define ARRAY_OFFSETOF(Type, ArrayMember, Index) (offsetof(Type, ArrayMember) + sizeof(Type::ArrayMember[0]) * (Index))\n\nnamespace FEXCore::Assert {\n// This function can not be inlined\n[[noreturn]]\nFEX_DEFAULT_VISIBILITY void ForcedAssert();\n} // namespace FEXCore::Assert\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/EnumOperators.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <type_traits>\n\n#define FEX_DEF_ENUM_CLASS_BIN_OP(Enum, Op)                       \\\n  inline constexpr Enum operator Op(Enum lhs, Enum rhs) {         \\\n    using Type = std::underlying_type_t<Enum>;                    \\\n    Type _lhs = static_cast<Type>(lhs);                           \\\n    Type _rhs = static_cast<Type>(rhs);                           \\\n    return static_cast<Enum>(_lhs Op _rhs);                       \\\n  }                                                               \\\n  inline constexpr uint64_t operator Op(uint64_t lhs, Enum rhs) { \\\n    using Type = std::underlying_type_t<Enum>;                    \\\n    Type _rhs = static_cast<Type>(rhs);                           \\\n    return lhs Op _rhs;                                           \\\n  }\n\n#define FEX_DEF_ENUM_CLASS_UNARY_OP(Enum, Op)   \\\n  inline constexpr Enum operator Op(Enum rhs) { \\\n    using Type = std::underlying_type_t<Enum>;  \\\n    Type _rhs = static_cast<Type>(rhs);         \\\n    return static_cast<Enum>(Op _rhs);          \\\n  }\n\n#define FEX_DEF_NUM_OPS(Enum)        \\\n  FEX_DEF_ENUM_CLASS_BIN_OP(Enum, |) \\\n  FEX_DEF_ENUM_CLASS_BIN_OP(Enum, &) \\\n  FEX_DEF_ENUM_CLASS_BIN_OP(Enum, ^) \\\n  FEX_DEF_ENUM_CLASS_UNARY_OP(Enum, ~)\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/EnumUtils.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n// Header for various utilities related to operating with enums\n\n#include <type_traits>\n\nnamespace FEXCore {\n\n// Macro that defines all of the built in operators for conveniently using\n// enum classes as flag types without needing to define all of the basic\n// boilerplate.\n#define FEX_DECLARE_ENUM_FLAG_OPERATORS(type)                        \\\n  [[nodiscard]]                                                      \\\n  constexpr type operator|(type a, type b) noexcept {                \\\n    using T = std::underlying_type_t<type>;                          \\\n    return static_cast<type>(static_cast<T>(a) | static_cast<T>(b)); \\\n  }                                                                  \\\n  [[nodiscard]]                                                      \\\n  constexpr type operator&(type a, type b) noexcept {                \\\n    using T = std::underlying_type_t<type>;                          \\\n    return static_cast<type>(static_cast<T>(a) & static_cast<T>(b)); \\\n  }                                                                  \\\n  [[nodiscard]]                                                      \\\n  constexpr type operator^(type a, type b) noexcept {                \\\n    using T = std::underlying_type_t<type>;                          \\\n    return static_cast<type>(static_cast<T>(a) ^ static_cast<T>(b)); \\\n  }                                                                  \\\n  constexpr type& operator|=(type& a, type b) noexcept {             \\\n    a = a | b;                                                       \\\n    return a;                                                        \\\n  }                                                                  \\\n  constexpr type& operator&=(type& a, type b) noexcept {             \\\n    a = a & b;                                                       \\\n    return a;                                                        \\\n  }                                                                  \\\n  constexpr type& operator^=(type& a, type b) noexcept {             \\\n    a = a ^ b;                                                       \\\n    return a;                                                        \\\n  }                                                                  \\\n  [[nodiscard]]                                                      \\\n  constexpr type operator~(type key) noexcept {                      \\\n    using T = std::underlying_type_t<type>;                          \\\n    return static_cast<type>(~static_cast<T>(key));                  \\\n  }                                                                  \\\n  [[nodiscard]]                                                      \\\n  constexpr bool True(type key) noexcept {                           \\\n    using T = std::underlying_type_t<type>;                          \\\n    return static_cast<T>(key) != 0;                                 \\\n  }                                                                  \\\n  [[nodiscard]]                                                      \\\n  constexpr bool False(type key) noexcept {                          \\\n    using T = std::underlying_type_t<type>;                          \\\n    return static_cast<T>(key) == 0;                                 \\\n  }\n\n// Macro that defines a fmt formatter for a reasonable case where an enum\n// is formatted as a purely integral type based on its underlying type.\n#define FEX_DEFINE_ENUM_FMT_PASSTHROUGH(type) \\\n  constexpr auto format_as(type t) {          \\\n    return FEXCore::ToUnderlying(t);          \\\n  }\n\n// Equivalent to C++23's std::to_underlying.\ntemplate<typename Enum>\n[[nodiscard]]\nconstexpr std::underlying_type_t<Enum> ToUnderlying(Enum e) noexcept {\n  return static_cast<std::underlying_type_t<Enum>>(e);\n}\n\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/Event.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <atomic>\n#include <condition_variable>\n#include <mutex>\n\nclass Event final {\nprivate:\n  /**\n   * @brief Literally just an atomic bool that we are using for this class\n   */\n  class Flag final {\n  public:\n    bool TestAndSet(bool SetValue = true) {\n      bool Expected = !SetValue;\n      return Value.compare_exchange_strong(Expected, SetValue);\n    }\n\n    bool TestAndClear() {\n      return TestAndSet(false);\n    }\n\n  private:\n    std::atomic_bool Value {false};\n  };\n\npublic:\n  ~Event() {\n    NotifyAll();\n  }\n  void NotifyOne() {\n    if (FlagObject.TestAndSet()) {\n      std::lock_guard<std::mutex> lk(MutexObject);\n      CondObject.notify_one();\n    }\n  }\n\n  void NotifyAll() {\n    if (FlagObject.TestAndSet()) {\n      std::lock_guard<std::mutex> lk(MutexObject);\n      CondObject.notify_all();\n    }\n  }\n\n  void Wait() {\n    // Have we signaled before we started waiting?\n    if (FlagObject.TestAndClear()) {\n      return;\n    }\n\n    std::unique_lock<std::mutex> lk(MutexObject);\n    CondObject.wait(lk, [this] { return FlagObject.TestAndClear(); });\n  }\n\n  template<class Rep, class Period>\n  bool WaitFor(const std::chrono::duration<Rep, Period>& time) {\n    // Have we signaled before we started waiting?\n    if (FlagObject.TestAndClear()) {\n      return true;\n    }\n\n    std::unique_lock<std::mutex> lk(MutexObject);\n    bool DidSignal = CondObject.wait_for(lk, time, [this] { return FlagObject.TestAndClear(); });\n    return DidSignal;\n  }\n\nprivate:\n  Flag FlagObject;\n  std::mutex MutexObject;\n  std::condition_variable CondObject;\n};\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/FPState.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <cstdint>\n\nnamespace FEXCore::FPState {\nenum class X87Tag : uint8_t { Valid = 0b00, Zero = 0b01, Special = 0b10, Empty = 0b11 };\n\nstatic inline X87Tag GetX87Tag(uint64_t (&Reg)[2], bool Valid) {\n  if (!Valid) {\n    return X87Tag::Empty;\n  }\n\n  const uint64_t Exponent = Reg[1] & 0x7fff;\n  if (Exponent == 0x7fff) {\n    // (Pseudo) NaN / Inf\n    return X87Tag::Special;\n  }\n\n  const bool JBit = Reg[0] & (1ULL << 63);\n  if (Exponent == 0) {\n    const uint64_t Fraction = Reg[0] & ((1ULL << 63) - 1);\n    if (!JBit && !Fraction) {\n      return X87Tag::Zero;\n    } else {\n      // (Pseudo) Subnormal\n      return X87Tag::Special;\n    }\n  }\n\n  if (JBit) {\n    // Normal\n    return X87Tag::Valid;\n  } else {\n    // Invalid\n    return X87Tag::Special;\n  }\n}\n\nstatic inline uint16_t ConvertFromAbridgedFTW(uint16_t FSW, uint64_t (&MM)[8][2], uint8_t AbridgedFTW) {\n  const uint32_t StackTop = (FSW >> 11) & 0b111;\n\n  uint16_t FTW = 0;\n  for (uint32_t i = 0; i < 8; i++) {\n    // The AMD manually incorrectly states there is a direct mapping here, only the intel-manual correctly states\n    // the stack-relative behaviour\n    const uint16_t StackIndex = (i - StackTop) & 0b111;\n    const X87Tag Tag = GetX87Tag(MM[StackIndex], AbridgedFTW & (1 << i));\n    FTW |= static_cast<uint8_t>(Tag) << (2 * i);\n  }\n\n  return FTW;\n}\n\nstatic inline uint8_t ConvertToAbridgedFTW(uint16_t FTW) {\n  uint8_t AbridgedFTW = 0;\n\n  for (uint32_t i = 0; i < 8; i++) {\n    const X87Tag Tag = static_cast<X87Tag>((FTW >> (2 * i)) & 3);\n    AbridgedFTW |= ((Tag == X87Tag::Empty) ? 0 : 1) << i;\n  }\n\n  return AbridgedFTW;\n}\n} // namespace FEXCore::FPState\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/File.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/Utils/EnumOperators.h>\n\n#ifndef _WIN32\n#include <fcntl.h>\n#include <unistd.h>\n#else\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n#undef ERROR\n#endif\n\nnamespace FEXCore::File {\nenum class FileModes : uint32_t {\n  READ = (1U << 0),\n  WRITE = (1U << 1),\n  CREATE = (1U << 2),\n  TRUNCATE = (1U << 3),\n};\n\nenum class SeekOp {\n  BEGIN,\n  CURRENT,\n  END,\n};\n\nFEX_DEF_NUM_OPS(FileModes)\n\nclass File final {\npublic:\n#ifndef _WIN32\n  using FileHandleType = int;\n#else\n  using FileHandleType = HANDLE;\n#endif\n\n  File() = default;\n\n  File(const char* Filepath, FileModes Modes) {\n#ifndef _WIN32\n    auto Disp = TranslateModes(Modes);\n    Handle = open(Filepath, Disp, DEFAULT_USER_PERMS);\n    IsValidHandle = Handle != -1;\n#else\n    auto Disp = TranslateModes(Modes);\n    if (Disp.CreationFlag == OPEN_ALWAYS && Disp.TruncateOnExist) {\n      // If Open + Truncate then try to open with truncate behaviour first.\n      Handle = CreateFileA(Filepath, Disp.Access, DEFAULT_SHARE_MODE, nullptr, TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);\n      if (Handle == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_NOT_FOUND) {\n        // File didn't exist, just open.\n        Handle = CreateFileA(Filepath, Disp.Access, DEFAULT_SHARE_MODE, nullptr, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr);\n      }\n    } else {\n      Handle = CreateFileA(Filepath, Disp.Access, DEFAULT_SHARE_MODE, nullptr, Disp.CreationFlag, FILE_ATTRIBUTE_NORMAL, nullptr);\n    }\n    IsValidHandle = Handle != INVALID_HANDLE_VALUE;\n#endif\n  }\n\n  /**\n   * @brief Write Bytes to File\n   *\n   * @param Buffer The buffer to write.\n   * @param Bytes The number of bytes to write.\n   *\n   * @return The number of bytes actually written or -1 on error.\n   */\n  ssize_t Write(const void* Buffer, size_t Bytes) {\n#ifndef _WIN32\n    return write(Handle, Buffer, Bytes);\n#else\n    DWORD BytesWritten {};\n    auto Result = WriteFile(Handle, Buffer, Bytes, &BytesWritten, nullptr);\n    if (Result) {\n      return BytesWritten;\n    }\n    // Some error, match Linux side.\n    return -1;\n#endif\n  }\n\n  ssize_t Write(const std::string_view Data) {\n    return Write(Data.data(), Data.size());\n  }\n\n  /**\n   * @brief Read at most Bytes in to the buffer.\n   *\n   * @param Buffer The buffer where the data is read in to.\n   * @param Bytes The size of the buffer.\n   *\n   * @return The number of bytes read or -1 on error.\n   */\n  ssize_t Read(void* Buffer, size_t Bytes) {\n#ifndef _WIN32\n    return read(Handle, Buffer, Bytes);\n#else\n    DWORD BytesRead {};\n    auto Result = ReadFile(Handle, Buffer, Bytes, &BytesRead, nullptr);\n    if (Result) {\n      return BytesRead;\n    }\n    // Some error, match Linux side.\n    return -1;\n#endif\n  }\n\n  ~File() {\n    if (!IsValidHandle) {\n      return;\n    }\n    if (!ShouldClose) {\n      return;\n    }\n#ifndef _WIN32\n    close(Handle);\n#else\n    CloseHandle(Handle);\n#endif\n  }\n\n  /**\n   * @brief Gets a File object that points to stdout\n   */\n  static File GetStdOUT() {\n#ifndef _WIN32\n    return File(STDOUT_FILENO, false);\n#else\n    return File(GetStdHandle(STD_OUTPUT_HANDLE), false);\n#endif\n  }\n\n  /**\n   * @brief Gets a File object that points to stderr\n   */\n  static File GetStdERR() {\n#ifndef _WIN32\n    return File(STDERR_FILENO, false);\n#else\n    return File(GetStdHandle(STD_ERROR_HANDLE), false);\n#endif\n  }\n\n  /**\n   * @brief Returns if the file handle is valid.\n   */\n  bool IsValid() const {\n    return IsValidHandle;\n  }\n\n  /**\n   * @brief Flush the file contents to the output file backing.\n   *\n   * @return True if the flush occured.\n   */\n  bool Flush() {\n#ifndef _WIN32\n    return fsync(Handle) == 0;\n#else\n    return FlushFileBuffers(Handle);\n#endif\n  }\n\n  /**\n   * @brief Seek the file pointer location.\n   *\n   * @param Distance The distance to travel.\n   * @param Op The operation from where to start the travel.\n   *\n   * @return The current file pointer location or -1.\n   */\n  ssize_t Seek(ssize_t Distance, SeekOp Op) {\n#ifndef _WIN32\n    return lseek(Handle, Distance, TranslateSeek(Op));\n#else\n    LARGE_INTEGER NewDistance {.QuadPart = Distance};\n    LARGE_INTEGER NewPointer;\n    auto Result = SetFilePointerEx(Handle, NewDistance, &NewPointer, TranslateSeek(Op));\n    if (Result) {\n      return NewPointer.QuadPart;\n    }\n    // Some error, match Linux side.\n    return -1;\n#endif\n  }\n\nprotected:\n\n  File(FileHandleType Handle, bool ShouldClose)\n    : ShouldClose {ShouldClose}\n    , IsValidHandle {true}\n    , Handle {Handle} {}\nprivate:\n  bool ShouldClose {};\n  bool IsValidHandle {};\n\n  FileHandleType Handle {};\n#ifndef _WIN32\n  static constexpr int DEFAULT_USER_PERMS = S_IRWXU | S_IRWXG | S_IRWXO;\n\n  static uint32_t TranslateModes(FileModes Modes) {\n    uint32_t Mode {};\n    if ((Modes & FileModes::READ) == FileModes::READ) {\n      Mode |= O_RDONLY;\n    }\n    if ((Modes & FileModes::WRITE) == FileModes::WRITE) {\n      Mode |= O_WRONLY;\n    }\n    if ((Modes & FileModes::CREATE) == FileModes::CREATE) {\n      Mode |= O_CREAT;\n    }\n    if ((Modes & FileModes::TRUNCATE) == FileModes::TRUNCATE) {\n      Mode |= O_TRUNC;\n    }\n\n    // Always enable CLOEXEC so that the FD is closed on execve.\n    // FEXCore never wants to leak FDs across execve using this interface.\n    Mode |= O_CLOEXEC;\n    return Mode;\n  }\n\n  static uint32_t TranslateSeek(SeekOp Op) {\n    switch (Op) {\n    case SeekOp::BEGIN: return SEEK_SET;\n    case SeekOp::CURRENT: return SEEK_CUR;\n    case SeekOp::END: return SEEK_END;\n    default: FEX_UNREACHABLE;\n    }\n  }\n#else\n  static constexpr int DEFAULT_SHARE_MODE = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;\n  struct Disposition {\n    uint32_t CreationFlag;\n    uint32_t Access;\n    bool TruncateOnExist;\n  };\n  static Disposition TranslateModes(FileModes Modes) {\n    Disposition Disp {};\n    if ((Modes & FileModes::READ) == FileModes::READ) {\n      Disp.Access |= GENERIC_READ;\n    }\n    if ((Modes & FileModes::WRITE) == FileModes::WRITE) {\n      Disp.Access |= GENERIC_WRITE;\n    }\n    if ((Modes & FileModes::CREATE) == FileModes::CREATE) {\n      Disp.CreationFlag = CREATE_ALWAYS;\n    } else {\n      Disp.CreationFlag = OPEN_ALWAYS;\n    }\n\n    if ((Modes & FileModes::TRUNCATE) == FileModes::TRUNCATE) {\n      Disp.TruncateOnExist = true;\n    }\n\n    return Disp;\n  }\n\n  static uint32_t TranslateSeek(SeekOp Op) {\n    switch (Op) {\n    case SeekOp::BEGIN: return FILE_BEGIN;\n    case SeekOp::CURRENT: return FILE_CURRENT;\n    case SeekOp::END: return FILE_END;\n    default: FEX_UNREACHABLE;\n    }\n  }\n#endif\n};\n} // namespace FEXCore::File\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/FileLoading.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n\n#include <span>\n\nnamespace FEXCore::FileLoading {\n/**\n * @brief Loads a filepath in to a vector of data\n *\n * @param Data The vector to load the file data in to\n * @param Filepath The filepath to load\n *\n * @return true on file loaded, false on failure\n */\nFEX_DEFAULT_VISIBILITY bool LoadFile(fextl::vector<char>& Data, const fextl::string& Filepath, size_t FixedSize = 0);\nFEX_DEFAULT_VISIBILITY bool LoadFile(fextl::string& Data, const fextl::string& Filepath, size_t FixedSize = 0);\n\n/**\n * @brief Loads a filepath in to a buffer of data with a fixed size\n *\n * @param Filepath The filepath to load\n * @param Buffer The buffer to load the data in to. Attempting to read the full size of the span\n *\n * @return The amount of data read or -1 on error.\n */\nFEX_DEFAULT_VISIBILITY ssize_t LoadFileToBuffer(const fextl::string& Filepath, std::span<char> Buffer);\n} // namespace FEXCore::FileLoading\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/InterruptableConditionVariable.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <atomic>\n#include <chrono>\n#include <climits>\n#include <cstdint>\n#ifndef _WIN32\n#include <linux/futex.h>\n#include <sys/syscall.h>\n#else\n#include <errhandlingapi.h>\n#include <synchapi.h>\n#include <winerror.h>\n#endif\n#include <unistd.h>\n\nnamespace FEXCore {\n/**\n * @brief A condition variable that is robust against use of longjmp in signal handlers.\n *\n * This is opposed to common `std::condition_variable` implementations:\n * Longjmp'ing in a signal handler while interrupting a pending `wait_for()`\n * call can leave the condition variable in an invalid state that breaks later\n * uses of that object and may cause hangs as a consequence.\n */\n#ifndef _WIN32\nclass InterruptableConditionVariable final {\npublic:\n  bool Wait(struct timespec* Timeout = nullptr) {\n    while (true) {\n      uint32_t Expected = SIGNALED;\n      uint32_t Desired = UNSIGNALED;\n\n      // If the mutex was already signaled then we can early exit\n      if (Mutex.compare_exchange_strong(Expected, Desired)) {\n        return true;\n      }\n\n      constexpr int Op = FUTEX_WAIT | FUTEX_PRIVATE_FLAG;\n      // WAIT will keep sleeping on the futex word while it is `val`\n      int Result = ::syscall(SYS_futex, &Mutex, Op,\n                             Desired, // val\n                             Timeout, // Timeout/val2\n                             nullptr, // Addr2\n                             0);      // val3\n\n      if (Timeout && Result == -1 && errno == ETIMEDOUT) {\n        return false;\n      }\n    }\n  }\n\n  template<class Rep, class Period>\n  bool WaitFor(const std::chrono::duration<Rep, Period>& time) {\n    struct timespec Timeout {};\n    auto SecondsDuration = std::chrono::duration_cast<std::chrono::seconds>(time);\n    Timeout.tv_sec = SecondsDuration.count();\n    Timeout.tv_nsec = std::chrono::duration_cast<std::chrono::nanoseconds>(time - SecondsDuration).count();\n    return Wait(&Timeout);\n  }\n\n  void NotifyOne() {\n    DoNotify(1);\n  }\n\n  void NotifyAll() {\n    // Maximum number of waiters\n    DoNotify(INT_MAX);\n  }\n\nprivate:\n  std::atomic<uint32_t> Mutex {};\n  constexpr static uint32_t SIGNALED = 1;\n  constexpr static uint32_t UNSIGNALED = 0;\n\n  void DoNotify(int Waiters) {\n    uint32_t Expected = UNSIGNALED;\n    uint32_t Desired = SIGNALED;\n\n    // If the mutex was in an unsignaled state then signal\n    if (Mutex.compare_exchange_strong(Expected, Desired)) {\n      constexpr int Op = FUTEX_WAKE | FUTEX_PRIVATE_FLAG;\n\n      ::syscall(SYS_futex, &Mutex, Op,\n                Waiters, // val - Number of waiters to wake\n                0,       // val2\n                &Mutex,  // Addr2 - Mutex to do the operation on\n                0);      // val3\n    }\n  }\n};\n#else\nclass InterruptableConditionVariable final {\npublic:\n  bool Wait(struct timespec* Timeout = nullptr) {\n    while (true) {\n      uint32_t Expected = SIGNALED;\n      uint32_t Desired = UNSIGNALED;\n\n      // If the mutex was already signaled then we can early exit\n      if (Mutex.compare_exchange_strong(Expected, Desired)) {\n        return true;\n      }\n      // Windows only supports millisecond granularity.\n      const uint32_t TimeoutMS = Timeout ? Timeout->tv_sec * 1000 + (Timeout->tv_nsec / 1000000) : 0;\n\n      // WaitOnAddress returns when the value at `Address` differs from the value at `CompareAddress`.\n      bool Result = WaitOnAddress(&Mutex, &Desired, 4, TimeoutMS);\n\n      if (Timeout && Result == false && GetLastError() == ERROR_TIMEOUT) {\n        return false;\n      }\n    }\n  }\n\n  template<class Rep, class Period>\n  bool WaitFor(const std::chrono::duration<Rep, Period>& time) {\n    struct timespec Timeout {};\n    auto SecondsDuration = std::chrono::duration_cast<std::chrono::seconds>(time);\n    Timeout.tv_sec = SecondsDuration.count();\n    Timeout.tv_nsec = std::chrono::duration_cast<std::chrono::nanoseconds>(time - SecondsDuration).count();\n    return Wait(&Timeout);\n  }\n\n  void NotifyOne() {\n    DoNotify(false);\n  }\n\n  void NotifyAll() {\n    // Maximum number of waiters\n    DoNotify(true);\n  }\n\nprivate:\n  std::atomic<uint32_t> Mutex {};\n  constexpr static uint32_t SIGNALED = 1;\n  constexpr static uint32_t UNSIGNALED = 0;\n\n  void DoNotify(bool All) {\n    uint32_t Expected = UNSIGNALED;\n    uint32_t Desired = SIGNALED;\n\n    // If the mutex was in an unsignaled state then signal\n    if (Mutex.compare_exchange_strong(Expected, Desired)) {\n      if (All) {\n        WakeByAddressAll(&Mutex);\n      } else {\n        WakeByAddressSingle(&Mutex);\n      }\n    }\n  }\n};\n\n#endif\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/IntervalList.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <utility>\n#include <algorithm>\n\n#include <FEXCore/fextl/vector.h>\n\nnamespace FEXCore {\ntemplate<typename SizeType>\nclass IntervalList {\npublic:\n  using DifferenceType = decltype(std::declval<SizeType>() - std::declval<SizeType>());\n\n  struct Interval {\n    SizeType Offset;\n    SizeType End;\n\n    Interval() = default;\n\n    Interval(SizeType Offset, SizeType End)\n      : Offset {Offset}\n      , End {End} {}\n  };\n\nprivate:\n  fextl::vector<Interval> Intervals; ///< list of intervals sorted by their end offset\n\npublic:\n  struct QueryResult {\n    bool Enclosed;       ///< If the given offset was enclosed by an interval\n    DifferenceType Size; ///< Size of the interval starting from the query offset, or distance to the next interval if\n                         /// `Enclosed` is false (if there is no next interval, size is 0)\n    Interval Interval;   ///< The interval that the query offset is enclosed by, or the next interval if `Enclosed` is false\n  };\n\n  using const_iterator = typename fextl::vector<Interval>::const_iterator;\n\n  const_iterator begin() const {\n    return Intervals.begin();\n  }\n  const_iterator end() const {\n    return Intervals.end();\n  }\n\n  void Clear() {\n    Intervals.clear();\n  }\n\n  bool Empty() const {\n    return Intervals.empty();\n  }\n\n  void Insert(Interval Entry) {\n    if (Entry.Offset == Entry.End) {\n      return;\n    }\n\n    auto [FirstIt, EndIt] =\n      std::equal_range(Intervals.begin(), Intervals.end(), Entry, [](const auto& LHS, const auto& RHS) { return LHS.End <= RHS.Offset; });\n\n    if (FirstIt == EndIt) {\n      // No overlaps\n      Intervals.insert(FirstIt, Entry);\n      return;\n    }\n\n    auto LastIt = std::prev(EndIt);\n    // FirstIt/LastIt are the lowest/highest offset intervals respectively that overlap with the new interval\n\n    const SizeType Offset = std::min(Entry.Offset, FirstIt->Offset);\n    const SizeType End = std::max(LastIt->End, Entry.End);\n\n    // Erase all overlapping entries but the first\n    const auto EraseStartIt = std::next(FirstIt);\n    const auto EraseEndIt = std::next(LastIt);\n    LastIt = Intervals.erase(EraseStartIt, EraseEndIt);\n    FirstIt = std::prev(LastIt);\n\n    FirstIt->Offset = Offset;\n    FirstIt->End = End;\n  }\n\n  void Insert(const IntervalList<SizeType>& Other) {\n    for (const auto& Interval : Other.Intervals) {\n      Insert(Interval);\n    }\n  }\n\n  void Remove(Interval Entry) {\n    if (Entry.Offset == Entry.End) {\n      return;\n    }\n\n    auto [FirstIt, EndIt] =\n      std::equal_range(Intervals.begin(), Intervals.end(), Entry, [](const auto& LHS, const auto& RHS) { return LHS.End <= RHS.Offset; });\n\n    if (FirstIt == EndIt) {\n      // No intersecting intervals present, nothing more to do\n      return;\n    }\n\n    if (FirstIt->Offset < Entry.Offset && FirstIt->End > Entry.End) {\n      // The interval to be removed is fully enclosed by an existing interval\n\n      // Break the single interval into two smaller intervals on either side on the interval being removed\n      const auto FirstPredecessorIt = Intervals.insert(FirstIt, *FirstIt);\n      FirstIt = std::next(FirstPredecessorIt);\n      FirstPredecessorIt->End = Entry.Offset;\n      FirstIt->Offset = Entry.End;\n      return;\n    }\n\n    auto LastIt = std::prev(EndIt);\n    // FirstIt/LastIt are the lowest/highest offset intervals respectively that overlap with the new interval\n\n    if (FirstIt->Offset < Entry.Offset) {\n      // The first overlap straddles the start of the interval to be removed\n      FirstIt->End = Entry.Offset;\n      if (FirstIt == LastIt) {\n        // No more overlaps left, nothing more to do\n        return;\n      } else {\n        FirstIt++;\n      }\n    }\n\n    if (LastIt->End > Entry.End) {\n      // The last overlap straddles the end of the interval to be removed\n      LastIt->Offset = Entry.End;\n      if (LastIt == FirstIt) {\n        // No more overlaps left, nothing more to do\n        return;\n      } else {\n        LastIt--;\n      }\n    }\n\n    // Now none of the overlaps straddle the edges of the interval to be removed they can all be erased\n    const auto EraseStartIt = FirstIt;\n    const auto EraseEndIt = std::next(LastIt);\n    Intervals.erase(EraseStartIt, EraseEndIt);\n  }\n\n  QueryResult Query(SizeType Offset) const {\n    const auto It = std::upper_bound(Intervals.begin(), Intervals.end(), Offset, [](const auto& LHS, const auto& RHS) {\n      return LHS < RHS.End;\n    }); // Lowest offset interval that (maybe) overlaps with the query offset\n\n    if (It == Intervals.end()) { // No overlaps past offset\n      return {false, 0, {}};\n    } else if (It->Offset > Offset) { // No overlap, return the distance to the next possible overlap\n      return {false, It->Offset - Offset, *It};\n    } else { // Overlap, return the distance to the end of the overlap\n      return {true, It->End - Offset, *It};\n    }\n  }\n\n  bool Intersect(Interval Entry) const {\n    const auto It = std::upper_bound(Intervals.begin(), Intervals.end(), Entry, [](const auto& LHS, const auto& RHS) {\n      return LHS.Offset < RHS.End;\n    }); // Lowest offset interval that (maybe) overlaps with the query offset\n\n    return It != Intervals.end() && It->Offset < Entry.End;\n  }\n\n  bool Contains(Interval Entry) const {\n    const auto It = std::upper_bound(Intervals.begin(), Intervals.end(), Entry, [](const auto& LHS, const auto& RHS) {\n      return LHS.Offset < RHS.End;\n    }); // Lowest offset interval that (maybe) overlaps with the query offset\n\n    return It != Intervals.end() && It->Offset <= Entry.Offset && It->End >= Entry.End;\n  }\n};\n\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/LogManager.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/CompilerDefs.h>\n\n#include <cstdarg>\n\n#include <fmt/format.h>\n#include <fmt/color.h>\n\nnamespace LogMan {\nenum DebugLevels : uint32_t {\n  NONE = 0,   ///< Expect zero messages\n  ASSERT = 1, ///< Assert throwing\n  ERROR = 2,  ///< Only Errors printed\n  DEBUG = 3,  ///< Debug messages added\n  INFO = 4,   ///< Info messages added\n};\n\nstatic inline const char* DebugLevelStr(uint32_t Level) {\n  switch (Level) {\n  case NONE: return \"NONE\";\n  case ASSERT: return \"A\";\n  case ERROR: return \"E\";\n  case DEBUG: return \"D\";\n  case INFO: return \"I\";\n  default: return \"???\"; break;\n  }\n}\n\nstatic inline fmt::text_style DebugLevelStyle(uint32_t Level) {\n  switch (Level) {\n  case LogMan::ASSERT: return fmt::bg(fmt::color::red) | fmt::emphasis::bold | fmt::fg(fmt::color::white);\n  case LogMan::ERROR: return fmt::fg(fmt::color::red);\n  case LogMan::DEBUG: return fmt::fg(fmt::color::gray);\n  case LogMan::INFO: return fmt::fg(fmt::color::green);\n  default: return {}; break;\n  }\n}\n\nconstexpr DebugLevels MSG_LEVEL = INFO;\n\n// Note that all logging functions with the Fmt or _FMT suffix on them expect\n// format strings as used by fmtlib (or C++ std::format).\n\nnamespace Throw {\n  using ThrowHandler = void (*)(const char* Message);\n  FEX_DEFAULT_VISIBILITY void InstallHandler(ThrowHandler Handler);\n  FEX_DEFAULT_VISIBILITY void UnInstallHandler();\n\n  [[noreturn]]\n  void MFmt(const char* fmt, const fmt::format_args& args);\n\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  template<typename... Args>\n  static inline void AFmt(bool Value, const char* fmt, const Args&... args) {\n    if (MSG_LEVEL < ASSERT || Value) {\n      return;\n    }\n    MFmt(fmt, fmt::make_format_args(args...));\n  }\n\n#define LOGMAN_THROW_A_FMT(pred, format, ...)                                                                             \\\n  do {                                                                                                                    \\\n    if (!(pred)) {                                                                                                        \\\n      LogMan::Throw::AFmt(false, \"{}:{}, {}: \" format, __FILE_NAME__, __LINE__, __FUNCTION__ __VA_OPT__(, ) __VA_ARGS__); \\\n    }                                                                                                                     \\\n  } while (0)\n#else\n  static inline void AFmt(bool, const char*, ...) {}\n#define LOGMAN_THROW_A_FMT(pred, ...) \\\n  do {                                \\\n    (void)(pred);                     \\\n  } while (0)\n#endif\n\n} // namespace Throw\n\nnamespace Msg {\n  using MsgHandler = void (*)(DebugLevels Level, const char* Message);\n  FEX_DEFAULT_VISIBILITY void InstallHandler(MsgHandler Handler);\n  FEX_DEFAULT_VISIBILITY void UnInstallHandler();\n\n  // Fmt-capable interface.\n\n  FEX_DEFAULT_VISIBILITY void MFmtImpl(DebugLevels level, const char* fmt, const fmt::format_args& args);\n\n  template<typename... Args>\n  static inline void MFmt(DebugLevels level, const char* fmt, const Args&... args) {\n    MFmtImpl(level, fmt, fmt::make_format_args(args...));\n  }\n\n  template<typename... Args>\n  static inline void EFmt(const char* fmt, const Args&... args) {\n    if (MSG_LEVEL < ERROR) {\n      return;\n    }\n    MFmtImpl(ERROR, fmt, fmt::make_format_args(args...));\n  }\n\n  template<typename... Args>\n  static inline void DFmt(const char* fmt, const Args&... args) {\n    if (MSG_LEVEL < DEBUG) {\n      return;\n    }\n    MFmtImpl(DEBUG, fmt, fmt::make_format_args(args...));\n  }\n\n  template<typename... Args>\n  static inline void IFmt(const char* fmt, const Args&... args) {\n    if (MSG_LEVEL < INFO) {\n      return;\n    }\n    MFmtImpl(INFO, fmt, fmt::make_format_args(args...));\n  }\n\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  template<typename... Args>\n  static inline void AFmt(const char* fmt, const Args&... args) {\n    if (MSG_LEVEL < ASSERT) {\n      return;\n    }\n    MFmtImpl(ASSERT, fmt, fmt::make_format_args(args...));\n    FEX_TRAP_EXECUTION;\n  }\n#define LOGMAN_MSG_A_FMT(...)       \\\n  do {                              \\\n    LogMan::Msg::AFmt(__VA_ARGS__); \\\n  } while (0)\n#else\n  template<typename... Args>\n  static inline void AFmt(const char*, const Args&...) {}\n#define LOGMAN_MSG_A_FMT(...) \\\n  do {                        \\\n  } while (0)\n#endif\n\n#define WARN_ONCE_FMT(...)            \\\n  do {                                \\\n    static bool Warned {};            \\\n    if (!Warned) {                    \\\n      LogMan::Msg::DFmt(__VA_ARGS__); \\\n      Warned = true;                  \\\n    }                                 \\\n  } while (0);\n\n#define ERROR_AND_DIE_FMT(...)                      \\\n  do {                                              \\\n    LogMan::Msg::MFmt(LogMan::ASSERT, __VA_ARGS__); \\\n    FEX_TRAP_EXECUTION;                             \\\n  } while (0)\n\n} // namespace Msg\n} // namespace LogMan\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/LongJump.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/Utils/CompilerDefs.h>\n\n#include <cstdint>\n\n// Reimplementation of longjmp without glibc fortification checks.\n// This is useful when false positives need to be avoided or when using\n// a libc implementation that does not implement std::longjmp.\nnamespace FEXCore::UncheckedLongJump {\n// JumpBuf definition needs to be public because the frontend needs to understand it.\n#if defined(ARCHITECTURE_arm64)\nstruct JumpBuf {\n  // All the registers that are required by AAPCS64 to save.\n  // GPRs\n  // X19, X20, X21, X22,\n  // X23, X24, X25, X26,\n  // X27, X28, X29, X30,\n  //\n  // Lower 64-bits:\n  //  V8,  V9, V10, V11,\n  // V12, V13, V14, V15,\n  //\n  // SP,\n  uint64_t Registers[21];\n};\n#else\nstruct JumpBuf {\n  // Registers to preserve\n  // RBX, RSP, RBP, R12, R13, R14, R15,\n  // <return address>\n  uint64_t Registers[8];\n};\n#endif\n\n[[nodiscard]] FEX_DEFAULT_VISIBILITY uint64_t SetJump(JumpBuf& Buffer);\n[[noreturn]] FEX_DEFAULT_VISIBILITY void LongJump(const JumpBuf& Buffer, uint64_t Value);\nFEX_DEFAULT_VISIBILITY void ManuallyLoadJumpBuf(const JumpBuf& Buffer, uint64_t Value, uint64_t* GPRs, __uint128_t* FPRs, uint64_t* PC);\n} // namespace FEXCore::UncheckedLongJump\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/MathUtils.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/LogManager.h>\n\n#include <bit>\n#include <cstdint>\n#include <type_traits>\n\nnamespace FEXCore {\n[[nodiscard]]\nconstexpr uint64_t AlignUp(uint64_t value, uint64_t size) {\n  return value + (size - value % size) % size;\n}\n\n[[nodiscard]]\nconstexpr uint64_t AlignDown(uint64_t value, uint64_t size) {\n  return value - value % size;\n}\n\n// Returns the ilog2 of a power-of-2 integer.\n// Asserts in the case that the passed in integer is not a power-of-2.\ntemplate<typename T>\nrequires (std::is_unsigned_v<T>)\n[[nodiscard]]\nconstexpr T ilog2(T Value) {\n  LOGMAN_THROW_A_FMT(std::has_single_bit(Value), \"ilog2 requires popcount to be one\");\n  return std::countr_zero(Value);\n}\n\n// Divide a number by a power-of-2 by avoiding integer division.\n// Can be a faster implementation than regular integer divide.\n// Divisor requires to be power-of-2, is enforced in ilog2 helper.\ntemplate<typename T, typename TT>\nrequires (std::is_unsigned_v<T> && std::is_unsigned_v<TT>)\n[[nodiscard]]\nconstexpr T DividePow2(T Dividend, TT Divisor) {\n  return Dividend >> ilog2(Divisor);\n}\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/PrctlUtils.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#ifndef _WIN32\n#include <linux/prctl.h>\n#include <sys/mman.h>\n#include <sys/user.h>\n#include <sys/prctl.h>\n\n#ifndef PR_SET_VMA\n#define PR_SET_VMA 0x53564d41\n#endif\n\n#ifndef PR_SET_VMA_ANON_NAME\n#define PR_SET_VMA_ANON_NAME 0\n#endif\n\n#ifndef PR_GET_MEM_MODEL\n#define PR_GET_MEM_MODEL 0x6d4d444c\n#endif\n#ifndef PR_SET_MEM_MODEL\n#define PR_SET_MEM_MODEL 0x4d4d444c\n#endif\n#ifndef PR_SET_MEM_MODEL_DEFAULT\n#define PR_SET_MEM_MODEL_DEFAULT 0\n#endif\n#ifndef PR_SET_MEM_MODEL_TSO\n#define PR_SET_MEM_MODEL_TSO 1\n#endif\n\n#ifndef PR_GET_COMPAT_INPUT\n#define PR_GET_COMPAT_INPUT 0x63494e50\n#endif\n#ifndef PR_SET_COMPAT_INPUT\n#define PR_SET_COMPAT_INPUT 0x43494e50\n#endif\n#ifndef PR_SET_COMPAT_INPUT_DISABLE\n#define PR_SET_COMPAT_INPUT_DISABLE 0\n#endif\n#ifndef PR_SET_COMPAT_INPUT_ENABLE\n#define PR_SET_COMPAT_INPUT_ENABLE 1\n#endif\n\n#ifndef PR_GET_SHADOW_STACK_STATUS\n#define PR_GET_SHADOW_STACK_STATUS 74\n#endif\n#ifndef PR_LOCK_SHADOW_STACK_STATUS\n#define PR_LOCK_SHADOW_STACK_STATUS 76\n#endif\n#ifndef PR_SHADOW_STACK_ENABLE\n#define PR_SHADOW_STACK_ENABLE (1ULL << 0)\n#endif\n\n#endif // ifndef _WIN32\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/Profiler.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <cstdint>\n#include <string_view>\n\n#include <FEXCore/Utils/CompilerDefs.h>\n\n#define FEXCORE_PROFILER_BACKEND_OFF 0\n#define FEXCORE_PROFILER_BACKEND_GPUVIS 1\n#define FEXCORE_PROFILER_BACKEND_TRACY 2\n\n#if defined(ENABLE_FEXCORE_PROFILER) && FEXCORE_PROFILER_BACKEND == FEXCORE_PROFILER_BACKEND_TRACY\n#include \"tracy/Tracy.hpp\"\n#endif\n\nnamespace FEXCore::Profiler {\n#define UniqueScopeName2(name, line) name##line\n#define UniqueScopeName(name, line) UniqueScopeName2(name, line)\n\n#ifdef ENABLE_FEXCORE_PROFILER\n\nFEX_DEFAULT_VISIBILITY void Init(std::string_view ProgramName, std::string_view ProgramPath);\nFEX_DEFAULT_VISIBILITY void PostForkAction(bool IsChild);\nFEX_DEFAULT_VISIBILITY bool IsActive();\nFEX_DEFAULT_VISIBILITY void Shutdown();\nFEX_DEFAULT_VISIBILITY void TraceObject(const std::string_view Format);\nFEX_DEFAULT_VISIBILITY void TraceObject(const std::string_view Format, uint64_t Duration);\n\n// Declare an instantaneous profiler event.\n#define FEXCORE_PROFILE_INSTANT(name) FEXCore::Profiler::TraceObject(name)\n\n#if FEXCORE_PROFILER_BACKEND == FEXCORE_PROFILER_BACKEND_TRACY\n// Declare a scoped profile block variable with a fixed name.\n#define FEXCORE_PROFILE_SCOPED(name) ZoneNamedN(___tracy_scoped_zone, name, ::FEXCore::Profiler::IsActive())\n#else\n// A class that follows scoping rules to generate a profile duration block\nclass ProfilerBlock final {\npublic:\n  ProfilerBlock(const std::string_view Format);\n\n  ~ProfilerBlock();\n\nprivate:\n  uint64_t DurationBegin;\n  const std::string_view Format;\n};\n\n// Declare a scoped profile block variable with a fixed name.\n#define FEXCORE_PROFILE_SCOPED(name) FEXCore::Profiler::ProfilerBlock UniqueScopeName(ScopedBlock_, __LINE__)(name)\n#endif\n\n#else\ninline void Init(std::string_view ProgramName, std::string_view ProgramPath) {}\ninline void PostForkAction(bool IsChild) {}\ninline void Shutdown() {}\ninline void TraceObject(const std::string_view Format) {}\ninline void TraceObject(const std::string_view, uint64_t) {}\n\n#define FEXCORE_PROFILE_INSTANT(...) \\\n  do {                               \\\n  } while (0)\n#define FEXCORE_PROFILE_SCOPED(...) \\\n  do {                              \\\n  } while (0)\n\n#endif\n} // namespace FEXCore::Profiler\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/SHMStats.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <atomic>\n#include <cstddef>\n#include <cstdint>\n\n#ifdef ARCHITECTURE_x86_64\n#include <x86intrin.h>\n#endif\n\nnamespace FEXCore::SHMStats {\n#ifdef ARCHITECTURE_arm64\n/**\n * @brief Get the raw cycle counter with synchronizing isb.\n *\n * `CNTVCTSS_EL0` also does the same thing, but requires the FEAT_ECV feature.\n */\nstatic inline uint64_t GetCycleCounter() {\n  uint64_t Result {};\n  __asm volatile(R\"(\n      isb;\n      mrs %[Res], CNTVCT_EL0;\n    )\"\n                 : [Res] \"=r\"(Result));\n  return Result;\n}\n#else\nstatic inline uint64_t GetCycleCounter() {\n  unsigned dummy;\n  uint64_t tsc = __rdtscp(&dummy);\n  return tsc;\n}\n#endif\n// FEXCore live-stats\nconstexpr uint8_t STATS_VERSION = 2;\nenum class AppType : uint8_t {\n  LINUX_32,\n  LINUX_64,\n  WIN_ARM64EC,\n  WIN_WOW64,\n};\n\n// Only append new members to the end of {ThreadStatsHeader, ThreadStats} to allow old tools time to support new information.\n// FEX isn't guaranteeing /not/ breaking compatibility with versions, but trying to not cause too much churn.\nstruct ThreadStatsHeader {\n  uint8_t Version;\n  AppType app_type;\n  uint16_t ThreadStatsSize;\n  char fex_version[48];\n  std::atomic<uint32_t> Head;\n  std::atomic<uint32_t> Size;\n  uint32_t Pad;\n};\n\nstruct ThreadStats {\n  std::atomic<uint32_t> Next;\n  std::atomic<uint32_t> TID;\n\n  // Accumulated time (In unscaled CPU cycles!)\n  uint64_t AccumulatedJITTime;\n  uint64_t AccumulatedSignalTime;\n\n  // Accumulated event counts\n  uint64_t AccumulatedSIGBUSCount;\n  uint64_t AccumulatedSMCCount;\n  uint64_t AccumulatedFloatFallbackCount;\n\n  uint64_t AccumulatedCacheMissCount;\n  uint64_t AccumulatedCacheReadLockTime;\n  uint64_t AccumulatedCacheWriteLockTime;\n\n  uint64_t AccumulatedJITCount;\n};\n\n// Ensure 16-byte alignment to take advantage of ARM single-copy atomicity.\nstatic_assert(sizeof(ThreadStats) % 16 == 0, \"Needs to be 16-byte aligned!\");\n\ntemplate<typename T, size_t FlatOffset = 0>\nclass AccumulationBlock final {\npublic:\n  AccumulationBlock(T* Stat)\n    : Begin {Stat ? GetCycleCounter() : 0}\n    , Stat {Stat} {}\n\n  ~AccumulationBlock() {\n    if (Stat) {\n      const auto Duration = GetCycleCounter() - Begin + FlatOffset;\n      auto ref = std::atomic_ref<T>(*Stat);\n      ref.fetch_add(Duration, std::memory_order_relaxed);\n    }\n  }\n\nprivate:\n  uint64_t Begin;\n  T* Stat;\n};\n#define UniqueScopeName2(name, line) name##line\n#define UniqueScopeName(name, line) UniqueScopeName2(name, line)\n\n#define FEXCORE_PROFILE_ACCUMULATION(ThreadState, Stat)                                                                          \\\n  FEXCore::SHMStats::AccumulationBlock<decltype(ThreadState->ThreadStats->Stat)> UniqueScopeName(ScopedAccumulation_, __LINE__)( \\\n    ThreadState->ThreadStats ? &ThreadState->ThreadStats->Stat : nullptr);\n#define FEXCORE_PROFILE_INSTANT_INCREMENT(ThreadState, Stat, value) \\\n  do {                                                              \\\n    if (ThreadState->ThreadStats) {                                 \\\n      ThreadState->ThreadStats->Stat += value;                      \\\n    }                                                               \\\n  } while (0)\n\n} // namespace FEXCore::SHMStats\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/SignalScopeGuards.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Debug/InternalThreadState.h>\n\n#include <atomic>\n#include <cstdint>\n#include <mutex>\n#include <optional>\n#include <signal.h>\n#ifndef _WIN32\n#include <sys/syscall.h>\n#endif\n#include <unistd.h>\n#include <variant>\n\nnamespace FEXCore {\n#ifndef _WIN32\n// Replacement for std::mutexes to deal with unlocking issues in the face of Linux fork() semantics.\n//\n// A fork() only clones the parent's calling thread. Other threads are silently dropped, which permanently leaves any mutexes owned by them locked.\n// To address this issue, ForkableUniqueMutex and ForkableSharedMutex provide a way to forcefully remove any dangling locks and reset the mutexes to their default state.\nclass ForkableUniqueMutex final {\npublic:\n  ForkableUniqueMutex()\n    : Mutex(PTHREAD_MUTEX_INITIALIZER) {}\n\n  // Move-only type\n  ForkableUniqueMutex(const ForkableUniqueMutex&) = delete;\n  ForkableUniqueMutex& operator=(const ForkableUniqueMutex&) = delete;\n  ForkableUniqueMutex(ForkableUniqueMutex&& rhs) = default;\n  ForkableUniqueMutex& operator=(ForkableUniqueMutex&&) = default;\n\n  void lock() {\n    const auto Result = pthread_mutex_lock(&Mutex);\n    LOGMAN_THROW_A_FMT(Result == 0, \"{} failed to lock with {}\", __func__, Result);\n  }\n  void unlock() {\n    const auto Result = pthread_mutex_unlock(&Mutex);\n    LOGMAN_THROW_A_FMT(Result == 0, \"{} failed to unlock with {}\", __func__, Result);\n  }\n  // Initialize the internal pthread object to its default initializer state.\n  // Should only ever be used in the child process when a Linux fork() has occured.\n  void StealAndDropActiveLocks() {\n    Mutex = PTHREAD_MUTEX_INITIALIZER;\n  }\n\n  // Asserts that the mutex isn't exclusively owned by the calling thread.\n  void check_lock_owned_by_self() {\n    const auto Result = pthread_mutex_lock(&Mutex);\n    LOGMAN_THROW_A_FMT(Result == EDEADLK, \"User of unique lock must have already locked mutex as write!\");\n  }\n\nprivate:\n  pthread_mutex_t Mutex;\n};\n\nclass ForkableSharedMutex final {\npublic:\n  ForkableSharedMutex()\n    : Mutex(PTHREAD_RWLOCK_INITIALIZER) {}\n\n  // Move-only type\n  ForkableSharedMutex(const ForkableSharedMutex&) = delete;\n  ForkableSharedMutex& operator=(const ForkableSharedMutex&) = delete;\n  ForkableSharedMutex(ForkableSharedMutex&& rhs) = default;\n  ForkableSharedMutex& operator=(ForkableSharedMutex&&) = default;\n\n  void lock() {\n    const auto Result = pthread_rwlock_wrlock(&Mutex);\n    LOGMAN_THROW_A_FMT(Result == 0, \"{} failed to lock with {}\", __func__, Result);\n  }\n  void unlock() {\n    const auto Result = pthread_rwlock_unlock(&Mutex);\n    LOGMAN_THROW_A_FMT(Result == 0, \"{} failed to unlock with {}\", __func__, Result);\n  }\n  void lock_shared() {\n    const auto Result = pthread_rwlock_rdlock(&Mutex);\n    LOGMAN_THROW_A_FMT(Result == 0, \"{} failed to lock with {}\", __func__, Result);\n  }\n\n  void unlock_shared() {\n    unlock();\n  }\n\n  bool try_lock() {\n    const auto Result = pthread_rwlock_trywrlock(&Mutex);\n    return Result == 0;\n  }\n\n  bool try_lock_shared() {\n    const auto Result = pthread_rwlock_tryrdlock(&Mutex);\n    return Result == 0;\n  }\n\n  // Asserts that the rwlock isn't exclusively owned by the calling thread.\n  void check_lock_owned_by_self_as_write() {\n    const auto Result = pthread_rwlock_wrlock(&Mutex);\n    LOGMAN_THROW_A_FMT(Result == EDEADLK, \"User of rwlock must have already locked mutex as write!\");\n  }\n\n  // Initialize the internal pthread object to its default initializer state.\n  // Should only ever be used in the child process when a Linux fork() has occured.\n  void StealAndDropActiveLocks() {\n    Mutex = PTHREAD_RWLOCK_INITIALIZER;\n  }\nprivate:\n  pthread_rwlock_t Mutex;\n};\n\n// Helper class to manage deferred signal refcounting within a block scope\nclass DeferredSignalRefCountGuard final {\npublic:\n  explicit DeferredSignalRefCountGuard(FEXCore::Core::InternalThreadState* Thread)\n    : Thread(Thread) {\n    // Needs to be atomic so that operations can't end up getting reordered around this.\n    Thread->CurrentFrame->State.DeferredSignalRefCount.Increment(1);\n  }\n\n  // Move-only type\n  DeferredSignalRefCountGuard(const DeferredSignalRefCountGuard&) = delete;\n  DeferredSignalRefCountGuard& operator=(DeferredSignalRefCountGuard&) = delete;\n  DeferredSignalRefCountGuard(DeferredSignalRefCountGuard&& rhs)\n    : Thread(rhs.Thread) {\n    rhs.Thread = nullptr;\n  }\n\n  ~DeferredSignalRefCountGuard() {\n    if (Thread) {\n#ifdef ARCHITECTURE_x86_64\n      // Needs to be atomic so that operations can't end up getting reordered around this.\n      // Without this, the refcount and the signal access could get reordered.\n      auto Result = Thread->CurrentFrame->State.DeferredSignalRefCount.Decrement(1);\n\n      // X86-64 must do an additional check around the store.\n      if ((Result - 1) == 0) {\n        // Must happen after the refcount store\n        auto InterruptFaultPage = reinterpret_cast<Core::NonAtomicRefCounter<uint64_t>*>(&Thread->InterruptFaultPage);\n        InterruptFaultPage->Store(0);\n      }\n#else\n      Thread->CurrentFrame->State.DeferredSignalRefCount.Decrement(1);\n      auto InterruptFaultPage = reinterpret_cast<Core::NonAtomicRefCounter<uint64_t>*>(&Thread->InterruptFaultPage);\n      InterruptFaultPage->Store(0);\n#endif\n    }\n  }\nprivate:\n  FEXCore::Core::InternalThreadState* Thread;\n};\n\n// Helper class to mask POSIX signals within a block scope\nclass ScopedSignalMasker final {\npublic:\n  explicit ScopedSignalMasker(uint64_t Mask)\n    : OriginalMask(0) {\n    // Mask all signals, storing the original incoming mask\n    ::syscall(SYS_rt_sigprocmask, SIG_SETMASK, &Mask, &*OriginalMask, sizeof(*OriginalMask));\n  }\n\n  // Move-only type\n  ScopedSignalMasker(const ScopedSignalMasker&) = delete;\n  ScopedSignalMasker& operator=(ScopedSignalMasker&) = delete;\n  ScopedSignalMasker(ScopedSignalMasker&& rhs)\n    : OriginalMask(rhs.OriginalMask) {\n    rhs.OriginalMask.reset();\n  }\n\n  ~ScopedSignalMasker() {\n    if (OriginalMask) {\n      ::syscall(SYS_rt_sigprocmask, SIG_SETMASK, &OriginalMask, nullptr, sizeof(*OriginalMask));\n    }\n  }\nprivate:\n  std::optional<uint64_t> OriginalMask {};\n};\n\n/**\n * @brief Produces a wrapper object around a scoped lock of the given mutex\n * while ensuring POSIX signals are masked while the mutex is locked\n *\n * Use this to prevent reentrancy issues of C++ mutexes with certain signal handlers.\n * Common examples of such issues are:\n * - C++ mutexes not unlocking due to a signal handler calling longjmp from within a scope owning the mutex\n * - The signal handler itself using a mutex that would be re-locked if the handler gets invoked\n *   again before unlocking\n *\n * Ownership of the returned object may be moved, but it is NOT SAFE to move across threads.\n */\ntemplate<template<typename> class LockType = std::unique_lock, typename MutexType>\n[[nodiscard]]\nstatic auto MaskSignalsAndLockMutex(MutexType& mutex, uint64_t Mask = ~0ULL) {\n  // Signals are masked first, and then the lock is acquired\n  struct {\n    ScopedSignalMasker mask;\n    LockType<MutexType> lock;\n  } scope_guard {ScopedSignalMasker {Mask}, LockType<MutexType> {mutex}};\n  return scope_guard;\n}\n\n/**\n * @brief Produces a wrapper object around a scoped lock of the given mutex\n * while bumping the Thread's deferred signal refcount while the mutex is\n * locked.\n */\ntemplate<template<typename> class LockType = std::unique_lock, typename MutexType>\n[[nodiscard]]\nstatic auto GuardSignalDeferringSection(MutexType& mutex, FEXCore::Core::InternalThreadState* Thread, uint64_t Mask = ~0ULL) {\n  // Refcount is incremented first, and then the lock is acquired.\n  struct {\n    std::optional<DeferredSignalRefCountGuard> refcount;\n    LockType<MutexType> lock;\n  } scope_guard = {DeferredSignalRefCountGuard {Thread}, LockType<MutexType> {mutex}};\n  return scope_guard;\n}\n\n// Like GuardSignalDeferringSection but falls back to masking signals when Thread is nullptr\ntemplate<template<typename> class LockType = std::unique_lock, typename MutexType>\n[[nodiscard]]\nstatic auto GuardSignalDeferringSectionWithFallback(MutexType& mutex, FEXCore::Core::InternalThreadState* Thread, uint64_t Mask = ~0ULL) {\n  using ExtraGuard = std::variant<ScopedSignalMasker, DeferredSignalRefCountGuard>;\n\n  struct {\n    ExtraGuard refcount_or_mask;\n    LockType<MutexType> lock;\n  } scope_guard {Thread ? ExtraGuard {DeferredSignalRefCountGuard {Thread}} : ExtraGuard {ScopedSignalMasker {Mask}}};\n  scope_guard.lock = LockType<MutexType> {mutex};\n  return scope_guard;\n}\n\n#else\n\n// Dummy implementations as Windows doesn't support forking or async signals.\nclass ForkableUniqueMutex final : public std::mutex {\npublic:\n  void StealAndDropActiveLocks() {\n    LogMan::Msg::AFmt(\"{} is unsupported on WIN32 builds!\", __func__);\n  }\n};\n\nclass ForkableSharedMutex final : public std::shared_mutex {\npublic:\n  void StealAndDropActiveLocks() {\n    LogMan::Msg::AFmt(\"{} is unsupported on WIN32 builds!\", __func__);\n  }\n};\n\ntemplate<template<typename> class LockType = std::unique_lock, typename MutexType>\n[[nodiscard]]\nstatic auto MaskSignalsAndLockMutex(MutexType& mutex, uint64_t Mask = ~0ULL) {\n  return LockType<MutexType> {mutex};\n}\n\ntemplate<template<typename> class LockType = std::unique_lock, typename MutexType>\n[[nodiscard]]\nstatic auto GuardSignalDeferringSection(MutexType& mutex, FEXCore::Core::InternalThreadState* Thread, uint64_t Mask = ~0ULL) {\n  return LockType<MutexType> {mutex};\n}\n\ntemplate<template<typename> class LockType = std::unique_lock, typename MutexType>\n[[nodiscard]]\nstatic auto GuardSignalDeferringSectionWithFallback(MutexType& mutex, FEXCore::Core::InternalThreadState* Thread, uint64_t Mask = ~0ULL) {\n  return LockType<MutexType> {mutex};\n}\n\n#endif\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/StringUtils.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/string.h>\n\nnamespace FEXCore::StringUtils {\n// Trim the left side of the string of whitespace and new lines\ninline fextl::string LeftTrim(fextl::string String, std::string_view TrimTokens = \" \\t\\n\\r\\f\\v\") {\n  size_t pos = fextl::string::npos;\n  if ((pos = String.find_first_not_of(TrimTokens)) != fextl::string::npos) {\n    String.erase(0, pos);\n  }\n\n  return String;\n}\n\n// Trim the right side of the string of whitespace and new lines\ninline fextl::string RightTrim(fextl::string String, std::string_view TrimTokens = \" \\t\\n\\r\\f\\v\") {\n  size_t pos = fextl::string::npos;\n  if ((pos = String.find_last_not_of(TrimTokens)) != fextl::string::npos) {\n    String.erase(String.begin() + pos + 1, String.end());\n  }\n\n  return String;\n}\n\n// Trim both the left and right of the string of whitespace and new lines\ninline fextl::string Trim(fextl::string String, std::string_view TrimTokens = \" \\t\\n\\r\\f\\v\") {\n  return RightTrim(LeftTrim(std::move(String), TrimTokens), TrimTokens);\n}\n\ninline fextl::string& ReplaceAllInPlace(fextl::string& Str, std::string_view Token, std::string_view New) {\n  const auto OriginalTokenSize = Token.size();\n  const auto NewTokenSize = New.size();\n\n  size_t TokenPos {};\n  auto TokenIter = Str.find(Token, TokenPos);\n  while (TokenIter != Str.npos) {\n    Str.replace(TokenIter, OriginalTokenSize, New);\n    TokenPos += NewTokenSize;\n    TokenIter = Str.find(Token, TokenPos);\n  }\n\n  return Str;\n}\n\n} // namespace FEXCore::StringUtils\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/Telemetry.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/fextl/string.h>\n\n#include <array>\n#include <atomic>\n#include <stdint.h>\n\nnamespace FEXCore::Telemetry {\nenum TelemetryType {\n  TYPE_HAS_SPLIT_LOCKS,\n  TYPE_16BYTE_SPLIT,\n  TYPE_USES_EVEX_OPS,\n  TYPE_CAS_16BIT_TEAR,\n  TYPE_CAS_32BIT_TEAR,\n  TYPE_CAS_64BIT_TEAR,\n  TYPE_CAS_128BIT_TEAR,\n  TYPE_CRASH_MASK,\n  // If a 32-bit application is writing a non-zero value to segments.\n  TYPE_WRITES_32BIT_SEGMENT_ES,\n  TYPE_WRITES_32BIT_SEGMENT_SS,\n  TYPE_WRITES_32BIT_SEGMENT_CS,\n  TYPE_WRITES_32BIT_SEGMENT_DS,\n  // If a 32-bit application is prefix/using a non-zero segment on memory access.\n  TYPE_USES_32BIT_SEGMENT_ES,\n  TYPE_USES_32BIT_SEGMENT_SS,\n  TYPE_USES_32BIT_SEGMENT_CS,\n  TYPE_USES_32BIT_SEGMENT_DS,\n  TYPE_UNHANDLED_NONCANONICAL_ADDRESS,\n  TYPE_LAST,\n};\n\n#ifndef FEX_DISABLE_TELEMETRY\nusing Value = std::atomic<uint64_t>;\n\nFEX_DEFAULT_VISIBILITY extern std::array<Value, FEXCore::Telemetry::TelemetryType::TYPE_LAST> TelemetryValues;\n// This returns the internal structure to the telemetry data structures\n// One must be careful with placing these in the hot path of code execution\n// It can be fairly costly, especially in the static version where it puts barriers in the code\ninline Value& GetTelemetryValue(TelemetryType Type) {\n  return FEXCore::Telemetry::TelemetryValues[Type];\n}\n\nFEX_DEFAULT_VISIBILITY void Initialize();\nFEX_DEFAULT_VISIBILITY void Shutdown(const fextl::string& ApplicationName);\n\n// Telemetry object declaration\n// Telemetry ALU operations\n// These are typically 3-4 instructions depending on what you're doing\n#define FEXCORE_TELEMETRY_SET(Type, Value)                                      \\\n  do {                                                                          \\\n    auto& Name = FEXCore::Telemetry::TelemetryValues[FEXCore::Telemetry::Type]; \\\n    Name = Value;                                                               \\\n  } while (0)\n#define FEXCORE_TELEMETRY_OR(Type, Value)                                       \\\n  do {                                                                          \\\n    auto& Name = FEXCore::Telemetry::TelemetryValues[FEXCore::Telemetry::Type]; \\\n    Name |= Value;                                                              \\\n  } while (0)\n#define FEXCORE_TELEMETRY_INC(Type, Value)                                      \\\n  do {                                                                          \\\n    auto& Name = FEXCore::Telemetry::TelemetryValues[FEXCore::Telemetry::Type]; \\\n    Name++;                                                                     \\\n  } while (0)\n\n#else\nstatic inline void Initialize() {}\nstatic inline void Shutdown(const fextl::string& ApplicationName) {}\n\n#define FEXCORE_TELEMETRY_INIT(Name, Type)\n#define FEXCORE_TELEMETRY(Name, Value) \\\n  do {                                 \\\n  } while (0)\n#define FEXCORE_TELEMETRY_SET(Name, Value) \\\n  do {                                     \\\n  } while (0)\n#define FEXCORE_TELEMETRY_OR(Name, Value) \\\n  do {                                    \\\n  } while (0)\n#define FEXCORE_TELEMETRY_INC(Name) \\\n  do {                              \\\n  } while (0)\n#endif\n} // namespace FEXCore::Telemetry\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/ThreadPoolAllocator.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXCore/fextl/list.h>\n\n#include <atomic>\n#include <chrono>\n#include <cstddef>\n#include <cstdint>\n#include <mutex>\n#include <optional>\n#include <type_traits>\n\nnamespace FEXCore::Utils {\n/**\n * @brief An intrusive thread pool allocator\n *\n * Requires coordination between the allocator and its clients to efficiently share memory allocations between threads.\n *\n * The `Client` in this case referring to the location in code allocating a `MemoryBuffer` from the allocator.\n *   - The client must `Claim` a buffer to allocate it\n *   - In claiming a buffer, the allocator is passed a `BufferOwnedFlag` that is updated by both the allocator and client.\n *   - When the client is done with the buffer it must `Disown` or `Unclaim` the buffer.\n *     - `Disown` the buffer when it is expected to be used again soon.\n *       - This is relatively cheap.\n *     - `Unclaim` when the buffer won't be used again for an extended period.\n *       - This is expensive and requires a mutex shared between threads\n *     - `PoolBufferWithTimedRetirement` helper class provided to help with this.\n *\n * Once the client has disowned a buffer then the allocator is free to reclaim the buffer when another thread is trying to `Claim` a new buffer.\n * The buffer getting claimed from a disowned client must have had its last use greater than the defined `DURATION` before it has a chance to get\n * reclaimed by the Allocator.\n *\n * During buffer reclaiming is also when unclaimed buffers get freed. This means active threads are able to clean up idle thread's unused memory.\n */\nclass IntrusivePooledAllocator {\npublic:\n  struct MemoryBuffer;\n  /**\n   * @brief Container for tracking the buffers\n   *\n   * We're using fextl::list explicitly because its iterators aren't invalidated when the list is adjusted.\n   * if we had list types that we can atomically erase and append elements then unclaiming could be made cheaper.\n   */\n  using ContainerType = fextl::list<MemoryBuffer*>;\n  /**\n   * @brief steady_clock to ensure long running applications don't hit any timeskip problems.\n   */\n  using ClockType = std::chrono::steady_clock;\n  /**\n   * @brief Atomic flag state for letting the client know if it owns the buffer\n   */\n  enum class ClientFlags : uint32_t {\n    FLAG_FREE = 0,\n    FLAG_OWNED = 1,\n    FLAG_DISOWNED = 3,\n  };\n\n  using BufferOwnedFlag = std::atomic<ClientFlags>;\n\n  struct MemoryBuffer : public FEXCore::Allocator::FEXAllocOperators {\n    MemoryBuffer(void* Ptr, size_t Size, std::chrono::time_point<ClockType> LastUsed)\n      : Ptr {Ptr}\n      , Size {Size}\n      , LastUsed {LastUsed} {}\n\n    void* Ptr;\n    size_t Size;\n    std::atomic<std::chrono::time_point<ClockType>> LastUsed;\n    BufferOwnedFlag* CurrentClientOwnedFlag {};\n  };\n  // Ensure that the atomic objects of MemoryBuffer are lock free\n  static_assert(decltype(MemoryBuffer::LastUsed) {}.is_always_lock_free, \"Oops, needs to be lock free\");\n  static_assert(std::remove_pointer<decltype(MemoryBuffer::CurrentClientOwnedFlag)>::type {}.is_always_lock_free, \"Oops, needs to be lock \"\n                                                                                                                  \"free\");\n\n  /**\n   * @brief Lets the client easily check if they own the buffer or not\n   *\n   * @param CurrentClientFlag Client owned flag\n   *\n   * @return Is the client buffer owned at the point of checking\n   */\n  static bool IsClientBufferOwned(BufferOwnedFlag& CurrentClientFlag) {\n    return CurrentClientFlag.load() == ClientFlags::FLAG_OWNED;\n  }\n\n  /**\n   * @brief Lets the client easily check if the buffer was freed\n   *\n   * @param CurrentClientFlag Client owned flag\n   *\n   * @return Is the client buffer owned at the point of checking\n   */\n  static bool IsClientBufferFree(BufferOwnedFlag& CurrentClientFlag) {\n    return CurrentClientFlag.load() == ClientFlags::FLAG_FREE;\n  }\n\n  /**\n   * @brief Allocates and claims a buffer that is tracked from the thread pool\n   *\n   * @param Size\n   * @param CurrentClientFlag\n   *\n   * Once a buffer is claimed, the pool allocator can not reclaim this buffer until it is \"Disowned\"\n   *\n   * @return iterator to the internal tracking container\n   */\n  ContainerType::iterator ClaimBuffer(size_t Size, BufferOwnedFlag* CurrentClientFlag) {\n    std::unique_lock lk {AllocationMutex};\n    auto Buffer = ClaimBufferImpl(Size);\n    (*Buffer)->CurrentClientOwnedFlag = CurrentClientFlag;\n    CurrentClientFlag->store(ClientFlags::FLAG_OWNED);\n    return Buffer;\n  }\n\n  /**\n   * @brief Immediately release the buffer back to the allocator, given it has not been reclaimed\n   *\n   * @param Buffer - The iterator that was previously given with ClaimBuffer\n   */\n  void UnclaimBuffer(const ContainerType::iterator& Buffer, BufferOwnedFlag* ClientFlag) {\n    // Transition the buffer to free, unclaiming if it wasn't free prior.\n    if (ClientFlag->exchange(ClientFlags::FLAG_FREE) != ClientFlags::FLAG_FREE) {\n      std::unique_lock lk {AllocationMutex};\n      UnclaimBufferImpl(Buffer);\n    }\n  }\n\n  /**\n   * @brief Set internal flags of buffer claiming that the buffer is relinquished ownership\n   *\n   * @param Buffer - The iterator that was previously given with ClaimBuffer\n   *\n   * Once the buffer is disowned, the allocator can take back ownership of the buffer at any time\n   *\n   * Use ReownOrClaimBuffer if you want to attempt reusing a buffer being held on to.\n   */\n  void DisownBuffer(ContainerType::iterator Buffer) {\n    // Client still owns the buffer but isn't using it\n    // Allows us to claim it back if necessary\n    (*Buffer)->LastUsed.store(ClockType::now(), std::memory_order_relaxed);\n    (*Buffer)->CurrentClientOwnedFlag->store(ClientFlags::FLAG_DISOWNED);\n  }\n\n  /**\n   * @brief Try to reown a buffer that was previously disowned\n   *\n   * @param Buffer - The buffer we previously disowned\n   * @param Size - The size of the buffer\n   * @param CurrentClientFlag - The client tracked flag\n   *\n   * Once DisownBuffer has been called, it is unsafe to use the buffer until it has been reowned\n   * Always reown a buffer before use!\n   *\n   * @return The original buffer passed in on successful reown, otherwise std::nullopt\n   */\n  std::optional<ContainerType::iterator> TryToReownBuffer(const ContainerType::iterator& Buffer, size_t Size, BufferOwnedFlag* CurrentClientFlag) {\n    ClientFlags Expected = ClientFlags::FLAG_DISOWNED;\n    if (!CurrentClientFlag->compare_exchange_strong(Expected, ClientFlags::FLAG_OWNED)) {\n      return std::nullopt;\n    }\n\n    // If we managed to change the flag from DISOWNED to OWNED then we have successfully reclaimed\n    // Finish setting up state\n    (*Buffer)->LastUsed.store(ClockType::now(), std::memory_order_relaxed);\n    return Buffer;\n  }\n\n  /**\n   * @brief Try to reown a buffer that was previously disowned, failing that, claim a new buffer\n   *\n   * @param Buffer - The buffer we previously disowned\n   * @param Size - The size of the buffer\n   * @param CurrentClientFlag - The client tracked flag\n   *\n   * Once DisownBuffer has been called, it is unsafe to use the buffer until it has been reowned\n   * Always reown a buffer before use!\n   *\n   * @return The original buffer passed in on successful reown, otherwise a new buffer\n   */\n  ContainerType::iterator ReownOrClaimBuffer(const ContainerType::iterator& Buffer, size_t Size, BufferOwnedFlag* CurrentClientFlag) {\n    auto Reowned = TryToReownBuffer(Buffer, Size, CurrentClientFlag);\n    if (Reowned) {\n      return Reowned.value();\n    }\n\n    // Couldn't reclaim, just get a new buffer\n    return ClaimBuffer(Size, CurrentClientFlag);\n  }\n\n  virtual ~IntrusivePooledAllocator() = default;\n\n  // XXX: Is this a good amount?\n  /**\n   * @brief Duration before the allocator will reclaim buffers that the client claimed AND disowned\n   *\n   * Pool allocator will not attempt to reclaim client owned buffers, would be unsafe to do so.\n   */\n  constexpr static std::chrono::duration DURATION {std::chrono::seconds(5)};\n\nprotected:\n  IntrusivePooledAllocator() = default;\n\n  ContainerType::iterator ClaimBufferImpl(size_t Size) {\n    auto BuffersEnd = UnclaimedBuffers.end();\n    ContainerType::iterator BestFit = BuffersEnd;\n    ContainerType::iterator UnsizedFit = BuffersEnd;\n\n    auto Now = ClockType::now();\n    // Move any expired ClaimedBuffers to UnclaimedBuffers\n    {\n      // Spin the non-owned buffers and see if we can take ones past the period\n      for (auto it = ClaimedBuffers.begin(); it != ClaimedBuffers.end();) {\n        // 1) Can't take anything that the client has still claimed\n        // 2) Needs to still be last used beyond our time threshold\n        // 3) Only take the oldest buffer\n        if ((*it)->CurrentClientOwnedFlag->load() == ClientFlags::FLAG_DISOWNED) {\n          auto UsedTime = (*it)->LastUsed.load(std::memory_order_relaxed);\n          if ((Now - UsedTime) >= DURATION) {\n            ClientFlags Expected = ClientFlags::FLAG_DISOWNED;\n            if ((*it)->CurrentClientOwnedFlag->compare_exchange_strong(Expected, ClientFlags::FLAG_FREE)) {\n              // We managed to take away ownership\n              // Put it back in the regular pool and come back to it\n              (*it)->CurrentClientOwnedFlag = nullptr;\n              UnclaimedBuffers.emplace_back(*it);\n              it = ClaimedBuffers.erase(it);\n              continue;\n            }\n          }\n        }\n\n        ++it;\n      }\n    }\n\n    // Find an unclaimed buffer that is >= Size and Free up to one unclaimed buffer that has expired\n    {\n      // Walk all the allocations and find a buffer that fits\n      for (auto it = UnclaimedBuffers.begin(); it != BuffersEnd; ++it) {\n        if ((*it)->Size == Size) {\n          BestFit = it;\n          break;\n        }\n\n        if ((*it)->Size > Size) {\n          UnsizedFit = it;\n        }\n      }\n\n      // If we didn't have an exact fit then use an unsized fit\n      if (BestFit == BuffersEnd) {\n        BestFit = UnsizedFit;\n      }\n\n      // Free up to one unclaimed buffer that has expired\n      {\n        std::chrono::time_point<ClockType> LRUTime {};\n        ContainerType::iterator LastUsed = BuffersEnd;\n\n        // Walk all the allocations and find a buffer to erase\n        for (auto it = UnclaimedBuffers.begin(); it != UnclaimedBuffers.end(); ++it) {\n          // Ensure that the LRU value is past our duration threshold and isn't the one we are claiming\n          // Also only select a single memory region\n          if (it != BestFit) {\n            auto UsedTime = (*it)->LastUsed.load(std::memory_order_relaxed);\n            if ((Now - UsedTime) >= DURATION && UsedTime > LRUTime) {\n              LastUsed = it;\n              LRUTime = UsedTime;\n            }\n          }\n        }\n\n        // If we found a buffer then free it\n        if (LastUsed != BuffersEnd) {\n          Free((*LastUsed)->Ptr, (*LastUsed)->Size);\n          delete *LastUsed;\n          UnclaimedBuffers.erase(LastUsed);\n        }\n      }\n\n      if (BestFit != UnclaimedBuffers.end()) {\n        MemoryBuffer* Buffer = *BestFit;\n        UnclaimedBuffers.erase(BestFit);\n        return ClaimedBuffers.emplace(ClaimedBuffers.end(), Buffer);\n      }\n    }\n\n    // Need to allocate a new buffer, couldn't fit\n    auto Data = Alloc(Size);\n    return ClaimedBuffers.emplace(ClaimedBuffers.end(), new MemoryBuffer {Data, Size, ClockType::now()});\n  }\n\n  void UnclaimBufferImpl(ContainerType::iterator Buffer) {\n    (*Buffer)->CurrentClientOwnedFlag = nullptr;\n    UnclaimedBuffers.emplace_back(*Buffer);\n    ClaimedBuffers.erase(Buffer);\n  }\n\n  void FreeAllBuffers() {\n    for (auto it : UnclaimedBuffers) {\n      Free(it->Ptr, it->Size);\n      delete it;\n    }\n\n    for (auto it : ClaimedBuffers) {\n      Free(it->Ptr, it->Size);\n      delete it;\n    }\n\n    UnclaimedBuffers.clear();\n    ClaimedBuffers.clear();\n  }\n\n  /**\n   * @brief List of buffers that this pool allocator itself owns\n   */\n  ContainerType UnclaimedBuffers;\n\n  /**\n   * @brief List of buffers that are client claimed\n   */\n  ContainerType ClaimedBuffers;\n\n  /**\n   * @brief Mutex to ensure thread safety while shuffling buffers around and allocating\n   */\n  std::mutex AllocationMutex;\n\nprivate:\n  /**\n   * @brief Allocates the buffer\n   *\n   * @param Size of the object to allocate\n   *\n   * @return pointer\n   */\n  virtual void* Alloc(size_t Size) = 0;\n  /**\n   * @brief Frees the buffer\n   *\n   * @param Ptr buffer pointer\n   * @param Size buffer size\n   */\n  virtual void Free(void* Ptr, size_t Size) = 0;\n};\n\n/**\n * @brief Thread pool allocator that allocates and frees objects using malloc\n */\nclass PooledAllocatorMalloc final : public IntrusivePooledAllocator {\npublic:\n  PooledAllocatorMalloc() = default;\n\n  virtual ~PooledAllocatorMalloc() {\n    FreeAllBuffers();\n  }\n\nprivate:\n  void* Alloc(size_t Size) override {\n    return FEXCore::Allocator::malloc(Size);\n  }\n\n  void Free(void* Ptr, size_t Size) override {\n    FEXCore::Allocator::free(Ptr);\n  }\n};\n\n/**\n * @brief Thread pool allocator that allocates and frees objects that uses mmap\n */\nclass PooledAllocatorVirtual final : public IntrusivePooledAllocator {\npublic:\n  PooledAllocatorVirtual() = default;\n  PooledAllocatorVirtual(const char* Name)\n    : Name {Name} {}\n\n  virtual ~PooledAllocatorVirtual() {\n    FreeAllBuffers();\n  }\n\nprivate:\n  void* Alloc(size_t Size) override {\n    auto Result = FEXCore::Allocator::VirtualAlloc(Size);\n    if (Name) {\n      FEXCore::Allocator::VirtualName(Name, Result, Size);\n    }\n    return Result;\n  }\n\n  void Free(void* Ptr, size_t Size) override {\n    FEXCore::Allocator::VirtualFree(Ptr, Size);\n  }\n\n  const char* Name {};\n};\n\n/**\n * @brief Thread pool allocator that allocates and frees objects that uses mmap, with a guard page.\n *\n * The last page of the size provided has the guard.\n */\nclass PooledAllocatorVirtualWithGuard final : public IntrusivePooledAllocator {\npublic:\n  PooledAllocatorVirtualWithGuard() = default;\n  PooledAllocatorVirtualWithGuard(const char* Name)\n    : Name {Name} {}\n\n  virtual ~PooledAllocatorVirtualWithGuard() {\n    FreeAllBuffers();\n  }\n\nprivate:\n  void* Alloc(size_t Size) override {\n    auto Ptr = FEXCore::Allocator::VirtualAlloc(Size);\n    uintptr_t LastPageAddr = AlignDown(reinterpret_cast<uintptr_t>(Ptr) + Size - 1, FEXCore::Utils::FEX_PAGE_SIZE);\n    if (!FEXCore::Allocator::VirtualProtect(reinterpret_cast<void*>(LastPageAddr), FEXCore::Utils::FEX_PAGE_SIZE,\n                                            FEXCore::Allocator::ProtectOptions::None)) {\n      LogMan::Msg::EFmt(\"Failed to mprotect last page of code buffer.\");\n    }\n    if (Name) {\n      FEXCore::Allocator::VirtualName(Name, Ptr, Size);\n    }\n    return Ptr;\n  }\n\n  void Free(void* Ptr, size_t Size) override {\n    FEXCore::Allocator::VirtualFree(Ptr, Size);\n  }\n\n  const char* Name {};\n};\n\n/**\n * @brief Wrapper around the pool allocator for delayed pool reclaiming\n *\n * This is expected to be used in high frequency buffer temporary usage.\n * Instead of quickly unclaiming and reclaiming the buffer while the the code is hot,\n * This instead will do the cheap operation of disowning the buffer until the code path cools down enough.\n * Once the code path stops disowning the codepath more times than `PeriodFrequency` during `PeriodMS` then\n * it will immediately unclaim.\n *\n * Implications:\n *   - The object will always be claimed for at *least* `PeriodFrequency`\n *   - The object will still *always* be disowned after each temporary use\n *     - This allows the pool allocator to reclaim a buffer from a sleeping thread\n *\n * Performance characteristics:\n *  - Disowning is cheap.\n *    - Last-used timestamp update\n *    - atomic_bool clear to signify it is disowned\n *\n *  - Reowning is relatively cheap (When buffer is still owned).\n *    - atomic_bool load to check if the object is still owned\n *      - atomic<uint32_t> CAS to change the object to `OWNED` state\n *        - Resolves a race condition where the `Allocator` can be in the process of reclaiming the buffer from the client\n *      - Last-used timestamp update\n *      - atomic_bool<relaxed> set to signify owned\n *      - atomic<uint32_t> set to change object to `OWNED` state\n *    - When object isn't owned, then allocate a new buffer from the pool\n *\n *  - Unclaiming is fairly costly\n *    - Requires owning a mutex, shared between all threads using the `Allocator`\n *    - Updating two fextl::list containers to give the ownership back to the `Allocator`\n *\n *  - Claiming is very costly\n *    - Requires owning a mutex, shared between all threads using the `Allocator`\n *    - Scans two fextl::list containers to find the best fit buffer\n *    - Or allocates another buffer when that fails\n *    - Frees stale buffers opportunistically\n */\ntemplate<typename Type, size_t PeriodMS, size_t PeriodFrequency>\nclass PoolBufferWithTimedRetirement final {\n  // If the delayed object reclaimer is more than the thread pool allocator's duration then the pool allocator would always need to reclaim\n  // the buffer rather than giving it back.\n  static_assert(std::chrono::duration(std::chrono::milliseconds(PeriodMS)) <= IntrusivePooledAllocator::DURATION, \"DeplayedObjectReclaimer \"\n                                                                                                                  \"period needs to be \"\n                                                                                                                  \"lower or equal to the \"\n                                                                                                                  \"pool allocator \"\n                                                                                                                  \"duration\");\n\npublic:\n  PoolBufferWithTimedRetirement(IntrusivePooledAllocator& Allocator, size_t Size)\n    : ThreadAllocator {Allocator}\n    , Size {Size} {}\n\n  ~PoolBufferWithTimedRetirement() {\n    UnclaimBuffer();\n  }\n\n  struct AllocationInfo {\n    Type Ptr;\n    size_t Size;\n  };\n\n  /**\n   * @brief Return the owned buffer or allocate another one from the `Allocator`\n   *\n   * The buffer is guaranteed to have at least `Size` bytes of data.\n   * The initial data in the buffer is undefined, even when the buffer is just reowned.\n   *\n   * @param NewSize Optional new size for managed data\n   *\n   * @return A usable pointer of type `Type` and the size of the backing store.\n   */\n  AllocationInfo ReownOrClaimBufferWithSize(std::optional<size_t> NewSize = std::nullopt) {\n    // Check if we can cheaply re-own a previous buffer\n    std::optional Buffer =\n      IntrusivePooledAllocator::IsClientBufferOwned(ClientOwnedFlag) ? Info : ThreadAllocator.TryToReownBuffer(Info, Size, &ClientOwnedFlag);\n\n    // Ensure the now owned buffer has enough space. If not, unclaim it and proceed to claim a new one\n    if (NewSize && Buffer && (**Buffer)->Size < NewSize.value()) {\n      UnclaimBuffer();\n      Buffer.reset();\n    }\n\n    // Claim a new buffer if needed\n    Size = NewSize.value_or(Size);\n    if (!Buffer) {\n      Buffer = ThreadAllocator.ClaimBuffer(Size, &ClientOwnedFlag);\n    }\n\n    Info = *Buffer;\n\n    // Putting a memset here is very handy for using thread sanitizer to find buffer usage races\n    // Leaving this here for future excavation that will definitely occur here\n    // memset((*Info)->Ptr, 0, Size);\n\n    return {\n      .Ptr = reinterpret_cast<Type>((*Info)->Ptr),\n      .Size = (*Info)->Size,\n    };\n  }\n\n  Type ReownOrClaimBuffer(std::optional<size_t> NewSize = std::nullopt) {\n    return ReownOrClaimBufferWithSize(NewSize).Ptr;\n  }\n\n  /**\n   * @brief Disown or unclaim the buffer, letting the `Allocator` know it can reclaim the buffer\n   *\n   * Once the `ReownOrClaimBuffer` function has been used, this must be called to let the `Allocator` know it is safe to reclaim a buffer.\n   *\n   * This will first Disown the buffer; which is cheap.\n   *\n   * If the frequency of use is below the threshold then immediately `UnclaimBuffer` so that `Allocator` can reuse it.\n   */\n  void DelayedDisownBuffer() {\n    LOGMAN_THROW_A_FMT(FEXCore::Utils::IntrusivePooledAllocator::IsClientBufferOwned(ClientOwnedFlag), \"Tried to disown buffer when client \"\n                                                                                                       \"doesn't own it\");\n\n    // Always disown but not always unclaim\n    // Disowning = cheap, unclaiming = expensive\n    ThreadAllocator.DisownBuffer(Info);\n\n    auto Now = std::chrono::steady_clock::now();\n    if ((Now - Previous) >= std::chrono::duration(std::chrono::milliseconds(PeriodMS))) {\n      if (CountPer < PeriodFrequency) {\n        // Only unclaim the buffer if our buffer usage isn't excessive in the last period\n        UnclaimBuffer();\n      }\n      CountPer = 0;\n      Previous = Now;\n    }\n    ++CountPer;\n  }\n\n  /**\n   * @brief Completely unclaim the buffer\n   *\n   * Useful if it is known that the buffer won't be used again for a period and can be given back\n   * to the `Allocator` immediately.\n   *\n   * Necessary if an object is going to be freed from memory, so the `Allocator` can't update the `ClientOwnedFlag`\n   *\n   * Only use in that edge case! Otherwise use `DelayedDisownBuffer`\n   */\n  void UnclaimBuffer() {\n    ThreadAllocator.UnclaimBuffer(Info, &ClientOwnedFlag);\n  }\n\nprivate:\n  // Thread allocator\n  FEXCore::Utils::IntrusivePooledAllocator& ThreadAllocator;\n\n  // Buffer size\n  size_t Size;\n\n  // Buffer ownership tracking\n  FEXCore::Utils::IntrusivePooledAllocator::ContainerType::iterator Info {};\n  FEXCore::Utils::IntrusivePooledAllocator::BufferOwnedFlag ClientOwnedFlag {FEXCore::Utils::IntrusivePooledAllocator::ClientFlags::FLAG_FREE};\n\n  // Threshold counting\n  uint64_t CountPer {};\n  std::chrono::steady_clock::time_point Previous;\n};\n} // namespace FEXCore::Utils\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/Threads.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/fextl/memory.h>\n\nnamespace FEXCore::Threads {\nusing ThreadFunc = void* (*)(void* user_ptr);\n\nclass Thread;\nusing CreateThreadFunc = fextl::unique_ptr<Thread> (*)(ThreadFunc Func, void* Arg);\nusing CleanupAfterForkFunc = void (*)();\n\nstruct Pointers {\n  CreateThreadFunc CreateThread;\n  CleanupAfterForkFunc CleanupAfterFork;\n};\n\n// API\nclass Thread {\npublic:\n  virtual ~Thread() = default;\n  virtual bool joinable() = 0;\n  virtual bool join(void** ret) = 0;\n  virtual bool detach() = 0;\n  virtual bool IsSelf() = 0;\n\n  /**\n   * @name Calls provided API functions\n   * @{ */\n\n  static fextl::unique_ptr<Thread> Create(ThreadFunc Func, void* Arg);\n\n  static void CleanupAfterFork();\n\n  /**  @} */\n\n  // Set API functions\n  static void SetInternalPointers(const Pointers& _Ptrs);\n};\n} // namespace FEXCore::Threads\n"
  },
  {
    "path": "FEXCore/include/FEXCore/Utils/TypeDefines.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <cstddef>\n\nnamespace FEXCore::Utils {\n// FEX assumes an operating page size of 4096\n// To work around build systems that build on a 16k/64k page size, define our page size here\n// Don't use the system provided PAGE_SIZE define because of this.\nconstexpr size_t FEX_PAGE_SIZE = 4096;\nconstexpr size_t FEX_PAGE_SHIFT = 12;\nconstexpr size_t FEX_PAGE_MASK = ~(FEX_PAGE_SIZE - 1);\n} // namespace FEXCore::Utils\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/allocator.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/Utils/AllocatorHooks.h>\n\n#include <memory>\n\nnamespace fextl {\n/**\n * @brief C++ allocator class interface in to FEXCore::Allocator for memory allocations.\n */\ntemplate<typename T>\nclass FEXAlloc : public std::allocator<T> {\npublic:\n  using value_type = T;\n  using propagate_on_container_move_assignment = std::true_type;\n\n  FEXAlloc() noexcept {}\n  template<class U>\n  FEXAlloc(const FEXAlloc<U>&) noexcept {}\n\n  inline value_type* allocate(std::size_t n) {\n    return reinterpret_cast<value_type*>(::FEXCore::Allocator::aligned_alloc(alignof(value_type), n * sizeof(value_type)));\n  }\n\n  inline void deallocate(value_type* p, size_t) noexcept {\n    ::FEXCore::Allocator::aligned_free(p);\n  }\n\n  inline bool operator==(const FEXAlloc&) const {\n    return true;\n  }\n};\n} // namespace fextl\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/deque.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n\n#include <deque>\n\nnamespace fextl {\ntemplate<class T, class Allocator = fextl::FEXAlloc<T>>\nusing deque = std::deque<T, Allocator>;\n}\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/fmt.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/Utils/File.h>\n\n#include <fmt/format.h>\n#include <fmt/ranges.h>\n#include <unistd.h>\n\nnamespace fextl::fmt {\ntemplate<typename T, size_t SIZE = ::fmt::inline_buffer_size, typename Allocator = fextl::FEXAlloc<T>>\nusing basic_memory_buffer = ::fmt::basic_memory_buffer<T, SIZE, Allocator>;\nusing memory_buffer = fextl::fmt::basic_memory_buffer<char>;\n\ntemplate<class OutputIt, class... Args>\nOutputIt format_to(OutputIt out, ::fmt::format_string<Args...> fmt, Args&&... args) {\n  return ::fmt::vformat_to(out, fmt.str, ::fmt::make_format_args(args...));\n}\n\ntemplate<typename Char, size_t SIZE>\nFMT_NODISCARD auto to_string(const fextl::fmt::basic_memory_buffer<Char, SIZE>& buf) -> fextl::basic_string<Char> {\n  auto size = buf.size();\n  ::fmt::detail::assume(size < std::basic_string<Char>().max_size());\n  return fextl::basic_string<Char>(buf.data(), size);\n}\n\nFMT_INLINE fextl::string vformat(::fmt::string_view fmt, ::fmt::format_args args) {\n  // Don't optimize the \"{}\" case to keep the binary size small and because it\n  // can be better optimized in fmt::format anyway.\n  auto buffer = memory_buffer();\n  ::fmt::detail::vformat_to(buffer, fmt, args);\n  return fextl::fmt::to_string(buffer);\n}\n\ntemplate<typename... T>\nFMT_NODISCARD FMT_INLINE auto format(::fmt::format_string<T...> fmt, T&&... args) -> fextl::string {\n  return fextl::fmt::vformat(fmt, ::fmt::make_format_args(args...));\n}\n\n#ifndef _WIN32\ntemplate<typename... T>\nFMT_INLINE auto print(::fmt::format_string<T...> fmt, T&&... args) -> void {\n  auto String = fextl::fmt::vformat(fmt, ::fmt::make_format_args(args...));\n  write(STDOUT_FILENO, String.c_str(), String.size());\n}\n\ntemplate<typename... T>\nFMT_INLINE auto print(int FD, ::fmt::format_string<T...> fmt, T&&... args) -> void {\n  auto String = fextl::fmt::vformat(fmt, ::fmt::make_format_args(args...));\n  write(FD, String.c_str(), String.size());\n}\n#else\ntemplate<typename... T>\nFMT_INLINE auto print(::fmt::format_string<T...> fmt, T&&... args) -> void {\n  auto String = fextl::fmt::vformat(fmt, ::fmt::make_format_args(args...));\n  auto f = FEXCore::File::File::GetStdOUT();\n  f.Write(String.c_str(), String.size());\n}\n\ntemplate<typename... T>\nFMT_INLINE auto print(HANDLE File, ::fmt::format_string<T...> fmt, T&&... args) -> void {\n  auto String = fextl::fmt::vformat(fmt, ::fmt::make_format_args(args...));\n  WriteFile(File, String.c_str(), String.size(), nullptr, nullptr);\n}\n#endif\ntemplate<typename... T>\nFMT_INLINE auto print(FEXCore::File::File& f, ::fmt::format_string<T...> fmt, T&&... args) -> void {\n  auto String = fextl::fmt::vformat(fmt, ::fmt::make_format_args(args...));\n  f.Write(String.c_str(), String.size());\n}\n\ntemplate<typename... T>\nFMT_INLINE auto print(std::FILE* f, ::fmt::format_string<T...> fmt, T&&... args) -> void {\n  auto String = fextl::fmt::vformat(fmt, ::fmt::make_format_args(args...));\n  write(fileno(f), String.c_str(), String.size());\n}\n} // namespace fextl::fmt\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/forward_list.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n\n#include <forward_list>\n\nnamespace fextl {\ntemplate<class T, class Allocator = fextl::FEXAlloc<T>>\nusing forward_list = std::forward_list<T, Allocator>;\n}\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/functional.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/AllocatorHooks.h>\n\n#include <functional>\n#include <type_traits>\n#include <utility>\n\nnamespace fextl {\n\n/**\n * Equivalent to std::move_only_function but uses FEXCore::Allocator routines\n * for non-function pointers.\n */\ntemplate<typename F, void* (*Alloc)(size_t, size_t) = ::FEXCore::Allocator::aligned_alloc, void (*Dealloc)(void*) = ::FEXCore::Allocator::aligned_free>\nclass move_only_function;\n\ntemplate<typename R, typename... Args, void* (*Alloc)(size_t, size_t), void (*Dealloc)(void*)>\nclass move_only_function<R(Args...), Alloc, Dealloc> {\npublic:\n  template<typename F>\n  requires std::is_invocable_r_v<R, F, Args...>\n  move_only_function(F&& f) noexcept(std::is_nothrow_move_constructible_v<F>) {\n    if constexpr (std::is_convertible_v<F, R (*)(Args...)>) {\n      // Argument is a function pointer, a captureless lambda, or a stateless function object.\n      // std::function can store these without allocation\n      internal = std::move(f);\n    } else if constexpr (std::is_nothrow_constructible_v<std::function<R(Args...)>, F>) {\n      // If construction is guaranteed not to throw an exception, this implies\n      // the std::function implementation won't allocate memory!\n      internal = std::move(f);\n    } else {\n      // Other arguments require allocation, which is a problem since\n      // std::function doesn't allow allocator customization. Implementations\n      // are generally able to avoid allocation for lambdas with a single\n      // pointer capture however. We can exploit this special case by wrapping\n      // the actual argument in a lambda that points an external storage\n      // location.\n\n      static_assert(!std::is_pointer_v<F>, \"Pointer types must manually be dereferenced\");\n\n      // First, relocate argument to a location returned from FEX's allocators\n      using Fnoref = std::remove_reference_t<F>;\n      storage = Alloc(alignof(Fnoref), sizeof(Fnoref));\n      auto moved_lambda = new (storage) Fnoref {std::move(f)};\n\n      // Second, wrap the relocated argument in a single-capture lambda\n      auto wrapped_lambda = [moved_lambda](Args... args) {\n        return (*moved_lambda)(std::forward<Args>(args)...);\n      };\n\n      // Third, assign the result to std::function, ensuring it's indeed\n      // allocation-free by checking for nothrow-constructibility\n      static_assert(noexcept(internal = std::move(wrapped_lambda)), \"This implementation of std::function \"\n                                                                    \"does not support implementing \"\n                                                                    \"fextl::move_only_function\");\n      internal = std::move(wrapped_lambda);\n\n      // Finally, if a destructor must be called, generate a pointer to its destructor\n      if constexpr (!std::is_trivially_destructible_v<Fnoref>) {\n        internal_destructor = [](move_only_function* self) {\n          reinterpret_cast<Fnoref*>(self->storage)->~Fnoref();\n        };\n      }\n    }\n  }\n\n  move_only_function() noexcept {}\n  move_only_function(std::nullptr_t) noexcept {}\n  move_only_function(const move_only_function&) = delete;\n  move_only_function(move_only_function&& other) noexcept {\n    *this = std::move(other);\n  }\n\n  move_only_function& operator=(move_only_function&& other) noexcept {\n    if (!other && internal_destructor) {\n      this->~move_only_function();\n    }\n    internal = std::exchange(other.internal, nullptr);\n    internal_destructor = std::exchange(other.internal_destructor, nullptr);\n    storage = std::exchange(other.storage, nullptr);\n    return *this;\n  }\n\n  ~move_only_function() {\n    if (internal_destructor) {\n      internal_destructor(this);\n    }\n    Dealloc(storage);\n  }\n\n  R operator()(Args... args) const {\n    return internal(std::forward<Args>(args)...);\n  }\n\n  explicit operator bool() const noexcept {\n    return (bool)internal;\n  }\n\nprivate:\n  std::function<R(Args...)> internal;\n  void (*internal_destructor)(move_only_function*) = nullptr;\n  void* storage = nullptr;\n};\n} // namespace fextl\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/list.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n\n#include <list>\n\nnamespace fextl {\ntemplate<class T, class Allocator = fextl::FEXAlloc<T>>\nusing list = std::list<T, Allocator>;\n}\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/map.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n\n#include <map>\n\nnamespace fextl {\ntemplate<class Key, class T, class Compare = std::less<Key>, class Allocator = fextl::FEXAlloc<std::pair<const Key, T>>>\nusing map = std::map<Key, T, Compare, Allocator>;\n\ntemplate<class Key, class T, class Compare = std::less<Key>, class Allocator = fextl::FEXAlloc<std::pair<const Key, T>>>\nusing multimap = std::multimap<Key, T, Compare, Allocator>;\n} // namespace fextl\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/memory.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n\n#include <memory>\n#include <new>\n\nnamespace fextl {\ntemplate<class T>\nstruct default_delete : public std::default_delete<T> {\n  void operator()(T* ptr) const {\n    if (ptr) {\n      std::destroy_at(ptr);\n      FEXCore::Allocator::aligned_free(ptr);\n    }\n  }\n\n  template<typename U>\n  requires (std::is_base_of_v<U, T>)\n  operator fextl::default_delete<U>() {\n    return fextl::default_delete<U>();\n  }\n};\n\ntemplate<class T, class Deleter = fextl::default_delete<T>>\nusing unique_ptr = std::unique_ptr<T, Deleter>;\n\ntemplate<class T>\nusing shared_ptr = std::shared_ptr<T>;\n\ntemplate<class T, class... Args>\nrequires (!std::is_array_v<T>)\nfextl::unique_ptr<T> make_unique(Args&&... args) {\n  auto ptr = FEXCore::Allocator::aligned_alloc(alignof(T), sizeof(T));\n  auto Result = ::new (ptr) T(std::forward<Args>(args)...);\n  return fextl::unique_ptr<T>(Result);\n}\n\ntemplate<class T, class... Args>\nrequires (!std::is_array_v<T>)\nfextl::shared_ptr<T> make_shared(Args&&... args) {\n  return std::allocate_shared<T>(fextl::FEXAlloc<T> {}, std::forward<Args>(args)...);\n}\n} // namespace fextl\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/memory_resource.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXCore/fextl/allocator.h>\n#include <FEXCore/fextl/list.h>\n\n#include <memory_resource>\n#include <fmt/format.h>\n\nnamespace fextl {\nnamespace pmr {\n  class default_resource : public std::pmr::memory_resource {\n  private:\n    void* do_allocate(std::size_t bytes, std::size_t alignment) override {\n      return FEXCore::Allocator::memalign(alignment, bytes);\n    }\n\n    void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) override {\n      return FEXCore::Allocator::aligned_free(p);\n    }\n\n    bool do_is_equal(const std::pmr::memory_resource& other) const noexcept override {\n      return this == &other;\n    }\n  };\n\n  FEX_DEFAULT_VISIBILITY std::pmr::memory_resource* get_default_resource();\n\n  /**\n   * @brief A `std::pmr::monotonic_buffer_resource` compatible class.\n   *\n   * Allocates internal buffers on page boundaries and names them for buffer tracking.\n   */\n  class named_monotonic_page_buffer_resource final : public std::pmr::memory_resource {\n  public:\n    explicit named_monotonic_page_buffer_resource(const char* Name)\n      : Name {Name} {}\n\n    void release() noexcept {\n      for (auto& Iter : Buffers) {\n        FEXCore::Allocator::VirtualFree(Iter.Buffer, Iter.BufferSize);\n      }\n      Buffers.clear();\n\n      CurrentBufferRemaining = 0;\n      CurrentAllocationSize = FEXCore::Utils::FEX_PAGE_SIZE;\n    }\n\n  protected:\n    void* do_allocate(std::size_t bytes, std::size_t alignment) override {\n      LOGMAN_THROW_A_FMT(bytes != 0, \"Nope\");\n      LOGMAN_THROW_A_FMT(alignment <= FEXCore::Utils::FEX_PAGE_SIZE, \"Nope\");\n\n      // Wow, an actual use case of std::align in the wild.\n      void* NewPointer = std::align(alignment, bytes, CurrentBuffer, CurrentBufferRemaining);\n      if (!NewPointer) [[unlikely]] {\n        AllocateNewBuffer(bytes, alignment);\n        NewPointer = CurrentBuffer;\n      }\n\n      CurrentBuffer = static_cast<char*>(CurrentBuffer) + bytes;\n      CurrentBufferRemaining -= bytes;\n\n      return NewPointer;\n    }\n\n    void do_deallocate(void*, std::size_t, std::size_t) override {\n      // Explicit no-op.\n    }\n\n    bool do_is_equal(const std::pmr::memory_resource& other) const noexcept override {\n      return this == &other;\n    }\n\n  private:\n    const char* Name;\n\n    // Allocate a new buffer that can at least fit the passed in bytes with alignment.\n    void AllocateNewBuffer(std::size_t bytes, std::size_t) {\n      bytes = FEXCore::AlignUp(bytes, CurrentAllocationSize);\n      void* Ptr = FEXCore::Allocator::VirtualAlloc(bytes);\n      if (Name) {\n        FEXCore::Allocator::VirtualName(Name, Ptr, bytes);\n      }\n\n      Buffers.emplace_back(BufferData {\n        .Buffer = Ptr,\n        .BufferSize = bytes,\n      });\n\n      CurrentBuffer = Ptr;\n      CurrentBufferRemaining = bytes;\n\n      // Multiply the allocation size by 1.5 for the next allocation\n      // Avoid double math because of ugly conversions.\n      CurrentAllocationSize = FEXCore::AlignUp(CurrentAllocationSize + (CurrentAllocationSize >> 1), FEXCore::Utils::FEX_PAGE_SIZE);\n    }\n\n    // Current buffer management.\n    void* CurrentBuffer {};\n    size_t CurrentBufferRemaining {};\n\n    struct BufferData final {\n      void* Buffer;\n      size_t BufferSize;\n    };\n\n    fextl::list<BufferData> Buffers {};\n\n    size_t CurrentAllocationSize = FEXCore::Utils::FEX_PAGE_SIZE;\n  };\n\n  /**\n   * @brief This is similar to the std::pmr::monotonic_buffer_resource.\n   *\n   * The difference is that class doesn't have ownership of the backing memory and\n   * it also doesn't have any growth factor.\n   *\n   * If the amount of memory allocated is overrun then this will overwrite memory unless assertions are enabled.\n   *\n   * Ensure that you know how much memory you're going to use before using this class.\n   */\n  class fixed_size_monotonic_buffer_resource final : public std::pmr::memory_resource {\n  public:\n    fixed_size_monotonic_buffer_resource(void* Base, [[maybe_unused]] size_t Size)\n      : Ptr {reinterpret_cast<uint64_t>(Base)}\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n      , PtrEnd {reinterpret_cast<uint64_t>(Base) + Size}\n      , Size {Size}\n#endif\n    {\n    }\n    void* do_allocate(std::size_t bytes, std::size_t alignment) override {\n      uint64_t NewPtr = FEXCore::AlignUp((uint64_t)Ptr, alignment);\n      Ptr = NewPtr + bytes;\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n      if (Ptr >= PtrEnd) {\n        LogMan::Msg::AFmt(\"Fail: Only allocated: {} ({} this time) bytes. Tried allocating at ptr offset: {}.\\n\", Size, bytes,\n                          (uint64_t)(Ptr - (PtrEnd - Size)));\n        FEX_TRAP_EXECUTION;\n      }\n#endif\n      return reinterpret_cast<void*>(NewPtr);\n    }\n\n    void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) override {\n      // noop\n    }\n\n    bool do_is_equal(const std::pmr::memory_resource& other) const noexcept override {\n      return this == &other;\n    }\n  private:\n    uint64_t Ptr;\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    uint64_t PtrEnd;\n    size_t Size;\n#endif\n  };\n} // namespace pmr\n} // namespace fextl\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/queue.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n#include <FEXCore/fextl/deque.h>\n\n#include <queue>\n\nnamespace fextl {\ntemplate<class T, class Container = fextl::deque<T>>\nusing queue = std::queue<T, Container>;\n}\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/robin_map.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n\n#include <ankerl/unordered_dense.h>\n\nnamespace fextl {\ntemplate<class Key, class T, class Hash = std::hash<Key>, class KeyEqual = std::equal_to<Key>, class Allocator = fextl::FEXAlloc<std::pair<Key, T>>>\nusing robin_map = ankerl::unordered_dense::map<Key, T, Hash, KeyEqual, Allocator>;\n}\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/robin_set.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n\n#include <ankerl/unordered_dense.h>\n\nnamespace fextl {\ntemplate<class Key, class Hash = std::hash<Key>, class KeyEqual = std::equal_to<Key>, class Allocator = fextl::FEXAlloc<Key>>\nusing robin_set = ankerl::unordered_dense::set<Key, Hash, KeyEqual, Allocator>;\n}\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/set.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n\n#include <set>\n\nnamespace fextl {\ntemplate<class Key, class Compare = std::less<Key>, class Allocator = fextl::FEXAlloc<Key>>\nusing set = std::set<Key, Compare, Allocator>;\n\ntemplate<class Key, class Compare = std::less<Key>, class Allocator = fextl::FEXAlloc<Key>>\nusing multiset = std::multiset<Key, Compare, Allocator>;\n} // namespace fextl\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/sstream.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n\n#include <sstream>\n\nnamespace fextl {\ntemplate<class CharT, class Traits = std::char_traits<CharT>, class Allocator = fextl::FEXAlloc<CharT>>\nusing basic_stringbuf = std::basic_stringbuf<CharT, Traits, Allocator>;\n\ntemplate<class CharT, class Traits = std::char_traits<CharT>, class Allocator = fextl::FEXAlloc<CharT>>\nusing basic_istringstream = std::basic_istringstream<CharT, Traits, Allocator>;\n\ntemplate<class CharT, class Traits = std::char_traits<CharT>, class Allocator = fextl::FEXAlloc<CharT>>\nusing basic_ostringstream = std::basic_ostringstream<CharT, Traits, Allocator>;\n\ntemplate<class CharT, class Traits = std::char_traits<CharT>, class Allocator = fextl::FEXAlloc<CharT>>\nusing basic_stringstream = std::basic_stringstream<CharT, Traits, Allocator>;\n\nusing stringbuf = fextl::basic_stringbuf<char>;\nusing istringstream = fextl::basic_istringstream<char>;\nusing ostringstream = fextl::basic_ostringstream<char>;\nusing stringstream = fextl::basic_stringstream<char>;\n} // namespace fextl\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/stack.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n#include <FEXCore/fextl/deque.h>\n\n#include <stack>\n\nnamespace fextl {\ntemplate<class T, class Container = fextl::deque<T>>\nusing stack = std::stack<T, Container>;\n}\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/string.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n\n#include <functional>\n#include <string>\n\nnamespace fextl {\ntemplate<class CharT, class Traits = std::char_traits<CharT>, class Allocator = fextl::FEXAlloc<CharT>>\nusing basic_string = std::basic_string<CharT, Traits, Allocator>;\n\nusing string = fextl::basic_string<char>;\n} // namespace fextl\n\ntemplate<>\nstruct std::hash<fextl::string> {\n  std::size_t operator()(const fextl::string& s) const noexcept {\n    return std::hash<std::string_view> {}(s);\n  };\n};\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/unordered_map.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n\n#include <unordered_map>\n\nnamespace fextl {\ntemplate<class Key, class T, class Hash = std::hash<Key>, class KeyEqual = std::equal_to<Key>, class Allocator = fextl::FEXAlloc<std::pair<const Key, T>>>\nusing unordered_map = std::unordered_map<Key, T, Hash, KeyEqual, Allocator>;\n\ntemplate<class Key, class T, class Hash = std::hash<Key>, class KeyEqual = std::equal_to<Key>, class Allocator = fextl::FEXAlloc<std::pair<const Key, T>>>\nusing unordered_multimap = std::unordered_multimap<Key, T, Hash, KeyEqual, Allocator>;\n} // namespace fextl\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/unordered_set.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n\n#include <unordered_set>\n\nnamespace fextl {\ntemplate<class Key, class Hash = std::hash<Key>, class KeyEqual = std::equal_to<Key>, class Allocator = fextl::FEXAlloc<Key>>\nusing unordered_set = std::unordered_set<Key, Hash, KeyEqual, Allocator>;\n\ntemplate<class Key, class Hash = std::hash<Key>, class KeyEqual = std::equal_to<Key>, class Allocator = fextl::FEXAlloc<Key>>\nusing unordered_multiset = std::unordered_multiset<Key, Hash, KeyEqual, Allocator>;\n} // namespace fextl\n"
  },
  {
    "path": "FEXCore/include/FEXCore/fextl/vector.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/allocator.h>\n\n#include <vector>\n\nnamespace fextl {\ntemplate<class T, class Allocator = fextl::FEXAlloc<T>>\nusing vector = std::vector<T, Allocator>;\n}\n"
  },
  {
    "path": "FEXCore/include/git_version.h.in",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <array>\n#include <cstdint>\n\nstatic constexpr std::array<uint8_t, 20> GIT_HASH = {@GIT_HASH_ARRAY@};\n#define GIT_DESCRIBE_STRING \"@GIT_DESCRIBE_STRING@\"\n"
  },
  {
    "path": "FEXCore/unittests/APITests/Allocator.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <catch2/catch_test_macros.hpp>\n#include <catch2/generators/catch_generators_range.hpp>\n\n#include \"Utils/Allocator/HostAllocator.h\"\n#include <FEXCore/Utils/Allocator.h>\n#include <sys/mman.h>\n\ntemplate<typename T>\nbool HasSyscallError(T Result) {\n  constexpr uint64_t MAX_ERRNO = 0xFFFF'FFFF'FFFF'0001ULL;\n  return reinterpret_cast<uint64_t>(Result) >= MAX_ERRNO;\n}\n\nTEST_CASE(\"Allocator - Fixed replacement\") {\n  const auto RegionSize = 128 * 1024 * 1024;\n  fextl::vector<FEXCore::Allocator::MemoryRegion> MemoryRegions {};\n  for (size_t i = 0; i < 2; ++i) {\n    auto Ptr = mmap(nullptr, RegionSize, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n    MemoryRegions.emplace_back(FEXCore::Allocator::MemoryRegion {\n      .Ptr = Ptr,\n      .Size = RegionSize,\n    });\n  }\n\n  auto Allocator = Alloc::OSAllocator::Create64BitAllocatorWithRegions(MemoryRegions);\n  auto Base = Allocator->Mmap(nullptr, 4096, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n  REQUIRE(!HasSyscallError(Base));\n\n  // Allocate perfectly overlapping pages. Allocate as many pages as the region.\n  // FEX had a bug where the allocator could run out of memory with MAP_FIXED.\n  for (size_t i = 0; i < (RegionSize / 4096); ++i) {\n    auto NewBase = Allocator->Mmap(Base, 4096, PROT_NONE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n    REQUIRE(Base == NewBase);\n  }\n\n  Alloc::OSAllocator::ReleaseAllocatorWorkaround(std::move(Allocator));\n}\n\nTEST_CASE(\"Allocator - Non-Fit\") {\n  const auto RegionSize = 128 * 1024 * 1024;\n  fextl::vector<FEXCore::Allocator::MemoryRegion> MemoryRegions {};\n  for (size_t i = 0; i < 2; ++i) {\n    auto Ptr = mmap(nullptr, RegionSize, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n    MemoryRegions.emplace_back(FEXCore::Allocator::MemoryRegion {\n      .Ptr = Ptr,\n      .Size = RegionSize,\n    });\n  }\n\n  auto Allocator = Alloc::OSAllocator::Create64BitAllocatorWithRegions(MemoryRegions);\n  auto Base = Allocator->Mmap(nullptr, RegionSize / 4, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n  REQUIRE(!HasSyscallError(Base));\n\n  // Try to allocate within the whole VMA size minus a small amount.\n  // FEX had a bug where if the allocation fit within a VMA region, it would try and allocate past the end without checking.\n  // Only occurred when `MAP_FIXED` was used.\n  auto NewBase = Allocator->Mmap(Base, RegionSize - (4096 * 64), PROT_NONE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n  // Must either fit in the VMA region, or fail.\n  // - If it matches previous allocation, then it fit in the VMA region.\n  //   - This can happen if FEX's allocator gains support for VMA merging.\n  // - If it errors, then it doesn't fit in the VMA region.\n  REQUIRE((NewBase == Base || HasSyscallError(NewBase)));\n\n  Alloc::OSAllocator::ReleaseAllocatorWorkaround(std::move(Allocator));\n}\n"
  },
  {
    "path": "FEXCore/unittests/APITests/CMakeLists.txt",
    "content": "file(GLOB_RECURSE TESTS CONFIGURE_DEPENDS *.cpp)\n\nset(LIBS fmt::fmt vixl::vixl Catch2::Catch2WithMain FEXCore_Base JemallocLibs)\nforeach(TEST ${TESTS})\n  get_filename_component(TEST_NAME ${TEST} NAME_WLE)\n  add_executable(FEXCore_Tests_${TEST_NAME} ${TEST})\n  target_link_libraries(FEXCore_Tests_${TEST_NAME} PRIVATE ${LIBS})\n  target_include_directories(FEXCore_Tests_${TEST_NAME} PUBLIC \"${CMAKE_CURRENT_SOURCE_DIR}/../../Source/\")\n  set_target_properties(FEXCore_Tests_${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/FEXCore_Tests\")\n  catch_discover_tests(FEXCore_Tests_${TEST_NAME} TEST_SUFFIX \".${TEST_NAME}.FEXCore_Tests\")\nendforeach()\n\nadd_custom_target(fexcore_apitests\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}/\"\n  USES_TERMINAL\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"302\" ${TEST_JOB_FLAG} \"-R\" \"\\.*.FEXCore_Tests$$\")\n\n"
  },
  {
    "path": "FEXCore/unittests/APITests/FileLoading.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXCore/Utils/FileLoading.h>\n#include <catch2/catch_test_macros.hpp>\n\nTEST_CASE(\"LoadFile-Doesn'tExist\") {\n  fextl::string MapsFile;\n  auto Read = FEXCore::FileLoading::LoadFile(MapsFile, \"/tmp/a/b/c/d/e/z\");\n  REQUIRE(MapsFile.size() == 0);\n  REQUIRE(Read == false);\n}\n\nTEST_CASE(\"LoadFile-procfs\") {\n  fextl::string MapsFile;\n  FEXCore::FileLoading::LoadFile(MapsFile, \"/proc/self/maps\");\n  REQUIRE(MapsFile.size() != 0);\n}\n\nTEST_CASE(\"LoadFile-Buffer\") {\n  fextl::string MapsFile;\n  MapsFile.resize(16);\n  auto Read = FEXCore::FileLoading::LoadFileToBuffer(\"/proc/self/maps\", MapsFile);\n  REQUIRE(MapsFile.size() == Read);\n}\n"
  },
  {
    "path": "FEXCore/unittests/APITests/FlexBitSet.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <catch2/catch_test_macros.hpp>\n#include <catch2/generators/catch_generators_range.hpp>\n\n#include \"Utils/Allocator/FlexBitSet.h\"\n#include <sys/mman.h>\n\nTEST_CASE(\"FlexBitSet - Sizing\") {\n  // Ensure that FlexBitSet sizing is correct.\n\n  // Size of zero shouldn't take any space.\n  CHECK(FEXCore::FlexBitSet<uint8_t>::SizeInBytes(0) == 0);\n  CHECK(FEXCore::FlexBitSet<uint16_t>::SizeInBytes(0) == 0);\n  CHECK(FEXCore::FlexBitSet<uint32_t>::SizeInBytes(0) == 0);\n  CHECK(FEXCore::FlexBitSet<uint64_t>::SizeInBytes(0) == 0);\n\n  CHECK(FEXCore::FlexBitSet<uint8_t>::SizeInBits(0) == 0);\n  CHECK(FEXCore::FlexBitSet<uint16_t>::SizeInBits(0) == 0);\n  CHECK(FEXCore::FlexBitSet<uint32_t>::SizeInBits(0) == 0);\n  CHECK(FEXCore::FlexBitSet<uint64_t>::SizeInBits(0) == 0);\n\n  // Size of 1 should take one sizeof(ElementSize) size\n  CHECK(FEXCore::FlexBitSet<uint8_t>::SizeInBytes(1) == sizeof(uint8_t));\n  CHECK(FEXCore::FlexBitSet<uint16_t>::SizeInBytes(1) == sizeof(uint16_t));\n  CHECK(FEXCore::FlexBitSet<uint32_t>::SizeInBytes(1) == sizeof(uint32_t));\n  CHECK(FEXCore::FlexBitSet<uint64_t>::SizeInBytes(1) == sizeof(uint64_t));\n\n  CHECK(FEXCore::FlexBitSet<uint8_t>::SizeInBits(1) == sizeof(uint8_t) * 8);\n  CHECK(FEXCore::FlexBitSet<uint16_t>::SizeInBits(1) == sizeof(uint16_t) * 8);\n  CHECK(FEXCore::FlexBitSet<uint32_t>::SizeInBits(1) == sizeof(uint32_t) * 8);\n  CHECK(FEXCore::FlexBitSet<uint64_t>::SizeInBits(1) == sizeof(uint64_t) * 8);\n\n  // Size of `sizeof(ElementSize) * 8` should take one sizeof(ElementSize) size\n  CHECK(FEXCore::FlexBitSet<uint8_t>::SizeInBytes(sizeof(uint8_t) * 8) == sizeof(uint8_t));\n  CHECK(FEXCore::FlexBitSet<uint16_t>::SizeInBytes(sizeof(uint16_t) * 8) == sizeof(uint16_t));\n  CHECK(FEXCore::FlexBitSet<uint32_t>::SizeInBytes(sizeof(uint32_t) * 8) == sizeof(uint32_t));\n  CHECK(FEXCore::FlexBitSet<uint64_t>::SizeInBytes(sizeof(uint64_t) * 8) == sizeof(uint64_t));\n\n  CHECK(FEXCore::FlexBitSet<uint8_t>::SizeInBits(sizeof(uint8_t) * 8) == sizeof(uint8_t) * 8);\n  CHECK(FEXCore::FlexBitSet<uint16_t>::SizeInBits(sizeof(uint16_t) * 8) == sizeof(uint16_t) * 8);\n  CHECK(FEXCore::FlexBitSet<uint32_t>::SizeInBits(sizeof(uint32_t) * 8) == sizeof(uint32_t) * 8);\n  CHECK(FEXCore::FlexBitSet<uint64_t>::SizeInBits(sizeof(uint64_t) * 8) == sizeof(uint64_t) * 8);\n}\n\nTEST_CASE(\"FlexBitSet - Limit\") {\n  // Ensure that the FlexBitSet doesn't read past the limits, and returns correct indexes.\n  const auto Size = 4096 * 3;\n  auto Ptr = mmap(nullptr, Size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n  auto PtrMiddle = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(Ptr) + 4096);\n  REQUIRE(mprotect(PtrMiddle, 4096, PROT_READ | PROT_WRITE) != -1);\n\n  using ElementType = uint8_t;\n  const size_t NumElements = 4096 * 8;\n  auto FlexBit = reinterpret_cast<FEXCore::FlexBitSet<ElementType>*>(PtrMiddle);\n\n  for (size_t i = 0; i < NumElements; ++i) {\n    auto Result = FlexBit->ForwardScanForRange<true>(i, 1, NumElements);\n    CHECK(Result.FoundElement == i);\n  }\n\n  for (size_t i = 0; i < NumElements; ++i) {\n    auto Result = FlexBit->BackwardScanForRange<true>(i, 1, 0);\n    CHECK(Result.FoundElement == i);\n  }\n}\n"
  },
  {
    "path": "FEXCore/unittests/APITests/FutexSpinTest.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Utils/SpinWaitLock.h\"\n#include <catch2/catch_test_macros.hpp>\n#include <chrono>\n#include <thread>\n\nconstexpr auto SleepAmount = std::chrono::milliseconds(250);\n\nTEST_CASE(\"FutexSpin-Timed-8bit\") {\n  uint8_t Test {};\n\n  auto now = std::chrono::high_resolution_clock::now();\n  FEXCore::Utils::SpinWaitLock::Wait(&Test, 1, SleepAmount);\n  auto end = std::chrono::high_resolution_clock::now();\n  auto diff = end - now;\n\n  // The futex spinwait needs to have slept for at /least/ the amount specified. It will always run slightly late.\n  REQUIRE(std::chrono::duration_cast<std::chrono::nanoseconds>(diff) >= std::chrono::duration_cast<std::chrono::nanoseconds>(SleepAmount));\n}\n\nTEST_CASE(\"FutexSpin-Sleep-8bit\") {\n  constexpr auto SleepAmount = std::chrono::seconds(1);\n\n  uint8_t Test {};\n  std::atomic<uint8_t> ActualSpinLoop {};\n  std::chrono::nanoseconds SleptAmount;\n\n  std::thread t([&Test, &SleptAmount, &ActualSpinLoop]() {\n    auto now = std::chrono::high_resolution_clock::now();\n    ActualSpinLoop.store(1);\n    FEXCore::Utils::SpinWaitLock::Wait(&Test, 1);\n    auto end = std::chrono::high_resolution_clock::now();\n    SleptAmount = end - now;\n  });\n\n  // Wait until the second thread lets us know to stop waiting sleeping.\n  while (ActualSpinLoop.load() == 0)\n    ;\n\n  // sleep this thread for the sleep amount.\n  std::this_thread::sleep_for(SleepAmount);\n\n  // Set the futex\n  FEXCore::Utils::SpinWaitLock::lock(&Test);\n\n  // Wait for the thread to get done.\n  t.join();\n\n  // The futex spinwait needs to have slept for at /least/ the amount specified. It will always run slightly late.\n  REQUIRE(SleptAmount >= std::chrono::duration_cast<std::chrono::nanoseconds>(SleepAmount));\n}\n\nTEST_CASE(\"FutexSpin-Timed-16bit\") {\n  uint16_t Test {};\n\n  auto now = std::chrono::high_resolution_clock::now();\n  FEXCore::Utils::SpinWaitLock::Wait(&Test, 1, SleepAmount);\n  auto end = std::chrono::high_resolution_clock::now();\n  auto diff = end - now;\n\n  // The futex spinwait needs to have slept for at /least/ the amount specified. It will always run slightly late.\n  REQUIRE(std::chrono::duration_cast<std::chrono::nanoseconds>(diff) >= std::chrono::duration_cast<std::chrono::nanoseconds>(SleepAmount));\n}\n\nTEST_CASE(\"FutexSpin-Timed-32bit\") {\n  uint32_t Test {};\n\n  auto now = std::chrono::high_resolution_clock::now();\n  FEXCore::Utils::SpinWaitLock::Wait(&Test, 1, SleepAmount);\n  auto end = std::chrono::high_resolution_clock::now();\n  auto diff = end - now;\n\n  // The futex spinwait needs to have slept for at /least/ the amount specified. It will always run slightly late.\n  REQUIRE(std::chrono::duration_cast<std::chrono::nanoseconds>(diff) >= std::chrono::duration_cast<std::chrono::nanoseconds>(SleepAmount));\n}\n\nTEST_CASE(\"FutexSpin-Timed-64bit\") {\n  uint64_t Test {};\n\n  auto now = std::chrono::high_resolution_clock::now();\n  FEXCore::Utils::SpinWaitLock::Wait(&Test, 1, SleepAmount);\n  auto end = std::chrono::high_resolution_clock::now();\n  auto diff = end - now;\n\n  // The futex spinwait needs to have slept for at /least/ the amount specified. It will always run slightly late.\n  REQUIRE(std::chrono::duration_cast<std::chrono::nanoseconds>(diff) >= std::chrono::duration_cast<std::chrono::nanoseconds>(SleepAmount));\n}\n"
  },
  {
    "path": "FEXCore/unittests/APITests/ILog2.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXCore/Utils/MathUtils.h>\n#include <catch2/catch_test_macros.hpp>\n#include <catch2/generators/catch_generators_range.hpp>\n\nTEST_CASE(\"ILog2\") {\n  auto i = GENERATE(range(0, 64));\n  REQUIRE(FEXCore::ilog2(1ull << i) == i);\n}\n\nTEST_CASE(\"DividePow2\") {\n  auto j = GENERATE(range(0, 64));\n  auto i = GENERATE(range(0, 64));\n  REQUIRE(FEXCore::DividePow2(1ull << j, 1ull << i) == ((1ull << j) / (1ull << i)));\n}\n"
  },
  {
    "path": "FEXCore/unittests/APITests/vl_integer.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <catch2/catch_test_macros.hpp>\n#include <catch2/generators/catch_generators_range.hpp>\n#include <catch2/generators/catch_generators_random.hpp>\n\n#include \"Utils/variable_length_integer.h\"\n\n#include <limits>\n\nTEST_CASE(\"vl-size\") {\n  // Check 8-bit minimum and maximum.\n  CHECK(FEXCore::Utils::vl64::EncodedSize(-64) == 1);\n  CHECK(FEXCore::Utils::vl64::EncodedSize(63) == 1);\n\n  // Check 16-bit minimum and maximum.\n  CHECK(FEXCore::Utils::vl64::EncodedSize(-8192) == 2);\n  CHECK(FEXCore::Utils::vl64::EncodedSize(8191) == 2);\n\n  // Check 32-bit minimum and maximum.\n  CHECK(FEXCore::Utils::vl64::EncodedSize(std::numeric_limits<int32_t>::min()) == 5);\n  CHECK(FEXCore::Utils::vl64::EncodedSize(std::numeric_limits<int32_t>::max()) == 5);\n\n  // Check 64-bit minimum and maximum.\n  CHECK(FEXCore::Utils::vl64::EncodedSize(std::numeric_limits<int64_t>::min()) == 9);\n  CHECK(FEXCore::Utils::vl64::EncodedSize(std::numeric_limits<int64_t>::max()) == 9);\n}\n\nTEST_CASE(\"vl8 - in memory - encode/decode\") {\n  uint8_t data[1];\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, 0) == 1);\n  CHECK(data[0] == 0);\n  auto Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 1);\n  CHECK(Dec.Integer == 0);\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, 63) == 1);\n  CHECK(data[0] == 0b0011'1111);\n  Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 1);\n  CHECK(Dec.Integer == 63);\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, -1) == 1);\n  CHECK(data[0] == 0b0111'1111);\n  Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 1);\n  CHECK(Dec.Integer == -1);\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, -64) == 1);\n  CHECK(data[0] == 0b0100'0000);\n  Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 1);\n  CHECK(Dec.Integer == -64);\n}\n\nTEST_CASE(\"vl16 - in memory - encode/decode\") {\n  uint8_t data[2];\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, -65) == 2);\n  CHECK((uint64_t)data[0] == 0b1011'1111);\n  CHECK((uint64_t)data[1] == 0b1011'1111);\n  auto Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 2);\n  CHECK(Dec.Integer == -65);\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, -66) == 2);\n  CHECK((uint64_t)data[0] == 0b1011'1111);\n  CHECK((uint64_t)data[1] == 0b1011'1110);\n  Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 2);\n  CHECK(Dec.Integer == -66);\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, 64) == 2);\n  CHECK((uint64_t)data[0] == 0b1000'0000);\n  CHECK((uint64_t)data[1] == 0b0100'0000);\n  Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 2);\n  CHECK(Dec.Integer == 64);\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, 8191) == 2);\n  CHECK((uint64_t)data[0] == 0b1001'1111);\n  CHECK((uint64_t)data[1] == 0b1111'1111);\n  Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 2);\n  CHECK(Dec.Integer == 8191);\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, -8192) == 2);\n  CHECK((uint64_t)data[0] == 0b1010'0000);\n  CHECK((uint64_t)data[1] == 0b0000'0000);\n  Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 2);\n  CHECK(Dec.Integer == -8192);\n}\n\nTEST_CASE(\"vl32 - in memory - encode/decode\") {\n  uint8_t data[5];\n  int32_t result {};\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, 8192) == 5);\n  CHECK(data[0] == 0b1100'0000);\n  memcpy(&result, &data[1], sizeof(int32_t));\n  CHECK(result == 8192);\n  auto Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 5);\n  CHECK(Dec.Integer == 8192);\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, -8193) == 5);\n  CHECK(data[0] == 0b1100'0000);\n  memcpy(&result, &data[1], sizeof(int32_t));\n  CHECK(result == -8193);\n  Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 5);\n  CHECK(Dec.Integer == -8193);\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, std::numeric_limits<int32_t>::min()) == 5);\n  CHECK(data[0] == 0b1100'0000);\n  memcpy(&result, &data[1], sizeof(int32_t));\n  CHECK(result == std::numeric_limits<int32_t>::min());\n  Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 5);\n  CHECK(Dec.Integer == std::numeric_limits<int32_t>::min());\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, std::numeric_limits<int32_t>::max()) == 5);\n  CHECK(data[0] == 0b1100'0000);\n  memcpy(&result, &data[1], sizeof(int32_t));\n  CHECK(result == std::numeric_limits<int32_t>::max());\n  Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 5);\n  CHECK(Dec.Integer == std::numeric_limits<int32_t>::max());\n}\n\nTEST_CASE(\"vl64 - in memory - encode/decode\") {\n  uint8_t data[9];\n  int64_t result {};\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, static_cast<int64_t>(std::numeric_limits<int32_t>::min()) - 1) == 9);\n  CHECK(data[0] == 0b1110'0000);\n  memcpy(&result, &data[1], sizeof(int64_t));\n  CHECK(result == static_cast<int64_t>(std::numeric_limits<int32_t>::min()) - 1);\n  auto Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 9);\n  CHECK(Dec.Integer == static_cast<int64_t>(std::numeric_limits<int32_t>::min()) - 1);\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, static_cast<int64_t>(std::numeric_limits<int32_t>::max()) + 1) == 9);\n  CHECK(data[0] == 0b1110'0000);\n  memcpy(&result, &data[1], sizeof(int64_t));\n  CHECK(result == static_cast<int64_t>(std::numeric_limits<int32_t>::max()) + 1);\n  Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 9);\n  CHECK(Dec.Integer == static_cast<int64_t>(std::numeric_limits<int32_t>::max()) + 1);\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, std::numeric_limits<int64_t>::min()) == 9);\n  CHECK(data[0] == 0b1110'0000);\n  memcpy(&result, &data[1], sizeof(int64_t));\n  CHECK(result == std::numeric_limits<int64_t>::min());\n  Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 9);\n  CHECK(Dec.Integer == std::numeric_limits<int64_t>::min());\n\n  REQUIRE(FEXCore::Utils::vl64::Encode(data, std::numeric_limits<int64_t>::max()) == 9);\n  CHECK(data[0] == 0b1110'0000);\n  memcpy(&result, &data[1], sizeof(int64_t));\n  CHECK(result == std::numeric_limits<int64_t>::max());\n  Dec = FEXCore::Utils::vl64::Decode(data);\n  CHECK(Dec.Size == 9);\n  CHECK(Dec.Integer == std::numeric_limits<int64_t>::max());\n}\n\nTEST_CASE(\"vl64pair-size\") {\n  // Check 8-bit minimum and maximum.\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(4, 1) == 1);\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(64, 8) == 1);\n\n  // Interlaced 8-bit minimum and maximum\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(4, 8) == 1);\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(64, 1) == 1);\n\n  // Check 16-bit minimum and maximum.\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(-512, -32) == 2);\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(504, 31) == 2);\n\n  // Interlaced 16-bit minimum and maximum.\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(-512, 31) == 2);\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(504, -32) == 2);\n\n  // Check 32-bit minimum and maximum.\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(std::numeric_limits<int32_t>::min(), std::numeric_limits<int32_t>::min()) == 9);\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(std::numeric_limits<int32_t>::max(), std::numeric_limits<int32_t>::max()) == 9);\n\n  // Interlaced 32-bit minimum and maximum.\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(std::numeric_limits<int32_t>::min(), std::numeric_limits<int32_t>::max()) == 9);\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(std::numeric_limits<int32_t>::max(), std::numeric_limits<int32_t>::min()) == 9);\n\n  // Check 64-bit minimum and maximum.\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(std::numeric_limits<int64_t>::min(), std::numeric_limits<int64_t>::min()) == 17);\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(std::numeric_limits<int64_t>::max(), std::numeric_limits<int64_t>::max()) == 17);\n\n  // Interlaced 64-bit minimum and maximum.\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(std::numeric_limits<int64_t>::min(), std::numeric_limits<int64_t>::max()) == 17);\n  CHECK(FEXCore::Utils::vl64pair::EncodedSize(std::numeric_limits<int64_t>::max(), std::numeric_limits<int64_t>::min()) == 17);\n}\n\nTEST_CASE(\"vl8pair - in memory - encode/decode\") {\n  uint8_t data[1];\n  // Minimum, Minimum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, (1 * 4), 1) == 1);\n  CHECK(data[0] == 0);\n  auto Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 1);\n  CHECK(Dec.IntegerARMPC == (1 * 4));\n  CHECK(Dec.IntegerX86RIP == 1);\n\n  // Maximum, Maximum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, (16 * 4), 8) == 1);\n  CHECK(data[0] == 0b0111'1111);\n  Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 1);\n  CHECK(Dec.IntegerARMPC == (16 * 4));\n  CHECK(Dec.IntegerX86RIP == 8);\n\n  // Minimum, Maximum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, (1 * 4), 8) == 1);\n  CHECK(data[0] == 0b0111'0000);\n  Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 1);\n  CHECK(Dec.IntegerARMPC == (1 * 4));\n  CHECK(Dec.IntegerX86RIP == 8);\n\n  // Maximum, Minimum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, (16 * 4), 1) == 1);\n  CHECK(data[0] == 0b0000'1111);\n  Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 1);\n  CHECK(Dec.IntegerARMPC == (16 * 4));\n  CHECK(Dec.IntegerX86RIP == 1);\n}\n\nTEST_CASE(\"vl16pair - in memory - encode/decode\") {\n  uint8_t data[2];\n\n  // vl8pair Minimum - 1, Minimum - 1\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, 0, 0) == 2);\n  CHECK((uint64_t)data[0] == 0b1000'0000);\n  CHECK((uint64_t)data[1] == 0b0000'0000);\n  auto Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 2);\n  CHECK(Dec.IntegerARMPC == 0);\n  CHECK(Dec.IntegerX86RIP == 0);\n\n  // vl8pair Maximum + 1, Maximum + 1\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, (17 * 4), 9) == 2);\n  CHECK((uint64_t)data[0] == 0b1000'1001);\n  CHECK((uint64_t)data[1] == 0b0001'0001);\n  Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 2);\n  CHECK(Dec.IntegerARMPC == (17 * 4));\n  CHECK(Dec.IntegerX86RIP == 9);\n\n  // Minimum, Minimum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, (-128 * 4), -32) == 2);\n  CHECK((uint64_t)data[0] == 0b1010'0000);\n  CHECK((uint64_t)data[1] == 0b1000'0000);\n  Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 2);\n  CHECK(Dec.IntegerARMPC == (-128 * 4));\n  CHECK(Dec.IntegerX86RIP == -32);\n\n  // Maximum, Maximum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, (127 * 4), 31) == 2);\n  CHECK((uint64_t)data[0] == 0b1001'1111);\n  CHECK((uint64_t)data[1] == 0b0111'1111);\n  Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 2);\n  CHECK(Dec.IntegerARMPC == (127 * 4));\n  CHECK(Dec.IntegerX86RIP == 31);\n\n  // Interleaved Minimum, Maximum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, (-128 * 4), 31) == 2);\n  CHECK((uint64_t)data[0] == 0b1001'1111);\n  CHECK((uint64_t)data[1] == 0b1000'0000);\n  Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 2);\n  CHECK(Dec.IntegerARMPC == (-128 * 4));\n  CHECK(Dec.IntegerX86RIP == 31);\n\n  // Interleaved Maximum, Minimum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, (127 * 4), -32) == 2);\n  CHECK((uint64_t)data[0] == 0b1010'0000);\n  CHECK((uint64_t)data[1] == 0b0111'1111);\n  Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 2);\n  CHECK(Dec.IntegerARMPC == (127 * 4));\n  CHECK(Dec.IntegerX86RIP == -32);\n}\n\nTEST_CASE(\"vl32pair - in memory - encode/decode\") {\n  uint8_t data[9];\n  int32_t result {};\n\n  // Minimum, Minimum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, std::numeric_limits<int32_t>::min(), std::numeric_limits<int32_t>::min()) == 9);\n  CHECK(data[0] == 0b1100'0000);\n  memcpy(&result, &data[1], sizeof(int32_t));\n  CHECK(result == std::numeric_limits<int32_t>::min());\n  memcpy(&result, &data[1 + sizeof(int32_t)], sizeof(int32_t));\n  CHECK(result == std::numeric_limits<int32_t>::min());\n  auto Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 9);\n  CHECK(Dec.IntegerARMPC == std::numeric_limits<int32_t>::min());\n  CHECK(Dec.IntegerX86RIP == std::numeric_limits<int32_t>::min());\n\n  // Maximum, Maximum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, std::numeric_limits<int32_t>::max(), std::numeric_limits<int32_t>::max()) == 9);\n  CHECK(data[0] == 0b1100'0000);\n  memcpy(&result, &data[1], sizeof(int32_t));\n  CHECK(result == std::numeric_limits<int32_t>::max());\n  memcpy(&result, &data[1 + sizeof(int32_t)], sizeof(int32_t));\n  CHECK(result == std::numeric_limits<int32_t>::max());\n  Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 9);\n  CHECK(Dec.IntegerARMPC == std::numeric_limits<int32_t>::max());\n  CHECK(Dec.IntegerX86RIP == std::numeric_limits<int32_t>::max());\n\n  // Interleaved Minimum, Maximum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, std::numeric_limits<int32_t>::min(), std::numeric_limits<int32_t>::max()) == 9);\n  CHECK(data[0] == 0b1100'0000);\n  memcpy(&result, &data[1], sizeof(int32_t));\n  CHECK(result == std::numeric_limits<int32_t>::min());\n  memcpy(&result, &data[1 + sizeof(int32_t)], sizeof(int32_t));\n  CHECK(result == std::numeric_limits<int32_t>::max());\n  Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 9);\n  CHECK(Dec.IntegerARMPC == std::numeric_limits<int32_t>::min());\n  CHECK(Dec.IntegerX86RIP == std::numeric_limits<int32_t>::max());\n\n  // Interleaved Maximum, Minimum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, std::numeric_limits<int32_t>::max(), std::numeric_limits<int32_t>::min()) == 9);\n  CHECK(data[0] == 0b1100'0000);\n  memcpy(&result, &data[1], sizeof(int32_t));\n  CHECK(result == std::numeric_limits<int32_t>::max());\n  memcpy(&result, &data[1 + sizeof(int32_t)], sizeof(int32_t));\n  CHECK(result == std::numeric_limits<int32_t>::min());\n  Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 9);\n  CHECK(Dec.IntegerARMPC == std::numeric_limits<int32_t>::max());\n  CHECK(Dec.IntegerX86RIP == std::numeric_limits<int32_t>::min());\n}\n\nTEST_CASE(\"vl64pair - in memory - encode/decode\") {\n  uint8_t data[17];\n  int64_t result {};\n\n  // Minimum, Minimum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, std::numeric_limits<int64_t>::min(), std::numeric_limits<int64_t>::min()) == 17);\n  CHECK(data[0] == 0b1110'0000);\n  memcpy(&result, &data[1], sizeof(int64_t));\n  CHECK(result == std::numeric_limits<int64_t>::min());\n  memcpy(&result, &data[1 + sizeof(int64_t)], sizeof(int64_t));\n  CHECK(result == std::numeric_limits<int64_t>::min());\n  auto Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 17);\n  CHECK(Dec.IntegerARMPC == std::numeric_limits<int64_t>::min());\n  CHECK(Dec.IntegerX86RIP == std::numeric_limits<int64_t>::min());\n\n  // Maximum, Maximum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, std::numeric_limits<int64_t>::max(), std::numeric_limits<int64_t>::max()) == 17);\n  CHECK(data[0] == 0b1110'0000);\n  memcpy(&result, &data[1], sizeof(int64_t));\n  CHECK(result == std::numeric_limits<int64_t>::max());\n  memcpy(&result, &data[1 + sizeof(int64_t)], sizeof(int64_t));\n  CHECK(result == std::numeric_limits<int64_t>::max());\n  Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 17);\n  CHECK(Dec.IntegerARMPC == std::numeric_limits<int64_t>::max());\n  CHECK(Dec.IntegerX86RIP == std::numeric_limits<int64_t>::max());\n\n  // Interleaved Minimum, Maximum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, std::numeric_limits<int64_t>::min(), std::numeric_limits<int64_t>::max()) == 17);\n  CHECK(data[0] == 0b1110'0000);\n  memcpy(&result, &data[1], sizeof(int64_t));\n  CHECK(result == std::numeric_limits<int64_t>::min());\n  memcpy(&result, &data[1 + sizeof(int64_t)], sizeof(int64_t));\n  CHECK(result == std::numeric_limits<int64_t>::max());\n  Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 17);\n  CHECK(Dec.IntegerARMPC == std::numeric_limits<int64_t>::min());\n  CHECK(Dec.IntegerX86RIP == std::numeric_limits<int64_t>::max());\n\n  // Interleaved Maximum, Minimum\n  REQUIRE(FEXCore::Utils::vl64pair::Encode(data, std::numeric_limits<int64_t>::max(), std::numeric_limits<int64_t>::min()) == 17);\n  CHECK(data[0] == 0b1110'0000);\n  memcpy(&result, &data[1], sizeof(int64_t));\n  CHECK(result == std::numeric_limits<int64_t>::max());\n  memcpy(&result, &data[1 + sizeof(int64_t)], sizeof(int64_t));\n  CHECK(result == std::numeric_limits<int64_t>::min());\n  Dec = FEXCore::Utils::vl64pair::Decode(data);\n  CHECK(Dec.Size == 17);\n  CHECK(Dec.IntegerARMPC == std::numeric_limits<int64_t>::max());\n  CHECK(Dec.IntegerX86RIP == std::numeric_limits<int64_t>::min());\n}\n"
  },
  {
    "path": "FEXCore/unittests/CMakeLists.txt",
    "content": "if (NOT MINGW)\n  add_subdirectory(Emitter/)\n  add_subdirectory(APITests/)\nendif()\n"
  },
  {
    "path": "FEXCore/unittests/Emitter/ALU_Tests.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"TestDisassembler.h\"\n\n#include <catch2/catch_test_macros.hpp>\n#include <fcntl.h>\n\nusing namespace ARMEmitter;\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: PC relative\") {\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)adr(Reg::r30, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x10fffffe);\n  }\n\n  {\n    ForwardLabel Label;\n    (void)adr(Reg::r30, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x1000003e);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)adr(Reg::r30, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x10fffffe);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)adr(Reg::r30, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x1000003e);\n  }\n\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)adrp(Reg::r30, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x9000001e);\n  }\n\n  {\n    ForwardLabel Label;\n    (void)adrp(Reg::r30, &Label);\n    // Move label a page away\n    for (size_t i = 0; i < 1023; ++i) {\n      nop();\n    }\n    (void)Bind(&Label);\n\n    CHECK(DisassembleEncoding(0) == 0xb000001e);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)adrp(Reg::r30, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x9000001e);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)adrp(Reg::r30, &Label);\n    // Move label a page away\n    for (size_t i = 0; i < 1023; ++i) {\n      nop();\n    }\n    (void)Bind(&Label);\n\n    CHECK(DisassembleEncoding(0) == 0xb000001e);\n  }\n\n  {\n    // Will generate adr.\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n\n    (void)LongAddressGen(Reg::r30, &Label);\n    CHECK(DisassembleEncoding(1) == 0x10fffffe);\n  }\n  {\n    // Will generate nop + nop + adr.\n    ForwardLabel Label;\n    (void)LongAddressGen(Reg::r30, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0xd503201f);\n    CHECK(DisassembleEncoding(0) == 0xd503201f);\n    CHECK(DisassembleEncoding(2) == 0x1000003e);\n  }\n  {\n    // Will generate adr.\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)LongAddressGen(Reg::r30, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x10fffffe);\n  }\n\n  {\n    // Will generate nop + nop + adr.\n    BiDirectionalLabel Label;\n    (void)LongAddressGen(Reg::r30, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0xd503201f);\n    CHECK(DisassembleEncoding(1) == 0xd503201f);\n    CHECK(DisassembleEncoding(2) == 0x1000003e);\n  }\n\n  {\n    // Will generate adrp.\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n\n    // Move adrp 1MB away.\n    for (size_t i = 0; i < (1 * 1024 * 1024 / 4); ++i) {\n      nop();\n    }\n\n    (void)LongAddressGen(Reg::r30, &Label);\n    nop();\n    CHECK(DisassembleEncoding(262145) == 0x90fff81e);\n    CHECK(DisassembleEncoding(262146) == 0xd503201f);\n  }\n\n  {\n    // Will generate nop + nop + adrp.\n    ForwardLabel Label;\n    (void)LongAddressGen(Reg::r30, &Label);\n\n    // Move label 1MB away, plus a page, and then aligned to a page.\n    for (size_t i = 0; i < ((1 * 1024 * 1024 + 4096) / 4 - 3); ++i) {\n      nop();\n    }\n\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0xd503201f);\n    CHECK(DisassembleEncoding(1) == 0xd503201f);\n    CHECK(DisassembleEncoding(2) == 0x9000081e);\n  }\n\n  {\n    // Will generate nop + adrp + add.\n    ForwardLabel Label;\n    (void)LongAddressGen(Reg::r30, &Label);\n\n    // Move label 1MB away, plus a page, plus one instruction.\n    for (size_t i = 0; i < ((1 * 1024 * 1024 + 4096) / 4 - 1); ++i) {\n      nop();\n    }\n\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0xd503201f);\n    CHECK(DisassembleEncoding(1) == 0xb000081e);\n    CHECK(DisassembleEncoding(2) == 0x910013de);\n  }\n\n\n  {\n    // Will generate adrp.\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n\n    // Move adrp 1MB away.\n    for (size_t i = 0; i < (1 * 1024 * 1024 / 4); ++i) {\n      nop();\n    }\n\n    (void)LongAddressGen(Reg::r30, &Label);\n    nop();\n    CHECK(DisassembleEncoding(262145) == 0x90fff81e);\n    CHECK(DisassembleEncoding(262146) == 0xd503201f);\n  }\n\n  {\n    // Will generate nop + nop + adrp.\n    BiDirectionalLabel Label;\n    (void)LongAddressGen(Reg::r30, &Label);\n\n    // Move label 1MB away, plus a page, and then aligned to a page.\n    for (size_t i = 0; i < ((1 * 1024 * 1024 + 4096) / 4 - 3); ++i) {\n      nop();\n    }\n\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0xd503201f);\n    CHECK(DisassembleEncoding(1) == 0xd503201f);\n    CHECK(DisassembleEncoding(2) == 0x9000081e);\n  }\n\n  {\n    // Will generate nop + adrp + add.\n    BiDirectionalLabel Label;\n    (void)LongAddressGen(Reg::r30, &Label);\n\n    // Move label 1MB away, plus a page, plus one instruction.\n    for (size_t i = 0; i < ((1 * 1024 * 1024 + 4096) / 4 - 1); ++i) {\n      nop();\n    }\n\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0xd503201f);\n    CHECK(DisassembleEncoding(1) == 0xb000081e);\n    CHECK(DisassembleEncoding(2) == 0x910013de);\n  }\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Add/subtract immediate\") {\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, 0, false), \"add w29, w28, #0x0 (0)\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, 4095, false), \"add w29, w28, #0xfff (4095)\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, 0, true), \"add w29, w28, #0x0 (0)\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, 4095, true), \"add w29, w28, #0xfff000 (16773120)\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, 16773120), \"add w29, w28, #0xfff000 (16773120)\");\n\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, 0, false), \"add x29, x28, #0x0 (0)\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, 4095, false), \"add x29, x28, #0xfff (4095)\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, 0, true), \"add x29, x28, #0x0 (0)\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, 4095, true), \"add x29, x28, #0xfff000 (16773120)\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, 16773120), \"add x29, x28, #0xfff000 (16773120)\");\n\n  TEST_SINGLE(add(Size::i64Bit, Reg::rsp, Reg::rsp, 0, false), \"mov sp, sp\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::rsp, Reg::rsp, 4095, false), \"add sp, sp, #0xfff (4095)\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::rsp, Reg::rsp, 0, true), \"mov sp, sp\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::rsp, Reg::rsp, 4095, true), \"add sp, sp, #0xfff000 (16773120)\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::rsp, Reg::rsp, 16773120), \"add sp, sp, #0xfff000 (16773120)\");\n\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, 0, false), \"adds w29, w28, #0x0 (0)\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, 4095, false), \"adds w29, w28, #0xfff (4095)\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, 0, true), \"adds w29, w28, #0x0 (0)\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, 4095, true), \"adds w29, w28, #0xfff000 (16773120)\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, 16773120), \"adds w29, w28, #0xfff000 (16773120)\");\n\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, 0, false), \"adds x29, x28, #0x0 (0)\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, 4095, false), \"adds x29, x28, #0xfff (4095)\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, 0, true), \"adds x29, x28, #0x0 (0)\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, 4095, true), \"adds x29, x28, #0xfff000 (16773120)\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, 16773120), \"adds x29, x28, #0xfff000 (16773120)\");\n\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, 0, false), \"cmn w28, #0x0 (0)\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, 4095, false), \"cmn w28, #0xfff (4095)\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, 0, true), \"cmn w28, #0x0 (0)\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, 4095, true), \"cmn w28, #0xfff000 (16773120)\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, 16773120), \"cmn w28, #0xfff000 (16773120)\");\n\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, 0, false), \"cmn x28, #0x0 (0)\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, 4095, false), \"cmn x28, #0xfff (4095)\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, 0, true), \"cmn x28, #0x0 (0)\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, 4095, true), \"cmn x28, #0xfff000 (16773120)\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, 16773120), \"cmn x28, #0xfff000 (16773120)\");\n\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, 0, false), \"sub w29, w28, #0x0 (0)\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, 4095, false), \"sub w29, w28, #0xfff (4095)\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, 0, true), \"sub w29, w28, #0x0 (0)\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, 4095, true), \"sub w29, w28, #0xfff000 (16773120)\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, 16773120), \"sub w29, w28, #0xfff000 (16773120)\");\n\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, 0, false), \"sub x29, x28, #0x0 (0)\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, 4095, false), \"sub x29, x28, #0xfff (4095)\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, 0, true), \"sub x29, x28, #0x0 (0)\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, 4095, true), \"sub x29, x28, #0xfff000 (16773120)\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, 16773120), \"sub x29, x28, #0xfff000 (16773120)\");\n\n  TEST_SINGLE(sub(Size::i64Bit, Reg::rsp, Reg::rsp, 0, false), \"sub sp, sp, #0x0 (0)\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::rsp, Reg::rsp, 4095, false), \"sub sp, sp, #0xfff (4095)\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::rsp, Reg::rsp, 0, true), \"sub sp, sp, #0x0 (0)\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::rsp, Reg::rsp, 4095, true), \"sub sp, sp, #0xfff000 (16773120)\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::rsp, Reg::rsp, 16773120), \"sub sp, sp, #0xfff000 (16773120)\");\n\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, 0, false), \"subs w29, w28, #0x0 (0)\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, 4095, false), \"subs w29, w28, #0xfff (4095)\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, 0, true), \"subs w29, w28, #0x0 (0)\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, 4095, true), \"subs w29, w28, #0xfff000 (16773120)\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, 16773120), \"subs w29, w28, #0xfff000 (16773120)\");\n\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, 0, false), \"subs x29, x28, #0x0 (0)\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, 4095, false), \"subs x29, x28, #0xfff (4095)\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, 0, true), \"subs x29, x28, #0x0 (0)\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, 4095, true), \"subs x29, x28, #0xfff000 (16773120)\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, 16773120), \"subs x29, x28, #0xfff000 (16773120)\");\n\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r28, 0, false), \"cmp w28, #0x0 (0)\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r28, 4095, false), \"cmp w28, #0xfff (4095)\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r28, 0, true), \"cmp w28, #0x0 (0)\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r28, 4095, true), \"cmp w28, #0xfff000 (16773120)\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r28, 16773120), \"cmp w28, #0xfff000 (16773120)\");\n\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r28, 0, false), \"cmp x28, #0x0 (0)\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r28, 4095, false), \"cmp x28, #0xfff (4095)\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r28, 0, true), \"cmp x28, #0x0 (0)\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r28, 4095, true), \"cmp x28, #0xfff000 (16773120)\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r28, 16773120), \"cmp x28, #0xfff000 (16773120)\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Min/max immediate\") {\n  TEST_SINGLE(smax(Size::i32Bit, Reg::r29, Reg::r28, 1), \"smax w29, w28, #1\");\n  TEST_SINGLE(smax(Size::i32Bit, Reg::r29, Reg::r28, 127), \"smax w29, w28, #127\");\n  TEST_SINGLE(smax(Size::i32Bit, Reg::r29, Reg::r28, -128), \"smax w29, w28, #-128\");\n  TEST_SINGLE(smax(Size::i64Bit, Reg::r29, Reg::r28, 1), \"smax x29, x28, #1\");\n  TEST_SINGLE(smax(Size::i64Bit, Reg::r29, Reg::r28, 127), \"smax x29, x28, #127\");\n  TEST_SINGLE(smax(Size::i64Bit, Reg::r29, Reg::r28, -128), \"smax x29, x28, #-128\");\n\n  TEST_SINGLE(umax(Size::i32Bit, Reg::r29, Reg::r28, 0), \"umax w29, w28, #0\");\n  TEST_SINGLE(umax(Size::i32Bit, Reg::r29, Reg::r28, 255), \"umax w29, w28, #255\");\n  TEST_SINGLE(umax(Size::i64Bit, Reg::r29, Reg::r28, 0), \"umax x29, x28, #0\");\n  TEST_SINGLE(umax(Size::i64Bit, Reg::r29, Reg::r28, 255), \"umax x29, x28, #255\");\n\n  TEST_SINGLE(smin(Size::i32Bit, Reg::r29, Reg::r28, 1), \"smin w29, w28, #1\");\n  TEST_SINGLE(smin(Size::i32Bit, Reg::r29, Reg::r28, 127), \"smin w29, w28, #127\");\n  TEST_SINGLE(smin(Size::i32Bit, Reg::r29, Reg::r28, -128), \"smin w29, w28, #-128\");\n  TEST_SINGLE(smin(Size::i64Bit, Reg::r29, Reg::r28, 1), \"smin x29, x28, #1\");\n  TEST_SINGLE(smin(Size::i64Bit, Reg::r29, Reg::r28, 127), \"smin x29, x28, #127\");\n  TEST_SINGLE(smin(Size::i64Bit, Reg::r29, Reg::r28, -128), \"smin x29, x28, #-128\");\n\n  TEST_SINGLE(umin(Size::i32Bit, Reg::r29, Reg::r28, 0), \"umin w29, w28, #0\");\n  TEST_SINGLE(umin(Size::i32Bit, Reg::r29, Reg::r28, 255), \"umin w29, w28, #255\");\n  TEST_SINGLE(umin(Size::i64Bit, Reg::r29, Reg::r28, 0), \"umin x29, x28, #0\");\n  TEST_SINGLE(umin(Size::i64Bit, Reg::r29, Reg::r28, 255), \"umin x29, x28, #255\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Logical immediate\") {\n  TEST_SINGLE(and_(Size::i32Bit, Reg::r29, Reg::r28, 1), \"and w29, w28, #0x1\");\n  TEST_SINGLE(and_(Size::i32Bit, Reg::r29, Reg::r28, -2), \"and w29, w28, #0xfffffffe\");\n  TEST_SINGLE(and_(Size::i64Bit, Reg::r29, Reg::r28, 1), \"and x29, x28, #0x1\");\n  TEST_SINGLE(and_(Size::i64Bit, Reg::r29, Reg::r28, -2), \"and x29, x28, #0xfffffffffffffffe\");\n\n  TEST_SINGLE(bic(Size::i32Bit, Reg::r29, Reg::r28, 1), \"and w29, w28, #0xfffffffe\");\n  TEST_SINGLE(bic(Size::i32Bit, Reg::r29, Reg::r28, -2), \"and w29, w28, #0x1\");\n  TEST_SINGLE(bic(Size::i64Bit, Reg::r29, Reg::r28, 1), \"and x29, x28, #0xfffffffffffffffe\");\n  TEST_SINGLE(bic(Size::i64Bit, Reg::r29, Reg::r28, -2), \"and x29, x28, #0x1\");\n\n  TEST_SINGLE(ands(Size::i32Bit, Reg::r29, Reg::r28, 1), \"ands w29, w28, #0x1\");\n  TEST_SINGLE(ands(Size::i32Bit, Reg::r29, Reg::r28, -2), \"ands w29, w28, #0xfffffffe\");\n  TEST_SINGLE(ands(Size::i64Bit, Reg::r29, Reg::r28, 1), \"ands x29, x28, #0x1\");\n  TEST_SINGLE(ands(Size::i64Bit, Reg::r29, Reg::r28, -2), \"ands x29, x28, #0xfffffffffffffffe\");\n\n  TEST_SINGLE(bics(Size::i32Bit, Reg::r29, Reg::r28, 1), \"ands w29, w28, #0xfffffffe\");\n  TEST_SINGLE(bics(Size::i32Bit, Reg::r29, Reg::r28, -2), \"ands w29, w28, #0x1\");\n  TEST_SINGLE(bics(Size::i64Bit, Reg::r29, Reg::r28, 1), \"ands x29, x28, #0xfffffffffffffffe\");\n  TEST_SINGLE(bics(Size::i64Bit, Reg::r29, Reg::r28, -2), \"ands x29, x28, #0x1\");\n\n  TEST_SINGLE(orr(Size::i32Bit, Reg::r29, Reg::r28, 1), \"orr w29, w28, #0x1\");\n  TEST_SINGLE(orr(Size::i32Bit, Reg::r29, Reg::r28, -2), \"orr w29, w28, #0xfffffffe\");\n  TEST_SINGLE(orr(Size::i64Bit, Reg::r29, Reg::r28, 1), \"orr x29, x28, #0x1\");\n  TEST_SINGLE(orr(Size::i64Bit, Reg::r29, Reg::r28, -2), \"orr x29, x28, #0xfffffffffffffffe\");\n\n  TEST_SINGLE(eor(Size::i32Bit, Reg::r29, Reg::r28, 1), \"eor w29, w28, #0x1\");\n  TEST_SINGLE(eor(Size::i32Bit, Reg::r29, Reg::r28, -2), \"eor w29, w28, #0xfffffffe\");\n  TEST_SINGLE(eor(Size::i64Bit, Reg::r29, Reg::r28, 1), \"eor x29, x28, #0x1\");\n  TEST_SINGLE(eor(Size::i64Bit, Reg::r29, Reg::r28, -2), \"eor x29, x28, #0xfffffffffffffffe\");\n\n  TEST_SINGLE(tst(Size::i32Bit, Reg::r28, 1), \"tst w28, #0x1\");\n  TEST_SINGLE(tst(Size::i32Bit, Reg::r28, -2), \"tst w28, #0xfffffffe\");\n  TEST_SINGLE(tst(Size::i64Bit, Reg::r28, 1), \"tst x28, #0x1\");\n  TEST_SINGLE(tst(Size::i64Bit, Reg::r28, -2), \"tst x28, #0xfffffffffffffffe\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Move wide immediate\") {\n  TEST_SINGLE(movn(Size::i32Bit, Reg::r29, 0x4243, 0), \"mov w29, #0xffffbdbc\");\n  TEST_SINGLE(movn(Size::i32Bit, Reg::r29, 0x4243, 16), \"mov w29, #0xbdbcffff\");\n\n  TEST_SINGLE(movn(Size::i64Bit, Reg::r29, 0x4243, 0), \"mov x29, #0xffffffffffffbdbc\");\n  TEST_SINGLE(movn(Size::i64Bit, Reg::r29, 0x4243, 16), \"mov x29, #0xffffffffbdbcffff\");\n  TEST_SINGLE(movn(Size::i64Bit, Reg::r29, 0x4243, 32), \"mov x29, #0xffffbdbcffffffff\");\n  TEST_SINGLE(movn(Size::i64Bit, Reg::r29, 0x4243, 48), \"mov x29, #0xbdbcffffffffffff\");\n\n  TEST_SINGLE(mov(Size::i32Bit, Reg::r29, 0x4243), \"mov w29, #0x4243\");\n  TEST_SINGLE(mov(Size::i64Bit, Reg::r29, 0x4243), \"mov x29, #0x4243\");\n\n  TEST_SINGLE(mov(WReg::w29, 0x4243), \"mov w29, #0x4243\");\n  TEST_SINGLE(mov(XReg::x29, 0x4243), \"mov x29, #0x4243\");\n\n  TEST_SINGLE(movz(Size::i32Bit, Reg::r29, 0x4243, 0), \"mov w29, #0x4243\");\n  TEST_SINGLE(movz(Size::i32Bit, Reg::r29, 0x4243, 16), \"mov w29, #0x42430000\");\n\n  TEST_SINGLE(movz(Size::i64Bit, Reg::r29, 0x4243, 0), \"mov x29, #0x4243\");\n  TEST_SINGLE(movz(Size::i64Bit, Reg::r29, 0x4243, 16), \"mov x29, #0x42430000\");\n  TEST_SINGLE(movz(Size::i64Bit, Reg::r29, 0x4243, 32), \"mov x29, #0x424300000000\");\n  TEST_SINGLE(movz(Size::i64Bit, Reg::r29, 0x4243, 48), \"mov x29, #0x4243000000000000\");\n\n  TEST_SINGLE(movk(Size::i32Bit, Reg::r29, 0x4243, 0), \"movk w29, #0x4243\");\n  TEST_SINGLE(movk(Size::i32Bit, Reg::r29, 0x4243, 16), \"movk w29, #0x4243, lsl #16\");\n\n  TEST_SINGLE(movk(Size::i64Bit, Reg::r29, 0x4243, 0), \"movk x29, #0x4243\");\n  TEST_SINGLE(movk(Size::i64Bit, Reg::r29, 0x4243, 16), \"movk x29, #0x4243, lsl #16\");\n  TEST_SINGLE(movk(Size::i64Bit, Reg::r29, 0x4243, 32), \"movk x29, #0x4243, lsl #32\");\n  TEST_SINGLE(movk(Size::i64Bit, Reg::r29, 0x4243, 48), \"movk x29, #0x4243, lsl #48\");\n\n  TEST_SINGLE(movn(WReg::w29, 0x4243, 0), \"mov w29, #0xffffbdbc\");\n  TEST_SINGLE(movn(WReg::w29, 0x4243, 16), \"mov w29, #0xbdbcffff\");\n  TEST_SINGLE(movz(WReg::w29, 0x4243, 0), \"mov w29, #0x4243\");\n  TEST_SINGLE(movz(WReg::w29, 0x4243, 16), \"mov w29, #0x42430000\");\n  TEST_SINGLE(movk(WReg::w29, 0x4243, 0), \"movk w29, #0x4243\");\n  TEST_SINGLE(movk(WReg::w29, 0x4243, 16), \"movk w29, #0x4243, lsl #16\");\n\n  TEST_SINGLE(movn(XReg::x29, 0x4243, 0), \"mov x29, #0xffffffffffffbdbc\");\n  TEST_SINGLE(movn(XReg::x29, 0x4243, 16), \"mov x29, #0xffffffffbdbcffff\");\n  TEST_SINGLE(movn(XReg::x29, 0x4243, 32), \"mov x29, #0xffffbdbcffffffff\");\n  TEST_SINGLE(movn(XReg::x29, 0x4243, 48), \"mov x29, #0xbdbcffffffffffff\");\n  TEST_SINGLE(movz(XReg::x29, 0x4243, 0), \"mov x29, #0x4243\");\n  TEST_SINGLE(movz(XReg::x29, 0x4243, 16), \"mov x29, #0x42430000\");\n  TEST_SINGLE(movz(XReg::x29, 0x4243, 32), \"mov x29, #0x424300000000\");\n  TEST_SINGLE(movz(XReg::x29, 0x4243, 48), \"mov x29, #0x4243000000000000\");\n  TEST_SINGLE(movk(XReg::x29, 0x4243, 0), \"movk x29, #0x4243\");\n  TEST_SINGLE(movk(XReg::x29, 0x4243, 16), \"movk x29, #0x4243, lsl #16\");\n  TEST_SINGLE(movk(XReg::x29, 0x4243, 32), \"movk x29, #0x4243, lsl #32\");\n  TEST_SINGLE(movk(XReg::x29, 0x4243, 48), \"movk x29, #0x4243, lsl #48\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Bitfield\") {\n  TEST_SINGLE(sxtb(Size::i32Bit, Reg::r29, Reg::r28), \"sxtb w29, w28\");\n  TEST_SINGLE(sxtb(Size::i64Bit, Reg::r29, Reg::r28), \"sxtb x29, w28\");\n\n  TEST_SINGLE(sxth(Size::i32Bit, Reg::r29, Reg::r28), \"sxth w29, w28\");\n  TEST_SINGLE(sxth(Size::i64Bit, Reg::r29, Reg::r28), \"sxth x29, w28\");\n\n  TEST_SINGLE(sxtw(XReg::x29, WReg::w28), \"sxtw x29, w28\");\n\n  TEST_SINGLE(sbfx(Size::i32Bit, Reg::r29, Reg::r28, 4, 16), \"sbfx w29, w28, #4, #16\");\n  TEST_SINGLE(sbfx(Size::i64Bit, Reg::r29, Reg::r28, 4, 16), \"sbfx x29, x28, #4, #16\");\n\n  TEST_SINGLE(asr(Size::i32Bit, Reg::r29, Reg::r28, 17), \"asr w29, w28, #17\");\n  TEST_SINGLE(asr(Size::i64Bit, Reg::r29, Reg::r28, 17), \"asr x29, x28, #17\");\n\n  TEST_SINGLE(bfc(Size::i32Bit, Reg::r29, 4, 3), \"bfc w29, #4, #3\");\n  TEST_SINGLE(bfc(Size::i32Bit, Reg::r29, 27, 3), \"bfc w29, #27, #3\");\n\n  TEST_SINGLE(bfc(Size::i64Bit, Reg::r29, 4, 3), \"bfc x29, #4, #3\");\n  TEST_SINGLE(bfc(Size::i64Bit, Reg::r29, 57, 3), \"bfc x29, #57, #3\");\n\n  TEST_SINGLE(bfxil(Size::i32Bit, Reg::r29, Reg::r28, 4, 3), \"bfxil w29, w28, #4, #3\");\n  TEST_SINGLE(bfxil(Size::i32Bit, Reg::r29, Reg::r28, 27, 3), \"bfxil w29, w28, #27, #3\");\n\n  TEST_SINGLE(bfxil(Size::i64Bit, Reg::r29, Reg::r28, 4, 3), \"bfxil x29, x28, #4, #3\");\n  TEST_SINGLE(bfxil(Size::i64Bit, Reg::r29, Reg::r28, 57, 3), \"bfxil x29, x28, #57, #3\");\n\n  TEST_SINGLE(sbfiz(Size::i32Bit, Reg::r29, Reg::r28, 5, 3), \"sbfiz w29, w28, #5, #3\");\n  TEST_SINGLE(sbfiz(Size::i32Bit, Reg::r29, Reg::r28, 27, 3), \"sbfiz w29, w28, #27, #3\");\n\n  TEST_SINGLE(sbfiz(Size::i64Bit, Reg::r29, Reg::r28, 5, 3), \"sbfiz x29, x28, #5, #3\");\n  TEST_SINGLE(sbfiz(Size::i64Bit, Reg::r29, Reg::r28, 54, 3), \"sbfiz x29, x28, #54, #3\");\n\n  TEST_SINGLE(ubfiz(Size::i32Bit, Reg::r29, Reg::r28, 5, 3), \"ubfiz w29, w28, #5, #3\");\n  TEST_SINGLE(ubfiz(Size::i32Bit, Reg::r29, Reg::r28, 27, 3), \"ubfiz w29, w28, #27, #3\");\n\n  TEST_SINGLE(ubfiz(Size::i64Bit, Reg::r29, Reg::r28, 5, 3), \"ubfiz x29, x28, #5, #3\");\n  TEST_SINGLE(ubfiz(Size::i64Bit, Reg::r29, Reg::r28, 54, 3), \"ubfiz x29, x28, #54, #3\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Extract\") {\n  TEST_SINGLE(extr(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, 0), \"extr w29, w28, w27, #0\");\n  TEST_SINGLE(extr(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, 16), \"extr w29, w28, w27, #16\");\n\n  TEST_SINGLE(extr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, 0), \"extr x29, x28, x27, #0\");\n  TEST_SINGLE(extr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, 16), \"extr x29, x28, x27, #16\");\n  TEST_SINGLE(extr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, 32), \"extr x29, x28, x27, #32\");\n  TEST_SINGLE(extr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, 48), \"extr x29, x28, x27, #48\");\n\n  TEST_SINGLE(ror(Size::i32Bit, Reg::r29, Reg::r28, 0), \"ror w29, w28, #0\");\n  TEST_SINGLE(ror(Size::i32Bit, Reg::r29, Reg::r28, 16), \"ror w29, w28, #16\");\n\n  TEST_SINGLE(ror(Size::i64Bit, Reg::r29, Reg::r28, 0), \"ror x29, x28, #0\");\n  TEST_SINGLE(ror(Size::i64Bit, Reg::r29, Reg::r28, 16), \"ror x29, x28, #16\");\n  TEST_SINGLE(ror(Size::i64Bit, Reg::r29, Reg::r28, 32), \"ror x29, x28, #32\");\n  TEST_SINGLE(ror(Size::i64Bit, Reg::r29, Reg::r28, 48), \"ror x29, x28, #48\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Data processing - 2 source\") {\n  TEST_SINGLE(udiv(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"udiv w29, w28, w27\");\n  TEST_SINGLE(sdiv(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"sdiv w29, w28, w27\");\n  TEST_SINGLE(lslv(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"lsl w29, w28, w27\");\n  TEST_SINGLE(lsrv(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"lsr w29, w28, w27\");\n  TEST_SINGLE(asrv(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"asr w29, w28, w27\");\n  TEST_SINGLE(rorv(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"ror w29, w28, w27\");\n  TEST_SINGLE(crc32b(WReg::w29, WReg::w28, WReg::w27), \"crc32b w29, w28, w27\");\n  TEST_SINGLE(crc32h(WReg::w29, WReg::w28, WReg::w27), \"crc32h w29, w28, w27\");\n  TEST_SINGLE(crc32w(WReg::w29, WReg::w28, WReg::w27), \"crc32w w29, w28, w27\");\n  TEST_SINGLE(crc32cb(WReg::w29, WReg::w28, WReg::w27), \"crc32cb w29, w28, w27\");\n  TEST_SINGLE(crc32ch(WReg::w29, WReg::w28, WReg::w27), \"crc32ch w29, w28, w27\");\n  TEST_SINGLE(crc32cw(WReg::w29, WReg::w28, WReg::w27), \"crc32cw w29, w28, w27\");\n  TEST_SINGLE(smax(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"smax w29, w28, w27\");\n  TEST_SINGLE(umax(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"umax w29, w28, w27\");\n  TEST_SINGLE(smin(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"smin w29, w28, w27\");\n  TEST_SINGLE(umin(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"umin w29, w28, w27\");\n\n  TEST_SINGLE(udiv(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"udiv x29, x28, x27\");\n  TEST_SINGLE(sdiv(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"sdiv x29, x28, x27\");\n  TEST_SINGLE(lslv(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"lsl x29, x28, x27\");\n  TEST_SINGLE(lsrv(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"lsr x29, x28, x27\");\n  TEST_SINGLE(asrv(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"asr x29, x28, x27\");\n  TEST_SINGLE(rorv(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"ror x29, x28, x27\");\n  TEST_SINGLE(smax(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"smax x29, x28, x27\");\n  TEST_SINGLE(umax(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"umax x29, x28, x27\");\n  TEST_SINGLE(smin(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"smin x29, x28, x27\");\n  TEST_SINGLE(umin(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"umin x29, x28, x27\");\n\n  if (false) {\n    // vixl doesn't support this instruction.\n    TEST_SINGLE(subp(XReg::x29, XReg::x28, XReg::x27), \"subp x29, x28, x27\");\n    TEST_SINGLE(irg(XReg::x29, XReg::x28, XReg::x27), \"irg x29, x28, x27\");\n    TEST_SINGLE(gmi(XReg::x29, XReg::x28, XReg::x27), \"gmi x29, x28, x27\");\n  }\n\n  TEST_SINGLE(pacga(XReg::x29, XReg::x28, XReg::x27), \"pacga x29, x28, x27\");\n  TEST_SINGLE(crc32x(XReg::x29, XReg::x28, XReg::x27), \"crc32x w29, w28, x27\");\n  TEST_SINGLE(crc32cx(XReg::x29, XReg::x28, XReg::x27), \"crc32cx w29, w28, x27\");\n\n  if (false) {\n    // vixl doesn't support this instruction.\n    TEST_SINGLE(subps(XReg::x29, XReg::x28, XReg::x27), \"subps x29, x28, x27\");\n  }\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Data processing - 1 source\") {\n  TEST_SINGLE(rbit(Size::i32Bit, Reg::r29, Reg::r28), \"rbit w29, w28\");\n  TEST_SINGLE(rbit(Size::i64Bit, Reg::r29, Reg::r28), \"rbit x29, x28\");\n\n  TEST_SINGLE(rev16(Size::i32Bit, Reg::r29, Reg::r28), \"rev16 w29, w28\");\n  TEST_SINGLE(rev16(Size::i64Bit, Reg::r29, Reg::r28), \"rev16 x29, x28\");\n\n  TEST_SINGLE(rev(WReg::w29, WReg::w28), \"rev w29, w28\");\n  TEST_SINGLE(rev32(XReg::x29, XReg::x28), \"rev32 x29, x28\");\n\n  TEST_SINGLE(clz(Size::i32Bit, Reg::r29, Reg::r28), \"clz w29, w28\");\n  TEST_SINGLE(clz(Size::i64Bit, Reg::r29, Reg::r28), \"clz x29, x28\");\n\n  TEST_SINGLE(cls(Size::i32Bit, Reg::r29, Reg::r28), \"cls w29, w28\");\n  TEST_SINGLE(cls(Size::i64Bit, Reg::r29, Reg::r28), \"cls x29, x28\");\n\n  TEST_SINGLE(rev(XReg::x29, XReg::x28), \"rev x29, x28\");\n  TEST_SINGLE(rev(Size::i32Bit, Reg::r29, Reg::r28), \"rev w29, w28\");\n  TEST_SINGLE(rev(Size::i64Bit, Reg::r29, Reg::r28), \"rev x29, x28\");\n\n  TEST_SINGLE(ctz(Size::i32Bit, Reg::r29, Reg::r28), \"ctz w29, w28\");\n  TEST_SINGLE(ctz(Size::i64Bit, Reg::r29, Reg::r28), \"ctz x29, x28\");\n\n  TEST_SINGLE(cnt(Size::i32Bit, Reg::r29, Reg::r28), \"cnt w29, w28\");\n  TEST_SINGLE(cnt(Size::i64Bit, Reg::r29, Reg::r28), \"cnt x29, x28\");\n\n  TEST_SINGLE(abs(Size::i32Bit, Reg::r29, Reg::r28), \"abs w29, w28\");\n  TEST_SINGLE(abs(Size::i64Bit, Reg::r29, Reg::r28), \"abs x29, x28\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: PAUTH\") {\n  // TODO: Implement in the emitter.\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Logical - shifted register\") {\n  TEST_SINGLE(mov(Size::i32Bit, Reg::r29, Reg::r28), \"mov w29, w28\");\n  TEST_SINGLE(mov(Size::i64Bit, Reg::r29, Reg::r28), \"mov x29, x28\");\n\n  TEST_SINGLE(mov(WReg::w29, WReg::w28), \"mov w29, w28\");\n  TEST_SINGLE(mov(XReg::x29, XReg::x28), \"mov x29, x28\");\n\n  TEST_SINGLE(mvn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::LSL, 0), \"mvn w29, w28\");\n  TEST_SINGLE(mvn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::LSL, 1), \"mvn w29, w28, lsl #1\");\n  TEST_SINGLE(mvn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::LSL, 31), \"mvn w29, w28, lsl #31\");\n\n  TEST_SINGLE(mvn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::LSR, 0), \"mvn w29, w28\");\n  TEST_SINGLE(mvn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::LSR, 1), \"mvn w29, w28, lsr #1\");\n  TEST_SINGLE(mvn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::LSR, 31), \"mvn w29, w28, lsr #31\");\n\n  TEST_SINGLE(mvn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::ASR, 0), \"mvn w29, w28\");\n  TEST_SINGLE(mvn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::ASR, 1), \"mvn w29, w28, asr #1\");\n  TEST_SINGLE(mvn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::ASR, 31), \"mvn w29, w28, asr #31\");\n\n  TEST_SINGLE(mvn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::ROR, 0), \"mvn w29, w28\");\n  TEST_SINGLE(mvn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::ROR, 1), \"mvn w29, w28, ror #1\");\n  TEST_SINGLE(mvn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::ROR, 31), \"mvn w29, w28, ror #31\");\n\n  TEST_SINGLE(mvn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::LSL, 0), \"mvn x29, x28\");\n  TEST_SINGLE(mvn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::LSL, 1), \"mvn x29, x28, lsl #1\");\n  TEST_SINGLE(mvn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::LSL, 63), \"mvn x29, x28, lsl #63\");\n\n  TEST_SINGLE(mvn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::LSR, 0), \"mvn x29, x28\");\n  TEST_SINGLE(mvn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::LSR, 1), \"mvn x29, x28, lsr #1\");\n  TEST_SINGLE(mvn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::LSR, 63), \"mvn x29, x28, lsr #63\");\n\n  TEST_SINGLE(mvn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::ASR, 0), \"mvn x29, x28\");\n  TEST_SINGLE(mvn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::ASR, 1), \"mvn x29, x28, asr #1\");\n  TEST_SINGLE(mvn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::ASR, 63), \"mvn x29, x28, asr #63\");\n\n  TEST_SINGLE(mvn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::ROR, 0), \"mvn x29, x28\");\n  TEST_SINGLE(mvn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::ROR, 1), \"mvn x29, x28, ror #1\");\n  TEST_SINGLE(mvn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::ROR, 63), \"mvn x29, x28, ror #63\");\n\n  TEST_SINGLE(and_(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"and w29, w28, w27\");\n  TEST_SINGLE(and_(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"and w29, w28, w27, lsl #1\");\n  TEST_SINGLE(and_(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 31), \"and w29, w28, w27, lsl #31\");\n\n  TEST_SINGLE(and_(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"and w29, w28, w27\");\n  TEST_SINGLE(and_(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"and w29, w28, w27, lsr #1\");\n  TEST_SINGLE(and_(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 31), \"and w29, w28, w27, lsr #31\");\n\n  TEST_SINGLE(and_(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"and w29, w28, w27\");\n  TEST_SINGLE(and_(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"and w29, w28, w27, asr #1\");\n  TEST_SINGLE(and_(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 31), \"and w29, w28, w27, asr #31\");\n\n  TEST_SINGLE(and_(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"and w29, w28, w27\");\n  TEST_SINGLE(and_(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"and w29, w28, w27, ror #1\");\n  TEST_SINGLE(and_(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 31), \"and w29, w28, w27, ror #31\");\n\n  TEST_SINGLE(and_(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"and x29, x28, x27\");\n  TEST_SINGLE(and_(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"and x29, x28, x27, lsl #1\");\n  TEST_SINGLE(and_(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 63), \"and x29, x28, x27, lsl #63\");\n\n  TEST_SINGLE(and_(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"and x29, x28, x27\");\n  TEST_SINGLE(and_(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"and x29, x28, x27, lsr #1\");\n  TEST_SINGLE(and_(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 63), \"and x29, x28, x27, lsr #63\");\n\n  TEST_SINGLE(and_(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"and x29, x28, x27\");\n  TEST_SINGLE(and_(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"and x29, x28, x27, asr #1\");\n  TEST_SINGLE(and_(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 63), \"and x29, x28, x27, asr #63\");\n\n  TEST_SINGLE(and_(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"and x29, x28, x27\");\n  TEST_SINGLE(and_(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"and x29, x28, x27, ror #1\");\n  TEST_SINGLE(and_(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 63), \"and x29, x28, x27, ror #63\");\n\n  TEST_SINGLE(ands(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"ands w29, w28, w27\");\n  TEST_SINGLE(ands(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"ands w29, w28, w27, lsl #1\");\n  TEST_SINGLE(ands(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 31), \"ands w29, w28, w27, lsl #31\");\n\n  TEST_SINGLE(ands(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"ands w29, w28, w27\");\n  TEST_SINGLE(ands(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"ands w29, w28, w27, lsr #1\");\n  TEST_SINGLE(ands(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 31), \"ands w29, w28, w27, lsr #31\");\n\n  TEST_SINGLE(ands(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"ands w29, w28, w27\");\n  TEST_SINGLE(ands(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"ands w29, w28, w27, asr #1\");\n  TEST_SINGLE(ands(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 31), \"ands w29, w28, w27, asr #31\");\n\n  TEST_SINGLE(ands(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"ands w29, w28, w27\");\n  TEST_SINGLE(ands(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"ands w29, w28, w27, ror #1\");\n  TEST_SINGLE(ands(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 31), \"ands w29, w28, w27, ror #31\");\n\n  TEST_SINGLE(ands(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"ands x29, x28, x27\");\n  TEST_SINGLE(ands(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"ands x29, x28, x27, lsl #1\");\n  TEST_SINGLE(ands(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 63), \"ands x29, x28, x27, lsl #63\");\n\n  TEST_SINGLE(ands(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"ands x29, x28, x27\");\n  TEST_SINGLE(ands(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"ands x29, x28, x27, lsr #1\");\n  TEST_SINGLE(ands(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 63), \"ands x29, x28, x27, lsr #63\");\n\n  TEST_SINGLE(ands(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"ands x29, x28, x27\");\n  TEST_SINGLE(ands(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"ands x29, x28, x27, asr #1\");\n  TEST_SINGLE(ands(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 63), \"ands x29, x28, x27, asr #63\");\n\n  TEST_SINGLE(ands(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"ands x29, x28, x27\");\n  TEST_SINGLE(ands(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"ands x29, x28, x27, ror #1\");\n  TEST_SINGLE(ands(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 63), \"ands x29, x28, x27, ror #63\");\n\n  TEST_SINGLE(bic(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"bic w29, w28, w27\");\n  TEST_SINGLE(bic(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"bic w29, w28, w27, lsl #1\");\n  TEST_SINGLE(bic(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 31), \"bic w29, w28, w27, lsl #31\");\n\n  TEST_SINGLE(bic(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"bic w29, w28, w27\");\n  TEST_SINGLE(bic(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"bic w29, w28, w27, lsr #1\");\n  TEST_SINGLE(bic(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 31), \"bic w29, w28, w27, lsr #31\");\n\n  TEST_SINGLE(bic(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"bic w29, w28, w27\");\n  TEST_SINGLE(bic(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"bic w29, w28, w27, asr #1\");\n  TEST_SINGLE(bic(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 31), \"bic w29, w28, w27, asr #31\");\n\n  TEST_SINGLE(bic(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"bic w29, w28, w27\");\n  TEST_SINGLE(bic(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"bic w29, w28, w27, ror #1\");\n  TEST_SINGLE(bic(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 31), \"bic w29, w28, w27, ror #31\");\n\n  TEST_SINGLE(bic(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"bic x29, x28, x27\");\n  TEST_SINGLE(bic(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"bic x29, x28, x27, lsl #1\");\n  TEST_SINGLE(bic(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 63), \"bic x29, x28, x27, lsl #63\");\n\n  TEST_SINGLE(bic(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"bic x29, x28, x27\");\n  TEST_SINGLE(bic(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"bic x29, x28, x27, lsr #1\");\n  TEST_SINGLE(bic(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 63), \"bic x29, x28, x27, lsr #63\");\n\n  TEST_SINGLE(bic(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"bic x29, x28, x27\");\n  TEST_SINGLE(bic(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"bic x29, x28, x27, asr #1\");\n  TEST_SINGLE(bic(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 63), \"bic x29, x28, x27, asr #63\");\n\n  TEST_SINGLE(bic(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"bic x29, x28, x27\");\n  TEST_SINGLE(bic(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"bic x29, x28, x27, ror #1\");\n  TEST_SINGLE(bic(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 63), \"bic x29, x28, x27, ror #63\");\n\n  TEST_SINGLE(bics(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"bics w29, w28, w27\");\n  TEST_SINGLE(bics(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"bics w29, w28, w27, lsl #1\");\n  TEST_SINGLE(bics(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 31), \"bics w29, w28, w27, lsl #31\");\n\n  TEST_SINGLE(bics(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"bics w29, w28, w27\");\n  TEST_SINGLE(bics(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"bics w29, w28, w27, lsr #1\");\n  TEST_SINGLE(bics(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 31), \"bics w29, w28, w27, lsr #31\");\n\n  TEST_SINGLE(bics(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"bics w29, w28, w27\");\n  TEST_SINGLE(bics(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"bics w29, w28, w27, asr #1\");\n  TEST_SINGLE(bics(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 31), \"bics w29, w28, w27, asr #31\");\n\n  TEST_SINGLE(bics(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"bics w29, w28, w27\");\n  TEST_SINGLE(bics(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"bics w29, w28, w27, ror #1\");\n  TEST_SINGLE(bics(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 31), \"bics w29, w28, w27, ror #31\");\n\n  TEST_SINGLE(bics(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"bics x29, x28, x27\");\n  TEST_SINGLE(bics(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"bics x29, x28, x27, lsl #1\");\n  TEST_SINGLE(bics(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 63), \"bics x29, x28, x27, lsl #63\");\n\n  TEST_SINGLE(bics(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"bics x29, x28, x27\");\n  TEST_SINGLE(bics(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"bics x29, x28, x27, lsr #1\");\n  TEST_SINGLE(bics(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 63), \"bics x29, x28, x27, lsr #63\");\n\n  TEST_SINGLE(bics(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"bics x29, x28, x27\");\n  TEST_SINGLE(bics(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"bics x29, x28, x27, asr #1\");\n  TEST_SINGLE(bics(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 63), \"bics x29, x28, x27, asr #63\");\n\n  TEST_SINGLE(bics(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"bics x29, x28, x27\");\n  TEST_SINGLE(bics(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"bics x29, x28, x27, ror #1\");\n  TEST_SINGLE(bics(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 63), \"bics x29, x28, x27, ror #63\");\n\n  TEST_SINGLE(orr(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"orr w29, w28, w27\");\n  TEST_SINGLE(orr(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"orr w29, w28, w27, lsl #1\");\n  TEST_SINGLE(orr(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 31), \"orr w29, w28, w27, lsl #31\");\n\n  TEST_SINGLE(orr(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"orr w29, w28, w27\");\n  TEST_SINGLE(orr(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"orr w29, w28, w27, lsr #1\");\n  TEST_SINGLE(orr(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 31), \"orr w29, w28, w27, lsr #31\");\n\n  TEST_SINGLE(orr(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"orr w29, w28, w27\");\n  TEST_SINGLE(orr(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"orr w29, w28, w27, asr #1\");\n  TEST_SINGLE(orr(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 31), \"orr w29, w28, w27, asr #31\");\n\n  TEST_SINGLE(orr(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"orr w29, w28, w27\");\n  TEST_SINGLE(orr(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"orr w29, w28, w27, ror #1\");\n  TEST_SINGLE(orr(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 31), \"orr w29, w28, w27, ror #31\");\n\n  TEST_SINGLE(orr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"orr x29, x28, x27\");\n  TEST_SINGLE(orr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"orr x29, x28, x27, lsl #1\");\n  TEST_SINGLE(orr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 63), \"orr x29, x28, x27, lsl #63\");\n\n  TEST_SINGLE(orr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"orr x29, x28, x27\");\n  TEST_SINGLE(orr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"orr x29, x28, x27, lsr #1\");\n  TEST_SINGLE(orr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 63), \"orr x29, x28, x27, lsr #63\");\n\n  TEST_SINGLE(orr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"orr x29, x28, x27\");\n  TEST_SINGLE(orr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"orr x29, x28, x27, asr #1\");\n  TEST_SINGLE(orr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 63), \"orr x29, x28, x27, asr #63\");\n\n  TEST_SINGLE(orr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"orr x29, x28, x27\");\n  TEST_SINGLE(orr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"orr x29, x28, x27, ror #1\");\n  TEST_SINGLE(orr(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 63), \"orr x29, x28, x27, ror #63\");\n\n  TEST_SINGLE(orn(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"orn w29, w28, w27\");\n  TEST_SINGLE(orn(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"orn w29, w28, w27, lsl #1\");\n  TEST_SINGLE(orn(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 31), \"orn w29, w28, w27, lsl #31\");\n\n  TEST_SINGLE(orn(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"orn w29, w28, w27\");\n  TEST_SINGLE(orn(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"orn w29, w28, w27, lsr #1\");\n  TEST_SINGLE(orn(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 31), \"orn w29, w28, w27, lsr #31\");\n\n  TEST_SINGLE(orn(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"orn w29, w28, w27\");\n  TEST_SINGLE(orn(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"orn w29, w28, w27, asr #1\");\n  TEST_SINGLE(orn(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 31), \"orn w29, w28, w27, asr #31\");\n\n  TEST_SINGLE(orn(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"orn w29, w28, w27\");\n  TEST_SINGLE(orn(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"orn w29, w28, w27, ror #1\");\n  TEST_SINGLE(orn(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 31), \"orn w29, w28, w27, ror #31\");\n\n  TEST_SINGLE(orn(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"orn x29, x28, x27\");\n  TEST_SINGLE(orn(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"orn x29, x28, x27, lsl #1\");\n  TEST_SINGLE(orn(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 63), \"orn x29, x28, x27, lsl #63\");\n\n  TEST_SINGLE(orn(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"orn x29, x28, x27\");\n  TEST_SINGLE(orn(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"orn x29, x28, x27, lsr #1\");\n  TEST_SINGLE(orn(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 63), \"orn x29, x28, x27, lsr #63\");\n\n  TEST_SINGLE(orn(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"orn x29, x28, x27\");\n  TEST_SINGLE(orn(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"orn x29, x28, x27, asr #1\");\n  TEST_SINGLE(orn(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 63), \"orn x29, x28, x27, asr #63\");\n\n  TEST_SINGLE(orn(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"orn x29, x28, x27\");\n  TEST_SINGLE(orn(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"orn x29, x28, x27, ror #1\");\n  TEST_SINGLE(orn(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 63), \"orn x29, x28, x27, ror #63\");\n\n  TEST_SINGLE(eor(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"eor w29, w28, w27\");\n  TEST_SINGLE(eor(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"eor w29, w28, w27, lsl #1\");\n  TEST_SINGLE(eor(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 31), \"eor w29, w28, w27, lsl #31\");\n\n  TEST_SINGLE(eor(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"eor w29, w28, w27\");\n  TEST_SINGLE(eor(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"eor w29, w28, w27, lsr #1\");\n  TEST_SINGLE(eor(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 31), \"eor w29, w28, w27, lsr #31\");\n\n  TEST_SINGLE(eor(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"eor w29, w28, w27\");\n  TEST_SINGLE(eor(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"eor w29, w28, w27, asr #1\");\n  TEST_SINGLE(eor(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 31), \"eor w29, w28, w27, asr #31\");\n\n  TEST_SINGLE(eor(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"eor w29, w28, w27\");\n  TEST_SINGLE(eor(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"eor w29, w28, w27, ror #1\");\n  TEST_SINGLE(eor(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 31), \"eor w29, w28, w27, ror #31\");\n\n  TEST_SINGLE(eor(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"eor x29, x28, x27\");\n  TEST_SINGLE(eor(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"eor x29, x28, x27, lsl #1\");\n  TEST_SINGLE(eor(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 63), \"eor x29, x28, x27, lsl #63\");\n\n  TEST_SINGLE(eor(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"eor x29, x28, x27\");\n  TEST_SINGLE(eor(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"eor x29, x28, x27, lsr #1\");\n  TEST_SINGLE(eor(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 63), \"eor x29, x28, x27, lsr #63\");\n\n  TEST_SINGLE(eor(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"eor x29, x28, x27\");\n  TEST_SINGLE(eor(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"eor x29, x28, x27, asr #1\");\n  TEST_SINGLE(eor(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 63), \"eor x29, x28, x27, asr #63\");\n\n  TEST_SINGLE(eor(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"eor x29, x28, x27\");\n  TEST_SINGLE(eor(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"eor x29, x28, x27, ror #1\");\n  TEST_SINGLE(eor(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 63), \"eor x29, x28, x27, ror #63\");\n\n  TEST_SINGLE(eon(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"eon w29, w28, w27\");\n  TEST_SINGLE(eon(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"eon w29, w28, w27, lsl #1\");\n  TEST_SINGLE(eon(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 31), \"eon w29, w28, w27, lsl #31\");\n\n  TEST_SINGLE(eon(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"eon w29, w28, w27\");\n  TEST_SINGLE(eon(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"eon w29, w28, w27, lsr #1\");\n  TEST_SINGLE(eon(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 31), \"eon w29, w28, w27, lsr #31\");\n\n  TEST_SINGLE(eon(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"eon w29, w28, w27\");\n  TEST_SINGLE(eon(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"eon w29, w28, w27, asr #1\");\n  TEST_SINGLE(eon(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 31), \"eon w29, w28, w27, asr #31\");\n\n  TEST_SINGLE(eon(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"eon w29, w28, w27\");\n  TEST_SINGLE(eon(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"eon w29, w28, w27, ror #1\");\n  TEST_SINGLE(eon(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 31), \"eon w29, w28, w27, ror #31\");\n\n  TEST_SINGLE(eon(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"eon x29, x28, x27\");\n  TEST_SINGLE(eon(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"eon x29, x28, x27, lsl #1\");\n  TEST_SINGLE(eon(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSL, 63), \"eon x29, x28, x27, lsl #63\");\n\n  TEST_SINGLE(eon(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"eon x29, x28, x27\");\n  TEST_SINGLE(eon(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"eon x29, x28, x27, lsr #1\");\n  TEST_SINGLE(eon(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::LSR, 63), \"eon x29, x28, x27, lsr #63\");\n\n  TEST_SINGLE(eon(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"eon x29, x28, x27\");\n  TEST_SINGLE(eon(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"eon x29, x28, x27, asr #1\");\n  TEST_SINGLE(eon(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ASR, 63), \"eon x29, x28, x27, asr #63\");\n\n  TEST_SINGLE(eon(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"eon x29, x28, x27\");\n  TEST_SINGLE(eon(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"eon x29, x28, x27, ror #1\");\n  TEST_SINGLE(eon(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ShiftType::ROR, 63), \"eon x29, x28, x27, ror #63\");\n\n  TEST_SINGLE(tst(Size::i32Bit, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"tst w28, w27\");\n  TEST_SINGLE(tst(Size::i32Bit, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"tst w28, w27, lsl #1\");\n  TEST_SINGLE(tst(Size::i32Bit, Reg::r28, Reg::r27, ShiftType::LSL, 31), \"tst w28, w27, lsl #31\");\n\n  TEST_SINGLE(tst(Size::i32Bit, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"tst w28, w27\");\n  TEST_SINGLE(tst(Size::i32Bit, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"tst w28, w27, lsr #1\");\n  TEST_SINGLE(tst(Size::i32Bit, Reg::r28, Reg::r27, ShiftType::LSR, 31), \"tst w28, w27, lsr #31\");\n\n  TEST_SINGLE(tst(Size::i32Bit, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"tst w28, w27\");\n  TEST_SINGLE(tst(Size::i32Bit, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"tst w28, w27, asr #1\");\n  TEST_SINGLE(tst(Size::i32Bit, Reg::r28, Reg::r27, ShiftType::ASR, 31), \"tst w28, w27, asr #31\");\n\n  TEST_SINGLE(tst(Size::i32Bit, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"tst w28, w27\");\n  TEST_SINGLE(tst(Size::i32Bit, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"tst w28, w27, ror #1\");\n  TEST_SINGLE(tst(Size::i32Bit, Reg::r28, Reg::r27, ShiftType::ROR, 31), \"tst w28, w27, ror #31\");\n\n  TEST_SINGLE(tst(Size::i64Bit, Reg::r28, Reg::r27, ShiftType::LSL, 0), \"tst x28, x27\");\n  TEST_SINGLE(tst(Size::i64Bit, Reg::r28, Reg::r27, ShiftType::LSL, 1), \"tst x28, x27, lsl #1\");\n  TEST_SINGLE(tst(Size::i64Bit, Reg::r28, Reg::r27, ShiftType::LSL, 63), \"tst x28, x27, lsl #63\");\n\n  TEST_SINGLE(tst(Size::i64Bit, Reg::r28, Reg::r27, ShiftType::LSR, 0), \"tst x28, x27\");\n  TEST_SINGLE(tst(Size::i64Bit, Reg::r28, Reg::r27, ShiftType::LSR, 1), \"tst x28, x27, lsr #1\");\n  TEST_SINGLE(tst(Size::i64Bit, Reg::r28, Reg::r27, ShiftType::LSR, 63), \"tst x28, x27, lsr #63\");\n\n  TEST_SINGLE(tst(Size::i64Bit, Reg::r28, Reg::r27, ShiftType::ASR, 0), \"tst x28, x27\");\n  TEST_SINGLE(tst(Size::i64Bit, Reg::r28, Reg::r27, ShiftType::ASR, 1), \"tst x28, x27, asr #1\");\n  TEST_SINGLE(tst(Size::i64Bit, Reg::r28, Reg::r27, ShiftType::ASR, 63), \"tst x28, x27, asr #63\");\n\n  TEST_SINGLE(tst(Size::i64Bit, Reg::r28, Reg::r27, ShiftType::ROR, 0), \"tst x28, x27\");\n  TEST_SINGLE(tst(Size::i64Bit, Reg::r28, Reg::r27, ShiftType::ROR, 1), \"tst x28, x27, ror #1\");\n  TEST_SINGLE(tst(Size::i64Bit, Reg::r28, Reg::r27, ShiftType::ROR, 63), \"tst x28, x27, ror #63\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: AddSub - shifted register\") {\n  {\n    TEST_SINGLE(add(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28), \"add x30, x29, x28\");\n    TEST_SINGLE(add(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28), \"add w30, w29, w28\");\n\n    // LSL\n    TEST_SINGLE(add(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 1), \"add x30, x29, x28, lsl #1\");\n    TEST_SINGLE(add(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 1), \"add w30, w29, w28, lsl #1\");\n    TEST_SINGLE(add(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 63), \"add x30, x29, x28, lsl #63\");\n    TEST_SINGLE(add(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 31), \"add w30, w29, w28, lsl #31\");\n\n    // LSR\n    TEST_SINGLE(add(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 1), \"add x30, x29, x28, lsr #1\");\n    TEST_SINGLE(add(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 1), \"add w30, w29, w28, lsr #1\");\n    TEST_SINGLE(add(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 63), \"add x30, x29, x28, lsr #63\");\n    TEST_SINGLE(add(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 31), \"add w30, w29, w28, lsr #31\");\n\n    // ASR\n    TEST_SINGLE(add(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 1), \"add x30, x29, x28, asr #1\");\n    TEST_SINGLE(add(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 1), \"add w30, w29, w28, asr #1\");\n    TEST_SINGLE(add(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 63), \"add x30, x29, x28, asr #63\");\n    TEST_SINGLE(add(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 31), \"add w30, w29, w28, asr #31\");\n\n    // ROR\n    // Unsupported\n  }\n\n  {\n    TEST_SINGLE(adds(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28), \"adds x30, x29, x28\");\n    TEST_SINGLE(adds(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28), \"adds w30, w29, w28\");\n\n    // LSL\n    TEST_SINGLE(adds(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 1), \"adds x30, x29, x28, lsl #1\");\n    TEST_SINGLE(adds(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 1), \"adds w30, w29, w28, lsl #1\");\n    TEST_SINGLE(adds(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 63), \"adds x30, x29, x28, lsl #63\");\n    TEST_SINGLE(adds(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 31), \"adds w30, w29, w28, lsl #31\");\n\n    // LSR\n    TEST_SINGLE(adds(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 1), \"adds x30, x29, x28, lsr #1\");\n    TEST_SINGLE(adds(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 1), \"adds w30, w29, w28, lsr #1\");\n    TEST_SINGLE(adds(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 63), \"adds x30, x29, x28, lsr #63\");\n    TEST_SINGLE(adds(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 31), \"adds w30, w29, w28, lsr #31\");\n\n    // ASR\n    TEST_SINGLE(adds(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 1), \"adds x30, x29, x28, asr #1\");\n    TEST_SINGLE(adds(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 1), \"adds w30, w29, w28, asr #1\");\n    TEST_SINGLE(adds(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 63), \"adds x30, x29, x28, asr #63\");\n    TEST_SINGLE(adds(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 31), \"adds w30, w29, w28, asr #31\");\n\n    // ROR\n    // Unsupported\n  }\n\n  {\n    TEST_SINGLE(cmn(Size::i64Bit, Reg::r29, Reg::r28), \"cmn x29, x28\");\n    TEST_SINGLE(cmn(Size::i32Bit, Reg::r29, Reg::r28), \"cmn w29, w28\");\n\n    // LSL\n    TEST_SINGLE(cmn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::LSL, 1), \"cmn x29, x28, lsl #1\");\n    TEST_SINGLE(cmn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::LSL, 1), \"cmn w29, w28, lsl #1\");\n    TEST_SINGLE(cmn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::LSL, 63), \"cmn x29, x28, lsl #63\");\n    TEST_SINGLE(cmn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::LSL, 31), \"cmn w29, w28, lsl #31\");\n\n    // LSR\n    TEST_SINGLE(cmn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::LSR, 1), \"cmn x29, x28, lsr #1\");\n    TEST_SINGLE(cmn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::LSR, 1), \"cmn w29, w28, lsr #1\");\n    TEST_SINGLE(cmn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::LSR, 63), \"cmn x29, x28, lsr #63\");\n    TEST_SINGLE(cmn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::LSR, 31), \"cmn w29, w28, lsr #31\");\n\n    // ASR\n    TEST_SINGLE(cmn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::ASR, 1), \"cmn x29, x28, asr #1\");\n    TEST_SINGLE(cmn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::ASR, 1), \"cmn w29, w28, asr #1\");\n    TEST_SINGLE(cmn(Size::i64Bit, Reg::r29, Reg::r28, ShiftType::ASR, 63), \"cmn x29, x28, asr #63\");\n    TEST_SINGLE(cmn(Size::i32Bit, Reg::r29, Reg::r28, ShiftType::ASR, 31), \"cmn w29, w28, asr #31\");\n\n    // ROR\n    // Unsupported\n  }\n\n  // FEX had a bug with this\n  TEST_SINGLE(sub(Size::i64Bit, Reg::rsp, Reg::rsp, Reg::r0, ShiftType::LSL, 0), \"neg xzr, x0\");\n\n  {\n    TEST_SINGLE(sub(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28), \"sub x30, x29, x28\");\n    TEST_SINGLE(sub(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28), \"sub w30, w29, w28\");\n\n    // LSL\n    TEST_SINGLE(sub(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 1), \"sub x30, x29, x28, lsl #1\");\n    TEST_SINGLE(sub(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 1), \"sub w30, w29, w28, lsl #1\");\n    TEST_SINGLE(sub(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 63), \"sub x30, x29, x28, lsl #63\");\n    TEST_SINGLE(sub(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 31), \"sub w30, w29, w28, lsl #31\");\n\n    // LSR\n    TEST_SINGLE(sub(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 1), \"sub x30, x29, x28, lsr #1\");\n    TEST_SINGLE(sub(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 1), \"sub w30, w29, w28, lsr #1\");\n    TEST_SINGLE(sub(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 63), \"sub x30, x29, x28, lsr #63\");\n    TEST_SINGLE(sub(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 31), \"sub w30, w29, w28, lsr #31\");\n\n    // ASR\n    TEST_SINGLE(sub(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 1), \"sub x30, x29, x28, asr #1\");\n    TEST_SINGLE(sub(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 1), \"sub w30, w29, w28, asr #1\");\n    TEST_SINGLE(sub(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 63), \"sub x30, x29, x28, asr #63\");\n    TEST_SINGLE(sub(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 31), \"sub w30, w29, w28, asr #31\");\n\n    // ROR\n    // Unsupported\n  }\n\n  {\n    TEST_SINGLE(subs(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28), \"subs x30, x29, x28\");\n    TEST_SINGLE(subs(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28), \"subs w30, w29, w28\");\n\n    // LSL\n    TEST_SINGLE(subs(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 1), \"subs x30, x29, x28, lsl #1\");\n    TEST_SINGLE(subs(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 1), \"subs w30, w29, w28, lsl #1\");\n    TEST_SINGLE(subs(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 63), \"subs x30, x29, x28, lsl #63\");\n    TEST_SINGLE(subs(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSL, 31), \"subs w30, w29, w28, lsl #31\");\n\n    // LSR\n    TEST_SINGLE(subs(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 1), \"subs x30, x29, x28, lsr #1\");\n    TEST_SINGLE(subs(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 1), \"subs w30, w29, w28, lsr #1\");\n    TEST_SINGLE(subs(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 63), \"subs x30, x29, x28, lsr #63\");\n    TEST_SINGLE(subs(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::LSR, 31), \"subs w30, w29, w28, lsr #31\");\n\n    // ASR\n    TEST_SINGLE(subs(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 1), \"subs x30, x29, x28, asr #1\");\n    TEST_SINGLE(subs(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 1), \"subs w30, w29, w28, asr #1\");\n    TEST_SINGLE(subs(Size::i64Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 63), \"subs x30, x29, x28, asr #63\");\n    TEST_SINGLE(subs(Size::i32Bit, Reg::r30, Reg::r29, Reg::r28, ShiftType::ASR, 31), \"subs w30, w29, w28, asr #31\");\n\n    // ROR\n    // Unsupported\n  }\n\n  {\n    TEST_SINGLE(neg(Size::i64Bit, Reg::r30, Reg::r29), \"neg x30, x29\");\n    TEST_SINGLE(neg(Size::i32Bit, Reg::r30, Reg::r29), \"neg w30, w29\");\n\n    // LSL\n    TEST_SINGLE(neg(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::LSL, 1), \"neg x30, x29, lsl #1\");\n    TEST_SINGLE(neg(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::LSL, 1), \"neg w30, w29, lsl #1\");\n    TEST_SINGLE(neg(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::LSL, 63), \"neg x30, x29, lsl #63\");\n    TEST_SINGLE(neg(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::LSL, 31), \"neg w30, w29, lsl #31\");\n\n    // LSR\n    TEST_SINGLE(neg(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::LSR, 1), \"neg x30, x29, lsr #1\");\n    TEST_SINGLE(neg(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::LSR, 1), \"neg w30, w29, lsr #1\");\n    TEST_SINGLE(neg(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::LSR, 63), \"neg x30, x29, lsr #63\");\n    TEST_SINGLE(neg(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::LSR, 31), \"neg w30, w29, lsr #31\");\n\n    // ASR\n    TEST_SINGLE(neg(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::ASR, 1), \"neg x30, x29, asr #1\");\n    TEST_SINGLE(neg(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::ASR, 1), \"neg w30, w29, asr #1\");\n    TEST_SINGLE(neg(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::ASR, 63), \"neg x30, x29, asr #63\");\n    TEST_SINGLE(neg(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::ASR, 31), \"neg w30, w29, asr #31\");\n\n    // ROR\n    // Unsupported\n  }\n\n  {\n    TEST_SINGLE(cmp(Size::i64Bit, Reg::r30, Reg::r29), \"cmp x30, x29\");\n    TEST_SINGLE(cmp(Size::i32Bit, Reg::r30, Reg::r29), \"cmp w30, w29\");\n\n    // LSL\n    TEST_SINGLE(cmp(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::LSL, 1), \"cmp x30, x29, lsl #1\");\n    TEST_SINGLE(cmp(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::LSL, 1), \"cmp w30, w29, lsl #1\");\n    TEST_SINGLE(cmp(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::LSL, 63), \"cmp x30, x29, lsl #63\");\n    TEST_SINGLE(cmp(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::LSL, 31), \"cmp w30, w29, lsl #31\");\n\n    // LSR\n    TEST_SINGLE(cmp(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::LSR, 1), \"cmp x30, x29, lsr #1\");\n    TEST_SINGLE(cmp(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::LSR, 1), \"cmp w30, w29, lsr #1\");\n    TEST_SINGLE(cmp(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::LSR, 63), \"cmp x30, x29, lsr #63\");\n    TEST_SINGLE(cmp(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::LSR, 31), \"cmp w30, w29, lsr #31\");\n\n    // ASR\n    TEST_SINGLE(cmp(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::ASR, 1), \"cmp x30, x29, asr #1\");\n    TEST_SINGLE(cmp(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::ASR, 1), \"cmp w30, w29, asr #1\");\n    TEST_SINGLE(cmp(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::ASR, 63), \"cmp x30, x29, asr #63\");\n    TEST_SINGLE(cmp(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::ASR, 31), \"cmp w30, w29, asr #31\");\n\n    // ROR\n    // Unsupported\n  }\n\n  {\n    TEST_SINGLE(negs(Size::i64Bit, Reg::r30, Reg::r29), \"negs x30, x29\");\n    TEST_SINGLE(negs(Size::i32Bit, Reg::r30, Reg::r29), \"negs w30, w29\");\n\n    // LSL\n    TEST_SINGLE(negs(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::LSL, 1), \"negs x30, x29, lsl #1\");\n    TEST_SINGLE(negs(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::LSL, 1), \"negs w30, w29, lsl #1\");\n    TEST_SINGLE(negs(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::LSL, 63), \"negs x30, x29, lsl #63\");\n    TEST_SINGLE(negs(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::LSL, 31), \"negs w30, w29, lsl #31\");\n\n    // LSR\n    TEST_SINGLE(negs(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::LSR, 1), \"negs x30, x29, lsr #1\");\n    TEST_SINGLE(negs(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::LSR, 1), \"negs w30, w29, lsr #1\");\n    TEST_SINGLE(negs(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::LSR, 63), \"negs x30, x29, lsr #63\");\n    TEST_SINGLE(negs(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::LSR, 31), \"negs w30, w29, lsr #31\");\n\n    // ASR\n    TEST_SINGLE(negs(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::ASR, 1), \"negs x30, x29, asr #1\");\n    TEST_SINGLE(negs(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::ASR, 1), \"negs w30, w29, asr #1\");\n    TEST_SINGLE(negs(Size::i64Bit, Reg::r30, Reg::r29, ShiftType::ASR, 63), \"negs x30, x29, asr #63\");\n    TEST_SINGLE(negs(Size::i32Bit, Reg::r30, Reg::r29, ShiftType::ASR, 31), \"negs w30, w29, asr #31\");\n\n    // ROR\n    // Unsupported\n  }\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: AddSub - extended register\") {\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 0), \"add w29, w28, w27, uxtb\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 1), \"add w29, w28, w27, uxtb #1\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 2), \"add w29, w28, w27, uxtb #2\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 3), \"add w29, w28, w27, uxtb #3\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 4), \"add w29, w28, w27, uxtb #4\");\n\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 0), \"add w29, w28, w27, uxth\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 1), \"add w29, w28, w27, uxth #1\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 2), \"add w29, w28, w27, uxth #2\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 3), \"add w29, w28, w27, uxth #3\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 4), \"add w29, w28, w27, uxth #4\");\n\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 0), \"add w29, w28, w27, uxtw\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 1), \"add w29, w28, w27, uxtw #1\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 2), \"add w29, w28, w27, uxtw #2\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 3), \"add w29, w28, w27, uxtw #3\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 4), \"add w29, w28, w27, uxtw #4\");\n\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 0), \"add w29, w28, x27, uxtx\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 1), \"add w29, w28, x27, uxtx #1\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 2), \"add w29, w28, x27, uxtx #2\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 3), \"add w29, w28, x27, uxtx #3\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 4), \"add w29, w28, x27, uxtx #4\");\n\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 0), \"add w29, w28, w27, sxtb\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 1), \"add w29, w28, w27, sxtb #1\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 2), \"add w29, w28, w27, sxtb #2\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 3), \"add w29, w28, w27, sxtb #3\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 4), \"add w29, w28, w27, sxtb #4\");\n\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 0), \"add w29, w28, w27, sxth\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 1), \"add w29, w28, w27, sxth #1\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 2), \"add w29, w28, w27, sxth #2\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 3), \"add w29, w28, w27, sxth #3\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 4), \"add w29, w28, w27, sxth #4\");\n\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 0), \"add w29, w28, w27, sxtw\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 1), \"add w29, w28, w27, sxtw #1\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 2), \"add w29, w28, w27, sxtw #2\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 3), \"add w29, w28, w27, sxtw #3\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 4), \"add w29, w28, w27, sxtw #4\");\n\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 0), \"add w29, w28, x27, sxtx\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 1), \"add w29, w28, x27, sxtx #1\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 2), \"add w29, w28, x27, sxtx #2\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 3), \"add w29, w28, x27, sxtx #3\");\n  TEST_SINGLE(add(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 4), \"add w29, w28, x27, sxtx #4\");\n\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 0), \"add x29, x28, w27, uxtb\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 1), \"add x29, x28, w27, uxtb #1\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 2), \"add x29, x28, w27, uxtb #2\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 3), \"add x29, x28, w27, uxtb #3\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 4), \"add x29, x28, w27, uxtb #4\");\n\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 0), \"add x29, x28, w27, uxth\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 1), \"add x29, x28, w27, uxth #1\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 2), \"add x29, x28, w27, uxth #2\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 3), \"add x29, x28, w27, uxth #3\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 4), \"add x29, x28, w27, uxth #4\");\n\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 0), \"add x29, x28, w27, uxtw\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 1), \"add x29, x28, w27, uxtw #1\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 2), \"add x29, x28, w27, uxtw #2\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 3), \"add x29, x28, w27, uxtw #3\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 4), \"add x29, x28, w27, uxtw #4\");\n\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 0), \"add x29, x28, x27, uxtx\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 1), \"add x29, x28, x27, uxtx #1\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 2), \"add x29, x28, x27, uxtx #2\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 3), \"add x29, x28, x27, uxtx #3\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 4), \"add x29, x28, x27, uxtx #4\");\n\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 0), \"add x29, x28, w27, sxtb\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 1), \"add x29, x28, w27, sxtb #1\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 2), \"add x29, x28, w27, sxtb #2\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 3), \"add x29, x28, w27, sxtb #3\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 4), \"add x29, x28, w27, sxtb #4\");\n\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 0), \"add x29, x28, w27, sxth\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 1), \"add x29, x28, w27, sxth #1\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 2), \"add x29, x28, w27, sxth #2\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 3), \"add x29, x28, w27, sxth #3\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 4), \"add x29, x28, w27, sxth #4\");\n\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 0), \"add x29, x28, w27, sxtw\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 1), \"add x29, x28, w27, sxtw #1\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 2), \"add x29, x28, w27, sxtw #2\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 3), \"add x29, x28, w27, sxtw #3\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 4), \"add x29, x28, w27, sxtw #4\");\n\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 0), \"add x29, x28, x27, sxtx\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 1), \"add x29, x28, x27, sxtx #1\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 2), \"add x29, x28, x27, sxtx #2\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 3), \"add x29, x28, x27, sxtx #3\");\n  TEST_SINGLE(add(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 4), \"add x29, x28, x27, sxtx #4\");\n\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 0), \"adds w29, w28, w27, uxtb\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 1), \"adds w29, w28, w27, uxtb #1\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 2), \"adds w29, w28, w27, uxtb #2\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 3), \"adds w29, w28, w27, uxtb #3\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 4), \"adds w29, w28, w27, uxtb #4\");\n\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 0), \"adds w29, w28, w27, uxth\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 1), \"adds w29, w28, w27, uxth #1\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 2), \"adds w29, w28, w27, uxth #2\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 3), \"adds w29, w28, w27, uxth #3\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 4), \"adds w29, w28, w27, uxth #4\");\n\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 0), \"adds w29, w28, w27, uxtw\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 1), \"adds w29, w28, w27, uxtw #1\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 2), \"adds w29, w28, w27, uxtw #2\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 3), \"adds w29, w28, w27, uxtw #3\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 4), \"adds w29, w28, w27, uxtw #4\");\n\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 0), \"adds w29, w28, x27, uxtx\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 1), \"adds w29, w28, x27, uxtx #1\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 2), \"adds w29, w28, x27, uxtx #2\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 3), \"adds w29, w28, x27, uxtx #3\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 4), \"adds w29, w28, x27, uxtx #4\");\n\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 0), \"adds w29, w28, w27, sxtb\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 1), \"adds w29, w28, w27, sxtb #1\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 2), \"adds w29, w28, w27, sxtb #2\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 3), \"adds w29, w28, w27, sxtb #3\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 4), \"adds w29, w28, w27, sxtb #4\");\n\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 0), \"adds w29, w28, w27, sxth\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 1), \"adds w29, w28, w27, sxth #1\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 2), \"adds w29, w28, w27, sxth #2\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 3), \"adds w29, w28, w27, sxth #3\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 4), \"adds w29, w28, w27, sxth #4\");\n\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 0), \"adds w29, w28, w27, sxtw\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 1), \"adds w29, w28, w27, sxtw #1\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 2), \"adds w29, w28, w27, sxtw #2\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 3), \"adds w29, w28, w27, sxtw #3\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 4), \"adds w29, w28, w27, sxtw #4\");\n\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 0), \"adds w29, w28, x27, sxtx\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 1), \"adds w29, w28, x27, sxtx #1\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 2), \"adds w29, w28, x27, sxtx #2\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 3), \"adds w29, w28, x27, sxtx #3\");\n  TEST_SINGLE(adds(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 4), \"adds w29, w28, x27, sxtx #4\");\n\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 0), \"adds x29, x28, w27, uxtb\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 1), \"adds x29, x28, w27, uxtb #1\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 2), \"adds x29, x28, w27, uxtb #2\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 3), \"adds x29, x28, w27, uxtb #3\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 4), \"adds x29, x28, w27, uxtb #4\");\n\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 0), \"adds x29, x28, w27, uxth\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 1), \"adds x29, x28, w27, uxth #1\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 2), \"adds x29, x28, w27, uxth #2\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 3), \"adds x29, x28, w27, uxth #3\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 4), \"adds x29, x28, w27, uxth #4\");\n\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 0), \"adds x29, x28, w27, uxtw\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 1), \"adds x29, x28, w27, uxtw #1\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 2), \"adds x29, x28, w27, uxtw #2\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 3), \"adds x29, x28, w27, uxtw #3\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 4), \"adds x29, x28, w27, uxtw #4\");\n\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 0), \"adds x29, x28, x27, uxtx\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 1), \"adds x29, x28, x27, uxtx #1\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 2), \"adds x29, x28, x27, uxtx #2\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 3), \"adds x29, x28, x27, uxtx #3\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 4), \"adds x29, x28, x27, uxtx #4\");\n\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 0), \"adds x29, x28, w27, sxtb\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 1), \"adds x29, x28, w27, sxtb #1\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 2), \"adds x29, x28, w27, sxtb #2\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 3), \"adds x29, x28, w27, sxtb #3\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 4), \"adds x29, x28, w27, sxtb #4\");\n\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 0), \"adds x29, x28, w27, sxth\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 1), \"adds x29, x28, w27, sxth #1\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 2), \"adds x29, x28, w27, sxth #2\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 3), \"adds x29, x28, w27, sxth #3\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 4), \"adds x29, x28, w27, sxth #4\");\n\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 0), \"adds x29, x28, w27, sxtw\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 1), \"adds x29, x28, w27, sxtw #1\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 2), \"adds x29, x28, w27, sxtw #2\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 3), \"adds x29, x28, w27, sxtw #3\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 4), \"adds x29, x28, w27, sxtw #4\");\n\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 0), \"adds x29, x28, x27, sxtx\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 1), \"adds x29, x28, x27, sxtx #1\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 2), \"adds x29, x28, x27, sxtx #2\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 3), \"adds x29, x28, x27, sxtx #3\");\n  TEST_SINGLE(adds(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 4), \"adds x29, x28, x27, sxtx #4\");\n\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::UXTB, 0), \"cmn w28, w27, uxtb\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::UXTB, 1), \"cmn w28, w27, uxtb #1\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::UXTB, 2), \"cmn w28, w27, uxtb #2\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::UXTB, 3), \"cmn w28, w27, uxtb #3\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::UXTB, 4), \"cmn w28, w27, uxtb #4\");\n\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::UXTH, 0), \"cmn w28, w27, uxth\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::UXTH, 1), \"cmn w28, w27, uxth #1\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::UXTH, 2), \"cmn w28, w27, uxth #2\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::UXTH, 3), \"cmn w28, w27, uxth #3\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::UXTH, 4), \"cmn w28, w27, uxth #4\");\n\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::LSL_32, 0), \"cmn w28, w27\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::LSL_32, 1), \"cmn w28, w27, lsl #1\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::LSL_32, 2), \"cmn w28, w27, lsl #2\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::LSL_32, 3), \"cmn w28, w27, lsl #3\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::LSL_32, 4), \"cmn w28, w27, lsl #4\");\n\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::LSL_64, 0), \"cmn w28, x27\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::LSL_64, 1), \"cmn w28, x27, lsl #1\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::LSL_64, 2), \"cmn w28, x27, lsl #2\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::LSL_64, 3), \"cmn w28, x27, lsl #3\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::LSL_64, 4), \"cmn w28, x27, lsl #4\");\n\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTB, 0), \"cmn w28, w27, sxtb\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTB, 1), \"cmn w28, w27, sxtb #1\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTB, 2), \"cmn w28, w27, sxtb #2\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTB, 3), \"cmn w28, w27, sxtb #3\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTB, 4), \"cmn w28, w27, sxtb #4\");\n\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTH, 0), \"cmn w28, w27, sxth\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTH, 1), \"cmn w28, w27, sxth #1\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTH, 2), \"cmn w28, w27, sxth #2\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTH, 3), \"cmn w28, w27, sxth #3\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTH, 4), \"cmn w28, w27, sxth #4\");\n\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTW, 0), \"cmn w28, w27, sxtw\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTW, 1), \"cmn w28, w27, sxtw #1\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTW, 2), \"cmn w28, w27, sxtw #2\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTW, 3), \"cmn w28, w27, sxtw #3\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTW, 4), \"cmn w28, w27, sxtw #4\");\n\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTX, 0), \"cmn w28, x27, sxtx\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTX, 1), \"cmn w28, x27, sxtx #1\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTX, 2), \"cmn w28, x27, sxtx #2\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTX, 3), \"cmn w28, x27, sxtx #3\");\n  TEST_SINGLE(cmn(Size::i32Bit, Reg::r28, Reg::r27, ExtendedType::SXTX, 4), \"cmn w28, x27, sxtx #4\");\n\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::UXTB, 0), \"cmn x28, w27, uxtb\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::UXTB, 1), \"cmn x28, w27, uxtb #1\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::UXTB, 2), \"cmn x28, w27, uxtb #2\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::UXTB, 3), \"cmn x28, w27, uxtb #3\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::UXTB, 4), \"cmn x28, w27, uxtb #4\");\n\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::UXTH, 0), \"cmn x28, w27, uxth\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::UXTH, 1), \"cmn x28, w27, uxth #1\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::UXTH, 2), \"cmn x28, w27, uxth #2\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::UXTH, 3), \"cmn x28, w27, uxth #3\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::UXTH, 4), \"cmn x28, w27, uxth #4\");\n\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::UXTW, 0), \"cmn x28, w27, uxtw\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::UXTW, 1), \"cmn x28, w27, uxtw #1\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::UXTW, 2), \"cmn x28, w27, uxtw #2\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::UXTW, 3), \"cmn x28, w27, uxtw #3\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::UXTW, 4), \"cmn x28, w27, uxtw #4\");\n\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::LSL_64, 0), \"cmn x28, x27\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::LSL_64, 1), \"cmn x28, x27, lsl #1\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::LSL_64, 2), \"cmn x28, x27, lsl #2\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::LSL_64, 3), \"cmn x28, x27, lsl #3\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::LSL_64, 4), \"cmn x28, x27, lsl #4\");\n\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTB, 0), \"cmn x28, w27, sxtb\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTB, 1), \"cmn x28, w27, sxtb #1\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTB, 2), \"cmn x28, w27, sxtb #2\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTB, 3), \"cmn x28, w27, sxtb #3\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTB, 4), \"cmn x28, w27, sxtb #4\");\n\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTH, 0), \"cmn x28, w27, sxth\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTH, 1), \"cmn x28, w27, sxth #1\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTH, 2), \"cmn x28, w27, sxth #2\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTH, 3), \"cmn x28, w27, sxth #3\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTH, 4), \"cmn x28, w27, sxth #4\");\n\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTW, 0), \"cmn x28, w27, sxtw\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTW, 1), \"cmn x28, w27, sxtw #1\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTW, 2), \"cmn x28, w27, sxtw #2\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTW, 3), \"cmn x28, w27, sxtw #3\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTW, 4), \"cmn x28, w27, sxtw #4\");\n\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTX, 0), \"cmn x28, x27, sxtx\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTX, 1), \"cmn x28, x27, sxtx #1\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTX, 2), \"cmn x28, x27, sxtx #2\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTX, 3), \"cmn x28, x27, sxtx #3\");\n  TEST_SINGLE(cmn(Size::i64Bit, Reg::r28, Reg::r27, ExtendedType::SXTX, 4), \"cmn x28, x27, sxtx #4\");\n\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 0), \"sub w29, w28, w27, uxtb\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 1), \"sub w29, w28, w27, uxtb #1\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 2), \"sub w29, w28, w27, uxtb #2\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 3), \"sub w29, w28, w27, uxtb #3\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 4), \"sub w29, w28, w27, uxtb #4\");\n\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 0), \"sub w29, w28, w27, uxth\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 1), \"sub w29, w28, w27, uxth #1\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 2), \"sub w29, w28, w27, uxth #2\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 3), \"sub w29, w28, w27, uxth #3\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 4), \"sub w29, w28, w27, uxth #4\");\n\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 0), \"sub w29, w28, w27, uxtw\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 1), \"sub w29, w28, w27, uxtw #1\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 2), \"sub w29, w28, w27, uxtw #2\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 3), \"sub w29, w28, w27, uxtw #3\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 4), \"sub w29, w28, w27, uxtw #4\");\n\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 0), \"sub w29, w28, x27, uxtx\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 1), \"sub w29, w28, x27, uxtx #1\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 2), \"sub w29, w28, x27, uxtx #2\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 3), \"sub w29, w28, x27, uxtx #3\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 4), \"sub w29, w28, x27, uxtx #4\");\n\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 0), \"sub w29, w28, w27, sxtb\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 1), \"sub w29, w28, w27, sxtb #1\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 2), \"sub w29, w28, w27, sxtb #2\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 3), \"sub w29, w28, w27, sxtb #3\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 4), \"sub w29, w28, w27, sxtb #4\");\n\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 0), \"sub w29, w28, w27, sxth\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 1), \"sub w29, w28, w27, sxth #1\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 2), \"sub w29, w28, w27, sxth #2\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 3), \"sub w29, w28, w27, sxth #3\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 4), \"sub w29, w28, w27, sxth #4\");\n\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 0), \"sub w29, w28, w27, sxtw\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 1), \"sub w29, w28, w27, sxtw #1\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 2), \"sub w29, w28, w27, sxtw #2\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 3), \"sub w29, w28, w27, sxtw #3\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 4), \"sub w29, w28, w27, sxtw #4\");\n\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 0), \"sub w29, w28, x27, sxtx\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 1), \"sub w29, w28, x27, sxtx #1\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 2), \"sub w29, w28, x27, sxtx #2\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 3), \"sub w29, w28, x27, sxtx #3\");\n  TEST_SINGLE(sub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 4), \"sub w29, w28, x27, sxtx #4\");\n\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 0), \"sub x29, x28, w27, uxtb\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 1), \"sub x29, x28, w27, uxtb #1\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 2), \"sub x29, x28, w27, uxtb #2\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 3), \"sub x29, x28, w27, uxtb #3\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 4), \"sub x29, x28, w27, uxtb #4\");\n\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 0), \"sub x29, x28, w27, uxth\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 1), \"sub x29, x28, w27, uxth #1\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 2), \"sub x29, x28, w27, uxth #2\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 3), \"sub x29, x28, w27, uxth #3\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 4), \"sub x29, x28, w27, uxth #4\");\n\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 0), \"sub x29, x28, w27, uxtw\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 1), \"sub x29, x28, w27, uxtw #1\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 2), \"sub x29, x28, w27, uxtw #2\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 3), \"sub x29, x28, w27, uxtw #3\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 4), \"sub x29, x28, w27, uxtw #4\");\n\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 0), \"sub x29, x28, x27, uxtx\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 1), \"sub x29, x28, x27, uxtx #1\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 2), \"sub x29, x28, x27, uxtx #2\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 3), \"sub x29, x28, x27, uxtx #3\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 4), \"sub x29, x28, x27, uxtx #4\");\n\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 0), \"sub x29, x28, w27, sxtb\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 1), \"sub x29, x28, w27, sxtb #1\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 2), \"sub x29, x28, w27, sxtb #2\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 3), \"sub x29, x28, w27, sxtb #3\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 4), \"sub x29, x28, w27, sxtb #4\");\n\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 0), \"sub x29, x28, w27, sxth\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 1), \"sub x29, x28, w27, sxth #1\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 2), \"sub x29, x28, w27, sxth #2\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 3), \"sub x29, x28, w27, sxth #3\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 4), \"sub x29, x28, w27, sxth #4\");\n\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 0), \"sub x29, x28, w27, sxtw\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 1), \"sub x29, x28, w27, sxtw #1\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 2), \"sub x29, x28, w27, sxtw #2\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 3), \"sub x29, x28, w27, sxtw #3\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 4), \"sub x29, x28, w27, sxtw #4\");\n\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 0), \"sub x29, x28, x27, sxtx\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 1), \"sub x29, x28, x27, sxtx #1\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 2), \"sub x29, x28, x27, sxtx #2\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 3), \"sub x29, x28, x27, sxtx #3\");\n  TEST_SINGLE(sub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 4), \"sub x29, x28, x27, sxtx #4\");\n\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 0), \"subs w29, w28, w27, uxtb\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 1), \"subs w29, w28, w27, uxtb #1\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 2), \"subs w29, w28, w27, uxtb #2\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 3), \"subs w29, w28, w27, uxtb #3\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 4), \"subs w29, w28, w27, uxtb #4\");\n\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 0), \"subs w29, w28, w27, uxth\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 1), \"subs w29, w28, w27, uxth #1\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 2), \"subs w29, w28, w27, uxth #2\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 3), \"subs w29, w28, w27, uxth #3\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 4), \"subs w29, w28, w27, uxth #4\");\n\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 0), \"subs w29, w28, w27, uxtw\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 1), \"subs w29, w28, w27, uxtw #1\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 2), \"subs w29, w28, w27, uxtw #2\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 3), \"subs w29, w28, w27, uxtw #3\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 4), \"subs w29, w28, w27, uxtw #4\");\n\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 0), \"subs w29, w28, x27, uxtx\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 1), \"subs w29, w28, x27, uxtx #1\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 2), \"subs w29, w28, x27, uxtx #2\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 3), \"subs w29, w28, x27, uxtx #3\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 4), \"subs w29, w28, x27, uxtx #4\");\n\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 0), \"subs w29, w28, w27, sxtb\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 1), \"subs w29, w28, w27, sxtb #1\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 2), \"subs w29, w28, w27, sxtb #2\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 3), \"subs w29, w28, w27, sxtb #3\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 4), \"subs w29, w28, w27, sxtb #4\");\n\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 0), \"subs w29, w28, w27, sxth\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 1), \"subs w29, w28, w27, sxth #1\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 2), \"subs w29, w28, w27, sxth #2\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 3), \"subs w29, w28, w27, sxth #3\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 4), \"subs w29, w28, w27, sxth #4\");\n\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 0), \"subs w29, w28, w27, sxtw\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 1), \"subs w29, w28, w27, sxtw #1\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 2), \"subs w29, w28, w27, sxtw #2\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 3), \"subs w29, w28, w27, sxtw #3\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 4), \"subs w29, w28, w27, sxtw #4\");\n\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 0), \"subs w29, w28, x27, sxtx\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 1), \"subs w29, w28, x27, sxtx #1\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 2), \"subs w29, w28, x27, sxtx #2\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 3), \"subs w29, w28, x27, sxtx #3\");\n  TEST_SINGLE(subs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 4), \"subs w29, w28, x27, sxtx #4\");\n\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 0), \"subs x29, x28, w27, uxtb\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 1), \"subs x29, x28, w27, uxtb #1\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 2), \"subs x29, x28, w27, uxtb #2\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 3), \"subs x29, x28, w27, uxtb #3\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTB, 4), \"subs x29, x28, w27, uxtb #4\");\n\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 0), \"subs x29, x28, w27, uxth\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 1), \"subs x29, x28, w27, uxth #1\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 2), \"subs x29, x28, w27, uxth #2\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 3), \"subs x29, x28, w27, uxth #3\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTH, 4), \"subs x29, x28, w27, uxth #4\");\n\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 0), \"subs x29, x28, w27, uxtw\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 1), \"subs x29, x28, w27, uxtw #1\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 2), \"subs x29, x28, w27, uxtw #2\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 3), \"subs x29, x28, w27, uxtw #3\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTW, 4), \"subs x29, x28, w27, uxtw #4\");\n\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 0), \"subs x29, x28, x27, uxtx\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 1), \"subs x29, x28, x27, uxtx #1\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 2), \"subs x29, x28, x27, uxtx #2\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 3), \"subs x29, x28, x27, uxtx #3\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::UXTX, 4), \"subs x29, x28, x27, uxtx #4\");\n\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 0), \"subs x29, x28, w27, sxtb\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 1), \"subs x29, x28, w27, sxtb #1\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 2), \"subs x29, x28, w27, sxtb #2\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 3), \"subs x29, x28, w27, sxtb #3\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTB, 4), \"subs x29, x28, w27, sxtb #4\");\n\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 0), \"subs x29, x28, w27, sxth\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 1), \"subs x29, x28, w27, sxth #1\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 2), \"subs x29, x28, w27, sxth #2\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 3), \"subs x29, x28, w27, sxth #3\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTH, 4), \"subs x29, x28, w27, sxth #4\");\n\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 0), \"subs x29, x28, w27, sxtw\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 1), \"subs x29, x28, w27, sxtw #1\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 2), \"subs x29, x28, w27, sxtw #2\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 3), \"subs x29, x28, w27, sxtw #3\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTW, 4), \"subs x29, x28, w27, sxtw #4\");\n\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 0), \"subs x29, x28, x27, sxtx\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 1), \"subs x29, x28, x27, sxtx #1\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 2), \"subs x29, x28, x27, sxtx #2\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 3), \"subs x29, x28, x27, sxtx #3\");\n  TEST_SINGLE(subs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, ExtendedType::SXTX, 4), \"subs x29, x28, x27, sxtx #4\");\n\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::UXTB, 0), \"cmp w29, w28, uxtb\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::UXTB, 1), \"cmp w29, w28, uxtb #1\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::UXTB, 2), \"cmp w29, w28, uxtb #2\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::UXTB, 3), \"cmp w29, w28, uxtb #3\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::UXTB, 4), \"cmp w29, w28, uxtb #4\");\n\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::UXTH, 0), \"cmp w29, w28, uxth\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::UXTH, 1), \"cmp w29, w28, uxth #1\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::UXTH, 2), \"cmp w29, w28, uxth #2\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::UXTH, 3), \"cmp w29, w28, uxth #3\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::UXTH, 4), \"cmp w29, w28, uxth #4\");\n\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::LSL_32, 0), \"cmp w29, w28\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::LSL_32, 1), \"cmp w29, w28, lsl #1\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::LSL_32, 2), \"cmp w29, w28, lsl #2\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::LSL_32, 3), \"cmp w29, w28, lsl #3\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::LSL_32, 4), \"cmp w29, w28, lsl #4\");\n\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::LSL_64, 0), \"cmp w29, x28\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::LSL_64, 1), \"cmp w29, x28, lsl #1\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::LSL_64, 2), \"cmp w29, x28, lsl #2\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::LSL_64, 3), \"cmp w29, x28, lsl #3\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::LSL_64, 4), \"cmp w29, x28, lsl #4\");\n\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTB, 0), \"cmp w29, w28, sxtb\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTB, 1), \"cmp w29, w28, sxtb #1\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTB, 2), \"cmp w29, w28, sxtb #2\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTB, 3), \"cmp w29, w28, sxtb #3\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTB, 4), \"cmp w29, w28, sxtb #4\");\n\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTH, 0), \"cmp w29, w28, sxth\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTH, 1), \"cmp w29, w28, sxth #1\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTH, 2), \"cmp w29, w28, sxth #2\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTH, 3), \"cmp w29, w28, sxth #3\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTH, 4), \"cmp w29, w28, sxth #4\");\n\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTW, 0), \"cmp w29, w28, sxtw\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTW, 1), \"cmp w29, w28, sxtw #1\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTW, 2), \"cmp w29, w28, sxtw #2\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTW, 3), \"cmp w29, w28, sxtw #3\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTW, 4), \"cmp w29, w28, sxtw #4\");\n\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTX, 0), \"cmp w29, x28, sxtx\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTX, 1), \"cmp w29, x28, sxtx #1\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTX, 2), \"cmp w29, x28, sxtx #2\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTX, 3), \"cmp w29, x28, sxtx #3\");\n  TEST_SINGLE(cmp(Size::i32Bit, Reg::r29, Reg::r28, ExtendedType::SXTX, 4), \"cmp w29, x28, sxtx #4\");\n\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::UXTB, 0), \"cmp x29, w28, uxtb\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::UXTB, 1), \"cmp x29, w28, uxtb #1\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::UXTB, 2), \"cmp x29, w28, uxtb #2\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::UXTB, 3), \"cmp x29, w28, uxtb #3\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::UXTB, 4), \"cmp x29, w28, uxtb #4\");\n\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::UXTH, 0), \"cmp x29, w28, uxth\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::UXTH, 1), \"cmp x29, w28, uxth #1\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::UXTH, 2), \"cmp x29, w28, uxth #2\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::UXTH, 3), \"cmp x29, w28, uxth #3\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::UXTH, 4), \"cmp x29, w28, uxth #4\");\n\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::UXTW, 0), \"cmp x29, w28, uxtw\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::UXTW, 1), \"cmp x29, w28, uxtw #1\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::UXTW, 2), \"cmp x29, w28, uxtw #2\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::UXTW, 3), \"cmp x29, w28, uxtw #3\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::UXTW, 4), \"cmp x29, w28, uxtw #4\");\n\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::LSL_64, 0), \"cmp x29, x28\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::LSL_64, 1), \"cmp x29, x28, lsl #1\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::LSL_64, 2), \"cmp x29, x28, lsl #2\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::LSL_64, 3), \"cmp x29, x28, lsl #3\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::LSL_64, 4), \"cmp x29, x28, lsl #4\");\n\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTB, 0), \"cmp x29, w28, sxtb\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTB, 1), \"cmp x29, w28, sxtb #1\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTB, 2), \"cmp x29, w28, sxtb #2\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTB, 3), \"cmp x29, w28, sxtb #3\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTB, 4), \"cmp x29, w28, sxtb #4\");\n\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTH, 0), \"cmp x29, w28, sxth\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTH, 1), \"cmp x29, w28, sxth #1\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTH, 2), \"cmp x29, w28, sxth #2\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTH, 3), \"cmp x29, w28, sxth #3\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTH, 4), \"cmp x29, w28, sxth #4\");\n\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTW, 0), \"cmp x29, w28, sxtw\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTW, 1), \"cmp x29, w28, sxtw #1\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTW, 2), \"cmp x29, w28, sxtw #2\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTW, 3), \"cmp x29, w28, sxtw #3\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTW, 4), \"cmp x29, w28, sxtw #4\");\n\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTX, 0), \"cmp x29, x28, sxtx\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTX, 1), \"cmp x29, x28, sxtx #1\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTX, 2), \"cmp x29, x28, sxtx #2\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTX, 3), \"cmp x29, x28, sxtx #3\");\n  TEST_SINGLE(cmp(Size::i64Bit, Reg::r29, Reg::r28, ExtendedType::SXTX, 4), \"cmp x29, x28, sxtx #4\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: AddSub - with carry\") {\n  TEST_SINGLE(adc(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"adc w29, w28, w27\");\n  TEST_SINGLE(adc(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"adc x29, x28, x27\");\n\n  TEST_SINGLE(adcs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"adcs w29, w28, w27\");\n  TEST_SINGLE(adcs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"adcs x29, x28, x27\");\n\n  TEST_SINGLE(sbc(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"sbc w29, w28, w27\");\n  TEST_SINGLE(sbc(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"sbc x29, x28, x27\");\n\n  TEST_SINGLE(sbcs(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"sbcs w29, w28, w27\");\n  TEST_SINGLE(sbcs(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"sbcs x29, x28, x27\");\n\n  TEST_SINGLE(ngc(Size::i32Bit, Reg::r29, Reg::r27), \"ngc w29, w27\");\n  TEST_SINGLE(ngc(Size::i64Bit, Reg::r29, Reg::r27), \"ngc x29, x27\");\n\n  TEST_SINGLE(ngcs(Size::i32Bit, Reg::r29, Reg::r27), \"ngcs w29, w27\");\n  TEST_SINGLE(ngcs(Size::i64Bit, Reg::r29, Reg::r27), \"ngcs x29, x27\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Rotate right into flags\") {\n  TEST_SINGLE(rmif(XReg::x30, 63, 0b0000), \"rmif x30, #63, #nzcv\");\n  TEST_SINGLE(rmif(XReg::x30, 63, 0b0001), \"rmif x30, #63, #nzcV\");\n  TEST_SINGLE(rmif(XReg::x30, 63, 0b0010), \"rmif x30, #63, #nzCv\");\n  TEST_SINGLE(rmif(XReg::x30, 63, 0b0100), \"rmif x30, #63, #nZcv\");\n  TEST_SINGLE(rmif(XReg::x30, 63, 0b1000), \"rmif x30, #63, #Nzcv\");\n  TEST_SINGLE(rmif(XReg::x30, 63, 0b1111), \"rmif x30, #63, #NZCV\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Evaluate into flags\") {\n  TEST_SINGLE(setf8(WReg::w30), \"setf8 w30\");\n  TEST_SINGLE(setf16(WReg::w30), \"setf16 w30\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Carry flag invert\") {\n  TEST_SINGLE(cfinv(), \"cfinv\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Arm to eXternal FLAG\") {\n  TEST_SINGLE(axflag(), \"axflag\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: eXternal to Arm FLAG\") {\n  TEST_SINGLE(xaflag(), \"xaflag\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Conditional compare - register\") {\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::None, Condition::CC_AL), \"ccmn w29, w28, #nzcv, al\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_N, Condition::CC_AL), \"ccmn w29, w28, #Nzcv, al\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_Z, Condition::CC_AL), \"ccmn w29, w28, #nZcv, al\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_C, Condition::CC_AL), \"ccmn w29, w28, #nzCv, al\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_V, Condition::CC_AL), \"ccmn w29, w28, #nzcV, al\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_NZCV, Condition::CC_AL), \"ccmn w29, w28, #NZCV, al\");\n\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::None, Condition::CC_EQ), \"ccmn w29, w28, #nzcv, eq\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_N, Condition::CC_EQ), \"ccmn w29, w28, #Nzcv, eq\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_Z, Condition::CC_EQ), \"ccmn w29, w28, #nZcv, eq\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_C, Condition::CC_EQ), \"ccmn w29, w28, #nzCv, eq\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_V, Condition::CC_EQ), \"ccmn w29, w28, #nzcV, eq\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"ccmn w29, w28, #NZCV, eq\");\n\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::None, Condition::CC_AL), \"ccmn x29, x28, #nzcv, al\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_N, Condition::CC_AL), \"ccmn x29, x28, #Nzcv, al\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_Z, Condition::CC_AL), \"ccmn x29, x28, #nZcv, al\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_C, Condition::CC_AL), \"ccmn x29, x28, #nzCv, al\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_V, Condition::CC_AL), \"ccmn x29, x28, #nzcV, al\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_NZCV, Condition::CC_AL), \"ccmn x29, x28, #NZCV, al\");\n\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::None, Condition::CC_EQ), \"ccmn x29, x28, #nzcv, eq\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_N, Condition::CC_EQ), \"ccmn x29, x28, #Nzcv, eq\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_Z, Condition::CC_EQ), \"ccmn x29, x28, #nZcv, eq\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_C, Condition::CC_EQ), \"ccmn x29, x28, #nzCv, eq\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_V, Condition::CC_EQ), \"ccmn x29, x28, #nzcV, eq\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"ccmn x29, x28, #NZCV, eq\");\n\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::None, Condition::CC_AL), \"ccmp w29, w28, #nzcv, al\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_N, Condition::CC_AL), \"ccmp w29, w28, #Nzcv, al\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_Z, Condition::CC_AL), \"ccmp w29, w28, #nZcv, al\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_C, Condition::CC_AL), \"ccmp w29, w28, #nzCv, al\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_V, Condition::CC_AL), \"ccmp w29, w28, #nzcV, al\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_NZCV, Condition::CC_AL), \"ccmp w29, w28, #NZCV, al\");\n\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::None, Condition::CC_EQ), \"ccmp w29, w28, #nzcv, eq\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_N, Condition::CC_EQ), \"ccmp w29, w28, #Nzcv, eq\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_Z, Condition::CC_EQ), \"ccmp w29, w28, #nZcv, eq\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_C, Condition::CC_EQ), \"ccmp w29, w28, #nzCv, eq\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_V, Condition::CC_EQ), \"ccmp w29, w28, #nzcV, eq\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, Reg::r28, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"ccmp w29, w28, #NZCV, eq\");\n\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::None, Condition::CC_AL), \"ccmp x29, x28, #nzcv, al\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_N, Condition::CC_AL), \"ccmp x29, x28, #Nzcv, al\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_Z, Condition::CC_AL), \"ccmp x29, x28, #nZcv, al\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_C, Condition::CC_AL), \"ccmp x29, x28, #nzCv, al\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_V, Condition::CC_AL), \"ccmp x29, x28, #nzcV, al\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_NZCV, Condition::CC_AL), \"ccmp x29, x28, #NZCV, al\");\n\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::None, Condition::CC_EQ), \"ccmp x29, x28, #nzcv, eq\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_N, Condition::CC_EQ), \"ccmp x29, x28, #Nzcv, eq\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_Z, Condition::CC_EQ), \"ccmp x29, x28, #nZcv, eq\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_C, Condition::CC_EQ), \"ccmp x29, x28, #nzCv, eq\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_V, Condition::CC_EQ), \"ccmp x29, x28, #nzcV, eq\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, Reg::r28, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"ccmp x29, x28, #NZCV, eq\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Conditional compare - immediate\") {\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 0, StatusFlags::None, Condition::CC_AL), \"ccmn w29, #0, #nzcv, al\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_N, Condition::CC_AL), \"ccmn w29, #0, #Nzcv, al\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_Z, Condition::CC_AL), \"ccmn w29, #0, #nZcv, al\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_C, Condition::CC_AL), \"ccmn w29, #0, #nzCv, al\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_V, Condition::CC_AL), \"ccmn w29, #0, #nzcV, al\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_NZCV, Condition::CC_AL), \"ccmn w29, #0, #NZCV, al\");\n\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 0, StatusFlags::None, Condition::CC_EQ), \"ccmn w29, #0, #nzcv, eq\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_N, Condition::CC_EQ), \"ccmn w29, #0, #Nzcv, eq\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_Z, Condition::CC_EQ), \"ccmn w29, #0, #nZcv, eq\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_C, Condition::CC_EQ), \"ccmn w29, #0, #nzCv, eq\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_V, Condition::CC_EQ), \"ccmn w29, #0, #nzcV, eq\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"ccmn w29, #0, #NZCV, eq\");\n\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 0, StatusFlags::None, Condition::CC_AL), \"ccmn x29, #0, #nzcv, al\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_N, Condition::CC_AL), \"ccmn x29, #0, #Nzcv, al\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_Z, Condition::CC_AL), \"ccmn x29, #0, #nZcv, al\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_C, Condition::CC_AL), \"ccmn x29, #0, #nzCv, al\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_V, Condition::CC_AL), \"ccmn x29, #0, #nzcV, al\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_NZCV, Condition::CC_AL), \"ccmn x29, #0, #NZCV, al\");\n\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 0, StatusFlags::None, Condition::CC_EQ), \"ccmn x29, #0, #nzcv, eq\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_N, Condition::CC_EQ), \"ccmn x29, #0, #Nzcv, eq\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_Z, Condition::CC_EQ), \"ccmn x29, #0, #nZcv, eq\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_C, Condition::CC_EQ), \"ccmn x29, #0, #nzCv, eq\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_V, Condition::CC_EQ), \"ccmn x29, #0, #nzcV, eq\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"ccmn x29, #0, #NZCV, eq\");\n\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 31, StatusFlags::None, Condition::CC_AL), \"ccmn w29, #31, #nzcv, al\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_N, Condition::CC_AL), \"ccmn w29, #31, #Nzcv, al\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_Z, Condition::CC_AL), \"ccmn w29, #31, #nZcv, al\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_C, Condition::CC_AL), \"ccmn w29, #31, #nzCv, al\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_V, Condition::CC_AL), \"ccmn w29, #31, #nzcV, al\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_NZCV, Condition::CC_AL), \"ccmn w29, #31, #NZCV, al\");\n\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 31, StatusFlags::None, Condition::CC_EQ), \"ccmn w29, #31, #nzcv, eq\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_N, Condition::CC_EQ), \"ccmn w29, #31, #Nzcv, eq\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_Z, Condition::CC_EQ), \"ccmn w29, #31, #nZcv, eq\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_C, Condition::CC_EQ), \"ccmn w29, #31, #nzCv, eq\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_V, Condition::CC_EQ), \"ccmn w29, #31, #nzcV, eq\");\n  TEST_SINGLE(ccmn(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"ccmn w29, #31, #NZCV, eq\");\n\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 31, StatusFlags::None, Condition::CC_AL), \"ccmn x29, #31, #nzcv, al\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_N, Condition::CC_AL), \"ccmn x29, #31, #Nzcv, al\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_Z, Condition::CC_AL), \"ccmn x29, #31, #nZcv, al\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_C, Condition::CC_AL), \"ccmn x29, #31, #nzCv, al\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_V, Condition::CC_AL), \"ccmn x29, #31, #nzcV, al\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_NZCV, Condition::CC_AL), \"ccmn x29, #31, #NZCV, al\");\n\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 31, StatusFlags::None, Condition::CC_EQ), \"ccmn x29, #31, #nzcv, eq\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_N, Condition::CC_EQ), \"ccmn x29, #31, #Nzcv, eq\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_Z, Condition::CC_EQ), \"ccmn x29, #31, #nZcv, eq\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_C, Condition::CC_EQ), \"ccmn x29, #31, #nzCv, eq\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_V, Condition::CC_EQ), \"ccmn x29, #31, #nzcV, eq\");\n  TEST_SINGLE(ccmn(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"ccmn x29, #31, #NZCV, eq\");\n\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 0, StatusFlags::None, Condition::CC_AL), \"ccmp w29, #0, #nzcv, al\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_N, Condition::CC_AL), \"ccmp w29, #0, #Nzcv, al\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_Z, Condition::CC_AL), \"ccmp w29, #0, #nZcv, al\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_C, Condition::CC_AL), \"ccmp w29, #0, #nzCv, al\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_V, Condition::CC_AL), \"ccmp w29, #0, #nzcV, al\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_NZCV, Condition::CC_AL), \"ccmp w29, #0, #NZCV, al\");\n\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 0, StatusFlags::None, Condition::CC_EQ), \"ccmp w29, #0, #nzcv, eq\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_N, Condition::CC_EQ), \"ccmp w29, #0, #Nzcv, eq\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_Z, Condition::CC_EQ), \"ccmp w29, #0, #nZcv, eq\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_C, Condition::CC_EQ), \"ccmp w29, #0, #nzCv, eq\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_V, Condition::CC_EQ), \"ccmp w29, #0, #nzcV, eq\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 0, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"ccmp w29, #0, #NZCV, eq\");\n\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 0, StatusFlags::None, Condition::CC_AL), \"ccmp x29, #0, #nzcv, al\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_N, Condition::CC_AL), \"ccmp x29, #0, #Nzcv, al\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_Z, Condition::CC_AL), \"ccmp x29, #0, #nZcv, al\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_C, Condition::CC_AL), \"ccmp x29, #0, #nzCv, al\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_V, Condition::CC_AL), \"ccmp x29, #0, #nzcV, al\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_NZCV, Condition::CC_AL), \"ccmp x29, #0, #NZCV, al\");\n\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 0, StatusFlags::None, Condition::CC_EQ), \"ccmp x29, #0, #nzcv, eq\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_N, Condition::CC_EQ), \"ccmp x29, #0, #Nzcv, eq\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_Z, Condition::CC_EQ), \"ccmp x29, #0, #nZcv, eq\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_C, Condition::CC_EQ), \"ccmp x29, #0, #nzCv, eq\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_V, Condition::CC_EQ), \"ccmp x29, #0, #nzcV, eq\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 0, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"ccmp x29, #0, #NZCV, eq\");\n\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 31, StatusFlags::None, Condition::CC_AL), \"ccmp w29, #31, #nzcv, al\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_N, Condition::CC_AL), \"ccmp w29, #31, #Nzcv, al\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_Z, Condition::CC_AL), \"ccmp w29, #31, #nZcv, al\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_C, Condition::CC_AL), \"ccmp w29, #31, #nzCv, al\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_V, Condition::CC_AL), \"ccmp w29, #31, #nzcV, al\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_NZCV, Condition::CC_AL), \"ccmp w29, #31, #NZCV, al\");\n\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 31, StatusFlags::None, Condition::CC_EQ), \"ccmp w29, #31, #nzcv, eq\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_N, Condition::CC_EQ), \"ccmp w29, #31, #Nzcv, eq\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_Z, Condition::CC_EQ), \"ccmp w29, #31, #nZcv, eq\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_C, Condition::CC_EQ), \"ccmp w29, #31, #nzCv, eq\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_V, Condition::CC_EQ), \"ccmp w29, #31, #nzcV, eq\");\n  TEST_SINGLE(ccmp(Size::i32Bit, Reg::r29, 31, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"ccmp w29, #31, #NZCV, eq\");\n\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 31, StatusFlags::None, Condition::CC_AL), \"ccmp x29, #31, #nzcv, al\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_N, Condition::CC_AL), \"ccmp x29, #31, #Nzcv, al\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_Z, Condition::CC_AL), \"ccmp x29, #31, #nZcv, al\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_C, Condition::CC_AL), \"ccmp x29, #31, #nzCv, al\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_V, Condition::CC_AL), \"ccmp x29, #31, #nzcV, al\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_NZCV, Condition::CC_AL), \"ccmp x29, #31, #NZCV, al\");\n\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 31, StatusFlags::None, Condition::CC_EQ), \"ccmp x29, #31, #nzcv, eq\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_N, Condition::CC_EQ), \"ccmp x29, #31, #Nzcv, eq\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_Z, Condition::CC_EQ), \"ccmp x29, #31, #nZcv, eq\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_C, Condition::CC_EQ), \"ccmp x29, #31, #nzCv, eq\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_V, Condition::CC_EQ), \"ccmp x29, #31, #nzcV, eq\");\n  TEST_SINGLE(ccmp(Size::i64Bit, Reg::r29, 31, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"ccmp x29, #31, #NZCV, eq\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Conditional select\") {\n  TEST_SINGLE(csel(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_EQ), \"csel w29, w28, w27, eq\");\n  TEST_SINGLE(csel(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_EQ), \"csel x29, x28, x27, eq\");\n  TEST_SINGLE(cset(Size::i32Bit, Reg::r29, Condition::CC_EQ), \"cset w29, eq\");\n  TEST_SINGLE(cset(Size::i64Bit, Reg::r29, Condition::CC_EQ), \"cset x29, eq\");\n  TEST_SINGLE(csinc(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_EQ), \"csinc w29, w28, w27, eq\");\n  TEST_SINGLE(csinc(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_EQ), \"csinc x29, x28, x27, eq\");\n  TEST_SINGLE(csinv(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_EQ), \"csinv w29, w28, w27, eq\");\n  TEST_SINGLE(csinv(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_EQ), \"csinv x29, x28, x27, eq\");\n  TEST_SINGLE(csneg(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_EQ), \"csneg w29, w28, w27, eq\");\n  TEST_SINGLE(csneg(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_EQ), \"csneg x29, x28, x27, eq\");\n  TEST_SINGLE(cneg(Size::i32Bit, Reg::r29, Reg::r28, Condition::CC_EQ), \"cneg w29, w28, eq\");\n  TEST_SINGLE(cneg(Size::i64Bit, Reg::r29, Reg::r28, Condition::CC_EQ), \"cneg x29, x28, eq\");\n\n  TEST_SINGLE(cinc(Size::i32Bit, Reg::r29, Reg::r28, Condition::CC_EQ), \"cinc w29, w28, eq\");\n  TEST_SINGLE(cinc(Size::i64Bit, Reg::r29, Reg::r28, Condition::CC_EQ), \"cinc x29, x28, eq\");\n  TEST_SINGLE(cinv(Size::i32Bit, Reg::r29, Reg::r28, Condition::CC_EQ), \"cinv w29, w28, eq\");\n  TEST_SINGLE(cinv(Size::i64Bit, Reg::r29, Reg::r28, Condition::CC_EQ), \"cinv x29, x28, eq\");\n  TEST_SINGLE(csetm(Size::i32Bit, Reg::r29, Condition::CC_EQ), \"csetm w29, eq\");\n  TEST_SINGLE(csetm(Size::i64Bit, Reg::r29, Condition::CC_EQ), \"csetm x29, eq\");\n\n  TEST_SINGLE(csel(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_AL), \"csel w29, w28, w27, al\");\n  TEST_SINGLE(csel(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_AL), \"csel x29, x28, x27, al\");\n  TEST_SINGLE(cset(Size::i32Bit, Reg::r29, Condition::CC_AL), \"csinc w29, wzr, wzr, nv\");\n  TEST_SINGLE(cset(Size::i64Bit, Reg::r29, Condition::CC_AL), \"csinc x29, xzr, xzr, nv\");\n  TEST_SINGLE(csinc(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_AL), \"csinc w29, w28, w27, al\");\n  TEST_SINGLE(csinc(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_AL), \"csinc x29, x28, x27, al\");\n  TEST_SINGLE(csinv(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_AL), \"csinv w29, w28, w27, al\");\n  TEST_SINGLE(csinv(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_AL), \"csinv x29, x28, x27, al\");\n  TEST_SINGLE(csneg(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_AL), \"csneg w29, w28, w27, al\");\n  TEST_SINGLE(csneg(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, Condition::CC_AL), \"csneg x29, x28, x27, al\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ALU: Data processing - 3 source\") {\n  TEST_SINGLE(madd(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, Reg::r26), \"madd w29, w28, w27, w26\");\n  TEST_SINGLE(madd(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, Reg::r26), \"madd x29, x28, x27, x26\");\n  TEST_SINGLE(mul(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"mul w29, w28, w27\");\n  TEST_SINGLE(mul(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"mul x29, x28, x27\");\n  TEST_SINGLE(msub(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27, Reg::r26), \"msub w29, w28, w27, w26\");\n  TEST_SINGLE(msub(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27, Reg::r26), \"msub x29, x28, x27, x26\");\n  TEST_SINGLE(mneg(Size::i32Bit, Reg::r29, Reg::r28, Reg::r27), \"mneg w29, w28, w27\");\n  TEST_SINGLE(mneg(Size::i64Bit, Reg::r29, Reg::r28, Reg::r27), \"mneg x29, x28, x27\");\n\n  TEST_SINGLE(smaddl(XReg::x29, WReg::w28, WReg::w27, XReg::x26), \"smaddl x29, w28, w27, x26\");\n  TEST_SINGLE(smull(XReg::x29, WReg::w28, WReg::w27), \"smull x29, w28, w27\");\n  TEST_SINGLE(smsubl(XReg::x29, WReg::w28, WReg::w27, XReg::x26), \"smsubl x29, w28, w27, x26\");\n  TEST_SINGLE(smnegl(XReg::x29, WReg::w28, WReg::w27), \"smnegl x29, w28, w27\");\n  TEST_SINGLE(smulh(XReg::x29, XReg::x28, XReg::x27), \"smulh x29, x28, x27\");\n\n  TEST_SINGLE(umaddl(XReg::x29, WReg::w28, WReg::w27, XReg::x26), \"umaddl x29, w28, w27, x26\");\n  TEST_SINGLE(umull(XReg::x29, WReg::w28, WReg::w27), \"umull x29, w28, w27\");\n  TEST_SINGLE(umsubl(XReg::x29, WReg::w28, WReg::w27, XReg::x26), \"umsubl x29, w28, w27, x26\");\n  TEST_SINGLE(umnegl(XReg::x29, WReg::w28, WReg::w27), \"umnegl x29, w28, w27\");\n  TEST_SINGLE(umulh(XReg::x29, XReg::x28, XReg::x27), \"umulh x29, x28, x27\");\n}\n"
  },
  {
    "path": "FEXCore/unittests/Emitter/ASIMD_Tests.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"TestDisassembler.h\"\n\n#include <catch2/catch_test_macros.hpp>\n#include <fcntl.h>\n\nusing namespace ARMEmitter;\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Cryptographic AES\") {\n  TEST_SINGLE(aese(VReg::v30, VReg::v29), \"aese v30.16b, v29.16b\");\n  TEST_SINGLE(aesd(VReg::v30, VReg::v29), \"aesd v30.16b, v29.16b\");\n  TEST_SINGLE(aesmc(VReg::v30, VReg::v29), \"aesmc v30.16b, v29.16b\");\n  TEST_SINGLE(aesimc(VReg::v30, VReg::v29), \"aesimc v30.16b, v29.16b\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Cryptographic three-register SHA\") {\n  TEST_SINGLE(sha1c(VReg::v30, SReg::s29, VReg::v28), \"sha1c q30, s29, v28.4s\");\n  TEST_SINGLE(sha1p(VReg::v30, SReg::s29, VReg::v28), \"sha1p q30, s29, v28.4s\");\n  TEST_SINGLE(sha1m(VReg::v30, SReg::s29, VReg::v28), \"sha1m q30, s29, v28.4s\");\n  TEST_SINGLE(sha1su0(VReg::v30, VReg::v29, VReg::v28), \"sha1su0 v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(sha256h(VReg::v30, VReg::v29, VReg::v28), \"sha256h q30, q29, v28.4s\");\n  TEST_SINGLE(sha256h2(VReg::v30, VReg::v29, VReg::v28), \"sha256h2 q30, q29, v28.4s\");\n  TEST_SINGLE(sha256su1(VReg::v30, VReg::v29, VReg::v28), \"sha256su1 v30.4s, v29.4s, v28.4s\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Cryptographic two-register SHA\") {\n  TEST_SINGLE(sha1h(SReg::s30, SReg::s29), \"sha1h s30, s29\");\n  TEST_SINGLE(sha1su1(VReg::v30, VReg::v29), \"sha1su1 v30.4s, v29.4s\");\n  TEST_SINGLE(sha256su0(VReg::v30, VReg::v29), \"sha256su0 v30.4s, v29.4s\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Advanced SIMD table lookup\") {\n  TEST_SINGLE(tbl(QReg::q30, QReg::q26, QReg::q25), \"tbl v30.16b, {v26.16b}, v25.16b\");\n  TEST_SINGLE(tbl(DReg::d30, QReg::q26, DReg::d25), \"tbl v30.8b, {v26.16b}, v25.8b\");\n  TEST_SINGLE(tbx(QReg::q30, QReg::q26, QReg::q25), \"tbx v30.16b, {v26.16b}, v25.16b\");\n  TEST_SINGLE(tbx(DReg::d30, QReg::q26, DReg::d25), \"tbx v30.8b, {v26.16b}, v25.8b\");\n\n  TEST_SINGLE(tbl(QReg::q30, QReg::q31, QReg::q0, QReg::q25), \"tbl v30.16b, {v31.16b, v0.16b}, v25.16b\");\n  TEST_SINGLE(tbl(DReg::d30, QReg::q31, QReg::q0, DReg::d25), \"tbl v30.8b, {v31.16b, v0.16b}, v25.8b\");\n  TEST_SINGLE(tbl(QReg::q30, QReg::q26, QReg::q27, QReg::q25), \"tbl v30.16b, {v26.16b, v27.16b}, v25.16b\");\n  TEST_SINGLE(tbl(DReg::d30, QReg::q26, QReg::q27, DReg::d25), \"tbl v30.8b, {v26.16b, v27.16b}, v25.8b\");\n\n  TEST_SINGLE(tbx(QReg::q30, QReg::q31, QReg::q0, QReg::q25), \"tbx v30.16b, {v31.16b, v0.16b}, v25.16b\");\n  TEST_SINGLE(tbx(DReg::d30, QReg::q31, QReg::q0, DReg::d25), \"tbx v30.8b, {v31.16b, v0.16b}, v25.8b\");\n  TEST_SINGLE(tbx(QReg::q30, QReg::q26, QReg::q27, QReg::q25), \"tbx v30.16b, {v26.16b, v27.16b}, v25.16b\");\n  TEST_SINGLE(tbx(DReg::d30, QReg::q26, QReg::q27, DReg::d25), \"tbx v30.8b, {v26.16b, v27.16b}, v25.8b\");\n\n  TEST_SINGLE(tbl(QReg::q30, QReg::q31, QReg::q0, QReg::q1, QReg::q25), \"tbl v30.16b, {v31.16b, v0.16b, v1.16b}, v25.16b\");\n  TEST_SINGLE(tbl(DReg::d30, QReg::q31, QReg::q0, QReg::q1, DReg::d25), \"tbl v30.8b, {v31.16b, v0.16b, v1.16b}, v25.8b\");\n  TEST_SINGLE(tbl(QReg::q30, QReg::q26, QReg::q27, QReg::q28, QReg::q25), \"tbl v30.16b, {v26.16b, v27.16b, v28.16b}, v25.16b\");\n  TEST_SINGLE(tbl(DReg::d30, QReg::q26, QReg::q27, QReg::q28, DReg::d25), \"tbl v30.8b, {v26.16b, v27.16b, v28.16b}, v25.8b\");\n\n  TEST_SINGLE(tbx(QReg::q30, QReg::q31, QReg::q0, QReg::q1, QReg::q25), \"tbx v30.16b, {v31.16b, v0.16b, v1.16b}, v25.16b\");\n  TEST_SINGLE(tbx(DReg::d30, QReg::q31, QReg::q0, QReg::q1, DReg::d25), \"tbx v30.8b, {v31.16b, v0.16b, v1.16b}, v25.8b\");\n  TEST_SINGLE(tbx(QReg::q30, QReg::q26, QReg::q27, QReg::q28, QReg::q25), \"tbx v30.16b, {v26.16b, v27.16b, v28.16b}, v25.16b\");\n  TEST_SINGLE(tbx(DReg::d30, QReg::q26, QReg::q27, QReg::q28, DReg::d25), \"tbx v30.8b, {v26.16b, v27.16b, v28.16b}, v25.8b\");\n\n  TEST_SINGLE(tbl(QReg::q30, QReg::q31, QReg::q0, QReg::q1, QReg::q2, QReg::q25), \"tbl v30.16b, {v31.16b, v0.16b, v1.16b, v2.16b}, \"\n                                                                                  \"v25.16b\");\n  TEST_SINGLE(tbl(DReg::d30, QReg::q31, QReg::q0, QReg::q1, QReg::q2, DReg::d25), \"tbl v30.8b, {v31.16b, v0.16b, v1.16b, v2.16b}, v25.8b\");\n  TEST_SINGLE(tbl(QReg::q30, QReg::q26, QReg::q27, QReg::q28, QReg::q29, QReg::q25), \"tbl v30.16b, {v26.16b, v27.16b, v28.16b, v29.16b}, \"\n                                                                                     \"v25.16b\");\n  TEST_SINGLE(tbl(DReg::d30, QReg::q26, QReg::q27, QReg::q28, QReg::q29, DReg::d25), \"tbl v30.8b, {v26.16b, v27.16b, v28.16b, v29.16b}, \"\n                                                                                     \"v25.8b\");\n\n  TEST_SINGLE(tbx(QReg::q30, QReg::q31, QReg::q0, QReg::q1, QReg::q2, QReg::q25), \"tbx v30.16b, {v31.16b, v0.16b, v1.16b, v2.16b}, \"\n                                                                                  \"v25.16b\");\n  TEST_SINGLE(tbx(DReg::d30, QReg::q31, QReg::q0, QReg::q1, QReg::q2, DReg::d25), \"tbx v30.8b, {v31.16b, v0.16b, v1.16b, v2.16b}, v25.8b\");\n  TEST_SINGLE(tbx(QReg::q30, QReg::q26, QReg::q27, QReg::q28, QReg::q29, QReg::q25), \"tbx v30.16b, {v26.16b, v27.16b, v28.16b, v29.16b}, \"\n                                                                                     \"v25.16b\");\n  TEST_SINGLE(tbx(DReg::d30, QReg::q26, QReg::q27, QReg::q28, QReg::q29, DReg::d25), \"tbx v30.8b, {v26.16b, v27.16b, v28.16b, v29.16b}, \"\n                                                                                     \"v25.8b\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Advanced SIMD permute\") {\n  // Commented out lines showcase unallocated encodings.\n  TEST_SINGLE(uzp1(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"uzp1 v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(uzp1(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"uzp1 v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(uzp1(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"uzp1 v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(uzp1(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"uzp1 v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(uzp1(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"uzp1 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uzp1(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"uzp1 v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(uzp1(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"uzp1 v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(uzp1(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"uzp1 v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(trn1(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"trn1 v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(trn1(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"trn1 v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(trn1(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"trn1 v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(trn1(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"trn1 v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(trn1(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"trn1 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(trn1(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"trn1 v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(trn1(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"trn1 v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(trn1(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"trn1 v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(zip1(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"zip1 v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(zip1(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"zip1 v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(zip1(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"zip1 v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(zip1(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"zip1 v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(zip1(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"zip1 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(zip1(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"zip1 v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(zip1(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"zip1 v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(zip1(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"zip1 v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(uzp2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"uzp2 v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(uzp2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"uzp2 v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(uzp2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"uzp2 v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(uzp2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"uzp2 v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(uzp2(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"uzp2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uzp2(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"uzp2 v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(uzp2(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"uzp2 v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(uzp2(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"uzp2 v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(trn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"trn2 v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(trn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"trn2 v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(trn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"trn2 v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(trn2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"trn2 v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(trn2(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"trn2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(trn2(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"trn2 v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(trn2(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"trn2 v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(trn2(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"trn2 v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(zip2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"zip2 v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(zip2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"zip2 v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(zip2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"zip2 v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(zip2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"zip2 v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(zip2(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"zip2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(zip2(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"zip2 v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(zip2(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"zip2 v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(zip2(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"zip2 v30.1d, v29.1d, v28.1d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Advanced SIMD extract\") {\n  TEST_SINGLE(ext(QReg::q30, QReg::q29, QReg::q28, 0), \"ext v30.16b, v29.16b, v28.16b, #0\");\n  TEST_SINGLE(ext(QReg::q30, QReg::q29, QReg::q28, 15), \"ext v30.16b, v29.16b, v28.16b, #15\");\n  TEST_SINGLE(ext(DReg::d30, DReg::d29, DReg::d28, 0), \"ext v30.8b, v29.8b, v28.8b, #0\");\n  TEST_SINGLE(ext(DReg::d30, DReg::d29, DReg::d28, 7), \"ext v30.8b, v29.8b, v28.8b, #7\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Advanced SIMD copy\") {\n  // Commented out lines showcase unallocated encodings.\n  TEST_SINGLE(dup(SubRegSize::i8Bit, QReg::q30, QReg::q29, 0), \"dup v30.16b, v29.b[0]\");\n  TEST_SINGLE(dup(SubRegSize::i16Bit, QReg::q30, QReg::q29, 0), \"dup v30.8h, v29.h[0]\");\n  TEST_SINGLE(dup(SubRegSize::i32Bit, QReg::q30, QReg::q29, 0), \"dup v30.4s, v29.s[0]\");\n  TEST_SINGLE(dup(SubRegSize::i64Bit, QReg::q30, QReg::q29, 0), \"dup v30.2d, v29.d[0]\");\n  TEST_SINGLE(dup(SubRegSize::i8Bit, QReg::q30, QReg::q29, 15), \"dup v30.16b, v29.b[15]\");\n  TEST_SINGLE(dup(SubRegSize::i16Bit, QReg::q30, QReg::q29, 7), \"dup v30.8h, v29.h[7]\");\n  TEST_SINGLE(dup(SubRegSize::i32Bit, QReg::q30, QReg::q29, 3), \"dup v30.4s, v29.s[3]\");\n  TEST_SINGLE(dup(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"dup v30.2d, v29.d[1]\");\n\n  TEST_SINGLE(dup(SubRegSize::i8Bit, DReg::d30, DReg::d29, 0), \"dup v30.8b, v29.b[0]\");\n  TEST_SINGLE(dup(SubRegSize::i16Bit, DReg::d30, DReg::d29, 0), \"dup v30.4h, v29.h[0]\");\n  TEST_SINGLE(dup(SubRegSize::i32Bit, DReg::d30, DReg::d29, 0), \"dup v30.2s, v29.s[0]\");\n  // TEST_SINGLE(dup(SubRegSize::i64Bit, DReg::d30, DReg::d29, 0), \"dup v30.1d, v29.d[0]\");\n  TEST_SINGLE(dup(SubRegSize::i8Bit, DReg::d30, DReg::d29, 15), \"dup v30.8b, v29.b[15]\");\n  TEST_SINGLE(dup(SubRegSize::i16Bit, DReg::d30, DReg::d29, 7), \"dup v30.4h, v29.h[7]\");\n  TEST_SINGLE(dup(SubRegSize::i32Bit, DReg::d30, DReg::d29, 3), \"dup v30.2s, v29.s[3]\");\n  // TEST_SINGLE(dup(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1), \"dup v30.1d, v29.d[1]\");\n\n  TEST_SINGLE(dup(SubRegSize::i8Bit, QReg::q30, Reg::r29), \"dup v30.16b, w29\");\n  TEST_SINGLE(dup(SubRegSize::i16Bit, QReg::q30, Reg::r29), \"dup v30.8h, w29\");\n  TEST_SINGLE(dup(SubRegSize::i32Bit, QReg::q30, Reg::r29), \"dup v30.4s, w29\");\n  TEST_SINGLE(dup(SubRegSize::i64Bit, QReg::q30, Reg::r29), \"dup v30.2d, x29\");\n\n  TEST_SINGLE(dup(SubRegSize::i8Bit, DReg::d30, Reg::r29), \"dup v30.8b, w29\");\n  TEST_SINGLE(dup(SubRegSize::i16Bit, DReg::d30, Reg::r29), \"dup v30.4h, w29\");\n  TEST_SINGLE(dup(SubRegSize::i32Bit, DReg::d30, Reg::r29), \"dup v30.2s, w29\");\n  // TEST_SINGLE(dup(SubRegSize::i64Bit, DReg::d30, Reg::r29), \"dup v30.1d, x29\");\n  TEST_SINGLE(smov<SubRegSize::i8Bit>(XReg::x29, VReg::v30, 0), \"smov x29, v30.b[0]\");\n  TEST_SINGLE(smov<SubRegSize::i8Bit>(XReg::x29, VReg::v30, 15), \"smov x29, v30.b[15]\");\n  TEST_SINGLE(smov<SubRegSize::i16Bit>(XReg::x29, VReg::v30, 0), \"smov x29, v30.h[0]\");\n  TEST_SINGLE(smov<SubRegSize::i16Bit>(XReg::x29, VReg::v30, 7), \"smov x29, v30.h[7]\");\n  TEST_SINGLE(smov<SubRegSize::i32Bit>(XReg::x29, VReg::v30, 0), \"smov x29, v30.s[0]\");\n  TEST_SINGLE(smov<SubRegSize::i32Bit>(XReg::x29, VReg::v30, 3), \"smov x29, v30.s[3]\");\n\n  TEST_SINGLE(smov<SubRegSize::i8Bit>(WReg::w29, VReg::v30, 0), \"smov w29, v30.b[0]\");\n  TEST_SINGLE(smov<SubRegSize::i8Bit>(WReg::w29, VReg::v30, 15), \"smov w29, v30.b[15]\");\n  TEST_SINGLE(smov<SubRegSize::i16Bit>(WReg::w29, VReg::v30, 0), \"smov w29, v30.h[0]\");\n  TEST_SINGLE(smov<SubRegSize::i16Bit>(WReg::w29, VReg::v30, 7), \"smov w29, v30.h[7]\");\n\n  TEST_SINGLE(umov<SubRegSize::i8Bit>(Reg::r29, VReg::v30, 0), \"umov w29, v30.b[0]\");\n  TEST_SINGLE(umov<SubRegSize::i8Bit>(Reg::r29, VReg::v30, 15), \"umov w29, v30.b[15]\");\n  TEST_SINGLE(umov<SubRegSize::i16Bit>(Reg::r29, VReg::v30, 0), \"umov w29, v30.h[0]\");\n  TEST_SINGLE(umov<SubRegSize::i16Bit>(Reg::r29, VReg::v30, 7), \"umov w29, v30.h[7]\");\n  TEST_SINGLE(umov<SubRegSize::i32Bit>(Reg::r29, VReg::v30, 0), \"mov w29, v30.s[0]\");\n  TEST_SINGLE(umov<SubRegSize::i32Bit>(Reg::r29, VReg::v30, 3), \"mov w29, v30.s[3]\");\n  TEST_SINGLE(umov<SubRegSize::i64Bit>(Reg::r29, VReg::v30, 0), \"mov x29, v30.d[0]\");\n  TEST_SINGLE(umov<SubRegSize::i64Bit>(Reg::r29, VReg::v30, 1), \"mov x29, v30.d[1]\");\n\n  TEST_SINGLE(ins(SubRegSize::i8Bit, VReg::v30, 0, Reg::r29), \"mov v30.b[0], w29\");\n  TEST_SINGLE(ins(SubRegSize::i16Bit, VReg::v30, 0, Reg::r29), \"mov v30.h[0], w29\");\n  TEST_SINGLE(ins(SubRegSize::i32Bit, VReg::v30, 0, Reg::r29), \"mov v30.s[0], w29\");\n  TEST_SINGLE(ins(SubRegSize::i64Bit, VReg::v30, 0, Reg::r29), \"mov v30.d[0], x29\");\n  TEST_SINGLE(ins(SubRegSize::i8Bit, VReg::v30, 15, Reg::r29), \"mov v30.b[15], w29\");\n  TEST_SINGLE(ins(SubRegSize::i16Bit, VReg::v30, 7, Reg::r29), \"mov v30.h[7], w29\");\n  TEST_SINGLE(ins(SubRegSize::i32Bit, VReg::v30, 3, Reg::r29), \"mov v30.s[3], w29\");\n  TEST_SINGLE(ins(SubRegSize::i64Bit, VReg::v30, 1, Reg::r29), \"mov v30.d[1], x29\");\n\n  TEST_SINGLE(ins(SubRegSize::i8Bit, VReg::v30, 0, VReg::v29, 15), \"mov v30.b[0], v29.b[15]\");\n  TEST_SINGLE(ins(SubRegSize::i16Bit, VReg::v30, 0, VReg::v29, 7), \"mov v30.h[0], v29.h[7]\");\n  TEST_SINGLE(ins(SubRegSize::i32Bit, VReg::v30, 0, VReg::v29, 3), \"mov v30.s[0], v29.s[3]\");\n  TEST_SINGLE(ins(SubRegSize::i64Bit, VReg::v30, 0, VReg::v29, 1), \"mov v30.d[0], v29.d[1]\");\n  TEST_SINGLE(ins(SubRegSize::i8Bit, VReg::v30, 15, VReg::v29, 0), \"mov v30.b[15], v29.b[0]\");\n  TEST_SINGLE(ins(SubRegSize::i16Bit, VReg::v30, 7, VReg::v29, 0), \"mov v30.h[7], v29.h[0]\");\n  TEST_SINGLE(ins(SubRegSize::i32Bit, VReg::v30, 3, VReg::v29, 0), \"mov v30.s[3], v29.s[0]\");\n  TEST_SINGLE(ins(SubRegSize::i64Bit, VReg::v30, 1, VReg::v29, 0), \"mov v30.d[1], v29.d[0]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Advanced SIMD three same (FP16)\") {\n  TEST_SINGLE(fmaxnm(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmaxnm v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmla(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmla v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fadd(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fadd v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmulx(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmulx v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fcmeq(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fcmeq v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmax(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmax v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(frecps(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"frecps v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fminnm(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fminnm v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmls(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmls v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fsub(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fsub v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmin(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmin v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(frsqrts(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"frsqrts v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmaxnmp(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmaxnmp v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(faddp(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"faddp v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmul(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmul v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fcmge(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fcmge v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(facge(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"facge v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmaxp(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmaxp v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fdiv(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fdiv v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fminnmp(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fminnmp v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fabd(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fabd v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fcmgt(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fcmgt v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(facgt(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"facgt v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fminp(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fminp v30.8h, v29.8h, v28.8h\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Advanced SIMD two-register miscellaneous (FP16)\") {\n  TEST_SINGLE(frintn(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"frintn v30.8h, v29.8h\");\n  TEST_SINGLE(frintm(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"frintm v30.8h, v29.8h\");\n  TEST_SINGLE(fcvtns(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtns v30.8h, v29.8h\");\n  TEST_SINGLE(fcvtms(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtms v30.8h, v29.8h\");\n  TEST_SINGLE(fcvtas(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtas v30.8h, v29.8h\");\n  TEST_SINGLE(scvtf(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"scvtf v30.8h, v29.8h\");\n  TEST_SINGLE(fcmgt(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcmgt v30.8h, v29.8h, #0.0\");\n  TEST_SINGLE(fcmeq(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcmeq v30.8h, v29.8h, #0.0\");\n  TEST_SINGLE(fcmlt(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcmlt v30.8h, v29.8h, #0.0\");\n  TEST_SINGLE(fabs(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fabs v30.8h, v29.8h\");\n  TEST_SINGLE(frintp(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"frintp v30.8h, v29.8h\");\n  TEST_SINGLE(frintz(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"frintz v30.8h, v29.8h\");\n  TEST_SINGLE(fcvtps(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtps v30.8h, v29.8h\");\n  TEST_SINGLE(fcvtzs(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtzs v30.8h, v29.8h\");\n  TEST_SINGLE(frecpe(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"frecpe v30.8h, v29.8h\");\n  TEST_SINGLE(frinta(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"frinta v30.8h, v29.8h\");\n  TEST_SINGLE(frintx(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"frintx v30.8h, v29.8h\");\n  TEST_SINGLE(fcvtnu(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtnu v30.8h, v29.8h\");\n  TEST_SINGLE(fcvtmu(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtmu v30.8h, v29.8h\");\n  TEST_SINGLE(fcvtau(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtau v30.8h, v29.8h\");\n  TEST_SINGLE(ucvtf(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"ucvtf v30.8h, v29.8h\");\n  TEST_SINGLE(fcmge(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcmge v30.8h, v29.8h, #0.0\");\n  TEST_SINGLE(fcmle(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcmle v30.8h, v29.8h, #0.0\");\n  TEST_SINGLE(fneg(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fneg v30.8h, v29.8h\");\n  TEST_SINGLE(frinti(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"frinti v30.8h, v29.8h\");\n  TEST_SINGLE(fcvtpu(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtpu v30.8h, v29.8h\");\n  TEST_SINGLE(fcvtzu(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtzu v30.8h, v29.8h\");\n  TEST_SINGLE(frsqrte(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"frsqrte v30.8h, v29.8h\");\n  TEST_SINGLE(fsqrt(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fsqrt v30.8h, v29.8h\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Advanced SIMD three-register extension\") {\n  TEST_SINGLE(sdot(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sdot v30.4s, v29.16b, v28.16b\");\n  TEST_SINGLE(sdot(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sdot v30.2s, v29.8b, v28.8b\");\n\n  TEST_SINGLE(usdot(QReg::q30, QReg::q29, QReg::q28), \"usdot v30.4s, v29.16b, v28.16b\");\n  TEST_SINGLE(usdot(DReg::d30, DReg::d29, DReg::d28), \"usdot v30.2s, v29.8b, v28.8b\");\n\n  TEST_SINGLE(sqrdmlah(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sqrdmlah v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(sqrdmlah(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sqrdmlah v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(sqrdmlah(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sqrdmlah v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(sqrdmlah(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sqrdmlah v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(sqrdmlah(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sqrdmlah v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sqrdmlsh v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sqrdmlsh v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sqrdmlsh v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sqrdmlsh v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(sqrdmlsh(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sqrdmlsh v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(udot(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"udot v30.4s, v29.16b, v28.16b\");\n  TEST_SINGLE(udot(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"udot v30.2s, v29.8b, v28.8b\");\n  // TEST_SINGLE(udot(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"udot v30.1d, v29.8b, v28.8b\");\n\n  // TEST_SINGLE(fcmla(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_0), \"fcmla v30.16b, v29.16b, v28.16b, #0\");\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_0), \"fcmla v30.8h, v29.8h, v28.8h, #0\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_0), \"fcmla v30.4s, v29.4s, v28.4s, #0\");\n  TEST_SINGLE(fcmla(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_0), \"fcmla v30.2d, v29.2d, v28.2d, #0\");\n  // TEST_SINGLE(fcmla(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_0), \"fcmla v30.8b, v29.8b, v28.8b, #0\");\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_0), \"fcmla v30.4h, v29.4h, v28.4h, #0\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_0), \"fcmla v30.2s, v29.2s, v28.2s, #0\");\n  // TEST_SINGLE(fcmla(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_0), \"fcmla v30.1d, v29.1d, v28.1d, #0\");\n\n  // TEST_SINGLE(fcmla(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_90), \"fcmla v30.16b, v29.16b, v28.16b, #90\");\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_90), \"fcmla v30.8h, v29.8h, v28.8h, #90\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_90), \"fcmla v30.4s, v29.4s, v28.4s, #90\");\n  TEST_SINGLE(fcmla(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_90), \"fcmla v30.2d, v29.2d, v28.2d, #90\");\n  // TEST_SINGLE(fcmla(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_90), \"fcmla v30.8b, v29.8b, v28.8b, #90\");\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_90), \"fcmla v30.4h, v29.4h, v28.4h, #90\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_90), \"fcmla v30.2s, v29.2s, v28.2s, #90\");\n  // TEST_SINGLE(fcmla(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_90), \"fcmla v30.1d, v29.1d, v28.1d, #90\");\n\n  // Vixl disassembler has a bug that claims 8-bit fcmla exists\n  // TEST_SINGLE(fcmla(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_180), \"fcmla v30.16b, v29.16b, v28.16b, #180\");\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_180), \"fcmla v30.8h, v29.8h, v28.8h, #180\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_180), \"fcmla v30.4s, v29.4s, v28.4s, #180\");\n  TEST_SINGLE(fcmla(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_180), \"fcmla v30.2d, v29.2d, v28.2d, #180\");\n  // TEST_SINGLE(fcmla(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_180), \"fcmla v30.8b, v29.8b, v28.8b, #180\");\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_180), \"fcmla v30.4h, v29.4h, v28.4h, #180\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_180), \"fcmla v30.2s, v29.2s, v28.2s, #180\");\n  // TEST_SINGLE(fcmla(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_180), \"fcmla v30.1d, v29.1d, v28.1d, #180\");\n\n  // TEST_SINGLE(fcmla(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_270), \"fcmla v30.16b, v29.16b, v28.16b, #270\");\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_270), \"fcmla v30.8h, v29.8h, v28.8h, #270\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_270), \"fcmla v30.4s, v29.4s, v28.4s, #270\");\n  TEST_SINGLE(fcmla(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_270), \"fcmla v30.2d, v29.2d, v28.2d, #270\");\n  // TEST_SINGLE(fcmla(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_270), \"fcmla v30.8b, v29.8b, v28.8b, #270\");\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_270), \"fcmla v30.4h, v29.4h, v28.4h, #270\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_270), \"fcmla v30.2s, v29.2s, v28.2s, #270\");\n  // TEST_SINGLE(fcmla(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_270), \"fcmla v30.1d, v29.1d, v28.1d, #270\");\n\n  // Vixl disassembler has a bug that claims 8-bit fcadd exists\n  // TEST_SINGLE(fcadd(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_90), \"fcadd v30.16b, v29.16b, v28.16b, #90\");\n  TEST_SINGLE(fcadd(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_90), \"fcadd v30.8h, v29.8h, v28.8h, #90\");\n  TEST_SINGLE(fcadd(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_90), \"fcadd v30.4s, v29.4s, v28.4s, #90\");\n  TEST_SINGLE(fcadd(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_90), \"fcadd v30.2d, v29.2d, v28.2d, #90\");\n  // TEST_SINGLE(fcadd(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_90), \"fcadd v30.8b, v29.8b, v28.8b, #90\");\n  TEST_SINGLE(fcadd(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_90), \"fcadd v30.4h, v29.4h, v28.4h, #90\");\n  TEST_SINGLE(fcadd(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_90), \"fcadd v30.2s, v29.2s, v28.2s, #90\");\n  // TEST_SINGLE(fcadd(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_90), \"fcadd v30.1d, v29.1d, v28.1d, #90\");\n\n  // TEST_SINGLE(fcadd(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_270), \"fcadd v30.16b, v29.16b, v28.16b, #270\");\n  TEST_SINGLE(fcadd(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_270), \"fcadd v30.8h, v29.8h, v28.8h, #270\");\n  TEST_SINGLE(fcadd(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_270), \"fcadd v30.4s, v29.4s, v28.4s, #270\");\n  TEST_SINGLE(fcadd(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28, Rotation::ROTATE_270), \"fcadd v30.2d, v29.2d, v28.2d, #270\");\n  // TEST_SINGLE(fcadd(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_270), \"fcadd v30.8b, v29.8b, v28.8b, #270\");\n  TEST_SINGLE(fcadd(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_270), \"fcadd v30.4h, v29.4h, v28.4h, #270\");\n  TEST_SINGLE(fcadd(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_270), \"fcadd v30.2s, v29.2s, v28.2s, #270\");\n  // TEST_SINGLE(fcadd(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28, Rotation::ROTATE_270), \"fcadd v30.1d, v29.1d, v28.1d, #270\");\n\n  // TODO: Enable once vixl disassembler supports these instructions\n  // TEST_SINGLE(bfdot(QReg::q30, QReg::q29, QReg::q28), \"bfdot v30.4s, v29.8h, v28.8h\");\n  // TEST_SINGLE(bfdot(DReg::d30, DReg::d29, DReg::d28), \"bfdot v30.2s, v29.4h, v28.4h\");\n  // TEST_SINGLE(bfmlalb(VReg::v30, VReg::v29, VReg::v28), \"bfmlalb v30.4s, v29.8h, v28.8h\");\n  // TEST_SINGLE(bfmlalt(VReg::v30, VReg::v29, VReg::v28), \"bfmlalt v30.4s, v29.8h, v28.8h\");\n\n  TEST_SINGLE(smmla(VReg::v30, VReg::v29, VReg::v28), \"smmla v30.4s, v29.16b, v28.16b\");\n  TEST_SINGLE(usmmla(VReg::v30, VReg::v29, VReg::v28), \"usmmla v30.4s, v29.16b, v28.16b\");\n  // TODO: Enable once vixl disassembler supports these instructions\n  // TEST_SINGLE(bfmmla(VReg::v30, VReg::v29, VReg::v28), \"bfmmla v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(ummla(VReg::v30, VReg::v29, VReg::v28), \"ummla v30.4s, v29.16b, v28.16b\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Advanced SIMD two-register miscellaneous\") {\n  // Commented out lines showcase unallocated encodings.\n  TEST_SINGLE(rev64(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"rev64 v30.16b, v29.16b\");\n  TEST_SINGLE(rev64(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"rev64 v30.8h, v29.8h\");\n  TEST_SINGLE(rev64(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"rev64 v30.4s, v29.4s\");\n  // TEST_SINGLE(rev64(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"rev64 v30.2d, v29.2d\");\n\n  TEST_SINGLE(rev64(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"rev64 v30.8b, v29.8b\");\n  TEST_SINGLE(rev64(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"rev64 v30.4h, v29.4h\");\n  TEST_SINGLE(rev64(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"rev64 v30.2s, v29.2s\");\n  // TEST_SINGLE(rev64(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"rev64 v30.1d, v29.1d\");\n\n  TEST_SINGLE(rev16(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"rev16 v30.16b, v29.16b\");\n  // TEST_SINGLE(rev16(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"rev16 v30.8h, v29.8h\");\n  // TEST_SINGLE(rev16(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"rev16 v30.4s, v29.4s\");\n  // TEST_SINGLE(rev16(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"rev16 v30.2d, v29.2d\");\n\n  TEST_SINGLE(rev16(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"rev16 v30.8b, v29.8b\");\n  // TEST_SINGLE(rev16(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"rev16 v30.4h, v29.4h\");\n  // TEST_SINGLE(rev16(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"rev16 v30.2s, v29.2s\");\n  // TEST_SINGLE(rev16(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"rev16 v30.1d, v29.1d\");\n\n  // TEST_SINGLE(saddlp(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"saddlp v30.16b, v29.16b\");\n  TEST_SINGLE(saddlp(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"saddlp v30.8h, v29.16b\");\n  TEST_SINGLE(saddlp(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"saddlp v30.4s, v29.8h\");\n  TEST_SINGLE(saddlp(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"saddlp v30.2d, v29.4s\");\n\n  // TEST_SINGLE(saddlp(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"saddlp v30.8b, v29.8b\");\n  TEST_SINGLE(saddlp(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"saddlp v30.4h, v29.8b\");\n  TEST_SINGLE(saddlp(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"saddlp v30.2s, v29.4h\");\n  TEST_SINGLE(saddlp(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"saddlp v30.1d, v29.2s\");\n\n  TEST_SINGLE(suqadd(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"suqadd v30.16b, v29.16b\");\n  TEST_SINGLE(suqadd(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"suqadd v30.8h, v29.8h\");\n  TEST_SINGLE(suqadd(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"suqadd v30.4s, v29.4s\");\n  TEST_SINGLE(suqadd(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"suqadd v30.2d, v29.2d\");\n\n  TEST_SINGLE(suqadd(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"suqadd v30.8b, v29.8b\");\n  TEST_SINGLE(suqadd(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"suqadd v30.4h, v29.4h\");\n  TEST_SINGLE(suqadd(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"suqadd v30.2s, v29.2s\");\n  // TEST_SINGLE(suqadd(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"suqadd v30.1d, v29.1d\");\n\n  TEST_SINGLE(cls(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"cls v30.16b, v29.16b\");\n  TEST_SINGLE(cls(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"cls v30.8h, v29.8h\");\n  TEST_SINGLE(cls(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"cls v30.4s, v29.4s\");\n  // TEST_SINGLE(cls(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"cls v30.2d, v29.2d\");\n\n  TEST_SINGLE(cls(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"cls v30.8b, v29.8b\");\n  TEST_SINGLE(cls(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"cls v30.4h, v29.4h\");\n  TEST_SINGLE(cls(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"cls v30.2s, v29.2s\");\n  // TEST_SINGLE(cls(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"cls v30.1d, v29.1d\");\n\n  TEST_SINGLE(cnt(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"cnt v30.16b, v29.16b\");\n  // TEST_SINGLE(cnt(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"cnt v30.8h, v29.8h\");\n  // TEST_SINGLE(cnt(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"cnt v30.4s, v29.4s\");\n  // TEST_SINGLE(cnt(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"cnt v30.2d, v29.2d\");\n\n  TEST_SINGLE(cnt(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"cnt v30.8b, v29.8b\");\n  // TEST_SINGLE(cnt(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"cnt v30.4h, v29.4h\");\n  // TEST_SINGLE(cnt(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"cnt v30.2s, v29.2s\");\n  // TEST_SINGLE(cnt(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"cnt v30.1d, v29.1d\");\n\n  // TEST_SINGLE(sadalp(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"sadalp v30.16b, v29.16b\");\n  TEST_SINGLE(sadalp(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"sadalp v30.8h, v29.16b\");\n  TEST_SINGLE(sadalp(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"sadalp v30.4s, v29.8h\");\n  TEST_SINGLE(sadalp(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"sadalp v30.2d, v29.4s\");\n\n  // TEST_SINGLE(sadalp(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"sadalp v30.8b, v29.8b\");\n  TEST_SINGLE(sadalp(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"sadalp v30.4h, v29.8b\");\n  TEST_SINGLE(sadalp(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"sadalp v30.2s, v29.4h\");\n  TEST_SINGLE(sadalp(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"sadalp v30.1d, v29.2s\");\n\n  TEST_SINGLE(sqabs(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"sqabs v30.16b, v29.16b\");\n  TEST_SINGLE(sqabs(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"sqabs v30.8h, v29.8h\");\n  TEST_SINGLE(sqabs(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"sqabs v30.4s, v29.4s\");\n  TEST_SINGLE(sqabs(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"sqabs v30.2d, v29.2d\");\n\n  TEST_SINGLE(sqabs(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"sqabs v30.8b, v29.8b\");\n  TEST_SINGLE(sqabs(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"sqabs v30.4h, v29.4h\");\n  TEST_SINGLE(sqabs(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"sqabs v30.2s, v29.2s\");\n  // TEST_SINGLE(sqabs(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"sqabs v30.1d, v29.1d\");\n\n  TEST_SINGLE(cmgt(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"cmgt v30.16b, v29.16b, #0\");\n  TEST_SINGLE(cmgt(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"cmgt v30.8h, v29.8h, #0\");\n  TEST_SINGLE(cmgt(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"cmgt v30.4s, v29.4s, #0\");\n  TEST_SINGLE(cmgt(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"cmgt v30.2d, v29.2d, #0\");\n\n  TEST_SINGLE(cmgt(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"cmgt v30.8b, v29.8b, #0\");\n  TEST_SINGLE(cmgt(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"cmgt v30.4h, v29.4h, #0\");\n  TEST_SINGLE(cmgt(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"cmgt v30.2s, v29.2s, #0\");\n  // TEST_SINGLE(cmgt(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"cmgt v30.1d, v29.1d, #0\");\n\n  TEST_SINGLE(cmeq(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"cmeq v30.16b, v29.16b, #0\");\n  TEST_SINGLE(cmeq(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"cmeq v30.8h, v29.8h, #0\");\n  TEST_SINGLE(cmeq(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"cmeq v30.4s, v29.4s, #0\");\n  TEST_SINGLE(cmeq(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"cmeq v30.2d, v29.2d, #0\");\n\n  TEST_SINGLE(cmeq(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"cmeq v30.8b, v29.8b, #0\");\n  TEST_SINGLE(cmeq(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"cmeq v30.4h, v29.4h, #0\");\n  TEST_SINGLE(cmeq(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"cmeq v30.2s, v29.2s, #0\");\n  // TEST_SINGLE(cmeq(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"cmeq v30.1d, v29.1d, #0\");\n\n  TEST_SINGLE(cmlt(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"cmlt v30.16b, v29.16b, #0\");\n  TEST_SINGLE(cmlt(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"cmlt v30.8h, v29.8h, #0\");\n  TEST_SINGLE(cmlt(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"cmlt v30.4s, v29.4s, #0\");\n  TEST_SINGLE(cmlt(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"cmlt v30.2d, v29.2d, #0\");\n\n  TEST_SINGLE(cmlt(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"cmlt v30.8b, v29.8b, #0\");\n  TEST_SINGLE(cmlt(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"cmlt v30.4h, v29.4h, #0\");\n  TEST_SINGLE(cmlt(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"cmlt v30.2s, v29.2s, #0\");\n  // TEST_SINGLE(cmlt(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"cmlt v30.1d, v29.1d, #0\");\n\n  TEST_SINGLE(abs(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"abs v30.16b, v29.16b\");\n  TEST_SINGLE(abs(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"abs v30.8h, v29.8h\");\n  TEST_SINGLE(abs(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"abs v30.4s, v29.4s\");\n  TEST_SINGLE(abs(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"abs v30.2d, v29.2d\");\n\n  TEST_SINGLE(abs(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"abs v30.8b, v29.8b\");\n  TEST_SINGLE(abs(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"abs v30.4h, v29.4h\");\n  TEST_SINGLE(abs(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"abs v30.2s, v29.2s\");\n  // TEST_SINGLE(abs(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"abs v30.1d, v29.1d\");\n\n  TEST_SINGLE(xtn(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"xtn v30.8b, v29.8h\");\n  TEST_SINGLE(xtn(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"xtn v30.4h, v29.4s\");\n  TEST_SINGLE(xtn(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"xtn v30.2s, v29.2d\");\n  // TEST_SINGLE(xtn(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"xtn v30.2d, v29.1d\");\n\n  TEST_SINGLE(xtn(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"xtn v30.8b, v29.8h\");\n  TEST_SINGLE(xtn(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"xtn v30.4h, v29.4s\");\n  TEST_SINGLE(xtn(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"xtn v30.2s, v29.2d\");\n  // TEST_SINGLE(xtn(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"xtn v30.1d, v29.1d\");\n\n  TEST_SINGLE(xtn2(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"xtn2 v30.16b, v29.8h\");\n  TEST_SINGLE(xtn2(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"xtn2 v30.8h, v29.4s\");\n  TEST_SINGLE(xtn2(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"xtn2 v30.4s, v29.2d\");\n  // TEST_SINGLE(xtn2(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"xtn2 v30.2d, v29.1d\");\n\n  TEST_SINGLE(xtn2(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"xtn2 v30.16b, v29.8h\");\n  TEST_SINGLE(xtn2(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"xtn2 v30.8h, v29.4s\");\n  TEST_SINGLE(xtn2(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"xtn2 v30.4s, v29.2d\");\n  // TEST_SINGLE(xtn2(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"xtn2 v30.2d, v29.1d\");\n\n  TEST_SINGLE(sqxtn(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"sqxtn v30.8b, v29.8h\");\n  TEST_SINGLE(sqxtn(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"sqxtn v30.4h, v29.4s\");\n  TEST_SINGLE(sqxtn(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"sqxtn v30.2s, v29.2d\");\n  // TEST_SINGLE(sqxtn(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"sqxtn v30.2d, v29.1d\");\n\n  TEST_SINGLE(sqxtn(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"sqxtn v30.8b, v29.8h\");\n  TEST_SINGLE(sqxtn(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"sqxtn v30.4h, v29.4s\");\n  TEST_SINGLE(sqxtn(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"sqxtn v30.2s, v29.2d\");\n  // TEST_SINGLE(sqxtn(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"sqxtn v30.1d, v29.1d\");\n\n  TEST_SINGLE(sqxtn2(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"sqxtn2 v30.16b, v29.8h\");\n  TEST_SINGLE(sqxtn2(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"sqxtn2 v30.8h, v29.4s\");\n  TEST_SINGLE(sqxtn2(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"sqxtn2 v30.4s, v29.2d\");\n  // TEST_SINGLE(sqxtn2(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"sqxtn2 v30.2d, v29.1d\");\n\n  TEST_SINGLE(sqxtn2(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"sqxtn2 v30.16b, v29.8h\");\n  TEST_SINGLE(sqxtn2(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"sqxtn2 v30.8h, v29.4s\");\n  TEST_SINGLE(sqxtn2(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"sqxtn2 v30.4s, v29.2d\");\n  // TEST_SINGLE(sqxtn2(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"sqxtn2 v30.2d, v29.1d\");\n\n  // TEST_SINGLE(fcvtn(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"fcvtn v30.8b, v29.8h\");\n  TEST_SINGLE(fcvtn(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtn v30.4h, v29.4s\");\n  TEST_SINGLE(fcvtn(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtn v30.2s, v29.2d\");\n  // TEST_SINGLE(fcvtn(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtn v30.2d, v29.1d\");\n\n  // TEST_SINGLE(fcvtn(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"fcvtn v30.8b, v29.8h\");\n  TEST_SINGLE(fcvtn(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"fcvtn v30.4h, v29.4s\");\n  TEST_SINGLE(fcvtn(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtn v30.2s, v29.2d\");\n  // TEST_SINGLE(fcvtn(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtn v30.1d, v29.1d\");\n\n  // TEST_SINGLE(fcvtn2(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"fcvtn2 v30.16b, v29.8h\");\n  TEST_SINGLE(fcvtn2(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtn2 v30.8h, v29.4s\");\n  TEST_SINGLE(fcvtn2(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtn2 v30.4s, v29.2d\");\n  // TEST_SINGLE(fcvtn2(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtn2 v30.2d, v29.1d\");\n\n  // TEST_SINGLE(fcvtn2(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"fcvtn2 v30.16b, v29.8h\");\n  TEST_SINGLE(fcvtn2(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"fcvtn2 v30.8h, v29.4s\");\n  TEST_SINGLE(fcvtn2(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtn2 v30.4s, v29.2d\");\n  // TEST_SINGLE(fcvtn2(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtn2 v30.2d, v29.1d\");\n\n  // TEST_SINGLE(fcvtl(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"fcvtl v30.8b, v29.8h\");\n  // TEST_SINGLE(fcvtl(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtl v30.4h, v29.4s\");\n  TEST_SINGLE(fcvtl(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtl v30.4s, v29.4h\");\n  TEST_SINGLE(fcvtl(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtl v30.2d, v29.2s\");\n\n  // TEST_SINGLE(fcvtl(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"fcvtl v30.8b, v29.8h\");\n  // TEST_SINGLE(fcvtl(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"fcvtl v30.4h, v29.4s\");\n  TEST_SINGLE(fcvtl(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtl v30.4s, v29.4h\");\n  TEST_SINGLE(fcvtl(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtl v30.2d, v29.2s\");\n\n  // TEST_SINGLE(fcvtl2(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"fcvtl2 v30.16b, v29.8h\");\n  // TEST_SINGLE(fcvtl2(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtl2 v30.8h, v29.4s\");\n  TEST_SINGLE(fcvtl2(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtl2 v30.4s, v29.8h\");\n  TEST_SINGLE(fcvtl2(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtl2 v30.2d, v29.4s\");\n\n  // TEST_SINGLE(fcvtl2(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"fcvtl2 v30.16b, v29.8h\");\n  // TEST_SINGLE(fcvtl2(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"fcvtl2 v30.8h, v29.4s\");\n  TEST_SINGLE(fcvtl2(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtl2 v30.4s, v29.8h\");\n  TEST_SINGLE(fcvtl2(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtl2 v30.2d, v29.4s\");\n\n  TEST_SINGLE(frintn(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"frintn v30.4s, v29.4s\");\n  TEST_SINGLE(frintn(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"frintn v30.2d, v29.2d\");\n  TEST_SINGLE(frintn(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"frintn v30.2s, v29.2s\");\n  // TEST_SINGLE(frintn(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"frintn v30.1d, v29.1d\");\n\n  TEST_SINGLE(frintm(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"frintm v30.4s, v29.4s\");\n  TEST_SINGLE(frintm(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"frintm v30.2d, v29.2d\");\n  TEST_SINGLE(frintm(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"frintm v30.2s, v29.2s\");\n  // TEST_SINGLE(frintm(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"frintm v30.1d, v29.1d\");\n\n  TEST_SINGLE(fcvtns(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtns v30.4s, v29.4s\");\n  TEST_SINGLE(fcvtns(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtns v30.2d, v29.2d\");\n  TEST_SINGLE(fcvtns(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtns v30.2s, v29.2s\");\n  // TEST_SINGLE(fcvtns(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtns v30.1d, v29.1d\");\n\n  TEST_SINGLE(fcvtms(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtms v30.4s, v29.4s\");\n  TEST_SINGLE(fcvtms(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtms v30.2d, v29.2d\");\n  TEST_SINGLE(fcvtms(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtms v30.2s, v29.2s\");\n  // TEST_SINGLE(fcvtms(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtms v30.1d, v29.1d\");\n\n  TEST_SINGLE(fcvtas(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtas v30.4s, v29.4s\");\n  TEST_SINGLE(fcvtas(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtas v30.2d, v29.2d\");\n  TEST_SINGLE(fcvtas(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtas v30.2s, v29.2s\");\n  // TEST_SINGLE(fcvtas(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtas v30.1d, v29.1d\");\n\n  TEST_SINGLE(scvtf(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"scvtf v30.4s, v29.4s\");\n  TEST_SINGLE(scvtf(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"scvtf v30.2d, v29.2d\");\n  TEST_SINGLE(scvtf(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"scvtf v30.2s, v29.2s\");\n  // TEST_SINGLE(scvtf(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"scvtf v30.1d, v29.1d\");\n\n  TEST_SINGLE(frint32z(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"frint32z v30.4s, v29.4s\");\n  TEST_SINGLE(frint32z(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"frint32z v30.2d, v29.2d\");\n  TEST_SINGLE(frint32z(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"frint32z v30.2s, v29.2s\");\n  // TEST_SINGLE(frint32z(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"frint32z v30.1d, v29.1d\");\n\n  TEST_SINGLE(frint64z(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"frint64z v30.4s, v29.4s\");\n  TEST_SINGLE(frint64z(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"frint64z v30.2d, v29.2d\");\n  TEST_SINGLE(frint64z(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"frint64z v30.2s, v29.2s\");\n  // TEST_SINGLE(frint64z(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"frint64z v30.1d, v29.1d\");\n\n  TEST_SINGLE(fcmgt(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcmgt v30.4s, v29.4s, #0.0\");\n  TEST_SINGLE(fcmgt(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcmgt v30.2d, v29.2d, #0.0\");\n  TEST_SINGLE(fcmgt(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcmgt v30.2s, v29.2s, #0.0\");\n  // TEST_SINGLE(fcmgt(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcmgt v30.1d, v29.1d, #0.0\");\n\n  TEST_SINGLE(fcmeq(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcmeq v30.4s, v29.4s, #0.0\");\n  TEST_SINGLE(fcmeq(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcmeq v30.2d, v29.2d, #0.0\");\n  TEST_SINGLE(fcmeq(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcmeq v30.2s, v29.2s, #0.0\");\n  // TEST_SINGLE(fcmeq(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcmeq v30.1d, v29.1d, #0.0\");\n\n  TEST_SINGLE(fcmlt(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcmlt v30.4s, v29.4s, #0.0\");\n  TEST_SINGLE(fcmlt(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcmlt v30.2d, v29.2d, #0.0\");\n  TEST_SINGLE(fcmlt(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcmlt v30.2s, v29.2s, #0.0\");\n  // TEST_SINGLE(fcmlt(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcmlt v30.1d, v29.1d, #0.0\");\n\n  TEST_SINGLE(fabs(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fabs v30.4s, v29.4s\");\n  TEST_SINGLE(fabs(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fabs v30.2d, v29.2d\");\n  TEST_SINGLE(fabs(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fabs v30.2s, v29.2s\");\n  // TEST_SINGLE(fabs(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fabs v30.1d, v29.1d\");\n\n  TEST_SINGLE(frintp(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"frintp v30.4s, v29.4s\");\n  TEST_SINGLE(frintp(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"frintp v30.2d, v29.2d\");\n  TEST_SINGLE(frintp(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"frintp v30.2s, v29.2s\");\n  // TEST_SINGLE(frintp(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"frintp v30.1d, v29.1d\");\n\n  TEST_SINGLE(frintz(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"frintz v30.4s, v29.4s\");\n  TEST_SINGLE(frintz(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"frintz v30.2d, v29.2d\");\n  TEST_SINGLE(frintz(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"frintz v30.2s, v29.2s\");\n  // TEST_SINGLE(frintz(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"frintz v30.1d, v29.1d\");\n\n  TEST_SINGLE(fcvtps(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtps v30.4s, v29.4s\");\n  TEST_SINGLE(fcvtps(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtps v30.2d, v29.2d\");\n  TEST_SINGLE(fcvtps(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtps v30.2s, v29.2s\");\n  // TEST_SINGLE(fcvtps(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtps v30.1d, v29.1d\");\n\n  TEST_SINGLE(fcvtzs(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtzs v30.4s, v29.4s\");\n  TEST_SINGLE(fcvtzs(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtzs v30.2d, v29.2d\");\n  TEST_SINGLE(fcvtzs(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtzs v30.2s, v29.2s\");\n  // TEST_SINGLE(fcvtzs(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtzs v30.1d, v29.1d\");\n\n  TEST_SINGLE(urecpe(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"urecpe v30.4s, v29.4s\");\n  // TEST_SINGLE(urecpe(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"urecpe v30.2d, v29.2d\");\n  TEST_SINGLE(urecpe(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"urecpe v30.2s, v29.2s\");\n  // TEST_SINGLE(urecpe(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"urecpe v30.1d, v29.1d\");\n\n  TEST_SINGLE(frecpe(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"frecpe v30.4s, v29.4s\");\n  TEST_SINGLE(frecpe(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"frecpe v30.2d, v29.2d\");\n  TEST_SINGLE(frecpe(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"frecpe v30.2s, v29.2s\");\n  // TEST_SINGLE(frecpe(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"frecpe v30.1d, v29.1d\");\n\n  TEST_SINGLE(rev32(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"rev32 v30.16b, v29.16b\");\n  TEST_SINGLE(rev32(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"rev32 v30.8h, v29.8h\");\n  // TEST_SINGLE(rev32(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"rev32 v30.4s, v29.4s\");\n  // TEST_SINGLE(rev32(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"rev32 v30.2d, v29.2d\");\n\n  TEST_SINGLE(rev32(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"rev32 v30.8b, v29.8b\");\n  TEST_SINGLE(rev32(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"rev32 v30.4h, v29.4h\");\n  // TEST_SINGLE(rev32(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"rev32 v30.2s, v29.2s\");\n  // TEST_SINGLE(rev32(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"rev32 v30.1d, v29.1d\");\n\n  // TEST_SINGLE(uaddlp(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"uaddlp v30.16b, v29.16b\");\n  TEST_SINGLE(uaddlp(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"uaddlp v30.8h, v29.16b\");\n  TEST_SINGLE(uaddlp(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"uaddlp v30.4s, v29.8h\");\n  TEST_SINGLE(uaddlp(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"uaddlp v30.2d, v29.4s\");\n\n  // TEST_SINGLE(uaddlp(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"uaddlp v30.8b, v29.8b\");\n  TEST_SINGLE(uaddlp(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"uaddlp v30.4h, v29.8b\");\n  TEST_SINGLE(uaddlp(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"uaddlp v30.2s, v29.4h\");\n  TEST_SINGLE(uaddlp(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"uaddlp v30.1d, v29.2s\");\n\n  TEST_SINGLE(usqadd(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"usqadd v30.16b, v29.16b\");\n  TEST_SINGLE(usqadd(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"usqadd v30.8h, v29.8h\");\n  TEST_SINGLE(usqadd(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"usqadd v30.4s, v29.4s\");\n  TEST_SINGLE(usqadd(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"usqadd v30.2d, v29.2d\");\n\n  TEST_SINGLE(usqadd(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"usqadd v30.8b, v29.8b\");\n  TEST_SINGLE(usqadd(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"usqadd v30.4h, v29.4h\");\n  TEST_SINGLE(usqadd(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"usqadd v30.2s, v29.2s\");\n  // TEST_SINGLE(usqadd(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"usqadd v30.1d, v29.1d\");\n\n  TEST_SINGLE(clz(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"clz v30.16b, v29.16b\");\n  TEST_SINGLE(clz(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"clz v30.8h, v29.8h\");\n  TEST_SINGLE(clz(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"clz v30.4s, v29.4s\");\n  // TEST_SINGLE(clz(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"clz v30.2d, v29.2d\");\n\n  TEST_SINGLE(clz(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"clz v30.8b, v29.8b\");\n  TEST_SINGLE(clz(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"clz v30.4h, v29.4h\");\n  TEST_SINGLE(clz(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"clz v30.2s, v29.2s\");\n  // TEST_SINGLE(clz(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"clz v30.1d, v29.1d\");\n\n  // TEST_SINGLE(uadalp(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"uadalp v30.16b, v29.16b\");\n  TEST_SINGLE(uadalp(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"uadalp v30.8h, v29.16b\");\n  TEST_SINGLE(uadalp(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"uadalp v30.4s, v29.8h\");\n  TEST_SINGLE(uadalp(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"uadalp v30.2d, v29.4s\");\n\n  // TEST_SINGLE(uadalp(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"uadalp v30.8b, v29.8b\");\n  TEST_SINGLE(uadalp(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"uadalp v30.4h, v29.8b\");\n  TEST_SINGLE(uadalp(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"uadalp v30.2s, v29.4h\");\n  TEST_SINGLE(uadalp(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"uadalp v30.1d, v29.2s\");\n\n  TEST_SINGLE(sqneg(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"sqneg v30.16b, v29.16b\");\n  TEST_SINGLE(sqneg(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"sqneg v30.8h, v29.8h\");\n  TEST_SINGLE(sqneg(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"sqneg v30.4s, v29.4s\");\n  TEST_SINGLE(sqneg(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"sqneg v30.2d, v29.2d\");\n\n  TEST_SINGLE(sqneg(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"sqneg v30.8b, v29.8b\");\n  TEST_SINGLE(sqneg(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"sqneg v30.4h, v29.4h\");\n  TEST_SINGLE(sqneg(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"sqneg v30.2s, v29.2s\");\n  // TEST_SINGLE(sqneg(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"sqneg v30.1d, v29.1d\");\n\n  TEST_SINGLE(cmge(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"cmge v30.16b, v29.16b, #0\");\n  TEST_SINGLE(cmge(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"cmge v30.8h, v29.8h, #0\");\n  TEST_SINGLE(cmge(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"cmge v30.4s, v29.4s, #0\");\n  TEST_SINGLE(cmge(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"cmge v30.2d, v29.2d, #0\");\n\n  TEST_SINGLE(cmge(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"cmge v30.8b, v29.8b, #0\");\n  TEST_SINGLE(cmge(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"cmge v30.4h, v29.4h, #0\");\n  TEST_SINGLE(cmge(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"cmge v30.2s, v29.2s, #0\");\n  // TEST_SINGLE(cmge(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"cmge v30.1d, v29.1d, #0\");\n  //\n  TEST_SINGLE(cmle(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"cmle v30.16b, v29.16b, #0\");\n  TEST_SINGLE(cmle(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"cmle v30.8h, v29.8h, #0\");\n  TEST_SINGLE(cmle(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"cmle v30.4s, v29.4s, #0\");\n  TEST_SINGLE(cmle(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"cmle v30.2d, v29.2d, #0\");\n\n  TEST_SINGLE(cmle(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"cmle v30.8b, v29.8b, #0\");\n  TEST_SINGLE(cmle(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"cmle v30.4h, v29.4h, #0\");\n  TEST_SINGLE(cmle(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"cmle v30.2s, v29.2s, #0\");\n  // TEST_SINGLE(cmle(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"cmle v30.1d, v29.1d, #0\");\n\n  TEST_SINGLE(neg(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"neg v30.16b, v29.16b\");\n  TEST_SINGLE(neg(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"neg v30.8h, v29.8h\");\n  TEST_SINGLE(neg(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"neg v30.4s, v29.4s\");\n  TEST_SINGLE(neg(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"neg v30.2d, v29.2d\");\n\n  TEST_SINGLE(neg(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"neg v30.8b, v29.8b\");\n  TEST_SINGLE(neg(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"neg v30.4h, v29.4h\");\n  TEST_SINGLE(neg(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"neg v30.2s, v29.2s\");\n  // TEST_SINGLE(neg(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"neg v30.1d, v29.1d\");\n\n  TEST_SINGLE(sqxtun(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"sqxtun v30.8b, v29.8h\");\n  TEST_SINGLE(sqxtun(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"sqxtun v30.4h, v29.4s\");\n  TEST_SINGLE(sqxtun(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"sqxtun v30.2s, v29.2d\");\n  // TEST_SINGLE(sqxtun(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"sqxtun v30.2d, v29.1d\");\n\n  TEST_SINGLE(sqxtun(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"sqxtun v30.8b, v29.8h\");\n  TEST_SINGLE(sqxtun(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"sqxtun v30.4h, v29.4s\");\n  TEST_SINGLE(sqxtun(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"sqxtun v30.2s, v29.2d\");\n  // TEST_SINGLE(sqxtun(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"sqxtun v30.1d, v29.1d\");\n\n  TEST_SINGLE(sqxtun2(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"sqxtun2 v30.16b, v29.8h\");\n  TEST_SINGLE(sqxtun2(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"sqxtun2 v30.8h, v29.4s\");\n  TEST_SINGLE(sqxtun2(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"sqxtun2 v30.4s, v29.2d\");\n  // TEST_SINGLE(sqxtun2(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"sqxtun2 v30.2d, v29.1d\");\n\n  TEST_SINGLE(sqxtun2(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"sqxtun2 v30.16b, v29.8h\");\n  TEST_SINGLE(sqxtun2(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"sqxtun2 v30.8h, v29.4s\");\n  TEST_SINGLE(sqxtun2(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"sqxtun2 v30.4s, v29.2d\");\n  // TEST_SINGLE(sqxtun2(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"sqxtun2 v30.2d, v29.1d\");\n\n  // TEST_SINGLE(shll(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"shll v30.8b, v29.8b, #0\");\n  TEST_SINGLE(shll(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"shll v30.8h, v29.8b, #8\");\n  TEST_SINGLE(shll(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"shll v30.4s, v29.4h, #16\");\n  TEST_SINGLE(shll(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"shll v30.2d, v29.2s, #32\");\n\n  // TEST_SINGLE(shll2(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"shll2 v30.16b, v29.16b, #0\");\n  TEST_SINGLE(shll2(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"shll2 v30.8h, v29.16b, #8\");\n  TEST_SINGLE(shll2(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"shll2 v30.4s, v29.8h, #16\");\n  TEST_SINGLE(shll2(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"shll2 v30.2d, v29.4s, #32\");\n\n  TEST_SINGLE(uqxtn(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"uqxtn v30.8b, v29.8h\");\n  TEST_SINGLE(uqxtn(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"uqxtn v30.4h, v29.4s\");\n  TEST_SINGLE(uqxtn(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"uqxtn v30.2s, v29.2d\");\n  // TEST_SINGLE(uqxtn(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"uqxtn v30.2d, v29.1d\");\n\n  TEST_SINGLE(uqxtn(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"uqxtn v30.8b, v29.8h\");\n  TEST_SINGLE(uqxtn(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"uqxtn v30.4h, v29.4s\");\n  TEST_SINGLE(uqxtn(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"uqxtn v30.2s, v29.2d\");\n  // TEST_SINGLE(uqxtn(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"uqxtn v30.1d, v29.1d\");\n\n  TEST_SINGLE(uqxtn2(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"uqxtn2 v30.16b, v29.8h\");\n  TEST_SINGLE(uqxtn2(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"uqxtn2 v30.8h, v29.4s\");\n  TEST_SINGLE(uqxtn2(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"uqxtn2 v30.4s, v29.2d\");\n  // TEST_SINGLE(uqxtn2(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"uqxtn2 v30.2d, v29.1d\");\n\n  TEST_SINGLE(uqxtn2(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"uqxtn2 v30.16b, v29.8h\");\n  TEST_SINGLE(uqxtn2(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"uqxtn2 v30.8h, v29.4s\");\n  TEST_SINGLE(uqxtn2(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"uqxtn2 v30.4s, v29.2d\");\n  // TEST_SINGLE(uqxtn2(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"uqxtn2 v30.2d, v29.1d\");\n  //\n  // TEST_SINGLE(fcvtxn(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"fcvtxn v30.8b, v29.8h\");\n  // TEST_SINGLE(fcvtxn(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtxn v30.4h, v29.4s\");\n  TEST_SINGLE(fcvtxn(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtxn v30.2s, v29.2d\");\n  // TEST_SINGLE(fcvtxn(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtxn v30.2d, v29.1d\");\n\n  // TEST_SINGLE(fcvtxn(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"fcvtxn v30.8b, v29.8h\");\n  // TEST_SINGLE(fcvtxn(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"fcvtxn v30.4h, v29.4s\");\n  TEST_SINGLE(fcvtxn(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtxn v30.2s, v29.2d\");\n  // TEST_SINGLE(fcvtxn(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtxn v30.1d, v29.1d\");\n\n  // TEST_SINGLE(fcvtxn2(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"fcvtxn2 v30.16b, v29.8h\");\n  // TEST_SINGLE(fcvtxn2(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fcvtxn2 v30.8h, v29.4s\");\n  TEST_SINGLE(fcvtxn2(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtxn2 v30.4s, v29.2d\");\n  // TEST_SINGLE(fcvtxn2(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtxn2 v30.2d, v29.1d\");\n\n  // TEST_SINGLE(fcvtxn2(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"fcvtxn2 v30.16b, v29.8h\");\n  // TEST_SINGLE(fcvtxn2(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"fcvtxn2 v30.8h, v29.4s\");\n  TEST_SINGLE(fcvtxn2(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtxn2 v30.4s, v29.2d\");\n  // TEST_SINGLE(fcvtxn2(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtxn2 v30.2d, v29.1d\");\n\n\n  TEST_SINGLE(frinta(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"frinta v30.4s, v29.4s\");\n  TEST_SINGLE(frinta(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"frinta v30.2d, v29.2d\");\n  TEST_SINGLE(frinta(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"frinta v30.2s, v29.2s\");\n  // TEST_SINGLE(frinta(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"frinta v30.1d, v29.1d\");\n\n  TEST_SINGLE(frintx(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"frintx v30.4s, v29.4s\");\n  TEST_SINGLE(frintx(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"frintx v30.2d, v29.2d\");\n  TEST_SINGLE(frintx(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"frintx v30.2s, v29.2s\");\n  // TEST_SINGLE(frintx(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"frintx v30.1d, v29.1d\");\n\n  TEST_SINGLE(fcvtnu(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtnu v30.4s, v29.4s\");\n  TEST_SINGLE(fcvtnu(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtnu v30.2d, v29.2d\");\n  TEST_SINGLE(fcvtnu(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtnu v30.2s, v29.2s\");\n  // TEST_SINGLE(fcvtnu(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtnu v30.1d, v29.1d\");\n\n  TEST_SINGLE(fcvtmu(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtmu v30.4s, v29.4s\");\n  TEST_SINGLE(fcvtmu(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtmu v30.2d, v29.2d\");\n  TEST_SINGLE(fcvtmu(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtmu v30.2s, v29.2s\");\n  // TEST_SINGLE(fcvtmu(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtmu v30.1d, v29.1d\");\n\n  TEST_SINGLE(fcvtau(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtau v30.4s, v29.4s\");\n  TEST_SINGLE(fcvtau(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtau v30.2d, v29.2d\");\n  TEST_SINGLE(fcvtau(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtau v30.2s, v29.2s\");\n  // TEST_SINGLE(fcvtau(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtau v30.1d, v29.1d\");\n\n  TEST_SINGLE(ucvtf(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"ucvtf v30.4s, v29.4s\");\n  TEST_SINGLE(ucvtf(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"ucvtf v30.2d, v29.2d\");\n  TEST_SINGLE(ucvtf(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"ucvtf v30.2s, v29.2s\");\n  // TEST_SINGLE(ucvtf(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"ucvtf v30.1d, v29.1d\");\n\n  TEST_SINGLE(frint32x(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"frint32x v30.4s, v29.4s\");\n  TEST_SINGLE(frint32x(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"frint32x v30.2d, v29.2d\");\n  TEST_SINGLE(frint32x(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"frint32x v30.2s, v29.2s\");\n  // TEST_SINGLE(frint32x(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"frint32x v30.1d, v29.1d\");\n\n  TEST_SINGLE(frint64x(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"frint64x v30.4s, v29.4s\");\n  TEST_SINGLE(frint64x(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"frint64x v30.2d, v29.2d\");\n  TEST_SINGLE(frint64x(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"frint64x v30.2s, v29.2s\");\n  // TEST_SINGLE(frint64x(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"frint64x v30.1d, v29.1d\");\n\n  TEST_SINGLE(not_(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"mvn v30.16b, v29.16b\");\n  // TEST_SINGLE(not_(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"not v30.8h, v29.8h\");\n  // TEST_SINGLE(not_(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"not v30.4s, v29.4s\");\n  // TEST_SINGLE(not_(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"not v30.2d, v29.2d\");\n\n  TEST_SINGLE(not_(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"mvn v30.8b, v29.8b\");\n  // TEST_SINGLE(not_(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"not v30.4h, v29.4h\");\n  // TEST_SINGLE(not_(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"not v30.2s, v29.2s\");\n  // TEST_SINGLE(not_(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"not v30.1d, v29.1d\");\n\n  TEST_SINGLE(mvn(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"mvn v30.16b, v29.16b\");\n  // TEST_SINGLE(mvn(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"mvn v30.8h, v29.8h\");\n  // TEST_SINGLE(mvn(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"mvn v30.4s, v29.4s\");\n  // TEST_SINGLE(mvn(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"mvn v30.2d, v29.2d\");\n\n  TEST_SINGLE(mvn(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"mvn v30.8b, v29.8b\");\n  // TEST_SINGLE(mvn(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"mvn v30.4h, v29.4h\");\n  // TEST_SINGLE(mvn(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"mvn v30.2s, v29.2s\");\n  // TEST_SINGLE(mvn(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"mvn v30.1d, v29.1d\");\n\n  TEST_SINGLE(rbit(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"rbit v30.16b, v29.16b\");\n  // TEST_SINGLE(rbit(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"rbit v30.8h, v29.8h\");\n  // TEST_SINGLE(rbit(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"rbit v30.4s, v29.4s\");\n  // TEST_SINGLE(rbit(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"rbit v30.2d, v29.2d\");\n\n  TEST_SINGLE(rbit(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"rbit v30.8b, v29.8b\");\n  // TEST_SINGLE(rbit(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"rbit v30.4h, v29.4h\");\n  // TEST_SINGLE(rbit(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"rbit v30.2s, v29.2s\");\n  // TEST_SINGLE(rbit(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"rbit v30.1d, v29.1d\");\n\n  TEST_SINGLE(fcmge(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcmge v30.4s, v29.4s, #0.0\");\n  TEST_SINGLE(fcmge(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcmge v30.2d, v29.2d, #0.0\");\n  TEST_SINGLE(fcmge(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcmge v30.2s, v29.2s, #0.0\");\n  // TEST_SINGLE(fcmge(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcmge v30.1d, v29.1d, #0.0\");\n\n  TEST_SINGLE(fcmle(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcmle v30.4s, v29.4s, #0.0\");\n  TEST_SINGLE(fcmle(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcmle v30.2d, v29.2d, #0.0\");\n  TEST_SINGLE(fcmle(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcmle v30.2s, v29.2s, #0.0\");\n  // TEST_SINGLE(fcmle(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcmle v30.1d, v29.1d, #0.0\");\n\n  TEST_SINGLE(fneg(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fneg v30.4s, v29.4s\");\n  TEST_SINGLE(fneg(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fneg v30.2d, v29.2d\");\n  TEST_SINGLE(fneg(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fneg v30.2s, v29.2s\");\n  // TEST_SINGLE(fneg(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fneg v30.1d, v29.1d\");\n\n  TEST_SINGLE(frinti(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"frinti v30.4s, v29.4s\");\n  TEST_SINGLE(frinti(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"frinti v30.2d, v29.2d\");\n  TEST_SINGLE(frinti(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"frinti v30.2s, v29.2s\");\n  // TEST_SINGLE(frinti(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"frinti v30.1d, v29.1d\");\n\n  TEST_SINGLE(fcvtpu(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtpu v30.4s, v29.4s\");\n  TEST_SINGLE(fcvtpu(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtpu v30.2d, v29.2d\");\n  TEST_SINGLE(fcvtpu(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtpu v30.2s, v29.2s\");\n  // TEST_SINGLE(fcvtpu(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtpu v30.1d, v29.1d\");\n\n  TEST_SINGLE(fcvtzu(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fcvtzu v30.4s, v29.4s\");\n  TEST_SINGLE(fcvtzu(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fcvtzu v30.2d, v29.2d\");\n  TEST_SINGLE(fcvtzu(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fcvtzu v30.2s, v29.2s\");\n  // TEST_SINGLE(fcvtzu(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fcvtzu v30.1d, v29.1d\");\n\n  TEST_SINGLE(ursqrte(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"ursqrte v30.4s, v29.4s\");\n  // TEST_SINGLE(ursqrte(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"ursqrte v30.2d, v29.2d\");\n  TEST_SINGLE(ursqrte(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"ursqrte v30.2s, v29.2s\");\n  // TEST_SINGLE(ursqrte(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"ursqrte v30.1d, v29.1d\");\n\n  TEST_SINGLE(frsqrte(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"frsqrte v30.4s, v29.4s\");\n  TEST_SINGLE(frsqrte(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"frsqrte v30.2d, v29.2d\");\n  TEST_SINGLE(frsqrte(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"frsqrte v30.2s, v29.2s\");\n  // TEST_SINGLE(frsqrte(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"frsqrte v30.1d, v29.1d\");\n\n  TEST_SINGLE(fsqrt(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fsqrt v30.4s, v29.4s\");\n  TEST_SINGLE(fsqrt(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fsqrt v30.2d, v29.2d\");\n  TEST_SINGLE(fsqrt(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fsqrt v30.2s, v29.2s\");\n  // TEST_SINGLE(fsqrt(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fsqrt v30.1d, v29.1d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Advanced SIMD across lanes\") {\n  // TEST_SINGLE(saddlv(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"saddlv v30.16b, v29.16b\");\n  TEST_SINGLE(saddlv(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"saddlv h30, v29.16b\");\n  TEST_SINGLE(saddlv(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"saddlv s30, v29.8h\");\n  TEST_SINGLE(saddlv(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"saddlv d30, v29.4s\");\n\n  // TEST_SINGLE(saddlv(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"saddlv v30.8b, v29.8b\");\n  TEST_SINGLE(saddlv(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"saddlv h30, v29.8b\");\n  TEST_SINGLE(saddlv(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"saddlv s30, v29.4h\");\n  // TEST_SINGLE(saddlv(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"saddlv d30, v29.1d\");\n\n  TEST_SINGLE(smaxv(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"smaxv b30, v29.16b\");\n  TEST_SINGLE(smaxv(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"smaxv h30, v29.8h\");\n  TEST_SINGLE(smaxv(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"smaxv s30, v29.4s\");\n  // TEST_SINGLE(smaxv(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"smaxv d30, v29.4s\");\n\n  TEST_SINGLE(smaxv(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"smaxv b30, v29.8b\");\n  TEST_SINGLE(smaxv(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"smaxv h30, v29.4h\");\n  // TEST_SINGLE(smaxv(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"smaxv s30, v29.2s\");\n  // TEST_SINGLE(smaxv(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"smaxv d30, v29.1d\");\n\n  TEST_SINGLE(sminv(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"sminv b30, v29.16b\");\n  TEST_SINGLE(sminv(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"sminv h30, v29.8h\");\n  TEST_SINGLE(sminv(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"sminv s30, v29.4s\");\n  // TEST_SINGLE(sminv(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"sminv d30, v29.4s\");\n\n  TEST_SINGLE(sminv(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"sminv b30, v29.8b\");\n  TEST_SINGLE(sminv(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"sminv h30, v29.4h\");\n  // TEST_SINGLE(sminv(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"sminv s30, v29.2s\");\n  // TEST_SINGLE(sminv(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"sminv d30, v29.1d\");\n\n  TEST_SINGLE(addv(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"addv b30, v29.16b\");\n  TEST_SINGLE(addv(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"addv h30, v29.8h\");\n  TEST_SINGLE(addv(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"addv s30, v29.4s\");\n  // TEST_SINGLE(addv(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"addv d30, v29.4s\");\n\n  TEST_SINGLE(addv(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"addv b30, v29.8b\");\n  TEST_SINGLE(addv(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"addv h30, v29.4h\");\n  // TEST_SINGLE(addv(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"addv s30, v29.2s\");\n  // TEST_SINGLE(addv(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"addv d30, v29.1d\");\n\n  // TEST_SINGLE(uaddlv(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"uaddlv v30.16b, v29.16b\");\n  TEST_SINGLE(uaddlv(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"uaddlv h30, v29.16b\");\n  TEST_SINGLE(uaddlv(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"uaddlv s30, v29.8h\");\n  TEST_SINGLE(uaddlv(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"uaddlv d30, v29.4s\");\n\n  // TEST_SINGLE(uaddlv(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"uaddlv v30.8b, v29.8b\");\n  TEST_SINGLE(uaddlv(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"uaddlv h30, v29.8b\");\n  TEST_SINGLE(uaddlv(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"uaddlv s30, v29.4h\");\n  // TEST_SINGLE(uaddlv(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"uaddlv d30, v29.1d\");\n\n  TEST_SINGLE(umaxv(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"umaxv b30, v29.16b\");\n  TEST_SINGLE(umaxv(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"umaxv h30, v29.8h\");\n  TEST_SINGLE(umaxv(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"umaxv s30, v29.4s\");\n  // TEST_SINGLE(umaxv(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"umaxv d30, v29.4s\");\n\n  TEST_SINGLE(umaxv(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"umaxv b30, v29.8b\");\n  TEST_SINGLE(umaxv(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"umaxv h30, v29.4h\");\n  // TEST_SINGLE(umaxv(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"umaxv s30, v29.2s\");\n  // TEST_SINGLE(umaxv(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"umaxv d30, v29.1d\");\n\n  TEST_SINGLE(uminv(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"uminv b30, v29.16b\");\n  TEST_SINGLE(uminv(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"uminv h30, v29.8h\");\n  TEST_SINGLE(uminv(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"uminv s30, v29.4s\");\n  // TEST_SINGLE(uminv(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"uminv d30, v29.4s\");\n\n  TEST_SINGLE(uminv(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"uminv b30, v29.8b\");\n  TEST_SINGLE(uminv(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"uminv h30, v29.4h\");\n  // TEST_SINGLE(uminv(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"uminv s30, v29.2s\");\n  // TEST_SINGLE(uminv(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"uminv d30, v29.1d\");\n\n  // TEST_SINGLE(fmaxnmv(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"fmaxnmv b30, v29.16b\");\n  TEST_SINGLE(fmaxnmv(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fmaxnmv h30, v29.8h\");\n  TEST_SINGLE(fmaxnmv(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fmaxnmv s30, v29.4s\");\n  // TEST_SINGLE(fmaxnmv(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fmaxnmv d30, v29.4s\");\n\n  // TEST_SINGLE(fmaxnmv(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"fmaxnmv b30, v29.8b\");\n  TEST_SINGLE(fmaxnmv(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"fmaxnmv h30, v29.4h\");\n  // TEST_SINGLE(fmaxnmv(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fmaxnmv s30, v29.2s\");\n  // TEST_SINGLE(fmaxnmv(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fmaxnmv d30, v29.1d\");\n\n  // TEST_SINGLE(fmaxv(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"fmaxv b30, v29.16b\");\n  TEST_SINGLE(fmaxv(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fmaxv h30, v29.8h\");\n  TEST_SINGLE(fmaxv(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fmaxv s30, v29.4s\");\n  // TEST_SINGLE(fmaxv(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fmaxv d30, v29.4s\");\n\n  // TEST_SINGLE(fmaxv(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"fmaxv b30, v29.8b\");\n  TEST_SINGLE(fmaxv(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"fmaxv h30, v29.4h\");\n  // TEST_SINGLE(fmaxv(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fmaxv s30, v29.2s\");\n  // TEST_SINGLE(fmaxv(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fmaxv d30, v29.1d\");\n\n  // TEST_SINGLE(fminnmv(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"fminnmv b30, v29.16b\");\n  TEST_SINGLE(fminnmv(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fminnmv h30, v29.8h\");\n  TEST_SINGLE(fminnmv(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fminnmv s30, v29.4s\");\n  // TEST_SINGLE(fminnmv(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fminnmv d30, v29.4s\");\n\n  // TEST_SINGLE(fminnmv(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"fminnmv b30, v29.8b\");\n  TEST_SINGLE(fminnmv(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"fminnmv h30, v29.4h\");\n  // TEST_SINGLE(fminnmv(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fminnmv s30, v29.2s\");\n  // TEST_SINGLE(fminnmv(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fminnmv d30, v29.1d\");\n\n  // TEST_SINGLE(fminv(SubRegSize::i8Bit, QReg::q30, QReg::q29), \"fminv b30, v29.16b\");\n  TEST_SINGLE(fminv(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"fminv h30, v29.8h\");\n  TEST_SINGLE(fminv(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"fminv s30, v29.4s\");\n  // TEST_SINGLE(fminv(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"fminv d30, v29.4s\");\n\n  // TEST_SINGLE(fminv(SubRegSize::i8Bit, DReg::d30, DReg::d29), \"fminv b30, v29.8b\");\n  TEST_SINGLE(fminv(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"fminv h30, v29.4h\");\n  // TEST_SINGLE(fminv(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"fminv s30, v29.2s\");\n  // TEST_SINGLE(fminv(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"fminv d30, v29.1d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Advanced SIMD three different\") {\n  // TEST_SINGLE(saddl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"saddl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(saddl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"saddl v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(saddl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"saddl v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(saddl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"saddl v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(saddl2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"saddl2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(saddl2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"saddl2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(saddl2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"saddl2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(saddl2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"saddl2 v30.2d, v29.4s, v28.4s\");\n\n  // TEST_SINGLE(saddw(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"saddw v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(saddw(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"saddw v30.8h, v29.8h, v28.8b\");\n  TEST_SINGLE(saddw(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"saddw v30.4s, v29.4s, v28.4h\");\n  TEST_SINGLE(saddw(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"saddw v30.2d, v29.2d, v28.2s\");\n\n  // TEST_SINGLE(saddw2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"saddw2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(saddw2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"saddw2 v30.8h, v29.8h, v28.16b\");\n  TEST_SINGLE(saddw2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"saddw2 v30.4s, v29.4s, v28.8h\");\n  TEST_SINGLE(saddw2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"saddw2 v30.2d, v29.2d, v28.4s\");\n\n  // TEST_SINGLE(ssubl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"ssubl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(ssubl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"ssubl v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(ssubl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"ssubl v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(ssubl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"ssubl v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(ssubl2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"ssubl2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(ssubl2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"ssubl2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(ssubl2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"ssubl2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(ssubl2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"ssubl2 v30.2d, v29.4s, v28.4s\");\n\n  // TEST_SINGLE(ssubw(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"ssubw v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(ssubw(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"ssubw v30.8h, v29.8h, v28.8b\");\n  TEST_SINGLE(ssubw(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"ssubw v30.4s, v29.4s, v28.4h\");\n  TEST_SINGLE(ssubw(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"ssubw v30.2d, v29.2d, v28.2s\");\n\n  // TEST_SINGLE(ssubw2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"ssubw2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(ssubw2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"ssubw2 v30.8h, v29.8h, v28.16b\");\n  TEST_SINGLE(ssubw2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"ssubw2 v30.4s, v29.4s, v28.8h\");\n  TEST_SINGLE(ssubw2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"ssubw2 v30.2d, v29.2d, v28.4s\");\n\n  TEST_SINGLE(addhn(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"addhn v30.8b, v29.8h, v28.8h\");\n  TEST_SINGLE(addhn(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"addhn v30.4h, v29.4s, v28.4s\");\n  TEST_SINGLE(addhn(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"addhn v30.2s, v29.2d, v28.2d\");\n  // TEST_SINGLE(addhn(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"addhn v30.2d, v29.2d, v28.2s\");\n\n  TEST_SINGLE(addhn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"addhn2 v30.16b, v29.8h, v28.8h\");\n  TEST_SINGLE(addhn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"addhn2 v30.8h, v29.4s, v28.4s\");\n  TEST_SINGLE(addhn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"addhn2 v30.4s, v29.2d, v28.2d\");\n  // TEST_SINGLE(addhn2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"addhn2 v30.2d, v29.2d, v28.4s\");\n\n  // TEST_SINGLE(sabal(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"sabal v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(sabal(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sabal v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(sabal(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sabal v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(sabal(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sabal v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(sabal2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"sabal2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(sabal2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sabal2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(sabal2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sabal2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(sabal2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"sabal2 v30.2d, v29.4s, v28.4s\");\n\n  TEST_SINGLE(subhn(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"subhn v30.8b, v29.8h, v28.8h\");\n  TEST_SINGLE(subhn(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"subhn v30.4h, v29.4s, v28.4s\");\n  TEST_SINGLE(subhn(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"subhn v30.2s, v29.2d, v28.2d\");\n  // TEST_SINGLE(subhn(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"subhn v30.2d, v29.2d, v28.2s\");\n\n  TEST_SINGLE(subhn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"subhn2 v30.16b, v29.8h, v28.8h\");\n  TEST_SINGLE(subhn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"subhn2 v30.8h, v29.4s, v28.4s\");\n  TEST_SINGLE(subhn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"subhn2 v30.4s, v29.2d, v28.2d\");\n  // TEST_SINGLE(subhn2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"subhn2 v30.2d, v29.2d, v28.4s\");\n\n  // TEST_SINGLE(sabdl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"sabdl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(sabdl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sabdl v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(sabdl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sabdl v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(sabdl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sabdl v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(sabdl2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"sabdl2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(sabdl2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sabdl2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(sabdl2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sabdl2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(sabdl2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"sabdl2 v30.2d, v29.4s, v28.4s\");\n\n  // TEST_SINGLE(smlal(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"smlal v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(smlal(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"smlal v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(smlal(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"smlal v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(smlal(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"smlal v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(smlal2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"smlal2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(smlal2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"smlal2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(smlal2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"smlal2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(smlal2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"smlal2 v30.2d, v29.4s, v28.4s\");\n\n  // TEST_SINGLE(sqdmlal(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmlal v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(sqdmlal(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmlal v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(sqdmlal(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmlal v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(sqdmlal(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmlal v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(sqdmlal2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"sqdmlal2 v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(sqdmlal2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sqdmlal2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(sqdmlal2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sqdmlal2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(sqdmlal2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"sqdmlal2 v30.2d, v29.4s, v28.4s\");\n\n  // TEST_SINGLE(smlsl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"smlsl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(smlsl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"smlsl v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(smlsl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"smlsl v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(smlsl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"smlsl v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(smlsl2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"smlsl2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(smlsl2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"smlsl2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(smlsl2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"smlsl2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(smlsl2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"smlsl2 v30.2d, v29.4s, v28.4s\");\n\n  // TEST_SINGLE(sqdmlsl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmlsl v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(sqdmlsl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmlsl v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(sqdmlsl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmlsl v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(sqdmlsl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmlsl v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(sqdmlsl2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"sqdmlsl2 v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(sqdmlsl2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sqdmlsl2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(sqdmlsl2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sqdmlsl2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(sqdmlsl2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"sqdmlsl2 v30.2d, v29.4s, v28.4s\");\n\n  // TEST_SINGLE(smull(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"smull v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(smull(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"smull v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(smull(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"smull v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(smull(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"smull v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(smull2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"smull2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(smull2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"smull2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(smull2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"smull2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(smull2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"smull2 v30.2d, v29.4s, v28.4s\");\n\n  // TEST_SINGLE(sqdmull(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmull v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(sqdmull(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmull v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(sqdmull(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmull v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(sqdmull(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmull v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(sqdmull2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"sqdmull2 v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(sqdmull2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sqdmull2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(sqdmull2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sqdmull2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(sqdmull2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"sqdmull2 v30.2d, v29.4s, v28.4s\");\n\n  TEST_SINGLE(pmull(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"pmull v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(pmull(SubRegSize::i128Bit, DReg::d30, DReg::d29, DReg::d28), \"pmull v30.1q, v29.1d, v28.1d\");\n\n  TEST_SINGLE(pmull2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"pmull2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(pmull2(SubRegSize::i128Bit, QReg::q30, QReg::q29, QReg::q28), \"pmull2 v30.1q, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(uaddl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"uaddl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uaddl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"uaddl v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(uaddl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"uaddl v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(uaddl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"uaddl v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(uaddl2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"uaddl2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uaddl2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"uaddl2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(uaddl2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"uaddl2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(uaddl2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"uaddl2 v30.2d, v29.4s, v28.4s\");\n\n  // TEST_SINGLE(uaddw(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"uaddw v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uaddw(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"uaddw v30.8h, v29.8h, v28.8b\");\n  TEST_SINGLE(uaddw(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"uaddw v30.4s, v29.4s, v28.4h\");\n  TEST_SINGLE(uaddw(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"uaddw v30.2d, v29.2d, v28.2s\");\n\n  // TEST_SINGLE(uaddw2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"uaddw2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uaddw2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"uaddw2 v30.8h, v29.8h, v28.16b\");\n  TEST_SINGLE(uaddw2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"uaddw2 v30.4s, v29.4s, v28.8h\");\n  TEST_SINGLE(uaddw2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"uaddw2 v30.2d, v29.2d, v28.4s\");\n\n  // TEST_SINGLE(usubl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"usubl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(usubl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"usubl v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(usubl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"usubl v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(usubl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"usubl v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(usubl2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"usubl2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(usubl2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"usubl2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(usubl2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"usubl2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(usubl2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"usubl2 v30.2d, v29.4s, v28.4s\");\n\n  // TEST_SINGLE(usubw(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"usubw v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(usubw(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"usubw v30.8h, v29.8h, v28.8b\");\n  TEST_SINGLE(usubw(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"usubw v30.4s, v29.4s, v28.4h\");\n  TEST_SINGLE(usubw(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"usubw v30.2d, v29.2d, v28.2s\");\n\n  // TEST_SINGLE(usubw2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"usubw2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(usubw2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"usubw2 v30.8h, v29.8h, v28.16b\");\n  TEST_SINGLE(usubw2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"usubw2 v30.4s, v29.4s, v28.8h\");\n  TEST_SINGLE(usubw2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"usubw2 v30.2d, v29.2d, v28.4s\");\n\n  TEST_SINGLE(raddhn(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"raddhn v30.8b, v29.8h, v28.8h\");\n  TEST_SINGLE(raddhn(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"raddhn v30.4h, v29.4s, v28.4s\");\n  TEST_SINGLE(raddhn(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"raddhn v30.2s, v29.2d, v28.2d\");\n\n  TEST_SINGLE(raddhn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"raddhn2 v30.16b, v29.8h, v28.8h\");\n  TEST_SINGLE(raddhn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"raddhn2 v30.8h, v29.4s, v28.4s\");\n  TEST_SINGLE(raddhn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"raddhn2 v30.4s, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(uabal(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"uabal v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uabal(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"uabal v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(uabal(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"uabal v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(uabal(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"uabal v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(uabal2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"uabal2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uabal2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"uabal2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(uabal2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"uabal2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(uabal2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"uabal2 v30.2d, v29.4s, v28.4s\");\n\n  TEST_SINGLE(rsubhn(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"rsubhn v30.8b, v29.8h, v28.8h\");\n  TEST_SINGLE(rsubhn(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"rsubhn v30.4h, v29.4s, v28.4s\");\n  TEST_SINGLE(rsubhn(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"rsubhn v30.2s, v29.2d, v28.2d\");\n\n  TEST_SINGLE(rsubhn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"rsubhn2 v30.16b, v29.8h, v28.8h\");\n  TEST_SINGLE(rsubhn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"rsubhn2 v30.8h, v29.4s, v28.4s\");\n  TEST_SINGLE(rsubhn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"rsubhn2 v30.4s, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(uabdl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"uabdl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uabdl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"uabdl v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(uabdl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"uabdl v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(uabdl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"uabdl v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(uabdl2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"uabdl2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uabdl2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"uabdl2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(uabdl2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"uabdl2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(uabdl2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"uabdl2 v30.2d, v29.4s, v28.4s\");\n\n\n  // TEST_SINGLE(umlal(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"umlal v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(umlal(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"umlal v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(umlal(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"umlal v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(umlal(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"umlal v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(umlal2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"umlal2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(umlal2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"umlal2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(umlal2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"umlal2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(umlal2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"umlal2 v30.2d, v29.4s, v28.4s\");\n\n  // TEST_SINGLE(umlsl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"umlsl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(umlsl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"umlsl v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(umlsl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"umlsl v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(umlsl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"umlsl v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(umlsl2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"umlsl2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(umlsl2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"umlsl2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(umlsl2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"umlsl2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(umlsl2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"umlsl2 v30.2d, v29.4s, v28.4s\");\n\n\n  // TEST_SINGLE(umull(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"umull v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(umull(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"umull v30.8h, v29.8b, v28.8b\");\n  TEST_SINGLE(umull(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"umull v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(umull(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"umull v30.2d, v29.2s, v28.2s\");\n\n  // TEST_SINGLE(umull2(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"umull2 v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(umull2(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"umull2 v30.8h, v29.16b, v28.16b\");\n  TEST_SINGLE(umull2(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"umull2 v30.4s, v29.8h, v28.8h\");\n  TEST_SINGLE(umull2(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"umull2 v30.2d, v29.4s, v28.4s\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Advanced SIMD three same\") {\n  TEST_SINGLE(shadd(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"shadd v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(shadd(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"shadd v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(shadd(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"shadd v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(shadd(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"shadd v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(shadd(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"shadd v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(shadd(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"shadd v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(shadd(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"shadd v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(shadd(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"shadd v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(sqadd(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"sqadd v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(sqadd(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sqadd v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(sqadd(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sqadd v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(sqadd(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"sqadd v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(sqadd(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"sqadd v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(sqadd(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sqadd v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(sqadd(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sqadd v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(sqadd(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sqadd v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(srhadd(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"srhadd v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(srhadd(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"srhadd v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(srhadd(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"srhadd v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(srhadd(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"srhadd v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(srhadd(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"srhadd v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(srhadd(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"srhadd v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(srhadd(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"srhadd v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(srhadd(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"srhadd v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(shsub(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"shsub v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(shsub(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"shsub v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(shsub(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"shsub v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(shsub(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"shsub v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(shsub(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"shsub v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(shsub(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"shsub v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(shsub(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"shsub v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(shsub(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"shsub v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(sqsub(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"sqsub v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(sqsub(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sqsub v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(sqsub(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sqsub v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(sqsub(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"sqsub v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(sqsub(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"sqsub v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(sqsub(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sqsub v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(sqsub(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sqsub v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(sqsub(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sqsub v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(cmgt(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"cmgt v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(cmgt(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"cmgt v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(cmgt(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"cmgt v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(cmgt(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"cmgt v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(cmgt(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"cmgt v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(cmgt(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"cmgt v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(cmgt(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"cmgt v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(cmgt(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"cmgt v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(cmge(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"cmge v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(cmge(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"cmge v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(cmge(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"cmge v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(cmge(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"cmge v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(cmge(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"cmge v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(cmge(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"cmge v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(cmge(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"cmge v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(cmge(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"cmge v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(sshl(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"sshl v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(sshl(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sshl v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(sshl(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sshl v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(sshl(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"sshl v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(sshl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"sshl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(sshl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sshl v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(sshl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sshl v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(sshl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sshl v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(sqshl(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"sqshl v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(sqshl(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sqshl v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(sqshl(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sqshl v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(sqshl(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"sqshl v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(sqshl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"sqshl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(sqshl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sqshl v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(sqshl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sqshl v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(sqshl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sqshl v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(srshl(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"srshl v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(srshl(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"srshl v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(srshl(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"srshl v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(srshl(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"srshl v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(srshl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"srshl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(srshl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"srshl v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(srshl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"srshl v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(srshl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"srshl v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(sqrshl(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"sqrshl v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(sqrshl(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sqrshl v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(sqrshl(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sqrshl v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(sqrshl(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"sqrshl v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(sqrshl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"sqrshl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(sqrshl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sqrshl v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(sqrshl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sqrshl v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(sqrshl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sqrshl v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(smax(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"smax v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(smax(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"smax v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(smax(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"smax v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(smax(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"smax v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(smax(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"smax v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(smax(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"smax v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(smax(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"smax v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(smax(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"smax v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(smin(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"smin v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(smin(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"smin v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(smin(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"smin v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(smin(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"smin v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(smin(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"smin v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(smin(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"smin v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(smin(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"smin v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(smin(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"smin v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(sabd(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"sabd v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(sabd(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sabd v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(sabd(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sabd v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(sabd(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"sabd v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(sabd(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"sabd v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(sabd(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sabd v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(sabd(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sabd v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(sabd(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sabd v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(saba(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"saba v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(saba(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"saba v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(saba(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"saba v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(saba(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"saba v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(saba(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"saba v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(saba(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"saba v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(saba(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"saba v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(saba(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"saba v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(add(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"add v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(add(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"add v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(add(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"add v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(add(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"add v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(add(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"add v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(add(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"add v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(add(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"add v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(add(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"add v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(cmtst(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"cmtst v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(cmtst(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"cmtst v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(cmtst(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"cmtst v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(cmtst(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"cmtst v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(cmtst(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"cmtst v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(cmtst(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"cmtst v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(cmtst(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"cmtst v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(cmtst(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"cmtst v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(mla(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"mla v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(mla(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"mla v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(mla(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"mla v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(mla(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"mla v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(mla(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"mla v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(mla(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"mla v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(mla(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"mla v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(mla(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"mla v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(mul(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"mul v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(mul(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"mul v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(mul(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"mul v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(mul(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"mul v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(mul(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"mul v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(mul(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"mul v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(mul(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"mul v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(mul(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"mul v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(smaxp(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"smaxp v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(smaxp(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"smaxp v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(smaxp(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"smaxp v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(smaxp(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"smaxp v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(smaxp(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"smaxp v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(smaxp(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"smaxp v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(smaxp(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"smaxp v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(smaxp(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"smaxp v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(sminp(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"sminp v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(sminp(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sminp v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(sminp(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sminp v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(sminp(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"sminp v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(sminp(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"sminp v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(sminp(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sminp v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(sminp(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sminp v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(sminp(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sminp v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(sqdmulh(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"sqdmulh v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(sqdmulh(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sqdmulh v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(sqdmulh(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sqdmulh v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(sqdmulh(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"sqdmulh v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(sqdmulh(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmulh v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(sqdmulh(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmulh v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(sqdmulh(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmulh v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(sqdmulh(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sqdmulh v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(addp(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"addp v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(addp(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"addp v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(addp(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"addp v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(addp(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"addp v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(addp(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"addp v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(addp(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"addp v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(addp(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"addp v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(addp(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"addp v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fmaxnm(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fmaxnm v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fmaxnm(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmaxnm v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmaxnm(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fmaxnm v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fmaxnm(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fmaxnm v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fmaxnm(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fmaxnm v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fmaxnm(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fmaxnm v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fmaxnm(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fmaxnm v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fmaxnm(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fmaxnm v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fmla(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fmla v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fmla(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmla v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmla(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fmla v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fmla(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fmla v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fmla(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fmla v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fmla(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fmla v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fmla(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fmla v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fmla(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fmla v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fadd(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fadd v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fadd(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fadd v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fadd(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fadd v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fadd(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fadd v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fadd(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fadd v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fadd(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fadd v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fadd(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fadd v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fadd(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fadd v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fmulx(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fmulx v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fmulx(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmulx v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmulx(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fmulx v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fmulx(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fmulx v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fmulx(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fmulx v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fmulx(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fmulx v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fmulx(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fmulx v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fmulx(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fmulx v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fcmeq(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fcmeq v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fcmeq(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fcmeq v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fcmeq(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fcmeq v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fcmeq(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fcmeq v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fcmeq(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fcmeq v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fcmeq(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fcmeq v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fcmeq(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fcmeq v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fcmeq(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fcmeq v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fmax(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fmax v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fmax(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmax v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmax(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fmax v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fmax(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fmax v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fmax(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fmax v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fmax(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fmax v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fmax(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fmax v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fmax(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fmax v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(frecps(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"frecps v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(frecps(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"frecps v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(frecps(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"frecps v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(frecps(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"frecps v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(frecps(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"frecps v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(frecps(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"frecps v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(frecps(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"frecps v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(frecps(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"frecps v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(and_(QReg::q30, QReg::q29, QReg::q28), \"and v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(and_(DReg::d30, DReg::d29, DReg::d28), \"and v30.8b, v29.8b, v28.8b\");\n\n  TEST_SINGLE(fmlal(QReg::q30, QReg::q29, QReg::q28), \"fmlal v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(fmlal(DReg::d30, DReg::d29, DReg::d28), \"fmlal v30.2s, v29.2h, v28.2h\");\n\n  TEST_SINGLE(fmlal2(QReg::q30, QReg::q29, QReg::q28), \"fmlal2 v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(fmlal2(DReg::d30, DReg::d29, DReg::d28), \"fmlal2 v30.2s, v29.2h, v28.2h\");\n\n  TEST_SINGLE(bic(QReg::q30, QReg::q29, QReg::q28), \"bic v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(bic(DReg::d30, DReg::d29, DReg::d28), \"bic v30.8b, v29.8b, v28.8b\");\n\n  // TEST_SINGLE(fminnm(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fminnm v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fminnm(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fminnm v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fminnm(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fminnm v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fminnm(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fminnm v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fminnm(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fminnm v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fminnm(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fminnm v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fminnm(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fminnm v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fminnm(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fminnm v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fmls(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fmls v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fmls(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmls v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmls(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fmls v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fmls(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fmls v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fmls(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fmls v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fmls(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fmls v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fmls(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fmls v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fmls(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fmls v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fsub(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fsub v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fsub(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fsub v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fsub(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fsub v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fsub(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fsub v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fsub(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fsub v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fsub(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fsub v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fsub(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fsub v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fsub(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fsub v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fmin(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fmin v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fmin(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmin v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmin(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fmin v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fmin(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fmin v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fmin(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fmin v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fmin(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fmin v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fmin(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fmin v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fmin(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fmin v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(frsqrts(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"frsqrts v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(frsqrts(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"frsqrts v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(frsqrts(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"frsqrts v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(frsqrts(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"frsqrts v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(frsqrts(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"frsqrts v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(frsqrts(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"frsqrts v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(frsqrts(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"frsqrts v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(frsqrts(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"frsqrts v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(orr(QReg::q30, QReg::q29, QReg::q28), \"orr v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(orr(DReg::d30, DReg::d29, DReg::d28), \"orr v30.8b, v29.8b, v28.8b\");\n\n  TEST_SINGLE(mov(QReg::q30, QReg::q29), \"mov v30.16b, v29.16b\");\n  TEST_SINGLE(mov(DReg::d30, DReg::d29), \"mov v30.8b, v29.8b\");\n\n  TEST_SINGLE(fmlsl(QReg::q30, QReg::q29, QReg::q28), \"fmlsl v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(fmlsl(DReg::d30, DReg::d29, DReg::d28), \"fmlsl v30.2s, v29.2h, v28.2h\");\n\n  TEST_SINGLE(fmlsl2(QReg::q30, QReg::q29, QReg::q28), \"fmlsl2 v30.4s, v29.4h, v28.4h\");\n  TEST_SINGLE(fmlsl2(DReg::d30, DReg::d29, DReg::d28), \"fmlsl2 v30.2s, v29.2h, v28.2h\");\n\n  TEST_SINGLE(orn(QReg::q30, QReg::q29, QReg::q28), \"orn v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(orn(DReg::d30, DReg::d29, DReg::d28), \"orn v30.8b, v29.8b, v28.8b\");\n\n  TEST_SINGLE(uhadd(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"uhadd v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(uhadd(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"uhadd v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(uhadd(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"uhadd v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(uhadd(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"uhadd v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(uhadd(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"uhadd v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uhadd(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"uhadd v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(uhadd(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"uhadd v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(uhadd(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"uhadd v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(uqadd(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"uqadd v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(uqadd(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"uqadd v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(uqadd(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"uqadd v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(uqadd(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"uqadd v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(uqadd(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"uqadd v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uqadd(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"uqadd v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(uqadd(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"uqadd v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(uqadd(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"uqadd v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(urhadd(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"urhadd v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(urhadd(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"urhadd v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(urhadd(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"urhadd v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(urhadd(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"urhadd v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(urhadd(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"urhadd v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(urhadd(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"urhadd v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(urhadd(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"urhadd v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(urhadd(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"urhadd v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(uhsub(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"uhsub v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(uhsub(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"uhsub v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(uhsub(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"uhsub v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(uhsub(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"uhsub v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(uhsub(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"uhsub v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uhsub(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"uhsub v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(uhsub(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"uhsub v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(uhsub(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"uhsub v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(uqsub(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"uqsub v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(uqsub(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"uqsub v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(uqsub(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"uqsub v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(uqsub(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"uqsub v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(uqsub(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"uqsub v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uqsub(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"uqsub v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(uqsub(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"uqsub v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(uqsub(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"uqsub v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(cmhi(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"cmhi v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(cmhi(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"cmhi v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(cmhi(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"cmhi v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(cmhi(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"cmhi v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(cmhi(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"cmhi v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(cmhi(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"cmhi v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(cmhi(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"cmhi v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(cmhi(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"cmhi v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(cmhs(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"cmhs v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(cmhs(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"cmhs v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(cmhs(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"cmhs v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(cmhs(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"cmhs v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(cmhs(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"cmhs v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(cmhs(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"cmhs v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(cmhs(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"cmhs v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(cmhs(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"cmhs v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(ushl(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"ushl v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(ushl(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"ushl v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(ushl(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"ushl v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(ushl(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"ushl v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(ushl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"ushl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(ushl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"ushl v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(ushl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"ushl v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(ushl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"ushl v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(uqshl(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"uqshl v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(uqshl(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"uqshl v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(uqshl(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"uqshl v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(uqshl(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"uqshl v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(uqshl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"uqshl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uqshl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"uqshl v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(uqshl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"uqshl v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(uqshl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"uqshl v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(urshl(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"urshl v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(urshl(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"urshl v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(urshl(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"urshl v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(urshl(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"urshl v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(urshl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"urshl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(urshl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"urshl v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(urshl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"urshl v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(urshl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"urshl v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(uqrshl(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"uqrshl v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(uqrshl(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"uqrshl v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(uqrshl(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"uqrshl v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(uqrshl(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"uqrshl v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(uqrshl(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"uqrshl v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uqrshl(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"uqrshl v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(uqrshl(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"uqrshl v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(uqrshl(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"uqrshl v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(umax(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"umax v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(umax(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"umax v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(umax(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"umax v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(umax(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"umax v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(umax(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"umax v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(umax(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"umax v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(umax(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"umax v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(umax(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"umax v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(umin(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"umin v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(umin(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"umin v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(umin(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"umin v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(umin(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"umin v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(umin(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"umin v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(umin(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"umin v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(umin(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"umin v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(umin(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"umin v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(uabd(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"uabd v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(uabd(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"uabd v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(uabd(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"uabd v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(uabd(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"uabd v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(uabd(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"uabd v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uabd(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"uabd v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(uabd(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"uabd v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(uabd(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"uabd v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(uaba(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"uaba v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(uaba(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"uaba v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(uaba(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"uaba v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(uaba(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"uaba v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(uaba(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"uaba v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uaba(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"uaba v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(uaba(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"uaba v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(uaba(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"uaba v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(sub(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"sub v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(sub(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sub v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(sub(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sub v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(sub(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"sub v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(sub(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"sub v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(sub(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sub v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(sub(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sub v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(sub(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sub v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(cmeq(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"cmeq v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(cmeq(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"cmeq v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(cmeq(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"cmeq v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(cmeq(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"cmeq v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(cmeq(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"cmeq v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(cmeq(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"cmeq v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(cmeq(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"cmeq v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(cmeq(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"cmeq v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(mls(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"mls v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(mls(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"mls v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(mls(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"mls v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(mls(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"mls v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(mls(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"mls v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(mls(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"mls v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(mls(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"mls v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(mls(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"mls v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(pmul(QReg::q30, QReg::q29, QReg::q28), \"pmul v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(pmul(DReg::d30, DReg::d29, DReg::d28), \"pmul v30.8b, v29.8b, v28.8b\");\n\n  TEST_SINGLE(umaxp(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"umaxp v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(umaxp(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"umaxp v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(umaxp(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"umaxp v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(umaxp(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"umaxp v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(umaxp(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"umaxp v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(umaxp(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"umaxp v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(umaxp(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"umaxp v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(umaxp(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"umaxp v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(uminp(SubRegSize::i8Bit, QReg::q30, QReg::q29, QReg::q28), \"uminp v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(uminp(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"uminp v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(uminp(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"uminp v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(uminp(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"uminp v30.2d, v29.2d, v28.2d\");\n\n  TEST_SINGLE(uminp(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"uminp v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(uminp(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"uminp v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(uminp(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"uminp v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(uminp(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"uminp v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(sqrdmulh(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"sqrdmulh v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(sqrdmulh(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"sqrdmulh v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(sqrdmulh(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"sqrdmulh v30.4s, v29.4s, v28.4s\");\n  // TEST_SINGLE(sqrdmulh(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"sqrdmulh v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(sqrdmulh(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"sqrdmulh v30.8b, v29.8b, v28.8b\");\n  TEST_SINGLE(sqrdmulh(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"sqrdmulh v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(sqrdmulh(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"sqrdmulh v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(sqrdmulh(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"sqrdmulh v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fmaxnmp(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fmaxnmp v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fmaxnmp(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmaxnmp v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmaxnmp(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fmaxnmp v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fmaxnmp(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fmaxnmp v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fmaxnmp(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fmaxnmp v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fmaxnmp(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fmaxnmp v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fmaxnmp(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fmaxnmp v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fmaxnmp(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fmaxnmp v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(faddp(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"faddp v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(faddp(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"faddp v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(faddp(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"faddp v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(faddp(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"faddp v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(faddp(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"faddp v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(faddp(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"faddp v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(faddp(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"faddp v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(faddp(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"faddp v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fmul(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fmul v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fmul(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmul v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmul(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fmul v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fmul(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fmul v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fmul(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fmul v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fmul(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fmul v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fmul(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fmul v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fmul(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fmul v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fcmge(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fcmge v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fcmge(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fcmge v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fcmge(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fcmge v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fcmge(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fcmge v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fcmge(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fcmge v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fcmge(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fcmge v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fcmge(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fcmge v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fcmge(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fcmge v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(facge(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"facge v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(facge(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"facge v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(facge(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"facge v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(facge(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"facge v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(facge(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"facge v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(facge(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"facge v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(facge(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"facge v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(facge(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"facge v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fmaxp(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fmaxp v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fmaxp(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fmaxp v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fmaxp(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fmaxp v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fmaxp(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fmaxp v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fmaxp(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fmaxp v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fmaxp(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fmaxp v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fmaxp(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fmaxp v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fmaxp(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fmaxp v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fdiv(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fdiv v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fdiv(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fdiv v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fdiv(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fdiv v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fdiv(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fdiv v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fdiv(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fdiv v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fdiv(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fdiv v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fdiv(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fdiv v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fdiv(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fdiv v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(eor(QReg::q30, QReg::q29, QReg::q28), \"eor v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(eor(DReg::d30, DReg::d29, DReg::d28), \"eor v30.8b, v29.8b, v28.8b\");\n\n  TEST_SINGLE(bsl(QReg::q30, QReg::q29, QReg::q28), \"bsl v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(bsl(DReg::d30, DReg::d29, DReg::d28), \"bsl v30.8b, v29.8b, v28.8b\");\n\n  // TEST_SINGLE(fminnmp(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fminnmp v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fminnmp(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fminnmp v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fminnmp(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fminnmp v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fminnmp(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fminnmp v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fminnmp(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fminnmp v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fminnmp(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fminnmp v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fminnmp(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fminnmp v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fminnmp(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fminnmp v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fabd(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fabd v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fabd(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fabd v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fabd(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fabd v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fabd(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fabd v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fabd(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fabd v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fabd(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fabd v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fabd(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fabd v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fabd(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fabd v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fcmgt(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fcmgt v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fcmgt(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fcmgt v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fcmgt(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fcmgt v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fcmgt(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fcmgt v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fcmgt(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fcmgt v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fcmgt(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fcmgt v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fcmgt(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fcmgt v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fcmgt(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fcmgt v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(facgt(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"facgt v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(facgt(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"facgt v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(facgt(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"facgt v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(facgt(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"facgt v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(facgt(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"facgt v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(facgt(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"facgt v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(facgt(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"facgt v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(facgt(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"facgt v30.1d, v29.1d, v28.1d\");\n\n  // TEST_SINGLE(fminp(SubRegSize::i8Bit,  QReg::q30, QReg::q29, QReg::q28), \"fminp v30.16b, v29.16b, v28.16b\");\n  // TEST_SINGLE(fminp(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q28), \"fminp v30.8h, v29.8h, v28.8h\");\n  TEST_SINGLE(fminp(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28), \"fminp v30.4s, v29.4s, v28.4s\");\n  TEST_SINGLE(fminp(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q28), \"fminp v30.2d, v29.2d, v28.2d\");\n\n  // TEST_SINGLE(fminp(SubRegSize::i8Bit, DReg::d30, DReg::d29, DReg::d28), \"fminp v30.8b, v29.8b, v28.8b\");\n  // TEST_SINGLE(fminp(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d28), \"fminp v30.4h, v29.4h, v28.4h\");\n  TEST_SINGLE(fminp(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28), \"fminp v30.2s, v29.2s, v28.2s\");\n  // TEST_SINGLE(fminp(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d28), \"fminp v30.1d, v29.1d, v28.1d\");\n\n  TEST_SINGLE(bit(QReg::q30, QReg::q29, QReg::q28), \"bit v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(bit(DReg::d30, DReg::d29, DReg::d28), \"bit v30.8b, v29.8b, v28.8b\");\n\n  TEST_SINGLE(bif(QReg::q30, QReg::q29, QReg::q28), \"bif v30.16b, v29.16b, v28.16b\");\n  TEST_SINGLE(bif(DReg::d30, DReg::d29, DReg::d28), \"bif v30.8b, v29.8b, v28.8b\");\n}\n\n#if TEST_FP16\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Advanced SIMD modified immediate : fp16\") {\n  TEST_SINGLE(fmov(SubRegSize::i16Bit, QReg::q30, 1.0), \"fmov v30.8h, #0x70 (1.0000)\");\n  TEST_SINGLE(fmov(SubRegSize::i16Bit, DReg::d30, 1.0), \"fmov v30.4h, #0x70 (1.0000)\");\n}\n#endif\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Advanced SIMD modified immediate\") {\n  // XXX: ORR - 32-bit/16-bit\n  // XXX: MOVI - Shifting ones\n  TEST_SINGLE(fmov(SubRegSize::i32Bit, QReg::q30, 1.0), \"fmov v30.4s, #0x70 (1.0000)\");\n  TEST_SINGLE(fmov(SubRegSize::i64Bit, QReg::q30, 1.0), \"fmov v30.2d, #0x70 (1.0000)\");\n\n  TEST_SINGLE(fmov(SubRegSize::i32Bit, DReg::d30, 1.0), \"fmov v30.2s, #0x70 (1.0000)\");\n  // TEST_SINGLE(fmov(SubRegSize::i64Bit, DReg::d30, 1.0), \"fmov v30.1d, #0x70 (1.0000)\");\n\n  // XXX: MVNI - Shifted immediate\n  // XXX: BIC\n  TEST_SINGLE(movi(SubRegSize::i8Bit, QReg::q30, 0xFE), \"movi v30.16b, #0xfe\");\n  TEST_SINGLE(movi(SubRegSize::i16Bit, QReg::q30, 0xFE, 0), \"movi v30.8h, #0xfe\");\n  TEST_SINGLE(movi(SubRegSize::i16Bit, QReg::q30, 0xFE, 8), \"movi v30.8h, #0xfe, lsl #8\");\n  TEST_SINGLE(movi(SubRegSize::i32Bit, QReg::q30, 0xFE, 0), \"movi v30.4s, #0xfe\");\n  TEST_SINGLE(movi(SubRegSize::i32Bit, QReg::q30, 0xFE, 8), \"movi v30.4s, #0xfe, lsl #8\");\n  TEST_SINGLE(movi(SubRegSize::i32Bit, QReg::q30, 0xFE, 16), \"movi v30.4s, #0xfe, lsl #16\");\n  TEST_SINGLE(movi(SubRegSize::i32Bit, QReg::q30, 0xFE, 24), \"movi v30.4s, #0xfe, lsl #24\");\n  TEST_SINGLE(movi(SubRegSize::i64Bit, QReg::q30, 0xFF00FF), \"movi v30.2d, #0xff00ff\");\n\n  TEST_SINGLE(movi(SubRegSize::i8Bit, DReg::d30, 0xFE), \"movi v30.8b, #0xfe\");\n  TEST_SINGLE(movi(SubRegSize::i16Bit, DReg::d30, 0xFE, 0), \"movi v30.4h, #0xfe\");\n  TEST_SINGLE(movi(SubRegSize::i16Bit, DReg::d30, 0xFE, 8), \"movi v30.4h, #0xfe, lsl #8\");\n  TEST_SINGLE(movi(SubRegSize::i32Bit, DReg::d30, 0xFE, 0), \"movi v30.2s, #0xfe\");\n  TEST_SINGLE(movi(SubRegSize::i32Bit, DReg::d30, 0xFE, 8), \"movi v30.2s, #0xfe, lsl #8\");\n  TEST_SINGLE(movi(SubRegSize::i32Bit, DReg::d30, 0xFE, 16), \"movi v30.2s, #0xfe, lsl #16\");\n  TEST_SINGLE(movi(SubRegSize::i32Bit, DReg::d30, 0xFE, 24), \"movi v30.2s, #0xfe, lsl #24\");\n  TEST_SINGLE(movi(SubRegSize::i64Bit, DReg::d30, 0xFF00000000000000ULL), \"movi d30, #0xff00000000000000\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Advanced SIMD shift by immediate\") {\n  TEST_SINGLE(sshr(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"sshr v30.16b, v29.16b, #1\");\n  TEST_SINGLE(sshr(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"sshr v30.16b, v29.16b, #7\");\n  TEST_SINGLE(sshr(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"sshr v30.8h, v29.8h, #1\");\n  TEST_SINGLE(sshr(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"sshr v30.8h, v29.8h, #15\");\n  TEST_SINGLE(sshr(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"sshr v30.4s, v29.4s, #1\");\n  TEST_SINGLE(sshr(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"sshr v30.4s, v29.4s, #31\");\n  TEST_SINGLE(sshr(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"sshr v30.2d, v29.2d, #1\");\n  TEST_SINGLE(sshr(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"sshr v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(sshr(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"sshr v30.8b, v29.8b, #1\");\n  TEST_SINGLE(sshr(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"sshr v30.8b, v29.8b, #7\");\n  TEST_SINGLE(sshr(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"sshr v30.4h, v29.4h, #1\");\n  TEST_SINGLE(sshr(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"sshr v30.4h, v29.4h, #15\");\n  TEST_SINGLE(sshr(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"sshr v30.2s, v29.2s, #1\");\n  TEST_SINGLE(sshr(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"sshr v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(sshr(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"sshr v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(sshr(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"sshr v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(ssra(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"ssra v30.16b, v29.16b, #1\");\n  TEST_SINGLE(ssra(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"ssra v30.16b, v29.16b, #7\");\n  TEST_SINGLE(ssra(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"ssra v30.8h, v29.8h, #1\");\n  TEST_SINGLE(ssra(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"ssra v30.8h, v29.8h, #15\");\n  TEST_SINGLE(ssra(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"ssra v30.4s, v29.4s, #1\");\n  TEST_SINGLE(ssra(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"ssra v30.4s, v29.4s, #31\");\n  TEST_SINGLE(ssra(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"ssra v30.2d, v29.2d, #1\");\n  TEST_SINGLE(ssra(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"ssra v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(ssra(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"ssra v30.8b, v29.8b, #1\");\n  TEST_SINGLE(ssra(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"ssra v30.8b, v29.8b, #7\");\n  TEST_SINGLE(ssra(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"ssra v30.4h, v29.4h, #1\");\n  TEST_SINGLE(ssra(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"ssra v30.4h, v29.4h, #15\");\n  TEST_SINGLE(ssra(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"ssra v30.2s, v29.2s, #1\");\n  TEST_SINGLE(ssra(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"ssra v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(ssra(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"ssra v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(ssra(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"ssra v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(srshr(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"srshr v30.16b, v29.16b, #1\");\n  TEST_SINGLE(srshr(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"srshr v30.16b, v29.16b, #7\");\n  TEST_SINGLE(srshr(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"srshr v30.8h, v29.8h, #1\");\n  TEST_SINGLE(srshr(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"srshr v30.8h, v29.8h, #15\");\n  TEST_SINGLE(srshr(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"srshr v30.4s, v29.4s, #1\");\n  TEST_SINGLE(srshr(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"srshr v30.4s, v29.4s, #31\");\n  TEST_SINGLE(srshr(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"srshr v30.2d, v29.2d, #1\");\n  TEST_SINGLE(srshr(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"srshr v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(srshr(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"srshr v30.8b, v29.8b, #1\");\n  TEST_SINGLE(srshr(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"srshr v30.8b, v29.8b, #7\");\n  TEST_SINGLE(srshr(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"srshr v30.4h, v29.4h, #1\");\n  TEST_SINGLE(srshr(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"srshr v30.4h, v29.4h, #15\");\n  TEST_SINGLE(srshr(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"srshr v30.2s, v29.2s, #1\");\n  TEST_SINGLE(srshr(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"srshr v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(srshr(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"srshr v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(srshr(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"srshr v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(srsra(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"srsra v30.16b, v29.16b, #1\");\n  TEST_SINGLE(srsra(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"srsra v30.16b, v29.16b, #7\");\n  TEST_SINGLE(srsra(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"srsra v30.8h, v29.8h, #1\");\n  TEST_SINGLE(srsra(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"srsra v30.8h, v29.8h, #15\");\n  TEST_SINGLE(srsra(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"srsra v30.4s, v29.4s, #1\");\n  TEST_SINGLE(srsra(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"srsra v30.4s, v29.4s, #31\");\n  TEST_SINGLE(srsra(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"srsra v30.2d, v29.2d, #1\");\n  TEST_SINGLE(srsra(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"srsra v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(srsra(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"srsra v30.8b, v29.8b, #1\");\n  TEST_SINGLE(srsra(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"srsra v30.8b, v29.8b, #7\");\n  TEST_SINGLE(srsra(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"srsra v30.4h, v29.4h, #1\");\n  TEST_SINGLE(srsra(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"srsra v30.4h, v29.4h, #15\");\n  TEST_SINGLE(srsra(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"srsra v30.2s, v29.2s, #1\");\n  TEST_SINGLE(srsra(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"srsra v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(srsra(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"srsra v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(srsra(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"srsra v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(shl(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"shl v30.16b, v29.16b, #1\");\n  TEST_SINGLE(shl(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"shl v30.16b, v29.16b, #7\");\n  TEST_SINGLE(shl(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"shl v30.8h, v29.8h, #1\");\n  TEST_SINGLE(shl(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"shl v30.8h, v29.8h, #15\");\n  TEST_SINGLE(shl(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"shl v30.4s, v29.4s, #1\");\n  TEST_SINGLE(shl(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"shl v30.4s, v29.4s, #31\");\n  TEST_SINGLE(shl(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"shl v30.2d, v29.2d, #1\");\n  TEST_SINGLE(shl(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"shl v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(shl(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"shl v30.8b, v29.8b, #1\");\n  TEST_SINGLE(shl(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"shl v30.8b, v29.8b, #7\");\n  TEST_SINGLE(shl(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"shl v30.4h, v29.4h, #1\");\n  TEST_SINGLE(shl(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"shl v30.4h, v29.4h, #15\");\n  TEST_SINGLE(shl(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"shl v30.2s, v29.2s, #1\");\n  TEST_SINGLE(shl(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"shl v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(shl(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"shl v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(shl(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"shl v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(sqshl(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"sqshl v30.16b, v29.16b, #1\");\n  TEST_SINGLE(sqshl(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"sqshl v30.16b, v29.16b, #7\");\n  TEST_SINGLE(sqshl(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"sqshl v30.8h, v29.8h, #1\");\n  TEST_SINGLE(sqshl(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"sqshl v30.8h, v29.8h, #15\");\n  TEST_SINGLE(sqshl(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"sqshl v30.4s, v29.4s, #1\");\n  TEST_SINGLE(sqshl(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"sqshl v30.4s, v29.4s, #31\");\n  TEST_SINGLE(sqshl(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"sqshl v30.2d, v29.2d, #1\");\n  TEST_SINGLE(sqshl(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"sqshl v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(sqshl(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"sqshl v30.8b, v29.8b, #1\");\n  TEST_SINGLE(sqshl(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"sqshl v30.8b, v29.8b, #7\");\n  TEST_SINGLE(sqshl(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"sqshl v30.4h, v29.4h, #1\");\n  TEST_SINGLE(sqshl(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"sqshl v30.4h, v29.4h, #15\");\n  TEST_SINGLE(sqshl(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"sqshl v30.2s, v29.2s, #1\");\n  TEST_SINGLE(sqshl(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"sqshl v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(sqshl(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"sqshl v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(sqshl(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"sqshl v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(shrn(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"shrn v30.8b, v29.8h, #1\");\n  TEST_SINGLE(shrn(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"shrn v30.8b, v29.8h, #7\");\n  TEST_SINGLE(shrn(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"shrn v30.4h, v29.4s, #1\");\n  TEST_SINGLE(shrn(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"shrn v30.4h, v29.4s, #15\");\n  TEST_SINGLE(shrn(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"shrn v30.2s, v29.2d, #1\");\n  TEST_SINGLE(shrn(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"shrn v30.2s, v29.2d, #31\");\n  // TEST_SINGLE(shrn(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"shrn v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(shrn(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"shrn v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(shrn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"shrn2 v30.16b, v29.8h, #1\");\n  TEST_SINGLE(shrn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"shrn2 v30.16b, v29.8h, #7\");\n  TEST_SINGLE(shrn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"shrn2 v30.8h, v29.4s, #1\");\n  TEST_SINGLE(shrn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"shrn2 v30.8h, v29.4s, #15\");\n  TEST_SINGLE(shrn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"shrn2 v30.4s, v29.2d, #1\");\n  TEST_SINGLE(shrn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"shrn2 v30.4s, v29.2d, #31\");\n  // TEST_SINGLE(shrn2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1),  \"shrn2 v30.2d, v29.2d, #1\");\n  // TEST_SINGLE(shrn2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"shrn2 v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(rshrn(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"rshrn v30.8b, v29.8h, #1\");\n  TEST_SINGLE(rshrn(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"rshrn v30.8b, v29.8h, #7\");\n  TEST_SINGLE(rshrn(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"rshrn v30.4h, v29.4s, #1\");\n  TEST_SINGLE(rshrn(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"rshrn v30.4h, v29.4s, #15\");\n  TEST_SINGLE(rshrn(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"rshrn v30.2s, v29.2d, #1\");\n  TEST_SINGLE(rshrn(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"rshrn v30.2s, v29.2d, #31\");\n  // TEST_SINGLE(rshrn(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"rshrn v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(rshrn(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"rshrn v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(rshrn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"rshrn2 v30.16b, v29.8h, #1\");\n  TEST_SINGLE(rshrn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"rshrn2 v30.16b, v29.8h, #7\");\n  TEST_SINGLE(rshrn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"rshrn2 v30.8h, v29.4s, #1\");\n  TEST_SINGLE(rshrn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"rshrn2 v30.8h, v29.4s, #15\");\n  TEST_SINGLE(rshrn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"rshrn2 v30.4s, v29.2d, #1\");\n  TEST_SINGLE(rshrn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"rshrn2 v30.4s, v29.2d, #31\");\n  // TEST_SINGLE(rshrn2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1),  \"rshrn2 v30.2d, v29.2d, #1\");\n  // TEST_SINGLE(rshrn2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"rshrn2 v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(sqshrn(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"sqshrn v30.8b, v29.8h, #1\");\n  TEST_SINGLE(sqshrn(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"sqshrn v30.8b, v29.8h, #7\");\n  TEST_SINGLE(sqshrn(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"sqshrn v30.4h, v29.4s, #1\");\n  TEST_SINGLE(sqshrn(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"sqshrn v30.4h, v29.4s, #15\");\n  TEST_SINGLE(sqshrn(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"sqshrn v30.2s, v29.2d, #1\");\n  TEST_SINGLE(sqshrn(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"sqshrn v30.2s, v29.2d, #31\");\n  // TEST_SINGLE(sqshrn(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"sqshrn v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(sqshrn(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"sqshrn v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(sqshrn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"sqshrn2 v30.16b, v29.8h, #1\");\n  TEST_SINGLE(sqshrn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"sqshrn2 v30.16b, v29.8h, #7\");\n  TEST_SINGLE(sqshrn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"sqshrn2 v30.8h, v29.4s, #1\");\n  TEST_SINGLE(sqshrn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"sqshrn2 v30.8h, v29.4s, #15\");\n  TEST_SINGLE(sqshrn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"sqshrn2 v30.4s, v29.2d, #1\");\n  TEST_SINGLE(sqshrn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"sqshrn2 v30.4s, v29.2d, #31\");\n  // TEST_SINGLE(sqshrn2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1),  \"sqshrn2 v30.2d, v29.2d, #1\");\n  // TEST_SINGLE(sqshrn2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"sqshrn2 v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(sqrshrn(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"sqrshrn v30.8b, v29.8h, #1\");\n  TEST_SINGLE(sqrshrn(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"sqrshrn v30.8b, v29.8h, #7\");\n  TEST_SINGLE(sqrshrn(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"sqrshrn v30.4h, v29.4s, #1\");\n  TEST_SINGLE(sqrshrn(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"sqrshrn v30.4h, v29.4s, #15\");\n  TEST_SINGLE(sqrshrn(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"sqrshrn v30.2s, v29.2d, #1\");\n  TEST_SINGLE(sqrshrn(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"sqrshrn v30.2s, v29.2d, #31\");\n  // TEST_SINGLE(sqrshrn(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"sqrshrn v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(sqrshrn(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"sqrshrn v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(sqrshrn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"sqrshrn2 v30.16b, v29.8h, #1\");\n  TEST_SINGLE(sqrshrn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"sqrshrn2 v30.16b, v29.8h, #7\");\n  TEST_SINGLE(sqrshrn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"sqrshrn2 v30.8h, v29.4s, #1\");\n  TEST_SINGLE(sqrshrn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"sqrshrn2 v30.8h, v29.4s, #15\");\n  TEST_SINGLE(sqrshrn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"sqrshrn2 v30.4s, v29.2d, #1\");\n  TEST_SINGLE(sqrshrn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"sqrshrn2 v30.4s, v29.2d, #31\");\n  // TEST_SINGLE(sqrshrn2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1),  \"sqrshrn2 v30.2d, v29.2d, #1\");\n  // TEST_SINGLE(sqrshrn2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"sqrshrn2 v30.2d, v29.2d, #63\");\n\n  // TEST_SINGLE(sshll(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1),   \"sshll v30.8b, v29.8h, #1\");\n  // TEST_SINGLE(sshll(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7),   \"sshll v30.8b, v29.8h, #7\");\n  TEST_SINGLE(sshll(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"sshll v30.8h, v29.8b, #1\");\n  TEST_SINGLE(sshll(SubRegSize::i16Bit, DReg::d30, DReg::d29, 7), \"sshll v30.8h, v29.8b, #7\");\n  TEST_SINGLE(sshll(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"sshll v30.4s, v29.4h, #1\");\n  TEST_SINGLE(sshll(SubRegSize::i32Bit, DReg::d30, DReg::d29, 15), \"sshll v30.4s, v29.4h, #15\");\n  TEST_SINGLE(sshll(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1), \"sshll v30.2d, v29.2s, #1\");\n  TEST_SINGLE(sshll(SubRegSize::i64Bit, DReg::d30, DReg::d29, 31), \"sshll v30.2d, v29.2s, #31\");\n\n  // TEST_SINGLE(sshll2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1),   \"sshll2 v30.16b, v29.8h, #1\");\n  // TEST_SINGLE(sshll2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7),   \"sshll2 v30.16b, v29.8h, #7\");\n  TEST_SINGLE(sshll2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"sshll2 v30.8h, v29.16b, #1\");\n  TEST_SINGLE(sshll2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 7), \"sshll2 v30.8h, v29.16b, #7\");\n  TEST_SINGLE(sshll2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"sshll2 v30.4s, v29.8h, #1\");\n  TEST_SINGLE(sshll2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 15), \"sshll2 v30.4s, v29.8h, #15\");\n  TEST_SINGLE(sshll2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"sshll2 v30.2d, v29.4s, #1\");\n  TEST_SINGLE(sshll2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 31), \"sshll2 v30.2d, v29.4s, #31\");\n\n  // TEST_SINGLE(sxtl(SubRegSize::i8Bit, QReg::q30, QReg::q29),   \"sxtl v30.8b, v29.8h\");\n  TEST_SINGLE(sxtl(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"sxtl v30.8h, v29.8b\");\n  TEST_SINGLE(sxtl(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"sxtl v30.4s, v29.4h\");\n  TEST_SINGLE(sxtl(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"sxtl v30.2d, v29.2s\");\n\n  // TEST_SINGLE(sxtl(SubRegSize::i8Bit, DReg::d30, DReg::d29),   \"sxtl v30.8b, v29.8h\");\n  TEST_SINGLE(sxtl(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"sxtl v30.8h, v29.8b\");\n  TEST_SINGLE(sxtl(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"sxtl v30.4s, v29.4h\");\n  TEST_SINGLE(sxtl(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"sxtl v30.2d, v29.2s\");\n\n  // TEST_SINGLE(sxtl2(SubRegSize::i8Bit, QReg::q30, QReg::q29),   \"sxtl2 v30.16b, v29.8h\");\n  TEST_SINGLE(sxtl2(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"sxtl2 v30.8h, v29.16b\");\n  TEST_SINGLE(sxtl2(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"sxtl2 v30.4s, v29.8h\");\n  TEST_SINGLE(sxtl2(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"sxtl2 v30.2d, v29.4s\");\n\n  // TEST_SINGLE(sxtl2(SubRegSize::i8Bit, DReg::d30, DReg::d29),   \"sxtl2 v30.16b, v29.8h\");\n  TEST_SINGLE(sxtl2(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"sxtl2 v30.8h, v29.16b\");\n  TEST_SINGLE(sxtl2(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"sxtl2 v30.4s, v29.8h\");\n  TEST_SINGLE(sxtl2(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"sxtl2 v30.2d, v29.4s\");\n\n  // TEST_SINGLE(scvtf(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1),   \"scvtf v30.16b, v29.16b, #1\");\n  // TEST_SINGLE(scvtf(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7),   \"scvtf v30.16b, v29.16b, #7\");\n  TEST_SINGLE(scvtf(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"scvtf v30.8h, v29.8h, #1\");\n  TEST_SINGLE(scvtf(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"scvtf v30.8h, v29.8h, #15\");\n  TEST_SINGLE(scvtf(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"scvtf v30.4s, v29.4s, #1\");\n  TEST_SINGLE(scvtf(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"scvtf v30.4s, v29.4s, #31\");\n  TEST_SINGLE(scvtf(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"scvtf v30.2d, v29.2d, #1\");\n  TEST_SINGLE(scvtf(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"scvtf v30.2d, v29.2d, #63\");\n\n  // TEST_SINGLE(scvtf(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1),   \"scvtf v30.8b, v29.8b, #1\");\n  // TEST_SINGLE(scvtf(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7),   \"scvtf v30.8b, v29.8b, #7\");\n  TEST_SINGLE(scvtf(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"scvtf v30.4h, v29.4h, #1\");\n  TEST_SINGLE(scvtf(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"scvtf v30.4h, v29.4h, #15\");\n  TEST_SINGLE(scvtf(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"scvtf v30.2s, v29.2s, #1\");\n  TEST_SINGLE(scvtf(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"scvtf v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(scvtf(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"scvtf v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(scvtf(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"scvtf v30.1d, v29.1d, #63\");\n\n  // TEST_SINGLE(fcvtzs(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1),   \"fcvtzs v30.16b, v29.16b, #1\");\n  // TEST_SINGLE(fcvtzs(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7),   \"fcvtzs v30.16b, v29.16b, #7\");\n  TEST_SINGLE(fcvtzs(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"fcvtzs v30.8h, v29.8h, #1\");\n  TEST_SINGLE(fcvtzs(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"fcvtzs v30.8h, v29.8h, #15\");\n  TEST_SINGLE(fcvtzs(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"fcvtzs v30.4s, v29.4s, #1\");\n  TEST_SINGLE(fcvtzs(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"fcvtzs v30.4s, v29.4s, #31\");\n  TEST_SINGLE(fcvtzs(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"fcvtzs v30.2d, v29.2d, #1\");\n  TEST_SINGLE(fcvtzs(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"fcvtzs v30.2d, v29.2d, #63\");\n\n  // TEST_SINGLE(fcvtzs(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1),   \"fcvtzs v30.8b, v29.8b, #1\");\n  // TEST_SINGLE(fcvtzs(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7),   \"fcvtzs v30.8b, v29.8b, #7\");\n  TEST_SINGLE(fcvtzs(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"fcvtzs v30.4h, v29.4h, #1\");\n  TEST_SINGLE(fcvtzs(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"fcvtzs v30.4h, v29.4h, #15\");\n  TEST_SINGLE(fcvtzs(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"fcvtzs v30.2s, v29.2s, #1\");\n  TEST_SINGLE(fcvtzs(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"fcvtzs v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(fcvtzs(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"fcvtzs v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(fcvtzs(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"fcvtzs v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(ushr(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"ushr v30.16b, v29.16b, #1\");\n  TEST_SINGLE(ushr(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"ushr v30.16b, v29.16b, #7\");\n  TEST_SINGLE(ushr(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"ushr v30.8h, v29.8h, #1\");\n  TEST_SINGLE(ushr(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"ushr v30.8h, v29.8h, #15\");\n  TEST_SINGLE(ushr(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"ushr v30.4s, v29.4s, #1\");\n  TEST_SINGLE(ushr(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"ushr v30.4s, v29.4s, #31\");\n  TEST_SINGLE(ushr(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"ushr v30.2d, v29.2d, #1\");\n  TEST_SINGLE(ushr(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"ushr v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(ushr(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"ushr v30.8b, v29.8b, #1\");\n  TEST_SINGLE(ushr(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"ushr v30.8b, v29.8b, #7\");\n  TEST_SINGLE(ushr(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"ushr v30.4h, v29.4h, #1\");\n  TEST_SINGLE(ushr(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"ushr v30.4h, v29.4h, #15\");\n  TEST_SINGLE(ushr(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"ushr v30.2s, v29.2s, #1\");\n  TEST_SINGLE(ushr(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"ushr v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(ushr(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"ushr v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(ushr(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"ushr v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(usra(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"usra v30.16b, v29.16b, #1\");\n  TEST_SINGLE(usra(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"usra v30.16b, v29.16b, #7\");\n  TEST_SINGLE(usra(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"usra v30.8h, v29.8h, #1\");\n  TEST_SINGLE(usra(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"usra v30.8h, v29.8h, #15\");\n  TEST_SINGLE(usra(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"usra v30.4s, v29.4s, #1\");\n  TEST_SINGLE(usra(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"usra v30.4s, v29.4s, #31\");\n  TEST_SINGLE(usra(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"usra v30.2d, v29.2d, #1\");\n  TEST_SINGLE(usra(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"usra v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(usra(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"usra v30.8b, v29.8b, #1\");\n  TEST_SINGLE(usra(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"usra v30.8b, v29.8b, #7\");\n  TEST_SINGLE(usra(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"usra v30.4h, v29.4h, #1\");\n  TEST_SINGLE(usra(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"usra v30.4h, v29.4h, #15\");\n  TEST_SINGLE(usra(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"usra v30.2s, v29.2s, #1\");\n  TEST_SINGLE(usra(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"usra v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(usra(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"usra v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(usra(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"usra v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(urshr(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"urshr v30.16b, v29.16b, #1\");\n  TEST_SINGLE(urshr(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"urshr v30.16b, v29.16b, #7\");\n  TEST_SINGLE(urshr(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"urshr v30.8h, v29.8h, #1\");\n  TEST_SINGLE(urshr(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"urshr v30.8h, v29.8h, #15\");\n  TEST_SINGLE(urshr(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"urshr v30.4s, v29.4s, #1\");\n  TEST_SINGLE(urshr(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"urshr v30.4s, v29.4s, #31\");\n  TEST_SINGLE(urshr(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"urshr v30.2d, v29.2d, #1\");\n  TEST_SINGLE(urshr(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"urshr v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(urshr(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"urshr v30.8b, v29.8b, #1\");\n  TEST_SINGLE(urshr(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"urshr v30.8b, v29.8b, #7\");\n  TEST_SINGLE(urshr(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"urshr v30.4h, v29.4h, #1\");\n  TEST_SINGLE(urshr(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"urshr v30.4h, v29.4h, #15\");\n  TEST_SINGLE(urshr(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"urshr v30.2s, v29.2s, #1\");\n  TEST_SINGLE(urshr(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"urshr v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(urshr(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"urshr v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(urshr(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"urshr v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(ursra(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"ursra v30.16b, v29.16b, #1\");\n  TEST_SINGLE(ursra(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"ursra v30.16b, v29.16b, #7\");\n  TEST_SINGLE(ursra(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"ursra v30.8h, v29.8h, #1\");\n  TEST_SINGLE(ursra(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"ursra v30.8h, v29.8h, #15\");\n  TEST_SINGLE(ursra(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"ursra v30.4s, v29.4s, #1\");\n  TEST_SINGLE(ursra(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"ursra v30.4s, v29.4s, #31\");\n  TEST_SINGLE(ursra(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"ursra v30.2d, v29.2d, #1\");\n  TEST_SINGLE(ursra(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"ursra v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(ursra(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"ursra v30.8b, v29.8b, #1\");\n  TEST_SINGLE(ursra(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"ursra v30.8b, v29.8b, #7\");\n  TEST_SINGLE(ursra(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"ursra v30.4h, v29.4h, #1\");\n  TEST_SINGLE(ursra(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"ursra v30.4h, v29.4h, #15\");\n  TEST_SINGLE(ursra(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"ursra v30.2s, v29.2s, #1\");\n  TEST_SINGLE(ursra(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"ursra v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(ursra(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"ursra v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(ursra(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"ursra v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(sri(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"sri v30.16b, v29.16b, #1\");\n  TEST_SINGLE(sri(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"sri v30.16b, v29.16b, #7\");\n  TEST_SINGLE(sri(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"sri v30.8h, v29.8h, #1\");\n  TEST_SINGLE(sri(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"sri v30.8h, v29.8h, #15\");\n  TEST_SINGLE(sri(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"sri v30.4s, v29.4s, #1\");\n  TEST_SINGLE(sri(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"sri v30.4s, v29.4s, #31\");\n  TEST_SINGLE(sri(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"sri v30.2d, v29.2d, #1\");\n  TEST_SINGLE(sri(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"sri v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(sri(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"sri v30.8b, v29.8b, #1\");\n  TEST_SINGLE(sri(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"sri v30.8b, v29.8b, #7\");\n  TEST_SINGLE(sri(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"sri v30.4h, v29.4h, #1\");\n  TEST_SINGLE(sri(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"sri v30.4h, v29.4h, #15\");\n  TEST_SINGLE(sri(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"sri v30.2s, v29.2s, #1\");\n  TEST_SINGLE(sri(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"sri v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(sri(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"sri v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(sri(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"sri v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(sli(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"sli v30.16b, v29.16b, #1\");\n  TEST_SINGLE(sli(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"sli v30.16b, v29.16b, #7\");\n  TEST_SINGLE(sli(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"sli v30.8h, v29.8h, #1\");\n  TEST_SINGLE(sli(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"sli v30.8h, v29.8h, #15\");\n  TEST_SINGLE(sli(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"sli v30.4s, v29.4s, #1\");\n  TEST_SINGLE(sli(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"sli v30.4s, v29.4s, #31\");\n  TEST_SINGLE(sli(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"sli v30.2d, v29.2d, #1\");\n  TEST_SINGLE(sli(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"sli v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(sli(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"sli v30.8b, v29.8b, #1\");\n  TEST_SINGLE(sli(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"sli v30.8b, v29.8b, #7\");\n  TEST_SINGLE(sli(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"sli v30.4h, v29.4h, #1\");\n  TEST_SINGLE(sli(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"sli v30.4h, v29.4h, #15\");\n  TEST_SINGLE(sli(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"sli v30.2s, v29.2s, #1\");\n  TEST_SINGLE(sli(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"sli v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(sli(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"sli v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(sli(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"sli v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(sqshlu(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"sqshlu v30.16b, v29.16b, #1\");\n  TEST_SINGLE(sqshlu(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"sqshlu v30.16b, v29.16b, #7\");\n  TEST_SINGLE(sqshlu(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"sqshlu v30.8h, v29.8h, #1\");\n  TEST_SINGLE(sqshlu(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"sqshlu v30.8h, v29.8h, #15\");\n  TEST_SINGLE(sqshlu(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"sqshlu v30.4s, v29.4s, #1\");\n  TEST_SINGLE(sqshlu(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"sqshlu v30.4s, v29.4s, #31\");\n  TEST_SINGLE(sqshlu(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"sqshlu v30.2d, v29.2d, #1\");\n  TEST_SINGLE(sqshlu(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"sqshlu v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(sqshlu(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"sqshlu v30.8b, v29.8b, #1\");\n  TEST_SINGLE(sqshlu(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"sqshlu v30.8b, v29.8b, #7\");\n  TEST_SINGLE(sqshlu(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"sqshlu v30.4h, v29.4h, #1\");\n  TEST_SINGLE(sqshlu(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"sqshlu v30.4h, v29.4h, #15\");\n  TEST_SINGLE(sqshlu(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"sqshlu v30.2s, v29.2s, #1\");\n  TEST_SINGLE(sqshlu(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"sqshlu v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(sqshlu(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"sqshlu v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(sqshlu(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"sqshlu v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(uqshl(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"uqshl v30.16b, v29.16b, #1\");\n  TEST_SINGLE(uqshl(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"uqshl v30.16b, v29.16b, #7\");\n  TEST_SINGLE(uqshl(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"uqshl v30.8h, v29.8h, #1\");\n  TEST_SINGLE(uqshl(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"uqshl v30.8h, v29.8h, #15\");\n  TEST_SINGLE(uqshl(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"uqshl v30.4s, v29.4s, #1\");\n  TEST_SINGLE(uqshl(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"uqshl v30.4s, v29.4s, #31\");\n  TEST_SINGLE(uqshl(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"uqshl v30.2d, v29.2d, #1\");\n  TEST_SINGLE(uqshl(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"uqshl v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(uqshl(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"uqshl v30.8b, v29.8b, #1\");\n  TEST_SINGLE(uqshl(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"uqshl v30.8b, v29.8b, #7\");\n  TEST_SINGLE(uqshl(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"uqshl v30.4h, v29.4h, #1\");\n  TEST_SINGLE(uqshl(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"uqshl v30.4h, v29.4h, #15\");\n  TEST_SINGLE(uqshl(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"uqshl v30.2s, v29.2s, #1\");\n  TEST_SINGLE(uqshl(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"uqshl v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(uqshl(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"uqshl v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(uqshl(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"uqshl v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(sqshrun(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"sqshrun v30.8b, v29.8h, #1\");\n  TEST_SINGLE(sqshrun(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"sqshrun v30.8b, v29.8h, #7\");\n  TEST_SINGLE(sqshrun(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"sqshrun v30.4h, v29.4s, #1\");\n  TEST_SINGLE(sqshrun(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"sqshrun v30.4h, v29.4s, #15\");\n  TEST_SINGLE(sqshrun(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"sqshrun v30.2s, v29.2d, #1\");\n  TEST_SINGLE(sqshrun(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"sqshrun v30.2s, v29.2d, #31\");\n  // TEST_SINGLE(sqshrun(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"sqshrun v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(sqshrun(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"sqshrun v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(sqshrun2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"sqshrun2 v30.16b, v29.8h, #1\");\n  TEST_SINGLE(sqshrun2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"sqshrun2 v30.16b, v29.8h, #7\");\n  TEST_SINGLE(sqshrun2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"sqshrun2 v30.8h, v29.4s, #1\");\n  TEST_SINGLE(sqshrun2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"sqshrun2 v30.8h, v29.4s, #15\");\n  TEST_SINGLE(sqshrun2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"sqshrun2 v30.4s, v29.2d, #1\");\n  TEST_SINGLE(sqshrun2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"sqshrun2 v30.4s, v29.2d, #31\");\n  // TEST_SINGLE(sqshrun2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1),  \"sqshrun2 v30.2d, v29.2d, #1\");\n  // TEST_SINGLE(sqshrun2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"sqshrun2 v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(sqrshrun(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"sqrshrun v30.8b, v29.8h, #1\");\n  TEST_SINGLE(sqrshrun(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"sqrshrun v30.8b, v29.8h, #7\");\n  TEST_SINGLE(sqrshrun(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"sqrshrun v30.4h, v29.4s, #1\");\n  TEST_SINGLE(sqrshrun(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"sqrshrun v30.4h, v29.4s, #15\");\n  TEST_SINGLE(sqrshrun(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"sqrshrun v30.2s, v29.2d, #1\");\n  TEST_SINGLE(sqrshrun(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"sqrshrun v30.2s, v29.2d, #31\");\n  // TEST_SINGLE(sqrshrun(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"sqrshrun v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(sqrshrun(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"sqrshrun v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(sqrshrun2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"sqrshrun2 v30.16b, v29.8h, #1\");\n  TEST_SINGLE(sqrshrun2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"sqrshrun2 v30.16b, v29.8h, #7\");\n  TEST_SINGLE(sqrshrun2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"sqrshrun2 v30.8h, v29.4s, #1\");\n  TEST_SINGLE(sqrshrun2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"sqrshrun2 v30.8h, v29.4s, #15\");\n  TEST_SINGLE(sqrshrun2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"sqrshrun2 v30.4s, v29.2d, #1\");\n  TEST_SINGLE(sqrshrun2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"sqrshrun2 v30.4s, v29.2d, #31\");\n  // TEST_SINGLE(sqrshrun2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1),  \"sqrshrun2 v30.2d, v29.2d, #1\");\n  // TEST_SINGLE(sqrshrun2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"sqrshrun2 v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(uqshrn(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"uqshrn v30.8b, v29.8h, #1\");\n  TEST_SINGLE(uqshrn(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"uqshrn v30.8b, v29.8h, #7\");\n  TEST_SINGLE(uqshrn(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"uqshrn v30.4h, v29.4s, #1\");\n  TEST_SINGLE(uqshrn(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"uqshrn v30.4h, v29.4s, #15\");\n  TEST_SINGLE(uqshrn(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"uqshrn v30.2s, v29.2d, #1\");\n  TEST_SINGLE(uqshrn(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"uqshrn v30.2s, v29.2d, #31\");\n  // TEST_SINGLE(uqshrn(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"uqshrn v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(uqshrn(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"uqshrn v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(uqshrn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"uqshrn2 v30.16b, v29.8h, #1\");\n  TEST_SINGLE(uqshrn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"uqshrn2 v30.16b, v29.8h, #7\");\n  TEST_SINGLE(uqshrn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"uqshrn2 v30.8h, v29.4s, #1\");\n  TEST_SINGLE(uqshrn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"uqshrn2 v30.8h, v29.4s, #15\");\n  TEST_SINGLE(uqshrn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"uqshrn2 v30.4s, v29.2d, #1\");\n  TEST_SINGLE(uqshrn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"uqshrn2 v30.4s, v29.2d, #31\");\n  // TEST_SINGLE(uqshrn2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1),  \"uqshrn2 v30.2d, v29.2d, #1\");\n  // TEST_SINGLE(uqshrn2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"uqshrn2 v30.2d, v29.2d, #63\");\n\n  TEST_SINGLE(uqrshrn(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1), \"uqrshrn v30.8b, v29.8h, #1\");\n  TEST_SINGLE(uqrshrn(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7), \"uqrshrn v30.8b, v29.8h, #7\");\n  TEST_SINGLE(uqrshrn(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"uqrshrn v30.4h, v29.4s, #1\");\n  TEST_SINGLE(uqrshrn(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"uqrshrn v30.4h, v29.4s, #15\");\n  TEST_SINGLE(uqrshrn(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"uqrshrn v30.2s, v29.2d, #1\");\n  TEST_SINGLE(uqrshrn(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"uqrshrn v30.2s, v29.2d, #31\");\n  // TEST_SINGLE(uqrshrn(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"uqrshrn v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(uqrshrn(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"uqrshrn v30.1d, v29.1d, #63\");\n\n  TEST_SINGLE(uqrshrn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1), \"uqrshrn2 v30.16b, v29.8h, #1\");\n  TEST_SINGLE(uqrshrn2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7), \"uqrshrn2 v30.16b, v29.8h, #7\");\n  TEST_SINGLE(uqrshrn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"uqrshrn2 v30.8h, v29.4s, #1\");\n  TEST_SINGLE(uqrshrn2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"uqrshrn2 v30.8h, v29.4s, #15\");\n  TEST_SINGLE(uqrshrn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"uqrshrn2 v30.4s, v29.2d, #1\");\n  TEST_SINGLE(uqrshrn2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"uqrshrn2 v30.4s, v29.2d, #31\");\n  // TEST_SINGLE(uqrshrn2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1),  \"uqrshrn2 v30.2d, v29.2d, #1\");\n  // TEST_SINGLE(uqrshrn2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"uqrshrn2 v30.2d, v29.2d, #63\");\n\n  // TEST_SINGLE(ushll(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1),   \"ushll v30.8b, v29.8h, #1\");\n  // TEST_SINGLE(ushll(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7),   \"ushll v30.8b, v29.8h, #7\");\n  TEST_SINGLE(ushll(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"ushll v30.8h, v29.8b, #1\");\n  TEST_SINGLE(ushll(SubRegSize::i16Bit, DReg::d30, DReg::d29, 7), \"ushll v30.8h, v29.8b, #7\");\n  TEST_SINGLE(ushll(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"ushll v30.4s, v29.4h, #1\");\n  TEST_SINGLE(ushll(SubRegSize::i32Bit, DReg::d30, DReg::d29, 15), \"ushll v30.4s, v29.4h, #15\");\n  TEST_SINGLE(ushll(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1), \"ushll v30.2d, v29.2s, #1\");\n  TEST_SINGLE(ushll(SubRegSize::i64Bit, DReg::d30, DReg::d29, 31), \"ushll v30.2d, v29.2s, #31\");\n\n  // TEST_SINGLE(ushll2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1),   \"ushll2 v30.16b, v29.8h, #1\");\n  // TEST_SINGLE(ushll2(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7),   \"ushll2 v30.16b, v29.8h, #7\");\n  TEST_SINGLE(ushll2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"ushll2 v30.8h, v29.16b, #1\");\n  TEST_SINGLE(ushll2(SubRegSize::i16Bit, QReg::q30, QReg::q29, 7), \"ushll2 v30.8h, v29.16b, #7\");\n  TEST_SINGLE(ushll2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"ushll2 v30.4s, v29.8h, #1\");\n  TEST_SINGLE(ushll2(SubRegSize::i32Bit, QReg::q30, QReg::q29, 15), \"ushll2 v30.4s, v29.8h, #15\");\n  TEST_SINGLE(ushll2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"ushll2 v30.2d, v29.4s, #1\");\n  TEST_SINGLE(ushll2(SubRegSize::i64Bit, QReg::q30, QReg::q29, 31), \"ushll2 v30.2d, v29.4s, #31\");\n\n  // TEST_SINGLE(uxtl(SubRegSize::i8Bit, DReg::d30, DReg::d29),   \"uxtl v30.8b, v29.8h\");\n  TEST_SINGLE(uxtl(SubRegSize::i16Bit, DReg::d30, DReg::d29), \"uxtl v30.8h, v29.8b\");\n  TEST_SINGLE(uxtl(SubRegSize::i32Bit, DReg::d30, DReg::d29), \"uxtl v30.4s, v29.4h\");\n  TEST_SINGLE(uxtl(SubRegSize::i64Bit, DReg::d30, DReg::d29), \"uxtl v30.2d, v29.2s\");\n\n  // TEST_SINGLE(uxtl2(SubRegSize::i8Bit, QReg::q30, QReg::q29),   \"uxtl2 v30.16b, v29.8h\");\n  TEST_SINGLE(uxtl2(SubRegSize::i16Bit, QReg::q30, QReg::q29), \"uxtl2 v30.8h, v29.16b\");\n  TEST_SINGLE(uxtl2(SubRegSize::i32Bit, QReg::q30, QReg::q29), \"uxtl2 v30.4s, v29.8h\");\n  TEST_SINGLE(uxtl2(SubRegSize::i64Bit, QReg::q30, QReg::q29), \"uxtl2 v30.2d, v29.4s\");\n\n  // TEST_SINGLE(ucvtf(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1),   \"ucvtf v30.16b, v29.16b, #1\");\n  // TEST_SINGLE(ucvtf(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7),   \"ucvtf v30.16b, v29.16b, #7\");\n  TEST_SINGLE(ucvtf(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"ucvtf v30.8h, v29.8h, #1\");\n  TEST_SINGLE(ucvtf(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"ucvtf v30.8h, v29.8h, #15\");\n  TEST_SINGLE(ucvtf(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"ucvtf v30.4s, v29.4s, #1\");\n  TEST_SINGLE(ucvtf(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"ucvtf v30.4s, v29.4s, #31\");\n  TEST_SINGLE(ucvtf(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"ucvtf v30.2d, v29.2d, #1\");\n  TEST_SINGLE(ucvtf(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"ucvtf v30.2d, v29.2d, #63\");\n\n  // TEST_SINGLE(ucvtf(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1),   \"ucvtf v30.8b, v29.8b, #1\");\n  // TEST_SINGLE(ucvtf(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7),   \"ucvtf v30.8b, v29.8b, #7\");\n  TEST_SINGLE(ucvtf(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"ucvtf v30.4h, v29.4h, #1\");\n  TEST_SINGLE(ucvtf(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"ucvtf v30.4h, v29.4h, #15\");\n  TEST_SINGLE(ucvtf(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"ucvtf v30.2s, v29.2s, #1\");\n  TEST_SINGLE(ucvtf(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"ucvtf v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(ucvtf(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"ucvtf v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(ucvtf(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"ucvtf v30.1d, v29.1d, #63\");\n\n  // TEST_SINGLE(fcvtzu(SubRegSize::i8Bit, QReg::q30, QReg::q29, 1),   \"fcvtzu v30.16b, v29.16b, #1\");\n  // TEST_SINGLE(fcvtzu(SubRegSize::i8Bit, QReg::q30, QReg::q29, 7),   \"fcvtzu v30.16b, v29.16b, #7\");\n  TEST_SINGLE(fcvtzu(SubRegSize::i16Bit, QReg::q30, QReg::q29, 1), \"fcvtzu v30.8h, v29.8h, #1\");\n  TEST_SINGLE(fcvtzu(SubRegSize::i16Bit, QReg::q30, QReg::q29, 15), \"fcvtzu v30.8h, v29.8h, #15\");\n  TEST_SINGLE(fcvtzu(SubRegSize::i32Bit, QReg::q30, QReg::q29, 1), \"fcvtzu v30.4s, v29.4s, #1\");\n  TEST_SINGLE(fcvtzu(SubRegSize::i32Bit, QReg::q30, QReg::q29, 31), \"fcvtzu v30.4s, v29.4s, #31\");\n  TEST_SINGLE(fcvtzu(SubRegSize::i64Bit, QReg::q30, QReg::q29, 1), \"fcvtzu v30.2d, v29.2d, #1\");\n  TEST_SINGLE(fcvtzu(SubRegSize::i64Bit, QReg::q30, QReg::q29, 63), \"fcvtzu v30.2d, v29.2d, #63\");\n\n  // TEST_SINGLE(fcvtzu(SubRegSize::i8Bit, DReg::d30, DReg::d29, 1),   \"fcvtzu v30.8b, v29.8b, #1\");\n  // TEST_SINGLE(fcvtzu(SubRegSize::i8Bit, DReg::d30, DReg::d29, 7),   \"fcvtzu v30.8b, v29.8b, #7\");\n  TEST_SINGLE(fcvtzu(SubRegSize::i16Bit, DReg::d30, DReg::d29, 1), \"fcvtzu v30.4h, v29.4h, #1\");\n  TEST_SINGLE(fcvtzu(SubRegSize::i16Bit, DReg::d30, DReg::d29, 15), \"fcvtzu v30.4h, v29.4h, #15\");\n  TEST_SINGLE(fcvtzu(SubRegSize::i32Bit, DReg::d30, DReg::d29, 1), \"fcvtzu v30.2s, v29.2s, #1\");\n  TEST_SINGLE(fcvtzu(SubRegSize::i32Bit, DReg::d30, DReg::d29, 31), \"fcvtzu v30.2s, v29.2s, #31\");\n  // TEST_SINGLE(fcvtzu(SubRegSize::i64Bit, DReg::d30, DReg::d29, 1),  \"fcvtzu v30.1d, v29.1d, #1\");\n  // TEST_SINGLE(fcvtzu(SubRegSize::i64Bit, DReg::d30, DReg::d29, 63), \"fcvtzu v30.1d, v29.1d, #63\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Advanced SIMD vector x indexed element\") {\n  TEST_SINGLE(smlal(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"smlal v30.4s, v29.4h, v15.h[0]\");\n  TEST_SINGLE(smlal(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"smlal v30.4s, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(smlal(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"smlal v30.2d, v29.2s, v28.s[0]\");\n  TEST_SINGLE(smlal(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"smlal v30.2d, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(smlal(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"smlal v30.2d, v29.2s, v15.s[0]\");\n  TEST_SINGLE(smlal(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"smlal v30.2d, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(smlal2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"smlal2 v30.4s, v29.8h, v15.h[0]\");\n  TEST_SINGLE(smlal2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"smlal2 v30.4s, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(smlal2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"smlal2 v30.2d, v29.4s, v28.s[0]\");\n  TEST_SINGLE(smlal2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"smlal2 v30.2d, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(smlal2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"smlal2 v30.2d, v29.4s, v15.s[0]\");\n  TEST_SINGLE(smlal2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"smlal2 v30.2d, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(sqdmlal(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"sqdmlal v30.4s, v29.4h, v15.h[0]\");\n  TEST_SINGLE(sqdmlal(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"sqdmlal v30.4s, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(sqdmlal(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"sqdmlal v30.2d, v29.2s, v28.s[0]\");\n  TEST_SINGLE(sqdmlal(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"sqdmlal v30.2d, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(sqdmlal(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"sqdmlal v30.2d, v29.2s, v15.s[0]\");\n  TEST_SINGLE(sqdmlal(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"sqdmlal v30.2d, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(sqdmlal2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"sqdmlal2 v30.4s, v29.8h, v15.h[0]\");\n  TEST_SINGLE(sqdmlal2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"sqdmlal2 v30.4s, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(sqdmlal2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"sqdmlal2 v30.2d, v29.4s, v28.s[0]\");\n  TEST_SINGLE(sqdmlal2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"sqdmlal2 v30.2d, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(sqdmlal2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"sqdmlal2 v30.2d, v29.4s, v15.s[0]\");\n  TEST_SINGLE(sqdmlal2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"sqdmlal2 v30.2d, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(smlsl(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"smlsl v30.4s, v29.4h, v15.h[0]\");\n  TEST_SINGLE(smlsl(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"smlsl v30.4s, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(smlsl(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"smlsl v30.2d, v29.2s, v28.s[0]\");\n  TEST_SINGLE(smlsl(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"smlsl v30.2d, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(smlsl(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"smlsl v30.2d, v29.2s, v15.s[0]\");\n  TEST_SINGLE(smlsl(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"smlsl v30.2d, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(smlsl2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"smlsl2 v30.4s, v29.8h, v15.h[0]\");\n  TEST_SINGLE(smlsl2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"smlsl2 v30.4s, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(smlsl2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"smlsl2 v30.2d, v29.4s, v28.s[0]\");\n  TEST_SINGLE(smlsl2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"smlsl2 v30.2d, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(smlsl2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"smlsl2 v30.2d, v29.4s, v15.s[0]\");\n  TEST_SINGLE(smlsl2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"smlsl2 v30.2d, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(sqdmlsl(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"sqdmlsl v30.4s, v29.4h, v15.h[0]\");\n  TEST_SINGLE(sqdmlsl(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"sqdmlsl v30.4s, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(sqdmlsl(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"sqdmlsl v30.2d, v29.2s, v28.s[0]\");\n  TEST_SINGLE(sqdmlsl(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"sqdmlsl v30.2d, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(sqdmlsl(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"sqdmlsl v30.2d, v29.2s, v15.s[0]\");\n  TEST_SINGLE(sqdmlsl(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"sqdmlsl v30.2d, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(sqdmlsl2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"sqdmlsl2 v30.4s, v29.8h, v15.h[0]\");\n  TEST_SINGLE(sqdmlsl2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"sqdmlsl2 v30.4s, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(sqdmlsl2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"sqdmlsl2 v30.2d, v29.4s, v28.s[0]\");\n  TEST_SINGLE(sqdmlsl2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"sqdmlsl2 v30.2d, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(sqdmlsl2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"sqdmlsl2 v30.2d, v29.4s, v15.s[0]\");\n  TEST_SINGLE(sqdmlsl2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"sqdmlsl2 v30.2d, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(mul(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"mul v30.8h, v29.8h, v15.h[0]\");\n  TEST_SINGLE(mul(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 7), \"mul v30.8h, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(mul(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, 0), \"mul v30.4s, v29.4s, v28.s[0]\");\n  TEST_SINGLE(mul(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, 3), \"mul v30.4s, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(mul(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"mul v30.4s, v29.4s, v15.s[0]\");\n  TEST_SINGLE(mul(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 3), \"mul v30.4s, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(mul(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"mul v30.4h, v29.4h, v15.h[0]\");\n  TEST_SINGLE(mul(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 7), \"mul v30.4h, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(mul(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, 0), \"mul v30.2s, v29.2s, v28.s[0]\");\n  TEST_SINGLE(mul(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, 3), \"mul v30.2s, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(mul(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"mul v30.2s, v29.2s, v15.s[0]\");\n  TEST_SINGLE(mul(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 3), \"mul v30.2s, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(smull(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"smull v30.4s, v29.4h, v15.h[0]\");\n  TEST_SINGLE(smull(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"smull v30.4s, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(smull(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"smull v30.2d, v29.2s, v28.s[0]\");\n  TEST_SINGLE(smull(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"smull v30.2d, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(smull(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"smull v30.2d, v29.2s, v15.s[0]\");\n  TEST_SINGLE(smull(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"smull v30.2d, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(smull2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"smull2 v30.4s, v29.8h, v15.h[0]\");\n  TEST_SINGLE(smull2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"smull2 v30.4s, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(smull2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"smull2 v30.2d, v29.4s, v28.s[0]\");\n  TEST_SINGLE(smull2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"smull2 v30.2d, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(smull2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"smull2 v30.2d, v29.4s, v15.s[0]\");\n  TEST_SINGLE(smull2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"smull2 v30.2d, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(sqdmull(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"sqdmull v30.4s, v29.4h, v15.h[0]\");\n  TEST_SINGLE(sqdmull(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"sqdmull v30.4s, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(sqdmull(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"sqdmull v30.2d, v29.2s, v28.s[0]\");\n  TEST_SINGLE(sqdmull(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"sqdmull v30.2d, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(sqdmull(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"sqdmull v30.2d, v29.2s, v15.s[0]\");\n  TEST_SINGLE(sqdmull(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"sqdmull v30.2d, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(sqdmull2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"sqdmull2 v30.4s, v29.8h, v15.h[0]\");\n  TEST_SINGLE(sqdmull2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"sqdmull2 v30.4s, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(sqdmull2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"sqdmull2 v30.2d, v29.4s, v28.s[0]\");\n  TEST_SINGLE(sqdmull2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"sqdmull2 v30.2d, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(sqdmull2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"sqdmull2 v30.2d, v29.4s, v15.s[0]\");\n  TEST_SINGLE(sqdmull2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"sqdmull2 v30.2d, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(sqdmulh(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"sqdmulh v30.8h, v29.8h, v15.h[0]\");\n  TEST_SINGLE(sqdmulh(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 7), \"sqdmulh v30.8h, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(sqdmulh(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, 0), \"sqdmulh v30.4s, v29.4s, v28.s[0]\");\n  TEST_SINGLE(sqdmulh(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, 3), \"sqdmulh v30.4s, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(sqdmulh(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"sqdmulh v30.4s, v29.4s, v15.s[0]\");\n  TEST_SINGLE(sqdmulh(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 3), \"sqdmulh v30.4s, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(sqdmulh(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"sqdmulh v30.4h, v29.4h, v15.h[0]\");\n  TEST_SINGLE(sqdmulh(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 7), \"sqdmulh v30.4h, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(sqdmulh(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, 0), \"sqdmulh v30.2s, v29.2s, v28.s[0]\");\n  TEST_SINGLE(sqdmulh(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, 3), \"sqdmulh v30.2s, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(sqdmulh(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"sqdmulh v30.2s, v29.2s, v15.s[0]\");\n  TEST_SINGLE(sqdmulh(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 3), \"sqdmulh v30.2s, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(sqrdmulh(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"sqrdmulh v30.8h, v29.8h, v15.h[0]\");\n  TEST_SINGLE(sqrdmulh(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 7), \"sqrdmulh v30.8h, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(sqrdmulh(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, 0), \"sqrdmulh v30.4s, v29.4s, v28.s[0]\");\n  TEST_SINGLE(sqrdmulh(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, 3), \"sqrdmulh v30.4s, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(sqrdmulh(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"sqrdmulh v30.4s, v29.4s, v15.s[0]\");\n  TEST_SINGLE(sqrdmulh(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 3), \"sqrdmulh v30.4s, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(sqrdmulh(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"sqrdmulh v30.4h, v29.4h, v15.h[0]\");\n  TEST_SINGLE(sqrdmulh(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 7), \"sqrdmulh v30.4h, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(sqrdmulh(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, 0), \"sqrdmulh v30.2s, v29.2s, v28.s[0]\");\n  TEST_SINGLE(sqrdmulh(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, 3), \"sqrdmulh v30.2s, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(sqrdmulh(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"sqrdmulh v30.2s, v29.2s, v15.s[0]\");\n  TEST_SINGLE(sqrdmulh(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 3), \"sqrdmulh v30.2s, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(sdot(QReg::q30, QReg::q29, QReg::q28, 0), \"sdot v30.4s, v29.16b, v28.4b[0]\");\n  TEST_SINGLE(sdot(QReg::q30, QReg::q29, QReg::q28, 3), \"sdot v30.4s, v29.16b, v28.4b[3]\");\n\n  TEST_SINGLE(sdot(QReg::q30, QReg::q29, QReg::q15, 0), \"sdot v30.4s, v29.16b, v15.4b[0]\");\n  TEST_SINGLE(sdot(QReg::q30, QReg::q29, QReg::q15, 3), \"sdot v30.4s, v29.16b, v15.4b[3]\");\n\n  TEST_SINGLE(sdot(DReg::d30, DReg::d29, DReg::d28, 0), \"sdot v30.2s, v29.8b, v28.4b[0]\");\n  TEST_SINGLE(sdot(DReg::d30, DReg::d29, DReg::d28, 3), \"sdot v30.2s, v29.8b, v28.4b[3]\");\n\n  TEST_SINGLE(sdot(DReg::d30, DReg::d29, DReg::d15, 0), \"sdot v30.2s, v29.8b, v15.4b[0]\");\n  TEST_SINGLE(sdot(DReg::d30, DReg::d29, DReg::d15, 3), \"sdot v30.2s, v29.8b, v15.4b[3]\");\n\n  TEST_SINGLE(fmla(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"fmla v30.8h, v29.8h, v15.h[0]\");\n  TEST_SINGLE(fmla(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 7), \"fmla v30.8h, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(fmla(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"fmla v30.4h, v29.4h, v15.h[0]\");\n  TEST_SINGLE(fmla(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 7), \"fmla v30.4h, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(fmls(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"fmls v30.8h, v29.8h, v15.h[0]\");\n  TEST_SINGLE(fmls(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 7), \"fmls v30.8h, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(fmls(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"fmls v30.4h, v29.4h, v15.h[0]\");\n  TEST_SINGLE(fmls(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 7), \"fmls v30.4h, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(fmul(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"fmul v30.8h, v29.8h, v15.h[0]\");\n  TEST_SINGLE(fmul(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 7), \"fmul v30.8h, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(fmul(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"fmul v30.4h, v29.4h, v15.h[0]\");\n  TEST_SINGLE(fmul(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 7), \"fmul v30.4h, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(sudot(QReg::q30, QReg::q29, QReg::q28, 0), \"sudot v30.4s, v29.16b, v28.4b[0]\");\n  TEST_SINGLE(sudot(QReg::q30, QReg::q29, QReg::q28, 3), \"sudot v30.4s, v29.16b, v28.4b[3]\");\n\n  TEST_SINGLE(sudot(QReg::q30, QReg::q29, QReg::q15, 0), \"sudot v30.4s, v29.16b, v15.4b[0]\");\n  TEST_SINGLE(sudot(QReg::q30, QReg::q29, QReg::q15, 3), \"sudot v30.4s, v29.16b, v15.4b[3]\");\n\n  TEST_SINGLE(sudot(DReg::d30, DReg::d29, DReg::d28, 0), \"sudot v30.2s, v29.8b, v28.4b[0]\");\n  TEST_SINGLE(sudot(DReg::d30, DReg::d29, DReg::d28, 3), \"sudot v30.2s, v29.8b, v28.4b[3]\");\n\n  TEST_SINGLE(sudot(DReg::d30, DReg::d29, DReg::d15, 0), \"sudot v30.2s, v29.8b, v15.4b[0]\");\n  TEST_SINGLE(sudot(DReg::d30, DReg::d29, DReg::d15, 3), \"sudot v30.2s, v29.8b, v15.4b[3]\");\n\n  // Unimplemented in vixl disassembler\n  // TEST_SINGLE(bfdot(QReg::q30, QReg::q29, QReg::q28, 0), \"bfdot v30.4s, v29.8h, v28.2h[0]\");\n  // TEST_SINGLE(bfdot(QReg::q30, QReg::q29, QReg::q28, 3), \"bfdot v30.4s, v29.8h, v28.2h[3]\");\n\n  // TEST_SINGLE(bfdot(QReg::q30, QReg::q29, QReg::q15, 0), \"bfdot v30.4s, v29.8h, v15.2h[0]\");\n  // TEST_SINGLE(bfdot(QReg::q30, QReg::q29, QReg::q15, 3), \"bfdot v30.4s, v29.8h, v15.2h[3]\");\n\n  // TEST_SINGLE(bfdot(DReg::d30, DReg::d29, DReg::d28, 0), \"bfdot v30.2s, v29.4h, v28.2h[0]\");\n  // TEST_SINGLE(bfdot(DReg::d30, DReg::d29, DReg::d28, 3), \"bfdot v30.2s, v29.4h, v28.2h[3]\");\n\n  // TEST_SINGLE(bfdot(DReg::d30, DReg::d29, DReg::d15, 0), \"bfdot v30.2s, v29.4h, v15.2h[0]\");\n  // TEST_SINGLE(bfdot(DReg::d30, DReg::d29, DReg::d15, 3), \"bfdot v30.2s, v29.4h, v15.2h[3]\");\n\n  TEST_SINGLE(fmla(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"fmla v30.4s, v29.4s, v15.s[0]\");\n  TEST_SINGLE(fmla(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 3), \"fmla v30.4s, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(fmla(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"fmla v30.2s, v29.2s, v15.s[0]\");\n  TEST_SINGLE(fmla(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 3), \"fmla v30.2s, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(fmla(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"fmla v30.2d, v29.2d, v15.d[0]\");\n  TEST_SINGLE(fmla(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q15, 1), \"fmla v30.2d, v29.2d, v15.d[1]\");\n\n  // TEST_SINGLE(fmla(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"fmla v30.1d, v29.1d, v15.d[0]\");\n  // TEST_SINGLE(fmla(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d15, 1), \"fmla v30.1d, v29.1d, v15.d[1]\");\n\n  TEST_SINGLE(fmls(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"fmls v30.4s, v29.4s, v15.s[0]\");\n  TEST_SINGLE(fmls(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 3), \"fmls v30.4s, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(fmls(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"fmls v30.2s, v29.2s, v15.s[0]\");\n  TEST_SINGLE(fmls(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 3), \"fmls v30.2s, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(fmls(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"fmls v30.2d, v29.2d, v15.d[0]\");\n  TEST_SINGLE(fmls(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q15, 1), \"fmls v30.2d, v29.2d, v15.d[1]\");\n\n  // TEST_SINGLE(fmls(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"fmls v30.1d, v29.1d, v15.d[0]\");\n  // TEST_SINGLE(fmls(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d15, 1), \"fmls v30.1d, v29.1d, v15.d[1]\");\n\n  TEST_SINGLE(fmul(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"fmul v30.4s, v29.4s, v15.s[0]\");\n  TEST_SINGLE(fmul(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 3), \"fmul v30.4s, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(fmul(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"fmul v30.2s, v29.2s, v15.s[0]\");\n  TEST_SINGLE(fmul(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 3), \"fmul v30.2s, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(fmul(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"fmul v30.2d, v29.2d, v15.d[0]\");\n  TEST_SINGLE(fmul(SubRegSize::i64Bit, QReg::q30, QReg::q29, QReg::q15, 1), \"fmul v30.2d, v29.2d, v15.d[1]\");\n\n  // TEST_SINGLE(fmul(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"fmul v30.1d, v29.1d, v15.d[0]\");\n  // TEST_SINGLE(fmul(SubRegSize::i64Bit, DReg::d30, DReg::d29, DReg::d15, 1), \"fmul v30.1d, v29.1d, v15.d[1]\");\n\n  TEST_SINGLE(fmlal(QReg::q30, QReg::q29, QReg::q15, 0), \"fmlal v30.4s, v29.4h, v15.h[0]\");\n  TEST_SINGLE(fmlal(QReg::q30, QReg::q29, QReg::q15, 7), \"fmlal v30.4s, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(fmlal(DReg::d30, DReg::d29, DReg::d15, 0), \"fmlal v30.2s, v29.2h, v15.h[0]\");\n  TEST_SINGLE(fmlal(DReg::d30, DReg::d29, DReg::d15, 7), \"fmlal v30.2s, v29.2h, v15.h[7]\");\n\n  TEST_SINGLE(fmlal2(QReg::q30, QReg::q29, QReg::q15, 0), \"fmlal2 v30.4s, v29.4h, v15.h[0]\");\n  TEST_SINGLE(fmlal2(QReg::q30, QReg::q29, QReg::q15, 7), \"fmlal2 v30.4s, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(fmlal2(DReg::d30, DReg::d29, DReg::d15, 0), \"fmlal2 v30.2s, v29.2h, v15.h[0]\");\n  TEST_SINGLE(fmlal2(DReg::d30, DReg::d29, DReg::d15, 7), \"fmlal2 v30.2s, v29.2h, v15.h[7]\");\n\n  TEST_SINGLE(fmlsl(QReg::q30, QReg::q29, QReg::q15, 0), \"fmlsl v30.4s, v29.4h, v15.h[0]\");\n  TEST_SINGLE(fmlsl(QReg::q30, QReg::q29, QReg::q15, 7), \"fmlsl v30.4s, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(fmlsl(DReg::d30, DReg::d29, DReg::d15, 0), \"fmlsl v30.2s, v29.2h, v15.h[0]\");\n  TEST_SINGLE(fmlsl(DReg::d30, DReg::d29, DReg::d15, 7), \"fmlsl v30.2s, v29.2h, v15.h[7]\");\n\n  TEST_SINGLE(fmlsl2(QReg::q30, QReg::q29, QReg::q15, 0), \"fmlsl2 v30.4s, v29.4h, v15.h[0]\");\n  TEST_SINGLE(fmlsl2(QReg::q30, QReg::q29, QReg::q15, 7), \"fmlsl2 v30.4s, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(fmlsl2(DReg::d30, DReg::d29, DReg::d15, 0), \"fmlsl2 v30.2s, v29.2h, v15.h[0]\");\n  TEST_SINGLE(fmlsl2(DReg::d30, DReg::d29, DReg::d15, 7), \"fmlsl2 v30.2s, v29.2h, v15.h[7]\");\n\n  TEST_SINGLE(usdot(QReg::q30, QReg::q29, QReg::q28, 0), \"usdot v30.4s, v29.16b, v28.4b[0]\");\n  TEST_SINGLE(usdot(QReg::q30, QReg::q29, QReg::q28, 3), \"usdot v30.4s, v29.16b, v28.4b[3]\");\n\n  TEST_SINGLE(usdot(QReg::q30, QReg::q29, QReg::q15, 0), \"usdot v30.4s, v29.16b, v15.4b[0]\");\n  TEST_SINGLE(usdot(QReg::q30, QReg::q29, QReg::q15, 3), \"usdot v30.4s, v29.16b, v15.4b[3]\");\n\n  TEST_SINGLE(usdot(DReg::d30, DReg::d29, DReg::d28, 0), \"usdot v30.2s, v29.8b, v28.4b[0]\");\n  TEST_SINGLE(usdot(DReg::d30, DReg::d29, DReg::d28, 3), \"usdot v30.2s, v29.8b, v28.4b[3]\");\n\n  TEST_SINGLE(usdot(DReg::d30, DReg::d29, DReg::d15, 0), \"usdot v30.2s, v29.8b, v15.4b[0]\");\n  TEST_SINGLE(usdot(DReg::d30, DReg::d29, DReg::d15, 3), \"usdot v30.2s, v29.8b, v15.4b[3]\");\n\n  // Unimplemented in vixl disassembler\n  // TEST_SINGLE(bfmlalb(VReg::v30, VReg::v29, VReg::v15, 0), \"bfmlalb v30.4s, v29.8h, v15.h[0]\");\n  // TEST_SINGLE(bfmlalb(VReg::v30, VReg::v29, VReg::v15, 7), \"bfmlalb v30.4s, v29.8h, v15.h[7]\");\n\n  // TEST_SINGLE(bfmlalt(VReg::v30, VReg::v29, VReg::v15, 0), \"bfmlalt v30.4s, v29.8h, v15.h[0]\");\n  // TEST_SINGLE(bfmlalt(VReg::v30, VReg::v29, VReg::v15, 7), \"bfmlalt v30.4s, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(mla(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"mla v30.8h, v29.8h, v15.h[0]\");\n  TEST_SINGLE(mla(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 7), \"mla v30.8h, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(mla(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, 0), \"mla v30.4s, v29.4s, v28.s[0]\");\n  TEST_SINGLE(mla(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, 3), \"mla v30.4s, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(mla(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"mla v30.4s, v29.4s, v15.s[0]\");\n  TEST_SINGLE(mla(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 3), \"mla v30.4s, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(mla(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"mla v30.4h, v29.4h, v15.h[0]\");\n  TEST_SINGLE(mla(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 7), \"mla v30.4h, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(mla(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, 0), \"mla v30.2s, v29.2s, v28.s[0]\");\n  TEST_SINGLE(mla(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, 3), \"mla v30.2s, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(mla(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"mla v30.2s, v29.2s, v15.s[0]\");\n  TEST_SINGLE(mla(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 3), \"mla v30.2s, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(umlal(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"umlal v30.4s, v29.4h, v15.h[0]\");\n  TEST_SINGLE(umlal(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"umlal v30.4s, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(umlal(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"umlal v30.2d, v29.2s, v28.s[0]\");\n  TEST_SINGLE(umlal(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"umlal v30.2d, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(umlal(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"umlal v30.2d, v29.2s, v15.s[0]\");\n  TEST_SINGLE(umlal(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"umlal v30.2d, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(umlal2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"umlal2 v30.4s, v29.8h, v15.h[0]\");\n  TEST_SINGLE(umlal2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"umlal2 v30.4s, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(umlal2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"umlal2 v30.2d, v29.4s, v28.s[0]\");\n  TEST_SINGLE(umlal2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"umlal2 v30.2d, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(umlal2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"umlal2 v30.2d, v29.4s, v15.s[0]\");\n  TEST_SINGLE(umlal2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"umlal2 v30.2d, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(mls(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"mls v30.8h, v29.8h, v15.h[0]\");\n  TEST_SINGLE(mls(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 7), \"mls v30.8h, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(mls(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, 0), \"mls v30.4s, v29.4s, v28.s[0]\");\n  TEST_SINGLE(mls(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, 3), \"mls v30.4s, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(mls(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"mls v30.4s, v29.4s, v15.s[0]\");\n  TEST_SINGLE(mls(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 3), \"mls v30.4s, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(mls(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"mls v30.4h, v29.4h, v15.h[0]\");\n  TEST_SINGLE(mls(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 7), \"mls v30.4h, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(mls(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, 0), \"mls v30.2s, v29.2s, v28.s[0]\");\n  TEST_SINGLE(mls(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, 3), \"mls v30.2s, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(mls(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"mls v30.2s, v29.2s, v15.s[0]\");\n  TEST_SINGLE(mls(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 3), \"mls v30.2s, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(umlsl(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"umlsl v30.4s, v29.4h, v15.h[0]\");\n  TEST_SINGLE(umlsl(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"umlsl v30.4s, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(umlsl(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"umlsl v30.2d, v29.2s, v28.s[0]\");\n  TEST_SINGLE(umlsl(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"umlsl v30.2d, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(umlsl(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"umlsl v30.2d, v29.2s, v15.s[0]\");\n  TEST_SINGLE(umlsl(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"umlsl v30.2d, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(umlsl2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"umlsl2 v30.4s, v29.8h, v15.h[0]\");\n  TEST_SINGLE(umlsl2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"umlsl2 v30.4s, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(umlsl2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"umlsl2 v30.2d, v29.4s, v28.s[0]\");\n  TEST_SINGLE(umlsl2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"umlsl2 v30.2d, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(umlsl2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"umlsl2 v30.2d, v29.4s, v15.s[0]\");\n  TEST_SINGLE(umlsl2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"umlsl2 v30.2d, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(umull(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"umull v30.4s, v29.4h, v15.h[0]\");\n  TEST_SINGLE(umull(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"umull v30.4s, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(umull(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"umull v30.2d, v29.2s, v28.s[0]\");\n  TEST_SINGLE(umull(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"umull v30.2d, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(umull(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"umull v30.2d, v29.2s, v15.s[0]\");\n  TEST_SINGLE(umull(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"umull v30.2d, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(umull2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"umull2 v30.4s, v29.8h, v15.h[0]\");\n  TEST_SINGLE(umull2(SubRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"umull2 v30.4s, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(umull2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"umull2 v30.2d, v29.4s, v28.s[0]\");\n  TEST_SINGLE(umull2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"umull2 v30.2d, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(umull2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 0), \"umull2 v30.2d, v29.4s, v15.s[0]\");\n  TEST_SINGLE(umull2(SubRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v15, 3), \"umull2 v30.2d, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(sqrdmlah(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"sqrdmlah v30.8h, v29.8h, v15.h[0]\");\n  TEST_SINGLE(sqrdmlah(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 7), \"sqrdmlah v30.8h, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(sqrdmlah(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, 0), \"sqrdmlah v30.4s, v29.4s, v28.s[0]\");\n  TEST_SINGLE(sqrdmlah(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, 3), \"sqrdmlah v30.4s, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(sqrdmlah(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"sqrdmlah v30.4s, v29.4s, v15.s[0]\");\n  TEST_SINGLE(sqrdmlah(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 3), \"sqrdmlah v30.4s, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(sqrdmlah(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"sqrdmlah v30.4h, v29.4h, v15.h[0]\");\n  TEST_SINGLE(sqrdmlah(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 7), \"sqrdmlah v30.4h, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(sqrdmlah(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, 0), \"sqrdmlah v30.2s, v29.2s, v28.s[0]\");\n  TEST_SINGLE(sqrdmlah(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, 3), \"sqrdmlah v30.2s, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(sqrdmlah(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"sqrdmlah v30.2s, v29.2s, v15.s[0]\");\n  TEST_SINGLE(sqrdmlah(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 3), \"sqrdmlah v30.2s, v29.2s, v15.s[3]\");\n\n  TEST_SINGLE(udot(QReg::q30, QReg::q29, QReg::q28, 0), \"udot v30.4s, v29.16b, v28.4b[0]\");\n  TEST_SINGLE(udot(QReg::q30, QReg::q29, QReg::q28, 3), \"udot v30.4s, v29.16b, v28.4b[3]\");\n\n  TEST_SINGLE(udot(QReg::q30, QReg::q29, QReg::q15, 0), \"udot v30.4s, v29.16b, v15.4b[0]\");\n  TEST_SINGLE(udot(QReg::q30, QReg::q29, QReg::q15, 3), \"udot v30.4s, v29.16b, v15.4b[3]\");\n\n  TEST_SINGLE(udot(DReg::d30, DReg::d29, DReg::d28, 0), \"udot v30.2s, v29.8b, v28.4b[0]\");\n  TEST_SINGLE(udot(DReg::d30, DReg::d29, DReg::d28, 3), \"udot v30.2s, v29.8b, v28.4b[3]\");\n\n  TEST_SINGLE(udot(DReg::d30, DReg::d29, DReg::d15, 0), \"udot v30.2s, v29.8b, v15.4b[0]\");\n  TEST_SINGLE(udot(DReg::d30, DReg::d29, DReg::d15, 3), \"udot v30.2s, v29.8b, v15.4b[3]\");\n\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"sqrdmlsh v30.8h, v29.8h, v15.h[0]\");\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i16Bit, QReg::q30, QReg::q29, QReg::q15, 7), \"sqrdmlsh v30.8h, v29.8h, v15.h[7]\");\n\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, 0), \"sqrdmlsh v30.4s, v29.4s, v28.s[0]\");\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q28, 3), \"sqrdmlsh v30.4s, v29.4s, v28.s[3]\");\n\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 0), \"sqrdmlsh v30.4s, v29.4s, v15.s[0]\");\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i32Bit, QReg::q30, QReg::q29, QReg::q15, 3), \"sqrdmlsh v30.4s, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"sqrdmlsh v30.4h, v29.4h, v15.h[0]\");\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i16Bit, DReg::d30, DReg::d29, DReg::d15, 7), \"sqrdmlsh v30.4h, v29.4h, v15.h[7]\");\n\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, 0), \"sqrdmlsh v30.2s, v29.2s, v28.s[0]\");\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d28, 3), \"sqrdmlsh v30.2s, v29.2s, v28.s[3]\");\n\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 0), \"sqrdmlsh v30.2s, v29.2s, v15.s[0]\");\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i32Bit, DReg::d30, DReg::d29, DReg::d15, 3), \"sqrdmlsh v30.2s, v29.2s, v15.s[3]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Cryptographic three-register, imm2\") {\n  TEST_SINGLE(sm3tt1a(VReg::v30, VReg::v29, VReg::v15, 0), \"sm3tt1a v30.4s, v29.4s, v15.s[0]\");\n  TEST_SINGLE(sm3tt1a(VReg::v30, VReg::v29, VReg::v15, 1), \"sm3tt1a v30.4s, v29.4s, v15.s[1]\");\n  TEST_SINGLE(sm3tt1a(VReg::v30, VReg::v29, VReg::v15, 2), \"sm3tt1a v30.4s, v29.4s, v15.s[2]\");\n  TEST_SINGLE(sm3tt1a(VReg::v30, VReg::v29, VReg::v15, 3), \"sm3tt1a v30.4s, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(sm3tt1b(VReg::v30, VReg::v29, VReg::v15, 0), \"sm3tt1b v30.4s, v29.4s, v15.s[0]\");\n  TEST_SINGLE(sm3tt1b(VReg::v30, VReg::v29, VReg::v15, 1), \"sm3tt1b v30.4s, v29.4s, v15.s[1]\");\n  TEST_SINGLE(sm3tt1b(VReg::v30, VReg::v29, VReg::v15, 2), \"sm3tt1b v30.4s, v29.4s, v15.s[2]\");\n  TEST_SINGLE(sm3tt1b(VReg::v30, VReg::v29, VReg::v15, 3), \"sm3tt1b v30.4s, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(sm3tt2a(VReg::v30, VReg::v29, VReg::v15, 0), \"sm3tt2a v30.4s, v29.4s, v15.s[0]\");\n  TEST_SINGLE(sm3tt2a(VReg::v30, VReg::v29, VReg::v15, 1), \"sm3tt2a v30.4s, v29.4s, v15.s[1]\");\n  TEST_SINGLE(sm3tt2a(VReg::v30, VReg::v29, VReg::v15, 2), \"sm3tt2a v30.4s, v29.4s, v15.s[2]\");\n  TEST_SINGLE(sm3tt2a(VReg::v30, VReg::v29, VReg::v15, 3), \"sm3tt2a v30.4s, v29.4s, v15.s[3]\");\n\n  TEST_SINGLE(sm3tt2b(VReg::v30, VReg::v29, VReg::v15, 0), \"sm3tt2b v30.4s, v29.4s, v15.s[0]\");\n  TEST_SINGLE(sm3tt2b(VReg::v30, VReg::v29, VReg::v15, 1), \"sm3tt2b v30.4s, v29.4s, v15.s[1]\");\n  TEST_SINGLE(sm3tt2b(VReg::v30, VReg::v29, VReg::v15, 2), \"sm3tt2b v30.4s, v29.4s, v15.s[2]\");\n  TEST_SINGLE(sm3tt2b(VReg::v30, VReg::v29, VReg::v15, 3), \"sm3tt2b v30.4s, v29.4s, v15.s[3]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Cryptographic three-register SHA 512\") {\n  TEST_SINGLE(sha512h(VReg::v30, VReg::v29, VReg::v15), \"sha512h q30, q29, v15.2d\");\n  TEST_SINGLE(sha512h2(VReg::v30, VReg::v29, VReg::v15), \"sha512h2 q30, q29, v15.2d\");\n  TEST_SINGLE(sha512su1(VReg::v30, VReg::v29, VReg::v15), \"sha512su1 v30.2d, v29.2d, v15.2d\");\n  TEST_SINGLE(rax1(VReg::v30, VReg::v29, VReg::v15), \"rax1 v30.2d, v29.2d, v15.2d\");\n  TEST_SINGLE(sm3partw1(VReg::v30, VReg::v29, VReg::v15), \"sm3partw1 v30.4s, v29.4s, v15.4s\");\n  TEST_SINGLE(sm3partw2(VReg::v30, VReg::v29, VReg::v15), \"sm3partw2 v30.4s, v29.4s, v15.4s\");\n  TEST_SINGLE(sm4ekey(VReg::v30, VReg::v29, VReg::v15), \"sm4ekey v30.4s, v29.4s, v15.4s\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Cryptographic four-register\") {\n  TEST_SINGLE(eor3(VReg::v30, VReg::v29, VReg::v15, VReg::v7), \"eor3 v30.16b, v29.16b, v15.16b, v7.16b\");\n  TEST_SINGLE(bcax(VReg::v30, VReg::v29, VReg::v15, VReg::v7), \"bcax v30.16b, v29.16b, v15.16b, v7.16b\");\n  TEST_SINGLE(sm3ss1(VReg::v30, VReg::v29, VReg::v15, VReg::v7), \"sm3ss1 v30.4s, v29.4s, v15.4s, v7.4s\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Cryptographic two-register SHA 512\") {\n  TEST_SINGLE(sha512su0(VReg::v30, VReg::v29), \"sha512su0 v30.2d, v29.2d\");\n  TEST_SINGLE(sm4e(VReg::v30, VReg::v29), \"sm4e v30.4s, v29.4s\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Conversion between floating-point and fixed-point\") {\n  TEST_SINGLE(scvtf(ScalarRegSize::i16Bit, VReg::v29, Size::i32Bit, Reg::r30, 1), \"scvtf h29, w30, #1\");\n  TEST_SINGLE(scvtf(ScalarRegSize::i16Bit, VReg::v29, Size::i32Bit, Reg::r30, 32), \"scvtf h29, w30, #32\");\n  TEST_SINGLE(scvtf(ScalarRegSize::i32Bit, VReg::v29, Size::i32Bit, Reg::r30, 1), \"scvtf s29, w30, #1\");\n  TEST_SINGLE(scvtf(ScalarRegSize::i32Bit, VReg::v29, Size::i32Bit, Reg::r30, 32), \"scvtf s29, w30, #32\");\n  TEST_SINGLE(scvtf(ScalarRegSize::i64Bit, VReg::v29, Size::i32Bit, Reg::r30, 1), \"scvtf d29, w30, #1\");\n  TEST_SINGLE(scvtf(ScalarRegSize::i64Bit, VReg::v29, Size::i32Bit, Reg::r30, 32), \"scvtf d29, w30, #32\");\n\n  TEST_SINGLE(scvtf(ScalarRegSize::i16Bit, VReg::v29, Size::i64Bit, Reg::r30, 1), \"scvtf h29, x30, #1\");\n  TEST_SINGLE(scvtf(ScalarRegSize::i16Bit, VReg::v29, Size::i64Bit, Reg::r30, 64), \"scvtf h29, x30, #64\");\n  TEST_SINGLE(scvtf(ScalarRegSize::i32Bit, VReg::v29, Size::i64Bit, Reg::r30, 1), \"scvtf s29, x30, #1\");\n  TEST_SINGLE(scvtf(ScalarRegSize::i32Bit, VReg::v29, Size::i64Bit, Reg::r30, 64), \"scvtf s29, x30, #64\");\n  TEST_SINGLE(scvtf(ScalarRegSize::i64Bit, VReg::v29, Size::i64Bit, Reg::r30, 1), \"scvtf d29, x30, #1\");\n  TEST_SINGLE(scvtf(ScalarRegSize::i64Bit, VReg::v29, Size::i64Bit, Reg::r30, 64), \"scvtf d29, x30, #64\");\n\n  TEST_SINGLE(ucvtf(ScalarRegSize::i16Bit, VReg::v29, Size::i32Bit, Reg::r30, 1), \"ucvtf h29, w30, #1\");\n  TEST_SINGLE(ucvtf(ScalarRegSize::i16Bit, VReg::v29, Size::i32Bit, Reg::r30, 32), \"ucvtf h29, w30, #32\");\n  TEST_SINGLE(ucvtf(ScalarRegSize::i32Bit, VReg::v29, Size::i32Bit, Reg::r30, 1), \"ucvtf s29, w30, #1\");\n  TEST_SINGLE(ucvtf(ScalarRegSize::i32Bit, VReg::v29, Size::i32Bit, Reg::r30, 32), \"ucvtf s29, w30, #32\");\n  TEST_SINGLE(ucvtf(ScalarRegSize::i64Bit, VReg::v29, Size::i32Bit, Reg::r30, 1), \"ucvtf d29, w30, #1\");\n  TEST_SINGLE(ucvtf(ScalarRegSize::i64Bit, VReg::v29, Size::i32Bit, Reg::r30, 32), \"ucvtf d29, w30, #32\");\n\n  TEST_SINGLE(ucvtf(ScalarRegSize::i16Bit, VReg::v29, Size::i64Bit, Reg::r30, 1), \"ucvtf h29, x30, #1\");\n  TEST_SINGLE(ucvtf(ScalarRegSize::i16Bit, VReg::v29, Size::i64Bit, Reg::r30, 64), \"ucvtf h29, x30, #64\");\n  TEST_SINGLE(ucvtf(ScalarRegSize::i32Bit, VReg::v29, Size::i64Bit, Reg::r30, 1), \"ucvtf s29, x30, #1\");\n  TEST_SINGLE(ucvtf(ScalarRegSize::i32Bit, VReg::v29, Size::i64Bit, Reg::r30, 64), \"ucvtf s29, x30, #64\");\n  TEST_SINGLE(ucvtf(ScalarRegSize::i64Bit, VReg::v29, Size::i64Bit, Reg::r30, 1), \"ucvtf d29, x30, #1\");\n  TEST_SINGLE(ucvtf(ScalarRegSize::i64Bit, VReg::v29, Size::i64Bit, Reg::r30, 64), \"ucvtf d29, x30, #64\");\n\n  TEST_SINGLE(fcvtzs(Size::i32Bit, Reg::r30, ScalarRegSize::i16Bit, VReg::v29, 1), \"fcvtzs w30, h29, #1\");\n  TEST_SINGLE(fcvtzs(Size::i32Bit, Reg::r30, ScalarRegSize::i16Bit, VReg::v29, 32), \"fcvtzs w30, h29, #32\");\n  TEST_SINGLE(fcvtzs(Size::i32Bit, Reg::r30, ScalarRegSize::i32Bit, VReg::v29, 1), \"fcvtzs w30, s29, #1\");\n  TEST_SINGLE(fcvtzs(Size::i32Bit, Reg::r30, ScalarRegSize::i32Bit, VReg::v29, 32), \"fcvtzs w30, s29, #32\");\n  TEST_SINGLE(fcvtzs(Size::i32Bit, Reg::r30, ScalarRegSize::i64Bit, VReg::v29, 1), \"fcvtzs w30, d29, #1\");\n  TEST_SINGLE(fcvtzs(Size::i32Bit, Reg::r30, ScalarRegSize::i64Bit, VReg::v29, 32), \"fcvtzs w30, d29, #32\");\n\n  TEST_SINGLE(fcvtzs(Size::i64Bit, Reg::r30, ScalarRegSize::i16Bit, VReg::v29, 1), \"fcvtzs x30, h29, #1\");\n  TEST_SINGLE(fcvtzs(Size::i64Bit, Reg::r30, ScalarRegSize::i16Bit, VReg::v29, 64), \"fcvtzs x30, h29, #64\");\n  TEST_SINGLE(fcvtzs(Size::i64Bit, Reg::r30, ScalarRegSize::i32Bit, VReg::v29, 1), \"fcvtzs x30, s29, #1\");\n  TEST_SINGLE(fcvtzs(Size::i64Bit, Reg::r30, ScalarRegSize::i32Bit, VReg::v29, 64), \"fcvtzs x30, s29, #64\");\n  TEST_SINGLE(fcvtzs(Size::i64Bit, Reg::r30, ScalarRegSize::i64Bit, VReg::v29, 1), \"fcvtzs x30, d29, #1\");\n  TEST_SINGLE(fcvtzs(Size::i64Bit, Reg::r30, ScalarRegSize::i64Bit, VReg::v29, 64), \"fcvtzs x30, d29, #64\");\n\n  TEST_SINGLE(fcvtzu(Size::i32Bit, Reg::r30, ScalarRegSize::i16Bit, VReg::v29, 1), \"fcvtzu w30, h29, #1\");\n  TEST_SINGLE(fcvtzu(Size::i32Bit, Reg::r30, ScalarRegSize::i16Bit, VReg::v29, 32), \"fcvtzu w30, h29, #32\");\n  TEST_SINGLE(fcvtzu(Size::i32Bit, Reg::r30, ScalarRegSize::i32Bit, VReg::v29, 1), \"fcvtzu w30, s29, #1\");\n  TEST_SINGLE(fcvtzu(Size::i32Bit, Reg::r30, ScalarRegSize::i32Bit, VReg::v29, 32), \"fcvtzu w30, s29, #32\");\n  TEST_SINGLE(fcvtzu(Size::i32Bit, Reg::r30, ScalarRegSize::i64Bit, VReg::v29, 1), \"fcvtzu w30, d29, #1\");\n  TEST_SINGLE(fcvtzu(Size::i32Bit, Reg::r30, ScalarRegSize::i64Bit, VReg::v29, 32), \"fcvtzu w30, d29, #32\");\n\n  TEST_SINGLE(fcvtzu(Size::i64Bit, Reg::r30, ScalarRegSize::i16Bit, VReg::v29, 1), \"fcvtzu x30, h29, #1\");\n  TEST_SINGLE(fcvtzu(Size::i64Bit, Reg::r30, ScalarRegSize::i16Bit, VReg::v29, 64), \"fcvtzu x30, h29, #64\");\n  TEST_SINGLE(fcvtzu(Size::i64Bit, Reg::r30, ScalarRegSize::i32Bit, VReg::v29, 1), \"fcvtzu x30, s29, #1\");\n  TEST_SINGLE(fcvtzu(Size::i64Bit, Reg::r30, ScalarRegSize::i32Bit, VReg::v29, 64), \"fcvtzu x30, s29, #64\");\n  TEST_SINGLE(fcvtzu(Size::i64Bit, Reg::r30, ScalarRegSize::i64Bit, VReg::v29, 1), \"fcvtzu x30, d29, #1\");\n  TEST_SINGLE(fcvtzu(Size::i64Bit, Reg::r30, ScalarRegSize::i64Bit, VReg::v29, 64), \"fcvtzu x30, d29, #64\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: ASIMD: Conversion between floating-point and integer\") {\n  TEST_SINGLE(fcvtns(Size::i32Bit, Reg::r29, HReg::h30), \"fcvtns w29, h30\");\n  TEST_SINGLE(fcvtns(Size::i64Bit, Reg::r29, HReg::h30), \"fcvtns x29, h30\");\n  TEST_SINGLE(fcvtns(Size::i32Bit, Reg::r29, SReg::s30), \"fcvtns w29, s30\");\n  TEST_SINGLE(fcvtns(Size::i64Bit, Reg::r29, SReg::s30), \"fcvtns x29, s30\");\n  TEST_SINGLE(fcvtns(Size::i32Bit, Reg::r29, DReg::d30), \"fcvtns w29, d30\");\n  TEST_SINGLE(fcvtns(Size::i64Bit, Reg::r29, DReg::d30), \"fcvtns x29, d30\");\n\n  TEST_SINGLE(fcvtnu(Size::i32Bit, Reg::r29, HReg::h30), \"fcvtnu w29, h30\");\n  TEST_SINGLE(fcvtnu(Size::i64Bit, Reg::r29, HReg::h30), \"fcvtnu x29, h30\");\n  TEST_SINGLE(fcvtnu(Size::i32Bit, Reg::r29, SReg::s30), \"fcvtnu w29, s30\");\n  TEST_SINGLE(fcvtnu(Size::i64Bit, Reg::r29, SReg::s30), \"fcvtnu x29, s30\");\n  TEST_SINGLE(fcvtnu(Size::i32Bit, Reg::r29, DReg::d30), \"fcvtnu w29, d30\");\n  TEST_SINGLE(fcvtnu(Size::i64Bit, Reg::r29, DReg::d30), \"fcvtnu x29, d30\");\n\n  TEST_SINGLE(scvtf(Size::i32Bit, HReg::h30, Reg::r29), \"scvtf h30, w29\");\n  TEST_SINGLE(scvtf(Size::i64Bit, HReg::h30, Reg::r29), \"scvtf h30, x29\");\n  TEST_SINGLE(scvtf(Size::i32Bit, SReg::s30, Reg::r29), \"scvtf s30, w29\");\n  TEST_SINGLE(scvtf(Size::i64Bit, SReg::s30, Reg::r29), \"scvtf s30, x29\");\n  TEST_SINGLE(scvtf(Size::i32Bit, DReg::d30, Reg::r29), \"scvtf d30, w29\");\n  TEST_SINGLE(scvtf(Size::i64Bit, DReg::d30, Reg::r29), \"scvtf d30, x29\");\n\n  TEST_SINGLE(ucvtf(Size::i32Bit, HReg::h30, Reg::r29), \"ucvtf h30, w29\");\n  TEST_SINGLE(ucvtf(Size::i64Bit, HReg::h30, Reg::r29), \"ucvtf h30, x29\");\n  TEST_SINGLE(ucvtf(Size::i32Bit, SReg::s30, Reg::r29), \"ucvtf s30, w29\");\n  TEST_SINGLE(ucvtf(Size::i64Bit, SReg::s30, Reg::r29), \"ucvtf s30, x29\");\n  TEST_SINGLE(ucvtf(Size::i32Bit, DReg::d30, Reg::r29), \"ucvtf d30, w29\");\n  TEST_SINGLE(ucvtf(Size::i64Bit, DReg::d30, Reg::r29), \"ucvtf d30, x29\");\n\n  TEST_SINGLE(fcvtas(Size::i32Bit, Reg::r29, HReg::h30), \"fcvtas w29, h30\");\n  TEST_SINGLE(fcvtas(Size::i64Bit, Reg::r29, HReg::h30), \"fcvtas x29, h30\");\n  TEST_SINGLE(fcvtas(Size::i32Bit, Reg::r29, SReg::s30), \"fcvtas w29, s30\");\n  TEST_SINGLE(fcvtas(Size::i64Bit, Reg::r29, SReg::s30), \"fcvtas x29, s30\");\n  TEST_SINGLE(fcvtas(Size::i32Bit, Reg::r29, DReg::d30), \"fcvtas w29, d30\");\n  TEST_SINGLE(fcvtas(Size::i64Bit, Reg::r29, DReg::d30), \"fcvtas x29, d30\");\n\n  TEST_SINGLE(fcvtau(Size::i32Bit, Reg::r29, HReg::h30), \"fcvtau w29, h30\");\n  TEST_SINGLE(fcvtau(Size::i64Bit, Reg::r29, HReg::h30), \"fcvtau x29, h30\");\n  TEST_SINGLE(fcvtau(Size::i32Bit, Reg::r29, SReg::s30), \"fcvtau w29, s30\");\n  TEST_SINGLE(fcvtau(Size::i64Bit, Reg::r29, SReg::s30), \"fcvtau x29, s30\");\n  TEST_SINGLE(fcvtau(Size::i32Bit, Reg::r29, DReg::d30), \"fcvtau w29, d30\");\n  TEST_SINGLE(fcvtau(Size::i64Bit, Reg::r29, DReg::d30), \"fcvtau x29, d30\");\n\n  TEST_SINGLE(fmov(Size::i32Bit, Reg::r29, HReg::h30), \"fmov w29, h30\");\n  TEST_SINGLE(fmov(Size::i64Bit, Reg::r29, HReg::h30), \"fmov x29, h30\");\n  TEST_SINGLE(fmov(Size::i32Bit, Reg::r29, SReg::s30), \"fmov w29, s30\");\n  // TEST_SINGLE(fmov(Size::i64Bit, Reg::r29, SReg::s30), \"fmov x29, s30\");\n  // TEST_SINGLE(fmov(Size::i32Bit, Reg::r29, DReg::d30), \"fmov w29, d30\");\n  TEST_SINGLE(fmov(Size::i64Bit, Reg::r29, DReg::d30), \"fmov x29, d30\");\n\n  // TEST_SINGLE(fmov(Size::i32Bit, Reg::r29, VReg::v30, false), \"fmov w29, s30\");\n  TEST_SINGLE(fmov(Size::i64Bit, Reg::r29, VReg::v30, false), \"fmov x29, d30\");\n\n  // TEST_SINGLE(fmov(Size::i32Bit, Reg::r29, VReg::v30, true), \"fmov w29, s30\");\n  TEST_SINGLE(fmov(Size::i64Bit, Reg::r29, VReg::v30, true), \"fmov x29, v30.D[1]\");\n\n  TEST_SINGLE(fmov(Size::i32Bit, HReg::h30, Reg::r29), \"fmov h30, w29\");\n  TEST_SINGLE(fmov(Size::i64Bit, HReg::h30, Reg::r29), \"fmov h30, x29\");\n  TEST_SINGLE(fmov(Size::i32Bit, SReg::s30, Reg::r29), \"fmov s30, w29\");\n  // TEST_SINGLE(fmov(Size::i64Bit, SReg::s30, Reg::r29), \"fmov s30, x29\");\n  // TEST_SINGLE(fmov(Size::i32Bit, DReg::d30, Reg::r29), \"fmov d30, w29\");\n  TEST_SINGLE(fmov(Size::i64Bit, DReg::d30, Reg::r29), \"fmov d30, x29\");\n\n  // TEST_SINGLE(fmov(Size::i32Bit, VReg::v30, Reg::r29, false), \"fmov s30, w29\");\n  TEST_SINGLE(fmov(Size::i64Bit, VReg::v30, Reg::r29, false), \"fmov d30, x29\");\n\n  // TEST_SINGLE(fmov(Size::i32Bit, VReg::v30, Reg::r29, true), \"fmov d30, x29\");\n  TEST_SINGLE(fmov(Size::i64Bit, VReg::v30, Reg::r29, true), \"fmov v30.D[1], x29\");\n\n  TEST_SINGLE(fcvtps(Size::i32Bit, Reg::r29, HReg::h30), \"fcvtps w29, h30\");\n  TEST_SINGLE(fcvtps(Size::i64Bit, Reg::r29, HReg::h30), \"fcvtps x29, h30\");\n  TEST_SINGLE(fcvtps(Size::i32Bit, Reg::r29, SReg::s30), \"fcvtps w29, s30\");\n  TEST_SINGLE(fcvtps(Size::i64Bit, Reg::r29, SReg::s30), \"fcvtps x29, s30\");\n  TEST_SINGLE(fcvtps(Size::i32Bit, Reg::r29, DReg::d30), \"fcvtps w29, d30\");\n  TEST_SINGLE(fcvtps(Size::i64Bit, Reg::r29, DReg::d30), \"fcvtps x29, d30\");\n\n  TEST_SINGLE(fcvtpu(Size::i32Bit, Reg::r29, HReg::h30), \"fcvtpu w29, h30\");\n  TEST_SINGLE(fcvtpu(Size::i64Bit, Reg::r29, HReg::h30), \"fcvtpu x29, h30\");\n  TEST_SINGLE(fcvtpu(Size::i32Bit, Reg::r29, SReg::s30), \"fcvtpu w29, s30\");\n  TEST_SINGLE(fcvtpu(Size::i64Bit, Reg::r29, SReg::s30), \"fcvtpu x29, s30\");\n  TEST_SINGLE(fcvtpu(Size::i32Bit, Reg::r29, DReg::d30), \"fcvtpu w29, d30\");\n  TEST_SINGLE(fcvtpu(Size::i64Bit, Reg::r29, DReg::d30), \"fcvtpu x29, d30\");\n\n  TEST_SINGLE(fcvtms(Size::i32Bit, Reg::r29, HReg::h30), \"fcvtms w29, h30\");\n  TEST_SINGLE(fcvtms(Size::i64Bit, Reg::r29, HReg::h30), \"fcvtms x29, h30\");\n  TEST_SINGLE(fcvtms(Size::i32Bit, Reg::r29, SReg::s30), \"fcvtms w29, s30\");\n  TEST_SINGLE(fcvtms(Size::i64Bit, Reg::r29, SReg::s30), \"fcvtms x29, s30\");\n  TEST_SINGLE(fcvtms(Size::i32Bit, Reg::r29, DReg::d30), \"fcvtms w29, d30\");\n  TEST_SINGLE(fcvtms(Size::i64Bit, Reg::r29, DReg::d30), \"fcvtms x29, d30\");\n\n  TEST_SINGLE(fcvtmu(Size::i32Bit, Reg::r29, HReg::h30), \"fcvtmu w29, h30\");\n  TEST_SINGLE(fcvtmu(Size::i64Bit, Reg::r29, HReg::h30), \"fcvtmu x29, h30\");\n  TEST_SINGLE(fcvtmu(Size::i32Bit, Reg::r29, SReg::s30), \"fcvtmu w29, s30\");\n  TEST_SINGLE(fcvtmu(Size::i64Bit, Reg::r29, SReg::s30), \"fcvtmu x29, s30\");\n  TEST_SINGLE(fcvtmu(Size::i32Bit, Reg::r29, DReg::d30), \"fcvtmu w29, d30\");\n  TEST_SINGLE(fcvtmu(Size::i64Bit, Reg::r29, DReg::d30), \"fcvtmu x29, d30\");\n\n  TEST_SINGLE(fcvtzs(Size::i32Bit, Reg::r29, HReg::h30), \"fcvtzs w29, h30\");\n  TEST_SINGLE(fcvtzs(Size::i64Bit, Reg::r29, HReg::h30), \"fcvtzs x29, h30\");\n  TEST_SINGLE(fcvtzs(Size::i32Bit, Reg::r29, SReg::s30), \"fcvtzs w29, s30\");\n  TEST_SINGLE(fcvtzs(Size::i64Bit, Reg::r29, SReg::s30), \"fcvtzs x29, s30\");\n  TEST_SINGLE(fcvtzs(Size::i32Bit, Reg::r29, DReg::d30), \"fcvtzs w29, d30\");\n  TEST_SINGLE(fcvtzs(Size::i64Bit, Reg::r29, DReg::d30), \"fcvtzs x29, d30\");\n\n  TEST_SINGLE(fcvtzu(Size::i32Bit, Reg::r29, HReg::h30), \"fcvtzu w29, h30\");\n  TEST_SINGLE(fcvtzu(Size::i64Bit, Reg::r29, HReg::h30), \"fcvtzu x29, h30\");\n  TEST_SINGLE(fcvtzu(Size::i32Bit, Reg::r29, SReg::s30), \"fcvtzu w29, s30\");\n  TEST_SINGLE(fcvtzu(Size::i64Bit, Reg::r29, SReg::s30), \"fcvtzu x29, s30\");\n  TEST_SINGLE(fcvtzu(Size::i32Bit, Reg::r29, DReg::d30), \"fcvtzu w29, d30\");\n  TEST_SINGLE(fcvtzu(Size::i64Bit, Reg::r29, DReg::d30), \"fcvtzu x29, d30\");\n}\n"
  },
  {
    "path": "FEXCore/unittests/Emitter/Branch_Tests.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"TestDisassembler.h\"\n\n#include <catch2/catch_test_macros.hpp>\n#include <fcntl.h>\n\nusing namespace ARMEmitter;\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Branch: Conditional branch immediate\") {\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)b(Condition::CC_PL, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x54ffffe5);\n  }\n\n  {\n    ForwardLabel Label;\n    (void)b(Condition::CC_PL, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x54000025);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)b(Condition::CC_PL, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x54ffffe5);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)b(Condition::CC_PL, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x54000025);\n  }\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Branch: Branch consistent conditional\") {\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)bc(Condition::CC_PL, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x54fffff5);\n  }\n\n  {\n    ForwardLabel Label;\n    (void)bc(Condition::CC_PL, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x54000035);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)bc(Condition::CC_PL, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x54fffff5);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)bc(Condition::CC_PL, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x54000035);\n  }\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Branch: Unconditional branch register\") {\n  TEST_SINGLE(br(Reg::r29), \"br x29\");\n  TEST_SINGLE(blr(Reg::r29), \"blr x29\");\n  TEST_SINGLE(ret(), \"ret\");\n  TEST_SINGLE(ret(Reg::r29), \"ret x29\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Branch: Unconditional branch immediate\") {\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)b(&Label);\n\n    CHECK(DisassembleEncoding(1) == 0x17ffffff);\n  }\n\n  {\n    ForwardLabel Label;\n    (void)b(&Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x14000001);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)b(&Label);\n\n    CHECK(DisassembleEncoding(1) == 0x17ffffff);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)b(&Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x14000001);\n  }\n\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)bl(&Label);\n\n    CHECK(DisassembleEncoding(1) == 0x97ffffff);\n  }\n\n  {\n    ForwardLabel Label;\n    (void)bl(&Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x94000001);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)bl(&Label);\n\n    CHECK(DisassembleEncoding(1) == 0x97ffffff);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)bl(&Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x94000001);\n  }\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Branch: Compare and branch\") {\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)cbz(Size::i32Bit, Reg::r29, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x34fffffd);\n  }\n\n  {\n    ForwardLabel Label;\n    (void)cbz(Size::i32Bit, Reg::r29, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x3400003d);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)cbz(Size::i32Bit, Reg::r29, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x34fffffd);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)cbz(Size::i32Bit, Reg::r29, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x3400003d);\n  }\n\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)cbz(Size::i64Bit, Reg::r29, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0xb4fffffd);\n  }\n\n  {\n    ForwardLabel Label;\n    (void)cbz(Size::i64Bit, Reg::r29, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0xb400003d);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)cbz(Size::i64Bit, Reg::r29, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0xb4fffffd);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)cbz(Size::i64Bit, Reg::r29, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0xb400003d);\n  }\n\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)cbnz(Size::i32Bit, Reg::r29, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x35fffffd);\n  }\n\n  {\n    ForwardLabel Label;\n    (void)cbnz(Size::i32Bit, Reg::r29, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x3500003d);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)cbnz(Size::i32Bit, Reg::r29, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x35fffffd);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)cbnz(Size::i32Bit, Reg::r29, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x3500003d);\n  }\n\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)cbnz(Size::i64Bit, Reg::r29, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0xb5fffffd);\n  }\n\n  {\n    ForwardLabel Label;\n    (void)cbnz(Size::i64Bit, Reg::r29, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0xb500003d);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)cbnz(Size::i64Bit, Reg::r29, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0xb5fffffd);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)cbnz(Size::i64Bit, Reg::r29, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0xb500003d);\n  }\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Branch: Test and branch immediate\") {\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)tbz(Reg::r29, 0, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x3607fffd);\n  }\n\n  {\n    ForwardLabel Label;\n    (void)tbz(Reg::r29, 0, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x3600003d);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)tbz(Reg::r29, 0, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x3607fffd);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)tbz(Reg::r29, 0, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x3600003d);\n  }\n\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)tbz(Reg::r29, 63, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0xb6fffffd);\n  }\n\n  {\n    ForwardLabel Label;\n    (void)tbz(Reg::r29, 63, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0xb6f8003d);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)tbz(Reg::r29, 63, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0xb6fffffd);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)tbz(Reg::r29, 63, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0xb6f8003d);\n  }\n\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)tbnz(Reg::r29, 0, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x3707fffd);\n  }\n\n  {\n    ForwardLabel Label;\n    (void)tbnz(Reg::r29, 0, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x3700003d);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)tbnz(Reg::r29, 0, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x3707fffd);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)tbnz(Reg::r29, 0, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x3700003d);\n  }\n\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)tbnz(Reg::r29, 63, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0xb7fffffd);\n  }\n\n  {\n    ForwardLabel Label;\n    (void)tbnz(Reg::r29, 63, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0xb7f8003d);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    (void)tbnz(Reg::r29, 63, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0xb7fffffd);\n  }\n\n  {\n    BiDirectionalLabel Label;\n    (void)tbnz(Reg::r29, 63, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0xb7f8003d);\n  }\n}\n"
  },
  {
    "path": "FEXCore/unittests/Emitter/CMakeLists.txt",
    "content": "file(GLOB_RECURSE TESTS CONFIGURE_DEPENDS *.cpp)\n\nset(LIBS fmt::fmt vixl::vixl Catch2::Catch2WithMain FEXCore_Base JemallocLibs)\nforeach(TEST ${TESTS})\n  get_filename_component(TEST_NAME ${TEST} NAME_WLE)\n  add_executable(Emitter_${TEST_NAME} ${TEST})\n  target_link_libraries(Emitter_${TEST_NAME} PRIVATE ${LIBS})\n  target_include_directories(Emitter_${TEST_NAME} PUBLIC \"${CMAKE_CURRENT_SOURCE_DIR}/../../Source/\")\n  set_target_properties(Emitter_${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/EmitterTests\")\n  catch_discover_tests(Emitter_${TEST_NAME} TEST_SUFFIX \".${TEST_NAME}.Emitter\")\nendforeach()\n\nadd_custom_target(emitter_tests\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}/\"\n  USES_TERMINAL\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"302\" ${TEST_JOB_FLAG} \"-R\" \"\\.*.Emitter$$\")\n"
  },
  {
    "path": "FEXCore/unittests/Emitter/Loadstore_Tests.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"TestDisassembler.h\"\n\n#include <catch2/catch_test_macros.hpp>\n#include <fcntl.h>\n\nusing namespace ARMEmitter;\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Compare and swap pair\") {\n  TEST_SINGLE(casp(Size::i32Bit, Reg::r28, Reg::r29, Reg::r26, Reg::r27, Reg::r30), \"casp w28, w29, w26, w27, [x30]\");\n  TEST_SINGLE(casp(Size::i64Bit, Reg::r28, Reg::r29, Reg::r26, Reg::r27, Reg::r30), \"casp x28, x29, x26, x27, [x30]\");\n\n  TEST_SINGLE(caspa(Size::i32Bit, Reg::r28, Reg::r29, Reg::r26, Reg::r27, Reg::r30), \"caspa w28, w29, w26, w27, [x30]\");\n  TEST_SINGLE(caspa(Size::i64Bit, Reg::r28, Reg::r29, Reg::r26, Reg::r27, Reg::r30), \"caspa x28, x29, x26, x27, [x30]\");\n\n  TEST_SINGLE(caspl(Size::i32Bit, Reg::r28, Reg::r29, Reg::r26, Reg::r27, Reg::r30), \"caspl w28, w29, w26, w27, [x30]\");\n  TEST_SINGLE(caspl(Size::i64Bit, Reg::r28, Reg::r29, Reg::r26, Reg::r27, Reg::r30), \"caspl x28, x29, x26, x27, [x30]\");\n\n  TEST_SINGLE(caspal(Size::i32Bit, Reg::r28, Reg::r29, Reg::r26, Reg::r27, Reg::r30), \"caspal w28, w29, w26, w27, [x30]\");\n  TEST_SINGLE(caspal(Size::i64Bit, Reg::r28, Reg::r29, Reg::r26, Reg::r27, Reg::r30), \"caspal x28, x29, x26, x27, [x30]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Advanced SIMD load/store multiple structures\") {\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q26, Reg::r30), \"ld1 {v26.16b}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d26, Reg::r30), \"ld1 {v26.8b}, [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(QReg::q26, Reg::r30), \"ld1 {v26.8h}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(DReg::d26, Reg::r30), \"ld1 {v26.4h}, [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(QReg::q26, Reg::r30), \"ld1 {v26.4s}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(DReg::d26, Reg::r30), \"ld1 {v26.2s}, [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(QReg::q26, Reg::r30), \"ld1 {v26.2d}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(DReg::d26, Reg::r30), \"ld1 {v26.1d}, [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, Reg::r30), \"ld1 {v31.16b, v0.16b}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, Reg::r30), \"ld1 {v31.8b, v0.8b}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, Reg::r30), \"ld1 {v26.16b, v27.16b}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, Reg::r30), \"ld1 {v26.8b, v27.8b}, [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, Reg::r30), \"ld1 {v26.8h, v27.8h}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, Reg::r30), \"ld1 {v26.4h, v27.4h}, [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, Reg::r30), \"ld1 {v26.4s, v27.4s}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, Reg::r30), \"ld1 {v26.2s, v27.2s}, [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, Reg::r30), \"ld1 {v26.2d, v27.2d}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, Reg::r30), \"ld1 {v26.1d, v27.1d}, [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, Reg::r30), \"ld1 {v31.16b, v0.16b, v1.16b}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, Reg::r30), \"ld1 {v31.8b, v0.8b, v1.8b}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"ld1 {v26.16b, v27.16b, v28.16b}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"ld1 {v26.8b, v27.8b, v28.8b}, [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"ld1 {v26.8h, v27.8h, v28.8h}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"ld1 {v26.4h, v27.4h, v28.4h}, [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"ld1 {v26.4s, v27.4s, v28.4s}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"ld1 {v26.2s, v27.2s, v28.2s}, [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"ld1 {v26.2d, v27.2d, v28.2d}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"ld1 {v26.1d, v27.1d, v28.1d}, [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, QReg::q2, Reg::r30), \"ld1 {v31.16b, v0.16b, v1.16b, v2.16b}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, DReg::d2, Reg::r30), \"ld1 {v31.8b, v0.8b, v1.8b, v2.8b}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"ld1 {v26.16b, v27.16b, v28.16b, v29.16b}, \"\n                                                                                            \"[x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"ld1 {v26.8b, v27.8b, v28.8b, v29.8b}, [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"ld1 {v26.8h, v27.8h, v28.8h, v29.8h}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"ld1 {v26.4h, v27.4h, v28.4h, v29.4h}, [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"ld1 {v26.4s, v27.4s, v28.4s, v29.4s}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"ld1 {v26.2s, v27.2s, v28.2s, v29.2s}, [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"ld1 {v26.2d, v27.2d, v28.2d, v29.2d}, [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"ld1 {v26.1d, v27.1d, v28.1d, v29.1d}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q26, Reg::r30), \"st1 {v26.16b}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d26, Reg::r30), \"st1 {v26.8b}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(QReg::q26, Reg::r30), \"st1 {v26.8h}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(DReg::d26, Reg::r30), \"st1 {v26.4h}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(QReg::q26, Reg::r30), \"st1 {v26.4s}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(DReg::d26, Reg::r30), \"st1 {v26.2s}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(QReg::q26, Reg::r30), \"st1 {v26.2d}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(DReg::d26, Reg::r30), \"st1 {v26.1d}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, Reg::r30), \"st1 {v31.16b, v0.16b}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, Reg::r30), \"st1 {v31.8b, v0.8b}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, Reg::r30), \"st1 {v26.16b, v27.16b}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, Reg::r30), \"st1 {v26.8b, v27.8b}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, Reg::r30), \"st1 {v26.8h, v27.8h}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, Reg::r30), \"st1 {v26.4h, v27.4h}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, Reg::r30), \"st1 {v26.4s, v27.4s}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, Reg::r30), \"st1 {v26.2s, v27.2s}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, Reg::r30), \"st1 {v26.2d, v27.2d}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, Reg::r30), \"st1 {v26.1d, v27.1d}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, Reg::r30), \"st1 {v31.16b, v0.16b, v1.16b}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, Reg::r30), \"st1 {v31.8b, v0.8b, v1.8b}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"st1 {v26.16b, v27.16b, v28.16b}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"st1 {v26.8b, v27.8b, v28.8b}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"st1 {v26.8h, v27.8h, v28.8h}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"st1 {v26.4h, v27.4h, v28.4h}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"st1 {v26.4s, v27.4s, v28.4s}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"st1 {v26.2s, v27.2s, v28.2s}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"st1 {v26.2d, v27.2d, v28.2d}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"st1 {v26.1d, v27.1d, v28.1d}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, QReg::q2, Reg::r30), \"st1 {v31.16b, v0.16b, v1.16b, v2.16b}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, DReg::d2, Reg::r30), \"st1 {v31.8b, v0.8b, v1.8b, v2.8b}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"st1 {v26.16b, v27.16b, v28.16b, v29.16b}, \"\n                                                                                            \"[x30]\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"st1 {v26.8b, v27.8b, v28.8b, v29.8b}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"st1 {v26.8h, v27.8h, v28.8h, v29.8h}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"st1 {v26.4h, v27.4h, v28.4h, v29.4h}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"st1 {v26.4s, v27.4s, v28.4s, v29.4s}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"st1 {v26.2s, v27.2s, v28.2s, v29.2s}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"st1 {v26.2d, v27.2d, v28.2d, v29.2d}, [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"st1 {v26.1d, v27.1d, v28.1d, v29.1d}, [x30]\");\n\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(QReg::q31, QReg::q0, Reg::r30), \"ld2 {v31.16b, v0.16b}, [x30]\");\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(DReg::d31, DReg::d0, Reg::r30), \"ld2 {v31.8b, v0.8b}, [x30]\");\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(QReg::q26, QReg::q27, Reg::r30), \"ld2 {v26.16b, v27.16b}, [x30]\");\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(DReg::d26, DReg::d27, Reg::r30), \"ld2 {v26.8b, v27.8b}, [x30]\");\n\n  TEST_SINGLE(ld2<SubRegSize::i16Bit>(QReg::q26, QReg::q27, Reg::r30), \"ld2 {v26.8h, v27.8h}, [x30]\");\n  TEST_SINGLE(ld2<SubRegSize::i16Bit>(DReg::d26, DReg::d27, Reg::r30), \"ld2 {v26.4h, v27.4h}, [x30]\");\n\n  TEST_SINGLE(ld2<SubRegSize::i32Bit>(QReg::q26, QReg::q27, Reg::r30), \"ld2 {v26.4s, v27.4s}, [x30]\");\n  TEST_SINGLE(ld2<SubRegSize::i32Bit>(DReg::d26, DReg::d27, Reg::r30), \"ld2 {v26.2s, v27.2s}, [x30]\");\n\n  TEST_SINGLE(ld2<SubRegSize::i64Bit>(QReg::q26, QReg::q27, Reg::r30), \"ld2 {v26.2d, v27.2d}, [x30]\");\n  TEST_SINGLE(ld2<SubRegSize::i64Bit>(DReg::d26, DReg::d27, Reg::r30), \"unallocated (NEONLoadStoreMultiStruct)\");\n\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(QReg::q31, QReg::q0, Reg::r30), \"st2 {v31.16b, v0.16b}, [x30]\");\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(DReg::d31, DReg::d0, Reg::r30), \"st2 {v31.8b, v0.8b}, [x30]\");\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(QReg::q26, QReg::q27, Reg::r30), \"st2 {v26.16b, v27.16b}, [x30]\");\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(DReg::d26, DReg::d27, Reg::r30), \"st2 {v26.8b, v27.8b}, [x30]\");\n\n  TEST_SINGLE(st2<SubRegSize::i16Bit>(QReg::q26, QReg::q27, Reg::r30), \"st2 {v26.8h, v27.8h}, [x30]\");\n  TEST_SINGLE(st2<SubRegSize::i16Bit>(DReg::d26, DReg::d27, Reg::r30), \"st2 {v26.4h, v27.4h}, [x30]\");\n\n  TEST_SINGLE(st2<SubRegSize::i32Bit>(QReg::q26, QReg::q27, Reg::r30), \"st2 {v26.4s, v27.4s}, [x30]\");\n  TEST_SINGLE(st2<SubRegSize::i32Bit>(DReg::d26, DReg::d27, Reg::r30), \"st2 {v26.2s, v27.2s}, [x30]\");\n\n  TEST_SINGLE(st2<SubRegSize::i64Bit>(QReg::q26, QReg::q27, Reg::r30), \"st2 {v26.2d, v27.2d}, [x30]\");\n  TEST_SINGLE(st2<SubRegSize::i64Bit>(DReg::d26, DReg::d27, Reg::r30), \"unallocated (NEONLoadStoreMultiStruct)\");\n\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, Reg::r30), \"ld3 {v31.16b, v0.16b, v1.16b}, [x30]\");\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, Reg::r30), \"ld3 {v31.8b, v0.8b, v1.8b}, [x30]\");\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"ld3 {v26.16b, v27.16b, v28.16b}, [x30]\");\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"ld3 {v26.8b, v27.8b, v28.8b}, [x30]\");\n\n  TEST_SINGLE(ld3<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"ld3 {v26.8h, v27.8h, v28.8h}, [x30]\");\n  TEST_SINGLE(ld3<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"ld3 {v26.4h, v27.4h, v28.4h}, [x30]\");\n\n  TEST_SINGLE(ld3<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"ld3 {v26.4s, v27.4s, v28.4s}, [x30]\");\n  TEST_SINGLE(ld3<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"ld3 {v26.2s, v27.2s, v28.2s}, [x30]\");\n\n  TEST_SINGLE(ld3<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"ld3 {v26.2d, v27.2d, v28.2d}, [x30]\");\n  TEST_SINGLE(ld3<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"unallocated (NEONLoadStoreMultiStruct)\");\n\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, Reg::r30), \"st3 {v31.16b, v0.16b, v1.16b}, [x30]\");\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, Reg::r30), \"st3 {v31.8b, v0.8b, v1.8b}, [x30]\");\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"st3 {v26.16b, v27.16b, v28.16b}, [x30]\");\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"st3 {v26.8b, v27.8b, v28.8b}, [x30]\");\n\n  TEST_SINGLE(st3<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"st3 {v26.8h, v27.8h, v28.8h}, [x30]\");\n  TEST_SINGLE(st3<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"st3 {v26.4h, v27.4h, v28.4h}, [x30]\");\n\n  TEST_SINGLE(st3<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"st3 {v26.4s, v27.4s, v28.4s}, [x30]\");\n  TEST_SINGLE(st3<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"st3 {v26.2s, v27.2s, v28.2s}, [x30]\");\n\n  TEST_SINGLE(st3<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"st3 {v26.2d, v27.2d, v28.2d}, [x30]\");\n  TEST_SINGLE(st3<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"unallocated (NEONLoadStoreMultiStruct)\");\n\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, QReg::q2, Reg::r30), \"ld4 {v31.16b, v0.16b, v1.16b, v2.16b}, [x30]\");\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, DReg::d2, Reg::r30), \"ld4 {v31.8b, v0.8b, v1.8b, v2.8b}, [x30]\");\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"ld4 {v26.16b, v27.16b, v28.16b, v29.16b}, \"\n                                                                                            \"[x30]\");\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"ld4 {v26.8b, v27.8b, v28.8b, v29.8b}, [x30]\");\n\n  TEST_SINGLE(ld4<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"ld4 {v26.8h, v27.8h, v28.8h, v29.8h}, [x30]\");\n  TEST_SINGLE(ld4<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"ld4 {v26.4h, v27.4h, v28.4h, v29.4h}, [x30]\");\n\n  TEST_SINGLE(ld4<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"ld4 {v26.4s, v27.4s, v28.4s, v29.4s}, [x30]\");\n  TEST_SINGLE(ld4<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"ld4 {v26.2s, v27.2s, v28.2s, v29.2s}, [x30]\");\n\n  TEST_SINGLE(ld4<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"ld4 {v26.2d, v27.2d, v28.2d, v29.2d}, [x30]\");\n  TEST_SINGLE(ld4<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"unallocated (NEONLoadStoreMultiStruct)\");\n\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, QReg::q2, Reg::r30), \"st4 {v31.16b, v0.16b, v1.16b, v2.16b}, [x30]\");\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, DReg::d2, Reg::r30), \"st4 {v31.8b, v0.8b, v1.8b, v2.8b}, [x30]\");\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"st4 {v26.16b, v27.16b, v28.16b, v29.16b}, \"\n                                                                                            \"[x30]\");\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"st4 {v26.8b, v27.8b, v28.8b, v29.8b}, [x30]\");\n\n  TEST_SINGLE(st4<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"st4 {v26.8h, v27.8h, v28.8h, v29.8h}, [x30]\");\n  TEST_SINGLE(st4<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"st4 {v26.4h, v27.4h, v28.4h, v29.4h}, [x30]\");\n\n  TEST_SINGLE(st4<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"st4 {v26.4s, v27.4s, v28.4s, v29.4s}, [x30]\");\n  TEST_SINGLE(st4<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"st4 {v26.2s, v27.2s, v28.2s, v29.2s}, [x30]\");\n\n  TEST_SINGLE(st4<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"st4 {v26.2d, v27.2d, v28.2d, v29.2d}, [x30]\");\n  TEST_SINGLE(st4<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"unallocated (NEONLoadStoreMultiStruct)\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Advanced SIMD load/store multiple structures (post-indexed)\") {\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q26, Reg::r30, Reg::r29), \"ld1 {v26.16b}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d26, Reg::r30, Reg::r29), \"ld1 {v26.8b}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(QReg::q26, Reg::r30, Reg::r29), \"ld1 {v26.8h}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(DReg::d26, Reg::r30, Reg::r29), \"ld1 {v26.4h}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(QReg::q26, Reg::r30, Reg::r29), \"ld1 {v26.4s}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(DReg::d26, Reg::r30, Reg::r29), \"ld1 {v26.2s}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(QReg::q26, Reg::r30, Reg::r29), \"ld1 {v26.2d}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(DReg::d26, Reg::r30, Reg::r29), \"ld1 {v26.1d}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q26, Reg::r30, 16), \"ld1 {v26.16b}, [x30], #16\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d26, Reg::r30, 8), \"ld1 {v26.8b}, [x30], #8\");\n\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(QReg::q26, Reg::r30, 16), \"ld1 {v26.8h}, [x30], #16\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(DReg::d26, Reg::r30, 8), \"ld1 {v26.4h}, [x30], #8\");\n\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(QReg::q26, Reg::r30, 16), \"ld1 {v26.4s}, [x30], #16\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(DReg::d26, Reg::r30, 8), \"ld1 {v26.2s}, [x30], #8\");\n\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(QReg::q26, Reg::r30, 16), \"ld1 {v26.2d}, [x30], #16\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(DReg::d26, Reg::r30, 8), \"ld1 {v26.1d}, [x30], #8\");\n\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, Reg::r30, Reg::r29), \"ld1 {v31.16b, v0.16b}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, Reg::r30, Reg::r29), \"ld1 {v31.8b, v0.8b}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"ld1 {v26.16b, v27.16b}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"ld1 {v26.8b, v27.8b}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"ld1 {v26.8h, v27.8h}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"ld1 {v26.4h, v27.4h}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"ld1 {v26.4s, v27.4s}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"ld1 {v26.2s, v27.2s}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"ld1 {v26.2d, v27.2d}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"ld1 {v26.1d, v27.1d}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, Reg::r30, 32), \"ld1 {v31.16b, v0.16b}, [x30], #32\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, Reg::r30, 16), \"ld1 {v31.8b, v0.8b}, [x30], #16\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"ld1 {v26.16b, v27.16b}, [x30], #32\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"ld1 {v26.8b, v27.8b}, [x30], #16\");\n\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"ld1 {v26.8h, v27.8h}, [x30], #32\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"ld1 {v26.4h, v27.4h}, [x30], #16\");\n\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"ld1 {v26.4s, v27.4s}, [x30], #32\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"ld1 {v26.2s, v27.2s}, [x30], #16\");\n\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"ld1 {v26.2d, v27.2d}, [x30], #32\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"ld1 {v26.1d, v27.1d}, [x30], #16\");\n\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, Reg::r30, Reg::r29), \"ld1 {v31.16b, v0.16b, v1.16b}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, Reg::r30, Reg::r29), \"ld1 {v31.8b, v0.8b, v1.8b}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"ld1 {v26.16b, v27.16b, v28.16b}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"ld1 {v26.8b, v27.8b, v28.8b}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"ld1 {v26.8h, v27.8h, v28.8h}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"ld1 {v26.4h, v27.4h, v28.4h}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"ld1 {v26.4s, v27.4s, v28.4s}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"ld1 {v26.2s, v27.2s, v28.2s}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"ld1 {v26.2d, v27.2d, v28.2d}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"ld1 {v26.1d, v27.1d, v28.1d}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, Reg::r30, 48), \"ld1 {v31.16b, v0.16b, v1.16b}, [x30], #48\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, Reg::r30, 24), \"ld1 {v31.8b, v0.8b, v1.8b}, [x30], #24\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"ld1 {v26.16b, v27.16b, v28.16b}, [x30], #48\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"ld1 {v26.8b, v27.8b, v28.8b}, [x30], #24\");\n\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"ld1 {v26.8h, v27.8h, v28.8h}, [x30], #48\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"ld1 {v26.4h, v27.4h, v28.4h}, [x30], #24\");\n\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"ld1 {v26.4s, v27.4s, v28.4s}, [x30], #48\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"ld1 {v26.2s, v27.2s, v28.2s}, [x30], #24\");\n\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"ld1 {v26.2d, v27.2d, v28.2d}, [x30], #48\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"ld1 {v26.1d, v27.1d, v28.1d}, [x30], #24\");\n\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, QReg::q2, Reg::r30, Reg::r29), \"ld1 {v31.16b, v0.16b, v1.16b, v2.16b}, \"\n                                                                                                   \"[x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, DReg::d2, Reg::r30, Reg::r29), \"ld1 {v31.8b, v0.8b, v1.8b, v2.8b}, \"\n                                                                                                   \"[x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"ld1 {v26.16b, v27.16b, v28.16b, \"\n                                                                                                      \"v29.16b}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"ld1 {v26.8b, v27.8b, v28.8b, \"\n                                                                                                      \"v29.8b}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"ld1 {v26.8h, v27.8h, v28.8h, \"\n                                                                                                       \"v29.8h}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"ld1 {v26.4h, v27.4h, v28.4h, \"\n                                                                                                       \"v29.4h}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"ld1 {v26.4s, v27.4s, v28.4s, \"\n                                                                                                       \"v29.4s}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"ld1 {v26.2s, v27.2s, v28.2s, \"\n                                                                                                       \"v29.2s}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"ld1 {v26.2d, v27.2d, v28.2d, \"\n                                                                                                       \"v29.2d}, [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"ld1 {v26.1d, v27.1d, v28.1d, \"\n                                                                                                       \"v29.1d}, [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, QReg::q2, Reg::r30, 64), \"ld1 {v31.16b, v0.16b, v1.16b, v2.16b}, \"\n                                                                                             \"[x30], #64\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, DReg::d2, Reg::r30, 32), \"ld1 {v31.8b, v0.8b, v1.8b, v2.8b}, [x30], \"\n                                                                                             \"#32\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"ld1 {v26.16b, v27.16b, v28.16b, v29.16b}, \"\n                                                                                                \"[x30], #64\");\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"ld1 {v26.8b, v27.8b, v28.8b, v29.8b}, \"\n                                                                                                \"[x30], #32\");\n\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"ld1 {v26.8h, v27.8h, v28.8h, v29.8h}, \"\n                                                                                                 \"[x30], #64\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"ld1 {v26.4h, v27.4h, v28.4h, v29.4h}, \"\n                                                                                                 \"[x30], #32\");\n\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"ld1 {v26.4s, v27.4s, v28.4s, v29.4s}, \"\n                                                                                                 \"[x30], #64\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"ld1 {v26.2s, v27.2s, v28.2s, v29.2s}, \"\n                                                                                                 \"[x30], #32\");\n\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"ld1 {v26.2d, v27.2d, v28.2d, v29.2d}, \"\n                                                                                                 \"[x30], #64\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"ld1 {v26.1d, v27.1d, v28.1d, v29.1d}, \"\n                                                                                                 \"[x30], #32\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q26, Reg::r30, Reg::r29), \"st1 {v26.16b}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d26, Reg::r30, Reg::r29), \"st1 {v26.8b}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(QReg::q26, Reg::r30, Reg::r29), \"st1 {v26.8h}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(DReg::d26, Reg::r30, Reg::r29), \"st1 {v26.4h}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(QReg::q26, Reg::r30, Reg::r29), \"st1 {v26.4s}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(DReg::d26, Reg::r30, Reg::r29), \"st1 {v26.2s}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(QReg::q26, Reg::r30, Reg::r29), \"st1 {v26.2d}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(DReg::d26, Reg::r30, Reg::r29), \"st1 {v26.1d}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q26, Reg::r30, 16), \"st1 {v26.16b}, [x30], #16\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d26, Reg::r30, 8), \"st1 {v26.8b}, [x30], #8\");\n\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(QReg::q26, Reg::r30, 16), \"st1 {v26.8h}, [x30], #16\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(DReg::d26, Reg::r30, 8), \"st1 {v26.4h}, [x30], #8\");\n\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(QReg::q26, Reg::r30, 16), \"st1 {v26.4s}, [x30], #16\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(DReg::d26, Reg::r30, 8), \"st1 {v26.2s}, [x30], #8\");\n\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(QReg::q26, Reg::r30, 16), \"st1 {v26.2d}, [x30], #16\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(DReg::d26, Reg::r30, 8), \"st1 {v26.1d}, [x30], #8\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, Reg::r30, Reg::r29), \"st1 {v31.16b, v0.16b}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, Reg::r30, Reg::r29), \"st1 {v31.8b, v0.8b}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"st1 {v26.16b, v27.16b}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"st1 {v26.8b, v27.8b}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"st1 {v26.8h, v27.8h}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"st1 {v26.4h, v27.4h}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"st1 {v26.4s, v27.4s}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"st1 {v26.2s, v27.2s}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"st1 {v26.2d, v27.2d}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"st1 {v26.1d, v27.1d}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, Reg::r30, 32), \"st1 {v31.16b, v0.16b}, [x30], #32\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, Reg::r30, 16), \"st1 {v31.8b, v0.8b}, [x30], #16\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"st1 {v26.16b, v27.16b}, [x30], #32\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"st1 {v26.8b, v27.8b}, [x30], #16\");\n\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"st1 {v26.8h, v27.8h}, [x30], #32\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"st1 {v26.4h, v27.4h}, [x30], #16\");\n\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"st1 {v26.4s, v27.4s}, [x30], #32\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"st1 {v26.2s, v27.2s}, [x30], #16\");\n\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"st1 {v26.2d, v27.2d}, [x30], #32\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"st1 {v26.1d, v27.1d}, [x30], #16\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, Reg::r30, Reg::r29), \"st1 {v31.16b, v0.16b, v1.16b}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, Reg::r30, Reg::r29), \"st1 {v31.8b, v0.8b, v1.8b}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"st1 {v26.16b, v27.16b, v28.16b}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"st1 {v26.8b, v27.8b, v28.8b}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"st1 {v26.8h, v27.8h, v28.8h}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"st1 {v26.4h, v27.4h, v28.4h}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"st1 {v26.4s, v27.4s, v28.4s}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"st1 {v26.2s, v27.2s, v28.2s}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"st1 {v26.2d, v27.2d, v28.2d}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"st1 {v26.1d, v27.1d, v28.1d}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, Reg::r30, 48), \"st1 {v31.16b, v0.16b, v1.16b}, [x30], #48\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, Reg::r30, 24), \"st1 {v31.8b, v0.8b, v1.8b}, [x30], #24\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"st1 {v26.16b, v27.16b, v28.16b}, [x30], #48\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"st1 {v26.8b, v27.8b, v28.8b}, [x30], #24\");\n\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"st1 {v26.8h, v27.8h, v28.8h}, [x30], #48\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"st1 {v26.4h, v27.4h, v28.4h}, [x30], #24\");\n\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"st1 {v26.4s, v27.4s, v28.4s}, [x30], #48\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"st1 {v26.2s, v27.2s, v28.2s}, [x30], #24\");\n\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"st1 {v26.2d, v27.2d, v28.2d}, [x30], #48\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"st1 {v26.1d, v27.1d, v28.1d}, [x30], #24\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, QReg::q2, Reg::r30, Reg::r29), \"st1 {v31.16b, v0.16b, v1.16b, v2.16b}, \"\n                                                                                                   \"[x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, DReg::d2, Reg::r30, Reg::r29), \"st1 {v31.8b, v0.8b, v1.8b, v2.8b}, \"\n                                                                                                   \"[x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"st1 {v26.16b, v27.16b, v28.16b, \"\n                                                                                                      \"v29.16b}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"st1 {v26.8b, v27.8b, v28.8b, \"\n                                                                                                      \"v29.8b}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"st1 {v26.8h, v27.8h, v28.8h, \"\n                                                                                                       \"v29.8h}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"st1 {v26.4h, v27.4h, v28.4h, \"\n                                                                                                       \"v29.4h}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"st1 {v26.4s, v27.4s, v28.4s, \"\n                                                                                                       \"v29.4s}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"st1 {v26.2s, v27.2s, v28.2s, \"\n                                                                                                       \"v29.2s}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"st1 {v26.2d, v27.2d, v28.2d, \"\n                                                                                                       \"v29.2d}, [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"st1 {v26.1d, v27.1d, v28.1d, \"\n                                                                                                       \"v29.1d}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, QReg::q2, Reg::r30, 64), \"st1 {v31.16b, v0.16b, v1.16b, v2.16b}, \"\n                                                                                             \"[x30], #64\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, DReg::d2, Reg::r30, 32), \"st1 {v31.8b, v0.8b, v1.8b, v2.8b}, [x30], \"\n                                                                                             \"#32\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"st1 {v26.16b, v27.16b, v28.16b, v29.16b}, \"\n                                                                                                \"[x30], #64\");\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"st1 {v26.8b, v27.8b, v28.8b, v29.8b}, \"\n                                                                                                \"[x30], #32\");\n\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"st1 {v26.8h, v27.8h, v28.8h, v29.8h}, \"\n                                                                                                 \"[x30], #64\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"st1 {v26.4h, v27.4h, v28.4h, v29.4h}, \"\n                                                                                                 \"[x30], #32\");\n\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"st1 {v26.4s, v27.4s, v28.4s, v29.4s}, \"\n                                                                                                 \"[x30], #64\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"st1 {v26.2s, v27.2s, v28.2s, v29.2s}, \"\n                                                                                                 \"[x30], #32\");\n\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"st1 {v26.2d, v27.2d, v28.2d, v29.2d}, \"\n                                                                                                 \"[x30], #64\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"st1 {v26.1d, v27.1d, v28.1d, v29.1d}, \"\n                                                                                                 \"[x30], #32\");\n\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(QReg::q31, QReg::q0, Reg::r30, Reg::r29), \"ld2 {v31.16b, v0.16b}, [x30], x29\");\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(DReg::d31, DReg::d0, Reg::r30, Reg::r29), \"ld2 {v31.8b, v0.8b}, [x30], x29\");\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"ld2 {v26.16b, v27.16b}, [x30], x29\");\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"ld2 {v26.8b, v27.8b}, [x30], x29\");\n\n  TEST_SINGLE(ld2<SubRegSize::i16Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"ld2 {v26.8h, v27.8h}, [x30], x29\");\n  TEST_SINGLE(ld2<SubRegSize::i16Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"ld2 {v26.4h, v27.4h}, [x30], x29\");\n\n  TEST_SINGLE(ld2<SubRegSize::i32Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"ld2 {v26.4s, v27.4s}, [x30], x29\");\n  TEST_SINGLE(ld2<SubRegSize::i32Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"ld2 {v26.2s, v27.2s}, [x30], x29\");\n\n  TEST_SINGLE(ld2<SubRegSize::i64Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"ld2 {v26.2d, v27.2d}, [x30], x29\");\n  TEST_SINGLE(ld2<SubRegSize::i64Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"unallocated (NEONLoadStoreMultiStructPostIndex)\");\n\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(QReg::q31, QReg::q0, Reg::r30, 32), \"ld2 {v31.16b, v0.16b}, [x30], #32\");\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(DReg::d31, DReg::d0, Reg::r30, 16), \"ld2 {v31.8b, v0.8b}, [x30], #16\");\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"ld2 {v26.16b, v27.16b}, [x30], #32\");\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"ld2 {v26.8b, v27.8b}, [x30], #16\");\n\n  TEST_SINGLE(ld2<SubRegSize::i16Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"ld2 {v26.8h, v27.8h}, [x30], #32\");\n  TEST_SINGLE(ld2<SubRegSize::i16Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"ld2 {v26.4h, v27.4h}, [x30], #16\");\n\n  TEST_SINGLE(ld2<SubRegSize::i32Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"ld2 {v26.4s, v27.4s}, [x30], #32\");\n  TEST_SINGLE(ld2<SubRegSize::i32Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"ld2 {v26.2s, v27.2s}, [x30], #16\");\n\n  TEST_SINGLE(ld2<SubRegSize::i64Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"ld2 {v26.2d, v27.2d}, [x30], #32\");\n  TEST_SINGLE(ld2<SubRegSize::i64Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"unallocated (NEONLoadStoreMultiStructPostIndex)\");\n\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(QReg::q31, QReg::q0, Reg::r30, Reg::r29), \"st2 {v31.16b, v0.16b}, [x30], x29\");\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(DReg::d31, DReg::d0, Reg::r30, Reg::r29), \"st2 {v31.8b, v0.8b}, [x30], x29\");\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"st2 {v26.16b, v27.16b}, [x30], x29\");\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"st2 {v26.8b, v27.8b}, [x30], x29\");\n\n  TEST_SINGLE(st2<SubRegSize::i16Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"st2 {v26.8h, v27.8h}, [x30], x29\");\n  TEST_SINGLE(st2<SubRegSize::i16Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"st2 {v26.4h, v27.4h}, [x30], x29\");\n\n  TEST_SINGLE(st2<SubRegSize::i32Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"st2 {v26.4s, v27.4s}, [x30], x29\");\n  TEST_SINGLE(st2<SubRegSize::i32Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"st2 {v26.2s, v27.2s}, [x30], x29\");\n\n  TEST_SINGLE(st2<SubRegSize::i64Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"st2 {v26.2d, v27.2d}, [x30], x29\");\n  TEST_SINGLE(st2<SubRegSize::i64Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"unallocated (NEONLoadStoreMultiStructPostIndex)\");\n\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(QReg::q31, QReg::q0, Reg::r30, 32), \"st2 {v31.16b, v0.16b}, [x30], #32\");\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(DReg::d31, DReg::d0, Reg::r30, 16), \"st2 {v31.8b, v0.8b}, [x30], #16\");\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"st2 {v26.16b, v27.16b}, [x30], #32\");\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"st2 {v26.8b, v27.8b}, [x30], #16\");\n\n  TEST_SINGLE(st2<SubRegSize::i16Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"st2 {v26.8h, v27.8h}, [x30], #32\");\n  TEST_SINGLE(st2<SubRegSize::i16Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"st2 {v26.4h, v27.4h}, [x30], #16\");\n\n  TEST_SINGLE(st2<SubRegSize::i32Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"st2 {v26.4s, v27.4s}, [x30], #32\");\n  TEST_SINGLE(st2<SubRegSize::i32Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"st2 {v26.2s, v27.2s}, [x30], #16\");\n\n  TEST_SINGLE(st2<SubRegSize::i64Bit>(QReg::q26, QReg::q27, Reg::r30, 32), \"st2 {v26.2d, v27.2d}, [x30], #32\");\n  TEST_SINGLE(st2<SubRegSize::i64Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"unallocated (NEONLoadStoreMultiStructPostIndex)\");\n\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, Reg::r30, Reg::r29), \"ld3 {v31.16b, v0.16b, v1.16b}, [x30], x29\");\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, Reg::r30, Reg::r29), \"ld3 {v31.8b, v0.8b, v1.8b}, [x30], x29\");\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"ld3 {v26.16b, v27.16b, v28.16b}, [x30], x29\");\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"ld3 {v26.8b, v27.8b, v28.8b}, [x30], x29\");\n\n  TEST_SINGLE(ld3<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"ld3 {v26.8h, v27.8h, v28.8h}, [x30], x29\");\n  TEST_SINGLE(ld3<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"ld3 {v26.4h, v27.4h, v28.4h}, [x30], x29\");\n\n  TEST_SINGLE(ld3<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"ld3 {v26.4s, v27.4s, v28.4s}, [x30], x29\");\n  TEST_SINGLE(ld3<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"ld3 {v26.2s, v27.2s, v28.2s}, [x30], x29\");\n\n  TEST_SINGLE(ld3<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"ld3 {v26.2d, v27.2d, v28.2d}, [x30], x29\");\n  TEST_SINGLE(ld3<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"unallocated \"\n                                                                                            \"(NEONLoadStoreMultiStructPostIndex)\");\n\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, Reg::r30, 48), \"ld3 {v31.16b, v0.16b, v1.16b}, [x30], #48\");\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, Reg::r30, 24), \"ld3 {v31.8b, v0.8b, v1.8b}, [x30], #24\");\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"ld3 {v26.16b, v27.16b, v28.16b}, [x30], #48\");\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"ld3 {v26.8b, v27.8b, v28.8b}, [x30], #24\");\n\n  TEST_SINGLE(ld3<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"ld3 {v26.8h, v27.8h, v28.8h}, [x30], #48\");\n  TEST_SINGLE(ld3<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"ld3 {v26.4h, v27.4h, v28.4h}, [x30], #24\");\n\n  TEST_SINGLE(ld3<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"ld3 {v26.4s, v27.4s, v28.4s}, [x30], #48\");\n  TEST_SINGLE(ld3<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"ld3 {v26.2s, v27.2s, v28.2s}, [x30], #24\");\n\n  TEST_SINGLE(ld3<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"ld3 {v26.2d, v27.2d, v28.2d}, [x30], #48\");\n  TEST_SINGLE(ld3<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"unallocated (NEONLoadStoreMultiStructPostIndex)\");\n\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, Reg::r30, Reg::r29), \"st3 {v31.16b, v0.16b, v1.16b}, [x30], x29\");\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, Reg::r30, Reg::r29), \"st3 {v31.8b, v0.8b, v1.8b}, [x30], x29\");\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"st3 {v26.16b, v27.16b, v28.16b}, [x30], x29\");\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"st3 {v26.8b, v27.8b, v28.8b}, [x30], x29\");\n\n  TEST_SINGLE(st3<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"st3 {v26.8h, v27.8h, v28.8h}, [x30], x29\");\n  TEST_SINGLE(st3<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"st3 {v26.4h, v27.4h, v28.4h}, [x30], x29\");\n\n  TEST_SINGLE(st3<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"st3 {v26.4s, v27.4s, v28.4s}, [x30], x29\");\n  TEST_SINGLE(st3<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"st3 {v26.2s, v27.2s, v28.2s}, [x30], x29\");\n\n  TEST_SINGLE(st3<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"st3 {v26.2d, v27.2d, v28.2d}, [x30], x29\");\n  TEST_SINGLE(st3<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"unallocated \"\n                                                                                            \"(NEONLoadStoreMultiStructPostIndex)\");\n\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, Reg::r30, 48), \"st3 {v31.16b, v0.16b, v1.16b}, [x30], #48\");\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, Reg::r30, 24), \"st3 {v31.8b, v0.8b, v1.8b}, [x30], #24\");\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"st3 {v26.16b, v27.16b, v28.16b}, [x30], #48\");\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"st3 {v26.8b, v27.8b, v28.8b}, [x30], #24\");\n\n  TEST_SINGLE(st3<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"st3 {v26.8h, v27.8h, v28.8h}, [x30], #48\");\n  TEST_SINGLE(st3<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"st3 {v26.4h, v27.4h, v28.4h}, [x30], #24\");\n\n  TEST_SINGLE(st3<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"st3 {v26.4s, v27.4s, v28.4s}, [x30], #48\");\n  TEST_SINGLE(st3<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"st3 {v26.2s, v27.2s, v28.2s}, [x30], #24\");\n\n  TEST_SINGLE(st3<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 48), \"st3 {v26.2d, v27.2d, v28.2d}, [x30], #48\");\n  TEST_SINGLE(st3<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"unallocated (NEONLoadStoreMultiStructPostIndex)\");\n\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, QReg::q2, Reg::r30, Reg::r29), \"ld4 {v31.16b, v0.16b, v1.16b, v2.16b}, \"\n                                                                                                   \"[x30], x29\");\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, DReg::d2, Reg::r30, Reg::r29), \"ld4 {v31.8b, v0.8b, v1.8b, v2.8b}, \"\n                                                                                                   \"[x30], x29\");\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"ld4 {v26.16b, v27.16b, v28.16b, \"\n                                                                                                      \"v29.16b}, [x30], x29\");\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"ld4 {v26.8b, v27.8b, v28.8b, \"\n                                                                                                      \"v29.8b}, [x30], x29\");\n\n  TEST_SINGLE(ld4<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"ld4 {v26.8h, v27.8h, v28.8h, \"\n                                                                                                       \"v29.8h}, [x30], x29\");\n  TEST_SINGLE(ld4<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"ld4 {v26.4h, v27.4h, v28.4h, \"\n                                                                                                       \"v29.4h}, [x30], x29\");\n\n  TEST_SINGLE(ld4<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"ld4 {v26.4s, v27.4s, v28.4s, \"\n                                                                                                       \"v29.4s}, [x30], x29\");\n  TEST_SINGLE(ld4<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"ld4 {v26.2s, v27.2s, v28.2s, \"\n                                                                                                       \"v29.2s}, [x30], x29\");\n\n  TEST_SINGLE(ld4<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"ld4 {v26.2d, v27.2d, v28.2d, \"\n                                                                                                       \"v29.2d}, [x30], x29\");\n  TEST_SINGLE(ld4<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"unallocated \"\n                                                                                                       \"(NEONLoadStoreMultiStructPostIndex\"\n                                                                                                       \")\");\n\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, QReg::q2, Reg::r30, 64), \"ld4 {v31.16b, v0.16b, v1.16b, v2.16b}, \"\n                                                                                             \"[x30], #64\");\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, DReg::d2, Reg::r30, 32), \"ld4 {v31.8b, v0.8b, v1.8b, v2.8b}, [x30], \"\n                                                                                             \"#32\");\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"ld4 {v26.16b, v27.16b, v28.16b, v29.16b}, \"\n                                                                                                \"[x30], #64\");\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"ld4 {v26.8b, v27.8b, v28.8b, v29.8b}, \"\n                                                                                                \"[x30], #32\");\n\n  TEST_SINGLE(ld4<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"ld4 {v26.8h, v27.8h, v28.8h, v29.8h}, \"\n                                                                                                 \"[x30], #64\");\n  TEST_SINGLE(ld4<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"ld4 {v26.4h, v27.4h, v28.4h, v29.4h}, \"\n                                                                                                 \"[x30], #32\");\n\n  TEST_SINGLE(ld4<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"ld4 {v26.4s, v27.4s, v28.4s, v29.4s}, \"\n                                                                                                 \"[x30], #64\");\n  TEST_SINGLE(ld4<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"ld4 {v26.2s, v27.2s, v28.2s, v29.2s}, \"\n                                                                                                 \"[x30], #32\");\n\n  TEST_SINGLE(ld4<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"ld4 {v26.2d, v27.2d, v28.2d, v29.2d}, \"\n                                                                                                 \"[x30], #64\");\n  TEST_SINGLE(ld4<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"unallocated \"\n                                                                                                 \"(NEONLoadStoreMultiStructPostIndex)\");\n\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, QReg::q2, Reg::r30, Reg::r29), \"st4 {v31.16b, v0.16b, v1.16b, v2.16b}, \"\n                                                                                                   \"[x30], x29\");\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, DReg::d2, Reg::r30, Reg::r29), \"st4 {v31.8b, v0.8b, v1.8b, v2.8b}, \"\n                                                                                                   \"[x30], x29\");\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"st4 {v26.16b, v27.16b, v28.16b, \"\n                                                                                                      \"v29.16b}, [x30], x29\");\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"st4 {v26.8b, v27.8b, v28.8b, \"\n                                                                                                      \"v29.8b}, [x30], x29\");\n\n  TEST_SINGLE(st4<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"st4 {v26.8h, v27.8h, v28.8h, \"\n                                                                                                       \"v29.8h}, [x30], x29\");\n  TEST_SINGLE(st4<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"st4 {v26.4h, v27.4h, v28.4h, \"\n                                                                                                       \"v29.4h}, [x30], x29\");\n\n  TEST_SINGLE(st4<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"st4 {v26.4s, v27.4s, v28.4s, \"\n                                                                                                       \"v29.4s}, [x30], x29\");\n  TEST_SINGLE(st4<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"st4 {v26.2s, v27.2s, v28.2s, \"\n                                                                                                       \"v29.2s}, [x30], x29\");\n\n  TEST_SINGLE(st4<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"st4 {v26.2d, v27.2d, v28.2d, \"\n                                                                                                       \"v29.2d}, [x30], x29\");\n  TEST_SINGLE(st4<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"unallocated \"\n                                                                                                       \"(NEONLoadStoreMultiStructPostIndex\"\n                                                                                                       \")\");\n\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, QReg::q2, Reg::r30, 64), \"st4 {v31.16b, v0.16b, v1.16b, v2.16b}, \"\n                                                                                             \"[x30], #64\");\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, DReg::d2, Reg::r30, 32), \"st4 {v31.8b, v0.8b, v1.8b, v2.8b}, [x30], \"\n                                                                                             \"#32\");\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"st4 {v26.16b, v27.16b, v28.16b, v29.16b}, \"\n                                                                                                \"[x30], #64\");\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"st4 {v26.8b, v27.8b, v28.8b, v29.8b}, \"\n                                                                                                \"[x30], #32\");\n\n  TEST_SINGLE(st4<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"st4 {v26.8h, v27.8h, v28.8h, v29.8h}, \"\n                                                                                                 \"[x30], #64\");\n  TEST_SINGLE(st4<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"st4 {v26.4h, v27.4h, v28.4h, v29.4h}, \"\n                                                                                                 \"[x30], #32\");\n\n  TEST_SINGLE(st4<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"st4 {v26.4s, v27.4s, v28.4s, v29.4s}, \"\n                                                                                                 \"[x30], #64\");\n  TEST_SINGLE(st4<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"st4 {v26.2s, v27.2s, v28.2s, v29.2s}, \"\n                                                                                                 \"[x30], #32\");\n\n  TEST_SINGLE(st4<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 64), \"st4 {v26.2d, v27.2d, v28.2d, v29.2d}, \"\n                                                                                                 \"[x30], #64\");\n  TEST_SINGLE(st4<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"unallocated \"\n                                                                                                 \"(NEONLoadStoreMultiStructPostIndex)\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: ASIMD loadstore single\") {\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(VReg::v26, 0, Reg::r30), \"ld1 {v26.b}[0], [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(VReg::v26, 0, Reg::r30), \"ld1 {v26.h}[0], [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(VReg::v26, 0, Reg::r30), \"ld1 {v26.s}[0], [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(VReg::v26, 0, Reg::r30), \"ld1 {v26.d}[0], [x30]\");\n\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(VReg::v26, 15, Reg::r30), \"ld1 {v26.b}[15], [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(VReg::v26, 7, Reg::r30), \"ld1 {v26.h}[7], [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(VReg::v26, 3, Reg::r30), \"ld1 {v26.s}[3], [x30]\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(VReg::v26, 1, Reg::r30), \"ld1 {v26.d}[1], [x30]\");\n\n  TEST_SINGLE(ld1r<SubRegSize::i8Bit>(DReg::d26, Reg::r30), \"ld1r {v26.8b}, [x30]\");\n  TEST_SINGLE(ld1r<SubRegSize::i16Bit>(DReg::d26, Reg::r30), \"ld1r {v26.4h}, [x30]\");\n  TEST_SINGLE(ld1r<SubRegSize::i32Bit>(DReg::d26, Reg::r30), \"ld1r {v26.2s}, [x30]\");\n  TEST_SINGLE(ld1r<SubRegSize::i64Bit>(DReg::d26, Reg::r30), \"ld1r {v26.1d}, [x30]\");\n\n  TEST_SINGLE(ld1r<SubRegSize::i8Bit>(QReg::q26, Reg::r30), \"ld1r {v26.16b}, [x30]\");\n  TEST_SINGLE(ld1r<SubRegSize::i16Bit>(QReg::q26, Reg::r30), \"ld1r {v26.8h}, [x30]\");\n  TEST_SINGLE(ld1r<SubRegSize::i32Bit>(QReg::q26, Reg::r30), \"ld1r {v26.4s}, [x30]\");\n  TEST_SINGLE(ld1r<SubRegSize::i64Bit>(QReg::q26, Reg::r30), \"ld1r {v26.2d}, [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(VReg::v26, 0, Reg::r30), \"st1 {v26.b}[0], [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(VReg::v26, 0, Reg::r30), \"st1 {v26.h}[0], [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(VReg::v26, 0, Reg::r30), \"st1 {v26.s}[0], [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(VReg::v26, 0, Reg::r30), \"st1 {v26.d}[0], [x30]\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(VReg::v26, 15, Reg::r30), \"st1 {v26.b}[15], [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(VReg::v26, 7, Reg::r30), \"st1 {v26.h}[7], [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(VReg::v26, 3, Reg::r30), \"st1 {v26.s}[3], [x30]\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(VReg::v26, 1, Reg::r30), \"st1 {v26.d}[1], [x30]\");\n\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(VReg::v31, VReg::v0, 0, Reg::r30), \"ld2 {v31.b, v0.b}[0], [x30]\");\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(VReg::v26, VReg::v27, 0, Reg::r30), \"ld2 {v26.b, v27.b}[0], [x30]\");\n  TEST_SINGLE(ld2<SubRegSize::i16Bit>(VReg::v26, VReg::v27, 0, Reg::r30), \"ld2 {v26.h, v27.h}[0], [x30]\");\n  TEST_SINGLE(ld2<SubRegSize::i32Bit>(VReg::v26, VReg::v27, 0, Reg::r30), \"ld2 {v26.s, v27.s}[0], [x30]\");\n  TEST_SINGLE(ld2<SubRegSize::i64Bit>(VReg::v26, VReg::v27, 0, Reg::r30), \"ld2 {v26.d, v27.d}[0], [x30]\");\n\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(VReg::v26, VReg::v27, 15, Reg::r30), \"ld2 {v26.b, v27.b}[15], [x30]\");\n  TEST_SINGLE(ld2<SubRegSize::i16Bit>(VReg::v26, VReg::v27, 7, Reg::r30), \"ld2 {v26.h, v27.h}[7], [x30]\");\n  TEST_SINGLE(ld2<SubRegSize::i32Bit>(VReg::v26, VReg::v27, 3, Reg::r30), \"ld2 {v26.s, v27.s}[3], [x30]\");\n  TEST_SINGLE(ld2<SubRegSize::i64Bit>(VReg::v26, VReg::v27, 1, Reg::r30), \"ld2 {v26.d, v27.d}[1], [x30]\");\n\n  TEST_SINGLE(ld2r<SubRegSize::i8Bit>(DReg::d31, DReg::d0, Reg::r30), \"ld2r {v31.8b, v0.8b}, [x30]\");\n  TEST_SINGLE(ld2r<SubRegSize::i8Bit>(DReg::d26, DReg::d27, Reg::r30), \"ld2r {v26.8b, v27.8b}, [x30]\");\n  TEST_SINGLE(ld2r<SubRegSize::i16Bit>(DReg::d26, DReg::d27, Reg::r30), \"ld2r {v26.4h, v27.4h}, [x30]\");\n  TEST_SINGLE(ld2r<SubRegSize::i32Bit>(DReg::d26, DReg::d27, Reg::r30), \"ld2r {v26.2s, v27.2s}, [x30]\");\n  TEST_SINGLE(ld2r<SubRegSize::i64Bit>(DReg::d26, DReg::d27, Reg::r30), \"ld2r {v26.1d, v27.1d}, [x30]\");\n\n  TEST_SINGLE(ld2r<SubRegSize::i8Bit>(QReg::q31, QReg::q0, Reg::r30), \"ld2r {v31.16b, v0.16b}, [x30]\");\n  TEST_SINGLE(ld2r<SubRegSize::i8Bit>(QReg::q26, QReg::q27, Reg::r30), \"ld2r {v26.16b, v27.16b}, [x30]\");\n  TEST_SINGLE(ld2r<SubRegSize::i16Bit>(QReg::q26, QReg::q27, Reg::r30), \"ld2r {v26.8h, v27.8h}, [x30]\");\n  TEST_SINGLE(ld2r<SubRegSize::i32Bit>(QReg::q26, QReg::q27, Reg::r30), \"ld2r {v26.4s, v27.4s}, [x30]\");\n  TEST_SINGLE(ld2r<SubRegSize::i64Bit>(QReg::q26, QReg::q27, Reg::r30), \"ld2r {v26.2d, v27.2d}, [x30]\");\n\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(VReg::v31, VReg::v0, 0, Reg::r30), \"st2 {v31.b, v0.b}[0], [x30]\");\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(VReg::v26, VReg::v27, 0, Reg::r30), \"st2 {v26.b, v27.b}[0], [x30]\");\n  TEST_SINGLE(st2<SubRegSize::i16Bit>(VReg::v26, VReg::v27, 0, Reg::r30), \"st2 {v26.h, v27.h}[0], [x30]\");\n  TEST_SINGLE(st2<SubRegSize::i32Bit>(VReg::v26, VReg::v27, 0, Reg::r30), \"st2 {v26.s, v27.s}[0], [x30]\");\n  TEST_SINGLE(st2<SubRegSize::i64Bit>(VReg::v26, VReg::v27, 0, Reg::r30), \"st2 {v26.d, v27.d}[0], [x30]\");\n\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(VReg::v26, VReg::v27, 15, Reg::r30), \"st2 {v26.b, v27.b}[15], [x30]\");\n  TEST_SINGLE(st2<SubRegSize::i16Bit>(VReg::v26, VReg::v27, 7, Reg::r30), \"st2 {v26.h, v27.h}[7], [x30]\");\n  TEST_SINGLE(st2<SubRegSize::i32Bit>(VReg::v26, VReg::v27, 3, Reg::r30), \"st2 {v26.s, v27.s}[3], [x30]\");\n  TEST_SINGLE(st2<SubRegSize::i64Bit>(VReg::v26, VReg::v27, 1, Reg::r30), \"st2 {v26.d, v27.d}[1], [x30]\");\n\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(VReg::v31, VReg::v0, VReg::v1, 0, Reg::r30), \"ld3 {v31.b, v0.b, v1.b}[0], [x30]\");\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30), \"ld3 {v26.b, v27.b, v28.b}[0], [x30]\");\n  TEST_SINGLE(ld3<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30), \"ld3 {v26.h, v27.h, v28.h}[0], [x30]\");\n  TEST_SINGLE(ld3<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30), \"ld3 {v26.s, v27.s, v28.s}[0], [x30]\");\n  TEST_SINGLE(ld3<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30), \"ld3 {v26.d, v27.d, v28.d}[0], [x30]\");\n\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, 15, Reg::r30), \"ld3 {v26.b, v27.b, v28.b}[15], [x30]\");\n  TEST_SINGLE(ld3<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, 7, Reg::r30), \"ld3 {v26.h, v27.h, v28.h}[7], [x30]\");\n  TEST_SINGLE(ld3<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, 3, Reg::r30), \"ld3 {v26.s, v27.s, v28.s}[3], [x30]\");\n  TEST_SINGLE(ld3<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, 1, Reg::r30), \"ld3 {v26.d, v27.d, v28.d}[1], [x30]\");\n\n  TEST_SINGLE(ld3r<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, Reg::r30), \"ld3r {v31.8b, v0.8b, v1.8b}, [x30]\");\n  TEST_SINGLE(ld3r<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"ld3r {v26.8b, v27.8b, v28.8b}, [x30]\");\n  TEST_SINGLE(ld3r<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"ld3r {v26.4h, v27.4h, v28.4h}, [x30]\");\n  TEST_SINGLE(ld3r<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"ld3r {v26.2s, v27.2s, v28.2s}, [x30]\");\n  TEST_SINGLE(ld3r<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30), \"ld3r {v26.1d, v27.1d, v28.1d}, [x30]\");\n\n  TEST_SINGLE(ld3r<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, Reg::r30), \"ld3r {v31.16b, v0.16b, v1.16b}, [x30]\");\n  TEST_SINGLE(ld3r<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"ld3r {v26.16b, v27.16b, v28.16b}, [x30]\");\n  TEST_SINGLE(ld3r<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"ld3r {v26.8h, v27.8h, v28.8h}, [x30]\");\n  TEST_SINGLE(ld3r<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"ld3r {v26.4s, v27.4s, v28.4s}, [x30]\");\n  TEST_SINGLE(ld3r<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30), \"ld3r {v26.2d, v27.2d, v28.2d}, [x30]\");\n\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(VReg::v31, VReg::v0, VReg::v1, 0, Reg::r30), \"st3 {v31.b, v0.b, v1.b}[0], [x30]\");\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30), \"st3 {v26.b, v27.b, v28.b}[0], [x30]\");\n  TEST_SINGLE(st3<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30), \"st3 {v26.h, v27.h, v28.h}[0], [x30]\");\n  TEST_SINGLE(st3<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30), \"st3 {v26.s, v27.s, v28.s}[0], [x30]\");\n  TEST_SINGLE(st3<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30), \"st3 {v26.d, v27.d, v28.d}[0], [x30]\");\n\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, 15, Reg::r30), \"st3 {v26.b, v27.b, v28.b}[15], [x30]\");\n  TEST_SINGLE(st3<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, 7, Reg::r30), \"st3 {v26.h, v27.h, v28.h}[7], [x30]\");\n  TEST_SINGLE(st3<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, 3, Reg::r30), \"st3 {v26.s, v27.s, v28.s}[3], [x30]\");\n  TEST_SINGLE(st3<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, 1, Reg::r30), \"st3 {v26.d, v27.d, v28.d}[1], [x30]\");\n\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(VReg::v31, VReg::v0, VReg::v1, VReg::v2, 0, Reg::r30), \"ld4 {v31.b, v0.b, v1.b, v2.b}[0], [x30]\");\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30), \"ld4 {v26.b, v27.b, v28.b, v29.b}[0], \"\n                                                                                               \"[x30]\");\n  TEST_SINGLE(ld4<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30), \"ld4 {v26.h, v27.h, v28.h, v29.h}[0], \"\n                                                                                                \"[x30]\");\n  TEST_SINGLE(ld4<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30), \"ld4 {v26.s, v27.s, v28.s, v29.s}[0], \"\n                                                                                                \"[x30]\");\n  TEST_SINGLE(ld4<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30), \"ld4 {v26.d, v27.d, v28.d, v29.d}[0], \"\n                                                                                                \"[x30]\");\n\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 15, Reg::r30), \"ld4 {v26.b, v27.b, v28.b, v29.b}[15], \"\n                                                                                                \"[x30]\");\n  TEST_SINGLE(ld4<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 7, Reg::r30), \"ld4 {v26.h, v27.h, v28.h, v29.h}[7], \"\n                                                                                                \"[x30]\");\n  TEST_SINGLE(ld4<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 3, Reg::r30), \"ld4 {v26.s, v27.s, v28.s, v29.s}[3], \"\n                                                                                                \"[x30]\");\n  TEST_SINGLE(ld4<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 1, Reg::r30), \"ld4 {v26.d, v27.d, v28.d, v29.d}[1], \"\n                                                                                                \"[x30]\");\n\n  TEST_SINGLE(ld4r<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, DReg::d2, Reg::r30), \"ld4r {v31.8b, v0.8b, v1.8b, v2.8b}, [x30]\");\n  TEST_SINGLE(ld4r<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"ld4r {v26.8b, v27.8b, v28.8b, v29.8b}, \"\n                                                                                             \"[x30]\");\n  TEST_SINGLE(ld4r<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"ld4r {v26.4h, v27.4h, v28.4h, v29.4h}, \"\n                                                                                              \"[x30]\");\n  TEST_SINGLE(ld4r<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"ld4r {v26.2s, v27.2s, v28.2s, v29.2s}, \"\n                                                                                              \"[x30]\");\n  TEST_SINGLE(ld4r<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30), \"ld4r {v26.1d, v27.1d, v28.1d, v29.1d}, \"\n                                                                                              \"[x30]\");\n\n  TEST_SINGLE(ld4r<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, QReg::q2, Reg::r30), \"ld4r {v31.16b, v0.16b, v1.16b, v2.16b}, [x30]\");\n  TEST_SINGLE(ld4r<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"ld4r {v26.16b, v27.16b, v28.16b, v29.16b}, \"\n                                                                                             \"[x30]\");\n  TEST_SINGLE(ld4r<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"ld4r {v26.8h, v27.8h, v28.8h, v29.8h}, \"\n                                                                                              \"[x30]\");\n  TEST_SINGLE(ld4r<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"ld4r {v26.4s, v27.4s, v28.4s, v29.4s}, \"\n                                                                                              \"[x30]\");\n  TEST_SINGLE(ld4r<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30), \"ld4r {v26.2d, v27.2d, v28.2d, v29.2d}, \"\n                                                                                              \"[x30]\");\n\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(VReg::v31, VReg::v0, VReg::v1, VReg::v2, 0, Reg::r30), \"st4 {v31.b, v0.b, v1.b, v2.b}[0], [x30]\");\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30), \"st4 {v26.b, v27.b, v28.b, v29.b}[0], \"\n                                                                                               \"[x30]\");\n  TEST_SINGLE(st4<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30), \"st4 {v26.h, v27.h, v28.h, v29.h}[0], \"\n                                                                                                \"[x30]\");\n  TEST_SINGLE(st4<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30), \"st4 {v26.s, v27.s, v28.s, v29.s}[0], \"\n                                                                                                \"[x30]\");\n  TEST_SINGLE(st4<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30), \"st4 {v26.d, v27.d, v28.d, v29.d}[0], \"\n                                                                                                \"[x30]\");\n\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 15, Reg::r30), \"st4 {v26.b, v27.b, v28.b, v29.b}[15], \"\n                                                                                                \"[x30]\");\n  TEST_SINGLE(st4<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 7, Reg::r30), \"st4 {v26.h, v27.h, v28.h, v29.h}[7], \"\n                                                                                                \"[x30]\");\n  TEST_SINGLE(st4<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 3, Reg::r30), \"st4 {v26.s, v27.s, v28.s, v29.s}[3], \"\n                                                                                                \"[x30]\");\n  TEST_SINGLE(st4<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 1, Reg::r30), \"st4 {v26.d, v27.d, v28.d, v29.d}[1], \"\n                                                                                                \"[x30]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Advanced SIMD load/store single structure (post-indexed)\") {\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(VReg::v26, 0, Reg::r30, 1), \"ld1 {v26.b}[0], [x30], #1\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(VReg::v26, 0, Reg::r30, 2), \"ld1 {v26.h}[0], [x30], #2\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(VReg::v26, 0, Reg::r30, 4), \"ld1 {v26.s}[0], [x30], #4\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(VReg::v26, 0, Reg::r30, 8), \"ld1 {v26.d}[0], [x30], #8\");\n\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(VReg::v26, 15, Reg::r30, 1), \"ld1 {v26.b}[15], [x30], #1\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(VReg::v26, 7, Reg::r30, 2), \"ld1 {v26.h}[7], [x30], #2\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(VReg::v26, 3, Reg::r30, 4), \"ld1 {v26.s}[3], [x30], #4\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(VReg::v26, 1, Reg::r30, 8), \"ld1 {v26.d}[1], [x30], #8\");\n\n  TEST_SINGLE(ld1r<SubRegSize::i8Bit>(DReg::d26, Reg::r30, 1), \"ld1r {v26.8b}, [x30], #1\");\n  TEST_SINGLE(ld1r<SubRegSize::i16Bit>(DReg::d26, Reg::r30, 2), \"ld1r {v26.4h}, [x30], #2\");\n  TEST_SINGLE(ld1r<SubRegSize::i32Bit>(DReg::d26, Reg::r30, 4), \"ld1r {v26.2s}, [x30], #4\");\n  TEST_SINGLE(ld1r<SubRegSize::i64Bit>(DReg::d26, Reg::r30, 8), \"ld1r {v26.1d}, [x30], #8\");\n\n  TEST_SINGLE(ld1r<SubRegSize::i8Bit>(QReg::q26, Reg::r30, 1), \"ld1r {v26.16b}, [x30], #1\");\n  TEST_SINGLE(ld1r<SubRegSize::i16Bit>(QReg::q26, Reg::r30, 2), \"ld1r {v26.8h}, [x30], #2\");\n  TEST_SINGLE(ld1r<SubRegSize::i32Bit>(QReg::q26, Reg::r30, 4), \"ld1r {v26.4s}, [x30], #4\");\n  TEST_SINGLE(ld1r<SubRegSize::i64Bit>(QReg::q26, Reg::r30, 8), \"ld1r {v26.2d}, [x30], #8\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(VReg::v26, 0, Reg::r30, 1), \"st1 {v26.b}[0], [x30], #1\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(VReg::v26, 0, Reg::r30, 2), \"st1 {v26.h}[0], [x30], #2\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(VReg::v26, 0, Reg::r30, 4), \"st1 {v26.s}[0], [x30], #4\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(VReg::v26, 0, Reg::r30, 8), \"st1 {v26.d}[0], [x30], #8\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(VReg::v26, 15, Reg::r30, 1), \"st1 {v26.b}[15], [x30], #1\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(VReg::v26, 7, Reg::r30, 2), \"st1 {v26.h}[7], [x30], #2\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(VReg::v26, 3, Reg::r30, 4), \"st1 {v26.s}[3], [x30], #4\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(VReg::v26, 1, Reg::r30, 8), \"st1 {v26.d}[1], [x30], #8\");\n\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(VReg::v31, VReg::v0, 0, Reg::r30, 2), \"ld2 {v31.b, v0.b}[0], [x30], #2\");\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(VReg::v26, VReg::v27, 0, Reg::r30, 2), \"ld2 {v26.b, v27.b}[0], [x30], #2\");\n  TEST_SINGLE(ld2<SubRegSize::i16Bit>(VReg::v26, VReg::v27, 0, Reg::r30, 4), \"ld2 {v26.h, v27.h}[0], [x30], #4\");\n  TEST_SINGLE(ld2<SubRegSize::i32Bit>(VReg::v26, VReg::v27, 0, Reg::r30, 8), \"ld2 {v26.s, v27.s}[0], [x30], #8\");\n  TEST_SINGLE(ld2<SubRegSize::i64Bit>(VReg::v26, VReg::v27, 0, Reg::r30, 16), \"ld2 {v26.d, v27.d}[0], [x30], #16\");\n\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(VReg::v26, VReg::v27, 15, Reg::r30, 2), \"ld2 {v26.b, v27.b}[15], [x30], #2\");\n  TEST_SINGLE(ld2<SubRegSize::i16Bit>(VReg::v26, VReg::v27, 7, Reg::r30, 4), \"ld2 {v26.h, v27.h}[7], [x30], #4\");\n  TEST_SINGLE(ld2<SubRegSize::i32Bit>(VReg::v26, VReg::v27, 3, Reg::r30, 8), \"ld2 {v26.s, v27.s}[3], [x30], #8\");\n  TEST_SINGLE(ld2<SubRegSize::i64Bit>(VReg::v26, VReg::v27, 1, Reg::r30, 16), \"ld2 {v26.d, v27.d}[1], [x30], #16\");\n\n  TEST_SINGLE(ld2r<SubRegSize::i8Bit>(DReg::d31, DReg::d0, Reg::r30, 2), \"ld2r {v31.8b, v0.8b}, [x30], #2\");\n  TEST_SINGLE(ld2r<SubRegSize::i8Bit>(DReg::d26, DReg::d27, Reg::r30, 2), \"ld2r {v26.8b, v27.8b}, [x30], #2\");\n  TEST_SINGLE(ld2r<SubRegSize::i16Bit>(DReg::d26, DReg::d27, Reg::r30, 4), \"ld2r {v26.4h, v27.4h}, [x30], #4\");\n  TEST_SINGLE(ld2r<SubRegSize::i32Bit>(DReg::d26, DReg::d27, Reg::r30, 8), \"ld2r {v26.2s, v27.2s}, [x30], #8\");\n  TEST_SINGLE(ld2r<SubRegSize::i64Bit>(DReg::d26, DReg::d27, Reg::r30, 16), \"ld2r {v26.1d, v27.1d}, [x30], #16\");\n\n  TEST_SINGLE(ld2r<SubRegSize::i8Bit>(QReg::q31, QReg::q0, Reg::r30, 2), \"ld2r {v31.16b, v0.16b}, [x30], #2\");\n  TEST_SINGLE(ld2r<SubRegSize::i8Bit>(QReg::q26, QReg::q27, Reg::r30, 2), \"ld2r {v26.16b, v27.16b}, [x30], #2\");\n  TEST_SINGLE(ld2r<SubRegSize::i16Bit>(QReg::q26, QReg::q27, Reg::r30, 4), \"ld2r {v26.8h, v27.8h}, [x30], #4\");\n  TEST_SINGLE(ld2r<SubRegSize::i32Bit>(QReg::q26, QReg::q27, Reg::r30, 8), \"ld2r {v26.4s, v27.4s}, [x30], #8\");\n  TEST_SINGLE(ld2r<SubRegSize::i64Bit>(QReg::q26, QReg::q27, Reg::r30, 16), \"ld2r {v26.2d, v27.2d}, [x30], #16\");\n\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(VReg::v31, VReg::v0, 0, Reg::r30, 2), \"st2 {v31.b, v0.b}[0], [x30], #2\");\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(VReg::v26, VReg::v27, 0, Reg::r30, 2), \"st2 {v26.b, v27.b}[0], [x30], #2\");\n  TEST_SINGLE(st2<SubRegSize::i16Bit>(VReg::v26, VReg::v27, 0, Reg::r30, 4), \"st2 {v26.h, v27.h}[0], [x30], #4\");\n  TEST_SINGLE(st2<SubRegSize::i32Bit>(VReg::v26, VReg::v27, 0, Reg::r30, 8), \"st2 {v26.s, v27.s}[0], [x30], #8\");\n  TEST_SINGLE(st2<SubRegSize::i64Bit>(VReg::v26, VReg::v27, 0, Reg::r30, 16), \"st2 {v26.d, v27.d}[0], [x30], #16\");\n\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(VReg::v26, VReg::v27, 15, Reg::r30, 2), \"st2 {v26.b, v27.b}[15], [x30], #2\");\n  TEST_SINGLE(st2<SubRegSize::i16Bit>(VReg::v26, VReg::v27, 7, Reg::r30, 4), \"st2 {v26.h, v27.h}[7], [x30], #4\");\n  TEST_SINGLE(st2<SubRegSize::i32Bit>(VReg::v26, VReg::v27, 3, Reg::r30, 8), \"st2 {v26.s, v27.s}[3], [x30], #8\");\n  TEST_SINGLE(st2<SubRegSize::i64Bit>(VReg::v26, VReg::v27, 1, Reg::r30, 16), \"st2 {v26.d, v27.d}[1], [x30], #16\");\n\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(VReg::v31, VReg::v0, VReg::v1, 0, Reg::r30, 3), \"ld3 {v31.b, v0.b, v1.b}[0], [x30], #3\");\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, 3), \"ld3 {v26.b, v27.b, v28.b}[0], [x30], #3\");\n  TEST_SINGLE(ld3<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, 6), \"ld3 {v26.h, v27.h, v28.h}[0], [x30], #6\");\n  TEST_SINGLE(ld3<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, 12), \"ld3 {v26.s, v27.s, v28.s}[0], [x30], #12\");\n  TEST_SINGLE(ld3<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, 24), \"ld3 {v26.d, v27.d, v28.d}[0], [x30], #24\");\n\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, 15, Reg::r30, 3), \"ld3 {v26.b, v27.b, v28.b}[15], [x30], #3\");\n  TEST_SINGLE(ld3<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, 7, Reg::r30, 6), \"ld3 {v26.h, v27.h, v28.h}[7], [x30], #6\");\n  TEST_SINGLE(ld3<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, 3, Reg::r30, 12), \"ld3 {v26.s, v27.s, v28.s}[3], [x30], #12\");\n  TEST_SINGLE(ld3<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, 1, Reg::r30, 24), \"ld3 {v26.d, v27.d, v28.d}[1], [x30], #24\");\n\n  TEST_SINGLE(ld3r<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, Reg::r30, 3), \"ld3r {v31.8b, v0.8b, v1.8b}, [x30], #3\");\n  TEST_SINGLE(ld3r<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 3), \"ld3r {v26.8b, v27.8b, v28.8b}, [x30], #3\");\n  TEST_SINGLE(ld3r<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 6), \"ld3r {v26.4h, v27.4h, v28.4h}, [x30], #6\");\n  TEST_SINGLE(ld3r<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 12), \"ld3r {v26.2s, v27.2s, v28.2s}, [x30], #12\");\n  TEST_SINGLE(ld3r<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, 24), \"ld3r {v26.1d, v27.1d, v28.1d}, [x30], #24\");\n\n  TEST_SINGLE(ld3r<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, Reg::r30, 3), \"ld3r {v31.16b, v0.16b, v1.16b}, [x30], #3\");\n  TEST_SINGLE(ld3r<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 3), \"ld3r {v26.16b, v27.16b, v28.16b}, [x30], #3\");\n  TEST_SINGLE(ld3r<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 6), \"ld3r {v26.8h, v27.8h, v28.8h}, [x30], #6\");\n  TEST_SINGLE(ld3r<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 12), \"ld3r {v26.4s, v27.4s, v28.4s}, [x30], #12\");\n  TEST_SINGLE(ld3r<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, 24), \"ld3r {v26.2d, v27.2d, v28.2d}, [x30], #24\");\n\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(VReg::v31, VReg::v0, VReg::v1, 0, Reg::r30, 3), \"st3 {v31.b, v0.b, v1.b}[0], [x30], #3\");\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, 3), \"st3 {v26.b, v27.b, v28.b}[0], [x30], #3\");\n  TEST_SINGLE(st3<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, 6), \"st3 {v26.h, v27.h, v28.h}[0], [x30], #6\");\n  TEST_SINGLE(st3<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, 12), \"st3 {v26.s, v27.s, v28.s}[0], [x30], #12\");\n  TEST_SINGLE(st3<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, 24), \"st3 {v26.d, v27.d, v28.d}[0], [x30], #24\");\n\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, 15, Reg::r30, 3), \"st3 {v26.b, v27.b, v28.b}[15], [x30], #3\");\n  TEST_SINGLE(st3<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, 7, Reg::r30, 6), \"st3 {v26.h, v27.h, v28.h}[7], [x30], #6\");\n  TEST_SINGLE(st3<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, 3, Reg::r30, 12), \"st3 {v26.s, v27.s, v28.s}[3], [x30], #12\");\n  TEST_SINGLE(st3<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, 1, Reg::r30, 24), \"st3 {v26.d, v27.d, v28.d}[1], [x30], #24\");\n\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(VReg::v31, VReg::v0, VReg::v1, VReg::v2, 0, Reg::r30, 4), \"ld4 {v31.b, v0.b, v1.b, v2.b}[0], [x30], \"\n                                                                                               \"#4\");\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, 4), \"ld4 {v26.b, v27.b, v28.b, v29.b}[0], \"\n                                                                                                  \"[x30], #4\");\n  TEST_SINGLE(ld4<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, 8), \"ld4 {v26.h, v27.h, v28.h, v29.h}[0], \"\n                                                                                                   \"[x30], #8\");\n  TEST_SINGLE(ld4<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, 16), \"ld4 {v26.s, v27.s, v28.s, v29.s}[0], \"\n                                                                                                    \"[x30], #16\");\n  TEST_SINGLE(ld4<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, 32), \"ld4 {v26.d, v27.d, v28.d, v29.d}[0], \"\n                                                                                                    \"[x30], #32\");\n\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 15, Reg::r30, 4), \"ld4 {v26.b, v27.b, v28.b, v29.b}[15], \"\n                                                                                                   \"[x30], #4\");\n  TEST_SINGLE(ld4<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 7, Reg::r30, 8), \"ld4 {v26.h, v27.h, v28.h, v29.h}[7], \"\n                                                                                                   \"[x30], #8\");\n  TEST_SINGLE(ld4<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 3, Reg::r30, 16), \"ld4 {v26.s, v27.s, v28.s, v29.s}[3], \"\n                                                                                                    \"[x30], #16\");\n  TEST_SINGLE(ld4<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 1, Reg::r30, 32), \"ld4 {v26.d, v27.d, v28.d, v29.d}[1], \"\n                                                                                                    \"[x30], #32\");\n\n  TEST_SINGLE(ld4r<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, DReg::d2, Reg::r30, 4), \"ld4r {v31.8b, v0.8b, v1.8b, v2.8b}, [x30], \"\n                                                                                             \"#4\");\n  TEST_SINGLE(ld4r<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 4), \"ld4r {v26.8b, v27.8b, v28.8b, v29.8b}, \"\n                                                                                                \"[x30], #4\");\n  TEST_SINGLE(ld4r<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 8), \"ld4r {v26.4h, v27.4h, v28.4h, v29.4h}, \"\n                                                                                                 \"[x30], #8\");\n  TEST_SINGLE(ld4r<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 16), \"ld4r {v26.2s, v27.2s, v28.2s, v29.2s}, \"\n                                                                                                  \"[x30], #16\");\n  TEST_SINGLE(ld4r<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, 32), \"ld4r {v26.1d, v27.1d, v28.1d, v29.1d}, \"\n                                                                                                  \"[x30], #32\");\n\n  TEST_SINGLE(ld4r<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, QReg::q2, Reg::r30, 4), \"ld4r {v31.16b, v0.16b, v1.16b, v2.16b}, \"\n                                                                                             \"[x30], #4\");\n  TEST_SINGLE(ld4r<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 4), \"ld4r {v26.16b, v27.16b, v28.16b, \"\n                                                                                                \"v29.16b}, [x30], #4\");\n  TEST_SINGLE(ld4r<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 8), \"ld4r {v26.8h, v27.8h, v28.8h, v29.8h}, \"\n                                                                                                 \"[x30], #8\");\n  TEST_SINGLE(ld4r<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 16), \"ld4r {v26.4s, v27.4s, v28.4s, v29.4s}, \"\n                                                                                                  \"[x30], #16\");\n  TEST_SINGLE(ld4r<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, 32), \"ld4r {v26.2d, v27.2d, v28.2d, v29.2d}, \"\n                                                                                                  \"[x30], #32\");\n\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(VReg::v31, VReg::v0, VReg::v1, VReg::v2, 0, Reg::r30, 4), \"st4 {v31.b, v0.b, v1.b, v2.b}[0], [x30], \"\n                                                                                               \"#4\");\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, 4), \"st4 {v26.b, v27.b, v28.b, v29.b}[0], \"\n                                                                                                  \"[x30], #4\");\n  TEST_SINGLE(st4<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, 8), \"st4 {v26.h, v27.h, v28.h, v29.h}[0], \"\n                                                                                                   \"[x30], #8\");\n  TEST_SINGLE(st4<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, 16), \"st4 {v26.s, v27.s, v28.s, v29.s}[0], \"\n                                                                                                    \"[x30], #16\");\n  TEST_SINGLE(st4<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, 32), \"st4 {v26.d, v27.d, v28.d, v29.d}[0], \"\n                                                                                                    \"[x30], #32\");\n\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 15, Reg::r30, 4), \"st4 {v26.b, v27.b, v28.b, v29.b}[15], \"\n                                                                                                   \"[x30], #4\");\n  TEST_SINGLE(st4<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 7, Reg::r30, 8), \"st4 {v26.h, v27.h, v28.h, v29.h}[7], \"\n                                                                                                   \"[x30], #8\");\n  TEST_SINGLE(st4<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 3, Reg::r30, 16), \"st4 {v26.s, v27.s, v28.s, v29.s}[3], \"\n                                                                                                    \"[x30], #16\");\n  TEST_SINGLE(st4<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 1, Reg::r30, 32), \"st4 {v26.d, v27.d, v28.d, v29.d}[1], \"\n                                                                                                    \"[x30], #32\");\n\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(VReg::v26, 0, Reg::r30, Reg::r29), \"ld1 {v26.b}[0], [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(VReg::v26, 0, Reg::r30, Reg::r29), \"ld1 {v26.h}[0], [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(VReg::v26, 0, Reg::r30, Reg::r29), \"ld1 {v26.s}[0], [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(VReg::v26, 0, Reg::r30, Reg::r29), \"ld1 {v26.d}[0], [x30], x29\");\n\n  TEST_SINGLE(ld1<SubRegSize::i8Bit>(VReg::v26, 15, Reg::r30, Reg::r29), \"ld1 {v26.b}[15], [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i16Bit>(VReg::v26, 7, Reg::r30, Reg::r29), \"ld1 {v26.h}[7], [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i32Bit>(VReg::v26, 3, Reg::r30, Reg::r29), \"ld1 {v26.s}[3], [x30], x29\");\n  TEST_SINGLE(ld1<SubRegSize::i64Bit>(VReg::v26, 1, Reg::r30, Reg::r29), \"ld1 {v26.d}[1], [x30], x29\");\n\n  TEST_SINGLE(ld1r<SubRegSize::i8Bit>(DReg::d26, Reg::r30, Reg::r29), \"ld1r {v26.8b}, [x30], x29\");\n  TEST_SINGLE(ld1r<SubRegSize::i16Bit>(DReg::d26, Reg::r30, Reg::r29), \"ld1r {v26.4h}, [x30], x29\");\n  TEST_SINGLE(ld1r<SubRegSize::i32Bit>(DReg::d26, Reg::r30, Reg::r29), \"ld1r {v26.2s}, [x30], x29\");\n  TEST_SINGLE(ld1r<SubRegSize::i64Bit>(DReg::d26, Reg::r30, Reg::r29), \"ld1r {v26.1d}, [x30], x29\");\n\n  TEST_SINGLE(ld1r<SubRegSize::i8Bit>(QReg::q26, Reg::r30, Reg::r29), \"ld1r {v26.16b}, [x30], x29\");\n  TEST_SINGLE(ld1r<SubRegSize::i16Bit>(QReg::q26, Reg::r30, Reg::r29), \"ld1r {v26.8h}, [x30], x29\");\n  TEST_SINGLE(ld1r<SubRegSize::i32Bit>(QReg::q26, Reg::r30, Reg::r29), \"ld1r {v26.4s}, [x30], x29\");\n  TEST_SINGLE(ld1r<SubRegSize::i64Bit>(QReg::q26, Reg::r30, Reg::r29), \"ld1r {v26.2d}, [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(VReg::v26, 0, Reg::r30, Reg::r29), \"st1 {v26.b}[0], [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(VReg::v26, 0, Reg::r30, Reg::r29), \"st1 {v26.h}[0], [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(VReg::v26, 0, Reg::r30, Reg::r29), \"st1 {v26.s}[0], [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(VReg::v26, 0, Reg::r30, Reg::r29), \"st1 {v26.d}[0], [x30], x29\");\n\n  TEST_SINGLE(st1<SubRegSize::i8Bit>(VReg::v26, 15, Reg::r30, Reg::r29), \"st1 {v26.b}[15], [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i16Bit>(VReg::v26, 7, Reg::r30, Reg::r29), \"st1 {v26.h}[7], [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i32Bit>(VReg::v26, 3, Reg::r30, Reg::r29), \"st1 {v26.s}[3], [x30], x29\");\n  TEST_SINGLE(st1<SubRegSize::i64Bit>(VReg::v26, 1, Reg::r30, Reg::r29), \"st1 {v26.d}[1], [x30], x29\");\n\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(VReg::v31, VReg::v0, 0, Reg::r30, Reg::r29), \"ld2 {v31.b, v0.b}[0], [x30], x29\");\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(VReg::v26, VReg::v27, 0, Reg::r30, Reg::r29), \"ld2 {v26.b, v27.b}[0], [x30], x29\");\n  TEST_SINGLE(ld2<SubRegSize::i16Bit>(VReg::v26, VReg::v27, 0, Reg::r30, Reg::r29), \"ld2 {v26.h, v27.h}[0], [x30], x29\");\n  TEST_SINGLE(ld2<SubRegSize::i32Bit>(VReg::v26, VReg::v27, 0, Reg::r30, Reg::r29), \"ld2 {v26.s, v27.s}[0], [x30], x29\");\n  TEST_SINGLE(ld2<SubRegSize::i64Bit>(VReg::v26, VReg::v27, 0, Reg::r30, Reg::r29), \"ld2 {v26.d, v27.d}[0], [x30], x29\");\n\n  TEST_SINGLE(ld2<SubRegSize::i8Bit>(VReg::v26, VReg::v27, 15, Reg::r30, Reg::r29), \"ld2 {v26.b, v27.b}[15], [x30], x29\");\n  TEST_SINGLE(ld2<SubRegSize::i16Bit>(VReg::v26, VReg::v27, 7, Reg::r30, Reg::r29), \"ld2 {v26.h, v27.h}[7], [x30], x29\");\n  TEST_SINGLE(ld2<SubRegSize::i32Bit>(VReg::v26, VReg::v27, 3, Reg::r30, Reg::r29), \"ld2 {v26.s, v27.s}[3], [x30], x29\");\n  TEST_SINGLE(ld2<SubRegSize::i64Bit>(VReg::v26, VReg::v27, 1, Reg::r30, Reg::r29), \"ld2 {v26.d, v27.d}[1], [x30], x29\");\n\n  TEST_SINGLE(ld2r<SubRegSize::i8Bit>(DReg::d31, DReg::d0, Reg::r30, Reg::r29), \"ld2r {v31.8b, v0.8b}, [x30], x29\");\n  TEST_SINGLE(ld2r<SubRegSize::i8Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"ld2r {v26.8b, v27.8b}, [x30], x29\");\n  TEST_SINGLE(ld2r<SubRegSize::i16Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"ld2r {v26.4h, v27.4h}, [x30], x29\");\n  TEST_SINGLE(ld2r<SubRegSize::i32Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"ld2r {v26.2s, v27.2s}, [x30], x29\");\n  TEST_SINGLE(ld2r<SubRegSize::i64Bit>(DReg::d26, DReg::d27, Reg::r30, Reg::r29), \"ld2r {v26.1d, v27.1d}, [x30], x29\");\n\n  TEST_SINGLE(ld2r<SubRegSize::i8Bit>(QReg::q31, QReg::q0, Reg::r30, Reg::r29), \"ld2r {v31.16b, v0.16b}, [x30], x29\");\n  TEST_SINGLE(ld2r<SubRegSize::i8Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"ld2r {v26.16b, v27.16b}, [x30], x29\");\n  TEST_SINGLE(ld2r<SubRegSize::i16Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"ld2r {v26.8h, v27.8h}, [x30], x29\");\n  TEST_SINGLE(ld2r<SubRegSize::i32Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"ld2r {v26.4s, v27.4s}, [x30], x29\");\n  TEST_SINGLE(ld2r<SubRegSize::i64Bit>(QReg::q26, QReg::q27, Reg::r30, Reg::r29), \"ld2r {v26.2d, v27.2d}, [x30], x29\");\n\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(VReg::v31, VReg::v0, 0, Reg::r30, Reg::r29), \"st2 {v31.b, v0.b}[0], [x30], x29\");\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(VReg::v26, VReg::v27, 0, Reg::r30, Reg::r29), \"st2 {v26.b, v27.b}[0], [x30], x29\");\n  TEST_SINGLE(st2<SubRegSize::i16Bit>(VReg::v26, VReg::v27, 0, Reg::r30, Reg::r29), \"st2 {v26.h, v27.h}[0], [x30], x29\");\n  TEST_SINGLE(st2<SubRegSize::i32Bit>(VReg::v26, VReg::v27, 0, Reg::r30, Reg::r29), \"st2 {v26.s, v27.s}[0], [x30], x29\");\n  TEST_SINGLE(st2<SubRegSize::i64Bit>(VReg::v26, VReg::v27, 0, Reg::r30, Reg::r29), \"st2 {v26.d, v27.d}[0], [x30], x29\");\n\n  TEST_SINGLE(st2<SubRegSize::i8Bit>(VReg::v26, VReg::v27, 15, Reg::r30, Reg::r29), \"st2 {v26.b, v27.b}[15], [x30], x29\");\n  TEST_SINGLE(st2<SubRegSize::i16Bit>(VReg::v26, VReg::v27, 7, Reg::r30, Reg::r29), \"st2 {v26.h, v27.h}[7], [x30], x29\");\n  TEST_SINGLE(st2<SubRegSize::i32Bit>(VReg::v26, VReg::v27, 3, Reg::r30, Reg::r29), \"st2 {v26.s, v27.s}[3], [x30], x29\");\n  TEST_SINGLE(st2<SubRegSize::i64Bit>(VReg::v26, VReg::v27, 1, Reg::r30, Reg::r29), \"st2 {v26.d, v27.d}[1], [x30], x29\");\n\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(VReg::v31, VReg::v0, VReg::v1, 0, Reg::r30, Reg::r29), \"ld3 {v31.b, v0.b, v1.b}[0], [x30], x29\");\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, Reg::r29), \"ld3 {v26.b, v27.b, v28.b}[0], [x30], x29\");\n  TEST_SINGLE(ld3<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, Reg::r29), \"ld3 {v26.h, v27.h, v28.h}[0], [x30], x29\");\n  TEST_SINGLE(ld3<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, Reg::r29), \"ld3 {v26.s, v27.s, v28.s}[0], [x30], x29\");\n  TEST_SINGLE(ld3<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, Reg::r29), \"ld3 {v26.d, v27.d, v28.d}[0], [x30], x29\");\n\n  TEST_SINGLE(ld3<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, 15, Reg::r30, Reg::r29), \"ld3 {v26.b, v27.b, v28.b}[15], [x30], x29\");\n  TEST_SINGLE(ld3<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, 7, Reg::r30, Reg::r29), \"ld3 {v26.h, v27.h, v28.h}[7], [x30], x29\");\n  TEST_SINGLE(ld3<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, 3, Reg::r30, Reg::r29), \"ld3 {v26.s, v27.s, v28.s}[3], [x30], x29\");\n  TEST_SINGLE(ld3<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, 1, Reg::r30, Reg::r29), \"ld3 {v26.d, v27.d, v28.d}[1], [x30], x29\");\n\n  TEST_SINGLE(ld3r<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, Reg::r30, Reg::r29), \"ld3r {v31.8b, v0.8b, v1.8b}, [x30], x29\");\n  TEST_SINGLE(ld3r<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"ld3r {v26.8b, v27.8b, v28.8b}, [x30], x29\");\n  TEST_SINGLE(ld3r<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"ld3r {v26.4h, v27.4h, v28.4h}, [x30], x29\");\n  TEST_SINGLE(ld3r<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"ld3r {v26.2s, v27.2s, v28.2s}, [x30], x29\");\n  TEST_SINGLE(ld3r<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, Reg::r30, Reg::r29), \"ld3r {v26.1d, v27.1d, v28.1d}, [x30], x29\");\n\n  TEST_SINGLE(ld3r<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, Reg::r30, Reg::r29), \"ld3r {v31.16b, v0.16b, v1.16b}, [x30], x29\");\n  TEST_SINGLE(ld3r<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"ld3r {v26.16b, v27.16b, v28.16b}, [x30], x29\");\n  TEST_SINGLE(ld3r<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"ld3r {v26.8h, v27.8h, v28.8h}, [x30], x29\");\n  TEST_SINGLE(ld3r<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"ld3r {v26.4s, v27.4s, v28.4s}, [x30], x29\");\n  TEST_SINGLE(ld3r<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, Reg::r30, Reg::r29), \"ld3r {v26.2d, v27.2d, v28.2d}, [x30], x29\");\n\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(VReg::v31, VReg::v0, VReg::v1, 0, Reg::r30, Reg::r29), \"st3 {v31.b, v0.b, v1.b}[0], [x30], x29\");\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, Reg::r29), \"st3 {v26.b, v27.b, v28.b}[0], [x30], x29\");\n  TEST_SINGLE(st3<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, Reg::r29), \"st3 {v26.h, v27.h, v28.h}[0], [x30], x29\");\n  TEST_SINGLE(st3<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, Reg::r29), \"st3 {v26.s, v27.s, v28.s}[0], [x30], x29\");\n  TEST_SINGLE(st3<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, 0, Reg::r30, Reg::r29), \"st3 {v26.d, v27.d, v28.d}[0], [x30], x29\");\n\n  TEST_SINGLE(st3<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, 15, Reg::r30, Reg::r29), \"st3 {v26.b, v27.b, v28.b}[15], [x30], x29\");\n  TEST_SINGLE(st3<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, 7, Reg::r30, Reg::r29), \"st3 {v26.h, v27.h, v28.h}[7], [x30], x29\");\n  TEST_SINGLE(st3<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, 3, Reg::r30, Reg::r29), \"st3 {v26.s, v27.s, v28.s}[3], [x30], x29\");\n  TEST_SINGLE(st3<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, 1, Reg::r30, Reg::r29), \"st3 {v26.d, v27.d, v28.d}[1], [x30], x29\");\n\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(VReg::v31, VReg::v0, VReg::v1, VReg::v2, 0, Reg::r30, Reg::r29), \"ld4 {v31.b, v0.b, v1.b, v2.b}[0], \"\n                                                                                                      \"[x30], x29\");\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, Reg::r29), \"ld4 {v26.b, v27.b, v28.b, \"\n                                                                                                         \"v29.b}[0], [x30], x29\");\n  TEST_SINGLE(ld4<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, Reg::r29), \"ld4 {v26.h, v27.h, v28.h, \"\n                                                                                                          \"v29.h}[0], [x30], x29\");\n  TEST_SINGLE(ld4<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, Reg::r29), \"ld4 {v26.s, v27.s, v28.s, \"\n                                                                                                          \"v29.s}[0], [x30], x29\");\n  TEST_SINGLE(ld4<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, Reg::r29), \"ld4 {v26.d, v27.d, v28.d, \"\n                                                                                                          \"v29.d}[0], [x30], x29\");\n\n  TEST_SINGLE(ld4<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 15, Reg::r30, Reg::r29), \"ld4 {v26.b, v27.b, v28.b, \"\n                                                                                                          \"v29.b}[15], [x30], x29\");\n  TEST_SINGLE(ld4<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 7, Reg::r30, Reg::r29), \"ld4 {v26.h, v27.h, v28.h, \"\n                                                                                                          \"v29.h}[7], [x30], x29\");\n  TEST_SINGLE(ld4<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 3, Reg::r30, Reg::r29), \"ld4 {v26.s, v27.s, v28.s, \"\n                                                                                                          \"v29.s}[3], [x30], x29\");\n  TEST_SINGLE(ld4<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 1, Reg::r30, Reg::r29), \"ld4 {v26.d, v27.d, v28.d, \"\n                                                                                                          \"v29.d}[1], [x30], x29\");\n\n  TEST_SINGLE(ld4r<SubRegSize::i8Bit>(DReg::d31, DReg::d0, DReg::d1, DReg::d2, Reg::r30, Reg::r29), \"ld4r {v31.8b, v0.8b, v1.8b, v2.8b}, \"\n                                                                                                    \"[x30], x29\");\n  TEST_SINGLE(ld4r<SubRegSize::i8Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"ld4r {v26.8b, v27.8b, v28.8b, \"\n                                                                                                       \"v29.8b}, [x30], x29\");\n  TEST_SINGLE(ld4r<SubRegSize::i16Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"ld4r {v26.4h, v27.4h, v28.4h, \"\n                                                                                                        \"v29.4h}, [x30], x29\");\n  TEST_SINGLE(ld4r<SubRegSize::i32Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"ld4r {v26.2s, v27.2s, v28.2s, \"\n                                                                                                        \"v29.2s}, [x30], x29\");\n  TEST_SINGLE(ld4r<SubRegSize::i64Bit>(DReg::d26, DReg::d27, DReg::d28, DReg::d29, Reg::r30, Reg::r29), \"ld4r {v26.1d, v27.1d, v28.1d, \"\n                                                                                                        \"v29.1d}, [x30], x29\");\n\n  TEST_SINGLE(ld4r<SubRegSize::i8Bit>(QReg::q31, QReg::q0, QReg::q1, QReg::q2, Reg::r30, Reg::r29), \"ld4r {v31.16b, v0.16b, v1.16b, \"\n                                                                                                    \"v2.16b}, [x30], x29\");\n  TEST_SINGLE(ld4r<SubRegSize::i8Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"ld4r {v26.16b, v27.16b, v28.16b, \"\n                                                                                                       \"v29.16b}, [x30], x29\");\n  TEST_SINGLE(ld4r<SubRegSize::i16Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"ld4r {v26.8h, v27.8h, v28.8h, \"\n                                                                                                        \"v29.8h}, [x30], x29\");\n  TEST_SINGLE(ld4r<SubRegSize::i32Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"ld4r {v26.4s, v27.4s, v28.4s, \"\n                                                                                                        \"v29.4s}, [x30], x29\");\n  TEST_SINGLE(ld4r<SubRegSize::i64Bit>(QReg::q26, QReg::q27, QReg::q28, QReg::q29, Reg::r30, Reg::r29), \"ld4r {v26.2d, v27.2d, v28.2d, \"\n                                                                                                        \"v29.2d}, [x30], x29\");\n\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(VReg::v31, VReg::v0, VReg::v1, VReg::v2, 0, Reg::r30, Reg::r29), \"st4 {v31.b, v0.b, v1.b, v2.b}[0], \"\n                                                                                                      \"[x30], x29\");\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, Reg::r29), \"st4 {v26.b, v27.b, v28.b, \"\n                                                                                                         \"v29.b}[0], [x30], x29\");\n  TEST_SINGLE(st4<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, Reg::r29), \"st4 {v26.h, v27.h, v28.h, \"\n                                                                                                          \"v29.h}[0], [x30], x29\");\n  TEST_SINGLE(st4<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, Reg::r29), \"st4 {v26.s, v27.s, v28.s, \"\n                                                                                                          \"v29.s}[0], [x30], x29\");\n  TEST_SINGLE(st4<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 0, Reg::r30, Reg::r29), \"st4 {v26.d, v27.d, v28.d, \"\n                                                                                                          \"v29.d}[0], [x30], x29\");\n\n  TEST_SINGLE(st4<SubRegSize::i8Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 15, Reg::r30, Reg::r29), \"st4 {v26.b, v27.b, v28.b, \"\n                                                                                                          \"v29.b}[15], [x30], x29\");\n  TEST_SINGLE(st4<SubRegSize::i16Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 7, Reg::r30, Reg::r29), \"st4 {v26.h, v27.h, v28.h, \"\n                                                                                                          \"v29.h}[7], [x30], x29\");\n  TEST_SINGLE(st4<SubRegSize::i32Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 3, Reg::r30, Reg::r29), \"st4 {v26.s, v27.s, v28.s, \"\n                                                                                                          \"v29.s}[3], [x30], x29\");\n  TEST_SINGLE(st4<SubRegSize::i64Bit>(VReg::v26, VReg::v27, VReg::v28, VReg::v29, 1, Reg::r30, Reg::r29), \"st4 {v26.d, v27.d, v28.d, \"\n                                                                                                          \"v29.d}[1], [x30], x29\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Loadstore exclusive pair\") {\n  TEST_SINGLE(stxp(Size::i32Bit, Reg::r28, Reg::r29, Reg::r30, Reg::r28), \"stxp w28, w29, w30, [x28]\");\n  TEST_SINGLE(stxp(Size::i64Bit, Reg::r28, Reg::r29, Reg::r30, Reg::r28), \"stxp w28, x29, x30, [x28]\");\n\n  TEST_SINGLE(stlxp(Size::i32Bit, Reg::r28, Reg::r29, Reg::r30, Reg::r28), \"stlxp w28, w29, w30, [x28]\");\n  TEST_SINGLE(stlxp(Size::i64Bit, Reg::r28, Reg::r29, Reg::r30, Reg::r28), \"stlxp w28, x29, x30, [x28]\");\n\n  TEST_SINGLE(ldxp(Size::i32Bit, Reg::r29, Reg::r30, Reg::r28), \"ldxp w29, w30, [x28]\");\n  TEST_SINGLE(ldxp(Size::i64Bit, Reg::r29, Reg::r30, Reg::r28), \"ldxp x29, x30, [x28]\");\n\n  TEST_SINGLE(ldaxp(Size::i32Bit, Reg::r29, Reg::r30, Reg::r28), \"ldaxp w29, w30, [x28]\");\n  TEST_SINGLE(ldaxp(Size::i64Bit, Reg::r29, Reg::r30, Reg::r28), \"ldaxp x29, x30, [x28]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Loadstore exclusive register\") {\n  TEST_SINGLE(stxrb(Reg::r30, Reg::r29, Reg::r28), \"stxrb w30, w29, [x28]\");\n  TEST_SINGLE(stlxrb(Reg::r30, Reg::r29, Reg::r28), \"stlxrb w30, w29, [x28]\");\n\n  TEST_SINGLE(ldxrb(Reg::r30, Reg::r29), \"ldxrb w30, [x29]\");\n  TEST_SINGLE(ldaxrb(Reg::r30, Reg::r29), \"ldaxrb w30, [x29]\");\n\n  TEST_SINGLE(stxrh(Reg::r30, Reg::r29, Reg::r28), \"stxrh w30, w29, [x28]\");\n  TEST_SINGLE(stlxrh(Reg::r30, Reg::r29, Reg::r28), \"stlxrh w30, w29, [x28]\");\n\n  TEST_SINGLE(ldxrh(Reg::r30, Reg::r29), \"ldxrh w30, [x29]\");\n  TEST_SINGLE(ldaxrh(Reg::r30, Reg::r29), \"ldaxrh w30, [x29]\");\n\n  TEST_SINGLE(stxr(WReg::w30, WReg::w29, Reg::r28), \"stxr w30, w29, [x28]\");\n  TEST_SINGLE(stlxr(WReg::w30, WReg::w29, Reg::r28), \"stlxr w30, w29, [x28]\");\n\n  TEST_SINGLE(ldxr(WReg::w30, Reg::r29), \"ldxr w30, [x29]\");\n  TEST_SINGLE(ldaxr(WReg::w30, Reg::r29), \"ldaxr w30, [x29]\");\n\n  TEST_SINGLE(stxr(XReg::x30, XReg::x29, Reg::r28), \"stxr w30, x29, [x28]\");\n  TEST_SINGLE(stlxr(WReg::w30, XReg::x29, Reg::r28), \"stlxr w30, x29, [x28]\");\n\n  TEST_SINGLE(ldxr(XReg::x30, Reg::r29), \"ldxr x30, [x29]\");\n  TEST_SINGLE(ldaxr(XReg::x30, Reg::r29), \"ldaxr x30, [x29]\");\n\n  TEST_SINGLE(stxr(SubRegSize::i8Bit, Reg::r30, Reg::r29, Reg::r28), \"stxrb w30, w29, [x28]\");\n  TEST_SINGLE(stlxr(SubRegSize::i8Bit, Reg::r30, Reg::r29, Reg::r28), \"stlxrb w30, w29, [x28]\");\n  TEST_SINGLE(stxr(SubRegSize::i16Bit, Reg::r30, Reg::r29, Reg::r28), \"stxrh w30, w29, [x28]\");\n  TEST_SINGLE(stlxr(SubRegSize::i16Bit, Reg::r30, Reg::r29, Reg::r28), \"stlxrh w30, w29, [x28]\");\n  TEST_SINGLE(stxr(SubRegSize::i32Bit, Reg::r30, Reg::r29, Reg::r28), \"stxr w30, w29, [x28]\");\n  TEST_SINGLE(stlxr(SubRegSize::i32Bit, Reg::r30, Reg::r29, Reg::r28), \"stlxr w30, w29, [x28]\");\n  TEST_SINGLE(stxr(SubRegSize::i64Bit, Reg::r30, Reg::r29, Reg::r28), \"stxr w30, x29, [x28]\");\n  TEST_SINGLE(stlxr(SubRegSize::i64Bit, Reg::r30, Reg::r29, Reg::r28), \"stlxr w30, x29, [x28]\");\n\n  TEST_SINGLE(ldxr(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"ldxrb w30, [x29]\");\n  TEST_SINGLE(ldaxr(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"ldaxrb w30, [x29]\");\n  TEST_SINGLE(ldxr(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"ldxrh w30, [x29]\");\n  TEST_SINGLE(ldaxr(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"ldaxrh w30, [x29]\");\n  TEST_SINGLE(ldxr(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"ldxr w30, [x29]\");\n  TEST_SINGLE(ldaxr(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"ldaxr w30, [x29]\");\n  TEST_SINGLE(ldxr(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"ldxr x30, [x29]\");\n  TEST_SINGLE(ldaxr(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"ldaxr x30, [x29]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Load/store ordered\") {\n  TEST_SINGLE(stllrb(Reg::r30, Reg::r29), \"stllrb w30, [x29]\");\n  TEST_SINGLE(stlrb(Reg::r30, Reg::r29), \"stlrb w30, [x29]\");\n  TEST_SINGLE(ldlarb(Reg::r30, Reg::r29), \"ldlarb w30, [x29]\");\n  TEST_SINGLE(ldarb(Reg::r30, Reg::r29), \"ldarb w30, [x29]\");\n\n  TEST_SINGLE(stllrh(Reg::r30, Reg::r29), \"stllrh w30, [x29]\");\n  TEST_SINGLE(stlrh(Reg::r30, Reg::r29), \"stlrh w30, [x29]\");\n  TEST_SINGLE(ldlarh(Reg::r30, Reg::r29), \"ldlarh w30, [x29]\");\n  TEST_SINGLE(ldarh(Reg::r30, Reg::r29), \"ldarh w30, [x29]\");\n\n  TEST_SINGLE(stllr(WReg::w30, Reg::r29), \"stllr w30, [x29]\");\n  TEST_SINGLE(stlr(WReg::w30, Reg::r29), \"stlr w30, [x29]\");\n  TEST_SINGLE(ldlar(WReg::w30, Reg::r29), \"ldlar w30, [x29]\");\n  TEST_SINGLE(ldar(WReg::w30, Reg::r29), \"ldar w30, [x29]\");\n\n  TEST_SINGLE(stllr(XReg::x30, Reg::r29), \"stllr x30, [x29]\");\n  TEST_SINGLE(stlr(XReg::x30, Reg::r29), \"stlr x30, [x29]\");\n  TEST_SINGLE(ldlar(XReg::x30, Reg::r29), \"ldlar x30, [x29]\");\n  TEST_SINGLE(ldar(XReg::x30, Reg::r29), \"ldar x30, [x29]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Compare and swap\") {\n  TEST_SINGLE(casb(Reg::r30, Reg::r29, Reg::r28), \"casb w30, w29, [x28]\");\n  TEST_SINGLE(caslb(Reg::r30, Reg::r29, Reg::r28), \"caslb w30, w29, [x28]\");\n  TEST_SINGLE(casab(Reg::r30, Reg::r29, Reg::r28), \"casab w30, w29, [x28]\");\n  TEST_SINGLE(casalb(Reg::r30, Reg::r29, Reg::r28), \"casalb w30, w29, [x28]\");\n\n  TEST_SINGLE(cash(Reg::r30, Reg::r29, Reg::r28), \"cash w30, w29, [x28]\");\n  TEST_SINGLE(caslh(Reg::r30, Reg::r29, Reg::r28), \"caslh w30, w29, [x28]\");\n  TEST_SINGLE(casah(Reg::r30, Reg::r29, Reg::r28), \"casah w30, w29, [x28]\");\n  TEST_SINGLE(casalh(Reg::r30, Reg::r29, Reg::r28), \"casalh w30, w29, [x28]\");\n\n  TEST_SINGLE(cas(WReg::w30, WReg::w29, Reg::r28), \"cas w30, w29, [x28]\");\n  TEST_SINGLE(casl(WReg::w30, WReg::w29, Reg::r28), \"casl w30, w29, [x28]\");\n  TEST_SINGLE(casa(WReg::w30, WReg::w29, Reg::r28), \"casa w30, w29, [x28]\");\n  TEST_SINGLE(casal(WReg::w30, WReg::w29, Reg::r28), \"casal w30, w29, [x28]\");\n\n  TEST_SINGLE(cas(XReg::x30, XReg::x29, Reg::r28), \"cas x30, x29, [x28]\");\n  TEST_SINGLE(casl(XReg::x30, XReg::x29, Reg::r28), \"casl x30, x29, [x28]\");\n  TEST_SINGLE(casa(XReg::x30, XReg::x29, Reg::r28), \"casa x30, x29, [x28]\");\n  TEST_SINGLE(casal(XReg::x30, XReg::x29, Reg::r28), \"casal x30, x29, [x28]\");\n\n  TEST_SINGLE(cas(SubRegSize::i8Bit, Reg::r30, Reg::r29, Reg::r28), \"casb w30, w29, [x28]\");\n  TEST_SINGLE(cas(SubRegSize::i16Bit, Reg::r30, Reg::r29, Reg::r28), \"cash w30, w29, [x28]\");\n  TEST_SINGLE(cas(SubRegSize::i32Bit, Reg::r30, Reg::r29, Reg::r28), \"cas w30, w29, [x28]\");\n  TEST_SINGLE(cas(SubRegSize::i64Bit, Reg::r30, Reg::r29, Reg::r28), \"cas x30, x29, [x28]\");\n\n  TEST_SINGLE(casl(SubRegSize::i8Bit, Reg::r30, Reg::r29, Reg::r28), \"caslb w30, w29, [x28]\");\n  TEST_SINGLE(casl(SubRegSize::i16Bit, Reg::r30, Reg::r29, Reg::r28), \"caslh w30, w29, [x28]\");\n  TEST_SINGLE(casl(SubRegSize::i32Bit, Reg::r30, Reg::r29, Reg::r28), \"casl w30, w29, [x28]\");\n  TEST_SINGLE(casl(SubRegSize::i64Bit, Reg::r30, Reg::r29, Reg::r28), \"casl x30, x29, [x28]\");\n\n  TEST_SINGLE(casa(SubRegSize::i8Bit, Reg::r30, Reg::r29, Reg::r28), \"casab w30, w29, [x28]\");\n  TEST_SINGLE(casa(SubRegSize::i16Bit, Reg::r30, Reg::r29, Reg::r28), \"casah w30, w29, [x28]\");\n  TEST_SINGLE(casa(SubRegSize::i32Bit, Reg::r30, Reg::r29, Reg::r28), \"casa w30, w29, [x28]\");\n  TEST_SINGLE(casa(SubRegSize::i64Bit, Reg::r30, Reg::r29, Reg::r28), \"casa x30, x29, [x28]\");\n\n  TEST_SINGLE(casal(SubRegSize::i8Bit, Reg::r30, Reg::r29, Reg::r28), \"casalb w30, w29, [x28]\");\n  TEST_SINGLE(casal(SubRegSize::i16Bit, Reg::r30, Reg::r29, Reg::r28), \"casalh w30, w29, [x28]\");\n  TEST_SINGLE(casal(SubRegSize::i32Bit, Reg::r30, Reg::r29, Reg::r28), \"casal w30, w29, [x28]\");\n  TEST_SINGLE(casal(SubRegSize::i64Bit, Reg::r30, Reg::r29, Reg::r28), \"casal x30, x29, [x28]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: LDAPR/STLR unscaled immediate\") {\n  TEST_SINGLE(stlurb(Reg::r30, Reg::r29, -256), \"stlurb w30, [x29, #-256]\");\n  TEST_SINGLE(stlurb(Reg::r30, Reg::r29, 255), \"stlurb w30, [x29, #255]\");\n\n  TEST_SINGLE(ldapurb(Reg::r30, Reg::r29, -256), \"ldapurb w30, [x29, #-256]\");\n  TEST_SINGLE(ldapurb(Reg::r30, Reg::r29, 255), \"ldapurb w30, [x29, #255]\");\n\n  TEST_SINGLE(ldapursb(WReg::w30, Reg::r29, -256), \"ldapursb w30, [x29, #-256]\");\n  TEST_SINGLE(ldapursb(WReg::w30, Reg::r29, 255), \"ldapursb w30, [x29, #255]\");\n  TEST_SINGLE(ldapursb(XReg::x30, Reg::r29, -256), \"ldapursb x30, [x29, #-256]\");\n  TEST_SINGLE(ldapursb(XReg::x30, Reg::r29, 255), \"ldapursb x30, [x29, #255]\");\n\n  TEST_SINGLE(stlurh(Reg::r30, Reg::r29, -256), \"stlurh w30, [x29, #-256]\");\n  TEST_SINGLE(stlurh(Reg::r30, Reg::r29, 255), \"stlurh w30, [x29, #255]\");\n\n  TEST_SINGLE(ldapurh(Reg::r30, Reg::r29, -256), \"ldapurh w30, [x29, #-256]\");\n  TEST_SINGLE(ldapurh(Reg::r30, Reg::r29, 255), \"ldapurh w30, [x29, #255]\");\n\n  TEST_SINGLE(ldapursh(WReg::w30, Reg::r29, -256), \"ldapursh w30, [x29, #-256]\");\n  TEST_SINGLE(ldapursh(WReg::w30, Reg::r29, 255), \"ldapursh w30, [x29, #255]\");\n  TEST_SINGLE(ldapursh(XReg::x30, Reg::r29, -256), \"ldapursh x30, [x29, #-256]\");\n  TEST_SINGLE(ldapursh(XReg::x30, Reg::r29, 255), \"ldapursh x30, [x29, #255]\");\n\n  TEST_SINGLE(stlur(WReg::w30, Reg::r29, -256), \"stlur w30, [x29, #-256]\");\n  TEST_SINGLE(stlur(WReg::w30, Reg::r29, 255), \"stlur w30, [x29, #255]\");\n\n  TEST_SINGLE(ldapur(WReg::w30, Reg::r29, -256), \"ldapur w30, [x29, #-256]\");\n  TEST_SINGLE(ldapur(WReg::w30, Reg::r29, 255), \"ldapur w30, [x29, #255]\");\n\n  TEST_SINGLE(ldapursw(XReg::x30, Reg::r29, -256), \"ldapursw x30, [x29, #-256]\");\n  TEST_SINGLE(ldapursw(XReg::x30, Reg::r29, 255), \"ldapursw x30, [x29, #255]\");\n\n  TEST_SINGLE(stlur(XReg::x30, Reg::r29, -256), \"stlur x30, [x29, #-256]\");\n  TEST_SINGLE(stlur(XReg::x30, Reg::r29, 255), \"stlur x30, [x29, #255]\");\n\n  TEST_SINGLE(ldapur(XReg::x30, Reg::r29, -256), \"ldapur x30, [x29, #-256]\");\n  TEST_SINGLE(ldapur(XReg::x30, Reg::r29, 255), \"ldapur x30, [x29, #255]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Load register literal\") {\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    ldr(WReg::w30, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x18fffffe);\n  }\n\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    ldr(SReg::s30, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x1cfffffe);\n  }\n\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    ldr(XReg::x30, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x58fffffe);\n  }\n\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    ldr(DReg::d30, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x5cfffffe);\n  }\n\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    ldrsw(XReg::x30, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x98fffffe);\n  }\n\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    ldr(QReg::q30, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0x9cfffffe);\n  }\n\n  {\n    BackwardLabel Label;\n    (void)Bind(&Label);\n    dc32(0);\n    prfm(Prefetch::PLDL1KEEP, &Label);\n\n    CHECK(DisassembleEncoding(1) == 0xd8ffffe0);\n  }\n\n  {\n    ForwardLabel Label;\n    ldr(WReg::w30, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x1800003e);\n  }\n\n  {\n    ForwardLabel Label;\n    ldr(SReg::s30, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x1c00003e);\n  }\n\n  {\n    ForwardLabel Label;\n    ldr(XReg::x30, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x5800003e);\n  }\n\n  {\n    ForwardLabel Label;\n    ldr(DReg::d30, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x5c00003e);\n  }\n\n  {\n    ForwardLabel Label;\n    ldrsw(XReg::x30, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x9800003e);\n  }\n\n  {\n    ForwardLabel Label;\n    ldr(QReg::q30, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0x9c00003e);\n  }\n\n  {\n    ForwardLabel Label;\n    prfm(Prefetch::PLDL1KEEP, &Label);\n    (void)Bind(&Label);\n    dc32(0);\n\n    CHECK(DisassembleEncoding(0) == 0xd8000020);\n  }\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Memory copy/set\") {\n  // Note: Some of these aren't implemented in vixl at the moment, however\n  //       we supply the cases to change over to once they are. This is good,\n  //       because when we update, the unimplemented cases will naturally fail,\n  //       facilitating the switch.\n\n  TEST_SINGLE(cpyfp(XReg::x30, XReg::x28, XReg::x29), \"cpyfp [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyfp(XReg::x17, XReg::x20, XReg::x19), \"cpyfp [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpyfm(XReg::x30, XReg::x28, XReg::x29), \"cpyfm [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyfm(XReg::x17, XReg::x20, XReg::x19), \"cpyfm [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpyfe(XReg::x30, XReg::x28, XReg::x29), \"cpyfe [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyfe(XReg::x17, XReg::x20, XReg::x19), \"cpyfe [x17]!, [x20]!, x19!\");\n\n  // TEST_SINGLE(cpyfpwt(XReg::x30, XReg::x28, XReg::x29), \"cpyfpwt [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfpwt(XReg::x17, XReg::x20, XReg::x19), \"cpyfpwt [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfpwt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfpwt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfmwt(XReg::x30, XReg::x28, XReg::x29), \"cpyfmwt [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfmwt(XReg::x17, XReg::x20, XReg::x19), \"cpyfmwt [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfmwt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfmwt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfewt(XReg::x30, XReg::x28, XReg::x29), \"cpyfewt [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfewt(XReg::x17, XReg::x20, XReg::x19), \"cpyfewt [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfewt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfewt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfprt(XReg::x30, XReg::x28, XReg::x29), \"cpyfprt [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfprt(XReg::x17, XReg::x20, XReg::x19), \"cpyfprt [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfprt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfprt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfmrt(XReg::x30, XReg::x28, XReg::x29), \"cpyfmrt [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfmrt(XReg::x17, XReg::x20, XReg::x19), \"cpyfmrt [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfmrt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfmrt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfert(XReg::x30, XReg::x28, XReg::x29), \"cpyfert [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfert(XReg::x17, XReg::x20, XReg::x19), \"cpyfert [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfert(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfert(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfpt(XReg::x30, XReg::x28, XReg::x29), \"cpyfpt [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfpt(XReg::x17, XReg::x20, XReg::x19), \"cpyfpt [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfpt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfpt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfmt(XReg::x30, XReg::x28, XReg::x29), \"cpyfmt [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfmt(XReg::x17, XReg::x20, XReg::x19), \"cpyfmt [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfmt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfmt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfet(XReg::x30, XReg::x28, XReg::x29), \"cpyfet [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfet(XReg::x17, XReg::x20, XReg::x19), \"cpyfet [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfet(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfet(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  TEST_SINGLE(cpyfpwn(XReg::x30, XReg::x28, XReg::x29), \"cpyfpwn [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyfpwn(XReg::x17, XReg::x20, XReg::x19), \"cpyfpwn [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpyfmwn(XReg::x30, XReg::x28, XReg::x29), \"cpyfmwn [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyfmwn(XReg::x17, XReg::x20, XReg::x19), \"cpyfmwn [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpyfewn(XReg::x30, XReg::x28, XReg::x29), \"cpyfewn [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyfewn(XReg::x17, XReg::x20, XReg::x19), \"cpyfewn [x17]!, [x20]!, x19!\");\n\n  // TEST_SINGLE(cpyfpwtwn(XReg::x30, XReg::x28, XReg::x29), \"cpyfpwtwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfpwtwn(XReg::x17, XReg::x20, XReg::x19), \"cpyfpwtwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfpwtwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfpwtwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfmwtwn(XReg::x30, XReg::x28, XReg::x29), \"cpyfmwtwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfmwtwn(XReg::x17, XReg::x20, XReg::x19), \"cpyfmwtwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfmwtwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfmwtwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfewtwn(XReg::x30, XReg::x28, XReg::x29), \"cpyfewtwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfewtwn(XReg::x17, XReg::x20, XReg::x19), \"cpyfewtwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfewtwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfewtwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfprtwn(XReg::x30, XReg::x28, XReg::x29), \"cpyfprtwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfprtwn(XReg::x17, XReg::x20, XReg::x19), \"cpyfprtwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfprtwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfprtwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfmrtwn(XReg::x30, XReg::x28, XReg::x29), \"cpyfmrtwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfmrtwn(XReg::x17, XReg::x20, XReg::x19), \"cpyfmrtwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfmrtwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfmrtwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfertwn(XReg::x30, XReg::x28, XReg::x29), \"cpyfertwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfertwn(XReg::x17, XReg::x20, XReg::x19), \"cpyfertwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfertwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfertwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfptwn(XReg::x30, XReg::x28, XReg::x29), \"cpyfptwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfptwn(XReg::x17, XReg::x20, XReg::x19), \"cpyfptwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfptwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfptwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfmtwn(XReg::x30, XReg::x28, XReg::x29), \"cpyfmtwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfmtwn(XReg::x17, XReg::x20, XReg::x19), \"cpyfmtwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfmtwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfmtwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfetwn(XReg::x30, XReg::x28, XReg::x29), \"cpyfetwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfetwn(XReg::x17, XReg::x20, XReg::x19), \"cpyfetwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfetwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfetwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  TEST_SINGLE(cpyfprn(XReg::x30, XReg::x28, XReg::x29), \"cpyfprn [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyfprn(XReg::x17, XReg::x20, XReg::x19), \"cpyfprn [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpyfmrn(XReg::x30, XReg::x28, XReg::x29), \"cpyfmrn [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyfmrn(XReg::x17, XReg::x20, XReg::x19), \"cpyfmrn [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpyfern(XReg::x30, XReg::x28, XReg::x29), \"cpyfern [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyfern(XReg::x17, XReg::x20, XReg::x19), \"cpyfern [x17]!, [x20]!, x19!\");\n\n  // TEST_SINGLE(cpyfpwtrn(XReg::x30, XReg::x28, XReg::x29), \"cpyfpwtrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfpwtrn(XReg::x17, XReg::x20, XReg::x19), \"cpyfpwtrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfpwtrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfpwtrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfmwtrn(XReg::x30, XReg::x28, XReg::x29), \"cpyfmwtrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfmwtrn(XReg::x17, XReg::x20, XReg::x19), \"cpyfmwtrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfmwtrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfmwtrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfewtrn(XReg::x30, XReg::x28, XReg::x29), \"cpyfewtrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfewtrn(XReg::x17, XReg::x20, XReg::x19), \"cpyfewtrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfewtrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfewtrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfprtrn(XReg::x30, XReg::x28, XReg::x29), \"cpyfprtrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfprtrn(XReg::x17, XReg::x20, XReg::x19), \"cpyfprtrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfprtrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfprtrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfmrtrn(XReg::x30, XReg::x28, XReg::x29), \"cpyfmrtrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfmrtrn(XReg::x17, XReg::x20, XReg::x19), \"cpyfmrtrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfmrtrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfmrtrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfertrn(XReg::x30, XReg::x28, XReg::x29), \"cpyfertrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfertrn(XReg::x17, XReg::x20, XReg::x19), \"cpyfertrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfertrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfertrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfptrn(XReg::x30, XReg::x28, XReg::x29), \"cpyfptrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfptrn(XReg::x17, XReg::x20, XReg::x19), \"cpyfptrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfptrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfptrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfmtrn(XReg::x30, XReg::x28, XReg::x29), \"cpyfmtrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfmtrn(XReg::x17, XReg::x20, XReg::x19), \"cpyfmtrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfmtrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfmtrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfetrn(XReg::x30, XReg::x28, XReg::x29), \"cpyfetrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfetrn(XReg::x17, XReg::x20, XReg::x19), \"cpyfetrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfetrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfetrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  TEST_SINGLE(cpyfpn(XReg::x30, XReg::x28, XReg::x29), \"cpyfpn [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyfpn(XReg::x17, XReg::x20, XReg::x19), \"cpyfpn [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpyfmn(XReg::x30, XReg::x28, XReg::x29), \"cpyfmn [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyfmn(XReg::x17, XReg::x20, XReg::x19), \"cpyfmn [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpyfen(XReg::x30, XReg::x28, XReg::x29), \"cpyfen [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyfen(XReg::x17, XReg::x20, XReg::x19), \"cpyfen [x17]!, [x20]!, x19!\");\n\n  // TEST_SINGLE(cpyfpwtn(XReg::x30, XReg::x28, XReg::x29), \"cpyfpwtn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfpwtn(XReg::x17, XReg::x20, XReg::x19), \"cpyfpwtn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfpwtn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfpwtn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfmwtn(XReg::x30, XReg::x28, XReg::x29), \"cpyfmwtn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfmwtn(XReg::x17, XReg::x20, XReg::x19), \"cpyfmwtn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfmwtn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfmwtn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfewtn(XReg::x30, XReg::x28, XReg::x29), \"cpyfewtn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfewtn(XReg::x17, XReg::x20, XReg::x19), \"cpyfewtn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfewtn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfewtn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfprtn(XReg::x30, XReg::x28, XReg::x29), \"cpyfprtn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfprtn(XReg::x17, XReg::x20, XReg::x19), \"cpyfprtn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfprtn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfprtn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfmrtn(XReg::x30, XReg::x28, XReg::x29), \"cpyfmrtn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfmrtn(XReg::x17, XReg::x20, XReg::x19), \"cpyfmrtn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfmrtn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfmrtn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfertn(XReg::x30, XReg::x28, XReg::x29), \"cpyfertn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfertn(XReg::x17, XReg::x20, XReg::x19), \"cpyfertn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfertn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfertn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfptn(XReg::x30, XReg::x28, XReg::x29), \"cpyfptn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfptn(XReg::x17, XReg::x20, XReg::x19), \"cpyfptn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfptn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfptn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfmtn(XReg::x30, XReg::x28, XReg::x29), \"cpyfmtn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfmtn(XReg::x17, XReg::x20, XReg::x19), \"cpyfmtn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfmtn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfmtn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyfetn(XReg::x30, XReg::x28, XReg::x29), \"cpyfetn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyfetn(XReg::x17, XReg::x20, XReg::x19), \"cpyfetn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyfetn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyfetn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  TEST_SINGLE(setp(XReg::x30, XReg::x28, XReg::x29), \"setp [x30]!, x28!, x29\");\n  TEST_SINGLE(setp(XReg::x17, XReg::x20, XReg::x19), \"setp [x17]!, x20!, x19\");\n\n  TEST_SINGLE(setm(XReg::x30, XReg::x28, XReg::x29), \"setm [x30]!, x28!, x29\");\n  TEST_SINGLE(setm(XReg::x17, XReg::x20, XReg::x19), \"setm [x17]!, x20!, x19\");\n\n  TEST_SINGLE(sete(XReg::x30, XReg::x28, XReg::x29), \"sete [x30]!, x28!, x29\");\n  TEST_SINGLE(sete(XReg::x17, XReg::x20, XReg::x19), \"sete [x17]!, x20!, x19\");\n\n  // TEST_SINGLE(setpt(XReg::x30, XReg::x28, XReg::x29), \"setpt [x30]!, x28!, x29\");\n  // TEST_SINGLE(setpt(XReg::x17, XReg::x20, XReg::x19), \"setpt [x17]!, x20!, x19\");\n  TEST_SINGLE(setpt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(setpt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(setmt(XReg::x30, XReg::x28, XReg::x29), \"setmt [x30]!, x28!, x29\");\n  // TEST_SINGLE(setmt(XReg::x17, XReg::x20, XReg::x19), \"setmt [x17]!, x20!, x19\");\n  TEST_SINGLE(setmt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(setmt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(setet(XReg::x30, XReg::x28, XReg::x29), \"setet [x30]!, x28!, x29\");\n  // TEST_SINGLE(setet(XReg::x17, XReg::x20, XReg::x19), \"setet [x17]!, x20!, x19\");\n  TEST_SINGLE(setet(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(setet(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  TEST_SINGLE(setpn(XReg::x30, XReg::x28, XReg::x29), \"setpn [x30]!, x28!, x29\");\n  TEST_SINGLE(setpn(XReg::x17, XReg::x20, XReg::x19), \"setpn [x17]!, x20!, x19\");\n\n  TEST_SINGLE(setmn(XReg::x30, XReg::x28, XReg::x29), \"setmn [x30]!, x28!, x29\");\n  TEST_SINGLE(setmn(XReg::x17, XReg::x20, XReg::x19), \"setmn [x17]!, x20!, x19\");\n\n  TEST_SINGLE(seten(XReg::x30, XReg::x28, XReg::x29), \"seten [x30]!, x28!, x29\");\n  TEST_SINGLE(seten(XReg::x17, XReg::x20, XReg::x19), \"seten [x17]!, x20!, x19\");\n\n  // TEST_SINGLE(setptn(XReg::x30, XReg::x28, XReg::x29), \"setptn [x30]!, x28!, x29\");\n  // TEST_SINGLE(setptn(XReg::x17, XReg::x20, XReg::x19), \"setptn [x17]!, x20!, x19\");\n  TEST_SINGLE(setptn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(setptn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(setmtn(XReg::x30, XReg::x28, XReg::x29), \"setmtn [x30]!, x28!, x29\");\n  // TEST_SINGLE(setmtn(XReg::x17, XReg::x20, XReg::x19), \"setmtn [x17]!, x20!, x19\");\n  TEST_SINGLE(setmtn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(setmtn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(setetn(XReg::x30, XReg::x28, XReg::x29), \"setetn [x30]!, x28!, x29\");\n  // TEST_SINGLE(setetn(XReg::x17, XReg::x20, XReg::x19), \"setetn [x17]!, x20!, x19\");\n  TEST_SINGLE(setetn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(setetn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  TEST_SINGLE(cpyp(XReg::x30, XReg::x28, XReg::x29), \"cpyp [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyp(XReg::x17, XReg::x20, XReg::x19), \"cpyp [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpym(XReg::x30, XReg::x28, XReg::x29), \"cpym [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpym(XReg::x17, XReg::x20, XReg::x19), \"cpym [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpye(XReg::x30, XReg::x28, XReg::x29), \"cpye [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpye(XReg::x17, XReg::x20, XReg::x19), \"cpye [x17]!, [x20]!, x19!\");\n\n  // TEST_SINGLE(cpypwt(XReg::x30, XReg::x28, XReg::x29), \"cpypwt [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpypwt(XReg::x17, XReg::x20, XReg::x19), \"cpypwt [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpypwt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpypwt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpymwt(XReg::x30, XReg::x28, XReg::x29), \"cpymwt [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpymwt(XReg::x17, XReg::x20, XReg::x19), \"cpymwt [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpymwt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpymwt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyewt(XReg::x30, XReg::x28, XReg::x29), \"cpyewt [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyewt(XReg::x17, XReg::x20, XReg::x19), \"cpyewt [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyewt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyewt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyprt(XReg::x30, XReg::x28, XReg::x29), \"cpyprt [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyprt(XReg::x17, XReg::x20, XReg::x19), \"cpyprt [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyprt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyprt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpymrt(XReg::x30, XReg::x28, XReg::x29), \"cpymrt [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpymrt(XReg::x17, XReg::x20, XReg::x19), \"cpymrt [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpymrt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpymrt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyert(XReg::x30, XReg::x28, XReg::x29), \"cpyert [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyert(XReg::x17, XReg::x20, XReg::x19), \"cpyert [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyert(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyert(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpypt(XReg::x30, XReg::x28, XReg::x29), \"cpypt [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpypt(XReg::x17, XReg::x20, XReg::x19), \"cpypt [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpypt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpypt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpymt(XReg::x30, XReg::x28, XReg::x29), \"cpymt [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpymt(XReg::x17, XReg::x20, XReg::x19), \"cpymt [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpymt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpymt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyet(XReg::x30, XReg::x28, XReg::x29), \"cpyet [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyet(XReg::x17, XReg::x20, XReg::x19), \"cpyet [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyet(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyet(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  TEST_SINGLE(cpypwn(XReg::x30, XReg::x28, XReg::x29), \"cpypwn [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpypwn(XReg::x17, XReg::x20, XReg::x19), \"cpypwn [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpymwn(XReg::x30, XReg::x28, XReg::x29), \"cpymwn [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpymwn(XReg::x17, XReg::x20, XReg::x19), \"cpymwn [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpyewn(XReg::x30, XReg::x28, XReg::x29), \"cpyewn [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyewn(XReg::x17, XReg::x20, XReg::x19), \"cpyewn [x17]!, [x20]!, x19!\");\n\n  // TEST_SINGLE(cpypwtwn(XReg::x30, XReg::x28, XReg::x29), \"cpypwtwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpypwtwn(XReg::x17, XReg::x20, XReg::x19), \"cpypwtwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpypwtwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpypwtwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpymwtwn(XReg::x30, XReg::x28, XReg::x29), \"cpymwtwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpymwtwn(XReg::x17, XReg::x20, XReg::x19), \"cpymwtwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpymwtwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpymwtwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyewtwn(XReg::x30, XReg::x28, XReg::x29), \"cpyewtwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyewtwn(XReg::x17, XReg::x20, XReg::x19), \"cpyewtwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyewtwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyewtwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyprtwn(XReg::x30, XReg::x28, XReg::x29), \"cpyprtwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyprtwn(XReg::x17, XReg::x20, XReg::x19), \"cpyprtwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyprtwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyprtwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpymrtwn(XReg::x30, XReg::x28, XReg::x29), \"cpymrtwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpymrtwn(XReg::x17, XReg::x20, XReg::x19), \"cpymrtwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpymrtwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpymrtwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyertwn(XReg::x30, XReg::x28, XReg::x29), \"cpyertwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyertwn(XReg::x17, XReg::x20, XReg::x19), \"cpyertwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyertwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyertwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyptwn(XReg::x30, XReg::x28, XReg::x29), \"cpyptwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyptwn(XReg::x17, XReg::x20, XReg::x19), \"cpyptwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyptwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyptwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpymtwn(XReg::x30, XReg::x28, XReg::x29), \"cpymtwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpymtwn(XReg::x17, XReg::x20, XReg::x19), \"cpymtwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpymtwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpymtwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyetwn(XReg::x30, XReg::x28, XReg::x29), \"cpyetwn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyetwn(XReg::x17, XReg::x20, XReg::x19), \"cpyetwn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyetwn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyetwn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  TEST_SINGLE(cpyprn(XReg::x30, XReg::x28, XReg::x29), \"cpyprn [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyprn(XReg::x17, XReg::x20, XReg::x19), \"cpyprn [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpymrn(XReg::x30, XReg::x28, XReg::x29), \"cpymrn [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpymrn(XReg::x17, XReg::x20, XReg::x19), \"cpymrn [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpyern(XReg::x30, XReg::x28, XReg::x29), \"cpyern [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyern(XReg::x17, XReg::x20, XReg::x19), \"cpyern [x17]!, [x20]!, x19!\");\n\n  // TEST_SINGLE(cpypwtrn(XReg::x30, XReg::x28, XReg::x29), \"cpypwtrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpypwtrn(XReg::x17, XReg::x20, XReg::x19), \"cpypwtrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpypwtrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpypwtrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpymwtrn(XReg::x30, XReg::x28, XReg::x29), \"cpymwtrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpymwtrn(XReg::x17, XReg::x20, XReg::x19), \"cpymwtrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpymwtrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpymwtrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyewtrn(XReg::x30, XReg::x28, XReg::x29), \"cpyewtrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyewtrn(XReg::x17, XReg::x20, XReg::x19), \"cpyewtrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyewtrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyewtrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyprtrn(XReg::x30, XReg::x28, XReg::x29), \"cpyprtrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyprtrn(XReg::x17, XReg::x20, XReg::x19), \"cpyprtrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyprtrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyprtrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpymrtrn(XReg::x30, XReg::x28, XReg::x29), \"cpymrtrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpymrtrn(XReg::x17, XReg::x20, XReg::x19), \"cpymrtrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpymrtrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpymrtrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyertrn(XReg::x30, XReg::x28, XReg::x29), \"cpyertrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyertrn(XReg::x17, XReg::x20, XReg::x19), \"cpyertrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyertrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyertrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyptrn(XReg::x30, XReg::x28, XReg::x29), \"cpyptrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyptrn(XReg::x17, XReg::x20, XReg::x19), \"cpyptrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyptrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyptrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpymtrn(XReg::x30, XReg::x28, XReg::x29), \"cpymtrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpymtrn(XReg::x17, XReg::x20, XReg::x19), \"cpymtrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpymtrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpymtrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyetrn(XReg::x30, XReg::x28, XReg::x29), \"cpyetrn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyetrn(XReg::x17, XReg::x20, XReg::x19), \"cpyetrn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyetrn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyetrn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  TEST_SINGLE(cpypn(XReg::x30, XReg::x28, XReg::x29), \"cpypn [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpypn(XReg::x17, XReg::x20, XReg::x19), \"cpypn [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpymn(XReg::x30, XReg::x28, XReg::x29), \"cpymn [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpymn(XReg::x17, XReg::x20, XReg::x19), \"cpymn [x17]!, [x20]!, x19!\");\n\n  TEST_SINGLE(cpyen(XReg::x30, XReg::x28, XReg::x29), \"cpyen [x30]!, [x28]!, x29!\");\n  TEST_SINGLE(cpyen(XReg::x17, XReg::x20, XReg::x19), \"cpyen [x17]!, [x20]!, x19!\");\n\n  // TEST_SINGLE(cpypwtn(XReg::x30, XReg::x28, XReg::x29), \"cpypwtn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpypwtn(XReg::x17, XReg::x20, XReg::x19), \"cpypwtn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpypwtn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpypwtn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpymwtn(XReg::x30, XReg::x28, XReg::x29), \"cpymwtn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpymwtn(XReg::x17, XReg::x20, XReg::x19), \"cpymwtn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpymwtn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpymwtn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyewtn(XReg::x30, XReg::x28, XReg::x29), \"cpyewtn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyewtn(XReg::x17, XReg::x20, XReg::x19), \"cpyewtn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyewtn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyewtn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyprtn(XReg::x30, XReg::x28, XReg::x29), \"cpyprtn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyprtn(XReg::x17, XReg::x20, XReg::x19), \"cpyprtn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyprtn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyprtn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpymrtn(XReg::x30, XReg::x28, XReg::x29), \"cpymrtn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpymrtn(XReg::x17, XReg::x20, XReg::x19), \"cpymrtn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpymrtn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpymrtn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyertn(XReg::x30, XReg::x28, XReg::x29), \"cpyertn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyertn(XReg::x17, XReg::x20, XReg::x19), \"cpyertn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyertn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyertn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyptn(XReg::x30, XReg::x28, XReg::x29), \"cpyptn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyptn(XReg::x17, XReg::x20, XReg::x19), \"cpyptn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyptn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyptn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpymtn(XReg::x30, XReg::x28, XReg::x29), \"cpymtn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpymtn(XReg::x17, XReg::x20, XReg::x19), \"cpymtn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpymtn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpymtn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(cpyetn(XReg::x30, XReg::x28, XReg::x29), \"cpyetn [x30]!, [x28]!, x29!\");\n  // TEST_SINGLE(cpyetn(XReg::x17, XReg::x20, XReg::x19), \"cpyetn [x17]!, [x20]!, x19!\");\n  TEST_SINGLE(cpyetn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(cpyetn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  TEST_SINGLE(setgp(XReg::x30, XReg::x28, XReg::x29), \"setgp [x30]!, x28!, x29\");\n  TEST_SINGLE(setgp(XReg::x17, XReg::x20, XReg::x19), \"setgp [x17]!, x20!, x19\");\n\n  TEST_SINGLE(setgm(XReg::x30, XReg::x28, XReg::x29), \"setgm [x30]!, x28!, x29\");\n  TEST_SINGLE(setgm(XReg::x17, XReg::x20, XReg::x19), \"setgm [x17]!, x20!, x19\");\n\n  TEST_SINGLE(setge(XReg::x30, XReg::x28, XReg::x29), \"setge [x30]!, x28!, x29\");\n  TEST_SINGLE(setge(XReg::x17, XReg::x20, XReg::x19), \"setge [x17]!, x20!, x19\");\n\n  // TEST_SINGLE(setgpt(XReg::x30, XReg::x28, XReg::x29), \"setgpt [x30]!, x28!, x29\");\n  // TEST_SINGLE(setgpt(XReg::x17, XReg::x20, XReg::x19), \"setgpt [x17]!, x20!, x19\");\n  TEST_SINGLE(setgpt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(setgpt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(setgmt(XReg::x30, XReg::x28, XReg::x29), \"setgmt [x30]!, x28!, x29\");\n  // TEST_SINGLE(setgmt(XReg::x17, XReg::x20, XReg::x19), \"setgmt [x17]!, x20!, x19\");\n  TEST_SINGLE(setgmt(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(setgmt(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(setget(XReg::x30, XReg::x28, XReg::x29), \"setget [x30]!, x28!, x29\");\n  // TEST_SINGLE(setget(XReg::x17, XReg::x20, XReg::x19), \"setget [x17]!, x20!, x19\");\n  TEST_SINGLE(setget(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(setget(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  TEST_SINGLE(setgpn(XReg::x30, XReg::x28, XReg::x29), \"setgpn [x30]!, x28!, x29\");\n  TEST_SINGLE(setgpn(XReg::x17, XReg::x20, XReg::x19), \"setgpn [x17]!, x20!, x19\");\n\n  TEST_SINGLE(setgmn(XReg::x30, XReg::x28, XReg::x29), \"setgmn [x30]!, x28!, x29\");\n  TEST_SINGLE(setgmn(XReg::x17, XReg::x20, XReg::x19), \"setgmn [x17]!, x20!, x19\");\n\n  TEST_SINGLE(setgen(XReg::x30, XReg::x28, XReg::x29), \"setgen [x30]!, x28!, x29\");\n  TEST_SINGLE(setgen(XReg::x17, XReg::x20, XReg::x19), \"setgen [x17]!, x20!, x19\");\n\n  // TEST_SINGLE(setgptn(XReg::x30, XReg::x28, XReg::x29), \"setgptn [x30]!, x28!, x29\");\n  // TEST_SINGLE(setgptn(XReg::x17, XReg::x20, XReg::x19), \"setgptn [x17]!, x20!, x19\");\n  TEST_SINGLE(setgptn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(setgptn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(setgmtn(XReg::x30, XReg::x28, XReg::x29), \"setgmtn [x30]!, x28!, x29\");\n  // TEST_SINGLE(setgmtn(XReg::x17, XReg::x20, XReg::x19), \"setgmtn [x17]!, x20!, x19\");\n  TEST_SINGLE(setgmtn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(setgmtn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n\n  // TEST_SINGLE(setgetn(XReg::x30, XReg::x28, XReg::x29), \"setgetn [x30]!, x28!, x29\");\n  // TEST_SINGLE(setgetn(XReg::x17, XReg::x20, XReg::x19), \"setgetn [x17]!, x20!, x19\");\n  TEST_SINGLE(setgetn(XReg::x30, XReg::x28, XReg::x29), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(setgetn(XReg::x17, XReg::x20, XReg::x19), \"unimplemented (Unimplemented)\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Loadstore no-allocate pair\") {\n  TEST_SINGLE(stnp(WReg::w30, WReg::w28, Reg::r29, -256), \"stnp w30, w28, [x29, #-256]\");\n  TEST_SINGLE(stnp(WReg::w30, WReg::w28, Reg::r29, 252), \"stnp w30, w28, [x29, #252]\");\n\n  TEST_SINGLE(ldnp(WReg::w30, WReg::w28, Reg::r29, -256), \"ldnp w30, w28, [x29, #-256]\");\n  TEST_SINGLE(ldnp(WReg::w30, WReg::w28, Reg::r29, 252), \"ldnp w30, w28, [x29, #252]\");\n\n  TEST_SINGLE(stnp(SReg::s30, SReg::s28, Reg::r29, -256), \"stnp s30, s28, [x29, #-256]\");\n  TEST_SINGLE(stnp(SReg::s30, SReg::s28, Reg::r29, 252), \"stnp s30, s28, [x29, #252]\");\n\n  TEST_SINGLE(ldnp(SReg::s30, SReg::s28, Reg::r29, -256), \"ldnp s30, s28, [x29, #-256]\");\n  TEST_SINGLE(ldnp(SReg::s30, SReg::s28, Reg::r29, 252), \"ldnp s30, s28, [x29, #252]\");\n\n  TEST_SINGLE(stnp(XReg::x30, XReg::x28, Reg::r29, -512), \"stnp x30, x28, [x29, #-512]\");\n  TEST_SINGLE(stnp(XReg::x30, XReg::x28, Reg::r29, 504), \"stnp x30, x28, [x29, #504]\");\n\n  TEST_SINGLE(ldnp(XReg::x30, XReg::x28, Reg::r29, -512), \"ldnp x30, x28, [x29, #-512]\");\n  TEST_SINGLE(ldnp(XReg::x30, XReg::x28, Reg::r29, 504), \"ldnp x30, x28, [x29, #504]\");\n\n  TEST_SINGLE(stnp(DReg::d30, DReg::d28, Reg::r29, -512), \"stnp d30, d28, [x29, #-512]\");\n  TEST_SINGLE(stnp(DReg::d30, DReg::d28, Reg::r29, 504), \"stnp d30, d28, [x29, #504]\");\n\n  TEST_SINGLE(ldnp(DReg::d30, DReg::d28, Reg::r29, -512), \"ldnp d30, d28, [x29, #-512]\");\n  TEST_SINGLE(ldnp(DReg::d30, DReg::d28, Reg::r29, 504), \"ldnp d30, d28, [x29, #504]\");\n\n  TEST_SINGLE(stnp(QReg::q30, QReg::q28, Reg::r29, -1024), \"stnp q30, q28, [x29, #-1024]\");\n  TEST_SINGLE(stnp(QReg::q30, QReg::q28, Reg::r29, 1008), \"stnp q30, q28, [x29, #1008]\");\n\n  TEST_SINGLE(ldnp(QReg::q30, QReg::q28, Reg::r29, -1024), \"ldnp q30, q28, [x29, #-1024]\");\n  TEST_SINGLE(ldnp(QReg::q30, QReg::q28, Reg::r29, 1008), \"ldnp q30, q28, [x29, #1008]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Loadstore register pair post-indexed\") {\n  TEST_SINGLE(stp<IndexType::POST>(WReg::w30, WReg::w28, Reg::r29, -256), \"stp w30, w28, [x29], #-256\");\n  TEST_SINGLE(stp<IndexType::POST>(WReg::w30, WReg::w28, Reg::r29, 252), \"stp w30, w28, [x29], #252\");\n\n  TEST_SINGLE(ldp<IndexType::POST>(WReg::w30, WReg::w28, Reg::r29, -256), \"ldp w30, w28, [x29], #-256\");\n  TEST_SINGLE(ldp<IndexType::POST>(WReg::w30, WReg::w28, Reg::r29, 252), \"ldp w30, w28, [x29], #252\");\n\n  TEST_SINGLE(ldpsw<IndexType::POST>(XReg::x30, XReg::x28, Reg::r29, -256), \"ldpsw x30, x28, [x29], #-256\");\n  TEST_SINGLE(ldpsw<IndexType::POST>(XReg::x30, XReg::x28, Reg::r29, 252), \"ldpsw x30, x28, [x29], #252\");\n\n  TEST_SINGLE(stp<IndexType::POST>(XReg::x30, XReg::x28, Reg::r29, -512), \"stp x30, x28, [x29], #-512\");\n  TEST_SINGLE(stp<IndexType::POST>(XReg::x30, XReg::x28, Reg::r29, 504), \"stp x30, x28, [x29], #504\");\n\n  TEST_SINGLE(ldp<IndexType::POST>(XReg::x30, XReg::x28, Reg::r29, -512), \"ldp x30, x28, [x29], #-512\");\n  TEST_SINGLE(ldp<IndexType::POST>(XReg::x30, XReg::x28, Reg::r29, 504), \"ldp x30, x28, [x29], #504\");\n\n  TEST_SINGLE(stp<IndexType::POST>(SReg::s30, SReg::s28, Reg::r29, -256), \"stp s30, s28, [x29], #-256\");\n  TEST_SINGLE(stp<IndexType::POST>(SReg::s30, SReg::s28, Reg::r29, 252), \"stp s30, s28, [x29], #252\");\n\n  TEST_SINGLE(ldp<IndexType::POST>(SReg::s30, SReg::s28, Reg::r29, -256), \"ldp s30, s28, [x29], #-256\");\n  TEST_SINGLE(ldp<IndexType::POST>(SReg::s30, SReg::s28, Reg::r29, 252), \"ldp s30, s28, [x29], #252\");\n\n  TEST_SINGLE(stp<IndexType::POST>(DReg::d30, DReg::d28, Reg::r29, -512), \"stp d30, d28, [x29], #-512\");\n  TEST_SINGLE(stp<IndexType::POST>(DReg::d30, DReg::d28, Reg::r29, 504), \"stp d30, d28, [x29], #504\");\n\n  TEST_SINGLE(ldp<IndexType::POST>(DReg::d30, DReg::d28, Reg::r29, -512), \"ldp d30, d28, [x29], #-512\");\n  TEST_SINGLE(ldp<IndexType::POST>(DReg::d30, DReg::d28, Reg::r29, 504), \"ldp d30, d28, [x29], #504\");\n\n  TEST_SINGLE(stp<IndexType::POST>(QReg::q30, QReg::q28, Reg::r29, -1024), \"stp q30, q28, [x29], #-1024\");\n  TEST_SINGLE(stp<IndexType::POST>(QReg::q30, QReg::q28, Reg::r29, 1008), \"stp q30, q28, [x29], #1008\");\n\n  TEST_SINGLE(ldp<IndexType::POST>(QReg::q30, QReg::q28, Reg::r29, -1024), \"ldp q30, q28, [x29], #-1024\");\n  TEST_SINGLE(ldp<IndexType::POST>(QReg::q30, QReg::q28, Reg::r29, 1008), \"ldp q30, q28, [x29], #1008\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Loadstore register pair offset\") {\n  TEST_SINGLE(stp<IndexType::OFFSET>(WReg::w30, WReg::w28, Reg::r29, -256), \"stp w30, w28, [x29, #-256]\");\n  TEST_SINGLE(stp<IndexType::OFFSET>(WReg::w30, WReg::w28, Reg::r29, 252), \"stp w30, w28, [x29, #252]\");\n\n  TEST_SINGLE(ldp<IndexType::OFFSET>(WReg::w30, WReg::w28, Reg::r29, -256), \"ldp w30, w28, [x29, #-256]\");\n  TEST_SINGLE(ldp<IndexType::OFFSET>(WReg::w30, WReg::w28, Reg::r29, 252), \"ldp w30, w28, [x29, #252]\");\n\n  TEST_SINGLE(ldpsw<IndexType::OFFSET>(XReg::x30, XReg::x28, Reg::r29, -256), \"ldpsw x30, x28, [x29, #-256]\");\n  TEST_SINGLE(ldpsw<IndexType::OFFSET>(XReg::x30, XReg::x28, Reg::r29, 252), \"ldpsw x30, x28, [x29, #252]\");\n\n  TEST_SINGLE(stp<IndexType::OFFSET>(XReg::x30, XReg::x28, Reg::r29, -512), \"stp x30, x28, [x29, #-512]\");\n  TEST_SINGLE(stp<IndexType::OFFSET>(XReg::x30, XReg::x28, Reg::r29, 504), \"stp x30, x28, [x29, #504]\");\n\n  TEST_SINGLE(ldp<IndexType::OFFSET>(XReg::x30, XReg::x28, Reg::r29, -512), \"ldp x30, x28, [x29, #-512]\");\n  TEST_SINGLE(ldp<IndexType::OFFSET>(XReg::x30, XReg::x28, Reg::r29, 504), \"ldp x30, x28, [x29, #504]\");\n\n  TEST_SINGLE(stp<IndexType::OFFSET>(SReg::s30, SReg::s28, Reg::r29, -256), \"stp s30, s28, [x29, #-256]\");\n  TEST_SINGLE(stp<IndexType::OFFSET>(SReg::s30, SReg::s28, Reg::r29, 252), \"stp s30, s28, [x29, #252]\");\n\n  TEST_SINGLE(ldp<IndexType::OFFSET>(SReg::s30, SReg::s28, Reg::r29, -256), \"ldp s30, s28, [x29, #-256]\");\n  TEST_SINGLE(ldp<IndexType::OFFSET>(SReg::s30, SReg::s28, Reg::r29, 252), \"ldp s30, s28, [x29, #252]\");\n\n  TEST_SINGLE(stp<IndexType::OFFSET>(DReg::d30, DReg::d28, Reg::r29, -512), \"stp d30, d28, [x29, #-512]\");\n  TEST_SINGLE(stp<IndexType::OFFSET>(DReg::d30, DReg::d28, Reg::r29, 504), \"stp d30, d28, [x29, #504]\");\n\n  TEST_SINGLE(ldp<IndexType::OFFSET>(DReg::d30, DReg::d28, Reg::r29, -512), \"ldp d30, d28, [x29, #-512]\");\n  TEST_SINGLE(ldp<IndexType::OFFSET>(DReg::d30, DReg::d28, Reg::r29, 504), \"ldp d30, d28, [x29, #504]\");\n\n  TEST_SINGLE(stp<IndexType::OFFSET>(QReg::q30, QReg::q28, Reg::r29, -1024), \"stp q30, q28, [x29, #-1024]\");\n  TEST_SINGLE(stp<IndexType::OFFSET>(QReg::q30, QReg::q28, Reg::r29, 1008), \"stp q30, q28, [x29, #1008]\");\n\n  TEST_SINGLE(ldp<IndexType::OFFSET>(QReg::q30, QReg::q28, Reg::r29, -1024), \"ldp q30, q28, [x29, #-1024]\");\n  TEST_SINGLE(ldp<IndexType::OFFSET>(QReg::q30, QReg::q28, Reg::r29, 1008), \"ldp q30, q28, [x29, #1008]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Loadstore register pair pre-indexed\") {\n  TEST_SINGLE(stp<IndexType::PRE>(WReg::w30, WReg::w28, Reg::r29, -256), \"stp w30, w28, [x29, #-256]!\");\n  TEST_SINGLE(stp<IndexType::PRE>(WReg::w30, WReg::w28, Reg::r29, 252), \"stp w30, w28, [x29, #252]!\");\n\n  TEST_SINGLE(ldp<IndexType::PRE>(WReg::w30, WReg::w28, Reg::r29, -256), \"ldp w30, w28, [x29, #-256]!\");\n  TEST_SINGLE(ldp<IndexType::PRE>(WReg::w30, WReg::w28, Reg::r29, 252), \"ldp w30, w28, [x29, #252]!\");\n\n  TEST_SINGLE(ldpsw<IndexType::PRE>(XReg::x30, XReg::x28, Reg::r29, -256), \"ldpsw x30, x28, [x29, #-256]!\");\n  TEST_SINGLE(ldpsw<IndexType::PRE>(XReg::x30, XReg::x28, Reg::r29, 252), \"ldpsw x30, x28, [x29, #252]!\");\n\n  TEST_SINGLE(stp<IndexType::PRE>(XReg::x30, XReg::x28, Reg::r29, -512), \"stp x30, x28, [x29, #-512]!\");\n  TEST_SINGLE(stp<IndexType::PRE>(XReg::x30, XReg::x28, Reg::r29, 504), \"stp x30, x28, [x29, #504]!\");\n\n  TEST_SINGLE(ldp<IndexType::PRE>(XReg::x30, XReg::x28, Reg::r29, -512), \"ldp x30, x28, [x29, #-512]!\");\n  TEST_SINGLE(ldp<IndexType::PRE>(XReg::x30, XReg::x28, Reg::r29, 504), \"ldp x30, x28, [x29, #504]!\");\n\n  TEST_SINGLE(stp<IndexType::PRE>(SReg::s30, SReg::s28, Reg::r29, -256), \"stp s30, s28, [x29, #-256]!\");\n  TEST_SINGLE(stp<IndexType::PRE>(SReg::s30, SReg::s28, Reg::r29, 252), \"stp s30, s28, [x29, #252]!\");\n\n  TEST_SINGLE(ldp<IndexType::PRE>(SReg::s30, SReg::s28, Reg::r29, -256), \"ldp s30, s28, [x29, #-256]!\");\n  TEST_SINGLE(ldp<IndexType::PRE>(SReg::s30, SReg::s28, Reg::r29, 252), \"ldp s30, s28, [x29, #252]!\");\n\n  TEST_SINGLE(stp<IndexType::PRE>(DReg::d30, DReg::d28, Reg::r29, -512), \"stp d30, d28, [x29, #-512]!\");\n  TEST_SINGLE(stp<IndexType::PRE>(DReg::d30, DReg::d28, Reg::r29, 504), \"stp d30, d28, [x29, #504]!\");\n\n  TEST_SINGLE(ldp<IndexType::PRE>(DReg::d30, DReg::d28, Reg::r29, -512), \"ldp d30, d28, [x29, #-512]!\");\n  TEST_SINGLE(ldp<IndexType::PRE>(DReg::d30, DReg::d28, Reg::r29, 504), \"ldp d30, d28, [x29, #504]!\");\n\n  TEST_SINGLE(stp<IndexType::PRE>(QReg::q30, QReg::q28, Reg::r29, -1024), \"stp q30, q28, [x29, #-1024]!\");\n  TEST_SINGLE(stp<IndexType::PRE>(QReg::q30, QReg::q28, Reg::r29, 1008), \"stp q30, q28, [x29, #1008]!\");\n\n  TEST_SINGLE(ldp<IndexType::PRE>(QReg::q30, QReg::q28, Reg::r29, -1024), \"ldp q30, q28, [x29, #-1024]!\");\n  TEST_SINGLE(ldp<IndexType::PRE>(QReg::q30, QReg::q28, Reg::r29, 1008), \"ldp q30, q28, [x29, #1008]!\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Loadstore register immediate post-indexed\") {\n  TEST_SINGLE(strb<IndexType::POST>(Reg::r30, Reg::r29, -256), \"strb w30, [x29], #-256\");\n  TEST_SINGLE(strb<IndexType::POST>(Reg::r30, Reg::r29, 255), \"strb w30, [x29], #255\");\n  TEST_SINGLE(ldrb<IndexType::POST>(Reg::r30, Reg::r29, -256), \"ldrb w30, [x29], #-256\");\n  TEST_SINGLE(ldrb<IndexType::POST>(Reg::r30, Reg::r29, 255), \"ldrb w30, [x29], #255\");\n\n  TEST_SINGLE(strb<IndexType::POST>(VReg::v30, Reg::r29, -256), \"str b30, [x29], #-256\");\n  TEST_SINGLE(strb<IndexType::POST>(VReg::v30, Reg::r29, 255), \"str b30, [x29], #255\");\n  TEST_SINGLE(ldrb<IndexType::POST>(VReg::v30, Reg::r29, -256), \"ldr b30, [x29], #-256\");\n  TEST_SINGLE(ldrb<IndexType::POST>(VReg::v30, Reg::r29, 255), \"ldr b30, [x29], #255\");\n\n  TEST_SINGLE(ldrsb<IndexType::POST>(WReg::w30, Reg::r29, -256), \"ldrsb w30, [x29], #-256\");\n  TEST_SINGLE(ldrsb<IndexType::POST>(WReg::w30, Reg::r29, 255), \"ldrsb w30, [x29], #255\");\n  TEST_SINGLE(ldrsb<IndexType::POST>(XReg::x30, Reg::r29, -256), \"ldrsb x30, [x29], #-256\");\n  TEST_SINGLE(ldrsb<IndexType::POST>(XReg::x30, Reg::r29, 255), \"ldrsb x30, [x29], #255\");\n\n  TEST_SINGLE(strh<IndexType::POST>(Reg::r30, Reg::r29, -256), \"strh w30, [x29], #-256\");\n  TEST_SINGLE(strh<IndexType::POST>(Reg::r30, Reg::r29, 255), \"strh w30, [x29], #255\");\n  TEST_SINGLE(ldrh<IndexType::POST>(Reg::r30, Reg::r29, -256), \"ldrh w30, [x29], #-256\");\n  TEST_SINGLE(ldrh<IndexType::POST>(Reg::r30, Reg::r29, 255), \"ldrh w30, [x29], #255\");\n\n  TEST_SINGLE(strh<IndexType::POST>(VReg::v30, Reg::r29, -256), \"str h30, [x29], #-256\");\n  TEST_SINGLE(strh<IndexType::POST>(VReg::v30, Reg::r29, 255), \"str h30, [x29], #255\");\n  TEST_SINGLE(ldrh<IndexType::POST>(VReg::v30, Reg::r29, -256), \"ldr h30, [x29], #-256\");\n  TEST_SINGLE(ldrh<IndexType::POST>(VReg::v30, Reg::r29, 255), \"ldr h30, [x29], #255\");\n\n  TEST_SINGLE(ldrsh<IndexType::POST>(WReg::w30, Reg::r29, -256), \"ldrsh w30, [x29], #-256\");\n  TEST_SINGLE(ldrsh<IndexType::POST>(WReg::w30, Reg::r29, 255), \"ldrsh w30, [x29], #255\");\n  TEST_SINGLE(ldrsh<IndexType::POST>(XReg::x30, Reg::r29, -256), \"ldrsh x30, [x29], #-256\");\n  TEST_SINGLE(ldrsh<IndexType::POST>(XReg::x30, Reg::r29, 255), \"ldrsh x30, [x29], #255\");\n\n  TEST_SINGLE(str<IndexType::POST>(WReg::w30, Reg::r29, -256), \"str w30, [x29], #-256\");\n  TEST_SINGLE(str<IndexType::POST>(WReg::w30, Reg::r29, 255), \"str w30, [x29], #255\");\n  TEST_SINGLE(ldr<IndexType::POST>(WReg::w30, Reg::r29, -256), \"ldr w30, [x29], #-256\");\n  TEST_SINGLE(ldr<IndexType::POST>(WReg::w30, Reg::r29, 255), \"ldr w30, [x29], #255\");\n\n  TEST_SINGLE(str<IndexType::POST>(SReg::s30, Reg::r29, -256), \"str s30, [x29], #-256\");\n  TEST_SINGLE(str<IndexType::POST>(SReg::s30, Reg::r29, 255), \"str s30, [x29], #255\");\n  TEST_SINGLE(ldr<IndexType::POST>(SReg::s30, Reg::r29, -256), \"ldr s30, [x29], #-256\");\n  TEST_SINGLE(ldr<IndexType::POST>(SReg::s30, Reg::r29, 255), \"ldr s30, [x29], #255\");\n\n  TEST_SINGLE(ldrsw<IndexType::POST>(XReg::x30, Reg::r29, -256), \"ldrsw x30, [x29], #-256\");\n  TEST_SINGLE(ldrsw<IndexType::POST>(XReg::x30, Reg::r29, 255), \"ldrsw x30, [x29], #255\");\n\n  TEST_SINGLE(str<IndexType::POST>(XReg::x30, Reg::r29, -256), \"str x30, [x29], #-256\");\n  TEST_SINGLE(str<IndexType::POST>(XReg::x30, Reg::r29, 255), \"str x30, [x29], #255\");\n  TEST_SINGLE(ldr<IndexType::POST>(XReg::x30, Reg::r29, -256), \"ldr x30, [x29], #-256\");\n  TEST_SINGLE(ldr<IndexType::POST>(XReg::x30, Reg::r29, 255), \"ldr x30, [x29], #255\");\n\n  TEST_SINGLE(str<IndexType::POST>(DReg::d30, Reg::r29, -256), \"str d30, [x29], #-256\");\n  TEST_SINGLE(str<IndexType::POST>(DReg::d30, Reg::r29, 255), \"str d30, [x29], #255\");\n  TEST_SINGLE(ldr<IndexType::POST>(DReg::d30, Reg::r29, -256), \"ldr d30, [x29], #-256\");\n  TEST_SINGLE(ldr<IndexType::POST>(DReg::d30, Reg::r29, 255), \"ldr d30, [x29], #255\");\n\n  TEST_SINGLE(str<IndexType::POST>(QReg::q30, Reg::r29, -256), \"str q30, [x29], #-256\");\n  TEST_SINGLE(str<IndexType::POST>(QReg::q30, Reg::r29, 255), \"str q30, [x29], #255\");\n  TEST_SINGLE(ldr<IndexType::POST>(QReg::q30, Reg::r29, -256), \"ldr q30, [x29], #-256\");\n  TEST_SINGLE(ldr<IndexType::POST>(QReg::q30, Reg::r29, 255), \"ldr q30, [x29], #255\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Loadstore register immediate pre-indexed\") {\n  TEST_SINGLE(strb<IndexType::PRE>(Reg::r30, Reg::r29, -256), \"strb w30, [x29, #-256]!\");\n  TEST_SINGLE(strb<IndexType::PRE>(Reg::r30, Reg::r29, 255), \"strb w30, [x29, #255]!\");\n  TEST_SINGLE(ldrb<IndexType::PRE>(Reg::r30, Reg::r29, -256), \"ldrb w30, [x29, #-256]!\");\n  TEST_SINGLE(ldrb<IndexType::PRE>(Reg::r30, Reg::r29, 255), \"ldrb w30, [x29, #255]!\");\n\n  TEST_SINGLE(strb<IndexType::PRE>(VReg::v30, Reg::r29, -256), \"str b30, [x29, #-256]!\");\n  TEST_SINGLE(strb<IndexType::PRE>(VReg::v30, Reg::r29, 255), \"str b30, [x29, #255]!\");\n  TEST_SINGLE(ldrb<IndexType::PRE>(VReg::v30, Reg::r29, -256), \"ldr b30, [x29, #-256]!\");\n  TEST_SINGLE(ldrb<IndexType::PRE>(VReg::v30, Reg::r29, 255), \"ldr b30, [x29, #255]!\");\n\n  TEST_SINGLE(ldrsb<IndexType::PRE>(WReg::w30, Reg::r29, -256), \"ldrsb w30, [x29, #-256]!\");\n  TEST_SINGLE(ldrsb<IndexType::PRE>(WReg::w30, Reg::r29, 255), \"ldrsb w30, [x29, #255]!\");\n  TEST_SINGLE(ldrsb<IndexType::PRE>(XReg::x30, Reg::r29, -256), \"ldrsb x30, [x29, #-256]!\");\n  TEST_SINGLE(ldrsb<IndexType::PRE>(XReg::x30, Reg::r29, 255), \"ldrsb x30, [x29, #255]!\");\n\n  TEST_SINGLE(strh<IndexType::PRE>(Reg::r30, Reg::r29, -256), \"strh w30, [x29, #-256]!\");\n  TEST_SINGLE(strh<IndexType::PRE>(Reg::r30, Reg::r29, 255), \"strh w30, [x29, #255]!\");\n  TEST_SINGLE(ldrh<IndexType::PRE>(Reg::r30, Reg::r29, -256), \"ldrh w30, [x29, #-256]!\");\n  TEST_SINGLE(ldrh<IndexType::PRE>(Reg::r30, Reg::r29, 255), \"ldrh w30, [x29, #255]!\");\n\n  TEST_SINGLE(strh<IndexType::PRE>(VReg::v30, Reg::r29, -256), \"str h30, [x29, #-256]!\");\n  TEST_SINGLE(strh<IndexType::PRE>(VReg::v30, Reg::r29, 255), \"str h30, [x29, #255]!\");\n  TEST_SINGLE(ldrh<IndexType::PRE>(VReg::v30, Reg::r29, -256), \"ldr h30, [x29, #-256]!\");\n  TEST_SINGLE(ldrh<IndexType::PRE>(VReg::v30, Reg::r29, 255), \"ldr h30, [x29, #255]!\");\n\n  TEST_SINGLE(ldrsh<IndexType::PRE>(WReg::w30, Reg::r29, -256), \"ldrsh w30, [x29, #-256]!\");\n  TEST_SINGLE(ldrsh<IndexType::PRE>(WReg::w30, Reg::r29, 255), \"ldrsh w30, [x29, #255]!\");\n  TEST_SINGLE(ldrsh<IndexType::PRE>(XReg::x30, Reg::r29, -256), \"ldrsh x30, [x29, #-256]!\");\n  TEST_SINGLE(ldrsh<IndexType::PRE>(XReg::x30, Reg::r29, 255), \"ldrsh x30, [x29, #255]!\");\n\n  TEST_SINGLE(str<IndexType::PRE>(WReg::w30, Reg::r29, -256), \"str w30, [x29, #-256]!\");\n  TEST_SINGLE(str<IndexType::PRE>(WReg::w30, Reg::r29, 255), \"str w30, [x29, #255]!\");\n  TEST_SINGLE(ldr<IndexType::PRE>(WReg::w30, Reg::r29, -256), \"ldr w30, [x29, #-256]!\");\n  TEST_SINGLE(ldr<IndexType::PRE>(WReg::w30, Reg::r29, 255), \"ldr w30, [x29, #255]!\");\n\n  TEST_SINGLE(str<IndexType::PRE>(SReg::s30, Reg::r29, -256), \"str s30, [x29, #-256]!\");\n  TEST_SINGLE(str<IndexType::PRE>(SReg::s30, Reg::r29, 255), \"str s30, [x29, #255]!\");\n  TEST_SINGLE(ldr<IndexType::PRE>(SReg::s30, Reg::r29, -256), \"ldr s30, [x29, #-256]!\");\n  TEST_SINGLE(ldr<IndexType::PRE>(SReg::s30, Reg::r29, 255), \"ldr s30, [x29, #255]!\");\n\n  TEST_SINGLE(ldrsw<IndexType::PRE>(XReg::x30, Reg::r29, -256), \"ldrsw x30, [x29, #-256]!\");\n  TEST_SINGLE(ldrsw<IndexType::PRE>(XReg::x30, Reg::r29, 255), \"ldrsw x30, [x29, #255]!\");\n\n  TEST_SINGLE(str<IndexType::PRE>(XReg::x30, Reg::r29, -256), \"str x30, [x29, #-256]!\");\n  TEST_SINGLE(str<IndexType::PRE>(XReg::x30, Reg::r29, 255), \"str x30, [x29, #255]!\");\n  TEST_SINGLE(ldr<IndexType::PRE>(XReg::x30, Reg::r29, -256), \"ldr x30, [x29, #-256]!\");\n  TEST_SINGLE(ldr<IndexType::PRE>(XReg::x30, Reg::r29, 255), \"ldr x30, [x29, #255]!\");\n\n  TEST_SINGLE(str<IndexType::PRE>(DReg::d30, Reg::r29, -256), \"str d30, [x29, #-256]!\");\n  TEST_SINGLE(str<IndexType::PRE>(DReg::d30, Reg::r29, 255), \"str d30, [x29, #255]!\");\n  TEST_SINGLE(ldr<IndexType::PRE>(DReg::d30, Reg::r29, -256), \"ldr d30, [x29, #-256]!\");\n  TEST_SINGLE(ldr<IndexType::PRE>(DReg::d30, Reg::r29, 255), \"ldr d30, [x29, #255]!\");\n\n  TEST_SINGLE(str<IndexType::PRE>(QReg::q30, Reg::r29, -256), \"str q30, [x29, #-256]!\");\n  TEST_SINGLE(str<IndexType::PRE>(QReg::q30, Reg::r29, 255), \"str q30, [x29, #255]!\");\n  TEST_SINGLE(ldr<IndexType::PRE>(QReg::q30, Reg::r29, -256), \"ldr q30, [x29, #-256]!\");\n  TEST_SINGLE(ldr<IndexType::PRE>(QReg::q30, Reg::r29, 255), \"ldr q30, [x29, #255]!\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Loadstore register unprivileged\") {\n  if (false) {\n    // vixl can't disassemble this class of instructions.\n    TEST_SINGLE(sttrb(Reg::r30, Reg::r29, -256), \"sttrb w30, [x29, #-256]\");\n    TEST_SINGLE(sttrb(Reg::r30, Reg::r29, 255), \"sttrb w30, [x29, #255]\");\n\n    TEST_SINGLE(ldtrb(Reg::r30, Reg::r29, -256), \"ldtrb w30, [x29, #-256]\");\n    TEST_SINGLE(ldtrb(Reg::r30, Reg::r29, 255), \"ldtrb w30, [x29, #255]\");\n\n    TEST_SINGLE(ldtrsb(WReg::w30, Reg::r29, -256), \"ldtrsb w30, [x29, #-256]\");\n    TEST_SINGLE(ldtrsb(WReg::w30, Reg::r29, 255), \"ldtrsb w30, [x29, #255]\");\n    TEST_SINGLE(ldtrsb(XReg::x30, Reg::r29, -256), \"ldtrsb x30, [x29, #-256]\");\n    TEST_SINGLE(ldtrsb(XReg::x30, Reg::r29, 255), \"ldtrsb x30, [x29, #255]\");\n\n    TEST_SINGLE(sttrh(Reg::r30, Reg::r29, -256), \"sttrh w30, [x29, #-256]\");\n    TEST_SINGLE(sttrh(Reg::r30, Reg::r29, 255), \"sttrh w30, [x29, #255]\");\n\n    TEST_SINGLE(ldtrh(Reg::r30, Reg::r29, -256), \"ldtrh w30, [x29, #-256]\");\n    TEST_SINGLE(ldtrh(Reg::r30, Reg::r29, 255), \"ldtrh w30, [x29, #255]\");\n\n    TEST_SINGLE(ldtrsh(WReg::w30, Reg::r29, -256), \"ldtrsh w30, [x29, #-256]\");\n    TEST_SINGLE(ldtrsh(WReg::w30, Reg::r29, 255), \"ldtrsh w30, [x29, #255]\");\n    TEST_SINGLE(ldtrsh(XReg::x30, Reg::r29, -256), \"ldtrsh x30, [x29, #-256]\");\n    TEST_SINGLE(ldtrsh(XReg::x30, Reg::r29, 255), \"ldtrsh x30, [x29, #255]\");\n\n    TEST_SINGLE(sttr(WReg::w30, Reg::r29, -256), \"sttr w30, [x29, #-256]\");\n    TEST_SINGLE(sttr(WReg::w30, Reg::r29, 255), \"sttr w30, [x29, #255]\");\n\n    TEST_SINGLE(ldtr(WReg::w30, Reg::r29, -256), \"ldtr w30, [x29, #-256]\");\n    TEST_SINGLE(ldtr(WReg::w30, Reg::r29, 255), \"ldtr w30, [x29, #255]\");\n\n    TEST_SINGLE(ldtrsw(XReg::x30, Reg::r29, -256), \"ldtrsw x30, [x29, #-256]\");\n    TEST_SINGLE(ldtrsw(XReg::x30, Reg::r29, 255), \"ldtrsw x30, [x29, #255]\");\n\n    TEST_SINGLE(sttr(XReg::x30, Reg::r29, -256), \"sttr x30, [x29, #-256]\");\n    TEST_SINGLE(sttr(XReg::x30, Reg::r29, 255), \"sttr x30, [x29, #255]\");\n\n    TEST_SINGLE(ldtr(XReg::x30, Reg::r29, -256), \"ldtr x30, [x29, #-256]\");\n    TEST_SINGLE(ldtr(XReg::x30, Reg::r29, 255), \"ldtr x30, [x29, #255]\");\n  }\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Atomic memory operations\") {\n  TEST_SINGLE(stadd(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"staddb w30, [x29]\");\n  TEST_SINGLE(stadd(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"staddh w30, [x29]\");\n  TEST_SINGLE(stadd(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stadd w30, [x29]\");\n  TEST_SINGLE(stadd(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stadd x30, [x29]\");\n\n  TEST_SINGLE(staddl(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"staddlb w30, [x29]\");\n  TEST_SINGLE(staddl(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"staddlh w30, [x29]\");\n  TEST_SINGLE(staddl(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"staddl w30, [x29]\");\n  TEST_SINGLE(staddl(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"staddl x30, [x29]\");\n\n  TEST_SINGLE(stadda(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"staddab w30, [x29]\");\n  TEST_SINGLE(stadda(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"staddah w30, [x29]\");\n  TEST_SINGLE(stadda(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stadda w30, [x29]\");\n  TEST_SINGLE(stadda(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stadda x30, [x29]\");\n\n  TEST_SINGLE(staddal(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"staddalb w30, [x29]\");\n  TEST_SINGLE(staddal(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"staddalh w30, [x29]\");\n  TEST_SINGLE(staddal(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"staddal w30, [x29]\");\n  TEST_SINGLE(staddal(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"staddal x30, [x29]\");\n\n  TEST_SINGLE(stclr(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stclrb w30, [x29]\");\n  TEST_SINGLE(stclr(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stclrh w30, [x29]\");\n  TEST_SINGLE(stclr(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stclr w30, [x29]\");\n  TEST_SINGLE(stclr(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stclr x30, [x29]\");\n\n  TEST_SINGLE(stclrl(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stclrlb w30, [x29]\");\n  TEST_SINGLE(stclrl(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stclrlh w30, [x29]\");\n  TEST_SINGLE(stclrl(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stclrl w30, [x29]\");\n  TEST_SINGLE(stclrl(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stclrl x30, [x29]\");\n\n  TEST_SINGLE(stclra(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stclrab w30, [x29]\");\n  TEST_SINGLE(stclra(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stclrah w30, [x29]\");\n  TEST_SINGLE(stclra(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stclra w30, [x29]\");\n  TEST_SINGLE(stclra(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stclra x30, [x29]\");\n\n  TEST_SINGLE(stclral(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stclralb w30, [x29]\");\n  TEST_SINGLE(stclral(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stclralh w30, [x29]\");\n  TEST_SINGLE(stclral(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stclral w30, [x29]\");\n  TEST_SINGLE(stclral(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stclral x30, [x29]\");\n\n  TEST_SINGLE(stset(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stsetb w30, [x29]\");\n  TEST_SINGLE(stset(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stseth w30, [x29]\");\n  TEST_SINGLE(stset(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stset w30, [x29]\");\n  TEST_SINGLE(stset(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stset x30, [x29]\");\n\n  TEST_SINGLE(stsetl(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stsetlb w30, [x29]\");\n  TEST_SINGLE(stsetl(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stsetlh w30, [x29]\");\n  TEST_SINGLE(stsetl(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stsetl w30, [x29]\");\n  TEST_SINGLE(stsetl(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stsetl x30, [x29]\");\n\n  TEST_SINGLE(stseta(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stsetab w30, [x29]\");\n  TEST_SINGLE(stseta(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stsetah w30, [x29]\");\n  TEST_SINGLE(stseta(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stseta w30, [x29]\");\n  TEST_SINGLE(stseta(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stseta x30, [x29]\");\n\n  TEST_SINGLE(stsetal(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stsetalb w30, [x29]\");\n  TEST_SINGLE(stsetal(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stsetalh w30, [x29]\");\n  TEST_SINGLE(stsetal(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stsetal w30, [x29]\");\n  TEST_SINGLE(stsetal(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stsetal x30, [x29]\");\n\n  TEST_SINGLE(steor(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"steorb w30, [x29]\");\n  TEST_SINGLE(steor(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"steorh w30, [x29]\");\n  TEST_SINGLE(steor(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"steor w30, [x29]\");\n  TEST_SINGLE(steor(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"steor x30, [x29]\");\n\n  TEST_SINGLE(steorl(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"steorlb w30, [x29]\");\n  TEST_SINGLE(steorl(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"steorlh w30, [x29]\");\n  TEST_SINGLE(steorl(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"steorl w30, [x29]\");\n  TEST_SINGLE(steorl(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"steorl x30, [x29]\");\n\n  TEST_SINGLE(steora(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"steorab w30, [x29]\");\n  TEST_SINGLE(steora(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"steorah w30, [x29]\");\n  TEST_SINGLE(steora(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"steora w30, [x29]\");\n  TEST_SINGLE(steora(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"steora x30, [x29]\");\n\n  TEST_SINGLE(steoral(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"steoralb w30, [x29]\");\n  TEST_SINGLE(steoral(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"steoralh w30, [x29]\");\n  TEST_SINGLE(steoral(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"steoral w30, [x29]\");\n  TEST_SINGLE(steoral(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"steoral x30, [x29]\");\n\n  TEST_SINGLE(stsmax(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stsmaxb w30, [x29]\");\n  TEST_SINGLE(stsmax(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stsmaxh w30, [x29]\");\n  TEST_SINGLE(stsmax(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stsmax w30, [x29]\");\n  TEST_SINGLE(stsmax(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stsmax x30, [x29]\");\n\n  TEST_SINGLE(stsmaxl(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stsmaxlb w30, [x29]\");\n  TEST_SINGLE(stsmaxl(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stsmaxlh w30, [x29]\");\n  TEST_SINGLE(stsmaxl(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stsmaxl w30, [x29]\");\n  TEST_SINGLE(stsmaxl(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stsmaxl x30, [x29]\");\n\n  TEST_SINGLE(stsmaxa(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stsmaxab w30, [x29]\");\n  TEST_SINGLE(stsmaxa(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stsmaxah w30, [x29]\");\n  TEST_SINGLE(stsmaxa(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stsmaxa w30, [x29]\");\n  TEST_SINGLE(stsmaxa(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stsmaxa x30, [x29]\");\n\n  TEST_SINGLE(stsmaxal(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stsmaxalb w30, [x29]\");\n  TEST_SINGLE(stsmaxal(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stsmaxalh w30, [x29]\");\n  TEST_SINGLE(stsmaxal(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stsmaxal w30, [x29]\");\n  TEST_SINGLE(stsmaxal(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stsmaxal x30, [x29]\");\n\n  TEST_SINGLE(stsmin(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stsminb w30, [x29]\");\n  TEST_SINGLE(stsmin(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stsminh w30, [x29]\");\n  TEST_SINGLE(stsmin(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stsmin w30, [x29]\");\n  TEST_SINGLE(stsmin(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stsmin x30, [x29]\");\n\n  TEST_SINGLE(stsminl(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stsminlb w30, [x29]\");\n  TEST_SINGLE(stsminl(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stsminlh w30, [x29]\");\n  TEST_SINGLE(stsminl(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stsminl w30, [x29]\");\n  TEST_SINGLE(stsminl(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stsminl x30, [x29]\");\n\n  TEST_SINGLE(stsmina(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stsminab w30, [x29]\");\n  TEST_SINGLE(stsmina(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stsminah w30, [x29]\");\n  TEST_SINGLE(stsmina(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stsmina w30, [x29]\");\n  TEST_SINGLE(stsmina(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stsmina x30, [x29]\");\n\n  TEST_SINGLE(stsminal(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stsminalb w30, [x29]\");\n  TEST_SINGLE(stsminal(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stsminalh w30, [x29]\");\n  TEST_SINGLE(stsminal(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stsminal w30, [x29]\");\n  TEST_SINGLE(stsminal(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stsminal x30, [x29]\");\n\n  TEST_SINGLE(stumax(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stumaxb w30, [x29]\");\n  TEST_SINGLE(stumax(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stumaxh w30, [x29]\");\n  TEST_SINGLE(stumax(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stumax w30, [x29]\");\n  TEST_SINGLE(stumax(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stumax x30, [x29]\");\n\n  TEST_SINGLE(stumaxl(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stumaxlb w30, [x29]\");\n  TEST_SINGLE(stumaxl(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stumaxlh w30, [x29]\");\n  TEST_SINGLE(stumaxl(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stumaxl w30, [x29]\");\n  TEST_SINGLE(stumaxl(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stumaxl x30, [x29]\");\n\n  TEST_SINGLE(stumaxa(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stumaxab w30, [x29]\");\n  TEST_SINGLE(stumaxa(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stumaxah w30, [x29]\");\n  TEST_SINGLE(stumaxa(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stumaxa w30, [x29]\");\n  TEST_SINGLE(stumaxa(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stumaxa x30, [x29]\");\n\n  TEST_SINGLE(stumaxal(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stumaxalb w30, [x29]\");\n  TEST_SINGLE(stumaxal(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stumaxalh w30, [x29]\");\n  TEST_SINGLE(stumaxal(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stumaxal w30, [x29]\");\n  TEST_SINGLE(stumaxal(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stumaxal x30, [x29]\");\n\n  TEST_SINGLE(stumin(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stuminb w30, [x29]\");\n  TEST_SINGLE(stumin(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stuminh w30, [x29]\");\n  TEST_SINGLE(stumin(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stumin w30, [x29]\");\n  TEST_SINGLE(stumin(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stumin x30, [x29]\");\n\n  TEST_SINGLE(stuminl(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stuminlb w30, [x29]\");\n  TEST_SINGLE(stuminl(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stuminlh w30, [x29]\");\n  TEST_SINGLE(stuminl(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stuminl w30, [x29]\");\n  TEST_SINGLE(stuminl(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stuminl x30, [x29]\");\n\n  TEST_SINGLE(stumina(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stuminab w30, [x29]\");\n  TEST_SINGLE(stumina(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stuminah w30, [x29]\");\n  TEST_SINGLE(stumina(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stumina w30, [x29]\");\n  TEST_SINGLE(stumina(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stumina x30, [x29]\");\n\n  TEST_SINGLE(stuminal(SubRegSize::i8Bit, Reg::r30, Reg::r29), \"stuminalb w30, [x29]\");\n  TEST_SINGLE(stuminal(SubRegSize::i16Bit, Reg::r30, Reg::r29), \"stuminalh w30, [x29]\");\n  TEST_SINGLE(stuminal(SubRegSize::i32Bit, Reg::r30, Reg::r29), \"stuminal w30, [x29]\");\n  TEST_SINGLE(stuminal(SubRegSize::i64Bit, Reg::r30, Reg::r29), \"stuminal x30, [x29]\");\n\n  TEST_SINGLE(ldswp(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"swpb w30, w28, [x29]\");\n  TEST_SINGLE(ldswp(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"swph w30, w28, [x29]\");\n  TEST_SINGLE(ldswp(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"swp w30, w28, [x29]\");\n  TEST_SINGLE(ldswp(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"swp x30, x28, [x29]\");\n\n  TEST_SINGLE(ldswpl(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"swplb w30, w28, [x29]\");\n  TEST_SINGLE(ldswpl(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"swplh w30, w28, [x29]\");\n  TEST_SINGLE(ldswpl(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"swpl w30, w28, [x29]\");\n  TEST_SINGLE(ldswpl(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"swpl x30, x28, [x29]\");\n\n  TEST_SINGLE(ldswpa(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"swpab w30, w28, [x29]\");\n  TEST_SINGLE(ldswpa(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"swpah w30, w28, [x29]\");\n  TEST_SINGLE(ldswpa(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"swpa w30, w28, [x29]\");\n  TEST_SINGLE(ldswpa(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"swpa x30, x28, [x29]\");\n\n  TEST_SINGLE(ldswpal(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"swpalb w30, w28, [x29]\");\n  TEST_SINGLE(ldswpal(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"swpalh w30, w28, [x29]\");\n  TEST_SINGLE(ldswpal(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"swpal w30, w28, [x29]\");\n  TEST_SINGLE(ldswpal(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"swpal x30, x28, [x29]\");\n\n  TEST_SINGLE(ldadd(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldaddb w30, w28, [x29]\");\n  TEST_SINGLE(ldadd(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldaddh w30, w28, [x29]\");\n  TEST_SINGLE(ldadd(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldadd w30, w28, [x29]\");\n  TEST_SINGLE(ldadd(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldadd x30, x28, [x29]\");\n\n  TEST_SINGLE(ldaddl(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldaddlb w30, w28, [x29]\");\n  TEST_SINGLE(ldaddl(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldaddlh w30, w28, [x29]\");\n  TEST_SINGLE(ldaddl(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldaddl w30, w28, [x29]\");\n  TEST_SINGLE(ldaddl(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldaddl x30, x28, [x29]\");\n\n  TEST_SINGLE(ldadda(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldaddab w30, w28, [x29]\");\n  TEST_SINGLE(ldadda(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldaddah w30, w28, [x29]\");\n  TEST_SINGLE(ldadda(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldadda w30, w28, [x29]\");\n  TEST_SINGLE(ldadda(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldadda x30, x28, [x29]\");\n\n  TEST_SINGLE(ldaddal(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldaddalb w30, w28, [x29]\");\n  TEST_SINGLE(ldaddal(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldaddalh w30, w28, [x29]\");\n  TEST_SINGLE(ldaddal(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldaddal w30, w28, [x29]\");\n  TEST_SINGLE(ldaddal(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldaddal x30, x28, [x29]\");\n\n  TEST_SINGLE(ldclr(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclrb w30, w28, [x29]\");\n  TEST_SINGLE(ldclr(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclrh w30, w28, [x29]\");\n  TEST_SINGLE(ldclr(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclr w30, w28, [x29]\");\n  TEST_SINGLE(ldclr(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclr x30, x28, [x29]\");\n\n  TEST_SINGLE(ldclrl(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclrlb w30, w28, [x29]\");\n  TEST_SINGLE(ldclrl(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclrlh w30, w28, [x29]\");\n  TEST_SINGLE(ldclrl(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclrl w30, w28, [x29]\");\n  TEST_SINGLE(ldclrl(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclrl x30, x28, [x29]\");\n\n  TEST_SINGLE(ldclra(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclrab w30, w28, [x29]\");\n  TEST_SINGLE(ldclra(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclrah w30, w28, [x29]\");\n  TEST_SINGLE(ldclra(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclra w30, w28, [x29]\");\n  TEST_SINGLE(ldclra(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclra x30, x28, [x29]\");\n\n  TEST_SINGLE(ldclral(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclralb w30, w28, [x29]\");\n  TEST_SINGLE(ldclral(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclralh w30, w28, [x29]\");\n  TEST_SINGLE(ldclral(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclral w30, w28, [x29]\");\n  TEST_SINGLE(ldclral(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldclral x30, x28, [x29]\");\n\n  TEST_SINGLE(ldset(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldsetb w30, w28, [x29]\");\n  TEST_SINGLE(ldset(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldseth w30, w28, [x29]\");\n  TEST_SINGLE(ldset(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldset w30, w28, [x29]\");\n  TEST_SINGLE(ldset(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldset x30, x28, [x29]\");\n\n  TEST_SINGLE(ldsetl(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldsetlb w30, w28, [x29]\");\n  TEST_SINGLE(ldsetl(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldsetlh w30, w28, [x29]\");\n  TEST_SINGLE(ldsetl(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldsetl w30, w28, [x29]\");\n  TEST_SINGLE(ldsetl(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldsetl x30, x28, [x29]\");\n\n  TEST_SINGLE(ldseta(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldsetab w30, w28, [x29]\");\n  TEST_SINGLE(ldseta(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldsetah w30, w28, [x29]\");\n  TEST_SINGLE(ldseta(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldseta w30, w28, [x29]\");\n  TEST_SINGLE(ldseta(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldseta x30, x28, [x29]\");\n\n  TEST_SINGLE(ldsetal(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldsetalb w30, w28, [x29]\");\n  TEST_SINGLE(ldsetal(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldsetalh w30, w28, [x29]\");\n  TEST_SINGLE(ldsetal(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldsetal w30, w28, [x29]\");\n  TEST_SINGLE(ldsetal(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldsetal x30, x28, [x29]\");\n\n  TEST_SINGLE(ldeor(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeorb w30, w28, [x29]\");\n  TEST_SINGLE(ldeor(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeorh w30, w28, [x29]\");\n  TEST_SINGLE(ldeor(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeor w30, w28, [x29]\");\n  TEST_SINGLE(ldeor(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeor x30, x28, [x29]\");\n\n  TEST_SINGLE(ldeorl(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeorlb w30, w28, [x29]\");\n  TEST_SINGLE(ldeorl(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeorlh w30, w28, [x29]\");\n  TEST_SINGLE(ldeorl(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeorl w30, w28, [x29]\");\n  TEST_SINGLE(ldeorl(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeorl x30, x28, [x29]\");\n\n  TEST_SINGLE(ldeora(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeorab w30, w28, [x29]\");\n  TEST_SINGLE(ldeora(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeorah w30, w28, [x29]\");\n  TEST_SINGLE(ldeora(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeora w30, w28, [x29]\");\n  TEST_SINGLE(ldeora(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeora x30, x28, [x29]\");\n\n  TEST_SINGLE(ldeoral(SubRegSize::i8Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeoralb w30, w28, [x29]\");\n  TEST_SINGLE(ldeoral(SubRegSize::i16Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeoralh w30, w28, [x29]\");\n  TEST_SINGLE(ldeoral(SubRegSize::i32Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeoral w30, w28, [x29]\");\n  TEST_SINGLE(ldeoral(SubRegSize::i64Bit, Reg::r30, Reg::r28, Reg::r29), \"ldeoral x30, x28, [x29]\");\n\n  TEST_SINGLE(ldaddb(Reg::r30, Reg::r28, Reg::r29), \"ldaddb w30, w28, [x29]\");\n  TEST_SINGLE(ldclrb(Reg::r30, Reg::r28, Reg::r29), \"ldclrb w30, w28, [x29]\");\n  TEST_SINGLE(ldeorb(Reg::r30, Reg::r28, Reg::r29), \"ldeorb w30, w28, [x29]\");\n  TEST_SINGLE(ldsetb(Reg::r30, Reg::r28, Reg::r29), \"ldsetb w30, w28, [x29]\");\n  TEST_SINGLE(ldsmaxb(Reg::r30, Reg::r28, Reg::r29), \"ldsmaxb w30, w28, [x29]\");\n  TEST_SINGLE(ldsminb(Reg::r30, Reg::r28, Reg::r29), \"ldsminb w30, w28, [x29]\");\n  TEST_SINGLE(ldumaxb(Reg::r30, Reg::r28, Reg::r29), \"ldumaxb w30, w28, [x29]\");\n  TEST_SINGLE(lduminb(Reg::r30, Reg::r28, Reg::r29), \"lduminb w30, w28, [x29]\");\n  TEST_SINGLE(ldswpb(Reg::r30, Reg::r28, Reg::r29), \"swpb w30, w28, [x29]\");\n  TEST_SINGLE(ldaddlb(Reg::r30, Reg::r28, Reg::r29), \"ldaddlb w30, w28, [x29]\");\n  TEST_SINGLE(ldclrlb(Reg::r30, Reg::r28, Reg::r29), \"ldclrlb w30, w28, [x29]\");\n  TEST_SINGLE(ldeorlb(Reg::r30, Reg::r28, Reg::r29), \"ldeorlb w30, w28, [x29]\");\n  TEST_SINGLE(ldsetlb(Reg::r30, Reg::r28, Reg::r29), \"ldsetlb w30, w28, [x29]\");\n  TEST_SINGLE(ldsmaxlb(Reg::r30, Reg::r28, Reg::r29), \"ldsmaxlb w30, w28, [x29]\");\n  TEST_SINGLE(ldsminlb(Reg::r30, Reg::r28, Reg::r29), \"ldsminlb w30, w28, [x29]\");\n  TEST_SINGLE(ldumaxlb(Reg::r30, Reg::r28, Reg::r29), \"ldumaxlb w30, w28, [x29]\");\n  TEST_SINGLE(lduminlb(Reg::r30, Reg::r28, Reg::r29), \"lduminlb w30, w28, [x29]\");\n  TEST_SINGLE(ldswplb(Reg::r30, Reg::r28, Reg::r29), \"swplb w30, w28, [x29]\");\n  TEST_SINGLE(ldaddab(Reg::r30, Reg::r28, Reg::r29), \"ldaddab w30, w28, [x29]\");\n  TEST_SINGLE(ldclrab(Reg::r30, Reg::r28, Reg::r29), \"ldclrab w30, w28, [x29]\");\n  TEST_SINGLE(ldeorab(Reg::r30, Reg::r28, Reg::r29), \"ldeorab w30, w28, [x29]\");\n  TEST_SINGLE(ldsetab(Reg::r30, Reg::r28, Reg::r29), \"ldsetab w30, w28, [x29]\");\n  TEST_SINGLE(ldsmaxab(Reg::r30, Reg::r28, Reg::r29), \"ldsmaxab w30, w28, [x29]\");\n  TEST_SINGLE(ldsminab(Reg::r30, Reg::r28, Reg::r29), \"ldsminab w30, w28, [x29]\");\n  TEST_SINGLE(ldumaxab(Reg::r30, Reg::r28, Reg::r29), \"ldumaxab w30, w28, [x29]\");\n  TEST_SINGLE(lduminab(Reg::r30, Reg::r28, Reg::r29), \"lduminab w30, w28, [x29]\");\n  TEST_SINGLE(ldswpab(Reg::r30, Reg::r28, Reg::r29), \"swpab w30, w28, [x29]\");\n  TEST_SINGLE(ldaddalb(Reg::r30, Reg::r28, Reg::r29), \"ldaddalb w30, w28, [x29]\");\n  TEST_SINGLE(ldclralb(Reg::r30, Reg::r28, Reg::r29), \"ldclralb w30, w28, [x29]\");\n  TEST_SINGLE(ldeoralb(Reg::r30, Reg::r28, Reg::r29), \"ldeoralb w30, w28, [x29]\");\n  TEST_SINGLE(ldsetalb(Reg::r30, Reg::r28, Reg::r29), \"ldsetalb w30, w28, [x29]\");\n  TEST_SINGLE(ldsmaxalb(Reg::r30, Reg::r28, Reg::r29), \"ldsmaxalb w30, w28, [x29]\");\n  TEST_SINGLE(ldsminalb(Reg::r30, Reg::r28, Reg::r29), \"ldsminalb w30, w28, [x29]\");\n  TEST_SINGLE(ldumaxalb(Reg::r30, Reg::r28, Reg::r29), \"ldumaxalb w30, w28, [x29]\");\n  TEST_SINGLE(lduminalb(Reg::r30, Reg::r28, Reg::r29), \"lduminalb w30, w28, [x29]\");\n  TEST_SINGLE(ldswpalb(Reg::r30, Reg::r28, Reg::r29), \"swpalb w30, w28, [x29]\");\n\n  TEST_SINGLE(ldaddh(Reg::r30, Reg::r28, Reg::r29), \"ldaddh w30, w28, [x29]\");\n  TEST_SINGLE(ldclrh(Reg::r30, Reg::r28, Reg::r29), \"ldclrh w30, w28, [x29]\");\n  TEST_SINGLE(ldeorh(Reg::r30, Reg::r28, Reg::r29), \"ldeorh w30, w28, [x29]\");\n  TEST_SINGLE(ldseth(Reg::r30, Reg::r28, Reg::r29), \"ldseth w30, w28, [x29]\");\n  TEST_SINGLE(ldsmaxh(Reg::r30, Reg::r28, Reg::r29), \"ldsmaxh w30, w28, [x29]\");\n  TEST_SINGLE(ldsminh(Reg::r30, Reg::r28, Reg::r29), \"ldsminh w30, w28, [x29]\");\n  TEST_SINGLE(ldumaxh(Reg::r30, Reg::r28, Reg::r29), \"ldumaxh w30, w28, [x29]\");\n  TEST_SINGLE(lduminh(Reg::r30, Reg::r28, Reg::r29), \"lduminh w30, w28, [x29]\");\n  TEST_SINGLE(ldswph(Reg::r30, Reg::r28, Reg::r29), \"swph w30, w28, [x29]\");\n  TEST_SINGLE(ldaddlh(Reg::r30, Reg::r28, Reg::r29), \"ldaddlh w30, w28, [x29]\");\n  TEST_SINGLE(ldclrlh(Reg::r30, Reg::r28, Reg::r29), \"ldclrlh w30, w28, [x29]\");\n  TEST_SINGLE(ldeorlh(Reg::r30, Reg::r28, Reg::r29), \"ldeorlh w30, w28, [x29]\");\n  TEST_SINGLE(ldsetlh(Reg::r30, Reg::r28, Reg::r29), \"ldsetlh w30, w28, [x29]\");\n  TEST_SINGLE(ldsmaxlh(Reg::r30, Reg::r28, Reg::r29), \"ldsmaxlh w30, w28, [x29]\");\n  TEST_SINGLE(ldsminlh(Reg::r30, Reg::r28, Reg::r29), \"ldsminlh w30, w28, [x29]\");\n  TEST_SINGLE(ldumaxlh(Reg::r30, Reg::r28, Reg::r29), \"ldumaxlh w30, w28, [x29]\");\n  TEST_SINGLE(lduminlh(Reg::r30, Reg::r28, Reg::r29), \"lduminlh w30, w28, [x29]\");\n  TEST_SINGLE(ldswplh(Reg::r30, Reg::r28, Reg::r29), \"swplh w30, w28, [x29]\");\n  TEST_SINGLE(ldaddah(Reg::r30, Reg::r28, Reg::r29), \"ldaddah w30, w28, [x29]\");\n  TEST_SINGLE(ldclrah(Reg::r30, Reg::r28, Reg::r29), \"ldclrah w30, w28, [x29]\");\n  TEST_SINGLE(ldeorah(Reg::r30, Reg::r28, Reg::r29), \"ldeorah w30, w28, [x29]\");\n  TEST_SINGLE(ldsetah(Reg::r30, Reg::r28, Reg::r29), \"ldsetah w30, w28, [x29]\");\n  TEST_SINGLE(ldsmaxah(Reg::r30, Reg::r28, Reg::r29), \"ldsmaxah w30, w28, [x29]\");\n  TEST_SINGLE(ldsminah(Reg::r30, Reg::r28, Reg::r29), \"ldsminah w30, w28, [x29]\");\n  TEST_SINGLE(ldumaxah(Reg::r30, Reg::r28, Reg::r29), \"ldumaxah w30, w28, [x29]\");\n  TEST_SINGLE(lduminah(Reg::r30, Reg::r28, Reg::r29), \"lduminah w30, w28, [x29]\");\n  TEST_SINGLE(ldswpah(Reg::r30, Reg::r28, Reg::r29), \"swpah w30, w28, [x29]\");\n  TEST_SINGLE(ldaddalh(Reg::r30, Reg::r28, Reg::r29), \"ldaddalh w30, w28, [x29]\");\n  TEST_SINGLE(ldclralh(Reg::r30, Reg::r28, Reg::r29), \"ldclralh w30, w28, [x29]\");\n  TEST_SINGLE(ldeoralh(Reg::r30, Reg::r28, Reg::r29), \"ldeoralh w30, w28, [x29]\");\n  TEST_SINGLE(ldsetalh(Reg::r30, Reg::r28, Reg::r29), \"ldsetalh w30, w28, [x29]\");\n  TEST_SINGLE(ldsmaxalh(Reg::r30, Reg::r28, Reg::r29), \"ldsmaxalh w30, w28, [x29]\");\n  TEST_SINGLE(ldsminalh(Reg::r30, Reg::r28, Reg::r29), \"ldsminalh w30, w28, [x29]\");\n  TEST_SINGLE(ldumaxalh(Reg::r30, Reg::r28, Reg::r29), \"ldumaxalh w30, w28, [x29]\");\n  TEST_SINGLE(lduminalh(Reg::r30, Reg::r28, Reg::r29), \"lduminalh w30, w28, [x29]\");\n  TEST_SINGLE(ldswpalh(Reg::r30, Reg::r28, Reg::r29), \"swpalh w30, w28, [x29]\");\n\n  TEST_SINGLE(ldadd(WReg::w30, WReg::w28, Reg::r29), \"ldadd w30, w28, [x29]\");\n  TEST_SINGLE(ldclr(WReg::w30, WReg::w28, Reg::r29), \"ldclr w30, w28, [x29]\");\n  TEST_SINGLE(ldeor(WReg::w30, WReg::w28, Reg::r29), \"ldeor w30, w28, [x29]\");\n  TEST_SINGLE(ldset(WReg::w30, WReg::w28, Reg::r29), \"ldset w30, w28, [x29]\");\n  TEST_SINGLE(ldsmax(WReg::w30, WReg::w28, Reg::r29), \"ldsmax w30, w28, [x29]\");\n  TEST_SINGLE(ldsmin(WReg::w30, WReg::w28, Reg::r29), \"ldsmin w30, w28, [x29]\");\n  TEST_SINGLE(ldumax(WReg::w30, WReg::w28, Reg::r29), \"ldumax w30, w28, [x29]\");\n  TEST_SINGLE(ldumin(WReg::w30, WReg::w28, Reg::r29), \"ldumin w30, w28, [x29]\");\n  TEST_SINGLE(ldswp(WReg::w30, WReg::w28, Reg::r29), \"swp w30, w28, [x29]\");\n  TEST_SINGLE(ldaddl(WReg::w30, WReg::w28, Reg::r29), \"ldaddl w30, w28, [x29]\");\n  TEST_SINGLE(ldclrl(WReg::w30, WReg::w28, Reg::r29), \"ldclrl w30, w28, [x29]\");\n  TEST_SINGLE(ldeorl(WReg::w30, WReg::w28, Reg::r29), \"ldeorl w30, w28, [x29]\");\n  TEST_SINGLE(ldsetl(WReg::w30, WReg::w28, Reg::r29), \"ldsetl w30, w28, [x29]\");\n  TEST_SINGLE(ldsmaxl(WReg::w30, WReg::w28, Reg::r29), \"ldsmaxl w30, w28, [x29]\");\n  TEST_SINGLE(ldsminl(WReg::w30, WReg::w28, Reg::r29), \"ldsminl w30, w28, [x29]\");\n  TEST_SINGLE(ldumaxl(WReg::w30, WReg::w28, Reg::r29), \"ldumaxl w30, w28, [x29]\");\n  TEST_SINGLE(lduminl(WReg::w30, WReg::w28, Reg::r29), \"lduminl w30, w28, [x29]\");\n  TEST_SINGLE(ldswpl(WReg::w30, WReg::w28, Reg::r29), \"swpl w30, w28, [x29]\");\n  TEST_SINGLE(ldadda(WReg::w30, WReg::w28, Reg::r29), \"ldadda w30, w28, [x29]\");\n  TEST_SINGLE(ldclra(WReg::w30, WReg::w28, Reg::r29), \"ldclra w30, w28, [x29]\");\n  TEST_SINGLE(ldeora(WReg::w30, WReg::w28, Reg::r29), \"ldeora w30, w28, [x29]\");\n  TEST_SINGLE(ldseta(WReg::w30, WReg::w28, Reg::r29), \"ldseta w30, w28, [x29]\");\n  TEST_SINGLE(ldsmaxa(WReg::w30, WReg::w28, Reg::r29), \"ldsmaxa w30, w28, [x29]\");\n  TEST_SINGLE(ldsmina(WReg::w30, WReg::w28, Reg::r29), \"ldsmina w30, w28, [x29]\");\n  TEST_SINGLE(ldumaxa(WReg::w30, WReg::w28, Reg::r29), \"ldumaxa w30, w28, [x29]\");\n  TEST_SINGLE(ldumina(WReg::w30, WReg::w28, Reg::r29), \"ldumina w30, w28, [x29]\");\n  TEST_SINGLE(ldswpa(WReg::w30, WReg::w28, Reg::r29), \"swpa w30, w28, [x29]\");\n  TEST_SINGLE(ldaddal(WReg::w30, WReg::w28, Reg::r29), \"ldaddal w30, w28, [x29]\");\n  TEST_SINGLE(ldclral(WReg::w30, WReg::w28, Reg::r29), \"ldclral w30, w28, [x29]\");\n  TEST_SINGLE(ldeoral(WReg::w30, WReg::w28, Reg::r29), \"ldeoral w30, w28, [x29]\");\n  TEST_SINGLE(ldsetal(WReg::w30, WReg::w28, Reg::r29), \"ldsetal w30, w28, [x29]\");\n  TEST_SINGLE(ldsmaxal(WReg::w30, WReg::w28, Reg::r29), \"ldsmaxal w30, w28, [x29]\");\n  TEST_SINGLE(ldsminal(WReg::w30, WReg::w28, Reg::r29), \"ldsminal w30, w28, [x29]\");\n  TEST_SINGLE(ldumaxal(WReg::w30, WReg::w28, Reg::r29), \"ldumaxal w30, w28, [x29]\");\n  TEST_SINGLE(lduminal(WReg::w30, WReg::w28, Reg::r29), \"lduminal w30, w28, [x29]\");\n  TEST_SINGLE(ldswpal(WReg::w30, WReg::w28, Reg::r29), \"swpal w30, w28, [x29]\");\n\n  TEST_SINGLE(ldadd(XReg::x30, XReg::x28, Reg::r29), \"ldadd x30, x28, [x29]\");\n  TEST_SINGLE(ldclr(XReg::x30, XReg::x28, Reg::r29), \"ldclr x30, x28, [x29]\");\n  TEST_SINGLE(ldeor(XReg::x30, XReg::x28, Reg::r29), \"ldeor x30, x28, [x29]\");\n  TEST_SINGLE(ldset(XReg::x30, XReg::x28, Reg::r29), \"ldset x30, x28, [x29]\");\n  TEST_SINGLE(ldsmax(XReg::x30, XReg::x28, Reg::r29), \"ldsmax x30, x28, [x29]\");\n  TEST_SINGLE(ldsmin(XReg::x30, XReg::x28, Reg::r29), \"ldsmin x30, x28, [x29]\");\n  TEST_SINGLE(ldumax(XReg::x30, XReg::x28, Reg::r29), \"ldumax x30, x28, [x29]\");\n  TEST_SINGLE(ldumin(XReg::x30, XReg::x28, Reg::r29), \"ldumin x30, x28, [x29]\");\n  TEST_SINGLE(ldswp(XReg::x30, XReg::x28, Reg::r29), \"swp x30, x28, [x29]\");\n  TEST_SINGLE(ldaddl(XReg::x30, XReg::x28, Reg::r29), \"ldaddl x30, x28, [x29]\");\n  TEST_SINGLE(ldclrl(XReg::x30, XReg::x28, Reg::r29), \"ldclrl x30, x28, [x29]\");\n  TEST_SINGLE(ldeorl(XReg::x30, XReg::x28, Reg::r29), \"ldeorl x30, x28, [x29]\");\n  TEST_SINGLE(ldsetl(XReg::x30, XReg::x28, Reg::r29), \"ldsetl x30, x28, [x29]\");\n  TEST_SINGLE(ldsmaxl(XReg::x30, XReg::x28, Reg::r29), \"ldsmaxl x30, x28, [x29]\");\n  TEST_SINGLE(ldsminl(XReg::x30, XReg::x28, Reg::r29), \"ldsminl x30, x28, [x29]\");\n  TEST_SINGLE(ldumaxl(XReg::x30, XReg::x28, Reg::r29), \"ldumaxl x30, x28, [x29]\");\n  TEST_SINGLE(lduminl(XReg::x30, XReg::x28, Reg::r29), \"lduminl x30, x28, [x29]\");\n  TEST_SINGLE(ldswpl(XReg::x30, XReg::x28, Reg::r29), \"swpl x30, x28, [x29]\");\n  TEST_SINGLE(ldadda(XReg::x30, XReg::x28, Reg::r29), \"ldadda x30, x28, [x29]\");\n  TEST_SINGLE(ldclra(XReg::x30, XReg::x28, Reg::r29), \"ldclra x30, x28, [x29]\");\n  TEST_SINGLE(ldeora(XReg::x30, XReg::x28, Reg::r29), \"ldeora x30, x28, [x29]\");\n  TEST_SINGLE(ldseta(XReg::x30, XReg::x28, Reg::r29), \"ldseta x30, x28, [x29]\");\n  TEST_SINGLE(ldsmaxa(XReg::x30, XReg::x28, Reg::r29), \"ldsmaxa x30, x28, [x29]\");\n  TEST_SINGLE(ldsmina(XReg::x30, XReg::x28, Reg::r29), \"ldsmina x30, x28, [x29]\");\n  TEST_SINGLE(ldumaxa(XReg::x30, XReg::x28, Reg::r29), \"ldumaxa x30, x28, [x29]\");\n  TEST_SINGLE(ldumina(XReg::x30, XReg::x28, Reg::r29), \"ldumina x30, x28, [x29]\");\n  TEST_SINGLE(ldswpa(XReg::x30, XReg::x28, Reg::r29), \"swpa x30, x28, [x29]\");\n  TEST_SINGLE(ldaddal(XReg::x30, XReg::x28, Reg::r29), \"ldaddal x30, x28, [x29]\");\n  TEST_SINGLE(ldclral(XReg::x30, XReg::x28, Reg::r29), \"ldclral x30, x28, [x29]\");\n  TEST_SINGLE(ldeoral(XReg::x30, XReg::x28, Reg::r29), \"ldeoral x30, x28, [x29]\");\n  TEST_SINGLE(ldsetal(XReg::x30, XReg::x28, Reg::r29), \"ldsetal x30, x28, [x29]\");\n  TEST_SINGLE(ldsmaxal(XReg::x30, XReg::x28, Reg::r29), \"ldsmaxal x30, x28, [x29]\");\n  TEST_SINGLE(ldsminal(XReg::x30, XReg::x28, Reg::r29), \"ldsminal x30, x28, [x29]\");\n  TEST_SINGLE(ldumaxal(XReg::x30, XReg::x28, Reg::r29), \"ldumaxal x30, x28, [x29]\");\n  TEST_SINGLE(lduminal(XReg::x30, XReg::x28, Reg::r29), \"lduminal x30, x28, [x29]\");\n  TEST_SINGLE(ldswpal(XReg::x30, XReg::x28, Reg::r29), \"swpal x30, x28, [x29]\");\n\n  TEST_SINGLE(ldaprb(WReg::w30, Reg::r29), \"ldaprb w30, [x29]\");\n  TEST_SINGLE(ldaprh(WReg::w30, Reg::r29), \"ldaprh w30, [x29]\");\n  TEST_SINGLE(ldapr(WReg::w30, Reg::r29), \"ldapr w30, [x29]\");\n  TEST_SINGLE(ldapr(XReg::x30, Reg::r29), \"ldapr x30, [x29]\");\n\n  if (false) {\n    // vixl can't disassemble this class of instructions.\n    TEST_SINGLE(st64bv0(XReg::x30, XReg::x28, Reg::r29), \"st64bv0 x30, x28, [x29]\");\n    TEST_SINGLE(st64bv(XReg::x30, XReg::x28, Reg::r29), \"st64bv x30, x28, [x29]\");\n    TEST_SINGLE(st64b(XReg::x30, Reg::r29), \"st64bv x30, [x29]\");\n    TEST_SINGLE(ld64b(XReg::x30, Reg::r29), \"ld64b x30, [x29]\");\n  }\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Loadstore register-register offset\") {\n  TEST_SINGLE(strb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::LSL_64, false), \"strb w30, [x28, x29]\");\n  TEST_SINGLE(strb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::LSL_64, true), \"strb w30, [x28, x29, lsl #0]\");\n  TEST_SINGLE(strb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::UXTW, false), \"strb w30, [x28, w29, uxtw]\");\n  TEST_SINGLE(strb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::UXTW, true), \"strb w30, [x28, w29, uxtw #0]\");\n  TEST_SINGLE(strb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTW, false), \"strb w30, [x28, w29, sxtw]\");\n  TEST_SINGLE(strb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTW, true), \"strb w30, [x28, w29, sxtw #0]\");\n  TEST_SINGLE(strb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTX, false), \"strb w30, [x28, x29, sxtx]\");\n  TEST_SINGLE(strb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTX, true), \"strb w30, [x28, x29, sxtx #0]\");\n\n  TEST_SINGLE(ldrb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::LSL_64, false), \"ldrb w30, [x28, x29]\");\n  TEST_SINGLE(ldrb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::LSL_64, true), \"ldrb w30, [x28, x29, lsl #0]\");\n  TEST_SINGLE(ldrb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::UXTW, false), \"ldrb w30, [x28, w29, uxtw]\");\n  TEST_SINGLE(ldrb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::UXTW, true), \"ldrb w30, [x28, w29, uxtw #0]\");\n  TEST_SINGLE(ldrb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTW, false), \"ldrb w30, [x28, w29, sxtw]\");\n  TEST_SINGLE(ldrb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTW, true), \"ldrb w30, [x28, w29, sxtw #0]\");\n  TEST_SINGLE(ldrb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTX, false), \"ldrb w30, [x28, x29, sxtx]\");\n  TEST_SINGLE(ldrb(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTX, true), \"ldrb w30, [x28, x29, sxtx #0]\");\n\n  TEST_SINGLE(ldrsb(WReg::w30, Reg::r28, Reg::r29, ExtendedType::LSL_64, false), \"ldrsb w30, [x28, x29]\");\n  TEST_SINGLE(ldrsb(WReg::w30, Reg::r28, Reg::r29, ExtendedType::LSL_64, true), \"ldrsb w30, [x28, x29, lsl #0]\");\n  TEST_SINGLE(ldrsb(WReg::w30, Reg::r28, Reg::r29, ExtendedType::UXTW, false), \"ldrsb w30, [x28, w29, uxtw]\");\n  TEST_SINGLE(ldrsb(WReg::w30, Reg::r28, Reg::r29, ExtendedType::UXTW, true), \"ldrsb w30, [x28, w29, uxtw #0]\");\n  TEST_SINGLE(ldrsb(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTW, false), \"ldrsb w30, [x28, w29, sxtw]\");\n  TEST_SINGLE(ldrsb(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTW, true), \"ldrsb w30, [x28, w29, sxtw #0]\");\n  TEST_SINGLE(ldrsb(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTX, false), \"ldrsb w30, [x28, x29, sxtx]\");\n  TEST_SINGLE(ldrsb(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTX, true), \"ldrsb w30, [x28, x29, sxtx #0]\");\n\n  TEST_SINGLE(ldrsb(XReg::x30, Reg::r28, Reg::r29, ExtendedType::LSL_64, false), \"ldrsb x30, [x28, x29]\");\n  TEST_SINGLE(ldrsb(XReg::x30, Reg::r28, Reg::r29, ExtendedType::LSL_64, true), \"ldrsb x30, [x28, x29, lsl #0]\");\n  TEST_SINGLE(ldrsb(XReg::x30, Reg::r28, Reg::r29, ExtendedType::UXTW, false), \"ldrsb x30, [x28, w29, uxtw]\");\n  TEST_SINGLE(ldrsb(XReg::x30, Reg::r28, Reg::r29, ExtendedType::UXTW, true), \"ldrsb x30, [x28, w29, uxtw #0]\");\n  TEST_SINGLE(ldrsb(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTW, false), \"ldrsb x30, [x28, w29, sxtw]\");\n  TEST_SINGLE(ldrsb(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTW, true), \"ldrsb x30, [x28, w29, sxtw #0]\");\n  TEST_SINGLE(ldrsb(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTX, false), \"ldrsb x30, [x28, x29, sxtx]\");\n  TEST_SINGLE(ldrsb(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTX, true), \"ldrsb x30, [x28, x29, sxtx #0]\");\n\n  TEST_SINGLE(strh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"strh w30, [x28, x29]\");\n  TEST_SINGLE(strh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 1), \"strh w30, [x28, x29, lsl #1]\");\n  TEST_SINGLE(strh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"strh w30, [x28, w29, uxtw]\");\n  TEST_SINGLE(strh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::UXTW, 1), \"strh w30, [x28, w29, uxtw #1]\");\n  TEST_SINGLE(strh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"strh w30, [x28, w29, sxtw]\");\n  TEST_SINGLE(strh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTW, 1), \"strh w30, [x28, w29, sxtw #1]\");\n  TEST_SINGLE(strh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"strh w30, [x28, x29, sxtx]\");\n  TEST_SINGLE(strh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTX, 1), \"strh w30, [x28, x29, sxtx #1]\");\n\n  TEST_SINGLE(ldrh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"ldrh w30, [x28, x29]\");\n  TEST_SINGLE(ldrh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 1), \"ldrh w30, [x28, x29, lsl #1]\");\n  TEST_SINGLE(ldrh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"ldrh w30, [x28, w29, uxtw]\");\n  TEST_SINGLE(ldrh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::UXTW, 1), \"ldrh w30, [x28, w29, uxtw #1]\");\n  TEST_SINGLE(ldrh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"ldrh w30, [x28, w29, sxtw]\");\n  TEST_SINGLE(ldrh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTW, 1), \"ldrh w30, [x28, w29, sxtw #1]\");\n  TEST_SINGLE(ldrh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"ldrh w30, [x28, x29, sxtx]\");\n  TEST_SINGLE(ldrh(Reg::r30, Reg::r28, Reg::r29, ExtendedType::SXTX, 1), \"ldrh w30, [x28, x29, sxtx #1]\");\n\n  TEST_SINGLE(ldrsh(WReg::w30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"ldrsh w30, [x28, x29]\");\n  TEST_SINGLE(ldrsh(WReg::w30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 1), \"ldrsh w30, [x28, x29, lsl #1]\");\n  TEST_SINGLE(ldrsh(WReg::w30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"ldrsh w30, [x28, w29, uxtw]\");\n  TEST_SINGLE(ldrsh(WReg::w30, Reg::r28, Reg::r29, ExtendedType::UXTW, 1), \"ldrsh w30, [x28, w29, uxtw #1]\");\n  TEST_SINGLE(ldrsh(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"ldrsh w30, [x28, w29, sxtw]\");\n  TEST_SINGLE(ldrsh(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTW, 1), \"ldrsh w30, [x28, w29, sxtw #1]\");\n  TEST_SINGLE(ldrsh(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"ldrsh w30, [x28, x29, sxtx]\");\n  TEST_SINGLE(ldrsh(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTX, 1), \"ldrsh w30, [x28, x29, sxtx #1]\");\n\n  TEST_SINGLE(ldrsh(XReg::x30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"ldrsh x30, [x28, x29]\");\n  TEST_SINGLE(ldrsh(XReg::x30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 1), \"ldrsh x30, [x28, x29, lsl #1]\");\n  TEST_SINGLE(ldrsh(XReg::x30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"ldrsh x30, [x28, w29, uxtw]\");\n  TEST_SINGLE(ldrsh(XReg::x30, Reg::r28, Reg::r29, ExtendedType::UXTW, 1), \"ldrsh x30, [x28, w29, uxtw #1]\");\n  TEST_SINGLE(ldrsh(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"ldrsh x30, [x28, w29, sxtw]\");\n  TEST_SINGLE(ldrsh(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTW, 1), \"ldrsh x30, [x28, w29, sxtw #1]\");\n  TEST_SINGLE(ldrsh(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"ldrsh x30, [x28, x29, sxtx]\");\n  TEST_SINGLE(ldrsh(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTX, 1), \"ldrsh x30, [x28, x29, sxtx #1]\");\n\n  TEST_SINGLE(str(WReg::w30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"str w30, [x28, x29]\");\n  TEST_SINGLE(str(WReg::w30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 2), \"str w30, [x28, x29, lsl #2]\");\n  TEST_SINGLE(str(WReg::w30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"str w30, [x28, w29, uxtw]\");\n  TEST_SINGLE(str(WReg::w30, Reg::r28, Reg::r29, ExtendedType::UXTW, 2), \"str w30, [x28, w29, uxtw #2]\");\n  TEST_SINGLE(str(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"str w30, [x28, w29, sxtw]\");\n  TEST_SINGLE(str(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTW, 2), \"str w30, [x28, w29, sxtw #2]\");\n  TEST_SINGLE(str(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"str w30, [x28, x29, sxtx]\");\n  TEST_SINGLE(str(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTX, 2), \"str w30, [x28, x29, sxtx #2]\");\n\n  TEST_SINGLE(ldr(WReg::w30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"ldr w30, [x28, x29]\");\n  TEST_SINGLE(ldr(WReg::w30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 2), \"ldr w30, [x28, x29, lsl #2]\");\n  TEST_SINGLE(ldr(WReg::w30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"ldr w30, [x28, w29, uxtw]\");\n  TEST_SINGLE(ldr(WReg::w30, Reg::r28, Reg::r29, ExtendedType::UXTW, 2), \"ldr w30, [x28, w29, uxtw #2]\");\n  TEST_SINGLE(ldr(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"ldr w30, [x28, w29, sxtw]\");\n  TEST_SINGLE(ldr(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTW, 2), \"ldr w30, [x28, w29, sxtw #2]\");\n  TEST_SINGLE(ldr(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"ldr w30, [x28, x29, sxtx]\");\n  TEST_SINGLE(ldr(WReg::w30, Reg::r28, Reg::r29, ExtendedType::SXTX, 2), \"ldr w30, [x28, x29, sxtx #2]\");\n\n  TEST_SINGLE(ldrsw(XReg::x30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"ldrsw x30, [x28, x29]\");\n  TEST_SINGLE(ldrsw(XReg::x30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 2), \"ldrsw x30, [x28, x29, lsl #2]\");\n  TEST_SINGLE(ldrsw(XReg::x30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"ldrsw x30, [x28, w29, uxtw]\");\n  TEST_SINGLE(ldrsw(XReg::x30, Reg::r28, Reg::r29, ExtendedType::UXTW, 2), \"ldrsw x30, [x28, w29, uxtw #2]\");\n  TEST_SINGLE(ldrsw(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"ldrsw x30, [x28, w29, sxtw]\");\n  TEST_SINGLE(ldrsw(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTW, 2), \"ldrsw x30, [x28, w29, sxtw #2]\");\n  TEST_SINGLE(ldrsw(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"ldrsw x30, [x28, x29, sxtx]\");\n  TEST_SINGLE(ldrsw(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTX, 2), \"ldrsw x30, [x28, x29, sxtx #2]\");\n\n  TEST_SINGLE(str(XReg::x30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"str x30, [x28, x29]\");\n  TEST_SINGLE(str(XReg::x30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 3), \"str x30, [x28, x29, lsl #3]\");\n  TEST_SINGLE(str(XReg::x30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"str x30, [x28, w29, uxtw]\");\n  TEST_SINGLE(str(XReg::x30, Reg::r28, Reg::r29, ExtendedType::UXTW, 3), \"str x30, [x28, w29, uxtw #3]\");\n  TEST_SINGLE(str(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"str x30, [x28, w29, sxtw]\");\n  TEST_SINGLE(str(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTW, 3), \"str x30, [x28, w29, sxtw #3]\");\n  TEST_SINGLE(str(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"str x30, [x28, x29, sxtx]\");\n  TEST_SINGLE(str(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTX, 3), \"str x30, [x28, x29, sxtx #3]\");\n\n  TEST_SINGLE(ldr(XReg::x30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"ldr x30, [x28, x29]\");\n  TEST_SINGLE(ldr(XReg::x30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 3), \"ldr x30, [x28, x29, lsl #3]\");\n  TEST_SINGLE(ldr(XReg::x30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"ldr x30, [x28, w29, uxtw]\");\n  TEST_SINGLE(ldr(XReg::x30, Reg::r28, Reg::r29, ExtendedType::UXTW, 3), \"ldr x30, [x28, w29, uxtw #3]\");\n  TEST_SINGLE(ldr(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"ldr x30, [x28, w29, sxtw]\");\n  TEST_SINGLE(ldr(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTW, 3), \"ldr x30, [x28, w29, sxtw #3]\");\n  TEST_SINGLE(ldr(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"ldr x30, [x28, x29, sxtx]\");\n  TEST_SINGLE(ldr(XReg::x30, Reg::r28, Reg::r29, ExtendedType::SXTX, 3), \"ldr x30, [x28, x29, sxtx #3]\");\n\n  TEST_SINGLE(prfm(Prefetch::PLDL1KEEP, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"prfm pldl1keep, [x28, x29]\");\n  TEST_SINGLE(prfm(Prefetch::PLDL1KEEP, Reg::r28, Reg::r29, ExtendedType::LSL_64, 3), \"prfm pldl1keep, [x28, x29, lsl #3]\");\n  TEST_SINGLE(prfm(Prefetch::PLDL1KEEP, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"prfm pldl1keep, [x28, w29, uxtw]\");\n  TEST_SINGLE(prfm(Prefetch::PLDL1KEEP, Reg::r28, Reg::r29, ExtendedType::UXTW, 3), \"prfm pldl1keep, [x28, w29, uxtw #3]\");\n  TEST_SINGLE(prfm(Prefetch::PLDL1KEEP, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"prfm pldl1keep, [x28, w29, sxtw]\");\n  TEST_SINGLE(prfm(Prefetch::PLDL1KEEP, Reg::r28, Reg::r29, ExtendedType::SXTW, 3), \"prfm pldl1keep, [x28, w29, sxtw #3]\");\n  TEST_SINGLE(prfm(Prefetch::PLDL1KEEP, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"prfm pldl1keep, [x28, x29, sxtx]\");\n  TEST_SINGLE(prfm(Prefetch::PLDL1KEEP, Reg::r28, Reg::r29, ExtendedType::SXTX, 3), \"prfm pldl1keep, [x28, x29, sxtx #3]\");\n\n  TEST_SINGLE(strb(VReg::v30, Reg::r28, Reg::r29, ExtendedType::LSL_64), \"str b30, [x28, x29]\");\n  TEST_SINGLE(strb(VReg::v30, Reg::r28, Reg::r29, ExtendedType::UXTW), \"str b30, [x28, w29, uxtw]\");\n  TEST_SINGLE(strb(VReg::v30, Reg::r28, Reg::r29, ExtendedType::SXTW), \"str b30, [x28, w29, sxtw]\");\n  TEST_SINGLE(strb(VReg::v30, Reg::r28, Reg::r29, ExtendedType::SXTX), \"str b30, [x28, x29, sxtx]\");\n\n  TEST_SINGLE(ldrb(VReg::v30, Reg::r28, Reg::r29, ExtendedType::LSL_64), \"ldr b30, [x28, x29]\");\n  TEST_SINGLE(ldrb(VReg::v30, Reg::r28, Reg::r29, ExtendedType::UXTW), \"ldr b30, [x28, w29, uxtw]\");\n  TEST_SINGLE(ldrb(VReg::v30, Reg::r28, Reg::r29, ExtendedType::SXTW), \"ldr b30, [x28, w29, sxtw]\");\n  TEST_SINGLE(ldrb(VReg::v30, Reg::r28, Reg::r29, ExtendedType::SXTX), \"ldr b30, [x28, x29, sxtx]\");\n\n  TEST_SINGLE(strh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"str h30, [x28, x29]\");\n  TEST_SINGLE(strh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 1), \"str h30, [x28, x29, lsl #1]\");\n  TEST_SINGLE(strh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"str h30, [x28, w29, uxtw]\");\n  TEST_SINGLE(strh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::UXTW, 1), \"str h30, [x28, w29, uxtw #1]\");\n  TEST_SINGLE(strh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"str h30, [x28, w29, sxtw]\");\n  TEST_SINGLE(strh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::SXTW, 1), \"str h30, [x28, w29, sxtw #1]\");\n  TEST_SINGLE(strh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"str h30, [x28, x29, sxtx]\");\n  TEST_SINGLE(strh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::SXTX, 1), \"str h30, [x28, x29, sxtx #1]\");\n\n  TEST_SINGLE(ldrh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"ldr h30, [x28, x29]\");\n  TEST_SINGLE(ldrh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 1), \"ldr h30, [x28, x29, lsl #1]\");\n  TEST_SINGLE(ldrh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"ldr h30, [x28, w29, uxtw]\");\n  TEST_SINGLE(ldrh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::UXTW, 1), \"ldr h30, [x28, w29, uxtw #1]\");\n  TEST_SINGLE(ldrh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"ldr h30, [x28, w29, sxtw]\");\n  TEST_SINGLE(ldrh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::SXTW, 1), \"ldr h30, [x28, w29, sxtw #1]\");\n  TEST_SINGLE(ldrh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"ldr h30, [x28, x29, sxtx]\");\n  TEST_SINGLE(ldrh(VReg::v30, Reg::r28, Reg::r29, ExtendedType::SXTX, 1), \"ldr h30, [x28, x29, sxtx #1]\");\n\n  TEST_SINGLE(str(SReg::s30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"str s30, [x28, x29]\");\n  TEST_SINGLE(str(SReg::s30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 2), \"str s30, [x28, x29, lsl #2]\");\n  TEST_SINGLE(str(SReg::s30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"str s30, [x28, w29, uxtw]\");\n  TEST_SINGLE(str(SReg::s30, Reg::r28, Reg::r29, ExtendedType::UXTW, 2), \"str s30, [x28, w29, uxtw #2]\");\n  TEST_SINGLE(str(SReg::s30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"str s30, [x28, w29, sxtw]\");\n  TEST_SINGLE(str(SReg::s30, Reg::r28, Reg::r29, ExtendedType::SXTW, 2), \"str s30, [x28, w29, sxtw #2]\");\n  TEST_SINGLE(str(SReg::s30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"str s30, [x28, x29, sxtx]\");\n  TEST_SINGLE(str(SReg::s30, Reg::r28, Reg::r29, ExtendedType::SXTX, 2), \"str s30, [x28, x29, sxtx #2]\");\n\n  TEST_SINGLE(ldr(SReg::s30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"ldr s30, [x28, x29]\");\n  TEST_SINGLE(ldr(SReg::s30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 2), \"ldr s30, [x28, x29, lsl #2]\");\n  TEST_SINGLE(ldr(SReg::s30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"ldr s30, [x28, w29, uxtw]\");\n  TEST_SINGLE(ldr(SReg::s30, Reg::r28, Reg::r29, ExtendedType::UXTW, 2), \"ldr s30, [x28, w29, uxtw #2]\");\n  TEST_SINGLE(ldr(SReg::s30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"ldr s30, [x28, w29, sxtw]\");\n  TEST_SINGLE(ldr(SReg::s30, Reg::r28, Reg::r29, ExtendedType::SXTW, 2), \"ldr s30, [x28, w29, sxtw #2]\");\n  TEST_SINGLE(ldr(SReg::s30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"ldr s30, [x28, x29, sxtx]\");\n  TEST_SINGLE(ldr(SReg::s30, Reg::r28, Reg::r29, ExtendedType::SXTX, 2), \"ldr s30, [x28, x29, sxtx #2]\");\n\n  TEST_SINGLE(str(DReg::d30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"str d30, [x28, x29]\");\n  TEST_SINGLE(str(DReg::d30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 3), \"str d30, [x28, x29, lsl #3]\");\n  TEST_SINGLE(str(DReg::d30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"str d30, [x28, w29, uxtw]\");\n  TEST_SINGLE(str(DReg::d30, Reg::r28, Reg::r29, ExtendedType::UXTW, 3), \"str d30, [x28, w29, uxtw #3]\");\n  TEST_SINGLE(str(DReg::d30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"str d30, [x28, w29, sxtw]\");\n  TEST_SINGLE(str(DReg::d30, Reg::r28, Reg::r29, ExtendedType::SXTW, 3), \"str d30, [x28, w29, sxtw #3]\");\n  TEST_SINGLE(str(DReg::d30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"str d30, [x28, x29, sxtx]\");\n  TEST_SINGLE(str(DReg::d30, Reg::r28, Reg::r29, ExtendedType::SXTX, 3), \"str d30, [x28, x29, sxtx #3]\");\n\n  TEST_SINGLE(ldr(DReg::d30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"ldr d30, [x28, x29]\");\n  TEST_SINGLE(ldr(DReg::d30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 3), \"ldr d30, [x28, x29, lsl #3]\");\n  TEST_SINGLE(ldr(DReg::d30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"ldr d30, [x28, w29, uxtw]\");\n  TEST_SINGLE(ldr(DReg::d30, Reg::r28, Reg::r29, ExtendedType::UXTW, 3), \"ldr d30, [x28, w29, uxtw #3]\");\n  TEST_SINGLE(ldr(DReg::d30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"ldr d30, [x28, w29, sxtw]\");\n  TEST_SINGLE(ldr(DReg::d30, Reg::r28, Reg::r29, ExtendedType::SXTW, 3), \"ldr d30, [x28, w29, sxtw #3]\");\n  TEST_SINGLE(ldr(DReg::d30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"ldr d30, [x28, x29, sxtx]\");\n  TEST_SINGLE(ldr(DReg::d30, Reg::r28, Reg::r29, ExtendedType::SXTX, 3), \"ldr d30, [x28, x29, sxtx #3]\");\n\n  TEST_SINGLE(str(QReg::q30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"str q30, [x28, x29]\");\n  TEST_SINGLE(str(QReg::q30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 4), \"str q30, [x28, x29, lsl #4]\");\n  TEST_SINGLE(str(QReg::q30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"str q30, [x28, w29, uxtw]\");\n  TEST_SINGLE(str(QReg::q30, Reg::r28, Reg::r29, ExtendedType::UXTW, 4), \"str q30, [x28, w29, uxtw #4]\");\n  TEST_SINGLE(str(QReg::q30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"str q30, [x28, w29, sxtw]\");\n  TEST_SINGLE(str(QReg::q30, Reg::r28, Reg::r29, ExtendedType::SXTW, 4), \"str q30, [x28, w29, sxtw #4]\");\n  TEST_SINGLE(str(QReg::q30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"str q30, [x28, x29, sxtx]\");\n  TEST_SINGLE(str(QReg::q30, Reg::r28, Reg::r29, ExtendedType::SXTX, 4), \"str q30, [x28, x29, sxtx #4]\");\n\n  TEST_SINGLE(ldr(QReg::q30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 0), \"ldr q30, [x28, x29]\");\n  TEST_SINGLE(ldr(QReg::q30, Reg::r28, Reg::r29, ExtendedType::LSL_64, 4), \"ldr q30, [x28, x29, lsl #4]\");\n  TEST_SINGLE(ldr(QReg::q30, Reg::r28, Reg::r29, ExtendedType::UXTW, 0), \"ldr q30, [x28, w29, uxtw]\");\n  TEST_SINGLE(ldr(QReg::q30, Reg::r28, Reg::r29, ExtendedType::UXTW, 4), \"ldr q30, [x28, w29, uxtw #4]\");\n  TEST_SINGLE(ldr(QReg::q30, Reg::r28, Reg::r29, ExtendedType::SXTW, 0), \"ldr q30, [x28, w29, sxtw]\");\n  TEST_SINGLE(ldr(QReg::q30, Reg::r28, Reg::r29, ExtendedType::SXTW, 4), \"ldr q30, [x28, w29, sxtw #4]\");\n  TEST_SINGLE(ldr(QReg::q30, Reg::r28, Reg::r29, ExtendedType::SXTX, 0), \"ldr q30, [x28, x29, sxtx]\");\n  TEST_SINGLE(ldr(QReg::q30, Reg::r28, Reg::r29, ExtendedType::SXTX, 4), \"ldr q30, [x28, x29, sxtx #4]\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Loadstore PAC\") {\n  TEST_SINGLE(ldraa(XReg::x30, XReg::x29, ARMEmitter::IndexType::OFFSET, 0), \"ldraa x30, [x29]\");\n  TEST_SINGLE(ldraa(XReg::x30, XReg::x29, ARMEmitter::IndexType::OFFSET, -4096), \"ldraa x30, [x29, #-4096]\");\n  TEST_SINGLE(ldraa(XReg::x30, XReg::x29, ARMEmitter::IndexType::OFFSET, 512), \"ldraa x30, [x29, #512]\");\n  TEST_SINGLE(ldraa(XReg::x30, XReg::x29, ARMEmitter::IndexType::OFFSET, 4088), \"ldraa x30, [x29, #4088]\");\n\n  TEST_SINGLE(ldraa(XReg::x30, XReg::x29, ARMEmitter::IndexType::PRE, 0), \"ldraa x30, [x29]!\");\n  TEST_SINGLE(ldraa(XReg::x30, XReg::x29, ARMEmitter::IndexType::PRE, -4096), \"ldraa x30, [x29, #-4096]!\");\n  TEST_SINGLE(ldraa(XReg::x30, XReg::x29, ARMEmitter::IndexType::PRE, 512), \"ldraa x30, [x29, #512]!\");\n  TEST_SINGLE(ldraa(XReg::x30, XReg::x29, ARMEmitter::IndexType::PRE, 4088), \"ldraa x30, [x29, #4088]!\");\n\n  TEST_SINGLE(ldrab(XReg::x30, XReg::x29, ARMEmitter::IndexType::OFFSET, 0), \"ldrab x30, [x29]\");\n  TEST_SINGLE(ldrab(XReg::x30, XReg::x29, ARMEmitter::IndexType::OFFSET, -4096), \"ldrab x30, [x29, #-4096]\");\n  TEST_SINGLE(ldrab(XReg::x30, XReg::x29, ARMEmitter::IndexType::OFFSET, 512), \"ldrab x30, [x29, #512]\");\n  TEST_SINGLE(ldrab(XReg::x30, XReg::x29, ARMEmitter::IndexType::OFFSET, 4088), \"ldrab x30, [x29, #4088]\");\n\n  TEST_SINGLE(ldrab(XReg::x30, XReg::x29, ARMEmitter::IndexType::PRE, 0), \"ldrab x30, [x29]!\");\n  TEST_SINGLE(ldrab(XReg::x30, XReg::x29, ARMEmitter::IndexType::PRE, -4096), \"ldrab x30, [x29, #-4096]!\");\n  TEST_SINGLE(ldrab(XReg::x30, XReg::x29, ARMEmitter::IndexType::PRE, 512), \"ldrab x30, [x29, #512]!\");\n  TEST_SINGLE(ldrab(XReg::x30, XReg::x29, ARMEmitter::IndexType::PRE, 4088), \"ldrab x30, [x29, #4088]!\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Loadstore: Loadstore unsigned immediate\") {\n  TEST_SINGLE(strb(Reg::r30, Reg::r29, 0), \"strb w30, [x29]\");\n  TEST_SINGLE(strb(Reg::r30, Reg::r29, 4095), \"strb w30, [x29, #4095]\");\n  TEST_SINGLE(ldrb(Reg::r30, Reg::r29, 0), \"ldrb w30, [x29]\");\n  TEST_SINGLE(ldrb(Reg::r30, Reg::r29, 4095), \"ldrb w30, [x29, #4095]\");\n  TEST_SINGLE(ldrsb(WReg::w30, Reg::r29, 0), \"ldrsb w30, [x29]\");\n  TEST_SINGLE(ldrsb(WReg::w30, Reg::r29, 4095), \"ldrsb w30, [x29, #4095]\");\n  TEST_SINGLE(ldrsb(XReg::x30, Reg::r29, 0), \"ldrsb x30, [x29]\");\n  TEST_SINGLE(ldrsb(XReg::x30, Reg::r29, 4095), \"ldrsb x30, [x29, #4095]\");\n  TEST_SINGLE(ldrb(VReg::v30, Reg::r29, 0), \"ldr b30, [x29]\");\n  TEST_SINGLE(ldrb(VReg::v30, Reg::r29, 4095), \"ldr b30, [x29, #4095]\");\n  TEST_SINGLE(strb(VReg::v30, Reg::r29, 0), \"str b30, [x29]\");\n  TEST_SINGLE(strb(VReg::v30, Reg::r29, 4095), \"str b30, [x29, #4095]\");\n\n  TEST_SINGLE(strh(Reg::r30, Reg::r29, 0), \"strh w30, [x29]\");\n  TEST_SINGLE(strh(Reg::r30, Reg::r29, 8190), \"strh w30, [x29, #8190]\");\n  TEST_SINGLE(ldrh(Reg::r30, Reg::r29, 0), \"ldrh w30, [x29]\");\n  TEST_SINGLE(ldrh(Reg::r30, Reg::r29, 8190), \"ldrh w30, [x29, #8190]\");\n  TEST_SINGLE(ldrsh(WReg::w30, Reg::r29, 0), \"ldrsh w30, [x29]\");\n  TEST_SINGLE(ldrsh(WReg::w30, Reg::r29, 8190), \"ldrsh w30, [x29, #8190]\");\n  TEST_SINGLE(ldrsh(XReg::x30, Reg::r29, 0), \"ldrsh x30, [x29]\");\n  TEST_SINGLE(ldrsh(XReg::x30, Reg::r29, 8190), \"ldrsh x30, [x29, #8190]\");\n\n  TEST_SINGLE(ldrh(VReg::v30, Reg::r29, 0), \"ldr h30, [x29]\");\n  TEST_SINGLE(ldrh(VReg::v30, Reg::r29, 8190), \"ldr h30, [x29, #8190]\");\n  TEST_SINGLE(strh(VReg::v30, Reg::r29, 0), \"str h30, [x29]\");\n  TEST_SINGLE(strh(VReg::v30, Reg::r29, 8190), \"str h30, [x29, #8190]\");\n\n  TEST_SINGLE(str(WReg::w30, Reg::r29, 0), \"str w30, [x29]\");\n  TEST_SINGLE(str(WReg::w30, Reg::r29, 16380), \"str w30, [x29, #16380]\");\n  TEST_SINGLE(ldr(WReg::w30, Reg::r29, 0), \"ldr w30, [x29]\");\n  TEST_SINGLE(ldr(WReg::w30, Reg::r29, 16380), \"ldr w30, [x29, #16380]\");\n\n  TEST_SINGLE(ldrsw(XReg::x30, Reg::r29, 0), \"ldrsw x30, [x29]\");\n  TEST_SINGLE(ldrsw(XReg::x30, Reg::r29, 16380), \"ldrsw x30, [x29, #16380]\");\n\n  TEST_SINGLE(ldr(SReg::s30, Reg::r29, 0), \"ldr s30, [x29]\");\n  TEST_SINGLE(ldr(SReg::s30, Reg::r29, 16380), \"ldr s30, [x29, #16380]\");\n  TEST_SINGLE(str(SReg::s30, Reg::r29, 0), \"str s30, [x29]\");\n  TEST_SINGLE(str(SReg::s30, Reg::r29, 16380), \"str s30, [x29, #16380]\");\n\n  TEST_SINGLE(str(XReg::x30, Reg::r29, 0), \"str x30, [x29]\");\n  TEST_SINGLE(str(XReg::x30, Reg::r29, 32760), \"str x30, [x29, #32760]\");\n  TEST_SINGLE(ldr(XReg::x30, Reg::r29, 0), \"ldr x30, [x29]\");\n  TEST_SINGLE(ldr(XReg::x30, Reg::r29, 32760), \"ldr x30, [x29, #32760]\");\n\n  TEST_SINGLE(ldr(SubRegSize::i8Bit, Reg::r30, Reg::r29, 0), \"ldrb w30, [x29]\");\n  TEST_SINGLE(ldr(SubRegSize::i8Bit, Reg::r30, Reg::r29, 4095), \"ldrb w30, [x29, #4095]\");\n  TEST_SINGLE(ldr(SubRegSize::i16Bit, Reg::r30, Reg::r29, 0), \"ldrh w30, [x29]\");\n  TEST_SINGLE(ldr(SubRegSize::i16Bit, Reg::r30, Reg::r29, 8190), \"ldrh w30, [x29, #8190]\");\n  TEST_SINGLE(ldr(SubRegSize::i32Bit, Reg::r30, Reg::r29, 0), \"ldr w30, [x29]\");\n  TEST_SINGLE(ldr(SubRegSize::i32Bit, Reg::r30, Reg::r29, 16380), \"ldr w30, [x29, #16380]\");\n  TEST_SINGLE(ldr(SubRegSize::i64Bit, Reg::r30, Reg::r29, 0), \"ldr x30, [x29]\");\n  TEST_SINGLE(ldr(SubRegSize::i64Bit, Reg::r30, Reg::r29, 32760), \"ldr x30, [x29, #32760]\");\n\n  TEST_SINGLE(str(SubRegSize::i8Bit, Reg::r30, Reg::r29, 0), \"strb w30, [x29]\");\n  TEST_SINGLE(str(SubRegSize::i8Bit, Reg::r30, Reg::r29, 4095), \"strb w30, [x29, #4095]\");\n  TEST_SINGLE(str(SubRegSize::i16Bit, Reg::r30, Reg::r29, 0), \"strh w30, [x29]\");\n  TEST_SINGLE(str(SubRegSize::i16Bit, Reg::r30, Reg::r29, 8190), \"strh w30, [x29, #8190]\");\n  TEST_SINGLE(str(SubRegSize::i32Bit, Reg::r30, Reg::r29, 0), \"str w30, [x29]\");\n  TEST_SINGLE(str(SubRegSize::i32Bit, Reg::r30, Reg::r29, 16380), \"str w30, [x29, #16380]\");\n  TEST_SINGLE(str(SubRegSize::i64Bit, Reg::r30, Reg::r29, 0), \"str x30, [x29]\");\n  TEST_SINGLE(str(SubRegSize::i64Bit, Reg::r30, Reg::r29, 32760), \"str x30, [x29, #32760]\");\n\n  TEST_SINGLE(prfm(Prefetch::PLDL1KEEP, Reg::r29, 0), \"prfm pldl1keep, [x29]\");\n  TEST_SINGLE(prfm(Prefetch::PLDL1KEEP, Reg::r29, 32760), \"prfm pldl1keep, [x29, #32760]\");\n\n  TEST_SINGLE(ldr(DReg::d30, Reg::r29, 0), \"ldr d30, [x29]\");\n  TEST_SINGLE(ldr(DReg::d30, Reg::r29, 32760), \"ldr d30, [x29, #32760]\");\n  TEST_SINGLE(str(DReg::d30, Reg::r29, 0), \"str d30, [x29]\");\n  TEST_SINGLE(str(DReg::d30, Reg::r29, 32760), \"str d30, [x29, #32760]\");\n\n  TEST_SINGLE(ldr(QReg::q30, Reg::r29, 0), \"ldr q30, [x29]\");\n  TEST_SINGLE(ldr(QReg::q30, Reg::r29, 65520), \"ldr q30, [x29, #65520]\");\n  TEST_SINGLE(str(QReg::q30, Reg::r29, 0), \"str q30, [x29]\");\n  TEST_SINGLE(str(QReg::q30, Reg::r29, 65520), \"str q30, [x29, #65520]\");\n}\n"
  },
  {
    "path": "FEXCore/unittests/Emitter/SVE_Tests.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"TestDisassembler.h\"\n\n#include <catch2/catch_test_macros.hpp>\n#include <fcntl.h>\n\nusing namespace ARMEmitter;\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: Base Encodings\") {\n  TEST_SINGLE(dup(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 0), \"mov z30.b, b29\");\n  TEST_SINGLE(dup(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"mov z30.b, z29.b[1]\");\n  TEST_SINGLE(dup(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 63), \"mov z30.b, z29.b[63]\");\n\n  TEST_SINGLE(dup(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 0), \"mov z30.h, h29\");\n  TEST_SINGLE(dup(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"mov z30.h, z29.h[1]\");\n  TEST_SINGLE(dup(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 31), \"mov z30.h, z29.h[31]\");\n\n  TEST_SINGLE(dup(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 0), \"mov z30.s, s29\");\n  TEST_SINGLE(dup(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"mov z30.s, z29.s[1]\");\n  TEST_SINGLE(dup(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 15), \"mov z30.s, z29.s[15]\");\n\n  TEST_SINGLE(dup(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 0), \"mov z30.d, d29\");\n  TEST_SINGLE(dup(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 1), \"mov z30.d, z29.d[1]\");\n  TEST_SINGLE(dup(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 7), \"mov z30.d, z29.d[7]\");\n\n  TEST_SINGLE(dup(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, 0), \"mov z30.q, q29\");\n  TEST_SINGLE(dup(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, 1), \"mov z30.q, z29.q[1]\");\n  TEST_SINGLE(dup(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, 3), \"mov z30.q, z29.q[3]\");\n\n  TEST_SINGLE(sel(SubRegSize::i8Bit, ZReg::z30, PReg::p6, ZReg::z29, ZReg::z28), \"sel z30.b, p6, z29.b, z28.b\");\n  TEST_SINGLE(sel(SubRegSize::i16Bit, ZReg::z30, PReg::p6, ZReg::z29, ZReg::z28), \"sel z30.h, p6, z29.h, z28.h\");\n  TEST_SINGLE(sel(SubRegSize::i32Bit, ZReg::z30, PReg::p6, ZReg::z29, ZReg::z28), \"sel z30.s, p6, z29.s, z28.s\");\n  TEST_SINGLE(sel(SubRegSize::i64Bit, ZReg::z30, PReg::p6, ZReg::z29, ZReg::z28), \"sel z30.d, p6, z29.d, z28.d\");\n  // TEST_SINGLE(sel(SubRegSize::i128Bit, ZReg::z30, PReg::p6, ZReg::z29, ZReg::z28), \"sel z30.q, p6, z29.q, z28.q\");\n\n  TEST_SINGLE(mov(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"mov z30.b, p6/m, z29.b\");\n  TEST_SINGLE(mov(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"mov z30.h, p6/m, z29.h\");\n  TEST_SINGLE(mov(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"mov z30.s, p6/m, z29.s\");\n  TEST_SINGLE(mov(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"mov z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(mov(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"mov z30.q, p6/m, z29.q\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer add/subtract vectors (unpredicated)\") {\n  TEST_SINGLE(add(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"add z30.b, z29.b, z28.b\");\n  TEST_SINGLE(add(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"add z30.h, z29.h, z28.h\");\n  TEST_SINGLE(add(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"add z30.s, z29.s, z28.s\");\n  TEST_SINGLE(add(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"add z30.d, z29.d, z28.d\");\n  // TEST_SINGLE(add(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"add z30.q, z29.q, z28.q\");\n\n  TEST_SINGLE(sub(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sub z30.b, z29.b, z28.b\");\n  TEST_SINGLE(sub(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sub z30.h, z29.h, z28.h\");\n  TEST_SINGLE(sub(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sub z30.s, z29.s, z28.s\");\n  TEST_SINGLE(sub(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sub z30.d, z29.d, z28.d\");\n  // TEST_SINGLE(sub(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sub z30.q, z29.q, z28.q\");\n\n  TEST_SINGLE(sqadd(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqadd z30.b, z29.b, z28.b\");\n  TEST_SINGLE(sqadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqadd z30.h, z29.h, z28.h\");\n  TEST_SINGLE(sqadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqadd z30.s, z29.s, z28.s\");\n  TEST_SINGLE(sqadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqadd z30.d, z29.d, z28.d\");\n  // TEST_SINGLE(sqadd(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqadd z30.q, z29.q, z28.q\");\n\n  TEST_SINGLE(uqadd(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uqadd z30.b, z29.b, z28.b\");\n  TEST_SINGLE(uqadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uqadd z30.h, z29.h, z28.h\");\n  TEST_SINGLE(uqadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uqadd z30.s, z29.s, z28.s\");\n  TEST_SINGLE(uqadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uqadd z30.d, z29.d, z28.d\");\n  // TEST_SINGLE(uqadd(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uqadd z30.q, z29.q, z28.q\");\n\n  TEST_SINGLE(sqsub(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqsub z30.b, z29.b, z28.b\");\n  TEST_SINGLE(sqsub(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqsub z30.h, z29.h, z28.h\");\n  TEST_SINGLE(sqsub(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqsub z30.s, z29.s, z28.s\");\n  TEST_SINGLE(sqsub(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqsub z30.d, z29.d, z28.d\");\n  // TEST_SINGLE(sqsub(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqsub z30.q, z29.q, z28.q\");\n\n  TEST_SINGLE(uqsub(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uqsub z30.b, z29.b, z28.b\");\n  TEST_SINGLE(uqsub(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uqsub z30.h, z29.h, z28.h\");\n  TEST_SINGLE(uqsub(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uqsub z30.s, z29.s, z28.s\");\n  TEST_SINGLE(uqsub(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uqsub z30.d, z29.d, z28.d\");\n  // TEST_SINGLE(uqsub(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uqsub z30.q, z29.q, z28.q\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE address generation\") {\n  TEST_SINGLE(adr(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z31), \"adr z30.s, [z29.s, z31.s]\");\n  TEST_SINGLE(adr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z31), \"adr z30.d, [z29.d, z31.d]\");\n\n  TEST_SINGLE(adr(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z31, SVEModType::MOD_LSL, 1), \"adr z30.s, [z29.s, z31.s, lsl #1]\");\n  TEST_SINGLE(adr(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z31, SVEModType::MOD_LSL, 2), \"adr z30.s, [z29.s, z31.s, lsl #2]\");\n  TEST_SINGLE(adr(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z31, SVEModType::MOD_LSL, 3), \"adr z30.s, [z29.s, z31.s, lsl #3]\");\n  TEST_SINGLE(adr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z31, SVEModType::MOD_LSL, 1), \"adr z30.d, [z29.d, z31.d, lsl #1]\");\n  TEST_SINGLE(adr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z31, SVEModType::MOD_LSL, 2), \"adr z30.d, [z29.d, z31.d, lsl #2]\");\n  TEST_SINGLE(adr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z31, SVEModType::MOD_LSL, 3), \"adr z30.d, [z29.d, z31.d, lsl #3]\");\n\n  TEST_SINGLE(adr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z31, SVEModType::MOD_UXTW, 0), \"adr z30.d, [z29.d, z31.d, uxtw]\");\n  TEST_SINGLE(adr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z31, SVEModType::MOD_UXTW, 1), \"adr z30.d, [z29.d, z31.d, uxtw #1]\");\n  TEST_SINGLE(adr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z31, SVEModType::MOD_UXTW, 2), \"adr z30.d, [z29.d, z31.d, uxtw #2]\");\n  TEST_SINGLE(adr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z31, SVEModType::MOD_UXTW, 3), \"adr z30.d, [z29.d, z31.d, uxtw #3]\");\n\n  TEST_SINGLE(adr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z31, SVEModType::MOD_SXTW, 0), \"adr z30.d, [z29.d, z31.d, sxtw]\");\n  TEST_SINGLE(adr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z31, SVEModType::MOD_SXTW, 1), \"adr z30.d, [z29.d, z31.d, sxtw #1]\");\n  TEST_SINGLE(adr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z31, SVEModType::MOD_SXTW, 2), \"adr z30.d, [z29.d, z31.d, sxtw #2]\");\n  TEST_SINGLE(adr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z31, SVEModType::MOD_SXTW, 3), \"adr z30.d, [z29.d, z31.d, sxtw #3]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE table lookup (three sources)\") {\n  TEST_SINGLE(tbl(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"tbl z30.b, {z29.b}, z28.b\");\n  TEST_SINGLE(tbl(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"tbl z30.h, {z29.h}, z28.h\");\n  TEST_SINGLE(tbl(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"tbl z30.s, {z29.s}, z28.s\");\n  TEST_SINGLE(tbl(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"tbl z30.d, {z29.d}, z28.d\");\n  // TEST_SINGLE(tbl(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"tbl z30.q, {z29.q}, z28.q\");\n\n  TEST_SINGLE(tbl(SubRegSize::i8Bit, ZReg::z31, ZReg::z29, ZReg::z30, ZReg::z28), \"tbl z31.b, {z29.b, z30.b}, z28.b\");\n  TEST_SINGLE(tbl(SubRegSize::i16Bit, ZReg::z31, ZReg::z29, ZReg::z30, ZReg::z28), \"tbl z31.h, {z29.h, z30.h}, z28.h\");\n  TEST_SINGLE(tbl(SubRegSize::i32Bit, ZReg::z31, ZReg::z29, ZReg::z30, ZReg::z28), \"tbl z31.s, {z29.s, z30.s}, z28.s\");\n  TEST_SINGLE(tbl(SubRegSize::i64Bit, ZReg::z31, ZReg::z29, ZReg::z30, ZReg::z28), \"tbl z31.d, {z29.d, z30.d}, z28.d\");\n\n  TEST_SINGLE(tbx(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"tbx z30.b, z29.b, z28.b\");\n  TEST_SINGLE(tbx(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"tbx z30.h, z29.h, z28.h\");\n  TEST_SINGLE(tbx(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"tbx z30.s, z29.s, z28.s\");\n  TEST_SINGLE(tbx(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"tbx z30.d, z29.d, z28.d\");\n  // TEST_SINGLE(tbx(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"tbx z30.q, z29.q, z28.q\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE permute vector elements\") {\n  TEST_SINGLE(zip1(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"zip1 z30.b, z29.b, z28.b\");\n  TEST_SINGLE(zip1(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"zip1 z30.h, z29.h, z28.h\");\n  TEST_SINGLE(zip1(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"zip1 z30.s, z29.s, z28.s\");\n  TEST_SINGLE(zip1(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"zip1 z30.d, z29.d, z28.d\");\n\n  TEST_SINGLE(zip2(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"zip2 z30.b, z29.b, z28.b\");\n  TEST_SINGLE(zip2(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"zip2 z30.h, z29.h, z28.h\");\n  TEST_SINGLE(zip2(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"zip2 z30.s, z29.s, z28.s\");\n  TEST_SINGLE(zip2(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"zip2 z30.d, z29.d, z28.d\");\n\n  TEST_SINGLE(uzp1(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uzp1 z30.b, z29.b, z28.b\");\n  TEST_SINGLE(uzp1(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uzp1 z30.h, z29.h, z28.h\");\n  TEST_SINGLE(uzp1(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uzp1 z30.s, z29.s, z28.s\");\n  TEST_SINGLE(uzp1(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uzp1 z30.d, z29.d, z28.d\");\n\n  TEST_SINGLE(uzp2(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uzp2 z30.b, z29.b, z28.b\");\n  TEST_SINGLE(uzp2(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uzp2 z30.h, z29.h, z28.h\");\n  TEST_SINGLE(uzp2(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uzp2 z30.s, z29.s, z28.s\");\n  TEST_SINGLE(uzp2(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uzp2 z30.d, z29.d, z28.d\");\n\n  TEST_SINGLE(trn1(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"trn1 z30.b, z29.b, z28.b\");\n  TEST_SINGLE(trn1(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"trn1 z30.h, z29.h, z28.h\");\n  TEST_SINGLE(trn1(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"trn1 z30.s, z29.s, z28.s\");\n  TEST_SINGLE(trn1(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"trn1 z30.d, z29.d, z28.d\");\n\n  TEST_SINGLE(trn2(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"trn2 z30.b, z29.b, z28.b\");\n  TEST_SINGLE(trn2(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"trn2 z30.h, z29.h, z28.h\");\n  TEST_SINGLE(trn2(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"trn2 z30.s, z29.s, z28.s\");\n  TEST_SINGLE(trn2(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"trn2 z30.d, z29.d, z28.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer compare with unsigned immediate\") {\n  TEST_SINGLE(cmphi(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmphi p6.b, p5/z, z30.b, #0\");\n  TEST_SINGLE(cmphi(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmphi p6.h, p5/z, z30.h, #0\");\n  TEST_SINGLE(cmphi(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmphi p6.s, p5/z, z30.s, #0\");\n  TEST_SINGLE(cmphi(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmphi p6.d, p5/z, z30.d, #0\");\n  TEST_SINGLE(cmphi(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmphi p6.b, p5/z, z30.b, #127\");\n  TEST_SINGLE(cmphi(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmphi p6.h, p5/z, z30.h, #127\");\n  TEST_SINGLE(cmphi(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmphi p6.s, p5/z, z30.s, #127\");\n  TEST_SINGLE(cmphi(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmphi p6.d, p5/z, z30.d, #127\");\n\n  TEST_SINGLE(cmphs(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmphs p6.b, p5/z, z30.b, #0\");\n  TEST_SINGLE(cmphs(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmphs p6.h, p5/z, z30.h, #0\");\n  TEST_SINGLE(cmphs(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmphs p6.s, p5/z, z30.s, #0\");\n  TEST_SINGLE(cmphs(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmphs p6.d, p5/z, z30.d, #0\");\n  TEST_SINGLE(cmphs(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmphs p6.b, p5/z, z30.b, #127\");\n  TEST_SINGLE(cmphs(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmphs p6.h, p5/z, z30.h, #127\");\n  TEST_SINGLE(cmphs(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmphs p6.s, p5/z, z30.s, #127\");\n  TEST_SINGLE(cmphs(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmphs p6.d, p5/z, z30.d, #127\");\n\n  TEST_SINGLE(cmplo(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmplo p6.b, p5/z, z30.b, #0\");\n  TEST_SINGLE(cmplo(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmplo p6.h, p5/z, z30.h, #0\");\n  TEST_SINGLE(cmplo(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmplo p6.s, p5/z, z30.s, #0\");\n  TEST_SINGLE(cmplo(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmplo p6.d, p5/z, z30.d, #0\");\n  TEST_SINGLE(cmplo(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmplo p6.b, p5/z, z30.b, #127\");\n  TEST_SINGLE(cmplo(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmplo p6.h, p5/z, z30.h, #127\");\n  TEST_SINGLE(cmplo(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmplo p6.s, p5/z, z30.s, #127\");\n  TEST_SINGLE(cmplo(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmplo p6.d, p5/z, z30.d, #127\");\n\n  TEST_SINGLE(cmpls(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmpls p6.b, p5/z, z30.b, #0\");\n  TEST_SINGLE(cmpls(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmpls p6.h, p5/z, z30.h, #0\");\n  TEST_SINGLE(cmpls(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmpls p6.s, p5/z, z30.s, #0\");\n  TEST_SINGLE(cmpls(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 0), \"cmpls p6.d, p5/z, z30.d, #0\");\n  TEST_SINGLE(cmpls(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmpls p6.b, p5/z, z30.b, #127\");\n  TEST_SINGLE(cmpls(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmpls p6.h, p5/z, z30.h, #127\");\n  TEST_SINGLE(cmpls(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmpls p6.s, p5/z, z30.s, #127\");\n  TEST_SINGLE(cmpls(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 127), \"cmpls p6.d, p5/z, z30.d, #127\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer compare with signed immediate\") {\n  TEST_SINGLE(cmpeq(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpeq p6.b, p5/z, z30.b, #-16\");\n  TEST_SINGLE(cmpeq(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpeq p6.h, p5/z, z30.h, #-16\");\n  TEST_SINGLE(cmpeq(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpeq p6.s, p5/z, z30.s, #-16\");\n  TEST_SINGLE(cmpeq(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpeq p6.d, p5/z, z30.d, #-16\");\n  TEST_SINGLE(cmpeq(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpeq p6.b, p5/z, z30.b, #15\");\n  TEST_SINGLE(cmpeq(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpeq p6.h, p5/z, z30.h, #15\");\n  TEST_SINGLE(cmpeq(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpeq p6.s, p5/z, z30.s, #15\");\n  TEST_SINGLE(cmpeq(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpeq p6.d, p5/z, z30.d, #15\");\n\n  TEST_SINGLE(cmpgt(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpgt p6.b, p5/z, z30.b, #-16\");\n  TEST_SINGLE(cmpgt(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpgt p6.h, p5/z, z30.h, #-16\");\n  TEST_SINGLE(cmpgt(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpgt p6.s, p5/z, z30.s, #-16\");\n  TEST_SINGLE(cmpgt(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpgt p6.d, p5/z, z30.d, #-16\");\n  TEST_SINGLE(cmpgt(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpgt p6.b, p5/z, z30.b, #15\");\n  TEST_SINGLE(cmpgt(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpgt p6.h, p5/z, z30.h, #15\");\n  TEST_SINGLE(cmpgt(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpgt p6.s, p5/z, z30.s, #15\");\n  TEST_SINGLE(cmpgt(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpgt p6.d, p5/z, z30.d, #15\");\n\n  TEST_SINGLE(cmpge(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpge p6.b, p5/z, z30.b, #-16\");\n  TEST_SINGLE(cmpge(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpge p6.h, p5/z, z30.h, #-16\");\n  TEST_SINGLE(cmpge(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpge p6.s, p5/z, z30.s, #-16\");\n  TEST_SINGLE(cmpge(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpge p6.d, p5/z, z30.d, #-16\");\n  TEST_SINGLE(cmpge(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpge p6.b, p5/z, z30.b, #15\");\n  TEST_SINGLE(cmpge(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpge p6.h, p5/z, z30.h, #15\");\n  TEST_SINGLE(cmpge(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpge p6.s, p5/z, z30.s, #15\");\n  TEST_SINGLE(cmpge(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpge p6.d, p5/z, z30.d, #15\");\n\n  TEST_SINGLE(cmplt(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmplt p6.b, p5/z, z30.b, #-16\");\n  TEST_SINGLE(cmplt(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmplt p6.h, p5/z, z30.h, #-16\");\n  TEST_SINGLE(cmplt(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmplt p6.s, p5/z, z30.s, #-16\");\n  TEST_SINGLE(cmplt(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmplt p6.d, p5/z, z30.d, #-16\");\n  TEST_SINGLE(cmplt(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmplt p6.b, p5/z, z30.b, #15\");\n  TEST_SINGLE(cmplt(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmplt p6.h, p5/z, z30.h, #15\");\n  TEST_SINGLE(cmplt(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmplt p6.s, p5/z, z30.s, #15\");\n  TEST_SINGLE(cmplt(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmplt p6.d, p5/z, z30.d, #15\");\n\n  TEST_SINGLE(cmple(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmple p6.b, p5/z, z30.b, #-16\");\n  TEST_SINGLE(cmple(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmple p6.h, p5/z, z30.h, #-16\");\n  TEST_SINGLE(cmple(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmple p6.s, p5/z, z30.s, #-16\");\n  TEST_SINGLE(cmple(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmple p6.d, p5/z, z30.d, #-16\");\n  TEST_SINGLE(cmple(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmple p6.b, p5/z, z30.b, #15\");\n  TEST_SINGLE(cmple(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmple p6.h, p5/z, z30.h, #15\");\n  TEST_SINGLE(cmple(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmple p6.s, p5/z, z30.s, #15\");\n  TEST_SINGLE(cmple(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmple p6.d, p5/z, z30.d, #15\");\n\n  TEST_SINGLE(cmpne(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpne p6.b, p5/z, z30.b, #-16\");\n  TEST_SINGLE(cmpne(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpne p6.h, p5/z, z30.h, #-16\");\n  TEST_SINGLE(cmpne(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpne p6.s, p5/z, z30.s, #-16\");\n  TEST_SINGLE(cmpne(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, -16), \"cmpne p6.d, p5/z, z30.d, #-16\");\n  TEST_SINGLE(cmpne(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpne p6.b, p5/z, z30.b, #15\");\n  TEST_SINGLE(cmpne(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpne p6.h, p5/z, z30.h, #15\");\n  TEST_SINGLE(cmpne(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpne p6.s, p5/z, z30.s, #15\");\n  TEST_SINGLE(cmpne(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, 15), \"cmpne p6.d, p5/z, z30.d, #15\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE predicate logical operations\") {\n  TEST_SINGLE(and_(PReg::p6, PReg::p5.Zeroing(), PReg::p4, PReg::p3), \"and p6.b, p5/z, p4.b, p3.b\");\n  TEST_SINGLE(ands(PReg::p6, PReg::p5.Zeroing(), PReg::p4, PReg::p3), \"ands p6.b, p5/z, p4.b, p3.b\");\n  TEST_SINGLE(mov(PReg::p6, PReg::p5.Merging(), PReg::p4), \"mov p6.b, p5/m, p4.b\");\n  TEST_SINGLE(mov(PReg::p6, PReg::p5.Zeroing(), PReg::p4), \"mov p6.b, p5/z, p4.b\");\n  TEST_SINGLE(movs(PReg::p6, PReg::p5.Zeroing(), PReg::p4), \"movs p6.b, p5/z, p4.b\");\n\n  TEST_SINGLE(bic(PReg::p6, PReg::p5.Zeroing(), PReg::p4, PReg::p3), \"bic p6.b, p5/z, p4.b, p3.b\");\n  TEST_SINGLE(bics(PReg::p6, PReg::p5.Zeroing(), PReg::p4, PReg::p3), \"bics p6.b, p5/z, p4.b, p3.b\");\n  TEST_SINGLE(eor(PReg::p6, PReg::p5.Zeroing(), PReg::p4, PReg::p3), \"eor p6.b, p5/z, p4.b, p3.b\");\n  TEST_SINGLE(eors(PReg::p6, PReg::p5.Zeroing(), PReg::p4, PReg::p3), \"eors p6.b, p5/z, p4.b, p3.b\");\n  TEST_SINGLE(not_(PReg::p6, PReg::p5.Zeroing(), PReg::p4), \"not p6.b, p5/z, p4.b\");\n\n  TEST_SINGLE(sel(PReg::p6, PReg::p5, PReg::p4, PReg::p3), \"sel p6.b, p5, p4.b, p3.b\");\n  TEST_SINGLE(orr(PReg::p6, PReg::p5.Zeroing(), PReg::p4, PReg::p3), \"orr p6.b, p5/z, p4.b, p3.b\");\n  TEST_SINGLE(mov(PReg::p6, PReg::p5), \"mov p6.b, p5.b\");\n  TEST_SINGLE(orn(PReg::p6, PReg::p5.Zeroing(), PReg::p4, PReg::p3), \"orn p6.b, p5/z, p4.b, p3.b\");\n  TEST_SINGLE(nor(PReg::p6, PReg::p5.Zeroing(), PReg::p4, PReg::p3), \"nor p6.b, p5/z, p4.b, p3.b\");\n  TEST_SINGLE(nand(PReg::p6, PReg::p5.Zeroing(), PReg::p4, PReg::p3), \"nand p6.b, p5/z, p4.b, p3.b\");\n  TEST_SINGLE(orrs(PReg::p6, PReg::p5.Zeroing(), PReg::p4, PReg::p3), \"orrs p6.b, p5/z, p4.b, p3.b\");\n  TEST_SINGLE(movs(PReg::p6, PReg::p5), \"movs p6.b, p5.b\");\n\n  TEST_SINGLE(orns(PReg::p6, PReg::p5.Zeroing(), PReg::p4, PReg::p3), \"orns p6.b, p5/z, p4.b, p3.b\");\n  TEST_SINGLE(nors(PReg::p6, PReg::p5.Zeroing(), PReg::p4, PReg::p3), \"nors p6.b, p5/z, p4.b, p3.b\");\n  TEST_SINGLE(nands(PReg::p6, PReg::p5.Zeroing(), PReg::p4, PReg::p3), \"nands p6.b, p5/z, p4.b, p3.b\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE broadcast predicate element\") {\n  // TODO: Implement in emitter.\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer clamp\") {\n  // TODO: Implement in emitter.\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 character match\") {\n  TEST_SINGLE(match(SubRegSize::i8Bit, PReg::p8, PReg::p6.Zeroing(), ZReg::z30, ZReg::z29), \"match p8.b, p6/z, z30.b, z29.b\");\n  TEST_SINGLE(match(SubRegSize::i16Bit, PReg::p8, PReg::p6.Zeroing(), ZReg::z30, ZReg::z29), \"match p8.h, p6/z, z30.h, z29.h\");\n\n  TEST_SINGLE(nmatch(SubRegSize::i8Bit, PReg::p8, PReg::p6.Zeroing(), ZReg::z30, ZReg::z29), \"nmatch p8.b, p6/z, z30.b, z29.b\");\n  TEST_SINGLE(nmatch(SubRegSize::i16Bit, PReg::p8, PReg::p6.Zeroing(), ZReg::z30, ZReg::z29), \"nmatch p8.h, p6/z, z30.h, z29.h\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point convert precision odd elements\") {\n  TEST_SINGLE(fcvtxnt(ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fcvtxnt z30.s, p6/m, z29.d\");\n  TEST_SINGLE(fcvtnt(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fcvtnt z30.h, p6/m, z29.s\");\n  TEST_SINGLE(fcvtnt(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fcvtnt z30.s, p6/m, z29.d\");\n  // TEST_SINGLE(fcvtnt(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fcvtnt z30.d, p6/m, z29.d\");\n\n  // TEST_SINGLE(fcvtlt(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fcvtlt z30.h, p6/m, z29.b\");\n  TEST_SINGLE(fcvtlt(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fcvtlt z30.s, p6/m, z29.h\");\n  TEST_SINGLE(fcvtlt(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fcvtlt z30.d, p6/m, z29.s\");\n\n\n  // void fcvtxnt(ARMEmitter::ZRegister zd, ARMEmitter::PRegister pg, ARMEmitter::ZRegister zn) {\n  /////< Size is destination size\n  // void fcvtnt(ARMEmitter::SubRegSize size, ARMEmitter::ZRegister zd, ARMEmitter::PRegister pg, ARMEmitter::ZRegister zn) {\n  /////< Size is destination size\n  // void fcvtlt(ARMEmitter::SubRegSize size, ARMEmitter::ZRegister zd, ARMEmitter::PRegister pg, ARMEmitter::ZRegister zn) {\n\n  // XXX: BFCVTNT\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 floating-point pairwise operations\") {\n  // TEST_SINGLE(faddp(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"faddp z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(faddp(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"faddp z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(faddp(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"faddp z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(faddp(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"faddp z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(faddp(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"faddp z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fmaxnmp(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fmaxnmp z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fmaxnmp(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmaxnmp z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fmaxnmp(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmaxnmp z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fmaxnmp(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmaxnmp z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fmaxnmp(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmaxnmp z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fminnmp(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fminnmp z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fminnmp(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fminnmp z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fminnmp(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fminnmp z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fminnmp(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fminnmp z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fminnmp(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fminnmp z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fmax(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fmax z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fmax(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmax z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fmax(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmax z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fmax(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmax z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fmax(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmax z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fmin(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fmin z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fmin(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmin z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fmin(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmin z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fmin(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmin z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fmin(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmin z30.q, p6/m, z30.q, z28.q\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point complex add\") {\n  TEST_SINGLE(fcadd(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28, Rotation::ROTATE_90), \"fcadd z30.h, p6/m, \"\n                                                                                                                   \"z30.h, z28.h, #90\");\n  TEST_SINGLE(fcadd(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28, Rotation::ROTATE_90), \"fcadd z30.s, p6/m, \"\n                                                                                                                   \"z30.s, z28.s, #90\");\n  TEST_SINGLE(fcadd(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28, Rotation::ROTATE_90), \"fcadd z30.d, p6/m, \"\n                                                                                                                   \"z30.d, z28.d, #90\");\n\n  TEST_SINGLE(fcadd(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28, Rotation::ROTATE_270), \"fcadd z30.h, p6/m, \"\n                                                                                                                    \"z30.h, z28.h, #270\");\n  TEST_SINGLE(fcadd(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28, Rotation::ROTATE_270), \"fcadd z30.s, p6/m, \"\n                                                                                                                    \"z30.s, z28.s, #270\");\n  TEST_SINGLE(fcadd(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28, Rotation::ROTATE_270), \"fcadd z30.d, p6/m, \"\n                                                                                                                    \"z30.d, z28.d, #270\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point multiply-add (vector)\") {\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z10, ZReg::z28, Rotation::ROTATE_0), \"fcmla z30.h, p6/m, \"\n                                                                                                                  \"z10.h, z28.h, #0\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z10, ZReg::z28, Rotation::ROTATE_0), \"fcmla z30.s, p6/m, \"\n                                                                                                                  \"z10.s, z28.s, #0\");\n  TEST_SINGLE(fcmla(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z10, ZReg::z28, Rotation::ROTATE_0), \"fcmla z30.d, p6/m, \"\n                                                                                                                  \"z10.d, z28.d, #0\");\n\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z10, ZReg::z28, Rotation::ROTATE_90), \"fcmla z30.h, p6/m, \"\n                                                                                                                   \"z10.h, z28.h, #90\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z10, ZReg::z28, Rotation::ROTATE_90), \"fcmla z30.s, p6/m, \"\n                                                                                                                   \"z10.s, z28.s, #90\");\n  TEST_SINGLE(fcmla(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z10, ZReg::z28, Rotation::ROTATE_90), \"fcmla z30.d, p6/m, \"\n                                                                                                                   \"z10.d, z28.d, #90\");\n\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z10, ZReg::z28, Rotation::ROTATE_180), \"fcmla z30.h, p6/m, \"\n                                                                                                                    \"z10.h, z28.h, #180\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z10, ZReg::z28, Rotation::ROTATE_180), \"fcmla z30.s, p6/m, \"\n                                                                                                                    \"z10.s, z28.s, #180\");\n  TEST_SINGLE(fcmla(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z10, ZReg::z28, Rotation::ROTATE_180), \"fcmla z30.d, p6/m, \"\n                                                                                                                    \"z10.d, z28.d, #180\");\n\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z10, ZReg::z28, Rotation::ROTATE_270), \"fcmla z30.h, p6/m, \"\n                                                                                                                    \"z10.h, z28.h, #270\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z10, ZReg::z28, Rotation::ROTATE_270), \"fcmla z30.s, p6/m, \"\n                                                                                                                    \"z10.s, z28.s, #270\");\n  TEST_SINGLE(fcmla(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z10, ZReg::z28, Rotation::ROTATE_270), \"fcmla z30.d, p6/m, \"\n                                                                                                                    \"z10.d, z28.d, #270\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point multiply-add (indexed)\") {\n  TEST_SINGLE(fmla(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z7, 7), \"fmla z30.h, z29.h, z7.h[7]\");\n  TEST_SINGLE(fmla(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 3), \"fmla z30.s, z29.s, z7.s[3]\");\n  TEST_SINGLE(fmla(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z15, 1), \"fmla z30.d, z29.d, z15.d[1]\");\n\n  TEST_SINGLE(fmls(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z7, 7), \"fmls z30.h, z29.h, z7.h[7]\");\n  TEST_SINGLE(fmls(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 3), \"fmls z30.s, z29.s, z7.s[3]\");\n  TEST_SINGLE(fmls(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z15, 1), \"fmls z30.d, z29.d, z15.d[1]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point complex multiply-add (indexed)\") {\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, ZReg::z30, ZReg::z10, ZReg::z7, 0, Rotation::ROTATE_0), \"fcmla z30.h, z10.h, z7.h[0], #0\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, ZReg::z30, ZReg::z10, ZReg::z15, 0, Rotation::ROTATE_0), \"fcmla z30.s, z10.s, z15.s[0], #0\");\n\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, ZReg::z30, ZReg::z10, ZReg::z7, 1, Rotation::ROTATE_90), \"fcmla z30.h, z10.h, z7.h[1], #90\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, ZReg::z30, ZReg::z10, ZReg::z15, 1, Rotation::ROTATE_90), \"fcmla z30.s, z10.s, z15.s[1], #90\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, ZReg::z30, ZReg::z10, ZReg::z15, 1, Rotation::ROTATE_180), \"fcmla z30.s, z10.s, z15.s[1], #180\");\n  TEST_SINGLE(fcmla(SubRegSize::i32Bit, ZReg::z30, ZReg::z10, ZReg::z15, 1, Rotation::ROTATE_270), \"fcmla z30.s, z10.s, z15.s[1], #270\");\n\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, ZReg::z30, ZReg::z10, ZReg::z7, 2, Rotation::ROTATE_180), \"fcmla z30.h, z10.h, z7.h[2], #180\");\n  TEST_SINGLE(fcmla(SubRegSize::i16Bit, ZReg::z30, ZReg::z10, ZReg::z7, 3, Rotation::ROTATE_270), \"fcmla z30.h, z10.h, z7.h[3], #270\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point multiply (indexed)\") {\n  TEST_SINGLE(fmul(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z7, 7), \"fmul z30.h, z29.h, z7.h[7]\");\n  TEST_SINGLE(fmul(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 3), \"fmul z30.s, z29.s, z7.s[3]\");\n  TEST_SINGLE(fmul(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z15, 1), \"fmul z30.d, z29.d, z15.d[1]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating point matrix multiply accumulate\") {\n  TEST_SINGLE(fmmla(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmmla z30.s, z29.s, z28.s\");\n  TEST_SINGLE(fmmla(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmmla z30.d, z29.d, z28.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point compare vectors\") {\n  TEST_SINGLE(fcmeq(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"fcmeq p6.h, p5/z, z30.h, z29.h\");\n  TEST_SINGLE(fcmeq(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"fcmeq p6.s, p5/z, z30.s, z29.s\");\n  TEST_SINGLE(fcmeq(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"fcmeq p6.d, p5/z, z30.d, z29.d\");\n\n  TEST_SINGLE(fcmgt(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"fcmgt p6.h, p5/z, z30.h, z29.h\");\n  TEST_SINGLE(fcmgt(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"fcmgt p6.s, p5/z, z30.s, z29.s\");\n  TEST_SINGLE(fcmgt(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"fcmgt p6.d, p5/z, z30.d, z29.d\");\n\n  TEST_SINGLE(fcmge(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"fcmge p6.h, p5/z, z30.h, z29.h\");\n  TEST_SINGLE(fcmge(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"fcmge p6.s, p5/z, z30.s, z29.s\");\n  TEST_SINGLE(fcmge(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"fcmge p6.d, p5/z, z30.d, z29.d\");\n\n  TEST_SINGLE(fcmne(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"fcmne p6.h, p5/z, z30.h, z29.h\");\n  TEST_SINGLE(fcmne(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"fcmne p6.s, p5/z, z30.s, z29.s\");\n  TEST_SINGLE(fcmne(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"fcmne p6.d, p5/z, z30.d, z29.d\");\n\n  TEST_SINGLE(fcmuo(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"fcmuo p6.h, p5/z, z30.h, z29.h\");\n  TEST_SINGLE(fcmuo(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"fcmuo p6.s, p5/z, z30.s, z29.s\");\n  TEST_SINGLE(fcmuo(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"fcmuo p6.d, p5/z, z30.d, z29.d\");\n\n  TEST_SINGLE(facge(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"facge p6.h, p5/z, z30.h, z29.h\");\n  TEST_SINGLE(facge(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"facge p6.s, p5/z, z30.s, z29.s\");\n  TEST_SINGLE(facge(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"facge p6.d, p5/z, z30.d, z29.d\");\n\n  TEST_SINGLE(facgt(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"facgt p6.h, p5/z, z30.h, z29.h\");\n  TEST_SINGLE(facgt(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"facgt p6.s, p5/z, z30.s, z29.s\");\n  TEST_SINGLE(facgt(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"facgt p6.d, p5/z, z30.d, z29.d\");\n\n  TEST_SINGLE(facle(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"facge p6.h, p5/z, z29.h, z30.h\");\n  TEST_SINGLE(facle(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"facge p6.s, p5/z, z29.s, z30.s\");\n  TEST_SINGLE(facle(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"facge p6.d, p5/z, z29.d, z30.d\");\n\n  TEST_SINGLE(faclt(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"facgt p6.h, p5/z, z29.h, z30.h\");\n  TEST_SINGLE(faclt(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"facgt p6.s, p5/z, z29.s, z30.s\");\n  TEST_SINGLE(faclt(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"facgt p6.d, p5/z, z29.d, z30.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point arithmetic (unpredicated)\") {\n  // TEST_SINGLE(fadd(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28),   \"fadd z30.b, z29.b, z28.b\");\n  TEST_SINGLE(fadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fadd z30.h, z29.h, z28.h\");\n  TEST_SINGLE(fadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fadd z30.s, z29.s, z28.s\");\n  TEST_SINGLE(fadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fadd z30.d, z29.d, z28.d\");\n  // TEST_SINGLE(fadd(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fadd z30.q, z29.q, z28.q\");\n\n  // TEST_SINGLE(fsub(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28),   \"fsub z30.b, z29.b, z28.b\");\n  TEST_SINGLE(fsub(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fsub z30.h, z29.h, z28.h\");\n  TEST_SINGLE(fsub(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fsub z30.s, z29.s, z28.s\");\n  TEST_SINGLE(fsub(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fsub z30.d, z29.d, z28.d\");\n  // TEST_SINGLE(fsub(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fsub z30.q, z29.q, z28.q\");\n\n  // TEST_SINGLE(fmul(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28),   \"fmul z30.b, z29.b, z28.b\");\n  TEST_SINGLE(fmul(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmul z30.h, z29.h, z28.h\");\n  TEST_SINGLE(fmul(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmul z30.s, z29.s, z28.s\");\n  TEST_SINGLE(fmul(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmul z30.d, z29.d, z28.d\");\n  // TEST_SINGLE(fmul(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmul z30.q, z29.q, z28.q\");\n\n  // TEST_SINGLE(ftsmul(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28),   \"ftsmul z30.b, z29.b, z28.b\");\n  TEST_SINGLE(ftsmul(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ftsmul z30.h, z29.h, z28.h\");\n  TEST_SINGLE(ftsmul(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ftsmul z30.s, z29.s, z28.s\");\n  TEST_SINGLE(ftsmul(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ftsmul z30.d, z29.d, z28.d\");\n  // TEST_SINGLE(ftsmul(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ftsmul z30.q, z29.q, z28.q\");\n\n  // TEST_SINGLE(frecps(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28),   \"frecps z30.b, z29.b, z28.b\");\n  TEST_SINGLE(frecps(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"frecps z30.h, z29.h, z28.h\");\n  TEST_SINGLE(frecps(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"frecps z30.s, z29.s, z28.s\");\n  TEST_SINGLE(frecps(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"frecps z30.d, z29.d, z28.d\");\n  // TEST_SINGLE(frecps(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"frecps z30.q, z29.q, z28.q\");\n\n  // TEST_SINGLE(frsqrts(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28),   \"frsqrts z30.b, z29.b, z28.b\");\n  TEST_SINGLE(frsqrts(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"frsqrts z30.h, z29.h, z28.h\");\n  TEST_SINGLE(frsqrts(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"frsqrts z30.s, z29.s, z28.s\");\n  TEST_SINGLE(frsqrts(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"frsqrts z30.d, z29.d, z28.d\");\n  // TEST_SINGLE(frsqrts(SubRegSize::i128Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"frsqrts z30.q, z29.q, z28.q\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point recursive reduction\") {\n  TEST_SINGLE(faddv(SubRegSize::i16Bit, VReg::v30, PReg::p7, ZReg::z28), \"faddv h30, p7, z28.h\");\n  TEST_SINGLE(faddv(SubRegSize::i32Bit, VReg::v30, PReg::p7, ZReg::z28), \"faddv s30, p7, z28.s\");\n  TEST_SINGLE(faddv(SubRegSize::i64Bit, VReg::v30, PReg::p7, ZReg::z28), \"faddv d30, p7, z28.d\");\n\n  TEST_SINGLE(fmaxnmv(SubRegSize::i16Bit, VReg::v30, PReg::p7, ZReg::z28), \"fmaxnmv h30, p7, z28.h\");\n  TEST_SINGLE(fmaxnmv(SubRegSize::i32Bit, VReg::v30, PReg::p7, ZReg::z28), \"fmaxnmv s30, p7, z28.s\");\n  TEST_SINGLE(fmaxnmv(SubRegSize::i64Bit, VReg::v30, PReg::p7, ZReg::z28), \"fmaxnmv d30, p7, z28.d\");\n\n  TEST_SINGLE(fminnmv(SubRegSize::i16Bit, VReg::v30, PReg::p7, ZReg::z28), \"fminnmv h30, p7, z28.h\");\n  TEST_SINGLE(fminnmv(SubRegSize::i32Bit, VReg::v30, PReg::p7, ZReg::z28), \"fminnmv s30, p7, z28.s\");\n  TEST_SINGLE(fminnmv(SubRegSize::i64Bit, VReg::v30, PReg::p7, ZReg::z28), \"fminnmv d30, p7, z28.d\");\n\n  TEST_SINGLE(fmaxv(SubRegSize::i16Bit, VReg::v30, PReg::p7, ZReg::z28), \"fmaxv h30, p7, z28.h\");\n  TEST_SINGLE(fmaxv(SubRegSize::i32Bit, VReg::v30, PReg::p7, ZReg::z28), \"fmaxv s30, p7, z28.s\");\n  TEST_SINGLE(fmaxv(SubRegSize::i64Bit, VReg::v30, PReg::p7, ZReg::z28), \"fmaxv d30, p7, z28.d\");\n\n  TEST_SINGLE(fminv(SubRegSize::i16Bit, VReg::v30, PReg::p7, ZReg::z28), \"fminv h30, p7, z28.h\");\n  TEST_SINGLE(fminv(SubRegSize::i32Bit, VReg::v30, PReg::p7, ZReg::z28), \"fminv s30, p7, z28.s\");\n  TEST_SINGLE(fminv(SubRegSize::i64Bit, VReg::v30, PReg::p7, ZReg::z28), \"fminv d30, p7, z28.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer multiply-accumulate writing addend (predicated)\") {\n  TEST_SINGLE(mla(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"mla z30.b, p7/m, z28.b, z29.b\");\n  TEST_SINGLE(mla(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"mla z30.h, p7/m, z28.h, z29.h\");\n  TEST_SINGLE(mla(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"mla z30.s, p7/m, z28.s, z29.s\");\n  TEST_SINGLE(mla(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"mla z30.d, p7/m, z28.d, z29.d\");\n\n  TEST_SINGLE(mls(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"mls z30.b, p7/m, z28.b, z29.b\");\n  TEST_SINGLE(mls(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"mls z30.h, p7/m, z28.h, z29.h\");\n  TEST_SINGLE(mls(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"mls z30.s, p7/m, z28.s, z29.s\");\n  TEST_SINGLE(mls(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"mls z30.d, p7/m, z28.d, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer multiply-add writing multiplicand (predicated)\") {\n  TEST_SINGLE(mad(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"mad z30.b, p7/m, z28.b, z29.b\");\n  TEST_SINGLE(mad(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"mad z30.h, p7/m, z28.h, z29.h\");\n  TEST_SINGLE(mad(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"mad z30.s, p7/m, z28.s, z29.s\");\n  TEST_SINGLE(mad(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"mad z30.d, p7/m, z28.d, z29.d\");\n\n  TEST_SINGLE(msb(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"msb z30.b, p7/m, z28.b, z29.b\");\n  TEST_SINGLE(msb(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"msb z30.h, p7/m, z28.h, z29.h\");\n  TEST_SINGLE(msb(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"msb z30.s, p7/m, z28.s, z29.s\");\n  TEST_SINGLE(msb(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z28, ZReg::z29), \"msb z30.d, p7/m, z28.d, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer add/subtract vectors (predicated)\") {\n  TEST_SINGLE(add(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"add z30.b, p7/m, z30.b, z28.b\");\n  TEST_SINGLE(add(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"add z30.h, p7/m, z30.h, z28.h\");\n  TEST_SINGLE(add(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"add z30.s, p7/m, z30.s, z28.s\");\n  TEST_SINGLE(add(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"add z30.d, p7/m, z30.d, z28.d\");\n\n  TEST_SINGLE(sub(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sub z30.b, p7/m, z30.b, z28.b\");\n  TEST_SINGLE(sub(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sub z30.h, p7/m, z30.h, z28.h\");\n  TEST_SINGLE(sub(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sub z30.s, p7/m, z30.s, z28.s\");\n  TEST_SINGLE(sub(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sub z30.d, p7/m, z30.d, z28.d\");\n\n  TEST_SINGLE(subr(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"subr z30.b, p7/m, z30.b, z28.b\");\n  TEST_SINGLE(subr(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"subr z30.h, p7/m, z30.h, z28.h\");\n  TEST_SINGLE(subr(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"subr z30.s, p7/m, z30.s, z28.s\");\n  TEST_SINGLE(subr(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"subr z30.d, p7/m, z30.d, z28.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer min/max/difference (predicated)\") {\n  TEST_SINGLE(smax(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"smax z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(smax(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"smax z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(smax(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"smax z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(smax(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"smax z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(umax(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"umax z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(umax(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"umax z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(umax(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"umax z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(umax(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"umax z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(smin(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"smin z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(smin(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"smin z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(smin(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"smin z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(smin(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"smin z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(umin(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"umin z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(umin(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"umin z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(umin(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"umin z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(umin(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"umin z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(sabd(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sabd z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(sabd(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sabd z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(sabd(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sabd z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(sabd(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sabd z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(uabd(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uabd z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(uabd(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uabd z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(uabd(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uabd z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(uabd(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uabd z30.d, p6/m, z30.d, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer multiply vectors (predicated)\") {\n  TEST_SINGLE(mul(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"mul z30.b, p7/m, z30.b, z29.b\");\n  TEST_SINGLE(mul(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"mul z30.h, p7/m, z30.h, z29.h\");\n  TEST_SINGLE(mul(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"mul z30.s, p7/m, z30.s, z29.s\");\n  TEST_SINGLE(mul(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"mul z30.d, p7/m, z30.d, z29.d\");\n\n  TEST_SINGLE(smulh(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"smulh z30.b, p7/m, z30.b, z29.b\");\n  TEST_SINGLE(smulh(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"smulh z30.h, p7/m, z30.h, z29.h\");\n  TEST_SINGLE(smulh(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"smulh z30.s, p7/m, z30.s, z29.s\");\n  TEST_SINGLE(smulh(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"smulh z30.d, p7/m, z30.d, z29.d\");\n\n  TEST_SINGLE(umulh(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"umulh z30.b, p7/m, z30.b, z29.b\");\n  TEST_SINGLE(umulh(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"umulh z30.h, p7/m, z30.h, z29.h\");\n  TEST_SINGLE(umulh(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"umulh z30.s, p7/m, z30.s, z29.s\");\n  TEST_SINGLE(umulh(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"umulh z30.d, p7/m, z30.d, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer divide vectors (predicated)\") {\n  TEST_SINGLE(sdiv(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"sdiv z30.s, p7/m, z30.s, z29.s\");\n  TEST_SINGLE(sdiv(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"sdiv z30.d, p7/m, z30.d, z29.d\");\n\n  TEST_SINGLE(udiv(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"udiv z30.s, p7/m, z30.s, z29.s\");\n  TEST_SINGLE(udiv(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"udiv z30.d, p7/m, z30.d, z29.d\");\n\n  TEST_SINGLE(sdivr(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"sdivr z30.s, p7/m, z30.s, z29.s\");\n  TEST_SINGLE(sdivr(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"sdivr z30.d, p7/m, z30.d, z29.d\");\n\n  TEST_SINGLE(udivr(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"udivr z30.s, p7/m, z30.s, z29.s\");\n  TEST_SINGLE(udivr(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"udivr z30.d, p7/m, z30.d, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE bitwise logical operations (predicated)\") {\n  TEST_SINGLE(orr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"orr z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(orr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"orr z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(orr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"orr z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(orr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"orr z30.d, p6/m, z30.d, z29.d\");\n  // TEST_SINGLE(orr(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"orr z30.q, p6/m, z30.q, z29.q\");\n\n  TEST_SINGLE(eor(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"eor z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(eor(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"eor z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(eor(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"eor z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(eor(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"eor z30.d, p6/m, z30.d, z29.d\");\n  // TEST_SINGLE(eor(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"eor z30.q, p6/m, z30.q, z29.q\");\n\n  TEST_SINGLE(and_(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"and z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(and_(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"and z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(and_(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"and z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(and_(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"and z30.d, p6/m, z30.d, z29.d\");\n  // TEST_SINGLE(and_(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"and z30.q, p6/m, z30.q, z29.q\");\n\n  TEST_SINGLE(bic(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"bic z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(bic(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"bic z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(bic(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"bic z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(bic(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"bic z30.d, p6/m, z30.d, z29.d\");\n  // TEST_SINGLE(bic(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"bic z30.q, p6/m, z30.q, z29.q\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer add reduction (predicated)\") {\n  TEST_SINGLE(saddv(SubRegSize::i8Bit, DReg::d30, PReg::p7, ZReg::z29), \"saddv d30, p7, z29.b\");\n  TEST_SINGLE(saddv(SubRegSize::i16Bit, DReg::d30, PReg::p7, ZReg::z29), \"saddv d30, p7, z29.h\");\n  TEST_SINGLE(saddv(SubRegSize::i32Bit, DReg::d30, PReg::p7, ZReg::z29), \"saddv d30, p7, z29.s\");\n\n  TEST_SINGLE(uaddv(SubRegSize::i8Bit, DReg::d30, PReg::p7, ZReg::z29), \"uaddv d30, p7, z29.b\");\n  TEST_SINGLE(uaddv(SubRegSize::i16Bit, DReg::d30, PReg::p7, ZReg::z29), \"uaddv d30, p7, z29.h\");\n  TEST_SINGLE(uaddv(SubRegSize::i32Bit, DReg::d30, PReg::p7, ZReg::z29), \"uaddv d30, p7, z29.s\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer min/max reduction (predicated)\") {\n  TEST_SINGLE(smaxv(SubRegSize::i8Bit, VReg::v30, PReg::p6, ZReg::z29), \"smaxv b30, p6, z29.b\");\n  TEST_SINGLE(smaxv(SubRegSize::i16Bit, VReg::v30, PReg::p6, ZReg::z29), \"smaxv h30, p6, z29.h\");\n  TEST_SINGLE(smaxv(SubRegSize::i32Bit, VReg::v30, PReg::p6, ZReg::z29), \"smaxv s30, p6, z29.s\");\n  TEST_SINGLE(smaxv(SubRegSize::i64Bit, VReg::v30, PReg::p6, ZReg::z29), \"smaxv d30, p6, z29.d\");\n\n  TEST_SINGLE(umaxv(SubRegSize::i8Bit, VReg::v30, PReg::p6, ZReg::z29), \"umaxv b30, p6, z29.b\");\n  TEST_SINGLE(umaxv(SubRegSize::i16Bit, VReg::v30, PReg::p6, ZReg::z29), \"umaxv h30, p6, z29.h\");\n  TEST_SINGLE(umaxv(SubRegSize::i32Bit, VReg::v30, PReg::p6, ZReg::z29), \"umaxv s30, p6, z29.s\");\n  TEST_SINGLE(umaxv(SubRegSize::i64Bit, VReg::v30, PReg::p6, ZReg::z29), \"umaxv d30, p6, z29.d\");\n\n  TEST_SINGLE(sminv(SubRegSize::i8Bit, VReg::v30, PReg::p6, ZReg::z29), \"sminv b30, p6, z29.b\");\n  TEST_SINGLE(sminv(SubRegSize::i16Bit, VReg::v30, PReg::p6, ZReg::z29), \"sminv h30, p6, z29.h\");\n  TEST_SINGLE(sminv(SubRegSize::i32Bit, VReg::v30, PReg::p6, ZReg::z29), \"sminv s30, p6, z29.s\");\n  TEST_SINGLE(sminv(SubRegSize::i64Bit, VReg::v30, PReg::p6, ZReg::z29), \"sminv d30, p6, z29.d\");\n\n  TEST_SINGLE(uminv(SubRegSize::i8Bit, VReg::v30, PReg::p6, ZReg::z29), \"uminv b30, p6, z29.b\");\n  TEST_SINGLE(uminv(SubRegSize::i16Bit, VReg::v30, PReg::p6, ZReg::z29), \"uminv h30, p6, z29.h\");\n  TEST_SINGLE(uminv(SubRegSize::i32Bit, VReg::v30, PReg::p6, ZReg::z29), \"uminv s30, p6, z29.s\");\n  TEST_SINGLE(uminv(SubRegSize::i64Bit, VReg::v30, PReg::p6, ZReg::z29), \"uminv d30, p6, z29.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE constructive prefix (predicated)\") {\n  TEST_SINGLE(movprfx(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"movprfx z30.b, p6/m, z29.b\");\n  TEST_SINGLE(movprfx(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"movprfx z30.h, p6/m, z29.h\");\n  TEST_SINGLE(movprfx(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"movprfx z30.s, p6/m, z29.s\");\n  TEST_SINGLE(movprfx(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"movprfx z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(movprfx(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"movprfx z30.q, p6/m, z29.q\");\n  TEST_SINGLE(movprfx(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Zeroing(), ZReg::z29), \"movprfx z30.b, p6/z, z29.b\");\n  TEST_SINGLE(movprfx(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), ZReg::z29), \"movprfx z30.h, p6/z, z29.h\");\n  TEST_SINGLE(movprfx(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), ZReg::z29), \"movprfx z30.s, p6/z, z29.s\");\n  TEST_SINGLE(movprfx(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), ZReg::z29), \"movprfx z30.d, p6/z, z29.d\");\n  // TEST_SINGLE(movprfx(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Zeroing(), ZReg::z29), \"movprfx z30.q, p6/z, z29.q\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE bitwise logical reduction (predicated)\") {\n  TEST_SINGLE(orv(SubRegSize::i8Bit, VReg::v30, PReg::p7, ZReg::z29), \"orv b30, p7, z29.b\");\n  TEST_SINGLE(orv(SubRegSize::i16Bit, VReg::v30, PReg::p7, ZReg::z29), \"orv h30, p7, z29.h\");\n  TEST_SINGLE(orv(SubRegSize::i32Bit, VReg::v30, PReg::p7, ZReg::z29), \"orv s30, p7, z29.s\");\n  TEST_SINGLE(orv(SubRegSize::i64Bit, VReg::v30, PReg::p7, ZReg::z29), \"orv d30, p7, z29.d\");\n\n  TEST_SINGLE(eorv(SubRegSize::i8Bit, VReg::v30, PReg::p7, ZReg::z29), \"eorv b30, p7, z29.b\");\n  TEST_SINGLE(eorv(SubRegSize::i16Bit, VReg::v30, PReg::p7, ZReg::z29), \"eorv h30, p7, z29.h\");\n  TEST_SINGLE(eorv(SubRegSize::i32Bit, VReg::v30, PReg::p7, ZReg::z29), \"eorv s30, p7, z29.s\");\n  TEST_SINGLE(eorv(SubRegSize::i64Bit, VReg::v30, PReg::p7, ZReg::z29), \"eorv d30, p7, z29.d\");\n\n  TEST_SINGLE(andv(SubRegSize::i8Bit, VReg::v30, PReg::p7, ZReg::z29), \"andv b30, p7, z29.b\");\n  TEST_SINGLE(andv(SubRegSize::i16Bit, VReg::v30, PReg::p7, ZReg::z29), \"andv h30, p7, z29.h\");\n  TEST_SINGLE(andv(SubRegSize::i32Bit, VReg::v30, PReg::p7, ZReg::z29), \"andv s30, p7, z29.s\");\n  TEST_SINGLE(andv(SubRegSize::i64Bit, VReg::v30, PReg::p7, ZReg::z29), \"andv d30, p7, z29.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE bitwise shift by immediate (predicated)\") {\n  TEST_SINGLE(asr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"asr z30.b, p6/m, z30.b, #1\");\n  TEST_SINGLE(asr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 8), \"asr z30.b, p6/m, z30.b, #8\");\n  TEST_SINGLE(asr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"asr z30.h, p6/m, z30.h, #1\");\n  TEST_SINGLE(asr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 16), \"asr z30.h, p6/m, z30.h, #16\");\n  TEST_SINGLE(asr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"asr z30.s, p6/m, z30.s, #1\");\n  TEST_SINGLE(asr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 32), \"asr z30.s, p6/m, z30.s, #32\");\n  TEST_SINGLE(asr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"asr z30.d, p6/m, z30.d, #1\");\n  TEST_SINGLE(asr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 64), \"asr z30.d, p6/m, z30.d, #64\");\n\n  TEST_SINGLE(lsr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"lsr z30.b, p6/m, z30.b, #1\");\n  TEST_SINGLE(lsr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 8), \"lsr z30.b, p6/m, z30.b, #8\");\n  TEST_SINGLE(lsr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"lsr z30.h, p6/m, z30.h, #1\");\n  TEST_SINGLE(lsr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 16), \"lsr z30.h, p6/m, z30.h, #16\");\n  TEST_SINGLE(lsr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"lsr z30.s, p6/m, z30.s, #1\");\n  TEST_SINGLE(lsr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 32), \"lsr z30.s, p6/m, z30.s, #32\");\n  TEST_SINGLE(lsr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"lsr z30.d, p6/m, z30.d, #1\");\n  TEST_SINGLE(lsr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 64), \"lsr z30.d, p6/m, z30.d, #64\");\n\n  TEST_SINGLE(lsl(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"lsl z30.b, p6/m, z30.b, #0\");\n  TEST_SINGLE(lsl(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 7), \"lsl z30.b, p6/m, z30.b, #7\");\n  TEST_SINGLE(lsl(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"lsl z30.h, p6/m, z30.h, #0\");\n  TEST_SINGLE(lsl(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 15), \"lsl z30.h, p6/m, z30.h, #15\");\n  TEST_SINGLE(lsl(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"lsl z30.s, p6/m, z30.s, #0\");\n  TEST_SINGLE(lsl(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 31), \"lsl z30.s, p6/m, z30.s, #31\");\n  TEST_SINGLE(lsl(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"lsl z30.d, p6/m, z30.d, #0\");\n  TEST_SINGLE(lsl(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 63), \"lsl z30.d, p6/m, z30.d, #63\");\n\n  TEST_SINGLE(asrd(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"asrd z30.b, p6/m, z30.b, #1\");\n  TEST_SINGLE(asrd(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 8), \"asrd z30.b, p6/m, z30.b, #8\");\n  TEST_SINGLE(asrd(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"asrd z30.h, p6/m, z30.h, #1\");\n  TEST_SINGLE(asrd(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 16), \"asrd z30.h, p6/m, z30.h, #16\");\n  TEST_SINGLE(asrd(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"asrd z30.s, p6/m, z30.s, #1\");\n  TEST_SINGLE(asrd(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 32), \"asrd z30.s, p6/m, z30.s, #32\");\n  TEST_SINGLE(asrd(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"asrd z30.d, p6/m, z30.d, #1\");\n  TEST_SINGLE(asrd(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 64), \"asrd z30.d, p6/m, z30.d, #64\");\n\n  TEST_SINGLE(sqshl(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"sqshl z30.b, p6/m, z30.b, #0\");\n  TEST_SINGLE(sqshl(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 7), \"sqshl z30.b, p6/m, z30.b, #7\");\n  TEST_SINGLE(sqshl(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"sqshl z30.h, p6/m, z30.h, #0\");\n  TEST_SINGLE(sqshl(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 15), \"sqshl z30.h, p6/m, z30.h, #15\");\n  TEST_SINGLE(sqshl(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"sqshl z30.s, p6/m, z30.s, #0\");\n  TEST_SINGLE(sqshl(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 31), \"sqshl z30.s, p6/m, z30.s, #31\");\n  TEST_SINGLE(sqshl(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"sqshl z30.d, p6/m, z30.d, #0\");\n  TEST_SINGLE(sqshl(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 63), \"sqshl z30.d, p6/m, z30.d, #63\");\n\n  TEST_SINGLE(uqshl(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"uqshl z30.b, p6/m, z30.b, #0\");\n  TEST_SINGLE(uqshl(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 7), \"uqshl z30.b, p6/m, z30.b, #7\");\n  TEST_SINGLE(uqshl(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"uqshl z30.h, p6/m, z30.h, #0\");\n  TEST_SINGLE(uqshl(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 15), \"uqshl z30.h, p6/m, z30.h, #15\");\n  TEST_SINGLE(uqshl(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"uqshl z30.s, p6/m, z30.s, #0\");\n  TEST_SINGLE(uqshl(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 31), \"uqshl z30.s, p6/m, z30.s, #31\");\n  TEST_SINGLE(uqshl(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"uqshl z30.d, p6/m, z30.d, #0\");\n  TEST_SINGLE(uqshl(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 63), \"uqshl z30.d, p6/m, z30.d, #63\");\n\n  TEST_SINGLE(srshr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"srshr z30.b, p6/m, z30.b, #1\");\n  TEST_SINGLE(srshr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 8), \"srshr z30.b, p6/m, z30.b, #8\");\n  TEST_SINGLE(srshr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"srshr z30.h, p6/m, z30.h, #1\");\n  TEST_SINGLE(srshr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 16), \"srshr z30.h, p6/m, z30.h, #16\");\n  TEST_SINGLE(srshr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"srshr z30.s, p6/m, z30.s, #1\");\n  TEST_SINGLE(srshr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 32), \"srshr z30.s, p6/m, z30.s, #32\");\n  TEST_SINGLE(srshr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"srshr z30.d, p6/m, z30.d, #1\");\n  TEST_SINGLE(srshr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 64), \"srshr z30.d, p6/m, z30.d, #64\");\n\n  TEST_SINGLE(urshr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"urshr z30.b, p6/m, z30.b, #1\");\n  TEST_SINGLE(urshr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 8), \"urshr z30.b, p6/m, z30.b, #8\");\n  TEST_SINGLE(urshr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"urshr z30.h, p6/m, z30.h, #1\");\n  TEST_SINGLE(urshr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 16), \"urshr z30.h, p6/m, z30.h, #16\");\n  TEST_SINGLE(urshr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"urshr z30.s, p6/m, z30.s, #1\");\n  TEST_SINGLE(urshr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 32), \"urshr z30.s, p6/m, z30.s, #32\");\n  TEST_SINGLE(urshr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 1), \"urshr z30.d, p6/m, z30.d, #1\");\n  TEST_SINGLE(urshr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 64), \"urshr z30.d, p6/m, z30.d, #64\");\n\n  TEST_SINGLE(sqshlu(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"sqshlu z30.b, p6/m, z30.b, #0\");\n  TEST_SINGLE(sqshlu(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 7), \"sqshlu z30.b, p6/m, z30.b, #7\");\n  TEST_SINGLE(sqshlu(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"sqshlu z30.h, p6/m, z30.h, #0\");\n  TEST_SINGLE(sqshlu(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 15), \"sqshlu z30.h, p6/m, z30.h, #15\");\n  TEST_SINGLE(sqshlu(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"sqshlu z30.s, p6/m, z30.s, #0\");\n  TEST_SINGLE(sqshlu(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 31), \"sqshlu z30.s, p6/m, z30.s, #31\");\n  TEST_SINGLE(sqshlu(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 0), \"sqshlu z30.d, p6/m, z30.d, #0\");\n  TEST_SINGLE(sqshlu(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, 63), \"sqshlu z30.d, p6/m, z30.d, #63\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE bitwise shift by vector (predicated)\") {\n  TEST_SINGLE(asr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"asr z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(asr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"asr z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(asr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"asr z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(asr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"asr z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(lsr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lsr z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(lsr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lsr z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(lsr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lsr z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(lsr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lsr z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(lsl(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lsl z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(lsl(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lsl z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(lsl(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lsl z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(lsl(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lsl z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(asrr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"asrr z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(asrr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"asrr z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(asrr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"asrr z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(asrr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"asrr z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(lsrr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lsrr z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(lsrr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lsrr z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(lsrr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lsrr z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(lsrr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lsrr z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(lslr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lslr z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(lslr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lslr z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(lslr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lslr z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(lslr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"lslr z30.d, p6/m, z30.d, z29.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE bitwise shift by wide elements (predicated)\") {\n  TEST_SINGLE(asr_wide(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"asr z30.b, p7/m, z30.b, z29.d\");\n  TEST_SINGLE(asr_wide(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"asr z30.h, p7/m, z30.h, z29.d\");\n  TEST_SINGLE(asr_wide(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"asr z30.s, p7/m, z30.s, z29.d\");\n\n  TEST_SINGLE(lsr_wide(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"lsr z30.b, p7/m, z30.b, z29.d\");\n  TEST_SINGLE(lsr_wide(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"lsr z30.h, p7/m, z30.h, z29.d\");\n  TEST_SINGLE(lsr_wide(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"lsr z30.s, p7/m, z30.s, z29.d\");\n\n  TEST_SINGLE(lsl_wide(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"lsl z30.b, p7/m, z30.b, z29.d\");\n  TEST_SINGLE(lsl_wide(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"lsl z30.h, p7/m, z30.h, z29.d\");\n  TEST_SINGLE(lsl_wide(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z29), \"lsl z30.s, p7/m, z30.s, z29.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer unary operations (predicated)\") {\n  // TEST_SINGLE(sxtb(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29),   \"sxtb z30.b, p6/m, z29.b\");\n  TEST_SINGLE(sxtb(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sxtb z30.h, p6/m, z29.h\");\n  TEST_SINGLE(sxtb(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sxtb z30.s, p6/m, z29.s\");\n  TEST_SINGLE(sxtb(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sxtb z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(sxtb(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sxtb z30.q, p6/m, z29.q\");\n\n  // TEST_SINGLE(uxtb(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29),   \"uxtb z30.b, p6/m, z29.b\");\n  TEST_SINGLE(uxtb(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"uxtb z30.h, p6/m, z29.h\");\n  TEST_SINGLE(uxtb(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"uxtb z30.s, p6/m, z29.s\");\n  TEST_SINGLE(uxtb(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"uxtb z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(uxtb(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"uxtb z30.q, p6/m, z29.q\");\n\n  // TEST_SINGLE(sxth(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29),   \"sxth z30.b, p6/m, z29.b\");\n  // TEST_SINGLE(sxth(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29),  \"sxth z30.h, p6/m, z29.h\");\n  TEST_SINGLE(sxth(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sxth z30.s, p6/m, z29.s\");\n  TEST_SINGLE(sxth(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sxth z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(sxth(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sxth z30.q, p6/m, z29.q\");\n\n  // TEST_SINGLE(uxth(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29),   \"uxth z30.b, p6/m, z29.b\");\n  // TEST_SINGLE(uxth(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29),  \"uxth z30.h, p6/m, z29.h\");\n  TEST_SINGLE(uxth(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"uxth z30.s, p6/m, z29.s\");\n  TEST_SINGLE(uxth(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"uxth z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(uxth(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"uxth z30.q, p6/m, z29.q\");\n\n  // TEST_SINGLE(sxtw(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29),   \"sxtw z30.b, p6/m, z29.b\");\n  // TEST_SINGLE(sxtw(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29),  \"sxtw z30.h, p6/m, z29.h\");\n  // TEST_SINGLE(sxtw(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29),  \"sxtw z30.s, p6/m, z29.s\");\n  TEST_SINGLE(sxtw(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sxtw z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(sxtw(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sxtw z30.q, p6/m, z29.q\");\n\n  // TEST_SINGLE(uxtw(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29),   \"uxtw z30.b, p6/m, z29.b\");\n  // TEST_SINGLE(uxtw(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29),  \"uxtw z30.h, p6/m, z29.h\");\n  // TEST_SINGLE(uxtw(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29),  \"uxtw z30.s, p6/m, z29.s\");\n  TEST_SINGLE(uxtw(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"uxtw z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(uxtw(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"uxtw z30.q, p6/m, z29.q\");\n\n  TEST_SINGLE(abs(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"abs z30.b, p6/m, z29.b\");\n  TEST_SINGLE(abs(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"abs z30.h, p6/m, z29.h\");\n  TEST_SINGLE(abs(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"abs z30.s, p6/m, z29.s\");\n  TEST_SINGLE(abs(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"abs z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(abs(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"abs z30.q, p6/m, z29.q\");\n\n  TEST_SINGLE(neg(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"neg z30.b, p6/m, z29.b\");\n  TEST_SINGLE(neg(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"neg z30.h, p6/m, z29.h\");\n  TEST_SINGLE(neg(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"neg z30.s, p6/m, z29.s\");\n  TEST_SINGLE(neg(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"neg z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(neg(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"neg z30.q, p6/m, z29.q\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE bitwise unary operations (predicated)\") {\n  TEST_SINGLE(cls(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"cls z30.b, p6/m, z29.b\");\n  TEST_SINGLE(cls(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"cls z30.h, p6/m, z29.h\");\n  TEST_SINGLE(cls(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"cls z30.s, p6/m, z29.s\");\n  TEST_SINGLE(cls(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"cls z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(cls(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"cls z30.q, p6/m, z29.q\");\n\n  TEST_SINGLE(clz(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"clz z30.b, p6/m, z29.b\");\n  TEST_SINGLE(clz(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"clz z30.h, p6/m, z29.h\");\n  TEST_SINGLE(clz(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"clz z30.s, p6/m, z29.s\");\n  TEST_SINGLE(clz(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"clz z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(clz(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"clz z30.q, p6/m, z29.q\");\n\n  TEST_SINGLE(cnt(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"cnt z30.b, p6/m, z29.b\");\n  TEST_SINGLE(cnt(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"cnt z30.h, p6/m, z29.h\");\n  TEST_SINGLE(cnt(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"cnt z30.s, p6/m, z29.s\");\n  TEST_SINGLE(cnt(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"cnt z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(cnt(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"cnt z30.q, p6/m, z29.q\");\n\n  TEST_SINGLE(cnot(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"cnot z30.b, p6/m, z29.b\");\n  TEST_SINGLE(cnot(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"cnot z30.h, p6/m, z29.h\");\n  TEST_SINGLE(cnot(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"cnot z30.s, p6/m, z29.s\");\n  TEST_SINGLE(cnot(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"cnot z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(cnot(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"cnot z30.q, p6/m, z29.q\");\n\n  // TEST_SINGLE(fabs(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29),   \"fabs z30.b, p6/m, z29.b\");\n  TEST_SINGLE(fabs(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fabs z30.h, p6/m, z29.h\");\n  TEST_SINGLE(fabs(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fabs z30.s, p6/m, z29.s\");\n  TEST_SINGLE(fabs(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fabs z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(fabs(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fabs z30.q, p6/m, z29.q\");\n\n  // TEST_SINGLE(fneg(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29),   \"fneg z30.b, p6/m, z29.b\");\n  TEST_SINGLE(fneg(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fneg z30.h, p6/m, z29.h\");\n  TEST_SINGLE(fneg(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fneg z30.s, p6/m, z29.s\");\n  TEST_SINGLE(fneg(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fneg z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(fneg(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fneg z30.q, p6/m, z29.q\");\n\n  TEST_SINGLE(not_(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"not z30.b, p6/m, z29.b\");\n  TEST_SINGLE(not_(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"not z30.h, p6/m, z29.h\");\n  TEST_SINGLE(not_(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"not z30.s, p6/m, z29.s\");\n  TEST_SINGLE(not_(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"not z30.d, p6/m, z29.d\");\n  // TEST_SINGLE(not_(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"not z30.q, p6/m, z29.q\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE bitwise logical operations (unpredicated)\") {\n  TEST_SINGLE(and_(ZReg::z30, ZReg::z29, ZReg::z28), \"and z30.d, z29.d, z28.d\");\n  TEST_SINGLE(orr(ZReg::z30, ZReg::z29, ZReg::z28), \"orr z30.d, z29.d, z28.d\");\n  TEST_SINGLE(mov(ZReg::z30, ZReg::z29), \"mov z30.d, z29.d\");\n  TEST_SINGLE(eor(ZReg::z30, ZReg::z29, ZReg::z28), \"eor z30.d, z29.d, z28.d\");\n  TEST_SINGLE(bic(ZReg::z30, ZReg::z29, ZReg::z28), \"bic z30.d, z29.d, z28.d\");\n\n  TEST_SINGLE(xar(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"xar z30.b, z30.b, z29.b, #1\");\n  TEST_SINGLE(xar(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"xar z30.b, z30.b, z29.b, #8\");\n  TEST_SINGLE(xar(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"xar z30.h, z30.h, z29.h, #1\");\n  TEST_SINGLE(xar(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"xar z30.h, z30.h, z29.h, #16\");\n  TEST_SINGLE(xar(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"xar z30.s, z30.s, z29.s, #1\");\n  TEST_SINGLE(xar(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"xar z30.s, z30.s, z29.s, #32\");\n  TEST_SINGLE(xar(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 1), \"xar z30.d, z30.d, z29.d, #1\");\n  TEST_SINGLE(xar(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 64), \"xar z30.d, z30.d, z29.d, #64\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 bitwise ternary operations\") {\n  TEST_SINGLE(eor3(ZReg::z30, ZReg::z30, ZReg::z28, ZReg::z29), \"eor3 z30.d, z30.d, z28.d, z29.d\");\n  TEST_SINGLE(bsl(ZReg::z30, ZReg::z30, ZReg::z28, ZReg::z29), \"bsl z30.d, z30.d, z28.d, z29.d\");\n  TEST_SINGLE(bcax(ZReg::z30, ZReg::z30, ZReg::z28, ZReg::z29), \"bcax z30.d, z30.d, z28.d, z29.d\");\n  TEST_SINGLE(bsl1n(ZReg::z30, ZReg::z30, ZReg::z28, ZReg::z29), \"bsl1n z30.d, z30.d, z28.d, z29.d\");\n  TEST_SINGLE(bsl2n(ZReg::z30, ZReg::z30, ZReg::z28, ZReg::z29), \"bsl2n z30.d, z30.d, z28.d, z29.d\");\n  TEST_SINGLE(nbsl(ZReg::z30, ZReg::z30, ZReg::z28, ZReg::z29), \"nbsl z30.d, z30.d, z28.d, z29.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE Index Generation\") {\n  TEST_SINGLE(index(SubRegSize::i8Bit, ZReg::z30, -16, -16), \"index z30.b, #-16, #-16\");\n  TEST_SINGLE(index(SubRegSize::i8Bit, ZReg::z30, -16, 15), \"index z30.b, #-16, #15\");\n  TEST_SINGLE(index(SubRegSize::i16Bit, ZReg::z30, -16, -16), \"index z30.h, #-16, #-16\");\n  TEST_SINGLE(index(SubRegSize::i16Bit, ZReg::z30, -16, 15), \"index z30.h, #-16, #15\");\n  TEST_SINGLE(index(SubRegSize::i32Bit, ZReg::z30, -16, -16), \"index z30.s, #-16, #-16\");\n  TEST_SINGLE(index(SubRegSize::i32Bit, ZReg::z30, -16, 15), \"index z30.s, #-16, #15\");\n  TEST_SINGLE(index(SubRegSize::i64Bit, ZReg::z30, -16, -16), \"index z30.d, #-16, #-16\");\n  TEST_SINGLE(index(SubRegSize::i64Bit, ZReg::z30, -16, 15), \"index z30.d, #-16, #15\");\n\n  TEST_SINGLE(index(SubRegSize::i8Bit, ZReg::z30, WReg::w29, -16), \"index z30.b, w29, #-16\");\n  TEST_SINGLE(index(SubRegSize::i8Bit, ZReg::z30, WReg::w29, 15), \"index z30.b, w29, #15\");\n  TEST_SINGLE(index(SubRegSize::i16Bit, ZReg::z30, WReg::w29, -16), \"index z30.h, w29, #-16\");\n  TEST_SINGLE(index(SubRegSize::i16Bit, ZReg::z30, WReg::w29, 15), \"index z30.h, w29, #15\");\n  TEST_SINGLE(index(SubRegSize::i32Bit, ZReg::z30, WReg::w29, -16), \"index z30.s, w29, #-16\");\n  TEST_SINGLE(index(SubRegSize::i32Bit, ZReg::z30, WReg::w29, 15), \"index z30.s, w29, #15\");\n  TEST_SINGLE(index(SubRegSize::i64Bit, ZReg::z30, XReg::x29, -16), \"index z30.d, x29, #-16\");\n  TEST_SINGLE(index(SubRegSize::i64Bit, ZReg::z30, XReg::x29, 15), \"index z30.d, x29, #15\");\n\n  TEST_SINGLE(index(SubRegSize::i8Bit, ZReg::z30, -16, WReg::w29), \"index z30.b, #-16, w29\");\n  TEST_SINGLE(index(SubRegSize::i8Bit, ZReg::z30, 15, WReg::w29), \"index z30.b, #15, w29\");\n  TEST_SINGLE(index(SubRegSize::i16Bit, ZReg::z30, -16, WReg::w29), \"index z30.h, #-16, w29\");\n  TEST_SINGLE(index(SubRegSize::i16Bit, ZReg::z30, 15, WReg::w29), \"index z30.h, #15, w29\");\n  TEST_SINGLE(index(SubRegSize::i32Bit, ZReg::z30, -16, WReg::w29), \"index z30.s, #-16, w29\");\n  TEST_SINGLE(index(SubRegSize::i32Bit, ZReg::z30, 15, WReg::w29), \"index z30.s, #15, w29\");\n  TEST_SINGLE(index(SubRegSize::i64Bit, ZReg::z30, -16, XReg::x29), \"index z30.d, #-16, x29\");\n  TEST_SINGLE(index(SubRegSize::i64Bit, ZReg::z30, 15, XReg::x29), \"index z30.d, #15, x29\");\n\n  TEST_SINGLE(index(SubRegSize::i8Bit, ZReg::z30, WReg::w29, WReg::w28), \"index z30.b, w29, w28\");\n  TEST_SINGLE(index(SubRegSize::i8Bit, ZReg::z30, WReg::w29, WReg::w28), \"index z30.b, w29, w28\");\n  TEST_SINGLE(index(SubRegSize::i16Bit, ZReg::z30, WReg::w29, WReg::w28), \"index z30.h, w29, w28\");\n  TEST_SINGLE(index(SubRegSize::i16Bit, ZReg::z30, WReg::w29, WReg::w28), \"index z30.h, w29, w28\");\n  TEST_SINGLE(index(SubRegSize::i32Bit, ZReg::z30, WReg::w29, WReg::w28), \"index z30.s, w29, w28\");\n  TEST_SINGLE(index(SubRegSize::i32Bit, ZReg::z30, WReg::w29, WReg::w28), \"index z30.s, w29, w28\");\n  TEST_SINGLE(index(SubRegSize::i64Bit, ZReg::z30, XReg::x29, XReg::x28), \"index z30.d, x29, x28\");\n  TEST_SINGLE(index(SubRegSize::i64Bit, ZReg::z30, XReg::x29, XReg::x28), \"index z30.d, x29, x28\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE stack frame adjustment\") {\n  TEST_SINGLE(addvl(XReg::rsp, XReg::rsp, -32), \"addvl sp, sp, #-32\");\n  TEST_SINGLE(addvl(XReg::rsp, XReg::rsp, 31), \"addvl sp, sp, #31\");\n  TEST_SINGLE(addvl(XReg::x30, XReg::x29, 15), \"addvl x30, x29, #15\");\n\n  TEST_SINGLE(addpl(XReg::rsp, XReg::rsp, -32), \"addpl sp, sp, #-32\");\n  TEST_SINGLE(addpl(XReg::rsp, XReg::rsp, 31), \"addpl sp, sp, #31\");\n  TEST_SINGLE(addpl(XReg::x30, XReg::x29, 15), \"addpl x30, x29, #15\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: Streaming SVE stack frame adjustment\") {\n  // TODO: Implement in emitter.\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE stack frame size\") {\n  TEST_SINGLE(rdvl(XReg::x30, -32), \"rdvl x30, #-32\");\n  TEST_SINGLE(rdvl(XReg::x30, 31), \"rdvl x30, #31\");\n  TEST_SINGLE(rdvl(XReg::x30, 15), \"rdvl x30, #15\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: Streaming SVE stack frame size\") {\n  // TODO: Implement in emitter.\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 integer multiply vectors (unpredicated)\") {\n  TEST_SINGLE(mul(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"mul z30.b, z29.b, z28.b\");\n  TEST_SINGLE(mul(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"mul z30.h, z29.h, z28.h\");\n  TEST_SINGLE(mul(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"mul z30.s, z29.s, z28.s\");\n  TEST_SINGLE(mul(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"mul z30.d, z29.d, z28.d\");\n\n  TEST_SINGLE(smulh(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smulh z30.b, z29.b, z28.b\");\n  TEST_SINGLE(smulh(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smulh z30.h, z29.h, z28.h\");\n  TEST_SINGLE(smulh(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smulh z30.s, z29.s, z28.s\");\n  TEST_SINGLE(smulh(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smulh z30.d, z29.d, z28.d\");\n\n  TEST_SINGLE(umulh(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umulh z30.b, z29.b, z28.b\");\n  TEST_SINGLE(umulh(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umulh z30.h, z29.h, z28.h\");\n  TEST_SINGLE(umulh(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umulh z30.s, z29.s, z28.s\");\n  TEST_SINGLE(umulh(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umulh z30.d, z29.d, z28.d\");\n\n  TEST_SINGLE(pmul(ZReg::z30, ZReg::z29, ZReg::z28), \"pmul z30.b, z29.b, z28.b\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 signed saturating doubling multiply high (unpredicated)\") {\n  TEST_SINGLE(sqdmulh(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmulh z30.b, z29.b, z28.b\");\n  TEST_SINGLE(sqdmulh(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmulh z30.h, z29.h, z28.h\");\n  TEST_SINGLE(sqdmulh(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmulh z30.s, z29.s, z28.s\");\n  TEST_SINGLE(sqdmulh(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmulh z30.d, z29.d, z28.d\");\n\n  TEST_SINGLE(sqrdmulh(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqrdmulh z30.b, z29.b, z28.b\");\n  TEST_SINGLE(sqrdmulh(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqrdmulh z30.h, z29.h, z28.h\");\n  TEST_SINGLE(sqrdmulh(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqrdmulh z30.s, z29.s, z28.s\");\n  TEST_SINGLE(sqrdmulh(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqrdmulh z30.d, z29.d, z28.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE bitwise shift by wide elements (unpredicated)\") {\n  TEST_SINGLE(asr_wide(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"asr z30.b, z29.b, z28.d\");\n  TEST_SINGLE(asr_wide(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"asr z30.h, z29.h, z28.d\");\n  TEST_SINGLE(asr_wide(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"asr z30.s, z29.s, z28.d\");\n\n  TEST_SINGLE(lsr_wide(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"lsr z30.b, z29.b, z28.d\");\n  TEST_SINGLE(lsr_wide(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"lsr z30.h, z29.h, z28.d\");\n  TEST_SINGLE(lsr_wide(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"lsr z30.s, z29.s, z28.d\");\n\n  TEST_SINGLE(lsl_wide(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"lsl z30.b, z29.b, z28.d\");\n  TEST_SINGLE(lsl_wide(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"lsl z30.h, z29.h, z28.d\");\n  TEST_SINGLE(lsl_wide(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"lsl z30.s, z29.s, z28.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE bitwise shift by immediate (unpredicated)\") {\n  TEST_SINGLE(asr(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"asr z30.b, z29.b, #1\");\n  TEST_SINGLE(asr(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"asr z30.b, z29.b, #8\");\n  TEST_SINGLE(asr(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"asr z30.h, z29.h, #1\");\n  TEST_SINGLE(asr(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"asr z30.h, z29.h, #16\");\n  TEST_SINGLE(asr(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"asr z30.s, z29.s, #1\");\n  TEST_SINGLE(asr(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"asr z30.s, z29.s, #32\");\n  TEST_SINGLE(asr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 1), \"asr z30.d, z29.d, #1\");\n  TEST_SINGLE(asr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 64), \"asr z30.d, z29.d, #64\");\n\n  TEST_SINGLE(lsr(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"lsr z30.b, z29.b, #1\");\n  TEST_SINGLE(lsr(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"lsr z30.b, z29.b, #8\");\n  TEST_SINGLE(lsr(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"lsr z30.h, z29.h, #1\");\n  TEST_SINGLE(lsr(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"lsr z30.h, z29.h, #16\");\n  TEST_SINGLE(lsr(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"lsr z30.s, z29.s, #1\");\n  TEST_SINGLE(lsr(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"lsr z30.s, z29.s, #32\");\n  TEST_SINGLE(lsr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 1), \"lsr z30.d, z29.d, #1\");\n  TEST_SINGLE(lsr(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 64), \"lsr z30.d, z29.d, #64\");\n\n  TEST_SINGLE(lsl(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 0), \"lsl z30.b, z29.b, #0\");\n  TEST_SINGLE(lsl(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 7), \"lsl z30.b, z29.b, #7\");\n  TEST_SINGLE(lsl(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 0), \"lsl z30.h, z29.h, #0\");\n  TEST_SINGLE(lsl(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 15), \"lsl z30.h, z29.h, #15\");\n  TEST_SINGLE(lsl(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 0), \"lsl z30.s, z29.s, #0\");\n  TEST_SINGLE(lsl(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 31), \"lsl z30.s, z29.s, #31\");\n  TEST_SINGLE(lsl(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 0), \"lsl z30.d, z29.d, #0\");\n  TEST_SINGLE(lsl(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 63), \"lsl z30.d, z29.d, #63\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point trig select coefficient\") {\n  TEST_SINGLE(ftssel(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ftssel z30.h, z29.h, z28.h\");\n  TEST_SINGLE(ftssel(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ftssel z30.s, z29.s, z28.s\");\n  TEST_SINGLE(ftssel(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ftssel z30.d, z29.d, z28.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point exponential accelerator\") {\n  TEST_SINGLE(fexpa(SubRegSize::i16Bit, ZReg::z30, ZReg::z29), \"fexpa z30.h, z29.h\");\n  TEST_SINGLE(fexpa(SubRegSize::i32Bit, ZReg::z30, ZReg::z29), \"fexpa z30.s, z29.s\");\n  TEST_SINGLE(fexpa(SubRegSize::i64Bit, ZReg::z30, ZReg::z29), \"fexpa z30.d, z29.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE constructive prefix (unpredicated)\") {\n  TEST_SINGLE(movprfx(ZReg::z30, ZReg::z29), \"movprfx z30, z29\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE saturating inc/dec vector by element count\") {\n  TEST_SINGLE(sqinch(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"sqinch z30.h, pow2\");\n  TEST_SINGLE(sqinch(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"sqinch z30.h, vl256, mul #7\");\n  TEST_SINGLE(sqinch(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"sqinch z30.h, all, mul #16\");\n\n  TEST_SINGLE(uqinch(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"uqinch z30.h, pow2\");\n  TEST_SINGLE(uqinch(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"uqinch z30.h, vl256, mul #7\");\n  TEST_SINGLE(uqinch(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"uqinch z30.h, all, mul #16\");\n\n  TEST_SINGLE(sqdech(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"sqdech z30.h, pow2\");\n  TEST_SINGLE(sqdech(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"sqdech z30.h, vl256, mul #7\");\n  TEST_SINGLE(sqdech(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"sqdech z30.h, all, mul #16\");\n\n  TEST_SINGLE(uqdech(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"uqdech z30.h, pow2\");\n  TEST_SINGLE(uqdech(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"uqdech z30.h, vl256, mul #7\");\n  TEST_SINGLE(uqdech(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"uqdech z30.h, all, mul #16\");\n\n  TEST_SINGLE(sqincw(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"sqincw z30.s, pow2\");\n  TEST_SINGLE(sqincw(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"sqincw z30.s, vl256, mul #7\");\n  TEST_SINGLE(sqincw(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"sqincw z30.s, all, mul #16\");\n\n  TEST_SINGLE(uqincw(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"uqincw z30.s, pow2\");\n  TEST_SINGLE(uqincw(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"uqincw z30.s, vl256, mul #7\");\n  TEST_SINGLE(uqincw(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"uqincw z30.s, all, mul #16\");\n\n  TEST_SINGLE(sqdecw(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"sqdecw z30.s, pow2\");\n  TEST_SINGLE(sqdecw(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"sqdecw z30.s, vl256, mul #7\");\n  TEST_SINGLE(sqdecw(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"sqdecw z30.s, all, mul #16\");\n\n  TEST_SINGLE(uqdecw(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"uqdecw z30.s, pow2\");\n  TEST_SINGLE(uqdecw(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"uqdecw z30.s, vl256, mul #7\");\n  TEST_SINGLE(uqdecw(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"uqdecw z30.s, all, mul #16\");\n\n  TEST_SINGLE(sqincd(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"sqincd z30.d, pow2\");\n  TEST_SINGLE(sqincd(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"sqincd z30.d, vl256, mul #7\");\n  TEST_SINGLE(sqincd(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"sqincd z30.d, all, mul #16\");\n\n  TEST_SINGLE(uqincd(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"uqincd z30.d, pow2\");\n  TEST_SINGLE(uqincd(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"uqincd z30.d, vl256, mul #7\");\n  TEST_SINGLE(uqincd(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"uqincd z30.d, all, mul #16\");\n\n  TEST_SINGLE(sqdecd(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"sqdecd z30.d, pow2\");\n  TEST_SINGLE(sqdecd(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"sqdecd z30.d, vl256, mul #7\");\n  TEST_SINGLE(sqdecd(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"sqdecd z30.d, all, mul #16\");\n\n  TEST_SINGLE(uqdecd(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"uqdecd z30.d, pow2\");\n  TEST_SINGLE(uqdecd(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"uqdecd z30.d, vl256, mul #7\");\n  TEST_SINGLE(uqdecd(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"uqdecd z30.d, all, mul #16\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE element count\") {\n  TEST_SINGLE(cntb(XReg::x30, PredicatePattern::SVE_POW2, 1), \"cntb x30, pow2\");\n  TEST_SINGLE(cntb(XReg::x30, PredicatePattern::SVE_VL256, 7), \"cntb x30, vl256, mul #7\");\n  TEST_SINGLE(cntb(XReg::x30, PredicatePattern::SVE_ALL, 16), \"cntb x30, all, mul #16\");\n\n  TEST_SINGLE(cnth(XReg::x30, PredicatePattern::SVE_POW2, 1), \"cnth x30, pow2\");\n  TEST_SINGLE(cnth(XReg::x30, PredicatePattern::SVE_VL256, 7), \"cnth x30, vl256, mul #7\");\n  TEST_SINGLE(cnth(XReg::x30, PredicatePattern::SVE_ALL, 16), \"cnth x30, all, mul #16\");\n\n  TEST_SINGLE(cntw(XReg::x30, PredicatePattern::SVE_POW2, 1), \"cntw x30, pow2\");\n  TEST_SINGLE(cntw(XReg::x30, PredicatePattern::SVE_VL256, 7), \"cntw x30, vl256, mul #7\");\n  TEST_SINGLE(cntw(XReg::x30, PredicatePattern::SVE_ALL, 16), \"cntw x30, all, mul #16\");\n\n  TEST_SINGLE(cntd(XReg::x30, PredicatePattern::SVE_POW2, 1), \"cntd x30, pow2\");\n  TEST_SINGLE(cntd(XReg::x30, PredicatePattern::SVE_VL256, 7), \"cntd x30, vl256, mul #7\");\n  TEST_SINGLE(cntd(XReg::x30, PredicatePattern::SVE_ALL, 16), \"cntd x30, all, mul #16\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE inc/dec vector by element count\") {\n  TEST_SINGLE(inch(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"inch z30.h, pow2\");\n  TEST_SINGLE(inch(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"inch z30.h, vl256, mul #7\");\n  TEST_SINGLE(inch(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"inch z30.h, all, mul #16\");\n\n  TEST_SINGLE(dech(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"dech z30.h, pow2\");\n  TEST_SINGLE(dech(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"dech z30.h, vl256, mul #7\");\n  TEST_SINGLE(dech(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"dech z30.h, all, mul #16\");\n\n  TEST_SINGLE(incw(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"incw z30.s, pow2\");\n  TEST_SINGLE(incw(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"incw z30.s, vl256, mul #7\");\n  TEST_SINGLE(incw(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"incw z30.s, all, mul #16\");\n\n  TEST_SINGLE(decw(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"decw z30.s, pow2\");\n  TEST_SINGLE(decw(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"decw z30.s, vl256, mul #7\");\n  TEST_SINGLE(decw(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"decw z30.s, all, mul #16\");\n\n  TEST_SINGLE(incd(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"incd z30.d, pow2\");\n  TEST_SINGLE(incd(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"incd z30.d, vl256, mul #7\");\n  TEST_SINGLE(incd(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"incd z30.d, all, mul #16\");\n\n  TEST_SINGLE(decd(ZReg::z30, PredicatePattern::SVE_POW2, 1), \"decd z30.d, pow2\");\n  TEST_SINGLE(decd(ZReg::z30, PredicatePattern::SVE_VL256, 7), \"decd z30.d, vl256, mul #7\");\n  TEST_SINGLE(decd(ZReg::z30, PredicatePattern::SVE_ALL, 16), \"decd z30.d, all, mul #16\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE inc/dec register by element count\") {\n  TEST_SINGLE(incb(XReg::x30, PredicatePattern::SVE_POW2, 1), \"incb x30, pow2\");\n  TEST_SINGLE(incb(XReg::x30, PredicatePattern::SVE_VL256, 7), \"incb x30, vl256, mul #7\");\n  TEST_SINGLE(incb(XReg::x30, PredicatePattern::SVE_ALL, 16), \"incb x30, all, mul #16\");\n\n  TEST_SINGLE(decb(XReg::x30, PredicatePattern::SVE_POW2, 1), \"decb x30, pow2\");\n  TEST_SINGLE(decb(XReg::x30, PredicatePattern::SVE_VL256, 7), \"decb x30, vl256, mul #7\");\n  TEST_SINGLE(decb(XReg::x30, PredicatePattern::SVE_ALL, 16), \"decb x30, all, mul #16\");\n\n  TEST_SINGLE(inch(XReg::x30, PredicatePattern::SVE_POW2, 1), \"inch x30, pow2\");\n  TEST_SINGLE(inch(XReg::x30, PredicatePattern::SVE_VL256, 7), \"inch x30, vl256, mul #7\");\n  TEST_SINGLE(inch(XReg::x30, PredicatePattern::SVE_ALL, 16), \"inch x30, all, mul #16\");\n\n  TEST_SINGLE(dech(XReg::x30, PredicatePattern::SVE_POW2, 1), \"dech x30, pow2\");\n  TEST_SINGLE(dech(XReg::x30, PredicatePattern::SVE_VL256, 7), \"dech x30, vl256, mul #7\");\n  TEST_SINGLE(dech(XReg::x30, PredicatePattern::SVE_ALL, 16), \"dech x30, all, mul #16\");\n\n  TEST_SINGLE(incw(XReg::x30, PredicatePattern::SVE_POW2, 1), \"incw x30, pow2\");\n  TEST_SINGLE(incw(XReg::x30, PredicatePattern::SVE_VL256, 7), \"incw x30, vl256, mul #7\");\n  TEST_SINGLE(incw(XReg::x30, PredicatePattern::SVE_ALL, 16), \"incw x30, all, mul #16\");\n\n  TEST_SINGLE(decw(XReg::x30, PredicatePattern::SVE_POW2, 1), \"decw x30, pow2\");\n  TEST_SINGLE(decw(XReg::x30, PredicatePattern::SVE_VL256, 7), \"decw x30, vl256, mul #7\");\n  TEST_SINGLE(decw(XReg::x30, PredicatePattern::SVE_ALL, 16), \"decw x30, all, mul #16\");\n\n  TEST_SINGLE(incd(XReg::x30, PredicatePattern::SVE_POW2, 1), \"incd x30, pow2\");\n  TEST_SINGLE(incd(XReg::x30, PredicatePattern::SVE_VL256, 7), \"incd x30, vl256, mul #7\");\n  TEST_SINGLE(incd(XReg::x30, PredicatePattern::SVE_ALL, 16), \"incd x30, all, mul #16\");\n\n  TEST_SINGLE(decd(XReg::x30, PredicatePattern::SVE_POW2, 1), \"decd x30, pow2\");\n  TEST_SINGLE(decd(XReg::x30, PredicatePattern::SVE_VL256, 7), \"decd x30, vl256, mul #7\");\n  TEST_SINGLE(decd(XReg::x30, PredicatePattern::SVE_ALL, 16), \"decd x30, all, mul #16\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE saturating inc/dec register by element count\") {\n  TEST_SINGLE(sqincb(XReg::x30, PredicatePattern::SVE_POW2, 1), \"sqincb x30, pow2\");\n  TEST_SINGLE(sqincb(XReg::x30, PredicatePattern::SVE_VL256, 7), \"sqincb x30, vl256, mul #7\");\n  TEST_SINGLE(sqincb(XReg::x30, PredicatePattern::SVE_ALL, 16), \"sqincb x30, all, mul #16\");\n\n  TEST_SINGLE(sqincb(WReg::w30, PredicatePattern::SVE_POW2, 1), \"sqincb x30, w30, pow2\");\n  TEST_SINGLE(sqincb(WReg::w30, PredicatePattern::SVE_VL256, 7), \"sqincb x30, w30, vl256, mul #7\");\n  TEST_SINGLE(sqincb(WReg::w30, PredicatePattern::SVE_ALL, 16), \"sqincb x30, w30, all, mul #16\");\n\n  TEST_SINGLE(uqincb(XReg::x30, PredicatePattern::SVE_POW2, 1), \"uqincb x30, pow2\");\n  TEST_SINGLE(uqincb(XReg::x30, PredicatePattern::SVE_VL256, 7), \"uqincb x30, vl256, mul #7\");\n  TEST_SINGLE(uqincb(XReg::x30, PredicatePattern::SVE_ALL, 16), \"uqincb x30, all, mul #16\");\n\n  TEST_SINGLE(uqincb(WReg::w30, PredicatePattern::SVE_POW2, 1), \"uqincb w30, pow2\");\n  TEST_SINGLE(uqincb(WReg::w30, PredicatePattern::SVE_VL256, 7), \"uqincb w30, vl256, mul #7\");\n  TEST_SINGLE(uqincb(WReg::w30, PredicatePattern::SVE_ALL, 16), \"uqincb w30, all, mul #16\");\n\n  TEST_SINGLE(sqdecb(XReg::x30, PredicatePattern::SVE_POW2, 1), \"sqdecb x30, pow2\");\n  TEST_SINGLE(sqdecb(XReg::x30, PredicatePattern::SVE_VL256, 7), \"sqdecb x30, vl256, mul #7\");\n  TEST_SINGLE(sqdecb(XReg::x30, PredicatePattern::SVE_ALL, 16), \"sqdecb x30, all, mul #16\");\n\n  TEST_SINGLE(sqdecb(WReg::w30, PredicatePattern::SVE_POW2, 1), \"sqdecb x30, w30, pow2\");\n  TEST_SINGLE(sqdecb(WReg::w30, PredicatePattern::SVE_VL256, 7), \"sqdecb x30, w30, vl256, mul #7\");\n  TEST_SINGLE(sqdecb(WReg::w30, PredicatePattern::SVE_ALL, 16), \"sqdecb x30, w30, all, mul #16\");\n\n  TEST_SINGLE(uqdecb(XReg::x30, PredicatePattern::SVE_POW2, 1), \"uqdecb x30, pow2\");\n  TEST_SINGLE(uqdecb(XReg::x30, PredicatePattern::SVE_VL256, 7), \"uqdecb x30, vl256, mul #7\");\n  TEST_SINGLE(uqdecb(XReg::x30, PredicatePattern::SVE_ALL, 16), \"uqdecb x30, all, mul #16\");\n\n  TEST_SINGLE(uqdecb(WReg::w30, PredicatePattern::SVE_POW2, 1), \"uqdecb w30, pow2\");\n  TEST_SINGLE(uqdecb(WReg::w30, PredicatePattern::SVE_VL256, 7), \"uqdecb w30, vl256, mul #7\");\n  TEST_SINGLE(uqdecb(WReg::w30, PredicatePattern::SVE_ALL, 16), \"uqdecb w30, all, mul #16\");\n\n  TEST_SINGLE(sqinch(XReg::x30, PredicatePattern::SVE_POW2, 1), \"sqinch x30, pow2\");\n  TEST_SINGLE(sqinch(XReg::x30, PredicatePattern::SVE_VL256, 7), \"sqinch x30, vl256, mul #7\");\n  TEST_SINGLE(sqinch(XReg::x30, PredicatePattern::SVE_ALL, 16), \"sqinch x30, all, mul #16\");\n\n  TEST_SINGLE(sqinch(WReg::w30, PredicatePattern::SVE_POW2, 1), \"sqinch x30, w30, pow2\");\n  TEST_SINGLE(sqinch(WReg::w30, PredicatePattern::SVE_VL256, 7), \"sqinch x30, w30, vl256, mul #7\");\n  TEST_SINGLE(sqinch(WReg::w30, PredicatePattern::SVE_ALL, 16), \"sqinch x30, w30, all, mul #16\");\n\n  TEST_SINGLE(uqinch(XReg::x30, PredicatePattern::SVE_POW2, 1), \"uqinch x30, pow2\");\n  TEST_SINGLE(uqinch(XReg::x30, PredicatePattern::SVE_VL256, 7), \"uqinch x30, vl256, mul #7\");\n  TEST_SINGLE(uqinch(XReg::x30, PredicatePattern::SVE_ALL, 16), \"uqinch x30, all, mul #16\");\n\n  TEST_SINGLE(uqinch(WReg::w30, PredicatePattern::SVE_POW2, 1), \"uqinch w30, pow2\");\n  TEST_SINGLE(uqinch(WReg::w30, PredicatePattern::SVE_VL256, 7), \"uqinch w30, vl256, mul #7\");\n  TEST_SINGLE(uqinch(WReg::w30, PredicatePattern::SVE_ALL, 16), \"uqinch w30, all, mul #16\");\n\n  TEST_SINGLE(sqdech(XReg::x30, PredicatePattern::SVE_POW2, 1), \"sqdech x30, pow2\");\n  TEST_SINGLE(sqdech(XReg::x30, PredicatePattern::SVE_VL256, 7), \"sqdech x30, vl256, mul #7\");\n  TEST_SINGLE(sqdech(XReg::x30, PredicatePattern::SVE_ALL, 16), \"sqdech x30, all, mul #16\");\n\n  TEST_SINGLE(sqdech(WReg::w30, PredicatePattern::SVE_POW2, 1), \"sqdech x30, w30, pow2\");\n  TEST_SINGLE(sqdech(WReg::w30, PredicatePattern::SVE_VL256, 7), \"sqdech x30, w30, vl256, mul #7\");\n  TEST_SINGLE(sqdech(WReg::w30, PredicatePattern::SVE_ALL, 16), \"sqdech x30, w30, all, mul #16\");\n\n  TEST_SINGLE(uqdech(XReg::x30, PredicatePattern::SVE_POW2, 1), \"uqdech x30, pow2\");\n  TEST_SINGLE(uqdech(XReg::x30, PredicatePattern::SVE_VL256, 7), \"uqdech x30, vl256, mul #7\");\n  TEST_SINGLE(uqdech(XReg::x30, PredicatePattern::SVE_ALL, 16), \"uqdech x30, all, mul #16\");\n\n  TEST_SINGLE(uqdech(WReg::w30, PredicatePattern::SVE_POW2, 1), \"uqdech w30, pow2\");\n  TEST_SINGLE(uqdech(WReg::w30, PredicatePattern::SVE_VL256, 7), \"uqdech w30, vl256, mul #7\");\n  TEST_SINGLE(uqdech(WReg::w30, PredicatePattern::SVE_ALL, 16), \"uqdech w30, all, mul #16\");\n\n  TEST_SINGLE(sqincw(XReg::x30, PredicatePattern::SVE_POW2, 1), \"sqincw x30, pow2\");\n  TEST_SINGLE(sqincw(XReg::x30, PredicatePattern::SVE_VL256, 7), \"sqincw x30, vl256, mul #7\");\n  TEST_SINGLE(sqincw(XReg::x30, PredicatePattern::SVE_ALL, 16), \"sqincw x30, all, mul #16\");\n\n  TEST_SINGLE(sqincw(WReg::w30, PredicatePattern::SVE_POW2, 1), \"sqincw x30, w30, pow2\");\n  TEST_SINGLE(sqincw(WReg::w30, PredicatePattern::SVE_VL256, 7), \"sqincw x30, w30, vl256, mul #7\");\n  TEST_SINGLE(sqincw(WReg::w30, PredicatePattern::SVE_ALL, 16), \"sqincw x30, w30, all, mul #16\");\n\n  TEST_SINGLE(uqincw(XReg::x30, PredicatePattern::SVE_POW2, 1), \"uqincw x30, pow2\");\n  TEST_SINGLE(uqincw(XReg::x30, PredicatePattern::SVE_VL256, 7), \"uqincw x30, vl256, mul #7\");\n  TEST_SINGLE(uqincw(XReg::x30, PredicatePattern::SVE_ALL, 16), \"uqincw x30, all, mul #16\");\n\n  TEST_SINGLE(uqincw(WReg::w30, PredicatePattern::SVE_POW2, 1), \"uqincw w30, pow2\");\n  TEST_SINGLE(uqincw(WReg::w30, PredicatePattern::SVE_VL256, 7), \"uqincw w30, vl256, mul #7\");\n  TEST_SINGLE(uqincw(WReg::w30, PredicatePattern::SVE_ALL, 16), \"uqincw w30, all, mul #16\");\n\n  TEST_SINGLE(sqdecw(XReg::x30, PredicatePattern::SVE_POW2, 1), \"sqdecw x30, pow2\");\n  TEST_SINGLE(sqdecw(XReg::x30, PredicatePattern::SVE_VL256, 7), \"sqdecw x30, vl256, mul #7\");\n  TEST_SINGLE(sqdecw(XReg::x30, PredicatePattern::SVE_ALL, 16), \"sqdecw x30, all, mul #16\");\n\n  TEST_SINGLE(sqdecw(WReg::w30, PredicatePattern::SVE_POW2, 1), \"sqdecw x30, w30, pow2\");\n  TEST_SINGLE(sqdecw(WReg::w30, PredicatePattern::SVE_VL256, 7), \"sqdecw x30, w30, vl256, mul #7\");\n  TEST_SINGLE(sqdecw(WReg::w30, PredicatePattern::SVE_ALL, 16), \"sqdecw x30, w30, all, mul #16\");\n\n  TEST_SINGLE(uqdecw(XReg::x30, PredicatePattern::SVE_POW2, 1), \"uqdecw x30, pow2\");\n  TEST_SINGLE(uqdecw(XReg::x30, PredicatePattern::SVE_VL256, 7), \"uqdecw x30, vl256, mul #7\");\n  TEST_SINGLE(uqdecw(XReg::x30, PredicatePattern::SVE_ALL, 16), \"uqdecw x30, all, mul #16\");\n\n  TEST_SINGLE(uqdecw(WReg::w30, PredicatePattern::SVE_POW2, 1), \"uqdecw w30, pow2\");\n  TEST_SINGLE(uqdecw(WReg::w30, PredicatePattern::SVE_VL256, 7), \"uqdecw w30, vl256, mul #7\");\n  TEST_SINGLE(uqdecw(WReg::w30, PredicatePattern::SVE_ALL, 16), \"uqdecw w30, all, mul #16\");\n\n  TEST_SINGLE(sqincd(XReg::x30, PredicatePattern::SVE_POW2, 1), \"sqincd x30, pow2\");\n  TEST_SINGLE(sqincd(XReg::x30, PredicatePattern::SVE_VL256, 7), \"sqincd x30, vl256, mul #7\");\n  TEST_SINGLE(sqincd(XReg::x30, PredicatePattern::SVE_ALL, 16), \"sqincd x30, all, mul #16\");\n\n  TEST_SINGLE(sqincd(WReg::w30, PredicatePattern::SVE_POW2, 1), \"sqincd x30, w30, pow2\");\n  TEST_SINGLE(sqincd(WReg::w30, PredicatePattern::SVE_VL256, 7), \"sqincd x30, w30, vl256, mul #7\");\n  TEST_SINGLE(sqincd(WReg::w30, PredicatePattern::SVE_ALL, 16), \"sqincd x30, w30, all, mul #16\");\n\n  TEST_SINGLE(uqincd(XReg::x30, PredicatePattern::SVE_POW2, 1), \"uqincd x30, pow2\");\n  TEST_SINGLE(uqincd(XReg::x30, PredicatePattern::SVE_VL256, 7), \"uqincd x30, vl256, mul #7\");\n  TEST_SINGLE(uqincd(XReg::x30, PredicatePattern::SVE_ALL, 16), \"uqincd x30, all, mul #16\");\n\n  TEST_SINGLE(uqincd(WReg::w30, PredicatePattern::SVE_POW2, 1), \"uqincd w30, pow2\");\n  TEST_SINGLE(uqincd(WReg::w30, PredicatePattern::SVE_VL256, 7), \"uqincd w30, vl256, mul #7\");\n  TEST_SINGLE(uqincd(WReg::w30, PredicatePattern::SVE_ALL, 16), \"uqincd w30, all, mul #16\");\n\n  TEST_SINGLE(sqdecd(XReg::x30, PredicatePattern::SVE_POW2, 1), \"sqdecd x30, pow2\");\n  TEST_SINGLE(sqdecd(XReg::x30, PredicatePattern::SVE_VL256, 7), \"sqdecd x30, vl256, mul #7\");\n  TEST_SINGLE(sqdecd(XReg::x30, PredicatePattern::SVE_ALL, 16), \"sqdecd x30, all, mul #16\");\n\n  TEST_SINGLE(sqdecd(WReg::w30, PredicatePattern::SVE_POW2, 1), \"sqdecd x30, w30, pow2\");\n  TEST_SINGLE(sqdecd(WReg::w30, PredicatePattern::SVE_VL256, 7), \"sqdecd x30, w30, vl256, mul #7\");\n  TEST_SINGLE(sqdecd(WReg::w30, PredicatePattern::SVE_ALL, 16), \"sqdecd x30, w30, all, mul #16\");\n\n  TEST_SINGLE(uqdecd(XReg::x30, PredicatePattern::SVE_POW2, 1), \"uqdecd x30, pow2\");\n  TEST_SINGLE(uqdecd(XReg::x30, PredicatePattern::SVE_VL256, 7), \"uqdecd x30, vl256, mul #7\");\n  TEST_SINGLE(uqdecd(XReg::x30, PredicatePattern::SVE_ALL, 16), \"uqdecd x30, all, mul #16\");\n\n  TEST_SINGLE(uqdecd(WReg::w30, PredicatePattern::SVE_POW2, 1), \"uqdecd w30, pow2\");\n  TEST_SINGLE(uqdecd(WReg::w30, PredicatePattern::SVE_VL256, 7), \"uqdecd w30, vl256, mul #7\");\n  TEST_SINGLE(uqdecd(WReg::w30, PredicatePattern::SVE_ALL, 16), \"uqdecd w30, all, mul #16\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE Bitwise Immediate\") {\n  // TODO: Implement in emitter.\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE bitwise logical with immediate (unpredicated)\") {\n  // TODO: Implement in emitter.\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE Integer Wide Immediate - Predicated\") {\n  // TODO: Implement in emitter.\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE copy integer immediate (predicated)\") {\n  TEST_SINGLE(cpy(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), -128), \"mov z30.b, p6/m, #-128\")\n  TEST_SINGLE(cpy(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), -128), \"mov z30.h, p6/m, #-128\");\n  TEST_SINGLE(cpy(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), -128), \"mov z30.s, p6/m, #-128\");\n  TEST_SINGLE(cpy(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), -128), \"mov z30.d, p6/m, #-128\");\n\n  TEST_SINGLE(cpy(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), 127), \"mov z30.b, p6/m, #127\");\n  TEST_SINGLE(cpy(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), 127), \"mov z30.h, p6/m, #127\");\n  TEST_SINGLE(cpy(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), 127), \"mov z30.s, p6/m, #127\");\n  TEST_SINGLE(cpy(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), 127), \"mov z30.d, p6/m, #127\");\n\n  TEST_SINGLE(cpy(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), -32768), \"mov z30.h, p6/m, #-128, lsl #8\");\n  TEST_SINGLE(cpy(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), -32768), \"mov z30.s, p6/m, #-128, lsl #8\");\n  TEST_SINGLE(cpy(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), -32768), \"mov z30.d, p6/m, #-128, lsl #8\");\n\n  TEST_SINGLE(cpy(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), 32512), \"mov z30.h, p6/m, #127, lsl #8\");\n  TEST_SINGLE(cpy(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), 32512), \"mov z30.s, p6/m, #127, lsl #8\");\n  TEST_SINGLE(cpy(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), 32512), \"mov z30.d, p6/m, #127, lsl #8\");\n\n  TEST_SINGLE(mov_imm(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), -128), \"mov z30.b, p6/m, #-128\")\n  TEST_SINGLE(mov_imm(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), -128), \"mov z30.h, p6/m, #-128\");\n  TEST_SINGLE(mov_imm(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), -128), \"mov z30.s, p6/m, #-128\");\n  TEST_SINGLE(mov_imm(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), -128), \"mov z30.d, p6/m, #-128\");\n\n  TEST_SINGLE(mov_imm(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), 127), \"mov z30.b, p6/m, #127\");\n  TEST_SINGLE(mov_imm(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), 127), \"mov z30.h, p6/m, #127\");\n  TEST_SINGLE(mov_imm(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), 127), \"mov z30.s, p6/m, #127\");\n  TEST_SINGLE(mov_imm(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), 127), \"mov z30.d, p6/m, #127\");\n\n  TEST_SINGLE(mov_imm(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), -32768), \"mov z30.h, p6/m, #-128, lsl #8\");\n  TEST_SINGLE(mov_imm(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), -32768), \"mov z30.s, p6/m, #-128, lsl #8\");\n  TEST_SINGLE(mov_imm(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), -32768), \"mov z30.d, p6/m, #-128, lsl #8\");\n\n  TEST_SINGLE(mov_imm(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), 32512), \"mov z30.h, p6/m, #127, lsl #8\");\n  TEST_SINGLE(mov_imm(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), 32512), \"mov z30.s, p6/m, #127, lsl #8\");\n  TEST_SINGLE(mov_imm(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), 32512), \"mov z30.d, p6/m, #127, lsl #8\");\n\n  TEST_SINGLE(cpy(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Zeroing(), -128), \"mov z30.b, p6/z, #-128\")\n  TEST_SINGLE(cpy(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), -128), \"mov z30.h, p6/z, #-128\");\n  TEST_SINGLE(cpy(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), -128), \"mov z30.s, p6/z, #-128\");\n  TEST_SINGLE(cpy(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), -128), \"mov z30.d, p6/z, #-128\");\n\n  TEST_SINGLE(cpy(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Zeroing(), 127), \"mov z30.b, p6/z, #127\");\n  TEST_SINGLE(cpy(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), 127), \"mov z30.h, p6/z, #127\");\n  TEST_SINGLE(cpy(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), 127), \"mov z30.s, p6/z, #127\");\n  TEST_SINGLE(cpy(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), 127), \"mov z30.d, p6/z, #127\");\n\n  TEST_SINGLE(cpy(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), -32768), \"mov z30.h, p6/z, #-128, lsl #8\");\n  TEST_SINGLE(cpy(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), -32768), \"mov z30.s, p6/z, #-128, lsl #8\");\n  TEST_SINGLE(cpy(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), -32768), \"mov z30.d, p6/z, #-128, lsl #8\");\n\n  TEST_SINGLE(cpy(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), 32512), \"mov z30.h, p6/z, #127, lsl #8\");\n  TEST_SINGLE(cpy(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), 32512), \"mov z30.s, p6/z, #127, lsl #8\");\n  TEST_SINGLE(cpy(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), 32512), \"mov z30.d, p6/z, #127, lsl #8\");\n\n  TEST_SINGLE(mov_imm(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Zeroing(), -128), \"mov z30.b, p6/z, #-128\")\n  TEST_SINGLE(mov_imm(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), -128), \"mov z30.h, p6/z, #-128\");\n  TEST_SINGLE(mov_imm(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), -128), \"mov z30.s, p6/z, #-128\");\n  TEST_SINGLE(mov_imm(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), -128), \"mov z30.d, p6/z, #-128\");\n\n  TEST_SINGLE(mov_imm(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Zeroing(), 127), \"mov z30.b, p6/z, #127\");\n  TEST_SINGLE(mov_imm(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), 127), \"mov z30.h, p6/z, #127\");\n  TEST_SINGLE(mov_imm(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), 127), \"mov z30.s, p6/z, #127\");\n  TEST_SINGLE(mov_imm(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), 127), \"mov z30.d, p6/z, #127\");\n\n  TEST_SINGLE(mov_imm(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), -32768), \"mov z30.h, p6/z, #-128, lsl #8\");\n  TEST_SINGLE(mov_imm(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), -32768), \"mov z30.s, p6/z, #-128, lsl #8\");\n  TEST_SINGLE(mov_imm(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), -32768), \"mov z30.d, p6/z, #-128, lsl #8\");\n\n  TEST_SINGLE(mov_imm(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), 32512), \"mov z30.h, p6/z, #127, lsl #8\");\n  TEST_SINGLE(mov_imm(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), 32512), \"mov z30.s, p6/z, #127, lsl #8\");\n  TEST_SINGLE(mov_imm(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), 32512), \"mov z30.d, p6/z, #127, lsl #8\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE Permute Vector - Unpredicated\") {\n  TEST_SINGLE(dup(SubRegSize::i8Bit, ZReg::z30, Reg::r29), \"mov z30.b, w29\");\n  TEST_SINGLE(dup(SubRegSize::i16Bit, ZReg::z30, Reg::r29), \"mov z30.h, w29\");\n  TEST_SINGLE(dup(SubRegSize::i32Bit, ZReg::z30, Reg::r29), \"mov z30.s, w29\");\n  TEST_SINGLE(dup(SubRegSize::i64Bit, ZReg::z30, Reg::r29), \"mov z30.d, x29\");\n\n  TEST_SINGLE(mov(SubRegSize::i8Bit, ZReg::z30, Reg::r29), \"mov z30.b, w29\");\n  TEST_SINGLE(mov(SubRegSize::i16Bit, ZReg::z30, Reg::r29), \"mov z30.h, w29\");\n  TEST_SINGLE(mov(SubRegSize::i32Bit, ZReg::z30, Reg::r29), \"mov z30.s, w29\");\n  TEST_SINGLE(mov(SubRegSize::i64Bit, ZReg::z30, Reg::r29), \"mov z30.d, x29\");\n\n  TEST_SINGLE(insr(SubRegSize::i8Bit, ZReg::z30, Reg::r29), \"insr z30.b, w29\");\n  TEST_SINGLE(insr(SubRegSize::i16Bit, ZReg::z30, Reg::r29), \"insr z30.h, w29\");\n  TEST_SINGLE(insr(SubRegSize::i32Bit, ZReg::z30, Reg::r29), \"insr z30.s, w29\");\n  TEST_SINGLE(insr(SubRegSize::i64Bit, ZReg::z30, Reg::r29), \"insr z30.d, x29\");\n\n  TEST_SINGLE(insr(SubRegSize::i8Bit, ZReg::z30, VReg::v29), \"insr z30.b, b29\");\n  TEST_SINGLE(insr(SubRegSize::i16Bit, ZReg::z30, VReg::v29), \"insr z30.h, h29\");\n  TEST_SINGLE(insr(SubRegSize::i32Bit, ZReg::z30, VReg::v29), \"insr z30.s, s29\");\n  TEST_SINGLE(insr(SubRegSize::i64Bit, ZReg::z30, VReg::v29), \"insr z30.d, d29\");\n\n  TEST_SINGLE(rev(SubRegSize::i8Bit, ZReg::z30, ZReg::z29), \"rev z30.b, z29.b\");\n  TEST_SINGLE(rev(SubRegSize::i16Bit, ZReg::z30, ZReg::z29), \"rev z30.h, z29.h\");\n  TEST_SINGLE(rev(SubRegSize::i32Bit, ZReg::z30, ZReg::z29), \"rev z30.s, z29.s\");\n  TEST_SINGLE(rev(SubRegSize::i64Bit, ZReg::z30, ZReg::z29), \"rev z30.d, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE unpack vector elements\") {\n  // TEST_SINGLE(sunpklo(SubRegSize::i8Bit, ZReg::z30, ZReg::z29),   \"sunpklo z30.b, z29.b\");\n  TEST_SINGLE(sunpklo(SubRegSize::i16Bit, ZReg::z30, ZReg::z29), \"sunpklo z30.h, z29.b\");\n  TEST_SINGLE(sunpklo(SubRegSize::i32Bit, ZReg::z30, ZReg::z29), \"sunpklo z30.s, z29.h\");\n  TEST_SINGLE(sunpklo(SubRegSize::i64Bit, ZReg::z30, ZReg::z29), \"sunpklo z30.d, z29.s\");\n  // TEST_SINGLE(sunpklo(SubRegSize::i128Bit, ZReg::z30, ZReg::z29), \"sunpklo z30.q, z29.q\");\n\n  // TEST_SINGLE(sunpkhi(SubRegSize::i8Bit, ZReg::z30, ZReg::z29),   \"sunpkhi z30.b, z29.b\");\n  TEST_SINGLE(sunpkhi(SubRegSize::i16Bit, ZReg::z30, ZReg::z29), \"sunpkhi z30.h, z29.b\");\n  TEST_SINGLE(sunpkhi(SubRegSize::i32Bit, ZReg::z30, ZReg::z29), \"sunpkhi z30.s, z29.h\");\n  TEST_SINGLE(sunpkhi(SubRegSize::i64Bit, ZReg::z30, ZReg::z29), \"sunpkhi z30.d, z29.s\");\n  // TEST_SINGLE(sunpkhi(SubRegSize::i128Bit, ZReg::z30, ZReg::z29), \"sunpkhi z30.q, z29.q\");\n\n  // TEST_SINGLE(uunpklo(SubRegSize::i8Bit, ZReg::z30, ZReg::z29),   \"uunpklo z30.b, z29.b\");\n  TEST_SINGLE(uunpklo(SubRegSize::i16Bit, ZReg::z30, ZReg::z29), \"uunpklo z30.h, z29.b\");\n  TEST_SINGLE(uunpklo(SubRegSize::i32Bit, ZReg::z30, ZReg::z29), \"uunpklo z30.s, z29.h\");\n  TEST_SINGLE(uunpklo(SubRegSize::i64Bit, ZReg::z30, ZReg::z29), \"uunpklo z30.d, z29.s\");\n  // TEST_SINGLE(uunpklo(SubRegSize::i128Bit, ZReg::z30, ZReg::z29), \"uunpklo z30.q, z29.q\");\n\n  // TEST_SINGLE(uunpkhi(SubRegSize::i8Bit, ZReg::z30, ZReg::z29),   \"uunpkhi z30.b, z29.b\");\n  TEST_SINGLE(uunpkhi(SubRegSize::i16Bit, ZReg::z30, ZReg::z29), \"uunpkhi z30.h, z29.b\");\n  TEST_SINGLE(uunpkhi(SubRegSize::i32Bit, ZReg::z30, ZReg::z29), \"uunpkhi z30.s, z29.h\");\n  TEST_SINGLE(uunpkhi(SubRegSize::i64Bit, ZReg::z30, ZReg::z29), \"uunpkhi z30.d, z29.s\");\n  // TEST_SINGLE(uunpkhi(SubRegSize::i128Bit, ZReg::z30, ZReg::z29), \"uunpkhi z30.q, z29.q\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE Permute Predicate\") {\n  TEST_SINGLE(rev(SubRegSize::i8Bit, PReg::p15, PReg::p14), \"rev p15.b, p14.b\");\n  TEST_SINGLE(rev(SubRegSize::i16Bit, PReg::p15, PReg::p14), \"rev p15.h, p14.h\");\n  TEST_SINGLE(rev(SubRegSize::i32Bit, PReg::p15, PReg::p14), \"rev p15.s, p14.s\");\n  TEST_SINGLE(rev(SubRegSize::i64Bit, PReg::p15, PReg::p14), \"rev p15.d, p14.d\");\n\n  TEST_SINGLE(punpklo(PReg::p15, PReg::p14), \"punpklo p15.h, p14.b\");\n  TEST_SINGLE(punpkhi(PReg::p15, PReg::p14), \"punpkhi p15.h, p14.b\");\n\n  TEST_SINGLE(zip1(SubRegSize::i8Bit, PReg::p15, PReg::p14, PReg::p13), \"zip1 p15.b, p14.b, p13.b\");\n  TEST_SINGLE(zip1(SubRegSize::i16Bit, PReg::p15, PReg::p14, PReg::p13), \"zip1 p15.h, p14.h, p13.h\");\n  TEST_SINGLE(zip1(SubRegSize::i32Bit, PReg::p15, PReg::p14, PReg::p13), \"zip1 p15.s, p14.s, p13.s\");\n  TEST_SINGLE(zip1(SubRegSize::i64Bit, PReg::p15, PReg::p14, PReg::p13), \"zip1 p15.d, p14.d, p13.d\");\n\n  TEST_SINGLE(zip2(SubRegSize::i8Bit, PReg::p15, PReg::p14, PReg::p13), \"zip2 p15.b, p14.b, p13.b\");\n  TEST_SINGLE(zip2(SubRegSize::i16Bit, PReg::p15, PReg::p14, PReg::p13), \"zip2 p15.h, p14.h, p13.h\");\n  TEST_SINGLE(zip2(SubRegSize::i32Bit, PReg::p15, PReg::p14, PReg::p13), \"zip2 p15.s, p14.s, p13.s\");\n  TEST_SINGLE(zip2(SubRegSize::i64Bit, PReg::p15, PReg::p14, PReg::p13), \"zip2 p15.d, p14.d, p13.d\");\n\n  TEST_SINGLE(uzp1(SubRegSize::i8Bit, PReg::p15, PReg::p14, PReg::p13), \"uzp1 p15.b, p14.b, p13.b\");\n  TEST_SINGLE(uzp1(SubRegSize::i16Bit, PReg::p15, PReg::p14, PReg::p13), \"uzp1 p15.h, p14.h, p13.h\");\n  TEST_SINGLE(uzp1(SubRegSize::i32Bit, PReg::p15, PReg::p14, PReg::p13), \"uzp1 p15.s, p14.s, p13.s\");\n  TEST_SINGLE(uzp1(SubRegSize::i64Bit, PReg::p15, PReg::p14, PReg::p13), \"uzp1 p15.d, p14.d, p13.d\");\n\n  TEST_SINGLE(uzp2(SubRegSize::i8Bit, PReg::p15, PReg::p14, PReg::p13), \"uzp2 p15.b, p14.b, p13.b\");\n  TEST_SINGLE(uzp2(SubRegSize::i16Bit, PReg::p15, PReg::p14, PReg::p13), \"uzp2 p15.h, p14.h, p13.h\");\n  TEST_SINGLE(uzp2(SubRegSize::i32Bit, PReg::p15, PReg::p14, PReg::p13), \"uzp2 p15.s, p14.s, p13.s\");\n  TEST_SINGLE(uzp2(SubRegSize::i64Bit, PReg::p15, PReg::p14, PReg::p13), \"uzp2 p15.d, p14.d, p13.d\");\n\n  TEST_SINGLE(trn1(SubRegSize::i8Bit, PReg::p15, PReg::p14, PReg::p13), \"trn1 p15.b, p14.b, p13.b\");\n  TEST_SINGLE(trn1(SubRegSize::i16Bit, PReg::p15, PReg::p14, PReg::p13), \"trn1 p15.h, p14.h, p13.h\");\n  TEST_SINGLE(trn1(SubRegSize::i32Bit, PReg::p15, PReg::p14, PReg::p13), \"trn1 p15.s, p14.s, p13.s\");\n  TEST_SINGLE(trn1(SubRegSize::i64Bit, PReg::p15, PReg::p14, PReg::p13), \"trn1 p15.d, p14.d, p13.d\");\n\n  TEST_SINGLE(trn2(SubRegSize::i8Bit, PReg::p15, PReg::p14, PReg::p13), \"trn2 p15.b, p14.b, p13.b\");\n  TEST_SINGLE(trn2(SubRegSize::i16Bit, PReg::p15, PReg::p14, PReg::p13), \"trn2 p15.h, p14.h, p13.h\");\n  TEST_SINGLE(trn2(SubRegSize::i32Bit, PReg::p15, PReg::p14, PReg::p13), \"trn2 p15.s, p14.s, p13.s\");\n  TEST_SINGLE(trn2(SubRegSize::i64Bit, PReg::p15, PReg::p14, PReg::p13), \"trn2 p15.d, p14.d, p13.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE Permute Vector - Predicated - Base\") {\n  // CPY (SIMD&FP scalar)\n  TEST_SINGLE(cpy(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), VReg::v30), \"mov z30.b, p7/m, b30\");\n  TEST_SINGLE(cpy(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), VReg::v30), \"mov z30.h, p7/m, h30\");\n  TEST_SINGLE(cpy(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), VReg::v30), \"mov z30.s, p7/m, s30\");\n  TEST_SINGLE(cpy(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), VReg::v30), \"mov z30.d, p7/m, d30\");\n\n  // TEST_SINGLE(compact(SubRegSize::i8Bit, ZReg::z30, PReg::p6, ZReg::z29),   \"compact z30.b, p6, z29.b\");\n  // TEST_SINGLE(compact(SubRegSize::i16Bit, ZReg::z30, PReg::p6, ZReg::z29),  \"compact z30.h, p6, z29.h\");\n  TEST_SINGLE(compact(SubRegSize::i32Bit, ZReg::z30, PReg::p6, ZReg::z29), \"compact z30.s, p6, z29.s\");\n  TEST_SINGLE(compact(SubRegSize::i64Bit, ZReg::z30, PReg::p6, ZReg::z29), \"compact z30.d, p6, z29.d\");\n  // TEST_SINGLE(compact(SubRegSize::i128Bit, ZReg::z30, PReg::p6, ZReg::z29), \"compact z30.q, p6, z29.q\");\n\n  // CPY (scalar)\n  TEST_SINGLE(cpy(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), WReg::rsp), \"mov z30.b, p7/m, wsp\");\n  TEST_SINGLE(cpy(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), WReg::rsp), \"mov z30.h, p7/m, wsp\");\n  TEST_SINGLE(cpy(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), WReg::rsp), \"mov z30.s, p7/m, wsp\");\n  TEST_SINGLE(cpy(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), XReg::rsp), \"mov z30.d, p7/m, sp\");\n\n  TEST_SINGLE(splice<OpType::Constructive>(SubRegSize::i8Bit, ZReg::z30, PReg::p6, ZReg::z28, ZReg::z29), \"splice z30.b, p6, {z28.b, \"\n                                                                                                          \"z29.b}\");\n  TEST_SINGLE(splice<OpType::Constructive>(SubRegSize::i16Bit, ZReg::z30, PReg::p6, ZReg::z28, ZReg::z29), \"splice z30.h, p6, {z28.h, \"\n                                                                                                           \"z29.h}\");\n  TEST_SINGLE(splice<OpType::Constructive>(SubRegSize::i32Bit, ZReg::z30, PReg::p6, ZReg::z28, ZReg::z29), \"splice z30.s, p6, {z28.s, \"\n                                                                                                           \"z29.s}\");\n  TEST_SINGLE(splice<OpType::Constructive>(SubRegSize::i64Bit, ZReg::z30, PReg::p6, ZReg::z28, ZReg::z29), \"splice z30.d, p6, {z28.d, \"\n                                                                                                           \"z29.d}\");\n  TEST_SINGLE(splice<OpType::Constructive>(SubRegSize::i64Bit, ZReg::z30, PReg::p6, ZReg::z31, ZReg::z0), \"splice z30.d, p6, {z31.d, \"\n                                                                                                          \"z0.d}\");\n  // TEST_SINGLE(splice<OpType::Constructive>(SubRegSize::i128Bit, ZReg::z30, PReg::p6, ZReg::z28, ZReg::z29), \"splice z30.q, p6, {z28.q, z29.q}\");\n\n  TEST_SINGLE(splice<OpType::Destructive>(SubRegSize::i8Bit, ZReg::z30, PReg::p6, ZReg::z30, ZReg::z28), \"splice z30.b, p6, z30.b, z28.b\");\n  TEST_SINGLE(splice<OpType::Destructive>(SubRegSize::i16Bit, ZReg::z30, PReg::p6, ZReg::z30, ZReg::z28), \"splice z30.h, p6, z30.h, z28.h\");\n  TEST_SINGLE(splice<OpType::Destructive>(SubRegSize::i32Bit, ZReg::z30, PReg::p6, ZReg::z30, ZReg::z28), \"splice z30.s, p6, z30.s, z28.s\");\n  TEST_SINGLE(splice<OpType::Destructive>(SubRegSize::i64Bit, ZReg::z30, PReg::p6, ZReg::z30, ZReg::z28), \"splice z30.d, p6, z30.d, z28.d\");\n  // TEST_SINGLE(splice<OpType::Destructive>(SubRegSize::i128Bit, ZReg::z30, PReg::p6, ZReg::z30, ZReg::z28), \"splice z30.q, p6, z30.q, z28.q\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE extract element to general register\") {\n  TEST_SINGLE(lasta(SubRegSize::i8Bit, WReg::w30, PReg::p7, ZReg::z30), \"lasta w30, p7, z30.b\");\n  TEST_SINGLE(lasta(SubRegSize::i16Bit, WReg::w30, PReg::p7, ZReg::z30), \"lasta w30, p7, z30.h\");\n  TEST_SINGLE(lasta(SubRegSize::i32Bit, WReg::w30, PReg::p7, ZReg::z30), \"lasta w30, p7, z30.s\");\n  TEST_SINGLE(lasta(SubRegSize::i64Bit, XReg::x30, PReg::p7, ZReg::z30), \"lasta x30, p7, z30.d\");\n\n  TEST_SINGLE(lastb(SubRegSize::i8Bit, WReg::w30, PReg::p7, ZReg::z30), \"lastb w30, p7, z30.b\");\n  TEST_SINGLE(lastb(SubRegSize::i16Bit, WReg::w30, PReg::p7, ZReg::z30), \"lastb w30, p7, z30.h\");\n  TEST_SINGLE(lastb(SubRegSize::i32Bit, WReg::w30, PReg::p7, ZReg::z30), \"lastb w30, p7, z30.s\");\n  TEST_SINGLE(lastb(SubRegSize::i64Bit, XReg::x30, PReg::p7, ZReg::z30), \"lastb x30, p7, z30.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE extract element to SIMD&FP scalar register\") {\n  TEST_SINGLE(lasta(SubRegSize::i8Bit, BReg::b30, PReg::p7, ZReg::z29), \"lasta b30, p7, z29.b\");\n  TEST_SINGLE(lasta(SubRegSize::i16Bit, HReg::h30, PReg::p7, ZReg::z29), \"lasta h30, p7, z29.h\");\n  TEST_SINGLE(lasta(SubRegSize::i32Bit, SReg::s30, PReg::p7, ZReg::z29), \"lasta s30, p7, z29.s\");\n  TEST_SINGLE(lasta(SubRegSize::i64Bit, DReg::d30, PReg::p7, ZReg::z29), \"lasta d30, p7, z29.d\");\n\n  TEST_SINGLE(lastb(SubRegSize::i8Bit, BReg::b30, PReg::p7, ZReg::z29), \"lastb b30, p7, z29.b\");\n  TEST_SINGLE(lastb(SubRegSize::i16Bit, HReg::h30, PReg::p7, ZReg::z29), \"lastb h30, p7, z29.h\");\n  TEST_SINGLE(lastb(SubRegSize::i32Bit, SReg::s30, PReg::p7, ZReg::z29), \"lastb s30, p7, z29.s\");\n  TEST_SINGLE(lastb(SubRegSize::i64Bit, DReg::d30, PReg::p7, ZReg::z29), \"lastb d30, p7, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE reverse within elements\") {\n  // TEST_SINGLE(revb(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"revb z30.b, p6/m, z29.b\");\n  TEST_SINGLE(revb(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"revb z30.h, p6/m, z29.h\");\n  TEST_SINGLE(revb(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"revb z30.s, p6/m, z29.s\");\n  TEST_SINGLE(revb(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"revb z30.d, p6/m, z29.d\");\n\n  // TEST_SINGLE(revh(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"revh z30.b, p6/m, z29.b\");\n  // TEST_SINGLE(revh(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"revh z30.h, p6/m, z29.h\");\n  TEST_SINGLE(revh(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"revh z30.s, p6/m, z29.s\");\n  TEST_SINGLE(revh(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"revh z30.d, p6/m, z29.d\");\n\n  // TEST_SINGLE(revw(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"revw z30.b, p6/m, z29.b\");\n  // TEST_SINGLE(revw(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"revw z30.h, p6/m, z29.h\");\n  // TEST_SINGLE(revw(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"revw z30.s, p6/m, z29.s\");\n  TEST_SINGLE(revw(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"revw z30.d, p6/m, z29.d\");\n\n  TEST_SINGLE(rbit(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"rbit z30.b, p6/m, z29.b\");\n  TEST_SINGLE(rbit(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"rbit z30.h, p6/m, z29.h\");\n  TEST_SINGLE(rbit(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"rbit z30.s, p6/m, z29.s\");\n  TEST_SINGLE(rbit(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"rbit z30.d, p6/m, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE conditionally broadcast element to vector\") {\n  TEST_SINGLE(clasta(SubRegSize::i8Bit, ZReg::z30, PReg::p7, ZReg::z30, ZReg::z29), \"clasta z30.b, p7, z30.b, z29.b\");\n  TEST_SINGLE(clasta(SubRegSize::i16Bit, ZReg::z30, PReg::p7, ZReg::z30, ZReg::z29), \"clasta z30.h, p7, z30.h, z29.h\");\n  TEST_SINGLE(clasta(SubRegSize::i32Bit, ZReg::z30, PReg::p7, ZReg::z30, ZReg::z29), \"clasta z30.s, p7, z30.s, z29.s\");\n  TEST_SINGLE(clasta(SubRegSize::i64Bit, ZReg::z30, PReg::p7, ZReg::z30, ZReg::z29), \"clasta z30.d, p7, z30.d, z29.d\");\n\n  TEST_SINGLE(clastb(SubRegSize::i8Bit, ZReg::z30, PReg::p7, ZReg::z30, ZReg::z29), \"clastb z30.b, p7, z30.b, z29.b\");\n  TEST_SINGLE(clastb(SubRegSize::i16Bit, ZReg::z30, PReg::p7, ZReg::z30, ZReg::z29), \"clastb z30.h, p7, z30.h, z29.h\");\n  TEST_SINGLE(clastb(SubRegSize::i32Bit, ZReg::z30, PReg::p7, ZReg::z30, ZReg::z29), \"clastb z30.s, p7, z30.s, z29.s\");\n  TEST_SINGLE(clastb(SubRegSize::i64Bit, ZReg::z30, PReg::p7, ZReg::z30, ZReg::z29), \"clastb z30.d, p7, z30.d, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE conditionally extract element to SIMD&FP scalar\") {\n  TEST_SINGLE(clasta(SubRegSize::i8Bit, VReg::v30, PReg::p7, VReg::v30, ZReg::z29), \"clasta b30, p7, b30, z29.b\");\n  TEST_SINGLE(clasta(SubRegSize::i16Bit, VReg::v30, PReg::p7, VReg::v30, ZReg::z29), \"clasta h30, p7, h30, z29.h\");\n  TEST_SINGLE(clasta(SubRegSize::i32Bit, VReg::v30, PReg::p7, VReg::v30, ZReg::z29), \"clasta s30, p7, s30, z29.s\");\n  TEST_SINGLE(clasta(SubRegSize::i64Bit, VReg::v30, PReg::p7, VReg::v30, ZReg::z29), \"clasta d30, p7, d30, z29.d\");\n\n  TEST_SINGLE(clastb(SubRegSize::i8Bit, VReg::v30, PReg::p7, VReg::v30, ZReg::z29), \"clastb b30, p7, b30, z29.b\");\n  TEST_SINGLE(clastb(SubRegSize::i16Bit, VReg::v30, PReg::p7, VReg::v30, ZReg::z29), \"clastb h30, p7, h30, z29.h\");\n  TEST_SINGLE(clastb(SubRegSize::i32Bit, VReg::v30, PReg::p7, VReg::v30, ZReg::z29), \"clastb s30, p7, s30, z29.s\");\n  TEST_SINGLE(clastb(SubRegSize::i64Bit, VReg::v30, PReg::p7, VReg::v30, ZReg::z29), \"clastb d30, p7, d30, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE reverse doublewords\") {\n  // TODO: Implement in emitter.\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE conditionally extract element to general register\") {\n  TEST_SINGLE(clasta(SubRegSize::i8Bit, WReg::w30, PReg::p7, WReg::w30, ZReg::z29), \"clasta w30, p7, w30, z29.b\");\n  TEST_SINGLE(clasta(SubRegSize::i16Bit, WReg::w30, PReg::p7, WReg::w30, ZReg::z29), \"clasta w30, p7, w30, z29.h\");\n  TEST_SINGLE(clasta(SubRegSize::i32Bit, WReg::w30, PReg::p7, WReg::w30, ZReg::z29), \"clasta w30, p7, w30, z29.s\");\n  TEST_SINGLE(clasta(SubRegSize::i64Bit, XReg::x30, PReg::p7, XReg::x30, ZReg::z29), \"clasta x30, p7, x30, z29.d\");\n\n  TEST_SINGLE(clastb(SubRegSize::i8Bit, WReg::w30, PReg::p7, WReg::w30, ZReg::z29), \"clastb w30, p7, w30, z29.b\");\n  TEST_SINGLE(clastb(SubRegSize::i16Bit, WReg::w30, PReg::p7, WReg::w30, ZReg::z29), \"clastb w30, p7, w30, z29.h\");\n  TEST_SINGLE(clastb(SubRegSize::i32Bit, WReg::w30, PReg::p7, WReg::w30, ZReg::z29), \"clastb w30, p7, w30, z29.s\");\n  TEST_SINGLE(clastb(SubRegSize::i64Bit, XReg::x30, PReg::p7, XReg::x30, ZReg::z29), \"clastb x30, p7, x30, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE Permute Vector - Extract\") {\n  TEST_SINGLE(ext<ARMEmitter::OpType::Destructive>(ZReg::z30, ZReg::z30, ZReg::z29, 0), \"ext z30.b, z30.b, z29.b, #0\");\n  TEST_SINGLE(ext<ARMEmitter::OpType::Destructive>(ZReg::z30, ZReg::z30, ZReg::z29, 255), \"ext z30.b, z30.b, z29.b, #255\");\n\n  TEST_SINGLE(ext<ARMEmitter::OpType::Constructive>(ZReg::z30, ZReg::z28, ZReg::z29, 0), \"ext z30.b, {z28.b, z29.b}, #0\");\n  TEST_SINGLE(ext<ARMEmitter::OpType::Constructive>(ZReg::z30, ZReg::z28, ZReg::z29, 255), \"ext z30.b, {z28.b, z29.b}, #255\");\n  TEST_SINGLE(ext<ARMEmitter::OpType::Constructive>(ZReg::z30, ZReg::z31, ZReg::z0, 255), \"ext z30.b, {z31.b, z0.b}, #255\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE permute vector segments\") {\n  // TODO: Implement in emitter.\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer compare vectors\") {\n  TEST_SINGLE(cmpeq(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpeq p6.b, p5/z, z30.b, z29.b\");\n  TEST_SINGLE(cmpeq(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpeq p6.h, p5/z, z30.h, z29.h\");\n  TEST_SINGLE(cmpeq(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpeq p6.s, p5/z, z30.s, z29.s\");\n  TEST_SINGLE(cmpeq(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpeq p6.d, p5/z, z30.d, z29.d\");\n\n  TEST_SINGLE(cmpge(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpge p6.b, p5/z, z30.b, z29.b\");\n  TEST_SINGLE(cmpge(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpge p6.h, p5/z, z30.h, z29.h\");\n  TEST_SINGLE(cmpge(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpge p6.s, p5/z, z30.s, z29.s\");\n  TEST_SINGLE(cmpge(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpge p6.d, p5/z, z30.d, z29.d\");\n\n  TEST_SINGLE(cmpgt(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpgt p6.b, p5/z, z30.b, z29.b\");\n  TEST_SINGLE(cmpgt(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpgt p6.h, p5/z, z30.h, z29.h\");\n  TEST_SINGLE(cmpgt(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpgt p6.s, p5/z, z30.s, z29.s\");\n  TEST_SINGLE(cmpgt(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpgt p6.d, p5/z, z30.d, z29.d\");\n\n  TEST_SINGLE(cmphi(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmphi p6.b, p5/z, z30.b, z29.b\");\n  TEST_SINGLE(cmphi(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmphi p6.h, p5/z, z30.h, z29.h\");\n  TEST_SINGLE(cmphi(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmphi p6.s, p5/z, z30.s, z29.s\");\n  TEST_SINGLE(cmphi(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmphi p6.d, p5/z, z30.d, z29.d\");\n\n  TEST_SINGLE(cmphs(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmphs p6.b, p5/z, z30.b, z29.b\");\n  TEST_SINGLE(cmphs(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmphs p6.h, p5/z, z30.h, z29.h\");\n  TEST_SINGLE(cmphs(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmphs p6.s, p5/z, z30.s, z29.s\");\n  TEST_SINGLE(cmphs(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmphs p6.d, p5/z, z30.d, z29.d\");\n\n  TEST_SINGLE(cmpne(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpne p6.b, p5/z, z30.b, z29.b\");\n  TEST_SINGLE(cmpne(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpne p6.h, p5/z, z30.h, z29.h\");\n  TEST_SINGLE(cmpne(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpne p6.s, p5/z, z30.s, z29.s\");\n  TEST_SINGLE(cmpne(SubRegSize::i64Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpne p6.d, p5/z, z30.d, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer compare with wide elements\") {\n  TEST_SINGLE(cmpeq_wide(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpeq p6.b, p5/z, z30.b, z29.d\");\n  TEST_SINGLE(cmpeq_wide(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpeq p6.h, p5/z, z30.h, z29.d\");\n  TEST_SINGLE(cmpeq_wide(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpeq p6.s, p5/z, z30.s, z29.d\");\n\n  TEST_SINGLE(cmpgt_wide(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpgt p6.b, p5/z, z30.b, z29.d\");\n  TEST_SINGLE(cmpgt_wide(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpgt p6.h, p5/z, z30.h, z29.d\");\n  TEST_SINGLE(cmpgt_wide(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpgt p6.s, p5/z, z30.s, z29.d\");\n\n  TEST_SINGLE(cmpge_wide(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpge p6.b, p5/z, z30.b, z29.d\");\n  TEST_SINGLE(cmpge_wide(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpge p6.h, p5/z, z30.h, z29.d\");\n  TEST_SINGLE(cmpge_wide(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpge p6.s, p5/z, z30.s, z29.d\");\n\n  TEST_SINGLE(cmphi_wide(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmphi p6.b, p5/z, z30.b, z29.d\");\n  TEST_SINGLE(cmphi_wide(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmphi p6.h, p5/z, z30.h, z29.d\");\n  TEST_SINGLE(cmphi_wide(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmphi p6.s, p5/z, z30.s, z29.d\");\n\n  TEST_SINGLE(cmphs_wide(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmphs p6.b, p5/z, z30.b, z29.d\");\n  TEST_SINGLE(cmphs_wide(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmphs p6.h, p5/z, z30.h, z29.d\");\n  TEST_SINGLE(cmphs_wide(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmphs p6.s, p5/z, z30.s, z29.d\");\n\n  TEST_SINGLE(cmplt_wide(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmplt p6.b, p5/z, z30.b, z29.d\");\n  TEST_SINGLE(cmplt_wide(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmplt p6.h, p5/z, z30.h, z29.d\");\n  TEST_SINGLE(cmplt_wide(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmplt p6.s, p5/z, z30.s, z29.d\");\n\n  TEST_SINGLE(cmple_wide(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmple p6.b, p5/z, z30.b, z29.d\");\n  TEST_SINGLE(cmple_wide(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmple p6.h, p5/z, z30.h, z29.d\");\n  TEST_SINGLE(cmple_wide(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmple p6.s, p5/z, z30.s, z29.d\");\n\n  TEST_SINGLE(cmplo_wide(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmplo p6.b, p5/z, z30.b, z29.d\");\n  TEST_SINGLE(cmplo_wide(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmplo p6.h, p5/z, z30.h, z29.d\");\n  TEST_SINGLE(cmplo_wide(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmplo p6.s, p5/z, z30.s, z29.d\");\n\n  TEST_SINGLE(cmpls_wide(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpls p6.b, p5/z, z30.b, z29.d\");\n  TEST_SINGLE(cmpls_wide(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpls p6.h, p5/z, z30.h, z29.d\");\n  TEST_SINGLE(cmpls_wide(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpls p6.s, p5/z, z30.s, z29.d\");\n\n  TEST_SINGLE(cmpne_wide(SubRegSize::i8Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpne p6.b, p5/z, z30.b, z29.d\");\n  TEST_SINGLE(cmpne_wide(SubRegSize::i16Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpne p6.h, p5/z, z30.h, z29.d\");\n  TEST_SINGLE(cmpne_wide(SubRegSize::i32Bit, PReg::p6, PReg::p5.Zeroing(), ZReg::z30, ZReg::z29), \"cmpne p6.s, p5/z, z30.s, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE propagate break from previous partition\") {\n  TEST_SINGLE(brkpa(PReg::p15, PReg::p14.Zeroing(), PReg::p13, PReg::p12), \"brkpa p15.b, p14/z, p13.b, p12.b\");\n  TEST_SINGLE(brkpas(PReg::p15, PReg::p14.Zeroing(), PReg::p13, PReg::p12), \"brkpas p15.b, p14/z, p13.b, p12.b\");\n  TEST_SINGLE(brkpb(PReg::p15, PReg::p14.Zeroing(), PReg::p13, PReg::p12), \"brkpb p15.b, p14/z, p13.b, p12.b\");\n  TEST_SINGLE(brkpbs(PReg::p15, PReg::p14.Zeroing(), PReg::p13, PReg::p12), \"brkpbs p15.b, p14/z, p13.b, p12.b\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE propagate break to next partition\") {\n  TEST_SINGLE(brkn(PReg::p15, PReg::p14.Zeroing(), PReg::p13, PReg::p15), \"brkn p15.b, p14/z, p13.b, p15.b\");\n  TEST_SINGLE(brkns(PReg::p15, PReg::p14.Zeroing(), PReg::p13, PReg::p15), \"brkns p15.b, p14/z, p13.b, p15.b\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE partition break condition\") {\n  TEST_SINGLE(brka(PReg::p15, PReg::p14.Zeroing(), PReg::p13), \"brka p15.b, p14/z, p13.b\");\n  TEST_SINGLE(brka(PReg::p15, PReg::p14.Merging(), PReg::p13), \"brka p15.b, p14/m, p13.b\");\n  TEST_SINGLE(brkas(PReg::p15, PReg::p14.Zeroing(), PReg::p13), \"brkas p15.b, p14/z, p13.b\");\n\n  TEST_SINGLE(brkb(PReg::p15, PReg::p14.Zeroing(), PReg::p13), \"brkb p15.b, p14/z, p13.b\");\n  TEST_SINGLE(brkb(PReg::p15, PReg::p14.Merging(), PReg::p13), \"brkb p15.b, p14/m, p13.b\");\n  TEST_SINGLE(brkbs(PReg::p15, PReg::p14.Zeroing(), PReg::p13), \"brkbs p15.b, p14/z, p13.b\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE Predicate Misc\") {\n  TEST_SINGLE(pnext(SubRegSize::i8Bit, PReg::p15, PReg::p14, PReg::p15), \"pnext p15.b, p14, p15.b\");\n  TEST_SINGLE(pnext(SubRegSize::i16Bit, PReg::p15, PReg::p14, PReg::p15), \"pnext p15.h, p14, p15.h\");\n  TEST_SINGLE(pnext(SubRegSize::i32Bit, PReg::p15, PReg::p14, PReg::p15), \"pnext p15.s, p14, p15.s\");\n  TEST_SINGLE(pnext(SubRegSize::i64Bit, PReg::p15, PReg::p14, PReg::p15), \"pnext p15.d, p14, p15.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE predicate test\") {\n  TEST_SINGLE(ptest(PReg::p6, PReg::p5), \"ptest p6, p5.b\");\n  TEST_SINGLE(ptest(PReg::p15, PReg::p14), \"ptest p15, p14.b\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE predicate first active\") {\n  TEST_SINGLE(pfirst(PReg::p6, PReg::p5, PReg::p6), \"pfirst p6.b, p5, p6.b\");\n  TEST_SINGLE(pfirst(PReg::p15, PReg::p14, PReg::p15), \"pfirst p15.b, p14, p15.b\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE predicate zero\") {\n  TEST_SINGLE(pfalse(PReg::p6), \"pfalse p6.b\");\n  TEST_SINGLE(pfalse(PReg::p15), \"pfalse p15.b\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE predicate read from FFR (predicated)\") {\n  TEST_SINGLE(rdffr(PReg::p6, PReg::p5.Zeroing()), \"rdffr p6.b, p5/z\");\n  TEST_SINGLE(rdffr(PReg::p15, PReg::p14.Zeroing()), \"rdffr p15.b, p14/z\");\n  TEST_SINGLE(rdffrs(PReg::p6, PReg::p5.Zeroing()), \"rdffrs p6.b, p5/z\");\n  TEST_SINGLE(rdffrs(PReg::p15, PReg::p14.Zeroing()), \"rdffrs p15.b, p14/z\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE predicate read from FFR (unpredicated)\") {\n  TEST_SINGLE(rdffr(PReg::p6), \"rdffr p6.b\");\n  TEST_SINGLE(rdffr(PReg::p15), \"rdffr p15.b\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE predicate initialize\") {\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_POW2), \"ptrue p6.b, pow2\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_POW2), \"ptrue p6.h, pow2\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_POW2), \"ptrue p6.s, pow2\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_POW2), \"ptrue p6.d, pow2\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_POW2), \"ptrues p6.b, pow2\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_POW2), \"ptrues p6.h, pow2\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_POW2), \"ptrues p6.s, pow2\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_POW2), \"ptrues p6.d, pow2\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL1), \"ptrue p6.b, vl1\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL1), \"ptrue p6.h, vl1\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL1), \"ptrue p6.s, vl1\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL1), \"ptrue p6.d, vl1\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL1), \"ptrues p6.b, vl1\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL1), \"ptrues p6.h, vl1\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL1), \"ptrues p6.s, vl1\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL1), \"ptrues p6.d, vl1\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL2), \"ptrue p6.b, vl2\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL2), \"ptrue p6.h, vl2\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL2), \"ptrue p6.s, vl2\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL2), \"ptrue p6.d, vl2\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL2), \"ptrues p6.b, vl2\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL2), \"ptrues p6.h, vl2\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL2), \"ptrues p6.s, vl2\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL2), \"ptrues p6.d, vl2\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL3), \"ptrue p6.b, vl3\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL3), \"ptrue p6.h, vl3\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL3), \"ptrue p6.s, vl3\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL3), \"ptrue p6.d, vl3\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL3), \"ptrues p6.b, vl3\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL3), \"ptrues p6.h, vl3\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL3), \"ptrues p6.s, vl3\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL3), \"ptrues p6.d, vl3\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL4), \"ptrue p6.b, vl4\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL4), \"ptrue p6.h, vl4\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL4), \"ptrue p6.s, vl4\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL4), \"ptrue p6.d, vl4\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL4), \"ptrues p6.b, vl4\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL4), \"ptrues p6.h, vl4\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL4), \"ptrues p6.s, vl4\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL4), \"ptrues p6.d, vl4\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL5), \"ptrue p6.b, vl5\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL5), \"ptrue p6.h, vl5\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL5), \"ptrue p6.s, vl5\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL5), \"ptrue p6.d, vl5\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL5), \"ptrues p6.b, vl5\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL5), \"ptrues p6.h, vl5\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL5), \"ptrues p6.s, vl5\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL5), \"ptrues p6.d, vl5\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL6), \"ptrue p6.b, vl6\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL6), \"ptrue p6.h, vl6\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL6), \"ptrue p6.s, vl6\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL6), \"ptrue p6.d, vl6\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL6), \"ptrues p6.b, vl6\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL6), \"ptrues p6.h, vl6\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL6), \"ptrues p6.s, vl6\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL6), \"ptrues p6.d, vl6\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL7), \"ptrue p6.b, vl7\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL7), \"ptrue p6.h, vl7\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL7), \"ptrue p6.s, vl7\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL7), \"ptrue p6.d, vl7\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL7), \"ptrues p6.b, vl7\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL7), \"ptrues p6.h, vl7\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL7), \"ptrues p6.s, vl7\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL7), \"ptrues p6.d, vl7\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL8), \"ptrue p6.b, vl8\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL8), \"ptrue p6.h, vl8\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL8), \"ptrue p6.s, vl8\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL8), \"ptrue p6.d, vl8\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL8), \"ptrues p6.b, vl8\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL8), \"ptrues p6.h, vl8\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL8), \"ptrues p6.s, vl8\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL8), \"ptrues p6.d, vl8\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL16), \"ptrue p6.b, vl16\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL16), \"ptrue p6.h, vl16\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL16), \"ptrue p6.s, vl16\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL16), \"ptrue p6.d, vl16\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL16), \"ptrues p6.b, vl16\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL16), \"ptrues p6.h, vl16\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL16), \"ptrues p6.s, vl16\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL16), \"ptrues p6.d, vl16\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL32), \"ptrue p6.b, vl32\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL32), \"ptrue p6.h, vl32\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL32), \"ptrue p6.s, vl32\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL32), \"ptrue p6.d, vl32\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL32), \"ptrues p6.b, vl32\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL32), \"ptrues p6.h, vl32\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL32), \"ptrues p6.s, vl32\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL32), \"ptrues p6.d, vl32\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL64), \"ptrue p6.b, vl64\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL64), \"ptrue p6.h, vl64\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL64), \"ptrue p6.s, vl64\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL64), \"ptrue p6.d, vl64\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL64), \"ptrues p6.b, vl64\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL64), \"ptrues p6.h, vl64\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL64), \"ptrues p6.s, vl64\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL64), \"ptrues p6.d, vl64\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL128), \"ptrue p6.b, vl128\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL128), \"ptrue p6.h, vl128\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL128), \"ptrue p6.s, vl128\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL128), \"ptrue p6.d, vl128\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL128), \"ptrues p6.b, vl128\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL128), \"ptrues p6.h, vl128\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL128), \"ptrues p6.s, vl128\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL128), \"ptrues p6.d, vl128\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL256), \"ptrue p6.b, vl256\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL256), \"ptrue p6.h, vl256\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL256), \"ptrue p6.s, vl256\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL256), \"ptrue p6.d, vl256\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_VL256), \"ptrues p6.b, vl256\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_VL256), \"ptrues p6.h, vl256\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_VL256), \"ptrues p6.s, vl256\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_VL256), \"ptrues p6.d, vl256\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_MUL4), \"ptrue p6.b, mul4\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_MUL4), \"ptrue p6.h, mul4\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_MUL4), \"ptrue p6.s, mul4\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_MUL4), \"ptrue p6.d, mul4\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_MUL4), \"ptrues p6.b, mul4\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_MUL4), \"ptrues p6.h, mul4\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_MUL4), \"ptrues p6.s, mul4\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_MUL4), \"ptrues p6.d, mul4\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_MUL3), \"ptrue p6.b, mul3\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_MUL3), \"ptrue p6.h, mul3\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_MUL3), \"ptrue p6.s, mul3\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_MUL3), \"ptrue p6.d, mul3\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_MUL3), \"ptrues p6.b, mul3\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_MUL3), \"ptrues p6.h, mul3\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_MUL3), \"ptrues p6.s, mul3\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_MUL3), \"ptrues p6.d, mul3\");\n\n  TEST_SINGLE(ptrue(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_ALL), \"ptrue p6.b\");\n  TEST_SINGLE(ptrue(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_ALL), \"ptrue p6.h\");\n  TEST_SINGLE(ptrue(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_ALL), \"ptrue p6.s\");\n  TEST_SINGLE(ptrue(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_ALL), \"ptrue p6.d\");\n\n  TEST_SINGLE(ptrues(SubRegSize::i8Bit, PReg::p6, PredicatePattern::SVE_ALL), \"ptrues p6.b\");\n  TEST_SINGLE(ptrues(SubRegSize::i16Bit, PReg::p6, PredicatePattern::SVE_ALL), \"ptrues p6.h\");\n  TEST_SINGLE(ptrues(SubRegSize::i32Bit, PReg::p6, PredicatePattern::SVE_ALL), \"ptrues p6.s\");\n  TEST_SINGLE(ptrues(SubRegSize::i64Bit, PReg::p6, PredicatePattern::SVE_ALL), \"ptrues p6.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer compare scalar count and limit\") {\n  TEST_SINGLE(whilege(SubRegSize::i8Bit, PReg::p15, XReg::x30, XReg::x29), \"whilege p15.b, x30, x29\");\n  TEST_SINGLE(whilege(SubRegSize::i16Bit, PReg::p15, XReg::x30, XReg::x29), \"whilege p15.h, x30, x29\");\n  TEST_SINGLE(whilege(SubRegSize::i32Bit, PReg::p15, XReg::x30, XReg::x29), \"whilege p15.s, x30, x29\");\n  TEST_SINGLE(whilege(SubRegSize::i64Bit, PReg::p15, XReg::x30, XReg::x29), \"whilege p15.d, x30, x29\");\n  TEST_SINGLE(whilege(SubRegSize::i8Bit, PReg::p15, WReg::w30, WReg::w29), \"whilege p15.b, w30, w29\");\n  TEST_SINGLE(whilege(SubRegSize::i16Bit, PReg::p15, WReg::w30, WReg::w29), \"whilege p15.h, w30, w29\");\n  TEST_SINGLE(whilege(SubRegSize::i32Bit, PReg::p15, WReg::w30, WReg::w29), \"whilege p15.s, w30, w29\");\n  TEST_SINGLE(whilege(SubRegSize::i64Bit, PReg::p15, WReg::w30, WReg::w29), \"whilege p15.d, w30, w29\");\n\n  TEST_SINGLE(whilegt(SubRegSize::i8Bit, PReg::p15, XReg::x30, XReg::x29), \"whilegt p15.b, x30, x29\");\n  TEST_SINGLE(whilegt(SubRegSize::i16Bit, PReg::p15, XReg::x30, XReg::x29), \"whilegt p15.h, x30, x29\");\n  TEST_SINGLE(whilegt(SubRegSize::i32Bit, PReg::p15, XReg::x30, XReg::x29), \"whilegt p15.s, x30, x29\");\n  TEST_SINGLE(whilegt(SubRegSize::i64Bit, PReg::p15, XReg::x30, XReg::x29), \"whilegt p15.d, x30, x29\");\n  TEST_SINGLE(whilegt(SubRegSize::i8Bit, PReg::p15, WReg::w30, WReg::w29), \"whilegt p15.b, w30, w29\");\n  TEST_SINGLE(whilegt(SubRegSize::i16Bit, PReg::p15, WReg::w30, WReg::w29), \"whilegt p15.h, w30, w29\");\n  TEST_SINGLE(whilegt(SubRegSize::i32Bit, PReg::p15, WReg::w30, WReg::w29), \"whilegt p15.s, w30, w29\");\n  TEST_SINGLE(whilegt(SubRegSize::i64Bit, PReg::p15, WReg::w30, WReg::w29), \"whilegt p15.d, w30, w29\");\n\n  TEST_SINGLE(whilelt(SubRegSize::i8Bit, PReg::p15, XReg::x30, XReg::x29), \"whilelt p15.b, x30, x29\");\n  TEST_SINGLE(whilelt(SubRegSize::i16Bit, PReg::p15, XReg::x30, XReg::x29), \"whilelt p15.h, x30, x29\");\n  TEST_SINGLE(whilelt(SubRegSize::i32Bit, PReg::p15, XReg::x30, XReg::x29), \"whilelt p15.s, x30, x29\");\n  TEST_SINGLE(whilelt(SubRegSize::i64Bit, PReg::p15, XReg::x30, XReg::x29), \"whilelt p15.d, x30, x29\");\n  TEST_SINGLE(whilelt(SubRegSize::i8Bit, PReg::p15, WReg::w30, WReg::w29), \"whilelt p15.b, w30, w29\");\n  TEST_SINGLE(whilelt(SubRegSize::i16Bit, PReg::p15, WReg::w30, WReg::w29), \"whilelt p15.h, w30, w29\");\n  TEST_SINGLE(whilelt(SubRegSize::i32Bit, PReg::p15, WReg::w30, WReg::w29), \"whilelt p15.s, w30, w29\");\n  TEST_SINGLE(whilelt(SubRegSize::i64Bit, PReg::p15, WReg::w30, WReg::w29), \"whilelt p15.d, w30, w29\");\n\n  TEST_SINGLE(whilele(SubRegSize::i8Bit, PReg::p15, XReg::x30, XReg::x29), \"whilele p15.b, x30, x29\");\n  TEST_SINGLE(whilele(SubRegSize::i16Bit, PReg::p15, XReg::x30, XReg::x29), \"whilele p15.h, x30, x29\");\n  TEST_SINGLE(whilele(SubRegSize::i32Bit, PReg::p15, XReg::x30, XReg::x29), \"whilele p15.s, x30, x29\");\n  TEST_SINGLE(whilele(SubRegSize::i64Bit, PReg::p15, XReg::x30, XReg::x29), \"whilele p15.d, x30, x29\");\n  TEST_SINGLE(whilele(SubRegSize::i8Bit, PReg::p15, WReg::w30, WReg::w29), \"whilele p15.b, w30, w29\");\n  TEST_SINGLE(whilele(SubRegSize::i16Bit, PReg::p15, WReg::w30, WReg::w29), \"whilele p15.h, w30, w29\");\n  TEST_SINGLE(whilele(SubRegSize::i32Bit, PReg::p15, WReg::w30, WReg::w29), \"whilele p15.s, w30, w29\");\n  TEST_SINGLE(whilele(SubRegSize::i64Bit, PReg::p15, WReg::w30, WReg::w29), \"whilele p15.d, w30, w29\");\n\n  TEST_SINGLE(whilehs(SubRegSize::i8Bit, PReg::p15, XReg::x30, XReg::x29), \"whilehs p15.b, x30, x29\");\n  TEST_SINGLE(whilehs(SubRegSize::i16Bit, PReg::p15, XReg::x30, XReg::x29), \"whilehs p15.h, x30, x29\");\n  TEST_SINGLE(whilehs(SubRegSize::i32Bit, PReg::p15, XReg::x30, XReg::x29), \"whilehs p15.s, x30, x29\");\n  TEST_SINGLE(whilehs(SubRegSize::i64Bit, PReg::p15, XReg::x30, XReg::x29), \"whilehs p15.d, x30, x29\");\n  TEST_SINGLE(whilehs(SubRegSize::i8Bit, PReg::p15, WReg::w30, WReg::w29), \"whilehs p15.b, w30, w29\");\n  TEST_SINGLE(whilehs(SubRegSize::i16Bit, PReg::p15, WReg::w30, WReg::w29), \"whilehs p15.h, w30, w29\");\n  TEST_SINGLE(whilehs(SubRegSize::i32Bit, PReg::p15, WReg::w30, WReg::w29), \"whilehs p15.s, w30, w29\");\n  TEST_SINGLE(whilehs(SubRegSize::i64Bit, PReg::p15, WReg::w30, WReg::w29), \"whilehs p15.d, w30, w29\");\n\n  TEST_SINGLE(whilehi(SubRegSize::i8Bit, PReg::p15, XReg::x30, XReg::x29), \"whilehi p15.b, x30, x29\");\n  TEST_SINGLE(whilehi(SubRegSize::i16Bit, PReg::p15, XReg::x30, XReg::x29), \"whilehi p15.h, x30, x29\");\n  TEST_SINGLE(whilehi(SubRegSize::i32Bit, PReg::p15, XReg::x30, XReg::x29), \"whilehi p15.s, x30, x29\");\n  TEST_SINGLE(whilehi(SubRegSize::i64Bit, PReg::p15, XReg::x30, XReg::x29), \"whilehi p15.d, x30, x29\");\n  TEST_SINGLE(whilehi(SubRegSize::i8Bit, PReg::p15, WReg::w30, WReg::w29), \"whilehi p15.b, w30, w29\");\n  TEST_SINGLE(whilehi(SubRegSize::i16Bit, PReg::p15, WReg::w30, WReg::w29), \"whilehi p15.h, w30, w29\");\n  TEST_SINGLE(whilehi(SubRegSize::i32Bit, PReg::p15, WReg::w30, WReg::w29), \"whilehi p15.s, w30, w29\");\n  TEST_SINGLE(whilehi(SubRegSize::i64Bit, PReg::p15, WReg::w30, WReg::w29), \"whilehi p15.d, w30, w29\");\n\n  TEST_SINGLE(whilelo(SubRegSize::i8Bit, PReg::p15, XReg::x30, XReg::x29), \"whilelo p15.b, x30, x29\");\n  TEST_SINGLE(whilelo(SubRegSize::i16Bit, PReg::p15, XReg::x30, XReg::x29), \"whilelo p15.h, x30, x29\");\n  TEST_SINGLE(whilelo(SubRegSize::i32Bit, PReg::p15, XReg::x30, XReg::x29), \"whilelo p15.s, x30, x29\");\n  TEST_SINGLE(whilelo(SubRegSize::i64Bit, PReg::p15, XReg::x30, XReg::x29), \"whilelo p15.d, x30, x29\");\n  TEST_SINGLE(whilelo(SubRegSize::i8Bit, PReg::p15, WReg::w30, WReg::w29), \"whilelo p15.b, w30, w29\");\n  TEST_SINGLE(whilelo(SubRegSize::i16Bit, PReg::p15, WReg::w30, WReg::w29), \"whilelo p15.h, w30, w29\");\n  TEST_SINGLE(whilelo(SubRegSize::i32Bit, PReg::p15, WReg::w30, WReg::w29), \"whilelo p15.s, w30, w29\");\n  TEST_SINGLE(whilelo(SubRegSize::i64Bit, PReg::p15, WReg::w30, WReg::w29), \"whilelo p15.d, w30, w29\");\n\n  TEST_SINGLE(whilels(SubRegSize::i8Bit, PReg::p15, XReg::x30, XReg::x29), \"whilels p15.b, x30, x29\");\n  TEST_SINGLE(whilels(SubRegSize::i16Bit, PReg::p15, XReg::x30, XReg::x29), \"whilels p15.h, x30, x29\");\n  TEST_SINGLE(whilels(SubRegSize::i32Bit, PReg::p15, XReg::x30, XReg::x29), \"whilels p15.s, x30, x29\");\n  TEST_SINGLE(whilels(SubRegSize::i64Bit, PReg::p15, XReg::x30, XReg::x29), \"whilels p15.d, x30, x29\");\n  TEST_SINGLE(whilels(SubRegSize::i8Bit, PReg::p15, WReg::w30, WReg::w29), \"whilels p15.b, w30, w29\");\n  TEST_SINGLE(whilels(SubRegSize::i16Bit, PReg::p15, WReg::w30, WReg::w29), \"whilels p15.h, w30, w29\");\n  TEST_SINGLE(whilels(SubRegSize::i32Bit, PReg::p15, WReg::w30, WReg::w29), \"whilels p15.s, w30, w29\");\n  TEST_SINGLE(whilels(SubRegSize::i64Bit, PReg::p15, WReg::w30, WReg::w29), \"whilels p15.d, w30, w29\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE conditionally terminate scalars\") {\n  TEST_SINGLE(ctermeq(XReg::x30, XReg::x29), \"ctermeq x30, x29\");\n  TEST_SINGLE(ctermeq(WReg::w30, WReg::w29), \"ctermeq w30, w29\");\n\n  TEST_SINGLE(ctermne(XReg::x30, XReg::x29), \"ctermne x30, x29\");\n  TEST_SINGLE(ctermne(WReg::w30, WReg::w29), \"ctermne w30, w29\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE pointer conflict compare\") {\n  TEST_SINGLE(whilewr(SubRegSize::i8Bit, PReg::p15, XReg::x30, XReg::x29), \"whilewr p15.b, x30, x29\");\n  TEST_SINGLE(whilewr(SubRegSize::i16Bit, PReg::p15, XReg::x30, XReg::x29), \"whilewr p15.h, x30, x29\");\n  TEST_SINGLE(whilewr(SubRegSize::i32Bit, PReg::p15, XReg::x30, XReg::x29), \"whilewr p15.s, x30, x29\");\n  TEST_SINGLE(whilewr(SubRegSize::i64Bit, PReg::p15, XReg::x30, XReg::x29), \"whilewr p15.d, x30, x29\");\n\n  TEST_SINGLE(whilerw(SubRegSize::i8Bit, PReg::p15, XReg::x30, XReg::x29), \"whilerw p15.b, x30, x29\");\n  TEST_SINGLE(whilerw(SubRegSize::i16Bit, PReg::p15, XReg::x30, XReg::x29), \"whilerw p15.h, x30, x29\");\n  TEST_SINGLE(whilerw(SubRegSize::i32Bit, PReg::p15, XReg::x30, XReg::x29), \"whilerw p15.s, x30, x29\");\n  TEST_SINGLE(whilerw(SubRegSize::i64Bit, PReg::p15, XReg::x30, XReg::x29), \"whilerw p15.d, x30, x29\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer add/subtract immediate (unpredicated)\") {\n  TEST_SINGLE(add(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 0), \"add z30.b, z30.b, #0\");\n  TEST_SINGLE(add(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 127), \"add z30.b, z30.b, #127\");\n  TEST_SINGLE(add(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 255), \"add z30.b, z30.b, #255\");\n\n  TEST_SINGLE(add(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 0), \"add z30.h, z30.h, #0\");\n  TEST_SINGLE(add(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 127), \"add z30.h, z30.h, #127\");\n  TEST_SINGLE(add(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 255), \"add z30.h, z30.h, #255\");\n  TEST_SINGLE(add(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 256), \"add z30.h, z30.h, #1, lsl #8\");\n  TEST_SINGLE(add(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 32512), \"add z30.h, z30.h, #127, lsl #8\");\n  TEST_SINGLE(add(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 65280), \"add z30.h, z30.h, #255, lsl #8\");\n\n  TEST_SINGLE(add(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 0), \"add z30.s, z30.s, #0\");\n  TEST_SINGLE(add(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 127), \"add z30.s, z30.s, #127\");\n  TEST_SINGLE(add(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 255), \"add z30.s, z30.s, #255\");\n  TEST_SINGLE(add(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 256), \"add z30.s, z30.s, #1, lsl #8\");\n  TEST_SINGLE(add(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 32512), \"add z30.s, z30.s, #127, lsl #8\");\n  TEST_SINGLE(add(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 65280), \"add z30.s, z30.s, #255, lsl #8\");\n\n  TEST_SINGLE(add(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 0), \"add z30.d, z30.d, #0\");\n  TEST_SINGLE(add(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 127), \"add z30.d, z30.d, #127\");\n  TEST_SINGLE(add(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 255), \"add z30.d, z30.d, #255\");\n  TEST_SINGLE(add(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 256), \"add z30.d, z30.d, #1, lsl #8\");\n  TEST_SINGLE(add(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 32512), \"add z30.d, z30.d, #127, lsl #8\");\n  TEST_SINGLE(add(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 65280), \"add z30.d, z30.d, #255, lsl #8\");\n\n  TEST_SINGLE(sub(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 0), \"sub z30.b, z30.b, #0\");\n  TEST_SINGLE(sub(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 127), \"sub z30.b, z30.b, #127\");\n  TEST_SINGLE(sub(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 255), \"sub z30.b, z30.b, #255\");\n\n  TEST_SINGLE(sub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 0), \"sub z30.h, z30.h, #0\");\n  TEST_SINGLE(sub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 127), \"sub z30.h, z30.h, #127\");\n  TEST_SINGLE(sub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 255), \"sub z30.h, z30.h, #255\");\n  TEST_SINGLE(sub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 256), \"sub z30.h, z30.h, #1, lsl #8\");\n  TEST_SINGLE(sub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 32512), \"sub z30.h, z30.h, #127, lsl #8\");\n  TEST_SINGLE(sub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 65280), \"sub z30.h, z30.h, #255, lsl #8\");\n\n  TEST_SINGLE(sub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 0), \"sub z30.s, z30.s, #0\");\n  TEST_SINGLE(sub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 127), \"sub z30.s, z30.s, #127\");\n  TEST_SINGLE(sub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 255), \"sub z30.s, z30.s, #255\");\n  TEST_SINGLE(sub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 256), \"sub z30.s, z30.s, #1, lsl #8\");\n  TEST_SINGLE(sub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 32512), \"sub z30.s, z30.s, #127, lsl #8\");\n  TEST_SINGLE(sub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 65280), \"sub z30.s, z30.s, #255, lsl #8\");\n\n  TEST_SINGLE(sub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 0), \"sub z30.d, z30.d, #0\");\n  TEST_SINGLE(sub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 127), \"sub z30.d, z30.d, #127\");\n  TEST_SINGLE(sub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 255), \"sub z30.d, z30.d, #255\");\n  TEST_SINGLE(sub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 256), \"sub z30.d, z30.d, #1, lsl #8\");\n  TEST_SINGLE(sub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 32512), \"sub z30.d, z30.d, #127, lsl #8\");\n  TEST_SINGLE(sub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 65280), \"sub z30.d, z30.d, #255, lsl #8\");\n\n  TEST_SINGLE(subr(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 0), \"subr z30.b, z30.b, #0\");\n  TEST_SINGLE(subr(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 127), \"subr z30.b, z30.b, #127\");\n  TEST_SINGLE(subr(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 255), \"subr z30.b, z30.b, #255\");\n\n  TEST_SINGLE(subr(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 0), \"subr z30.h, z30.h, #0\");\n  TEST_SINGLE(subr(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 127), \"subr z30.h, z30.h, #127\");\n  TEST_SINGLE(subr(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 255), \"subr z30.h, z30.h, #255\");\n  TEST_SINGLE(subr(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 256), \"subr z30.h, z30.h, #1, lsl #8\");\n  TEST_SINGLE(subr(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 32512), \"subr z30.h, z30.h, #127, lsl #8\");\n  TEST_SINGLE(subr(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 65280), \"subr z30.h, z30.h, #255, lsl #8\");\n\n  TEST_SINGLE(subr(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 0), \"subr z30.s, z30.s, #0\");\n  TEST_SINGLE(subr(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 127), \"subr z30.s, z30.s, #127\");\n  TEST_SINGLE(subr(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 255), \"subr z30.s, z30.s, #255\");\n  TEST_SINGLE(subr(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 256), \"subr z30.s, z30.s, #1, lsl #8\");\n  TEST_SINGLE(subr(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 32512), \"subr z30.s, z30.s, #127, lsl #8\");\n  TEST_SINGLE(subr(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 65280), \"subr z30.s, z30.s, #255, lsl #8\");\n\n  TEST_SINGLE(subr(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 0), \"subr z30.d, z30.d, #0\");\n  TEST_SINGLE(subr(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 127), \"subr z30.d, z30.d, #127\");\n  TEST_SINGLE(subr(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 255), \"subr z30.d, z30.d, #255\");\n  TEST_SINGLE(subr(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 256), \"subr z30.d, z30.d, #1, lsl #8\");\n  TEST_SINGLE(subr(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 32512), \"subr z30.d, z30.d, #127, lsl #8\");\n  TEST_SINGLE(subr(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 65280), \"subr z30.d, z30.d, #255, lsl #8\");\n\n  TEST_SINGLE(sqadd(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 0), \"sqadd z30.b, z30.b, #0\");\n  TEST_SINGLE(sqadd(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 127), \"sqadd z30.b, z30.b, #127\");\n  TEST_SINGLE(sqadd(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 255), \"sqadd z30.b, z30.b, #255\");\n\n  TEST_SINGLE(sqadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 0), \"sqadd z30.h, z30.h, #0\");\n  TEST_SINGLE(sqadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 127), \"sqadd z30.h, z30.h, #127\");\n  TEST_SINGLE(sqadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 255), \"sqadd z30.h, z30.h, #255\");\n  TEST_SINGLE(sqadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 256), \"sqadd z30.h, z30.h, #1, lsl #8\");\n  TEST_SINGLE(sqadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 32512), \"sqadd z30.h, z30.h, #127, lsl #8\");\n  TEST_SINGLE(sqadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 65280), \"sqadd z30.h, z30.h, #255, lsl #8\");\n\n  TEST_SINGLE(sqadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 0), \"sqadd z30.s, z30.s, #0\");\n  TEST_SINGLE(sqadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 127), \"sqadd z30.s, z30.s, #127\");\n  TEST_SINGLE(sqadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 255), \"sqadd z30.s, z30.s, #255\");\n  TEST_SINGLE(sqadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 256), \"sqadd z30.s, z30.s, #1, lsl #8\");\n  TEST_SINGLE(sqadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 32512), \"sqadd z30.s, z30.s, #127, lsl #8\");\n  TEST_SINGLE(sqadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 65280), \"sqadd z30.s, z30.s, #255, lsl #8\");\n\n  TEST_SINGLE(sqadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 0), \"sqadd z30.d, z30.d, #0\");\n  TEST_SINGLE(sqadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 127), \"sqadd z30.d, z30.d, #127\");\n  TEST_SINGLE(sqadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 255), \"sqadd z30.d, z30.d, #255\");\n  TEST_SINGLE(sqadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 256), \"sqadd z30.d, z30.d, #1, lsl #8\");\n  TEST_SINGLE(sqadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 32512), \"sqadd z30.d, z30.d, #127, lsl #8\");\n  TEST_SINGLE(sqadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 65280), \"sqadd z30.d, z30.d, #255, lsl #8\");\n\n  TEST_SINGLE(uqadd(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 0), \"uqadd z30.b, z30.b, #0\");\n  TEST_SINGLE(uqadd(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 127), \"uqadd z30.b, z30.b, #127\");\n  TEST_SINGLE(uqadd(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 255), \"uqadd z30.b, z30.b, #255\");\n\n  TEST_SINGLE(uqadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 0), \"uqadd z30.h, z30.h, #0\");\n  TEST_SINGLE(uqadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 127), \"uqadd z30.h, z30.h, #127\");\n  TEST_SINGLE(uqadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 255), \"uqadd z30.h, z30.h, #255\");\n  TEST_SINGLE(uqadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 256), \"uqadd z30.h, z30.h, #1, lsl #8\");\n  TEST_SINGLE(uqadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 32512), \"uqadd z30.h, z30.h, #127, lsl #8\");\n  TEST_SINGLE(uqadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 65280), \"uqadd z30.h, z30.h, #255, lsl #8\");\n\n  TEST_SINGLE(uqadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 0), \"uqadd z30.s, z30.s, #0\");\n  TEST_SINGLE(uqadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 127), \"uqadd z30.s, z30.s, #127\");\n  TEST_SINGLE(uqadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 255), \"uqadd z30.s, z30.s, #255\");\n  TEST_SINGLE(uqadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 256), \"uqadd z30.s, z30.s, #1, lsl #8\");\n  TEST_SINGLE(uqadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 32512), \"uqadd z30.s, z30.s, #127, lsl #8\");\n  TEST_SINGLE(uqadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 65280), \"uqadd z30.s, z30.s, #255, lsl #8\");\n\n  TEST_SINGLE(uqadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 0), \"uqadd z30.d, z30.d, #0\");\n  TEST_SINGLE(uqadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 127), \"uqadd z30.d, z30.d, #127\");\n  TEST_SINGLE(uqadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 255), \"uqadd z30.d, z30.d, #255\");\n  TEST_SINGLE(uqadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 256), \"uqadd z30.d, z30.d, #1, lsl #8\");\n  TEST_SINGLE(uqadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 32512), \"uqadd z30.d, z30.d, #127, lsl #8\");\n  TEST_SINGLE(uqadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 65280), \"uqadd z30.d, z30.d, #255, lsl #8\");\n\n  TEST_SINGLE(sqsub(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 0), \"sqsub z30.b, z30.b, #0\");\n  TEST_SINGLE(sqsub(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 127), \"sqsub z30.b, z30.b, #127\");\n  TEST_SINGLE(sqsub(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 255), \"sqsub z30.b, z30.b, #255\");\n\n  TEST_SINGLE(sqsub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 0), \"sqsub z30.h, z30.h, #0\");\n  TEST_SINGLE(sqsub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 127), \"sqsub z30.h, z30.h, #127\");\n  TEST_SINGLE(sqsub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 255), \"sqsub z30.h, z30.h, #255\");\n  TEST_SINGLE(sqsub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 256), \"sqsub z30.h, z30.h, #1, lsl #8\");\n  TEST_SINGLE(sqsub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 32512), \"sqsub z30.h, z30.h, #127, lsl #8\");\n  TEST_SINGLE(sqsub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 65280), \"sqsub z30.h, z30.h, #255, lsl #8\");\n\n  TEST_SINGLE(sqsub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 0), \"sqsub z30.s, z30.s, #0\");\n  TEST_SINGLE(sqsub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 127), \"sqsub z30.s, z30.s, #127\");\n  TEST_SINGLE(sqsub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 255), \"sqsub z30.s, z30.s, #255\");\n  TEST_SINGLE(sqsub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 256), \"sqsub z30.s, z30.s, #1, lsl #8\");\n  TEST_SINGLE(sqsub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 32512), \"sqsub z30.s, z30.s, #127, lsl #8\");\n  TEST_SINGLE(sqsub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 65280), \"sqsub z30.s, z30.s, #255, lsl #8\");\n\n  TEST_SINGLE(sqsub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 0), \"sqsub z30.d, z30.d, #0\");\n  TEST_SINGLE(sqsub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 127), \"sqsub z30.d, z30.d, #127\");\n  TEST_SINGLE(sqsub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 255), \"sqsub z30.d, z30.d, #255\");\n  TEST_SINGLE(sqsub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 256), \"sqsub z30.d, z30.d, #1, lsl #8\");\n  TEST_SINGLE(sqsub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 32512), \"sqsub z30.d, z30.d, #127, lsl #8\");\n  TEST_SINGLE(sqsub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 65280), \"sqsub z30.d, z30.d, #255, lsl #8\");\n\n  TEST_SINGLE(uqsub(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 0), \"uqsub z30.b, z30.b, #0\");\n  TEST_SINGLE(uqsub(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 127), \"uqsub z30.b, z30.b, #127\");\n  TEST_SINGLE(uqsub(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 255), \"uqsub z30.b, z30.b, #255\");\n\n  TEST_SINGLE(uqsub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 0), \"uqsub z30.h, z30.h, #0\");\n  TEST_SINGLE(uqsub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 127), \"uqsub z30.h, z30.h, #127\");\n  TEST_SINGLE(uqsub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 255), \"uqsub z30.h, z30.h, #255\");\n  TEST_SINGLE(uqsub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 256), \"uqsub z30.h, z30.h, #1, lsl #8\");\n  TEST_SINGLE(uqsub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 32512), \"uqsub z30.h, z30.h, #127, lsl #8\");\n  TEST_SINGLE(uqsub(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 65280), \"uqsub z30.h, z30.h, #255, lsl #8\");\n\n  TEST_SINGLE(uqsub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 0), \"uqsub z30.s, z30.s, #0\");\n  TEST_SINGLE(uqsub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 127), \"uqsub z30.s, z30.s, #127\");\n  TEST_SINGLE(uqsub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 255), \"uqsub z30.s, z30.s, #255\");\n  TEST_SINGLE(uqsub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 256), \"uqsub z30.s, z30.s, #1, lsl #8\");\n  TEST_SINGLE(uqsub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 32512), \"uqsub z30.s, z30.s, #127, lsl #8\");\n  TEST_SINGLE(uqsub(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 65280), \"uqsub z30.s, z30.s, #255, lsl #8\");\n\n  TEST_SINGLE(uqsub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 0), \"uqsub z30.d, z30.d, #0\");\n  TEST_SINGLE(uqsub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 127), \"uqsub z30.d, z30.d, #127\");\n  TEST_SINGLE(uqsub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 255), \"uqsub z30.d, z30.d, #255\");\n  TEST_SINGLE(uqsub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 256), \"uqsub z30.d, z30.d, #1, lsl #8\");\n  TEST_SINGLE(uqsub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 32512), \"uqsub z30.d, z30.d, #127, lsl #8\");\n  TEST_SINGLE(uqsub(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 65280), \"uqsub z30.d, z30.d, #255, lsl #8\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer min/max immediate (unpredicated)\") {\n  TEST_SINGLE(smax(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 0), \"smax z30.b, z30.b, #0\");\n  TEST_SINGLE(smax(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, -128), \"smax z30.b, z30.b, #-128\");\n  TEST_SINGLE(smax(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 127), \"smax z30.b, z30.b, #127\");\n\n  TEST_SINGLE(smax(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 0), \"smax z30.h, z30.h, #0\");\n  TEST_SINGLE(smax(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, -128), \"smax z30.h, z30.h, #-128\");\n  TEST_SINGLE(smax(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 127), \"smax z30.h, z30.h, #127\");\n\n  TEST_SINGLE(smax(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 0), \"smax z30.s, z30.s, #0\");\n  TEST_SINGLE(smax(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, -128), \"smax z30.s, z30.s, #-128\");\n  TEST_SINGLE(smax(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 127), \"smax z30.s, z30.s, #127\");\n\n  TEST_SINGLE(smax(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 0), \"smax z30.d, z30.d, #0\");\n  TEST_SINGLE(smax(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, -128), \"smax z30.d, z30.d, #-128\");\n  TEST_SINGLE(smax(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 127), \"smax z30.d, z30.d, #127\");\n\n  TEST_SINGLE(smin(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 0), \"smin z30.b, z30.b, #0\");\n  TEST_SINGLE(smin(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, -128), \"smin z30.b, z30.b, #-128\");\n  TEST_SINGLE(smin(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 127), \"smin z30.b, z30.b, #127\");\n\n  TEST_SINGLE(smin(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 0), \"smin z30.h, z30.h, #0\");\n  TEST_SINGLE(smin(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, -128), \"smin z30.h, z30.h, #-128\");\n  TEST_SINGLE(smin(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 127), \"smin z30.h, z30.h, #127\");\n\n  TEST_SINGLE(smin(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 0), \"smin z30.s, z30.s, #0\");\n  TEST_SINGLE(smin(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, -128), \"smin z30.s, z30.s, #-128\");\n  TEST_SINGLE(smin(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 127), \"smin z30.s, z30.s, #127\");\n\n  TEST_SINGLE(smin(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 0), \"smin z30.d, z30.d, #0\");\n  TEST_SINGLE(smin(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, -128), \"smin z30.d, z30.d, #-128\");\n  TEST_SINGLE(smin(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 127), \"smin z30.d, z30.d, #127\");\n\n  TEST_SINGLE(umax(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 0), \"umax z30.b, z30.b, #0\");\n  TEST_SINGLE(umax(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 127), \"umax z30.b, z30.b, #127\");\n  TEST_SINGLE(umax(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 255), \"umax z30.b, z30.b, #255\");\n\n  TEST_SINGLE(umax(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 0), \"umax z30.h, z30.h, #0\");\n  TEST_SINGLE(umax(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 127), \"umax z30.h, z30.h, #127\");\n  TEST_SINGLE(umax(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 255), \"umax z30.h, z30.h, #255\");\n\n  TEST_SINGLE(umax(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 0), \"umax z30.s, z30.s, #0\");\n  TEST_SINGLE(umax(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 127), \"umax z30.s, z30.s, #127\");\n  TEST_SINGLE(umax(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 255), \"umax z30.s, z30.s, #255\");\n\n  TEST_SINGLE(umax(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 0), \"umax z30.d, z30.d, #0\");\n  TEST_SINGLE(umax(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 127), \"umax z30.d, z30.d, #127\");\n  TEST_SINGLE(umax(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 255), \"umax z30.d, z30.d, #255\");\n\n  TEST_SINGLE(umin(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 0), \"umin z30.b, z30.b, #0\");\n  TEST_SINGLE(umin(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 127), \"umin z30.b, z30.b, #127\");\n  TEST_SINGLE(umin(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 255), \"umin z30.b, z30.b, #255\");\n\n  TEST_SINGLE(umin(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 0), \"umin z30.h, z30.h, #0\");\n  TEST_SINGLE(umin(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 127), \"umin z30.h, z30.h, #127\");\n  TEST_SINGLE(umin(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 255), \"umin z30.h, z30.h, #255\");\n\n  TEST_SINGLE(umin(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 0), \"umin z30.s, z30.s, #0\");\n  TEST_SINGLE(umin(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 127), \"umin z30.s, z30.s, #127\");\n  TEST_SINGLE(umin(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 255), \"umin z30.s, z30.s, #255\");\n\n  TEST_SINGLE(umin(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 0), \"umin z30.d, z30.d, #0\");\n  TEST_SINGLE(umin(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 127), \"umin z30.d, z30.d, #127\");\n  TEST_SINGLE(umin(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 255), \"umin z30.d, z30.d, #255\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer multiply immediate (unpredicated)\") {\n  TEST_SINGLE(mul(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 0), \"mul z30.b, z30.b, #0\");\n  TEST_SINGLE(mul(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, -128), \"mul z30.b, z30.b, #-128\");\n  TEST_SINGLE(mul(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, 127), \"mul z30.b, z30.b, #127\");\n\n  TEST_SINGLE(mul(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 0), \"mul z30.h, z30.h, #0\");\n  TEST_SINGLE(mul(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, -128), \"mul z30.h, z30.h, #-128\");\n  TEST_SINGLE(mul(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, 127), \"mul z30.h, z30.h, #127\");\n\n  TEST_SINGLE(mul(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 0), \"mul z30.s, z30.s, #0\");\n  TEST_SINGLE(mul(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, -128), \"mul z30.s, z30.s, #-128\");\n  TEST_SINGLE(mul(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, 127), \"mul z30.s, z30.s, #127\");\n\n  TEST_SINGLE(mul(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 0), \"mul z30.d, z30.d, #0\");\n  TEST_SINGLE(mul(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, -128), \"mul z30.d, z30.d, #-128\");\n  TEST_SINGLE(mul(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, 127), \"mul z30.d, z30.d, #127\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE broadcast integer immediate (unpredicated)\") {\n  TEST_SINGLE(dup_imm(SubRegSize::i8Bit, ZReg::z30, -128), \"mov z30.b, #-128\");\n  TEST_SINGLE(dup_imm(SubRegSize::i16Bit, ZReg::z30, -128), \"mov z30.h, #-128\");\n  TEST_SINGLE(dup_imm(SubRegSize::i32Bit, ZReg::z30, -128), \"mov z30.s, #-128\");\n  TEST_SINGLE(dup_imm(SubRegSize::i64Bit, ZReg::z30, -128), \"mov z30.d, #-128\");\n\n  TEST_SINGLE(dup_imm(SubRegSize::i8Bit, ZReg::z30, 127), \"mov z30.b, #127\");\n  TEST_SINGLE(dup_imm(SubRegSize::i16Bit, ZReg::z30, 127), \"mov z30.h, #127\");\n  TEST_SINGLE(dup_imm(SubRegSize::i32Bit, ZReg::z30, 127), \"mov z30.s, #127\");\n  TEST_SINGLE(dup_imm(SubRegSize::i64Bit, ZReg::z30, 127), \"mov z30.d, #127\");\n\n  // TEST_SINGLE(dup_imm(SubRegSize::i8Bit, ZReg::z30, -32768), \"mov z30.b, #-128\");\n  TEST_SINGLE(dup_imm(SubRegSize::i16Bit, ZReg::z30, -32768), \"mov z30.h, #-128, lsl #8\");\n  TEST_SINGLE(dup_imm(SubRegSize::i32Bit, ZReg::z30, -32768), \"mov z30.s, #-128, lsl #8\");\n  TEST_SINGLE(dup_imm(SubRegSize::i64Bit, ZReg::z30, -32768), \"mov z30.d, #-128, lsl #8\");\n\n  // TEST_SINGLE(dup_imm(SubRegSize::i8Bit, ZReg::z30, 32512), \"mov z30.b, #127\");\n  TEST_SINGLE(dup_imm(SubRegSize::i16Bit, ZReg::z30, 32512), \"mov z30.h, #127, lsl #8\");\n  TEST_SINGLE(dup_imm(SubRegSize::i32Bit, ZReg::z30, 32512), \"mov z30.s, #127, lsl #8\");\n  TEST_SINGLE(dup_imm(SubRegSize::i64Bit, ZReg::z30, 32512), \"mov z30.d, #127, lsl #8\");\n\n  TEST_SINGLE(mov_imm(SubRegSize::i8Bit, ZReg::z30, -128), \"mov z30.b, #-128\");\n  TEST_SINGLE(mov_imm(SubRegSize::i16Bit, ZReg::z30, -128), \"mov z30.h, #-128\");\n  TEST_SINGLE(mov_imm(SubRegSize::i32Bit, ZReg::z30, -128), \"mov z30.s, #-128\");\n  TEST_SINGLE(mov_imm(SubRegSize::i64Bit, ZReg::z30, -128), \"mov z30.d, #-128\");\n\n  TEST_SINGLE(mov_imm(SubRegSize::i8Bit, ZReg::z30, 127), \"mov z30.b, #127\");\n  TEST_SINGLE(mov_imm(SubRegSize::i16Bit, ZReg::z30, 127), \"mov z30.h, #127\");\n  TEST_SINGLE(mov_imm(SubRegSize::i32Bit, ZReg::z30, 127), \"mov z30.s, #127\");\n  TEST_SINGLE(mov_imm(SubRegSize::i64Bit, ZReg::z30, 127), \"mov z30.d, #127\");\n}\n\n#if TEST_FP16\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE broadcast floating-point immediate (predicated) : fp16\") {\n  TEST_SINGLE(fcpy(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), -0.125), \"fmov z30.h, p6/m, #0xc0 (-0.1250)\");\n  TEST_SINGLE(fcpy(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), 0.5), \"fmov z30.h, p6/m, #0x60 (0.5000)\");\n  TEST_SINGLE(fcpy(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), 1.0), \"fmov z30.h, p6/m, #0x70 (1.0000)\");\n  TEST_SINGLE(fcpy(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), 31.0), \"fmov z30.h, p6/m, #0x3f (31.0000)\");\n  TEST_SINGLE(fmov(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), -0.125), \"fmov z30.h, p6/m, #0xc0 (-0.1250)\");\n  TEST_SINGLE(fmov(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), 0.5), \"fmov z30.h, p6/m, #0x60 (0.5000)\");\n  TEST_SINGLE(fmov(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), 1.0), \"fmov z30.h, p6/m, #0x70 (1.0000)\");\n  TEST_SINGLE(fmov(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), 31.0), \"fmov z30.h, p6/m, #0x3f (31.0000)\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE broadcast floating-point immediate (unpredicated)\") {\n  TEST_SINGLE(fdup(SubRegSize::i16Bit, ZReg::z30, -0.125), \"fmov z30.h, #0xc0 (-0.1250)\");\n  TEST_SINGLE(fdup(SubRegSize::i16Bit, ZReg::z30, 0.5), \"fmov z30.h, #0x60 (0.5000)\");\n  TEST_SINGLE(fdup(SubRegSize::i16Bit, ZReg::z30, 1.0), \"fmov z30.h, #0x70 (1.0000)\");\n  TEST_SINGLE(fdup(SubRegSize::i16Bit, ZReg::z30, 31.0), \"fmov z30.h, #0x3f (31.0000)\");\n  TEST_SINGLE(fmov(SubRegSize::i16Bit, ZReg::z30, -0.125), \"fmov z30.h, #0xc0 (-0.1250)\");\n  TEST_SINGLE(fmov(SubRegSize::i16Bit, ZReg::z30, 0.5), \"fmov z30.h, #0x60 (0.5000)\");\n  TEST_SINGLE(fmov(SubRegSize::i16Bit, ZReg::z30, 1.0), \"fmov z30.h, #0x70 (1.0000)\");\n  TEST_SINGLE(fmov(SubRegSize::i16Bit, ZReg::z30, 31.0), \"fmov z30.h, #0x3f (31.0000)\");\n}\n#endif\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE broadcast floating-point immediate (predicated)\") {\n  TEST_SINGLE(fcpy(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), -0.125), \"fmov z30.s, p6/m, #0xc0 (-0.1250)\");\n  TEST_SINGLE(fcpy(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), -0.125), \"fmov z30.d, p6/m, #0xc0 (-0.1250)\");\n\n  TEST_SINGLE(fcpy(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), 0.5), \"fmov z30.s, p6/m, #0x60 (0.5000)\");\n  TEST_SINGLE(fcpy(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), 0.5), \"fmov z30.d, p6/m, #0x60 (0.5000)\");\n\n  TEST_SINGLE(fcpy(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), 1.0), \"fmov z30.s, p6/m, #0x70 (1.0000)\");\n  TEST_SINGLE(fcpy(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), 1.0), \"fmov z30.d, p6/m, #0x70 (1.0000)\");\n\n  TEST_SINGLE(fcpy(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), 31.0), \"fmov z30.s, p6/m, #0x3f (31.0000)\");\n  TEST_SINGLE(fcpy(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), 31.0), \"fmov z30.d, p6/m, #0x3f (31.0000)\");\n\n  TEST_SINGLE(fmov(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), -0.125), \"fmov z30.s, p6/m, #0xc0 (-0.1250)\");\n  TEST_SINGLE(fmov(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), -0.125), \"fmov z30.d, p6/m, #0xc0 (-0.1250)\");\n\n  TEST_SINGLE(fmov(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), 0.5), \"fmov z30.s, p6/m, #0x60 (0.5000)\");\n  TEST_SINGLE(fmov(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), 0.5), \"fmov z30.d, p6/m, #0x60 (0.5000)\");\n\n  TEST_SINGLE(fmov(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), 1.0), \"fmov z30.s, p6/m, #0x70 (1.0000)\");\n  TEST_SINGLE(fmov(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), 1.0), \"fmov z30.d, p6/m, #0x70 (1.0000)\");\n\n  TEST_SINGLE(fmov(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), 31.0), \"fmov z30.s, p6/m, #0x3f (31.0000)\");\n  TEST_SINGLE(fmov(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), 31.0), \"fmov z30.d, p6/m, #0x3f (31.0000)\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE broadcast floating-point immediate (unpredicated)\") {\n  TEST_SINGLE(fdup(SubRegSize::i32Bit, ZReg::z30, -0.125), \"fmov z30.s, #0xc0 (-0.1250)\");\n  TEST_SINGLE(fdup(SubRegSize::i64Bit, ZReg::z30, -0.125), \"fmov z30.d, #0xc0 (-0.1250)\");\n\n  TEST_SINGLE(fdup(SubRegSize::i32Bit, ZReg::z30, 0.5), \"fmov z30.s, #0x60 (0.5000)\");\n  TEST_SINGLE(fdup(SubRegSize::i64Bit, ZReg::z30, 0.5), \"fmov z30.d, #0x60 (0.5000)\");\n\n  TEST_SINGLE(fdup(SubRegSize::i32Bit, ZReg::z30, 1.0), \"fmov z30.s, #0x70 (1.0000)\");\n  TEST_SINGLE(fdup(SubRegSize::i64Bit, ZReg::z30, 1.0), \"fmov z30.d, #0x70 (1.0000)\");\n\n  TEST_SINGLE(fdup(SubRegSize::i32Bit, ZReg::z30, 31.0), \"fmov z30.s, #0x3f (31.0000)\");\n  TEST_SINGLE(fdup(SubRegSize::i64Bit, ZReg::z30, 31.0), \"fmov z30.d, #0x3f (31.0000)\");\n\n  TEST_SINGLE(fmov(SubRegSize::i32Bit, ZReg::z30, -0.125), \"fmov z30.s, #0xc0 (-0.1250)\");\n  TEST_SINGLE(fmov(SubRegSize::i64Bit, ZReg::z30, -0.125), \"fmov z30.d, #0xc0 (-0.1250)\");\n\n  TEST_SINGLE(fmov(SubRegSize::i32Bit, ZReg::z30, 0.5), \"fmov z30.s, #0x60 (0.5000)\");\n  TEST_SINGLE(fmov(SubRegSize::i64Bit, ZReg::z30, 0.5), \"fmov z30.d, #0x60 (0.5000)\");\n\n  TEST_SINGLE(fmov(SubRegSize::i32Bit, ZReg::z30, 1.0), \"fmov z30.s, #0x70 (1.0000)\");\n  TEST_SINGLE(fmov(SubRegSize::i64Bit, ZReg::z30, 1.0), \"fmov z30.d, #0x70 (1.0000)\");\n\n  TEST_SINGLE(fmov(SubRegSize::i32Bit, ZReg::z30, 31.0), \"fmov z30.s, #0x3f (31.0000)\");\n  TEST_SINGLE(fmov(SubRegSize::i64Bit, ZReg::z30, 31.0), \"fmov z30.d, #0x3f (31.0000)\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE predicate count\") {\n  TEST_SINGLE(cntp(SubRegSize::i8Bit, XReg::x30, PReg::p15, PReg::p7), \"cntp x30, p15, p7.b\");\n  TEST_SINGLE(cntp(SubRegSize::i16Bit, XReg::x30, PReg::p15, PReg::p7), \"cntp x30, p15, p7.h\");\n  TEST_SINGLE(cntp(SubRegSize::i32Bit, XReg::x30, PReg::p15, PReg::p7), \"cntp x30, p15, p7.s\");\n  TEST_SINGLE(cntp(SubRegSize::i64Bit, XReg::x30, PReg::p15, PReg::p7), \"cntp x30, p15, p7.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE saturating inc/dec vector by predicate count\") {\n  TEST_SINGLE(sqincp(SubRegSize::i16Bit, ZReg::z30, PReg::p15), \"sqincp z30.h, p15\");\n  TEST_SINGLE(sqincp(SubRegSize::i32Bit, ZReg::z30, PReg::p15), \"sqincp z30.s, p15\");\n  TEST_SINGLE(sqincp(SubRegSize::i64Bit, ZReg::z30, PReg::p15), \"sqincp z30.d, p15\");\n\n  TEST_SINGLE(uqincp(SubRegSize::i16Bit, ZReg::z30, PReg::p15), \"uqincp z30.h, p15\");\n  TEST_SINGLE(uqincp(SubRegSize::i32Bit, ZReg::z30, PReg::p15), \"uqincp z30.s, p15\");\n  TEST_SINGLE(uqincp(SubRegSize::i64Bit, ZReg::z30, PReg::p15), \"uqincp z30.d, p15\");\n\n  TEST_SINGLE(sqdecp(SubRegSize::i16Bit, ZReg::z30, PReg::p15), \"sqdecp z30.h, p15\");\n  TEST_SINGLE(sqdecp(SubRegSize::i32Bit, ZReg::z30, PReg::p15), \"sqdecp z30.s, p15\");\n  TEST_SINGLE(sqdecp(SubRegSize::i64Bit, ZReg::z30, PReg::p15), \"sqdecp z30.d, p15\");\n\n  TEST_SINGLE(uqdecp(SubRegSize::i16Bit, ZReg::z30, PReg::p15), \"uqdecp z30.h, p15\");\n  TEST_SINGLE(uqdecp(SubRegSize::i32Bit, ZReg::z30, PReg::p15), \"uqdecp z30.s, p15\");\n  TEST_SINGLE(uqdecp(SubRegSize::i64Bit, ZReg::z30, PReg::p15), \"uqdecp z30.d, p15\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE saturating inc/dec register by predicate count\") {\n  TEST_SINGLE(sqincp(SubRegSize::i8Bit, XReg::x30, PReg::p15), \"sqincp x30, p15.b\");\n  TEST_SINGLE(sqincp(SubRegSize::i16Bit, XReg::x30, PReg::p15), \"sqincp x30, p15.h\");\n  TEST_SINGLE(sqincp(SubRegSize::i32Bit, XReg::x30, PReg::p15), \"sqincp x30, p15.s\");\n  TEST_SINGLE(sqincp(SubRegSize::i64Bit, XReg::x30, PReg::p15), \"sqincp x30, p15.d\");\n\n  TEST_SINGLE(sqincp(SubRegSize::i8Bit, XReg::x30, PReg::p15, WReg::w30), \"sqincp x30, p15.b, w30\");\n  TEST_SINGLE(sqincp(SubRegSize::i16Bit, XReg::x30, PReg::p15, WReg::w30), \"sqincp x30, p15.h, w30\");\n  TEST_SINGLE(sqincp(SubRegSize::i32Bit, XReg::x30, PReg::p15, WReg::w30), \"sqincp x30, p15.s, w30\");\n  TEST_SINGLE(sqincp(SubRegSize::i64Bit, XReg::x30, PReg::p15, WReg::w30), \"sqincp x30, p15.d, w30\");\n\n  TEST_SINGLE(uqincp(SubRegSize::i8Bit, XReg::x30, PReg::p15), \"uqincp x30, p15.b\");\n  TEST_SINGLE(uqincp(SubRegSize::i16Bit, XReg::x30, PReg::p15), \"uqincp x30, p15.h\");\n  TEST_SINGLE(uqincp(SubRegSize::i32Bit, XReg::x30, PReg::p15), \"uqincp x30, p15.s\");\n  TEST_SINGLE(uqincp(SubRegSize::i64Bit, XReg::x30, PReg::p15), \"uqincp x30, p15.d\");\n\n  TEST_SINGLE(uqincp(SubRegSize::i8Bit, WReg::w30, PReg::p15), \"uqincp w30, p15.b\");\n  TEST_SINGLE(uqincp(SubRegSize::i16Bit, WReg::w30, PReg::p15), \"uqincp w30, p15.h\");\n  TEST_SINGLE(uqincp(SubRegSize::i32Bit, WReg::w30, PReg::p15), \"uqincp w30, p15.s\");\n  TEST_SINGLE(uqincp(SubRegSize::i64Bit, WReg::w30, PReg::p15), \"uqincp w30, p15.d\");\n\n  TEST_SINGLE(sqdecp(SubRegSize::i8Bit, XReg::x30, PReg::p15), \"sqdecp x30, p15.b\");\n  TEST_SINGLE(sqdecp(SubRegSize::i16Bit, XReg::x30, PReg::p15), \"sqdecp x30, p15.h\");\n  TEST_SINGLE(sqdecp(SubRegSize::i32Bit, XReg::x30, PReg::p15), \"sqdecp x30, p15.s\");\n  TEST_SINGLE(sqdecp(SubRegSize::i64Bit, XReg::x30, PReg::p15), \"sqdecp x30, p15.d\");\n\n  TEST_SINGLE(sqdecp(SubRegSize::i8Bit, XReg::x30, PReg::p15, WReg::w30), \"sqdecp x30, p15.b, w30\");\n  TEST_SINGLE(sqdecp(SubRegSize::i16Bit, XReg::x30, PReg::p15, WReg::w30), \"sqdecp x30, p15.h, w30\");\n  TEST_SINGLE(sqdecp(SubRegSize::i32Bit, XReg::x30, PReg::p15, WReg::w30), \"sqdecp x30, p15.s, w30\");\n  TEST_SINGLE(sqdecp(SubRegSize::i64Bit, XReg::x30, PReg::p15, WReg::w30), \"sqdecp x30, p15.d, w30\");\n\n  TEST_SINGLE(uqdecp(SubRegSize::i8Bit, XReg::x30, PReg::p15), \"uqdecp x30, p15.b\");\n  TEST_SINGLE(uqdecp(SubRegSize::i16Bit, XReg::x30, PReg::p15), \"uqdecp x30, p15.h\");\n  TEST_SINGLE(uqdecp(SubRegSize::i32Bit, XReg::x30, PReg::p15), \"uqdecp x30, p15.s\");\n  TEST_SINGLE(uqdecp(SubRegSize::i64Bit, XReg::x30, PReg::p15), \"uqdecp x30, p15.d\");\n\n  TEST_SINGLE(uqdecp(SubRegSize::i8Bit, WReg::w30, PReg::p15), \"uqdecp w30, p15.b\");\n  TEST_SINGLE(uqdecp(SubRegSize::i16Bit, WReg::w30, PReg::p15), \"uqdecp w30, p15.h\");\n  TEST_SINGLE(uqdecp(SubRegSize::i32Bit, WReg::w30, PReg::p15), \"uqdecp w30, p15.s\");\n  TEST_SINGLE(uqdecp(SubRegSize::i64Bit, WReg::w30, PReg::p15), \"uqdecp w30, p15.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE inc/dec vector by predicate count\") {\n  TEST_SINGLE(incp(SubRegSize::i16Bit, ZReg::z30, PReg::p15), \"incp z30.h, p15\");\n  TEST_SINGLE(incp(SubRegSize::i32Bit, ZReg::z30, PReg::p15), \"incp z30.s, p15\");\n  TEST_SINGLE(incp(SubRegSize::i64Bit, ZReg::z30, PReg::p15), \"incp z30.d, p15\");\n\n  TEST_SINGLE(decp(SubRegSize::i16Bit, ZReg::z30, PReg::p15), \"decp z30.h, p15\");\n  TEST_SINGLE(decp(SubRegSize::i32Bit, ZReg::z30, PReg::p15), \"decp z30.s, p15\");\n  TEST_SINGLE(decp(SubRegSize::i64Bit, ZReg::z30, PReg::p15), \"decp z30.d, p15\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE inc/dec register by predicate count\") {\n  TEST_SINGLE(incp(SubRegSize::i8Bit, XReg::x30, PReg::p15), \"incp x30, p15.b\");\n  TEST_SINGLE(incp(SubRegSize::i16Bit, XReg::x30, PReg::p15), \"incp x30, p15.h\");\n  TEST_SINGLE(incp(SubRegSize::i32Bit, XReg::x30, PReg::p15), \"incp x30, p15.s\");\n  TEST_SINGLE(incp(SubRegSize::i64Bit, XReg::x30, PReg::p15), \"incp x30, p15.d\");\n\n  TEST_SINGLE(decp(SubRegSize::i8Bit, XReg::x30, PReg::p15), \"decp x30, p15.b\");\n  TEST_SINGLE(decp(SubRegSize::i16Bit, XReg::x30, PReg::p15), \"decp x30, p15.h\");\n  TEST_SINGLE(decp(SubRegSize::i32Bit, XReg::x30, PReg::p15), \"decp x30, p15.s\");\n  TEST_SINGLE(decp(SubRegSize::i64Bit, XReg::x30, PReg::p15), \"decp x30, p15.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE FFR write from predicate\") {\n  TEST_SINGLE(wrffr(PReg::p7), \"wrffr p7.b\");\n  TEST_SINGLE(wrffr(PReg::p15), \"wrffr p15.b\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE FFR initialise\") {\n  TEST_SINGLE(setffr(), \"setffr\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE Integer Multiply-Add - Unpredicated\") {\n  TEST_SINGLE(cdot(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_0), \"cdot z30.s, z29.b, z28.b, #0\");\n  TEST_SINGLE(cdot(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_90), \"cdot z30.s, z29.b, z28.b, #90\");\n  TEST_SINGLE(cdot(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_180), \"cdot z30.s, z29.b, z28.b, #180\");\n  TEST_SINGLE(cdot(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_270), \"cdot z30.s, z29.b, z28.b, #270\");\n\n  TEST_SINGLE(cdot(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_0), \"cdot z30.d, z29.h, z28.h, #0\");\n  TEST_SINGLE(cdot(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_90), \"cdot z30.d, z29.h, z28.h, #90\");\n  TEST_SINGLE(cdot(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_180), \"cdot z30.d, z29.h, z28.h, #180\");\n  TEST_SINGLE(cdot(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_270), \"cdot z30.d, z29.h, z28.h, #270\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer dot product (unpredicated)\") {\n  TEST_SINGLE(sdot(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sdot z30.s, z29.b, z28.b\");\n  TEST_SINGLE(sdot(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sdot z30.d, z29.h, z28.h\");\n\n  TEST_SINGLE(udot(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"udot z30.s, z29.b, z28.b\");\n  TEST_SINGLE(udot(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"udot z30.d, z29.h, z28.h\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 saturating multiply-add interleaved long\") {\n  TEST_SINGLE(sqdmlalbt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlalbt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(sqdmlalbt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlalbt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(sqdmlalbt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlalbt z30.d, z29.s, z28.s\");\n\n  TEST_SINGLE(sqdmlslbt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlslbt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(sqdmlslbt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlslbt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(sqdmlslbt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlslbt z30.d, z29.s, z28.s\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 complex integer multiply-add\") {\n  TEST_SINGLE(cmla(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_0), \"cmla z30.b, z29.b, z28.b, #0\");\n  TEST_SINGLE(cmla(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_90), \"cmla z30.b, z29.b, z28.b, #90\");\n  TEST_SINGLE(cmla(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_180), \"cmla z30.b, z29.b, z28.b, #180\");\n  TEST_SINGLE(cmla(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_270), \"cmla z30.b, z29.b, z28.b, #270\");\n\n  TEST_SINGLE(cmla(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_0), \"cmla z30.h, z29.h, z28.h, #0\");\n  TEST_SINGLE(cmla(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_90), \"cmla z30.h, z29.h, z28.h, #90\");\n  TEST_SINGLE(cmla(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_180), \"cmla z30.h, z29.h, z28.h, #180\");\n  TEST_SINGLE(cmla(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_270), \"cmla z30.h, z29.h, z28.h, #270\");\n\n  TEST_SINGLE(cmla(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_0), \"cmla z30.s, z29.s, z28.s, #0\");\n  TEST_SINGLE(cmla(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_90), \"cmla z30.s, z29.s, z28.s, #90\");\n  TEST_SINGLE(cmla(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_180), \"cmla z30.s, z29.s, z28.s, #180\");\n  TEST_SINGLE(cmla(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_270), \"cmla z30.s, z29.s, z28.s, #270\");\n\n  TEST_SINGLE(cmla(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_0), \"cmla z30.d, z29.d, z28.d, #0\");\n  TEST_SINGLE(cmla(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_90), \"cmla z30.d, z29.d, z28.d, #90\");\n  TEST_SINGLE(cmla(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_180), \"cmla z30.d, z29.d, z28.d, #180\");\n  TEST_SINGLE(cmla(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_270), \"cmla z30.d, z29.d, z28.d, #270\");\n\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_0), \"sqrdcmlah z30.b, z29.b, z28.b, #0\");\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_90), \"sqrdcmlah z30.b, z29.b, z28.b, #90\");\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_180), \"sqrdcmlah z30.b, z29.b, z28.b, #180\");\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_270), \"sqrdcmlah z30.b, z29.b, z28.b, #270\");\n\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_0), \"sqrdcmlah z30.h, z29.h, z28.h, #0\");\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_90), \"sqrdcmlah z30.h, z29.h, z28.h, #90\");\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_180), \"sqrdcmlah z30.h, z29.h, z28.h, #180\");\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_270), \"sqrdcmlah z30.h, z29.h, z28.h, #270\");\n\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_0), \"sqrdcmlah z30.s, z29.s, z28.s, #0\");\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_90), \"sqrdcmlah z30.s, z29.s, z28.s, #90\");\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_180), \"sqrdcmlah z30.s, z29.s, z28.s, #180\");\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_270), \"sqrdcmlah z30.s, z29.s, z28.s, #270\");\n\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_0), \"sqrdcmlah z30.d, z29.d, z28.d, #0\");\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_90), \"sqrdcmlah z30.d, z29.d, z28.d, #90\");\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_180), \"sqrdcmlah z30.d, z29.d, z28.d, #180\");\n  TEST_SINGLE(sqrdcmlah(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28, Rotation::ROTATE_270), \"sqrdcmlah z30.d, z29.d, z28.d, #270\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 integer multiply-add long\") {\n  TEST_SINGLE(smlalb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smlalb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(smlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smlalb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(smlalb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smlalb z30.d, z29.s, z28.s\");\n\n  TEST_SINGLE(smlalt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smlalt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(smlalt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smlalt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(smlalt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smlalt z30.d, z29.s, z28.s\");\n\n  TEST_SINGLE(umlalb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umlalb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(umlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umlalb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(umlalb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umlalb z30.d, z29.s, z28.s\");\n\n  TEST_SINGLE(umlalt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umlalt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(umlalt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umlalt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(umlalt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umlalt z30.d, z29.s, z28.s\");\n\n  TEST_SINGLE(smlslb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smlslb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(smlslb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smlslb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(smlslb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smlslb z30.d, z29.s, z28.s\");\n\n  TEST_SINGLE(smlslt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smlslt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(smlslt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smlslt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(smlslt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smlslt z30.d, z29.s, z28.s\");\n\n  TEST_SINGLE(umlslb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umlslb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(umlslb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umlslb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(umlslb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umlslb z30.d, z29.s, z28.s\");\n\n  TEST_SINGLE(umlslt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umlslt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(umlslt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umlslt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(umlslt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umlslt z30.d, z29.s, z28.s\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 saturating multiply-add long\") {\n  TEST_SINGLE(sqdmlalb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlalb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(sqdmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlalb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(sqdmlalb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlalb z30.d, z29.s, z28.s\");\n\n  TEST_SINGLE(sqdmlalt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlalt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(sqdmlalt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlalt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(sqdmlalt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlalt z30.d, z29.s, z28.s\");\n\n  TEST_SINGLE(sqdmlslb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlslb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(sqdmlslb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlslb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(sqdmlslb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlslb z30.d, z29.s, z28.s\");\n\n  TEST_SINGLE(sqdmlslt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlslt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(sqdmlslt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlslt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(sqdmlslt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmlslt z30.d, z29.s, z28.s\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 saturating multiply-add high\") {\n  TEST_SINGLE(sqrdmlah(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqrdmlah z30.b, z29.b, z28.b\");\n  TEST_SINGLE(sqrdmlah(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqrdmlah z30.h, z29.h, z28.h\");\n  TEST_SINGLE(sqrdmlah(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqrdmlah z30.s, z29.s, z28.s\");\n  TEST_SINGLE(sqrdmlah(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqrdmlah z30.d, z29.d, z28.d\");\n\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqrdmlsh z30.b, z29.b, z28.b\");\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqrdmlsh z30.h, z29.h, z28.h\");\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqrdmlsh z30.s, z29.s, z28.s\");\n  TEST_SINGLE(sqrdmlsh(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqrdmlsh z30.d, z29.d, z28.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE mixed sign dot product\") {\n  TEST_SINGLE(usdot(ZReg::z30, ZReg::z29, ZReg::z28), \"usdot z30.s, z29.b, z28.b\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 integer pairwise add and accumulate long\") {\n  TEST_SINGLE(sadalp(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sadalp z30.h, p6/m, z29.b\");\n  TEST_SINGLE(sadalp(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sadalp z30.s, p6/m, z29.h\");\n  TEST_SINGLE(sadalp(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sadalp z30.d, p6/m, z29.s\");\n\n  TEST_SINGLE(uadalp(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"uadalp z30.h, p6/m, z29.b\");\n  TEST_SINGLE(uadalp(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"uadalp z30.s, p6/m, z29.h\");\n  TEST_SINGLE(uadalp(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"uadalp z30.d, p6/m, z29.s\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 integer unary operations (predicated)\") {\n  TEST_SINGLE(urecpe(ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"urecpe z30.s, p6/m, z29.s\");\n\n  TEST_SINGLE(ursqrte(ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"ursqrte z30.s, p6/m, z29.s\");\n\n  TEST_SINGLE(sqabs(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sqabs z30.b, p6/m, z29.b\");\n  TEST_SINGLE(sqabs(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sqabs z30.h, p6/m, z29.h\");\n  TEST_SINGLE(sqabs(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sqabs z30.s, p6/m, z29.s\");\n  TEST_SINGLE(sqabs(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sqabs z30.d, p6/m, z29.d\");\n\n  TEST_SINGLE(sqneg(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sqneg z30.b, p6/m, z29.b\");\n  TEST_SINGLE(sqneg(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sqneg z30.h, p6/m, z29.h\");\n  TEST_SINGLE(sqneg(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sqneg z30.s, p6/m, z29.s\");\n  TEST_SINGLE(sqneg(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"sqneg z30.d, p6/m, z29.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 saturating/rounding bitwise shift left (predicated)\") {\n  TEST_SINGLE(srshl(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"srshl z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(srshl(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"srshl z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(srshl(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"srshl z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(srshl(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"srshl z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(urshl(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"urshl z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(urshl(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"urshl z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(urshl(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"urshl z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(urshl(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"urshl z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(srshlr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"srshlr z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(srshlr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"srshlr z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(srshlr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"srshlr z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(srshlr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"srshlr z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(urshlr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"urshlr z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(urshlr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"urshlr z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(urshlr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"urshlr z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(urshlr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"urshlr z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(sqshl(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqshl z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(sqshl(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqshl z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(sqshl(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqshl z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(sqshl(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqshl z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(uqshl(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqshl z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(uqshl(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqshl z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(uqshl(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqshl z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(uqshl(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqshl z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(sqrshl(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqrshl z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(sqrshl(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqrshl z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(sqrshl(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqrshl z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(sqrshl(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqrshl z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(uqrshl(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqrshl z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(uqrshl(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqrshl z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(uqrshl(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqrshl z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(uqrshl(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqrshl z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(sqshlr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqshlr z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(sqshlr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqshlr z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(sqshlr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqshlr z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(sqshlr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqshlr z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(uqshlr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqshlr z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(uqshlr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqshlr z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(uqshlr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqshlr z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(uqshlr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqshlr z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(sqrshlr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqrshlr z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(sqrshlr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqrshlr z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(sqrshlr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqrshlr z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(sqrshlr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"sqrshlr z30.d, p6/m, z30.d, z29.d\");\n\n  TEST_SINGLE(uqrshlr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqrshlr z30.b, p6/m, z30.b, z29.b\");\n  TEST_SINGLE(uqrshlr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqrshlr z30.h, p6/m, z30.h, z29.h\");\n  TEST_SINGLE(uqrshlr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqrshlr z30.s, p6/m, z30.s, z29.s\");\n  TEST_SINGLE(uqrshlr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z29), \"uqrshlr z30.d, p6/m, z30.d, z29.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 integer halving add/subtract (predicated)\") {\n  TEST_SINGLE(shadd(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"shadd z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(shadd(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"shadd z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(shadd(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"shadd z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(shadd(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"shadd z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(shadd(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"shadd z30.q, p6/m, z30.q, z28.q\");\n\n  TEST_SINGLE(uhadd(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uhadd z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(uhadd(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uhadd z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(uhadd(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uhadd z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(uhadd(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uhadd z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(uhadd(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uhadd z30.q, p6/m, z30.q, z28.q\");\n  TEST_SINGLE(shsub(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"shsub z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(shsub(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"shsub z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(shsub(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"shsub z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(shsub(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"shsub z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(shsub(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"shsub z30.q, p6/m, z30.q, z28.q\");\n\n  TEST_SINGLE(uhsub(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uhsub z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(uhsub(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uhsub z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(uhsub(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uhsub z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(uhsub(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uhsub z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(uhsub(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uhsub z30.q, p6/m, z30.q, z28.q\");\n\n  TEST_SINGLE(srhadd(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"srhadd z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(srhadd(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"srhadd z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(srhadd(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"srhadd z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(srhadd(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"srhadd z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(srhadd(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"srhadd z30.q, p6/m, z30.q, z28.q\");\n\n  TEST_SINGLE(urhadd(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"urhadd z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(urhadd(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"urhadd z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(urhadd(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"urhadd z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(urhadd(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"urhadd z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(urhadd(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"urhadd z30.q, p6/m, z30.q, z28.q\");\n\n  TEST_SINGLE(shsubr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"shsubr z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(shsubr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"shsubr z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(shsubr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"shsubr z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(shsubr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"shsubr z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(shsubr(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"shsubr z30.q, p6/m, z30.q, z28.q\");\n\n  TEST_SINGLE(uhsubr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uhsubr z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(uhsubr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uhsubr z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(uhsubr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uhsubr z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(uhsubr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uhsubr z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(uhsubr(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uhsubr z30.q, p6/m, z30.q, z28.q\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 integer pairwise arithmetic\") {\n  TEST_SINGLE(addp(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"addp z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(addp(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"addp z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(addp(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"addp z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(addp(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"addp z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(addp(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"addp z30.q, p6/m, z30.q, z28.q\");\n\n  TEST_SINGLE(smaxp(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"smaxp z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(smaxp(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"smaxp z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(smaxp(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"smaxp z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(smaxp(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"smaxp z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(smaxp(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"smaxp z30.q, p6/m, z30.q, z28.q\");\n\n  TEST_SINGLE(umaxp(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"umaxp z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(umaxp(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"umaxp z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(umaxp(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"umaxp z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(umaxp(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"umaxp z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(umaxp(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"umaxp z30.q, p6/m, z30.q, z28.q\");\n\n\n  TEST_SINGLE(sminp(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"sminp z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(sminp(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"sminp z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(sminp(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"sminp z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(sminp(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"sminp z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(sminp(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"sminp z30.q, p6/m, z30.q, z28.q\");\n\n\n  TEST_SINGLE(uminp(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uminp z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(uminp(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uminp z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(uminp(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uminp z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(uminp(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uminp z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(uminp(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"uminp z30.q, p6/m, z30.q, z28.q\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 saturating add/subtract\") {\n  TEST_SINGLE(sqadd(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sqadd z30.b, p7/m, z30.b, z28.b\");\n  TEST_SINGLE(sqadd(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sqadd z30.h, p7/m, z30.h, z28.h\");\n  TEST_SINGLE(sqadd(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sqadd z30.s, p7/m, z30.s, z28.s\");\n  TEST_SINGLE(sqadd(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sqadd z30.d, p7/m, z30.d, z28.d\");\n\n  TEST_SINGLE(uqadd(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"uqadd z30.b, p7/m, z30.b, z28.b\");\n  TEST_SINGLE(uqadd(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"uqadd z30.h, p7/m, z30.h, z28.h\");\n  TEST_SINGLE(uqadd(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"uqadd z30.s, p7/m, z30.s, z28.s\");\n  TEST_SINGLE(uqadd(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"uqadd z30.d, p7/m, z30.d, z28.d\");\n\n  TEST_SINGLE(sqsub(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sqsub z30.b, p7/m, z30.b, z28.b\");\n  TEST_SINGLE(sqsub(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sqsub z30.h, p7/m, z30.h, z28.h\");\n  TEST_SINGLE(sqsub(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sqsub z30.s, p7/m, z30.s, z28.s\");\n  TEST_SINGLE(sqsub(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sqsub z30.d, p7/m, z30.d, z28.d\");\n\n  TEST_SINGLE(uqsub(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"uqsub z30.b, p7/m, z30.b, z28.b\");\n  TEST_SINGLE(uqsub(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"uqsub z30.h, p7/m, z30.h, z28.h\");\n  TEST_SINGLE(uqsub(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"uqsub z30.s, p7/m, z30.s, z28.s\");\n  TEST_SINGLE(uqsub(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"uqsub z30.d, p7/m, z30.d, z28.d\");\n\n  TEST_SINGLE(suqadd(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"suqadd z30.b, p7/m, z30.b, z28.b\");\n  TEST_SINGLE(suqadd(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"suqadd z30.h, p7/m, z30.h, z28.h\");\n  TEST_SINGLE(suqadd(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"suqadd z30.s, p7/m, z30.s, z28.s\");\n  TEST_SINGLE(suqadd(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"suqadd z30.d, p7/m, z30.d, z28.d\");\n\n  TEST_SINGLE(usqadd(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"usqadd z30.b, p7/m, z30.b, z28.b\");\n  TEST_SINGLE(usqadd(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"usqadd z30.h, p7/m, z30.h, z28.h\");\n  TEST_SINGLE(usqadd(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"usqadd z30.s, p7/m, z30.s, z28.s\");\n  TEST_SINGLE(usqadd(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"usqadd z30.d, p7/m, z30.d, z28.d\");\n\n  TEST_SINGLE(sqsubr(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sqsubr z30.b, p7/m, z30.b, z28.b\");\n  TEST_SINGLE(sqsubr(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sqsubr z30.h, p7/m, z30.h, z28.h\");\n  TEST_SINGLE(sqsubr(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sqsubr z30.s, p7/m, z30.s, z28.s\");\n  TEST_SINGLE(sqsubr(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"sqsubr z30.d, p7/m, z30.d, z28.d\");\n\n  TEST_SINGLE(uqsubr(SubRegSize::i8Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"uqsubr z30.b, p7/m, z30.b, z28.b\");\n  TEST_SINGLE(uqsubr(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"uqsubr z30.h, p7/m, z30.h, z28.h\");\n  TEST_SINGLE(uqsubr(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"uqsubr z30.s, p7/m, z30.s, z28.s\");\n  TEST_SINGLE(uqsubr(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z30, ZReg::z28), \"uqsubr z30.d, p7/m, z30.d, z28.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 integer add/subtract long\") {\n  // TEST_SINGLE(saddlb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddlb z30.b, z29.b, z28.b\");\n  TEST_SINGLE(saddlb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddlb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(saddlb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddlb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(saddlb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddlb z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(saddlt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddlt z30.b, z29.b, z28.b\");\n  TEST_SINGLE(saddlt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddlt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(saddlt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddlt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(saddlt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddlt z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(uaddlb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uaddlb z30.b, z29.b, z28.b\");\n  TEST_SINGLE(uaddlb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uaddlb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(uaddlb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uaddlb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(uaddlb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uaddlb z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(uaddlt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uaddlt z30.b, z29.b, z28.b\");\n  TEST_SINGLE(uaddlt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uaddlt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(uaddlt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uaddlt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(uaddlt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uaddlt z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(ssublb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssublb z30.b, z29.b, z28.b\");\n  TEST_SINGLE(ssublb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssublb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(ssublb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssublb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(ssublb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssublb z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(ssublt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssublt z30.b, z29.b, z28.b\");\n  TEST_SINGLE(ssublt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssublt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(ssublt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssublt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(ssublt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssublt z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(usublb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"usublb z30.b, z29.b, z28.b\");\n  TEST_SINGLE(usublb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"usublb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(usublb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"usublb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(usublb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"usublb z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(usublt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"usublt z30.b, z29.b, z28.b\");\n  TEST_SINGLE(usublt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"usublt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(usublt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"usublt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(usublt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"usublt z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(sabdlb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sabdlb z30.b, z29.b, z28.b\");\n  TEST_SINGLE(sabdlb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sabdlb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(sabdlb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sabdlb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(sabdlb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sabdlb z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(sabdlt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sabdlt z30.b, z29.b, z28.b\");\n  TEST_SINGLE(sabdlt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sabdlt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(sabdlt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sabdlt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(sabdlt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sabdlt z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(uabdlb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uabdlb z30.b, z29.b, z28.b\");\n  TEST_SINGLE(uabdlb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uabdlb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(uabdlb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uabdlb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(uabdlb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uabdlb z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(uabdlt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uabdlt z30.b, z29.b, z28.b\");\n  TEST_SINGLE(uabdlt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uabdlt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(uabdlt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uabdlt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(uabdlt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uabdlt z30.d, z29.s, z28.s\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 integer add/subtract wide\") {\n  TEST_SINGLE(saddwb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddwb z30.h, z29.h, z28.b\");\n  TEST_SINGLE(saddwb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddwb z30.s, z29.s, z28.h\");\n  TEST_SINGLE(saddwb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddwb z30.d, z29.d, z28.s\");\n\n  TEST_SINGLE(saddwt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddwt z30.h, z29.h, z28.b\");\n  TEST_SINGLE(saddwt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddwt z30.s, z29.s, z28.h\");\n  TEST_SINGLE(saddwt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddwt z30.d, z29.d, z28.s\");\n\n  TEST_SINGLE(uaddwb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uaddwb z30.h, z29.h, z28.b\");\n  TEST_SINGLE(uaddwb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uaddwb z30.s, z29.s, z28.h\");\n  TEST_SINGLE(uaddwb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uaddwb z30.d, z29.d, z28.s\");\n\n  TEST_SINGLE(uaddwt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uaddwt z30.h, z29.h, z28.b\");\n  TEST_SINGLE(uaddwt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uaddwt z30.s, z29.s, z28.h\");\n  TEST_SINGLE(uaddwt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"uaddwt z30.d, z29.d, z28.s\");\n\n  TEST_SINGLE(ssubwb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssubwb z30.h, z29.h, z28.b\");\n  TEST_SINGLE(ssubwb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssubwb z30.s, z29.s, z28.h\");\n  TEST_SINGLE(ssubwb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssubwb z30.d, z29.d, z28.s\");\n\n  TEST_SINGLE(ssubwt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssubwt z30.h, z29.h, z28.b\");\n  TEST_SINGLE(ssubwt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssubwt z30.s, z29.s, z28.h\");\n  TEST_SINGLE(ssubwt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssubwt z30.d, z29.d, z28.s\");\n\n  TEST_SINGLE(usubwb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"usubwb z30.h, z29.h, z28.b\");\n  TEST_SINGLE(usubwb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"usubwb z30.s, z29.s, z28.h\");\n  TEST_SINGLE(usubwb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"usubwb z30.d, z29.d, z28.s\");\n\n  TEST_SINGLE(usubwt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"usubwt z30.h, z29.h, z28.b\");\n  TEST_SINGLE(usubwt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"usubwt z30.s, z29.s, z28.h\");\n  TEST_SINGLE(usubwt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"usubwt z30.d, z29.d, z28.s\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 integer multiply long\") {\n  // TEST_SINGLE(sqdmullb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmullb z30.b, z29.b, z28.b\");\n  TEST_SINGLE(sqdmullb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmullb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(sqdmullb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmullb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(sqdmullb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmullb z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(sqdmullt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmullt z30.b, z29.b, z28.b\");\n  TEST_SINGLE(sqdmullt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmullt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(sqdmullt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmullt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(sqdmullt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"sqdmullt z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(pmullb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"pmullb z30.b, z29.b, z28.b\");\n  TEST_SINGLE(pmullb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"pmullb z30.h, z29.b, z28.b\");\n  // TEST_SINGLE(pmullb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"pmullb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(pmullb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"pmullb z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(pmullt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"pmullt z30.b, z29.b, z28.b\");\n  TEST_SINGLE(pmullt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"pmullt z30.h, z29.b, z28.b\");\n  // TEST_SINGLE(pmullt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"pmullt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(pmullt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"pmullt z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(smullb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smullb z30.b, z29.b, z28.b\");\n  TEST_SINGLE(smullb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smullb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(smullb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smullb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(smullb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smullb z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(smullt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smullt z30.b, z29.b, z28.b\");\n  TEST_SINGLE(smullt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smullt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(smullt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smullt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(smullt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"smullt z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(umullb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umullb z30.b, z29.b, z28.b\");\n  TEST_SINGLE(umullb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umullb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(umullb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umullb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(umullb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umullb z30.d, z29.s, z28.s\");\n\n  // TEST_SINGLE(umullt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umullt z30.b, z29.b, z28.b\");\n  TEST_SINGLE(umullt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umullt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(umullt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umullt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(umullt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"umullt z30.d, z29.s, z28.s\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 bitwise shift left long\") {\n  TEST_SINGLE(sshllb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 0), \"sshllb z30.h, z29.b, #0\");\n  TEST_SINGLE(sshllb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 7), \"sshllb z30.h, z29.b, #7\");\n  TEST_SINGLE(sshllb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 0), \"sshllb z30.s, z29.h, #0\");\n  TEST_SINGLE(sshllb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 15), \"sshllb z30.s, z29.h, #15\");\n  TEST_SINGLE(sshllb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 0), \"sshllb z30.d, z29.s, #0\");\n  TEST_SINGLE(sshllb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 31), \"sshllb z30.d, z29.s, #31\");\n\n  TEST_SINGLE(sshllt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 0), \"sshllt z30.h, z29.b, #0\");\n  TEST_SINGLE(sshllt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 7), \"sshllt z30.h, z29.b, #7\");\n  TEST_SINGLE(sshllt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 0), \"sshllt z30.s, z29.h, #0\");\n  TEST_SINGLE(sshllt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 15), \"sshllt z30.s, z29.h, #15\");\n  TEST_SINGLE(sshllt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 0), \"sshllt z30.d, z29.s, #0\");\n  TEST_SINGLE(sshllt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 31), \"sshllt z30.d, z29.s, #31\");\n\n  TEST_SINGLE(ushllb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 0), \"ushllb z30.h, z29.b, #0\");\n  TEST_SINGLE(ushllb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 7), \"ushllb z30.h, z29.b, #7\");\n  TEST_SINGLE(ushllb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 0), \"ushllb z30.s, z29.h, #0\");\n  TEST_SINGLE(ushllb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 15), \"ushllb z30.s, z29.h, #15\");\n  TEST_SINGLE(ushllb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 0), \"ushllb z30.d, z29.s, #0\");\n  TEST_SINGLE(ushllb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 31), \"ushllb z30.d, z29.s, #31\");\n\n  TEST_SINGLE(ushllt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 0), \"ushllt z30.h, z29.b, #0\");\n  TEST_SINGLE(ushllt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 7), \"ushllt z30.h, z29.b, #7\");\n  TEST_SINGLE(ushllt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 0), \"ushllt z30.s, z29.h, #0\");\n  TEST_SINGLE(ushllt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 15), \"ushllt z30.s, z29.h, #15\");\n  TEST_SINGLE(ushllt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 0), \"ushllt z30.d, z29.s, #0\");\n  TEST_SINGLE(ushllt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 31), \"ushllt z30.d, z29.s, #31\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 integer add/subtract interleaved long\") {\n  TEST_SINGLE(saddlbt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddlbt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(saddlbt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddlbt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(saddlbt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"saddlbt z30.d, z29.s, z28.s\");\n\n  TEST_SINGLE(ssublbt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssublbt z30.h, z29.b, z28.b\");\n  TEST_SINGLE(ssublbt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssublbt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(ssublbt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssublbt z30.d, z29.s, z28.s\");\n\n  TEST_SINGLE(ssubltb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssubltb z30.h, z29.b, z28.b\");\n  TEST_SINGLE(ssubltb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssubltb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(ssubltb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"ssubltb z30.d, z29.s, z28.s\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 bitwise exclusive-or interleaved\") {\n  TEST_SINGLE(eorbt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"eorbt z30.b, z29.b, z28.b\");\n  TEST_SINGLE(eorbt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"eorbt z30.h, z29.h, z28.h\");\n  TEST_SINGLE(eorbt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"eorbt z30.s, z29.s, z28.s\");\n  TEST_SINGLE(eorbt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"eorbt z30.d, z29.d, z28.d\");\n\n  TEST_SINGLE(eortb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"eortb z30.b, z29.b, z28.b\");\n  TEST_SINGLE(eortb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"eortb z30.h, z29.h, z28.h\");\n  TEST_SINGLE(eortb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"eortb z30.s, z29.s, z28.s\");\n  TEST_SINGLE(eortb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"eortb z30.d, z29.d, z28.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer matrix multiply accumulate\") {\n  TEST_SINGLE(smmla(ZReg::z30, ZReg::z29, ZReg::z28), \"smmla z30.s, z29.b, z28.b\");\n  TEST_SINGLE(usmmla(ZReg::z30, ZReg::z29, ZReg::z28), \"usmmla z30.s, z29.b, z28.b\");\n  TEST_SINGLE(ummla(ZReg::z30, ZReg::z29, ZReg::z28), \"ummla z30.s, z29.b, z28.b\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 bitwise permute\") {\n  TEST_SINGLE(bext(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bext z30.b, z29.b, z28.b\");\n  TEST_SINGLE(bext(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bext z30.h, z29.h, z28.h\");\n  TEST_SINGLE(bext(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bext z30.s, z29.s, z28.s\");\n  TEST_SINGLE(bext(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bext z30.d, z29.d, z28.d\");\n\n  TEST_SINGLE(bdep(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bdep z30.b, z29.b, z28.b\");\n  TEST_SINGLE(bdep(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bdep z30.h, z29.h, z28.h\");\n  TEST_SINGLE(bdep(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bdep z30.s, z29.s, z28.s\");\n  TEST_SINGLE(bdep(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bdep z30.d, z29.d, z28.d\");\n\n  TEST_SINGLE(bgrp(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bgrp z30.b, z29.b, z28.b\");\n  TEST_SINGLE(bgrp(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bgrp z30.h, z29.h, z28.h\");\n  TEST_SINGLE(bgrp(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bgrp z30.s, z29.s, z28.s\");\n  TEST_SINGLE(bgrp(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bgrp z30.d, z29.d, z28.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 complex integer add\") {\n  TEST_SINGLE(cadd(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_90), \"cadd z30.b, z30.b, z29.b, #90\");\n  TEST_SINGLE(cadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_90), \"cadd z30.h, z30.h, z29.h, #90\");\n  TEST_SINGLE(cadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_90), \"cadd z30.s, z30.s, z29.s, #90\");\n  TEST_SINGLE(cadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_90), \"cadd z30.d, z30.d, z29.d, #90\");\n\n  TEST_SINGLE(cadd(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_270), \"cadd z30.b, z30.b, z29.b, #270\");\n  TEST_SINGLE(cadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_270), \"cadd z30.h, z30.h, z29.h, #270\");\n  TEST_SINGLE(cadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_270), \"cadd z30.s, z30.s, z29.s, #270\");\n  TEST_SINGLE(cadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_270), \"cadd z30.d, z30.d, z29.d, #270\");\n\n  TEST_SINGLE(sqcadd(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_90), \"sqcadd z30.b, z30.b, z29.b, #90\");\n  TEST_SINGLE(sqcadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_90), \"sqcadd z30.h, z30.h, z29.h, #90\");\n  TEST_SINGLE(sqcadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_90), \"sqcadd z30.s, z30.s, z29.s, #90\");\n  TEST_SINGLE(sqcadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_90), \"sqcadd z30.d, z30.d, z29.d, #90\");\n\n  TEST_SINGLE(sqcadd(SubRegSize::i8Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_270), \"sqcadd z30.b, z30.b, z29.b, #270\");\n  TEST_SINGLE(sqcadd(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_270), \"sqcadd z30.h, z30.h, z29.h, #270\");\n  TEST_SINGLE(sqcadd(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_270), \"sqcadd z30.s, z30.s, z29.s, #270\");\n  TEST_SINGLE(sqcadd(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, ZReg::z29, Rotation::ROTATE_270), \"sqcadd z30.d, z30.d, z29.d, #270\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 integer absolute difference and accumulate long\") {\n  TEST_SINGLE(sabalb(SubRegSize::i16Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"sabalb z28.h, z29.b, z30.b\");\n  TEST_SINGLE(sabalb(SubRegSize::i32Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"sabalb z28.s, z29.h, z30.h\");\n  TEST_SINGLE(sabalb(SubRegSize::i64Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"sabalb z28.d, z29.s, z30.s\");\n\n  TEST_SINGLE(sabalt(SubRegSize::i16Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"sabalt z28.h, z29.b, z30.b\");\n  TEST_SINGLE(sabalt(SubRegSize::i32Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"sabalt z28.s, z29.h, z30.h\");\n  TEST_SINGLE(sabalt(SubRegSize::i64Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"sabalt z28.d, z29.s, z30.s\");\n\n  TEST_SINGLE(uabalb(SubRegSize::i16Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"uabalb z28.h, z29.b, z30.b\");\n  TEST_SINGLE(uabalb(SubRegSize::i32Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"uabalb z28.s, z29.h, z30.h\");\n  TEST_SINGLE(uabalb(SubRegSize::i64Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"uabalb z28.d, z29.s, z30.s\");\n\n  TEST_SINGLE(uabalt(SubRegSize::i16Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"uabalt z28.h, z29.b, z30.b\");\n  TEST_SINGLE(uabalt(SubRegSize::i32Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"uabalt z28.s, z29.h, z30.h\");\n  TEST_SINGLE(uabalt(SubRegSize::i64Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"uabalt z28.d, z29.s, z30.s\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 integer add/subtract long with carry\") {\n  TEST_SINGLE(adclb(SubRegSize::i32Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"adclb z28.s, z29.s, z30.s\");\n  TEST_SINGLE(adclb(SubRegSize::i64Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"adclb z28.d, z29.d, z30.d\");\n\n  TEST_SINGLE(adclt(SubRegSize::i32Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"adclt z28.s, z29.s, z30.s\");\n  TEST_SINGLE(adclt(SubRegSize::i64Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"adclt z28.d, z29.d, z30.d\");\n\n  TEST_SINGLE(sbclb(SubRegSize::i32Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"sbclb z28.s, z29.s, z30.s\");\n  TEST_SINGLE(sbclb(SubRegSize::i64Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"sbclb z28.d, z29.d, z30.d\");\n\n  TEST_SINGLE(sbclt(SubRegSize::i32Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"sbclt z28.s, z29.s, z30.s\");\n  TEST_SINGLE(sbclt(SubRegSize::i64Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"sbclt z28.d, z29.d, z30.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 bitwise shift right and accumulate\") {\n  TEST_SINGLE(ssra(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"ssra z30.b, z29.b, #1\");\n  TEST_SINGLE(ssra(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"ssra z30.b, z29.b, #8\");\n  TEST_SINGLE(ssra(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"ssra z30.h, z29.h, #1\");\n  TEST_SINGLE(ssra(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"ssra z30.h, z29.h, #16\");\n  TEST_SINGLE(ssra(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"ssra z30.s, z29.s, #1\");\n  TEST_SINGLE(ssra(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"ssra z30.s, z29.s, #32\");\n  TEST_SINGLE(ssra(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 1), \"ssra z30.d, z29.d, #1\");\n  TEST_SINGLE(ssra(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 64), \"ssra z30.d, z29.d, #64\");\n\n  TEST_SINGLE(usra(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"usra z30.b, z29.b, #1\");\n  TEST_SINGLE(usra(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"usra z30.b, z29.b, #8\");\n  TEST_SINGLE(usra(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"usra z30.h, z29.h, #1\");\n  TEST_SINGLE(usra(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"usra z30.h, z29.h, #16\");\n  TEST_SINGLE(usra(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"usra z30.s, z29.s, #1\");\n  TEST_SINGLE(usra(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"usra z30.s, z29.s, #32\");\n  TEST_SINGLE(usra(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 1), \"usra z30.d, z29.d, #1\");\n  TEST_SINGLE(usra(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 64), \"usra z30.d, z29.d, #64\");\n\n  TEST_SINGLE(srsra(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"srsra z30.b, z29.b, #1\");\n  TEST_SINGLE(srsra(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"srsra z30.b, z29.b, #8\");\n  TEST_SINGLE(srsra(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"srsra z30.h, z29.h, #1\");\n  TEST_SINGLE(srsra(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"srsra z30.h, z29.h, #16\");\n  TEST_SINGLE(srsra(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"srsra z30.s, z29.s, #1\");\n  TEST_SINGLE(srsra(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"srsra z30.s, z29.s, #32\");\n  TEST_SINGLE(srsra(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 1), \"srsra z30.d, z29.d, #1\");\n  TEST_SINGLE(srsra(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 64), \"srsra z30.d, z29.d, #64\");\n\n  TEST_SINGLE(ursra(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"ursra z30.b, z29.b, #1\");\n  TEST_SINGLE(ursra(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"ursra z30.b, z29.b, #8\");\n  TEST_SINGLE(ursra(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"ursra z30.h, z29.h, #1\");\n  TEST_SINGLE(ursra(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"ursra z30.h, z29.h, #16\");\n  TEST_SINGLE(ursra(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"ursra z30.s, z29.s, #1\");\n  TEST_SINGLE(ursra(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"ursra z30.s, z29.s, #32\");\n  TEST_SINGLE(ursra(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 1), \"ursra z30.d, z29.d, #1\");\n  TEST_SINGLE(ursra(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 64), \"ursra z30.d, z29.d, #64\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 bitwise shift and insert\") {\n  TEST_SINGLE(sri(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"sri z30.b, z29.b, #1\");\n  TEST_SINGLE(sri(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 4), \"sri z30.b, z29.b, #4\");\n  TEST_SINGLE(sri(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"sri z30.b, z29.b, #8\");\n  TEST_SINGLE(sri(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"sri z30.h, z29.h, #1\");\n  TEST_SINGLE(sri(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 15), \"sri z30.h, z29.h, #15\");\n  TEST_SINGLE(sri(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"sri z30.h, z29.h, #16\");\n  TEST_SINGLE(sri(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"sri z30.s, z29.s, #1\");\n  TEST_SINGLE(sri(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 15), \"sri z30.s, z29.s, #15\");\n  TEST_SINGLE(sri(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"sri z30.s, z29.s, #32\");\n  TEST_SINGLE(sri(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 1), \"sri z30.d, z29.d, #1\");\n  TEST_SINGLE(sri(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 31), \"sri z30.d, z29.d, #31\");\n  TEST_SINGLE(sri(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 64), \"sri z30.d, z29.d, #64\");\n\n  TEST_SINGLE(sli(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 0), \"sli z30.b, z29.b, #0\");\n  TEST_SINGLE(sli(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 4), \"sli z30.b, z29.b, #4\");\n  TEST_SINGLE(sli(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 7), \"sli z30.b, z29.b, #7\");\n  TEST_SINGLE(sli(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 0), \"sli z30.h, z29.h, #0\");\n  TEST_SINGLE(sli(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 7), \"sli z30.h, z29.h, #7\");\n  TEST_SINGLE(sli(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 15), \"sli z30.h, z29.h, #15\");\n  TEST_SINGLE(sli(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 0), \"sli z30.s, z29.s, #0\");\n  TEST_SINGLE(sli(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 15), \"sli z30.s, z29.s, #15\");\n  TEST_SINGLE(sli(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 31), \"sli z30.s, z29.s, #31\");\n  TEST_SINGLE(sli(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 0), \"sli z30.d, z29.d, #0\");\n  TEST_SINGLE(sli(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 31), \"sli z30.d, z29.d, #31\");\n  TEST_SINGLE(sli(SubRegSize::i64Bit, ZReg::z30, ZReg::z29, 63), \"sli z30.d, z29.d, #63\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 integer absolute difference and accumulate\") {\n  TEST_SINGLE(saba(SubRegSize::i8Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"saba z28.b, z29.b, z30.b\");\n  TEST_SINGLE(saba(SubRegSize::i16Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"saba z28.h, z29.h, z30.h\");\n  TEST_SINGLE(saba(SubRegSize::i32Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"saba z28.s, z29.s, z30.s\");\n  TEST_SINGLE(saba(SubRegSize::i64Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"saba z28.d, z29.d, z30.d\");\n\n  TEST_SINGLE(uaba(SubRegSize::i8Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"uaba z28.b, z29.b, z30.b\");\n  TEST_SINGLE(uaba(SubRegSize::i16Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"uaba z28.h, z29.h, z30.h\");\n  TEST_SINGLE(uaba(SubRegSize::i32Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"uaba z28.s, z29.s, z30.s\");\n  TEST_SINGLE(uaba(SubRegSize::i64Bit, ZReg::z28, ZReg::z29, ZReg::z30), \"uaba z28.d, z29.d, z30.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 saturating extract narrow\") {\n  TEST_SINGLE(sqxtnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29), \"sqxtnb z30.b, z29.h\");\n  TEST_SINGLE(sqxtnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29), \"sqxtnb z30.h, z29.s\");\n  TEST_SINGLE(sqxtnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29), \"sqxtnb z30.s, z29.d\");\n  // TEST_SINGLE(sqxtnb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29), \"sqxtnb z30.d, z29.q\");\n\n  TEST_SINGLE(sqxtnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29), \"sqxtnt z30.b, z29.h\");\n  TEST_SINGLE(sqxtnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29), \"sqxtnt z30.h, z29.s\");\n  TEST_SINGLE(sqxtnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29), \"sqxtnt z30.s, z29.d\");\n  // TEST_SINGLE(sqxtnt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29), \"sqxtnt z30.d, z29.q\");\n\n  TEST_SINGLE(uqxtnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29), \"uqxtnb z30.b, z29.h\");\n  TEST_SINGLE(uqxtnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29), \"uqxtnb z30.h, z29.s\");\n  TEST_SINGLE(uqxtnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29), \"uqxtnb z30.s, z29.d\");\n  // TEST_SINGLE(uqxtnb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29), \"uqxtnb z30.d, z29.q\");\n\n  TEST_SINGLE(uqxtnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29), \"uqxtnt z30.b, z29.h\");\n  TEST_SINGLE(uqxtnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29), \"uqxtnt z30.h, z29.s\");\n  TEST_SINGLE(uqxtnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29), \"uqxtnt z30.s, z29.d\");\n  // TEST_SINGLE(uqxtnt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29), \"uqxtnt z30.d, z29.q\");\n\n  TEST_SINGLE(sqxtunb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29), \"sqxtunb z30.b, z29.h\");\n  TEST_SINGLE(sqxtunb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29), \"sqxtunb z30.h, z29.s\");\n  TEST_SINGLE(sqxtunb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29), \"sqxtunb z30.s, z29.d\");\n  // TEST_SINGLE(sqxtunb(SubRegSize::i64Bit, ZReg::z30, ZReg::z29), \"sqxtunb z30.d, z29.q\");\n\n  TEST_SINGLE(sqxtunt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29), \"sqxtunt z30.b, z29.h\");\n  TEST_SINGLE(sqxtunt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29), \"sqxtunt z30.h, z29.s\");\n  TEST_SINGLE(sqxtunt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29), \"sqxtunt z30.s, z29.d\");\n  // TEST_SINGLE(sqxtunt(SubRegSize::i64Bit, ZReg::z30, ZReg::z29), \"sqxtunt z30.d, z29.q\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 bitwise shift right narrow\") {\n  TEST_SINGLE(sqshrunb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"sqshrunb z30.b, z29.h, #1\");\n  TEST_SINGLE(sqshrunb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"sqshrunb z30.b, z29.h, #8\");\n  TEST_SINGLE(sqshrunb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"sqshrunb z30.h, z29.s, #1\");\n  TEST_SINGLE(sqshrunb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"sqshrunb z30.h, z29.s, #16\");\n  TEST_SINGLE(sqshrunb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"sqshrunb z30.s, z29.d, #1\");\n  TEST_SINGLE(sqshrunb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"sqshrunb z30.s, z29.d, #32\");\n\n  TEST_SINGLE(sqshrunt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"sqshrunt z30.b, z29.h, #1\");\n  TEST_SINGLE(sqshrunt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"sqshrunt z30.b, z29.h, #8\");\n  TEST_SINGLE(sqshrunt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"sqshrunt z30.h, z29.s, #1\");\n  TEST_SINGLE(sqshrunt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"sqshrunt z30.h, z29.s, #16\");\n  TEST_SINGLE(sqshrunt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"sqshrunt z30.s, z29.d, #1\");\n  TEST_SINGLE(sqshrunt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"sqshrunt z30.s, z29.d, #32\");\n\n  TEST_SINGLE(sqrshrunb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"sqrshrunb z30.b, z29.h, #1\");\n  TEST_SINGLE(sqrshrunb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"sqrshrunb z30.b, z29.h, #8\");\n  TEST_SINGLE(sqrshrunb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"sqrshrunb z30.h, z29.s, #1\");\n  TEST_SINGLE(sqrshrunb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"sqrshrunb z30.h, z29.s, #16\");\n  TEST_SINGLE(sqrshrunb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"sqrshrunb z30.s, z29.d, #1\");\n  TEST_SINGLE(sqrshrunb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"sqrshrunb z30.s, z29.d, #32\");\n\n  TEST_SINGLE(sqrshrunt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"sqrshrunt z30.b, z29.h, #1\");\n  TEST_SINGLE(sqrshrunt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"sqrshrunt z30.b, z29.h, #8\");\n  TEST_SINGLE(sqrshrunt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"sqrshrunt z30.h, z29.s, #1\");\n  TEST_SINGLE(sqrshrunt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"sqrshrunt z30.h, z29.s, #16\");\n  TEST_SINGLE(sqrshrunt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"sqrshrunt z30.s, z29.d, #1\");\n  TEST_SINGLE(sqrshrunt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"sqrshrunt z30.s, z29.d, #32\");\n\n  TEST_SINGLE(shrnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"shrnb z30.b, z29.h, #1\");\n  TEST_SINGLE(shrnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"shrnb z30.b, z29.h, #8\");\n  TEST_SINGLE(shrnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"shrnb z30.h, z29.s, #1\");\n  TEST_SINGLE(shrnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"shrnb z30.h, z29.s, #16\");\n  TEST_SINGLE(shrnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"shrnb z30.s, z29.d, #1\");\n  TEST_SINGLE(shrnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"shrnb z30.s, z29.d, #32\");\n\n  TEST_SINGLE(shrnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"shrnt z30.b, z29.h, #1\");\n  TEST_SINGLE(shrnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"shrnt z30.b, z29.h, #8\");\n  TEST_SINGLE(shrnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"shrnt z30.h, z29.s, #1\");\n  TEST_SINGLE(shrnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"shrnt z30.h, z29.s, #16\");\n  TEST_SINGLE(shrnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"shrnt z30.s, z29.d, #1\");\n  TEST_SINGLE(shrnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"shrnt z30.s, z29.d, #32\");\n\n  TEST_SINGLE(rshrnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"rshrnb z30.b, z29.h, #1\");\n  TEST_SINGLE(rshrnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"rshrnb z30.b, z29.h, #8\");\n  TEST_SINGLE(rshrnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"rshrnb z30.h, z29.s, #1\");\n  TEST_SINGLE(rshrnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"rshrnb z30.h, z29.s, #16\");\n  TEST_SINGLE(rshrnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"rshrnb z30.s, z29.d, #1\");\n  TEST_SINGLE(rshrnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"rshrnb z30.s, z29.d, #32\");\n\n  TEST_SINGLE(rshrnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"rshrnt z30.b, z29.h, #1\");\n  TEST_SINGLE(rshrnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"rshrnt z30.b, z29.h, #8\");\n  TEST_SINGLE(rshrnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"rshrnt z30.h, z29.s, #1\");\n  TEST_SINGLE(rshrnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"rshrnt z30.h, z29.s, #16\");\n  TEST_SINGLE(rshrnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"rshrnt z30.s, z29.d, #1\");\n  TEST_SINGLE(rshrnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"rshrnt z30.s, z29.d, #32\");\n\n  TEST_SINGLE(sqshrnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"sqshrnb z30.b, z29.h, #1\");\n  TEST_SINGLE(sqshrnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"sqshrnb z30.b, z29.h, #8\");\n  TEST_SINGLE(sqshrnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"sqshrnb z30.h, z29.s, #1\");\n  TEST_SINGLE(sqshrnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"sqshrnb z30.h, z29.s, #16\");\n  TEST_SINGLE(sqshrnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"sqshrnb z30.s, z29.d, #1\");\n  TEST_SINGLE(sqshrnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"sqshrnb z30.s, z29.d, #32\");\n\n  TEST_SINGLE(sqshrnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"sqshrnt z30.b, z29.h, #1\");\n  TEST_SINGLE(sqshrnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"sqshrnt z30.b, z29.h, #8\");\n  TEST_SINGLE(sqshrnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"sqshrnt z30.h, z29.s, #1\");\n  TEST_SINGLE(sqshrnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"sqshrnt z30.h, z29.s, #16\");\n  TEST_SINGLE(sqshrnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"sqshrnt z30.s, z29.d, #1\");\n  TEST_SINGLE(sqshrnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"sqshrnt z30.s, z29.d, #32\");\n\n  TEST_SINGLE(sqrshrnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"sqrshrnb z30.b, z29.h, #1\");\n  TEST_SINGLE(sqrshrnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"sqrshrnb z30.b, z29.h, #8\");\n  TEST_SINGLE(sqrshrnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"sqrshrnb z30.h, z29.s, #1\");\n  TEST_SINGLE(sqrshrnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"sqrshrnb z30.h, z29.s, #16\");\n  TEST_SINGLE(sqrshrnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"sqrshrnb z30.s, z29.d, #1\");\n  TEST_SINGLE(sqrshrnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"sqrshrnb z30.s, z29.d, #32\");\n\n  TEST_SINGLE(sqrshrnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"sqrshrnt z30.b, z29.h, #1\");\n  TEST_SINGLE(sqrshrnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"sqrshrnt z30.b, z29.h, #8\");\n  TEST_SINGLE(sqrshrnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"sqrshrnt z30.h, z29.s, #1\");\n  TEST_SINGLE(sqrshrnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"sqrshrnt z30.h, z29.s, #16\");\n  TEST_SINGLE(sqrshrnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"sqrshrnt z30.s, z29.d, #1\");\n  TEST_SINGLE(sqrshrnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"sqrshrnt z30.s, z29.d, #32\");\n\n  TEST_SINGLE(uqshrnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"uqshrnb z30.b, z29.h, #1\");\n  TEST_SINGLE(uqshrnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"uqshrnb z30.b, z29.h, #8\");\n  TEST_SINGLE(uqshrnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"uqshrnb z30.h, z29.s, #1\");\n  TEST_SINGLE(uqshrnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"uqshrnb z30.h, z29.s, #16\");\n  TEST_SINGLE(uqshrnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"uqshrnb z30.s, z29.d, #1\");\n  TEST_SINGLE(uqshrnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"uqshrnb z30.s, z29.d, #32\");\n\n  TEST_SINGLE(uqshrnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"uqshrnt z30.b, z29.h, #1\");\n  TEST_SINGLE(uqshrnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"uqshrnt z30.b, z29.h, #8\");\n  TEST_SINGLE(uqshrnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"uqshrnt z30.h, z29.s, #1\");\n  TEST_SINGLE(uqshrnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"uqshrnt z30.h, z29.s, #16\");\n  TEST_SINGLE(uqshrnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"uqshrnt z30.s, z29.d, #1\");\n  TEST_SINGLE(uqshrnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"uqshrnt z30.s, z29.d, #32\");\n\n  TEST_SINGLE(uqrshrnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"uqrshrnb z30.b, z29.h, #1\");\n  TEST_SINGLE(uqrshrnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"uqrshrnb z30.b, z29.h, #8\");\n  TEST_SINGLE(uqrshrnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"uqrshrnb z30.h, z29.s, #1\");\n  TEST_SINGLE(uqrshrnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"uqrshrnb z30.h, z29.s, #16\");\n  TEST_SINGLE(uqrshrnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"uqrshrnb z30.s, z29.d, #1\");\n  TEST_SINGLE(uqrshrnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"uqrshrnb z30.s, z29.d, #32\");\n\n  TEST_SINGLE(uqrshrnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 1), \"uqrshrnt z30.b, z29.h, #1\");\n  TEST_SINGLE(uqrshrnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, 8), \"uqrshrnt z30.b, z29.h, #8\");\n  TEST_SINGLE(uqrshrnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 1), \"uqrshrnt z30.h, z29.s, #1\");\n  TEST_SINGLE(uqrshrnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, 16), \"uqrshrnt z30.h, z29.s, #16\");\n  TEST_SINGLE(uqrshrnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 1), \"uqrshrnt z30.s, z29.d, #1\");\n  TEST_SINGLE(uqrshrnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, 32), \"uqrshrnt z30.s, z29.d, #32\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 integer add/subtract narrow high part\") {\n  TEST_SINGLE(addhnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"addhnb z30.b, z29.h, z28.h\");\n  TEST_SINGLE(addhnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"addhnb z30.h, z29.s, z28.s\");\n  TEST_SINGLE(addhnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"addhnb z30.s, z29.d, z28.d\");\n\n  TEST_SINGLE(addhnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"addhnt z30.b, z29.h, z28.h\");\n  TEST_SINGLE(addhnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"addhnt z30.h, z29.s, z28.s\");\n  TEST_SINGLE(addhnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"addhnt z30.s, z29.d, z28.d\");\n\n  TEST_SINGLE(raddhnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"raddhnb z30.b, z29.h, z28.h\");\n  TEST_SINGLE(raddhnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"raddhnb z30.h, z29.s, z28.s\");\n  TEST_SINGLE(raddhnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"raddhnb z30.s, z29.d, z28.d\");\n\n  TEST_SINGLE(raddhnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"raddhnt z30.b, z29.h, z28.h\");\n  TEST_SINGLE(raddhnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"raddhnt z30.h, z29.s, z28.s\");\n  TEST_SINGLE(raddhnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"raddhnt z30.s, z29.d, z28.d\");\n\n  TEST_SINGLE(subhnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"subhnb z30.b, z29.h, z28.h\");\n  TEST_SINGLE(subhnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"subhnb z30.h, z29.s, z28.s\");\n  TEST_SINGLE(subhnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"subhnb z30.s, z29.d, z28.d\");\n\n  TEST_SINGLE(subhnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"subhnt z30.b, z29.h, z28.h\");\n  TEST_SINGLE(subhnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"subhnt z30.h, z29.s, z28.s\");\n  TEST_SINGLE(subhnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"subhnt z30.s, z29.d, z28.d\");\n\n  TEST_SINGLE(rsubhnb(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"rsubhnb z30.b, z29.h, z28.h\");\n  TEST_SINGLE(rsubhnb(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"rsubhnb z30.h, z29.s, z28.s\");\n  TEST_SINGLE(rsubhnb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"rsubhnb z30.s, z29.d, z28.d\");\n\n  TEST_SINGLE(rsubhnt(SubRegSize::i8Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"rsubhnt z30.b, z29.h, z28.h\");\n  TEST_SINGLE(rsubhnt(SubRegSize::i16Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"rsubhnt z30.h, z29.s, z28.s\");\n  TEST_SINGLE(rsubhnt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"rsubhnt z30.s, z29.d, z28.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 Histogram Computation\") {\n  TEST_SINGLE(histcnt(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), ZReg::z29, ZReg::z28), \"histcnt z30.s, p6/z, z29.s, z28.s\");\n  TEST_SINGLE(histcnt(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), ZReg::z29, ZReg::z28), \"histcnt z30.d, p6/z, z29.d, z28.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 Histogram Computation - Segment\") {\n  TEST_SINGLE(histseg(ZReg::z30, ZReg::z29, ZReg::z28), \"histseg z30.b, z29.b, z28.b\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 crypto unary operations\") {\n  TEST_SINGLE(aesimc(ZReg::z7, ZReg::z7), \"aesimc z7.b, z7.b\");\n  TEST_SINGLE(aesimc(ZReg::z31, ZReg::z31), \"aesimc z31.b, z31.b\");\n\n  TEST_SINGLE(aesmc(ZReg::z7, ZReg::z7), \"aesmc z7.b, z7.b\");\n  TEST_SINGLE(aesmc(ZReg::z31, ZReg::z31), \"aesmc z31.b, z31.b\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 crypto destructive binary operations\") {\n  TEST_SINGLE(aesd(ZReg::z7, ZReg::z7, ZReg::z8), \"aesd z7.b, z7.b, z8.b\");\n  TEST_SINGLE(aesd(ZReg::z30, ZReg::z30, ZReg::z31), \"aesd z30.b, z30.b, z31.b\");\n\n  TEST_SINGLE(aese(ZReg::z7, ZReg::z7, ZReg::z8), \"aese z7.b, z7.b, z8.b\");\n  TEST_SINGLE(aese(ZReg::z30, ZReg::z30, ZReg::z31), \"aese z30.b, z30.b, z31.b\");\n\n  TEST_SINGLE(sm4e(ZReg::z7, ZReg::z7, ZReg::z8), \"sm4e z7.s, z7.s, z8.s\");\n  TEST_SINGLE(sm4e(ZReg::z30, ZReg::z30, ZReg::z31), \"sm4e z30.s, z30.s, z31.s\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE2 crypto constructive binary operations\") {\n  TEST_SINGLE(sm4ekey(ZReg::z0, ZReg::z1, ZReg::z2), \"sm4ekey z0.s, z1.s, z2.s\");\n  TEST_SINGLE(sm4ekey(ZReg::z29, ZReg::z30, ZReg::z31), \"sm4ekey z29.s, z30.s, z31.s\");\n\n  TEST_SINGLE(rax1(ZReg::z0, ZReg::z1, ZReg::z2), \"rax1 z0.d, z1.d, z2.d\");\n  TEST_SINGLE(rax1(ZReg::z29, ZReg::z30, ZReg::z31), \"rax1 z29.d, z30.d, z31.d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE BFloat16 floating-point dot product (indexed)\") {\n  // TODO: Implement in emitter.\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point multiply-add long (indexed)\") {\n  TEST_SINGLE(fmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 0), \"fmlalb z30.s, z29.h, z7.h[0]\");\n  TEST_SINGLE(fmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 3), \"fmlalb z30.s, z29.h, z7.h[3]\");\n  TEST_SINGLE(fmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 7), \"fmlalb z30.s, z29.h, z7.h[7]\");\n\n  TEST_SINGLE(fmlalt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 0), \"fmlalt z30.s, z29.h, z7.h[0]\");\n  TEST_SINGLE(fmlalt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 3), \"fmlalt z30.s, z29.h, z7.h[3]\");\n  TEST_SINGLE(fmlalt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 7), \"fmlalt z30.s, z29.h, z7.h[7]\");\n\n  TEST_SINGLE(fmlslb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 0), \"fmlslb z30.s, z29.h, z7.h[0]\");\n  TEST_SINGLE(fmlslb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 3), \"fmlslb z30.s, z29.h, z7.h[3]\");\n  TEST_SINGLE(fmlslb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 7), \"fmlslb z30.s, z29.h, z7.h[7]\");\n\n  TEST_SINGLE(fmlslt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 0), \"fmlslt z30.s, z29.h, z7.h[0]\");\n  TEST_SINGLE(fmlslt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 3), \"fmlslt z30.s, z29.h, z7.h[3]\");\n  TEST_SINGLE(fmlslt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 7), \"fmlslt z30.s, z29.h, z7.h[7]\");\n\n  // XXX: vixl's diassembler doesn't support these. Re-enable when it does\n  //      or upon switching disassemblers.\n\n  // TEST_SINGLE(bfmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 0), \"bfmlalb z30.s, z29.h, z7.h[0]\");\n  // TEST_SINGLE(bfmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 3), \"bfmlalb z30.s, z29.h, z7.h[3]\");\n  // TEST_SINGLE(bfmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 7), \"bfmlalb z30.s, z29.h, z7.h[7]\");\n\n  // TEST_SINGLE(bfmlalt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 0), \"bfmlalt z30.s, z29.h, z7.h[0]\");\n  // TEST_SINGLE(bfmlalt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 3), \"bfmlalt z30.s, z29.h, z7.h[3]\");\n  // TEST_SINGLE(bfmlalt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 7), \"bfmlalt z30.s, z29.h, z7.h[7]\");\n\n  // TEST_SINGLE(bfmlslb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 0), \"bfmlslb z30.s, z29.h, z7.h[0]\");\n  // TEST_SINGLE(bfmlslb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 3), \"bfmlslb z30.s, z29.h, z7.h[3]\");\n  // TEST_SINGLE(bfmlslb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 7), \"bfmlslb z30.s, z29.h, z7.h[7]\");\n\n  // TEST_SINGLE(bfmlslt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 0), \"bfmlslt z30.s, z29.h, z7.h[0]\");\n  // TEST_SINGLE(bfmlslt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 3), \"bfmlslt z30.s, z29.h, z7.h[3]\");\n  // TEST_SINGLE(bfmlslt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z7, 7), \"bfmlslt z30.s, z29.h, z7.h[7]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE BFloat16 floating-point dot product\") {\n  // TODO: Implement in emitter.\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point multiply-add long\") {\n  TEST_SINGLE(fmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmlalb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(fmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmlalb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(fmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmlalb z30.s, z29.h, z28.h\");\n\n  TEST_SINGLE(fmlalt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmlalt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(fmlalt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmlalt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(fmlalt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmlalt z30.s, z29.h, z28.h\");\n\n  TEST_SINGLE(fmlslb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmlslb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(fmlslb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmlslb z30.s, z29.h, z28.h\");\n  TEST_SINGLE(fmlslb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmlslb z30.s, z29.h, z28.h\");\n\n  TEST_SINGLE(fmlslt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmlslt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(fmlslt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmlslt z30.s, z29.h, z28.h\");\n  TEST_SINGLE(fmlslt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"fmlslt z30.s, z29.h, z28.h\");\n\n  // XXX: vixl's diassembler doesn't support these. Re-enable when it does\n  //      or upon switching disassemblers.\n\n  // TEST_SINGLE(bfmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bfmlalb z30.s, z29.h, z28.h\");\n  // TEST_SINGLE(bfmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bfmlalb z30.s, z29.h, z28.h\");\n  // TEST_SINGLE(bfmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bfmlalb z30.s, z29.h, z28.h\");\n\n  // TEST_SINGLE(bfmlalt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bfmlalt z30.s, z29.h, z28.h\");\n  // TEST_SINGLE(bfmlalt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bfmlalt z30.s, z29.h, z28.h\");\n  // TEST_SINGLE(bfmlalt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bfmlalt z30.s, z29.h, z28.h\");\n\n  // TEST_SINGLE(bfmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bfmlslb z30.s, z29.h, z28.h\");\n  // TEST_SINGLE(bfmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bfmlslb z30.s, z29.h, z28.h\");\n  // TEST_SINGLE(bfmlalb(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bfmlslb z30.s, z29.h, z28.h\");\n\n  // TEST_SINGLE(bfmlslt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bfmlslt z30.s, z29.h, z28.h\");\n  // TEST_SINGLE(bfmlslt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bfmlslt z30.s, z29.h, z28.h\");\n  // TEST_SINGLE(bfmlslt(SubRegSize::i32Bit, ZReg::z30, ZReg::z29, ZReg::z28), \"bfmlslt z30.s, z29.h, z28.h\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point arithmetic (predicated)\") {\n  TEST_SINGLE(ftmad(SubRegSize::i16Bit, ZReg::z30, ZReg::z30, ZReg::z28, 7), \"ftmad z30.h, z30.h, z28.h, #7\");\n  TEST_SINGLE(ftmad(SubRegSize::i32Bit, ZReg::z30, ZReg::z30, ZReg::z28, 7), \"ftmad z30.s, z30.s, z28.s, #7\");\n  TEST_SINGLE(ftmad(SubRegSize::i64Bit, ZReg::z30, ZReg::z30, ZReg::z28, 7), \"ftmad z30.d, z30.d, z28.d, #7\");\n\n  // TEST_SINGLE(fadd(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fadd z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fadd(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fadd z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fadd(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fadd z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fadd(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fadd z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fadd(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fadd z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fsub(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fsub z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fsub(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fsub z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fsub(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fsub z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fsub(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fsub z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fsub(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fsub z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fmul(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fmul z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fmul(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmul z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fmul(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmul z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fmul(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmul z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fmul(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmul z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fsubr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fsubr z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fsubr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fsubr z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fsubr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fsubr z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fsubr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fsubr z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fsubr(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fsubr z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fmaxnm(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fmaxnm z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fmaxnm(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmaxnm z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fmaxnm(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmaxnm z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fmaxnm(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmaxnm z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fmaxnm(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmaxnm z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fminnm(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fminnm z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fminnm(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fminnm z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fminnm(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fminnm z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fminnm(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fminnm z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fminnm(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fminnm z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fmax(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fmax z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fmax(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmax z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fmax(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmax z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fmax(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmax z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fmax(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmax z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fmin(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fmin z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fmin(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmin z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fmin(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmin z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fmin(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmin z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fmin(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmin z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fabd(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fabd z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fabd(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fabd z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fabd(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fabd z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fabd(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fabd z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fabd(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fabd z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fscale(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fscale z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fscale(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fscale z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fscale(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fscale z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fscale(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fscale z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fscale(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fscale z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fmulx(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fmulx z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fmulx(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmulx z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fmulx(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmulx z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fmulx(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmulx z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fmulx(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fmulx z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fdiv(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fdiv z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fdiv(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fdiv z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fdiv(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fdiv z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fdiv(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fdiv z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fdiv(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fdiv z30.q, p6/m, z30.q, z28.q\");\n\n  // TEST_SINGLE(fdivr(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28),   \"fdivr z30.b, p6/m, z30.b, z28.b\");\n  TEST_SINGLE(fdivr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fdivr z30.h, p6/m, z30.h, z28.h\");\n  TEST_SINGLE(fdivr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fdivr z30.s, p6/m, z30.s, z28.s\");\n  TEST_SINGLE(fdivr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fdivr z30.d, p6/m, z30.d, z28.d\");\n  // TEST_SINGLE(fdivr(SubRegSize::i128Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z30, ZReg::z28), \"fdivr z30.q, p6/m, z30.q, z28.q\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point arithmetic with immediate (predicated)\") {\n  TEST_SINGLE(fadd(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_0_5), \"fadd z30.h, p6/m, z30.h, #0.5\");\n  TEST_SINGLE(fadd(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_0_5), \"fadd z30.s, p6/m, z30.s, #0.5\");\n  TEST_SINGLE(fadd(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_0_5), \"fadd z30.d, p6/m, z30.d, #0.5\");\n  TEST_SINGLE(fadd(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_1_0), \"fadd z30.h, p6/m, z30.h, #1.0\");\n  TEST_SINGLE(fadd(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_1_0), \"fadd z30.s, p6/m, z30.s, #1.0\");\n  TEST_SINGLE(fadd(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_1_0), \"fadd z30.d, p6/m, z30.d, #1.0\");\n\n  TEST_SINGLE(fsub(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_0_5), \"fsub z30.h, p6/m, z30.h, #0.5\");\n  TEST_SINGLE(fsub(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_0_5), \"fsub z30.s, p6/m, z30.s, #0.5\");\n  TEST_SINGLE(fsub(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_0_5), \"fsub z30.d, p6/m, z30.d, #0.5\");\n  TEST_SINGLE(fsub(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_1_0), \"fsub z30.h, p6/m, z30.h, #1.0\");\n  TEST_SINGLE(fsub(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_1_0), \"fsub z30.s, p6/m, z30.s, #1.0\");\n  TEST_SINGLE(fsub(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_1_0), \"fsub z30.d, p6/m, z30.d, #1.0\");\n\n  TEST_SINGLE(fsubr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_0_5), \"fsubr z30.h, p6/m, z30.h, #0.5\");\n  TEST_SINGLE(fsubr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_0_5), \"fsubr z30.s, p6/m, z30.s, #0.5\");\n  TEST_SINGLE(fsubr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_0_5), \"fsubr z30.d, p6/m, z30.d, #0.5\");\n  TEST_SINGLE(fsubr(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_1_0), \"fsubr z30.h, p6/m, z30.h, #1.0\");\n  TEST_SINGLE(fsubr(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_1_0), \"fsubr z30.s, p6/m, z30.s, #1.0\");\n  TEST_SINGLE(fsubr(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFAddSubImm::_1_0), \"fsubr z30.d, p6/m, z30.d, #1.0\");\n\n  TEST_SINGLE(fmul(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFMulImm::_0_5), \"fmul z30.h, p6/m, z30.h, #0.5\");\n  TEST_SINGLE(fmul(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFMulImm::_0_5), \"fmul z30.s, p6/m, z30.s, #0.5\");\n  TEST_SINGLE(fmul(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFMulImm::_0_5), \"fmul z30.d, p6/m, z30.d, #0.5\");\n  TEST_SINGLE(fmul(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFMulImm::_2_0), \"fmul z30.h, p6/m, z30.h, #2.0\");\n  TEST_SINGLE(fmul(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFMulImm::_2_0), \"fmul z30.s, p6/m, z30.s, #2.0\");\n  TEST_SINGLE(fmul(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFMulImm::_2_0), \"fmul z30.d, p6/m, z30.d, #2.0\");\n\n  TEST_SINGLE(fmaxnm(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_0_0), \"fmaxnm z30.h, p6/m, z30.h, #0.0\");\n  TEST_SINGLE(fmaxnm(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_0_0), \"fmaxnm z30.s, p6/m, z30.s, #0.0\");\n  TEST_SINGLE(fmaxnm(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_0_0), \"fmaxnm z30.d, p6/m, z30.d, #0.0\");\n  TEST_SINGLE(fmaxnm(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_1_0), \"fmaxnm z30.h, p6/m, z30.h, #1.0\");\n  TEST_SINGLE(fmaxnm(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_1_0), \"fmaxnm z30.s, p6/m, z30.s, #1.0\");\n  TEST_SINGLE(fmaxnm(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_1_0), \"fmaxnm z30.d, p6/m, z30.d, #1.0\");\n\n  TEST_SINGLE(fminnm(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_0_0), \"fminnm z30.h, p6/m, z30.h, #0.0\");\n  TEST_SINGLE(fminnm(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_0_0), \"fminnm z30.s, p6/m, z30.s, #0.0\");\n  TEST_SINGLE(fminnm(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_0_0), \"fminnm z30.d, p6/m, z30.d, #0.0\");\n  TEST_SINGLE(fminnm(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_1_0), \"fminnm z30.h, p6/m, z30.h, #1.0\");\n  TEST_SINGLE(fminnm(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_1_0), \"fminnm z30.s, p6/m, z30.s, #1.0\");\n  TEST_SINGLE(fminnm(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_1_0), \"fminnm z30.d, p6/m, z30.d, #1.0\");\n\n  TEST_SINGLE(fmax(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_0_0), \"fmax z30.h, p6/m, z30.h, #0.0\");\n  TEST_SINGLE(fmax(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_0_0), \"fmax z30.s, p6/m, z30.s, #0.0\");\n  TEST_SINGLE(fmax(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_0_0), \"fmax z30.d, p6/m, z30.d, #0.0\");\n  TEST_SINGLE(fmax(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_1_0), \"fmax z30.h, p6/m, z30.h, #1.0\");\n  TEST_SINGLE(fmax(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_1_0), \"fmax z30.s, p6/m, z30.s, #1.0\");\n  TEST_SINGLE(fmax(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_1_0), \"fmax z30.d, p6/m, z30.d, #1.0\");\n\n  TEST_SINGLE(fmin(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_0_0), \"fmin z30.h, p6/m, z30.h, #0.0\");\n  TEST_SINGLE(fmin(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_0_0), \"fmin z30.s, p6/m, z30.s, #0.0\");\n  TEST_SINGLE(fmin(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_0_0), \"fmin z30.d, p6/m, z30.d, #0.0\");\n  TEST_SINGLE(fmin(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_1_0), \"fmin z30.h, p6/m, z30.h, #1.0\");\n  TEST_SINGLE(fmin(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_1_0), \"fmin z30.s, p6/m, z30.s, #1.0\");\n  TEST_SINGLE(fmin(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), SVEFMaxMinImm::_1_0), \"fmin z30.d, p6/m, z30.d, #1.0\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE Memory - 32-bit Gather and Unsized Contiguous\") {\n  TEST_SINGLE(ld1b<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ld1b {z30.s}, p6/z, [x30, z31.s, uxtw]\");\n  TEST_SINGLE(ld1b<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ld1b {z30.s}, p6/z, [x30, z31.s, sxtw]\");\n  TEST_SINGLE(ld1b<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ld1b {z30.d}, p6/z, [x30, z31.d, uxtw]\");\n  TEST_SINGLE(ld1b<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ld1b {z30.d}, p6/z, [x30, z31.d, sxtw]\");\n  TEST_SINGLE(ld1b<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)),\n              \"ld1b {z30.d}, p6/z, [x30, z31.d]\");\n\n  TEST_SINGLE(ld1b<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ld1b {z30.s}, p6/z, [z31.s]\");\n  TEST_SINGLE(ld1b<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 31)), \"ld1b {z30.s}, p6/z, [z31.s, #31]\");\n  TEST_SINGLE(ld1b<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ld1b {z30.d}, p6/z, [z31.d]\");\n  TEST_SINGLE(ld1b<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 31)), \"ld1b {z30.d}, p6/z, [z31.d, #31]\");\n\n  TEST_SINGLE(ld1sb<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ld1sb {z30.s}, p6/z, [x30, z31.s, uxtw]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ld1sb {z30.s}, p6/z, [x30, z31.s, sxtw]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ld1sb {z30.d}, p6/z, [x30, z31.d, uxtw]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ld1sb {z30.d}, p6/z, [x30, z31.d, sxtw]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)),\n              \"ld1sb {z30.d}, p6/z, [x30, z31.d]\");\n\n  TEST_SINGLE(ld1sb<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ld1sb {z30.s}, p6/z, [z31.s]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 31)), \"ld1sb {z30.s}, p6/z, [z31.s, #31]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ld1sb {z30.d}, p6/z, [z31.d]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 31)), \"ld1sb {z30.d}, p6/z, [z31.d, #31]\");\n\n  TEST_SINGLE(ld1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)), \"ld1d {z30.d}, p6/z, \"\n                                                                                                                 \"[x30, z31.d, uxtw]\");\n  TEST_SINGLE(ld1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)), \"ld1d {z30.d}, p6/z, \"\n                                                                                                                 \"[x30, z31.d, sxtw]\");\n  TEST_SINGLE(ld1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 3)), \"ld1d {z30.d}, p6/z, \"\n                                                                                                                 \"[x30, z31.d, uxtw #3]\");\n  TEST_SINGLE(ld1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 3)), \"ld1d {z30.d}, p6/z, \"\n                                                                                                                 \"[x30, z31.d, sxtw #3]\");\n  TEST_SINGLE(ld1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_LSL, 3)), \"ld1d {z30.d}, p6/z, [x30, \"\n                                                                                                                \"z31.d, lsl #3]\");\n  TEST_SINGLE(ld1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)), \"ld1d {z30.d}, p6/z, \"\n                                                                                                                 \"[x30, z31.d]\");\n\n  TEST_SINGLE(ld1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ld1d {z30.d}, p6/z, [z31.d]\");\n  TEST_SINGLE(ld1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 248)), \"ld1d {z30.d}, p6/z, [z31.d, #248]\");\n\n  TEST_SINGLE(ld1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 1)),\n              \"ld1h {z30.s}, p6/z, [x30, z31.s, uxtw #1]\");\n  TEST_SINGLE(ld1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 1)),\n              \"ld1h {z30.s}, p6/z, [x30, z31.s, sxtw #1]\");\n  TEST_SINGLE(ld1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 1)),\n              \"ld1h {z30.d}, p6/z, [x30, z31.d, uxtw #1]\");\n  TEST_SINGLE(ld1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 1)),\n              \"ld1h {z30.d}, p6/z, [x30, z31.d, sxtw #1]\");\n  TEST_SINGLE(ld1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_LSL, 1)),\n              \"ld1h {z30.d}, p6/z, [x30, z31.d, lsl #1]\");\n  TEST_SINGLE(ld1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)),\n              \"ld1h {z30.d}, p6/z, [x30, z31.d]\");\n\n  TEST_SINGLE(ld1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ld1h {z30.s}, p6/z, [x30, z31.s, uxtw]\");\n  TEST_SINGLE(ld1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ld1h {z30.s}, p6/z, [x30, z31.s, sxtw]\");\n  TEST_SINGLE(ld1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ld1h {z30.d}, p6/z, [x30, z31.d, uxtw]\");\n  TEST_SINGLE(ld1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ld1h {z30.d}, p6/z, [x30, z31.d, sxtw]\");\n\n  TEST_SINGLE(ld1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ld1h {z30.s}, p6/z, [z31.s]\");\n  TEST_SINGLE(ld1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 62)), \"ld1h {z30.s}, p6/z, [z31.s, #62]\");\n  TEST_SINGLE(ld1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ld1h {z30.d}, p6/z, [z31.d]\");\n  TEST_SINGLE(ld1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 62)), \"ld1h {z30.d}, p6/z, [z31.d, #62]\");\n\n  TEST_SINGLE(ld1sh<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 1)),\n              \"ld1sh {z30.s}, p6/z, [x30, z31.s, uxtw #1]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 1)),\n              \"ld1sh {z30.s}, p6/z, [x30, z31.s, sxtw #1]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 1)),\n              \"ld1sh {z30.d}, p6/z, [x30, z31.d, uxtw #1]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 1)),\n              \"ld1sh {z30.d}, p6/z, [x30, z31.d, sxtw #1]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_LSL, 1)),\n              \"ld1sh {z30.d}, p6/z, [x30, z31.d, lsl #1]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)),\n              \"ld1sh {z30.d}, p6/z, [x30, z31.d]\");\n\n  TEST_SINGLE(ld1sh<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ld1sh {z30.s}, p6/z, [x30, z31.s, uxtw]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ld1sh {z30.s}, p6/z, [x30, z31.s, sxtw]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ld1sh {z30.d}, p6/z, [x30, z31.d, uxtw]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ld1sh {z30.d}, p6/z, [x30, z31.d, sxtw]\");\n\n  TEST_SINGLE(ld1sh<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ld1sh {z30.s}, p6/z, [z31.s]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 62)), \"ld1sh {z30.s}, p6/z, [z31.s, #62]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ld1sh {z30.d}, p6/z, [z31.d]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 62)), \"ld1sh {z30.d}, p6/z, [z31.d, #62]\");\n\n  TEST_SINGLE(ld1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 2)),\n              \"ld1w {z30.s}, p6/z, [x30, z31.s, uxtw #2]\");\n  TEST_SINGLE(ld1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 2)),\n              \"ld1w {z30.s}, p6/z, [x30, z31.s, sxtw #2]\");\n  TEST_SINGLE(ld1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 2)),\n              \"ld1w {z30.d}, p6/z, [x30, z31.d, uxtw #2]\");\n  TEST_SINGLE(ld1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 2)),\n              \"ld1w {z30.d}, p6/z, [x30, z31.d, sxtw #2]\");\n  TEST_SINGLE(ld1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_LSL, 2)),\n              \"ld1w {z30.d}, p6/z, [x30, z31.d, lsl #2]\");\n\n  TEST_SINGLE(ld1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ld1w {z30.s}, p6/z, [x30, z31.s, uxtw]\");\n  TEST_SINGLE(ld1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ld1w {z30.s}, p6/z, [x30, z31.s, sxtw]\");\n  TEST_SINGLE(ld1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ld1w {z30.d}, p6/z, [x30, z31.d, uxtw]\");\n  TEST_SINGLE(ld1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ld1w {z30.d}, p6/z, [x30, z31.d, sxtw]\");\n  TEST_SINGLE(ld1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)),\n              \"ld1w {z30.d}, p6/z, [x30, z31.d]\");\n\n  TEST_SINGLE(ld1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ld1w {z30.s}, p6/z, [z31.s]\");\n  TEST_SINGLE(ld1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 124)), \"ld1w {z30.s}, p6/z, [z31.s, #124]\");\n  TEST_SINGLE(ld1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ld1w {z30.d}, p6/z, [z31.d]\");\n  TEST_SINGLE(ld1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 124)), \"ld1w {z30.d}, p6/z, [z31.d, #124]\");\n\n  TEST_SINGLE(ld1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)), \"ld1sw {z30.d}, p6/z, \"\n                                                                                                                  \"[x30, z31.d, uxtw]\");\n  TEST_SINGLE(ld1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)), \"ld1sw {z30.d}, p6/z, \"\n                                                                                                                  \"[x30, z31.d, sxtw]\");\n  TEST_SINGLE(ld1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 2)), \"ld1sw {z30.d}, p6/z, \"\n                                                                                                                  \"[x30, z31.d, uxtw #2]\");\n  TEST_SINGLE(ld1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 2)), \"ld1sw {z30.d}, p6/z, \"\n                                                                                                                  \"[x30, z31.d, sxtw #2]\");\n  TEST_SINGLE(ld1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_LSL, 2)), \"ld1sw {z30.d}, p6/z, \"\n                                                                                                                 \"[x30, z31.d, lsl #2]\");\n  TEST_SINGLE(ld1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)), \"ld1sw {z30.d}, p6/z, \"\n                                                                                                                  \"[x30, z31.d]\");\n\n  TEST_SINGLE(ld1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ld1sw {z30.d}, p6/z, [z31.d]\");\n  TEST_SINGLE(ld1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 124)), \"ld1sw {z30.d}, p6/z, [z31.d, #124]\");\n\n  TEST_SINGLE(ldff1b<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ldff1b {z30.s}, p6/z, [x30, z31.s, uxtw]\");\n  TEST_SINGLE(ldff1b<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ldff1b {z30.s}, p6/z, [x30, z31.s, sxtw]\");\n  TEST_SINGLE(ldff1b<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ldff1b {z30.d}, p6/z, [x30, z31.d, uxtw]\");\n  TEST_SINGLE(ldff1b<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ldff1b {z30.d}, p6/z, [x30, z31.d, sxtw]\");\n  TEST_SINGLE(ldff1b<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)),\n              \"ldff1b {z30.d}, p6/z, [x30, z31.d]\");\n\n  TEST_SINGLE(ldff1b<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ldff1b {z30.s}, p6/z, [z31.s]\");\n  TEST_SINGLE(ldff1b<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 31)), \"ldff1b {z30.s}, p6/z, [z31.s, \"\n                                                                                                       \"#31]\");\n  TEST_SINGLE(ldff1b<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ldff1b {z30.d}, p6/z, [z31.d]\");\n  TEST_SINGLE(ldff1b<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 31)), \"ldff1b {z30.d}, p6/z, [z31.d, \"\n                                                                                                       \"#31]\");\n\n  TEST_SINGLE(ldff1sb<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ldff1sb {z30.s}, p6/z, [x30, z31.s, uxtw]\");\n  TEST_SINGLE(ldff1sb<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ldff1sb {z30.s}, p6/z, [x30, z31.s, sxtw]\");\n  TEST_SINGLE(ldff1sb<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ldff1sb {z30.d}, p6/z, [x30, z31.d, uxtw]\");\n  TEST_SINGLE(ldff1sb<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ldff1sb {z30.d}, p6/z, [x30, z31.d, sxtw]\");\n  TEST_SINGLE(ldff1sb<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)),\n              \"ldff1sb {z30.d}, p6/z, [x30, z31.d]\");\n\n  TEST_SINGLE(ldff1sb<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ldff1sb {z30.s}, p6/z, [z31.s]\");\n  TEST_SINGLE(ldff1sb<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 31)), \"ldff1sb {z30.s}, p6/z, [z31.s, \"\n                                                                                                        \"#31]\");\n  TEST_SINGLE(ldff1sb<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ldff1sb {z30.d}, p6/z, [z31.d]\");\n  TEST_SINGLE(ldff1sb<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 31)), \"ldff1sb {z30.d}, p6/z, [z31.d, \"\n                                                                                                        \"#31]\");\n\n  TEST_SINGLE(ldff1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)), \"ldff1d {z30.d}, p6/z, \"\n                                                                                                                   \"[x30, z31.d, uxtw]\");\n  TEST_SINGLE(ldff1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)), \"ldff1d {z30.d}, p6/z, \"\n                                                                                                                   \"[x30, z31.d, sxtw]\");\n  TEST_SINGLE(ldff1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 3)), \"ldff1d {z30.d}, p6/z, \"\n                                                                                                                   \"[x30, z31.d, uxtw #3]\");\n  TEST_SINGLE(ldff1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 3)), \"ldff1d {z30.d}, p6/z, \"\n                                                                                                                   \"[x30, z31.d, sxtw #3]\");\n  TEST_SINGLE(ldff1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_LSL, 3)), \"ldff1d {z30.d}, p6/z, \"\n                                                                                                                  \"[x30, z31.d, lsl #3]\");\n  TEST_SINGLE(ldff1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)), \"ldff1d {z30.d}, p6/z, \"\n                                                                                                                   \"[x30, z31.d]\");\n\n  TEST_SINGLE(ldff1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ldff1d {z30.d}, p6/z, [z31.d]\");\n  TEST_SINGLE(ldff1d(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 248)), \"ldff1d {z30.d}, p6/z, [z31.d, #248]\");\n\n  TEST_SINGLE(ldff1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 1)),\n              \"ldff1h {z30.s}, p6/z, [x30, z31.s, uxtw #1]\");\n  TEST_SINGLE(ldff1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 1)),\n              \"ldff1h {z30.s}, p6/z, [x30, z31.s, sxtw #1]\");\n  TEST_SINGLE(ldff1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 1)),\n              \"ldff1h {z30.d}, p6/z, [x30, z31.d, uxtw #1]\");\n  TEST_SINGLE(ldff1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 1)),\n              \"ldff1h {z30.d}, p6/z, [x30, z31.d, sxtw #1]\");\n  TEST_SINGLE(ldff1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_LSL, 1)),\n              \"ldff1h {z30.d}, p6/z, [x30, z31.d, lsl #1]\");\n  TEST_SINGLE(ldff1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)),\n              \"ldff1h {z30.d}, p6/z, [x30, z31.d]\");\n\n  TEST_SINGLE(ldff1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ldff1h {z30.s}, p6/z, [x30, z31.s, uxtw]\");\n  TEST_SINGLE(ldff1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ldff1h {z30.s}, p6/z, [x30, z31.s, sxtw]\");\n  TEST_SINGLE(ldff1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ldff1h {z30.d}, p6/z, [x30, z31.d, uxtw]\");\n  TEST_SINGLE(ldff1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ldff1h {z30.d}, p6/z, [x30, z31.d, sxtw]\");\n\n  TEST_SINGLE(ldff1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ldff1h {z30.s}, p6/z, [z31.s]\");\n  TEST_SINGLE(ldff1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 62)), \"ldff1h {z30.s}, p6/z, [z31.s, \"\n                                                                                                       \"#62]\");\n  TEST_SINGLE(ldff1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ldff1h {z30.d}, p6/z, [z31.d]\");\n  TEST_SINGLE(ldff1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 62)), \"ldff1h {z30.d}, p6/z, [z31.d, \"\n                                                                                                       \"#62]\");\n\n  TEST_SINGLE(ldff1sh<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 1)),\n              \"ldff1sh {z30.s}, p6/z, [x30, z31.s, uxtw #1]\");\n  TEST_SINGLE(ldff1sh<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 1)),\n              \"ldff1sh {z30.s}, p6/z, [x30, z31.s, sxtw #1]\");\n  TEST_SINGLE(ldff1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 1)),\n              \"ldff1sh {z30.d}, p6/z, [x30, z31.d, uxtw #1]\");\n  TEST_SINGLE(ldff1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 1)),\n              \"ldff1sh {z30.d}, p6/z, [x30, z31.d, sxtw #1]\");\n  TEST_SINGLE(ldff1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_LSL, 1)),\n              \"ldff1sh {z30.d}, p6/z, [x30, z31.d, lsl #1]\");\n  TEST_SINGLE(ldff1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)),\n              \"ldff1sh {z30.d}, p6/z, [x30, z31.d]\");\n\n  TEST_SINGLE(ldff1sh<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ldff1sh {z30.s}, p6/z, [x30, z31.s, uxtw]\");\n  TEST_SINGLE(ldff1sh<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ldff1sh {z30.s}, p6/z, [x30, z31.s, sxtw]\");\n  TEST_SINGLE(ldff1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ldff1sh {z30.d}, p6/z, [x30, z31.d, uxtw]\");\n  TEST_SINGLE(ldff1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ldff1sh {z30.d}, p6/z, [x30, z31.d, sxtw]\");\n\n  TEST_SINGLE(ldff1sh<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ldff1sh {z30.s}, p6/z, [z31.s]\");\n  TEST_SINGLE(ldff1sh<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 62)), \"ldff1sh {z30.s}, p6/z, [z31.s, \"\n                                                                                                        \"#62]\");\n  TEST_SINGLE(ldff1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ldff1sh {z30.d}, p6/z, [z31.d]\");\n  TEST_SINGLE(ldff1sh<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 62)), \"ldff1sh {z30.d}, p6/z, [z31.d, \"\n                                                                                                        \"#62]\");\n\n  TEST_SINGLE(ldff1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 2)),\n              \"ldff1w {z30.s}, p6/z, [x30, z31.s, uxtw #2]\");\n  TEST_SINGLE(ldff1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 2)),\n              \"ldff1w {z30.s}, p6/z, [x30, z31.s, sxtw #2]\");\n  TEST_SINGLE(ldff1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 2)),\n              \"ldff1w {z30.d}, p6/z, [x30, z31.d, uxtw #2]\");\n  TEST_SINGLE(ldff1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 2)),\n              \"ldff1w {z30.d}, p6/z, [x30, z31.d, sxtw #2]\");\n  TEST_SINGLE(ldff1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_LSL, 2)),\n              \"ldff1w {z30.d}, p6/z, [x30, z31.d, lsl #2]\");\n\n  TEST_SINGLE(ldff1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ldff1w {z30.s}, p6/z, [x30, z31.s, uxtw]\");\n  TEST_SINGLE(ldff1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ldff1w {z30.s}, p6/z, [x30, z31.s, sxtw]\");\n  TEST_SINGLE(ldff1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)),\n              \"ldff1w {z30.d}, p6/z, [x30, z31.d, uxtw]\");\n  TEST_SINGLE(ldff1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)),\n              \"ldff1w {z30.d}, p6/z, [x30, z31.d, sxtw]\");\n  TEST_SINGLE(ldff1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)),\n              \"ldff1w {z30.d}, p6/z, [x30, z31.d]\");\n\n  TEST_SINGLE(ldff1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ldff1w {z30.s}, p6/z, [z31.s]\");\n  TEST_SINGLE(ldff1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 124)), \"ldff1w {z30.s}, p6/z, [z31.s, \"\n                                                                                                        \"#124]\");\n  TEST_SINGLE(ldff1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ldff1w {z30.d}, p6/z, [z31.d]\");\n  TEST_SINGLE(ldff1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 124)), \"ldff1w {z30.d}, p6/z, [z31.d, \"\n                                                                                                        \"#124]\");\n\n  TEST_SINGLE(ldff1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)), \"ldff1sw {z30.d}, \"\n                                                                                                                    \"p6/z, [x30, z31.d, \"\n                                                                                                                    \"uxtw]\");\n  TEST_SINGLE(ldff1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)), \"ldff1sw {z30.d}, \"\n                                                                                                                    \"p6/z, [x30, z31.d, \"\n                                                                                                                    \"sxtw]\");\n  TEST_SINGLE(ldff1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 2)), \"ldff1sw {z30.d}, \"\n                                                                                                                    \"p6/z, [x30, z31.d, \"\n                                                                                                                    \"uxtw #2]\");\n  TEST_SINGLE(ldff1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 2)), \"ldff1sw {z30.d}, \"\n                                                                                                                    \"p6/z, [x30, z31.d, \"\n                                                                                                                    \"sxtw #2]\");\n  TEST_SINGLE(ldff1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_LSL, 2)), \"ldff1sw {z30.d}, p6/z, \"\n                                                                                                                   \"[x30, z31.d, lsl #2]\");\n  TEST_SINGLE(ldff1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)), \"ldff1sw {z30.d}, \"\n                                                                                                                    \"p6/z, [x30, z31.d]\");\n\n  TEST_SINGLE(ldff1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 0)), \"ldff1sw {z30.d}, p6/z, [z31.d]\");\n  TEST_SINGLE(ldff1sw(ZReg::z30, PReg::p6.Zeroing(), SVEMemOperand(ZReg::z31, 124)), \"ldff1sw {z30.d}, p6/z, [z31.d, #124]\");\n\n  TEST_SINGLE(ldr(PReg::p6, XReg::x29, 0), \"ldr p6, [x29]\");\n  TEST_SINGLE(ldr(PReg::p6, XReg::x29, -256), \"ldr p6, [x29, #-256, mul vl]\");\n  TEST_SINGLE(ldr(PReg::p6, XReg::x29, 255), \"ldr p6, [x29, #255, mul vl]\");\n\n  TEST_SINGLE(ldr(ZReg::z30, XReg::x29, 0), \"ldr z30, [x29]\");\n  TEST_SINGLE(ldr(ZReg::z30, XReg::x29, -256), \"ldr z30, [x29, #-256, mul vl]\");\n  TEST_SINGLE(ldr(ZReg::z30, XReg::x29, 255), \"ldr z30, [x29, #255, mul vl]\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE load and broadcast element\") {\n  TEST_SINGLE(ld1rb(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rb {z30.b}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rb(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 31), \"ld1rb {z30.b}, p6/z, [x29, #31]\");\n  TEST_SINGLE(ld1rb(SubRegSize::i8Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 63), \"ld1rb {z30.b}, p6/z, [x29, #63]\");\n\n  TEST_SINGLE(ld1rb(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rb {z30.h}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rb(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 31), \"ld1rb {z30.h}, p6/z, [x29, #31]\");\n  TEST_SINGLE(ld1rb(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 63), \"ld1rb {z30.h}, p6/z, [x29, #63]\");\n\n  TEST_SINGLE(ld1rb(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rb {z30.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rb(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 31), \"ld1rb {z30.s}, p6/z, [x29, #31]\");\n  TEST_SINGLE(ld1rb(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 63), \"ld1rb {z30.s}, p6/z, [x29, #63]\");\n\n  TEST_SINGLE(ld1rb(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rb {z30.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rb(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 31), \"ld1rb {z30.d}, p6/z, [x29, #31]\");\n  TEST_SINGLE(ld1rb(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 63), \"ld1rb {z30.d}, p6/z, [x29, #63]\");\n\n  TEST_SINGLE(ld1rsb(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rsb {z30.h}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rsb(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 31), \"ld1rsb {z30.h}, p6/z, [x29, #31]\");\n  TEST_SINGLE(ld1rsb(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 63), \"ld1rsb {z30.h}, p6/z, [x29, #63]\");\n\n  TEST_SINGLE(ld1rsb(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rsb {z30.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rsb(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 31), \"ld1rsb {z30.s}, p6/z, [x29, #31]\");\n  TEST_SINGLE(ld1rsb(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 63), \"ld1rsb {z30.s}, p6/z, [x29, #63]\");\n\n  TEST_SINGLE(ld1rsb(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rsb {z30.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rsb(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 31), \"ld1rsb {z30.d}, p6/z, [x29, #31]\");\n  TEST_SINGLE(ld1rsb(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 63), \"ld1rsb {z30.d}, p6/z, [x29, #63]\");\n\n  TEST_SINGLE(ld1rh(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rh {z30.h}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rh(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 64), \"ld1rh {z30.h}, p6/z, [x29, #64]\");\n  TEST_SINGLE(ld1rh(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 126), \"ld1rh {z30.h}, p6/z, [x29, #126]\");\n\n  TEST_SINGLE(ld1rh(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rh {z30.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rh(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 64), \"ld1rh {z30.s}, p6/z, [x29, #64]\");\n  TEST_SINGLE(ld1rh(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 126), \"ld1rh {z30.s}, p6/z, [x29, #126]\");\n\n  TEST_SINGLE(ld1rh(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rh {z30.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rh(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 64), \"ld1rh {z30.d}, p6/z, [x29, #64]\");\n  TEST_SINGLE(ld1rh(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 126), \"ld1rh {z30.d}, p6/z, [x29, #126]\");\n\n  TEST_SINGLE(ld1rsh(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rsh {z30.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rsh(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 64), \"ld1rsh {z30.s}, p6/z, [x29, #64]\");\n  TEST_SINGLE(ld1rsh(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 126), \"ld1rsh {z30.s}, p6/z, [x29, #126]\");\n\n  TEST_SINGLE(ld1rsh(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rsh {z30.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rsh(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 64), \"ld1rsh {z30.d}, p6/z, [x29, #64]\");\n  TEST_SINGLE(ld1rsh(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 126), \"ld1rsh {z30.d}, p6/z, [x29, #126]\");\n\n  TEST_SINGLE(ld1rw(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rw {z30.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rw(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 128), \"ld1rw {z30.s}, p6/z, [x29, #128]\");\n  TEST_SINGLE(ld1rw(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 252), \"ld1rw {z30.s}, p6/z, [x29, #252]\");\n\n  TEST_SINGLE(ld1rw(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rw {z30.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rw(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 128), \"ld1rw {z30.d}, p6/z, [x29, #128]\");\n  TEST_SINGLE(ld1rw(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 252), \"ld1rw {z30.d}, p6/z, [x29, #252]\");\n\n  TEST_SINGLE(ld1rsw(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rsw {z30.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rsw(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 128), \"ld1rsw {z30.d}, p6/z, [x29, #128]\");\n  TEST_SINGLE(ld1rsw(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 252), \"ld1rsw {z30.d}, p6/z, [x29, #252]\");\n\n  TEST_SINGLE(ld1rd(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rd {z30.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rd(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 256), \"ld1rd {z30.d}, p6/z, [x29, #256]\");\n  TEST_SINGLE(ld1rd(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 504), \"ld1rd {z30.d}, p6/z, [x29, #504]\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE contiguous non-temporal load (scalar plus immediate)\") {\n  TEST_SINGLE(ldnt1b(ZReg::z31, PReg::p6, Reg::r29, 0), \"ldnt1b {z31.b}, p6/z, [x29]\");\n  TEST_SINGLE(ldnt1b(ZReg::z31, PReg::p6, Reg::r29, -8), \"ldnt1b {z31.b}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ldnt1b(ZReg::z31, PReg::p6, Reg::r29, 7), \"ldnt1b {z31.b}, p6/z, [x29, #7, mul vl]\");\n\n  TEST_SINGLE(ldnt1h(ZReg::z31, PReg::p6, Reg::r29, 0), \"ldnt1h {z31.h}, p6/z, [x29]\");\n  TEST_SINGLE(ldnt1h(ZReg::z31, PReg::p6, Reg::r29, -8), \"ldnt1h {z31.h}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ldnt1h(ZReg::z31, PReg::p6, Reg::r29, 7), \"ldnt1h {z31.h}, p6/z, [x29, #7, mul vl]\");\n\n  TEST_SINGLE(ldnt1w(ZReg::z31, PReg::p6, Reg::r29, 0), \"ldnt1w {z31.s}, p6/z, [x29]\");\n  TEST_SINGLE(ldnt1w(ZReg::z31, PReg::p6, Reg::r29, -8), \"ldnt1w {z31.s}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ldnt1w(ZReg::z31, PReg::p6, Reg::r29, 7), \"ldnt1w {z31.s}, p6/z, [x29, #7, mul vl]\");\n\n  TEST_SINGLE(ldnt1d(ZReg::z31, PReg::p6, Reg::r29, 0), \"ldnt1d {z31.d}, p6/z, [x29]\");\n  TEST_SINGLE(ldnt1d(ZReg::z31, PReg::p6, Reg::r29, -8), \"ldnt1d {z31.d}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ldnt1d(ZReg::z31, PReg::p6, Reg::r29, 7), \"ldnt1d {z31.d}, p6/z, [x29, #7, mul vl]\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE load multiple structures (scalar plus scalar)\") {\n  TEST_SINGLE(ld2b(ZReg::z31, ZReg::z0, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld2b {z31.b, z0.b}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ld2b(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld2b {z26.b, z27.b}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ld3b(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld3b {z31.b, z0.b, z1.b}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ld3b(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld3b {z26.b, z27.b, z28.b}, p6/z, [x29, \"\n                                                                                             \"x30]\");\n  TEST_SINGLE(ld4b(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld4b {z31.b, z0.b, z1.b, z2.b}, \"\n                                                                                                     \"p6/z, [x29, x30]\");\n  TEST_SINGLE(ld4b(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld4b {z26.b, z27.b, z28.b, \"\n                                                                                                        \"z29.b}, p6/z, [x29, x30]\");\n\n  TEST_SINGLE(ld2h(ZReg::z31, ZReg::z0, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld2h {z31.h, z0.h}, p6/z, [x29, x30, lsl #1]\");\n  TEST_SINGLE(ld2h(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld2h {z26.h, z27.h}, p6/z, [x29, x30, lsl #1]\");\n  TEST_SINGLE(ld3h(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld3h {z31.h, z0.h, z1.h}, p6/z, [x29, x30, lsl \"\n                                                                                           \"#1]\");\n  TEST_SINGLE(ld3h(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld3h {z26.h, z27.h, z28.h}, p6/z, [x29, x30, \"\n                                                                                             \"lsl #1]\");\n  TEST_SINGLE(ld4h(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld4h {z31.h, z0.h, z1.h, z2.h}, \"\n                                                                                                     \"p6/z, [x29, x30, lsl #1]\");\n  TEST_SINGLE(ld4h(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld4h {z26.h, z27.h, z28.h, \"\n                                                                                                        \"z29.h}, p6/z, [x29, x30, lsl #1]\");\n\n  TEST_SINGLE(ld2w(ZReg::z31, ZReg::z0, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld2w {z31.s, z0.s}, p6/z, [x29, x30, lsl #2]\");\n  TEST_SINGLE(ld2w(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld2w {z26.s, z27.s}, p6/z, [x29, x30, lsl #2]\");\n  TEST_SINGLE(ld3w(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld3w {z31.s, z0.s, z1.s}, p6/z, [x29, x30, lsl \"\n                                                                                           \"#2]\");\n  TEST_SINGLE(ld3w(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld3w {z26.s, z27.s, z28.s}, p6/z, [x29, x30, \"\n                                                                                             \"lsl #2]\");\n  TEST_SINGLE(ld4w(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld4w {z31.s, z0.s, z1.s, z2.s}, \"\n                                                                                                     \"p6/z, [x29, x30, lsl #2]\");\n  TEST_SINGLE(ld4w(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld4w {z26.s, z27.s, z28.s, \"\n                                                                                                        \"z29.s}, p6/z, [x29, x30, lsl #2]\");\n\n  TEST_SINGLE(ld2d(ZReg::z31, ZReg::z0, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld2d {z31.d, z0.d}, p6/z, [x29, x30, lsl #3]\");\n  TEST_SINGLE(ld2d(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld2d {z26.d, z27.d}, p6/z, [x29, x30, lsl #3]\");\n  TEST_SINGLE(ld3d(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld3d {z31.d, z0.d, z1.d}, p6/z, [x29, x30, lsl \"\n                                                                                           \"#3]\");\n  TEST_SINGLE(ld3d(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld3d {z26.d, z27.d, z28.d}, p6/z, [x29, x30, \"\n                                                                                             \"lsl #3]\");\n  TEST_SINGLE(ld4d(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld4d {z31.d, z0.d, z1.d, z2.d}, \"\n                                                                                                     \"p6/z, [x29, x30, lsl #3]\");\n  TEST_SINGLE(ld4d(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld4d {z26.d, z27.d, z28.d, \"\n                                                                                                        \"z29.d}, p6/z, [x29, x30, lsl #3]\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE load and broadcast quadword (scalar plus immediate)\") {\n  TEST_SINGLE(ld1rqb(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rqb {z30.b}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rqb(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, -128), \"ld1rqb {z30.b}, p6/z, [x29, #-128]\");\n  TEST_SINGLE(ld1rqb(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 112), \"ld1rqb {z30.b}, p6/z, [x29, #112]\");\n\n  TEST_SINGLE(ld1rob(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rob {z30.b}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rob(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, -256), \"ld1rob {z30.b}, p6/z, [x29, #-256]\");\n  TEST_SINGLE(ld1rob(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 224), \"ld1rob {z30.b}, p6/z, [x29, #224]\");\n\n  TEST_SINGLE(ld1rqh(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rqh {z30.h}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rqh(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, -128), \"ld1rqh {z30.h}, p6/z, [x29, #-128]\");\n  TEST_SINGLE(ld1rqh(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 112), \"ld1rqh {z30.h}, p6/z, [x29, #112]\");\n\n  TEST_SINGLE(ld1roh(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1roh {z30.h}, p6/z, [x29]\");\n  TEST_SINGLE(ld1roh(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, -256), \"ld1roh {z30.h}, p6/z, [x29, #-256]\");\n  TEST_SINGLE(ld1roh(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 224), \"ld1roh {z30.h}, p6/z, [x29, #224]\");\n\n  TEST_SINGLE(ld1rqw(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rqw {z30.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rqw(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, -128), \"ld1rqw {z30.s}, p6/z, [x29, #-128]\");\n  TEST_SINGLE(ld1rqw(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 112), \"ld1rqw {z30.s}, p6/z, [x29, #112]\");\n\n  TEST_SINGLE(ld1row(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1row {z30.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld1row(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, -256), \"ld1row {z30.s}, p6/z, [x29, #-256]\");\n  TEST_SINGLE(ld1row(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 224), \"ld1row {z30.s}, p6/z, [x29, #224]\");\n\n  TEST_SINGLE(ld1rqd(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rqd {z30.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rqd(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, -128), \"ld1rqd {z30.d}, p6/z, [x29, #-128]\");\n  TEST_SINGLE(ld1rqd(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 112), \"ld1rqd {z30.d}, p6/z, [x29, #112]\");\n\n  TEST_SINGLE(ld1rod(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1rod {z30.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld1rod(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, -256), \"ld1rod {z30.d}, p6/z, [x29, #-256]\");\n  TEST_SINGLE(ld1rod(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, 224), \"ld1rod {z30.d}, p6/z, [x29, #224]\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE load and broadcast quadword (scalar plus scalar)\") {\n  TEST_SINGLE(ld1rqb(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1rqb {z30.b}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ld1rqb(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1rqb {z30.b}, p6/z, [x29, x30]\");\n\n  TEST_SINGLE(ld1rob(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1rob {z30.b}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ld1rob(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1rob {z30.b}, p6/z, [x29, x30]\");\n\n  TEST_SINGLE(ld1rqh(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1rqh {z30.h}, p6/z, [x29, x30, lsl #1]\");\n  TEST_SINGLE(ld1rqh(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1rqh {z30.h}, p6/z, [x29, x30, lsl #1]\");\n\n  TEST_SINGLE(ld1roh(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1roh {z30.h}, p6/z, [x29, x30, lsl #1]\");\n  TEST_SINGLE(ld1roh(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1roh {z30.h}, p6/z, [x29, x30, lsl #1]\");\n\n  TEST_SINGLE(ld1rqw(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1rqw {z30.s}, p6/z, [x29, x30, lsl #2]\");\n  TEST_SINGLE(ld1rqw(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1rqw {z30.s}, p6/z, [x29, x30, lsl #2]\");\n\n  TEST_SINGLE(ld1row(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1row {z30.s}, p6/z, [x29, x30, lsl #2]\");\n  TEST_SINGLE(ld1row(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1row {z30.s}, p6/z, [x29, x30, lsl #2]\");\n\n  TEST_SINGLE(ld1rqd(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1rqd {z30.d}, p6/z, [x29, x30, lsl #3]\");\n  TEST_SINGLE(ld1rqd(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1rqd {z30.d}, p6/z, [x29, x30, lsl #3]\");\n\n  TEST_SINGLE(ld1rod(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1rod {z30.d}, p6/z, [x29, x30, lsl #3]\");\n  TEST_SINGLE(ld1rod(ZReg::z30, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1rod {z30.d}, p6/z, [x29, x30, lsl #3]\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE load multiple structures (scalar plus immediate)\") {\n  TEST_SINGLE(ld2b(ZReg::z31, ZReg::z0, PReg::p6.Zeroing(), Reg::r29, 0), \"ld2b {z31.b, z0.b}, p6/z, [x29]\");\n  TEST_SINGLE(ld2b(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, 0), \"ld2b {z26.b, z27.b}, p6/z, [x29]\");\n  TEST_SINGLE(ld2b(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, -16), \"ld2b {z26.b, z27.b}, p6/z, [x29, #-16, mul vl]\");\n  TEST_SINGLE(ld2b(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, 14), \"ld2b {z26.b, z27.b}, p6/z, [x29, #14, mul vl]\");\n\n  TEST_SINGLE(ld2h(ZReg::z31, ZReg::z0, PReg::p6.Zeroing(), Reg::r29, 0), \"ld2h {z31.h, z0.h}, p6/z, [x29]\");\n  TEST_SINGLE(ld2h(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, 0), \"ld2h {z26.h, z27.h}, p6/z, [x29]\");\n  TEST_SINGLE(ld2h(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, -16), \"ld2h {z26.h, z27.h}, p6/z, [x29, #-16, mul vl]\");\n  TEST_SINGLE(ld2h(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, 14), \"ld2h {z26.h, z27.h}, p6/z, [x29, #14, mul vl]\");\n\n  TEST_SINGLE(ld2w(ZReg::z31, ZReg::z0, PReg::p6.Zeroing(), Reg::r29, 0), \"ld2w {z31.s, z0.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld2w(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, 0), \"ld2w {z26.s, z27.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld2w(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, -16), \"ld2w {z26.s, z27.s}, p6/z, [x29, #-16, mul vl]\");\n  TEST_SINGLE(ld2w(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, 14), \"ld2w {z26.s, z27.s}, p6/z, [x29, #14, mul vl]\");\n\n  TEST_SINGLE(ld2d(ZReg::z31, ZReg::z0, PReg::p6.Zeroing(), Reg::r29, 0), \"ld2d {z31.d, z0.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld2d(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, 0), \"ld2d {z26.d, z27.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld2d(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, -16), \"ld2d {z26.d, z27.d}, p6/z, [x29, #-16, mul vl]\");\n  TEST_SINGLE(ld2d(ZReg::z26, ZReg::z27, PReg::p6.Zeroing(), Reg::r29, 14), \"ld2d {z26.d, z27.d}, p6/z, [x29, #14, mul vl]\");\n\n  TEST_SINGLE(ld3b(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6.Zeroing(), Reg::r29, 0), \"ld3b {z31.b, z0.b, z1.b}, p6/z, [x29]\");\n  TEST_SINGLE(ld3b(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, 0), \"ld3b {z26.b, z27.b, z28.b}, p6/z, [x29]\");\n  TEST_SINGLE(ld3b(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, -24), \"ld3b {z26.b, z27.b, z28.b}, p6/z, [x29, #-24, mul \"\n                                                                                        \"vl]\");\n  TEST_SINGLE(ld3b(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, 21), \"ld3b {z26.b, z27.b, z28.b}, p6/z, [x29, #21, mul \"\n                                                                                       \"vl]\");\n\n  TEST_SINGLE(ld3h(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6.Zeroing(), Reg::r29, 0), \"ld3h {z31.h, z0.h, z1.h}, p6/z, [x29]\");\n  TEST_SINGLE(ld3h(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, 0), \"ld3h {z26.h, z27.h, z28.h}, p6/z, [x29]\");\n  TEST_SINGLE(ld3h(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, -24), \"ld3h {z26.h, z27.h, z28.h}, p6/z, [x29, #-24, mul \"\n                                                                                        \"vl]\");\n  TEST_SINGLE(ld3h(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, 21), \"ld3h {z26.h, z27.h, z28.h}, p6/z, [x29, #21, mul \"\n                                                                                       \"vl]\");\n\n  TEST_SINGLE(ld3w(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6.Zeroing(), Reg::r29, 0), \"ld3w {z31.s, z0.s, z1.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld3w(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, 0), \"ld3w {z26.s, z27.s, z28.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld3w(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, -24), \"ld3w {z26.s, z27.s, z28.s}, p6/z, [x29, #-24, mul \"\n                                                                                        \"vl]\");\n  TEST_SINGLE(ld3w(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, 21), \"ld3w {z26.s, z27.s, z28.s}, p6/z, [x29, #21, mul \"\n                                                                                       \"vl]\");\n\n  TEST_SINGLE(ld3d(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6.Zeroing(), Reg::r29, 0), \"ld3d {z31.d, z0.d, z1.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld3d(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, 0), \"ld3d {z26.d, z27.d, z28.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld3d(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, -24), \"ld3d {z26.d, z27.d, z28.d}, p6/z, [x29, #-24, mul \"\n                                                                                        \"vl]\");\n  TEST_SINGLE(ld3d(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6.Zeroing(), Reg::r29, 21), \"ld3d {z26.d, z27.d, z28.d}, p6/z, [x29, #21, mul \"\n                                                                                       \"vl]\");\n\n  TEST_SINGLE(ld4b(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6.Zeroing(), Reg::r29, 0), \"ld4b {z31.b, z0.b, z1.b, z2.b}, p6/z, \"\n                                                                                              \"[x29]\");\n  TEST_SINGLE(ld4b(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, 0), \"ld4b {z26.b, z27.b, z28.b, z29.b}, p6/z, \"\n                                                                                                 \"[x29]\");\n  TEST_SINGLE(ld4b(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, -32), \"ld4b {z26.b, z27.b, z28.b, z29.b}, \"\n                                                                                                   \"p6/z, [x29, #-32, mul vl]\");\n  TEST_SINGLE(ld4b(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, 28), \"ld4b {z26.b, z27.b, z28.b, z29.b}, \"\n                                                                                                  \"p6/z, [x29, #28, mul vl]\");\n\n  TEST_SINGLE(ld4h(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6.Zeroing(), Reg::r29, 0), \"ld4h {z31.h, z0.h, z1.h, z2.h}, p6/z, \"\n                                                                                              \"[x29]\");\n  TEST_SINGLE(ld4h(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, 0), \"ld4h {z26.h, z27.h, z28.h, z29.h}, p6/z, \"\n                                                                                                 \"[x29]\");\n  TEST_SINGLE(ld4h(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, -32), \"ld4h {z26.h, z27.h, z28.h, z29.h}, \"\n                                                                                                   \"p6/z, [x29, #-32, mul vl]\");\n  TEST_SINGLE(ld4h(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, 28), \"ld4h {z26.h, z27.h, z28.h, z29.h}, \"\n                                                                                                  \"p6/z, [x29, #28, mul vl]\");\n\n  TEST_SINGLE(ld4w(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6.Zeroing(), Reg::r29, 0), \"ld4w {z31.s, z0.s, z1.s, z2.s}, p6/z, \"\n                                                                                              \"[x29]\");\n  TEST_SINGLE(ld4w(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, 0), \"ld4w {z26.s, z27.s, z28.s, z29.s}, p6/z, \"\n                                                                                                 \"[x29]\");\n  TEST_SINGLE(ld4w(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, -32), \"ld4w {z26.s, z27.s, z28.s, z29.s}, \"\n                                                                                                   \"p6/z, [x29, #-32, mul vl]\");\n  TEST_SINGLE(ld4w(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, 28), \"ld4w {z26.s, z27.s, z28.s, z29.s}, \"\n                                                                                                  \"p6/z, [x29, #28, mul vl]\");\n\n  TEST_SINGLE(ld4d(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6.Zeroing(), Reg::r29, 0), \"ld4d {z31.d, z0.d, z1.d, z2.d}, p6/z, \"\n                                                                                              \"[x29]\");\n  TEST_SINGLE(ld4d(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, 0), \"ld4d {z26.d, z27.d, z28.d, z29.d}, p6/z, \"\n                                                                                                 \"[x29]\");\n  TEST_SINGLE(ld4d(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, -32), \"ld4d {z26.d, z27.d, z28.d, z29.d}, \"\n                                                                                                   \"p6/z, [x29, #-32, mul vl]\");\n  TEST_SINGLE(ld4d(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6.Zeroing(), Reg::r29, 28), \"ld4d {z26.d, z27.d, z28.d, z29.d}, \"\n                                                                                                  \"p6/z, [x29, #28, mul vl]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE contiguous load (scalar plus immediate)\") {\n  TEST_SINGLE(ld1b<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1b {z26.b}, p6/z, [x29]\");\n  TEST_SINGLE(ld1b<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1b {z26.h}, p6/z, [x29]\");\n  TEST_SINGLE(ld1b<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1b {z26.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld1b<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1b {z26.d}, p6/z, [x29]\");\n\n  TEST_SINGLE(ld1b<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1b {z26.b}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ld1b<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1b {z26.h}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ld1b<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1b {z26.s}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ld1b<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1b {z26.d}, p6/z, [x29, #-8, mul vl]\");\n\n  TEST_SINGLE(ld1b<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1b {z26.b}, p6/z, [x29, #7, mul vl]\");\n  TEST_SINGLE(ld1b<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1b {z26.h}, p6/z, [x29, #7, mul vl]\");\n  TEST_SINGLE(ld1b<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1b {z26.s}, p6/z, [x29, #7, mul vl]\");\n  TEST_SINGLE(ld1b<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1b {z26.d}, p6/z, [x29, #7, mul vl]\");\n\n  TEST_SINGLE(ld1sw(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1sw {z26.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld1sw(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1sw {z26.d}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ld1sw(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1sw {z26.d}, p6/z, [x29, #7, mul vl]\");\n\n  TEST_SINGLE(ld1w<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1w {z26.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld1w<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1w {z26.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld1w<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1w {z26.s}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ld1w<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1w {z26.d}, p6/z, [x29, #-8, mul vl]\");\n\n  // TEST_SINGLE(ld1h<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1h {z26.b}, p6/z, [x29]\");\n  TEST_SINGLE(ld1h<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1h {z26.h}, p6/z, [x29]\");\n  TEST_SINGLE(ld1h<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1h {z26.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld1h<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1h {z26.d}, p6/z, [x29]\");\n\n  // TEST_SINGLE(ld1h<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1h {z26.b}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ld1h<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1h {z26.h}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ld1h<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1h {z26.s}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ld1h<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1h {z26.d}, p6/z, [x29, #-8, mul vl]\");\n\n  // TEST_SINGLE(ld1h<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1h {z26.b}, p6/z, [x29, #7, mul vl]\");\n  TEST_SINGLE(ld1h<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1h {z26.h}, p6/z, [x29, #7, mul vl]\");\n  TEST_SINGLE(ld1h<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1h {z26.s}, p6/z, [x29, #7, mul vl]\");\n  TEST_SINGLE(ld1h<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1h {z26.d}, p6/z, [x29, #7, mul vl]\");\n\n  // TEST_SINGLE(ld1sh<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1sh {z26.b}, p6/z, [x29]\");\n  // TEST_SINGLE(ld1sh<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1sh {z26.h}, p6/z, [x29]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1sh {z26.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1sh {z26.d}, p6/z, [x29]\");\n\n  // TEST_SINGLE(ld1sh<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1sh {z26.b}, p6/z, [x29, #-8, mul vl]\");\n  // TEST_SINGLE(ld1sh<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1sh {z26.h}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1sh {z26.s}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1sh {z26.d}, p6/z, [x29, #-8, mul vl]\");\n\n  // TEST_SINGLE(ld1sh<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1sh {z26.b}, p6/z, [x29, #7, mul vl]\");\n  // TEST_SINGLE(ld1sh<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1sh {z26.h}, p6/z, [x29, #7, mul vl]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1sh {z26.s}, p6/z, [x29, #7, mul vl]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1sh {z26.d}, p6/z, [x29, #7, mul vl]\");\n\n  TEST_SINGLE(ld1sw(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1sw {z26.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld1sw(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1sw {z26.d}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ld1sw(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1sw {z26.d}, p6/z, [x29, #7, mul vl]\");\n\n  // TEST_SINGLE(ld1sb<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1sb {z26.b}, p6/z, [x29]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1sb {z26.h}, p6/z, [x29]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1sb {z26.s}, p6/z, [x29]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1sb {z26.d}, p6/z, [x29]\");\n\n  // TEST_SINGLE(ld1sb<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1sb {z26.b}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1sb {z26.h}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1sb {z26.s}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1sb {z26.d}, p6/z, [x29, #-8, mul vl]\");\n\n  // TEST_SINGLE(ld1sb<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1sb {z26.b}, p6/z, [x29, #7, mul vl]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1sb {z26.h}, p6/z, [x29, #7, mul vl]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1sb {z26.s}, p6/z, [x29, #7, mul vl]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1sb {z26.d}, p6/z, [x29, #7, mul vl]\");\n\n  TEST_SINGLE(ld1d(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 0), \"ld1d {z26.d}, p6/z, [x29]\");\n  TEST_SINGLE(ld1d(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, -8), \"ld1d {z26.d}, p6/z, [x29, #-8, mul vl]\");\n  TEST_SINGLE(ld1d(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, 7), \"ld1d {z26.d}, p6/z, [x29, #7, mul vl]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE contiguous store (scalar plus scalar)\") {\n  TEST_SINGLE(st1b<SubRegSize::i8Bit>(ZReg::z26, PReg::p6, Reg::r29, Reg::r28), \"st1b {z26.b}, p6, [x29, x28]\");\n  TEST_SINGLE(st1b<SubRegSize::i16Bit>(ZReg::z26, PReg::p6, Reg::r29, Reg::r28), \"st1b {z26.h}, p6, [x29, x28]\");\n  TEST_SINGLE(st1b<SubRegSize::i32Bit>(ZReg::z26, PReg::p6, Reg::r29, Reg::r28), \"st1b {z26.s}, p6, [x29, x28]\");\n  TEST_SINGLE(st1b<SubRegSize::i64Bit>(ZReg::z26, PReg::p6, Reg::r29, Reg::r28), \"st1b {z26.d}, p6, [x29, x28]\");\n\n  // TEST_SINGLE(st1h<SubRegSize::i8Bit>(ZReg::z26, PReg::p6, Reg::r29, Reg::r28), \"st1h {z26.b}, p6, [x29, x28, lsl #1]\");\n  TEST_SINGLE(st1h<SubRegSize::i16Bit>(ZReg::z26, PReg::p6, Reg::r29, Reg::r28), \"st1h {z26.h}, p6, [x29, x28, lsl #1]\");\n  TEST_SINGLE(st1h<SubRegSize::i32Bit>(ZReg::z26, PReg::p6, Reg::r29, Reg::r28), \"st1h {z26.s}, p6, [x29, x28, lsl #1]\");\n  TEST_SINGLE(st1h<SubRegSize::i64Bit>(ZReg::z26, PReg::p6, Reg::r29, Reg::r28), \"st1h {z26.d}, p6, [x29, x28, lsl #1]\");\n\n  // TEST_SINGLE(st1w<SubRegSize::i8Bit>(ZReg::z26, PReg::p6, Reg::r29, Reg::r28), \"st1w {z26.b}, p6, [x29, x28, lsl #2]\");\n  // TEST_SINGLE(st1w<SubRegSize::i16Bit>(ZReg::z26, PReg::p6, Reg::r29, Reg::r28), \"st1w {z26.h}, p6, [x29, x28, lsl #2]\");\n  TEST_SINGLE(st1w<SubRegSize::i32Bit>(ZReg::z26, PReg::p6, Reg::r29, Reg::r28), \"st1w {z26.s}, p6, [x29, x28, lsl #2]\");\n  TEST_SINGLE(st1w<SubRegSize::i64Bit>(ZReg::z26, PReg::p6, Reg::r29, Reg::r28), \"st1w {z26.d}, p6, [x29, x28, lsl #2]\");\n\n  TEST_SINGLE(st1d(ZReg::z26, PReg::p6, Reg::r29, Reg::r28), \"st1d {z26.d}, p6, [x29, x28, lsl #3]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE contiguous load (scalar plus scalar)\") {\n  TEST_SINGLE(ld1b<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1b {z26.b}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ld1b<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1b {z26.h}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ld1b<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1b {z26.s}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ld1b<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1b {z26.d}, p6/z, [x29, x30]\");\n\n  // TEST_SINGLE(ld1sb<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1sb {z26.b}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1sb {z26.h}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1sb {z26.s}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ld1sb<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1sb {z26.d}, p6/z, [x29, x30]\");\n\n  // TEST_SINGLE(ld1h<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1h {z26.b}, p6/z, [x29, x30, lsl #1]\");\n  TEST_SINGLE(ld1h<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1h {z26.h}, p6/z, [x29, x30, lsl #1]\");\n  TEST_SINGLE(ld1h<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1h {z26.s}, p6/z, [x29, x30, lsl #1]\");\n  TEST_SINGLE(ld1h<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1h {z26.d}, p6/z, [x29, x30, lsl #1]\");\n\n  // TEST_SINGLE(ld1sh<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1sh {z26.b}, p6/z, [x29, x30, lsl #1]\");\n  // TEST_SINGLE(ld1sh<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1sh {z26.h}, p6/z, [x29, x30, lsl #1]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1sh {z26.s}, p6/z, [x29, x30, lsl #1]\");\n  TEST_SINGLE(ld1sh<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1sh {z26.d}, p6/z, [x29, x30, lsl #1]\");\n\n  TEST_SINGLE(ld1w<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1w {z26.s}, p6/z, [x29, x30, lsl #2]\");\n  TEST_SINGLE(ld1w<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1w {z26.d}, p6/z, [x29, x30, lsl #2]\");\n\n  TEST_SINGLE(ld1sw(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1sw {z26.d}, p6/z, [x29, x30, lsl #2]\");\n\n  TEST_SINGLE(ld1d(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ld1d {z26.d}, p6/z, [x29, x30, lsl #3]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE contiguous first-fault load (scalar plus scalar)\") {\n  TEST_SINGLE(ldff1b<SubRegSize::i8Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1b {z26.b}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ldff1b<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1b {z26.h}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ldff1b<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1b {z26.s}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ldff1b<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1b {z26.d}, p6/z, [x29, x30]\");\n\n  TEST_SINGLE(ldff1sb<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1sb {z26.h}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ldff1sb<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1sb {z26.s}, p6/z, [x29, x30]\");\n  TEST_SINGLE(ldff1sb<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1sb {z26.d}, p6/z, [x29, x30]\");\n\n  TEST_SINGLE(ldff1h<SubRegSize::i16Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1h {z26.h}, p6/z, [x29, x30, lsl #1]\");\n  TEST_SINGLE(ldff1h<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1h {z26.s}, p6/z, [x29, x30, lsl #1]\");\n  TEST_SINGLE(ldff1h<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1h {z26.d}, p6/z, [x29, x30, lsl #1]\");\n\n  TEST_SINGLE(ldff1sh<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1sh {z26.s}, p6/z, [x29, x30, lsl #1]\");\n  TEST_SINGLE(ldff1sh<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1sh {z26.d}, p6/z, [x29, x30, lsl #1]\");\n\n  TEST_SINGLE(ldff1w<SubRegSize::i32Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1w {z26.s}, p6/z, [x29, x30, lsl #2]\");\n  TEST_SINGLE(ldff1w<SubRegSize::i64Bit>(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1w {z26.d}, p6/z, [x29, x30, lsl #2]\");\n\n  TEST_SINGLE(ldff1sw(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1sw {z26.d}, p6/z, [x29, x30, lsl #2]\");\n\n  TEST_SINGLE(ldff1d(ZReg::z26, PReg::p6.Zeroing(), Reg::r29, Reg::r30), \"ldff1d {z26.d}, p6/z, [x29, x30, lsl #3]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point round to integral value\") {\n  TEST_SINGLE(frinti(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frinti z30.h, p6/m, z29.h\");\n  TEST_SINGLE(frinti(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frinti z30.s, p6/m, z29.s\");\n  TEST_SINGLE(frinti(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frinti z30.d, p6/m, z29.d\");\n  TEST_SINGLE(frintx(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frintx z30.h, p6/m, z29.h\");\n  TEST_SINGLE(frintx(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frintx z30.s, p6/m, z29.s\");\n  TEST_SINGLE(frintx(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frintx z30.d, p6/m, z29.d\");\n  TEST_SINGLE(frinta(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frinta z30.h, p6/m, z29.h\");\n  TEST_SINGLE(frinta(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frinta z30.s, p6/m, z29.s\");\n  TEST_SINGLE(frinta(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frinta z30.d, p6/m, z29.d\");\n  TEST_SINGLE(frintn(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frintn z30.h, p6/m, z29.h\");\n  TEST_SINGLE(frintn(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frintn z30.s, p6/m, z29.s\");\n  TEST_SINGLE(frintn(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frintn z30.d, p6/m, z29.d\");\n  TEST_SINGLE(frintz(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frintz z30.h, p6/m, z29.h\");\n  TEST_SINGLE(frintz(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frintz z30.s, p6/m, z29.s\");\n  TEST_SINGLE(frintz(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frintz z30.d, p6/m, z29.d\");\n  TEST_SINGLE(frintm(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frintm z30.h, p6/m, z29.h\");\n  TEST_SINGLE(frintm(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frintm z30.s, p6/m, z29.s\");\n  TEST_SINGLE(frintm(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frintm z30.d, p6/m, z29.d\");\n  TEST_SINGLE(frintp(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frintp z30.h, p6/m, z29.h\");\n  TEST_SINGLE(frintp(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frintp z30.s, p6/m, z29.s\");\n  TEST_SINGLE(frintp(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frintp z30.d, p6/m, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point convert precision\") {\n  TEST_SINGLE(fcvt(SubRegSize::i16Bit, SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fcvt z30.h, p6/m, z29.s\");\n  TEST_SINGLE(fcvt(SubRegSize::i16Bit, SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fcvt z30.h, p6/m, z29.d\");\n\n  TEST_SINGLE(fcvt(SubRegSize::i32Bit, SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fcvt z30.s, p6/m, z29.h\");\n  TEST_SINGLE(fcvt(SubRegSize::i32Bit, SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fcvt z30.s, p6/m, z29.d\");\n\n  TEST_SINGLE(fcvt(SubRegSize::i64Bit, SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fcvt z30.d, p6/m, z29.h\");\n  TEST_SINGLE(fcvt(SubRegSize::i64Bit, SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fcvt z30.d, p6/m, z29.s\");\n\n  TEST_SINGLE(fcvtx(ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fcvtx z30.s, p6/m, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point unary operations\") {\n  TEST_SINGLE(frecpx(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frecpx z30.h, p6/m, z29.h\");\n  TEST_SINGLE(frecpx(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frecpx z30.s, p6/m, z29.s\");\n  TEST_SINGLE(frecpx(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"frecpx z30.d, p6/m, z29.d\");\n\n  TEST_SINGLE(fsqrt(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fsqrt z30.h, p6/m, z29.h\");\n  TEST_SINGLE(fsqrt(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fsqrt z30.s, p6/m, z29.s\");\n  TEST_SINGLE(fsqrt(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"fsqrt z30.d, p6/m, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE integer convert to floating-point\") {\n  TEST_SINGLE(scvtf(ZReg::z30, SubRegSize::i16Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i16Bit), \"scvtf z30.h, p6/m, z29.h\");\n  TEST_SINGLE(scvtf(ZReg::z30, SubRegSize::i16Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i32Bit), \"scvtf z30.h, p6/m, z29.s\");\n  TEST_SINGLE(scvtf(ZReg::z30, SubRegSize::i16Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i64Bit), \"scvtf z30.h, p6/m, z29.d\");\n\n  // TEST_SINGLE(scvtf(ZReg::z30, SubRegSize::i32Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i16Bit), \"scvtf z30.s, p6/m, z29.h\");\n  TEST_SINGLE(scvtf(ZReg::z30, SubRegSize::i32Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i32Bit), \"scvtf z30.s, p6/m, z29.s\");\n  TEST_SINGLE(scvtf(ZReg::z30, SubRegSize::i32Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i64Bit), \"scvtf z30.s, p6/m, z29.d\");\n\n  // TEST_SINGLE(scvtf(ZReg::z30, SubRegSize::i64Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i16Bit), \"scvtf z30.d, p6/m, z29.h\");\n  TEST_SINGLE(scvtf(ZReg::z30, SubRegSize::i64Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i32Bit), \"scvtf z30.d, p6/m, z29.s\");\n  TEST_SINGLE(scvtf(ZReg::z30, SubRegSize::i64Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i64Bit), \"scvtf z30.d, p6/m, z29.d\");\n\n  TEST_SINGLE(ucvtf(ZReg::z30, SubRegSize::i16Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i16Bit), \"ucvtf z30.h, p6/m, z29.h\");\n  TEST_SINGLE(ucvtf(ZReg::z30, SubRegSize::i16Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i32Bit), \"ucvtf z30.h, p6/m, z29.s\");\n  TEST_SINGLE(ucvtf(ZReg::z30, SubRegSize::i16Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i64Bit), \"ucvtf z30.h, p6/m, z29.d\");\n\n  // TEST_SINGLE(ucvtf(ZReg::z30, SubRegSize::i32Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i16Bit), \"ucvtf z30.s, p6/m, z29.h\");\n  TEST_SINGLE(ucvtf(ZReg::z30, SubRegSize::i32Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i32Bit), \"ucvtf z30.s, p6/m, z29.s\");\n  TEST_SINGLE(ucvtf(ZReg::z30, SubRegSize::i32Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i64Bit), \"ucvtf z30.s, p6/m, z29.d\");\n\n  // TEST_SINGLE(ucvtf(ZReg::z30, SubRegSize::i64Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i16Bit), \"ucvtf z30.d, p6/m, z29.h\");\n  TEST_SINGLE(ucvtf(ZReg::z30, SubRegSize::i64Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i32Bit), \"ucvtf z30.d, p6/m, z29.s\");\n  TEST_SINGLE(ucvtf(ZReg::z30, SubRegSize::i64Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i64Bit), \"ucvtf z30.d, p6/m, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point convert to integer\") {\n  TEST_SINGLE(flogb(SubRegSize::i16Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"flogb z30.h, p6/m, z29.h\");\n  TEST_SINGLE(flogb(SubRegSize::i32Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"flogb z30.s, p6/m, z29.s\");\n  TEST_SINGLE(flogb(SubRegSize::i64Bit, ZReg::z30, PReg::p6.Merging(), ZReg::z29), \"flogb z30.d, p6/m, z29.d\");\n\n  TEST_SINGLE(fcvtzs(ZReg::z30, SubRegSize::i16Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i16Bit), \"fcvtzs z30.h, p6/m, z29.h\");\n  // TEST_SINGLE(fcvtzs(ZReg::z30, SubRegSize::i16Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i32Bit), \"fcvtzs z30.h, p6/m, z29.s\");\n  // TEST_SINGLE(fcvtzs(ZReg::z30, SubRegSize::i16Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i64Bit), \"fcvtzs z30.h, p6/m, z29.d\");\n\n  TEST_SINGLE(fcvtzs(ZReg::z30, SubRegSize::i32Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i16Bit), \"fcvtzs z30.s, p6/m, z29.h\");\n  TEST_SINGLE(fcvtzs(ZReg::z30, SubRegSize::i32Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i32Bit), \"fcvtzs z30.s, p6/m, z29.s\");\n  TEST_SINGLE(fcvtzs(ZReg::z30, SubRegSize::i32Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i64Bit), \"fcvtzs z30.s, p6/m, z29.d\");\n\n  TEST_SINGLE(fcvtzs(ZReg::z30, SubRegSize::i64Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i16Bit), \"fcvtzs z30.d, p6/m, z29.h\");\n  TEST_SINGLE(fcvtzs(ZReg::z30, SubRegSize::i64Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i32Bit), \"fcvtzs z30.d, p6/m, z29.s\");\n  TEST_SINGLE(fcvtzs(ZReg::z30, SubRegSize::i64Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i64Bit), \"fcvtzs z30.d, p6/m, z29.d\");\n\n  TEST_SINGLE(fcvtzu(ZReg::z30, SubRegSize::i16Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i16Bit), \"fcvtzu z30.h, p6/m, z29.h\");\n  // TEST_SINGLE(fcvtzu(ZReg::z30, SubRegSize::i16Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i32Bit), \"fcvtzu z30.h, p6/m, z29.s\");\n  // TEST_SINGLE(fcvtzu(ZReg::z30, SubRegSize::i16Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i64Bit), \"fcvtzu z30.h, p6/m, z29.d\");\n\n  TEST_SINGLE(fcvtzu(ZReg::z30, SubRegSize::i32Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i16Bit), \"fcvtzu z30.s, p6/m, z29.h\");\n  TEST_SINGLE(fcvtzu(ZReg::z30, SubRegSize::i32Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i32Bit), \"fcvtzu z30.s, p6/m, z29.s\");\n  TEST_SINGLE(fcvtzu(ZReg::z30, SubRegSize::i32Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i64Bit), \"fcvtzu z30.s, p6/m, z29.d\");\n\n  TEST_SINGLE(fcvtzu(ZReg::z30, SubRegSize::i64Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i16Bit), \"fcvtzu z30.d, p6/m, z29.h\");\n  TEST_SINGLE(fcvtzu(ZReg::z30, SubRegSize::i64Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i32Bit), \"fcvtzu z30.d, p6/m, z29.s\");\n  TEST_SINGLE(fcvtzu(ZReg::z30, SubRegSize::i64Bit, PReg::p6.Merging(), ZReg::z29, SubRegSize::i64Bit), \"fcvtzu z30.d, p6/m, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point reciprocal estimate (unpredicated)\") {\n  TEST_SINGLE(frecpe(SubRegSize::i16Bit, ZReg::z30, ZReg::z29), \"frecpe z30.h, z29.h\");\n  TEST_SINGLE(frecpe(SubRegSize::i32Bit, ZReg::z30, ZReg::z29), \"frecpe z30.s, z29.s\");\n  TEST_SINGLE(frecpe(SubRegSize::i64Bit, ZReg::z30, ZReg::z29), \"frecpe z30.d, z29.d\");\n\n  TEST_SINGLE(frsqrte(SubRegSize::i16Bit, ZReg::z30, ZReg::z29), \"frsqrte z30.h, z29.h\");\n  TEST_SINGLE(frsqrte(SubRegSize::i32Bit, ZReg::z30, ZReg::z29), \"frsqrte z30.s, z29.s\");\n  TEST_SINGLE(frsqrte(SubRegSize::i64Bit, ZReg::z30, ZReg::z29), \"frsqrte z30.d, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point serial reduction (predicated)\") {\n  TEST_SINGLE(fadda(SubRegSize::i16Bit, VReg::v30, PReg::p7, VReg::v30, ZReg::z29), \"fadda h30, p7, h30, z29.h\");\n  TEST_SINGLE(fadda(SubRegSize::i32Bit, VReg::v30, PReg::p7, VReg::v30, ZReg::z29), \"fadda s30, p7, s30, z29.s\");\n  TEST_SINGLE(fadda(SubRegSize::i64Bit, VReg::v30, PReg::p7, VReg::v30, ZReg::z29), \"fadda d30, p7, d30, z29.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point compare with zero\") {\n  TEST_SINGLE(fcmge(SubRegSize::i16Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmge p15.h, p7/z, z30.h, #0.0\");\n  TEST_SINGLE(fcmge(SubRegSize::i32Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmge p15.s, p7/z, z30.s, #0.0\");\n  TEST_SINGLE(fcmge(SubRegSize::i64Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmge p15.d, p7/z, z30.d, #0.0\");\n\n  TEST_SINGLE(fcmgt(SubRegSize::i16Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmgt p15.h, p7/z, z30.h, #0.0\");\n  TEST_SINGLE(fcmgt(SubRegSize::i32Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmgt p15.s, p7/z, z30.s, #0.0\");\n  TEST_SINGLE(fcmgt(SubRegSize::i64Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmgt p15.d, p7/z, z30.d, #0.0\");\n\n  TEST_SINGLE(fcmlt(SubRegSize::i16Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmlt p15.h, p7/z, z30.h, #0.0\");\n  TEST_SINGLE(fcmlt(SubRegSize::i32Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmlt p15.s, p7/z, z30.s, #0.0\");\n  TEST_SINGLE(fcmlt(SubRegSize::i64Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmlt p15.d, p7/z, z30.d, #0.0\");\n\n  TEST_SINGLE(fcmle(SubRegSize::i16Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmle p15.h, p7/z, z30.h, #0.0\");\n  TEST_SINGLE(fcmle(SubRegSize::i32Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmle p15.s, p7/z, z30.s, #0.0\");\n  TEST_SINGLE(fcmle(SubRegSize::i64Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmle p15.d, p7/z, z30.d, #0.0\");\n\n  TEST_SINGLE(fcmeq(SubRegSize::i16Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmeq p15.h, p7/z, z30.h, #0.0\");\n  TEST_SINGLE(fcmeq(SubRegSize::i32Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmeq p15.s, p7/z, z30.s, #0.0\");\n  TEST_SINGLE(fcmeq(SubRegSize::i64Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmeq p15.d, p7/z, z30.d, #0.0\");\n\n  TEST_SINGLE(fcmne(SubRegSize::i16Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmne p15.h, p7/z, z30.h, #0.0\");\n  TEST_SINGLE(fcmne(SubRegSize::i32Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmne p15.s, p7/z, z30.s, #0.0\");\n  TEST_SINGLE(fcmne(SubRegSize::i64Bit, PReg::p15, PReg::p7.Zeroing(), ZReg::z30), \"fcmne p15.d, p7/z, z30.d, #0.0\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point multiply-accumulate writing addend\") {\n  TEST_SINGLE(fmla(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fmla z30.h, p7/m, z29.h, z28.h\");\n  TEST_SINGLE(fmla(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fmla z30.s, p7/m, z29.s, z28.s\");\n  TEST_SINGLE(fmla(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fmla z30.d, p7/m, z29.d, z28.d\");\n\n  TEST_SINGLE(fmls(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fmls z30.h, p7/m, z29.h, z28.h\");\n  TEST_SINGLE(fmls(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fmls z30.s, p7/m, z29.s, z28.s\");\n  TEST_SINGLE(fmls(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fmls z30.d, p7/m, z29.d, z28.d\");\n\n  TEST_SINGLE(fnmla(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fnmla z30.h, p7/m, z29.h, z28.h\");\n  TEST_SINGLE(fnmla(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fnmla z30.s, p7/m, z29.s, z28.s\");\n  TEST_SINGLE(fnmla(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fnmla z30.d, p7/m, z29.d, z28.d\");\n\n  TEST_SINGLE(fnmls(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fnmls z30.h, p7/m, z29.h, z28.h\");\n  TEST_SINGLE(fnmls(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fnmls z30.s, p7/m, z29.s, z28.s\");\n  TEST_SINGLE(fnmls(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fnmls z30.d, p7/m, z29.d, z28.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE floating-point multiply-accumulate writing multiplicand\") {\n  TEST_SINGLE(fmad(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fmad z30.h, p7/m, z29.h, z28.h\");\n  TEST_SINGLE(fmad(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fmad z30.s, p7/m, z29.s, z28.s\");\n  TEST_SINGLE(fmad(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fmad z30.d, p7/m, z29.d, z28.d\");\n\n  TEST_SINGLE(fmsb(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fmsb z30.h, p7/m, z29.h, z28.h\");\n  TEST_SINGLE(fmsb(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fmsb z30.s, p7/m, z29.s, z28.s\");\n  TEST_SINGLE(fmsb(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fmsb z30.d, p7/m, z29.d, z28.d\");\n\n  TEST_SINGLE(fnmad(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fnmad z30.h, p7/m, z29.h, z28.h\");\n  TEST_SINGLE(fnmad(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fnmad z30.s, p7/m, z29.s, z28.s\");\n  TEST_SINGLE(fnmad(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fnmad z30.d, p7/m, z29.d, z28.d\");\n\n  TEST_SINGLE(fnmsb(SubRegSize::i16Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fnmsb z30.h, p7/m, z29.h, z28.h\");\n  TEST_SINGLE(fnmsb(SubRegSize::i32Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fnmsb z30.s, p7/m, z29.s, z28.s\");\n  TEST_SINGLE(fnmsb(SubRegSize::i64Bit, ZReg::z30, PReg::p7.Merging(), ZReg::z29, ZReg::z28), \"fnmsb z30.d, p7/m, z29.d, z28.d\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE store multiple structures (scalar plus scalar)\") {\n  TEST_SINGLE(st2b(ZReg::z31, ZReg::z0, PReg::p6, Reg::r29, Reg::r30), \"st2b {z31.b, z0.b}, p6, [x29, x30]\");\n  TEST_SINGLE(st2b(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, Reg::r30), \"st2b {z26.b, z27.b}, p6, [x29, x30]\");\n  TEST_SINGLE(st3b(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6, Reg::r29, Reg::r30), \"st3b {z31.b, z0.b, z1.b}, p6, [x29, x30]\");\n  TEST_SINGLE(st3b(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, Reg::r30), \"st3b {z26.b, z27.b, z28.b}, p6, [x29, x30]\");\n  TEST_SINGLE(st4b(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6, Reg::r29, Reg::r30), \"st4b {z31.b, z0.b, z1.b, z2.b}, p6, [x29, \"\n                                                                                           \"x30]\");\n  TEST_SINGLE(st4b(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, Reg::r30), \"st4b {z26.b, z27.b, z28.b, z29.b}, p6, \"\n                                                                                              \"[x29, x30]\");\n\n  TEST_SINGLE(st2h(ZReg::z31, ZReg::z0, PReg::p6, Reg::r29, Reg::r30), \"st2h {z31.h, z0.h}, p6, [x29, x30, lsl #1]\");\n  TEST_SINGLE(st2h(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, Reg::r30), \"st2h {z26.h, z27.h}, p6, [x29, x30, lsl #1]\");\n  TEST_SINGLE(st3h(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6, Reg::r29, Reg::r30), \"st3h {z31.h, z0.h, z1.h}, p6, [x29, x30, lsl #1]\");\n  TEST_SINGLE(st3h(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, Reg::r30), \"st3h {z26.h, z27.h, z28.h}, p6, [x29, x30, lsl #1]\");\n  TEST_SINGLE(st4h(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6, Reg::r29, Reg::r30), \"st4h {z31.h, z0.h, z1.h, z2.h}, p6, [x29, x30, \"\n                                                                                           \"lsl #1]\");\n  TEST_SINGLE(st4h(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, Reg::r30), \"st4h {z26.h, z27.h, z28.h, z29.h}, p6, \"\n                                                                                              \"[x29, x30, lsl #1]\");\n\n  TEST_SINGLE(st2w(ZReg::z31, ZReg::z0, PReg::p6, Reg::r29, Reg::r30), \"st2w {z31.s, z0.s}, p6, [x29, x30, lsl #2]\");\n  TEST_SINGLE(st2w(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, Reg::r30), \"st2w {z26.s, z27.s}, p6, [x29, x30, lsl #2]\");\n  TEST_SINGLE(st3w(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6, Reg::r29, Reg::r30), \"st3w {z31.s, z0.s, z1.s}, p6, [x29, x30, lsl #2]\");\n  TEST_SINGLE(st3w(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, Reg::r30), \"st3w {z26.s, z27.s, z28.s}, p6, [x29, x30, lsl #2]\");\n  TEST_SINGLE(st4w(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6, Reg::r29, Reg::r30), \"st4w {z31.s, z0.s, z1.s, z2.s}, p6, [x29, x30, \"\n                                                                                           \"lsl #2]\");\n  TEST_SINGLE(st4w(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, Reg::r30), \"st4w {z26.s, z27.s, z28.s, z29.s}, p6, \"\n                                                                                              \"[x29, x30, lsl #2]\");\n\n  TEST_SINGLE(st2d(ZReg::z31, ZReg::z0, PReg::p6, Reg::r29, Reg::r30), \"st2d {z31.d, z0.d}, p6, [x29, x30, lsl #3]\");\n  TEST_SINGLE(st2d(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, Reg::r30), \"st2d {z26.d, z27.d}, p6, [x29, x30, lsl #3]\");\n  TEST_SINGLE(st3d(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6, Reg::r29, Reg::r30), \"st3d {z31.d, z0.d, z1.d}, p6, [x29, x30, lsl #3]\");\n  TEST_SINGLE(st3d(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, Reg::r30), \"st3d {z26.d, z27.d, z28.d}, p6, [x29, x30, lsl #3]\");\n  TEST_SINGLE(st4d(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6, Reg::r29, Reg::r30), \"st4d {z31.d, z0.d, z1.d, z2.d}, p6, [x29, x30, \"\n                                                                                           \"lsl #3]\");\n  TEST_SINGLE(st4d(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, Reg::r30), \"st4d {z26.d, z27.d, z28.d, z29.d}, p6, \"\n                                                                                              \"[x29, x30, lsl #3]\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE contiguous non-temporal store (scalar plus immediate)\") {\n  TEST_SINGLE(stnt1b(ZReg::z31, PReg::p6, Reg::r29, 0), \"stnt1b {z31.b}, p6, [x29]\");\n  TEST_SINGLE(stnt1b(ZReg::z31, PReg::p6, Reg::r29, -8), \"stnt1b {z31.b}, p6, [x29, #-8, mul vl]\");\n  TEST_SINGLE(stnt1b(ZReg::z31, PReg::p6, Reg::r29, 7), \"stnt1b {z31.b}, p6, [x29, #7, mul vl]\");\n\n  TEST_SINGLE(stnt1h(ZReg::z31, PReg::p6, Reg::r29, 0), \"stnt1h {z31.h}, p6, [x29]\");\n  TEST_SINGLE(stnt1h(ZReg::z31, PReg::p6, Reg::r29, -8), \"stnt1h {z31.h}, p6, [x29, #-8, mul vl]\");\n  TEST_SINGLE(stnt1h(ZReg::z31, PReg::p6, Reg::r29, 7), \"stnt1h {z31.h}, p6, [x29, #7, mul vl]\");\n\n  TEST_SINGLE(stnt1w(ZReg::z31, PReg::p6, Reg::r29, 0), \"stnt1w {z31.s}, p6, [x29]\");\n  TEST_SINGLE(stnt1w(ZReg::z31, PReg::p6, Reg::r29, -8), \"stnt1w {z31.s}, p6, [x29, #-8, mul vl]\");\n  TEST_SINGLE(stnt1w(ZReg::z31, PReg::p6, Reg::r29, 7), \"stnt1w {z31.s}, p6, [x29, #7, mul vl]\");\n\n  TEST_SINGLE(stnt1d(ZReg::z31, PReg::p6, Reg::r29, 0), \"stnt1d {z31.d}, p6, [x29]\");\n  TEST_SINGLE(stnt1d(ZReg::z31, PReg::p6, Reg::r29, -8), \"stnt1d {z31.d}, p6, [x29, #-8, mul vl]\");\n  TEST_SINGLE(stnt1d(ZReg::z31, PReg::p6, Reg::r29, 7), \"stnt1d {z31.d}, p6, [x29, #7, mul vl]\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE store multiple structures (scalar plus immediate)\") {\n  TEST_SINGLE(st2b(ZReg::z31, ZReg::z0, PReg::p6, Reg::r29, 0), \"st2b {z31.b, z0.b}, p6, [x29]\");\n  TEST_SINGLE(st2b(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, 0), \"st2b {z26.b, z27.b}, p6, [x29]\");\n  TEST_SINGLE(st2b(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, -16), \"st2b {z26.b, z27.b}, p6, [x29, #-16, mul vl]\");\n  TEST_SINGLE(st2b(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, 14), \"st2b {z26.b, z27.b}, p6, [x29, #14, mul vl]\");\n\n  TEST_SINGLE(st2h(ZReg::z31, ZReg::z0, PReg::p6, Reg::r29, 0), \"st2h {z31.h, z0.h}, p6, [x29]\");\n  TEST_SINGLE(st2h(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, 0), \"st2h {z26.h, z27.h}, p6, [x29]\");\n  TEST_SINGLE(st2h(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, -16), \"st2h {z26.h, z27.h}, p6, [x29, #-16, mul vl]\");\n  TEST_SINGLE(st2h(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, 14), \"st2h {z26.h, z27.h}, p6, [x29, #14, mul vl]\");\n\n  TEST_SINGLE(st2w(ZReg::z31, ZReg::z0, PReg::p6, Reg::r29, 0), \"st2w {z31.s, z0.s}, p6, [x29]\");\n  TEST_SINGLE(st2w(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, 0), \"st2w {z26.s, z27.s}, p6, [x29]\");\n  TEST_SINGLE(st2w(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, -16), \"st2w {z26.s, z27.s}, p6, [x29, #-16, mul vl]\");\n  TEST_SINGLE(st2w(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, 14), \"st2w {z26.s, z27.s}, p6, [x29, #14, mul vl]\");\n\n  TEST_SINGLE(st2d(ZReg::z31, ZReg::z0, PReg::p6, Reg::r29, 0), \"st2d {z31.d, z0.d}, p6, [x29]\");\n  TEST_SINGLE(st2d(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, 0), \"st2d {z26.d, z27.d}, p6, [x29]\");\n  TEST_SINGLE(st2d(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, -16), \"st2d {z26.d, z27.d}, p6, [x29, #-16, mul vl]\");\n  TEST_SINGLE(st2d(ZReg::z26, ZReg::z27, PReg::p6, Reg::r29, 14), \"st2d {z26.d, z27.d}, p6, [x29, #14, mul vl]\");\n\n  TEST_SINGLE(st3b(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6, Reg::r29, 0), \"st3b {z31.b, z0.b, z1.b}, p6, [x29]\");\n  TEST_SINGLE(st3b(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, 0), \"st3b {z26.b, z27.b, z28.b}, p6, [x29]\");\n  TEST_SINGLE(st3b(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, -24), \"st3b {z26.b, z27.b, z28.b}, p6, [x29, #-24, mul vl]\");\n  TEST_SINGLE(st3b(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, 21), \"st3b {z26.b, z27.b, z28.b}, p6, [x29, #21, mul vl]\");\n\n  TEST_SINGLE(st3h(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6, Reg::r29, 0), \"st3h {z31.h, z0.h, z1.h}, p6, [x29]\");\n  TEST_SINGLE(st3h(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, 0), \"st3h {z26.h, z27.h, z28.h}, p6, [x29]\");\n  TEST_SINGLE(st3h(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, -24), \"st3h {z26.h, z27.h, z28.h}, p6, [x29, #-24, mul vl]\");\n  TEST_SINGLE(st3h(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, 21), \"st3h {z26.h, z27.h, z28.h}, p6, [x29, #21, mul vl]\");\n\n  TEST_SINGLE(st3w(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6, Reg::r29, 0), \"st3w {z31.s, z0.s, z1.s}, p6, [x29]\");\n  TEST_SINGLE(st3w(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, 0), \"st3w {z26.s, z27.s, z28.s}, p6, [x29]\");\n  TEST_SINGLE(st3w(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, -24), \"st3w {z26.s, z27.s, z28.s}, p6, [x29, #-24, mul vl]\");\n  TEST_SINGLE(st3w(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, 21), \"st3w {z26.s, z27.s, z28.s}, p6, [x29, #21, mul vl]\");\n\n  TEST_SINGLE(st3d(ZReg::z31, ZReg::z0, ZReg::z1, PReg::p6, Reg::r29, 0), \"st3d {z31.d, z0.d, z1.d}, p6, [x29]\");\n  TEST_SINGLE(st3d(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, 0), \"st3d {z26.d, z27.d, z28.d}, p6, [x29]\");\n  TEST_SINGLE(st3d(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, -24), \"st3d {z26.d, z27.d, z28.d}, p6, [x29, #-24, mul vl]\");\n  TEST_SINGLE(st3d(ZReg::z26, ZReg::z27, ZReg::z28, PReg::p6, Reg::r29, 21), \"st3d {z26.d, z27.d, z28.d}, p6, [x29, #21, mul vl]\");\n\n  TEST_SINGLE(st4b(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6, Reg::r29, 0), \"st4b {z31.b, z0.b, z1.b, z2.b}, p6, [x29]\");\n  TEST_SINGLE(st4b(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, 0), \"st4b {z26.b, z27.b, z28.b, z29.b}, p6, [x29]\");\n  TEST_SINGLE(st4b(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, -32), \"st4b {z26.b, z27.b, z28.b, z29.b}, p6, [x29, \"\n                                                                                         \"#-32, mul vl]\");\n  TEST_SINGLE(st4b(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, 28), \"st4b {z26.b, z27.b, z28.b, z29.b}, p6, [x29, #28, \"\n                                                                                        \"mul vl]\");\n\n  TEST_SINGLE(st4h(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6, Reg::r29, 0), \"st4h {z31.h, z0.h, z1.h, z2.h}, p6, [x29]\");\n  TEST_SINGLE(st4h(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, 0), \"st4h {z26.h, z27.h, z28.h, z29.h}, p6, [x29]\");\n  TEST_SINGLE(st4h(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, -32), \"st4h {z26.h, z27.h, z28.h, z29.h}, p6, [x29, \"\n                                                                                         \"#-32, mul vl]\");\n  TEST_SINGLE(st4h(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, 28), \"st4h {z26.h, z27.h, z28.h, z29.h}, p6, [x29, #28, \"\n                                                                                        \"mul vl]\");\n\n  TEST_SINGLE(st4w(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6, Reg::r29, 0), \"st4w {z31.s, z0.s, z1.s, z2.s}, p6, [x29]\");\n  TEST_SINGLE(st4w(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, 0), \"st4w {z26.s, z27.s, z28.s, z29.s}, p6, [x29]\");\n  TEST_SINGLE(st4w(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, -32), \"st4w {z26.s, z27.s, z28.s, z29.s}, p6, [x29, \"\n                                                                                         \"#-32, mul vl]\");\n  TEST_SINGLE(st4w(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, 28), \"st4w {z26.s, z27.s, z28.s, z29.s}, p6, [x29, #28, \"\n                                                                                        \"mul vl]\");\n\n  TEST_SINGLE(st4d(ZReg::z31, ZReg::z0, ZReg::z1, ZReg::z2, PReg::p6, Reg::r29, 0), \"st4d {z31.d, z0.d, z1.d, z2.d}, p6, [x29]\");\n  TEST_SINGLE(st4d(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, 0), \"st4d {z26.d, z27.d, z28.d, z29.d}, p6, [x29]\");\n  TEST_SINGLE(st4d(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, -32), \"st4d {z26.d, z27.d, z28.d, z29.d}, p6, [x29, \"\n                                                                                         \"#-32, mul vl]\");\n  TEST_SINGLE(st4d(ZReg::z26, ZReg::z27, ZReg::z28, ZReg::z29, PReg::p6, Reg::r29, 28), \"st4d {z26.d, z27.d, z28.d, z29.d}, p6, [x29, #28, \"\n                                                                                        \"mul vl]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE contiguous store (scalar plus immediate)\") {\n  TEST_SINGLE(st1b<SubRegSize::i8Bit>(ZReg::z26, PReg::p6, Reg::r29, 0), \"st1b {z26.b}, p6, [x29]\");\n  TEST_SINGLE(st1b<SubRegSize::i16Bit>(ZReg::z26, PReg::p6, Reg::r29, 0), \"st1b {z26.h}, p6, [x29]\");\n  TEST_SINGLE(st1b<SubRegSize::i32Bit>(ZReg::z26, PReg::p6, Reg::r29, 0), \"st1b {z26.s}, p6, [x29]\");\n  TEST_SINGLE(st1b<SubRegSize::i64Bit>(ZReg::z26, PReg::p6, Reg::r29, 0), \"st1b {z26.d}, p6, [x29]\");\n\n  TEST_SINGLE(st1b<SubRegSize::i8Bit>(ZReg::z26, PReg::p6, Reg::r29, -8), \"st1b {z26.b}, p6, [x29, #-8, mul vl]\");\n  TEST_SINGLE(st1b<SubRegSize::i16Bit>(ZReg::z26, PReg::p6, Reg::r29, -8), \"st1b {z26.h}, p6, [x29, #-8, mul vl]\");\n  TEST_SINGLE(st1b<SubRegSize::i32Bit>(ZReg::z26, PReg::p6, Reg::r29, -8), \"st1b {z26.s}, p6, [x29, #-8, mul vl]\");\n  TEST_SINGLE(st1b<SubRegSize::i64Bit>(ZReg::z26, PReg::p6, Reg::r29, -8), \"st1b {z26.d}, p6, [x29, #-8, mul vl]\");\n\n  TEST_SINGLE(st1b<SubRegSize::i8Bit>(ZReg::z26, PReg::p6, Reg::r29, 7), \"st1b {z26.b}, p6, [x29, #7, mul vl]\");\n  TEST_SINGLE(st1b<SubRegSize::i16Bit>(ZReg::z26, PReg::p6, Reg::r29, 7), \"st1b {z26.h}, p6, [x29, #7, mul vl]\");\n  TEST_SINGLE(st1b<SubRegSize::i32Bit>(ZReg::z26, PReg::p6, Reg::r29, 7), \"st1b {z26.s}, p6, [x29, #7, mul vl]\");\n  TEST_SINGLE(st1b<SubRegSize::i64Bit>(ZReg::z26, PReg::p6, Reg::r29, 7), \"st1b {z26.d}, p6, [x29, #7, mul vl]\");\n\n  // TEST_SINGLE(st1h<SubRegSize::i8Bit>(ZReg::z26, PReg::p6, Reg::r29, 0), \"st1h {z26.b}, p6, [x29]\");\n  TEST_SINGLE(st1h<SubRegSize::i16Bit>(ZReg::z26, PReg::p6, Reg::r29, 0), \"st1h {z26.h}, p6, [x29]\");\n  TEST_SINGLE(st1h<SubRegSize::i32Bit>(ZReg::z26, PReg::p6, Reg::r29, 0), \"st1h {z26.s}, p6, [x29]\");\n  TEST_SINGLE(st1h<SubRegSize::i64Bit>(ZReg::z26, PReg::p6, Reg::r29, 0), \"st1h {z26.d}, p6, [x29]\");\n\n  // TEST_SINGLE(st1h<SubRegSize::i8Bit>(ZReg::z26, PReg::p6, Reg::r29, -8), \"st1h {z26.b}, p6, [x29, #-8, mul vl]\");\n  TEST_SINGLE(st1h<SubRegSize::i16Bit>(ZReg::z26, PReg::p6, Reg::r29, -8), \"st1h {z26.h}, p6, [x29, #-8, mul vl]\");\n  TEST_SINGLE(st1h<SubRegSize::i32Bit>(ZReg::z26, PReg::p6, Reg::r29, -8), \"st1h {z26.s}, p6, [x29, #-8, mul vl]\");\n  TEST_SINGLE(st1h<SubRegSize::i64Bit>(ZReg::z26, PReg::p6, Reg::r29, -8), \"st1h {z26.d}, p6, [x29, #-8, mul vl]\");\n\n  // TEST_SINGLE(st1h<SubRegSize::i8Bit>(ZReg::z26, PReg::p6, Reg::r29, 7), \"st1h {z26.b}, p6, [x29, #7, mul vl]\");\n  TEST_SINGLE(st1h<SubRegSize::i16Bit>(ZReg::z26, PReg::p6, Reg::r29, 7), \"st1h {z26.h}, p6, [x29, #7, mul vl]\");\n  TEST_SINGLE(st1h<SubRegSize::i32Bit>(ZReg::z26, PReg::p6, Reg::r29, 7), \"st1h {z26.s}, p6, [x29, #7, mul vl]\");\n  TEST_SINGLE(st1h<SubRegSize::i64Bit>(ZReg::z26, PReg::p6, Reg::r29, 7), \"st1h {z26.d}, p6, [x29, #7, mul vl]\");\n\n  // TEST_SINGLE(st1w<SubRegSize::i8Bit>(ZReg::z26, PReg::p6, Reg::r29, 0), \"st1w {z26.b}, p6, [x29]\");\n  // TEST_SINGLE(st1w<SubRegSize::i16Bit>(ZReg::z26, PReg::p6, Reg::r29, 0), \"st1w {z26.h}, p6, [x29]\");\n  TEST_SINGLE(st1w<SubRegSize::i32Bit>(ZReg::z26, PReg::p6, Reg::r29, 0), \"st1w {z26.s}, p6, [x29]\");\n  TEST_SINGLE(st1w<SubRegSize::i64Bit>(ZReg::z26, PReg::p6, Reg::r29, 0), \"st1w {z26.d}, p6, [x29]\");\n\n  // TEST_SINGLE(st1w<SubRegSize::i8Bit>(ZReg::z26, PReg::p6, Reg::r29, -8), \"st1w {z26.b}, p6, [x29, #-8, mul vl]\");\n  // TEST_SINGLE(st1w<SubRegSize::i16Bit>(ZReg::z26, PReg::p6, Reg::r29, -8), \"st1w {z26.h}, p6, [x29, #-8, mul vl]\");\n  TEST_SINGLE(st1w<SubRegSize::i32Bit>(ZReg::z26, PReg::p6, Reg::r29, -8), \"st1w {z26.s}, p6, [x29, #-8, mul vl]\");\n  TEST_SINGLE(st1w<SubRegSize::i64Bit>(ZReg::z26, PReg::p6, Reg::r29, -8), \"st1w {z26.d}, p6, [x29, #-8, mul vl]\");\n\n  // TEST_SINGLE(st1w<SubRegSize::i8Bit>(ZReg::z26, PReg::p6, Reg::r29, 7), \"st1w {z26.b}, p6, [x29, #7, mul vl]\");\n  // TEST_SINGLE(st1w<SubRegSize::i16Bit>(ZReg::z26, PReg::p6, Reg::r29, 7), \"st1w {z26.h}, p6, [x29, #7, mul vl]\");\n  TEST_SINGLE(st1w<SubRegSize::i32Bit>(ZReg::z26, PReg::p6, Reg::r29, 7), \"st1w {z26.s}, p6, [x29, #7, mul vl]\");\n  TEST_SINGLE(st1w<SubRegSize::i64Bit>(ZReg::z26, PReg::p6, Reg::r29, 7), \"st1w {z26.d}, p6, [x29, #7, mul vl]\");\n\n  TEST_SINGLE(st1d(ZReg::z26, PReg::p6, Reg::r29, 0), \"st1d {z26.d}, p6, [x29]\");\n  TEST_SINGLE(st1d(ZReg::z26, PReg::p6, Reg::r29, -8), \"st1d {z26.d}, p6, [x29, #-8, mul vl]\");\n  TEST_SINGLE(st1d(ZReg::z26, PReg::p6, Reg::r29, 7), \"st1d {z26.d}, p6, [x29, #7, mul vl]\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE Scatters\") {\n  TEST_SINGLE(st1b<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)), \"st1b {z30.s}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.s, uxtw]\");\n  TEST_SINGLE(st1b<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)), \"st1b {z30.s}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.s, sxtw]\");\n  TEST_SINGLE(st1b<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)), \"st1b {z30.d}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.d, uxtw]\");\n  TEST_SINGLE(st1b<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)), \"st1b {z30.d}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.d, sxtw]\");\n  TEST_SINGLE(st1b<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)), \"st1b {z30.d}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.d]\");\n\n  TEST_SINGLE(st1b<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(ZReg::z31, 0)), \"st1b {z30.s}, p6, [z31.s]\");\n  TEST_SINGLE(st1b<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(ZReg::z31, 31)), \"st1b {z30.s}, p6, [z31.s, #31]\");\n  TEST_SINGLE(st1b<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(ZReg::z31, 0)), \"st1b {z30.d}, p6, [z31.d]\");\n  TEST_SINGLE(st1b<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(ZReg::z31, 31)), \"st1b {z30.d}, p6, [z31.d, #31]\");\n\n  TEST_SINGLE(st1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 1)), \"st1h {z30.s}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.s, uxtw \"\n                                                                                                                           \"#1]\");\n  TEST_SINGLE(st1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 1)), \"st1h {z30.s}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.s, sxtw \"\n                                                                                                                           \"#1]\");\n  TEST_SINGLE(st1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 1)), \"st1h {z30.d}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.d, uxtw \"\n                                                                                                                           \"#1]\");\n  TEST_SINGLE(st1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 1)), \"st1h {z30.d}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.d, sxtw \"\n                                                                                                                           \"#1]\");\n  TEST_SINGLE(st1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_LSL, 1)), \"st1h {z30.d}, \"\n                                                                                                                          \"p6, [x30, \"\n                                                                                                                          \"z31.d, lsl #1]\");\n\n  TEST_SINGLE(st1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)), \"st1h {z30.s}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.s, uxtw]\");\n  TEST_SINGLE(st1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)), \"st1h {z30.s}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.s, sxtw]\");\n  TEST_SINGLE(st1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)), \"st1h {z30.d}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.d, uxtw]\");\n  TEST_SINGLE(st1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)), \"st1h {z30.d}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.d, sxtw]\");\n  TEST_SINGLE(st1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)), \"st1h {z30.d}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.d]\");\n\n  TEST_SINGLE(st1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(ZReg::z31, 0)), \"st1h {z30.s}, p6, [z31.s]\");\n  TEST_SINGLE(st1h<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(ZReg::z31, 62)), \"st1h {z30.s}, p6, [z31.s, #62]\");\n  TEST_SINGLE(st1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(ZReg::z31, 0)), \"st1h {z30.d}, p6, [z31.d]\");\n  TEST_SINGLE(st1h<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(ZReg::z31, 62)), \"st1h {z30.d}, p6, [z31.d, #62]\");\n\n  TEST_SINGLE(st1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 2)), \"st1w {z30.s}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.s, uxtw \"\n                                                                                                                           \"#2]\");\n  TEST_SINGLE(st1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 2)), \"st1w {z30.s}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.s, sxtw \"\n                                                                                                                           \"#2]\");\n  TEST_SINGLE(st1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 2)), \"st1w {z30.d}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.d, uxtw \"\n                                                                                                                           \"#2]\");\n  TEST_SINGLE(st1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 2)), \"st1w {z30.d}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.d, sxtw \"\n                                                                                                                           \"#2]\");\n  TEST_SINGLE(st1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_LSL, 2)), \"st1w {z30.d}, \"\n                                                                                                                          \"p6, [x30, \"\n                                                                                                                          \"z31.d, lsl #2]\");\n\n  TEST_SINGLE(st1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)), \"st1w {z30.s}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.s, uxtw]\");\n  TEST_SINGLE(st1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)), \"st1w {z30.s}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.s, sxtw]\");\n  TEST_SINGLE(st1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)), \"st1w {z30.d}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.d, uxtw]\");\n  TEST_SINGLE(st1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)), \"st1w {z30.d}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.d, sxtw]\");\n  TEST_SINGLE(st1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)), \"st1w {z30.d}, \"\n                                                                                                                           \"p6, [x30, \"\n                                                                                                                           \"z31.d]\");\n\n  TEST_SINGLE(st1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(ZReg::z31, 0)), \"st1w {z30.s}, p6, [z31.s]\");\n  TEST_SINGLE(st1w<SubRegSize::i32Bit>(ZReg::z30, PReg::p6, SVEMemOperand(ZReg::z31, 124)), \"st1w {z30.s}, p6, [z31.s, #124]\");\n  TEST_SINGLE(st1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(ZReg::z31, 0)), \"st1w {z30.d}, p6, [z31.d]\");\n  TEST_SINGLE(st1w<SubRegSize::i64Bit>(ZReg::z30, PReg::p6, SVEMemOperand(ZReg::z31, 124)), \"st1w {z30.d}, p6, [z31.d, #124]\");\n\n  TEST_SINGLE(st1d(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 3)), \"st1d {z30.d}, p6, [x30, z31.d, \"\n                                                                                                       \"uxtw #3]\");\n  TEST_SINGLE(st1d(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 3)), \"st1d {z30.d}, p6, [x30, z31.d, \"\n                                                                                                       \"sxtw #3]\");\n  TEST_SINGLE(st1d(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_LSL, 3)), \"st1d {z30.d}, p6, [x30, z31.d, lsl \"\n                                                                                                      \"#3]\");\n\n  TEST_SINGLE(st1d(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_UXTW, 0)), \"st1d {z30.d}, p6, [x30, z31.d, \"\n                                                                                                       \"uxtw]\");\n  TEST_SINGLE(st1d(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_SXTW, 0)), \"st1d {z30.d}, p6, [x30, z31.d, \"\n                                                                                                       \"sxtw]\");\n  TEST_SINGLE(st1d(ZReg::z30, PReg::p6, SVEMemOperand(XReg::x30, ZReg::z31, SVEModType::MOD_NONE, 0)), \"st1d {z30.d}, p6, [x30, z31.d]\");\n\n  TEST_SINGLE(st1d(ZReg::z30, PReg::p6, SVEMemOperand(ZReg::z31, 0)), \"st1d {z30.d}, p6, [z31.d]\");\n  TEST_SINGLE(st1d(ZReg::z30, PReg::p6, SVEMemOperand(ZReg::z31, 248)), \"st1d {z30.d}, p6, [z31.d, #248]\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: SVE: SVE Unsized Stores\") {\n  TEST_SINGLE(str(PReg::p6, XReg::x29, 0), \"str p6, [x29]\");\n  TEST_SINGLE(str(PReg::p6, XReg::x29, -256), \"str p6, [x29, #-256, mul vl]\");\n  TEST_SINGLE(str(PReg::p6, XReg::x29, 255), \"str p6, [x29, #255, mul vl]\");\n\n  TEST_SINGLE(str(ZReg::z30, XReg::x29, 0), \"str z30, [x29]\");\n  TEST_SINGLE(str(ZReg::z30, XReg::x29, -256), \"str z30, [x29, #-256, mul vl]\");\n  TEST_SINGLE(str(ZReg::z30, XReg::x29, 255), \"str z30, [x29, #255, mul vl]\");\n}\n"
  },
  {
    "path": "FEXCore/unittests/Emitter/Scalar_Tests.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"TestDisassembler.h\"\n\n#include <catch2/catch_test_macros.hpp>\n#include <fcntl.h>\n\nusing namespace ARMEmitter;\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Advanced SIMD scalar copy\") {\n  TEST_SINGLE(dup(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 0), \"mov b30, v29.b[0]\");\n  TEST_SINGLE(dup(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 15), \"mov b30, v29.b[15]\");\n  TEST_SINGLE(mov(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 0), \"mov b30, v29.b[0]\");\n  TEST_SINGLE(mov(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 15), \"mov b30, v29.b[15]\");\n\n  TEST_SINGLE(dup(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 0), \"mov h30, v29.h[0]\");\n  TEST_SINGLE(dup(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 7), \"mov h30, v29.h[7]\");\n  TEST_SINGLE(mov(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 0), \"mov h30, v29.h[0]\");\n  TEST_SINGLE(mov(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 7), \"mov h30, v29.h[7]\");\n\n  TEST_SINGLE(dup(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 0), \"mov s30, v29.s[0]\");\n  TEST_SINGLE(dup(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 3), \"mov s30, v29.s[3]\");\n  TEST_SINGLE(mov(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 0), \"mov s30, v29.s[0]\");\n  TEST_SINGLE(mov(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 3), \"mov s30, v29.s[3]\");\n\n  TEST_SINGLE(dup(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 0), \"mov d30, v29.d[0]\");\n  TEST_SINGLE(dup(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"mov d30, v29.d[1]\");\n  TEST_SINGLE(mov(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 0), \"mov d30, v29.d[0]\");\n  TEST_SINGLE(mov(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"mov d30, v29.d[1]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Advanced SIMD scalar three same FP16\") {\n  TEST_SINGLE(fmulx(HReg::h30, HReg::h29, HReg::h28), \"fmulx h30, h29, h28\");\n  TEST_SINGLE(fcmeq(HReg::h30, HReg::h29, HReg::h28), \"fcmeq h30, h29, h28\");\n  TEST_SINGLE(frecps(HReg::h30, HReg::h29, HReg::h28), \"frecps h30, h29, h28\");\n  TEST_SINGLE(frsqrts(HReg::h30, HReg::h29, HReg::h28), \"frsqrts h30, h29, h28\");\n  TEST_SINGLE(fcmge(HReg::h30, HReg::h29, HReg::h28), \"fcmge h30, h29, h28\");\n  TEST_SINGLE(facge(HReg::h30, HReg::h29, HReg::h28), \"facge h30, h29, h28\");\n  TEST_SINGLE(fabd(HReg::h30, HReg::h29, HReg::h28), \"fabd h30, h29, h28\");\n  TEST_SINGLE(fcmgt(HReg::h30, HReg::h29, HReg::h28), \"fcmgt h30, h29, h28\");\n  TEST_SINGLE(facgt(HReg::h30, HReg::h29, HReg::h28), \"facgt h30, h29, h28\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Advanced SIMD scalar two-register miscellaneous FP16\") {\n  TEST_SINGLE(fcvtns(HReg::h30, HReg::h29), \"fcvtns h30, h29\");\n  TEST_SINGLE(fcvtms(HReg::h30, HReg::h29), \"fcvtms h30, h29\");\n  TEST_SINGLE(fcvtas(HReg::h30, HReg::h29), \"fcvtas h30, h29\");\n  TEST_SINGLE(scvtf(HReg::h30, HReg::h29), \"scvtf h30, h29\");\n  TEST_SINGLE(fcmgt(HReg::h30, HReg::h29), \"fcmgt h30, h29, #0.0\");\n  TEST_SINGLE(fcmeq(HReg::h30, HReg::h29), \"fcmeq h30, h29, #0.0\");\n  TEST_SINGLE(fcmlt(HReg::h30, HReg::h29), \"fcmlt h30, h29, #0.0\");\n  TEST_SINGLE(fcvtps(HReg::h30, HReg::h29), \"fcvtps h30, h29\");\n  TEST_SINGLE(fcvtzs(HReg::h30, HReg::h29), \"fcvtzs h30, h29\");\n  TEST_SINGLE(frecpe(HReg::h30, HReg::h29), \"frecpe h30, h29\");\n  TEST_SINGLE(frecpx(HReg::h30, HReg::h29), \"frecpx h30, h29\");\n  TEST_SINGLE(fcvtnu(HReg::h30, HReg::h29), \"fcvtnu h30, h29\");\n  TEST_SINGLE(fcvtmu(HReg::h30, HReg::h29), \"fcvtmu h30, h29\");\n  TEST_SINGLE(fcvtau(HReg::h30, HReg::h29), \"fcvtau h30, h29\");\n  TEST_SINGLE(ucvtf(HReg::h30, HReg::h29), \"ucvtf h30, h29\");\n  TEST_SINGLE(fcmge(HReg::h30, HReg::h29), \"fcmge h30, h29, #0.0\");\n  TEST_SINGLE(fcmle(HReg::h30, HReg::h29), \"fcmle h30, h29, #0.0\");\n  TEST_SINGLE(fcvtpu(HReg::h30, HReg::h29), \"fcvtpu h30, h29\");\n  TEST_SINGLE(fcvtzu(HReg::h30, HReg::h29), \"fcvtzu h30, h29\");\n  TEST_SINGLE(frsqrte(HReg::h30, HReg::h29), \"frsqrte h30, h29\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Advanced SIMD scalar three same extra\") {\n  TEST_SINGLE(sqrdmlah(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"sqrdmlah h30, h29, h28\");\n  TEST_SINGLE(sqrdmlah(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"sqrdmlah s30, s29, s28\");\n\n  TEST_SINGLE(sqrdmlsh(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"sqrdmlsh h30, h29, h28\");\n  TEST_SINGLE(sqrdmlsh(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"sqrdmlsh s30, s29, s28\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Advanced SIMD scalar two-register miscellaneous\") {\n  // Commented out lines showcase unallocated encodings.\n  TEST_SINGLE(suqadd(ScalarRegSize::i8Bit, VReg::v30, VReg::v29), \"suqadd b30, b29\");\n  TEST_SINGLE(suqadd(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"suqadd h30, h29\");\n  TEST_SINGLE(suqadd(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"suqadd s30, s29\");\n  TEST_SINGLE(suqadd(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"suqadd d30, d29\");\n\n  TEST_SINGLE(sqabs(ScalarRegSize::i8Bit, VReg::v30, VReg::v29), \"sqabs b30, b29\");\n  TEST_SINGLE(sqabs(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"sqabs h30, h29\");\n  TEST_SINGLE(sqabs(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"sqabs s30, s29\");\n  TEST_SINGLE(sqabs(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"sqabs d30, d29\");\n\n  // TEST_SINGLE(cmgt(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"cmgt b30, b29, #0\");\n  // TEST_SINGLE(cmgt(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"cmgt h30, h29, #0\");\n  // TEST_SINGLE(cmgt(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"cmgt s30, s29, #0\");\n  TEST_SINGLE(cmgt(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"cmgt d30, d29, #0\");\n\n  // TEST_SINGLE(cmeq(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"cmeq b30, b29, #0\");\n  // TEST_SINGLE(cmeq(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"cmeq h30, h29, #0\");\n  // TEST_SINGLE(cmeq(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"cmeq s30, s29, #0\");\n  TEST_SINGLE(cmeq(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"cmeq d30, d29, #0\");\n\n  // TEST_SINGLE(cmlt(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"cmlt b30, b29, #0\");\n  // TEST_SINGLE(cmlt(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"cmlt h30, h29, #0\");\n  // TEST_SINGLE(cmlt(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"cmlt s30, s29, #0\");\n  TEST_SINGLE(cmlt(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"cmlt d30, d29, #0\");\n\n  // TEST_SINGLE(abs(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"abs b30, b29\");\n  // TEST_SINGLE(abs(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"abs h30, h29\");\n  // TEST_SINGLE(abs(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"abs s30, s29\");\n  TEST_SINGLE(abs(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"abs d30, d29\");\n\n  TEST_SINGLE(sqxtn(ScalarRegSize::i8Bit, VReg::v30, VReg::v29), \"sqxtn b30, h29\");\n  TEST_SINGLE(sqxtn(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"sqxtn h30, s29\");\n  TEST_SINGLE(sqxtn(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"sqxtn s30, d29\");\n  // TEST_SINGLE(sqxtn(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"sqxtn d30, d29\");\n\n  // TEST_SINGLE(fcvtns(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fcvtns b30, b29\");\n  // TEST_SINGLE(fcvtns(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcvtns h30, h29\");\n  TEST_SINGLE(fcvtns(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcvtns s30, s29\");\n  TEST_SINGLE(fcvtns(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcvtns d30, d29\");\n\n  // TEST_SINGLE(fcvtms(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fcvtms b30, b29\");\n  // TEST_SINGLE(fcvtms(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcvtms h30, h29\");\n  TEST_SINGLE(fcvtms(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcvtms s30, s29\");\n  TEST_SINGLE(fcvtms(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcvtms d30, d29\");\n\n  // TEST_SINGLE(fcvtas(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fcvtas b30, b29\");\n  // TEST_SINGLE(fcvtas(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcvtas h30, h29\");\n  TEST_SINGLE(fcvtas(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcvtas s30, s29\");\n  TEST_SINGLE(fcvtas(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcvtas d30, d29\");\n\n  // TEST_SINGLE(scvtf(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"scvtf b30, b29\");\n  // TEST_SINGLE(scvtf(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"scvtf h30, h29\");\n  TEST_SINGLE(scvtf(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"scvtf s30, s29\");\n  TEST_SINGLE(scvtf(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"scvtf d30, d29\");\n\n  // TEST_SINGLE(fcmeq(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fcmeq b30, b29\");\n  // TEST_SINGLE(fcmeq(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcmeq h30, h29\");\n  TEST_SINGLE(fcmeq(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcmeq s30, s29, #0.0\");\n  TEST_SINGLE(fcmeq(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcmeq d30, d29, #0.0\");\n\n  // TEST_SINGLE(fcmlt(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fcmlt b30, b29\");\n  // TEST_SINGLE(fcmlt(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcmlt h30, h29\");\n  TEST_SINGLE(fcmlt(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcmlt s30, s29, #0.0\");\n  TEST_SINGLE(fcmlt(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcmlt d30, d29, #0.0\");\n\n  // TEST_SINGLE(fcvtps(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fcvtps b30, b29\");\n  // TEST_SINGLE(fcvtps(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcvtps h30, h29\");\n  TEST_SINGLE(fcvtps(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcvtps s30, s29\");\n  TEST_SINGLE(fcvtps(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcvtps d30, d29\");\n\n  // TEST_SINGLE(fcvtzs(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fcvtzs b30, b29\");\n  // TEST_SINGLE(fcvtzs(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcvtzs h30, h29\");\n  TEST_SINGLE(fcvtzs(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcvtzs s30, s29\");\n  TEST_SINGLE(fcvtzs(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcvtzs d30, d29\");\n\n  // TEST_SINGLE(frecpe(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"frecpe b30, b29\");\n  // TEST_SINGLE(frecpe(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"frecpe h30, h29\");\n  TEST_SINGLE(frecpe(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"frecpe s30, s29\");\n  TEST_SINGLE(frecpe(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"frecpe d30, d29\");\n\n  // TEST_SINGLE(frecpx(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"frecpx b30, b29\");\n  // TEST_SINGLE(frecpx(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"frecpx h30, h29\");\n  TEST_SINGLE(frecpx(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"frecpx s30, s29\");\n  TEST_SINGLE(frecpx(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"frecpx d30, d29\");\n\n  TEST_SINGLE(usqadd(ScalarRegSize::i8Bit, VReg::v30, VReg::v29), \"usqadd b30, b29\");\n  TEST_SINGLE(usqadd(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"usqadd h30, h29\");\n  TEST_SINGLE(usqadd(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"usqadd s30, s29\");\n  TEST_SINGLE(usqadd(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"usqadd d30, d29\");\n\n  TEST_SINGLE(sqneg(ScalarRegSize::i8Bit, VReg::v30, VReg::v29), \"sqneg b30, b29\");\n  TEST_SINGLE(sqneg(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"sqneg h30, h29\");\n  TEST_SINGLE(sqneg(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"sqneg s30, s29\");\n  TEST_SINGLE(sqneg(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"sqneg d30, d29\");\n\n  // TEST_SINGLE(cmge(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"cmge b30, b29\");\n  // TEST_SINGLE(cmge(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"cmge h30, h29\");\n  // TEST_SINGLE(cmge(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"cmge s30, s29\");\n  TEST_SINGLE(cmge(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"cmge d30, d29, #0\");\n\n  // TEST_SINGLE(cmle(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"cmle b30, b29\");\n  // TEST_SINGLE(cmle(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"cmle h30, h29\");\n  // TEST_SINGLE(cmle(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"cmle s30, s29\");\n  TEST_SINGLE(cmle(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"cmle d30, d29, #0\");\n\n  // TEST_SINGLE(neg(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"neg b30, b29\");\n  // TEST_SINGLE(neg(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"neg h30, h29\");\n  // TEST_SINGLE(neg(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"neg s30, s29\");\n  TEST_SINGLE(neg(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"neg d30, d29\");\n\n  TEST_SINGLE(sqxtun(ScalarRegSize::i8Bit, VReg::v30, VReg::v29), \"sqxtun b30, h29\");\n  TEST_SINGLE(sqxtun(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"sqxtun h30, s29\");\n  TEST_SINGLE(sqxtun(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"sqxtun s30, d29\");\n  // TEST_SINGLE(sqxtun(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"sqxtun d30, d29\");\n\n  TEST_SINGLE(uqxtn(ScalarRegSize::i8Bit, VReg::v30, VReg::v29), \"uqxtn b30, h29\");\n  TEST_SINGLE(uqxtn(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"uqxtn h30, s29\");\n  TEST_SINGLE(uqxtn(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"uqxtn s30, d29\");\n  // TEST_SINGLE(uqxtn(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"uqxtn d30, d29\");\n\n  // TEST_SINGLE(fcvtxn(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fcvtxn b30, b29\");\n  // TEST_SINGLE(fcvtxn(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcvtxn h30, h29\");\n  TEST_SINGLE(fcvtxn(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcvtxn s30, d29\");\n  // TEST_SINGLE(fcvtxn(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcvtxn d30, d29\");\n\n  // TEST_SINGLE(fcvtnu(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fcvtnu b30, b29\");\n  // TEST_SINGLE(fcvtnu(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcvtnu h30, h29\");\n  TEST_SINGLE(fcvtnu(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcvtnu s30, s29\");\n  TEST_SINGLE(fcvtnu(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcvtnu d30, d29\");\n\n  // TEST_SINGLE(fcvtmu(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fcvtmu b30, b29\");\n  // TEST_SINGLE(fcvtmu(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcvtmu h30, h29\");\n  TEST_SINGLE(fcvtmu(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcvtmu s30, s29\");\n  TEST_SINGLE(fcvtmu(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcvtmu d30, d29\");\n\n  // TEST_SINGLE(fcvtau(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fcvtau b30, b29\");\n  // TEST_SINGLE(fcvtau(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcvtau h30, h29\");\n  TEST_SINGLE(fcvtau(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcvtau s30, s29\");\n  TEST_SINGLE(fcvtau(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcvtau d30, d29\");\n\n  // TEST_SINGLE(ucvtf(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"ucvtf b30, b29\");\n  // TEST_SINGLE(ucvtf(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"ucvtf h30, h29\");\n  TEST_SINGLE(ucvtf(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"ucvtf s30, s29\");\n  TEST_SINGLE(ucvtf(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"ucvtf d30, d29\");\n\n  // TEST_SINGLE(fcmge(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fcmge b30, b29\");\n  // TEST_SINGLE(fcmge(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcmge h30, h29\");\n  TEST_SINGLE(fcmge(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcmge s30, s29, #0.0\");\n  TEST_SINGLE(fcmge(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcmge d30, d29, #0.0\");\n\n  // TEST_SINGLE(fcmle(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fcmle b30, b29\");\n  // TEST_SINGLE(fcmle(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcmle h30, h29\");\n  TEST_SINGLE(fcmle(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcmle s30, s29, #0.0\");\n  TEST_SINGLE(fcmle(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcmle d30, d29, #0.0\");\n\n  // TEST_SINGLE(fcvtpu(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fcvtpu b30, b29\");\n  // TEST_SINGLE(fcvtpu(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcvtpu h30, h29\");\n  TEST_SINGLE(fcvtpu(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcvtpu s30, s29\");\n  TEST_SINGLE(fcvtpu(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcvtpu d30, d29\");\n\n  // TEST_SINGLE(fcvtzu(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fcvtzu b30, b29\");\n  // TEST_SINGLE(fcvtzu(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcvtzu h30, h29\");\n  TEST_SINGLE(fcvtzu(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcvtzu s30, s29\");\n  TEST_SINGLE(fcvtzu(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcvtzu d30, d29\");\n\n  // TEST_SINGLE(frsqrte(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"frsqrte b30, b29\");\n  // TEST_SINGLE(frsqrte(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"frsqrte h30, h29\");\n  TEST_SINGLE(frsqrte(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"frsqrte s30, s29\");\n  TEST_SINGLE(frsqrte(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"frsqrte d30, d29\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Advanced SIMD scalar pairwise\") {\n  // Commented out lines showcase unallocated encodings.\n  // TEST_SINGLE(addp(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"addp b30, b29\");\n  // TEST_SINGLE(addp(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"addp h30, h29\");\n  // TEST_SINGLE(addp(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"addp s30, s29\");\n  TEST_SINGLE(addp(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"addp d30, v29.2d\");\n\n  TEST_SINGLE(fmaxnmp(HReg::h30, HReg::h29), \"fmaxnmp h30, v29.2h\");\n  // TEST_SINGLE(fmaxnmp(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fmaxnmp b30, b29\");\n  // TEST_SINGLE(fmaxnmp(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fmaxnmp h30, h29\");\n  TEST_SINGLE(fmaxnmp(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fmaxnmp s30, v29.2s\");\n  TEST_SINGLE(fmaxnmp(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fmaxnmp d30, v29.2d\");\n\n  TEST_SINGLE(faddp(HReg::h30, HReg::h29), \"faddp h30, v29.2h\");\n  // TEST_SINGLE(faddp(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"faddp b30, b29\");\n  // TEST_SINGLE(faddp(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"faddp h30, h29\");\n  TEST_SINGLE(faddp(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"faddp s30, v29.2s\");\n  TEST_SINGLE(faddp(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"faddp d30, v29.2d\");\n\n  TEST_SINGLE(fmaxp(HReg::h30, HReg::h29), \"fmaxp h30, v29.2h\");\n  // TEST_SINGLE(fmaxp(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fmaxp b30, b29\");\n  // TEST_SINGLE(fmaxp(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fmaxp h30, h29\");\n  TEST_SINGLE(fmaxp(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fmaxp s30, v29.2s\");\n  TEST_SINGLE(fmaxp(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fmaxp d30, v29.2d\");\n\n  TEST_SINGLE(fminnmp(HReg::h30, HReg::h29), \"fminnmp h30, v29.2h\");\n  // TEST_SINGLE(fminnmp(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fminnmp b30, b29\");\n  // TEST_SINGLE(fminnmp(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fminnmp h30, h29\");\n  TEST_SINGLE(fminnmp(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fminnmp s30, v29.2s\");\n  TEST_SINGLE(fminnmp(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fminnmp d30, v29.2d\");\n\n  TEST_SINGLE(fminp(HReg::h30, HReg::h29), \"fminp h30, v29.2h\");\n  // TEST_SINGLE(fminp(ScalarRegSize::i8Bit, VReg::v30, VReg::v29),  \"fminp b30, b29\");\n  // TEST_SINGLE(fminp(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fminp h30, h29\");\n  TEST_SINGLE(fminp(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fminp s30, v29.2s\");\n  TEST_SINGLE(fminp(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fminp d30, v29.2d\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Advanced SIMD scalar three different\") {\n  // Commented out lines showcase unallocated encodings.\n  // TEST_SINGLE(sqdmlal(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28),  \"sqdmlal v30.16b, v29.16b, v28.v16b\");\n  // TEST_SINGLE(sqdmlal(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"sqdmlal v30.16b, v29.16b, v28.v16b\");\n  TEST_SINGLE(sqdmlal(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"sqdmlal s30, h29, h28\");\n  TEST_SINGLE(sqdmlal(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"sqdmlal d30, s29, s28\");\n\n  // TEST_SINGLE(sqdmlsl(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28),  \"sqdmlsl v30.16b, v29.16b, v28.v16b\");\n  // TEST_SINGLE(sqdmlsl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"sqdmlsl v30.16b, v29.16b, v28.v16b\");\n  TEST_SINGLE(sqdmlsl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"sqdmlsl s30, h29, h28\");\n  TEST_SINGLE(sqdmlsl(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"sqdmlsl d30, s29, s28\");\n\n  // TEST_SINGLE(sqdmull(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28),  \"sqdmull v30.16b, v29.16b, v28.v16b\");\n  // TEST_SINGLE(sqdmull(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"sqdmull v30.16b, v29.16b, v28.v16b\");\n  TEST_SINGLE(sqdmull(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"sqdmull s30, h29, h28\");\n  TEST_SINGLE(sqdmull(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"sqdmull d30, s29, s28\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Advanced SIMD scalar three same\") {\n  TEST_SINGLE(sqadd(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"sqadd b30, b29, b28\");\n  TEST_SINGLE(sqadd(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"sqadd h30, h29, h28\");\n  TEST_SINGLE(sqadd(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"sqadd s30, s29, s28\");\n  TEST_SINGLE(sqadd(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"sqadd d30, d29, d28\");\n\n  TEST_SINGLE(sqsub(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"sqsub b30, b29, b28\");\n  TEST_SINGLE(sqsub(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"sqsub h30, h29, h28\");\n  TEST_SINGLE(sqsub(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"sqsub s30, s29, s28\");\n  TEST_SINGLE(sqsub(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"sqsub d30, d29, d28\");\n\n  // TEST_SINGLE(cmgt(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"cmgt b30, b29, b28\");\n  // TEST_SINGLE(cmgt(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"cmgt h30, h29, h28\");\n  // TEST_SINGLE(cmgt(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"cmgt s30, s29, s28\");\n  TEST_SINGLE(cmgt(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"cmgt d30, d29, d28\");\n\n  // TEST_SINGLE(cmge(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"cmge b30, b29, b28\");\n  // TEST_SINGLE(cmge(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"cmge h30, h29, h28\");\n  // TEST_SINGLE(cmge(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"cmge s30, s29, s28\");\n  TEST_SINGLE(cmge(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"cmge d30, d29, d28\");\n\n  // TEST_SINGLE(sshl(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"sshl b30, b29, b28\");\n  // TEST_SINGLE(sshl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"sshl h30, h29, h28\");\n  // TEST_SINGLE(sshl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"sshl s30, s29, s28\");\n  TEST_SINGLE(sshl(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"sshl d30, d29, d28\");\n\n  TEST_SINGLE(sqshl(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"sqshl b30, b29, b28\");\n  TEST_SINGLE(sqshl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"sqshl h30, h29, h28\");\n  TEST_SINGLE(sqshl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"sqshl s30, s29, s28\");\n  TEST_SINGLE(sqshl(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"sqshl d30, d29, d28\");\n\n  // TEST_SINGLE(srshl(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"srshl b30, b29, b28\");\n  // TEST_SINGLE(srshl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"srshl h30, h29, h28\");\n  // TEST_SINGLE(srshl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"srshl s30, s29, s28\");\n  TEST_SINGLE(srshl(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"srshl d30, d29, d28\");\n\n  TEST_SINGLE(sqrshl(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"sqrshl b30, b29, b28\");\n  TEST_SINGLE(sqrshl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"sqrshl h30, h29, h28\");\n  TEST_SINGLE(sqrshl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"sqrshl s30, s29, s28\");\n  TEST_SINGLE(sqrshl(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"sqrshl d30, d29, d28\");\n\n  // TEST_SINGLE(add(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"add b30, b29, b28\");\n  // TEST_SINGLE(add(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"add h30, h29, h28\");\n  // TEST_SINGLE(add(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"add s30, s29, s28\");\n  TEST_SINGLE(add(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"add d30, d29, d28\");\n\n  // TEST_SINGLE(cmtst(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"cmtst b30, b29, b28\");\n  // TEST_SINGLE(cmtst(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"cmtst h30, h29, h28\");\n  // TEST_SINGLE(cmtst(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"cmtst s30, s29, s28\");\n  TEST_SINGLE(cmtst(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"cmtst d30, d29, d28\");\n\n  // TEST_SINGLE(sqdmulh(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"sqdmulh b30, b29, b28\");\n  TEST_SINGLE(sqdmulh(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"sqdmulh h30, h29, h28\");\n  TEST_SINGLE(sqdmulh(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"sqdmulh s30, s29, s28\");\n  // TEST_SINGLE(sqdmulh(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"sqdmulh d30, d29, d28\");\n\n  // TEST_SINGLE(fmulx(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"fmulx b30, b29, b28\");\n  // TEST_SINGLE(fmulx(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"fmulx h30, h29, h28\");\n  TEST_SINGLE(fmulx(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"fmulx s30, s29, s28\");\n  TEST_SINGLE(fmulx(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"fmulx d30, d29, d28\");\n\n  // TEST_SINGLE(fcmeq(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"fcmeq b30, b29, b28\");\n  // TEST_SINGLE(fcmeq(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"fcmeq h30, h29, h28\");\n  TEST_SINGLE(fcmeq(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"fcmeq s30, s29, s28\");\n  TEST_SINGLE(fcmeq(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"fcmeq d30, d29, d28\");\n\n  // TEST_SINGLE(frecps(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"frecps b30, b29, b28\");\n  // TEST_SINGLE(frecps(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"frecps h30, h29, h28\");\n  TEST_SINGLE(frecps(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"frecps s30, s29, s28\");\n  TEST_SINGLE(frecps(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"frecps d30, d29, d28\");\n\n  // TEST_SINGLE(frsqrts(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"frsqrts b30, b29, b28\");\n  // TEST_SINGLE(frsqrts(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"frsqrts h30, h29, h28\");\n  TEST_SINGLE(frsqrts(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"frsqrts s30, s29, s28\");\n  TEST_SINGLE(frsqrts(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"frsqrts d30, d29, d28\");\n\n  TEST_SINGLE(uqadd(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"uqadd b30, b29, b28\");\n  TEST_SINGLE(uqadd(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"uqadd h30, h29, h28\");\n  TEST_SINGLE(uqadd(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"uqadd s30, s29, s28\");\n  TEST_SINGLE(uqadd(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"uqadd d30, d29, d28\");\n\n  TEST_SINGLE(uqsub(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"uqsub b30, b29, b28\");\n  TEST_SINGLE(uqsub(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"uqsub h30, h29, h28\");\n  TEST_SINGLE(uqsub(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"uqsub s30, s29, s28\");\n  TEST_SINGLE(uqsub(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"uqsub d30, d29, d28\");\n\n  // TEST_SINGLE(cmhi(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"cmhi b30, b29, b28\");\n  // TEST_SINGLE(cmhi(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"cmhi h30, h29, h28\");\n  // TEST_SINGLE(cmhi(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"cmhi s30, s29, s28\");\n  TEST_SINGLE(cmhi(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"cmhi d30, d29, d28\");\n\n  // TEST_SINGLE(cmhs(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"cmhs b30, b29, b28\");\n  // TEST_SINGLE(cmhs(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"cmhs h30, h29, h28\");\n  // TEST_SINGLE(cmhs(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"cmhs s30, s29, s28\");\n  TEST_SINGLE(cmhs(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"cmhs d30, d29, d28\");\n\n  // TEST_SINGLE(ushl(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"ushl b30, b29, b28\");\n  // TEST_SINGLE(ushl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"ushl h30, h29, h28\");\n  // TEST_SINGLE(ushl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"ushl s30, s29, s28\");\n  TEST_SINGLE(ushl(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"ushl d30, d29, d28\");\n\n  TEST_SINGLE(uqshl(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"uqshl b30, b29, b28\");\n  TEST_SINGLE(uqshl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"uqshl h30, h29, h28\");\n  TEST_SINGLE(uqshl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"uqshl s30, s29, s28\");\n  TEST_SINGLE(uqshl(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"uqshl d30, d29, d28\");\n\n  // TEST_SINGLE(urshl(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"urshl b30, b29, b28\");\n  // TEST_SINGLE(urshl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"urshl h30, h29, h28\");\n  // TEST_SINGLE(urshl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"urshl s30, s29, s28\");\n  TEST_SINGLE(urshl(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"urshl d30, d29, d28\");\n\n  TEST_SINGLE(uqrshl(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"uqrshl b30, b29, b28\");\n  TEST_SINGLE(uqrshl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"uqrshl h30, h29, h28\");\n  TEST_SINGLE(uqrshl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"uqrshl s30, s29, s28\");\n  TEST_SINGLE(uqrshl(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"uqrshl d30, d29, d28\");\n\n  // TEST_SINGLE(sub(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"sub b30, b29, b28\");\n  // TEST_SINGLE(sub(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"sub h30, h29, h28\");\n  // TEST_SINGLE(sub(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"sub s30, s29, s28\");\n  TEST_SINGLE(sub(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"sub d30, d29, d28\");\n\n  // TEST_SINGLE(cmeq(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"cmeq b30, b29, b28\");\n  // TEST_SINGLE(cmeq(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"cmeq h30, h29, h28\");\n  // TEST_SINGLE(cmeq(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"cmeq s30, s29, s28\");\n  TEST_SINGLE(cmeq(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"cmeq d30, d29, d28\");\n\n  // TEST_SINGLE(sqrdmulh(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"sqrdmulh b30, b29, b28\");\n  TEST_SINGLE(sqrdmulh(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"sqrdmulh h30, h29, h28\");\n  TEST_SINGLE(sqrdmulh(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"sqrdmulh s30, s29, s28\");\n  // TEST_SINGLE(sqrdmulh(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"sqrdmulh d30, d29, d28\");\n\n  // TEST_SINGLE(fcmge(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"fcmge b30, b29, b28\");\n  // TEST_SINGLE(fcmge(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"fcmge h30, h29, h28\");\n  TEST_SINGLE(fcmge(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"fcmge s30, s29, s28\");\n  TEST_SINGLE(fcmge(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"fcmge d30, d29, d28\");\n\n  // TEST_SINGLE(facge(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"facge b30, b29, b28\");\n  // TEST_SINGLE(facge(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"facge h30, h29, h28\");\n  TEST_SINGLE(facge(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"facge s30, s29, s28\");\n  TEST_SINGLE(facge(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"facge d30, d29, d28\");\n\n  // TEST_SINGLE(fabd(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"fabd b30, b29, b28\");\n  // TEST_SINGLE(fabd(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"fabd h30, h29, h28\");\n  TEST_SINGLE(fabd(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"fabd s30, s29, s28\");\n  TEST_SINGLE(fabd(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"fabd d30, d29, d28\");\n\n  // TEST_SINGLE(fcmgt(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"fcmgt b30, b29, b28\");\n  // TEST_SINGLE(fcmgt(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"fcmgt h30, h29, h28\");\n  TEST_SINGLE(fcmgt(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"fcmgt s30, s29, s28\");\n  TEST_SINGLE(fcmgt(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"fcmgt d30, d29, d28\");\n\n  // TEST_SINGLE(facgt(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, VReg::v28), \"facgt b30, b29, b28\");\n  // TEST_SINGLE(facgt(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"facgt h30, h29, h28\");\n  TEST_SINGLE(facgt(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"facgt s30, s29, s28\");\n  TEST_SINGLE(facgt(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"facgt d30, d29, d28\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Advanced SIMD scalar shift by immediate\") {\n  // TODO: Implement `UCVTF, FCVTZU' in emitter\n  // TEST_SINGLE(sshr(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1),   \"sshr b30, b29, #1\");\n  // TEST_SINGLE(sshr(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7),   \"sshr b30, b29, #7\");\n  // TEST_SINGLE(sshr(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1),  \"sshr h30, h29, #1\");\n  // TEST_SINGLE(sshr(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"sshr h30, h29, #15\");\n  // TEST_SINGLE(sshr(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1),  \"sshr s30, s29, #1\");\n  // TEST_SINGLE(sshr(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"sshr s30, s29, #31\");\n  TEST_SINGLE(sshr(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"sshr d30, d29, #1\");\n  TEST_SINGLE(sshr(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"sshr d30, d29, #63\");\n\n  // TEST_SINGLE(ssra(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1),   \"ssra b30, b29, #1\");\n  // TEST_SINGLE(ssra(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7),   \"ssra b30, b29, #7\");\n  // TEST_SINGLE(ssra(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1),  \"ssra h30, h29, #1\");\n  // TEST_SINGLE(ssra(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"ssra h30, h29, #15\");\n  // TEST_SINGLE(ssra(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1),  \"ssra s30, s29, #1\");\n  // TEST_SINGLE(ssra(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"ssra s30, s29, #31\");\n  TEST_SINGLE(ssra(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"ssra d30, d29, #1\");\n  TEST_SINGLE(ssra(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"ssra d30, d29, #63\");\n\n  // TEST_SINGLE(srshr(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1),   \"srshr b30, b29, #1\");\n  // TEST_SINGLE(srshr(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7),   \"srshr b30, b29, #7\");\n  // TEST_SINGLE(srshr(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1),  \"srshr h30, h29, #1\");\n  // TEST_SINGLE(srshr(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"srshr h30, h29, #15\");\n  // TEST_SINGLE(srshr(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1),  \"srshr s30, s29, #1\");\n  // TEST_SINGLE(srshr(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"srshr s30, s29, #31\");\n  TEST_SINGLE(srshr(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"srshr d30, d29, #1\");\n  TEST_SINGLE(srshr(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"srshr d30, d29, #63\");\n\n  // TEST_SINGLE(srsra(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1),   \"srsra b30, b29, #1\");\n  // TEST_SINGLE(srsra(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7),   \"srsra b30, b29, #7\");\n  // TEST_SINGLE(srsra(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1),  \"srsra h30, h29, #1\");\n  // TEST_SINGLE(srsra(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"srsra h30, h29, #15\");\n  // TEST_SINGLE(srsra(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1),  \"srsra s30, s29, #1\");\n  // TEST_SINGLE(srsra(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"srsra s30, s29, #31\");\n  TEST_SINGLE(srsra(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"srsra d30, d29, #1\");\n  TEST_SINGLE(srsra(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"srsra d30, d29, #63\");\n\n  // TEST_SINGLE(shl(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1),   \"shl b30, b29, #1\");\n  // TEST_SINGLE(shl(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7),   \"shl b30, b29, #7\");\n  // TEST_SINGLE(shl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1),  \"shl h30, h29, #1\");\n  // TEST_SINGLE(shl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"shl h30, h29, #15\");\n  // TEST_SINGLE(shl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1),  \"shl s30, s29, #1\");\n  // TEST_SINGLE(shl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"shl s30, s29, #31\");\n  TEST_SINGLE(shl(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"shl d30, d29, #1\");\n  TEST_SINGLE(shl(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"shl d30, d29, #63\");\n\n  TEST_SINGLE(sqshl(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1), \"sqshl b30, b29, #1\");\n  TEST_SINGLE(sqshl(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7), \"sqshl b30, b29, #7\");\n  TEST_SINGLE(sqshl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1), \"sqshl h30, h29, #1\");\n  TEST_SINGLE(sqshl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"sqshl h30, h29, #15\");\n  TEST_SINGLE(sqshl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1), \"sqshl s30, s29, #1\");\n  TEST_SINGLE(sqshl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"sqshl s30, s29, #31\");\n  TEST_SINGLE(sqshl(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"sqshl d30, d29, #1\");\n  TEST_SINGLE(sqshl(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"sqshl d30, d29, #63\");\n\n  TEST_SINGLE(sqshrn(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1), \"sqshrn b30, h29, #1\");\n  TEST_SINGLE(sqshrn(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7), \"sqshrn b30, h29, #7\");\n  TEST_SINGLE(sqshrn(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1), \"sqshrn h30, s29, #1\");\n  TEST_SINGLE(sqshrn(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"sqshrn h30, s29, #15\");\n  TEST_SINGLE(sqshrn(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1), \"sqshrn s30, d29, #1\");\n  TEST_SINGLE(sqshrn(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"sqshrn s30, d29, #31\");\n  // TEST_SINGLE(sqshrn(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1),  \"sqshrn d30, d29, #1\");\n  // TEST_SINGLE(sqshrn(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"sqshrn d30, d29, #63\");\n\n  TEST_SINGLE(sqrshrn(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1), \"sqrshrn b30, h29, #1\");\n  TEST_SINGLE(sqrshrn(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7), \"sqrshrn b30, h29, #7\");\n  TEST_SINGLE(sqrshrn(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1), \"sqrshrn h30, s29, #1\");\n  TEST_SINGLE(sqrshrn(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"sqrshrn h30, s29, #15\");\n  TEST_SINGLE(sqrshrn(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1), \"sqrshrn s30, d29, #1\");\n  TEST_SINGLE(sqrshrn(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"sqrshrn s30, d29, #31\");\n  // TEST_SINGLE(sqrshrn(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1),  \"sqrshrn d30, d29, #1\");\n  // TEST_SINGLE(sqrshrn(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"sqrshrn d30, d29, #63\");\n\n  // TODO: Implement `SCVTF, FCVTZS` in emitter\n  // TEST_SINGLE(ushr(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1),   \"ushr b30, b29, #1\");\n  // TEST_SINGLE(ushr(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7),   \"ushr b30, b29, #7\");\n  // TEST_SINGLE(ushr(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1),  \"ushr h30, h29, #1\");\n  // TEST_SINGLE(ushr(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"ushr h30, h29, #15\");\n  // TEST_SINGLE(ushr(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1),  \"ushr s30, s29, #1\");\n  // TEST_SINGLE(ushr(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"ushr s30, s29, #31\");\n  TEST_SINGLE(ushr(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"ushr d30, d29, #1\");\n  TEST_SINGLE(ushr(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"ushr d30, d29, #63\");\n\n  // TEST_SINGLE(usra(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1),   \"usra b30, b29, #1\");\n  // TEST_SINGLE(usra(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7),   \"usra b30, b29, #7\");\n  // TEST_SINGLE(usra(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1),  \"usra h30, h29, #1\");\n  // TEST_SINGLE(usra(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"usra h30, h29, #15\");\n  // TEST_SINGLE(usra(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1),  \"usra s30, s29, #1\");\n  // TEST_SINGLE(usra(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"usra s30, s29, #31\");\n  TEST_SINGLE(usra(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"usra d30, d29, #1\");\n  TEST_SINGLE(usra(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"usra d30, d29, #63\");\n\n  // TEST_SINGLE(urshr(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1),   \"urshr b30, b29, #1\");\n  // TEST_SINGLE(urshr(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7),   \"urshr b30, b29, #7\");\n  // TEST_SINGLE(urshr(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1),  \"urshr h30, h29, #1\");\n  // TEST_SINGLE(urshr(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"urshr h30, h29, #15\");\n  // TEST_SINGLE(urshr(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1),  \"urshr s30, s29, #1\");\n  // TEST_SINGLE(urshr(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"urshr s30, s29, #31\");\n  TEST_SINGLE(urshr(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"urshr d30, d29, #1\");\n  TEST_SINGLE(urshr(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"urshr d30, d29, #63\");\n\n  // TEST_SINGLE(ursra(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1),   \"ursra b30, b29, #1\");\n  // TEST_SINGLE(ursra(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7),   \"ursra b30, b29, #7\");\n  // TEST_SINGLE(ursra(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1),  \"ursra h30, h29, #1\");\n  // TEST_SINGLE(ursra(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"ursra h30, h29, #15\");\n  // TEST_SINGLE(ursra(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1),  \"ursra s30, s29, #1\");\n  // TEST_SINGLE(ursra(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"ursra s30, s29, #31\");\n  TEST_SINGLE(ursra(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"ursra d30, d29, #1\");\n  TEST_SINGLE(ursra(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"ursra d30, d29, #63\");\n\n  // TEST_SINGLE(sri(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1),   \"sri b30, b29, #1\");\n  // TEST_SINGLE(sri(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7),   \"sri b30, b29, #7\");\n  // TEST_SINGLE(sri(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1),  \"sri h30, h29, #1\");\n  // TEST_SINGLE(sri(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"sri h30, h29, #15\");\n  // TEST_SINGLE(sri(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1),  \"sri s30, s29, #1\");\n  // TEST_SINGLE(sri(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"sri s30, s29, #31\");\n  TEST_SINGLE(sri(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"sri d30, d29, #1\");\n  TEST_SINGLE(sri(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"sri d30, d29, #63\");\n\n  // TEST_SINGLE(sli(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1),   \"sli b30, b29, #1\");\n  // TEST_SINGLE(sli(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7),   \"sli b30, b29, #7\");\n  // TEST_SINGLE(sli(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1),  \"sli h30, h29, #1\");\n  // TEST_SINGLE(sli(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"sli h30, h29, #15\");\n  // TEST_SINGLE(sli(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1),  \"sli s30, s29, #1\");\n  // TEST_SINGLE(sli(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"sli s30, s29, #31\");\n  TEST_SINGLE(sli(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"sli d30, d29, #1\");\n  TEST_SINGLE(sli(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"sli d30, d29, #63\");\n\n  TEST_SINGLE(sqshlu(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1), \"sqshlu b30, b29, #1\");\n  TEST_SINGLE(sqshlu(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7), \"sqshlu b30, b29, #7\");\n  TEST_SINGLE(sqshlu(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1), \"sqshlu h30, h29, #1\");\n  TEST_SINGLE(sqshlu(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"sqshlu h30, h29, #15\");\n  TEST_SINGLE(sqshlu(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1), \"sqshlu s30, s29, #1\");\n  TEST_SINGLE(sqshlu(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"sqshlu s30, s29, #31\");\n  TEST_SINGLE(sqshlu(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"sqshlu d30, d29, #1\");\n  TEST_SINGLE(sqshlu(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"sqshlu d30, d29, #63\");\n\n  TEST_SINGLE(uqshl(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1), \"uqshl b30, b29, #1\");\n  TEST_SINGLE(uqshl(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7), \"uqshl b30, b29, #7\");\n  TEST_SINGLE(uqshl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1), \"uqshl h30, h29, #1\");\n  TEST_SINGLE(uqshl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"uqshl h30, h29, #15\");\n  TEST_SINGLE(uqshl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1), \"uqshl s30, s29, #1\");\n  TEST_SINGLE(uqshl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"uqshl s30, s29, #31\");\n  TEST_SINGLE(uqshl(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1), \"uqshl d30, d29, #1\");\n  TEST_SINGLE(uqshl(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"uqshl d30, d29, #63\");\n\n  TEST_SINGLE(sqshrun(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1), \"sqshrun b30, h29, #1\");\n  TEST_SINGLE(sqshrun(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7), \"sqshrun b30, h29, #7\");\n  TEST_SINGLE(sqshrun(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1), \"sqshrun h30, s29, #1\");\n  TEST_SINGLE(sqshrun(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"sqshrun h30, s29, #15\");\n  TEST_SINGLE(sqshrun(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1), \"sqshrun s30, d29, #1\");\n  TEST_SINGLE(sqshrun(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"sqshrun s30, d29, #31\");\n  // TEST_SINGLE(sqshrun(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1),  \"sqshrun d30, d29, #1\");\n  // TEST_SINGLE(sqshrun(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"sqshrun d30, d29, #63\");\n\n  TEST_SINGLE(sqrshrun(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1), \"sqrshrun b30, h29, #1\");\n  TEST_SINGLE(sqrshrun(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7), \"sqrshrun b30, h29, #7\");\n  TEST_SINGLE(sqrshrun(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1), \"sqrshrun h30, s29, #1\");\n  TEST_SINGLE(sqrshrun(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"sqrshrun h30, s29, #15\");\n  TEST_SINGLE(sqrshrun(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1), \"sqrshrun s30, d29, #1\");\n  TEST_SINGLE(sqrshrun(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"sqrshrun s30, d29, #31\");\n  // TEST_SINGLE(sqrshrun(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1),  \"sqrshrun d30, d29, #1\");\n  // TEST_SINGLE(sqrshrun(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"sqrshrun d30, d29, #63\");\n\n  TEST_SINGLE(uqshrn(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1), \"uqshrn b30, h29, #1\");\n  TEST_SINGLE(uqshrn(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7), \"uqshrn b30, h29, #7\");\n  TEST_SINGLE(uqshrn(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1), \"uqshrn h30, s29, #1\");\n  TEST_SINGLE(uqshrn(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"uqshrn h30, s29, #15\");\n  TEST_SINGLE(uqshrn(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1), \"uqshrn s30, d29, #1\");\n  TEST_SINGLE(uqshrn(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"uqshrn s30, d29, #31\");\n  // TEST_SINGLE(uqshrn(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1),  \"uqshrn d30, d29, #1\");\n  // TEST_SINGLE(uqshrn(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"uqshrn d30, d29, #63\");\n\n  TEST_SINGLE(uqrshrn(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 1), \"uqrshrn b30, h29, #1\");\n  TEST_SINGLE(uqrshrn(ScalarRegSize::i8Bit, VReg::v30, VReg::v29, 7), \"uqrshrn b30, h29, #7\");\n  TEST_SINGLE(uqrshrn(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 1), \"uqrshrn h30, s29, #1\");\n  TEST_SINGLE(uqrshrn(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, 15), \"uqrshrn h30, s29, #15\");\n  TEST_SINGLE(uqrshrn(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 1), \"uqrshrn s30, d29, #1\");\n  TEST_SINGLE(uqrshrn(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, 31), \"uqrshrn s30, d29, #31\");\n  // TEST_SINGLE(uqrshrn(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 1),  \"uqrshrn d30, d29, #1\");\n  // TEST_SINGLE(uqrshrn(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, 63), \"uqrshrn d30, d29, #63\");\n\n  // TODO: Implement `UCVTF, FCVTZU' in emitter\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Advanced SIMD scalar x indexed element\") {\n  TEST_SINGLE(sqdmlal(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 4), \"sqdmlal s30, h29, v15.h[4]\");\n  TEST_SINGLE(sqdmlal(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"sqdmlal s30, h29, v15.h[7]\");\n  TEST_SINGLE(sqdmlal(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"sqdmlal d30, s29, v28.s[0]\");\n  TEST_SINGLE(sqdmlal(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"sqdmlal d30, s29, v28.s[3]\");\n\n  TEST_SINGLE(sqdmlsl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 4), \"sqdmlsl s30, h29, v15.h[4]\");\n  TEST_SINGLE(sqdmlsl(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"sqdmlsl s30, h29, v15.h[7]\");\n  TEST_SINGLE(sqdmlsl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"sqdmlsl d30, s29, v28.s[0]\");\n  TEST_SINGLE(sqdmlsl(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"sqdmlsl d30, s29, v28.s[3]\");\n\n  TEST_SINGLE(sqdmull(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 4), \"sqdmull s30, h29, v15.h[4]\");\n  TEST_SINGLE(sqdmull(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"sqdmull s30, h29, v15.h[7]\");\n  TEST_SINGLE(sqdmull(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"sqdmull d30, s29, v28.s[0]\");\n  TEST_SINGLE(sqdmull(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"sqdmull d30, s29, v28.s[3]\");\n\n  TEST_SINGLE(sqdmulh(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 4), \"sqdmulh h30, h29, v15.h[4]\");\n  TEST_SINGLE(sqdmulh(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"sqdmulh h30, h29, v15.h[7]\");\n  TEST_SINGLE(sqdmulh(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"sqdmulh s30, s29, v28.s[0]\");\n  TEST_SINGLE(sqdmulh(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"sqdmulh s30, s29, v28.s[3]\");\n\n  TEST_SINGLE(sqrdmulh(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 4), \"sqrdmulh h30, h29, v15.h[4]\");\n  TEST_SINGLE(sqrdmulh(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"sqrdmulh h30, h29, v15.h[7]\");\n  TEST_SINGLE(sqrdmulh(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"sqrdmulh s30, s29, v28.s[0]\");\n  TEST_SINGLE(sqrdmulh(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"sqrdmulh s30, s29, v28.s[3]\");\n\n  TEST_SINGLE(fmla(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 4), \"fmla h30, h29, v15.h[4]\");\n  TEST_SINGLE(fmla(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"fmla h30, h29, v15.h[7]\");\n  TEST_SINGLE(fmla(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"fmla s30, s29, v28.s[0]\");\n  TEST_SINGLE(fmla(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"fmla s30, s29, v28.s[3]\");\n  TEST_SINGLE(fmla(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"fmla d30, d29, v28.d[0]\");\n  TEST_SINGLE(fmla(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 1), \"fmla d30, d29, v28.d[1]\");\n\n  TEST_SINGLE(fmls(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 4), \"fmls h30, h29, v15.h[4]\");\n  TEST_SINGLE(fmls(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"fmls h30, h29, v15.h[7]\");\n  TEST_SINGLE(fmls(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"fmls s30, s29, v28.s[0]\");\n  TEST_SINGLE(fmls(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"fmls s30, s29, v28.s[3]\");\n  TEST_SINGLE(fmls(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"fmls d30, d29, v28.d[0]\");\n  TEST_SINGLE(fmls(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 1), \"fmls d30, d29, v28.d[1]\");\n\n  TEST_SINGLE(fmul(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 4), \"fmul h30, h29, v15.h[4]\");\n  TEST_SINGLE(fmul(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"fmul h30, h29, v15.h[7]\");\n  TEST_SINGLE(fmul(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"fmul s30, s29, v28.s[0]\");\n  TEST_SINGLE(fmul(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"fmul s30, s29, v28.s[3]\");\n  TEST_SINGLE(fmul(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"fmul d30, d29, v28.d[0]\");\n  TEST_SINGLE(fmul(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 1), \"fmul d30, d29, v28.d[1]\");\n\n  TEST_SINGLE(sqrdmlah(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 4), \"sqrdmlah h30, h29, v15.h[4]\");\n  TEST_SINGLE(sqrdmlah(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"sqrdmlah h30, h29, v15.h[7]\");\n  TEST_SINGLE(sqrdmlah(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"sqrdmlah s30, s29, v28.s[0]\");\n  TEST_SINGLE(sqrdmlah(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"sqrdmlah s30, s29, v28.s[3]\");\n\n  TEST_SINGLE(sqrdmlsh(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 4), \"sqrdmlsh h30, h29, v15.h[4]\");\n  TEST_SINGLE(sqrdmlsh(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"sqrdmlsh h30, h29, v15.h[7]\");\n  TEST_SINGLE(sqrdmlsh(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"sqrdmlsh s30, s29, v28.s[0]\");\n  TEST_SINGLE(sqrdmlsh(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"sqrdmlsh s30, s29, v28.s[3]\");\n\n  TEST_SINGLE(fmulx(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 4), \"fmulx h30, h29, v15.h[4]\");\n  TEST_SINGLE(fmulx(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v15, 7), \"fmulx h30, h29, v15.h[7]\");\n  TEST_SINGLE(fmulx(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"fmulx s30, s29, v28.s[0]\");\n  TEST_SINGLE(fmulx(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28, 3), \"fmulx s30, s29, v28.s[3]\");\n  TEST_SINGLE(fmulx(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 0), \"fmulx d30, d29, v28.d[0]\");\n  TEST_SINGLE(fmulx(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28, 1), \"fmulx d30, d29, v28.d[1]\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Floating-point data-processing (1 source)\") {\n  TEST_SINGLE(fmov(SReg::s30, SReg::s29), \"fmov s30, s29\");\n  TEST_SINGLE(fabs(SReg::s30, SReg::s29), \"fabs s30, s29\");\n  TEST_SINGLE(fneg(SReg::s30, SReg::s29), \"fneg s30, s29\");\n  TEST_SINGLE(fsqrt(SReg::s30, SReg::s29), \"fsqrt s30, s29\");\n  TEST_SINGLE(fcvt(DReg::d30, SReg::s29), \"fcvt d30, s29\");\n  TEST_SINGLE(fcvt(HReg::h30, SReg::s29), \"fcvt h30, s29\");\n  TEST_SINGLE(frintn(SReg::s30, SReg::s29), \"frintn s30, s29\");\n  TEST_SINGLE(frintp(SReg::s30, SReg::s29), \"frintp s30, s29\");\n  TEST_SINGLE(frintm(SReg::s30, SReg::s29), \"frintm s30, s29\");\n  TEST_SINGLE(frintz(SReg::s30, SReg::s29), \"frintz s30, s29\");\n  TEST_SINGLE(frinta(SReg::s30, SReg::s29), \"frinta s30, s29\");\n  TEST_SINGLE(frintx(SReg::s30, SReg::s29), \"frintx s30, s29\");\n  TEST_SINGLE(frinti(SReg::s30, SReg::s29), \"frinti s30, s29\");\n  TEST_SINGLE(frint32z(SReg::s30, SReg::s29), \"frint32z s30, s29\");\n  TEST_SINGLE(frint32x(SReg::s30, SReg::s29), \"frint32x s30, s29\");\n  TEST_SINGLE(frint64z(SReg::s30, SReg::s29), \"frint64z s30, s29\");\n  TEST_SINGLE(frint64x(SReg::s30, SReg::s29), \"frint64x s30, s29\");\n\n  TEST_SINGLE(fmov(DReg::d30, DReg::d29), \"fmov d30, d29\");\n  TEST_SINGLE(fabs(DReg::d30, DReg::d29), \"fabs d30, d29\");\n  TEST_SINGLE(fneg(DReg::d30, DReg::d29), \"fneg d30, d29\");\n  TEST_SINGLE(fsqrt(DReg::d30, DReg::d29), \"fsqrt d30, d29\");\n  TEST_SINGLE(fcvt(SReg::s30, DReg::d29), \"fcvt s30, d29\");\n  if (false) {\n    // vixl doesn't support this instruction.\n    TEST_SINGLE(bfcvt(HReg::h30, SReg::s29), \"bfcvt h30, s29\");\n  }\n  TEST_SINGLE(fcvt(HReg::h30, DReg::d29), \"fcvt h30, d29\");\n  TEST_SINGLE(frintn(DReg::d30, DReg::d29), \"frintn d30, d29\");\n  TEST_SINGLE(frintp(DReg::d30, DReg::d29), \"frintp d30, d29\");\n  TEST_SINGLE(frintm(DReg::d30, DReg::d29), \"frintm d30, d29\");\n  TEST_SINGLE(frintz(DReg::d30, DReg::d29), \"frintz d30, d29\");\n  TEST_SINGLE(frinta(DReg::d30, DReg::d29), \"frinta d30, d29\");\n  TEST_SINGLE(frintx(DReg::d30, DReg::d29), \"frintx d30, d29\");\n  TEST_SINGLE(frinti(DReg::d30, DReg::d29), \"frinti d30, d29\");\n  TEST_SINGLE(frint32z(DReg::d30, DReg::d29), \"frint32z d30, d29\");\n  TEST_SINGLE(frint32x(DReg::d30, DReg::d29), \"frint32x d30, d29\");\n  TEST_SINGLE(frint64z(DReg::d30, DReg::d29), \"frint64z d30, d29\");\n  TEST_SINGLE(frint64x(DReg::d30, DReg::d29), \"frint64x d30, d29\");\n\n  TEST_SINGLE(fmov(HReg::h30, HReg::h29), \"fmov h30, h29\");\n  TEST_SINGLE(fabs(HReg::h30, HReg::h29), \"fabs h30, h29\");\n  TEST_SINGLE(fneg(HReg::h30, HReg::h29), \"fneg h30, h29\");\n  TEST_SINGLE(fsqrt(HReg::h30, HReg::h29), \"fsqrt h30, h29\");\n  TEST_SINGLE(fcvt(SReg::s30, HReg::h29), \"fcvt s30, h29\");\n  TEST_SINGLE(fcvt(DReg::d30, HReg::h29), \"fcvt d30, h29\");\n  TEST_SINGLE(frintn(HReg::h30, HReg::h29), \"frintn h30, h29\");\n  TEST_SINGLE(frintp(HReg::h30, HReg::h29), \"frintp h30, h29\");\n  TEST_SINGLE(frintm(HReg::h30, HReg::h29), \"frintm h30, h29\");\n  TEST_SINGLE(frintz(HReg::h30, HReg::h29), \"frintz h30, h29\");\n  TEST_SINGLE(frinta(HReg::h30, HReg::h29), \"frinta h30, h29\");\n  TEST_SINGLE(frintx(HReg::h30, HReg::h29), \"frintx h30, h29\");\n  TEST_SINGLE(frinti(HReg::h30, HReg::h29), \"frinti h30, h29\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Floating-point data-processing (1 source sized)\") {\n  TEST_SINGLE(fmov(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fmov s30, s29\");\n  TEST_SINGLE(fabs(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fabs s30, s29\");\n  TEST_SINGLE(fneg(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fneg s30, s29\");\n  TEST_SINGLE(fsqrt(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fsqrt s30, s29\");\n  TEST_SINGLE(frintn(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"frintn s30, s29\");\n  TEST_SINGLE(frintp(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"frintp s30, s29\");\n  TEST_SINGLE(frintm(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"frintm s30, s29\");\n  TEST_SINGLE(frintz(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"frintz s30, s29\");\n  TEST_SINGLE(frinta(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"frinta s30, s29\");\n  TEST_SINGLE(frintx(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"frintx s30, s29\");\n  TEST_SINGLE(frinti(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"frinti s30, s29\");\n  TEST_SINGLE(frint32z(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"frint32z s30, s29\");\n  TEST_SINGLE(frint32x(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"frint32x s30, s29\");\n  TEST_SINGLE(frint64z(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"frint64z s30, s29\");\n  TEST_SINGLE(frint64x(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"frint64x s30, s29\");\n\n  TEST_SINGLE(fmov(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fmov d30, d29\");\n  TEST_SINGLE(fabs(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fabs d30, d29\");\n  TEST_SINGLE(fneg(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fneg d30, d29\");\n  TEST_SINGLE(fsqrt(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fsqrt d30, d29\");\n  TEST_SINGLE(frintn(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"frintn d30, d29\");\n  TEST_SINGLE(frintp(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"frintp d30, d29\");\n  TEST_SINGLE(frintm(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"frintm d30, d29\");\n  TEST_SINGLE(frintz(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"frintz d30, d29\");\n  TEST_SINGLE(frinta(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"frinta d30, d29\");\n  TEST_SINGLE(frintx(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"frintx d30, d29\");\n  TEST_SINGLE(frinti(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"frinti d30, d29\");\n  TEST_SINGLE(frint32z(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"frint32z d30, d29\");\n  TEST_SINGLE(frint32x(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"frint32x d30, d29\");\n  TEST_SINGLE(frint64z(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"frint64z d30, d29\");\n  TEST_SINGLE(frint64x(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"frint64x d30, d29\");\n\n  TEST_SINGLE(fmov(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fmov h30, h29\");\n  TEST_SINGLE(fabs(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fabs h30, h29\");\n  TEST_SINGLE(fneg(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fneg h30, h29\");\n  TEST_SINGLE(fsqrt(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fsqrt h30, h29\");\n  TEST_SINGLE(frintn(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"frintn h30, h29\");\n  TEST_SINGLE(frintp(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"frintp h30, h29\");\n  TEST_SINGLE(frintm(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"frintm h30, h29\");\n  TEST_SINGLE(frintz(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"frintz h30, h29\");\n  TEST_SINGLE(frinta(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"frinta h30, h29\");\n  TEST_SINGLE(frintx(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"frintx h30, h29\");\n  TEST_SINGLE(frinti(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"frinti h30, h29\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Floating-point compare\") {\n  // Commented out lines showcase unallocated encodings.\n  // TEST_SINGLE(fcmp(ScalarRegSize::i8Bit, VReg::v30, VReg::v29), \"fcmp b30, b29\");\n  TEST_SINGLE(fcmp(ScalarRegSize::i16Bit, VReg::v30, VReg::v29), \"fcmp h30, h29\");\n  TEST_SINGLE(fcmp(ScalarRegSize::i32Bit, VReg::v30, VReg::v29), \"fcmp s30, s29\");\n  TEST_SINGLE(fcmp(ScalarRegSize::i64Bit, VReg::v30, VReg::v29), \"fcmp d30, d29\");\n\n  TEST_SINGLE(fcmp(SReg::s30, SReg::s29), \"fcmp s30, s29\");\n  TEST_SINGLE(fcmp(SReg::s30), \"fcmp s30, #0.0\");\n  TEST_SINGLE(fcmpe(SReg::s30, SReg::s29), \"fcmpe s30, s29\");\n  TEST_SINGLE(fcmpe(SReg::s30), \"fcmpe s30, #0.0\");\n\n  TEST_SINGLE(fcmp(DReg::d30, DReg::d29), \"fcmp d30, d29\");\n  TEST_SINGLE(fcmp(DReg::d30), \"fcmp d30, #0.0\");\n  TEST_SINGLE(fcmpe(DReg::d30, DReg::d29), \"fcmpe d30, d29\");\n  TEST_SINGLE(fcmpe(DReg::d30), \"fcmpe d30, #0.0\");\n\n  TEST_SINGLE(fcmp(HReg::h30, HReg::h29), \"fcmp h30, h29\");\n  TEST_SINGLE(fcmp(HReg::h30), \"fcmp h30, #0.0\");\n  TEST_SINGLE(fcmpe(HReg::h30, HReg::h29), \"fcmpe h30, h29\");\n  TEST_SINGLE(fcmpe(HReg::h30), \"fcmpe h30, #0.0\");\n}\n\n#if TEST_FP16\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Floating-point immediate : fp16\") {\n  TEST_SINGLE(fmov(ScalarRegSize::i16Bit, VReg::v30, 1.0), \"fmov h30, #0x70 (1.0000)\");\n  float Decoding[] = {\n    2.000000, 4.000000, 8.000000,  16.000000, 0.125000, 0.250000, 0.500000,  1.000000,  2.125000, 4.250000, 8.500000,  17.000000,\n    0.132812, 0.265625, 0.531250,  1.062500,  2.250000, 4.500000, 9.000000,  18.000000, 0.140625, 0.281250, 0.562500,  1.125000,\n    2.375000, 4.750000, 9.500000,  19.000000, 0.148438, 0.296875, 0.593750,  1.187500,  2.500000, 5.000000, 10.000000, 20.000000,\n    0.156250, 0.312500, 0.625000,  1.250000,  2.625000, 5.250000, 10.500000, 21.000000, 0.164062, 0.328125, 0.656250,  1.312500,\n    2.750000, 5.500000, 11.000000, 22.000000, 0.171875, 0.343750, 0.687500,  1.375000,  2.875000, 5.750000, 11.500000, 23.000000,\n    0.179688, 0.359375, 0.718750,  1.437500,  3.000000, 6.000000, 12.000000, 24.000000, 0.187500, 0.375000, 0.750000,  1.500000,\n    3.125000, 6.250000, 12.500000, 25.000000, 0.195312, 0.390625, 0.781250,  1.562500,  3.250000, 6.500000, 13.000000, 26.000000,\n    0.203125, 0.406250, 0.812500,  1.625000,  3.375000, 6.750000, 13.500000, 27.000000, 0.210938, 0.421875, 0.843750,  1.687500,\n    3.500000, 7.000000, 14.000000, 28.000000, 0.218750, 0.437500, 0.875000,  1.750000,  3.625000, 7.250000, 14.500000, 29.000000,\n    0.226562, 0.453125, 0.906250,  1.812500,  3.750000, 7.500000, 15.000000, 30.000000, 0.234375, 0.468750, 0.937500,  1.875000,\n    3.875000, 7.750000, 15.500000, 31.000000, 0.242188, 0.484375, 0.968750,  1.937500,\n  };\n\n  const char* DecodingString[] = {\n    \"fmov h30, #0x0 (2.0000)\",  \"fmov h30, #0x10 (4.0000)\", \"fmov h30, #0x20 (8.0000)\",  \"fmov h30, #0x30 (16.0000)\",\n    \"fmov h30, #0x40 (0.1250)\", \"fmov h30, #0x50 (0.2500)\", \"fmov h30, #0x60 (0.5000)\",  \"fmov h30, #0x70 (1.0000)\",\n    \"fmov h30, #0x1 (2.1250)\",  \"fmov h30, #0x11 (4.2500)\", \"fmov h30, #0x21 (8.5000)\",  \"fmov h30, #0x31 (17.0000)\",\n    \"fmov h30, #0x41 (0.1328)\", \"fmov h30, #0x51 (0.2656)\", \"fmov h30, #0x61 (0.5312)\",  \"fmov h30, #0x71 (1.0625)\",\n    \"fmov h30, #0x2 (2.2500)\",  \"fmov h30, #0x12 (4.5000)\", \"fmov h30, #0x22 (9.0000)\",  \"fmov h30, #0x32 (18.0000)\",\n    \"fmov h30, #0x42 (0.1406)\", \"fmov h30, #0x52 (0.2812)\", \"fmov h30, #0x62 (0.5625)\",  \"fmov h30, #0x72 (1.1250)\",\n    \"fmov h30, #0x3 (2.3750)\",  \"fmov h30, #0x13 (4.7500)\", \"fmov h30, #0x23 (9.5000)\",  \"fmov h30, #0x33 (19.0000)\",\n    \"fmov h30, #0x43 (0.1484)\", \"fmov h30, #0x53 (0.2969)\", \"fmov h30, #0x63 (0.5938)\",  \"fmov h30, #0x73 (1.1875)\",\n    \"fmov h30, #0x4 (2.5000)\",  \"fmov h30, #0x14 (5.0000)\", \"fmov h30, #0x24 (10.0000)\", \"fmov h30, #0x34 (20.0000)\",\n    \"fmov h30, #0x44 (0.1562)\", \"fmov h30, #0x54 (0.3125)\", \"fmov h30, #0x64 (0.6250)\",  \"fmov h30, #0x74 (1.2500)\",\n    \"fmov h30, #0x5 (2.6250)\",  \"fmov h30, #0x15 (5.2500)\", \"fmov h30, #0x25 (10.5000)\", \"fmov h30, #0x35 (21.0000)\",\n    \"fmov h30, #0x45 (0.1641)\", \"fmov h30, #0x55 (0.3281)\", \"fmov h30, #0x65 (0.6562)\",  \"fmov h30, #0x75 (1.3125)\",\n    \"fmov h30, #0x6 (2.7500)\",  \"fmov h30, #0x16 (5.5000)\", \"fmov h30, #0x26 (11.0000)\", \"fmov h30, #0x36 (22.0000)\",\n    \"fmov h30, #0x46 (0.1719)\", \"fmov h30, #0x56 (0.3438)\", \"fmov h30, #0x66 (0.6875)\",  \"fmov h30, #0x76 (1.3750)\",\n    \"fmov h30, #0x7 (2.8750)\",  \"fmov h30, #0x17 (5.7500)\", \"fmov h30, #0x27 (11.5000)\", \"fmov h30, #0x37 (23.0000)\",\n    \"fmov h30, #0x47 (0.1797)\", \"fmov h30, #0x57 (0.3594)\", \"fmov h30, #0x67 (0.7188)\",  \"fmov h30, #0x77 (1.4375)\",\n    \"fmov h30, #0x8 (3.0000)\",  \"fmov h30, #0x18 (6.0000)\", \"fmov h30, #0x28 (12.0000)\", \"fmov h30, #0x38 (24.0000)\",\n    \"fmov h30, #0x48 (0.1875)\", \"fmov h30, #0x58 (0.3750)\", \"fmov h30, #0x68 (0.7500)\",  \"fmov h30, #0x78 (1.5000)\",\n    \"fmov h30, #0x9 (3.1250)\",  \"fmov h30, #0x19 (6.2500)\", \"fmov h30, #0x29 (12.5000)\", \"fmov h30, #0x39 (25.0000)\",\n    \"fmov h30, #0x49 (0.1953)\", \"fmov h30, #0x59 (0.3906)\", \"fmov h30, #0x69 (0.7812)\",  \"fmov h30, #0x79 (1.5625)\",\n    \"fmov h30, #0xa (3.2500)\",  \"fmov h30, #0x1a (6.5000)\", \"fmov h30, #0x2a (13.0000)\", \"fmov h30, #0x3a (26.0000)\",\n    \"fmov h30, #0x4a (0.2031)\", \"fmov h30, #0x5a (0.4062)\", \"fmov h30, #0x6a (0.8125)\",  \"fmov h30, #0x7a (1.6250)\",\n    \"fmov h30, #0xb (3.3750)\",  \"fmov h30, #0x1b (6.7500)\", \"fmov h30, #0x2b (13.5000)\", \"fmov h30, #0x3b (27.0000)\",\n    \"fmov h30, #0x4b (0.2109)\", \"fmov h30, #0x5b (0.4219)\", \"fmov h30, #0x6b (0.8438)\",  \"fmov h30, #0x7b (1.6875)\",\n    \"fmov h30, #0xc (3.5000)\",  \"fmov h30, #0x1c (7.0000)\", \"fmov h30, #0x2c (14.0000)\", \"fmov h30, #0x3c (28.0000)\",\n    \"fmov h30, #0x4c (0.2188)\", \"fmov h30, #0x5c (0.4375)\", \"fmov h30, #0x6c (0.8750)\",  \"fmov h30, #0x7c (1.7500)\",\n    \"fmov h30, #0xd (3.6250)\",  \"fmov h30, #0x1d (7.2500)\", \"fmov h30, #0x2d (14.5000)\", \"fmov h30, #0x3d (29.0000)\",\n    \"fmov h30, #0x4d (0.2266)\", \"fmov h30, #0x5d (0.4531)\", \"fmov h30, #0x6d (0.9062)\",  \"fmov h30, #0x7d (1.8125)\",\n    \"fmov h30, #0xe (3.7500)\",  \"fmov h30, #0x1e (7.5000)\", \"fmov h30, #0x2e (15.0000)\", \"fmov h30, #0x3e (30.0000)\",\n    \"fmov h30, #0x4e (0.2344)\", \"fmov h30, #0x5e (0.4688)\", \"fmov h30, #0x6e (0.9375)\",  \"fmov h30, #0x7e (1.8750)\",\n    \"fmov h30, #0xf (3.8750)\",  \"fmov h30, #0x1f (7.7500)\", \"fmov h30, #0x2f (15.5000)\", \"fmov h30, #0x3f (31.0000)\",\n    \"fmov h30, #0x4f (0.2422)\", \"fmov h30, #0x5f (0.4844)\", \"fmov h30, #0x6f (0.9688)\",  \"fmov h30, #0x7f (1.9375)\",\n  };\n\n  for (size_t i = 0; i < (sizeof(Decoding) / sizeof(Decoding[0])); ++i) {\n    TEST_SINGLE(fmov(ScalarRegSize::i16Bit, VReg::v30, Decoding[i]), DecodingString[i]);\n  }\n}\n#endif\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Floating-point immediate\") {\n  TEST_SINGLE(fmov(ScalarRegSize::i32Bit, VReg::v30, 1.0), \"fmov s30, #0x70 (1.0000)\");\n  TEST_SINGLE(fmov(ScalarRegSize::i64Bit, VReg::v30, 1.0), \"fmov d30, #0x70 (1.0000)\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Floating-point conditional compare\") {\n  TEST_SINGLE(fccmp(SReg::s30, SReg::s29, StatusFlags::None, Condition::CC_AL), \"fccmp s30, s29, #nzcv, al\");\n  TEST_SINGLE(fccmp(SReg::s30, SReg::s29, StatusFlags::Flag_N, Condition::CC_AL), \"fccmp s30, s29, #Nzcv, al\");\n  TEST_SINGLE(fccmp(SReg::s30, SReg::s29, StatusFlags::Flag_Z, Condition::CC_AL), \"fccmp s30, s29, #nZcv, al\");\n  TEST_SINGLE(fccmp(SReg::s30, SReg::s29, StatusFlags::Flag_C, Condition::CC_AL), \"fccmp s30, s29, #nzCv, al\");\n  TEST_SINGLE(fccmp(SReg::s30, SReg::s29, StatusFlags::Flag_V, Condition::CC_AL), \"fccmp s30, s29, #nzcV, al\");\n  TEST_SINGLE(fccmp(SReg::s30, SReg::s29, StatusFlags::Flag_NZCV, Condition::CC_AL), \"fccmp s30, s29, #NZCV, al\");\n  TEST_SINGLE(fccmp(SReg::s30, SReg::s29, StatusFlags::None, Condition::CC_EQ), \"fccmp s30, s29, #nzcv, eq\");\n  TEST_SINGLE(fccmp(SReg::s30, SReg::s29, StatusFlags::Flag_N, Condition::CC_EQ), \"fccmp s30, s29, #Nzcv, eq\");\n  TEST_SINGLE(fccmp(SReg::s30, SReg::s29, StatusFlags::Flag_Z, Condition::CC_EQ), \"fccmp s30, s29, #nZcv, eq\");\n  TEST_SINGLE(fccmp(SReg::s30, SReg::s29, StatusFlags::Flag_C, Condition::CC_EQ), \"fccmp s30, s29, #nzCv, eq\");\n  TEST_SINGLE(fccmp(SReg::s30, SReg::s29, StatusFlags::Flag_V, Condition::CC_EQ), \"fccmp s30, s29, #nzcV, eq\");\n  TEST_SINGLE(fccmp(SReg::s30, SReg::s29, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"fccmp s30, s29, #NZCV, eq\");\n\n  TEST_SINGLE(fccmpe(SReg::s30, SReg::s29, StatusFlags::None, Condition::CC_AL), \"fccmpe s30, s29, #nzcv, al\");\n  TEST_SINGLE(fccmpe(SReg::s30, SReg::s29, StatusFlags::Flag_N, Condition::CC_AL), \"fccmpe s30, s29, #Nzcv, al\");\n  TEST_SINGLE(fccmpe(SReg::s30, SReg::s29, StatusFlags::Flag_Z, Condition::CC_AL), \"fccmpe s30, s29, #nZcv, al\");\n  TEST_SINGLE(fccmpe(SReg::s30, SReg::s29, StatusFlags::Flag_C, Condition::CC_AL), \"fccmpe s30, s29, #nzCv, al\");\n  TEST_SINGLE(fccmpe(SReg::s30, SReg::s29, StatusFlags::Flag_V, Condition::CC_AL), \"fccmpe s30, s29, #nzcV, al\");\n  TEST_SINGLE(fccmpe(SReg::s30, SReg::s29, StatusFlags::Flag_NZCV, Condition::CC_AL), \"fccmpe s30, s29, #NZCV, al\");\n  TEST_SINGLE(fccmpe(SReg::s30, SReg::s29, StatusFlags::None, Condition::CC_EQ), \"fccmpe s30, s29, #nzcv, eq\");\n  TEST_SINGLE(fccmpe(SReg::s30, SReg::s29, StatusFlags::Flag_N, Condition::CC_EQ), \"fccmpe s30, s29, #Nzcv, eq\");\n  TEST_SINGLE(fccmpe(SReg::s30, SReg::s29, StatusFlags::Flag_Z, Condition::CC_EQ), \"fccmpe s30, s29, #nZcv, eq\");\n  TEST_SINGLE(fccmpe(SReg::s30, SReg::s29, StatusFlags::Flag_C, Condition::CC_EQ), \"fccmpe s30, s29, #nzCv, eq\");\n  TEST_SINGLE(fccmpe(SReg::s30, SReg::s29, StatusFlags::Flag_V, Condition::CC_EQ), \"fccmpe s30, s29, #nzcV, eq\");\n  TEST_SINGLE(fccmpe(SReg::s30, SReg::s29, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"fccmpe s30, s29, #NZCV, eq\");\n\n  TEST_SINGLE(fccmp(DReg::d30, DReg::d29, StatusFlags::None, Condition::CC_AL), \"fccmp d30, d29, #nzcv, al\");\n  TEST_SINGLE(fccmp(DReg::d30, DReg::d29, StatusFlags::Flag_N, Condition::CC_AL), \"fccmp d30, d29, #Nzcv, al\");\n  TEST_SINGLE(fccmp(DReg::d30, DReg::d29, StatusFlags::Flag_Z, Condition::CC_AL), \"fccmp d30, d29, #nZcv, al\");\n  TEST_SINGLE(fccmp(DReg::d30, DReg::d29, StatusFlags::Flag_C, Condition::CC_AL), \"fccmp d30, d29, #nzCv, al\");\n  TEST_SINGLE(fccmp(DReg::d30, DReg::d29, StatusFlags::Flag_V, Condition::CC_AL), \"fccmp d30, d29, #nzcV, al\");\n  TEST_SINGLE(fccmp(DReg::d30, DReg::d29, StatusFlags::Flag_NZCV, Condition::CC_AL), \"fccmp d30, d29, #NZCV, al\");\n  TEST_SINGLE(fccmp(DReg::d30, DReg::d29, StatusFlags::None, Condition::CC_EQ), \"fccmp d30, d29, #nzcv, eq\");\n  TEST_SINGLE(fccmp(DReg::d30, DReg::d29, StatusFlags::Flag_N, Condition::CC_EQ), \"fccmp d30, d29, #Nzcv, eq\");\n  TEST_SINGLE(fccmp(DReg::d30, DReg::d29, StatusFlags::Flag_Z, Condition::CC_EQ), \"fccmp d30, d29, #nZcv, eq\");\n  TEST_SINGLE(fccmp(DReg::d30, DReg::d29, StatusFlags::Flag_C, Condition::CC_EQ), \"fccmp d30, d29, #nzCv, eq\");\n  TEST_SINGLE(fccmp(DReg::d30, DReg::d29, StatusFlags::Flag_V, Condition::CC_EQ), \"fccmp d30, d29, #nzcV, eq\");\n  TEST_SINGLE(fccmp(DReg::d30, DReg::d29, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"fccmp d30, d29, #NZCV, eq\");\n\n  TEST_SINGLE(fccmpe(DReg::d30, DReg::d29, StatusFlags::None, Condition::CC_AL), \"fccmpe d30, d29, #nzcv, al\");\n  TEST_SINGLE(fccmpe(DReg::d30, DReg::d29, StatusFlags::Flag_N, Condition::CC_AL), \"fccmpe d30, d29, #Nzcv, al\");\n  TEST_SINGLE(fccmpe(DReg::d30, DReg::d29, StatusFlags::Flag_Z, Condition::CC_AL), \"fccmpe d30, d29, #nZcv, al\");\n  TEST_SINGLE(fccmpe(DReg::d30, DReg::d29, StatusFlags::Flag_C, Condition::CC_AL), \"fccmpe d30, d29, #nzCv, al\");\n  TEST_SINGLE(fccmpe(DReg::d30, DReg::d29, StatusFlags::Flag_V, Condition::CC_AL), \"fccmpe d30, d29, #nzcV, al\");\n  TEST_SINGLE(fccmpe(DReg::d30, DReg::d29, StatusFlags::Flag_NZCV, Condition::CC_AL), \"fccmpe d30, d29, #NZCV, al\");\n  TEST_SINGLE(fccmpe(DReg::d30, DReg::d29, StatusFlags::None, Condition::CC_EQ), \"fccmpe d30, d29, #nzcv, eq\");\n  TEST_SINGLE(fccmpe(DReg::d30, DReg::d29, StatusFlags::Flag_N, Condition::CC_EQ), \"fccmpe d30, d29, #Nzcv, eq\");\n  TEST_SINGLE(fccmpe(DReg::d30, DReg::d29, StatusFlags::Flag_Z, Condition::CC_EQ), \"fccmpe d30, d29, #nZcv, eq\");\n  TEST_SINGLE(fccmpe(DReg::d30, DReg::d29, StatusFlags::Flag_C, Condition::CC_EQ), \"fccmpe d30, d29, #nzCv, eq\");\n  TEST_SINGLE(fccmpe(DReg::d30, DReg::d29, StatusFlags::Flag_V, Condition::CC_EQ), \"fccmpe d30, d29, #nzcV, eq\");\n  TEST_SINGLE(fccmpe(DReg::d30, DReg::d29, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"fccmpe d30, d29, #NZCV, eq\");\n\n  TEST_SINGLE(fccmp(HReg::h30, HReg::h29, StatusFlags::None, Condition::CC_AL), \"fccmp h30, h29, #nzcv, al\");\n  TEST_SINGLE(fccmp(HReg::h30, HReg::h29, StatusFlags::Flag_N, Condition::CC_AL), \"fccmp h30, h29, #Nzcv, al\");\n  TEST_SINGLE(fccmp(HReg::h30, HReg::h29, StatusFlags::Flag_Z, Condition::CC_AL), \"fccmp h30, h29, #nZcv, al\");\n  TEST_SINGLE(fccmp(HReg::h30, HReg::h29, StatusFlags::Flag_C, Condition::CC_AL), \"fccmp h30, h29, #nzCv, al\");\n  TEST_SINGLE(fccmp(HReg::h30, HReg::h29, StatusFlags::Flag_V, Condition::CC_AL), \"fccmp h30, h29, #nzcV, al\");\n  TEST_SINGLE(fccmp(HReg::h30, HReg::h29, StatusFlags::Flag_NZCV, Condition::CC_AL), \"fccmp h30, h29, #NZCV, al\");\n  TEST_SINGLE(fccmp(HReg::h30, HReg::h29, StatusFlags::None, Condition::CC_EQ), \"fccmp h30, h29, #nzcv, eq\");\n  TEST_SINGLE(fccmp(HReg::h30, HReg::h29, StatusFlags::Flag_N, Condition::CC_EQ), \"fccmp h30, h29, #Nzcv, eq\");\n  TEST_SINGLE(fccmp(HReg::h30, HReg::h29, StatusFlags::Flag_Z, Condition::CC_EQ), \"fccmp h30, h29, #nZcv, eq\");\n  TEST_SINGLE(fccmp(HReg::h30, HReg::h29, StatusFlags::Flag_C, Condition::CC_EQ), \"fccmp h30, h29, #nzCv, eq\");\n  TEST_SINGLE(fccmp(HReg::h30, HReg::h29, StatusFlags::Flag_V, Condition::CC_EQ), \"fccmp h30, h29, #nzcV, eq\");\n  TEST_SINGLE(fccmp(HReg::h30, HReg::h29, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"fccmp h30, h29, #NZCV, eq\");\n\n  TEST_SINGLE(fccmpe(HReg::h30, HReg::h29, StatusFlags::None, Condition::CC_AL), \"fccmpe h30, h29, #nzcv, al\");\n  TEST_SINGLE(fccmpe(HReg::h30, HReg::h29, StatusFlags::Flag_N, Condition::CC_AL), \"fccmpe h30, h29, #Nzcv, al\");\n  TEST_SINGLE(fccmpe(HReg::h30, HReg::h29, StatusFlags::Flag_Z, Condition::CC_AL), \"fccmpe h30, h29, #nZcv, al\");\n  TEST_SINGLE(fccmpe(HReg::h30, HReg::h29, StatusFlags::Flag_C, Condition::CC_AL), \"fccmpe h30, h29, #nzCv, al\");\n  TEST_SINGLE(fccmpe(HReg::h30, HReg::h29, StatusFlags::Flag_V, Condition::CC_AL), \"fccmpe h30, h29, #nzcV, al\");\n  TEST_SINGLE(fccmpe(HReg::h30, HReg::h29, StatusFlags::Flag_NZCV, Condition::CC_AL), \"fccmpe h30, h29, #NZCV, al\");\n  TEST_SINGLE(fccmpe(HReg::h30, HReg::h29, StatusFlags::None, Condition::CC_EQ), \"fccmpe h30, h29, #nzcv, eq\");\n  TEST_SINGLE(fccmpe(HReg::h30, HReg::h29, StatusFlags::Flag_N, Condition::CC_EQ), \"fccmpe h30, h29, #Nzcv, eq\");\n  TEST_SINGLE(fccmpe(HReg::h30, HReg::h29, StatusFlags::Flag_Z, Condition::CC_EQ), \"fccmpe h30, h29, #nZcv, eq\");\n  TEST_SINGLE(fccmpe(HReg::h30, HReg::h29, StatusFlags::Flag_C, Condition::CC_EQ), \"fccmpe h30, h29, #nzCv, eq\");\n  TEST_SINGLE(fccmpe(HReg::h30, HReg::h29, StatusFlags::Flag_V, Condition::CC_EQ), \"fccmpe h30, h29, #nzcV, eq\");\n  TEST_SINGLE(fccmpe(HReg::h30, HReg::h29, StatusFlags::Flag_NZCV, Condition::CC_EQ), \"fccmpe h30, h29, #NZCV, eq\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Floating-point data-processing (2 source)\") {\n  TEST_SINGLE(fmul(SReg::s30, SReg::s29, SReg::s28), \"fmul s30, s29, s28\");\n  TEST_SINGLE(fdiv(SReg::s30, SReg::s29, SReg::s28), \"fdiv s30, s29, s28\");\n  TEST_SINGLE(fadd(SReg::s30, SReg::s29, SReg::s28), \"fadd s30, s29, s28\");\n  TEST_SINGLE(fsub(SReg::s30, SReg::s29, SReg::s28), \"fsub s30, s29, s28\");\n  TEST_SINGLE(fmax(SReg::s30, SReg::s29, SReg::s28), \"fmax s30, s29, s28\");\n  TEST_SINGLE(fmin(SReg::s30, SReg::s29, SReg::s28), \"fmin s30, s29, s28\");\n  TEST_SINGLE(fmaxnm(SReg::s30, SReg::s29, SReg::s28), \"fmaxnm s30, s29, s28\");\n  TEST_SINGLE(fminnm(SReg::s30, SReg::s29, SReg::s28), \"fminnm s30, s29, s28\");\n  TEST_SINGLE(fnmul(SReg::s30, SReg::s29, SReg::s28), \"fnmul s30, s29, s28\");\n\n  TEST_SINGLE(fmul(DReg::d30, DReg::d29, DReg::d28), \"fmul d30, d29, d28\");\n  TEST_SINGLE(fdiv(DReg::d30, DReg::d29, DReg::d28), \"fdiv d30, d29, d28\");\n  TEST_SINGLE(fadd(DReg::d30, DReg::d29, DReg::d28), \"fadd d30, d29, d28\");\n  TEST_SINGLE(fsub(DReg::d30, DReg::d29, DReg::d28), \"fsub d30, d29, d28\");\n  TEST_SINGLE(fmax(DReg::d30, DReg::d29, DReg::d28), \"fmax d30, d29, d28\");\n  TEST_SINGLE(fmin(DReg::d30, DReg::d29, DReg::d28), \"fmin d30, d29, d28\");\n  TEST_SINGLE(fmaxnm(DReg::d30, DReg::d29, DReg::d28), \"fmaxnm d30, d29, d28\");\n  TEST_SINGLE(fminnm(DReg::d30, DReg::d29, DReg::d28), \"fminnm d30, d29, d28\");\n  TEST_SINGLE(fnmul(DReg::d30, DReg::d29, DReg::d28), \"fnmul d30, d29, d28\");\n\n  TEST_SINGLE(fmul(HReg::h30, HReg::h29, HReg::h28), \"fmul h30, h29, h28\");\n  TEST_SINGLE(fdiv(HReg::h30, HReg::h29, HReg::h28), \"fdiv h30, h29, h28\");\n  TEST_SINGLE(fadd(HReg::h30, HReg::h29, HReg::h28), \"fadd h30, h29, h28\");\n  TEST_SINGLE(fsub(HReg::h30, HReg::h29, HReg::h28), \"fsub h30, h29, h28\");\n  TEST_SINGLE(fmax(HReg::h30, HReg::h29, HReg::h28), \"fmax h30, h29, h28\");\n  TEST_SINGLE(fmin(HReg::h30, HReg::h29, HReg::h28), \"fmin h30, h29, h28\");\n  TEST_SINGLE(fmaxnm(HReg::h30, HReg::h29, HReg::h28), \"fmaxnm h30, h29, h28\");\n  TEST_SINGLE(fminnm(HReg::h30, HReg::h29, HReg::h28), \"fminnm h30, h29, h28\");\n  TEST_SINGLE(fnmul(HReg::h30, HReg::h29, HReg::h28), \"fnmul h30, h29, h28\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Floating-point data-processing (2 source sized)\") {\n  TEST_SINGLE(fmul(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"fmul s30, s29, s28\");\n  TEST_SINGLE(fdiv(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"fdiv s30, s29, s28\");\n  TEST_SINGLE(fadd(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"fadd s30, s29, s28\");\n  TEST_SINGLE(fsub(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"fsub s30, s29, s28\");\n  TEST_SINGLE(fmax(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"fmax s30, s29, s28\");\n  TEST_SINGLE(fmin(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"fmin s30, s29, s28\");\n  TEST_SINGLE(fmaxnm(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"fmaxnm s30, s29, s28\");\n  TEST_SINGLE(fminnm(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"fminnm s30, s29, s28\");\n  TEST_SINGLE(fnmul(ScalarRegSize::i32Bit, VReg::v30, VReg::v29, VReg::v28), \"fnmul s30, s29, s28\");\n\n  TEST_SINGLE(fmul(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"fmul d30, d29, d28\");\n  TEST_SINGLE(fdiv(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"fdiv d30, d29, d28\");\n  TEST_SINGLE(fadd(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"fadd d30, d29, d28\");\n  TEST_SINGLE(fsub(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"fsub d30, d29, d28\");\n  TEST_SINGLE(fmax(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"fmax d30, d29, d28\");\n  TEST_SINGLE(fmin(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"fmin d30, d29, d28\");\n  TEST_SINGLE(fmaxnm(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"fmaxnm d30, d29, d28\");\n  TEST_SINGLE(fminnm(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"fminnm d30, d29, d28\");\n  TEST_SINGLE(fnmul(ScalarRegSize::i64Bit, VReg::v30, VReg::v29, VReg::v28), \"fnmul d30, d29, d28\");\n\n  TEST_SINGLE(fmul(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"fmul h30, h29, h28\");\n  TEST_SINGLE(fdiv(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"fdiv h30, h29, h28\");\n  TEST_SINGLE(fadd(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"fadd h30, h29, h28\");\n  TEST_SINGLE(fsub(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"fsub h30, h29, h28\");\n  TEST_SINGLE(fmax(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"fmax h30, h29, h28\");\n  TEST_SINGLE(fmin(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"fmin h30, h29, h28\");\n  TEST_SINGLE(fmaxnm(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"fmaxnm h30, h29, h28\");\n  TEST_SINGLE(fminnm(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"fminnm h30, h29, h28\");\n  TEST_SINGLE(fnmul(ScalarRegSize::i16Bit, VReg::v30, VReg::v29, VReg::v28), \"fnmul h30, h29, h28\");\n}\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Floating-point conditional select\") {\n  TEST_SINGLE(fcsel(SReg::s30, SReg::s29, SReg::s28, Condition::CC_AL), \"fcsel s30, s29, s28, al\");\n  TEST_SINGLE(fcsel(SReg::s30, SReg::s29, SReg::s28, Condition::CC_EQ), \"fcsel s30, s29, s28, eq\");\n\n  TEST_SINGLE(fcsel(DReg::d30, DReg::d29, DReg::d28, Condition::CC_AL), \"fcsel d30, d29, d28, al\");\n  TEST_SINGLE(fcsel(DReg::d30, DReg::d29, DReg::d28, Condition::CC_EQ), \"fcsel d30, d29, d28, eq\");\n\n  TEST_SINGLE(fcsel(HReg::h30, HReg::h29, HReg::h28, Condition::CC_AL), \"fcsel h30, h29, h28, al\");\n  TEST_SINGLE(fcsel(HReg::h30, HReg::h29, HReg::h28, Condition::CC_EQ), \"fcsel h30, h29, h28, eq\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Scalar: Floating-point data-processing (3 source)\") {\n  TEST_SINGLE(fmadd(SReg::s30, SReg::s29, SReg::s28, SReg::s27), \"fmadd s30, s29, s28, s27\");\n  TEST_SINGLE(fmsub(SReg::s30, SReg::s29, SReg::s28, SReg::s27), \"fmsub s30, s29, s28, s27\");\n  TEST_SINGLE(fnmadd(SReg::s30, SReg::s29, SReg::s28, SReg::s27), \"fnmadd s30, s29, s28, s27\");\n  TEST_SINGLE(fnmsub(SReg::s30, SReg::s29, SReg::s28, SReg::s27), \"fnmsub s30, s29, s28, s27\");\n\n  TEST_SINGLE(fmadd(DReg::d30, DReg::d29, DReg::d28, DReg::d27), \"fmadd d30, d29, d28, d27\");\n  TEST_SINGLE(fmsub(DReg::d30, DReg::d29, DReg::d28, DReg::d27), \"fmsub d30, d29, d28, d27\");\n  TEST_SINGLE(fnmadd(DReg::d30, DReg::d29, DReg::d28, DReg::d27), \"fnmadd d30, d29, d28, d27\");\n  TEST_SINGLE(fnmsub(DReg::d30, DReg::d29, DReg::d28, DReg::d27), \"fnmsub d30, d29, d28, d27\");\n\n  TEST_SINGLE(fmadd(HReg::h30, HReg::h29, HReg::h28, HReg::h27), \"fmadd h30, h29, h28, h27\");\n  TEST_SINGLE(fmsub(HReg::h30, HReg::h29, HReg::h28, HReg::h27), \"fmsub h30, h29, h28, h27\");\n  TEST_SINGLE(fnmadd(HReg::h30, HReg::h29, HReg::h28, HReg::h27), \"fnmadd h30, h29, h28, h27\");\n  TEST_SINGLE(fnmsub(HReg::h30, HReg::h29, HReg::h28, HReg::h27), \"fnmsub h30, h29, h28, h27\");\n}\n"
  },
  {
    "path": "FEXCore/unittests/Emitter/System_Tests.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"TestDisassembler.h\"\n\n#include <catch2/catch_test_macros.hpp>\n#include <fcntl.h>\n\nusing namespace ARMEmitter;\n\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: Reserved\") {\n  TEST_SINGLE(udf(0), \"udf #0x0\");\n  TEST_SINGLE(udf(0xFFFF), \"udf #0xffff\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: System: System with result\") {\n  // TODO: Implement in emitter.\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: System: System Instruction\") {\n  // TODO: AT\n  // TODO: CFP\n  // TODO: CPP\n  // vixl doesn't understand a bunch of data cache operation names.\n  TEST_SINGLE(dc(DataCacheOperation::IVAC, Reg::r30), \"sys #0, C7, C6, #1, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::ISW, Reg::r30), \"sys #0, C7, C6, #2, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CSW, Reg::r30), \"sys #0, C7, C10, #2, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CISW, Reg::r30), \"sys #0, C7, C14, #2, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::ZVA, Reg::r30), \"dc zva, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CVAC, Reg::r30), \"dc cvac, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CVAU, Reg::r30), \"dc cvau, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CIVAC, Reg::r30), \"dc civac, x30\");\n\n  TEST_SINGLE(dc(DataCacheOperation::IGVAC, Reg::r30), \"sys #0, C7, C6, #3, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::IGSW, Reg::r30), \"sys #0, C7, C6, #4, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::IGDVAC, Reg::r30), \"sys #0, C7, C6, #5, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::IGDSW, Reg::r30), \"sys #0, C7, C6, #6, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CGSW, Reg::r30), \"sys #0, C7, C10, #4, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CGDSW, Reg::r30), \"sys #0, C7, C10, #6, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CIGSW, Reg::r30), \"sys #0, C7, C14, #4, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CIGDSW, Reg::r30), \"sys #0, C7, C14, #6, x30\");\n\n  TEST_SINGLE(dc(DataCacheOperation::GVA, Reg::r30), \"dc gva, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::GZVA, Reg::r30), \"dc gzva, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CGVAC, Reg::r30), \"dc cgvac, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CGDVAC, Reg::r30), \"dc cgdvac, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CGVAP, Reg::r30), \"dc cgvap, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CGDVAP, Reg::r30), \"dc cgdvap, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CGVADP, Reg::r30), \"sys #3, C7, C13, #3, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CGDVADP, Reg::r30), \"sys #3, C7, C13, #5, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CIGVAC, Reg::r30), \"dc cigvac, x30\");\n  TEST_SINGLE(dc(DataCacheOperation::CIGDVAC, Reg::r30), \"dc cigdvac, x30\");\n\n  TEST_SINGLE(dc(DataCacheOperation::CVAP, Reg::r30), \"dc cvap, x30\");\n\n  TEST_SINGLE(dc(DataCacheOperation::CVADP, Reg::r30), \"dc cvadp, x30\");\n\n  // TODO: DVP\n  // TODO: IC\n  // TODO: TLBI\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: System: Exception generation\") {\n  TEST_SINGLE(svc(65535), \"svc #0xffff\");\n  TEST_SINGLE(hvc(65535), \"hvc #0xffff\");\n  TEST_SINGLE(smc(65535), \"smc #0xffff\");\n  TEST_SINGLE(brk(65535), \"brk #0xffff\");\n  TEST_SINGLE(hlt(65535), \"hlt #0xffff\");\n  TEST_SINGLE(tcancel(65535), \"unimplemented (Unimplemented)\");\n  TEST_SINGLE(dcps1(65535), \"dcps1 {#0xffff}\");\n  TEST_SINGLE(dcps2(65535), \"dcps2 {#0xffff}\");\n  TEST_SINGLE(dcps3(65535), \"dcps3 {#0xffff}\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: System: System instructions with register argument\") {\n  if (false) {\n    // Unsupported in vixl.\n    TEST_SINGLE(wfet(Reg::r30), \"wfet x30\");\n    TEST_SINGLE(wfit(Reg::r30), \"wfit x30\");\n  }\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: System: Hints\") {\n  TEST_SINGLE(nop(), \"nop\");\n  TEST_SINGLE(yield(), \"yield\");\n  TEST_SINGLE(wfe(), \"wfe\");\n  TEST_SINGLE(wfi(), \"wfi\");\n  TEST_SINGLE(sev(), \"sev\");\n  TEST_SINGLE(sevl(), \"sevl\");\n  TEST_SINGLE(dgh(), \"dgh\");\n  TEST_SINGLE(csdb(), \"csdb\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: System: Barriers\") {\n  TEST_SINGLE(clrex(0), \"clrex #0x0\");\n  TEST_SINGLE(clrex(15), \"clrex\");\n\n  TEST_SINGLE(dsb(BarrierScope::OSHLD), \"dsb oshld\");\n  TEST_SINGLE(dsb(BarrierScope::OSHST), \"dsb oshst\");\n  TEST_SINGLE(dsb(BarrierScope::OSH), \"dsb osh\");\n  TEST_SINGLE(dsb(BarrierScope::NSHLD), \"dsb nshld\");\n  TEST_SINGLE(dsb(BarrierScope::NSHST), \"dsb nshst\");\n  TEST_SINGLE(dsb(BarrierScope::NSH), \"dsb nsh\");\n  TEST_SINGLE(dsb(BarrierScope::ISHLD), \"dsb ishld\");\n  TEST_SINGLE(dsb(BarrierScope::ISHST), \"dsb ishst\");\n  TEST_SINGLE(dsb(BarrierScope::ISH), \"dsb ish\");\n  TEST_SINGLE(dsb(BarrierScope::LD), \"dsb ld\");\n  TEST_SINGLE(dsb(BarrierScope::ST), \"dsb st\");\n  TEST_SINGLE(dsb(BarrierScope::SY), \"dsb sy\");\n\n  TEST_SINGLE(dmb(BarrierScope::OSHLD), \"dmb oshld\");\n  TEST_SINGLE(dmb(BarrierScope::OSHST), \"dmb oshst\");\n  TEST_SINGLE(dmb(BarrierScope::OSH), \"dmb osh\");\n  TEST_SINGLE(dmb(BarrierScope::NSHLD), \"dmb nshld\");\n  TEST_SINGLE(dmb(BarrierScope::NSHST), \"dmb nshst\");\n  TEST_SINGLE(dmb(BarrierScope::NSH), \"dmb nsh\");\n  TEST_SINGLE(dmb(BarrierScope::ISHLD), \"dmb ishld\");\n  TEST_SINGLE(dmb(BarrierScope::ISHST), \"dmb ishst\");\n  TEST_SINGLE(dmb(BarrierScope::ISH), \"dmb ish\");\n  TEST_SINGLE(dmb(BarrierScope::LD), \"dmb ld\");\n  TEST_SINGLE(dmb(BarrierScope::ST), \"dmb st\");\n  TEST_SINGLE(dmb(BarrierScope::SY), \"dmb sy\");\n\n  TEST_SINGLE(isb(), \"isb\");\n\n  TEST_SINGLE(sb(), \"sb\");\n  TEST_SINGLE(tcommit(), \"tcommit\");\n}\nTEST_CASE_METHOD(TestDisassembler, \"Emitter: System: System register move\") {\n  // vixl doesn't have decoding for a bunch of these.\n  // Also most of these aren't writeable from el0, just testing the encoding.\n  TEST_SINGLE(msr(SystemRegister::CTR_EL0, Reg::r30), \"msr S3_3_c0_c0_1, x30\");\n  TEST_SINGLE(msr(SystemRegister::DCZID_EL0, Reg::r30), \"msr dczid_el0, x30\");\n  TEST_SINGLE(msr(SystemRegister::TPIDR_EL0, Reg::r30), \"msr S3_3_c13_c0_2, x30\");\n  TEST_SINGLE(msr(SystemRegister::RNDR, Reg::r30), \"msr rndr, x30\");\n  TEST_SINGLE(msr(SystemRegister::RNDRRS, Reg::r30), \"msr rndrrs, x30\");\n  TEST_SINGLE(msr(SystemRegister::NZCV, Reg::r30), \"msr nzcv, x30\");\n  TEST_SINGLE(msr(SystemRegister::FPCR, Reg::r30), \"msr fpcr, x30\");\n  TEST_SINGLE(msr(SystemRegister::TPIDRRO_EL0, Reg::r30), \"msr S3_3_c13_c0_3, x30\");\n  TEST_SINGLE(msr(SystemRegister::CNTFRQ_EL0, Reg::r30), \"msr S3_3_c14_c0_0, x30\");\n  TEST_SINGLE(msr(SystemRegister::CNTVCT_EL0, Reg::r30), \"msr S3_3_c14_c0_2, x30\");\n\n  TEST_SINGLE(mrs(Reg::r30, SystemRegister::CTR_EL0), \"mrs x30, S3_3_c0_c0_1\");\n  TEST_SINGLE(mrs(Reg::r30, SystemRegister::DCZID_EL0), \"mrs x30, dczid_el0\");\n  TEST_SINGLE(mrs(Reg::r30, SystemRegister::TPIDR_EL0), \"mrs x30, S3_3_c13_c0_2\");\n  TEST_SINGLE(mrs(Reg::r30, SystemRegister::RNDR), \"mrs x30, rndr\");\n  TEST_SINGLE(mrs(Reg::r30, SystemRegister::RNDRRS), \"mrs x30, rndrrs\");\n  TEST_SINGLE(mrs(Reg::r30, SystemRegister::NZCV), \"mrs x30, nzcv\");\n  TEST_SINGLE(mrs(Reg::r30, SystemRegister::FPCR), \"mrs x30, fpcr\");\n  TEST_SINGLE(mrs(Reg::r30, SystemRegister::TPIDRRO_EL0), \"mrs x30, S3_3_c13_c0_3\");\n  TEST_SINGLE(mrs(Reg::r30, SystemRegister::CNTFRQ_EL0), \"mrs x30, S3_3_c14_c0_0\");\n  TEST_SINGLE(mrs(Reg::r30, SystemRegister::CNTVCT_EL0), \"mrs x30, S3_3_c14_c0_2\");\n}\n"
  },
  {
    "path": "FEXCore/unittests/Emitter/TestDisassembler.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/string.h>\n#include <CodeEmitter/Emitter.h>\n\n#include <aarch64/cpu-aarch64.h>\n#include <aarch64/instructions-aarch64.h>\n#include <aarch64/disasm-aarch64.h>\n\n#include <sys/mman.h>\n\nclass TestDisassembler : public ARMEmitter::Emitter {\npublic:\n  TestDisassembler() {\n    fp = tmpfile();\n    Disasm = std::make_unique<vixl::aarch64::PrintDisassembler>(fp);\n    // 2MB code size.\n    const size_t CodeSize = 2 * 1024 * 1024;\n    SetBuffer(reinterpret_cast<uint8_t*>(mmap(nullptr, CodeSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)), CodeSize);\n    BufferBegin = GetCursorAddress<const vixl::aarch64::Instruction*>();\n  }\n  ~TestDisassembler() {\n    fclose(fp);\n  }\n\n  fextl::string DisassembleSingle() {\n    HandleDisasm();\n    char Tmp[512];\n    uint64_t Addr;\n    uint32_t Encoding;\n    int Num = fscanf(fp, \"0x%lx %x %[^\\n]\\n\", &Addr, &Encoding, Tmp);\n    if (Num != 3) {\n      return \"<Invalid>\";\n    }\n    ResetFP();\n\n    return Tmp;\n  }\n\n  uint32_t DisassembleEncoding(size_t Offset = 0) {\n    const uint32_t* Values = reinterpret_cast<const uint32_t*>(GetBufferBase());\n    SetCursorOffset(0);\n    ResetFP();\n    return Values[Offset];\n  }\n\n  fextl::string DisassembleString() {\n    HandleDisasm();\n    fextl::string Decoded {};\n    char Tmp[512];\n    uint64_t Addr;\n    uint32_t Encoding;\n    while (fscanf(fp, \"0x%lx %x %[^\\n]\\n\", &Addr, &Encoding, Tmp) == 3) {\n      Decoded += std::string_view(Tmp);\n      Decoded += \"\\n\";\n    }\n\n    ResetFP();\n    return Decoded;\n  }\nprivate:\n  void HandleDisasm() {\n    const auto BufferEnd = GetCursorAddress<const vixl::aarch64::Instruction*>();\n    Disasm->DisassembleBuffer(BufferBegin, BufferEnd);\n    SetCursorOffset(0);\n    fseek(fp, 0, SEEK_SET);\n  }\n  void ResetFP() {\n    fseek(fp, 0, SEEK_SET);\n  }\n  FILE* fp;\n  const vixl::aarch64::Instruction* BufferBegin;\n  std::unique_ptr<vixl::aarch64::PrintDisassembler> Disasm;\n};\n\n#define TEST_SINGLE(emit, expected) \\\n  { CHECK((emit, DisassembleSingle()) == expected); }\n\n// Float16 disabled until we have a Float16 storage type with unittests.\n#define TEST_FP16 0\n"
  },
  {
    "path": "FEXHeaderUtils/CMakeLists.txt",
    "content": "add_library(FEXHeaderUtils INTERFACE)\n\n# Check for syscall support here\ncheck_cxx_source_compiles(\"\n  #include <sched.h>\n  int main() {\n  return ::getcpu(nullptr, nullptr);\n  }\"\n  HAS_SYSCALL_GETCPU)\nif (HAS_SYSCALL_GETCPU)\n  message(STATUS \"Has getcpu helper\")\n  target_compile_definitions(FEXHeaderUtils INTERFACE HAS_SYSCALL_GETCPU=1)\nendif()\n\ncheck_cxx_source_compiles(\"\n  #include <unistd.h>\n  int main() {\n  return ::gettid();\n  }\"\n  HAS_SYSCALL_GETTID)\nif (HAS_SYSCALL_GETTID)\n  message(STATUS \"Has gettid helper\")\n  target_compile_definitions(FEXHeaderUtils INTERFACE HAS_SYSCALL_GETTID=1)\nendif()\n\ncheck_cxx_source_compiles(\"\n  #include <signal.h>\n  int main() {\n  return ::tgkill(0, 0, 0);\n  }\"\n  HAS_SYSCALL_TGKILL)\nif (HAS_SYSCALL_TGKILL)\n  message(STATUS \"Has tgkill helper\")\n  target_compile_definitions(FEXHeaderUtils INTERFACE HAS_SYSCALL_TGKILL=1)\nendif()\n\ncheck_cxx_source_compiles(\"\n  #include <sys/stat.h>\n  int main() {\n  return ::statx(0, nullptr, 0, 0, nullptr);\n  }\"\n  HAS_SYSCALL_STATX)\nif (HAS_SYSCALL_STATX)\n  message(STATUS \"Has statx helper\")\n  target_compile_definitions(FEXHeaderUtils INTERFACE HAS_SYSCALL_STATX=1)\nendif()\n\ncheck_cxx_source_compiles(\"\n  #include <stdio.h>\n  int main() {\n  return ::renameat2(0, nullptr, 0, nullptr, 0);\n  }\"\n  HAS_SYSCALL_RENAMEAT2)\nif (HAS_SYSCALL_RENAMEAT2)\n  message(STATUS \"Has renameat2 helper\")\n  target_compile_definitions(FEXHeaderUtils INTERFACE HAS_SYSCALL_RENAMEAT2=1)\nendif()\n\ntarget_include_directories(FEXHeaderUtils INTERFACE .)\n"
  },
  {
    "path": "FEXHeaderUtils/FEXHeaderUtils/BitUtils.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n// Header for various utilities that operate on bits and bytes.\n\n#include <bit>\n#include <climits>\n#include <cstddef>\n#include <cstdint>\n#include <type_traits>\n\nnamespace FEXCore {\n\n// Determines the number of bits inside of a given type.\ntemplate<typename T>\n[[nodiscard]]\nconstexpr size_t BitSize() noexcept {\n  return sizeof(T) * CHAR_BIT;\n}\n\n// Swaps the bytes of a 16-bit unsigned value.\n[[nodiscard]]\ninline uint16_t BSwap16(uint16_t value) noexcept {\n#ifdef __GNUC__\n  return __builtin_bswap16(value);\n#else\n  return (value >> 8) | (value << 8);\n#endif\n}\n\n// Swaps the bytes of a 32-bit unsigned value.\n[[nodiscard]]\ninline uint32_t BSwap32(uint32_t value) noexcept {\n#ifdef __GNUC__\n  return __builtin_bswap32(value);\n#else\n  return ((value & 0xFF000000U) >> 24) | ((value & 0x00FF0000U) >> 8) | ((value & 0x0000FF00U) << 8) | ((value & 0x000000FFU) << 24);\n#endif\n}\n\n// Swaps the bytes of a 64-bit unsigned value.\n[[nodiscard]]\ninline uint64_t BSwap64(uint64_t value) noexcept {\n#ifdef __GNUC__\n  return __builtin_bswap64(value);\n#else\n  return ((value & 0xFF00000000000000ULL) >> 56) | ((value & 0x00FF000000000000ULL) >> 40) | ((value & 0x0000FF0000000000ULL) >> 24) |\n         ((value & 0x000000FF00000000ULL) >> 8) | ((value & 0x00000000FF000000ULL) << 8) | ((value & 0x0000000000FF0000ULL) << 24) |\n         ((value & 0x000000000000FF00ULL) << 40) | ((value & 0x00000000000000FFULL) << 56);\n#endif\n}\n\n// Finds the first least-significant set bit within a given value.\n// Note that all returned indices are 1-based, not 0-based.\ntemplate<typename T>\n[[nodiscard]]\nconstexpr int FindFirstSetBit(T value) noexcept {\n  static_assert(std::is_unsigned_v<T>, \"Type must be unsigned.\");\n\n  if (value == 0) {\n    return 0;\n  }\n\n  const int trailing_zeroes = std::countr_zero(value);\n  return trailing_zeroes + 1;\n}\n\n} // namespace FEXCore\n"
  },
  {
    "path": "FEXHeaderUtils/FEXHeaderUtils/Filesystem.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/list.h>\n#include <FEXCore/fextl/memory_resource.h>\n#include <FEXCore/fextl/string.h>\n\n#include <algorithm>\n#include <fcntl.h>\n#include <memory_resource>\n#include <string_view>\n#ifndef _WIN32\n#include <linux/limits.h>\n#include <sys/sendfile.h>\n#else\n#include <filesystem>\n#endif\n#include <sys/stat.h>\n#include <unistd.h>\n\nnamespace FHU::Filesystem {\nenum class CreateDirectoryResult {\n  CREATED,\n  EXISTS,\n  ERROR,\n};\n\nenum class CopyOptions {\n  NONE,\n  SKIP_EXISTING,\n  OVERWRITE_EXISTING,\n};\n\n/**\n * @brief Check if a filepath exists.\n *\n * @param Path The path to check for.\n *\n * @return True if the file exists, False if it doesn't.\n */\ninline bool Exists(const char* Path) {\n  return access(Path, F_OK) == 0;\n}\n\ninline bool Exists(const fextl::string& Path) {\n  return access(Path.c_str(), F_OK) == 0;\n}\n\n/**\n * @brief Renames a file and overwrites if it already exists.\n *\n * @return No error on rename.\n */\n[[nodiscard]]\ninline std::error_code RenameFile(const fextl::string& From, const fextl::string& To) {\n  return rename(From.c_str(), To.c_str()) == 0 ? std::error_code {} : std::make_error_code(std::errc::io_error);\n}\n\n#ifndef _WIN32\ninline bool ExistsAt(int FD, const fextl::string& Path) {\n  return faccessat(FD, Path.c_str(), F_OK, 0) == 0;\n}\n\n/**\n * @brief Creates a directory at the provided path.\n *\n * @param Path The path to create a directory at.\n *\n * @return Result enum depending.\n */\ninline CreateDirectoryResult CreateDirectory(const fextl::string& Path) {\n  auto Result = ::mkdir(Path.c_str(), 0777);\n  if (Result == 0) {\n    return CreateDirectoryResult::CREATED;\n  }\n\n  if (Result == -1 && errno == EEXIST) {\n    // If it exists, we need to check if it is a file or folder.\n    struct stat buf;\n    if (stat(Path.c_str(), &buf) == 0) {\n      // Check to see if the path is a file or folder. Following symlinks.\n      return S_ISDIR(buf.st_mode) ? CreateDirectoryResult::EXISTS : CreateDirectoryResult::ERROR;\n    }\n  }\n\n  // Couldn't create, or the path that existed wasn't a folder.\n  return CreateDirectoryResult::ERROR;\n}\n\n/**\n * @brief Creates a directory tree with the provided path.\n *\n * @param Path The path to create a tree at.\n *\n * @return True if the directory tree was created or already exists.\n */\ninline bool CreateDirectories(const fextl::string& Path) {\n  // Try to create the directory initially.\n  if (CreateDirectory(Path) != CreateDirectoryResult::ERROR) {\n    return true;\n  }\n\n  // Walk the path in reverse and create paths as we go.\n  fextl::string TmpPath {Path.substr(0, Path.rfind('/', Path.size() - 1))};\n  if (!TmpPath.empty() && CreateDirectories(TmpPath)) {\n    return CreateDirectory(Path) != CreateDirectoryResult::ERROR;\n  }\n  return false;\n}\n\n/**\n * @brief Extracts the filename component from a file path.\n *\n * @param Path The path to create a directory at.\n *\n * @return The filename component of the path.\n */\ninline fextl::string GetFilename(const fextl::string& Path) {\n  auto LastSeparator = Path.rfind('/');\n  if (LastSeparator == fextl::string::npos) {\n    // No separator. Likely relative `.`, `..`, `<Application Name>`, or empty string.\n    return Path;\n  }\n\n  return Path.substr(LastSeparator + 1);\n}\n\ninline std::string_view GetFilename(std::string_view Path) {\n  auto LastSeparator = Path.rfind('/');\n  if (LastSeparator == fextl::string::npos) {\n    // No separator. Likely relative `.`, `..`, `<Application Name>`, or empty string.\n    return Path;\n  }\n\n  return Path.substr(LastSeparator + 1);\n}\n\ninline fextl::string ParentPath(const fextl::string& Path) {\n  auto LastSeparator = Path.rfind('/');\n\n  if (LastSeparator == fextl::string::npos) {\n    // No separator. Likely relative `.`, `..`, `<Application Name>`, or empty string.\n    if (Path == \".\" || Path == \"..\") {\n      // In this edge-case, return nothing to match std::filesystem::path::parent_path behaviour.\n      return {};\n    }\n    return Path;\n  }\n\n  if (LastSeparator == 0) {\n    // In the case of root, just return.\n    return \"/\";\n  }\n\n  auto SubString = Path.substr(0, LastSeparator);\n\n  while (SubString.size() > 1 && SubString.ends_with(\"/\")) {\n    // If the substring still ended with `/` then we need to string that off as well.\n    --LastSeparator;\n    SubString = Path.substr(0, LastSeparator);\n  }\n\n  return SubString;\n}\n\ninline bool IsRelative(const std::string_view Path) {\n  return !Path.starts_with('/');\n}\n\ninline bool IsAbsolute(const std::string_view Path) {\n  return Path.starts_with('/');\n}\n\n/**\n * @brief Copy a file from a location to another\n *\n * Behaves similarly to std::filesystem::copy_file but with less copy options.\n *\n * @param From Source file location.\n * @param To Destination file location.\n * @param Options Copy options.\n *\n * @return True if the copy succeeded, false otherwise.\n */\ninline bool CopyFile(const fextl::string& From, const fextl::string& To, CopyOptions Options = CopyOptions::NONE) {\n  const bool DestExists = Exists(To);\n  if (Options == CopyOptions::SKIP_EXISTING && DestExists) {\n    // If the destination file exists already and the skip existing flag is set then\n    // return true without error.\n    return true;\n  }\n\n  if (Options == CopyOptions::OVERWRITE_EXISTING && DestExists) {\n    // If we are overwriting and the file exists then we want to use `sendfile` to overwrite\n    int SourceFD = open(From.c_str(), O_RDONLY | O_CLOEXEC);\n    if (SourceFD == -1) {\n      return false;\n    }\n\n    int DestinationFD = open(To.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0200);\n    if (DestinationFD == -1) {\n      close(SourceFD);\n      return false;\n    }\n\n    struct stat buf;\n    if (fstat(SourceFD, &buf) != 0) {\n      close(DestinationFD);\n      close(SourceFD);\n      return false;\n    }\n\n    // Set the destination permissions to the original source permissions.\n    if (fchmod(DestinationFD, buf.st_mode) != 0) {\n      close(DestinationFD);\n      close(SourceFD);\n      return false;\n    }\n    bool Result = sendfile(DestinationFD, SourceFD, nullptr, buf.st_size) == buf.st_size;\n    close(DestinationFD);\n    close(SourceFD);\n    return Result;\n  }\n\n  if (!DestExists) {\n    // If the destination doesn't exist then just use rename.\n    return rename(From.c_str(), To.c_str()) == 0;\n  }\n\n  return false;\n}\n\ninline fextl::string LexicallyNormal(const fextl::string& Path) {\n  const auto PathSize = Path.size();\n\n  // Early exit on empty paths.\n  if (PathSize == 0) {\n    return {};\n  }\n\n  const auto IsAbsolutePath = IsAbsolute(Path);\n  const auto EndsWithSeparator = Path.ends_with('/');\n  // Count the number of separators up front\n  const auto SeparatorCount = std::count(Path.begin(), Path.end(), '/');\n\n  // Use std::list to store path elements to avoid iterator invalidation on insert/erase.\n  // The list is allocated on stack to be more optimal. The size is determined by the\n  // maximum number of list objects (separator count plus 2) multiplied by the list\n  // element size (32-bytes per element: the string_view itself and the prev/next pointers).\n  size_t DataSize = (sizeof(std::string_view) + sizeof(void*) * 2) * (SeparatorCount + 2);\n  void* Data = alloca(DataSize);\n  fextl::pmr::fixed_size_monotonic_buffer_resource mbr(Data, DataSize);\n  std::pmr::polymorphic_allocator<std::byte> pa {&mbr};\n  std::pmr::list<std::string_view> Parts {pa};\n\n  size_t CurrentOffset {};\n  do {\n    auto FoundSeperator = Path.find('/', CurrentOffset);\n    if (FoundSeperator == Path.npos) {\n      FoundSeperator = PathSize;\n    }\n\n    const auto Begin = Path.begin() + CurrentOffset;\n    const auto End = Path.begin() + FoundSeperator;\n    const auto Size = End - Begin;\n\n    // Only insert parts that contain data.\n    if (Size != 0) {\n      Parts.emplace_back(std::string_view(Begin, End));\n    }\n\n    if (Size == 0) {\n      // If the view is empty, skip over the separator.\n      FoundSeperator += 1;\n    }\n\n    CurrentOffset = FoundSeperator;\n  } while (CurrentOffset != PathSize);\n\n  size_t CurrentIterDistance {};\n  for (auto iter = Parts.begin(); iter != Parts.end();) {\n    auto& Part = *iter;\n    if (Part == \".\") {\n      // Erase '.' directory parts if not at root.\n      if (CurrentIterDistance > 0 || IsAbsolutePath) {\n        // Erasing this iterator, don't increase iter distances\n        iter = Parts.erase(iter);\n        continue;\n      }\n    }\n\n    if (Part == \"..\") {\n      if (CurrentIterDistance > 0) {\n        // If not at root then remove both this iterator and the previous one.\n        // ONLY if the previous iterator is also not \"..\"\n        //\n        // If the previous iterator is '.' then /only/ erase the previous iterator.\n        auto PreviousIter = iter;\n        --PreviousIter;\n\n        if (*PreviousIter == \".\") {\n          // Erasing the previous iterator, iterator distance has subtracted by one\n          --CurrentIterDistance;\n          Parts.erase(PreviousIter);\n        } else if (*PreviousIter != \"..\") {\n          // Erasing the previous iterator, iterator distance has subtracted by one\n          // Also erasing current iterator, which means iterator distance also doesn't increase by one.\n          --CurrentIterDistance;\n          Parts.erase(PreviousIter);\n          iter = Parts.erase(iter);\n          continue;\n        }\n      } else if (IsAbsolutePath) {\n        // `..` at the base. Just remove this\n        iter = Parts.erase(iter);\n        continue;\n      }\n    }\n\n    // Interator distance increased by one.\n    ++CurrentIterDistance;\n    ++iter;\n  }\n\n\n  // Add a final separator unless the last element is ellipses.\n  const bool NeedsFinalSeparator = EndsWithSeparator && (!Parts.empty() && Parts.back() != \".\" && Parts.back() != \"..\");\n  return fextl::fmt::format(\"{}{}{}\", IsAbsolutePath ? \"/\" : \"\", fmt::join(Parts, \"/\"), NeedsFinalSeparator ? \"/\" : \"\");\n}\n\ninline char* Absolute(const char* Path, char Fill[PATH_MAX]) {\n  return realpath(Path, Fill);\n}\n#else\ninline fextl::string PathToString(const std::filesystem::path& path) {\n  return path.string<char, std::char_traits<char>, fextl::FEXAlloc<char>>();\n}\n\ninline CreateDirectoryResult CreateDirectory(const fextl::string& Path) {\n  std::error_code ec;\n  if (std::filesystem::exists(Path, ec)) {\n    return CreateDirectoryResult::EXISTS;\n  }\n\n  return std::filesystem::create_directory(Path, ec) ? CreateDirectoryResult::CREATED : CreateDirectoryResult::ERROR;\n}\n\ninline bool CreateDirectories(const fextl::string& Path) {\n  std::error_code ec;\n  return std::filesystem::exists(Path, ec) || std::filesystem::create_directories(Path, ec);\n}\n\ninline fextl::string GetFilename(const fextl::string& Path) {\n  return PathToString(std::filesystem::path(Path).filename());\n}\n\ninline std::string_view GetFilename(std::string_view Path) {\n  auto Filename = PathToString(std::filesystem::path(Path).filename());\n  return Path.substr(Path.size() - Filename.size());\n}\n\ninline fextl::string ParentPath(const fextl::string& Path) {\n  return PathToString(std::filesystem::path(Path).parent_path());\n}\n\ninline bool IsRelative(const std::string_view Path) {\n  return std::filesystem::path(Path).is_relative();\n}\n\ninline bool IsAbsolute(const std::string_view Path) {\n  return std::filesystem::path(Path).is_absolute();\n}\n\ninline bool CopyFile(const fextl::string& From, const fextl::string& To, CopyOptions Options = CopyOptions::NONE) {\n  std::filesystem::copy_options options {};\n  if (Options == CopyOptions::SKIP_EXISTING) {\n    options = std::filesystem::copy_options::skip_existing;\n  } else if (Options == CopyOptions::OVERWRITE_EXISTING) {\n    options = std::filesystem::copy_options::overwrite_existing;\n  }\n\n  std::error_code ec;\n  return std::filesystem::copy_file(From, To, options, ec);\n}\n\ninline fextl::string LexicallyNormal(const fextl::string& Path) {\n  return PathToString(std::filesystem::path(Path).lexically_normal());\n}\n\ninline char* Absolute(const char* Path, char Fill[PATH_MAX]) {\n  std::error_code ec;\n  const auto PathAbsolute = std::filesystem::absolute(Path, ec);\n  if (!ec) {\n    strncpy(Fill, PathAbsolute.string().c_str(), sizeof(*Fill));\n    return Fill;\n  }\n\n  return nullptr;\n}\n#endif\n\n} // namespace FHU::Filesystem\n"
  },
  {
    "path": "FEXHeaderUtils/FEXHeaderUtils/RingBuffer.h",
    "content": "#pragma once\n#include <bit>\n#include <cstddef>\n\nnamespace FHU {\n// This is a fast thread-local non-blocking ring-buffer.\n// Very useful for debugging purposes to see the history of something.\ntemplate<typename T, size_t Elements>\nrequires (std::has_single_bit(Elements) && std::is_trivially_copyable_v<T>)\nclass [[deprecated(\"Not for production use\")]] NonBlockRingBuffer final {\npublic:\n  void emplace(T Val) {\n    Ring[Current] = Val;\n    Current = (Current + 1) & (Elements - 1);\n  }\n\nprivate:\n  T Ring[Elements] {};\n  size_t Current {};\n};\n} // namespace FHU\n"
  },
  {
    "path": "FEXHeaderUtils/FEXHeaderUtils/StringArgumentParser.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/vector.h>\n#include <FEXCore/fextl/fmt.h>\n\n#include <algorithm>\n#include <string_view>\n\nnamespace FHU {\n\n/**\n * @brief Parses a string of arguments, returning a vector of string_views.\n *\n * @param ArgumentString The string of arguments to parse\n *\n * @return The array of parsed arguments\n */\nstatic inline fextl::vector<std::string_view> ParseArgumentsFromString(const std::string_view ArgumentString) {\n  fextl::vector<std::string_view> Arguments;\n\n  auto Begin = ArgumentString.begin();\n  auto ArgEnd = Begin;\n  const auto End = ArgumentString.end();\n  while (ArgEnd != End && Begin != End) {\n    // The end of an argument ends with a space or the end of the interpreter line.\n    ArgEnd = std::find(Begin, End, ' ');\n\n    if (Begin != ArgEnd) {\n      const auto View = std::string_view(Begin, ArgEnd - Begin);\n      if (!View.empty()) {\n        Arguments.emplace_back(View);\n      }\n    }\n\n    Begin = ArgEnd + 1;\n  }\n\n  return Arguments;\n}\n} // namespace FHU\n"
  },
  {
    "path": "FEXHeaderUtils/FEXHeaderUtils/SymlinkChecks.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/string.h>\n\n#include <fcntl.h>\n#include <sys/stat.h>\n#include <span>\n#include <unistd.h>\n\nnamespace FHU::Symlinks {\n#ifndef _WIN32\n// Checks to see if a filepath is a symlink.\ninline bool IsSymlink(const fextl::string& Filename) {\n  struct stat Buffer {};\n  int Result = lstat(Filename.c_str(), &Buffer);\n  return Result == 0 && S_ISLNK(Buffer.st_mode);\n}\n\n// Resolves a symlink path.\n// Doesn't handle recursive symlinks.\n// Doesn't append null terminator character.\n// Returns a string_view of the resolved path, or an empty view on error.\ninline std::string_view ResolveSymlink(const fextl::string& Filename, std::span<char> ResultBuffer) {\n  ssize_t Result = readlink(Filename.c_str(), ResultBuffer.data(), ResultBuffer.size());\n  if (Result == -1) {\n    return {};\n  }\n\n  return std::string_view(ResultBuffer.data(), Result);\n}\n#endif\n} // namespace FHU::Symlinks\n"
  },
  {
    "path": "FEXHeaderUtils/FEXHeaderUtils/Syscalls.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/LogManager.h>\n\n#include <cstdint>\n#include <sched.h>\n#include <signal.h>\n#include <stdio.h>\n#ifndef _WIN32\n#include <syscall.h>\n#else\n#include <processthreadsapi.h>\n#endif\n#include <sys/stat.h>\n#include <unistd.h>\n\nnamespace FHU::Syscalls {\n#ifndef MAP_FIXED_NOREPLACE\n#define MAP_FIXED_NOREPLACE 0x100000\n#endif\n\n#ifndef SEM_STAT_ANY\n#define SEM_STAT_ANY 20\n#endif\n\n#ifndef SHM_STAT_ANY\n#define SHM_STAT_ANY 15\n#endif\n\n#ifndef MSG_STAT_ANY\n#define MSG_STAT_ANY 13\n#endif\n\n#ifndef CLONE_PIDFD\n#define CLONE_PIDFD 0x00001000\n#endif\n\n#if defined(__aarch64__) || defined(_M_ARM64)\n#ifndef SYS_statx\n#define SYS_statx 291\n#endif\n#elif defined(__x86_64__) || defined(_M_X64)\n#ifndef SYS_statx\n#define SYS_statx 332\n#endif\n#endif\n\n// Common syscall numbers\n#ifndef SYS_pidfd_open\n#define SYS_pidfd_open 434\n#endif\n\n#ifndef _WIN32\ninline int32_t getcpu(uint32_t* cpu, uint32_t* node) {\n  // Third argument is unused\n#if defined(HAS_SYSCALL_GETCPU) && HAS_SYSCALL_GETCPU\n  return ::getcpu(cpu, node);\n#else\n  return ::syscall(SYS_getcpu, cpu, node, nullptr);\n#endif\n}\n\ninline int32_t gettid() {\n#if defined(HAS_SYSCALL_GETTID) && HAS_SYSCALL_GETTID\n  return ::gettid();\n#else\n  return ::syscall(SYS_gettid);\n#endif\n}\n\ninline int32_t tgkill(pid_t tgid, pid_t tid, int sig) {\n#if defined(HAS_SYSCALL_TGKILL) && HAS_SYSCALL_TGKILL\n  return ::tgkill(tgid, tid, sig);\n#else\n  return ::syscall(SYS_tgkill, tgid, tid, sig);\n#endif\n}\n\ninline int32_t statx(int dirfd, const char* pathname, int32_t flags, uint32_t mask, void* statxbuf) {\n#if defined(HAS_SYSCALL_STATX) && HAS_SYSCALL_STATX\n  return ::statx(dirfd, pathname, flags, mask, reinterpret_cast<struct statx* __restrict>(statxbuf));\n#else\n  return ::syscall(SYS_statx, dirfd, pathname, flags, mask, statxbuf);\n#endif\n}\n\ninline int32_t renameat2(int olddirfd, const char* oldpath, int newdirfd, const char* newpath, unsigned int flags) {\n#if defined(HAS_SYSCALL_RENAMEAT2) && HAS_SYSCALL_RENAMEAT2\n  return ::renameat2(olddirfd, oldpath, newdirfd, newpath, flags);\n#else\n  return ::syscall(SYS_renameat2, olddirfd, oldpath, newdirfd, newpath, flags);\n#endif\n}\n\ninline int32_t pidfd_open(pid_t pid, unsigned int flags) {\n  return ::syscall(SYS_pidfd_open, pid, flags);\n}\n#else\n\ninline int32_t getcpu(uint32_t* cpu, uint32_t* node) {\n  if (cpu) {\n    *cpu = GetCurrentProcessorNumber();\n  }\n  if (node) {\n    *node = 0;\n  }\n  return 0;\n}\n\ninline int32_t tgkill(pid_t tgid, pid_t tid, int sig) {\n  ERROR_AND_DIE_FMT(\"Unsupported\");\n  return 0;\n}\n\ninline int32_t gettid() {\n  return GetCurrentThreadId();\n}\n\n#endif\n\n} // namespace FHU::Syscalls\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 Ryan Houdek <Sonicadvance1@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Readme.md",
    "content": "[中文](https://github.com/FEX-Emu/FEX/blob/main/docs/Readme_CN.md)\n# FEX: Emulate x86 Programs on ARM64\nFEX allows you to run x86 applications on ARM64 Linux devices, similar to qemu-user and box64.\nIt offers broad compatibility with both 32-bit and 64-bit binaries, and it can be used alongside Wine/Proton to play Windows games.\n\nIt supports forwarding API calls to host system libraries like OpenGL or Vulkan to reduce emulation overhead.\nAn experimental code cache helps minimize in-game stuttering as much as possible.\nFurthermore, a per-app configuration system allows tweaking performance per game, e.g. by skipping costly memory model emulation.\nWe also provide a user-friendly FEXConfig GUI to explore and change these settings.\n\n## Prerequisites\nFEX requires ARMv8.0+ hardware. It has been tested with the following Linux distributions, though others are likely to work as well:\n\n- Arch Linux\n- Fedora Linux\n- openSUSE\n- Ubuntu 22.04/24.04/24.10/25.04\n\nAn x86-64 RootFS is required and can be downloaded using our `FEXRootFSFetcher` tool for many distributions.\nFor other distributions you will need to generate your own RootFS (our [wiki page](https://wiki.fex-emu.com/index.php/Development:Setting_up_RootFS) might help).\n\n## Quick Start\n### For Ubuntu 22.04, 24.04, 24.10 and 25.04\nExecute the following command in the terminal to install FEX through a PPA.\n\n```sh\ncurl --silent https://raw.githubusercontent.com/FEX-Emu/FEX/main/Scripts/InstallFEX.py | python3\n```\n\nThis command will walk you through installing FEX through a PPA, and downloading a RootFS for use with FEX.\n\n### For other Distributions\nFollow the guide on the official FEX-Emu Wiki [here](https://wiki.fex-emu.com/index.php/Development:Setting_up_FEX).\n\n### Navigating the Source\nSee the [Source Outline](docs/SourceOutline.md) for more information.\n"
  },
  {
    "path": "Scripts/CI_FetchRootFS.py",
    "content": "#!/usr/bin/python3\nimport xxhash\nimport sys\nimport os\nimport shutil\nimport subprocess\n\ndef GetDistroInfo():\n    DistroName = \"Unknown\"\n    DistroVersion = \"Unknown\"\n\n    with open(\"/etc/lsb-release\", 'r') as f:\n        while True:\n            Line = f.readline()\n            if not Line:\n                break\n            Split = Line.split(\"=\")\n            if Split[0] == \"DISTRIB_ID\":\n                DistroName = Split[1].lower().rstrip()\n            if Split[0] == \"DISTRIB_RELEASE\":\n                DistroVersion = Split[1].rstrip()\n\n    return [DistroName, DistroVersion]\n\ndef FindBestImageFit(Distro, links_file):\n    CurrentFitSize = 0\n    BestFitDistro = None\n    BestFitDistroVersion = None\n    BestFitReadableName = None\n    BestFitImagePath = None\n    BestFitHash = None\n\n    with open(links_file, 'r') as f:\n        while True:\n            # Order:\n            # Distro Name\n            # Distro Version\n            # User readable name\n            # File Path\n            # Hash\n\n            DistroName = f.readline().strip()\n            if not DistroName:\n                break\n\n            DistroVersion = f.readline().strip()\n            DistroReadableName = f.readline().strip()\n            DistroImagePath = f.readline().strip()\n            DistroHash = f.readline().strip()\n\n            FitRate = 0\n            if (DistroName == Distro[0] or\n                DistroName == None):\n                FitRate += 1\n\n            if (DistroVersion == Distro[1] or\n                DistroVersion == None):\n                FitRate += 1\n\n            if FitRate > CurrentFitSize:\n                CurrentFitSize = FitRate\n                BestFitDistro = DistroName\n                BestFitDistroVersion = DistroVersion\n                BestFitReadableName = DistroReadableName\n                BestFitImagePath = DistroImagePath\n                BestFitHash = DistroHash\n\n    return [BestFitDistro, BestFitDistroVersion, BestFitReadableName, BestFitImagePath, int(BestFitHash, 16)]\n\n\ndef HashFile(file):\n    # 32MB buffer size\n    BUFFER_SIZE = 32 * 1024 * 1024\n\n    x = xxhash.xxh3_64(seed=0)\n    b = bytearray(BUFFER_SIZE)\n    mv = memoryview(b)\n\n    with open(file, 'rb') as f:\n        while n := f.readinto(mv):\n            x.update(mv[:n])\n\n    return int.from_bytes(x.digest(), \"big\")\n\ndef RemoveRootFSFolder(RootFSPath):\n    print(\"Removing previous rootfs extraction before copying\")\n    shutil.rmtree(RootFSPath, ignore_errors = True)\n    # Recreate the folder\n    os.makedirs(RootFSPath)\n\ndef CheckFilesystemForFS(RootFSMountPath, RootFSPath, DistroFit):\n    # Check if rootfs mount path exists\n    if (not os.path.exists(RootFSMountPath) or\n        not os.path.isdir(RootFSMountPath)):\n        print(\"RootFS mount path is wrong\")\n        return False\n\n    # Check if rootfs path exists\n    if (not os.path.exists(RootFSPath) or\n        not os.path.isdir(RootFSPath)):\n        # Create this directory\n        os.makedirs(RootFSPath)\n\n    # Check if rootfs path exists\n    if not os.path.isdir(RootFSPath):\n        print(\"RootFS path is not a directory\")\n        return False\n\n    # Check rootfs folder for image, copy and extract as necessary\n    MountRootFSImagePath = RootFSMountPath + DistroFit[3]\n    RootFSImagePath = RootFSPath + \"/\" + os.path.basename(DistroFit[3])\n    NeedsExtraction = False\n    PreviouslyExistingRootFS = False\n\n    if not os.path.exists(MountRootFSImagePath):\n        print(\"Image {} doesn't exist\".format(MountRootFSImagePath))\n        return False\n\n    if not os.path.exists(RootFSImagePath):\n        # Copy over\n        print(\"RootFS image doesn't exist. Copying\")\n        RemoveRootFSFolder(RootFSPath)\n        shutil.copyfile(MountRootFSImagePath, RootFSImagePath)\n        NeedsExtraction = True\n\n    # Check if the image needs to be extracted\n    if not os.path.exists(RootFSPath + \"/usr\"):\n        NeedsExtraction = True\n    else:\n        PreviouslyExistingRootFS = True\n\n    # Now hash the image\n    RootFSHash = HashFile(RootFSImagePath)\n    if RootFSHash != DistroFit[4]:\n        print(\"Hash {} did not match {}, copying new image\".format(hex(RootFSHash), hex(DistroFit[4])))\n\n        if PreviouslyExistingRootFS:\n            RemoveRootFSFolder(RootFSPath)\n\n        shutil.copyfile(MountRootFSImagePath, RootFSImagePath)\n        NeedsExtraction = True\n\n    if NeedsExtraction:\n        print(\"Extracting rootfs\")\n\n        CmdResult = subprocess.call([\"unsquashfs\", \"-f\", \"-d\", RootFSPath, RootFSImagePath])\n        if CmdResult != 0:\n            print(\"Couldn't extract squashfs. Removing image file to be safe\")\n            os.remove(RootFSImagePath)\n            return False\n\n    if not os.path.exists(RootFSPath + \"/usr\"):\n        print(\"Couldn't extract squashfs. Removing image file to be safe\")\n        os.remove(RootFSImagePath)\n        return False\n\n    print(\"RootFS successfully checked and extracted\")\n\n    return True\n\ndef main():\n    if sys.version_info[0] < 3:\n        logging.critical (\"Python 3 or a more recent version is required.\")\n\n    FEX_ROOTFS_MOUNT = os.getenv(\"FEX_ROOTFS_MOUNT\")\n    FEX_ROOTFS_PATH = os.getenv(\"FEX_ROOTFS_PATH\")\n\n    if FEX_ROOTFS_MOUNT == None:\n        print(\"Need FEX_ROOTFS_MOUNT set\")\n        sys.exit(1)\n\n    if FEX_ROOTFS_PATH == None:\n        print(\"Need FEX_ROOTFS_PATH set\")\n        sys.exit(1)\n\n    if shutil.which(\"unsquashfs\") is None:\n        print(\"CI system didn't have unsquashfs installed\")\n        sys.exit(1)\n\n    Distro = GetDistroInfo()\n    DistroFit = FindBestImageFit(Distro, FEX_ROOTFS_MOUNT + \"/RootFS_links.txt\")\n\n    if CheckFilesystemForFS(FEX_ROOTFS_MOUNT, FEX_ROOTFS_PATH, DistroFit) == False:\n        print(\"Couldn't load filesystem rootfs\")\n        sys.exit(1)\n\n    return 0\n\nif __name__ == \"__main__\":\n    # execute only if run as a script\n    sys.exit(main())\n"
  },
  {
    "path": "Scripts/CheckBinfmtNotInstall.sh",
    "content": "#!/bin/sh\n\nfor binfmt in \"$@\"; do\n  result=0\n  if command -v update-binfmts >/dev/null; then\n\t# If we found the binfmt_misc file passed in then error\n    update-binfmts --find \"$binfmt\" 1>&- 2>&- && result=1\n  fi\n\n  # If the binfmt_misc file exists then error\n  [ -f \"$binfmt\" ] && result=1\n\n  if [ $result -eq 1 ]; then\n    echo \"===============================================================\"\n    echo \"$binfmt binfmt file is installed!\"\n    echo \"This conflicts with FEX-Emu's binfmt_misc!\"\n    echo \"This will cause issues when running FEX-Emu through binfmt_misc\"\n    echo \"Not installing until you uninstall this binfmt_misc file!\"\n    echo \"===============================================================\"\n    exit 1\n  fi\ndone\n\nexit 0\n"
  },
  {
    "path": "Scripts/ClassifyCPU.py",
    "content": "#!/usr/bin/python3\nimport sys\nimport platform\n\ndef ListContainsRequired(Features, RequiredFeatures):\n    for Req in RequiredFeatures:\n        if not Req in Features:\n            return False\n    return True\n\ndef GetCPUFeaturesVersion():\n\n    # Also LOR but kernel doesn't expose this\n    v8_1Mandatory = [\"atomics\", \"asimdrdm\", \"crc32\"]\n    v8_2Mandatory = v8_1Mandatory + [\"dcpop\"]\n    v8_3Mandatory = v8_2Mandatory + [\"fcma\", \"jscvt\", \"lrcpc\", \"paca\", \"pacg\"]\n    v8_4Mandatory = v8_3Mandatory + [\"asimddp\", \"flagm\", \"ilrcpc\", \"uscat\"]\n\n    #  fphp asimdhp asimddp\n\n    File = open(\"/proc/cpuinfo\", \"r\")\n    Lines = File.readlines()\n    File.close()\n\n    # Minimum spec is ARMv8.0\n    _ArchVersion = \"8.0\"\n    for Line in Lines:\n        if \"Features\" in Line:\n            Features = Line.split(\":\")[1].strip().split(\" \")\n\n            # We don't care beyond 8.4 right now\n            if ListContainsRequired(Features, v8_4Mandatory):\n                _ArchVersion = \"8.4\"\n            elif ListContainsRequired(Features, v8_3Mandatory):\n                _ArchVersion = \"8.3\"\n            elif ListContainsRequired(Features, v8_2Mandatory):\n                _ArchVersion = \"8.2\"\n            elif ListContainsRequired(Features, v8_1Mandatory):\n                _ArchVersion = \"8.1\"\n            break;\n\n    return _ArchVersion\n\ndef main():\n    if (platform.machine() == \"aarch64\"):\n        print(\"ARMv{}\".format(GetCPUFeaturesVersion()))\n    elif (platform.machine() == \"x86_64\"):\n        print(\"x64\")\n\n    sys.exit(0)\n\nif __name__ == \"__main__\":\n    sys.exit(main())\n"
  },
  {
    "path": "Scripts/DefinitionExtract.py",
    "content": "#!/usr/bin/python3\nimport clang.cindex\nfrom clang.cindex import CursorKind\nfrom clang.cindex import TypeKind\nfrom clang.cindex import TranslationUnit\nimport sys\nfrom dataclasses import dataclass\nimport subprocess\nimport logging\nlogger = logging.getLogger()\nlogger.setLevel(logging.WARNING)\n\n@dataclass\nclass TypeDefinition:\n    TYPE_UNKNOWN = 0\n    TYPE_STRUCT = 1\n    TYPE_UNION = 2\n    TYPE_FIELD = 3\n    TYPE_VARDECL = 4\n\n    name: str\n    type: int\n    def __init__(self, Name, Type):\n        self.name = Name\n        self.type = Type\n\n    @property\n    def Name(self):\n        return self.name\n    @property\n    def Type(self):\n        return self.type\n\n@dataclass\nclass AliasType:\n    ALIAS_X86_32  = 0\n    ALIAS_X86_64  = 1\n    ALIAS_AARCH64 = 2\n    ALIAS_WIN32   = 3\n    ALIAS_WIN64   = 4\n    Name: str\n    AliasType: int\n    def __init__(self, Name, Type):\n        self.Name = Name\n        self.AliasType = Type\n\n@dataclass\nclass StructDefinition(TypeDefinition):\n    Size: int\n    Aliases: list\n    Members: list\n    ExpectFEXMatch: bool\n\n    def __init__(self, Name, Size):\n        super(StructDefinition, self).__init__(Name, TypeDefinition.TYPE_STRUCT)\n        self.Size = Size\n        self.Aliases = []\n        self.Members = []\n        self.ExpectFEXMatch = False\n\n@dataclass\nclass UnionDefinition(TypeDefinition):\n    Size: int\n    Aliases: list\n    Members: list\n    ExpectFEXMatch: bool\n\n    def __init__(self, Name, Size):\n        super(UnionDefinition, self).__init__(Name, TypeDefinition.TYPE_UNION)\n        self.Size = Size\n        self.Aliases = []\n        self.Members = []\n        self.ExpectFEXMatch = False\n\n@dataclass\nclass FieldDefinition(TypeDefinition):\n    Size: int\n    OffsetOf: int\n    Alignment: int\n    def __init__(self, Name, Size, OffsetOf, Alignment):\n        super(FieldDefinition, self).__init__(Name, TypeDefinition.TYPE_FIELD)\n        self.Size = Size\n        self.OffsetOf = OffsetOf\n        self.Alignment = Alignment\n\n@dataclass\nclass VarDeclDefinition(TypeDefinition):\n    Size: int\n    Aliases: list\n    ExpectFEXMatch: bool\n    Value: str\n\n    def __init__(self, Name, Size):\n        super(VarDeclDefinition, self).__init__(Name, TypeDefinition.TYPE_VARDECL)\n        self.Size = Size\n        self.Aliases = []\n        self.ExpectFEXMatch = False\n\n@dataclass\nclass ArchDB:\n    Parsed: bool\n    ArchName: str\n    NamespaceScope: list\n    CurrentNamespace: str\n    TU: TranslationUnit\n    Structs: dict\n    Unions: dict\n    VarDecls: dict\n    FieldDecls: list\n    def __init__(self, ArchName):\n        self.Parsed = True\n        self.ArchName = ArchName\n        self.NamespaceScope = []\n        self.CurrentNamespace = \"\"\n        self.TU = None\n        self.Structs = {}\n        self.Unions = {}\n        self.VarDecls = {}\n        self.FieldDecls = []\n\n@dataclass\nclass FunctionDecl:\n    Name: str\n    Ret: str\n    Params: list\n\n    def __init__(self, Name, Ret):\n        self.Name = Name\n        self.Ret = Ret\n        self.Params = []\n\nFunctionDecls = []\n\ndef HandleFunctionDeclCursor(Arch, Cursor):\n    if (Cursor.is_definition()):\n        return Arch\n\n    #logging.critical (\"Unhandled FunctionDeclCursor {0}-{1}-{2}-{3}\".format(Cursor.kind, Cursor.type.spelling, Cursor.spelling,\n    #    Cursor.result_type.spelling))\n\n    Function = FunctionDecl(Cursor.spelling, Cursor.result_type.spelling)\n\n    for Child in Cursor.get_children():\n        if (Child.kind == CursorKind.TYPE_REF):\n            # This will give us the return type\n            # We skip this since we get it at the start instead\n            pass\n        elif (Child.kind == CursorKind.PARM_DECL):\n            # This gives us a parameter type\n            Function.Params.append(Child.type.spelling)\n        elif (Child.kind == CursorKind.ASM_LABEL_ATTR):\n            # Whatever you are we don't care about you\n            return Arch\n        elif (Child.kind == CursorKind.WARN_UNUSED_RESULT_ATTR):\n            # Whatever you are we don't care about you\n            return Arch\n        elif (Child.kind == CursorKind.VISIBILITY_ATTR or\n              Child.kind == CursorKind.UNEXPOSED_ATTR or\n              Child.kind == CursorKind.CONST_ATTR or\n              Child.kind == CursorKind.PURE_ATTR):\n            pass\n        else:\n            logging.critical (\"\\tUnhandled FunctionDeclCursor {0}-{1}-{2}\".format(Child.kind, Child.type.spelling, Child.spelling))\n            sys.exit(-1)\n\n    FunctionDecls.append(Function)\n    return Arch\n\ndef PrintFunctionDecls():\n    for Decl in FunctionDecls:\n        print(\"template<>\\nstruct fex_gen_config<{}> {{}};\".format(Decl.Name))\n\ndef FindClangArguments(OriginalArguments):\n    AddedArguments = [\"clang\"]\n    AddedArguments.extend(OriginalArguments)\n    AddedArguments.extend([\"-v\", \"-x\", \"c++\", \"-S\", \"-\"])\n    Proc = subprocess.Popen(AddedArguments, stderr = subprocess.PIPE, stdin = subprocess.DEVNULL)\n    NewIncludes = []\n    BeginSearch = False\n    while True:\n        Line = Proc.stderr.readline().strip()\n\n        if not Line:\n            Proc.terminate()\n            break\n\n        if (Line == b\"End of search list.\"):\n            BeginSearch = False\n            Proc.terminate()\n            break\n\n        if (BeginSearch == True):\n            NewIncludes.append(\"-I\" + Line.decode('ascii'))\n\n        if (Line == b\"#include <...> search starts here:\"):\n            BeginSearch = True\n\n    # Add back original arguments\n    NewIncludes.extend(OriginalArguments)\n    return NewIncludes\n\ndef SetNamespace(Arch):\n    Arch.CurrentNamespace = \"\"\n    for Namespace in Arch.NamespaceScope:\n        Arch.CurrentNamespace = Arch.CurrentNamespace + Namespace + \"::\"\n\ndef HandleStructDeclCursor(Arch, Cursor, NameOverride = \"\"):\n    # Append namespace\n    CursorName = \"\"\n    StructType = Cursor.type\n    if (len(StructType.spelling) == 0):\n        CursorName = NameOverride\n    else:\n        CursorName = StructType.spelling\n\n    if (len(CursorName) != 0):\n        Arch.NamespaceScope.append(CursorName)\n        SetNamespace(Arch)\n\n    Struct = StructDefinition(\n        Name = CursorName,\n        Size = StructType.get_size())\n\n    # Handle children\n    Arch.Structs[Struct.Name] = HandleStructElements(Arch, Struct, Cursor)\n\n    # Pop namespace off\n    if (len(CursorName) != 0):\n        Arch.NamespaceScope.pop()\n        SetNamespace(Arch)\n\n    return Arch\n\ndef HandleUnionDeclCursor(Arch, Cursor, NameOverride = \"\"):\n    # Append namespace\n    CursorName = \"\"\n\n    if (len(Cursor.spelling) == 0):\n        CursorName = NameOverride\n    else:\n        CursorName = Cursor.spelling\n\n    if (len(CursorName) != 0):\n        Arch.NamespaceScope.append(CursorName)\n        SetNamespace(Arch)\n\n    UnionType = Cursor.type\n    Union = UnionDefinition(\n        Name = CursorName,\n        Size = UnionType.get_size())\n    Arch.Unions[Union.Name] = Union\n\n    # Handle children\n    Arch.Unions[Union.Name] = HandleStructElements(Arch, Union, Cursor)\n\n    # Pop namespace off\n    if (len(CursorName) != 0):\n        Arch.NamespaceScope.pop()\n        SetNamespace(Arch)\n\n    return Arch\n\ndef HandleVarDeclCursor(Arch, Cursor):\n    CursorName = Cursor.spelling\n    DeclType = Cursor.type\n    Def = Cursor.get_definition()\n\n    VarDecl = VarDeclDefinition(\n        Name = CursorName,\n        Size = DeclType.get_size())\n    Arch.VarDecls[VarDecl.Name] = HandleVarDeclElements(Arch, VarDecl, Cursor)\n    return Arch\n\ndef HandleVarDeclElements(Arch, VarDecl, Cursor):\n    for Child in Cursor.get_children():\n\n        if (Child.kind == CursorKind.ANNOTATE_ATTR):\n            if (Child.spelling.startswith(\"ioctl-alias-\")):\n                Sections = Child.spelling.split(\"-\")\n                if (Sections[2] == \"x86_32\"):\n                    VarDecl.Aliases.append(AliasType(Sections[3], AliasType.ALIAS_X86_32))\n                elif (Sections[2] == \"x86_64\"):\n                    VarDecl.Aliases.append(AliasType(Sections[3], AliasType.ALIAS_X86_64))\n                elif (Sections[2] == \"aarch64\"):\n                    VarDecl.Aliases.append(AliasType(Sections[3], AliasType.ALIAS_AARCH64))\n                elif (Sections[2] == \"win32\"):\n                    VarDecl.Aliases.append(AliasType(Sections[3], AliasType.ALIAS_WIN32))\n                elif (Sections[2] == \"win64\"):\n                    VarDecl.Aliases.append(AliasType(Sections[3], AliasType.ALIAS_WIN64))\n                else:\n                    logging.critical (\"Can't handle alias type '{0}'\".format(Child.spelling))\n                    Arch.Parsed = False\n            elif (Child.spelling == \"fex-match\"):\n                VarDecl.ExpectedFEXMatch = True\n            else:\n                # Unknown annotation\n                pass\n        elif (Child.kind == CursorKind.TYPE_REF or\n              Child.kind == CursorKind.UNEXPOSED_EXPR or\n              Child.kind == CursorKind.PAREN_EXPR or\n              Child.kind == CursorKind.BINARY_OPERATOR\n              ):\n              pass\n\n    return VarDecl\n\ndef HandleTypeDefDeclCursor(Arch, Cursor):\n    TypeDefType = Cursor.underlying_typedef_type\n    CanonicalType = TypeDefType.get_canonical()\n\n    TypeDefName = Cursor.type.get_typedef_name()\n\n    if (TypeDefType.kind == TypeKind.ELABORATED and CanonicalType.kind == TypeKind.RECORD):\n        if (len(TypeDefName) != 0):\n            HandleTypeDefDecl(Arch, Cursor, TypeDefName)\n\n\t    # Append namespace\n            Arch.NamespaceScope.append(TypeDefName)\n            SetNamespace(Arch)\n\n            Arch = HandleCursor(Arch, Cursor)\n            #StructType = Cursor.type\n            #Struct = StructDefinition(\n            #    Name = TypeDefName,\n            #    Size = CanonicalType.get_size())\n            #Arch.Structs[TypeDefName] = Struct\n\n            ## Handle children\n            #Arch.Structs[TypeDefName] = HandleStructElements(Arch, Struct, Cursor)\n\n            # Pop namespace off\n            Arch.NamespaceScope.pop()\n            SetNamespace(Arch)\n    else:\n        if (len(TypeDefName) != 0):\n            Def = Cursor.get_definition()\n\n            VarDecl = VarDeclDefinition(\n                Name = TypeDefName,\n                Size = CanonicalType.get_size())\n            Arch.VarDecls[VarDecl.Name] = HandleVarDeclElements(Arch, VarDecl, Cursor)\n\n    return Arch\n\ndef HandleStructElements(Arch, Struct, Cursor):\n    for Child in Cursor.get_children():\n        # logging.info (\"\\t\\tStruct/Union Children: Cursor \\\"{0}{1}\\\" of kind {2}\".format(Arch.CurrentNamespace, Child.spelling, Child.kind))\n        if (Child.kind == CursorKind.ANNOTATE_ATTR):\n            if (Child.spelling.startswith(\"alias-\")):\n                Sections = Child.spelling.split(\"-\")\n                if (Sections[1] == \"x86_32\"):\n                    Struct.Aliases.append(AliasType(Sections[2], AliasType.ALIAS_X86_32))\n                elif (Sections[1] == \"x86_64\"):\n                    Struct.Aliases.append(AliasType(Sections[2], AliasType.ALIAS_X86_64))\n                elif (Sections[1] == \"aarch64\"):\n                    Struct.Aliases.append(AliasType(Sections[2], AliasType.ALIAS_AARCH64))\n                elif (Sections[1] == \"win32\"):\n                    Struct.Aliases.append(AliasType(Sections[2], AliasType.ALIAS_WIN32))\n                elif (Sections[1] == \"win64\"):\n                    Struct.Aliases.append(AliasType(Sections[2], AliasType.ALIAS_WIN64))\n                else:\n                    logging.critical (\"Can't handle alias type '{0}'\".format(Child.spelling))\n                    Arch.Parsed = False\n\n            elif (Child.spelling == \"fex-match\"):\n                Struct.ExpectedFEXMatch = True\n            else:\n                # Unknown annotation\n                pass\n        elif (Child.kind == CursorKind.FIELD_DECL):\n            ParentType = Cursor.type\n            FieldType = Child.type\n            Field = FieldDefinition(\n                Name = Child.spelling,\n                Size = FieldType.get_size(),\n                OffsetOf = ParentType.get_offset(Child.spelling),\n                Alignment = FieldType.get_align())\n\n            #logging.info (\"\\t{0}\".format(Child.spelling))\n            #logging.info (\"\\t\\tSize of type: {0}\".format(FieldType.get_size()));\n            #logging.info (\"\\t\\tAlignment of type: {0}\".format(FieldType.get_align()));\n            #logging.info (\"\\t\\tOffsetof of type: {0}\".format(ParentType.get_offset(Child.spelling)));\n            Struct.Members.append(Field)\n            Arch.FieldDecls.append(Field)\n        elif (Child.kind == CursorKind.STRUCT_DECL):\n            ParentType = Cursor.type\n            FieldType = Child.type\n            Field = FieldDefinition(\n                Name = Child.spelling,\n                Size = FieldType.get_size(),\n                OffsetOf = ParentType.get_offset(Child.spelling),\n                Alignment = FieldType.get_align())\n\n            #logging.info (\"\\t{0}\".format(Child.spelling))\n            #logging.info (\"\\t\\tSize of type: {0}\".format(FieldType.get_size()));\n            #logging.info (\"\\t\\tAlignment of type: {0}\".format(FieldType.get_align()));\n            #logging.info (\"\\t\\tOffsetof of type: {0}\".format(ParentType.get_offset(Child.spelling)));\n            Struct.Members.append(Field)\n            Arch.FieldDecls.append(Field)\n            Arch = HandleStructDeclCursor(Arch, Child)\n        elif (Child.kind == CursorKind.UNION_DECL):\n            Struct = HandleStructElements(Arch, Struct, Child)\n            #ParentType = Cursor.type\n            #FieldType = Child.type\n            #Field = FieldDefinition(\n            #    Name = Child.spelling,\n            #    Size = FieldType.get_size(),\n            #    OffsetOf = ParentType.get_offset(Child.spelling),\n            #    Alignment = FieldType.get_align())\n\n            #logging.info (\"\\t{0}\".format(Child.spelling))\n            #logging.info (\"\\t\\tSize of type: {0}\".format(FieldType.get_size()));\n            #logging.info (\"\\t\\tAlignment of type: {0}\".format(FieldType.get_align()));\n            #logging.info (\"\\t\\tOffsetof of type: {0}\".format(ParentType.get_offset(Child.spelling)));\n            #Struct.Members.append(Field)\n            #Arch.FieldDecls.append(Field)\n            #Arch = HandleUnionDeclCursor(Arch, Child)\n        elif (Child.kind == CursorKind.TYPEDEF_DECL):\n            Arch = HandleTypeDefDeclCursor(Arch, Child)\n        else:\n            Arch = HandleCursor(Arch, Child)\n\n    return Struct\n\ndef HandleTypeDefDecl(Arch, Cursor, Name):\n    for Child in Cursor.get_children():\n        if (Child.kind == CursorKind.UNION_DECL):\n            pass\n        elif (Child.kind == CursorKind.STRUCT_DECL):\n            Arch = HandleStructDeclCursor(Arch, Child, Name)\n        elif (Child.kind == CursorKind.UNION_DECL):\n            Arch = HandleUnionDeclCursor(Arch, Child, Name)\n        elif (Child.kind == CursorKind.TYPEDEF_DECL):\n            Arch = HandleTypeDefDeclCursor(Arch, Child)\n        elif (Child.kind == CursorKind.TYPE_REF or\n              Child.kind == CursorKind.NAMESPACE_REF or\n              Child.kind == CursorKind.TEMPLATE_REF or\n              Child.kind == CursorKind.ALIGNED_ATTR):\n            # Safe to pass on\n            pass\n        else:\n            logging.critical (\"Unhandled TypedefDecl {0}-{1}-{2}\".format(Child.kind, Child.type.spelling, Child.spelling))\n\ndef HandleCursor(Arch, Cursor):\n    if (Cursor.kind.is_invalid()):\n        Diags = TU.diagnostics\n        for Diag in Diags:\n            logging.warning (Diag.format())\n\n        Arch.Parsed = False\n        return\n\n    for Child in Cursor.get_children():\n        if (Child.kind == CursorKind.TRANSLATION_UNIT):\n            Arch = HandleCursor(Arch, Child)\n        elif (Child.kind == CursorKind.FIELD_DECL):\n            pass\n        elif (Child.kind == CursorKind.UNION_DECL):\n            Arch = HandleUnionDeclCursor(Arch, Child)\n        elif (Child.kind == CursorKind.STRUCT_DECL):\n            Arch = HandleStructDeclCursor(Arch, Child)\n        elif (Child.kind == CursorKind.TYPEDEF_DECL):\n            Arch = HandleTypeDefDeclCursor(Arch, Child)\n        elif (Child.kind == CursorKind.VAR_DECL):\n            Arch = HandleVarDeclCursor(Arch, Child)\n        elif (Child.kind == CursorKind.NAMESPACE):\n            # Append namespace\n            Arch.NamespaceScope.append(Child.spelling)\n            SetNamespace(Arch)\n\n            # Handle children\n            Arch = HandleCursor(Arch, Child)\n\n            # Pop namespace off\n            Arch.NamespaceScope.pop()\n            SetNamespace(Arch)\n        elif (Child.kind == CursorKind.TYPE_REF):\n            # Safe to pass on\n            pass\n        elif (Child.kind == CursorKind.FUNCTION_DECL):\n            # For function printing\n            Arch = HandleFunctionDeclCursor(Arch, Child)\n        else:\n            Arch = HandleCursor(Arch, Child)\n\n    return Arch\n\ndef GetDB(Arch, filename, args):\n    Index = clang.cindex.Index.create()\n    try:\n        TU = Index.parse(filename, args=args, options=TranslationUnit.PARSE_INCOMPLETE)\n    except TranslationUnitLoadError:\n        Arch.Parsed = False\n        Diags = TU.diagnostics\n        for Diag in Diags:\n            logging.warning (Diag.format())\n\n        return\n\n    Arch.TU = TU\n    FunctionDecls.clear()\n    HandleCursor(Arch, TU.cursor)\n\n    # Get diagnostics\n    Diags = TU.diagnostics\n    if (len(Diags) != 0):\n        logging.warning (\"Diagnostics from Arch: {0}\".format(Arch.ArchName))\n\n    for Diag in Diags:\n        logging.warning (Diag.format())\n\n    return Arch\n\ndef main():\n    if sys.version_info[0] < 3:\n        logging.critical (\"Python 3 or a more recent version is required.\")\n\n    if (len(sys.argv) < 2):\n        print (\"usage: %s <Header.hpp> <clang arguments...>\" % (sys.argv[0]))\n\n    Header = \"\"\n    BaseArgs = []\n\n    # Parse our arguments\n    Header = sys.argv[1]\n\n    # Add arguments for clang\n    for ArgIndex in range(2, len(sys.argv)):\n        BaseArgs.append(sys.argv[ArgIndex])\n\n    args_x86_64 = [\n        \"-isystem\", \"/usr/include/x86_64-linux-gnu\",\n        \"-isystem\", \"/usr/x86_64-linux-gnu/include/c++/10/x86_64-linux-gnu/\",\n        \"-isystem\", \"/usr/x86_64-linux-gnu/include/\",\n        \"-O2\",\n        \"--target=x86_64-linux-unknown\",\n        \"-DARCHITECTURE_x86_64\",\n    ]\n\n    # Add all the arguments to the different lists\n    args_x86_64.extend(BaseArgs)\n\n    # We need to find the default arguments through clang invocations\n    args_x86_64 = FindClangArguments(args_x86_64)\n\n    Arch_x86_64 = ArchDB(\"x86_64\")\n    Arch_x86_64 = GetDB(Arch_x86_64, Header, args_x86_64)\n    PrintFunctionDecls()\n\nif __name__ == \"__main__\":\n    # execute only if run as a script\n    sys.exit(main())\n"
  },
  {
    "path": "Scripts/FEXUpdateAOTIRCache.sh",
    "content": "#!/bin/sh\nFEX=${1:-FEXLoader}\necho \"Using $FEX\"\n\nfor fileid in ~/.fex-emu/aotir/*.path; do\n\tfilename=$(cat \"$fileid\")\n\targs=\"\"\n\n\t# if L is 6 chars from the end, use localflags\n\tcase $fileid in\n\t\t*L?????) _abi=--abilocalflags ;;\n\t\t*)    _abi=--no-abilocalflags ;;\n\tesac\n\n\t# if T is 7 chars from the end, use tso\n\tcase $fileid in\n\t\t*T??????) _tso=--tsoenabled ;;\n\t\t*)     _tso=--no-tsoenabled ;;\n\tesac\n\n\t# if S is 8 chars from the end, use full smc\n\tcase $fileid in\n\t\t*S???????) _smc=full ;;\n\t\t*)         _smc=mman ;;\n\tesac\n\n\tif [ -f \"${fileid%.path}.aotir\" ]; then\n\t\techo \"$(basename \"$fileid\") has already been generated\"\n\telse\n\t\techo \"Processing $(basename \"$fileid\") ($filename) with $args\"\n\t\t$FEX --aotirgenerate \"$_abi\" \"$_tso\" --smc=\"$_smc\" \"$filename\"\n\tfi\ndone\n"
  },
  {
    "path": "Scripts/GenerateSyscallNumbers.py",
    "content": "#!/usr/bin/python3\nfrom dataclasses import dataclass\nimport math\nimport sys\nimport logging\nlogger = logging.getLogger()\nlogger.setLevel(logging.WARNING)\n\n# Usage of this script is `Scripts/GenerateSyscallNumbers.py <Path to Linux directory>`\n# This will then parse the syscall headers and format them in an enum\n# Then this will be output in stdout\n# This output should then be checked and copied to the following headers, splitting up the enums:\n#   - Source/Tests/LinuxSyscalls/x32/SyscallsEnum.h\n#   - Source/Tests/LinuxSyscalls/x64/SyscallsEnum.h\n#   - Source/Tests/LinuxSyscalls/Arm64/SyscallsEnum.h\n# `FEX_Syscalls_Common` is provided in the output as just an indicator for which syscalls are using the common\n# syscall interface.\n\n@dataclass\nclass SyscallDefinition:\n    arch: str\n    syscall_number: int\n    abi: str\n    name: str\n    entry: str\n    def __init__(self, Arch, SyscallNumber, ABI, Name, Entry):\n        self.arch = Arch\n        self.syscall_number = SyscallNumber\n        self.abi = ABI\n        self.name = Name\n        self.entry = Entry\n\n    @property\n    def Arch(self):\n        return self.arch\n\n    @property\n    def Number(self):\n        return self.syscall_number\n\n    @property\n    def ABI(self):\n        return self.abi\n\n    @property\n    def Name(self):\n        return self.name\n\n    @property\n    def EntryName(self):\n        return self.entry\n\nSyscallx64File = \"/arch/x86/entry/syscalls/syscall_64.tbl\"\nSyscallx86File = \"/arch/x86/entry/syscalls/syscall_32.tbl\"\nSyscallArm64File = \"/include/uapi/asm-generic/unistd.h\"\n\n# Syscall names that had naming conflict with some global definitions\n# Renamed to work around that issue\nDefinitionRenameDict = {\n    \"pread64\": \"pread_64\",\n    \"pwrite64\": \"pwrite_64\",\n    \"prlimit64\": \"prlimit_64\",\n    # musl/Alpine Linux defines `fstatat64` as a define that points to `fstatat`.\n    # Rename it to avoid global define conflicts.\n    \"fstatat64\": \"fstatat_64\",\n}\n\nDefinitions_x64 = []\nDefinitions_x64_dict = {}\nDefinitions_x86 = []\nDefinitions_x86_dict = {}\nDefinitions_Arm64 = []\nDefinitions_Arm64_dict = {}\n\nNumArches = 0\nSyscallDefinitions = {}\n\ndef ParseArchSyscalls(Defs, DefsDict, Arch, FilePath, IgnoreArch):\n    global NumArches\n    global SyscallDefinitions\n    syscall_file = open(FilePath, \"r\")\n    text_lines = syscall_file.readlines()\n    syscall_file.close()\n\n    NumArches += 1\n    for line in text_lines:\n        line = line.strip()\n\n        # Skip lines that are a comment\n        if line.startswith(\"#\") or len(line) == 0:\n            continue\n\n        # Format: <Number> <ABI> <Name> <Entry Name>\n        split_text = line.split()\n\n        Num = split_text[0]\n        ABI = split_text[1]\n\n        # If the ABI is on the ignore list then don't store it\n        if ABI in IgnoreArch:\n            continue\n\n        Name = split_text[2]\n        if (len(split_text) < 4):\n            # This sometimes happens if the host doesn't have the entry\n            EntryName = \"<None>\"\n        else:\n            EntryName = split_text[3]\n\n        if Name in DefinitionRenameDict:\n            Name = DefinitionRenameDict[Name]\n\n        Def = SyscallDefinition(Arch, Num, ABI, Name, EntryName)\n\n        Defs.append(Def)\n        if not Name in SyscallDefinitions:\n            SyscallDefinitions[Name] = []\n\n        SyscallDefinitions[Name].append(Def)\n\ndef ParseCommonArchSyscalls(Defs, DefsDict, Arch, FilePath):\n    global NumArches\n    global SyscallDefinitions\n    syscall_file = open(FilePath, \"r\")\n    text_lines = syscall_file.readlines()\n    syscall_file.close()\n\n    NumArches += 1\n    SyscallNumbers = {}\n    for line in text_lines:\n        line = line.strip()\n\n        if len(line) == 0:\n            continue\n\n        # Check for NR defines\n        if (line.startswith(\"#define __NR_\") or\n           line.startswith(\"#define __NR3264_\")):\n            # This line is defining a syscall for us\n            # eg: #define __NR_io_setup 0\n            line = line.removeprefix(\"#define __NR_\")\n            line = line.removeprefix(\"#define __NR3264_\")\n            split_text = line.split(\" \")\n\n            # Store this for later\n            Name = split_text[0]\n\n            # Need to do len here since some lines are multiple spaces between define name and value\n            SyscallNumbers[Name] = split_text[len(split_text) - 1]\n            continue\n\n        BeginsString = \"\"\n        # Check for __SC_COMP and __SYSCALL defines\n        if line.startswith(\"__SYSCALL(\"):\n            BeginsString = \"__SYSCALL(\"\n        elif line.startswith(\"__SC_COMP(\"):\n            BeginsString = \"__SC_COMP(\"\n        elif line.startswith(\"__SC_3264(\"):\n            BeginsString = \"__SC_3264(\"\n        elif line.startswith(\"__SC_COMP_3264(\"):\n            BeginsString = \"__SC_COMP_3264(\"\n        else:\n            continue\n\n        line = line.removeprefix(BeginsString)\n\n        if line.startswith(\"__NR_\"):\n            BeginsString = \"__NR_\"\n        elif line.startswith(\"__NR3264_\"):\n            BeginsString = \"__NR3264_\"\n\n        line = line.removeprefix(BeginsString)\n\n        split_text = line.split(\",\")\n\n        Name = split_text[0]\n        Num = SyscallNumbers[Name]\n        ABI = Arch\n        EntryName = split_text[1].strip().split(\")\")[0]\n\n        if Name in DefinitionRenameDict:\n            Name = DefinitionRenameDict[Name]\n\n        Def = SyscallDefinition(Arch, Num, ABI, Name, EntryName)\n\n        Defs.append(Def)\n        if not Name in SyscallDefinitions:\n            SyscallDefinitions[Name] = []\n\n        SyscallDefinitions[Name].append(Def)\n\ndef ExportSyscallDefines(Defs, DefsDict, Arch, UnsupportedDefs):\n    AlreadyExported = []\n\n    print(\"enum Syscalls_{} {{\".format(Arch))\n    for Def in Defs:\n        if Def.EntryName == \"<None>\":\n            print(\"  // No entrypoint. -ENOSYS\")\n        print(\"  SYSCALL_{}_{} = {},\".format(Arch, Def.Name, Def.Number))\n        AlreadyExported.append(Def.Name)\n\n    # Print ourselves a max\n    Max = 1 << (int(math.log(len(Defs), 2)) + 1)\n    print(\"  SYSCALL_{}_MAX = {},\".format(Arch, Max))\n\n    if len(UnsupportedDefs) != 0:\n        # Print out syscalls that don't exist on this architecture\n        print(\"\")\n        print(\"  // Unsupported syscalls on this host\")\n\n        for DefList in UnsupportedDefs:\n            for Def in DefList:\n                # If the syscall name exists in the full definition dictionary\n                # but DOESN'T exist in our current arch AND exists in the Unsupported dicts\n                # Then we need to export it as an unnamed syscall entry\n                if Def.Name in AlreadyExported:\n                    continue\n\n                print(\"  SYSCALL_{}_{} = ~0,\".format(Arch, Def.Name))\n\n                AlreadyExported.append(Def.name)\n\n    print(\"};\")\n\ndef ExportCommonSyscallDefines():\n    global Definitions_Arm64\n    global SyscallDefinitions\n\n    print(\"enum FEX_Syscalls_Common {\")\n    for Def in Definitions_Arm64:\n        # Check the dict to ensure the definitions exist everywhere\n        if not Def.Name in SyscallDefinitions:\n            continue\n\n        Defs = SyscallDefinitions[Def.Name]\n        if len(Defs) != NumArches:\n            continue\n\n        Number = Def.Number\n        Matches = True\n        for AllDef in Defs:\n            if AllDef.Number != Def.Number:\n                Matches = False\n\n        if not Matches:\n            continue\n\n        for AllDef in Defs:\n            if AllDef.EntryName == \"<None>\":\n                print(\"  // {} No entrypoint. -ENOSYS\".format(AllDef.Arch))\n\n        print(\"  SYS_{} = {},\".format(Def.Name, Def.Number))\n\n\n    # Find a max between all architectures\n    Maximums = []\n    for Defs in [Definitions_x64, Definitions_x86, Definitions_Arm64]:\n        Maximums.append(1 << (int(math.log(len(Defs), 2)) + 1))\n    print(\"  SYSCALL_MAX = {},\".format(max(Maximums)))\n\n    print(\"};\")\n\n\ndef main():\n    if sys.version_info[0] < 3:\n        logging.critical (\"Python 3 or a more recent version is required.\")\n\n    if (len(sys.argv) < 2):\n        print (\"usage: %s <Linux git tree>\" % (sys.argv[0]))\n\n    LinuxPath = sys.argv[1]\n\n\n    ParseArchSyscalls(Definitions_x86, Definitions_x86_dict, \"x86\", LinuxPath + Syscallx86File, [])\n    ParseArchSyscalls(Definitions_x64, Definitions_x64_dict, \"x64\", LinuxPath + Syscallx64File, [\"x32\"])\n    ParseCommonArchSyscalls(Definitions_Arm64, Definitions_Arm64_dict, \"Arm64\", LinuxPath + SyscallArm64File)\n\n    ExportSyscallDefines(Definitions_x86, Definitions_x86_dict, \"x86\",[])\n    ExportSyscallDefines(Definitions_x64, Definitions_x64_dict, \"x64\", [Definitions_x86])\n    ExportSyscallDefines(Definitions_Arm64, Definitions_Arm64_dict, \"Arm64\", [Definitions_x86, Definitions_x64])\n\n    ExportCommonSyscallDefines()\n\nif __name__ == \"__main__\":\n    # execute only if run as a script\n    sys.exit(main())\n"
  },
  {
    "path": "Scripts/InstallFEX.py",
    "content": "#!/usr/bin/python3\nimport os\nimport subprocess\nimport platform\nimport sys\nimport re\n\ntry:\n    from packaging.version import Version as version_check\nexcept:\n    from pkg_resources import parse_version as version_check\n\n_Arch = None\ndef GetArch():\n    global _Arch\n\n    if _Arch == None:\n        _Arch = subprocess.check_output(['uname', '-m']).decode(\"utf-8\").strip()\n    return _Arch\n\n_Distro = None\ndef GetDistro():\n    global _Distro\n\n    # Query files in order\n    # /etc/lsb-release\n    # /etc/os-release\n\n    if _Distro == None:\n        if os.path.exists(\"/etc/lsb-release\"):\n            File = open(\"/etc/lsb-release\", \"r\")\n            Lines = File.readlines()\n            File.close()\n\n            Found = 0\n            Distro = \"\"\n            Version = \"\"\n            for Line in Lines:\n                Key, Val = Line.split(\"=\", 1)\n\n                if Key == \"DISTRIB_ID\":\n                    Distro = Val.strip().lower()\n                    Found+=1\n                if Key == \"DISTRIB_RELEASE\":\n                    Version = Val.strip()\n                    Found+=1\n\n            if Found == 2:\n                _Distro = [Distro, Version]\n                return _Distro\n\n        if os.path.exists(\"/etc/os-release\"):\n            File = open(\"/etc/os-release\", \"r\")\n            Lines = File.readlines()\n            File.close()\n\n            Found = 0\n            Distro = \"\"\n            Version = \"\"\n            for Line in Lines:\n                Key, Val = Line.split(\"=\", 1)\n\n                if Key == \"ID\":\n                    Distro = Val.strip()\n                    Found+=1\n                if Key == \"VERSION_ID\":\n                    # Strip the double quotes from the version id\n                    Version = Val.strip()[1:-1]\n                    Found+=1\n\n            if Found == 2:\n                _Distro = [Distro, Version]\n                return _Distro\n\n        # Unknown\n        _Distro = [\"Unknown\", \"0.0\"]\n\n    return _Distro\n\ndef IsSupportedArch():\n    Arch = GetArch()\n    return Arch == \"aarch64\"\n\ndef IsSupportedDistro():\n    Distro = GetDistro()\n\n    # We only support Ubuntu\n    if Distro[0] == \"ubuntu\":\n        return Distro[1] in {\"22.04\", \"24.04\", \"24.10\", \"25.04\", \"25.10\"}\n\n    return False\n\n_ArchVersion = None\ndef ListContainsRequired(Features, RequiredFeatures):\n    for Req in RequiredFeatures:\n        if not Req in Features:\n            return False\n    return True\n\ndef GetCPUFeaturesVersion():\n    global _ArchVersion\n\n    # Also LOR but kernel doesn't expose this\n    v8_1Mandatory = [\"atomics\", \"asimdrdm\", \"crc32\"]\n    v8_2Mandatory = v8_1Mandatory + [\"dcpop\"]\n    v8_3Mandatory = v8_2Mandatory + [\"fcma\", \"jscvt\", \"lrcpc\", \"paca\", \"pacg\"]\n    v8_4Mandatory = v8_3Mandatory + [\"asimddp\", \"flagm\", \"ilrcpc\", \"uscat\"]\n\n    #  fphp asimdhp asimddp\n\n    if _ArchVersion == None:\n        File = open(\"/proc/cpuinfo\", \"r\")\n        Lines = File.readlines()\n        File.close()\n\n        # Minimum spec is ARMv8.0\n        _ArchVersion = \"8.0\"\n        for Line in Lines:\n            if \"Features\" in Line:\n                Features = Line.split(\":\")[1].strip().split(\" \")\n\n                # We don't care beyond 8.4 right now\n                if ListContainsRequired(Features, v8_4Mandatory):\n                    _ArchVersion = \"8.4\"\n                elif ListContainsRequired(Features, v8_3Mandatory):\n                    _ArchVersion = \"8.3\"\n                elif ListContainsRequired(Features, v8_2Mandatory):\n                    _ArchVersion = \"8.2\"\n                elif ListContainsRequired(Features, v8_1Mandatory):\n                    _ArchVersion = \"8.1\"\n                break;\n\n    return _ArchVersion\n\n_PPAInstalled = None\nFEXPPA_REGEX = r\".*\\/fex-emu\\/fex\\/ubuntu$\"\n\ndef GetPPAStatus():\n    global _PPAInstalled\n\n    if _PPAInstalled == None:\n        _PPAInstalled = False\n\n        CacheResults = subprocess.check_output(['apt-cache', 'policy']).decode(\"utf-8\")\n\n        for Line in CacheResults.split(\"\\n\"):\n            if \"http\" in Line:\n                Line = Line.strip()\n                LineSplit = Line.split(\" \")\n\n                # 'status' 'URL' 'series' 'arch' 'type'\n                if re.match(FEXPPA_REGEX, LineSplit[1]):\n                    _PPAInstalled = True\n                    break\n\n    return _PPAInstalled\n\ndef InstallPPA():\n    print (\"Installing PPA: ppa:fex-emu/fex\")\n    print (\"This bit will ask for your password\")\n\n    DidInstall = False\n    try:\n        CmdResult = subprocess.run([\"sudo\", \"add-apt-repository\", \"-y\", \"ppa:fex-emu/fex\"])\n        DidInstall = CmdResult.returncode == 0\n    except KeyboardInterrupt:\n        DidInstall = False\n        pass\n\n    if DidInstall:\n        print(\"PPA installed\")\n    else:\n        print(\"PPA failed to install\")\n\n    return DidInstall\n\nARMVersionToPackage = {\n    \"8.0\": \"fex-emu-armv8.0\",\n    \"8.1\": \"fex-emu-armv8.0\",\n    \"8.2\": \"fex-emu-armv8.2\",\n    \"8.3\": \"fex-emu-armv8.2\",\n    \"8.4\": \"fex-emu-armv8.4\",\n}\n\ndef GetPackagesToInstall():\n    return [\n        ARMVersionToPackage[GetCPUFeaturesVersion()],\n        \"fex-emu-binfmt32\",\n        \"fex-emu-binfmt64\",\n    ]\n\ndef UpdatePPA():\n    print (\"Updating apt sources\")\n    print (\"This bit will ask for your password\")\n\n    DidUpdate = False\n    try:\n        CmdResult = subprocess.run([\"sudo\", \"apt-get\", \"update\"])\n        DidUpdate = CmdResult.returncode == 0\n    except KeyboardInterrupt:\n        DidUpdate = False\n        pass\n\n    if DidUpdate:\n        print(\"PPA installed\")\n    else:\n        print(\"PPA failed to install\")\n\n    return DidUpdate\n\ndef InstallPackages(PackagesToInstall):\n    DidInstall = False\n    try:\n        CmdResult = subprocess.run([\"sudo\", \"apt-get\", \"-y\", \"install\"] + PackagesToInstall)\n        DidInstall = CmdResult.returncode == 0\n    except KeyboardInterrupt:\n        print (\"Keyboard interrupt\")\n        DidInstall = False\n        pass\n\n    if DidInstall:\n        print(\"Packages updated\")\n    else:\n        print(\"Packages failed to update\")\n\n    return DidInstall\n\ndef CheckAndInstallPackageUpdates(PackagesToInstall, InstallIfNotFound=False):\n    for Package in PackagesToInstall[:]:\n        UpgradableStatus = subprocess.check_output([\"apt\", \"list\", \"--upgradable\", Package], stderr=None).decode(\"utf-8\")\n        Found = False\n        for Line in UpgradableStatus.split(\"\\n\"):\n            # If the package exists to be upgraded then it will appear in this list\n            # We need to check multiple lines\n            # $ apt list --upgradable <Package>\n            # With upgrade available\n            # Listing... Done\n            # <Package>/<Repo> <NewVersion> <arch> [upgradable from: <Installed version>]\n            # Without upgrade available\n            # Listing... Done\n            # <EOF>\n            if Package in Line and \"upgradable\" in Line:\n                Found = True\n\n        if InstallIfNotFound == False and Found == False:\n            PackagesToInstall.remove(Package)\n\n    if len(PackagesToInstall) > 0:\n        print (\"Found updates for packages: {}\".format(PackagesToInstall))\n        print (\"This bit may ask for your password\")\n\n        return InstallPackages(PackagesToInstall)\n\n    return True\n\ndef CheckPackageInstallStatus():\n    PackagesToInstall = GetPackagesToInstall()\n    for Package in PackagesToInstall[:]:\n        CmdResult = subprocess.run([\"dpkg\", \"-s\", Package], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)\n        if CmdResult.returncode == 0:\n            PackagesToInstall.remove(Package)\n\n    return PackagesToInstall\n\ndef InstallPackages(Packages):\n    print(\"Installing packages: {}\".format(Packages))\n\n    DidInstall = False\n    try:\n        CmdResult = subprocess.run([\"sudo\", \"apt-get\", \"-y\", \"install\"] + Packages)\n        DidInstall = CmdResult.returncode == 0\n    except KeyboardInterrupt:\n        print (\"Keyboard interrupt\")\n        DidInstall = False\n        pass\n\n    if DidInstall:\n        print(\"Packages installed\")\n    else:\n        print(\"Packages failed to install\")\n\n    return DidInstall\n\n_RootFSPath = None\ndef GetRootFSPath():\n    global _RootFSPath\n\n    if _RootFSPath == None:\n        # Follows the same logic as FEXCore::Config::GetDataDirectory()\n        HomeDir = os.getenv(\"HOME\")\n        if HomeDir == None:\n            HomeDir = os.getenv(\"PWD\")\n        if HomeDir == None:\n            HomeDir = \".\"\n\n        Path = HomeDir + \"/.local/share\"\n        DataXDG = os.getenv(\"XDG_DATA_HOME\")\n        if DataXDG != None:\n            Path = DataXDG\n\n        Path = Path + \"/fex-emu\"\n\n        DataOverride = os.getenv(\"FEX_APP_DATA_LOCATION\")\n\n        if DataOverride != None:\n            Path = DataOverride\n\n        LegacyDir = HomeDir + \"/.fex-emu\"\n        if os.path.isdir(LegacyDir):\n            Path = LegacyDir\n\n        _RootFSPath = Path + \"/RootFS/\"\n\n    return _RootFSPath\n\ndef CheckRootFSInstallStatus():\n    Distro = GetDistro()[1] # Extract Ubuntu version number, e.g. \"23.10\"\n\n    DistroUnderscore = Distro.replace(\".\", \"_\")\n    Filename = \"Ubuntu_{}.ero\".format(DistroUnderscore)\n    if os.path.exists(GetRootFSPath() + Filename):\n            return True\n\n    Filename = \"Ubuntu_{}.sqsh\".format(DistroUnderscore)\n    if os.path.exists(GetRootFSPath() + Filename):\n            return True\n\n    # Couldn't find. Either no rootfs installed or unsupported distro.\n    return False\n\ndef TryInstallRootFS():\n    DidInstall = False\n    try:\n        with open(\"/dev/tty\", \"r\") as tty:\n            CmdResult = subprocess.run([\"FEXRootFSFetcher\"], stdin=tty)\n        DidInstall = CmdResult.returncode == 0\n    except KeyboardInterrupt:\n        print (\"Keyboard interrupt\")\n        DidInstall = False\n        pass\n    except OSError:\n        print (\"No TTY available\")\n        DidInstall = False\n        pass\n    return DidInstall\n\ndef TryBasicProgramExecution():\n    CmdResult = subprocess.run([\"FEX\", \"/usr/bin/uname\", \"-a\"])\n    return CmdResult.returncode == 0\n\ndef ExitWithStatus(Status):\n    # Remove the cached credentials\n    subprocess.run([\"sudo\", \"-K\"])\n    sys.exit(Status)\n\ndef GetKernelVersion():\n    # eg: `6.14.4-061404-generic`\n    return platform.uname().release.split(\"-\")[0]\n\ndef IsSupportedKernel():\n    return version_check(GetKernelVersion()) >= version_check(\"5.15\")\n\ndef main():\n    # Only run on supported arch\n    if not IsSupportedArch():\n        print ( \"{} is not a supported architecture\".format(GetArch()))\n        ExitWithStatus(-1)\n\n    # Only run on a new enough kernel\n    if not IsSupportedKernel():\n        print ( \"Kernel {} is too old. FEX needs 5.15 minimum\".format(GetKernelVersion()))\n        ExitWithStatus(-1)\n\n    if not IsSupportedDistro():\n        Distro = GetDistro()\n        print ( \"'{} {}' is not a supported distro\".format(Distro[0], Distro[1]))\n        ExitWithStatus(-1)\n\n    if GetDistro()[0] == \"ubuntu\":\n        print (\"Getting PPA status: {}\".format((\"NotInstalled\", \"Installed\")[GetPPAStatus()]))\n\n        if GetPPAStatus():\n            if not UpdatePPA():\n                print (\"apt sources failed to update. Not continuing\")\n                ExitWithStatus(-1)\n            if not CheckAndInstallPackageUpdates(GetPackagesToInstall()):\n                print (\"apt packages failed to update. Not continuing\")\n                ExitWithStatus(-1)\n        else:\n            if not CheckAndInstallPackageUpdates([\"software-properties-common\"], True):\n                print (\"software-properties-common package failed to update. Not continuing\")\n                ExitWithStatus(-1)\n\n            if not InstallPPA():\n                print (\"PPA failed to install. Not continuing\")\n                ExitWithStatus(-1)\n\n        Packages = CheckPackageInstallStatus()\n        if len(Packages) > 0:\n            if not InstallPackages(Packages):\n                print (\"Failed to install packages. Not continuing\")\n                ExitWithStatus(-1)\n\n        if not CheckRootFSInstallStatus():\n            print (\"RootFS not found. Running FEXRootFSFetcher to get rootfs\")\n            if not TryInstallRootFS():\n                print (\"Failed to install RootFS. Not continuing\")\n                ExitWithStatus(-1)\n\n    print (\"FEX is now installed. Trying basic program run\")\n    if not TryBasicProgramExecution():\n        print (\"FEX failed to run. Not continuing\")\n        ExitWithStatus(-1)\n\n    print (\"\")\n    print (\"===================================================\")\n    print (\"FEX test run executed. You should be set to run FEX\")\n    print (\"===================================================\")\n    print (\"Usage examples:\")\n    print (\"# steam is a bash script. Wrap with FEXBash\")\n    print (\"\\tFEXBash steam\")\n    print (\"# Full path execution execution will wrap the application if it exists in the rootfs\")\n    print (\"\\tFEX /usr/bin/uname\")\n    print (\"# Freestanding x86/x86-64 programs can be executed directly. binfmt_misc will redirect to FEX\")\n    print (\"\\t$HOME/PetalCrashOnline.AppImage\")\n    print (\"# If you need a terminal that emulates everything.\")\n    print (\"# Run FEXBash without arguments. Double check uname to see if running under FEX\")\n    print (\"\\tFEXBash\")\n\n    ExitWithStatus(0)\n\nif __name__ == \"__main__\":\n    sys.exit(main())\n"
  },
  {
    "path": "Scripts/InstructionCountParser.py",
    "content": "#!/usr/bin/python3\nimport base64\nfrom dataclasses import dataclass\nfrom enum import Flag\nimport json\nimport struct\nimport sys\nimport subprocess\nimport os\nimport logging\nlogger = logging.getLogger()\nlogger.setLevel(logging.ERROR)\n\n@dataclass\nclass TestData:\n    name: str\n    expectedinstructioncount: int\n    code: bytes\n    instructions: list\n    def __init__(self, Name, ExpectedInstructionCount, Code, Instructions):\n        self.name = Name\n        self.expectedinstructioncount = ExpectedInstructionCount\n        self.code = Code\n        self.instructions = Instructions\n\n    @property\n    def Name(self):\n        return self.name\n\n    @property\n    def ExpectedInstructionCount(self):\n        return self.expectedinstructioncount\n\n    @property\n    def Code(self):\n        return self.code\n\n    @property\n    def Instructions(self):\n        return self.instructions\n\nTestDataMap = {}\nclass HostFeatures(Flag) :\n    FEATURE_ANY    = 0\n    FEATURE_SVE128 = (1 << 0)\n    FEATURE_SVE256 = (1 << 1)\n    FEATURE_CLZERO = (1 << 2)\n    FEATURE_RNG    = (1 << 3)\n    FEATURE_FCMA   = (1 << 4)\n    FEATURE_CSSC   = (1 << 5)\n    FEATURE_AFP    = (1 << 6)\n    FEATURE_RPRES  = (1 << 7)\n    FEATURE_FLAGM  = (1 << 8)\n    FEATURE_FLAGM2 = (1 << 9)\n    FEATURE_CRYPTO = (1 << 10)\n    FEATURE_AES256 = (1 << 11)\n    FEATURE_SVEBITPERM = (1 << 12)\n    FEATURE_TSO    = (1 << 13)\n    FEATURE_LRCPC  = (1 << 14)\n    FEATURE_LRCPC2 = (1 << 15)\n    FEATURE_FRINTTS = (1 << 16)\n    FEATURE_MOPS   = (1 << 17)\n\nHostFeaturesLookup = {\n    \"SVE128\"  : HostFeatures.FEATURE_SVE128,\n    \"SVE256\"  : HostFeatures.FEATURE_SVE256,\n    \"CLZERO\"  : HostFeatures.FEATURE_CLZERO,\n    \"RNG\"     : HostFeatures.FEATURE_RNG,\n    \"FCMA\"    : HostFeatures.FEATURE_FCMA,\n    \"CSSC\"    : HostFeatures.FEATURE_CSSC,\n    \"AFP\"     : HostFeatures.FEATURE_AFP,\n    \"RPRES\"   : HostFeatures.FEATURE_RPRES,\n    \"FLAGM\"   : HostFeatures.FEATURE_FLAGM,\n    \"FLAGM2\"  : HostFeatures.FEATURE_FLAGM2,\n    \"CRYPTO\"  : HostFeatures.FEATURE_CRYPTO,\n    \"AES256\"  : HostFeatures.FEATURE_AES256,\n    \"SVEBITPERM\" : HostFeatures.FEATURE_SVEBITPERM,\n    \"TSO\" : HostFeatures.FEATURE_TSO,\n    \"LRCPC\" : HostFeatures.FEATURE_LRCPC,\n    \"LRCPC2\" : HostFeatures.FEATURE_LRCPC2,\n    \"FRINTTS\" : HostFeatures.FEATURE_FRINTTS,\n    \"MOPS\"    : HostFeatures.FEATURE_MOPS,\n}\n\ndef GetHostFeatures(data):\n    HostFeaturesData = HostFeatures.FEATURE_ANY\n    if not (type(data) is list):\n        sys.exit(\"Features value must be list of features\")\n\n    for data_key in data:\n        data_key = data_key.upper()\n        if not (data_key in HostFeaturesLookup):\n            sys.exit(\"Invalid host feature\")\n\n        HostFeaturesData |= HostFeaturesLookup[data_key]\n    return HostFeaturesData\n\ndef parse_json_data(json_filepath, json_filename, json_data, output_binary_path):\n    Bitness = 64\n    EnabledHostFeatures = HostFeatures.FEATURE_ANY\n    DisabledHostFeatures = HostFeatures.FEATURE_ANY\n    OptionEnvironmentVariables = {}\n\n    if \"Features\" in json_data:\n        items = json_data[\"Features\"]\n        if (\"Bitness\" in items):\n            Bitness = int(items[\"Bitness\"])\n\n        if (\"EnabledHostFeatures\" in items):\n            EnabledHostFeatures = GetHostFeatures(items[\"EnabledHostFeatures\"])\n\n        if (\"DisabledHostFeatures\" in items):\n            DisabledHostFeatures = GetHostFeatures(items[\"DisabledHostFeatures\"])\n\n        if (\"Env\" in items):\n            data = items[\"Env\"]\n            if not (type(data) is dict):\n                sys.exit(\"Environment variables value must be list of key:value pairs\")\n\n            for data_key, data_val in data.items():\n                OptionEnvironmentVariables[data_key] = data_val\n\n    for key, items in json_data[\"Instructions\"].items():\n        ExpectedInstructionCount = 0\n        Instructions = []\n        if (\"ExpectedInstructionCount\" in items):\n            ExpectedInstructionCount = int(items[\"ExpectedInstructionCount\"])\n\n        if (\"Skip\" in items):\n                if items[\"Skip\"].upper() == \"YES\":\n                    continue\n\n        if \"x86Insts\" in items:\n            Instructions = items[\"x86Insts\"]\n        else:\n            # No list of instructions, only one which is the key.\n            Instructions.append(key)\n        TestName = base64.b64encode(\"{}.{}.{}\".format(str(hash(json_filepath)), json_filename, key).encode(\"ascii\")).decode(\"ascii\")\n        tmp_asm = \"/tmp/{}.asm\".format(TestName)\n        tmp_asm_out = \"/tmp/{}.asm.o\".format(TestName)\n        logging.info(\"'{}' -> '{}' -> '{}'\".format(key, tmp_asm, tmp_asm_out))\n\n        if TestName in TestDataMap:\n            sys.exit(\"Duplicate test name {} in tests\".format(TestName))\n\n        with open(tmp_asm, \"w\") as tmp_asm_file:\n            tmp_asm_file.write(\"BITS {};\\n\".format(Bitness))\n            for Inst in Instructions:\n                tmp_asm_file.write(\"{}\\n\".format(Inst))\n\n        Process = subprocess.Popen([\"nasm\", tmp_asm, \"-o\", tmp_asm_out])\n        Process.wait()\n        ResultCode = Process.returncode\n\n        if ResultCode != 0:\n            os.remove(tmp_asm)\n            logging.error(\"Nasm failed to execute\")\n            logging.error(\"Couldn't compile: '{}'\".format(key))\n            return ResultCode\n\n        if not os.path.exists(tmp_asm_out):\n            logging.error(\"Nasm didn't emit code?\")\n            os.remove(tmp_asm)\n            return 1\n\n        logging.info(\"Generated asm file\")\n\n        with open(tmp_asm_out, \"rb\") as tmp_asm_out_file:\n            binary_hex = tmp_asm_out_file.read()\n\n        TestDataMap[TestName] = TestData(key, ExpectedInstructionCount, binary_hex, Instructions)\n\n        os.remove(tmp_asm)\n        os.remove(tmp_asm_out)\n\n        # Output the test data as follows\n        # struct TestInfo;\n        # struct DataHeader {\n        #   uint64_t Bitness;\n        #   uint64_t NumTests;\n        #   uint64_t EnabledHostFeatures;\n        #   uint64_t DisabledHostFeatures;\n        #   uint64_t EnvironmentVariableCount;\n        #   char env[];\n        #   TestInfo Tests[NumTests];\n        # };\n        # struct TestInfo {\n        #   char InstName[128];\n        #   int64_t ExpectedInstructionCount;\n        #   uint64_t CodeSize;\n        #   uint64_t x86InstCount;\n        #   uint32_t Cookie;\n        #   uint8_t Code[CodeSize];\n        # };\n\n    MemData = bytes()\n\n    # Add the header\n    MemData += struct.pack('Q', Bitness)\n    MemData += struct.pack('Q', len(TestDataMap))\n    MemData += struct.pack('Q', EnabledHostFeatures.value)\n    MemData += struct.pack('Q', DisabledHostFeatures.value)\n    MemData += struct.pack('Q', len(OptionEnvironmentVariables.items()))\n\n    # Write environment variables\n    for key, val in OptionEnvironmentVariables.items():\n        MemData += key.encode()\n        MemData += struct.pack('B', 0)\n        MemData += val.encode()\n        MemData += struct.pack('B', 0)\n\n    # Add each test\n    for key, item in TestDataMap.items():\n        MemData += struct.pack('128s', item.Name.encode(\"ascii\"))\n        MemData += struct.pack('q', item.ExpectedInstructionCount)\n        MemData += struct.pack('Q', len(item.Code))\n        MemData += struct.pack('Q', len(item.Instructions))\n        MemData += struct.pack('I', 0x41424344)\n        MemData += item.Code\n\n    logging.info(\"Code goign to {}\".format(output_binary_path))\n    with open(output_binary_path, \"wb\") as output_binary_file:\n        output_binary_file.write(MemData)\n\n    return 0\n\ndef main():\n    if sys.version_info[0] < 3:\n        logging.critical (\"Python 3 or a more recent version is required.\")\n\n    if (len(sys.argv) < 3):\n        logging.critical (\"usage: %s <PerformanceTests.json> <output_folder>\" % (sys.argv[0]))\n\n    json_path = sys.argv[1]\n    output_binary_path = sys.argv[2]\n\n    try:\n        with open(json_path) as json_file:\n            json_text = json_file.read()\n    except IOError:\n        logging.error(\"IOError!\")\n        return 1\n\n    try:\n        json_data = json.loads(json_text)\n        if not isinstance(json_data, dict):\n            raise TypeError('JSON data must be a dict')\n\n        return parse_json_data(json_path, os.path.basename(json_path), json_data, output_binary_path)\n\n    except ValueError as ve:\n        logging.error(f'JSON error: {ve}')\n\n        return 1\n\n    return 0\n\nif __name__ == \"__main__\":\n    # execute only if run as a script\n    sys.exit(main())\n"
  },
  {
    "path": "Scripts/NeedDisabledSVE.py",
    "content": "#!/usr/bin/python3\n\n# Qualcomm in their infinite wisdom decided to disable SVE in a handful of SoCs.\n# When compiling for a specific CPU architecture or `-mcpu=native`, we need to ensure\n# that SVE is disabled on these platforms that had the feature disabled.\n# Check for the handful of Cortex CPUs that support SVE in hardware, but are disabled\n# in software.\nimport re\nimport sys\n\ndef GetCPUFeatures():\n    File = open(\"/proc/cpuinfo\", \"r\")\n    Lines = File.readlines()\n    File.close()\n\n    for Line in Lines:\n        if \"Features\" in Line:\n            Features = Line.split(\":\")[1].strip().split(\" \")\n            return Features\n\nSnapdragonIDsWithDisabledSVE = {\n    # Snapdragon 8 Gen 3\n    tuple([0x41, 0xd82]): True, # Cortex-X4\n    tuple([0x41, 0xd81]): True, # Cortex-A720\n    tuple([0x41, 0xd80]): True, # Cortex-A520\n\n    # Snapdragon 8 Gen 2\n    tuple([0x41, 0xd4e]): True, # Cortex-X3\n    tuple([0x41, 0xd4d]): True, # Cortex-A715\n    tuple([0x41, 0xd47]): True, # Cortex-A710\n    tuple([0x41, 0xd46]): True, # Cortex-A510\n\n    # Snapdragon 8 Gen 1\n    tuple([0x41, 0xd48]): True, # Cortex-X2\n    # A710\n    # A510\n}\n\ndef IsAffectedSnapdragon():\n    cpuinfo = []\n\n    with open(\"/proc/cpuinfo\") as cpuinfo_file:\n        current_implementer = 0\n        current_part = 0\n        for line in cpuinfo_file:\n            line = line.strip()\n            if \"CPU implementer\" in line:\n                current_implementer = int(re.findall(r'0x[0-9A-F]+', line, re.I)[0], 16)\n            if \"CPU part\" in line:\n                current_part = int(re.findall(r'0x[0-9A-F]+', line, re.I)[0], 16)\n                cpuinfo += {tuple([current_implementer, current_part])}\n\n    for core in cpuinfo:\n        if SnapdragonIDsWithDisabledSVE.get(core):\n            return True\n\n    return False\n\n\ndef main():\n    Features = GetCPUFeatures()\n\n    # If SVE is reported from cpuinfo just return.\n    if \"sve\" in Features:\n        return 0\n\n    if IsAffectedSnapdragon():\n        return 1\n\n    return 0\n\nif __name__ == \"__main__\":\n    sys.exit(main())\n"
  },
  {
    "path": "Scripts/StructPackVerifier.py",
    "content": "#!/usr/bin/python3\nimport clang.cindex\nfrom clang.cindex import CursorKind\nfrom clang.cindex import TypeKind\nfrom clang.cindex import TranslationUnit\nimport sys\nfrom dataclasses import dataclass\nimport subprocess\nimport logging\nlogger = logging.getLogger()\nlogger.setLevel(logging.WARNING)\n\n# These defines are temporarily defined since python3-clang doesn't yet support these.\n# Once this tool gets switched over to C++ then this won't be an issue.\n# Type definitions redeclared from `clang/include/clang-c/Index.h`\n\n# Expression that references a C++20 concept.\nCursorKind.CONCEPTSPECIALIZATIONEXPR = CursorKind(153),\n\n# Expression that references a C++20 concept.\nCursorKind.REQUIRESEXPR = CursorKind(154),\n\n# C++2a std::bit_cast expression.\nCursorKind.BUILTINBITCASTEXPR = CursorKind(280)\n\ntry:\n    # a concept declaration.\n    CursorKind.CONCEPTDECL = CursorKind(604),\nexcept:\n    pass\n\n@dataclass\nclass TypeDefinition:\n    TYPE_UNKNOWN = 0\n    TYPE_STRUCT = 1\n    TYPE_UNION = 2\n    TYPE_FIELD = 3\n    TYPE_VARDECL = 4\n\n    name: str\n    type: int\n    def __init__(self, Name, Type):\n        self.name = Name\n        self.type = Type\n\n    @property\n    def Name(self):\n        return self.name\n    @property\n    def Type(self):\n        return self.type\n\n@dataclass\nclass AliasType:\n    ALIAS_X86_32  = 0\n    ALIAS_X86_64  = 1\n    ALIAS_AARCH64 = 2\n    ALIAS_WIN32   = 3\n    ALIAS_WIN64   = 4\n    Name: str\n    AliasType: int\n    def __init__(self, Name, Type):\n        self.Name = Name\n        self.AliasType = Type\n\n@dataclass\nclass StructDefinition(TypeDefinition):\n    Size: int\n    Aliases: list\n    Members: list\n    ExpectFEXMatch: bool\n\n    def __init__(self, Name, Size):\n        super(StructDefinition, self).__init__(Name, TypeDefinition.TYPE_STRUCT)\n        self.Size = Size\n        self.Aliases = []\n        self.Members = []\n        self.ExpectFEXMatch = False\n\n@dataclass\nclass UnionDefinition(TypeDefinition):\n    Size: int\n    Aliases: list\n    Members: list\n    ExpectFEXMatch: bool\n\n    def __init__(self, Name, Size):\n        super(UnionDefinition, self).__init__(Name, TypeDefinition.TYPE_UNION)\n        self.Size = Size\n        self.Aliases = []\n        self.Members = []\n        self.ExpectFEXMatch = False\n\n@dataclass\nclass FieldDefinition(TypeDefinition):\n    Size: int\n    OffsetOf: int\n    Alignment: int\n    def __init__(self, Name, Size, OffsetOf, Alignment):\n        super(FieldDefinition, self).__init__(Name, TypeDefinition.TYPE_FIELD)\n        self.Size = Size\n        self.OffsetOf = OffsetOf\n        self.Alignment = Alignment\n\n@dataclass\nclass VarDeclDefinition(TypeDefinition):\n    Size: int\n    Aliases: list\n    ExpectFEXMatch: bool\n    Value: str\n\n    def __init__(self, Name, Size):\n        super(VarDeclDefinition, self).__init__(Name, TypeDefinition.TYPE_VARDECL)\n        self.Size = Size\n        self.Aliases = []\n        self.ExpectFEXMatch = False\n\n@dataclass\nclass ArchDB:\n    Parsed: bool\n    ArchName: str\n    NamespaceScope: list\n    CurrentNamespace: str\n    TU: TranslationUnit\n    Structs: dict\n    Unions: dict\n    VarDecls: dict\n    FieldDecls: list\n    def __init__(self, ArchName):\n        self.Parsed = True\n        self.ArchName = ArchName\n        self.NamespaceScope = []\n        self.CurrentNamespace = \"\"\n        self.TU = None\n        self.Structs = {}\n        self.Unions = {}\n        self.VarDecls = {}\n        self.FieldDecls = []\n\nclass DBList:\n    DBs: list\n    def __init__(self, DB32, DB64, DBAArch64, DBWin32, DBWin64):\n        self.DBs = [DB32, DB64, DBAArch64, DBWin32, DBWin64]\n\ndef FindClangArguments(OriginalArguments):\n    AddedArguments = [\"clang\"]\n    AddedArguments.extend(OriginalArguments)\n    AddedArguments.extend([\"-v\", \"-x\", \"c++\", \"-S\", \"-\"])\n    Proc = subprocess.Popen(AddedArguments, stderr = subprocess.PIPE, stdin = subprocess.DEVNULL)\n    NewIncludes = []\n    BeginSearch = False\n    while True:\n        Line = Proc.stderr.readline().strip()\n\n        if not Line:\n            Proc.terminate()\n            break\n\n        if (Line == b\"End of search list.\"):\n            BeginSearch = False\n            Proc.terminate()\n            break\n\n        if (BeginSearch == True):\n            NewIncludes.append(\"-I\" + Line.decode('ascii'))\n\n        if (Line == b\"#include <...> search starts here:\"):\n            BeginSearch = True\n\n    # Add back original arguments\n    NewIncludes.extend(OriginalArguments)\n    return NewIncludes\n\ndef SetNamespace(Arch):\n    Arch.CurrentNamespace = \"\"\n    for Namespace in Arch.NamespaceScope:\n        Arch.CurrentNamespace = Arch.CurrentNamespace + Namespace + \"::\"\n\ndef HandleStructDeclCursor(Arch, Cursor, NameOverride = \"\"):\n    # Append namespace\n    CursorName = \"\"\n    StructType = Cursor.type\n    if (len(StructType.spelling) == 0):\n        CursorName = NameOverride\n    else:\n        CursorName = StructType.spelling\n\n    if (len(CursorName) != 0):\n        Arch.NamespaceScope.append(CursorName)\n        SetNamespace(Arch)\n\n    Struct = StructDefinition(\n        Name = CursorName,\n        Size = StructType.get_size())\n\n    # Handle children\n    Arch.Structs[Struct.Name] = HandleStructElements(Arch, Struct, Cursor)\n\n    # Pop namespace off\n    if (len(CursorName) != 0):\n        Arch.NamespaceScope.pop()\n        SetNamespace(Arch)\n\n    return Arch\n\ndef HandleUnionDeclCursor(Arch, Cursor, NameOverride = \"\"):\n    # Append namespace\n    CursorName = \"\"\n\n    if (len(Cursor.spelling) == 0):\n        CursorName = NameOverride\n    else:\n        CursorName = Cursor.spelling\n\n    if (len(CursorName) != 0):\n        Arch.NamespaceScope.append(CursorName)\n        SetNamespace(Arch)\n\n    UnionType = Cursor.type\n    Union = UnionDefinition(\n        Name = CursorName,\n        Size = UnionType.get_size())\n    Arch.Unions[Union.Name] = Union\n\n    # Handle children\n    Arch.Unions[Union.Name] = HandleStructElements(Arch, Union, Cursor)\n\n    # Pop namespace off\n    if (len(CursorName) != 0):\n        Arch.NamespaceScope.pop()\n        SetNamespace(Arch)\n\n    return Arch\n\ndef HandleVarDeclCursor(Arch, Cursor):\n    CursorName = Cursor.spelling\n    DeclType = Cursor.type\n    Def = Cursor.get_definition()\n\n    VarDecl = VarDeclDefinition(\n        Name = CursorName,\n        Size = DeclType.get_size())\n    Arch.VarDecls[VarDecl.Name] = HandleVarDeclElements(Arch, VarDecl, Cursor)\n    return Arch\n\ndef HandleVarDeclElements(Arch, VarDecl, Cursor):\n    for Child in Cursor.get_children():\n\n        if (Child.kind == CursorKind.ANNOTATE_ATTR):\n            if (Child.spelling.startswith(\"ioctl-alias-\")):\n                Sections = Child.spelling.split(\"-\")\n                if (Sections[2] == \"x86_32\"):\n                    VarDecl.Aliases.append(AliasType(Sections[3], AliasType.ALIAS_X86_32))\n                elif (Sections[2] == \"x86_64\"):\n                    VarDecl.Aliases.append(AliasType(Sections[3], AliasType.ALIAS_X86_64))\n                elif (Sections[2] == \"aarch64\"):\n                    VarDecl.Aliases.append(AliasType(Sections[3], AliasType.ALIAS_AARCH64))\n                elif (Sections[2] == \"win32\"):\n                    VarDecl.Aliases.append(AliasType(Sections[3], AliasType.ALIAS_WIN32))\n                elif (Sections[2] == \"win64\"):\n                    VarDecl.Aliases.append(AliasType(Sections[3], AliasType.ALIAS_WIN64))\n                else:\n                    logging.critical (\"Can't handle alias type '{0}'\".format(Child.spelling))\n                    Arch.Parsed = False\n            elif (Child.spelling == \"fex-match\"):\n                VarDecl.ExpectFEXMatch = True\n            else:\n                # Unknown annotation\n                pass\n        elif (Child.kind == CursorKind.TYPE_REF or\n              Child.kind == CursorKind.UNEXPOSED_EXPR or\n              Child.kind == CursorKind.PAREN_EXPR or\n              Child.kind == CursorKind.BINARY_OPERATOR\n              ):\n              pass\n\n    return VarDecl\n\n\ndef HandleTypeDefDeclCursor(Arch, Cursor):\n    TypeDefType = Cursor.underlying_typedef_type\n    CanonicalType = TypeDefType.get_canonical()\n\n    TypeDefName = Cursor.type.get_typedef_name()\n\n    if (TypeDefType.kind == TypeKind.ELABORATED and CanonicalType.kind == TypeKind.RECORD):\n        if (len(TypeDefName) != 0):\n            HandleTypeDefDecl(Arch, Cursor, TypeDefName)\n\n            # Append namespace\n            Arch.NamespaceScope.append(TypeDefName)\n            SetNamespace(Arch)\n\n            Arch = HandleCursor(Arch, Cursor)\n            #StructType = Cursor.type\n            #Struct = StructDefinition(\n            #    Name = TypeDefName,\n            #    Size = CanonicalType.get_size())\n            #Arch.Structs[TypeDefName] = Struct\n\n            ## Handle children\n            #Arch.Structs[TypeDefName] = HandleStructElements(Arch, Struct, Cursor)\n\n            # Pop namespace off\n            Arch.NamespaceScope.pop()\n            SetNamespace(Arch)\n    else:\n        if (len(TypeDefName) != 0):\n            Def = Cursor.get_definition()\n\n            VarDecl = VarDeclDefinition(\n                Name = TypeDefName,\n                Size = CanonicalType.get_size())\n            Arch.VarDecls[VarDecl.Name] = HandleVarDeclElements(Arch, VarDecl, Cursor)\n\n    return Arch\n\ndef HandleStructElements(Arch, Struct, Cursor):\n    for Child in Cursor.get_children():\n        # logging.info (\"\\t\\tStruct/Union Children: Cursor \\\"{0}{1}\\\" of kind {2}\".format(Arch.CurrentNamespace, Child.spelling, Child.kind))\n        if (Child.kind == CursorKind.ANNOTATE_ATTR):\n            if (Child.spelling.startswith(\"alias-\")):\n                Sections = Child.spelling.split(\"-\")\n                if (Sections[1] == \"x86_32\"):\n                    Struct.Aliases.append(AliasType(Sections[2], AliasType.ALIAS_X86_32))\n                elif (Sections[1] == \"x86_64\"):\n                    Struct.Aliases.append(AliasType(Sections[2], AliasType.ALIAS_X86_64))\n                elif (Sections[1] == \"aarch64\"):\n                    Struct.Aliases.append(AliasType(Sections[2], AliasType.ALIAS_AARCH64))\n                elif (Sections[1] == \"win32\"):\n                    Struct.Aliases.append(AliasType(Sections[2], AliasType.ALIAS_WIN32))\n                elif (Sections[1] == \"win64\"):\n                    Struct.Aliases.append(AliasType(Sections[2], AliasType.ALIAS_WIN64))\n                else:\n                    logging.critical (\"Can't handle alias type '{0}'\".format(Child.spelling))\n                    Arch.Parsed = False\n\n            elif (Child.spelling == \"fex-match\"):\n                Struct.ExpectFEXMatch = True\n            else:\n                # Unknown annotation\n                pass\n        elif (Child.kind == CursorKind.FIELD_DECL):\n            ParentType = Cursor.type\n            FieldType = Child.type\n            Field = FieldDefinition(\n                Name = Child.spelling,\n                Size = FieldType.get_size(),\n                OffsetOf = ParentType.get_offset(Child.spelling),\n                Alignment = FieldType.get_align())\n\n            #logging.info (\"\\t{0}\".format(Child.spelling))\n            #logging.info (\"\\t\\tSize of type: {0}\".format(FieldType.get_size()));\n            #logging.info (\"\\t\\tAlignment of type: {0}\".format(FieldType.get_align()));\n            #logging.info (\"\\t\\tOffsetof of type: {0}\".format(ParentType.get_offset(Child.spelling)));\n            Struct.Members.append(Field)\n            Arch.FieldDecls.append(Field)\n        elif (Child.kind == CursorKind.STRUCT_DECL):\n            ParentType = Cursor.type\n            FieldType = Child.type\n            Field = FieldDefinition(\n                Name = Child.spelling,\n                Size = FieldType.get_size(),\n                OffsetOf = ParentType.get_offset(Child.spelling),\n                Alignment = FieldType.get_align())\n\n            #logging.info (\"\\t{0}\".format(Child.spelling))\n            #logging.info (\"\\t\\tSize of type: {0}\".format(FieldType.get_size()));\n            #logging.info (\"\\t\\tAlignment of type: {0}\".format(FieldType.get_align()));\n            #logging.info (\"\\t\\tOffsetof of type: {0}\".format(ParentType.get_offset(Child.spelling)));\n            Struct.Members.append(Field)\n            Arch.FieldDecls.append(Field)\n            Arch = HandleStructDeclCursor(Arch, Child)\n        elif (Child.kind == CursorKind.UNION_DECL):\n            Struct = HandleStructElements(Arch, Struct, Child)\n            #ParentType = Cursor.type\n            #FieldType = Child.type\n            #Field = FieldDefinition(\n            #    Name = Child.spelling,\n            #    Size = FieldType.get_size(),\n            #    OffsetOf = ParentType.get_offset(Child.spelling),\n            #    Alignment = FieldType.get_align())\n\n            #logging.info (\"\\t{0}\".format(Child.spelling))\n            #logging.info (\"\\t\\tSize of type: {0}\".format(FieldType.get_size()));\n            #logging.info (\"\\t\\tAlignment of type: {0}\".format(FieldType.get_align()));\n            #logging.info (\"\\t\\tOffsetof of type: {0}\".format(ParentType.get_offset(Child.spelling)));\n            #Struct.Members.append(Field)\n            #Arch.FieldDecls.append(Field)\n            #Arch = HandleUnionDeclCursor(Arch, Child)\n        elif (Child.kind == CursorKind.TYPEDEF_DECL):\n            Arch = HandleTypeDefDeclCursor(Arch, Child)\n        else:\n            Arch = HandleCursor(Arch, Child)\n\n    return Struct\n\ndef HandleTypeDefDecl(Arch, Cursor, Name):\n    for Child in Cursor.get_children():\n        if (Child.kind == CursorKind.UNION_DECL):\n            pass\n        elif (Child.kind == CursorKind.STRUCT_DECL):\n            Arch = HandleStructDeclCursor(Arch, Child, Name)\n        elif (Child.kind == CursorKind.UNION_DECL):\n            Arch = HandleUnionDeclCursor(Arch, Child, Name)\n        elif (Child.kind == CursorKind.TYPEDEF_DECL):\n            Arch = HandleTypeDefDeclCursor(Arch, Child)\n        elif (Child.kind == CursorKind.TYPE_REF or\n              Child.kind == CursorKind.NAMESPACE_REF or\n              Child.kind == CursorKind.TEMPLATE_REF or\n              Child.kind == CursorKind.ALIGNED_ATTR):\n            # Safe to pass on\n            pass\n        else:\n            logging.critical (\"Unhandled TypedefDecl {0}-{1}-{2}\".format(Child.kind, Child.type.spelling, Child.spelling))\n\ndef HandleCursor(Arch, Cursor):\n    if (Cursor.kind.is_invalid()):\n        Diags = TU.diagnostics\n        for Diag in Diags:\n            logging.warning (Diag.format())\n\n        Arch.Parsed = False\n        return\n\n    for Child in Cursor.get_children():\n        kind = Child.kind\n        if (kind == CursorKind.TRANSLATION_UNIT):\n            Arch = HandleCursor(Arch, Child)\n        elif (kind == CursorKind.FIELD_DECL):\n            pass\n        elif (kind == CursorKind.UNION_DECL):\n            Arch = HandleUnionDeclCursor(Arch, Child)\n        elif (kind == CursorKind.STRUCT_DECL):\n            Arch = HandleStructDeclCursor(Arch, Child)\n        elif (kind == CursorKind.TYPEDEF_DECL):\n            Arch = HandleTypeDefDeclCursor(Arch, Child)\n        elif (kind == CursorKind.VAR_DECL):\n            Arch = HandleVarDeclCursor(Arch, Child)\n        elif (kind == CursorKind.NAMESPACE):\n            # Append namespace\n            Arch.NamespaceScope.append(Child.spelling)\n            SetNamespace(Arch)\n\n            # Handle children\n            Arch = HandleCursor(Arch, Child)\n\n            # Pop namespace off\n            Arch.NamespaceScope.pop()\n            SetNamespace(Arch)\n        elif (kind == CursorKind.TYPE_REF):\n            # Safe to pass on\n            pass\n        else:\n            Arch = HandleCursor(Arch, Child)\n\n    return Arch\n\ndef GetDB(Arch, filename, args):\n    Index = clang.cindex.Index.create()\n    try:\n        TU = Index.parse(filename, args=args, options=TranslationUnit.PARSE_INCOMPLETE)\n    except TranslationUnitLoadError:\n        Arch.Parsed = False\n        Diags = TU.diagnostics\n        for Diag in Diags:\n            logging.warning (Diag.format())\n\n        return\n\n    Arch.TU = TU\n    HandleCursor(Arch, TU.cursor)\n\n    # Get diagnostics\n    Diags = TU.diagnostics\n    if (len(Diags) != 0):\n        logging.warning (\"Diagnostics from Arch: {0}\".format(Arch.ArchName))\n\n    for Diag in Diags:\n        logging.warning (Diag.format())\n\n    return Arch\n\ndef GetCompar(ComparisonName, DBs):\n    if (ComparisonName.lower() == \"x86_32\"):\n        return DBs.DBs[AliasType.ALIAS_X86_32]\n    elif (ComparisonName.lower() == \"x86_64\"):\n        return DBs.DBs[AliasType.ALIAS_X86_64]\n    elif (ComparisonName.lower() == \"win32\"):\n        return DBs.DBs[AliasType.ALIAS_WIN32]\n    elif (ComparisonName.lower() == \"win64\"):\n        return DBs.DBs[AliasType.ALIAS_WIN64]\n    elif (ComparisonName.lower() == \"aarch64\"):\n        return DBs.DBs[AliasType.ALIAS_AARCH64]\n\ndef PrintMissingMembers(Struct1, Struct2):\n    for Member1 in Struct1.Members:\n        WasMissing = True\n        for Member2 in Struct2.Members:\n            if (Member1.Name == Member2.Name):\n                WasMissing = False\n                break\n        if (WasMissing):\n            logging.error (\"\\t'{0}' member '{1}' Doesn't exist in '{2}'\".format(Struct1.Name, Member1.Name, Struct2.Name));\n\ndef CompareStructs(Struct1, Struct2):\n    HadWarning = False\n    HadError = False\n\n    # Check if the struct size is a mismatch\n    if (Struct1.Size != Struct2.Size):\n        logging.warning (\"\\t#### Warning: Struct size mismatch. {0} != {1}\".format(Struct1.Size, Struct2.Size))\n        logging.warning (\"\\t\\tMight not be a problem if struct isn't in used inside another struct, or end of object\")\n        HadWarning = True\n\n    # Check if the number of members differ\n    if (len(Struct1.Members) != len(Struct2.Members)):\n        logging.error (\"@@@@ ERROR: Struct fields mismatch! Number of fields don't match! {0} != {1}\".format(len(Struct1.Members), len(Struct2.Members)));\n        PrintMissingMembers(Struct1, Struct2)\n        PrintMissingMembers(Struct2, Struct1)\n        HadError = True\n    else:\n        # Compare the members themselves\n        for StructMemberIndex in range(0, len(Struct1.Members)):\n            Member1 = Struct1.Members[StructMemberIndex]\n            Member2 = Struct2.Members[StructMemberIndex]\n            if (Member1.Type == TypeDefinition.TYPE_FIELD):\n                if (Member1.Size != Member2.Size):\n                    logging.error (\"\\t@@@@ ERROR: Member '{0}' mismatch Size! {1} != {2}\".format(Member1.Name, Member1.Size, Member2.Size));\n                    HadError = True\n                if (Member1.OffsetOf != Member2.OffsetOf):\n                    logging.error (\"\\t@@@@ ERROR: Member '{0}' mismatch OffsetOf! {1} != {2}\".format(Member1.Name, Member1.OffsetOf, Member2.OffsetOf));\n                    HadError = True\n                if (Member1.Alignment != Member2.Alignment):\n                    logging.error (\"\\t@@@@ ERROR: Member '{0}' mismatch Alignment! {1} != {2}\".format(Member1.Name, Member1.Alignment, Member2.Alignment));\n                    logging.error (\"\\t\\tProbably not a problem if offset and size matches\");\n                    HadWarning = True\n            else:\n                logging.critical (\"Oops, didn't handle member type {0}\".format(Member1.Type))\n        pass\n\n    return not (HadWarning or HadError)\n\ndef CompareAliases(DB, DBs):\n    Passed = True\n    for StructKey, StructDef in DB.Structs.items():\n        if (len(StructKey) == 0):\n            # XXX: Oops, shouldn't have anonymous structs\n            continue\n\n        if (len(StructDef.Aliases) != 0):\n            logging.info (\"Comparing Aliases {0}\".format(StructDef.Name))\n\n        for Alias in StructDef.Aliases:\n            OtherDB = DBs.DBs[Alias.AliasType]\n            OtherStruct = OtherDB.Structs.get(Alias.Name)\n            if (OtherStruct == None):\n                logging.critical (\"Couldn't find alias {0} in {1} DB\".format(Alias.Name, OtherDB.ArchName))\n                Passed = False\n                continue\n\n            ThisAlias = CompareStructs(StructDef, OtherStruct)\n            if not (ThisAlias):\n                logging.error (\"Couldn't Alias to Arch {0} successfully\".format(OtherDB.ArchName))\n            Passed &= ThisAlias\n\n    for VarDeclKey, VarDecl in DB.VarDecls.items():\n        if (len(VarDeclKey) == 0):\n            # XXX: Oops, shouldn't have anonymous vardecls\n            continue\n\n\n        for Alias in VarDecl.Aliases:\n            OtherDB = DBs.DBs[Alias.AliasType]\n            OtherAlias = OtherDB.VarDecls.get(Alias.Name)\n            if (OtherAlias == None):\n                logging.critical (\"Couldn't find alias {0} in {1} DB\".format(Alias.Name, OtherDB.ArchName))\n                Passed = False\n                continue\n\n            if (VarDecl.Size != OtherAlias.Size):\n                logging.critical(\"VarDecl: {0}/{1} didn't match {2}/{3}: {4:08X} != {5:08X}\".format(VarDeclKey, DB.ArchName, Alias.Name,\n                    OtherDB.ArchName,\n                    VarDecl.Size, OtherAlias.Size))\n                Passed = False\n                continue\n\n\n    return Passed\n\ndef CompareCrossArch(DB1, DB2):\n    Passed = True\n    for StructKey, StructDef in DB1.Structs.items():\n        if (len(StructKey) == 0):\n            # XXX: Oops, shouldn't have anonymous structs\n            continue\n\n        logging.info (\"Comparing crossArch {0}\".format(StructDef.Name))\n        if (StructDef.ExpectFEXMatch):\n            Struct2 = DB2.Structs.get(StructDef.Name)\n            if (Struct2 == None):\n                logging.critical (\"Couldn't find Struct {0} in {1} DB\".format(StructDef.Name, DB2.ArchName))\n                Passed = False\n                continue\n\n            Passed &= CompareStructs(StructDef, Struct2)\n\n    return Passed\n\ndef main():\n    if sys.version_info[0] < 3:\n        logging.critical (\"Python 3 or a more recent version is required.\")\n\n    if (len(sys.argv) < 2):\n        print (\"usage: %s <options> <Header.hpp> <clang arguments...>\" % (sys.argv[0]))\n        print (\"\\t-c1 <Type1>: Base Comparison Type\");\n        print (\"\\t-c2 <Type2>: Second Comparison Type\");\n        print (\"\\t-win: Parse Windows\");\n        sys.exit (\"\\t-no-linux: Do not parse Linux\");\n\n    ParseLinux = True\n    ParseWindows = False\n\n    Header = \"\"\n    Comparison1 = \"\"\n    Comparison2 = \"\"\n    BaseArgs = []\n\n    StartOfArgs = 0\n\n    # Parse our arguments\n    ArgIndex = 1\n    while ArgIndex < len(sys.argv):\n        Arg = sys.argv[ArgIndex]\n        if (Arg == \"--\"):\n            StartOfArgs = ArgIndex + 1\n            break;\n\n        if (Arg == \"-c1\"):\n            ArgIndex += 1\n            Comparison1 = sys.argv[ArgIndex]\n        elif (Arg == \"-c2\"):\n            ArgIndex += 1\n            Comparison2 = sys.argv[ArgIndex]\n        elif (Arg == \"-win\"):\n            ParseWindows = True\n        elif (Arg == \"-no-linux\"):\n           ParseLinux = False\n        else:\n            Header = Arg\n            StartOfArgs = ArgIndex + 1\n            break\n\n        # Increment\n        ArgIndex += 1\n\n    # Add arguments for clang\n    for ArgIndex in range(StartOfArgs, len(sys.argv)):\n        BaseArgs.append(sys.argv[ArgIndex])\n\n    args_x86_32 = [\n        \"-isystem\", \"/usr/i686-linux-gnu/include\",\n        \"-O2\",\n        \"-m32\",\n        \"--target=i686-linux-unknown\",\n    ]\n\n    args_x86_64 = [\n        \"-isystem\", \"/usr/x86_64-linux-gnu/include\",\n        \"-O2\",\n        \"--target=x86_64-linux-unknown\",\n        \"-DARCHITECTURE_x86_64\",\n    ]\n\n    args_aarch64 = [\n        \"-isystem\", \"/usr/aarch64-linux-gnu/include\",\n        \"-O2\",\n        \"--target=aarch64-linux-unknown\",\n        \"-DARCHITECTURE_arm64\",\n    ]\n\n    args_x86_win32 = [\n        \"-I/usr/lib/gcc/i686-w64-mingw32/10-win32/include/c++/\",\n        \"-I/usr/lib/gcc/i686-w64-mingw32/10-win32/include/c++/i686-w64-mingw32/\",\n        \"-O2\",\n        \"-m32\",\n        \"--target=i686-pc-win32\",\n    ]\n\n    args_x86_win64 = [\n        \"-I/usr/lib/gcc/x86_64-w64-mingw32/10-win32/include/c++/\",\n        \"-I/usr/lib/gcc/x86_64-w64-mingw32/10-win32/include/c++/x86_64-w64-mingw32/\",\n        \"-O2\",\n        \"--target=x86_64-pc-win32\",\n    ]\n\n    # Add all the arguments to the different lists\n    args_x86_32.extend(BaseArgs)\n    args_x86_64.extend(BaseArgs)\n    args_aarch64.extend(BaseArgs)\n    args_x86_win32.extend(BaseArgs)\n    args_x86_win64.extend(BaseArgs)\n\n    # We need to find the default arguments through clang invocations\n    args_x86_32 = FindClangArguments(args_x86_32)\n    args_x86_64 = FindClangArguments(args_x86_64)\n    args_aarch64 = FindClangArguments(args_aarch64)\n\n    args_x86_win32 = FindClangArguments(args_x86_win32)\n    args_x86_win64 = FindClangArguments(args_x86_win64)\n\n    Arch_x86_32 = ArchDB(\"x86_32\")\n    Arch_x86_64 = ArchDB(\"x86_64\")\n\n    Arch_aarch64 = ArchDB(\"aarch64\")\n    Arch_x86_win32 = ArchDB(\"win32\")\n    Arch_x86_win64 = ArchDB(\"win64\")\n\n    if (ParseLinux):\n        Arch_x86_32 = GetDB(Arch_x86_32, Header, args_x86_32)\n        Arch_x86_64 = GetDB(Arch_x86_64, Header, args_x86_64)\n        Arch_aarch64 = GetDB(Arch_aarch64, Header, args_aarch64)\n\n        if not (Arch_x86_32.Parsed):\n            logging.critical (\"Couldn't parse:{0}\".format(Arch_x86_32.ArchName))\n\n        if not (Arch_x86_64.Parsed):\n            logging.critical (\"Couldn't parse:{0}\".format(Arch_x86_64.ArchName))\n\n        if not (Arch_aarch64.Parsed):\n            logging.critical (\"Couldn't parse:{0}\".format(Arch_aarch64.ArchName))\n\n    if (ParseWindows):\n        Arch_x86_win32 = GetDB(Arch_x86_win32, Header, args_x86_win32)\n        Arch_x86_win64 = GetDB(Arch_x86_win64, Header, args_x86_win64)\n\n        if not (Arch_x86_win32.Parsed):\n            logging.critical (\"Couldn't parse:{0}\".format(Arch_x86_win32.ArchName))\n\n        if not (Arch_x86_win64.Parsed):\n            logging.critical (\"Couldn't parse:{0}\".format(Arch_x86_win64.ArchName))\n\n    DBs = DBList(Arch_x86_32,\n        Arch_x86_64,\n        Arch_aarch64,\n        Arch_x86_win32,\n        Arch_x86_win64)\n\n    Result = 0\n    if (len(Comparison1) != 0 and len(Comparison2) != 0):\n        CompDB1 = GetCompar(Comparison1, DBs)\n        CompDB2 = GetCompar(Comparison2, DBs)\n\n        # Now compare across the two compared architectures\n        Result = 0 if CompareCrossArch(CompDB1, CompDB2) else 1\n    elif (len(Comparison1) != 0):\n        CompDB1 = GetCompar(Comparison1, DBs)\n\n        # First compare the aliases to make sure we are matching\n        Result = 0 if CompareAliases(CompDB1, DBs) else 1\n\n    if (Result == 1):\n        logging.error(\"Execution environment\")\n        Args = \"[ \"\n        for Arg in sys.argv:\n            Args += Arg + \", \"\n        Args += \" ]\"\n        logging.error(Args)\n        Args = \"\"\n        for Arg in sys.argv:\n            Args += \"\\\"\" + Arg + \"\\\" \"\n\n        logging.error(Args)\n    return Result\n\nif __name__ == \"__main__\":\n    # execute only if run as a script\n    sys.exit(main())\n"
  },
  {
    "path": "Scripts/Threaded_Lockstep_Runner.py",
    "content": "#!/usr/bin/python3\nimport os\nimport sys\nimport glob\nfrom threading import Thread\nimport subprocess\nimport multiprocessing\nfrom shutil import which\n\nif sys.version_info[0] < 3:\n        raise Exception(\"Python 3 or a more recent version is required.\")\n\nif (len(sys.argv) < 3):\n    sys.exit(\"We need two arguments. Location of LockStepRunner and folder containing the tests\")\n\n# Remove our SHM regions if they still exist\nSHM_Files = glob.glob(\"/dev/shm/*_Lockstep\")\nfor file in SHM_Files:\n    os.remove(file)\n\nUnitTests = sorted(glob.glob(sys.argv[2] + \"*\"))\nUnitTestsSize = len(UnitTests)\nThreads = [None] * UnitTestsSize\nResults = [None] * UnitTestsSize\nThreadResults = [[None] * 2] * UnitTestsSize\nMaxFileNameStringLen = 0\n\ndef Threaded_Runner(Args, ID, Client):\n    Log = open(\"Log_\" + str(ID) + \"_\" + str(Client), \"w\")\n    Log.write(\"Args: %s\\n\" % \" \".join(Args))\n    Log.flush()\n    Process = subprocess.Popen(Args, stdout=Log, stderr=Log)\n    Process.wait()\n    Log.flush()\n    ThreadResults[ID][Client] = Process.returncode\n\ndef Threaded_Manager(Runner, ID, File):\n    ServerArgs = [\"catchsegv\", Runner, \"-c\", \"vm\", \"-n\", \"1\", \"-I\", \"R\" + str(ID), File]\n    ClientArgs = [\"catchsegv\", Runner, \"-c\", \"vm\", \"-n\", \"1\", \"-I\", \"R\" + str(ID), \"-C\"]\n\n    if which(\"catchsegv\") is None:\n        ServerArgs.pop(0)\n        ClientArgs.pop(0)\n\n    ServerThread = Thread(target = Threaded_Runner, args = (ServerArgs, ID, 0))\n    ClientThread = Thread(target = Threaded_Runner, args = (ClientArgs, ID, 1))\n\n    ServerThread.start()\n    ClientThread.start()\n\n    ClientThread.join()\n    ServerThread.join()\n\n    # The server is the one we should listen to for results\n    if (ThreadResults[ID][1] != 0 and ThreadResults[ID][0] == 0):\n        # If the client died for some reason but server thought we were fine then take client data\n        Results[ID] = ThreadResults[ID][1]\n    else:\n        # Else just take the server data\n        Results[ID] = ThreadResults[ID][0]\n\n    DupLen = MaxFileNameStringLen - len(UnitTests[ID])\n\n    if (Results[ID] == 0):\n        print(\"\\t'%s'%s - PASSED ID: %d - 0\" % (UnitTests[ID], \" \"*DupLen, ID))\n    else:\n        print(\"\\t'%s'%s - FAILED ID: %d - %s\" % (UnitTests[ID], \" \"*DupLen, ID, hex(Results[ID])))\n\nRunnerSlot = 0\nMaxRunnerSlots = min(32, multiprocessing.cpu_count() / 2)\nRunnerSlots = [None] * MaxRunnerSlots\nfor RunnerID in range(UnitTestsSize):\n    File = UnitTests[RunnerID]\n    print(\"'%s' Running Test\" % File)\n    MaxFileNameStringLen = max(MaxFileNameStringLen, len(File))\n    Threads[RunnerID] = Thread(target = Threaded_Manager, args = (sys.argv[1], RunnerID, File))\n    Threads[RunnerID].start()\n    if (MaxRunnerSlots != 0):\n        RunnerSlots[RunnerSlot] = Threads[RunnerID]\n        RunnerSlot += 1\n        if (RunnerSlot == MaxRunnerSlots):\n            for i in range(MaxRunnerSlots):\n                RunnerSlots[i].join()\n            RunnerSlot = 0\n\nfor i in range(UnitTestsSize):\n    Threads[i].join()\n\nprint(\"====== PASSED RESULTS ======\")\nfor i in range(UnitTestsSize):\n    DupLen = MaxFileNameStringLen - len(UnitTests[i])\n    if (Results[i] == 0):\n        print(\"\\t'%s'%s - PASSED ID: %d - 0\" % (UnitTests[i], \" \"*DupLen, i))\n\nprint(\"====== FAILED RESULTS ======\")\nfor i in range(UnitTestsSize):\n    DupLen = MaxFileNameStringLen - len(UnitTests[i])\n    if (Results[i] != 0):\n        print(\"\\t'%s'%s - FAILED ID: %d - %s\" % (UnitTests[i], \" \"*DupLen, i, hex(Results[i])))\n"
  },
  {
    "path": "Scripts/UpdateInstructionCountJson.py",
    "content": "#!/usr/bin/python3\nimport json\nimport logging\nimport sys\nlogger = logging.getLogger()\nlogger.setLevel(logging.ERROR)\n\ndef insert_before(d, key, item):\n    items = list(d.items())\n    items.insert(list(d.keys()).index(key), item)\n    return dict(items)\n\ndef update_performance_numbers(performance_json_path, performance_json, new_json_numbers):\n    for key, items in new_json_numbers.items():\n        if len(key) == 0:\n            continue\n\n        if not key in performance_json[\"Instructions\"]:\n            logging.error(\"{} didn't exist in performance json file?\".format(key))\n            return 1\n\n        if \"ExpectedInstructionCount\" in items:\n            performance_json[\"Instructions\"][key][\"ExpectedInstructionCount\"] = items[\"ExpectedInstructionCount\"]\n        if \"ExpectedArm64ASM\" in items:\n            performance_json[\"Instructions\"][key][\"ExpectedArm64ASM\"] = items[\"ExpectedArm64ASM\"]\n        if \"x86Insts\" in performance_json[\"Instructions\"][key]:\n            d = performance_json[\"Instructions\"][key]\n            d.pop('x86InstructionCount', None)\n            d = insert_before(d, \"ExpectedInstructionCount\",\n                              (\"x86InstructionCount\", len(d[\"x86Insts\"])))\n            performance_json[\"Instructions\"][key] = d\n\n    # Output to the original file.\n    with open(performance_json_path, \"w\") as json_file:\n        json.dump(performance_json, json_file, indent=2)\n        json_file.write(\"\\n\")\n\ndef main():\n    if sys.version_info[0] < 3:\n        logging.critical (\"Python 3 or a more recent version is required.\")\n\n    if (len(sys.argv) < 3):\n        logging.critical (\"usage: %s <PerformanceTests.json> <NewNumbers.json>\" % (sys.argv[0]))\n\n    performance_json_path = sys.argv[1]\n    new_json_numbers = sys.argv[2]\n\n    try:\n        with open(new_json_numbers) as json_file:\n            new_json_numbers_text = json_file.read()\n    except IOError:\n        # If there isn't any new json numbers for this file, then it is safe to skip.\n        return 0\n\n    try:\n        with open(performance_json_path) as json_file:\n            performance_json_text = json_file.read()\n    except IOError:\n        logging.error(\"IOError!\")\n        return 1\n\n    try:\n        performance_json_data = json.loads(performance_json_text)\n        if not isinstance(performance_json_data, dict):\n            raise TypeError('JSON data must be a dict')\n\n        new_json_numbers_data = json.loads(new_json_numbers_text)\n        if not isinstance(new_json_numbers_data, dict):\n            raise TypeError('JSON data must be a dict')\n\n        return update_performance_numbers(performance_json_path, performance_json_data, new_json_numbers_data)\n    except ValueError as ve:\n        logging.error(f'JSON error: {ve}')\n        return 1\n\n    return 0\n\nif __name__ == \"__main__\":\n    # execute only if run as a script\n    sys.exit(main())\n\n"
  },
  {
    "path": "Scripts/aarch64_fit_native.py",
    "content": "#!/usr/bin/python3\nimport re\nimport sys\ntry:\n    from packaging.version import Version as version_check\nexcept:\n    from pkg_resources import parse_version as version_check\n\n# Order this list from oldest to newest\n# try not to list something newer than our minimum compiler supported version\nBigCoreIDs = {\n        # ARM\n        tuple([0x41, 0xd07]): \"cortex-a57\",\n        tuple([0x41, 0xd08]): \"cortex-a72\",\n        tuple([0x41, 0xd09]): \"cortex-a73\",\n        tuple([0x41, 0xd0a]): \"cortex-a75\",\n        tuple([0x41, 0xd0b]): \"cortex-a76\",\n        tuple([0x41, 0xd0d]): \"cortex-a77\",\n        tuple([0x41, 0xd41]): \"cortex-a78\",\n        tuple([0x41, 0xd4b]): \"cortex-a78c\",\n        tuple([0x41, 0xd44]): \"cortex-x1\",\n        tuple([0x41, 0xd4c]):\n            [ [\"cortex-x1\", \"0.0\"],\n              [\"cortex-x1c\", \"14.0\"],\n            ],\n        tuple([0x41, 0xd47]):\n            [ [\"cortex-a78\", \"0.0\"],\n              [\"cortex-a710\", \"14.0\"],\n            ],\n        tuple([0x41, 0xd48]):\n            [ [\"cortex-x1\", \"0.0\"],\n              [\"cortex-x2\", \"14.0\"],\n            ],\n        tuple([0x41, 0xd4d]):\n            [ [\"cortex-a78\", \"0.0\"],\n              [\"cortex-a715\", \"17.0\"],\n            ],\n        tuple([0x41, 0xd81]):\n            [ [\"cortex-a78\", \"0.0\"],\n              [\"cortex-a720\", \"18.0\"],\n            ],\n        tuple([0x41, 0xd87]):\n            [ [\"cortex-a78\", \"0.0\"],\n              [\"cortex-a725\", \"19.0\"],\n            ],\n        tuple([0x41, 0xd85]):\n            [ [\"cortex-a78\", \"0.0\"],\n              [\"cortex-x925\", \"19.0\"],\n            ],\n        # Neoverse-N class\n        tuple([0x41, 0xd0c]): \"neoverse-n1\",\n        tuple([0x41, 0xd49]): \"neoverse-n2\",\n        tuple([0x41, 0xd8e]):\n            [ [\"cortex-a78\", \"0.0\"],\n              [\"neoverse-n3\", \"19.0\"],\n            ],\n\n        # Neoverse-V class\n        tuple([0x41, 0xd40]): \"neoverse-v1\",\n        tuple([0x41, 0xd4f]):\n            [ [\"cortex-a78\", \"0.0\"],\n              [\"neoverse-v2\", \"16.0\"],\n            ],\n        tuple([0x41, 0xd83]):\n            [ [\"cortex-a78\", \"0.0\"],\n              [\"neoverse-v3ae\", \"19.0\"],\n            ],\n        tuple([0x41, 0xd84]):\n            [ [\"cortex-a78\", \"0.0\"],\n              [\"neoverse-v3\", \"19.0\"],\n            ],\n        ## Nvidia\n        tuple([0x4e, 0x004]): \"carmel\", # Carmel\n        # Qualcomm\n        tuple([0x51, 0x800]): \"cortex-a73\", # Kryo 2xx Gold\n        tuple([0x51, 0x802]): \"cortex-a75\", # Kryo 3xx Gold\n        tuple([0x51, 0x804]): \"cortex-a76\", # Kryo 4xx Gold\n        # Apple M1 Parallels hypervisor\n        tuple([0x41, 0x0]):\n            [ [\"apple-a13\", \"0.0\"], # If we aren't on 12.0+\n              [\"apple-a14\", \"12.0\"], # Only exists in 12.0+\n            ],\n        # QEmu HVF 10.2+\n        tuple([0x61, 0]): \"apple-a13\", # Can't determine variant, choose lowest.\n        # Ampere Computing\n        tuple([0xc0, 0xac3]): \"ampere1\",\n        tuple([0xc0, 0xac4]): \"ampere1a\",\n        tuple([0xc0, 0xac5]): \"ampere1b\",\n        tuple([0xc0, 0xac7]): \"ampere1c\",\n}\n\nLittleCoreIDs = {\n        # ARM\n        tuple([0x41, 0xd04]): \"cortex-a35\",\n        tuple([0x41, 0xd03]): \"cortex-a53\",\n        tuple([0x41, 0xd05]): \"cortex-a55\",\n        tuple([0x41, 0xd46]):\n            [ [\"cortex-a55\", \"0.0\"],\n              [\"cortex-a510\", \"14.0\"],\n            ],\n        tuple([0x41, 0xd80]):\n            [ [\"cortex-a55\", \"0.0\"],\n              [\"cortex-a520\", \"18.0\"],\n            ],\n        # Qualcomm\n        tuple([0x51, 0x801]): \"cortex-a53\", # Kryo 2xx Silver\n        tuple([0x51, 0x803]): \"cortex-a55\", # Kryo 3xx Silver\n        tuple([0x51, 0x805]): \"cortex-a55\", # Kryo 4xx/5xx Silver\n}\n\n# Args: </proc/cpuinfo file> <clang version>\nif (len(sys.argv) < 3):\n    sys.exit()\n\nclang_version = sys.argv[2]\ncpuinfo = []\nwith open(sys.argv[1]) as cpuinfo_file:\n    current_implementer = 0\n    current_part = 0\n    for line in cpuinfo_file:\n        line = line.strip()\n        if \"CPU implementer\" in line:\n            current_implementer = int(re.findall(r'0x[0-9A-F]+', line, re.I)[0], 16)\n        if \"CPU part\" in line:\n            current_part = int(re.findall(r'0x[0-9A-F]+', line, re.I)[0], 16)\n            cpuinfo += {tuple([current_implementer, current_part])}\n\nlargest_big = \"cortex-a57\"\nlargest_little = \"cortex-a53\"\n\nfor core in cpuinfo:\n    if BigCoreIDs.get(core):\n        IDList = BigCoreIDs.get(core)\n        if type(IDList) is list:\n            for ID in IDList:\n                if version_check(clang_version) >= version_check(ID[1]):\n                    largest_big = ID[0]\n        else:\n            largest_big = BigCoreIDs.get(core)\n\n    if LittleCoreIDs.get(core):\n        largest_little = LittleCoreIDs.get(core)\n\n# We only want the big core output\nprint(largest_big)\n# print(largest_little)\n"
  },
  {
    "path": "Scripts/changelog_generator.py",
    "content": "#!/bin/env python3\nimport sys\n\nimport re\n\n# Handles the following formats:\n#\n# <commit message> -> goes in Misc category\n# <Category>: <commit message> -> Goes in <Category>\n# <Category>/<Tag>: <commit message> -> Goes in <Category>/<Tag>\n\nMeta = { }\nfor line in sys.stdin.readlines():\n    if detailed := re.findall(\"^([A-Za-z0-9]+)/([A-Za-z0-9]+):(.+)$\", line):\n        detailed = detailed[0]\n        meta = detailed[0].strip() + \"/\" + detailed[1].strip()\n        if meta not in Meta:\n            Meta[meta] = []\n        Meta[meta].append(detailed[2].strip())\n    elif category := re.findall(\"(^[A-Za-z0-9]+):(.+)$\", line):\n        category = category[0]\n        if category[0].strip() not in Meta:\n            Meta[category[0].strip()] = []\n        Meta[category[0].strip()].append(category[1].strip())\n    else:\n        if \"_Misc\" not in Meta:\n            Meta[\"_Misc\"] = []\n        Meta[\"_Misc\"].append(line.strip())\n\nprint(\"FEX Release {0}\".format(sys.argv[1]))\n\nCategory = \"\"\nTag = \"\"\nfor item in sorted(Meta.items()):\n    if item[0] == \"_Misc\":\n        tag = \"Misc\"\n    else:\n        tag = item[0]\n\n    category = tag.split(\"/\")[0]\n    if category != Category:\n        Category = category\n        Tag = \"\"\n        print(\"\")\n        print(\"- \" + category)\n    if Tag != tag and tag != category:\n        Tag = tag\n        print(\"\")\n        print(\"  - \" + tag.split(\"/\")[1])\n\n    for change in item[1]:\n        if Tag == \"\":\n            print(\"  - \" + change)\n        else:\n            print(\"    - \" + change)\n"
  },
  {
    "path": "Scripts/doc_outline_generator.py",
    "content": "#!/usr/bin/python3\n\n# Tag Format\n#  $info$\n#  glossary: <name> ~ <definition> (Optional, registers or replaces a glossary entry)\n#  glossary: IR ~ Intermidiate Representation, a of storage for our high-level opcode representation\n#  glossary: SSA ~ Single Static Assignment, a form of representing IR in memory\n#  glossary: Basic Block ~ A block of instructions with no control flow, terminated by control flow\n#  glossary: Fragment ~ A Collection of basic blocks, possible an entire guest function or a fraction of it\n#  category: <name> ~ <description> (Optional, registers or replaces a category description)\n#  category: backend ~ Concerns itself with generating binary code from (optimized) IR\n#  meta: <name> ~ <description> (Optional, registers or replaces a meta, aka tag, description)\n#  meta: backend|arm64 ~ Arm64 Splatter backend\n#  tags: <meta name> [, <meta name>, ...] (Required if info tag exists)\n#  tags: backend|arm64\n#  desc: <short file description> (Optional)\n#  desc: Main glue logic of the arm64 splatter backend\n#  $end_info$\n\nimport re\nfrom pathlib import Path\nimport sys\n\nif (len(sys.argv) != 4):\n    print(\"doc_outline_generator GIT_DIR SRC_DIR LINK_PREFIX\")\n    sys.exit(-2)\n\nBase = Path(sys.argv[1])\nRoot = Path(sys.argv[2])\nPrefix = sys.argv[3]\n\nPaths = []\n\nfor path in Root.rglob('*.c'):\n    Paths.append(path)\n\nfor path in Root.rglob('*.cpp'):\n    Paths.append(path)\n\nfor path in Root.rglob('*.cc'):\n    Paths.append(path)\n\nfor path in Root.rglob('*.h'):\n    Paths.append(path)\n\nfor path in Root.rglob('*.hpp'):\n    Paths.append(path)\n\nCategoryLabels = { }\nMetaLabels = { }\nGlossaryLabels = { }\n\nMeta = { }\nDesc = { }\n\nfor path in Paths:\n    with path.open() as file:\n        txt = file.read()\n        x = re.findall(\"\\$info\\$([^\\$]*)\\$end_info\\$\", txt)\n        if x:\n            for entry in x[0].strip().split(\"\\n\"):\n                name = entry.split(\":\", 1)[0].strip();\n                val = entry.split(\":\", 1)[1].strip();\n                if name == \"category\":\n                    cat_name = val.split(\"~\", 1)[0].strip();\n                    cat_val = val.split(\"~\", 1)[1].strip();\n                    CategoryLabels[cat_name] = cat_val\n                elif name == \"meta\":\n                    meta_name = val.split(\"~\", 1)[0].strip();\n                    meta_val = val.split(\"~\", 1)[1].strip();\n                    MetaLabels[meta_name] = meta_val\n                elif name == \"glossary\":\n                    glossary_name = val.split(\"~\", 1)[0].strip();\n                    glossary_val = val.split(\"~\", 1)[1].strip();\n                    GlossaryLabels[glossary_name] = glossary_val\n                elif name == \"tags\":\n                    for meta_name in val.split(\",\"):\n                        if meta_name.strip() not in Meta:\n                            Meta[meta_name.strip()] = []\n                        Meta[meta_name.strip()].append(path)\n                elif name == \"desc\":\n                    Desc[path] = val;\n                else:\n                    print(\"Error\")\n                    sys.exit(-1)\n\n\nReadme = None\nif (Root / \"README.md\").is_file():\n    Readme = Root / \"README.md\"\n\nif (Root / \"Readme.md\").is_file():\n    Readme = Root / \"Readme.md\"\n\nprint(\"## \" + Root.relative_to(Base).as_posix())\n\nif Readme:\n    print(\"See [\" + Root.name + \"/\" + Readme.name + \"](\" + Prefix + Readme.relative_to(Base).as_posix() + \") for more details\")\n\nprint(\"\")\n\nif (GlossaryLabels):\n    print (\"### Glossary\")\n    print(\"\")\n    for item in GlossaryLabels.items():\n        print(\"- \" + item[0] + \": \" + item[1])\n    print(\"\")\n    print(\"\")\n\nCategory = \"\"\nfor item in sorted(Meta.items()):\n    meta = item[0]\n    category = meta.split(\"|\")[0]\n    topic = meta.split(\"|\")[1]\n    if Category != category:\n        if Category != \"\":\n            print(\"\")\n            print(\"\")\n        Category = category\n        print(\"### \" + Category)\n        if Category in CategoryLabels:\n            print(CategoryLabels[Category])\n        print(\"\")\n\n    print(\"#### \" + topic)\n    if meta in MetaLabels:\n            print(MetaLabels[meta])\n\n    for path in sorted(item[1]):\n        if path in Desc:\n            print(\"- [\" + path.name + \"](\" + Prefix + path.relative_to(Base).as_posix() + \")\" + \": \" + Desc[path])\n        else:\n            print(\"- [\" + path.name + \"](\" + Prefix + path.relative_to(Base).as_posix() + \")\")\n    print(\"\")\n"
  },
  {
    "path": "Scripts/generate_changelog.sh",
    "content": "#!/bin/sh\n\nif [ \"$#\" -ne 2 ]; then\n\techo \"$0: <PEV-TAG> <NEXT-TAG>\"\n\texit 255\nfi\n\ngit log \"$1..HEAD\"  --pretty=\"%b (%h)\" --abbrev-commit --merges | Scripts/changelog_generator.py \"$2\"\n"
  },
  {
    "path": "Scripts/generate_doc_outline.sh",
    "content": "#!/bin/sh\n\necho \"# $(git describe --always)\"\necho\n\n./Scripts/doc_outline_generator.py  \"$(pwd)\" \"$(pwd)/FEXCore\" \"../\"\n./Scripts/doc_outline_generator.py  \"$(pwd)\" \"$(pwd)/ThunkLibs\" \"../\"\n./Scripts/doc_outline_generator.py  \"$(pwd)\" \"$(pwd)/Source/Tests\" \"../\"\n./Scripts/doc_outline_generator.py  \"$(pwd)\" \"$(pwd)/unittests\" \"../\"\n\n# These don't have useful documentation at this point\n#./Scripts/doc_outline_generator.py  \"`pwd`\" \"`pwd`/Scripts\" \"../\"\n#./Scripts/doc_outline_generator.py  \"`pwd`\" \"`pwd`/Source/Common\" \"../\"\n"
  },
  {
    "path": "Scripts/generate_release.sh",
    "content": "#!/bin/sh\n\n# Allow release maintainer to override PREVIOUS and CURRENT by setting it before launching the script\nPREVIOUS=${PREVIOUS:-FEX-$(date --date='-1 month' +%y%m)}\nCURRENT=${CURRENT:-FEX-$(date +%y%m)}\n\nif ! git rev-list \"$PREVIOUS\" > /dev/null 2>&1 ; then\n  echo \"$PREVIOUS tag doesn't exist\"\n  exit\nfi\n\nif git rev-list \"$CURRENT\" > /dev/null 2>&1 ; then\n  echo \"$CURRENT tag already exists!\"\n  exit\nfi\n\necho \"Tagging $CURRENT, previous release $PREVIOUS\"\necho \"Press Ctrl-C to cancel within 10 seconds\"\nsleep 10\n\ngit tag \"$CURRENT\" -a -m \"temporary\"\nScripts/generate_doc_outline.sh > docs/SourceOutline.md\ngit commit docs/SourceOutline.md -m \"Docs: Update for release $CURRENT\"\ngit tag -d \"$CURRENT\"\ngit tag -a \"$CURRENT\" -m \"$(Scripts/generate_changelog.sh \"$PREVIOUS\" \"$CURRENT\")\" --edit\n\necho \"Inspect if everything went smoothly via 'git log -6 $CURRENT' \"\necho \"if all is good, do 'git push upstream $CURRENT'\"\n"
  },
  {
    "path": "Scripts/guest_test_runner.py",
    "content": "#!/usr/bin/python3\nimport json\nimport os\nimport sys\nimport subprocess\n\ndef DoesFEXSupportAVX(mode):\n    # Check if FEX indicates support for AVX\n    fex_interpreter_path = os.path.dirname(sys.argv[7]) + \"/FEX\"\n\n    args = list()\n    args.append(fex_interpreter_path)\n    args.append('/bin/cat')\n    args.append('/proc/cpuinfo')\n\n    process = subprocess.run(args, capture_output=True, text=True)\n    output = process.stdout\n\n    for line in output:\n        if 'flags' in line:\n            flags = line.split(':')[1].strip().split(' ')\n            return 'avx' in flags and 'avx2' in flags\n    return False\n\ndef TestRequiresAVXSupport():\n    # Check if the test itself requires AVX\n    exe_path = sys.argv[len(sys.argv) - 1]\n    json_path = os.path.dirname(os.path.dirname(exe_path)) + '/requirements/' + os.path.basename(exe_path) + '.json'\n\n    try:\n        with open(json_path) as json_file:\n            try:\n                json_data = json.load(json_file)\n                if not isinstance(json_data, dict):\n                    raise TypeError('JSON data must be a dict')\n\n                if \"AVX\" in json_data[\"HostFeatures\"]:\n                    return True\n            except ValueError as ve:\n                print(f'JSON error: {ve}')\n                pass\n    except IOError:\n        # If we get here, then we don't have a corresponding JSON\n        # file for the associated test, and can assume there's no\n        # feature requirements for the test.\n        pass\n    return False\n\ndef LoadTestsFile(File):\n    Dict = {}\n    if not os.path.exists(File):\n        return Dict\n\n    with open(File) as dtf:\n        for line in dtf:\n            test = line.split(\"#\")[0].strip() # remove comments and empty spaces\n            if len(test) > 0:\n                Dict[test] = 1\n\n    return Dict\n\ndef LoadTestsFileResults(File):\n    Dict = {}\n    if not os.path.exists(File):\n        return Dict\n\n    with open(File) as dtf:\n        for line in dtf:\n            test = line.split(\"#\")[0].strip() # remove comments and empty spaces\n            if len(test) > 0:\n                parts = line.split(\" \")\n                Dict[parts[0]] = int(parts[1])\n\n    return Dict\n\n\n# Args: <Known Failures file> <ExpectedOutputsFile> <DisabledTestsFile> <FlakeTestsFile> <TestName> <Mode> <FexExecutable> <FexArgs>...\n\n# fexargs should also include the test executable\n\nif (len(sys.argv) < 7):\n    sys.exit()\n\nknown_failures_file = sys.argv[1]\nexpected_output_file = sys.argv[2]\ndisabled_tests_file = sys.argv[3]\nflake_tests_file = sys.argv[4]\ntest_name = sys.argv[5]\nmode = sys.argv[6]\nfexecutable = sys.argv[7]\nStartingFEXArgsOffset = 8\n\n# If the test requires AVX and FEX doesn't support it, just pass the test and move on\nif TestRequiresAVXSupport() and not DoesFEXSupportAVX(mode):\n    sys.exit(0)\n\n# Open test expected information files and load in to dictionaries.\nknown_failures = LoadTestsFile(known_failures_file)\nexpected_output = LoadTestsFileResults(expected_output_file)\ndisabled_tests = LoadTestsFile(disabled_tests_file)\nflake_tests = LoadTestsFile(flake_tests_file)\n\n# run with timeout to avoid locking up\nRunnerArgs = []\n\nRunnerArgs.append(fexecutable)\n\n# Add the rest of the arguments\nfor i in range(len(sys.argv) - StartingFEXArgsOffset):\n    RunnerArgs.append(sys.argv[StartingFEXArgsOffset + i])\n\n# print(RunnerArgs)\n\nResultCode = 0\n\n# Handle flakes\nTryCount = 1\nif (flake_tests.get(test_name)):\n    TryCount = 5\n\nif (disabled_tests.get(test_name)):\n    # This error code tells ctest that the test was skipped\n    sys.exit(125)\n\n# expect zero by default\nif (not test_name in expected_output):\n    expected_output[test_name] = 0\n\nif ResultCode == 0:\n    for Try in range(TryCount):\n        # Run the test and wait for it to end to get the result\n        print(RunnerArgs)\n        Process = subprocess.Popen(RunnerArgs)\n        Process.wait()\n        ResultCode = Process.returncode\n\n        # Break if the expected output is the result code\n        if (expected_output[test_name] == ResultCode):\n            break\n\nif (expected_output[test_name] != ResultCode):\n    if (test_name in expected_output):\n        print(\"test failed, expected is\", expected_output[test_name], \"but got\", ResultCode)\n    else:\n        print(\"Test doesn't have expected output,\", test_name)\n\n    if (known_failures.get(test_name)):\n        print(\"Passing because it was expected to fail\")\n        # failed and expected to fail -- pass the test\n        sys.exit(0)\n    else:\n        # failed and unexpected to fail -- fail the test\n        sys.exit(1)\nelse:\n    print(\"test passed with\", ResultCode)\n    if (known_failures.get(test_name)):\n        print(\"Failing because it was expected to fail\")\n        # passed and expected to fail -- fail the test\n        sys.exit(1)\n    else:\n        # passed and expected to pass -- pass the test\n        sys.exit(0)\n"
  },
  {
    "path": "Scripts/json_asm_config_parse.py",
    "content": "import sys\nfrom json_config_parse import parse_json\n\nif (len(sys.argv) < 3):\n    sys.exit()\n\noutput_file = sys.argv[2]\nasm_file = open(sys.argv[1], \"r\")\nasm_text = asm_file.read()\nasm_file.close()\n\njson_text = asm_text.split(\"%ifdef CONFIG\")\nif (len(json_text) > 1):\n        json_text = json_text[1].split(\"%endif\")\n        if (len(json_text) > 1):\n            json_text = json_text[0].strip()\n\n            parse_json(json_text, output_file)\n"
  },
  {
    "path": "Scripts/json_config_parse.py",
    "content": "from enum import Flag\nimport json\nimport struct\nimport sys\n\nclass Regs(Flag):\n    REG_NONE  = 0\n    REG_RIP   = (1 << 0)\n    REG_RAX   = (1 << 1)\n    REG_RBX   = (1 << 2)\n    REG_RCX   = (1 << 3)\n    REG_RDX   = (1 << 4)\n    REG_RSI   = (1 << 5)\n    REG_RDI   = (1 << 6)\n    REG_RBP   = (1 << 7)\n    REG_RSP   = (1 << 8)\n    REG_R8    = (1 << 9)\n    REG_R9    = (1 << 10)\n    REG_R10   = (1 << 11)\n    REG_R11   = (1 << 12)\n    REG_R12   = (1 << 13)\n    REG_R13   = (1 << 14)\n    REG_R14   = (1 << 15)\n    REG_R15   = (1 << 16)\n    REG_XMM0  = (1 << 17)\n    REG_XMM1  = (1 << 18)\n    REG_XMM2  = (1 << 19)\n    REG_XMM3  = (1 << 20)\n    REG_XMM4  = (1 << 21)\n    REG_XMM5  = (1 << 22)\n    REG_XMM6  = (1 << 23)\n    REG_XMM7  = (1 << 24)\n    REG_XMM8  = (1 << 25)\n    REG_XMM9  = (1 << 26)\n    REG_XMM10 = (1 << 27)\n    REG_XMM11 = (1 << 28)\n    REG_XMM12 = (1 << 29)\n    REG_XMM13 = (1 << 30)\n    REG_XMM14 = (1 << 31)\n    REG_XMM15 = (1 << 32)\n    REG_GS    = (1 << 33)\n    REG_FS    = (1 << 34)\n    REG_MM0   = (1 << 35)\n    REG_MM1   = (1 << 36)\n    REG_MM2   = (1 << 37)\n    REG_MM3   = (1 << 38)\n    REG_MM4   = (1 << 39)\n    REG_MM5   = (1 << 40)\n    REG_MM6   = (1 << 41)\n    REG_MM7   = (1 << 42)\n    REG_MM8   = (1 << 43)\n    REG_ALL   = (1 << 44) - 1\n    REG_INVALID = (1 << 44)\n\nclass ABI(Flag) :\n    ABI_SYSTEMV = 0\n    ABI_WIN64   = 1\n    ABI_NONE    = 2\n\nclass Mode(Flag) :\n    MODE_32   = 0\n    MODE_64   = 1\n\nclass HostFeatures(Flag) :\n    FEATURE_ANY      = 0\n    FEATURE_3DNOW    = (1 << 0)\n    FEATURE_SSE4A    = (1 << 1)\n    FEATURE_AVX      = (1 << 2)\n    FEATURE_RAND     = (1 << 3)\n    FEATURE_SHA      = (1 << 4)\n    FEATURE_CLZERO   = (1 << 5)\n    FEATURE_BMI1     = (1 << 6)\n    FEATURE_BMI2     = (1 << 7)\n    FEATURE_CLWB     = (1 << 8)\n    FEATURE_LINUX    = (1 << 9)\n    FEATURE_AES256   = (1 << 10)\n    FEATURE_AFP      = (1 << 11)\n    FEATURE_SSSE3    = (1 << 12)\n    FEATURE_SSE4_1   = (1 << 13)\n    FEATURE_SSE4_2   = (1 << 14)\n    FEATURE_AES      = (1 << 15)\n    FEATURE_PCLMUL   = (1 << 16)\n    FEATURE_MOVBE    = (1 << 17)\n    FEATURE_ADX      = (1 << 18)\n    FEATURE_XSAVE    = (1 << 19)\n    FEATURE_RDPID    = (1 << 20)\n    FEATURE_CLFLOPT  = (1 << 21)\n    FEATURE_FSGSBASE = (1 << 22)\n    FEATURE_EMMI     = (1 << 23)\n\nRegStringLookup = {\n    \"NONE\":  Regs.REG_NONE,\n    \"RAX\":   Regs.REG_RAX,\n    \"RIP\":   Regs.REG_RIP,\n    \"RBX\":   Regs.REG_RBX,\n    \"RCX\":   Regs.REG_RCX,\n    \"RDX\":   Regs.REG_RDX,\n    \"RSI\":   Regs.REG_RSI,\n    \"RDI\":   Regs.REG_RDI,\n    \"RBP\":   Regs.REG_RBP,\n    \"RSP\":   Regs.REG_RSP,\n    \"R8\":    Regs.REG_R8,\n    \"R9\":    Regs.REG_R9,\n    \"R10\":   Regs.REG_R10,\n    \"R11\":   Regs.REG_R11,\n    \"R12\":   Regs.REG_R12,\n    \"R13\":   Regs.REG_R13,\n    \"R14\":   Regs.REG_R14,\n    \"R15\":   Regs.REG_R15,\n    \"XMM0\":  Regs.REG_XMM0,\n    \"XMM1\":  Regs.REG_XMM1,\n    \"XMM2\":  Regs.REG_XMM2,\n    \"XMM3\":  Regs.REG_XMM3,\n    \"XMM4\":  Regs.REG_XMM4,\n    \"XMM5\":  Regs.REG_XMM5,\n    \"XMM6\":  Regs.REG_XMM6,\n    \"XMM7\":  Regs.REG_XMM7,\n    \"XMM8\":  Regs.REG_XMM8,\n    \"XMM9\":  Regs.REG_XMM9,\n    \"XMM10\": Regs.REG_XMM10,\n    \"XMM11\": Regs.REG_XMM11,\n    \"XMM12\": Regs.REG_XMM12,\n    \"XMM13\": Regs.REG_XMM13,\n    \"XMM14\": Regs.REG_XMM14,\n    \"XMM15\": Regs.REG_XMM15,\n    \"GS\":    Regs.REG_GS,\n    \"FS\":    Regs.REG_FS,\n    \"ALL\":   Regs.REG_ALL,\n    \"MM0\":   Regs.REG_MM0,\n    \"MM1\":   Regs.REG_MM1,\n    \"MM2\":   Regs.REG_MM2,\n    \"MM3\":   Regs.REG_MM3,\n    \"MM4\":   Regs.REG_MM4,\n    \"MM5\":   Regs.REG_MM5,\n    \"MM6\":   Regs.REG_MM6,\n    \"MM7\":   Regs.REG_MM7,\n    \"MM8\":   Regs.REG_MM8,\n}\n\nABIStringLookup = {\n    \"SYSTEMV\": ABI.ABI_SYSTEMV,\n    \"WIN64\": ABI.ABI_WIN64,\n    \"NONE\": ABI.ABI_NONE,\n}\n\nModeStringLookup = {\n    \"32BIT\": Mode.MODE_32,\n    \"64BIT\": Mode.MODE_64,\n}\n\nHostFeaturesLookup = {\n    \"3DNOW\"    : HostFeatures.FEATURE_3DNOW,\n    \"SSE4A\"    : HostFeatures.FEATURE_SSE4A,\n    \"AVX\"      : HostFeatures.FEATURE_AVX,\n    \"RAND\"     : HostFeatures.FEATURE_RAND,\n    \"SHA\"      : HostFeatures.FEATURE_SHA,\n    \"CLZERO\"   : HostFeatures.FEATURE_CLZERO,\n    \"BMI1\"     : HostFeatures.FEATURE_BMI1,\n    \"BMI2\"     : HostFeatures.FEATURE_BMI2,\n    \"CLWB\"     : HostFeatures.FEATURE_CLWB,\n    \"LINUX\"    : HostFeatures.FEATURE_LINUX,\n    \"AES256\"   : HostFeatures.FEATURE_AES256,\n    \"AFP\"      : HostFeatures.FEATURE_AFP,\n    \"SSSE3\"    : HostFeatures.FEATURE_SSSE3,\n    \"SSE4.1\"   : HostFeatures.FEATURE_SSE4_1,\n    \"SSE4.2\"   : HostFeatures.FEATURE_SSE4_2,\n    \"AES\"      : HostFeatures.FEATURE_AES,\n    \"PCLMUL\"   : HostFeatures.FEATURE_PCLMUL,\n    \"MOVBE\"    : HostFeatures.FEATURE_MOVBE,\n    \"ADX\"      : HostFeatures.FEATURE_ADX,\n    \"XSAVE\"    : HostFeatures.FEATURE_XSAVE,\n    \"RDPID\"    : HostFeatures.FEATURE_RDPID,\n    \"CLFLOPT\"  : HostFeatures.FEATURE_CLFLOPT,\n    \"FSGSBASE\" : HostFeatures.FEATURE_FSGSBASE,\n    \"EMMI\"     : HostFeatures.FEATURE_EMMI,\n}\n\ndef parse_hexstring(s):\n    length = 0\n    byte_data = []\n    for num in s.split(' '):\n        if s.startswith(\"0x\"):\n            num = num[2:]\n        while len(num) > 0:\n            byte_num = num[-2:]\n            byte_data.append(int(byte_num, 16))\n            length += 1\n            num = num[0:-2]\n    return length, byte_data\n\n\ndef parse_json(json_text, output_file):\n    # Default options\n    OptionMatch = Regs.REG_INVALID\n    OptionIgnore = Regs.REG_NONE\n    OptionABI = ABI.ABI_SYSTEMV\n    OptionMode = Mode.MODE_64\n    OptionHostFeatures = HostFeatures.FEATURE_ANY\n    OptionStackSize = 4096\n    OptionEntryPoint = 1\n    OptionRegData = {}\n    OptionMemoryRegions = {}\n    OptionMemoryData = {}\n    OptionEnvironmentVariables = {}\n\n    json_object = json.loads(json_text)\n    json_object = {k.upper(): v for k, v in json_object.items()}\n\n    # Begin parsing the JSON\n    if (\"MATCH\" in json_object):\n        data = json_object[\"MATCH\"]\n        if (type(data) is str):\n            data = [data]\n\n        for data_val in data:\n            data_val = data_val.upper()\n            if not (data_val in RegStringLookup):\n                sys.exit(\"Invalid Match register option\")\n            if (OptionMatch == Regs.REG_INVALID):\n                OptionMatch = Regs.REG_NONE\n            RegOption = RegStringLookup[data_val]\n            OptionMatch = OptionMatch | RegOption\n\n    if (\"IGNORE\" in json_object):\n        data = json_object[\"IGNORE\"]\n        if (type(data) is str):\n            data = [data]\n\n        for data_val in data:\n            data_val = data_val.upper()\n            if not (data_val in RegStringLookup):\n                sys.exit(\"Invalid Ignore register option\")\n            if (OptionMatch == Regs.REG_INVALID):\n                OptionMatch = Regs.REG_NONE\n            RegOption = RegStringLookup[data_val]\n            OptionIgnore = OptionIgnore | RegOption\n\n    if (\"ABI\" in json_object):\n        data = json_object[\"ABI\"]\n        data = data.upper()\n        if not (data in ABIStringLookup):\n            sys.exit(\"Invalid ABI\")\n        OptionABI = ABIStringLookup[data]\n\n    if (\"MODE\" in json_object):\n        data = json_object[\"MODE\"]\n        data = data.upper()\n        if not (data in ModeStringLookup):\n            sys.exit(\"Invalid Mode\")\n        OptionMode = ModeStringLookup[data]\n\n    if (\"HOSTFEATURES\" in json_object):\n        data = json_object[\"HOSTFEATURES\"]\n        if not (type(data) is list):\n            sys.exit(\"HostFeatures value must be list of features\")\n\n        for data_key in data:\n            data_key = data_key.upper()\n            if not (data_key in HostFeaturesLookup):\n                sys.exit(\"Invalid host feature '{}'\".format(data_key))\n\n            OptionHostFeatures |= HostFeaturesLookup[data_key]\n\n    if (\"STACKSIZE\" in json_object):\n        data = json_object[\"STACKSIZE\"]\n        OptionStackSize = int(data, 0)\n\n    if (\"ENTRYPOINT\" in json_object):\n        data = json_object[\"ENTRYPOINT\"]\n        data = int(data, 0)\n        if (data == 0):\n            sys.exit(\"Invalid entrypoint of 0\")\n        OptionEntryPoint = data\n\n    if (\"MEMORYREGIONS\" in json_object):\n        data = json_object[\"MEMORYREGIONS\"]\n        if not (type(data) is dict):\n            sys.exit(\"MemoryRegions value must be list of key:value pairs\")\n        for data_key, data_val in data.items():\n            OptionMemoryRegions[int(data_key, 0)] = int(data_val, 0)\n\n    if (\"REGDATA\" in json_object):\n        data = json_object[\"REGDATA\"]\n        if not (type(data) is dict):\n            sys.exit(\"RegData value must be list of key:value pairs\")\n        for data_key, data_val in data.items():\n            data_key = data_key.upper()\n            if not (data_key in RegStringLookup):\n                sys.exit(\"Invalid RegData register option\")\n\n            data_key_index = RegStringLookup[data_key]\n            data_key_values = []\n\n            # Create a list of values for this register as an integer\n            if (type(data_val) is list):\n                for data_key_value in data_val:\n                    data_key_values.append(int(data_key_value, 0))\n            else:\n                data_key_values.append(int(data_val, 0))\n            OptionRegData[data_key_index] = data_key_values\n\n    if (\"MEMORYDATA\" in json_object):\n        data = json_object[\"MEMORYDATA\"]\n        if not (type(data) is dict):\n            sys.exit(\"MemoryData value must be list of key:value pairs\")\n        for data_key, data_val in data.items():\n            length, byte_data = parse_hexstring(data_val)\n            OptionMemoryData[int(data_key, 0)] = (length, byte_data)\n\n    if (\"ENV\" in json_object):\n        data = json_object[\"ENV\"]\n        if not (type(data) is dict):\n            sys.exit(\"Environment variables value must be list of key:value pairs\")\n\n        for data_key, data_val in data.items():\n            OptionEnvironmentVariables[data_key] = data_val\n\n    # If Match option wasn't touched then set it to the default\n    if (OptionMatch == Regs.REG_INVALID):\n        OptionMatch = Regs.REG_NONE\n\n\n    memRegions = bytes()\n    regData = bytes()\n    memData = bytes()\n    envData = bytes()\n\n    # Write memory regions\n    for key, val in OptionMemoryRegions.items():\n        memRegions += struct.pack('Q', key)\n        memRegions += struct.pack('Q', val)\n\n    # Write Register values\n    for reg_key, reg_val in OptionRegData.items():\n        regData += struct.pack('I', len(reg_val))\n        regData += struct.pack('Q', reg_key.value)\n        for val in reg_val:\n            regData += struct.pack('Q', val)\n\n    # Write Memory data\n    for reg_key, reg_val in OptionMemoryData.items():\n        length, data = reg_val\n        memData += struct.pack('Q', reg_key) # address\n        memData += struct.pack('I', length)\n        for byte in data:\n            memData += struct.pack('B', byte)\n\n    # Write environment variables\n    for key, val in OptionEnvironmentVariables.items():\n        envData += key.encode()\n        envData += struct.pack('B', 0)\n        envData += val.encode()\n        envData += struct.pack('B', 0)\n\n    config_file = open(output_file, \"wb\")\n    config_file.write(struct.pack('Q', OptionMatch.value))\n    config_file.write(struct.pack('Q', OptionIgnore.value))\n    config_file.write(struct.pack('Q', OptionStackSize))\n    config_file.write(struct.pack('Q', OptionEntryPoint))\n    config_file.write(struct.pack('I', OptionABI.value))\n    config_file.write(struct.pack('I', OptionMode.value))\n    config_file.write(struct.pack('I', OptionHostFeatures.value))\n\n    # Total length of header, including offsets/counts below\n    headerLength = (8 * 4) + (4 * 3) + (4 * 8)\n    offset = headerLength\n\n    #  memory regions offset/count\n    config_file.write(struct.pack('I', offset))\n    config_file.write(struct.pack('I', len(OptionMemoryRegions)))\n    offset += len(memRegions)\n\n    # register values offset/count\n    config_file.write(struct.pack('I', offset))\n    config_file.write(struct.pack('I', len(OptionRegData)))\n    offset += len(regData)\n\n    # memory data offset/count\n    config_file.write(struct.pack('I', offset))\n    config_file.write(struct.pack('I', len(OptionMemoryData)))\n    offset += len(memData)\n\n    # environment data offset/count\n    config_file.write(struct.pack('I', offset))\n    config_file.write(struct.pack('I', len(OptionEnvironmentVariables)))\n    offset += len(envData)\n\n    # write out the actual data for memory regions, reg data and memory data\n    config_file.write(memRegions)\n    config_file.write(regData)\n    config_file.write(memData)\n    config_file.write(envData)\n\n    config_file.close()\n\n"
  },
  {
    "path": "Scripts/json_ir_config_parse.py",
    "content": "import sys\nfrom json_config_parse import parse_json\n\nif (len(sys.argv) < 3):\n    sys.exit()\n\noutput_file = sys.argv[2]\nasm_file = open(sys.argv[1], \"r\")\nasm_text = asm_file.read()\nasm_file.close()\n\njson_text = asm_text.split(\";%ifdef CONFIG\")\nif (len(json_text) > 1):\n        json_text = json_text[1].split(\";%endif\")\n        if (len(json_text) > 1):\n            json_text = json_text[0].strip()\n            # We need to walk each line of text and remove the comment line\n            json_text = json_text.splitlines(False)\n            parsed_lines = \"\"\n            for line in json_text:\n                line = line.strip()\n                if (line[0] != ';'):\n                    sys.exit(\"Config line needs to start with a comment character ;\")\n                line = line.lstrip(\";\")\n\n                parsed_lines = parsed_lines + line + '\\n'\n\n            parsed_lines = parsed_lines.strip()\n            parse_json(parsed_lines, output_file)\n"
  },
  {
    "path": "Scripts/reformat.sh",
    "content": "#!/bin/sh -e\n\n# Save current directory\nDIR=$(pwd)\n\n# Parse arguments\nCHANGED_ONLY=false\nTARGET_DIR=\"\"\n\nwhile [ $# -gt 0 ]; do\n    case $1 in\n        --changed) # Only reformat changed files (staged and unstaged)\n            CHANGED_ONLY=true\n            shift\n            ;;\n        *)\n            TARGET_DIR=$1\n            shift\n            ;;\n    esac\ndone\n\n# Change to the directory passed as argument if any\nif [ -n \"$TARGET_DIR\" ]; then\n    cd \"$TARGET_DIR\"\nfi\n\n# Reformat files\nif [ \"$CHANGED_ONLY\" = true ]; then\n    # Check for unstaged deletions\n    if git ls-files -d | head -1 | grep -q .; then\n        echo \"Error: Unstaged deletions detected. Please stage or discard deletions before formatting.\"\n        exit 1\n    fi\n\n    CHANGED_FILES=$(git ls-files -m '*.cpp' '*.h' '*.inl')\n    if [ -n \"$CHANGED_FILES\" ]; then\n        echo \"$CHANGED_FILES\" | xargs -d '\\n' -n 1 -P \"$(nproc)\" clang-format-19 -i\n    else\n        echo \"No changed files to format.\"\n    fi\nelse\n    # Reformat whole tree (original behavior)\n    git ls-files -z '*.cpp' '*.h' '*.inl' | xargs -0 -n 1 -P \"$(nproc)\" clang-format-19 -i\nfi\n\ncd \"$DIR\"\n"
  },
  {
    "path": "Scripts/testharness_runner.py",
    "content": "#!/usr/bin/python3\nimport sys\nimport subprocess\nfrom os import path\nfrom shutil import which\n\n# Args: <Known Failures file> <Known Failures Type File> <DisabledTestsFile> <DisabledTestsTypeFile> <DisabledTestsRunnerFile> <TestName> <FullTestName> <Test Harness Executable> <Args>...\n\nif (len(sys.argv) < 8):\n    sys.exit()\n\nknown_failures = {}\ndisabled_tests = {}\nknown_failures_file = sys.argv[1]\nknown_failures_type_file = sys.argv[2]\ndisabled_tests_file = sys.argv[3]\ndisabled_tests_type_file = sys.argv[4]\ndisabled_tests_runner_file = sys.argv[5]\n\ncurrent_test = sys.argv[6]\nfull_test_name = sys.argv[7]\nrunner = sys.argv[8]\nargs_start_index = 9\n\n# Open the known failures file and add it to a dictionary\nwith open(known_failures_file) as kff:\n    for line in kff:\n        known_failures[line.strip()] = 1\n\nif path.exists(known_failures_type_file):\n    with open(known_failures_type_file) as dtf:\n        for line in dtf:\n            known_failures[line.strip()] = 1\n\nwith open(disabled_tests_file) as dtf:\n    for line in dtf:\n        disabled_tests[line.strip()] = 1\n\nif path.exists(disabled_tests_type_file):\n    with open(disabled_tests_type_file) as dtf:\n        for line in dtf:\n            disabled_tests[line.strip()] = 1\n\nif path.exists(disabled_tests_runner_file):\n    with open(disabled_tests_runner_file) as dtf:\n        for line in dtf:\n            disabled_tests[line.strip()] = 1\n\nRunnerArgs = [\"catchsegv\", runner]\n\nif which(\"catchsegv\") is None:\n    RunnerArgs.pop(0)\n# Add the rest of the arguments\nfor i in range(len(sys.argv) - args_start_index):\n    RunnerArgs.append(sys.argv[args_start_index + i])\n\nif (disabled_tests.get(current_test)):\n    # This error code tells ctest that the test was skipped\n    sys.exit(125)\n\n# Run the test and wait for it to end to get the result\nProcess = subprocess.Popen(RunnerArgs)\nProcess.wait()\nResultCode = Process.returncode\n\n# Check for known failures - try full test name first, then partial test name\nis_known_failure = known_failures.get(full_test_name) or known_failures.get(current_test)\n\nif (is_known_failure):\n    # If the test is on the known failures list\n    if (ResultCode):\n        # If we errored but are on the known failures list then \"pass\" the test\n        sys.exit(0)\n    else:\n        # If we didn't error but are in the known failure list then we need to fail the test\n        sys.exit(1)\nelse:\n    # Just return the result code if we don't have this test as a known failure\n    sys.exit(ResultCode)\n"
  },
  {
    "path": "Scripts/update_instcountci.sh",
    "content": "#!/bin/sh -e\n\n# Make sure we actually build\nninja\n\n# Run tests, ignoring the retval since there will be changes.\nninja instcountci_tests || true\n\n# Now we can update.\nninja instcountci_update_tests\n\n# Commit the result in bulk.\ngit add -u :/unittests/InstructionCountCI/*.json\ngit commit -sm \"InstCountCI: Update\"\n"
  },
  {
    "path": "Source/CMakeLists.txt",
    "content": "# Disable strict aliasing for all build modes\n# See discussion in https://github.com/FEX-Emu/FEX/pull/4494#issuecomment-2800608944\n# for background context.\nadd_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-strict-aliasing>)\n\nadd_subdirectory(Common/)\nadd_subdirectory(Tools/)\n\nif (MINGW)\n  add_subdirectory(Windows/)\nendif()\n"
  },
  {
    "path": "Source/Common/ArgumentLoader.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Common/ArgumentLoader.h\"\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <stdint.h>\n\nnamespace FEX::ArgLoader {\nvoid FEX::ArgLoader::ArgLoader::PreLoad() {\n  RemainingArgs.clear();\n  ProgramArguments.clear();\n\n  // Skip argument 0, which will be the interpreter\n  for (int i = 1; i < argc; ++i) {\n    RemainingArgs.emplace_back(argv[i]);\n  }\n\n  // Put the interpreter in ProgramArguments\n  ProgramArguments.emplace_back(argv[0]);\n}\n\n} // namespace FEX::ArgLoader\n"
  },
  {
    "path": "Source/Common/ArgumentLoader.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n\nnamespace FEX::ArgLoader {\nclass ArgLoader final : public FEXCore::Config::Layer {\npublic:\n  explicit ArgLoader(int argc, char** argv)\n    : FEXCore::Config::Layer(FEXCore::Config::LayerType::LAYER_ARGUMENTS)\n    , argc {argc}\n    , argv {argv} {\n    PreLoad();\n  }\n\n  void Load() override {\n    // Intentional no-op.\n  }\n  void PreLoad();\n  fextl::vector<fextl::string> Get() {\n    return RemainingArgs;\n  }\n  fextl::vector<fextl::string> GetParsedArgs() {\n    return ProgramArguments;\n  }\n\nprivate:\n  int argc {};\n  char** argv {};\n\n  fextl::vector<fextl::string> RemainingArgs {};\n  fextl::vector<fextl::string> ProgramArguments {};\n};\n\n} // namespace FEX::ArgLoader\n"
  },
  {
    "path": "Source/Common/Async.h",
    "content": "// SPDX-License-Identifier: MIT\n/**\n * Helper framework to enable asynchronous IO operations on file descriptor objects (networking, files).\n *\n * Strongly inspired by Boost.Asio.\n */\n#pragma once\n\n#include <algorithm>\n#include <cassert>\n#include <chrono>\n#include <optional>\n#include <poll.h>\n#include <span>\n#include <utility>\n#include <vector>\n#include <unistd.h>\n\n#include <FEXCore/fextl/functional.h>\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXCore/Utils/LogManager.h>\n\nnamespace fasio {\n\nenum class error {\n  success,\n  timeout,      // User-specified timeout expired\n  eof,          // Permanently reached end of data stream (e.g. because socket connection was closed by peer)\n  invalid,      // Invalid input parameters\n  generic_errno // Read errno for details\n};\n\n/**\n * This selects which action to trigger when returning from a reactor callback.\n * The default (drop) will drop the callback so that the caller can register\n * a new one.\n */\nenum class post_callback {\n  drop,         // Drop the callback\n  repeat,       // Continue using the same callback\n  stop_reactor, // Triggers exit from run()\n};\n\n/**\n * Core event loop for asynchronous code. Corresponds to asio::io_context,\n * specialized for multiplexing file descriptors via ppoll().\n *\n * A reactor tracks a set of file descriptors and calls user-provided callbacks\n * when they become ready. For example, the callback for a network socket will\n * be called when data is ready to be reveived on the socket.\n *\n */\nstruct poll_reactor {\nprivate:\n  std::vector<pollfd> PollFDs;\n  std::optional<int> CurrentFD; // FD that is currently being processed\n\n  bool is_stopped = false;\n  int AsyncStopRequest[2] = {-1, -1};\n\n  // Maps FD to callback\n  fextl::map<int, fextl::move_only_function<post_callback(error)>> callbacks;\n\n  struct Event {\n    pollfd FD;\n    bool Erase = false;\n    bool Insert = false;\n  };\n  std::vector<Event> QueuedEvents;\n\npublic:\n  ~poll_reactor() {\n    if (AsyncStopRequest[0]) {\n      ::close(AsyncStopRequest[0]);\n      ::close(AsyncStopRequest[1]);\n    }\n  }\n\n  // Adds an internal FD to wake up and exit the reactor when stop_async() is called from any thread.\n  void enable_async_stop() {\n    ::pipe(AsyncStopRequest);\n    PollFDs.push_back(pollfd {.fd = AsyncStopRequest[0], .events = POLLHUP, .revents = 0});\n    callbacks[AsyncStopRequest[0]] = [](error) {\n      return post_callback::stop_reactor;\n    };\n  }\n\n  void stop_async() {\n    if (AsyncStopRequest[1] == -1) {\n      ERROR_AND_DIE_FMT(\"Tried to use stop_async without calling enable_async_stop during setup\");\n    }\n    // Wake up run() thread by closing this pipe endpoint\n    ::close(AsyncStopRequest[1]);\n  }\n\n  void cleanup() {\n    callbacks.clear();\n  }\n\n  [[nodiscard]]\n  bool stopped() const {\n    return is_stopped;\n  }\n\n  error run_one(std::optional<std::chrono::nanoseconds> Timeout = std::nullopt) {\n    // Process events queued before entering wait loop\n    update_fd_list();\n\n    timespec ts = to_timespec(Timeout.value_or(std::chrono::nanoseconds {0}));\n\n    // ppoll may return EINTR/EAGAIN, so a loop is used here. Normally, we return in the first iteration.\n    while (true) {\n      int Result = ::ppoll(PollFDs.data(), PollFDs.size(), Timeout ? &ts : nullptr, nullptr);\n\n      if (Result < 0) {\n        if (errno == EINTR || errno == EAGAIN) {\n          continue;\n        }\n        return error::generic_errno;\n      } else if (Result == 0) {\n        return error::timeout;\n      } else {\n        // Walk the FDs and see if we got any results\n        for (auto& ActiveFD : PollFDs) {\n          if (ActiveFD.revents == 0) {\n            continue;\n          }\n          if (Result-- == 0) {\n            break;\n          }\n\n          if (ActiveFD.revents & POLLIN) {\n            // NOTE: For sockets, this is triggered on close, too. Pipes only report POLLHUP, however.\n            CurrentFD = ActiveFD.fd;\n\n            auto Callback = std::move(callbacks[ActiveFD.fd]);\n            if (!Callback) {\n              ERROR_AND_DIE_FMT(\"Data available for reading on FD {} but no read callback registered\", ActiveFD.fd);\n            }\n            auto Ret = Callback(error::success);\n            if (Ret == post_callback::repeat) {\n              callbacks[ActiveFD.fd] = std::move(Callback);\n            } else if (Ret == post_callback::drop) {\n              // If no new callback was registered, drop the FD from the list and skip any remaining events\n              if (!callbacks.contains(ActiveFD.fd)) {\n                QueuedEvents.push_back(Event {.FD = {.fd = ActiveFD.fd}, .Erase = true});\n                ActiveFD.revents = 0;\n              }\n            } else if (Ret == post_callback::stop_reactor) {\n              is_stopped = true;\n            }\n            CurrentFD.reset();\n          }\n          if (ActiveFD.revents & (POLLHUP | POLLERR | POLLNVAL | POLLRDHUP)) {\n            auto Callback = std::move(callbacks[ActiveFD.fd]);\n            if (Callback) {\n              is_stopped |= (Callback(error::eof) == post_callback::stop_reactor);\n            }\n            // Error or hangup, erase the socket from our list\n            QueuedEvents.push_back(Event {.FD = {.fd = ActiveFD.fd}, .Erase = true});\n          }\n\n          ActiveFD.revents = 0;\n        }\n\n        if (is_stopped) {\n          cleanup();\n          return error::success;\n        }\n\n        update_fd_list();\n        return error::success;\n      }\n    }\n  }\n\n  error run(std::optional<std::chrono::nanoseconds> Timeout = std::nullopt) {\n    while (true) {\n      auto Result = run_one(Timeout);\n      if (Result != error::success || is_stopped) {\n        cleanup();\n        return Result;\n      }\n    }\n  }\n\n  void bind_handler(pollfd FD, fextl::move_only_function<post_callback(error)> Callback) {\n    [[maybe_unused]] auto Previous = std::exchange(callbacks[FD.fd], std::move(Callback));\n    assert(!Previous && \"May not queue multiple async operations\");\n\n    // Add the FD to the poll list if it's not already contained\n    if (CurrentFD != FD.fd && PollFDs.end() == std::find_if(PollFDs.begin(), PollFDs.end(), [&](auto& Prev) { return FD.fd == Prev.fd; })) {\n      QueuedEvents.push_back(Event {.FD = FD, .Insert = true});\n    }\n  }\n\nprivate:\n  timespec to_timespec(std::chrono::nanoseconds Duration) {\n    timespec Timespec {};\n    auto Seconds = std::chrono::duration_cast<std::chrono::seconds>(Duration);\n    Timespec.tv_sec = Seconds.count();\n    Timespec.tv_nsec = std::chrono::duration_cast<std::chrono::nanoseconds>(Duration - Seconds).count();\n    return Timespec;\n  }\n\n  void update_fd_list() {\n    for (auto& Event : QueuedEvents) {\n      if (Event.Erase) {\n        std::iter_swap(std::find_if(PollFDs.begin(), PollFDs.end(), [&](auto& FD) { return FD.fd == Event.FD.fd; }), std::prev(PollFDs.end()));\n        PollFDs.pop_back();\n        callbacks.erase(Event.FD.fd);\n      }\n\n      if (Event.Insert) {\n        PollFDs.push_back(Event.FD);\n      }\n    }\n    QueuedEvents.clear();\n  }\n};\n\n/**\n * Corresponds to asio::mutable_buffer.\n */\nstruct mutable_buffer {\n  std::span<std::byte> Data;\n  mutable_buffer* Next = nullptr;\n\n  // Optional FD to send/receive via ancillary buffer.\n  // This may only be used with non-empty data, and there may only be up to one FD per buffer chain\n  std::optional<int*> FD;\n\n  size_t size() const {\n    size_t Ret = 0;\n    const mutable_buffer* Current = this;\n    do {\n      Ret += Current->Data.size_bytes();\n      Current = Current->Next;\n    } while (Current);\n\n    if (Ret == 0) {\n      assert(!FD);\n    }\n    return Ret;\n  }\n\n  int consume_fd() {\n    assert(FD);\n    return **std::exchange(FD, std::nullopt);\n  }\n\n  mutable_buffer& operator+=(size_t NumBytes) {\n    mutable_buffer* Current = this;\n    while (Current->Next && NumBytes >= Current->Data.size_bytes()) {\n      NumBytes -= Data.size_bytes();\n      Current = Current->Next;\n      assert(Current->FD == std::nullopt);\n    }\n    auto FD = std::exchange(this->FD, std::nullopt);\n    *this = *Current;\n    Data = Data.subspan(std::min(Data.size_bytes(), NumBytes));\n    this->FD = FD;\n    return *Current;\n  }\n\n  size_t count_chunks() const {\n    size_t Ret = 1;\n    const mutable_buffer* Current = this;\n    while (Current->Next) {\n      Current = Current->Next;\n      ++Ret;\n    }\n    return Ret;\n  }\n};\n\ninline mutable_buffer Chained(std::span<mutable_buffer> Buffers) {\n  for (size_t i = 0; i + 1 < Buffers.size(); ++i) {\n    Buffers[i].Next = &Buffers[i + 1];\n  }\n  return Buffers[0];\n}\n\n/**\n * Corresponds to asio::dynamic_vector_buffer.\n */\nstruct dynamic_vector_buffer {\n  fextl::vector<std::byte>& Data;\n\n  // Maximum number of bytes to grow to\n  size_t max_size = Data.capacity();\n};\n\n/**\n * Asynchronously reads data from the given stream until MatchPredicate reports a match. The read\n * is queued to the stream's reactor and will progress whenever data is available.\n *\n * MatchPredicate must have the signature pair<Iter, bool>(Iter, Iter):\n * - The input iterators provide the range of new data bytes\n * - The returned boolean indicates if a match was found\n * - The returned iterator is the match location or the location at which to continue testing after the next read\n *\n * The read data will be appended to Buffers. Data past the match returned from the last read data will also be included.\n *\n * Corresponds to asio::async_read_until.\n */\ntemplate<typename AsyncReadStream, typename MatchPredicate, typename OnComplete>\nrequires std::is_invocable_r_v<void, OnComplete, error, size_t>\nvoid async_read_until(AsyncReadStream& Stream, dynamic_vector_buffer Buffers, MatchPredicate Predicate, OnComplete UserCallback) {\n  struct Callback {\n    size_t BeginPos;\n    size_t EndPos;\n    AsyncReadStream& Stream;\n    dynamic_vector_buffer Buffers;\n    MatchPredicate Predicate;\n    OnComplete UserCallback;\n\n    void operator()(error Err, size_t BytesRead, std::optional<int> FD) {\n      if (Err != error::success) {\n        UserCallback(Err, 0);\n        return;\n      }\n\n      // Start with the predicate check to avoid fetching data unnecessarily\n      EndPos += BytesRead;\n      if (EndPos != BeginPos) {\n        auto Begin = Buffers.Data.begin() + BeginPos;\n        auto End = Buffers.Data.begin() + EndPos;\n        auto [It, Found] = Predicate(Begin, End);\n        BeginPos = It - Buffers.Data.begin();\n        if (Found) {\n          Buffers.Data.resize(EndPos); // Shrink down to size of data actually received\n          UserCallback(error::success, BeginPos);\n          return;\n        }\n      }\n\n      // Fill the entire remaining capacity, or resize for a minimum of 512 bytes\n      auto BytesToRead = std::max<size_t>(std::min(Buffers.Data.capacity(), Buffers.max_size) - EndPos, 512);\n      if (Buffers.Data.size() + BytesToRead > Buffers.max_size) {\n        ERROR_AND_DIE_FMT(\"Out of buffer space\");\n      }\n\n      Buffers.Data.resize(EndPos + BytesToRead);\n\n      // Queue data read.\n      // On completion, Reader will check if enough data was received and will queue more reads if needed.\n      Stream.async_read_some(mutable_buffer {std::span {Buffers.Data}}, *this);\n    }\n  };\n\n  // Check existing data for a predicate match, then initiate async reading if necessary\n  Callback {0, Buffers.Data.size(), Stream, Buffers, std::move(Predicate), std::move(UserCallback)}(error::success, 0, std::nullopt);\n}\n\nusing read_callback = fextl::move_only_function<void(error, size_t, std::optional<int>)>;\n\n/**\n * Synchronously reads fixed-length data from the given Stream.\n *\n * The length is inferred from the size of the output buffer(s).\n *\n * Corresponds to asio::read.\n */\ntemplate<typename AsyncReadStream>\nstd::size_t read(AsyncReadStream& Stream, mutable_buffer Buffers, error& ec) {\n  size_t TotalBytesRead = 0;\n  while (Buffers.size() != 0 || Buffers.FD) {\n    auto BytesRead = Stream.read_some(Buffers, ec);\n    TotalBytesRead += BytesRead;\n    if (Buffers.FD) {\n      LOGMAN_THROW_A_FMT(**Buffers.FD != -1, \"Receiver requested a file descriptor but none was sent\");\n      (void)Buffers.consume_fd();\n    }\n    Buffers += BytesRead;\n    if (ec != error::success) {\n      return TotalBytesRead;\n    }\n  }\n  ec = error::success;\n  return TotalBytesRead;\n}\n\n/**\n * Synchronously writes fixed-length data to the given Stream.\n *\n * The length is inferred from the size of the input buffer(s).\n *\n * Corresponds to asio::write.\n */\ntemplate<typename AsyncReadStream>\nstd::size_t write(AsyncReadStream& Stream, mutable_buffer Buffers, error& ec) {\n  size_t TotalBytesWritten = 0;\n  while (Buffers.size() != 0 || Buffers.FD) {\n    auto BytesWritten = Stream.write_some(Buffers, ec);\n    TotalBytesWritten += BytesWritten;\n    if (Buffers.FD) {\n      (void)Buffers.consume_fd();\n    }\n    Buffers += BytesWritten;\n    if (ec != error::success) {\n      return TotalBytesWritten;\n    }\n  }\n  ec = error::success;\n  return TotalBytesWritten;\n}\n\n/**\n * Owning RAII wrapper around a file descriptor.\n *\n * Corresponds to asio::posix::descriptor.\n */\nstruct posix_descriptor {\n  poll_reactor* Reactor = nullptr;\n  int FD = -1;\n\n  posix_descriptor(poll_reactor& Reactor, int FD)\n    : Reactor(&Reactor)\n    , FD(FD) {}\n\n  posix_descriptor(posix_descriptor&& Other)\n    : Reactor(Other.Reactor)\n    , FD(std::exchange(Other.FD, -1)) {}\n\n  posix_descriptor& operator=(posix_descriptor&& Other) {\n    if (&Other == this) {\n      return *this;\n    }\n    posix_descriptor::~posix_descriptor();\n    Reactor = Other.Reactor;\n    FD = std::exchange(Other.FD, -1);\n    return *this;\n  }\n\n  ~posix_descriptor() {\n    if (FD != -1) {\n      ::close(FD);\n    }\n  }\n\n  /**\n   * Wait until there is data available to read on this object, then execute the given callback\n   */\n  template<typename Fn>\n  requires std::is_invocable_r_v<post_callback, Fn, error>\n  void async_wait(Fn Callback) {\n    Reactor->bind_handler(\n      pollfd {\n        .fd = FD,\n        .events = POLLIN,\n        .revents = 0,\n      },\n      std::move(Callback));\n  }\n};\n\n} // namespace fasio\n"
  },
  {
    "path": "Source/Common/AsyncNet.h",
    "content": "// SPDX-License-Identifier: MIT\n/**\n * Socket wrappers for asynchronous programming with fasio\n */\n#pragma once\n\n#include <Common/Async.h>\n\n#include <sys/socket.h>\n#include <sys/un.h>\n\nnamespace fasio {\n\n/**\n * Non-owning wrapper around a socket.\n *\n * Corresponds to asio::local::stream_protocol::socket.\n */\nstruct tcp_socket {\n  poll_reactor* Reactor = nullptr;\n  int FD;\n\n  // Constructor for synchronous and asynchronous operation\n  tcp_socket(poll_reactor& Reactor_, int FD_)\n    : Reactor(&Reactor_)\n    , FD(FD_) {}\n\n  // Constructor for purely synchronous operation\n  tcp_socket(int FD_)\n    : FD(FD_) {}\n\n  /**\n   * Queues an asynchronous operation that will run the completion callback\n   * once at least one byte of data was received\n   */\n  template<typename OnComplete>\n  requires std::is_invocable_r_v<void, OnComplete, error, size_t, std::optional<int>>\n  void async_read_some(mutable_buffer Buffers, OnComplete UserCallback) {\n    auto Callback = [Buffers, Socket = FD, UserCallback = std::move(UserCallback)](error ec) mutable {\n      if (ec != error::success) {\n        UserCallback(ec, 0, std::nullopt);\n        return post_callback::drop;\n      }\n\n      auto BytesRead = read_some_from_fd(Buffers, ec, Socket);\n      if (ec != error::success) {\n        UserCallback(ec, BytesRead, std::nullopt);\n      } else {\n        UserCallback(ec, BytesRead, Buffers.FD ? std::optional {**Buffers.FD} : std::nullopt);\n      }\n      return post_callback::drop;\n    };\n\n    Reactor->bind_handler(\n      pollfd {\n        .fd = FD,\n        .events = POLLIN | POLLPRI | POLLRDHUP,\n        .revents = 0,\n      },\n      std::move(Callback));\n  }\n\n  /**\n   * Blocks until at least one byte of data was received\n   */\n  size_t read_some(const mutable_buffer& Buffers, error& ec) {\n    return read_some_from_fd(Buffers, ec, FD);\n  }\n\n  /**\n   * Blocks until at least one byte of data was sent\n   */\n  size_t write_some(const mutable_buffer& Buffers, error& ec) {\n    auto iov = (iovec*)alloca(sizeof(mutable_buffer) * Buffers.count_chunks());\n    decltype(msghdr::msg_iovlen) NumIovs = 0;\n    for (auto Buffer = &Buffers; Buffer; Buffer = Buffer->Next) {\n      iov[NumIovs].iov_base = Buffer->Data.data();\n      iov[NumIovs].iov_len = Buffer->Data.size_bytes();\n      ++NumIovs;\n    }\n    msghdr msg {\n      .msg_name = nullptr,\n      .msg_namelen = 0,\n      .msg_iov = iov,\n      .msg_iovlen = NumIovs,\n    };\n\n    // Setup the ancillary buffer. This is where we will be getting pipe FDs\n    // We only need 4 bytes for the FD\n    constexpr size_t CMSG_SIZE = CMSG_SPACE(sizeof(int));\n    alignas(cmsghdr) uint8_t AncBuf[CMSG_SIZE];\n\n    if (Buffers.FD) {\n      // Enable ancillary buffer\n      msg.msg_control = AncBuf;\n      msg.msg_controllen = CMSG_SIZE;\n\n      // Now we need to setup the ancillary buffer data. We are only sending an FD\n      cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);\n      cmsg->cmsg_len = CMSG_LEN(sizeof(int));\n      cmsg->cmsg_level = SOL_SOCKET;\n      cmsg->cmsg_type = SCM_RIGHTS;\n\n      // We are giving the daemon the write side of the pipe\n      memcpy(CMSG_DATA(cmsg), Buffers.FD.value(), sizeof(int));\n    }\n\n    ssize_t Ret;\n    do {\n      Ret = ::sendmsg(FD, &msg, 0);\n    } while (Ret < 0 && (errno == EINTR || errno == EAGAIN));\n    if (Ret < 0) {\n      ec = error::generic_errno;\n      return 0;\n    }\n    ec = error::success;\n    return Ret;\n  }\n\nprivate:\n  static size_t read_some_from_fd(const mutable_buffer& Buffers, error& ec, int FD) {\n    auto iov = (iovec*)alloca(sizeof(mutable_buffer) * Buffers.count_chunks());\n    decltype(msghdr::msg_iovlen) NumIovs = 0;\n    for (auto Buffer = &Buffers; Buffer; Buffer = Buffer->Next) {\n      iov[NumIovs].iov_base = Buffer->Data.data();\n      iov[NumIovs].iov_len = Buffer->Data.size_bytes();\n      ++NumIovs;\n    }\n    msghdr msg {\n      .msg_name = nullptr,\n      .msg_namelen = 0,\n      .msg_iov = iov,\n      .msg_iovlen = NumIovs,\n    };\n\n    // If requested, set up a 4-byte ancillary buffer for receiving a file descriptor\n    constexpr size_t CMSG_SIZE = CMSG_SPACE(sizeof(int));\n    alignas(cmsghdr) uint8_t AncBuf[CMSG_SIZE];\n\n    if (Buffers.FD) {\n      // Enable ancillary buffer\n      msg.msg_control = AncBuf;\n      msg.msg_controllen = CMSG_SIZE;\n    }\n\n    ssize_t BytesRead;\n    do {\n      BytesRead = ::recvmsg(FD, &msg, 0);\n    } while (BytesRead < 0 && (errno == EINTR || errno == EAGAIN));\n    if (BytesRead < 0) {\n      if (errno != 0) {\n        ec = error::generic_errno;\n        return 0;\n      }\n    } else if (BytesRead == 0) {\n      ec = error::eof;\n      return 0;\n    }\n\n    struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);\n    if (Buffers.FD &&\n        (cmsg == nullptr || cmsg->cmsg_len != CMSG_LEN(sizeof(int)) || cmsg->cmsg_level != SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS)) {\n      // Not a failure since some data was read for the main message\n      **Buffers.FD = -1;\n      ec = error::success;\n      return BytesRead;\n    }\n\n    if (Buffers.FD) {\n      memcpy(*Buffers.FD, CMSG_DATA(cmsg), sizeof(FD));\n    }\n\n    ec = error::success;\n    return BytesRead;\n  }\n};\n\n/**\n * Owning wrapper around a server socket that listens for connections after\n * creation. Clients can be accepted asynchronously using async_accept().\n *\n * Corresponds to asio::local::stream_protocol::acceptor.\n */\nstruct tcp_acceptor {\n  poll_reactor& Reactor;\n  int FD;\n\n  tcp_acceptor(tcp_acceptor&& other)\n    : Reactor(other.Reactor)\n    , FD(other.FD) {\n    other.FD = -1;\n  }\n\n  ~tcp_acceptor() {\n    if (FD != -1) {\n      ::close(FD);\n    }\n  }\n\n  tcp_acceptor& operator=(tcp_acceptor&& other) {\n    FD = std::exchange(other.FD, -1);\n    return *this;\n  }\n\n  static std::optional<tcp_acceptor> create(poll_reactor& Reactor, bool abstract, std::string_view Name, int MaxPending = SOMAXCONN) {\n    // Create the initial unix socket\n    int FD = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);\n    if (FD == -1) {\n      return {};\n    }\n\n    sockaddr_un addr {};\n    addr.sun_family = AF_UNIX;\n\n    if (Name.size() > sizeof(addr.sun_path) - 1) {\n      ERROR_AND_DIE_FMT(\"Invalid FEXServer socket name: {}\", Name);\n    }\n\n    auto NameEnd = addr.sun_path;\n    if (!abstract) {\n      // sun_path is null-terminated\n      NameEnd = std::copy(Name.begin(), Name.end(), addr.sun_path);\n      *NameEnd++ = 0;\n    } else {\n      // Abstract AF_UNIX sockets start with \\0 but aren't null-terminated\n      addr.sun_path[0] = 0;\n      NameEnd = std::copy(Name.begin(), Name.end(), addr.sun_path + 1);\n    }\n\n    // Bind the socket to the path\n    int Result = bind(FD, reinterpret_cast<sockaddr*>(&addr), sizeof(addr.sun_family) + (NameEnd - addr.sun_path));\n    if (Result == -1) {\n      ::close(FD);\n      return {};\n    }\n\n    Result = ::listen(FD, MaxPending);\n    if (Result == -1) {\n      ::close(FD);\n      return {};\n    }\n\n    return tcp_acceptor(Reactor, FD);\n  }\n\n  void async_accept(fextl::move_only_function<post_callback(error, std::optional<tcp_socket>)> OnAccept) {\n    Reactor.bind_handler(\n      {\n        .fd = FD,\n        .events = POLLIN,\n        .revents = 0,\n      },\n      [ServerFD = FD, &Reactor = Reactor, OnAccept = std::move(OnAccept)](error ec) mutable {\n        if (ec != error::success) {\n          return post_callback::drop;\n        }\n\n        sockaddr_storage Addr {};\n        socklen_t AddrSize {};\n        int NewFD;\n        do {\n          NewFD = ::accept(ServerFD, reinterpret_cast<sockaddr*>(&Addr), &AddrSize);\n        } while (NewFD < 0 && (errno == EINTR || errno == EAGAIN));\n        if (NewFD < 0) {\n          return OnAccept(error::generic_errno, std::nullopt);\n        }\n\n        return OnAccept(error::success, tcp_socket {Reactor, NewFD});\n      });\n  }\n\nprivate:\n  tcp_acceptor(poll_reactor& Reactor_, int FD_)\n    : Reactor(Reactor_)\n    , FD(FD_) {}\n};\nstatic_assert(!std::is_copy_constructible_v<tcp_acceptor>);\nstatic_assert(!std::is_copy_assignable_v<tcp_acceptor>);\n\n} // namespace fasio\n"
  },
  {
    "path": "Source/Common/CMakeLists.txt",
    "content": "add_subdirectory(cpp-optparse/)\n\nset(NAME Common)\nset(SRCS\n  Config.cpp\n  CPUInfo.cpp\n  ArgumentLoader.cpp\n  HostFeatures.cpp\n  JSONPool.cpp\n  SHMStats.cpp\n  VolatileMetadata.cpp)\n\nif (NOT MINGW)\n  list(APPEND SRCS\n    FEXServerClient.cpp\n    FileFormatCheck.cpp\n    Linux/SBRKAllocations.cpp)\nendif()\n\nadd_library(${NAME} STATIC ${SRCS})\ntarget_link_libraries(${NAME} FEXCore_Base cpp-optparse tiny-json::tiny-json FEXHeaderUtils range-v3::range-v3)\ntarget_include_directories(${NAME} PRIVATE ${CMAKE_BINARY_DIR}/generated)\n\nset_target_properties(${NAME} PROPERTIES\n  C_VISIBILITY_PRESET hidden\n  CXX_VISIBILITY_PRESET hidden\n  VISIBILITY_INLINES_HIDDEN TRUE)\n"
  },
  {
    "path": "Source/Common/CPUInfo.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXHeaderUtils/Filesystem.h>\n\n#include <fmt/compile.h>\n#include <fmt/format.h>\n\n#include <cstddef>\n#include <cstdint>\n#ifdef _WIN32\n#include <thread>\n#else\n#include <linux/limits.h>\n#endif\n\nnamespace FEX::CPUInfo {\n#ifndef _WIN32\nuint32_t CalculateNumberOfCPUs() {\n  constexpr auto parse_string = FMT_COMPILE(\"/sys/devices/system/cpu/cpu{}\");\n  constexpr auto max_parse_size = ::fmt::formatted_size(parse_string, UINT32_MAX);\n  char Tmp[max_parse_size];\n  size_t CPUs = 1;\n\n  for (;; ++CPUs) {\n    auto Size = fmt::format_to_n(Tmp, max_parse_size, parse_string, CPUs);\n    Tmp[Size.size] = 0;\n    if (!FHU::Filesystem::Exists(Tmp)) {\n      break;\n    }\n  }\n\n  return CPUs;\n}\n#else\nuint32_t CalculateNumberOfCPUs() {\n  // May not return correct number of cores if some are parked.\n  return std::thread::hardware_concurrency();\n}\n#endif\n} // namespace FEX::CPUInfo\n"
  },
  {
    "path": "Source/Common/CPUInfo.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <cstdint>\n\nnamespace FEX::CPUInfo {\n/**\n * @brief Calculate the number of CPUs in the system regardless of affinity mask.\n *\n * @return The number of CPUs in the system.\n */\nuint32_t CalculateNumberOfCPUs();\n} // namespace FEX::CPUInfo\n"
  },
  {
    "path": "Source/Common/Config.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Common/ArgumentLoader.h\"\n#include \"Common/Config.h\"\n#include \"Common/JSONPool.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/FileLoading.h>\n#include <FEXHeaderUtils/Filesystem.h>\n#include <FEXHeaderUtils/SymlinkChecks.h>\n\n#include <cstring>\n#include <fmt/format.h>\n#include <functional>\n#ifndef _WIN32\n#include <linux/limits.h>\n#include <pwd.h>\n#endif\n#include <optional>\n#include <utility>\n#include <tiny-json.h>\n\n#include <range/v3/view/split.hpp>\n#include <range/v3/view/transform.hpp>\n\nnamespace FEX::Config {\nnamespace JSON {\n  static void LoadJSonConfig(const fextl::string& Config, std::function<void(const char* Name, const char* ConfigSring)> Func) {\n    fextl::vector<char> Data;\n    if (!FEXCore::FileLoading::LoadFile(Data, Config)) {\n      return;\n    }\n\n    FEX::JSON::JsonAllocator Pool {};\n    const json_t* json = FEX::JSON::CreateJSON(Data, Pool);\n\n    if (!json) {\n      ERROR_AND_DIE_FMT(\"Failed to parse JSON from file '{}' - invalid JSON format\", Config);\n    }\n\n    const json_t* ConfigList = json_getProperty(json, \"Config\");\n\n    if (!ConfigList) {\n      // This is a non-error if the configuration file exists but no Config section\n      return;\n    }\n\n    for (const json_t* ConfigItem = json_getChild(ConfigList); ConfigItem != nullptr; ConfigItem = json_getSibling(ConfigItem)) {\n      const char* ConfigName = json_getName(ConfigItem);\n      const char* ConfigString = json_getValue(ConfigItem);\n\n      if (!ConfigName) {\n        LogMan::Msg::EFmt(\"JSON file '{}': Couldn't get config name for an item\", Config);\n        return;\n      }\n\n      if (!ConfigString) {\n        LogMan::Msg::EFmt(\"JSON file '{}': Couldn't get value for config item '{}'\", Config, ConfigName);\n        return;\n      }\n\n      Func(ConfigName, ConfigString);\n    }\n  }\n} // namespace JSON\n\nstatic constexpr std::pair<std::string_view, FEXCore::Config::ConfigOption> ConfigLookup[] {\n#define OPT_BASE(type, group, enum, json, default) {#json, FEXCore::Config::ConfigOption::CONFIG_##enum},\n#include <FEXCore/Config/ConfigValues.inl>\n};\n\nstatic char* SaveLayerToJSON(char* JsonBuffer, const FEXCore::Config::Layer* Layer) {\n  JsonBuffer = json_objOpen(JsonBuffer, \"Config\");\n  for (auto& it : Layer->GetOptionMap()) {\n    std::string_view Name {};\n    for (auto& name_it : ConfigLookup) {\n      if (name_it.second == it.first) {\n        Name = name_it.first;\n        break;\n      }\n    }\n    if (std::holds_alternative<fextl::string>(it.second)) {\n      JsonBuffer = json_str(JsonBuffer, Name.data(), std::get<fextl::string>(it.second).c_str());\n    } else if (std::holds_alternative<FEXCore::Config::StringArrayType>(it.second)) {\n      for (auto& var : std::get<FEXCore::Config::StringArrayType>(it.second)) {\n        JsonBuffer = json_str(JsonBuffer, Name.data(), var.c_str());\n      }\n    } else {\n      LogMan::Msg::AFmt(\"Trying to store config with pre-converted type\");\n    }\n  }\n  return json_objClose(JsonBuffer);\n}\n\nvoid SaveLayerToJSON(const fextl::string& Filename, const FEXCore::Config::Layer* Layer, const fextl::unordered_map<fextl::string, bool>& HostLibs) {\n  char Buffer[4096];\n  char* Dest {};\n  Dest = json_objOpen(Buffer, nullptr);\n\n  Dest = SaveLayerToJSON(Dest, Layer);\n\n  Dest = json_objOpen(Dest, \"ThunksDB\");\n  for (auto& [Name, Enabled] : HostLibs) {\n    Dest = json_int(Dest, Name.c_str(), Enabled);\n  }\n  Dest = json_objClose(Dest);\n\n  Dest = json_objClose(Dest);\n  json_end(Dest);\n\n  LogMan::Throw::AFmt(Dest <= std::end(Buffer), \"Exceeded JSON buffer size\");\n\n  auto File = FEXCore::File::File(Filename.c_str(),\n                                  FEXCore::File::FileModes::WRITE | FEXCore::File::FileModes::CREATE | FEXCore::File::FileModes::TRUNCATE);\n\n  if (File.IsValid()) {\n    File.Write(Buffer, strlen(Buffer));\n  }\n}\n\nvoid SaveLayerToJSON(const fextl::string& Filename, const FEXCore::Config::Layer* Layer) {\n  fextl::unordered_map<fextl::string, bool> HostLibsDB;\n\n  // Load existing ThunksDB entry to persist it\n  {\n    fextl::vector<char> FileData;\n    if (!FEXCore::FileLoading::LoadFile(FileData, Filename)) {\n      goto WriteConfig;\n    }\n\n    // Find bounds of previously existing Config entry (if any)\n    FEX::JSON::JsonAllocator Pool {};\n    const json_t* json = FEX::JSON::CreateJSON(FileData, Pool);\n    if (!json) {\n      goto WriteConfig;\n    }\n\n    const json_t* ThunksDB = json_getProperty(json, \"ThunksDB\");\n    if (!ThunksDB) {\n      goto WriteConfig;\n    }\n\n    for (const json_t* Item = json_getChild(ThunksDB); Item != nullptr; Item = json_getSibling(Item)) {\n      HostLibsDB.emplace(json_getName(Item), (json_getInteger(Item) != 0));\n    }\n  }\n\nWriteConfig:\n  SaveLayerToJSON(Filename, Layer, HostLibsDB);\n}\n\n// Application loaders\nclass OptionMapper : public FEXCore::Config::Layer {\npublic:\n  explicit OptionMapper(FEXCore::Config::LayerType Layer);\n\nprotected:\n  void MapNameToOption(const char* ConfigName, const char* ConfigString);\n  void SetCurrentConfigFile(const fextl::string& Filename) {\n    CurrentConfigFile = Filename;\n  }\n  fextl::string CurrentConfigFile;\n};\n\nclass MainLoader final : public OptionMapper {\npublic:\n  explicit MainLoader(FEXCore::Config::LayerType Type);\n  explicit MainLoader(fextl::string ConfigFile);\n  explicit MainLoader(FEXCore::Config::LayerType Type, std::string_view ConfigFile);\n\n  void Load() override;\n\nprivate:\n  fextl::string Config;\n};\n\nclass AppLoader final : public OptionMapper {\npublic:\n  explicit AppLoader(const fextl::string& Filename, FEXCore::Config::LayerType Type);\n  void Load();\n\nprivate:\n  fextl::string Config;\n};\n\nclass EnvLoader final : public FEXCore::Config::Layer {\npublic:\n  explicit EnvLoader(char* const _envp[]);\n  void Load() override;\n\nprivate:\n  char* const* envp;\n};\n\nOptionMapper::OptionMapper(FEXCore::Config::LayerType Layer)\n  : FEXCore::Config::Layer(Layer) {}\n\nvoid OptionMapper::MapNameToOption(const char* ConfigName, const char* ConfigString) {\n  std::optional<FEXCore::Config::ConfigOption> KeyOptionValue;\n  for (auto& it : ConfigLookup) {\n    if (it.first != ConfigName) {\n      continue;\n    }\n\n    KeyOptionValue = it.second;\n    break;\n  }\n\n  if (!KeyOptionValue.has_value()) {\n    LogMan::Msg::IFmt(\"Unknown configuration option '{}' in JSON config file '{}'\", ConfigName, CurrentConfigFile);\n    return;\n  }\n\n  const auto KeyOption = *KeyOptionValue;\n  const auto KeyName = std::string_view(ConfigName);\n  const auto Value_View = std::string_view(ConfigString);\n#define JSONLOADER\n#include <FEXCore/Config/ConfigOptions.inl>\n}\n\nMainLoader::MainLoader(FEXCore::Config::LayerType Type)\n  : OptionMapper(Type)\n  , Config {FEXCore::Config::GetConfigFileLocation(Type == FEXCore::Config::LayerType::LAYER_GLOBAL_MAIN)} {}\n\nMainLoader::MainLoader(fextl::string ConfigFile)\n  : OptionMapper(FEXCore::Config::LayerType::LAYER_MAIN)\n  , Config {std::move(ConfigFile)} {}\n\n\nMainLoader::MainLoader(FEXCore::Config::LayerType Type, std::string_view ConfigFile)\n  : OptionMapper(Type)\n  , Config {ConfigFile} {}\n\nvoid MainLoader::Load() {\n  SetCurrentConfigFile(Config);\n  JSON::LoadJSonConfig(Config, [this](const char* Name, const char* ConfigString) { MapNameToOption(Name, ConfigString); });\n}\n\nAppLoader::AppLoader(const fextl::string& Filename, FEXCore::Config::LayerType Type)\n  : OptionMapper(Type) {\n  const bool Global = Type == FEXCore::Config::LayerType::LAYER_GLOBAL_STEAM_APP || Type == FEXCore::Config::LayerType::LAYER_GLOBAL_APP;\n  Config = FEXCore::Config::GetApplicationConfig(Filename, Global);\n\n  // Immediately load so we can reload the meta layer\n  Load();\n}\n\nvoid AppLoader::Load() {\n  SetCurrentConfigFile(Config);\n  JSON::LoadJSonConfig(Config, [this](const char* Name, const char* ConfigString) { MapNameToOption(Name, ConfigString); });\n}\n\nEnvLoader::EnvLoader(char* const _envp[])\n  : FEXCore::Config::Layer(FEXCore::Config::LayerType::LAYER_ENVIRONMENT)\n  , envp {_envp} {}\n\nvoid EnvLoader::Load() {\n  using EnvMapType = fextl::unordered_map<std::string_view, fextl::string>;\n  EnvMapType EnvMap;\n\n  for (const char* const* pvar = envp; pvar && *pvar; pvar++) {\n    std::string_view Var(*pvar);\n\n    ///< All FEX environment variables start with `FEX_`\n    if (!Var.starts_with(\"FEX_\")) {\n      continue;\n    }\n\n    size_t pos = Var.rfind('=');\n    if (fextl::string::npos == pos) {\n      continue;\n    }\n\n    std::string_view Key = Var.substr(0, pos);\n    std::string_view Value_View {Var.substr(pos + 1)};\n    std::optional<fextl::string> Value;\n\n#define ENVLOADER\n#include <FEXCore/Config/ConfigOptions.inl>\n\n    if (Value) {\n      EnvMap.insert_or_assign(Key, std::move(*Value));\n    } else {\n      EnvMap.insert_or_assign(Key, Value_View);\n    }\n  }\n\n  auto GetVar = [](const EnvMapType& EnvMap, std::string_view id) -> std::optional<std::string_view> {\n    const auto EnvEntry = EnvMap.find(id);\n    if (EnvEntry != EnvMap.end()) {\n      return EnvEntry->second;\n    }\n\n    // If envp[] was empty, search using std::getenv()\n    const char* vs = std::getenv(id.data());\n    if (vs) {\n      return vs;\n    } else {\n      return std::nullopt;\n    }\n  };\n\n  std::optional<std::string_view> Value;\n\n  // Walk all the environment options and corresponding config option.\n#define OPT_BASE(type, group, enum, json, default) \\\n  Value = GetVar(EnvMap, \"FEX_\" #enum);            \\\n  if (Value.has_value()) Set(FEXCore::Config::ConfigOption::CONFIG_##enum, *Value);\n#define OPT_STRARRAY(group, enum, json, default) \\\n  Value = GetVar(EnvMap, \"FEX_\" #enum);          \\\n  if (Value.has_value()) AppendStrArrayValue(FEXCore::Config::ConfigOption::CONFIG_##enum, *Value);\n\n#include <FEXCore/Config/ConfigValues.inl>\n}\n\nfextl::unique_ptr<FEXCore::Config::Layer> CreateGlobalMainLayer() {\n  return fextl::make_unique<MainLoader>(FEXCore::Config::LayerType::LAYER_GLOBAL_MAIN);\n}\n\nfextl::unique_ptr<FEXCore::Config::Layer> CreateMainLayer(const fextl::string* File) {\n  if (File) {\n    return fextl::make_unique<MainLoader>(*File);\n  } else {\n    return fextl::make_unique<MainLoader>(FEXCore::Config::LayerType::LAYER_MAIN);\n  }\n}\n\nfextl::unique_ptr<FEXCore::Config::Layer> CreateUserOverrideLayer(std::string_view AppConfig) {\n  return fextl::make_unique<MainLoader>(FEXCore::Config::LayerType::LAYER_USER_OVERRIDE, AppConfig);\n}\n\nfextl::unique_ptr<FEXCore::Config::Layer> CreateAppLayer(const fextl::string& Filename, FEXCore::Config::LayerType Type) {\n  return fextl::make_unique<AppLoader>(Filename, Type);\n}\n\nfextl::unique_ptr<FEXCore::Config::Layer> CreateEnvironmentLayer(char* const _envp[]) {\n  return fextl::make_unique<EnvLoader>(_envp);\n}\n\nfextl::string RecoverGuestProgramFilename(fextl::string Program, bool ExecFDInterp, int ProgramFDFromEnv) {\n  // If executed with a FEX FD then the Program argument might be empty.\n  // In this case we need to scan the FD node to recover the application binary that exists on disk.\n  // Only do this if the Program argument is empty, since we would prefer the application's expectation\n  // of application name.\n  if (ProgramFDFromEnv != -1 && Program.empty()) {\n    // Get the `dev` node of the execveat fd string.\n    Program = fextl::fmt::format(\"/dev/fd/{}\", ProgramFDFromEnv);\n  }\n\n  // If we were provided a relative path then we need to canonicalize it to become absolute.\n  // If the program name isn't resolved to an absolute path then glibc breaks inside it's `_dl_get_origin` function.\n  // This is because we rewrite `/proc/self/exe` to the absolute program path calculated in here.\n  if (!Program.starts_with('/')) {\n    char ExistsTempPath[PATH_MAX];\n    char* RealPath = FHU::Filesystem::Absolute(Program.c_str(), ExistsTempPath);\n    if (RealPath) {\n      Program = RealPath;\n    }\n  }\n\n  // If FEX was invoked through an FD path (either binfmt_misc or execveat) then we need to check the\n  // Program to see if it is a symlink to find the real path.\n  //\n  // binfmt_misc: Arg[0] is actually the execve `pathname` argument or `/dev/fd/<FD>` path\n  //   - `pathname` with execve (See Side Note)\n  //   - FD path with execveat and FD doesn't have an existing file on the disk\n  //\n  // ProgramFDFromEnv: Arg[0] is Application provided data or `/dev/fd/<FD>` from above fix-up.\n  //   - execveat was either passed no arguments (argv=NULL) or the first argument is an empty string (argv[0]=\"\").\n  //   - FD path with execveat and FD doesn't have an existing file on the disk\n  //\n  // Side Note:\n  //  The `execve` syscall doesn't take an FD but binfmt_misc will give FEX an FD to execute still.\n  //  Arg[0] will always contain the `pathname` argument provided to execve.\n  //  It does not resolve symlinks, and it does not convert the path to absolute.\n  //\n  // Examples:\n  //  - Regular execve. Application must exist on disk.\n  //    execve binfmt_misc args layout:   `FEX <Path provided to execve pathname> <user provided argv[0]> <user provided argv[n]>...`\n  //  - Regular execveat with FD. FD is backed by application on disk.\n  //    execveat binfmt_misc args layout: `FEX <Path provided to execve pathname> <user provided argv[0]> <user provided argv[n]>...`\n  //  - Regular execveat with FD. FD points to file on disk that has been deleted.\n  //    execveat binfmt_misc args layout: `FEX /dev/fd/<FD> <user provided argv[0]> <user provided argv[n]>...`\n#ifndef _WIN32\n  if (ExecFDInterp || ProgramFDFromEnv != -1) {\n    // Only in the case that FEX is executing an FD will the program argument potentially be a symlink.\n    // This symlink will be in the style of `/dev/fd/<FD>`.\n    //\n    // If the argument /is/ a symlink then resolve its path to get the original application name.\n    if (FHU::Symlinks::IsSymlink(Program)) {\n      char Filename[PATH_MAX];\n      auto SymlinkPath = FHU::Symlinks::ResolveSymlink(Program, Filename);\n      if (SymlinkPath.starts_with('/')) {\n        // This file was executed through an FD.\n        // Remove the ` (deleted)` text if the file was deleted after the fact.\n        // Otherwise just get the symlink without the deleted text.\n        return fextl::string {SymlinkPath.substr(0, SymlinkPath.rfind(\" (deleted)\"))};\n      }\n    }\n  }\n#endif\n\n  return Program;\n}\n\nApplicationNames GetApplicationNames(const fextl::vector<fextl::string>& Args, bool ExecFDInterp, int ProgramFDFromEnv) {\n  if (Args.empty()) {\n    // Early exit if we weren't passed an argument\n    return {};\n  }\n\n  fextl::string Program {};\n  fextl::string ProgramName {};\n\n  Program = RecoverGuestProgramFilename(Args[0], ExecFDInterp, ProgramFDFromEnv);\n\n  bool Wine = false;\n  for (size_t CurrentProgramNameIndex = 0; CurrentProgramNameIndex < Args.size(); ++CurrentProgramNameIndex) {\n    auto CurrentProgramName = FHU::Filesystem::GetFilename(Args[CurrentProgramNameIndex]);\n\n    if (CurrentProgramName == \"wine-preloader\" || CurrentProgramName == \"wine64-preloader\") {\n      // Wine preloader is required to be in the format of `wine-preloader <wine executable>`\n      // The preloader doesn't execve the executable, instead maps it directly itself\n      // Skip the next argument since we know it is wine (potentially with custom wine executable name)\n      ++CurrentProgramNameIndex;\n      Wine = true;\n    } else if (CurrentProgramName == \"wine\" || CurrentProgramName == \"wine64\") {\n      // Next argument, this isn't the program we want\n      //\n      // If we are running wine or wine64 then we should check the next argument for the application name instead.\n      // wine will change the active program name with `setprogname` or `prctl(PR_SET_NAME`.\n      // Since FEX needs this data far earlier than libraries we need a different check.\n      Wine = true;\n    } else {\n      if (Wine == true) {\n        // If this was path separated with '\\' then we need to check that.\n        auto WinSeparator = CurrentProgramName.find_last_of('\\\\');\n        if (WinSeparator != CurrentProgramName.npos) {\n          // Used windows separators\n          CurrentProgramName = CurrentProgramName.substr(WinSeparator + 1);\n        }\n      }\n\n      ProgramName = std::move(CurrentProgramName);\n\n      // Past any wine program names\n      break;\n    }\n  }\n\n  return ApplicationNames {std::move(Program), std::move(ProgramName)};\n}\n\nvoid LoadConfig(fextl::string ProgramName, char** const envp, const PortableInformation& PortableInfo) {\n  const bool IsPortable = PortableInfo.IsPortable;\n  FEX::Config::InitializeConfigs(PortableInfo);\n  FEXCore::Config::Initialize();\n  if (!IsPortable) {\n    FEXCore::Config::AddLayer(CreateGlobalMainLayer());\n  }\n  FEXCore::Config::AddLayer(CreateMainLayer());\n\n  if (!ProgramName.empty()) {\n    if (!IsPortable) {\n      FEXCore::Config::AddLayer(CreateAppLayer(ProgramName, FEXCore::Config::LayerType::LAYER_GLOBAL_APP));\n    }\n    FEXCore::Config::AddLayer(CreateAppLayer(ProgramName, FEXCore::Config::LayerType::LAYER_LOCAL_APP));\n\n    auto SteamID = getenv(\"SteamAppId\");\n    if (SteamID) {\n      // If a SteamID exists then let's search for Steam application configs as well.\n      // We want to key off both the SteamAppId number /and/ the executable since we may not want to thunk all binaries.\n      fextl::string SteamAppName = fextl::fmt::format(\"Steam_{}_{}\", SteamID, ProgramName);\n      if (!IsPortable) {\n        FEXCore::Config::AddLayer(CreateAppLayer(SteamAppName, FEXCore::Config::LayerType::LAYER_GLOBAL_STEAM_APP));\n      }\n      FEXCore::Config::AddLayer(CreateAppLayer(SteamAppName, FEXCore::Config::LayerType::LAYER_LOCAL_STEAM_APP));\n    }\n  }\n\n  const char* AppConfig = getenv(\"FEX_APP_CONFIG\");\n  if (AppConfig) {\n    fextl::string AppConfigStr = AppConfig;\n    if (IsPortable && FHU::Filesystem::IsRelative(AppConfig)) {\n      AppConfigStr = PortableInfo.InterpreterPath + AppConfigStr;\n    }\n\n    if (FHU::Filesystem::Exists(AppConfigStr)) {\n      FEXCore::Config::AddLayer(CreateUserOverrideLayer(AppConfigStr));\n    }\n  }\n\n  FEXCore::Config::AddLayer(CreateEnvironmentLayer(envp));\n  FEXCore::Config::Load();\n}\n\n#ifndef _WIN32\nfextl::string FindUserHomeThroughUID() {\n  // `getpwuid` allocates memory, parse `/etc/passwd` manually.\n  // Format is trivial: `<name>:<password hash>:<uid>:<gid>:<comment>:<home>:<shell>`\n\n  fextl::vector<char> Data;\n  if (!FEXCore::FileLoading::LoadFile(Data, \"/etc/passwd\")) {\n    return {};\n  }\n\n  auto to_string_view = [](auto rng) {\n    return std::string_view(&*rng.begin(), ranges::distance(rng));\n  };\n\n  const auto uid = geteuid();\n\n  for (const auto entry : ranges::views::split(Data, '\\n') | ranges::views::transform(to_string_view)) {\n    const auto elements = ranges::views::split(entry, ':') | ranges::views::transform(to_string_view);\n    // Reject bad entries.\n    if (std::distance(elements.begin(), elements.end()) != 7) {\n      continue;\n    }\n\n    auto iter = elements.begin();\n    ++iter; // name\n    ++iter; // password hash\n    ++iter; // comment\n    // uid\n    const auto uid_s = *iter;\n    ++iter;\n    ++iter; // gid\n    // home\n    const auto home_s = *iter;\n    ++iter;\n    ++iter; // shell\n\n    uint64_t element_uid;\n    auto Results = std::from_chars(uid_s.begin(), uid_s.end(), element_uid, 10);\n\n    // Error parsing.\n    if (Results.ptr == uid_s.begin()) {\n      continue;\n    }\n\n    if (element_uid == uid) {\n      return fextl::string(home_s);\n    }\n  }\n\n  return {};\n}\n\nfextl::string GetHomeDirectory() {\n  const char* HomeDir = getenv(\"HOME\");\n\n  // Try to get home directory from uid\n  if (!HomeDir || !FHU::Filesystem::Exists(HomeDir)) {\n    auto UIDHome = FindUserHomeThroughUID();\n    if (!UIDHome.empty() && FHU::Filesystem::Exists(UIDHome)) {\n      return UIDHome;\n    }\n  }\n\n  // try the PWD\n  if (!HomeDir || !FHU::Filesystem::Exists(HomeDir)) {\n    HomeDir = getenv(\"PWD\");\n  }\n\n  // Still doesn't exit? You get local\n  if (!HomeDir || !FHU::Filesystem::Exists(HomeDir)) {\n    HomeDir = \".\";\n  }\n\n  return HomeDir;\n}\n#else\nfextl::string GetHomeDirectory() {\n  const char* HomeDir = getenv(\"WINEHOMEDIR\");\n  if (HomeDir) {\n    // Skip over the \\??\\ prefix in the NT path since we want a DOS path\n    HomeDir += 4;\n  };\n\n  if (!HomeDir) {\n    HomeDir = getenv(\"LOCALAPPDATA\");\n  }\n\n  if (!HomeDir) {\n    HomeDir = \".\";\n  }\n\n  return HomeDir;\n}\n#endif\n\nfextl::string GetDataDirectory(bool Global, const PortableInformation& PortableInfo) {\n#ifdef FEX_STEAM_SUPPORT\n  const char* SteamDataPath = getenv(\"STEAM_COMPAT_DATA_PATH\");\n  if (SteamDataPath) {\n    return fextl::fmt::format(\"{}/fex-emu/\", SteamDataPath);\n  }\n#endif\n\n  const char* DataOverride = getenv(\"FEX_APP_DATA_LOCATION\");\n\n  if (PortableInfo.IsPortable && (Global || !DataOverride)) {\n    return fextl::fmt::format(\"{}/fex-emu/\", PortableInfo.InterpreterPath);\n  }\n\n  if (Global) {\n    return GLOBAL_DATA_DIRECTORY;\n  }\n\n  auto HomeDir = GetHomeDirectory();\n  const char* DataXDG = getenv(\"XDG_DATA_HOME\");\n  const fextl::string LegacyDir = fextl::string {HomeDir} + \"/.fex-emu/\";\n\n  // If $HOME/.fex-emu exists, use that\n  if (FHU::Filesystem::Exists(LegacyDir)) {\n    return LegacyDir;\n  }\n\n  fextl::string DataDir {};\n  if (DataOverride) {\n    // Data override will override the complete directory\n    DataDir = DataOverride;\n  } else {\n    // use ~/.local/share if XDG_DATA_HOME is unset\n    DataDir = DataXDG ? DataXDG : fmt::format(\"{}/.local/share\", HomeDir);\n    DataDir += \"/fex-emu/\";\n  }\n\n  return DataDir;\n}\n\nfextl::string GetConfigDirectory(bool Global, const PortableInformation& PortableInfo) {\n  const char* ConfigOverride = getenv(\"FEX_APP_CONFIG_LOCATION\");\n  if (PortableInfo.IsPortable && Global) {\n    return fextl::fmt::format(\"{}/fex-emu/\", PortableInfo.InterpreterPath);\n  } else if (ConfigOverride && !Global) {\n    fextl::string AppConfigStr = ConfigOverride;\n    if (FHU::Filesystem::IsRelative(AppConfigStr)) {\n      AppConfigStr = PortableInfo.InterpreterPath + AppConfigStr;\n    }\n\n    return AppConfigStr;\n  }\n\n#ifdef FEX_STEAM_SUPPORT\n  const char* SteamDataPath = getenv(\"STEAM_COMPAT_DATA_PATH\");\n  if (SteamDataPath) {\n    return fextl::fmt::format(\"{}/fex-emu/\", SteamDataPath);\n  }\n#endif\n\n  fextl::string ConfigDir;\n  if (Global) {\n    return GLOBAL_DATA_DIRECTORY;\n  }\n\n  auto HomeDir = GetHomeDirectory();\n  const char* ConfigXDG = getenv(\"XDG_CONFIG_HOME\");\n\n  const fextl::string LegacyDir = fextl::string {HomeDir} + \"/.fex-emu/\";\n\n  // If $HOME/.fex-emu exists, use that\n  if (FHU::Filesystem::Exists(LegacyDir)) {\n    return LegacyDir;\n  }\n\n  if (ConfigOverride) {\n    // Config override will override the complete directory\n    ConfigDir = ConfigOverride;\n  } else {\n    // use ~/.config if XDG_CONFIG_HOME is unset\n    ConfigDir = ConfigXDG ? ConfigXDG : fmt::format(\"{}/.config\", HomeDir);\n    ConfigDir += \"/fex-emu/\";\n  }\n\n\n  return ConfigDir;\n}\n\nfextl::string GetCacheDirectory() {\n  const char* CacheOverride = getenv(\"FEX_APP_CACHE_LOCATION\");\n  if (CacheOverride) {\n    return CacheOverride;\n  }\n\n#ifndef _WIN32\n#ifdef FEX_STEAM_SUPPORT\n  const char* SteamDataPath = getenv(\"STEAM_COMPAT_SHADER_PATH\");\n  if (SteamDataPath) {\n    return fextl::fmt::format(\"{}/fex-emu/\", SteamDataPath);\n  }\n#endif\n\n  auto HomeDir = GetHomeDirectory();\n  const char* CacheXDG = getenv(\"XDG_CACHE_HOME\");\n  return (CacheXDG ? fextl::string {CacheXDG} : (fextl::string {HomeDir} + \"/.cache\")) + \"/fex-emu/\";\n#else\n  const char* PrefixAppData = getenv(\"LOCALAPPDATA\");\n  return PrefixAppData ? (fextl::string {PrefixAppData} + \"\\\\fex-emu\\\\\") : fextl::string {\".\\\\\"};\n#endif\n}\n\nfextl::string GetConfigFileLocation(bool Global, const PortableInformation& PortableInfo) {\n  return GetConfigDirectory(Global, PortableInfo) + \"Config.json\";\n}\n\nvoid InitializeConfigs(const PortableInformation& PortableInfo) {\n  FEXCore::Config::SetDataDirectory(GetDataDirectory(false, PortableInfo), false);\n  FEXCore::Config::SetDataDirectory(GetDataDirectory(true, PortableInfo), true);\n  FEXCore::Config::SetConfigDirectory(GetConfigDirectory(false, PortableInfo), false);\n  FEXCore::Config::SetConfigDirectory(GetConfigDirectory(true, PortableInfo), true);\n  FEXCore::Config::SetConfigFileLocation(GetConfigFileLocation(false, PortableInfo), false);\n  FEXCore::Config::SetConfigFileLocation(GetConfigFileLocation(true, PortableInfo), true);\n}\n} // namespace FEX::Config\n"
  },
  {
    "path": "Source/Common/Config.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/unordered_map.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <string_view>\n\nnamespace FEX::ArgLoader {\nclass ArgLoader;\n}\n/**\n * @brief This is a singleton for storing global configuration state\n */\nnamespace FEX::Config {\nclass EmptyMapper : public FEXCore::Config::Layer {\npublic:\n  explicit EmptyMapper()\n    : FEXCore::Config::Layer(FEXCore::Config::LayerType::LAYER_MAIN) {}\n  void Load() override {}\n\nprotected:\n};\n\nvoid SaveLayerToJSON(const fextl::string& Filename, const FEXCore::Config::Layer* Layer);\nvoid SaveLayerToJSON(const fextl::string& Filename, const FEXCore::Config::Layer* Layer, const fextl::unordered_map<fextl::string, bool>& HostLibs);\n\nstruct ApplicationNames {\n  // This is the full path to the program (if it exists).\n  fextl::string ProgramPath;\n  // This is the program executable name (if it exists).\n  fextl::string ProgramName;\n};\n\nstruct PortableInformation {\n  bool IsPortable;\n  // Path of folder containing FEX (including / at the end)\n  fextl::string InterpreterPath;\n};\n\n/**\n * @param ExecFDInterp If FEX was executed with binfmt_misc FD argument\n * @param ProgramFDFromEnv The execveat FD argument passed through FEX\n *\n * @return The application name and path structure\n */\nApplicationNames GetApplicationNames(const fextl::vector<fextl::string>& Args, bool ExecFDInterp, int ProgramFDFromEnv);\n\n/**\n * @brief Loads the FEX and application configurations for the application that is getting ready to run.\n *\n * @param ProgramName Optional program name, if non-empty application specific configurations will be loaded\n * @param envp Optional `envp` passed to main(...)\n */\nvoid LoadConfig(fextl::string ProgramName = {}, char** const envp = nullptr, const PortableInformation& PortableInfo = {});\n\nfextl::string GetHomeDirectory();\n\nfextl::string GetDataDirectory(const PortableInformation& PortableInfo);\nfextl::string GetConfigDirectory(bool Global, const PortableInformation& PortableInfo);\nfextl::string GetConfigFileLocation(bool Global, const PortableInformation& PortableInfo);\nfextl::string GetCacheDirectory();\n\nvoid InitializeConfigs(const PortableInformation& PortableInfo);\n\n/**\n * @brief Loads the global FEX config\n *\n * @return unique_ptr for that layer\n */\nfextl::unique_ptr<FEXCore::Config::Layer> CreateGlobalMainLayer();\n\n/**\n * @brief Loads the main application config\n *\n * @param File Optional override to load a specific config file in to the main layer\n * Shouldn't be commonly used\n *\n * @return unique_ptr for that layer\n */\nfextl::unique_ptr<FEXCore::Config::Layer> CreateMainLayer(const fextl::string* File = nullptr);\nfextl::unique_ptr<FEXCore::Config::Layer> CreateUserOverrideLayer(std::string_view AppConfig);\n\n/**\n * @brief Create an application configuration loader\n *\n * @param Filename Application filename component\n * @param Global Load the global configuration or user accessible file\n *\n * @return unique_ptr for that layer\n */\nfextl::unique_ptr<FEXCore::Config::Layer> CreateAppLayer(const fextl::string& Filename, FEXCore::Config::LayerType Type);\n\n/**\n * @brief iCreate an environment configuration loader\n *\n * @param _envp[] The environment array from main\n *\n * @return unique_ptr for that layer\n */\nfextl::unique_ptr<FEXCore::Config::Layer> CreateEnvironmentLayer(char* const _envp[]);\n} // namespace FEX::Config\n"
  },
  {
    "path": "Source/Common/FDUtils.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/fextl/fmt.h>\n\n#include <fcntl.h>\n#include <linux/limits.h>\n#include <unistd.h>\n\nnamespace FEX {\n\n[[nodiscard]]\ninline int get_fdpath(int fd, char* SymlinkPath) {\n  auto Path = fextl::fmt::format(\"/proc/self/fd/{}\", fd);\n  return readlinkat(AT_FDCWD, Path.c_str(), SymlinkPath, PATH_MAX);\n}\n\n} // namespace FEX\n"
  },
  {
    "path": "Source/Common/FEXServerClient.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Common/AsyncNet.h\"\n#include \"Common/Config.h\"\n#include \"FDUtils.h\"\n#include \"Common/FEXServerClient.h\"\n\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/FileLoading.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXHeaderUtils/Filesystem.h>\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <cstdlib>\n#include <fcntl.h>\n#include <linux/limits.h>\n#include <unistd.h>\n#include <sys/poll.h>\n#include <sys/prctl.h>\n#include <sys/signal.h>\n#include <sys/socket.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <sys/un.h>\n#include <sys/uio.h>\n#include <thread>\n#include <cstring>\n\nnamespace FEXServerClient {\nLogging::PacketHeader Logging::FillHeader(PacketTypes Type) {\n  Logging::PacketHeader Msg {\n    .PacketType = Type,\n    .PID = ::getpid(),\n    .TID = FHU::Syscalls::gettid(),\n  };\n  clock_gettime(CLOCK_MONOTONIC, &Msg.Timestamp);\n\n  return Msg;\n}\n\nint RequestPIDFDPacket(int ServerSocket, PacketType Type) {\n  fasio::tcp_socket Socket {ServerSocket};\n  FEXServerRequestPacket Req {\n    .Header {\n      .Type = Type,\n    },\n  };\n\n  // Send request\n  fasio::error ec;\n  write(Socket, fasio::mutable_buffer {std::as_writable_bytes(std::span {&Req, 1})}, ec);\n  if (ec != fasio::error::success) {\n    return -1;\n  }\n\n  // Wait for success response and log FD\n  FEXServerResultPacket Res {};\n  fasio::mutable_buffer ResBuffer {std::as_writable_bytes(std::span {&Res, 1})};\n  int NewFD = -1;\n  ResBuffer.FD = &NewFD;\n  auto BytesRead = Socket.read_some(ResBuffer, ec);\n  if (ec != fasio::error::success || BytesRead != sizeof(Res) || Res.Header.Type != PacketType::TYPE_SUCCESS) {\n    return -1;\n  }\n\n  return NewFD;\n}\n\nstatic int ServerFD {-1};\n\nfextl::string GetServerLockFolder() {\n  return FEXCore::Config::GetDataDirectory() + \"Server/\";\n}\n\nfextl::string GetServerLockFile() {\n  return GetServerLockFolder() + \"Server.lock\";\n}\n\nfextl::string GetServerRootFSLockFile() {\n  return GetServerLockFolder() + \"RootFS.lock\";\n}\n\nfextl::string GetTempFolder() {\n  const std::array<const char*, 5> Vars = {\n    \"XDG_RUNTIME_DIR\", \"TMPDIR\", \"TMP\", \"TEMP\", \"TEMPDIR\",\n  };\n\n  for (auto& Var : Vars) {\n    auto Path = getenv(Var);\n    if (Path) {\n      // If one of the env variable-driven paths works then use that.\n      return Path;\n    }\n  }\n\n  // Fallback to `/tmp/` if no env vars are set.\n  // Might not be ideal but we don't have much of a choice.\n  return fextl::string {\"/tmp\"};\n}\n\nfextl::string GetServerMountFolder() {\n  // We need a FEXServer mount directory that has some tricky requirements.\n  // - We don't want to use `/tmp/` if possible.\n  //   - systemd services use `PrivateTmp` feature to gives services their own tmp.\n  //   - We will use this as a fallback path /only/.\n  // - Can't be `[$XDG_DATA_HOME,$HOME]/.fex-emu/`\n  //   - Might be mounted with a filesystem (sshfs) which can't handle mount points inside it.\n  //\n  // Directories it can be in:\n  // - $XDG_RUNTIME_DIR if set\n  //   - Is typically `/run/user/<UID>/`\n  //   - systemd `PrivateTmp` feature doesn't touch this.\n  //   - If this path doesn't exist then fallback to `/tmp/` as a last resort.\n  //   - pressure-vessel explicitly creates an internal XDG_RUNTIME_DIR inside its chroot.\n  //     - This is okay since pressure-vessel rbinds the FEX rootfs from the host to `/run/pressure-vessel/interpreter-root`.\n  auto Folder = GetTempFolder();\n\n  if (FEXCore::Config::FindContainer() == \"pressure-vessel\") {\n    // In pressure-vessel the mount point changes location.\n    // This is due to pressure-vesssel being a chroot environment.\n    // It by default maps the host-filesystem to `/run/host/` so we need to redirect.\n    // After pressure-vessel is fully set up it will set the `FEX_ROOTFS` environment variable,\n    // which FEX will pick up.\n    Folder = \"/run/host/\" + Folder;\n  }\n\n  return Folder;\n}\n\nfextl::string GetServerSocketName() {\n  FEX_CONFIG_OPT(ServerSocketPath, SERVERSOCKETPATH);\n  if (ServerSocketPath().empty()) {\n    return fextl::fmt::format(\"{}.FEXServer.Socket\", ::getuid());\n  }\n  return ServerSocketPath;\n}\n\nfextl::string GetServerSocketPath() {\n  fextl::string name {};\n#ifndef FEX_STEAM_SUPPORT\n  FEX_CONFIG_OPT(ServerSocketPath, SERVERSOCKETPATH);\n\n  name = ServerSocketPath();\n\n  if (name.starts_with(\"/\")) {\n    return name;\n  }\n\n  auto Folder = GetTempFolder();\n#else\n  // Under Steam the FEXServer's socket is a game-specific directory.\n  auto Folder = GetServerLockFolder();\n#endif\n\n  if (name.empty()) {\n    return fextl::fmt::format(\"{}/{}.FEXServer.Socket\", Folder, ::getuid());\n  } else {\n    return fextl::fmt::format(\"{}/{}\", Folder, name);\n  }\n}\n\nint GetServerFD() {\n  return ServerFD;\n}\n\nint ConnectToServer(ConnectionOption ConnectionOption) {\n  int SocketFD {-1};\n  size_t SizeOfAddr {};\n  struct sockaddr_un addr {};\n  size_t SizeOfSocketString {};\n\n  // Create the initial unix socket\n  SocketFD = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);\n  if (SocketFD == -1) {\n    LogMan::Msg::EFmt(\"Couldn't open AF_UNIX socket {}\", errno);\n    return -1;\n  }\n\n  // Steam doesn't get to connect to global sockets.\n#ifndef FEX_STEAM_SUPPORT\n  auto ServerSocketName = GetServerSocketName();\n\n  // AF_UNIX has a special feature for named socket paths.\n  // If the name of the socket begins with `\\0` then it is an \"abstract\" socket address.\n  // The entirety of the name is used as a path to a socket that doesn't have any filesystem backing.\n  addr.sun_family = AF_UNIX;\n  SizeOfSocketString = std::min(ServerSocketName.size() + 1, sizeof(addr.sun_path) - 1);\n  addr.sun_path[0] = 0; // Abstract AF_UNIX sockets start with \\0\n  strncpy(addr.sun_path + 1, ServerSocketName.data(), SizeOfSocketString);\n  // Include final null character.\n  SizeOfAddr = sizeof(addr.sun_family) + SizeOfSocketString;\n\n  if (connect(SocketFD, reinterpret_cast<struct sockaddr*>(&addr), SizeOfAddr) == -1) {\n    if (ConnectionOption == ConnectionOption::Default || errno != ECONNREFUSED) {\n      LogMan::Msg::EFmt(\"Couldn't connect to FEXServer socket {} {}\", ServerSocketName, errno);\n    }\n  } else {\n    return SocketFD;\n  }\n#endif\n\n  // Try again with a path-based socket, since abstract sockets will fail if we have been\n  // placed in a new netns as part of a sandbox.\n  auto ServerSocketPath = GetServerSocketPath();\n\n  addr.sun_family = AF_UNIX;\n  SizeOfSocketString = std::min(ServerSocketPath.size(), sizeof(addr.sun_path) - 1);\n  strncpy(addr.sun_path, ServerSocketPath.data(), SizeOfSocketString);\n  SizeOfAddr = sizeof(addr.sun_family) + SizeOfSocketString;\n  if (connect(SocketFD, reinterpret_cast<struct sockaddr*>(&addr), SizeOfAddr) == -1) {\n    if (ConnectionOption == ConnectionOption::Default || (errno != ECONNREFUSED && errno != ENOENT)) {\n      LogMan::Msg::EFmt(\"Couldn't connect to FEXServer socket {} {}\", ServerSocketPath, errno);\n    }\n  } else {\n    return SocketFD;\n  }\n\n  close(SocketFD);\n  return -1;\n}\n\nbool SetupClient(std::string_view InterpreterPath) {\n  ServerFD = FEXServerClient::ConnectToAndStartServer(InterpreterPath);\n  if (ServerFD == -1) {\n    return false;\n  }\n\n  // If we were started in a container then we want to use the rootfs that they provided.\n  // In the pressure-vessel case this is a combination of our rootfs and the steam soldier runtime.\n  if (FEXCore::Config::FindContainer() != \"pressure-vessel\") {\n    fextl::string RootFSPath = FEXServerClient::RequestRootFSPath(ServerFD);\n\n    //// If everything has passed then we can now update the rootfs path\n    FEXCore::Config::Set(FEXCore::Config::CONFIG_ROOTFS, RootFSPath);\n  }\n\n  return true;\n}\n\nint StartServer(std::string_view InterpreterPath, int watch_fd) {\n  int LocalServerFD {-1};\n  // Couldn't connect to the server. Start one\n\n  // Open some pipes for letting us know when the server is ready\n  int fds[2] {};\n  if (pipe2(fds, 0) != 0) {\n    LogMan::Msg::EFmt(\"Couldn't open pipe\");\n    return -1;\n  }\n\n  // Extract directory from InterpreterPath\n  fextl::string InterpreterDir {InterpreterPath};\n  size_t LastSlash = InterpreterDir.rfind('/');\n  if (LastSlash != fextl::string::npos) {\n    InterpreterDir = InterpreterDir.substr(0, LastSlash);\n  }\n\n  fextl::string FEXServerPath = fextl::fmt::format(\"{}/FEXServer\", InterpreterDir);\n  // Check if a local FEXServer next to FEX exists\n  // If it does then it takes priority over the installed one\n  if (!FHU::Filesystem::Exists(FEXServerPath)) {\n    FEXServerPath = \"FEXServer\";\n  }\n\n  // Set-up our SIGCHLD handler to ignore the signal.\n  // This is early in the initialization stage so no handlers have been installed.\n  //\n  // We want to ignore the signal so that if FEXServer starts in daemon mode, it\n  // doesn't leave a zombie process around waiting for something to get the result.\n  struct sigaction action {};\n  action.sa_handler = SIG_IGN;\n  sigaction(SIGCHLD, &action, &action);\n\n  pid_t pid = fork();\n  if (pid == 0) {\n    // Child\n    close(fds[0]); // Close read end of pipe\n\n    const char* argv[6];\n\n    auto pipe_string = fextl::fmt::format(\"{}\", fds[1]);\n    auto watch_fd_string = fextl::fmt::format(\"{}\", watch_fd);\n    size_t arg_count {};\n    argv[arg_count++] = FEXServerPath.c_str();\n    argv[arg_count++] = \"--wait_pipe\";\n    argv[arg_count++] = pipe_string.c_str();\n\n    if (watch_fd != -1) {\n      argv[arg_count++] = \"--watch_fd\";\n      argv[arg_count++] = watch_fd_string.c_str();\n    }\n\n    argv[arg_count++] = nullptr;\n\n    if (execvp(argv[0], (char* const*)argv) == -1) {\n      // Let the parent know that we couldn't execute for some reason\n      uint64_t error {1};\n      write(fds[1], &error, sizeof(error));\n\n      // Give a hopefully helpful error message for users\n      LogMan::Msg::EFmt(\"Couldn't execute: {}\", argv[0]);\n      LogMan::Msg::EFmt(\"This means the squashFS rootfs won't be mounted.\");\n      LogMan::Msg::EFmt(\"Expect errors!\");\n      // Destroy this fork\n      exit(1);\n    }\n\n    FEX_UNREACHABLE;\n  } else {\n    // Parent\n    // Wait for the child to exit so we can check if it is mounted or not\n    close(fds[1]); // Close write end of the pipe\n\n    // Wait for a message from FEXServer\n    pollfd PollFD;\n    PollFD.fd = fds[0];\n    PollFD.events = POLLIN | POLLOUT | POLLRDHUP | POLLERR | POLLHUP | POLLNVAL;\n\n    // Wait for a result on the pipe that isn't EINTR\n    while (poll(&PollFD, 1, -1) == -1 && errno == EINTR)\n      ;\n\n    // Check if child signaled an error\n    uint64_t error = 0;\n    ssize_t bytes_read = read(fds[0], &error, sizeof(error));\n    close(fds[0]);\n    if (bytes_read > 0 && error != 0) {\n      return -1;\n    }\n\n    for (size_t i = 0; i < 5; ++i) {\n      LocalServerFD = ConnectToServer(ConnectionOption::Default);\n\n      if (LocalServerFD != -1) {\n        break;\n      }\n\n      std::this_thread::sleep_for(std::chrono::seconds(1));\n    }\n\n    if (LocalServerFD == -1) {\n      // Still couldn't connect to the socket.\n      LogMan::Msg::EFmt(\"Couldn't connect to FEXServer socket after launching the process\");\n    }\n  }\n\n  // Restore the original SIGCHLD handler if it existed.\n  sigaction(SIGCHLD, &action, nullptr);\n\n  return LocalServerFD;\n}\n\nint ConnectToAndStartServer(std::string_view InterpreterPath) {\n  int LocalServerFD = ConnectToServer(ConnectionOption::NoPrintConnectionError);\n  if (LocalServerFD == -1) {\n    LocalServerFD = StartServer(InterpreterPath);\n  }\n  return LocalServerFD;\n}\n\n/**\n * @name Packet request functions\n * @{ */\nvoid RequestServerKill(int ServerSocket) {\n  FEXServerRequestPacket Req {\n    .Header {\n      .Type = PacketType::TYPE_KILL,\n    },\n  };\n\n  write(ServerSocket, &Req, sizeof(Req.BasicRequest));\n}\n\nint RequestLogFD(int ServerSocket) {\n  return RequestPIDFDPacket(ServerSocket, PacketType::TYPE_GET_LOG_FD);\n}\n\nfextl::string RequestRootFSPath(int ServerSocket) {\n  FEXServerRequestPacket Req {\n    .Header {\n      .Type = PacketType::TYPE_GET_ROOTFS_PATH,\n    },\n  };\n\n  int Result = write(ServerSocket, &Req, sizeof(Req.BasicRequest));\n  if (Result != -1) {\n    // Wait for success response with data\n    fextl::vector<char> Data(PATH_MAX + sizeof(FEXServerResultPacket));\n\n    ssize_t DataResult = recv(ServerSocket, Data.data(), Data.size(), 0);\n    if (DataResult >= sizeof(FEXServerResultPacket)) {\n      FEXServerResultPacket* ResultPacket = reinterpret_cast<FEXServerResultPacket*>(Data.data());\n      if (ResultPacket->Header.Type == PacketType::TYPE_GET_ROOTFS_PATH && ResultPacket->MountPath.Length > 0) {\n        return fextl::string(ResultPacket->MountPath.Mount);\n      }\n    }\n  }\n\n  return {};\n}\n\nint RequestPIDFD(int ServerSocket) {\n  return RequestPIDFDPacket(ServerSocket, PacketType::TYPE_GET_PID_FD);\n}\n\nvoid PopulateCodeCache(int ServerSocket, int ProgramFD, bool HasMultiblock) {\n  fasio::error ec;\n  fasio::tcp_socket Socket {ServerSocket};\n\n  // Send request\n  FEXServerRequestPacket Req {\n    .Header {.Type = HasMultiblock ? PacketType::TYPE_POPULATE_CODE_CACHE : PacketType::TYPE_POPULATE_CODE_CACHE_NO_MULTIBLOCK}};\n\n  fasio::mutable_buffer WriteBuffer {std::as_writable_bytes(std::span {&Req, 1})};\n  WriteBuffer.FD = &ProgramFD;\n  write(Socket, WriteBuffer, ec);\n  if (ec != fasio::error::success) {\n    return;\n  }\n\n  // Wait for success response to ensure FEXServer completed any pending cache generation.\n  // The cache loading code handles missing caches gracefully, so we don't\n  // actually care about the result here.\n  FEXServerResultPacket Res {};\n  fasio::mutable_buffer ResBuffer {std::as_writable_bytes(std::span {&Res, 1})};\n  read(Socket, ResBuffer, ec);\n}\n\nint RequestCodeMapFD(int ServerSocket, int ProgramFD, bool HasMultiblock) {\n  fasio::tcp_socket Socket {ServerSocket};\n  FEXServerRequestPacket Req {\n    .Header {\n      .Type = HasMultiblock ? PacketType::TYPE_QUERY_CODE_MAP : PacketType::TYPE_QUERY_CODE_MAP_NO_MULTIBLOCK,\n    },\n  };\n\n  // Send request\n  fasio::error ec;\n  {\n    fasio::mutable_buffer WriteBuffer {std::as_writable_bytes(std::span {&Req, 1})};\n    WriteBuffer.FD = &ProgramFD;\n    write(Socket, WriteBuffer, ec);\n    if (ec != fasio::error::success) {\n      return -1;\n    }\n  }\n\n  // Wait for success response and log FD\n  FEXServerResultPacket Res {};\n  fasio::mutable_buffer ResBuffer {std::as_writable_bytes(std::span {&Res, 1})};\n  int NewFD = -1;\n  ResBuffer.FD = &NewFD;\n  read(Socket, ResBuffer, ec);\n  if (ec != fasio::error::success || Res.Header.Type != PacketType::TYPE_SUCCESS) {\n    return -1;\n  }\n\n  return NewFD;\n}\n\n/**  @} */\n\n/**\n * @name FEX logging through FEXServer\n * @{ */\n\nvoid MsgHandler(int FD, LogMan::DebugLevels Level, const char* Message) {\n  size_t MsgLen = strlen(Message) + 1;\n\n  Logging::PacketMsg Msg;\n  Msg.Header = Logging::FillHeader(Logging::PacketTypes::TYPE_MSG);\n  Msg.MessageLength = MsgLen;\n  Msg.Level = Level;\n\n  const iovec vec[2] = {\n    {\n      .iov_base = &Msg,\n      .iov_len = sizeof(Msg),\n    },\n    {\n      .iov_base = const_cast<char*>(Message),\n      .iov_len = Msg.MessageLength,\n    },\n  };\n\n  writev(FD, vec, 2);\n}\n\nvoid AssertHandler(int FD, const char* Message) {\n  MsgHandler(FD, LogMan::DebugLevels::ASSERT, Message);\n}\n/**  @} */\n} // namespace FEXServerClient\n"
  },
  {
    "path": "Source/Common/FEXServerClient.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/fextl/string.h>\n\n#include <cstddef>\n#include <cstdint>\n#include <ctime>\n#include <string_view>\n\nnamespace LogMan {\nenum DebugLevels : uint32_t;\n}\n\nnamespace FEXServerClient {\nenum class PacketType {\n  // Request and Result\n  TYPE_KILL,\n  TYPE_GET_LOG_FD,\n  TYPE_GET_ROOTFS_PATH,\n  TYPE_GET_PID_FD,\n  TYPE_POPULATE_CODE_CACHE,\n  TYPE_POPULATE_CODE_CACHE_NO_MULTIBLOCK,\n  TYPE_QUERY_CODE_MAP,\n  TYPE_QUERY_CODE_MAP_NO_MULTIBLOCK,\n\n  // Result only\n  TYPE_SUCCESS,\n  TYPE_ERROR,\n};\n\nunion FEXServerRequestPacket {\n  struct Header {\n    PacketType Type;\n  } Header;\n\n  struct {\n    struct Header Header;\n  } BasicRequest;\n};\n\nunion FEXServerResultPacket {\n  struct Header {\n    PacketType Type;\n  } Header;\n\n  struct {\n    struct Header Header;\n    int32_t PID;\n  } PID;\n\n  struct {\n    struct Header Header;\n    size_t Length;\n    char Mount[0];\n  } MountPath;\n};\n\nconstexpr size_t MAXIMUM_REQUEST_PACKET_SIZE = sizeof(FEXServerRequestPacket);\n\nfextl::string GetServerLockFolder();\nfextl::string GetServerLockFile();\nfextl::string GetServerRootFSLockFile();\nfextl::string GetTempFolder();\nfextl::string GetServerMountFolder();\nfextl::string GetServerSocketName();\nfextl::string GetServerSocketPath();\nint GetServerFD();\n\nbool SetupClient(std::string_view InterpreterPath);\n\n/**\n * @brief Start a FEXServer instance if possible\n *\n * @return socket FD for communicating with server\n */\nint StartServer(std::string_view InterpreterPath, int watch_fd = -1);\n\n/**\n * @brief Connect to and start a FEXServer instance if required\n *\n * @return socket FD for communicating with server\n */\nint ConnectToAndStartServer(std::string_view InterpreterPath);\n\nenum class ConnectionOption {\n  Default,\n  NoPrintConnectionError,\n};\n/**\n * @brief Connect to a FEXServer instance if it exists\n *\n * @return socket FD for communicating with server\n */\nint ConnectToServer(ConnectionOption ConnectionOption = ConnectionOption::Default);\n\n/**\n * @name Packet request functions\n * @{ */\n/**\n * @brief Request the server to be killed\n *\n * @param ServerSocket - Socket to the server\n */\nvoid RequestServerKill(int ServerSocket);\n\n/**\n * @brief Request a FEXServer to give us a log FD to write in to\n *\n * @param ServerSocket - Socket to the server\n *\n * @return FD for logging in to\n */\nint RequestLogFD(int ServerSocket);\n\nfextl::string RequestRootFSPath(int ServerSocket);\n\n/**\n * @brief Request a FEXServer to give us a pidfd of the process\n *\n * @param ServerSocket - Socket to the server\n *\n * @return FD for pidfd\n */\nint RequestPIDFD(int ServerSocket);\n\n/**\n * @brief Request FEXServer to populate the disk cache for the given executable\n *        and any libraries referenced in its code map\n *\n * @param ServerSocket - Socket to the server\n * @param ProgramFD - FD for program binary\n * @param HasMultiblock - true if multiblock is enabled (used for selecting code maps)\n */\nvoid PopulateCodeCache(int ServerSocket, int ProgramFD, bool HasMultiblock);\n\n/**\n * @brief Request FEXServer to create a new code map for disk cache population\n *\n * @param ServerSocket - Socket to the server\n * @param ProgramFD - FD for program binary\n *\n * @return FD to write code map to\n */\nint RequestCodeMapFD(int ServerSocket, int ProgramFD, bool HasMultiblock);\n\n/**  @} */\n\n/**\n * @name FEX logging through FEXServer\n * @{ */\nnamespace Logging {\n  enum class PacketTypes : uint32_t {\n    TYPE_MSG,\n  };\n\n  struct PacketHeader {\n    struct timespec Timestamp {};\n    PacketTypes PacketType {};\n    int32_t PID {};\n    int32_t TID {};\n    uint32_t Pad {};\n    char Data[0];\n  };\n\n  struct PacketMsg {\n    PacketHeader Header {};\n    size_t MessageLength;\n    uint32_t Level {};\n    uint32_t Pad {};\n  };\n\n  static_assert(sizeof(PacketHeader) == 32, \"Wrong size\");\n\n  PacketHeader FillHeader(PacketTypes Type);\n} // namespace Logging\n\nvoid MsgHandler(int FD, LogMan::DebugLevels Level, const char* Message);\nvoid AssertHandler(int FD, const char* Message);\n/**  @} */\n} // namespace FEXServerClient\n"
  },
  {
    "path": "Source/Common/FileFormatCheck.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXCore/fextl/string.h>\n\n#include <fcntl.h>\n#include <stdint.h>\n#include <sys/stat.h>\n#include <unistd.h>\n\nnamespace FEX::FormatCheck {\nbool IsSquashFS(const fextl::string& Filename) {\n  // If it is a regular file then we need to check if it is a valid archive\n  struct SquashFSHeader {\n    uint32_t magic;\n    uint32_t inode_count;\n    uint32_t mtime;\n    uint32_t block_size;\n    uint32_t fragment_entry_count;\n    uint16_t compression_id;\n    uint16_t block_log;\n    uint16_t flags;\n    uint16_t id_count;\n    uint16_t version_major;\n    uint16_t version_minor;\n    uint64_t More[8]; // More things that don't matter to us\n  };\n\n  SquashFSHeader Header {};\n  int fd = open(Filename.c_str(), O_RDONLY | O_CLOEXEC);\n  if (fd == -1) {\n    return false;\n  }\n\n  if (pread(fd, reinterpret_cast<char*>(&Header), sizeof(SquashFSHeader), 0) != sizeof(SquashFSHeader)) {\n    close(fd);\n    return false;\n  }\n\n  close(fd);\n\n  // Make sure the cookie matches\n  if (Header.magic == 0x73717368) {\n    // Sanity check the version\n    uint32_t version = (uint32_t)Header.version_major << 16 | Header.version_minor;\n    if (version >= 0x00040000) {\n      // Everything is sane, we can add it\n      return true;\n    }\n  }\n  return false;\n}\n\nbool IsEroFS(const fextl::string& Filename) {\n  // v1 of EroFS has a 128byte header\n  // This lives within a fixed offset inside of the first superblock of the file\n  // Each superblock is 4096bytes\n  //\n  // We only care about the uint32_t at the start of this offset which is the cookie\n  struct EroFSHeader {\n    uint32_t Magic;\n    // Additional data after this if necessary in the future.\n  };\n\n  constexpr size_t HEADER_OFFSET = 1024;\n  constexpr uint32_t COOKIE_MAGIC_V1 = 0xE0F5E1E2;\n\n  EroFSHeader Header {};\n  int fd = open(Filename.c_str(), O_RDONLY | O_CLOEXEC);\n  if (fd == -1) {\n    return false;\n  }\n\n  if (pread(fd, reinterpret_cast<char*>(&Header), sizeof(EroFSHeader), HEADER_OFFSET) != sizeof(EroFSHeader)) {\n    close(fd);\n    return false;\n  }\n\n  close(fd);\n\n  return Header.Magic == COOKIE_MAGIC_V1;\n}\n} // namespace FEX::FormatCheck\n"
  },
  {
    "path": "Source/Common/FileFormatCheck.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/fextl/string.h>\n\nnamespace FEX::FormatCheck {\nbool IsSquashFS(const fextl::string& Filename);\nbool IsEroFS(const fextl::string& Filename);\n} // namespace FEX::FormatCheck\n"
  },
  {
    "path": "Source/Common/FileMappingBaseAddress.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <cstdint>\n#include <span>\n\n#include <elf.h>\n\nnamespace FEXCore {\n\n/**\n * Infers the base virtual address from a file mapping (as described by parameters to a single\n * call to mmap()).\n *\n * Usually the base address can uniquely be inferred, but in edge cases multiple possible\n * candidates are returned.\n *\n * The file offset of any given mapping need not match its virtual address offset from the base\n * mapping (file offset = 0). Instead, this function searches the corresponding ELF program headers\n * for an entry that generated the given file mapping.\n */\ninline fextl::vector<uint64_t>\nInferMappingBaseAddress(std::span<const Elf64_Phdr> ProgramHeaders, uint64_t Addr, uint64_t Size, uint64_t FileOffset, int AccessFlags) {\n  fextl::vector<uint64_t> Ret;\n  for (auto& phdr : ProgramHeaders) {\n    if (phdr.p_type != PT_LOAD) {\n      // Skip headers that don't trigger memory mappings\n      continue;\n    }\n\n    if ((phdr.p_flags & (PF_X | PF_W | PF_R)) != (AccessFlags & (PF_X | PF_W | PF_R))) {\n      continue;\n    }\n\n    // The mapped file offset must be included at the start of the section header\n    auto SegmentStartOffset = phdr.p_offset - (phdr.p_vaddr & 0xfff);\n    if (FileOffset >= SegmentStartOffset && FileOffset < SegmentStartOffset + phdr.p_filesz &&\n        (FileOffset & Utils::FEX_PAGE_MASK) == (phdr.p_offset & Utils::FEX_PAGE_MASK)) {\n      // Compute VA offset relative to the base mapping\n      Ret.push_back(Addr - (phdr.p_vaddr - (phdr.p_offset & 0xfff)) + (ProgramHeaders[0].p_vaddr - (ProgramHeaders[0].p_offset & 0xfff)) -\n                    (FileOffset - SegmentStartOffset));\n    }\n  }\n\n  return Ret;\n}\n} // namespace FEXCore\n"
  },
  {
    "path": "Source/Common/HostFeatures.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Common/CPUInfo.h\"\n#include \"Common/HostFeatures.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/HostFeatures.h>\n#include <FEXCore/Utils/FileLoading.h>\n#include <FEXCore/Utils/StringUtils.h>\n\n#include <range/v3/view/split.hpp>\n#include <range/v3/view/transform.hpp>\n\n#ifdef ARCHITECTURE_x86_64\n#include \"Common/X86Features.h\"\n#endif\n\nnamespace FEX {\n\nvoid FillMIDRInformationViaLinux(FEXCore::HostFeatures* Features) {\n  auto Cores = FEX::CPUInfo::CalculateNumberOfCPUs();\n  Features->CPUMIDRs.resize(Cores);\n#ifdef ARCHITECTURE_arm64\n  for (size_t i = 0; i < Cores; ++i) {\n    std::error_code ec {};\n    fextl::string MIDRPath = fextl::fmt::format(\"/sys/devices/system/cpu/cpu{}/regs/identification/midr_el1\", i);\n    std::array<char, 18> Data;\n    // Needs to be a fixed size since depending on kernel it will try to read a full page of data and fail\n    // Only read 18 bytes for a 64bit value prefixed with 0x\n    if (FEXCore::FileLoading::LoadFileToBuffer(MIDRPath, Data) == sizeof(Data)) {\n      uint64_t MIDR {};\n      auto Results = std::from_chars(Data.data() + 2, Data.data() + sizeof(Data), MIDR, 16);\n      if (Results.ec == std::errc()) {\n        // Truncate to 32-bits, top 32-bits are all reserved in MIDR\n        Features->CPUMIDRs[i] = static_cast<uint32_t>(MIDR);\n      }\n    }\n  }\n#endif\n}\n\n#if defined(ARCHITECTURE_arm64) && !defined(VIXL_SIMULATOR)\n__attribute__((naked)) static uint64_t ReadSVEVectorLengthInBits() {\n  ///< Can't use rdvl instruction directly because compilers will complain that sve/sme is required.\n  __asm(R\"(\n  .word 0x04bf5100 // rdvl x0, #8\n  ret;\n  )\");\n}\n#else\n[[maybe_unused]]\nstatic int ReadSVEVectorLengthInBits() {\n  // Return unsupported\n  return 0;\n}\n#endif\n\n#ifdef ARCHITECTURE_arm64\n#define GetSysReg(name, reg)                         \\\n  static uint64_t Get_##name() {                     \\\n    uint64_t Result {};                              \\\n    __asm(\"mrs %[Res], \" #reg : [Res] \"=r\"(Result)); \\\n    return Result;                                   \\\n  }\n\nGetSysReg(ISAR0_EL1, ID_AA64ISAR0_EL1);\nGetSysReg(PFR0_EL1, ID_AA64PFR0_EL1);\nGetSysReg(PFR1_EL1, ID_AA64PFR1_EL1);\nGetSysReg(MIDR_EL1, MIDR_EL1);\nGetSysReg(ISAR1_EL1, ID_AA64ISAR1_EL1);\nGetSysReg(MMFR0_EL1, ID_AA64MMFR0_EL1);\nGetSysReg(MMFR2_EL1, ID_AA64MMFR2_EL1);\nGetSysReg(ZFR0_EL1, s3_0_c0_c4_4); // Can't request by name\nGetSysReg(MMFR1_EL1, ID_AA64MMFR1_EL1);\nGetSysReg(ISAR2_EL1, ID_AA64ISAR2_EL1);\nGetSysReg(DCZID_EL0, DCZID_EL0);\n\nclass CPUFeaturesFromID final : public FEX::CPUFeatures {\npublic:\n  CPUFeaturesFromID() {\n    ISAR0.SetReg(Get_ISAR0_EL1());\n    PFR0.SetReg(Get_PFR0_EL1());\n    PFR1.SetReg(Get_PFR1_EL1());\n    MIDR.SetReg(Get_MIDR_EL1());\n    ISAR1.SetReg(Get_ISAR1_EL1());\n    MMFR0.SetReg(Get_MMFR0_EL1());\n    MMFR2.SetReg(Get_MMFR2_EL1());\n    MMFR1.SetReg(Get_MMFR1_EL1());\n    ISAR2.SetReg(Get_ISAR2_EL1());\n    DCZID.SetReg(Get_DCZID_EL0());\n\n    if (PFR0.SupportsSVE()) {\n      // Can only query if SVE is supported.\n      ZFR0.SetReg(Get_ZFR0_EL1());\n    }\n    FillFeatureFlags();\n\n    if (Supports(CPUFeatures::Feature::SVE2)) {\n      SVEVL.SetReg(ReadSVEVectorLengthInBits());\n    }\n  }\n};\n\nFEX::CPUFeatures GetCPUFeaturesFromIDRegisters() {\n  return CPUFeaturesFromID {};\n}\n#endif\n\nclass CPUFeaturesFromConfig final : public FEX::CPUFeatures {\npublic:\n  CPUFeaturesFromConfig(std::string_view Config) {\n    auto to_string_view = [](auto rng) {\n      return std::string_view(&*rng.begin(), ranges::distance(rng));\n    };\n\n    for (auto Option : ranges::views::split(Config, ',') | ranges::views::transform(to_string_view)) {\n      auto OptionData = ranges::views::split(Option, '=') | ranges::views::transform(to_string_view);\n      auto OptionDataBegin = ranges::begin(OptionData);\n      auto OptionDataEnd = ranges::end(OptionData);\n\n      if (OptionDataBegin == OptionDataEnd) {\n        continue;\n      }\n\n      auto Key = *OptionDataBegin;\n      if (Key.empty()) {\n        continue;\n      }\n\n      ++OptionDataBegin;\n      if (OptionDataBegin == OptionDataEnd) {\n        continue;\n      }\n      auto Value = *OptionDataBegin;\n      uint64_t ValueHex {};\n      char* str_end {};\n      ValueHex = std::strtoull(Value.data(), &str_end, 16);\n\n      if (str_end == Value.data()) {\n        LogMan::Msg::EFmt(\"Couldn't parse '{}={}'\\n\", Key, Value);\n        continue;\n      }\n\n      if (Key == \"isar0\") {\n        ISAR0.SetReg(ValueHex);\n      } else if (Key == \"isar1\") {\n        ISAR1.SetReg(ValueHex);\n      } else if (Key == \"isar2\") {\n        ISAR2.SetReg(ValueHex);\n      } else if (Key == \"pfr0\") {\n        PFR0.SetReg(ValueHex);\n      } else if (Key == \"pfr1\") {\n        PFR1.SetReg(ValueHex);\n      } else if (Key == \"midr\") {\n        MIDR.SetReg(ValueHex);\n      } else if (Key == \"mmfr0\") {\n        MMFR0.SetReg(ValueHex);\n      } else if (Key == \"mmfr1\") {\n        MMFR1.SetReg(ValueHex);\n      } else if (Key == \"mmfr2\") {\n        MMFR2.SetReg(ValueHex);\n      } else if (Key == \"zfr0\") {\n        ZFR0.SetReg(ValueHex);\n      } else if (Key == \"dczid\") {\n        DCZID.SetReg(ValueHex);\n      } else if (Key == \"svevl\") {\n        SVEVL.SetReg(ValueHex);\n      } else {\n        LogMan::Msg::EFmt(\"Unknown Key: {}\", Key);\n      }\n    }\n\n    FillFeatureFlags();\n  }\n};\n\nFEX::CPUFeatures GetCPUFeaturesFromConfig(std::string_view Config) {\n  return CPUFeaturesFromConfig {Config};\n}\n\nclass CPUFeaturesAll final : public FEX::CPUFeatures {\npublic:\n  CPUFeaturesAll() {\n    // Special case, just set all feature flags\n    for (uint32_t i = 0; i < FEXCore::ToUnderlying(FEX::CPUFeatures::Feature::MAX); ++i) {\n      SetFeature(FEX::CPUFeatures::Feature {i});\n    }\n\n    // Report unsupported for DCZVA\n    DCZID.SetReg(0b1'0000);\n  }\n};\n\nvoid FEX::CPUFeatures::FillFeatureFlags() {\n  // ISAR0\n  if (ISAR0.SupportsAES()) {\n    SetFeature(Feature::AES);\n  }\n  if (ISAR0.SupportsPMULL()) {\n    SetFeature(Feature::PMULL);\n  }\n  if (ISAR0.SupportsSHA1()) {\n    SetFeature(Feature::SHA1);\n  }\n  if (ISAR0.SupportsSHA2()) {\n    SetFeature(Feature::SHA2);\n  }\n  if (ISAR0.SupportsSHA512()) {\n    SetFeature(Feature::SHA512);\n  }\n  if (ISAR0.SupportsCRC32()) {\n    SetFeature(Feature::CRC32);\n  }\n  if (ISAR0.SupportsLSE()) {\n    SetFeature(Feature::LSE);\n  }\n  if (ISAR0.SupportsLSE128()) {\n    SetFeature(Feature::LSE128);\n  }\n  if (ISAR0.SupportsTME()) {\n    SetFeature(Feature::TME);\n  }\n  if (ISAR0.SupportsRDM()) {\n    SetFeature(Feature::RDM);\n  }\n  if (ISAR0.SupportsSHA3()) {\n    SetFeature(Feature::SHA3);\n  }\n  if (ISAR0.SupportsSM3()) {\n    SetFeature(Feature::SM3);\n  }\n  if (ISAR0.SupportsSM4()) {\n    SetFeature(Feature::SM4);\n  }\n  if (ISAR0.SupportsDotProd()) {\n    SetFeature(Feature::DotProd);\n  }\n  if (ISAR0.SupportsFlagM()) {\n    SetFeature(Feature::FlagM);\n  }\n  if (ISAR0.SupportsFlagM2()) {\n    SetFeature(Feature::FlagM2);\n  }\n  if (ISAR0.SupportsRNDR()) {\n    SetFeature(Feature::RNDR);\n  }\n\n  // PFR0\n  if (PFR0.SupportsFP()) {\n    SetFeature(Feature::FP);\n  }\n  if (PFR0.SupportsHP()) {\n    SetFeature(Feature::FP16);\n  }\n  if (PFR0.SupportsAdvSIMD()) {\n    SetFeature(Feature::ASIMD);\n  }\n  if (PFR0.SupportsASIMDHP()) {\n    SetFeature(Feature::ASIMD16);\n  }\n  if (PFR0.SupportsRAS()) {\n    SetFeature(Feature::RAS);\n  }\n  if (PFR0.SupportsSVE()) {\n    SetFeature(Feature::SVE);\n  }\n  if (PFR0.SupportsDIT()) {\n    SetFeature(Feature::DIT);\n  }\n  if (PFR0.SupportsCSV2()) {\n    SetFeature(Feature::CSV2);\n  }\n  if (PFR0.SupportsCSV3()) {\n    SetFeature(Feature::CSV3);\n  }\n\n  // PFR1\n  if (PFR1.SupportsBTI()) {\n    SetFeature(Feature::BTI);\n  }\n  if (PFR1.SupportsSSBS()) {\n    SetFeature(Feature::SSBS);\n  }\n  if (PFR1.SupportsSSBS()) {\n    SetFeature(Feature::SSBS2);\n  }\n  if (PFR1.SupportsMTE()) {\n    SetFeature(Feature::MTE);\n  }\n  if (PFR1.SupportsMTE2()) {\n    SetFeature(Feature::MTE2);\n  }\n  if (PFR1.SupportsMTE3()) {\n    SetFeature(Feature::MTE3);\n  }\n  if (PFR1.SupportsSME()) {\n    SetFeature(Feature::SME);\n  }\n  if (PFR1.SupportsSME2()) {\n    SetFeature(Feature::SME2);\n  }\n\n  // ISAR1\n  if (ISAR1.SupportsDPB()) {\n    SetFeature(Feature::DPB);\n  }\n  if (ISAR1.SupportsDPB2()) {\n    SetFeature(Feature::DPB2);\n  }\n  if (ISAR1.SupportsJSCVT()) {\n    SetFeature(Feature::JSCVT);\n  }\n  if (ISAR1.SupportsFCMA()) {\n    SetFeature(Feature::FCMA);\n  }\n  if (ISAR1.SupportsLRCPC()) {\n    SetFeature(Feature::LRCPC);\n  }\n  if (ISAR1.SupportsLRCPC2()) {\n    SetFeature(Feature::LRCPC2);\n  }\n  if (ISAR1.SupportsLRCPC3()) {\n    SetFeature(Feature::LRCPC3);\n  }\n  if (ISAR1.SupportsFRINTTS()) {\n    SetFeature(Feature::FRINTTS);\n  }\n  if (ISAR1.SupportsSB()) {\n    SetFeature(Feature::SB);\n  }\n  if (ISAR1.SupportsSPECRES()) {\n    SetFeature(Feature::SPECRES);\n  }\n  if (ISAR1.SupportsSPECRES2()) {\n    SetFeature(Feature::SPECRES2);\n  }\n  if (ISAR1.SupportsBF16()) {\n    SetFeature(Feature::BF16);\n  }\n  if (ISAR1.SupportsSME_F64F64()) {\n    SetFeature(Feature::SME_F64F64);\n  }\n  if (ISAR1.SupportsI8MM()) {\n    SetFeature(Feature::I8MM);\n  }\n  if (ISAR1.SupportsXS()) {\n    SetFeature(Feature::XS);\n  }\n  if (ISAR1.SupportsLS64()) {\n    SetFeature(Feature::LS64);\n  }\n  if (ISAR1.SupportsLS64_V()) {\n    SetFeature(Feature::LS64_V);\n  }\n  if (ISAR1.SupportsLS64_ACCDATA()) {\n    SetFeature(Feature::LS64_ACCDATA);\n  }\n\n  // MMFR0\n  if (MMFR0.SupportsECV()) {\n    SetFeature(Feature::ECV);\n  }\n\n  // MMFR2\n  if (MMFR2.SupportsLSE2()) {\n    SetFeature(Feature::LSE2);\n  }\n\n  // ZFR0\n  if (Supports(Feature::SVE)) {\n    if (ZFR0.SupportsSVE2()) {\n      SetFeature(Feature::SVE2);\n    }\n    if (ZFR0.SupportsSVE2_1()) {\n      SetFeature(Feature::SVE2_1);\n    }\n    if (ZFR0.SupportsSVE_AES()) {\n      SetFeature(Feature::SVE_AES);\n    }\n    if (ZFR0.SupportsSVE_PMULL128()) {\n      SetFeature(Feature::SVE_PMULL128);\n    }\n    if (ZFR0.SupportsSVE_BitPerm()) {\n      SetFeature(Feature::SVE_BitPerm);\n    }\n    if (ZFR0.SupportsSVE_BF16()) {\n      SetFeature(Feature::SVE_BF16);\n    }\n    if (ZFR0.SupportsSVE_B16B16()) {\n      SetFeature(Feature::SVE_B16B16);\n    }\n    if (ZFR0.SupportsSVE_SHA3()) {\n      SetFeature(Feature::SVE_SHA3);\n    }\n    if (ZFR0.SupportsSVE_SM4()) {\n      SetFeature(Feature::SVE_SM4);\n    }\n    if (ZFR0.SupportsSVE_I8MM()) {\n      SetFeature(Feature::SVE_I8MM);\n    }\n    if (ZFR0.SupportsSVE_F32MM()) {\n      SetFeature(Feature::SVE_F32MM);\n    }\n    if (ZFR0.SupportsSVE_F64MM()) {\n      SetFeature(Feature::SVE_F64MM);\n    }\n  }\n\n  // MMFR1\n  if (MMFR1.SupportsAFP()) {\n    SetFeature(Feature::AFP);\n  }\n\n  // ISAR2\n  if (ISAR2.SupportsWFxt()) {\n    SetFeature(Feature::WFxt);\n  }\n  if (ISAR2.SupportsRPRES()) {\n    SetFeature(Feature::RPRES);\n  }\n  if (ISAR2.SupportsPACQARMA3()) {\n    SetFeature(Feature::PACQARMA3);\n  }\n  if (ISAR2.SupportsMOPS()) {\n    SetFeature(Feature::MOPS);\n  }\n  if (ISAR2.SupportsHBC()) {\n    SetFeature(Feature::HBC);\n  }\n  if (ISAR2.SupportsCLRBHB()) {\n    SetFeature(Feature::CLRBHB);\n  }\n  if (ISAR2.SupportsSYSREG128()) {\n    SetFeature(Feature::SYSREG128);\n  }\n  if (ISAR2.SupportsSYSINSTR128()) {\n    SetFeature(Feature::SYSINSTR128);\n  }\n  if (ISAR2.SupportsPRFMSLC()) {\n    SetFeature(Feature::PRFMSLC);\n  }\n  if (ISAR2.SupportsRPRFM()) {\n    SetFeature(Feature::RPRFM);\n  }\n  if (ISAR2.SupportsCSSC()) {\n    SetFeature(Feature::CSSC);\n  }\n}\n\n#ifdef ARCHITECTURE_arm64\nstatic uint32_t GetFPCR() {\n  uint64_t Result {};\n  __asm(\"mrs %[Res], FPCR\" : [Res] \"=r\"(Result));\n  return Result;\n}\n\nstatic void SetFPCR(uint64_t Value) {\n  __asm(\"msr FPCR, %[Value]\" ::[Value] \"r\"(Value));\n}\n\n#endif\n\nstatic void OverrideFeatures(FEXCore::HostFeatures* Features, uint64_t ForceSVEWidth) {\n  // Override features if the user has specifically called for it.\n  FEX_CONFIG_OPT(HostFeatures, HOSTFEATURES);\n  if (!HostFeatures()) {\n    // Early exit if no features are overriden.\n    return;\n  }\n\n#define ENABLE_DISABLE_OPTION(FeatureName, name, enum_name)                                                                        \\\n  do {                                                                                                                             \\\n    const bool Disable##name = (HostFeatures() & FEXCore::Config::HostFeatures::DISABLE##enum_name) != 0;                          \\\n    const bool Enable##name = (HostFeatures() & FEXCore::Config::HostFeatures::ENABLE##enum_name) != 0;                            \\\n    LogMan::Throw::AFmt(!(Disable##name && Enable##name), \"Disabling and Enabling CPU feature (\" #name \") is mutually exclusive\"); \\\n    const bool AlreadyEnabled = Features->FeatureName;                                                                             \\\n    const bool Result = (AlreadyEnabled | Enable##name) & !Disable##name;                                                          \\\n    Features->FeatureName = Result;                                                                                                \\\n  } while (0)\n\n#define GET_SINGLE_OPTION(name, enum_name)                                                              \\\n  const bool Disable##name = (HostFeatures() & FEXCore::Config::HostFeatures::DISABLE##enum_name) != 0; \\\n  const bool Enable##name = (HostFeatures() & FEXCore::Config::HostFeatures::ENABLE##enum_name) != 0;   \\\n  LogMan::Throw::AFmt(!(Disable##name && Enable##name), \"Disabling and Enabling CPU feature (\" #name \") is mutually exclusive\");\n\n  ENABLE_DISABLE_OPTION(SupportsAVX, AVX, AVX);\n  ENABLE_DISABLE_OPTION(SupportsSVE128, SVE, SVE);\n  ENABLE_DISABLE_OPTION(SupportsAFP, AFP, AFP);\n  ENABLE_DISABLE_OPTION(SupportsRCPC, LRCPC, LRCPC);\n  ENABLE_DISABLE_OPTION(SupportsTSOImm9, LRCPC2, LRCPC2);\n  ENABLE_DISABLE_OPTION(SupportsCSSC, CSSC, CSSC);\n  ENABLE_DISABLE_OPTION(SupportsPMULL_128Bit, PMULL128, PMULL128);\n  ENABLE_DISABLE_OPTION(SupportsRAND, RNG, RNG);\n  ENABLE_DISABLE_OPTION(SupportsCLZERO, CLZERO, CLZERO);\n  ENABLE_DISABLE_OPTION(SupportsAtomics, Atomics, ATOMICS);\n  ENABLE_DISABLE_OPTION(SupportsFCMA, FCMA, FCMA);\n  ENABLE_DISABLE_OPTION(SupportsFlagM, FlagM, FLAGM);\n  ENABLE_DISABLE_OPTION(SupportsFlagM2, FlagM2, FLAGM2);\n  ENABLE_DISABLE_OPTION(SupportsFRINTTS, FRINTTS, FRINTTS);\n  ENABLE_DISABLE_OPTION(SupportsRPRES, RPRES, RPRES);\n  ENABLE_DISABLE_OPTION(SupportsSVEBitPerm, SVEBITPERM, SVEBITPERM);\n  ENABLE_DISABLE_OPTION(SupportsPreserveAllABI, PRESERVEALLABI, PRESERVEALLABI);\n  ENABLE_DISABLE_OPTION(SupportsWFXT, WFXT, WFXT);\n  ENABLE_DISABLE_OPTION(Supports3DNow, 3DNOW, 3DNOW);\n  ENABLE_DISABLE_OPTION(SupportsSSE4a, SSE4A, SSE4A);\n  ENABLE_DISABLE_OPTION(SupportsMOPS, MOPS, MOPS);\n  GET_SINGLE_OPTION(Crypto, CRYPTO);\n\n#undef ENABLE_DISABLE_OPTION\n#undef GET_SINGLE_OPTION\n\n  if (EnableCrypto) {\n    Features->SupportsAES = true;\n    Features->SupportsCRC = true;\n    Features->SupportsSHA = true;\n    Features->SupportsPMULL_128Bit = true;\n    Features->SupportsAES256 = true;\n  } else if (DisableCrypto) {\n    Features->SupportsAES = false;\n    Features->SupportsCRC = false;\n    Features->SupportsSHA = false;\n    Features->SupportsPMULL_128Bit = false;\n    Features->SupportsAES256 = false;\n  }\n\n  ///< Only force enable SVE256 if SVE is already enabled and ForceSVEWidth is set to >= 256.\n  Features->SupportsSVE256 = ForceSVEWidth && ForceSVEWidth >= 256;\n}\n\nstatic void HandleErrata(FEXCore::HostFeatures* HostFeatures, uint64_t MIDR) {\n  constexpr uint32_t Implementer_ARM = 0x41;\n  constexpr uint32_t PartNum_V2 = 0xd4f;\n  constexpr uint32_t PartNum_V3 = 0xd84;\n  constexpr uint32_t PartNum_V3AE = 0xd83;\n  constexpr uint32_t PartNum_X3 = 0xd4e;\n  constexpr uint32_t PartNum_X4 = 0xd82;\n  constexpr uint32_t PartNum_X925 = 0xd85;\n  constexpr uint32_t PartNum_C1Ultra = 0xd8c;\n  constexpr uint32_t PartNum_C1Premium = 0xd90;\n\n  constexpr uint32_t Implementer_QCOM = 0x51;\n  constexpr uint32_t PartNum_Oryon1 = 0x001;\n\n  auto GetMIDRImplementer = [](uint32_t MIDR) -> uint32_t {\n    return (MIDR >> 24) & 0xFF;\n  };\n\n  auto GetMIDRPartNum = [](uint32_t MIDR) -> uint32_t {\n    return (MIDR >> 4) & 0xFFF;\n  };\n\n  const uint32_t MIDR_Implementer = GetMIDRImplementer(MIDR);\n  const uint32_t MIDR_PartNum = GetMIDRPartNum(MIDR);\n\n#ifdef ARCHITECTURE_arm64\n  if (MIDR_Implementer == Implementer_QCOM && MIDR_PartNum == PartNum_Oryon1) {\n    // Work around an errata in Qualcomm's Oryon.\n    // While this CPU implements the RAND extension:\n    // - The RNDR register works.\n    // - The RNDRRS register will never read a random number. (Always return failure)\n    // This is contrary to x86 RNG behaviour where it allows spurious failure with RDSEED, but guarantees eventual success.\n    // This manifested itself on Linux when an x86 processor failed to guarantee forward progress and boot of services would infinite\n    // loop. Just disable this extension if this CPU is detected.\n    HostFeatures->SupportsRAND = false;\n  }\n#endif\n\n  // The LDAPUR instruction suffers from significant performance issues on many ARM implementations. This is\n  // listed in the official Cortex errata list as follows:\n  //\n  // 3877900\n  // LDAPUR, LDAPURB, LDAPURH instructions have stricter memory ordering than required\n  //\n  // LDAPUR instructions execute with full Load-Acquire ordering instead of the relaxed ordering described\n  // in the LDAPUR pseudocode. This might cause significant performance degradation in workloads that do\n  // not require this stricter memory ordering. Note that this erratum only affects the unscaled versions of\n  // LDAPUR (LDAPUR, LDAPURB, LDAPURH), and not LDAPR (LDAPR, LDAPRB, LDAPRH).\n  //\n  // The list of cores to disable its use on was taken from the following LLVM PR that accomplishes the same\n  // thing: https://github.com/llvm/llvm-project/pull/124274\n  for (uint32_t CoreIndex = 0; CoreIndex < HostFeatures->CPUMIDRs.size(); CoreIndex++) {\n    const uint32_t CoreMIDR = HostFeatures->CPUMIDRs[CoreIndex];\n    const uint32_t Core_MIDR_Implementer = GetMIDRImplementer(CoreMIDR);\n    const uint32_t Core_MIDR_PartNum = GetMIDRPartNum(CoreMIDR);\n\n    bool IgnoreLRCPC2 = (Core_MIDR_Implementer == Implementer_ARM) &&\n                        ((Core_MIDR_PartNum == PartNum_V2) || (Core_MIDR_PartNum == PartNum_V3) || (Core_MIDR_PartNum == PartNum_X3) ||\n                         (Core_MIDR_PartNum == PartNum_X4) || (Core_MIDR_PartNum == PartNum_X925) || (Core_MIDR_PartNum == PartNum_V3AE) ||\n                         (Core_MIDR_PartNum == PartNum_C1Ultra) || (Core_MIDR_PartNum == PartNum_C1Premium));\n\n    if (IgnoreLRCPC2) {\n      HostFeatures->SupportsTSOImm9 = false;\n      break;\n    }\n  }\n}\n\nvoid FetchHostFeatures(FEX::CPUFeatures& Features, FEXCore::HostFeatures& HostFeatures, bool SupportsCacheMaintenanceOps, uint64_t CTR,\n                       uint64_t MIDR) {\n  FEX_CONFIG_OPT(ForceSVEWidth, FORCESVEWIDTH);\n  FEX_CONFIG_OPT(Is64BitMode, IS64BIT_MODE);\n\n  HostFeatures.SupportsCacheMaintenanceOps = SupportsCacheMaintenanceOps;\n\n  HostFeatures.SupportsAES = Features.Supports(CPUFeatures::Feature::AES);\n  HostFeatures.SupportsCRC = Features.Supports(CPUFeatures::Feature::CRC32);\n  HostFeatures.SupportsSHA = Features.Supports(CPUFeatures::Feature::SHA1) && Features.Supports(CPUFeatures::Feature::SHA2);\n  HostFeatures.SupportsAtomics = Features.Supports(CPUFeatures::Feature::LSE);\n  HostFeatures.SupportsRAND = Features.Supports(CPUFeatures::Feature::RNDR);\n\n  // Only supported when FEAT_AFP is supported\n  HostFeatures.SupportsAFP = Features.Supports(CPUFeatures::Feature::AFP);\n  HostFeatures.SupportsRCPC = Features.Supports(CPUFeatures::Feature::LRCPC);\n  HostFeatures.SupportsTSOImm9 = Features.Supports(CPUFeatures::Feature::LRCPC2);\n  HostFeatures.SupportsPMULL_128Bit = Features.Supports(CPUFeatures::Feature::PMULL);\n  HostFeatures.SupportsCSSC = Features.Supports(CPUFeatures::Feature::CSSC);\n  HostFeatures.SupportsFCMA = Features.Supports(CPUFeatures::Feature::FCMA);\n  HostFeatures.SupportsFlagM = Features.Supports(CPUFeatures::Feature::FlagM);\n  HostFeatures.SupportsFlagM2 = Features.Supports(CPUFeatures::Feature::FlagM2);\n  HostFeatures.SupportsFRINTTS = Features.Supports(CPUFeatures::Feature::FRINTTS);\n  HostFeatures.SupportsRPRES = Features.Supports(CPUFeatures::Feature::RPRES);\n  HostFeatures.SupportsSVEBitPerm = Features.Supports(CPUFeatures::Feature::SVE_BitPerm);\n  HostFeatures.SupportsECV = Features.Supports(CPUFeatures::Feature::ECV);\n  HostFeatures.SupportsWFXT = Features.Supports(CPUFeatures::Feature::WFxt);\n\n#ifdef VIXL_SIMULATOR\n  // Hardcode enable SVE with 256-bit wide registers.\n  HostFeatures.SupportsSVE128 = ForceSVEWidth() ? ForceSVEWidth() >= 128 : true;\n  HostFeatures.SupportsSVE256 = ForceSVEWidth() ? ForceSVEWidth() >= 256 : true;\n  HostFeatures.SupportsMOPS = true;\n\n  // Simulator has a hardcoded ZVA size of 64-bytes.\n  HostFeatures.SupportsCLZERO = true;\n  HostFeatures.SupportsAES = true;\n  HostFeatures.SupportsCRC = true;\n  HostFeatures.SupportsAVX = true;\n  HostFeatures.SupportsSHA = true;\n  HostFeatures.SupportsPMULL_128Bit = true;\n  HostFeatures.SupportsAES256 = true;\n\n  // Simulator doesn't support these\n  HostFeatures.SupportsRPRES = false;\n  HostFeatures.SupportsAFP = false;\n#else\n  HostFeatures.SupportsSVE128 = Features.Supports(CPUFeatures::Feature::SVE2);\n  HostFeatures.SupportsSVE256 = Features.Supports(CPUFeatures::Feature::SVE2) && Features.GetSVEVectorLengthInBits() >= 256;\n  HostFeatures.SupportsMOPS = Features.Supports(CPUFeatures::Feature::MOPS);\n\n  // Check if we can support cacheline clears\n  if (Features.GetDCZID().SupportsDCZVA()) {\n    // If the DC ZVA size matches the emulated cache line size\n    // This means we can use the instruction\n    constexpr static uint64_t CACHELINE_SIZE = 64;\n    HostFeatures.SupportsCLZERO = Features.GetDCZID().BlockSizeInBytes() == CACHELINE_SIZE;\n  }\n#endif\n\n  HostFeatures.SupportsAVX = true;\n  HostFeatures.SupportsAES256 = HostFeatures.SupportsAVX && HostFeatures.SupportsAES;\n  HostFeatures.SupportsPreserveAllABI = FEX_HAS_PRESERVE_ALL_ATTR;\n\n  if (CTR) {\n    HostFeatures.DCacheLineSize = 4 << ((CTR >> 16) & 0xF);\n    HostFeatures.ICacheLineSize = 4 << (CTR & 0xF);\n  } else {\n    HostFeatures.DCacheLineSize = 64;\n    HostFeatures.ICacheLineSize = 64;\n  }\n\n  if (!HostFeatures.SupportsAtomics) {\n    WARN_ONCE_FMT(\"Host CPU doesn't support atomics. Expect bad performance\");\n  }\n\n#ifdef _WIN32\n  // Disable 3DNow! by default to better match the set of extensions exposed on modern CPUs.\n  // This works around a bug that manifests in some games using native d3dx9 DLLs (most easily reproduced in WoW64 builds).\n  // For example, Fallout: New Vegas and some old EA games will run with a blackscreen.\n  HostFeatures.Supports3DNow = false;\n#else\n  HostFeatures.Supports3DNow = true;\n#endif\n\n#ifdef ARCHITECTURE_arm64\n  // Test if this CPU supports float exception trapping by attempting to enable\n  // On unsupported these bits are architecturally defined as RAZ/WI\n  constexpr uint32_t ExceptionEnableTraps = (1U << 8) |  // Invalid Operation float exception trap enable\n                                            (1U << 9) |  // Divide by zero float exception trap enable\n                                            (1U << 10) | // Overflow float exception trap enable\n                                            (1U << 11) | // Underflow float exception trap enable\n                                            (1U << 12) | // Inexact float exception trap enable\n                                            (1U << 15);  // Input Denormal float exception trap enable\n\n  uint32_t OriginalFPCR = GetFPCR();\n  uint32_t FPCR = OriginalFPCR | ExceptionEnableTraps;\n  SetFPCR(FPCR);\n  FPCR = GetFPCR();\n  HostFeatures.SupportsFloatExceptions = (FPCR & ExceptionEnableTraps) == ExceptionEnableTraps;\n\n  // Set FPCR back to original just in case anything changed\n  SetFPCR(OriginalFPCR);\n#endif\n\n#if defined(ARCHITECTURE_x86_64) && !defined(VIXL_SIMULATOR)\n  FEX::X86::Features Feature {};\n  HostFeatures.SupportsAES = Feature.Feat_aes;\n  HostFeatures.SupportsCRC = Feature.Feat_crc;\n  HostFeatures.SupportsRAND = Feature.Feat_rand;\n  HostFeatures.SupportsRCPC = true;\n  HostFeatures.SupportsTSOImm9 = true;\n  HostFeatures.SupportsAVX = Feature.Feat_avx;\n  HostFeatures.SupportsSHA = Feature.Feat_sha;\n  HostFeatures.SupportsPMULL_128Bit = Feature.Feat_pclmulqdq;\n  HostFeatures.SupportsAES256 = Feature.Feat_aes;\n  HostFeatures.SupportsCLZERO = Feature.Feat_clzero;\n\n  HostFeatures.SupportsAFP = true;\n  HostFeatures.SupportsFloatExceptions = true;\n#endif\n\n  HandleErrata(&HostFeatures, MIDR);\n  OverrideFeatures(&HostFeatures, ForceSVEWidth());\n}\n\nFEXCore::HostFeatures FetchHostFeatures() {\n  FEX_CONFIG_OPT(CPUFeatureRegisters, CPUFEATUREREGISTERS);\n\n  CPUFeatures Features {};\n  if (!CPUFeatureRegisters().empty()) {\n    Features = GetCPUFeaturesFromConfig(CPUFeatureRegisters());\n  } else {\n#ifdef ARCHITECTURE_x86_64\n    Features = CPUFeaturesAll {};\n\n    // Vixl simulator doesn't support AFP.\n    Features.RemoveFeature(CPUFeatures::Feature::AFP);\n    // Vixl simulator doesn't support RPRES.\n    Features.RemoveFeature(CPUFeatures::Feature::RPRES);\n#else\n    Features = GetCPUFeaturesFromIDRegisters();\n#endif\n  }\n\n  uint64_t CTR = 0;\n  uint64_t MIDR = 0;\n#ifdef ARCHITECTURE_arm64\n  // We need to get the CPU's cache line size\n  // We expect sane targets that have correct cacheline sizes across clusters\n  __asm volatile(\"mrs %[ctr], ctr_el0\" : [ctr] \"=r\"(CTR));\n  __asm volatile(\"mrs %[midr], midr_el1\" : [midr] \"=r\"(MIDR));\n#endif\n\n  FEXCore::HostFeatures HostFeatures = {};\n  FillMIDRInformationViaLinux(&HostFeatures);\n  FetchHostFeatures(Features, HostFeatures, true, CTR, MIDR);\n\n  HostFeatures.SupportsCPUIndexInTPIDRRO = false;\n  return HostFeatures;\n}\n} // namespace FEX\n"
  },
  {
    "path": "Source/Common/HostFeatures.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/Core/HostFeatures.h>\n#include <FEXCore/Utils/EnumUtils.h>\n\n#include <cstddef>\n\nnamespace FEX {\nclass CPUFeatures {\npublic:\n  class FeatureReg {\n  public:\n    void SetReg(uint64_t _Reg) {\n      Reg = _Reg;\n    }\n\n    uint64_t Get() const {\n      return Reg;\n    }\n  protected:\n    // All feature flag fields are 4-bits.\n    uint64_t GetField(uint64_t Offset) const {\n      return (Reg >> Offset) & 0b1111;\n    }\n    uint64_t Reg {};\n  };\n\n  enum class Feature : uint32_t {\n    // ISAR0\n    AES,\n    PMULL,\n    SHA1,\n    SHA2,\n    SHA512,\n    CRC32,\n    LSE,\n    LSE128,\n    TME,\n    RDM,\n    SHA3,\n    SM3,\n    SM4,\n    DotProd,\n    FlagM,\n    FlagM2,\n    RNDR,\n    // PFR0\n    FP,\n    FP16,\n    ASIMD,\n    ASIMD16,\n    RAS,\n    SVE,\n    DIT,\n    CSV2,\n    CSV3,\n    // PFR1\n    BTI,\n    SSBS,\n    SSBS2,\n    MTE,\n    MTE2,\n    MTE3,\n    SME,\n    SME2,\n    // ISAR1\n    DPB,\n    DPB2,\n    JSCVT,\n    FCMA,\n    LRCPC,\n    LRCPC2,\n    LRCPC3,\n    FRINTTS,\n    SB,\n    SPECRES,\n    SPECRES2,\n    BF16,\n    SME_F64F64,\n    I8MM,\n    XS,\n    LS64,\n    LS64_V,\n    LS64_ACCDATA,\n    // MMFR0\n    ECV,\n    // MMFR2\n    LSE2,\n    // ZFR0\n    SVE2,\n    SVE2_1,\n    SVE_AES,\n    SVE_PMULL128,\n    SVE_BitPerm,\n    SVE_BF16,\n    SVE_B16B16,\n    SVE_SHA3,\n    SVE_SM4,\n    SVE_I8MM,\n    SVE_F32MM,\n    SVE_F64MM,\n    // MMFR1\n    AFP,\n    // ISAR2\n    WFxt,\n    RPRES,\n    PACQARMA3,\n    MOPS,\n    HBC,\n    CLRBHB,\n    SYSREG128,\n    SYSINSTR128,\n    PRFMSLC,\n    RPRFM,\n    CSSC,\n    // Max indicator\n    MAX,\n  };\n\n  class DCZIDReg final : public FeatureReg {\n  public:\n    bool SupportsDCZVA() const {\n      return (Reg & DCZID_DZP_MASK) == 0;\n    }\n\n    uint32_t BlockSizeInBytes() const {\n      uint32_t DCZID_Log2 = Reg & DCZID_BS_MASK;\n      return (1 << DCZID_Log2) * sizeof(uint32_t);\n    }\n\n  private:\n    // Data Zero Prohibited flag\n    // 0b0 = ZVA/GVA/GZVA permitted\n    // 0b1 = ZVA/GVA/GZVA prohibited\n    [[maybe_unused]] constexpr static uint32_t DCZID_DZP_MASK = 0b1'0000;\n    // Log2 of the blocksize in 32-bit words\n    [[maybe_unused]] constexpr static uint32_t DCZID_BS_MASK = 0b0'1111;\n  };\n\n  // This list is informed by Linux kernel's `Documentation/arch/arm64/cpu-feature-registers.rst`\n  enum class FeatureRegType {\n    ISAR0_EL1,\n    PFR0_EL1,\n    PFR1_EL1,\n    MIDR_EL1,\n    ISAR1_EL1,\n    MMFR0_EL1,\n    MMFR2_EL1,\n    ZFR0_EL1,\n    MMFR1_EL1,\n    ISAR2_EL1,\n  };\n\n#define FIELD_FETCHER(feature, field, minimum_field) \\\n  bool Supports##feature() const {                   \\\n    return GetField(field) >= minimum_field;         \\\n  }\n\n  class ISAR0Reg final : public FeatureReg {\n  public:\n    FIELD_FETCHER(AES, AES, 0b0001);\n    FIELD_FETCHER(PMULL, AES, 0b0010);\n\n    FIELD_FETCHER(SHA1, SHA1, 0b0001);\n\n    FIELD_FETCHER(SHA2, SHA2, 0b0001);\n    FIELD_FETCHER(SHA512, SHA2, 0b0010);\n\n    FIELD_FETCHER(CRC32, CRC32, 0b0001);\n\n    FIELD_FETCHER(LSE, Atomic, 0b0010);\n    FIELD_FETCHER(LSE128, Atomic, 0b0011);\n\n    FIELD_FETCHER(TME, TME, 0b0001);\n\n    FIELD_FETCHER(RDM, RDM, 0b0001);\n\n    FIELD_FETCHER(SHA3, SHA3, 0b0001);\n\n    FIELD_FETCHER(SM3, SM3, 0b0001);\n\n    FIELD_FETCHER(SM4, SM4, 0b0001);\n\n    FIELD_FETCHER(DotProd, DP, 0b0001);\n\n    FIELD_FETCHER(FHM, FHM, 0b0001);\n\n    FIELD_FETCHER(FlagM, TS, 0b0001);\n    FIELD_FETCHER(FlagM2, TS, 0b0010);\n\n    FIELD_FETCHER(TLBIOS, TLB, 0b0001);\n    FIELD_FETCHER(TLBIRANGE, TLB, 0b0010);\n\n    FIELD_FETCHER(RNDR, RNDR, 0b0001);\n\n  private:\n    enum Field {\n      RES0 = 0 * 4,\n      AES = 1 * 4,\n      SHA1 = 2 * 4,\n      SHA2 = 3 * 4,\n      CRC32 = 4 * 4,\n      Atomic = 5 * 4,\n      TME = 6 * 4,\n      RDM = 7 * 4,\n      SHA3 = 8 * 4,\n      SM3 = 9 * 4,\n      SM4 = 10 * 4,\n      DP = 11 * 4,\n      FHM = 12 * 4,\n      TS = 13 * 4,\n      TLB = 14 * 4,\n      RNDR = 15 * 4,\n    };\n  };\n\n  class PFR0Reg final : public FeatureReg {\n  public:\n    FIELD_FETCHER(AA64_EL0, EL0, 0b0001);\n    FIELD_FETCHER(AA32_EL0, EL0, 0b0010);\n\n    FIELD_FETCHER(AA64_EL1, EL1, 0b0001);\n    FIELD_FETCHER(AA32_EL1, EL1, 0b0010);\n\n    FIELD_FETCHER(AA64_EL2, EL2, 0b0001);\n    FIELD_FETCHER(AA32_EL2, EL2, 0b0010);\n\n    FIELD_FETCHER(AA64_EL3, EL3, 0b0001);\n    FIELD_FETCHER(AA32_EL3, EL3, 0b0010);\n\n    bool SupportsFP() const {\n      return GetField(FP) != 0b1111;\n    }\n    FIELD_FETCHER(HP, FP, 0b0001);\n\n    bool SupportsAdvSIMD() const {\n      return GetField(AdvSIMD) != 0b1111;\n    }\n    FIELD_FETCHER(ASIMDHP, AdvSIMD, 0b0001);\n\n    FIELD_FETCHER(GIC4_0, GIC, 0b0001);\n    FIELD_FETCHER(GIC4_1, GIC, 0b0011);\n\n    FIELD_FETCHER(RAS, RAS, 0b0001);\n    FIELD_FETCHER(RAS1_1, RAS, 0b0010);\n    FIELD_FETCHER(RAS2, RAS, 0b0011);\n\n    FIELD_FETCHER(SVE, SVE, 0b0001);\n\n    FIELD_FETCHER(SEL2, SEL2, 0b0001);\n\n    uint64_t MPAM_Major() const {\n      return GetField(MPAM);\n    }\n\n    FIELD_FETCHER(AMU1, AMU, 0b0001);\n    FIELD_FETCHER(AMU1_1, AMU, 0b0010);\n\n    FIELD_FETCHER(DIT, DIT, 0b0001);\n\n    FIELD_FETCHER(RME, RME, 0b0001);\n\n    FIELD_FETCHER(CSV2, CSV2, 0b0001);\n    FIELD_FETCHER(CSV2_2, CSV2, 0b0010);\n    FIELD_FETCHER(CSV2_3, CSV2, 0b0011);\n\n    FIELD_FETCHER(CSV3, CSV3, 0b0001);\n\n  private:\n    enum Field {\n      EL0 = 0 * 4,\n      EL1 = 1 * 4,\n      EL2 = 2 * 4,\n      EL3 = 3 * 4,\n      FP = 4 * 4,\n      AdvSIMD = 5 * 4,\n      GIC = 6 * 4,\n      RAS = 7 * 4,\n      SVE = 8 * 4,\n      SEL2 = 9 * 4,\n      MPAM = 10 * 4,\n      AMU = 11 * 4,\n      DIT = 12 * 4,\n      RME = 13 * 4,\n      CSV2 = 14 * 4,\n      CSV3 = 15 * 4,\n    };\n  };\n\n  class PFR1Reg final : public FeatureReg {\n  public:\n    FIELD_FETCHER(BTI, BT, 0b0001);\n\n    FIELD_FETCHER(SSBS, SSBS, 0b0001);\n    FIELD_FETCHER(SSBS2, SSBS, 0b0010);\n\n    FIELD_FETCHER(MTE, MTE, 0b0001);\n    FIELD_FETCHER(MTE2, MTE, 0b0010);\n    FIELD_FETCHER(MTE3, MTE, 0b0011);\n\n    uint64_t RAS_Minor() const {\n      return GetField(RAS_frac);\n    }\n    uint64_t MPAM_Minor() const {\n      return GetField(MPAM_frac);\n    }\n\n    FIELD_FETCHER(SME, SME, 0b0001);\n    FIELD_FETCHER(SME2, SME, 0b0010);\n\n    FIELD_FETCHER(RNDR_trap, RNDR_trap, 0b0001);\n\n    uint64_t CSV2_Minor() const {\n      return GetField(CSV2_frac);\n    }\n\n    FIELD_FETCHER(NMI, NMI, 0b0001);\n\n    uint64_t MTE_Minor() const {\n      return GetField(MTE_frac);\n    }\n\n    FIELD_FETCHER(GCS, GCS, 0b0001);\n\n    FIELD_FETCHER(THE, THE, 0b0001);\n\n    FIELD_FETCHER(MTEX, MTEX, 0b0001);\n\n    FIELD_FETCHER(DoubleFault2, DF2, 0b0001);\n\n    FIELD_FETCHER(PFAR, PFAR, 0b0001);\n\n  private:\n    enum Field {\n      BT = 0 * 4,\n      SSBS = 1 * 4,\n      MTE = 2 * 4,\n      RAS_frac = 3 * 4,\n      MPAM_frac = 4 * 4,\n      RES0 = 5 * 4,\n      SME = 6 * 4,\n      RNDR_trap = 7 * 4,\n      CSV2_frac = 8 * 4,\n      NMI = 9 * 4,\n      MTE_frac = 10 * 4,\n      GCS = 11 * 4,\n      THE = 12 * 4,\n      MTEX = 13 * 4,\n      DF2 = 14 * 4,\n      PFAR = 15 * 4,\n    };\n  };\n\n  class MIDRReg final : public FeatureReg {\n  public:\n    uint64_t GetRevision() const {\n      return GetField(Revision);\n    }\n    uint64_t GetPartNum() const {\n      return (Reg >> 4) & 0xFFF;\n    }\n    uint64_t GetArchitecture() const {\n      return GetField(Architecture);\n    }\n    uint64_t GetVariant() const {\n      return GetField(Variant);\n    }\n    uint64_t GetImplementer() const {\n      return (Reg >> 24) & 0xFFFF;\n    }\n\n  private:\n    enum Field {\n      Revision = 0 * 4,\n      // Partnum is 3 fields [15:4]\n      Architecture = 4 * 4,\n      Variant = 5 * 4,\n      // Implementer is 2 fields [31:24]\n      // Upper 32-bits is entirely reserved\n    };\n  };\n\n  class ISAR1Reg final : public FeatureReg {\n  public:\n    FIELD_FETCHER(DPB, DPB, 0b0001);\n    FIELD_FETCHER(DPB2, DPB, 0b0010);\n\n    // Ignoring APA and API\n\n    FIELD_FETCHER(JSCVT, JSCVT, 0b0001);\n\n    FIELD_FETCHER(FCMA, FCMA, 0b0001);\n\n    FIELD_FETCHER(LRCPC, LRCPC, 0b0001);\n    FIELD_FETCHER(LRCPC2, LRCPC, 0b0010);\n    FIELD_FETCHER(LRCPC3, LRCPC, 0b0011);\n\n    // Ignoring GPA and GPI\n\n    FIELD_FETCHER(FRINTTS, FRINTTS, 0b0001);\n\n    FIELD_FETCHER(SB, SB, 0b0001);\n\n    FIELD_FETCHER(SPECRES, SPECRES, 0b0001);\n    FIELD_FETCHER(SPECRES2, SPECRES, 0b0010);\n\n    FIELD_FETCHER(BF16, BF16, 0b0001);\n    FIELD_FETCHER(SME_F64F64, BF16, 0b0010);\n\n    FIELD_FETCHER(DGH, DGH, 0b0001);\n\n    FIELD_FETCHER(I8MM, I8MM, 0b0001);\n\n    FIELD_FETCHER(XS, XS, 0b0001);\n\n    FIELD_FETCHER(LS64, LS64, 0b0001);\n    FIELD_FETCHER(LS64_V, LS64, 0b0010);\n    FIELD_FETCHER(LS64_ACCDATA, LS64, 0b0011);\n\n  private:\n    enum Field {\n      DPB = 0 * 4,\n      APA = 1 * 4,\n      API = 2 * 4,\n      JSCVT = 3 * 4,\n      FCMA = 4 * 4,\n      LRCPC = 5 * 4,\n      GPA = 6 * 4,\n      GPI = 7 * 4,\n      FRINTTS = 8 * 4,\n      SB = 9 * 4,\n      SPECRES = 10 * 4,\n      BF16 = 11 * 4,\n      DGH = 12 * 4,\n      I8MM = 13 * 4,\n      XS = 14 * 4,\n      LS64 = 15 * 4,\n    };\n  };\n\n  class MMFR0Reg final : public FeatureReg {\n  public:\n    FIELD_FETCHER(ECV, ECV, 0b0010);\n\n  private:\n    enum Field {\n      PARange = 0 * 4,\n      ASIDBits = 1 * 4,\n      BigEnd = 2 * 4,\n      SNSMem = 3 * 4,\n      BigEndEL0 = 4 * 4,\n      TGran16 = 5 * 4,\n      TGran64 = 6 * 4,\n      TGran4 = 7 * 4,\n      TGran16_2 = 8 * 4,\n      TGran64_2 = 9 * 4,\n      TGran4_2 = 10 * 4,\n      ExS = 11 * 4,\n      RES0 = 12 * 4,\n      RES1 = 13 * 4,\n      FGT = 14 * 4,\n      ECV = 15 * 4,\n    };\n  };\n\n  class MMFR2Reg final : public FeatureReg {\n  public:\n    FIELD_FETCHER(LSE2, AT, 0b0001);\n\n  private:\n    enum Field {\n      CnP = 0 * 4,\n      UAO = 1 * 4,\n      LSM = 2 * 4,\n      IESB = 3 * 4,\n      VARange = 4 * 4,\n      CCIDX = 5 * 4,\n      NV = 6 * 4,\n      ST = 7 * 4,\n      AT = 8 * 4,\n      IDS = 9 * 4,\n      FWB = 10 * 4,\n      RES0 = 11 * 4,\n      TTL = 12 * 4,\n      BBM = 13 * 4,\n      EVT = 14 * 4,\n      E0PD = 15 * 4,\n    };\n  };\n\n  class ZFR0Reg final : public FeatureReg {\n  public:\n    FIELD_FETCHER(SVE2, SVEver, 0b0001);\n    FIELD_FETCHER(SVE2_1, SVEver, 0b0010);\n\n    FIELD_FETCHER(SVE_AES, AES, 0b0001);\n    FIELD_FETCHER(SVE_PMULL128, AES, 0b0010);\n\n    FIELD_FETCHER(SVE_BitPerm, BitPerm, 0b0001);\n\n    FIELD_FETCHER(SVE_BF16, BF16, 0b0001);\n    FIELD_FETCHER(SME_F64F64, BF16, 0b0010);\n\n    FIELD_FETCHER(SVE_B16B16, B16B16, 0b0010);\n\n    FIELD_FETCHER(SVE_SHA3, SHA3, 0b0001);\n\n    FIELD_FETCHER(SVE_SM4, SM4, 0b0001);\n\n    FIELD_FETCHER(SVE_I8MM, I8MM, 0b0001);\n\n    FIELD_FETCHER(SVE_F32MM, F32MM, 0b0001);\n\n    FIELD_FETCHER(SVE_F64MM, F64MM, 0b0001);\n\n  private:\n    enum Field {\n      SVEver = 0 * 4,\n      AES = 1 * 4,\n      RES0 = 2 * 4,\n      RES1 = 3 * 4,\n      BitPerm = 4 * 4,\n      BF16 = 5 * 4,\n      B16B16 = 6 * 4,\n      RES2 = 7 * 4,\n      SHA3 = 8 * 4,\n      RES3 = 9 * 4,\n      SM4 = 10 * 4,\n      I8MM = 11 * 4,\n      RES4 = 12 * 4,\n      F32MM = 13 * 4,\n      F64MM = 14 * 4,\n      RES5 = 15 * 4,\n    };\n  };\n\n  class MMFR1Reg final : public FeatureReg {\n  public:\n    FIELD_FETCHER(AFP, AFP, 0b0001);\n\n  private:\n    enum Field {\n      HAFDBS = 0 * 4,\n      VMIDBits = 1 * 4,\n      VH = 2 * 4,\n      HPDS = 3 * 4,\n      LO = 4 * 4,\n      PAN = 5 * 4,\n      SpecSEI = 6 * 4,\n      XNX = 7 * 4,\n      TWED = 8 * 4,\n      ETS = 9 * 4,\n      HCX = 10 * 4,\n      AFP = 11 * 4,\n      nTLBPA = 12 * 4,\n      TIDCP1 = 13 * 4,\n      CMOW = 14 * 4,\n      ECBHB = 15 * 4,\n    };\n  };\n\n  class ISAR2Reg final : public FeatureReg {\n  public:\n    FIELD_FETCHER(WFxt, WFxt, 0b0010);\n\n    FIELD_FETCHER(RPRES, RPRES, 0b0001);\n\n    FIELD_FETCHER(PACQARMA3, GPA3, 0b0001);\n\n    FIELD_FETCHER(MOPS, MOPS, 0b0001);\n\n    FIELD_FETCHER(HBC, BC, 0b0001);\n\n    uint64_t PAC_Minor() const {\n      return GetField(PAC_frac);\n    }\n\n    FIELD_FETCHER(CLRBHB, CLRBHB, 0b0001);\n\n    FIELD_FETCHER(SYSREG128, SYSREG_128, 0b0001);\n\n    FIELD_FETCHER(SYSINSTR128, SYSINSTR_128, 0b0001);\n\n    FIELD_FETCHER(PRFMSLC, PRFMSLC, 0b0001);\n\n    FIELD_FETCHER(RPRFM, RPRFM, 0b0001);\n\n    FIELD_FETCHER(CSSC, CSSC, 0b0001);\n\n  private:\n    enum Field {\n      WFxt = 0 * 4,\n      RPRES = 1 * 4,\n      GPA3 = 2 * 4,\n      APA3 = 3 * 4,\n      MOPS = 4 * 4,\n      BC = 5 * 4,\n      PAC_frac = 6 * 4,\n      CLRBHB = 7 * 4,\n      SYSREG_128 = 8 * 4,\n      SYSINSTR_128 = 9 * 4,\n      PRFMSLC = 10 * 4,\n      RES0 = 11 * 4,\n      RPRFM = 12 * 4,\n      CSSC = 13 * 4,\n      RES1 = 14 * 4,\n      ATS1A = 15 * 4,\n    };\n  };\n\n  class SVEVLReg final : public FeatureReg {};\n#undef FIELD_FETCHER\n\n\n  ISAR0Reg ISAR0;\n  PFR0Reg PFR0;\n  PFR1Reg PFR1;\n  MIDRReg MIDR;\n  ISAR1Reg ISAR1;\n  MMFR0Reg MMFR0;\n  ZFR0Reg ZFR0;\n  MMFR2Reg MMFR2;\n  MMFR1Reg MMFR1;\n  ISAR2Reg ISAR2;\n  DCZIDReg DCZID;\n  SVEVLReg SVEVL;\n\n  static_assert(FEXCore::ToUnderlying(Feature::MAX) < 128);\n  static_assert((FEXCore::ToUnderlying(Feature::MAX) / (sizeof(uint64_t) * 8)) == 1);\n\n  bool Supports(Feature feat) const {\n    const size_t DWordSelect = FEXCore::ToUnderlying(feat) / (sizeof(uint64_t) * 8);\n    const size_t BitSelect = FEXCore::ToUnderlying(feat) - (DWordSelect * (sizeof(uint64_t) * 8));\n    return (FeatureBits[DWordSelect] >> BitSelect) & 1;\n  }\n\n  void RemoveFeature(Feature feat) {\n    const size_t DWordSelect = FEXCore::ToUnderlying(feat) / (sizeof(uint64_t) * 8);\n    const size_t BitSelect = FEXCore::ToUnderlying(feat) - (DWordSelect * (sizeof(uint64_t) * 8));\n    FeatureBits[DWordSelect] &= ~(1ULL << BitSelect);\n  }\n\n  const DCZIDReg& GetDCZID() const {\n    return DCZID;\n  }\n\n  uint64_t GetSVEVectorLengthInBits() const {\n    return SVEVL.Get();\n  }\n\nprotected:\n  void FillFeatureFlags();\n\n  uint64_t FeatureBits[(FEXCore::ToUnderlying(Feature::MAX) / (sizeof(uint64_t) * 8)) + 1] {};\n\n  void SetFeature(Feature feat) {\n    const size_t DWordSelect = FEXCore::ToUnderlying(feat) / (sizeof(uint64_t) * 8);\n    const size_t BitSelect = FEXCore::ToUnderlying(feat) - (DWordSelect * (sizeof(uint64_t) * 8));\n    FeatureBits[DWordSelect] |= 1ULL << BitSelect;\n  }\n};\n\nvoid FillMIDRInformationViaLinux(FEXCore::HostFeatures* Features);\n\nvoid FetchHostFeatures(FEX::CPUFeatures& Features, FEXCore::HostFeatures& HostFeatures, bool SupportsCacheMaintenanceOps, uint64_t CTR,\n                       uint64_t MIDR);\nFEXCore::HostFeatures FetchHostFeatures();\nFEX::CPUFeatures GetCPUFeaturesFromIDRegisters();\n} // namespace FEX\n"
  },
  {
    "path": "Source/Common/JSONPool.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Common/JSONPool.h\"\n\nnamespace FEX::JSON {\nstatic json_t* PoolInit(jsonPool_t* Pool) {\n  auto* alloc = static_cast<JsonAllocator*>(Pool);\n  return &*alloc->json_objects.emplace(alloc->json_objects.end());\n}\n\nstatic json_t* PoolAlloc(jsonPool_t* Pool) {\n  auto* alloc = static_cast<JsonAllocator*>(Pool);\n  return &*alloc->json_objects.emplace(alloc->json_objects.end());\n}\n\nJsonAllocator::JsonAllocator()\n  : jsonPool_t {\n      .init = PoolInit,\n      .alloc = PoolAlloc,\n    } {}\n} // namespace FEX::JSON\n"
  },
  {
    "path": "Source/Common/JSONPool.h",
    "content": "// SPDX-License-Identifier: MIT\n\n#include <FEXCore/fextl/list.h>\n\n#include <iterator>\n#include <tiny-json.h>\n\nnamespace FEX::JSON {\nstruct JsonAllocator : jsonPool_t {\n  fextl::list<json_t> json_objects;\n\n  JsonAllocator();\n};\n\ntemplate<typename T>\nconst json_t* CreateJSON(T& Container, JsonAllocator& Allocator) {\n  if (std::empty(Container)) {\n    return nullptr;\n  }\n\n  return json_createWithPool(std::data(Container), &Allocator);\n}\n} // namespace FEX::JSON\n"
  },
  {
    "path": "Source/Common/Linux/SBRKAllocations.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/TypeDefines.h>\n\n#include <sys/mman.h>\n\nnamespace FEX::SBRKAllocations {\n// This function disables glibc's ability to allocate memory through the `sbrk` interface.\n// This is run early in the lifecycle of FEX in order to make sure no 64-bit pointers can make it to the guest 32-bit application.\n//\n// How this works is that this allocates a single page at the current sbrk pointer (aligned upward to page size). This makes it\n// so that when the sbrk syscall is used to allocate more memory, it fails with an ENOMEM since it runs in to the allocated guard page.\n//\n// glibc notices the sbrk failure and falls back to regular mmap based allocations when this occurs. Ensuring that memory can still be allocated.\nvoid* DisableSBRKAllocations() {\n  void* INVALID_PTR = reinterpret_cast<void*>(~0ULL);\n  // Get the starting sbrk pointer.\n  void* StartingSBRK = sbrk(0);\n  if (StartingSBRK == INVALID_PTR) {\n    // If sbrk is already returning invalid pointers then nothing to do here.\n    return INVALID_PTR;\n  }\n\n  // Now allocate the next page after the sbrk address to ensure it can't grow.\n  // In most cases at the start of `main` this will already be page aligned, which means subsequent `sbrk`\n  // calls won't allocate any memory through that.\n  void* AlignedBRK = reinterpret_cast<void*>(FEXCore::AlignUp(reinterpret_cast<uintptr_t>(StartingSBRK), FEXCore::Utils::FEX_PAGE_SIZE));\n  void* AfterBRK =\n    ::mmap(AlignedBRK, FEXCore::Utils::FEX_PAGE_SIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED_NOREPLACE | MAP_NORESERVE, -1, 0);\n  if (AfterBRK == INVALID_PTR) {\n    // Couldn't allocate the page after the aligned brk? This should never happen.\n    // FEXCore::LogMan isn't configured yet so we just need to print the message.\n    fextl::fmt::print(\"Couldn't allocate page after SBRK.\\n\");\n    FEX_TRAP_EXECUTION;\n    return INVALID_PTR;\n  }\n\n  // Now that the page after sbrk is allocated, FEX needs to consume the remaining sbrk space.\n  // This will be anywhere from [0, 4096) bytes.\n  // Start allocating from 1024 byte increments just to make any steps a bit faster.\n  intptr_t IncrementAmount = 1024;\n  for (; IncrementAmount != 0; IncrementAmount >>= 1) {\n    while (sbrk(IncrementAmount) != INVALID_PTR)\n      ;\n  }\n  return AlignedBRK;\n}\n\nvoid ReenableSBRKAllocations(void* Ptr) {\n  const void* INVALID_PTR = reinterpret_cast<void*>(~0ULL);\n  if (Ptr != INVALID_PTR) {\n    munmap(Ptr, FEXCore::Utils::FEX_PAGE_SIZE);\n  }\n}\n} // namespace FEX::SBRKAllocations\n"
  },
  {
    "path": "Source/Common/Linux/SBRKAllocations.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\nnamespace FEX::SBRKAllocations {\n// Disable allocations through glibc's sbrk allocation method.\n// Returns a pointer at the end of the sbrk region.\nvoid* DisableSBRKAllocations();\n\n// Allow sbrk again. Pass in the pointer returned by `DisableSBRKAllocations`\nvoid ReenableSBRKAllocations(void* Ptr);\n} // namespace FEX::SBRKAllocations\n"
  },
  {
    "path": "Source/Common/SHMStats.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Common/SHMStats.h\"\n#include \"git_version.h\"\n\n#include <FEXCore/Debug/InternalThreadState.h>\n\nnamespace FEX::SHMStats {\nvoid StatAllocBase::SaveHeader(FEXCore::SHMStats::AppType AppType) {\n  if (!Base) {\n    return;\n  }\n\n  Head = reinterpret_cast<FEXCore::SHMStats::ThreadStatsHeader*>(Base);\n  Head->Size.store(CurrentSize, std::memory_order_relaxed);\n  Head->Version = FEXCore::SHMStats::STATS_VERSION;\n  Head->app_type = AppType;\n  Head->ThreadStatsSize = sizeof(FEXCore::SHMStats::ThreadStats);\n\n  std::string_view GitString = GIT_DESCRIBE_STRING;\n  strncpy(Head->fex_version, GitString.data(), std::min(GitString.size(), sizeof(Head->fex_version)));\n\n  Stats = reinterpret_cast<FEXCore::SHMStats::ThreadStats*>(reinterpret_cast<uint64_t>(Base) + sizeof(FEXCore::SHMStats::ThreadStatsHeader));\n\n  RemainingSlots = TotalSlotsFromSize();\n}\n\nbool StatAllocBase::AllocateMoreSlots() {\n  const auto OriginalSlotCount = TotalSlotsFromSize();\n\n  uint32_t NewSize = FrontendAllocateSlots(CurrentSize * 2);\n\n  if (NewSize == CurrentSize) {\n    return false;\n  }\n\n  CurrentSize = NewSize;\n  Head->Size.store(CurrentSize, std::memory_order_relaxed);\n  RemainingSlots = TotalSlotsFromSize() - OriginalSlotCount;\n\n  return true;\n}\n\nFEXCore::SHMStats::ThreadStats* StatAllocBase::AllocateSlot(uint32_t TID) {\n  if (!RemainingSlots) {\n    if (!AllocateMoreSlots()) {\n      return nullptr;\n    }\n  }\n\n  // Find a free slot\n  store_memory_barrier();\n  FEXCore::SHMStats::ThreadStats* AllocatedSlot {};\n  for (size_t i = 0; i < TotalSlotsFromSize(); ++i) {\n    AllocatedSlot = &Stats[i];\n    if (AllocatedSlot->TID.load(std::memory_order_relaxed) == 0) {\n      break;\n    }\n  }\n\n  --RemainingSlots;\n\n  // Slot might be reused, just zero it now.\n  memset(AllocatedSlot, 0, sizeof(*AllocatedSlot));\n\n  // TID != 0 means slot is allocated.\n  AllocatedSlot->TID.store(TID, std::memory_order_relaxed);\n\n  // Setup singly-linked list\n  if (Head->Head.load(std::memory_order_relaxed) == 0) {\n    Head->Head.store(OffsetFromStat(AllocatedSlot), std::memory_order_relaxed);\n  } else {\n    StatTail->Next.store(OffsetFromStat(AllocatedSlot), std::memory_order_relaxed);\n  }\n\n  // Update the tail.\n  StatTail = AllocatedSlot;\n  return AllocatedSlot;\n}\n\nvoid StatAllocBase::DeallocateSlot(FEXCore::SHMStats::ThreadStats* AllocatedSlot) {\n  if (!AllocatedSlot) {\n    return;\n  }\n\n  // TID == 0 will signal the reader to ignore this slot & deallocate it!\n  AllocatedSlot->TID.store(0, std::memory_order_relaxed);\n\n  store_memory_barrier();\n\n  const auto SlotOffset = OffsetFromStat(AllocatedSlot);\n  const auto AllocatedSlotNext = AllocatedSlot->Next.load(std::memory_order_relaxed);\n\n  const bool IsTail = AllocatedSlot == StatTail;\n\n  // Update the linked list.\n  if (Head->Head == SlotOffset) {\n    Head->Head.store(AllocatedSlotNext, std::memory_order_relaxed);\n    if (IsTail) {\n      StatTail = nullptr;\n    }\n  } else {\n    for (size_t i = 0; i < TotalSlotsFromSize(); ++i) {\n      auto Slot = &Stats[i];\n      auto NextSlotOffset = Slot->Next.load(std::memory_order_relaxed);\n\n      if (NextSlotOffset == SlotOffset) {\n        Slot->Next.store(AllocatedSlotNext, std::memory_order_relaxed);\n\n        if (IsTail) {\n          // This slot is now the tail.\n          StatTail = Slot;\n        }\n        break;\n      }\n    }\n  }\n\n  ++RemainingSlots;\n}\n\n} // namespace FEX::SHMStats\n"
  },
  {
    "path": "Source/Common/SHMStats.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: Common|SHMStats\ndesc: Frontend profiler common code\n$end_info$\n*/\n#pragma once\n#include <FEXCore/Utils/SHMStats.h>\n\nnamespace FEXCore::Core {\nstruct InternalThreadState;\n}\n\n#ifdef ARCHITECTURE_arm64\nstatic inline void store_memory_barrier() {\n  asm volatile(\"dmb ishst;\" ::: \"memory\");\n}\n\n#else\nstatic inline void store_memory_barrier() {\n  // Intentionally empty.\n  // x86 is strongly memory ordered with regular loadstores. No need for barrier.\n}\n#endif\n\nnamespace FEX::SHMStats {\nclass StatAllocBase {\npublic:\n  virtual ~StatAllocBase() = default;\n\nprotected:\n  FEXCore::SHMStats::ThreadStats* AllocateSlot(uint32_t TID);\n  void DeallocateSlot(FEXCore::SHMStats::ThreadStats* AllocatedSlot);\n\n  uint32_t OffsetFromStat(FEXCore::SHMStats::ThreadStats* Stat) const {\n    return reinterpret_cast<uint64_t>(Stat) - reinterpret_cast<uint64_t>(Base);\n  }\n  uint32_t TotalSlotsFromSize() const {\n    return (CurrentSize - sizeof(FEXCore::SHMStats::ThreadStatsHeader)) / sizeof(FEXCore::SHMStats::ThreadStats) - 1;\n  }\n  static uint32_t TotalSlotsFromSize(uint32_t Size) {\n    return (Size - sizeof(FEXCore::SHMStats::ThreadStatsHeader)) / sizeof(FEXCore::SHMStats::ThreadStats) - 1;\n  }\n\n  static uint32_t SlotIndexFromOffset(uint32_t Offset) {\n    return (Offset - sizeof(FEXCore::SHMStats::ThreadStatsHeader)) / sizeof(FEXCore::SHMStats::ThreadStats);\n  }\n\n  void SaveHeader(FEXCore::SHMStats::AppType AppType);\n\n  void* Base {};\n  uint32_t CurrentSize {};\n  FEXCore::SHMStats::ThreadStatsHeader* Head {};\n  FEXCore::SHMStats::ThreadStats* Stats {};\n  FEXCore::SHMStats::ThreadStats* StatTail {};\n  uint32_t RemainingSlots {};\n\n  // Limited to 4MB which should be a few hundred threads of tracking capability.\n  // I (Sonicadvance1) wanted to reserve 128MB of VA space because it's cheap, but ran in to a bug when running WINE.\n  // WINE allocates [0x7fff'fe00'0000, 0x7fff'ffff'0000) which /consistently/ overlaps with FEX's sigaltstack.\n  // This only occurs when this stat allocation size is large as the top-down allocation pushes the alt-stack further.\n  // Additionally, only occurs on 48-bit VA systems, as mmap on lesser VA will fail regardless.\n  // TODO: Bump allocation size up once FEXCore's allocator can first use the 128TB of blocked VA space on 48-bit systems.\n  constexpr static uint32_t MAX_STATS_SIZE = 4 * 1024 * 1024;\n\nprivate:\n  virtual uint32_t FrontendAllocateSlots(uint32_t NewSize) = 0;\n  bool AllocateMoreSlots();\n};\n\n} // namespace FEX::SHMStats\n"
  },
  {
    "path": "Source/Common/VolatileMetadata.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Common/VolatileMetadata.h\"\n\n#include <FEXCore/Utils/LogManager.h>\n\n#include <cstdlib>\n\n#include <range/v3/view/split.hpp>\n#include <range/v3/view/transform.hpp>\n\nnamespace FEX::VolatileMetadata {\nfextl::unordered_map<fextl::string, ExtendedVolatileMetadata> ParseExtendedVolatileMetadata(std::string_view ListOfDescriptors) {\n  // Parsing: `<module>;<address begin>-<address-end>,<more addresses>;<instruction offset to force TSO>:`\n  if (ListOfDescriptors.empty()) {\n    return {};\n  }\n\n  fextl::unordered_map<fextl::string, ExtendedVolatileMetadata> ExtendedMetaData {};\n\n  auto to_string_view = [](auto rng) {\n    return std::string_view(&*rng.begin(), ranges::distance(rng));\n  };\n  for (auto module_config : ranges::views::split(ListOfDescriptors, ':') | ranges::views::transform(to_string_view)) {\n    if (module_config.empty()) {\n      continue;\n    }\n\n    auto sections = ranges::views::split(module_config, ';') | ranges::views::transform(to_string_view);\n    auto section = ranges::begin(sections);\n    const auto sections_end = ranges::end(sections);\n\n    // Module name handling\n    std::string_view section_str = *section;\n    if (section_str.empty()) {\n      continue;\n    }\n\n    auto current_module = ExtendedMetaData\n                            .insert_or_assign(fextl::string(section_str),\n                                              ExtendedVolatileMetadata {\n                                                .ModuleTSODisabled = true,\n                                              })\n                            .first;\n    ++section;\n\n    // Address range handling\n    if (section != sections_end) {\n      std::string_view section_str = *section;\n      if (section_str.empty()) {\n        continue;\n      }\n\n      current_module->second.ModuleTSODisabled = false;\n\n      // Walk all the address ranges provided.\n      for (auto tso_region_view : ranges::views::split(section_str, ',') | ranges::views::transform(to_string_view)) {\n        if (tso_region_view.empty()) {\n          continue;\n        }\n\n        uint64_t begin {}, end {};\n        char* str_end;\n        begin = std::strtoull(tso_region_view.data(), &str_end, 16);\n        LOGMAN_THROW_A_FMT(tso_region_view.data() != str_end, \"Couldn't parse begin {}\", tso_region_view);\n\n        // Skip `-` separator.\n        ++str_end;\n\n        LOGMAN_THROW_A_FMT(str_end != tso_region_view.end(), \"Couldn't parse end {}\", tso_region_view);\n        auto str_begin = str_end;\n        end = std::strtoull(str_begin, &str_end, 16);\n        LOGMAN_THROW_A_FMT(str_begin != str_end, \"Couldn't parse end {}\", tso_region_view);\n\n        current_module->second.VolatileValidRanges.Insert({begin, end});\n      }\n\n      ++section;\n    }\n\n    // Individual instruction handling\n    if (section != sections_end) {\n      std::string_view section_str = *section;\n      if (section_str.empty()) {\n        continue;\n      }\n\n      for (auto tso_region_view : ranges::views::split(section_str, ',') | ranges::views::transform(to_string_view)) {\n        if (tso_region_view.empty()) {\n          continue;\n        }\n\n        uint64_t offset {};\n        char* str_end;\n        offset = std::strtoull(tso_region_view.data(), &str_end, 16);\n        LOGMAN_THROW_A_FMT(tso_region_view.data() != str_end, \"Couldn't parse offset {}\", tso_region_view);\n\n        current_module->second.VolatileInstructions.insert(offset);\n      }\n\n      ++section;\n    }\n\n    LOGMAN_THROW_A_FMT(section == sections_end, \"Expected ':' or end of input, got {}\", *section);\n  }\n\n  return ExtendedMetaData;\n}\n} // namespace FEX::VolatileMetadata\n"
  },
  {
    "path": "Source/Common/VolatileMetadata.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/IntervalList.h>\n#include <FEXCore/fextl/unordered_map.h>\n#include <FEXCore/fextl/set.h>\n#include <FEXCore/fextl/string.h>\n\n#include <string_view>\n\nnamespace FEX::VolatileMetadata {\nstruct ExtendedVolatileMetadata {\n  FEXCore::IntervalList<uint64_t> VolatileValidRanges;\n  fextl::set<uint64_t> VolatileInstructions;\n  bool ModuleTSODisabled;\n};\n\nfextl::unordered_map<fextl::string, ExtendedVolatileMetadata> ParseExtendedVolatileMetadata(std::string_view ListOfDescriptors);\n\ninline void ApplyFEXExtendedVolatileMetadata(FEX::VolatileMetadata::ExtendedVolatileMetadata& ExtendedMetaData,\n                                             fextl::set<uint64_t>& VolatileInstructions, FEXCore::IntervalList<uint64_t>& VolatileValidRanges,\n                                             uint64_t Address, uint64_t EndAddress, uint64_t FileOffset = 0, uint64_t FileOffsetEnd = ~0ULL) {\n  // Load FEX extended volatile metadata.\n  // Walk the volatile instructions first if they exist.\n  for (const auto it_inst : ExtendedMetaData.VolatileInstructions) {\n    const auto inst_address = it_inst + Address;\n    if (inst_address < EndAddress) {\n      VolatileInstructions.emplace(Address + it_inst);\n    } else {\n      LogMan::Msg::DFmt(\"Volatile instruction 0x{:x} couldn't fit in to module range [0x{:x}, 0x{:x}). Not adding anymore volatile \"\n                        \"instructions. Inspect your config!\",\n                        inst_address, Address, EndAddress);\n      return;\n    }\n  }\n\n  // Walk the volatile list\n  for (const auto it_ranges : ExtendedMetaData.VolatileValidRanges) {\n    if (it_ranges.Offset >= FileOffset && it_ranges.End < FileOffsetEnd) {\n      VolatileValidRanges.Insert({Address + it_ranges.Offset - FileOffset, Address + it_ranges.End - FileOffset});\n    }\n  }\n\n  // If it is fully disabled, then set the entire module range\n  if (ExtendedMetaData.ModuleTSODisabled) {\n    VolatileValidRanges.Clear();\n    VolatileValidRanges.Insert({Address, EndAddress});\n  }\n}\n\n} // namespace FEX::VolatileMetadata\n"
  },
  {
    "path": "Source/Common/X86Features.h",
    "content": "#pragma once\n#include <cstdint>\n\n#ifdef ARCHITECTURE_x86_64\n#include <cpuid.h>\n\nnamespace FEX::X86 {\nclass Features final {\npublic:\n  Features() {\n    cpuid_data data {};\n    data = cpuid(0);\n\n    if (data.eax >= 1) {\n      auto data_1 = cpuid(0x1);\n\n      Feat_aes = data_1.ecx & (1U << 25);\n      Feat_crc = data_1.ecx & (1U << 20);\n      Feat_rand = data_1.ecx & (1U << 30);\n      Feat_pclmulqdq = data_1.ecx & (1U << 1);\n      Feat_avx = data_1.ecx & (1U << 28);\n      Feat_ssse3 = data_1.ecx & (1U << 9);\n      Feat_sse4_1 = data_1.ecx & (1U << 19);\n      Feat_sse4_2 = data_1.ecx & (1U << 20);\n      Feat_movbe = data_1.ecx & (1U << 22);\n      Feat_xsave = data_1.ecx & (1U << 26);\n    }\n\n    if (data.eax >= 7) {\n      auto data_7 = cpuid(0x7);\n      Feat_fsgsbase = data_7.ebx & (1U << 0);\n      Feat_bmi1 = data_7.ebx & (1U << 3);\n      Feat_avx &= data_7.ebx & (1U << 5);\n      Feat_bmi2 = data_7.ebx & (1U << 8);\n      Feat_clwb = data_7.ebx & (1U << 24);\n      Feat_rand &= data_7.ebx & (1U << 18);\n      Feat_adx = data_7.ebx & (1U << 19);\n      Feat_clflopt = data_7.ebx & (1U << 23);\n      Feat_sha = data_7.ebx & (1U << 29);\n      Feat_vaes = data_7.ecx & (1U << 9);\n      Feat_pclmulqdq &= data_7.ecx & (1U << 10);\n      Feat_rdpid = data_7.ecx & (1U << 22);\n    }\n\n    data = cpuid(0x8000'0000U);\n    if (data.eax >= 0x8000'0001U) {\n      auto data_8000_0001 = cpuid(0x8000'0001U);\n      Feat_3dnow = (data_8000_0001.edx >> 30) == 0b11;\n      Feat_sse4a = data_8000_0001.ecx & (1U << 6);\n    }\n\n    if (data.eax >= 0x8000'0008U) {\n      auto data_8000_0008 = cpuid(0x8000'0008U);\n\n      Feat_clzero = data_8000_0008.ebx & 1;\n    }\n  }\n\n  // Features.\n  bool Feat_3dnow {};\n  bool Feat_sse4a {};\n  bool Feat_bmi1 {};\n  bool Feat_bmi2 {};\n  bool Feat_clwb {};\n  bool Feat_aes {};\n  bool Feat_crc {};\n  bool Feat_rand {};\n  bool Feat_sha {};\n  bool Feat_pclmulqdq {};\n  bool Feat_vaes {};\n  bool Feat_clzero {};\n  bool Feat_avx {};\n  bool Feat_ssse3 {};\n  bool Feat_sse4_1 {};\n  bool Feat_sse4_2 {};\n  bool Feat_movbe {};\n  bool Feat_adx {};\n  bool Feat_xsave {};\n  bool Feat_rdpid {};\n  bool Feat_clflopt {};\n  bool Feat_fsgsbase {};\n\nprivate:\n  struct cpuid_data {\n    uint32_t eax, ebx, ecx, edx;\n  };\n\n  cpuid_data cpuid(uint32_t Function, uint32_t Leaf = 0) {\n    cpuid_data data;\n    __cpuid_count(Function, Leaf, data.eax, data.ebx, data.ecx, data.edx);\n    return data;\n  }\n};\n} // namespace FEX::X86\n#endif\n"
  },
  {
    "path": "Source/Steam/CMakeLists.txt",
    "content": "set(LIBS FEXCore Common CommonTools JemallocLibs)\n\nadd_executable(FEXCompatTool CompatTool.cpp)\n\ntarget_link_libraries(FEXCompatTool PRIVATE ${LIBS})\n\ninstall(TARGETS FEXCompatTool RUNTIME\n  DESTINATION /\n  COMPONENT Runtime)\n\nadd_executable(FEXServerManager ServerManager.cpp)\n\ntarget_link_libraries(FEXServerManager PRIVATE ${LIBS})\n\ninstall(TARGETS FEXServerManager RUNTIME\n  DESTINATION bin\n  COMPONENT Runtime)\n\n# Description json and VERSION files are installed into the depot root\nconfigure_file(VERSIONS.txt.in ${CMAKE_CURRENT_BINARY_DIR}/VERSIONS.txt)\ninstall(FILES\n    ${CMAKE_CURRENT_BINARY_DIR}/VERSIONS.txt\n    ConfigTemplate.json\n    emulator.json\n    toolmanifest.vdf\n  DESTINATION /\n  COMPONENT Runtime)\n"
  },
  {
    "path": "Source/Steam/CompatTool.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: Bin|FEXCompatTool\ndesc: Used for launching games from Steam\n$end_info$\n*/\n\n#include \"PortabilityInfo.h\"\n#include \"Common/Config.h\"\n#include \"FEXCore/Utils/FileLoading.h\"\n#include \"FEXCore/Utils/StringUtils.h\"\n#include \"FEXHeaderUtils/Filesystem.h\"\n\n#include <stdlib.h>\n#include <tiny-json.h>\n\nfextl::string GenerateSteamConfigTemplate(const FEX::Config::PortableInformation& PortableInfo) {\n  const auto ConfigTemplatePath = PortableInfo.InterpreterPath + \"ConfigTemplate.json\";\n  if (!FHU::Filesystem::Exists(ConfigTemplatePath)) {\n    return {};\n  }\n\n  fextl::string Data;\n  if (!FEXCore::FileLoading::LoadFile(Data, ConfigTemplatePath)) {\n    return {};\n  }\n\n  // Try and find a mount point.\n  fextl::string MountPoint {};\n  const char* RuntimeDir = getenv(\"XDG_RUNTIME_DIR\");\n  if (RuntimeDir) {\n    MountPoint = fextl::fmt::format(\"{}/fexrootfs/\", RuntimeDir);\n  } else {\n    const auto UserDirectory = fextl::fmt::format(\"/run/user/{}\", geteuid());\n    if (FHU::Filesystem::Exists(UserDirectory)) {\n      MountPoint = fextl::fmt::format(\"{}/fexrootfs/\", UserDirectory);\n    } else {\n      const char* CacheDir = getenv(\"XDG_CACHE_HOME\");\n      if (CacheDir) {\n        MountPoint = fextl::fmt::format(\"{}/fexrootfs/\", CacheDir);\n      } else {\n        // We tried really hard to find a mount path.\n        MountPoint = \"~/.cache/fexrootfs/\";\n      }\n    }\n  }\n\n  // Update the @FEX_COMPAT_TOOL@ config to point to the root of the depot.\n  FEXCore::StringUtils::ReplaceAllInPlace(Data, \"@FEX_COMPAT_TOOL@\", PortableInfo.InterpreterPath);\n\n  // TODO: This path is getting phased out.\n  FEXCore::StringUtils::ReplaceAllInPlace(Data, \"@FEX_ROOTFS_PATH@\", MountPoint);\n\n  // Save the json.\n  const auto ConfigPath = FEX::Config::GetConfigDirectory(false, PortableInfo);\n  const auto ConfigLocation = ConfigPath + \"Config.json\";\n  if (!FHU::Filesystem::CreateDirectories(ConfigPath)) {\n    return {};\n  }\n\n  auto File = FEXCore::File::File(ConfigLocation.c_str(),\n                                  FEXCore::File::FileModes::WRITE | FEXCore::File::FileModes::CREATE | FEXCore::File::FileModes::TRUNCATE);\n\n  if (!File.IsValid()) {\n    return {};\n  }\n\n  File.Write(Data.data(), Data.size());\n  return ConfigPath;\n}\n\nfextl::string GenerateSteamAppConfig(const FEX::Config::PortableInformation& PortableInfo) {\n  const auto user_config = getenv(\"FEX_APP_CONFIG\");\n  if (user_config) {\n    // If user supplied config then don't use Steam config.\n    return {};\n  }\n\n  // Current supported Steam options.\n  struct SteamOptions {\n    bool TSO = true;\n    bool Multiblock = true;\n    bool Thunks_GL = false;\n    bool Thunks_Vulkan = false;\n    bool EnableLogging = false;\n  };\n  SteamOptions Options {};\n\n  // Game overrides.\n  const auto steam_fex_tso = getenv(\"STEAM_FEX_TSOENABLED\");\n  if (steam_fex_tso) {\n    Options.TSO = std::strtoull(steam_fex_tso, nullptr, 0) != 0;\n  }\n\n  const auto steam_fex_multiblock = getenv(\"STEAM_FEX_MULTIBLOCK\");\n  if (steam_fex_multiblock) {\n    Options.Multiblock = std::strtoull(steam_fex_multiblock, nullptr, 0) != 0;\n  }\n\n  const auto steam_fex_logging = getenv(\"STEAM_FEX_LOG\");\n  if (steam_fex_logging) {\n    Options.EnableLogging = std::strtoull(steam_fex_logging, nullptr, 0) != 0;\n  }\n\n  // UI overrides.\n  const auto steam_fex_compat = getenv(\"STEAM_COMPAT_FEX_CONFIG\");\n  if (steam_fex_compat) {\n    const auto steam_fex_compat_view = std::string_view(steam_fex_compat);\n    if (steam_fex_compat_view.find(\"TSOEnabled:1\") != steam_fex_compat_view.npos) {\n      Options.TSO = true;\n    }\n    if (steam_fex_compat_view.find(\"Multiblock:1\") != steam_fex_compat_view.npos) {\n      Options.Multiblock = true;\n    }\n    if (steam_fex_compat_view.find(\"ThunksDB_GL:1\") != steam_fex_compat_view.npos) {\n      Options.Thunks_GL = true;\n    }\n    if (steam_fex_compat_view.find(\"ThunksDB_Vulkan:1\") != steam_fex_compat_view.npos) {\n      Options.Thunks_Vulkan = true;\n    }\n  }\n\n  // Create the json.\n  char Buffer[4096];\n  char* Dest {};\n  Dest = json_objOpen(Buffer, nullptr);\n  {\n    Dest = json_objOpen(Dest, \"Config\");\n    Dest = json_str(Dest, \"TSOEnabled\", Options.TSO ? \"1\" : \"0\");\n    Dest = json_str(Dest, \"Multiblock\", Options.Multiblock ? \"1\" : \"0\");\n    Dest = json_str(Dest, \"SilentLog\", Options.EnableLogging ? \"0\" : \"1\");\n    if (Options.EnableLogging) {\n      Dest = json_str(Dest, \"OutputLog\", \"server\");\n    }\n    Dest = json_objClose(Dest);\n  }\n\n  {\n    Dest = json_objOpen(Dest, \"ThunksDB\");\n    Dest = json_str(Dest, \"GL\", Options.Thunks_GL ? \"1\" : \"0\");\n    Dest = json_str(Dest, \"Vulkan\", Options.Thunks_Vulkan ? \"1\" : \"0\");\n    Dest = json_objClose(Dest);\n  }\n\n  Dest = json_objClose(Dest);\n  json_end(Dest);\n\n  // Save the json.\n  const auto ConfigPath = FEX::Config::GetConfigDirectory(false, PortableInfo);\n  const auto ConfigLocation = ConfigPath + \"app_config.json\";\n  if (!FHU::Filesystem::CreateDirectories(ConfigPath)) {\n    return {};\n  }\n\n  auto File = FEXCore::File::File(ConfigLocation.c_str(),\n                                  FEXCore::File::FileModes::WRITE | FEXCore::File::FileModes::CREATE | FEXCore::File::FileModes::TRUNCATE);\n\n  if (!File.IsValid()) {\n    return {};\n  }\n\n  File.Write(Buffer, strlen(Buffer));\n  return ConfigLocation;\n}\n\nint main(int argc, const char** argv) {\n  const auto PortableInfo = FEX::ReadPortabilityInformation();\n\n  const auto TemplateConfigPath = GenerateSteamConfigTemplate(PortableInfo);\n  const auto AppConfigPath = GenerateSteamAppConfig(PortableInfo);\n\n  if (!TemplateConfigPath.empty()) {\n    setenv(\"FEX_APP_CONFIG_LOCATION\", TemplateConfigPath.c_str(), true);\n  }\n\n  if (!AppConfigPath.empty()) {\n    setenv(\"FEX_APP_CONFIG\", AppConfigPath.c_str(), true);\n  }\n\n  const auto FEXInterpreterPath = PortableInfo.InterpreterPath + \"usr/bin/FEX\";\n\n  // Due to no arguments for this application, just replace argv[0] and execve again.\n  argv[0] = FEXInterpreterPath.c_str();\n  execv(FEXInterpreterPath.c_str(), const_cast<char* const*>(argv));\n\n  // Save errno as it can change after calling `perror`.\n  const auto saved_errno = errno;\n\n  perror(argv[0]);\n\n  if (saved_errno == ENOENT) {\n    return 127;\n  }\n\n  return 126;\n}\n"
  },
  {
    "path": "Source/Steam/ConfigTemplate.json",
    "content": "{\n    \"Config\": {\n        \"X87ReducedPrecision\": \"1\",\n        \"RootFS\": \"@FEX_ROOTFS_PATH@/\",\n        \"ThunkHostLibs\": \"@FEX_COMPAT_TOOL@/usr/lib/aarch64-linux-gnu/fex-emu/HostThunks\",\n        \"ThunkGuestLibs\": \"@FEX_COMPAT_TOOL@/usr/share/fex-emu/GuestThunks\",\n        \"ProfileStats\": \"1\"\n    }\n}\n"
  },
  {
    "path": "Source/Steam/ServerManager.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"PortabilityInfo.h\"\n#include \"Common/FEXServerClient.h\"\n\n#include <cstdio>\n#include <errno.h>\n#include <unistd.h>\n#include <poll.h>\n\nvoid MsgHandler(LogMan::DebugLevels Level, const char* Message) {\n  const auto Style = fmt::text_style {};\n  const auto Output = fextl::fmt::format(\"{} {}\\n\", fmt::styled(LogMan::DebugLevelStr(Level), Style), Message);\n  write(STDERR_FILENO, Output.c_str(), Output.size());\n  fsync(STDERR_FILENO);\n}\n\nvoid AssertHandler(const char* Message) {\n  return MsgHandler(LogMan::ASSERT, Message);\n}\n\nvoid SignalPVToContinue(int* original_stdout) {\n  // Tell pressure-vessel that the startup was a success.\n  const auto ReadyMsg = \"READY=1\\n\";\n  write(*original_stdout, ReadyMsg, strlen(ReadyMsg));\n\n  // pressure-vessel is waiting for EOF on STDOUT from this process to ensure it can run FEX processes.\n  close(*original_stdout);\n  *original_stdout = -1;\n}\n\nstruct PipesType {\n  int read_pipe {-1};\n  int write_pipe {-1};\n};\n\nPipesType get_pipe() {\n  PipesType pipes {};\n  pipe(&pipes.read_pipe);\n  return pipes;\n}\n\nint main(int argc, const char** argv, char** const envp) {\n  LogMan::Throw::InstallHandler(AssertHandler);\n  LogMan::Msg::InstallHandler(MsgHandler);\n\n  const auto PortableInfo = FEX::ReadPortabilityInformation();\n  FEX::Config::LoadConfig({}, envp, PortableInfo);\n\n  // Reload the meta layer\n  FEXCore::Config::ReloadMetaLayer();\n\n  // Move the ready-indicator pipe from stdout to some other fd,\n  // and mark it so the FEXServer won't inherit it. Otherwise the FEXServer\n  // will hold it open, preventing pressure-vessel from detecting that\n  // we are ready.\n  int original_stdout = fcntl(STDOUT_FILENO, F_DUPFD_CLOEXEC, /* minimum fd = */ 3);\n  if (original_stdout < 0) {\n    perror(\"F_DUPFD_CLOEXEC\");\n    return 126;\n  }\n  // Replace stdout with a copy of our original stderr.\n  if (dup2(STDERR_FILENO, STDOUT_FILENO) != STDOUT_FILENO) {\n    perror(\"dup2\");\n    return 126;\n  }\n\n  auto pipes = get_pipe();\n\n  // Set the write side to close on exec.\n  fcntl(pipes.write_pipe, F_SETFD, FD_CLOEXEC);\n\n  // Give the read end of the pipe to FEXServer.\n  auto ServerFD = FEXServerClient::StartServer(PortableInfo.InterpreterPath, pipes.read_pipe);\n\n  if (ServerFD == -1) {\n    perror(\"Couldn't start FEXServer\");\n    return 126;\n  }\n\n  // FEXServer is now running. Tell PV to continue.\n  SignalPVToContinue(&original_stdout);\n\n  // Don't need the read pipe anymore.\n  close(pipes.read_pipe);\n  pipes.read_pipe = -1;\n\n  // Now that the server is started and watching our pipe, we can close the returned FD, as it'll stay open as long as the pipe is open.\n  close(ServerFD);\n  ServerFD = -1;\n\n  // Do a blocking read, discarding any written data and wait for EOF.\n  while (true) {\n    char buf[4096];\n    auto read_len = ::read(STDIN_FILENO, buf, sizeof(buf));\n    if (read_len < 0) {\n      if (errno == EINTR || errno == EAGAIN) {\n        // Interrupted, try again.\n        continue;\n      } else {\n        // Error on read.\n        break;\n      }\n    } else if (read_len == 0) {\n      // EOF\n      break;\n    }\n  }\n\n  // Terminating will clean-up.\n  return 0;\n}\n"
  },
  {
    "path": "Source/Steam/VERSIONS.txt.in",
    "content": "FEX describe\t@GIT_DESCRIBE_STRING@\nFEX bash\t@GIT_HASH@\n"
  },
  {
    "path": "Source/Steam/emulator.json",
    "content": "{\n  \"emulator_v0\": {\n    \"argv\": \"./usr/bin/FEX\",\n    \"environment\": { \"FEX_PORTABLE\": \"1\" },\n    \"container_argv\": \"./usr/bin/FEX\",\n    \"container_environment\": { \"FEX_ROOTFS\": \"\" },\n    \"main_argv\": \"./FEXCompatTool\",\n    \"server_argv\": \"./usr/bin/FEXServerManager\",\n    \"emulated_architectures\": [\"x86_64-linux-gnu\", \"i386-linux-gnu\"],\n    \"required_architectures\": [\"aarch64-linux-gnu\"],\n    \"required_libraries\": [\"libc.so.6\", \"libstdc++.so.6\"]\n  }\n}\n"
  },
  {
    "path": "Source/Steam/toolmanifest.vdf",
    "content": "\"manifest\"\n{\n  \"commandline\" \"/fex-compat-tool %verb% --\"\n  \"filter_exclusive_priority\" \"2\"\n  \"version\" \"2\"\n  \"use_tool_subprocess_reaper\" \"1\"\n  \"compatmanager_layer_name\" \"fex\"\n}\n"
  },
  {
    "path": "Source/Tools/CMakeLists.txt",
    "content": "add_subdirectory(CommonTools)\n\nif (NOT MINGW)\n  if (BUILD_FEXCONFIG)\n    find_package(Qt6 COMPONENTS Qml Quick Widgets QUIET)\n    if (NOT Qt6_FOUND)\n      find_package(Qt5 COMPONENTS Qml Quick Widgets REQUIRED)\n    endif()\n\n    add_subdirectory(FEXConfig/)\n  endif()\n\n  if (ENABLE_GDB_SYMBOLS)\n    add_subdirectory(FEXGDBReader/)\n  endif()\n\n  if (NOT BUILD_STEAM_SUPPORT)\n    add_subdirectory(FEXRootFSFetcher/)\n  endif()\n\n  add_subdirectory(FEXGetConfig/)\n  add_subdirectory(FEXServer/)\n  add_subdirectory(FEXBash/)\n  add_subdirectory(FEXOfflineCompiler/)\n  add_subdirectory(CodeSizeValidation/)\n  add_subdirectory(LinuxEmulation/)\n\n  add_subdirectory(FEXInterpreter/)\n  add_subdirectory(pidof/)\n  if (BUILD_TESTING)\n    add_subdirectory(TestHarnessRunner/)\n  endif()\nendif()\n"
  },
  {
    "path": "Source/Tools/CodeSizeValidation/CMakeLists.txt",
    "content": "list(APPEND LIBS FEXCore Common CommonTools JemallocLibs)\n\nadd_executable(CodeSizeValidation Main.cpp)\ntarget_include_directories(CodeSizeValidation PRIVATE ${CMAKE_BINARY_DIR}/generated)\n\ntarget_link_libraries(CodeSizeValidation PRIVATE ${LIBS} ${PTHREAD_LIB})\n"
  },
  {
    "path": "Source/Tools/CodeSizeValidation/Main.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"DummyHandlers.h\"\n#include \"Common/HostFeatures.h\"\n#include \"FEXCore/Core/Context.h\"\n#include \"FEXCore/Debug/InternalThreadState.h\"\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/File.h>\n#include <FEXCore/Utils/FileLoading.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/SignalScopeGuards.h>\n\n#include <sys/stat.h>\n\nnamespace CodeSize {\nclass CodeSizeValidation final {\npublic:\n  CodeSizeValidation() {\n    constexpr uint64_t Code_start_page = 0x1'0000;\n\n    CodeStart = FEXCore::Allocator::mmap(reinterpret_cast<void*>(Code_start_page), MAX_CODE_SIZE, PROT_READ | PROT_WRITE,\n                                         MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n    if (reinterpret_cast<uint64_t>(CodeStart) != Code_start_page) {\n      LogMan::Msg::AFmt(\"Couldn't allocate test region!\");\n      FEXCore::Allocator::VirtualFree(CodeStart, MAX_CODE_SIZE);\n      CodeStart = nullptr;\n      return;\n    }\n  }\n\n  struct InstructionStats {\n    uint64_t GuestCodeInstructions {};\n    uint64_t HostCodeInstructions {};\n\n    uint64_t HeaderSize {};\n    uint64_t TailSize {};\n  };\n\n  using CodeLines = fextl::vector<fextl::string>;\n  struct InstructionData {\n    InstructionStats first;\n    CodeLines second;\n  };\n\n  bool ParseMessage(const char* Message);\n\n  InstructionData CompileAndGetStats(FEXCore::Context::Context* CTX, FEXCore::Core::InternalThreadState* Thread, const void* Data,\n                                     size_t SizeBytes, int32_t MaxInst = -1) {\n    if (SizeBytes > MAX_CODE_SIZE) {\n      LogMan::Msg::AFmt(\"x86 code too large!\");\n    }\n\n    {\n      auto CodeInvalidationlk = FEXCore::GuardSignalDeferringSection(CTX->GetCodeInvalidationMutex(), Thread);\n      CTX->InvalidateCodeBuffersCodeRange(reinterpret_cast<uint64_t>(CodeStart), MAX_CODE_SIZE);\n      CTX->InvalidateThreadCachedCodeRange(Thread, reinterpret_cast<uint64_t>(CodeStart), MAX_CODE_SIZE);\n    }\n\n    ClearStats();\n    memcpy(CodeStart, Data, SizeBytes);\n\n    if (MaxInst == -1) {\n      // Compile the NOP.\n      CTX->CompileRIP(Thread, reinterpret_cast<uint64_t>(CodeStart));\n    } else {\n      CTX->CompileRIPCount(Thread, reinterpret_cast<uint64_t>(CodeStart), MaxInst);\n    }\n    return CurrentStats;\n  }\n\n  bool InfoPrintingDisabled() const {\n    return SetupInfoDisabled;\n  }\n\n  void CalculateBaseStats(FEXCore::Context::Context* CTX, FEXCore::Core::InternalThreadState* Thread);\nprivate:\n  void ClearStats() {\n    CurrentStats = {};\n  }\n\n  uint64_t CurrentRIPParse {};\n  bool ConsumingDisassembly {};\n  InstructionData CurrentStats {};\n\n  ssize_t HeaderSize {-1};\n\n  void* CodeStart {};\n  constexpr static size_t MAX_CODE_SIZE = 512 * 1024 * 1024;\n\n  bool SetupInfoDisabled {};\n};\n\nconstexpr std::string_view RIPMessage = \"RIP: 0x\";\nconstexpr std::string_view GuestCodeMessage = \"Guest Code instructions: \";\nconstexpr std::string_view DisassembleBeginMessage = \"Disassemble Begin\";\nconstexpr std::string_view DisassembleEndMessage = \"Disassemble End\";\nconstexpr std::string_view BlowUpMsg = \"Blow-up Amt: \";\n\nstatic std::string_view SanitizeDisassembly(std::string_view Message) {\n  auto it = Message.find(\" (addr\");\n  // If it contains an address calculation, strip it out.\n  Message = Message.substr(0, it);\n  if (Message.find(\"adrp \") != std::string_view::npos || Message.find(\"adr \") != std::string_view::npos) {\n    Message = Message.substr(0, Message.find(\" #\"));\n  }\n  return Message;\n}\n\nbool CodeSizeValidation::ParseMessage(const char* Message) {\n  // std::string_view doesn't have contains until c++23.\n  std::string_view MessageView {Message};\n  if (MessageView.find(RIPMessage) != MessageView.npos) {\n    // New RIP found\n    std::string_view RIPView = std::string_view {Message + RIPMessage.size()};\n    std::from_chars(RIPView.data(), RIPView.end(), CurrentRIPParse, 16);\n    ClearStats();\n    return false;\n  }\n\n  if (MessageView.find(GuestCodeMessage) != MessageView.npos) {\n    std::string_view CodeSizeView = std::string_view {Message + GuestCodeMessage.size()};\n    std::from_chars(CodeSizeView.data(), CodeSizeView.end(), CurrentStats.first.GuestCodeInstructions);\n    return false;\n  }\n  if (MessageView.find(DisassembleBeginMessage) != MessageView.npos) {\n    ConsumingDisassembly = true;\n    // Just so the output isn't a mess.\n    return false;\n  }\n  if (MessageView.find(DisassembleEndMessage) != MessageView.npos) {\n    ConsumingDisassembly = false;\n    // Just so the output isn't a mess.\n\n    // Remove the header and tails.\n    if (HeaderSize != -1) {\n      CurrentStats.second.erase(CurrentStats.second.begin(), CurrentStats.second.begin() + HeaderSize);\n    }\n    // Find the first `udf #0x420f` and remove everything from that point onward.\n    auto EraseBegin = std::find(CurrentStats.second.begin(), CurrentStats.second.end(), \"udf #0x420f\");\n    CurrentStats.second.erase(EraseBegin, CurrentStats.second.end());\n    CurrentStats.first.HostCodeInstructions = CurrentStats.second.size();\n    return false;\n  }\n\n  if (MessageView.find(BlowUpMsg) != MessageView.npos) {\n    return false;\n  }\n\n  if (ConsumingDisassembly) {\n    // Currently consuming disassembly. Each line will be a single line of disassembly.\n    CurrentStats.second.push_back(fextl::string(SanitizeDisassembly(Message)));\n    return false;\n  }\n\n  return true;\n}\n\nvoid CodeSizeValidation::CalculateBaseStats(FEXCore::Context::Context* CTX, FEXCore::Core::InternalThreadState* Thread) {\n  SetupInfoDisabled = true;\n\n  // Known hardcoded instructions that will generate blocks of particular sizes.\n  // NOP will never generate any instructions.\n  constexpr static uint8_t NOP[] = {\n    0x90,\n  };\n\n  // Compile the NOP.\n  auto NOPStats = CompileAndGetStats(CTX, Thread, NOP, sizeof(NOP), 1);\n\n  // Expected format.\n  // adr x0, #-0x4 (addr 0x7fffe9880054)\n  // str x0, [x28, #184]\n  // udf #0x420f\n  // ldr x0, pc+8 (addr 0x7fffe988006c)\n  // blr x0\n  // unallocated (Unallocated)\n  // udf #0x7fff\n  // unallocated (Unallocated)\n  // udf #0x0\n  //\n  // First two lines are the header.\n  // Next comes the implementation (0 instruction size for nop).\n  // Then comes the `udf #0x420f` which signifies the end of the function.\n  // After that is the tail.\n  HeaderSize = NOPStats.second.size();\n\n  SetupInfoDisabled = false;\n}\n\nstatic CodeSizeValidation* Validation {};\n} // namespace CodeSize\n\nvoid MsgHandler(LogMan::DebugLevels Level, const char* Message) {\n  const char* CharLevel {LogMan::DebugLevelStr(Level)};\n\n  if (Level == LogMan::INFO) {\n    // Disassemble information is sent through the Info log level.\n    if (!CodeSize::Validation->ParseMessage(Message)) {\n      return;\n    }\n    if (CodeSize::Validation->InfoPrintingDisabled()) {\n      return;\n    }\n  }\n\n  fextl::fmt::print(\"{} {}\\n\", CharLevel, Message);\n}\n\nvoid AssertHandler(const char* Message) {\n  fextl::fmt::print(\"A {}\\n\", Message);\n\n  // make sure buffers are flushed\n  fflush(nullptr);\n}\n\nstruct TestInfo {\n  char TestInst[128];\n  int64_t ExpectedInstructionCount;\n  uint64_t CodeSize;\n  uint64_t x86InstCount;\n  uint32_t Cookie;\n  uint8_t Code[];\n};\n\nstruct TestHeader {\n  uint64_t Bitness;\n  uint64_t NumTests {};\n  uint64_t EnabledHostFeatures;\n  uint64_t DisabledHostFeatures;\n  uint64_t EnvironmentVariableCount;\n  uint8_t Data[];\n};\n\nstatic void* TestData;\nstatic size_t TestDataSize;\nstatic const TestHeader* TestHeaderData {};\nstatic const TestInfo* TestsStart {};\nstatic fextl::vector<std::pair<std::string_view, std::string_view>> EnvironmentVariables {};\n\nstatic bool TestInstructions(FEXCore::Context::Context* CTX, FEXCore::Core::InternalThreadState* Thread, const char* UpdatedInstructionCountsPath) {\n  LogMan::Msg::IFmt(\"Compiling code\");\n\n  // Tell FEXCore to compile all the instructions upfront.\n  const TestInfo* CurrentTest = TestsStart;\n  fextl::vector<CodeSize::CodeSizeValidation::InstructionData> TestData {};\n  TestData.resize(TestHeaderData->NumTests);\n  for (size_t i = 0; i < TestHeaderData->NumTests; ++i) {\n    uint64_t CodeRIP = (uint64_t)&CurrentTest->Code[0];\n    LogMan::Msg::IFmt(\"Compiling instruction '{}'\", CurrentTest->TestInst);\n\n    TestData[i] =\n      CodeSize::Validation->CompileAndGetStats(CTX, Thread, reinterpret_cast<void*>(CodeRIP), CurrentTest->CodeSize, CurrentTest->x86InstCount);\n\n    // Go to the next test.\n    CurrentTest = reinterpret_cast<const TestInfo*>(&CurrentTest->Code[CurrentTest->CodeSize]);\n  }\n\n  bool TestsPassed {true};\n\n  // Get all the data for the instructions compiled.\n  CurrentTest = TestsStart;\n  for (size_t i = 0; i < TestHeaderData->NumTests; ++i) {\n    // Get the instruction stats.\n    const auto INSTStats = &TestData[i];\n\n    LogMan::Msg::IFmt(\"Testing instruction '{}': {} host instructions\", CurrentTest->TestInst, INSTStats->first.HostCodeInstructions);\n\n    // Show the code if the count of instructions changed to something we didn't expect.\n    bool ShouldShowCode = INSTStats->first.HostCodeInstructions != CurrentTest->ExpectedInstructionCount;\n\n    if (ShouldShowCode) {\n      for (const auto& Line : INSTStats->second) {\n        LogMan::Msg::EFmt(\"\\t{}\", Line);\n      }\n    }\n\n    if (INSTStats->first.HostCodeInstructions != CurrentTest->ExpectedInstructionCount) {\n      LogMan::Msg::EFmt(\"Fail: '{}': {} host instructions\", CurrentTest->TestInst, INSTStats->first.HostCodeInstructions);\n      LogMan::Msg::EFmt(\"Fail: Test took {} instructions but we expected {} instructions!\", INSTStats->first.HostCodeInstructions,\n                        CurrentTest->ExpectedInstructionCount);\n\n      // Fail the test if the instruction count has changed at all.\n      TestsPassed = false;\n    }\n\n    // Go to the next test.\n    CurrentTest = reinterpret_cast<const TestInfo*>(&CurrentTest->Code[CurrentTest->CodeSize]);\n  }\n\n  if (UpdatedInstructionCountsPath) {\n    // Unlink the file.\n    unlink(UpdatedInstructionCountsPath);\n\n    FEXCore::File::File FD(UpdatedInstructionCountsPath,\n                           FEXCore::File::FileModes::WRITE | FEXCore::File::FileModes::CREATE | FEXCore::File::FileModes::TRUNCATE);\n\n    if (!FD.IsValid()) {\n      // If we couldn't open the file then early exit this.\n      LogMan::Msg::EFmt(\"Couldn't open {} for updating instruction counts\", UpdatedInstructionCountsPath);\n      return TestsPassed;\n    }\n\n    FD.Write(\"{\\n\", 2);\n\n    CurrentTest = TestsStart;\n    for (size_t i = 0; i < TestHeaderData->NumTests; ++i) {\n      // Get the instruction stats.\n      const auto INSTStats = &TestData[i];\n\n      FD.Write(fextl::fmt::format(\"\\t\\\"{}\\\": {{\\n\", CurrentTest->TestInst));\n\n      if (INSTStats->first.HostCodeInstructions != CurrentTest->ExpectedInstructionCount) {\n        FD.Write(fextl::fmt::format(\"\\t\\t\\\"ExpectedInstructionCount\\\": {},\\n\", INSTStats->first.HostCodeInstructions));\n      }\n\n      FD.Write(fextl::fmt::format(\"\\t\\t\\\"ExpectedArm64ASM\\\": [\\n\", INSTStats->first.HostCodeInstructions));\n      for (auto it = INSTStats->second.begin(); it != INSTStats->second.end(); ++it) {\n        const auto& Line = *it;\n        const auto NextIt = it + 1;\n        FD.Write(fextl::fmt::format(\"\\t\\t\\t\\\"{}\\\"{}\\n\", Line, NextIt != INSTStats->second.end() ? \",\" : \"\"));\n      }\n      FD.Write(fextl::fmt::format(\"\\t\\t]\\n\", INSTStats->first.HostCodeInstructions));\n\n      FD.Write(fextl::fmt::format(\"\\t}},\\n\", CurrentTest->TestInst));\n\n      // Go to the next test.\n      CurrentTest = reinterpret_cast<const TestInfo*>(&CurrentTest->Code[CurrentTest->CodeSize]);\n    }\n\n    // Print a null member\n    FD.Write(fextl::fmt::format(\"\\t\\\"\\\": \\\"\\\"\"));\n\n    FD.Write(\"}\\n\", 2);\n  }\n  return TestsPassed;\n}\n\nbool LoadTests(const char* Path) {\n  int FD = open(Path, O_RDONLY | O_CLOEXEC);\n  if (FD == -1) {\n    return false;\n  }\n\n  struct stat buf;\n  if (fstat(FD, &buf) == -1) {\n    close(FD);\n    return false;\n  }\n\n  TestDataSize = buf.st_size;\n  TestData = FEXCore::Allocator::mmap(nullptr, TestDataSize, PROT_READ, MAP_PRIVATE, FD, 0);\n  if (reinterpret_cast<uint64_t>(TestData) == ~0ULL) {\n    close(FD);\n    return false;\n  }\n\n  close(FD);\n\n  TestHeaderData = reinterpret_cast<const TestHeader*>(TestData);\n\n  // Need to walk past the environment variables to get to the actual tests.\n  const uint8_t* Data = TestHeaderData->Data;\n  for (size_t i = 0; i < TestHeaderData->EnvironmentVariableCount; ++i) {\n    // Environment variables are a pair of null terminated strings.\n    Data += strlen(reinterpret_cast<const char*>(Data)) + 1;\n    Data += strlen(reinterpret_cast<const char*>(Data)) + 1;\n  }\n  TestsStart = reinterpret_cast<const TestInfo*>(Data);\n  return true;\n}\n\nnamespace {\nstatic const fextl::vector<std::pair<const char*, FEXCore::Config::ConfigOption>> EnvConfigLookup = {{\n#define OPT_BASE(type, group, enum, json, default) {\"FEX_\" #enum, FEXCore::Config::ConfigOption::CONFIG_##enum},\n#include <FEXCore/Config/ConfigValues.inl>\n}};\n\n// Claims to be a local application config layer\nclass TestEnvLoader final : public FEXCore::Config::Layer {\npublic:\n  explicit TestEnvLoader()\n    : FEXCore::Config::Layer(FEXCore::Config::LayerType::LAYER_LOCAL_APP) {\n    Load();\n  }\n\n  void Load() override {\n    fextl::unordered_map<std::string_view, std::string> EnvMap;\n    const uint8_t* Data = TestHeaderData->Data;\n    for (size_t i = 0; i < TestHeaderData->EnvironmentVariableCount; ++i) {\n      // Environment variables are a pair of null terminated strings.\n      const std::string_view Key = reinterpret_cast<const char*>(Data);\n      Data += strlen(reinterpret_cast<const char*>(Data)) + 1;\n\n      const std::string_view Value_View = reinterpret_cast<const char*>(Data);\n      Data += strlen(reinterpret_cast<const char*>(Data)) + 1;\n      std::optional<fextl::string> Value;\n\n#define ENVLOADER\n#include <FEXCore/Config/ConfigOptions.inl>\n\n      if (Value) {\n        EnvMap.insert_or_assign(Key, *Value);\n      } else {\n        EnvMap.insert_or_assign(Key, Value_View);\n      }\n    }\n\n    auto GetVar = [&](const std::string_view id) -> std::optional<std::string_view> {\n      const auto it = EnvMap.find(id);\n      if (it == EnvMap.end()) {\n        return std::nullopt;\n      }\n\n      return it->second;\n    };\n\n    for (auto& it : EnvConfigLookup) {\n      if (auto Value = GetVar(it.first); Value) {\n#define OPT_BASE(type, group, enum, json, default) // Nothing\n#define OPT_STRARRAY(group, enum, json, default)                        \\\n  else if (it.second == FEXCore::Config::ConfigOption::CONFIG_##enum) { \\\n    AppendStrArrayValue(it.second, *Value);                             \\\n  }\n\n        if (false) {\n        }\n#include <FEXCore/Config/ConfigValues.inl>\n        else {\n          Set(it.second, *Value);\n        }\n      }\n    }\n  }\n\nprivate:\n  fextl::vector<std::pair<std::string_view, std::string_view>> Env;\n};\n\nclass SimpleSyscallHandler : public FEXCore::HLE::SyscallHandler, public FEXCore::Allocator::FEXAllocOperators {\npublic:\n  SimpleSyscallHandler() {\n    // Just claim to be linux 64-bit for simplicity.\n    OSABI = FEXCore::HLE::SyscallOSABI::OS_LINUX64;\n  }\n  uint64_t HandleSyscall(FEXCore::Core::CpuStateFrame* Frame, FEXCore::HLE::SyscallArguments* Args) override {\n    // Don't do anything\n    return 0;\n  }\n\n  // These are no-ops implementations of the SyscallHandler API\n  std::optional<FEXCore::ExecutableFileSectionInfo>\n  LookupExecutableFileSection(FEXCore::Core::InternalThreadState* Thread, uint64_t GuestAddr) override {\n    return std::nullopt;\n  }\n\n  FEXCore::HLE::ExecutableRangeInfo QueryGuestExecutableRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Address) override {\n    return {0, UINT64_MAX, true};\n  }\n};\n} // namespace\n\nint main(int argc, char** argv, char** const envp) {\n  FEXCore::Allocator::GLIBCScopedFault GLIBFaultScope;\n\n  // Initialize early as the message handlers use it.\n  CodeSize::CodeSizeValidation Validation {};\n  CodeSize::Validation = &Validation;\n\n  LogMan::Throw::InstallHandler(AssertHandler);\n  LogMan::Msg::InstallHandler(MsgHandler);\n  FEXCore::Config::Initialize();\n  FEXCore::Config::Load();\n\n  if (argc < 2) {\n    LogMan::Msg::EFmt(\"Usage: {} <Test binary> [Changed instruction count.json]\", argv[0]);\n    return 1;\n  }\n\n  if (!LoadTests(argv[1])) {\n    LogMan::Msg::EFmt(\"Couldn't load tests from {}\", argv[1]);\n    return 1;\n  }\n\n  FEXCore::Config::AddLayer(fextl::make_unique<TestEnvLoader>());\n  FEXCore::Config::ReloadMetaLayer();\n\n  // Setup configurations that this tool needs\n  // Maximum one instruction.\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_MAXINST, \"1\");\n  // Enable block disassembly.\n  FEXCore::Config::Set(\n    FEXCore::Config::CONFIG_DISASSEMBLE,\n    fextl::fmt::format(\"{}\", static_cast<uint64_t>(FEXCore::Config::Disassemble::BLOCKS | FEXCore::Config::Disassemble::STATS)));\n  // Choose bitness.\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_IS64BIT_MODE, TestHeaderData->Bitness == 64 ? \"1\" : \"0\");\n  // Disable telemetry, it can affect instruction counts.\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_DISABLETELEMETRY, \"1\");\n  // Disable vixl simulator indirect calls as it can affect instruction counts.\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_DISABLE_VIXL_INDIRECT_RUNTIME_CALLS, \"1\");\n\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_TSOENABLED, \"0\");\n\n  // Host feature override. Only supports overriding SVE width.\n  enum HostFeatures {\n    FEATURE_SVE128 = (1U << 0),\n    FEATURE_SVE256 = (1U << 1),\n    FEATURE_CLZERO = (1U << 2),\n    FEATURE_RNG = (1U << 3),\n    FEATURE_FCMA = (1U << 4),\n    FEATURE_CSSC = (1U << 5),\n    FEATURE_AFP = (1U << 6),\n    FEATURE_RPRES = (1U << 7),\n    FEATURE_FLAGM = (1U << 8),\n    FEATURE_FLAGM2 = (1U << 9),\n    FEATURE_CRYPTO = (1U << 10),\n    FEATURE_AES256 = (1U << 11),\n    FEATURE_SVEBITPERM = (1U << 12),\n    FEATURE_TSO = (1U << 13),\n    FEATURE_LRCPC = (1U << 14),\n    FEATURE_LRCPC2 = (1U << 15),\n    FEATURE_FRINTTS = (1U << 16),\n    FEATURE_MOPS = (1U << 17),\n  };\n\n  uint64_t SVEWidth = 0;\n  uint64_t HostFeatureControl {};\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_SVE128) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLESVE);\n    SVEWidth = 128;\n  }\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_SVE256) {\n    SVEWidth = 256;\n  }\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_CLZERO) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLECLZERO);\n  }\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_RNG) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLERNG);\n  }\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_FCMA) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLEFCMA);\n  }\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_CSSC) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLECSSC);\n  }\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_AFP) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLEAFP);\n  }\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_RPRES) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLERPRES);\n  }\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_FLAGM) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLEFLAGM);\n  }\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_FLAGM2) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLEFLAGM2);\n  }\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_CRYPTO) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLECRYPTO);\n  }\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_SVEBITPERM) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLESVEBITPERM);\n  }\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_LRCPC) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLELRCPC);\n  }\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_LRCPC2) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLELRCPC2);\n  }\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_FRINTTS) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLEFRINTTS);\n  }\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_MOPS) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLEMOPS);\n  }\n\n  if (TestHeaderData->EnabledHostFeatures & FEATURE_TSO) {\n    FEXCore::Config::Set(FEXCore::Config::ConfigOption::CONFIG_TSOENABLED, \"1\");\n    FEXCore::Config::Set(FEXCore::Config::ConfigOption::CONFIG_VECTORTSOENABLED, \"1\");\n    FEXCore::Config::Set(FEXCore::Config::ConfigOption::CONFIG_MEMCPYSETTSOENABLED, \"1\");\n  } else {\n    // Override the TSO default setting, since TSO is not relevant for most tests\n    FEXCore::Config::Set(FEXCore::Config::ConfigOption::CONFIG_TSOENABLED, \"0\");\n  }\n\n  // Always enable ARMv8.1 LSE atomics.\n  HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLEATOMICS);\n\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_SVE128) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::DISABLESVE);\n  }\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_CLZERO) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::DISABLECLZERO);\n  }\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_RNG) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::DISABLERNG);\n  }\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_FCMA) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::DISABLEFCMA);\n  }\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_CSSC) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::DISABLECSSC);\n  }\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_AFP) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::DISABLEAFP);\n  }\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_RPRES) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::DISABLERPRES);\n  }\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_FLAGM) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::DISABLEFLAGM);\n  }\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_FLAGM2) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::DISABLEFLAGM2);\n  }\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_CRYPTO) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::DISABLECRYPTO);\n  }\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_SVEBITPERM) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::DISABLESVEBITPERM);\n  }\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_LRCPC) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::DISABLELRCPC);\n  }\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_LRCPC2) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::DISABLELRCPC2);\n  }\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_FRINTTS) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::DISABLEFRINTTS);\n  }\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_MOPS) {\n    HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::DISABLEMOPS);\n  }\n\n  if (TestHeaderData->DisabledHostFeatures & FEATURE_TSO) {\n    FEXCore::Config::Set(FEXCore::Config::ConfigOption::CONFIG_TSOENABLED, \"0\");\n    FEXCore::Config::Set(FEXCore::Config::ConfigOption::CONFIG_VECTORTSOENABLED, \"0\");\n    FEXCore::Config::Set(FEXCore::Config::ConfigOption::CONFIG_MEMCPYSETTSOENABLED, \"0\");\n  }\n\n  // Always enable preserve_all abi.\n  HostFeatureControl |= static_cast<uint64_t>(FEXCore::Config::HostFeatures::ENABLEPRESERVEALLABI);\n\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_HOSTFEATURES, fextl::fmt::format(\"{}\", HostFeatureControl));\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_FORCESVEWIDTH, fextl::fmt::format(\"{}\", SVEWidth));\n\n  // Create FEXCore context.\n  fextl::unique_ptr<FEXCore::Context::Context> CTX;\n  {\n    auto HostFeatures = FEX::FetchHostFeatures();\n    HostFeatures.IsInstCountCI = true;\n    CTX = FEXCore::Context::Context::CreateNewContext(HostFeatures);\n  }\n\n  auto SignalDelegation = FEX::DummyHandlers::CreateSignalDelegator();\n  auto SyscallHandler = fextl::make_unique<SimpleSyscallHandler>();\n\n  CTX->SetSignalDelegator(SignalDelegation.get());\n  CTX->SetSyscallHandler(SyscallHandler.get());\n  if (!CTX->InitCore()) {\n    return -1;\n  }\n  auto ParentThread = CTX->CreateThread(0, 0);\n\n  // GDT data\n  FEXCore::Core::CPUState::gdt_segment gdt[32] {};\n\n  {\n    auto Frame = ParentThread->CurrentFrame;\n    // GDT and LDT are tracked per thread.\n    Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_GDT] = &gdt[0];\n    // TODO: LDTs are currently unsupported, mirror them to GDT.\n    Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_LDT] = &gdt[0];\n\n    // Default code segment indexes match the numbers that the Linux kernel uses.\n    Frame->State.cs_idx = FEXCore::Core::CPUState::DEFAULT_USER_CS << 3;\n    auto GDT = FEXCore::Core::CPUState::GetSegmentFromIndex(Frame->State, Frame->State.cs_idx);\n    FEXCore::Core::CPUState::SetGDTBase(GDT, 0);\n    FEXCore::Core::CPUState::SetGDTLimit(GDT, 0xF'FFFFU);\n    Frame->State.cs_cached =\n      FEXCore::Core::CPUState::CalculateGDTBase(*FEXCore::Core::CPUState::GetSegmentFromIndex(Frame->State, Frame->State.cs_idx));\n\n    if (TestHeaderData->Bitness == 64) {\n      GDT->L = 1; // L = Long Mode = 64-bit\n      GDT->D = 0; // D = Default Operand SIze = Reserved\n    } else {\n      GDT->L = 0; // L = Long Mode = 32-bit\n      GDT->D = 1; // D = Default Operand Size = 32-bit\n    }\n  }\n\n  // Calculate the base stats for instruction testing.\n  CodeSize::Validation->CalculateBaseStats(CTX.get(), ParentThread);\n\n  // Test all the instructions.\n  auto Result = TestInstructions(CTX.get(), ParentThread, argc >= 2 ? argv[2] : nullptr) ? 0 : 1;\n  CTX->DestroyThread(ParentThread);\n\n  FEXCore::Allocator::VirtualFree(TestData, TestDataSize);\n  return Result;\n}\n"
  },
  {
    "path": "Source/Tools/CommonTools/CMakeLists.txt",
    "content": "set(SRCS DummyHandlers.cpp)\n\nif (NOT MINGW)\n  list(APPEND SRCS Linux/Utils/ELFContainer.cpp)\nendif()\n\nadd_library(CommonTools STATIC ${SRCS})\ntarget_link_libraries(CommonTools FEXCore_Base FEXHeaderUtils)\ntarget_include_directories(CommonTools PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})\n"
  },
  {
    "path": "Source/Tools/CommonTools/CodeLoader.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <cstdint>\n#include <unistd.h>\n\nnamespace FEX {\n\n/**\n * @brief Code loader class so the CPU backend can load code in a generic fashion\n *\n * This class is expected to have multiple different style of code loaders\n */\nclass CodeLoader {\npublic:\n  struct AuxvResult {\n    uint64_t address;\n    uint64_t size;\n  };\n\n  virtual ~CodeLoader() = default;\n\n  /**\n   * @brief CPU Core uses this to choose what the stack size should be for this code\n   */\n  virtual uint64_t StackSize() const = 0;\n\n  /**\n   * Returns the initial stack pointer\n   */\n  virtual uint64_t GetStackPointer() const = 0;\n\n  /**\n   * @brief Function to return the guest RIP that the code should start out at\n   */\n  virtual uint64_t DefaultRIP() const = 0;\n\n  virtual fextl::vector<const char*> GetExecveArguments() const {\n    return {};\n  }\n\n  virtual AuxvResult GetAuxv() const {\n    return {};\n  }\n\n  virtual uint64_t GetBaseOffset() const {\n    return 0;\n  }\n\n  const fextl::vector<fextl::string>& GetApplicationArguments() const {\n    return ApplicationArgs;\n  }\n\nprotected:\n  fextl::vector<fextl::string> ApplicationArgs;\n};\n\n} // namespace FEX\n"
  },
  {
    "path": "Source/Tools/CommonTools/DummyHandlers.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"DummyHandlers.h\"\n\nnamespace FEX::DummyHandlers {\nthread_local FEXCore::Core::InternalThreadState* TLSThread;\n\nvoid DummySignalDelegator::RegisterTLSState(FEXCore::Core::InternalThreadState* Thread) {\n  TLSThread = Thread;\n}\n\nvoid DummySignalDelegator::UninstallTLSState(FEXCore::Core::InternalThreadState* Thread) {\n  TLSThread = nullptr;\n}\n\nFEXCore::Core::InternalThreadState* DummySignalDelegator::GetTLSThread() {\n  return TLSThread;\n}\n\nfextl::unique_ptr<FEXCore::HLE::SyscallHandler> CreateSyscallHandler() {\n  return fextl::make_unique<DummySyscallHandler>();\n}\n\nfextl::unique_ptr<FEX::DummyHandlers::DummySignalDelegator> CreateSignalDelegator() {\n  return fextl::make_unique<DummySignalDelegator>();\n}\n} // namespace FEX::DummyHandlers\n"
  },
  {
    "path": "Source/Tools/CommonTools/DummyHandlers.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Core/SignalDelegator.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n#include <FEXCore/Utils/AllocatorHooks.h>\n\n#include <FEXCore/fextl/memory.h>\n\nnamespace FEX::DummyHandlers {\n\nclass DummySyscallHandler : public FEXCore::HLE::SyscallHandler, public FEXCore::Allocator::FEXAllocOperators {\npublic:\n  uint64_t HandleSyscall(FEXCore::Core::CpuStateFrame* Frame, FEXCore::HLE::SyscallArguments* Args) override {\n    // Don't do anything\n    return 0;\n  }\n\n  // These are no-ops implementations of the SyscallHandler API\n  std::optional<FEXCore::ExecutableFileSectionInfo> LookupExecutableFileSection(FEXCore::Core::InternalThreadState*, uint64_t) override {\n    return std::nullopt;\n  }\n\n  FEXCore::HLE::ExecutableRangeInfo QueryGuestExecutableRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Address) override {\n    return {0, UINT64_MAX, true};\n  }\n};\n\nclass DummySignalDelegator final : public FEXCore::SignalDelegator, public FEXCore::Allocator::FEXAllocOperators {\npublic:\n  FEXCore::Core::InternalThreadState* GetBackingTLSThread() {\n    return GetTLSThread();\n  }\n\nprotected:\n  void RegisterTLSState(FEXCore::Core::InternalThreadState* Thread);\n  void UninstallTLSState(FEXCore::Core::InternalThreadState* Thread);\n\nprivate:\n  FEXCore::Core::InternalThreadState* GetTLSThread();\n};\n\nfextl::unique_ptr<FEXCore::HLE::SyscallHandler> CreateSyscallHandler();\nfextl::unique_ptr<FEX::DummyHandlers::DummySignalDelegator> CreateSignalDelegator();\n} // namespace FEX::DummyHandlers\n"
  },
  {
    "path": "Source/Tools/CommonTools/HarnessHelpers.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"CodeLoader.h\"\n#include \"Common/Config.h\"\n\n#include <array>\n#include <bitset>\n#include <cassert>\n#include <cstring>\n#include <fcntl.h>\n\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/FileLoading.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXHeaderUtils/BitUtils.h>\n#include <FEXHeaderUtils/Syscalls.h>\n#include <unistd.h>\n\nnamespace FEX::HarnessHelper {\ninline bool CompareStates(const FEXCore::Core::CPUState& State1, const FEXCore::Core::CPUState& State2, uint64_t MatchMask, bool OutputGPRs,\n                          bool SupportsAVX) {\n  bool Matches = true;\n\n  const auto DumpGPRs = [OutputGPRs](const fextl::string& Name, uint64_t A, uint64_t B) {\n    if (!OutputGPRs) {\n      return;\n    }\n    if (A == B) {\n      return;\n    }\n\n    fextl::fmt::print(\"{}: 0x{:016x} {} 0x{:016x}\\n\", Name, A, A == B ? \"==\" : \"!=\", B);\n  };\n\n  const auto CheckGPRs = [&Matches, DumpGPRs](const fextl::string& Name, uint64_t A, uint64_t B) {\n    DumpGPRs(Name, A, B);\n    Matches &= A == B;\n  };\n\n  // RIP\n  if (MatchMask & 1) {\n    CheckGPRs(\"RIP\", State1.rip, State2.rip);\n  }\n\n  MatchMask >>= 1;\n\n  // GPRS\n  for (unsigned i = 0; i < FEXCore::Core::CPUState::NUM_GPRS; ++i, MatchMask >>= 1) {\n    if (MatchMask & 1) {\n      CheckGPRs(fextl::fmt::format(\"GPR{}\", i), State1.gregs[i], State2.gregs[i]);\n    }\n  }\n\n  // XMM\n  if (SupportsAVX) {\n    for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_XMMS; ++i, MatchMask >>= 1) {\n      if (MatchMask & 1) {\n        CheckGPRs(fextl::fmt::format(\"XMM0_{}\", i), State1.xmm.avx.data[i][0], State2.xmm.avx.data[i][0]);\n        CheckGPRs(fextl::fmt::format(\"XMM1_{}\", i), State1.xmm.avx.data[i][1], State2.xmm.avx.data[i][1]);\n      }\n    }\n  } else {\n    for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_XMMS; ++i, MatchMask >>= 1) {\n      if (MatchMask & 1) {\n        CheckGPRs(fextl::fmt::format(\"XMM0_{}\", i), State1.xmm.sse.data[i][0], State2.xmm.sse.data[i][0]);\n        CheckGPRs(fextl::fmt::format(\"XMM1_{}\", i), State1.xmm.sse.data[i][1], State2.xmm.sse.data[i][1]);\n      }\n    }\n  }\n\n  // GS\n  if (MatchMask & 1) {\n    CheckGPRs(\"GS\", State1.gs_cached, State2.gs_cached);\n  }\n  MatchMask >>= 1;\n\n  // FS\n  if (MatchMask & 1) {\n    CheckGPRs(\"FS\", State1.fs_cached, State2.fs_cached);\n  }\n\n  return Matches;\n}\n\nclass ConfigLoader final {\npublic:\n  void Init(const fextl::string& ConfigFilename) {\n    FEXCore::FileLoading::LoadFile(RawConfigFile, ConfigFilename);\n    memcpy(&BaseConfig, RawConfigFile.data(), sizeof(ConfigStructBase));\n    GetEnvironmentOptions();\n  }\n\n  fextl::vector<std::pair<std::string_view, std::string_view>> GetEnvironmentOptions() {\n    fextl::vector<std::pair<std::string_view, std::string_view>> Env {};\n\n    uintptr_t DataOffset = BaseConfig.OptionEnvOptionOffset;\n    for (unsigned i = 0; i < BaseConfig.OptionEnvOptionCount; ++i) {\n      // Environment variables are null terminated strings\n      std::string_view Key = RawConfigFile.data() + DataOffset;\n      std::string_view Value = RawConfigFile.data() + DataOffset + Key.size() + 1;\n      DataOffset += Key.size() + Value.size() + 2;\n      Env.emplace_back(Key, Value);\n    }\n    return Env;\n  }\n\n  bool CompareStates(const FEXCore::Core::CPUState* State1, const FEXCore::Core::CPUState* State2, bool SupportsAVX) {\n    bool Matches = true;\n    uint64_t MatchMask = BaseConfig.OptionMatch & ~BaseConfig.OptionIgnore;\n    if (State1 && State2) {\n      Matches &= FEX::HarnessHelper::CompareStates(*State1, *State2, MatchMask, ConfigDumpGPRs(), SupportsAVX);\n    }\n\n    if (BaseConfig.OptionRegDataCount > 0) {\n      static constexpr std::array<uint64_t, 43> OffsetArrayAVX = {{\n        offsetof(FEXCore::Core::CPUState, rip),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RAX]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RBX]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RCX]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RDX]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RSI]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RDI]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RBP]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RSP]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R8]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R9]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R10]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R11]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R12]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R13]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R14]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R15]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[0][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[1][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[2][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[3][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[4][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[5][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[6][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[7][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[8][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[9][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[10][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[11][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[12][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[13][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[14][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.avx.data[15][0]),\n        offsetof(FEXCore::Core::CPUState, gs_cached),\n        offsetof(FEXCore::Core::CPUState, fs_cached),\n        offsetof(FEXCore::Core::CPUState, mm[0][0]),\n        offsetof(FEXCore::Core::CPUState, mm[1][0]),\n        offsetof(FEXCore::Core::CPUState, mm[2][0]),\n        offsetof(FEXCore::Core::CPUState, mm[3][0]),\n        offsetof(FEXCore::Core::CPUState, mm[4][0]),\n        offsetof(FEXCore::Core::CPUState, mm[5][0]),\n        offsetof(FEXCore::Core::CPUState, mm[6][0]),\n        offsetof(FEXCore::Core::CPUState, mm[7][0]),\n      }};\n      static constexpr std::array<uint64_t, 43> OffsetArraySSE = {{\n        offsetof(FEXCore::Core::CPUState, rip),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RAX]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RBX]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RCX]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RDX]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RSI]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RDI]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RBP]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RSP]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R8]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R9]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R10]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R11]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R12]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R13]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R14]),\n        offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_R15]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[0][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[1][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[2][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[3][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[4][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[5][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[6][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[7][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[8][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[9][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[10][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[11][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[12][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[13][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[14][0]),\n        offsetof(FEXCore::Core::CPUState, xmm.sse.data[15][0]),\n        offsetof(FEXCore::Core::CPUState, gs_cached),\n        offsetof(FEXCore::Core::CPUState, fs_cached),\n        offsetof(FEXCore::Core::CPUState, mm[0][0]),\n        offsetof(FEXCore::Core::CPUState, mm[1][0]),\n        offsetof(FEXCore::Core::CPUState, mm[2][0]),\n        offsetof(FEXCore::Core::CPUState, mm[3][0]),\n        offsetof(FEXCore::Core::CPUState, mm[4][0]),\n        offsetof(FEXCore::Core::CPUState, mm[5][0]),\n        offsetof(FEXCore::Core::CPUState, mm[6][0]),\n        offsetof(FEXCore::Core::CPUState, mm[7][0]),\n      }};\n\n      uintptr_t DataOffset = BaseConfig.OptionRegDataOffset;\n      for (unsigned i = 0; i < BaseConfig.OptionRegDataCount; ++i) {\n        RegDataStructBase* RegData = reinterpret_cast<RegDataStructBase*>(RawConfigFile.data() + DataOffset);\n        [[maybe_unused]] std::bitset<64> RegFlags = RegData->RegKey;\n        assert(RegFlags.count() == 1 && \"Must set reg data explicitly per register\");\n\n        size_t NameIndex = FEXCore::FindFirstSetBit(RegData->RegKey) - 1;\n        auto Offset = SupportsAVX ? OffsetArrayAVX[NameIndex] : OffsetArraySSE[NameIndex];\n        uint64_t* State1Data = reinterpret_cast<uint64_t*>(reinterpret_cast<uint64_t>(State1) + Offset);\n        uint64_t* State2Data = reinterpret_cast<uint64_t*>(reinterpret_cast<uint64_t>(State2) + Offset);\n\n        const auto DumpGPRs = [this](const fextl::string& Name, uint64_t A, uint64_t B) {\n          if (!ConfigDumpGPRs()) {\n            return;\n          }\n\n          fextl::fmt::print(\"{}: 0x{:016x} {} 0x{:016x} (Expected)\\n\", Name, A, A == B ? \"==\" : \"!=\", B);\n        };\n\n        const auto CheckGPRs = [&Matches, DumpGPRs](const fextl::string& Name, uint64_t A, uint64_t B) {\n          DumpGPRs(Name, A, B);\n          Matches &= A == B;\n        };\n\n        for (size_t j = 0; j < RegData->RegDataCount; ++j) {\n          fextl::string Name;\n          if (NameIndex == 0) { // RIP\n            Name = \"RIP\";\n          } else if (NameIndex >= 1 && NameIndex < 17) {\n            Name = fextl::fmt::format(\"GPR{}\", NameIndex - 1);\n          } else if (NameIndex >= 17 && NameIndex < 33) {\n            Name = fextl::fmt::format(\"XMM[{}][{}]\", NameIndex - 17, j);\n          } else if (NameIndex == 33) {\n            Name = \"gs\";\n          } else if (NameIndex == 34) {\n            Name = \"fs\";\n          } else if (NameIndex >= 35 && NameIndex < 43) {\n            Name = fextl::fmt::format(\"MM[{}][{}]\", NameIndex - 35, j);\n          }\n\n          if (State1) {\n            CheckGPRs(fextl::fmt::format(\"Core1: {}: \", Name), State1Data[j], RegData->RegValues[j]);\n          }\n          if (State2) {\n            CheckGPRs(fextl::fmt::format(\"Core2: {}: \", Name), State2Data[j], RegData->RegValues[j]);\n          }\n        }\n\n        // Get the correct data offset\n        DataOffset += sizeof(RegDataStructBase) + RegData->RegDataCount * 8;\n      }\n    }\n    return Matches;\n  }\n\n  fextl::map<uintptr_t, size_t> GetMemoryRegions() {\n    fextl::map<uintptr_t, size_t> regions;\n\n    uintptr_t DataOffset = BaseConfig.OptionMemoryRegionOffset;\n    for (unsigned i = 0; i < BaseConfig.OptionMemoryRegionCount; ++i) {\n      MemoryRegionBase* Region = reinterpret_cast<MemoryRegionBase*>(RawConfigFile.data() + DataOffset);\n      regions[Region->Region] = Region->Size;\n\n      DataOffset += sizeof(MemoryRegionBase);\n    }\n\n    return regions;\n  }\n\n  void LoadMemory() {\n    uintptr_t DataOffset = BaseConfig.OptionMemDataOffset;\n    for (unsigned i = 0; i < BaseConfig.OptionMemDataCount; ++i) {\n      MemDataStructBase* MemData = reinterpret_cast<MemDataStructBase*>(RawConfigFile.data() + DataOffset);\n      memcpy(reinterpret_cast<void*>(MemData->address), &MemData->data, MemData->length);\n      DataOffset += sizeof(MemDataStructBase) + MemData->length;\n    }\n  }\n\n  bool Is64BitMode() const {\n    return BaseConfig.OptionMode == 1;\n  }\n\n  enum HostFeatures {\n    FEATURE_ANY = 0,\n    FEATURE_3DNOW = (1 << 0),\n    FEATURE_SSE4A = (1 << 1),\n    FEATURE_AVX = (1 << 2),\n    FEATURE_RAND = (1 << 3),\n    FEATURE_SHA = (1 << 4),\n    FEATURE_CLZERO = (1 << 5),\n    FEATURE_BMI1 = (1 << 6),\n    FEATURE_BMI2 = (1 << 7),\n    FEATURE_CLWB = (1 << 8),\n    FEATURE_LINUX = (1 << 9),\n    FEATURE_AES256 = (1 << 10),\n    FEATURE_AFP = (1 << 11),\n    FEATURE_SSSE3 = (1 << 12),\n    FEATURE_SSE4_1 = (1 << 13),\n    FEATURE_SSE4_2 = (1 << 14),\n    FEATURE_AES = (1 << 15),\n    FEATURE_PCLMUL = (1 << 16),\n    FEATURE_MOVBE = (1 << 17),\n    FEATURE_ADX = (1 << 18),\n    FEATURE_XSAVE = (1 << 19),\n    FEATURE_RDPID = (1 << 20),\n    FEATURE_CLFLOPT = (1 << 21),\n    FEATURE_FSGSBASE = (1 << 22),\n    FEATURE_EMMI = (1 << 23),\n  };\n\n  bool Requires3DNow() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_3DNOW;\n  }\n  bool RequiresSSE4A() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_SSE4A;\n  }\n  bool RequiresAVX() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_AVX;\n  }\n  bool RequiresRAND() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_RAND;\n  }\n  bool RequiresSHA() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_SHA;\n  }\n  bool RequiresCLZERO() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_CLZERO;\n  }\n  bool RequiresBMI1() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_BMI1;\n  }\n  bool RequiresBMI2() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_BMI2;\n  }\n  bool RequiresCLWB() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_CLWB;\n  }\n  bool RequiresLinux() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_LINUX;\n  }\n  bool RequiresAES256() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_AES256;\n  }\n  bool RequiresAFP() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_AFP;\n  }\n  bool RequiresSSSE3() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_SSSE3;\n  }\n  bool RequiresSSE4_1() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_SSE4_1;\n  }\n  bool RequiresSSE4_2() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_SSE4_2;\n  }\n  bool RequiresAES() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_AES;\n  }\n  bool RequiresPCLMUL() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_PCLMUL;\n  }\n  bool RequiresMOVBE() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_MOVBE;\n  }\n  bool RequiresADX() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_ADX;\n  }\n  bool RequiresXSAVE() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_XSAVE;\n  }\n  bool RequiresRDPID() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_RDPID;\n  }\n  bool RequiresCLFLOPT() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_CLFLOPT;\n  }\n  bool RequiresFSGSBase() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_FSGSBASE;\n  }\n  bool RequiresEMMI() const {\n    return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_EMMI;\n  }\n\nprivate:\n  FEX_CONFIG_OPT(ConfigDumpGPRs, DUMPGPRS);\n\n  struct ConfigStructBase {\n    uint64_t OptionMatch;\n    uint64_t OptionIgnore;\n    uint64_t OptionStackSize;\n    uint64_t OptionEntryPoint;\n    uint32_t OptionABI;\n    uint32_t OptionMode;\n    uint32_t OptionHostFeatures;\n    uint32_t OptionMemoryRegionOffset;\n    uint32_t OptionMemoryRegionCount;\n    uint32_t OptionRegDataOffset;\n    uint32_t OptionRegDataCount;\n    uint32_t OptionMemDataOffset;\n    uint32_t OptionMemDataCount;\n    uint32_t OptionEnvOptionOffset;\n    uint32_t OptionEnvOptionCount;\n    uint8_t AdditionalData[];\n  } FEX_PACKED;\n\n  struct MemoryRegionBase {\n    uint64_t Region;\n    uint64_t Size;\n  } FEX_PACKED;\n\n  struct RegDataStructBase {\n    uint32_t RegDataCount;\n    uint64_t RegKey;\n    uint64_t RegValues[];\n  } FEX_PACKED;\n\n  struct MemDataStructBase {\n    uint64_t address;\n    uint32_t length;\n    uint8_t data[];\n  } FEX_PACKED;\n\n  fextl::vector<char> RawConfigFile;\n  ConfigStructBase BaseConfig;\n};\n\nclass HarnessCodeLoader final : public FEX::CodeLoader {\npublic:\n\n  HarnessCodeLoader(const fextl::string& Filename, const fextl::string& ConfigFilename) {\n    FEXCore::FileLoading::LoadFile(RawASMFile, Filename);\n\n    Config.Init(ConfigFilename);\n  }\n\n  uint64_t StackSize() const override {\n    const auto Page = sysconf(_SC_PAGESIZE);\n    return Page > 0 ? Page : FEXCore::Utils::FEX_PAGE_SIZE;\n  }\n\n  uint64_t GetStackPointer() const override {\n    LOGMAN_MSG_A_FMT(\"This should be unused.\");\n    FEX_UNREACHABLE;\n  }\n\n  uint64_t DefaultRIP() const override {\n    return RIP;\n  }\n\n  bool MapMemory(const std::function<void*(uint64_t, size_t)>& DoMMap) {\n    bool LimitedSize = true;\n    auto AllocPageSize = sysconf(_SC_PAGESIZE);\n    if (AllocPageSize <= 0) {\n      AllocPageSize = FEXCore::Utils::FEX_PAGE_SIZE;\n    }\n\n    if (LimitedSize) {\n      DoMMap(0xe000'0000, AllocPageSize * 10);\n\n      // SIB8\n      // We test [-128, -126] (Bottom)\n      // We test [-8, 8] (Middle)\n      // We test [120, 127] (Top)\n      // Can fit in two pages\n      DoMMap(0xe800'0000 - AllocPageSize, AllocPageSize * 2);\n    } else {\n      // This is scratch memory location and SIB8 location\n      DoMMap(0xe000'0000, 0x1000'0000);\n      // This is for large SIB 32bit displacement testing\n      DoMMap(0x2'0000'0000, 0x1'0000'1000);\n    }\n\n    // Map in the memory region for the test file\n#ifndef _WIN32\n    size_t Length = FEXCore::AlignUp(RawASMFile.size(), FEXCore::Utils::FEX_PAGE_SIZE);\n    auto ASMPtr = DoMMap(Code_start_page, Length);\n#else\n    // Special magic DOS area that starts at 0x1'0000\n    auto ASMPtr = DoMMap(1, 0x110000 - 1);\n#endif\n    LOGMAN_THROW_A_FMT((uint64_t)ASMPtr == Code_start_page, \"Couldn't allocate code at expected page: 0x{:x} != 0x{:x}\", (uint64_t)ASMPtr,\n                       Code_start_page);\n    memcpy(ASMPtr, RawASMFile.data(), RawASMFile.size());\n    RIP = Code_start_page;\n\n    // Map the memory regions the test file asks for\n    for (auto& [region, size] : Config.GetMemoryRegions()) {\n      DoMMap(region, size);\n    }\n\n    if (!Config.Is64BitMode()) {\n      // 32-bit gets a fixed page allocated for stack.\n      DoMMap(STACK_OFFSET, StackSize());\n    }\n\n    LoadMemory();\n\n    return true;\n  }\n\n  void LoadMemory() {\n    // Memory base here starts at the start location we passed back with GetLayout()\n    // This will write at [CODE_START_RANGE + 0, RawFile.size() )\n    Config.LoadMemory();\n  }\n\n  fextl::vector<std::pair<std::string_view, std::string_view>> GetEnvironmentOptions() {\n    return Config.GetEnvironmentOptions();\n  }\n\n  bool CompareStates(const FEXCore::Core::CPUState* State1, const FEXCore::Core::CPUState* State2, bool SupportsAVX) {\n    return Config.CompareStates(State1, State2, SupportsAVX);\n  }\n\n  bool Is64BitMode() const {\n    return Config.Is64BitMode();\n  }\n  bool Requires3DNow() const {\n    return Config.Requires3DNow();\n  }\n  bool RequiresSSE4A() const {\n    return Config.RequiresSSE4A();\n  }\n  bool RequiresAVX() const {\n    return Config.RequiresAVX();\n  }\n  bool RequiresRAND() const {\n    return Config.RequiresRAND();\n  }\n  bool RequiresSHA() const {\n    return Config.RequiresSHA();\n  }\n  bool RequiresCLZERO() const {\n    return Config.RequiresCLZERO();\n  }\n  bool RequiresBMI1() const {\n    return Config.RequiresBMI1();\n  }\n  bool RequiresBMI2() const {\n    return Config.RequiresBMI2();\n  }\n  bool RequiresCLWB() const {\n    return Config.RequiresCLWB();\n  }\n  bool RequiresLinux() const {\n    return Config.RequiresLinux();\n  }\n  bool RequiresAES256() const {\n    return Config.RequiresAES256();\n  }\n  bool RequiresAFP() const {\n    return Config.RequiresAFP();\n  }\n  bool RequiresSSSE3() const {\n    return Config.RequiresSSSE3();\n  }\n  bool RequiresSSE4_1() const {\n    return Config.RequiresSSE4_1();\n  }\n  bool RequiresSSE4_2() const {\n    return Config.RequiresSSE4_2();\n  }\n  bool RequiresAES() const {\n    return Config.RequiresAES();\n  }\n  bool RequiresPCLMUL() const {\n    return Config.RequiresPCLMUL();\n  }\n  bool RequiresMOVBE() const {\n    return Config.RequiresMOVBE();\n  }\n  bool RequiresADX() const {\n    return Config.RequiresADX();\n  }\n  bool RequiresXSAVE() const {\n    return Config.RequiresXSAVE();\n  }\n  bool RequiresRDPID() const {\n    return Config.RequiresRDPID();\n  }\n  bool RequiresCLFLOPT() const {\n    return Config.RequiresCLFLOPT();\n  }\n  bool RequiresFSGSBase() const {\n    return Config.RequiresFSGSBase();\n  }\n  bool RequiresEMMI() const {\n    return Config.RequiresEMMI();\n  }\n\nprivate:\n  constexpr static uint64_t STACK_OFFSET = 0xc000'0000;\n  // Zero is special case to know when we are done\n  uint64_t Code_start_page = 0x1'0000;\n  uint64_t RIP {};\n\n  fextl::vector<char> RawASMFile;\n  ConfigLoader Config;\n};\n\n} // namespace FEX::HarnessHelper\n"
  },
  {
    "path": "Source/Tools/CommonTools/Linux/Utils/ELFContainer.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: glue|elf-parsing\ndesc: Loads and parses an elf to memory. Also handles some loading & logic.\n$end_info$\n*/\n\n#include \"Linux/Utils/ELFContainer.h\"\n#include <FEXCore/Utils/FileLoading.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXHeaderUtils/Filesystem.h>\n#include <FEXHeaderUtils/SymlinkChecks.h>\n\n#include <algorithm>\n#include <cstring>\n#include <elf.h>\n#include <fcntl.h>\n#include <memory>\n#include <linux/limits.h>\n#include <system_error>\n#include <sys/stat.h>\n#include <unistd.h>\n\nnamespace ELFLoader {\n\nstatic ELFContainer::ELFType CheckELFType(uint8_t* Data) {\n  if (Data[EI_MAG0] != ELFMAG0 || Data[EI_MAG1] != ELFMAG1 || Data[EI_MAG2] != ELFMAG2 || Data[EI_MAG3] != ELFMAG3) {\n    return ELFContainer::ELFType::TYPE_NONE;\n  }\n\n  if (Data[EI_CLASS] == ELFCLASS32) {\n    Elf32_Ehdr* Header = reinterpret_cast<Elf32_Ehdr*>(Data);\n    if (Header->e_machine == EM_386) {\n      return ELFContainer::ELFType::TYPE_X86_32;\n    }\n  } else if (Data[EI_CLASS] == ELFCLASS64) {\n    Elf64_Ehdr* Header = reinterpret_cast<Elf64_Ehdr*>(Data);\n    if (Header->e_machine == EM_X86_64) {\n      return ELFContainer::ELFType::TYPE_X86_64;\n    }\n  }\n\n  return ELFContainer::ELFType::TYPE_OTHER_ELF;\n}\n\nELFContainer::ELFType ELFContainer::GetELFType(const fextl::string& Filename) {\n  // Open the Filename to determine if it is a shebang file.\n  int FD = open(Filename.c_str(), O_RDONLY | O_CLOEXEC);\n  if (FD == -1) {\n    return ELFType::TYPE_NONE;\n  }\n\n  auto ELFType = GetELFType(FD);\n  close(FD);\n  return ELFType;\n}\n\nELFContainer::ELFType ELFContainer::GetELFType(int FD) {\n  // We don't know the state of the FD coming in since this might be a guest tracked FD.\n  // Need to be extra careful here not to adjust file offsets and status flags.\n  //\n  // We can't use dup since that makes the FD have the same underlying state backing both FDs.\n\n  // We need to first determine the file size through fstat.\n  struct stat buf {};\n  if (fstat(FD, &buf) == -1) {\n    // Couldn't get size.\n    return ELFType::TYPE_NONE;\n  }\n\n  constexpr size_t ELFHeaderSize = std::max(sizeof(Elf32_Ehdr), sizeof(Elf64_Ehdr));\n  if (buf.st_size < ELFHeaderSize) {\n    // Is not a valid ELF.\n    return ELFType::TYPE_NONE;\n  }\n\n  std::array<char, ELFHeaderSize> RawFile;\n\n  // Read the header so we can tell if it is a supported ELF file.\n  // Can't adjust file offset, so use pread.\n  if (pread(FD, RawFile.data(), RawFile.size(), 0) != RawFile.size()) {\n    // Couldn't read\n    LogMan::Msg::EFmt(\"Couldn't read potential ELF FD\");\n    return ELFType::TYPE_NONE;\n  }\n\n  return CheckELFType(reinterpret_cast<uint8_t*>(RawFile.data()));\n}\n\nELFContainer::ELFContainer(const fextl::string& Filename, const fextl::string& RootFS, bool CustomInterpreter) {\n  Loaded = true;\n  if (!LoadELF(Filename)) {\n    LogMan::Msg::EFmt(\"Couldn't Load ELF file\");\n    Loaded = false;\n    return;\n  }\n\n  if (InterpreterHeader._64 && !CustomInterpreter) {\n    // If we we are dynamic application then we have an interpreter program header\n    // We need to load that ELF instead if it exists\n    // We are no longer dynamic since we are executing the interpreter\n    const char* RawString {};\n    if (Mode == MODE_32BIT) {\n      RawString = &RawFile.at(InterpreterHeader._32->p_offset);\n    } else {\n      RawString = &RawFile.at(InterpreterHeader._64->p_offset);\n    }\n    fextl::string RootFSLink = RootFS + RawString;\n    char Filename[PATH_MAX];\n    while (FHU::Symlinks::IsSymlink(RootFSLink)) {\n      // Do some special handling if the RootFS's linker is a symlink\n      // Ubuntu's rootFS by default provides an absolute location symlink to the linker\n      // Resolve this around back to the rootfs\n      const auto SymlinkTarget = FHU::Symlinks::ResolveSymlink(RootFSLink, Filename);\n      if (FHU::Filesystem::IsAbsolute(SymlinkTarget)) {\n        RootFSLink = RootFS;\n        RootFSLink += SymlinkTarget;\n      } else {\n        break;\n      }\n    }\n    if (LoadELF(RootFSLink)) {\n      // Found the interpreter in the rootfs\n    } else if (!LoadELF(RawString)) {\n      LogMan::Msg::EFmt(\"Failed to find guest ELF's interpter '{}'\", RawString);\n      LogMan::Msg::EFmt(\"Did you forget to set an x86 rootfs? Currently '{}'\", RootFS);\n      Loaded = false;\n      return;\n    }\n  } else if (InterpreterHeader._64) {\n    GetDynamicLibs();\n  }\n\n\n  CalculateMemoryLayouts();\n  CalculateSymbols();\n}\n\nELFContainer::~ELFContainer() {\n  NecessaryLibs.clear();\n  SymbolMapByAddress.clear();\n  SymbolMap.clear();\n  Symbols.clear();\n  ProgramHeaders.clear();\n  SectionHeaders.clear();\n  RawFile.clear();\n}\n\nbool ELFContainer::LoadELF(const fextl::string& Filename) {\n  if (!FEXCore::FileLoading::LoadFile(RawFile, Filename)) {\n    return false;\n  }\n\n  InterpreterHeader._64 = nullptr;\n\n  SectionHeaders.clear();\n  ProgramHeaders.clear();\n\n  uint8_t* Ident = reinterpret_cast<uint8_t*>(RawFile.data());\n\n  if (Ident[EI_MAG0] != ELFMAG0 || Ident[EI_MAG1] != ELFMAG1 || Ident[EI_MAG2] != ELFMAG2 || Ident[EI_MAG3] != ELFMAG3) {\n    LogMan::Msg::EFmt(\"ELF missing magic cookie\");\n    return false;\n  }\n\n  if (Ident[EI_CLASS] == ELFCLASS32) {\n    return LoadELF_32();\n  } else if (Ident[EI_CLASS] == ELFCLASS64) {\n    return LoadELF_64();\n  }\n\n  LogMan::Msg::EFmt(\"Unknown ELF type\");\n  return false;\n}\n\nbool ELFContainer::LoadELF_32() {\n  Mode = MODE_32BIT;\n\n  memcpy(&Header, reinterpret_cast<Elf32_Ehdr*>(RawFile.data()), sizeof(Elf32_Ehdr));\n  LOGMAN_THROW_A_FMT(Header._32.e_phentsize == sizeof(Elf32_Phdr), \"PH Entry size wasn't correct size\");\n  LOGMAN_THROW_A_FMT(Header._32.e_shentsize == sizeof(Elf32_Shdr), \"PH Entry size wasn't correct size\");\n\n  if (Header._32.e_machine != EM_386) {\n    LogMan::Msg::DFmt(\"32bit ELF wasn't x86 based\");\n    return false;\n  }\n\n  SectionHeaders.resize(Header._32.e_shnum);\n  ProgramHeaders.resize(Header._32.e_phnum);\n\n  Elf32_Shdr* RawShdrs = reinterpret_cast<Elf32_Shdr*>(&RawFile.at(Header._32.e_shoff));\n  Elf32_Phdr* RawPhdrs = reinterpret_cast<Elf32_Phdr*>(&RawFile.at(Header._32.e_phoff));\n\n  for (uint32_t i = 0; i < Header._32.e_shnum; ++i) {\n    SectionHeaders[i]._32 = &RawShdrs[i];\n  }\n\n  for (uint32_t i = 0; i < Header._32.e_phnum; ++i) {\n    ProgramHeaders[i]._32 = &RawPhdrs[i];\n    if (ProgramHeaders[i]._32->p_type == PT_INTERP) {\n      InterpreterHeader = ProgramHeaders[i];\n      DynamicLinker = reinterpret_cast<const char*>(&RawFile.at(InterpreterHeader._32->p_offset));\n    }\n  }\n\n  DynamicProgram = Header._32.e_type != ET_EXEC;\n\n  // Default BRK size\n  BRKSize = FEXCore::Utils::FEX_PAGE_SIZE;\n\n  return true;\n}\n\nbool ELFContainer::LoadELF_64() {\n  Mode = MODE_64BIT;\n\n  memcpy(&Header, reinterpret_cast<Elf64_Ehdr*>(RawFile.data()), sizeof(Elf64_Ehdr));\n  LOGMAN_THROW_A_FMT(Header._64.e_phentsize == 56, \"PH Entry size wasn't 56\");\n  LOGMAN_THROW_A_FMT(Header._64.e_shentsize == 64, \"PH Entry size wasn't 64\");\n\n  if (Header._64.e_machine != EM_X86_64) {\n    LogMan::Msg::DFmt(\"64bit ELF wasn't x86-64 based\");\n    return false;\n  }\n\n  SectionHeaders.resize(Header._64.e_shnum);\n  ProgramHeaders.resize(Header._64.e_phnum);\n\n  Elf64_Shdr* RawShdrs = reinterpret_cast<Elf64_Shdr*>(&RawFile.at(Header._64.e_shoff));\n  Elf64_Phdr* RawPhdrs = reinterpret_cast<Elf64_Phdr*>(&RawFile.at(Header._64.e_phoff));\n\n  for (uint32_t i = 0; i < Header._64.e_shnum; ++i) {\n    SectionHeaders[i]._64 = &RawShdrs[i];\n  }\n\n  for (uint32_t i = 0; i < Header._64.e_phnum; ++i) {\n    ProgramHeaders[i]._64 = &RawPhdrs[i];\n    if (ProgramHeaders[i]._64->p_type == PT_INTERP) {\n      InterpreterHeader = ProgramHeaders[i];\n      DynamicLinker = reinterpret_cast<const char*>(&RawFile.at(InterpreterHeader._64->p_offset));\n    }\n  }\n\n  DynamicProgram = Header._64.e_type != ET_EXEC;\n\n  // Default BRK size\n  BRKSize = 0x1000'0000;\n\n  return true;\n}\n\nvoid ELFContainer::WriteLoadableSections(MemoryWriter Writer, uint64_t Offset) {\n  if (Mode == MODE_32BIT) {\n    for (uint32_t i = 0; i < ProgramHeaders.size(); ++i) {\n      const Elf32_Phdr* hdr = ProgramHeaders.at(i)._32;\n      if (hdr->p_type == PT_LOAD) {\n        // LogMan::Msg::DFmt(\"PT_LOAD: Base: {} Offset: [0x{:x}, 0x{:x})\", Offset, hdr->p_paddr, hdr->p_filesz);\n        Writer(&RawFile.at(hdr->p_offset), Offset + hdr->p_paddr, hdr->p_filesz);\n      }\n\n      if (hdr->p_type == PT_TLS) {\n        Writer(&RawFile.at(hdr->p_offset), Offset + hdr->p_paddr, hdr->p_filesz);\n      }\n    }\n  } else {\n    for (uint32_t i = 0; i < ProgramHeaders.size(); ++i) {\n      const Elf64_Phdr* hdr = ProgramHeaders.at(i)._64;\n      if (hdr->p_type == PT_LOAD) {\n        Writer(&RawFile.at(hdr->p_offset), Offset + hdr->p_paddr, hdr->p_filesz);\n      }\n\n      if (hdr->p_type == PT_TLS) {\n        Writer(&RawFile.at(hdr->p_offset), Offset + hdr->p_paddr, hdr->p_filesz);\n      }\n    }\n  }\n}\n\nconst ELFSymbol* ELFContainer::GetSymbol(const char* Name) {\n  auto Sym = SymbolMap.find(Name);\n  if (Sym == SymbolMap.end()) {\n    return nullptr;\n  }\n  return Sym->second;\n}\nconst ELFSymbol* ELFContainer::GetSymbol(uint64_t Address) {\n  auto Sym = SymbolMapByAddress.find(Address);\n  if (Sym == SymbolMapByAddress.end()) {\n    return nullptr;\n  }\n  return Sym->second;\n}\nconst ELFSymbol* ELFContainer::GetSymbolInRange(RangeType Address) {\n  auto Sym = SymbolMapByAddress.upper_bound(Address.first);\n  if (Sym != SymbolMapByAddress.begin()) {\n    --Sym;\n  }\n  if (Sym == SymbolMapByAddress.end()) {\n    return nullptr;\n  }\n\n  if ((Sym->second->Address + Sym->second->Size) < Address.first) {\n    return nullptr;\n  }\n\n  return Sym->second;\n}\n\nvoid ELFContainer::CalculateMemoryLayouts() {\n  uint64_t MinPhysAddr = ~0ULL;\n  uint64_t MaxPhysAddr = 0;\n  uint64_t PhysMemSize = 0;\n\n  if (Mode == MODE_32BIT) {\n    for (uint32_t i = 0; i < ProgramHeaders.size(); ++i) {\n      Elf32_Phdr* hdr = ProgramHeaders.at(i)._32;\n      if (hdr->p_memsz > 0) {\n        MinPhysAddr = std::min(MinPhysAddr, static_cast<uint64_t>(hdr->p_paddr));\n        MaxPhysAddr = std::max(MaxPhysAddr, static_cast<uint64_t>(hdr->p_paddr) + hdr->p_memsz);\n      }\n      if (hdr->p_type == PT_TLS) {\n        TLSHeader._32 = hdr;\n      }\n    }\n  } else {\n    for (uint32_t i = 0; i < ProgramHeaders.size(); ++i) {\n      Elf64_Phdr* hdr = ProgramHeaders.at(i)._64;\n\n      // Many elfs have program region labeled .GNU_STACK which is empty and has a null address.\n      // It's used to mark the memory protection flags of the stack.\n      //\n      // We need to ignore such empty sections, or we will mistakenly assume the elf starts at zero.\n      if (hdr->p_memsz > 0) {\n        MinPhysAddr = std::min(MinPhysAddr, static_cast<uint64_t>(hdr->p_paddr));\n        MaxPhysAddr = std::max(MaxPhysAddr, static_cast<uint64_t>(hdr->p_paddr + hdr->p_memsz));\n      }\n      if (hdr->p_type == PT_TLS) {\n        TLSHeader._64 = hdr;\n      }\n    }\n  }\n\n  // Calculate BRK\n  MaxPhysAddr = FEXCore::AlignUp(MaxPhysAddr, FEXCore::Utils::FEX_PAGE_SIZE);\n  BRKBase = MaxPhysAddr;\n  MaxPhysAddr += BRKSize;\n\n  PhysMemSize = MaxPhysAddr - MinPhysAddr;\n\n  MinPhysicalMemoryLocation = MinPhysAddr;\n  MaxPhysicalMemoryLocation = MaxPhysAddr;\n  PhysicalMemorySize = PhysMemSize;\n}\n\nvoid ELFContainer::CalculateSymbols() {\n  // Find the symbol table\n  if (Mode == MODE_32BIT) {\n    const Elf32_Shdr* SymTabHeader {nullptr};\n    const Elf32_Shdr* StringTableHeader {nullptr};\n    const char* StrTab {nullptr};\n\n    const Elf32_Shdr* DynSymTabHeader {nullptr};\n    const Elf32_Shdr* DynStringTableHeader {nullptr};\n    const char* DynStrTab {nullptr};\n\n    for (uint32_t i = 0; i < SectionHeaders.size(); ++i) {\n      const Elf32_Shdr* hdr = SectionHeaders.at(i)._32;\n      if (hdr->sh_type == SHT_SYMTAB) {\n        SymTabHeader = hdr;\n        break;\n      }\n    }\n\n    for (uint32_t i = 0; i < SectionHeaders.size(); ++i) {\n      const Elf32_Shdr* hdr = SectionHeaders.at(i)._32;\n      if (hdr->sh_type == SHT_DYNSYM) {\n        DynSymTabHeader = hdr;\n        break;\n      }\n    }\n\n    if (!SymTabHeader && !DynSymTabHeader) {\n      LogMan::Msg::IFmt(\"No Symbol table\");\n      return;\n    }\n\n    uint64_t NumSymTabSymbols = 0;\n    uint64_t NumDynSymSymbols = 0;\n    if (SymTabHeader) {\n      LOGMAN_THROW_A_FMT(SymTabHeader->sh_link < SectionHeaders.size(), \"Symbol table string table section is wrong\");\n      LOGMAN_THROW_A_FMT(SymTabHeader->sh_entsize == sizeof(Elf32_Sym), \"Entry size doesn't match symbol entry\");\n\n      StringTableHeader = SectionHeaders.at(SymTabHeader->sh_link)._32;\n      StrTab = &RawFile.at(StringTableHeader->sh_offset);\n      NumSymTabSymbols = SymTabHeader->sh_size / SymTabHeader->sh_entsize;\n    }\n\n    if (DynSymTabHeader) {\n      LOGMAN_THROW_A_FMT(DynSymTabHeader->sh_link < SectionHeaders.size(), \"Symbol table string table section is wrong\");\n      LOGMAN_THROW_A_FMT(DynSymTabHeader->sh_entsize == sizeof(Elf32_Sym), \"Entry size doesn't match symbol entry\");\n\n      DynStringTableHeader = SectionHeaders.at(DynSymTabHeader->sh_link)._32;\n      DynStrTab = &RawFile.at(DynStringTableHeader->sh_offset);\n      NumDynSymSymbols = DynSymTabHeader->sh_size / DynSymTabHeader->sh_entsize;\n    }\n\n    uint64_t NumSymbols = NumSymTabSymbols + NumDynSymSymbols;\n\n    Symbols.resize(NumSymbols);\n    for (uint64_t i = 0; i < NumSymTabSymbols; ++i) {\n      uint64_t offset = SymTabHeader->sh_offset + i * SymTabHeader->sh_entsize;\n      const Elf32_Sym* Symbol = reinterpret_cast<const Elf32_Sym*>(&RawFile.at(offset));\n      if (ELF32_ST_VISIBILITY(Symbol->st_other) != STV_HIDDEN && Symbol->st_value != 0) {\n        const char* Name = &StrTab[Symbol->st_name];\n        if (Name[0] != '\\0') {\n          ELFSymbol* DefinedSymbol = &Symbols.at(i);\n          DefinedSymbol->FileOffset = offset;\n          DefinedSymbol->Address = Symbol->st_value;\n          DefinedSymbol->Size = Symbol->st_size;\n          DefinedSymbol->Type = ELF32_ST_TYPE(Symbol->st_info);\n          DefinedSymbol->Bind = ELF32_ST_BIND(Symbol->st_info);\n          DefinedSymbol->Name = Name;\n          DefinedSymbol->SectionIndex = Symbol->st_shndx;\n\n          SymbolMap[DefinedSymbol->Name] = DefinedSymbol;\n          SymbolMapByAddress[DefinedSymbol->Address] = DefinedSymbol;\n        }\n      }\n    }\n\n    for (uint64_t i = 0; i < NumDynSymSymbols; ++i) {\n      uint64_t offset = DynSymTabHeader->sh_offset + i * DynSymTabHeader->sh_entsize;\n      const Elf32_Sym* Symbol = reinterpret_cast<const Elf32_Sym*>(&RawFile.at(offset));\n      if (ELF32_ST_VISIBILITY(Symbol->st_other) != STV_HIDDEN && Symbol->st_value != 0) {\n        const char* Name = &DynStrTab[Symbol->st_name];\n        if (Name[0] != '\\0') {\n          ELFSymbol* DefinedSymbol = &Symbols.at(NumSymTabSymbols + i);\n          DefinedSymbol->FileOffset = offset;\n          DefinedSymbol->Address = Symbol->st_value;\n          DefinedSymbol->Size = Symbol->st_size;\n          DefinedSymbol->Type = ELF32_ST_TYPE(Symbol->st_info);\n          DefinedSymbol->Bind = ELF32_ST_BIND(Symbol->st_info);\n          DefinedSymbol->Name = Name;\n          DefinedSymbol->SectionIndex = Symbol->st_shndx;\n\n          SymbolMap[DefinedSymbol->Name] = DefinedSymbol;\n          SymbolMapByAddress[DefinedSymbol->Address] = DefinedSymbol;\n        }\n      }\n    }\n\n    const Elf32_Shdr* StrHeader = SectionHeaders.at(Header._32.e_shstrndx)._32;\n    const char* SHStrings = &RawFile.at(StrHeader->sh_offset);\n    for (uint32_t i = 0; i < SectionHeaders.size(); ++i) {\n      const Elf32_Shdr* hdr = SectionHeaders.at(i)._32;\n      if (strcmp(&SHStrings[hdr->sh_name], \".eh_frame_hdr\") == 0) {\n        auto eh_frame_hdr = &RawFile.at(hdr->sh_offset);\n        // we only handle this specific unwind table encoding\n        if (eh_frame_hdr[0] == 1 && eh_frame_hdr[1] == 0x1B && eh_frame_hdr[2] == 0x3 && eh_frame_hdr[3] == 0x3b) {\n          // ptr enc : 4 bytes, signed, pcrel\n          // fde count : 4 bytes udata\n          // table enc : 4 bytes, signed, datarel\n          int fde_count = *(int*)(eh_frame_hdr + 8);\n          UnwindEntries.clear();\n          UnwindEntries.reserve(fde_count);\n\n          struct entry {\n            int32_t pc;\n            int32_t fde;\n          };\n\n          entry* Table = (entry*)(eh_frame_hdr + 12);\n          for (int f = 0; f < fde_count; f++) {\n            uintptr_t Entry = (uintptr_t)(Table[f].pc + hdr->sh_offset);\n            UnwindEntries.push_back(Entry);\n          }\n        }\n        break;\n      }\n    }\n  } else {\n    const Elf64_Shdr* SymTabHeader {nullptr};\n    const Elf64_Shdr* StringTableHeader {nullptr};\n    const char* StrTab {nullptr};\n\n    const Elf64_Shdr* DynSymTabHeader {nullptr};\n    const Elf64_Shdr* DynStringTableHeader {nullptr};\n    const char* DynStrTab {nullptr};\n\n    for (uint32_t i = 0; i < SectionHeaders.size(); ++i) {\n      const Elf64_Shdr* hdr = SectionHeaders.at(i)._64;\n      if (hdr->sh_type == SHT_SYMTAB) {\n        SymTabHeader = hdr;\n        break;\n      }\n    }\n\n    for (uint32_t i = 0; i < SectionHeaders.size(); ++i) {\n      const Elf64_Shdr* hdr = SectionHeaders.at(i)._64;\n      if (hdr->sh_type == SHT_DYNSYM) {\n        DynSymTabHeader = hdr;\n        break;\n      }\n    }\n\n    if (!SymTabHeader && !DynSymTabHeader) {\n      LogMan::Msg::IFmt(\"No Symbol table\");\n      return;\n    }\n\n    uint64_t NumSymTabSymbols = 0;\n    uint64_t NumDynSymSymbols = 0;\n    if (SymTabHeader) {\n      LOGMAN_THROW_A_FMT(SymTabHeader->sh_link < SectionHeaders.size(), \"Symbol table string table section is wrong\");\n      LOGMAN_THROW_A_FMT(SymTabHeader->sh_entsize == sizeof(Elf64_Sym), \"Entry size doesn't match symbol entry\");\n\n      StringTableHeader = SectionHeaders.at(SymTabHeader->sh_link)._64;\n      StrTab = &RawFile.at(StringTableHeader->sh_offset);\n      NumSymTabSymbols = SymTabHeader->sh_size / SymTabHeader->sh_entsize;\n    }\n\n    if (DynSymTabHeader) {\n      LOGMAN_THROW_A_FMT(DynSymTabHeader->sh_link < SectionHeaders.size(), \"Symbol table string table section is wrong\");\n      LOGMAN_THROW_A_FMT(DynSymTabHeader->sh_entsize == sizeof(Elf64_Sym), \"Entry size doesn't match symbol entry\");\n\n      DynStringTableHeader = SectionHeaders.at(DynSymTabHeader->sh_link)._64;\n      DynStrTab = &RawFile.at(DynStringTableHeader->sh_offset);\n      NumDynSymSymbols = DynSymTabHeader->sh_size / DynSymTabHeader->sh_entsize;\n    }\n\n    uint64_t NumSymbols = NumSymTabSymbols + NumDynSymSymbols;\n\n    Symbols.resize(NumSymbols);\n    for (uint64_t i = 0; i < NumSymTabSymbols; ++i) {\n      uint64_t offset = SymTabHeader->sh_offset + i * SymTabHeader->sh_entsize;\n      const Elf64_Sym* Symbol = reinterpret_cast<const Elf64_Sym*>(&RawFile.at(offset));\n      if (ELF64_ST_VISIBILITY(Symbol->st_other) != STV_HIDDEN && Symbol->st_value != 0) {\n        const char* Name = &StrTab[Symbol->st_name];\n        if (Name[0] != '\\0') {\n          ELFSymbol* DefinedSymbol = &Symbols.at(i);\n          DefinedSymbol->FileOffset = offset;\n          DefinedSymbol->Address = Symbol->st_value;\n          DefinedSymbol->Size = Symbol->st_size;\n          DefinedSymbol->Type = ELF64_ST_TYPE(Symbol->st_info);\n          DefinedSymbol->Bind = ELF64_ST_BIND(Symbol->st_info);\n          DefinedSymbol->Name = Name;\n          DefinedSymbol->SectionIndex = Symbol->st_shndx;\n\n          SymbolMap[DefinedSymbol->Name] = DefinedSymbol;\n          SymbolMapByAddress[DefinedSymbol->Address] = DefinedSymbol;\n        }\n      }\n    }\n\n    for (uint64_t i = 0; i < NumDynSymSymbols; ++i) {\n      uint64_t offset = DynSymTabHeader->sh_offset + i * DynSymTabHeader->sh_entsize;\n      const Elf64_Sym* Symbol = reinterpret_cast<const Elf64_Sym*>(&RawFile.at(offset));\n      if (ELF64_ST_VISIBILITY(Symbol->st_other) != STV_HIDDEN && Symbol->st_value != 0) {\n        const char* Name = &DynStrTab[Symbol->st_name];\n        if (Name[0] != '\\0') {\n          ELFSymbol* DefinedSymbol = &Symbols.at(NumSymTabSymbols + i);\n          DefinedSymbol->FileOffset = offset;\n          DefinedSymbol->Address = Symbol->st_value;\n          DefinedSymbol->Size = Symbol->st_size;\n          DefinedSymbol->Type = ELF64_ST_TYPE(Symbol->st_info);\n          DefinedSymbol->Bind = ELF64_ST_BIND(Symbol->st_info);\n          DefinedSymbol->Name = Name;\n          DefinedSymbol->SectionIndex = Symbol->st_shndx;\n\n          SymbolMap[DefinedSymbol->Name] = DefinedSymbol;\n          SymbolMapByAddress[DefinedSymbol->Address] = DefinedSymbol;\n        }\n      }\n    }\n\n    const Elf64_Shdr* StrHeader = SectionHeaders.at(Header._64.e_shstrndx)._64;\n    const char* SHStrings = &RawFile.at(StrHeader->sh_offset);\n    for (uint32_t i = 0; i < SectionHeaders.size(); ++i) {\n      const Elf64_Shdr* hdr = SectionHeaders.at(i)._64;\n      if (strcmp(&SHStrings[hdr->sh_name], \".eh_frame_hdr\") == 0) {\n        auto eh_frame_hdr = &RawFile.at(hdr->sh_offset);\n        // we only handle this specific unwind table encoding\n        if (eh_frame_hdr[0] == 1 && eh_frame_hdr[1] == 0x1B && eh_frame_hdr[2] == 0x3 && eh_frame_hdr[3] == 0x3b) {\n          // ptr enc : 4 bytes, signed, pcrel\n          // fde count : 4 bytes udata\n          // table enc : 4 bytes, signed, datarel\n          int fde_count = *(int*)(eh_frame_hdr + 8);\n          UnwindEntries.clear();\n          UnwindEntries.reserve(fde_count);\n\n          struct entry {\n            int32_t pc;\n            int32_t fde;\n          };\n\n          entry* Table = (entry*)(eh_frame_hdr + 12);\n          for (int f = 0; f < fde_count; f++) {\n            uintptr_t Entry = (uintptr_t)(Table[f].pc + hdr->sh_offset);\n            UnwindEntries.push_back(Entry);\n          }\n        }\n        break;\n      }\n    }\n  }\n}\n\nvoid ELFContainer::GetDynamicLibs() {\n  if (Mode == MODE_32BIT) {\n    for (uint32_t i = 0; i < SectionHeaders.size(); ++i) {\n      const Elf32_Shdr* hdr = SectionHeaders.at(i)._32;\n      if (hdr->sh_type == SHT_DYNAMIC) {\n        const Elf32_Shdr* StrHeader = SectionHeaders.at(hdr->sh_link)._32;\n        const char* SHStrings = &RawFile.at(StrHeader->sh_offset);\n\n        size_t Entries = hdr->sh_size / hdr->sh_entsize;\n        for (size_t j = 0; i < Entries; ++j) {\n          const Elf32_Dyn* Dynamic = reinterpret_cast<const Elf32_Dyn*>(&RawFile.at(hdr->sh_offset + j * hdr->sh_entsize));\n          if (Dynamic->d_tag == DT_NULL) {\n            break;\n          }\n          if (Dynamic->d_tag == DT_NEEDED) {\n            NecessaryLibs.emplace_back(&SHStrings[Dynamic->d_un.d_val]);\n          }\n        }\n      }\n    }\n  } else {\n    for (uint32_t i = 0; i < SectionHeaders.size(); ++i) {\n      const Elf64_Shdr* hdr = SectionHeaders.at(i)._64;\n      if (hdr->sh_type == SHT_DYNAMIC) {\n        const Elf64_Shdr* StrHeader = SectionHeaders.at(hdr->sh_link)._64;\n        const char* SHStrings = &RawFile.at(StrHeader->sh_offset);\n\n        size_t Entries = hdr->sh_size / hdr->sh_entsize;\n        for (size_t j = 0; i < Entries; ++j) {\n          const Elf64_Dyn* Dynamic = reinterpret_cast<const Elf64_Dyn*>(&RawFile.at(hdr->sh_offset + j * hdr->sh_entsize));\n          if (Dynamic->d_tag == DT_NULL) {\n            break;\n          }\n          if (Dynamic->d_tag == DT_NEEDED) {\n            NecessaryLibs.emplace_back(&SHStrings[Dynamic->d_un.d_val]);\n          }\n        }\n      }\n    }\n  }\n}\n\nvoid ELFContainer::AddSymbols(SymbolAdder Adder) {\n  for (auto& Sym : Symbols) {\n    if (Sym.FileOffset) {\n      Adder(&Sym);\n    }\n  }\n}\nvoid ELFContainer::AddUnwindEntries(UnwindAdder Adder) {\n  for (auto Entry : UnwindEntries) {\n    Adder(Entry);\n  }\n}\n\nvoid ELFContainer::FixupRelocations(void* ELFBase, uint64_t GuestELFBase, SymbolGetter Getter) {\n  if (Mode == MODE_32BIT) {\n  } else {\n    const Elf64_Shdr* RelaHeader {nullptr};\n    const Elf64_Shdr* DynSymHeader {nullptr};\n\n    const Elf64_Shdr* StringTableHeader {nullptr};\n    const char* StrTab {nullptr};\n\n    for (size_t i = 0; i < SectionHeaders.size(); ++i) {\n      const auto* hdr = SectionHeaders[i]._64;\n      if (hdr->sh_type == SHT_REL) {\n        LogMan::Msg::DFmt(\"Unhandled REL section\");\n      } else if (hdr->sh_type == SHT_RELA) {\n        RelaHeader = hdr;\n\n        if (RelaHeader->sh_info != 0) {\n          LOGMAN_THROW_A_FMT(RelaHeader->sh_info < SectionHeaders.size(), \"Rela header pointers to invalid GOT header\");\n        }\n\n        if (RelaHeader->sh_link != 0) {\n          LOGMAN_THROW_A_FMT(RelaHeader->sh_link < SectionHeaders.size(), \"Rela header pointers to invalid dyndym header\");\n          DynSymHeader = SectionHeaders.at(RelaHeader->sh_link)._64;\n\n          StringTableHeader = SectionHeaders.at(DynSymHeader->sh_link)._64;\n          StrTab = &RawFile.at(StringTableHeader->sh_offset);\n        }\n\n        const size_t EntryCount = RelaHeader->sh_size / RelaHeader->sh_entsize;\n        const auto* Entries = reinterpret_cast<const Elf64_Rela*>(&RawFile.at(RelaHeader->sh_offset));\n\n        for (size_t j = 0; j < EntryCount; ++j) {\n          const auto* Entry = &Entries[j];\n          const uint32_t Sym = Entry->r_info >> 32;\n          const uint32_t Type = Entry->r_info & ~0U;\n          const Elf64_Sym* EntrySymbol {nullptr};\n          const char* EntrySymbolName {nullptr};\n          if (DynSymHeader && Sym != 0) {\n            LOGMAN_THROW_A_FMT(DynSymHeader->sh_entsize == sizeof(Elf64_Sym), \"Oops, entry size doesn't match\");\n\n            const uint64_t offset = DynSymHeader->sh_offset + Sym * DynSymHeader->sh_entsize;\n            EntrySymbol = reinterpret_cast<const Elf64_Sym*>(&RawFile.at(offset));\n            EntrySymbolName = &StrTab[EntrySymbol->st_name];\n          }\n\n          if (Type == R_X86_64_IRELATIVE) { // 37/0x25\n            // Indirect (B + A)\n            uint64_t* Location = reinterpret_cast<uint64_t*>(reinterpret_cast<uintptr_t>(ELFBase) + Entry->r_offset);\n            *Location = GuestELFBase + Entry->r_addend;\n          } else if (Type == R_X86_64_64) {\n            // S + A\n            uint64_t* Location = reinterpret_cast<uint64_t*>(reinterpret_cast<uintptr_t>(ELFBase) + Entry->r_offset);\n            if (EntrySymbol != nullptr) {\n              auto ELFSym = Getter(EntrySymbolName, 0);\n              if (ELFSym != nullptr) {\n                *Location = ELFSym->Address + Entry->r_addend;\n              } else {\n                *Location = 0xDEADBEEFBAD0DAD2ULL;\n              }\n            } else {\n              *Location = 0xDEADBEEFBAD0DAD2ULL;\n            }\n          } else if (Type == R_X86_64_RELATIVE) {\n            // B + A\n            uint64_t* Location = reinterpret_cast<uint64_t*>(reinterpret_cast<uintptr_t>(ELFBase) + Entry->r_offset);\n            *Location = GuestELFBase + Entry->r_addend;\n          } else if (Type == R_X86_64_GLOB_DAT) {\n            // XXX: This is way wrong\n            // S\n            uint64_t* Location = reinterpret_cast<uint64_t*>(reinterpret_cast<uintptr_t>(ELFBase) + Entry->r_offset);\n            if (EntrySymbol != nullptr) {\n              auto ELFSym = Getter(EntrySymbolName, 2); // Leave out Symbols from the main executable and only grab non-weak\n\n              if (!ELFSym) {\n                ELFSym = Getter(EntrySymbolName, 0);\n              }\n              if (!ELFSym) {\n                ELFSym = Getter(EntrySymbolName, 3);\n              }\n\n              if (ELFSym != nullptr) {\n                *Location = ELFSym->Address;\n              } else {\n                // XXX: This seems to be a loader edge case that if the symbol doesn't exist\n                // and it is a weakly defined GLOB_DAT type then it is allowed to continue?\n                // If we set Location to a value then apps crash\n              }\n            } else {\n              *Location = 0xDEADBEEFBAD0DAD1ULL;\n            }\n          } else if (Type == R_X86_64_JUMP_SLOT) {\n            // S\n            uint64_t* Location = reinterpret_cast<uint64_t*>(reinterpret_cast<uintptr_t>(ELFBase) + Entry->r_offset);\n            if (EntrySymbol != nullptr) {\n              auto ELFSym = Getter(EntrySymbolName, 0);\n              if (!ELFSym) { // XXX: Try again\n                ELFSym = Getter(EntrySymbolName, 3);\n              }\n\n              if (ELFSym != nullptr) {\n                *Location = ELFSym->Address;\n              } else {\n                // XXX: This seems to be a loader edge case that if the symbol doesn't exist\n                // and it is a weakly defined GLOB_DAT type then it is allowed to continue?\n                *Location = 0xDEADBEEFBAD0DAD5ULL;\n              }\n            } else {\n              *Location = 0xDEADBEEFBAD0DAD4ULL;\n            }\n          } else if (Type == R_X86_64_DTPMOD64) {\n            // XXX: This is supposed to be the ID of the module that the symbol comes from for TLS purposes?\n            uint64_t* Location = reinterpret_cast<uint64_t*>(reinterpret_cast<uintptr_t>(ELFBase) + Entry->r_offset);\n            *Location = 0;\n          } else if (Type == R_X86_64_DTPOFF64) {\n            uint64_t* Location = reinterpret_cast<uint64_t*>(reinterpret_cast<uintptr_t>(ELFBase) + Entry->r_offset);\n            if (EntrySymbol != nullptr) {\n              *Location = EntrySymbol->st_value + Entry->r_addend;\n            } else {\n              *Location = 0xDEADBEEFBAD0DAD6ULL;\n            }\n          } else if (Type == R_X86_64_TPOFF64) {\n            uint64_t* Location = reinterpret_cast<uint64_t*>(reinterpret_cast<uintptr_t>(ELFBase) + Entry->r_offset);\n            if (EntrySymbol != nullptr) {\n              // XXX: This is supposed to be a symbol with a TLS offset?\n              *Location = EntrySymbol->st_value + Entry->r_addend;\n            } else {\n              // If we set Location to a value then apps crash\n              // *Location = 0xDEADBEEFBAD0DAD3ULL;\n              LogMan::Msg::DFmt(\"TPOFF without Entry? {:x} + {:x} + {:x}\", GuestELFBase, TLSHeader._64->p_paddr, Entry->r_addend);\n              if (1) {\n                *Location = TLSHeader._64->p_paddr + Entry->r_addend;\n              } else if (Entry->r_offset == 0x1e3dc8) {\n                *Location = 0xDEADBEEFBAD0DAD8ULL;\n              } else {\n                *Location = Entry->r_addend - 0xb00'0;\n              }\n            }\n          } else {\n            LogMan::Msg::DFmt(\"Unknown relocation type: {}(0x{:x})\", Type, Type);\n          }\n        }\n      }\n    }\n  }\n}\n\nvoid ELFContainer::GetInitLocations(uint64_t GuestELFBase, fextl::vector<uint64_t>* Locations) {\n  if (Mode == MODE_32BIT) {\n    // If INIT exists then add that first\n    for (uint32_t i = 0; i < SectionHeaders.size(); ++i) {\n      const Elf32_Shdr* hdr = SectionHeaders.at(i)._32;\n      if (hdr->sh_type == SHT_DYNAMIC) {\n        size_t Entries = hdr->sh_size / hdr->sh_entsize;\n        for (size_t j = 0; i < Entries; ++j) {\n          const Elf32_Dyn* Dynamic = reinterpret_cast<const Elf32_Dyn*>(&RawFile.at(hdr->sh_offset + j * hdr->sh_entsize));\n          if (Dynamic->d_tag == DT_NULL) {\n            break;\n          }\n          if (Dynamic->d_tag == DT_INIT) {\n            Locations->emplace_back(GuestELFBase + Dynamic->d_un.d_val);\n          }\n        }\n      }\n    }\n\n    // Fill init_array\n    for (uint32_t i = 0; i < SectionHeaders.size(); ++i) {\n      const Elf32_Shdr* hdr = SectionHeaders.at(i)._32;\n      if (hdr->sh_type == SHT_INIT_ARRAY) {\n        size_t Entries = hdr->sh_size / hdr->sh_entsize;\n        for (size_t j = 0; j < Entries; ++j) {\n          Locations->emplace_back(GuestELFBase + *reinterpret_cast<const uint64_t*>(&RawFile.at(hdr->sh_offset + j * hdr->sh_entsize)));\n        }\n      }\n    }\n  } else {\n    // If INIT exists then add that first\n    for (uint32_t i = 0; i < SectionHeaders.size(); ++i) {\n      const Elf64_Shdr* hdr = SectionHeaders.at(i)._64;\n      if (hdr->sh_type == SHT_DYNAMIC) {\n        size_t Entries = hdr->sh_size / hdr->sh_entsize;\n        for (size_t j = 0; i < Entries; ++j) {\n          const Elf64_Dyn* Dynamic = reinterpret_cast<const Elf64_Dyn*>(&RawFile.at(hdr->sh_offset + j * hdr->sh_entsize));\n          if (Dynamic->d_tag == DT_NULL) {\n            break;\n          }\n          if (Dynamic->d_tag == DT_INIT) {\n            Locations->emplace_back(GuestELFBase + Dynamic->d_un.d_val);\n          }\n        }\n      }\n    }\n\n    // Fill init_array\n    for (uint32_t i = 0; i < SectionHeaders.size(); ++i) {\n      const Elf64_Shdr* hdr = SectionHeaders.at(i)._64;\n      if (hdr->sh_type == SHT_INIT_ARRAY) {\n        size_t Entries = hdr->sh_size / hdr->sh_entsize;\n        for (size_t j = 0; j < Entries; ++j) {\n          Locations->emplace_back(GuestELFBase + *reinterpret_cast<const uint64_t*>(&RawFile.at(hdr->sh_offset + j * hdr->sh_entsize)));\n        }\n      }\n    }\n  }\n}\n\n} // namespace ELFLoader\n"
  },
  {
    "path": "Source/Tools/CommonTools/Linux/Utils/ELFContainer.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/unordered_map.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <cstdint>\n#include <elf.h>\n#include <functional>\n#include <stddef.h>\n#include <utility>\n\n// Add macros which are missing in some versions of <elf.h>\n#ifndef ELF32_ST_VISIBILITY\n#define ELF32_ST_VISIBILITY(o) ((o) & 0x3)\n#endif\n\n#ifndef ELF64_ST_VISIBILITY\n#define ELF64_ST_VISIBILITY(o) ((o) & 0x3)\n#endif\n\nnamespace ELFLoader {\nstruct ELFSymbol {\n  uint64_t FileOffset;\n  uint64_t Address;\n  uint64_t Size;\n  uint8_t Type;\n  uint8_t Bind;\n  uint16_t SectionIndex;\n  const char* Name;\n};\n\nclass ELFContainer {\npublic:\n  ELFContainer(const fextl::string& Filename, const fextl::string& RootFS, bool CustomInterpreter);\n  ~ELFContainer();\n\n  uint64_t GetEntryPoint() const {\n    if (Mode == MODE_32BIT) {\n      return Header._32.e_entry;\n    } else {\n      return Header._64.e_entry;\n    }\n  }\n\n  struct MemoryLayout final {\n    uint64_t MinPhysicalMemoryLocation;\n    uint64_t MaxPhysicalMemoryLocation;\n    uint64_t PhysicalMemorySize;\n  };\n\n  MemoryLayout GetLayout() const {\n    return {MinPhysicalMemoryLocation, MaxPhysicalMemoryLocation, PhysicalMemorySize};\n  }\n\n  struct BRKInfo {\n    uint64_t Base;\n    uint64_t Size;\n  };\n\n  BRKInfo GetBRKInfo() const {\n    return {BRKBase, BRKSize};\n  }\n\n  // Data, Physical, Size\n  using MemoryWriter = std::function<void(void*, uint64_t, uint64_t)>;\n  void WriteLoadableSections(MemoryWriter Writer, uint64_t Offset = 0);\n\n  const ELFSymbol* GetSymbol(const char* Name);\n  const ELFSymbol* GetSymbol(uint64_t Address);\n\n  using RangeType = std::pair<uint64_t, uint64_t>;\n  const ELFSymbol* GetSymbolInRange(RangeType Address);\n\n  bool WasDynamic() const {\n    return DynamicProgram;\n  }\n  bool HasDynamicLinker() const {\n    return !DynamicLinker.empty();\n  }\n  bool WasLoaded() const {\n    return Loaded;\n  }\n  fextl::string& InterpreterLocation() {\n    return DynamicLinker;\n  }\n\n  const fextl::vector<const char*>* GetNecessaryLibs() const {\n    return &NecessaryLibs;\n  }\n\n  using SymbolGetter = std::function<ELFSymbol*(const char*, uint8_t)>;\n  void FixupRelocations(void* ELFBase, uint64_t GuestELFBase, SymbolGetter Getter);\n\n  using SymbolAdder = std::function<void(ELFSymbol*)>;\n  void AddSymbols(SymbolAdder Adder);\n\n  using UnwindAdder = std::function<void(uintptr_t)>;\n  void AddUnwindEntries(UnwindAdder Adder);\n\n  void GetInitLocations(uint64_t GuestELFBase, fextl::vector<uint64_t>* Locations);\n\n\n  bool HasTLS() const {\n    return TLSHeader._64 != nullptr;\n  }\n  uint64_t GetTLSBase() const {\n    if (GetMode() == ELFMode::MODE_64BIT) {\n      return TLSHeader._64->p_vaddr;\n    } else {\n      return TLSHeader._32->p_vaddr;\n    }\n  }\n\n  enum ELFMode {\n    MODE_32BIT,\n    MODE_64BIT,\n  };\n\n  ELFMode GetMode() const {\n    return Mode;\n  }\n  size_t GetProgramHeaderCount() const {\n    return ProgramHeaders.size();\n  }\n\n  enum ELFType {\n    TYPE_NONE,\n    TYPE_X86_64,\n    TYPE_X86_32,\n    TYPE_OTHER_ELF,\n  };\n  static ELFType GetELFType(const fextl::string& Filename);\n  static ELFType GetELFType(int FD);\n  static bool IsSupportedELF(const fextl::string& Filename) {\n    ELFType Type = GetELFType(Filename);\n    return Type == TYPE_X86_64 || Type == TYPE_X86_32;\n  }\n\nprivate:\n  bool LoadELF(const fextl::string& Filename);\n  bool LoadELF_32();\n  bool LoadELF_64();\n  void CalculateMemoryLayouts();\n  void CalculateSymbols();\n  void GetDynamicLibs();\n\n  fextl::vector<char> RawFile;\n  union {\n    Elf32_Ehdr _32;\n    Elf64_Ehdr _64;\n  } Header;\n\n  union SectionHeader {\n    Elf32_Shdr* _32;\n    Elf64_Shdr* _64;\n  };\n\n  union ProgramHeader {\n    Elf32_Phdr* _32;\n    Elf64_Phdr* _64;\n  };\n\n  ELFMode Mode;\n  fextl::vector<SectionHeader> SectionHeaders;\n  fextl::vector<ProgramHeader> ProgramHeaders;\n  fextl::vector<ELFSymbol> Symbols;\n  fextl::vector<uintptr_t> UnwindEntries;\n  fextl::unordered_map<fextl::string, ELFSymbol*> SymbolMap;\n  fextl::map<uint64_t, ELFSymbol*> SymbolMapByAddress;\n\n  fextl::vector<const char*> NecessaryLibs;\n\n  uint64_t MinPhysicalMemoryLocation {0};\n  uint64_t MaxPhysicalMemoryLocation {0};\n  uint64_t PhysicalMemorySize {0};\n\n  uint64_t BRKBase {};\n  uint64_t BRKSize {};\n  ProgramHeader InterpreterHeader {};\n  bool DynamicProgram {false};\n  fextl::string DynamicLinker;\n  ProgramHeader TLSHeader {};\n  bool Loaded {false};\n};\n\n} // namespace ELFLoader\n"
  },
  {
    "path": "Source/Tools/CommonTools/Linux/Utils/ELFParser.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/Core/CodeCache.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <elf.h>\n#include <fcntl.h>\n#include <optional>\n#include <unistd.h>\n\n#include \"Linux/Utils/ELFContainer.h\"\n\n/*\n  Simpler elf parser, checks for the elf MAGIC COOKIE\n  and loads the phdrs\n  Also keeps an fd open\n*/\n\nstruct ELFParser {\n  Elf64_Ehdr ehdr;\n  fextl::vector<Elf64_Phdr> phdrs;\n  std::optional<fextl::vector<Elf64_Shdr>> shdrs;\n  ::ELFLoader::ELFContainer::ELFType type {::ELFLoader::ELFContainer::TYPE_NONE};\n\n  fextl::string InterpreterElf;\n  int fd {-1};\n\n  bool ReadElf(int NewFD) {\n    Closefd();\n    static_assert(EI_CLASS == 4);\n\n    fd = NewFD;\n    type = ::ELFLoader::ELFContainer::TYPE_NONE;\n    shdrs.reset();\n\n    if (fd == -1) {\n      // Likely just doesn't exist\n      return false;\n    }\n\n    // Get file size\n    off_t Size = lseek(fd, 0, SEEK_END);\n\n    if (Size < 4) {\n      // Likely invalid can't fit header\n      return false;\n    }\n\n    // Reset to beginning\n    if (lseek(fd, 0, SEEK_SET) == -1) {\n      return false;\n    }\n\n    uint8_t header[5];\n    if (pread(fd, header, sizeof(header), 0) == -1) {\n      LogMan::Msg::EFmt(\"Failed to read elf header from '{}'\", fd);\n      return false;\n    }\n\n    if (header[0] != ELFMAG0 || header[1] != ELFMAG1 || header[2] != ELFMAG2 || header[3] != ELFMAG3) {\n      LogMan::Msg::EFmt(\"Elf header from '{}' doesn't match ELF MAGIC\", fd);\n      return false;\n    }\n\n    type = ::ELFLoader::ELFContainer::TYPE_OTHER_ELF;\n\n    if (header[EI_CLASS] == ELFCLASS32) {\n      Elf32_Ehdr hdr32;\n      if (pread(fd, &hdr32, sizeof(hdr32), 0) == -1) {\n        LogMan::Msg::EFmt(\"Failed to read Ehdr32 from '{}'\", fd);\n        return false;\n      }\n\n      // do the sizes match up as expected?\n\n      // check elf header\n      if (hdr32.e_ehsize != sizeof(hdr32)) {\n        LogMan::Msg::EFmt(\"Invalid e_ehsize32 from '{}'\", fd);\n        return false;\n      }\n\n      // check program header\n      if (hdr32.e_phentsize != sizeof(Elf32_Phdr)) {\n        LogMan::Msg::EFmt(\"Invalid e_phentsize32 from '{}'\", fd);\n        return false;\n      }\n\n      // Convert to 64 bit header\n      for (int i = 0; i < EI_NIDENT; i++) {\n        ehdr.e_ident[i] = hdr32.e_ident[i];\n      }\n\n#define COPY(name) ehdr.name = hdr32.name\n      COPY(e_type);\n      COPY(e_machine);\n      COPY(e_version);\n      COPY(e_entry);\n      COPY(e_phoff);\n      COPY(e_shoff);\n      COPY(e_flags);\n      COPY(e_ehsize);\n      COPY(e_phentsize);\n      COPY(e_phnum);\n      COPY(e_shentsize);\n      COPY(e_shnum);\n      COPY(e_shstrndx);\n#undef COPY\n\n      if (ehdr.e_machine != EM_386) {\n        LogMan::Msg::EFmt(\"Invalid e_machine from '{}'\", fd);\n        return false;\n      }\n\n      type = ::ELFLoader::ELFContainer::TYPE_X86_32;\n    } else if (header[EI_CLASS] == ELFCLASS64) {\n      if (pread(fd, &ehdr, sizeof(ehdr), 0) == -1) {\n        LogMan::Msg::EFmt(\"Failed to read Ehdr64 from '{}'\", fd);\n        return false;\n      }\n\n      // do the sizes match up as expected?\n\n      // check elf header\n      if (ehdr.e_ehsize != sizeof(ehdr)) {\n        LogMan::Msg::EFmt(\"Invalid e_ehsize64 from '{}'\", fd);\n        return false;\n      }\n\n      // check program header\n      if (ehdr.e_phentsize != sizeof(Elf64_Phdr)) {\n        LogMan::Msg::EFmt(\"Invalid e_phentsize64 from '{}'\", fd);\n        return false;\n      }\n\n      if (ehdr.e_machine != EM_X86_64) {\n        LogMan::Msg::EFmt(\"Invalid e_machine64 from '{}'\", fd);\n        return false;\n      }\n\n      type = ::ELFLoader::ELFContainer::TYPE_X86_64;\n    } else {\n      // Unexpected elf type\n      LogMan::Msg::EFmt(\"Unexpected elf type from '{}'\", fd);\n      return false;\n    }\n\n    // sanity check program header count\n    if (ehdr.e_phnum < 1 || ehdr.e_phnum > 65536 / ehdr.e_phentsize) {\n      LogMan::Msg::EFmt(\"Too many program headers '{}'\", fd);\n      return false;\n    }\n\n    // sanity check program header offset size.\n    if (ehdr.e_phoff > Size || (ehdr.e_phentsize * ehdr.e_phnum) > (Size - ehdr.e_phoff)) {\n      LogMan::Msg::EFmt(\"Program headers exceeds size of program\");\n      return false;\n    }\n\n    if (type == ::ELFLoader::ELFContainer::TYPE_X86_32) {\n      fextl::vector<Elf32_Phdr> phdrs32(ehdr.e_phnum);\n\n      if (pread(fd, phdrs32.data(), sizeof(Elf32_Phdr) * ehdr.e_phnum, ehdr.e_phoff) == -1) {\n        LogMan::Msg::EFmt(\"Failed to read phdr32 from '{}'\", fd);\n        return false;\n      }\n\n      // Convert to 64 bit program headers\n      phdrs.resize(ehdr.e_phnum);\n\n      for (int i = 0; i < ehdr.e_phnum; i++) {\n#define COPY(name) phdrs[i].name = phdrs32[i].name\n\n        COPY(p_type);\n        COPY(p_offset);\n        COPY(p_vaddr);\n        COPY(p_paddr);\n        COPY(p_filesz);\n        COPY(p_memsz);\n        COPY(p_flags);\n        COPY(p_align);\n\n#undef COPY\n      }\n    } else {\n      phdrs.resize(ehdr.e_phnum);\n\n      if (pread(fd, phdrs.data(), sizeof(Elf64_Phdr) * ehdr.e_phnum, ehdr.e_phoff) == -1) {\n        LogMan::Msg::EFmt(\"Failed to read phdr64 from '{}'\", fd);\n        return false;\n      }\n    }\n\n    for (const auto& phdr : phdrs) {\n      if (phdr.p_type == PT_INTERP) {\n        InterpreterElf.resize(phdr.p_filesz);\n\n        if (pread(fd, InterpreterElf.data(), phdr.p_filesz, phdr.p_offset) == -1) {\n          LogMan::Msg::EFmt(\"Failed to read interpreter from '{}'\", fd);\n          return false;\n        }\n      }\n    }\n\n    return true;\n  }\n\n  ptrdiff_t FileToVA(off_t FileOffset) const {\n    for (const auto& phdr : phdrs) {\n      if (phdr.p_offset <= FileOffset && (phdr.p_offset + phdr.p_filesz) > FileOffset) {\n        auto SectionFileOffset = FileOffset - phdr.p_offset;\n\n        if (SectionFileOffset < phdr.p_memsz) {\n          return SectionFileOffset + phdr.p_vaddr;\n        }\n      }\n    }\n\n    return {};\n  }\n\n  off_t VAToFile(ptrdiff_t VAOffset) const {\n    for (const auto& phdr : phdrs) {\n      if (phdr.p_vaddr <= VAOffset && (phdr.p_vaddr + phdr.p_memsz) > VAOffset) {\n        auto SectionVAOffset = VAOffset - phdr.p_vaddr;\n\n        if (SectionVAOffset < phdr.p_filesz) {\n          return SectionVAOffset + phdr.p_offset;\n        }\n      }\n    }\n\n    return {};\n  }\n\n  bool ReadElf(const fextl::string& file) {\n    int NewFD = ::open(file.c_str(), O_RDONLY);\n\n    return ReadElf(NewFD);\n  }\n\n  /**\n   * Checks if DT_TEXTREL/DF_TEXTREL exist in the PT_DYNAMIC segment.\n   *\n   * These indicate that the ELF has relocations that cover to read-only code\n   * pages. The dynamic loader will temporarily map these pages as writeable\n   * to apply the relocations.\n   */\n  bool HasCodeRelocations() const {\n    if (fd == -1) {\n      return false;\n    }\n\n    auto phdr_it = std::ranges::find_if(phdrs, [](auto& phdr) { return phdr.p_type == PT_DYNAMIC; });\n    if (phdr_it == phdrs.end()) {\n      return false;\n    }\n\n    if (type == ::ELFLoader::ELFContainer::TYPE_X86_32) {\n      return HasCodeRelocations<Elf32_Dyn>(*phdr_it);\n    } else {\n      return HasCodeRelocations<Elf64_Dyn>(*phdr_it);\n    }\n  }\n\n  template<typename Elf_Dyn>\n  bool HasCodeRelocations(const Elf64_Phdr& phdr) const {\n    const size_t EntryCount = phdr.p_filesz / sizeof(Elf_Dyn);\n    fextl::vector<Elf_Dyn> Entries(EntryCount);\n\n    if (pread(fd, Entries.data(), phdr.p_filesz, phdr.p_offset) == -1) {\n      return false;\n    }\n\n    for (auto& Entry : Entries) {\n      if (Entry.d_tag == DT_NULL) {\n        break;\n      }\n      if (Entry.d_tag == DT_TEXTREL) {\n        return true;\n      }\n      if (Entry.d_tag == DT_FLAGS && (Entry.d_un.d_val & DF_TEXTREL)) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * Parses relocation sections (SHT_REL/SHT_RELA) and returns a map of\n   * offsets to relocations that FEX's JIT must know about.\n   */\n  fextl::robin_map<uint32_t, FEXCore::GuestRelocationType> PopulateRelocations() {\n    if (fd == -1 || !EnsureSectionHeadersLoaded()) {\n      return {};\n    }\n\n    fextl::robin_map<uint32_t, FEXCore::GuestRelocationType> Relocations;\n    bool Is32Bit = (type == ::ELFLoader::ELFContainer::TYPE_X86_32);\n\n    for (const auto& shdr : *shdrs) {\n      if (shdr.sh_entsize == 0) {\n        continue;\n      }\n\n      const size_t EntryCount = shdr.sh_size / shdr.sh_entsize;\n\n      if (!Is32Bit) {\n        if (shdr.sh_type == SHT_REL) {\n          LOGMAN_THROW_A_FMT(false, \"Unexpected relocation section type\");\n        } else if (shdr.sh_type == SHT_RELA) {\n          fextl::vector<Elf64_Rela> Entries(EntryCount);\n          if (pread(fd, Entries.data(), shdr.sh_size, shdr.sh_offset) == -1) {\n            LOGMAN_THROW_A_FMT(false, \"Failed to read RELA section\");\n          }\n          for (auto& Entry : Entries) {\n            auto RelocType = ClassifyRelocation64(ELF64_R_TYPE(Entry.r_info));\n            if (RelocType) {\n              Relocations.emplace(static_cast<uint32_t>(Entry.r_offset), *RelocType);\n            }\n          }\n        }\n      } else {\n        if (shdr.sh_type == SHT_REL) {\n          fextl::vector<Elf32_Rel> Entries(EntryCount);\n          if (pread(fd, Entries.data(), shdr.sh_size, shdr.sh_offset) == -1) {\n            LOGMAN_THROW_A_FMT(false, \"Failed to read REL section\");\n          }\n          for (auto& Entry : Entries) {\n            auto RelocType = ClassifyRelocation32(ELF32_R_TYPE(Entry.r_info));\n            if (RelocType) {\n              Relocations.emplace(static_cast<uint32_t>(Entry.r_offset), *RelocType);\n            }\n          }\n        } else if (shdr.sh_type == SHT_RELA) {\n          fextl::vector<Elf32_Rela> Entries(EntryCount);\n          if (pread(fd, Entries.data(), shdr.sh_size, shdr.sh_offset) == -1) {\n            LOGMAN_THROW_A_FMT(false, \"Failed to read RELA section\");\n          }\n          for (auto& Entry : Entries) {\n            auto RelocType = ClassifyRelocation32(ELF32_R_TYPE(Entry.r_info));\n            if (RelocType) {\n              Relocations.emplace(static_cast<uint32_t>(Entry.r_offset), *RelocType);\n            }\n          }\n        }\n      }\n    }\n\n    return Relocations;\n  }\n\n  /**\n   * Returns underlying 32-bit relocation entries.\n   * SHT_REL entries are implicitly converted to Elf32_Rela.\n   */\n  fextl::vector<Elf32_Rela> ReadRawRelocations32() {\n    if (fd == -1 || type != ::ELFLoader::ELFContainer::TYPE_X86_32 || !EnsureSectionHeadersLoaded()) {\n      return {};\n    }\n\n    // Load dynamic symbol table (find SHT_DYNSYM section)\n    fextl::vector<Elf32_Sym> DynSyms;\n    auto DynsymHeader = std::ranges::find_if(*shdrs, [](auto& shdr) { return shdr.sh_type == SHT_DYNSYM; });\n    if (DynsymHeader != shdrs->end()) {\n      size_t SymCount = DynsymHeader->sh_size / sizeof(Elf32_Sym);\n      DynSyms.resize(SymCount);\n      if (pread(fd, DynSyms.data(), DynsymHeader->sh_size, DynsymHeader->sh_offset) == -1) {\n        LOGMAN_MSG_A_FMT(\"Could not load DYNSYM section\");\n      }\n    }\n\n    fextl::vector<Elf32_Rela> Result;\n    for (const auto& shdr : *shdrs) {\n      if (shdr.sh_entsize == 0) {\n        continue;\n      }\n\n      const size_t EntryCount = shdr.sh_size / shdr.sh_entsize;\n\n      if (shdr.sh_type == SHT_REL) {\n        fextl::vector<Elf32_Rel> Entries(EntryCount);\n        if (pread(fd, Entries.data(), shdr.sh_size, shdr.sh_offset) == -1) {\n          LOGMAN_MSG_A_FMT(\"Could not load REL section\");\n        }\n        for (auto& Entry : Entries) {\n          auto Sym = ELF32_R_SYM(Entry.r_info);\n          int32_t Addend = (Sym < DynSyms.size()) ? static_cast<int32_t>(DynSyms[Sym].st_value) : 0;\n          Result.push_back(Elf32_Rela {Entry.r_offset, Entry.r_info, Addend});\n        }\n      } else if (shdr.sh_type == SHT_RELA) {\n        fextl::vector<Elf32_Rela> Entries(EntryCount);\n        if (pread(fd, Entries.data(), shdr.sh_size, shdr.sh_offset) == -1) {\n          LOGMAN_MSG_A_FMT(\"Could not load RELA section\");\n        }\n        Result.insert(Result.end(), Entries.begin(), Entries.end());\n      }\n    }\n\n    return Result;\n  }\n\n  void Closefd() {\n    if (fd != -1) {\n      close(fd);\n      fd = -1;\n    }\n  }\n\n  ~ELFParser() {\n    Closefd();\n  }\n\nprivate:\n  /// Returns true if loading section headers succeeded\n  bool EnsureSectionHeadersLoaded() {\n    if (shdrs.has_value()) {\n      return !shdrs->empty();\n    }\n\n    if (fd == -1 || ehdr.e_shoff == 0 || ehdr.e_shnum == 0) {\n      shdrs.emplace();\n      return false;\n    }\n\n    if (type == ::ELFLoader::ELFContainer::TYPE_X86_64) {\n      shdrs.emplace(ehdr.e_shnum);\n      if (pread(fd, shdrs->data(), sizeof(Elf64_Shdr) * ehdr.e_shnum, ehdr.e_shoff) == -1) {\n        shdrs->clear();\n        return false;\n      }\n    } else {\n      fextl::vector<Elf32_Shdr> shdrs32(ehdr.e_shnum);\n      if (pread(fd, shdrs32.data(), sizeof(Elf32_Shdr) * ehdr.e_shnum, ehdr.e_shoff) == -1) {\n        shdrs.emplace();\n        return false;\n      }\n\n      shdrs.emplace(ehdr.e_shnum);\n      for (int i = 0; i < ehdr.e_shnum; i++) {\n#define COPY(name) (*shdrs)[i].name = shdrs32[i].name\n        COPY(sh_name);\n        COPY(sh_type);\n        COPY(sh_flags);\n        COPY(sh_addr);\n        COPY(sh_offset);\n        COPY(sh_size);\n        COPY(sh_link);\n        COPY(sh_info);\n        COPY(sh_addralign);\n        COPY(sh_entsize);\n#undef COPY\n      }\n    }\n\n    return !shdrs->empty();\n  }\n\n  static std::optional<FEXCore::GuestRelocationType> ClassifyRelocation32(uint32_t Type) {\n    if (Type == R_386_RELATIVE || Type == R_386_32) {\n      return FEXCore::GuestRelocationType::Rel32;\n    } else if (Type == R_386_PC32) {\n      // Currently not handled\n      return FEXCore::GuestRelocationType::Skip;\n    } else if (Type == R_386_TLS_TPOFF) {\n      // Currently not handled\n      return FEXCore::GuestRelocationType::Skip;\n    }\n    return std::nullopt;\n  }\n\n  static std::optional<FEXCore::GuestRelocationType> ClassifyRelocation64(uint32_t Type) {\n    if (Type == R_X86_64_RELATIVE || Type == R_X86_64_64) {\n      return FEXCore::GuestRelocationType::Rel64;\n    } else if (Type == R_X86_64_32) {\n      return FEXCore::GuestRelocationType::Rel32;\n    }\n    return std::nullopt;\n  }\n};\n"
  },
  {
    "path": "Source/Tools/CommonTools/PortabilityInfo.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include \"Common/Config.h\"\n\nnamespace FEX {\nstatic inline std::optional<fextl::string> GetSelfPath() {\n  // Read the FEX path from `/proc/self/exe` which is always a symlink to the absolute path of the executable running.\n  // This way we can get the parent path that the application is executing from.\n  char SelfPath[PATH_MAX];\n  auto Result = readlink(\"/proc/self/exe\", SelfPath, PATH_MAX);\n  if (Result == -1) {\n    return std::nullopt;\n  }\n\n  std::string_view SelfPathView {SelfPath, std::min<size_t>(PATH_MAX, Result)};\n  return fextl::string {SelfPathView.substr(0, SelfPathView.find_last_of('/') + 1)};\n}\n\nstatic inline FEX::Config::PortableInformation ReadPortabilityInformation() {\n  const char* PortableConfig = getenv(\"FEX_PORTABLE\");\n  if (!PortableConfig) {\n    return {false, {}};\n  }\n\n  uint32_t Value {};\n  std::string_view PortableView {PortableConfig};\n\n  if (std::from_chars(PortableView.data(), PortableView.data() + PortableView.size(), Value).ec != std::errc {} || Value == 0) {\n    return {false, {}};\n  }\n\n  auto SelfPath = GetSelfPath();\n  if (!SelfPath) {\n    return {false, {}};\n  }\n\n  // Extract the absolute path from the FEX path\n  return {true, *SelfPath};\n}\n} // namespace FEX\n"
  },
  {
    "path": "Source/Tools/FEXBash/CMakeLists.txt",
    "content": "add_executable(FEXBash FEXBash.cpp)\n\ntarget_link_libraries(FEXBash PRIVATE FEXCore Common JemallocLibs)\n\nLinkerGC(FEXBash)\n\ninstall(TARGETS FEXBash RUNTIME\n  DESTINATION bin\n  COMPONENT Runtime)\n"
  },
  {
    "path": "Source/Tools/FEXBash/FEXBash.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: Bin|FEXBash\ndesc: Launches bash under FEX and passes arguments via -c to it\n$end_info$\n*/\n\n#include <FEXCore/fextl/fmt.h>\n\n#include <filesystem>\n#include <string>\n#include <unistd.h>\n#include <vector>\n\nint main(int argc, char** argv, char** const envp) {\n  // Skip argv[0].\n  const int ArgCount = argc - 1;\n  const bool EmptyArgs = ArgCount == 0;\n\n  std::vector<const char*> Argv;\n  // FEX will handle finding bash in the rootfs\n  // Use /bin/sh for -c commands and /bin/bash for interactive mode\n  const char* BashPath = EmptyArgs ? \"/bin/bash\" : \"/bin/sh\";\n\n  std::string FEXPath = std::filesystem::path(argv[0]).parent_path().string() + \"/FEX\";\n\n  // Check if a local FEX to FEXBash exists\n  // If it does then it takes priority over the installed one\n  if (!std::filesystem::exists(FEXPath)) {\n    char FEXBashPath[PATH_MAX];\n    auto Result = readlink(\"/proc/self/exe\", FEXBashPath, PATH_MAX);\n    if (Result != -1) {\n      FEXPath = std::filesystem::path(&FEXBashPath[0], &FEXBashPath[Result]).parent_path().string() + \"/FEX\";\n    }\n\n    if (!std::filesystem::exists(FEXPath)) {\n      fmt::print(stderr, \"Could not locate FEX executable\\n\");\n      std::abort();\n    }\n  }\n  const char* FEXArgs[] = {\n    FEXPath.c_str(),\n    BashPath,\n    \"-c\",\n  };\n\n  // Remove -c argument if arguments are empty\n  // Lets us start an emulated bash instance\n  const size_t FEXArgsCount = std::size(FEXArgs) - (EmptyArgs ? 1 : 0);\n\n  Argv.resize(ArgCount + FEXArgsCount);\n\n  // Pass in the FEX arguments\n  for (size_t i = 0; i < FEXArgsCount; ++i) {\n    Argv[i] = FEXArgs[i];\n  }\n\n  // Bring in passed in arguments\n  for (size_t i = 0; i < ArgCount; ++i) {\n    Argv[i + FEXArgsCount] = argv[i + 1];\n  }\n\n  // Set --norc when no arguments are passed so PS1 doesn't get overwritten\n  const char* NoRC = \"--norc\";\n  if (EmptyArgs) {\n    Argv.emplace_back(NoRC);\n  }\n\n  Argv.emplace_back(nullptr);\n\n  // Prepend `FEXBash>` to PS1 to be less confusing about running under emulation\n  // In most cases PS1 isn't an environment variable, but instead a shell variable\n  // But in case the user has set the PS1 environment variable then still prepend\n  //\n  // To get the shell variables as an environment variable then you can do `PS1=$PS1 FEXBash`\n  std::vector<const char*> Envp {};\n  char* PS1Env {};\n  for (unsigned i = 0;; ++i) {\n    if (envp[i] == nullptr) {\n      break;\n    }\n    if (strstr(envp[i], \"PS1=\") == envp[i]) {\n      PS1Env = envp[i];\n    } else {\n      Envp.emplace_back(envp[i]);\n    }\n  }\n\n  std::string PS1 = \"PS1=FEXBash-\\\\u@\\\\h:\\\\w> \";\n  if (PS1Env) {\n    PS1 += &PS1Env[strlen(\"PS1=\")];\n  }\n  Envp.emplace_back(PS1.c_str());\n  Envp.emplace_back(nullptr);\n\n  return execve(Argv[0], const_cast<char* const*>(Argv.data()), const_cast<char* const*>(&Envp[0]));\n}\n"
  },
  {
    "path": "Source/Tools/FEXConfig/CMakeLists.txt",
    "content": "set(CMAKE_AUTOMOC ON)\n\nadd_executable(FEXConfig)\ntarget_sources(FEXConfig PRIVATE Main.cpp Main.h)\n\ntarget_link_libraries(FEXConfig PRIVATE Common JemallocDummy)\nif (Qt6_FOUND)\n  qt_add_resources(QT_RESOURCES qml6.qrc)\n  target_link_libraries(FEXConfig PRIVATE Qt6::Qml Qt6::Quick Qt6::Widgets)\nelse()\n  qt_add_resources(QT_RESOURCES qml5.qrc)\n  target_link_libraries(FEXConfig PRIVATE Qt5::Qml Qt5::Quick Qt5::Widgets)\nendif()\ntarget_sources(FEXConfig PRIVATE ${QT_RESOURCES})\n\nLinkerGC(FEXConfig)\n\ninstall(TARGETS FEXConfig RUNTIME\n  DESTINATION bin\n  COMPONENT Runtime)\n"
  },
  {
    "path": "Source/Tools/FEXConfig/Main.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Main.h\"\n\n#include <Common/Async.h>\n#include <Common/Config.h>\n#include <Common/FileFormatCheck.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/unordered_map.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXCore/Config/Config.h>\n#include <FEXHeaderUtils/Filesystem.h>\n\n#include <QApplication>\n#include <QMessageBox>\n#include <QQmlApplicationEngine>\n#include <QQuickWindow>\n\n#include <sys/inotify.h>\n#include <poll.h>\n\n#include <charconv>\n#include <cstdlib>\n#include <filesystem>\n#include <stdexcept>\n#include <thread>\n#include <utility>\n\nnamespace fextl {\n// Helper to convert a std::filesystem::path to a fextl::string.\ninline fextl::string string_from_path(const std::filesystem::path& Path) {\n  return Path.string().c_str();\n}\n} // namespace fextl\n\nstatic fextl::unique_ptr<FEXCore::Config::Layer> LoadedConfig {};\nstatic fextl::map<FEXCore::Config::ConfigOption, std::pair<std::string, std::string_view>> ConfigToNameLookup;\nstatic fextl::map<std::string, FEXCore::Config::ConfigOption> NameToConfigLookup;\n\n#include \"Common/JSONPool.h\"\n#include <FEXCore/Utils/FileLoading.h>\n\nstatic void LoadThunkDatabase(fextl::unordered_map<fextl::string, bool>& HostLibsDB, bool Global) {\n  auto ThunkDBPath = FEXCore::Config::GetConfigDirectory(Global) + \"ThunksDB.json\";\n  fextl::vector<char> FileData;\n  if (!FEXCore::FileLoading::LoadFile(FileData, ThunkDBPath)) {\n    return;\n  }\n\n  FEX::JSON::JsonAllocator Pool {};\n  const json_t* json = FEX::JSON::CreateJSON(FileData, Pool);\n  if (!json) {\n    ERROR_AND_DIE_FMT(\"Failed to parse JSON from ThunkDB file '{}' - invalid JSON format\", ThunkDBPath);\n  }\n\n  const json_t* DB = json_getProperty(json, \"DB\");\n  if (!DB || JSON_OBJ != json_getType(DB)) {\n    return;\n  }\n\n  for (const json_t* Library = json_getChild(DB); Library != nullptr; Library = json_getSibling(Library)) {\n    HostLibsDB[json_getName(Library)] = false;\n  }\n}\n\nConfigModel::ConfigModel() {\n  setItemRoleNames(QHash<int, QByteArray> {{Qt::DisplayRole, \"display\"}, {Qt::UserRole + 1, \"optionType\"}, {Qt::UserRole + 2, \"optionValue\"}});\n  Reload();\n}\n\nvoid ConfigModel::Reload() {\n  const auto& Options = LoadedConfig->GetOptionMap();\n\n  beginResetModel();\n  removeRows(0, rowCount());\n  for (auto& Option : Options) {\n    if (!LoadedConfig->OptionExists(Option.first)) {\n      continue;\n    }\n    if (std::holds_alternative<fextl::list<fextl::string>>(Option.second)) {\n      // Omit string lists from the model since they require special handling\n      continue;\n    }\n\n    auto& [Name, TypeId] = ConfigToNameLookup.find(Option.first)->second;\n    auto Item = new QStandardItem(QString::fromStdString(Name));\n\n    const char* OptionType = TypeId.data();\n    Item->setData(OptionType, Qt::UserRole + 1);\n    Item->setData(QString::fromStdString(std::get<fextl::string>(Option.second).c_str()), Qt::UserRole + 2);\n    appendRow(Item);\n  }\n  endResetModel();\n}\n\nbool ConfigModel::has(const QString& Name, bool) const {\n  return LoadedConfig->OptionExists(NameToConfigLookup.at(Name.toStdString()));\n}\n\nvoid ConfigModel::erase(const QString& Name) {\n  assert(has(Name, false));\n  LoadedConfig->Erase(NameToConfigLookup.at(Name.toStdString()));\n  Reload();\n}\n\nbool ConfigModel::getBool(const QString& Name, bool) const {\n  auto ret = LoadedConfig->Get(NameToConfigLookup.at(Name.toStdString()));\n  if (!ret || !*ret) {\n    throw std::runtime_error(\"Could not find setting\");\n  }\n  return **ret == \"1\";\n}\n\nvoid ConfigModel::setBool(const QString& Name, bool Value) {\n  LoadedConfig->Set(NameToConfigLookup.at(Name.toStdString()), Value ? \"1\" : \"0\");\n  Reload();\n}\n\nvoid ConfigModel::setString(const QString& Name, const QString& Value) {\n  LoadedConfig->Set(NameToConfigLookup.at(Name.toStdString()), Value.toStdString());\n  Reload();\n}\n\nvoid ConfigModel::setStringList(const QString& Name, const QStringList& Values) {\n  const auto& Option = NameToConfigLookup.at(Name.toStdString());\n  LoadedConfig->Erase(Option);\n  for (auto& Value : Values) {\n    LoadedConfig->AppendStrArrayValue(Option, Value.toStdString().c_str());\n  }\n  Reload();\n}\n\nvoid ConfigModel::setInt(const QString& Name, int Value) {\n  LoadedConfig->Set(NameToConfigLookup.at(Name.toStdString()), std::to_string(Value));\n  Reload();\n}\n\nQString ConfigModel::getString(const QString& Name, bool) const {\n  auto ret = LoadedConfig->Get(NameToConfigLookup.at(Name.toStdString()));\n  if (!ret || !*ret) {\n    throw std::runtime_error(\"Could not find setting\");\n  }\n  return QString::fromUtf8((*ret)->c_str());\n}\n\nQStringList ConfigModel::getStringList(const QString& Name, bool) const {\n  auto Values = LoadedConfig->All(NameToConfigLookup.at(Name.toStdString()));\n  if (!Values || !*Values) {\n    return {};\n  }\n  QStringList Ret;\n  for (auto& Value : **Values) {\n    Ret.append(Value.c_str());\n  }\n  return Ret;\n}\n\nint ConfigModel::getInt(const QString& Name, bool) const {\n  auto ret = LoadedConfig->Get(NameToConfigLookup.at(Name.toStdString()));\n  if (!ret || !*ret) {\n    throw std::runtime_error(\"Could not find setting\");\n  }\n  int value;\n  auto res = std::from_chars(&*(*ret)->begin(), &*(*ret)->end(), value);\n  if (res.ptr != &*(*ret)->end()) {\n    throw std::runtime_error(\"Could not parse integer\");\n  }\n  return value;\n}\n\nstatic void LoadDefaultSettings() {\n  LoadedConfig = fextl::make_unique<FEX::Config::EmptyMapper>();\n#define OPT_BASE(type, group, enum, json, default) LoadedConfig->Set(FEXCore::Config::ConfigOption::CONFIG_##enum, std::to_string(default));\n#define OPT_STR(group, enum, json, default) LoadedConfig->Set(FEXCore::Config::ConfigOption::CONFIG_##enum, default);\n#define OPT_STRARRAY(group, enum, json, default) // Do nothing\n#define OPT_STRENUM(group, enum, json, default) \\\n  LoadedConfig->Set(FEXCore::Config::ConfigOption::CONFIG_##enum, std::to_string(FEXCore::ToUnderlying(default)));\n#include <FEXCore/Config/ConfigValues.inl>\n\n  // Erase unnamed options which shouldn't be set\n  LoadedConfig->Erase(FEXCore::Config::ConfigOption::CONFIG_INTERPRETER_INSTALLED);\n  LoadedConfig->Erase(FEXCore::Config::ConfigOption::CONFIG_APP_FILENAME);\n  LoadedConfig->Erase(FEXCore::Config::ConfigOption::CONFIG_APP_CONFIG_NAME);\n  LoadedConfig->Erase(FEXCore::Config::ConfigOption::CONFIG_IS64BIT_MODE);\n}\n\nstatic void ConfigInit(fextl::string ConfigFilename) {\n#define OPT_BASE(type, group, enum, json, default)                                 \\\n  ConfigToNameLookup[FEXCore::Config::ConfigOption::CONFIG_##enum].first = #json;  \\\n  ConfigToNameLookup[FEXCore::Config::ConfigOption::CONFIG_##enum].second = #type; \\\n  NameToConfigLookup[#json] = FEXCore::Config::ConfigOption::CONFIG_##enum;\n#include <FEXCore/Config/ConfigValues.inl>\n#undef OPT_BASE\n\n  // Ensure config and RootFS directories exist\n  std::error_code ec {};\n  std::filesystem::path Dirs[] = {std::filesystem::absolute(ConfigFilename).parent_path(),\n                                  std::filesystem::absolute(FEXCore::Config::GetDataDirectory()) / \"RootFS/\"};\n  for (auto& Dir : Dirs) {\n    bool created = std::filesystem::create_directories(Dir, ec);\n    if (created) {\n      qInfo() << \"Created folder\" << Dir.c_str();\n    }\n    if (ec) {\n      QMessageBox err(QMessageBox::Critical, \"Failed to create directory\", QString(\"Failed to create \\\"%1\\\" folder\").arg(Dir.c_str()),\n                      QMessageBox::Ok);\n      err.exec();\n      std::exit(EXIT_FAILURE);\n      return;\n    }\n  }\n}\n\nHostLibsModel::HostLibsModel() {\n  // Load list of available libraries\n  LoadThunkDatabase(HostLibsDB, true);\n  LoadThunkDatabase(HostLibsDB, false);\n}\n\nvoid HostLibsModel::Reload(const fextl::string& Path) {\n  for (auto& [_, Enabled] : HostLibsDB) {\n    Enabled = false;\n  }\n\n  {\n    fextl::vector<char> FileData;\n    if (!FEXCore::FileLoading::LoadFile(FileData, Path)) {\n      goto RenderItems;\n    }\n\n    FEX::JSON::JsonAllocator Pool {};\n    const json_t* json = FEX::JSON::CreateJSON(FileData, Pool);\n    if (!json) {\n      goto RenderItems;\n    }\n\n    const json_t* ThunksDB = json_getProperty(json, \"ThunksDB\");\n    if (!ThunksDB) {\n      goto RenderItems;\n    }\n\n    for (const json_t* Item = json_getChild(ThunksDB); Item != nullptr; Item = json_getSibling(Item)) {\n      auto DBObject = HostLibsDB.find(json_getName(Item));\n      if (DBObject != HostLibsDB.end()) {\n        DBObject->second = (json_getInteger(Item) != 0);\n      }\n    }\n  }\n\nRenderItems:\n  beginResetModel();\n  removeRows(0, rowCount());\n  for (auto& [Name, Enabled] : HostLibsDB) {\n    auto Item = new QStandardItem(QString::fromUtf8(Name.c_str()));\n    Item->setData(Enabled, Qt::CheckStateRole);\n    appendRow(Item);\n  }\n  endResetModel();\n}\n\nQHash<int, QByteArray> HostLibsModel::roleNames() const {\n  auto ret = QStandardItemModel::roleNames();\n  ret[Qt::CheckStateRole] = \"checked\";\n  return ret;\n}\n\nbool HostLibsModel::setData(const QModelIndex& index, const QVariant& value, int role) {\n  std::next(HostLibsDB.begin(), index.row())->second = value.toBool();\n  return QStandardItemModel::setData(index, value, role);\n}\n\nRootFSModel::RootFSModel() {\n  auto INotifyFD = inotify_init1(IN_NONBLOCK | IN_CLOEXEC);\n\n  fextl::string RootFS = FEXCore::Config::GetDataDirectory(false) + \"RootFS/\";\n  int LocalFolderWD = inotify_add_watch(INotifyFD, RootFS.c_str(), IN_CREATE | IN_DELETE);\n\n  RootFS = FEXCore::Config::GetDataDirectory(true) + \"RootFS/\";\n  int GlobalFolderWD = inotify_add_watch(INotifyFD, RootFS.c_str(), IN_CREATE | IN_DELETE);\n  if (INotifyFD != -1 && (LocalFolderWD != -1 || GlobalFolderWD != -1)) {\n    INotifyReactor.enable_async_stop();\n    Thread = std::thread {&RootFSModel::INotifyThreadFunc, this, INotifyFD};\n  } else {\n    qWarning() << \"Could not set up inotify. RootFS folder won't be monitored for changes.\";\n  }\n\n  // Load initial data\n  Reload();\n}\n\nRootFSModel::~RootFSModel() {\n  INotifyReactor.stop_async();\n  Thread.join();\n}\n\nvoid RootFSModel::Reload() {\n  beginResetModel();\n  removeRows(0, rowCount());\n\n  std::vector<QString> NamedRootFS {};\n  for (auto Global : {false, true}) {\n    const fextl::string RootFS = FEXCore::Config::GetDataDirectory(Global) + \"RootFS/\";\n\n    std::error_code ec;\n    for (auto& it : std::filesystem::directory_iterator(RootFS, ec)) {\n      std::string Path {};\n      if (Global) {\n        // If global then keep the full path.\n        Path = it.path();\n      } else {\n        // If local then only use the filename.\n        Path = it.path().filename();\n      }\n\n      if (it.is_directory()) {\n        NamedRootFS.push_back(QString::fromStdString(Path));\n      } else if (it.is_regular_file()) {\n        // If it is a regular file then we need to check if it is a valid archive\n        if (it.path().extension() == \".sqsh\" && FEX::FormatCheck::IsSquashFS(fextl::string_from_path(it.path()))) {\n          NamedRootFS.push_back(QString::fromStdString(Path));\n        } else if (it.path().extension() == \".ero\" && FEX::FormatCheck::IsEroFS(fextl::string_from_path(it.path()))) {\n          NamedRootFS.push_back(QString::fromStdString(Path));\n        }\n      }\n    }\n  }\n\n  std::sort(NamedRootFS.begin(), NamedRootFS.end(), [](const QString& a, const QString& b) { return QString::localeAwareCompare(a, b) < 0; });\n  for (auto& Entry : NamedRootFS) {\n    appendRow(new QStandardItem(Entry));\n  }\n\n  endResetModel();\n}\n\nbool RootFSModel::hasItem(const QString& Name) const {\n  return !findItems(Name, Qt::MatchExactly).empty();\n}\n\nQUrl RootFSModel::getBaseUrl() const {\n  return QUrl::fromLocalFile(QString::fromStdString(FEXCore::Config::GetDataDirectory().c_str()) + \"RootFS/\");\n}\n\nvoid RootFSModel::INotifyThreadFunc(int INotifyFD) {\n  fasio::posix_descriptor INotify {INotifyReactor, INotifyFD};\n\n  INotify.async_wait([this, INotifyFD](fasio::error ec) {\n    // Spin through the events, we don't actually care what they are\n    constexpr size_t DATA_SIZE = (16 * (sizeof(struct inotify_event) + NAME_MAX + 1));\n    char buf[DATA_SIZE];\n    while (read(INotifyFD, buf, DATA_SIZE) > 0)\n      ;\n\n    // Queue update to the data model\n    QMetaObject::invokeMethod(this, \"Reload\");\n    return fasio::post_callback::repeat;\n  });\n\n  INotifyReactor.run();\n}\n\n// Returns true on success\nstatic bool OpenFile(fextl::string Filename) {\n  std::error_code ec {};\n  if (!std::filesystem::exists(Filename, ec)) {\n    return false;\n  }\n\n  LoadedConfig = FEX::Config::CreateMainLayer(&Filename);\n  LoadedConfig->Load();\n\n  // Load default options and only overwrite only if the option didn't exist\n#define OPT_BASE(type, group, enum, json, default)                                            \\\n  if (!LoadedConfig->OptionExists(FEXCore::Config::ConfigOption::CONFIG_##enum)) {            \\\n    LoadedConfig->Set(FEXCore::Config::ConfigOption::CONFIG_##enum, std::to_string(default)); \\\n  }\n#define OPT_STR(group, enum, json, default)                                        \\\n  if (!LoadedConfig->OptionExists(FEXCore::Config::ConfigOption::CONFIG_##enum)) { \\\n    LoadedConfig->Set(FEXCore::Config::ConfigOption::CONFIG_##enum, default);      \\\n  }\n#define OPT_STRARRAY(group, enum, json, default) // Do nothing\n#define OPT_STRENUM(group, enum, json, default)                                                                      \\\n  if (!LoadedConfig->OptionExists(FEXCore::Config::ConfigOption::CONFIG_##enum)) {                                   \\\n    LoadedConfig->Set(FEXCore::Config::ConfigOption::CONFIG_##enum, std::to_string(FEXCore::ToUnderlying(default))); \\\n  }\n#include <FEXCore/Config/ConfigValues.inl>\n\n  // Erase unnamed options which shouldn't be set\n  LoadedConfig->Erase(FEXCore::Config::ConfigOption::CONFIG_INTERPRETER_INSTALLED);\n  LoadedConfig->Erase(FEXCore::Config::ConfigOption::CONFIG_APP_FILENAME);\n  LoadedConfig->Erase(FEXCore::Config::ConfigOption::CONFIG_APP_CONFIG_NAME);\n  LoadedConfig->Erase(FEXCore::Config::ConfigOption::CONFIG_IS64BIT_MODE);\n\n  return true;\n}\n\nConfigRuntime::ConfigRuntime(const QString& ConfigFilename) {\n  HostLibs.Reload(ConfigFilename.toStdString().c_str());\n\n  qmlRegisterSingletonInstance<ConfigModel>(\"FEX.ConfigModel\", 1, 0, \"ConfigModel\", &ConfigModelInst);\n  qmlRegisterSingletonInstance<HostLibsModel>(\"FEX.HostLibsModel\", 1, 0, \"HostLibsModel\", &HostLibs);\n  qmlRegisterSingletonInstance<RootFSModel>(\"FEX.RootFSModel\", 1, 0, \"RootFSModel\", &RootFSList);\n  Engine.load(QUrl(\"qrc:/main.qml\"));\n\n  Window = qobject_cast<QQuickWindow*>(Engine.rootObjects().first());\n  if (!ConfigFilename.isEmpty()) {\n    Window->setProperty(\"configFilename\", QUrl::fromLocalFile(ConfigFilename));\n  } else {\n    Window->setProperty(\"configFilename\", QUrl::fromLocalFile(FEXCore::Config::GetConfigFileLocation().c_str()));\n    Window->setProperty(\"configDirty\", true);\n    Window->setProperty(\"loadedDefaults\", true);\n  }\n\n  ConfigRuntime::connect(Window, SIGNAL(selectedConfigFile(const QUrl&)), this, SLOT(onLoad(const QUrl&)));\n  ConfigRuntime::connect(Window, SIGNAL(triggeredSave(const QUrl&)), this, SLOT(onSave(const QUrl&)));\n  ConfigRuntime::connect(&ConfigModelInst, SIGNAL(modelReset()), Window, SLOT(refreshUI()));\n}\n\nvoid ConfigRuntime::onSave(const QUrl& Filename) {\n  // If no RootFS is selected, assume another Config layer is setting it up and drop it from the local configuration\n  auto RootFS = LoadedConfig->Get(FEXCore::Config::ConfigOption::CONFIG_ROOTFS).value_or(nullptr);\n  if (RootFS && RootFS->empty()) {\n    LoadedConfig->Erase(FEXCore::Config::ConfigOption::CONFIG_ROOTFS);\n  }\n\n  qInfo() << \"Saving to\" << Filename.toLocalFile().toStdString().c_str();\n  FEX::Config::SaveLayerToJSON(Filename.toLocalFile().toStdString().c_str(), LoadedConfig.get(), HostLibs.HostLibsDB);\n}\n\nvoid ConfigRuntime::onLoad(const QUrl& Filename) {\n  // TODO: Distinguish between \"load\" and \"overlay\".\n  //       Currently, the new configuration is overlaid on top of the previous one.\n\n  if (!OpenFile(Filename.toLocalFile().toStdString().c_str())) {\n    // This basically never happens because OpenFile performs no actual syntax checks.\n    // Treat as fatal since the UI state wouldn't be consistent after ignoring the error.\n    QMessageBox err(QMessageBox::Critical, tr(\"Could not load config file\"), tr(\"Failed to load \\\"%1\\\"\").arg(Filename.toLocalFile()),\n                    QMessageBox::Ok);\n    err.exec();\n    QApplication::exit();\n    return;\n  }\n\n  ConfigModelInst.Reload();\n  RootFSList.Reload();\n  HostLibs.Reload(Filename.toLocalFile().toStdString().c_str());\n\n  QMetaObject::invokeMethod(Window, \"refreshUI\");\n}\n\nint main(int Argc, char** Argv) {\n  QApplication App(Argc, Argv);\n\n  FEX::Config::InitializeConfigs(FEX::Config::PortableInformation {});\n  fextl::string ConfigFilename = Argc > 1 ? Argv[1] : FEXCore::Config::GetConfigFileLocation();\n  ConfigInit(ConfigFilename);\n\n  qInfo() << \"Opening\" << ConfigFilename.c_str();\n  if (!OpenFile(ConfigFilename)) {\n    // Load defaults if not found\n    ConfigFilename.clear();\n    LoadDefaultSettings();\n  }\n\n  ConfigRuntime Runtime(ConfigFilename.c_str());\n  App.setWindowIcon(QIcon(\":/icon.png\"));\n  return App.exec();\n}\n"
  },
  {
    "path": "Source/Tools/FEXConfig/Main.h",
    "content": "// SPDX-License-Identifier: MIT\n#include <Common/Async.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/unordered_map.h>\n\n#include <QStandardItemModel>\n#include <QQmlApplicationEngine>\n\n#include <thread>\n\nclass QQuickWindow;\n\nclass ConfigModel : public QStandardItemModel {\n  Q_OBJECT\n  QML_ELEMENT\n  QML_SINGLETON\n\npublic:\n  ConfigModel();\n\n  void Reload();\n\npublic slots:\n  bool has(const QString&, bool unused) const;\n  void erase(const QString&);\n\n  bool getBool(const QString&, bool unused) const;\n  QString getString(const QString&, bool unused) const;\n  QStringList getStringList(const QString&, bool unused) const;\n  int getInt(const QString&, bool unused) const;\n\n  void setBool(const QString&, bool);\n  void setString(const QString&, const QString&);\n  void setStringList(const QString&, const QStringList&);\n  void setInt(const QString&, int value);\n};\n\nclass HostLibsModel : public QStandardItemModel {\n  Q_OBJECT\n  QML_ELEMENT\n  QML_SINGLETON\n\npublic:\n  fextl::unordered_map<fextl::string, bool> HostLibsDB;\n\n  HostLibsModel();\n\n  QHash<int, QByteArray> roleNames() const override;\n\n  bool setData(const QModelIndex&, const QVariant&, int role) override;\n\n  void Reload(const fextl::string& Filename);\n};\n\nclass RootFSModel : public QStandardItemModel {\n  Q_OBJECT\n  QML_ELEMENT\n  QML_SINGLETON\n\n  std::thread Thread;\n  fasio::poll_reactor INotifyReactor;\n\n  void INotifyThreadFunc(int INotifyFD);\n\npublic:\n  RootFSModel();\n  ~RootFSModel();\n\npublic slots:\n  void Reload();\n\n  bool hasItem(const QString&) const;\n\n  QUrl getBaseUrl() const;\n};\n\nclass ConfigRuntime : public QObject {\n  Q_OBJECT\n\n  QQmlApplicationEngine Engine;\n  QQuickWindow* Window = nullptr;\n  RootFSModel RootFSList;\n  ConfigModel ConfigModelInst;\n  HostLibsModel HostLibs;\n\npublic:\n  ConfigRuntime(const QString& ConfigFilename);\n\npublic slots:\n  void onSave(const QUrl&);\n  void onLoad(const QUrl&);\n};\n"
  },
  {
    "path": "Source/Tools/FEXConfig/main.qml",
    "content": "// SPDX-License-Identifier: MIT\nimport QtQuick 2.15\nimport QtQuick.Controls 2.15\nimport QtQuick.Layouts 1.15\n\nimport FEX.ConfigModel 1.0\nimport FEX.HostLibsModel 1.0\nimport FEX.RootFSModel 1.0\n\n// Qt 6 changed the API of the Dialogs module slightly.\n// The differences are abstracted away in this import:\nimport \"qrc:/dialogs\"\n\nApplicationWindow {\n    id: root\n\n    visible: true\n    width: 540\n    height: 585\n    minimumWidth: 500\n    minimumHeight: 450\n    title: configDirty ? qsTr(\"FEX configuration *\") : qsTr(\"FEX configuration\")\n\n    property url configFilename\n\n    property bool configDirty: false\n    property bool loadedDefaults: false\n    property bool closeConfirmed: false\n\n    signal selectedConfigFile(name: url)\n    signal triggeredSave(name: url)\n\n    // Property used to force reloading any elements that read ConfigModel\n    property bool refreshCache: false\n\n    onConfigDirtyChanged: {\n        if (!configDirty) {\n            // We either just saved or loaded a file\n            loadedDefaults = false\n        }\n    }\n\n    function refreshUI() {\n        refreshCache = !refreshCache\n    }\n\n    function urlToLocalFile(theurl: url): string {\n        var str = theurl.toString()\n        if (str.startsWith(\"file://\")) {\n            return decodeURIComponent(str.substring(7))\n        }\n        if (str.startsWith(\"file:\")) {\n            return decodeURIComponent(str.substring(5))\n        }\n\n        return str;\n    }\n\n    FileDialog {\n        id: openFileDialog\n        property bool isSaving: false\n\n        title: isSaving ? qsTr(\"Save FEX configuration\") : qsTr(\"Open FEX configuration\")\n        nameFilters: [ qsTr(\"Config files(*.json)\"), qsTr(\"All files(*)\") ]\n\n        selectExisting: !isSaving\n\n        property var onNextAccept: null\n\n        // Prompts the user for an existing file and calls the callback on completion\n        function loadAndThen(callback) {\n            isSaving = false\n            console.assert(!onNextAccept, \"Tried to open dialog multiple times\")\n            onNextAccept = callback\n            open()\n        }\n\n        // Prompts the user for a new or existing file and calls the callback on completion\n        function saveAndThen(callback) {\n            isSaving = true\n            console.assert(!onNextAccept, \"Tried to open dialog multiple times\")\n            onNextAccept = callback\n            open()\n        }\n\n        onAccepted: {\n            if (!isSaving) {\n                root.selectedConfigFile(selectedFile)\n            }\n            configFilename = selectedFile\n            configDirty = false\n            if (onNextAccept) {\n                onNextAccept()\n                onNextAccept = null\n            }\n        }\n\n        onRejected: onNextAccept = null\n    }\n\n    MessageDialog {\n        id: confirmCloseDialog\n        title: qsTr(\"Save changes\")\n        text: configFilename.toString() === \"\" ? qsTr(\"Save changes before quitting?\") : qsTr(\"Save changes to %1 before quitting?\").arg(urlToLocalFile(configFilename))\n        buttons: buttonSave | buttonDiscard | buttonCancel\n\n        onButtonClicked: (button) => {\n            switch (button) {\n            case buttonSave:\n                if (configFilename.toString() === \"\") {\n                    // Filename not yet set => trigger \"Save As\" dialog\n                    openFileDialog.saveAndThen(() => {\n                        save(configFilename)\n                        root.close()\n                    });\n                    return\n                }\n                save(configFilename)\n                root.close()\n                break\n\n            case buttonDiscard:\n                closeConfirmed = true\n                root.close()\n                break\n            }\n        }\n    }\n\n    onClosing: (close) => {\n        if (configDirty) {\n            close.accepted = closeConfirmed\n            onTriggered: confirmCloseDialog.open()\n        }\n    }\n\n    function save(filename: url) {\n        if (filename.toString() === \"\") {\n            filename = configFilename\n        }\n\n        if (filename.toString() === \"\") {\n            // Filename not yet set => trigger \"Save As\" dialog\n            openFileDialog.saveAndThen(() => {\n                save(configFilename)\n            });\n            return\n        }\n\n        triggeredSave(filename)\n        configDirty = false\n    }\n\n    menuBar: MenuBar {\n        Menu {\n            title: qsTr(\"&File\")\n            Action {\n                text: qsTr(\"&Open...\")\n                shortcut: StandardKey.Open\n                // TODO: Ask to discard pending changes first\n                onTriggered: openFileDialog.loadAndThen(() => {})\n            }\n            Action {\n                text: qsTr(\"&Save\")\n                shortcut: StandardKey.Save\n                onTriggered: root.save(\"\")\n            }\n            Action {\n                text: qsTr(\"Save &as...\")\n                shortcut: StandardKey.SaveAs\n                onTriggered: {\n                    openFileDialog.saveAndThen(() => {\n                        root.save(configFilename)\n                    });\n                }\n            }\n            MenuSeparator {}\n            Action {\n                text: qsTr(\"&Quit\")\n                shortcut: StandardKey.Quit\n                onTriggered: close()\n            }\n        }\n    }\n\n    header: TabBar {\n        id: tabBar\n        currentIndex: 0\n\n        readonly property int advancedIndex: 4\n\n        TabButton {\n            text: qsTr(\"General\")\n        }\n        TabButton {\n            text: qsTr(\"Emulation\")\n        }\n        TabButton {\n            text: qsTr(\"CPU\")\n        }\n        TabButton {\n            text: qsTr(\"Libraries\")\n        }\n        TabButton {\n            text: qsTr(\"Advanced\")\n        }\n    }\n\n    component ConfigCheckBox: CheckBox {\n        property string config\n        property string tooltip\n        property bool invert: false\n\n        ToolTip.visible: (visualFocus || hovered) && tooltip !== \"\"\n        ToolTip.text: tooltip\n\n        onToggled: {\n            configDirty = true\n            ConfigModel.setBool(config, checked ^ invert)\n        }\n\n        checkState: config === \"\" ? Qt.PartiallyChecked\n                    : !ConfigModel.has(config, refreshCache) ? Qt.PartiallyChecked\n                    : (ConfigModel.getBool(config, refreshCache) ^ invert) ? Qt.Checked\n                    : Qt.Unchecked\n    }\n\n    component ConfigSpinBox: SpinBox {\n        property string config\n\n        editable: true\n\n        textFromValue: (val) => {\n            if (valueFromConfig === \"\") {\n                return qsTr(\"(not set)\");\n            }\n\n            return val.toString()\n        }\n\n        onValueModified: {\n            configDirty = true\n            ConfigModel.setInt(config, value)\n        }\n\n        property string valueFromConfig: config === \"\" ? 0 : ConfigModel.has(config, refreshCache) ? ConfigModel.getInt(config, refreshCache).toString() : \"\"\n\n        value: valueFromConfig\n        from: 0\n        to: 1 << 30\n    }\n\n    component ConfigTextField: TextField {\n        property string config\n        property bool hasData: config !== \"\" && ConfigModel.has(config, refreshCache)\n        text: hasData ? ConfigModel.getString(config, refreshCache) : \"(none set)\"\n        enabled: hasData\n\n        onTextEdited: {\n            configDirty = true\n            ConfigModel.setString(config, text)\n        }\n    }\n\n    component ConfigTextFieldForPath: RowLayout {\n        property string text\n        property string config\n\n        property var dialog: FileDialog {}\n\n        FileDialog { id: fileSelectorDialog }\n\n        Label { text: parent.text }\n        ConfigTextField {\n            Layout.fillWidth: true\n            config: parent.config\n            readOnly: true\n        }\n\n        Button {\n            icon.name: \"search\"\n            onClicked: dialog.open()\n        }\n\n        Component.onCompleted: {\n            dialog.accepted.connect(() => {\n                var selectedPath = (dialog instanceof FileDialog ? dialog.selectedFile : dialog.selectedFolder)\n\n                configDirty = true\n                ConfigModel.setString(config, urlToLocalFile(selectedPath))\n            })\n        }\n    }\n\n    StackLayout {\n        anchors.fill: parent\n\n        currentIndex: tabBar.currentIndex\n\n        component ScrollablePage: ScrollView {\n            id: outer\n\n            readonly property var visibleScrollbarWidth: ScrollBar.vertical.visible ? ScrollBar.vertical.width : 0\n\n            // Children given by the user will be moved into the inner Column\n            default property alias content: inner.children\n\n            property alias itemSpacing: inner.spacing\n\n            Column {\n                id: inner\n\n                spacing: 8\n                padding: 8\n\n                // This must be explicitly set via the id, since parent doesn't seem to be recognized within Column\n                width: outer.width - outer.visibleScrollbarWidth\n            }\n        }\n\n        // Environment settings\n        ScrollablePage {\n            GroupBox {\n                id: rootfsGroupBox\n                title: qsTr(\"RootFS:\")\n                width: parent.width - parent.padding * 2\n\n                ColumnLayout {\n                    width: rootfsGroupBox.width - rootfsGroupBox.padding * 2\n                    ScrollView {\n                        Layout.fillWidth: true\n                        Layout.maximumHeight: 150\n                        clip: true\n\n                        Column {\n                            id: rootfsList\n\n                            property string selectedItem\n                            property string explicitEntry\n\n                            spacing: 4\n\n                            Component.onCompleted: {\n                                var initState = (ref) => {\n                                    selectedItem = ConfigModel.has(\"RootFS\", ref) ? ConfigModel.getString(\"RootFS\", ref) : \"\"\n\n                                    // RootFSModel only lists entries in the $FEX_HOME/RootFS/ folder.\n                                    // If a custom path is selected, add it as a dedicated entry\n                                    if (selectedItem !== \"\" && !RootFSModel.hasItem(selectedItem)) {\n                                        explicitEntry = selectedItem\n\n                                        // Make visible once needed.\n                                        // Conversely, if the user selects something else after, keep the old option visible to allow easy undoing\n                                        fallbackRootfsEntry.visible = true\n                                    }\n                                }\n\n                                initState(false)\n                                root.refreshCacheChanged.connect(initState)\n                            }\n\n                            function updateRootFS(fileOrFolder: url) {\n                                configDirty = true\n                                var base = urlToLocalFile(RootFSModel.getBaseUrl())\n                                var file = urlToLocalFile(fileOrFolder)\n                                if (file.startsWith(base)) {\n                                    file = file.substring(base.length)\n                                }\n\n                                ConfigModel.setString(\"RootFS\", file)\n                                refreshUI()\n                            }\n\n                            component RootFSRadioDelegate: RadioButton {\n                                property var name\n\n                                text: name\n                                checked: rootfsList.selectedItem === name\n\n                                onToggled: {\n                                    configDirty = true;\n                                    ConfigModel.setString(\"RootFS\", name)\n                                }\n                            }\n\n                            RootFSRadioDelegate {\n                                id: fallbackRootfsEntry\n                                visible: false\n                                name: rootfsList.explicitEntry\n                            }\n                            Repeater {\n                                model: RootFSModel\n                                delegate: RootFSRadioDelegate { name: model.display }\n                            }\n                        }\n                    }\n                    RowLayout {\n                        FileDialog {\n                            id: addRootfsFileDialog\n                            title: qsTr(\"Select RootFS file\")\n                            nameFilters: [ qsTr(\"SquashFS and EroFS (*.sqsh *.ero)\"), qsTr(\"All files(*)\") ]\n                            currentFolder: RootFSModel.getBaseUrl()\n                            onAccepted: rootfsList.updateRootFS(fileUrl)\n                        }\n\n                        FolderDialog {\n                            id: addRootfsFolderDialog\n                            title: qsTr(\"Select RootFS folder\")\n                            currentFolder: RootFSModel.getBaseUrl()\n                            onAccepted: rootfsList.updateRootFS(selectedFolder)\n                        }\n\n                        Button {\n                            text: qsTr(\"Add archive\")\n                            icon.name: \"document-open\"\n                            onClicked: addRootfsFileDialog.open()\n                        }\n                        Button {\n                            text: qsTr(\"Add folder\")\n                            icon.name: \"folder\"\n                            onClicked: addRootfsFolderDialog.open()\n                        }\n                    }\n                }\n            }\n\n            GroupBox {\n                title: qsTr(\"Logging:\")\n                width: parent.width - parent.padding * 2\n\n                label: ConfigCheckBox {\n                    id: loggingEnabledCheckBox\n                    config: \"SilentLog\"\n                    text: qsTr(\"Logging:\")\n                    invert: true\n                }\n\n                ColumnLayout {\n                    enabled: loggingEnabledCheckBox.checked\n\n                    anchors.left: parent ? parent.left : undefined\n                    anchors.right: parent ? parent.right : undefined\n\n                    RowLayout {\n                        Label { text: qsTr(\"Log to:\") }\n\n                        ComboBox {\n                            id: loggingComboBox\n                            property string configValue: ConfigModel.has(\"OutputLog\", refreshCache) ? ConfigModel.getString(\"OutputLog\", refreshCache) : \"\"\n\n                            currentIndex: configValue === \"\" ? -1 : configValue == \"server\" ? 0 : configValue == \"stderr\" ? 1 : 2\n\n                            onActivated: {\n                                configDirty = true\n                                var configNames = [ \"server\", \"stderr\" ]\n                                if (currentIndex != -1 && currentIndex < 2) {\n                                    ConfigModel.setString(\"OutputLog\", configNames[currentIndex])\n                                } else {\n                                    // Set by text field below\n                                }\n                            }\n\n                            model: ListModel {\n                                ListElement { text: \"FEXServer\" }\n                                ListElement { text: \"stderr\" }\n                                ListElement { text: qsTr(\"File...\") }\n                            }\n                        }\n\n                        ConfigTextFieldForPath {\n                            visible: loggingComboBox.currentIndex === 2\n                            config: \"OutputLog\"\n                        }\n                    }\n                }\n            }\n        }\n\n        // Emulation settings\n        ScrollablePage {\n            RowLayout {\n                Label { text: qsTr(\"SMC detection:\") }\n                ComboBox {\n                    currentIndex: ConfigModel.has(\"SMCChecks\", refreshCache) ? ConfigModel.getInt(\"SMCChecks\", refreshCache) : -1\n\n                    onActivated: {\n                        configDirty = true\n                        ConfigModel.setInt(\"SMCChecks\", currentIndex)\n                    }\n\n                    model: ListModel {\n                        ListElement { text: qsTr(\"None\") }\n                        ListElement { text: qsTr(\"MTrack\") }\n                        ListElement { text: qsTr(\"Full\") }\n                    }\n                }\n            }\n\n            GroupBox {\n                title: qsTr(\"Memory model:\")\n                width: parent.width - parent.padding * 2\n\n                ColumnLayout {\n                    anchors.left: parent ? parent.left : undefined\n                    anchors.right: parent ? parent.right : undefined\n\n                    ButtonGroup {\n                        id: tsoButtonGroup\n                        buttons: [tso1, tso2]\n                        checkedButton: ConfigModel.getBool(\"TSOEnabled\", refreshCache) ? tso2 : tso1\n\n                        property int pendingItemChange: -1\n\n                        function onClickedButton(index: int) {\n                            pendingItemChange = index;\n\n                            configDirty = true;\n\n                            var newIndex = pendingItemChange\n                            var TSOEnabled = newIndex === 1\n                            ConfigModel.setBool(\"TSOEnabled\", TSOEnabled)\n\n                            pendingItemChange = -1;\n                        }\n\n                        onClicked: {\n                            if (pendingItemChange !== -1) {\n                                return;\n                            }\n                            pendingItemChange = tso1.checked ? 0 : tso2.checked ? 1 : tso3.checked ? 2 : -1;\n                            if (pendingItemChange) {\n                                // Undetermined state, leave as is\n                                return;\n                            }\n\n                            var newIndex = pendingItemChange\n                            var TSOEnabled = newIndex === 1\n                            ConfigModel.setBool(\"TSOEnabled\", TSOEnabled)\n\n                            pendingItemChange = -1;\n                        }\n                    }\n\n                    ColumnLayout {\n                        RadioButton {\n                            id: tso1\n                            text: qsTr(\"Inaccurate\")\n                            onToggled: tsoButtonGroup.onClickedButton(0)\n                        }\n\n                        ColumnLayout {\n                            RadioButton {\n                                id: tso2\n                                text: qsTr(\"Accurate (TSO)\")\n                                onToggled: tsoButtonGroup.onClickedButton(1)\n                            }\n\n                            ColumnLayout {\n                                visible: tso2.checked\n\n                                ConfigCheckBox {\n                                    text: qsTr(\"... for vector instructions\")\n                                    tooltip: qsTr(\"Controls TSO emulation on vector load/store instructions\")\n                                    config: \"VectorTSOEnabled\"\n                                }\n                                ConfigCheckBox {\n                                    text: qsTr(\"... for memcpy instructions\")\n                                    tooltip: qsTr(\"Controls TSO emulation on memcpy/memset instructions\")\n                                    config: \"MemcpySetTSOEnabled\"\n                                }\n                                ConfigCheckBox {\n                                    text: qsTr(\"... for unaligned half-barriers\")\n                                    tooltip: qsTr(\"Controls half-barrier TSO emulation on unaligned load/store instructions\")\n                                    config: \"HalfBarrierTSOEnabled\"\n                                }\n                            }\n                        }\n                    }\n\n                    ConfigCheckBox {\n                        topPadding: 4\n                        text: qsTr(\"Enable non-tearing split-lock atomics\")\n                        config: \"StrictInProcessSplitLocks\"\n                    }\n                    ConfigCheckBox {\n                        topPadding: 4\n                        text: qsTr(\"Use PE volatile metadata for ARM64EC\")\n                        config: \"VolatileMetadata\"\n                    }\n                }\n            }\n\n            component EnvVarList: GroupBox {\n                width: parent.width - parent.padding * 2\n\n                property bool ofHost: false\n\n                ColumnLayout {\n                    anchors.left: parent ? parent.left : undefined\n                    anchors.right: parent ? parent.right : undefined\n\n                    spacing: 0\n\n                    id: envGroup\n                    property var values: ConfigModel.getStringList(ofHost ? \"HostEnv\" : \"Env\", refreshCache)\n\n                    property int editedIndex: -1\n                    Repeater {\n                        model: parent.values\n                        Layout.fillWidth: true\n\n                        RowLayout {\n                            property bool isEditing: envGroup.editedIndex === index\n\n                            ItemDelegate {\n                                text: modelData;\n                                visible: !parent.isEditing\n                                onClicked: envGroup.editedIndex = index\n\n                            }\n                            TextField {\n                                id: envVarEditTextField\n                                visible: parent.isEditing;\n                                text: modelData\n\n                                onEditingFinished: {\n                                    envGroup.editedIndex = -1\n                                    if (text === modelData) {\n                                        return\n                                    }\n\n                                    var newValues = envGroup.values\n                                    newValues[model.index] = text\n                                    configDirty = true\n                                    ConfigModel.setStringList(ofHost ? \"HostEnv\" : \"Env\", newValues)\n                                }\n                            }\n                            Button {\n                                visible: parent.isEditing\n                                icon.name: \"list-remove\"\n                                onClicked: {\n                                    envGroup.editedIndex = -1\n                                    var newValues = []\n                                    for (var i = 0; i < envGroup.values.length; ++i) {\n                                        if (i != index) {\n                                            newValues.push(envGroup.values[i])\n                                        }\n                                    }\n\n                                    configDirty = true\n                                    ConfigModel.setStringList(ofHost ? \"HostEnv\" : \"Env\", newValues)\n                                }\n                            }\n                        }\n                    }\n\n                    RowLayout {\n                        TextField {\n                            id: envVarTextField\n                            Layout.fillWidth: true\n\n                            onAccepted: {\n                                var newValues = envGroup.values\n                                newValues.push(envVarTextField.text)\n                                configDirty = true\n                                ConfigModel.setStringList(ofHost ? \"HostEnv\" : \"Env\", newValues)\n                                text = \"\"\n                            }\n                        }\n                        Button {\n                            icon.name : \"list-add\"\n                            enabled: envVarTextField.text !== \"\"\n                            onClicked: envVarTextField.onAccepted()\n                        }\n                    }\n                }\n            }\n\n            EnvVarList {\n                title: qsTr(\"Guest environment variables:\")\n            }\n\n            EnvVarList {\n                title: qsTr(\"Host environment variables:\")\n                ofHost: true\n            }\n        }\n\n        // CPU settings\n        ScrollablePage {\n            ConfigCheckBox {\n                text: qsTr(\"Multiblock\")\n                config: \"Multiblock\"\n            }\n\n            RowLayout {\n                Layout.fillWidth: true\n\n                Label { text: qsTr(\"Block size:\") }\n                ConfigSpinBox {\n                    config: \"MaxInst\"\n                    from: 0\n                    to: 1 << 30\n                }\n            }\n\n            ConfigCheckBox {\n                text: qsTr(\"Reduced x87 precision\")\n                config: \"X87ReducedPrecision\"\n            }\n\n            ConfigCheckBox {\n                text: qsTr(\"Disable JIT optimization passes\")\n                config: \"O0\"\n            }\n        }\n\n        // Libraries settings\n        ScrollablePage {\n            GroupBox {\n                title: qsTr(\"Library forwarding:\")\n                width: parent.width - parent.padding * 2\n\n                ColumnLayout {\n                    anchors.left: parent ? parent.left : undefined\n                    anchors.right: parent ? parent.right : undefined\n\n                    id: libfwdConfig\n\n                    property url configDir: (() => {\n                        var configPath = urlToLocalFile(configFilename)\n                        var slashIndex = configPath.lastIndexOf('/')\n                        if (slashIndex === -1) {\n                            return \"\"\n                        }\n                        return \"file://\" + configPath.substr(0, slashIndex)\n                    })()\n\n                    ConfigTextFieldForPath {\n                        text: qsTr(\"Host library folder:\")\n                        config: \"ThunkHostLibs\"\n                        dialog: FolderDialog {\n                            title: qsTr(\"Select path for host libraries\")\n                            currentFolder: libfwdConfig.configDir\n                        }\n                    }\n                    ConfigTextFieldForPath {\n                        text: qsTr(\"Guest library folder:\")\n                        config: \"ThunkGuestLibs\"\n                        dialog: FolderDialog {\n                            title: qsTr(\"Select path for guest libraries\")\n                            currentFolder: libfwdConfig.configDir\n                        }\n                    }\n                }\n            }\n\n            GroupBox {\n                id: hostLibsGroupBox\n                title: qsTr(\"Use host library for:\")\n                width: parent.width - parent.padding * 2\n\n                ColumnLayout {\n                    width: hostLibsGroupBox.width - hostLibsGroupBox.padding * 2\n                    ScrollView {\n                        Layout.fillWidth: true\n                        Layout.maximumHeight: 200\n                        clip: true\n\n                        Column {\n                            property string selectedItem\n                            property string explicitEntry\n\n                            spacing: 4\n\n                            Component.onCompleted: {\n                                // root.refreshCacheChanged.connect(initState)\n                            }\n\n                            Repeater {\n                                model: HostLibsModel\n                                delegate: CheckBox {\n                                    text: model.display\n                                    visible: text !== \"fex_thunk_test\" // Hide test library\n                                    checked: (root.refreshCache, model.checked)\n                                    onToggled: {\n                                        configDirty = true\n                                        model.checked = checked\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        // Advanced settings\n        // NOTE: This is wrapped in a Loader that dynamically instantiates/destroys the page contents whenever the tab is selected.\n        //       This avoids costly UI updates for its UI elements.\n        // TODO: Options contained multiple times in JSON aren't listed (neither are they in old FEXConfig though)\n        Loader { sourceComponent: tabBar.currentIndex === tabBar.advancedIndex ? advancedSettingsPage : null }\n        Component {\n            id: advancedSettingsPage\n            ScrollablePage {\n                itemSpacing: 0\n                Frame {\n                    width: parent.width - parent.padding * 2\n                    id: frame\n                    Column {\n                        Repeater {\n                            model: ConfigModel\n                            delegate: RowLayout {\n                                width: frame.width - frame.padding * 2\n\n                                Label {\n                                    id: label\n                                    text: display\n                                }\n\n                                ConfigCheckBox {\n                                    visible: optionType == \"bool\"\n                                    config: visible ? label.text : \"\"\n                                }\n\n                                ConfigTextField {\n                                    Layout.fillWidth: true\n                                    visible: optionType == \"fextl::string\"\n                                    config: visible ? label.text : \"\"\n                                }\n\n                                ConfigSpinBox {\n                                    visible: optionType.startsWith(\"int\") || optionType.startsWith(\"uint\")\n                                    config: visible ? label.text : \"\"\n                                    from: 0\n                                    to: 1 << 30\n                                }\n\n                                // Spacing\n                                Item {\n                                    Layout.fillWidth: true\n                                }\n\n                                Button {\n                                    icon.name: \"list-remove\"\n                                    onClicked: {\n                                        ConfigModel.erase(label.text)\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    footer: Pane {\n        anchors.left: parent.left\n        anchors.right: parent.right\n\n        padding: 0\n\n        ColumnLayout {\n            anchors.left: parent.left\n            anchors.right: parent.right\n            spacing: 0\n\n            ToolSeparator {\n                Layout.fillWidth: true\n                orientation: Qt.Horizontal\n\n                // Override padding from theme.\n                // Some themes use verticalPadding, others topPadding/bottomPadding, so we set them all.\n                verticalPadding: 0\n                bottomPadding: 0\n                topPadding: 0\n            }\n\n            Label {\n                Layout.alignment: Qt.AlignHCenter\n                enabled: false\n                text: loadedDefaults\n                        ? qsTr(\"Config.json not found — loaded defaults\")\n                        : qsTr(\"Editing %1\").arg(urlToLocalFile(configFilename))\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Tools/FEXConfig/qml5.qrc",
    "content": "<RCC>\n  <qresource prefix=\"/\">\n    <file>main.qml</file>\n    <file>icon.png</file>\n  </qresource>\n  <qresource prefix=\"/dialogs\">\n    <file alias=\"FileDialog.qml\">qt5/FileDialog.qml</file>\n    <file alias=\"FolderDialog.qml\">qt5/FolderDialog.qml</file>\n    <file alias=\"MessageDialog.qml\">qt5/MessageDialog.qml</file>\n  </qresource>\n</RCC>\n"
  },
  {
    "path": "Source/Tools/FEXConfig/qml6.qrc",
    "content": "<RCC>\n  <qresource prefix=\"/\">\n    <file>main.qml</file>\n    <file>icon.png</file>\n  </qresource>\n  <qresource prefix=\"/dialogs\">\n    <file alias=\"FileDialog.qml\">qt6/FileDialog.qml</file>\n    <file alias=\"FolderDialog.qml\">qt6/FolderDialog.qml</file>\n    <file alias=\"MessageDialog.qml\">qt6/MessageDialog.qml</file>\n  </qresource>\n</RCC>\n"
  },
  {
    "path": "Source/Tools/FEXConfig/qt5/FileDialog.qml",
    "content": "// SPDX-License-Identifier: MIT\nimport QtQuick.Dialogs 1.3 as FromQt\n\nFromQt.FileDialog {\n    property url selectedFile\n    property url currentFolder\n\n    folder: currentFolder\n    onAccepted: selectedFile = fileUrl\n}\n"
  },
  {
    "path": "Source/Tools/FEXConfig/qt5/FolderDialog.qml",
    "content": "// SPDX-License-Identifier: MIT\nimport QtQuick.Dialogs 1.3 as FromQt\n\nFromQt.FileDialog {\n    property url currentFolder\n    property url selectedFolder\n\n    folder: currentFolder\n\n    selectFolder: true\n\n    onAccepted: selectedFolder = fileUrl\n}\n"
  },
  {
    "path": "Source/Tools/FEXConfig/qt5/MessageDialog.qml",
    "content": "// SPDX-License-Identifier: MIT\nimport QtQuick 2.15\nimport QtQuick.Dialogs 1.3 as FromQt\n\nItem {\n    id: dialogParent\n    property alias text: child.text\n    property alias title: child.title\n\n    readonly property int buttonSave: FromQt.Dialog.Save\n    readonly property int buttonDiscard: FromQt.Dialog.Discard\n    readonly property int buttonCancel: FromQt.Dialog.Cancel\n\n    property int buttons\n\n    signal buttonClicked(button: int)\n\n    property bool pendingResult: false\n\n    function open() {\n        // Workaround for QTBUG-91650, due to which signals may get emitted twice\n        pendingResult = true\n        child.open()\n    }\n\n    FromQt.MessageDialog {\n        id: child\n\n        standardButtons: buttons\n\n        onAccepted: {\n            if (pendingResult) {\n                dialogParent.buttonClicked(buttonSave)\n                pendingResult = false\n            }\n        }\n        onDiscard: {\n            if (pendingResult) {\n                dialogParent.buttonClicked(buttonDiscard)\n                pendingResult = false\n            }\n        }\n        onRejected: {\n            if (pendingResult) {\n                dialogParent.buttonClicked(buttonCancel)\n                pendingResult = false\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Tools/FEXConfig/qt6/FileDialog.qml",
    "content": "// SPDX-License-Identifier: MIT\nimport QtQuick.Dialogs as FromQt\n\nFromQt.FileDialog {\n    property bool selectExisting: true\n    property bool selectMultiple: false\n    fileMode: selectMultiple ? FileDialog.OpenFiles : selectExisting ? FileDialog.OpenFile : FileDialog.SaveFile\n}\n"
  },
  {
    "path": "Source/Tools/FEXConfig/qt6/FolderDialog.qml",
    "content": "// SPDX-License-Identifier: MIT\nimport QtQuick.Dialogs as FromQt\n\nFromQt.FolderDialog {\n}\n"
  },
  {
    "path": "Source/Tools/FEXConfig/qt6/MessageDialog.qml",
    "content": "// SPDX-License-Identifier: MIT\nimport QtQuick.Dialogs as FromQt\n\nFromQt.MessageDialog {\n    readonly property int buttonSave: MessageDialog.Save\n    readonly property int buttonDiscard: MessageDialog.Discard\n    readonly property int buttonCancel: MessageDialog.Cancel\n}\n"
  },
  {
    "path": "Source/Tools/FEXGDBReader/CMakeLists.txt",
    "content": "add_library(FEXGDBReader SHARED FEXGDBReader.cpp)\n\ninstall(TARGETS FEXGDBReader RUNTIME\n  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/gdb\n  COMPONENT Development)\n\ntarget_include_directories(FEXGDBReader PRIVATE ${CMAKE_BINARY_DIR}/generated)\n\n# We don't actually link, but this is a nice way to get the include dirs\ntarget_link_libraries(FEXGDBReader PRIVATE Common)\n"
  },
  {
    "path": "Source/Tools/FEXGDBReader/FEXGDBReader.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <cstddef>\n#include <cstdio>\n#include <unordered_map>\n#include <mutex>\n#include <string>\n\n#include <FEXCore/Debug/GDBReaderInterface.h>\n\nGDB_DECLARE_GPL_COMPATIBLE_READER;\n\n#define debugf(...)\n\nextern \"C\" {\nstatic enum gdb_status read_debug_info(struct gdb_reader_funcs* self, struct gdb_symbol_callbacks* cbs, void* memory, long memory_sz) {\n\n  info_t* info = (info_t*)memory;\n  blocks_t* blocks = (blocks_t*)(info->blocks_ofs + (long)memory);\n  gdb_line_mapping* lines = (gdb_line_mapping*)(info->lines_ofs + (long)memory);\n  debugf(\"info: %p\\n\", info);\n  debugf(\"info: s %p\\n\", info->filename);\n  debugf(\"info: s %s\\n\", info->filename);\n  debugf(\"info: l %d\\n\", info->nlines);\n  debugf(\"info: b %d\\n\", info->nblocks);\n\n  struct gdb_object* object = cbs->object_open(cbs);\n  struct gdb_symtab* symtab = cbs->symtab_open(cbs, object, info->filename);\n\n  for (int i = 0; i < info->nblocks; i++) {\n    debugf(\"info: %d\\n\", i);\n    debugf(\"info: %lx\\n\", blocks[i].start);\n    debugf(\"info: %lx\\n\", blocks[i].end);\n    debugf(\"info: %s\\n\", blocks[i].name);\n    cbs->block_open(cbs, symtab, NULL, blocks[i].start, blocks[i].end, blocks[i].name);\n  }\n\n  debugf(\"info: lines %d\\n\", info->nlines);\n  debugf(\"info: lines %p\\n\", lines);\n\n  for (int i = 0; i < info->nlines; i++) {\n    debugf(\"info: line: %d\\n\", i);\n    debugf(\"info: line pc: %lx\\n\", lines[i].pc);\n    debugf(\"info: line file: %d\\n\", lines[i].line);\n  }\n  cbs->line_mapping_add(cbs, symtab, info->nlines, lines);\n\n  // don't close here, symtab and object are cached\n  cbs->symtab_close(cbs, symtab);\n  cbs->object_close(cbs, object);\n  return GDB_SUCCESS;\n}\n\nenum gdb_status unwind_frame(struct gdb_reader_funcs* self, struct gdb_unwind_callbacks* cbs) {\n  return GDB_SUCCESS;\n}\n\nstruct gdb_frame_id get_frame_id(struct gdb_reader_funcs* self, struct gdb_unwind_callbacks* cbs) {\n  struct gdb_frame_id frame = {0x1234000, 0};\n  return frame;\n}\n\nvoid destroy_reader(struct gdb_reader_funcs* self) {}\n\nextern struct gdb_reader_funcs* gdb_init_reader(void) {\n  static struct gdb_reader_funcs funcs = {GDB_READER_INTERFACE_VERSION, NULL, read_debug_info, unwind_frame, get_frame_id, destroy_reader};\n  return &funcs;\n}\n}\n"
  },
  {
    "path": "Source/Tools/FEXGetConfig/CMakeLists.txt",
    "content": "add_executable(FEXGetConfig Main.cpp)\n\nlist(APPEND LIBS Common JemallocDummy)\n\nLinkerGC(FEXGetConfig)\n\ninstall(TARGETS FEXGetConfig RUNTIME\n  DESTINATION bin\n  COMPONENT Runtime)\n\ntarget_link_libraries(FEXGetConfig PRIVATE ${LIBS})\n\ntarget_include_directories(FEXGetConfig PRIVATE ${CMAKE_BINARY_DIR}/generated)\n"
  },
  {
    "path": "Source/Tools/FEXGetConfig/Main.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Common/cpp-optparse/OptionParser.h\"\n#include \"Common/Config.h\"\n#include \"Common/FEXServerClient.h\"\n#include \"Common/HostFeatures.h\"\n#include \"git_version.h\"\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Utils/PrctlUtils.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXHeaderUtils/Filesystem.h>\n\n#include <cstdio>\n#include <filesystem>\n#include <string>\n#include <sys/prctl.h>\n\nnamespace {\nstruct TSOEmulationFacts {\n  bool LSE {}, LSE2 {};\n  bool HardwareTSO {};\n  bool LRCPC1 {}, LRCPC2 {}, LRCPC3 {};\n};\n\n#ifdef ARCHITECTURE_arm64\nbool CheckForHardwareTSO() {\n  // Check to see if this is supported.\n  auto Result = prctl(PR_GET_MEM_MODEL, 0, 0, 0, 0);\n  if (Result == -1) {\n    // Unsupported, early exit.\n    return false;\n  }\n\n  if (Result == PR_SET_MEM_MODEL_DEFAULT) {\n    // Try to set the TSO mode if we are currently default.\n    Result = prctl(PR_SET_MEM_MODEL, PR_SET_MEM_MODEL_TSO, 0, 0, 0);\n    if (Result == 0) {\n      Result = prctl(PR_SET_MEM_MODEL, PR_SET_MEM_MODEL_DEFAULT, 0, 0, 0);\n      return true;\n    }\n  }\n  return false;\n}\n\nenum ISAR0_FIELDS {\n  LSE = 20,\n};\n\nenum ISAR1_FIELDS {\n  LRCPC = 20,\n};\n\nenum MMFR2_FIELDS {\n  AT = 32,\n};\n\nconstexpr static uint32_t IDFIELDMASK = 0b1111;\nuint64_t GetISAR0() {\n  uint64_t Result {};\n  asm(\"mrs %0, ID_AA64ISAR0_EL1;\" : \"=r\"(Result));\n  return Result;\n}\n\nuint64_t GetISAR1() {\n  uint64_t Result {};\n  asm(\"mrs %0, ID_AA64ISAR1_EL1;\" : \"=r\"(Result));\n  return Result;\n}\n\nuint64_t GetMMFR2() {\n  uint64_t Result {};\n  asm(\"mrs %0, ID_AA64MMFR2_EL1;\" : \"=r\"(Result));\n  return Result;\n}\n\nTSOEmulationFacts GetTSOEmulationFacts() {\n  const auto ISAR0 = GetISAR0();\n  const auto ISAR1 = GetISAR1();\n  const auto MMFR2 = GetMMFR2();\n\n  return {\n    .LSE = ((ISAR0 >> ISAR0_FIELDS::LSE) & IDFIELDMASK) >= 0b0010,\n    .LSE2 = ((MMFR2 >> MMFR2_FIELDS::AT) & IDFIELDMASK) >= 0b0001,\n    .HardwareTSO = CheckForHardwareTSO(),\n    .LRCPC1 = ((ISAR1 >> ISAR1_FIELDS::LRCPC) & IDFIELDMASK) >= 0b0001,\n    .LRCPC2 = ((ISAR1 >> ISAR1_FIELDS::LRCPC) & IDFIELDMASK) >= 0b0010,\n    .LRCPC3 = ((ISAR1 >> ISAR1_FIELDS::LRCPC) & IDFIELDMASK) >= 0b0011,\n  };\n}\n#else\nTSOEmulationFacts GetTSOEmulationFacts() {\n  return {};\n}\n#endif\n} // namespace\n\nint main(int argc, char** argv, char** envp) {\n  FEX::Config::InitializeConfigs(FEX::Config::PortableInformation {});\n  FEXCore::Config::Initialize();\n  FEXCore::Config::AddLayer(FEX::Config::CreateGlobalMainLayer());\n  FEXCore::Config::AddLayer(FEX::Config::CreateMainLayer());\n  // No FEX arguments passed through command line\n  FEXCore::Config::AddLayer(FEX::Config::CreateEnvironmentLayer(envp));\n\n  // Load the arguments\n  optparse::OptionParser Parser = optparse::OptionParser().description(\"Simple application to get a couple of FEX options\");\n\n  Parser.add_option(\"--install-prefix\").action(\"store_true\").help(\"Print the FEX install prefix\");\n\n  Parser.add_option(\"--app\").help(\"Load an application profile for this application if it exists\");\n\n  Parser.add_option(\"--current-rootfs\").action(\"store_true\").help(\"Print the directory that contains the FEX rootfs. Mounted in the case of squashfs\");\n\n  Parser.add_option(\"--tso-emulation-info\").action(\"store_true\").help(\"Print how FEX is emulating the x86-TSO memory model.\");\n\n#ifdef ARCHITECTURE_arm64\n  Parser.add_option(\"--identification-reg-info\").action(\"store_true\").help(\"Print identification registers\");\n#endif\n\n  Parser.add_option(\"--version\").action(\"store_true\").help(\"Print the installed FEX-Emu version\");\n\n  optparse::Values Options = Parser.parse_args(argc, argv);\n\n  if (Options.is_set_by_user(\"app\")) {\n    // Load the application config if one was provided\n    const auto ProgramName = FHU::Filesystem::GetFilename(Options[\"app\"]);\n    FEXCore::Config::AddLayer(FEX::Config::CreateAppLayer(ProgramName, FEXCore::Config::LayerType::LAYER_GLOBAL_APP));\n    FEXCore::Config::AddLayer(FEX::Config::CreateAppLayer(ProgramName, FEXCore::Config::LayerType::LAYER_LOCAL_APP));\n\n    auto SteamID = getenv(\"SteamAppId\");\n    if (SteamID) {\n      // If a SteamID exists then let's search for Steam application configs as well.\n      // We want to key off both the SteamAppId number /and/ the executable since we may not want to thunk all binaries.\n      const auto SteamAppName = fextl::fmt::format(\"Steam_{}_{}\", SteamID, ProgramName);\n      FEXCore::Config::AddLayer(FEX::Config::CreateAppLayer(SteamAppName, FEXCore::Config::LayerType::LAYER_GLOBAL_STEAM_APP));\n      FEXCore::Config::AddLayer(FEX::Config::CreateAppLayer(SteamAppName, FEXCore::Config::LayerType::LAYER_LOCAL_STEAM_APP));\n    }\n  }\n\n  FEXCore::Config::Load();\n\n  // Reload the meta layer\n  FEXCore::Config::ReloadMetaLayer();\n\n  if (Options.is_set_by_user(\"version\")) {\n    fprintf(stdout, GIT_DESCRIBE_STRING \"\\n\");\n  }\n\n  if (Options.is_set_by_user(\"install_prefix\")) {\n    char SelfPath[PATH_MAX];\n    auto Result = readlink(\"/proc/self/exe\", SelfPath, PATH_MAX);\n    if (Result == -1) {\n      Result = 0;\n    }\n    auto InstallPrefix = std::filesystem::path(&SelfPath[0], &SelfPath[Result]).parent_path().parent_path().string();\n    fprintf(stdout, \"%s\\n\", InstallPrefix.c_str());\n  }\n\n  if (Options.is_set_by_user(\"current_rootfs\")) {\n    int ServerFD = FEXServerClient::ConnectToServer();\n    if (ServerFD != -1) {\n      auto RootFS = FEXServerClient::RequestRootFSPath(ServerFD);\n      if (!RootFS.empty()) {\n        fprintf(stdout, \"%s\\n\", RootFS.c_str());\n      }\n    }\n  }\n\n  if (Options.is_set_by_user(\"tso_emulation_info\")) {\n    auto TSOFacts = GetTSOEmulationFacts();\n    const char* GPRMemoryTSOEmulation {};\n    const char* MemcpyMemoryTSOEmulation {};\n    const char* VectorMemoryTSOEmulation {};\n    const char* UnalignedMemoryLoadStoreTSOEmulation {};\n\n    if (TSOFacts.HardwareTSO) {\n      GPRMemoryTSOEmulation = \"\\e[32mHardware TSO\\e[0m\";\n    } else if (TSOFacts.LRCPC3) {\n      GPRMemoryTSOEmulation = \"\\e[32mLRCPC3\\e[0m\";\n    } else if (TSOFacts.LRCPC2) {\n      GPRMemoryTSOEmulation = \"\\e[32mLRCPC2\\e[0m\";\n    } else if (TSOFacts.LRCPC1) {\n      GPRMemoryTSOEmulation = \"\\e[32mLRCPC\\e[0m\";\n    } else {\n      GPRMemoryTSOEmulation = \"\\e[31mAtomics\\e[0m\";\n    }\n\n    // Memcpy only uses Hardware TSO, LRCPC, and Atomics.\n    if (TSOFacts.HardwareTSO) {\n      MemcpyMemoryTSOEmulation = \"\\e[32mHardware TSO\\e[0m\";\n    } else if (TSOFacts.LRCPC1) {\n      MemcpyMemoryTSOEmulation = \"\\e[32mLRCPC\\e[0m\";\n    } else {\n      MemcpyMemoryTSOEmulation = \"\\e[31mAtomics\\e[0m\";\n    }\n\n    if (TSOFacts.HardwareTSO) {\n      VectorMemoryTSOEmulation = \"\\e[32mHardware TSO\\e[0m\";\n    } else if (TSOFacts.LRCPC3) {\n      VectorMemoryTSOEmulation = \"\\e[32mLRCPC3\\e[0m\";\n    } else {\n      VectorMemoryTSOEmulation = \"\\e[31mHalf-Barriers\\e[0m\";\n    }\n\n    if (TSOFacts.HardwareTSO) {\n      UnalignedMemoryLoadStoreTSOEmulation = \"\\e[32mHardware TSO\\e[0m\";\n    } else {\n      UnalignedMemoryLoadStoreTSOEmulation = \"\\e[31mHalf-Barriers\\e[0m\";\n    }\n\n    fprintf(stdout, \"Hardware Features:\\n\");\n    fprintf(stdout, \"\\tMemory atomics emulation method:      %s\\n\", TSOFacts.LSE ? \"\\e[32mLSE\\e[0m\" : \"\\e[31mLL/SC\\e[0m\");\n    fprintf(stdout, \"\\tUnaligned atomic memory granularity:  %s\\n\", TSOFacts.LSE2 ? \"\\e[32m16-byte\\e[0m\" : \"\\e[31mNatural alignment\\e[0m\");\n    ///< TODO: Once TME is supported by hardware this can change.\n    fprintf(stdout, \"\\tUnaligned memory loadstore emulation: %s\\n\", UnalignedMemoryLoadStoreTSOEmulation);\n    fprintf(stdout, \"\\t16-Byte split-lock atomic emulation:  %s\\n\", TSOFacts.LSE ? \"\\e[31mTearing CAS loops\\e[0m\" : \"\\e[31mTearing LL/SC loops\\e[0m\");\n    fprintf(stdout, \"\\t64-Byte split-lock atomic emulation:  %s\\n\", TSOFacts.LSE ? \"\\e[31mTearing CAS loops\\e[0m\" : \"\\e[31mTearing LL/SC loops\\e[0m\");\n    fprintf(stdout, \"\\tGPR memory model emulation:           %s\\n\", GPRMemoryTSOEmulation);\n    fprintf(stdout, \"\\tMemcpy memory model emulation:        %s\\n\", MemcpyMemoryTSOEmulation);\n    fprintf(stdout, \"\\tVector memory model emulation:        %s\\n\", VectorMemoryTSOEmulation);\n\n    FEX_CONFIG_OPT(TSOEnabled, TSOENABLED);\n    FEX_CONFIG_OPT(MemcpySetTSOEnabled, MEMCPYSETTSOENABLED);\n    FEX_CONFIG_OPT(VectorTSOEnabled, VECTORTSOENABLED);\n    FEX_CONFIG_OPT(HalfBarrierTSOEnabled, HALFBARRIERTSOENABLED);\n    FEX_CONFIG_OPT(StrictInProcessSplitLocks, STRICTINPROCESSSPLITLOCKS);\n    fprintf(stderr, \"Strict: %d\\n\", StrictInProcessSplitLocks());\n\n    fprintf(stdout, \"\\nConfiguration:\\n\");\n    fprintf(stdout, \"\\tTSO Emulation:                        %s\\n\", TSOEnabled() ? \"Enabled\" : \"Disabled\");\n    fprintf(stdout, \"\\tMemcpy TSO Emulation:                 %s\\n\", TSOEnabled() && MemcpySetTSOEnabled() ? \"Enabled\" : \"Disabled\");\n    fprintf(stdout, \"\\tVector TSO Emulation:                 %s\\n\", TSOEnabled() && VectorTSOEnabled() ? \"Enabled\" : \"Disabled\");\n    fprintf(stdout, \"\\tHalf-barrier unaligned TSO emulation: %s\\n\", TSOEnabled() && HalfBarrierTSOEnabled() ? \"Enabled\" : \"Disabled\");\n    fprintf(stdout, \"\\t16-Byte strict split-lock emulation:  %s\\n\", StrictInProcessSplitLocks() ? \"In-process mutex\" : \"Tearing\");\n    fprintf(stdout, \"\\t64-Byte strict split-lock emulation:  %s\\n\", StrictInProcessSplitLocks() ? \"In-process mutex\" : \"Tearing\");\n  }\n\n#ifdef ARCHITECTURE_arm64\n  if (Options.is_set_by_user(\"identification_reg_info\")) {\n    auto Features = FEX::GetCPUFeaturesFromIDRegisters();\n    fextl::string features {};\n    features += fmt::format(\"isar0=0x{:x},\", Features.ISAR0.Get());\n    features += fmt::format(\"isar1=0x{:x},\", Features.ISAR1.Get());\n    features += fmt::format(\"isar2=0x{:x},\", Features.ISAR2.Get());\n    features += fmt::format(\"pfr0=0x{:x},\", Features.PFR0.Get());\n    features += fmt::format(\"pfr1=0x{:x},\", Features.PFR1.Get());\n    features += fmt::format(\"midr=0x{:x},\", Features.MIDR.Get());\n    features += fmt::format(\"mmfr0=0x{:x},\", Features.MMFR0.Get());\n    features += fmt::format(\"mmfr1=0x{:x},\", Features.MMFR1.Get());\n    features += fmt::format(\"mmfr2=0x{:x},\", Features.MMFR2.Get());\n    features += fmt::format(\"zfr0=0x{:x},\", Features.ZFR0.Get());\n    features += fmt::format(\"dczid=0x{:x},\", Features.DCZID.Get());\n    features += fmt::format(\"svevl=0x{:x}\", Features.SVEVL.Get());\n    fprintf(stderr, \"Features: '%s'\\n\", features.c_str());\n  }\n#endif\n\n  return 0;\n}\n"
  },
  {
    "path": "Source/Tools/FEXInterpreter/AOT/AOTGenerator.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Common/CPUInfo.h\"\n\n#include \"ELFCodeLoader.h\"\n#include \"Linux/Utils/ELFContainer.h\"\n\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/queue.h>\n#include <FEXCore/fextl/set.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <cstddef>\n#include <sys/resource.h>\n#include <sys/sysinfo.h>\n#include <thread>\n\nnamespace FEX::AOT {\nvoid AOTGenSection(FEXCore::Context::Context* CTX, ELFCodeLoader::LoadedSection& Section) {\n  // Make sure this section is executable and big enough\n  if (!Section.Executable || Section.Size < 16) {\n    return;\n  }\n\n  fextl::set<uintptr_t> InitialBranchTargets;\n\n  // Load the ELF again with symbol parsing this time\n  ELFLoader::ELFContainer container {Section.Filename, \"\", true};\n\n  // Add symbols to the branch targets list\n  container.AddSymbols([&](ELFLoader::ELFSymbol* sym) {\n    auto Destination = sym->Address + Section.ElfBase;\n\n    if (!(Destination >= Section.Base && Destination <= (Section.Base + Section.Size))) {\n      return; // outside of current section, unlikely to be real code\n    }\n\n    InitialBranchTargets.insert(Destination);\n  });\n\n  LogMan::Msg::IFmt(\"Symbol seed: {}\", InitialBranchTargets.size());\n\n  // Add unwind entries to the branch target list\n  container.AddUnwindEntries([&](uintptr_t Entry) {\n    auto Destination = Entry + Section.ElfBase;\n\n    if (!(Destination >= Section.Base && Destination <= (Section.Base + Section.Size))) {\n      return; // outside of current section, unlikely to be real code\n    }\n\n    InitialBranchTargets.insert(Destination);\n  });\n\n  LogMan::Msg::IFmt(\"Symbol + Unwind seed: {}\", InitialBranchTargets.size());\n\n  // Scan the executable section and try to find function entries\n  for (size_t Offset = 0; Offset < (Section.Size - 16); Offset++) {\n    uint8_t* pCode = (uint8_t*)(Section.Base + Offset);\n\n    // Possible CALL <disp32>\n    if (*pCode == 0xE8) {\n      uintptr_t Destination = (int)(pCode[1] | (pCode[2] << 8) | (pCode[3] << 16) | (pCode[4] << 24));\n      Destination += (uintptr_t)pCode + 5;\n\n      auto DestinationPtr = (uint8_t*)Destination;\n\n      if (!(Destination >= Section.Base && Destination <= (Section.Base + Section.Size))) {\n        continue; // outside of current section, unlikely to be real code\n      }\n\n      if (DestinationPtr[0] == 0 && DestinationPtr[1] == 0) {\n        continue; // add al, [rax], unlikely to be real code\n      }\n\n      InitialBranchTargets.insert(Destination);\n    }\n\n    // endbr64 marker marks an indirect branch destination\n    if (pCode[0] == 0xf3 && pCode[1] == 0x0f && pCode[2] == 0x1e && pCode[3] == 0xfa) {\n      InitialBranchTargets.insert((uintptr_t)pCode);\n    }\n  }\n\n  uint64_t SectionMaxAddress = Section.Base + Section.Size;\n\n  fextl::set<uint64_t> Compiled;\n  std::atomic<int> counter = 0;\n\n  fextl::queue<uint64_t> BranchTargets;\n\n  // Setup BranchTargets, Compiled sets from InitiaBranchTargets\n\n  Compiled.insert(InitialBranchTargets.begin(), InitialBranchTargets.end());\n  for (auto BranchTarget : InitialBranchTargets) {\n    BranchTargets.push(BranchTarget);\n  }\n\n  InitialBranchTargets.clear();\n\n\n  std::mutex QueueMutex;\n  fextl::vector<std::thread> ThreadPool;\n\n  // This code is tricky to refactor so it doesn't allocate memory through glibc.\n  FEXCore::Allocator::YesIKnowImNotSupposedToUseTheGlibcAllocator glibc;\n  const auto Cores = FEX::CPUInfo::CalculateNumberOfCPUs();\n  for (int i = 0; i < Cores; i++) {\n    std::thread thd([&BranchTargets, CTX, &counter, &Compiled, &Section, &QueueMutex, SectionMaxAddress]() {\n      // Set the priority of the thread so it doesn't overwhelm the system when running in the background\n      setpriority(PRIO_PROCESS, FHU::Syscalls::gettid(), 19);\n\n      // Setup thread - Each compilation thread uses its own backing FEX thread\n      auto Thread = CTX->CreateThread(0, 0);\n      fextl::set<uint64_t> ExternalBranchesLocal;\n      CTX->ConfigureAOTGen(Thread, &ExternalBranchesLocal, SectionMaxAddress);\n\n      for (;;) {\n        uint64_t BranchTarget;\n\n        // Get a entrypoint to process from the queue\n        QueueMutex.lock();\n        if (BranchTargets.empty()) {\n          QueueMutex.unlock();\n          break; // no entrypoint to process - exit\n        }\n\n        BranchTarget = BranchTargets.front();\n        BranchTargets.pop();\n        QueueMutex.unlock();\n\n        // Compile entrypoint\n        counter++;\n        CTX->CompileRIP(Thread, BranchTarget);\n\n        // Are there more branches?\n        if (ExternalBranchesLocal.size() > 0) {\n          // Add them to the \"to process\" list\n          QueueMutex.lock();\n          for (auto Destination : ExternalBranchesLocal) {\n            if (!(Destination >= Section.Base && Destination <= (Section.Base + Section.Size))) {\n              continue;\n            }\n            if (Compiled.contains(Destination)) {\n              continue;\n            }\n            Compiled.insert(Destination);\n            BranchTargets.push(Destination);\n          }\n          QueueMutex.unlock();\n          ExternalBranchesLocal.clear();\n        }\n      }\n\n      // All entryproints processed, cleanup this thread\n      CTX->DestroyThread(Thread);\n      // This thread is now getting abandoned. Disable glibc allocator checking so glibc can safely cleanup its internal allocations.\n      FEXCore::Allocator::YesIKnowImNotSupposedToUseTheGlibcAllocator::HardDisable();\n    });\n\n    // Add to the thread pool\n    ThreadPool.push_back(std::move(thd));\n  }\n\n  // Make sure all threads are finished\n  for (auto& Thread : ThreadPool) {\n    Thread.join();\n  }\n\n  ThreadPool.clear();\n\n  LogMan::Msg::IFmt(\"\\nAll Done: {}\", counter.load());\n}\n} // namespace FEX::AOT\n"
  },
  {
    "path": "Source/Tools/FEXInterpreter/AOT/AOTGenerator.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"ELFCodeLoader.h\"\n\nnamespace FEX::AOT {\nvoid AOTGenSection(FEXCore::Context::Context* CTX, ELFCodeLoader::LoadedSection& Section);\n}\n"
  },
  {
    "path": "Source/Tools/FEXInterpreter/CMakeLists.txt",
    "content": "list(APPEND LIBS FEXCore Common JemallocLibs LinuxEmulation\n  CommonTools ${PTHREAD_LIB} fmt::fmt)\n\nset(DEFINES)\nif (ENABLE_VIXL_SIMULATOR)\n  list(APPEND DEFINES -DVIXL_SIMULATOR=1)\nendif()\n\nadd_executable(FEX\n  FEXInterpreter.cpp\n  AOT/AOTGenerator.cpp)\n\ntarget_compile_definitions(FEX PRIVATE ${DEFINES})\n\n# Enable FEX APIs to be used by targets that use target_link_libraries on FEX\nset_target_properties(FEX PROPERTIES\n  ENABLE_EXPORTS 1\n  C_VISIBILITY_PRESET hidden\n  CXX_VISIBILITY_PRESET hidden\n  VISIBILITY_INLINES_HIDDEN TRUE)\n\ntarget_include_directories(FEX PRIVATE ${CMAKE_BINARY_DIR}/generated)\n\ntarget_link_libraries(FEX PRIVATE ${LIBS})\n\ntarget_compile_options(FEX PRIVATE ${FEX_TUNE_COMPILE_FLAGS})\n\nLinkerGC(FEX)\n\ninstall(TARGETS FEX RUNTIME\n    DESTINATION bin\n    COMPONENT Runtime)\n\n# Create a copy of FEX with legacy names until phased out.\ninstall(PROGRAMS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/FEX\n  RENAME FEXInterpreter\n  DESTINATION bin\n  COMPONENT LegacyRuntime)\n\nif (ARCHITECTURE_arm64)\n  if (NOT USE_LEGACY_BINFMTMISC)\n    # Just restart the systemd service\n    add_custom_target(binfmt_misc\n      echo \"Restarting systemd service now.\"\n      COMMAND \"service\" \"systemd-binfmt\" \"restart\")\n  else()\n    # Check for conflicting binfmt before installing\n    set(CONFLICTING_BINFMTS_32\n      ${CMAKE_INSTALL_PREFIX}/share/binfmts/qemu-i386\n      ${CMAKE_INSTALL_PREFIX}/share/binfmts/box86)\n    set(CONFLICTING_BINFMTS_64\n      ${CMAKE_INSTALL_PREFIX}/share/binfmts/qemu-x86_64\n      ${CMAKE_INSTALL_PREFIX}/share/binfmts/box64)\n\n    find_program(UPDATE_BINFMTS_PROGRAM update-binfmts)\n    if (UPDATE_BINFMTS_PROGRAM)\n      add_custom_target(binfmt_misc\n        echo \"Attempting to install FEX binfmt_misc now.\"\n        COMMAND \"${CMAKE_SOURCE_DIR}/Scripts/CheckBinfmtNotInstall.sh\" ${CONFLICTING_BINFMTS_32}\n        COMMAND \"${CMAKE_SOURCE_DIR}/Scripts/CheckBinfmtNotInstall.sh\" ${CONFLICTING_BINFMTS_64}\n        COMMAND \"update-binfmts\" \"--importdir=${CMAKE_INSTALL_PREFIX}/share/binfmts/\" \"--import\" \"FEX-x86\"\n        COMMAND \"update-binfmts\" \"--importdir=${CMAKE_INSTALL_PREFIX}/share/binfmts/\" \"--import\" \"FEX-x86_64\"\n        COMMAND ${CMAKE_COMMAND} -E\n        echo \"FEX binfmt_misc installed\")\n\n      if(TARGET uninstall)\n        add_custom_target(uninstall_binfmt_misc\n          COMMAND update-binfmts --unimport FEX-x86 || (exit 0)\n          COMMAND update-binfmts --unimport FEX-x86_64 || (exit 0))\n\n        add_dependencies(uninstall uninstall_binfmt_misc)\n      endif()\n    else()\n      # In the case of update-binfmts not being available (Arch for example) then we need to install manually\n      add_custom_target(binfmt_misc\n        COMMAND ${CMAKE_COMMAND} -E\n          echo \"Attempting to remove FEX misc prior to install. Ignore permission denied\"\n        COMMAND ${CMAKE_COMMAND} -E\n          echo -1 > /proc/sys/fs/binfmt_misc/FEX-x86 || (exit 0)\n        COMMAND ${CMAKE_COMMAND} -E\n          echo -1 > /proc/sys/fs/binfmt_misc/FEX-x86_64 || (exit 0)\n        COMMAND ${CMAKE_COMMAND} -E\n          echo \"Attempting to install FEX misc now.\"\n        COMMAND ${CMAKE_COMMAND} -E\n          echo\n          ':FEX-x86:M:0:\\\\x7fELF\\\\x01\\\\x01\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x02\\\\x00\\\\x03\\\\x00:\\\\xff\\\\xff\\\\xff\\\\xff\\\\xff\\\\xfe\\\\xfe\\\\x00\\\\x00\\\\x00\\\\x00\\\\xff\\\\xff\\\\xff\\\\xff\\\\xff\\\\xfe\\\\xff\\\\xff\\\\xff:${CMAKE_INSTALL_PREFIX}/bin/FEX:POCF' > /proc/sys/fs/binfmt_misc/register\n        COMMAND ${CMAKE_COMMAND} -E\n          echo\n          ':FEX-x86_64:M:0:\\\\x7fELF\\\\x02\\\\x01\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x02\\\\x00\\\\x3e\\\\x00:\\\\xff\\\\xff\\\\xff\\\\xff\\\\xff\\\\xfe\\\\xfe\\\\x00\\\\x00\\\\x00\\\\x00\\\\xff\\\\xff\\\\xff\\\\xff\\\\xff\\\\xfe\\\\xff\\\\xff\\\\xff:${CMAKE_INSTALL_PREFIX}/bin/FEX:POCF' > /proc/sys/fs/binfmt_misc/register\n        COMMAND ${CMAKE_COMMAND} -E\n          echo \"binfmt_misc FEX installed\")\n\n      if(TARGET uninstall)\n        add_custom_target(uninstall_binfmt_misc\n          COMMAND ${CMAKE_COMMAND} -E\n            echo -1 > /proc/sys/fs/binfmt_misc/FEX-x86 || (exit 0)\n          COMMAND ${CMAKE_COMMAND} -E\n            echo -1 > /proc/sys/fs/binfmt_misc/FEX-x86_64 || (exit 0))\n\n        add_dependencies(uninstall uninstall_binfmt_misc)\n      endif()\n    endif()\n  endif()\nendif()\n"
  },
  {
    "path": "Source/Tools/FEXInterpreter/ELFCodeLoader.h",
    "content": "// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include \"ArchHelpers/UContext.h\"\n#include \"CodeLoader.h\"\n#include \"Common/FDUtils.h\"\n#include \"FEXCore/Utils/Allocator.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"VDSO_Emulation.h\"\n#include \"Linux/Utils/ELFParser.h\"\n\n#include <cstring>\n\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXCore/Utils/FileLoading.h>\n#include <FEXCore/fextl/list.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXHeaderUtils/Syscalls.h>\n#include <FEXHeaderUtils/SymlinkChecks.h>\n\n#include <elf.h>\n#include <fcntl.h>\n#include <fmt/format.h>\n#include <sys/auxv.h>\n#include <sys/mman.h>\n#include <sys/personality.h>\n#include <sys/prctl.h>\n#include <sys/random.h>\n#include <linux/prctl.h>\n\n#define PAGE_START(x) ((x) & ~(uintptr_t)(4095))\n#define PAGE_OFFSET(x) ((x) & 4095)\n#define PAGE_ALIGN(x) (((x) + 4095) & ~(uintptr_t)(4095))\n\nclass ELFCodeLoader final : public FEX::CodeLoader {\n  ELFParser MainElf {};\n  ELFParser InterpElf {};\n\n  bool ElfValid {false};\n  bool ExecutableStack {false};\n  bool ExecuteAll {false};\n  bool HasStackHeader {false};\n  uintptr_t MainElfBase {};\n  uintptr_t InterpeterElfBase {};\n  uintptr_t MainElfEntrypoint {};\n  uintptr_t Entrypoint {};\n  uintptr_t BrkStart {};\n  uintptr_t StackPointer {};\n\n  // This calculates the map size for ET_DYN type ELF files.\n  // Can't be used for ET_EXEC ELF files because they can have large virtual mapping holes.\n  static size_t CalculateDYNELFSize(const fextl::vector<Elf64_Phdr>& headers) {\n    bool had_pt_load = false;\n    size_t min_map_address = ~0ULL;\n    size_t max_map_address = 0;\n    for (const auto& it : headers) {\n      if (it.p_type != PT_LOAD) {\n        // Skip everything but PT_LOAD.\n        continue;\n      }\n\n      had_pt_load = true;\n      min_map_address = std::min(min_map_address, PAGE_START(it.p_vaddr));\n      max_map_address = std::max(max_map_address, it.p_vaddr + it.p_memsz);\n    }\n\n    if (!had_pt_load) {\n      // No load segments, so need to be safe and return zero.\n      return 0;\n    }\n\n    return FEXCore::AlignUp(max_map_address - min_map_address, FEXCore::Utils::FEX_PAGE_SIZE);\n  }\n\n  bool MapFile(const ELFParser& file, uintptr_t Base, const Elf64_Phdr& Header, int prot, int flags,\n               FEX::HLE::SyscallMmapInterface* const Handler, FEXCore::Core::InternalThreadState* Thread) {\n\n    auto addr = Base + PAGE_START(Header.p_vaddr);\n    auto size = Header.p_filesz + PAGE_OFFSET(Header.p_vaddr);\n    auto off = Header.p_offset - PAGE_OFFSET(Header.p_vaddr);\n\n    size = PAGE_ALIGN(size);\n    if (size == 0) {\n      // PT_LOAD section without a file size\n      // Will need to have a memory size that is not zero instead\n      return true;\n    }\n\n    void* rv = Handler->GuestMmap(Thread, (void*)addr, size, prot, flags, file.fd, off);\n\n    if (FEX::HLE::HasSyscallError(rv)) {\n      // uhoh, something went wrong\n      LogMan::Msg::EFmt(\"MapFile: Some elf mapping failed, {}, fd: {}\\n\", errno, file.fd);\n      return false;\n    } else {\n      char Tmp[PATH_MAX];\n      auto PathLength = FEX::get_fdpath(file.fd, Tmp);\n      if (PathLength != -1) {\n        Sections.push_back({Base, (uintptr_t)rv, size, (off_t)off, fextl::string(Tmp, PathLength), (prot & PROT_EXEC) != 0});\n      }\n\n      return true;\n    }\n  }\n\n  int MapFlags(const Elf64_Phdr& Header) {\n    int rv = 0;\n\n    if (Header.p_flags & PF_R) {\n      rv |= PROT_READ;\n    }\n\n    if (Header.p_flags & PF_W) {\n      rv |= PROT_WRITE;\n    }\n\n    if (Header.p_flags & PF_X) {\n      rv |= PROT_EXEC;\n    }\n\n    return rv;\n  }\n\n  std::optional<uintptr_t> LoadElfFile(ELFParser& Elf, uintptr_t* BrkBase, FEX::HLE::SyscallMmapInterface* const Handler,\n                                       FEXCore::Core::InternalThreadState* Thread, uint64_t LoadHint = 0) {\n\n    uintptr_t LoadBase = 0;\n    uintptr_t BrkLoadBase = 0;\n    const bool DynELF = Elf.ehdr.e_type == ET_DYN;\n    const bool NeedsLateBRKMap = BrkBase && !DynELF;\n\n    if (DynELF) {\n      // Allocate a base address plus BRK padding.\n      auto TotalSize = CalculateDYNELFSize(Elf.phdrs) + (BrkBase ? BRK_SIZE : 0);\n      LoadBase =\n        (uintptr_t)Handler->GuestMmap(Thread, reinterpret_cast<void*>(LoadHint), TotalSize, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);\n      if (FEX::HLE::HasSyscallError(LoadBase)) {\n        return {};\n      }\n\n      // fprintf(stderr, \"elf %d: %lx-%lx\\n\", Elf.fd, LoadBase, LoadBase + TotalSize);\n      if (BrkBase) {\n        BrkLoadBase = LoadBase + (TotalSize - BRK_SIZE);\n      }\n    }\n\n    for (const auto& Header : Elf.phdrs) {\n      if (Header.p_type != PT_LOAD) {\n        continue;\n      }\n\n      int MapProt = MapFlags(Header);\n      int MapType = MAP_PRIVATE | MAP_DENYWRITE | MAP_FIXED;\n\n      if (!MapFile(Elf, LoadBase, Header, MapProt, MapType, Handler, Thread)) {\n        return {};\n      }\n\n      if (Header.p_memsz > Header.p_filesz) {\n        // clear bss\n        auto BSSStart = LoadBase + Header.p_vaddr + Header.p_filesz;\n        auto BSSPageStart = PAGE_ALIGN(BSSStart);\n        auto BSSPageEnd = PAGE_ALIGN(LoadBase + Header.p_vaddr + Header.p_memsz);\n\n        // Only clear padding bytes if the section is writable\n        if (Header.p_flags & PF_W) {\n          memset((void*)BSSStart, 0, BSSPageStart - BSSStart);\n        }\n\n        if (BSSPageStart != BSSPageEnd) {\n          auto bss = Handler->GuestMmap(Thread, (void*)BSSPageStart, BSSPageEnd - BSSPageStart, MapProt, MapType | MAP_ANONYMOUS, -1, 0);\n          if (FEX::HLE::HasSyscallError(bss)) {\n            LogMan::Msg::EFmt(\"Failed to allocate BSS @ {}, {}\\n\", fmt::ptr(bss), errno);\n            return {};\n          }\n        }\n      }\n\n      if (NeedsLateBRKMap) {\n        // Keep track of highest address for BRK in the case of non-dynamic ELF files.\n        auto memend = LoadBase + Header.p_vaddr + Header.p_memsz;\n\n        // track elf_brk\n        if (memend > BrkLoadBase) {\n          BrkLoadBase = FEXCore::AlignUp(memend, FEXCore::Utils::FEX_PAGE_SIZE);\n        }\n      }\n    }\n\n    if (NeedsLateBRKMap) {\n      // Map the BRK after ELF if possible.\n      BrkLoadBase =\n        (uintptr_t)Handler->GuestMmap(Thread, reinterpret_cast<void*>(BrkLoadBase), BRK_SIZE, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);\n      if (FEX::HLE::HasSyscallError(BrkLoadBase)) {\n        // This isn't a catastrophic failure. This just means the BRK conflicted with the ELF.\n        BrkLoadBase = 0;\n      }\n    }\n\n    if (BrkBase) {\n      *BrkBase = BrkLoadBase;\n    }\n\n    return LoadBase;\n  }\n\n  static bool GetRandom(void* Data, size_t DataSize) {\n    ssize_t Result {};\n    do {\n      // This is guaranteed to not be interrupted by a signal,\n      // since fewer than 256 bytes of RNG data are requested\n      Result = getrandom(Data, DataSize, 0);\n    } while (Result != -1 && Result != DataSize);\n\n    return Result != -1;\n  }\n\npublic:\n\n  static fextl::string ResolveRootfsFile(const fextl::string& File, fextl::string RootFS) {\n    // If the path is relative then just run that\n    if (File[0] != '/') {\n      return File;\n    }\n\n    fextl::string RootFSLink = RootFS + File;\n\n    char Filename[PATH_MAX];\n    while (FHU::Symlinks::IsSymlink(RootFSLink.c_str())) {\n      // Do some special handling if the RootFS's linker is a symlink\n      // Ubuntu's rootFS by default provides an absolute location symlink to the linker\n      // Resolve this around back to the rootfs\n      auto SymlinkPath = FHU::Symlinks::ResolveSymlink(RootFSLink.c_str(), Filename);\n      if (SymlinkPath.starts_with('/')) {\n        RootFSLink = RootFS;\n        RootFSLink += SymlinkPath;\n      } else {\n        break;\n      }\n    }\n\n    return RootFSLink;\n  }\n\n  struct LoadedSection {\n    uintptr_t ElfBase;\n    uintptr_t Base;\n    size_t Size;\n    off_t Offs;\n    fextl::string Filename;\n    bool Executable;\n  };\n\n  fextl::vector<LoadedSection> Sections;\n\n  ELFCodeLoader(const fextl::string& Filename, int ProgramFDFromEnv, const fextl::string& RootFS, const fextl::vector<fextl::string>& args,\n                const fextl::vector<fextl::string>& ParsedArgs, char** const envp = nullptr,\n                FEXCore::Config::Value<FEXCore::Config::StringArrayType>* AdditionalEnvp = nullptr, bool SkipInterpreter = false) {\n    ApplicationArgs = args;\n\n    bool LoadedWithFD = false;\n    int FD = getauxval(AT_EXECFD);\n\n    if (ProgramFDFromEnv != -1) {\n      // If we passed the execve FD to us then use that.\n      FD = ProgramFDFromEnv;\n    }\n\n    // If we are provided an EXECFD then attempt to execute that first\n    // This happens in the case of binfmt_misc usage\n    if (FD != 0) {\n      if (!MainElf.ReadElf(FD)) {\n        return;\n      }\n      LoadedWithFD = true;\n    } else {\n      if (!MainElf.ReadElf(ResolveRootfsFile(Filename, RootFS)) && !MainElf.ReadElf(Filename)) {\n        return;\n      }\n    }\n\n    // If we have loaded with EXECFD then we have binfmt_misc preserve argv[0] also set\n    // This adds an additional argument to our argument list that we need to ignore\n    // argv[0] = FEX\n    // argv[1] = <Path to binary>\n    // argv[2] = <original user typed path to binary>\n    // If our kernel if v5.12 or higher then\n    // We can check if this exists by checking auxv[AT_FLAGS] for AT_FLAGS_PRESERVE_ARGV0\n    // Else we need to make an assumption that if we were loaded with FD that we have preserve enabled\n\n    uint64_t AtFlags = getauxval(AT_FLAGS);\n#ifndef AT_FLAGS_PRESERVE_ARGV0\n#define AT_FLAGS_PRESERVE_ARGV0 1\n#endif\n    uint32_t HostKernel = FEX::HLE::SyscallHandler::CalculateHostKernelVersion();\n    if ((HostKernel >= FEX::HLE::SyscallHandler::KernelVersion(5, 12, 0) && (AtFlags & AT_FLAGS_PRESERVE_ARGV0)) || LoadedWithFD) {\n\n      // Erase the initial argument from the list in this case\n      ApplicationArgs.erase(ApplicationArgs.begin());\n    }\n\n    // Append any additional arguments from config\n    const auto& AdditionalArgs = AdditionalArguments.All();\n    ApplicationArgs.insert(ApplicationArgs.end(), AdditionalArgs.begin(), AdditionalArgs.end());\n\n    if (!MainElf.InterpreterElf.empty() && !SkipInterpreter) {\n      if (!InterpElf.ReadElf(ResolveRootfsFile(MainElf.InterpreterElf, RootFS)) && !InterpElf.ReadElf(MainElf.InterpreterElf)) {\n        return;\n      }\n\n      if (!InterpElf.InterpreterElf.empty()) {\n        return;\n      }\n\n      if (InterpElf.type != MainElf.type) {\n        return;\n      }\n    }\n\n    ElfValid = true;\n\n    if (envp) {\n      // If we had envp passed in then make sure to set it up on the guest\n      for (size_t i = 0;; ++i) {\n        if (envp[i] == nullptr) {\n          break;\n        }\n        EnvironmentVariables.emplace_back(envp[i]);\n      }\n    }\n\n    if (AdditionalEnvp) {\n      const auto& EnvpList = AdditionalEnvp->All();\n      EnvironmentVariables.insert(EnvironmentVariables.end(), EnvpList.begin(), EnvpList.end());\n    }\n\n    if (InjectLibSegFault()) {\n      EnvironmentVariables.emplace_back(\"LD_PRELOAD=libSegFault.so\");\n    }\n\n    // Calculate argument and envp backing sizes\n    for (const auto& Arg : ApplicationArgs) {\n      ArgumentBackingSize += Arg.size() + 1;\n    }\n    for (const auto& EnvVar : EnvironmentVariables) {\n      EnvironmentBackingSize += EnvVar.size() + 1;\n    }\n\n    for (const auto& Arg : ParsedArgs) {\n      LoaderArgs.emplace_back(Arg.c_str());\n    }\n  }\n\n  void FreeSections() {\n    Sections.clear();\n  }\n\n  uint64_t StackSize() const override {\n    return STACK_SIZE;\n  }\n  uint64_t GetStackPointer() const override {\n    return StackPointer;\n  }\n  uint64_t DefaultRIP() const override {\n    return Entrypoint;\n  }\n\n  struct auxv32_t {\n    uint32_t key;\n    uint32_t val;\n  };\n\n  struct auxv_t {\n    uint64_t key;\n    uint64_t val;\n  };\n\n  int GetMainElfFD() const {\n    return MainElf.fd;\n  }\n\n  std::optional<uintptr_t> LoadMainElfFile(uintptr_t* BrkBase, FEX::HLE::SyscallMmapInterface* const Handler,\n                                           FEXCore::Core::InternalThreadState* Thread, uint64_t LoadHint = 0) {\n    return LoadElfFile(MainElf, BrkBase, Handler, Thread, LoadHint);\n  }\n\n  bool MapMemory(FEX::HLE::SyscallMmapInterface* const Handler, FEXCore::Core::InternalThreadState* Thread) {\n    for (const auto& Header : MainElf.phdrs) {\n      if (Header.p_type == PT_GNU_STACK) {\n        HasStackHeader = true;\n        if (Header.p_flags & PF_X) {\n          ExecutableStack = true;\n        }\n      }\n\n      // We ignore LOPROC..HIPROC here, kernel has a platform specific hook about it\n      // Both for the main and the interpreter elf\n    }\n\n    if (!HasStackHeader && !Is64BitMode()) {\n      // 32-bit behavior\n      ExecutableStack = true;\n      ExecuteAll = true;\n    }\n\n    // Set the process personality here\n    // Also, what about ADDR_LIMIT_3GB & co ?\n    uint32_t Personality = personality(~0ULL);\n    Personality |= ExecuteAll ? READ_IMPLIES_EXEC : 0;\n    if (-1 == personality(Personality)) {\n      LogMan::Msg::EFmt(\"Setting personality failed\");\n      return false;\n    }\n\n    if (Thread) {\n      // Update the thread persona.\n      auto ThreadObject = static_cast<FEX::HLE::ThreadStateObject*>(Thread->FrontendPtr);\n      ThreadObject->persona = Personality;\n    }\n\n    // What about ASLR and such ?\n    // ADDR_LIMIT_3GB STACK -> 0xc0000000 else -> 0xFFFFe000\n\n    // map stack here, so that nothing gets mapped there\n    // This works with both 64-bit and 32-bit. The mapper will only give us a function in the correct region\n    //\n    // MAP_GROWSDOWN is required here. The default stack pointer allocated by the kernel is mapped with it.\n    // Some libraries (like libfmod) will have a PT_GNU_STACK with executable stack bit set\n    // On dlopen glibc will check its current stack allocation permission bits (using internal expectations of allocation, not\n    // /proc/self/maps) If stack hasn't been allocated as executable then it will proceed to mprotect the range with the executable bit set\n    // Then it will mprotect the base stack page with `PROT_READ|PROT_WRITE|PROT_EXEC|PROT_GROWSDOWN`\n    // If the original stack memory region wasn't allocated with MAP_GROWSDOWN then the mprotect with PROT_GROWSDOWN will fail with EINVAL\n    //\n    // This is still technically a memory leak if the stack grows, but since the primary thread's stack only gets destroyed on process\n    // close, this is fine.\n\n    // Stacks need to be allocated at the hint location just like on a real x86 system.\n    // These are 128MB regions on both x86-64 and x86.\n    //\n    // These are required to be in the correct location taking up the appropriate 128MB of space, otherwise the wine preloader crashes FEX.\n    // This is due to the wine-preloader hardcoding addresses [0x7FFFFE000000 - 0x7FFFFFFF0000) as a top-down\n    // allocation region. They use mmap with MAP_FIXED, ignoring any previously mapped area at that location and overwriting it.\n    // Wine-preloader is expecting to allocate 32MB out of the total 128MB stack space in this case. Leaving 96MB for the application.\n    //\n    // If FEX doesn't allocate the stack in this region (nullptr mmap hint) then later allocations that FEX does will /eventually/\n    // end up inside of this address space that wine allocates. This usually ends up being a JIT CodeBuffer, which zeroes the memory and\n    // faults with a SIGILL.\n    //\n    // On the upside, this more accurately emulates how the kernel allocates stack space for the application when hinting at the location.\n    //\n    void* StackPointerBase {};\n    auto VASize = FEXCore::Allocator::DetermineVASize();\n    uint64_t StackHint {};\n    if (Is64BitMode()) {\n      if (VASize > 47) {\n        // If VA size is at least as large as minimum x86 specification, then set to max.\n        VASize = 47;\n      }\n\n      // Calculate the highest point the stack could go.\n      StackHint = (1ULL << VASize) - FULL_STACK_SIZE;\n    } else {\n      // Needs to be under the 4GB VA space.\n      StackHint = 0x1'0000'0000ULL - FULL_STACK_SIZE;\n    }\n\n    auto PageSize = sysconf(_SC_PAGESIZE);\n    PageSize = PageSize > 0 ? PageSize : FEXCore::Utils::FEX_PAGE_SIZE;\n\n    do {\n      // Allocate the base of the full 128MB stack range.\n      StackPointerBase = Handler->GuestMmap(Thread, reinterpret_cast<void*>(StackHint), FULL_STACK_SIZE, PROT_NONE,\n                                            MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK | MAP_GROWSDOWN | MAP_NORESERVE | MAP_FIXED_NOREPLACE, -1, 0);\n      // Scan-downward until we fit.\n      StackHint -= PageSize;\n    } while (FEX::HLE::HasSyscallError(StackPointerBase) && static_cast<int64_t>(StackHint) > 0);\n\n    if (FEX::HLE::HasSyscallError(StackPointerBase)) {\n      LogMan::Msg::EFmt(\"Allocating stack failed\");\n      return false;\n    }\n\n    // Allocate with permissions the 8MB of regular stack size.\n    StackPointer = reinterpret_cast<uintptr_t>(Handler->GuestMmap(\n      Thread, reinterpret_cast<void*>(reinterpret_cast<uint64_t>(StackPointerBase) + FULL_STACK_SIZE - StackSize()), StackSize(),\n      PROT_READ | PROT_WRITE | (ExecutableStack ? PROT_EXEC : 0), MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK | MAP_GROWSDOWN, -1, 0));\n\n    if (FEX::HLE::HasSyscallError(StackPointer)) {\n      LogMan::Msg::EFmt(\"Allocating stack failed\");\n      return false;\n    }\n\n    // Load the interpreter ELF first.\n    // This allows the top-down allocation of the kernel to put this at the top of the VA space.\n    // This matches behaviour of native execution more closely.\n    //\n    // eg:\n    // 555555554000-555555558000 r--p 00000000 103:0a 1311400                   /usr/bin/ls\n    // 555555558000-55555556c000 r-xp 00004000 103:0a 1311400                   /usr/bin/ls\n    // 55555556c000-555555574000 r--p 00018000 103:0a 1311400                   /usr/bin/ls\n    // 555555575000-555555577000 rw-p 00020000 103:0a 1311400                   /usr/bin/ls\n    // 555555577000-555555578000 rw-p 00000000 00:00 0                          [heap]\n    // 7ffff7fbb000-7ffff7fbd000 rw-p 00000000 00:00 0\n    // 7ffff7fbd000-7ffff7fc1000 r--p 00000000 00:00 0                          [vvar]\n    // 7ffff7fc1000-7ffff7fc3000 r-xp 00000000 00:00 0                          [vdso]\n    // 7ffff7fc3000-7ffff7fc5000 r--p 00000000 103:0a 1316948                   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2\n    // 7ffff7fc5000-7ffff7fef000 r-xp 00002000 103:0a 1316948                   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2\n    // 7ffff7fef000-7ffff7ffa000 r--p 0002c000 103:0a 1316948                   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2\n    // 7ffff7ffb000-7ffff7fff000 rw-p 00037000 103:0a 1316948                   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2\n    // 7ffffffdd000-7ffffffff000 rw-p 00000000 00:00 0                          [stack]\n    // ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0                  [vsyscall]\n    //\n    // ARM:\n    // 55ccaf8b1000-55ccaf8b5000 r--p 00000000 00:2a 4                          /tmp/.FEXMount178532-oiFrTF/usr/bin/ls\n    // 55ccaf8b5000-55ccaf8c9000 r-xp 00004000 00:2a 4                          /tmp/.FEXMount178532-oiFrTF/usr/bin/ls\n    // 55ccaf8c9000-55ccaf8d1000 r--p 00018000 00:2a 4                          /tmp/.FEXMount178532-oiFrTF/usr/bin/ls\n    // 55ccaf8d1000-55ccaf8d2000 ---p 00000000 00:00 0\n    // 55ccaf8d2000-55ccaf8d4000 rw-p 00020000 00:2a 4                          /tmp/.FEXMount178532-oiFrTF/usr/bin/ls\n    // 55ccaf8d4000-55ccb00d5000 rw-p 00000000 00:00 0\n    // <... Snip of misc allocations ...>\n    // 7fffff6c2000-7fffff6c4000 r--p 00000000 00:2a 22 /tmp/.FEXMount178532-oiFrTF/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 7fffff6c4000-7fffff6ee000\n    // r-xp 00002000 00:2a 22                         /tmp/.FEXMount178532-oiFrTF/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 7fffff6ee000-7fffff6f9000\n    // r--p 0002c000 00:2a 22                         /tmp/.FEXMount178532-oiFrTF/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 7fffff6f9000-7fffff6fa000\n    // ---p 00000000 00:00 0 7fffff6fa000-7fffff6fe000 rw-p 00037000 00:2a 22\n    // /tmp/.FEXMount178532-oiFrTF/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 7fffff7fe000-7fffffffe000 rw-p 00000000 00:00 0 7fffffffe000-7ffffffff000\n    // r--p 00000000 08:82 7082611                    /usr/share/fex-emu/GuestThunks/libVDSO-guest.so 7ffffffff000-800000000000 rw-p\n    // 00000000 00:00 0\n    uint64_t ELFLoadHint = 0;\n\n    if (!MainElf.InterpreterElf.empty()) {\n      uint64_t InterpLoadBase = 0;\n      if (auto elf = LoadElfFile(InterpElf, nullptr, Handler, Thread)) {\n        InterpLoadBase = *elf;\n      } else {\n        LogMan::Msg::EFmt(\"Failed to load interpreter elf file\");\n        return false;\n      }\n\n      InterpeterElfBase = InterpLoadBase + InterpElf.phdrs.front().p_vaddr - InterpElf.phdrs.front().p_offset;\n      Entrypoint = InterpLoadBase + InterpElf.ehdr.e_entry;\n\n      // If the ELF has an interpreter and is dynamic then we should provide a address hint for loading.\n      // The kernel calculates this `load_bias` by dividing the task size by three then multiplying by two.\n      // It then also offsets by a random number for ASLR purposes.\n      //\n      // Random number that gets added to the base needs to be in the number of bits (multiplied by pages):\n      // 64-bit: [28, 32] bits\n      // 32-bit: [8, 16] bits\n      // By default the /minimum/ number of bits is used here.\n      constexpr uint64_t TASK_SIZE_64 = (1ULL << 47);\n      constexpr uint64_t TASK_SIZE_32 = (1ULL << 32);\n      if (Is64BitMode()) {\n        // Ensure that if we are running on a 36-bit VA system, we don't try hinting that an ELF should\n        // live way outside the VA space.\n        uint64_t HostVASize = 1ULL << FEXCore::Allocator::DetermineVASize();\n        ELFLoadHint = std::min(HostVASize, TASK_SIZE_64) / 3 * 2;\n      } else {\n        ELFLoadHint = TASK_SIZE_32 / 3 * 2;\n      }\n#define ASLR_LOAD\n#ifdef ASLR_LOAD\n      // Only enable ASLR randomization if the personality has it enabled.\n      bool NoRandomize = (Personality & ADDR_NO_RANDOMIZE) == ADDR_NO_RANDOMIZE;\n\n      if (!NoRandomize) {\n        constexpr uint64_t ASLR_BITS_64 = 28;\n        constexpr uint64_t ASLR_BITS_32 = 8;\n        uint64_t ASLR_Offset {};\n        if (!GetRandom(&ASLR_Offset, sizeof(ASLR_Offset))) {\n          // getrandom failed for some reason.\n          ASLR_Offset = 0;\n          LogMan::Msg::EFmt(\"RNG failed. ASLR will not work.\");\n        }\n\n        if (Is64BitMode()) {\n          ASLR_Offset &= (1ULL << ASLR_BITS_64) - 1;\n        } else {\n          ASLR_Offset &= (1ULL << ASLR_BITS_32) - 1;\n        }\n\n        ASLR_Offset <<= FEXCore::Utils::FEX_PAGE_SHIFT;\n        ELFLoadHint += ASLR_Offset;\n      }\n#endif\n      // Align the mapping\n      ELFLoadHint &= FEXCore::Utils::FEX_PAGE_MASK;\n    }\n\n    // load the main elf\n\n    uintptr_t LoadBase = 0;\n\n    if (auto elf = LoadElfFile(MainElf, &BrkStart, Handler, Thread, ELFLoadHint)) {\n      LoadBase = *elf;\n      if (MainElf.ehdr.e_type == ET_DYN) {\n        BaseOffset = LoadBase;\n      }\n    } else {\n      LogMan::Msg::EFmt(\"Failed to load elf file\");\n      return false;\n    }\n\n    if (BrkStart) {\n      // BRK usually comes directly after where the ELF is loaded.\n      // If a value was returned then we have mapped the entire `BRK_SIZE` and need to change protections.\n      BrkStart =\n        (uint64_t)Handler->GuestMmap(Thread, (void*)BrkStart, BRK_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0);\n      if (FEX::HLE::HasSyscallError(BrkStart)) {\n        LogMan::Msg::EFmt(\"Failed to allocate BRK @ {:x}, {}\\n\", BrkStart, errno);\n        return false;\n      }\n    }\n\n    MainElfBase = LoadBase + MainElf.phdrs.front().p_vaddr - MainElf.phdrs.front().p_offset;\n    MainElfEntrypoint = LoadBase + MainElf.ehdr.e_entry;\n\n    if (MainElf.InterpreterElf.empty()) {\n      InterpeterElfBase = 0;\n      Entrypoint = MainElfEntrypoint;\n    }\n\n    // All done\n\n    // Setup AuxVars\n    AuxVariables.emplace_back(auxv_t {11, getauxval(AT_UID)});            // AT_UID\n    AuxVariables.emplace_back(auxv_t {12, getauxval(AT_EUID)});           // AT_EUID\n    AuxVariables.emplace_back(auxv_t {13, getauxval(AT_GID)});            // AT_GID\n    AuxVariables.emplace_back(auxv_t {14, getauxval(AT_EGID)});           // AT_EGID\n    AuxVariables.emplace_back(auxv_t {17, getauxval(AT_CLKTCK)});         // AT_CLKTIK\n    AuxVariables.emplace_back(auxv_t {6, FEXCore::Utils::FEX_PAGE_SIZE}); // AT_PAGESIZE\n    AuxRandom = &AuxVariables.emplace_back(auxv_t {25, ~0ULL});           // AT_RANDOM\n    AuxVariables.emplace_back(auxv_t {23, getauxval(AT_SECURE)});         // AT_SECURE\n    AuxVariables.emplace_back(auxv_t {8, 0});                             // AT_FLAGS\n    AuxVariables.emplace_back(auxv_t {5, MainElf.phdrs.size()});          // AT_PHNUM\n    AuxVariables.emplace_back(auxv_t {16, HWCap});                        // AT_HWCAP\n    AuxVariables.emplace_back(auxv_t {26, HWCap2});                       // AT_HWCAP2\n    AuxVariables.emplace_back(auxv_t {51, CalculateSignalStackSize()});   // AT_MINSIGSTKSZ\n    AuxPlatform = &AuxVariables.emplace_back(auxv_t {24, ~0ULL});         // AT_PLATFORM\n    AuxExecFN = &AuxVariables.emplace_back(auxv_t {AT_EXECFN, ~0ULL});    // AT_EXECFN\n\n    if (Is64BitMode()) {\n      AuxVariables.emplace_back(auxv_t {4, 0x38}); // AT_PHENT\n    } else {\n      AuxVariables.emplace_back(auxv_t {4, 0x20}); // AT_PHENT\n\n      auto VSyscallEntry = FEX::VDSO::GetVSyscallEntry(VDSOBase);\n      if (!VSyscallEntry) [[unlikely]] {\n        // If the VDSO thunk doesn't exist then we might not have a vsyscall entry.\n        // Newer glibc requires vsyscall to exist now. So let's allocate a buffer and stick a vsyscall in to it.\n        auto VSyscallPage =\n          Handler->GuestMmap(Thread, nullptr, FEXCore::Utils::FEX_PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);\n        constexpr static uint8_t VSyscallCode[] = {\n          0xcd, 0x80, // int 0x80\n          0xc3,       // ret\n        };\n        memcpy(VSyscallPage, VSyscallCode, sizeof(VSyscallCode));\n        mprotect(VSyscallPage, FEXCore::Utils::FEX_PAGE_SIZE, PROT_READ);\n        VSyscallEntry = reinterpret_cast<uint64_t>(VSyscallPage);\n      }\n\n      AuxVariables.emplace_back(auxv_t {32, VSyscallEntry}); // AT_SYSINFO - Entry point to syscall\n    }\n\n    if (VDSOBase) {\n      AuxVariables.emplace_back(auxv_t {33, reinterpret_cast<uint64_t>(VDSOBase)}); // AT_SYSINFO_EHDR - Address of the start of VDSO\n    }\n\n    AuxVariables.emplace_back(auxv_t {3, MainElfBase + MainElf.ehdr.e_phoff}); // Program header\n    AuxVariables.emplace_back(auxv_t {7, InterpeterElfBase});                  // AT_BASE - Interpreter address\n    AuxVariables.emplace_back(auxv_t {9, MainElfEntrypoint});                  // AT_ENTRY\n\n    AuxVariables.emplace_back(auxv_t {0, 0}); // Null ender\n\n    SetupStack();\n\n    return true;\n  }\n\n  void CloseFDs() {\n    MainElf.Closefd();\n    InterpElf.Closefd();\n  }\n\n  // Helper for stack setup\n  template<typename PointerType, typename AuxType, size_t PointerSize>\n  static void SetupPointers(uintptr_t StackPointer, uint64_t AuxVOffset, uint64_t ArgumentOffset, uint64_t EnvpOffset,\n                            const fextl::vector<fextl::string>& Args, const fextl::vector<fextl::string>& EnvironmentVariables,\n                            const fextl::list<auxv_t>& AuxVariables, uint64_t* AuxTabBase, uint64_t* AuxTabSize) {\n    // Pointer list offsets\n    PointerType* ArgumentPointers = reinterpret_cast<PointerType*>(StackPointer + PointerSize);\n    PointerType* PadPointers = reinterpret_cast<PointerType*>(StackPointer + PointerSize + Args.size() * PointerSize);\n    PointerType* EnvpPointers = reinterpret_cast<PointerType*>(StackPointer + PointerSize + Args.size() * PointerSize + PointerSize);\n    AuxType* AuxVPointers = reinterpret_cast<AuxType*>(StackPointer + AuxVOffset);\n\n    // Arguments memory lives after everything else\n    uint8_t* ArgumentBackingBase = reinterpret_cast<uint8_t*>(StackPointer + ArgumentOffset);\n    uint8_t* EnvpBackingBase = reinterpret_cast<uint8_t*>(StackPointer + EnvpOffset);\n    PointerType ArgumentBackingBaseGuest = StackPointer + ArgumentOffset;\n    PointerType EnvpBackingBaseGuest = StackPointer + EnvpOffset;\n\n    *reinterpret_cast<PointerType*>(StackPointer + 0) = Args.size();\n    PadPointers[0] = 0;\n\n    // If we don't have any, just make sure the first is nullptr\n    EnvpPointers[0] = 0;\n\n    uint64_t CurrentOffset = 0;\n    for (size_t i = 0; i < Args.size(); ++i) {\n      size_t ArgSize = Args[i].size();\n      // Set the pointer to this argument\n      ArgumentPointers[i] = ArgumentBackingBaseGuest + CurrentOffset;\n      if (ArgSize > 0) {\n        // Copy the string in to the final location\n        memcpy(reinterpret_cast<void*>(ArgumentBackingBase + CurrentOffset), Args[i].data(), ArgSize);\n      }\n\n      // Set the null terminator for the string\n      *reinterpret_cast<uint8_t*>(ArgumentBackingBase + CurrentOffset + ArgSize) = 0;\n\n      CurrentOffset += ArgSize + 1;\n    }\n\n    CurrentOffset = 0;\n    for (size_t i = 0; i < EnvironmentVariables.size(); ++i) {\n      size_t EnvpSize = EnvironmentVariables[i].size();\n      // Set the pointer to this argument\n      EnvpPointers[i] = EnvpBackingBaseGuest + CurrentOffset;\n\n      // Copy the string in to the final location\n      if (EnvpSize) {\n        memcpy(reinterpret_cast<void*>(EnvpBackingBase + CurrentOffset), EnvironmentVariables[i].data(), EnvpSize);\n      }\n\n      // Set the null terminator for the string\n      *reinterpret_cast<uint8_t*>(EnvpBackingBase + CurrentOffset + EnvpSize) = 0;\n\n      CurrentOffset += EnvpSize + 1;\n    }\n\n    // Last envp needs to be nullptr\n    EnvpPointers[EnvironmentVariables.size()] = 0;\n\n    for (size_t i = 0; const auto& Variable : AuxVariables) {\n      AuxVPointers[i].key = Variable.key;\n      AuxVPointers[i].val = Variable.val;\n      ++i;\n    }\n\n    *AuxTabBase = reinterpret_cast<uint64_t>(AuxVPointers);\n    *AuxTabSize = sizeof(AuxType) * AuxVariables.size();\n  }\n\n  // Get the current memory map from /proc/self/stat\n  static bool GetCurrentMap(struct prctl_mm_map& map) {\n\n    // /proc/self/stat has 52 fields of at most 20 digits each (UINT64_MAX).\n    // 52*20 = 1040, so 2048 is a conservative upper bound\n    char stat_buffer[2048];\n    ssize_t bytes_read = FEXCore::FileLoading::LoadFileToBuffer(\"/proc/self/stat\", stat_buffer);\n\n    // Ensure we don't read past the end into garbage data\n    stat_buffer[std::clamp(bytes_read, 0L, static_cast<ssize_t>(sizeof(stat_buffer)) - 1)] = '\\0';\n\n    // See man proc_pid_stat\n    int items_read = sscanf(stat_buffer,\n                            \"%*d %*s %*c %*d %*d \"      // 1 to 5\n                            \"%*d %*d %*d %*u %*u \"      // 6 to 10\n                            \"%*u %*u %*u %*u %*u \"      // 11 to 15\n                            \"%*d %*d %*d %*d %*d \"      // 16 to 20\n                            \"%*d %*u %*u %*d %*u \"      // 21 to 25\n                            \"%llu %llu %llu %*u %*u \"   // 26 to 30\n                            \"%*u %*u %*u %*u %*u \"      // 31 to 35\n                            \"%*u %*u %*d %*d %*u \"      // 36 to 40\n                            \"%*u %*u %*u %*d %llu \"     // 40 to 45\n                            \"%llu %llu %llu %llu %llu \" // 46 to 50\n                            \"%llu\",                     // 51\n                            &map.start_code, &map.end_code, &map.start_stack, &map.start_data, &map.end_data, &map.start_brk,\n                            &map.arg_start, &map.arg_end, &map.env_start, &map.env_end);\n\n    if (items_read != 10) {\n      return false;\n    }\n\n    map.brk = reinterpret_cast<uint64_t>(sbrk(0));\n\n    // The kernel will leave these values unchanged, see implementation in sys.c\n    map.auxv = NULL;\n    map.auxv_size = 0;\n    map.exe_fd = -1;\n\n    return true;\n  }\n\n  // Point the OS to our new stack's argument data\n  void RemapArgumentData(uintptr_t NewArgStart, uint64_t ArgSize) {\n    struct prctl_mm_map map {};\n    if (GetCurrentMap(map)) {\n      map.arg_start = NewArgStart;\n      map.arg_end = NewArgStart + ArgSize;\n\n      int r = prctl(PR_SET_MM, PR_SET_MM_MAP, &map, sizeof(map), 0L);\n      if (r != 0) {\n        LogMan::Msg::EFmt(\"Failed to remap /proc/pid/cmdline data (prctl failed: result {}, errno {})\", r, errno);\n      }\n    } else {\n      LogMan::Msg::EFmt(\"Failed to remap /proc/pid/cmdline data (GetCurrentMap failed)\");\n    }\n  }\n\n  // Setups the stack initial data (argv, envp, auxv)\n  void SetupStack() {\n    StackPointer += StackSize();\n    // Set up our initial CPU state\n    uint64_t SizeOfPointer = Is64BitMode() ? 8 : 4;\n\n    uint64_t TotalArgumentMemSize {};\n\n    TotalArgumentMemSize += SizeOfPointer;                               // Argument counter size\n    TotalArgumentMemSize += SizeOfPointer * ApplicationArgs.size();      // Pointers to strings\n    TotalArgumentMemSize += SizeOfPointer;                               // Padding for something\n    TotalArgumentMemSize += SizeOfPointer * EnvironmentVariables.size(); // Argument location for envp\n    TotalArgumentMemSize += SizeOfPointer;                               // envp nullptr ender\n\n    uint64_t AuxVOffset = TotalArgumentMemSize;\n    if (SizeOfPointer == 8) {\n      TotalArgumentMemSize += sizeof(auxv_t) * AuxVariables.size();\n    } else {\n      TotalArgumentMemSize += sizeof(auxv32_t) * AuxVariables.size();\n    }\n\n    ArgumentOffset = TotalArgumentMemSize;\n    TotalArgumentMemSize += ArgumentBackingSize;\n\n    uint64_t EnvpOffset = TotalArgumentMemSize;\n    TotalArgumentMemSize += EnvironmentBackingSize;\n\n    uint64_t PlatformNameLocation = TotalArgumentMemSize;\n    TotalArgumentMemSize += platform_string_max_size;\n\n    uint64_t ExecFNLocation = TotalArgumentMemSize;\n    TotalArgumentMemSize += ApplicationArgs[0].size() + 1;\n\n    // Align the argument block to 16 bytes to keep the stack aligned\n    TotalArgumentMemSize = FEXCore::AlignUp(TotalArgumentMemSize, 16);\n\n    // Random number location\n    uint64_t RandomNumberLocation = TotalArgumentMemSize;\n    TotalArgumentMemSize += 16;\n\n    // Offset the stack by how much memory we need\n    StackPointer -= TotalArgumentMemSize;\n\n    // Setup our AUXP values that need memory now that the stack is setup\n    AuxPlatform->val = StackPointer + PlatformNameLocation;\n    char* PlatformLoc = reinterpret_cast<char*>(AuxPlatform->val);\n    memset(PlatformLoc, 0, platform_string_max_size);\n    if (Is64BitMode()) {\n      strncpy(PlatformLoc, platform_name_x86_64.data(), platform_string_max_size);\n    } else {\n      strncpy(PlatformLoc, platform_name_i686.data(), platform_string_max_size);\n    }\n\n    // Random value is always 128bits\n    AuxRandom->val = StackPointer + RandomNumberLocation;\n    uint64_t* RandomLoc = reinterpret_cast<uint64_t*>(AuxRandom->val);\n    uint64_t* HostRandom = reinterpret_cast<uint64_t*>(getauxval(AT_RANDOM));\n    if (HostRandom) {\n      // Pass through the host's random values\n      RandomLoc[0] = HostRandom[0];\n      RandomLoc[1] = HostRandom[1];\n    } else {\n      // Nothing provided from the kernel, generate our own random values.\n      if (!GetRandom(&RandomLoc[0], sizeof(uint64_t) * 2)) {\n        // getrandom failed for some reason.\n        RandomLoc[0] = 0;\n        RandomLoc[1] = 0;\n        LogMan::Msg::EFmt(\"RNG failed. AT_RANDOM will not be random.\");\n      }\n    }\n\n    // Setup ExecFN aux\n    AuxExecFN->val = StackPointer + ExecFNLocation;\n    const auto InvocationName = reinterpret_cast<char*>(AuxExecFN->val);\n    strncpy(InvocationName, ApplicationArgs[0].c_str(), ApplicationArgs[0].size() + 1);\n\n    // Stack setup\n    // [0, 8):   Argument Count\n    // [8, 16):  Argument Pointer 0\n    // [16, 24): Argument Pointer 1\n    // ....\n    // [Pad1, +8): Some Pointer\n    // [envp, +8): envp pointer\n    // [Pad2End, +8): Argument String 0\n    // [+8, +8): String 1\n    // ...\n    // [argvend, +8): envp[0]\n    // ...\n    // [envpend, +8): nullptr\n\n    if (SizeOfPointer == 8) {\n      SetupPointers<uint64_t, auxv_t, 8>(StackPointer, AuxVOffset, ArgumentOffset, EnvpOffset, ApplicationArgs, EnvironmentVariables,\n                                         AuxVariables, &AuxTabBase, &AuxTabSize);\n    } else {\n      SetupPointers<uint32_t, auxv32_t, 4>(StackPointer, AuxVOffset, ArgumentOffset, EnvpOffset, ApplicationArgs, EnvironmentVariables,\n                                           AuxVariables, &AuxTabBase, &AuxTabSize);\n    }\n\n    RemapArgumentData(StackPointer + ArgumentOffset, ArgumentBackingSize);\n#if defined(HAS_PROGRAM_INVOCATION_NAME) && HAS_PROGRAM_INVOCATION_NAME\n    // Set the glibc invocation names to the process name.\n    // Mesa uses this to determine application profiles.\n    // Necessary when thunking is enabled otherwise mesa would only see FEX.\n\n    std::string_view INV = std::string_view(InvocationName, ApplicationArgs[0].size());\n    auto short_name = InvocationName;\n    auto iter = INV.rfind('/');\n    if (iter != INV.npos) {\n      short_name = &InvocationName[iter + 1];\n    }\n\n    program_invocation_name = InvocationName;\n    program_invocation_short_name = short_name;\n#endif\n  }\n\n  fextl::vector<const char*> GetExecveArguments() const override {\n    return LoaderArgs;\n  }\n\n  AuxvResult GetAuxv() const override {\n    return {\n      .address = AuxTabBase,\n      .size = AuxTabSize,\n    };\n  }\n\n  uint64_t GetBaseOffset() const override {\n    return BaseOffset;\n  }\n\n  uint64_t GetMainElfBase() const {\n    return MainElfBase;\n  }\n\n  bool Is64BitMode() const {\n    return MainElf.type == ::ELFLoader::ELFContainer::TYPE_X86_64;\n  }\n\n  ::ELFLoader::ELFContainer::BRKInfo GetBRKInfo() {\n    return ::ELFLoader::ELFContainer::BRKInfo {BrkStart, BRK_SIZE};\n  }\n\n  bool ELFWasLoaded() {\n    return ElfValid;\n  }\n\n  void SetVDSOBase(void* Base) {\n    VDSOBase = Base;\n  }\n\n  void CalculateHWCaps(FEXCore::Context::Context* ctx) {\n    // HWCAP is just CPUID function 0x1, the EDX result\n    auto res_1 = ctx->RunCPUIDFunction(1, 0);\n    auto res_7 = ctx->RunCPUIDFunction(7, 0);\n\n    HWCap = res_1.edx;\n\n    // HWCAP2 is as follows:\n    // Bits:\n    // 0 - MONITOR/MWAIT available in CPL3\n    // 1 - FSGSBASE instructions available in CPL3\n    HWCap2 = (res_7.ebx & 1) ? (1U << 1) : 0; // FSGSBase is exposed if CPUID_7_ebx[0] is set.\n\n    // We need to know if we support AVX for AT_MINSIGSTKSZ\n    SupportsAVX = !!(res_1.ecx & (1U << 28));\n  }\n\n  uint64_t CalculateSignalStackSize() const {\n    // We must calculate the required signal stack size that the \"kernel\" consumes.\n    // For FEX this means the amount of state we store in to the guest stack, not including the amount\n    // that FEX stores in to the host stack as well.\n    //\n    // This needs to match what we do in FEXCore's dispatcher (Which should at some point be moved to the frontend).\n    //\n    // This roughly means that we need to calculate the combined size of:\n    // - xstate or _libc_fstate depending on AVX support\n    // - ucontext_t\n    // - siginfo_t\n    // Size of state requiring to be stored is different between 32-bit and 64-bit.\n\n    uint64_t Result {};\n    if (Is64BitMode()) {\n      Result += sizeof(FEXCore::x86_64::ucontext_t);\n      Result = FEXCore::AlignUp(Result, alignof(FEXCore::x86_64::ucontext_t));\n      if (SupportsAVX) {\n        Result += sizeof(FEXCore::x86_64::xstate);\n        Result = FEXCore::AlignUp(Result, alignof(FEXCore::x86_64::xstate));\n      } else {\n        Result += sizeof(FEXCore::x86_64::_libc_fpstate);\n        Result = FEXCore::AlignUp(Result, alignof(FEXCore::x86_64::_libc_fpstate));\n      }\n\n      Result += sizeof(siginfo_t);\n      Result = FEXCore::AlignUp(Result, alignof(siginfo_t));\n    } else {\n      Result += sizeof(FEXCore::x86::ucontext_t);\n      Result = FEXCore::AlignUp(Result, alignof(FEXCore::x86::ucontext_t));\n      if (SupportsAVX) {\n        Result += sizeof(FEXCore::x86::xstate);\n        Result = FEXCore::AlignUp(Result, alignof(FEXCore::x86::xstate));\n      } else {\n        Result += sizeof(FEXCore::x86::_libc_fpstate);\n        Result = FEXCore::AlignUp(Result, alignof(FEXCore::x86::_libc_fpstate));\n      }\n\n      Result += sizeof(FEXCore::x86::siginfo_t);\n      Result = FEXCore::AlignUp(Result, alignof(FEXCore::x86::siginfo_t));\n    }\n\n    return Result;\n  }\n\n  constexpr static uint64_t BRK_SIZE = 8 * 1024 * 1024;\n  constexpr static uint64_t STACK_SIZE = 8 * 1024 * 1024;\n  constexpr static uint64_t FULL_STACK_SIZE = 128 * 1024 * 1024;\n\n  fextl::vector<fextl::string> EnvironmentVariables;\n  fextl::vector<const char*> LoaderArgs;\n\n  fextl::list<auxv_t> AuxVariables;\n  uint64_t AuxTabBase {}, AuxTabSize {};\n  uint64_t ArgumentBackingSize {};\n  uint64_t ArgumentOffset {};\n  uint64_t EnvironmentBackingSize {};\n  uint64_t BaseOffset {};\n  void* VDSOBase {};\n  uint64_t HWCap {};\n  uint64_t HWCap2 {};\n  bool SupportsAVX {};\n\n  auxv_t* AuxRandom {};\n  auxv_t* AuxPlatform {};\n  auxv_t* AuxExecFN {};\n\n  static constexpr std::string_view platform_name_x86_64 = \"x86_64\";\n  static constexpr std::string_view platform_name_i686 = \"i686\";\n  // Need to include null character.\n  static constexpr size_t platform_string_max_size = std::max(platform_name_x86_64.size(), platform_name_i686.size()) + 1;\n\n  FEX_CONFIG_OPT(AdditionalArguments, ADDITIONALARGUMENTS);\n  FEX_CONFIG_OPT(InjectLibSegFault, INJECTLIBSEGFAULT);\n};\n"
  },
  {
    "path": "Source/Tools/FEXInterpreter/FEXInterpreter.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: Bin|FEX\ndesc: Glues the ELF loader, FEXCore and LinuxSyscalls to launch an elf under fex\n$end_info$\n*/\n\n#include \"Common/ArgumentLoader.h\"\n#include \"Common/FEXServerClient.h\"\n#include \"Common/Config.h\"\n#include \"Common/HostFeatures.h\"\n#include \"Common/Linux/SBRKAllocations.h\"\n#include \"PortabilityInfo.h\"\n#include \"ELFCodeLoader.h\"\n#include \"VDSO_Emulation.h\"\n#include \"LinuxSyscalls/GdbServer.h\"\n#include \"LinuxSyscalls/LinuxAllocator.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/Utils/Threads.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/SignalDelegator.h\"\n#include \"Linux/Utils/ELFContainer.h\"\n#include \"Thunks.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/FileLoading.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/Telemetry.h>\n#include <FEXCore/Utils/Threads.h>\n#include <FEXCore/Utils/PrctlUtils.h>\n#include <FEXCore/Utils/Profiler.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/sstream.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXHeaderUtils/Filesystem.h>\n#include <FEXHeaderUtils/StringArgumentParser.h>\n\n#include <atomic>\n#include <cerrno>\n#include <cstdint>\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n#include <elf.h>\n#include <fcntl.h>\n#include <mutex>\n#include <queue>\n#include <set>\n#include <sys/auxv.h>\n#include <sys/prctl.h>\n#include <sys/resource.h>\n#include <sys/select.h>\n#include <system_error>\n#include <thread>\n#include <unistd.h>\n#include <utility>\n\n#include <sys/sysinfo.h>\n#include <sys/signal.h>\n\nnamespace FEX::Logging {\nstatic bool SilentLog {};\nstatic int OutputFD {STDERR_FILENO};\n\n// Set an empty style to disable coloring when FEXServer output is e.g. piped to a file\nstatic bool DisableOutputColors {};\n\nvoid MsgHandler(LogMan::DebugLevels Level, const char* Message) {\n  if (SilentLog) {\n    return;\n  }\n\n  const auto Style = DisableOutputColors ? fmt::text_style {} : LogMan::DebugLevelStyle(Level);\n  const auto Output = fextl::fmt::format(\"{} {}\\n\", fmt::styled(LogMan::DebugLevelStr(Level), Style), Message);\n  write(OutputFD, Output.c_str(), Output.size());\n  fsync(OutputFD);\n}\n\nvoid AssertHandler(const char* Message) {\n  return MsgHandler(LogMan::ASSERT, Message);\n}\n\nnamespace FEXServer {\n  static int FEXServerFD {-1};\n\n  void MsgHandler(LogMan::DebugLevels Level, const char* Message) {\n    FEXServerClient::MsgHandler(FEXServerFD, Level, Message);\n  }\n\n  void AssertHandler(const char* Message) {\n    FEXServerClient::AssertHandler(FEXServerFD, Message);\n  }\n} // namespace FEXServer\n\nvoid Init() {\n  FEX_CONFIG_OPT(SilentLog, SILENTLOG);\n  FEX_CONFIG_OPT(OutputLog, OUTPUTLOG);\n  FEX::Logging::SilentLog = SilentLog();\n\n  if (SilentLog()) {\n    LogMan::Throw::UnInstallHandler();\n    LogMan::Msg::UnInstallHandler();\n  } else {\n    const auto& LogFile = OutputLog();\n    // If stderr or stdout then we need to dup the FD\n    // In some cases some applications will close stderr and stdout\n    // then redirect the FD to either a log OR some cases just not use\n    // stderr/stdout and the FD will be reused for regular FD ops.\n    //\n    // We want to maintain the original output location otherwise we\n    // can run in to problems of writing to some file\n    auto LogFD = OutputFD;\n    if (LogFile == \"stderr\") {\n      LogFD = dup(STDERR_FILENO);\n    } else if (LogFile == \"server\") {\n      Logging::FEXServer::FEXServerFD = FEXServerClient::RequestLogFD(FEXServerClient::GetServerFD());\n      if (FEXServer::FEXServerFD != -1) {\n        LogMan::Throw::InstallHandler(Logging::FEXServer::AssertHandler);\n        LogMan::Msg::InstallHandler(Logging::FEXServer::MsgHandler);\n      }\n    } else if (!LogFile.empty()) {\n      constexpr int USER_PERMS = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;\n      LogFD = open(LogFile.c_str(), O_CREAT | O_CLOEXEC | O_WRONLY, USER_PERMS);\n    }\n\n    if (LogFD == -1) {\n      LogMan::Msg::EFmt(\"Couldn't open log file. Going Silent.\");\n      Logging::SilentLog = true;\n    } else {\n      OutputFD = LogFD;\n    }\n  }\n  DisableOutputColors = !isatty(OutputFD);\n}\n\n} // namespace FEX::Logging\n\nnamespace FEX::Allocator {\n\nfextl::vector<FEXCore::Allocator::MemoryRegion> InitMemoryRegions(bool Is64Bit) {\n  const auto PageSize = sysconf(_SC_PAGESIZE);\n  if (Is64Bit) {\n    // Destroy the 48th bit if it exists\n    return FEXCore::Allocator::Setup48BitAllocatorIfExists(PageSize > 0 ? PageSize : FEXCore::Utils::FEX_PAGE_SIZE);\n  }\n\n  // Reserve [0x1_0000_0000, 0x2_0000_0000).\n  // Safety net if 32-bit address calculation overflows in to 64-bit range.\n  constexpr uint64_t First64BitAddr = 0x1'0000'0000ULL;\n  return FEXCore::Allocator::StealMemoryRegion(First64BitAddr, First64BitAddr + First64BitAddr);\n}\n\nfextl::unique_ptr<FEX::HLE::MemAllocator> InitAllocator(bool Is64Bit) {\n  if (Is64Bit) {\n    return {};\n  }\n\n  const auto PageSize = sysconf(_SC_PAGESIZE);\n\n  // Setup our userspace allocator\n  FEXCore::Allocator::SetupHooks(PageSize > 0 ? PageSize : FEXCore::Utils::FEX_PAGE_SIZE);\n  auto Allocator = FEX::HLE::CreatePassthroughAllocator();\n\n  // Now that the upper 32-bit address space is blocked for future allocations,\n  // exhaust all of jemalloc's remaining internal allocations that it reserved before.\n  // TODO: It's unclear how reliably this exhausts those reserves\n  // TODO: This will likely consume one arena inside the 32-bit VA space.\n  //   - (HdkR): I've noticed jemalloc consuming an 8MB arena commonly.\n  FEXCore::Allocator::YesIKnowImNotSupposedToUseTheGlibcAllocator glibc;\n  void* data;\n  do {\n    data = malloc(0x1);\n  } while (reinterpret_cast<uintptr_t>(data) >> 32 != 0);\n  free(data);\n\n  return Allocator;\n}\n\nvoid Shutdown(fextl::vector<FEXCore::Allocator::MemoryRegion>&& MemoryRegions) {\n  FEXCore::Allocator::ClearHooks();\n  FEXCore::Allocator::ReclaimMemoryRegion(MemoryRegions);\n}\n} // namespace FEX::Allocator\n\nbool InterpreterHandler(fextl::string* Filename, const fextl::string& RootFS, fextl::vector<fextl::string>* args) {\n  int FD {-1};\n\n  // Attempt to open the filename from the rootfs first.\n  FD = open(fextl::fmt::format(\"{}{}\", RootFS, *Filename).c_str(), O_RDONLY | O_CLOEXEC);\n  if (FD == -1) {\n    // Failing that, attempt to open the filename directly.\n    FD = open(Filename->c_str(), O_RDONLY | O_CLOEXEC);\n    if (FD == -1) {\n      return false;\n    }\n  }\n\n  std::array<char, 257> Header;\n  const auto ChunkSize = 257l;\n  const auto ReadSize = pread(FD, Header.data(), ChunkSize, 0);\n  close(FD);\n\n  const auto Data = std::span<char>(Header.data(), ReadSize);\n\n  // Is the file large enough for shebang\n  if (ReadSize <= 2) {\n    return false;\n  }\n\n  // Handle shebang files\n  if (Data[0] == '#' && Data[1] == '!') {\n    std::string_view InterpreterLine {Data.begin() + 2, // strip off \"#!\" prefix\n                                      std::find(Data.begin(), Data.end(), '\\n')};\n    const auto ShebangArguments = FHU::ParseArgumentsFromString(InterpreterLine);\n\n    // Executable argument\n    *Filename = ShebangArguments.at(0);\n\n    // Insert all the arguments at the start\n    args->insert(args->begin(), ShebangArguments.begin(), ShebangArguments.end());\n  }\n  return true;\n}\n\n/**\n * @brief Queries if FEX is installed as a binfmt_misc interpreter\n *\n * @param ExecutedWithFD If FEX was executed using a binfmt_misc FD handle from the kernel\n * @param Portable Portability information about FEX being run in portable mode\n *\n * @return true if the binfmt_misc handlers are installed and being used\n */\nbool QueryInterpreterInstalled(bool ExecutedWithFD, const FEX::Config::PortableInformation& Portable) {\n  if (Portable.IsPortable) {\n    // Don't use binfmt interpreter even if it's installed\n    return false;\n  }\n\n  // Check if FEX's binfmt_misc handlers are both installed.\n  // The explicit check can be omitted if FEX was executed from an FD,\n  // since this only happens if the kernel launched FEX through binfmt_misc\n  return ExecutedWithFD || (access(\"/proc/sys/fs/binfmt_misc/FEX-x86\", F_OK) == 0 && access(\"/proc/sys/fs/binfmt_misc/FEX-x86_64\", F_OK) == 0);\n}\n\nnamespace FEX::Kernel {\nnamespace TSO {\n  void SetupTSOEmulation(FEXCore::Context::Context* CTX) {\n    // Check to see if this is supported.\n    auto Result = prctl(PR_GET_MEM_MODEL, 0, 0, 0, 0);\n    if (Result == -1) {\n      // Unsupported, early exit.\n      return;\n    }\n\n    FEX_CONFIG_OPT(TSOEnabled, TSOENABLED);\n\n    if (!TSOEnabled()) {\n      // TSO emulation isn't even enabled, early exit.\n      return;\n    }\n\n    if (Result == PR_SET_MEM_MODEL_DEFAULT) {\n      // Try to set the TSO mode if we are currently default.\n      Result = prctl(PR_SET_MEM_MODEL, PR_SET_MEM_MODEL_TSO, 0, 0, 0);\n      if (Result == 0) {\n        // TSO mode successfully enabled. Tell the context to disable TSO emulation through atomics.\n        // This flag gets inherited on thread creation, so FEX only needs to set it at the start.\n        CTX->SetHardwareTSOSupport(true);\n      }\n    }\n  }\n} // namespace TSO\n\nnamespace CompatInput {\n  void SetupCompatInput(bool enable) {\n    // Check to see if this is supported.\n    auto Result = prctl(PR_GET_COMPAT_INPUT, 0, 0, 0, 0);\n    if (Result == -1) {\n      // Unsupported, early exit.\n      return;\n    }\n\n    if (enable) {\n      prctl(PR_SET_COMPAT_INPUT, PR_SET_COMPAT_INPUT_ENABLE, 0, 0, 0);\n    } else {\n      prctl(PR_SET_COMPAT_INPUT, PR_SET_COMPAT_INPUT_DISABLE, 0, 0, 0);\n    }\n  }\n} // namespace CompatInput\n\nnamespace GCS {\n  void CheckForGCS() {\n    uint64_t ShadowStackWord {};\n    if (prctl(PR_GET_SHADOW_STACK_STATUS, &ShadowStackWord, 0, 0, 0) == -1) {\n      return;\n    }\n\n    // Kernel supports shadow stack.\n    if (ShadowStackWord & PR_SHADOW_STACK_ENABLE) {\n      // Welp.\n      ERROR_AND_DIE_FMT(\"Shadow stack is enabled which FEX is incompatible with!\");\n    }\n\n    // Disable if we've gotten this far, to ensure guest can't try.\n    prctl(PR_LOCK_SHADOW_STACK_STATUS, ~0ULL, 0, 0, 0);\n  }\n} // namespace GCS\n\nnamespace UnalignedAtomic {\n  void SetupKernelUnalignedAtomics() {\n#ifndef PR_ARM64_SET_UNALIGN_ATOMIC\n#define PR_ARM64_SET_UNALIGN_ATOMIC 0x46455849\n#define PR_ARM64_UNALIGN_ATOMIC_EMULATE (1UL << 0)\n#define PR_ARM64_UNALIGN_ATOMIC_BACKPATCH (1UL << 1)\n#define PR_ARM64_UNALIGN_ATOMIC_STRICT_SPLIT_LOCKS (1UL << 2)\n#endif\n\n    // Interfaces with downstream FEX kernel patches to control unaligned atomic handling\n    FEX_CONFIG_OPT(StrictInProcessSplitLocks, STRICTINPROCESSSPLITLOCKS);\n    FEX_CONFIG_OPT(KernelUnalignedAtomicBackpatching, KERNELUNALIGNEDATOMICBACKPATCHING);\n\n    uint64_t Flags = (StrictInProcessSplitLocks() ? PR_ARM64_UNALIGN_ATOMIC_STRICT_SPLIT_LOCKS : 0) |\n                     (KernelUnalignedAtomicBackpatching() ? PR_ARM64_UNALIGN_ATOMIC_BACKPATCH : 0) | PR_ARM64_UNALIGN_ATOMIC_EMULATE;\n\n    prctl(PR_ARM64_SET_UNALIGN_ATOMIC, Flags, 0, 0, 0);\n  }\n} // namespace UnalignedAtomic\n\nvoid Init(bool Is64Bit, FEXCore::Context::Context* CTX) {\n  // Setup TSO hardware emulation immediately after initializing the context.\n  TSO::SetupTSOEmulation(CTX);\n  UnalignedAtomic::SetupKernelUnalignedAtomics();\n\n  if (!Is64Bit) {\n    // Tell the kernel we want to use the compat input syscalls even though we're\n    // a 64 bit process.\n    CompatInput::SetupCompatInput(true);\n  } else {\n    // Our parent could be an instance running a 32 bit application, so we need\n    // to disable compat input if we're running a 64 bit one ourselves.\n    CompatInput::SetupCompatInput(false);\n  }\n}\n\n} // namespace FEX::Kernel\n\n/**\n * @brief Get an FD from an environment variable and then unset the environment variable.\n *\n * @param Env The environment variable to extract the FD from.\n *\n * @return -1 if the variable didn't exist.\n */\nstatic int StealFEXFDFromEnv(const char* Env) {\n  int FEXFD {-1};\n  const char* FEXFDStr = getenv(Env);\n  if (FEXFDStr) {\n    const std::string_view FEXFDView {FEXFDStr};\n    std::from_chars(FEXFDView.data(), FEXFDView.data() + FEXFDView.size(), FEXFD, 10);\n    unsetenv(Env);\n  }\n  return FEXFD;\n}\n\nint main(int argc, char** argv, char** const envp) {\n  auto SBRKPointer = FEX::SBRKAllocations::DisableSBRKAllocations();\n  FEXCore::Allocator::GLIBCScopedFault GLIBFaultScope;\n\n  const bool ExecutedWithFD = getauxval(AT_EXECFD) != 0;\n  const auto PortableInfo = FEX::ReadPortabilityInformation();\n  const bool InterpreterInstalled = QueryInterpreterInstalled(ExecutedWithFD, PortableInfo);\n\n  int FEXFD {StealFEXFDFromEnv(\"FEX_EXECVEFD\")};\n  int FEXSeccompFD {StealFEXFDFromEnv(\"FEX_SECCOMPFD\")};\n\n  // Early init trivial handlers.\n  LogMan::Throw::InstallHandler(FEX::Logging::AssertHandler);\n  LogMan::Msg::InstallHandler(FEX::Logging::MsgHandler);\n\n  auto ArgsLoader = fextl::make_unique<FEX::ArgLoader::ArgLoader>(argc, argv);\n  auto Args = ArgsLoader->Get();\n  auto ParsedArgs = ArgsLoader->GetParsedArgs();\n  auto Program = FEX::Config::GetApplicationNames(Args, ExecutedWithFD, FEXFD);\n  if (Program.ProgramPath.empty() && FEXFD == -1) {\n    // Early exit if we weren't passed an argument\n    return 0;\n  }\n\n  FEX::Kernel::GCS::CheckForGCS();\n\n  FEX::Config::LoadConfig(Program.ProgramName, envp, PortableInfo);\n\n  // Reload the meta layer\n  FEXCore::Config::ReloadMetaLayer();\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_INTERPRETER_INSTALLED, InterpreterInstalled ? \"1\" : \"0\");\n#ifdef VIXL_SIMULATOR\n  // If running under the vixl simulator, ensure that indirect runtime calls are enabled.\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_DISABLE_VIXL_INDIRECT_RUNTIME_CALLS, \"0\");\n#endif\n\n  if (FEXSeccompFD != -1) {\n    // seccomp inheritance happens unconditionally.\n    FEXCore::Config::Set(FEXCore::Config::CONFIG_NEEDSSECCOMP, \"1\");\n  }\n\n  // Early check for process stall\n  // Doesn't use CONFIG_ROOTFS and we don't want it to spin up a squashfs instance\n  FEX_CONFIG_OPT(StallProcess, STALLPROCESS);\n  FEX_CONFIG_OPT(StartupSleep, STARTUPSLEEP);\n  FEX_CONFIG_OPT(StartupSleepProcName, STARTUPSLEEPPROCNAME);\n  if (StallProcess) {\n    while (1) {\n      // Stall this process out forever\n      select(0, nullptr, nullptr, nullptr, nullptr);\n    }\n  }\n\n  // Ensure FEXServer is setup before config options try to pull CONFIG_ROOTFS\n  auto SelfPath = FEX::GetSelfPath();\n  if (!FEXServerClient::SetupClient(SelfPath.value_or(argv[0]))) {\n    LogMan::Msg::EFmt(\"FEXServerClient: Failure to setup client\");\n    return -1;\n  }\n\n  FEX_CONFIG_OPT(LDPath, ROOTFS);\n  FEX_CONFIG_OPT(Environment, ENV);\n  FEX_CONFIG_OPT(HostEnvironment, HOSTENV);\n\n  FEX::Logging::Init();\n\n  if (StartupSleep() && (StartupSleepProcName().empty() || Program.ProgramName == StartupSleepProcName())) {\n    LogMan::Msg::IFmt(\"[{}][{}] Sleeping for {} seconds\", ::getpid(), Program.ProgramName, StartupSleep());\n    std::this_thread::sleep_for(std::chrono::seconds(StartupSleep()));\n  }\n\n  FEXCore::Telemetry::Initialize();\n\n  if (!LDPath().empty() && Program.ProgramPath.starts_with(LDPath())) {\n    // From this point on, ProgramPath needs to not have the LDPath prefixed on to it.\n    auto RootFSLength = LDPath().size();\n    if (Program.ProgramPath.at(RootFSLength) != '/') {\n      // Ensure the modified path starts as an absolute path.\n      // This edge case can occur when ROOTFS ends with '/' and passed a path like `<ROOTFS>usr/bin/true`.\n      --RootFSLength;\n    }\n\n    Program.ProgramPath.erase(0, RootFSLength);\n  }\n\n  bool ProgramExists = InterpreterHandler(&Program.ProgramPath, LDPath(), &Args);\n\n  if (!ExecutedWithFD && FEXFD == -1 && !ProgramExists) {\n    // Early exit if the program passed in doesn't exist\n    // Will prevent a crash later\n    fextl::fmt::print(stderr, \"{}: command not found\\n\", Program.ProgramPath);\n    return -ENOEXEC;\n  }\n\n  uint32_t KernelVersion = FEX::HLE::SyscallHandler::CalculateHostKernelVersion();\n  if (KernelVersion < FEX::HLE::SyscallHandler::KernelVersion(5, 15)) {\n    LogMan::Msg::EFmt(\"FEX requires kernel 5.15 minimum. Expect problems.\");\n  }\n\n  // Before we go any further, set all of our host environment variables that the config has provided\n  for (auto& HostEnv : HostEnvironment.All()) {\n    // We are going to keep these alive in memory.\n    // No need to split the string with setenv\n    putenv(HostEnv.data());\n  }\n\n  ELFCodeLoader Loader {Program.ProgramPath, FEXFD, LDPath(), Args, ParsedArgs, envp, &Environment};\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_IS64BIT_MODE, Loader.Is64BitMode() ? \"1\" : \"0\");\n\n  if (!Loader.ELFWasLoaded()) {\n    // Loader couldn't load this program for some reason\n    fextl::fmt::print(stderr, \"Invalid or Unsupported elf file.\\n\");\n#ifdef ARCHITECTURE_arm64\n    fextl::fmt::print(stderr, \"This is likely due to a misconfigured x86-64 RootFS\\n\");\n    fextl::fmt::print(stderr, \"Current RootFS path set to '{}'\\n\", LDPath());\n    if (LDPath().empty() || FHU::Filesystem::Exists(LDPath()) == false) {\n      fextl::fmt::print(stderr, \"RootFS path doesn't exist. This is required on AArch64 hosts\\n\");\n      fextl::fmt::print(stderr, \"Use FEXRootFSFetcher to download a RootFS\\n\");\n    }\n#endif\n    return -ENOEXEC;\n  }\n\n  if (ExecutedWithFD) {\n    // Don't need to canonicalize Program.ProgramPath, Config loader will have resolved this already.\n    FEXCore::Config::Set(FEXCore::Config::CONFIG_APP_FILENAME, Program.ProgramPath);\n    FEXCore::Config::Set(FEXCore::Config::CONFIG_APP_CONFIG_NAME, Program.ProgramName);\n  } else if (FEXFD != -1) {\n    // Anonymous program.\n    FEXCore::Config::Set(FEXCore::Config::CONFIG_APP_FILENAME, \"<Anonymous>\");\n    FEXCore::Config::Set(FEXCore::Config::CONFIG_APP_CONFIG_NAME, \"<Anonymous>\");\n  } else {\n    {\n      char ExistsTempPath[PATH_MAX];\n      char* RealPath = realpath(Program.ProgramPath.c_str(), ExistsTempPath);\n      if (RealPath) {\n        FEXCore::Config::Set(FEXCore::Config::CONFIG_APP_FILENAME, fextl::string(RealPath));\n      } else {\n        // Can happen when jumping in to pressure-vessel.\n        // `/usr/lib/pressure-vessel/from-host/libexec/steam-runtime-tools-0/pv-adverb` can't get resolved.\n        FEXCore::Config::Set(FEXCore::Config::CONFIG_APP_FILENAME, Program.ProgramPath);\n      }\n    }\n    FEXCore::Config::Set(FEXCore::Config::CONFIG_APP_CONFIG_NAME, Program.ProgramName);\n  }\n\n  // Setup Thread handlers, so FEXCore can create threads.\n  auto StackTracker = FEX::LinuxEmulation::Threads::SetupThreadHandlers();\n\n  auto MemoryRegions = FEX::Allocator::InitMemoryRegions(Loader.Is64BitMode());\n  auto Allocator = FEX::Allocator::InitAllocator(Loader.Is64BitMode());\n\n  FEXCore::Profiler::Init(Program.ProgramName, Program.ProgramPath);\n\n  bool SupportsAVX {};\n  fextl::unique_ptr<FEXCore::Context::Context> CTX;\n  {\n    auto HostFeatures = FEX::FetchHostFeatures();\n    CTX = FEXCore::Context::Context::CreateNewContext(HostFeatures);\n    SupportsAVX = HostFeatures.SupportsAVX;\n  }\n\n  FEX::Kernel::Init(Loader.Is64BitMode(), CTX.get());\n\n  auto SignalDelegation = FEX::HLE::CreateSignalDelegator(CTX.get(), Program.ProgramName, SupportsAVX);\n  auto ThunkHandler = FEX::HLE::CreateThunkHandler();\n\n  auto SyscallHandler = Loader.Is64BitMode() ?\n                          FEX::HLE::x64::CreateHandler(CTX.get(), SignalDelegation.get(), ThunkHandler.get()) :\n                          FEX::HLE::x32::CreateHandler(CTX.get(), SignalDelegation.get(), ThunkHandler.get(), std::move(Allocator));\n  SyscallHandler->SetCodeLoader(&Loader);\n  CTX->SetSignalDelegator(SignalDelegation.get());\n  CTX->SetSyscallHandler(SyscallHandler.get());\n  CTX->SetThunkHandler(ThunkHandler.get());\n\n  if (FEXCore::Config::Get_ENABLECODECACHINGWIP()) {\n    CTX->SetCodeMapWriter(fextl::make_unique<FEXCore::CodeMapWriter>(*SyscallHandler));\n  }\n\n  FEX_CONFIG_OPT(GdbServer, GDBSERVER);\n  fextl::unique_ptr<FEX::GdbServer> DebugServer;\n  if (GdbServer) {\n    DebugServer = fextl::make_unique<FEX::GdbServer>(CTX.get(), SignalDelegation.get(), SyscallHandler.get());\n  }\n\n  // Now that we have the syscall handler. Track some FDs that are FEX owned.\n  if (FEX::Logging::OutputFD > 2) {\n    SyscallHandler->FM.TrackFEXFD(FEX::Logging::OutputFD);\n  }\n  SyscallHandler->FM.TrackFEXFD(FEXServerClient::GetServerFD());\n  if (FEX::Logging::FEXServer::FEXServerFD != -1) {\n    SyscallHandler->FM.TrackFEXFD(FEX::Logging::FEXServer::FEXServerFD);\n  }\n\n  if (!CTX->InitCore()) {\n    return 1;\n  }\n\n  // Create a thread without a RIP or stack pointer setup initially.\n  auto ParentThread = SyscallHandler->TM.CreateThread(0, 0);\n  SyscallHandler->TM.TrackThread(ParentThread);\n  SignalDelegation->RegisterTLSState(ParentThread);\n  ThunkHandler->RegisterTLSState(ParentThread);\n\n  SyscallHandler->DeserializeSeccompFD(ParentThread, FEXSeccompFD);\n\n  // Load VDSO in to memory prior to mapping our ELFs.\n  auto VDSOMapping = FEX::VDSO::LoadVDSOThunks(ParentThread->Thread, Loader.Is64BitMode(), SyscallHandler.get());\n\n  // Pass in our VDSO thunks\n  ThunkHandler->AppendThunkDefinitions(FEX::VDSO::GetVDSOThunkDefinitions(Loader.Is64BitMode()));\n  SignalDelegation->SetVDSOSymbols();\n\n  {\n    Loader.SetVDSOBase(VDSOMapping.VDSOBase);\n    Loader.CalculateHWCaps(CTX.get());\n\n    if (!Loader.MapMemory(SyscallHandler.get(), ParentThread->Thread)) {\n      // failed to map\n      LogMan::Msg::EFmt(\"Failed to map {}-bit elf file.\", Loader.Is64BitMode() ? 64 : 32);\n      return -ENOEXEC;\n    }\n  }\n\n  auto BRKInfo = Loader.GetBRKInfo();\n\n  SyscallHandler->DefaultProgramBreak(BRKInfo.Base, BRKInfo.Size);\n\n  // Request code cache generation\n  if (FEXCore::Config::Get_ENABLECODECACHINGWIP()) {\n    FEXServerClient::PopulateCodeCache(FEXServerClient::GetServerFD(), Loader.GetMainElfFD(), FEXCore::Config::Get_MULTIBLOCK());\n  }\n\n  // Pull RIP and stack pointer from loader and set the thread data to it.\n  ParentThread->Thread->CurrentFrame->State.rip = Loader.DefaultRIP();\n  ParentThread->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RSP] = Loader.GetStackPointer();\n\n  // Close the loader FDs after everything has been parsed and mapped.\n  Loader.CloseFDs();\n\n  CTX->ExecuteThread(ParentThread->Thread);\n\n  DebugServer.reset();\n  SyscallHandler->TM.Stop();\n\n  auto ProgramStatus = ParentThread->StatusCode;\n\n  FEX::VDSO::UnloadVDSOMapping(ParentThread->Thread, SyscallHandler.get(), VDSOMapping);\n\n  SignalDelegation->UninstallTLSState(ParentThread);\n  SyscallHandler->TM.DestroyThread(ParentThread);\n\n  DebugServer.reset();\n  SyscallHandler.reset();\n  SignalDelegation.reset();\n\n  FEX::LinuxEmulation::Threads::Shutdown(std::move(StackTracker));\n\n  Loader.FreeSections();\n\n  FEXCore::Config::Shutdown();\n\n  LogMan::Throw::UnInstallHandler();\n  LogMan::Msg::UnInstallHandler();\n\n  FEX::Allocator::Shutdown(std::move(MemoryRegions));\n\n  // Allocator is now original system allocator\n  FEXCore::Telemetry::Shutdown(Program.ProgramName);\n  FEXCore::Profiler::Shutdown();\n\n  FEX::SBRKAllocations::ReenableSBRKAllocations(SBRKPointer);\n\n  return ProgramStatus;\n}\n"
  },
  {
    "path": "Source/Tools/FEXOfflineCompiler/CMakeLists.txt",
    "content": "add_executable(FEXOfflineCompiler Main.cpp)\n\ntarget_link_libraries(FEXOfflineCompiler PRIVATE\n  Common\n  CommonTools\n  cpp-optparse\n  FEXCore\n  JemallocLibs\n  LinuxEmulation\n  ${PTHREAD_LIB}\n  fmt::fmt)\n\nLinkerGC(FEXOfflineCompiler)\n\ninstall(TARGETS FEXOfflineCompiler RUNTIME\n  DESTINATION bin\n  COMPONENT Runtime)\n"
  },
  {
    "path": "Source/Tools/FEXOfflineCompiler/Main.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"../FEXInterpreter/ELFCodeLoader.h\"\n#include <DummyHandlers.h>\n#include <PortabilityInfo.h>\n#include <Thunks.h>\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/CodeCache.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/HostFeatures.h>\n\n#include <Common/ArgumentLoader.h>\n#include <Common/Config.h>\n#include <Common/FEXServerClient.h>\n#include <Common/HostFeatures.h>\n\n#include <OptionParser.h>\n\n#include <fmt/printf.h>\n\n#include <fstream>\n#include <optional>\n\nclass AOTSyscallHandler : public FEXCore::HLE::SyscallHandler, public FEX::HLE::SyscallMmapInterface {\npublic:\n  AOTSyscallHandler(FEXCore::HLE::SyscallOSABI SyscallOSABI) {\n    OSABI = SyscallOSABI;\n  }\n\n  uint64_t HandleSyscall(FEXCore::Core::CpuStateFrame* Frame, FEXCore::HLE::SyscallArguments* Args) override {\n    // Don't do anything\n    return 0;\n  }\n\n  FEXCore::ExecutableFileInfo FileInfo;\n  std::map<uint64_t, uint64_t> FileRanges;\n\n  uintptr_t VAFileStart = 0;\n\n  // These are no-ops implementations of the SyscallHandler API\n  std::optional<FEXCore::ExecutableFileSectionInfo> LookupExecutableFileSection(FEXCore::Core::InternalThreadState*, uint64_t Address) override {\n    auto It = FileRanges.upper_bound(Address - VAFileStart);\n    LOGMAN_THROW_A_FMT(It != FileRanges.begin(), \"Could not find associated file mapping\");\n    --It;\n    LOGMAN_THROW_A_FMT(VAFileStart + It->first + It->second > Address, \"Could not find associated file mapping for {:#x}\", Address);\n    return FEXCore::ExecutableFileSectionInfo {FileInfo, VAFileStart, VAFileStart + It->first, VAFileStart + It->first + It->second};\n  }\n\n  FEXCore::HLE::ExecutableRangeInfo QueryGuestExecutableRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Address) override {\n    return {0, UINT64_MAX, true};\n  }\n\n  void* GuestMmap(FEXCore::Core::InternalThreadState*, void* addr, size_t Size, int prot, int Flags, int fd, off_t offset) override {\n    // Force writeable to allow applying relocations\n    auto Ret = mmap(addr, Size, prot | PROT_WRITE, Flags, fd, offset);\n    if (Ret != MAP_FAILED && VAFileStart == 0) {\n      VAFileStart = reinterpret_cast<uintptr_t>(Ret);\n    }\n    FileRanges[reinterpret_cast<uintptr_t>(Ret) - VAFileStart] = Size;\n    return Ret;\n  }\n\n  uint64_t GuestMunmap(FEXCore::Core::InternalThreadState*, void* addr, uint64_t length) override {\n    return munmap(addr, length);\n  }\n};\n\nstatic void MsgHandler(LogMan::DebugLevels Level, const char* Message) {\n  fmt::print(\"[{}] {}\\n\", LogMan::DebugLevelStr(Level), Message);\n}\n\nstatic void AssertHandler(const char* Message) {\n  fmt::print(\"[A] {}\\n\", Message);\n}\n\nnamespace FEXCore {\ninline bool operator<(const ExecutableFileInfo& a, const ExecutableFileInfo& b) noexcept {\n  return a.FileId < b.FileId;\n}\n} // namespace FEXCore\n\ntemplate<>\nstruct std::hash<FEXCore::ExecutableFileInfo> {\n  std::size_t operator()(const FEXCore::ExecutableFileInfo& Val) const noexcept {\n    return Val.FileId;\n  }\n};\n\n// Placeholder data to ensure the compile thread doesn't de-reference nullptr data\nstatic FEXCore::Core::CPUState::gdt_segment gdt[32] {};\n\nstatic FEXCore::Core::InternalThreadState* SetupCompileThread(FEXCore::Context::Context& CTX, bool Is64Bit) {\n  auto Thread = CTX.CreateThread(0, 0);\n\n  auto Frame = Thread->CurrentFrame;\n  Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_GDT] = &gdt[0];\n  Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_LDT] = &gdt[0];\n\n  Frame->State.cs_idx = FEXCore::Core::CPUState::DEFAULT_USER_CS << 3;\n  auto GDT = FEXCore::Core::CPUState::GetSegmentFromIndex(Frame->State, Frame->State.cs_idx);\n  FEXCore::Core::CPUState::SetGDTBase(GDT, 0);\n  FEXCore::Core::CPUState::SetGDTLimit(GDT, 0xFFFFFU);\n  Frame->State.cs_cached =\n    FEXCore::Core::CPUState::CalculateGDTBase(*FEXCore::Core::CPUState::GetSegmentFromIndex(Frame->State, Frame->State.cs_idx));\n\n  if (Is64Bit) {\n    GDT->L = 1; // L = Long Mode = 64-bit\n    GDT->D = 0; // D = Default Operand SIze = Reserved\n  } else {\n    GDT->L = 0; // L = Long Mode = 32-bit\n    GDT->D = 1; // D = Default Operand Size = 32-bit\n  }\n\n  return Thread;\n}\n\n// Returns filename of generated cache on success\nstatic std::optional<std::string> GenerateSingleCache(FEXCore::ExecutableFileInfo& Binary, fextl::set<uintptr_t> BlockList, std::string_view OutDir) {\n  uint64_t CodeCacheConfigId = 0; // TODO: Make unique to active configuration\n\n  ELFCodeLoader Loader(Binary.Filename.c_str(), -1, \"\", fextl::vector<fextl::string> {Binary.Filename.c_str()},\n                       fextl::vector<fextl::string> {}, nullptr, nullptr, true /* skip interpreter */);\n  if (!Loader.ELFWasLoaded()) {\n    fmt::print(\"Invalid or unsupported ELF file.\\n\");\n    return std::nullopt;\n  }\n\n  const bool Is64Bit = Loader.Is64BitMode();\n  auto SyscallOSABI = Is64Bit ? FEXCore::HLE::SyscallOSABI::OS_LINUX64 : FEXCore::HLE::SyscallOSABI::OS_LINUX32;\n  auto SyscallHandler = std::make_unique<AOTSyscallHandler>(SyscallOSABI);\n\n  // Populate relocations from ELF file\n  {\n    ELFParser RelocParser;\n    RelocParser.ReadElf(Binary.Filename);\n    Binary.Relocations = RelocParser.PopulateRelocations();\n    SyscallHandler->FileInfo.Relocations = Binary.Relocations;\n  }\n\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_IS64BIT_MODE, Is64Bit ? \"1\" : \"0\");\n\n  // Load HostFeatures\n  auto HostFeatures = FEX::FetchHostFeatures();\n\n  if (!std::filesystem::exists(Binary.Filename)) {\n    fmt::print(\"File {} does not exist\\n\", Binary.Filename);\n    // TODO: Pressure vessel hits this\n    return /*EXIT_FAILURE*/ std::nullopt;\n  }\n\n  auto CTX = FEXCore::Context::Context::CreateNewContext(HostFeatures);\n\n  Loader.CalculateHWCaps(CTX.get());\n\n  auto SignalDelegation = std::make_unique<FEX::DummyHandlers::DummySignalDelegator>();\n  CTX->SetSignalDelegator(SignalDelegation.get());\n  CTX->SetSyscallHandler(SyscallHandler.get());\n  auto ThunkHandler = FEX::HLE::CreateThunkHandler();\n  CTX->SetThunkHandler(ThunkHandler.get());\n\n  if (!CTX->InitCore()) {\n    return std::nullopt;\n  }\n\n  if (!Is64Bit) {\n    const auto PageSize = sysconf(_SC_PAGESIZE);\n    // Block upper address space\n    FEXCore::Allocator::SetupHooks(PageSize > 0 ? PageSize : FEXCore::Utils::FEX_PAGE_SIZE);\n  }\n\n  auto Thread = SetupCompileThread(*CTX, Is64Bit);\n\n  {\n    auto ElfBase = Loader.LoadMainElfFile(nullptr, SyscallHandler.get(), Thread);\n    if (!ElfBase.has_value()) {\n      ERROR_AND_DIE_FMT(\"Failed to load ELF file {} ({})\", Binary.Filename, Binary.FileId);\n    }\n\n    {\n      ELFParser RelocParser;\n      RelocParser.ReadElf(Binary.Filename);\n      auto relocs32 = RelocParser.ReadRawRelocations32();\n\n      for (auto& reloc : relocs32) {\n        if (ELF32_R_TYPE(reloc.r_info) == R_386_RELATIVE) {\n          // The FEX-relocation is applied on top of this during cache serialization, so this must be countered\n          uint32_t val = *reinterpret_cast<uint32_t*>(SyscallHandler->VAFileStart + reloc.r_offset) + SyscallHandler->VAFileStart;\n          memcpy(reinterpret_cast<uint32_t*>(SyscallHandler->VAFileStart + reloc.r_offset), &val, sizeof(val));\n        } else if (ELF32_R_TYPE(reloc.r_info) == R_386_32) {\n          // The FEX-relocation is applied on top of this during cache serialization, so this must be countered\n          uint32_t* orig = reinterpret_cast<uint32_t*>(SyscallHandler->VAFileStart + reloc.r_offset);\n          uint32_t val = *orig + reloc.r_addend + SyscallHandler->VAFileStart;\n          memcpy(orig, &val, sizeof(val));\n        }\n      }\n    }\n  }\n\n  CTX->GetCodeCache().InitiateCacheGeneration();\n\n  {\n    std::vector<std::unique_ptr<ELFCodeLoader>> LoaderMem;\n\n    fmt::print(stderr, \"Compiling code...\\n\");\n    FEX_CONFIG_OPT(MaxInst, MAXINST);\n    for (auto Addr : BlockList) {\n      if (!CTX->CheckIfBlockIsCacheable(*Thread, Addr + SyscallHandler->VAFileStart, MaxInst)) {\n        continue;\n      }\n\n      CTX->CompileRIP(Thread, Addr + SyscallHandler->VAFileStart);\n    }\n\n    auto Filename = fmt::format(\"{}{}-{:016x}\", OutDir, FEXCore::CodeMap::GetBaseFilename(Binary, false), CodeCacheConfigId);\n    auto FilenameNew = Filename + \".new\";\n    int fd = open(FilenameNew.c_str(), O_CREAT | O_WRONLY, 0644);\n    {\n      auto Entry = SyscallHandler->LookupExecutableFileSection(Thread, SyscallHandler->VAFileStart).value();\n      CTX->GetCodeCache().SaveData(*Thread, fd, Entry, 0 /* TODO: Use static base address information if available */);\n    }\n    std::filesystem::rename(FilenameNew.c_str(), Filename.c_str());\n    close(fd);\n    return Filename;\n  }\n}\n\n// Command handler that parses the given code map and generates a code cache for the selected x86 binary.\n// If no binary is selected explicitly, it is inferred from the code map ExecutableFileId block.\nstatic int GenerateCache(int argc, const char** argv) {\n  optparse::OptionParser Parser {};\n  Parser.add_option(\"--outdir\").set_default(FEX::Config::GetCacheDirectory() + \"cache\").help(\"Output directory for generated cache files\");\n  Parser.add_option(\"--fileid\").help(\"Select binary to generate cache for\");\n\n  optparse::Values Options = Parser.parse_args(argc, argv);\n  if (Parser.args().size() != 1) {\n    Parser.print_usage();\n    return 1;\n  }\n  const fextl::string CodeMapPath = Parser.args()[0];\n\n  std::ifstream Codemap(CodeMapPath.c_str(), std::ios_base::binary);\n  if (!Codemap) {\n    fmt::print(\"Could not open {}\\n\", CodeMapPath);\n    return 1;\n  }\n\n  FEXCore::ExecutableFileInfo ProgramName;\n  std::map<FEXCore::ExecutableFileInfo, fextl::set<uintptr_t>> Data;\n  {\n    auto Parsed = FEXCore::CodeMap::ParseCodeMap(Codemap);\n\n    // If an explicit file id is selected, use it.\n    // Otherwise, fall back to an IsExecutable marker (or pick the first entry if there's only one)\n    auto ExplicitFileId = strtoull(((fextl::string)Options.get(\"fileid\")).data(), nullptr, 16);\n    if (ExplicitFileId) {\n      ProgramName.FileId = ExplicitFileId;\n      ProgramName.Filename = Parsed.at(ExplicitFileId).Filename;\n    }\n\n    for (auto& [FileId, Contents] : Parsed) {\n      if (!ExplicitFileId && (Contents.IsExecutable || Parsed.size() == 1)) {\n        ProgramName.FileId = FileId;\n        ProgramName.Filename = Contents.Filename;\n      }\n      Data.emplace(std::piecewise_construct, std::forward_as_tuple(nullptr, FileId, std::move(Contents.Filename)),\n                   std::forward_as_tuple(std::move(Contents.Blocks)));\n    }\n  }\n  if (!ProgramName.FileId) {\n    fmt::print(\"Cannot generate cache from unsanitized code map {}\", CodeMapPath);\n    return 1;\n  }\n\n  for (auto& [File, Blocks] : Data) {\n    if (!Blocks.empty()) {\n      fmt::print(\"Parsed {} codemap entries for {} ({:016x})\\n\", Blocks.size(), File.Filename, File.FileId);\n    } else {\n      fmt::print(\"Found dependency {} ({:016x})\\n\", File.Filename, File.FileId);\n    }\n  }\n\n  if (!Data.contains(ProgramName)) {\n    throw std::runtime_error(fmt::format(\"Input code map {} did not contain {} ({:016x})\", CodeMapPath, ProgramName.Filename, ProgramName.FileId));\n  }\n\n  fextl::string OutDir(Options.get(\"outdir\"));\n  if (!OutDir.ends_with('/')) {\n    OutDir.push_back('/');\n  }\n  std::filesystem::create_directories(OutDir);\n\n  const auto PortableInfo = FEX::ReadPortabilityInformation();\n  char* envp[] = {nullptr};\n  FEX::Config::LoadConfig(\"\", envp, PortableInfo);\n\n  auto NumBlocks = Data.at(ProgramName).size();\n  auto GeneratedCache = GenerateSingleCache(ProgramName, Data.at(ProgramName), OutDir);\n  if (GeneratedCache) {\n    fmt::print(\"Successfully populated cache {} ({} blocks) via {}\\n\\n\", GeneratedCache.value(), NumBlocks,\n               std::filesystem::path {CodeMapPath}.filename().string());\n  }\n  return GeneratedCache ? 0 : 1;\n}\n\nint main(int argc, char** argv) {\n  LogMan::Throw::InstallHandler(AssertHandler);\n  LogMan::Msg::InstallHandler(MsgHandler);\n\n  std::vector<const char*> Args {argv + 1, argv + argc};\n  auto CommandName = std::string {basename(argv[0])} + \" \" + (argc > 1 ? argv[1] : \"\");\n  Args[0] = CommandName.c_str();\n\n  if (argc >= 2 && argv[1] == std::string_view {\"generate\"}) {\n    return GenerateCache(argc - 1, Args.data());\n  } else {\n    fmt::print(\"Usage: {} <command>\\n\\n\", basename(argv[0]));\n    fmt::print(\"Commands:\\n\");\n    fmt::print(\"  generate\\tTrigger cache generation from combined code map\\n\");\n    return EXIT_FAILURE;\n  }\n}\n"
  },
  {
    "path": "Source/Tools/FEXRootFSFetcher/CMakeLists.txt",
    "content": "add_executable(FEXRootFSFetcher Main.cpp XXFileHash.cpp)\nlist(APPEND LIBS FEXCore Common JemallocDummy xxHash::xxhash ${PTHREAD_LIB})\n\nLinkerGC(FEXRootFSFetcher)\n\ninstall(TARGETS FEXRootFSFetcher RUNTIME\n  DESTINATION bin\n  COMPONENT Runtime)\n\ntarget_link_libraries(FEXRootFSFetcher PRIVATE ${LIBS})\n"
  },
  {
    "path": "Source/Tools/FEXRootFSFetcher/Main.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n\n#include \"Common/cpp-optparse/OptionParser.h\"\n#include \"Common/JSONPool.h\"\n#include \"XXFileHash.h\"\n\n#include \"Common/Config.h\"\n\n#include <array>\n#include <filesystem>\n#include <fstream>\n#include <functional>\n#include <iostream>\n#include <unistd.h>\n#include <optional>\n#include <span>\n#include <sstream>\n#include <sys/mman.h>\n#include <sys/syscall.h>\n#include <sys/wait.h>\n#include <unistd.h>\n\n#include <tiny-json.h>\n\nnamespace ArgOptions {\nbool AssumeYes = false;\nenum class CompressedImageOption {\n  OPTION_ASK,\n  OPTION_EXTRACT,\n  OPTION_ASIS,\n};\n\nCompressedImageOption CompressedUsageOption {CompressedImageOption::OPTION_ASK};\n\nenum class ListQueryOption {\n  OPTION_ASK,\n  OPTION_FIRST,\n};\n\nListQueryOption DistroListOption {ListQueryOption::OPTION_ASK};\n\nfextl::vector<fextl::string> RemainingArgs;\n\nstd::string DistroName {};\nstd::string DistroVersion {};\n\nenum class UIOverrideOption {\n  Default,\n  TTY,\n  Zenity,\n};\n\nUIOverrideOption UIOption {UIOverrideOption::Default};\n\nvoid ParseArguments(int argc, char** argv) {\n  optparse::OptionParser Parser = optparse::OptionParser().description(\"Tool for fetching RootFS from FEXServers\").add_help_option(true);\n\n  Parser.add_option(\"-y\", \"--assume-yes\").action(\"store_true\").help(\"Assume yes to prompts\");\n\n  Parser.add_option(\"-x\", \"--extract\").action(\"store_true\").help(\"Extract compressed image\");\n\n  Parser.add_option(\"-a\", \"--as-is\").action(\"store_true\").help(\"Use compressed image as-is\");\n\n  Parser.add_option(\"--distro-name\").help(\"Which distro name to select\");\n\n  Parser.add_option(\"--distro-version\").help(\"Which distro version to select\");\n\n  Parser.add_option(\"--distro-list-first\").action(\"store_true\").help(\"When presented the distro-list option, automatically select the first distro if there isn't an exact match.\");\n\n  Parser.add_option(\"--force-ui\").choices({\"default\", \"tty\", \"zenity\"}).set_default(\"default\").help(\"Override which UI to use for selection\");\n\n  optparse::Values Options = Parser.parse_args(argc, argv);\n\n  if (Options.is_set_by_user(\"assume_yes\")) {\n    AssumeYes = Options.get(\"assume_yes\");\n  }\n\n  if (Options.is_set_by_user(\"extract\")) {\n    CompressedUsageOption = CompressedImageOption::OPTION_EXTRACT;\n  }\n\n  if (Options.is_set_by_user(\"as_is\")) {\n    CompressedUsageOption = CompressedImageOption::OPTION_ASIS;\n  }\n\n  if (Options.is_set_by_user(\"distro_list_first\")) {\n    DistroListOption = ListQueryOption::OPTION_FIRST;\n  }\n\n  if (Options.is_set_by_user(\"distro_name\")) {\n    DistroName = Options[\"distro_name\"];\n  }\n\n  if (Options.is_set_by_user(\"distro_version\")) {\n    DistroVersion = Options[\"distro_version\"];\n  }\n\n  if (Options.is_set_by_user(\"force_ui\")) {\n    const auto& Option = Options[\"force_ui\"];\n    if (Option == \"tty\") {\n      UIOption = UIOverrideOption::TTY;\n    } else if (Option == \"zenity\") {\n      UIOption = UIOverrideOption::Zenity;\n    }\n  }\n\n  RemainingArgs = Parser.args();\n}\n} // namespace ArgOptions\n\nnamespace Exec {\nint32_t ExecAndWaitForResponse(const char* path, char* const* args) {\n  pid_t pid = fork();\n  if (pid == 0) {\n    execvp(path, args);\n    _exit(-1);\n  } else {\n    int32_t Status {};\n    waitpid(pid, &Status, 0);\n    if (WIFEXITED(Status)) {\n      return (int8_t)WEXITSTATUS(Status);\n    }\n  }\n\n  return -1;\n}\n\nint32_t ExecAndWaitForResponseRedirect(const char* path, char* const* args, int stdoutRedirect = -2, int stderrRedirect = -2) {\n  pid_t pid = fork();\n  if (pid == 0) {\n    if (stdoutRedirect == -1) {\n      close(STDOUT_FILENO);\n    } else if (stdoutRedirect == -2) {\n      // Do nothing\n    } else {\n      if (stdoutRedirect != STDOUT_FILENO) {\n        close(STDOUT_FILENO);\n      }\n      dup2(stdoutRedirect, STDOUT_FILENO);\n    }\n    if (stderrRedirect == -1) {\n      close(STDERR_FILENO);\n    } else if (stderrRedirect == -2) {\n      // Do nothing\n    } else {\n      if (stderrRedirect != STDOUT_FILENO) {\n        close(STDERR_FILENO);\n      }\n      dup2(stderrRedirect, STDERR_FILENO);\n    }\n    execvp(path, args);\n    _exit(-1);\n  } else {\n    int32_t Status {};\n    while (waitpid(pid, &Status, 0) == -1 && errno == EINTR)\n      ;\n    if (WIFEXITED(Status)) {\n      return (int8_t)WEXITSTATUS(Status);\n    }\n  }\n\n  return -1;\n}\n\nstd::string ExecAndWaitForResponseText(const char* path, char* const* args) {\n  int fd[2];\n  pipe(fd);\n\n  pid_t pid = fork();\n\n  if (pid == 0) {\n    close(fd[0]); // Close read side\n\n    // Redirect stdout to pipe\n    dup2(fd[1], STDOUT_FILENO);\n\n    // Close stderr\n    close(STDERR_FILENO);\n\n    // We can now close the pipe since the duplications take care of the rest\n    close(fd[1]);\n\n    execvp(path, args);\n    _exit(-1);\n  } else {\n    close(fd[1]); // Close write side\n\n    // Nothing larger than this\n    char Buffer[1024] {};\n    std::string Output {};\n\n    // Read the pipe until it closes\n    while (size_t Size = read(fd[0], Buffer, sizeof(Buffer))) {\n      Output += std::string_view(Buffer, Size);\n    }\n\n    int32_t Status {};\n    while (waitpid(pid, &Status, 0) == -1 && errno == EINTR)\n      ;\n    if (WIFEXITED(Status)) {\n      // Return what we've read\n      close(fd[0]);\n      return Output;\n    }\n  }\n\n  return {};\n}\n} // namespace Exec\n\nnamespace WorkingAppsTester {\nstatic bool Has_Curl {false};\nstatic bool Has_Squashfuse {false};\nstatic bool Has_Unsquashfs {false};\nstatic bool Has_Zenity {false};\n\n// EroFS specific\nstatic bool Has_EroFSFuse {false};\nstatic bool Has_EroFSFsck {false};\n\nvoid CheckCurl() {\n  // Check if curl exists on the host\n  const std::array<const char*, 3> ExecveArgs = {\n    \"curl\",\n    \"-V\",\n    nullptr,\n  };\n\n  int32_t Result = Exec::ExecAndWaitForResponseRedirect(ExecveArgs[0], const_cast<char* const*>(ExecveArgs.data()), -1, -1);\n  Has_Curl = Result != -1;\n}\n\nvoid CheckSquashfuse() {\n  const std::array<const char*, 3> ExecveArgs = {\n    \"squashfuse\",\n    \"--help\",\n    nullptr,\n  };\n\n  int32_t Result = Exec::ExecAndWaitForResponseRedirect(ExecveArgs[0], const_cast<char* const*>(ExecveArgs.data()), -1, -1);\n  Has_Squashfuse = Result != -1;\n}\n\nvoid CheckUnsquashfs() {\n  const std::array<const char*, 3> ExecveArgs = {\n    \"unsquashfs\",\n    // since unsquashfs 4.7.1, -help-all is needed to list decompressors.\n    // also works with older versions.\n    \"-help-all\",\n    nullptr,\n  };\n\n  int fd = ::syscall(SYS_memfd_create, \"stdout\", 0);\n  int32_t Result = Exec::ExecAndWaitForResponseRedirect(ExecveArgs[0], const_cast<char* const*>(ExecveArgs.data()), fd, fd);\n  Has_Unsquashfs = Result != -1;\n  if (Has_Unsquashfs) {\n    // Seek back to the start\n    lseek(fd, 0, SEEK_SET);\n\n    // Unsquashfs needs to support zstd\n    // Scan its output to find the zstd compressor\n    FILE* fp = fdopen(fd, \"r\");\n    char* Line {nullptr};\n    size_t Len;\n\n    bool ReadingDecompressors = false;\n    bool SupportsZSTD = false;\n    while (getline(&Line, &Len, fp) != -1) {\n      if (!ReadingDecompressors) {\n        if (strstr(Line, \"Decompressors available\")) {\n          ReadingDecompressors = true;\n        }\n      } else {\n        if (strstr(Line, \"zstd\")) {\n          SupportsZSTD = true;\n        }\n      }\n    }\n\n    free(Line);\n    fclose(fp);\n\n    // Disable unsquashfs if it doesn't support ZSTD\n    if (!SupportsZSTD) {\n      Has_Unsquashfs = false;\n    }\n  }\n  close(fd);\n}\nvoid CheckZenity() {\n  // Check if zenity exists on the host\n  std::array<const char*, 3> ExecveArgs = {\n    \"zenity\",\n    \"-h\",\n    nullptr,\n  };\n\n  int32_t Result = Exec::ExecAndWaitForResponseRedirect(ExecveArgs[0], const_cast<char* const*>(ExecveArgs.data()), -1, -1);\n  Has_Zenity = Result != -1;\n}\n\n// EroFS specific tests\nvoid CheckEroFSFuse() {\n  std::array<const char*, 3> ExecveArgs = {\n    \"erofsfuse\",\n    \"--help\",\n    nullptr,\n  };\n\n  int32_t Result = Exec::ExecAndWaitForResponseRedirect(ExecveArgs[0], const_cast<char* const*>(ExecveArgs.data()), -1, -1);\n  Has_EroFSFuse = Result != -1;\n}\n\nvoid CheckEroFSFsck() {\n  std::array<const char*, 3> ExecveArgs = {\n    \"fsck.erofs\",\n    \"-V\",\n    nullptr,\n  };\n\n  int32_t Result = Exec::ExecAndWaitForResponseRedirect(ExecveArgs[0], const_cast<char* const*>(ExecveArgs.data()), -1, -1);\n  Has_EroFSFsck = Result != -1;\n}\n\nvoid Init() {\n  CheckCurl();\n  CheckSquashfuse();\n  CheckUnsquashfs();\n  CheckZenity();\n  CheckEroFSFuse();\n  CheckEroFSFsck();\n}\n} // namespace WorkingAppsTester\n\nnamespace DistroQuery {\nstruct DistroInfo {\n  std::string DistroName;\n  std::string DistroVersion;\n  bool RollingRelease;\n  bool Unknown;\n};\n\nDistroInfo GetDistroInfo() {\n  // Detect these files in order\n  //\n  // /etc/lsb-release\n  // eg:\n  // DISTRIB_ID=Ubuntu\n  // DISTRIB_RELEASE=21.10\n  // DISTRIB_CODENAME=impish\n  // DISTRIB_DESCRIPTION=\"Ubuntu 21.10\"\n  //\n  // /etc/os-release\n  // eg:\n  // PRETTY_NAME=\"Ubuntu 21.10\"\n  // NAME=\"Ubuntu\"\n  // VERSION_ID=\"21.10\"\n  // VERSION=\"21.10 (Impish Indri)\"\n  // VERSION_CODENAME=impish\n  // ID=ubuntu\n  // ID_LIKE=debian\n  // HOME_URL=\"https://www.ubuntu.com/\"\n  // SUPPORT_URL=\"https://help.ubuntu.com/\"\n  // BUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\n  // PRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\n  // UBUNTU_CODENAME=impish\n  //\n  // /etc/debian_version\n  // eg:\n  // 11.0\n  //\n  // uname -r\n  // eg:\n  // 5.13.0-22-generic\n  DistroInfo Info {};\n  uint32_t FoundCount {};\n\n  if (std::filesystem::exists(\"/etc/lsb-release\")) {\n    std::fstream File(\"/etc/lsb-release\", std::fstream::in);\n    std::string Line;\n    while (std::getline(File, Line)) {\n      if (File.eof() || FoundCount == 2) {\n        break;\n      }\n\n      std::stringstream ss(Line);\n      std::string Key, Value;\n      std::getline(ss, Key, '=');\n      std::getline(ss, Value, '=');\n\n      if (Key == \"DISTRIB_ID\") {\n        auto ToLower = [](auto Str) {\n          std::transform(Str.begin(), Str.end(), Str.begin(), [](unsigned char c) { return std::tolower(c); });\n          return Str;\n        };\n        Info.DistroName = ToLower(Value);\n        ++FoundCount;\n      } else if (Key == \"DISTRIB_RELEASE\") {\n        Info.DistroVersion = std::move(Value);\n        ++FoundCount;\n      }\n    }\n  }\n\n  if (FoundCount == 2) {\n    Info.Unknown = false;\n    if (Info.DistroName == \"arch\") {\n      Info.RollingRelease = true;\n    }\n    return Info;\n  }\n  FoundCount = 0;\n\n  if (std::filesystem::exists(\"/etc/os-release\")) {\n    std::fstream File(\"/etc/os-release\", std::fstream::in);\n    std::string Line;\n    while (std::getline(File, Line)) {\n      if (File.eof() || FoundCount == 2) {\n        break;\n      }\n\n      std::stringstream ss(Line);\n      std::string Key, Value;\n      std::getline(ss, Key, '=');\n      std::getline(ss, Value, '=');\n\n      if (Key == \"ID\") {\n        Info.DistroName = std::move(Value);\n        ++FoundCount;\n      } else if (Key == \"VERSION_ID\") {\n        // Ubuntu provides VERSION_ID\n        // Strip the two quotes from the VERSION_ID\n        Value = Value.substr(1, Value.size() - 2);\n        Info.DistroVersion = std::move(Value);\n        ++FoundCount;\n      } else if (Key == \"IMAGE_VERSION\") {\n        // Arch provides IMAGE_VERSION\n        Info.DistroVersion = std::move(Value);\n        ++FoundCount;\n      }\n    }\n  }\n\n  if (FoundCount == 2) {\n    Info.Unknown = false;\n    if (Info.DistroName == \"arch\") {\n      Info.RollingRelease = true;\n    }\n    return Info;\n  }\n  FoundCount = 0;\n\n  if (std::filesystem::exists(\"/etc/debian_version\")) {\n    std::fstream File(\"/etc/debian_version\", std::fstream::in);\n    std::string Line;\n\n    Info.DistroName = \"debian\";\n    ++FoundCount;\n    while (std::getline(File, Line)) {\n      Info.DistroVersion = Line;\n      ++FoundCount;\n    }\n  }\n\n  if (FoundCount == 2) {\n    Info.Unknown = false;\n    return Info;\n  }\n\n  Info.DistroName = \"Unknown\";\n  Info.DistroVersion = {};\n  Info.Unknown = true;\n  return Info;\n}\n} // namespace DistroQuery\n\nnamespace WebFileFetcher {\nstruct FileTargets {\n  // These two are for matching version checks\n  std::string DistroMatch;\n  std::string VersionMatch;\n\n  // This is a human readable name\n  std::string DistroName;\n\n  // This is the URL\n  fextl::string URL;\n\n  // This is the hash of the file\n  std::string Hash;\n\n  // FileType\n  enum class FileType {\n    TYPE_UNKNOWN,\n    TYPE_SQUASHFS,\n    TYPE_EROFS,\n  };\n  FileType Type;\n};\n\nconst static std::string DownloadURL = \"https://rootfs.fex-emu.gg/RootFS_links.json\";\n\nstd::string DownloadToString(const std::string& URL) {\n  std::array<const char*, 3> ExecveArgs = {\n    \"curl\",\n    URL.c_str(),\n    nullptr,\n  };\n\n  return Exec::ExecAndWaitForResponseText(ExecveArgs[0], const_cast<char* const*>(ExecveArgs.data()));\n}\n\nbool DownloadToPath(const fextl::string& URL, const fextl::string& Path) {\n  auto filename = URL.substr(URL.find_last_of('/') + 1);\n  auto PathName = Path + filename;\n\n  std::array<const char*, 5> ExecveArgs = {\n    \"curl\", URL.c_str(), \"-o\", PathName.c_str(), nullptr,\n  };\n\n  return Exec::ExecAndWaitForResponse(ExecveArgs[0], const_cast<char* const*>(ExecveArgs.data())) == 0;\n}\n\nbool DownloadToPathWithZenityProgress(const fextl::string& URL, const fextl::string& Path) {\n  auto filename = URL.substr(URL.find_last_of('/') + 1);\n  auto PathName = Path + filename;\n\n  // -# for progress bar\n  // -o for output file\n  // -f for silent fail\n  std::string CurlPipe = fmt::format(\"curl -C - -#f {} -o {} 2>&1\", URL, PathName);\n  const std::string StdBuf = \"stdbuf -oL tr '\\\\r' '\\\\n'\";\n  const std::string SedBuf = \"sed -u 's/[^0-9]*\\\\([0-9]*\\\\).*/\\\\1/'\";\n  // zenity --auto-close can't be used since `curl -C` for whatever reason prints 100% at the start.\n  // Making zenity vanish immediately\n  const std::string ZenityBuf = \"zenity --time-remaining --progress --no-cancel --title 'Downloading'\";\n  std::string BigArgs = fmt::format(\"{} | {} | {} | {}\", CurlPipe, StdBuf, SedBuf, ZenityBuf);\n  std::array<const char*, 4> ExecveArgs = {\n    \"/bin/sh\",\n    \"-c\",\n    BigArgs.c_str(),\n    nullptr,\n  };\n\n  return Exec::ExecAndWaitForResponse(ExecveArgs[0], const_cast<char* const*>(ExecveArgs.data())) == 0;\n}\n\nstd::optional<std::vector<FileTargets>> GetRootFSLinks() {\n  // Decode the filetargets\n  std::string Data = DownloadToString(DownloadURL);\n\n  if (Data.empty()) {\n    return std::nullopt;\n  }\n\n  FEX::JSON::JsonAllocator Pool {};\n  const json_t* json = FEX::JSON::CreateJSON(Data, Pool);\n\n  if (!json) {\n    fmt::print(stderr, \"Failed to parse JSON from RootFSLinks file '{}' - invalid JSON format\", Data);\n    std::abort();\n  }\n\n  const json_t* RootList = json_getProperty(json, \"v1\");\n\n  if (!RootList) {\n    fprintf(stderr, \"Couldn't get root list\");\n    return {};\n  }\n\n  std::vector<FileTargets> Targets;\n\n  for (const json_t* RootItem = json_getChild(RootList); RootItem != nullptr; RootItem = json_getSibling(RootItem)) {\n\n    FileTargets Target {};\n    Target.DistroName = json_getName(RootItem);\n\n    for (const json_t* DataItem = json_getChild(RootItem); DataItem != nullptr; DataItem = json_getSibling(DataItem)) {\n      auto DataName = std::string_view {json_getName(DataItem)};\n\n      if (DataName == \"DistroMatch\") {\n        Target.DistroMatch = json_getValue(DataItem);\n      } else if (DataName == \"DistroVersion\") {\n        Target.VersionMatch = json_getValue(DataItem);\n      } else if (DataName == \"URL\") {\n        Target.URL = json_getValue(DataItem);\n      } else if (DataName == \"Hash\") {\n        Target.Hash = json_getValue(DataItem);\n      } else if (DataName == \"Type\") {\n        auto DataValue = std::string_view {json_getValue(DataItem)};\n        if (DataValue == \"squashfs\") {\n          Target.Type = FileTargets::FileType::TYPE_SQUASHFS;\n        } else if (DataValue == \"erofs\") {\n          Target.Type = FileTargets::FileType::TYPE_EROFS;\n        } else {\n          Target.Type = FileTargets::FileType::TYPE_UNKNOWN;\n        }\n      }\n    }\n    bool SupportsSquashFS = WorkingAppsTester::Has_Squashfuse || WorkingAppsTester::Has_Unsquashfs;\n    bool SupportsEroFS = WorkingAppsTester::Has_EroFSFuse;\n    if ((Target.Type == FileTargets::FileType::TYPE_SQUASHFS && SupportsSquashFS) ||\n        (Target.Type == FileTargets::FileType::TYPE_EROFS && SupportsEroFS)) {\n      // If we don't understand the type, then we can't use this.\n      // Additionally if the type is erofs but the user doesn't have erofsfuse, then we can't use this\n      Targets.emplace_back(Target);\n    }\n  }\n\n  return Targets;\n}\n} // namespace WebFileFetcher\n\nnamespace Zenity {\nbool ExecWithQuestion(const fextl::string& Question) {\n  fextl::string TextArg = \"--text=\" + Question;\n  const char* Args[] = {\n    \"zenity\",\n    \"--question\",\n    TextArg.c_str(),\n    nullptr,\n  };\n\n  int32_t Result = Exec::ExecAndWaitForResponse(Args[0], const_cast<char* const*>(Args));\n  // 0 on Yes, 1 on No\n  return Result == 0;\n}\n\nvoid ExecWithInfo(const fextl::string& Text) {\n  fextl::string TextArg = \"--text=\" + Text;\n  const char* Args[] = {\n    \"zenity\",\n    \"--info\",\n    TextArg.c_str(),\n    nullptr,\n  };\n\n  Exec::ExecAndWaitForResponse(Args[0], const_cast<char* const*>(Args));\n}\n\nbool AskForConfirmation(const fextl::string& Question) {\n  return ArgOptions::AssumeYes || ExecWithQuestion(Question);\n}\n\nint32_t AskForConfirmationList(const fextl::string& Text, const std::span<const fextl::string> Arguments) {\n  fextl::string TextArg = \"--text=\" + Text;\n\n  std::vector<const char*> ExecveArgs = {\n    \"zenity\", \"--list\", TextArg.c_str(), \"--hide-header\", \"--column=Index\", \"--column=Text\", \"--hide-column=1\",\n  };\n\n  std::vector<fextl::string> NumberArgs;\n  for (size_t i = 0; i < Arguments.size(); ++i) {\n    NumberArgs.emplace_back(std::to_string(i));\n  }\n\n  for (size_t i = 0; i < Arguments.size(); ++i) {\n    const auto& Arg = Arguments[i];\n    ExecveArgs.emplace_back(NumberArgs[i].c_str());\n    ExecveArgs.emplace_back(Arg.c_str());\n  }\n  ExecveArgs.emplace_back(nullptr);\n\n  auto Result = Exec::ExecAndWaitForResponseText(ExecveArgs[0], const_cast<char* const*>(ExecveArgs.data()));\n  if (Result.empty()) {\n    return -1;\n  }\n  return std::stoi(Result);\n}\n\nint32_t AskForComplexConfirmationList(const std::string& Text, const std::span<const std::string> Arguments) {\n  std::string TextArg = \"--text=\" + Text;\n\n  std::vector<const char*> ExecveArgs = {\n    \"zenity\",\n    \"--list\",\n    TextArg.c_str(),\n  };\n\n  for (auto& Arg : Arguments) {\n    ExecveArgs.emplace_back(Arg.c_str());\n  }\n  ExecveArgs.emplace_back(nullptr);\n\n  auto Result = Exec::ExecAndWaitForResponseText(ExecveArgs[0], const_cast<char* const*>(ExecveArgs.data()));\n  if (Result.empty()) {\n    return -1;\n  }\n  return std::stoi(Result);\n}\n\nint32_t AskForDistroSelection(DistroQuery::DistroInfo& Info, const std::span<const WebFileFetcher::FileTargets> Targets) {\n  // Search for an exact match\n  int32_t DistroIndex = -1;\n  if (!Info.Unknown) {\n    for (size_t i = 0; i < Targets.size(); ++i) {\n      const auto& Target = Targets[i];\n\n      bool ExactMatch = Target.DistroMatch == Info.DistroName && (Info.RollingRelease || Target.VersionMatch == Info.DistroVersion);\n      if (ExactMatch) {\n        fextl::string Question = fextl::fmt::format(\"Found exact match for distro '{}'. Do you want to select this image?\", Target.DistroName);\n        if (ExecWithQuestion(Question)) {\n          DistroIndex = i;\n          break;\n        }\n      }\n    }\n  }\n\n  if (DistroIndex != -1) {\n    return DistroIndex;\n  }\n\n  if (ArgOptions::DistroListOption == ArgOptions::ListQueryOption::OPTION_FIRST) {\n    // Return the first option if not an exact match.\n    return 0;\n  }\n\n  std::vector<std::string> Args;\n\n  Args.emplace_back(\"--column=Index\");\n  Args.emplace_back(\"--column=Distro\");\n  Args.emplace_back(\"--hide-column=1\");\n  for (size_t i = 0; i < Targets.size(); ++i) {\n    const auto& Target = Targets[i];\n    Args.emplace_back(std::to_string(i));\n    Args.emplace_back(Target.DistroName);\n  }\n\n  std::string Text = \"RootFS list selection\";\n  return AskForComplexConfirmationList(Text, Args);\n}\n\nbool ValidateCheckExists(const WebFileFetcher::FileTargets& Target) {\n  fextl::string RootFS = FEXCore::Config::GetDataDirectory() + \"RootFS/\";\n  auto filename = Target.URL.substr(Target.URL.find_last_of('/') + 1);\n  auto PathName = RootFS + filename;\n  uint64_t ExpectedHash = std::stoul(Target.Hash, nullptr, 16);\n\n  std::error_code ec;\n  if (std::filesystem::exists(PathName, ec)) {\n    const std::array<const fextl::string, 2> Args {\n      \"Overwrite\",\n      \"Validate\",\n    };\n    fextl::string Text = filename + \" already exists. What do you want to do?\";\n    int Result = AskForConfirmationList(Text, Args);\n    if (Result == -1) {\n      return false;\n    }\n\n    auto Res = XXFileHash::HashFile(PathName);\n    if (Result == 0) {\n      if (Res == ExpectedHash) {\n        fextl::string Text = fextl::fmt::format(\"{} matches expected hash. Skipping download\", filename);\n        ExecWithInfo(Text);\n        return false;\n      }\n    } else if (Result == 1) {\n      if (Res != ExpectedHash) {\n        return AskForConfirmation(\"RootFS doesn't match hash!\\nDo you want to redownload?\");\n      } else {\n        fextl::string Text = fextl::fmt::format(\"{} matches expected hash\", filename);\n        ExecWithInfo(Text);\n        return false;\n      }\n    }\n  }\n\n  return true;\n}\n\nbool ValidateDownloadSelection(const WebFileFetcher::FileTargets& Target) {\n  fextl::string Text = fextl::fmt::format(\"Selected Rootfs: {}\\n\", Target.DistroName);\n  Text += fmt::format(\"\\tURL: {}\\n\", Target.URL);\n  Text += fmt::format(\"Are you sure that you want to download this image\");\n\n  if (AskForConfirmation(Text)) {\n    fextl::string RootFS = FEXCore::Config::GetDataDirectory() + \"RootFS/\";\n    std::error_code ec {};\n    if (!std::filesystem::exists(RootFS, ec)) {\n      // Doesn't exist, create the the folder as a user convenience\n      if (!std::filesystem::create_directories(RootFS, ec)) {\n        // Well I guess we failed\n        Text = fmt::format(\"Couldn't create {} path for storing RootFS\", RootFS);\n        ExecWithInfo(Text);\n        return false;\n      }\n    }\n\n    if (!WebFileFetcher::DownloadToPathWithZenityProgress(Target.URL, RootFS)) {\n      return false;\n    }\n\n    return true;\n  }\n  return false;\n}\n} // namespace Zenity\n\nnamespace TTY {\nbool AskForConfirmation(const fextl::string& Question) {\n  if (ArgOptions::AssumeYes) {\n    return true;\n  }\n\n  auto ToLowerInPlace = [](auto& Str) {\n    std::transform(Str.begin(), Str.end(), Str.begin(), [](unsigned char c) { return std::tolower(c); });\n  };\n\n  std::cout << Question << std::endl;\n  std::cout << \"Response {y,yes,1} or {n,no,0}\" << std::endl;\n  std::string Response;\n  std::cin >> Response;\n\n  ToLowerInPlace(Response);\n  if (Response == \"y\" || Response == \"yes\" || Response == \"1\") {\n    return true;\n  } else if (Response == \"n\" || Response == \"no\" || Response == \"0\") {\n    return false;\n  } else {\n    std::cout << \"Unknown response. Assuming no\" << std::endl;\n    return false;\n  }\n}\n\nvoid ExecWithInfo(const fextl::string& Text) {\n  std::cout << Text << std::endl;\n}\n\nint32_t AskForConfirmationList(const fextl::string& Text, std::span<const fextl::string> List) {\n  fmt::print(\"{}\\n\", Text);\n  fmt::print(\"Options:\\n\");\n  fmt::print(\"\\t0: Cancel\\n\");\n\n  for (size_t i = 0; i < List.size(); ++i) {\n    fmt::print(\"\\t{}: {}\\n\", i + 1, List[i]);\n  }\n\n  fmt::print(\"\\t\\nResponse {{1-{}}} or 0 to cancel\\n\", List.size());\n  fextl::string Response;\n  std::cin >> Response;\n\n  int32_t ResponseInt = std::stol(Response.data(), nullptr, 0);\n  if (ResponseInt == 0) {\n    return -1;\n  } else if (ResponseInt >= 1 && (ResponseInt - 1) < List.size()) {\n    return ResponseInt - 1;\n  } else {\n    std::cout << \"Unknown response. Assuming cancel\" << std::endl;\n    return -1;\n  }\n}\n\nint32_t AskForDistroSelection(DistroQuery::DistroInfo& Info, const std::span<const WebFileFetcher::FileTargets> Targets) {\n  // Search for an exact match\n  int32_t DistroIndex = -1;\n  if (!Info.Unknown) {\n    for (size_t i = 0; i < Targets.size(); ++i) {\n      const auto& Target = Targets[i];\n\n      bool ExactMatch = Target.DistroMatch == Info.DistroName && Target.VersionMatch == Info.DistroVersion;\n      if (ExactMatch) {\n        fextl::string Question = fextl::fmt::format(\"Found exact match for distro '{}'. Do you want to select this image?\", Target.DistroName);\n        if (AskForConfirmation(Question)) {\n          DistroIndex = i;\n          break;\n        }\n      }\n    }\n  }\n\n  if (DistroIndex != -1) {\n    return DistroIndex;\n  }\n\n  if (ArgOptions::DistroListOption == ArgOptions::ListQueryOption::OPTION_FIRST) {\n    // Return the first option if not an exact match.\n    return 0;\n  }\n\n  std::vector<fextl::string> Args;\n  for (size_t i = 0; i < Targets.size(); ++i) {\n    const auto& Target = Targets[i];\n    Args.emplace_back(Target.DistroName);\n  }\n\n  fextl::string Text = \"RootFS list selection\";\n  return AskForConfirmationList(Text, Args);\n}\n\nbool ValidateCheckExists(const WebFileFetcher::FileTargets& Target) {\n  fextl::string RootFS = FEXCore::Config::GetDataDirectory() + \"RootFS/\";\n  auto filename = Target.URL.substr(Target.URL.find_last_of('/') + 1);\n  auto PathName = RootFS + filename;\n  uint64_t ExpectedHash = std::stoul(Target.Hash, nullptr, 16);\n\n  std::error_code ec;\n  if (std::filesystem::exists(PathName, ec)) {\n    const std::array<fextl::string, 2> Args {\n      \"Overwrite\",\n      \"Validate\",\n    };\n    fextl::string Text = filename + \" already exists. What do you want to do?\";\n    int Result = AskForConfirmationList(Text, Args);\n    if (Result == -1) {\n      return false;\n    }\n    fmt::print(\"Validating RootFS hash...\\n\");\n    auto Res = XXFileHash::HashFile(PathName);\n    if (Result == 0) {\n      if (Res == ExpectedHash) {\n        fmt::print(\"{} matches expected hash. Skipping downloading\\n\", filename);\n        return false;\n      }\n    } else if (Result == 1) {\n      if (Res != ExpectedHash) {\n        fmt::print(\"RootFS doesn't match hash!\\n\");\n        return AskForConfirmation(\"Do you want to redownload?\");\n      } else {\n        fmt::print(\"{} matches expected hash\\n\", filename);\n        return false;\n      }\n    }\n  }\n\n  return true;\n}\n\nbool ValidateDownloadSelection(const WebFileFetcher::FileTargets& Target) {\n  fmt::print(\"Selected Rootfs: {}\\n\", Target.DistroName);\n  fmt::print(\"\\tURL: {}\\n\", Target.URL);\n\n  if (AskForConfirmation(\"Are you sure that you want to download this image\")) {\n    fextl::string RootFS = FEXCore::Config::GetDataDirectory() + \"RootFS/\";\n    std::error_code ec {};\n    if (!std::filesystem::exists(RootFS, ec)) {\n      // Doesn't exist, create the the folder as a user convenience\n      if (!std::filesystem::create_directories(RootFS, ec)) {\n        // Well I guess we failed\n        fmt::print(\"Couldn't create {} path for storing RootFS\\n\", RootFS);\n        return false;\n      }\n    }\n    auto DoDownload = [&Target, &RootFS]() -> bool {\n      if (!WebFileFetcher::DownloadToPath(Target.URL, RootFS)) {\n        fmt::print(\"Couldn't download RootFS\\n\");\n        return false;\n      }\n\n      return true;\n    };\n\n    while (DoDownload() == false) {\n      if (AskForConfirmation(\"Curl RootFS download failed. Do you want to retry?\")) {\n        // Loop to retry\n      } else {\n        return false;\n      }\n    }\n\n    // Got here then we passed\n    return true;\n  }\n  return false;\n}\n} // namespace TTY\n\nnamespace {\nstd::function<bool(const fextl::string& Question)> _AskForConfirmation;\nstd::function<void(const fextl::string& Text)> _ExecWithInfo;\nstd::function<int32_t(const fextl::string& Text, const std::span<const fextl::string> List)> _AskForConfirmationList;\nstd::function<int32_t(DistroQuery::DistroInfo& Info, const std::span<const WebFileFetcher::FileTargets> Targets)> _AskForDistroSelection;\nstd::function<bool(const WebFileFetcher::FileTargets& Target)> _ValidateCheckExists;\nstd::function<bool(const WebFileFetcher::FileTargets& Target)> _ValidateDownloadSelection;\n\nvoid CheckTTY() {\n  bool IsTTY {};\n  if (ArgOptions::UIOption == ArgOptions::UIOverrideOption::Default) {\n    IsTTY = isatty(STDOUT_FILENO);\n  } else {\n    IsTTY = ArgOptions::UIOption == ArgOptions::UIOverrideOption::TTY;\n  }\n\n  if (!WorkingAppsTester::Has_Zenity) {\n    // Force TTY if zenity isn't installed.\n    if (ArgOptions::UIOption == ArgOptions::UIOverrideOption::Zenity) {\n      fmt::print(\"Zenity isn't executable. Falling back to TTY mode\\n\");\n    }\n    IsTTY = true;\n  }\n\n  if (IsTTY) {\n    _AskForConfirmation = TTY::AskForConfirmation;\n    _ExecWithInfo = TTY::ExecWithInfo;\n    _AskForConfirmationList = TTY::AskForConfirmationList;\n    _AskForDistroSelection = TTY::AskForDistroSelection;\n    _ValidateCheckExists = TTY::ValidateCheckExists;\n    _ValidateDownloadSelection = TTY::ValidateDownloadSelection;\n  } else {\n    _AskForConfirmation = Zenity::AskForConfirmation;\n    _ExecWithInfo = Zenity::ExecWithInfo;\n    _AskForConfirmationList = Zenity::AskForConfirmationList;\n    _AskForDistroSelection = Zenity::AskForDistroSelection;\n    _ValidateCheckExists = Zenity::ValidateCheckExists;\n    _ValidateDownloadSelection = Zenity::ValidateDownloadSelection;\n  }\n}\n\nbool AskForConfirmation(const fextl::string& Question) {\n  return _AskForConfirmation(Question);\n}\n\nvoid ExecWithInfo(const fextl::string& Text) {\n  _ExecWithInfo(Text);\n}\n\nint32_t AskForConfirmationList(const fextl::string& Text, const std::span<const fextl::string> Arguments) {\n  return _AskForConfirmationList(Text, Arguments);\n}\n\nint32_t AskForDistroSelection(const std::span<const WebFileFetcher::FileTargets> Targets) {\n  auto Info = DistroQuery::GetDistroInfo();\n\n  if (!ArgOptions::DistroName.empty()) {\n    Info.DistroName = ArgOptions::DistroName;\n  }\n  if (!ArgOptions::DistroVersion.empty()) {\n    Info.DistroVersion = ArgOptions::DistroVersion;\n  }\n\n  return _AskForDistroSelection(Info, Targets);\n}\n\nbool ValidateCheckExists(const WebFileFetcher::FileTargets& Target) {\n  return _ValidateCheckExists(Target);\n}\n\nbool ValidateDownloadSelection(const WebFileFetcher::FileTargets& Target) {\n  return _ValidateDownloadSelection(Target);\n}\n} // namespace\n\nnamespace ConfigSetter {\nvoid SetRootFSAsDefault(const fextl::string& RootFS) {\n  fextl::string Filename = FEXCore::Config::GetConfigFileLocation();\n  auto LoadedConfig = FEX::Config::CreateMainLayer(&Filename);\n  LoadedConfig->Load();\n  LoadedConfig->Set(FEXCore::Config::ConfigOption::CONFIG_ROOTFS, RootFS);\n  FEX::Config::SaveLayerToJSON(Filename, LoadedConfig.get());\n}\n} // namespace ConfigSetter\n\nnamespace UnSquash {\nbool UnsquashRootFS(const fextl::string& Path, const fextl::string& RootFS, const fextl::string& FolderName) {\n  auto TargetFolder = Path + FolderName;\n\n  std::error_code ec;\n  if (std::filesystem::exists(TargetFolder, ec)) {\n    fextl::string Question = \"Target folder \\\"\" + FolderName + \"\\\" already exists. Overwrite?\";\n    if (AskForConfirmation(Question)) {\n      if (std::filesystem::remove_all(TargetFolder, ec) == ~0ULL) {\n        ExecWithInfo(\"Couldn't remove previous directory. Won't extract.\");\n        return false;\n      }\n    } else {\n      return false;\n    }\n  }\n\n  const std::array<const char*, 6> ExecveArgs = {\n    \"unsquashfs\", \"-f\", \"-d\", TargetFolder.c_str(), RootFS.c_str(), nullptr,\n  };\n\n  return Exec::ExecAndWaitForResponse(ExecveArgs[0], const_cast<char* const*>(ExecveArgs.data())) == 0;\n}\n\nbool ExtractEroFS(const fextl::string& Path, const fextl::string& RootFS, const fextl::string& FolderName) {\n  auto TargetFolder = Path + FolderName;\n\n  std::error_code ec;\n  if (std::filesystem::exists(TargetFolder, ec)) {\n    fextl::string Question = \"Target folder \\\"\" + FolderName + \"\\\" already exists. Overwrite?\";\n    if (AskForConfirmation(Question)) {\n      if (std::filesystem::remove_all(TargetFolder, ec) == ~0ULL) {\n        ExecWithInfo(\"Couldn't remove previous directory. Won't extract.\");\n        return false;\n      }\n    } else {\n      return false;\n    }\n  }\n\n  ExecWithInfo(\"Extracting Erofs. This might take a few minutes.\");\n\n  const auto ExtractOption = fmt::format(\"--extract={}\", TargetFolder);\n  const std::array<const char*, 4> ExecveArgs = {\n    \"fsck.erofs\",\n    ExtractOption.c_str(),\n    RootFS.c_str(),\n    nullptr,\n  };\n\n  return Exec::ExecAndWaitForResponse(ExecveArgs[0], const_cast<char* const*>(ExecveArgs.data())) == 0;\n}\n} // namespace UnSquash\n\nint main(int argc, char** argv, char** const envp) {\n  FEX::Config::LoadConfig({}, envp);\n\n  // Reload the meta layer\n  FEXCore::Config::ReloadMetaLayer();\n\n  ArgOptions::ParseArguments(argc, argv);\n\n  WorkingAppsTester::Init();\n\n  CheckTTY();\n\n  if (ArgOptions::RemainingArgs.size()) {\n    auto Res = XXFileHash::HashFile(ArgOptions::RemainingArgs[0]);\n    if (Res.has_value()) {\n      fmt::print(\"{} has hash: {:x}\\n\", ArgOptions::RemainingArgs[0], Res.value());\n    } else {\n      fmt::print(\"Couldn't generate hash for {}\\n\", ArgOptions::RemainingArgs[0]);\n    }\n    return 0;\n  }\n\n  // Check if curl exists on the host\n  if (!WorkingAppsTester::Has_Curl) {\n    ExecWithInfo(\"curl is required to use this tool. Please install curl before using.\");\n    return -1;\n  }\n  if (!WorkingAppsTester::Has_Squashfuse && !WorkingAppsTester::Has_Unsquashfs && !WorkingAppsTester::Has_EroFSFuse) {\n    // We need at least one tool to mount or extract image files\n    ExecWithInfo(\"squashfuse, unsquashfs, or erofsfuse is required to use this tool. Please install one before using.\");\n    return -1;\n  }\n\n  FEX_CONFIG_OPT(LDPath, ROOTFS);\n\n  std::error_code ec;\n  fextl::string Question {};\n  if (LDPath().empty() || std::filesystem::exists(LDPath(), ec) == false) {\n    Question = \"RootFS not found. Do you want to try and download one?\";\n  } else {\n    Question = \"RootFS is already in use. Do you want to check the download list?\";\n  }\n\n  if (AskForConfirmation(Question)) {\n    auto TargetReturn = WebFileFetcher::GetRootFSLinks();\n    if (!TargetReturn.has_value()) {\n      ExecWithInfo(\"Couldn't download rootfs list from the server. Try again in a minute or report on the fex-emu issue tracker.\");\n      return -1;\n    }\n\n    auto Targets = TargetReturn.value();\n\n    if (Targets.empty()) {\n      ExecWithInfo(\"Couldn't parse rootfs definition URL.\");\n      return -1;\n    }\n\n    int32_t DistroIndex = AskForDistroSelection(Targets);\n    if (DistroIndex != -1) {\n      const auto& Target = Targets[DistroIndex];\n      fextl::string RootFS = FEXCore::Config::GetDataDirectory() + \"RootFS/\";\n      auto filename = Target.URL.substr(Target.URL.find_last_of('/') + 1);\n      auto PathName = RootFS + filename;\n\n      if (!ValidateCheckExists(Target)) {\n        // Keep going\n      } else {\n        auto ValidateDownload = [&Target, &PathName]() -> std::pair<int32_t, bool> {\n          std::error_code ec;\n          if (ValidateDownloadSelection(Target)) {\n            uint64_t ExpectedHash = std::stoul(Target.Hash, nullptr, 16);\n\n            if (std::filesystem::exists(PathName, ec)) {\n              auto Res = XXFileHash::HashFile(PathName);\n              if (Res != ExpectedHash) {\n                fextl::string Text = fextl::fmt::format(\"Couldn't hash the rootfs or hash didn't match\\n\");\n                Text += fmt::format(\"Hash {:x} != Expected Hash {:x}\\n\", Res.value_or(0), ExpectedHash);\n                ExecWithInfo(Text);\n                return std::make_pair(-1, true);\n              }\n            } else {\n              ExecWithInfo(\"Correctly downloaded RootFS but doesn't exist?\");\n              return std::make_pair(-1, false);\n            }\n          } else {\n            ExecWithInfo(\"Couldn't download rootfs for some reason.\");\n            return std::make_pair(-1, false);\n          }\n\n          return std::make_pair(0, false);\n        };\n\n        std::pair<int32_t, bool> Result {};\n        while ((Result = ValidateDownload()).second == true && Result.first == -1) {\n\n          if (AskForConfirmation(\"Do you want to try downloading the RootFS again?\")) {\n            // Continue the loop\n          } else {\n            // Didn't want to retry, just exit now\n            return Result.first;\n          }\n        }\n\n        // Early exit on other errors\n        if (Result.first == -1 && Result.second == false) {\n          return Result.first;\n        }\n      }\n\n      struct ExtractStrings {\n        const char* ExtractOrAsIs;\n        const char* AsIsSinceMounterNonFunctional;\n        const char* AsIsSinceExtractorNonFunctional;\n        const char* AsIsSinceNothingWorks;\n      };\n\n      ArgOptions::CompressedImageOption UseImageAs {ArgOptions::CompressedUsageOption};\n      bool HasExtractor {};\n      bool HasMounter {};\n      std::function<bool(const fextl::string& Path, const fextl::string& RootFS, const fextl::string& FolderName)> ExtractHelper;\n      ExtractStrings ExtractingStrings;\n      if (Target.Type == WebFileFetcher::FileTargets::FileType::TYPE_SQUASHFS) {\n        HasExtractor = WorkingAppsTester::Has_Unsquashfs;\n        HasMounter = WorkingAppsTester::Has_Squashfuse;\n        ExtractHelper = UnSquash::UnsquashRootFS;\n        ExtractingStrings = {\n          \"Do you wish to extract the squashfs file or use it as-is?\",\n          \"Squashfuse doesn't work. Do you wish to extract the squashfs file?\",\n          \"Unsquashfs doesn't work. Do you want to use the squashfs file as-is?\",\n          \"Unsquashfs and squashfuse isn't working. Leaving rootfs as-is\",\n        };\n      } else if (Target.Type == WebFileFetcher::FileTargets::FileType::TYPE_EROFS) {\n        HasExtractor = WorkingAppsTester::Has_EroFSFsck;\n        HasMounter = WorkingAppsTester::Has_EroFSFuse;\n        ExtractHelper = UnSquash::ExtractEroFS;\n        ExtractingStrings = {\n          \"Do you wish to extract the erofs file or use it as-is?\",\n          \"erofsfuse doesn't work. Do you wish to extract the erofs file?\",\n          \"Extracting erofs doesn't work. Do you want to use the erofs file as-is?\",\n          \"Extracting erofs and erofsfuse isn't working. Leaving rootfs as-is\",\n        };\n      }\n\n      int32_t Result {};\n      std::vector<fextl::string> Args = {\n        \"Extract\",\n        \"As-Is\",\n      };\n\n      if (UseImageAs == ArgOptions::CompressedImageOption::OPTION_ASK) {\n        if (HasExtractor) {\n          if (HasMounter) {\n            Result = AskForConfirmationList(ExtractingStrings.ExtractOrAsIs, Args);\n            if (Result == 0) {\n              UseImageAs = ArgOptions::CompressedImageOption::OPTION_EXTRACT;\n            } else if (Result == 1) {\n              UseImageAs = ArgOptions::CompressedImageOption::OPTION_ASIS;\n            }\n          } else {\n            Args.pop_back();\n            Result = AskForConfirmationList(ExtractingStrings.AsIsSinceMounterNonFunctional, Args);\n            if (Result == 0) {\n              UseImageAs = ArgOptions::CompressedImageOption::OPTION_EXTRACT;\n            }\n          }\n        } else {\n          if (HasMounter) {\n            Args.erase(Args.begin());\n            Result = AskForConfirmationList(ExtractingStrings.AsIsSinceExtractorNonFunctional, Args);\n            if (Result == 0) {\n              // We removed an argument, Just change \"As-Is\" from 0 to 1 for later logic to work\n              UseImageAs = ArgOptions::CompressedImageOption::OPTION_ASIS;\n            }\n          } else {\n            Args.erase(Args.begin());\n            ExecWithInfo(ExtractingStrings.AsIsSinceNothingWorks);\n            UseImageAs = ArgOptions::CompressedImageOption::OPTION_ASIS;\n          }\n        }\n      }\n\n      if (UseImageAs == ArgOptions::CompressedImageOption::OPTION_EXTRACT) {\n        auto FolderName = filename.substr(0, filename.find_last_of('.'));\n        if (ExtractHelper(RootFS, PathName, FolderName)) {\n          // Remove the image file suffix since we extracted to that.\n          filename = std::move(FolderName);\n        }\n      }\n\n      if (AskForConfirmation(\"Do you wish to set this RootFS as default?\")) {\n        ConfigSetter::SetRootFSAsDefault(filename);\n        fextl::string Text = fextl::fmt::format(\"{} set as default RootFS\\n\", filename);\n        ExecWithInfo(Text);\n      }\n    }\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "Source/Tools/FEXRootFSFetcher/XXFileHash.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"XXFileHash.h\"\n\n#include <chrono>\n#include <fcntl.h>\n#include <fmt/format.h>\n#include <unistd.h>\n#include <vector>\n#include <xxhash.h>\n\nnamespace XXFileHash {\n// 32MB blocks\nconstexpr static size_t BLOCK_SIZE = 32 * 1024 * 1024;\nstd::optional<uint64_t> HashFile(const fextl::string& Filepath) {\n  int fd = open(Filepath.c_str(), O_RDONLY);\n  if (fd == -1) {\n    return std::nullopt;\n  }\n\n  XXH3_state_t* State {};\n  auto HadError = [fd, &State]() {\n    close(fd);\n    if (State) {\n      XXH3_freeState(State);\n    }\n    return std::nullopt;\n  };\n  // Get file size\n  off_t Size = lseek(fd, 0, SEEK_END);\n  if (Size == -1) {\n    return HadError();\n  }\n\n  // Reset to beginning\n  if (lseek(fd, 0, SEEK_SET) == -1) {\n    return HadError();\n  }\n\n  // Set up XXHash state\n  State = XXH3_createState();\n  const XXH64_hash_t Seed = 0;\n\n  if (!State) {\n    return HadError();\n  }\n\n  if (XXH3_64bits_reset_withSeed(State, Seed) == XXH_ERROR) {\n    return HadError();\n  }\n\n  const double SizeD = Size;\n  std::vector<char> Data(BLOCK_SIZE);\n  off_t CurrentOffset = 0;\n  auto Now = std::chrono::high_resolution_clock::now();\n\n  // Let the kernel know that we will be reading linearly\n  posix_fadvise(fd, 0, Size, POSIX_FADV_SEQUENTIAL);\n  while (CurrentOffset < Size) {\n\n    ssize_t Result = pread(fd, Data.data(), BLOCK_SIZE, CurrentOffset);\n    if (Result == -1) {\n      return HadError();\n    }\n\n    if (XXH3_64bits_update(State, Data.data(), Result) == XXH_ERROR) {\n      return HadError();\n    }\n    auto Cur = std::chrono::high_resolution_clock::now();\n    auto Dur = Cur - Now;\n    if (Dur >= std::chrono::seconds(1)) {\n      fmt::print(\"{:.2}% hashed\\n\", (double)CurrentOffset / SizeD * 100.0);\n      Now = Cur;\n    }\n    CurrentOffset += Result;\n  }\n\n  const XXH64_hash_t Hash = XXH3_64bits_digest(State);\n  XXH3_freeState(State);\n\n  close(fd);\n  return Hash;\n}\n} // namespace XXFileHash\n"
  },
  {
    "path": "Source/Tools/FEXRootFSFetcher/XXFileHash.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/string.h>\n\n#include <optional>\n\nnamespace XXFileHash {\nstd::optional<uint64_t> HashFile(const fextl::string& Filepath);\n}\n"
  },
  {
    "path": "Source/Tools/FEXServer/ArgumentLoader.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"ArgumentLoader.h\"\n#include \"Common/cpp-optparse/OptionParser.h\"\n#include \"PipeScanner.h\"\n#include \"ProcessPipe.h\"\n\n#include \"git_version.h\"\n\n#include <fmt/format.h>\n\nnamespace FEXServer::Config {\nstatic fextl::string Version = \"FEX-Emu (\" GIT_DESCRIBE_STRING \") \";\n\nFEXServerOptions Load(int argc, char** argv) {\n  FEXServerOptions FEXOptions {};\n  optparse::OptionParser Parser = optparse::OptionParser().version(Version);\n\n  Parser.add_option(\"-k\", \"--kill\").action(\"store_true\").set_default(false).help(\"Shutdown an already active FEXServer\");\n\n  Parser.add_option(\"-f\", \"--foreground\").action(\"store_true\").set_default(false).help(\"Run this FEXServer in the foreground\");\n\n  Parser.add_option(\"-p\", \"--persistent\").action(\"store\").type(\"int\").set_default(0).set_optional_value(true).metavar(\"n\").help(\"Make FEXServer persistent. Optional number of seconds\");\n\n  Parser.add_option(\"-w\", \"--wait\").action(\"store_true\").set_default(false).help(\"Wait for the FEXServer to shutdown\");\n  Parser.add_option(\"--wait_pipe\").action(\"store\").type(\"int\").set_default(-1).set_optional_value(true);\n  Parser.add_option(\"--watch_fd\").action(\"store\").type(\"int\").set_default(-1).set_optional_value(true).help(\"Adds FD to watch list of active processes\");\n\n  Parser.add_option(\"-v\").action(\"version\").help(\"Version string\");\n\n  optparse::Values Options = Parser.parse_args(argc, argv);\n\n  FEXOptions.Kill = Options.get(\"kill\");\n  FEXOptions.Foreground = Options.get(\"foreground\");\n  FEXOptions.Wait = Options.get(\"wait\");\n  if (FEXOptions.Wait) {\n    FEXOptions.Foreground = true;\n  }\n  FEXOptions.PersistentTimeout = Options.get(\"persistent\");\n\n  int WaitPipe = Options.get(\"wait_pipe\");\n  if (WaitPipe != -1) {\n    PipeScanner::SetWaitPipe(WaitPipe);\n  }\n  ProcessPipe::SetWatchFD(Options.get(\"watch_fd\"));\n  return FEXOptions;\n}\n} // namespace FEXServer::Config\n"
  },
  {
    "path": "Source/Tools/FEXServer/ArgumentLoader.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <cstdint>\n\nnamespace FEXServer::Config {\nstruct FEXServerOptions {\n  bool Kill;\n  bool Foreground;\n  bool Wait;\n  uint32_t PersistentTimeout;\n};\n\nFEXServerOptions Load(int argc, char** argv);\n} // namespace FEXServer::Config\n"
  },
  {
    "path": "Source/Tools/FEXServer/CMakeLists.txt",
    "content": "add_executable(FEXServer\n  Main.cpp\n  ArgumentLoader.cpp\n  Logger.cpp\n  PipeScanner.cpp\n  ProcessPipe.cpp\n  SquashFS.cpp)\n\ntarget_include_directories(FEXServer PRIVATE ${CMAKE_BINARY_DIR}/generated)\n\ntarget_link_libraries(FEXServer PRIVATE FEXCore Common CommonTools JemallocDummy ${PTHREAD_LIB})\n\nLinkerGC(FEXServer)\n\ninstall(TARGETS FEXServer RUNTIME\n  DESTINATION bin\n  COMPONENT Runtime)\n"
  },
  {
    "path": "Source/Tools/FEXServer/Logger.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <Common/Async.h>\n#include <Common/FEXServerClient.h>\n\n#include <thread>\n#include <vector>\n\nnamespace Logging {\nvoid ClientMsgHandler(int FD, FEXServerClient::Logging::PacketMsg* const Msg, const char* MsgStr);\n}\n\nnamespace Logger {\nint LogClientQueuePipe[2];\nstd::thread LogThread;\n\nvoid HandleLogData(int Socket) {\n  std::vector<uint8_t> Data(1500);\n  size_t CurrentRead {};\n  while (true) {\n    int Read = read(Socket, &Data.at(CurrentRead), Data.size() - CurrentRead);\n    if (Read > 0) {\n      CurrentRead += Read;\n      if (CurrentRead == Data.size()) {\n        Data.resize(Data.size() << 1);\n      } else {\n        // No more to read\n        break;\n      }\n    } else if (Read == 0) {\n      // Socket closed\n      return;\n    } else {\n      if (errno == EWOULDBLOCK) {\n        // no error\n      } else {\n        perror(\"read\");\n      }\n      break;\n    }\n  }\n\n  size_t CurrentOffset {};\n  while (CurrentOffset < CurrentRead) {\n    FEXServerClient::Logging::PacketHeader* Header = reinterpret_cast<FEXServerClient::Logging::PacketHeader*>(&Data[CurrentOffset]);\n    if (Header->PacketType == FEXServerClient::Logging::PacketTypes::TYPE_MSG) {\n      FEXServerClient::Logging::PacketMsg* Msg = reinterpret_cast<FEXServerClient::Logging::PacketMsg*>(&Data[CurrentOffset]);\n      const char* MsgText = reinterpret_cast<const char*>(&Data[CurrentOffset + sizeof(FEXServerClient::Logging::PacketMsg)]);\n      Logging::ClientMsgHandler(Socket, Msg, MsgText);\n\n      CurrentOffset += sizeof(FEXServerClient::Logging::PacketMsg) + Msg->MessageLength;\n    } else {\n      CurrentOffset = CurrentRead;\n    }\n  }\n}\n\nvoid LogThreadFunc() {\n  fasio::poll_reactor Reactor;\n\n  auto Pipe = fasio::posix_descriptor {Reactor, LogClientQueuePipe[0]};\n  fextl::vector<fasio::posix_descriptor> Clients;\n\n  // Wait for AppendLogFD to send file descriptors over LogClientQueuePipe.\n  // When data becomes ready, we read the FD and register it to the reactor.\n  Pipe.async_wait([&](fasio::error ec) {\n    if (ec != fasio::error::success) {\n      return fasio::post_callback::stop_reactor;\n    }\n\n    int ReceivedFD;\n    read(Pipe.FD, &ReceivedFD, sizeof(ReceivedFD));\n\n    // Register client and set up read callback\n    Clients.emplace_back(Reactor, ReceivedFD);\n    Clients.back().async_wait([&Clients, ReceivedFD](fasio::error ec) {\n      if (ec != fasio::error::success) {\n        std::iter_swap(std::find_if(Clients.begin(), Clients.end(), [=](auto& desc) { return desc.FD == ReceivedFD; }), std::prev(Clients.end()));\n        Clients.pop_back();\n        return fasio::post_callback::drop;\n      }\n\n      HandleLogData(ReceivedFD);\n      return fasio::post_callback::repeat;\n    });\n\n    return fasio::post_callback::repeat;\n  });\n\n  Reactor.run();\n}\n\nvoid StartLogThread() {\n  pipe2(LogClientQueuePipe, 0);\n\n  LogThread = std::thread(LogThreadFunc);\n}\n\nvoid AppendLogFD(int FD) {\n  write(LogClientQueuePipe[1], &FD, sizeof(FD));\n}\n\nbool LogThreadRunning() {\n  return LogThread.joinable();\n}\n\nvoid Shutdown() {\n  close(LogClientQueuePipe[1]);\n\n  if (LogThread.joinable()) {\n    LogThread.join();\n  }\n}\n} // namespace Logger\n"
  },
  {
    "path": "Source/Tools/FEXServer/Logger.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\nnamespace Logger {\nvoid AppendLogFD(int FD);\nvoid StartLogThread();\nbool LogThreadRunning();\nvoid Shutdown();\n} // namespace Logger\n"
  },
  {
    "path": "Source/Tools/FEXServer/Main.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"ArgumentLoader.h\"\n#include \"Logger.h\"\n#include \"PipeScanner.h\"\n#include \"PortabilityInfo.h\"\n#include \"ProcessPipe.h\"\n#include \"SquashFS.h\"\n#include \"Common/ArgumentLoader.h\"\n#include \"Common/Config.h\"\n#include \"Common/FEXServerClient.h\"\n\n#include <fmt/color.h>\n\n#include <chrono>\n#include <ctime>\n#include <dirent.h>\n#include <fcntl.h>\n#include <filesystem>\n#include <iterator>\n#include <mutex>\n#include <optional>\n#include <poll.h>\n#include <sys/prctl.h>\n#include <sys/signal.h>\n#include <sys/socket.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <sys/un.h>\n#include <sys/wait.h>\n#include <termios.h>\n#include <thread>\n#include <unistd.h>\n\nstatic timespec StartTime {};\n\n// Set an empty style to disable coloring when FEXServer output is e.g. piped to a file\nstatic std::optional<fmt::text_style> DisableColors = isatty(STDOUT_FILENO) ? std::nullopt : std::optional {fmt::text_style {}};\n\nnamespace Logging {\nvoid MsgHandler(LogMan::DebugLevels Level, const char* Message) {\n  const auto Output = fmt::format(\"{} {}\\n\", fmt::styled(LogMan::DebugLevelStr(Level), DisableColors.value_or(DebugLevelStyle(Level))), Message);\n  write(STDOUT_FILENO, Output.c_str(), Output.size());\n}\n\nvoid AssertHandler(const char* Message) {\n  return MsgHandler(LogMan::ASSERT, Message);\n}\n\nvoid ClientMsgHandler(int FD, FEXServerClient::Logging::PacketMsg* const Msg, const char* MsgStr) {\n  if (!StartTime.tv_sec && !StartTime.tv_nsec) {\n    StartTime = Msg->Header.Timestamp;\n  }\n  auto seconds = Msg->Header.Timestamp.tv_sec - StartTime.tv_sec - (Msg->Header.Timestamp.tv_nsec < StartTime.tv_nsec);\n  auto nanos = (1'000'000'000 + Msg->Header.Timestamp.tv_nsec - StartTime.tv_nsec) % 1'000'000'000;\n  char Metadata[128];\n  auto Cursor =\n    fmt::format_to(&Metadata[0], DisableColors.value_or(LogMan::DebugLevelStyle(Msg->Level)), \"{}\", LogMan::DebugLevelStr(Msg->Level));\n  Cursor = fmt::format_to(Cursor, DisableColors.value_or(fmt::fg(fmt::color::light_gray)), \" {}|{} \", Msg->Header.PID, Msg->Header.TID);\n  Cursor = fmt::format_to(Cursor, DisableColors.value_or(fmt::fg(fmt::color::gray)), \"{}.{:03}\", seconds, nanos / 1000000);\n  *Cursor = 0;\n  auto Output = fmt::format(\"{} {}\\n\", Metadata, MsgStr);\n  write(STDERR_FILENO, Output.c_str(), Output.size());\n}\n} // namespace Logging\n\nnamespace {\nvoid ActionHandler(int sig, siginfo_t* info, void* context) {\n  // TODO: Fix this\n  if (sig == SIGINT) {\n    // Someone trying to kill us. Shutdown.\n    ProcessPipe::Shutdown();\n\n    // Clear \"^C\" string that most terminals print when pressing Ctrl+C.\n    fprintf(stderr, \"\\r\");\n    return;\n  }\n  _exit(1);\n}\n\nvoid ActionIgnore(int sig, siginfo_t* info, void* context) {}\n\nvoid SetupSignals() {\n  // Setup our signal handlers now so we can capture some events\n  struct sigaction act {};\n  act.sa_sigaction = ActionHandler;\n  act.sa_flags = SA_SIGINFO;\n\n  // SIGTERM if something is trying to terminate us\n  sigaction(SIGTERM, &act, nullptr);\n  // SIGINT if something is trying to terminate us\n  sigaction(SIGINT, &act, nullptr);\n\n  // SIGUSR1 just to interrupt syscalls\n  act.sa_sigaction = ActionIgnore;\n  sigaction(SIGUSR1, &act, nullptr);\n\n  // Ignore SIGPIPE, we will be checking for pipe closure which could send this signal\n  signal(SIGPIPE, SIG_IGN);\n  // Reset SIGCHLD which is likely SIG_IGN if FEX started the server.\n  // We now wait for child processes with waitpid, newer libfuse also requires SIGCHLD to not be ignored by child processes.\n  signal(SIGCHLD, SIG_DFL);\n}\n\n/**\n * @brief Deparents itself by forking and terminating the parent process.\n */\nvoid DeparentSelf() {\n  auto SystemdEnv = getenv(\"INVOCATION_ID\");\n  if (SystemdEnv) {\n    // If FEXServer was launched through systemd then don't deparent, otherwise systemd kills the entire server.\n    return;\n  }\n\n  pid_t pid = fork();\n\n  if (pid != 0) {\n    // Parent is leaving to force this process to deparent itself\n    // This lets this process become the child of whatever the reaper parent is\n    _exit(0);\n  }\n}\n} // namespace\n\nint main(int argc, char** argv, char** const envp) {\n  auto Options = FEXServer::Config::Load(argc, argv);\n\n  SetupSignals();\n\n  if (Options.Foreground) {\n    LogMan::Throw::InstallHandler(Logging::AssertHandler);\n    LogMan::Msg::InstallHandler(Logging::MsgHandler);\n  }\n\n  if (!Options.Foreground) {\n    DeparentSelf();\n  }\n\n  FEX::Config::LoadConfig({}, envp, FEX::ReadPortabilityInformation());\n\n  // Reload the meta layer\n  FEXCore::Config::ReloadMetaLayer();\n\n  if (Options.Wait) {\n    int ServerPipe = FEXServerClient::ConnectToServer();\n    if (ServerPipe != -1) {\n      int FEXServerPID = FEXServerClient::RequestPIDFD(ServerPipe);\n      close(ServerPipe);\n      if (FEXServerPID != -1) {\n        LogMan::Msg::IFmt(\"[FEXServer] Waiting for FEXServer to close\");\n        // We can't use waitid (P_PIDFD) here because the active FEXServer isn't a child of this process.\n        // Use poll instead which will return once the pidfd closes.\n        pollfd PollFD;\n        PollFD.fd = FEXServerPID;\n        PollFD.events = POLLIN | POLLOUT | POLLRDHUP | POLLERR | POLLHUP | POLLNVAL;\n\n        // Wait for a result on the pipe that isn't EINTR\n        while (poll(&PollFD, 1, -1) == -1 && errno == EINTR)\n          ;\n\n        LogMan::Msg::IFmt(\"[FEXServer] FEXServer shutdown\");\n      }\n      PipeScanner::ClosePipes();\n    }\n    return 0;\n  }\n\n  if (Options.Kill) {\n    int ServerPipe = FEXServerClient::ConnectToServer();\n\n    if (ServerPipe != -1) {\n      FEXServerClient::RequestServerKill(ServerPipe);\n      LogMan::Msg::DFmt(\"[FEXServer] Sent kill packet\");\n      PipeScanner::ClosePipes();\n    }\n    return 0;\n  }\n\n  if (!ProcessPipe::InitializeServerPipe()) {\n    // Someone else already owns the FEXServer pipe\n    PipeScanner::ClosePipes();\n    return -1;\n  }\n\n  // Steam doesn't get to connect to global sockets.\n#ifndef FEX_STEAM_SUPPORT\n  if (!ProcessPipe::InitializeServerSocket(true)) {\n    // Couldn't create server socket for some reason\n    PipeScanner::ClosePipes();\n    return -1;\n  }\n#endif\n\n  if (!ProcessPipe::InitializeServerSocket(false)) {\n    // Couldn't create server socket for some reason\n    PipeScanner::ClosePipes();\n    return -1;\n  }\n\n  // Switch this process over to a new session id\n  // Probably not required but allows this to become the process group leader of its session\n  ::setsid();\n\n  // Set process as a subreaper so subprocesses can't escape\n  if (::prctl(PR_SET_CHILD_SUBREAPER, 1) == -1) [[unlikely]] {\n    // If subreaper failed then squashfuse/erofsfuse can escape, which isn't fatal.\n    LogMan::Msg::DFmt(\"[FEXServer] Couldn't set subreaper.\");\n  }\n\n  bool EnableLoggingThread = Options.Foreground;\n#ifndef FEX_STEAM_SUPPORT\n  // If running with Steam support then always enable the logging thread.\n  EnableLoggingThread = true;\n#endif\n\n  if (EnableLoggingThread) {\n    // Only start a log thread if we are in the foreground.\n    // Prevents FEX from trying to log to nothing.\n    Logger::StartLogThread();\n  }\n\n  if (!SquashFS::InitializeSquashFS()) {\n    LogMan::Msg::DFmt(\"[FEXServer] Couldn't mount squashfs\");\n    return -1;\n  }\n\n  // Close the pipes we found at the start\n  // This will let FEX know we are ready\n  PipeScanner::ClosePipes();\n\n  ProcessPipe::SetConfiguration(Options.Foreground, Options.PersistentTimeout ?: 1);\n\n  // Actually spin up the request thread.\n  // Any applications that were waiting for the socket to accept will then go through here.\n  ProcessPipe::WaitForRequests();\n\n  SquashFS::UnmountRootFS();\n\n  Logger::Shutdown();\n\n  return 0;\n}\n"
  },
  {
    "path": "Source/Tools/FEXServer/PipeScanner.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <dirent.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <unistd.h>\n#include <vector>\n#include <fcntl.h>\n\nnamespace PipeScanner {\nstd::vector<int> IncomingPipes {};\nvoid SetWaitPipe(int FD) {\n  int flags = fcntl(FD, F_GETFD);\n  flags |= FD_CLOEXEC;\n  fcntl(FD, F_SETFD, flags);\n  IncomingPipes.emplace_back(FD);\n}\n\nvoid ClosePipes() {\n  for (auto pipe : IncomingPipes) {\n    close(pipe);\n  }\n  IncomingPipes.clear();\n}\n} // namespace PipeScanner\n"
  },
  {
    "path": "Source/Tools/FEXServer/PipeScanner.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\nnamespace PipeScanner {\nvoid SetWaitPipe(int FD);\nvoid ClosePipes();\n} // namespace PipeScanner\n"
  },
  {
    "path": "Source/Tools/FEXServer/ProcessPipe.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"FEXHeaderUtils/Syscalls.h\"\n#include \"Logger.h\"\n#include \"SquashFS.h\"\n\n#include <Common/AsyncNet.h>\n#include <Common/Config.h>\n#include <Common/FDUtils.h>\n#include <Common/FEXServerClient.h>\n\n#include <FEXCore/Core/CodeCache.h>\n#include <FEXCore/HLE/SourcecodeResolver.h>\n\n#include <fmt/ranges.h>\n\n#include <atomic>\n#include <cassert>\n#include <fcntl.h>\n#include <filesystem>\n#include <fstream>\n#include <poll.h>\n#include <string>\n#include <sys/file.h>\n#include <sys/resource.h>\n#include <sys/socket.h>\n#include <sys/un.h>\n#include <sys/wait.h>\n#include <vector>\n\n#include <xxhash.h>\n\nnamespace FEXCore {\ninline bool operator<(const FEXCore::ExecutableFileInfo& a, const FEXCore::ExecutableFileInfo& b) noexcept {\n  return a.FileId < b.FileId;\n}\n} // namespace FEXCore\n\ntemplate<>\nstruct std::hash<FEXCore::ExecutableFileInfo> {\n  std::size_t operator()(const FEXCore::ExecutableFileInfo& Val) const noexcept {\n    return Val.FileId;\n  }\n};\n\nnamespace ProcessPipe {\nconstexpr int USER_PERMS = S_IRWXU | S_IRWXG | S_IRWXO;\nint ServerLockFD {-1};\nint WatchFD {-1};\nstd::optional<fasio::tcp_acceptor> ServerAcceptor;\nstd::optional<fasio::tcp_acceptor> ServerFSAcceptor;\nint NumClients = 0;\ntime_t RequestTimeout {10};\nbool Foreground {false};\nstd::vector<struct pollfd> PollFDs {};\n\n// FD count watching\nconstexpr size_t static MAX_FD_DISTANCE = 32;\nrlimit MaxFDs {};\nstd::atomic<size_t> NumFilesOpened {};\n\n// Path to directory for unprocessed code maps dumped by FEX\nstatic std::string NewCodeMapDirectory;\n\n// Path to directory for processed code maps (suitable for cache generation)\nstatic std::string ReadyCodeMapDirectory;\n\nvoid SetWatchFD(int FD) {\n  WatchFD = FD;\n}\n\nsize_t GetNumFilesOpen() {\n  // Walk /proc/self/fd/ to see how many open files we currently have\n  const std::filesystem::path self {\"/proc/self/fd/\"};\n\n  return std::distance(std::filesystem::directory_iterator {self}, std::filesystem::directory_iterator {});\n}\n\nvoid GetMaxFDs() {\n  // Get our kernel limit for the number of open files\n  if (getrlimit(RLIMIT_NOFILE, &MaxFDs) != 0) {\n    fprintf(stderr, \"[FEXMountDaemon] getrlimit(RLIMIT_NOFILE) returned error %d %s\\n\", errno, strerror(errno));\n  }\n\n  // Walk /proc/self/fd/ to see how many open files we currently have\n  NumFilesOpened = GetNumFilesOpen();\n}\n\nvoid CheckRaiseFDLimit() {\n  if (NumFilesOpened < (MaxFDs.rlim_cur - MAX_FD_DISTANCE)) {\n    // No need to raise the limit.\n    return;\n  }\n\n  if (MaxFDs.rlim_cur == MaxFDs.rlim_max) {\n    fprintf(stderr, \"[FEXMountDaemon] Our open FD limit is already set to max and we are wanting to increase it\\n\");\n    fprintf(stderr, \"[FEXMountDaemon] FEXMountDaemon will now no longer be able to track new instances of FEX\\n\");\n    fprintf(stderr, \"[FEXMountDaemon] Current limit is %zd(hard %zd) FDs and we are at %zd\\n\", MaxFDs.rlim_cur, MaxFDs.rlim_max,\n            GetNumFilesOpen());\n    fprintf(stderr, \"[FEXMountDaemon] Ask your administrator to raise your kernel's hard limit on open FDs\\n\");\n    return;\n  }\n\n  rlimit NewLimit = MaxFDs;\n\n  // Just multiply by two\n  NewLimit.rlim_cur <<= 1;\n\n  // Now limit to the hard max\n  NewLimit.rlim_cur = std::min(NewLimit.rlim_cur, NewLimit.rlim_max);\n\n  if (setrlimit(RLIMIT_NOFILE, &NewLimit) != 0) {\n    fprintf(stderr, \"[FEXMountDaemon] Couldn't raise FD limit to %zd even though our hard limit is %zd\\n\", NewLimit.rlim_cur, NewLimit.rlim_max);\n  } else {\n    // Set the new limit\n    MaxFDs = NewLimit;\n  }\n}\n\nbool InitializeServerPipe() {\n  auto ServerFolder = FEXServerClient::GetServerLockFolder();\n\n  std::error_code ec {};\n  if (!std::filesystem::exists(ServerFolder, ec)) {\n    // Doesn't exist, create the the folder as a user convenience\n    if (!std::filesystem::create_directories(ServerFolder, ec)) {\n      LogMan::Msg::EFmt(\"Couldn't create server pipe folder at: {}\", ServerFolder);\n      return false;\n    }\n  }\n\n  auto ServerLockPath = FEXServerClient::GetServerLockFile();\n\n  // Now this is some tricky locking logic to ensure that we only ever have one server running\n  // The logic is as follows:\n  // - Try to make the lock file\n  // - If Exists then check to see if it is a stale handle\n  //   - Stale checking means opening the file that we know exists\n  //   - Then we try getting a write lock\n  //   - If we fail to get the write lock, then leave\n  //   - Otherwise continue down the codepath and degrade to read lock\n  // - Else try to acquire a write lock to ensure only one FEXServer exists\n  //\n  // - Once a write lock is acquired, downgrade it to a read lock\n  //   - This ensures that future FEXServers won't race to create multiple read locks\n  int Ret = open(ServerLockPath.c_str(), O_RDWR | O_CREAT | O_CLOEXEC | O_EXCL, USER_PERMS);\n  ServerLockFD = Ret;\n\n  if (Ret == -1 && errno == EEXIST) {\n    // If the lock exists then it might be a stale connection.\n    // Check the lock status to see if another process is still alive.\n    ServerLockFD = open(ServerLockPath.c_str(), O_RDWR | O_CLOEXEC, USER_PERMS);\n    if (ServerLockFD != -1) {\n      // Now that we have opened the file, try to get a write lock.\n      struct flock lk {\n        .l_type = F_WRLCK,\n        .l_whence = SEEK_SET,\n        .l_start = 0,\n        .l_len = 0,\n      };\n      Ret = fcntl(ServerLockFD, F_SETLK, &lk);\n\n      if (Ret != -1) {\n        // Write lock was gained, we can now continue onward.\n      } else {\n        // We couldn't get a write lock, this means that another process already owns a lock on the lock\n        close(ServerLockFD);\n        ServerLockFD = -1;\n        return false;\n      }\n    } else {\n      // File couldn't get opened even though it existed?\n      // Must have raced something here.\n      return false;\n    }\n  } else if (Ret == -1) {\n    // Unhandled error.\n    LogMan::Msg::EFmt(\"Unable to create FEXServer named lock file at: {} {} {}\", ServerLockPath, errno, strerror(errno));\n    return false;\n  } else {\n    // FIFO file was created. Try to get a write lock\n    struct flock lk {\n      .l_type = F_WRLCK,\n      .l_whence = SEEK_SET,\n      .l_start = 0,\n      .l_len = 0,\n    };\n    Ret = fcntl(ServerLockFD, F_SETLK, &lk);\n\n    if (Ret == -1) {\n      // Couldn't get a write lock, something else must have got it\n      close(ServerLockFD);\n      ServerLockFD = -1;\n      return false;\n    }\n  }\n\n  // Now that a write lock is held, downgrade it to a read lock\n  struct flock lk {\n    .l_type = F_RDLCK,\n    .l_whence = SEEK_SET,\n    .l_start = 0,\n    .l_len = 0,\n  };\n  Ret = fcntl(ServerLockFD, F_SETLK, &lk);\n\n  if (Ret == -1) {\n    // This shouldn't occur\n    LogMan::Msg::EFmt(\"Unable to downgrade a write lock to a read lock {} {} {}\", ServerLockPath, errno, strerror(errno));\n    close(ServerLockFD);\n    ServerLockFD = -1;\n    return false;\n  }\n\n  return true;\n}\n\nstatic fasio::poll_reactor Reactor;\n\nvoid HandleSocketData(fasio::tcp_socket&);\n\nbool InitializeServerSocket(bool abstract) {\n  fextl::string ServerSocketName;\n  if (abstract) {\n    ServerSocketName = FEXServerClient::GetServerSocketName();\n  } else {\n    ServerSocketName = FEXServerClient::GetServerSocketPath();\n    // Unlink the socket file if it exists\n    // We are being asked to create a daemon, not error check\n    // We don't care if this failed or not\n    unlink(ServerSocketName.c_str());\n  }\n  auto Acceptor = fasio::tcp_acceptor::create(Reactor, abstract, ServerSocketName);\n  if (!Acceptor) {\n    LogMan::Msg::EFmt(\"Failed to create FEXServer socket: error {} ({})\", errno, strerror(errno));\n    return false;\n  }\n\n  Acceptor->async_accept([](fasio::error ec, std::optional<fasio::tcp_socket> Socket) {\n    if (ec != fasio::error::success) {\n      if (ec == fasio::error::generic_errno) {\n        LogMan::Msg::EFmt(\"FEXServer failed to establish client connection: error {} ({})\", errno, strerror(errno));\n      }\n      // Ignore error and wait for next connection\n      return fasio::post_callback::repeat;\n    }\n\n    int FD = Socket->FD;\n    ++NumClients;\n    Reactor.bind_handler(\n      pollfd {\n        .fd = FD,\n        .events = POLLIN | POLLPRI | POLLRDHUP,\n        .revents = 0,\n      },\n      [Socket = std::move(Socket).value()](fasio::error ec) mutable {\n        if (ec != fasio::error::success) {\n          close(Socket.FD);\n          --NumClients;\n          return fasio::post_callback::drop;\n        }\n        HandleSocketData(Socket);\n        // Wait for next data\n        return fasio::post_callback::repeat;\n      });\n\n    // Wait for next connection\n    return fasio::post_callback::repeat;\n  });\n\n  (abstract ? ServerAcceptor : ServerFSAcceptor) = std::move(Acceptor).value();\n  return true;\n}\n\nvoid SendEmptyErrorPacket(fasio::tcp_socket& Socket) {\n  FEXServerClient::FEXServerResultPacket Res {\n    .Header {\n      .Type = FEXServerClient::PacketType::TYPE_ERROR,\n    },\n  };\n\n  fasio::mutable_buffer Data = {.Data = std::as_writable_bytes(std::span(&Res, 1))};\n  fasio::error ec;\n  write(Socket, Data, ec);\n}\n\nvoid SendFDSuccessPacket(fasio::tcp_socket& Socket, int FD) {\n  FEXServerClient::FEXServerResultPacket Res {\n    .Header {\n      .Type = FEXServerClient::PacketType::TYPE_SUCCESS,\n    },\n  };\n\n  fasio::mutable_buffer Data = {.Data = std::as_writable_bytes(std::span(&Res, 1)), .FD = &FD};\n  fasio::error ec;\n  write(Socket, Data, ec);\n}\n\n// Discovers any pending code maps, parses their contents into a runtime data structure, and deletes them\nstatic std::map<FEXCore::ExecutableFileInfo, fextl::set<uintptr_t>>\nImportPendingCodeMaps(const FEXCore::ExecutableFileInfo& MainFileId, bool HasMultiblock) {\n  // Detect code maps by checking file name suffixes by counting up an index.\n  // Code maps that are ready for reading must be non-empty and flock(FLOCK_EX) must succeed:\n  // - If empty, we tried generating the cache before the client could even lock it\n  // - If exclusively lockable, we know the client either closed or crashed\n  std::vector<std::string> CodeMaps;\n  for (int Index = 0; true; ++Index) {\n    auto CodeMap = fmt::format(\"{}/{}.{}.bin\", NewCodeMapDirectory, FEXCore::CodeMap::GetBaseFilename(MainFileId, !HasMultiblock), Index);\n    auto FD = open(CodeMap.c_str(), O_RDONLY);\n    if (FD == -1) {\n      break;\n    }\n\n    // Acquire exclusive lock to ensure the client process is done writing data.\n    // Also ensure the file is non-empty, otherwise we're racing the client in acquiring the initial lock.\n    struct stat FileStats;\n    fstat(FD, &FileStats);\n    if (FileStats.st_size == 0 || flock(FD, LOCK_EX | LOCK_NB) != 0) {\n      fmt::print(\"Code map {} is still in use, skipping\\n\", CodeMap);\n      // Still being written to by a client process, so skip this file\n      // TODO: Rename from X.n.bin to X.0.bin (once the latter has been removed!) to ensure we'll catch it on next run\n      close(FD);\n      continue;\n    } else {\n      fmt::print(\"Found code map {}, queuing for merge\\n\", CodeMap);\n    }\n    close(FD);\n    CodeMaps.push_back(CodeMap);\n  }\n\n  // Update merged code map\n  std::map<FEXCore::ExecutableFileInfo, fextl::set<uintptr_t>> ImportedCodeMaps;\n  if (!CodeMaps.empty()) {\n    fmt::print(\"Found {} new code maps, updating reference code map\\n\", CodeMaps.size());\n\n    for (auto& CodeMap : CodeMaps) {\n      std::ifstream Incoming(CodeMap, std::ios_base::binary);\n      auto NewBlocks = FEXCore::CodeMap::ParseCodeMap(Incoming);\n      for (auto& [FileId, Contents] : NewBlocks) {\n        ImportedCodeMaps.emplace(std::piecewise_construct, std::forward_as_tuple(nullptr, FileId, std::move(Contents.Filename)),\n                                 std::forward_as_tuple(std::move(Contents.Blocks)));\n      }\n    }\n  }\n\n  // Delete all imported code maps\n  for (auto& CodeMapFile : CodeMaps) {\n    std::filesystem::remove(CodeMapFile);\n    // TODO: Rename any pending (not finalized) code maps to PROGRAMNAME.0.bin so it will be found on the next run\n  }\n\n  return ImportedCodeMaps;\n}\n\n/**\n * Writes aggregated code map data into a single code map file that is ready to be used for cache generation\n */\nstatic void WriteNewCodeMap(const FEXCore::ExecutableFileInfo& File, const std::string& OutputName, const fextl::set<uintptr_t>& Blocks,\n                            bool IsMainFile, const auto& Dependencies) {\n  fmt::print(\"Writing {} blocks to {}\\n\", Blocks.size(), OutputName);\n\n  struct CodeMapOpener : FEXCore::CodeMapOpener {\n    CodeMapOpener(const std::string& Filename) {\n      FD = creat(Filename.c_str(), 0644);\n    }\n\n    int OpenCodeMapFile() override {\n      return FD;\n    }\n\n    int FD;\n  };\n\n  CodeMapOpener CodeMapOpener(OutputName);\n  FEXCore::CodeMapWriter OutputCodeMap(CodeMapOpener, true);\n  if (IsMainFile) {\n    // List the main executable and all used libraries\n    OutputCodeMap.AppendSetMainExecutable(File);\n\n    for (auto& [Dependency, _] : Dependencies) {\n      OutputCodeMap.AppendLibraryLoad(Dependency);\n    }\n  } else {\n    // List only the library itself\n    OutputCodeMap.AppendLibraryLoad(File);\n  }\n\n  for (auto& Block : Blocks) {\n    OutputCodeMap.AppendBlock(FEXCore::ExecutableFileSectionInfo {File, 0}, Block);\n  }\n}\n\nenum class NeedsCacheRefresh {\n  No,\n  Yes,\n};\n\n/**\n * Checks and processes new code maps generated by FEX for the given application.\n *\n * Processed code maps are merged into the reference code map and deleted afterwards.\n *\n * The returned map is a list of all dependencies of the main executables discovered,\n * associated with a flag to indicate need for cache regeneration.\n */\nstatic std::map<FEXCore::ExecutableFileInfo, NeedsCacheRefresh> AggregateCodeMaps(const FEXCore::ExecutableFileInfo& MainFileId, bool HasMultiblock) {\n  std::map<FEXCore::ExecutableFileInfo, NeedsCacheRefresh> Result;\n\n  // Read all dependencies discovered in previous runs\n  {\n    auto MainFileCodeMapPath = fmt::format(\"{}/{}\", ReadyCodeMapDirectory, FEXCore::CodeMap::GetBaseFilename(MainFileId, !HasMultiblock));\n    std::ifstream MainFileCodeMap(MainFileCodeMapPath, std::ios_base::binary);\n    for (auto& [FileId, Contents] : FEXCore::CodeMap::ParseCodeMap(MainFileCodeMap)) {\n      Result.emplace(std::piecewise_construct, std::forward_as_tuple(nullptr, FileId, Contents.Filename),\n                     std::forward_as_tuple(NeedsCacheRefresh::No));\n    }\n  }\n\n  // Accumulate information from new code maps\n  auto IncomingCodeMap = ImportPendingCodeMaps(MainFileId, HasMultiblock);\n  for (auto& [File, _] : IncomingCodeMap) {\n    Result.emplace(std::piecewise_construct, std::forward_as_tuple(nullptr, File.FileId, File.Filename),\n                   std::forward_as_tuple(NeedsCacheRefresh::No));\n  }\n\n  // For each referenced library, add referenced offsets to that library's reference code map\n  for (auto& [File, Blocks] : IncomingCodeMap) {\n    const auto BinaryName = std::string {FEXCore::CodeMap::GetBaseFilename(File, !HasMultiblock)};\n    auto OutputName = fmt::format(\"{}/{}\", ReadyCodeMapDirectory, BinaryName);\n\n    // Check if the new code maps add any new information to the previous code map\n    if (auto ReferenceCodeMap = std::ifstream(OutputName, std::ios_base::binary)) {\n      auto PreviousBlocks = FEXCore::CodeMap::ParseCodeMap(ReferenceCodeMap).at(File.FileId).Blocks;\n      auto NumPreviousBlocks = PreviousBlocks.size();\n      Blocks.merge(std::move(PreviousBlocks));\n      if (Blocks.size() == NumPreviousBlocks) {\n        // No new blocks => no need to regenerate the corresponding cache\n        continue;\n      } else {\n        fmt::println(\"  Found {} new blocks ({} total) in code map {} for {}\", Blocks.size(), NumPreviousBlocks, BinaryName, File.Filename);\n      }\n    }\n\n    // Update code map and queue for cache generation\n    std::map<FEXCore::ExecutableFileInfo, NeedsCacheRefresh> Empty;\n    WriteNewCodeMap(File, OutputName, Blocks, true, File.FileId == MainFileId.FileId ? Result : Empty);\n    Result.at(File) = NeedsCacheRefresh::Yes;\n  }\n\n  return Result;\n}\n\nint32_t EmbedSubprocess(const char* path, char* const* args) {\n  pid_t pid = fork();\n  if (pid == 0) {\n    execvp(path, args);\n    _exit(-1);\n  } else {\n    int32_t Status {};\n    while (waitpid(pid, &Status, 0) == -1 && errno == EINTR)\n      ;\n    if (WIFEXITED(Status)) {\n      return (int8_t)WEXITSTATUS(Status);\n    }\n  }\n\n  return -1;\n}\n\n/**\n * Spawn a FEXOfflineCompiler instance to generate a code cache from the given code map\n */\nstatic int RunOfflineCompiler(const char* CodeMap) {\n  const char* ExecveArgs[] = {\"FEXOfflineCompiler\", \"generate\", CodeMap, nullptr};\n  return EmbedSubprocess(\"FEXOfflineCompiler\", const_cast<char* const*>(&ExecveArgs[0]));\n};\n\nvoid HandleSocketData(fasio::tcp_socket& Socket) {\n  std::vector<uint8_t> Data(1500);\n\n  // Get the current number of FDs of the process before we start handling sockets.\n  GetMaxFDs();\n\n  int inFD = -1;\n  fasio::mutable_buffer buffer = {std::as_writable_bytes(std::span(Data)), nullptr, &inFD};\n\n  {\n    fasio::error ec;\n\n    auto Read = Socket.read_some(buffer, ec);\n    if (ec == fasio::error::success) {\n      assert(Read >= sizeof(FEXServerClient::FEXServerRequestPacket));\n      buffer = {buffer.Data.subspan(0, Read)};\n    } else if (ec == fasio::error::eof) {\n      return;\n    } else {\n      perror(\"read\");\n      return;\n    }\n  }\n\n  while (buffer.size() > 0) {\n    FEXServerClient::FEXServerRequestPacket* Req = reinterpret_cast<FEXServerClient::FEXServerRequestPacket*>(Data.data());\n    switch (Req->Header.Type) {\n    case FEXServerClient::PacketType::TYPE_KILL:\n      Reactor.stop_async();\n      buffer += sizeof(FEXServerClient::FEXServerRequestPacket::BasicRequest);\n      break;\n    case FEXServerClient::PacketType::TYPE_GET_LOG_FD: {\n      if (Logger::LogThreadRunning()) {\n        int fds[2] {};\n        pipe2(fds, 0);\n        // 0 = Read\n        // 1 = Write\n        Logger::AppendLogFD(fds[0]);\n\n        SendFDSuccessPacket(Socket, fds[1]);\n\n        // Close the write side now, doesn't matter to us\n        close(fds[1]);\n\n        // Check if we need to increase the FD limit.\n        ++NumFilesOpened;\n        CheckRaiseFDLimit();\n      } else {\n        // Log thread isn't running. Let FEX know it can't have one.\n        SendEmptyErrorPacket(Socket);\n      }\n\n      buffer += sizeof(FEXServerClient::FEXServerRequestPacket::Header);\n      break;\n    }\n    case FEXServerClient::PacketType::TYPE_GET_ROOTFS_PATH: {\n      const fextl::string& MountFolder = SquashFS::GetMountFolder();\n\n      FEXServerClient::FEXServerResultPacket Res {\n        .MountPath {\n          .Header {\n            .Type = FEXServerClient::PacketType::TYPE_GET_ROOTFS_PATH,\n          },\n          .Length = MountFolder.size() + 1,\n        },\n      };\n\n      char Null {};\n\n      fasio::mutable_buffer Data[] = {\n        {.Data = std::as_writable_bytes(std::span(&Res, 1))},\n        {.Data = std::as_writable_bytes(std::span(const_cast<fextl::string&>(MountFolder)))},\n        {.Data = std::as_writable_bytes(std::span(&Null, 1))},\n      };\n      fasio::error ec;\n      write(Socket, Chained(Data), ec);\n\n      buffer += sizeof(FEXServerClient::FEXServerRequestPacket::BasicRequest);\n      break;\n    }\n    case FEXServerClient::PacketType::TYPE_GET_PID_FD: {\n      int FD = FHU::Syscalls::pidfd_open(::getpid(), 0);\n\n      if (FD < 0) {\n        // Couldn't get PIDFD due to too old of kernel.\n        // Return a pipe to track the same information.\n        //\n        int fds[2];\n        pipe2(fds, O_CLOEXEC);\n        SendFDSuccessPacket(Socket, fds[0]);\n\n        // Close the read side now, doesn't matter to us\n        close(fds[0]);\n\n        // Check if we need to increase the FD limit.\n        ++NumFilesOpened;\n        CheckRaiseFDLimit();\n\n        // Write side will naturally close on process exit, letting the other process know we have exited.\n      } else {\n        SendFDSuccessPacket(Socket, FD);\n\n        // Close the FD now since we've sent it\n        close(FD);\n      }\n\n      buffer += sizeof(FEXServerClient::FEXServerRequestPacket::Header);\n      break;\n    }\n\n    case FEXServerClient::PacketType::TYPE_POPULATE_CODE_CACHE:\n    case FEXServerClient::PacketType::TYPE_POPULATE_CODE_CACHE_NO_MULTIBLOCK: {\n      char Tmp[PATH_MAX];\n      int TmpLen = FEX::get_fdpath(inFD, Tmp);\n      assert(TmpLen != -1);\n\n      std::filesystem::path Path {std::string_view(Tmp, TmpLen)};\n      auto filename_hash = XXH3_64bits(Tmp, TmpLen);\n      const bool HasMultiblock = (Req->Header.Type == FEXServerClient::PacketType::TYPE_POPULATE_CODE_CACHE);\n\n      FEXCore::ExecutableFileInfo MainFileId = {nullptr, filename_hash, fextl::string(Tmp, TmpLen)};\n      fmt::print(\"Requested {}cache generation for {}\\n\", HasMultiblock ? \"\" : \"nomb-\", MainFileId.Filename);\n\n      auto GetCacheFilename = [](const FEXCore::ExecutableFileInfo& FileId) {\n        return fmt::format(\"{}cache/{}-{:016x}\", FEX::Config::GetCacheDirectory(), FEXCore::CodeMap::GetBaseFilename(FileId, false),\n                           0 /* TODO: Use unique cache id */);\n      };\n\n      // Update code maps; any update necessitates an update of the corresponding cache\n      auto Binaries = AggregateCodeMaps(MainFileId, HasMultiblock);\n\n      // Check for other conditions that require a cache refresh even when the code map didn't change\n      for (auto& [FileInfo, NeedsRefresh] : Binaries) {\n        if (NeedsRefresh == NeedsCacheRefresh::Yes) {\n          // Already queued for cache generation, no need for further checks\n          continue;\n        }\n\n        // Trigger cache generation for this file if no cache exists or if the cache is older than the most recent update to its code map\n        std::error_code ec;\n        const auto BinaryName = FEXCore::CodeMap::GetBaseFilename(FileInfo, !HasMultiblock);\n        const auto MergedCodeMapFilename = fmt::format(\"{}/{}\", ReadyCodeMapDirectory, BinaryName);\n        const auto LastCodeMapUpdate = std::filesystem::last_write_time(MergedCodeMapFilename, ec);\n        if (std::filesystem::last_write_time(GetCacheFilename(FileInfo), ec) < LastCodeMapUpdate || ec) {\n          fmt::println(\"  Scheduling update for {} cache for {}\", ec ? \"missing\" : \"outdated\", BinaryName);\n          NeedsRefresh = NeedsCacheRefresh::Yes;\n        }\n      }\n\n      // Trigger offline-compile for each binary that needs it\n      for (const auto& [File, NeedsRefresh] : Binaries) {\n        if (NeedsRefresh != NeedsCacheRefresh::Yes) {\n          continue;\n        }\n\n        const auto BinaryName = (std::string)FEXCore::CodeMap::GetBaseFilename(File, !HasMultiblock);\n        fmt::println(\"Generating cache for {}\", BinaryName);\n        int Status = RunOfflineCompiler(fmt::format(\"{}/{}\", ReadyCodeMapDirectory, BinaryName).c_str());\n        if (Status != 0) {\n          fmt::println(\"ERROR: Cache generation failed with status {}\", Status);\n        }\n      }\n\n      FEXServerClient::FEXServerResultPacket Res {\n        .Header {\n          .Type = FEXServerClient::PacketType::TYPE_SUCCESS,\n        },\n      };\n\n      fasio::mutable_buffer Data = {.Data = std::as_writable_bytes(std::span(&Res, 1))};\n      fasio::error ec;\n      write(Socket, Data, ec);\n      buffer += sizeof(FEXServerClient::FEXServerRequestPacket::Header);\n      close(inFD);\n      inFD = -1;\n      break;\n    }\n\n    case FEXServerClient::PacketType::TYPE_QUERY_CODE_MAP:\n    case FEXServerClient::PacketType::TYPE_QUERY_CODE_MAP_NO_MULTIBLOCK: {\n      char Tmp[PATH_MAX];\n      int TmpLen = FEX::get_fdpath(inFD, Tmp);\n      assert(TmpLen != -1);\n      std::filesystem::path BinaryPath = std::string_view(Tmp, TmpLen);\n      // TODO: Move to common code\n      const auto filename_hash = XXH3_64bits(Tmp, TmpLen);\n      const bool HasMultiblock = (Req->Header.Type == FEXServerClient::PacketType::TYPE_QUERY_CODE_MAP);\n\n      FEXServerClient::FEXServerResultPacket Res {\n        .Header {\n          .Type = FEXServerClient::PacketType::TYPE_SUCCESS,\n        },\n      };\n\n      // Find first code map that doesn't exist yet\n      int Index = 0;\n      std::string Filename;\n      do {\n        Filename = fmt::format(\"{}/{}.{}.bin\", NewCodeMapDirectory,\n                               FEXCore::CodeMap::GetBaseFilename(\n                                 FEXCore::ExecutableFileInfo {nullptr, filename_hash, (fextl::string)BinaryPath.string()}, !HasMultiblock),\n                               Index++);\n      } while (std::filesystem::exists(Filename));\n\n      std::filesystem::create_directories(NewCodeMapDirectory);\n      std::filesystem::create_directories(ReadyCodeMapDirectory);\n      auto CodeMapFD = open(Filename.c_str(), O_CREAT | O_CLOEXEC | O_WRONLY, 0644);\n\n      fasio::mutable_buffer Data = {.Data = std::as_writable_bytes(std::span(&Res, 1)),\n                                    .FD = (CodeMapFD != -1 ? std::optional {&CodeMapFD} : std::nullopt)};\n      fasio::error ec;\n      write(Socket, Data, ec);\n      buffer += sizeof(FEXServerClient::FEXServerRequestPacket::Header);\n      close(inFD);\n      inFD = -1;\n      close(CodeMapFD);\n      break;\n    }\n\n    // Invalid\n    case FEXServerClient::PacketType::TYPE_ERROR:\n    default:\n      // Something sent us an invalid packet. Drop this client and continue\n      LogMan::Msg::EFmt(\"Invalid FEXServer packet received: {:02x}\", fmt::join(buffer.Data, \"\"));\n      close(Socket.FD);\n      return;\n    }\n  }\n\n  if (inFD != -1) {\n    LogMan::Msg::EFmt(\"Received unused FD argument\");\n    close(inFD);\n  }\n}\n\nvoid CloseConnections() {\n  // Close the server pipe so new processes will know to spin up a new FEXServer.\n  // This one is closing\n  close(ServerLockFD);\n\n  // Close the server socket so no more connections can be started\n  ServerAcceptor.reset();\n  ServerFSAcceptor.reset();\n}\n\nvoid WaitForRequests() {\n  if (WatchFD != -1) {\n    // Add a fake client.\n    ++NumClients;\n    Reactor.bind_handler(\n      pollfd {\n        .fd = WatchFD,\n        .events = POLLPRI | POLLRDHUP,\n        .revents = 0,\n      },\n      [InternalWatchFD = WatchFD](fasio::error ec) mutable {\n        if (ec != fasio::error::success) {\n          close(InternalWatchFD);\n          --NumClients;\n          return fasio::post_callback::drop;\n        }\n        // Wait for next data\n        return fasio::post_callback::repeat;\n      });\n  }\n\n  Reactor.enable_async_stop();\n\n  while (true) {\n    std::optional Timeout = std::chrono::seconds {RequestTimeout};\n    if (Foreground || NumClients > 0) {\n      Timeout.reset();\n    }\n    auto Result = Reactor.run_one(Timeout);\n    if (Result != fasio::error::success || Reactor.stopped()) {\n      Reactor.cleanup();\n      break;\n    }\n  }\n\n  LogMan::Msg::DFmt(\"[FEXServer] Shutting Down\");\n\n  CloseConnections();\n}\n\nvoid SetConfiguration(bool Foreground, uint32_t PersistentTimeout) {\n  ProcessPipe::Foreground = Foreground;\n  ProcessPipe::RequestTimeout = PersistentTimeout;\n\n  NewCodeMapDirectory = FEX::Config::GetCacheDirectory() + \"codemap/new\";\n  ReadyCodeMapDirectory = FEX::Config::GetCacheDirectory() + \"codemap/ready\";\n}\n\nvoid Shutdown() {\n  Reactor.stop_async();\n}\n} // namespace ProcessPipe\n"
  },
  {
    "path": "Source/Tools/FEXServer/ProcessPipe.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <cstdint>\n\nnamespace ProcessPipe {\nbool InitializeServerPipe();\nbool InitializeServerSocket(bool abstract);\nvoid WaitForRequests();\nvoid SetConfiguration(bool Foreground, uint32_t PersistentTimeout);\nvoid Shutdown();\nvoid SetWatchFD(int FD);\n} // namespace ProcessPipe\n"
  },
  {
    "path": "Source/Tools/FEXServer/SquashFS.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Common/FEXServerClient.h\"\n#include \"Common/FileFormatCheck.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <fcntl.h>\n#include <filesystem>\n#include <sys/poll.h>\n#include <sys/stat.h>\n#include <sys/wait.h>\n#include <thread>\n\nnamespace SquashFS {\n\nconstexpr int USER_PERMS = S_IRWXU | S_IRWXG | S_IRWXO;\nint ServerRootFSLockFD {-1};\nint FuseMountPID {};\nfextl::string MountFolder {};\n\nvoid ShutdownImagePID() {\n  if (FuseMountPID) {\n    FHU::Syscalls::tgkill(FuseMountPID, FuseMountPID, SIGINT);\n  }\n}\n\nbool InitializeSquashFSPipe() {\n  auto RootFSLockFile = FEXServerClient::GetServerRootFSLockFile();\n\n  int Ret = open(RootFSLockFile.c_str(), O_CREAT | O_RDWR | O_TRUNC | O_EXCL | O_CLOEXEC, USER_PERMS);\n  ServerRootFSLockFD = Ret;\n  if (Ret == -1 && errno == EEXIST) {\n    // If the fifo exists then it might be a stale connection.\n    // Check the lock status to see if another process is still alive.\n    ServerRootFSLockFD = open(RootFSLockFile.c_str(), O_RDWR | O_CLOEXEC, USER_PERMS);\n    if (ServerRootFSLockFD != -1) {\n      // Now that we have opened the file, try to get a write lock.\n      flock lk {\n        .l_type = F_WRLCK,\n        .l_whence = SEEK_SET,\n        .l_start = 0,\n        .l_len = 0,\n      };\n      Ret = fcntl(ServerRootFSLockFD, F_SETLK, &lk);\n\n      if (Ret != -1) {\n        // Write lock was gained, we can now continue onward.\n      } else {\n        // We couldn't get a write lock, this means that another process already owns a lock on the fifo\n        close(ServerRootFSLockFD);\n        ServerRootFSLockFD = -1;\n        return false;\n      }\n    } else {\n      // File couldn't get opened even though it existed?\n      // Must have raced something here.\n      return false;\n    }\n  } else if (Ret == -1) {\n    // Unhandled error.\n    LogMan::Msg::EFmt(\"[FEXServer] Unable to create FEXServer RootFS lock file at: {} {} {}\", RootFSLockFile, errno, strerror(errno));\n    return false;\n  } else {\n    // FIFO file was created. Try to get a write lock\n    flock lk {\n      .l_type = F_WRLCK,\n      .l_whence = SEEK_SET,\n      .l_start = 0,\n      .l_len = 0,\n    };\n    Ret = fcntl(ServerRootFSLockFD, F_SETLK, &lk);\n\n    if (Ret == -1) {\n      // Couldn't get a write lock, something else must have got it\n      close(ServerRootFSLockFD);\n      ServerRootFSLockFD = -1;\n      return false;\n    }\n  }\n\n  return true;\n}\n\nbool DowngradeRootFSPipeToReadLock() {\n  flock lk {\n    .l_type = F_RDLCK,\n    .l_whence = SEEK_SET,\n    .l_start = 0,\n    .l_len = 0,\n  };\n  int Ret = fcntl(ServerRootFSLockFD, F_SETLK, &lk);\n\n  if (Ret == -1) {\n    // This shouldn't occur\n    LogMan::Msg::EFmt(\"[FEXServer] Unable to downgrade a rootfs write lock to a read lock {} {}\", errno, strerror(errno));\n    close(ServerRootFSLockFD);\n    ServerRootFSLockFD = -1;\n    return false;\n  }\n\n  return true;\n}\n\nbool MountRootFSImagePath(const fextl::string& SquashFS, bool EroFS) {\n  pid_t ParentTID = ::getpid();\n  MountFolder = fmt::format(\"{}/.FEXMount{}-XXXXXX\", FEXServerClient::GetServerMountFolder(), ParentTID);\n  char* MountFolderStr = MountFolder.data();\n\n  // Make the temporary mount folder\n  if (mkdtemp(MountFolderStr) == nullptr) {\n    LogMan::Msg::EFmt(\"[FEXServer] Couldn't create temporary mount name: {}\", MountFolder);\n    return false;\n  }\n\n  // Change the permissions\n  if (chmod(MountFolderStr, 0777) != 0) {\n    LogMan::Msg::EFmt(\"[FEXServer] Couldn't change permissions on temporary mount: {}\", MountFolder);\n    rmdir(MountFolderStr);\n    return false;\n  }\n\n  // Create local FDs so our internal forks can communicate\n  int fds[2];\n  pipe2(fds, 0);\n\n  int pid = fork();\n  if (pid == 0) {\n    // Child\n    close(fds[0]); // Close read side\n    const char* argv[4];\n    argv[0] = EroFS ? \"erofsfuse\" : \"squashfuse\";\n    argv[1] = SquashFS.c_str();\n    argv[2] = MountFolder.c_str();\n    argv[3] = nullptr;\n\n    // Try and execute {erofsfuse, squashfuse} to mount our rootfs\n    if (execvpe(argv[0], (char* const*)argv, environ) == -1) {\n      // Give a hopefully helpful error message for users\n      LogMan::Msg::EFmt(\"[FEXServer] '{}' Couldn't execute for some reason: {} {}\\n\", argv[0], errno, strerror(errno));\n      LogMan::Msg::EFmt(\"[FEXServer] To mount squashfs rootfs files you need {} installed\\n\", argv[0]);\n      LogMan::Msg::EFmt(\"[FEXServer] Check your FUSE setup.\\n\");\n\n      // Let the parent know that we couldn't execute for some reason\n      uint64_t error {1};\n      write(fds[1], &error, sizeof(error));\n\n      // End the child\n      exit(1);\n    }\n  } else {\n    FuseMountPID = pid;\n    // Parent\n    // Wait for the child to exit\n    // This will happen with execvpe of squashmount or exit on failure\n    while (waitpid(pid, nullptr, 0) == -1 && errno == EINTR)\n      ;\n\n    // Check the child pipe for messages\n    pollfd PollFD;\n    PollFD.fd = fds[0];\n    PollFD.events = POLLIN;\n\n    int Result = poll(&PollFD, 1, 0);\n\n    if (Result == 1 && PollFD.revents & POLLIN) {\n      // Child couldn't execvpe for whatever reason\n      // Remove the mount path and leave Just in case it was created\n      rmdir(MountFolderStr);\n\n      // Close the pipe now\n      close(fds[0]);\n\n      LogMan::Msg::EFmt(\"[FEXServer] Couldn't mount squashfs\\n\");\n      return false;\n    }\n\n    // Close the pipe now\n    close(fds[0]);\n  }\n\n  // Write to the lock file where we are mounted\n  write(ServerRootFSLockFD, MountFolder.c_str(), MountFolder.size());\n  fdatasync(ServerRootFSLockFD);\n\n  return true;\n}\n\nvoid UnmountRootFS() {\n  FEX_CONFIG_OPT(LDPath, ROOTFS);\n  if (!FEX::FormatCheck::IsSquashFS(LDPath()) && !FEX::FormatCheck::IsEroFS(LDPath())) {\n    return;\n  }\n\n  SquashFS::ShutdownImagePID();\n\n  // Handle final mount removal\n  // fusermount for unmounting the mountpoint, then the {erfsfuse, squashfuse} will exit automatically\n  int pid = fork();\n\n  if (pid == 0) {\n    const char* argv[5];\n    argv[0] = \"fusermount3\";\n    argv[1] = \"-u\";\n    argv[2] = \"-q\";\n    argv[3] = MountFolder.c_str();\n    argv[4] = nullptr;\n\n    if (execvp(argv[0], (char* const*)argv) == -1) {\n      // Try again with `fusermount`\n      argv[0] = \"fusermount\";\n      if (execvp(argv[0], (char* const*)argv) == -1) {\n        fprintf(stderr, \"fusermount{3,} failed to execute. You may have an mount living at '%s' to clean up now\\n\", MountFolder.c_str());\n        fprintf(stderr, \"Try `%s %s %s %s`\\n\", argv[0], argv[1], argv[2], argv[3]);\n        exit(1);\n      }\n    }\n  } else {\n    // Wait for fusermount to leave\n    while (waitpid(pid, nullptr, 0) == -1 && errno == EINTR)\n      ;\n\n    // Remove the mount path\n    rmdir(MountFolder.c_str());\n\n    // Remove the rootfs lock file\n    auto RootFSLockFile = FEXServerClient::GetServerRootFSLockFile();\n    unlink(RootFSLockFile.c_str());\n  }\n}\n\nbool InitializeSquashFS() {\n  FEX_CONFIG_OPT(LDPath, ROOTFS);\n\n  MountFolder = LDPath();\n\n  bool IsSquashFS {false};\n  bool IsEroFS {false};\n\n  // Check if the image is an EroFS\n  IsEroFS = FEX::FormatCheck::IsEroFS(MountFolder);\n\n  if (!IsEroFS) {\n    // Check if the image is an SquashFS\n    IsSquashFS = FEX::FormatCheck::IsSquashFS(MountFolder);\n  }\n\n  if (!IsSquashFS && !IsEroFS) {\n    // If this isn't a rootfs image then we have nothing to do here\n    return true;\n  }\n\n  if (!InitializeSquashFSPipe()) {\n    LogMan::Msg::EFmt(\"[FEXServer] Couldn't initialize SquashFSPipe\");\n    return false;\n  }\n\n  // Setup rootfs here\n  if (!MountRootFSImagePath(LDPath(), IsEroFS)) {\n    LogMan::Msg::EFmt(\"[FEXServer] Couldn't mount squashfs path\");\n    return false;\n  }\n\n  if (!DowngradeRootFSPipeToReadLock()) {\n    LogMan::Msg::EFmt(\"[FEXServer] Couldn't downgrade read lock\");\n    return false;\n  }\n\n  return true;\n}\n\nconst fextl::string& GetMountFolder() {\n  return MountFolder;\n}\n} // namespace SquashFS\n"
  },
  {
    "path": "Source/Tools/FEXServer/SquashFS.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/string.h>\n\nnamespace SquashFS {\nbool InitializeSquashFS();\nvoid UnmountRootFS();\nconst fextl::string& GetMountFolder();\n} // namespace SquashFS\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/ArchHelpers/MContext.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"ArchHelpers/MContext.h\"\n\nnamespace FEX::ArchHelpers::Context {\n#ifdef ARCHITECTURE_arm64\nstd::string_view GetESRName(uint64_t ESR) {\n  switch ((ESR & ESR1_EC) >> 26) {\n  case 0b000'000: return \"Unknown\";\n  case 0b000'001: return \"Trapped WF*\";\n  case 0b000'011: return \"Trapped MCR/MRC\";\n  case 0b000'100: return \"Trapped MCRR/MRRC\";\n  case 0b000'101: return \"Trapped MCR/MRC (coproc==0b1110)\";\n  case 0b000'110: return \"Trapped LDC/STC\";\n  case 0b000'111: return \"Trapped SME;SVE,ASIMD,FP\";\n  case 0b001'010: return \"Trapped non-covered instruction\";\n  case 0b001'100: return \"Trapped MRRC (coproc==0b1110)\";\n  case 0b001'101: return \"Branch target exception\";\n  case 0b001'110: return \"Illegal Execution State\";\n  case 0b010'001: return \"AArch32 SVC\";\n  case 0b010'100: return \"Trapped MSRR/MRRS/System instruction\";\n  case 0b010'101: return \"AArch64 SVC\";\n  case 0b011'000: return \"Trapped MSR/MRS/System instruction\";\n  case 0b011'001: return \"Trapped SVE from ZEN\";\n  case 0b011'011: return \"TSTART Exception\";\n  case 0b011'100: return \"PAC Exception\";\n  case 0b011'101: return \"Trapped SME from SMEN\";\n  case 0b100'000: return \"Instruction abort\";\n  case 0b100'001: return \"Instruction abort w/o change to exception level\";\n  case 0b100'010: return \"PC Alignment fault\";\n  case 0b100'100: return \"Data abort\";\n  case 0b100'101: return \"Data abort w/o change to exception level\";\n  case 0b100'110: return \"SP Alignment fault\";\n  case 0b100'111: return \"Memory operation exception\";\n  case 0b101'000: return \"AArch32 Trapped FP Exception\";\n  case 0b101'100: return \"AArch64 Trapped FP Exception\";\n  case 0b101'101: return \"GCS exception\";\n  case 0b101'111: return \"SError exception\";\n  case 0b110'000: return \"BP Exception\";\n  case 0b110'001: return \"BP Exception w/o change to exception level\";\n  case 0b110'010: return \"Software step Exception\";\n  case 0b110'011: return \"Software step Exception w/o change to exception level\";\n  case 0b110'100: return \"Watchpoint Exception\";\n  case 0b110'101: return \"Watchpoit Exception w/o change to exception level\";\n  case 0b111'000: return \"AArch32 BKPT\";\n  case 0b111'100: return \"AArch64 BRK\";\n  case 0b111'101: return \"Profiling Exception\";\n  default: return \"Reserved\";\n  }\n}\n#endif\n} // namespace FEX::ArchHelpers::Context\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/ArchHelpers/MContext.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"UContext.h\"\n\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/X86Enums.h>\n\n#include <signal.h>\n#include <string.h>\n#ifndef _WIN32\n#include <ucontext.h>\n#endif\n#include <stdint.h>\n#include <type_traits>\n\nnamespace FEX::ArchHelpers::Context {\n#ifndef _WIN32\n\nenum ContextFlags : uint32_t {\n  CONTEXT_FLAG_INJIT = (1U << 0),\n};\n\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\nconstexpr uint64_t STACK_COOKIE_MAGIC = 0x4142434445464748ULL;\n#endif\n\nstruct X86ContextBackup {\n  // Host State\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  // During debug builds, insert a cookie on the stack.\n  // This is useful for validation that the stack is trying to be restored from the correct location.\n  // During stack restore, we ensure this is set to the value we expect.\n  // If given an incorrect stack location, or corrupted stack then this cookie will be wrong.\n  uint64_t StackCookie;\n#endif\n  // RIP and RSP is stored in GPRs here\n  uint64_t GPRs[23];\n  FEXCore::x86_64::_libc_fpstate FPRState;\n  uint64_t sa_mask;\n  uint16_t InSyscallInfo;\n  bool FaultToTopAndGeneratedException;\n\n  // Guest state\n  int Signal;\n  uint32_t Flags;\n  uint64_t OriginalRIP;\n  uint64_t FPStateLocation;\n  uint64_t UContextLocation;\n  uint64_t SigInfoLocation;\n  FEXCore::Core::CPUState GuestState;\n  static constexpr int RedZoneSize = 128;\n};\n\nstruct ArmContextBackup {\n  // Host State\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  uint64_t StackCookie;\n#endif\n  uint64_t GPRs[31];\n  uint64_t PrevSP;\n  uint64_t PrevPC;\n  uint64_t PState;\n  uint32_t FPSR;\n  uint32_t FPCR;\n  __uint128_t FPRs[32];\n  uint64_t sa_mask;\n  uint16_t InSyscallInfo;\n  bool FaultToTopAndGeneratedException;\n\n  // Guest state\n  int Signal;\n  uint32_t Flags;\n  uint64_t OriginalRIP;\n  uint64_t FPStateLocation;\n  uint64_t UContextLocation;\n  uint64_t SigInfoLocation;\n  FEXCore::Core::CPUState GuestState;\n\n  // Arm64 doesn't have a red zone\n  static constexpr int RedZoneSize = 0;\n};\n\nstatic inline ucontext_t* GetUContext(void* ucontext) {\n  ucontext_t* _context = (ucontext_t*)ucontext;\n  return _context;\n}\n\nstatic inline mcontext_t* GetMContext(void* ucontext) {\n  ucontext_t* _context = (ucontext_t*)ucontext;\n  return &_context->uc_mcontext;\n}\n\n\n#ifdef ARCHITECTURE_arm64\n\nconstexpr uint32_t FPR_MAGIC = 0x46508001U;\nconstexpr uint32_t ESR1_MAGIC = 0x45535201U;\n\nstruct HostCTXHeader {\n  uint32_t Magic;\n  uint32_t Size;\n};\n\nstruct HostFPRState {\n  HostCTXHeader Head;\n  uint32_t FPSR;\n  uint32_t FPCR;\n  __uint128_t FPRs[32];\n};\n\nstruct HostESRState {\n  HostCTXHeader Head;\n  uint64_t ESR;\n};\n\nstatic inline uint64_t GetSp(void* ucontext) {\n  return GetMContext(ucontext)->sp;\n}\n\nstatic inline uint64_t GetPc(void* ucontext) {\n  return GetMContext(ucontext)->pc;\n}\n\nstatic inline uint64_t* GetArmPc(void* ucontext) {\n  return reinterpret_cast<uint64_t*>(&GetMContext(ucontext)->pc);\n}\n\nstatic inline void SetSp(void* ucontext, uint64_t val) {\n  GetMContext(ucontext)->sp = val;\n}\n\nstatic inline void SetPc(void* ucontext, uint64_t val) {\n  GetMContext(ucontext)->pc = val;\n}\n\nstatic inline uint64_t GetState(void* ucontext) {\n  return GetMContext(ucontext)->regs[28];\n}\n\nstatic inline void SetState(void* ucontext, uint64_t val) {\n  GetMContext(ucontext)->regs[28] = val;\n}\n\nstatic inline void SetFillSRASingleInst(void* ucontext, bool SingleInst) {\n  GetMContext(ucontext)->regs[1] = SingleInst;\n}\n\nstatic inline uint64_t GetArmReg(void* ucontext, uint32_t id) {\n  return GetMContext(ucontext)->regs[id];\n}\n\nstatic inline uint64_t GetArmPState(void* ucontext) {\n  return GetMContext(ucontext)->pstate;\n}\n\nstatic inline uint64_t* GetArmGPRs(void* ucontext) {\n  return reinterpret_cast<uint64_t*>(GetMContext(ucontext)->regs);\n}\n\nstatic inline void SetArmReg(void* ucontext, uint32_t id, uint64_t val) {\n  GetMContext(ucontext)->regs[id] = val;\n}\n\nstatic inline __uint128_t GetArmFPR(void* ucontext, uint32_t id) {\n  auto MContext = GetMContext(ucontext);\n  HostFPRState* HostState = reinterpret_cast<HostFPRState*>(&MContext->__reserved[0]);\n  LOGMAN_THROW_A_FMT(HostState->Head.Magic == FPR_MAGIC, \"Wrong FPR Magic: 0x{:08x}\", HostState->Head.Magic);\n\n  return HostState->FPRs[id];\n}\n\nstatic inline __uint128_t* GetArmFPRs(void* ucontext) {\n  auto MContext = GetMContext(ucontext);\n  HostFPRState* HostState = reinterpret_cast<HostFPRState*>(&MContext->__reserved[0]);\n  LOGMAN_THROW_A_FMT(HostState->Head.Magic == FPR_MAGIC, \"Wrong FPR Magic: 0x{:08x}\", HostState->Head.Magic);\n\n  return &HostState->FPRs[0];\n}\n\nstatic inline uint64_t GetArmESR(void* ucontext) {\n  auto MContext = GetMContext(ucontext);\n\n  size_t i = 0;\n  auto HostState = reinterpret_cast<HostCTXHeader*>(&MContext->__reserved[i]);\n  do {\n    if (HostState->Magic == ESR1_MAGIC) {\n      auto ESR = reinterpret_cast<HostESRState*>(HostState);\n      return ESR->ESR;\n    }\n    i += HostState->Size;\n    HostState = reinterpret_cast<HostCTXHeader*>(&MContext->__reserved[i]);\n  } while (HostState->Size != 0);\n\n  return 0;\n}\n\nconstexpr static uint64_t ESR1_EC = 0b111111U << 26;\nconstexpr static uint64_t ESR1_EC_DataAbort = 0b100100U << 26;\n\n// Write-Not-Read flag\n// When set - Abort is due to a write\nconstexpr static uint64_t ESR1_WNR = 1 << 6;\n\n// DFSC - Default Status Code\n// Translation fault - No page mapped\n// Permissions fault - Page mapped but with incorrect permission from access.\nconstexpr static uint64_t ESR1_DataAbort_DFSC = 0b111111;\nconstexpr static uint64_t ESR1_DataAbort_TranslationFault_EL0 = 0b000111;\nconstexpr static uint64_t ESR1_DataAbort_PermissionFault_EL0 = 0b001111;\nconstexpr static uint64_t ESR1_DataAbort_Level = 0b11;\nconstexpr static uint64_t ESR1_DataAbort_Level_EL3 = 0b00;\nconstexpr static uint64_t ESR1_DataAbort_Level_EL2 = 0b01;\nconstexpr static uint64_t ESR1_DataAbort_Level_EL1 = 0b10;\nconstexpr static uint64_t ESR1_DataAbort_Level_EL0 = 0b11;\n\nstd::string_view GetESRName(uint64_t ESR);\n\nstatic inline uint32_t GetProtectFlags(void* ucontext) {\n  uint64_t ESR = GetArmESR(ucontext);\n  LOGMAN_THROW_A_FMT((ESR & ESR1_EC) == ESR1_EC_DataAbort, \"Unknown ESR1 EC type: 0x{:x} != 0x{:x}. Received '{}'\", ESR & ESR1_EC,\n                     ESR1_EC_DataAbort, GetESRName(ESR));\n\n  uint32_t ProtectFlags {};\n  if ((ESR & ESR1_DataAbort_Level) == ESR1_DataAbort_Level_EL0) {\n    // Always a user error for us.\n    ProtectFlags |= FEXCore::X86State::X86_PF_USER;\n  }\n\n  if (ESR & ESR1_WNR) {\n    // Fault was due to a write\n    ProtectFlags |= FEXCore::X86State::X86_PF_WRITE;\n  }\n\n  // PF_PROT is not returned to user on x86, so don't return the difference between permission fault and translation fault.\n  return ProtectFlags;\n}\n\nusing ContextBackup = ArmContextBackup;\ntemplate<typename T>\nstatic inline void BackupContext(void* ucontext, T* Backup) {\n  if constexpr (std::is_same<T, ArmContextBackup>::value) {\n    auto _ucontext = GetUContext(ucontext);\n    auto _mcontext = GetMContext(ucontext);\n\n    memcpy(&Backup->GPRs[0], &_mcontext->regs[0], 31 * sizeof(uint64_t));\n    Backup->PrevSP = ArchHelpers::Context::GetSp(ucontext);\n    Backup->PrevPC = ArchHelpers::Context::GetPc(ucontext);\n    Backup->PState = _mcontext->pstate;\n\n    // Host FPR state starts at _mcontext->reserved[0];\n    HostFPRState* HostState = reinterpret_cast<HostFPRState*>(&_mcontext->__reserved[0]);\n    LOGMAN_THROW_A_FMT(HostState->Head.Magic == FPR_MAGIC, \"Wrong FPR Magic: 0x{:08x}\", HostState->Head.Magic);\n    Backup->FPSR = HostState->FPSR;\n    Backup->FPCR = HostState->FPCR;\n    memcpy(&Backup->FPRs[0], &HostState->FPRs[0], 32 * sizeof(__uint128_t));\n\n    // Save the signal mask so we can restore it\n    memcpy(&Backup->sa_mask, &_ucontext->uc_sigmask, sizeof(uint64_t));\n\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    Backup->StackCookie = STACK_COOKIE_MAGIC;\n#endif\n  } else {\n    // This must be a runtime error\n    ERROR_AND_DIE_FMT(\"Wrong context type\");\n  }\n}\n\ntemplate<typename T>\nstatic inline void RestoreContext(void* ucontext, T* Backup) {\n  if constexpr (std::is_same<T, ArmContextBackup>::value) {\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    LOGMAN_THROW_A_FMT(Backup->StackCookie == STACK_COOKIE_MAGIC, \"Stack cookie didn't match! 0x{:x}\", Backup->StackCookie);\n#endif\n\n    auto _ucontext = GetUContext(ucontext);\n    auto _mcontext = GetMContext(ucontext);\n\n    HostFPRState* HostState = reinterpret_cast<HostFPRState*>(&_mcontext->__reserved[0]);\n    LOGMAN_THROW_A_FMT(HostState->Head.Magic == FPR_MAGIC, \"Wrong FPR Magic: 0x{:08x}\", HostState->Head.Magic);\n    memcpy(&HostState->FPRs[0], &Backup->FPRs[0], 32 * sizeof(__uint128_t));\n    HostState->FPCR = Backup->FPCR;\n    HostState->FPSR = Backup->FPSR;\n\n    // Restore GPRs and other state\n    _mcontext->pstate = Backup->PState;\n    ArchHelpers::Context::SetPc(ucontext, Backup->PrevPC);\n    ArchHelpers::Context::SetSp(ucontext, Backup->PrevSP);\n    memcpy(&_mcontext->regs[0], &Backup->GPRs[0], 31 * sizeof(uint64_t));\n\n    // Restore the signal mask now\n    memcpy(&_ucontext->uc_sigmask, &Backup->sa_mask, sizeof(uint64_t));\n  } else {\n    // This must be a runtime error\n    ERROR_AND_DIE_FMT(\"Wrong context type\");\n  }\n}\n\n#endif\n\n#ifdef ARCHITECTURE_x86_64\n\nstatic inline uint64_t GetSp(void* ucontext) {\n  return GetMContext(ucontext)->gregs[REG_RSP];\n}\n\nstatic inline uint64_t GetPc(void* ucontext) {\n  return GetMContext(ucontext)->gregs[REG_RIP];\n}\n\nstatic inline void SetSp(void* ucontext, uint64_t val) {\n  GetMContext(ucontext)->gregs[REG_RSP] = val;\n}\n\nstatic inline void SetPc(void* ucontext, uint64_t val) {\n  GetMContext(ucontext)->gregs[REG_RIP] = val;\n}\n\nstatic inline uint64_t GetState(void* ucontext) {\n  return GetMContext(ucontext)->gregs[REG_R14];\n}\n\nstatic inline void SetState(void* ucontext, uint64_t val) {\n  GetMContext(ucontext)->gregs[REG_R14] = val;\n}\n\nstatic inline void SetFillSRASingleInst(void* ucontext, bool SingleInst) {\n  ERROR_AND_DIE_FMT(\"Not implemented for x86 host\");\n}\n\nstatic inline uint64_t GetArmReg(void* ucontext, uint32_t id) {\n  ERROR_AND_DIE_FMT(\"Not impelented for x86 host\");\n}\n\nstatic inline void SetArmReg(void* ucontext, uint32_t id, uint64_t val) {\n  ERROR_AND_DIE_FMT(\"Not impelented for x86 host\");\n}\n\nstatic inline __uint128_t GetArmFPR(void* ucontext, uint32_t id) {\n  ERROR_AND_DIE_FMT(\"Not implemented for x86 host\");\n}\n\nstatic inline uint64_t GetArmPState(void* ucontext) {\n  ERROR_AND_DIE_FMT(\"Not implemented for x86 host\");\n}\n\nstatic inline uint64_t* GetArmGPRs(void* ucontext) {\n  ERROR_AND_DIE_FMT(\"Not implemented for x86 host\");\n}\n\nstatic inline uint32_t GetProtectFlags(void* ucontext) {\n  return GetMContext(ucontext)->gregs[REG_ERR];\n}\n\nusing ContextBackup = X86ContextBackup;\ntemplate<typename T>\nstatic inline void BackupContext(void* ucontext, T* Backup) {\n  if constexpr (std::is_same<T, X86ContextBackup>::value) {\n    auto _ucontext = GetUContext(ucontext);\n    auto _mcontext = GetMContext(ucontext);\n\n    // Copy the GPRs\n    memcpy(&Backup->GPRs[0], &_mcontext->gregs[0], sizeof(X86ContextBackup::GPRs));\n    // Copy the FPRState\n    memcpy(&Backup->FPRState, _mcontext->fpregs, sizeof(X86ContextBackup::FPRState));\n    // XXX: Save 256bit and 512bit AVX register state\n\n    // Save the signal mask so we can restore it\n    memcpy(&Backup->sa_mask, &_ucontext->uc_sigmask, sizeof(uint64_t));\n\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    Backup->StackCookie = STACK_COOKIE_MAGIC;\n#endif\n  } else {\n    // This must be a runtime error\n    ERROR_AND_DIE_FMT(\"Wrong context type\");\n  }\n}\n\ntemplate<typename T>\nstatic inline void RestoreContext(void* ucontext, T* Backup) {\n  if constexpr (std::is_same<T, X86ContextBackup>::value) {\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    LOGMAN_THROW_A_FMT(Backup->StackCookie == STACK_COOKIE_MAGIC, \"Stack cookie didn't match! 0x{:x}\", Backup->StackCookie);\n#endif\n\n    auto _ucontext = GetUContext(ucontext);\n    auto _mcontext = GetMContext(ucontext);\n\n    // Copy the GPRs\n    memcpy(&_mcontext->gregs[0], &Backup->GPRs[0], sizeof(X86ContextBackup::GPRs));\n    // Copy the FPRState\n    memcpy(_mcontext->fpregs, &Backup->FPRState, sizeof(X86ContextBackup::FPRState));\n\n    // Restore the signal mask now\n    memcpy(&_ucontext->uc_sigmask, &Backup->sa_mask, sizeof(uint64_t));\n  } else {\n    // This must be a runtime error\n    ERROR_AND_DIE_FMT(\"Wrong context type\");\n  }\n}\n\n#endif\n#else\n\n#endif\n} // namespace FEX::ArchHelpers::Context\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/ArchHelpers/UContext.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/CompilerDefs.h>\n\n#include <algorithm>\n#include <cstddef>\n#include <cstdint>\n#include <cstring>\n#include <signal.h>\n\nnamespace FEXCore {\nnamespace x86_64 {\n  // uc_flags flags\n  ///< Has extended FP state\n  constexpr uint64_t UC_FP_XSTATE = (1ULL << 0);\n  ///< Set when kernel saves SS register from 64bit code\n  constexpr uint64_t UC_SIGCONTEXT_SS = (1ULL << 1);\n  ///< Set when kernel will strictly restore the SS\n  constexpr uint64_t UC_STRICT_RESTORE_SS = (1ULL << 2);\n\n  ///< Describes the signal stack\n  struct FEX_PACKED stack_t {\n    void* ss_sp;\n    int32_t ss_flags;\n    uint32_t : 32;\n    size_t ss_size;\n  };\n  static_assert(sizeof(FEXCore::x86_64::stack_t) == 24, \"This needs to be the right size\");\n\n  /**\n   * Describes the software specific bytes added at the end of the\n   * fpstate to identify whether or not an extended context area is\n   * present and what kind of extended features are present in said\n   * context area.\n   */\n  struct FEX_PACKED fpx_sw_bytes {\n    static constexpr uint32_t FP_XSTATE_MAGIC_1 = 0x46505853;\n    static constexpr uint32_t FP_XSTATE_MAGIC_2 = 0x46505845;\n\n    enum FeatureFlag : uint32_t {\n      FEATURE_FP = 1U << 0,\n      FEATURE_SSE = 1U << 1,\n      FEATURE_YMM = 1U << 2,\n      FEATURE_BNDREGS = 1U << 3,\n      FEATURE_BNDCSR = 1U << 4,\n      FEATURE_OPMASK = 1U << 5,\n      FEATURE_ZMM_Hi256 = 1U << 6,\n      FEATURE_Hi16_ZMM = 1U << 7,\n      FEATURE_PT_UNIMPL = 1U << 8,\n      FEATURE_PKRU = 1U << 9,\n      FEATURE_PASID = 1U << 10,\n      FEATURE_RESERVED11 = 1U << 11,\n      FEATURE_RESERVED12 = 1U << 12,\n      FEATURE_RESERVED13 = 1U << 13,\n      FEATURE_RESERVED14 = 1U << 14,\n      FEATURE_LBR = 1U << 15,\n      FEATURE_RESERVED16 = 1U << 16,\n      FEATURE_XTILE_CFG = 1U << 17,\n      FEATURE_XTILE_DATA = 1U << 18,\n    };\n\n    bool HasExtendedContext() const {\n      return magic1 == FP_XSTATE_MAGIC_1;\n    }\n\n    bool HasYMMH() const {\n      return (xfeatures & FEATURE_YMM) != 0;\n    }\n\n    // If magic1 is set to FP_XSTATE_MAGIC_1, then the encompassing\n    // frame is an xstate frame. If 0, then it's a legacy frame.\n    uint32_t magic1;\n\n    // Total size of the fpstate area\n    // - magic1 = 0                 -> sizeof(fpstate)\n    // - magic1 = FP_XSTATE_MAGIC_1 -> sizeof(xstate) + extensions (if any)\n    uint32_t extended_size;\n\n    // Feature bitmask describing supported features.\n    uint64_t xfeatures;\n\n    // Actual XSAVE state size, based on above xfeatures\n    uint32_t xstate_size;\n\n    // Reserved data\n    uint32_t padding[7];\n  };\n  static_assert(sizeof(fpx_sw_bytes) == 48);\n\n  struct FEX_PACKED _libc_fpstate {\n    // This is in FXSAVE format\n    uint16_t fcw;\n    uint16_t fsw;\n    uint16_t ftw;\n    uint16_t fop;\n    uint64_t fip;\n    uint64_t fdp;\n    uint32_t mxcsr;\n    uint32_t mxcsr_mask;\n    __uint128_t _st[8];\n    __uint128_t _xmm[16];\n    uint32_t _res[12];\n\n    // Linux uses 12 of the bytes relegated for software purposes\n    // to store info describing any existing XSAVE context data.\n    fpx_sw_bytes sw_reserved;\n  };\n  static_assert(sizeof(FEXCore::x86_64::_libc_fpstate) == 512, \"This needs to be the right size\");\n\n  struct FEX_PACKED xstate_header {\n    uint64_t xfeatures;\n    uint64_t reserved1[2];\n    uint64_t reserved2[5];\n  };\n  static_assert(sizeof(xstate_header) == 64);\n\n  struct FEX_PACKED ymmh_state {\n    __uint128_t ymmh_space[16];\n  };\n  static_assert(sizeof(ymmh_state) == 256);\n\n  struct FEX_PACKED magic2 {\n    uint32_t pad;\n    uint32_t magic;\n  };\n  static_assert(sizeof(magic2) == sizeof(uint64_t));\n\n  /**\n   * Extended state that includes both the main fpstate\n   * and the extended state.\n   */\n  struct FEX_PACKED xstate {\n    _libc_fpstate fpstate;\n    xstate_header xstate_hdr;\n    ymmh_state ymmh;\n    magic2 magic2 {};\n  };\n  static_assert(sizeof(xstate) == 840);\n\n  ///< The order of these must match the GNU ordering\n  enum ContextRegs {\n    FEX_REG_R8 = 0,\n    FEX_REG_R9,\n    FEX_REG_R10,\n    FEX_REG_R11,\n    FEX_REG_R12,\n    FEX_REG_R13,\n    FEX_REG_R14,\n    FEX_REG_R15,\n    FEX_REG_RDI,\n    FEX_REG_RSI,\n    FEX_REG_RBP,\n    FEX_REG_RBX,\n    FEX_REG_RDX,\n    FEX_REG_RAX,\n    FEX_REG_RCX,\n    FEX_REG_RSP,\n    FEX_REG_RIP,\n    FEX_REG_EFL,\n    FEX_REG_CSGSFS,\n    FEX_REG_ERR,\n    FEX_REG_TRAPNO,\n    FEX_REG_OLDMASK,\n    FEX_REG_CR2,\n  };\n  static_assert(FEX_REG_CR2 == 22, \"Oops\");\n\n  struct FEX_PACKED mcontext_t {\n    uint64_t gregs[23];\n    FEXCore::x86_64::_libc_fpstate* fpregs;\n    uint64_t __reserved[8];\n  };\n  static_assert(sizeof(FEXCore::x86_64::mcontext_t) == 256, \"This needs to be the right size\");\n\n  struct FEX_PACKED sigset_t {\n    uint64_t val[16];\n  };\n  static_assert(sizeof(FEXCore::x86_64::sigset_t) == 128, \"This needs to be the right size\");\n\n  struct FEX_PACKED ucontext_t {\n    uint64_t uc_flags;\n    FEXCore::x86_64::ucontext_t* uc_link;\n    FEXCore::x86_64::stack_t uc_stack;\n    FEXCore::x86_64::mcontext_t uc_mcontext;\n    FEXCore::x86_64::sigset_t uc_sigmask;\n  };\n  static_assert(offsetof(FEXCore::x86_64::ucontext_t, uc_mcontext) == 40, \"Needs to be correct\");\n\n  static_assert(sizeof(FEXCore::x86_64::ucontext_t) == 424, \"This needs to be the right size\");\n} // namespace x86_64\n\nnamespace x86 {\n  // uc_flags flags\n  ///< Has extended FP state\n  constexpr uint64_t UC_FP_XSTATE = (1ULL << 0);\n\n  ///< The order of these must match the GNU ordering\n  enum ContextRegs {\n    FEX_REG_GS = 0,\n    FEX_REG_FS,\n    FEX_REG_ES,\n    FEX_REG_DS,\n    FEX_REG_RDI,\n    FEX_REG_RSI,\n    FEX_REG_RBP,\n    FEX_REG_RSP,\n    FEX_REG_RBX,\n    FEX_REG_RDX,\n    FEX_REG_RCX,\n    FEX_REG_RAX,\n    FEX_REG_TRAPNO,\n    FEX_REG_ERR,\n    FEX_REG_EIP,\n    FEX_REG_CS,\n    FEX_REG_EFL,\n    FEX_REG_UESP,\n    FEX_REG_SS\n  };\n  static_assert(FEX_REG_SS == 18, \"Oops\");\n\n  union sigval_t {\n    int sival_int;\n    uint32_t sival_ptr; // XXX: Should be compat_ptr<void>\n  };\n\n  struct FEX_PACKED siginfo_t {\n    int si_signo;\n    int si_errno;\n    int si_code;\n    union {\n      uint32_t pad[29];\n      /* tgkill siginfo_t */\n      struct {\n        int32_t pid;\n        int32_t uid;\n      } _kill;\n      /* SIGPOLL */\n      struct {\n        int32_t band;\n        int32_t fd;\n      } _poll;\n      /* SIGILL, SIGFPE, SIGSEGV, SIBUS */\n      struct {\n        uint32_t addr;\n      } _sigfault;\n      /* SIGCHLD */\n      struct {\n        int32_t pid;\n        int32_t uid;\n        int32_t status;\n        int32_t utime;\n        int32_t stime;\n      } _sigchld;\n      /* RT signals */\n      struct {\n        int32_t pid;\n        int32_t uid;\n        union {\n          int32_t sival_int;\n          uint32_t sival_ptr; // compat_ptr\n        } sigval;\n      } _rt;\n      /* SIGALRM, SIGVTALRM */\n      struct {\n        int tid;\n        int overrun;\n        FEXCore::x86::sigval_t sigval;\n      } _timer;\n      /* SIGSYS */\n      struct {\n        uint32_t call_addr; // compat_ptr\n        int32_t syscall;\n        uint32_t arch;\n      } _sigsys;\n    } _sifields;\n\n    union HostSigInfo_t {\n      // This anonymous struct needs to match the host definition\n      struct {\n        uint32_t si_signo;\n        uint32_t si_errno;\n        uint32_t si_code;\n\n        uint32_t __pad0;\n\n        // Pad[28] is a union for all the sifields\n        uint32_t _pad[28];\n      } FEXDef;\n      ::siginfo_t host {};\n    };\n    static_assert(sizeof(HostSigInfo_t) == 128, \"This needs to be the right size\");\n\n    siginfo_t() = delete;\n\n    operator ::siginfo_t() const {\n      // The definition of siginfo_t changes depending on the host environment\n      // It is guaranteed to be 128 bytes and the kernel interface is the same for all of them\n      // Since we only run on Linux\n      HostSigInfo_t val {};\n\n      val.FEXDef.si_signo = si_signo;\n      val.FEXDef.si_errno = si_errno;\n      val.FEXDef.si_code = si_code;\n\n      // Host siginfo has a pad member that is set to zeros\n      val.FEXDef.__pad0 = 0;\n\n      // Copy over the union\n      // The union is different sizes on 64-bit versus 32-bit\n      memcpy(val.FEXDef._pad, _sifields.pad, std::min(sizeof(val.FEXDef._pad), sizeof(_sifields.pad)));\n\n      return val.host;\n    }\n\n    siginfo_t(::siginfo_t val) {\n      HostSigInfo_t host;\n      host.host = val;\n\n      si_signo = host.FEXDef.si_signo;\n      si_errno = host.FEXDef.si_errno;\n      si_code = host.FEXDef.si_code;\n\n      // Copy over the union\n      // The union is different sizes on 64-bit versus 32-bit\n      memcpy(_sifields.pad, host.FEXDef._pad, std::min(sizeof(host.FEXDef._pad), sizeof(_sifields.pad)));\n    }\n    static_assert(offsetof(::siginfo_t, si_signo) == offsetof(HostSigInfo_t, FEXDef.si_signo), \"si_signo in wrong location?\");\n    static_assert(offsetof(::siginfo_t, si_errno) == offsetof(HostSigInfo_t, FEXDef.si_errno), \"si_errno in wrong location?\");\n    static_assert(offsetof(::siginfo_t, si_code) == offsetof(HostSigInfo_t, FEXDef.si_code), \"si_code in wrong location?\");\n  };\n  static_assert(sizeof(FEXCore::x86::siginfo_t) == 128, \"This needs to be the right size\");\n\n  struct FEX_PACKED stack_t {\n    uint32_t ss_sp; // XXX: should be compat_ptr<void>\n    int ss_flags;\n    uint32_t ss_size;\n  };\n\n  static_assert(sizeof(FEXCore::x86::stack_t) == 12, \"This needs to be the right size\");\n\n  struct FEX_PACKED mcontext_t {\n    uint32_t gregs[19];\n    uint32_t fpregs; // XXX: should be compat_ptr<FEXCore::x86::_libc_fpstate>\n    uint32_t oldmask;\n    uint32_t cr2;\n  };\n  static_assert(sizeof(FEXCore::x86::mcontext_t) == 88, \"This needs to be the right size\");\n\n  struct _libc_fpreg {\n    uint16_t significand[4];\n    uint16_t exponent;\n  };\n  static_assert(sizeof(FEXCore::x86::_libc_fpreg) == 10, \"This needs to be the right size\");\n\n  // Same layout on both x86 and x86_64\n  using fpx_sw_bytes = x86_64::fpx_sw_bytes;\n  using xstate_header = x86_64::xstate_header;\n  using ymmh_state = x86_64::ymmh_state;\n\n  enum fpstate_magic {\n    // Legacy fpstate\n    MAGIC_FPU = 0xFFFF'0000,\n    // Contains extended state information\n    MAGIC_XFPSTATE = 0x0,\n  };\n  struct FEX_PACKED _libc_fpstate {\n    uint32_t fcw;\n    uint32_t fsw;\n    uint32_t ftw;\n    uint32_t fop;\n    uint32_t cssel;\n    uint32_t dataoff;\n    uint32_t datasel;\n    FEXCore::x86::_libc_fpreg _st[8];\n    uint32_t status;\n\n    // Extended FPU data\n    uint32_t pad[6]; // Ignored FXSR data\n    uint32_t mxcsr;\n    uint32_t reserved;\n    __uint128_t _st_pad[8];   // Ignored st data\n    __uint128_t _xmm[8];      // First 8 XMM registers\n    uint32_t pad2[44];        // Second 8 XMM registers plus padding\n    fpx_sw_bytes sw_reserved; // extended state encoding\n  };\n  static_assert(sizeof(FEXCore::x86::_libc_fpstate) == 624, \"This needs to be the right size\");\n\n  /**\n   * Extended state that includes both the main fpstate\n   * and the extended state.\n   */\n  struct FEX_PACKED xstate {\n    _libc_fpstate fpstate;\n    xstate_header xstate_hdr;\n    ymmh_state ymmh;\n    x86_64::magic2 magic2 {};\n  };\n  static_assert(sizeof(xstate) == 952);\n\n  struct FEX_PACKED ucontext_t {\n    uint32_t uc_flags;\n    uint32_t uc_link; // XXX: should be a compat_ptr<FEXCore::x86::ucontext_t>\n    FEXCore::x86::stack_t uc_stack;\n    FEXCore::x86::mcontext_t uc_mcontext;\n    FEXCore::x86_64::sigset_t uc_sigmask; // This matches across architectures\n  };\n  static_assert(sizeof(FEXCore::x86::ucontext_t) == 236, \"This needs to be the right size\");\n\n  ///< Non-rt signal context.\n  //\n  // Needs to match the format expected from signal handlers without SA_SIGINFO set.\n  struct sigcontext {\n    uint32_t gs;\n    uint32_t fs;\n    uint32_t es;\n    uint32_t ds;\n    uint32_t di;\n    uint32_t si;\n    uint32_t bp;\n    uint32_t sp;\n    uint32_t bx;\n    uint32_t dx;\n    uint32_t cx;\n    uint32_t ax;\n    uint32_t trapno;\n    uint32_t err;\n    uint32_t ip;\n    uint32_t cs;\n    uint32_t flags;\n    uint32_t sp_at_signal;\n    uint32_t ss;\n\n    uint32_t fpstate;\n    uint32_t oldmask;\n    uint32_t cr2;\n  };\n} // namespace x86\n} // namespace FEXCore\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/ArchHelpers/WinContext.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#ifdef _WIN32\n#include <FEXCore/Utils/LogManager.h>\n#include <winnt.h>\n\nnamespace FEX::ArchHelpers::Context {\n#ifdef ARCHITECTURE_arm64\nstatic inline uint64_t GetSp(PCONTEXT Context) {\n  return Context->Sp;\n}\n\nstatic inline uint64_t GetPc(PCONTEXT Context) {\n  return Context->Pc;\n}\n\nstatic inline void SetSp(PCONTEXT Context, uint64_t val) {\n  Context->Sp = val;\n}\n\nstatic inline void SetPc(PCONTEXT Context, uint64_t val) {\n  Context->Pc = val;\n}\n\nstatic inline uint64_t GetState(PCONTEXT Context) {\n  return Context->X28;\n}\n\nstatic inline void SetState(PCONTEXT Context, uint64_t val) {\n  Context->X28 = val;\n}\n\nstatic inline uint64_t* GetArmGPRs(PCONTEXT Context) {\n  return Context->X;\n}\n#endif\n\n#ifdef ARCHITECTURE_x86_64\nstatic inline uint64_t GetSp(PCONTEXT Context) {\n  return Context->Rsp;\n}\n\nstatic inline uint64_t GetPc(PCONTEXT Context) {\n  return Context->Rip;\n}\n\nstatic inline void SetSp(PCONTEXT Context, uint64_t val) {\n  Context->Rsp = val;\n}\n\nstatic inline void SetPc(PCONTEXT Context, uint64_t val) {\n  Context->Rip = val;\n}\n\nstatic inline uint64_t GetState(PCONTEXT Context) {\n  return Context->R14;\n}\n\nstatic inline void SetState(PCONTEXT Context, uint64_t val) {\n  Context->R14 = val;\n}\n\nstatic inline uint64_t* GetArmGPRs(PCONTEXT Context) {\n  ERROR_AND_DIE_FMT(\"Not implemented for x86 host\");\n}\n\n#endif\n\n} // namespace FEX::ArchHelpers::Context\n\n#endif\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/CMakeLists.txt",
    "content": "# TODO: why is this add_compile_options instead of target?\nadd_compile_options(-fno-operator-names)\n\nadd_library(LinuxEmulation STATIC\n  VDSO_Emulation.cpp\n  Thunks.cpp\n  ArchHelpers/MContext.cpp\n  GdbServer/Info.cpp\n  LinuxSyscalls/GdbServer.cpp\n  LinuxSyscalls/EmulatedFiles/EmulatedFiles.cpp\n  LinuxSyscalls/FaultSafeUserMemAccess.cpp\n  LinuxSyscalls/FileManagement.cpp\n  LinuxSyscalls/LinuxAllocator.cpp\n  LinuxSyscalls/Seccomp/SeccompEmulator.cpp\n  LinuxSyscalls/Seccomp/BPFEmitter.cpp\n  LinuxSyscalls/Seccomp/Dumper.cpp\n  LinuxSyscalls/SignalDelegator.cpp\n  LinuxSyscalls/Syscalls.cpp\n  LinuxSyscalls/SyscallsSMCTracking.cpp\n  LinuxSyscalls/SyscallsVMATracking.cpp\n  LinuxSyscalls/ThreadManager.cpp\n  LinuxSyscalls/SignalDelegator/GuestFramesManagement.cpp\n  LinuxSyscalls/Utils/Threads.cpp\n  LinuxSyscalls/x32/Syscalls.cpp\n  LinuxSyscalls/x32/EPoll.cpp\n  LinuxSyscalls/x32/FD.cpp\n  LinuxSyscalls/x32/FS.cpp\n  LinuxSyscalls/x32/Info.cpp\n  LinuxSyscalls/x32/IO.cpp\n  LinuxSyscalls/x32/Memory.cpp\n  LinuxSyscalls/x32/Msg.cpp\n  LinuxSyscalls/x32/NotImplemented.cpp\n  LinuxSyscalls/x32/Semaphore.cpp\n  LinuxSyscalls/x32/Sched.cpp\n  LinuxSyscalls/x32/Signals.cpp\n  LinuxSyscalls/x32/Socket.cpp\n  LinuxSyscalls/x32/Stubs.cpp\n  LinuxSyscalls/x32/Thread.cpp\n  LinuxSyscalls/x32/Time.cpp\n  LinuxSyscalls/x32/Timer.cpp\n  LinuxSyscalls/x32/IoctlEmulation.cpp\n  LinuxSyscalls/x64/EPoll.cpp\n  LinuxSyscalls/x64/FD.cpp\n  LinuxSyscalls/x64/Info.cpp\n  LinuxSyscalls/x64/Memory.cpp\n  LinuxSyscalls/x64/NotImplemented.cpp\n  LinuxSyscalls/x64/Semaphore.cpp\n  LinuxSyscalls/x64/Signals.cpp\n  LinuxSyscalls/x64/Thread.cpp\n  LinuxSyscalls/x64/Syscalls.cpp\n  LinuxSyscalls/x64/Time.cpp\n  LinuxSyscalls/Syscalls/EPoll.cpp\n  LinuxSyscalls/Syscalls/FD.cpp\n  LinuxSyscalls/Syscalls/FS.cpp\n  LinuxSyscalls/Syscalls/Passthrough.cpp\n  LinuxSyscalls/Syscalls/Info.cpp\n  LinuxSyscalls/Syscalls/IO.cpp\n  LinuxSyscalls/Syscalls/Memory.cpp\n  LinuxSyscalls/Syscalls/Signals.cpp\n  LinuxSyscalls/Syscalls/Thread.cpp\n  LinuxSyscalls/Syscalls/Timer.cpp\n  LinuxSyscalls/Syscalls/NotImplemented.cpp\n  LinuxSyscalls/Syscalls/Stubs.cpp)\n\ntarget_compile_options(LinuxEmulation PRIVATE\n  -Wall\n  -Werror=cast-qual\n  -Werror=ignored-qualifiers\n  -Werror=implicit-fallthrough\n\n  -Wno-trigraphs\n  -fwrapv)\n\nset_target_properties(LinuxEmulation PROPERTIES\n  C_VISIBILITY_PRESET hidden\n  CXX_VISIBILITY_PRESET hidden\n  VISIBILITY_INLINES_HIDDEN TRUE)\n\ntarget_include_directories(LinuxEmulation PRIVATE\n  ${CMAKE_BINARY_DIR}/generated\n  ${CMAKE_CURRENT_SOURCE_DIR}/\n  ${PROJECT_SOURCE_DIR}/External/drm-headers/include/)\n\ntarget_include_directories(LinuxEmulation INTERFACE\n  ${CMAKE_CURRENT_SOURCE_DIR}/)\n\ntarget_link_libraries(LinuxEmulation PRIVATE\n  Common\n  CommonTools)\n\ntarget_link_libraries(LinuxEmulation INTERFACE FEXCore)\n\nset(HEADERS_TO_VERIFY\n  # These need to match structs to 32bit structs\n  LinuxSyscalls/x32/Types.h          x86_32\n  LinuxSyscalls/x32/Ioctl/asound.h   x86_32\n  LinuxSyscalls/x32/Ioctl/drm.h      x86_32\n  LinuxSyscalls/x32/Ioctl/streams.h  x86_32\n  LinuxSyscalls/x32/Ioctl/usbdev.h   x86_32\n  LinuxSyscalls/x32/Ioctl/input.h    x86_32\n  LinuxSyscalls/x32/Ioctl/sockios.h  x86_32\n  LinuxSyscalls/x32/Ioctl/joystick.h x86_32\n  LinuxSyscalls/x32/Ioctl/v4l2.h     x86_32\n\n  # This needs to match structs to 64bit structs\n  LinuxSyscalls/x64/Types.h          x86_64)\n\nlist(LENGTH HEADERS_TO_VERIFY ARG_COUNT)\nmath(EXPR ARG_COUNT \"${ARG_COUNT}-1\")\n\nset(ARGS\n  \"-x\" \"c++\"\n  \"-std=c++20\"\n  \"-fno-operator-names\"\n  \"-I${PROJECT_SOURCE_DIR}/External/drm-headers/include/\")\n\n# Global include directories\nget_directory_property (INC_DIRS INCLUDE_DIRECTORIES)\nlist(TRANSFORM INC_DIRS PREPEND \"-I\")\nlist(APPEND ARGS ${INC_DIRS})\n\n# FEXCore directories\nget_target_property(INC_DIRS FEXCore INTERFACE_INCLUDE_DIRECTORIES)\nlist(TRANSFORM INC_DIRS PREPEND \"-I\")\nlist(APPEND ARGS ${INC_DIRS})\n\nget_target_property(INC_DIRS LinuxEmulation INTERFACE_INCLUDE_DIRECTORIES)\nlist(TRANSFORM INC_DIRS PREPEND \"-I\")\nlist(APPEND ARGS ${INC_DIRS})\n\nforeach(Index RANGE 0 ${ARG_COUNT} 2)\n  math(EXPR TEST_TYPE_INDEX \"${Index}+1\")\n\n  list(GET HEADERS_TO_VERIFY ${Index} HEADER)\n  list(GET HEADERS_TO_VERIFY ${TEST_TYPE_INDEX} TEST_TYPE)\n\n  file(RELATIVE_PATH REL_HEADER ${CMAKE_BINARY_DIR} \"${CMAKE_CURRENT_SOURCE_DIR}/${HEADER}\")\n  set(TEST_NAME \"${TEST_DESC}/Test_verify_${HEADER}\")\n  set(TEST_NAME_ARCH \"${TEST_DESC}/Test_verify_arch_${HEADER}\")\n\n  add_test(NAME ${TEST_NAME}_x86_64\n    WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n    COMMAND \"python3\" \"${CMAKE_SOURCE_DIR}/Scripts/StructPackVerifier.py\" \"-c1\" \"x86_64\" \"${REL_HEADER}\" ${ARGS})\n\n  add_test(NAME ${TEST_NAME}_aarch64\n    WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n    COMMAND \"python3\" \"${CMAKE_SOURCE_DIR}/Scripts/StructPackVerifier.py\" \"-c1\" \"aarch64\" \"${REL_HEADER}\" ${ARGS})\n\n  add_test(NAME ${TEST_NAME_ARCH}_x86_64\n    WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n    COMMAND \"python3\" \"${CMAKE_SOURCE_DIR}/Scripts/StructPackVerifier.py\" \"-c1\" \"x86_64\" \"-c2\" \"${TEST_TYPE}\" \"${REL_HEADER}\" ${ARGS})\n\n  add_test(NAME ${TEST_NAME_ARCH}_aarch64\n    WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n    COMMAND \"python3\" \"${CMAKE_SOURCE_DIR}/Scripts/StructPackVerifier.py\" \"-c1\" \"aarch64\" \"-c2\" \"${TEST_TYPE}\" \"${REL_HEADER}\" ${ARGS})\n\n  set_property(TEST ${TEST_NAME}_x86_64 APPEND PROPERTY DEPENDS \"${HEADER}\")\n  set_property(TEST ${TEST_NAME}_aarch64 APPEND PROPERTY DEPENDS \"${HEADER}\")\n  set_property(TEST ${TEST_NAME_ARCH}_x86_64 APPEND PROPERTY DEPENDS \"${HEADER}\")\n  set_property(TEST ${TEST_NAME_ARCH}_aarch64 APPEND PROPERTY DEPENDS \"${HEADER}\")\nendforeach()\n\nadd_custom_target(struct_verifier\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"302\" ${TEST_JOB_FLAG} \"-R\" \"Test_verify*\")\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/GdbServer/Info.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: glue|gdbserver\ndesc: Provides a gdb interface to the guest state\n$end_info$\n*/\n\n#include \"GdbServer/Info.h\"\n\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/sstream.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/FileLoading.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/StringUtils.h>\n\n#include <array>\n#include <string_view>\n\nnamespace FEX::GDB::Info {\nconstexpr std::array<std::string_view, 22> FlagNames = {\n  \"CF\", \"\", \"PF\", \"\", \"AF\", \"\", \"ZF\", \"SF\", \"TF\", \"IF\", \"DF\", \"OF\", \"IOPL\", \"\", \"NT\", \"\", \"RF\", \"VM\", \"AC\", \"VIF\", \"VIP\", \"ID\",\n};\n\nconst std::string_view& GetFlagName(unsigned Bit) {\n  LOGMAN_THROW_A_FMT(Bit < 22, \"Bit position too large\");\n  return FlagNames[Bit];\n}\n\nstd::string_view GetGRegName(unsigned Reg) {\n  switch (Reg) {\n  case FEXCore::X86State::REG_RAX: return \"rax\";\n  case FEXCore::X86State::REG_RBX: return \"rbx\";\n  case FEXCore::X86State::REG_RCX: return \"rcx\";\n  case FEXCore::X86State::REG_RDX: return \"rdx\";\n  case FEXCore::X86State::REG_RSP: return \"rsp\";\n  case FEXCore::X86State::REG_RBP: return \"rbp\";\n  case FEXCore::X86State::REG_RSI: return \"rsi\";\n  case FEXCore::X86State::REG_RDI: return \"rdi\";\n  case FEXCore::X86State::REG_R8: return \"r8\";\n  case FEXCore::X86State::REG_R9: return \"r9\";\n  case FEXCore::X86State::REG_R10: return \"r10\";\n  case FEXCore::X86State::REG_R11: return \"r11\";\n  case FEXCore::X86State::REG_R12: return \"r12\";\n  case FEXCore::X86State::REG_R13: return \"r13\";\n  case FEXCore::X86State::REG_R14: return \"r14\";\n  case FEXCore::X86State::REG_R15: return \"r15\";\n  default: FEX_UNREACHABLE;\n  }\n}\n\nfextl::string GetThreadName(uint32_t PID, uint32_t ThreadID) {\n  const auto ThreadFile = fextl::fmt::format(\"/proc/{}/task/{}/comm\", PID, ThreadID);\n  fextl::string ThreadName;\n  FEXCore::FileLoading::LoadFile(ThreadName, ThreadFile);\n  // Trim out the potential newline, breaks GDB if it exists.\n  return FEXCore::StringUtils::Trim(ThreadName);\n}\n\nfextl::string BuildOSXML() {\n  fextl::ostringstream xml;\n\n  xml << \"<?xml version='1.0'?>\\n\";\n\n  xml << \"<!DOCTYPE target SYSTEM \\\"osdata.dtd\\\">\\n\";\n  xml << \"<osdata type=\\\"processes\\\">\";\n  // XXX\n  xml << \"</osdata>\";\n\n  xml << std::flush;\n\n  return xml.str();\n}\n\nfextl::string BuildTargetXML(bool Is64Bit) {\n  fextl::ostringstream xml;\n\n  xml << \"<?xml version='1.0'?>\\n\";\n  xml << \"<!DOCTYPE target SYSTEM 'gdb-target.dtd'>\\n\";\n  xml << \"<target>\\n\";\n  if (Is64Bit) {\n    xml << \"<architecture>i386:x86-64</architecture>\\n\";\n  } else {\n    xml << \"<architecture>i386</architecture>\\n\";\n  }\n  xml << \"<osabi>GNU/Linux</osabi>\\n\";\n  xml << \"<feature name='org.gnu.gdb.i386.core'>\\n\";\n\n  xml << \"<flags id='fex_eflags' size='4'>\\n\";\n  // flags register\n  for (int i = 0; i < 22; i++) {\n    auto name = GDB::Info::GetFlagName(i);\n    if (name.empty()) {\n      continue;\n    }\n    xml << \"\\t<field name='\" << name << \"' start='\" << i << \"' end='\" << i << \"' />\\n\";\n  }\n  xml << \"</flags>\\n\";\n\n  int32_t TargetSize {};\n  auto reg = [&](std::string_view name, std::string_view type, int size) {\n    TargetSize += size;\n    xml << \"<reg name='\" << name << \"' bitsize='\" << size << \"' type='\" << type << \"' />\" << std::endl;\n  };\n\n  // Register ordering.\n  // We want to just memcpy our x86 state to gdb, so we tell it the ordering.\n\n  // GPRs\n  for (uint32_t i = 0; i < FEXCore::Core::CPUState::NUM_GPRS; i++) {\n    reg(GDB::Info::GetGRegName(i), \"int64\", 64);\n  }\n\n  reg(\"rip\", \"code_ptr\", 64);\n\n  reg(\"eflags\", \"fex_eflags\", 32);\n\n  // Fake registers which GDB requires, but we don't support;\n  // We stick them past the end of our cpu state.\n\n  // non-userspace segment registers\n  reg(\"cs\", \"int32\", 32);\n  reg(\"ss\", \"int32\", 32);\n  reg(\"ds\", \"int32\", 32);\n  reg(\"es\", \"int32\", 32);\n\n  reg(\"fs\", \"int32\", 32);\n  reg(\"gs\", \"int32\", 32);\n\n  // x87 stack\n  for (int i = 0; i < 8; i++) {\n    reg(fextl::fmt::format(\"st{}\", i), \"i387_ext\", 80);\n  }\n\n  // x87 control\n  reg(\"fctrl\", \"int32\", 32);\n  reg(\"fstat\", \"int32\", 32);\n  reg(\"ftag\", \"int32\", 32);\n  reg(\"fiseg\", \"int32\", 32);\n  reg(\"fioff\", \"int32\", 32);\n  reg(\"foseg\", \"int32\", 32);\n  reg(\"fooff\", \"int32\", 32);\n  reg(\"fop\", \"int32\", 32);\n\n\n  xml << \"</feature>\\n\";\n  xml << \"<feature name='org.gnu.gdb.i386.sse'>\\n\";\n  xml <<\n    R\"(<vector id=\"v4f\" type=\"ieee_single\" count=\"4\"/>\n        <vector id=\"v2d\" type=\"ieee_double\" count=\"2\"/>\n        <vector id=\"v16i8\" type=\"int8\" count=\"16\"/>\n        <vector id=\"v8i16\" type=\"int16\" count=\"8\"/>\n        <vector id=\"v4i32\" type=\"int32\" count=\"4\"/>\n        <vector id=\"v2i64\" type=\"int64\" count=\"2\"/>\n        <union id=\"vec128\">\n          <field name=\"v4_float\" type=\"v4f\"/>\n          <field name=\"v2_double\" type=\"v2d\"/>\n          <field name=\"v16_int8\" type=\"v16i8\"/>\n          <field name=\"v8_int16\" type=\"v8i16\"/>\n          <field name=\"v4_int32\" type=\"v4i32\"/>\n          <field name=\"v2_int64\" type=\"v2i64\"/>\n          <field name=\"uint128\" type=\"uint128\"/>\n        </union>\n        )\";\n\n  // SSE regs\n  for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_XMMS; i++) {\n    reg(fextl::fmt::format(\"xmm{}\", i), \"vec128\", 128);\n  }\n\n  reg(\"mxcsr\", \"int\", 32);\n\n  xml << \"</feature>\\n\";\n\n  xml << \"<feature name='org.gnu.gdb.i386.avx'>\";\n  xml <<\n    R\"(<vector id=\"v4f\" type=\"ieee_single\" count=\"4\"/>\n        <vector id=\"v2d\" type=\"ieee_double\" count=\"2\"/>\n        <vector id=\"v16i8\" type=\"int8\" count=\"16\"/>\n        <vector id=\"v8i16\" type=\"int16\" count=\"8\"/>\n        <vector id=\"v4i32\" type=\"int32\" count=\"4\"/>\n        <vector id=\"v2i64\" type=\"int64\" count=\"2\"/>\n        <union id=\"vec128\">\n          <field name=\"v4_float\" type=\"v4f\"/>\n          <field name=\"v2_double\" type=\"v2d\"/>\n          <field name=\"v16_int8\" type=\"v16i8\"/>\n          <field name=\"v8_int16\" type=\"v8i16\"/>\n          <field name=\"v4_int32\" type=\"v4i32\"/>\n          <field name=\"v2_int64\" type=\"v2i64\"/>\n          <field name=\"uint128\" type=\"uint128\"/>\n        </union>\n        )\";\n  for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_XMMS; i++) {\n    reg(fmt::format(\"ymm{}h\", i), \"vec128\", 128);\n  }\n  xml << \"</feature>\\n\";\n\n  xml << \"</target>\";\n  xml << std::flush;\n\n  return xml.str();\n}\n\n} // namespace FEX::GDB::Info\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/GdbServer/Info.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: glue|gdbserver\ndesc: Provides a gdb interface to the guest state\n$end_info$\n*/\n#pragma once\n\n#include <FEXCore/fextl/string.h>\n\n#include <cstdint>\n#include <string_view>\n\nnamespace FEXCore::X86State {\nenum X86Reg : uint32_t;\n}\n\nnamespace FEX::GDB::Info {\n/**\n * @brief Returns textual name of bit location from EFLAGs register.\n *\n * @param Bit Which bit of EFLAG to query\n */\nconst std::string_view& GetFlagName(unsigned Bit);\n\n/**\n * @brief Returns the textual name of a GPR register\n *\n * @param Reg Index of the register to fetch\n */\nstd::string_view GetGRegName(unsigned Reg);\n\n/**\n * @brief Fetches the thread's name\n *\n * @param PID The program id of the application\n * @param ThreadID The thread id of the program\n */\nfextl::string GetThreadName(uint32_t PID, uint32_t ThreadID);\n\n/**\n * @brief Returns the GDB specific construct of OS describing XML.\n */\nfextl::string BuildOSXML();\n\n/**\n * @brief Returns the GDB specific construct of target describing XML.\n */\nfextl::string BuildTargetXML(bool Is64Bit);\n} // namespace FEX::GDB::Info\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Arm64/SyscallsEnum.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-arm64\n$end_info$\n*/\n#pragma once\n\nnamespace FEX::HLE::Arm64 {\n///< Enum containing all Arm64 linux syscalls for the host kernel\nenum Syscalls_Arm64 {\n  SYSCALL_Arm64_io_setup = 0,\n  SYSCALL_Arm64_io_destroy = 1,\n  SYSCALL_Arm64_io_submit = 2,\n  SYSCALL_Arm64_io_cancel = 3,\n  SYSCALL_Arm64_io_getevents = 4,\n  SYSCALL_Arm64_setxattr = 5,\n  SYSCALL_Arm64_lsetxattr = 6,\n  SYSCALL_Arm64_fsetxattr = 7,\n  SYSCALL_Arm64_getxattr = 8,\n  SYSCALL_Arm64_lgetxattr = 9,\n  SYSCALL_Arm64_fgetxattr = 10,\n  SYSCALL_Arm64_listxattr = 11,\n  SYSCALL_Arm64_llistxattr = 12,\n  SYSCALL_Arm64_flistxattr = 13,\n  SYSCALL_Arm64_removexattr = 14,\n  SYSCALL_Arm64_lremovexattr = 15,\n  SYSCALL_Arm64_fremovexattr = 16,\n  SYSCALL_Arm64_getcwd = 17,\n  SYSCALL_Arm64_lookup_dcookie = 18,\n  SYSCALL_Arm64_eventfd2 = 19,\n  SYSCALL_Arm64_epoll_create1 = 20,\n  SYSCALL_Arm64_epoll_ctl = 21,\n  SYSCALL_Arm64_epoll_pwait = 22,\n  SYSCALL_Arm64_dup = 23,\n  SYSCALL_Arm64_dup3 = 24,\n  SYSCALL_Arm64_fcntl = 25,\n  SYSCALL_Arm64_inotify_init1 = 26,\n  SYSCALL_Arm64_inotify_add_watch = 27,\n  SYSCALL_Arm64_inotify_rm_watch = 28,\n  SYSCALL_Arm64_ioctl = 29,\n  SYSCALL_Arm64_ioprio_set = 30,\n  SYSCALL_Arm64_ioprio_get = 31,\n  SYSCALL_Arm64_flock = 32,\n  SYSCALL_Arm64_mknodat = 33,\n  SYSCALL_Arm64_mkdirat = 34,\n  SYSCALL_Arm64_unlinkat = 35,\n  SYSCALL_Arm64_symlinkat = 36,\n  SYSCALL_Arm64_linkat = 37,\n  SYSCALL_Arm64_renameat = 38,\n  SYSCALL_Arm64_umount2 = 39,\n  SYSCALL_Arm64_mount = 40,\n  SYSCALL_Arm64_pivot_root = 41,\n  SYSCALL_Arm64_nfsservctl = 42,\n  SYSCALL_Arm64_statfs = 43,\n  SYSCALL_Arm64_fstatfs = 44,\n  SYSCALL_Arm64_truncate = 45,\n  SYSCALL_Arm64_ftruncate = 46,\n  SYSCALL_Arm64_fallocate = 47,\n  SYSCALL_Arm64_faccessat = 48,\n  SYSCALL_Arm64_chdir = 49,\n  SYSCALL_Arm64_fchdir = 50,\n  SYSCALL_Arm64_chroot = 51,\n  SYSCALL_Arm64_fchmod = 52,\n  SYSCALL_Arm64_fchmodat = 53,\n  SYSCALL_Arm64_fchownat = 54,\n  SYSCALL_Arm64_fchown = 55,\n  SYSCALL_Arm64_openat = 56,\n  SYSCALL_Arm64_close = 57,\n  SYSCALL_Arm64_vhangup = 58,\n  SYSCALL_Arm64_pipe2 = 59,\n  SYSCALL_Arm64_quotactl = 60,\n  SYSCALL_Arm64_getdents64 = 61,\n  SYSCALL_Arm64_lseek = 62,\n  SYSCALL_Arm64_read = 63,\n  SYSCALL_Arm64_write = 64,\n  SYSCALL_Arm64_readv = 65,\n  SYSCALL_Arm64_writev = 66,\n  SYSCALL_Arm64_pread_64 = 67,\n  SYSCALL_Arm64_pwrite_64 = 68,\n  SYSCALL_Arm64_preadv = 69,\n  SYSCALL_Arm64_pwritev = 70,\n  SYSCALL_Arm64_sendfile = 71,\n  SYSCALL_Arm64_pselect6 = 72,\n  SYSCALL_Arm64_ppoll = 73,\n  SYSCALL_Arm64_signalfd4 = 74,\n  SYSCALL_Arm64_vmsplice = 75,\n  SYSCALL_Arm64_splice = 76,\n  SYSCALL_Arm64_tee = 77,\n  SYSCALL_Arm64_readlinkat = 78,\n  SYSCALL_Arm64_fstatat = 79,\n  SYSCALL_Arm64_fstat = 80,\n  SYSCALL_Arm64_sync = 81,\n  SYSCALL_Arm64_fsync = 82,\n  SYSCALL_Arm64_fdatasync = 83,\n  SYSCALL_Arm64_sync_file_range2 = 84,\n  SYSCALL_Arm64_sync_file_range = 84,\n  SYSCALL_Arm64_timerfd_create = 85,\n  SYSCALL_Arm64_timerfd_settime = 86,\n  SYSCALL_Arm64_timerfd_gettime = 87,\n  SYSCALL_Arm64_utimensat = 88,\n  SYSCALL_Arm64_acct = 89,\n  SYSCALL_Arm64_capget = 90,\n  SYSCALL_Arm64_capset = 91,\n  SYSCALL_Arm64_personality = 92,\n  SYSCALL_Arm64_exit = 93,\n  SYSCALL_Arm64_exit_group = 94,\n  SYSCALL_Arm64_waitid = 95,\n  SYSCALL_Arm64_set_tid_address = 96,\n  SYSCALL_Arm64_unshare = 97,\n  SYSCALL_Arm64_futex = 98,\n  SYSCALL_Arm64_set_robust_list = 99,\n  SYSCALL_Arm64_get_robust_list = 100,\n  SYSCALL_Arm64_nanosleep = 101,\n  SYSCALL_Arm64_getitimer = 102,\n  SYSCALL_Arm64_setitimer = 103,\n  SYSCALL_Arm64_kexec_load = 104,\n  SYSCALL_Arm64_init_module = 105,\n  SYSCALL_Arm64_delete_module = 106,\n  SYSCALL_Arm64_timer_create = 107,\n  SYSCALL_Arm64_timer_gettime = 108,\n  SYSCALL_Arm64_timer_getoverrun = 109,\n  SYSCALL_Arm64_timer_settime = 110,\n  SYSCALL_Arm64_timer_delete = 111,\n  SYSCALL_Arm64_clock_settime = 112,\n  SYSCALL_Arm64_clock_gettime = 113,\n  SYSCALL_Arm64_clock_getres = 114,\n  SYSCALL_Arm64_clock_nanosleep = 115,\n  SYSCALL_Arm64_syslog = 116,\n  SYSCALL_Arm64_ptrace = 117,\n  SYSCALL_Arm64_sched_setparam = 118,\n  SYSCALL_Arm64_sched_setscheduler = 119,\n  SYSCALL_Arm64_sched_getscheduler = 120,\n  SYSCALL_Arm64_sched_getparam = 121,\n  SYSCALL_Arm64_sched_setaffinity = 122,\n  SYSCALL_Arm64_sched_getaffinity = 123,\n  SYSCALL_Arm64_sched_yield = 124,\n  SYSCALL_Arm64_sched_get_priority_max = 125,\n  SYSCALL_Arm64_sched_get_priority_min = 126,\n  SYSCALL_Arm64_sched_rr_get_interval = 127,\n  SYSCALL_Arm64_restart_syscall = 128,\n  SYSCALL_Arm64_kill = 129,\n  SYSCALL_Arm64_tkill = 130,\n  SYSCALL_Arm64_tgkill = 131,\n  SYSCALL_Arm64_sigaltstack = 132,\n  SYSCALL_Arm64_rt_sigsuspend = 133,\n  SYSCALL_Arm64_rt_sigaction = 134,\n  SYSCALL_Arm64_rt_sigprocmask = 135,\n  SYSCALL_Arm64_rt_sigpending = 136,\n  SYSCALL_Arm64_rt_sigtimedwait = 137,\n  SYSCALL_Arm64_rt_sigqueueinfo = 138,\n  SYSCALL_Arm64_rt_sigreturn = 139,\n  SYSCALL_Arm64_setpriority = 140,\n  SYSCALL_Arm64_getpriority = 141,\n  SYSCALL_Arm64_reboot = 142,\n  SYSCALL_Arm64_setregid = 143,\n  SYSCALL_Arm64_setgid = 144,\n  SYSCALL_Arm64_setreuid = 145,\n  SYSCALL_Arm64_setuid = 146,\n  SYSCALL_Arm64_setresuid = 147,\n  SYSCALL_Arm64_getresuid = 148,\n  SYSCALL_Arm64_setresgid = 149,\n  SYSCALL_Arm64_getresgid = 150,\n  SYSCALL_Arm64_setfsuid = 151,\n  SYSCALL_Arm64_setfsgid = 152,\n  SYSCALL_Arm64_times = 153,\n  SYSCALL_Arm64_setpgid = 154,\n  SYSCALL_Arm64_getpgid = 155,\n  SYSCALL_Arm64_getsid = 156,\n  SYSCALL_Arm64_setsid = 157,\n  SYSCALL_Arm64_getgroups = 158,\n  SYSCALL_Arm64_setgroups = 159,\n  SYSCALL_Arm64_uname = 160,\n  SYSCALL_Arm64_sethostname = 161,\n  SYSCALL_Arm64_setdomainname = 162,\n  SYSCALL_Arm64_getrlimit = 163,\n  SYSCALL_Arm64_setrlimit = 164,\n  SYSCALL_Arm64_getrusage = 165,\n  SYSCALL_Arm64_umask = 166,\n  SYSCALL_Arm64_prctl = 167,\n  SYSCALL_Arm64_getcpu = 168,\n  SYSCALL_Arm64_gettimeofday = 169,\n  SYSCALL_Arm64_settimeofday = 170,\n  SYSCALL_Arm64_adjtimex = 171,\n  SYSCALL_Arm64_getpid = 172,\n  SYSCALL_Arm64_getppid = 173,\n  SYSCALL_Arm64_getuid = 174,\n  SYSCALL_Arm64_geteuid = 175,\n  SYSCALL_Arm64_getgid = 176,\n  SYSCALL_Arm64_getegid = 177,\n  SYSCALL_Arm64_gettid = 178,\n  SYSCALL_Arm64_sysinfo = 179,\n  SYSCALL_Arm64_mq_open = 180,\n  SYSCALL_Arm64_mq_unlink = 181,\n  SYSCALL_Arm64_mq_timedsend = 182,\n  SYSCALL_Arm64_mq_timedreceive = 183,\n  SYSCALL_Arm64_mq_notify = 184,\n  SYSCALL_Arm64_mq_getsetattr = 185,\n  SYSCALL_Arm64_msgget = 186,\n  SYSCALL_Arm64_msgctl = 187,\n  SYSCALL_Arm64_msgrcv = 188,\n  SYSCALL_Arm64_msgsnd = 189,\n  SYSCALL_Arm64_semget = 190,\n  SYSCALL_Arm64_semctl = 191,\n  SYSCALL_Arm64_semtimedop = 192,\n  SYSCALL_Arm64_semop = 193,\n  SYSCALL_Arm64_shmget = 194,\n  SYSCALL_Arm64_shmctl = 195,\n  SYSCALL_Arm64_shmat = 196,\n  SYSCALL_Arm64_shmdt = 197,\n  SYSCALL_Arm64_socket = 198,\n  SYSCALL_Arm64_socketpair = 199,\n  SYSCALL_Arm64_bind = 200,\n  SYSCALL_Arm64_listen = 201,\n  SYSCALL_Arm64_accept = 202,\n  SYSCALL_Arm64_connect = 203,\n  SYSCALL_Arm64_getsockname = 204,\n  SYSCALL_Arm64_getpeername = 205,\n  SYSCALL_Arm64_sendto = 206,\n  SYSCALL_Arm64_recvfrom = 207,\n  SYSCALL_Arm64_setsockopt = 208,\n  SYSCALL_Arm64_getsockopt = 209,\n  SYSCALL_Arm64_shutdown = 210,\n  SYSCALL_Arm64_sendmsg = 211,\n  SYSCALL_Arm64_recvmsg = 212,\n  SYSCALL_Arm64_readahead = 213,\n  SYSCALL_Arm64_brk = 214,\n  SYSCALL_Arm64_munmap = 215,\n  SYSCALL_Arm64_mremap = 216,\n  SYSCALL_Arm64_add_key = 217,\n  SYSCALL_Arm64_request_key = 218,\n  SYSCALL_Arm64_keyctl = 219,\n  SYSCALL_Arm64_clone = 220,\n  SYSCALL_Arm64_execve = 221,\n  SYSCALL_Arm64_mmap = 222,\n  SYSCALL_Arm64_fadvise64 = 223,\n  SYSCALL_Arm64_swapon = 224,\n  SYSCALL_Arm64_swapoff = 225,\n  SYSCALL_Arm64_mprotect = 226,\n  SYSCALL_Arm64_msync = 227,\n  SYSCALL_Arm64_mlock = 228,\n  SYSCALL_Arm64_munlock = 229,\n  SYSCALL_Arm64_mlockall = 230,\n  SYSCALL_Arm64_munlockall = 231,\n  SYSCALL_Arm64_mincore = 232,\n  SYSCALL_Arm64_madvise = 233,\n  SYSCALL_Arm64_remap_file_pages = 234,\n  SYSCALL_Arm64_mbind = 235,\n  SYSCALL_Arm64_get_mempolicy = 236,\n  SYSCALL_Arm64_set_mempolicy = 237,\n  SYSCALL_Arm64_migrate_pages = 238,\n  SYSCALL_Arm64_move_pages = 239,\n  SYSCALL_Arm64_rt_tgsigqueueinfo = 240,\n  SYSCALL_Arm64_perf_event_open = 241,\n  SYSCALL_Arm64_accept4 = 242,\n  SYSCALL_Arm64_recvmmsg = 243,\n  SYSCALL_Arm64_wait4 = 260,\n  SYSCALL_Arm64_prlimit_64 = 261,\n  SYSCALL_Arm64_fanotify_init = 262,\n  SYSCALL_Arm64_fanotify_mark = 263,\n  SYSCALL_Arm64_name_to_handle_at = 264,\n  SYSCALL_Arm64_open_by_handle_at = 265,\n  SYSCALL_Arm64_clock_adjtime = 266,\n  SYSCALL_Arm64_syncfs = 267,\n  SYSCALL_Arm64_setns = 268,\n  SYSCALL_Arm64_sendmmsg = 269,\n  SYSCALL_Arm64_process_vm_readv = 270,\n  SYSCALL_Arm64_process_vm_writev = 271,\n  SYSCALL_Arm64_kcmp = 272,\n  SYSCALL_Arm64_finit_module = 273,\n  SYSCALL_Arm64_sched_setattr = 274,\n  SYSCALL_Arm64_sched_getattr = 275,\n  SYSCALL_Arm64_renameat2 = 276,\n  SYSCALL_Arm64_seccomp = 277,\n  SYSCALL_Arm64_getrandom = 278,\n  SYSCALL_Arm64_memfd_create = 279,\n  SYSCALL_Arm64_bpf = 280,\n  SYSCALL_Arm64_execveat = 281,\n  SYSCALL_Arm64_userfaultfd = 282,\n  SYSCALL_Arm64_membarrier = 283,\n  SYSCALL_Arm64_mlock2 = 284,\n  SYSCALL_Arm64_copy_file_range = 285,\n  SYSCALL_Arm64_preadv2 = 286,\n  SYSCALL_Arm64_pwritev2 = 287,\n  SYSCALL_Arm64_pkey_mprotect = 288,\n  SYSCALL_Arm64_pkey_alloc = 289,\n  SYSCALL_Arm64_pkey_free = 290,\n  SYSCALL_Arm64_statx = 291,\n  SYSCALL_Arm64_io_pgetevents = 292,\n  SYSCALL_Arm64_rseq = 293,\n  SYSCALL_Arm64_kexec_file_load = 294,\n  SYSCALL_Arm64_clock_gettime64 = 403,\n  SYSCALL_Arm64_clock_settime64 = 404,\n  SYSCALL_Arm64_clock_adjtime64 = 405,\n  SYSCALL_Arm64_clock_getres_time64 = 406,\n  SYSCALL_Arm64_clock_nanosleep_time64 = 407,\n  SYSCALL_Arm64_timer_gettime64 = 408,\n  SYSCALL_Arm64_timer_settime64 = 409,\n  SYSCALL_Arm64_timerfd_gettime64 = 410,\n  SYSCALL_Arm64_timerfd_settime64 = 411,\n  SYSCALL_Arm64_utimensat_time64 = 412,\n  SYSCALL_Arm64_pselect6_time64 = 413,\n  SYSCALL_Arm64_ppoll_time64 = 414,\n  SYSCALL_Arm64_io_pgetevents_time64 = 416,\n  SYSCALL_Arm64_recvmmsg_time64 = 417,\n  SYSCALL_Arm64_mq_timedsend_time64 = 418,\n  SYSCALL_Arm64_mq_timedreceive_time64 = 419,\n  SYSCALL_Arm64_semtimedop_time64 = 420,\n  SYSCALL_Arm64_rt_sigtimedwait_time64 = 421,\n  SYSCALL_Arm64_futex_time64 = 422,\n  SYSCALL_Arm64_sched_rr_get_interval_time64 = 423,\n  SYSCALL_Arm64_pidfd_send_signal = 424,\n  SYSCALL_Arm64_io_uring_setup = 425,\n  SYSCALL_Arm64_io_uring_enter = 426,\n  SYSCALL_Arm64_io_uring_register = 427,\n  SYSCALL_Arm64_open_tree = 428,\n  SYSCALL_Arm64_move_mount = 429,\n  SYSCALL_Arm64_fsopen = 430,\n  SYSCALL_Arm64_fsconfig = 431,\n  SYSCALL_Arm64_fsmount = 432,\n  SYSCALL_Arm64_fspick = 433,\n  SYSCALL_Arm64_pidfd_open = 434,\n  SYSCALL_Arm64_clone3 = 435,\n  SYSCALL_Arm64_close_range = 436,\n  SYSCALL_Arm64_openat2 = 437,\n  SYSCALL_Arm64_pidfd_getfd = 438,\n  SYSCALL_Arm64_faccessat2 = 439,\n  SYSCALL_Arm64_process_madvise = 440,\n  SYSCALL_Arm64_epoll_pwait2 = 441,\n  SYSCALL_Arm64_mount_setattr = 442,\n  SYSCALL_Arm64_quotactl_fd = 443,\n  SYSCALL_Arm64_landlock_create_ruleset = 444,\n  SYSCALL_Arm64_landlock_add_rule = 445,\n  SYSCALL_Arm64_landlock_restrict_self = 446,\n  SYSCALL_Arm64_memfd_secret = 447,\n  SYSCALL_Arm64_process_mrelease = 448,\n  SYSCALL_Arm64_futex_waitv = 449,\n  SYSCALL_Arm64_set_mempolicy_home_node = 450,\n  SYSCALL_Arm64_cachestat = 451,\n  SYSCALL_Arm64_fchmodat2 = 452,\n  SYSCALL_Arm64_map_shadow_stack = 453,\n  SYSCALL_Arm64_futex_wake = 454,\n  SYSCALL_Arm64_futex_wait = 455,\n  SYSCALL_Arm64_futex_requeue = 456,\n  SYSCALL_Arm64_statmount = 457,\n  SYSCALL_Arm64_listmount = 458,\n  SYSCALL_Arm64_lsm_get_self_attr = 459,\n  SYSCALL_Arm64_lsm_set_self_attr = 460,\n  SYSCALL_Arm64_lsm_list_modules = 461,\n  SYSCALL_Arm64_mseal = 462,\n  SYSCALL_Arm64_setxattrat = 463,\n  SYSCALL_Arm64_getxattrat = 464,\n  SYSCALL_Arm64_listxattrat = 465,\n  SYSCALL_Arm64_removexattrat = 466,\n  SYSCALL_Arm64_MAX = 512,\n\n  // Unsupported syscalls on this host\n  SYSCALL_Arm64_fork = ~0,\n  SYSCALL_Arm64_open = ~0,\n  SYSCALL_Arm64_waitpid = ~0,\n  SYSCALL_Arm64_creat = ~0,\n  SYSCALL_Arm64_link = ~0,\n  SYSCALL_Arm64_unlink = ~0,\n  SYSCALL_Arm64_time = ~0,\n  SYSCALL_Arm64_mknod = ~0,\n  SYSCALL_Arm64_chmod = ~0,\n  SYSCALL_Arm64_lchown = ~0,\n  SYSCALL_Arm64_break = ~0,\n  SYSCALL_Arm64_oldstat = ~0,\n  SYSCALL_Arm64_umount = ~0,\n  SYSCALL_Arm64_stime = ~0,\n  SYSCALL_Arm64_alarm = ~0,\n  SYSCALL_Arm64_oldfstat = ~0,\n  SYSCALL_Arm64_pause = ~0,\n  SYSCALL_Arm64_utime = ~0,\n  SYSCALL_Arm64_stty = ~0,\n  SYSCALL_Arm64_gtty = ~0,\n  SYSCALL_Arm64_access = ~0,\n  SYSCALL_Arm64_nice = ~0,\n  SYSCALL_Arm64_ftime = ~0,\n  SYSCALL_Arm64_rename = ~0,\n  SYSCALL_Arm64_mkdir = ~0,\n  SYSCALL_Arm64_rmdir = ~0,\n  SYSCALL_Arm64_pipe = ~0,\n  SYSCALL_Arm64_prof = ~0,\n  SYSCALL_Arm64_signal = ~0,\n  SYSCALL_Arm64_lock = ~0,\n  SYSCALL_Arm64_mpx = ~0,\n  SYSCALL_Arm64_ulimit = ~0,\n  SYSCALL_Arm64_oldolduname = ~0,\n  SYSCALL_Arm64_ustat = ~0,\n  SYSCALL_Arm64_dup2 = ~0,\n  SYSCALL_Arm64_getpgrp = ~0,\n  SYSCALL_Arm64_sigaction = ~0,\n  SYSCALL_Arm64_sgetmask = ~0,\n  SYSCALL_Arm64_ssetmask = ~0,\n  SYSCALL_Arm64_sigsuspend = ~0,\n  SYSCALL_Arm64_sigpending = ~0,\n  SYSCALL_Arm64_select = ~0,\n  SYSCALL_Arm64_symlink = ~0,\n  SYSCALL_Arm64_oldlstat = ~0,\n  SYSCALL_Arm64_readlink = ~0,\n  SYSCALL_Arm64_uselib = ~0,\n  SYSCALL_Arm64_readdir = ~0,\n  SYSCALL_Arm64_profil = ~0,\n  SYSCALL_Arm64_ioperm = ~0,\n  SYSCALL_Arm64_socketcall = ~0,\n  SYSCALL_Arm64_stat = ~0,\n  SYSCALL_Arm64_lstat = ~0,\n  SYSCALL_Arm64_olduname = ~0,\n  SYSCALL_Arm64_iopl = ~0,\n  SYSCALL_Arm64_idle = ~0,\n  SYSCALL_Arm64_vm86old = ~0,\n  SYSCALL_Arm64_ipc = ~0,\n  SYSCALL_Arm64_sigreturn = ~0,\n  SYSCALL_Arm64_modify_ldt = ~0,\n  SYSCALL_Arm64_sigprocmask = ~0,\n  SYSCALL_Arm64_create_module = ~0,\n  SYSCALL_Arm64_get_kernel_syms = ~0,\n  SYSCALL_Arm64_bdflush = ~0,\n  SYSCALL_Arm64_sysfs = ~0,\n  SYSCALL_Arm64_afs_syscall = ~0,\n  SYSCALL_Arm64__llseek = ~0,\n  SYSCALL_Arm64_getdents = ~0,\n  SYSCALL_Arm64__newselect = ~0,\n  SYSCALL_Arm64__sysctl = ~0,\n  SYSCALL_Arm64_vm86 = ~0,\n  SYSCALL_Arm64_query_module = ~0,\n  SYSCALL_Arm64_poll = ~0,\n  SYSCALL_Arm64_chown = ~0,\n  SYSCALL_Arm64_getpmsg = ~0,\n  SYSCALL_Arm64_putpmsg = ~0,\n  SYSCALL_Arm64_vfork = ~0,\n  SYSCALL_Arm64_ugetrlimit = ~0,\n  SYSCALL_Arm64_mmap2 = ~0,\n  SYSCALL_Arm64_truncate64 = ~0,\n  SYSCALL_Arm64_ftruncate64 = ~0,\n  SYSCALL_Arm64_stat64 = ~0,\n  SYSCALL_Arm64_lstat64 = ~0,\n  SYSCALL_Arm64_fstat64 = ~0,\n  SYSCALL_Arm64_lchown32 = ~0,\n  SYSCALL_Arm64_getuid32 = ~0,\n  SYSCALL_Arm64_getgid32 = ~0,\n  SYSCALL_Arm64_geteuid32 = ~0,\n  SYSCALL_Arm64_getegid32 = ~0,\n  SYSCALL_Arm64_setreuid32 = ~0,\n  SYSCALL_Arm64_setregid32 = ~0,\n  SYSCALL_Arm64_getgroups32 = ~0,\n  SYSCALL_Arm64_setgroups32 = ~0,\n  SYSCALL_Arm64_fchown32 = ~0,\n  SYSCALL_Arm64_setresuid32 = ~0,\n  SYSCALL_Arm64_getresuid32 = ~0,\n  SYSCALL_Arm64_setresgid32 = ~0,\n  SYSCALL_Arm64_getresgid32 = ~0,\n  SYSCALL_Arm64_chown32 = ~0,\n  SYSCALL_Arm64_setuid32 = ~0,\n  SYSCALL_Arm64_setgid32 = ~0,\n  SYSCALL_Arm64_setfsuid32 = ~0,\n  SYSCALL_Arm64_setfsgid32 = ~0,\n  SYSCALL_Arm64_fcntl64 = ~0,\n  SYSCALL_Arm64_sendfile64 = ~0,\n  SYSCALL_Arm64_set_thread_area = ~0,\n  SYSCALL_Arm64_get_thread_area = ~0,\n  SYSCALL_Arm64_epoll_create = ~0,\n  SYSCALL_Arm64_epoll_wait = ~0,\n  SYSCALL_Arm64_statfs64 = ~0,\n  SYSCALL_Arm64_fstatfs64 = ~0,\n  SYSCALL_Arm64_utimes = ~0,\n  SYSCALL_Arm64_fadvise64_64 = ~0,\n  SYSCALL_Arm64_vserver = ~0,\n  SYSCALL_Arm64_inotify_init = ~0,\n  SYSCALL_Arm64_futimesat = ~0,\n  SYSCALL_Arm64_fstatat_64 = ~0,\n  SYSCALL_Arm64_signalfd = ~0,\n  SYSCALL_Arm64_eventfd = ~0,\n  SYSCALL_Arm64_arch_prctl = ~0,\n  SYSCALL_Arm64_tuxcall = ~0,\n  SYSCALL_Arm64_security = ~0,\n  SYSCALL_Arm64_epoll_ctl_old = ~0,\n  SYSCALL_Arm64_epoll_wait_old = ~0,\n  SYSCALL_Arm64_newfstatat = ~0,\n  SYSCALL_Arm64_uretprobe = ~0,\n};\n} // namespace FEX::HLE::Arm64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/EmulatedFiles/EmulatedFiles.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|common\ndesc: Emulated /proc/cpuinfo, version, osrelease, etc\n$end_info$\n*/\n\n#include \"CodeLoader.h\"\n\n#include \"Common/CPUInfo.h\"\n#include \"Common/FDUtils.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/EmulatedFiles/EmulatedFiles.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/CPUID.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/sstream.h>\n#include <FEXHeaderUtils/Filesystem.h>\n\n#include <git_version.h>\n\n#include <cstring>\n#include <fcntl.h>\n#include <filesystem>\n#include <ostream>\n#include <stdio.h>\n#include <system_error>\n#include <unistd.h>\n#include <utility>\n\nnamespace FEX::EmulatedFile {\n/**\n * @brief Generates a temporary file using raw FDs\n *\n * Since we are hooking syscalls that are expecting to use raw FDs, we need to make sure to also use raw FDs.\n * The guest application can leave these FDs dangling.\n *\n * Using glibc tmpfile creates a FILE which glibc tracks and will try cleaning up on application exit.\n * If we are running a 32-bit application then this dangling FILE will be allocated using the FEX allcator\n * Which will have already been cleaned up on shutdown.\n *\n * Dangling raw FD is safe since if the guest doesn't close them, then the kernel cleans them up on application close.\n *\n * @return A temporary file that we can use\n */\nstatic int GenTmpFD(const char* pathname, int flags) {\n  uint32_t memfd_flags {MFD_ALLOW_SEALING};\n  if (flags & O_CLOEXEC) {\n    memfd_flags |= MFD_CLOEXEC;\n  }\n\n  return memfd_create(pathname, memfd_flags);\n}\n\n// Seal the tmpfd features by sealing them all.\n// Makes the tmpfd read-only.\nstatic void SealTmpFD(int fd) {\n  int ret = fcntl(fd, F_ADD_SEALS, F_SEAL_SEAL | F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_WRITE | F_SEAL_FUTURE_WRITE);\n  if (ret == -1) [[unlikely]] {\n    // This shouldn't ever happen, but also isn't fatal.\n    LogMan::Msg::EFmt(\"Couldn't seal tmpfd! {}\", errno);\n  }\n}\n\nfextl::string GenerateCPUInfo(FEXCore::Context::Context* ctx, uint32_t CPUCores) {\n  fextl::ostringstream cpu_stream {};\n  auto res_0 = ctx->RunCPUIDFunction(0, 0);\n  auto res_1 = ctx->RunCPUIDFunction(1, 0);\n  auto res_6 = ctx->RunCPUIDFunction(6, 0);\n  auto res_7 = ctx->RunCPUIDFunction(7, 0);\n  auto res_7_1 = ctx->RunCPUIDFunction(7, 1);\n  auto res_d_1 = ctx->RunCPUIDFunction(0xD, 1);\n  auto res_10 = ctx->RunCPUIDFunction(0x10, 0);\n\n  auto res_8000_0001 = ctx->RunCPUIDFunction(0x8000'0001, 0);\n  auto res_8000_0007 = ctx->RunCPUIDFunction(0x8000'0007, 0);\n  auto res_8000_0008 = ctx->RunCPUIDFunction(0x8000'0008, 0);\n  auto res_8000_000a = ctx->RunCPUIDFunction(0x8000'000a, 0);\n  auto res_8000_001f = ctx->RunCPUIDFunction(0x8000'001f, 0);\n\n  union VendorID {\n    struct {\n      uint32_t id;\n      char Str[13];\n    };\n    struct {\n      FEXCore::CPUID::FunctionResults cpuid;\n      uint8_t null;\n    };\n  };\n\n  union ModelName {\n    struct {\n      char Str[49];\n    };\n    struct {\n      FEXCore::CPUID::FunctionResults cpuid_2;\n      FEXCore::CPUID::FunctionResults cpuid_3;\n      FEXCore::CPUID::FunctionResults cpuid_4;\n      uint8_t null;\n    };\n  };\n\n  union Info {\n    FEXCore::CPUID::FunctionResults cpuid;\n    struct {\n      unsigned Stepping   : 4;\n      unsigned Model      : 4;\n      unsigned FamilyID   : 4;\n      unsigned Type       : 4;\n      unsigned ExModelID  : 4;\n      unsigned ExFamilyID : 8;\n      unsigned            : 4;\n    };\n  };\n\n  VendorID vendorid {};\n  vendorid.cpuid = {res_0.eax, res_0.ebx, res_0.edx, res_0.ecx};\n  vendorid.null = 0;\n\n  Info info {res_1};\n\n  uint32_t Family = info.FamilyID + (info.FamilyID == 0xF ? info.ExFamilyID : 0);\n  fextl::ostringstream flags_data {};\n  // Generate the flags data up front\n  // This is the same per core\n  {\n    auto add_flag_if = [&flags_data](bool flag, const char* name) {\n      if (flag) {\n        flags_data << name << \" \";\n      }\n    };\n\n    add_flag_if(res_1.edx & (1 << 0), \"fpu\");\n    add_flag_if(res_1.edx & (1 << 1), \"vme\");\n    add_flag_if(res_1.edx & (1 << 2), \"de\");\n    add_flag_if(res_1.edx & (1 << 3), \"pse\");\n    add_flag_if(res_1.edx & (1 << 4), \"tsc\");\n    add_flag_if(res_1.edx & (1 << 5), \"msr\");\n    add_flag_if(res_1.edx & (1 << 6), \"pae\");\n    add_flag_if(res_1.edx & (1 << 7), \"mce\");\n    add_flag_if(res_1.edx & (1 << 8), \"cx8\");\n    add_flag_if(res_1.edx & (1 << 9), \"apic\");\n    add_flag_if(res_1.edx & (1 << 11), \"sep\");\n    add_flag_if(res_1.edx & (1 << 12), \"mtrr\");\n    add_flag_if(res_1.edx & (1 << 13), \"pge\");\n    add_flag_if(res_1.edx & (1 << 14), \"mca\");\n    add_flag_if(res_1.edx & (1 << 15), \"cmov\");\n    add_flag_if(res_1.edx & (1 << 16), \"pat\");\n    add_flag_if(res_1.edx & (1 << 17), \"pse36\");\n    add_flag_if(res_1.edx & (1 << 18), \"pn\");\n    add_flag_if(res_1.edx & (1 << 19), \"clflush\");\n    add_flag_if(res_1.edx & (1 << 21), \"ds\");   // XXX\n    add_flag_if(res_1.edx & (1 << 22), \"acpi\"); // XXX\n    add_flag_if(res_1.edx & (1 << 23), \"mmx\");\n    add_flag_if(res_1.edx & (1 << 24), \"fxsr\");\n    add_flag_if(res_1.edx & (1 << 25), \"sse\");\n    add_flag_if(res_1.edx & (1 << 26), \"sse2\");\n    add_flag_if(res_1.edx & (1 << 27), \"ss\");\n    add_flag_if(res_1.edx & (1 << 28), \"ht\");\n    add_flag_if(res_1.edx & (1 << 29), \"tm\");\n    add_flag_if(res_1.edx & (1 << 30), \"ia64\");\n    add_flag_if(res_1.edx & (1 << 31), \"pbe\");\n\n    add_flag_if(res_8000_0001.edx & (1 << 11), \"syscall\");\n    add_flag_if(res_8000_0001.edx & (1 << 19), \"mp\");\n    add_flag_if(res_8000_0001.edx & (1 << 20), \"nx\");\n    add_flag_if(res_8000_0001.edx & (1 << 22), \"mmxext\");\n    add_flag_if(res_8000_0001.edx & (1 << 25), \"fxsr_opt\");\n    add_flag_if(res_8000_0001.edx & (1 << 26), \"pdpe1gb\");\n    add_flag_if(res_8000_0001.edx & (1 << 27), \"rdtscp\");\n    add_flag_if(res_8000_0001.edx & (1 << 29), \"lm\");\n    add_flag_if(res_8000_0001.edx & (1 << 31), \"3dnow\");\n    add_flag_if(res_8000_0001.edx & (1 << 30), \"3dnowext\");\n\n    add_flag_if(res_8000_0007.edx & (1 << 8), \"constant_tsc\");\n\n    // We are not a uniprocessor running in SMP mode\n    add_flag_if(false, \"up\");\n    // Timer is always running\n    add_flag_if(true, \"art\");\n    // No Intel perfmon\n    add_flag_if(false, \"arch_perfmon\");\n    // No precise event based sampling\n    add_flag_if(false, \"pebs\");\n    // No branch trace store\n    add_flag_if(false, \"bts\");\n\n    add_flag_if(true, \"rep_good\");\n    add_flag_if(res_8000_0007.edx & (1 << 12), \"tm\");\n\n    // Always support long nop\n    add_flag_if(true, \"nopl\");\n\n    // Always expose topology information\n    add_flag_if(true, \"xtoplogy\");\n\n    // Atom/geode only?\n    add_flag_if(false, \"tsc_reliable\");\n    add_flag_if(res_8000_0007.edx & (1 << 8), \"nonstop_tsc\");\n\n    // We always support CPUID\n    add_flag_if(true, \"cpuid\");\n    add_flag_if(Family > 0x16, \"extd_apicid\");\n    add_flag_if(false, \"amd_dcm\"); // Never claim to be a multi node processor\n    add_flag_if(res_8000_0007.edx & (1 << 11), \"aperfmperf\");\n\n    // Need to check ARM documentation if we can support this?\n    add_flag_if(false, \"nonstop_tsc_s3\");\n\n    // We can calculate this flag on AArch64\n    add_flag_if(true, \"tsc_known_freq\");\n\n    add_flag_if(res_1.ecx & (1 << 0), \"pni\");\n    add_flag_if(res_1.ecx & (1 << 1), \"pclmulqdq\");\n    add_flag_if(res_1.ecx & (1 << 2), \"dtes64\");\n    add_flag_if(res_1.ecx & (1 << 3), \"monitor\");\n    add_flag_if(res_1.ecx & (1 << 4), \"ds_cpl\");\n    add_flag_if(res_1.ecx & (1 << 5), \"vmx\");\n    add_flag_if(res_1.ecx & (1 << 6), \"smx\");\n    add_flag_if(res_1.ecx & (1 << 7), \"est\");\n    add_flag_if(res_1.ecx & (1 << 8), \"tm2\");\n    add_flag_if(res_1.ecx & (1 << 9), \"ssse3\");\n    add_flag_if(res_1.ecx & (1 << 10), \"cid\");\n    add_flag_if(res_1.ecx & (1 << 11), \"sdbg\");\n    add_flag_if(res_1.ecx & (1 << 12), \"fma\");\n    add_flag_if(res_1.ecx & (1 << 13), \"cx16\");\n    add_flag_if(res_1.ecx & (1 << 14), \"xptr\");\n    add_flag_if(res_1.ecx & (1 << 15), \"pdcm\");\n    add_flag_if(res_1.ecx & (1 << 17), \"pcid\");\n    add_flag_if(res_1.ecx & (1 << 18), \"dca\");\n    add_flag_if(res_1.ecx & (1 << 19), \"sse4_1\");\n    add_flag_if(res_1.ecx & (1 << 20), \"sse4_2\");\n    add_flag_if(res_1.ecx & (1 << 21), \"x2apic\");\n    add_flag_if(res_1.ecx & (1 << 22), \"movbe\");\n    add_flag_if(res_1.ecx & (1 << 23), \"popcnt\");\n    add_flag_if(res_1.ecx & (1 << 24), \"tsc_deadline_timer\");\n    add_flag_if(res_1.ecx & (1 << 25), \"aes\");\n    add_flag_if(res_1.ecx & (1 << 26), \"xsave\");\n    add_flag_if(res_1.ecx & (1 << 27), \"oxsave\");\n    add_flag_if(res_1.ecx & (1 << 28), \"avx\");\n    add_flag_if(res_1.ecx & (1 << 29), \"f16c\");\n    add_flag_if(res_1.ecx & (1 << 30), \"rdrand\");\n    add_flag_if(res_1.ecx & (1 << 31), \"hypervisor\");\n\n    add_flag_if(res_8000_0001.ecx & (1 << 0), \"lahf_lm\");\n    add_flag_if(res_8000_0001.ecx & (1 << 1), \"cmp_legacy\");\n    add_flag_if(res_8000_0001.ecx & (1 << 2), \"svm\");\n    add_flag_if(res_8000_0001.ecx & (1 << 3), \"extapic\");\n    add_flag_if(res_8000_0001.ecx & (1 << 4), \"cr8_legacy\");\n    add_flag_if(res_8000_0001.ecx & (1 << 5), \"abm\");\n    add_flag_if(res_8000_0001.ecx & (1 << 6), \"sse4a\");\n    add_flag_if(res_8000_0001.ecx & (1 << 7), \"misalignsse\");\n    add_flag_if(res_8000_0001.ecx & (1 << 8), \"3dnowprefetch\");\n    add_flag_if(res_8000_0001.ecx & (1 << 9), \"osvw\");\n    add_flag_if(res_8000_0001.ecx & (1 << 10), \"ibs\");\n    add_flag_if(res_8000_0001.ecx & (1 << 11), \"xop\");\n    add_flag_if(res_8000_0001.ecx & (1 << 12), \"skinit\");\n    add_flag_if(res_8000_0001.ecx & (1 << 13), \"wdt\");\n    add_flag_if(res_8000_0001.ecx & (1 << 15), \"lwp\");\n    add_flag_if(res_8000_0001.ecx & (1 << 16), \"fma4\");\n    add_flag_if(res_8000_0001.ecx & (1 << 17), \"tce\");\n    add_flag_if(res_8000_0001.ecx & (1 << 19), \"nodeid_msr\");\n    add_flag_if(res_8000_0001.ecx & (1 << 21), \"tbm\");\n    add_flag_if(res_8000_0001.ecx & (1 << 22), \"topoext\");\n    add_flag_if(res_8000_0001.ecx & (1 << 23), \"perfctr_core\");\n    add_flag_if(res_8000_0001.ecx & (1 << 24), \"perfctr_nb\");\n    add_flag_if(res_8000_0001.ecx & (1 << 26), \"bpext\");\n    add_flag_if(res_8000_0001.ecx & (1 << 27), \"ptsc\");\n    add_flag_if(res_8000_0001.ecx & (1 << 28), \"perfctr_llc\");\n    add_flag_if(res_8000_0001.ecx & (1 << 29), \"mwaitx\");\n\n    // We don't support ring 3 supporting mwait\n    add_flag_if(false, \"ring3mwait\");\n    // We don't support Intel CPUID fault support\n    add_flag_if(false, \"cpuid_fault\");\n    add_flag_if(res_8000_0007.edx & (1 << 9), \"cpb\");\n    add_flag_if(res_6.ecx & (1 << 3), \"epb\");\n    add_flag_if(res_10.ebx & (1 << 1), \"cat_l3\");\n    add_flag_if(res_10.ebx & (1 << 2), \"cat_l2\");\n    add_flag_if(false, \"invpcid_single\");\n    add_flag_if(res_8000_0007.edx & (1 << 7), \"hw_pstate\");\n    add_flag_if(res_8000_001f.eax & (1 << 0), \"sme\");\n\n    // Kernel page table isolation.\n    add_flag_if(false, \"pti\");\n\n    // We don't support Intel's Protected Processor Inventory Number\n    add_flag_if(false, \"intel_ppin\");\n\n    add_flag_if(res_8000_0008.ebx & (1 << 6), \"mba\");\n    add_flag_if(res_8000_001f.eax & (1 << 1), \"sev\");\n\n    { // Speculative bug workarounds\n      // We don't claim to have these bugs, so we don't need to claim these flags\n      add_flag_if(res_7.edx & (1 << 31), \"ssbd\");\n      add_flag_if(false, \"ibrs\");\n      add_flag_if(false, \"ibpb\");\n\n      add_flag_if(res_7.edx & (1 << 27), \"stibp\");\n\n      add_flag_if(false, \"ibrs_enhanced\");\n    }\n\n    // We don't support Intel's TPR Shadow feature\n    add_flag_if(false, \"tpr_shadow\");\n    // Intel virtual NMI\n    add_flag_if(false, \"vnmi\");\n    // Intel FlexPriority\n    add_flag_if(false, \"flexpriority\");\n    // Intel Extended page table\n    add_flag_if(false, \"ept\");\n    // Intel virtual processor ID\n    add_flag_if(false, \"vpid\");\n\n    // Prefer VMMCall to VMCall\n    add_flag_if(false, \"vmmcall\");\n    // Intel extended page table access dirty bit\n    add_flag_if(false, \"ept_ad\");\n    add_flag_if(res_7.ebx & (1 << 0), \"fsgsbase\");\n    add_flag_if(res_7.ebx & (1 << 1), \"tsc_adjust\");\n    add_flag_if(res_7.ebx & (1 << 2), \"sgx\");\n    add_flag_if(res_7.ebx & (1 << 3), \"bmi1\");\n    add_flag_if(res_7.ebx & (1 << 4), \"hle\");\n    add_flag_if(res_7.ebx & (1 << 5), \"avx2\");\n    add_flag_if(res_7.ebx & (1 << 6), \"fdp_excptn_only\");\n    add_flag_if(res_7.ebx & (1 << 7), \"smep\");\n    add_flag_if(res_7.ebx & (1 << 8), \"bmi2\");\n    add_flag_if(res_7.ebx & (1 << 9), \"erms\");\n    add_flag_if(res_7.ebx & (1 << 10), \"invpcid\");\n    add_flag_if(res_7.ebx & (1 << 11), \"rtm\");\n    add_flag_if(res_7.ebx & (1 << 12), \"rdt_m\");\n    add_flag_if(res_7.ebx & (1 << 13), \"depc_fpu_cs_ds\");\n    add_flag_if(res_7.ebx & (1 << 14), \"mpx\");\n    add_flag_if(res_7.ebx & (1 << 15), \"rdt_a\");\n    add_flag_if(res_7.ebx & (1 << 16), \"avx512f\");\n    add_flag_if(res_7.ebx & (1 << 17), \"avx512dq\");\n    add_flag_if(res_7.ebx & (1 << 18), \"rdseed\");\n    add_flag_if(res_7.ebx & (1 << 19), \"adx\");\n    add_flag_if(res_7.ebx & (1 << 20), \"smap\");\n    add_flag_if(res_7.ebx & (1 << 21), \"avx512ifma\");\n    add_flag_if(res_7.ebx & (1 << 23), \"clflushopt\");\n    add_flag_if(res_7.ebx & (1 << 24), \"clwb\");\n    add_flag_if(res_7.ebx & (1 << 25), \"intel_pt\");\n    add_flag_if(res_7.ebx & (1 << 26), \"avx512pf\");\n    add_flag_if(res_7.ebx & (1 << 27), \"avx512er\");\n    add_flag_if(res_7.ebx & (1 << 28), \"avx512cd\");\n    add_flag_if(res_7.ebx & (1 << 29), \"sha_ni\");\n    add_flag_if(res_7.ebx & (1 << 30), \"avx512bw\");\n    add_flag_if(res_7.ebx & (1 << 31), \"avx512vl\");\n    add_flag_if(res_d_1.eax & (1 << 0), \"xsaveopt\");\n    add_flag_if(res_d_1.eax & (1 << 1), \"xsavec\");\n    add_flag_if(res_d_1.eax & (1 << 2), \"xgetbv1\");\n    add_flag_if(res_d_1.eax & (1 << 3), \"xsaves\");\n    add_flag_if(res_d_1.eax & (1 << 4), \"xfd\");\n\n    add_flag_if(res_7_1.eax & (1 << 5), \"avx512_bf16\");\n    add_flag_if(res_8000_0008.ebx & (1 << 0), \"clzero\");\n    add_flag_if(res_8000_0008.ebx & (1 << 1), \"irperf\");\n    add_flag_if(res_8000_0008.ebx & (1 << 2), \"xsaveerptr\");\n\n    // Intel digital thermal sensor\n    add_flag_if(false, \"dtherm\");\n    // Intel turbo boost\n    add_flag_if(false, \"ida\");\n    add_flag_if(res_6.eax & (1 << 2), \"arat\");\n    // Power limit notification controls\n    add_flag_if(false, \"pln\");\n    // Intel package thermal status\n    add_flag_if(false, \"pts\");\n\n    // Intel Hardware P-state features\n    add_flag_if(false, \"hwp\");\n    add_flag_if(false, \"hwp_notify\");\n    add_flag_if(false, \"hwp_act_window\");\n    add_flag_if(false, \"hwp_epp\");\n    add_flag_if(false, \"hwp_pkg_req\");\n\n    add_flag_if(res_8000_000a.ebx & (1 << 0), \"npt\");\n    add_flag_if(res_8000_000a.ebx & (1 << 1), \"lbrv\");\n    add_flag_if(res_8000_000a.ebx & (1 << 2), \"svm_lock\");\n    add_flag_if(res_8000_000a.ebx & (1 << 3), \"nrip_save\");\n    add_flag_if(res_8000_000a.ebx & (1 << 4), \"tsc_scale\");\n    add_flag_if(res_8000_000a.ebx & (1 << 5), \"vmcb_clean\");\n    add_flag_if(res_8000_000a.ebx & (1 << 6), \"flushbyasid\");\n    add_flag_if(res_8000_000a.ebx & (1 << 7), \"decodeassists\");\n    add_flag_if(res_8000_000a.ebx & (1 << 10), \"pausefilter\");\n    add_flag_if(res_8000_000a.ebx & (1 << 12), \"pfthreshold\");\n    add_flag_if(res_8000_000a.ebx & (1 << 13), \"avic\");\n    add_flag_if(res_8000_000a.ebx & (1 << 15), \"v_vmsave_vmload\");\n    add_flag_if(res_8000_000a.ebx & (1 << 16), \"vgif\");\n\n    add_flag_if(res_7.ecx & (1 << 1), \"avx512vbmi\");\n    add_flag_if(res_7.ecx & (1 << 2), \"umip\");\n    add_flag_if(res_7.ecx & (1 << 3), \"pku\");\n    add_flag_if(res_7.ecx & (1 << 4), \"ospke\");\n    add_flag_if(res_7.ecx & (1 << 5), \"waitpkg\");\n    add_flag_if(res_7.ecx & (1 << 6), \"avx512_vbmi2\");\n    add_flag_if(res_7.ecx & (1 << 8), \"gfni\");\n    add_flag_if(res_7.ecx & (1 << 9), \"vaes\");\n    add_flag_if(res_7.ecx & (1 << 10), \"vpclmulqdq\");\n    add_flag_if(res_7.ecx & (1 << 11), \"avx512_vnni\");\n    add_flag_if(res_7.ecx & (1 << 12), \"avx512_bitalg\");\n    add_flag_if(res_7.ecx & (1 << 13), \"tme\");\n    add_flag_if(res_7.ecx & (1 << 14), \"avx512_vpopcntdq\");\n    add_flag_if(res_7.ecx & (1 << 16), \"la57\");\n    add_flag_if(res_7.ecx & (1 << 22), \"rdpid\");\n    add_flag_if(res_7.ecx & (1 << 24), \"bus_lock_detect\");\n    add_flag_if(res_7.ecx & (1 << 25), \"cldemote\");\n    add_flag_if(res_7.ecx & (1 << 27), \"movdiri\");\n    add_flag_if(res_7.ecx & (1 << 28), \"movdir64b\");\n    add_flag_if(res_7.ecx & (1 << 29), \"enqcmd\");\n    add_flag_if(res_7.ecx & (1 << 30), \"sqx_lc\");\n\n    add_flag_if(res_8000_0007.ebx & (1 << 0), \"overflow_recov\");\n    add_flag_if(res_8000_0007.ebx & (1 << 1), \"succor\");\n    add_flag_if(res_8000_0007.ebx & (1 << 3), \"smca\");\n\n    add_flag_if(res_7.edx & (1 << 2), \"avx512_4vnniw\");\n    add_flag_if(res_7.edx & (1 << 3), \"avx512_4fmaps\");\n    add_flag_if(res_7.edx & (1 << 4), \"fsrm\");\n    add_flag_if(res_7.edx & (1 << 8), \"avx512_vp2intersect\");\n    add_flag_if(res_7.edx & (1 << 10), \"md_clear\");\n    add_flag_if(res_7.edx & (1 << 14), \"serialize\");\n    add_flag_if(res_7.edx & (1 << 18), \"pconfig\");\n    add_flag_if(res_7.edx & (1 << 19), \"arch_lbr\");\n    add_flag_if(res_7.edx & (1 << 20), \"ibt\");\n    add_flag_if(res_7.edx & (1 << 22), \"amx_bf16\");\n    add_flag_if(res_7.edx & (1 << 23), \"avx512_fp16\");\n    add_flag_if(res_7.edx & (1 << 24), \"amx_tile\");\n    add_flag_if(res_7.edx & (1 << 25), \"amx_int8\");\n    add_flag_if(res_7.edx & (1 << 28), \"flush_l1d\");\n    add_flag_if(res_7.edx & (1 << 29), \"arch_capabilities\");\n  }\n\n  // Get the cycle counter frequency from CPUID function 15h.\n  auto res_15 = ctx->RunCPUIDFunction(0x15, 0);\n  // Frequency is calculated in Hz, we need to convert it to megahertz since FEX is guaranteed to return >= 1Ghz.\n  // x86 Bogomips is calculated as an equation based on the clock speed of the CPU (Or TSC) divided by 500k jiffies.\n  // A `jiffie` is an internal metric for the kernel's `HZ` frequency which is usually between 100 and 1000.\n  // Userspace can't query this HZ config option, so assume 1000Hz since that's common.\n  // This gives a 1Ghz ARMv9.2 CPU a Bogomips of 2Ghz.\n  constexpr double HzInMhz = 1000000.0;\n  constexpr double HzInKhz = 1000.0;\n  constexpr double BogomipsJiffyPrecision = 1'000.0;\n  constexpr double BogoMipsDivisor = 500'000.0 / BogomipsJiffyPrecision;\n\n  const double Frequency = 1.0 / (static_cast<double>(res_15.eax) / (static_cast<double>(res_15.ebx) * static_cast<double>(res_15.ecx)));\n  const double FrequencyMhz = Frequency / HzInMhz;\n  const double FrequencyKhz = Frequency / HzInKhz;\n  const double Bogomips = FrequencyKhz / BogoMipsDivisor;\n  // Generate the cycle counter frequency string in the format expected by cpuinfo.\n  // ex: `4000.000`\n  const auto FrequencyString = fextl::fmt::format(\"{:.3f}\", FrequencyMhz);\n  const auto BogomipsString = fextl::fmt::format(\"{:.2f}\", Bogomips);\n\n  for (int i = 0; i < CPUCores; ++i) {\n    cpu_stream << \"processor\\t: \" << i << std::endl; // Logical id\n    cpu_stream << \"vendor_id\\t: \" << vendorid.Str << std::endl;\n    cpu_stream << \"cpu family\\t: \" << Family << std::endl;\n    cpu_stream << \"model\\t\\t: \" << (info.Model + (info.FamilyID >= 6 ? (info.ExModelID << 4) : 0)) << std::endl;\n    ModelName modelname {};\n    auto res_8000_0002 = ctx->RunCPUIDFunctionName(0x8000'0002, 0, i);\n    auto res_8000_0003 = ctx->RunCPUIDFunctionName(0x8000'0003, 0, i);\n    auto res_8000_0004 = ctx->RunCPUIDFunctionName(0x8000'0004, 0, i);\n    modelname.cpuid_2 = res_8000_0002;\n    modelname.cpuid_3 = res_8000_0003;\n    modelname.cpuid_4 = res_8000_0004;\n    modelname.null = 0;\n\n    cpu_stream << \"model name\\t: \" << modelname.Str << std::endl;\n    cpu_stream << \"stepping\\t: \" << info.Stepping << std::endl;\n    cpu_stream << \"microcode\\t: 0x0\" << std::endl;\n    cpu_stream << \"cpu MHz\\t\\t: \" << FrequencyString << std::endl;\n    cpu_stream << \"cache size\\t: 512 KB\" << std::endl;\n    cpu_stream << \"physical id\\t: 0\" << std::endl;          // Socket id (always 0 for a single socket system)\n    cpu_stream << \"siblings\\t: \" << CPUCores << std::endl;  // Number of logical cores\n    cpu_stream << \"core id\\t\\t: \" << i << std::endl;        // Physical id\n    cpu_stream << \"cpu cores\\t: \" << CPUCores << std::endl; // Number of physical cores\n    cpu_stream << \"apicid\\t\\t: \" << i << std::endl;\n    cpu_stream << \"initial apicid\\t: \" << i << std::endl;\n    cpu_stream << \"fpu\\t\\t: \" << (res_1.edx & (1 << 0) ? \"yes\" : \"no\") << std::endl;\n    cpu_stream << \"fpu_exception\\t: \" << (res_1.edx & (1 << 0) ? \"yes\" : \"no\") << std::endl;\n    cpu_stream << \"cpuid level\\t: \" << vendorid.id << std::endl;\n    cpu_stream << \"wp\\t\\t: yes\" << std::endl;\n    cpu_stream << \"flags\\t\\t: \" << flags_data.str() << std::endl;\n\n    // We don't have any bugs, don't question it\n    cpu_stream << \"bugs\\t\\t: \" << std::endl;\n    cpu_stream << \"bogomips\\t: \" << BogomipsString << std::endl;\n    // These next four aren't necessarily correct\n    cpu_stream << \"TLB size\\t: 2560 4K pages\" << std::endl;\n    cpu_stream << \"clflush size\\t: 64\" << std::endl;\n    cpu_stream << \"cache_alignment\\t : 64\" << std::endl;\n\n    // Cortex-A is 40 or 44 bits physical, and 48/52 virtual\n    // Choose the lesser configuration\n    cpu_stream << \"address sizes\\t: 40 bits physical, 48 bits virtual\" << std::endl;\n\n    // No power management but required to report\n    cpu_stream << \"power management: \" << std::endl;\n\n    cpu_stream << std::endl;\n  }\n\n  return cpu_stream.str();\n}\n\nEmulatedFDManager::EmulatedFDManager(FEXCore::Context::Context* ctx)\n  : CTX {ctx}\n  , ThreadsConfig {FEX::CPUInfo::CalculateNumberOfCPUs()} {\n  FDReadCreators[\"/proc/cpuinfo\"] = [&](FEXCore::Context::Context* ctx, int32_t fd, const char* pathname, int32_t flags, mode_t mode) -> int32_t {\n    // Only allow a single thread to initialize the cpu_info.\n    // Jit in-case multiple threads try to initialize at once.\n    // Check if deferred cpuinfo initialization has occured.\n    std::call_once(cpu_info_initialized, [&]() { cpu_info = GenerateCPUInfo(ctx, ThreadsConfig); });\n\n    int FD = GenTmpFD(pathname, flags);\n    write(FD, cpu_info.data(), cpu_info.size());\n    lseek(FD, 0, SEEK_SET);\n    SealTmpFD(FD);\n    return FD;\n  };\n\n  FDReadCreators[\"/proc/sys/kernel/osrelease\"] = [&](FEXCore::Context::Context* ctx, int32_t fd, const char* pathname, int32_t flags,\n                                                     mode_t mode) -> int32_t {\n    int FD = GenTmpFD(pathname, flags);\n    uint32_t GuestVersion = FEX::HLE::_SyscallHandler->GetGuestKernelVersion();\n    char Tmp[64] {};\n    snprintf(Tmp, sizeof(Tmp), \"%d.%d.%d\\n\", FEX::HLE::SyscallHandler::KernelMajor(GuestVersion),\n             FEX::HLE::SyscallHandler::KernelMinor(GuestVersion), FEX::HLE::SyscallHandler::KernelPatch(GuestVersion));\n    // + 1 to ensure null at the end\n    write(FD, Tmp, strlen(Tmp) + 1);\n    lseek(FD, 0, SEEK_SET);\n    SealTmpFD(FD);\n    return FD;\n  };\n\n  FDReadCreators[\"/proc/version\"] = [&](FEXCore::Context::Context* ctx, int32_t fd, const char* pathname, int32_t flags, mode_t mode) -> int32_t {\n    int FD = GenTmpFD(pathname, flags);\n    // UTS version NEEDS to be in a format that can pass to `date -d`\n    // Format of this is Linux version <Release> (<Compile By>@<Compile Host>) (<Linux Compiler>) #<version> {SMP, PREEMPT, PREEMPT_RT} <UTS version>\\n\"\n    const char kernel_version[] = \"Linux version %d.%d.%d (FEX@FEX) (clang) #\" GIT_DESCRIBE_STRING \" SMP \" __DATE__ \" \" __TIME__ \"\\n\";\n    uint32_t GuestVersion = FEX::HLE::_SyscallHandler->GetGuestKernelVersion();\n    char Tmp[sizeof(kernel_version) + 64] {};\n    snprintf(Tmp, sizeof(Tmp), kernel_version, FEX::HLE::SyscallHandler::KernelMajor(GuestVersion),\n             FEX::HLE::SyscallHandler::KernelMinor(GuestVersion), FEX::HLE::SyscallHandler::KernelPatch(GuestVersion));\n    // + 1 to ensure null at the end\n    write(FD, Tmp, strlen(Tmp) + 1);\n    lseek(FD, 0, SEEK_SET);\n    SealTmpFD(FD);\n    return FD;\n  };\n\n  // Wine reads this to ensure TSC is trusted by the kernel. Otherwise it falls back to maximum clock speed of the CPU cores.\n  // Without this, games like Horizon Zero Dawn would run their physics in slow-motion.\n  FDReadCreators[\"/sys/devices/system/clocksource/clocksource0/current_clocksource\"] =\n    [&](FEXCore::Context::Context* ctx, int32_t fd, const char* pathname, int32_t flags, mode_t mode) -> int32_t {\n    int FD = GenTmpFD(pathname, flags);\n    const char source[] = \"tsc\\n\";\n    // + 1 to ensure null at the end\n    write(FD, source, strlen(source) + 1);\n    lseek(FD, 0, SEEK_SET);\n    SealTmpFD(FD);\n    return FD;\n  };\n\n  auto NumCPUCores = [&](FEXCore::Context::Context* ctx, int32_t fd, const char* pathname, int32_t flags, mode_t mode) -> int32_t {\n    int FD = GenTmpFD(pathname, flags);\n    write(FD, cpus_online.data(), cpus_online.size());\n    lseek(FD, 0, SEEK_SET);\n    SealTmpFD(FD);\n    return FD;\n  };\n\n  FDReadCreators[\"/sys/devices/system/cpu/online\"] = NumCPUCores;\n  FDReadCreators[\"/sys/devices/system/cpu/present\"] = NumCPUCores;\n\n  fextl::string procAuxv = fextl::fmt::format(\"/proc/{}/auxv\", getpid());\n\n  FDReadCreators[procAuxv] = &EmulatedFDManager::ProcAuxv;\n  FDReadCreators[\"/proc/self/auxv\"] = &EmulatedFDManager::ProcAuxv;\n\n  if (ThreadsConfig > 1) {\n    cpus_online = fextl::fmt::format(\"0-{}\", ThreadsConfig - 1);\n  } else {\n    cpus_online = \"0\";\n  }\n}\n\nEmulatedFDManager::~EmulatedFDManager() {}\n\nint32_t EmulatedFDManager::Open(const char* pathname, int flags, uint32_t mode) {\n  auto Creator = FDReadCreators.end();\n  if (pathname) {\n    Creator = FDReadCreators.find(pathname);\n  }\n\n  if (Creator == FDReadCreators.end()) {\n    return -1;\n  }\n\n  return Creator->second(CTX, AT_FDCWD, pathname, flags, mode);\n}\n\nint32_t EmulatedFDManager::ProcAuxv(FEXCore::Context::Context* ctx, int32_t fd, const char* pathname, int32_t flags, mode_t mode) {\n  const auto [auxvBase, auxvSize] = FEX::HLE::_SyscallHandler->GetCodeLoader()->GetAuxv();\n  if (auxvBase == 0) {\n    LogMan::Msg::DFmt(\"Failed to get Auxv stack address\");\n    return -1;\n  }\n\n  int FD = GenTmpFD(pathname, flags);\n  write(FD, (void*)auxvBase, auxvSize);\n  lseek(FD, 0, SEEK_SET);\n  SealTmpFD(FD);\n  return FD;\n}\n} // namespace FEX::EmulatedFile\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/EmulatedFiles/EmulatedFiles.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|common\n$end_info$\n*/\n\n#pragma once\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/fextl/unordered_map.h>\n#include <FEXCore/fextl/string.h>\n\n#include <cstdint>\n#include <functional>\n#include <sys/types.h>\n\nnamespace FEXCore::Context {\nclass Context;\n}\n\nnamespace FEX::EmulatedFile {\nclass EmulatedFDManager {\npublic:\n  EmulatedFDManager(FEXCore::Context::Context* ctx);\n  ~EmulatedFDManager();\n  int32_t Open(const char* pathname, int flags, uint32_t mode);\n\nprivate:\n  FEXCore::Context::Context* CTX;\n  fextl::string cpus_online {};\n  std::once_flag cpu_info_initialized {};\n  fextl::string cpu_info {};\n  using FDReadStringFunc = std::function<int32_t(FEXCore::Context::Context* ctx, int32_t fd, const char* pathname, int32_t flags, mode_t mode)>;\n  fextl::unordered_map<fextl::string, FDReadStringFunc> FDReadCreators;\n\n  static int32_t ProcAuxv(FEXCore::Context::Context* ctx, int32_t fd, const char* pathname, int32_t flags, mode_t mode);\n  const uint32_t ThreadsConfig;\n};\n} // namespace FEX::EmulatedFile\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/FaultSafeUserMemAccess.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"LinuxSyscalls/Syscalls.h\"\n\nnamespace FEX::HLE::FaultSafeUserMemAccess {\n#ifdef ARCHITECTURE_arm64\n__attribute__((naked)) size_t CopyFromUser(void* Dest, const void* Src, size_t Size) {\n  __asm volatile(R\"(\n  // Early exit if a memcpy of size zero.\n  cbz x2, 2f;\n\n  1:\n  .globl CopyFromUser_FaultInst\n  CopyFromUser_FaultInst:\n    ldrb w3, [x1], 1; // <- This line can fault.\n    strb w3, [x0], 1;\n    sub x2, x2, 1;\n    cbnz x2, 1b;\n2:\n    mov x0, 0;\n    ret;\n  )\" ::\n                   : \"memory\");\n}\n\n__attribute__((naked)) size_t CopyToUser(void* Dest, const void* Src, size_t Size) {\n  __asm volatile(R\"(\n  // Early exit if a memcpy of size zero.\n  cbz x2, 2f;\n\n  1:\n    ldrb w3, [x1], 1;\n  .globl CopyToUser_FaultInst\n  CopyToUser_FaultInst:\n    strb w3, [x0], 1; // <- This line can fault.\n    sub x2, x2, 1;\n    cbnz x2, 1b;\n2:\n    mov x0, 0;\n    ret;\n  )\" ::\n                   : \"memory\");\n}\n\nextern \"C\" uint64_t CopyFromUser_FaultInst;\nvoid* const CopyFromUser_FaultLocation = &CopyFromUser_FaultInst;\n\nextern \"C\" uint64_t CopyToUser_FaultInst;\nvoid* const CopyToUser_FaultLocation = &CopyToUser_FaultInst;\n\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED && defined(ARCHITECTURE_arm64)\n__attribute__((naked)) bool VerifyIsReadableImpl(const void* Src, size_t Size) {\n  __asm volatile(R\"(\n  // Early exit if size is zero.\n  cbz x1, 2f;\n\n  1:\n  .globl UserReadable_FaultInst\n  UserReadable_FaultInst:\n  ldrb wzr, [x0], 1; // <- This line can fault.\n  sub x1, x1, 1;\n  cbnz x1, 1b;\n\n  2:\n  mov x0, 1;\n  ret;\n  )\" ::\n                   : \"memory\");\n}\n\n__attribute__((naked)) bool VerifyIsOnlyWritable(void* Src, size_t Size) {\n  __asm volatile(R\"(\n  // Early exit if size is zero.\n  cbz x1, 2f;\n\n  1:\n  ldrb w2, [x0];\n  .globl UserWritable_FaultInst\n  UserWritable_FaultInst:\n  strb w2, [x0], 1; // <- This line can fault.\n\n  sub x1, x1, 1;\n  cbnz x1, 1b;\n\n  2:\n  mov x0, 1;\n  ret;\n  )\" ::\n                   : \"memory\");\n}\n\n__attribute__((naked)) bool VerifyIsStringReadableMaxSizeImpl(const char* Src, size_t MaxSize) {\n  __asm volatile(R\"(\n  1:\n  cbz x1, 2f;\n\n  .globl UserStringReadable_FaultInst\n  UserStringReadable_FaultInst:\n  ldrb w2, [x0], 1; //< This line can fault.\n  sub x1, x1, 1;\n  cbnz x2, 1b;\n\n  2:\n  mov x0, 1;\n  ret;\n  )\" ::\n                   : \"memory\");\n}\n\nvoid VerifyIsReadable(const void* Src, size_t Size) {\n  LOGMAN_THROW_A_FMT(VerifyIsReadableImpl(Src, Size), \"EFAULT needs readable!\");\n}\n\nvoid VerifyIsStringReadable(const char* Src) {\n  LOGMAN_THROW_A_FMT(VerifyIsStringReadableMaxSizeImpl(Src, ~0ULL), \"EFAULT needs string readable!\");\n}\n\nvoid VerifyIsStringReadableMaxSize(const char* Src, size_t MaxSize) {\n  LOGMAN_THROW_A_FMT(VerifyIsStringReadableMaxSizeImpl(Src, MaxSize), \"EFAULT needs string readable!\");\n}\n\nvoid VerifyIsReadableOrNull(const void* Src, size_t Size) {\n  if (Src == nullptr) {\n    return;\n  }\n\n  LOGMAN_THROW_A_FMT(VerifyIsReadableImpl(Src, Size), \"EFAULT needs readable!\");\n}\n\nvoid VerifyIsWritable(void* Src, size_t Size) {\n  ///< Checking if writable needs to check if readable first.\n  VerifyIsReadable(Src, Size);\n\n  LOGMAN_THROW_A_FMT(VerifyIsOnlyWritable(Src, Size), \"EFAULT needs writable!\");\n}\n\nvoid VerifyIsWritableOrNull(void* Src, size_t Size) {\n  if (Src == nullptr) {\n    return;\n  }\n\n  ///< Checking if writable needs to check if readable first.\n  VerifyIsReadable(Src, Size);\n  LOGMAN_THROW_A_FMT(VerifyIsOnlyWritable(Src, Size), \"EFAULT needs writable!\");\n}\n\nextern \"C\" uint64_t UserReadable_FaultInst;\nvoid* const UserReadable_FaultLocation = &UserReadable_FaultInst;\n\nextern \"C\" uint64_t UserWritable_FaultInst;\nvoid* const UserWritable_FaultLocation = &UserWritable_FaultInst;\n\nextern \"C\" uint64_t UserStringReadable_FaultInst;\nvoid* const UserStringReadable_FaultLocation = &UserStringReadable_FaultInst;\n#endif\n\nbool IsFaultLocation(uint64_t PC) {\n  bool IsMemcpyFault = false;\n  IsMemcpyFault |= reinterpret_cast<void*>(PC) == CopyToUser_FaultLocation;\n  IsMemcpyFault |= reinterpret_cast<void*>(PC) == CopyFromUser_FaultLocation;\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED && defined(ARCHITECTURE_arm64)\n  IsMemcpyFault |= reinterpret_cast<void*>(PC) == UserReadable_FaultLocation;\n  IsMemcpyFault |= reinterpret_cast<void*>(PC) == UserWritable_FaultLocation;\n  IsMemcpyFault |= reinterpret_cast<void*>(PC) == UserStringReadable_FaultLocation;\n#endif\n  return IsMemcpyFault;\n}\n\n#else\nsize_t CopyFromUser(void* Dest, const void* Src, size_t Size) {\n  memcpy(Dest, Src, Size);\n  return Size;\n}\n\nsize_t CopyToUser(void* Dest, const void* Src, size_t Size) {\n  memcpy(Dest, Src, Size);\n  return Size;\n}\n\nbool IsFaultLocation(uint64_t PC) {\n  return false;\n}\n#endif\n} // namespace FEX::HLE::FaultSafeUserMemAccess\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/FileManagement.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|common\ndesc: Rootfs overlay logic\n$end_info$\n*/\n\n#include \"Common/Config.h\"\n#include \"Common/FDUtils.h\"\n#include \"Common/JSONPool.h\"\n\n#include \"FEXCore/Config/Config.h\"\n#include \"LinuxSyscalls/FileManagement.h\"\n#include \"LinuxSyscalls/EmulatedFiles/EmulatedFiles.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/FileLoading.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/list.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXHeaderUtils/Filesystem.h>\n#include <FEXHeaderUtils/SymlinkChecks.h>\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <algorithm>\n#include <errno.h>\n#include <cstring>\n#include <linux/openat2.h>\n#include <fcntl.h>\n#include <filesystem>\n#include <optional>\n#include <stdio.h>\n#include <sys/stat.h>\n#include <sys/statfs.h>\n#include <sys/xattr.h>\n#include <syscall.h>\n#include <system_error>\n#include <unistd.h>\n#include <utility>\n\n#include <tiny-json.h>\n\nnamespace FEX::HLE {\nbool FileManager::RootFSPathExists(const char* Filepath) const {\n  LOGMAN_THROW_A_FMT(Filepath && Filepath[0] == '/', \"Filepath needs to be absolute\");\n  return FHU::Filesystem::ExistsAt(RootFSFD, Filepath + 1);\n}\n\nvoid FileManager::LoadThunkDatabase(fextl::unordered_map<fextl::string, ThunkDBObject>& ThunkDB, bool Global) {\n  auto ThunkDBPath = FEXCore::Config::GetConfigDirectory(Global) + \"ThunksDB.json\";\n  fextl::vector<char> FileData;\n  if (FEXCore::FileLoading::LoadFile(FileData, ThunkDBPath)) {\n\n    // If the thunksDB file exists then we need to check if the rootfs supports multi-arch or not.\n    const bool RootFSIsMultiarch = RootFSPathExists(\"/usr/lib/x86_64-linux-gnu/\") || RootFSPathExists(\"/usr/lib/i386-linux-gnu/\");\n\n    fextl::vector<fextl::string> PathPrefixes {};\n    if (RootFSIsMultiarch) {\n      // Multi-arch debian distros have a fairly complex arrangement of filepaths.\n      // These fractal out to the combination of library prefixes with arch suffixes.\n      constexpr static std::array<std::string_view, 4> LibPrefixes = {\n        \"/usr/lib\",\n        \"/usr/local/lib\",\n        \"/lib\",\n        \"/usr/lib/pressure-vessel/overrides/lib\",\n      };\n\n      // We only need to generate 32-bit or 64-bit depending on the operating mode.\n      const auto ArchPrefix = Is64BitMode() ? \"x86_64-linux-gnu\" : \"i386-linux-gnu\";\n\n      for (auto Prefix : LibPrefixes) {\n        PathPrefixes.emplace_back(fextl::fmt::format(\"{}/{}\", Prefix, ArchPrefix));\n      }\n    } else {\n      // Non multi-arch supporting distros like Fedora and Debian have a much more simple layout.\n      // lib/ folders refer to 32-bit library folders.\n      // li64/ folders refer to 64-bit library folders.\n      constexpr static std::array<std::string_view, 4> LibPrefixes = {\n        \"/usr\",\n        \"/usr/local\",\n        \"\", // root, the '/' will be appended in the next step.\n        \"/usr/lib/pressure-vessel/overrides\",\n      };\n\n      // We only need to generate 32-bit or 64-bit depending on the operating mode.\n      const auto ArchPrefix = Is64BitMode() ? \"lib64\" : \"lib\";\n\n      for (auto Prefix : LibPrefixes) {\n        PathPrefixes.emplace_back(fextl::fmt::format(\"{}/{}\", Prefix, ArchPrefix));\n      }\n    }\n\n    FEX::JSON::JsonAllocator Pool {};\n    const json_t* json = FEX::JSON::CreateJSON(FileData, Pool);\n\n    if (!json) {\n      ERROR_AND_DIE_FMT(\"Failed to parse JSON from ThunkDB file '{}' - invalid JSON format\", ThunkDBPath);\n    }\n\n    const json_t* DB = json_getProperty(json, \"DB\");\n    if (!DB || JSON_OBJ != json_getType(DB)) {\n      return;\n    }\n\n    auto HomeDirectory = FEX::Config::GetHomeDirectory();\n\n    for (const json_t* Library = json_getChild(DB); Library != nullptr; Library = json_getSibling(Library)) {\n      // Get the user defined name for the library\n      const char* LibraryName = json_getName(Library);\n      auto DBObject = ThunkDB.insert_or_assign(LibraryName, ThunkDBObject {}).first;\n\n      // Walk the libraries items to get the data\n      for (const json_t* LibraryItem = json_getChild(Library); LibraryItem != nullptr; LibraryItem = json_getSibling(LibraryItem)) {\n        std::string_view ItemName = json_getName(LibraryItem);\n\n        if (ItemName == \"Library\") {\n          // \"Library\": \"libGL-guest.so\"\n          DBObject->second.LibraryName = json_getValue(LibraryItem);\n        } else if (ItemName == \"Depends\") {\n          jsonType_t PropertyType = json_getType(LibraryItem);\n          if (PropertyType == JSON_TEXT) {\n            DBObject->second.Depends.emplace(json_getValue(LibraryItem));\n          } else if (PropertyType == JSON_ARRAY) {\n            for (const json_t* Depend = json_getChild(LibraryItem); Depend != nullptr; Depend = json_getSibling(Depend)) {\n              DBObject->second.Depends.emplace(json_getValue(Depend));\n            }\n          }\n        } else if (ItemName == \"Overlay\") {\n          auto AddWithReplacement = [HomeDirectory, &PathPrefixes](ThunkDBObject& DBObject, std::string_view LibraryItem) {\n            // Walk through template string and fill in prefixes from right to left\n\n            using namespace std::string_view_literals;\n            const std::pair PrefixHome {\"@HOME@\"sv, LibraryItem.find(\"@HOME@\")};\n            const std::pair PrefixLib {\"@PREFIX_LIB@\"sv, LibraryItem.find(\"@PREFIX_LIB@\")};\n\n            fextl::string::size_type PrefixPositions[] = {\n              PrefixHome.second,\n              PrefixLib.second,\n            };\n            // Sort offsets in descending order to enable safe in-place replacement\n            std::sort(std::begin(PrefixPositions), std::end(PrefixPositions), std::greater<> {});\n\n            for (const auto& LibPrefix : PathPrefixes) {\n              fextl::string Replacement(LibraryItem);\n              for (auto PrefixPos : PrefixPositions) {\n                if (PrefixPos == fextl::string::npos) {\n                  continue;\n                } else if (PrefixPos == PrefixHome.second) {\n                  Replacement.replace(PrefixPos, PrefixHome.first.size(), HomeDirectory);\n                } else if (PrefixPos == PrefixLib.second) {\n                  Replacement.replace(PrefixPos, PrefixLib.first.size(), LibPrefix);\n                }\n              }\n              DBObject.Overlays.emplace_back(std::move(Replacement));\n\n              if (PrefixLib.second == fextl::string::npos) {\n                // Don't repeat for other LibPrefixes entries if the prefix wasn't used\n                break;\n              }\n            }\n          };\n\n          jsonType_t PropertyType = json_getType(LibraryItem);\n          if (PropertyType == JSON_TEXT) {\n            AddWithReplacement(DBObject->second, json_getValue(LibraryItem));\n          } else if (PropertyType == JSON_ARRAY) {\n            for (const json_t* Overlay = json_getChild(LibraryItem); Overlay != nullptr; Overlay = json_getSibling(Overlay)) {\n              AddWithReplacement(DBObject->second, json_getValue(Overlay));\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\nFileManager::FileManager(FEXCore::Context::Context* ctx)\n  : EmuFD {ctx} {\n  const auto& ThunkConfigFile = ThunkConfig();\n\n  // We try to load ThunksDB from:\n  // - FEX global config\n  // - FEX user config\n  // - Defined ThunksConfig option\n  // - Steam AppConfig Global\n  // - AppConfig Global\n  // - Steam AppConfig Local\n  // - AppConfig Local\n  // - AppConfig override\n  // This doesn't support the classic thunks interface.\n\n  const auto& AppName = AppConfigName();\n  fextl::vector<fextl::string> ConfigPaths {\n    FEXCore::Config::GetConfigFileLocation(true),\n    FEXCore::Config::GetConfigFileLocation(false),\n    ThunkConfigFile,\n  };\n\n  auto SteamID = getenv(\"SteamAppId\");\n  if (SteamID) {\n    // If a SteamID exists then let's search for Steam application configs as well.\n    // We want to key off both the SteamAppId number /and/ the executable since we may not want to thunk all binaries.\n    fextl::string SteamAppName = fextl::fmt::format(\"Steam_{}_{}\", SteamID, AppName);\n\n    // Steam application configs interleaved with non-steam for priority sorting.\n    ConfigPaths.emplace_back(FEXCore::Config::GetApplicationConfig(SteamAppName, true));\n    ConfigPaths.emplace_back(FEXCore::Config::GetApplicationConfig(AppName, true));\n    ConfigPaths.emplace_back(FEXCore::Config::GetApplicationConfig(SteamAppName, false));\n    ConfigPaths.emplace_back(FEXCore::Config::GetApplicationConfig(AppName, false));\n  } else {\n    ConfigPaths.emplace_back(FEXCore::Config::GetApplicationConfig(AppName, true));\n    ConfigPaths.emplace_back(FEXCore::Config::GetApplicationConfig(AppName, false));\n  }\n\n  const char* AppConfig = getenv(\"FEX_APP_CONFIG\");\n  if (AppConfig) {\n    ConfigPaths.emplace_back(AppConfig);\n  }\n\n  if (!LDPath().empty()) {\n    RootFSFD = open(LDPath().c_str(), O_DIRECTORY | O_PATH | O_CLOEXEC);\n    if (RootFSFD == -1) {\n      RootFSFD = AT_FDCWD;\n    } else {\n      TrackFEXFD(RootFSFD);\n    }\n  }\n\n  fextl::unordered_map<fextl::string, ThunkDBObject> ThunkDB;\n  LoadThunkDatabase(ThunkDB, true);\n  LoadThunkDatabase(ThunkDB, false);\n\n  for (const auto& Path : ConfigPaths) {\n    fextl::vector<char> FileData;\n    if (FEXCore::FileLoading::LoadFile(FileData, Path)) {\n      FEX::JSON::JsonAllocator Pool {};\n\n      // If a thunks DB property exists then we pull in data from the thunks database\n      const json_t* json = FEX::JSON::CreateJSON(FileData, Pool);\n      if (!json) {\n        continue;\n      }\n\n      const json_t* ThunksDB = json_getProperty(json, \"ThunksDB\");\n      if (!ThunksDB) {\n        continue;\n      }\n\n      for (const json_t* Item = json_getChild(ThunksDB); Item != nullptr; Item = json_getSibling(Item)) {\n        const char* LibraryName = json_getName(Item);\n        bool LibraryEnabled = json_getInteger(Item) != 0;\n        // If the library is enabled then find it in the DB\n        auto DBObject = ThunkDB.find(LibraryName);\n        if (DBObject != ThunkDB.end()) {\n          DBObject->second.Enabled = LibraryEnabled;\n        }\n      }\n    }\n  }\n\n  // Now that we loaded the thunks object, walk through and ensure dependencies are enabled as well\n  auto ThunkGuestPath = ThunkGuestLibs();\n  while (ThunkGuestPath.ends_with('/')) {\n    ThunkGuestPath.pop_back();\n  }\n  if (!Is64BitMode()) {\n    ThunkGuestPath += \"_32\";\n  }\n  for (const auto& DBObject : ThunkDB) {\n    if (!DBObject.second.Enabled) {\n      continue;\n    }\n\n    // Recursively add paths for this thunk library and its dependencies to ThunkOverlays.\n    // Using a local struct for this is slightly less ugly than using self-capturing lambdas\n    struct {\n      decltype(FileManager::ThunkOverlays)& ThunkOverlays;\n      decltype(ThunkDB)& DB;\n      const fextl::string& ThunkGuestPath;\n      bool Is64BitMode;\n\n      void SetupOverlay(const ThunkDBObject& DBDepend) {\n        auto ThunkPath = fextl::fmt::format(\"{}/{}\", ThunkGuestPath, DBDepend.LibraryName);\n        if (!FHU::Filesystem::Exists(ThunkPath)) {\n          if (!Is64BitMode) {\n            // Guest libraries not existing is expected since not all libraries are thunked on 32-bit\n            return;\n          }\n          ERROR_AND_DIE_FMT(\"Requested thunking via guest library \\\"{}\\\" that does not exist\", ThunkPath);\n        }\n\n        for (const auto& Overlay : DBDepend.Overlays) {\n          // Direct full path in guest RootFS to our overlay file\n          ThunkOverlays.emplace(Overlay, ThunkPath);\n        }\n      };\n\n      void InsertDependencies(const fextl::unordered_set<fextl::string>& Depends) {\n        for (const auto& Depend : Depends) {\n          auto& DBDepend = DB.at(Depend);\n          if (DBDepend.Enabled) {\n            continue;\n          }\n\n          SetupOverlay(DBDepend);\n\n          // Mark enabled and recurse into dependencies\n          DBDepend.Enabled = true;\n          InsertDependencies(DBDepend.Depends);\n        }\n      };\n    } DBObjectHandler {ThunkOverlays, ThunkDB, ThunkGuestPath, Is64BitMode()};\n\n    DBObjectHandler.SetupOverlay(DBObject.second);\n    DBObjectHandler.InsertDependencies(DBObject.second.Depends);\n  }\n\n  if (false) {\n    // Useful for debugging\n    if (ThunkOverlays.size()) {\n      LogMan::Msg::IFmt(\"Thunk Overlays:\");\n      for (const auto& [Overlay, ThunkPath] : ThunkOverlays) {\n        LogMan::Msg::IFmt(\"\\t{} -> {}\", Overlay, ThunkPath);\n      }\n    }\n  }\n\n  // Keep an fd open for /proc, to bypass chroot-style sandboxes\n  ProcFD = open(\"/proc\", O_RDONLY | O_CLOEXEC);\n  if (ProcFD != -1) {\n    // Track the st_dev of /proc, to check for inode equality\n    struct stat Buffer;\n    auto Result = fstat(ProcFD, &Buffer);\n    if (Result >= 0) {\n      ProcFSDev = Buffer.st_dev;\n    }\n  } else {\n    LogMan::Msg::EFmt(\"Couldn't open `/proc`. Is ProcFS mounted? FEX won't be able to track FD conflicts\");\n  }\n\n  UpdatePID(::getpid());\n}\n\nFileManager::~FileManager() {\n  close(RootFSFD);\n}\n\nsize_t FileManager::GetRootFSPrefixLen(const char* pathname, size_t len, bool AliasedOnly) const {\n  if (len < 2 ||            // If no pathname or root\n      pathname[0] != '/') { // If we are getting root\n    return 0;\n  }\n\n  const auto& RootFSPath = LDPath();\n  if (RootFSPath.empty()) { // If RootFS doesn't exist\n    return 0;\n  }\n\n  auto RootFSLen = RootFSPath.length();\n  if (RootFSPath.ends_with(\"/\")) {\n    RootFSLen -= 1;\n  }\n\n  if (RootFSLen > len) {\n    return 0;\n  }\n\n  if (memcmp(pathname, RootFSPath.c_str(), RootFSLen) || (len > RootFSLen && pathname[RootFSLen] != '/')) {\n    return 0; // If the path is not within the RootFS\n  }\n\n  if (AliasedOnly) {\n    fextl::string Path(pathname, len); // Need to nul-terminate so copy\n\n    struct stat HostStat {};\n    struct stat RootFSStat {};\n    if (lstat(Path.c_str(), &RootFSStat)) {\n      LogMan::Msg::DFmt(\"GetRootFSPrefixLen: lstat on RootFS path failed: {}\", std::string_view(pathname, len));\n      return 0; // RootFS path does not exist?\n    }\n    if (lstat(Path.c_str() + RootFSLen, &HostStat)) {\n      return 0; // Host path does not exist or not accessible\n    }\n    // Note: We do not check st_dev, since the RootFS might be\n    // an overlayfs mount that changes it. This means there could\n    // be false positives. However, since we check the size too,\n    // this is highly unlikely (an overlaid file would need to\n    // have the same exact size and coincidentally the same\n    // inode number as on the host, which is implausible for things\n    // like binaries and libraries).\n    if (RootFSStat.st_size != HostStat.st_size || RootFSStat.st_ino != HostStat.st_ino || RootFSStat.st_mode != HostStat.st_mode) {\n      return 0; // Host path is a different file\n    }\n  }\n\n  return RootFSLen;\n}\n\nssize_t FileManager::StripRootFSPrefix(char* pathname, ssize_t len, bool leaky) const {\n  if (len < 0) {\n    return len;\n  }\n\n  auto Prefix = GetRootFSPrefixLen(pathname, len, false);\n  if (Prefix == 0) {\n    return len;\n  }\n\n  if (Prefix == len) {\n    if (leaky) {\n      // Getting the root, without a trailing /. This is a hack pressure-vessel uses to get the FEX RootFS,\n      // so we have to leak it here...\n      LogMan::Msg::DFmt(\"Leaking RootFS path for pressure-vessel\");\n      return len;\n    } else {\n      ::strcpy(pathname, \"/\");\n      return 1;\n    }\n  }\n\n  ::memmove(pathname, pathname + Prefix, len - Prefix);\n  pathname[len - Prefix] = '\\0';\n\n  return len - Prefix;\n}\n\nfextl::string FileManager::GetHostPath(fextl::string& Path, bool AliasedOnly) const {\n  auto Prefix = GetRootFSPrefixLen(Path.c_str(), Path.length(), AliasedOnly);\n\n  if (Prefix == 0) {\n    return {};\n  }\n\n  auto ret = Path.substr(Prefix);\n  if (ret.empty()) { // Getting the root\n    ret = \"/\";\n  }\n\n  return ret;\n}\n\nfextl::string FileManager::GetEmulatedPath(const char* pathname, bool FollowSymlink) const {\n  if (!pathname ||                  // If no pathname\n      pathname[0] != '/' ||         // If relative\n      strcmp(pathname, \"/\") == 0) { // If we are getting root\n    return {};\n  }\n\n  auto thunkOverlay = ThunkOverlays.find(pathname);\n  if (thunkOverlay != ThunkOverlays.end()) {\n    return thunkOverlay->second;\n  }\n\n  const auto& RootFSPath = LDPath();\n  if (RootFSPath.empty()) { // If RootFS doesn't exist\n    return {};\n  }\n\n  fextl::string Path = RootFSPath + pathname;\n  if (FollowSymlink) {\n    char Filename[PATH_MAX];\n    while (FEX::HLE::IsSymlink(AT_FDCWD, Path.c_str())) {\n      auto SymlinkSize = FEX::HLE::GetSymlink(AT_FDCWD, Path.c_str(), Filename, PATH_MAX - 1);\n      if (SymlinkSize > 0 && Filename[0] == '/') {\n        Path = RootFSPath;\n        Path += std::string_view(Filename, SymlinkSize);\n      } else {\n        break;\n      }\n    }\n  }\n  return Path;\n}\n\nFileManager::EmulatedFDPathResult\nFileManager::GetEmulatedFDPath(int dirfd, const char* pathname, bool FollowSymlink, FDPathTmpData& TmpFilename) const {\n  constexpr auto NoEntry = EmulatedFDPathResult {-1, nullptr};\n\n  if (!pathname) {\n    // No pathname.\n    return NoEntry;\n  }\n\n  if (pathname[0] == '/') {\n    // If the path is absolute then dirfd is ignored.\n    dirfd = AT_FDCWD;\n  }\n\n  if (pathname[0] != '/' || // If relative\n      pathname[1] == 0 ||   // If we are getting root\n      dirfd != AT_FDCWD) {  // If dirfd isn't special FDCWD\n    return NoEntry;\n  }\n\n  auto thunkOverlay = ThunkOverlays.find(pathname);\n  if (thunkOverlay != ThunkOverlays.end()) {\n    return EmulatedFDPathResult {AT_FDCWD, thunkOverlay->second.c_str()};\n  }\n\n  if (RootFSFD == AT_FDCWD) {\n    // If RootFS doesn't exist\n    return NoEntry;\n  }\n\n  // Starting subpath is the pathname passed in.\n  const char* SubPath = pathname;\n\n  // Current index for the temporary path to use.\n  uint32_t CurrentIndex {};\n\n  // The two temporary paths.\n  const std::array<char*, 2> TmpPaths = {\n    TmpFilename[0],\n    TmpFilename[1],\n  };\n\n  if (FollowSymlink) {\n    // Check if the combination of RootFS FD and subpath with the front '/' stripped off is a symlink.\n    bool HadAtLeastOne {};\n    struct stat Buffer {};\n    for (;;) {\n      // We need to check if the filepath exists and is a symlink.\n      // If the initial filepath doesn't exist then early exit.\n      // If it did exist at some state then trace it all all the way to the final link.\n      int Result = fstatat(RootFSFD, &SubPath[1], &Buffer, AT_SYMLINK_NOFOLLOW);\n      if (Result != 0 && errno == ENOENT && !HadAtLeastOne) {\n        // Initial file didn't exist at all\n        return NoEntry;\n      }\n\n      const bool IsLink = Result == 0 && S_ISLNK(Buffer.st_mode);\n\n      HadAtLeastOne = true;\n\n      if (IsLink) {\n        // Choose the current temporary working path.\n        auto CurrentTmp = TmpPaths[CurrentIndex];\n\n        // Get the symlink of RootFS FD + stripped subpath.\n        auto SymlinkSize = FEX::HLE::GetSymlink(RootFSFD, &SubPath[1], CurrentTmp, PATH_MAX - 1);\n\n        // This might be a /proc symlink into the RootFS, so strip it in that case.\n        SymlinkSize = StripRootFSPrefix(CurrentTmp, SymlinkSize, false);\n\n        if (SymlinkSize > 1 && CurrentTmp[0] == '/') {\n          // If the symlink is absolute and not the root:\n          // 1) Zero terminate it.\n          // 2) Set the path as our current subpath.\n          // 3) Switch to the next temporary index. (We don't want to overwrite the current one on the next loop iteration).\n          // 4) Run the loop again.\n          CurrentTmp[SymlinkSize] = 0;\n          SubPath = CurrentTmp;\n          CurrentIndex ^= 1;\n        } else {\n          // If the path wasn't a symlink or wasn't absolute.\n          // 1) Break early, returning the previous found result.\n          // 2) If first iteration then we return `pathname`.\n          break;\n        }\n      } else {\n        break;\n      }\n    }\n  }\n\n  // Return the pair of rootfs FD plus relative subpath by stripping off the front '/'\n  return EmulatedFDPathResult {RootFSFD, &SubPath[1]};\n}\n\n///< Returns true if the pathname is self and symlink flags are set NOFOLLOW.\nbool FileManager::IsSelfNoFollow(const char* Pathname, int flags) const {\n  const bool Follow = (flags & AT_SYMLINK_NOFOLLOW) == 0;\n  if (Follow) {\n    // If we are following the self symlink then we don't care about this.\n    return false;\n  }\n\n  if (!Pathname) {\n    return false;\n  }\n\n  char PidSelfPath[50];\n  snprintf(PidSelfPath, sizeof(PidSelfPath), \"/proc/%i/exe\", CurrentPID);\n\n  return strcmp(Pathname, \"/proc/self/exe\") == 0 || strcmp(Pathname, \"/proc/thread-self/exe\") == 0 || strcmp(Pathname, PidSelfPath) == 0;\n}\n\nstd::optional<std::string_view> FileManager::GetSelf(const char* Pathname) const {\n  if (!Pathname) {\n    return std::nullopt;\n  }\n\n  char PidSelfPath[50];\n  snprintf(PidSelfPath, sizeof(PidSelfPath), \"/proc/%i/exe\", CurrentPID);\n\n  if (strcmp(Pathname, \"/proc/self/exe\") == 0 || strcmp(Pathname, \"/proc/thread-self/exe\") == 0 || strcmp(Pathname, PidSelfPath) == 0) {\n    return Filename();\n  }\n\n  return Pathname;\n}\n\nstatic bool ShouldSkipOpenInEmu(int flags) {\n  if (flags & O_CREAT) {\n    // If trying to create a file then skip checking in emufd\n    return true;\n  }\n\n  if (flags & O_WRONLY) {\n    // If the file is trying to be open with write permissions then skip.\n    return true;\n  }\n\n  if (flags & O_APPEND) {\n    // If the file is trying to be open with append options then skip.\n    return true;\n  }\n\n  return false;\n}\n\nbool FileManager::ReplaceEmuFd(int fd, int flags, uint32_t mode) {\n  char Tmp[PATH_MAX + 1];\n\n  if (fd < 0) {\n    return false;\n  }\n\n  // Get the path of the file we just opened\n  auto PathLength = FEX::get_fdpath(fd, Tmp);\n  if (PathLength == -1) {\n    return false;\n  }\n  Tmp[PathLength] = '\\0';\n\n  // And try to open via EmuFD\n  auto EmuFd = EmuFD.Open(Tmp, flags, mode);\n  if (EmuFd == -1) {\n    return false;\n  }\n\n  // If we succeeded, swap out the fd\n  ::dup2(EmuFd, fd);\n  ::close(EmuFd);\n  return true;\n}\n\nuint64_t FileManager::Open(const char* pathname, int flags, uint32_t mode) {\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n  int fd = -1;\n\n  if (!ShouldSkipOpenInEmu(flags)) {\n    FDPathTmpData TmpFilename;\n    auto Path = GetEmulatedFDPath(AT_FDCWD, SelfPath, false, TmpFilename);\n    if (Path.FD != -1) {\n      FEX::HLE::open_how how = {\n        .flags = (uint64_t)flags,\n        .mode = (flags & (O_CREAT | O_TMPFILE)) ? mode & 07777 : 0, // openat2() is stricter about this\n        .resolve = (Path.FD == AT_FDCWD) ? 0u : RESOLVE_IN_ROOT,    // AT_FDCWD means it's a thunk and not via RootFS\n      };\n      fd = ::syscall(SYSCALL_DEF(openat2), Path.FD, Path.Path, &how, sizeof(how));\n\n      if (fd == -1 && errno == EXDEV) {\n        // This means a magic symlink (/proc/foo) was involved. In this case we\n        // just punt and do the access without RESOLVE_IN_ROOT.\n        fd = ::syscall(SYSCALL_DEF(openat), Path.FD, Path.Path, flags, mode);\n      }\n    }\n\n    // Open through RootFS failed (probably nonexistent), so open directly.\n    if (fd == -1) {\n      fd = ::open(SelfPath, flags, mode);\n    }\n\n    ReplaceEmuFd(fd, flags, mode);\n  } else {\n    fd = ::open(SelfPath, flags, mode);\n  }\n\n  return fd;\n}\n\nuint64_t FileManager::Close(int fd) {\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  if (CheckIfFDInTrackedSet(fd)) {\n    LogMan::Msg::EFmt(\"{} closing FEX FD {}\", __func__, fd);\n    RemoveFEXFD(fd);\n  }\n#endif\n\n  return ::close(fd);\n}\n\nuint64_t FileManager::CloseRange(unsigned int first, unsigned int last, unsigned int flags) {\n#ifndef CLOSE_RANGE_CLOEXEC\n#define CLOSE_RANGE_CLOEXEC (1U << 2)\n#endif\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  if (!(flags & CLOSE_RANGE_CLOEXEC) && CheckIfFDRangeInTrackedSet(first, last)) {\n    LogMan::Msg::EFmt(\"{} closing FEX FDs in range ({}, {})\", __func__, first, last);\n    RemoveFEXFDRange(first, last);\n  }\n#endif\n\n  return ::syscall(SYSCALL_DEF(close_range), first, last, flags);\n}\n\nuint64_t FileManager::Stat(const char* pathname, void* buf) {\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  // Stat follows symlinks\n  FDPathTmpData TmpFilename;\n  auto Path = GetEmulatedFDPath(AT_FDCWD, SelfPath, true, TmpFilename);\n  if (Path.FD != -1) {\n    uint64_t Result = ::fstatat(Path.FD, Path.Path, reinterpret_cast<struct stat*>(buf), 0);\n    if (Result != -1) {\n      return Result;\n    }\n  }\n  return ::stat(SelfPath, reinterpret_cast<struct stat*>(buf));\n}\n\nuint64_t FileManager::Lstat(const char* pathname, void* buf) {\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  // lstat does not follow symlinks\n  FDPathTmpData TmpFilename;\n  auto Path = GetEmulatedFDPath(AT_FDCWD, SelfPath, false, TmpFilename);\n  if (Path.FD != -1) {\n    uint64_t Result = ::fstatat(Path.FD, Path.Path, reinterpret_cast<struct stat*>(buf), AT_SYMLINK_NOFOLLOW);\n    if (Result != -1) {\n      return Result;\n    }\n  }\n\n  return ::lstat(pathname, reinterpret_cast<struct stat*>(buf));\n}\n\nuint64_t FileManager::Access(const char* pathname, [[maybe_unused]] int mode) {\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  // Access follows symlinks\n  FDPathTmpData TmpFilename;\n  auto Path = GetEmulatedFDPath(AT_FDCWD, SelfPath, true, TmpFilename);\n  if (Path.FD != -1) {\n    uint64_t Result = ::faccessat(Path.FD, Path.Path, mode, 0);\n    if (Result != -1) {\n      return Result;\n    }\n  }\n  return ::access(SelfPath, mode);\n}\n\nuint64_t FileManager::FAccessat(int dirfd, const char* pathname, int mode) {\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  FDPathTmpData TmpFilename;\n  auto Path = GetEmulatedFDPath(dirfd, SelfPath, true, TmpFilename);\n  if (Path.FD != -1) {\n    uint64_t Result = ::syscall(SYSCALL_DEF(faccessat), Path.FD, Path.Path, mode);\n    if (Result != -1) {\n      return Result;\n    }\n  }\n\n  return ::syscall(SYS_faccessat, dirfd, SelfPath, mode);\n}\n\nuint64_t FileManager::FAccessat2(int dirfd, const char* pathname, int mode, int flags) {\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  FDPathTmpData TmpFilename;\n  auto Path = GetEmulatedFDPath(dirfd, SelfPath, (flags & AT_SYMLINK_NOFOLLOW) == 0, TmpFilename);\n  if (Path.FD != -1) {\n    uint64_t Result = ::syscall(SYSCALL_DEF(faccessat2), Path.FD, Path.Path, mode, flags);\n    if (Result != -1) {\n      return Result;\n    }\n  }\n\n  return ::syscall(SYSCALL_DEF(faccessat2), dirfd, SelfPath, mode, flags);\n}\n\nuint64_t FileManager::Readlink(const char* pathname, char* buf, size_t bufsiz) {\n  // calculate the non-self link to exe\n  // Some executables do getpid, stat(\"/proc/$pid/exe\")\n  char PidSelfPath[50];\n  snprintf(PidSelfPath, 50, \"/proc/%i/exe\", CurrentPID);\n\n  if (strcmp(pathname, \"/proc/self/exe\") == 0 || strcmp(pathname, \"/proc/thread-self/exe\") == 0 || strcmp(pathname, PidSelfPath) == 0) {\n    const auto& App = Filename();\n    strncpy(buf, App.c_str(), bufsiz);\n    return std::min(bufsiz, App.size());\n  }\n\n  FDPathTmpData TmpFilename;\n  auto Path = GetEmulatedFDPath(AT_FDCWD, pathname, false, TmpFilename);\n  uint64_t Result = -1;\n  if (Path.FD != -1) {\n    Result = ::readlinkat(Path.FD, Path.Path, buf, bufsiz);\n\n    if (Result == -1 && errno == EINVAL) {\n      // This means that the file wasn't a symlink\n      // This is expected behaviour\n      return -1;\n    }\n  }\n  if (Result == -1) {\n    Result = ::readlink(pathname, buf, bufsiz);\n  }\n\n  // We might have read a /proc/self/fd/* link. If so, strip the RootFS prefix from it.\n  return StripRootFSPrefix(buf, Result, true);\n}\n\nuint64_t FileManager::Chmod(const char* pathname, mode_t mode) {\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  FDPathTmpData TmpFilename;\n  auto Path = GetEmulatedFDPath(AT_FDCWD, SelfPath, false, TmpFilename);\n  if (Path.FD != -1) {\n    uint64_t Result = ::fchmodat(Path.FD, Path.Path, mode, 0);\n    if (Result != -1) {\n      return Result;\n    }\n  }\n  return ::chmod(SelfPath, mode);\n}\n\nuint64_t FileManager::Readlinkat(int dirfd, const char* pathname, char* buf, size_t bufsiz) {\n  // calculate the non-self link to exe\n  // Some executables do getpid, stat(\"/proc/$pid/exe\")\n  // Can't use `GetSelf` directly here since readlink{at,} returns EINVAL if it isn't a symlink\n  // Self is always a symlink and isn't expected to fail\n\n  fextl::string Path {};\n  if (((pathname && pathname[0] != '/') || // If pathname exists then it must not be absolute\n       !pathname) &&\n      dirfd != AT_FDCWD) {\n    // Passed in a dirfd that isn't magic FDCWD\n    // We need to get the path from the fd now\n    char Tmp[PATH_MAX] = \"\";\n    auto PathLength = FEX::get_fdpath(dirfd, Tmp);\n    if (PathLength != -1) {\n      Path = fextl::string(Tmp, PathLength);\n    }\n\n    if (pathname) {\n      if (!Path.empty()) {\n        // If the path returned empty then we don't need a separator\n        Path += \"/\";\n      }\n      Path += pathname;\n    }\n  } else {\n    if (!pathname || strlen(pathname) == 0) {\n      return -1;\n    } else if (pathname) {\n      Path = pathname;\n    }\n  }\n\n  char PidSelfPath[50];\n  snprintf(PidSelfPath, 50, \"/proc/%i/exe\", CurrentPID);\n\n  if (Path == \"/proc/self/exe\" || Path == \"/proc/thread-self/exe\" || Path == PidSelfPath) {\n    const auto& App = Filename();\n    strncpy(buf, App.c_str(), bufsiz);\n    return std::min(bufsiz, App.size());\n  }\n\n  FDPathTmpData TmpFilename;\n  auto NewPath = GetEmulatedFDPath(dirfd, pathname, false, TmpFilename);\n  uint64_t Result = -1;\n\n  if (NewPath.FD != -1) {\n    Result = ::readlinkat(NewPath.FD, NewPath.Path, buf, bufsiz);\n\n    if (Result == -1 && errno == EINVAL) {\n      // This means that the file wasn't a symlink\n      // This is expected behaviour\n      return -1;\n    }\n  }\n\n  if (Result == -1) {\n    Result = ::readlinkat(dirfd, pathname, buf, bufsiz);\n  }\n\n  // We might have read a /proc/self/fd/* link. If so, strip the RootFS prefix from it.\n  return StripRootFSPrefix(buf, Result, true);\n}\n\nuint64_t FileManager::Openat([[maybe_unused]] int dirfs, const char* pathname, int flags, uint32_t mode) {\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  int32_t fd = -1;\n\n  if (!ShouldSkipOpenInEmu(flags)) {\n    FDPathTmpData TmpFilename;\n    auto Path = GetEmulatedFDPath(dirfs, SelfPath, false, TmpFilename);\n    if (Path.FD != -1) {\n      FEX::HLE::open_how how = {\n        .flags = (uint64_t)flags,\n        .mode = (flags & (O_CREAT | O_TMPFILE)) ? mode & 07777 : 0, // openat2() is stricter about this,\n        .resolve = (Path.FD == AT_FDCWD) ? 0u : RESOLVE_IN_ROOT,    // AT_FDCWD means it's a thunk and not via RootFS\n      };\n      fd = ::syscall(SYSCALL_DEF(openat2), Path.FD, Path.Path, &how, sizeof(how));\n      if (fd == -1 && errno == EXDEV) {\n        // This means a magic symlink (/proc/foo) was involved. In this case we\n        // just punt and do the access without RESOLVE_IN_ROOT.\n        fd = ::syscall(SYSCALL_DEF(openat), Path.FD, Path.Path, flags, mode);\n      }\n    }\n\n    // Open through RootFS failed (probably nonexistent), so open directly.\n    if (fd == -1) {\n      fd = ::syscall(SYSCALL_DEF(openat), dirfs, SelfPath, flags, mode);\n    }\n\n    ReplaceEmuFd(fd, flags, mode);\n  } else {\n    fd = ::syscall(SYSCALL_DEF(openat), dirfs, SelfPath, flags, mode);\n  }\n\n  return fd;\n}\n\nuint64_t FileManager::Openat2(int dirfs, const char* pathname, FEX::HLE::open_how* how, size_t usize) {\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  int32_t fd = -1;\n\n  if (!ShouldSkipOpenInEmu(how->flags)) {\n    FDPathTmpData TmpFilename;\n    auto Path = GetEmulatedFDPath(dirfs, SelfPath, false, TmpFilename);\n    if (Path.FD != -1 && !(how->resolve & RESOLVE_IN_ROOT)) {\n      // AT_FDCWD means it's a thunk and not via RootFS\n      if (Path.FD != AT_FDCWD) {\n        how->resolve |= RESOLVE_IN_ROOT;\n      }\n      fd = ::syscall(SYSCALL_DEF(openat2), Path.FD, Path.Path, how, usize);\n      how->resolve &= ~RESOLVE_IN_ROOT;\n      if (fd == -1 && errno == EXDEV) {\n        // This means a magic symlink (/proc/foo) was involved. In this case we\n        // just punt and do the access without RESOLVE_IN_ROOT.\n        fd = ::syscall(SYSCALL_DEF(openat2), Path.FD, Path.Path, how, usize);\n      }\n    }\n\n    // Open through RootFS failed (probably nonexistent), so open directly.\n    if (fd == -1) {\n      fd = ::syscall(SYSCALL_DEF(openat2), dirfs, SelfPath, how, usize);\n    }\n\n    ReplaceEmuFd(fd, how->flags, how->mode);\n  } else {\n    fd = ::syscall(SYSCALL_DEF(openat2), dirfs, SelfPath, how, usize);\n  }\n\n  return fd;\n}\n\nuint64_t FileManager::Statx(int dirfd, const char* pathname, int flags, uint32_t mask, struct statx* statxbuf) {\n  if (IsSelfNoFollow(pathname, flags)) {\n    // If we aren't following the symlink for self then we need to return data about the symlink itself.\n    // Let's just /actually/ return FEX symlink information in this case.\n    return FHU::Syscalls::statx(dirfd, pathname, flags, mask, statxbuf);\n  }\n\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  FDPathTmpData TmpFilename;\n  auto Path = GetEmulatedFDPath(dirfd, SelfPath, (flags & AT_SYMLINK_NOFOLLOW) == 0, TmpFilename);\n  if (Path.FD != -1) {\n    uint64_t Result = FHU::Syscalls::statx(Path.FD, Path.Path, flags, mask, statxbuf);\n    if (Result != -1) {\n      return Result;\n    }\n  }\n  return FHU::Syscalls::statx(dirfd, SelfPath, flags, mask, statxbuf);\n}\n\nuint64_t FileManager::Mknod(const char* pathname, mode_t mode, dev_t dev) {\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  FDPathTmpData TmpFilename;\n  auto Path = GetEmulatedFDPath(AT_FDCWD, SelfPath, false, TmpFilename);\n  if (Path.FD != -1) {\n    uint64_t Result = ::mknodat(Path.FD, Path.Path, mode, dev);\n    if (Result != -1) {\n      return Result;\n    }\n  }\n  return ::mknod(SelfPath, mode, dev);\n}\n\nuint64_t FileManager::Statfs(const char* path, void* buf) {\n  auto Path = GetEmulatedPath(path);\n  if (!Path.empty()) {\n    uint64_t Result = ::statfs(Path.c_str(), reinterpret_cast<struct statfs*>(buf));\n    if (Result != -1) {\n      return Result;\n    }\n  }\n  return ::statfs(path, reinterpret_cast<struct statfs*>(buf));\n}\n\nuint64_t FileManager::NewFSStatAt(int dirfd, const char* pathname, struct stat* buf, int flag) {\n  if (IsSelfNoFollow(pathname, flag)) {\n    // See Statx\n    return ::fstatat(dirfd, pathname, buf, flag);\n  }\n\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  FDPathTmpData TmpFilename;\n  auto Path = GetEmulatedFDPath(dirfd, SelfPath, (flag & AT_SYMLINK_NOFOLLOW) == 0, TmpFilename);\n  if (Path.FD != -1) {\n    uint64_t Result = ::fstatat(Path.FD, Path.Path, buf, flag);\n    if (Result != -1) {\n      return Result;\n    }\n  }\n  return ::fstatat(dirfd, SelfPath, buf, flag);\n}\n\nuint64_t FileManager::NewFSStatAt64(int dirfd, const char* pathname, struct stat64* buf, int flag) {\n  if (IsSelfNoFollow(pathname, flag)) {\n    // See Statx\n    return ::fstatat64(dirfd, pathname, buf, flag);\n  }\n\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  FDPathTmpData TmpFilename;\n  auto Path = GetEmulatedFDPath(dirfd, SelfPath, (flag & AT_SYMLINK_NOFOLLOW) == 0, TmpFilename);\n  if (Path.FD != -1) {\n    uint64_t Result = ::fstatat64(Path.FD, Path.Path, buf, flag);\n    if (Result != -1) {\n      return Result;\n    }\n  }\n  return ::fstatat64(dirfd, SelfPath, buf, flag);\n}\n\nuint64_t FileManager::Setxattr(const char* path, const char* name, const void* value, size_t size, int flags) {\n  auto NewPath = GetSelf(path);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  auto Path = GetEmulatedPath(SelfPath, true);\n  if (!Path.empty()) {\n    uint64_t Result = ::setxattr(Path.c_str(), name, value, size, flags);\n    if (Result != -1 || errno != ENOENT) {\n      return Result;\n    }\n  }\n\n  return ::setxattr(SelfPath, name, value, size, flags);\n}\n\nuint64_t FileManager::LSetxattr(const char* path, const char* name, const void* value, size_t size, int flags) {\n  auto NewPath = GetSelf(path);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  auto Path = GetEmulatedPath(SelfPath, false);\n  if (!Path.empty()) {\n    uint64_t Result = ::lsetxattr(Path.c_str(), name, value, size, flags);\n    if (Result != -1 || errno != ENOENT) {\n      return Result;\n    }\n  }\n\n  return ::lsetxattr(SelfPath, name, value, size, flags);\n}\n\nuint64_t FileManager::Getxattr(const char* path, const char* name, void* value, size_t size) {\n  auto NewPath = GetSelf(path);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  auto Path = GetEmulatedPath(SelfPath, true);\n  if (!Path.empty()) {\n    uint64_t Result = ::getxattr(Path.c_str(), name, value, size);\n    if (Result != -1 || errno != ENOENT) {\n      return Result;\n    }\n  }\n\n  return ::getxattr(SelfPath, name, value, size);\n}\n\nuint64_t FileManager::LGetxattr(const char* path, const char* name, void* value, size_t size) {\n  auto NewPath = GetSelf(path);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  auto Path = GetEmulatedPath(SelfPath, false);\n  if (!Path.empty()) {\n    uint64_t Result = ::lgetxattr(Path.c_str(), name, value, size);\n    if (Result != -1 || errno != ENOENT) {\n      return Result;\n    }\n  }\n\n  return ::lgetxattr(SelfPath, name, value, size);\n}\n\nuint64_t FileManager::Listxattr(const char* path, char* list, size_t size) {\n  auto NewPath = GetSelf(path);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  auto Path = GetEmulatedPath(SelfPath, true);\n  if (!Path.empty()) {\n    uint64_t Result = ::listxattr(Path.c_str(), list, size);\n    if (Result != -1 || errno != ENOENT) {\n      return Result;\n    }\n  }\n\n  return ::listxattr(SelfPath, list, size);\n}\n\nuint64_t FileManager::LListxattr(const char* path, char* list, size_t size) {\n  auto NewPath = GetSelf(path);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  auto Path = GetEmulatedPath(SelfPath, false);\n  if (!Path.empty()) {\n    uint64_t Result = ::llistxattr(Path.c_str(), list, size);\n    if (Result != -1 || errno != ENOENT) {\n      return Result;\n    }\n  }\n\n  return ::llistxattr(SelfPath, list, size);\n}\n\nuint64_t FileManager::Removexattr(const char* path, const char* name) {\n  auto NewPath = GetSelf(path);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  auto Path = GetEmulatedPath(SelfPath, true);\n  if (!Path.empty()) {\n    uint64_t Result = ::removexattr(Path.c_str(), name);\n    if (Result != -1 || errno != ENOENT) {\n      return Result;\n    }\n  }\n\n  return ::removexattr(SelfPath, name);\n}\n\nuint64_t FileManager::LRemovexattr(const char* path, const char* name) {\n  auto NewPath = GetSelf(path);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  auto Path = GetEmulatedPath(SelfPath, false);\n  if (!Path.empty()) {\n    uint64_t Result = ::lremovexattr(Path.c_str(), name);\n    if (Result != -1 || errno != ENOENT) {\n      return Result;\n    }\n  }\n\n  return ::lremovexattr(SelfPath, name);\n}\n\nuint64_t FileManager::SetxattrAt(int dfd, const char* pathname, uint32_t at_flags, const char* name, const xattr_args* uargs, size_t usize) {\n  if (IsSelfNoFollow(pathname, at_flags)) {\n    // See Statx\n    return syscall(SYSCALL_DEF(setxattrat), dfd, pathname, at_flags, name, uargs, usize);\n  }\n\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  FDPathTmpData TmpFilename;\n  auto Path = GetEmulatedFDPath(dfd, SelfPath, (at_flags & AT_SYMLINK_NOFOLLOW) == 0, TmpFilename);\n  if (Path.FD != -1) {\n    uint64_t Result = syscall(SYSCALL_DEF(setxattrat), Path.FD, Path.Path, at_flags, name, uargs, usize);\n    if (Result != -1) {\n      return Result;\n    }\n  }\n  return syscall(SYSCALL_DEF(setxattrat), dfd, SelfPath, at_flags, name, uargs, usize);\n}\n\nuint64_t FileManager::GetxattrAt(int dfd, const char* pathname, uint32_t at_flags, const char* name, const xattr_args* uargs, size_t usize) {\n  if (IsSelfNoFollow(pathname, at_flags)) {\n    // See Statx\n    return syscall(SYSCALL_DEF(getxattrat), dfd, pathname, at_flags, name, uargs, usize);\n  }\n\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  FDPathTmpData TmpFilename;\n  auto Path = GetEmulatedFDPath(dfd, SelfPath, (at_flags & AT_SYMLINK_NOFOLLOW) == 0, TmpFilename);\n  if (Path.FD != -1) {\n    uint64_t Result = syscall(SYSCALL_DEF(getxattrat), Path.FD, Path.Path, at_flags, name, uargs, usize);\n    if (Result != -1) {\n      return Result;\n    }\n  }\n  return syscall(SYSCALL_DEF(getxattrat), dfd, SelfPath, at_flags, name, uargs, usize);\n}\n\nuint64_t FileManager::ListxattrAt(int dfd, const char* pathname, uint32_t at_flags, char* list, size_t size) {\n  if (IsSelfNoFollow(pathname, at_flags)) {\n    // See Statx\n    return syscall(SYSCALL_DEF(listxattrat), dfd, pathname, at_flags, list, size);\n  }\n\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  FDPathTmpData TmpFilename;\n  auto Path = GetEmulatedFDPath(dfd, SelfPath, (at_flags & AT_SYMLINK_NOFOLLOW) == 0, TmpFilename);\n  if (Path.FD != -1) {\n    uint64_t Result = syscall(SYSCALL_DEF(listxattrat), Path.FD, Path.Path, at_flags, list, size);\n    if (Result != -1) {\n      return Result;\n    }\n  }\n  return syscall(SYSCALL_DEF(listxattrat), dfd, SelfPath, at_flags, list, size);\n}\n\nuint64_t FileManager::RemovexattrAt(int dfd, const char* pathname, uint32_t at_flags, const char* name) {\n  if (IsSelfNoFollow(pathname, at_flags)) {\n    // See Statx\n    return syscall(SYSCALL_DEF(removexattrat), dfd, pathname, at_flags, name);\n  }\n\n  auto NewPath = GetSelf(pathname);\n  const char* SelfPath = NewPath ? NewPath->data() : nullptr;\n\n  FDPathTmpData TmpFilename;\n  auto Path = GetEmulatedFDPath(dfd, SelfPath, (at_flags & AT_SYMLINK_NOFOLLOW) == 0, TmpFilename);\n  if (Path.FD != -1) {\n    uint64_t Result = syscall(SYSCALL_DEF(removexattrat), Path.FD, Path.Path, at_flags, name);\n    if (Result != -1) {\n      return Result;\n    }\n  }\n  return syscall(SYSCALL_DEF(removexattrat), dfd, SelfPath, at_flags, name);\n}\n\nvoid FileManager::UpdatePID(uint32_t PID) {\n  CurrentPID = PID;\n\n  // Track the inode of /proc/self/fd/<RootFSFD>, to be able to hide it\n  auto FDpath = fextl::fmt::format(\"self/fd/{}\", RootFSFD);\n  struct stat Buffer {};\n  int Result = fstatat(ProcFD, FDpath.c_str(), &Buffer, AT_SYMLINK_NOFOLLOW);\n  if (Result >= 0) {\n    RootFSFDInode = Buffer.st_ino;\n  } else {\n    // Probably in a strict sandbox\n    RootFSFDInode = 0;\n    ProcFDInode = 0;\n    return;\n  }\n\n  // And track the ProcFSFD itself\n  FDpath = fextl::fmt::format(\"self/fd/{}\", ProcFD);\n  Result = fstatat(ProcFD, FDpath.c_str(), &Buffer, AT_SYMLINK_NOFOLLOW);\n  if (Result >= 0) {\n    ProcFDInode = Buffer.st_ino;\n  } else {\n    // ??\n    ProcFDInode = 0;\n    return;\n  }\n}\n\nbool FileManager::IsProtectedFile(int ParentDirFD, uint64_t inode) const {\n  // Check if we have to hide this entry\n  const char* Match = nullptr;\n  if (inode == RootFSFDInode) {\n    Match = \"RootFS\";\n  } else if (inode == ProcFDInode) {\n    Match = \"/proc\";\n  } else if (inode == CodeMapInode) {\n    Match = \"code map\";\n  }\n  if (Match) {\n    struct stat Buffer;\n    if (fstat(ParentDirFD, &Buffer) >= 0) {\n      if (Buffer.st_dev == ProcFSDev) {\n        LogMan::Msg::DFmt(\"Hiding directory entry for {} FD\", Match);\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\nvoid FileManager::SetProtectedCodeMapFD(int FD) {\n  if (FD == -1) {\n    CodeMapInode = 0;\n    return;\n  }\n\n  auto FDPath = fextl::fmt::format(\"self/fd/{}\", FD);\n  struct stat Buffer {};\n  auto Result = fstatat(ProcFD, FDPath.c_str(), &Buffer, AT_SYMLINK_NOFOLLOW);\n  if (Result >= 0) {\n    CodeMapInode = Buffer.st_ino;\n  } else {\n    CodeMapInode = 0;\n  }\n}\n\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/FileManagement.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|common\n$end_info$\n*/\n\n#pragma once\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/set.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/unordered_map.h>\n#include <FEXCore/fextl/unordered_set.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <array>\n#include <cstddef>\n#include <cstdint>\n#include <fcntl.h>\n#include <functional>\n#include <mutex>\n#include <linux/limits.h>\n#include <optional>\n#include <sys/stat.h>\n#include <unistd.h>\n\n#include \"LinuxSyscalls/EmulatedFiles/EmulatedFiles.h\"\n\nnamespace FEXCore::Context {\nclass Context;\n}\n\nnamespace FEX::HLE {\n[[maybe_unused]]\nstatic bool IsSymlink(int FD, const char* Filename) {\n  // Checks to see if a filepath is a symlink.\n  struct stat Buffer {};\n  int Result = fstatat(FD, Filename, &Buffer, AT_SYMLINK_NOFOLLOW);\n  return Result == 0 && S_ISLNK(Buffer.st_mode);\n}\n\n[[maybe_unused]]\nstatic ssize_t GetSymlink(int FD, const char* Filename, char* ResultBuffer, size_t ResultBufferSize) {\n  return readlinkat(FD, Filename, ResultBuffer, ResultBufferSize);\n}\n\nstruct open_how;\n\nclass FileManager final {\npublic:\n  FileManager() = delete;\n  FileManager(FileManager&&) = delete;\n\n  FileManager(FEXCore::Context::Context* ctx);\n  ~FileManager();\n  uint64_t Open(const char* pathname, int flags, uint32_t mode);\n  uint64_t Close(int fd);\n  uint64_t CloseRange(unsigned int first, unsigned int last, unsigned int flags);\n  uint64_t Stat(const char* pathname, void* buf);\n  uint64_t Lstat(const char* path, void* buf);\n  uint64_t Access(const char* pathname, int mode);\n  uint64_t FAccessat(int dirfd, const char* pathname, int mode);\n  uint64_t FAccessat2(int dirfd, const char* pathname, int mode, int flags);\n  uint64_t Readlink(const char* pathname, char* buf, size_t bufsiz);\n  uint64_t Chmod(const char* pathname, mode_t mode);\n  uint64_t Readlinkat(int dirfd, const char* pathname, char* buf, size_t bufsiz);\n  uint64_t Openat(int dirfs, const char* pathname, int flags, uint32_t mode);\n  uint64_t Openat2(int dirfs, const char* pathname, FEX::HLE::open_how* how, size_t usize);\n  uint64_t Statx(int dirfd, const char* pathname, int flags, uint32_t mask, struct statx* statxbuf);\n  uint64_t Mknod(const char* pathname, mode_t mode, dev_t dev);\n  uint64_t NewFSStatAt(int dirfd, const char* pathname, struct stat* buf, int flag);\n  uint64_t NewFSStatAt64(int dirfd, const char* pathname, struct stat64* buf, int flag);\n  uint64_t Setxattr(const char* path, const char* name, const void* value, size_t size, int flags);\n  uint64_t LSetxattr(const char* path, const char* name, const void* value, size_t size, int flags);\n  uint64_t Getxattr(const char* path, const char* name, void* value, size_t size);\n  uint64_t LGetxattr(const char* path, const char* name, void* value, size_t size);\n  uint64_t Listxattr(const char* path, char* list, size_t size);\n  uint64_t LListxattr(const char* path, char* list, size_t size);\n  uint64_t Removexattr(const char* path, const char* name);\n  uint64_t LRemovexattr(const char* path, const char* name);\n  struct xattr_args {\n    uint64_t value;\n    uint32_t size;\n    uint32_t flags;\n  };\n\n  uint64_t SetxattrAt(int dfd, const char* pathname, uint32_t at_flags, const char* name, const xattr_args* uargs, size_t usize);\n  uint64_t GetxattrAt(int dfd, const char* pathname, uint32_t at_flags, const char* name, const xattr_args* uargs, size_t usize);\n  uint64_t ListxattrAt(int dfd, const char* pathname, uint32_t at_flags, char* list, size_t size);\n  uint64_t RemovexattrAt(int dfd, const char* pathname, uint32_t at_flags, const char* name);\n\n  // vfs\n  uint64_t Statfs(const char* path, void* buf);\n\n  void UpdatePID(uint32_t PID);\n  // Helper to detect FEX-internal files from their inode and parent directory FD.\n  // This is useful to deal with Chromium/CEF, which closes any FDs reported in /proc/self/fd/.\n  bool IsProtectedFile(int ParentDirFD, uint64_t inode) const;\n  void SetProtectedCodeMapFD(int FD);\n\n  fextl::string GetEmulatedPath(const char* pathname, bool FollowSymlink = false) const;\n  fextl::string GetHostPath(fextl::string& Path, bool AliasedOnly) const;\n\n  bool ReplaceEmuFd(int fd, int flags, uint32_t mode);\n\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  void TrackFEXFD(int FD) noexcept {\n    std::lock_guard lk(FEXTrackingFDMutex);\n    FEXTrackingFDs.emplace(FD);\n  }\n\n  void RemoveFEXFD(int FD) noexcept {\n    std::lock_guard lk(FEXTrackingFDMutex);\n    FEXTrackingFDs.erase(FD);\n  }\n\n  void RemoveFEXFDRange(int begin, int end) noexcept {\n    std::lock_guard lk(FEXTrackingFDMutex);\n\n    std::erase_if(FEXTrackingFDs, [begin, end](int FD) { return FD >= begin && (FD <= end || end == -1); });\n  }\n\n  bool CheckIfFDInTrackedSet(int FD) const noexcept {\n    std::lock_guard lk(FEXTrackingFDMutex);\n    return FEXTrackingFDs.contains(FD);\n  }\n\n  bool CheckIfFDRangeInTrackedSet(int begin, int end) const noexcept {\n    std::lock_guard lk(FEXTrackingFDMutex);\n    // Just linear scan since the number of tracking FDs is low.\n    for (auto it : FEXTrackingFDs) {\n      if (it >= begin && (it <= end || end == -1)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n#else\n  void TrackFEXFD(int FD) const noexcept {}\n  bool CheckIfFDInTrackedSet(int FD) const noexcept {\n    return false;\n  }\n  void RemoveFEXFD(int FD) const noexcept {}\n  void RemoveFEXFDRange(int begin, int end) const noexcept {}\n  bool CheckIfFDRangeInTrackedSet(int begin, int end) const noexcept {\n    return false;\n  }\n#endif\n\nprivate:\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  mutable std::mutex FEXTrackingFDMutex;\n  fextl::set<int> FEXTrackingFDs;\n#endif\n\n  using FDPathTmpData = std::array<char[PATH_MAX], 2>;\n  struct EmulatedFDPathResult final {\n    int FD;\n    const char* Path;\n  };\n  EmulatedFDPathResult GetEmulatedFDPath(int dirfd, const char* pathname, bool FollowSymlink, FDPathTmpData& TmpFilename) const;\n\n  std::optional<std::string_view> GetSelf(const char* Pathname) const;\n  bool IsSelfNoFollow(const char* Pathname, int flags) const;\n\n  bool RootFSPathExists(const char* Filepath) const;\n  size_t GetRootFSPrefixLen(const char* pathname, size_t len, bool AliasedOnly) const;\n  ssize_t StripRootFSPrefix(char* pathname, ssize_t len, bool leaky) const;\n\n  struct ThunkDBObject {\n    fextl::string LibraryName;\n    fextl::unordered_set<fextl::string> Depends;\n    fextl::vector<fextl::string> Overlays;\n    bool Enabled {};\n  };\n  void LoadThunkDatabase(fextl::unordered_map<fextl::string, ThunkDBObject>& ThunkDB, bool Global);\n  FEX::EmulatedFile::EmulatedFDManager EmuFD;\n\n  fextl::map<fextl::string, fextl::string, std::less<>> ThunkOverlays;\n\n  FEX_CONFIG_OPT(Filename, APP_FILENAME);\n  FEX_CONFIG_OPT(LDPath, ROOTFS);\n  FEX_CONFIG_OPT(ThunkGuestLibs, THUNKGUESTLIBS);\n  FEX_CONFIG_OPT(ThunkConfig, THUNKCONFIG);\n  FEX_CONFIG_OPT(AppConfigName, APP_CONFIG_NAME);\n  FEX_CONFIG_OPT(Is64BitMode, IS64BIT_MODE);\n  uint32_t CurrentPID {};\n  int RootFSFD {AT_FDCWD};\n  int ProcFD {0};\n  int64_t RootFSFDInode = 0;\n  int64_t ProcFDInode = 0;\n  int64_t CodeMapInode = 0;\n  dev_t ProcFSDev;\n};\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/GdbServer.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: glue|gdbserver\ndesc: Provides a gdb interface to the guest state\n$end_info$\n*/\n\n#include \"CodeLoader.h\"\n#include \"GdbServer/Info.h\"\n\n#include <cstdlib>\n#include <cstdio>\n#include <iomanip>\n#include <memory>\n#include <optional>\n#include <string_view>\n\n#include <Common/FEXServerClient.h>\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/SignalDelegator.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/FileLoading.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/StringUtils.h>\n#include <FEXCore/Utils/Threads.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/sstream.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXHeaderUtils/Filesystem.h>\n\n#include <atomic>\n#include <cstring>\n#ifndef _WIN32\n#include <elf.h>\n#include <netdb.h>\n#include <sys/socket.h>\n#endif\n#include <errno.h>\n#include <fcntl.h>\n#include <signal.h>\n#include <stddef.h>\n#include <string_view>\n#include <sys/stat.h>\n#include <sys/un.h>\n#include <sys/utsname.h>\n#include <unistd.h>\n#include <utility>\n\n#include \"LinuxSyscalls/GdbServer.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/ThreadManager.h\"\n\nnamespace FEX {\n\n#ifndef _WIN32\nvoid GdbServer::Break(FEXCore::Core::InternalThreadState* Thread, int signal) {\n  std::lock_guard lk(sendMutex);\n  if (!CommsSocket) {\n    return;\n  }\n\n  auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromFEXCoreThread(Thread);\n  // Current debugging thread switches to the thread that is breaking.\n  CurrentDebuggingThread = ThreadObject->ThreadInfo.TID.load();\n\n  const auto str = fextl::fmt::format(\"T{:02x}thread:{:x};\", signal, CurrentDebuggingThread);\n  SendPacket(*CommsSocket, str);\n}\n\nvoid GdbServer::WaitForThreadWakeup() {\n  // Wait for gdbserver to tell us to wake up\n  ThreadBreakEvent.Wait();\n}\n\nGdbServer::~GdbServer() {\n  CloseListenSocket();\n\n  if (gdbServerThread->joinable()) {\n    gdbServerThread->join(nullptr);\n  }\n}\n\nGdbServer::GdbServer(FEXCore::Context::Context* ctx, FEX::HLE::SignalDelegator* SignalDelegation, FEX::HLE::SyscallHandler* const SyscallHandler)\n  : CTX(ctx)\n  , SyscallHandler {SyscallHandler}\n  , SignalDelegation {SignalDelegation} {\n  // Pass all signals by default\n  std::fill(PassSignals.begin(), PassSignals.end(), true);\n\n  // This is a total hack as there is currently no way to resume once hitting a segfault\n  // But it's semi-useful for debugging.\n  for (uint32_t Signal = 0; Signal <= FEX::HLE::SignalDelegator::MAX_SIGNALS; ++Signal) {\n    SignalDelegation->RegisterHostSignalHandler(\n      Signal,\n      [this](FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext) {\n        if (PassSignals[Signal]) {\n          // Pass signal to the guest\n          return false;\n        }\n\n        auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromFEXCoreThread(Thread);\n        ThreadObject->GdbInfo = {};\n        ThreadObject->GdbInfo->Signal = Signal;\n\n        this->SignalDelegation->SpillSRA(Thread, ucontext, Thread->CurrentFrame->InSyscallInfo);\n\n        // Let GDB know that we have a signal\n        this->Break(Thread, Signal);\n\n        WaitForThreadWakeup();\n        ThreadObject->GdbInfo.reset();\n\n        return true;\n      },\n      true);\n  }\n\n  StartThread();\n}\n\nstatic int calculateChecksum(const fextl::string& packet) {\n  unsigned char checksum = 0;\n  for (const char& c : packet) {\n    checksum += c;\n  }\n  return checksum;\n}\n\nstatic fextl::string hexstring(fextl::istringstream& ss, int delm) {\n  fextl::string ret;\n\n  char hexString[3] = {0, 0, 0};\n  while (ss.peek() != delm) {\n    ss.read(hexString, 2);\n    int c = std::strtoul(hexString, nullptr, 16);\n    ret.push_back((char)c);\n  }\n\n  if (delm != -1) {\n    ss.get();\n  }\n\n  return ret;\n}\n\nstatic fextl::string appendHex(const char* data, size_t length) {\n  return fextl::fmt::format(\"{:02x}\", fmt::join(data, data + length, \"\"));\n}\n\nstatic fextl::string encodeHex(const unsigned char* data, size_t length) {\n  fextl::ostringstream ss;\n\n  for (size_t i = 0; i < length; i++) {\n    ss << std::setfill('0') << std::setw(2) << std::hex << int(data[i]);\n  }\n  return ss.str();\n}\n\nstatic fextl::string encodeHex(std::string_view str) {\n  return encodeHex(reinterpret_cast<const unsigned char*>(str.data()), str.size());\n}\n\n// Packet parser\n// Takes a serial stream and reads a single packet\n// Un-escapes chars, checks the checksum and request a retransmit if it fails.\n// Once the checksum is validated, it acknowledges and returns the packet in a string\nfextl::string GdbServer::ReadPacket(const std::span<std::byte>& RawMessage) {\n  fextl::string packet {};\n\n  // The GDB \"Remote Serial Protocal\" was originally 7bit clean for use on serial ports.\n  // Binary data is useally hex encoded. However some later extentions just put\n  // raw 8bit binary data.\n\n  // Packets are in the format\n  // $<data>#<checksum>\n  // where any $ or # in the packet body are escaped ('}' followed by the char XORed with 0x20)\n  // The checksum is a single unsigned byte sum of the data, hex encoded.\n\n  if (RawMessage.empty() || (char)RawMessage[0] != '$') {\n    ERROR_AND_DIE_FMT(\"Expected GDB protocol messages to start with '$'\");\n  }\n\n  for (auto It = std::next(RawMessage.begin()); It != RawMessage.end(); ++It) {\n    char c = (char)*It;\n    switch (c) {\n    case '$': // start of packet\n      ERROR_AND_DIE_FMT(\"Unescaped control character\");\n      break;\n\n    case '}': // escape char\n    {\n      if (std::next(It) == RawMessage.end()) {\n        ERROR_AND_DIE_FMT(\"Missing character after escape indicator\");\n      }\n      char escaped = (char)*++It;\n      packet.push_back(escaped ^ 0x20);\n      break;\n    }\n\n    case '#': // end of packet\n    {\n      if (RawMessage.end() - It <= 2) {\n        ERROR_AND_DIE_FMT(\"Missing checksum at end of packet\");\n      }\n\n      char hexString[3] = {0, 0, 0};\n      hexString[0] = (char)*++It;\n      hexString[1] = (char)*++It;\n      int expected_checksum = std::strtoul(hexString, nullptr, 16);\n\n      if (calculateChecksum(packet) == expected_checksum) {\n        return packet;\n      } else {\n        LogMan::Msg::EFmt(\"Received Invalid Packet: ${}#{:02x}\", packet, expected_checksum);\n      }\n      break;\n    }\n\n    default: packet.push_back(c); break;\n    }\n  }\n\n  return \"\";\n}\n\nstatic fextl::string escapePacket(const fextl::string& packet) {\n  fextl::ostringstream ss;\n\n  for (const auto& c : packet) {\n    switch (c) {\n    case '$':\n    case '#':\n    case '*':\n    case '}': {\n      char escaped = c ^ 0x20;\n      ss << '}' << (escaped);\n      break;\n    }\n    default: ss << c; break;\n    }\n  }\n\n  return ss.str();\n}\n\nvoid GdbServer::SendPacket(fasio::tcp_socket& Socket, const fextl::string& packet) {\n  const auto escaped = escapePacket(packet);\n  auto str = fextl::fmt::format(\"${}#{:02x}\", escaped, calculateChecksum(escaped));\n\n  fasio::error ec;\n  write(Socket, fasio::mutable_buffer {std::as_writable_bytes(std::span {str})}, ec);\n}\n\nvoid GdbServer::SendACK(fasio::tcp_socket& Socket, bool NACK) {\n  if (NoAckMode) {\n    return;\n  }\n\n  if (NACK) {\n    std::string_view message = \"-\";\n    send(Socket.FD, message.data(), message.size(), 0);\n  } else {\n    std::string_view message = \"+\";\n    send(Socket.FD, message.data(), message.size(), 0);\n  }\n\n  if (SettingNoAckMode) {\n    NoAckMode = true;\n    SettingNoAckMode = false;\n  }\n}\n\nconst FEX::HLE::ThreadStateObject* GdbServer::FindThreadByTID(uint32_t TID) {\n  auto Threads = SyscallHandler->TM.GetThreads();\n\n  for (auto& Thread : *Threads) {\n    if (Thread->ThreadInfo.TID != TID) {\n      continue;\n    }\n\n    return Thread;\n  }\n\n  // Return parent thread if TID isn't found.\n  return Threads->at(0);\n}\n\nGdbServer::GDBContextDefinition GdbServer::GenerateContextDefinition(const FEX::HLE::ThreadStateObject* ThreadObject) {\n  GDBContextDefinition GDB {};\n  FEXCore::Core::CPUState state {};\n\n  // Copy the thread state.\n  memcpy(&state, ThreadObject->Thread->CurrentFrame, sizeof(state));\n\n  // Encode the GDB context definition\n  memcpy(&GDB.gregs[0], &state.gregs[0], sizeof(GDB.gregs));\n  GDB.rip = ThreadObject->Thread->CurrentFrame->State.rip;\n  GDB.eflags = CTX->ReconstructCompactedEFLAGS(ThreadObject->Thread, false, nullptr, 0);\n\n  for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_MMS; ++i) {\n    memcpy(&GDB.mm[i], &state.mm[i], sizeof(GDB.mm[i]));\n  }\n\n  GDB.fctrl = state.FCW;\n\n  GDB.fstat = static_cast<uint32_t>(state.flags[FEXCore::X86State::X87FLAG_TOP_LOC]) << 11;\n  GDB.fstat |= static_cast<uint32_t>(state.flags[FEXCore::X86State::X87FLAG_C0_LOC]) << 8;\n  GDB.fstat |= static_cast<uint32_t>(state.flags[FEXCore::X86State::X87FLAG_C1_LOC]) << 9;\n  GDB.fstat |= static_cast<uint32_t>(state.flags[FEXCore::X86State::X87FLAG_C2_LOC]) << 10;\n  GDB.fstat |= static_cast<uint32_t>(state.flags[FEXCore::X86State::X87FLAG_C3_LOC]) << 14;\n  GDB.fstat |= static_cast<uint32_t>(state.flags[FEXCore::X86State::X87FLAG_IE_LOC]);\n\n  __uint128_t XMM_Low[FEXCore::Core::CPUState::NUM_XMMS];\n  __uint128_t YMM_High[FEXCore::Core::CPUState::NUM_XMMS];\n\n  CTX->ReconstructXMMRegisters(ThreadObject->Thread, XMM_Low, YMM_High);\n  for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_XMMS; ++i) {\n    memcpy(&GDB.xmm[i][0], &XMM_Low[i], sizeof(__uint128_t));\n    memcpy(&GDB.xmm[i][2], &YMM_High[i], sizeof(__uint128_t));\n  }\n\n  return GDB;\n}\n\nvoid GdbServer::buildLibraryMap() {\n  if (!LibraryMapChanged) {\n    // No need to update\n    return;\n  }\n\n  fextl::ostringstream xml;\n\n  fextl::string MapsFile;\n  FEXCore::FileLoading::LoadFile(MapsFile, \"/proc/self/maps\");\n  fextl::istringstream MapsStream(MapsFile);\n\n  fextl::string Line;\n\n  struct FileData {\n    uint64_t Begin;\n  };\n\n  fextl::map<fextl::string, fextl::vector<FileData>> SegmentMaps;\n\n  // 7ff5dd6d2000-7ff5dd6d3000 rw-p 0000a000 103:0b 1881447                   /usr/lib/x86_64-linux-gnu/libnss_compat.so.2\n  const fextl::string& RuntimeExecutable = Filename();\n  while (std::getline(MapsStream, Line)) {\n    auto ss = fextl::istringstream(Line);\n    fextl::string Tmp;\n    fextl::string Begin;\n    fextl::string Name;\n    std::getline(ss, Begin, '-');\n    std::getline(ss, Tmp, ' '); // End\n    std::getline(ss, Tmp, ' '); // Perm\n    std::getline(ss, Tmp, ' '); // Inode\n    std::getline(ss, Tmp, ' '); // devid\n    std::getline(ss, Tmp, ' '); // Some garbage\n    std::getline(ss, Name, '\\n');\n\n    if (strstr(Name.c_str(), \"aarch64\") != nullptr) {\n      // If the library comes from aarch64, just skip it\n      // Reduces the amount of memory gdb fetches\n      continue;\n    }\n\n    Name = FEXCore::StringUtils::Trim(Name);\n\n    struct stat sb {};\n    if (stat(Name.c_str(), &sb) != -1) {\n      if (S_ISCHR(sb.st_mode)) {\n        // Skip this special file type\n        // Fixes GDB trying to read dri render nodes\n        continue;\n      }\n    }\n\n    // Skip empty entries, the entry from the process, and also anything like [heap]\n    if (!Name.empty() && Name != RuntimeExecutable && Name[0] != '[') {\n      FileData data {\n        .Begin = std::strtoul(Begin.c_str(), nullptr, 16),\n      };\n\n      SegmentMaps[Name].emplace_back(data);\n    }\n  }\n\n  xml << \"<library-list>\\n\";\n  for (auto& Array : SegmentMaps) {\n    xml << \"\\t<library name=\\\"\" << Array.first << \"\\\">\\n\";\n    for (auto& Data : Array.second) {\n      xml << \"\\t\\t<segment address=\\\"0x\" << std::hex << Data.Begin << \"\\\"/>\\n\";\n    }\n    xml << \"\\t</library>\\n\";\n  }\n\n  xml << \"</library-list>\\n\";\n\n  LibraryMapString = xml.str();\n  LibraryMapChanged = false;\n}\n\n// Binary data transfer handlers\n\nGdbServer::HandledPacketType GdbServer::XferCommandExecFile(const fextl::string& annex, int offset, int length) {\n  int annex_pid;\n  if (annex.empty()) {\n    annex_pid = getpid();\n  } else {\n    auto ss_pid = fextl::istringstream(annex);\n    ss_pid >> std::hex >> annex_pid;\n  }\n\n  if (annex_pid == getpid()) {\n    return {EncodeXferString(Filename(), offset, length), HandledPacketType::TYPE_ACK};\n  }\n\n  return {\"E00\", HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::XferCommandFeatures(const fextl::string& annex, int offset, int length) {\n  if (annex == \"target.xml\") {\n    return {EncodeXferString(GDB::Info::BuildTargetXML(Is64BitMode()), offset, length), HandledPacketType::TYPE_ACK};\n  }\n\n  return {\"E00\", HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::XferCommandThreads(const fextl::string& annex, int offset, int length) {\n  if (offset == 0) {\n    auto Threads = SyscallHandler->TM.GetThreads();\n\n    ThreadString.clear();\n    fextl::ostringstream ss;\n    ss << \"<threads>\\n\";\n    for (auto& Thread : *Threads) {\n      // Thread id is in hex without 0x prefix\n      const auto ThreadName = GDB::Info::GetThreadName(::getpid(), Thread->ThreadInfo.TID);\n      ss << \"<thread id=\\\"\" << std::hex << Thread->ThreadInfo.TID << \"\\\"\";\n      if (!ThreadName.empty()) {\n        ss << \" name=\\\"\" << ThreadName << \"\\\"\";\n      }\n      ss << \"/>\\n\";\n    }\n\n    ss << \"</threads>\\n\";\n    ss << std::flush;\n    ThreadString = ss.str();\n  }\n\n  return {EncodeXferString(ThreadString, offset, length), HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::XferCommandOSData(const fextl::string& annex, int offset, int length) {\n  if (offset == 0) {\n    OSDataString = GDB::Info::BuildOSXML();\n  }\n  return {EncodeXferString(OSDataString, offset, length), HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::XferCommandLibraries(const fextl::string& annex, int offset, int length) {\n  if (offset == 0) {\n    // Attempt to rebuild when reading from zero\n    buildLibraryMap();\n  }\n  return {EncodeXferString(LibraryMapString, offset, length), HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::XferCommandAuxv(const fextl::string& annex, int offset, int length) {\n  const auto* CodeLoader = SyscallHandler->GetCodeLoader();\n  const auto [auxv_ptr, auxv_size] = CodeLoader->GetAuxv();\n\n  fextl::string data;\n  if (Is64BitMode()) {\n    data.resize(auxv_size);\n    memcpy(data.data(), reinterpret_cast<void*>(auxv_ptr), data.size());\n  } else {\n    // We need to transcode from 32-bit auxv_t to 64-bit\n    data.resize(auxv_size / sizeof(Elf32_auxv_t) * sizeof(Elf64_auxv_t));\n    size_t NumAuxv = auxv_size / sizeof(Elf32_auxv_t);\n    for (size_t i = 0; i < NumAuxv; ++i) {\n      Elf32_auxv_t* auxv = reinterpret_cast<Elf32_auxv_t*>(auxv_ptr + i * sizeof(Elf32_auxv_t));\n      Elf64_auxv_t tmp;\n      tmp.a_type = auxv->a_type;\n      tmp.a_un.a_val = auxv->a_un.a_val;\n      memcpy(data.data() + i * sizeof(Elf64_auxv_t), &tmp, sizeof(Elf64_auxv_t));\n    }\n  }\n\n  return {EncodeXferString(data, offset, length), HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::handleXfer(const fextl::string& packet) {\n  fextl::string object;\n  fextl::string rw;\n  fextl::string annex;\n  int offset;\n  int length;\n\n  // Parse Xfer message\n  {\n    auto ss = fextl::istringstream(packet);\n    fextl::string expectXfer;\n    char expectComma;\n\n    std::getline(ss, expectXfer, ':');\n    std::getline(ss, object, ':');\n    std::getline(ss, rw, ':');\n    std::getline(ss, annex, ':');\n\n    ss >> std::hex >> offset;\n    ss.get(expectComma);\n    ss >> std::hex >> length;\n\n    // Bail on any errors\n    if (ss.fail() || !ss.eof() || expectXfer != \"qXfer\" || rw != \"read\" || expectComma != ',') {\n      return {\"E00\", HandledPacketType::TYPE_ACK};\n    }\n  }\n\n  // Specific object documentation: https://sourceware.org/gdb/current/onlinedocs/gdb.html/General-Query-Packets.html#qXfer-read\n  if (object == \"auxv\") {\n    return XferCommandAuxv(annex, offset, length);\n  }\n\n  // btrace\n  // btrace-conf\n\n  if (object == \"exec-file\") {\n    return XferCommandExecFile(annex, offset, length);\n  }\n\n  if (object == \"features\") {\n    return XferCommandFeatures(annex, offset, length);\n  }\n\n  if (object == \"libraries\") {\n    return XferCommandLibraries(annex, offset, length);\n  }\n\n  // libraries-svr4\n  // memory-map\n  // sdata\n  // siginfo:read\n  // siginfo:write\n\n  if (object == \"threads\") {\n    return XferCommandThreads(annex, offset, length);\n  }\n\n  // traceframe-info\n  // uib\n  // fdpic\n\n  if (object == \"osdata\") {\n    return XferCommandOSData(annex, offset, length);\n  }\n\n  return {\"\", HandledPacketType::TYPE_UNKNOWN};\n}\n\nstatic size_t CheckMemMapping(uint64_t Address, size_t Size) {\n  uint64_t AddressEnd = Address + Size;\n  fextl::string MapsFile;\n  FEXCore::FileLoading::LoadFile(MapsFile, \"/proc/self/maps\");\n  fextl::istringstream MapsStream(MapsFile);\n\n  fextl::string Line;\n\n  while (std::getline(MapsStream, Line)) {\n    if (MapsStream.eof()) {\n      break;\n    }\n    uint64_t Begin, End;\n    char r, w, x, p;\n    if (sscanf(Line.c_str(), \"%lx-%lx %c%c%c%c\", &Begin, &End, &r, &w, &x, &p) == 6) {\n      if (Begin <= Address && End > Address) {\n        ssize_t Overrun {};\n        if (AddressEnd > End) {\n          Overrun = AddressEnd - End;\n        }\n        return Size - Overrun;\n      }\n    }\n  }\n\n  return 0;\n}\n\nGdbServer::HandledPacketType GdbServer::handleProgramOffsets() {\n  auto CodeLoader = SyscallHandler->GetCodeLoader();\n  uint64_t BaseOffset = CodeLoader->GetBaseOffset();\n  fextl::string str = fextl::fmt::format(\"Text={:x};Data={:x};Bss={:x}\", BaseOffset, BaseOffset, BaseOffset);\n  return {std::move(str), HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::ThreadAction(char action, uint32_t tid) {\n  switch (action) {\n  case 'c': {\n    SyscallHandler->TM.Run();\n    ThreadBreakEvent.NotifyAll();\n    SyscallHandler->TM.WaitForThreadsToRun();\n    return {\"\", HandledPacketType::TYPE_ONLYACK};\n  }\n  case 's': {\n    SyscallHandler->TM.Step();\n    SendPacketPair({\"OK\", HandledPacketType::TYPE_ACK});\n    fextl::string str = fextl::fmt::format(\"T05thread:{:02x};\", getpid());\n    if (LibraryMapChanged) {\n      // If libraries have changed then let gdb know\n      str += \"library:1;\";\n    }\n\n    SendPacketPair({std::move(str), HandledPacketType::TYPE_ACK});\n    return {\"OK\", HandledPacketType::TYPE_ACK};\n  }\n  case 't':\n    // This thread isn't part of the thread pool\n    SyscallHandler->TM.Stop();\n    return {\"OK\", HandledPacketType::TYPE_ACK};\n  default: return {\"E00\", HandledPacketType::TYPE_ACK};\n  }\n}\n\n// Command handlers\nGdbServer::HandledPacketType GdbServer::CommandEnableExtendedMode(const fextl::string& packet) {\n  return {\"OK\", HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::CommandQueryHalted(const fextl::string& packet) {\n  // Indicates the reason that the thread has stopped\n  // Behaviour changes if the target is in non-stop mode\n  // Binja doesn't support S response here\n  fextl::string str = fextl::fmt::format(\"T00thread:{:x};\", getpid());\n  return {std::move(str), HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::CommandContinue(const fextl::string& packet) {\n  // Continue\n  return ThreadAction('c', 0);\n}\n\nGdbServer::HandledPacketType GdbServer::CommandDetach(const fextl::string& packet) {\n  // Detach\n  // Ensure the threads are back in running state on detach\n  SyscallHandler->TM.Run();\n  SyscallHandler->TM.WaitForThreadsToRun();\n  return {\"OK\", HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::CommandReadRegisters(const fextl::string& packet) {\n  // We might be running while we try reading\n  // Pause up front\n  SyscallHandler->TM.Pause();\n  const FEX::HLE::ThreadStateObject* CurrentThread = FindThreadByTID(CurrentDebuggingThread);\n  const size_t NumGPR = Is64BitMode() ? FEXCore::Core::CPUState::NUM_GPRS : FEXCore::Core::CPUState::NUM_GPRS / 2;\n  const size_t GPRSize = Is64BitMode() ? sizeof(uint64_t) : sizeof(uint32_t);\n  const size_t NumXMM = Is64BitMode() ? FEXCore::Core::CPUState::NUM_XMMS : FEXCore::Core::CPUState::NUM_XMMS / 2;\n  const size_t XMMSize = Is64BitMode() ? sizeof(__uint128_t) * 2 : sizeof(__uint128_t);\n  fextl::string str;\n  auto GDB = GenerateContextDefinition(CurrentThread);\n  for (size_t i = 0; i < NumGPR; ++i) {\n    str += appendHex(reinterpret_cast<const char*>(&GDB.gregs[i]), GPRSize);\n  }\n  str += appendHex(reinterpret_cast<const char*>(&GDB.rip), GPRSize);\n  str += appendHex(reinterpret_cast<const char*>(&GDB.eflags), sizeof(uint32_t));\n\n  str += appendHex(reinterpret_cast<const char*>(&GDB.cs), sizeof(uint32_t));\n  str += appendHex(reinterpret_cast<const char*>(&GDB.ss), sizeof(uint32_t));\n  str += appendHex(reinterpret_cast<const char*>(&GDB.ds), sizeof(uint32_t));\n  str += appendHex(reinterpret_cast<const char*>(&GDB.es), sizeof(uint32_t));\n  str += appendHex(reinterpret_cast<const char*>(&GDB.fs), sizeof(uint32_t));\n  str += appendHex(reinterpret_cast<const char*>(&GDB.gs), sizeof(uint32_t));\n  for (auto& mm : GDB.mm) {\n    str += appendHex(reinterpret_cast<const char*>(&mm), sizeof(X80Float));\n  }\n\n  str += appendHex(reinterpret_cast<const char*>(&GDB.fctrl), sizeof(uint32_t));\n  str += appendHex(reinterpret_cast<const char*>(&GDB.fstat), sizeof(uint32_t));\n  str += appendHex(reinterpret_cast<const char*>(&GDB.dummies), sizeof(GDB.dummies));\n\n  for (size_t i = 0; i < NumXMM; ++i) {\n    str += appendHex(reinterpret_cast<const char*>(&GDB.xmm[i]), XMMSize);\n  }\n\n  str += appendHex(reinterpret_cast<const char*>(&GDB.mxcsr), sizeof(uint32_t));\n\n  return {std::move(str), HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::CommandThreadOp(const fextl::string& packet) {\n  const auto match = [&](const char* str) -> bool {\n    return packet.rfind(str, 0) == 0;\n  };\n\n  if (match(\"Hc\")) {\n    // Sets thread to this ID for stepping\n    // This is deprecated and vCont should be used instead\n    auto ss = fextl::istringstream(packet);\n    ss.seekg(strlen(\"Hc\"));\n    ss >> std::hex >> CurrentDebuggingThread;\n\n    SyscallHandler->TM.Pause();\n    return {\"OK\", HandledPacketType::TYPE_ACK};\n  }\n\n  if (match(\"Hg\")) {\n    // Sets thread for \"other\" operations\n    auto ss = fextl::istringstream(packet);\n    ss.seekg(strlen(\"Hg\"));\n    ss >> std::hex >> CurrentDebuggingThread;\n\n    // This must return quick otherwise IDA complains\n    SyscallHandler->TM.Pause();\n    return {\"OK\", HandledPacketType::TYPE_ACK};\n  }\n\n  return {\"\", HandledPacketType::TYPE_UNKNOWN};\n}\n\nGdbServer::HandledPacketType GdbServer::CommandKill(const fextl::string& packet) {\n  SyscallHandler->TM.Stop();\n  SyscallHandler->TM.WaitForIdle(); // Block until exit\n  return {\"\", HandledPacketType::TYPE_NONE};\n}\n\nGdbServer::HandledPacketType GdbServer::CommandMemory(const fextl::string& packet) {\n  bool write;\n  size_t addr;\n  size_t length;\n  fextl::string data;\n\n  auto ss = fextl::istringstream(packet);\n  write = ss.get() == 'M';\n  ss >> std::hex >> addr;\n  ss.get(); // discard comma\n  ss >> std::hex >> length;\n\n  if (write) {\n    ss.get();                 // discard colon\n    data = hexstring(ss, -1); // grab data until end of file.\n  }\n\n  // validate packet\n  if (ss.fail() || !ss.eof() || (write && (data.length() != length))) {\n    return {\"E00\", HandledPacketType::TYPE_ACK};\n  }\n\n  length = CheckMemMapping(addr, length);\n  if (length == 0) {\n    return {\"E00\", HandledPacketType::TYPE_ACK};\n  }\n\n  // TODO: check we are in a valid memory range\n  //       Also, clamp length\n  void* ptr = reinterpret_cast<void*>(addr);\n\n  if (write) {\n    std::memcpy(ptr, data.data(), data.length());\n    // TODO: invalidate any code\n    return {\"OK\", HandledPacketType::TYPE_ACK};\n  } else {\n    return {encodeHex((unsigned char*)ptr, length), HandledPacketType::TYPE_ACK};\n  }\n}\n\nGdbServer::HandledPacketType GdbServer::CommandReadReg(const fextl::string& packet) {\n  size_t addr;\n  auto ss = fextl::istringstream(packet);\n  ss.get(); // Drop first letter\n  ss >> std::hex >> addr;\n\n  const FEX::HLE::ThreadStateObject* CurrentThread = FindThreadByTID(CurrentDebuggingThread);\n  auto GDB = GenerateContextDefinition(CurrentThread);\n\n  if (addr >= offsetof(GDBContextDefinition, gregs[0]) && addr < offsetof(GDBContextDefinition, gregs[16])) {\n    return {encodeHex((unsigned char*)(&GDB.gregs[addr / sizeof(uint64_t)]), sizeof(uint64_t)), HandledPacketType::TYPE_ACK};\n  } else if (addr == offsetof(GDBContextDefinition, rip)) {\n    return {encodeHex((unsigned char*)(&GDB.rip), sizeof(uint64_t)), HandledPacketType::TYPE_ACK};\n  } else if (addr == offsetof(GDBContextDefinition, eflags)) {\n    return {encodeHex((unsigned char*)(&GDB.eflags), sizeof(uint32_t)), HandledPacketType::TYPE_ACK};\n  } else if (addr >= offsetof(GDBContextDefinition, cs) && addr < offsetof(GDBContextDefinition, mm[0])) {\n    uint32_t Empty {};\n    return {encodeHex((unsigned char*)(&Empty), sizeof(uint32_t)), HandledPacketType::TYPE_ACK};\n  } else if (addr >= offsetof(GDBContextDefinition, mm[0]) && addr < offsetof(GDBContextDefinition, mm[8])) {\n    return {encodeHex((unsigned char*)(&GDB.mm[(addr - offsetof(GDBContextDefinition, mm[0])) / sizeof(X80Float)]), sizeof(X80Float)),\n            HandledPacketType::TYPE_ACK};\n  } else if (addr == offsetof(GDBContextDefinition, fctrl)) {\n    return {encodeHex((unsigned char*)(&GDB.fctrl), sizeof(uint32_t)), HandledPacketType::TYPE_ACK};\n  } else if (addr == offsetof(GDBContextDefinition, fstat)) {\n    return {encodeHex((unsigned char*)(&GDB.fstat), sizeof(uint32_t)), HandledPacketType::TYPE_ACK};\n  } else if (addr >= offsetof(GDBContextDefinition, dummies[0]) && addr < offsetof(GDBContextDefinition, dummies[6])) {\n    return {encodeHex((unsigned char*)(&GDB.dummies[0]), sizeof(uint32_t)), HandledPacketType::TYPE_ACK};\n  } else if (addr >= offsetof(GDBContextDefinition, xmm[0][0]) && addr < offsetof(GDBContextDefinition, xmm[16][0])) {\n    const auto XmmIndex = (addr - offsetof(GDBContextDefinition, xmm[0][0])) / FEXCore::Core::CPUState::XMM_AVX_REG_SIZE;\n    return {encodeHex(reinterpret_cast<const uint8_t*>(&GDB.xmm[XmmIndex]), FEXCore::Core::CPUState::XMM_AVX_REG_SIZE), HandledPacketType::TYPE_ACK};\n  } else if (addr == offsetof(GDBContextDefinition, mxcsr)) {\n    return {encodeHex((unsigned char*)(&GDB.mxcsr), sizeof(uint32_t)), HandledPacketType::TYPE_ACK};\n  }\n\n  LogMan::Msg::EFmt(\"Unknown GDB register 0x{:x}\", addr);\n  return {\"E00\", HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::CommandQuery(const fextl::string& packet) {\n  const auto match = [&](const char* str) -> bool {\n    return packet.rfind(str, 0) == 0;\n  };\n  const auto MatchStr = [](const fextl::string& Str, const char* str) -> bool {\n    return Str.rfind(str, 0) == 0;\n  };\n\n  const auto split = [](const fextl::string& Str, char deliminator) -> fextl::vector<fextl::string> {\n    fextl::vector<fextl::string> Elements;\n    fextl::istringstream Input(Str);\n    for (fextl::string line; std::getline(Input, line); Elements.emplace_back(line))\n      ;\n    return Elements;\n  };\n\n  if (match(\"QNonStop:\")) {\n    auto ss = fextl::istringstream(packet);\n    ss.seekg(fextl::string(\"QNonStop:\").size());\n    ss.get(); // discard colon\n    ss >> NonStopMode;\n    return {\"OK\", HandledPacketType::TYPE_ACK};\n  }\n  if (match(\"qSupported:\")) {\n    // eg: qSupported:multiprocess+;swbreak+;hwbreak+;qRelocInsn+;fork-events+;vfork-events+;exec-events+;vContSupported+;QThreadEvents+;no-resumed+;memory-tagging+;xmlRegisters=i386\n    auto Features = split(packet.substr(strlen(\"qSupported:\")), ';');\n\n    // For feature documentation\n    // https://sourceware.org/gdb/current/onlinedocs/gdb/General-Query-Packets.html#qSupported\n    fextl::string SupportedFeatures {};\n\n    // Required features\n    SupportedFeatures += \"PacketSize=32768;\";\n    SupportedFeatures += \"xmlRegisters=i386;\";\n\n    SupportedFeatures += \"qXfer:auxv:read+;\";\n    SupportedFeatures += \"qXfer:exec-file:read+;\";\n    SupportedFeatures += \"qXfer:features:read+;\";\n    SupportedFeatures += \"qXfer:libraries:read+;\";\n    // Don't enable this feature. If enabled then gdb doesn't query for\n    // memory-map updates post-launch. Resulting in the inability to\n    // disassemble code from loaded libraries.\n    // gdbserver running on a true host also doesn't use this feature.\n    // It is likely used for embedded environments where you have a fixed\n    // memory map.\n    // SupportedFeatures += \"qXfer:memory-map:read+;\";\n    SupportedFeatures += \"qXfer:siginfo:read+;\";\n    SupportedFeatures += \"qXfer:siginfo:write+;\";\n    SupportedFeatures += \"qXfer:threads:read+;\";\n    SupportedFeatures += \"QCatchSignals+;\";\n    SupportedFeatures += \"QPassSignals+;\";\n    SupportedFeatures += \"QNonStop+;\";\n\n    SupportedFeatures += \"qXfer:osdata:read+;\";\n    SupportedFeatures += \"QStartNoAckMode+;\";\n\n    // TODO: Support breakpoints\n    // SupportedFeatures += \"swbreak+;\";\n    // SupportedFeatures += \"hwbreak+;\";\n    // SupportedFeatures += \"BreakpointCommands+;\";\n\n    // TODO: If we want to support conditional breakpoints then we need to support single stepping.\n    // SupportedFeatures += \"ConditionalBreakpoints+;\";\n\n    for (auto& Feature : Features) {\n      if (MatchStr(Feature, \"swbreak+\")) {\n        SupportedFeatures += \"swbreak+;\";\n      }\n      if (MatchStr(Feature, \"hwbreak+\")) {\n        SupportedFeatures += \"hwbreak+;\";\n      }\n      if (MatchStr(Feature, \"vContSupported+\")) {\n        SupportedFeatures += \"vContSupported+;\";\n      }\n\n      // Unsupported:\n      //  multiprocess\n      //  qRelocInsn\n      //  fork-events\n      //  vfork-events\n      //  exec-events\n      //  QThreadEvents\n      //  no-resumed\n      //  memory-tagging\n    }\n    return {std::move(SupportedFeatures), HandledPacketType::TYPE_ACK};\n  }\n  if (match(\"qAttached\")) {\n    return {\"tnotrun:0\", HandledPacketType::TYPE_ACK}; // We don't currently support launching executables from gdb.\n  }\n  if (match(\"qXfer\")) {\n    return handleXfer(packet);\n  }\n  if (match(\"qOffsets\")) {\n    return handleProgramOffsets();\n  }\n  if (match(\"qTStatus\")) {\n    // We don't support trace experiments\n    return {\"\", HandledPacketType::TYPE_ACK};\n  }\n  if (match(\"qfThreadInfo\")) {\n    auto Threads = SyscallHandler->TM.GetThreads();\n\n    fextl::ostringstream ss;\n    ss << \"m\";\n    for (size_t i = 0; i < Threads->size(); ++i) {\n      auto Thread = Threads->at(i);\n      ss << std::hex << Thread->ThreadInfo.TID;\n      if (i != (Threads->size() - 1)) {\n        ss << \",\";\n      }\n    }\n    return {ss.str(), HandledPacketType::TYPE_ACK};\n  }\n  if (match(\"qsThreadInfo\")) {\n    return {\"l\", HandledPacketType::TYPE_ACK};\n  }\n  if (match(\"qThreadExtraInfo\")) {\n    auto ss = fextl::istringstream(packet);\n    ss.seekg(fextl::string(\"qThreadExtraInfo\").size());\n    ss.get(); // discard comma\n    uint32_t ThreadID;\n    ss >> std::hex >> ThreadID;\n    auto ThreadName = GDB::Info::GetThreadName(::getpid(), ThreadID);\n    return {encodeHex((unsigned char*)ThreadName.data(), ThreadName.size()), HandledPacketType::TYPE_ACK};\n  }\n  if (match(\"qC\")) {\n    // Returns the current Thread ID\n    auto Threads = SyscallHandler->TM.GetThreads();\n    fextl::ostringstream ss;\n    ss << \"m\" << std::hex << Threads->at(0)->ThreadInfo.TID;\n    return {ss.str(), HandledPacketType::TYPE_ACK};\n  }\n  if (match(\"QStartNoAckMode\")) {\n    SettingNoAckMode = true;\n    return {\"OK\", HandledPacketType::TYPE_ACK};\n  }\n  if (match(\"qSymbol\")) {\n    auto ss = fextl::istringstream(packet);\n    ss.seekg(fextl::string(\"qSymbol\").size());\n    ss.get(); // discard colon\n    fextl::string Symbol_Val, Symbol_name;\n    std::getline(ss, Symbol_Val, ':');\n    std::getline(ss, Symbol_name, ':');\n\n    if (Symbol_Val.empty() && Symbol_name.empty()) {\n      return {\"OK\", HandledPacketType::TYPE_ACK};\n    } else {\n      return {\"\", HandledPacketType::TYPE_UNKNOWN};\n    }\n  }\n\n  if (match(\"QPassSignals\")) {\n    // First set all signals as unpassed\n    std::fill(PassSignals.begin(), PassSignals.end(), false);\n\n    // eg: QPassSignals:e;10;14;17;1a;1b;1c;21;24;25;2c;4c;97;\n    auto ss = fextl::istringstream(packet);\n    ss.seekg(fextl::string(\"QPassSignals\").size());\n    ss.get(); // discard colon\n\n    // We now have a semi-colon deliminated list of signals to pass to the guest process\n    for (fextl::string tmp; std::getline(ss, tmp, ';');) {\n      uint32_t Signal = std::stoi(tmp.c_str(), nullptr, 16);\n      if (Signal < FEX::HLE::SignalDelegator::MAX_SIGNALS) {\n        PassSignals[Signal] = true;\n      }\n    }\n\n    return {\"OK\", HandledPacketType::TYPE_ACK};\n  }\n\n  // lldb specific queries\n  if (match(\"qHostInfo\")) {\n    // Returns Key:Value pairs separated by ;\n    // eg:\n    // triple:7838365f36342d70632d6c696e75782d676e75;\n    // ptrsize:8;\n    // distribution_id:7562756e7475;\n    // watchpoint_exceptions_received:after;\n    // endian:little;\n    // os_version:6.3.3;\n    // os_build:362e332e332d3036303330332d67656e65726963;\n    // os_kernel:2332303233303531373133333620534d5020505245454d50545f44594e414d494320576564204d61792031372031333a34353a3139205554432032303233;\n    // hostname:7279616e682d545235303030;\n    fextl::string HostFeatures {};\n\n    // 64-bit always returned for the host environment.\n    // qProcessInfo will return i386 or not.\n    HostFeatures += fextl::fmt::format(\"triple:{};\", encodeHex(\"x86_64-pc-linux-gnu\"));\n    HostFeatures += \"ptrsize:8;\";\n\n    // Always little-endian.\n    HostFeatures += \"endian:little;\";\n\n    struct utsname buf {};\n    if (uname(&buf) != -1) {\n      uint32_t Major {};\n      uint32_t Minor {};\n      uint32_t Patch {};\n\n      // Parse kernel version in the form of `<Major>.<Minor>.<Patch>[Optional Data]`\n      const auto End = buf.release + sizeof(buf.release);\n      auto Results = std::from_chars(buf.release, End, Major, 10);\n      Results = std::from_chars(Results.ptr + 1, End, Minor, 10);\n      Results = std::from_chars(Results.ptr + 1, End, Patch, 10);\n\n      HostFeatures += fextl::fmt::format(\"os_version:{}.{}.{};\", Major, Minor, Patch);\n\n      // os_build returns the release untouched.\n      HostFeatures += fextl::fmt::format(\"os_build:{};\", encodeHex(buf.release));\n      HostFeatures += fextl::fmt::format(\"os_kernel:{};\", encodeHex(buf.version));\n      HostFeatures += fextl::fmt::format(\"hostname:{};\", encodeHex(buf.nodename));\n    }\n\n    // TODO: distribution_id should be fetched with `lsb_release -i`\n    // TODO: watchpoint_exceptions_received is unsupported\n    return {std::move(HostFeatures), HandledPacketType::TYPE_ACK};\n  }\n  if (match(\"qGetWorkingDir\")) {\n    char Tmp[PATH_MAX];\n    if (getcwd(Tmp, PATH_MAX)) {\n      return {encodeHex(Tmp), HandledPacketType::TYPE_ACK};\n    }\n    return {\"E00\", HandledPacketType::TYPE_ACK};\n  }\n  return {\"\", HandledPacketType::TYPE_UNKNOWN};\n}\n\nGdbServer::HandledPacketType GdbServer::CommandSingleStep(const fextl::string& packet) {\n  return ThreadAction('s', 0);\n}\n\nGdbServer::HandledPacketType GdbServer::CommandQueryThreadAlive(const fextl::string& packet) {\n  return {\"OK\", HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::HandlevFile(const fextl::string& packet) {\n  const auto match = [&](const fextl::string& str) -> std::optional<fextl::istringstream> {\n    if (packet.rfind(str, 0) == 0) {\n      auto ss = fextl::istringstream(packet);\n      ss.seekg(str.size());\n      return ss;\n    }\n    return std::nullopt;\n  };\n\n  const auto F = [](int result) -> fextl::string {\n    return fextl::fmt::format(\"F{:x}\", result);\n  };\n  const auto F_error = []() -> fextl::string {\n    return fextl::fmt::format(\"F-1,{:x}\", errno);\n  };\n  const auto F_data = [](int result, const fextl::string& data) -> fextl::string {\n    // Binary encoded data is raw appended to the end\n    return fextl::fmt::format(\"F{:#x};\", result) + data;\n  };\n\n  std::optional<fextl::istringstream> ss;\n  if ((ss = match(\"vFile:open:\"))) {\n    fextl::string filename;\n    int flags;\n    int mode;\n\n    filename = hexstring(*ss, ',');\n    *ss >> std::hex >> flags;\n    ss->get(); // discard comma\n    *ss >> std::hex >> mode;\n\n    return {F(open(filename.c_str(), flags, mode)), HandledPacketType::TYPE_ACK};\n  }\n  if ((ss = match(\"vFile:setfs:\"))) {\n    int pid;\n    *ss >> pid;\n\n    return {F(pid == 0 ? 0 : -1), HandledPacketType::TYPE_ACK}; // Only support the common filesystem\n  }\n  if ((ss = match(\"vFile:close:\"))) {\n    int fd;\n    *ss >> std::hex >> fd;\n    close(fd);\n    return {F(0), HandledPacketType::TYPE_ACK};\n  }\n  if ((ss = match(\"vFile:pread:\"))) {\n    int fd, count, offset;\n\n    *ss >> std::hex >> fd;\n    ss->get(); // discard comma\n    *ss >> std::hex >> count;\n    ss->get(); // discard comma\n    *ss >> std::hex >> offset;\n\n    fextl::string data(count, '\\0');\n    if (lseek(fd, offset, SEEK_SET) < 0) {\n      return {F_error(), HandledPacketType::TYPE_ACK};\n    }\n    int ret = read(fd, data.data(), count);\n    if (ret < 0) {\n      return {F_error(), HandledPacketType::TYPE_ACK};\n    }\n\n    if (ret == 0) {\n      return {F(0), HandledPacketType::TYPE_ACK};\n    }\n\n    data.resize(ret);\n    return {F_data(ret, data), HandledPacketType::TYPE_ACK};\n  }\n\n  return {\"\", HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::HandlevCont(const fextl::string& packet) {\n  const auto match = [&](const fextl::string& str) -> std::optional<fextl::istringstream> {\n    if (packet.rfind(str, 0) == 0) {\n      auto ss = fextl::istringstream(packet);\n      ss.seekg(str.size());\n      return ss;\n    }\n    return std::nullopt;\n  };\n\n  std::optional<fextl::istringstream> ss;\n  if ((ss = match(\"vCont?\"))) {\n    return {\"vCont;c;t;s;r\", HandledPacketType::TYPE_ACK}; // We support continue, step and terminate\n    // FIXME: We also claim to support continue with signal... because it's compulsory\n  }\n\n  if ((ss = match(\"vCont;\"))) {\n    char action {};\n    int thread {};\n\n    action = ss->get();\n\n    if (ss->peek() == ':') {\n      ss->get();\n      *ss >> std::hex >> thread;\n    }\n\n    if (ss->fail()) {\n      return {\"E00\", HandledPacketType::TYPE_ACK};\n    }\n\n    return ThreadAction(action, thread);\n  }\n\n  return {\"\", HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::CommandMultiLetterV(const fextl::string& packet) {\n  // TODO: vAttach\n  if (packet.starts_with(\"vCont\")) {\n    return HandlevCont(packet);\n  }\n\n  // TODO: vCtrlC\n\n  if (packet.starts_with(\"vFile\")) {\n    return HandlevFile(packet);\n  }\n\n  if (packet.starts_with(\"vKill\")) {\n    tgkill(::getpid(), ::getpid(), SIGKILL);\n  }\n\n  // TODO: vRun\n  // TODO: vStopped\n\n  return {\"\", HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::CommandBreakpoint(const fextl::string& packet) {\n  auto ss = fextl::istringstream(packet);\n\n  // Don't do anything with set breakpoints yet\n  [[maybe_unused]] bool Set {};\n  uint64_t Addr;\n  uint64_t Type;\n  Set = ss.get() == 'Z';\n\n  ss >> std::hex >> Addr;\n  ss.get(); // discard comma\n  ss >> std::hex >> Type;\n\n  SyscallHandler->TM.Pause();\n  return {\"OK\", HandledPacketType::TYPE_ACK};\n}\n\nGdbServer::HandledPacketType GdbServer::CommandUnknown(const fextl::string& packet) {\n  return {\"\", HandledPacketType::TYPE_UNKNOWN};\n}\n\nGdbServer::HandledPacketType GdbServer::ProcessPacket(const fextl::string& packet) {\n  // Packet commands list: https://sourceware.org/gdb/current/onlinedocs/gdb.html/Packets.html#Packets\n\n  switch (packet[0]) {\n  // Command: $!\n  // - Desc: Enable extended mode\n  // - Args: <None>\n  case '!': return CommandEnableExtendedMode(packet);\n  // Command: $?\n  // - Desc: Sent on connection first established to query the reason the target halted.\n  case '?': return CommandQueryHalted(packet);\n  // Command: $A\n  // - Desc: Initialized argv[] array passed in to the program.\n  // - Args: arglen,argnum,arg,...\n  case 'A': return CommandUnknown(packet);\n  // Command: $b\n  // - Desc: Change the serial line speed to baud\n  // - Args: baud\n  // - Deprecated: Behaviour isn't well-defined.\n  case 'b': return CommandUnknown(packet);\n  // Command: $B\n  // - Desc: Set or clear a breadpoint at address\n  // - Args: addr,mode\n  // - Deprecated: Use $Z and $z instead.\n  case 'B': return CommandUnknown(packet);\n  // Command: $c\n  // - Desc: Continue execution of process\n  // - Args: [addr]\n  // - Deprecated: See $vCont for multi-threaded support.\n  case 'c': return CommandContinue(packet);\n  // Command: $C\n  // - Desc: Continue execution of process with signal\n  // - Args: sig[;addr]\n  // - Deprecated: See $vCont for multi-threaded support.\n  case 'C': return CommandUnknown(packet);\n  // Command: $d\n  // - Desc: Toggle debug flag\n  // - Args: <None>\n  // - Deprecated: Use $q or $Q instead.\n  case 'd': return CommandUnknown(packet);\n  // Command: $D\n  // - Desc: Detach GDB from the remote system\n  // - Args: [;pid]\n  case 'D': return CommandDetach(packet);\n  // Command: $F\n  // - Desc: A reply from GDB to the `F` packet sent by the target. Part of the File-I/O protocol.\n  // - Args: RC,EE,CF;XX\n  case 'F': return CommandUnknown(packet);\n  // Command: $g\n  // - Desc: Read general registers\n  // - Args: <None>\n  case 'g': return CommandReadRegisters(packet);\n  // Command: $G\n  // - Desc: Write general registers\n  // - Args: XX...\n  case 'G': return CommandUnknown(packet);\n  // Command: $H\n  // - Desc: Sets thread for subsequent operations\n  // - Args: op thread-id\n  case 'H': return CommandThreadOp(packet);\n  // Command: $i\n  // - Desc: Step the remote target by a single clock cycle\n  // - Args: [addr[,nnn]]\n  case 'i': return CommandUnknown(packet);\n  // Command: $I\n  // - Desc: Signal, then cycle step\n  // - Args: <None>\n  case 'I': return CommandUnknown(packet);\n  // Command: $k\n  // - Desc: kill process\n  case 'k': return CommandKill(packet);\n  // Command: $m\n  // - Desc: Read addressable memory\n  // - Args: addr length\n  case 'm':\n  // Command: $M\n  // - Desc: Write addressable memory\n  // - Args: addr length\n  case 'M': return CommandMemory(packet);\n  // Command: $p\n  // - Desc: Read the value of a register\n  // - Args: index\n  case 'p': return CommandReadReg(packet);\n  // Command: $q\n  // - Desc: General query fetching\n  // - Args: Name params...\n  case 'q':\n  // Command: $Q\n  // - Desc: General query setting\n  // - Args: Name params...\n  case 'Q': return CommandQuery(packet);\n  // Command: $r\n  // - Desc: Reset the entire system\n  // - Args: <None>\n  // - Deprecated: Use $R instead.\n  case 'r': return CommandUnknown(packet);\n  // Command: $R\n  // - Desc: Restart the program beging debugged\n  // - Args: XX\n  case 'R': return CommandUnknown(packet);\n  // Command: $s\n  // - Desc: Single step\n  // - Args: [addr]\n  case 's': return CommandSingleStep(packet);\n  // Command: $S\n  // - Desc: Step with Signal\n  // - Args: sig[;addr]\n  // - Deprecated: See $vCont for multi-threaded support.\n  case 'S': return CommandUnknown(packet);\n  // Command: $t\n  // - Desc: Search backwards started at address with pattern and mask.\n  // - Args: addr:PP,MM\n  case 't': return CommandUnknown(packet);\n  // Command: $T\n  // - Desc: Find out if the thread is alive\n  // - Args: thread-id\n  case 'T': return CommandQueryThreadAlive(packet);\n  // Command: $v<Operation>\n  // - Desc: Multi-letter command\n  case 'v': return CommandMultiLetterV(packet);\n  // Command: $X\n  // - Desc: Write data to memory\n  // - Args: addr,length:XX...\n  case 'X': return CommandUnknown(packet);\n  // Command: $z\n  // - Desc: Insert a type of breakpoint or watchpoint\n  // - Args: type,addr,kind\n  case 'z':\n  // Command: $Z\n  // - Desc: Remove a type of breakpoint or watchpoint\n  // - Args: type,addr,kind\n  case 'Z': return CommandBreakpoint(packet);\n  default: return {\"\", HandledPacketType::TYPE_UNKNOWN};\n  }\n}\n\nvoid GdbServer::SendPacketPair(const HandledPacketType& response) {\n  std::lock_guard lk(sendMutex);\n  if (response.TypeResponse == HandledPacketType::TYPE_ACK || response.TypeResponse == HandledPacketType::TYPE_ONLYACK) {\n    SendACK(*CommsSocket, false);\n  } else if (response.TypeResponse == HandledPacketType::TYPE_NACK || response.TypeResponse == HandledPacketType::TYPE_ONLYNACK) {\n    SendACK(*CommsSocket, true);\n  }\n\n  if (response.TypeResponse == HandledPacketType::TYPE_UNKNOWN) {\n    SendPacket(*CommsSocket, \"\");\n  } else if (response.TypeResponse != HandledPacketType::TYPE_ONLYNACK && response.TypeResponse != HandledPacketType::TYPE_ONLYACK &&\n             response.TypeResponse != HandledPacketType::TYPE_NONE) {\n    SendPacket(*CommsSocket, response.Response);\n  }\n}\n\nstd::pair<fextl::vector<std::byte>::iterator, bool>\nGdbServer::MatchPacket(fextl::vector<std::byte>::iterator begin, fextl::vector<std::byte>::iterator end) {\n  if (CommsBuffer.empty()) {\n    return std::make_pair(begin, false);\n  }\n  switch ((char)CommsBuffer[0]) {\n  case '+':\n  case '-':\n  case '\\x03':\n    // No further data\n    return std::make_pair(std::next(begin), true);\n\n  case '$': {\n    // Message format: $packet-data#checksum, where checksum is a single byte.\n    auto match = std::find(begin, end, (std::byte)'#');\n    if (match == end) {\n      // No match; fetch more data\n      return std::make_pair(end, false);\n    } else if (end - match <= 2) {\n      // Found '#' but missing the checksum bytes\n      return std::make_pair(match, false);\n    } else {\n      return std::make_pair(std::next(match, 3), true);\n    }\n    break;\n  }\n\n  default: ERROR_AND_DIE_FMT(\"Unexpected character at beginning of GDB packet: {}\", CommsBuffer[0]);\n  }\n}\n\nvoid GdbServer::HandlePacket(fasio::error ec, size_t BytesInMessage) {\n  if (ec != fasio::error::success || BytesInMessage == 0) {\n    ERROR_AND_DIE_FMT(\"Failed\");\n  }\n\n  char c = (char)CommsBuffer[0];\n  switch (c) {\n  case '$': {\n    auto packet = ReadPacket(std::span {CommsBuffer}.subspan(0, BytesInMessage));\n    auto response = ProcessPacket(packet);\n    SendPacketPair(response);\n    if (response.TypeResponse == HandledPacketType::TYPE_UNKNOWN) {\n      LogMan::Msg::DFmt(\"Unknown packet {}\", packet);\n    }\n    break;\n  }\n  case '+':\n    // ACK, do nothing.\n    break;\n  case '-':\n    // NAK, Resend requested\n    {\n      std::lock_guard lk(sendMutex);\n      SendPacket(*CommsSocket, {});\n    }\n    break;\n  case '\\x03': { // ASCII EOT\n    SyscallHandler->TM.Pause();\n    fextl::string str = fextl::fmt::format(\"T02thread:{:02x};\", getpid());\n    if (LibraryMapChanged) {\n      // If libraries have changed then let gdb know\n      str += \"library:1;\";\n    }\n    SendPacketPair({std::move(str), HandledPacketType::TYPE_ACK});\n    break;\n  }\n  default: LogMan::Msg::DFmt(\"GdbServer: Unexpected byte {} ({:02x})\", c, c);\n  }\n\n  CommsBuffer.erase(CommsBuffer.begin(), CommsBuffer.begin() + BytesInMessage);\n\n  async_read_until(*CommsSocket, fasio::dynamic_vector_buffer {CommsBuffer}, std::bind_front(&GdbServer::MatchPacket, this),\n                   std::bind_front(&GdbServer::HandlePacket, this));\n}\n\n\nvoid GdbServer::GdbServerLoop() {\n  OpenListenSocket();\n  if (!Acceptor) {\n    // Couldn't open socket, just exit.\n    return;\n  }\n\n  Acceptor->async_accept([this](fasio::error ec, std::optional<fasio::tcp_socket> Socket) {\n    if (ec != fasio::error::success) {\n      // Listen socket error or shutting down\n      LogMan::Msg::EFmt(\"[GdbServer] gdbserver shutting down: {}\");\n      close(CommsSocket->FD);\n      CommsSocket.reset();\n      // Repeat to wait for another connection\n      return fasio::post_callback::repeat;\n    }\n\n    CommsSocket.emplace(*std::move(Socket));\n\n    // Receive packet data\n    async_read_until(*CommsSocket, fasio::dynamic_vector_buffer {CommsBuffer}, std::bind_front(&GdbServer::MatchPacket, this),\n                     std::bind_front(&GdbServer::HandlePacket, this));\n\n    // Repeat to catch disconnect events\n    return fasio::post_callback::repeat;\n  });\n\n  CommsBuffer.reserve(1000);\n\n  // Enter event loop\n  Reactor.run();\n\n  // Shut down\n  std::lock_guard lk(sendMutex);\n  if (CommsSocket) {\n    close(CommsSocket->FD);\n    CommsSocket.reset();\n  }\n\n  CloseListenSocket();\n}\nstatic void* ThreadHandler(void* Arg) {\n  HLE::ThreadManager::SetThreadName(\"FEX:gdbserver\");\n  auto This = reinterpret_cast<FEX::GdbServer*>(Arg);\n  This->GdbServerLoop();\n  return nullptr;\n}\n\nvoid GdbServer::StartThread() {\n  uint64_t OldMask = HLE::ThreadManager::SetSignalMask(~0ULL);\n  gdbServerThread = FEXCore::Threads::Thread::Create(ThreadHandler, this);\n  HLE::ThreadManager::SetSignalMask(OldMask);\n}\n\nvoid GdbServer::OpenListenSocket() {\n  const auto GdbUnixPath = fextl::fmt::format(\"{}/FEX_gdbserver/\", FEXServerClient::GetTempFolder());\n  if (FHU::Filesystem::CreateDirectory(GdbUnixPath) == FHU::Filesystem::CreateDirectoryResult::ERROR) {\n    LogMan::Msg::EFmt(\"[GdbServer] Couldn't create gdbserver folder {}\", GdbUnixPath);\n    return;\n  }\n\n  GdbUnixSocketPath = fextl::fmt::format(\"{}{}-gdb\", GdbUnixPath, ::getpid());\n\n  for (int attempt = 0; attempt < 2; ++attempt) {\n    Acceptor = fasio::tcp_acceptor::create(Reactor, false, GdbUnixSocketPath, 1);\n    if (Acceptor) {\n      break;\n    }\n\n    // This can happen periodically with execve. unlink the path and try again.\n    // The PID is reused but FEX likely started a gdbserver thread for the PID before execve.\n    unlink(GdbUnixSocketPath.c_str());\n  }\n\n  if (!Acceptor) {\n    LogMan::Msg::EFmt(\"[GdbServer] Couldn't bind AF_UNIX socket '{}': {} {}\\n\", GdbUnixSocketPath, errno, strerror(errno));\n    return;\n  }\n\n  LogMan::Msg::IFmt(\"[GdbServer] Waiting for connection on {}\", GdbUnixSocketPath);\n  LogMan::Msg::IFmt(\"[GdbServer] gdb-multiarch -ex \\\"set debug remote 1\\\" -ex \\\"target extended-remote {}\\\"\", GdbUnixSocketPath);\n}\n\nvoid GdbServer::CloseListenSocket() {\n  Acceptor.reset();\n  unlink(GdbUnixSocketPath.c_str());\n}\n\n#endif\n} // namespace FEX\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/GdbServer.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: glue|gdbserver\n$end_info$\n*/\n#pragma once\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/SignalDelegator.h>\n#include <FEXCore/Utils/Event.h>\n#include <FEXCore/Utils/Threads.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/string.h>\n\n#include <Common/AsyncNet.h>\n\n#include <atomic>\n#include <mutex>\n#include <stdint.h>\n\n#include \"LinuxSyscalls/SignalDelegator.h\"\n\nnamespace FEX {\n\nclass GdbServer {\npublic:\n  GdbServer(FEXCore::Context::Context* ctx, FEX::HLE::SignalDelegator* SignalDelegation, FEX::HLE::SyscallHandler* const SyscallHandler);\n  ~GdbServer();\n\n  // Public for threading\n  void GdbServerLoop();\n\n  void AlertLibrariesChanged() {\n    LibraryMapChanged = true;\n  }\n\nprivate:\n  void Break(FEXCore::Core::InternalThreadState* Thread, int signal);\n\n  void OpenListenSocket();\n  void CloseListenSocket();\n  void StartThread();\n  fextl::string ReadPacket(const std::span<std::byte>& stream);\n  void SendPacket(fasio::tcp_socket&, const fextl::string& packet);\n\n  void SendACK(fasio::tcp_socket&, bool NACK);\n\n  Event ThreadBreakEvent {};\n  void WaitForThreadWakeup();\n\n  struct HandledPacketType {\n    fextl::string Response {};\n    enum ResponseType {\n      TYPE_NONE,\n      TYPE_UNKNOWN,\n      TYPE_ACK,\n      TYPE_NACK,\n      TYPE_ONLYACK,\n      TYPE_ONLYNACK,\n    };\n    ResponseType TypeResponse {};\n  };\n\n  void SendPacketPair(const HandledPacketType& packetPair);\n  HandledPacketType ProcessPacket(const fextl::string& packet);\n  HandledPacketType handleProgramOffsets();\n\n  HandledPacketType ThreadAction(char action, uint32_t tid);\n\n  // Binary data transfer handlers\n  // XFer function to correctly encode any reply\n  static fextl::string EncodeXferString(const fextl::string& data, int offset, int length) {\n    if (offset == data.size()) {\n      return \"l\";\n    }\n    if (offset >= data.size()) {\n      return \"E34\"; // ERANGE\n    }\n    if ((data.size() - offset) > length) {\n      return \"m\" + data.substr(offset, length);\n    }\n    return \"l\" + data.substr(offset);\n  };\n\n  HandledPacketType XferCommandExecFile(const fextl::string& annex, int offset, int length);\n  HandledPacketType XferCommandFeatures(const fextl::string& annex, int offset, int length);\n  HandledPacketType XferCommandThreads(const fextl::string& annex, int offset, int length);\n  HandledPacketType XferCommandOSData(const fextl::string& annex, int offset, int length);\n  HandledPacketType XferCommandLibraries(const fextl::string& annex, int offset, int length);\n  HandledPacketType XferCommandAuxv(const fextl::string& annex, int offset, int length);\n  HandledPacketType handleXfer(const fextl::string& packet);\n\n  HandledPacketType HandlevFile(const fextl::string& packet);\n  HandledPacketType HandlevCont(const fextl::string& packet);\n\n  // Command handlers\n  HandledPacketType CommandEnableExtendedMode(const fextl::string& packet);\n  HandledPacketType CommandQueryHalted(const fextl::string& packet);\n  HandledPacketType CommandContinue(const fextl::string& packet);\n  HandledPacketType CommandDetach(const fextl::string& packet);\n  HandledPacketType CommandReadRegisters(const fextl::string& packet);\n  HandledPacketType CommandThreadOp(const fextl::string& packet);\n  HandledPacketType CommandKill(const fextl::string& packet);\n  HandledPacketType CommandMemory(const fextl::string& packet);\n  HandledPacketType CommandReadReg(const fextl::string& packet);\n  HandledPacketType CommandQuery(const fextl::string& packet);\n  HandledPacketType CommandSingleStep(const fextl::string& packet);\n  HandledPacketType CommandQueryThreadAlive(const fextl::string& packet);\n  HandledPacketType CommandMultiLetterV(const fextl::string& packet);\n  HandledPacketType CommandBreakpoint(const fextl::string& packet);\n  HandledPacketType CommandUnknown(const fextl::string& packet);\n\n  /**\n   * @brief Returns the ThreadStateObject for the matching TID, or parent thread if TID isn't found\n   *\n   * @param TID Which TID to search for\n   */\n  const FEX::HLE::ThreadStateObject* FindThreadByTID(uint32_t TID);\n\n  struct X80Float {\n    uint8_t Data[10];\n  };\n\n  struct FEX_PACKED GDBContextDefinition {\n    uint64_t gregs[FEXCore::Core::CPUState::NUM_GPRS];\n    uint64_t rip;\n    uint32_t eflags;\n    uint32_t cs, ss, ds, es, fs, gs;\n    X80Float mm[FEXCore::Core::CPUState::NUM_MMS];\n    uint32_t fctrl;\n    uint32_t fstat;\n    uint32_t dummies[6];\n    uint64_t xmm[FEXCore::Core::CPUState::NUM_XMMS][4];\n    uint32_t mxcsr;\n  };\n\n  GDBContextDefinition GenerateContextDefinition(const FEX::HLE::ThreadStateObject* ThreadObject);\n\n  FEXCore::Context::Context* CTX;\n  FEX::HLE::SyscallHandler* const SyscallHandler;\n  FEX::HLE::SignalDelegator* SignalDelegation;\n  fextl::unique_ptr<FEXCore::Threads::Thread> gdbServerThread;\n  fasio::poll_reactor Reactor;\n  std::optional<fasio::tcp_acceptor> Acceptor;\n  std::optional<fasio::tcp_socket> CommsSocket;\n  fextl::vector<std::byte> CommsBuffer;\n\n  std::pair<fextl::vector<std::byte>::iterator, bool> MatchPacket(fextl::vector<std::byte>::iterator begin, fextl::vector<std::byte>::iterator end);\n  void HandlePacket(fasio::error ec, size_t BytesInMessage);\n\n  std::mutex sendMutex;\n  bool SettingNoAckMode {false};\n  bool NoAckMode {false};\n  bool NonStopMode {false};\n  fextl::string ThreadString {};\n  fextl::string OSDataString {};\n  void buildLibraryMap();\n  std::atomic<bool> LibraryMapChanged = true;\n  fextl::string LibraryMapString {};\n\n  // Used to keep track of which signals to pass to the guest\n  std::array<bool, FEX::HLE::SignalDelegator::MAX_SIGNALS + 1> PassSignals {};\n  uint32_t CurrentDebuggingThread {};\n  fextl::string GdbUnixSocketPath {};\n  FEX_CONFIG_OPT(Filename, APP_FILENAME);\n  FEX_CONFIG_OPT(Is64BitMode, IS64BIT_MODE);\n};\n\n} // namespace FEX\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/LinuxAllocator.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"LinuxSyscalls/LinuxAllocator.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXHeaderUtils/Syscalls.h>\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/memory.h>\n\n#include <bitset>\n#include <linux/mman.h>\n#include <unistd.h>\n#include <sys/user.h>\n#include <sys/mman.h>\n#include <sys/shm.h>\n\n#ifndef MREMAP_DONTUNMAP\n#define MREMAP_DONTUNMAP 4\n#endif\n\nnamespace FEX::HLE {\nclass MemAllocator32Bit final : public FEX::HLE::MemAllocator {\nprivate:\n  static constexpr uint64_t BASE_KEY = 16;\n  const uint64_t TOP_KEY = 0xFFFF'F000ULL >> FEXCore::Utils::FEX_PAGE_SHIFT;\n  const uint64_t TOP_KEY32BIT = 0x7FFF'F000ULL >> FEXCore::Utils::FEX_PAGE_SHIFT;\n\npublic:\n  MemAllocator32Bit() {\n    // First 16 pages are taken by the Linux kernel\n    for (size_t i = 0; i < 16; ++i) {\n      MappedPages.set(i);\n    }\n    // Take the top page as well\n    MappedPages.set(TOP_KEY);\n    if (SearchDown) {\n      LastScanLocation = TOP_KEY;\n      LastKeyLocation = TOP_KEY;\n      LastKeyLocation32Bit = TOP_KEY32BIT;\n      FindPageRangePtr = &MemAllocator32Bit::FindPageRange_TopDown;\n    } else {\n      LastScanLocation = BASE_KEY;\n      LastKeyLocation = BASE_KEY;\n      FindPageRangePtr = &MemAllocator32Bit::FindPageRange;\n    }\n  }\n\n  void* Mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset) override;\n  int Munmap(void* addr, size_t length) override;\n  void* Mremap(void* old_address, size_t old_size, size_t new_size, int flags, void* new_address) override;\n  uint64_t Shmat(int shmid, const void* shmaddr, int shmflg, uint32_t* ResultAddress) override;\n  uint64_t Shmdt(const void* shmaddr) override;\n  static constexpr bool SearchDown = true;\n\n  // PageAddr is a page already shifted to page index\n  // PagesLength is the number of pages\n  void SetUsedPages(uint64_t PageAddr, size_t PagesLength) {\n    // Set the range as mapped\n    for (size_t i = 0; i < PagesLength; ++i) {\n      MappedPages.set(PageAddr + i);\n    }\n  }\n\n  // PageAddr is a page already shifted to page index\n  // PagesLength is the number of pages\n  void SetFreePages(uint64_t PageAddr, size_t PagesLength) {\n    // Set the range as unused\n    for (size_t i = 0; i < PagesLength; ++i) {\n      MappedPages.reset(PageAddr + i);\n    }\n  }\n\nprivate:\n  // Set that contains 4k mapped pages\n  // This is the full 32bit memory range\n  std::bitset<0x10'0000> MappedPages;\n  fextl::map<uint32_t, int> PageToShm {};\n  uint64_t LastScanLocation {};\n  uint64_t LastKeyLocation {};\n  uint64_t LastKeyLocation32Bit {};\n  std::mutex AllocMutex {};\n  uint64_t FindPageRange(uint64_t Start, size_t Pages) const;\n  uint64_t FindPageRange_TopDown(uint64_t Start, size_t Pages) const;\n  using FindHandler = uint64_t (MemAllocator32Bit::*)(uint64_t Start, size_t Pages) const;\n  FindHandler FindPageRangePtr {};\n};\n\nuint64_t MemAllocator32Bit::FindPageRange(uint64_t Start, size_t Pages) const {\n  // Linear range scan\n  while (Start != TOP_KEY) {\n    bool Free = true;\n    if ((Start + Pages) > TOP_KEY) {\n      return 0;\n    }\n    uint64_t Offset = 0;\n    for (; Offset < Pages; ++Offset) {\n      if (MappedPages.test(Start + Offset)) {\n        Free = false;\n        break;\n      }\n    }\n\n    if (Free) {\n      return Start;\n    }\n    Start += Offset + 1;\n  }\n\n  return 0;\n}\n\nuint64_t MemAllocator32Bit::FindPageRange_TopDown(uint64_t Start, size_t Pages) const {\n  // Linear range scan\n  while (Start >= BASE_KEY && Start <= TOP_KEY) {\n    bool Free = true;\n\n    uint64_t Offset = 0;\n    for (; Offset < Pages; ++Offset) {\n      if (MappedPages.test(Start - Offset)) {\n        Free = false;\n        break;\n      }\n    }\n\n    if (Free) {\n      return Start - Offset;\n    }\n    Start -= Offset + 1;\n  }\n\n  return 0;\n}\n\nvoid* MemAllocator32Bit::Mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset) {\n  std::scoped_lock<std::mutex> lk {AllocMutex};\n  size_t PagesLength = FEXCore::AlignUp(length, FEXCore::Utils::FEX_PAGE_SIZE) >> FEXCore::Utils::FEX_PAGE_SHIFT;\n\n  uintptr_t Addr = reinterpret_cast<uintptr_t>(addr);\n  uintptr_t PageAddr = Addr >> FEXCore::Utils::FEX_PAGE_SHIFT;\n\n  // Define MAP_FIXED_NOREPLACE ourselves to ensure we always parse this flag\n  constexpr int FEX_MAP_FIXED_NOREPLACE = 0x100000;\n  bool Fixed = ((flags & MAP_FIXED) || (flags & FEX_MAP_FIXED_NOREPLACE));\n\n  // Both Addr and length must be page aligned\n  if (Addr & ~FEXCore::Utils::FEX_PAGE_MASK) {\n    return reinterpret_cast<void*>(-EINVAL);\n  }\n\n  // If we do have an fd then offset must be page aligned\n  if (fd != -1 && offset & ~FEXCore::Utils::FEX_PAGE_MASK) {\n    return reinterpret_cast<void*>(-EINVAL);\n  }\n\n  if (Addr + length > std::numeric_limits<uint32_t>::max()) {\n    return reinterpret_cast<void*>(-EOVERFLOW);\n  }\n\n  // Check reserved range\n  if (Fixed && PageAddr < 16) {\n    return reinterpret_cast<void*>(-EINVAL);\n  }\n\n  if (!Fixed) {\n    // If we aren't mapping fixed the ignore the address input\n    Addr = 0;\n    PageAddr = 0;\n  }\n\n  bool Map32Bit = flags & FEX::HLE::X86_64_MAP_32BIT;\n\n  // Remove the MAP_32BIT flag if it exists now\n  flags &= ~FEX::HLE::X86_64_MAP_32BIT;\n\n  auto AllocateNoHint = [&]() -> void* {\n    bool Wrapped = false;\n    uint64_t BottomPage = Map32Bit && (LastScanLocation >= LastKeyLocation32Bit) ? LastKeyLocation32Bit : LastScanLocation;\nrestart: {\n  // Linear range scan\n  uint64_t LowerPage = (this->*FindPageRangePtr)(BottomPage, PagesLength);\n  if (LowerPage == 0) {\n    // Try again but this time from the start\n    BottomPage = Map32Bit ? LastKeyLocation32Bit : LastKeyLocation;\n    LowerPage = (this->*FindPageRangePtr)(BottomPage, PagesLength);\n  }\n\n  uint64_t UpperPage = LowerPage + PagesLength;\n  if (LowerPage == 0) {\n    return reinterpret_cast<void*>(-ENOMEM);\n  }\n  {\n    // Try and map the range\n    void* MappedPtr =\n      ::mmap(reinterpret_cast<void*>(LowerPage << FEXCore::Utils::FEX_PAGE_SHIFT), length, prot, flags | FEX_MAP_FIXED_NOREPLACE, fd, offset);\n\n    if (MappedPtr == MAP_FAILED && errno != EEXIST) {\n      return reinterpret_cast<void*>(-errno);\n    } else if (MappedPtr == MAP_FAILED || MappedPtr >= reinterpret_cast<void*>(TOP_KEY << FEXCore::Utils::FEX_PAGE_SHIFT)) {\n      // Handles the case where MAP_FIXED_NOREPLACE failed with MAP_FAILED\n      // or if the host system's kernel isn't new enough then it returns the wrong pointer\n      if (MappedPtr != MAP_FAILED && MappedPtr >= reinterpret_cast<void*>(TOP_KEY << FEXCore::Utils::FEX_PAGE_SHIFT)) {\n        // Make sure to munmap this so we don't leak memory\n        ::munmap(MappedPtr, length);\n      }\n\n      if (UpperPage == TOP_KEY) {\n        BottomPage = BASE_KEY;\n        Wrapped = true;\n        goto restart;\n      } else if (Wrapped && LowerPage >= LastScanLocation) {\n        // We linear scanned the entire memory range. Give up\n        return (void*)(uintptr_t)-errno;\n      } else {\n        // Try again\n        if (SearchDown) {\n          --BottomPage;\n        } else {\n          ++BottomPage;\n        }\n        goto restart;\n      }\n    } else {\n      if (SearchDown) {\n        LastScanLocation = LowerPage;\n      } else {\n        LastScanLocation = UpperPage;\n      }\n      SetUsedPages(LowerPage, PagesLength);\n      return MappedPtr;\n    }\n  }\n}\n  };\n\n  // Find a region that fits our address\n  if (Addr == 0) {\n    return AllocateNoHint();\n  } else {\n    void* MappedPtr = ::mmap(reinterpret_cast<void*>(PageAddr << FEXCore::Utils::FEX_PAGE_SHIFT),\n                             PagesLength << FEXCore::Utils::FEX_PAGE_SHIFT, prot, flags, fd, offset);\n\n    if (MappedPtr >= reinterpret_cast<void*>(TOP_KEY << FEXCore::Utils::FEX_PAGE_SHIFT) && (flags & FEX_MAP_FIXED_NOREPLACE)) {\n      // Handles the case where MAP_FIXED_NOREPLACE isn't handled by the host system's\n      // kernel and returns the wrong pointer\n      // Make sure to munmap this so we don't leak memory\n      ::munmap(MappedPtr, length);\n      return reinterpret_cast<void*>(-EEXIST);\n    } else if (MappedPtr != MAP_FAILED) {\n      SetUsedPages(PageAddr, PagesLength);\n      return MappedPtr;\n    } else {\n      return reinterpret_cast<void*>(-errno);\n    }\n  }\n  return 0;\n}\n\nint MemAllocator32Bit::Munmap(void* addr, size_t length) {\n  std::scoped_lock<std::mutex> lk {AllocMutex};\n  size_t PagesLength = FEXCore::AlignUp(length, FEXCore::Utils::FEX_PAGE_SIZE) >> FEXCore::Utils::FEX_PAGE_SHIFT;\n\n  uintptr_t Addr = reinterpret_cast<uintptr_t>(addr);\n  uintptr_t PageAddr = Addr >> FEXCore::Utils::FEX_PAGE_SHIFT;\n\n  uintptr_t PageEnd = PageAddr + PagesLength;\n\n  // Both Addr and length must be page aligned\n  if (Addr & ~FEXCore::Utils::FEX_PAGE_MASK) {\n    return -EINVAL;\n  }\n\n  if (length & ~FEXCore::Utils::FEX_PAGE_MASK) {\n    return -EINVAL;\n  }\n\n  if (Addr + length > std::numeric_limits<uint32_t>::max()) {\n    return -EOVERFLOW;\n  }\n\n  // Check reserved range\n  if (PageAddr < 16) {\n    // Return success for these\n    return 0;\n  }\n\n  while (PageAddr != PageEnd) {\n    // Always pass to munmap, it may be something allocated we aren't tracking\n    int Result = ::munmap(reinterpret_cast<void*>(PageAddr << FEXCore::Utils::FEX_PAGE_SHIFT), FEXCore::Utils::FEX_PAGE_SIZE);\n    if (Result != 0) {\n      return -errno;\n    }\n\n    if (MappedPages.test(PageAddr)) {\n      MappedPages.reset(PageAddr);\n    }\n\n    ++PageAddr;\n  }\n\n  return 0;\n}\n\nvoid* MemAllocator32Bit::Mremap(void* old_address, size_t old_size, size_t new_size, int flags, void* new_address) {\n  size_t OldPagesLength = FEXCore::AlignUp(old_size, FEXCore::Utils::FEX_PAGE_SIZE) >> FEXCore::Utils::FEX_PAGE_SHIFT;\n  size_t NewPagesLength = FEXCore::AlignUp(new_size, FEXCore::Utils::FEX_PAGE_SIZE) >> FEXCore::Utils::FEX_PAGE_SHIFT;\n\n  {\n    std::scoped_lock<std::mutex> lk {AllocMutex};\n    if (flags & MREMAP_FIXED) {\n      void* MappedPtr = ::mremap(old_address, old_size, new_size, flags, new_address);\n\n      if (MappedPtr != MAP_FAILED) {\n        if (!(flags & MREMAP_DONTUNMAP)) {\n          // Unmap the old location\n          uintptr_t OldAddr = reinterpret_cast<uintptr_t>(old_address);\n          SetFreePages(OldAddr >> FEXCore::Utils::FEX_PAGE_SHIFT, OldPagesLength);\n        }\n\n        // Map the new pages\n        uintptr_t NewAddr = reinterpret_cast<uintptr_t>(MappedPtr);\n        SetUsedPages(NewAddr >> FEXCore::Utils::FEX_PAGE_SHIFT, NewPagesLength);\n      } else {\n        return reinterpret_cast<void*>(-errno);\n      }\n    } else {\n      uintptr_t OldAddr = reinterpret_cast<uintptr_t>(old_address);\n      uintptr_t OldPageAddr = OldAddr >> FEXCore::Utils::FEX_PAGE_SHIFT;\n\n      if (NewPagesLength < OldPagesLength) {\n        void* MappedPtr = ::mremap(old_address, old_size, new_size, flags & ~MREMAP_MAYMOVE);\n\n        if (MappedPtr != MAP_FAILED) {\n          // Clear the pages that we just shrunk\n          size_t NewPagesLength = FEXCore::AlignUp(new_size, FEXCore::Utils::FEX_PAGE_SIZE) >> FEXCore::Utils::FEX_PAGE_SHIFT;\n          uintptr_t NewPageAddr = reinterpret_cast<uintptr_t>(MappedPtr) >> FEXCore::Utils::FEX_PAGE_SHIFT;\n          SetFreePages(NewPageAddr + NewPagesLength, OldPagesLength - NewPagesLength);\n          return MappedPtr;\n        } else {\n          return reinterpret_cast<void*>(-errno);\n        }\n      } else {\n        // Scan the region forward from our first region's endd to see if it can be extended\n        bool CanExtend {true};\n\n        for (size_t i = OldPagesLength; i < NewPagesLength; ++i) {\n          if (MappedPages[OldPageAddr + i]) {\n            CanExtend = false;\n            break;\n          }\n        }\n\n        if (CanExtend) {\n          void* MappedPtr = ::mremap(old_address, old_size, new_size, flags & ~MREMAP_MAYMOVE);\n\n          if (MappedPtr != MAP_FAILED) {\n            // Map the new pages\n            size_t NewPagesLength = FEXCore::AlignUp(new_size, FEXCore::Utils::FEX_PAGE_SIZE) >> FEXCore::Utils::FEX_PAGE_SHIFT;\n            uintptr_t NewAddr = reinterpret_cast<uintptr_t>(MappedPtr);\n            SetUsedPages(NewAddr >> FEXCore::Utils::FEX_PAGE_SHIFT, NewPagesLength);\n            return MappedPtr;\n          } else if (!(flags & MREMAP_MAYMOVE)) {\n            // We have one more chance if MAYMOVE is specified\n            return reinterpret_cast<void*>(-errno);\n          }\n        }\n      }\n    }\n  }\n\n  // Flags can not contain MREMAP_FIXED at this point\n  // Flags might contain MREMAP_MAYMOVE and/or MREMAP_DONTUNMAP\n  // New Size is >= old size\n\n  // First, try and allocate a region the size of the new size\n  void* MappedPtr = this->Mmap(nullptr, new_size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n  std::scoped_lock<std::mutex> lk {AllocMutex};\n  if (FEX::HLE::HasSyscallError(MappedPtr)) {\n    // Couldn't find a region that fit our space\n    return MappedPtr;\n  }\n\n  // Good news, we found a region\n  // This will overwrite the previous mmap if it succeeds\n  MappedPtr = ::mremap(old_address, old_size, new_size, flags | MREMAP_FIXED | MREMAP_MAYMOVE, MappedPtr);\n\n  if (MappedPtr != MAP_FAILED) {\n    if (!(flags & MREMAP_DONTUNMAP) && MappedPtr != old_address) {\n      // If we have both MREMAP_DONTUNMAP not set and the new pointer is at a new location\n      // Make sure to clear the old mapping\n      uintptr_t OldAddr = reinterpret_cast<uintptr_t>(old_address);\n      SetFreePages(OldAddr >> FEXCore::Utils::FEX_PAGE_SHIFT, OldPagesLength);\n    }\n\n    // Map the new pages\n    size_t NewPagesLength = FEXCore::AlignUp(new_size, FEXCore::Utils::FEX_PAGE_SIZE) >> FEXCore::Utils::FEX_PAGE_SHIFT;\n    uintptr_t NewAddr = reinterpret_cast<uintptr_t>(MappedPtr);\n    SetUsedPages(NewAddr >> FEXCore::Utils::FEX_PAGE_SHIFT, NewPagesLength);\n    return MappedPtr;\n  }\n\n  // Failed\n  return reinterpret_cast<void*>(-errno);\n}\n\nuint64_t MemAllocator32Bit::Shmat(int shmid, const void* shmaddr, int shmflg, uint32_t* ResultAddress) {\n  std::scoped_lock<std::mutex> lk {AllocMutex};\n\n  if (shmaddr != nullptr) {\n    // shmaddr must be valid\n    uint64_t Result = reinterpret_cast<uint64_t>(::shmat(shmid, shmaddr, shmflg));\n    if (Result != -1) {\n      uint32_t SmallRet = Result >> 32;\n      if (!(SmallRet == 0 || SmallRet == ~0U)) {\n        LOGMAN_MSG_A_FMT(\"Syscall returning something with data in the upper 32bits! BUG!\");\n        return -ENOMEM;\n      }\n\n      uintptr_t NewAddr = reinterpret_cast<uintptr_t>(Result);\n      uintptr_t NewPageAddr = NewAddr >> FEXCore::Utils::FEX_PAGE_SHIFT;\n\n      // Add to the map\n      PageToShm[NewPageAddr] = shmid;\n\n      *ResultAddress = Result;\n\n      // We must get the shm size and track it\n      struct shmid_ds buf {};\n\n      if (shmctl(shmid, IPC_STAT, &buf) == 0) {\n        // Map the new pages\n        size_t NewPagesLength = buf.shm_segsz >> FEXCore::Utils::FEX_PAGE_SHIFT;\n        SetUsedPages(NewPageAddr, NewPagesLength);\n      }\n\n      // Zero on working result\n      Result = 0;\n    } else {\n      Result = -errno;\n    }\n    return Result;\n  } else {\n    // We must get the shm size and track it\n    struct shmid_ds buf {};\n    uint64_t PagesLength {};\n\n    if (shmctl(shmid, IPC_STAT, &buf) == 0) {\n      PagesLength = FEXCore::AlignUp(buf.shm_segsz, FEXCore::Utils::FEX_PAGE_SIZE) >> FEXCore::Utils::FEX_PAGE_SHIFT;\n    } else {\n      return -EINVAL;\n    }\n\n    bool Wrapped = false;\n    uint64_t BottomPage = LastScanLocation;\nrestart: {\n  // Linear range scan\n  uint64_t LowerPage = (this->*FindPageRangePtr)(BottomPage, PagesLength);\n  if (LowerPage == 0) {\n    // Try again but this time from the start\n    BottomPage = LastKeyLocation;\n    LowerPage = (this->*FindPageRangePtr)(BottomPage, PagesLength);\n  }\n\n  uint64_t UpperPage = LowerPage + PagesLength;\n  if (LowerPage == 0) {\n    return -ENOMEM;\n  }\n  {\n    // Try and map the range\n    void* MappedPtr = ::shmat(shmid, reinterpret_cast<const void*>(LowerPage << FEXCore::Utils::FEX_PAGE_SHIFT), shmflg);\n\n    if (MappedPtr == MAP_FAILED) {\n      if (UpperPage == TOP_KEY) {\n        BottomPage = LastKeyLocation;\n        Wrapped = true;\n        goto restart;\n      } else if (Wrapped && LowerPage >= LastScanLocation) {\n        // We linear scanned the entire memory range. Give up\n        return -errno;\n      } else {\n        // Try again\n        BottomPage += PagesLength;\n        goto restart;\n      }\n    } else {\n      if (SearchDown) {\n        LastScanLocation = LowerPage;\n      } else {\n        LastScanLocation = UpperPage;\n      }\n      // Set the range as mapped\n      SetUsedPages(LowerPage, PagesLength);\n\n      *ResultAddress = reinterpret_cast<uint64_t>(MappedPtr);\n\n      // Add to the map\n      PageToShm[LowerPage] = shmid;\n\n      // Zero on working result\n      return 0;\n    }\n  }\n}\n  }\n}\nuint64_t MemAllocator32Bit::Shmdt(const void* shmaddr) {\n  std::scoped_lock<std::mutex> lk {AllocMutex};\n\n  uint32_t AddrPage = reinterpret_cast<uint64_t>(shmaddr) >> FEXCore::Utils::FEX_PAGE_SHIFT;\n  auto it = PageToShm.find(AddrPage);\n\n  if (it == PageToShm.end()) {\n    // Page wasn't mapped\n    return -EINVAL;\n  }\n\n  int shmid = it->second;\n  struct shmid_ds buf {};\n  if (shmctl(shmid, IPC_STAT, &buf) == 0) {\n    size_t PagesLength = FEXCore::AlignUp(buf.shm_segsz, FEXCore::Utils::FEX_PAGE_SIZE) >> FEXCore::Utils::FEX_PAGE_SHIFT;\n    SetFreePages(AddrPage, PagesLength);\n  } else {\n    LOGMAN_MSG_A_FMT(\"Failed to get shm size during shmdt\");\n  }\n\n  uint64_t Result = ::shmdt(shmaddr);\n\n  if (Result == 0) {\n    PageToShm.erase(it);\n  }\n\n  SYSCALL_ERRNO();\n}\n\nclass MemAllocatorPassThrough final : public FEX::HLE::MemAllocator {\npublic:\n  void* Mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset) override {\n    uint64_t Result = (uint64_t)::mmap(addr, length, prot, flags, fd, offset);\n    if (Result == ~0ULL) {\n      return reinterpret_cast<void*>(-errno);\n    }\n    return reinterpret_cast<void*>(Result);\n  }\n\n  int Munmap(void* addr, size_t length) override {\n    uint64_t Result = (uint64_t)::munmap(addr, length);\n    SYSCALL_ERRNO();\n  }\n\n  void* Mremap(void* old_address, size_t old_size, size_t new_size, int flags, void* new_address) override {\n    uint64_t Result = (uint64_t)::mremap(old_address, old_size, new_size, flags, new_address);\n    if (Result == ~0ULL) {\n      return reinterpret_cast<void*>(-errno);\n    }\n    return reinterpret_cast<void*>(Result);\n  }\n\n  uint64_t Shmat(int shmid, const void* shmaddr, int shmflg, uint32_t* ResultAddress) override {\n    uint64_t Result = (uint64_t)::shmat(shmid, reinterpret_cast<const void*>(shmaddr), shmflg);\n    if (Result != ~0ULL) {\n      *ResultAddress = Result;\n      Result = 0;\n    }\n    SYSCALL_ERRNO();\n  }\n\n  uint64_t Shmdt(const void* shmaddr) override {\n    uint64_t Result = ::shmdt(shmaddr);\n    SYSCALL_ERRNO();\n  }\n};\n\nfextl::unique_ptr<FEX::HLE::MemAllocator> Create32BitAllocator() {\n  return fextl::make_unique<MemAllocator32Bit>();\n}\n\nfextl::unique_ptr<FEX::HLE::MemAllocator> CreatePassthroughAllocator() {\n  return fextl::make_unique<MemAllocatorPassThrough>();\n}\n\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/LinuxAllocator.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/fextl/memory.h>\n\n#include <cstdint>\n#include <memory>\n\nnamespace FEX::HLE {\nconstexpr uint32_t X86_64_MAP_32BIT = 0x40;\n\nclass MemAllocator {\npublic:\n  virtual ~MemAllocator() = default;\n  virtual void* Mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset) = 0;\n  virtual int Munmap(void* addr, size_t length) = 0;\n  virtual void* Mremap(void* old_address, size_t old_size, size_t new_size, int flags, void* new_address) = 0;\n  virtual uint64_t Shmat(int shmid, const void* shmaddr, int shmflg, uint32_t* ResultAddress) = 0;\n  virtual uint64_t Shmdt(const void* shmaddr) = 0;\n};\n\nfextl::unique_ptr<FEX::HLE::MemAllocator> Create32BitAllocator();\nfextl::unique_ptr<FEX::HLE::MemAllocator> CreatePassthroughAllocator();\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Seccomp/BPFEmitter.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Seccomp/BPFEmitter.h\"\n\n#include <FEXCore/Utils/AllocatorHooks.h>\n#include <FEXCore/Utils/LogManager.h>\n\n#include <linux/bpf_common.h>\n#include <linux/filter.h>\n#include <linux/seccomp.h>\n\nnamespace FEX::HLE {\n\n#define EMIT_INST(x)               \\\n  do {                             \\\n    if constexpr (CalculateSize) { \\\n      OpSize += 4;                 \\\n    } else {                       \\\n      x;                           \\\n    }                              \\\n  } while (0)\n\n#define RETURN_ERROR(x)                                                                \\\n  if constexpr (CalculateSize) {                                                       \\\n    return ~0ULL;                                                                      \\\n  } else {                                                                             \\\n    static_assert(x == -EINVAL, \"Early return error evaluation only supports EINVAL\"); \\\n    return x;                                                                          \\\n  }\n\n#define RETURN_SUCCESS()           \\\n  do {                             \\\n    if constexpr (CalculateSize) { \\\n      return OpSize;               \\\n    } else {                       \\\n      return 0;                    \\\n    }                              \\\n  } while (0)\n\n#define VALIDATE(cond)      \\\n  do {                      \\\n    if (!(cond)) {          \\\n      RETURN_ERROR(-EINVAL) \\\n    }                       \\\n  } while (0)\n\nusing SizeErrorCheck = decltype([](uint64_t Result) -> bool { return Result == ~0ULL; });\nusing EmissionErrorCheck = decltype([](uint64_t Result) { return Result != 0; });\n\n// Register selection comes from function signature.\nconstexpr auto REG_A = ARMEmitter::WReg::w0;\nconstexpr auto REG_X = ARMEmitter::WReg::w1;\nconstexpr auto REG_TMP = ARMEmitter::WReg::w2;\nconstexpr auto REG_TMP2 = ARMEmitter::WReg::w3;\nconstexpr auto REG_SECCOMP_DATA = ARMEmitter::XReg::x4;\n\ntemplate<bool CalculateSize>\nuint64_t BPFEmitter::HandleLoad(uint32_t BPFIP, const sock_filter* Inst) {\n  VALIDATE(BPF_SIZE(Inst->code) == BPF_W);\n  [[maybe_unused]] size_t OpSize {};\n\n  const auto DestReg = BPF_CLASS(Inst->code) == BPF_LD ? REG_A : REG_X;\n\n  switch (BPF_MODE(Inst->code)) {\n  case BPF_IMM: {\n    auto Const = ConstPool.try_emplace(Inst->k, ARMEmitter::ForwardLabel {});\n    EMIT_INST(ldr(DestReg, &Const.first->second));\n    break;\n  }\n  case BPF_ABS: {\n    // ABS has some restrictions\n    // - Must be 4-byte aligned\n    // - Must be less than the size of seccomp_data\n    const auto Offset = Inst->k;\n\n    // Need to be 4-byte aligned.\n    VALIDATE((Offset & 0b11) == 0);\n    // Ensure accessing inside of seccomp_data.\n    VALIDATE(Offset < sizeof(seccomp_data));\n\n    EMIT_INST(ldr(DestReg, REG_SECCOMP_DATA, Offset));\n    break;\n  }\n  case BPF_MEM:\n    // Must be smaller than scratch space size.\n    VALIDATE(Inst->k < 16);\n\n    EMIT_INST(ldr(DestReg, REG_SECCOMP_DATA, ARRAY_OFFSETOF(WorkingBuffer, ScratchMemory, Inst->k)));\n    break;\n  case BPF_LEN:\n    // Just returns the length of seccomp_data.\n    EMIT_INST(movz(DestReg, sizeof(seccomp_data)));\n    break;\n  case BPF_IND:\n  case BPF_MSH:\n  default: RETURN_ERROR(-EINVAL); // Unsupported\n  }\n\n  RETURN_SUCCESS();\n}\n\ntemplate<bool CalculateSize>\nuint64_t BPFEmitter::HandleStore(uint32_t BPFIP, const sock_filter* Inst) {\n  VALIDATE(BPF_SIZE(Inst->code) == BPF_W);\n\n  [[maybe_unused]] size_t OpSize {};\n\n  const auto SrcReg = BPF_CLASS(Inst->code) == BPF_LD ? REG_A : REG_X;\n  // Must be smaller than scratch space size.\n  VALIDATE(Inst->k < 16);\n\n  EMIT_INST(str(SrcReg, REG_SECCOMP_DATA, ARRAY_OFFSETOF(WorkingBuffer, ScratchMemory, Inst->k)));\n\n  RETURN_SUCCESS();\n}\n\ntemplate<bool CalculateSize>\nuint64_t BPFEmitter::HandleALU(uint32_t BPFIP, const sock_filter* Inst) {\n  [[maybe_unused]] size_t OpSize {};\n  const auto SrcType = BPF_SRC(Inst->code);\n  const auto Op = BPF_OP(Inst->code);\n\n  switch (Op) {\n  case BPF_ADD:\n  case BPF_SUB:\n  case BPF_MUL:\n  case BPF_DIV:\n  case BPF_OR:\n  case BPF_AND:\n  case BPF_LSH:\n  case BPF_RSH:\n  case BPF_MOD:\n  case BPF_XOR: {\n    auto SrcReg = REG_X;\n    if (SrcType == BPF_K) {\n      SrcReg = REG_TMP;\n      auto Const = ConstPool.try_emplace(Inst->k, ARMEmitter::ForwardLabel {});\n      EMIT_INST(ldr(SrcReg, &Const.first->second));\n    }\n\n    switch (Op) {\n    case BPF_ADD: EMIT_INST(add(ARMEmitter::Size::i32Bit, REG_A, REG_A, SrcReg)); break;\n    case BPF_SUB: EMIT_INST(sub(ARMEmitter::Size::i32Bit, REG_A, REG_A, SrcReg)); break;\n    case BPF_MUL: EMIT_INST(mul(ARMEmitter::Size::i32Bit, REG_A, REG_A, SrcReg)); break;\n    case BPF_DIV:\n      // Specifically unsigned.\n      EMIT_INST(udiv(ARMEmitter::Size::i32Bit, REG_A, REG_A, SrcReg));\n      break;\n    case BPF_OR: EMIT_INST(orr(ARMEmitter::Size::i32Bit, REG_A, REG_A, SrcReg)); break;\n    case BPF_AND: EMIT_INST(and_(ARMEmitter::Size::i32Bit, REG_A, REG_A, SrcReg)); break;\n    case BPF_LSH: EMIT_INST(lslv(ARMEmitter::Size::i32Bit, REG_A, REG_A, SrcReg)); break;\n    case BPF_RSH: EMIT_INST(lsrv(ARMEmitter::Size::i32Bit, REG_A, REG_A, SrcReg)); break;\n    case BPF_MOD:\n      // Specifically unsigned.\n      EMIT_INST(udiv(ARMEmitter::Size::i32Bit, REG_TMP2, REG_A, SrcReg));\n      EMIT_INST(msub(ARMEmitter::Size::i32Bit, REG_A, REG_TMP2, SrcReg, REG_A));\n      break;\n    case BPF_XOR: EMIT_INST(eor(ARMEmitter::Size::i32Bit, REG_A, REG_A, SrcReg)); break;\n    default: RETURN_ERROR(-EINVAL);\n    }\n\n    break;\n  }\n  case BPF_NEG:\n    // Only BPF_K supported on NEG.\n    VALIDATE(SrcType == BPF_K);\n\n    EMIT_INST(neg(ARMEmitter::Size::i32Bit, REG_A, REG_A));\n    break;\n\n  default: RETURN_ERROR(-EINVAL);\n  }\n\n  RETURN_SUCCESS();\n}\n\ntemplate<bool CalculateSize>\nuint64_t BPFEmitter::HandleJmp(uint32_t BPFIP, uint32_t NumInst, const sock_filter* Inst) {\n  [[maybe_unused]] size_t OpSize {};\n  const auto SrcType = BPF_SRC(Inst->code);\n  const auto Op = BPF_OP(Inst->code);\n\n  switch (Op) {\n  case BPF_JA: {\n    // Only BPF_K supported on JA.\n    VALIDATE(SrcType == BPF_K);\n\n    // BPF IP register is effectively only 32-bit. Treat k constant like a signed integer.\n    // This allows it to jump anywhere in the program.\n    // But! Loops are EXPLICITLY disallowed inside of BPF programs.\n    // This is to prevent DOS style attacks through BPF programs.\n    uint64_t Target = BPFIP + Inst->k + 1;\n    // Must not jump past the end.\n    VALIDATE(Target < NumInst);\n\n    JumpLabelIterator TargetLabel {};\n\n    if constexpr (!CalculateSize) {\n      TargetLabel = JumpLabels.try_emplace(Target, ARMEmitter::ForwardLabel {}).first;\n    }\n\n    EMIT_INST((void)b(&TargetLabel->second));\n    break;\n  }\n  case BPF_JEQ:\n  case BPF_JGT:\n  case BPF_JGE:\n  case BPF_JSET: {\n    auto CompareSrcReg = REG_X;\n    if (SrcType == BPF_K) {\n      CompareSrcReg = REG_TMP;\n      auto Const = ConstPool.try_emplace(Inst->k, ARMEmitter::ForwardLabel {});\n      EMIT_INST(ldr(CompareSrcReg, &Const.first->second));\n    }\n    uint32_t TargetTrue = BPFIP + Inst->jt + 1;\n    uint32_t TargetFalse = BPFIP + Inst->jf + 1;\n\n    // Must not jump past the end.\n    VALIDATE(TargetTrue < NumInst && TargetFalse < NumInst);\n\n    ARMEmitter::Condition CompareResultOp;\n    if (Op == BPF_JEQ) {\n      CompareResultOp = ARMEmitter::Condition::CC_EQ;\n      EMIT_INST(cmp(ARMEmitter::Size::i32Bit, REG_A, CompareSrcReg));\n    } else if (Op == BPF_JGT) {\n      CompareResultOp = ARMEmitter::Condition::CC_HI;\n      EMIT_INST(cmp(ARMEmitter::Size::i32Bit, REG_A, CompareSrcReg));\n    } else if (Op == BPF_JGE) {\n      CompareResultOp = ARMEmitter::Condition::CC_HS;\n      EMIT_INST(cmp(ARMEmitter::Size::i32Bit, REG_A, CompareSrcReg));\n    } else if (Op == BPF_JSET) {\n      CompareResultOp = ARMEmitter::Condition::CC_NE;\n      EMIT_INST(tst(ARMEmitter::Size::i32Bit, REG_A, CompareSrcReg));\n    } else {\n      RETURN_ERROR(-EINVAL);\n    }\n\n    JumpLabelIterator TargetTrueLabel {};\n    JumpLabelIterator TargetFalseLabel {};\n\n    if constexpr (!CalculateSize) {\n      TargetTrueLabel = JumpLabels.try_emplace(TargetTrue, ARMEmitter::ForwardLabel {}).first;\n      TargetFalseLabel = JumpLabels.try_emplace(TargetFalse, ARMEmitter::ForwardLabel {}).first;\n    }\n\n    EMIT_INST((void)b(CompareResultOp, &TargetTrueLabel->second));\n    EMIT_INST((void)b(&TargetFalseLabel->second));\n    break;\n  }\n  default: RETURN_ERROR(-EINVAL); // Unknown jump type\n  }\n\n  RETURN_SUCCESS();\n}\n\ntemplate<bool CalculateSize>\nuint64_t BPFEmitter::HandleRet(uint32_t BPFIP, const sock_filter* Inst) {\n  [[maybe_unused]] size_t OpSize {};\n  const auto RValSrc = BPF_RVAL(Inst->code);\n  switch (RValSrc) {\n  case BPF_K: {\n    auto Const = ConstPool.try_emplace(Inst->k, ARMEmitter::ForwardLabel {});\n    EMIT_INST(ldr(ARMEmitter::WReg::w0, &Const.first->second));\n    break;\n  }\n  case BPF_X: EMIT_INST(mov(ARMEmitter::WReg::w0, REG_X)); break;\n  case BPF_A:\n    // w0 is already REG_A\n    static_assert(REG_A == ARMEmitter::WReg::w0, \"This is expected to be the same\");\n    break;\n  default: RETURN_ERROR(-EINVAL);\n  }\n\n  EMIT_INST(ret());\n\n  RETURN_SUCCESS();\n}\n\ntemplate<bool CalculateSize>\nuint64_t BPFEmitter::HandleMisc(uint32_t BPFIP, const sock_filter* Inst) {\n  [[maybe_unused]] size_t OpSize {};\n  const auto MiscOp = BPF_MISCOP(Inst->code);\n  switch (MiscOp) {\n  case BPF_TAX: EMIT_INST(mov(REG_X, REG_A)); break;\n  case BPF_TXA: EMIT_INST(mov(REG_A, REG_X)); break;\n  default: RETURN_ERROR(-EINVAL) // Unsupported misc operation.\n  }\n\n  RETURN_SUCCESS();\n}\n\ntemplate<bool CalculateSize, class Pred>\nuint64_t BPFEmitter::HandleEmission(uint32_t flags, const sock_fprog* prog) {\n  constexpr Pred PredFunc;\n  uint64_t CalculatedSize {};\n\n  for (uint32_t i = 0; i < prog->len; ++i) {\n    if constexpr (!CalculateSize) {\n      auto jump_label = JumpLabels.find(i);\n      if (jump_label != JumpLabels.end()) {\n        (void)Bind(&jump_label->second);\n      }\n    }\n\n    bool HadError {};\n    uint64_t Result {};\n\n    const sock_filter* Inst = &prog->filter[i];\n    const uint16_t Code = Inst->code;\n    const uint16_t Class = BPF_CLASS(Code);\n    switch (Class) {\n    case BPF_LD:\n    case BPF_LDX: {\n      Result = HandleLoad<CalculateSize>(i, Inst);\n      break;\n    }\n    case BPF_ST:\n    case BPF_STX: {\n      Result = HandleStore<CalculateSize>(i, Inst);\n      break;\n    }\n    case BPF_ALU: {\n      Result = HandleALU<CalculateSize>(i, Inst);\n      break;\n    }\n    case BPF_JMP: {\n      Result = HandleJmp<CalculateSize>(i, prog->len, Inst);\n      break;\n    }\n    case BPF_RET: {\n      Result = HandleRet<CalculateSize>(i, Inst);\n      break;\n    }\n    case BPF_MISC: {\n      Result = HandleMisc<CalculateSize>(i, Inst);\n      break;\n    }\n    default:\n      // We handle all instruction classes.\n      FEX_UNREACHABLE;\n    }\n\n    HadError = PredFunc(Result);\n\n    if (HadError) {\n      if constexpr (!CalculateSize) {\n        // Had error, early return and free the memory.\n        FEXCore::Allocator::munmap(GetBufferBase(), FuncSize);\n      }\n      return Result;\n    }\n\n    if constexpr (CalculateSize) {\n      CalculatedSize += Result;\n    }\n  }\n\n  if constexpr (CalculateSize) {\n    // Add the constant pool size.\n    CalculatedSize += ConstPool.size() * 4;\n\n    // Size calculation could have added constants and jump labels. Erase them now.\n    ConstPool.clear();\n    JumpLabels.clear();\n\n    return CalculatedSize;\n  }\n\n  return 0;\n}\n\nuint64_t BPFEmitter::JITFilter(uint32_t flags, const sock_fprog* prog) {\n  FuncSize = HandleEmission<true, SizeErrorCheck>(flags, prog);\n\n  if (FuncSize == ~0ULL) {\n    // Buffer size calculation found invalid code.\n    return -EINVAL;\n  }\n\n  SetBuffer((uint8_t*)FEXCore::Allocator::mmap(nullptr, FuncSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0), FuncSize);\n\n  FEXCore::Allocator::VirtualName(\"FEXMem_Misc\", reinterpret_cast<void*>(GetBufferBase()), FuncSize);\n\n  const auto CodeBegin = GetCursorAddress<uint8_t*>();\n\n  uint64_t Result = HandleEmission<false, EmissionErrorCheck>(flags, prog);\n\n  if (Result != 0) {\n    // Had error, early return and free the memory.\n    FEXCore::Allocator::munmap(GetBufferBase(), FuncSize);\n    return Result;\n  }\n\n  const uint64_t CodeOnlySize = GetCursorAddress<uint8_t*>() - CodeBegin;\n\n  // Emit the constant pool.\n  Align();\n  for (auto& Const : ConstPool) {\n    (void)Bind(&Const.second);\n    dc32(Const.first);\n  }\n\n  ClearICache(CodeBegin, CodeOnlySize);\n  ::mprotect(CodeBegin, AllocationSize(), PROT_READ | PROT_EXEC);\n  Func = CodeBegin;\n\n  if constexpr (false) {\n    // Useful for debugging seccomp filters.\n    LogMan::Msg::DFmt(\"JITFilter: disas 0x{:x},+{}\", fmt::ptr(CodeBegin), CodeOnlySize);\n  }\n\n  ConstPool.clear();\n  JumpLabels.clear();\n  return 0;\n}\n\n\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Seccomp/BPFEmitter.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n#pragma once\n\n#include <CodeEmitter/Emitter.h>\n\n#include <FEXCore/fextl/unordered_map.h>\n\n#include <linux/filter.h>\n#include <linux/seccomp.h>\n\nstruct sock_fprog;\nstruct sock_filter;\n\nnamespace FEX::HLE {\nclass BPFEmitter final : public ARMEmitter::Emitter {\npublic:\n  struct WorkingBuffer {\n    struct seccomp_data Data;\n    uint32_t ScratchMemory[BPF_MEMWORDS]; // Defined as 16 words.\n  };\n\n  BPFEmitter() = default;\n\n  uint64_t JITFilter(uint32_t flags, const sock_fprog* prog);\n  void* GetFunc() const {\n    return Func;\n  }\n\n  size_t AllocationSize() const {\n    return FuncSize;\n  }\n\nprivate:\n  template<bool CalculateSize>\n  uint64_t HandleLoad(uint32_t BPFIP, const sock_filter* Inst);\n  template<bool CalculateSize>\n  uint64_t HandleStore(uint32_t BPFIP, const sock_filter* Inst);\n  template<bool CalculateSize>\n  uint64_t HandleALU(uint32_t BPFIP, const sock_filter* Inst);\n  template<bool CalculateSize>\n  uint64_t HandleJmp(uint32_t BPFIP, uint32_t NumInst, const sock_filter* Inst);\n  template<bool CalculateSize>\n  uint64_t HandleRet(uint32_t BPFIP, const sock_filter* Inst);\n  template<bool CalculateSize>\n  uint64_t HandleMisc(uint32_t BPFIP, const sock_filter* Inst);\n\n  template<bool CalculateSize, class Pred>\n  uint64_t HandleEmission(uint32_t flags, const sock_fprog* prog);\n\n  fextl::unordered_map<uint32_t, ARMEmitter::ForwardLabel> JumpLabels;\n  fextl::unordered_map<uint32_t, ARMEmitter::ForwardLabel> ConstPool;\n\n  using JumpLabelIterator = decltype(JumpLabels)::iterator;\n\n  void* Func {};\n  size_t FuncSize {};\n};\n\n\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Seccomp/Dumper.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Seccomp/SeccompEmulator.h\"\n\n#include <linux/bpf_common.h>\n#include <linux/filter.h>\n#include <linux/seccomp.h>\n\nnamespace FEX::HLE {\nvoid SeccompEmulator::DumpProgram(const sock_fprog* prog) {\n  auto Parse_Class_LD = [](uint32_t BPFIP, const sock_filter* Inst) {\n    auto DestName = [](const sock_filter* Inst) {\n      if (BPF_CLASS(Inst->code) == BPF_LD) {\n        return \"A\";\n      } else {\n        return \"X\";\n      }\n    };\n\n    auto AccessSize = [](const sock_filter* Inst) {\n      switch (BPF_SIZE(Inst->code)) {\n      case BPF_W: return 32;\n      case BPF_H: return 16;\n      case BPF_B: return 8;\n      case 0x18: /* BPF_DW */ return 64;\n      }\n      return 0;\n    };\n\n    auto ModeType = [](const sock_filter* Inst) {\n      switch (BPF_MODE(Inst->code)) {\n      case BPF_IMM: return \"IMM\";\n      case BPF_ABS: return \"ABS\";\n      case BPF_IND: return \"IND\";\n      case BPF_MEM: return \"MEM\";\n      case BPF_LEN: return \"LEN\";\n      case BPF_MSH: return \"MSH\";\n      }\n      return \"Unknown\";\n    };\n\n    auto LoadName = [](const sock_filter* Inst) {\n      using namespace std::string_view_literals;\n      switch (BPF_MODE(Inst->code)) {\n      case BPF_IMM: return fextl::fmt::format(\"#{}\", Inst->k);\n      case BPF_ABS: return fextl::fmt::format(\"seccomp_data + #{}\", Inst->k);\n      case BPF_IND: return fextl::fmt::format(\"Ind[X+#{}]\", Inst->k);\n      case BPF_MEM: return fextl::fmt::format(\"Mem[#{}]\", Inst->k);\n      case BPF_LEN: return fextl::fmt::format(\"len\");\n      case BPF_MSH: return fextl::fmt::format(\"msh\");\n      }\n      return fextl::fmt::format(\"Unknown\");\n    };\n\n    LogMan::Msg::IFmt(\"0x{:04x}: {} <- LD.{} {} {}\", BPFIP, DestName(Inst), AccessSize(Inst), ModeType(Inst), LoadName(Inst));\n  };\n\n  auto Parse_Class_ST = [](uint32_t BPFIP, const sock_filter* Inst) {\n    auto DestName = [](const sock_filter* Inst) {\n      if (BPF_CLASS(Inst->code) == BPF_ST) {\n        return \"A\";\n      } else {\n        return \"X\";\n      }\n    };\n\n    LogMan::Msg::IFmt(\"0x{:04x}: Mem[{}] <- ST.{}\", BPFIP, Inst->k, DestName(Inst));\n  };\n\n  auto Parse_Class_ALU = [](uint32_t BPFIP, const sock_filter* Inst) {\n    auto GetOp = [](const sock_filter* Inst) {\n      const auto Op = BPF_OP(Inst->code);\n\n      switch (Op) {\n      case BPF_ADD: return \"ADD\";\n      case BPF_SUB: return \"SUB\";\n      case BPF_MUL: return \"MUL\";\n      case BPF_DIV: return \"DIV\";\n      case BPF_OR: return \"OR\";\n      case BPF_AND: return \"AND\";\n      case BPF_LSH: return \"LSH\";\n      case BPF_RSH: return \"RSH\";\n      case BPF_MOD: return \"MOD\";\n      case BPF_XOR: return \"XOR\";\n      case BPF_NEG: return \"NEG\";\n      default: return \"Unknown\";\n      }\n    };\n\n    auto GetSrc = [](const sock_filter* Inst) {\n      switch (BPF_SRC(Inst->code)) {\n      case BPF_K: return fextl::fmt::format(\"0x{:x}\", Inst->k);\n      case BPF_X: return fextl::fmt::format(\"<X>\");\n      }\n      return fextl::fmt::format(\"Unknown\");\n    };\n\n    LogMan::Msg::IFmt(\"0x{:04x}: {} <A>, {}\", BPFIP, GetOp(Inst), GetSrc(Inst));\n  };\n\n  auto Parse_Class_JMP = [](uint32_t BPFIP, const sock_filter* Inst) {\n    auto GetOp = [](const sock_filter* Inst) {\n      switch (BPF_OP(Inst->code)) {\n      case BPF_JA: return \"a\";\n      case BPF_JEQ: return \"eq\";\n      case BPF_JGT: return \"gt\";\n      case BPF_JGE: return \"ge\";\n      case BPF_JSET: return \"set\";\n      }\n      return \"Unknown\";\n    };\n\n    auto GetSrc = [](const sock_filter* Inst) {\n      switch (BPF_SRC(Inst->code)) {\n      case BPF_K: return fextl::fmt::format(\"0x{:x}\", Inst->k);\n      case BPF_X: return fextl::fmt::format(\"<X>\");\n      }\n      return fextl::fmt::format(\"Unknown\");\n    };\n\n    LogMan::Msg::IFmt(\"0x{:04x}: JMP.{} {}, +{} (#0x{:x}), +{} (#0x{:x})\", BPFIP, GetOp(Inst), GetSrc(Inst), Inst->jt, BPFIP + Inst->jt + 1,\n                      Inst->jf, BPFIP + Inst->jf + 1);\n  };\n\n  auto Parse_Class_RET = [](uint32_t BPFIP, const sock_filter* Inst) {\n    auto GetRetValue = [](const sock_filter* Inst) {\n      switch (BPF_RVAL(Inst->code)) {\n      case BPF_K: {\n        uint32_t RetData = Inst->k & SECCOMP_RET_DATA;\n        switch (Inst->k & SECCOMP_RET_ACTION_FULL) {\n        case SECCOMP_RET_KILL_PROCESS: return fextl::fmt::format(\"KILL_PROCESS.{}\", RetData);\n        case SECCOMP_RET_KILL_THREAD: return fextl::fmt::format(\"KILL_THREAD.{}\", RetData);\n        case SECCOMP_RET_TRAP: return fextl::fmt::format(\"TRAP.{}\", RetData);\n        case SECCOMP_RET_ERRNO: return fextl::fmt::format(\"ERRNO.{}\", RetData);\n        case SECCOMP_RET_USER_NOTIF: return fextl::fmt::format(\"USER_NOTIF.{}\", RetData);\n        case SECCOMP_RET_TRACE: return fextl::fmt::format(\"TRACE.{}\", RetData);\n        case SECCOMP_RET_LOG: return fextl::fmt::format(\"LOG.{}\", RetData);\n        case SECCOMP_RET_ALLOW: return fextl::fmt::format(\"ALLOW.{}\", RetData);\n        default: break;\n        }\n        return fextl::fmt::format(\"<Unknown>.{}\", RetData);\n      }\n      case BPF_X: return fextl::fmt::format(\"<X>\");\n      case BPF_A: return fextl::fmt::format(\"<A>\");\n      }\n\n      return fextl::fmt::format(\"Unknown\");\n    };\n\n    LogMan::Msg::IFmt(\"0x{:04x}: RET {}\", BPFIP, GetRetValue(Inst));\n  };\n\n  auto Parse_Class_MISC = [](uint32_t BPFIP, const sock_filter* Inst) {\n    const auto MiscOp = BPF_MISCOP(Inst->code);\n    switch (MiscOp) {\n    case BPF_TAX: LogMan::Msg::IFmt(\"0x{:04x}: TAX\", BPFIP); break;\n    case BPF_TXA: LogMan::Msg::IFmt(\"0x{:04x}: TXA\", BPFIP); break;\n    default: LogMan::Msg::IFmt(\"0x{:04x}: Misc: Unknown\", BPFIP); break;\n    };\n  };\n\n  LogMan::Msg::IFmt(\"BPF program: 0x{:x} instructions\", prog->len);\n\n  for (size_t i = 0; i < prog->len; ++i) {\n    const sock_filter* Inst = &prog->filter[i];\n    const uint16_t Code = Inst->code;\n    const uint16_t Class = BPF_CLASS(Code);\n    switch (Class) {\n    case BPF_LD:\n    case BPF_LDX: Parse_Class_LD(i, Inst); break;\n    case BPF_ST:\n    case BPF_STX: Parse_Class_ST(i, Inst); break;\n    case BPF_ALU: Parse_Class_ALU(i, Inst); break;\n    case BPF_JMP: Parse_Class_JMP(i, Inst); break;\n    case BPF_RET: Parse_Class_RET(i, Inst); break;\n    case BPF_MISC: Parse_Class_MISC(i, Inst); break;\n    }\n  }\n}\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Seccomp/SeccompEmulator.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Seccomp/BPFEmitter.h\"\n#include \"LinuxSyscalls/Seccomp/SeccompEmulator.h\"\n\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/SignalDelegator.h\"\n\n#include <CodeEmitter/Emitter.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <fcntl.h>\n#include <linux/audit.h>\n#include <linux/bpf_common.h>\n#include <linux/filter.h>\n#include <linux/seccomp.h>\n#include <sys/prctl.h>\n\n// seccomp\n//\n// global\n// - kcmp                              - pass\n// - mode_strict_support               - pass\n// - mode_strict_cannot_call_prctl     - pass\n// - no_new_privs_support              - pass\n// - mode_filter_support               - pass\n// - mode_filter_without_nnp           - pass\n// - filter_size_limits                - pass\n// - filter_chain_limits               - pass\n// - mode_filter_cannot_move_to_strict - pass\n// - mode_filter_get_seccomp           - pass\n// - ALLOW_all                         - pass\n// - empty_prog                        - pass\n// - log_all                           - pass\n// - unknown_ret_is_kill_inside        - pass\n// - unknown_ret_is_kill_above_allow   - pass\n// - KILL_all                          - pass\n// - KILL_one                          - pass\n// - KILL_one_arg_one                  - pass\n// - KILL_one_arg_six                  - pass\n// - KILL_thread                       - FAIL (unrelated to bpf)\n// - KILL_process                      - FAIL (unrelated to bpf)\n// - KILL_unknown                      - FAIL (unrelated to bpf)\n// - arg_out_of_range                  - pass\n// - ERRNO_valid                       - pass\n// - ERRNO_zero                        - pass\n// - ERRNO_capped                      - pass\n// - ERRNO_order                       - pass\n// - seccomp_syscall                   - pass\n// - seccomp_syscall_mode_lock         - pass\n// - detect_seccomp_filter_flags       - pass\n// - TSYNC_first                       - pass\n// - syscall_restart                   - FAIL (PTRACE)\n// - filter_flag_log                   - pass\n// - get_action_avail                  - FAIL (ptrace and user-notif)\n// TSYNC\n// - siblings_fail_prctl               - pass\n// - two_siblings_with_ancestor        - FAIL (kill-thread not working quite right)\n// - two_sibling_want_nnp              - pass\n// - two_siblings_with_one_divergence  - pass\n// - two_siblings_with_one_divergence_no_tid_in_err - pass\n// - two_siblings_not_under_filter     - FAIL (kill-thread not working quite right)\n// - two_siblings_with_no_filter       - FAIL (kill-thread not working quite right)\n//\n// user-notif stuff\n// - get_metadata                      - SKIP (Needs root)\n// - user_notification_basic           - FAIL (user-notif)\n// - user_notification_with_tsync      - FAIL (user-notif)\n// - user_notification_kill_in_middle  - FAIL (user-notif)\n// - user_notification_signal          - FAIL (user-notif)\n// - user_notification_closed_listener - FAIL (user-notif)\n// - user_notification_child_pid_ns    - FAIL (user-notif)\n// - user_notification_sibling_pid_ns  - FAIL (user-notif)\n// - user_notification_fault_recv      - FAIL (user-notif)\n// - seccomp_get_notif_sizes           - pass\n// - user_notification_continue        - FAIL (user-notif)\n// - user_notification_filter_empty    - FAIL (user-notif)\n// - user_notification_filter_empty_threaded - FAIL (user-notif)\n// - user_notification_addfd           - FAIL (user-notif)\n// - user_notification_addfd_rlimit    - FAIL (user-notif)\n// - user_notification_sync            - FAIL (user-notif)\n// - user_notification_fifo            - FAIL (user-notif)\n// - user_notification_wait_killable_pre_notification - FAIL (user-notif)\n// - user_notification_wait_killable   - FAIL (user-notif)\n// - user_notification_wait_killable_fatal - FAIL (user-notif)\n//\n// O_SUSPEND_SECCOMP\n// - setoptions - FAIL (ptrace)\n// - seize      - FAIL (ptrace)\n// TRAP\n// - dfl     - pass\n// - ign     - pass\n// - handler - pass\n//\n// precedence\n// - allow_ok                     - pass\n// - kill_is_highest              - pass\n// - kill_is_highest_in_any_order - pass\n// - trap_is_second               - pass\n// - trap_is_second_in_any_order  - pass\n// - errno_is_third               - pass\n// - errno_is_third_in_any_order  - pass\n// - trace_is_fourth              - pass\n// - trace_is_fourth_in_any_order - pass\n// - log_is_fifth                 - pass\n// - log_is_fifth_in_any_order    - pass\n//\n// TRACE_poke\n// - ptrace unsupported\n// TRACE_syscall\n// - ptrace unsupported\n\nnamespace FEX::HLE {\nuint64_t SeccompEmulator::Handle(FEXCore::Core::CpuStateFrame* Frame, uint32_t Op, uint32_t flags, void* arg) {\n  // If seccomp isn't enabled then say so.\n  if (!NeedsSeccomp) {\n    return -EINVAL;\n  }\n\n  switch (Op) {\n  case SECCOMP_SET_MODE_STRICT: return SetModeStrict(Frame, flags, arg);\n  case SECCOMP_SET_MODE_FILTER: return SetModeFilter(Frame, flags, static_cast<const sock_fprog*>(arg));\n  case SECCOMP_GET_ACTION_AVAIL: return GetActionAvail(flags, static_cast<const uint32_t*>(arg));\n  case SECCOMP_GET_NOTIF_SIZES: return GetNotifSizes(flags, static_cast<struct seccomp_notif_sizes*>(arg));\n  default:\n    // operation is unknown or is not supported by this kernel version or configuration.\n    return -EINVAL;\n  }\n}\n\n// Equivalent to prctl(PR_GET_SECCOMP)\nuint64_t SeccompEmulator::GetSeccomp(FEXCore::Core::CpuStateFrame* Frame) {\n  // If seccomp isn't enabled then say so.\n  if (!NeedsSeccomp) {\n    return -EINVAL;\n  }\n\n  auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n  return Thread->SeccompMode;\n}\n\nvoid SeccompEmulator::InheritSeccompFilters(FEX::HLE::ThreadStateObject* Parent, FEX::HLE::ThreadStateObject* Child) {\n  // Don't interrupt me while I'm copying.\n  auto lk = FEXCore::MaskSignalsAndLockMutex(FilterMutex);\n\n  Child->Filters.resize(Parent->Filters.size());\n\n  for (size_t i = 0; i < Child->Filters.size(); ++i) {\n    auto& ParentFilter = Parent->Filters[i];\n    auto& ChildFilter = Child->Filters[i];\n    ChildFilter = ParentFilter;\n    std::atomic_ref<uint64_t>(ParentFilter->RefCount)++;\n  }\n\n  // Copy the operating mode.\n  Child->SeccompMode = Parent->SeccompMode;\n}\n\nvoid SeccompEmulator::FreeSeccompFilters(FEX::HLE::ThreadStateObject* Thread) {\n  // Don't talk to me when I'm busy deleting myself.\n  auto lk = FEXCore::MaskSignalsAndLockMutex(FilterMutex);\n\n  bool HasFiltersToDelete {};\n  for (auto& Filter : Thread->Filters) {\n    auto RefCount = std::atomic_ref<uint64_t>(Filter->RefCount).fetch_sub(1);\n\n    if (RefCount == 1) {\n      HasFiltersToDelete = true;\n    }\n  }\n  Thread->Filters.clear();\n\n  if (HasFiltersToDelete) {\n    // Garbage collect filters\n    std::erase_if(Filters, [](auto& Filter) {\n      if (std::atomic_ref<uint64_t>(Filter.RefCount).load(std::memory_order_relaxed) != 0) {\n        return false;\n      }\n\n      FEXCore::Allocator::munmap(reinterpret_cast<void*>(Filter.Func), Filter.MappedSize);\n      return true;\n    });\n  }\n}\n\nstruct SerializedFilter {\n  size_t CodeSize;\n  uint32_t FilterInstructions;\n  bool ShouldLog;\n  char Code[];\n};\n\nstruct SerializationHeader {\n  size_t NumberOfFilters;\n  uint32_t SeccompMode;\n  SerializedFilter Filters[];\n};\n\nstd::optional<int> SeccompEmulator::SerializeFilters(FEXCore::Core::CpuStateFrame* Frame) {\n  auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n  if (Thread->SeccompMode == SECCOMP_MODE_DISABLED) {\n    // Didn't have seccomp enabled.\n    return std::nullopt;\n  }\n\n  int FD = memfd_create(\"seccomp_filters\", MFD_ALLOW_SEALING);\n  if (FD == -1) {\n    // Couldn't create memfd\n    LogMan::Msg::EFmt(\"Couldn't create seccomp filter FD!\");\n    return -1;\n  }\n\n  SerializationHeader Header {\n    .NumberOfFilters = Thread->Filters.size(),\n    .SeccompMode = Thread->SeccompMode,\n  };\n\n  int Res = write(FD, &Header, sizeof(Header));\n  if (Res == -1) {\n    LogMan::Msg::EFmt(\"Couldn't write header!\");\n    close(FD);\n    return -1;\n  }\n\n  for (auto& Filter : Thread->Filters) {\n    SerializedFilter SFilter {\n      .CodeSize = Filter->MappedSize,\n      .FilterInstructions = Filter->FilterInstructions,\n      .ShouldLog = Filter->ShouldLog,\n    };\n\n    Res = write(FD, &SFilter, sizeof(SFilter));\n    if (Res == -1) {\n      LogMan::Msg::EFmt(\"Couldn't write filter header!\");\n      close(FD);\n      return -1;\n    }\n\n    Res = write(FD, (const void*)Filter->Func, Filter->MappedSize);\n    if (Res == -1) {\n      LogMan::Msg::EFmt(\"Couldn't write filter!\");\n      close(FD);\n      return -1;\n    }\n  }\n\n  // Reset FD to start.\n  lseek(FD, 0, SEEK_SET);\n\n  // Seal everything about this FD.\n  if (fcntl(FD, F_ADD_SEALS, F_SEAL_SEAL | F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_WRITE | F_SEAL_FUTURE_WRITE) == -1) {\n    LogMan::Msg::IFmt(\"Couldn't seal seccomp serialize FD. Nefarious code could modify\");\n  }\n\n  return FD;\n}\n\nvoid SeccompEmulator::DeserializeFilters(FEXCore::Core::CpuStateFrame* Frame, int FD) {\n  auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n\n  SerializationHeader Header;\n  int Res = read(FD, &Header, sizeof(Header));\n  if (Res == -1 || Res != sizeof(Header)) {\n    LogMan::Msg::EFmt(\"Couldn't read Seccomp header!\");\n    close(FD);\n    return;\n  }\n\n  for (size_t i = 0; i < Header.NumberOfFilters; ++i) {\n    SerializedFilter SFilter;\n\n    Res = read(FD, &SFilter, sizeof(SFilter));\n    if (Res == -1 || Res != sizeof(SFilter)) {\n      LogMan::Msg::EFmt(\"Couldn't read Seccomp Filter header!\");\n      close(FD);\n      return;\n    }\n    auto Ptr = FEXCore::Allocator::mmap(nullptr, SFilter.CodeSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n    if (Ptr == (void*)~0ULL) {\n      LogMan::Msg::EFmt(\"Couldn't allocate ptr for filter!\");\n      close(FD);\n      return;\n    }\n\n    Res = read(FD, Ptr, SFilter.CodeSize);\n    if (Res == -1 || Res != SFilter.CodeSize) {\n      LogMan::Msg::EFmt(\"Couldn't read Seccomp Filter code!\");\n      close(FD);\n      return;\n    }\n\n    ::mprotect(Ptr, SFilter.CodeSize, PROT_READ | PROT_EXEC);\n\n    FEXCore::Allocator::VirtualName(\"FEXMem_Misc\", reinterpret_cast<void*>(Ptr), SFilter.CodeSize);\n\n    auto& it =\n      Filters.emplace_back(SeccompFilterInfo {(SeccompFilterFunc)Ptr, 1, SFilter.CodeSize, SFilter.FilterInstructions, SFilter.ShouldLog});\n    TotalFilterInstructions += SFilter.FilterInstructions;\n\n    // Append the filter to the thread.\n    Thread->Filters.emplace_back(&it);\n  }\n\n  Thread->SeccompMode = Header.SeccompMode;\n  close(FD);\n}\n\nSeccompEmulator::ExecuteFilterResult\nSeccompEmulator::ExecuteFilter(FEXCore::Core::CpuStateFrame* Frame, uint64_t JITPC, FEXCore::HLE::SyscallArguments* Args) {\n  auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n\n  if (Thread->Filters.empty()) {\n    // Seccomp not installed. Allow it.\n    return {false, 0};\n  }\n\n  // Reconstruct the RIP from the JITPC.\n  const uint64_t RIP = Thread->Thread->CTX->RestoreRIPFromHostPC(Frame->Thread, JITPC);\n\n  const auto Arch = Is64BitMode() ? AUDIT_ARCH_X86_64 : AUDIT_ARCH_I386;\n  bool ShouldLog {};\n  uint32_t SeccompResult {};\n\n  {\n    BPFEmitter::WorkingBuffer Data {\n      .Data =\n        {\n          .nr = static_cast<int32_t>(Args->Argument[0]),\n          .arch = Arch,\n          .instruction_pointer = RIP,\n          .args =\n            {\n              Args->Argument[1],\n              Args->Argument[2],\n              Args->Argument[3],\n              Args->Argument[4],\n              Args->Argument[5],\n              Args->Argument[6],\n            },\n        },\n    };\n\n    bool HasResult {};\n    // seccomp filters are executed from latest added to oldest.\n    for (auto it = Thread->Filters.rbegin(); it != Thread->Filters.rend(); ++it) {\n      // Explicitly zero scratch memory.\n      memset(&Data.ScratchMemory, 0, sizeof(Data.ScratchMemory));\n\n      uint32_t CurrentResult = (*it)->Func(0, 0, 0, 0, &Data);\n\n      if (!HasResult) {\n        SeccompResult = CurrentResult;\n        ShouldLog = (*it)->ShouldLog;\n        HasResult = true;\n        continue;\n      }\n\n      const int16_t CurrentAction = (CurrentResult & SECCOMP_RET_ACTION_FULL) >> 16;\n      const int16_t Action = (SeccompResult & SECCOMP_RET_ACTION_FULL) >> 16;\n\n      // All actions are executed but the first highest precendent result is returned.\n      // Precedent order from highest priority to lowest:\n      //   - SECCOMP_RET_KILL_PROCESS (0x8000, -32768)\n      //   - SECCOMP_RET_KILL_THREAD  (0x0000,      0)\n      //   - SECCOMP_RET_TRAP         (0x0003,      3)\n      //   - SECCOMP_RET_ERRNO        (0x0005,      5)\n      //   - SECCOMP_RET_USER_NOTIF   (0x7fc0,  32704)\n      //   - SECCOMP_RET_TRACE        (0x7ff0,  32752)\n      //   - SECCOMP_RET_LOG          (0x7ffc,  32764)\n      //   - SECCOMP_RET_ALLOW        (0x7fff,  32767)\n      if (CurrentAction < Action) {\n        SeccompResult = CurrentResult;\n        ShouldLog = (*it)->ShouldLog;\n      }\n    }\n  }\n\n  const auto ActionMasked = SeccompResult & SECCOMP_RET_ACTION_FULL;\n  const auto DataMasked = SeccompResult & SECCOMP_RET_DATA;\n\n  // Logging rules\n  // - Log if explicitly returning SECCOMP_RET_LOG\n  // - Log if the filter enabled the logging flag and the action is something other than SECCOMP_RET_ALLOW.\n  if ((ShouldLog && ActionMasked != SECCOMP_RET_ALLOW) || ActionMasked == SECCOMP_RET_LOG) {\n    int Signal = 0;\n    switch (ActionMasked) {\n    case SECCOMP_RET_KILL_PROCESS:\n    case SECCOMP_RET_KILL_THREAD: Signal = GetKillSignal(); break;\n    case SECCOMP_RET_TRAP: Signal = SIGSYS; break;\n    default: break;\n    }\n\n    // With real secommp the logs go to dmesg. log through FEX since we can't use dmesg.\n    // ex: `[13572.669277] audit: type=1326 audit(1715469332.533:62): auid=1000 uid=1000 gid=1000 ses=2 subj=unconfined pid=52546 comm=\"seccomp_bpf\"\n    // exe=\"/mnt/Work/Projects/work/linux/tools/testing/selftests/seccomp/seccomp_bpf\" sig=0 arch=c000003e syscall=39 compat=0 ip=0x7d789352725d code=0x7ffc0000`\n    timespec tp {};\n    clock_gettime(CLOCK_MONOTONIC, &tp);\n    LogMan::Msg::IFmt(\"audit: type={} audit({}.{:03}:{}): uid={} gid={} pid={} comm={} sig={} arch={:x} syscall={} ip=0x{:x} code=0x{:x}\",\n                      AUDIT_SECCOMP, tp.tv_sec, tp.tv_nsec / 1'000'000, AuditSerialIncrement(), ::getuid(), ::getgid(), ::getpid(),\n                      Filename(), Signal, Arch, Args->Argument[0], RIP, SeccompResult);\n  }\n\n  switch (ActionMasked) {\n  // Unknown actions behave like RET_KILL_PROCESS.\n  default:\n  case SECCOMP_RET_KILL_PROCESS: {\n    const int KillSignal = GetKillSignal();\n    // Ignores signal handler and sigmask\n    uint64_t Mask = 1ULL << (KillSignal - 1);\n    SignalDelegation->GuestSigProcMask(Thread, SIG_UNBLOCK, &Mask, nullptr);\n    SignalDelegation->UninstallHostHandler(KillSignal);\n    kill(0, KillSignal);\n    break;\n  }\n  case SECCOMP_RET_KILL_THREAD: {\n    // Ignores signal handler and sigmask\n    uint64_t Mask = 1 << (SIGSYS - 1);\n    SignalDelegation->GuestSigProcMask(Thread, SIG_UNBLOCK, &Mask, nullptr);\n    SignalDelegation->UninstallHostHandler(SIGSYS);\n    FHU::Syscalls::tgkill(::getpid(), ::gettid(), SIGSYS);\n    break;\n  }\n  case SECCOMP_RET_TRAP: {\n    siginfo_t Info {\n      .si_signo = SIGSYS,\n      .si_errno = static_cast<int32_t>(DataMasked),\n      .si_code = 1, // SYS_SECCOMP\n    };\n\n    Info.si_call_addr = reinterpret_cast<void*>(RIP);\n    Info.si_syscall = Args->Argument[0];\n    Info.si_arch = Arch;\n\n    SignalDelegation->QueueSignal(::getpid(), ::gettid(), SIGSYS, &Info, true);\n    break;\n  }\n  case SECCOMP_RET_ERRNO: {\n    // errno return is clamped.\n    return {true, -(std::min<uint64_t>(DataMasked, 4095))};\n  }\n  case SECCOMP_RET_TRACE: {\n    // When no tracer attached, behave like RET_ERRNO returning ENOSYS.\n    // TODO: Implement once FEX supports tracing.\n    return {true, static_cast<uint64_t>(-ENOSYS)};\n  }\n  case SECCOMP_RET_USER_NOTIF:\n  case SECCOMP_RET_LOG:\n  case SECCOMP_RET_ALLOW: break;\n  }\n\n  return {false, 0};\n}\n\n// Equivalent to seccomp(SECCOMP_SET_MODE_STRICT, ...);\nuint64_t SeccompEmulator::SetModeStrict(FEXCore::Core::CpuStateFrame* Frame, uint32_t flags, const void* arg) {\n  const auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n\n  if (::prctl(PR_GET_NO_NEW_PRIVS, 0, 0, 0, 0) == 0) {\n    // The caller did not have the CAP_SYS_ADMIN capability in its user namespace, or had not set no_new_privs before using SECCOMP_SET_MODE_FILTER.\n    return -EACCES;\n  }\n\n  if (flags != 0) {\n    // The specified flags are invalid for the given operation.\n    return -EINVAL;\n  }\n\n  if (arg != nullptr) {\n    // The specified arg are invalid for the given operation.\n    return -EINVAL;\n  }\n\n  if (Thread->SeccompMode == SECCOMP_MODE_FILTER) {\n    // Filter mode cannot move to strict\n    return -EINVAL;\n  }\n\n#define syscall_nr (offsetof(struct seccomp_data, nr))\n#define ALLOW_SYSCALL(name) \\\n  BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, FEX::HLE::x64::SYSCALL_x64_##name, 0, 1), BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW)\n#define ALLOW_SYSCALL_x32(name) \\\n  BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, FEX::HLE::x32::SYSCALL_x86_##name, 0, 1), BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW)\n\n  constexpr static struct sock_filter strict_filter_x64[] = {\n    // Load syscall number\n    BPF_STMT(BPF_LD + BPF_W + BPF_ABS, syscall_nr),\n\n    // Allow read, write, exit, exit_group, and sigreturn\n    ALLOW_SYSCALL(read),\n    ALLOW_SYSCALL(write),\n    ALLOW_SYSCALL(exit),\n    ALLOW_SYSCALL(exit_group),\n    ALLOW_SYSCALL(rt_sigreturn),\n    BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_KILL_PROCESS),\n  };\n\n  constexpr static struct sock_filter strict_filter_x32[] = {\n    // Load syscall number\n    BPF_STMT(BPF_LD + BPF_W + BPF_ABS, syscall_nr),\n\n    // Allow read, write, exit, exit_group, and sigreturn\n    ALLOW_SYSCALL_x32(read),\n    ALLOW_SYSCALL_x32(write),\n    ALLOW_SYSCALL_x32(exit),\n    ALLOW_SYSCALL_x32(exit_group),\n    ALLOW_SYSCALL_x32(rt_sigreturn),\n    ALLOW_SYSCALL_x32(sigreturn),\n    BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_KILL_PROCESS),\n  };\n\n  const sock_fprog prog_x64 {\n    .len = (unsigned short)(sizeof(strict_filter_x64) / sizeof(strict_filter_x64[0])),\n    .filter = const_cast<struct sock_filter*>(strict_filter_x64),\n  };\n\n  const sock_fprog prog_x32 {\n    .len = (unsigned short)(sizeof(strict_filter_x32) / sizeof(strict_filter_x32[0])),\n    .filter = const_cast<struct sock_filter*>(strict_filter_x32),\n  };\n  CurrentKillSignal = SIGKILL;\n  const sock_fprog* prog = Is64BitMode() ? &prog_x64 : &prog_x32;\n  SetModeFilter(Frame, 0, prog);\n  Thread->SeccompMode = SECCOMP_MODE_STRICT;\n\n  return 0;\n}\n\nuint64_t SeccompEmulator::CanDoTSync(FEXCore::Core::CpuStateFrame* Frame) {\n  auto ParentThread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n  auto Threads = SyscallHandler->TM.GetThreads();\n\n  for (auto& Thread : *Threads) {\n    if (Thread == ParentThread) {\n      // Skip same thread.\n      continue;\n    }\n\n    if (Thread->SeccompMode == SECCOMP_MODE_DISABLED) {\n      // Threads which have seccomp disabled are safe to TSync\n      continue;\n    }\n\n    if (Thread->SeccompMode != ParentThread->SeccompMode) {\n      /// If the seccomp mode differs between threads then it can't tsync.\n      /// Strict versus filter mode aren't tsync compatible.\n      return Thread->ThreadInfo.TID;\n    }\n\n    if (Thread->Filters.size() != ParentThread->Filters.size()) {\n      // If the filter count doesn't even match then it can't tsync.\n      return Thread->ThreadInfo.TID;\n    }\n\n    // Walk each filter and ensure the entry points are the same and in the same order.\n    for (size_t i = 0; i < ParentThread->Filters.size(); ++i) {\n      if (Thread->Filters[i]->Func != ParentThread->Filters[i]->Func) {\n        /// Entry point mismatch, not the same filter.\n        /// Not tsync compatible.\n        return Thread->ThreadInfo.TID;\n      }\n    }\n  }\n\n  // Everything matched. tsync compatible!\n  return 0;\n}\n\nvoid SeccompEmulator::TSyncFilters(FEXCore::Core::CpuStateFrame* Frame) {\n  auto ParentThread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n  auto Threads = SyscallHandler->TM.GetThreads();\n\n  for (auto& Thread : *Threads) {\n    if (Thread == ParentThread) {\n      // Skip same thread.\n      continue;\n    }\n\n    Thread->Filters.clear();\n    Thread->Filters = ParentThread->Filters;\n    for (auto& Filter : ParentThread->Filters) {\n      // Need to increment all the refcounters\n      std::atomic_ref<uint64_t>(Filter->RefCount)++;\n    }\n    Thread->SeccompMode = ParentThread->SeccompMode;\n  }\n}\n\n// Equivalent to seccomp(SECCOMP_SET_MODE_FILTER, ...);\nuint64_t SeccompEmulator::SetModeFilter(FEXCore::Core::CpuStateFrame* Frame, uint32_t flags, const sock_fprog* prog) {\n  auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n\n  // Order of checks in this function matter\n  // 1) Check flags\n  // 2) Check if program is invalid\n  uint32_t SUPPORTED_FLAGS = SECCOMP_FILTER_FLAG_TSYNC |      // 1U << 0\n                             SECCOMP_FILTER_FLAG_LOG |        // 1U << 1\n                             SECCOMP_FILTER_FLAG_SPEC_ALLOW | // 1U << 2\n                             // SECCOMP_FILTER_FLAG_NEW_LISTENER |      // 1U << 3\n                             SECCOMP_FILTER_FLAG_TSYNC_ESRCH | // 1U << 4\n                             0;\n\n  const bool DoingTsync = flags & SECCOMP_FILTER_FLAG_TSYNC;\n\n  if (flags & ~SUPPORTED_FLAGS) {\n    // Unknown flags passed in.\n    return -EINVAL;\n  }\n\n  if ((flags & SECCOMP_FILTER_FLAG_TSYNC) && (flags & SECCOMP_FILTER_FLAG_NEW_LISTENER) && !(flags & SECCOMP_FILTER_FLAG_TSYNC_ESRCH)) {\n    /// If NEW_LISTENER and TSYNC are both used then TSYNC_ESRCH must also be set.\n    /// Otherwise on error there would be no way to tell the difference between success and failure.\n    return -EINVAL;\n  }\n\n  if (!prog) {\n    return -EFAULT;\n  }\n\n  if (::prctl(PR_GET_NO_NEW_PRIVS, 0, 0, 0, 0) == 0) {\n    // The caller did not have the CAP_SYS_ADMIN capability in its user namespace, or had not set no_new_privs before using SECCOMP_SET_MODE_FILTER.\n    return -EACCES;\n  }\n\n  if (prog->len > BPF_MAXINSNS || prog->len == 0) {\n    // operation specified SECCOMP_SET_MODE_FILTER, but the filter program pointed to by args was not valid or the length of the filter\n    // program was zero or exceeded BPF_MAXINSNS (4096) instructions.\n    return -EINVAL;\n  }\n\n  // Don't interrupt me while I'm jitting.\n  auto lk = FEXCore::MaskSignalsAndLockMutex(FilterMutex);\n\n  const size_t TotalFinalInstructions = TotalFilterInstructions + prog->len + Thread->Filters.size() * BPF_MULTIFILTERPENALTY;\n  if (TotalFinalInstructions > BPF_MAX_INSNS_PER_PATH) {\n    return -ENOMEM;\n  }\n\n  if constexpr (false) {\n    // Useful for debugging seccomp problems.\n    DumpProgram(prog);\n  }\n\n  if (DoingTsync) {\n    auto TSyncThread = CanDoTSync(Frame);\n    if (TSyncThread != 0) {\n      if (flags & SECCOMP_FILTER_FLAG_TSYNC_ESRCH) {\n        // This flag explicitly ensures that if TSYNC can't sync then it won't return a TID.\n        return -ESRCH;\n      } else {\n        // Return the TID that caused a tsync problem.\n        return TSyncThread;\n      }\n    }\n  }\n\n  BPFEmitter emit {};\n  const bool LoggingEnabled = flags & SECCOMP_FILTER_FLAG_LOG;\n  auto Result = emit.JITFilter(flags, prog);\n  if (Result == 0) {\n    auto& it = Filters.emplace_back(SeccompFilterInfo {(SeccompFilterFunc)emit.GetFunc(), 1, emit.AllocationSize(), prog->len, LoggingEnabled});\n    TotalFilterInstructions += prog->len;\n\n    // Append the filter to the thread.\n    Thread->Filters.emplace_back(&it);\n    Thread->SeccompMode = SECCOMP_MODE_FILTER;\n    if (flags & SECCOMP_FILTER_FLAG_TSYNC) {\n      TSyncFilters(Frame);\n    }\n  }\n\n  return Result;\n}\n\n// Equivalent to seccomp(SECCOMP_GET_ACTION_AVAIL, ...);\nuint64_t SeccompEmulator::GetActionAvail(uint32_t flags, const uint32_t* action) {\n  if (flags != 0) {\n    // Unknown flags passed in\n    return -EINVAL;\n  }\n\n  if (!action) {\n    // Invalid action\n    return -EFAULT;\n  }\n  switch (*action) {\n  case SECCOMP_RET_KILL_PROCESS:\n  case SECCOMP_RET_KILL_THREAD:\n  case SECCOMP_RET_TRAP:\n  case SECCOMP_RET_ERRNO:\n  case SECCOMP_RET_LOG:\n  case SECCOMP_RET_ALLOW: return 0;\n  case SECCOMP_RET_USER_NOTIF:\n  case SECCOMP_RET_TRACE:\n  default: break;\n  }\n\n  return -EOPNOTSUPP;\n}\n\n// Equivalent to seccomp(SECCOMP_GET_NOTIF_SIZES, ...);\nuint64_t SeccompEmulator::GetNotifSizes(uint32_t flags, struct seccomp_notif_sizes* sizes) {\n  if (flags != 0) {\n    // Unknown flags passed in\n    return -EINVAL;\n  }\n  sizes->seccomp_notif = sizeof(struct seccomp_notif);\n  sizes->seccomp_notif_resp = sizeof(struct seccomp_notif_resp);\n  sizes->seccomp_data = sizeof(struct seccomp_data);\n\n  return 0;\n}\n\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Seccomp/SeccompEmulator.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n#pragma once\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/fextl/list.h>\n#include <FEXCore/Utils/SignalScopeGuards.h>\n\n#include <atomic>\n#include <csignal>\n#include <cstddef>\n#include <cstdint>\n#include <optional>\n\nstruct sock_fprog;\nstruct seccomp_data;\nstruct seccomp_notif_sizes;\n\nnamespace FEXCore {\n\nnamespace Core {\n  struct CpuStateFrame;\n}\n\nnamespace HLE {\n  struct SyscallArguments;\n}\n\n} // namespace FEXCore\n\nnamespace FEX::HLE {\n\nclass SignalDelegator;\nclass SyscallHandler;\nstruct ThreadStateObject;\n\nusing SeccompFilterFunc = uint64_t (*)(uint32_t Acc, uint32_t Index, uint32_t Tmp, uint32_t Tmp2, void* Data);\nstruct SeccompFilterInfo final {\n  SeccompFilterFunc Func;\n  uint64_t RefCount;\n  size_t MappedSize;\n  uint32_t FilterInstructions;\n  bool ShouldLog;\n};\n\nclass SeccompEmulator final {\npublic:\n  SeccompEmulator(FEX::HLE::SyscallHandler* SyscallHandler, FEX::HLE::SignalDelegator* SignalDelegation)\n    : SyscallHandler {SyscallHandler}\n    , SignalDelegation {SignalDelegation} {}\n\n  uint64_t Handle(FEXCore::Core::CpuStateFrame* Frame, uint32_t Op, uint32_t flags, void* arg);\n\n  // Equivalent to prctl(PR_GET_SECCOMP)\n  uint64_t GetSeccomp(FEXCore::Core::CpuStateFrame* Frame);\n\n  void InheritSeccompFilters(FEX::HLE::ThreadStateObject* Parent, FEX::HLE::ThreadStateObject* Child);\n  void FreeSeccompFilters(FEX::HLE::ThreadStateObject* Thread);\n\n  struct ExecuteFilterResult {\n    bool EarlyReturn {};\n    uint64_t Result;\n  };\n  ExecuteFilterResult ExecuteFilter(FEXCore::Core::CpuStateFrame* Frame, uint64_t JITPC, FEXCore::HLE::SyscallArguments* Args);\n  int GetKillSignal() const {\n    return CurrentKillSignal;\n  }\n\n  std::optional<int> SerializeFilters(FEXCore::Core::CpuStateFrame* Frame);\n  void DeserializeFilters(FEXCore::Core::CpuStateFrame* Frame, int FD);\n\nprivate:\n  FEX_CONFIG_OPT(Is64BitMode, IS64BIT_MODE);\n  FEX_CONFIG_OPT(NeedsSeccomp, NEEDSSECCOMP);\n  FEX_CONFIG_OPT(Filename, APP_FILENAME);\n  FEX::HLE::SyscallHandler* SyscallHandler;\n  FEX::HLE::SignalDelegator* SignalDelegation;\n\n  int CurrentKillSignal {SIGSYS};\n\n  // Equivalent to seccomp(SECCOMP_SET_MODE_STRICT, ...);\n  uint64_t SetModeStrict(FEXCore::Core::CpuStateFrame* Frame, uint32_t flags, const void* arg);\n  // Equivalent to seccomp(SECCOMP_SET_MODE_FILTER, ...);\n  uint64_t SetModeFilter(FEXCore::Core::CpuStateFrame* Frame, uint32_t flags, const sock_fprog* prog);\n  // Equivalent to seccomp(SECCOMP_GET_ACTION_AVAIL, ...);\n  uint64_t GetActionAvail(uint32_t flags, const uint32_t* action);\n  // Equivalent to seccomp(SECCOMP_GET_NOTIF_SIZES, ...);\n  uint64_t GetNotifSizes(uint32_t flags, struct seccomp_notif_sizes* sizes);\n\n  // 0 on TSync possible\n  /// TID for the first thread that breaks tsync.\n  uint64_t CanDoTSync(FEXCore::Core::CpuStateFrame* Frame);\n  void TSyncFilters(FEXCore::Core::CpuStateFrame* Frame);\n\n  static void DumpProgram(const sock_fprog* prog);\n\n  // Multiple filter instruction count penalty.\n  // When multiple filters are installed there is a penalty per filter counted towards the maximum number of instructions.\n  constexpr static size_t BPF_MULTIFILTERPENALTY = 4;\n  // Maximum number of BPF instructions.\n  constexpr static size_t BPF_MAX_INSNS_PER_PATH = 32768;\n  uint64_t TotalFilterInstructions {};\n\n  FEXCore::ForkableUniqueMutex FilterMutex;\n  fextl::list<SeccompFilterInfo> Filters {};\n\n  uint64_t AuditSerialIncrement() {\n    return AuditSerial.fetch_add(1);\n  }\n  std::atomic<uint64_t> AuditSerial {};\n};\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/SignalDelegator/GuestFramesManagement.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|common\ndesc: Handles host -> host and host -> guest signal routing, emulates procmask & co\n$end_info$\n*/\n\n#include \"LinuxSyscalls/SignalDelegator.h\"\n\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/SignalDelegator.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/Utils/ArchHelpers/Arm64.h>\n#include <FEXCore/Utils/FPState.h>\n#include <FEXCore/Utils/MathUtils.h>\n\n#include <csignal>\n#include <cstddef>\n#include <cstdint>\n#include <cstring>\n\nnamespace FEX::HLE {\nconstexpr uint32_t X86_SA_RESTORER = 0x04000000;\n// Total number of layouts that siginfo supports.\nenum class SigInfoLayout {\n  LAYOUT_KILL,\n  LAYOUT_TIMER,\n  LAYOUT_POLL,\n  LAYOUT_FAULT,\n  LAYOUT_FAULT_RIP,\n  LAYOUT_CHLD,\n  LAYOUT_RT,\n  LAYOUT_SYS,\n};\n\n// Calculate the siginfo layout based on Signal and si_code.\nstatic SigInfoLayout CalculateSigInfoLayout(int Signal, int si_code, uint32_t err_code) {\n  if (si_code > SI_USER && si_code < SI_KERNEL) {\n    // For signals that are not considered RT.\n    if (Signal == SIGSEGV || Signal == SIGBUS || Signal == SIGTRAP) {\n      if (err_code & FEXCore::X86State::X86_PF_INSTR) {\n        // Fault layout but addr refers to RIP.\n        return SigInfoLayout::LAYOUT_FAULT_RIP;\n      } else {\n        // Regular FAULT layout.\n        return SigInfoLayout::LAYOUT_FAULT;\n      }\n    } else if (Signal == SIGILL || Signal == SIGFPE) {\n      // Fault layout but addr refers to RIP.\n      return SigInfoLayout::LAYOUT_FAULT_RIP;\n    } else if (Signal == SIGCHLD) {\n      // Child layout\n      return SigInfoLayout::LAYOUT_CHLD;\n    } else if (Signal == SIGPOLL) {\n      // Poll layout\n      return SigInfoLayout::LAYOUT_POLL;\n    } else if (Signal == SIGSYS) {\n      // Sys layout\n      return SigInfoLayout::LAYOUT_SYS;\n    }\n  } else {\n    // Negative si_codes are kernel specific things.\n    if (si_code == SI_TIMER) {\n      return SigInfoLayout::LAYOUT_TIMER;\n    } else if (si_code == SI_SIGIO) {\n      return SigInfoLayout::LAYOUT_POLL;\n    } else if (si_code < 0) {\n      return SigInfoLayout::LAYOUT_RT;\n    }\n  }\n\n  return SigInfoLayout::LAYOUT_KILL;\n}\n\nstatic uint32_t ConvertSignalToTrapNo(int Signal, siginfo_t* HostSigInfo) {\n  switch (Signal) {\n  case SIGSEGV:\n    if (HostSigInfo->si_code == SEGV_MAPERR || HostSigInfo->si_code == SEGV_ACCERR) {\n      // Protection fault\n      return FEXCore::X86State::X86_TRAPNO_PF;\n    }\n    break;\n  }\n\n  // Unknown mapping, fall back to old behaviour and just pass signal\n  return Signal;\n}\n\nstatic uint32_t ConvertSignalToError(void* ucontext, int Signal, siginfo_t* HostSigInfo) {\n  switch (Signal) {\n  case SIGSEGV:\n    if (HostSigInfo->si_code == SEGV_MAPERR || HostSigInfo->si_code == SEGV_ACCERR) {\n      // Protection fault\n      // Always a user fault for us\n      return ArchHelpers::Context::GetProtectFlags(ucontext);\n    }\n    break;\n  }\n\n  // Not a page fault issue\n  return 0;\n}\n\ntemplate<typename T>\nstatic void SetXStateInfo(T* xstate, bool is_avx_enabled) {\n  auto* fpstate = &xstate->fpstate;\n\n  fpstate->sw_reserved.magic1 = is_avx_enabled ? FEXCore::x86_64::fpx_sw_bytes::FP_XSTATE_MAGIC_1 : 0;\n  fpstate->sw_reserved.extended_size = is_avx_enabled ? sizeof(T) : 0;\n\n  fpstate->sw_reserved.xfeatures |= FEXCore::x86_64::fpx_sw_bytes::FEATURE_FP | FEXCore::x86_64::fpx_sw_bytes::FEATURE_SSE;\n  if (is_avx_enabled) {\n    fpstate->sw_reserved.xfeatures |= FEXCore::x86_64::fpx_sw_bytes::FEATURE_YMM;\n  }\n\n  fpstate->sw_reserved.xstate_size = fpstate->sw_reserved.extended_size;\n\n  if (is_avx_enabled) {\n    xstate->xstate_hdr.xfeatures = 0;\n    xstate->magic2.magic = FEXCore::x86_64::fpx_sw_bytes::FP_XSTATE_MAGIC_2;\n  }\n}\n\nvoid SignalDelegator::RestoreFrame_x64(FEXCore::Core::InternalThreadState* Thread, ArchHelpers::Context::ContextBackup* Context,\n                                       FEXCore::Core::CpuStateFrame* Frame, void* ucontext) {\n  auto* guest_uctx = reinterpret_cast<FEXCore::x86_64::ucontext_t*>(Context->UContextLocation);\n  [[maybe_unused]] auto* guest_siginfo = reinterpret_cast<siginfo_t*>(Context->SigInfoLocation);\n\n  // If the guest modified the RIP then we need to take special precautions here\n  if (Context->OriginalRIP != guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_RIP] || Context->FaultToTopAndGeneratedException) {\n\n    // Restore previous `InSyscallInfo` structure.\n    Frame->InSyscallInfo = Context->InSyscallInfo;\n\n    // Hack! Go back to the top of the dispatcher top\n    // This is only safe inside the JIT rather than anything outside of it\n    ArchHelpers::Context::SetPc(ucontext, Config.AbsoluteLoopTopAddressFillSRA);\n    ArchHelpers::Context::SetFillSRASingleInst(ucontext, false);\n    // Set our state register to point to our guest thread data\n    ArchHelpers::Context::SetState(ucontext, reinterpret_cast<uint64_t>(Frame));\n\n    Frame->State.rip = guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_RIP];\n\n    // Restore segments.\n    // FS and GS are explicitly ignored here, as WRFSGSbase is used instead.\n    Frame->State.cs_idx = (guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_CSGSFS] >> 0) & 0xffff;\n    Frame->State.ss_idx = (guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_CSGSFS] >> 48) & 0xffff;\n\n    Frame->State.cs_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.cs_idx));\n    Frame->State.ss_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.ss_idx));\n\n    // XXX: Full context setting\n    CTX->SetFlagsFromCompactedEFLAGS(Thread, guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_EFL]);\n\n#define COPY_REG(x) Frame->State.gregs[FEXCore::X86State::REG_##x] = guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_##x];\n    COPY_REG(R8);\n    COPY_REG(R9);\n    COPY_REG(R10);\n    COPY_REG(R11);\n    COPY_REG(R12);\n    COPY_REG(R13);\n    COPY_REG(R14);\n    COPY_REG(R15);\n    COPY_REG(RDI);\n    COPY_REG(RSI);\n    COPY_REG(RBP);\n    COPY_REG(RBX);\n    COPY_REG(RDX);\n    COPY_REG(RAX);\n    COPY_REG(RCX);\n    COPY_REG(RSP);\n#undef COPY_REG\n    auto* xstate = reinterpret_cast<FEXCore::x86_64::xstate*>(guest_uctx->uc_mcontext.fpregs);\n    auto* fpstate = &xstate->fpstate;\n\n    if (SupportsAVX) {\n      CTX->SetXMMRegistersFromState(Thread, fpstate->_xmm, xstate->ymmh.ymmh_space);\n    } else {\n      CTX->SetXMMRegistersFromState(Thread, fpstate->_xmm, nullptr);\n    }\n\n    // FCW store default\n    Frame->State.FCW = fpstate->fcw;\n    Frame->State.AbridgedFTW = fpstate->ftw;\n\n    // Deconstruct FSW\n    Frame->State.flags[FEXCore::X86State::X87FLAG_IE_LOC] = fpstate->fsw & 1;\n    Frame->State.flags[FEXCore::X86State::X87FLAG_C0_LOC] = (fpstate->fsw >> 8) & 1;\n    Frame->State.flags[FEXCore::X86State::X87FLAG_C1_LOC] = (fpstate->fsw >> 9) & 1;\n    Frame->State.flags[FEXCore::X86State::X87FLAG_C2_LOC] = (fpstate->fsw >> 10) & 1;\n    Frame->State.flags[FEXCore::X86State::X87FLAG_C3_LOC] = (fpstate->fsw >> 14) & 1;\n    Frame->State.flags[FEXCore::X86State::X87FLAG_TOP_LOC] = (fpstate->fsw >> 11) & 0b111;\n\n    // Copy float registers\n    const uint16_t CurrentOffset = Frame->State.flags[FEXCore::X86State::X87FLAG_TOP_LOC];\n    for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_MMS; ++i) {\n      const auto modulo_i = (i + CurrentOffset) % 8;\n      memcpy(&Frame->State.mm[modulo_i], &fpstate->_st[i], sizeof(Frame->State.mm[0]));\n    }\n  }\n}\n\nvoid SignalDelegator::RestoreFrame_ia32(FEXCore::Core::InternalThreadState* Thread, ArchHelpers::Context::ContextBackup* Context,\n                                        FEXCore::Core::CpuStateFrame* Frame, void* ucontext) {\n  SigFrame_i32* guest_uctx = reinterpret_cast<SigFrame_i32*>(Context->UContextLocation);\n  // If the guest modified the RIP then we need to take special precautions here\n  if (Context->OriginalRIP != guest_uctx->sc.ip || Context->FaultToTopAndGeneratedException) {\n    // Restore previous `InSyscallInfo` structure.\n    Frame->InSyscallInfo = Context->InSyscallInfo;\n\n    // Hack! Go back to the top of the dispatcher top\n    // This is only safe inside the JIT rather than anything outside of it\n    ArchHelpers::Context::SetPc(ucontext, Config.AbsoluteLoopTopAddressFillSRA);\n    ArchHelpers::Context::SetFillSRASingleInst(ucontext, false);\n    // Set our state register to point to our guest thread data\n    ArchHelpers::Context::SetState(ucontext, reinterpret_cast<uint64_t>(Frame));\n\n    // XXX: Full context setting\n    CTX->SetFlagsFromCompactedEFLAGS(Thread, guest_uctx->sc.flags);\n\n    Frame->State.rip = guest_uctx->sc.ip;\n    Frame->State.cs_idx = guest_uctx->sc.cs;\n    Frame->State.ds_idx = guest_uctx->sc.ds;\n    Frame->State.es_idx = guest_uctx->sc.es;\n    Frame->State.fs_idx = guest_uctx->sc.fs;\n    Frame->State.gs_idx = guest_uctx->sc.gs;\n    Frame->State.ss_idx = guest_uctx->sc.ss;\n\n    Frame->State.cs_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.cs_idx));\n    Frame->State.ds_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.ds_idx));\n    Frame->State.es_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.es_idx));\n    Frame->State.fs_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.fs_idx));\n    Frame->State.gs_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.gs_idx));\n    Frame->State.ss_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.ss_idx));\n\n#define COPY_REG(x, y) Frame->State.gregs[FEXCore::X86State::REG_##x] = guest_uctx->sc.y;\n    COPY_REG(RDI, di);\n    COPY_REG(RSI, si);\n    COPY_REG(RBP, bp);\n    COPY_REG(RBX, bx);\n    COPY_REG(RDX, dx);\n    COPY_REG(RAX, ax);\n    COPY_REG(RCX, cx);\n    COPY_REG(RSP, sp);\n#undef COPY_REG\n    auto* xstate = reinterpret_cast<FEXCore::x86::xstate*>(guest_uctx->sc.fpstate);\n    auto* fpstate = &xstate->fpstate;\n\n    // Extended XMM state\n    if (SupportsAVX) {\n      CTX->SetXMMRegistersFromState(Thread, fpstate->_xmm, xstate->ymmh.ymmh_space);\n    } else {\n      CTX->SetXMMRegistersFromState(Thread, fpstate->_xmm, nullptr);\n    }\n\n    // FCW store default\n    Frame->State.FCW = fpstate->fcw;\n    Frame->State.AbridgedFTW = FEXCore::FPState::ConvertToAbridgedFTW(fpstate->ftw);\n\n    // Deconstruct FSW\n    Frame->State.flags[FEXCore::X86State::X87FLAG_IE_LOC] = fpstate->fsw & 1;\n    Frame->State.flags[FEXCore::X86State::X87FLAG_C0_LOC] = (fpstate->fsw >> 8) & 1;\n    Frame->State.flags[FEXCore::X86State::X87FLAG_C1_LOC] = (fpstate->fsw >> 9) & 1;\n    Frame->State.flags[FEXCore::X86State::X87FLAG_C2_LOC] = (fpstate->fsw >> 10) & 1;\n    Frame->State.flags[FEXCore::X86State::X87FLAG_C3_LOC] = (fpstate->fsw >> 14) & 1;\n    Frame->State.flags[FEXCore::X86State::X87FLAG_TOP_LOC] = (fpstate->fsw >> 11) & 0b111;\n\n    // Copy float registers\n    const uint16_t CurrentOffset = Frame->State.flags[FEXCore::X86State::X87FLAG_TOP_LOC];\n    for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_MMS; ++i) {\n      // 32-bit st register size is only 10 bytes. Not padded to 16byte like x86-64\n      const auto modulo_i = (i + CurrentOffset) % 8;\n      memcpy(&Frame->State.mm[modulo_i], &fpstate->_st[i], 10);\n    }\n  }\n}\n\nvoid SignalDelegator::RestoreRTFrame_ia32(FEXCore::Core::InternalThreadState* Thread, ArchHelpers::Context::ContextBackup* Context,\n                                          FEXCore::Core::CpuStateFrame* Frame, void* ucontext) {\n  RTSigFrame_i32* guest_uctx = reinterpret_cast<RTSigFrame_i32*>(Context->UContextLocation);\n  // If the guest modified the RIP then we need to take special precautions here\n  if (Context->OriginalRIP != guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_EIP] || Context->FaultToTopAndGeneratedException) {\n\n    // Restore previous `InSyscallInfo` structure.\n    Frame->InSyscallInfo = Context->InSyscallInfo;\n\n    // Hack! Go back to the top of the dispatcher top\n    // This is only safe inside the JIT rather than anything outside of it\n    ArchHelpers::Context::SetPc(ucontext, Config.AbsoluteLoopTopAddressFillSRA);\n    ArchHelpers::Context::SetFillSRASingleInst(ucontext, false);\n    // Set our state register to point to our guest thread data\n    ArchHelpers::Context::SetState(ucontext, reinterpret_cast<uint64_t>(Frame));\n\n    // XXX: Full context setting\n    CTX->SetFlagsFromCompactedEFLAGS(Thread, guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_EFL]);\n\n    Frame->State.rip = guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_EIP];\n    Frame->State.cs_idx = guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_CS];\n    Frame->State.ds_idx = guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_DS];\n    Frame->State.es_idx = guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_ES];\n    Frame->State.fs_idx = guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_FS];\n    Frame->State.gs_idx = guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_GS];\n    Frame->State.ss_idx = guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_SS];\n\n    Frame->State.cs_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.cs_idx));\n    Frame->State.ds_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.ds_idx));\n    Frame->State.es_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.es_idx));\n    Frame->State.fs_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.fs_idx));\n    Frame->State.gs_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.gs_idx));\n    Frame->State.ss_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.ss_idx));\n\n#define COPY_REG(x) Frame->State.gregs[FEXCore::X86State::REG_##x] = guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_##x];\n    COPY_REG(RDI);\n    COPY_REG(RSI);\n    COPY_REG(RBP);\n    COPY_REG(RBX);\n    COPY_REG(RDX);\n    COPY_REG(RAX);\n    COPY_REG(RCX);\n    COPY_REG(RSP);\n#undef COPY_REG\n    auto* xstate = reinterpret_cast<FEXCore::x86::xstate*>(guest_uctx->uc.uc_mcontext.fpregs);\n    auto* fpstate = &xstate->fpstate;\n\n    // Extended XMM state\n    if (SupportsAVX) {\n      CTX->SetXMMRegistersFromState(Thread, fpstate->_xmm, xstate->ymmh.ymmh_space);\n    } else {\n      CTX->SetXMMRegistersFromState(Thread, fpstate->_xmm, nullptr);\n    }\n\n    // FCW store default\n    Frame->State.FCW = fpstate->fcw;\n    Frame->State.AbridgedFTW = FEXCore::FPState::ConvertToAbridgedFTW(fpstate->ftw);\n\n    // Deconstruct FSW\n    Frame->State.flags[FEXCore::X86State::X87FLAG_IE_LOC] = fpstate->fsw & 1;\n    Frame->State.flags[FEXCore::X86State::X87FLAG_C0_LOC] = (fpstate->fsw >> 8) & 1;\n    Frame->State.flags[FEXCore::X86State::X87FLAG_C1_LOC] = (fpstate->fsw >> 9) & 1;\n    Frame->State.flags[FEXCore::X86State::X87FLAG_C2_LOC] = (fpstate->fsw >> 10) & 1;\n    Frame->State.flags[FEXCore::X86State::X87FLAG_C3_LOC] = (fpstate->fsw >> 14) & 1;\n    Frame->State.flags[FEXCore::X86State::X87FLAG_TOP_LOC] = (fpstate->fsw >> 11) & 0b111;\n\n    // Copy float registers\n    const uint16_t CurrentOffset = Frame->State.flags[FEXCore::X86State::X87FLAG_TOP_LOC];\n    for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_MMS; ++i) {\n      // 32-bit st register size is only 10 bytes. Not padded to 16byte like x86-64\n      const auto modulo_i = (i + CurrentOffset) % 8;\n      memcpy(&Frame->State.mm[modulo_i], &fpstate->_st[i], 10);\n    }\n  }\n}\n\nuint64_t SignalDelegator::SetupFrame_x64(FEXCore::Core::InternalThreadState* Thread, ArchHelpers::Context::ContextBackup* ContextBackup,\n                                         FEXCore::Core::CpuStateFrame* Frame, int Signal, siginfo_t* HostSigInfo, void* ucontext,\n                                         GuestSigAction* GuestAction, stack_t* GuestStack, uint64_t NewGuestSP, const uint32_t eflags) {\n\n  // Back up past the redzone, which is 128bytes\n  // 32-bit doesn't have a redzone\n  NewGuestSP -= 128;\n\n  // On 64-bit the kernel sets up the siginfo_t and ucontext_t regardless of SA_SIGINFO set.\n  // This allows the application to /always/ get the siginfo and ucontext even if it didn't set this flag.\n  //\n  // Signal frame layout on stack needs to be as follows\n  // void* ReturnPointer\n  // ucontext_t\n  // siginfo_t\n  // FP state\n  // Host stack location\n  NewGuestSP -= sizeof(uint64_t);\n  NewGuestSP = FEXCore::AlignDown(NewGuestSP, alignof(uint64_t));\n\n  uint64_t HostStackLocation = NewGuestSP;\n\n  if (SupportsAVX) {\n    NewGuestSP -= sizeof(FEXCore::x86_64::xstate);\n    NewGuestSP = FEXCore::AlignDown(NewGuestSP, alignof(FEXCore::x86_64::xstate));\n  } else {\n    NewGuestSP -= sizeof(FEXCore::x86_64::_libc_fpstate);\n    NewGuestSP = FEXCore::AlignDown(NewGuestSP, alignof(FEXCore::x86_64::_libc_fpstate));\n  }\n\n  uint64_t FPStateLocation = NewGuestSP;\n\n  NewGuestSP -= sizeof(siginfo_t);\n  NewGuestSP = FEXCore::AlignDown(NewGuestSP, alignof(siginfo_t));\n  uint64_t SigInfoLocation = NewGuestSP;\n\n  NewGuestSP -= sizeof(FEXCore::x86_64::ucontext_t);\n  NewGuestSP = FEXCore::AlignDown(NewGuestSP, alignof(FEXCore::x86_64::ucontext_t));\n  uint64_t UContextLocation = NewGuestSP;\n\n  ContextBackup->FPStateLocation = FPStateLocation;\n  ContextBackup->UContextLocation = UContextLocation;\n  ContextBackup->SigInfoLocation = SigInfoLocation;\n\n  FEXCore::x86_64::ucontext_t* guest_uctx = reinterpret_cast<FEXCore::x86_64::ucontext_t*>(UContextLocation);\n  siginfo_t* guest_siginfo = reinterpret_cast<siginfo_t*>(SigInfoLocation);\n  // Store where the host context lives in the guest stack.\n  *(uint64_t*)HostStackLocation = (uint64_t)ContextBackup;\n\n  // We have extended float information\n  guest_uctx->uc_flags = FEXCore::x86_64::UC_FP_XSTATE | FEXCore::x86_64::UC_SIGCONTEXT_SS | FEXCore::x86_64::UC_STRICT_RESTORE_SS;\n\n  // Pointer to where the fpreg memory is\n  guest_uctx->uc_mcontext.fpregs = reinterpret_cast<FEXCore::x86_64::_libc_fpstate*>(FPStateLocation);\n  auto* xstate = reinterpret_cast<FEXCore::x86_64::xstate*>(FPStateLocation);\n  SetXStateInfo(xstate, SupportsAVX);\n\n  guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_RIP] = ContextBackup->OriginalRIP;\n  guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_EFL] = eflags;\n  // This stores the CS/GS/FS selectors. It ALSO stores the SS selector in the top 16 bits...For some reason.\n  // Despite the naming, the endianness is swapped from what you'd expect.\n  guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_CSGSFS] =\n    ((uint64_t)Frame->State.ss_idx << 48) | ((uint64_t)Frame->State.fs_idx << 32) | ((uint64_t)Frame->State.gs_idx << 16) |\n    ((uint64_t)Frame->State.cs_idx << 0);\n\n  // aarch64 and x86_64 siginfo_t matches. We can just copy this over\n  // SI_USER could also potentially have random data in it, needs to be bit perfect\n  // For guest faults we don't have a real way to reconstruct state to a real guest RIP\n  *guest_siginfo = *HostSigInfo;\n\n  if (ContextBackup->FaultToTopAndGeneratedException) {\n    guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_TRAPNO] = Frame->SynchronousFaultData.TrapNo;\n    guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_ERR] = Frame->SynchronousFaultData.err_code;\n\n    // Overwrite si_code and si_addr\n    guest_siginfo->si_code = Thread->CurrentFrame->SynchronousFaultData.si_code;\n    guest_siginfo->si_addr = reinterpret_cast<void*>(ContextBackup->OriginalRIP);\n    Signal = Frame->SynchronousFaultData.Signal;\n  } else {\n    guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_TRAPNO] = ConvertSignalToTrapNo(Signal, HostSigInfo);\n    guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_ERR] = ConvertSignalToError(ucontext, Signal, HostSigInfo);\n  }\n  guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_OLDMASK] = 0;\n  guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_CR2] = 0;\n\n#define COPY_REG(x) guest_uctx->uc_mcontext.gregs[FEXCore::x86_64::FEX_REG_##x] = Frame->State.gregs[FEXCore::X86State::REG_##x];\n  COPY_REG(R8);\n  COPY_REG(R9);\n  COPY_REG(R10);\n  COPY_REG(R11);\n  COPY_REG(R12);\n  COPY_REG(R13);\n  COPY_REG(R14);\n  COPY_REG(R15);\n  COPY_REG(RDI);\n  COPY_REG(RSI);\n  COPY_REG(RBP);\n  COPY_REG(RBX);\n  COPY_REG(RDX);\n  COPY_REG(RAX);\n  COPY_REG(RCX);\n  COPY_REG(RSP);\n#undef COPY_REG\n\n  auto* fpstate = &xstate->fpstate;\n\n  // Copy float registers\n  const uint16_t CurrentOffset = Frame->State.flags[FEXCore::X86State::X87FLAG_TOP_LOC];\n  for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_MMS; ++i) {\n    const auto modulo_i = (i + CurrentOffset) % 8;\n    memcpy(&fpstate->_st[i], &Frame->State.mm[modulo_i], sizeof(Frame->State.mm[0]));\n  }\n\n  if (SupportsAVX) {\n    CTX->ReconstructXMMRegisters(Thread, fpstate->_xmm, xstate->ymmh.ymmh_space);\n  } else {\n    CTX->ReconstructXMMRegisters(Thread, fpstate->_xmm, nullptr);\n  }\n\n  // FCW store default\n  fpstate->fcw = Frame->State.FCW;\n  fpstate->ftw = Frame->State.AbridgedFTW;\n\n  // Reconstruct FSW\n  fpstate->fsw = (Frame->State.flags[FEXCore::X86State::X87FLAG_TOP_LOC] << 11) | (Frame->State.flags[FEXCore::X86State::X87FLAG_C0_LOC] << 8) |\n                 (Frame->State.flags[FEXCore::X86State::X87FLAG_C1_LOC] << 9) | (Frame->State.flags[FEXCore::X86State::X87FLAG_C2_LOC] << 10) |\n                 (Frame->State.flags[FEXCore::X86State::X87FLAG_C3_LOC] << 14) | Frame->State.flags[FEXCore::X86State::X87FLAG_IE_LOC];\n\n  // Copy over signal stack information\n  guest_uctx->uc_stack.ss_flags = GuestStack->ss_flags;\n  guest_uctx->uc_stack.ss_sp = GuestStack->ss_sp;\n  guest_uctx->uc_stack.ss_size = GuestStack->ss_size;\n\n  // Apparently RAX is always set to zero in case of badly misbehaving C applications and variadics.\n  Frame->State.gregs[FEXCore::X86State::REG_RAX] = 0;\n  Frame->State.gregs[FEXCore::X86State::REG_RDI] = Signal;\n  Frame->State.gregs[FEXCore::X86State::REG_RSI] = SigInfoLocation;\n  Frame->State.gregs[FEXCore::X86State::REG_RDX] = UContextLocation;\n\n  // Set up the new SP for stack handling\n  // The host is required to provide us a restorer.\n  // If the guest didn't provide a restorer then the application should fail with a SIGSEGV.\n  // TODO: Emulate SIGSEGV when the guest doesn't provide a restorer.\n  NewGuestSP -= 8;\n  if (GuestAction->restorer) {\n    *(uint64_t*)NewGuestSP = (uint64_t)GuestAction->restorer;\n  } else {\n    // XXX: Emulate SIGSEGV here\n    // *(uint64_t*)NewGuestSP = SignalReturn;\n  }\n\n  return NewGuestSP;\n}\n\nuint64_t SignalDelegator::SetupFrame_ia32(FEXCore::Core::InternalThreadState* Thread, ArchHelpers::Context::ContextBackup* ContextBackup,\n                                          FEXCore::Core::CpuStateFrame* Frame, int Signal, siginfo_t* HostSigInfo, void* ucontext,\n                                          GuestSigAction* GuestAction, stack_t* GuestStack, uint64_t NewGuestSP, const uint32_t eflags) {\n\n  const uint64_t SignalReturn = reinterpret_cast<uint64_t>(VDSOPointers.VDSO_kernel_sigreturn);\n\n  NewGuestSP -= sizeof(uint64_t);\n  NewGuestSP = FEXCore::AlignDown(NewGuestSP, alignof(uint64_t));\n\n  uint64_t HostStackLocation = NewGuestSP;\n\n  if (SupportsAVX) {\n    NewGuestSP -= sizeof(FEXCore::x86::xstate);\n    NewGuestSP = FEXCore::AlignDown(NewGuestSP, alignof(FEXCore::x86::xstate));\n  } else {\n    NewGuestSP -= sizeof(FEXCore::x86::_libc_fpstate);\n    NewGuestSP = FEXCore::AlignDown(NewGuestSP, alignof(FEXCore::x86::_libc_fpstate));\n  }\n\n  uint64_t FPStateLocation = NewGuestSP;\n\n  NewGuestSP -= sizeof(SigFrame_i32);\n  NewGuestSP = FEXCore::AlignDown(NewGuestSP, alignof(SigFrame_i32));\n  uint64_t SigFrameLocation = NewGuestSP;\n\n  ContextBackup->FPStateLocation = FPStateLocation;\n  ContextBackup->UContextLocation = SigFrameLocation;\n  ContextBackup->SigInfoLocation = 0;\n\n  SigFrame_i32* guest_uctx = reinterpret_cast<SigFrame_i32*>(SigFrameLocation);\n  // Store where the host context lives in the guest stack.\n  *(uint64_t*)HostStackLocation = (uint64_t)ContextBackup;\n\n  // Pointer to where the fpreg memory is\n  guest_uctx->sc.fpstate = static_cast<uint32_t>(FPStateLocation);\n  auto* xstate = reinterpret_cast<FEXCore::x86::xstate*>(FPStateLocation);\n  SetXStateInfo(xstate, SupportsAVX);\n\n  guest_uctx->sc.cs = Frame->State.cs_idx;\n  guest_uctx->sc.ds = Frame->State.ds_idx;\n  guest_uctx->sc.es = Frame->State.es_idx;\n  guest_uctx->sc.fs = Frame->State.fs_idx;\n  guest_uctx->sc.gs = Frame->State.gs_idx;\n  guest_uctx->sc.ss = Frame->State.ss_idx;\n\n  if (ContextBackup->FaultToTopAndGeneratedException) {\n    guest_uctx->sc.trapno = Frame->SynchronousFaultData.TrapNo;\n    guest_uctx->sc.err = Frame->SynchronousFaultData.err_code;\n    Signal = Frame->SynchronousFaultData.Signal;\n  } else {\n    guest_uctx->sc.trapno = ConvertSignalToTrapNo(Signal, HostSigInfo);\n    guest_uctx->sc.err = ConvertSignalToError(ucontext, Signal, HostSigInfo);\n  }\n\n  guest_uctx->sc.ip = ContextBackup->OriginalRIP;\n  guest_uctx->sc.flags = eflags;\n  guest_uctx->sc.sp_at_signal = 0;\n\n#define COPY_REG(x, y) guest_uctx->sc.x = Frame->State.gregs[FEXCore::X86State::REG_##y];\n  COPY_REG(di, RDI);\n  COPY_REG(si, RSI);\n  COPY_REG(bp, RBP);\n  COPY_REG(bx, RBX);\n  COPY_REG(dx, RDX);\n  COPY_REG(ax, RAX);\n  COPY_REG(cx, RCX);\n  COPY_REG(sp, RSP);\n#undef COPY_REG\n\n  auto* fpstate = &xstate->fpstate;\n\n  // Copy float registers\n  const uint16_t CurrentOffset = Frame->State.flags[FEXCore::X86State::X87FLAG_TOP_LOC];\n  for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_MMS; ++i) {\n    const auto modulo_i = (i + CurrentOffset) % 8;\n    // 32-bit st register size is only 10 bytes. Not padded to 16byte like x86-64\n    memcpy(&fpstate->_st[i], &Frame->State.mm[modulo_i], 10);\n  }\n\n  // Extended XMM state\n  fpstate->status = FEXCore::x86::fpstate_magic::MAGIC_XFPSTATE;\n\n  if (SupportsAVX) {\n    CTX->ReconstructXMMRegisters(Thread, fpstate->_xmm, xstate->ymmh.ymmh_space);\n  } else {\n    CTX->ReconstructXMMRegisters(Thread, fpstate->_xmm, nullptr);\n  }\n\n  // FCW store default\n  fpstate->fcw = Frame->State.FCW;\n  // Reconstruct FSW\n  fpstate->fsw = (Frame->State.flags[FEXCore::X86State::X87FLAG_TOP_LOC] << 11) | (Frame->State.flags[FEXCore::X86State::X87FLAG_C0_LOC] << 8) |\n                 (Frame->State.flags[FEXCore::X86State::X87FLAG_C1_LOC] << 9) | (Frame->State.flags[FEXCore::X86State::X87FLAG_C2_LOC] << 10) |\n                 (Frame->State.flags[FEXCore::X86State::X87FLAG_C3_LOC] << 14) | Frame->State.flags[FEXCore::X86State::X87FLAG_IE_LOC];\n  fpstate->ftw = FEXCore::FPState::ConvertFromAbridgedFTW(fpstate->fsw, Frame->State.mm, Frame->State.AbridgedFTW);\n\n  // Curiously non-rt signals don't support altstack. So that state doesn't exist here.\n\n  // Copy over the signal information.\n  guest_uctx->Signal = Signal;\n\n  // Retcode needs to be bit-exact for debuggers\n  constexpr static uint8_t retcode[] = {\n    0x58,                   // pop eax\n    0xb8,                   // mov\n    0x77, 0x00, 0x00, 0x00, // 32-bit sigreturn\n    0xcd, 0x80,             // int 0x80\n  };\n\n  memcpy(guest_uctx->retcode, &retcode, sizeof(retcode));\n\n  // 32-bit Guest can provide its own restorer or we need to provide our own.\n  // On a real host this restorer will live in VDSO.\n  const bool HasRestorer = (GuestAction->sa_flags & X86_SA_RESTORER) == X86_SA_RESTORER;\n  if (HasRestorer) {\n    guest_uctx->pretcode = (uint32_t)(uint64_t)GuestAction->restorer;\n  } else {\n    guest_uctx->pretcode = SignalReturn;\n    LOGMAN_THROW_A_FMT(SignalReturn < 0x1'0000'0000ULL, \"This needs to be below 4GB\");\n  }\n\n  // Support regparm=3\n  Frame->State.gregs[FEXCore::X86State::REG_RAX] = Signal;\n  Frame->State.gregs[FEXCore::X86State::REG_RDX] = 0;\n  Frame->State.gregs[FEXCore::X86State::REG_RCX] = 0;\n\n  return NewGuestSP;\n}\n\nuint64_t SignalDelegator::SetupRTFrame_ia32(FEXCore::Core::InternalThreadState* Thread, ArchHelpers::Context::ContextBackup* ContextBackup,\n                                            FEXCore::Core::CpuStateFrame* Frame, int Signal, siginfo_t* HostSigInfo, void* ucontext,\n                                            GuestSigAction* GuestAction, stack_t* GuestStack, uint64_t NewGuestSP, const uint32_t eflags) {\n\n  const uint64_t SignalReturn = reinterpret_cast<uint64_t>(VDSOPointers.VDSO_kernel_rt_sigreturn);\n\n  NewGuestSP -= sizeof(uint64_t);\n  NewGuestSP = FEXCore::AlignDown(NewGuestSP, alignof(uint64_t));\n\n  uint64_t HostStackLocation = NewGuestSP;\n\n  if (SupportsAVX) {\n    NewGuestSP -= sizeof(FEXCore::x86::xstate);\n    NewGuestSP = FEXCore::AlignDown(NewGuestSP, alignof(FEXCore::x86::xstate));\n  } else {\n    NewGuestSP -= sizeof(FEXCore::x86::_libc_fpstate);\n    NewGuestSP = FEXCore::AlignDown(NewGuestSP, alignof(FEXCore::x86::_libc_fpstate));\n  }\n\n  uint64_t FPStateLocation = NewGuestSP;\n\n  NewGuestSP -= sizeof(RTSigFrame_i32);\n  NewGuestSP = FEXCore::AlignDown(NewGuestSP, alignof(RTSigFrame_i32));\n\n  uint64_t SigFrameLocation = NewGuestSP;\n  RTSigFrame_i32* guest_uctx = reinterpret_cast<RTSigFrame_i32*>(SigFrameLocation);\n  // Store where the host context lives in the guest stack.\n  *(uint64_t*)HostStackLocation = (uint64_t)ContextBackup;\n\n  ContextBackup->FPStateLocation = FPStateLocation;\n  ContextBackup->UContextLocation = SigFrameLocation;\n  ContextBackup->SigInfoLocation = 0; // Part of frame.\n\n  // We have extended float information\n  guest_uctx->uc.uc_flags = FEXCore::x86::UC_FP_XSTATE;\n  guest_uctx->uc.uc_link = 0;\n\n  // Pointer to where the fpreg memory is\n  guest_uctx->uc.uc_mcontext.fpregs = static_cast<uint32_t>(FPStateLocation);\n  auto* xstate = reinterpret_cast<FEXCore::x86::xstate*>(FPStateLocation);\n  SetXStateInfo(xstate, SupportsAVX);\n\n  guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_CS] = Frame->State.cs_idx;\n  guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_DS] = Frame->State.ds_idx;\n  guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_ES] = Frame->State.es_idx;\n  guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_FS] = Frame->State.fs_idx;\n  guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_GS] = Frame->State.gs_idx;\n  guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_SS] = Frame->State.ss_idx;\n\n  if (ContextBackup->FaultToTopAndGeneratedException) {\n    guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_TRAPNO] = Frame->SynchronousFaultData.TrapNo;\n    guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_ERR] = Frame->SynchronousFaultData.err_code;\n    Signal = Frame->SynchronousFaultData.Signal;\n  } else {\n    guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_TRAPNO] = ConvertSignalToTrapNo(Signal, HostSigInfo);\n    guest_uctx->info.si_code = HostSigInfo->si_code;\n    guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_ERR] = ConvertSignalToError(ucontext, Signal, HostSigInfo);\n  }\n\n  guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_EIP] = ContextBackup->OriginalRIP;\n  guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_EFL] = eflags;\n  guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_UESP] = Frame->State.gregs[FEXCore::X86State::REG_RSP];\n  guest_uctx->uc.uc_mcontext.cr2 = 0;\n\n#define COPY_REG(x) guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_##x] = Frame->State.gregs[FEXCore::X86State::REG_##x];\n  COPY_REG(RDI);\n  COPY_REG(RSI);\n  COPY_REG(RBP);\n  COPY_REG(RBX);\n  COPY_REG(RDX);\n  COPY_REG(RAX);\n  COPY_REG(RCX);\n  COPY_REG(RSP);\n#undef COPY_REG\n\n  auto* fpstate = &xstate->fpstate;\n\n  // Copy float registers\n  const uint16_t CurrentOffset = Frame->State.flags[FEXCore::X86State::X87FLAG_TOP_LOC];\n  for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_MMS; ++i) {\n    const auto modulo_i = (i + CurrentOffset) % 8;\n    // 32-bit st register size is only 10 bytes. Not padded to 16byte like x86-64\n    memcpy(&fpstate->_st[i], &Frame->State.mm[modulo_i], 10);\n  }\n\n  // Extended XMM state\n  fpstate->status = FEXCore::x86::fpstate_magic::MAGIC_XFPSTATE;\n\n  if (SupportsAVX) {\n    CTX->ReconstructXMMRegisters(Thread, fpstate->_xmm, xstate->ymmh.ymmh_space);\n  } else {\n    CTX->ReconstructXMMRegisters(Thread, fpstate->_xmm, nullptr);\n  }\n\n  // FCW store default\n  fpstate->fcw = Frame->State.FCW;\n  // Reconstruct FSW\n  fpstate->fsw = (Frame->State.flags[FEXCore::X86State::X87FLAG_TOP_LOC] << 11) | (Frame->State.flags[FEXCore::X86State::X87FLAG_C0_LOC] << 8) |\n                 (Frame->State.flags[FEXCore::X86State::X87FLAG_C1_LOC] << 9) | (Frame->State.flags[FEXCore::X86State::X87FLAG_C2_LOC] << 10) |\n                 (Frame->State.flags[FEXCore::X86State::X87FLAG_C3_LOC] << 14) | Frame->State.flags[FEXCore::X86State::X87FLAG_IE_LOC];\n  fpstate->ftw = FEXCore::FPState::ConvertFromAbridgedFTW(fpstate->fsw, Frame->State.mm, Frame->State.AbridgedFTW);\n\n  // Copy over signal stack information\n  guest_uctx->uc.uc_stack.ss_flags = GuestStack->ss_flags;\n  guest_uctx->uc.uc_stack.ss_sp = static_cast<uint32_t>(reinterpret_cast<uint64_t>(GuestStack->ss_sp));\n  guest_uctx->uc.uc_stack.ss_size = GuestStack->ss_size;\n\n  // Setup siginfo\n  // These three elements are in every siginfo\n  guest_uctx->info.si_signo = HostSigInfo->si_signo;\n  guest_uctx->info.si_errno = HostSigInfo->si_errno;\n  if (ContextBackup->FaultToTopAndGeneratedException) {\n    guest_uctx->info.si_code = Frame->SynchronousFaultData.si_code;\n  } else {\n    guest_uctx->info.si_code = HostSigInfo->si_code;\n  }\n\n  const SigInfoLayout Layout =\n    CalculateSigInfoLayout(Signal, guest_uctx->info.si_code, guest_uctx->uc.uc_mcontext.gregs[FEXCore::x86::FEX_REG_ERR]);\n\n  switch (Layout) {\n  case SigInfoLayout::LAYOUT_KILL:\n    guest_uctx->info._sifields._kill.pid = HostSigInfo->si_pid;\n    guest_uctx->info._sifields._kill.uid = HostSigInfo->si_uid;\n    break;\n  case SigInfoLayout::LAYOUT_TIMER:\n    guest_uctx->info._sifields._timer.tid = HostSigInfo->si_timerid;\n    guest_uctx->info._sifields._timer.overrun = HostSigInfo->si_overrun;\n    guest_uctx->info._sifields._timer.sigval.sival_int = HostSigInfo->si_int;\n    break;\n  case SigInfoLayout::LAYOUT_POLL:\n    guest_uctx->info._sifields._poll.band = HostSigInfo->si_band;\n    guest_uctx->info._sifields._poll.fd = HostSigInfo->si_fd;\n    break;\n  case SigInfoLayout::LAYOUT_FAULT:\n    // Macro expansion to get the si_addr\n    // This is the address trying to be accessed, not the RIP\n    guest_uctx->info._sifields._sigfault.addr = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(HostSigInfo->si_addr));\n    break;\n  case SigInfoLayout::LAYOUT_FAULT_RIP:\n    // Macro expansion to get the si_addr\n    // Can't really give a real result here. Pull from the context for now\n    guest_uctx->info._sifields._sigfault.addr = ContextBackup->OriginalRIP;\n    break;\n  case SigInfoLayout::LAYOUT_CHLD:\n    guest_uctx->info._sifields._sigchld.pid = HostSigInfo->si_pid;\n    guest_uctx->info._sifields._sigchld.uid = HostSigInfo->si_uid;\n    guest_uctx->info._sifields._sigchld.status = HostSigInfo->si_status;\n    guest_uctx->info._sifields._sigchld.utime = HostSigInfo->si_utime;\n    guest_uctx->info._sifields._sigchld.stime = HostSigInfo->si_stime;\n    break;\n  case SigInfoLayout::LAYOUT_RT:\n    guest_uctx->info._sifields._rt.pid = HostSigInfo->si_pid;\n    guest_uctx->info._sifields._rt.uid = HostSigInfo->si_uid;\n    guest_uctx->info._sifields._rt.sigval.sival_int = HostSigInfo->si_int;\n    break;\n  case SigInfoLayout::LAYOUT_SYS:\n    guest_uctx->info._sifields._sigsys.call_addr = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(HostSigInfo->si_call_addr));\n    guest_uctx->info._sifields._sigsys.syscall = HostSigInfo->si_syscall;\n    // We need to lie about the architecture here.\n    // Otherwise we would expose incorrect information to the guest.\n    constexpr uint32_t AUDIT_LE = 0x4000'0000U;\n    constexpr uint32_t MACHINE_I386 = 3; // This matches the ELF definition.\n    guest_uctx->info._sifields._sigsys.arch = AUDIT_LE | MACHINE_I386;\n    break;\n  }\n\n  // Setup the guest stack context.\n  guest_uctx->Signal = Signal;\n  guest_uctx->pinfo = (uint32_t)(uint64_t)&guest_uctx->info;\n  guest_uctx->puc = (uint32_t)(uint64_t)&guest_uctx->uc;\n\n  // Retcode needs to be bit-exact for debuggers\n  constexpr static uint8_t rt_retcode[] = {\n    0xb8,                   // mov\n    0xad, 0x00, 0x00, 0x00, // 32-bit rt_sigreturn\n    0xcd, 0x80,             // int 0x80\n    0x0,                    // Pad\n  };\n\n  memcpy(guest_uctx->retcode, &rt_retcode, sizeof(rt_retcode));\n\n  // 32-bit Guest can provide its own restorer or we need to provide our own.\n  // On a real host this restorer will live in VDSO.\n  const bool HasRestorer = (GuestAction->sa_flags & X86_SA_RESTORER) == X86_SA_RESTORER;\n  if (HasRestorer) {\n    guest_uctx->pretcode = (uint32_t)(uint64_t)GuestAction->restorer;\n  } else {\n    guest_uctx->pretcode = SignalReturn;\n    LOGMAN_THROW_A_FMT(SignalReturn < 0x1'0000'0000ULL, \"This needs to be below 4GB\");\n  }\n\n  // Support regparm=3\n  Frame->State.gregs[FEXCore::X86State::REG_RAX] = Signal;\n  Frame->State.gregs[FEXCore::X86State::REG_RDX] = guest_uctx->pinfo;\n  Frame->State.gregs[FEXCore::X86State::REG_RCX] = guest_uctx->puc;\n\n  return NewGuestSP;\n}\n\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/SignalDelegator.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|common\ndesc: Handles host -> host and host -> guest signal routing, emulates procmask & co\n$end_info$\n*/\n\n#include \"LinuxSyscalls/SignalDelegator.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/SignalDelegator.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/FPState.h>\n#include <FEXCore/Utils/Profiler.h>\n#include <FEXCore/Utils/ArchHelpers/Arm64.h>\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <atomic>\n#include <cerrno>\n#include <csignal>\n#include <cstddef>\n#include <cstring>\n#include <functional>\n#include <linux/futex.h>\n#include <syscall.h>\n#include <sys/mman.h>\n#include <sys/signalfd.h>\n#include <unistd.h>\n#include <utility>\n\n// For older build environments\n#ifndef SS_AUTODISARM\n#define SS_AUTODISARM (1U << 31)\n#endif\n\nnamespace FEX::HLE {\n#ifdef ARCHITECTURE_x86_64\n__attribute__((naked)) static void sigrestore() {\n  __asm volatile(\"syscall;\" ::\"a\"(0xF) : \"memory\");\n}\n#endif\n\nconstexpr static uint32_t X86_MINSIGSTKSZ = 2048;\n\nstatic FEX::HLE::ThreadStateObject* GetThreadFromAltStack(const stack_t& alt_stack) {\n  // The thread object lives just before the alt-stack begin.\n  FEX::HLE::ThreadStateObject* ThreadObject {};\n  memcpy(&ThreadObject, reinterpret_cast<void*>(reinterpret_cast<uint64_t>(alt_stack.ss_sp) - 8), sizeof(void*));\n  return ThreadObject;\n}\n\nstatic void SignalHandlerThunk(int Signal, siginfo_t* Info, void* UContext) {\n  ucontext_t* _context = (ucontext_t*)UContext;\n  auto ThreadObject = GetThreadFromAltStack(_context->uc_stack);\n  FEXCORE_PROFILE_ACCUMULATION(ThreadObject->Thread, AccumulatedSignalTime);\n  ThreadObject->SignalInfo.Delegator->HandleSignal(ThreadObject, Signal, Info, UContext);\n}\n\nuint64_t SigIsMember(GuestSAMask* Set, int Signal) {\n  // Signal 0 isn't real, so everything is offset by one inside the set\n  Signal -= 1;\n  return (Set->Val >> Signal) & 1;\n}\n\nuint64_t SetSignal(GuestSAMask* Set, int Signal) {\n  // Signal 0 isn't real, so everything is offset by one inside the set\n  Signal -= 1;\n  return Set->Val | (1ULL << Signal);\n}\n\n/**\n * @name Signal frame setup\n * @{ */\n\nvoid SignalDelegator::HandleSignal(FEX::HLE::ThreadStateObject* Thread, int Signal, void* Info, void* UContext) {\n  // Let the host take first stab at handling the signal\n  if (!Thread) {\n    LogMan::Msg::AFmt(\"Thread {} has received a signal and hasn't registered itself with the delegate! Programming error!\",\n                      FHU::Syscalls::gettid());\n  } else {\n    SignalHandler& Handler = HostHandlers[Signal];\n    for (auto& HandlerFunc : Handler.Handlers) {\n      if (HandlerFunc(Thread->Thread, Signal, Info, UContext)) {\n        // If the host handler handled the fault then we can continue now\n        return;\n      }\n    }\n\n    if (Handler.FrontendHandler && Handler.FrontendHandler(Thread->Thread, Signal, Info, UContext)) {\n      return;\n    }\n\n    // Now let the frontend handle the signal\n    // It's clearly a guest signal and this ends up being an OS specific issue\n    HandleGuestSignal(Thread, Signal, Info, UContext);\n  }\n}\n\nvoid SignalDelegator::RegisterHostSignalHandler(int Signal, HostSignalDelegatorFunction Func, bool Required) {\n  SetHostSignalHandler(Signal, std::move(Func), Required);\n  FrontendRegisterHostSignalHandler(Signal, Required);\n}\n\nvoid SignalDelegator::SpillSRA(FEXCore::Core::InternalThreadState* Thread, void* ucontext, uint32_t IgnoreMask) {\n#ifdef ARCHITECTURE_arm64\n  Thread->CurrentFrame->State.rip = CTX->RestoreRIPFromHostPC(Thread, ArchHelpers::Context::GetPc(ucontext));\n\n  for (size_t i = 0; i < Config.SRAGPRCount; i++) {\n    const uint8_t SRAIdxMap = Config.SRAGPRMapping[i];\n    if (IgnoreMask & (1U << SRAIdxMap)) {\n      // Skip this one, it's already spilled\n      continue;\n    }\n    Thread->CurrentFrame->State.gregs[i] = ArchHelpers::Context::GetArmReg(ucontext, SRAIdxMap);\n  }\n\n  if (SupportsAVX) {\n    // TODO: This doesn't save the upper 128-bits of the 256-bit registers.\n    // This needs to be implemented still.\n    for (size_t i = 0; i < Config.SRAFPRCount; i++) {\n      auto FPR = ArchHelpers::Context::GetArmFPR(ucontext, Config.SRAFPRMapping[i]);\n      memcpy(&Thread->CurrentFrame->State.xmm.avx.data[i][0], &FPR, sizeof(__uint128_t));\n    }\n  } else {\n    for (size_t i = 0; i < Config.SRAFPRCount; i++) {\n      auto FPR = ArchHelpers::Context::GetArmFPR(ucontext, Config.SRAFPRMapping[i]);\n      memcpy(&Thread->CurrentFrame->State.xmm.sse.data[i][0], &FPR, sizeof(__uint128_t));\n    }\n  }\n\n  uint32_t EFlags =\n    CTX->ReconstructCompactedEFLAGS(Thread, true, ArchHelpers::Context::GetArmGPRs(ucontext), ArchHelpers::Context::GetArmPState(ucontext));\n  CTX->SetFlagsFromCompactedEFLAGS(Thread, EFlags);\n#endif\n}\n\nArchHelpers::Context::ContextBackup* SignalDelegator::StoreThreadState(FEXCore::Core::InternalThreadState* Thread, int Signal, void* ucontext) {\n  // We can end up getting a signal at any point in our host state\n  // Jump to a handler that saves all state so we can safely return\n  uint64_t OldSP = ArchHelpers::Context::GetSp(ucontext);\n  uintptr_t NewSP = OldSP;\n\n  size_t StackOffset = sizeof(ArchHelpers::Context::ContextBackup);\n\n  // We need to back up behind the host's red zone\n  // We do this on the guest side as well\n  // (does nothing on arm hosts)\n  NewSP -= ArchHelpers::Context::ContextBackup::RedZoneSize;\n\n  NewSP -= StackOffset;\n  NewSP = FEXCore::AlignDown(NewSP, 16);\n\n  auto Context = reinterpret_cast<ArchHelpers::Context::ContextBackup*>(NewSP);\n  ArchHelpers::Context::BackupContext(ucontext, Context);\n\n  // Retain the action pointer so we can see it when we return\n  Context->Signal = Signal;\n\n  // Save guest state\n  // We can't guarantee if registers are in context or host GPRs\n  // So we need to save everything\n  memcpy(&Context->GuestState, &Thread->CurrentFrame->State, sizeof(FEXCore::Core::CPUState));\n\n  // Set the new SP\n  ArchHelpers::Context::SetSp(ucontext, NewSP);\n\n  Context->Flags = 0;\n  Context->FPStateLocation = 0;\n  Context->UContextLocation = 0;\n  Context->SigInfoLocation = 0;\n  Context->InSyscallInfo = 0;\n\n  // Store fault to top status and then reset it\n  Context->FaultToTopAndGeneratedException = Thread->CurrentFrame->SynchronousFaultData.FaultToTopAndGeneratedException;\n  Thread->CurrentFrame->SynchronousFaultData.FaultToTopAndGeneratedException = false;\n\n  return Context;\n}\n\nvoid SignalDelegator::RestoreThreadState(FEXCore::Core::InternalThreadState* Thread, void* ucontext, RestoreType Type) {\n  uint64_t OldSP {};\n  if (Type == RestoreType::TYPE_PAUSE) [[unlikely]] {\n    OldSP = ArchHelpers::Context::GetSp(ucontext);\n  } else {\n    // Some fun introspection here.\n    // We store a pointer to our host-stack on the guest stack.\n    // We need to inspect the guest state coming in, so we can get our host stack back.\n    uint64_t GuestSP = Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RSP];\n\n    if (Is64BitMode) {\n      // Signal frame layout on stack needs to be as follows\n      // void* ReturnPointer\n      // ucontext_t\n      // siginfo_t\n      // FP state\n      // Host stack location\n\n      GuestSP += sizeof(FEXCore::x86_64::ucontext_t);\n      GuestSP = FEXCore::AlignUp(GuestSP, alignof(FEXCore::x86_64::ucontext_t));\n\n      GuestSP += sizeof(siginfo_t);\n      GuestSP = FEXCore::AlignUp(GuestSP, alignof(siginfo_t));\n\n      if (SupportsAVX) {\n        GuestSP += sizeof(FEXCore::x86_64::xstate);\n        GuestSP = FEXCore::AlignUp(GuestSP, alignof(FEXCore::x86_64::xstate));\n      } else {\n        GuestSP += sizeof(FEXCore::x86_64::_libc_fpstate);\n        GuestSP = FEXCore::AlignUp(GuestSP, alignof(FEXCore::x86_64::_libc_fpstate));\n      }\n    } else {\n      if (Type == RestoreType::TYPE_NONREALTIME) {\n        // Signal frame layout on stack needs to be as follows\n        // SigFrame_i32\n        // FPState\n        // Host stack location\n\n        // Remove the 4-byte pretcode /AND/ a legacy argument that is ignored.\n        GuestSP += sizeof(SigFrame_i32) - 8;\n        GuestSP = FEXCore::AlignUp(GuestSP, alignof(SigFrame_i32));\n\n        if (SupportsAVX) {\n          GuestSP += sizeof(FEXCore::x86::xstate);\n          GuestSP = FEXCore::AlignUp(GuestSP, alignof(FEXCore::x86::xstate));\n        } else {\n          GuestSP += sizeof(FEXCore::x86::_libc_fpstate);\n          GuestSP = FEXCore::AlignUp(GuestSP, alignof(FEXCore::x86::_libc_fpstate));\n        }\n      } else {\n        // Signal frame layout on stack needs to be as follows\n        // RTSigFrame_i32\n        // FPState\n        // Host stack location\n\n        // Remove the 4-byte pretcode.\n        GuestSP += sizeof(RTSigFrame_i32) - 4;\n        GuestSP = FEXCore::AlignUp(GuestSP, alignof(RTSigFrame_i32));\n\n        if (SupportsAVX) {\n          GuestSP += sizeof(FEXCore::x86::xstate);\n          GuestSP = FEXCore::AlignUp(GuestSP, alignof(FEXCore::x86::xstate));\n        } else {\n          GuestSP += sizeof(FEXCore::x86::_libc_fpstate);\n          GuestSP = FEXCore::AlignUp(GuestSP, alignof(FEXCore::x86::_libc_fpstate));\n        }\n      }\n    }\n\n    OldSP = *reinterpret_cast<uint64_t*>(GuestSP);\n  }\n\n  uintptr_t NewSP = OldSP;\n  auto Context = reinterpret_cast<ArchHelpers::Context::ContextBackup*>(NewSP);\n\n  // Restore host state\n  ArchHelpers::Context::RestoreContext(ucontext, Context);\n\n  // Reset the guest state\n  memcpy(&Thread->CurrentFrame->State, &Context->GuestState, sizeof(FEXCore::Core::CPUState));\n\n  if (Context->UContextLocation) {\n    auto Frame = Thread->CurrentFrame;\n\n    if (Context->Flags & ArchHelpers::Context::ContextFlags::CONTEXT_FLAG_INJIT) {\n      // XXX: Unsupported since it needs state reconstruction\n      // If we are in the JIT then SRA might need to be restored to values from the context\n      // We can't currently support this since it might result in tearing without real state reconstruction\n    }\n\n    if (Is64BitMode) {\n      RestoreFrame_x64(Thread, Context, Frame, ucontext);\n    } else {\n      if (Type == RestoreType::TYPE_NONREALTIME) {\n        RestoreFrame_ia32(Thread, Context, Frame, ucontext);\n      } else {\n        RestoreRTFrame_ia32(Thread, Context, Frame, ucontext);\n      }\n    }\n  }\n}\n\nbool SignalDelegator::HandleDispatcherGuestSignal(FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext,\n                                                  GuestSigAction* GuestAction, stack_t* GuestStack) {\n  auto ContextBackup = StoreThreadState(Thread, Signal, ucontext);\n\n  auto Frame = Thread->CurrentFrame;\n\n  // Ref count our faults\n  // We use this to track if it is safe to clear cache\n  ++Thread->CurrentFrame->SignalHandlerRefCounter;\n\n  uint64_t OldPC = ArchHelpers::Context::GetPc(ucontext);\n  const bool WasInJIT = CTX->IsAddressInCodeBuffer(Thread, OldPC);\n\n  // Spill the SRA regardless of signal handler type\n  // We are going to be returning to the top of the dispatcher which will fill again\n  // Otherwise we might load garbage\n  if (WasInJIT) {\n    uint32_t IgnoreMask {};\n#ifdef ARCHITECTURE_arm64\n    if (Frame->InSyscallInfo != 0) {\n      // We are in a syscall, this means we are in a weird register state\n      // We need to spill SRA but only some of it, since some values have already been spilled\n      // Lower 16 bits tells us which registers are already spilled to the context\n      // So we ignore spilling those ones\n      IgnoreMask = Frame->InSyscallInfo & 0xFFFF;\n    } else {\n      // We must spill everything\n      IgnoreMask = 0;\n    }\n#endif\n\n    // We are in jit, SRA must be spilled\n    SpillSRA(Thread, ucontext, IgnoreMask);\n\n    ContextBackup->Flags |= ArchHelpers::Context::ContextFlags::CONTEXT_FLAG_INJIT;\n\n    // We are leaving the syscall information behind. Make sure to store the previous state.\n    ContextBackup->InSyscallInfo = Thread->CurrentFrame->InSyscallInfo;\n    Thread->CurrentFrame->InSyscallInfo = 0;\n  } else {\n    if (!IsAddressInDispatcher(OldPC)) {\n      // This is likely to cause issues but in some cases it isn't fatal\n      // This can also happen if we have put a signal on hold, then we just reenabled the signal\n      // So we are in the syscall handler\n      // Only throw a log message in this case\n      if constexpr (false) {\n        // XXX: Messages in the signal handler can cause us to crash\n        LogMan::Msg::EFmt(\"Signals in dispatcher have unsynchronized context\");\n      }\n    }\n  }\n\n  uint64_t OldGuestSP = Frame->State.gregs[FEXCore::X86State::REG_RSP];\n  uint64_t NewGuestSP = OldGuestSP;\n\n  // altstack is only used if the signal handler was setup with SA_ONSTACK\n  if (GuestAction->sa_flags & SA_ONSTACK) {\n    // Additionally the altstack is only used if the enabled (SS_DISABLE flag is not set)\n    if (!(GuestStack->ss_flags & SS_DISABLE)) {\n      // If our guest is already inside of the alternative stack\n      // Then that means we are hitting recursive signals and we need to walk back the stack correctly\n      uint64_t AltStackBase = reinterpret_cast<uint64_t>(GuestStack->ss_sp);\n      uint64_t AltStackEnd = AltStackBase + GuestStack->ss_size;\n      if (OldGuestSP >= AltStackBase && OldGuestSP <= AltStackEnd) {\n        // We are already in the alt stack, the rest of the code will handle adjusting this\n      } else {\n        NewGuestSP = AltStackEnd;\n      }\n    }\n  }\n\n  // siginfo_t\n  siginfo_t* HostSigInfo = reinterpret_cast<siginfo_t*>(info);\n\n  ContextBackup->OriginalRIP = Thread->CurrentFrame->State.rip;\n  uint32_t eflags = CTX->ReconstructCompactedEFLAGS(Thread, false, nullptr, 0);\n\n  if (Is64BitMode) {\n    NewGuestSP = SetupFrame_x64(Thread, ContextBackup, Frame, Signal, HostSigInfo, ucontext, GuestAction, GuestStack, NewGuestSP, eflags);\n  } else {\n    const bool SigInfoFrame = (GuestAction->sa_flags & SA_SIGINFO) == SA_SIGINFO;\n    if (SigInfoFrame) {\n      NewGuestSP = SetupRTFrame_ia32(Thread, ContextBackup, Frame, Signal, HostSigInfo, ucontext, GuestAction, GuestStack, NewGuestSP, eflags);\n    } else {\n      NewGuestSP = SetupFrame_ia32(Thread, ContextBackup, Frame, Signal, HostSigInfo, ucontext, GuestAction, GuestStack, NewGuestSP, eflags);\n    }\n  }\n\n  Frame->State.rip = reinterpret_cast<uint64_t>(GuestAction->sigaction_handler.sigaction);\n  Frame->State.gregs[FEXCore::X86State::REG_RSP] = NewGuestSP;\n\n  // Linux clears DF, RF, and TF flags on signal.\n  Frame->State.flags[FEXCore::X86State::RFLAG_DF_RAW_LOC] = 1;\n  Frame->State.flags[FEXCore::X86State::RFLAG_RF_LOC] = 0;\n  Frame->State.flags[FEXCore::X86State::RFLAG_TF_RAW_LOC] = 0;\n\n  // Linux resets the CS and SS registers on signal handler.\n  // This way signal handlers always go back to their original operating mode.\n  // Doesn't matter for 32-bit processes as they can only be 32-bit, but does\n  // matter for 64-bit processes as they could have potentially installed a 32-bit code segment.\n  Frame->State.cs_idx = FEXCore::Core::CPUState::DEFAULT_USER_CS << 3;\n  Frame->State.ss_idx = 0;\n  Frame->State.cs_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.cs_idx));\n  Frame->State.ss_cached = Frame->State.CalculateGDTBase(*Frame->State.GetSegmentFromIndex(Frame->State, Frame->State.ss_idx));\n\n  // The guest starts its signal frame with a zero initialized FPU\n  // Set that up now. Little bit costly but it's a requirement\n  // This state will be restored on rt_sigreturn\n  memset(Frame->State.xmm.avx.data, 0, sizeof(Frame->State.xmm));\n  memset(Frame->State.mm, 0, sizeof(Frame->State.mm));\n  Frame->State.FCW = 0x37F;\n  Frame->State.AbridgedFTW = 0;\n\n  // Set the new PC\n  ArchHelpers::Context::SetPc(ucontext, Config.AbsoluteLoopTopAddressFillSRA);\n  ArchHelpers::Context::SetFillSRASingleInst(ucontext, false);\n  // Set our state register to point to our guest thread data\n  ArchHelpers::Context::SetState(ucontext, reinterpret_cast<uint64_t>(Frame));\n\n  return true;\n}\n\nbool SignalDelegator::HandleSIGILL(FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext) {\n  if (ArchHelpers::Context::GetPc(ucontext) == Config.SignalHandlerReturnAddress ||\n      ArchHelpers::Context::GetPc(ucontext) == Config.SignalHandlerReturnAddressRT) {\n    auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromFEXCoreThread(Thread);\n    RestoreThreadState(Thread, ucontext,\n                       ArchHelpers::Context::GetPc(ucontext) == Config.SignalHandlerReturnAddressRT ? RestoreType::TYPE_REALTIME :\n                                                                                                      RestoreType::TYPE_NONREALTIME);\n\n    // Ref count our faults\n    // We use this to track if it is safe to clear cache\n    --Thread->CurrentFrame->SignalHandlerRefCounter;\n\n    if (ThreadObject->SignalInfo.DeferredSignalFrames.size() != 0) {\n      // If we have more deferred frames to process then mprotect back to PROT_NONE.\n      // It will have been RW coming in to this sigreturn and now we need to remove permissions\n      // to ensure FEX trampolines back to the SIGSEGV deferred handler.\n      mprotect(reinterpret_cast<void*>(&Thread->InterruptFaultPage), sizeof(Thread->InterruptFaultPage), PROT_NONE);\n    }\n    return true;\n  }\n\n  if (ArchHelpers::Context::GetPc(ucontext) == Config.PauseReturnInstruction) {\n    RestoreThreadState(Thread, ucontext, RestoreType::TYPE_PAUSE);\n\n    // Ref count our faults\n    // We use this to track if it is safe to clear cache\n    --Thread->CurrentFrame->SignalHandlerRefCounter;\n    return true;\n  }\n\n  return false;\n}\n\nbool SignalDelegator::HandleSignalPause(FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext) {\n  auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromFEXCoreThread(Thread);\n  SignalEvent SignalReason = ThreadObject->SignalReason.load();\n  auto Frame = Thread->CurrentFrame;\n\n  if (SignalReason == SignalEvent::Pause) {\n    // Store our thread state so we can come back to this\n    StoreThreadState(Thread, Signal, ucontext);\n\n    if (CTX->IsAddressInCodeBuffer(Thread, ArchHelpers::Context::GetPc(ucontext))) {\n      // We are in jit, SRA must be spilled\n      ArchHelpers::Context::SetPc(ucontext, Config.ThreadPauseHandlerAddressSpillSRA);\n    } else {\n      // We are in non-jit, SRA is already spilled\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n      LOGMAN_THROW_A_FMT(!IsAddressInDispatcher(ArchHelpers::Context::GetPc(ucontext)), \"Signals in dispatcher have unsynchronized \"\n                                                                                        \"context\");\n#endif\n      ArchHelpers::Context::SetPc(ucontext, Config.ThreadPauseHandlerAddress);\n    }\n\n    // Set our state register to point to our guest thread data\n    ArchHelpers::Context::SetState(ucontext, reinterpret_cast<uint64_t>(Frame));\n\n    // Ref count our faults\n    // We use this to track if it is safe to clear cache\n    ++Thread->CurrentFrame->SignalHandlerRefCounter;\n\n    ThreadObject->SignalReason.store(SignalEvent::Nothing);\n    return true;\n  }\n\n  if (SignalReason == SignalEvent::Stop) {\n    // Our thread is stopping\n    // We don't care about anything at this point\n    // Set the stack to our starting location when we entered the core and get out safely\n    ArchHelpers::Context::SetSp(ucontext, Frame->ReturningStackLocation);\n\n    // Our ref counting doesn't matter anymore\n    Thread->CurrentFrame->SignalHandlerRefCounter = 0;\n\n    // Set the new PC\n    if (CTX->IsAddressInCodeBuffer(Thread, ArchHelpers::Context::GetPc(ucontext))) {\n      // We are in jit, SRA must be spilled\n      ArchHelpers::Context::SetPc(ucontext, Config.ThreadStopHandlerAddressSpillSRA);\n    } else {\n      // We are in non-jit, SRA is already spilled\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n      LOGMAN_THROW_A_FMT(!IsAddressInDispatcher(ArchHelpers::Context::GetPc(ucontext)), \"Signals in dispatcher have unsynchronized \"\n                                                                                        \"context\");\n#endif\n      ArchHelpers::Context::SetPc(ucontext, Config.ThreadStopHandlerAddress);\n    }\n\n    // We need to be a little bit careful here\n    // If we were already paused (due to GDB) and we are immediately stopping (due to gdb kill)\n    // Then we need to ensure we don't double decrement our idle thread counter\n    if (ThreadObject->ThreadSleeping) {\n      // If the thread was sleeping then its idle counter was decremented\n      // Reincrement it here to not break logic\n      FEX::HLE::_SyscallHandler->TM.IncrementIdleRefCount();\n    }\n\n    ThreadObject->SignalReason.store(SignalEvent::Nothing);\n    return true;\n  }\n\n  if (SignalReason == SignalEvent::Return || SignalReason == SignalEvent::ReturnRT) {\n    RestoreThreadState(Thread, ucontext, SignalReason == SignalEvent::ReturnRT ? RestoreType::TYPE_REALTIME : RestoreType::TYPE_NONREALTIME);\n\n    // Ref count our faults\n    // We use this to track if it is safe to clear cache\n    --Thread->CurrentFrame->SignalHandlerRefCounter;\n\n    ThreadObject->SignalReason.store(SignalEvent::Nothing);\n    return true;\n  }\n  return false;\n}\n\nvoid SignalDelegator::SignalThread(FEXCore::Core::InternalThreadState* Thread, SignalEvent Event) {\n  auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromFEXCoreThread(Thread);\n  ThreadObject->SignalReason.store(Event);\n  FHU::Syscalls::tgkill(ThreadObject->ThreadInfo.PID, ThreadObject->ThreadInfo.TID, SignalDelegator::SIGNAL_FOR_PAUSE);\n}\n\n/**  @} */\n\nstatic bool IsAsyncSignal(const siginfo_t* Info, int Signal) {\n  if (Info->si_code <= SI_USER) {\n    // If the signal is not from the kernel then it is always async.\n    // This is because synchronous signals can be sent through tgkill,sigqueue and other methods.\n    // SI_USER == 0 and all negative si_code values come from the user.\n    return true;\n  } else {\n    // If the signal is from the kernel then it is async only if it isn't an explicit synchronous signal.\n    switch (Signal) {\n    // These are all synchronous signals.\n    case SIGBUS:\n    case SIGFPE:\n    case SIGILL:\n    case SIGSEGV:\n    case SIGTRAP: return false;\n    default: break;\n    }\n  }\n\n  // Everything else is async and can be deferred.\n  return true;\n}\n\nuint64_t SignalDelegator::GetNewSigMask(int Signal) const {\n  const SignalHandler& Handler = HostHandlers[Signal];\n  // Set up a new mask based on this signals signal mask\n  uint64_t NewMask = Handler.GuestAction.sa_mask.Val;\n\n  // If NODEFER then the new signal mask includes this signal\n  if (!(Handler.GuestAction.sa_flags & SA_NODEFER)) {\n    NewMask |= (1ULL << (Signal - 1));\n  }\n\n  // Walk our required signals and stop masking them if requested\n  for (size_t i = 0; i < MAX_SIGNALS; ++i) {\n    if (HostHandlers[i + 1].Required.load(std::memory_order_relaxed)) {\n      // Never mask our required signals\n      NewMask &= ~(1ULL << i);\n    }\n  }\n\n  return NewMask;\n}\n\nbool SignalDelegator::HandleFrontendSIGSEGV(FEXCore::Core::InternalThreadState* Thread, int Signal, void* Info, void* UContext) {\n  auto SigInfo = *static_cast<siginfo_t*>(Info);\n\n  if (FaultSafeUserMemAccess::TryHandleSafeFault(Signal, SigInfo, UContext)) {\n    ERROR_AND_DIE_FMT(\"Received invalid data to syscall. Crashing now!\");\n  }\n\n#ifdef ARCHITECTURE_arm64\n  if (Signal == SIGSEGV && SigInfo.si_code == SEGV_ACCERR && SigInfo.si_addr >= reinterpret_cast<void*>(Thread->JITGuardPage) &&\n      SigInfo.si_addr < reinterpret_cast<void*>(Thread->JITGuardPage + FEXCore::Utils::FEX_PAGE_SIZE)) {\n    FEXCore::UncheckedLongJump::ManuallyLoadJumpBuf(Thread->RestartJump, Thread->JITGuardOverflowArgument,\n                                                    ArchHelpers::Context::GetArmGPRs(UContext), ArchHelpers::Context::GetArmFPRs(UContext),\n                                                    ArchHelpers::Context::GetArmPc(UContext));\n    return true;\n  }\n#endif\n\n  return false;\n}\n\nvoid SignalDelegator::HandleGuestSignal(FEX::HLE::ThreadStateObject* ThreadObject, int Signal, void* Info, void* UContext) {\n  auto Thread = ThreadObject->Thread;\n  ucontext_t* _context = (ucontext_t*)UContext;\n  auto SigInfo = *static_cast<siginfo_t*>(Info);\n\n  auto MustDeferSignal = (Thread->CurrentFrame->State.DeferredSignalRefCount.Load() != 0);\n  if (Signal == SIGSEGV && SigInfo.si_code == SEGV_ACCERR && SigInfo.si_addr == reinterpret_cast<void*>(&Thread->InterruptFaultPage)) {\n    if (!MustDeferSignal) {\n      // We just reached the end of the outermost signal-deferring section and faulted to check for pending signals.\n      // Pull a signal frame off the stack.\n\n      mprotect(reinterpret_cast<void*>(&Thread->InterruptFaultPage), sizeof(Thread->InterruptFaultPage), PROT_READ | PROT_WRITE);\n\n      if (ThreadObject->SignalInfo.DeferredSignalFrames.empty()) {\n        // No signals to defer. Just set the fault page back to RW and continue execution.\n        // This occurs as a minor race condition between the refcount decrement and the access to the fault page.\n        return;\n      }\n\n      const auto& Top = ThreadObject->SignalInfo.DeferredSignalFrames.back();\n      Signal = Top.Signal;\n      SigInfo = Top.Info;\n      // sig mask has been updated at the defer time, recover the original mask\n      memcpy(&_context->uc_sigmask, &Top.SigMask, sizeof(uint64_t));\n      ThreadObject->SignalInfo.DeferredSignalFrames.pop_back();\n\n      // Until we re-protect the page to PROT_NONE, FEX will now *permanently* defer signals and /not/ check them.\n      //\n      // In order to return /back/ to a sane state, we wait for the rt_sigreturn to happen.\n      // rt_sigreturn will check if there are any more deferred signals to handle\n      // - If there are deferred signals\n      //   - mprotect back to PROT_NONE\n      //   - sigreturn will trampoline out to the previous fault address check, SIGSEGV and restart\n      // - If there are *no* deferred signals\n      //  - No need to mprotect, it is already RW\n    } else {\n#ifdef ARCHITECTURE_arm64\n      // If RefCount != 0 then that means we hit an access with nested signal-deferring sections.\n      // Increment the PC past the `str zr, [x1]` to continue code execution until we reach the outermost section.\n      ArchHelpers::Context::SetPc(UContext, ArchHelpers::Context::GetPc(UContext) + 4);\n      return;\n#else\n      // X86 should always be doing a refcount compare and branch since we can't guarantee instruction size.\n      // ARM64 just always does the access to reduce branching overhead.\n      ERROR_AND_DIE_FMT(\"X86 shouldn't hit this InterruptFaultPage\");\n#endif\n    }\n  } else if (IsAsyncSignal(&SigInfo, Signal) && MustDeferSignal) {\n    // If the signal is asynchronous (as determined by si_code) and FEX is in a state of needing\n    // to defer the signal, then add the signal to the thread's signal queue.\n    LOGMAN_THROW_A_FMT(ThreadObject->SignalInfo.DeferredSignalFrames.size() != ThreadObject->SignalInfo.DeferredSignalFrames.capacity(),\n                       \"Deferred signals vector hit \"\n                       \"capacity size. This will \"\n                       \"likely crash! Asserting now!\");\n\n    ThreadObject->SignalInfo.DeferredSignalFrames.emplace_back(ThreadStateObject::DeferredSignalState {\n      .Info = SigInfo,\n      .Signal = Signal,\n      .SigMask = _context->uc_sigmask.__val[0],\n    });\n\n    uint64_t NewMask = GetNewSigMask(Signal);\n\n    // Update our host signal mask so we don't hit race conditions with signals\n    // This allows us to maintain the expected signal mask through the guest signal handling and then all the way back again\n    memcpy(&_context->uc_sigmask, &NewMask, sizeof(uint64_t));\n\n    // Now update the faulting page permissions so it will fault on write.\n    mprotect(reinterpret_cast<void*>(&Thread->InterruptFaultPage), sizeof(Thread->InterruptFaultPage), PROT_NONE);\n\n    // Postpone the remainder of signal handling logic until we process the SIGSEGV triggered by writing to InterruptFaultPage.\n    return;\n  }\n\n  // Check for masked signals\n  if (ThreadObject->SignalInfo.CurrentSignalMask.Val & (1ULL << (Signal - 1)) && IsAsyncSignal(&SigInfo, Signal)) {\n    // This signal is masked, must defer until the guest updates the signal mask.\n    // Add it to the pending signal list\n    ThreadObject->SignalInfo.PendingSignals |= 1ULL << (Signal - 1);\n    return;\n  }\n\n  // Let the host take first stab at handling the signal\n  SignalHandler& Handler = HostHandlers[Signal];\n\n  // Remove the pending signal\n  ThreadObject->SignalInfo.PendingSignals &= ~(1ULL << (Signal - 1));\n\n  // We have an emulation thread pointer, we can now modify its state\n  if (Handler.GuestAction.sigaction_handler.handler == SIG_DFL) {\n    if (Handler.DefaultBehaviour == DEFAULT_TERM || Handler.DefaultBehaviour == DEFAULT_COREDUMP) {\n      // Let the signal fall through to the unhandled path\n      // This way the parent process can know it died correctly\n    }\n  } else if (Handler.GuestAction.sigaction_handler.handler == SIG_IGN) {\n    return;\n  } else {\n    if (Handler.GuestHandler &&\n        Handler.GuestHandler(Thread, Signal, &SigInfo, UContext, &Handler.GuestAction, &ThreadObject->SignalInfo.GuestAltStack)) {\n      uint64_t NewMask = GetNewSigMask(Signal);\n\n      // Update our host signal mask so we don't hit race conditions with signals\n      // This allows us to maintain the expected signal mask through the guest signal handling and then all the way back again\n      memcpy(&_context->uc_sigmask, &NewMask, sizeof(uint64_t));\n\n      // We handled this signal, continue running\n      return;\n    }\n    ERROR_AND_DIE_FMT(\"Unhandled guest exception\");\n  }\n\n  // Unhandled crash\n  // Call back in to the previous handler\n  if (Handler.OldAction.sa_flags & SA_SIGINFO) {\n    Handler.OldAction.sigaction(Signal, &SigInfo, UContext);\n  } else if (Handler.OldAction.handler == SIG_IGN || (Handler.OldAction.handler == SIG_DFL && Handler.DefaultBehaviour == DEFAULT_IGNORE)) {\n    // Do nothing\n  } else if (Handler.OldAction.handler == SIG_DFL && (Handler.DefaultBehaviour == DEFAULT_COREDUMP || Handler.DefaultBehaviour == DEFAULT_TERM)) {\n    CTX->FlushAndCloseCodeMap();\n\n#ifndef FEX_DISABLE_TELEMETRY\n    // In the case of signals that cause coredump or terminate, save telemetry early.\n    // FEX is hard crashing at this point and won't hit regular shutdown routines.\n    // Add the signal to the crash mask.\n    FEXCORE_TELEMETRY_OR(TYPE_CRASH_MASK, (1ULL << Signal));\n    if (Signal == SIGSEGV && reinterpret_cast<uint64_t>(SigInfo.si_addr) >= SyscallHandler::TASK_MAX_64BIT) {\n      // Tried accessing invalid non-canonical x86-64 address.\n      FEXCORE_TELEMETRY_SET(TYPE_UNHANDLED_NONCANONICAL_ADDRESS, 1);\n    }\n    SaveTelemetry();\n#endif\n\n    FEX::HLE::_SyscallHandler->TM.CleanupForExit();\n\n    // Reassign back to DFL and crash\n    signal(Signal, SIG_DFL);\n    if (SigInfo.si_code != SI_KERNEL) {\n      // If the signal wasn't sent by the kernel then we need to reraise it.\n      // This is necessary since returning from this signal handler now might just continue executing.\n      // eg: If sent from tgkill then the signal gets dropped and returns.\n      FHU::Syscalls::tgkill(::getpid(), FHU::Syscalls::gettid(), Signal);\n    }\n  } else {\n    Handler.OldAction.handler(Signal);\n  }\n}\n\nvoid SignalDelegator::SaveTelemetry() {\n#ifndef FEX_DISABLE_TELEMETRY\n  if (!ApplicationName.empty()) {\n    FEXCore::Telemetry::Shutdown(ApplicationName);\n  }\n#endif\n}\n\nbool SignalDelegator::InstallHostThunk(int Signal) {\n  SignalHandler& SignalHandler = HostHandlers[Signal];\n  // If the host thunk is already installed for this, just return\n  if (SignalHandler.Installed) {\n    return false;\n  }\n\n  // Default flags for us\n  SignalHandler.HostAction.sa_flags = SA_SIGINFO | SA_ONSTACK;\n\n  bool Result = UpdateHostThunk(Signal);\n\n  SignalHandler.Installed = Result;\n  return Result;\n}\n\nbool SignalDelegator::UpdateHostThunk(int Signal) {\n  SignalHandler& SignalHandler = HostHandlers[Signal];\n\n  // Now install the thunk handler\n  SignalHandler.HostAction.sigaction = SignalHandlerThunk;\n\n  auto CheckAndAddFlags = [](uint64_t HostFlags, uint64_t GuestFlags, uint64_t Flags) {\n    // If any of the flags don't match then update to the newest set\n    if ((HostFlags ^ GuestFlags) & Flags) {\n      // Remove all the flags from the host that we are testing for\n      HostFlags &= ~Flags;\n      // Copy over the guest flags being set\n      HostFlags |= GuestFlags & Flags;\n    }\n\n    return HostFlags;\n  };\n\n  // Don't allow the guest to override flags for\n  // SA_SIGINFO : Host always needs SA_SIGINFO\n  // SA_ONSTACK : Host always needs the altstack\n  // SA_RESETHAND : We don't support one shot handlers\n  // SA_RESTORER : We always need our host side restorer on x86-64, Couldn't use guest restorer anyway\n  SignalHandler.HostAction.sa_flags = CheckAndAddFlags(SignalHandler.HostAction.sa_flags, SignalHandler.GuestAction.sa_flags,\n                                                       SA_NOCLDSTOP | SA_NOCLDWAIT | SA_NODEFER | SA_RESTART);\n\n#ifdef ARCHITECTURE_x86_64\n#define SA_RESTORER 0x04000000\n  SignalHandler.HostAction.sa_flags |= SA_RESTORER;\n  SignalHandler.HostAction.restorer = sigrestore;\n#endif\n\n  // Walk the signals we have that are required and make sure to remove it from the mask\n  // This'll likely be SIGILL, SIGBUS, SIG63\n\n  // If the guest has masked some signals then we need to also mask those signals\n  for (size_t i = 1; i < HostHandlers.size(); ++i) {\n    if (HostHandlers[i].Required.load(std::memory_order_relaxed)) {\n      SignalHandler.HostAction.sa_mask &= ~(1ULL << (i - 1));\n    } else if (SigIsMember(&SignalHandler.GuestAction.sa_mask, i)) {\n      SignalHandler.HostAction.sa_mask |= (1ULL << (i - 1));\n    }\n  }\n\n  // Check for SIG_IGN\n  if (SignalHandler.GuestAction.sigaction_handler.handler == SIG_IGN && HostHandlers[Signal].Required.load(std::memory_order_relaxed) == false) {\n    // We are ignoring this signal on the guest\n    // Which means we need to ignore it on the host as well\n    SignalHandler.HostAction.handler = SIG_IGN;\n  }\n\n  // Check for SIG_DFL\n  if (SignalHandler.GuestAction.sigaction_handler.handler == SIG_DFL && HostHandlers[Signal].Required.load(std::memory_order_relaxed) == false) {\n    // Default handler on guest and default handler on host\n    // With coredump and terminate then expect fireworks, but that is what the guest wants\n    SignalHandler.HostAction.handler = SIG_DFL;\n  }\n\n  // Only update the old action if we haven't ever been installed\n  const int Result =\n    ::syscall(SYS_rt_sigaction, Signal, &SignalHandler.HostAction, SignalHandler.Installed ? nullptr : &SignalHandler.OldAction, 8);\n  if (Result < 0) {\n    // Signal 32 and 33 are consumed by glibc. We don't handle this atm\n    LogMan::Msg::AFmt(\"Failed to install host signal thunk for signal {}: {}\", Signal, strerror(errno));\n    return false;\n  }\n\n  return true;\n}\n\nvoid SignalDelegator::UninstallHostHandler(int Signal) {\n  SignalHandler& SignalHandler = HostHandlers[Signal];\n\n  ::syscall(SYS_rt_sigaction, Signal, &SignalHandler.OldAction, nullptr, 8);\n}\n\nvoid SignalDelegator::QueueSignal(pid_t tgid, pid_t tid, int Signal, siginfo_t* info, bool IgnoreMask) {\n  bool WasIgnored {};\n  bool WasMasked {};\n  SignalHandler& SignalHandler = HostHandlers[Signal];\n  if (SignalHandler.GuestAction.sigaction_handler.handler == SIG_IGN && IgnoreMask) {\n    ::syscall(SYS_rt_sigaction, Signal, &SignalHandler.OldAction, nullptr, 8);\n    WasIgnored = true;\n  }\n\n  // Get the current host signal mask\n  uint64_t ThreadSignalMask {};\n  const uint64_t SignalMask = 1ULL << (Signal - 1);\n  ::syscall(SYS_rt_sigprocmask, 0, nullptr, &ThreadSignalMask, 8);\n  if (ThreadSignalMask & SignalMask) {\n    WasMasked = true;\n\n    // Signal currently masked, unmask\n    ThreadSignalMask &= ~SignalMask;\n    ::syscall(SYS_rt_sigprocmask, 0, &ThreadSignalMask, &ThreadSignalMask, 8);\n  }\n\n  ::syscall(SYSCALL_DEF(rt_tgsigqueueinfo), tgid, tid, Signal, info);\n\n  if (WasMasked) {\n    // Mask again\n    ::syscall(SYS_rt_sigprocmask, 0, &ThreadSignalMask, nullptr, 8);\n  }\n\n  if (WasIgnored) {\n    // Ignore again\n    ::syscall(SYS_rt_sigaction, Signal, &SignalHandler.HostAction, nullptr, 8);\n  }\n}\n\nSignalDelegator::SignalDelegator(FEXCore::Context::Context* _CTX, const std::string_view ApplicationName, bool SupportsAVX)\n  : CTX {_CTX}\n  , ApplicationName {ApplicationName}\n  , SupportsAVX {SupportsAVX} {\n  // Signal zero isn't real\n  HostHandlers[0].Installed = true;\n\n  // We can't capture SIGKILL or SIGSTOP\n  HostHandlers[SIGKILL].Installed = true;\n  HostHandlers[SIGSTOP].Installed = true;\n\n  if (HalfBarrierTSOEnabled()) {\n    UnalignedHandlerType = FEXCore::ArchHelpers::Arm64::UnalignedHandlerType::HalfBarrier;\n  } else {\n    UnalignedHandlerType = FEXCore::ArchHelpers::Arm64::UnalignedHandlerType::NonAtomic;\n  }\n\n  // Most signals default to termination\n  // These ones are slightly different\n  static constexpr std::array<std::pair<int, SignalDelegator::DefaultBehaviourType>, 14> SignalDefaultBehaviours = {{\n    {SIGQUIT, DEFAULT_COREDUMP},\n    {SIGILL, DEFAULT_COREDUMP},\n    {SIGTRAP, DEFAULT_COREDUMP},\n    {SIGABRT, DEFAULT_COREDUMP},\n    {SIGBUS, DEFAULT_COREDUMP},\n    {SIGFPE, DEFAULT_COREDUMP},\n    {SIGSEGV, DEFAULT_COREDUMP},\n    {SIGCHLD, DEFAULT_IGNORE},\n    {SIGCONT, DEFAULT_IGNORE},\n    {SIGURG, DEFAULT_IGNORE},\n    {SIGXCPU, DEFAULT_COREDUMP},\n    {SIGXFSZ, DEFAULT_COREDUMP},\n    {SIGSYS, DEFAULT_COREDUMP},\n    {SIGWINCH, DEFAULT_IGNORE},\n  }};\n\n  for (const auto& [Signal, Behaviour] : SignalDefaultBehaviours) {\n    HostHandlers[Signal].DefaultBehaviour = Behaviour;\n  }\n\n  // Register frontend SIGILL handler for forced assertion.\n  RegisterFrontendHostSignalHandler(\n    SIGILL,\n    [](FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext) -> bool {\n      ucontext_t* _context = (ucontext_t*)ucontext;\n      auto& mcontext = _context->uc_mcontext;\n      uint64_t PC {};\n#ifdef ARCHITECTURE_arm64\n      PC = mcontext.pc;\n#else\n      PC = mcontext.gregs[REG_RIP];\n#endif\n      if (PC == reinterpret_cast<uint64_t>(&FEXCore::Assert::ForcedAssert)) {\n        // This is a host side assert. Don't deliver this to the guest\n        // We want to actually break here\n        FEX::HLE::ThreadManager::GetStateObjectFromFEXCoreThread(Thread)->SignalInfo.Delegator->UninstallHostHandler(Signal);\n        return true;\n      }\n      return false;\n    },\n    true);\n\n  const auto PauseHandler = [](FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext) -> bool {\n    return FEX::HLE::ThreadManager::GetStateObjectFromFEXCoreThread(Thread)->SignalInfo.Delegator->HandleSignalPause(Thread, Signal, info, ucontext);\n  };\n\n  const auto GuestSignalHandler = [](FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext,\n                                     GuestSigAction* GuestAction, stack_t* GuestStack) -> bool {\n    return FEX::HLE::ThreadManager::GetStateObjectFromFEXCoreThread(Thread)->SignalInfo.Delegator->HandleDispatcherGuestSignal(\n      Thread, Signal, info, ucontext, GuestAction, GuestStack);\n  };\n\n  const auto SigillHandler = [](FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext) -> bool {\n    return FEX::HLE::ThreadManager::GetStateObjectFromFEXCoreThread(Thread)->SignalInfo.Delegator->HandleSIGILL(Thread, Signal, info, ucontext);\n  };\n\n  const auto SigsegvHandler = [](FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext) -> bool {\n    return FEX::HLE::ThreadManager::GetStateObjectFromFEXCoreThread(Thread)->SignalInfo.Delegator->HandleFrontendSIGSEGV(Thread, Signal,\n                                                                                                                         info, ucontext);\n  };\n\n  // Register SIGILL signal handler.\n  RegisterHostSignalHandler(SIGILL, SigillHandler, true);\n  RegisterHostSignalHandler(SIGSEGV, SigsegvHandler, true);\n\n#ifdef ARCHITECTURE_arm64\n  // Register SIGBUS signal handler.\n  const auto SigbusHandler = [](FEXCore::Core::InternalThreadState* Thread, int Signal, void* _info, void* ucontext) -> bool {\n    const auto PC = ArchHelpers::Context::GetPc(ucontext);\n    if (!Thread->CTX->IsAddressInCodeBuffer(Thread, PC)) {\n      // Wasn't a sigbus in JIT code\n      return false;\n    }\n    siginfo_t* info = reinterpret_cast<siginfo_t*>(_info);\n\n    if (info->si_code != BUS_ADRALN) {\n      // This only handles alignment problems\n      return false;\n    }\n\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Thread, AccumulatedSIGBUSCount, 1);\n    const auto Delegator = FEX::HLE::ThreadManager::GetStateObjectFromFEXCoreThread(Thread)->SignalInfo.Delegator;\n    const auto Result = FEXCore::ArchHelpers::Arm64::HandleUnalignedAccess(Thread, Delegator->GetUnalignedHandlerType(), PC,\n                                                                           ArchHelpers::Context::GetArmGPRs(ucontext));\n    ArchHelpers::Context::SetPc(ucontext, PC + Result.value_or(0));\n    return Result.has_value();\n  };\n\n  RegisterHostSignalHandler(SIGBUS, SigbusHandler, true);\n#endif\n  // Register pause signal handler.\n  RegisterHostSignalHandler(SignalDelegator::SIGNAL_FOR_PAUSE, PauseHandler, true);\n\n  // Guest signal handlers.\n  for (uint32_t Signal = 0; Signal <= SignalDelegator::MAX_SIGNALS; ++Signal) {\n    RegisterHostSignalHandlerForGuest(Signal, GuestSignalHandler);\n  }\n}\n\nSignalDelegator::~SignalDelegator() {\n  for (int i = 0; i < MAX_SIGNALS; ++i) {\n    if (i == 0 || i == SIGKILL || i == SIGSTOP || !HostHandlers[i].Installed) {\n      continue;\n    }\n    ::syscall(SYS_rt_sigaction, i, &HostHandlers[i].OldAction, nullptr, 8);\n    HostHandlers[i].Installed = false;\n  }\n}\n\nvoid SignalDelegator::RegisterTLSState(FEX::HLE::ThreadStateObject* Thread) {\n  FEXCore::Allocator::RegisterTLSData(Thread->Thread);\n\n  Thread->SignalInfo.Delegator = this;\n\n  // Set up our signal alternative stack\n  // This is per thread rather than per signal\n  Thread->SignalInfo.AltStackPtr = FEXCore::Allocator::mmap(nullptr, SIGSTKSZ * 16, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n  FEXCore::Allocator::VirtualName(\"FEXMem_Misc\", reinterpret_cast<void*>(Thread->SignalInfo.AltStackPtr), SIGSTKSZ * 16);\n  stack_t altstack {};\n  altstack.ss_sp = reinterpret_cast<void*>(reinterpret_cast<uint64_t>(Thread->SignalInfo.AltStackPtr) + 8);\n  altstack.ss_size = SIGSTKSZ * 16 - 8;\n  altstack.ss_flags = 0;\n  LOGMAN_THROW_A_FMT(!!altstack.ss_sp, \"Couldn't allocate stack pointer\");\n\n  // Copy the thread object to the start of the alt-stack\n  memcpy(Thread->SignalInfo.AltStackPtr, &Thread, sizeof(void*));\n\n  // Protect the first page of the alt-stack for overflow protection.\n  mprotect(Thread->SignalInfo.AltStackPtr, FEXCore::Utils::FEX_PAGE_SIZE, PROT_READ);\n\n  // Register the alt stack\n  const int Result = sigaltstack(&altstack, nullptr);\n  if (Result == -1) {\n    LogMan::Msg::EFmt(\"Failed to install alternative signal stack {}\", strerror(errno));\n  }\n\n  // Get the current host signal mask\n  ::syscall(SYS_rt_sigprocmask, 0, nullptr, &Thread->SignalInfo.CurrentSignalMask.Val, 8);\n\n  if (Thread->Thread) {\n    // Reserve a small amount of deferred signal frames. Usually the stack won't be utilized beyond\n    // 1 or 2 signals but add a few more just in case.\n    Thread->SignalInfo.DeferredSignalFrames.reserve(8);\n  }\n}\n\nvoid SignalDelegator::UninstallTLSState(FEX::HLE::ThreadStateObject* Thread) {\n  FEXCore::Allocator::munmap(Thread->SignalInfo.AltStackPtr, SIGSTKSZ * 16);\n\n  Thread->SignalInfo.AltStackPtr = nullptr;\n\n  stack_t altstack {};\n  altstack.ss_flags = SS_DISABLE;\n\n  // Uninstall the alt stack\n  const int Result = sigaltstack(&altstack, nullptr);\n  if (Result == -1) {\n    LogMan::Msg::EFmt(\"Failed to uninstall alternative signal stack {}\", strerror(errno));\n  }\n\n  FEXCore::Allocator::UninstallTLSData(Thread->Thread);\n}\n\nvoid SignalDelegator::FrontendRegisterHostSignalHandler(int Signal, bool Required) {\n  // Linux signal handlers are per-process rather than per thread\n  // Multiple threads could be calling in to this\n  std::lock_guard lk(HostDelegatorMutex);\n  HostHandlers[Signal].Required = Required;\n  InstallHostThunk(Signal);\n}\n\nvoid SignalDelegator::FrontendRegisterFrontendHostSignalHandler(int Signal, bool Required) {\n  // Linux signal handlers are per-process rather than per thread\n  // Multiple threads could be calling in to this\n  std::lock_guard lk(HostDelegatorMutex);\n  HostHandlers[Signal].Required = Required;\n  InstallHostThunk(Signal);\n}\n\nvoid SignalDelegator::RegisterHostSignalHandlerForGuest(int Signal, FEX::HLE::HostSignalDelegatorFunctionForGuest Func) {\n  std::lock_guard lk(HostDelegatorMutex);\n  HostHandlers[Signal].GuestHandler = std::move(Func);\n}\n\nvoid SignalDelegator::RegisterFrontendHostSignalHandler(int Signal, HostSignalDelegatorFunction Func, bool Required) {\n  SetFrontendHostSignalHandler(Signal, std::move(Func), Required);\n  FrontendRegisterFrontendHostSignalHandler(Signal, Required);\n}\n\nuint64_t SignalDelegator::RegisterGuestSignalHandler(int Signal, const GuestSigAction* Action, GuestSigAction* OldAction) {\n  std::lock_guard lk(GuestDelegatorMutex);\n\n  // Invalid signal specified\n  if (Signal > MAX_SIGNALS) {\n    return -EINVAL;\n  }\n\n  // If we have an old signal set then give it back\n  if (OldAction) {\n    *OldAction = HostHandlers[Signal].GuestAction;\n  }\n\n  // Now assign the new action\n  if (Action) {\n    // These signal dispositions can't be changed on Linux\n    if (Signal == SIGKILL || Signal == SIGSTOP) {\n      return -EINVAL;\n    }\n\n    HostHandlers[Signal].GuestAction = *Action;\n    // Only attempt to install a new thunk handler if we were installing a new guest action\n    if (!InstallHostThunk(Signal)) {\n      UpdateHostThunk(Signal);\n    }\n  }\n\n  return 0;\n}\n\nvoid SignalDelegator::CheckXIDHandler() {\n  std::lock_guard lk(GuestDelegatorMutex);\n  std::lock_guard lk2(HostDelegatorMutex);\n\n  constexpr size_t SIGNAL_SETXID = 33;\n\n  kernel_sigaction CurrentAction {};\n\n  // Only update the old action if we haven't ever been installed\n  const int Result = ::syscall(SYS_rt_sigaction, SIGNAL_SETXID, nullptr, &CurrentAction, 8);\n  if (Result < 0) {\n    LogMan::Msg::AFmt(\"Failed to get status of XID signal\");\n    return;\n  }\n\n  SignalHandler& HostHandler = HostHandlers[SIGNAL_SETXID];\n  if (CurrentAction.handler != HostHandler.HostAction.handler) {\n    // GLIBC overwrote our XID handler, reinstate our handler\n    const int Result = ::syscall(SYS_rt_sigaction, SIGNAL_SETXID, &HostHandler.HostAction, nullptr, 8);\n    if (Result < 0) {\n      LogMan::Msg::AFmt(\"Failed to reinstate our XID signal handler {}\", strerror(errno));\n    }\n  }\n}\n\nuint64_t SignalDelegator::RegisterGuestSigAltStack(FEX::HLE::ThreadStateObject* Thread, const stack_t* ss, stack_t* old_ss) {\n  bool UsingAltStack {};\n  uint64_t AltStackBase = reinterpret_cast<uint64_t>(Thread->SignalInfo.GuestAltStack.ss_sp);\n  uint64_t AltStackEnd = AltStackBase + Thread->SignalInfo.GuestAltStack.ss_size;\n  uint64_t GuestSP = Thread->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RSP];\n\n  if (!(Thread->SignalInfo.GuestAltStack.ss_flags & SS_DISABLE) && GuestSP >= AltStackBase && GuestSP <= AltStackEnd) {\n    UsingAltStack = true;\n  }\n\n  // If we have an old signal set then give it back\n  if (old_ss) {\n    *old_ss = Thread->SignalInfo.GuestAltStack;\n\n    if (UsingAltStack) {\n      // We are currently operating on the alt stack\n      // Let the guest know\n      old_ss->ss_flags |= SS_ONSTACK;\n    } else {\n      old_ss->ss_flags |= SS_DISABLE;\n    }\n  }\n\n  // Now assign the new action\n  if (ss) {\n    // If we tried setting the alt stack while we are using it then throw an error\n    if (UsingAltStack) {\n      return -EPERM;\n    }\n\n    // We need to check for invalid flags\n    // The only flag that can be passed is SS_AUTODISARM and SS_DISABLE\n    if ((ss->ss_flags & ~SS_ONSTACK) & // SS_ONSTACK is ignored\n        ~(SS_AUTODISARM | SS_DISABLE)) {\n      // A flag remained that isn't one of the supported ones?\n      return -EINVAL;\n    }\n\n    if (ss->ss_flags & SS_DISABLE) {\n      // If SS_DISABLE Is specified then the rest of the details are ignored\n      Thread->SignalInfo.GuestAltStack = *ss;\n      return 0;\n    }\n\n    // stack size needs to be at least X86_MINSIGSTKSZ\n    if (ss->ss_size < X86_MINSIGSTKSZ) {\n      return -ENOMEM;\n    }\n\n    Thread->SignalInfo.GuestAltStack = *ss;\n  }\n\n  return 0;\n}\n\nstatic void CheckForPendingSignals(const FEX::HLE::ThreadStateObject* Thread) {\n  // Do we have any pending signals that became unmasked?\n  uint64_t PendingSignals = ~Thread->SignalInfo.CurrentSignalMask.Val & Thread->SignalInfo.PendingSignals;\n  if (PendingSignals != 0) {\n    for (int i = 0; i < 64; ++i) {\n      if (PendingSignals & (1ULL << i)) {\n        FHU::Syscalls::tgkill(Thread->ThreadInfo.PID, Thread->ThreadInfo.TID, i + 1);\n        // We might not even return here which is spooky\n      }\n    }\n  }\n}\n\nuint64_t SignalDelegator::GuestSigProcMask(FEX::HLE::ThreadStateObject* Thread, int how, const uint64_t* set, uint64_t* oldset) {\n  // The order in which we handle signal mask setting is important here\n  // old and new can point to the same location in memory.\n  // Even if the pointers are to same memory location, we must store the original signal mask\n  // coming in to the syscall.\n  // 1) Store old mask\n  // 2) Set mask to new mask if exists\n  // 3) Give old mask back\n  auto OldSet = Thread->SignalInfo.CurrentSignalMask.Val;\n\n  if (!!set) {\n    uint64_t IgnoredSignalsMask = ~((1ULL << (SIGKILL - 1)) | (1ULL << (SIGSTOP - 1)));\n    if (how == SIG_BLOCK) {\n      Thread->SignalInfo.CurrentSignalMask.Val |= *set & IgnoredSignalsMask;\n    } else if (how == SIG_UNBLOCK) {\n      Thread->SignalInfo.CurrentSignalMask.Val &= ~(*set & IgnoredSignalsMask);\n    } else if (how == SIG_SETMASK) {\n      Thread->SignalInfo.CurrentSignalMask.Val = *set & IgnoredSignalsMask;\n    } else {\n      return -EINVAL;\n    }\n\n    uint64_t HostMask = Thread->SignalInfo.CurrentSignalMask.Val;\n    // Now actually set the host mask\n    // This will hide from the guest that we are not actually setting all of the masks it wants\n    for (size_t i = 0; i < MAX_SIGNALS; ++i) {\n      if (HostHandlers[i + 1].Required.load(std::memory_order_relaxed)) {\n        // If it is a required host signal then we can't mask it\n        HostMask &= ~(1ULL << i);\n      }\n    }\n\n    ::syscall(SYS_rt_sigprocmask, SIG_SETMASK, &HostMask, nullptr, 8);\n  }\n\n  if (!!oldset) {\n    *oldset = OldSet;\n  }\n\n  CheckForPendingSignals(Thread);\n\n  return 0;\n}\n\nuint64_t SignalDelegator::GuestSigPending(FEX::HLE::ThreadStateObject* Thread, uint64_t* set, size_t sigsetsize) {\n  if (sigsetsize > sizeof(uint64_t)) {\n    return -EINVAL;\n  }\n\n  *set = Thread->SignalInfo.PendingSignals;\n\n  sigset_t HostSet {};\n  if (sigpending(&HostSet) == 0) {\n    uint64_t HostSignals {};\n    for (size_t i = 0; i < MAX_SIGNALS; ++i) {\n      if (sigismember(&HostSet, i + 1)) {\n        HostSignals |= (1ULL << i);\n      }\n    }\n\n    // Merge the real pending signal mask as well\n    *set |= HostSignals;\n  }\n  return 0;\n}\n\nuint64_t SignalDelegator::GuestSigSuspend(FEX::HLE::ThreadStateObject* Thread, uint64_t* set, size_t sigsetsize) {\n  if (sigsetsize > sizeof(uint64_t)) {\n    return -EINVAL;\n  }\n\n  uint64_t IgnoredSignalsMask = ~((1ULL << (SIGKILL - 1)) | (1ULL << (SIGSTOP - 1)));\n\n  // Backup the mask\n  Thread->SignalInfo.PreviousSuspendMask = Thread->SignalInfo.CurrentSignalMask;\n  // Set the new mask\n  Thread->SignalInfo.CurrentSignalMask.Val = *set & IgnoredSignalsMask;\n  sigset_t HostSet {};\n\n  sigemptyset(&HostSet);\n\n  for (int32_t i = 0; i < MAX_SIGNALS; ++i) {\n    if (*set & (1ULL << i)) {\n      sigaddset(&HostSet, i + 1);\n    }\n  }\n\n  // Additionally we must always listen to SIGNAL_FOR_PAUSE\n  // This technically forces us in to a race but should be fine\n  // SIGBUS and SIGILL can't happen so we don't need to listen for them\n  // sigaddset(&HostSet, SIGNAL_FOR_PAUSE);\n\n  // Spin this in a loop until we aren't sigsuspended\n  // This can happen in the case that the guest has sent signal that we can't block\n  uint64_t Result = sigsuspend(&HostSet);\n\n  // Restore Previous signal mask we are emulating\n  // XXX: Might be unsafe if the signal handler adjusted the thread's signal mask\n  // But since we don't support the guest adjusting the mask through the context object\n  // then this is safe-ish\n  Thread->SignalInfo.CurrentSignalMask = Thread->SignalInfo.PreviousSuspendMask;\n\n  CheckForPendingSignals(Thread);\n\n  return Result == -1 ? -errno : Result;\n}\n\nuint64_t SignalDelegator::GuestSigTimedWait(uint64_t* set, siginfo_t* info, const struct timespec* timeout, size_t sigsetsize) {\n  if (sigsetsize > sizeof(uint64_t)) {\n    return -EINVAL;\n  }\n\n  uint64_t Result = ::syscall(SYS_rt_sigtimedwait, set, info, timeout);\n\n  return Result == -1 ? -errno : Result;\n}\n\nuint64_t SignalDelegator::GuestSignalFD(int fd, const uint64_t* set, size_t sigsetsize, int flags) {\n  if (sigsetsize > sizeof(uint64_t)) {\n    return -EINVAL;\n  }\n\n  sigset_t HostSet {};\n  sigemptyset(&HostSet);\n\n  for (size_t i = 0; i < MAX_SIGNALS; ++i) {\n    if (HostHandlers[i + 1].Required.load(std::memory_order_relaxed)) {\n      // For now skip our internal signals\n      continue;\n    }\n\n    if (*set & (1ULL << i)) {\n      sigaddset(&HostSet, i + 1);\n    }\n  }\n\n  // XXX: This is a barebones implementation just to get applications that listen for SIGCHLD to work\n  // In the future we need our own listern thread that forwards the result\n  // Thread is necessary to prevent deadlocks for a thread that has signaled on the same thread listening to the FD and blocking is enabled\n  uint64_t Result = signalfd(fd, &HostSet, flags);\n\n  return Result == -1 ? -errno : Result;\n}\n\nfextl::unique_ptr<FEX::HLE::SignalDelegator>\nCreateSignalDelegator(FEXCore::Context::Context* CTX, const std::string_view ApplicationName, bool SupportsAVX) {\n  return fextl::make_unique<FEX::HLE::SignalDelegator>(CTX, ApplicationName, SupportsAVX);\n}\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/SignalDelegator.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|common\n$end_info$\n*/\n\n\n#pragma once\n\n#include \"LinuxSyscalls/Types.h\"\n#include \"ArchHelpers/MContext.h\"\n#include \"VDSO_Emulation.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <array>\n#include <atomic>\n#include <cstddef>\n#include <cstdint>\n#include <functional>\n#include <mutex>\n\n#include <FEXCore/Core/SignalDelegator.h>\n#include <FEXCore/Utils/ArchHelpers/Arm64.h>\n#include <FEXCore/Utils/Telemetry.h>\n\nnamespace FEXCore::Context {\nclass Context;\n}\nnamespace FEXCore::Core {\nstruct InternalThreadState;\n}\nnamespace FEX::HLE {\nenum class SignalEvent : uint32_t;\nstruct ThreadStateObject;\n} // namespace FEX::HLE\n\nnamespace FEX::HLE {\nusing HostSignalDelegatorFunction = std::function<bool(FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext)>;\nusing HostSignalDelegatorFunctionForGuest =\n  std::function<bool(FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext, GuestSigAction* GuestAction, stack_t* GuestStack)>;\n\nclass SignalDelegator final : public FEXCore::SignalDelegator, public FEXCore::Allocator::FEXAllocOperators {\npublic:\n  constexpr static size_t MAX_SIGNALS {64};\n\n  // Use the last signal just so we are less likely to ever conflict with something that the guest application is using\n  // 64 is used internally by Valgrind\n  constexpr static size_t SIGNAL_FOR_PAUSE {63};\n\n  // Returns true if the host handled the signal\n  // Arguments are the same as sigaction handler\n  SignalDelegator(FEXCore::Context::Context* _CTX, const std::string_view ApplicationName, bool SupportsAVX);\n  ~SignalDelegator() override;\n\n  // Called from the signal trampoline function.\n  void HandleSignal(FEX::HLE::ThreadStateObject* Thread, int Signal, void* Info, void* UContext);\n\n  void RegisterTLSState(FEX::HLE::ThreadStateObject* Thread);\n  void UninstallTLSState(FEX::HLE::ThreadStateObject* Thread);\n\n  /**\n   * @brief Registers a signal handler for the host to handle a signal\n   *\n   * It's a process level signal handler so one must be careful\n   */\n  void RegisterHostSignalHandler(int Signal, HostSignalDelegatorFunction Func, bool Required);\n\n  /**\n   * @brief Registers a signal handler for the host to handle a signal specifically for guest handling\n   *\n   * It's a process level signal handler so one must be careful\n   */\n  void RegisterHostSignalHandlerForGuest(int Signal, HostSignalDelegatorFunctionForGuest Func);\n  void RegisterFrontendHostSignalHandler(int Signal, HostSignalDelegatorFunction Func, bool Required);\n\n  /**\n   * @name These functions are all for Linux signal emulation\n   * @{ */\n  /**\n   * @brief Allows the guest to register a signal handler that is run after the host attempts to resolve the handler first\n   */\n  uint64_t RegisterGuestSignalHandler(int Signal, const GuestSigAction* Action, struct GuestSigAction* OldAction);\n\n  uint64_t RegisterGuestSigAltStack(FEX::HLE::ThreadStateObject* Thread, const stack_t* ss, stack_t* old_ss);\n\n  uint64_t GuestSigProcMask(FEX::HLE::ThreadStateObject* Thread, int how, const uint64_t* set, uint64_t* oldset);\n  uint64_t GuestSigPending(FEX::HLE::ThreadStateObject* Thread, uint64_t* set, size_t sigsetsize);\n  uint64_t GuestSigSuspend(FEX::HLE::ThreadStateObject* Thread, uint64_t* set, size_t sigsetsize);\n  uint64_t GuestSigTimedWait(uint64_t* set, siginfo_t* info, const struct timespec* timeout, size_t sigsetsize);\n  uint64_t GuestSignalFD(int fd, const uint64_t* set, size_t sigsetsize, int flags);\n  /**  @} */\n\n  /**\n   * @brief Check to ensure the XID handler is still set to the FEX handler\n   *\n   * On a new thread GLIBC will set the XID handler underneath us.\n   * After the first thread is created check this.\n   */\n  void CheckXIDHandler();\n\n  void UninstallHostHandler(int Signal);\n  void QueueSignal(pid_t tgid, pid_t tid, int Signal, siginfo_t* info, bool IgnoreMask);\n\n  FEXCore::Context::Context* CTX;\n\n  void SetVDSOSymbols() {\n    // Get symbols from VDSO.\n    VDSOPointers = FEX::VDSO::GetVDSOSymbols();\n  }\n\n  uintptr_t GetThunkCallbackRET() const override {\n    return reinterpret_cast<uintptr_t>(VDSOPointers.VDSO_FEX_CallbackRET);\n  }\n\n  [[noreturn]]\n  void HandleSignalHandlerReturn(bool RT) {\n    using SignalHandlerReturnFunc = void (*)();\n\n    SignalHandlerReturnFunc SignalHandlerReturn {};\n    if (RT) {\n      SignalHandlerReturn = reinterpret_cast<SignalHandlerReturnFunc>(Config.SignalHandlerReturnAddressRT);\n    } else {\n      SignalHandlerReturn = reinterpret_cast<SignalHandlerReturnFunc>(Config.SignalHandlerReturnAddress);\n    }\n\n    SignalHandlerReturn();\n    FEX_UNREACHABLE;\n  }\n\n  /**\n   * @brief Signals a thread with a specific core event.\n   *\n   * @param Thread Which thread to signal.\n   * @param Event Which event to signal the event with.\n   */\n  void SignalThread(FEXCore::Core::InternalThreadState* Thread, SignalEvent Event);\n\n  FEXCore::ArchHelpers::Arm64::UnalignedHandlerType GetUnalignedHandlerType() const {\n    return UnalignedHandlerType;\n  }\n\n  void SaveTelemetry();\n\n  void SpillSRA(FEXCore::Core::InternalThreadState* Thread, void* ucontext, uint32_t IgnoreMask);\n\nprivate:\n  // Called from the thunk handler to handle the signal\n  void HandleGuestSignal(FEX::HLE::ThreadStateObject* ThreadObject, int Signal, void* Info, void* UContext);\n  bool HandleFrontendSIGSEGV(FEXCore::Core::InternalThreadState* Thread, int Signal, void* Info, void* UContext);\n\n  /**\n   * @brief Registers a signal handler for the host to handle a signal\n   *\n   * It's a process level signal handler so one must be careful\n   */\n  void FrontendRegisterHostSignalHandler(int Signal, bool Required);\n  void FrontendRegisterFrontendHostSignalHandler(int Signal, bool Required);\n\n  void SetHostSignalHandler(int Signal, HostSignalDelegatorFunction Func, bool Required) {\n    HostHandlers[Signal].Handlers.push_back(std::move(Func));\n  }\n  void SetFrontendHostSignalHandler(int Signal, HostSignalDelegatorFunction Func, bool Required) {\n    HostHandlers[Signal].FrontendHandler = std::move(Func);\n  }\n\n  FEX_CONFIG_OPT(Is64BitMode, IS64BIT_MODE);\n  const fextl::string ApplicationName;\n  FEX_CONFIG_OPT(HalfBarrierTSOEnabled, HALFBARRIERTSOENABLED);\n\n  FEXCore::ArchHelpers::Arm64::UnalignedHandlerType UnalignedHandlerType {FEXCore::ArchHelpers::Arm64::UnalignedHandlerType::HalfBarrier};\n\n  enum DefaultBehaviourType {\n    DEFAULT_TERM,\n    // Core dump based signals are supposed to have a coredump appear\n    // For FEX's behaviour we don't really care right now\n    DEFAULT_COREDUMP = DEFAULT_TERM,\n    DEFAULT_IGNORE,\n  };\n\n  struct kernel_sigaction {\n    union {\n      void (*handler)(int);\n      void (*sigaction)(int, siginfo_t*, void*);\n    };\n\n    uint64_t sa_flags;\n\n    void (*restorer)();\n    uint64_t sa_mask;\n  };\n\n  struct SignalHandler {\n    std::atomic<bool> Installed {};\n    std::atomic<bool> Required {};\n    kernel_sigaction HostAction {};\n    kernel_sigaction OldAction {};\n    FEX::HLE::HostSignalDelegatorFunctionForGuest GuestHandler {};\n    GuestSigAction GuestAction {};\n    DefaultBehaviourType DefaultBehaviour {DEFAULT_TERM};\n\n    // Callbacks\n    fextl::vector<HostSignalDelegatorFunction> Handlers {};\n    HostSignalDelegatorFunction FrontendHandler {};\n  };\n\n  std::array<SignalHandler, MAX_SIGNALS + 1> HostHandlers {};\n  bool InstallHostThunk(int Signal);\n  bool UpdateHostThunk(int Signal);\n\n  FEX::VDSO::VDSOEntrypoints VDSOPointers {};\n\n  bool IsAddressInDispatcher(uint64_t Address) const {\n    return Address >= Config.DispatcherBegin && Address < Config.DispatcherEnd;\n  }\n\n  /*\n   * Signal frames on 32-bit architecture needs to match exactly how the kernel generates the frame.\n   * This is because large parts of the signal frame definition is part of the UAPI.\n   * This means that when FEX sets up the signal frame, it needs to match the UAPI stack setup.\n   *\n   * The two signal stack frame types below describe the two different 32-bit frame types.\n   */\n\n  // The 32-bit non-realtime signal frame.\n  // This frame type is used when the guest signal is used without the `SA_SIGINFO` flag.\n  struct SigFrame_i32 {\n    uint32_t pretcode;                          ///< sigreturn return branch point.\n    int32_t Signal;                             ///< The signal hit.\n    FEXCore::x86::sigcontext sc;                ///< The signal context.\n    FEXCore::x86::_libc_fpstate fpstate_unused; ///< Unused fpstate. Retained for backwards compatibility.\n    uint32_t extramask[1];                      ///< Upper 32-bits of the signal mask. Lower 32-bits is in the sigcontext.\n    char retcode[8];                            ///< Unused but needs to be filled. GDB seemingly uses as a debug marker.\n    ///< FP state now follows after this.\n  };\n\n  // The 32-bit realtime signal frame.\n  // This frame type is used when the guest signal is used with the `SA_SIGINFO` flag.\n  struct RTSigFrame_i32 {\n    uint32_t pretcode; ///< sigreturn return branch point.\n    int32_t Signal;    ///< The signal hit.\n    uint32_t pinfo;    ///< Pointer to siginfo_t\n    uint32_t puc;      ///< Pointer to ucontext_t\n    FEXCore::x86::siginfo_t info;\n    FEXCore::x86::ucontext_t uc;\n    char retcode[8]; ///< Unused but needs to be filled. GDB seemingly uses as a debug marker.\n    ///< FP state now follows after this.\n  };\n\n  void RestoreFrame_x64(FEXCore::Core::InternalThreadState* Thread, ArchHelpers::Context::ContextBackup* Context,\n                        FEXCore::Core::CpuStateFrame* Frame, void* ucontext);\n  void RestoreFrame_ia32(FEXCore::Core::InternalThreadState* Thread, ArchHelpers::Context::ContextBackup* Context,\n                         FEXCore::Core::CpuStateFrame* Frame, void* ucontext);\n  void RestoreRTFrame_ia32(FEXCore::Core::InternalThreadState* Thread, ArchHelpers::Context::ContextBackup* Context,\n                           FEXCore::Core::CpuStateFrame* Frame, void* ucontext);\n\n  ///< Setup the signal frame for x64.\n  uint64_t SetupFrame_x64(FEXCore::Core::InternalThreadState* Thread, ArchHelpers::Context::ContextBackup* ContextBackup,\n                          FEXCore::Core::CpuStateFrame* Frame, int Signal, siginfo_t* HostSigInfo, void* ucontext,\n                          GuestSigAction* GuestAction, stack_t* GuestStack, uint64_t NewGuestSP, const uint32_t eflags);\n\n  ///< Setup the signal frame for a 32-bit signal without SA_SIGINFO.\n  uint64_t SetupFrame_ia32(FEXCore::Core::InternalThreadState* Thread, ArchHelpers::Context::ContextBackup* ContextBackup,\n                           FEXCore::Core::CpuStateFrame* Frame, int Signal, siginfo_t* HostSigInfo, void* ucontext,\n                           GuestSigAction* GuestAction, stack_t* GuestStack, uint64_t NewGuestSP, const uint32_t eflags);\n\n  ///< Setup the signal frame for a 32-bit signal with SA_SIGINFO.\n  uint64_t SetupRTFrame_ia32(FEXCore::Core::InternalThreadState* Thread, ArchHelpers::Context::ContextBackup* ContextBackup,\n                             FEXCore::Core::CpuStateFrame* Frame, int Signal, siginfo_t* HostSigInfo, void* ucontext,\n                             GuestSigAction* GuestAction, stack_t* GuestStack, uint64_t NewGuestSP, const uint32_t eflags);\n\n  enum class RestoreType {\n    TYPE_REALTIME,    ///< Signal restore type is from a `realtime` signal.\n    TYPE_NONREALTIME, ///< Signal restore type is from a `non-realtime` signal.\n    TYPE_PAUSE,       ///< Signal restore type is from a GDB pause event.\n  };\n  ArchHelpers::Context::ContextBackup* StoreThreadState(FEXCore::Core::InternalThreadState* Thread, int Signal, void* ucontext);\n  void RestoreThreadState(FEXCore::Core::InternalThreadState* Thread, void* ucontext, RestoreType Type);\n  bool HandleDispatcherGuestSignal(FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext,\n                                   GuestSigAction* GuestAction, stack_t* GuestStack);\n  bool HandleSignalPause(FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext);\n  bool HandleSIGILL(FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext);\n\n  uint64_t GetNewSigMask(int Signal) const;\n\n  std::mutex HostDelegatorMutex;\n  std::mutex GuestDelegatorMutex;\n  bool SupportsAVX;\n};\n\nfextl::unique_ptr<FEX::HLE::SignalDelegator>\nCreateSignalDelegator(FEXCore::Context::Context* CTX, const std::string_view ApplicationName, bool SupportsAVX);\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/EPoll.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\nmeta: LinuxSyscalls|syscalls-shared ~ Syscall implementations shared between x86 and x86-64\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n\n#include <FEXCore/IR/IR.h>\n\n#include <stdint.h>\n#include <sys/epoll.h>\n\nnamespace FEX::HLE {\nvoid RegisterEpoll(FEX::HLE::SyscallHandler* Handler) {\n  using namespace FEXCore::IR;\n\n  REGISTER_SYSCALL_IMPL(epoll_create, [](FEXCore::Core::CpuStateFrame* Frame, int size) -> uint64_t {\n    uint64_t Result = epoll_create(size);\n    SYSCALL_ERRNO();\n  });\n}\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/FD.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n\n#include <FEXCore/IR/IR.h>\n\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <fcntl.h>\n#include <stdint.h>\n#include <sys/file.h>\n#include <sys/eventfd.h>\n#include <sys/inotify.h>\n#include <sys/mman.h>\n#include <sys/timerfd.h>\n#include <poll.h>\n#include <stddef.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <unistd.h>\n#include <sys/eventfd.h>\n#include <sys/syscall.h>\n\nnamespace FEX::HLE {\nvoid RegisterFD(FEX::HLE::SyscallHandler* Handler) {\n  using namespace FEXCore::IR;\n  REGISTER_SYSCALL_IMPL(poll, [](FEXCore::Core::CpuStateFrame* Frame, struct pollfd* fds, nfds_t nfds, int timeout) -> uint64_t {\n    if (nfds) {\n      // fds is allowed to be garbage if nfds is zero.\n      FaultSafeUserMemAccess::VerifyIsWritable(fds, sizeof(struct pollfd) * nfds);\n    }\n    uint64_t Result = ::poll(fds, nfds, timeout);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(open, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, int flags, uint32_t mode) -> uint64_t {\n    flags = FEX::HLE::RemapFromX86Flags(flags);\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Open(pathname, flags, mode);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(close, [](FEXCore::Core::CpuStateFrame* Frame, int fd) -> uint64_t {\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Close(fd);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(chown, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, uid_t owner, gid_t group) -> uint64_t {\n    uint64_t Result = ::chown(pathname, owner, group);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(lchown, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, uid_t owner, gid_t group) -> uint64_t {\n    uint64_t Result = ::lchown(pathname, owner, group);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(access, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, int mode) -> uint64_t {\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Access(pathname, mode);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(pipe, [](FEXCore::Core::CpuStateFrame* Frame, int pipefd[2]) -> uint64_t {\n    uint64_t Result = ::pipe(pipefd);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(dup3, [](FEXCore::Core::CpuStateFrame* Frame, int oldfd, int newfd, int flags) -> uint64_t {\n    flags = FEX::HLE::RemapFromX86Flags(flags);\n    uint64_t Result = ::dup3(oldfd, newfd, flags);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(inotify_init, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t {\n    uint64_t Result = ::inotify_init();\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(openat, [](FEXCore::Core::CpuStateFrame* Frame, int dirfs, const char* pathname, int flags, uint32_t mode) -> uint64_t {\n    flags = FEX::HLE::RemapFromX86Flags(flags);\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Openat(dirfs, pathname, flags, mode);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(readlinkat, [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, char* buf, size_t bufsiz) -> uint64_t {\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Readlinkat(dirfd, pathname, buf, bufsiz);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(faccessat, [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, int mode) -> uint64_t {\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.FAccessat(dirfd, pathname, mode);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(faccessat2, [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, int mode, int flags) -> uint64_t {\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.FAccessat2(dirfd, pathname, mode, flags);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(\n    openat2, [](FEXCore::Core::CpuStateFrame* Frame, int dirfs, const char* pathname, struct open_how* how, size_t usize) -> uint64_t {\n      open_how HostHow {};\n      size_t HostSize = std::min(sizeof(open_how), usize);\n      memcpy(&HostHow, how, HostSize);\n\n      HostHow.flags = FEX::HLE::RemapFromX86Flags(HostHow.flags);\n      uint64_t Result = FEX::HLE::_SyscallHandler->FM.Openat2(dirfs, pathname, &HostHow, HostSize);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL(eventfd, [](FEXCore::Core::CpuStateFrame* Frame, uint32_t count) -> uint64_t {\n    uint64_t Result = ::syscall(SYSCALL_DEF(eventfd2), count, 0);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(pipe2, [](FEXCore::Core::CpuStateFrame* Frame, int pipefd[2], int flags) -> uint64_t {\n    flags = FEX::HLE::RemapFromX86Flags(flags);\n    uint64_t Result = ::pipe2(pipefd, flags);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(\n    statx, [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, int flags, uint32_t mask, struct statx* statxbuf) -> uint64_t {\n      // Flags don't need remapped\n      uint64_t Result = FEX::HLE::_SyscallHandler->FM.Statx(dirfd, pathname, flags, mask, statxbuf);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL(close_range, [](FEXCore::Core::CpuStateFrame* Frame, unsigned int first, unsigned int last, unsigned int flags) -> uint64_t {\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.CloseRange(first, last, flags);\n    SYSCALL_ERRNO();\n  });\n}\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/FS.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n\n#include <FEXCore/IR/IR.h>\n\n#include <stddef.h>\n#include <stdint.h>\n#include <sys/mount.h>\n#include <sys/swap.h>\n#include <sys/syscall.h>\n#include <sys/types.h>\n#include <unistd.h>\n#include <fcntl.h>\n#include <sys/xattr.h>\n\nnamespace FEX::HLE {\nvoid RegisterFS(FEX::HLE::SyscallHandler* Handler) {\n  using namespace FEXCore::IR;\n\n  REGISTER_SYSCALL_IMPL(rename, [](FEXCore::Core::CpuStateFrame* Frame, const char* oldpath, const char* newpath) -> uint64_t {\n    uint64_t Result = ::rename(oldpath, newpath);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(mkdir, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, mode_t mode) -> uint64_t {\n    uint64_t Result = ::mkdir(pathname, mode);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(rmdir, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname) -> uint64_t {\n    uint64_t Result = ::rmdir(pathname);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(link, [](FEXCore::Core::CpuStateFrame* Frame, const char* oldpath, const char* newpath) -> uint64_t {\n    uint64_t Result = ::link(oldpath, newpath);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(unlink, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname) -> uint64_t {\n    uint64_t Result = ::unlink(pathname);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(symlink, [](FEXCore::Core::CpuStateFrame* Frame, const char* target, const char* linkpath) -> uint64_t {\n    uint64_t Result = ::symlink(target, linkpath);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(readlink, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, char* buf, size_t bufsiz) -> uint64_t {\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Readlink(pathname, buf, bufsiz);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(chmod, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, mode_t mode) -> uint64_t {\n    uint64_t Result = ::chmod(pathname, mode);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(mknod, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, mode_t mode, dev_t dev) -> uint64_t {\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Mknod(pathname, mode, dev);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(creat, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, mode_t mode) -> uint64_t {\n    uint64_t Result = ::creat(pathname, mode);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(\n    setxattr, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, const char* name, const void* value, size_t size, int flags) -> uint64_t {\n      uint64_t Result = FEX::HLE::_SyscallHandler->FM.Setxattr(path, name, value, size, flags);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL(\n    lsetxattr, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, const char* name, const void* value, size_t size, int flags) -> uint64_t {\n      uint64_t Result = FEX::HLE::_SyscallHandler->FM.LSetxattr(path, name, value, size, flags);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL(getxattr, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, const char* name, void* value, size_t size) -> uint64_t {\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Getxattr(path, name, value, size);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(lgetxattr, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, const char* name, void* value, size_t size) -> uint64_t {\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.LGetxattr(path, name, value, size);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(listxattr, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, char* list, size_t size) -> uint64_t {\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Listxattr(path, list, size);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(llistxattr, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, char* list, size_t size) -> uint64_t {\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.LListxattr(path, list, size);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(removexattr, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, const char* name) -> uint64_t {\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Removexattr(path, name);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(lremovexattr, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, const char* name) -> uint64_t {\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.LRemovexattr(path, name);\n    SYSCALL_ERRNO();\n  });\n  if (Handler->IsHostKernelVersionAtLeast(6, 13, 0)) {\n    REGISTER_SYSCALL_IMPL(setxattrat,\n                          [](FEXCore::Core::CpuStateFrame* Frame, int dfd, const char* pathname, uint32_t at_flags, const char* name,\n                             const FileManager::xattr_args* uargs, size_t usize) -> uint64_t {\n                            uint64_t Result = FEX::HLE::_SyscallHandler->FM.SetxattrAt(dfd, pathname, at_flags, name, uargs, usize);\n                            SYSCALL_ERRNO();\n                          });\n    REGISTER_SYSCALL_IMPL(getxattrat,\n                          [](FEXCore::Core::CpuStateFrame* Frame, int dfd, const char* pathname, uint32_t at_flags, const char* name,\n                             const FileManager::xattr_args* uargs, size_t usize) -> uint64_t {\n                            uint64_t Result = FEX::HLE::_SyscallHandler->FM.GetxattrAt(dfd, pathname, at_flags, name, uargs, usize);\n                            SYSCALL_ERRNO();\n                          });\n\n    REGISTER_SYSCALL_IMPL(\n      listxattrat, [](FEXCore::Core::CpuStateFrame* Frame, int dfd, const char* pathname, uint32_t at_flags, char* list, size_t size) -> uint64_t {\n        uint64_t Result = FEX::HLE::_SyscallHandler->FM.ListxattrAt(dfd, pathname, at_flags, list, size);\n        SYSCALL_ERRNO();\n      });\n    REGISTER_SYSCALL_IMPL(\n      removexattrat, [](FEXCore::Core::CpuStateFrame* Frame, int dfd, const char* pathname, uint32_t at_flags, const char* name) -> uint64_t {\n        uint64_t Result = FEX::HLE::_SyscallHandler->FM.RemovexattrAt(dfd, pathname, at_flags, name);\n        SYSCALL_ERRNO();\n      });\n  } else {\n    REGISTER_SYSCALL_IMPL(setxattrat, UnimplementedSyscallSafe);\n    REGISTER_SYSCALL_IMPL(getxattrat, UnimplementedSyscallSafe);\n    REGISTER_SYSCALL_IMPL(listxattrat, UnimplementedSyscallSafe);\n    REGISTER_SYSCALL_IMPL(removexattrat, UnimplementedSyscallSafe);\n  }\n}\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/IO.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n\n#include <FEXCore/IR/IR.h>\n\n#include <linux/aio_abi.h>\n#include <sys/syscall.h>\n#include <unistd.h>\n\nnamespace FEX::HLE {\nvoid RegisterIO(FEX::HLE::SyscallHandler* Handler) {\n  using namespace FEXCore::IR;\n\n  REGISTER_SYSCALL_IMPL(iopl, [](FEXCore::Core::CpuStateFrame* Frame, int level) -> uint64_t {\n    // Just claim we don't have permission\n    return -EPERM;\n  });\n\n  REGISTER_SYSCALL_IMPL(ioperm, [](FEXCore::Core::CpuStateFrame* Frame, unsigned long from, unsigned long num, int turn_on) -> uint64_t {\n    // ioperm not available on our architecture\n    return -EPERM;\n  });\n}\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Info.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/Utils/LogManager.h>\n\n#include <cstring>\n#include <linux/kcmp.h>\n#include <linux/seccomp.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <syslog.h>\n#include <sys/random.h>\n#include <sys/resource.h>\n#include <sys/syscall.h>\n#include <sys/utsname.h>\n#include <sys/klog.h>\n#include <sys/personality.h>\n#include <sys/ptrace.h>\n#include <unistd.h>\n\n#include <git_version.h>\n\nnamespace FEX::HLE {\nusing cap_user_header_t = void*;\nusing cap_user_data_t = void*;\n\nvoid RegisterInfo(FEX::HLE::SyscallHandler* Handler) {\n  using namespace FEXCore::IR;\n\n  REGISTER_SYSCALL_IMPL(uname, [](FEXCore::Core::CpuStateFrame* Frame, struct utsname* buf) -> uint64_t {\n    auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n\n    struct utsname Local {};\n    if (::uname(&Local) == 0) {\n      memcpy(buf->nodename, Local.nodename, sizeof(Local.nodename));\n      static_assert(sizeof(Local.nodename) <= sizeof(buf->nodename));\n      memcpy(buf->domainname, Local.domainname, sizeof(Local.domainname));\n      static_assert(sizeof(Local.domainname) <= sizeof(buf->domainname));\n    } else {\n      strcpy(buf->nodename, \"FEXCore\");\n      LogMan::Msg::EFmt(\"Couldn't determine host nodename. Defaulting to '{}'\", buf->nodename);\n    }\n    strcpy(buf->sysname, \"Linux\");\n    uint32_t GuestVersion = FEX::HLE::_SyscallHandler->GetGuestKernelVersion();\n    if (Thread->persona & UNAME26) {\n      // Kernel version converts from 6.x.y to 2.6.60+x.\n      GuestVersion = FEX::HLE::SyscallHandler::KernelVersion(2, 6, 60 + FEX::HLE::SyscallHandler::KernelMinor(GuestVersion));\n    }\n    snprintf(buf->release, sizeof(buf->release), \"%d.%d.%d\", FEX::HLE::SyscallHandler::KernelMajor(GuestVersion),\n             FEX::HLE::SyscallHandler::KernelMinor(GuestVersion), FEX::HLE::SyscallHandler::KernelPatch(GuestVersion));\n\n    const char version[] = \"#\" GIT_DESCRIBE_STRING \" SMP \" __DATE__ \" \" __TIME__;\n    strcpy(buf->version, version);\n    static_assert(sizeof(version) <= sizeof(buf->version), \"uname version define became too large!\");\n    if (Thread->persona & PER_LINUX32) {\n      // Tell the guest that we are a 32bit kernel\n      strcpy(buf->machine, \"i686\");\n    } else {\n      // Tell the guest that we are a 64bit kernel\n      strcpy(buf->machine, \"x86_64\");\n    }\n    return 0;\n  });\n\n  REGISTER_SYSCALL_IMPL(personality, [](FEXCore::Core::CpuStateFrame* Frame, uint32_t persona) -> uint64_t {\n    auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n\n    if (persona == ~0U) {\n      // Special case, only queries the persona.\n      return Thread->persona;\n    }\n\n    // Mask off `PER_LINUX32` because AArch64 doesn't support it.\n    uint32_t NewPersona = persona & ~PER_LINUX32;\n\n    // This syscall can not physically fail with PER_LINUX32 masked off.\n    // It also can not fail on a real x86 kernel.\n    (void)::syscall(SYSCALL_DEF(personality), NewPersona);\n\n    // Return the old persona while setting the new one.\n    auto OldPersona = Thread->persona;\n    Thread->persona = persona;\n    return OldPersona;\n  });\n\n  REGISTER_SYSCALL_IMPL(seccomp, [](FEXCore::Core::CpuStateFrame* Frame, unsigned int operation, unsigned int flags, void* args) -> uint64_t {\n    return FEX::HLE::_SyscallHandler->SeccompEmulator.Handle(Frame, operation, flags, args);\n  });\n  REGISTER_SYSCALL_IMPL(\n    ptrace, [](FEXCore::Core::CpuStateFrame* Frame, int /*enum __ptrace_request*/ request, pid_t pid, void* addr, void* data) -> uint64_t {\n      uint64_t Result {};\n\n      switch (request) {\n      case PTRACE_PEEKTEXT:\n      case PTRACE_PEEKDATA:\n      case PTRACE_POKETEXT:\n      case PTRACE_POKEDATA:\n      case PTRACE_ATTACH:\n      case PTRACE_DETACH:\n        // Passthrough these requests. Allows Wine to run the Ubisoft launcher.\n        Result = ::syscall(SYSCALL_DEF(ptrace), request, pid, addr, data);\n        SYSCALL_ERRNO();\n      default: break;\n      }\n      // We don't support this\n      return -EPERM;\n    });\n}\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Memory.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/IR/IR.h>\n\n#include <stddef.h>\n#include <stdint.h>\n#include <sys/mman.h>\n#include <sys/syscall.h>\n#include <unistd.h>\n\nnamespace FEX::HLE {\nvoid RegisterMemory(FEX::HLE::SyscallHandler* Handler) {\n  using namespace FEXCore::IR;\n\n  REGISTER_SYSCALL_IMPL(brk, [](FEXCore::Core::CpuStateFrame* Frame, void* addr) -> uint64_t {\n    uint64_t Result = FEX::HLE::_SyscallHandler->HandleBRK(Frame, addr);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(madvise, [](FEXCore::Core::CpuStateFrame* Frame, void* addr, size_t length, int32_t advice) -> uint64_t {\n    uint64_t Result = ::madvise(addr, length, advice);\n\n    if (Result != -1) {\n      FEX::HLE::_SyscallHandler->TrackMadvise(Frame->Thread, (uintptr_t)addr, length, advice);\n    }\n    SYSCALL_ERRNO();\n  });\n}\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/NotImplemented.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#include <FEXCore/Utils/LogManager.h>\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n\n#include <stdint.h>\n#include <sys/epoll.h>\n\n#define REGISTER_SYSCALL_NOT_IMPL(name)                                             \\\n  REGISTER_SYSCALL_IMPL(name, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { \\\n    LogMan::Msg::DFmt(\"Using deprecated/removed syscall: \" #name);                  \\\n    return -ENOSYS;                                                                 \\\n  });\n\n#define REGISTER_SYSCALL_NO_PERM(name) REGISTER_SYSCALL_IMPL(name, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { return -EPERM; });\n\n#define REGISTER_SYSCALL_NO_ACCESS(name) \\\n  REGISTER_SYSCALL_IMPL(name, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { return -EACCES; });\n\nnamespace FEX::HLE {\n// these are removed/not implemented in the linux kernel we present\n\nvoid RegisterNotImplemented(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_NOT_IMPL(ustat);\n  REGISTER_SYSCALL_NOT_IMPL(sysfs);\n  REGISTER_SYSCALL_NOT_IMPL(uselib);\n  REGISTER_SYSCALL_NOT_IMPL(create_module);\n  REGISTER_SYSCALL_NOT_IMPL(get_kernel_syms);\n  REGISTER_SYSCALL_NOT_IMPL(query_module);\n  REGISTER_SYSCALL_NOT_IMPL(nfsservctl); // Was removed in Linux 3.1\n  REGISTER_SYSCALL_NOT_IMPL(getpmsg);\n  REGISTER_SYSCALL_NOT_IMPL(putpmsg);\n  REGISTER_SYSCALL_NOT_IMPL(afs_syscall);\n  REGISTER_SYSCALL_NOT_IMPL(vserver);\n  REGISTER_SYSCALL_NOT_IMPL(_sysctl); // Was removed in Linux 5.5\n\n  REGISTER_SYSCALL_NO_PERM(vhangup);\n  REGISTER_SYSCALL_NO_PERM(reboot)\n  REGISTER_SYSCALL_NO_PERM(sethostname);\n  REGISTER_SYSCALL_NO_PERM(setdomainname);\n  REGISTER_SYSCALL_NO_PERM(kexec_load);\n  REGISTER_SYSCALL_NO_PERM(finit_module);\n  REGISTER_SYSCALL_NO_PERM(bpf);\n  REGISTER_SYSCALL_NO_PERM(lookup_dcookie);\n  REGISTER_SYSCALL_NO_PERM(init_module)\n  REGISTER_SYSCALL_NO_PERM(delete_module);\n  REGISTER_SYSCALL_NO_PERM(quotactl);\n  REGISTER_SYSCALL_NO_ACCESS(perf_event_open);\n}\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Passthrough.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\nmeta: LinuxSyscalls|syscalls-shared ~ Syscall implementations shared between x86 and x86-64\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n\n#include <FEXCore/IR/IR.h>\n\n#include <stdint.h>\n#include <sys/epoll.h>\n\nnamespace FEX::HLE {\n#ifdef ARCHITECTURE_arm64\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough0(FEXCore::Core::CpuStateFrame* Frame) {\n  register uint64_t x0 asm(\"x0\");\n  register int x8 asm(\"x8\") = syscall_num;\n  __asm volatile(R\"(\n    svc #0;\n  )\"\n                 : \"=r\"(x0)\n                 : \"r\"(x8)\n                 : \"memory\");\n  return x0;\n}\n\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough1(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1) {\n  register uint64_t x0 asm(\"x0\") = arg1;\n  register int x8 asm(\"x8\") = syscall_num;\n  __asm volatile(R\"(\n    svc #0;\n  )\"\n                 : \"=r\"(x0)\n                 : \"r\"(x8), \"r\"(x0)\n                 : \"memory\");\n  return x0;\n}\n\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough2(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2) {\n  register uint64_t x0 asm(\"x0\") = arg1;\n  register uint64_t x1 asm(\"x1\") = arg2;\n  register int x8 asm(\"x8\") = syscall_num;\n  __asm volatile(R\"(\n    svc #0;\n  )\"\n                 : \"=r\"(x0)\n                 : \"r\"(x8), \"r\"(x0), \"r\"(x1)\n                 : \"memory\");\n  return x0;\n}\n\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough3(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3) {\n  register uint64_t x0 asm(\"x0\") = arg1;\n  register uint64_t x1 asm(\"x1\") = arg2;\n  register uint64_t x2 asm(\"x2\") = arg3;\n  register int x8 asm(\"x8\") = syscall_num;\n  __asm volatile(R\"(\n    svc #0;\n  )\"\n                 : \"=r\"(x0)\n                 : \"r\"(x8), \"r\"(x0), \"r\"(x1), \"r\"(x2)\n                 : \"memory\");\n  return x0;\n}\n\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough4(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4) {\n  register uint64_t x0 asm(\"x0\") = arg1;\n  register uint64_t x1 asm(\"x1\") = arg2;\n  register uint64_t x2 asm(\"x2\") = arg3;\n  register uint64_t x3 asm(\"x3\") = arg4;\n  register int x8 asm(\"x8\") = syscall_num;\n  __asm volatile(R\"(\n    svc #0;\n  )\"\n                 : \"=r\"(x0)\n                 : \"r\"(x8), \"r\"(x0), \"r\"(x1), \"r\"(x2), \"r\"(x3)\n                 : \"memory\");\n  return x0;\n}\n\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough5(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5) {\n  register uint64_t x0 asm(\"x0\") = arg1;\n  register uint64_t x1 asm(\"x1\") = arg2;\n  register uint64_t x2 asm(\"x2\") = arg3;\n  register uint64_t x3 asm(\"x3\") = arg4;\n  register uint64_t x4 asm(\"x4\") = arg5;\n  register int x8 asm(\"x8\") = syscall_num;\n  __asm volatile(R\"(\n    svc #0;\n  )\"\n                 : \"=r\"(x0)\n                 : \"r\"(x8), \"r\"(x0), \"r\"(x1), \"r\"(x2), \"r\"(x3), \"r\"(x4)\n                 : \"memory\");\n  return x0;\n}\n\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough6(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5,\n                             uint64_t arg6) {\n  register uint64_t x0 asm(\"x0\") = arg1;\n  register uint64_t x1 asm(\"x1\") = arg2;\n  register uint64_t x2 asm(\"x2\") = arg3;\n  register uint64_t x3 asm(\"x3\") = arg4;\n  register uint64_t x4 asm(\"x4\") = arg5;\n  register uint64_t x5 asm(\"x5\") = arg6;\n  register int x8 asm(\"x8\") = syscall_num;\n  __asm volatile(R\"(\n    svc #0;\n  )\"\n                 : \"=r\"(x0)\n                 : \"r\"(x8), \"r\"(x0), \"r\"(x1), \"r\"(x2), \"r\"(x3), \"r\"(x4), \"r\"(x5)\n                 : \"memory\");\n  return x0;\n}\n\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough7(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5,\n                             uint64_t arg6, uint64_t arg7) {\n  register uint64_t x0 asm(\"x0\") = arg1;\n  register uint64_t x1 asm(\"x1\") = arg2;\n  register uint64_t x2 asm(\"x2\") = arg3;\n  register uint64_t x3 asm(\"x3\") = arg4;\n  register uint64_t x4 asm(\"x4\") = arg5;\n  register uint64_t x5 asm(\"x5\") = arg6;\n  register uint64_t x6 asm(\"x6\") = arg7;\n  register int x8 asm(\"x8\") = syscall_num;\n  __asm volatile(R\"(\n    svc #0;\n  )\"\n                 : \"=r\"(x0)\n                 : \"r\"(x8), \"r\"(x0), \"r\"(x1), \"r\"(x2), \"r\"(x3), \"r\"(x4), \"r\"(x5), \"r\"(x6)\n                 : \"memory\");\n  return x0;\n}\n#else\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough0(FEXCore::Core::CpuStateFrame* Frame) {\n  uint64_t Result = ::syscall(syscall_num);\n  SYSCALL_ERRNO();\n}\n\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough1(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1) {\n  uint64_t Result = ::syscall(syscall_num, arg1);\n  SYSCALL_ERRNO();\n}\n\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough2(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2) {\n  uint64_t Result = ::syscall(syscall_num, arg1, arg2);\n  SYSCALL_ERRNO();\n}\n\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough3(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3) {\n  uint64_t Result = ::syscall(syscall_num, arg1, arg2, arg3);\n  SYSCALL_ERRNO();\n}\n\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough4(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4) {\n  uint64_t Result = ::syscall(syscall_num, arg1, arg2, arg3, arg4);\n  SYSCALL_ERRNO();\n}\n\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough5(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5) {\n  uint64_t Result = ::syscall(syscall_num, arg1, arg2, arg3, arg4, arg5);\n  SYSCALL_ERRNO();\n}\n\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough6(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5,\n                             uint64_t arg6) {\n  uint64_t Result = ::syscall(syscall_num, arg1, arg2, arg3, arg4, arg5, arg6);\n  SYSCALL_ERRNO();\n}\n\ntemplate<int syscall_num>\nrequires (syscall_num != -1)\nuint64_t SyscallPassthrough7(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5,\n                             uint64_t arg6, uint64_t arg7) {\n  uint64_t Result = ::syscall(syscall_num, arg1, arg2, arg3, arg4, arg5, arg6, arg7);\n  SYSCALL_ERRNO();\n}\n#endif\n\nvoid RegisterCommon(FEX::HLE::SyscallHandler* Handler) {\n  using namespace FEXCore::IR;\n  REGISTER_SYSCALL_IMPL(read, SyscallPassthrough3<SYSCALL_DEF(read)>);\n  REGISTER_SYSCALL_IMPL(write, SyscallPassthrough3<SYSCALL_DEF(write)>);\n  REGISTER_SYSCALL_IMPL(lseek, SyscallPassthrough3<SYSCALL_DEF(lseek)>);\n  REGISTER_SYSCALL_IMPL(sched_yield, SyscallPassthrough0<SYSCALL_DEF(sched_yield)>);\n  REGISTER_SYSCALL_IMPL(msync, SyscallPassthrough3<SYSCALL_DEF(msync)>);\n  REGISTER_SYSCALL_IMPL(mincore, SyscallPassthrough3<SYSCALL_DEF(mincore)>);\n  REGISTER_SYSCALL_IMPL(shmget, SyscallPassthrough3<SYSCALL_DEF(shmget)>);\n  REGISTER_SYSCALL_IMPL(shmctl, SyscallPassthrough3<SYSCALL_DEF(shmctl)>);\n  REGISTER_SYSCALL_IMPL(getpid, SyscallPassthrough0<SYSCALL_DEF(getpid)>);\n  REGISTER_SYSCALL_IMPL(socket, SyscallPassthrough3<SYSCALL_DEF(socket)>);\n  REGISTER_SYSCALL_IMPL(connect, SyscallPassthrough3<SYSCALL_DEF(connect)>);\n  REGISTER_SYSCALL_IMPL(sendto, SyscallPassthrough6<SYSCALL_DEF(sendto)>);\n  REGISTER_SYSCALL_IMPL(recvfrom, SyscallPassthrough6<SYSCALL_DEF(recvfrom)>);\n  REGISTER_SYSCALL_IMPL(shutdown, SyscallPassthrough2<SYSCALL_DEF(shutdown)>);\n  REGISTER_SYSCALL_IMPL(bind, SyscallPassthrough3<SYSCALL_DEF(bind)>);\n  REGISTER_SYSCALL_IMPL(listen, SyscallPassthrough2<SYSCALL_DEF(listen)>);\n  REGISTER_SYSCALL_IMPL(getsockname, SyscallPassthrough3<SYSCALL_DEF(getsockname)>);\n  REGISTER_SYSCALL_IMPL(getpeername, SyscallPassthrough3<SYSCALL_DEF(getpeername)>);\n  REGISTER_SYSCALL_IMPL(socketpair, SyscallPassthrough4<SYSCALL_DEF(socketpair)>);\n  REGISTER_SYSCALL_IMPL(kill, SyscallPassthrough2<SYSCALL_DEF(kill)>);\n  REGISTER_SYSCALL_IMPL(semget, SyscallPassthrough3<SYSCALL_DEF(semget)>);\n  REGISTER_SYSCALL_IMPL(msgget, SyscallPassthrough2<SYSCALL_DEF(msgget)>);\n  REGISTER_SYSCALL_IMPL(msgsnd, SyscallPassthrough4<SYSCALL_DEF(msgsnd)>);\n  REGISTER_SYSCALL_IMPL(msgrcv, SyscallPassthrough5<SYSCALL_DEF(msgrcv)>);\n  REGISTER_SYSCALL_IMPL(msgctl, SyscallPassthrough3<SYSCALL_DEF(msgctl)>);\n  REGISTER_SYSCALL_IMPL(flock, SyscallPassthrough2<SYSCALL_DEF(flock)>);\n  REGISTER_SYSCALL_IMPL(fsync, SyscallPassthrough1<SYSCALL_DEF(fsync)>);\n  REGISTER_SYSCALL_IMPL(fdatasync, SyscallPassthrough1<SYSCALL_DEF(fdatasync)>);\n  REGISTER_SYSCALL_IMPL(truncate, SyscallPassthrough2<SYSCALL_DEF(truncate)>);\n  REGISTER_SYSCALL_IMPL(getcwd, SyscallPassthrough2<SYSCALL_DEF(getcwd)>);\n  REGISTER_SYSCALL_IMPL(chdir, SyscallPassthrough1<SYSCALL_DEF(chdir)>);\n  REGISTER_SYSCALL_IMPL(fchdir, SyscallPassthrough1<SYSCALL_DEF(fchdir)>);\n  REGISTER_SYSCALL_IMPL(fchmod, SyscallPassthrough2<SYSCALL_DEF(fchmod)>);\n  REGISTER_SYSCALL_IMPL(fchown, SyscallPassthrough3<SYSCALL_DEF(fchown)>);\n  REGISTER_SYSCALL_IMPL(umask, SyscallPassthrough1<SYSCALL_DEF(umask)>);\n  REGISTER_SYSCALL_IMPL(getuid, SyscallPassthrough0<SYSCALL_DEF(getuid)>);\n  REGISTER_SYSCALL_IMPL(syslog, SyscallPassthrough3<SYSCALL_DEF(syslog)>);\n  REGISTER_SYSCALL_IMPL(getgid, SyscallPassthrough0<SYSCALL_DEF(getgid)>);\n  REGISTER_SYSCALL_IMPL(setuid, SyscallPassthrough1<SYSCALL_DEF(setuid)>);\n  REGISTER_SYSCALL_IMPL(setgid, SyscallPassthrough1<SYSCALL_DEF(setgid)>);\n  REGISTER_SYSCALL_IMPL(geteuid, SyscallPassthrough0<SYSCALL_DEF(geteuid)>);\n  REGISTER_SYSCALL_IMPL(getegid, SyscallPassthrough0<SYSCALL_DEF(getegid)>);\n  REGISTER_SYSCALL_IMPL(setpgid, SyscallPassthrough2<SYSCALL_DEF(setpgid)>);\n  REGISTER_SYSCALL_IMPL(getppid, SyscallPassthrough0<SYSCALL_DEF(getppid)>);\n  REGISTER_SYSCALL_IMPL(setsid, SyscallPassthrough0<SYSCALL_DEF(setsid)>);\n  REGISTER_SYSCALL_IMPL(setreuid, SyscallPassthrough2<SYSCALL_DEF(setreuid)>);\n  REGISTER_SYSCALL_IMPL(setregid, SyscallPassthrough2<SYSCALL_DEF(setregid)>);\n  REGISTER_SYSCALL_IMPL(getgroups, SyscallPassthrough2<SYSCALL_DEF(getgroups)>);\n  REGISTER_SYSCALL_IMPL(setgroups, SyscallPassthrough2<SYSCALL_DEF(setgroups)>);\n  REGISTER_SYSCALL_IMPL(setresuid, SyscallPassthrough3<SYSCALL_DEF(setresuid)>);\n  REGISTER_SYSCALL_IMPL(getresuid, SyscallPassthrough3<SYSCALL_DEF(getresuid)>);\n  REGISTER_SYSCALL_IMPL(setresgid, SyscallPassthrough3<SYSCALL_DEF(setresgid)>);\n  REGISTER_SYSCALL_IMPL(getresgid, SyscallPassthrough3<SYSCALL_DEF(getresgid)>);\n  REGISTER_SYSCALL_IMPL(getpgid, SyscallPassthrough1<SYSCALL_DEF(getpgid)>);\n  REGISTER_SYSCALL_IMPL(setfsuid, SyscallPassthrough1<SYSCALL_DEF(setfsuid)>);\n  REGISTER_SYSCALL_IMPL(setfsgid, SyscallPassthrough1<SYSCALL_DEF(setfsgid)>);\n  REGISTER_SYSCALL_IMPL(getsid, SyscallPassthrough1<SYSCALL_DEF(getsid)>);\n  REGISTER_SYSCALL_IMPL(capget, SyscallPassthrough2<SYSCALL_DEF(capget)>);\n  REGISTER_SYSCALL_IMPL(capset, SyscallPassthrough2<SYSCALL_DEF(capset)>);\n  REGISTER_SYSCALL_IMPL(getpriority, SyscallPassthrough2<SYSCALL_DEF(getpriority)>);\n  REGISTER_SYSCALL_IMPL(setpriority, SyscallPassthrough3<SYSCALL_DEF(setpriority)>);\n  REGISTER_SYSCALL_IMPL(sched_setparam, SyscallPassthrough2<SYSCALL_DEF(sched_setparam)>);\n  REGISTER_SYSCALL_IMPL(sched_getparam, SyscallPassthrough2<SYSCALL_DEF(sched_getparam)>);\n  REGISTER_SYSCALL_IMPL(sched_setscheduler, SyscallPassthrough3<SYSCALL_DEF(sched_setscheduler)>);\n  REGISTER_SYSCALL_IMPL(sched_getscheduler, SyscallPassthrough1<SYSCALL_DEF(sched_getscheduler)>);\n  REGISTER_SYSCALL_IMPL(sched_get_priority_max, SyscallPassthrough1<SYSCALL_DEF(sched_get_priority_max)>);\n  REGISTER_SYSCALL_IMPL(sched_get_priority_min, SyscallPassthrough1<SYSCALL_DEF(sched_get_priority_min)>);\n  REGISTER_SYSCALL_IMPL(mlock, SyscallPassthrough2<SYSCALL_DEF(mlock)>);\n  REGISTER_SYSCALL_IMPL(munlock, SyscallPassthrough2<SYSCALL_DEF(munlock)>);\n  REGISTER_SYSCALL_IMPL(pivot_root, SyscallPassthrough2<SYSCALL_DEF(pivot_root)>);\n  REGISTER_SYSCALL_IMPL(chroot, SyscallPassthrough1<SYSCALL_DEF(chroot)>);\n  REGISTER_SYSCALL_IMPL(sync, SyscallPassthrough0<SYSCALL_DEF(sync)>);\n  REGISTER_SYSCALL_IMPL(acct, SyscallPassthrough1<SYSCALL_DEF(acct)>);\n  REGISTER_SYSCALL_IMPL(mount, SyscallPassthrough5<SYSCALL_DEF(mount)>);\n  REGISTER_SYSCALL_IMPL(umount2, SyscallPassthrough2<SYSCALL_DEF(umount2)>);\n  REGISTER_SYSCALL_IMPL(swapon, SyscallPassthrough2<SYSCALL_DEF(swapon)>);\n  REGISTER_SYSCALL_IMPL(swapoff, SyscallPassthrough1<SYSCALL_DEF(swapoff)>);\n  REGISTER_SYSCALL_IMPL(gettid, SyscallPassthrough0<SYSCALL_DEF(gettid)>);\n  REGISTER_SYSCALL_IMPL(fsetxattr, SyscallPassthrough5<SYSCALL_DEF(fsetxattr)>);\n  REGISTER_SYSCALL_IMPL(fgetxattr, SyscallPassthrough4<SYSCALL_DEF(fgetxattr)>);\n  REGISTER_SYSCALL_IMPL(flistxattr, SyscallPassthrough3<SYSCALL_DEF(flistxattr)>);\n  REGISTER_SYSCALL_IMPL(fremovexattr, SyscallPassthrough2<SYSCALL_DEF(fremovexattr)>);\n  REGISTER_SYSCALL_IMPL(tkill, SyscallPassthrough2<SYSCALL_DEF(tkill)>);\n  REGISTER_SYSCALL_IMPL(sched_setaffinity, SyscallPassthrough3<SYSCALL_DEF(sched_setaffinity)>);\n  REGISTER_SYSCALL_IMPL(sched_getaffinity, SyscallPassthrough3<SYSCALL_DEF(sched_getaffinity)>);\n  REGISTER_SYSCALL_IMPL(io_setup, SyscallPassthrough2<SYSCALL_DEF(io_setup)>);\n  REGISTER_SYSCALL_IMPL(io_destroy, SyscallPassthrough1<SYSCALL_DEF(io_destroy)>);\n  REGISTER_SYSCALL_IMPL(io_submit, SyscallPassthrough3<SYSCALL_DEF(io_submit)>);\n  REGISTER_SYSCALL_IMPL(io_cancel, SyscallPassthrough3<SYSCALL_DEF(io_cancel)>);\n  REGISTER_SYSCALL_IMPL(remap_file_pages, SyscallPassthrough5<SYSCALL_DEF(remap_file_pages)>);\n  REGISTER_SYSCALL_IMPL(timer_getoverrun, SyscallPassthrough1<SYSCALL_DEF(timer_getoverrun)>);\n  REGISTER_SYSCALL_IMPL(timer_delete, SyscallPassthrough1<SYSCALL_DEF(timer_delete)>);\n  REGISTER_SYSCALL_IMPL(tgkill, SyscallPassthrough3<SYSCALL_DEF(tgkill)>);\n  REGISTER_SYSCALL_IMPL(mbind, SyscallPassthrough6<SYSCALL_DEF(mbind)>);\n  REGISTER_SYSCALL_IMPL(set_mempolicy, SyscallPassthrough3<SYSCALL_DEF(set_mempolicy)>);\n  REGISTER_SYSCALL_IMPL(get_mempolicy, SyscallPassthrough5<SYSCALL_DEF(get_mempolicy)>);\n  REGISTER_SYSCALL_IMPL(mq_unlink, SyscallPassthrough1<SYSCALL_DEF(mq_unlink)>);\n  REGISTER_SYSCALL_IMPL(add_key, SyscallPassthrough5<SYSCALL_DEF(add_key)>);\n  REGISTER_SYSCALL_IMPL(request_key, SyscallPassthrough4<SYSCALL_DEF(request_key)>);\n  REGISTER_SYSCALL_IMPL(keyctl, SyscallPassthrough5<SYSCALL_DEF(keyctl)>);\n  REGISTER_SYSCALL_IMPL(ioprio_set, SyscallPassthrough2<SYSCALL_DEF(ioprio_set)>);\n  REGISTER_SYSCALL_IMPL(ioprio_get, SyscallPassthrough3<SYSCALL_DEF(ioprio_get)>);\n  REGISTER_SYSCALL_IMPL(inotify_add_watch, SyscallPassthrough3<SYSCALL_DEF(inotify_add_watch)>);\n  REGISTER_SYSCALL_IMPL(inotify_rm_watch, SyscallPassthrough2<SYSCALL_DEF(inotify_rm_watch)>);\n  REGISTER_SYSCALL_IMPL(migrate_pages, SyscallPassthrough4<SYSCALL_DEF(migrate_pages)>);\n  REGISTER_SYSCALL_IMPL(mkdirat, SyscallPassthrough3<SYSCALL_DEF(mkdirat)>);\n  REGISTER_SYSCALL_IMPL(mknodat, SyscallPassthrough4<SYSCALL_DEF(mknodat)>);\n  REGISTER_SYSCALL_IMPL(fchownat, SyscallPassthrough5<SYSCALL_DEF(fchownat)>);\n  REGISTER_SYSCALL_IMPL(unlinkat, SyscallPassthrough3<SYSCALL_DEF(unlinkat)>);\n  REGISTER_SYSCALL_IMPL(renameat, SyscallPassthrough4<SYSCALL_DEF(renameat)>);\n  REGISTER_SYSCALL_IMPL(linkat, SyscallPassthrough5<SYSCALL_DEF(linkat)>);\n  REGISTER_SYSCALL_IMPL(symlinkat, SyscallPassthrough3<SYSCALL_DEF(symlinkat)>);\n  REGISTER_SYSCALL_IMPL(fchmodat, SyscallPassthrough3<SYSCALL_DEF(fchmodat)>);\n  REGISTER_SYSCALL_IMPL(unshare, SyscallPassthrough1<SYSCALL_DEF(unshare)>);\n  REGISTER_SYSCALL_IMPL(splice, SyscallPassthrough6<SYSCALL_DEF(splice)>);\n  REGISTER_SYSCALL_IMPL(tee, SyscallPassthrough4<SYSCALL_DEF(tee)>);\n  REGISTER_SYSCALL_IMPL(move_pages, SyscallPassthrough6<SYSCALL_DEF(move_pages)>);\n  REGISTER_SYSCALL_IMPL(timerfd_create, SyscallPassthrough2<SYSCALL_DEF(timerfd_create)>);\n  REGISTER_SYSCALL_IMPL(accept4, SyscallPassthrough4<SYSCALL_DEF(accept4)>);\n  REGISTER_SYSCALL_IMPL(eventfd2, SyscallPassthrough2<SYSCALL_DEF(eventfd2)>);\n  REGISTER_SYSCALL_IMPL(epoll_create1, SyscallPassthrough1<SYSCALL_DEF(epoll_create1)>);\n  REGISTER_SYSCALL_IMPL(inotify_init1, SyscallPassthrough1<SYSCALL_DEF(inotify_init1)>);\n  REGISTER_SYSCALL_IMPL(fanotify_init, SyscallPassthrough2<SYSCALL_DEF(fanotify_init)>);\n  REGISTER_SYSCALL_IMPL(fanotify_mark, SyscallPassthrough5<SYSCALL_DEF(fanotify_mark)>);\n  REGISTER_SYSCALL_IMPL(prlimit_64, SyscallPassthrough4<SYSCALL_DEF(prlimit_64)>);\n  REGISTER_SYSCALL_IMPL(name_to_handle_at, SyscallPassthrough5<SYSCALL_DEF(name_to_handle_at)>);\n  REGISTER_SYSCALL_IMPL(open_by_handle_at, SyscallPassthrough3<SYSCALL_DEF(open_by_handle_at)>);\n  REGISTER_SYSCALL_IMPL(syncfs, SyscallPassthrough1<SYSCALL_DEF(syncfs)>);\n  REGISTER_SYSCALL_IMPL(setns, SyscallPassthrough2<SYSCALL_DEF(setns)>);\n  REGISTER_SYSCALL_IMPL(getcpu, SyscallPassthrough3<SYSCALL_DEF(getcpu)>);\n  REGISTER_SYSCALL_IMPL(kcmp, SyscallPassthrough5<SYSCALL_DEF(kcmp)>);\n  REGISTER_SYSCALL_IMPL(sched_setattr, SyscallPassthrough3<SYSCALL_DEF(sched_setattr)>);\n  REGISTER_SYSCALL_IMPL(sched_getattr, SyscallPassthrough4<SYSCALL_DEF(sched_getattr)>);\n  REGISTER_SYSCALL_IMPL(renameat2, SyscallPassthrough5<SYSCALL_DEF(renameat2)>);\n  REGISTER_SYSCALL_IMPL(getrandom, SyscallPassthrough3<SYSCALL_DEF(getrandom)>);\n  REGISTER_SYSCALL_IMPL(memfd_create, SyscallPassthrough2<SYSCALL_DEF(memfd_create)>);\n  REGISTER_SYSCALL_IMPL(membarrier, SyscallPassthrough2<SYSCALL_DEF(membarrier)>);\n  REGISTER_SYSCALL_IMPL(mlock2, SyscallPassthrough3<SYSCALL_DEF(mlock2)>);\n  REGISTER_SYSCALL_IMPL(copy_file_range, SyscallPassthrough6<SYSCALL_DEF(copy_file_range)>);\n  REGISTER_SYSCALL_IMPL(pkey_mprotect, SyscallPassthrough4<SYSCALL_DEF(pkey_mprotect)>);\n  REGISTER_SYSCALL_IMPL(pkey_alloc, SyscallPassthrough2<SYSCALL_DEF(pkey_alloc)>);\n  REGISTER_SYSCALL_IMPL(pkey_free, SyscallPassthrough1<SYSCALL_DEF(pkey_free)>);\n  // io_uring can't be emulated as it can pass `epoll_event` objects around.\n  // These are 12-byte packed structs on x86/x86-64, but on other architectures are 16-byte.\n  // This means the `data` member is at offset 4 on x86, but offset 8 on other architectures, corrupting the data.\n  // The queue data is entirely user-controlled, so we can't rewrite data in any sane fashion.\n  // This is visible with `node.js` as a hang.\n  REGISTER_SYSCALL_IMPL(io_uring_setup, UnimplementedSyscallSafe);\n  REGISTER_SYSCALL_IMPL(io_uring_enter, UnimplementedSyscallSafe);\n  REGISTER_SYSCALL_IMPL(io_uring_register, UnimplementedSyscallSafe);\n  REGISTER_SYSCALL_IMPL(open_tree, SyscallPassthrough3<SYSCALL_DEF(open_tree)>);\n  REGISTER_SYSCALL_IMPL(move_mount, SyscallPassthrough5<SYSCALL_DEF(move_mount)>);\n  REGISTER_SYSCALL_IMPL(fsopen, SyscallPassthrough3<SYSCALL_DEF(fsopen)>);\n  REGISTER_SYSCALL_IMPL(fsconfig, SyscallPassthrough5<SYSCALL_DEF(fsconfig)>);\n  REGISTER_SYSCALL_IMPL(fsmount, SyscallPassthrough3<SYSCALL_DEF(fsmount)>);\n  REGISTER_SYSCALL_IMPL(fspick, SyscallPassthrough3<SYSCALL_DEF(fspick)>);\n  REGISTER_SYSCALL_IMPL(pidfd_open, SyscallPassthrough2<SYSCALL_DEF(pidfd_open)>);\n  REGISTER_SYSCALL_IMPL(pidfd_getfd, SyscallPassthrough3<SYSCALL_DEF(pidfd_getfd)>);\n  REGISTER_SYSCALL_IMPL(mount_setattr, SyscallPassthrough5<SYSCALL_DEF(mount_setattr)>);\n  REGISTER_SYSCALL_IMPL(quotactl_fd, SyscallPassthrough4<SYSCALL_DEF(quotactl_fd)>);\n  REGISTER_SYSCALL_IMPL(landlock_create_ruleset, SyscallPassthrough3<SYSCALL_DEF(landlock_create_ruleset)>);\n  REGISTER_SYSCALL_IMPL(landlock_add_rule, SyscallPassthrough4<SYSCALL_DEF(landlock_add_rule)>);\n  REGISTER_SYSCALL_IMPL(landlock_restrict_self, SyscallPassthrough2<SYSCALL_DEF(landlock_restrict_self)>);\n  REGISTER_SYSCALL_IMPL(memfd_secret, SyscallPassthrough1<SYSCALL_DEF(memfd_secret)>);\n  REGISTER_SYSCALL_IMPL(process_mrelease, SyscallPassthrough2<SYSCALL_DEF(process_mrelease)>);\n  if (Handler->IsHostKernelVersionAtLeast(5, 16, 0)) {\n    REGISTER_SYSCALL_IMPL(futex_waitv, SyscallPassthrough5<SYSCALL_DEF(futex_waitv)>);\n  } else {\n    REGISTER_SYSCALL_IMPL(futex_waitv, UnimplementedSyscallSafe);\n  }\n  if (Handler->IsHostKernelVersionAtLeast(5, 17, 0)) {\n    REGISTER_SYSCALL_IMPL(set_mempolicy_home_node, SyscallPassthrough4<SYSCALL_DEF(set_mempolicy_home_node)>);\n  } else {\n    REGISTER_SYSCALL_IMPL(set_mempolicy_home_node, UnimplementedSyscallSafe);\n  }\n\n  if (Handler->IsHostKernelVersionAtLeast(6, 8, 0)) {\n    REGISTER_SYSCALL_IMPL(futex_wake, SyscallPassthrough4<SYSCALL_DEF(futex_wake)>);\n    REGISTER_SYSCALL_IMPL(futex_wait, SyscallPassthrough6<SYSCALL_DEF(futex_wait)>);\n    REGISTER_SYSCALL_IMPL(futex_requeue, SyscallPassthrough4<SYSCALL_DEF(futex_requeue)>);\n    REGISTER_SYSCALL_IMPL(statmount, SyscallPassthrough4<SYSCALL_DEF(statmount)>);\n    REGISTER_SYSCALL_IMPL(listmount, SyscallPassthrough4<SYSCALL_DEF(listmount)>);\n    REGISTER_SYSCALL_IMPL(lsm_get_self_attr, SyscallPassthrough4<SYSCALL_DEF(lsm_get_self_attr)>);\n    REGISTER_SYSCALL_IMPL(lsm_set_self_attr, SyscallPassthrough4<SYSCALL_DEF(lsm_set_self_attr)>);\n    REGISTER_SYSCALL_IMPL(lsm_list_modules, SyscallPassthrough3<SYSCALL_DEF(lsm_list_modules)>);\n  } else {\n    REGISTER_SYSCALL_IMPL(futex_wake, UnimplementedSyscallSafe);\n    REGISTER_SYSCALL_IMPL(futex_wait, UnimplementedSyscallSafe);\n    REGISTER_SYSCALL_IMPL(futex_requeue, UnimplementedSyscallSafe);\n    REGISTER_SYSCALL_IMPL(statmount, UnimplementedSyscallSafe);\n    REGISTER_SYSCALL_IMPL(listmount, UnimplementedSyscallSafe);\n    REGISTER_SYSCALL_IMPL(lsm_get_self_attr, UnimplementedSyscallSafe);\n    REGISTER_SYSCALL_IMPL(lsm_set_self_attr, UnimplementedSyscallSafe);\n    REGISTER_SYSCALL_IMPL(lsm_list_modules, UnimplementedSyscallSafe);\n  }\n  if (Handler->IsHostKernelVersionAtLeast(6, 10, 0)) {\n    REGISTER_SYSCALL_IMPL(mseal, SyscallPassthrough3<SYSCALL_DEF(mseal)>);\n  } else {\n    REGISTER_SYSCALL_IMPL(mseal, UnimplementedSyscallSafe);\n  }\n}\n\nnamespace x64 {\n  void RegisterPassthrough(FEX::HLE::SyscallHandler* Handler) {\n    using namespace FEXCore::IR;\n    RegisterCommon(Handler);\n    REGISTER_SYSCALL_IMPL_X64(ftruncate, SyscallPassthrough2<SYSCALL_DEF(ftruncate)>);\n    REGISTER_SYSCALL_IMPL_X64(ioctl, SyscallPassthrough3<SYSCALL_DEF(ioctl)>);\n    REGISTER_SYSCALL_IMPL_X64(pread_64, SyscallPassthrough4<SYSCALL_DEF(pread_64)>);\n    REGISTER_SYSCALL_IMPL_X64(pwrite_64, SyscallPassthrough4<SYSCALL_DEF(pwrite_64)>);\n    REGISTER_SYSCALL_IMPL_X64(readv, SyscallPassthrough3<SYSCALL_DEF(readv)>);\n    REGISTER_SYSCALL_IMPL_X64(writev, SyscallPassthrough3<SYSCALL_DEF(writev)>);\n    REGISTER_SYSCALL_IMPL_X64(dup, SyscallPassthrough1<SYSCALL_DEF(dup)>);\n    REGISTER_SYSCALL_IMPL_X64(nanosleep, SyscallPassthrough2<SYSCALL_DEF(nanosleep)>);\n    REGISTER_SYSCALL_IMPL_X64(getitimer, SyscallPassthrough2<SYSCALL_DEF(getitimer)>);\n    REGISTER_SYSCALL_IMPL_X64(setitimer, SyscallPassthrough3<SYSCALL_DEF(setitimer)>);\n    REGISTER_SYSCALL_IMPL_X64(sendfile, SyscallPassthrough4<SYSCALL_DEF(sendfile)>);\n    REGISTER_SYSCALL_IMPL_X64(accept, SyscallPassthrough3<SYSCALL_DEF(accept)>);\n    REGISTER_SYSCALL_IMPL_X64(sendmsg, SyscallPassthrough3<SYSCALL_DEF(sendmsg)>);\n    REGISTER_SYSCALL_IMPL_X64(recvmsg, SyscallPassthrough3<SYSCALL_DEF(recvmsg)>);\n    REGISTER_SYSCALL_IMPL_X64(setsockopt, SyscallPassthrough5<SYSCALL_DEF(setsockopt)>);\n    REGISTER_SYSCALL_IMPL_X64(getsockopt, SyscallPassthrough5<SYSCALL_DEF(getsockopt)>);\n    REGISTER_SYSCALL_IMPL_X64(wait4, SyscallPassthrough4<SYSCALL_DEF(wait4)>);\n    REGISTER_SYSCALL_IMPL_X64(semop, SyscallPassthrough3<SYSCALL_DEF(semop)>);\n    REGISTER_SYSCALL_IMPL_X64(gettimeofday, SyscallPassthrough2<SYSCALL_DEF(gettimeofday)>);\n    REGISTER_SYSCALL_IMPL_X64(getrlimit, SyscallPassthrough2<SYSCALL_DEF(getrlimit)>);\n    REGISTER_SYSCALL_IMPL_X64(getrusage, SyscallPassthrough2<SYSCALL_DEF(getrusage)>);\n    REGISTER_SYSCALL_IMPL_X64(sysinfo, SyscallPassthrough1<SYSCALL_DEF(sysinfo)>);\n    REGISTER_SYSCALL_IMPL_X64(times, SyscallPassthrough1<SYSCALL_DEF(times)>);\n    REGISTER_SYSCALL_IMPL_X64(rt_sigqueueinfo, SyscallPassthrough3<SYSCALL_DEF(rt_sigqueueinfo)>);\n    REGISTER_SYSCALL_IMPL_X64(fstatfs, SyscallPassthrough2<SYSCALL_DEF(fstatfs)>);\n    REGISTER_SYSCALL_IMPL_X64(sched_rr_get_interval, SyscallPassthrough2<SYSCALL_DEF(sched_rr_get_interval)>);\n    REGISTER_SYSCALL_IMPL_X64(mlockall, SyscallPassthrough1<SYSCALL_DEF(mlockall)>);\n    REGISTER_SYSCALL_IMPL_X64(munlockall, SyscallPassthrough0<SYSCALL_DEF(munlockall)>);\n    REGISTER_SYSCALL_IMPL_X64(adjtimex, SyscallPassthrough1<SYSCALL_DEF(adjtimex)>);\n    REGISTER_SYSCALL_IMPL_X64(setrlimit, SyscallPassthrough2<SYSCALL_DEF(setrlimit)>);\n    REGISTER_SYSCALL_IMPL_X64(settimeofday, SyscallPassthrough2<SYSCALL_DEF(settimeofday)>);\n    REGISTER_SYSCALL_IMPL_X64(readahead, SyscallPassthrough3<SYSCALL_DEF(readahead)>);\n    REGISTER_SYSCALL_IMPL_X64(futex, SyscallPassthrough6<SYSCALL_DEF(futex)>);\n    REGISTER_SYSCALL_IMPL_X64(io_getevents, SyscallPassthrough5<SYSCALL_DEF(io_getevents)>);\n    REGISTER_SYSCALL_IMPL_X64(semtimedop, SyscallPassthrough4<SYSCALL_DEF(semtimedop)>);\n    REGISTER_SYSCALL_IMPL_X64(timer_create, SyscallPassthrough3<SYSCALL_DEF(timer_create)>);\n    REGISTER_SYSCALL_IMPL_X64(timer_settime, SyscallPassthrough4<SYSCALL_DEF(timer_settime)>);\n    REGISTER_SYSCALL_IMPL_X64(timer_gettime, SyscallPassthrough2<SYSCALL_DEF(timer_gettime)>);\n    REGISTER_SYSCALL_IMPL_X64(clock_settime, SyscallPassthrough2<SYSCALL_DEF(clock_settime)>);\n    REGISTER_SYSCALL_IMPL_X64(clock_gettime, SyscallPassthrough2<SYSCALL_DEF(clock_gettime)>);\n    REGISTER_SYSCALL_IMPL_X64(clock_getres, SyscallPassthrough2<SYSCALL_DEF(clock_getres)>);\n    REGISTER_SYSCALL_IMPL_X64(clock_nanosleep, SyscallPassthrough4<SYSCALL_DEF(clock_nanosleep)>);\n    REGISTER_SYSCALL_IMPL_X64(mq_open, SyscallPassthrough4<SYSCALL_DEF(mq_open)>);\n    REGISTER_SYSCALL_IMPL_X64(mq_timedsend, SyscallPassthrough5<SYSCALL_DEF(mq_timedsend)>);\n    REGISTER_SYSCALL_IMPL_X64(mq_timedreceive, SyscallPassthrough5<SYSCALL_DEF(mq_timedreceive)>);\n    REGISTER_SYSCALL_IMPL_X64(mq_notify, SyscallPassthrough2<SYSCALL_DEF(mq_notify)>);\n    REGISTER_SYSCALL_IMPL_X64(mq_getsetattr, SyscallPassthrough3<SYSCALL_DEF(mq_getsetattr)>);\n    REGISTER_SYSCALL_IMPL_X64(waitid, SyscallPassthrough5<SYSCALL_DEF(waitid)>);\n    REGISTER_SYSCALL_IMPL_X64(pselect6, SyscallPassthrough6<SYSCALL_DEF(pselect6)>);\n    REGISTER_SYSCALL_IMPL_X64(ppoll, SyscallPassthrough5<SYSCALL_DEF(ppoll)>);\n    REGISTER_SYSCALL_IMPL_X64(set_robust_list, SyscallPassthrough2<SYSCALL_DEF(set_robust_list)>);\n    REGISTER_SYSCALL_IMPL_X64(get_robust_list, SyscallPassthrough3<SYSCALL_DEF(get_robust_list)>);\n    REGISTER_SYSCALL_IMPL_X64(sync_file_range, SyscallPassthrough4<SYSCALL_DEF(sync_file_range)>);\n    REGISTER_SYSCALL_IMPL_X64(vmsplice, SyscallPassthrough4<SYSCALL_DEF(vmsplice)>);\n    REGISTER_SYSCALL_IMPL_X64(utimensat, SyscallPassthrough4<SYSCALL_DEF(utimensat)>);\n    REGISTER_SYSCALL_IMPL_X64(fallocate, SyscallPassthrough4<SYSCALL_DEF(fallocate)>);\n    REGISTER_SYSCALL_IMPL_X64(timerfd_settime, SyscallPassthrough4<SYSCALL_DEF(timerfd_settime)>);\n    REGISTER_SYSCALL_IMPL_X64(timerfd_gettime, SyscallPassthrough2<SYSCALL_DEF(timerfd_gettime)>);\n    REGISTER_SYSCALL_IMPL_X64(preadv, SyscallPassthrough5<SYSCALL_DEF(preadv)>);\n    REGISTER_SYSCALL_IMPL_X64(pwritev, SyscallPassthrough5<SYSCALL_DEF(pwritev)>);\n    REGISTER_SYSCALL_IMPL_X64(rt_tgsigqueueinfo, SyscallPassthrough4<SYSCALL_DEF(rt_tgsigqueueinfo)>);\n    REGISTER_SYSCALL_IMPL_X64(recvmmsg, SyscallPassthrough5<SYSCALL_DEF(recvmmsg)>);\n    REGISTER_SYSCALL_IMPL_X64(clock_adjtime, SyscallPassthrough2<SYSCALL_DEF(clock_adjtime)>);\n    REGISTER_SYSCALL_IMPL_X64(sendmmsg, SyscallPassthrough4<SYSCALL_DEF(sendmmsg)>);\n    REGISTER_SYSCALL_IMPL_X64(process_vm_readv, SyscallPassthrough6<SYSCALL_DEF(process_vm_readv)>);\n    REGISTER_SYSCALL_IMPL_X64(process_vm_writev, SyscallPassthrough6<SYSCALL_DEF(process_vm_writev)>);\n    REGISTER_SYSCALL_IMPL_X64(preadv2, SyscallPassthrough6<SYSCALL_DEF(preadv2)>);\n    REGISTER_SYSCALL_IMPL_X64(pwritev2, SyscallPassthrough6<SYSCALL_DEF(pwritev2)>);\n    REGISTER_SYSCALL_IMPL_X64(io_pgetevents, SyscallPassthrough6<SYSCALL_DEF(io_pgetevents)>);\n    REGISTER_SYSCALL_IMPL_X64(pidfd_send_signal, SyscallPassthrough4<SYSCALL_DEF(pidfd_send_signal)>);\n    REGISTER_SYSCALL_IMPL_X64(process_madvise, SyscallPassthrough5<SYSCALL_DEF(process_madvise)>);\n    REGISTER_SYSCALL_IMPL_X64(fadvise64, SyscallPassthrough4<SYSCALL_DEF(fadvise64)>);\n    if (Handler->IsHostKernelVersionAtLeast(6, 5, 0)) {\n      REGISTER_SYSCALL_IMPL_X64(cachestat, SyscallPassthrough4<SYSCALL_DEF(cachestat)>);\n    } else {\n      REGISTER_SYSCALL_IMPL_X64(cachestat, UnimplementedSyscallSafe);\n    }\n    if (Handler->IsHostKernelVersionAtLeast(6, 6, 0)) {\n      REGISTER_SYSCALL_IMPL_X64(fchmodat2, SyscallPassthrough4<SYSCALL_DEF(fchmodat2)>);\n    } else {\n      REGISTER_SYSCALL_IMPL_X64(fchmodat2, UnimplementedSyscallSafe);\n    }\n  }\n} // namespace x64\n\nnamespace x32 {\n  void RegisterPassthrough(FEX::HLE::SyscallHandler* Handler) {\n    using namespace FEXCore::IR;\n    RegisterCommon(Handler);\n    REGISTER_SYSCALL_IMPL_X32(getuid32, SyscallPassthrough0<SYSCALL_DEF(getuid)>);\n    REGISTER_SYSCALL_IMPL_X32(getgid32, SyscallPassthrough0<SYSCALL_DEF(getgid)>);\n    REGISTER_SYSCALL_IMPL_X32(geteuid32, SyscallPassthrough0<SYSCALL_DEF(geteuid)>);\n    REGISTER_SYSCALL_IMPL_X32(getegid32, SyscallPassthrough0<SYSCALL_DEF(getegid)>);\n    REGISTER_SYSCALL_IMPL_X32(setreuid32, SyscallPassthrough2<SYSCALL_DEF(setreuid)>);\n    REGISTER_SYSCALL_IMPL_X32(setregid32, SyscallPassthrough2<SYSCALL_DEF(setregid)>);\n    REGISTER_SYSCALL_IMPL_X32(getgroups32, SyscallPassthrough2<SYSCALL_DEF(getgroups)>);\n    REGISTER_SYSCALL_IMPL_X32(setgroups32, SyscallPassthrough2<SYSCALL_DEF(setgroups)>);\n    REGISTER_SYSCALL_IMPL_X32(fchown32, SyscallPassthrough3<SYSCALL_DEF(fchown)>);\n    REGISTER_SYSCALL_IMPL_X32(setresuid32, SyscallPassthrough3<SYSCALL_DEF(setresuid)>);\n    REGISTER_SYSCALL_IMPL_X32(getresuid32, SyscallPassthrough3<SYSCALL_DEF(getresuid)>);\n    REGISTER_SYSCALL_IMPL_X32(setresgid32, SyscallPassthrough3<SYSCALL_DEF(setresgid)>);\n    REGISTER_SYSCALL_IMPL_X32(getresgid32, SyscallPassthrough3<SYSCALL_DEF(getresgid)>);\n    REGISTER_SYSCALL_IMPL_X32(setuid32, SyscallPassthrough1<SYSCALL_DEF(setuid)>);\n    REGISTER_SYSCALL_IMPL_X32(setgid32, SyscallPassthrough1<SYSCALL_DEF(setgid)>);\n    REGISTER_SYSCALL_IMPL_X32(setfsuid32, SyscallPassthrough1<SYSCALL_DEF(setfsuid)>);\n    REGISTER_SYSCALL_IMPL_X32(setfsgid32, SyscallPassthrough1<SYSCALL_DEF(setfsgid)>);\n    REGISTER_SYSCALL_IMPL_X32(sendfile64, SyscallPassthrough4<SYSCALL_DEF(sendfile)>);\n    REGISTER_SYSCALL_IMPL_X32(clock_gettime64, SyscallPassthrough2<SYSCALL_DEF(clock_gettime)>);\n    REGISTER_SYSCALL_IMPL_X32(clock_settime64, SyscallPassthrough2<SYSCALL_DEF(clock_settime)>);\n    REGISTER_SYSCALL_IMPL_X32(clock_adjtime64, SyscallPassthrough2<SYSCALL_DEF(clock_adjtime)>);\n    REGISTER_SYSCALL_IMPL_X32(clock_getres_time64, SyscallPassthrough2<SYSCALL_DEF(clock_getres)>);\n    REGISTER_SYSCALL_IMPL_X32(clock_nanosleep_time64, SyscallPassthrough4<SYSCALL_DEF(clock_nanosleep)>);\n    REGISTER_SYSCALL_IMPL_X32(timer_gettime64, SyscallPassthrough2<SYSCALL_DEF(timer_gettime)>);\n    REGISTER_SYSCALL_IMPL_X32(timer_settime64, SyscallPassthrough4<SYSCALL_DEF(timer_settime)>);\n    REGISTER_SYSCALL_IMPL_X32(timerfd_gettime64, SyscallPassthrough2<SYSCALL_DEF(timerfd_gettime)>);\n    REGISTER_SYSCALL_IMPL_X32(timerfd_settime64, SyscallPassthrough4<SYSCALL_DEF(timerfd_settime)>);\n    REGISTER_SYSCALL_IMPL_X32(utimensat_time64, SyscallPassthrough4<SYSCALL_DEF(utimensat)>);\n    REGISTER_SYSCALL_IMPL_X32(ppoll_time64, SyscallPassthrough5<SYSCALL_DEF(ppoll)>);\n    REGISTER_SYSCALL_IMPL_X32(io_pgetevents_time64, SyscallPassthrough6<SYSCALL_DEF(io_pgetevents)>);\n    REGISTER_SYSCALL_IMPL_X32(mq_timedsend_time64, SyscallPassthrough5<SYSCALL_DEF(mq_timedsend)>);\n    REGISTER_SYSCALL_IMPL_X32(mq_timedreceive_time64, SyscallPassthrough5<SYSCALL_DEF(mq_timedreceive)>);\n    REGISTER_SYSCALL_IMPL_X32(semtimedop_time64, SyscallPassthrough4<SYSCALL_DEF(semtimedop)>);\n    REGISTER_SYSCALL_IMPL_X32(futex_time64, SyscallPassthrough6<SYSCALL_DEF(futex)>);\n    REGISTER_SYSCALL_IMPL_X32(sched_rr_get_interval_time64, SyscallPassthrough2<SYSCALL_DEF(sched_rr_get_interval)>);\n  }\n} // namespace x32\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Signals.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#include \"LinuxSyscalls/SignalDelegator.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/Syscalls/Thread.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Core/SignalDelegator.h>\n\n#include <signal.h>\n#include <sys/syscall.h>\n#include <unistd.h>\n\nnamespace SignalDelegator {\nstruct GuestSigAction;\n}\n\nnamespace FEX::HLE {\nvoid RegisterSignals(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL(rt_sigprocmask, [](FEXCore::Core::CpuStateFrame* Frame, int how, const uint64_t* set, uint64_t* oldset) -> uint64_t {\n    return FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSigProcMask(FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame),\n                                                                             how, set, oldset);\n  });\n\n  REGISTER_SYSCALL_IMPL(rt_sigpending, [](FEXCore::Core::CpuStateFrame* Frame, uint64_t* set, size_t sigsetsize) -> uint64_t {\n    return FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSigPending(FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame), set,\n                                                                            sigsetsize);\n  });\n\n  REGISTER_SYSCALL_IMPL(rt_sigsuspend, [](FEXCore::Core::CpuStateFrame* Frame, uint64_t* unewset, size_t sigsetsize) -> uint64_t {\n    return FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSigSuspend(FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame),\n                                                                            unewset, sigsetsize);\n  });\n\n  REGISTER_SYSCALL_IMPL(userfaultfd, [](FEXCore::Core::CpuStateFrame* Frame, int flags) -> uint64_t {\n    // Disable userfaultfd until we can properly emulate it\n    // This is okay because the kernel configuration allows you to disable it at compile time\n    return -ENOSYS;\n    uint64_t Result = ::syscall(SYSCALL_DEF(userfaultfd), flags);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(signalfd, [](FEXCore::Core::CpuStateFrame* Frame, int fd, const uint64_t* mask, size_t sigsetsize) -> uint64_t {\n    return FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSignalFD(fd, mask, sigsetsize, 0);\n  });\n\n  REGISTER_SYSCALL_IMPL(signalfd4, [](FEXCore::Core::CpuStateFrame* Frame, int fd, const uint64_t* mask, size_t sigsetsize, int flags) -> uint64_t {\n    return FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSignalFD(fd, mask, sigsetsize, flags);\n  });\n}\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Stubs.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#include <FEXCore/Utils/LogManager.h>\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n\n#include <errno.h>\n#include <stdint.h>\n#include <sys/types.h>\n\n#define SYSCALL_STUB(name)                         \\\n  do {                                             \\\n    ERROR_AND_DIE_FMT(\"Syscall: \" #name \" stub!\"); \\\n    return -ENOSYS;                                \\\n  } while (0)\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nnamespace FEX::HLE {\nvoid RegisterStubs(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL(restart_syscall, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { SYSCALL_STUB(restart_syscall); });\n\n  REGISTER_SYSCALL_IMPL(rseq, [](FEXCore::Core::CpuStateFrame* Frame, struct rseq* rseq, uint32_t rseq_len, int flags, uint32_t sig) -> uint64_t {\n    // We don't support this\n    return -ENOSYS;\n  });\n}\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Thread.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#include \"CodeLoader.h\"\n\n#include \"LinuxSyscalls/SignalDelegator.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/Syscalls/Thread.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Thread.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Thread.h\"\n#include \"LinuxSyscalls/Utils/Threads.h\"\n\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/Event.h>\n\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <grp.h>\n#include <limits.h>\n#include <linux/futex.h>\n#include <linux/seccomp.h>\n#include <linux/sched.h>\n#include <stdint.h>\n#include <sched.h>\n#include <sys/personality.h>\n#include <sys/poll.h>\n#include <sys/prctl.h>\n#include <sys/resource.h>\n#include <sys/syscall.h>\n#include <sys/types.h>\n#include <sys/time.h>\n#include <sys/wait.h>\n#include <unistd.h>\n#include <sys/fsuid.h>\n\nARG_TO_STR(idtype_t, \"%u\")\n\nnamespace FEX::HLE {\n\nstruct ExecutionThreadHandler {\n  FEXCore::Context::Context* CTX;\n  FEX::HLE::ThreadStateObject* Thread;\n  Event ThreadWaiting {};\n\n  // Pause on thread start handling.\n  FEXCore::InterruptableConditionVariable StartRunningCV {};\n  FEXCore::InterruptableConditionVariable StartRunningResponse {};\n};\n\nstatic void* ThreadHandler(void* Data) {\n  ExecutionThreadHandler* Handler = reinterpret_cast<ExecutionThreadHandler*>(Data);\n  auto CTX = Handler->CTX;\n  auto Thread = Handler->Thread;\n\n  Thread->ThreadInfo.PID = ::getpid();\n  Thread->ThreadInfo.TID = FHU::Syscalls::gettid();\n  if (Thread->Thread->ThreadStats) {\n    Thread->Thread->ThreadStats->TID.store(Thread->ThreadInfo.TID, std::memory_order_relaxed);\n  }\n\n  FEXCore::Allocator::InitializeThread();\n\n  FEX::HLE::_SyscallHandler->RegisterTLSState(Thread);\n\n  // Now notify the thread that we are initialized\n  Handler->ThreadWaiting.NotifyOne();\n\n  Handler->StartRunningCV.Wait();\n\n  // Notify the parent thread that it can continue.\n  // Handler is a stack object on the parent thread, and will be invalid after notification.\n  Handler->StartRunningResponse.NotifyOne();\n\n  CTX->ExecuteThread(Thread->Thread);\n  FEX::HLE::_SyscallHandler->UninstallTLSState(Thread);\n  FEX::HLE::_SyscallHandler->TM.DestroyThread(Thread);\n  return nullptr;\n}\n\nFEX::HLE::ThreadStateObject* CreateNewThread(FEXCore::Context::Context* CTX, FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::clone3_args* args) {\n  uint64_t flags = args->args.flags;\n  auto NewThread = FEX::HLE::_SyscallHandler->TM.CreateThread(0, 0, &Frame->State, args->args.parent_tid,\n                                                              FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame));\n\n  NewThread->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RAX] = 0;\n  if (args->Type == TYPE_CLONE3) {\n    // stack pointer points to the lowest address to the stack\n    // set RSP to stack + size\n    NewThread->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RSP] = args->args.stack + args->args.stack_size;\n  } else {\n    NewThread->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RSP] = args->args.stack;\n  }\n\n  if (FEX::HLE::_SyscallHandler->Is64BitMode()) {\n    if (flags & CLONE_SETTLS) {\n      x64::SetThreadArea(NewThread->Thread->CurrentFrame, reinterpret_cast<void*>(args->args.tls));\n    }\n    // Set us to start just after the syscall instruction\n    x64::AdjustRipForNewThread(NewThread->Thread->CurrentFrame);\n  } else {\n    if (flags & CLONE_SETTLS) {\n      x32::SetThreadArea(NewThread->Thread->CurrentFrame, reinterpret_cast<void*>(args->args.tls));\n    }\n    x32::AdjustRipForNewThread(NewThread->Thread->CurrentFrame);\n  }\n\n  // Initialize a new thread for execution.\n  ExecutionThreadHandler Arg {\n    .CTX = CTX,\n    .Thread = NewThread,\n  };\n  NewThread->ExecutionThread = FEXCore::Threads::Thread::Create(ThreadHandler, &Arg);\n\n  // Wait for the thread to have started.\n  Arg.ThreadWaiting.Wait();\n\n  if (FEX::HLE::_SyscallHandler->NeedXIDCheck()) {\n    // The first time an application creates a thread, GLIBC installs their SETXID signal handler.\n    // FEX needs to capture all signals and defer them to the guest.\n    // Once FEX creates its first guest thread, overwrite the GLIBC SETXID handler *again* to ensure\n    // FEX maintains control of the signal handler on this signal.\n    FEX::HLE::_SyscallHandler->GetSignalDelegator()->CheckXIDHandler();\n    FEX::HLE::_SyscallHandler->DisableXIDCheck();\n  }\n\n  // Return the new threads TID\n  uint64_t Result = NewThread->ThreadInfo.TID;\n\n  // Sets the child TID to pointer in ParentTID\n  if (flags & CLONE_PARENT_SETTID) {\n    *reinterpret_cast<pid_t*>(args->args.parent_tid) = Result;\n  }\n\n  // Sets the child TID to the pointer in ChildTID\n  if (flags & CLONE_CHILD_SETTID) {\n    NewThread->ThreadInfo.set_child_tid = reinterpret_cast<int32_t*>(args->args.child_tid);\n    *reinterpret_cast<pid_t*>(args->args.child_tid) = Result;\n  }\n\n  // When the thread exits, clear the child thread ID at ChildTID\n  // Additionally wakeup a futex at that address\n  // Address /may/ be changed with SET_TID_ADDRESS syscall\n  if (flags & CLONE_CHILD_CLEARTID) {\n    NewThread->ThreadInfo.clear_child_tid = reinterpret_cast<int32_t*>(args->args.child_tid);\n  }\n\n  // clone3 flag\n  if (flags & CLONE_PIDFD) {\n    // Use pidfd_open to emulate this flag\n    const int pidfd = ::syscall(SYSCALL_DEF(pidfd_open), Result, 0);\n    if (Result == ~0ULL) {\n      LogMan::Msg::EFmt(\"Couldn't get pidfd of TID {}\\n\", Result);\n    } else {\n      *reinterpret_cast<int*>(args->args.pidfd) = pidfd;\n    }\n  }\n\n  FEX::HLE::_SyscallHandler->TM.TrackThread(NewThread);\n\n  // Start running the thread\n  Arg.StartRunningCV.NotifyOne();\n\n  // Wait for the thread to start running.\n  Arg.StartRunningResponse.Wait();\n\n  return NewThread;\n}\n\nuint64_t HandleNewClone(FEX::HLE::ThreadStateObject* Thread, FEXCore::Context::Context* CTX, FEXCore::Core::CpuStateFrame* Frame,\n                        FEX::HLE::clone3_args* CloneArgs) {\n  FEXCore::Allocator::InitializeThread();\n  auto GuestArgs = &CloneArgs->args;\n  uint64_t flags = GuestArgs->flags;\n  auto NewThread = Thread;\n  bool CreatedNewThreadObject {};\n\n  if (flags & CLONE_THREAD) {\n    // Overwrite thread\n    NewThread = FEX::HLE::_SyscallHandler->TM.CreateThread(0, 0, &Frame->State, GuestArgs->parent_tid,\n                                                           FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame));\n\n    NewThread->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RAX] = 0;\n    if (GuestArgs->stack == 0) {\n      // Copies in the original thread's stack\n    } else {\n      NewThread->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RSP] = GuestArgs->stack;\n    }\n\n    // CLONE_PARENT_SETTID, CLONE_CHILD_SETTID, CLONE_CHILD_CLEARTID, CLONE_PIDFD will be handled by kernel\n    // Call execution thread directly since we already are on the new thread\n    CreatedNewThreadObject = true;\n  } else {\n    // If we don't have CLONE_THREAD then we are effectively a fork\n    // Clear all the other threads that are being tracked\n    // Frame->Thread is /ONLY/ safe to access when CLONE_THREAD flag is not set\n    // Unlock the mutexes on both sides of the fork\n    FEX::HLE::_SyscallHandler->UnlockAfterFork(Frame->Thread, true);\n\n    ::syscall(SYS_rt_sigprocmask, SIG_SETMASK, &CloneArgs->SignalMask, nullptr, sizeof(CloneArgs->SignalMask));\n\n    Thread->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RAX] = 0;\n    if (GuestArgs->stack == 0) {\n      // Copies in the original thread's stack\n    } else {\n      Thread->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RSP] = GuestArgs->stack;\n    }\n  }\n\n  if (CloneArgs->Type == TYPE_CLONE3) {\n    // If we are coming from a clone3 handler then we need to adjust RSP.\n    Thread->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RSP] += CloneArgs->args.stack_size;\n  }\n\n  if (FEX::HLE::_SyscallHandler->Is64BitMode()) {\n    if (flags & CLONE_SETTLS) {\n      x64::SetThreadArea(NewThread->Thread->CurrentFrame, reinterpret_cast<void*>(GuestArgs->tls));\n    }\n    // Set us to start just after the syscall instruction\n    x64::AdjustRipForNewThread(NewThread->Thread->CurrentFrame);\n  } else {\n    if (flags & CLONE_SETTLS) {\n      x32::SetThreadArea(NewThread->Thread->CurrentFrame, reinterpret_cast<void*>(GuestArgs->tls));\n    }\n    x32::AdjustRipForNewThread(NewThread->Thread->CurrentFrame);\n  }\n\n  // Depending on clone settings, our TID and PID could have changed\n  Thread->ThreadInfo.TID = FHU::Syscalls::gettid();\n  Thread->ThreadInfo.PID = ::getpid();\n  FEX::HLE::_SyscallHandler->FM.UpdatePID(Thread->ThreadInfo.PID);\n\n  if (CreatedNewThreadObject) {\n    FEX::HLE::_SyscallHandler->TM.TrackThread(Thread);\n  }\n\n  FEX::HLE::_SyscallHandler->RegisterTLSState(Thread);\n\n  // Start exuting the thread directly\n  // Our host clone starts in a new stack space, so it can't return back to the JIT space\n  CTX->ExecuteThread(Thread->Thread);\n\n  FEX::HLE::_SyscallHandler->UninstallTLSState(Thread);\n\n  // The rest of the context remains as is and the thread will continue executing\n  return Thread->StatusCode;\n}\n\nstatic int CloneFork(uint32_t flags, uint64_t exit_signal) {\n  return ::syscall(SYSCALL_DEF(clone), (flags & (CLONE_FS | CLONE_FILES)) | exit_signal, nullptr, nullptr, nullptr, nullptr);\n}\n\nuint64_t ForkGuest(FEXCore::Core::InternalThreadState* Thread, FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::clone3_args* args) {\n  const uint64_t flags = args->args.flags;\n  auto stack = reinterpret_cast<const void*>(args->args.stack);\n  const uint64_t stack_size = args->args.stack_size;\n  auto parent_tid = reinterpret_cast<pid_t*>(args->args.parent_tid);\n  auto child_tid = reinterpret_cast<pid_t*>(args->args.child_tid);\n  auto tls = reinterpret_cast<void*>(args->args.tls);\n  const uint64_t exit_signal = args->args.exit_signal;\n\n  // Sanity check flags here.\n  if (args->Type == TypeOfClone::TYPE_CLONE3) {\n    constexpr uint64_t UnsupportedFlags = CLONE_CLEAR_SIGHAND | CLONE_INTO_CGROUP | CLONE_NEWTIME;\n    if (args->args.flags & UnsupportedFlags) {\n      LogMan::Msg::EFmt(\"fork: Unsupported flags passed. {:#x}\", args->args.flags & UnsupportedFlags);\n    }\n  }\n\n  // Just before we fork, we lock all syscall mutexes so that both processes will end up with a locked mutex\n  uint64_t Mask {~0ULL};\n  ::syscall(SYS_rt_sigprocmask, SIG_SETMASK, &Mask, &Mask, sizeof(Mask));\n\n  FEX::HLE::_SyscallHandler->LockBeforeFork(Frame->Thread);\n\n  const bool IsVFork = flags & CLONE_VFORK;\n  pid_t Result {};\n  int VForkFDs[2];\n  if (IsVFork) {\n    // Use pipes as a mechanism for knowing when the child process is exiting.\n    // FEX can't use `waitpid` for this since the child process may want to use it.\n    // If we use `waitpid` then the kernel won't return the same data if asked again.\n    pipe2(VForkFDs, O_CLOEXEC);\n\n    // XXX: We don't currently support a real `vfork` as it causes problems.\n    // Currently behaves like a fork (with wait after the fact), which isn't correct. Need to find where the problem is\n    Result = CloneFork(flags, exit_signal);\n\n    if (Result == 0) {\n      // Close the read end of the pipe.\n      // Keep the write end open so the parent can poll it.\n      close(VForkFDs[0]);\n    } else {\n      // Close the write end of the pipe.\n      close(VForkFDs[1]);\n    }\n  } else {\n    Result = CloneFork(flags, exit_signal);\n  }\n  const bool IsChild = Result == 0;\n\n  if (IsChild) {\n    auto ThreadObject = static_cast<FEX::HLE::ThreadStateObject*>(Thread->FrontendPtr);\n    // Unlock the mutexes on both sides of the fork\n    FEX::HLE::_SyscallHandler->UnlockAfterFork(Frame->Thread, IsChild);\n\n    ::syscall(SYS_rt_sigprocmask, SIG_SETMASK, &Mask, nullptr, sizeof(Mask));\n\n    // Child\n    // update the internal TID\n    ThreadObject->ThreadInfo.TID = FHU::Syscalls::gettid();\n    ThreadObject->ThreadInfo.PID = ::getpid();\n    FEX::HLE::_SyscallHandler->FM.UpdatePID(ThreadObject->ThreadInfo.PID);\n    ThreadObject->ThreadInfo.clear_child_tid = nullptr;\n\n    // only a  single thread running so no need to remove anything from the thread array\n\n    // Handle child setup now\n    if (stack != nullptr) {\n      // use specified stack\n      Frame->State.gregs[FEXCore::X86State::REG_RSP] = reinterpret_cast<uint64_t>(stack) + stack_size;\n    } else {\n      // In the case of fork and nullptr stack then the child uses the same stack space as the parent\n      // Same virtual address, different addressspace\n    }\n\n    if (FEX::HLE::_SyscallHandler->Is64BitMode()) {\n      if (flags & CLONE_SETTLS) {\n        x64::SetThreadArea(Frame, tls);\n      }\n    } else {\n      // 32bit TLS doesn't just set the fs register\n      if (flags & CLONE_SETTLS) {\n        x32::SetThreadArea(Frame, tls);\n      }\n    }\n\n    // Sets the child TID to the pointer in ChildTID\n    if (flags & CLONE_CHILD_SETTID) {\n      ThreadObject->ThreadInfo.set_child_tid = child_tid;\n      *child_tid = ThreadObject->ThreadInfo.TID;\n    }\n\n    // When the thread exits, clear the child thread ID at ChildTID\n    // Additionally wakeup a futex at that address\n    // Address /may/ be changed with SET_TID_ADDRESS syscall\n    if (flags & CLONE_CHILD_CLEARTID) {\n      ThreadObject->ThreadInfo.clear_child_tid = child_tid;\n    }\n\n    // the rest of the context remains as is, this thread will keep executing\n    return 0;\n  } else {\n    if (Result != -1) {\n      if (flags & CLONE_PARENT_SETTID) {\n        *parent_tid = Result;\n      }\n    }\n\n    // Unlock the mutexes on both sides of the fork\n    FEX::HLE::_SyscallHandler->UnlockAfterFork(Frame->Thread, IsChild);\n\n    ::syscall(SYS_rt_sigprocmask, SIG_SETMASK, &Mask, nullptr, sizeof(Mask));\n\n    // VFork needs the parent to wait for the child to exit.\n    if (IsVFork) {\n      // Wait for the read end of the pipe to close.\n      pollfd PollFD {};\n      PollFD.fd = VForkFDs[0];\n      PollFD.events = POLLIN | POLLOUT | POLLRDHUP | POLLERR | POLLHUP | POLLNVAL;\n\n      // Mask all signals until the child process returns.\n      sigset_t SignalMask {};\n      sigfillset(&SignalMask);\n      while (ppoll(&PollFD, 1, nullptr, &SignalMask) == -1 && errno == EINTR)\n        ;\n\n      // Close the read end now.\n      close(VForkFDs[0]);\n    }\n\n    // Parent\n    SYSCALL_ERRNO();\n  }\n}\n\nvoid RegisterThread(FEX::HLE::SyscallHandler* Handler) {\n  using namespace FEXCore::IR;\n\n  REGISTER_SYSCALL_IMPL(rt_sigreturn, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t {\n    FEX::HLE::_SyscallHandler->GetSignalDelegator()->HandleSignalHandlerReturn(true);\n    FEX_UNREACHABLE;\n  });\n\n  REGISTER_SYSCALL_IMPL(fork, ([](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t {\n                          FEX::HLE::clone3_args args {.Type = TypeOfClone::TYPE_CLONE2,\n                                                      .args = {\n                                                        .flags = 0,\n                                                        .pidfd = 0,\n                                                        .child_tid = 0,\n                                                        .parent_tid = 0,\n                                                        .exit_signal = SIGCHLD,\n                                                        .stack = 0,\n                                                        .stack_size = 0,\n                                                        .tls = 0,\n                                                        .set_tid = 0,\n                                                        .set_tid_size = 0,\n                                                        .cgroup = 0,\n                                                      }};\n\n                          return ForkGuest(Frame->Thread, Frame, &args);\n                        }));\n\n  REGISTER_SYSCALL_IMPL(vfork, ([](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t {\n                          FEX::HLE::clone3_args args {.Type = TypeOfClone::TYPE_CLONE2,\n                                                      .args = {\n                                                        .flags = CLONE_VFORK,\n                                                        .pidfd = 0,\n                                                        .child_tid = 0,\n                                                        .parent_tid = 0,\n                                                        .exit_signal = SIGCHLD,\n                                                        .stack = 0,\n                                                        .stack_size = 0,\n                                                        .tls = 0,\n                                                        .set_tid = 0,\n                                                        .set_tid_size = 0,\n                                                        .cgroup = 0,\n                                                      }};\n\n                          return ForkGuest(Frame->Thread, Frame, &args);\n                        }));\n\n  REGISTER_SYSCALL_IMPL(getpgrp, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t {\n    uint64_t Result = ::getpgrp();\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(clone3, ([](FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::kernel_clone3_args* cl_args, size_t size) -> uint64_t {\n                          FEX::HLE::clone3_args args {};\n                          args.Type = TypeOfClone::TYPE_CLONE3;\n                          memcpy(&args.args, cl_args, std::min(sizeof(FEX::HLE::kernel_clone3_args), size));\n                          return CloneHandler(Frame, &args);\n                        }));\n\n  REGISTER_SYSCALL_IMPL(exit, [](FEXCore::Core::CpuStateFrame* Frame, int status) -> uint64_t {\n    // TLS/DTV teardown is something FEX can't control. Disable glibc checking when we leave a pthread.\n    // Since this thread is hard stopping, we can't track the TLS/DTV teardown in FEX's thread handling.\n    FEXCore::Allocator::YesIKnowImNotSupposedToUseTheGlibcAllocator::HardDisable();\n    auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n\n    if (ThreadObject->ThreadInfo.clear_child_tid) {\n      auto Addr = std::atomic_ref<int32_t>(*ThreadObject->ThreadInfo.clear_child_tid);\n      Addr.store(0);\n      syscall(SYSCALL_DEF(futex), ThreadObject->ThreadInfo.clear_child_tid, FUTEX_WAKE, ~0ULL, 0, 0, 0);\n    }\n\n    ThreadObject->StatusCode = status;\n\n    FEX::HLE::_SyscallHandler->UninstallTLSState(ThreadObject);\n\n    if (ThreadObject->ExecutionThread) {\n      // If this is a pthread based execution thread, then there is more work to be done.\n      // Delegate final deletion and cleanup to the pthreads Thread management.\n      FEX::LinuxEmulation::Threads::LongjumpDeallocateAndExit(ThreadObject, status);\n    } else {\n      FEX::HLE::_SyscallHandler->TM.DestroyThread(ThreadObject, true);\n      FEX::LinuxEmulation::Threads::DeallocateStackObjectAndExit(nullptr, status);\n    }\n    // This will never be reached\n    std::terminate();\n  });\n\n  REGISTER_SYSCALL_IMPL(prctl,\n                        [](FEXCore::Core::CpuStateFrame* Frame, int option, unsigned long arg2, unsigned long arg3, unsigned long arg4,\n                           unsigned long arg5) -> uint64_t {\n                          uint64_t Result {};\n#ifndef PR_GET_AUXV\n#define PR_GET_AUXV 0x41555856\n#endif\n                          switch (option) {\n                          case PR_SET_SECCOMP: {\n                            uint32_t Operation {};\n                            if (arg2 == SECCOMP_MODE_STRICT) Operation = SECCOMP_SET_MODE_STRICT;\n                            if (arg2 == SECCOMP_MODE_FILTER) Operation = SECCOMP_SET_MODE_FILTER;\n\n                            return FEX::HLE::_SyscallHandler->SeccompEmulator.Handle(Frame, Operation, 0, reinterpret_cast<void*>(arg3));\n                          }\n                          case PR_GET_SECCOMP: return FEX::HLE::_SyscallHandler->SeccompEmulator.GetSeccomp(Frame);\n                          case PR_GET_AUXV: {\n                            if (arg4 || arg5) {\n                              return -EINVAL;\n                            }\n\n                            void* addr = reinterpret_cast<void*>(arg2);\n                            size_t UserSize = reinterpret_cast<size_t>(arg3);\n\n                            const auto auxv = FEX::HLE::_SyscallHandler->GetCodeLoader()->GetAuxv();\n                            const auto auxvBase = auxv.address;\n                            const auto auxvSize = auxv.size;\n                            size_t MinSize = std::min(auxvSize, UserSize);\n\n                            memcpy(addr, reinterpret_cast<void*>(auxvBase), MinSize);\n\n                            // Returns the size of auxv without truncation.\n                            return auxvSize;\n                          }\n                          default: Result = ::prctl(option, arg2, arg3, arg4, arg5); break;\n                          }\n                          SYSCALL_ERRNO();\n                        });\n\n  REGISTER_SYSCALL_IMPL(arch_prctl, [](FEXCore::Core::CpuStateFrame* Frame, int code, unsigned long addr) -> uint64_t {\n    uint64_t Result {};\n    switch (code) {\n    case 0x1001: // ARCH_SET_GS\n      if (addr >= SyscallHandler::TASK_MAX_64BIT) {\n        // Ignore a non-canonical address\n        return -EPERM;\n      }\n      Frame->State.gs_cached = addr;\n      Result = 0;\n      break;\n    case 0x1002: // ARCH_SET_FS\n      if (addr >= SyscallHandler::TASK_MAX_64BIT) {\n        // Ignore a non-canonical address\n        return -EPERM;\n      }\n      Frame->State.fs_cached = addr;\n      Result = 0;\n      break;\n    case 0x1003: // ARCH_GET_FS\n      *reinterpret_cast<uint64_t*>(addr) = Frame->State.fs_cached;\n      Result = 0;\n      break;\n    case 0x1004: // ARCH_GET_GS\n      *reinterpret_cast<uint64_t*>(addr) = Frame->State.gs_cached;\n      Result = 0;\n      break;\n    case 0x3001:        // ARCH_CET_STATUS\n      Result = -EINVAL; // We don't support CET, return EINVAL\n      break;\n    case 0x1011: // ARCH_GET_CPUID\n      return 1;\n      break;\n    case 0x1012:      // ARCH_SET_CPUID\n      return -ENODEV; // Claim we don't support faulting on CPUID\n      break;\n    default:\n      LogMan::Msg::EFmt(\"Unknown prctl: 0x{:x}\", code);\n      Result = -EINVAL;\n      break;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(set_tid_address, [](FEXCore::Core::CpuStateFrame* Frame, int* tidptr) -> uint64_t {\n    auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n    ThreadObject->ThreadInfo.clear_child_tid = tidptr;\n    return ThreadObject->ThreadInfo.TID;\n  });\n\n  REGISTER_SYSCALL_IMPL(exit_group, [](FEXCore::Core::CpuStateFrame* Frame, int status) -> uint64_t {\n    Frame->Thread->CTX->FlushAndCloseCodeMap();\n\n    // Save telemetry if we're exiting.\n    FEX::HLE::_SyscallHandler->GetSignalDelegator()->SaveTelemetry();\n    FEX::HLE::_SyscallHandler->TM.CleanupForExit();\n\n    syscall(SYSCALL_DEF(exit_group), status);\n    // This will never be reached\n    std::terminate();\n  });\n}\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Thread.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#pragma once\n\n#include <cstdint>\n#include <sys/types.h>\n\nnamespace FEXCore::Context {\nclass Context;\n}\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\nstruct InternalThreadState;\n} // namespace FEXCore::Core\n\nnamespace FEX::HLE {\nstruct clone3_args;\nstruct ThreadStateObject;\n\nFEX::HLE::ThreadStateObject* CreateNewThread(FEXCore::Context::Context* CTX, FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::clone3_args* args);\nuint64_t HandleNewClone(FEX::HLE::ThreadStateObject* Thread, FEXCore::Context::Context* CTX, FEXCore::Core::CpuStateFrame* Frame,\n                        FEX::HLE::clone3_args* GuestArgs);\nuint64_t ForkGuest(FEXCore::Core::InternalThreadState* Thread, FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::clone3_args* args);\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Timer.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-shared\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/Types.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n\n#include <FEXCore/IR/IR.h>\n\n#include <stddef.h>\n#include <stdint.h>\n#include <signal.h>\n#include <sys/time.h>\n#include <time.h>\n#include <sys/syscall.h>\n#include <unistd.h>\n\nnamespace FEX::HLE {\nvoid RegisterTimer(FEX::HLE::SyscallHandler* Handler) {\n  using namespace FEXCore::IR;\n\n  REGISTER_SYSCALL_IMPL(alarm, [](FEXCore::Core::CpuStateFrame* Frame, unsigned int seconds) -> uint64_t {\n    uint64_t Result = ::alarm(seconds);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL(pause, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t {\n    uint64_t Result = ::pause();\n    SYSCALL_ERRNO();\n  });\n}\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ncategory: LinuxSyscalls ~ Linux syscall emulation, marshaling and passthrough\ntags: LinuxSyscalls|common\ndesc: Glue logic, brk allocations\n$end_info$\n*/\n\n#include \"CodeLoader.h\"\n\n#include \"FEXHeaderUtils/StringArgumentParser.h\"\n#include \"Linux/Utils/ELFContainer.h\"\n#include \"Linux/Utils/ELFParser.h\"\n\n#include \"LinuxSyscalls/LinuxAllocator.h\"\n#include \"LinuxSyscalls/SignalDelegator.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/Syscalls/Thread.h\"\n#include \"LinuxSyscalls/Utils/Threads.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Types.h\"\n#include \"LinuxSyscalls/x64/Types.h\"\n#include \"Thunks.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/FileLoading.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/sstream.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXHeaderUtils/Filesystem.h>\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <algorithm>\n#include <alloca.h>\n#include <charconv>\n#include <functional>\n#include <linux/audit.h>\n#include <linux/seccomp.h>\n#include <memory>\n#include <regex>\n#include <sched.h>\n#include <span>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <string.h>\n#include <signal.h>\n#include <system_error>\n#include <syscall.h>\n#include <sys/mman.h>\n#include <sys/utsname.h>\n#include <unistd.h>\n\nnamespace FEX::HLE {\nclass SignalDelegator;\nSyscallHandler* _SyscallHandler {};\n\ntemplate<bool IncrementOffset, typename T>\nuint64_t GetDentsEmulation(int fd, T* dirp, uint32_t count) {\n  uint64_t Result = syscall(SYSCALL_DEF(getdents64), static_cast<uint64_t>(fd), dirp, static_cast<uint64_t>(count));\n\n  // Now copy back in to the array we were given\n  if (Result != -1) {\n    // If the outgoing d_ino is smaller than the incoming d_ino from the kernel\n    // Then we need to check for overflow before writing any of the data back\n    if constexpr (sizeof(decltype(FEX::HLE::x64::linux_dirent_64::d_ino)) > sizeof(decltype(T::d_ino))) {\n      uint64_t TmpOffset = 0;\n      while (TmpOffset < Result) {\n        FEX::HLE::x64::linux_dirent_64* Tmp = (FEX::HLE::x64::linux_dirent_64*)(reinterpret_cast<uint64_t>(dirp) + TmpOffset);\n        decltype(T::d_ino) Result_d_ino = Tmp->d_ino;\n\n        if (Result_d_ino != Tmp->d_ino) {\n          // The resulting d_ino truncated, return error\n          return -EOVERFLOW;\n        }\n        TmpOffset += Tmp->d_reclen;\n      }\n    }\n\n    uint64_t Offset = 0;\n    uint64_t TmpOffset = 0;\n    size_t OffsetIndex = 1;\n    // With how the emulation occurs we will always return a smaller buffer than what was given to us.\n    // We need to be careful with the in-place translation that occurs here, the data returning to the guest is guaranteed to be smaller\n    // than the data returned by getdents64.\n    // This means FEX is guaranteed to /never/ fill the full getdents buffer to the guest, but we may temporarily use it all.\n    while (TmpOffset < Result) {\n      T* Outgoing = (T*)(reinterpret_cast<uint64_t>(dirp) + Offset);\n      FEX::HLE::x64::linux_dirent_64* Tmp = (FEX::HLE::x64::linux_dirent_64*)(reinterpret_cast<uint64_t>(dirp) + TmpOffset);\n\n      if (!Tmp->d_reclen) {\n        break;\n      }\n\n      size_t NewRecLen = FEXCore::AlignUp(Tmp->d_reclen - (sizeof(std::remove_reference<decltype(*Tmp)>::type) - sizeof(*Outgoing)),\n                                          alignof(decltype(Tmp->d_ino)));\n      Outgoing->d_ino = Tmp->d_ino;\n\n      // 32-bit getdents can't safely handle d_off\n      // A safe way of emulating this is to just use an incrementing offset from 1\n      Outgoing->d_off = IncrementOffset ? OffsetIndex : Tmp->d_off;\n      size_t OffsetOfName = offsetof(std::remove_reference<decltype(*Tmp)>::type, d_name);\n      Outgoing->d_reclen = NewRecLen;\n\n      // Copies null character as well\n      size_t NameLength = Tmp->d_reclen - OffsetOfName - 1;\n      memmove(Outgoing->d_name, Tmp->d_name, NameLength);\n\n      // Copy the hidden d_type flag\n      Outgoing->d_name[Outgoing->d_reclen - offsetof(T, d_name) - 1] = Tmp->d_type;\n\n      TmpOffset += Tmp->d_reclen;\n\n      if (FEX::HLE::_SyscallHandler->FM.IsProtectedFile(fd, Outgoing->d_ino)) {\n        continue;\n      }\n\n      // Outgoing is 5 bytes smaller\n      Offset += NewRecLen;\n\n      ++OffsetIndex;\n    }\n    Result = Offset;\n  }\n  SYSCALL_ERRNO();\n}\n\ntemplate uint64_t GetDentsEmulation<false>(int, FEX::HLE::x64::linux_dirent*, uint32_t);\n\ntemplate uint64_t GetDentsEmulation<true>(int, FEX::HLE::x32::linux_dirent_32*, uint32_t);\n\nstatic fextl::string GetShebangInterpFile(std::span<char> Data) {\n  // File isn't large enough to even contain a shebang.\n  if (Data.size() <= 2) {\n    return {};\n  }\n\n  // Handle shebang files.\n  if (Data[0] == '#' && Data[1] == '!') {\n    fextl::string InterpreterLine {Data.begin() + 2, // strip off \"#!\" prefix\n                                   std::find(Data.begin(), Data.end(), '\\n')};\n    fextl::vector<std::string_view> ShebangArguments = FHU::ParseArgumentsFromString(InterpreterLine);\n\n    // Executable argument\n    fextl::string ShebangProgram(ShebangArguments[0]);\n\n    // If the filename is absolute then prepend the rootfs\n    // If it is relative then don't append the rootfs\n    if (ShebangProgram[0] == '/') {\n      ShebangProgram = FEX::HLE::_SyscallHandler->RootFSPath() + ShebangProgram;\n    }\n\n    if (FHU::Filesystem::Exists(ShebangProgram)) {\n      return ShebangProgram;\n    }\n  }\n\n  return {};\n}\n\nstatic fextl::string GetShebangInterpFD(int FD) {\n  // We don't know the state of the FD coming in since this might be a guest tracked FD.\n  // Need to be extra careful here not to adjust file offsets and status flags.\n  //\n  // Can't use dup since that makes the FD have the same file description backing both FDs.\n\n  // The maximum length of the shebang line is `#!` + 255 chars\n  std::array<char, 257> Header;\n  const auto ChunkSize = 257l;\n  const auto ReadSize = pread(FD, Header.data(), ChunkSize, 0);\n\n  return GetShebangInterpFile(std::span<char>(Header.data(), ReadSize));\n}\n\nstatic fextl::string GetShebangInterpFilename(const fextl::string& Filename) {\n  // Open the Filename to determine if it is a shebang file.\n  int FD = open(Filename.c_str(), O_RDONLY | O_CLOEXEC);\n  if (FD == -1) {\n    return {};\n  }\n\n  auto Interp = GetShebangInterpFD(FD);\n  close(FD);\n  return Interp;\n}\n\nuint64_t ExecveHandler(FEXCore::Core::CpuStateFrame* Frame, const char* pathname, char* const* argv, char* const* envp, ExecveAtArgs Args) {\n  auto SyscallHandler = FEX::HLE::_SyscallHandler;\n  Frame->Thread->CTX->FlushAndCloseCodeMap();\n\n  fextl::string Filename {};\n\n  fextl::string RootFS = SyscallHandler->RootFSPath();\n  ELFLoader::ELFContainer::ELFType Type {};\n  ELFLoader::ELFContainer::ELFType InterpreterType {};\n\n  // AT_EMPTY_PATH is only used if the pathname is empty.\n  const bool IsFDExec = (Args.flags & AT_EMPTY_PATH) && strlen(pathname) == 0;\n  fextl::string FDExecEnv;\n  fextl::string FDSeccompEnv;\n\n  fextl::string ShebangInterpreter {};\n\n  if (IsFDExec) {\n    Type = ELFLoader::ELFContainer::GetELFType(Args.dirfd);\n\n    ShebangInterpreter = GetShebangInterpFD(Args.dirfd);\n  } else {\n    // For absolute paths, check the rootfs first (if available)\n    if (pathname[0] == '/') {\n      auto Path = SyscallHandler->FM.GetEmulatedPath(pathname, true);\n      if (!Path.empty() && FHU::Filesystem::Exists(Path)) {\n        Filename = std::move(Path);\n      } else {\n        Filename = pathname;\n      }\n    } else {\n      Filename = pathname;\n    }\n\n    bool exists = FHU::Filesystem::Exists(Filename);\n    if (!exists) {\n      return -ENOENT;\n    }\n\n    int pid = getpid();\n\n    char PidSelfPath[50];\n    snprintf(PidSelfPath, 50, \"/proc/%i/exe\", pid);\n\n    if (strcmp(pathname, \"/proc/self/exe\") == 0 || strcmp(pathname, \"/proc/thread-self/exe\") == 0 || strcmp(pathname, PidSelfPath) == 0) {\n      // If the application is trying to execve `/proc/self/exe` or its variants,\n      // then we need to redirect this path to the true application path.\n      // This is because this path is a symlink to the executing application, which is always `FEX`.\n      // ex: JRE and shapez.io do this self-execution.\n      Filename = SyscallHandler->Filename();\n    }\n\n    Type = ELFLoader::ELFContainer::GetELFType(Filename);\n\n    ShebangInterpreter = GetShebangInterpFilename(Filename);\n  }\n\n  const bool IsShebang = !ShebangInterpreter.empty();\n  if (IsShebang) {\n    InterpreterType = ELFLoader::ELFContainer::GetELFType(ShebangInterpreter);\n  }\n\n  if (!IsShebang && Type == ELFLoader::ELFContainer::ELFType::TYPE_NONE) {\n    // If our interpeter doesn't support this file format AND ELF format is NONE then ENOEXEC\n    // binfmt_misc could end up handling this case but we can't know that without parsing binfmt_misc ourselves\n    // Return -ENOEXEC until proven otherwise\n    return -ENOEXEC;\n  }\n\n  fextl::vector<const char*> EnvpArgs {};\n  char* const* EnvpPtr = envp;\n  bool FDExecCopy {};\n\n  auto SeccompFD = SyscallHandler->SeccompEmulator.SerializeFilters(Frame);\n  const auto HasSeccomp = SeccompFD.has_value() && *SeccompFD != -1;\n\n  auto CloseSeccompFD = [&HasSeccomp, &SeccompFD]() {\n    if (HasSeccomp) {\n      close(*SeccompFD);\n    }\n  };\n\n  auto CloseFDExecFD = [&FDExecCopy, &Args]() {\n    if (FDExecCopy) {\n      close(Args.dirfd);\n    }\n  };\n\n  // If we don't have the interpreter installed we need to be extra careful for ENOEXEC\n  // Reasoning is that if we try executing a file from FEXLoader then this process loses the ENOEXEC flag\n  // Kernel does its own checks for file format support for this\n  // We can only call execve directly if we both have an interpreter installed AND were ran with the interpreter\n  // If the user ran FEX through FEXLoader then we must go down the emulated path\n  uint64_t Result {};\n\n  // In some cases the FD passed in to execveat needs to be copied.\n  const bool NeedsFDCopy = [&]() {\n    // No need for FD copy when not using FD.\n    if (!IsFDExec) {\n      return false;\n    }\n\n    if (SyscallHandler->IsHostKernelVersionAtLeast(999, 0, 0)) {\n      // Older kernel versions have a bug with the combination of binfmt_misc and anonymous file FDs that set CLOEXEC.\n      return false;\n    }\n\n    int Flags = fcntl(Args.dirfd, F_GETFD);\n    if (!(Flags & FD_CLOEXEC)) {\n      // No need for FD copy if FD_CLOEXEC isn't set.\n      return false;\n    }\n\n    return true;\n  }();\n\n  // If the FEX interpreter is installed then just execve the ELF file\n  // This will stay inside of our emulated environment since binfmt_misc will capture it\n  const bool IsBinfmtCompatible = SyscallHandler->IsInterpreterInstalled() && !NeedsFDCopy &&\n                                  (Type == ELFLoader::ELFContainer::ELFType::TYPE_X86_32 || Type == ELFLoader::ELFContainer::ELFType::TYPE_X86_64);\n\n  // We are trying to execute an ELF of a different architecture\n  // We can't know if we can support this without architecture specific checks and binfmt_misc parsing\n  // Just execve it and let the kernel handle the process\n  const bool IsOtherELF = Type == ELFLoader::ELFContainer::ELFType::TYPE_OTHER_ELF;\n\n  // Need to copy over envp variables if we are appending data.\n  // Only situation in which an envp copy needs to occur is if we are doing an FD execveat and binfmt_misc can't handle it.\n  // Additional tasks that require envp copying in the future:\n  // - seccomp inheritance\n  // - FEXServer FD inheritance (unshare(CLONE_NEWNET))\n  // - FD_CLOEXEC set on FD on anonymous file FD.\n  const bool NeedsEnvpCopy = (IsFDExec && !(IsBinfmtCompatible || IsOtherELF)) || HasSeccomp || NeedsFDCopy;\n\n  // We are trying to execute a shebang handled by a different architecture interpreter (e.g. /usr/bin/python from the host FS).\n  // In this case we just defer to the kernel.\n  const bool IsForeignShebang = (IsShebang && InterpreterType == ELFLoader::ELFContainer::ELFType::TYPE_OTHER_ELF);\n\n  if (NeedsEnvpCopy) {\n    if (envp) {\n      auto OldEnvp = envp;\n      while (*OldEnvp) {\n        ///< Copy the pointers to our own vector of environment variables.\n        EnvpArgs.emplace_back(*OldEnvp);\n        ++OldEnvp;\n      }\n    }\n\n    if (!IsBinfmtCompatible || NeedsFDCopy) {\n      if (NeedsFDCopy) {\n        // FEX needs the FD to live past execve when binfmt_misc isn't used,\n        // so duplicate the FD if FD_CLOEXEC is set, which removes the FD_CLOEXEC flag.\n        Args.dirfd = dup(Args.dirfd);\n        FDExecCopy = true;\n      }\n\n      // Remove AT_EMPTY_PATH flag now.\n      // We need to emulate this flag with `FEX_EXECVEFD` environment variable.\n      // If we passed this flag through to the real `execveat` then the target FD wouldn't get emulated by FEX.\n      Args.flags &= ~AT_EMPTY_PATH;\n\n      // Create the environment variable to pass the FD to our FEX.\n      // Needs to stick around until execveat completes.\n      FDExecEnv = fextl::fmt::format(\"FEX_EXECVEFD={}\", Args.dirfd);\n\n      // Insert the FD for FEX to track.\n      EnvpArgs.emplace_back(FDExecEnv.data());\n    }\n\n    if (HasSeccomp) {\n      // Create the environment variable to pass the FD to our FEX.\n      // Needs to stick around until execveat completes.\n      FDSeccompEnv = fextl::fmt::format(\"FEX_SECCOMPFD={}\", *SeccompFD);\n\n      // Insert the FD for FEX to track.\n      EnvpArgs.emplace_back(FDSeccompEnv.data());\n    }\n\n    // Emplace nullptr at the end to stop\n    EnvpArgs.emplace_back(nullptr);\n\n    ///< Set the EnvpPtr to our copy.\n    EnvpPtr = const_cast<char* const*>(EnvpArgs.data());\n  }\n\n  if (!IsFDExec && (IsForeignShebang || IsOtherELF || !IsBinfmtCompatible)) {\n    // With a merged RootFS, the entire real filesystem is visible through the rootfs\n    // prefix. If we are executing a non-emulated binary, we should do so through the host\n    // path.\n\n    auto Path = SyscallHandler->FM.GetHostPath(Filename, true);\n    if (!Path.empty() && FHU::Filesystem::Exists(Path)) {\n      Filename = std::move(Path);\n    }\n  }\n\n  if (IsBinfmtCompatible || IsOtherELF || IsForeignShebang) {\n    Result = ::syscall(SYS_execveat, Args.dirfd, Filename.c_str(), argv, EnvpPtr, Args.flags);\n    CloseSeccompFD();\n    CloseFDExecFD();\n    SYSCALL_ERRNO();\n  }\n\n  // If we are executing an emulated interpreter shebang file through the loader,\n  // we need to strip the RootFS prefix. The loader will pass this filename to the\n  // interpreter as-is, which will access it using RootFS redirection.\n  // Note that unlike above, the prefix is stripped unconditionally (AliasedOnly=false),\n  // and the script path need not exist in the host.\n  if (IsShebang) {\n    auto Path = SyscallHandler->FM.GetHostPath(Filename, false);\n    if (!Path.empty()) {\n      Filename = std::move(Path);\n    }\n  }\n\n  // We don't have an interpreter installed or we are executing a non-ELF executable\n  // We now need to munge the arguments\n  const char NullString[] = \"\";\n  fextl::vector<const char*> ExecveArgs = SyscallHandler->GetCodeLoader()->GetExecveArguments();\n\n  if (argv) {\n    // Overwrite the filename with the new one we are redirecting to\n    ExecveArgs.emplace_back(Filename.c_str());\n\n    auto OldArgv = argv;\n\n    // It is valid to provide nullptr first argument.\n    if (*OldArgv) {\n      // Skip filename argument\n      ++OldArgv;\n      while (*OldArgv) {\n        // Append the arguments together\n        ExecveArgs.emplace_back(*OldArgv);\n        ++OldArgv;\n      }\n    } else {\n      // Linux kernel will stick an empty argument in to the argv list if none are provided.\n      ExecveArgs.emplace_back(NullString);\n    }\n\n    // Emplace nullptr at the end to stop\n    ExecveArgs.emplace_back(nullptr);\n  }\n\n  Result = ::syscall(SYS_execveat, Args.dirfd, \"/proc/self/exe\", const_cast<char* const*>(ExecveArgs.data()), EnvpPtr, Args.flags);\n  CloseSeccompFD();\n  CloseFDExecFD();\n\n  SYSCALL_ERRNO();\n}\n\nstatic bool AnyFlagsSet(uint64_t Flags, uint64_t Mask) {\n  return (Flags & Mask) != 0;\n}\n\nstatic bool AllFlagsSet(uint64_t Flags, uint64_t Mask) {\n  return (Flags & Mask) == Mask;\n}\n\nstruct StackFrameData {\n  FEX::HLE::ThreadStateObject* Thread {};\n  FEXCore::Context::Context* CTX {};\n  FEXCore::Core::CpuStateFrame NewFrame {};\n  FEX::HLE::clone3_args GuestArgs {};\n};\n\nstruct StackFramePlusRet {\n  uint64_t Ret;\n  StackFrameData Data;\n  uint64_t Pad;\n};\n\n[[noreturn]]\nstatic void CloneBody(StackFrameData* Data, bool NeedsDataFree) {\n  uint64_t Result = FEX::HLE::HandleNewClone(Data->Thread, Data->CTX, &Data->NewFrame, &Data->GuestArgs);\n  auto Stack = Data->GuestArgs.NewStack;\n  if (NeedsDataFree) {\n    FEXCore::Allocator::free(Data);\n  }\n\n  FEX::LinuxEmulation::Threads::DeallocateStackObjectAndExit(Stack, Result);\n  FEX_UNREACHABLE;\n}\n\n[[noreturn]]\nstatic void Clone3HandlerRet() {\n  StackFrameData* Data = (StackFrameData*)alloca(0);\n  CloneBody(Data, false);\n}\n\nstatic int Clone2HandlerRet(void* arg) {\n  StackFrameData* Data = (StackFrameData*)arg;\n  CloneBody(Data, true);\n}\n\n// Clone3 flags\n#ifndef CLONE_CLEAR_SIGHAND\n#define CLONE_CLEAR_SIGHAND 0x100000000ULL\n#endif\n#ifndef CLONE_INTO_CGROUP\n#define CLONE_INTO_CGROUP 0x200000000ULL\n#endif\n#ifndef CLONE_NEWTIME\n// Overlaps CSIGNAL, can only be used with clone3 and not clone2\n#define CLONE_NEWTIME 0x00000080ULL\n#endif\n\nstatic void PrintFlags(uint64_t Flags) {\n#define FLAGPRINT(x, y) \\\n  if (Flags & (y)) LogMan::Msg::IFmt(\"\\tFlag: \" #x)\n  FLAGPRINT(CSIGNAL, 0x000000FF);\n  FLAGPRINT(CLONE_VM, 0x00000100);\n  FLAGPRINT(CLONE_FS, 0x00000200);\n  FLAGPRINT(CLONE_FILES, 0x00000400);\n  FLAGPRINT(CLONE_SIGHAND, 0x00000800);\n  FLAGPRINT(CLONE_PTRACE, 0x00002000);\n  FLAGPRINT(CLONE_VFORK, 0x00004000);\n  FLAGPRINT(CLONE_PARENT, 0x00008000);\n  FLAGPRINT(CLONE_THREAD, 0x00010000);\n  FLAGPRINT(CLONE_NEWNS, 0x00020000);\n  FLAGPRINT(CLONE_SYSVSEM, 0x00040000);\n  FLAGPRINT(CLONE_SETTLS, 0x00080000);\n  FLAGPRINT(CLONE_PARENT_SETTID, 0x00100000);\n  FLAGPRINT(CLONE_CHILD_CLEARTID, 0x00200000);\n  FLAGPRINT(CLONE_DETACHED, 0x00400000);\n  FLAGPRINT(CLONE_UNTRACED, 0x00800000);\n  FLAGPRINT(CLONE_CHILD_SETTID, 0x01000000);\n  FLAGPRINT(CLONE_NEWCGROUP, 0x02000000);\n  FLAGPRINT(CLONE_NEWUTS, 0x04000000);\n  FLAGPRINT(CLONE_NEWIPC, 0x08000000);\n  FLAGPRINT(CLONE_NEWUSER, 0x10000000);\n  FLAGPRINT(CLONE_NEWPID, 0x20000000);\n  FLAGPRINT(CLONE_NEWNET, 0x40000000);\n  FLAGPRINT(CLONE_IO, 0x80000000);\n  FLAGPRINT(CLONE_PIDFD, 0x00001000);\n#undef FLAGPRINT\n};\n\nstatic uint64_t Clone2Handler(FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::clone3_args* args) {\n  StackFrameData* Data = (StackFrameData*)FEXCore::Allocator::malloc(sizeof(StackFrameData));\n  Data->Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n  Data->CTX = Frame->Thread->CTX;\n  Data->GuestArgs = *args;\n\n  // Create a copy of the parent frame\n  memcpy(&Data->NewFrame, Frame, sizeof(FEXCore::Core::CpuStateFrame));\n\n  // Remove flags that will break us\n  constexpr uint64_t INVALID_FOR_HOST = CLONE_SETTLS;\n  uint64_t Flags = (args->args.flags & ~INVALID_FOR_HOST) | args->args.exit_signal;\n  uint64_t Result = ::clone(Clone2HandlerRet,                                    // To be called function\n                            (void*)((uint64_t)args->NewStack + args->StackSize), // Stack\n                            Flags,                                               // Flags\n                            Data,                                                // Argument\n                            (pid_t*)args->args.parent_tid,                       // parent_tid\n                            0,                                                   // XXX: What is correct for this? tls\n                            (pid_t*)args->args.child_tid);                       // child_tid\n\n  // Only parent will get here\n  SYSCALL_ERRNO();\n}\n\nstatic uint64_t Clone3Handler(FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::clone3_args* args) {\n  constexpr size_t Offset = sizeof(StackFramePlusRet);\n  StackFramePlusRet* Data = (StackFramePlusRet*)(reinterpret_cast<uint64_t>(args->NewStack) + args->StackSize - Offset);\n  Data->Ret = (uint64_t)Clone3HandlerRet;\n  Data->Data.Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n  Data->Data.CTX = Frame->Thread->CTX;\n  Data->Data.GuestArgs = *args;\n\n  FEX::HLE::kernel_clone3_args HostArgs {};\n  HostArgs.flags = args->args.flags;\n  HostArgs.pidfd = args->args.pidfd;\n  HostArgs.child_tid = args->args.child_tid;\n  HostArgs.parent_tid = args->args.parent_tid;\n  HostArgs.exit_signal = args->args.exit_signal;\n  // Host stack is always created\n  HostArgs.stack = reinterpret_cast<uint64_t>(args->NewStack);\n  HostArgs.stack_size = args->StackSize - Offset; // Needs to be 16 byte aligned\n  HostArgs.tls = 0;                               // XXX: What is correct for this?\n  HostArgs.set_tid = args->args.set_tid;\n  HostArgs.set_tid_size = args->args.set_tid_size;\n  HostArgs.cgroup = args->args.cgroup;\n\n  // Create a copy of the parent frame\n  memcpy(&Data->Data.NewFrame, Frame, sizeof(FEXCore::Core::CpuStateFrame));\n  uint64_t Result = ::syscall(SYSCALL_DEF(clone3), &HostArgs, sizeof(HostArgs));\n\n  // Only parent will get here\n  SYSCALL_ERRNO();\n};\n\nuint64_t CloneHandler(FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::clone3_args* args) {\n  uint64_t flags = args->args.flags;\n\n  if (flags & CLONE_CLEAR_SIGHAND) {\n    // CLONE_CLEAR_SIGHAND was added in kernel 5.5. FEX doesn't properly support this.\n    // glibc started using this flag in 2.38 as an optimization for posix_spawn.\n    // If clone returns EINVAL or ENOSYS then it will fallback to the non-optimized path.\n    LogMan::Msg::IFmt(\"CLONE_CLEAR_SIGHAND passed to clone3. Returning EINVAL.\");\n    return -EINVAL;\n  }\n\n  auto HasUnhandledFlags = [](FEX::HLE::clone3_args* args) -> bool {\n    constexpr uint64_t UNHANDLED_FLAGS = CLONE_NEWNS |\n                                         // CLONE_UNTRACED |\n                                         CLONE_NEWCGROUP | CLONE_NEWUTS | CLONE_NEWIPC | CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWNET |\n                                         CLONE_IO | CLONE_CLEAR_SIGHAND | CLONE_INTO_CGROUP;\n\n    if ((args->args.flags & UNHANDLED_FLAGS) != 0) {\n      // Basic unhandled flags\n      return true;\n    }\n\n    if (args->args.set_tid_size > 0) {\n      // set_tid isn't exposed through anything other than clone3\n      return true;\n    }\n\n    if (args->Type == TypeOfClone::TYPE_CLONE3) {\n      if (AnyFlagsSet(args->args.flags, CLONE_NEWTIME)) {\n        // New time namespace overlaps with CSIGNAL, only available in clone3\n        return true;\n      }\n    }\n\n    if (AnyFlagsSet(args->args.flags, CLONE_THREAD)) {\n      if (!AllFlagsSet(args->args.flags, CLONE_SYSVSEM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND)) {\n        LogMan::Msg::IFmt(\"clone: CLONE_THREAD: Unsupported flags w/ CLONE_THREAD (Shared Resources), {:X}\", args->args.flags);\n        return false;\n      }\n    } else {\n      if (AnyFlagsSet(args->args.flags, CLONE_SYSVSEM | CLONE_SIGHAND | CLONE_VM)) {\n        // CLONE_VM is particularly nasty here\n        // Memory regions at the point of clone(More similar to a fork) are shared\n        LogMan::Msg::IFmt(\"clone: Unsupported flags w/o CLONE_THREAD (Shared Resources), {:X}\", args->args.flags);\n        return false;\n      }\n    }\n\n    // We support everything here\n    return false;\n  };\n\n  // If there are flags that can't be handled regularly then we need to hand off to the true clone handler\n  if (HasUnhandledFlags(args)) {\n    if (!AnyFlagsSet(flags, CLONE_THREAD)) {\n      // Has an unsupported flag\n      // Fall to a handler that can handle this case\n\n      args->SignalMask = ~0ULL;\n      ::syscall(SYS_rt_sigprocmask, SIG_SETMASK, &args->SignalMask, &args->SignalMask, sizeof(args->SignalMask));\n\n      // Need to create a stack for the host thread.\n      // LockBeforeFork grabs the allocator mutex to block allocations temporarily, so this must be allocated before\n      args->StackSize = FEX::LinuxEmulation::Threads::STACK_SIZE;\n      args->NewStack = FEX::LinuxEmulation::Threads::AllocateStackObject();\n\n      FEX::HLE::_SyscallHandler->LockBeforeFork(Frame->Thread);\n\n      uint64_t Result {};\n      if (args->Type == TYPE_CLONE2) {\n        Result = Clone2Handler(Frame, args);\n      } else {\n        Result = Clone3Handler(Frame, args);\n      }\n\n      if (Result != 0) {\n        // Parent\n        // Unlock the mutexes on both sides of the fork\n        FEX::HLE::_SyscallHandler->UnlockAfterFork(Frame->Thread, false);\n\n        ::syscall(SYS_rt_sigprocmask, SIG_SETMASK, &args->SignalMask, nullptr, sizeof(args->SignalMask));\n      }\n      return Result;\n    } else {\n      LogMan::Msg::IFmt(\"Unsupported flag with CLONE_THREAD. This breaks TLS, falling down classic thread path\");\n      PrintFlags(flags);\n    }\n  }\n\n  constexpr uint64_t TASK_MAX = (1ULL << 48); // 48-bits until we can query the host side VA sanely. AArch64 doesn't expose this in cpuinfo\n  if (args->args.tls && args->args.tls >= TASK_MAX) {\n    return -EPERM;\n  }\n\n  auto Thread = Frame->Thread;\n\n  if (AnyFlagsSet(flags, CLONE_PTRACE)) {\n    PrintFlags(flags);\n    LogMan::Msg::DFmt(\"clone: Ptrace* not supported\");\n  }\n\n  if (!(flags & CLONE_THREAD)) {\n    // CLONE_PARENT is ignored (Implied by CLONE_THREAD)\n    return FEX::HLE::ForkGuest(Thread, Frame, args);\n  } else {\n    auto NewThread = FEX::HLE::CreateNewThread(Thread->CTX, Frame, args);\n\n    // Return the new threads TID\n    uint64_t Result = NewThread->ThreadInfo.TID;\n\n    if (flags & CLONE_VFORK) {\n      // If VFORK is set then the calling process is suspended until the thread exits with execve or exit\n      NewThread->ExecutionThread->join(nullptr);\n\n      // Normally a thread cleans itself up on exit. But because we need to join, we are now responsible\n      FEX::HLE::_SyscallHandler->TM.DestroyThread(NewThread);\n    }\n\n    SYSCALL_ERRNO();\n  }\n};\n\nuint64_t SyscallHandler::HandleBRK(FEXCore::Core::CpuStateFrame* Frame, void* Addr) {\n  std::lock_guard<std::mutex> lk(MMapMutex);\n\n  uint64_t Result;\n\n  if (Addr == nullptr) { // Just wants to get the location of the program break atm\n    Result = DataSpace + DataSpaceSize;\n  } else {\n    // Allocating out data space\n    uint64_t NewEnd = reinterpret_cast<uint64_t>(Addr);\n    if (NewEnd < DataSpace) {\n      // Not allowed to move brk end below original start\n      // Set the size to zero\n      DataSpaceSize = 0;\n\n      // Munmap the whole space.\n      [[maybe_unused]] auto ok = GuestMunmap(Frame->Thread, reinterpret_cast<void*>(DataSpace), DataSpaceMappedSize);\n      LOGMAN_THROW_A_FMT(ok != -1, \"Munmap failed\");\n      DataSpaceMappedSize = 0;\n    } else {\n      uint64_t NewSize = NewEnd - DataSpace;\n      uint64_t NewSizeAligned = FEXCore::AlignUp(NewSize, FEXCore::Utils::FEX_PAGE_SIZE);\n\n      if (NewSizeAligned < DataSpaceMappedSize) {\n        // If we are shrinking the brk then munmap the ranges\n        // That way we gain the memory back and also give the application zero pages if it allocates again\n        // DataspaceMaxSize is always page aligned\n\n        uint64_t RemainingSize = DataSpaceMappedSize - NewSizeAligned;\n        // We have pages we can unmap\n        auto ok = GuestMunmap(Frame->Thread, reinterpret_cast<void*>(DataSpace + NewSizeAligned), RemainingSize);\n        LOGMAN_THROW_A_FMT(ok != -1, \"Munmap failed\");\n\n        DataSpaceMappedSize = NewSizeAligned;\n      } else if (NewSize > DataSpaceMappedSize) {\n        uint64_t AllocateNewSize = FEXCore::AlignUp(NewSize, FEXCore::Utils::FEX_PAGE_SIZE) - DataSpaceMappedSize;\n        if (!Is64BitMode() && (DataSpace + DataSpaceMappedSize + AllocateNewSize > 0x1'0000'0000ULL)) {\n          // If we are 32bit and we tried going about the 32bit limit then out of memory\n          return DataSpace + DataSpaceSize;\n        }\n\n        uint64_t NewBRK {};\n        NewBRK = (uint64_t)GuestMmap(Frame->Thread, (void*)(DataSpace + DataSpaceMappedSize), AllocateNewSize, PROT_READ | PROT_WRITE,\n                                     MAP_FIXED_NOREPLACE | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n\n        if (FEX::HLE::HasSyscallError(NewBRK)) {\n          // If we couldn't allocate a new region then out of memory\n          return DataSpace + DataSpaceSize;\n        } else {\n          // Increase our BRK size\n          DataSpaceMappedSize += AllocateNewSize;\n        }\n      }\n\n      DataSpaceSize = NewSize;\n    }\n    Result = DataSpace + DataSpaceSize;\n  }\n  return Result;\n}\n\nvoid SyscallHandler::DefaultProgramBreak(uint64_t Base, uint64_t Size) {\n  DataSpace = Base;\n\n  // The frontend passes this a full 8MB of SBRK space that is mapped PROT_READ | PROT_WRITE.\n  // This ensures there is some free space in front of brk, but isn't required to be reserved.\n  // Unmap it now to ensure other allocations can be put in the intersecting range.\n  [[maybe_unused]] auto ok = GuestMunmap(nullptr, reinterpret_cast<void*>(DataSpace), Size);\n  LOGMAN_THROW_A_FMT(ok != -1, \"Munmap failed\");\n  DataSpaceMappedSize = 0;\n}\n\nSyscallHandler::SyscallHandler(FEXCore::Context::Context* _CTX, FEX::HLE::SignalDelegator* _SignalDelegation, FEX::HLE::ThunkHandler* ThunkHandler)\n  : TM {_CTX, _SignalDelegation}\n  , SeccompEmulator {this, _SignalDelegation}\n  , FM {_CTX}\n  , CTX {_CTX}\n  , SignalDelegation {_SignalDelegation}\n  , ThunkHandler {ThunkHandler} {\n  FEX::HLE::_SyscallHandler = this;\n  HostKernelVersion = CalculateHostKernelVersion();\n  GuestKernelVersion = CalculateGuestKernelVersion();\n  Alloc32Handler = FEX::HLE::Create32BitAllocator();\n\n  SignalDelegation->RegisterHostSignalHandler(SIGSEGV, HandleSegfault, true);\n\n  ExtendedMetaData = FEX::VolatileMetadata::ParseExtendedVolatileMetadata(FEXCore::Config::Get_EXTENDEDVOLATILEMETADATA()());\n}\n\nSyscallHandler::~SyscallHandler() {\n  FEXCore::Allocator::munmap(reinterpret_cast<void*>(DataSpace), DataSpaceMappedSize);\n}\n\nuint32_t SyscallHandler::CalculateHostKernelVersion() {\n  struct utsname buf {};\n  if (uname(&buf) == -1) {\n    return 0;\n  }\n\n  uint32_t Major {};\n  uint32_t Minor {};\n  uint32_t Patch {};\n\n  // Parse kernel version in the form of `<Major>.<Minor>.<Patch>[Optional Data]`\n  const auto End = buf.release + sizeof(buf.release);\n  auto Results = std::from_chars(buf.release, End, Major, 10);\n  Results = std::from_chars(Results.ptr + 1, End, Minor, 10);\n  Results = std::from_chars(Results.ptr + 1, End, Patch, 10);\n\n  return (Major << 24) | (Minor << 16) | Patch;\n}\n\nuint32_t SyscallHandler::CalculateGuestKernelVersion() {\n  // We currently only emulate a kernel between the ranges of Kernel 5.15.0 and 6.11.0\n  return std::max(KernelVersion(5, 15), std::min(KernelVersion(6, 11), GetHostKernelVersion()));\n}\n\nuint64_t SyscallHandler::HandleSyscall(FEXCore::Core::CpuStateFrame* Frame, FEXCore::HLE::SyscallArguments* Args) {\n  // Grab the return address which will be inside the JIT.\n  const uint64_t JITPC = reinterpret_cast<uint64_t>(__builtin_extract_return_addr(__builtin_return_address(0)));\n\n  const auto SeccompResult = SeccompEmulator.ExecuteFilter(Frame, JITPC, Args);\n\n  if (SeccompResult.EarlyReturn) {\n    return SeccompResult.Result;\n  }\n\n  if (Args->Argument[0] >= Definitions.size()) {\n    return -ENOSYS;\n  }\n\n  auto& Def = Definitions[Args->Argument[0]];\n  uint64_t Result {};\n  switch (Def.NumArgs) {\n  case 0: Result = std::invoke(Def.Ptr0, Frame); break;\n  case 1: Result = std::invoke(Def.Ptr1, Frame, Args->Argument[1]); break;\n  case 2: Result = std::invoke(Def.Ptr2, Frame, Args->Argument[1], Args->Argument[2]); break;\n  case 3: Result = std::invoke(Def.Ptr3, Frame, Args->Argument[1], Args->Argument[2], Args->Argument[3]); break;\n  case 4: Result = std::invoke(Def.Ptr4, Frame, Args->Argument[1], Args->Argument[2], Args->Argument[3], Args->Argument[4]); break;\n  case 5:\n    Result = std::invoke(Def.Ptr5, Frame, Args->Argument[1], Args->Argument[2], Args->Argument[3], Args->Argument[4], Args->Argument[5]);\n    break;\n  case 6:\n    Result = std::invoke(Def.Ptr6, Frame, Args->Argument[1], Args->Argument[2], Args->Argument[3], Args->Argument[4], Args->Argument[5],\n                         Args->Argument[6]);\n    break;\n  // for missing syscalls\n  case 255: return std::invoke(Def.Ptr1, Frame, Args->Argument[0]);\n  default:\n    LOGMAN_MSG_A_FMT(\"Unhandled syscall: {}\", Args->Argument[0]);\n    return -1;\n    break;\n  }\n#ifdef DEBUG_STRACE\n  Strace(Args, Result);\n#endif\n  return Result;\n}\n\n#ifdef DEBUG_STRACE\nvoid SyscallHandler::Strace(FEXCore::HLE::SyscallArguments* Args, uint64_t Ret) {\n  auto& Def = Definitions[Args->Argument[0]];\n  switch (Def.NumArgs) {\n  case 0: LogMan::Msg::DFmt(Def.StraceFmt.c_str(), Ret); break;\n  case 1: LogMan::Msg::DFmt(Def.StraceFmt.c_str(), Args->Argument[1], Ret); break;\n  case 2: LogMan::Msg::DFmt(Def.StraceFmt.c_str(), Args->Argument[1], Args->Argument[2], Ret); break;\n  case 3: LogMan::Msg::DFmt(Def.StraceFmt.c_str(), Args->Argument[1], Args->Argument[2], Args->Argument[3], Ret); break;\n  case 4: LogMan::Msg::DFmt(Def.StraceFmt.c_str(), Args->Argument[1], Args->Argument[2], Args->Argument[3], Args->Argument[4], Ret); break;\n  case 5:\n    LogMan::Msg::DFmt(Def.StraceFmt.c_str(), Args->Argument[1], Args->Argument[2], Args->Argument[3], Args->Argument[4], Args->Argument[5], Ret);\n    break;\n  case 6:\n    LogMan::Msg::DFmt(Def.StraceFmt.c_str(), Args->Argument[1], Args->Argument[2], Args->Argument[3], Args->Argument[4], Args->Argument[5],\n                      Args->Argument[6], Ret);\n    break;\n  default: break;\n  }\n}\n#endif\n\nuint64_t UnimplementedSyscall(FEXCore::Core::CpuStateFrame* Frame, uint64_t SyscallNumber) {\n  ERROR_AND_DIE_FMT(\"Unhandled system call: {}\", SyscallNumber);\n  return -ENOSYS;\n}\n\nuint64_t UnimplementedSyscallSafe(FEXCore::Core::CpuStateFrame* Frame, uint64_t SyscallNumber) {\n  return -ENOSYS;\n}\n\nvoid SyscallHandler::LockBeforeFork(FEXCore::Core::InternalThreadState* Thread) {\n  TM.LockBeforeFork();\n  Thread->CTX->LockBeforeFork(Thread);\n  VMATracking.Mutex.lock();\n}\n\nvoid SyscallHandler::UnlockAfterFork(FEXCore::Core::InternalThreadState* LiveThread, bool Child) {\n  if (Child) {\n    // Code maps are closed upon fork in the child\n    FM.SetProtectedCodeMapFD(-1);\n\n    VMATracking.Mutex.StealAndDropActiveLocks();\n  } else {\n    VMATracking.Mutex.unlock();\n  }\n\n  CTX->UnlockAfterFork(LiveThread, Child);\n\n  // Clear all the other threads that are being tracked\n  TM.UnlockAfterFork(LiveThread, Child);\n}\n\nvoid SyscallHandler::RegisterTLSState(FEX::HLE::ThreadStateObject* Thread) {\n  SignalDelegation->RegisterTLSState(Thread);\n  ThunkHandler->RegisterTLSState(Thread);\n}\n\nvoid SyscallHandler::UninstallTLSState(FEX::HLE::ThreadStateObject* Thread) {\n  SignalDelegation->UninstallTLSState(Thread);\n}\n\nstatic bool isHEX(char c) {\n  return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f');\n}\n\nfextl::unique_ptr<FEXCore::HLE::SourcecodeMap> SyscallHandler::GenerateMap(std::string_view GuestBinaryFile, std::string_view GuestBinaryFileId) {\n  ELFParser GuestELF;\n\n  if (!GuestELF.ReadElf(fextl::string(GuestBinaryFile))) {\n    LogMan::Msg::DFmt(\"GenerateMap: '{}' is not an elf file?\", GuestBinaryFile);\n    return {};\n  }\n\n  struct stat GuestBinaryFileStat;\n\n  if (stat(GuestBinaryFile.data(), &GuestBinaryFileStat)) {\n    LogMan::Msg::DFmt(\"GenerateMap: failed to stat '{}'\", GuestBinaryFile);\n    return {};\n  }\n\n  const auto FexSrcPath = fextl::fmt::format(\"{}/fexsrc\", FEXCore::Config::GetDataDirectory());\n\n  if (!FHU::Filesystem::CreateDirectories(FexSrcPath)) {\n    LogMan::Msg::DFmt(\"GenerateMap: failed to create_directories '{}'\", FexSrcPath);\n    return {};\n  }\n\n  auto GuestSourceFile = fextl::fmt::format(\"{}/{}.src\", FexSrcPath, GuestBinaryFileId);\n\n  struct stat GuestSourceFileStat;\n\n  if (stat(GuestSourceFile.data(), &GuestSourceFileStat) != 0 || GuestBinaryFileStat.st_mtime > GuestSourceFileStat.st_mtime) {\n    LogMan::Msg::DFmt(\"GenerateMap: Generating source for '{}'\", GuestBinaryFile);\n    auto command = fextl::fmt::format(\"x86_64-linux-gnu-objdump -SC \\'{}\\' > '{}'\", GuestBinaryFile, GuestSourceFile);\n    if (system(command.c_str()) != 0) {\n      LogMan::Msg::DFmt(\"GenerateMap: '{}' failed\", command);\n      return {};\n    }\n  }\n\n  const auto GuestIndexFile = fextl::fmt::format(\"{}/{}.idx\", FexSrcPath, GuestBinaryFileId);\n  struct stat GuestIndexFileStat;\n\n  bool GenerateIndex = stat(GuestIndexFile.data(), &GuestIndexFileStat) != 0 || GuestSourceFileStat.st_mtime > GuestIndexFileStat.st_mtime;\n\n  constexpr char SrcHeaderString[] = \"fexsrcindex0\";\n  if (!GenerateIndex) {\n    // Index file de-serialization\n    LogMan::Msg::DFmt(\"GenerateMap: Reading index '{}'\", GuestIndexFile);\n\n    int FD = ::open(GuestIndexFile.c_str(), O_RDONLY | O_CLOEXEC);\n\n    if (FD == -1) {\n      LogMan::Msg::DFmt(\"GenerateMap: Failed to open '{}'\", GuestIndexFile);\n      goto DoGenerate;\n    }\n\n    //\"fexsrcindex0\"\n    char filemagic[12];\n    ::read(FD, filemagic, sizeof(filemagic));\n    if (memcmp(filemagic, SrcHeaderString, sizeof(filemagic)) != 0) {\n      LogMan::Msg::DFmt(\"GenerateMap: '{}' has invalid magic '{}'\", GuestIndexFile, filemagic);\n      close(FD);\n      goto DoGenerate;\n    }\n\n    auto rv = fextl::make_unique<FEXCore::HLE::SourcecodeMap>();\n\n    {\n      auto len = rv->SourceFile.size();\n      ::read(FD, (char*)&len, sizeof(len));\n      rv->SourceFile.resize(len);\n      ::read(FD, rv->SourceFile.data(), len);\n    }\n\n    {\n      auto len = rv->SortedLineMappings.size();\n\n      ::read(FD, (char*)&len, sizeof(len));\n\n      rv->SortedLineMappings.resize(len);\n\n      for (auto& Mapping : rv->SortedLineMappings) {\n        ::read(FD, (char*)&Mapping.FileGuestBegin, sizeof(Mapping.FileGuestBegin));\n        ::read(FD, (char*)&Mapping.FileGuestEnd, sizeof(Mapping.FileGuestEnd));\n        ::read(FD, (char*)&Mapping.LineNumber, sizeof(Mapping.LineNumber));\n      }\n    }\n\n    {\n      auto len = rv->SortedSymbolMappings.size();\n\n      ::read(FD, (char*)&len, sizeof(len));\n\n      rv->SortedSymbolMappings.resize(len);\n\n      for (auto& Mapping : rv->SortedSymbolMappings) {\n        ::read(FD, (char*)&Mapping.FileGuestBegin, sizeof(Mapping.FileGuestBegin));\n        ::read(FD, (char*)&Mapping.FileGuestEnd, sizeof(Mapping.FileGuestEnd));\n\n        {\n          auto len = Mapping.Name.size();\n          ::read(FD, (char*)&len, sizeof(len));\n          Mapping.Name.resize(len);\n          ::read(FD, Mapping.Name.data(), len);\n        }\n      }\n    }\n\n    LogMan::Msg::DFmt(\"GenerateMap: Finished reading index\");\n    close(FD);\n    return rv;\n  } else {\n// objdump output parsing,  index generation, index file serialization\nDoGenerate:\n    LogMan::Msg::DFmt(\"GenerateMap: Generating index for '{}'\", GuestSourceFile);\n\n    fextl::string SourceData;\n    if (!FEXCore::FileLoading::LoadFile(SourceData, GuestSourceFile)) {\n      LogMan::Msg::DFmt(\"GenerateMap: Failed to open '{}'\", GuestSourceFile);\n      return {};\n    }\n    fextl::istringstream Stream(SourceData);\n\n    constexpr int USER_PERMS = S_IRWXU | S_IRWXG | S_IRWXO;\n    int IndexStream = ::open(GuestIndexFile.c_str(), O_CREAT | O_WRONLY | O_APPEND | O_CLOEXEC, USER_PERMS);\n\n    if (IndexStream == -1) {\n      LogMan::Msg::DFmt(\"GenerateMap: Failed to open '{}' for writing\", GuestIndexFile);\n      return {};\n    }\n\n    ::write(IndexStream, SrcHeaderString, strlen(SrcHeaderString));\n\n    // objdump parsing\n    fextl::string Line;\n    int LineNum = 0;\n\n    bool PreviousLineWasEmpty = false;\n\n    uintptr_t LastSymbolOffset {};\n    uintptr_t CurrentSymbolOffset {};\n    fextl::string LastSymbolName;\n\n    uintptr_t LastOffset {};\n    uintptr_t CurrentOffset {};\n    int LastOffsetLine;\n\n    auto rv = fextl::make_unique<FEXCore::HLE::SourcecodeMap>();\n\n    rv->SourceFile = std::move(GuestSourceFile);\n\n    auto EndSymbol = [&] {\n      if (LastSymbolOffset) {\n        rv->SortedSymbolMappings.push_back({LastSymbolOffset, CurrentSymbolOffset, LastSymbolName});\n\n        // LogMan::Msg::DFmt(\"Ended Symbol {} - {:x}...{:x}\", LastSymbolName, LastSymbolOffset, CurrentSymbolOffset);\n      }\n      LastSymbolOffset = {};\n    };\n\n    auto EndLine = [&] {\n      if (LastOffset) {\n        rv->SortedLineMappings.push_back({LastOffset, CurrentOffset, LastOffsetLine});\n\n        // LogMan::Msg::DFmt(\"Ended Line {} - {:x}...{:x}\", LastOffsetLine, LastOffset, CurrentOffset);\n      }\n      LastOffset = {};\n    };\n\n    while (std::getline(Stream, Line)) {\n      LineNum++;\n\n      auto LineIsEmpty = Line.empty();\n\n      if (LineIsEmpty) {\n        PreviousLineWasEmpty = true;\n      } else {\n\n        // LogMan::Msg::DFmt(\"Line: '{}'\", Line);\n\n        if (isHEX(Line[0])) {\n          fextl::string addr;\n          int offs = 1;\n          for (; offs < Line.size() && !isspace(Line[offs]); offs++)\n            ;\n\n          if (offs == Line.size()) {\n            continue;\n          }\n          if (offs != 8 && offs != 16) {\n            continue;\n          }\n\n          auto VAOffset = std::strtoul(Line.substr(0, offs).c_str(), nullptr, 16);\n\n          auto FileOffset = GuestELF.VAToFile(VAOffset);\n\n          if (FileOffset == 0) {\n            LogMan::Msg::EFmt(\"File Offset {:x} did not map to file?! {}\", VAOffset, Line);\n          }\n\n          CurrentSymbolOffset = FileOffset;\n\n          if (PreviousLineWasEmpty) {\n            EndSymbol();\n          }\n          LastSymbolOffset = CurrentSymbolOffset;\n\n          for (; offs < Line.size() && Line[offs] != '<'; offs++)\n            ;\n\n          if (offs == Line.size()) {\n            continue;\n          }\n\n          offs++;\n\n          LastSymbolName = Line.substr(offs, Line.size() - 2 - offs);\n\n          // LogMan::Msg::DFmt(\"Symbol {} @ {:x} -> Line {}\", LastSymbolName, LastSymbolOffset, LineNum);\n        } else if (isspace(Line[0])) {\n          int offs = 1;\n          for (; offs < Line.size() && isspace(Line[offs]); offs++)\n            ;\n\n          if (offs == Line.size()) {\n            continue;\n          }\n\n          int start = offs;\n\n          for (; offs < Line.size() && Line[offs] != ':'; offs++)\n            ;\n\n          if (offs == Line.size()) {\n            continue;\n          }\n\n          if (Line[offs + 1] == '\\t') {\n            auto VAOffsetStr = Line.substr(start, offs - start);\n            auto VAOffset = std::strtoul(VAOffsetStr.c_str(), nullptr, 16);\n            auto FileOffset = GuestELF.VAToFile(VAOffset);\n            if (FileOffset == 0) {\n              LogMan::Msg::EFmt(\"File Offset {:x} did not map to file?! {}\", VAOffset, Line);\n            } else {\n              if (LastOffset > FileOffset) {\n                LogMan::Msg::EFmt(\"File Offset {:x} less than previous {:} ?!  {}\", FileOffset, LastOffset, Line);\n              }\n              CurrentOffset = FileOffset;\n\n              EndLine();\n\n              LastOffset = CurrentOffset;\n              LastOffsetLine = LineNum;\n            }\n          }\n        }\n        // something else -- keep going\n      }\n    }\n\n    CurrentOffset = LastOffset + 4;\n    CurrentSymbolOffset = CurrentOffset;\n\n    EndSymbol();\n    EndLine();\n\n    // Index post processing - entires are sorted for faster lookups\n\n    std::sort(rv->SortedLineMappings.begin(), rv->SortedLineMappings.end(),\n              [](const auto& lhs, const auto& rhs) { return lhs.FileGuestEnd <= rhs.FileGuestBegin; });\n\n    std::sort(rv->SortedSymbolMappings.begin(), rv->SortedSymbolMappings.end(),\n              [](const auto& lhs, const auto& rhs) { return lhs.FileGuestEnd <= rhs.FileGuestBegin; });\n\n    // Index serialization\n    {\n      auto len = rv->SourceFile.size();\n      ::write(IndexStream, (const char*)&len, sizeof(len));\n      ::write(IndexStream, rv->SourceFile.c_str(), len);\n    }\n\n    {\n      auto len = rv->SortedLineMappings.size();\n\n      ::write(IndexStream, (const char*)&len, sizeof(len));\n\n      for (const auto& Mapping : rv->SortedLineMappings) {\n        ::write(IndexStream, (const char*)&Mapping.FileGuestBegin, sizeof(Mapping.FileGuestBegin));\n        ::write(IndexStream, (const char*)&Mapping.FileGuestEnd, sizeof(Mapping.FileGuestEnd));\n        ::write(IndexStream, (const char*)&Mapping.LineNumber, sizeof(Mapping.LineNumber));\n      }\n    }\n\n    {\n      auto len = rv->SortedSymbolMappings.size();\n\n      ::write(IndexStream, (char*)&len, sizeof(len));\n\n      for (const auto& Mapping : rv->SortedSymbolMappings) {\n        ::write(IndexStream, (const char*)&Mapping.FileGuestBegin, sizeof(Mapping.FileGuestBegin));\n        ::write(IndexStream, (const char*)&Mapping.FileGuestEnd, sizeof(Mapping.FileGuestEnd));\n\n        {\n          auto len = Mapping.Name.size();\n          ::write(IndexStream, (const char*)&len, sizeof(len));\n          ::write(IndexStream, Mapping.Name.c_str(), len);\n        }\n      }\n    }\n\n    if (IndexStream != -1) {\n      close(IndexStream);\n    }\n\n    LogMan::Msg::DFmt(\"GenerateMap: Finished generating index\", GuestIndexFile);\n    return rv;\n  }\n}\n\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|common\ndesc: Glue logic, STRACE magic\n$end_info$\n*/\n\n#pragma once\n\n#include \"Common/VolatileMetadata.h\"\n#include \"LinuxSyscalls/FileManagement.h\"\n#include \"LinuxSyscalls/LinuxAllocator.h\"\n#include \"LinuxSyscalls/ThreadManager.h\"\n#include \"LinuxSyscalls/Seccomp/SeccompEmulator.h\"\n#include \"LinuxSyscalls/SyscallsVMATracking.h\"\n#include \"ArchHelpers/MContext.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/Thunks.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n#include <FEXCore/HLE/SourcecodeResolver.h>\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/SignalScopeGuards.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/functional.h>\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <mutex>\n#include <shared_mutex>\n\n#include <errno.h>\n#include <fcntl.h>\n#include <stdint.h>\n#include <type_traits>\n#include <list>\n#ifdef ARCHITECTURE_x86_64\n#define SYSCALL_ARCH_NAME x64\n#elif ARCHITECTURE_arm64\n#include \"LinuxSyscalls/Arm64/SyscallsEnum.h\"\n#define SYSCALL_ARCH_NAME Arm64\n#endif\n\n#include \"LinuxSyscalls/x64/SyscallsEnum.h\"\n#include \"LinuxSyscalls/x32/SyscallsEnum.h\"\n\n#define CONCAT_(a, b) a##b\n#define CONCAT(a, b) CONCAT_(a, b)\n#define SYSCALL_DEF(name) (HLE::SYSCALL_ARCH_NAME::CONCAT(CONCAT(SYSCALL_, SYSCALL_ARCH_NAME), _##name))\n\n// #define DEBUG_STRACE\n\nnamespace FEX {\nclass CodeLoader;\n}\n\nnamespace FEXCore {\nnamespace Context {\n  class Context;\n}\nnamespace Core {\n  struct CpuStateFrame;\n}\n} // namespace FEXCore\n\nnamespace FEX::HLE {\n\nclass SyscallHandler;\nclass SignalDelegator;\nclass ThunkHandler;\n\nvoid RegisterEpoll(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterFD(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterFS(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterInfo(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterIO(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterMemory(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterSignals(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterThread(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterTimer(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterNotImplemented(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterStubs(FEX::HLE::SyscallHandler* Handler);\n\nuint64_t UnimplementedSyscall(FEXCore::Core::CpuStateFrame* Frame, uint64_t SyscallNumber);\nuint64_t UnimplementedSyscallSafe(FEXCore::Core::CpuStateFrame* Frame, uint64_t SyscallNumber);\n\nstruct ExecveAtArgs {\n  int dirfd;\n  int flags;\n  static ExecveAtArgs Empty() {\n    return ExecveAtArgs {\n      .dirfd = AT_FDCWD,\n      .flags = 0,\n    };\n  }\n};\n\nuint64_t ExecveHandler(FEXCore::Core::CpuStateFrame* Frame, const char* pathname, char* const* argv, char* const* envp, ExecveAtArgs Args);\n\nclass SyscallMmapInterface {\npublic:\n  // does a mmap as if done via a guest syscall\n  virtual void* GuestMmap(FEXCore::Core::InternalThreadState* Thread, void* addr, size_t length, int prot, int flags, int fd, off_t offset) = 0;\n\n  // does a guest munmap as if done via a guest syscall\n  virtual uint64_t GuestMunmap(FEXCore::Core::InternalThreadState* Thread, void* addr, uint64_t length) = 0;\n};\n\nclass SyscallHandler : public FEXCore::HLE::SyscallHandler,\n                       public SyscallMmapInterface,\n                       FEXCore::HLE::SourcecodeResolver,\n                       public FEXCore::CodeMapOpener,\n                       public FEXCore::Allocator::FEXAllocOperators {\npublic:\n  ThreadManager TM;\n  FEX::HLE::SeccompEmulator SeccompEmulator;\n\n  virtual ~SyscallHandler();\n\n  // In the case that the syscall doesn't hit the optimized path then we still need to go here\n  uint64_t HandleSyscall(FEXCore::Core::CpuStateFrame* Frame, FEXCore::HLE::SyscallArguments* Args) final override;\n\n  void DefaultProgramBreak(uint64_t Base, uint64_t Size);\n  void DeserializeSeccompFD(FEX::HLE::ThreadStateObject* Thread, int FD) {\n    if (FD == -1) {\n      return;\n    }\n    SeccompEmulator.DeserializeFilters(Thread->Thread->CurrentFrame, FD);\n  }\n\n  using SyscallPtrArg0 = uint64_t (*)(FEXCore::Core::CpuStateFrame* Frame);\n  using SyscallPtrArg1 = uint64_t (*)(FEXCore::Core::CpuStateFrame* Frame, uint64_t);\n  using SyscallPtrArg2 = uint64_t (*)(FEXCore::Core::CpuStateFrame* Frame, uint64_t, uint64_t);\n  using SyscallPtrArg3 = uint64_t (*)(FEXCore::Core::CpuStateFrame* Frame, uint64_t, uint64_t, uint64_t);\n  using SyscallPtrArg4 = uint64_t (*)(FEXCore::Core::CpuStateFrame* Frame, uint64_t, uint64_t, uint64_t, uint64_t);\n  using SyscallPtrArg5 = uint64_t (*)(FEXCore::Core::CpuStateFrame* Frame, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t);\n  using SyscallPtrArg6 = uint64_t (*)(FEXCore::Core::CpuStateFrame* Frame, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t);\n\n  struct SyscallFunctionDefinition {\n    union {\n      void* Ptr;\n      SyscallPtrArg0 Ptr0;\n      SyscallPtrArg1 Ptr1;\n      SyscallPtrArg2 Ptr2;\n      SyscallPtrArg3 Ptr3;\n      SyscallPtrArg4 Ptr4;\n      SyscallPtrArg5 Ptr5;\n      SyscallPtrArg6 Ptr6;\n    };\n    uint8_t NumArgs;\n#ifdef DEBUG_STRACE\n    fextl::string StraceFmt;\n#endif\n  };\n\n  const SyscallFunctionDefinition* GetDefinition(uint64_t Syscall) {\n    return &Definitions.at(Syscall);\n  }\n\n  virtual void RegisterSyscall_32(int SyscallNumber,\n#ifdef DEBUG_STRACE\n                                  const fextl::string& TraceFormatString,\n#endif\n                                  void* SyscallHandler, int ArgumentCount) {\n  }\n\n  virtual void RegisterSyscall_64(int SyscallNumber,\n#ifdef DEBUG_STRACE\n                                  const fextl::string& TraceFormatString,\n#endif\n                                  void* SyscallHandler, int ArgumentCount) {\n  }\n\n  uint64_t HandleBRK(FEXCore::Core::CpuStateFrame* Frame, void* Addr);\n\n  FEX::HLE::FileManager FM;\n  FEX::CodeLoader* GetCodeLoader() const {\n    return LocalLoader;\n  }\n  void SetCodeLoader(FEX::CodeLoader* Loader) {\n    LocalLoader = Loader;\n  }\n  FEX::HLE::SignalDelegator* GetSignalDelegator() {\n    return SignalDelegation;\n  }\n\n  FEX::HLE::ThunkHandler* GetThunkHandler() {\n    return ThunkHandler;\n  }\n\n  FEX_CONFIG_OPT(IsInterpreterInstalled, INTERPRETER_INSTALLED);\n  FEX_CONFIG_OPT(Filename, APP_FILENAME);\n  FEX_CONFIG_OPT(RootFSPath, ROOTFS);\n  FEX_CONFIG_OPT(Is64BitMode, IS64BIT_MODE);\n  FEX_CONFIG_OPT(SMCChecks, SMCCHECKS);\n  FEX_CONFIG_OPT(NeedsSeccomp, NEEDSSECCOMP);\n  FEX_CONFIG_OPT(EnableCodeCaching, ENABLECODECACHINGWIP);\n\n  uint32_t GetHostKernelVersion() const {\n    return HostKernelVersion;\n  }\n  uint32_t GetGuestKernelVersion() const {\n    return GuestKernelVersion;\n  }\n\n  bool IsHostKernelVersionAtLeast(uint32_t Major, uint32_t Minor = 0, uint32_t Patch = 0) const {\n    return GetHostKernelVersion() >= KernelVersion(Major, Minor, Patch);\n  }\n\n  static uint32_t CalculateHostKernelVersion();\n  uint32_t CalculateGuestKernelVersion();\n\n  static uint32_t KernelVersion(uint32_t Major, uint32_t Minor = 0, uint32_t Patch = 0) {\n    return (Major << 24) | (Minor << 16) | Patch;\n  }\n\n  static uint32_t KernelMajor(uint32_t Version) {\n    return Version >> 24;\n  }\n  static uint32_t KernelMinor(uint32_t Version) {\n    return (Version >> 16) & 0xFF;\n  }\n  static uint32_t KernelPatch(uint32_t Version) {\n    return Version & 0xFFFF;\n  }\n\n  virtual FEX::HLE::MemAllocator* Get32BitAllocator() {\n    return Alloc32Handler.get();\n  }\n\n  // does a mmap as if done via a guest syscall\n  void* GuestMmap(bool Is64Bit, FEXCore::Core::InternalThreadState* Thread, void* addr, size_t length, int prot, int flags, int fd, off_t offset);\n  using SyscallMmapInterface::GuestMmap;\n\n  // does a guest munmap as if done via a guest syscall\n  uint64_t GuestMunmap(bool Is64Bit, FEXCore::Core::InternalThreadState* Thread, void* addr, uint64_t length);\n  using SyscallMmapInterface::GuestMunmap;\n\n  uint64_t GuestMremap(bool Is64Bit, FEXCore::Core::InternalThreadState*, void* old_address, size_t old_size, size_t new_size, int flags,\n                       void* new_address);\n  uint64_t GuestMprotect(FEXCore::Core::InternalThreadState*, void* addr, size_t len, int prot);\n  uint64_t GuestShmat(bool Is64Bit, FEXCore::Core::InternalThreadState*, int shmid, const void* shmaddr, int shmflg);\n  uint64_t GuestShmdt(bool Is64Bit, FEXCore::Core::InternalThreadState*, const void* shmaddr);\n\n  ///// Memory Manager tracking /////\n  struct LateApplyExtendedVolatileMetadata {\n    fextl::set<uint64_t> VolatileInstructions {};\n    FEXCore::IntervalList<uint64_t> VolatileValidRanges {};\n  };\n  std::optional<LateApplyExtendedVolatileMetadata> TrackMmap(FEXCore::Core::InternalThreadState* Thread, uint64_t addr, size_t length,\n                                                             int prot, int flags, int fd, off_t offset,\n                                                             std::optional<FEXCore::ExecutableFileSectionInfo>& CachedSection);\n  void TrackMunmap(FEXCore::Core::InternalThreadState* Thread, void* addr, size_t length);\n  void TrackMremap(FEXCore::Core::InternalThreadState* Thread, uint64_t OldAddress, size_t OldSize, size_t NewSize, int flags, uint64_t NewAddress);\n  void TrackShmat(FEXCore::Core::InternalThreadState* Thread, int shmid, uint64_t shmaddr, int shmflg, uint64_t Length);\n  uint64_t TrackShmdt(FEXCore::Core::InternalThreadState* Thread, uint64_t shmaddr);\n  void TrackMprotect(FEXCore::Core::InternalThreadState* Thread, void* addr, size_t len, int prot);\n  void TrackMadvise(FEXCore::Core::InternalThreadState* Thread, uintptr_t Base, uintptr_t Size, int advice);\n\n  void InvalidateCodeRangeIfNecessary(FEXCore::Core::InternalThreadState* Thread, uint64_t Base, uint64_t Length) {\n    if (SMCChecks != FEXCore::Config::CONFIG_SMC_NONE) {\n      TM.InvalidateGuestCodeRange(Thread, Base, Length);\n    }\n  }\n\n  void InvalidateCodeRangeIfNecessaryOnRemap(FEXCore::Core::InternalThreadState* Thread, uint64_t OldAddress, uint64_t NewAddress,\n                                             size_t OldSize, size_t NewSize) {\n    if (SMCChecks != FEXCore::Config::CONFIG_SMC_NONE) {\n      if (OldAddress != NewAddress) {\n        if (OldSize != 0) {\n          // This also handles the MREMAP_DONTUNMAP case\n          TM.InvalidateGuestCodeRange(Thread, OldAddress, OldSize);\n        }\n      } else {\n        // If mapping shrunk, flush the unmapped region\n        if (OldSize > NewSize) {\n          TM.InvalidateGuestCodeRange(Thread, OldAddress + NewSize, OldSize - NewSize);\n        }\n      }\n    }\n  }\n\n\n  ///// VMA (Virtual Memory Area) tracking /////\n  static bool HandleSegfault(FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext);\n  void MarkGuestExecutableRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Start, uint64_t Length) override;\n  void InvalidateGuestCodeRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Start, uint64_t Length) override;\n  std::optional<FEXCore::ExecutableFileSectionInfo>\n  LookupExecutableFileSection(FEXCore::Core::InternalThreadState* Thread, uint64_t GuestAddr) final override;\n\n  int OpenCodeMapFile() override;\n\n  FEXCore::HLE::ExecutableRangeInfo QueryGuestExecutableRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Address) override;\n\n  ///// FORK tracking /////\n  void LockBeforeFork(FEXCore::Core::InternalThreadState* Thread);\n  void UnlockAfterFork(FEXCore::Core::InternalThreadState* LiveThread, bool Child);\n\n  void RegisterTLSState(FEX::HLE::ThreadStateObject* Thread);\n  void UninstallTLSState(FEX::HLE::ThreadStateObject* Thread);\n\n  SourcecodeResolver* GetSourcecodeResolver() override {\n    return this;\n  }\n\n  void SleepThread(FEXCore::Context::Context* CTX, FEXCore::Core::CpuStateFrame* Frame) override {\n    TM.SleepThread(CTX, Frame);\n  }\n\n  bool NeedXIDCheck() const {\n    return NeedToCheckXID;\n  }\n  void DisableXIDCheck() {\n    NeedToCheckXID = false;\n  }\n\n  constexpr static uint64_t TASK_MAX_64BIT = (1ULL << 48);\n  constexpr static size_t MAX_LDT_ENTRIES = 8192;\n  constexpr static size_t LDT_ENTRY_SIZE = sizeof(FEXCore::Core::CPUState::gdt_segment);\n\n  VMATracking::VMATracking VMATracking;\n\n  const uint64_t CodeCacheConfigId = 0; // TODO: Make unique to active configuration\n\n  uint64_t read_ldt(FEXCore::Core::CpuStateFrame* Frame, void* ptr, unsigned long bytecount);\n  uint64_t write_ldt(FEXCore::Core::CpuStateFrame* Frame, void* ptr, unsigned long bytecount, bool legacy);\n\nprotected:\n  SyscallHandler(FEXCore::Context::Context* _CTX, FEX::HLE::SignalDelegator* _SignalDelegation, FEX::HLE::ThunkHandler* ThunkHandler);\n\n  fextl::vector<SyscallFunctionDefinition> Definitions {std::max<std::size_t>(FEX::HLE::x64::SYSCALL_x64_MAX, FEX::HLE::x32::SYSCALL_x86_MAX),\n                                                        {\n                                                          .Ptr = reinterpret_cast<void*>(&UnimplementedSyscall),\n                                                          .NumArgs = 255,\n                                                        }};\n  std::mutex MMapMutex;\n\n  // BRK management\n  uint64_t DataSpace {};\n  uint64_t DataSpaceSize {};\n  uint64_t DataSpaceMappedSize {};\n\n  // (Major << 24) | (Minor << 16) | Patch\n  uint32_t HostKernelVersion {};\n  uint32_t GuestKernelVersion {};\n\n  FEXCore::Context::Context* CTX;\n\nprivate:\n  FEX::HLE::SignalDelegator* SignalDelegation;\n  FEX::HLE::ThunkHandler* ThunkHandler;\n\n  fextl::unordered_map<fextl::string, FEX::VolatileMetadata::ExtendedVolatileMetadata> ExtendedMetaData {};\n\n  std::mutex FutexMutex;\n  std::mutex SyscallMutex;\n  FEX::CodeLoader* LocalLoader {};\n  bool NeedToCheckXID {true};\n\n#ifdef DEBUG_STRACE\n  void Strace(FEXCore::HLE::SyscallArguments* Args, uint64_t Ret);\n#endif\n  fextl::unique_ptr<FEXCore::HLE::SourcecodeMap> GenerateMap(std::string_view GuestBinaryFile, std::string_view GuestBinaryFileId) override;\n\n  fextl::unique_ptr<FEX::HLE::MemAllocator> Alloc32Handler {};\n  std::atomic<uint64_t> AnonSharedId {1};\n};\n\n#define SYSCALL_ERRNO()              \\\n  do {                               \\\n    if (Result == -1) return -errno; \\\n    return Result;                   \\\n  } while (0)\n#define SYSCALL_ERRNO_NULL()        \\\n  do {                              \\\n    if (Result == 0) return -errno; \\\n    return Result;                  \\\n  } while (0)\n\nextern FEX::HLE::SyscallHandler* _SyscallHandler;\n\n#ifdef DEBUG_STRACE\n//////\n/// Templates to map parameters to format string for syscalls\n//////\n\ntemplate<typename T>\nstruct ArgToFmtString;\n\n#define ARG_TO_STR(tpy, str)                      \\\n  template<>                                      \\\n  struct FEX::HLE::ArgToFmtString<tpy> {          \\\n    inline static const char* const Format = str; \\\n  };\n\n// Base types\nARG_TO_STR(int, \"{}\")\nARG_TO_STR(unsigned int, \"{}\")\nARG_TO_STR(long, \"{}\")\nARG_TO_STR(unsigned long, \"{}\")\n\n// string types\nARG_TO_STR(char*, \"{}\")\nARG_TO_STR(const char*, \"{}\")\n\n// Pointers\ntemplate<typename T>\nstruct ArgToFmtString<T*> {\n  inline static const char* const Format = \"{:x}\";\n};\n\n// Use ArgToFmtString and variadic template to create a format string from an args list\ntemplate<typename... Args>\nfextl::string CollectArgsFmtString() {\n  std::array<const char*, sizeof...(Args)> array = {ArgToFmtString<Args>::Format...};\n  return fextl::fmt::format(\"{}\", fmt::join(array, \", \"));\n}\n#else\n#define ARG_TO_STR(tpy, str)\n#endif\n\nstruct open_how {\n  uint64_t flags;\n  uint64_t mode;\n  uint64_t resolve;\n};\n\nstruct kernel_clone3_args {\n  uint64_t flags;\n  uint64_t pidfd;\n  uint64_t child_tid;\n  uint64_t parent_tid;\n  uint64_t exit_signal;\n  uint64_t stack;\n  uint64_t stack_size;\n  uint64_t tls;\n  uint64_t set_tid;\n  uint64_t set_tid_size;\n  uint64_t cgroup;\n};\n\nenum TypeOfClone {\n  TYPE_CLONE2,\n  TYPE_CLONE3,\n};\n\nstruct clone3_args {\n  TypeOfClone Type;\n  uint64_t SignalMask;\n\n  uint64_t StackSize;\n  void* NewStack;\n\n  kernel_clone3_args args;\n};\n\nuint64_t CloneHandler(FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::clone3_args* args);\n\ninline static int RemapFromX86Flags(int flags) {\n#ifdef ARCHITECTURE_x86_64\n  // Nothing to change here\n#elif ARCHITECTURE_arm64\n  constexpr int X86_64_FLAG_O_DIRECT = 040000;\n  constexpr int X86_64_FLAG_O_LARGEFILE = 0100000;\n  constexpr int X86_64_FLAG_O_DIRECTORY = 0200000;\n  constexpr int X86_64_FLAG_O_NOFOLLOW = 0400000;\n\n  constexpr int AARCH64_FLAG_O_DIRECTORY = 040000;\n  constexpr int AARCH64_FLAG_O_NOFOLLOW = 0100000;\n  constexpr int AARCH64_FLAG_O_DIRECT = 0200000;\n  constexpr int AARCH64_FLAG_O_LARGEFILE = 0400000;\n\n  int new_flags {};\n  if (flags & X86_64_FLAG_O_DIRECT) {\n    flags = (flags & ~X86_64_FLAG_O_DIRECT);\n    new_flags |= AARCH64_FLAG_O_DIRECT;\n  }\n  if (flags & X86_64_FLAG_O_LARGEFILE) {\n    flags = (flags & ~X86_64_FLAG_O_LARGEFILE);\n    new_flags |= AARCH64_FLAG_O_LARGEFILE;\n  }\n  if (flags & X86_64_FLAG_O_DIRECTORY) {\n    flags = (flags & ~X86_64_FLAG_O_DIRECTORY);\n    new_flags |= AARCH64_FLAG_O_DIRECTORY;\n  }\n  if (flags & X86_64_FLAG_O_NOFOLLOW) {\n    flags = (flags & ~X86_64_FLAG_O_NOFOLLOW);\n    new_flags |= AARCH64_FLAG_O_NOFOLLOW;\n  }\n  flags |= new_flags;\n#else\n#error Unknown flag remappings for this host platform\n#endif\n  return flags;\n}\n\ninline static int RemapToX86Flags(int flags) {\n#ifdef ARCHITECTURE_x86_64\n  // Nothing to change here\n#elif ARCHITECTURE_arm64\n  constexpr int X86_64_FLAG_O_DIRECT = 040000;\n  constexpr int X86_64_FLAG_O_LARGEFILE = 0100000;\n  constexpr int X86_64_FLAG_O_DIRECTORY = 0200000;\n  constexpr int X86_64_FLAG_O_NOFOLLOW = 0400000;\n\n  constexpr int AARCH64_FLAG_O_DIRECTORY = 040000;\n  constexpr int AARCH64_FLAG_O_NOFOLLOW = 0100000;\n  constexpr int AARCH64_FLAG_O_DIRECT = 0200000;\n  constexpr int AARCH64_FLAG_O_LARGEFILE = 0400000;\n\n  int new_flags {};\n  if (flags & AARCH64_FLAG_O_DIRECT) {\n    flags = (flags & ~AARCH64_FLAG_O_DIRECT);\n    new_flags |= X86_64_FLAG_O_DIRECT;\n  }\n  if (flags & AARCH64_FLAG_O_LARGEFILE) {\n    flags = (flags & ~AARCH64_FLAG_O_LARGEFILE);\n    new_flags |= X86_64_FLAG_O_LARGEFILE;\n  }\n  if (flags & AARCH64_FLAG_O_DIRECTORY) {\n    flags = (flags & ~AARCH64_FLAG_O_DIRECTORY);\n    new_flags |= X86_64_FLAG_O_DIRECTORY;\n  }\n  if (flags & AARCH64_FLAG_O_NOFOLLOW) {\n    flags = (flags & ~AARCH64_FLAG_O_NOFOLLOW);\n    new_flags |= X86_64_FLAG_O_NOFOLLOW;\n  }\n  flags |= new_flags;\n#else\n#error Unknown flag remappings for this host platform\n#endif\n  return flags;\n}\n\n/**\n * @brief Checks raw syscall return for error\n *\n * This should only be used with raw syscall usage\n *\n * This should not be used with glibc wrapped syscall functions\n *   - This includes the glibc ::syscall(...) function\n *   - This is due to glibc already wrapping the return and setting errno\n *\n * This function should not be used with UAPI breaking syscall results\n * ioctl specifically will break this convention.\n *\n * @param Result The raw syscall return\n *\n * @return If the result was an error result\n */\n\n[[maybe_unused]]\nstatic bool HasSyscallError(uint64_t Result) {\n  // MAX_ERRNO is part of the Linux Syscall ABI\n  // Redefined here since it doesn't exist as a visible define in the UAPI headers\n  constexpr uint64_t MAX_ERRNO = 0xFFFF'FFFF'FFFF'0001ULL;\n  // Raw syscalls are guaranteed to not return a valid result in the range of [-4095, -1]\n  // In cases where FEX needs to use raw syscalls, this helper checks for this idiom\n  return reinterpret_cast<uint64_t>(Result) >= MAX_ERRNO;\n}\n\n[[maybe_unused]]\nstatic bool HasSyscallError(const void* Result) {\n  return HasSyscallError(reinterpret_cast<uintptr_t>(Result));\n}\n\ntemplate<bool IncrementOffset, typename T>\nuint64_t GetDentsEmulation(int fd, T* dirp, uint32_t count);\n\nnamespace FaultSafeUserMemAccess {\n  // These are little helper functions for cases when FEX needs to copy data to or from the application in a robust fashion.\n  // CopyFromUser and CopyToUser are memcpy routines that expect to safely SIGSEGV when reading or writing application memory respectively.\n  // Returns zero if the memcpy completed, or crashes with SIGABRT and a log message if it faults.\n  [[nodiscard]]\n  size_t CopyFromUser(void* Dest, const void* Src, size_t Size);\n  [[nodiscard]]\n  size_t CopyToUser(void* Dest, const void* Src, size_t Size);\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED && defined(ARCHITECTURE_arm64)\n  // These helpers just check if the user pointer is readable and writable.\n  // This is useful in an assert build that can be safely sprinkled through the syscall handler without overhead in release builds.\n  void VerifyIsReadable(const void* Src, size_t Size);\n  void VerifyIsReadableOrNull(const void* Src, size_t Size);\n  void VerifyIsWritable(void* Src, size_t Size);\n  void VerifyIsWritableOrNull(void* Src, size_t Size);\n\n  // Iterates a null-terminated string and checks if all bytes are readable\n  void VerifyIsStringReadable(const char* Src);\n\n  // Iterates a null-terminated string and checks if all bytes are readable. Up to MaxSize bytes are checked.\n  void VerifyIsStringReadableMaxSize(const char* Src, size_t MaxSize);\n#else\n  inline void VerifyIsReadable(const void* Src, size_t Size) {\n    if (Src == nullptr) {\n      ERROR_AND_DIE_FMT(\"Unexpected nullptr syscall argument\");\n    }\n  }\n  inline void VerifyIsReadableOrNull(const void* Src, size_t Size) {}\n  inline void VerifyIsWritable(void* Src, size_t Size) {\n    if (Src == nullptr) {\n      ERROR_AND_DIE_FMT(\"Unexpected nullptr syscall argument\");\n    }\n  }\n  inline void VerifyIsWritableOrNull(void* Src, size_t Size) {}\n  inline void VerifyIsStringReadable(const char* Src) {\n    if (Src == nullptr) {\n      ERROR_AND_DIE_FMT(\"Unexpected nullptr syscall argument\");\n    }\n  }\n  inline void VerifyIsStringReadableMaxSize(const char* Src, size_t MaxSize) {\n    if (Src == nullptr) {\n      ERROR_AND_DIE_FMT(\"Unexpected nullptr syscall argument\");\n    }\n  }\n#endif\n  bool IsFaultLocation(uint64_t PC);\n\n  static inline bool TryHandleSafeFault(int Signal, const siginfo_t& SigInfo, void* UContext) {\n    if (Signal == SIGSEGV && (SigInfo.si_code == SEGV_MAPERR || SigInfo.si_code == SEGV_ACCERR) &&\n        FaultSafeUserMemAccess::IsFaultLocation(ArchHelpers::Context::GetPc(UContext))) {\n      // Return from the subroutine, returning EFAULT.\n      ArchHelpers::Context::SetArmReg(UContext, 0, EFAULT);\n      ArchHelpers::Context::SetPc(UContext, ArchHelpers::Context::GetArmReg(UContext, 30));\n      return true;\n    }\n\n    return false;\n  }\n} // namespace FaultSafeUserMemAccess\n\n\ntemplate<typename T>\ninline static uint64_t futimesat_compat(int dirfd, const char* pathname, const T times[2]) {\n  FaultSafeUserMemAccess::VerifyIsReadableOrNull(times, sizeof(*times) * 2);\n\n  timespec tvs[2] {};\n  timespec* tv_ptr {};\n  if (times) {\n    constexpr int64_t ONE_SECOND_AS_USEC = 1'000'000LL;\n\n    // Incoming microsecond time must not be negative or be larger than one second.\n    if (times[0].tv_usec < 0 || times[1].tv_usec < 0 || times[0].tv_usec >= ONE_SECOND_AS_USEC || times[1].tv_usec >= ONE_SECOND_AS_USEC) {\n      return -EINVAL;\n    }\n\n    tvs[0].tv_sec = times[0].tv_sec;\n    tvs[0].tv_nsec = 1000LL * times[0].tv_usec;\n    tvs[1].tv_sec = times[1].tv_sec;\n    tvs[1].tv_nsec = 1000LL * times[1].tv_usec;\n    tv_ptr = tvs;\n  }\n\n  uint64_t Result = ::syscall(SYSCALL_DEF(utimensat), dirfd, pathname, tv_ptr, 0);\n  SYSCALL_ERRNO();\n}\n\n} // namespace FEX::HLE\n\n// Registers syscall for both 32bit and 64bit\n#define REGISTER_SYSCALL_IMPL(name, lambda)                                                      \\\n  do {                                                                                           \\\n    FEX::HLE::x64::RegisterSyscall(Handler, FEX::HLE::x64::SYSCALL_x64_##name, #name, (lambda)); \\\n    FEX::HLE::x32::RegisterSyscall(Handler, FEX::HLE::x32::SYSCALL_x86_##name, #name, (lambda)); \\\n  } while (false)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/SyscallsSMCTracking.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ncategory: LinuxSyscalls ~ Linux syscall emulation, marshaling and passthrough\ntags: LinuxSyscalls|common\ndesc: SMC/MMan Tracking\n$end_info$\n*/\n\n#include <Common/Config.h>\n#include \"Common/FDUtils.h\"\n#include \"Common/FEXServerClient.h\"\n#include \"Common/FileMappingBaseAddress.h\"\n\n#include <filesystem>\n#include <sys/file.h>\n#include <sys/mman.h>\n#include <sys/personality.h>\n#include <sys/shm.h>\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/SignalDelegator.h\"\n\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/SignalScopeGuards.h>\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXHeaderUtils/Filesystem.h>\n#include <Linux/Utils/ELFParser.h>\n\nnamespace FEX::HLE {\n// SMC interactions\nbool SyscallHandler::HandleSegfault(FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext) {\n  const auto FaultAddress = (uintptr_t)((siginfo_t*)info)->si_addr;\n\n  auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromFEXCoreThread(Thread);\n  auto CallRetStackInfo = ThreadObject->GetCallRetStackInfo();\n  if (FaultAddress >= CallRetStackInfo.AllocationBase && FaultAddress < CallRetStackInfo.AllocationEnd) {\n    // Reset REG_CALLRET_SP to the default location to allow for underflows/overflows\n    ArchHelpers::Context::SetArmReg(ucontext, 25, CallRetStackInfo.DefaultLocation);\n    return true;\n  }\n\n  {\n    // Can't use the deferred signal lock in the SIGSEGV handler.\n    auto lk = FEXCore::MaskSignalsAndLockMutex<std::shared_lock>(_SyscallHandler->VMATracking.Mutex);\n\n    auto VMATracking = &_SyscallHandler->VMATracking;\n\n    // If the write spans two pages, they will be flushed one at a time (generating two faults)\n    auto Entry = VMATracking->FindVMAEntry(FaultAddress);\n\n    // If an untracked address, or the mapping wasn't writable, it can't be handled here\n    if (Entry == VMATracking->VMAs.end() || !Entry->second.Prot.Writable) {\n      return false;\n    }\n\n    auto FaultBase = FEXCore::AlignDown(FaultAddress, FEXCore::Utils::FEX_PAGE_SIZE);\n\n    auto UnprotectRegionCallback = [](uintptr_t Start, uintptr_t Length) {\n      auto rv = mprotect((void*)Start, Length, PROT_READ | PROT_WRITE);\n      LogMan::Throw::AFmt(rv == 0, \"mprotect({}, {}) failed\", Start, Length);\n    };\n\n    if (Entry->second.Flags.Shared) {\n      LOGMAN_THROW_A_FMT(Entry->second.Resource, \"VMA tracking error\");\n\n      auto Offset = FaultBase - Entry->first + Entry->second.Offset;\n\n      auto VMA = Entry->second.Resource->FirstVMA;\n      LOGMAN_THROW_A_FMT(VMA, \"VMA tracking error\");\n\n      // Flush all mirrors, remap the page writable as needed\n      do {\n        if (VMA->Offset <= Offset && (VMA->Offset + VMA->Length) > Offset) {\n          auto FaultBaseMirrored = Offset - VMA->Offset + VMA->Base;\n\n          if (VMA->Prot.Writable) {\n            _SyscallHandler->TM.InvalidateGuestCodeRange(Thread, FaultBaseMirrored, FEXCore::Utils::FEX_PAGE_SIZE, UnprotectRegionCallback);\n          } else {\n            _SyscallHandler->TM.InvalidateGuestCodeRange(Thread, FaultBaseMirrored, FEXCore::Utils::FEX_PAGE_SIZE);\n          }\n        }\n      } while ((VMA = VMA->ResourceNextVMA));\n    } else {\n      _SyscallHandler->TM.InvalidateGuestCodeRange(Thread, FaultBase, FEXCore::Utils::FEX_PAGE_SIZE, UnprotectRegionCallback);\n    }\n\n    FEXCORE_PROFILE_INSTANT_INCREMENT(Thread, AccumulatedSMCCount, 1);\n\n    auto CTX = Thread->CTX;\n    if (CTX->IsAddressInCodeBuffer(Thread, ArchHelpers::Context::GetPc(ucontext)) && !CTX->IsCurrentBlockSingleInst(Thread) &&\n        CTX->IsAddressInCurrentBlock(Thread, FaultAddress & FEXCore::Utils::FEX_PAGE_MASK, FEXCore::Utils::FEX_PAGE_SIZE)) {\n      // If we are not in a single-instruction block, and the SMC write address could intersect with the current block,\n      // reconstruct the context and repeat the faulting instruction as a single-instruction block so any SMC it performs\n      // is immediately picked up.\n      ThreadObject->SignalInfo.Delegator->SpillSRA(Thread, ucontext, Thread->CurrentFrame->InSyscallInfo & 0xFFFF);\n\n      // Adjust context to return to the dispatcher, reloading SRA from thread state\n      const auto& Config = ThreadObject->SignalInfo.Delegator->GetConfig();\n      ArchHelpers::Context::SetPc(ucontext, Config.AbsoluteLoopTopAddressFillSRA);\n      ArchHelpers::Context::SetArmReg(ucontext, 1, 1); // Set ENTRY_FILL_SRA_SINGLE_INST_REG to force a single step\n    }\n\n    return true;\n  }\n}\n\nvoid SyscallHandler::MarkGuestExecutableRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Start, uint64_t Length) {\n  const auto Base = Start & FEXCore::Utils::FEX_PAGE_MASK;\n  const auto Top = FEXCore::AlignUp(Start + Length, FEXCore::Utils::FEX_PAGE_SIZE);\n\n  {\n    if (SMCChecks != FEXCore::Config::CONFIG_SMC_MTRACK) {\n      return;\n    }\n\n    auto lk = FEXCore::GuardSignalDeferringSection<std::shared_lock>(VMATracking.Mutex, Thread);\n\n    // Find the first mapping at or after the range ends, or ::end().\n    // Top points to the address after the end of the range\n    auto Mapping = VMATracking.VMAs.lower_bound(Top);\n\n    while (Mapping != VMATracking.VMAs.begin()) {\n      Mapping--;\n\n      const auto MapBase = Mapping->first;\n      const auto MapTop = MapBase + Mapping->second.Length;\n\n      if (MapTop <= Base) {\n        // Mapping ends before the Range start, exit\n        break;\n      } else {\n        const auto ProtectBase = std::max(MapBase, Base);\n        const auto ProtectSize = std::min(MapTop, Top) - ProtectBase;\n\n        if (Mapping->second.Flags.Shared) {\n          LOGMAN_THROW_A_FMT(Mapping->second.Resource, \"VMA tracking error\");\n\n          const auto OffsetBase = ProtectBase - Mapping->first + Mapping->second.Offset;\n          const auto OffsetTop = OffsetBase + ProtectSize;\n\n          auto VMA = Mapping->second.Resource->FirstVMA;\n          LOGMAN_THROW_A_FMT(VMA, \"VMA tracking error\");\n\n          do {\n            auto VMAOffsetBase = VMA->Offset;\n            auto VMAOffsetTop = VMA->Offset + VMA->Length;\n            auto VMABase = VMA->Base;\n\n            if (VMA->Prot.Writable && VMAOffsetBase < OffsetTop && VMAOffsetTop > OffsetBase) {\n\n              const auto MirroredBase = std::max(VMAOffsetBase, OffsetBase);\n              const auto MirroredSize = std::min(OffsetTop, VMAOffsetTop) - MirroredBase;\n\n              auto rv = mprotect((void*)(MirroredBase - VMAOffsetBase + VMABase), MirroredSize, PROT_READ);\n              LogMan::Throw::AFmt(rv == 0, \"mprotect({}, {}) failed\", MirroredBase, MirroredSize);\n            }\n          } while ((VMA = VMA->ResourceNextVMA));\n\n        } else if (Mapping->second.Prot.Writable) {\n          int rv = mprotect((void*)ProtectBase, ProtectSize, PROT_READ);\n\n          LogMan::Throw::AFmt(rv == 0, \"mprotect({}, {}) failed\", ProtectBase, ProtectSize);\n        }\n      }\n    }\n  }\n}\n\nvoid SyscallHandler::InvalidateGuestCodeRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Start, uint64_t Length) {\n  InvalidateCodeRangeIfNecessary(Thread, Start, Length);\n}\n\nstatic FEXCore::ExecutableFileSectionInfo BuildSectionInfo(const VMATracking::MappedResource& Resource, uint64_t Base, uint64_t Size) {\n  return FEXCore::ExecutableFileSectionInfo {*Resource.MappedFile, Resource.FirstVMA->Base, Base, Base + Size};\n}\n\nstd::optional<FEXCore::ExecutableFileSectionInfo>\nSyscallHandler::LookupExecutableFileSection(FEXCore::Core::InternalThreadState* Thread, uint64_t GuestAddr) {\n  auto lk = FEXCore::GuardSignalDeferringSection<std::shared_lock>(VMATracking.Mutex, Thread);\n\n  auto EntryIt = VMATracking.FindVMAEntry(GuestAddr);\n  if (EntryIt == VMATracking.VMAs.end() || !EntryIt->second.Resource || !EntryIt->second.Resource->MappedFile) {\n    return std::nullopt;\n  }\n\n  auto& [MappingBaseAddr, Entry] = *EntryIt;\n  return BuildSectionInfo(*Entry.Resource, MappingBaseAddr, Entry.Length);\n}\n\nFEXCore::HLE::ExecutableRangeInfo SyscallHandler::QueryGuestExecutableRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Address) {\n  auto lk = FEXCore::GuardSignalDeferringSection<std::shared_lock>(VMATracking.Mutex, Thread);\n  auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromFEXCoreThread(Thread);\n\n  auto Entry = VMATracking.FindVMAEntry(Address);\n  if (Entry == VMATracking.VMAs.end() ||\n      (!Entry->second.Prot.Executable && (!(ThreadObject->persona & READ_IMPLIES_EXEC) || !Entry->second.Prot.Readable))) {\n    return {0, 0, false};\n  }\n  return {Entry->first, Entry->second.Length, Entry->second.Prot.Writable};\n}\n\nstruct ReadELFHeadersResult {\n  fextl::vector<Elf64_Phdr> ProgramHeaders;\n  fextl::robin_map<uint32_t, FEXCore::GuestRelocationType> Relocations;\n  bool HasCodeRelocations;\n};\n\nstatic ReadELFHeadersResult ReadELFHeaders(int FD, std::span<std::byte> HeaderData = {}) {\n  std::string_view ELFMagic = ELFMAG;\n  if (HeaderData.data()) {\n    if (HeaderData.size_bytes() < ELFMagic.size() || std::memcmp(ELFMagic.data(), HeaderData.data(), ELFMagic.size()) != 0) {\n      // Not an ELF file\n      return {};\n    }\n  } else {\n    // Read from FD in case the caller didn't have a mapped header available\n  }\n\n  ELFParser Parser;\n  Parser.ReadElf(dup(FD));\n\n  auto Relocations = Parser.PopulateRelocations();\n  if (!Relocations.empty()) {\n    LogMan::Msg::IFmt(\"Loaded ELF with {} relocations\", Relocations.size());\n  }\n\n  auto HasCodeRelocations = Parser.HasCodeRelocations();\n  return ReadELFHeadersResult {std::move(Parser.phdrs), std::move(Relocations), HasCodeRelocations};\n}\n\nstatic void LoadCodeCache(FEXCore::Core::InternalThreadState& Thread, FEXCore::ExecutableFileSectionInfo& Section, uint64_t CodeCacheConfigId) {\n  auto CacheFilename = fextl::fmt::format(\"{}cache/{}-{:016x}\", FEX::Config::GetCacheDirectory(),\n                                          FEXCore::CodeMap::GetBaseFilename(Section.FileInfo, false), CodeCacheConfigId);\n  int CacheFD = open(CacheFilename.c_str(), O_RDONLY);\n  if (CacheFD == -1) {\n    LogMan::Msg::IFmt(\"Cache file does not exist: {}\", CacheFilename);\n    return;\n  }\n\n  struct stat buf;\n  if (fstat(CacheFD, &buf) != 0) {\n    LogMan::Msg::EFmt(\"Invalid cache file: {}\", CacheFilename);\n    close(CacheFD);\n    return;\n  }\n\n  auto CacheFileSize = buf.st_size;\n  auto MappedCache = (std::byte*)FEXCore::Allocator::mmap(nullptr, CacheFileSize, PROT_READ, MAP_PRIVATE, CacheFD, 0);\n  LOGMAN_THROW_A_FMT(MappedCache, \"Failed to map code cache into memory\");\n  if (!Thread.CTX->GetCodeCache().LoadData(&Thread, MappedCache, Section)) {\n    // TODO: Delete this cache file\n  }\n  FEXCore::Allocator::munmap(MappedCache, CacheFileSize);\n  close(CacheFD);\n}\n\nvoid* SyscallHandler::GuestMmap(bool Is64Bit, FEXCore::Core::InternalThreadState* Thread, void* addr, size_t length, int prot, int flags,\n                                int fd, off_t offset) {\n  LOGMAN_THROW_A_FMT(Is64Bit || (length >> 32) == 0, \"values must fit to 32 bits\");\n\n  uint64_t Result {};\n  size_t Size = FEXCore::AlignUp(length, FEXCore::Utils::FEX_PAGE_SIZE);\n  std::optional<LateApplyExtendedVolatileMetadata> LateMetadata = std::nullopt;\n\n  std::optional<FEXCore::ExecutableFileSectionInfo> CachedSection;\n\n  {\n    // NOTE: Frontend calls this with a nullptr Thread during initialization, but\n    //       providing this code with a valid Thread object earlier would allow\n    //       us to be more optimal by using GuardSignalDeferringSection instead\n    auto lk = FEXCore::GuardSignalDeferringSectionWithFallback(VMATracking.Mutex, Thread);\n\n    bool Map32Bit = !Is64Bit || (flags & FEX::HLE::X86_64_MAP_32BIT);\n    if (Map32Bit) {\n      Result = (uint64_t)Get32BitAllocator()->Mmap((void*)addr, length, prot, flags, fd, offset);\n      if (FEX::HLE::HasSyscallError(Result)) {\n        return reinterpret_cast<void*>(Result);\n      }\n      LOGMAN_THROW_A_FMT(Is64Bit || (Result >> 32) == 0 || (Result >> 32) == 0xFFFFFFFF, \"values must fit to 32 bits\");\n    } else {\n      Result = reinterpret_cast<uint64_t>(::mmap(reinterpret_cast<void*>(addr), length, prot, flags, fd, offset));\n      if (Result == ~0ULL) {\n        return reinterpret_cast<void*>(-errno);\n      }\n    }\n\n    LateMetadata = TrackMmap(Thread, Result, length, prot, flags, fd, offset, CachedSection);\n  }\n\n  InvalidateCodeRangeIfNecessary(Thread, Result, Size);\n\n  if (LateMetadata) {\n    auto CodeInvalidationlk = GuardSignalDeferringSectionWithFallback(CTX->GetCodeInvalidationMutex(), Thread);\n    CTX->AddForceTSOInformation(LateMetadata->VolatileValidRanges, std::move(LateMetadata->VolatileInstructions));\n  }\n\n  if (EnableCodeCaching && CachedSection) {\n    LoadCodeCache(*Thread, *CachedSection, CodeCacheConfigId);\n  }\n\n  return reinterpret_cast<void*>(Result);\n}\n\nuint64_t SyscallHandler::GuestMunmap(bool Is64Bit, FEXCore::Core::InternalThreadState* Thread, void* addr, uint64_t length) {\n  LOGMAN_THROW_A_FMT(Is64Bit || (reinterpret_cast<uintptr_t>(addr) >> 32) == 0, \"values must fit to 32 bits: {}\", fmt::ptr(addr));\n  LOGMAN_THROW_A_FMT(Is64Bit || (length >> 32) == 0, \"values must fit to 32 bits\");\n\n  uint64_t Result {};\n  uint64_t Size = FEXCore::AlignUp(length, FEXCore::Utils::FEX_PAGE_SIZE);\n\n  {\n    // Frontend calls this with nullptr Thread during initialization.\n    // This is why `GuardSignalDeferringSectionWithFallback` is used here.\n    // To be more optimal the frontend should provide this code with a valid Thread object earlier.\n    auto lk = FEXCore::GuardSignalDeferringSectionWithFallback(VMATracking.Mutex, Thread);\n\n    if (reinterpret_cast<uintptr_t>(addr) < 0x1'0000'0000ULL) {\n      Result = Get32BitAllocator()->Munmap(addr, length);\n      if (FEX::HLE::HasSyscallError(Result)) {\n        return Result;\n      }\n    } else {\n      Result = ::munmap(addr, length);\n      if (Result == -1) {\n        return -errno;\n      }\n    }\n    TrackMunmap(Thread, addr, length);\n  }\n  InvalidateCodeRangeIfNecessary(Thread, reinterpret_cast<uint64_t>(addr), Size);\n\n  if (length) {\n    auto CodeInvalidationlk = GuardSignalDeferringSectionWithFallback(CTX->GetCodeInvalidationMutex(), Thread);\n    CTX->RemoveForceTSOInformation(reinterpret_cast<uint64_t>(addr), length);\n  }\n\n  return Result;\n}\n\nuint64_t SyscallHandler::GuestMremap(bool Is64Bit, FEXCore::Core::InternalThreadState* Thread, void* old_address, size_t old_size,\n                                     size_t new_size, int flags, void* new_address) {\n  uint64_t Result {};\n\n  {\n    auto lk = FEXCore::GuardSignalDeferringSection(VMATracking.Mutex, Thread);\n    if (Is64Bit) {\n      Result = reinterpret_cast<uint64_t>(::mremap(old_address, old_size, new_size, flags, new_address));\n      if (Result == -1) {\n        return -errno;\n      }\n    } else {\n      Result = reinterpret_cast<uint64_t>(Get32BitAllocator()->Mremap(old_address, old_size, new_size, flags, new_address));\n      if (FEX::HLE::HasSyscallError(Result)) {\n        return Result;\n      }\n    }\n    TrackMremap(Thread, reinterpret_cast<uint64_t>(old_address), old_size, new_size, flags, Result);\n  }\n\n  InvalidateCodeRangeIfNecessaryOnRemap(Thread, reinterpret_cast<uint64_t>(old_address), Result, old_size, new_size);\n  return Result;\n}\n\nint SyscallHandler::OpenCodeMapFile() {\n  // Query from FEXServer whether this is the first instance of this executable; if it is, also enable code dumping!\n  FEX_CONFIG_OPT(RootFSPath, ROOTFS);\n  FEX_CONFIG_OPT(Multiblock, MULTIBLOCK);\n  auto ProgramName = FEXCore::Config::Get(FEXCore::Config::CONFIG_APP_FILENAME);\n  LOGMAN_THROW_A_FMT(ProgramName && ProgramName.value()->c_str()[0] == '/', \"\");\n\n  // Check RootFS first, then the plain path\n  auto ProgramFD = open((RootFSPath() + ProgramName.value()->c_str()).c_str(), O_RDONLY);\n  if (ProgramFD == -1) {\n    ProgramFD = open(ProgramName.value()->c_str(), O_RDONLY);\n  }\n  if (ProgramFD == -1) {\n    return -1;\n  }\n\n  int CodeMapFD = FEXServerClient::RequestCodeMapFD(FEXServerClient::GetServerFD(), ProgramFD, Multiblock);\n  close(ProgramFD);\n  if (CodeMapFD == -1) {\n    return -1;\n  }\n\n  // Acquire exclusive lock to prevent FEXServer from processing this file eagerly\n  [[maybe_unused]] auto ret = flock(CodeMapFD, LOCK_EX);\n  LOGMAN_THROW_A_FMT(ret == 0, \"Could not lock code map\");\n\n  FM.SetProtectedCodeMapFD(CodeMapFD);\n\n  // Ensure the file descriptor is closed on exec\n  auto flags = fcntl(CodeMapFD, F_GETFD);\n  fcntl(CodeMapFD, F_SETFD, flags | FD_CLOEXEC);\n  return CodeMapFD;\n}\n\nuint64_t SyscallHandler::GuestMprotect(FEXCore::Core::InternalThreadState* Thread, void* addr, size_t len, int prot) {\n  uint64_t Result {};\n\n  {\n    auto lk = FEXCore::GuardSignalDeferringSection(VMATracking.Mutex, Thread);\n    Result = ::mprotect(addr, len, prot);\n    if (Result == -1) {\n      return -errno;\n    }\n\n    TrackMprotect(Thread, addr, len, prot);\n  }\n\n  InvalidateCodeRangeIfNecessary(Thread, reinterpret_cast<uint64_t>(addr), len);\n\n  // Prepare for delayed code cache load after ld/Wine is done applying relocations.\n  // Hooking into mprotect is a reliable heuristic that matches behavior of ld (for ELF) and Wine (for PE).\n  // False-positives are avoided by setting RequiresDelayedCacheLoad in TrackMmap only for\n  // binaries that we know will go through this path.\n  fextl::vector<FEXCore::ExecutableFileSectionInfo> CachedSections;\n  if (EnableCodeCaching && (prot & PROT_EXEC) && (prot & PROT_WRITE) == 0) {\n    auto lk = FEXCore::GuardSignalDeferringSection(VMATracking.Mutex, Thread);\n\n    auto VMAEntry = VMATracking.FindVMAEntry(reinterpret_cast<uint64_t>(addr));\n    auto Resource = VMAEntry != VMATracking.VMAs.end() ? VMAEntry->second.Resource : nullptr;\n    if (Resource && Resource->MappedFile && Resource->RequiresDelayedCacheLoad) {\n      Resource->RequiresDelayedCacheLoad = false;\n      LogMan::Msg::IFmt(\"Triggering delayed cache load for {} after mprotect of {:#x}-{:#x}\", Resource->MappedFile->Filename,\n                        VMAEntry->first, VMAEntry->first + VMAEntry->second.Length);\n\n      for (auto VMA = Resource->FirstVMA; VMA; VMA = VMA->ResourceNextVMA) {\n        CachedSections.push_back(BuildSectionInfo(*Resource, VMA->Base, VMA->Length));\n      }\n    }\n  }\n\n  // Trigger delayed cache load. This must be done separately since\n  // LoadCodeCache will call interfaces that acquire the VMATracking mutex.\n  for (auto& CachedSection : CachedSections) {\n    LoadCodeCache(*Thread, CachedSection, CodeCacheConfigId);\n  }\n\n  return Result;\n}\n\nuint64_t SyscallHandler::GuestShmat(bool Is64Bit, FEXCore::Core::InternalThreadState* Thread, int shmid, const void* shmaddr, int shmflg) {\n  uint64_t Result {};\n  uint64_t Length {};\n\n  {\n    auto lk = FEXCore::GuardSignalDeferringSection(VMATracking.Mutex, Thread);\n    if (Is64Bit) {\n      Result = reinterpret_cast<uint64_t>(::shmat(shmid, shmaddr, shmflg));\n      if (Result == -1) {\n        return -errno;\n      }\n    } else {\n      uint32_t Addr;\n      Result = Get32BitAllocator()->Shmat(shmid, shmaddr, shmflg, &Addr);\n      if (FEX::HLE::HasSyscallError(Result)) {\n        return Result;\n      }\n      Result = Addr;\n    }\n\n    shmid_ds stat;\n\n    auto res = shmctl(shmid, IPC_STAT, &stat);\n    LOGMAN_THROW_A_FMT(res != -1, \"shmctl IPC_STAT failed\");\n\n    Length = stat.shm_segsz;\n    TrackShmat(Thread, shmid, Result, shmflg, Length);\n  }\n\n  InvalidateCodeRangeIfNecessary(Thread, Result, Length);\n  return Result;\n}\n\nuint64_t SyscallHandler::GuestShmdt(bool Is64Bit, FEXCore::Core::InternalThreadState* Thread, const void* shmaddr) {\n  uint64_t Result {};\n  uint64_t Length {};\n  {\n    auto lk = FEXCore::GuardSignalDeferringSection(VMATracking.Mutex, Thread);\n    if (Is64Bit) {\n      Result = ::shmdt(shmaddr);\n      if (Result == -1) {\n        return -errno;\n      }\n    } else {\n      Result = Get32BitAllocator()->Shmdt(shmaddr);\n      if (FEX::HLE::HasSyscallError(Result)) {\n        return Result;\n      }\n    }\n\n    Length = TrackShmdt(Thread, reinterpret_cast<uintptr_t>(shmaddr));\n  }\n\n  InvalidateCodeRangeIfNecessary(Thread, reinterpret_cast<uintptr_t>(shmaddr), Length);\n  return Result;\n}\n\n// MMan Tracking\nstd::optional<SyscallHandler::LateApplyExtendedVolatileMetadata>\nSyscallHandler::TrackMmap(FEXCore::Core::InternalThreadState* Thread, uint64_t addr, size_t length, int prot, int flags, int fd,\n                          off_t offset, std::optional<FEXCore::ExecutableFileSectionInfo>& CachedSection) {\n  size_t Size = FEXCore::AlignUp(length, FEXCore::Utils::FEX_PAGE_SIZE);\n  const auto ProtMapping = VMATracking::VMAProt::fromProt(prot);\n\n  VMATracking::MappedResource* Resource = nullptr;\n\n  std::optional<SyscallHandler::LateApplyExtendedVolatileMetadata> VolatileMetadata = std::nullopt;\n\n  if (!(flags & MAP_ANONYMOUS)) {\n    struct stat64 buf;\n    fstat64(fd, &buf);\n\n    const VMATracking::MRID mrid {buf.st_dev, buf.st_ino};\n\n    char Tmp[PATH_MAX];\n    auto PathLength = FEX::get_fdpath(fd, Tmp);\n\n    auto [ResourceIt, ResourceEnd] = VMATracking.FindResources(mrid);\n    bool Inserted = false;\n    const bool MappedELFHeaderAgain = ResourceIt != ResourceEnd && offset == 0 && !ResourceIt->second.ProgramHeaders.empty();\n    if (ResourceIt == ResourceEnd || MappedELFHeaderAgain) {\n      // Create a new MappedResource for previously unseen file and for re-mappings of an ELF header\n      ResourceIt = VMATracking.InsertMappedResource(mrid, VMATracking::MappedResource {nullptr, nullptr, 0, {}, {}});\n      ResourceIt->second.Iterator = ResourceIt;\n      Inserted = true;\n    }\n    Resource = &ResourceIt->second;\n\n    // Only handle FDs that are backed by regular files that are executable\n    if (PathLength != -1 && S_ISREG(buf.st_mode) && (buf.st_mode & S_IXUSR)) {\n      // ELF files that are mapped multiple times get a separate MappedResource for each base virtual address\n      if ((prot & PROT_READ) && Inserted) {\n        Resource->MappedFile = fextl::make_unique<FEXCore::ExecutableFileInfo>();\n        Resource->MappedFile->Filename = fextl::string(Tmp, PathLength);\n        Resource->MappedFile->FileId = CTX->GetCodeCache().ComputeCodeMapId(Resource->MappedFile->Filename, fd);\n\n        // Read ELF headers if applicable.\n        // For performance, skip ELF checks if we're not mapping the file header\n        bool CheckForElfFile = (offset == 0);\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n        CheckForElfFile = true;\n#endif\n        if (CheckForElfFile) {\n          auto ELFResult = ReadELFHeaders(fd, std::span {reinterpret_cast<std::byte*>(addr), length});\n          Resource->ProgramHeaders = std::move(ELFResult.ProgramHeaders);\n          Resource->MappedFile->Relocations = std::move(ELFResult.Relocations);\n          Resource->RequiresDelayedCacheLoad = ELFResult.HasCodeRelocations;\n\n          // GuestRelocationType::Skip indicates to FEXOfflineCompiler that\n          // any blocks covered by the relocation may not be cached.\n          // At runtime, we can safely drop these relocations.\n          for (auto it = Resource->MappedFile->Relocations.begin(); it != Resource->MappedFile->Relocations.end();) {\n            if (it->second == FEXCore::GuestRelocationType::Skip) {\n              it = Resource->MappedFile->Relocations.erase(it);\n            } else {\n              ++it;\n            }\n          }\n\n          LOGMAN_THROW_A_FMT(Resource->ProgramHeaders.empty() || offset == 0, \"Expected file offset 0 for the first mapping of an ELF \"\n                                                                              \"file\");\n        }\n      } else if (ResourceIt->second.ProgramHeaders.empty()) {\n        // Not an ELF file, so we don't need to distinguish between different base addresses\n      } else {\n        // Mapped a non-header section of an ELF file.\n        // Look up the corresponding MappedResource using the expected base address.\n\n        ResourceIt = std::find_if(ResourceIt, ResourceEnd, [&](const VMATracking::MappedResource::ContainerType::value_type& ResourcePair) {\n          auto& Resource = ResourcePair.second;\n          auto ExpectedBases = FEXCore::InferMappingBaseAddress(\n            Resource.ProgramHeaders, addr, Size, offset,\n            (ProtMapping.Executable ? PF_X : 0) | (ProtMapping.Writable ? PF_W : 0) | (ProtMapping.Readable ? PF_R : 0));\n          return std::ranges::find(ExpectedBases, Resource.FirstVMA->Base) != ExpectedBases.end();\n        });\n        if (ResourceIt == ResourceEnd) {\n          // This isn't necessarily a fatal exception. It just means the ELF section isn't a part of the ELF Program headers.\n          // Node.js hits this as it maps a section of itself that isn't a part of the program headers.\n          LogMan::Msg::IFmt(\"Warning: Could not find base for file mapping at {:#x} (offset {:#x}): {}\", addr, offset,\n                            std::string_view(Tmp, PathLength));\n        } else {\n          Resource = &ResourceIt->second;\n        }\n      }\n\n      if (Resource->MappedFile) {\n        const fextl::string Filename = FHU::Filesystem::GetFilename(Resource->MappedFile->Filename);\n\n        // We now have the filename and the offset in the filename getting mapped.\n        // Check for extended volatile metadata.\n        auto it = ExtendedMetaData.find(Filename);\n        if (it != ExtendedMetaData.end()) {\n          SyscallHandler::LateApplyExtendedVolatileMetadata LateMetadata;\n          FEX::VolatileMetadata::ApplyFEXExtendedVolatileMetadata(\n            it->second, LateMetadata.VolatileInstructions, LateMetadata.VolatileValidRanges, addr, addr + length, offset, offset + length);\n\n          if (!LateMetadata.VolatileInstructions.empty() || !LateMetadata.VolatileValidRanges.Empty()) {\n            VolatileMetadata.emplace(std::move(LateMetadata));\n          }\n        }\n      }\n    }\n  } else if (flags & MAP_SHARED) {\n    VMATracking::MRID mrid {VMATracking::SpecialDev::Anon, AnonSharedId++};\n\n    auto [Iter, IterEnd] = VMATracking.FindResources(mrid);\n    LOGMAN_THROW_A_FMT(Iter == IterEnd, \"VMA tracking error\");\n\n    Iter = VMATracking.InsertMappedResource(mrid, VMATracking::MappedResource {nullptr, nullptr, 0, {}, {}});\n    Resource = &Iter->second;\n    Resource->Iterator = Iter;\n  }\n\n  VMATracking.TrackVMARange(CTX, Resource, addr, offset, Size, VMATracking::VMAFlags::fromFlags(flags), VMATracking::VMAProt::fromProt(prot));\n\n  // Load code cache if present.\n  // FEXServer was requested to generate library caches on program launch.\n  if (EnableCodeCaching && Resource && Resource->MappedFile && VMATracking::VMAProt::fromProt(prot).Executable) {\n    if (Thread) {\n      if (!Resource->RequiresDelayedCacheLoad) {\n        CachedSection.emplace(BuildSectionInfo(*Resource, addr, Size));\n      } else {\n        LogMan::Msg::IFmt(\"Delaying code cache load for {} until mprotect {:#x}-{:#x}\", Resource->MappedFile->Filename, addr, addr + Size);\n      }\n    } else {\n      // Cache can't be loaded with a thread; skip this for now\n      LogMan::Msg::DFmt(\"Oops, tried caching without a thread: {}\", Resource->MappedFile->Filename);\n    }\n  }\n\n  return VolatileMetadata;\n}\n\nvoid SyscallHandler::TrackMunmap(FEXCore::Core::InternalThreadState* Thread, void* addr, size_t length) {\n  uint64_t Size = FEXCore::AlignUp(length, FEXCore::Utils::FEX_PAGE_SIZE);\n  VMATracking.DeleteVMARange(CTX, reinterpret_cast<uintptr_t>(addr), Size);\n}\n\nvoid SyscallHandler::TrackMprotect(FEXCore::Core::InternalThreadState* Thread, void* addr, size_t len, int prot) {\n  uint64_t Size = FEXCore::AlignUp(len, FEXCore::Utils::FEX_PAGE_SIZE);\n\n  VMATracking.ChangeProtectionFlags(reinterpret_cast<uintptr_t>(addr), Size, VMATracking::VMAProt::fromProt(prot));\n}\n\nvoid SyscallHandler::TrackMremap(FEXCore::Core::InternalThreadState* Thread, uint64_t OldAddress, size_t OldSize, size_t NewSize, int flags,\n                                 uint64_t NewAddress) {\n  OldSize = FEXCore::AlignUp(OldSize, FEXCore::Utils::FEX_PAGE_SIZE);\n  NewSize = FEXCore::AlignUp(NewSize, FEXCore::Utils::FEX_PAGE_SIZE);\n\n  const auto OldVMA = VMATracking.FindVMAEntry(OldAddress);\n\n  const auto OldResource = OldVMA->second.Resource;\n  const auto OldOffset = OldVMA->second.Offset + OldAddress - OldVMA->first;\n  const auto OldFlags = OldVMA->second.Flags;\n  const auto OldProt = OldVMA->second.Prot;\n\n  LOGMAN_THROW_A_FMT(OldVMA != VMATracking.VMAs.end(), \"VMA Tracking corruption\");\n\n  if (OldSize == 0) {\n    // Mirror existing mapping\n    // must be a shared mapping\n    LOGMAN_THROW_A_FMT(OldResource != nullptr, \"VMA Tracking error\");\n    LOGMAN_THROW_A_FMT(OldFlags.Shared, \"VMA Tracking error\");\n    VMATracking.TrackVMARange(CTX, OldResource, NewAddress, OldOffset, NewSize, OldFlags, OldProt);\n  } else {\n\n#ifndef MREMAP_DONTUNMAP\n// MREMAP_DONTUNMAP is kernel 5.7+ and might not exist\n#define MREMAP_DONTUNMAP 4\n#endif\n    if (!(flags & MREMAP_DONTUNMAP)) {\n      VMATracking.DeleteVMARange(CTX, OldAddress, OldSize, OldResource);\n    }\n\n    // Make anonymous mapping\n    VMATracking.TrackVMARange(CTX, OldResource, NewAddress, OldOffset, NewSize, OldFlags, OldProt);\n  }\n}\n\nvoid SyscallHandler::TrackShmat(FEXCore::Core::InternalThreadState* Thread, int shmid, uint64_t shmaddr, int shmflg, uint64_t Length) {\n  VMATracking::MRID mrid {VMATracking::SpecialDev::SHM, static_cast<uint64_t>(shmid)};\n\n  auto [Iter, IterEnd] = VMATracking.FindResources(mrid);\n  if (Iter == IterEnd) {\n    Iter = VMATracking.InsertMappedResource(mrid, VMATracking::MappedResource {nullptr, nullptr, Length, {}, {}});\n    Iter->second.Iterator = Iter;\n  }\n  auto Resource = &Iter->second;\n  VMATracking.TrackVMARange(CTX, Resource, shmaddr, 0, Length, VMATracking::VMAFlags::fromFlags(MAP_SHARED), VMATracking::VMAProt::fromSHM(shmflg));\n}\n\nuint64_t SyscallHandler::TrackShmdt(FEXCore::Core::InternalThreadState* Thread, uint64_t shmaddr) {\n  return VMATracking.DeleteSHMRegion(CTX, reinterpret_cast<uintptr_t>(shmaddr));\n}\n\nvoid SyscallHandler::TrackMadvise(FEXCore::Core::InternalThreadState* Thread, uintptr_t Base, uintptr_t Size, int advice) {\n  Size = FEXCore::AlignUp(Size, FEXCore::Utils::FEX_PAGE_SIZE);\n  {\n    auto lk = FEXCore::GuardSignalDeferringSection(VMATracking.Mutex, Thread);\n    // TODO\n  }\n}\n\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/SyscallsVMATracking.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ncategory: LinuxSyscalls ~ Linux syscall emulation, marshaling and passthrough\ntags: LinuxSyscalls|common\ndesc: VMA Tracking\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include <sys/shm.h>\n\nnamespace FEX::HLE::VMATracking {\n/// Helpers ///\nauto VMAProt::fromProt(int Prot) -> VMAProt {\n  return VMAProt {\n    .Readable = (Prot & PROT_READ) != 0,\n    .Writable = (Prot & PROT_WRITE) != 0,\n    .Executable = (Prot & PROT_EXEC) != 0,\n  };\n}\n\nauto VMAProt::fromSHM(int SHMFlg) -> VMAProt {\n  return VMAProt {\n    .Readable = true,\n    .Writable = SHMFlg & SHM_RDONLY ? false : true,\n    .Executable = SHMFlg & SHM_EXEC ? true : false,\n  };\n}\n\nauto VMAFlags::fromFlags(int Flags) -> VMAFlags {\n  return VMAFlags {\n    .Shared = (Flags & MAP_SHARED) != 0, // also includes MAP_SHARED_VALIDATE\n  };\n}\n\n/// List Operations ///\nstatic inline void ListCheckVMALinks(const VMAEntry* VMA) {\n  if (VMA) {\n    LOGMAN_THROW_A_FMT(VMA->ResourceNextVMA != VMA, \"VMA tracking error\");\n    LOGMAN_THROW_A_FMT(VMA->ResourcePrevVMA != VMA, \"VMA tracking error\");\n  }\n}\n\n// Removes a VMA from corresponding MappedResource list\n// Returns true if list is empty\nstatic bool ListRemove(VMAEntry* VMA) {\n  LOGMAN_THROW_A_FMT(VMA->Resource != nullptr, \"VMA tracking error\");\n\n  // if it has prev, make prev to next\n  if (VMA->ResourcePrevVMA) {\n    LOGMAN_THROW_A_FMT(VMA->ResourcePrevVMA->ResourceNextVMA == VMA, \"VMA tracking error\");\n    VMA->ResourcePrevVMA->ResourceNextVMA = VMA->ResourceNextVMA;\n  } else {\n    LOGMAN_THROW_A_FMT(VMA->Resource->FirstVMA == VMA, \"VMA tracking error\");\n  }\n\n  // if it has next, make next to prev\n  if (VMA->ResourceNextVMA) {\n    LOGMAN_THROW_A_FMT(VMA->ResourceNextVMA->ResourcePrevVMA == VMA, \"VMA tracking error\");\n    VMA->ResourceNextVMA->ResourcePrevVMA = VMA->ResourcePrevVMA;\n  }\n\n  // If it is the first in the list, make Next the first in the list\n  if (VMA->Resource && VMA->Resource->FirstVMA == VMA) {\n    LOGMAN_THROW_A_FMT(!VMA->ResourceNextVMA || VMA->ResourceNextVMA->ResourcePrevVMA == nullptr, \"VMA tracking error\");\n\n    VMA->Resource->FirstVMA = VMA->ResourceNextVMA;\n  }\n\n  ListCheckVMALinks(VMA);\n  ListCheckVMALinks(VMA->ResourceNextVMA);\n  ListCheckVMALinks(VMA->ResourcePrevVMA);\n\n  // Return true if list is empty\n  return VMA->Resource->FirstVMA == nullptr;\n}\n\n// Replaces a VMA in corresponding MappedResource list\n// Requires NewVMA->Resource, NewVMA->ResourcePrevVMA and NewVMA->ResourceNextVMA to be already setup\nstatic void ListReplace(VMAEntry* VMA, VMAEntry* NewVMA) {\n  LOGMAN_THROW_A_FMT(VMA->Resource != nullptr, \"VMA tracking error\");\n\n  LOGMAN_THROW_A_FMT(VMA->Resource == NewVMA->Resource, \"VMA tracking error\");\n  LOGMAN_THROW_A_FMT(NewVMA->ResourcePrevVMA == VMA->ResourcePrevVMA, \"VMA tracking error\");\n  LOGMAN_THROW_A_FMT(NewVMA->ResourceNextVMA == VMA->ResourceNextVMA, \"VMA tracking error\");\n\n  if (VMA->ResourcePrevVMA) {\n    LOGMAN_THROW_A_FMT(VMA->Resource->FirstVMA != VMA, \"VMA tracking error\");\n    LOGMAN_THROW_A_FMT(VMA->ResourcePrevVMA->ResourceNextVMA == VMA, \"VMA tracking error\");\n    VMA->ResourcePrevVMA->ResourceNextVMA = NewVMA;\n  } else {\n    LOGMAN_THROW_A_FMT(VMA->Resource->FirstVMA == VMA, \"VMA tracking error\");\n    VMA->Resource->FirstVMA = NewVMA;\n  }\n\n  if (VMA->ResourceNextVMA) {\n    LOGMAN_THROW_A_FMT(VMA->ResourceNextVMA->ResourcePrevVMA == VMA, \"VMA tracking error\");\n    VMA->ResourceNextVMA->ResourcePrevVMA = NewVMA;\n  }\n\n  ListCheckVMALinks(VMA);\n  ListCheckVMALinks(NewVMA);\n  ListCheckVMALinks(VMA->ResourceNextVMA);\n  ListCheckVMALinks(VMA->ResourcePrevVMA);\n}\n\n// Inserts a VMA in corresponding MappedResource list\n// Requires NewVMA->Resource, NewVMA->ResourcePrevVMA and NewVMA->ResourceNextVMA to be already setup\nstatic void ListInsertAfter(VMAEntry* AfterVMA, VMAEntry* NewVMA) {\n  LOGMAN_THROW_A_FMT(NewVMA->Resource != nullptr, \"VMA tracking error\");\n\n  LOGMAN_THROW_A_FMT(AfterVMA->Resource == NewVMA->Resource, \"VMA tracking error\");\n  LOGMAN_THROW_A_FMT(NewVMA->ResourcePrevVMA == AfterVMA, \"VMA tracking error\");\n  LOGMAN_THROW_A_FMT(NewVMA->ResourceNextVMA == AfterVMA->ResourceNextVMA, \"VMA tracking error\");\n\n  if (AfterVMA->ResourceNextVMA) {\n    LOGMAN_THROW_A_FMT(AfterVMA->ResourceNextVMA->ResourcePrevVMA == AfterVMA, \"VMA tracking error\");\n    AfterVMA->ResourceNextVMA->ResourcePrevVMA = NewVMA;\n  }\n  AfterVMA->ResourceNextVMA = NewVMA;\n\n  ListCheckVMALinks(AfterVMA);\n  ListCheckVMALinks(NewVMA);\n  ListCheckVMALinks(AfterVMA->ResourceNextVMA);\n  ListCheckVMALinks(AfterVMA->ResourcePrevVMA);\n}\n\n// Prepends a VMA\n// Requires NewVMA->Resource, NewVMA->ResourcePrevVMA and NewVMA->ResourceNextVMA to be already setup\nstatic void ListPrepend(MappedResource* Resource, VMAEntry* NewVMA) {\n  LOGMAN_THROW_A_FMT(Resource != nullptr, \"VMA tracking error\");\n\n  LOGMAN_THROW_A_FMT(NewVMA->Resource == Resource, \"VMA tracking error\");\n  LOGMAN_THROW_A_FMT(NewVMA->ResourcePrevVMA == nullptr, \"VMA tracking error\");\n  LOGMAN_THROW_A_FMT(NewVMA->ResourceNextVMA == Resource->FirstVMA, \"VMA tracking error\");\n\n  if (Resource->FirstVMA) {\n    LOGMAN_THROW_A_FMT(Resource->FirstVMA->ResourcePrevVMA == nullptr, \"VMA tracking error\");\n    Resource->FirstVMA->ResourcePrevVMA = NewVMA;\n  }\n\n  Resource->FirstVMA = NewVMA;\n\n  ListCheckVMALinks(NewVMA);\n  ListCheckVMALinks(NewVMA->ResourceNextVMA);\n  ListCheckVMALinks(NewVMA->ResourcePrevVMA);\n}\n\n/// VMA tracking ///\n\n// Lookup a VMA by address\nVMATracking::VMACIterator VMATracking::FindVMAEntry(uint64_t GuestAddr) const {\n  auto Entry = VMAs.upper_bound(GuestAddr);\n\n  if (Entry != VMAs.begin()) {\n    --Entry;\n\n    if (Entry->first <= GuestAddr && (Entry->first + Entry->second.Length) > GuestAddr) {\n      return Entry;\n    }\n  }\n\n  return VMAs.end();\n}\n\n// Set or Replace mappings in a range with a new mapping\nvoid VMATracking::TrackVMARange(FEXCore::Context::Context* CTX, MappedResource* MappedResource, uintptr_t Base, uintptr_t Offset,\n                                uintptr_t Length, VMAFlags Flags, VMAProt Prot) {\n  Mutex.check_lock_owned_by_self_as_write();\n\n  DeleteVMARange(CTX, Base, Length, MappedResource);\n\n  auto PrevResVMA = MappedResource ? MappedResource->FirstVMA : nullptr;\n  auto NextResVMA = PrevResVMA ? PrevResVMA->ResourceNextVMA : nullptr;\n  if (PrevResVMA && PrevResVMA->Base > Base) {\n    NextResVMA = std::exchange(PrevResVMA, nullptr);\n  }\n  while (NextResVMA && NextResVMA->Base < Base) {\n    PrevResVMA = NextResVMA;\n    NextResVMA = PrevResVMA->ResourceNextVMA;\n  }\n\n  auto [Iter, Inserted] = VMAs.emplace(Base, VMAEntry {MappedResource, PrevResVMA, NextResVMA, Base, Offset, Length, Flags, Prot});\n\n  LOGMAN_THROW_A_FMT(Inserted == true, \"VMA Tracking corruption\");\n\n  if (MappedResource && !PrevResVMA) {\n    // Insert to the front of the linked list\n    ListPrepend(MappedResource, &Iter->second);\n  } else if (MappedResource) {\n    ListInsertAfter(PrevResVMA, &Iter->second);\n  }\n}\n\n// Remove mappings in a range, possibly splitting them if needed and\n// freeing their associated MappedResource unless it is equal to PreservedMappedResource\nvoid VMATracking::DeleteVMARange(FEXCore::Context::Context* CTX, uintptr_t Base, uintptr_t Length, MappedResource* PreservedMappedResource) {\n  Mutex.check_lock_owned_by_self_as_write();\n\n  const auto Top = Base + Length;\n\n  // find the first Mapping at or after the Range ends, or ::end()\n  // Top is the address after the end\n  auto CurrentIter = VMAs.lower_bound(Top);\n\n  // Iterate backwards all mappings\n  while (CurrentIter != VMAs.begin()) {\n    CurrentIter--;\n\n    const auto Current = &CurrentIter->second;\n    const auto MapBase = Current->Base;\n    const auto MapTop = MapBase + Current->Length;\n    const auto OffsetDiff = Current->Offset - MapBase;\n\n    if (MapTop <= Base) {\n      // Mapping ends before the Range start, exit\n      break;\n    } else {\n      const bool HasFirstPart = MapBase < Base;\n      const bool HasTrailingPart = MapTop > Top;\n\n      // (1) HasFirstPart, !HasTrailingPart -> trim\n      // (2) HasFirstPart, HasTrailingPart -> trim, insert trailing, list add after first part\n      // (3) !HasFirstPart, !HasTrailing part -> list remove, erase\n      // (4) !HasFirstPart, HasTrailing part -> insert trailing, list replace first part, erase\n\n      if (HasFirstPart) {\n        // Handle trim for (1) & (2)\n        Current->Length = Base - MapBase;\n      } else if (!HasTrailingPart) {\n        // Handle all of (3)\n        // Mapping is included or equal to Range, delete\n\n        // If linked to a Mapped Resource, remove from linked list and possibly delete the Mapped Resource\n        if (Current->Resource) {\n          if (ListRemove(Current) && Current->Resource != PreservedMappedResource) {\n            MappedResources.erase(Current->Resource->Iterator);\n          }\n        }\n\n        // returns next element, so -- is safe at loop\n        CurrentIter = VMAs.erase(CurrentIter);\n        continue; // we're done\n      }\n\n      const bool ReplaceAndErase = !HasFirstPart;\n\n      if (HasTrailingPart) {\n        // Handle insert of (2), (4)\n\n        // insert trailing part, link it after Mapping\n        auto NewOffset = OffsetDiff + Top;\n        auto NewLength = MapTop - Top;\n\n        auto [Iter, Inserted] = VMAs.emplace(Top, VMAEntry {Current->Resource, ReplaceAndErase ? Current->ResourcePrevVMA : Current,\n                                                            Current->ResourceNextVMA, Top, NewOffset, NewLength, Current->Flags, Current->Prot});\n        LOGMAN_THROW_A_FMT(Inserted == true, \"VMA tracking error\");\n        auto TrailingPart = &Iter->second;\n        if (Current->Resource) {\n          if (ReplaceAndErase) {\n            // Handle list replace of (4)\n            ListReplace(Current, TrailingPart);\n          } else {\n            // Handle list insert (2)\n            ListInsertAfter(Current, TrailingPart);\n          }\n        }\n      }\n\n      if (ReplaceAndErase) {\n        // Handle erase of (4)\n        // returns next element, so -- is safe at loop\n        CurrentIter = VMAs.erase(CurrentIter);\n      }\n    }\n  }\n}\n\n// Change flags of mappings in a range and split the mappings if needed\nvoid VMATracking::ChangeProtectionFlags(uintptr_t Base, uintptr_t Length, VMAProt NewProt) {\n  Mutex.check_lock_owned_by_self_as_write();\n\n  // Handle 0 size as no-op like the kernel\n  if (Length == 0) {\n    return;\n  }\n\n  // This needs to handle multiple split-merge strategies:\n  // 1) Exact overlap - No Split, no Merge. Only protection tracking changes.\n  // 2) Exact base overlap - Single insert, can never fail.\n  // 3) Insert in middle of VMA range. 1 or 2 inserts, can never fail.\n  // 4) Partial overlapping merge. The most interesting strategy.\n  //    - More information below about this one.\n\n  auto Top = Base + Length;\n\n  // find the first Mapping at or after the Range ends, or ::end()\n  // Top is the address after the end\n  auto MappingIter = VMAs.lower_bound(Top);\n\n  // Iterate backwards all mappings\n  while (MappingIter != VMAs.begin()) {\n    MappingIter--;\n\n    auto Current = &MappingIter->second;\n\n    if (Current->Base <= Base || Current->Base + Current->Length < Top) {\n      break;\n    }\n\n    const auto CurrentBase = Current->Base;\n    const auto CurrentTop = CurrentBase + Current->Length;\n    const auto CurrentFlags = Current->Flags;\n    const auto CurrentProt = Current->Prot;\n\n    ///< Resource mapping base.\n    const auto OffsetDiff = Current->Offset - CurrentBase;\n\n    // Merge strategy 4)\n    // CurrentBase range doesn't fully overlap the starting range but does overlap the tail.\n    // This is the most confusing strategy as it requires splitting the protect range itself.\n    //\n    // if the VMA has tail data after the protection range we must first deal with that:\n    // 1) Split the tail data in to new VMA range with original protections. Must not fail.\n    // 2) Adjust the overlapping VMA protections to the new protections and the truncated length\n    // 3) Truncate the mprotecting length and top to be that untouched range. Next loop will continue inserting.\n    // [ Incoming Ranges ]\n    // CurrentVMA:                            [CurrentBase ====== CurrentTop)\n    // CurrentMProtectRange: [Base =============== Top)**********************\n    // [ Modified Ranges ]\n    // New Tail Range:                                [TailBase === Tail Top)\n    // CurrentVMA Modified Range:             [=======)\n    // Remaining Tracking:   [Base ==== NewTop)\n    //\n    // Next loop iterations will decompose the remaining mprotects in to more merge strategies.\n\n    // Steps:\n    // 1) Split VMA if Top != CurrentTop\n    // 2) Change [CurrentBase, Top) protections\n    // 3) Change CurrentVMA length\n    // 4) Adjust searching length for [Base, CurrentBase)\n    const bool HasTailData = CurrentTop > Top;\n\n    if (HasTailData) {\n      // We now need to insert another VMA entry afterwards to ensure consistency.\n      // This will have the original VMA's protection flags.\n\n      // Make new VMA with new flags, insert for length of range\n      auto NewOffset = OffsetDiff + CurrentBase;\n      auto NewLength = CurrentTop - Top;\n\n      auto [Iter, Inserted] = VMAs.emplace(Top, VMAEntry {.Resource = Current->Resource,\n                                                          .ResourcePrevVMA = Current,\n                                                          .ResourceNextVMA = Current->ResourceNextVMA,\n                                                          .Base = Top,\n                                                          .Offset = NewOffset,\n                                                          .Length = NewLength,\n                                                          .Flags = CurrentFlags,\n                                                          .Prot = CurrentProt});\n\n      if (!Inserted) {\n        // We can't recover from this.\n        // Shouldn't ever happen.\n        ERROR_AND_DIE_FMT(\"{}:{}: VMA tracking error\", __func__, __LINE__);\n      }\n\n      if (Current->Resource) {\n        ListInsertAfter(Current, &Iter->second);\n      }\n    }\n\n    // Change CurrentVMA's protections\n    Current->Prot = NewProt;\n\n    // Change CurrentVMA's length\n    Current->Length = Top - CurrentBase;\n\n    // Adjust the protection length we're searching for.\n    // Next loop will pick up the next check.\n    Length = CurrentBase - Base;\n    Top = Base + Length;\n  }\n\n  auto Current = &MappingIter->second;\n  const auto CurrentBase = Current->Base;\n  const auto CurrentTop = CurrentBase + Current->Length;\n  const auto CurrentFlags = Current->Flags;\n  const auto CurrentProt = Current->Prot;\n\n  ///< Resource mapping base.\n  const auto OffsetDiff = Current->Offset - CurrentBase;\n  if (CurrentTop <= Base) {\n    // Mapping is below what we care about\n    // [CurrentBase === CurrentTop)\n    //                            [Base === Top)\n  } else if (CurrentBase == Base && CurrentTop == Top) {\n    // Merge strategy 1)\n    // Exact encompassing, quite common.\n    // [CurrentBase ======================== CurrentTop)\n    // [Base ====================================== Top)\n    Current->Prot = NewProt;\n  } else if (CurrentBase == Base && CurrentTop > Top) {\n    // Merge strategy 2)\n    // [CurrentBase ======================== CurrentTop)\n    // [Base =============== Top)***********************\n    // VMA fully encompasses with matching base.\n    // VMA needs to split.\n\n    // Steps:\n    // 1) Set new permissions for this VMA\n    // 2) Trim VMA->Length to match [CurrentBase, CurrentBase+Length)\n    // 2) Insert new node at [CurrentBase+Length, CurrentTop)\n\n    // 1) Set new permissions\n    Current->Prot = NewProt;\n\n    // Trim end of original mapping\n    // New length for Current VMA is Top - CurrentBase\n    Current->Length = Top - CurrentBase;\n\n    // Make new VMA with original protections, insert for remaining length\n    auto NewOffset = OffsetDiff + Top;\n    auto NewLength = CurrentTop - Top;\n\n    auto [Iter, Inserted] = VMAs.emplace(Top, VMAEntry {.Resource = Current->Resource,\n                                                        .ResourcePrevVMA = Current,\n                                                        .ResourceNextVMA = Current->ResourceNextVMA,\n                                                        .Base = Top,\n                                                        .Offset = NewOffset,\n                                                        .Length = NewLength,\n                                                        .Flags = CurrentFlags,\n                                                        .Prot = CurrentProt});\n\n    if (!Inserted) [[unlikely]] {\n      // We can't recover from this.\n      // Shouldn't ever happen.\n      ERROR_AND_DIE_FMT(\"{}:{}: VMA tracking error\", __func__, __LINE__);\n    }\n\n    if (Current->Resource) {\n      ListInsertAfter(Current, &Iter->second);\n    }\n  } else if (CurrentBase < Base && CurrentTop >= Top) {\n    // Merge strategy 3)\n    // VMA fully encompasses, VMA needs to split.\n    // Explicitly VMA base doesn't match current base.\n    // [CurrentBase ======================== CurrentTop)\n    // ***************[Base =============== Top)********\n\n    // Steps:\n    // 1) Split the CurrentVMA\n    // 2) Set new length of CurrentVMA\n    // 3) If there is tail length still, Insert another new VMA with CurrentVMA data.\n\n    const bool HasTailData = CurrentTop > Top;\n\n    // Trim end of original mapping\n    Current->Length = Base - CurrentBase;\n    {\n      // Make new VMA with new flags, insert for length of range\n      auto NewOffset = OffsetDiff + Base;\n      auto NewLength = Top - Base;\n\n      auto [Iter, Inserted] = VMAs.emplace(Base, VMAEntry {.Resource = Current->Resource,\n                                                           .ResourcePrevVMA = Current,\n                                                           .ResourceNextVMA = Current->ResourceNextVMA,\n                                                           .Base = Base,\n                                                           .Offset = NewOffset,\n                                                           .Length = NewLength,\n                                                           .Flags = CurrentFlags,\n                                                           .Prot = NewProt});\n\n      if (!Inserted) [[unlikely]] {\n        // We can't recover from this.\n        // Shouldn't ever happen.\n        ERROR_AND_DIE_FMT(\"{}:{}: VMA tracking error\", __func__, __LINE__);\n      }\n\n      if (Current->Resource) {\n        ListInsertAfter(Current, &Iter->second);\n      }\n    }\n\n    if (HasTailData) {\n      // We now need to insert another VMA entry afterwards to ensure consistency.\n      // This will have the original VMA's protection flags.\n\n      // Make new VMA with new flags, insert for length of range\n      auto NewOffset = OffsetDiff + Top;\n      auto NewLength = CurrentTop - Top;\n\n      auto [Iter, Inserted] = VMAs.emplace(Top, VMAEntry {.Resource = Current->Resource,\n                                                          .ResourcePrevVMA = Current,\n                                                          .ResourceNextVMA = Current->ResourceNextVMA,\n                                                          .Base = Top,\n                                                          .Offset = NewOffset,\n                                                          .Length = NewLength,\n                                                          .Flags = CurrentFlags,\n                                                          .Prot = CurrentProt});\n\n      if (!Inserted) {\n        // We can't recover from this.\n        // Shouldn't ever happen.\n        ERROR_AND_DIE_FMT(\"{}:{}: VMA tracking error\", __func__, __LINE__);\n      }\n\n      if (Current->Resource) {\n        ListInsertAfter(Current, &Iter->second);\n      }\n    }\n  } else {\n    ERROR_AND_DIE_FMT(\"Unexpected {} Merge strategy! [0x{:x}, 0x{:x}) Versus [0x{:x}, 0x{:x})\\n\", __func__, CurrentBase, CurrentTop, Base, Top);\n  }\n}\n\n// This matches the peculiarities algorithm used in linux ksys_shmdt (linux kernel 5.16, ipc/shm.c)\nuintptr_t VMATracking::DeleteSHMRegion(FEXCore::Context::Context* CTX, uintptr_t Base) {\n\n  // Find first VMA at or after Base\n  // Iterate until first SHM VMA, with matching offset, get length\n  // Then, erase any later occurrences of this SHM\n\n  // returns first element that is greater or equal or ::end\n  auto Entry = VMAs.lower_bound(Base);\n\n  for (; Entry != VMAs.end(); ++Entry) {\n    LOGMAN_THROW_A_FMT(Entry->second.Base >= Base, \"VMA tracking corruption\");\n    if (Entry->second.Base - Base == Entry->second.Offset && Entry->second.Resource &&\n        Entry->second.Resource->Iterator->first.dev == SpecialDev::SHM) {\n      break;\n    }\n  }\n\n  if (Entry == VMAs.end()) {\n    return 0;\n  }\n\n  const auto ShmLength = Entry->second.Resource->Iterator->second.Length;\n  const auto Resource = Entry->second.Resource;\n\n  do {\n    if (Entry->second.Resource == Resource) {\n      if (ListRemove(&Entry->second)) {\n        MappedResources.erase(Entry->second.Resource->Iterator);\n      }\n      Entry = VMAs.erase(Entry);\n    } else {\n      Entry++;\n    }\n  } while (Entry != VMAs.end() && (Entry->second.Base + Entry->second.Length - Base) <= ShmLength);\n\n  return ShmLength;\n}\n} // namespace FEX::HLE::VMATracking\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/SyscallsVMATracking.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <cstdint>\n#include <tuple>\n\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/Utils/SignalScopeGuards.h>\n\n#include <elf.h>\n\nnamespace FEX::HLE::VMATracking {\n///// VMA (Virtual Memory Area) tracking /////\n\nnamespace SpecialDev {\n  static constexpr uint64_t Anon = 0x1'0000'0000; // Anonymous shared mapping, id is incrementing allocation number\n  static constexpr uint64_t SHM = 0x2'0000'0000;  // sys-v shm, id is shmid\n}; // namespace SpecialDev\n\n// Memory Resource ID\n// An id that can be used to identify when shared mappings actually have the same backing storage\n// when dev != SpecialDev::Anon, this is unique system wide\nstruct MRID {\n  uint64_t dev; // kernel dev_t is actually 32-bits, we use the extra bits to track SpecialDevs\n  uint64_t id;\n\n  bool operator<(const MRID& other) const {\n    return std::tie(dev, id) < std::tie(other.dev, other.id);\n  }\n};\n\nstruct VMAEntry;\n\n/**\n * Meta data associated to one system resource.\n *\n * Typically there is one instance of this type per ELF/PE file or special device.\n * However if an ELF/PE file is mapped multiple times at different base addresses,\n * there will be one separate MappedResource for each base address. The MRID\n * is the same in this case.\n */\nstruct MappedResource {\n  using ContainerType = fextl::multimap<MRID, MappedResource>;\n\n  fextl::unique_ptr<FEXCore::ExecutableFileInfo> MappedFile;\n  // Pointer to lowest memory range this file is mapped to\n  VMAEntry* FirstVMA;\n  uint64_t Length; // 0 if not fixed size\n  ContainerType::iterator Iterator;\n\n  bool RequiresDelayedCacheLoad = false;\n  fextl::vector<Elf64_Phdr> ProgramHeaders;\n};\n\nunion VMAProt {\n  struct {\n    bool Readable   : 1;\n    bool Writable   : 1;\n    bool Executable : 1;\n  };\n  uint8_t All : 3;\n\n  static VMAProt fromProt(int Prot);\n  static VMAProt fromSHM(int SHMFlg);\n};\n\nstruct VMAFlags {\n  bool Shared : 1;\n\n  static VMAFlags fromFlags(int Flags);\n};\n\nstruct VMAEntry {\n  MappedResource* Resource;\n\n  // these are for intrusive linked list tracking, starting from Resource->FirstVMA and ordered by address\n  VMAEntry* ResourcePrevVMA;\n  VMAEntry* ResourceNextVMA;\n\n  uint64_t Base;\n  uint64_t Offset;\n  uint64_t Length;\n\n  VMAFlags Flags;\n  VMAProt Prot;\n};\n\nstruct VMATracking {\n  // Held while reading/writing this struct\n  FEXCore::ForkableSharedMutex Mutex;\n\n  // Memory ranges indexed by page aligned starting address\n  fextl::map<uint64_t, VMAEntry> VMAs;\n\n  using VMACIterator = decltype(VMAs)::const_iterator;\n\n  // Find a VMA entry associated with the memory address.\n  // Used by `mremap` and SIGSEGV handler to find previously mapped ranges, and CodeCache to find cache entries.\n  // - Mutex must be at least shared_locked before calling\n  VMACIterator FindVMAEntry(uint64_t GuestAddr) const;\n\n  // Adds a new VMA Range to be tracked, along with a `MappedResource` associated with that VMA range.\n  // Primarily matches `mmap` semantics, but also used by `mremap`, and `shmat`, as they all can add new VMA ranges to be tracked.\n  // - Mutex must be unique_locked before calling\n  void TrackVMARange(FEXCore::Context::Context* Ctx, MappedResource* MappedResource, uintptr_t Base, uintptr_t Offset, uintptr_t Length,\n                     VMAFlags Flags, VMAProt Prot);\n\n  // Deletes a VMA range provided from tracking.\n  // Matches `munmap` semantics, and `mremap` with `MREMAP_DONTUNMAP` flag set.\n  // Deletes internal `MappedResource` that correlates with the range **unless** it matches `PreservedMappedResource`\n  // - Mutex must be unique_locked before calling\n  void DeleteVMARange(FEXCore::Context::Context* Ctx, uintptr_t Base, uintptr_t Length, MappedResource* PreservedMappedResource = nullptr);\n\n  // Changes the protections tracking for the VMA range provided.\n  // Matches `mprotect` semantics.\n  // - Mutex must be unique_locked before calling\n  void ChangeProtectionFlags(uintptr_t Base, uintptr_t Length, VMAProt Prot);\n\n  // Deletes the SHM region mapped at Base from tracking.\n  // Matches `shmdt` semantics.\n  // - Mutex must be unique_locked before calling\n  // Returns the Size of the Shm or 0 if not found\n  uintptr_t DeleteSHMRegion(FEXCore::Context::Context* Ctx, uintptr_t Base);\n\n  // Adds a new `MappedResource` to track.\n  inline auto InsertMappedResource(const MRID& mrid, MappedResource Resource) {\n    return MappedResources.emplace(mrid, std::move(Resource));\n  }\n\n  // Returns an iterator pair spanning the range of all MappedResources matching the given MRID.\n  // Typically there is only one associated resource, however sometimes the same file gets mapped\n  // multiple times at different base addresses. In that case, each MappedResource will cover an\n  // exclusive set of VMAEntries that refer to a consistent base mapping address.\n  inline auto FindResources(const MRID& mrid) {\n    return MappedResources.equal_range(mrid);\n  }\n\nprivate:\n  MappedResource::ContainerType MappedResources;\n};\n\n\n} // namespace FEX::HLE::VMATracking\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/ThreadManager.cpp",
    "content": "// SPDX-License-Identifier: MIT\n\n#include \"LinuxSyscalls/ThreadManager.h\"\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/SignalDelegator.h\"\n#include \"LinuxSyscalls/Seccomp/SeccompEmulator.h\"\n\n#include <FEXHeaderUtils/Syscalls.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/Profiler.h>\n#include <FEXCore/fextl/fmt.h>\n\n#include <sys/mman.h>\n#include <sys/personality.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#include <git_version.h>\n\nnamespace FEX::HLE {\n\nThreadManager::StatAlloc::StatAlloc() {\n  Initialize();\n  SaveHeader(Is64BitMode() ? FEXCore::SHMStats::AppType::LINUX_64 : FEXCore::SHMStats::AppType::LINUX_32);\n}\n\nvoid ThreadManager::StatAlloc::Initialize() {\n  if (!ProfileStats()) {\n    return;\n  }\n\n  int fd = shm_open(fextl::fmt::format(\"fex-{}-stats\", ::getpid()).c_str(), O_CREAT | O_TRUNC | O_RDWR, USER_PERMS);\n  if (fd == -1) {\n    return;\n  }\n  CurrentSize = sysconf(_SC_PAGESIZE);\n  CurrentSize = CurrentSize > 0 ? CurrentSize : FEXCore::Utils::FEX_PAGE_SIZE;\n\n  if (ftruncate(fd, CurrentSize) == -1) {\n    LogMan::Msg::EFmt(\"[StatAlloc] ftruncate failed\");\n    goto err;\n  }\n\n  // Reserve a region of MAX_STATS_SIZE so we can grow the allocation buffer.\n  // Number of thread slots when ThreadStatsHeader == 64bytes and ThreadStats == 40bytes:\n  // 1 page: 99 slots\n  // 1 MB: 26211 slots\n  // 128 MB: 3355440 slots\n  Base = FEXCore::Allocator::mmap(nullptr, MAX_STATS_SIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);\n  if (Base == MAP_FAILED) {\n    LogMan::Msg::EFmt(\"[StatAlloc] mmap base failed\");\n    Base = nullptr;\n    goto err;\n  }\n\n  FEXCore::Allocator::VirtualName(\"FEXMem_Misc\", reinterpret_cast<void*>(Base), MAX_STATS_SIZE);\n\n  // Allocate a small working shared space for now, grow as necessary.\n  {\n    auto SharedBase = FEXCore::Allocator::mmap(Base, CurrentSize, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0);\n    if (SharedBase == MAP_FAILED) {\n      LogMan::Msg::EFmt(\"[StatAlloc] mmap shm failed\");\n      FEXCore::Allocator::munmap(Base, MAX_STATS_SIZE);\n      Base = nullptr;\n      goto err;\n    }\n  }\n\nerr:\n  close(fd);\n}\n\nuint32_t ThreadManager::StatAlloc::FrontendAllocateSlots(uint32_t NewSize) {\n  if (CurrentSize == MAX_STATS_SIZE) {\n    // Allocator has reached maximum slots. We can't allocate anymore.\n    // New threads won't get stats.\n    return CurrentSize;\n  }\n  NewSize = std::min(MAX_STATS_SIZE, NewSize);\n\n  // When allocating more slots, open the fd without O_TRUNC | O_CREAT.\n  int fd = shm_open(fextl::fmt::format(\"fex-{}-stats\", ::getpid()).c_str(), O_RDWR, USER_PERMS);\n  if (fd == -1) {\n    return CurrentSize;\n  }\n\n  if (ftruncate(fd, NewSize) == -1) {\n    LogMan::Msg::EFmt(\"[StatAlloc] ftruncate more failed\");\n\n    goto err;\n  }\n\n  {\n    auto SharedBase = FEXCore::Allocator::mmap(Base, NewSize, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0);\n    if (SharedBase == MAP_FAILED) {\n      LogMan::Msg::EFmt(\"[StatAlloc] allocate more mmap shm failed\");\n      goto err;\n    }\n  }\n\nerr:\n  close(fd);\n  return NewSize;\n}\n\nFEXCore::SHMStats::ThreadStats* ThreadManager::StatAlloc::AllocateSlot(uint32_t TID) {\n  std::scoped_lock lk(StatMutex);\n  return StatAllocBase::AllocateSlot(TID);\n}\n\nvoid ThreadManager::StatAlloc::DeallocateSlot(FEXCore::SHMStats::ThreadStats* AllocatedSlot) {\n  if (!AllocatedSlot) {\n    return;\n  }\n\n  std::scoped_lock lk(StatMutex);\n  StatAllocBase::DeallocateSlot(AllocatedSlot);\n}\n\nvoid ThreadManager::StatAlloc::CleanupForExit() {\n  shm_unlink(fextl::fmt::format(\"fex-{}-stats\", ::getpid()).c_str());\n}\n\nvoid ThreadManager::StatAlloc::LockBeforeFork() {\n  if (!ProfileStats()) {\n    return;\n  }\n  StatMutex.lock();\n}\n\nvoid ThreadManager::StatAlloc::UnlockAfterFork(FEXCore::Core::InternalThreadState* Thread, bool Child) {\n  if (!ProfileStats()) {\n    return;\n  }\n\n  if (!Child) {\n    StatMutex.unlock();\n    return;\n  }\n\n  StatMutex.StealAndDropActiveLocks();\n\n  // shm_memory ownership is retained by the parent process, so the child must replace it with its own one.\n  // Otherwise this process will keep reporting in the original parent thread's stats region.\n  FEXCore::Allocator::munmap(Base, MAX_STATS_SIZE);\n  Base = nullptr;\n  CurrentSize = 0;\n  Head = nullptr;\n  Stats = nullptr;\n  StatTail = nullptr;\n  RemainingSlots = 0;\n\n  Thread->ThreadStats = nullptr;\n\n  Initialize();\n  SaveHeader(Is64BitMode() ? FEXCore::SHMStats::AppType::LINUX_64 : FEXCore::SHMStats::AppType::LINUX_32);\n\n  // Update this thread's ThreadStats object\n  auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromFEXCoreThread(Thread);\n  ThreadObject->Thread->ThreadStats = AllocateSlot(ThreadObject->ThreadInfo.TID);\n}\n\nuint64_t ThreadManager::SetSignalMask(uint64_t Mask) {\n  ::syscall(SYSCALL_DEF(rt_sigprocmask), SIG_SETMASK, &Mask, &Mask, 8);\n  return Mask;\n}\n\nvoid ThreadManager::SetThreadName(const char* name) {\n  pthread_setname_np(pthread_self(), name);\n}\n\nconstexpr size_t CALLRET_STACK_ALLOC_SIZE = FEXCore::Core::InternalThreadState::CALLRET_STACK_SIZE + 2 * FEXCore::Utils::FEX_PAGE_SIZE;\n\nFEX::HLE::ThreadStateObject* ThreadManager::CreateThread(uint64_t InitialRIP, uint64_t StackPointer, const FEXCore::Core::CPUState* NewThreadState,\n                                                         uint64_t ParentTID, FEX::HLE::ThreadStateObject* InheritThread) {\n  auto ThreadStateObject = new FEX::HLE::ThreadStateObject;\n\n  ThreadStateObject->ThreadInfo.parent_tid = ParentTID;\n  ThreadStateObject->ThreadInfo.PID = ::getpid();\n\n  ThreadStateObject->ThreadInfo.TID = FHU::Syscalls::gettid();\n\n  ThreadStateObject->Thread = CTX->CreateThread(InitialRIP, StackPointer, NewThreadState);\n  auto Frame = ThreadStateObject->Thread->CurrentFrame;\n\n  // Allocate the call-ret stack with guard pages on both sides\n  auto AllocBase =\n    reinterpret_cast<uint64_t>(FEXCore::Allocator::mmap(nullptr, CALLRET_STACK_ALLOC_SIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));\n\n  FEXCore::Allocator::VirtualName(\"FEXMem_CallRetStacks\", reinterpret_cast<void*>(AllocBase), CALLRET_STACK_ALLOC_SIZE);\n\n  // Disable HUGEPAGE on callret stacks.\n  FEXCore::Allocator::VirtualTHPControl(reinterpret_cast<void*>(AllocBase), CALLRET_STACK_ALLOC_SIZE, FEXCore::Allocator::THPControl::Disable);\n\n  // Set the base used for invalidation to the start past the guard pages\n  ThreadStateObject->Thread->CallRetStackBase = reinterpret_cast<void*>(AllocBase + FEXCore::Utils::FEX_PAGE_SIZE);\n  ::mprotect(ThreadStateObject->Thread->CallRetStackBase, FEXCore::Core::InternalThreadState::CALLRET_STACK_SIZE, PROT_READ | PROT_WRITE);\n  Frame->State.callret_sp = ThreadStateObject->GetCallRetStackInfo().DefaultLocation;\n\n  ThreadStateObject->Thread->FrontendPtr = ThreadStateObject;\n  if (ProfileStats()) {\n    ThreadStateObject->Thread->ThreadStats = Stat.AllocateSlot(ThreadStateObject->ThreadInfo.TID);\n  }\n\n  // GDT and LDT are tracked per thread.\n  Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_GDT] = &ThreadStateObject->gdt[0];\n  // Mirror LDT to the GDT by default. Not technically correctly, but fixes crashes in unittests.\n  Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_LDT] = &ThreadStateObject->gdt[0];\n\n  if (InheritThread) {\n    // If we are inheriting thread data then we inherit both the gdt and ldt arrays.\n    // They are then forked from the parent thread.\n    static_assert(sizeof(ThreadStateObject->gdt) == (8 * 32));\n    memcpy(ThreadStateObject->gdt, InheritThread->gdt, sizeof(ThreadStateObject->gdt));\n    if (InheritThread->ldt_entry_count) {\n      const auto new_ldt_size = InheritThread->ldt_entry_count * FEX::HLE::SyscallHandler::LDT_ENTRY_SIZE;\n      ThreadStateObject->ldt_entries = reinterpret_cast<FEXCore::Core::CPUState::gdt_segment*>(\n        FEXCore::Allocator::mmap(nullptr, new_ldt_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));\n      FEXCore::Allocator::VirtualName(\"FEXMem_Misc\", reinterpret_cast<void*>(ThreadStateObject->ldt_entries), new_ldt_size);\n\n      ThreadStateObject->ldt_entry_count = InheritThread->ldt_entry_count;\n      memcpy(ThreadStateObject->ldt_entries, InheritThread->ldt_entries, new_ldt_size);\n    }\n  } else {\n    // Without any thread data to inherit, setup the default gdt.\n    // Default code segment indexes match the numbers that the Linux kernel uses.\n    Frame->State.cs_idx = FEXCore::Core::CPUState::DEFAULT_USER_CS << 3;\n    auto GDT = FEXCore::Core::CPUState::GetSegmentFromIndex(Frame->State, Frame->State.cs_idx);\n    FEXCore::Core::CPUState::SetGDTBase(GDT, 0);\n    FEXCore::Core::CPUState::SetGDTLimit(GDT, 0xF'FFFFU);\n    Frame->State.cs_cached =\n      FEXCore::Core::CPUState::CalculateGDTBase(*FEXCore::Core::CPUState::GetSegmentFromIndex(Frame->State, Frame->State.cs_idx));\n\n    if (Is64BitMode()) {\n      GDT->L = 1; // L = Long Mode = 64-bit\n      GDT->D = 0; // D = Default Operand SIze = Reserved\n    } else {\n      GDT->L = 0; // L = Long Mode = 32-bit\n      GDT->D = 1; // D = Default Operand Size = 32-bit\n    }\n  }\n\n  if (InheritThread) {\n    FEX::HLE::_SyscallHandler->SeccompEmulator.InheritSeccompFilters(InheritThread, ThreadStateObject);\n    ThreadStateObject->persona = InheritThread->persona;\n  } else {\n    ThreadStateObject->persona = ::personality(0xffffffff);\n  }\n\n  ++IdleWaitRefCount;\n  return ThreadStateObject;\n}\n\nvoid ThreadManager::DestroyThread(FEX::HLE::ThreadStateObject* Thread, bool NeedsTLSUninstall) {\n  {\n    std::lock_guard lk(ThreadCreationMutex);\n    auto It = std::find(Threads.begin(), Threads.end(), Thread);\n    LOGMAN_THROW_A_FMT(It != Threads.end(), \"Thread wasn't in Threads\");\n    Threads.erase(It);\n    if (Threads.empty()) {\n      Thread->Thread->CTX->FlushAndCloseCodeMap();\n    }\n  }\n\n  Stat.DeallocateSlot(Thread->Thread->ThreadStats);\n\n  HandleThreadDeletion(Thread, NeedsTLSUninstall);\n}\n\nvoid ThreadManager::StopThread(FEX::HLE::ThreadStateObject* Thread) {\n  SignalDelegation->SignalThread(Thread->Thread, SignalEvent::Stop);\n}\n\nvoid ThreadManager::HandleThreadDeletion(FEX::HLE::ThreadStateObject* Thread, bool NeedsTLSUninstall) {\n  if (Thread->ExecutionThread) {\n    if (Thread->ExecutionThread->joinable()) {\n      Thread->ExecutionThread->join(nullptr);\n    }\n\n    if (Thread->ExecutionThread->IsSelf()) {\n      Thread->ExecutionThread->detach();\n    }\n  }\n\n  if (NeedsTLSUninstall) {\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    // Sanity check. This can only be called from the owning thread.\n    {\n      const auto pid = ::getpid();\n      const auto tid = FHU::Syscalls::gettid();\n      LOGMAN_THROW_A_FMT(Thread->ThreadInfo.PID == pid && Thread->ThreadInfo.TID == tid, \"Can't delete TLS data from a different thread!\");\n    }\n#endif\n    FEXCore::Allocator::UninstallTLSData(Thread->Thread);\n  }\n\n  // Free the call-ret stack\n  FEXCore::Allocator::munmap(reinterpret_cast<void*>(Thread->GetCallRetStackInfo().AllocationBase), CALLRET_STACK_ALLOC_SIZE);\n\n  // If the LDT segment exists then deallocate it.\n  if (Thread->ldt_entry_count) {\n    FEXCore::Allocator::munmap(Thread->ldt_entries, Thread->ldt_entry_count * FEX::HLE::SyscallHandler::LDT_ENTRY_SIZE);\n  }\n\n  CTX->DestroyThread(Thread->Thread);\n  FEX::HLE::_SyscallHandler->SeccompEmulator.FreeSeccompFilters(Thread);\n\n  delete Thread;\n  --IdleWaitRefCount;\n  IdleWaitCV.notify_all();\n}\n\nvoid ThreadManager::NotifyPause() {\n  // Tell all the threads that they should pause\n  std::lock_guard lk(ThreadCreationMutex);\n  for (auto& Thread : Threads) {\n    SignalDelegation->SignalThread(Thread->Thread, SignalEvent::Pause);\n  }\n}\n\nvoid ThreadManager::Pause() {\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  // Sanity check. This can't be called from an emulation thread.\n  {\n    const auto pid = ::getpid();\n    const auto tid = FHU::Syscalls::gettid();\n    std::lock_guard lk(ThreadCreationMutex);\n    for (auto& Thread : Threads) {\n      LOGMAN_THROW_A_FMT(!(Thread->ThreadInfo.PID == pid && Thread->ThreadInfo.TID == tid), \"Can't put threads to sleep from inside \"\n                                                                                            \"emulation thread!\");\n    }\n  }\n#endif\n  NotifyPause();\n  WaitForIdle();\n}\n\nvoid ThreadManager::Run() {\n  // Spin up all the threads\n  std::lock_guard lk(ThreadCreationMutex);\n  for (auto& Thread : Threads) {\n    Thread->SignalReason.store(SignalEvent::Return);\n  }\n}\n\nvoid ThreadManager::WaitForIdleWithTimeout() {\n  std::unique_lock<std::mutex> lk(IdleWaitMutex);\n  bool WaitResult = IdleWaitCV.wait_for(lk, std::chrono::milliseconds(1500), [this] { return IdleWaitRefCount.load() == 0; });\n\n  if (!WaitResult) {\n    // The wait failed, this will occur if we stepped in to a syscall\n    // That's okay, we just need to pause the threads manually\n    NotifyPause();\n  }\n\n  // We have sent every thread a pause signal\n  // Now wait again because they /will/ be going to sleep\n  WaitForIdle();\n}\n\nvoid ThreadManager::WaitForThreadsToRun() {\n  size_t NumThreads {};\n  {\n    std::lock_guard lk(ThreadCreationMutex);\n    NumThreads = Threads.size();\n  }\n\n  // Spin while waiting for the threads to start up\n  std::unique_lock<std::mutex> lk(IdleWaitMutex);\n  IdleWaitCV.wait(lk, [this, NumThreads] { return IdleWaitRefCount.load() >= NumThreads; });\n\n  Running = true;\n}\n\nvoid ThreadManager::Step() {\n  LogMan::Msg::AFmt(\"ThreadManager::Step currently not implemented\");\n  {\n    std::lock_guard lk(ThreadCreationMutex);\n    // Walk the threads and tell them to clear their caches\n    // Useful when our block size is set to a large number and we need to step a single instruction\n    for (auto& Thread : Threads) {\n      CTX->ClearCodeCache(Thread->Thread, false);\n    }\n  }\n\n  // TODO: Set to single step mode.\n  Run();\n  WaitForThreadsToRun();\n  WaitForIdle();\n  // TODO: Set back to full running mode.\n}\n\nvoid ThreadManager::Stop(bool IgnoreCurrentThread) {\n  pid_t tid = FHU::Syscalls::gettid();\n  FEX::HLE::ThreadStateObject* CurrentThread {};\n\n  // Tell all the threads that they should stop\n  {\n    std::lock_guard lk(ThreadCreationMutex);\n    for (auto& Thread : Threads) {\n      if (IgnoreCurrentThread && Thread->ThreadInfo.TID == tid) {\n        // If we are callign stop from the current thread then we can ignore sending signals to this thread\n        // This means that this thread is already gone\n      } else if (Thread->ThreadInfo.TID == tid) {\n        // We need to save the current thread for last to ensure all threads receive their stop signals\n        CurrentThread = Thread;\n        continue;\n      }\n\n      StopThread(Thread);\n    }\n  }\n\n  // Stop the current thread now if we aren't ignoring it\n  if (CurrentThread) {\n    StopThread(CurrentThread);\n  }\n}\n\nvoid ThreadManager::SleepThread(FEXCore::Context::Context* CTX, FEXCore::Core::CpuStateFrame* Frame) {\n  auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n  // Sanity check. This can only be called from the owning thread.\n  {\n    const auto pid = ::getpid();\n    const auto tid = FHU::Syscalls::gettid();\n    LOGMAN_THROW_A_FMT(ThreadObject->ThreadInfo.PID == pid && ThreadObject->ThreadInfo.TID == tid, \"Can't delete TLS data from a different \"\n                                                                                                   \"thread!\");\n  }\n#endif\n\n  --IdleWaitRefCount;\n  IdleWaitCV.notify_all();\n\n  ThreadObject->ThreadSleeping = true;\n\n  // Go to sleep\n  ThreadObject->ThreadPaused.Wait();\n\n  ++IdleWaitRefCount;\n  ThreadObject->ThreadSleeping = false;\n\n  IdleWaitCV.notify_all();\n}\n\nvoid ThreadManager::UnpauseThread(FEX::HLE::ThreadStateObject* Thread) {\n  Thread->ThreadPaused.NotifyOne();\n}\n\nvoid ThreadManager::LockBeforeFork() {\n  Stat.LockBeforeFork();\n}\n\nvoid ThreadManager::UnlockAfterFork(FEXCore::Core::InternalThreadState* LiveThread, bool Child) {\n  Stat.UnlockAfterFork(LiveThread, Child);\n  if (!Child) {\n    return;\n  }\n\n  // This function is called after fork\n  // We need to cleanup some of the thread data that is dead\n  for (auto& DeadThread : Threads) {\n    // The fork parent retains ownership of ThreadStats\n    DeadThread->Thread->ThreadStats = nullptr;\n\n    if (DeadThread->Thread == LiveThread) {\n      continue;\n    }\n\n    // Despite what google searches may susgest, glibc actually has special code to handle forks\n    // with multiple active threads.\n    // It cleans up the stacks of dead threads and marks them as terminated.\n    // It also cleans up a bunch of internal mutexes.\n\n    // FIXME: TLS is probally still alive. Investigate\n\n    // Deconstructing the Interneal thread state should clean up most of the state.\n    // But if anything on the now deleted stack is holding a refrence to the heap, it will be leaked\n    CTX->DestroyThread(DeadThread->Thread);\n    delete DeadThread;\n\n    // FIXME: Make sure sure nothing gets leaked via the heap. Ideas:\n    //         * Make sure nothing is allocated on the heap without ref in InternalThreadState\n    //         * Surround any code that heap allocates with a per-thread mutex.\n    //           Before forking, the the forking thread can lock all thread mutexes.\n  }\n\n  // Remove all threads but the live thread from Threads\n  Threads.clear();\n\n  auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(LiveThread->CurrentFrame);\n  Threads.push_back(ThreadObject);\n\n  // Clean up dead stacks\n  FEXCore::Threads::Thread::CleanupAfterFork();\n\n  // We now only have one thread.\n  IdleWaitRefCount = 1;\n  ThreadCreationMutex.StealAndDropActiveLocks();\n}\n\nvoid ThreadManager::WaitForIdle() {\n  std::unique_lock<std::mutex> lk(IdleWaitMutex);\n  IdleWaitCV.wait(lk, [this] { return IdleWaitRefCount.load() == 0; });\n\n  Running = false;\n}\n\nThreadManager::~ThreadManager() {\n  std::lock_guard lk(ThreadCreationMutex);\n\n  for (auto& Thread : Threads) {\n    HandleThreadDeletion(Thread);\n  }\n  Threads.clear();\n}\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/ThreadManager.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|ThreadManager\ndesc: Frontend thread management\n$end_info$\n*/\n\n#pragma once\n\n#include \"Common/SHMStats.h\"\n\n#include \"LinuxSyscalls/Types.h\"\n#include \"LinuxSyscalls/x32/IoctlEmulation.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXCore/Utils/InterruptableConditionVariable.h>\n#include <FEXCore/Utils/Profiler.h>\n#include <FEXCore/Utils/SignalScopeGuards.h>\n#include <FEXCore/Utils/Threads.h>\n#include <FEXCore/Utils/TypeDefines.h>\n\n#include <atomic>\n#include <condition_variable>\n#include <cstddef>\n#include <cstdint>\n#include <mutex>\n#include <optional>\n#include <sys/stat.h>\n\n#include <bits/types/sigset_t.h>\n#include <linux/seccomp.h>\n\nnamespace FEX::HLE {\nclass SignalDelegator;\nclass SyscallHandler;\nstruct SeccompFilterInfo;\n\nenum class SignalEvent : uint32_t {\n  Nothing, // If the guest uses our signal we need to know it was errant on our end\n  Pause,\n  Stop,\n  Return,\n  ReturnRT,\n};\n\nstruct ThreadStateObject : public FEXCore::Allocator::FEXAllocOperators {\n  struct DeferredSignalState {\n    siginfo_t Info;\n    int Signal;\n    uint64_t SigMask;\n  };\n\n  FEXCore::Core::InternalThreadState* Thread;\n\n  struct {\n    uint32_t parent_tid;\n    uint32_t PID;\n    std::atomic<uint32_t> TID;\n    int32_t* set_child_tid {0};\n    int32_t* clear_child_tid {0};\n    uint64_t robust_list_head {0};\n  } ThreadInfo {};\n\n  struct {\n    SignalDelegator* Delegator {};\n\n    void* AltStackPtr {};\n    stack_t GuestAltStack {\n      .ss_sp = nullptr,\n      .ss_flags = SS_DISABLE, // By default the guest alt stack is disabled\n      .ss_size = 0,\n    };\n    // This is the thread's current signal mask\n    FEX::HLE::GuestSAMask CurrentSignalMask {};\n    // The mask prior to a suspend\n    FEX::HLE::GuestSAMask PreviousSuspendMask {};\n\n    uint64_t PendingSignals {};\n\n    // Queue of thread local signal frames that have been deferred.\n    // Async signals aren't guaranteed to be delivered in any particular order, but FEX treats them as FILO.\n    fextl::vector<DeferredSignalState> DeferredSignalFrames;\n  } SignalInfo {};\n\n  // Seccomp thread specific data.\n  uint32_t SeccompMode {SECCOMP_MODE_DISABLED};\n  fextl::vector<FEX::HLE::SeccompFilterInfo*> Filters {};\n\n  // personality emulation.\n  uint32_t persona {};\n\n  FEXCore::Core::NonMovableUniquePtr<FEXCore::Threads::Thread> ExecutionThread;\n\n  // Thread signaling information\n  std::atomic<SignalEvent> SignalReason {SignalEvent::Nothing};\n\n  // Thread pause handling\n  std::atomic_bool ThreadSleeping {false};\n  FEXCore::InterruptableConditionVariable ThreadPaused;\n\n  // GDB signal information\n  struct GdbInfoStruct {\n    int Signal {};\n  };\n  std::optional<GdbInfoStruct> GdbInfo;\n\n  int StatusCode {};\n\n  struct CallRetStackInfo {\n    uint64_t AllocationBase;\n    uint64_t AllocationEnd;\n    uint64_t DefaultLocation;\n  };\n\n  CallRetStackInfo GetCallRetStackInfo() {\n    uint64_t Base = reinterpret_cast<uint64_t>(Thread->CallRetStackBase);\n    // Leave some room from the base for the default location to allow for underflows without constant exceptions\n    return {Base - FEXCore::Utils::FEX_PAGE_SIZE, Base + FEXCore::Core::InternalThreadState::CALLRET_STACK_SIZE + FEXCore::Utils::FEX_PAGE_SIZE,\n            Base + FEXCore::Core::InternalThreadState::CALLRET_STACK_SIZE / 4};\n  }\n\n  // GDT and LDT tracking\n  FEXCore::Core::CPUState::gdt_segment gdt[32] {};\n  size_t ldt_entry_count {};\n  FEXCore::Core::CPUState::gdt_segment* ldt_entries {};\n\n  // 32-bit FD cache for DRM handlers.\n  fextl::unique_ptr<x32::DRMLRUCacheFDCache> DRMLRUCache {};\n};\n\nclass ThreadManager final {\npublic:\n\n  ThreadManager(FEXCore::Context::Context* CTX, FEX::HLE::SignalDelegator* SignalDelegation)\n    : CTX {CTX}\n    , SignalDelegation {SignalDelegation} {}\n\n  ~ThreadManager();\n\n  class StatAlloc final : public FEX::SHMStats::StatAllocBase {\n  public:\n    StatAlloc();\n\n    void LockBeforeFork();\n    void UnlockAfterFork(FEXCore::Core::InternalThreadState* Thread, bool Child);\n\n    void CleanupForExit();\n\n    FEXCore::SHMStats::ThreadStats* AllocateSlot(uint32_t TID);\n    void DeallocateSlot(FEXCore::SHMStats::ThreadStats* AllocatedSlot);\n\n  private:\n    void Initialize();\n\n    uint32_t FrontendAllocateSlots(uint32_t NewSize) override;\n    FEX_CONFIG_OPT(ProfileStats, PROFILESTATS);\n    FEX_CONFIG_OPT(Is64BitMode, IS64BIT_MODE);\n\n    constexpr static int USER_PERMS = S_IRWXU | S_IRWXG | S_IRWXO;\n    FEXCore::ForkableUniqueMutex StatMutex;\n  };\n\n  void CleanupForExit() {\n    Stat.CleanupForExit();\n  }\n\n  /**\n   * @brief Sets the calling thread's signal mask to the one provided\n   *\n   * @param Mask The new 64-bit signal mask to set\n   *\n   * @return The previous signal mask\n   */\n  static uint64_t SetSignalMask(uint64_t Mask);\n  static void SetThreadName(const char* name);\n\n  ///< Returns the ThreadStateObject from a CpuStateFrame object.\n  static inline FEX::HLE::ThreadStateObject* GetStateObjectFromCPUState(FEXCore::Core::CpuStateFrame* Frame) {\n    return static_cast<FEX::HLE::ThreadStateObject*>(Frame->Thread->FrontendPtr);\n  }\n\n  static inline FEX::HLE::ThreadStateObject* GetStateObjectFromFEXCoreThread(FEXCore::Core::InternalThreadState* Thread) {\n    return static_cast<FEX::HLE::ThreadStateObject*>(Thread->FrontendPtr);\n  }\n\n  FEX::HLE::ThreadStateObject* CreateThread(uint64_t InitialRIP, uint64_t StackPointer, const FEXCore::Core::CPUState* NewThreadState = nullptr,\n                                            uint64_t ParentTID = 0, FEX::HLE::ThreadStateObject* InheritThread = nullptr);\n  void TrackThread(FEX::HLE::ThreadStateObject* Thread) {\n    std::lock_guard lk(ThreadCreationMutex);\n    Threads.emplace_back(Thread);\n  }\n\n  void DestroyThread(FEX::HLE::ThreadStateObject* Thread, bool NeedsTLSUninstall = false);\n  void StopThread(FEX::HLE::ThreadStateObject* Thread);\n  void UnpauseThread(FEX::HLE::ThreadStateObject* Thread);\n\n  void Pause();\n  void Run();\n  void Step();\n  void Stop(bool IgnoreCurrentThread = false);\n\n  void WaitForIdle();\n  void WaitForIdleWithTimeout();\n  void WaitForThreadsToRun();\n\n  void SleepThread(FEXCore::Context::Context* CTX, FEXCore::Core::CpuStateFrame* Frame);\n\n  void LockBeforeFork();\n  void UnlockAfterFork(FEXCore::Core::InternalThreadState* Thread, bool Child);\n\n  void IncrementIdleRefCount() {\n    ++IdleWaitRefCount;\n  }\n\n  void InvalidateGuestCodeRange(FEXCore::Core::InternalThreadState* CallingThread, uint64_t Start, uint64_t Length) {\n    std::lock_guard lk(ThreadCreationMutex);\n\n    // Potential deferred since Thread might not be valid.\n    // Thread object isn't valid very early in frontend's initialization.\n    // To be more optimal the frontend should provide this code with a valid Thread object earlier.\n    auto CodeInvalidationlk = GuardSignalDeferringSectionWithFallback(CTX->GetCodeInvalidationMutex(), CallingThread);\n    CTX->InvalidateCodeBuffersCodeRange(Start, Length);\n    for (auto& Thread : Threads) {\n      CTX->InvalidateThreadCachedCodeRange(Thread->Thread, Start, Length);\n    }\n  }\n\n  void InvalidateGuestCodeRange(FEXCore::Core::InternalThreadState* CallingThread, uint64_t Start, uint64_t Length,\n                                FEXCore::Context::CodeRangeInvalidationFn after_callback) {\n    std::lock_guard lk(ThreadCreationMutex);\n\n    // Potential deferred since Thread might not be valid.\n    // Thread object isn't valid very early in frontend's initialization.\n    // To be more optimal the frontend should provide this code with a valid Thread object earlier.\n    auto CodeInvalidationlk = GuardSignalDeferringSectionWithFallback(CTX->GetCodeInvalidationMutex(), CallingThread);\n    CTX->InvalidateCodeBuffersCodeRange(Start, Length);\n    for (auto& Thread : Threads) {\n      CTX->InvalidateThreadCachedCodeRange(Thread->Thread, Start, Length);\n    }\n\n    // Callback while holding the locks.\n    after_callback(Start, Length);\n  }\n\n  const fextl::vector<FEX::HLE::ThreadStateObject*>* GetThreads() const {\n    return &Threads;\n  }\n\nprivate:\n  StatAlloc Stat;\n  FEXCore::Context::Context* CTX;\n  FEX::HLE::SignalDelegator* SignalDelegation;\n\n  FEXCore::ForkableUniqueMutex ThreadCreationMutex;\n  fextl::vector<FEX::HLE::ThreadStateObject*> Threads;\n\n  // Thread idling support.\n  bool Running {};\n  std::mutex IdleWaitMutex;\n  std::condition_variable IdleWaitCV;\n  std::atomic<uint32_t> IdleWaitRefCount {};\n\n  void HandleThreadDeletion(FEX::HLE::ThreadStateObject* Thread, bool NeedsTLSUninstall = false);\n  void NotifyPause();\n  FEX_CONFIG_OPT(ProfileStats, PROFILESTATS);\n  FEX_CONFIG_OPT(Is64BitMode, IS64BIT_MODE);\n};\n\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Types.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/CompilerDefs.h>\n\n#include <algorithm>\n#include <signal.h>\n#include <sys/epoll.h>\n#include <type_traits>\n\nnamespace FEX::HLE {\nusing key_serial_t = int32_t;\nusing kernel_timer_t = int32_t;\nusing mqd_t = int32_t;\n\n#ifndef GETPID\n#define GETPID 11\n#endif\n\n#ifndef GETVAL\n#define GETVAL 12\n#endif\n\n#ifndef GETALL\n#define GETALL 13\n#endif\n\n#ifndef GETNCNT\n#define GETNCNT 14\n#endif\n\n#ifndef GETZCNT\n#define GETZCNT 15\n#endif\n\n#ifndef SETVAL\n#define SETVAL 16\n#endif\n\n#ifndef SETALL\n#define SETALL 17\n#endif\n\n#ifndef SEM_STAT\n#define SEM_STAT 18\n#endif\n\n#ifndef SEM_INFO\n#define SEM_INFO 19\n#endif\n\n#ifndef SEM_STAT_ANY\n#define SEM_STAT_ANY 20\n#endif\n\nstruct FEX_PACKED epoll_event_x86 {\n  uint32_t events;\n  epoll_data_t data;\n\n  epoll_event_x86() = delete;\n\n  operator struct epoll_event() const {\n    epoll_event event {};\n    event.events = events;\n    event.data = data;\n    return event;\n  }\n\n  epoll_event_x86(struct epoll_event event) {\n    events = event.events;\n    data = event.data;\n  }\n};\nstatic_assert(std::is_trivially_copyable_v<epoll_event_x86>);\nstatic_assert(sizeof(epoll_event_x86) == 12);\n\n// This directly matches the Linux `struct seminfo` structure\n// Due to the way this definition cyclic depends inside of includes, redefine it\n// This works around some terrible compile errors on some platforms\nstruct fex_seminfo {\n  int32_t semmap;\n  int32_t semmni;\n  int32_t semmns;\n  int32_t semmnu;\n  int32_t semmsl;\n  int32_t semopm;\n  int32_t semume;\n  int32_t semusz;\n  int32_t semvmx;\n  int32_t semaem;\n};\n\nstruct FEX_PACKED GuestSAMask {\n  uint64_t Val;\n};\n\nstruct FEX_PACKED GuestSigAction {\n  union {\n    void (*handler)(int);\n    void (*sigaction)(int, siginfo_t*, void*);\n  } sigaction_handler;\n\n  uint64_t sa_flags;\n  void (*restorer)(void);\n  GuestSAMask sa_mask;\n};\n\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Utils/Threads.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"LinuxSyscalls/Utils/Threads.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/LongJump.h>\n#include <FEXCore/Utils/Threads.h>\n\nnamespace FEX::LinuxEmulation::Threads {\nvoid* StackTracker::AllocateStackObject() {\n  std::lock_guard lk {DeadStackPoolMutex};\n  // Keep the first item in the stack pool\n  void* Ptr {};\n\n  for (auto it = DeadStackPool.begin(); it != DeadStackPool.end();) {\n    auto Ready = std::atomic_ref<bool>(it->ReadyToBeReaped);\n    bool ReadyToBeReaped = Ready.load();\n    if (Ptr == nullptr && ReadyToBeReaped) {\n      Ptr = it->Ptr;\n      it = DeadStackPool.erase(it);\n      continue;\n    }\n\n    if (ReadyToBeReaped) {\n      FEXCore::Allocator::munmap(it->Ptr, it->Size);\n      it = DeadStackPool.erase(it);\n      continue;\n    }\n\n    ++it;\n  }\n\n  if (Ptr == nullptr) {\n    Ptr = FEXCore::Allocator::mmap(nullptr, FEX::LinuxEmulation::Threads::STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n    FEXCore::Allocator::VirtualName(\"FEXMem_Misc\", reinterpret_cast<void*>(Ptr), FEX::LinuxEmulation::Threads::STACK_SIZE);\n  }\n\n  return Ptr;\n}\n\nbool* StackTracker::AddStackToDeadPool(void* Ptr) {\n  std::lock_guard lk {DeadStackPoolMutex};\n  auto& it = DeadStackPool.emplace_back(DeadStackPoolItem {Ptr, FEX::LinuxEmulation::Threads::STACK_SIZE, false});\n  return &it.ReadyToBeReaped;\n}\n\nvoid StackTracker::AddStackToLivePool(void* Ptr) {\n  std::lock_guard lk {LiveStackPoolMutex};\n  LiveStackPool.emplace_back(StackPoolItem {Ptr, FEX::LinuxEmulation::Threads::STACK_SIZE});\n}\n\nvoid StackTracker::RemoveStackFromLivePool(void* Ptr) {\n  std::lock_guard lk {LiveStackPoolMutex};\n  for (auto it = LiveStackPool.begin(); it != LiveStackPool.end(); ++it) {\n    if (it->Ptr == Ptr) {\n      LiveStackPool.erase(it);\n      return;\n    }\n  }\n}\n\nvoid StackTracker::CleanupAfterFork_PThread() {\n  // We don't need to pull the mutex here\n  // After a fork we are the only thread running\n  // Just need to make sure not to delete our own stack\n  uintptr_t StackLocation = reinterpret_cast<uintptr_t>(alloca(0));\n\n  auto ClearStackPool = [StackLocation](auto& StackPool) {\n    for (auto it = StackPool.begin(); it != StackPool.end();) {\n      auto& Item = *it;\n      uintptr_t ItemStack = reinterpret_cast<uintptr_t>(Item.Ptr);\n      if (ItemStack <= StackLocation && (ItemStack + Item.Size) > StackLocation) {\n        // This is our stack item, skip it\n        ++it;\n      } else {\n        // Untracked stack. Clean it up\n        FEXCore::Allocator::munmap(Item.Ptr, Item.Size);\n        it = StackPool.erase(it);\n      }\n    }\n  };\n\n  // Clear both dead stacks and live stacks\n  ClearStackPool(DeadStackPool);\n  ClearStackPool(LiveStackPool);\n\n  LogMan::Throw::AFmt((DeadStackPool.size() + LiveStackPool.size()) <= 1, \"After fork we should only have zero or one tracked stacks!\");\n}\n\nvoid StackTracker::Shutdown() {\n  std::lock_guard lk {DeadStackPoolMutex};\n  std::lock_guard lk2 {LiveStackPoolMutex};\n  // Erase all the dead stack pools\n  for (auto& Item : DeadStackPool) {\n    FEXCore::Allocator::munmap(Item.Ptr, Item.Size);\n  }\n\n  // Now clean up any that are considered to still be live\n  // We are in shutdown phase, everything in the process is dead\n  for (auto& Item : LiveStackPool) {\n    FEXCore::Allocator::munmap(Item.Ptr, Item.Size);\n  }\n\n  DeadStackPool.clear();\n  LiveStackPool.clear();\n}\n\nvoid StackTracker::DeallocateStackObjectImmediately(void* Ptr) {\n  if (Ptr) {\n    RemoveStackFromLivePool(Ptr);\n    auto ReadyToBeReaped = AddStackToDeadPool(Ptr);\n    *ReadyToBeReaped = true;\n  }\n}\n\n[[noreturn]]\nvoid StackTracker::DeallocateStackObjectAndExit(void* Ptr, int Status) {\n  if (Ptr) {\n    RemoveStackFromLivePool(Ptr);\n    auto ReadyToBeReaped = AddStackToDeadPool(Ptr);\n    *ReadyToBeReaped = true;\n  }\n\n#ifdef ARCHITECTURE_arm64\n  __asm volatile(\"mov x8, %[SyscallNum];\"\n                 \"mov w0, %w[Result];\"\n                 \"svc #0;\" ::[SyscallNum] \"i\"(SYSCALL_DEF(exit)),\n                 [Result] \"r\"(Status)\n                 : \"memory\", \"x0\", \"x8\");\n#else\n  __asm volatile(\"mov %[Result], %%edi;\"\n                 \"syscall;\" ::\"a\"(SYSCALL_DEF(exit)),\n                 [Result] \"r\"(Status)\n                 : \"memory\", \"rdi\");\n#endif\n  FEX_UNREACHABLE;\n}\n\n#ifdef ARCHITECTURE_arm64\n__attribute__((naked)) void StackPivotAndCall(void* Arg, FEXCore::Threads::ThreadFunc Func, uint64_t StackPivot) {\n  // x0: Arg\n  // x1: Function to call\n  // x2: StackPivot\n  __asm volatile(R\"(\n    // Stack pivot.\n    mov x3, sp;\n    mov sp, x2;\n\n    // Store stack storage location on to current stack\n    stp x3, lr, [sp, -16]!;\n\n    // x0 already has argument to pass.\n    blr x1\n\n    // Reload stack storage location\n    ldp x2, lr, [sp], 16;\n\n    // Stack pivot back\n    mov sp, x2;\n\n    ret;\n    )\" ::\n                   : \"memory\");\n}\n#else\n__attribute__((naked)) void StackPivotAndCall(void* Arg, FEXCore::Threads::ThreadFunc Func, uint64_t StackPivot) {\n  // rdi: Arg\n  // rsi: Function to call\n  // rdx: StackPivot\n  __asm volatile(R\"(\n    // Copy original stack in to RSP.\n    movq %%rsp, %%rcx;\n\n    // Store original stack on new stack\n    pushq %%rcx;\n\n    // Store stack pivot on new stack.\n    pushq %%rdx;\n\n    // rdi already contains function argument.\n    callq *%%rsi;\n\n    // Restore original stack\n    popq %%rsp;\n\n    ret;\n\n    )\" ::\n                   : \"memory\");\n}\n#endif\nnamespace PThreads {\n  void* InitializeThread(void* Ptr);\n\n  class PThread final : public FEXCore::Threads::Thread {\n  public:\n    PThread(StackTracker* STracker, FEXCore::Threads::ThreadFunc Func, void* Arg)\n      : STracker {STracker}\n      , UserFunc {Func}\n      , UserArg {Arg} {\n      pthread_attr_t Attr {};\n      Stack = STracker->AllocateStackObject();\n      // pthreads allocates its dtv region behind our back and there is nothing we can do about it.\n      FEXCore::Allocator::YesIKnowImNotSupposedToUseTheGlibcAllocator glibc;\n      STracker->AddStackToLivePool(Stack);\n      pthread_attr_init(&Attr);\n      // Allocate a minimum size stack through pthreads, then stack pivot to FEX's allocated stack.\n      // This is required due to a race condition with pthread's DTV/TLS regions when a stack is reused before pthreads deletes that thread's\n      // DTV/TLS regions.\n      // This can be seen as a crash when running Steam fairly easily, but is very confusing when debugging.\n      // The cause of this race condition is from glibc associating a DTV/TLS region with a stack region until the kernel clears the\n      // `set_tid_address` address construct. If the stack is reused before the address is set to zero, then glibc won't initialize the new thread's\n      // DTV/TLS region, resulting in TLS usage crashing.\n      pthread_attr_setstacksize(&Attr, PTHREAD_STACK_MIN);\n      pthread_create(&Thread, &Attr, InitializeThread, this);\n      pthread_attr_destroy(&Attr);\n    }\n\n    bool joinable() override {\n      pthread_attr_t Attr {};\n      if (pthread_getattr_np(Thread, &Attr) == 0) {\n        int AttachState {};\n        if (pthread_attr_getdetachstate(&Attr, &AttachState) == 0) {\n          if (AttachState == PTHREAD_CREATE_JOINABLE) {\n            pthread_attr_destroy(&Attr);\n            return true;\n          }\n        }\n        pthread_attr_destroy(&Attr);\n      }\n      return false;\n    }\n\n    bool join(void** ret) override {\n      return pthread_join(Thread, ret) == 0;\n    }\n\n    bool detach() override {\n      return pthread_detach(Thread) == 0;\n    }\n\n    bool IsSelf() override {\n      auto self = pthread_self();\n      return self == Thread;\n    }\n\n    FEXCore::Threads::ThreadFunc GetUserFunc() const {\n      return UserFunc;\n    }\n\n    void* GetUserArg() const {\n      return UserArg;\n    }\n\n    void* GetPivotStack() const {\n      return Stack;\n    }\n\n    StackTracker* GetStackTracker() const {\n      return STracker;\n    }\n\n    void SetupLongJump(FEXCore::UncheckedLongJump::JumpBuf* exit_resolver) {\n      _exit_resolver = exit_resolver;\n    }\n\n    [[noreturn]]\n    void LongJumpExit(FEX::HLE::ThreadStateObject* ThreadObject, uint32_t Status) {\n      this->Status = Status;\n      this->ThreadObject = ThreadObject;\n      FEXCore::UncheckedLongJump::LongJump(*_exit_resolver, 1);\n      FEX_UNREACHABLE;\n    }\n\n    uint32_t GetStatus() const {\n      return Status;\n    }\n\n    FEX::HLE::ThreadStateObject* GetThreadObject() const {\n      return ThreadObject;\n    }\n\n  private:\n    pthread_t Thread;\n    StackTracker* STracker;\n    FEXCore::Threads::ThreadFunc UserFunc;\n    void* UserArg;\n    void* Stack {};\n\n    // Use FEXCore's UncheckedLongJump to avoid fortification checks.\n    // This avoids a false positive since glibc does not understand stack pivots.\n    FEXCore::UncheckedLongJump::JumpBuf* _exit_resolver {};\n    FEX::HLE::ThreadStateObject* ThreadObject {};\n    uint32_t Status {};\n  };\n\n  void* InitializeThread(void* Ptr) {\n    void* StackBase {};\n    StackTracker* STracker {};\n    PThread* Thread {reinterpret_cast<PThread*>(Ptr)};\n    StackBase = Thread->GetPivotStack();\n    STracker = Thread->GetStackTracker();\n    FEXCore::UncheckedLongJump::JumpBuf exit_resolver {};\n\n    bool LongJumpExit {};\n\n    if (FEXCore::UncheckedLongJump::SetJump(exit_resolver) == 0) {\n      Thread->SetupLongJump(&exit_resolver);\n      // Run the user function.\n      // `Thread` object is dead after this function returns.\n      StackPivotAndCall(Thread->GetUserArg(), Thread->GetUserFunc(),\n                        reinterpret_cast<uint64_t>(StackBase) + FEX::LinuxEmulation::Threads::STACK_SIZE);\n    } else {\n      LongJumpExit = true;\n    }\n\n    const auto Status = Thread->GetStatus();\n    auto ThreadObject = Thread->GetThreadObject();\n    // TLS/DTV teardown is something FEX can't control. Disable glibc checking when we leave a pthread.\n    FEXCore::Allocator::YesIKnowImNotSupposedToUseTheGlibcAllocator::HardDisable();\n\n    // Detach to ensure thread teardown occurs.\n    Thread->detach();\n\n    if (LongJumpExit) {\n      // We have ownership of the thread object. Make sure to clean it up to prevent memory leaks.\n      FEX::HLE::_SyscallHandler->TM.DestroyThread(ThreadObject, true);\n      if (Status == 0) {\n        // If status is zero then we can safely deallocate this thread's pivot stack (Which is no longer used).\n        STracker->DeallocateStackObjectImmediately(StackBase);\n        StackBase = nullptr;\n      }\n    }\n\n    if (!LongJumpExit || Status != 0) {\n      // If we didn't have a long jump exit (So not a pthread thread) OR status wasn't zero then we need to terminate locally.\n      // There is an api limitation in glibc/pthreads where a function's return value is ignored and not passed to SYS_exit.\n      // In or to match error condition thread exits, we must call SYS_exit ourselves in this case.\n      //\n      // This is a memory leak if this is a pthread based thread! We can't work around this.\n      // - Leaks 128KB PTHREAD_STACK_MIN\n      // - Leaks some glibc internal dtv tracking data.\n      STracker->DeallocateStackObjectAndExit(StackBase, Status);\n      FEX_UNREACHABLE;\n    }\n\n    // Give control back to pthreads.\n    // This is required so glibc puts this thread's stack back in the stack cache, preventing a memory leak.\n    // We can't use pthread_exit since that requires libgcc_s.so unwinder support which might not be available.\n    // We are /expecting/ pthreads to return this status to the _exit syscall.\n    return (void*)(uint64_t)Status;\n  }\n\n  StackTracker* STracker {};\n\n  fextl::unique_ptr<FEXCore::Threads::Thread> CreateThread_PThread(FEXCore::Threads::ThreadFunc Func, void* Arg) {\n    return fextl::make_unique<PThread>(STracker, Func, Arg);\n  }\n\n  void CleanupAfterFork_PThread() {\n    STracker->CleanupAfterFork_PThread();\n  }\n\n}; // namespace PThreads\n\nfextl::unique_ptr<StackTracker> SetupThreadHandlers() {\n  FEXCore::Threads::Pointers Ptrs = {\n    .CreateThread = PThreads::CreateThread_PThread,\n    .CleanupAfterFork = PThreads::CleanupAfterFork_PThread,\n  };\n\n  FEXCore::Threads::Thread::SetInternalPointers(Ptrs);\n\n  PThreads::STracker = new StackTracker();\n  return fextl::unique_ptr<StackTracker>(PThreads::STracker);\n}\n\nvoid* AllocateStackObject() {\n  return PThreads::STracker->AllocateStackObject();\n}\n\n[[noreturn]]\nvoid DeallocateStackObjectAndExit(void* Ptr, int Status) {\n  PThreads::STracker->DeallocateStackObjectAndExit(Ptr, Status);\n  FEX_UNREACHABLE;\n}\n\n[[noreturn]]\nvoid LongjumpDeallocateAndExit(FEX::HLE::ThreadStateObject* ThreadObject, int Status) {\n  auto ThreadObject_P = reinterpret_cast<PThreads::PThread*>(ThreadObject->ExecutionThread.get());\n  ThreadObject_P->LongJumpExit(ThreadObject, Status);\n  FEX_UNREACHABLE;\n}\n\nvoid* GetStackBase(FEXCore::Threads::Thread* ThreadObject) {\n  auto ThreadObject_P = reinterpret_cast<PThreads::PThread*>(ThreadObject);\n  return ThreadObject_P->GetPivotStack();\n}\n\nvoid Shutdown(fextl::unique_ptr<StackTracker> STracker) {\n  STracker->Shutdown();\n  STracker.reset();\n  PThreads::STracker = nullptr;\n}\n} // namespace FEX::LinuxEmulation::Threads\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/Utils/Threads.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/fextl/deque.h>\n#include <FEXCore/fextl/memory.h>\n\n#include <cstddef>\n#include <mutex>\n\nnamespace FEXCore::Threads {\nclass Thread;\n}\n\nnamespace FEX::HLE {\nstruct ThreadStateObject;\n}\n\nnamespace FEX::LinuxEmulation::Threads {\n/**\n * @brief Size of the stack that this interface creates.\n */\nconstexpr size_t STACK_SIZE = 8 * 1024 * 1024;\n// Stack pool handling\nstruct StackPoolItem {\n  void* Ptr;\n  size_t Size;\n};\n\nstruct DeadStackPoolItem {\n  void* Ptr;\n  size_t Size;\n  bool ReadyToBeReaped;\n};\n\nclass StackTracker final : public FEXCore::Allocator::FEXAllocOperators {\npublic:\n  void* AllocateStackObject();\n  bool* AddStackToDeadPool(void* Ptr);\n  void AddStackToLivePool(void* Ptr);\n  void RemoveStackFromLivePool(void* Ptr);\n\n  void DeallocateStackObjectImmediately(void* Ptr);\n\n  [[noreturn]]\n  void DeallocateStackObjectAndExit(void* Ptr, int Status);\n\n  void CleanupAfterFork_PThread();\n\n  void Shutdown();\n\nprivate:\n  std::mutex DeadStackPoolMutex {};\n  std::mutex LiveStackPoolMutex {};\n\n  fextl::deque<DeadStackPoolItem> DeadStackPool {};\n  fextl::deque<StackPoolItem> LiveStackPool {};\n};\n\n/**\n * @brief Allocates a stack object from the internally managed stack pool.\n */\nvoid* AllocateStackObject();\n\n/**\n * @brief Deallocates a stack from the internally managed stack pool.\n *\n * Will not free the memory immediately, instead saving for reuse temporarily to solve race conditions on stack usage while stack tears down.\n *\n * @param Ptr The stack base from `AllocateStackObject`\n * @param Status The status to pass to the exit syscall.\n */\n[[noreturn]]\nvoid DeallocateStackObjectAndExit(void* Ptr, int Status);\n\nvoid* GetStackBase(FEXCore::Threads::Thread* ThreadObject);\n\n[[noreturn]]\nvoid LongjumpDeallocateAndExit(FEX::HLE::ThreadStateObject* ThreadObject, int Status);\n\n/**\n * @brief Registers thread creation handlers with FEXCore.\n */\nfextl::unique_ptr<StackTracker> SetupThreadHandlers();\n\n/**\n * @brief Cleans up any remaining stack objects in the pools.\n */\nvoid Shutdown(fextl::unique_ptr<StackTracker> STracker);\n} // namespace FEX::LinuxEmulation::Threads\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/EPoll.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\nmeta: LinuxSyscalls|syscalls-x86-32 ~ x86-32 specific syscall implementations\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/Types.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Types.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n\n#include <FEXCore/fextl/vector.h>\n\n#include <algorithm>\n#include <cstdint>\n#include <sys/epoll.h>\n#include <syscall.h>\n#include <time.h>\n#include <unistd.h>\n\nARG_TO_STR(FEX::HLE::x32::compat_ptr<FEX::HLE::x32::epoll_event32>, \"%lx\")\nARG_TO_STR(FEX::HLE::x32::compat_ptr<FEX::HLE::x32::timespec32>, \"%lx\")\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nnamespace FEX::HLE::x32 {\nvoid RegisterEpoll(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X32(\n    epoll_wait,\n    [](FEXCore::Core::CpuStateFrame* Frame, int epfd, compat_ptr<FEX::HLE::x32::epoll_event32> events, int maxevents, int timeout) -> uint64_t {\n      fextl::vector<struct epoll_event> Events(std::max(0, maxevents));\n      uint64_t Result = ::syscall(SYSCALL_DEF(epoll_pwait), epfd, Events.data(), maxevents, timeout, nullptr, 8);\n\n      if (Result != -1) {\n        FaultSafeUserMemAccess::VerifyIsWritable(events, sizeof(FEX::HLE::x32::epoll_event32) * Result);\n        for (size_t i = 0; i < Result; ++i) {\n          events[i] = Events[i];\n        }\n      }\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    epoll_ctl, [](FEXCore::Core::CpuStateFrame* Frame, int epfd, int op, int fd, compat_ptr<FEX::HLE::x32::epoll_event32> event) -> uint64_t {\n      struct epoll_event Event;\n      struct epoll_event* EventPtr {};\n      if (event) {\n        FaultSafeUserMemAccess::VerifyIsReadable(event, sizeof(FEX::HLE::x32::epoll_event32));\n        Event = *event;\n        EventPtr = &Event;\n      }\n      uint64_t Result = ::syscall(SYSCALL_DEF(epoll_ctl), epfd, op, fd, EventPtr);\n\n      if (Result != -1 && event) {\n        FaultSafeUserMemAccess::VerifyIsWritable(event, sizeof(FEX::HLE::x32::epoll_event32));\n        *event = Event;\n      }\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(epoll_pwait,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int epfd, compat_ptr<FEX::HLE::x32::epoll_event32> events, int maxevent,\n                               int timeout, const uint64_t* sigmask, size_t sigsetsize) -> uint64_t {\n                              fextl::vector<struct epoll_event> Events(std::max(0, maxevent));\n\n                              uint64_t Result = ::syscall(SYSCALL_DEF(epoll_pwait), epfd, Events.data(), maxevent, timeout, sigmask, sigsetsize);\n\n                              if (Result != -1) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(events, sizeof(FEX::HLE::x32::epoll_event32) * Result);\n                                for (size_t i = 0; i < Result; ++i) {\n                                  events[i] = Events[i];\n                                }\n                              }\n\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(epoll_pwait2,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int epfd, compat_ptr<FEX::HLE::x32::epoll_event32> events, int maxevent,\n                               compat_ptr<timespec32> timeout, const uint64_t* sigmask, size_t sigsetsize) -> uint64_t {\n                              fextl::vector<struct epoll_event> Events(std::max(0, maxevent));\n\n                              struct timespec tp64 {};\n                              struct timespec* timed_ptr {};\n                              if (timeout) {\n                                tp64 = *timeout;\n                                timed_ptr = &tp64;\n                              }\n\n                              uint64_t Result =\n                                ::syscall(SYSCALL_DEF(epoll_pwait2), epfd, Events.data(), maxevent, timed_ptr, sigmask, sigsetsize);\n\n                              if (Result != -1) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(events, sizeof(FEX::HLE::x32::epoll_event32) * Result);\n                                for (size_t i = 0; i < Result; ++i) {\n                                  events[i] = Events[i];\n                                }\n                              }\n\n                              SYSCALL_ERRNO();\n                            });\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/FD.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x32/IoctlEmulation.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x32/SyscallsEnum.h\"\n#include \"LinuxSyscalls/x32/Types.h\"\n\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <algorithm>\n#include <cstdint>\n#include <fcntl.h>\n#include <limits>\n#include <poll.h>\n#include <signal.h>\n#include <stddef.h>\n#include <string.h>\n#include <sys/select.h>\n#include <sys/sendfile.h>\n#include <sys/stat.h>\n#include <sys/statfs.h>\n#include <sys/time.h>\n#include <sys/timerfd.h>\n#include <sys/types.h>\n#include <sys/uio.h>\n#include <syscall.h>\n#include <time.h>\n#include <type_traits>\n#include <unistd.h>\n\nARG_TO_STR(FEX::HLE::x32::compat_ptr<FEX::HLE::x32::sigset_argpack32>, \"%lx\")\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nnamespace FEX::HLE::x32 {\n// Used to ensure no bogus values are passed into readv/writev family syscalls.\n// This is mainly to sanitize vector sizing. It's fine for the bogus value\n// itself to pass into the syscall, since the kernel will handle it.\nstatic constexpr int SanitizeIOCount(int count) {\n  return std::max(0, count);\n}\n\n#ifdef ARCHITECTURE_x86_64\nuint32_t ioctl_32(FEXCore::Core::CpuStateFrame*, int fd, uint32_t cmd, uint32_t args) {\n  uint32_t Result {};\n  __asm volatile(\"int $0x80;\" : \"=a\"(Result) : \"a\"(SYSCALL_x86_ioctl), \"b\"(fd), \"c\"(cmd), \"d\"(args) : \"memory\");\n  return Result;\n}\n#endif\n// These are redefined to be their non-64bit tagged value on x86-64\nconstexpr int OP_GETLK64_32 = 12;\nconstexpr int OP_SETLK64_32 = 13;\nconstexpr int OP_SETLKW64_32 = 14;\n\nauto fcntlHandler = [](FEXCore::Core::CpuStateFrame* Frame, int fd, int cmd, uint64_t arg) -> uint64_t {\n  // fcntl64 struct directly matches the 64bit fcntl op\n  // cmd just needs to be fixed up\n\n  void* lock_arg = (void*)arg;\n  struct flock tmp {};\n  int old_cmd = cmd;\n\n  switch (old_cmd) {\n  case OP_GETLK64_32: {\n    cmd = F_GETLK;\n    lock_arg = (void*)&tmp;\n    FaultSafeUserMemAccess::VerifyIsReadable(reinterpret_cast<void*>(arg), sizeof(flock64_32));\n    tmp = *reinterpret_cast<flock64_32*>(arg);\n    break;\n  }\n  case OP_SETLK64_32: {\n    cmd = F_SETLK;\n    lock_arg = (void*)&tmp;\n    FaultSafeUserMemAccess::VerifyIsReadable(reinterpret_cast<void*>(arg), sizeof(flock64_32));\n    tmp = *reinterpret_cast<flock64_32*>(arg);\n    break;\n  }\n  case OP_SETLKW64_32: {\n    cmd = F_SETLKW;\n    lock_arg = (void*)&tmp;\n    FaultSafeUserMemAccess::VerifyIsReadable(reinterpret_cast<void*>(arg), sizeof(flock64_32));\n    tmp = *reinterpret_cast<flock64_32*>(arg);\n    break;\n  }\n  case F_OFD_SETLK:\n  case F_OFD_GETLK:\n  case F_OFD_SETLKW: {\n    lock_arg = (void*)&tmp;\n    FaultSafeUserMemAccess::VerifyIsReadable(reinterpret_cast<void*>(arg), sizeof(flock64_32));\n    tmp = *reinterpret_cast<flock64_32*>(arg);\n    break;\n  }\n  case F_GETLK:\n  case F_SETLK:\n  case F_SETLKW: {\n    lock_arg = (void*)&tmp;\n    FaultSafeUserMemAccess::VerifyIsReadable(reinterpret_cast<void*>(arg), sizeof(flock_32));\n    tmp = *reinterpret_cast<flock_32*>(arg);\n    break;\n  }\n\n  case F_SETFL: lock_arg = reinterpret_cast<void*>(FEX::HLE::RemapFromX86Flags(arg)); break;\n  // Everything else maps directly. Check `COMPAT_SYSCALL_DEFINE3(fcntl64, ...)` entrypoint in the kernel if this changes.\n  default: break;\n  }\n\n  uint64_t Result = ::fcntl(fd, cmd, lock_arg);\n\n  if (Result != -1) {\n    switch (old_cmd) {\n    case OP_GETLK64_32: {\n      FaultSafeUserMemAccess::VerifyIsWritable(reinterpret_cast<void*>(arg), sizeof(flock64_32));\n      *reinterpret_cast<flock64_32*>(arg) = tmp;\n      break;\n    }\n    case F_OFD_GETLK: {\n      FaultSafeUserMemAccess::VerifyIsWritable(reinterpret_cast<void*>(arg), sizeof(flock64_32));\n      *reinterpret_cast<flock64_32*>(arg) = tmp;\n      break;\n    }\n    case F_GETLK: {\n      FaultSafeUserMemAccess::VerifyIsWritable(reinterpret_cast<void*>(arg), sizeof(flock_32));\n      *reinterpret_cast<flock_32*>(arg) = tmp;\n      break;\n    } break;\n    case F_DUPFD:\n    case F_DUPFD_CLOEXEC: FEX::HLE::x32::CheckAndAddFDDuplication(Frame, fd, Result); break;\n    case F_GETFL: {\n      Result = FEX::HLE::RemapToX86Flags(Result);\n      break;\n    }\n    default: break;\n    }\n  }\n  SYSCALL_ERRNO();\n};\n\nauto fcntl32Handler = [](FEXCore::Core::CpuStateFrame* Frame, int fd, int cmd, uint64_t arg) -> uint64_t {\n  // fcntl32 handler explicitly blocks these commands.\n  switch (cmd) {\n  case OP_GETLK64_32:\n  case OP_SETLK64_32:\n  case OP_SETLKW64_32:\n  case F_OFD_GETLK:\n  case F_OFD_SETLK:\n  case F_OFD_SETLKW: return -EINVAL;\n  default: break;\n  }\n\n  return fcntlHandler(Frame, fd, cmd, arg);\n};\n\nauto selectHandler = [](FEXCore::Core::CpuStateFrame* Frame, int nfds, fd_set32* readfds, fd_set32* writefds, fd_set32* exceptfds,\n                        struct timeval32* timeout) -> uint64_t {\n  struct timeval tp64 {};\n  if (timeout) {\n    FaultSafeUserMemAccess::VerifyIsReadable(timeout, sizeof(*timeout));\n    tp64 = *timeout;\n  }\n\n  fd_set Host_readfds;\n  fd_set Host_writefds;\n  fd_set Host_exceptfds;\n  FD_ZERO(&Host_readfds);\n  FD_ZERO(&Host_writefds);\n  FD_ZERO(&Host_exceptfds);\n\n  // Round up to the full 32bit word\n  uint32_t NumWords = FEXCore::AlignUp(nfds, 32) / 4;\n\n  if (readfds) {\n    FaultSafeUserMemAccess::VerifyIsReadable(readfds, sizeof(fd_set32) * NumWords);\n    for (int i = 0; i < NumWords; ++i) {\n      uint32_t FD = readfds[i];\n      int32_t Rem = nfds - (i * 32);\n      for (int j = 0; j < 32 && j < Rem; ++j) {\n        if ((FD >> j) & 1) {\n          FD_SET(i * 32 + j, &Host_readfds);\n        }\n      }\n    }\n  }\n\n  if (writefds) {\n    FaultSafeUserMemAccess::VerifyIsReadable(writefds, sizeof(fd_set32) * NumWords);\n    for (int i = 0; i < NumWords; ++i) {\n      uint32_t FD = writefds[i];\n      int32_t Rem = nfds - (i * 32);\n      for (int j = 0; j < 32 && j < Rem; ++j) {\n        if ((FD >> j) & 1) {\n          FD_SET(i * 32 + j, &Host_writefds);\n        }\n      }\n    }\n  }\n\n  if (exceptfds) {\n    FaultSafeUserMemAccess::VerifyIsReadable(exceptfds, sizeof(fd_set32) * NumWords);\n    for (int i = 0; i < NumWords; ++i) {\n      uint32_t FD = exceptfds[i];\n      int32_t Rem = nfds - (i * 32);\n      for (int j = 0; j < 32 && j < Rem; ++j) {\n        if ((FD >> j) & 1) {\n          FD_SET(i * 32 + j, &Host_exceptfds);\n        }\n      }\n    }\n  }\n\n  uint64_t Result = ::select(nfds, readfds ? &Host_readfds : nullptr, writefds ? &Host_writefds : nullptr,\n                             exceptfds ? &Host_exceptfds : nullptr, timeout ? &tp64 : nullptr);\n  if (readfds) {\n    FaultSafeUserMemAccess::VerifyIsWritable(readfds, sizeof(fd_set32) * NumWords);\n    for (int i = 0; i < nfds; ++i) {\n      if (FD_ISSET(i, &Host_readfds)) {\n        readfds[i / 32] |= 1 << (i & 31);\n      } else {\n        readfds[i / 32] &= ~(1 << (i & 31));\n      }\n    }\n  }\n\n  if (writefds) {\n    FaultSafeUserMemAccess::VerifyIsWritable(writefds, sizeof(fd_set32) * NumWords);\n    for (int i = 0; i < nfds; ++i) {\n      if (FD_ISSET(i, &Host_writefds)) {\n        writefds[i / 32] |= 1 << (i & 31);\n      } else {\n        writefds[i / 32] &= ~(1 << (i & 31));\n      }\n    }\n  }\n\n  if (exceptfds) {\n    FaultSafeUserMemAccess::VerifyIsWritable(exceptfds, sizeof(fd_set32) * NumWords);\n    for (int i = 0; i < nfds; ++i) {\n      if (FD_ISSET(i, &Host_exceptfds)) {\n        exceptfds[i / 32] |= 1 << (i & 31);\n      } else {\n        exceptfds[i / 32] &= ~(1 << (i & 31));\n      }\n    }\n  }\n\n  if (timeout) {\n    FaultSafeUserMemAccess::VerifyIsWritable(timeout, sizeof(*timeout));\n    *timeout = tp64;\n  }\n  SYSCALL_ERRNO();\n};\n\nvoid RegisterFD(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X32(ppoll,\n                            [](FEXCore::Core::CpuStateFrame* Frame, struct pollfd* fds, nfds_t nfds, timespec32* timeout_ts,\n                               const uint64_t* sigmask, size_t sigsetsize) -> uint64_t {\n                              // sigsetsize is unused here since it is currently a constant and not exposed through glibc\n                              struct timespec tp64 {};\n                              struct timespec* timed_ptr {};\n                              if (timeout_ts) {\n                                struct timespec32 timeout {};\n                                if (FaultSafeUserMemAccess::CopyFromUser(&timeout, timeout_ts, sizeof(timeout)) == EFAULT) {\n                                  return -EFAULT;\n                                }\n\n                                tp64 = timeout;\n                                timed_ptr = &tp64;\n                              }\n\n                              uint64_t Result = ::syscall(SYSCALL_DEF(ppoll), fds, nfds, timed_ptr, sigmask, sigsetsize);\n\n                              if (timeout_ts) {\n                                struct timespec32 timeout {};\n                                timeout = tp64;\n\n                                if (FaultSafeUserMemAccess::CopyToUser(timeout_ts, &timeout, sizeof(timeout)) == EFAULT) {\n                                  // Write to user memory failed, this can occur if the timeout is defined in read-only memory.\n                                  // This is okay to happen, kernel continues happily.\n                                }\n                              }\n\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    _llseek, [](FEXCore::Core::CpuStateFrame* Frame, uint32_t fd, uint32_t offset_high, uint32_t offset_low, loff_t* result, uint32_t whence) -> uint64_t {\n      uint64_t Offset = offset_high;\n      Offset <<= 32;\n      Offset |= offset_low;\n      uint64_t Result = lseek(fd, Offset, whence);\n      if (Result != -1) {\n        FaultSafeUserMemAccess::VerifyIsWritable(result, sizeof(*result));\n        *result = Result;\n        // On non-error result, llseek returns zero (As the result is returned in pointer).\n        return 0;\n      }\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(readv, [](FEXCore::Core::CpuStateFrame* Frame, int fd, const struct iovec32* iov, int iovcnt) -> uint64_t {\n    FaultSafeUserMemAccess::VerifyIsReadable(iov, sizeof(struct iovec32) * SanitizeIOCount(iovcnt));\n    fextl::vector<iovec> Host_iovec(iov, iov + SanitizeIOCount(iovcnt));\n    uint64_t Result = ::readv(fd, Host_iovec.data(), iovcnt);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(writev, [](FEXCore::Core::CpuStateFrame* Frame, int fd, const struct iovec32* iov, int iovcnt) -> uint64_t {\n    FaultSafeUserMemAccess::VerifyIsReadable(iov, sizeof(struct iovec32) * SanitizeIOCount(iovcnt));\n    fextl::vector<iovec> Host_iovec(iov, iov + SanitizeIOCount(iovcnt));\n    uint64_t Result = ::writev(fd, Host_iovec.data(), iovcnt);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(chown32, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, uid_t owner, gid_t group) -> uint64_t {\n    uint64_t Result = ::chown(pathname, owner, group);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(lchown32, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, uid_t owner, gid_t group) -> uint64_t {\n    uint64_t Result = ::lchown(pathname, owner, group);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(oldstat, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, oldstat32* buf) -> uint64_t {\n    struct stat host_stat;\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Stat(pathname, &host_stat);\n    if (Result != -1) {\n      if (host_stat.st_ino > std::numeric_limits<decltype(buf->st_ino)>::max()) {\n        return -EOVERFLOW;\n      }\n      if (host_stat.st_nlink > std::numeric_limits<decltype(buf->st_nlink)>::max()) {\n        return -EOVERFLOW;\n      }\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(oldfstat, [](FEXCore::Core::CpuStateFrame* Frame, int fd, oldstat32* buf) -> uint64_t {\n    struct stat host_stat;\n    uint64_t Result = ::fstat(fd, &host_stat);\n    if (Result != -1) {\n      if (host_stat.st_ino > std::numeric_limits<decltype(buf->st_ino)>::max()) {\n        return -EOVERFLOW;\n      }\n      if (host_stat.st_nlink > std::numeric_limits<decltype(buf->st_nlink)>::max()) {\n        return -EOVERFLOW;\n      }\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(oldlstat, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, oldstat32* buf) -> uint64_t {\n    struct stat host_stat;\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Lstat(path, &host_stat);\n    if (Result != -1) {\n      if (host_stat.st_ino > std::numeric_limits<decltype(buf->st_ino)>::max()) {\n        return -EOVERFLOW;\n      }\n      if (host_stat.st_nlink > std::numeric_limits<decltype(buf->st_nlink)>::max()) {\n        return -EOVERFLOW;\n      }\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(stat, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, stat32* buf) -> uint64_t {\n    struct stat host_stat;\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Stat(pathname, &host_stat);\n    if (Result != -1) {\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(fstat, [](FEXCore::Core::CpuStateFrame* Frame, int fd, stat32* buf) -> uint64_t {\n    struct stat host_stat;\n    uint64_t Result = ::fstat(fd, &host_stat);\n    if (Result != -1) {\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(lstat, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, stat32* buf) -> uint64_t {\n    struct stat host_stat;\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Lstat(path, &host_stat);\n    if (Result != -1) {\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(stat64, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, stat64_32* buf) -> uint64_t {\n    struct stat host_stat;\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Stat(pathname, &host_stat);\n    if (Result != -1) {\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(lstat64, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, stat64_32* buf) -> uint64_t {\n    struct stat host_stat;\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Lstat(path, &host_stat);\n\n    if (Result != -1) {\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(fstat64, [](FEXCore::Core::CpuStateFrame* Frame, int fd, stat64_32* buf) -> uint64_t {\n    struct stat64 host_stat;\n    uint64_t Result = ::fstat64(fd, &host_stat);\n    if (Result != -1) {\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(statfs, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, statfs32_32* buf) -> uint64_t {\n    struct statfs host_stat;\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Statfs(path, &host_stat);\n    if (Result != -1) {\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(fstatfs, [](FEXCore::Core::CpuStateFrame* Frame, int fd, statfs32_32* buf) -> uint64_t {\n    struct statfs host_stat;\n    uint64_t Result = ::fstatfs(fd, &host_stat);\n    if (Result != -1) {\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(fstatfs64, [](FEXCore::Core::CpuStateFrame* Frame, int fd, size_t sz, struct statfs64_32* buf) -> uint64_t {\n    LOGMAN_THROW_A_FMT(sz == sizeof(struct statfs64_32), \"This needs to match\");\n\n    struct statfs64 host_stat;\n    uint64_t Result = ::fstatfs64(fd, &host_stat);\n    if (Result != -1) {\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(statfs64, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, size_t sz, struct statfs64_32* buf) -> uint64_t {\n    LOGMAN_THROW_A_FMT(sz == sizeof(struct statfs64_32), \"This needs to match\");\n\n    struct statfs host_stat;\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Statfs(path, &host_stat);\n    if (Result != -1) {\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n      *buf = host_stat;\n    }\n\n    SYSCALL_ERRNO();\n  });\n\n  // x86 32-bit fcntl syscall has a historical quirk that it uses the same handler as fcntl64\n  // This is in direct opposition to all other 32-bit architectures that use the compat_fcntl handler\n  // This quirk goes back to the start of the Linux 2.6.12-rc2 git history. Seeing history before\n  // that point to see when this quirk happened would be difficult\n  //\n  // For more reference, the compat_fcntl handler blocks a few commands:\n  // - F_GETLK64\n  // - F_SETLK64\n  // - F_SETLKW64\n  // - F_OFD_GETLK\n  // - F_OFD_SETLK\n  // - F_OFD_SETLKW\n\n  REGISTER_SYSCALL_IMPL_X32(fcntl, fcntl32Handler);\n  REGISTER_SYSCALL_IMPL_X32(fcntl64, fcntlHandler);\n\n  REGISTER_SYSCALL_IMPL_X32(dup, [](FEXCore::Core::CpuStateFrame* Frame, int oldfd) -> uint64_t {\n    uint64_t Result = ::dup(oldfd);\n    if (Result != -1) {\n      CheckAndAddFDDuplication(Frame, oldfd, Result);\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(dup2, [](FEXCore::Core::CpuStateFrame* Frame, int oldfd, int newfd) -> uint64_t {\n    uint64_t Result = ::dup2(oldfd, newfd);\n    if (Result != -1) {\n      CheckAndAddFDDuplication(Frame, oldfd, newfd);\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    preadv, [](FEXCore::Core::CpuStateFrame* Frame, int fd, const struct iovec32* iov, uint32_t iovcnt, uint32_t pos_low, uint32_t pos_high) -> uint64_t {\n      FaultSafeUserMemAccess::VerifyIsReadable(iov, sizeof(struct iovec32) * SanitizeIOCount(iovcnt));\n      fextl::vector<iovec> Host_iovec(iov, iov + SanitizeIOCount(iovcnt));\n\n      uint64_t Result = ::syscall(SYSCALL_DEF(preadv), fd, Host_iovec.data(), iovcnt, pos_low, pos_high);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    pwritev, [](FEXCore::Core::CpuStateFrame* Frame, int fd, const struct iovec32* iov, uint32_t iovcnt, uint32_t pos_low, uint32_t pos_high) -> uint64_t {\n      FaultSafeUserMemAccess::VerifyIsReadable(iov, sizeof(struct iovec32) * SanitizeIOCount(iovcnt));\n      fextl::vector<iovec> Host_iovec(iov, iov + SanitizeIOCount(iovcnt));\n\n      uint64_t Result = ::syscall(SYSCALL_DEF(pwritev), fd, Host_iovec.data(), iovcnt, pos_low, pos_high);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(process_vm_readv,\n                            [](FEXCore::Core::CpuStateFrame* Frame, pid_t pid, const struct iovec32* local_iov, unsigned long liovcnt,\n                               const struct iovec32* remote_iov, unsigned long riovcnt, unsigned long flags) -> uint64_t {\n                              FaultSafeUserMemAccess::VerifyIsReadable(local_iov, sizeof(struct iovec32) * SanitizeIOCount(liovcnt));\n                              FaultSafeUserMemAccess::VerifyIsReadable(remote_iov, sizeof(struct iovec32) * SanitizeIOCount(riovcnt));\n\n                              fextl::vector<iovec> Host_local_iovec(local_iov, local_iov + SanitizeIOCount(liovcnt));\n                              fextl::vector<iovec> Host_remote_iovec(remote_iov, remote_iov + SanitizeIOCount(riovcnt));\n\n                              uint64_t Result =\n                                ::process_vm_readv(pid, Host_local_iovec.data(), liovcnt, Host_remote_iovec.data(), riovcnt, flags);\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(process_vm_writev,\n                            [](FEXCore::Core::CpuStateFrame* Frame, pid_t pid, const struct iovec32* local_iov, unsigned long liovcnt,\n                               const struct iovec32* remote_iov, unsigned long riovcnt, unsigned long flags) -> uint64_t {\n                              FaultSafeUserMemAccess::VerifyIsReadable(local_iov, sizeof(struct iovec32) * SanitizeIOCount(liovcnt));\n                              FaultSafeUserMemAccess::VerifyIsReadable(remote_iov, sizeof(struct iovec32) * SanitizeIOCount(riovcnt));\n\n                              fextl::vector<iovec> Host_local_iovec(local_iov, local_iov + SanitizeIOCount(liovcnt));\n                              fextl::vector<iovec> Host_remote_iovec(remote_iov, remote_iov + SanitizeIOCount(riovcnt));\n\n                              uint64_t Result =\n                                ::process_vm_writev(pid, Host_local_iovec.data(), liovcnt, Host_remote_iovec.data(), riovcnt, flags);\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(preadv2,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int fd, const struct iovec32* iov, uint32_t iovcnt, uint32_t pos_low,\n                               uint32_t pos_high, int flags) -> uint64_t {\n                              FaultSafeUserMemAccess::VerifyIsReadable(iov, sizeof(struct iovec32) * SanitizeIOCount(iovcnt));\n                              fextl::vector<iovec> Host_iovec(iov, iov + SanitizeIOCount(iovcnt));\n\n                              uint64_t Result = ::syscall(SYSCALL_DEF(preadv2), fd, Host_iovec.data(), iovcnt, pos_low, pos_high, flags);\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(pwritev2,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int fd, const struct iovec32* iov, uint32_t iovcnt, uint32_t pos_low,\n                               uint32_t pos_high, int flags) -> uint64_t {\n                              FaultSafeUserMemAccess::VerifyIsReadable(iov, sizeof(struct iovec32) * SanitizeIOCount(iovcnt));\n                              fextl::vector<iovec> Host_iovec(iov, iov + SanitizeIOCount(iovcnt));\n\n                              uint64_t Result = ::syscall(SYSCALL_DEF(pwritev2), fd, Host_iovec.data(), iovcnt, pos_low, pos_high, flags);\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(fstatat_64, [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, stat64_32* buf, int flag) -> uint64_t {\n    struct stat64 host_stat;\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.NewFSStatAt64(dirfd, pathname, &host_stat, flag);\n    if (Result != -1) {\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(ioctl, ioctl32);\n\n  REGISTER_SYSCALL_IMPL_X32(getdents, [](FEXCore::Core::CpuStateFrame* Frame, int fd, void* dirp, uint32_t count) -> uint64_t {\n    return GetDentsEmulation<true>(fd, reinterpret_cast<FEX::HLE::x32::linux_dirent_32*>(dirp), count);\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(getdents64, [](FEXCore::Core::CpuStateFrame* Frame, int fd, void* dirp, uint32_t count) -> uint64_t {\n    uint64_t Result = ::syscall(SYSCALL_DEF(getdents64), static_cast<uint64_t>(fd), dirp, static_cast<uint64_t>(count));\n    if (Result != -1) {\n      // Walk each offset\n      // if we are passing the full d_off to the 32bit application then it seems to break things?\n      for (size_t i = 0, num = 0; i < Result; ++num) {\n        linux_dirent_64* Incoming = (linux_dirent_64*)(reinterpret_cast<uint64_t>(dirp) + i);\n        Incoming->d_off = num;\n        if (FEX::HLE::_SyscallHandler->FM.IsProtectedFile(fd, Incoming->d_ino)) {\n          Result -= Incoming->d_reclen;\n          memmove(Incoming, (linux_dirent_64*)(reinterpret_cast<uint64_t>(Incoming) + Incoming->d_reclen), Result - i);\n          continue;\n        }\n        i += Incoming->d_reclen;\n      }\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(select, [](FEXCore::Core::CpuStateFrame* Frame, compat_select_args* arg) -> uint64_t {\n    return selectHandler(Frame, arg->nfds, arg->readfds, arg->writefds, arg->exceptfds, arg->timeout);\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(_newselect, selectHandler);\n\n  REGISTER_SYSCALL_IMPL_X32(pselect6,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int nfds, fd_set32* readfds, fd_set32* writefds, fd_set32* exceptfds,\n                               timespec32* timeout, compat_ptr<sigset_argpack32> sigmaskpack) -> uint64_t {\n                              struct timespec tp64 {};\n                              if (timeout) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(timeout, sizeof(*timeout));\n                                tp64 = *timeout;\n                              }\n\n                              fd_set Host_readfds;\n                              fd_set Host_writefds;\n                              fd_set Host_exceptfds;\n                              sigset_t HostSet {};\n\n                              FD_ZERO(&Host_readfds);\n                              FD_ZERO(&Host_writefds);\n                              FD_ZERO(&Host_exceptfds);\n                              sigemptyset(&HostSet);\n\n                              // Round up to the full 32bit word\n                              uint32_t NumWords = FEXCore::AlignUp(nfds, 32) / 4;\n\n                              if (readfds) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(readfds, sizeof(fd_set32) * NumWords);\n                                for (int i = 0; i < NumWords; ++i) {\n                                  uint32_t FD = readfds[i];\n                                  int32_t Rem = nfds - (i * 32);\n                                  for (int j = 0; j < 32 && j < Rem; ++j) {\n                                    if ((FD >> j) & 1) {\n                                      FD_SET(i * 32 + j, &Host_readfds);\n                                    }\n                                  }\n                                }\n                              }\n\n                              if (writefds) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(writefds, sizeof(fd_set32) * NumWords);\n                                for (int i = 0; i < NumWords; ++i) {\n                                  uint32_t FD = writefds[i];\n                                  int32_t Rem = nfds - (i * 32);\n                                  for (int j = 0; j < 32 && j < Rem; ++j) {\n                                    if ((FD >> j) & 1) {\n                                      FD_SET(i * 32 + j, &Host_writefds);\n                                    }\n                                  }\n                                }\n                              }\n\n                              if (exceptfds) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(exceptfds, sizeof(fd_set32) * NumWords);\n                                for (int i = 0; i < NumWords; ++i) {\n                                  uint32_t FD = exceptfds[i];\n                                  int32_t Rem = nfds - (i * 32);\n                                  for (int j = 0; j < 32 && j < Rem; ++j) {\n                                    if ((FD >> j) & 1) {\n                                      FD_SET(i * 32 + j, &Host_exceptfds);\n                                    }\n                                  }\n                                }\n                              }\n\n                              FaultSafeUserMemAccess::VerifyIsReadableOrNull(sigmaskpack, sizeof(*sigmaskpack));\n                              if (sigmaskpack && sigmaskpack->sigset) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(sigmaskpack->sigset, sizeof(*sigmaskpack->sigset));\n                                uint64_t* sigmask = sigmaskpack->sigset;\n                                size_t sigsetsize = sigmaskpack->size;\n                                for (int32_t i = 0; i < (sigsetsize * 8); ++i) {\n                                  if (*sigmask & (1ULL << i)) {\n                                    sigaddset(&HostSet, i + 1);\n                                  }\n                                }\n                              }\n\n                              uint64_t Result = ::pselect(nfds, readfds ? &Host_readfds : nullptr, writefds ? &Host_writefds : nullptr,\n                                                          exceptfds ? &Host_exceptfds : nullptr, timeout ? &tp64 : nullptr, &HostSet);\n\n                              if (readfds) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(readfds, sizeof(fd_set32) * NumWords);\n                                for (int i = 0; i < nfds; ++i) {\n                                  if (FD_ISSET(i, &Host_readfds)) {\n                                    readfds[i / 32] |= 1 << (i & 31);\n                                  } else {\n                                    readfds[i / 32] &= ~(1 << (i & 31));\n                                  }\n                                }\n                              }\n\n                              if (writefds) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(writefds, sizeof(fd_set32) * NumWords);\n                                for (int i = 0; i < nfds; ++i) {\n                                  if (FD_ISSET(i, &Host_writefds)) {\n                                    writefds[i / 32] |= 1 << (i & 31);\n                                  } else {\n                                    writefds[i / 32] &= ~(1 << (i & 31));\n                                  }\n                                }\n                              }\n\n                              if (exceptfds) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(exceptfds, sizeof(fd_set32) * NumWords);\n                                for (int i = 0; i < nfds; ++i) {\n                                  if (FD_ISSET(i, &Host_exceptfds)) {\n                                    exceptfds[i / 32] |= 1 << (i & 31);\n                                  } else {\n                                    exceptfds[i / 32] &= ~(1 << (i & 31));\n                                  }\n                                }\n                              }\n\n                              if (timeout) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(timeout, sizeof(*timeout));\n                                *timeout = tp64;\n                              }\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    fadvise64, [](FEXCore::Core::CpuStateFrame* Frame, int32_t fd, uint32_t offset_low, uint32_t offset_high, uint32_t len, int advice) -> uint64_t {\n      uint64_t Offset = offset_high;\n      Offset <<= 32;\n      Offset |= offset_low;\n      uint64_t Result = ::posix_fadvise64(fd, Offset, len, advice);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(fadvise64_64,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int32_t fd, uint32_t offset_low, uint32_t offset_high, uint32_t len_low,\n                               uint32_t len_high, int advice) -> uint64_t {\n                              uint64_t Offset = offset_high;\n                              Offset <<= 32;\n                              Offset |= offset_low;\n                              uint64_t Len = len_high;\n                              Len <<= 32;\n                              Len |= len_low;\n                              uint64_t Result = ::posix_fadvise64(fd, Offset, Len, advice);\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(timerfd_settime,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int fd, int flags, const FEX::HLE::x32::old_itimerspec32* new_value,\n                               FEX::HLE::x32::old_itimerspec32* old_value) -> uint64_t {\n                              struct itimerspec new_value_host {};\n                              struct itimerspec old_value_host {};\n                              struct itimerspec* old_value_host_p {};\n\n                              new_value_host = *new_value;\n                              if (old_value) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(old_value, sizeof(*old_value));\n                                old_value_host_p = &old_value_host;\n                              }\n\n                              // Flags don't need remapped\n                              uint64_t Result = ::timerfd_settime(fd, flags, &new_value_host, old_value_host_p);\n\n                              if (Result != -1 && old_value) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(old_value, sizeof(*old_value));\n                                *old_value = old_value_host;\n                              }\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(timerfd_gettime, [](FEXCore::Core::CpuStateFrame* Frame, int fd, FEX::HLE::x32::old_itimerspec32* curr_value) -> uint64_t {\n    struct itimerspec Host {};\n\n    uint64_t Result = ::timerfd_gettime(fd, &Host);\n\n    if (Result != -1) {\n      FaultSafeUserMemAccess::VerifyIsWritable(curr_value, sizeof(*curr_value));\n      *curr_value = Host;\n    }\n\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(pselect6_time64,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int nfds, fd_set32* readfds, fd_set32* writefds, fd_set32* exceptfds,\n                               struct timespec* timeout, compat_ptr<sigset_argpack32> sigmaskpack) -> uint64_t {\n                              fd_set Host_readfds;\n                              fd_set Host_writefds;\n                              fd_set Host_exceptfds;\n                              sigset_t HostSet {};\n\n                              FD_ZERO(&Host_readfds);\n                              FD_ZERO(&Host_writefds);\n                              FD_ZERO(&Host_exceptfds);\n                              sigemptyset(&HostSet);\n\n                              // Round up to the full 32bit word\n                              uint32_t NumWords = FEXCore::AlignUp(nfds, 32) / 4;\n\n                              if (readfds) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(readfds, sizeof(fd_set32) * NumWords);\n                                for (int i = 0; i < NumWords; ++i) {\n                                  uint32_t FD = readfds[i];\n                                  int32_t Rem = nfds - (i * 32);\n                                  for (int j = 0; j < 32 && j < Rem; ++j) {\n                                    if ((FD >> j) & 1) {\n                                      FD_SET(i * 32 + j, &Host_readfds);\n                                    }\n                                  }\n                                }\n                              }\n\n                              if (writefds) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(writefds, sizeof(fd_set32) * NumWords);\n                                for (int i = 0; i < NumWords; ++i) {\n                                  uint32_t FD = writefds[i];\n                                  int32_t Rem = nfds - (i * 32);\n                                  for (int j = 0; j < 32 && j < Rem; ++j) {\n                                    if ((FD >> j) & 1) {\n                                      FD_SET(i * 32 + j, &Host_writefds);\n                                    }\n                                  }\n                                }\n                              }\n\n                              if (exceptfds) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(exceptfds, sizeof(fd_set32) * NumWords);\n                                for (int i = 0; i < NumWords; ++i) {\n                                  uint32_t FD = exceptfds[i];\n                                  int32_t Rem = nfds - (i * 32);\n                                  for (int j = 0; j < 32 && j < Rem; ++j) {\n                                    if ((FD >> j) & 1) {\n                                      FD_SET(i * 32 + j, &Host_exceptfds);\n                                    }\n                                  }\n                                }\n                              }\n\n                              FaultSafeUserMemAccess::VerifyIsReadableOrNull(sigmaskpack, sizeof(*sigmaskpack));\n                              if (sigmaskpack && sigmaskpack->sigset) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(sigmaskpack->sigset, sizeof(*sigmaskpack->sigset));\n                                uint64_t* sigmask = sigmaskpack->sigset;\n                                size_t sigsetsize = sigmaskpack->size;\n                                for (int32_t i = 0; i < (sigsetsize * 8); ++i) {\n                                  if (*sigmask & (1ULL << i)) {\n                                    sigaddset(&HostSet, i + 1);\n                                  }\n                                }\n                              }\n\n                              uint64_t Result = ::pselect(nfds, readfds ? &Host_readfds : nullptr, writefds ? &Host_writefds : nullptr,\n                                                          exceptfds ? &Host_exceptfds : nullptr, timeout, &HostSet);\n\n                              if (readfds) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(readfds, sizeof(fd_set32) * NumWords);\n                                for (int i = 0; i < nfds; ++i) {\n                                  if (FD_ISSET(i, &Host_readfds)) {\n                                    readfds[i / 32] |= 1 << (i & 31);\n                                  } else {\n                                    readfds[i / 32] &= ~(1 << (i & 31));\n                                  }\n                                }\n                              }\n\n                              if (writefds) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(writefds, sizeof(fd_set32) * NumWords);\n                                for (int i = 0; i < nfds; ++i) {\n                                  if (FD_ISSET(i, &Host_writefds)) {\n                                    writefds[i / 32] |= 1 << (i & 31);\n                                  } else {\n                                    writefds[i / 32] &= ~(1 << (i & 31));\n                                  }\n                                }\n                              }\n\n                              if (exceptfds) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(exceptfds, sizeof(fd_set32) * NumWords);\n                                for (int i = 0; i < nfds; ++i) {\n                                  if (FD_ISSET(i, &Host_exceptfds)) {\n                                    exceptfds[i / 32] |= 1 << (i & 31);\n                                  } else {\n                                    exceptfds[i / 32] &= ~(1 << (i & 31));\n                                  }\n                                }\n                              }\n\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(sendfile, [](FEXCore::Core::CpuStateFrame* Frame, int out_fd, int in_fd, compat_off_t* offset, size_t count) -> uint64_t {\n    off_t Local {};\n    off_t* Local_p {};\n    if (offset) {\n      Local_p = &Local;\n      Local = *offset;\n    }\n    uint64_t Result = ::sendfile(out_fd, in_fd, Local_p, count);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    pread_64, [](FEXCore::Core::CpuStateFrame* Frame, int fd, void* buf, uint32_t count, uint32_t offset_low, uint32_t offset_high) -> uint64_t {\n      uint64_t Offset = offset_high;\n      Offset <<= 32;\n      Offset |= offset_low;\n\n      uint64_t Result = ::pread64(fd, buf, count, Offset);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    pwrite_64, [](FEXCore::Core::CpuStateFrame* Frame, int fd, void* buf, uint32_t count, uint32_t offset_low, uint32_t offset_high) -> uint64_t {\n      uint64_t Offset = offset_high;\n      Offset <<= 32;\n      Offset |= offset_low;\n\n      uint64_t Result = ::pwrite64(fd, buf, count, Offset);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    readahead, [](FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t offset_low, uint64_t offset_high, size_t count) -> uint64_t {\n      uint64_t Offset = offset_high;\n      Offset <<= 32;\n      Offset |= offset_low;\n\n      uint64_t Result = ::readahead(fd, Offset, count);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(sync_file_range,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t offset_low, uint32_t offset_high, uint32_t len_low,\n                               uint32_t len_high, unsigned int flags) -> uint64_t {\n                              // Flags don't need remapped\n                              uint64_t Offset = offset_high;\n                              Offset <<= 32;\n                              Offset |= offset_low;\n\n                              uint64_t Len = len_high;\n                              Len <<= 32;\n                              Len |= len_low;\n\n                              uint64_t Result = ::syscall(SYSCALL_DEF(sync_file_range), fd, Offset, Len, flags);\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(fallocate,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int fd, int mode, uint32_t offset_low, uint32_t offset_high,\n                               uint32_t len_low, uint32_t len_high) -> uint64_t {\n                              uint64_t Offset = offset_high;\n                              Offset <<= 32;\n                              Offset |= offset_low;\n\n                              uint64_t Len = len_high;\n                              Len <<= 32;\n                              Len |= len_low;\n\n                              uint64_t Result = ::fallocate(fd, mode, Offset, Len);\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    vmsplice, [](FEXCore::Core::CpuStateFrame* Frame, int fd, const struct iovec32* iov, unsigned long nr_segs, unsigned int flags) -> uint64_t {\n      FaultSafeUserMemAccess::VerifyIsReadable(iov, sizeof(struct iovec32) * SanitizeIOCount(nr_segs));\n      fextl::vector<iovec> Host_iovec(iov, iov + nr_segs);\n      uint64_t Result = ::vmsplice(fd, Host_iovec.data(), nr_segs, flags);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(ftruncate, [](FEXCore::Core::CpuStateFrame* Frame, int fd, compat_off_t length) -> uint64_t {\n    uint64_t Result = ::syscall(SYSCALL_DEF(ftruncate), fd, static_cast<int64_t>(length));\n    SYSCALL_ERRNO();\n  });\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/FS.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/SignalDelegator.h\"\n\n#include <stddef.h>\n#include <stdint.h>\n#include <sys/mount.h>\n#include <unistd.h>\n\nnamespace FEX::HLE::x32 {\nvoid RegisterFS(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X32(umount, [](FEXCore::Core::CpuStateFrame* Frame, const char* target) -> uint64_t {\n    uint64_t Result = ::umount(target);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    truncate64, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, uint32_t offset_low, uint32_t offset_high) -> uint64_t {\n      uint64_t Offset = offset_high;\n      Offset <<= 32;\n      Offset |= offset_low;\n      uint64_t Result = ::truncate(path, Offset);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(ftruncate64, [](FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t offset_low, uint32_t offset_high) -> uint64_t {\n    uint64_t Offset = offset_high;\n    Offset <<= 32;\n    Offset |= offset_low;\n    uint64_t Result = ::ftruncate(fd, Offset);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    sigprocmask, [](FEXCore::Core::CpuStateFrame* Frame, int how, const uint64_t* set, uint64_t* oldset, size_t sigsetsize) -> uint64_t {\n      return FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSigProcMask(FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame),\n                                                                               how, set, oldset);\n    });\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/IO.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Types.h\"\n\n#include <linux/aio_abi.h>\n#include <stdint.h>\n#include <syscall.h>\n#include <unistd.h>\n\nnamespace FEX::HLE::x32 {\nvoid RegisterIO(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X32(io_getevents,\n                            [](FEXCore::Core::CpuStateFrame* Frame, aio_context_t ctx_id, long min_nr, long nr, struct io_event* events,\n                               struct timespec32* timeout) -> uint64_t {\n                              struct timespec* timeout_ptr {};\n                              struct timespec tp64 {};\n                              if (timeout) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(timeout, sizeof(*timeout));\n                                tp64 = *timeout;\n                                timeout_ptr = &tp64;\n                              }\n\n                              uint64_t Result = ::syscall(SYSCALL_DEF(io_getevents), ctx_id, min_nr, nr, events, timeout_ptr);\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(io_pgetevents,\n                            [](FEXCore::Core::CpuStateFrame* Frame, aio_context_t ctx_id, long min_nr, long nr, struct io_event* events,\n                               struct timespec32* timeout, const struct io_sigset* usig) -> uint64_t {\n                              struct timespec* timeout_ptr {};\n                              struct timespec tp64 {};\n                              if (timeout) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(timeout, sizeof(*timeout));\n                                tp64 = *timeout;\n                                timeout_ptr = &tp64;\n                              }\n\n                              uint64_t Result = ::syscall(SYSCALL_DEF(io_pgetevents), ctx_id, min_nr, nr, events, timeout_ptr, usig);\n                              SYSCALL_ERRNO();\n                            });\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Info.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Types.h\"\n\n#include <algorithm>\n#include <asm/posix_types.h>\n#include <limits>\n#include <linux/utsname.h>\n#include <stdint.h>\n#include <sys/resource.h>\n#include <sys/sysinfo.h>\n#include <sys/utsname.h>\n\n#include <git_version.h>\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nARG_TO_STR(FEX::HLE::x32::compat_ptr<FEX::HLE::x32::rlimit32<true>>, \"%lx\")\nARG_TO_STR(FEX::HLE::x32::compat_ptr<FEX::HLE::x32::rlimit32<false>>, \"%lx\")\n\nnamespace FEX::HLE::x32 {\nstruct sysinfo32 {\n  int32_t uptime;\n  uint32_t loads[3];\n  uint32_t totalram;\n  uint32_t freeram;\n  uint32_t sharedram;\n  uint32_t bufferram;\n  uint32_t totalswap;\n  uint32_t freeswap;\n  uint16_t procs;\n  uint32_t totalhigh;\n  uint32_t freehigh;\n  uint32_t mem_unit;\n  char _pad[8];\n};\n\nstatic_assert(sizeof(sysinfo32) == 64, \"Needs to be 64bytes\");\n\nvoid RegisterInfo(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X32(oldolduname, [](FEXCore::Core::CpuStateFrame* Frame, struct oldold_utsname* buf) -> uint64_t {\n    struct utsname Local {};\n\n    FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n\n    memset(buf, 0, sizeof(*buf));\n    if (::uname(&Local) == 0) {\n      memcpy(buf->nodename, Local.nodename, __OLD_UTS_LEN);\n    } else {\n      strncpy(buf->nodename, \"FEXCore\", __OLD_UTS_LEN);\n      LogMan::Msg::EFmt(\"Couldn't determine host nodename. Defaulting to '{}'\", buf->nodename);\n    }\n    strncpy(buf->sysname, \"Linux\", __OLD_UTS_LEN);\n    uint32_t GuestVersion = FEX::HLE::_SyscallHandler->GetGuestKernelVersion();\n    snprintf(buf->release, __OLD_UTS_LEN, \"%d.%d.%d\", FEX::HLE::SyscallHandler::KernelMajor(GuestVersion),\n             FEX::HLE::SyscallHandler::KernelMinor(GuestVersion), FEX::HLE::SyscallHandler::KernelPatch(GuestVersion));\n\n    const char version[] = \"#\" GIT_DESCRIBE_STRING \" SMP \" __DATE__ \" \" __TIME__;\n    strncpy(buf->version, version, __OLD_UTS_LEN);\n    // Tell the guest that we are a 64bit kernel\n    strncpy(buf->machine, \"x86_64\", __OLD_UTS_LEN);\n    return 0;\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(olduname, [](FEXCore::Core::CpuStateFrame* Frame, struct old_utsname* buf) -> uint64_t {\n    struct utsname Local {};\n\n    FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n\n    memset(buf, 0, sizeof(*buf));\n    if (::uname(&Local) == 0) {\n      memcpy(buf->nodename, Local.nodename, __NEW_UTS_LEN);\n    } else {\n      strncpy(buf->nodename, \"FEXCore\", __NEW_UTS_LEN);\n      LogMan::Msg::EFmt(\"Couldn't determine host nodename. Defaulting to '{}'\", buf->nodename);\n    }\n    strncpy(buf->sysname, \"Linux\", __NEW_UTS_LEN);\n    uint32_t GuestVersion = FEX::HLE::_SyscallHandler->GetGuestKernelVersion();\n    snprintf(buf->release, __NEW_UTS_LEN, \"%d.%d.%d\", FEX::HLE::SyscallHandler::KernelMajor(GuestVersion),\n             FEX::HLE::SyscallHandler::KernelMinor(GuestVersion), FEX::HLE::SyscallHandler::KernelPatch(GuestVersion));\n\n    const char version[] = \"#\" GIT_DESCRIBE_STRING \" SMP \" __DATE__ \" \" __TIME__;\n    strncpy(buf->version, version, __NEW_UTS_LEN);\n    // Tell the guest that we are a 64bit kernel\n    strncpy(buf->machine, \"x86_64\", __NEW_UTS_LEN);\n    return 0;\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    getrlimit, [](FEXCore::Core::CpuStateFrame* Frame, int resource, compat_ptr<FEX::HLE::x32::rlimit32<true>> rlim) -> uint64_t {\n      struct rlimit rlim64 {};\n      uint64_t Result = ::getrlimit(resource, &rlim64);\n      FaultSafeUserMemAccess::VerifyIsWritable(rlim, sizeof(*rlim));\n      *rlim = rlim64;\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    ugetrlimit, [](FEXCore::Core::CpuStateFrame* Frame, int resource, compat_ptr<FEX::HLE::x32::rlimit32<false>> rlim) -> uint64_t {\n      struct rlimit rlim64 {};\n      uint64_t Result = ::getrlimit(resource, &rlim64);\n      FaultSafeUserMemAccess::VerifyIsWritable(rlim, sizeof(*rlim));\n      *rlim = rlim64;\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    setrlimit, [](FEXCore::Core::CpuStateFrame* Frame, int resource, const compat_ptr<FEX::HLE::x32::rlimit32<false>> rlim) -> uint64_t {\n      struct rlimit rlim64 {};\n      FaultSafeUserMemAccess::VerifyIsReadable(rlim, sizeof(*rlim));\n      rlim64 = *rlim;\n      uint64_t Result = ::setrlimit(resource, &rlim64);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(sysinfo, [](FEXCore::Core::CpuStateFrame* Frame, struct sysinfo32* info) -> uint64_t {\n    struct sysinfo Host {};\n    uint64_t Result = ::sysinfo(&Host);\n    if (Result != -1) {\n      FaultSafeUserMemAccess::VerifyIsWritable(info, sizeof(*info));\n#define Copy(x) \\\n  info->x = static_cast<decltype(info->x)>(std::min(Host.x, static_cast<decltype(Host.x)>(std::numeric_limits<decltype(info->x)>::max())));\n      Copy(uptime);\n      Copy(procs);\n#define CopyShift(x) info->x = static_cast<decltype(info->x)>(Host.x >> ShiftAmount);\n\n      info->loads[0] = std::min(Host.loads[0], static_cast<unsigned long>(std::numeric_limits<uint32_t>::max()));\n      info->loads[1] = std::min(Host.loads[1], static_cast<unsigned long>(std::numeric_limits<uint32_t>::max()));\n      info->loads[2] = std::min(Host.loads[2], static_cast<unsigned long>(std::numeric_limits<uint32_t>::max()));\n\n      // If any result can't fit in to a uint32_t then we need to shift the mem_unit and all the members\n      // Set the mem_unit to the pagesize\n      uint32_t ShiftAmount {};\n      if ((Host.totalram >> 32) != 0 || (Host.totalswap >> 32) != 0) {\n\n        while (Host.mem_unit < FEXCore::Utils::FEX_PAGE_SIZE) {\n          Host.mem_unit <<= 1;\n          ++ShiftAmount;\n        }\n      }\n\n      CopyShift(totalram);\n      CopyShift(freeram);\n      CopyShift(sharedram);\n      CopyShift(bufferram);\n      CopyShift(totalswap);\n      CopyShift(freeswap);\n      CopyShift(totalhigh);\n      CopyShift(freehigh);\n      Copy(mem_unit);\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(getrusage, [](FEXCore::Core::CpuStateFrame* Frame, int who, rusage_32* usage) -> uint64_t {\n    struct rusage usage64 {};\n    uint64_t Result = ::syscall(SYSCALL_DEF(getrusage), who, &usage64);\n    if (Result != -1) {\n      FaultSafeUserMemAccess::VerifyIsWritable(usage, sizeof(*usage));\n      *usage = usage64;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  if (Handler->IsHostKernelVersionAtLeast(6, 8, 0)) {\n    REGISTER_SYSCALL_IMPL_X32(map_shadow_stack, [](FEXCore::Core::CpuStateFrame* Frame, uint64_t addr, uint64_t size, uint32_t flags) -> uint64_t {\n      // Claim that shadow stack isn't supported.\n      return -EOPNOTSUPP;\n    });\n  } else {\n    REGISTER_SYSCALL_IMPL_X32(map_shadow_stack, UnimplementedSyscallSafe);\n  }\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/HelperDefines.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#define STRINGY2(x, y) x##y\n#define STRINGY(x, y) STRINGY2(x, y)\n\n#define STRINGY12(x) STRINGY11(x)\n#define STRINGY11(x) #x\n#define STRINGY1(x) STRINGY12(x)\n\n#ifndef _BASIC_META\n// Meta typedef variable in unnamed and matches upstream\n// Use this for the super basic ioctl passthrough path\n#define _BASIC_META(x)                   \\\n  __attribute__((annotate(\"fex-match\"))) \\\n  __attribute__((annotate(\"ioctl-alias-x86_32-_\" #x STRINGY1(__LINE__)))) typedef uint8_t STRINGY(_##x, __LINE__)[x];\n#endif\n\n#ifndef _BASIC_META_VAR\n// This is similar to _BASIC_META except that it allows you to pass variadic arguments to the original ioctl definition\n#define _BASIC_META_VAR(x, args...)      \\\n  __attribute__((annotate(\"fex-match\"))) \\\n  __attribute__((annotate(\"ioctl-alias-x86_32-_\" #x STRINGY1(__LINE__)))) typedef uint8_t STRINGY(_##x, __LINE__)[x(args)];\n#endif\n\n#ifndef _CUSTOM_META\n// IOCTL doesn't match across architecture\n// Generates a FEX_<name> version of the ioctl with custom ioctl definition\n// eg: _CUSTOM_META(DRM_IOCTL_AMDGPU_GEM_METADATA, DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_METADATA, FEX::HLE::x32::AMDGPU::fex_drm_amdgpu_gem_metadata));\n// Allows you to effectively pass in the original ioctl definition with custom type replacing the upstream type\n#define _CUSTOM_META(name, ioctl_num)                                                              \\\n  typedef uint8_t _meta_##name[name];                                                              \\\n  __attribute__((annotate(\"ioctl-alias-x86_32-_meta_\" #name))) typedef uint8_t _##name[ioctl_num]; \\\n  constexpr static uint32_t FEX_##name = ioctl_num;\n#endif\n\n#ifndef _CUSTOM_META_OFFSET\n// Same as _CUSTOM_META but allows you to define multiple types from an offset\n// Required to have an ioctl covering a range which some ioctls do\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset)                                                        \\\n  typedef uint8_t _meta_##name[ioctl_num + offset];                                                         \\\n  __attribute__((annotate(\"ioctl-alias-x86_32-_meta_\" #name))) typedef uint8_t _##name[ioctl_num + offset]; \\\n  constexpr static uint32_t FEX_##name = ioctl_num + offset;\n#endif\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/amdgpu_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_AMDGPU_GEM_CREATE)\n_BASIC_META(DRM_IOCTL_AMDGPU_GEM_MMAP)\n_BASIC_META(DRM_IOCTL_AMDGPU_CTX)\n_BASIC_META(DRM_IOCTL_AMDGPU_BO_LIST)\n_BASIC_META(DRM_IOCTL_AMDGPU_CS)\n_BASIC_META(DRM_IOCTL_AMDGPU_INFO)\n_CUSTOM_META(DRM_IOCTL_AMDGPU_GEM_METADATA, DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_METADATA, FEX::HLE::x32::AMDGPU::fex_drm_amdgpu_gem_metadata))\n_BASIC_META(DRM_IOCTL_AMDGPU_GEM_WAIT_IDLE)\n_BASIC_META(DRM_IOCTL_AMDGPU_GEM_VA)\n_BASIC_META(DRM_IOCTL_AMDGPU_WAIT_CS)\n_BASIC_META(DRM_IOCTL_AMDGPU_GEM_OP)\n_BASIC_META(DRM_IOCTL_AMDGPU_GEM_USERPTR)\n_BASIC_META(DRM_IOCTL_AMDGPU_WAIT_FENCES)\n_BASIC_META(DRM_IOCTL_AMDGPU_VM)\n_BASIC_META(DRM_IOCTL_AMDGPU_FENCE_TO_HANDLE)\n_BASIC_META(DRM_IOCTL_AMDGPU_SCHED)\n_BASIC_META(DRM_IOCTL_AMDGPU_USERQ)\n_BASIC_META(DRM_IOCTL_AMDGPU_USERQ_SIGNAL)\n_BASIC_META(DRM_IOCTL_AMDGPU_USERQ_WAIT)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/asahi_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_ASAHI_GET_PARAMS)\n_BASIC_META(DRM_IOCTL_ASAHI_GET_TIME)\n_BASIC_META(DRM_IOCTL_ASAHI_VM_CREATE)\n_BASIC_META(DRM_IOCTL_ASAHI_VM_DESTROY)\n_BASIC_META(DRM_IOCTL_ASAHI_VM_BIND)\n_BASIC_META(DRM_IOCTL_ASAHI_GEM_CREATE)\n_BASIC_META(DRM_IOCTL_ASAHI_GEM_MMAP_OFFSET)\n_BASIC_META(DRM_IOCTL_ASAHI_GEM_BIND_OBJECT)\n_BASIC_META(DRM_IOCTL_ASAHI_QUEUE_CREATE)\n_BASIC_META(DRM_IOCTL_ASAHI_QUEUE_DESTROY)\n_BASIC_META(DRM_IOCTL_ASAHI_SUBMIT)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/asound.h",
    "content": "// SPDX-License-Identifier: MIT\n#include \"LinuxSyscalls/x32/Types.h\"\n#include \"LinuxSyscalls/x32/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <sound/asound.h>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x32 {\n\nnamespace asound {\n#ifndef SNDRV_TIMER_IOCTL_TREAD_OLD\n#define SNDRV_TIMER_IOCTL_TREAD_OLD _IOW('T', 0x02, int)\n#endif\n\n#ifndef SNDRV_PCM_IOCTL_USER_PVERSION\n#define SNDRV_PCM_IOCTL_USER_PVERSION _IOW('A', 0x04, int)\n#endif\n\n#ifndef SNDRV_TIMER_IOCTL_TREAD64\n#define SNDRV_TIMER_IOCTL_TREAD64 _IOW('T', 0xa4, int)\n#endif\n\n#include \"LinuxSyscalls/x32/Ioctl/asound.inl\"\n} // namespace asound\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/asound.inl",
    "content": "_BASIC_META(SNDRV_HWDEP_IOCTL_PVERSION)\n_BASIC_META(SNDRV_HWDEP_IOCTL_INFO)\n_BASIC_META(SNDRV_HWDEP_IOCTL_DSP_STATUS)\n//_BASIC_META(SNDRV_HWDEP_IOCTL_DSP_LOAD)\n\n_BASIC_META(SNDRV_PCM_IOCTL_PVERSION)\n_BASIC_META(SNDRV_PCM_IOCTL_INFO)\n_BASIC_META(SNDRV_PCM_IOCTL_TSTAMP)\n_BASIC_META(SNDRV_PCM_IOCTL_TTSTAMP)\n_BASIC_META(SNDRV_PCM_IOCTL_USER_PVERSION)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_HW_REFINE)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_HW_PARAMS)\n_BASIC_META(SNDRV_PCM_IOCTL_HW_FREE)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_SW_PARAMS)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_STATUS)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_DELAY)\n_BASIC_META(SNDRV_PCM_IOCTL_HWSYNC)\n// XXX: _BASIC_META(__SNDRV_PCM_IOCTL_SYNC_PTR)\n// XXX: _BASIC_META(__SNDRV_PCM_IOCTL_SYNC_PTR64)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_SYNC_PTR)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_STATUS_EXT)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_CHANNEL_INFO)\n_BASIC_META(SNDRV_PCM_IOCTL_PREPARE)\n_BASIC_META(SNDRV_PCM_IOCTL_RESET)\n_BASIC_META(SNDRV_PCM_IOCTL_START)\n_BASIC_META(SNDRV_PCM_IOCTL_DROP)\n_BASIC_META(SNDRV_PCM_IOCTL_DRAIN)\n_BASIC_META(SNDRV_PCM_IOCTL_PAUSE)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_REWIND)\n_BASIC_META(SNDRV_PCM_IOCTL_RESUME)\n_BASIC_META(SNDRV_PCM_IOCTL_XRUN)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_FORWARD)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_WRITEI_FRAMES)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_READI_FRAMES)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_WRITEN_FRAMES)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_READN_FRAMES)\n_BASIC_META(SNDRV_PCM_IOCTL_LINK)\n_BASIC_META(SNDRV_PCM_IOCTL_UNLINK)\n\n_BASIC_META(SNDRV_RAWMIDI_IOCTL_PVERSION)\n_BASIC_META(SNDRV_RAWMIDI_IOCTL_INFO)\n// XXX: _BASIC_META(SNDRV_RAWMIDI_IOCTL_PARAMS)\n// XXX: _BASIC_META(SNDRV_RAWMIDI_IOCTL_STATUS)\n_BASIC_META(SNDRV_RAWMIDI_IOCTL_DROP)\n_BASIC_META(SNDRV_RAWMIDI_IOCTL_DRAIN)\n\n_BASIC_META(SNDRV_TIMER_IOCTL_PVERSION)\n_BASIC_META(SNDRV_TIMER_IOCTL_NEXT_DEVICE)\n_BASIC_META(SNDRV_TIMER_IOCTL_TREAD_OLD)\n// XXX: _BASIC_META(SNDRV_TIMER_IOCTL_GINFO)\n// XXX: _BASIC_META(SNDRV_TIMER_IOCTL_GPARAMS)\n// XXX: _BASIC_META(SNDRV_TIMER_IOCTL_GSTATUS)\n_BASIC_META(SNDRV_TIMER_IOCTL_SELECT)\n// XXX: _BASIC_META(SNDRV_TIMER_IOCTL_INFO)\n_BASIC_META(SNDRV_TIMER_IOCTL_PARAMS)\n// XXX: _BASIC_META(SNDRV_TIMER_IOCTL_STATUS)\n_BASIC_META(SNDRV_TIMER_IOCTL_START)\n_BASIC_META(SNDRV_TIMER_IOCTL_STOP)\n_BASIC_META(SNDRV_TIMER_IOCTL_CONTINUE)\n_BASIC_META(SNDRV_TIMER_IOCTL_PAUSE)\n_BASIC_META(SNDRV_TIMER_IOCTL_TREAD64)\n\n_BASIC_META(SNDRV_CTL_IOCTL_PVERSION)\n_BASIC_META(SNDRV_CTL_IOCTL_CARD_INFO)\n// XXX: _BASIC_META(SNDRV_CTL_IOCTL_ELEM_LIST)\n_BASIC_META(SNDRV_CTL_IOCTL_ELEM_INFO)\n// XXX: _BASIC_META(SNDRV_CTL_IOCTL_ELEM_READ)\n// XXX: _BASIC_META(SNDRV_CTL_IOCTL_ELEM_WRITE)\n_BASIC_META(SNDRV_CTL_IOCTL_ELEM_LOCK)\n_BASIC_META(SNDRV_CTL_IOCTL_ELEM_UNLOCK)\n_BASIC_META(SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS)\n_BASIC_META(SNDRV_CTL_IOCTL_ELEM_ADD)\n_BASIC_META(SNDRV_CTL_IOCTL_ELEM_REPLACE)\n_BASIC_META(SNDRV_CTL_IOCTL_ELEM_REMOVE)\n_BASIC_META(SNDRV_CTL_IOCTL_TLV_READ)\n_BASIC_META(SNDRV_CTL_IOCTL_TLV_WRITE)\n_BASIC_META(SNDRV_CTL_IOCTL_TLV_COMMAND)\n_BASIC_META(SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE)\n_BASIC_META(SNDRV_CTL_IOCTL_HWDEP_INFO)\n_BASIC_META(SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE)\n_BASIC_META(SNDRV_CTL_IOCTL_PCM_INFO)\n_BASIC_META(SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE)\n_BASIC_META(SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE)\n_BASIC_META(SNDRV_CTL_IOCTL_RAWMIDI_INFO)\n_BASIC_META(SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE)\n_BASIC_META(SNDRV_CTL_IOCTL_POWER)\n_BASIC_META(SNDRV_CTL_IOCTL_POWER_STATE)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/drm.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/CompilerDefs.h>\n\n#include \"LinuxSyscalls/x32/Types.h\"\n#include \"LinuxSyscalls/x32/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\nextern \"C\" {\n// drm headers use a `__user` define that has an address_space attribute. This allows their tooling to see unsafe user-space accesses.\n// Define this to nothing so we don't need to modify those headers.\n#define __user\n#include \"fex-drm/drm.h\"\n#include \"fex-drm/drm_mode.h\"\n#include \"fex-drm/i915_drm.h\"\n#include \"fex-drm/amdgpu_drm.h\"\n#include \"fex-drm/asahi_drm.h\"\n#include \"fex-drm/lima_drm.h\"\n#include \"fex-drm/panfrost_drm.h\"\n#include \"fex-drm/msm_drm.h\"\n#include \"fex-drm/nouveau_drm.h\"\n#include \"fex-drm/nova_drm.h\"\n#include \"fex-drm/radeon_drm.h\"\n#include \"fex-drm/vc4_drm.h\"\n#include \"fex-drm/v3d_drm.h\"\n#include \"fex-drm/panthor_drm.h\"\n#include \"fex-drm/pvr_drm.h\"\n#include \"fex-drm/virtgpu_drm.h\"\n#include \"fex-drm/xe_drm.h\"\n}\n#include <sys/ioctl.h>\n\n#define CPYT(x) val.x = x\n#define CPYF(x) x = val.x\nnamespace FEX::HLE::x32 {\n\nnamespace DRM {\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_version\") FEX_ANNOTATE(\"fex-match\") fex_drm_version {\n    int version_major;      /**< Major version */\n    int version_minor;      /**< Minor version */\n    int version_patchlevel; /**< Patch level */\n    uint32_t name_len;      /**< Length of name buffer */\n    compat_ptr<char> name;  /**< Name of driver */\n    uint32_t date_len;      /**< Length of date buffer */\n    compat_ptr<char> date;  /**< User-space buffer to hold date */\n    uint32_t desc_len;      /**< Length of desc buffer */\n    compat_ptr<char> desc;  /**< User-space buffer to hold desc */\n\n    fex_drm_version() = delete;\n\n    operator drm_version() const {\n      drm_version val {};\n      CPYT(version_major);\n      CPYT(version_minor);\n      CPYT(version_patchlevel);\n      CPYT(name_len);\n      CPYT(name);\n      CPYT(date_len);\n      CPYT(date);\n      CPYT(desc_len);\n      CPYT(desc);\n      return val;\n    }\n\n    fex_drm_version(struct drm_version val)\n      : name {auto_compat_ptr {val.name}}\n      , date {auto_compat_ptr {val.date}}\n      , desc {auto_compat_ptr {val.desc}} {\n      CPYF(version_major);\n      CPYF(version_minor);\n      CPYF(version_patchlevel);\n      CPYF(name_len);\n      CPYF(date_len);\n      CPYF(desc_len);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_unique\") FEX_ANNOTATE(\"fex-match\") fex_drm_unique {\n    compat_size_t unique_len;\n    compat_ptr<char> unique;\n\n    fex_drm_unique() = delete;\n\n    operator drm_unique() const {\n      drm_unique val {};\n      CPYT(unique_len);\n      CPYT(unique);\n      return val;\n    }\n\n    fex_drm_unique(struct drm_unique val)\n      : unique {auto_compat_ptr {val.unique}} {\n      CPYF(unique_len);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_map\") FEX_ANNOTATE(\"fex-match\") fex_drm_map {\n    uint32_t offset;\n    uint32_t size;\n    enum drm_map_type type;\n    enum drm_map_flags flags;\n    compat_ptr<void> handle;\n    int32_t mtrr;\n\n    fex_drm_map() = delete;\n\n    operator drm_map() const {\n      drm_map val {};\n      CPYT(offset);\n      CPYT(size);\n      CPYT(type);\n      CPYT(flags);\n      CPYT(handle);\n      CPYT(mtrr);\n      return val;\n    }\n\n    fex_drm_map(struct drm_map val)\n      : handle {auto_compat_ptr {val.handle}} {\n      CPYF(offset);\n      CPYF(size);\n      CPYF(type);\n      CPYF(flags);\n      CPYF(mtrr);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_client\") FEX_ANNOTATE(\"fex-match\") fex_drm_client {\n    int32_t idx;\n    int32_t auth;\n    uint32_t pid;\n    uint32_t uid;\n    uint32_t magic;\n    uint32_t iocs;\n\n    fex_drm_client() = delete;\n\n    operator drm_client() const {\n      drm_client val {};\n      CPYT(idx);\n      CPYT(auth);\n      CPYT(pid);\n      CPYT(uid);\n      CPYT(magic);\n      CPYT(iocs);\n      return val;\n    }\n\n    fex_drm_client(struct drm_client val) {\n      CPYF(idx);\n      CPYF(auth);\n      CPYF(pid);\n      CPYF(uid);\n      CPYF(magic);\n      CPYF(iocs);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_stats\") FEX_ANNOTATE(\"fex-match\") fex_drm_stats {\n    uint32_t count;\n    struct {\n      uint32_t value;\n      enum drm_stat_type type;\n    } data[15];\n\n    fex_drm_stats() = delete;\n\n    operator drm_stats() const {\n      drm_stats val {};\n      CPYT(count);\n      for (size_t i = 0; i < 15; ++i) {\n        CPYT(data[i].value);\n        CPYT(data[i].type);\n      }\n      return val;\n    }\n\n    fex_drm_stats(struct drm_stats val) {\n      CPYF(count);\n      for (size_t i = 0; i < 15; ++i) {\n        CPYF(data[i].value);\n        CPYF(data[i].type);\n      }\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_buf_desc\") FEX_ANNOTATE(\"fex-match\") fex_drm_buf_desc {\n    int32_t count;\n    int32_t size;\n    int32_t low_mark;\n    int32_t high_mark;\n    enum { _DRM_PAGE_ALIGN = 0x01, _DRM_AGP_BUFFER = 0x02, _DRM_SG_BUFFER = 0x04, _DRM_FB_BUFFER = 0x08, _DRM_PCI_BUFFER_RO = 0x10 } flags;\n    uint32_t agp_start;\n\n    fex_drm_buf_desc() = delete;\n\n    operator drm_buf_desc() const {\n      drm_buf_desc val {};\n      CPYT(count);\n      CPYT(size);\n      CPYT(low_mark);\n      CPYT(high_mark);\n      memcpy(&val.flags, &flags, sizeof(val.flags));\n      CPYT(agp_start);\n      return val;\n    }\n\n    fex_drm_buf_desc(struct drm_buf_desc val) {\n      CPYF(count);\n      CPYF(size);\n      CPYF(low_mark);\n      CPYF(high_mark);\n      memcpy(&flags, &val.flags, sizeof(val.flags));\n      CPYF(agp_start);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_buf_info\") FEX_ANNOTATE(\"fex-match\") fex_drm_buf_info {\n    int32_t count;\n    compat_ptr<struct drm_buf_desc> list;\n\n    fex_drm_buf_info() = delete;\n\n    operator drm_buf_info() const {\n      drm_buf_info val {};\n      CPYT(count);\n      CPYT(list);\n      return val;\n    }\n\n    fex_drm_buf_info(struct drm_buf_info val)\n      : list {auto_compat_ptr {val.list}} {\n      CPYF(count);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_buf_pub\") FEX_ANNOTATE(\"fex-match\") fex_drm_buf_pub {\n    int32_t idx;\n    int32_t total;\n    int32_t used;\n    compat_ptr<void> address;\n\n    fex_drm_buf_pub() = delete;\n\n    operator drm_buf_pub() const {\n      drm_buf_pub val {};\n      CPYT(idx);\n      CPYT(total);\n      CPYT(used);\n      CPYT(address);\n      return val;\n    }\n\n    fex_drm_buf_pub(struct drm_buf_pub val)\n      : address {auto_compat_ptr {val.address}} {\n      CPYF(idx);\n      CPYF(total);\n      CPYF(used);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_buf_map\") FEX_ANNOTATE(\"fex-match\") fex_drm_buf_map {\n    int32_t count;\n#ifdef __cplusplus\n    compat_ptr<void> virt;\n#else\n    compat_ptr<void> virtual;\n#endif\n    compat_ptr<drm_buf_pub> list;\n\n    fex_drm_buf_map() = delete;\n\n    operator drm_buf_map() const {\n      drm_buf_map val {};\n      CPYT(count);\n#ifdef __cplusplus\n      CPYT(virt);\n#else\n      CPYT(virtual);\n#endif\n      CPYT(list);\n      return val;\n    }\n\n    fex_drm_buf_map(struct drm_buf_map val)\n#ifdef __cplusplus\n      : virt {auto_compat_ptr {val.virt}}\n#else\n      : virtual {auto_compat_ptr {val.virtual}}\n#endif\n      , list {auto_compat_ptr {val.list}} {\n      CPYF(count);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_buf_free\") FEX_ANNOTATE(\"fex-match\") fex_drm_buf_free {\n    int32_t count;\n    compat_ptr<int> list;\n\n    fex_drm_buf_free() = delete;\n\n    operator drm_buf_free() const {\n      drm_buf_free val {};\n      CPYT(count);\n      CPYT(list);\n      return val;\n    }\n\n    fex_drm_buf_free(struct drm_buf_free val)\n      : list {auto_compat_ptr {val.list}} {\n      CPYF(count);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_ctx_priv_map\") FEX_ANNOTATE(\"fex-match\") fex_drm_ctx_priv_map {\n    uint32_t ctx_id;\n    compat_ptr<void> handle;\n\n    fex_drm_ctx_priv_map() = delete;\n\n    operator drm_ctx_priv_map() const {\n      drm_ctx_priv_map val {};\n      CPYT(ctx_id);\n      CPYT(handle);\n      return val;\n    }\n\n    fex_drm_ctx_priv_map(struct drm_ctx_priv_map val)\n      : handle {auto_compat_ptr {val.handle}} {\n      CPYF(ctx_id);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_ctx_res\") FEX_ANNOTATE(\"fex-match\") fex_drm_ctx_res {\n    int32_t count;\n    compat_ptr<struct drm_ctx> contexts;\n\n    fex_drm_ctx_res() = delete;\n\n    operator drm_ctx_res() const {\n      drm_ctx_res val {};\n      CPYT(count);\n      return val;\n    }\n\n    fex_drm_ctx_res(struct drm_ctx_res val)\n      : contexts {auto_compat_ptr {val.contexts}} {\n      CPYF(count);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_dma\") FEX_ANNOTATE(\"fex-match\") fex_drm_dma {\n    int32_t context;\n    int32_t send_count;\n    compat_ptr<int32_t> send_indices;\n    compat_ptr<int32_t> send_sizes;\n    enum drm_dma_flags flags;\n    int32_t request_count;\n    int32_t request_size;\n    compat_ptr<int32_t> request_indices;\n    compat_ptr<int32_t> request_sizes;\n    int32_t granted_count;\n\n    fex_drm_dma() = delete;\n\n    operator drm_dma() const {\n      drm_dma val {};\n      CPYT(context);\n      CPYT(send_count);\n      CPYT(send_indices);\n      CPYT(send_sizes);\n      CPYT(flags);\n      CPYT(request_count);\n      CPYT(request_size);\n      CPYT(request_indices);\n      CPYT(request_sizes);\n      CPYT(granted_count);\n      return val;\n    }\n\n    fex_drm_dma(struct drm_dma val)\n      : send_indices {auto_compat_ptr {val.send_indices}}\n      , send_sizes {auto_compat_ptr {val.send_sizes}}\n      , request_indices {auto_compat_ptr {val.request_indices}}\n      , request_sizes {auto_compat_ptr {val.request_sizes}} {\n      CPYF(context);\n      CPYF(send_count);\n      CPYF(flags);\n      CPYF(request_count);\n      CPYF(request_size);\n      CPYF(granted_count);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_scatter_gather\") FEX_ANNOTATE(\"fex-match\") fex_drm_scatter_gather {\n    uint32_t size;\n    uint32_t handle;\n\n    fex_drm_scatter_gather() = delete;\n\n    operator drm_scatter_gather() const {\n      drm_scatter_gather val {};\n      CPYT(size);\n      CPYT(handle);\n      return val;\n    }\n\n    fex_drm_scatter_gather(struct drm_scatter_gather val) {\n      CPYF(size);\n      CPYF(handle);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_wait_vblank_request\") FEX_ANNOTATE(\"fex-match\") fex_drm_wait_vblank_request {\n    enum drm_vblank_seq_type type;\n    uint32_t sequence;\n    uint32_t signal;\n\n    fex_drm_wait_vblank_request() = delete;\n\n    operator drm_wait_vblank_request() const {\n      drm_wait_vblank_request val {};\n      CPYT(type);\n      CPYT(sequence);\n      CPYT(signal);\n      return val;\n    }\n\n    fex_drm_wait_vblank_request(struct drm_wait_vblank_request val) {\n      CPYF(type);\n      CPYF(sequence);\n      CPYF(signal);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_wait_vblank_reply\") FEX_ANNOTATE(\"fex-match\") fex_drm_wait_vblank_reply {\n    enum drm_vblank_seq_type type;\n    uint32_t sequence;\n    int32_t tval_sec;\n    int32_t tval_usec;\n\n    fex_drm_wait_vblank_reply() = delete;\n\n    operator drm_wait_vblank_reply() const {\n      drm_wait_vblank_reply val {};\n      CPYT(type);\n      CPYT(sequence);\n      CPYT(tval_sec);\n      CPYT(tval_usec);\n      return val;\n    }\n\n    fex_drm_wait_vblank_reply(struct drm_wait_vblank_reply val) {\n      CPYF(type);\n      CPYF(sequence);\n      CPYF(tval_sec);\n      CPYF(tval_usec);\n    }\n  };\n\n  union FEX_ANNOTATE(\"alias-x86_32-drm_wait_vblank\") FEX_ANNOTATE(\"fex-match\") fex_drm_wait_vblank {\n    fex_drm_wait_vblank_request request;\n    fex_drm_wait_vblank_reply reply;\n\n    fex_drm_wait_vblank() = delete;\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_update_draw\") FEX_ANNOTATE(\"fex-match\") FEX_PACKED fex_drm_update_draw {\n    drm_drawable_t handle;\n    uint32_t type;\n    uint32_t num;\n    compat_uint64_t data;\n\n    fex_drm_update_draw() = delete;\n\n    operator drm_update_draw() const {\n      drm_update_draw val {};\n      CPYT(handle);\n      CPYT(type);\n      CPYT(num);\n      CPYT(data);\n      return val;\n    }\n\n    fex_drm_update_draw(struct drm_update_draw val) {\n      CPYF(handle);\n      CPYF(type);\n      CPYF(num);\n      CPYF(data);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_mode_get_plane_res\") FEX_ANNOTATE(\"fex-match\") FEX_PACKED fex_drm_mode_get_plane_res {\n    compat_uint64_t plane_id_ptr;\n    uint32_t count_planes;\n    fex_drm_mode_get_plane_res() = delete;\n\n    operator drm_mode_get_plane_res() const {\n      drm_mode_get_plane_res val {};\n      CPYT(plane_id_ptr);\n      CPYT(count_planes);\n      return val;\n    }\n\n    fex_drm_mode_get_plane_res(struct drm_mode_get_plane_res val) {\n      CPYF(plane_id_ptr);\n      CPYF(count_planes);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_mode_fb_cmd2\") FEX_ANNOTATE(\"fex-match\") FEX_PACKED fex_drm_mode_fb_cmd2 {\n    uint32_t fb_id;\n    uint32_t width;\n    uint32_t height;\n    uint32_t pixel_format;\n    uint32_t flags;\n\n    uint32_t handles[4];\n    uint32_t pitches[4];\n    uint32_t offsets[4];\n    compat_uint64_t modifier[4];\n    fex_drm_mode_fb_cmd2() = delete;\n\n    operator drm_mode_fb_cmd2() const {\n      drm_mode_fb_cmd2 val {};\n      CPYT(fb_id);\n      CPYT(width);\n      CPYT(height);\n      CPYT(pixel_format);\n      CPYT(flags);\n      for (int i = 0; i < 4; ++i) {\n        CPYT(handles[i]);\n        CPYT(pitches[i]);\n        CPYT(offsets[i]);\n        CPYT(modifier[i]);\n      }\n      return val;\n    }\n\n    fex_drm_mode_fb_cmd2(struct drm_mode_fb_cmd2 val) {\n      CPYF(fb_id);\n      CPYF(width);\n      CPYF(height);\n      CPYF(pixel_format);\n      CPYF(flags);\n      for (int i = 0; i < 4; ++i) {\n        CPYF(handles[i]);\n        CPYF(pitches[i]);\n        CPYF(offsets[i]);\n        CPYF(modifier[i]);\n      }\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_mode_obj_get_properties\") FEX_ANNOTATE(\"fex-match\") FEX_PACKED fex_drm_mode_obj_get_properties {\n    compat_uint64_t props_ptr;\n    compat_uint64_t prop_values_ptr;\n    uint32_t count_props;\n    uint32_t obj_id;\n    uint32_t obj_type;\n\n    fex_drm_mode_obj_get_properties() = delete;\n\n    operator drm_mode_obj_get_properties() const {\n      drm_mode_obj_get_properties val {};\n      CPYT(props_ptr);\n      CPYT(prop_values_ptr);\n      CPYT(count_props);\n      CPYT(obj_id);\n      CPYT(obj_type);\n      return val;\n    }\n\n    fex_drm_mode_obj_get_properties(struct drm_mode_obj_get_properties val) {\n      CPYF(props_ptr);\n      CPYF(prop_values_ptr);\n      CPYF(count_props);\n      CPYF(obj_id);\n      CPYF(obj_type);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_mode_obj_set_property\") FEX_ANNOTATE(\"fex-match\") FEX_PACKED fex_drm_mode_obj_set_property {\n    compat_uint64_t value;\n    uint32_t prop_id;\n    uint32_t obj_id;\n    uint32_t obj_type;\n\n    fex_drm_mode_obj_set_property() = delete;\n\n    operator drm_mode_obj_set_property() const {\n      drm_mode_obj_set_property val {};\n      CPYT(value);\n      CPYT(prop_id);\n      CPYT(obj_id);\n      CPYT(obj_type);\n      return val;\n    }\n\n    fex_drm_mode_obj_set_property(struct drm_mode_obj_set_property val) {\n      CPYF(value);\n      CPYF(prop_id);\n      CPYF(obj_id);\n      CPYF(obj_type);\n    }\n  };\n\n} // namespace DRM\n\nnamespace AMDGPU {\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_amdgpu_gem_metadata\") FEX_ANNOTATE(\"fex-match\") fex_drm_amdgpu_gem_metadata {\n    __u32 handle;\n    __u32 op;\n    struct {\n      compat_uint64_t flags;\n      compat_uint64_t tiling_info;\n      __u32 data_size_bytes;\n      __u32 data[64];\n    } data;\n\n    fex_drm_amdgpu_gem_metadata() = delete;\n    operator drm_amdgpu_gem_metadata() const {\n      drm_amdgpu_gem_metadata val {};\n      CPYT(handle);\n      CPYT(op);\n      CPYT(data.flags);\n      CPYT(data.tiling_info);\n      CPYT(data.data_size_bytes);\n      memcpy(val.data.data, data.data, sizeof(data.data));\n      return val;\n    }\n\n    fex_drm_amdgpu_gem_metadata(struct drm_amdgpu_gem_metadata val) {\n      CPYF(handle);\n      CPYF(op);\n      CPYF(data.flags);\n      CPYF(data.tiling_info);\n      CPYF(data.data_size_bytes);\n      memcpy(data.data, val.data.data, sizeof(data.data));\n    }\n  };\n} // namespace AMDGPU\n\nnamespace RADEON {\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_radeon_gem_create\") FEX_ANNOTATE(\"fex-match\") fex_drm_radeon_gem_create {\n    compat_uint64_t size;\n    compat_uint64_t alignment;\n    __u32 handle;\n    __u32 initial_domain;\n    __u32 flags;\n\n    fex_drm_radeon_gem_create() = delete;\n\n    operator drm_radeon_gem_create() const {\n      drm_radeon_gem_create val {};\n      CPYT(size);\n      CPYT(alignment);\n      CPYT(handle);\n      CPYT(initial_domain);\n      CPYT(flags);\n      return val;\n    }\n\n    fex_drm_radeon_gem_create(struct drm_radeon_gem_create val) {\n      CPYF(size);\n      CPYF(alignment);\n      CPYF(handle);\n      CPYF(initial_domain);\n      CPYF(flags);\n    }\n  };\n\n  struct FEX_PACKED FEX_ANNOTATE(\"alias-x86_32-drm_radeon_init\") FEX_ANNOTATE(\"fex-match\") fex_drm_radeon_init_t {\n    uint32_t func;\n\n    compat_ulong_t sarea_priv_offset;\n    int32_t is_pci;\n    int32_t cp_mode;\n    int32_t gart_size;\n    int32_t ring_size;\n    int32_t usec_timeout;\n\n    uint32_t fb_bpp;\n    uint32_t front_offset, front_pitch;\n    uint32_t back_offset, back_pitch;\n    uint32_t depth_bpp;\n    uint32_t depth_offset, depth_pitch;\n\n    compat_ulong_t fb_offset;\n    compat_ulong_t mmio_offset;\n    compat_ulong_t ring_offset;\n    compat_ulong_t ring_rptr_offset;\n    compat_ulong_t buffers_offset;\n    compat_ulong_t gart_textures_offset;\n\n    fex_drm_radeon_init_t() = delete;\n\n    operator drm_radeon_init_t() const {\n      drm_radeon_init_t val {};\n      memcpy(&val.func, &func, sizeof(val.func));\n      CPYT(sarea_priv_offset);\n      CPYT(is_pci);\n      CPYT(cp_mode);\n      CPYT(gart_size);\n      CPYT(ring_size);\n      CPYT(usec_timeout);\n      CPYT(fb_bpp);\n      CPYT(front_offset);\n      CPYT(front_pitch);\n      CPYT(back_offset);\n      CPYT(back_pitch);\n      CPYT(depth_bpp);\n      CPYT(depth_offset);\n      CPYT(depth_pitch);\n      CPYT(fb_offset);\n      CPYT(mmio_offset);\n      CPYT(ring_offset);\n      CPYT(ring_rptr_offset);\n      CPYT(buffers_offset);\n      CPYT(gart_textures_offset);\n      return val;\n    }\n\n    fex_drm_radeon_init_t(drm_radeon_init_t val) {\n      memcpy(&func, &val.func, sizeof(val.func));\n      CPYF(sarea_priv_offset);\n      CPYF(is_pci);\n      CPYF(cp_mode);\n      CPYF(gart_size);\n      CPYF(ring_size);\n      CPYF(usec_timeout);\n      CPYF(fb_bpp);\n      CPYF(front_offset);\n      CPYF(front_pitch);\n      CPYF(back_offset);\n      CPYF(back_pitch);\n      CPYF(depth_bpp);\n      CPYF(depth_offset);\n      CPYF(depth_pitch);\n      CPYF(fb_offset);\n      CPYF(mmio_offset);\n      CPYF(ring_offset);\n      CPYF(ring_rptr_offset);\n      CPYF(buffers_offset);\n      CPYF(gart_textures_offset);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_radeon_clear\") FEX_ANNOTATE(\"fex-match\") fex_drm_radeon_clear_t {\n    uint32_t flags;\n    uint32_t clear_color;\n    uint32_t clear_depth;\n    uint32_t color_mask;\n    uint32_t depth_mask;\n    compat_ptr<drm_radeon_clear_rect_t> depth_boxes;\n\n    fex_drm_radeon_clear_t() = delete;\n\n    operator drm_radeon_clear_t() const {\n      drm_radeon_clear_t val {};\n      CPYT(flags);\n      CPYT(clear_color);\n      CPYT(clear_depth);\n      CPYT(color_mask);\n      CPYT(depth_mask);\n      CPYT(depth_boxes);\n      return val;\n    }\n\n    fex_drm_radeon_clear_t(drm_radeon_clear_t val)\n      : depth_boxes {auto_compat_ptr {val.depth_boxes}} {\n      CPYF(flags);\n      CPYF(clear_color);\n      CPYF(clear_depth);\n      CPYF(color_mask);\n      CPYF(depth_mask);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_radeon_stipple\") FEX_ANNOTATE(\"fex-match\") fex_drm_radeon_stipple_t {\n    compat_ptr<uint32_t> mask;\n\n    fex_drm_radeon_stipple_t() = delete;\n\n    operator drm_radeon_stipple_t() const {\n      drm_radeon_stipple_t val {};\n      CPYT(mask);\n      return val;\n    }\n\n    fex_drm_radeon_stipple_t(drm_radeon_stipple_t val)\n      : mask {auto_compat_ptr {val.mask}} {}\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_radeon_texture\") FEX_ANNOTATE(\"fex-match\") fex_drm_radeon_texture_t {\n    uint32_t offset;\n    int32_t pitch;\n    int32_t format;\n    int32_t width;\n    int32_t height;\n    compat_ptr<drm_radeon_tex_image_t> image;\n\n    fex_drm_radeon_texture_t() = delete;\n\n    operator drm_radeon_texture_t() const {\n      drm_radeon_texture_t val {};\n      CPYT(offset);\n      CPYT(pitch);\n      CPYT(format);\n      CPYT(width);\n      CPYT(height);\n      CPYT(image);\n      return val;\n    }\n\n    fex_drm_radeon_texture_t(drm_radeon_texture_t val)\n      : image {auto_compat_ptr {val.image}} {\n      CPYF(offset);\n      CPYF(pitch);\n      CPYF(format);\n      CPYF(width);\n      CPYF(height);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_radeon_vertex2\") FEX_ANNOTATE(\"fex-match\") fex_drm_radeon_vertex2_t {\n    int32_t idx;\n    int32_t discard;\n    int32_t nr_states;\n    compat_ptr<drm_radeon_state_t> state;\n    int32_t nr_prims;\n    compat_ptr<drm_radeon_prim_t> prim;\n\n    fex_drm_radeon_vertex2_t() = delete;\n\n    operator drm_radeon_vertex2_t() const {\n      drm_radeon_vertex2_t val;\n      CPYT(idx);\n      CPYT(discard);\n      CPYT(nr_states);\n      CPYT(state);\n      CPYT(nr_prims);\n      CPYT(prim);\n      return val;\n    }\n\n    fex_drm_radeon_vertex2_t(drm_radeon_vertex2_t val)\n      : state {auto_compat_ptr {val.state}}\n      , prim {auto_compat_ptr {val.prim}} {\n      CPYF(idx);\n      CPYF(discard);\n      CPYF(nr_states);\n      CPYF(nr_prims);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_radeon_cmd_buffer\") FEX_ANNOTATE(\"fex-match\") fex_drm_radeon_cmd_buffer_t {\n    int32_t bufsz;\n    compat_ptr<char> buf;\n    int32_t nbox;\n    compat_ptr<drm_clip_rect> boxes;\n\n    fex_drm_radeon_cmd_buffer_t() = delete;\n\n    operator drm_radeon_cmd_buffer_t() const {\n      drm_radeon_cmd_buffer_t val;\n      CPYT(bufsz);\n      CPYT(buf);\n      CPYT(nbox);\n      CPYT(boxes);\n      return val;\n    }\n\n    fex_drm_radeon_cmd_buffer_t(drm_radeon_cmd_buffer_t val)\n      : buf {auto_compat_ptr {val.buf}}\n      , boxes {auto_compat_ptr {val.boxes}} {\n      CPYF(bufsz);\n      CPYF(nbox);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_radeon_getparam\") FEX_ANNOTATE(\"fex-match\") fex_drm_radeon_getparam_t {\n    int32_t param;\n    compat_ptr<void> value;\n\n    fex_drm_radeon_getparam_t() = delete;\n\n    operator drm_radeon_getparam_t() const {\n      drm_radeon_getparam_t val;\n      CPYT(param);\n      CPYT(value);\n      return val;\n    }\n\n    fex_drm_radeon_getparam_t(drm_radeon_getparam_t val)\n      : value {auto_compat_ptr {val.value}} {\n      CPYF(param);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_radeon_mem_alloc\") FEX_ANNOTATE(\"fex-match\") fex_drm_radeon_mem_alloc_t {\n    int32_t region;\n    int32_t alignment;\n    int32_t size;\n    compat_ptr<int32_t> region_offset;\n\n    fex_drm_radeon_mem_alloc_t() = delete;\n\n    operator drm_radeon_mem_alloc_t() const {\n      drm_radeon_mem_alloc_t val;\n      CPYT(region);\n      CPYT(alignment);\n      CPYT(size);\n      CPYT(region_offset);\n      return val;\n    }\n\n    fex_drm_radeon_mem_alloc_t(drm_radeon_mem_alloc_t val)\n      : region_offset {auto_compat_ptr {val.region_offset}} {\n      CPYF(region);\n      CPYF(alignment);\n      CPYF(size);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_radeon_irq_emit\") FEX_ANNOTATE(\"fex-match\") fex_drm_radeon_irq_emit_t {\n    compat_ptr<int32_t> irq_seq;\n\n    fex_drm_radeon_irq_emit_t() = delete;\n\n    operator drm_radeon_irq_emit_t() const {\n      drm_radeon_irq_emit_t val;\n      CPYT(irq_seq);\n      return val;\n    }\n\n    fex_drm_radeon_irq_emit_t(drm_radeon_irq_emit_t val)\n      : irq_seq {auto_compat_ptr {val.irq_seq}} {}\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_radeon_setparam\") FEX_ANNOTATE(\"fex-match\") FEX_PACKED fex_drm_radeon_setparam_t {\n    uint32_t param;\n    compat_int64_t value;\n\n    fex_drm_radeon_setparam_t() = delete;\n\n    operator drm_radeon_setparam_t() const {\n      drm_radeon_setparam_t val;\n      CPYT(param);\n      CPYT(value);\n      return val;\n    }\n\n    fex_drm_radeon_setparam_t(drm_radeon_setparam_t val) {\n      CPYF(param);\n      CPYF(value);\n    }\n  };\n\n} // namespace RADEON\n\nnamespace MSM {\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_msm_timespec\") FEX_ANNOTATE(\"fex-match\") fex_drm_msm_timespec {\n    compat_int64_t tv_sec;\n    compat_int64_t tv_nsec;\n\n    operator drm_msm_timespec() const {\n      drm_msm_timespec val {};\n      CPYT(tv_sec);\n      CPYT(tv_nsec);\n      return val;\n    }\n\n    static fex_drm_msm_timespec FromHost(struct drm_msm_timespec val) {\n      fex_drm_msm_timespec ret;\n      ret.tv_sec = val.tv_sec;\n      ret.tv_nsec = val.tv_nsec;\n      return ret;\n    }\n\n  private:\n    fex_drm_msm_timespec() = default;\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_msm_wait_fence\") FEX_ANNOTATE(\"fex-match\") FEX_PACKED fex_drm_msm_wait_fence {\n    uint32_t fence;\n    uint32_t flags;\n    struct fex_drm_msm_timespec timeout;\n    uint32_t queueid;\n\n    fex_drm_msm_wait_fence() = delete;\n\n    operator drm_msm_wait_fence() const {\n      drm_msm_wait_fence val {};\n      CPYT(fence);\n      CPYT(flags);\n      CPYT(timeout);\n      CPYT(queueid);\n      return val;\n    }\n\n    fex_drm_msm_wait_fence(struct drm_msm_wait_fence val)\n      : timeout {fex_drm_msm_timespec::FromHost(val.timeout)} {\n      CPYF(fence);\n      CPYF(flags);\n      CPYF(queueid);\n    }\n  };\n\n} // namespace MSM\n\nnamespace I915 {\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_i915_batchbuffer\") FEX_ANNOTATE(\"fex-match\") fex_drm_i915_batchbuffer_t {\n    int32_t start;\n    int32_t used;\n    int32_t DR1;\n    int32_t DR4;\n    int32_t num_cliprects;\n    compat_ptr<struct drm_clip_rect> cliprects;\n\n    fex_drm_i915_batchbuffer_t() = delete;\n\n    operator drm_i915_batchbuffer_t() const {\n      drm_i915_batchbuffer_t val {};\n      CPYT(start);\n      CPYT(used);\n      CPYT(DR1);\n      CPYT(DR4);\n      CPYT(num_cliprects);\n      CPYT(cliprects);\n      return val;\n    }\n\n    fex_drm_i915_batchbuffer_t(drm_i915_batchbuffer_t val)\n      : cliprects {auto_compat_ptr {val.cliprects}} {\n      CPYF(start);\n      CPYF(used);\n      CPYF(DR1);\n      CPYF(DR4);\n      CPYF(num_cliprects);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_i915_irq_emit\") FEX_ANNOTATE(\"fex-match\") fex_drm_i915_irq_emit_t {\n    compat_ptr<int> irq_seq;\n\n    fex_drm_i915_irq_emit_t() = delete;\n\n    operator drm_i915_irq_emit_t() const {\n      drm_i915_irq_emit_t val {};\n      CPYT(irq_seq);\n      return val;\n    }\n\n    fex_drm_i915_irq_emit_t(drm_i915_irq_emit_t val)\n      : irq_seq {auto_compat_ptr {val.irq_seq}} {}\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_i915_getparam\") FEX_ANNOTATE(\"fex-match\") fex_drm_i915_getparam_t {\n    int32_t param;\n    compat_ptr<int> value;\n    fex_drm_i915_getparam_t() = delete;\n\n    operator drm_i915_getparam_t() const {\n      drm_i915_getparam_t val {};\n      CPYT(param);\n      CPYT(value);\n      return val;\n    }\n\n    fex_drm_i915_getparam_t(drm_i915_getparam_t val)\n      : value {auto_compat_ptr {val.value}} {\n      CPYF(param);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_i915_mem_alloc\") FEX_ANNOTATE(\"fex-match\") fex_drm_i915_mem_alloc_t {\n    int32_t region;\n    int32_t alignment;\n    int32_t size;\n    compat_ptr<int> region_offset;\n    fex_drm_i915_mem_alloc_t() = delete;\n\n    operator drm_i915_mem_alloc_t() const {\n      drm_i915_mem_alloc_t val {};\n      CPYT(region);\n      CPYT(alignment);\n      CPYT(size);\n      CPYT(region_offset);\n      return val;\n    }\n\n    fex_drm_i915_mem_alloc_t(drm_i915_mem_alloc_t val)\n      : region_offset {auto_compat_ptr {val.region_offset}} {\n      CPYF(region);\n      CPYF(alignment);\n      CPYF(size);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-_drm_i915_cmdbuffer\") FEX_ANNOTATE(\"fex-match\") fex_drm_i915_cmdbuffer_t {\n    compat_ptr<char> buf;\n    int32_t sz;\n    int32_t DR1;\n    int32_t DR4;\n    int32_t num_cliprects;\n    compat_ptr<struct drm_clip_rect> cliprects;\n\n    fex_drm_i915_cmdbuffer_t() = delete;\n\n    operator drm_i915_cmdbuffer_t() const {\n      drm_i915_cmdbuffer_t val {};\n      CPYT(buf);\n      CPYT(sz);\n      CPYT(DR1);\n      CPYT(DR4);\n      CPYT(num_cliprects);\n      CPYT(cliprects);\n      return val;\n    }\n\n    fex_drm_i915_cmdbuffer_t(drm_i915_cmdbuffer_t val)\n      : buf {auto_compat_ptr {val.buf}}\n      , cliprects {auto_compat_ptr {val.cliprects}} {\n      CPYF(sz);\n      CPYF(DR1);\n      CPYF(DR4);\n      CPYF(num_cliprects);\n    }\n  };\n\n// I915 defines if they don't exist\n// Older DRM doesn't have this\n#ifndef DRM_IOCTL_I915_GEM_MMAP_OFFSET\n  struct drm_i915_gem_mmap_offset {\n    uint32_t handle;\n    uint32_t pad;\n    compat_uint64_t offset;\n    compat_uint64_t flags;\n    compat_uint64_t extensions;\n  };\n\n#define DRM_IOCTL_I915_GEM_MMAP_OFFSET DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP_GTT, FEX::HLE::x32::I915::drm_i915_gem_mmap_offset)\n#endif\n} // namespace I915\n\nnamespace VC4 {\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_vc4_perfmon_get_values\") FEX_ANNOTATE(\"fex-match\") fex_drm_vc4_perfmon_get_values {\n    uint32_t id;\n    compat_uint64_t values_ptr;\n\n    fex_drm_vc4_perfmon_get_values() = delete;\n\n    operator drm_vc4_perfmon_get_values() const {\n      drm_vc4_perfmon_get_values val {};\n      CPYT(id);\n      CPYT(values_ptr);\n      return val;\n    }\n    fex_drm_vc4_perfmon_get_values(drm_vc4_perfmon_get_values val) {\n      CPYF(id);\n      CPYF(values_ptr);\n    }\n  };\n\n} // namespace VC4\n\nnamespace V3D {\n  struct FEX_ANNOTATE(\"alias-x86_32-drm_v3d_submit_csd\") FEX_ANNOTATE(\"fex-match\") fex_drm_v3d_submit_csd {\n    uint32_t cfg[7];\n    uint32_t coef[4];\n\n    compat_uint64_t bo_handles;\n\n    uint32_t bo_handle_count;\n\n    uint32_t in_sync;\n\n    uint32_t out_sync;\n\n    /**\n     * @name This member were added in Linux 5.15\n     * Commit: 26a4dc29b74a137f45665089f6d3d633fcc9b662\n     *\n     * As far as I can tell this is an ABI break, Probably safe since this likely would have been padded to 8 bytes.\n     * Still pretty sketchy.\n     * @{ */\n\n    uint32_t perfmon_id;\n    /**  @} */\n\n    /**\n     * @name These members were added in Linux 5.17\n     * Commit: bb3425efdcd99f2b4e608e850226f7107b2f993e\n     * This added additional members to `drm_v3d_submit_cl` and `drm_v3d_submit_tfu` as well.\n     *\n     * As far as I can tell this is an ABI break for the `submit_tfu` and `submit_csd` structs.\n     * `submit_cl` is safe because it it already had a flags member.\n     *\n     * We just need to eat the fact that if the userspace isn't compiled against Linux 5.17 headers\n     * that copying this member may cause faults that we can't capture currently.\n     * @{ */\n\n    compat_uint64_t extensions;\n\n    uint32_t flags;\n\n    uint32_t pad;\n    /**  @} */\n\n    fex_drm_v3d_submit_csd() = default;\n\n    operator drm_v3d_submit_csd() const {\n      drm_v3d_submit_csd val {};\n      memcpy(val.cfg, cfg, sizeof(cfg));\n      memcpy(val.coef, coef, sizeof(coef));\n      CPYT(bo_handles);\n      CPYT(bo_handle_count);\n      CPYT(in_sync);\n      CPYT(out_sync);\n      CPYT(perfmon_id);\n      CPYT(extensions);\n      CPYT(flags);\n      CPYT(pad);\n      return val;\n    }\n\n    static void SafeConvertToGuest(fex_drm_v3d_submit_csd* Result, drm_v3d_submit_csd Src, size_t IoctlSize) {\n      // We need to be more careful since this API changes over time\n      fex_drm_v3d_submit_csd Tmp = Src;\n      memcpy(Result, &Tmp, IoctlSize);\n    }\n\n    static drm_v3d_submit_csd SafeConvertToHost(fex_drm_v3d_submit_csd* Src, size_t IoctlSize) {\n      // We need to be more careful since this API changes over time\n      drm_v3d_submit_csd Result {};\n\n      // Copy the incoming variable over with memcpy\n      // This way if it is smaller than expected we will zero the remaining struct\n      fex_drm_v3d_submit_csd Tmp {};\n      memcpy(&Tmp, Src, std::min(IoctlSize, sizeof(fex_drm_v3d_submit_csd)));\n\n      memcpy(Result.cfg, Tmp.cfg, sizeof(cfg));\n      memcpy(Result.coef, Tmp.coef, sizeof(coef));\n      Result.bo_handles = Tmp.bo_handles;\n      Result.bo_handle_count = Tmp.bo_handle_count;\n      Result.in_sync = Tmp.in_sync;\n      Result.out_sync = Tmp.out_sync;\n      Result.perfmon_id = Tmp.perfmon_id;\n      Result.extensions = Tmp.extensions;\n      Result.flags = Tmp.flags;\n      Result.pad = Tmp.pad;\n\n      return Result;\n    }\n\n    fex_drm_v3d_submit_csd(drm_v3d_submit_csd val) {\n      memcpy(cfg, val.cfg, sizeof(cfg));\n      memcpy(coef, val.coef, sizeof(coef));\n      CPYF(bo_handles);\n      CPYF(bo_handle_count);\n      CPYF(in_sync);\n      CPYF(out_sync);\n      CPYF(perfmon_id);\n      CPYF(extensions);\n      CPYF(flags);\n      CPYF(pad);\n    }\n  };\n\n} // namespace V3D\n\n#include \"LinuxSyscalls/x32/Ioctl/drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/amdgpu_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/asahi_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/msm_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/i915_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/lima_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/panfrost_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/nouveau_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/nova_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/radeon_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/vc4_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/v3d_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/panthor_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/pvr_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/xe_drm.inl\"\n} // namespace FEX::HLE::x32\n#undef CPYT\n#undef CPYF\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/drm.inl",
    "content": "_CUSTOM_META(DRM_IOCTL_VERSION, DRM_IOWR(0x00, FEX::HLE::x32::DRM::fex_drm_version))\n_CUSTOM_META(DRM_IOCTL_GET_UNIQUE, DRM_IOWR(0x01, FEX::HLE::x32::DRM::fex_drm_unique))\n_BASIC_META(DRM_IOCTL_GET_MAGIC)\n_BASIC_META(DRM_IOCTL_IRQ_BUSID)\n_CUSTOM_META(DRM_IOCTL_GET_MAP, DRM_IOWR(0x04, FEX::HLE::x32::DRM::fex_drm_map))\n_CUSTOM_META(DRM_IOCTL_GET_CLIENT, DRM_IOWR(0x05, FEX::HLE::x32::DRM::fex_drm_client))\n_CUSTOM_META(DRM_IOCTL_GET_STATS, DRM_IOR(0x06, FEX::HLE::x32::DRM::fex_drm_stats))\n_BASIC_META(DRM_IOCTL_SET_VERSION)\n_BASIC_META(DRM_IOCTL_MODESET_CTL)\n_BASIC_META(DRM_IOCTL_GEM_CLOSE)\n_BASIC_META(DRM_IOCTL_GEM_FLINK)\n_BASIC_META(DRM_IOCTL_GEM_OPEN)\n_BASIC_META(DRM_IOCTL_GET_CAP)\n_BASIC_META(DRM_IOCTL_SET_CLIENT_CAP)\n\n_CUSTOM_META(DRM_IOCTL_SET_UNIQUE, DRM_IOW(0x10, FEX::HLE::x32::DRM::fex_drm_unique))\n_BASIC_META(DRM_IOCTL_AUTH_MAGIC)\n_BASIC_META(DRM_IOCTL_BLOCK)\n_BASIC_META(DRM_IOCTL_UNBLOCK)\n_BASIC_META(DRM_IOCTL_CONTROL)\n_CUSTOM_META(DRM_IOCTL_ADD_MAP, DRM_IOWR(0x15, FEX::HLE::x32::DRM::fex_drm_map))\n_CUSTOM_META(DRM_IOCTL_ADD_BUFS, DRM_IOWR(0x16, FEX::HLE::x32::DRM::fex_drm_buf_desc))\n_CUSTOM_META(DRM_IOCTL_MARK_BUFS, DRM_IOW(0x17, FEX::HLE::x32::DRM::fex_drm_buf_desc))\n_CUSTOM_META(DRM_IOCTL_INFO_BUFS, DRM_IOWR(0x18, FEX::HLE::x32::DRM::fex_drm_buf_info))\n_CUSTOM_META(DRM_IOCTL_MAP_BUFS, DRM_IOWR(0x19, FEX::HLE::x32::DRM::fex_drm_buf_map))\n_CUSTOM_META(DRM_IOCTL_FREE_BUFS, DRM_IOW(0x1a, FEX::HLE::x32::DRM::fex_drm_buf_free))\n\n_CUSTOM_META(DRM_IOCTL_RM_MAP, DRM_IOW(0x1b, FEX::HLE::x32::DRM::fex_drm_map))\n\n_CUSTOM_META(DRM_IOCTL_SET_SAREA_CTX, DRM_IOW(0x1c, FEX::HLE::x32::DRM::fex_drm_ctx_priv_map))\n_CUSTOM_META(DRM_IOCTL_GET_SAREA_CTX, DRM_IOWR(0x1d, FEX::HLE::x32::DRM::fex_drm_ctx_priv_map))\n\n_BASIC_META(DRM_IOCTL_SET_MASTER)\n_BASIC_META(DRM_IOCTL_DROP_MASTER)\n\n_BASIC_META(DRM_IOCTL_ADD_CTX)\n_BASIC_META(DRM_IOCTL_RM_CTX)\n_BASIC_META(DRM_IOCTL_MOD_CTX)\n_BASIC_META(DRM_IOCTL_GET_CTX)\n_BASIC_META(DRM_IOCTL_SWITCH_CTX)\n_BASIC_META(DRM_IOCTL_NEW_CTX)\n_CUSTOM_META(DRM_IOCTL_RES_CTX, DRM_IOWR(0x26, FEX::HLE::x32::DRM::fex_drm_ctx_res))\n_BASIC_META(DRM_IOCTL_ADD_DRAW)\n_BASIC_META(DRM_IOCTL_RM_DRAW)\n_CUSTOM_META(DRM_IOCTL_DMA, DRM_IOWR(0x29, FEX::HLE::x32::DRM::fex_drm_dma))\n_BASIC_META(DRM_IOCTL_LOCK)\n_BASIC_META(DRM_IOCTL_UNLOCK)\n_BASIC_META(DRM_IOCTL_FINISH)\n\n_BASIC_META(DRM_IOCTL_PRIME_HANDLE_TO_FD)\n_BASIC_META(DRM_IOCTL_PRIME_FD_TO_HANDLE)\n\n_BASIC_META(DRM_IOCTL_AGP_ACQUIRE)\n_BASIC_META(DRM_IOCTL_AGP_RELEASE)\n// XXX: _BASIC_META(DRM_IOCTL_AGP_ENABLE)\n// XXX: _BASIC_META(DRM_IOCTL_AGP_INFO)\n// XXX: _BASIC_META(DRM_IOCTL_AGP_ALLOC)\n// XXX: _BASIC_META(DRM_IOCTL_AGP_FREE)\n// XXX: _BASIC_META(DRM_IOCTL_AGP_BIND)\n// XXX: _BASIC_META(DRM_IOCTL_AGP_UNBIND)\n\n_CUSTOM_META(DRM_IOCTL_SG_ALLOC, DRM_IOWR(0x38, FEX::HLE::x32::DRM::fex_drm_scatter_gather))\n_CUSTOM_META(DRM_IOCTL_SG_FREE, DRM_IOW(0x39, FEX::HLE::x32::DRM::fex_drm_scatter_gather))\n\n_CUSTOM_META(DRM_IOCTL_WAIT_VBLANK, DRM_IOWR(0x3a, FEX::HLE::x32::DRM::fex_drm_wait_vblank))\n\n_BASIC_META(DRM_IOCTL_CRTC_GET_SEQUENCE)\n_BASIC_META(DRM_IOCTL_CRTC_QUEUE_SEQUENCE)\n\n_CUSTOM_META(DRM_IOCTL_UPDATE_DRAW, DRM_IOW(0x3f, FEX::HLE::x32::DRM::fex_drm_update_draw))\n\n_BASIC_META(DRM_IOCTL_MODE_GETRESOURCES)\n_BASIC_META(DRM_IOCTL_MODE_GETCRTC)\n_BASIC_META(DRM_IOCTL_MODE_SETCRTC)\n_BASIC_META(DRM_IOCTL_MODE_CURSOR)\n_BASIC_META(DRM_IOCTL_MODE_GETGAMMA)\n_BASIC_META(DRM_IOCTL_MODE_SETGAMMA)\n_BASIC_META(DRM_IOCTL_MODE_GETENCODER)\n_BASIC_META(DRM_IOCTL_MODE_GETCONNECTOR)\n_BASIC_META(DRM_IOCTL_MODE_ATTACHMODE)\n_BASIC_META(DRM_IOCTL_MODE_DETACHMODE)\n\n_BASIC_META(DRM_IOCTL_MODE_GETPROPERTY)\n_BASIC_META(DRM_IOCTL_MODE_SETPROPERTY)\n_BASIC_META(DRM_IOCTL_MODE_GETPROPBLOB)\n_BASIC_META(DRM_IOCTL_MODE_GETFB)\n_BASIC_META(DRM_IOCTL_MODE_ADDFB)\n_BASIC_META(DRM_IOCTL_MODE_RMFB)\n_BASIC_META(DRM_IOCTL_MODE_PAGE_FLIP)\n_BASIC_META(DRM_IOCTL_MODE_DIRTYFB)\n\n_BASIC_META(DRM_IOCTL_MODE_CREATE_DUMB)\n_BASIC_META(DRM_IOCTL_MODE_MAP_DUMB)\n_BASIC_META(DRM_IOCTL_MODE_DESTROY_DUMB)\n_CUSTOM_META(DRM_IOCTL_MODE_GETPLANERESOURCES, DRM_IOWR(0xB5, FEX::HLE::x32::DRM::fex_drm_mode_get_plane_res))\n_BASIC_META(DRM_IOCTL_MODE_GETPLANE)\n_BASIC_META(DRM_IOCTL_MODE_SETPLANE)\n_CUSTOM_META(DRM_IOCTL_MODE_ADDFB2, DRM_IOWR(0xB8, FEX::HLE::x32::DRM::fex_drm_mode_fb_cmd2))\n_CUSTOM_META(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, DRM_IOWR(0xB9, FEX::HLE::x32::DRM::fex_drm_mode_obj_get_properties))\n_CUSTOM_META(DRM_IOCTL_MODE_OBJ_SETPROPERTY, DRM_IOWR(0xBA, FEX::HLE::x32::DRM::fex_drm_mode_obj_set_property))\n_BASIC_META(DRM_IOCTL_MODE_CURSOR2)\n_BASIC_META(DRM_IOCTL_MODE_ATOMIC)\n_BASIC_META(DRM_IOCTL_MODE_CREATEPROPBLOB)\n_BASIC_META(DRM_IOCTL_MODE_DESTROYPROPBLOB)\n\n_BASIC_META(DRM_IOCTL_SYNCOBJ_CREATE)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_DESTROY)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_WAIT)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_RESET)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_SIGNAL)\n\n_BASIC_META(DRM_IOCTL_MODE_CREATE_LEASE)\n_BASIC_META(DRM_IOCTL_MODE_LIST_LESSEES)\n_BASIC_META(DRM_IOCTL_MODE_GET_LEASE)\n_BASIC_META(DRM_IOCTL_MODE_REVOKE_LEASE)\n\n_BASIC_META(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_QUERY)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_TRANSFER)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL)\n\n_CUSTOM_META(DRM_IOCTL_MODE_GETFB2, DRM_IOWR(0xCE, FEX::HLE::x32::DRM::fex_drm_mode_fb_cmd2))\n_BASIC_META(DRM_IOCTL_SYNCOBJ_EVENTFD)\n_BASIC_META(DRM_IOCTL_MODE_CLOSEFB)\n_BASIC_META(DRM_IOCTL_SET_CLIENT_NAME)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/ext_fs.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"LinuxSyscalls/x32/Types.h\"\n#include \"LinuxSyscalls/x32/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <linux/blktrace_api.h>\n#include <linux/fs.h>\n#include <linux/fiemap.h>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x32 {\n\nnamespace ext_fs {\n#include \"LinuxSyscalls/x32/Ioctl/ext_fs.inl\"\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/ext_fs.inl",
    "content": "_BASIC_META(BLKROSET)\n_BASIC_META(BLKROGET)\n_BASIC_META(BLKRRPART)\n_BASIC_META(BLKGETSIZE)\n_BASIC_META(BLKFLSBUF)\n_BASIC_META(BLKRASET)\n_BASIC_META(BLKRAGET)\n_BASIC_META(BLKFRASET)\n_BASIC_META(BLKFRAGET)\n_BASIC_META(BLKSECTSET)\n_BASIC_META(BLKSECTGET)\n_BASIC_META(BLKSSZGET)\n\n_BASIC_META(BLKBSZGET)\n_BASIC_META(BLKBSZSET)\n_BASIC_META(BLKGETSIZE64)\n_BASIC_META(BLKTRACESETUP)\n_BASIC_META(BLKTRACESTART)\n_BASIC_META(BLKTRACESTOP)\n_BASIC_META(BLKTRACETEARDOWN)\n_BASIC_META(BLKDISCARD)\n_BASIC_META(BLKIOMIN)\n_BASIC_META(BLKIOOPT)\n_BASIC_META(BLKALIGNOFF)\n_BASIC_META(BLKPBSZGET)\n_BASIC_META(BLKDISCARDZEROES)\n_BASIC_META(BLKSECDISCARD)\n_BASIC_META(BLKROTATIONAL)\n_BASIC_META(BLKZEROOUT)\n\n_BASIC_META(FIBMAP)\n_BASIC_META(FIGETBSZ)\n_BASIC_META(FIFREEZE)\n_BASIC_META(FITHAW)\n_BASIC_META(FITRIM)\n_BASIC_META(FICLONE)\n_BASIC_META(FICLONERANGE)\n_BASIC_META(FIDEDUPERANGE)\n\n_BASIC_META(FS_IOC_GETFLAGS)\n_BASIC_META(FS_IOC_SETFLAGS)\n_BASIC_META(FS_IOC_GETVERSION)\n_BASIC_META(FS_IOC_SETVERSION)\n_BASIC_META(FS_IOC_FIEMAP)\n_BASIC_META(FS_IOC32_GETFLAGS)\n_BASIC_META(FS_IOC32_SETFLAGS)\n_BASIC_META(FS_IOC32_GETVERSION)\n_BASIC_META(FS_IOC32_SETVERSION)\n_BASIC_META(FS_IOC_FSGETXATTR)\n_BASIC_META(FS_IOC_FSSETXATTR)\n_BASIC_META(FS_IOC_GETFSLABEL)\n_BASIC_META(FS_IOC_SETFSLABEL)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/f2fs.h",
    "content": "// SPDX-License-Identifier: MIT\n#include \"LinuxSyscalls/x32/Types.h\"\n#include \"LinuxSyscalls/x32/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x32 {\nnamespace f2fs {\n  // There is no userspace definitions for these\n  // Must define everything ourselves\n  constexpr uint32_t F2FS_IOCTL_MAGIC = 0xf5;\n#define F2FS_IOC_START_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 1)\n#define F2FS_IOC_COMMIT_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 2)\n#define F2FS_IOC_START_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 3)\n#define F2FS_IOC_RELEASE_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 4)\n#define F2FS_IOC_ABORT_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 5)\n#define F2FS_IOC_GARBAGE_COLLECT _IOW(F2FS_IOCTL_MAGIC, 6, uint32_t)\n#define F2FS_IOC_WRITE_CHECKPOINT _IO(F2FS_IOCTL_MAGIC, 7)\n//#define F2FS_IOC_DEFRAGMENT         _IOWR(F2FS_IOCTL_MAGIC, 8,    \\\n//                                          struct f2fs_defragment)\n//#define F2FS_IOC_MOVE_RANGE         _IOWR(F2FS_IOCTL_MAGIC, 9,    \\\n//                                          struct f2fs_move_range)\n//#define F2FS_IOC_FLUSH_DEVICE       _IOW(F2FS_IOCTL_MAGIC, 10,    \\\n//                                          struct f2fs_flush_device)\n//#define F2FS_IOC_GARBAGE_COLLECT_RANGE    _IOW(F2FS_IOCTL_MAGIC, 11,    \\\n//                                          struct f2fs_gc_range)\n#define F2FS_IOC_GET_FEATURES _IOR(F2FS_IOCTL_MAGIC, 12, uint32_t)\n#define F2FS_IOC_SET_PIN_FILE _IOW(F2FS_IOCTL_MAGIC, 13, uint32_t)\n#define F2FS_IOC_GET_PIN_FILE _IOR(F2FS_IOCTL_MAGIC, 14, uint32_t)\n#define F2FS_IOC_PRECACHE_EXTENTS _IO(F2FS_IOCTL_MAGIC, 15)\n#define F2FS_IOC_RESIZE_FS _IOW(F2FS_IOCTL_MAGIC, 16, uint64_t)\n#define F2FS_IOC_GET_COMPRESS_BLOCKS _IOR(F2FS_IOCTL_MAGIC, 17, uint64_t)\n#define F2FS_IOC_RELEASE_COMPRESS_BLOCKS _IOR(F2FS_IOCTL_MAGIC, 18, uint64_t)\n#define F2FS_IOC_RESERVE_COMPRESS_BLOCKS _IOR(F2FS_IOCTL_MAGIC, 19, uint64_t)\n//#define F2FS_IOC_SEC_TRIM_FILE            _IOW(F2FS_IOCTL_MAGIC, 20,    \\\n//                                          struct f2fs_sectrim_range)\n#include \"LinuxSyscalls/x32/Ioctl/f2fs.inl\"\n} // namespace f2fs\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/f2fs.inl",
    "content": "_BASIC_META(F2FS_IOC_START_ATOMIC_WRITE)\n_BASIC_META(F2FS_IOC_COMMIT_ATOMIC_WRITE)\n_BASIC_META(F2FS_IOC_START_VOLATILE_WRITE)\n_BASIC_META(F2FS_IOC_RELEASE_VOLATILE_WRITE)\n_BASIC_META(F2FS_IOC_ABORT_VOLATILE_WRITE)\n_BASIC_META(F2FS_IOC_GARBAGE_COLLECT)\n_BASIC_META(F2FS_IOC_WRITE_CHECKPOINT)\n//_CUSTOM_META(F2FS_IOC_DEFRAGMENT, XXX)\n//_CUSTOM_META(F2FS_IOC_MOVE_RANGE, XXX)\n//_CUSTOM_META(F2FS_IOC_FLUSH_DEVICE, XXX)\n//_CUSTOM_META(F2FS_IOC_GARBAGE_COLLECT_RANGE, XXX)\n_BASIC_META(F2FS_IOC_GET_FEATURES)\n_BASIC_META(F2FS_IOC_SET_PIN_FILE)\n_BASIC_META(F2FS_IOC_GET_PIN_FILE)\n_BASIC_META(F2FS_IOC_PRECACHE_EXTENTS)\n_BASIC_META(F2FS_IOC_RESIZE_FS)\n_BASIC_META(F2FS_IOC_GET_COMPRESS_BLOCKS)\n_BASIC_META(F2FS_IOC_RELEASE_COMPRESS_BLOCKS)\n_BASIC_META(F2FS_IOC_RESERVE_COMPRESS_BLOCKS)\n//_CUSTOM_META(F2FS_IOC_SEC_TRIM_FILE, XXX)\n\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/i915_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_I915_INIT)\n_BASIC_META(DRM_IOCTL_I915_FLUSH)\n_BASIC_META(DRM_IOCTL_I915_FLIP)\n_CUSTOM_META(DRM_IOCTL_I915_BATCHBUFFER, DRM_IOW(DRM_COMMAND_BASE + DRM_I915_BATCHBUFFER, FEX::HLE::x32::I915::fex_drm_i915_batchbuffer_t))\n_CUSTOM_META(DRM_IOCTL_I915_IRQ_EMIT, DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_IRQ_EMIT, FEX::HLE::x32::I915::fex_drm_i915_irq_emit_t))\n_BASIC_META(DRM_IOCTL_I915_IRQ_WAIT)\n_CUSTOM_META(DRM_IOCTL_I915_GETPARAM, DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GETPARAM, FEX::HLE::x32::I915::fex_drm_i915_getparam_t))\n_BASIC_META(DRM_IOCTL_I915_SETPARAM)\n_CUSTOM_META(DRM_IOCTL_I915_ALLOC, DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_ALLOC, FEX::HLE::x32::I915::fex_drm_i915_mem_alloc_t))\n_BASIC_META(DRM_IOCTL_I915_FREE)\n_BASIC_META(DRM_IOCTL_I915_INIT_HEAP)\n_CUSTOM_META(DRM_IOCTL_I915_CMDBUFFER, DRM_IOW( DRM_COMMAND_BASE + DRM_I915_CMDBUFFER, FEX::HLE::x32::I915::fex_drm_i915_cmdbuffer_t))\n_BASIC_META(DRM_IOCTL_I915_DESTROY_HEAP)\n_BASIC_META(DRM_IOCTL_I915_SET_VBLANK_PIPE)\n_BASIC_META(DRM_IOCTL_I915_GET_VBLANK_PIPE)\n_BASIC_META(DRM_IOCTL_I915_VBLANK_SWAP)\n_BASIC_META(DRM_IOCTL_I915_HWS_ADDR)\n_BASIC_META(DRM_IOCTL_I915_GEM_INIT)\n_BASIC_META(DRM_IOCTL_I915_GEM_EXECBUFFER)\n_BASIC_META(DRM_IOCTL_I915_GEM_EXECBUFFER2)\n// DRM_IOCTL_I915_GEM_EXECBUFFER2_WR overlaps DRM_IOCTL_I915_GEM_EXECBUFFER2\n_CUSTOM_META(DRM_IOCTL_I915_GEM_EXECBUFFER2_WR, DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_EXECBUFFER2_WR, struct drm_i915_gem_execbuffer2))\n_BASIC_META(DRM_IOCTL_I915_GEM_PIN)\n_BASIC_META(DRM_IOCTL_I915_GEM_UNPIN)\n_BASIC_META(DRM_IOCTL_I915_GEM_BUSY)\n_BASIC_META(DRM_IOCTL_I915_GEM_SET_CACHING)\n_BASIC_META(DRM_IOCTL_I915_GEM_GET_CACHING)\n_BASIC_META(DRM_IOCTL_I915_GEM_THROTTLE)\n_BASIC_META(DRM_IOCTL_I915_GEM_ENTERVT)\n_BASIC_META(DRM_IOCTL_I915_GEM_LEAVEVT)\n_BASIC_META(DRM_IOCTL_I915_GEM_CREATE)\n_BASIC_META(DRM_IOCTL_I915_GEM_CREATE_EXT)\n_BASIC_META(DRM_IOCTL_I915_GEM_PREAD)\n_BASIC_META(DRM_IOCTL_I915_GEM_PWRITE)\n_BASIC_META(DRM_IOCTL_I915_GEM_MMAP)\n_BASIC_META(DRM_IOCTL_I915_GEM_MMAP_GTT)\n// DRM_IOCTL_I915_GEM_MMAP_OFFSET overlaps DRM_IOCTL_I915_GEM_MMAP_GTT\n#ifndef DRM_IOCTL_I915_GEM_MMAP_OFFSET\n_CUSTOM_META(DRM_IOCTL_I915_GEM_MMAP_OFFSET, DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP_GTT, struct drm_i915_gem_mmap_offset))\n#endif\n_BASIC_META(DRM_IOCTL_I915_GEM_SET_DOMAIN)\n_BASIC_META(DRM_IOCTL_I915_GEM_SW_FINISH)\n_BASIC_META(DRM_IOCTL_I915_GEM_SET_TILING)\n_BASIC_META(DRM_IOCTL_I915_GEM_GET_TILING)\n_BASIC_META(DRM_IOCTL_I915_GEM_GET_APERTURE)\n_BASIC_META(DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID)\n_BASIC_META(DRM_IOCTL_I915_GEM_MADVISE)\n_BASIC_META(DRM_IOCTL_I915_OVERLAY_PUT_IMAGE)\n_BASIC_META(DRM_IOCTL_I915_OVERLAY_ATTRS)\n_BASIC_META(DRM_IOCTL_I915_SET_SPRITE_COLORKEY)\n_BASIC_META(DRM_IOCTL_I915_GET_SPRITE_COLORKEY)\n_BASIC_META(DRM_IOCTL_I915_GEM_WAIT)\n_BASIC_META(DRM_IOCTL_I915_GEM_CONTEXT_CREATE)\n// DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT overlaps DRM_IOCTL_I915_GEM_CONTEXT_CREATE\n_CUSTOM_META(DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_CREATE, struct drm_i915_gem_context_create_ext))\n_BASIC_META(DRM_IOCTL_I915_GEM_CONTEXT_DESTROY)\n_BASIC_META(DRM_IOCTL_I915_REG_READ)\n_BASIC_META(DRM_IOCTL_I915_GET_RESET_STATS)\n_BASIC_META(DRM_IOCTL_I915_GEM_USERPTR)\n_BASIC_META(DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM)\n_BASIC_META(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM)\n_BASIC_META(DRM_IOCTL_I915_PERF_OPEN)\n_BASIC_META(DRM_IOCTL_I915_PERF_ADD_CONFIG)\n_BASIC_META(DRM_IOCTL_I915_PERF_REMOVE_CONFIG)\n_BASIC_META(DRM_IOCTL_I915_QUERY)\n_BASIC_META(DRM_IOCTL_I915_GEM_VM_CREATE)\n_BASIC_META(DRM_IOCTL_I915_GEM_VM_DESTROY)\n\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/input.h",
    "content": "// SPDX-License-Identifier: MIT\n#include \"LinuxSyscalls/x32/Types.h\"\n#include \"LinuxSyscalls/x32/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <linux/input.h>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x32 {\nnamespace input {\n#include \"LinuxSyscalls/x32/Ioctl/input.inl\"\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/input.inl",
    "content": "_BASIC_META(EVIOCGVERSION)\n_BASIC_META(EVIOCGID)\n_BASIC_META(EVIOCGREP)\n_BASIC_META(EVIOCSREP)\n_BASIC_META(EVIOCGKEYCODE)\n_BASIC_META(EVIOCGKEYCODE_V2)\n_BASIC_META(EVIOCSKEYCODE)\n_BASIC_META(EVIOCSKEYCODE_V2)\n_BASIC_META_VAR(EVIOCGNAME, 0)\n_BASIC_META_VAR(EVIOCGPHYS, 0)\n_BASIC_META_VAR(EVIOCGUNIQ, 0)\n_BASIC_META_VAR(EVIOCGPROP, 0)\n_BASIC_META_VAR(EVIOCGMTSLOTS, 0)\n_BASIC_META_VAR(EVIOCGKEY, 0)\n_BASIC_META_VAR(EVIOCGLED, 0)\n_BASIC_META_VAR(EVIOCGSND, 0)\n_BASIC_META_VAR(EVIOCGSW, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x00, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x01, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x02, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x03, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x04, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x05, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x06, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x07, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x08, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x09, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x0A, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x0B, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x0C, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x0D, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x0E, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x0F, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x10, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x11, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x12, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x13, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x14, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x15, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x16, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x17, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x18, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x19, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x1A, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x1B, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x1C, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x1D, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x1E, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x1F, 0)\n_BASIC_META_VAR(EVIOCGABS, 0x00)\n_BASIC_META_VAR(EVIOCGABS, 0x01)\n_BASIC_META_VAR(EVIOCGABS, 0x02)\n_BASIC_META_VAR(EVIOCGABS, 0x03)\n_BASIC_META_VAR(EVIOCGABS, 0x04)\n_BASIC_META_VAR(EVIOCGABS, 0x05)\n_BASIC_META_VAR(EVIOCGABS, 0x06)\n_BASIC_META_VAR(EVIOCGABS, 0x07)\n_BASIC_META_VAR(EVIOCGABS, 0x08)\n_BASIC_META_VAR(EVIOCGABS, 0x09)\n_BASIC_META_VAR(EVIOCGABS, 0x0A)\n_BASIC_META_VAR(EVIOCGABS, 0x0B)\n_BASIC_META_VAR(EVIOCGABS, 0x0C)\n_BASIC_META_VAR(EVIOCGABS, 0x0D)\n_BASIC_META_VAR(EVIOCGABS, 0x0E)\n_BASIC_META_VAR(EVIOCGABS, 0x0F)\n_BASIC_META_VAR(EVIOCGABS, 0x10)\n_BASIC_META_VAR(EVIOCGABS, 0x11)\n_BASIC_META_VAR(EVIOCGABS, 0x12)\n_BASIC_META_VAR(EVIOCGABS, 0x13)\n_BASIC_META_VAR(EVIOCGABS, 0x14)\n_BASIC_META_VAR(EVIOCGABS, 0x15)\n_BASIC_META_VAR(EVIOCGABS, 0x16)\n_BASIC_META_VAR(EVIOCGABS, 0x17)\n_BASIC_META_VAR(EVIOCGABS, 0x18)\n_BASIC_META_VAR(EVIOCGABS, 0x19)\n_BASIC_META_VAR(EVIOCGABS, 0x1A)\n_BASIC_META_VAR(EVIOCGABS, 0x1B)\n_BASIC_META_VAR(EVIOCGABS, 0x1C)\n_BASIC_META_VAR(EVIOCGABS, 0x1D)\n_BASIC_META_VAR(EVIOCGABS, 0x1E)\n_BASIC_META_VAR(EVIOCGABS, 0x1F)\n_BASIC_META_VAR(EVIOCGABS, 0x20)\n_BASIC_META_VAR(EVIOCGABS, 0x21)\n_BASIC_META_VAR(EVIOCGABS, 0x22)\n_BASIC_META_VAR(EVIOCGABS, 0x23)\n_BASIC_META_VAR(EVIOCGABS, 0x24)\n_BASIC_META_VAR(EVIOCGABS, 0x25)\n_BASIC_META_VAR(EVIOCGABS, 0x26)\n_BASIC_META_VAR(EVIOCGABS, 0x27)\n_BASIC_META_VAR(EVIOCGABS, 0x28)\n_BASIC_META_VAR(EVIOCGABS, 0x29)\n_BASIC_META_VAR(EVIOCGABS, 0x2A)\n_BASIC_META_VAR(EVIOCGABS, 0x2B)\n_BASIC_META_VAR(EVIOCGABS, 0x2C)\n_BASIC_META_VAR(EVIOCGABS, 0x2D)\n_BASIC_META_VAR(EVIOCGABS, 0x2E)\n_BASIC_META_VAR(EVIOCGABS, 0x2F)\n_BASIC_META_VAR(EVIOCSABS, 0x00)\n_BASIC_META_VAR(EVIOCSABS, 0x01)\n_BASIC_META_VAR(EVIOCSABS, 0x02)\n_BASIC_META_VAR(EVIOCSABS, 0x03)\n_BASIC_META_VAR(EVIOCSABS, 0x04)\n_BASIC_META_VAR(EVIOCSABS, 0x05)\n_BASIC_META_VAR(EVIOCSABS, 0x06)\n_BASIC_META_VAR(EVIOCSABS, 0x07)\n_BASIC_META_VAR(EVIOCSABS, 0x08)\n_BASIC_META_VAR(EVIOCSABS, 0x09)\n_BASIC_META_VAR(EVIOCSABS, 0x0A)\n_BASIC_META_VAR(EVIOCSABS, 0x0B)\n_BASIC_META_VAR(EVIOCSABS, 0x0C)\n_BASIC_META_VAR(EVIOCSABS, 0x0D)\n_BASIC_META_VAR(EVIOCSABS, 0x0E)\n_BASIC_META_VAR(EVIOCSABS, 0x0F)\n_BASIC_META_VAR(EVIOCSABS, 0x10)\n_BASIC_META_VAR(EVIOCSABS, 0x11)\n_BASIC_META_VAR(EVIOCSABS, 0x12)\n_BASIC_META_VAR(EVIOCSABS, 0x13)\n_BASIC_META_VAR(EVIOCSABS, 0x14)\n_BASIC_META_VAR(EVIOCSABS, 0x15)\n_BASIC_META_VAR(EVIOCSABS, 0x16)\n_BASIC_META_VAR(EVIOCSABS, 0x17)\n_BASIC_META_VAR(EVIOCSABS, 0x18)\n_BASIC_META_VAR(EVIOCSABS, 0x19)\n_BASIC_META_VAR(EVIOCSABS, 0x1A)\n_BASIC_META_VAR(EVIOCSABS, 0x1B)\n_BASIC_META_VAR(EVIOCSABS, 0x1C)\n_BASIC_META_VAR(EVIOCSABS, 0x1D)\n_BASIC_META_VAR(EVIOCSABS, 0x1E)\n_BASIC_META_VAR(EVIOCSABS, 0x1F)\n_BASIC_META_VAR(EVIOCSABS, 0x20)\n_BASIC_META_VAR(EVIOCSABS, 0x21)\n_BASIC_META_VAR(EVIOCSABS, 0x22)\n_BASIC_META_VAR(EVIOCSABS, 0x23)\n_BASIC_META_VAR(EVIOCSABS, 0x24)\n_BASIC_META_VAR(EVIOCSABS, 0x25)\n_BASIC_META_VAR(EVIOCSABS, 0x26)\n_BASIC_META_VAR(EVIOCSABS, 0x27)\n_BASIC_META_VAR(EVIOCSABS, 0x28)\n_BASIC_META_VAR(EVIOCSABS, 0x29)\n_BASIC_META_VAR(EVIOCSABS, 0x2A)\n_BASIC_META_VAR(EVIOCSABS, 0x2B)\n_BASIC_META_VAR(EVIOCSABS, 0x2C)\n_BASIC_META_VAR(EVIOCSABS, 0x2D)\n_BASIC_META_VAR(EVIOCSABS, 0x2E)\n_BASIC_META_VAR(EVIOCSABS, 0x2F)\n// XXX: _BASIC_META(EVIOCSFF)\n_BASIC_META(EVIOCRMFF)\n_BASIC_META(EVIOCGEFFECTS)\n_BASIC_META(EVIOCGRAB)\n_BASIC_META(EVIOCREVOKE)\n_BASIC_META(EVIOCGMASK)\n_BASIC_META(EVIOCSMASK)\n_BASIC_META(EVIOCSCLOCKID)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/joystick.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"LinuxSyscalls/x32/Types.h\"\n#include \"LinuxSyscalls/x32/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <linux/joystick.h>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x32 {\n\nnamespace joystick {\n#include \"LinuxSyscalls/x32/Ioctl/joystick.inl\"\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/joystick.inl",
    "content": "_BASIC_META(JSIOCGVERSION)\n_BASIC_META(JSIOCGAXES)\n_BASIC_META(JSIOCGBUTTONS)\n_BASIC_META_VAR(JSIOCGNAME, 0)\n_BASIC_META(JSIOCSCORR)\n_BASIC_META(JSIOCGCORR)\n_BASIC_META(JSIOCSAXMAP)\n_BASIC_META(JSIOCGAXMAP)\n_BASIC_META(JSIOCSBTNMAP)\n_BASIC_META(JSIOCGBTNMAP)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/lima_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_LIMA_GET_PARAM)\n_BASIC_META(DRM_IOCTL_LIMA_GEM_CREATE)\n_BASIC_META(DRM_IOCTL_LIMA_GEM_INFO)\n_BASIC_META(DRM_IOCTL_LIMA_GEM_SUBMIT)\n_BASIC_META(DRM_IOCTL_LIMA_GEM_WAIT)\n_BASIC_META(DRM_IOCTL_LIMA_CTX_CREATE)\n_BASIC_META(DRM_IOCTL_LIMA_CTX_FREE)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/msdos_fs.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"LinuxSyscalls/x32/Types.h\"\n#include \"LinuxSyscalls/x32/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <linux/msdos_fs.h>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x32 {\n\nnamespace msdos_fs {\n#include \"LinuxSyscalls/x32/Ioctl/msdos_fs.inl\"\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/msdos_fs.inl",
    "content": "_BASIC_META(VFAT_IOCTL_READDIR_BOTH)\n_BASIC_META(VFAT_IOCTL_READDIR_SHORT)\n_BASIC_META(FAT_IOCTL_GET_ATTRIBUTES)\n_BASIC_META(FAT_IOCTL_SET_ATTRIBUTES)\n_BASIC_META(FAT_IOCTL_GET_VOLUME_ID)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/msm_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_MSM_GET_PARAM)\n_BASIC_META(DRM_IOCTL_MSM_SET_PARAM)\n_BASIC_META(DRM_IOCTL_MSM_GEM_NEW)\n_BASIC_META(DRM_IOCTL_MSM_GEM_INFO)\n_BASIC_META(DRM_IOCTL_MSM_GEM_CPU_PREP)\n_BASIC_META(DRM_IOCTL_MSM_GEM_CPU_FINI)\n_BASIC_META(DRM_IOCTL_MSM_GEM_SUBMIT)\n_CUSTOM_META(DRM_IOCTL_MSM_WAIT_FENCE, DRM_IOW (DRM_COMMAND_BASE + DRM_MSM_WAIT_FENCE, FEX::HLE::x32::MSM::fex_drm_msm_wait_fence))\n_BASIC_META(DRM_IOCTL_MSM_GEM_MADVISE)\n_BASIC_META(DRM_IOCTL_MSM_SUBMITQUEUE_NEW)\n_BASIC_META(DRM_IOCTL_MSM_SUBMITQUEUE_CLOSE)\n_BASIC_META(DRM_IOCTL_MSM_SUBMITQUEUE_QUERY)\n_BASIC_META(DRM_IOCTL_MSM_VM_BIND)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/nouveau_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_NOUVEAU_GETPARAM)\n_BASIC_META(DRM_IOCTL_NOUVEAU_CHANNEL_ALLOC)\n_BASIC_META(DRM_IOCTL_NOUVEAU_CHANNEL_FREE)\n_BASIC_META(DRM_IOCTL_NOUVEAU_SVM_INIT)\n_BASIC_META(DRM_IOCTL_NOUVEAU_SVM_BIND)\n_BASIC_META(DRM_IOCTL_NOUVEAU_GEM_NEW)\n_BASIC_META(DRM_IOCTL_NOUVEAU_GEM_PUSHBUF)\n_BASIC_META(DRM_IOCTL_NOUVEAU_GEM_CPU_PREP)\n_BASIC_META(DRM_IOCTL_NOUVEAU_GEM_CPU_FINI)\n_BASIC_META(DRM_IOCTL_NOUVEAU_GEM_INFO)\n_BASIC_META(DRM_IOCTL_NOUVEAU_VM_INIT)\n_BASIC_META(DRM_IOCTL_NOUVEAU_VM_BIND)\n_BASIC_META(DRM_IOCTL_NOUVEAU_EXEC)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/nova_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_NOVA_GETPARAM)\n_BASIC_META(DRM_IOCTL_NOVA_GEM_CREATE)\n_BASIC_META(DRM_IOCTL_NOVA_GEM_INFO)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/panfrost_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_PANFROST_SUBMIT)\n_BASIC_META(DRM_IOCTL_PANFROST_WAIT_BO)\n_BASIC_META(DRM_IOCTL_PANFROST_CREATE_BO)\n_BASIC_META(DRM_IOCTL_PANFROST_MMAP_BO)\n_BASIC_META(DRM_IOCTL_PANFROST_GET_PARAM)\n_BASIC_META(DRM_IOCTL_PANFROST_GET_BO_OFFSET)\n_BASIC_META(DRM_IOCTL_PANFROST_MADVISE)\n_BASIC_META(DRM_IOCTL_PANFROST_PERFCNT_ENABLE)\n_BASIC_META(DRM_IOCTL_PANFROST_PERFCNT_DUMP)\n_BASIC_META(DRM_IOCTL_PANFROST_SET_LABEL_BO)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/panthor_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_PANTHOR_DEV_QUERY)\n_BASIC_META(DRM_IOCTL_PANTHOR_VM_CREATE)\n_BASIC_META(DRM_IOCTL_PANTHOR_VM_DESTROY)\n_BASIC_META(DRM_IOCTL_PANTHOR_VM_BIND)\n_BASIC_META(DRM_IOCTL_PANTHOR_VM_GET_STATE)\n_BASIC_META(DRM_IOCTL_PANTHOR_BO_CREATE)\n_BASIC_META(DRM_IOCTL_PANTHOR_BO_MMAP_OFFSET)\n_BASIC_META(DRM_IOCTL_PANTHOR_GROUP_CREATE)\n_BASIC_META(DRM_IOCTL_PANTHOR_GROUP_DESTROY)\n_BASIC_META(DRM_IOCTL_PANTHOR_GROUP_SUBMIT)\n_BASIC_META(DRM_IOCTL_PANTHOR_GROUP_GET_STATE)\n_BASIC_META(DRM_IOCTL_PANTHOR_TILER_HEAP_CREATE)\n_BASIC_META(DRM_IOCTL_PANTHOR_TILER_HEAP_DESTROY)\n_BASIC_META(DRM_IOCTL_PANTHOR_BO_SET_LABEL)\n_BASIC_META(DRM_IOCTL_PANTHOR_SET_USER_MMIO_OFFSET)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/pvr_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_PVR_DEV_QUERY)\n_BASIC_META(DRM_IOCTL_PVR_CREATE_BO)\n_BASIC_META(DRM_IOCTL_PVR_GET_BO_MMAP_OFFSET)\n_BASIC_META(DRM_IOCTL_PVR_CREATE_VM_CONTEXT)\n_BASIC_META(DRM_IOCTL_PVR_DESTROY_VM_CONTEXT)\n_BASIC_META(DRM_IOCTL_PVR_VM_MAP)\n_BASIC_META(DRM_IOCTL_PVR_VM_UNMAP)\n_BASIC_META(DRM_IOCTL_PVR_CREATE_CONTEXT)\n_BASIC_META(DRM_IOCTL_PVR_DESTROY_CONTEXT)\n_BASIC_META(DRM_IOCTL_PVR_CREATE_FREE_LIST)\n_BASIC_META(DRM_IOCTL_PVR_DESTROY_FREE_LIST)\n_BASIC_META(DRM_IOCTL_PVR_CREATE_HWRT_DATASET)\n_BASIC_META(DRM_IOCTL_PVR_DESTROY_HWRT_DATASET)\n_BASIC_META(DRM_IOCTL_PVR_SUBMIT_JOBS)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/radeon_drm.inl",
    "content": "_CUSTOM_META(DRM_IOCTL_RADEON_CP_INIT, DRM_IOW(DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, FEX::HLE::x32::RADEON::fex_drm_radeon_init_t))\n_BASIC_META(DRM_IOCTL_RADEON_CP_START)\n_BASIC_META(DRM_IOCTL_RADEON_CP_STOP)\n_BASIC_META(DRM_IOCTL_RADEON_CP_RESET)\n_BASIC_META(DRM_IOCTL_RADEON_CP_IDLE)\n_BASIC_META(DRM_IOCTL_RADEON_RESET)\n_BASIC_META(DRM_IOCTL_RADEON_FULLSCREEN)\n_BASIC_META(DRM_IOCTL_RADEON_SWAP)\n_CUSTOM_META(DRM_IOCTL_RADEON_CLEAR, DRM_IOW(DRM_COMMAND_BASE + DRM_RADEON_CLEAR, FEX::HLE::x32::RADEON::fex_drm_radeon_clear_t))\n_BASIC_META(DRM_IOCTL_RADEON_VERTEX)\n_BASIC_META(DRM_IOCTL_RADEON_INDICES)\n_CUSTOM_META(DRM_IOCTL_RADEON_STIPPLE, DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_STIPPLE, FEX::HLE::x32::RADEON::fex_drm_radeon_stipple_t))\n_BASIC_META(DRM_IOCTL_RADEON_INDIRECT)\n_CUSTOM_META(DRM_IOCTL_RADEON_TEXTURE, DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_TEXTURE, FEX::HLE::x32::RADEON::fex_drm_radeon_texture_t))\n_CUSTOM_META(DRM_IOCTL_RADEON_VERTEX2, DRM_IOW(DRM_COMMAND_BASE + DRM_RADEON_VERTEX2, FEX::HLE::x32::RADEON::fex_drm_radeon_vertex2_t))\n_CUSTOM_META(DRM_IOCTL_RADEON_CMDBUF, DRM_IOW(DRM_COMMAND_BASE + DRM_RADEON_CMDBUF, FEX::HLE::x32::RADEON::fex_drm_radeon_cmd_buffer_t))\n_CUSTOM_META(DRM_IOCTL_RADEON_GETPARAM, DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GETPARAM, FEX::HLE::x32::RADEON::fex_drm_radeon_getparam_t))\n_BASIC_META(DRM_IOCTL_RADEON_FLIP)\n_CUSTOM_META(DRM_IOCTL_RADEON_ALLOC, DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_ALLOC, FEX::HLE::x32::RADEON::fex_drm_radeon_mem_alloc_t))\n_BASIC_META(DRM_IOCTL_RADEON_FREE)\n_BASIC_META(DRM_IOCTL_RADEON_INIT_HEAP)\n_CUSTOM_META(DRM_IOCTL_RADEON_IRQ_EMIT, DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_IRQ_EMIT, FEX::HLE::x32::RADEON::fex_drm_radeon_irq_emit_t))\n_BASIC_META(DRM_IOCTL_RADEON_IRQ_WAIT)\n_BASIC_META(DRM_IOCTL_RADEON_CP_RESUME)\n_CUSTOM_META(DRM_IOCTL_RADEON_SETPARAM, DRM_IOW(DRM_COMMAND_BASE + DRM_RADEON_SETPARAM, FEX::HLE::x32::RADEON::fex_drm_radeon_setparam_t))\n_BASIC_META(DRM_IOCTL_RADEON_SURF_ALLOC)\n_BASIC_META(DRM_IOCTL_RADEON_SURF_FREE)\n\n_BASIC_META(DRM_IOCTL_RADEON_GEM_INFO)\n_CUSTOM_META(DRM_IOCTL_RADEON_GEM_CREATE, DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_CREATE, FEX::HLE::x32::RADEON::fex_drm_radeon_gem_create))\n_BASIC_META(DRM_IOCTL_RADEON_GEM_MMAP)\n_BASIC_META(DRM_IOCTL_RADEON_GEM_PREAD)\n_BASIC_META(DRM_IOCTL_RADEON_GEM_PWRITE)\n_BASIC_META(DRM_IOCTL_RADEON_GEM_SET_DOMAIN)\n_BASIC_META(DRM_IOCTL_RADEON_GEM_WAIT_IDLE)\n_BASIC_META(DRM_IOCTL_RADEON_CS)\n_BASIC_META(DRM_IOCTL_RADEON_INFO)\n_BASIC_META(DRM_IOCTL_RADEON_GEM_SET_TILING)\n_BASIC_META(DRM_IOCTL_RADEON_GEM_GET_TILING)\n_BASIC_META(DRM_IOCTL_RADEON_GEM_BUSY)\n_BASIC_META(DRM_IOCTL_RADEON_GEM_VA)\n_BASIC_META(DRM_IOCTL_RADEON_GEM_OP)\n_BASIC_META(DRM_IOCTL_RADEON_GEM_USERPTR)\n\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/sockios.h",
    "content": "// SPDX-License-Identifier: MIT\n#include \"LinuxSyscalls/x32/Types.h\"\n#include \"LinuxSyscalls/x32/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <linux/sockios.h>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x32 {\nnamespace sockios {\n#ifndef SIOCGSKNS\n#define SIOCGSKNS 0x894C\n#endif\n#include \"LinuxSyscalls/x32/Ioctl/sockios.inl\"\n} // namespace sockios\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/sockios.inl",
    "content": "#ifndef SIOCGSTAMP_OLD\n#define SIOCGSTAMP_OLD 0x8906\n#endif\n_BASIC_META(SIOCGSTAMP_OLD)\n#ifndef SIOCGSTAMPNS_OLD\n#define SIOCGSTAMPNS_OLD 0x8907\n#endif\n_BASIC_META(SIOCGSTAMPNS_OLD)\n_BASIC_META(SIOCADDRT)\n_BASIC_META(SIOCDELRT)\n_BASIC_META(SIOCRTMSG)\n_BASIC_META(SIOCGIFNAME)\n_BASIC_META(SIOCSIFLINK)\n_BASIC_META(SIOCGIFCONF)\n_BASIC_META(SIOCGIFFLAGS)\n_BASIC_META(SIOCSIFFLAGS)\n_BASIC_META(SIOCGIFADDR)\n_BASIC_META(SIOCSIFADDR)\n_BASIC_META(SIOCGIFDSTADDR)\n_BASIC_META(SIOCSIFDSTADDR)\n_BASIC_META(SIOCGIFBRDADDR)\n_BASIC_META(SIOCSIFBRDADDR)\n_BASIC_META(SIOCGIFNETMASK)\n_BASIC_META(SIOCSIFNETMASK)\n_BASIC_META(SIOCGIFMETRIC)\n_BASIC_META(SIOCSIFMETRIC)\n_BASIC_META(SIOCGIFMEM)\n_BASIC_META(SIOCSIFMEM)\n_BASIC_META(SIOCGIFMTU)\n_BASIC_META(SIOCSIFMTU)\n_BASIC_META(SIOCSIFNAME)\n_BASIC_META(SIOCSIFHWADDR)\n_BASIC_META(SIOCGIFENCAP)\n_BASIC_META(SIOCSIFENCAP)\n_BASIC_META(SIOCGIFHWADDR)\n_BASIC_META(SIOCGIFSLAVE)\n_BASIC_META(SIOCSIFSLAVE)\n_BASIC_META(SIOCADDMULTI)\n_BASIC_META(SIOCDELMULTI)\n_BASIC_META(SIOCGIFINDEX)\n_BASIC_META(SIOCSIFPFLAGS)\n_BASIC_META(SIOCGIFPFLAGS)\n_BASIC_META(SIOCDIFADDR)\n_BASIC_META(SIOCSIFHWBROADCAST)\n_BASIC_META(SIOCGIFCOUNT)\n_BASIC_META(SIOCGIFBR)\n_BASIC_META(SIOCSIFBR)\n_BASIC_META(SIOCGIFTXQLEN)\n_BASIC_META(SIOCSIFTXQLEN)\n_BASIC_META(SIOCETHTOOL)\n_BASIC_META(SIOCGMIIPHY)\n_BASIC_META(SIOCGMIIREG)\n_BASIC_META(SIOCSMIIREG)\n_BASIC_META(SIOCWANDEV)\n_BASIC_META(SIOCOUTQNSD)\n_BASIC_META(SIOCGSKNS)\n_BASIC_META(SIOCDARP)\n_BASIC_META(SIOCGARP)\n_BASIC_META(SIOCSARP)\n_BASIC_META(SIOCDRARP)\n_BASIC_META(SIOCGRARP)\n_BASIC_META(SIOCSRARP)\n_BASIC_META(SIOCGIFMAP)\n_BASIC_META(SIOCSIFMAP)\n_BASIC_META(SIOCADDDLCI)\n_BASIC_META(SIOCDELDLCI)\n_BASIC_META(SIOCGIFVLAN)\n_BASIC_META(SIOCSIFVLAN)\n_BASIC_META(SIOCBONDENSLAVE)\n_BASIC_META(SIOCBONDRELEASE)\n_BASIC_META(SIOCBONDSETHWADDR)\n_BASIC_META(SIOCBONDSLAVEINFOQUERY)\n_BASIC_META(SIOCBONDINFOQUERY)\n_BASIC_META(SIOCBONDCHANGEACTIVE)\n_BASIC_META(SIOCBRADDBR)\n_BASIC_META(SIOCBRDELBR)\n_BASIC_META(SIOCBRADDIF)\n_BASIC_META(SIOCBRDELIF)\n_BASIC_META(SIOCSHWTSTAMP)\n_BASIC_META(SIOCGHWTSTAMP)\n\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE,   SIOCDEVPRIVATE, 0x0)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_1, SIOCDEVPRIVATE, 0x1)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_2, SIOCDEVPRIVATE, 0x2)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_3, SIOCDEVPRIVATE, 0x3)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_4, SIOCDEVPRIVATE, 0x4)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_5, SIOCDEVPRIVATE, 0x5)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_6, SIOCDEVPRIVATE, 0x6)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_7, SIOCDEVPRIVATE, 0x7)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_8, SIOCDEVPRIVATE, 0x8)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_9, SIOCDEVPRIVATE, 0x9)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_A, SIOCDEVPRIVATE, 0xA)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_B, SIOCDEVPRIVATE, 0xB)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_C, SIOCDEVPRIVATE, 0xC)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_D, SIOCDEVPRIVATE, 0xD)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_E, SIOCDEVPRIVATE, 0xE)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_F, SIOCDEVPRIVATE, 0xF)\n\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE,   SIOCPROTOPRIVATE, 0x0)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_1, SIOCPROTOPRIVATE, 0x1)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_2, SIOCPROTOPRIVATE, 0x2)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_3, SIOCPROTOPRIVATE, 0x3)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_4, SIOCPROTOPRIVATE, 0x4)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_5, SIOCPROTOPRIVATE, 0x5)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_6, SIOCPROTOPRIVATE, 0x6)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_7, SIOCPROTOPRIVATE, 0x7)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_8, SIOCPROTOPRIVATE, 0x8)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_9, SIOCPROTOPRIVATE, 0x9)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_A, SIOCPROTOPRIVATE, 0xA)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_B, SIOCPROTOPRIVATE, 0xB)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_C, SIOCPROTOPRIVATE, 0xC)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_D, SIOCPROTOPRIVATE, 0xD)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_E, SIOCPROTOPRIVATE, 0xE)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_F, SIOCPROTOPRIVATE, 0xF)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/streams.h",
    "content": "// SPDX-License-Identifier: MIT\n#include \"LinuxSyscalls/x32/Types.h\"\n#include \"LinuxSyscalls/x32/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x32 {\nnamespace streams {\n#ifndef TIOCGPTPEER\n#define TIOCGPTPEER _IO('T', 0x41)\n#endif\n#include \"LinuxSyscalls/x32/Ioctl/streams.inl\"\n} // namespace streams\n\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/streams.inl",
    "content": "_BASIC_META(TCGETS)\n_BASIC_META(TCSETS)\n_BASIC_META(TCSETSW)\n_BASIC_META(TCSETSF)\n_BASIC_META(TCGETA)\n_BASIC_META(TCSETA)\n_BASIC_META(TCSETAW)\n_BASIC_META(TCSETAF)\n_BASIC_META(TCSBRK)\n_BASIC_META(TCXONC)\n_BASIC_META(TCFLSH)\n_BASIC_META(TIOCEXCL)\n_BASIC_META(TIOCNXCL)\n_BASIC_META(TIOCSCTTY)\n_BASIC_META(TIOCGPGRP)\n_BASIC_META(TIOCSPGRP)\n_BASIC_META(TIOCOUTQ)\n_BASIC_META(TIOCSTI)\n_BASIC_META(TIOCGWINSZ)\n_BASIC_META(TIOCSWINSZ)\n_BASIC_META(TIOCMGET)\n_BASIC_META(TIOCMBIS)\n_BASIC_META(TIOCMBIC)\n_BASIC_META(TIOCMSET)\n_BASIC_META(TIOCGSOFTCAR)\n_BASIC_META(TIOCSSOFTCAR)\n_BASIC_META(TIOCINQ)\n_BASIC_META(TIOCLINUX)\n_BASIC_META(TIOCCONS)\n_BASIC_META(TIOCGSERIAL)\n_BASIC_META(TIOCSSERIAL)\n_BASIC_META(TIOCPKT)\n_BASIC_META(FIONBIO)\n_BASIC_META(TIOCNOTTY)\n_BASIC_META(TIOCSETD)\n_BASIC_META(TIOCGETD)\n_BASIC_META(TCSBRKP)\n_BASIC_META(TIOCSBRK)\n_BASIC_META(TIOCCBRK)\n_BASIC_META(TIOCGSID)\n//_BASIC_META(TCGETS2)\n//_BASIC_META(TCSETS2)\n//_BASIC_META(TCSETSW2)\n//_BASIC_META(TCSETSF2)\n_BASIC_META(TIOCGRS485)\n_BASIC_META(TIOCGRS485)\n_BASIC_META(TIOCGPTN)\n_BASIC_META(TIOCSPTLCK)\n_BASIC_META(TIOCGDEV)\n_BASIC_META(TCGETX)\n_BASIC_META(TCSETX)\n_BASIC_META(TCSETXF)\n_BASIC_META(TCSETXW)\n_BASIC_META(TIOCSIG)\n_BASIC_META(TIOCVHANGUP)\n_BASIC_META(TIOCGPKT)\n_BASIC_META(TIOCGPTLCK)\n_BASIC_META(TIOCGEXCL)\n_BASIC_META(TIOCGPTPEER)\n//_BASIC_META(TIOCGISO7816)\n//_BASIC_META(TIOCSISO7816)\n_BASIC_META(FIONCLEX)\n_BASIC_META(FIONCLEX)\n_BASIC_META(FIOASYNC)\n_BASIC_META(TIOCSERCONFIG)\n_BASIC_META(TIOCSERGWILD)\n_BASIC_META(TIOCSERSWILD)\n_BASIC_META(TIOCGLCKTRMIOS)\n_BASIC_META(TIOCSLCKTRMIOS)\n_BASIC_META(TIOCSERGSTRUCT)\n_BASIC_META(TIOCSERGETLSR)\n_BASIC_META(TIOCSERGETMULTI)\n_BASIC_META(TIOCSERSETMULTI)\n_BASIC_META(TIOCMIWAIT)\n_BASIC_META(TIOCGICOUNT)\n_BASIC_META(FIOQSIZE)\n\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/usbdev.h",
    "content": "// SPDX-License-Identifier: MIT\n#include \"LinuxSyscalls/x32/Types.h\"\n#include \"LinuxSyscalls/x32/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <linux/usbdevice_fs.h>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x32 {\nnamespace usbdev {\n#ifndef USBDEVFS_GET_SPEED\n#define USBDEVFS_GET_SPEED _IO('U', 31)\n#endif\n#ifndef USBDEVFS_CONNINFO_EX\n#define USBDEVFS_CONNINFO_EX(len) _IOC(_IOC_READ, 'U', 32, len)\n#endif\n#ifndef USBDEVFS_FORBID_SUSPEND\n#define USBDEVFS_FORBID_SUSPEND _IO('U', 33)\n#endif\n#ifndef USBDEVFS_ALLOW_SUSPEND\n#define USBDEVFS_ALLOW_SUSPEND _IO('U', 34)\n#endif\n#ifndef USBDEVFS_WAIT_FOR_RESUME\n#define USBDEVFS_WAIT_FOR_RESUME _IO('U', 35)\n#endif\n#include \"LinuxSyscalls/x32/Ioctl/usbdev.inl\"\n} // namespace usbdev\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/usbdev.inl",
    "content": "// XXX: _BASIC_META(USBDEVFS_CONTROL)\n// _BASIC_META(USBDEVFS_CONTROL32)\n// XXX: _BASIC_META(USBDEVFS_BULK)\n// _BASIC_META(USBDEVFS_BULK32)\n_BASIC_META(USBDEVFS_RESETEP)\n_BASIC_META(USBDEVFS_SETINTERFACE)\n_BASIC_META(USBDEVFS_SETCONFIGURATION)\n_BASIC_META(USBDEVFS_GETDRIVER)\n// XXX: _BASIC_META(USBDEVFS_SUBMITURB)\n// _BASIC_META(USBDEVFS_SUBMITURB32)\n_BASIC_META(USBDEVFS_DISCARDURB)\n// XXX: _BASIC_META(USBDEVFS_REAPURB)\n// _BASIC_META(USBDEVFS_REAPUSB32)\n// XXX: _BASIC_META(USBDEVFS_REAPURBNDELAY)\n_BASIC_META(USBDEVFS_REAPURBNDELAY32)\n// XXX: _BASIC_META(USBDEVFS_DISCSIGNAL)\n// _BASIC_META(USBDEVFS_DISCSIGNAL32)\n_BASIC_META(USBDEVFS_CLAIMINTERFACE)\n_BASIC_META(USBDEVFS_RELEASEINTERFACE)\n_BASIC_META(USBDEVFS_CONNECTINFO)\n// XXX: _BASIC_META(USBDEVFS_IOCTL)\n//_BASIC_META(USBDEVFS_IOCTL32)\n_BASIC_META(USBDEVFS_HUB_PORTINFO)\n_BASIC_META(USBDEVFS_RESET)\n_BASIC_META(USBDEVFS_CLEAR_HALT)\n_BASIC_META(USBDEVFS_RELEASE_PORT)\n_BASIC_META(USBDEVFS_GET_CAPABILITIES)\n_BASIC_META(USBDEVFS_DISCONNECT_CLAIM)\n_BASIC_META(USBDEVFS_ALLOC_STREAMS)\n_BASIC_META(USBDEVFS_FREE_STREAMS)\n_BASIC_META(USBDEVFS_DROP_PRIVILEGES)\n_BASIC_META(USBDEVFS_GET_SPEED)\n_BASIC_META_VAR(USBDEVFS_CONNINFO_EX, 0)\n_BASIC_META(USBDEVFS_FORBID_SUSPEND)\n_BASIC_META(USBDEVFS_ALLOW_SUSPEND)\n_BASIC_META(USBDEVFS_WAIT_FOR_RESUME)\n\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/v3d_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_V3D_SUBMIT_CL)\n_BASIC_META(DRM_IOCTL_V3D_WAIT_BO)\n_BASIC_META(DRM_IOCTL_V3D_CREATE_BO)\n_BASIC_META(DRM_IOCTL_V3D_MMAP_BO)\n_BASIC_META(DRM_IOCTL_V3D_GET_PARAM)\n_BASIC_META(DRM_IOCTL_V3D_GET_BO_OFFSET)\n_BASIC_META(DRM_IOCTL_V3D_SUBMIT_TFU)\n_CUSTOM_META(DRM_IOCTL_V3D_SUBMIT_CSD, DRM_IOW(DRM_COMMAND_BASE + DRM_V3D_SUBMIT_CSD, FEX::HLE::x32::V3D::fex_drm_v3d_submit_csd)) // XXX: This will still be incorrect on x86-64\n_BASIC_META(DRM_IOCTL_V3D_PERFMON_CREATE)\n_BASIC_META(DRM_IOCTL_V3D_PERFMON_DESTROY)\n_BASIC_META(DRM_IOCTL_V3D_PERFMON_GET_VALUES)\n_BASIC_META(DRM_IOCTL_V3D_SUBMIT_CPU)\n_BASIC_META(DRM_IOCTL_V3D_PERFMON_GET_COUNTER)\n_BASIC_META(DRM_IOCTL_V3D_PERFMON_SET_GLOBAL)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/v4l2.h",
    "content": "#include \"LinuxSyscalls/x32/Ioctl/HelperDefines.h\"\n#include \"LinuxSyscalls/x32/Types.h\"\n\n#include <cstdint>\n#include <linux/videodev2.h>\n#include <sys/ioctl.h>\n\n#define CPYT(x) val.x = x\n#define CPYF(x) x = val.x\n\nextern \"C\" {\n// Upstream definitions that changed over time.\nstruct upstream_v4l2_create_buffers {\n  uint32_t index;\n  uint32_t count;\n  uint32_t memory;\n  struct v4l2_format format;\n  uint32_t capabilities;\n  uint32_t flags;\n  uint32_t max_num_buffers;\n  uint32_t reserved[5];\n};\n\nstruct upstream_v4l2_remove_buffers {\n  uint32_t index;\n  uint32_t count;\n  uint32_t type;\n  uint32_t reserved[13];\n};\n}\n\nnamespace FEX::HLE::x32 {\nnamespace V4l2 {\n\n  struct FEX_ANNOTATE(\"alias-x86_32-v4l2_window\") FEX_ANNOTATE(\"fex-match\") fex_v4l2_window {\n    struct v4l2_rect w;\n    uint32_t field;\n    uint32_t chromakey;\n    compat_uptr_t clips;\n    uint32_t clipcount;\n    compat_uptr_t bitmap;\n    uint8_t global_alpha;\n\n    fex_v4l2_window() = default;\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-v4l2_format\") FEX_ANNOTATE(\"fex-match\") fex_v4l2_format {\n    uint32_t type;\n    union {\n      struct v4l2_pix_format pix;\n      struct v4l2_pix_format_mplane pix_mp;\n      // Just a valid place holder for struct verifier.\n      fex_v4l2_window win;\n      struct v4l2_vbi_format vbi;\n      struct v4l2_sliced_vbi_format sliced;\n      struct v4l2_sdr_format sdr;\n      struct v4l2_meta_format meta;\n      __u8 raw_data[200];\n    } fmt;\n\n    fex_v4l2_format() = delete;\n\n    operator v4l2_format() const {\n      v4l2_format val {};\n      CPYT(type);\n\n      switch (type) {\n      case V4L2_BUF_TYPE_VIDEO_CAPTURE: memcpy(&val.fmt, &fmt, sizeof(struct v4l2_pix_format)); break;\n      case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: memcpy(&val.fmt, &fmt, sizeof(struct v4l2_pix_format_mplane)); break;\n      case V4L2_BUF_TYPE_VBI_CAPTURE: memcpy(&val.fmt, &fmt, sizeof(struct v4l2_vbi_format)); break;\n      case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: memcpy(&val.fmt, &fmt, sizeof(struct v4l2_sliced_vbi_format)); break;\n      case V4L2_BUF_TYPE_SDR_CAPTURE: memcpy(&val.fmt, &fmt, sizeof(struct v4l2_sdr_format)); break;\n      case V4L2_BUF_TYPE_META_CAPTURE: memcpy(&val.fmt, &fmt, sizeof(struct v4l2_meta_format)); break;\n      case V4L2_BUF_TYPE_VIDEO_OVERLAY: break;\n      default: memcpy(&val.fmt, &fmt, 200); break;\n      }\n\n      return val;\n    };\n\n    fex_v4l2_format(v4l2_format val) {\n      CPYF(type);\n      switch (type) {\n      case V4L2_BUF_TYPE_VIDEO_CAPTURE: memcpy(&fmt, &val.fmt, sizeof(struct v4l2_pix_format)); break;\n      case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: memcpy(&fmt, &val.fmt, sizeof(struct v4l2_pix_format_mplane)); break;\n      case V4L2_BUF_TYPE_VBI_CAPTURE: memcpy(&fmt, &val.fmt, sizeof(struct v4l2_vbi_format)); break;\n      case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: memcpy(&fmt, &val.fmt, sizeof(struct v4l2_sliced_vbi_format)); break;\n      case V4L2_BUF_TYPE_SDR_CAPTURE: memcpy(&fmt, &val.fmt, sizeof(struct v4l2_sdr_format)); break;\n      case V4L2_BUF_TYPE_META_CAPTURE: memcpy(&fmt, &val.fmt, sizeof(struct v4l2_meta_format)); break;\n      case V4L2_BUF_TYPE_VIDEO_OVERLAY: break;\n      default: memcpy(&fmt, &val.fmt, 200); break;\n      }\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-v4l2_buffer\") FEX_ANNOTATE(\"fex-match\") fex_v4l2_buffer {\n    uint32_t index;\n    uint32_t type;\n    uint32_t bytesused;\n    uint32_t flags;\n    uint32_t field;\n    struct timeval32 timestamp;\n    struct v4l2_timecode timecode;\n    uint32_t sequence;\n    uint32_t memory;\n\n    union {\n      uint32_t offset;\n      compat_ptr<void> userptr;\n      compat_ptr<struct v4l2_plane> planes;\n      int32_t fd;\n    } m;\n    uint32_t length;\n    uint32_t reserved2;\n    union {\n      int32_t request_fd;\n      uint32_t reserved;\n    };\n\n    fex_v4l2_buffer() = delete;\n\n    operator v4l2_buffer() const {\n      v4l2_buffer val {};\n      CPYT(index);\n      CPYT(type);\n      CPYT(bytesused);\n      CPYT(flags);\n      CPYT(field);\n      CPYT(timestamp);\n      CPYT(timecode);\n      CPYT(sequence);\n      CPYT(memory);\n      CPYT(length);\n      CPYT(reserved2);\n      CPYT(m.offset);\n      CPYT(request_fd);\n      return val;\n    }\n\n    fex_v4l2_buffer(v4l2_buffer val)\n      : timestamp {val.timestamp}\n      , m {.offset = val.m.offset} {\n      CPYF(index);\n      CPYF(type);\n      CPYF(bytesused);\n      CPYF(flags);\n      CPYF(field);\n      CPYF(timecode);\n      CPYF(sequence);\n      CPYF(memory);\n      CPYF(length);\n      CPYF(reserved2);\n      CPYF(request_fd);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-v4l2_framebuffer\") FEX_ANNOTATE(\"fex-match\") fex_v4l2_framebuffer {\n    uint32_t capability;\n    uint32_t flags;\n    compat_ptr<void> base;\n    struct {\n      uint32_t width;\n      uint32_t height;\n      uint32_t pixelformat;\n      uint32_t field;\n      uint32_t bytesperline;\n      uint32_t sizeimage;\n      uint32_t colorspace;\n      uint32_t priv;\n    } fmt;\n\n    fex_v4l2_framebuffer() = delete;\n\n    operator v4l2_framebuffer() const {\n      v4l2_framebuffer val {};\n      CPYT(capability);\n      CPYT(flags);\n      CPYT(base);\n      memcpy(&val.fmt, &fmt, sizeof(fmt));\n      return val;\n    }\n\n    fex_v4l2_framebuffer(v4l2_framebuffer val)\n      : base {auto_compat_ptr {val.base}} {\n      CPYF(capability);\n      CPYF(flags);\n      memcpy(&fmt, &val.fmt, sizeof(fmt));\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-v4l2_standard\") FEX_ANNOTATE(\"fex-match\") fex_v4l2_standard {\n    uint32_t index;\n    compat_uint64_t id;\n    uint8_t name[24];\n    struct v4l2_fract frameperiod;\n    uint32_t framelines;\n    uint32_t reserved[4];\n\n    fex_v4l2_standard() = delete;\n\n    operator v4l2_standard() const {\n      v4l2_standard val {};\n      CPYT(index);\n      CPYT(id);\n      memcpy(&val.name, name, sizeof(name));\n      CPYT(frameperiod);\n      CPYT(framelines);\n      memcpy(&val.reserved, reserved, sizeof(uint32_t) * 4);\n      return val;\n    }\n\n    fex_v4l2_standard(v4l2_standard val) {\n      CPYF(index);\n      CPYF(id);\n      memcpy(&name, val.name, sizeof(name));\n      CPYF(frameperiod);\n      CPYF(framelines);\n      memcpy(&reserved, val.reserved, sizeof(uint32_t) * 4);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-v4l2_input\") FEX_ANNOTATE(\"fex-match\") fex_v4l2_input {\n    uint32_t index;\n    uint8_t name[32];\n    uint32_t type;\n    uint32_t audioset;\n    uint32_t tuner;\n    compat_uint64_t std;\n    uint32_t status;\n    uint32_t capabilities;\n    uint32_t reserved[3];\n\n    fex_v4l2_input() = delete;\n\n    operator v4l2_input() const {\n      v4l2_input val {};\n      CPYT(index);\n      memcpy(&val.name, &name, sizeof(name));\n      CPYT(type);\n      CPYT(audioset);\n      CPYT(tuner);\n      CPYT(std);\n      CPYT(status);\n      CPYT(capabilities);\n      memcpy(&val.reserved, &reserved, sizeof(uint32_t) * 3);\n      return val;\n    }\n\n    fex_v4l2_input(v4l2_input val) {\n      CPYF(index);\n      memcpy(&name, &val.name, sizeof(name));\n      CPYF(type);\n      CPYF(audioset);\n      CPYF(tuner);\n      CPYF(std);\n      CPYF(status);\n      CPYF(capabilities);\n      memcpy(&reserved, &val.reserved, sizeof(uint32_t) * 3);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-v4l2_edid\") FEX_ANNOTATE(\"fex-match\") fex_v4l2_edid {\n    uint32_t pad;\n    uint32_t start_block;\n    uint32_t blocks;\n    uint32_t reserved[5];\n    compat_ptr<uint8_t> edid;\n\n    fex_v4l2_edid() = delete;\n\n    operator v4l2_edid() const {\n      v4l2_edid val {};\n      CPYT(pad);\n      CPYT(start_block);\n      CPYT(blocks);\n      memcpy(&val.reserved, &reserved, sizeof(uint32_t) * 5);\n      CPYT(edid);\n      return val;\n    }\n\n    fex_v4l2_edid(v4l2_edid val)\n      : edid {auto_compat_ptr {val.edid}} {\n      CPYF(pad);\n      CPYF(start_block);\n      CPYF(blocks);\n      memcpy(&reserved, &val.reserved, sizeof(uint32_t) * 5);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-v4l2_ext_controls\") FEX_ANNOTATE(\"fex-match\") fex_v4l2_ext_controls {\n    union {\n      uint32_t ctrl_class;\n      uint32_t which;\n    };\n    uint32_t count;\n    uint32_t error_idx;\n    int32_t request_fd;\n    uint32_t reserved[1];\n    compat_ptr<struct v4l2_ext_control> controls;\n\n    fex_v4l2_ext_controls() = delete;\n\n    operator v4l2_ext_controls() const {\n      v4l2_ext_controls val {};\n      CPYT(which);\n      CPYT(count);\n      CPYT(error_idx);\n      CPYT(request_fd);\n      CPYT(reserved[0]);\n      CPYT(controls);\n      return val;\n    }\n\n    fex_v4l2_ext_controls(v4l2_ext_controls val)\n      : controls {auto_compat_ptr {val.controls}} {\n      CPYF(which);\n      CPYF(count);\n      CPYF(error_idx);\n      CPYF(request_fd);\n      CPYF(reserved[0]);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-v4l2_event_ctrl\") FEX_ANNOTATE(\"fex-match\") fex_v4l2_event_ctrl {\n    uint32_t changes;\n    uint32_t type;\n    union {\n      int32_t value;\n      compat_int64_t value64;\n    };\n    uint32_t flags;\n    int32_t minimum;\n    int32_t maximum;\n    int32_t step;\n    int32_t default_value;\n\n    fex_v4l2_event_ctrl() = default;\n\n    operator v4l2_event_ctrl() const {\n      v4l2_event_ctrl val {};\n      CPYT(changes);\n      CPYT(type);\n      CPYT(value64);\n      CPYT(flags);\n      CPYT(minimum);\n      CPYT(maximum);\n      CPYT(step);\n      CPYT(default_value);\n      return val;\n    }\n\n    fex_v4l2_event_ctrl(v4l2_event_ctrl val) {\n      CPYF(changes);\n      CPYF(type);\n      CPYF(value64);\n      CPYF(flags);\n      CPYF(minimum);\n      CPYF(maximum);\n      CPYF(step);\n      CPYF(default_value);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-v4l2_event\") FEX_ANNOTATE(\"fex-match\") fex_v4l2_event {\n    uint32_t type;\n    union {\n      struct v4l2_event_vsync vsync;\n      fex_v4l2_event_ctrl ctrl;\n      struct v4l2_event_frame_sync frame_sync;\n      struct v4l2_event_src_change src_change;\n      struct v4l2_event_motion_det motion_det;\n      uint8_t data[64];\n    } u;\n    uint32_t pending;\n    uint32_t sequence;\n    timespec32 timestamp;\n    uint32_t id;\n    uint32_t reserved[8];\n\n    fex_v4l2_event() = delete;\n\n    operator v4l2_event() const {\n      v4l2_event val {};\n      CPYT(type);\n      switch (type) {\n      case V4L2_EVENT_VSYNC: CPYT(u.vsync); break;\n      case V4L2_EVENT_CTRL: CPYT(u.ctrl); break;\n      case V4L2_EVENT_FRAME_SYNC: CPYT(u.frame_sync); break;\n      case V4L2_EVENT_SOURCE_CHANGE: CPYT(u.src_change); break;\n      case V4L2_EVENT_MOTION_DET: CPYT(u.motion_det); break;\n      default: memcpy(&val.u.data, &u.data, 64); break;\n      }\n      CPYT(pending);\n      CPYT(sequence);\n      CPYT(timestamp);\n      CPYT(id);\n      memcpy(&val.reserved, &reserved, sizeof(uint32_t) * 8);\n      return val;\n    }\n\n    fex_v4l2_event(v4l2_event val) {\n      CPYF(type);\n      switch (type) {\n      case V4L2_EVENT_VSYNC: CPYF(u.vsync); break;\n      case V4L2_EVENT_CTRL: CPYF(u.ctrl); break;\n      case V4L2_EVENT_FRAME_SYNC: CPYF(u.frame_sync); break;\n      case V4L2_EVENT_SOURCE_CHANGE: CPYF(u.src_change); break;\n      case V4L2_EVENT_MOTION_DET: CPYF(u.motion_det); break;\n      default: memcpy(&u.data, &val.u.data, 64); break;\n      }\n      CPYF(pending);\n      CPYF(sequence);\n      CPYF(timestamp);\n      CPYF(id);\n      memcpy(&reserved, &val.reserved, sizeof(uint32_t) * 8);\n    }\n  };\n\n  struct FEX_ANNOTATE(\"alias-x86_32-upstream_v4l2_create_buffers\") FEX_ANNOTATE(\"fex-match\") fex_v4l2_create_buffers {\n    uint32_t index;\n    uint32_t count;\n    uint32_t memory;\n    fex_v4l2_format format;\n    uint32_t capabilities;\n    uint32_t flags;\n    uint32_t max_num_buffers;\n    uint32_t reserved[5];\n\n    fex_v4l2_create_buffers() = delete;\n    operator upstream_v4l2_create_buffers() const {\n      upstream_v4l2_create_buffers val {};\n      CPYT(index);\n      CPYT(count);\n      CPYT(memory);\n      CPYT(format);\n      CPYT(capabilities);\n      CPYT(flags);\n      CPYT(max_num_buffers);\n      memcpy(&val.reserved, &reserved, sizeof(uint32_t) * 5);\n      return val;\n    }\n\n    fex_v4l2_create_buffers(upstream_v4l2_create_buffers val)\n      : format {val.format} {\n      CPYF(index);\n      CPYF(count);\n      CPYF(memory);\n      CPYF(capabilities);\n      CPYF(flags);\n      CPYF(max_num_buffers);\n      memcpy(&reserved, &val.reserved, sizeof(uint32_t) * 5);\n    }\n  };\n\n#include \"LinuxSyscalls/x32/Ioctl/v4l2.inl\"\n} // namespace V4l2\n} // namespace FEX::HLE::x32\n#undef CPYT\n#undef CPYF\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/v4l2.inl",
    "content": "#ifndef VIDIOC_REMOVE_BUFS\n#define VIDIOC_REMOVE_BUFS _IOWR('V', 104, struct upstream_v4l2_remove_buffers)\n#endif\n\n_BASIC_META(VIDIOC_QUERYCAP)\n_BASIC_META(VIDIOC_ENUM_FMT)\n_CUSTOM_META(VIDIOC_G_FMT, _IOWR('V', 4, FEX::HLE::x32::V4l2::fex_v4l2_format))\n_CUSTOM_META(VIDIOC_S_FMT, _IOWR('V', 5, FEX::HLE::x32::V4l2::fex_v4l2_format))\n_BASIC_META(VIDIOC_REQBUFS)\n_CUSTOM_META(VIDIOC_QUERYBUF, _IOWR('V',  9, FEX::HLE::x32::V4l2::fex_v4l2_buffer))\n_CUSTOM_META(VIDIOC_G_FBUF, _IOR('V', 10, FEX::HLE::x32::V4l2::fex_v4l2_framebuffer))\n_CUSTOM_META(VIDIOC_S_FBUF, _IOW('V', 11, FEX::HLE::x32::V4l2::fex_v4l2_framebuffer))\n_BASIC_META(VIDIOC_OVERLAY)\n_CUSTOM_META(VIDIOC_QBUF, _IOWR('V', 15, FEX::HLE::x32::V4l2::fex_v4l2_buffer))\n_BASIC_META(VIDIOC_EXPBUF)\n_CUSTOM_META(VIDIOC_DQBUF, _IOWR('V', 17, FEX::HLE::x32::V4l2::fex_v4l2_buffer))\n_BASIC_META(VIDIOC_STREAMON)\n_BASIC_META(VIDIOC_STREAMOFF)\n_BASIC_META(VIDIOC_G_PARM)\n_BASIC_META(VIDIOC_S_PARM)\n_BASIC_META(VIDIOC_G_STD)\n_BASIC_META(VIDIOC_S_STD)\n_CUSTOM_META(VIDIOC_ENUMSTD, _IOWR('V', 25, FEX::HLE::x32::V4l2::fex_v4l2_standard))\n_CUSTOM_META(VIDIOC_ENUMINPUT, _IOWR('V', 26, FEX::HLE::x32::V4l2::fex_v4l2_input))\n_BASIC_META(VIDIOC_G_CTRL)\n_BASIC_META(VIDIOC_S_CTRL)\n_BASIC_META(VIDIOC_G_TUNER)\n_BASIC_META(VIDIOC_S_TUNER)\n_BASIC_META(VIDIOC_G_AUDIO)\n_BASIC_META(VIDIOC_S_AUDIO)\n_BASIC_META(VIDIOC_QUERYCTRL)\n_BASIC_META(VIDIOC_QUERYMENU)\n_BASIC_META(VIDIOC_G_INPUT)\n_BASIC_META(VIDIOC_S_INPUT)\n_CUSTOM_META(VIDIOC_G_EDID, _IOWR('V', 40, FEX::HLE::x32::V4l2::fex_v4l2_edid))\n_CUSTOM_META(VIDIOC_S_EDID, _IOWR('V', 41, FEX::HLE::x32::V4l2::fex_v4l2_edid))\n_BASIC_META(VIDIOC_G_OUTPUT)\n_BASIC_META(VIDIOC_S_OUTPUT)\n_BASIC_META(VIDIOC_ENUMOUTPUT)\n_BASIC_META(VIDIOC_G_AUDOUT)\n_BASIC_META(VIDIOC_S_AUDOUT)\n_BASIC_META(VIDIOC_G_MODULATOR)\n_BASIC_META(VIDIOC_S_MODULATOR)\n_BASIC_META(VIDIOC_G_FREQUENCY)\n_BASIC_META(VIDIOC_S_FREQUENCY)\n_BASIC_META(VIDIOC_CROPCAP)\n_BASIC_META(VIDIOC_G_CROP)\n_BASIC_META(VIDIOC_S_CROP)\n_BASIC_META(VIDIOC_G_JPEGCOMP)\n_BASIC_META(VIDIOC_S_JPEGCOMP)\n_BASIC_META(VIDIOC_QUERYSTD)\n_CUSTOM_META(VIDIOC_TRY_FMT, _IOWR('V', 64, FEX::HLE::x32::V4l2::fex_v4l2_format))\n_BASIC_META(VIDIOC_ENUMAUDIO)\n_BASIC_META(VIDIOC_ENUMAUDOUT)\n_BASIC_META(VIDIOC_G_PRIORITY)\n_BASIC_META(VIDIOC_S_PRIORITY)\n_BASIC_META(VIDIOC_G_SLICED_VBI_CAP)\n_BASIC_META(VIDIOC_LOG_STATUS)\n_CUSTOM_META(VIDIOC_G_EXT_CTRLS, _IOWR('V', 71, FEX::HLE::x32::V4l2::fex_v4l2_ext_controls))\n_CUSTOM_META(VIDIOC_S_EXT_CTRLS, _IOWR('V', 72, FEX::HLE::x32::V4l2::fex_v4l2_ext_controls))\n_CUSTOM_META(VIDIOC_TRY_EXT_CTRLS, _IOWR('V', 73, FEX::HLE::x32::V4l2::fex_v4l2_ext_controls))\n_BASIC_META(VIDIOC_ENUM_FRAMESIZES)\n_BASIC_META(VIDIOC_ENUM_FRAMEINTERVALS)\n_BASIC_META(VIDIOC_G_ENC_INDEX)\n_BASIC_META(VIDIOC_ENCODER_CMD)\n_BASIC_META(VIDIOC_TRY_ENCODER_CMD)\n_BASIC_META(VIDIOC_DBG_S_REGISTER)\n_BASIC_META(VIDIOC_DBG_G_REGISTER)\n_BASIC_META(VIDIOC_S_HW_FREQ_SEEK)\n_BASIC_META(VIDIOC_S_DV_TIMINGS)\n_BASIC_META(VIDIOC_G_DV_TIMINGS)\n_CUSTOM_META(VIDIOC_DQEVENT,  _IOR('V', 89, FEX::HLE::x32::V4l2::fex_v4l2_event))\n_BASIC_META(VIDIOC_SUBSCRIBE_EVENT)\n_BASIC_META(VIDIOC_UNSUBSCRIBE_EVENT)\n_CUSTOM_META(VIDIOC_CREATE_BUFS, _IOWR('V', 92, FEX::HLE::x32::V4l2::fex_v4l2_create_buffers))\n_CUSTOM_META(VIDIOC_PREPARE_BUF, _IOWR('V', 93, FEX::HLE::x32::V4l2::fex_v4l2_buffer))\n_BASIC_META(VIDIOC_G_SELECTION)\n_BASIC_META(VIDIOC_S_SELECTION)\n_BASIC_META(VIDIOC_DECODER_CMD)\n_BASIC_META(VIDIOC_TRY_DECODER_CMD)\n_BASIC_META(VIDIOC_ENUM_DV_TIMINGS)\n_BASIC_META(VIDIOC_QUERY_DV_TIMINGS)\n_BASIC_META(VIDIOC_DV_TIMINGS_CAP)\n_BASIC_META(VIDIOC_ENUM_FREQ_BANDS)\n_BASIC_META(VIDIOC_DBG_G_CHIP_INFO)\n_BASIC_META(VIDIOC_QUERY_EXT_CTRL)\n_BASIC_META(VIDIOC_REMOVE_BUFS)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/vc4_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_VC4_SUBMIT_CL)\n_BASIC_META(DRM_IOCTL_VC4_WAIT_SEQNO)\n_BASIC_META(DRM_IOCTL_VC4_WAIT_BO)\n_BASIC_META(DRM_IOCTL_VC4_CREATE_BO)\n_BASIC_META(DRM_IOCTL_VC4_MMAP_BO)\n_BASIC_META(DRM_IOCTL_VC4_CREATE_SHADER_BO)\n_BASIC_META(DRM_IOCTL_VC4_GET_HANG_STATE)\n_BASIC_META(DRM_IOCTL_VC4_GET_PARAM)\n_BASIC_META(DRM_IOCTL_VC4_SET_TILING)\n_BASIC_META(DRM_IOCTL_VC4_GET_TILING)\n_BASIC_META(DRM_IOCTL_VC4_LABEL_BO)\n_BASIC_META(DRM_IOCTL_VC4_GEM_MADVISE)\n_BASIC_META(DRM_IOCTL_VC4_PERFMON_CREATE)\n_BASIC_META(DRM_IOCTL_VC4_PERFMON_DESTROY)\n_CUSTOM_META(DRM_IOCTL_VC4_PERFMON_GET_VALUES, DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_PERFMON_GET_VALUES, FEX::HLE::x32::VC4::fex_drm_vc4_perfmon_get_values)) // XXX: This will still be incorrect on x86-64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/virtio_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_VIRTGPU_MAP)\n_BASIC_META(DRM_IOCTL_VIRTGPU_EXECBUFFER)\n_BASIC_META(DRM_IOCTL_VIRTGPU_GETPARAM)\n_BASIC_META(DRM_IOCTL_VIRTGPU_RESOURCE_CREATE)\n_BASIC_META(DRM_IOCTL_VIRTGPU_RESOURCE_INFO)\n_BASIC_META(DRM_IOCTL_VIRTGPU_TRANSFER_FROM_HOST)\n_BASIC_META(DRM_IOCTL_VIRTGPU_TRANSFER_TO_HOST)\n_BASIC_META(DRM_IOCTL_VIRTGPU_WAIT)\n_BASIC_META(DRM_IOCTL_VIRTGPU_GET_CAPS)\n_BASIC_META(DRM_IOCTL_VIRTGPU_RESOURCE_CREATE_BLOB)\n_BASIC_META(DRM_IOCTL_VIRTGPU_CONTEXT_INIT)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/wireless.h",
    "content": "// SPDX-License-Identifier: MIT\n#include \"LinuxSyscalls/x32/Types.h\"\n#include \"LinuxSyscalls/x32/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <linux/wireless.h>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x32 {\nnamespace wireless {\n#include \"LinuxSyscalls/x32/Ioctl/wireless.inl\"\n}\n\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/wireless.inl",
    "content": "_BASIC_META(SIOCSIWCOMMIT)\n_BASIC_META(SIOCGIWNAME)\n_BASIC_META(SIOCSIWNWID)\n_BASIC_META(SIOCGIWNWID)\n_BASIC_META(SIOCSIWFREQ)\n_BASIC_META(SIOCGIWFREQ)\n_BASIC_META(SIOCSIWMODE)\n_BASIC_META(SIOCGIWMODE)\n_BASIC_META(SIOCSIWSENS)\n_BASIC_META(SIOCGIWSENS)\n_BASIC_META(SIOCSIWRANGE)\n_BASIC_META(SIOCGIWRANGE)\n_BASIC_META(SIOCSIWPRIV)\n_BASIC_META(SIOCGIWPRIV)\n_BASIC_META(SIOCSIWSTATS)\n_BASIC_META(SIOCGIWSTATS)\n_BASIC_META(SIOCSIWSPY)\n_BASIC_META(SIOCGIWSPY)\n_BASIC_META(SIOCSIWTHRSPY)\n_BASIC_META(SIOCGIWTHRSPY)\n_BASIC_META(SIOCSIWAP)\n_BASIC_META(SIOCGIWAP)\n_BASIC_META(SIOCGIWAPLIST)\n_BASIC_META(SIOCSIWSCAN)\n_BASIC_META(SIOCGIWSCAN)\n_BASIC_META(SIOCSIWESSID)\n_BASIC_META(SIOCGIWESSID)\n_BASIC_META(SIOCSIWNICKN)\n_BASIC_META(SIOCGIWNICKN)\n_BASIC_META(SIOCSIWRATE)\n_BASIC_META(SIOCGIWRATE)\n_BASIC_META(SIOCSIWRTS)\n_BASIC_META(SIOCGIWRTS)\n_BASIC_META(SIOCSIWFRAG)\n_BASIC_META(SIOCGIWFRAG)\n_BASIC_META(SIOCSIWTXPOW)\n_BASIC_META(SIOCGIWTXPOW)\n_BASIC_META(SIOCSIWRETRY)\n_BASIC_META(SIOCGIWRETRY)\n_BASIC_META(SIOCSIWENCODE)\n_BASIC_META(SIOCGIWENCODE)\n_BASIC_META(SIOCSIWPOWER)\n_BASIC_META(SIOCGIWPOWER)\n_BASIC_META(SIOCSIWGENIE)\n_BASIC_META(SIOCGIWGENIE)\n_BASIC_META(SIOCSIWMLME)\n_BASIC_META(SIOCSIWAUTH)\n_BASIC_META(SIOCGIWAUTH)\n_BASIC_META(SIOCSIWENCODEEXT)\n_BASIC_META(SIOCGIWENCODEEXT)\n_BASIC_META(SIOCSIWPMKSA)\n\n_BASIC_META(SIOCIWFIRSTPRIV)\n_BASIC_META(SIOCIWLASTPRIV)\n\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/xe_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_XE_DEVICE_QUERY)\n_BASIC_META(DRM_IOCTL_XE_GEM_CREATE)\n_BASIC_META(DRM_IOCTL_XE_GEM_MMAP_OFFSET)\n_BASIC_META(DRM_IOCTL_XE_VM_CREATE)\n_BASIC_META(DRM_IOCTL_XE_VM_DESTROY)\n_BASIC_META(DRM_IOCTL_XE_VM_BIND)\n_BASIC_META(DRM_IOCTL_XE_EXEC_QUEUE_CREATE)\n_BASIC_META(DRM_IOCTL_XE_EXEC_QUEUE_DESTROY)\n_BASIC_META(DRM_IOCTL_XE_EXEC_QUEUE_GET_PROPERTY)\n_BASIC_META(DRM_IOCTL_XE_EXEC)\n_BASIC_META(DRM_IOCTL_XE_WAIT_USER_FENCE)\n_BASIC_META(DRM_IOCTL_XE_OBSERVATION)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/IoctlEmulation.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Ioctl/drm.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Ioctl/asound.h\"\n#include \"LinuxSyscalls/x32/Ioctl/drm.h\"\n#include \"LinuxSyscalls/x32/Ioctl/usbdev.h\"\n#include \"LinuxSyscalls/x32/Ioctl/streams.h\"\n#include \"LinuxSyscalls/x32/Ioctl/sockios.h\"\n#include \"LinuxSyscalls/x32/Ioctl/input.h\"\n#include \"LinuxSyscalls/x32/Ioctl/joystick.h\"\n#include \"LinuxSyscalls/x32/Ioctl/wireless.h\"\n#include \"LinuxSyscalls/x32/Ioctl/v4l2.h\"\n#undef _BASIC_META\n#undef _BASIC_META_VAR\n#undef _CUSTOM_META\n#undef _CUSTOM_META_OFFSET\n\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/map.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <cstdint>\n#include <sys/ioctl.h>\n#include <sys/syscall.h>\n#include <unistd.h>\n\nnamespace FEX::HLE::x32 {\nstatic void UnhandledIoctl(const char* Type, int fd, uint32_t cmd, uint32_t args) {\n  LogMan::Msg::EFmt(\"@@@@@@@@@@@@@@@@@@@@@@@@@\");\n  LogMan::Msg::EFmt(\"Unhandled {} ioctl({}, 0x{:08x}, 0x{:08x})\", Type, fd, cmd, args);\n  LogMan::Msg::EFmt(\"\\tDir  : 0x{:x}\", _IOC_DIR(cmd));\n  LogMan::Msg::EFmt(\"\\tType : 0x{:x}\", _IOC_TYPE(cmd));\n  LogMan::Msg::EFmt(\"\\tNR   : 0x{:x}\", _IOC_NR(cmd));\n  LogMan::Msg::EFmt(\"\\tSIZE : 0x{:x}\", _IOC_SIZE(cmd));\n  LogMan::Msg::AFmt(\"@@@@@@@@@@@@@@@@@@@@@@@@@\");\n}\n\nnamespace BasicHandler {\n  uint32_t BasicHandler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n    uint64_t Result = ::ioctl(fd, cmd, args);\n    SYSCALL_ERRNO();\n  }\n} // namespace BasicHandler\n\nnamespace V4l2 {\n  uint32_t V4l2Handler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n    switch (_IOC_NR(cmd)) {\n    case _IOC_NR(FEX_VIDIOC_G_FMT): {\n      fex_v4l2_format* format = reinterpret_cast<fex_v4l2_format*>(args);\n      v4l2_format Host_format {.type = format->type};\n      if (Host_format.type == V4L2_BUF_TYPE_VIDEO_OVERLAY || Host_format.type == V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY) {\n        uint64_t Result = ::ioctl(fd, cmd, args);\n        SYSCALL_ERRNO();\n      }\n      uint64_t Result = ::ioctl(fd, VIDIOC_G_FMT, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_S_FMT): {\n      fex_v4l2_format* format = reinterpret_cast<fex_v4l2_format*>(args);\n      v4l2_format Host_format = *format;\n      if (Host_format.type == V4L2_BUF_TYPE_VIDEO_OVERLAY || Host_format.type == V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY) {\n        uint64_t Result = ::ioctl(fd, cmd, args);\n        SYSCALL_ERRNO();\n      }\n      uint64_t Result = ::ioctl(fd, VIDIOC_S_FMT, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_QUERYBUF): {\n      auto format = reinterpret_cast<fex_v4l2_buffer*>(args);\n      v4l2_buffer Host_format = *format;\n\n      uint64_t Result = ::ioctl(fd, VIDIOC_QUERYBUF, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_G_FBUF): {\n      auto format = reinterpret_cast<fex_v4l2_framebuffer*>(args);\n      v4l2_framebuffer Host_format = *format;\n\n      uint64_t Result = ::ioctl(fd, VIDIOC_G_FBUF, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_S_FBUF): {\n      auto format = reinterpret_cast<fex_v4l2_framebuffer*>(args);\n      v4l2_framebuffer Host_format = *format;\n\n      uint64_t Result = ::ioctl(fd, VIDIOC_S_FBUF, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_QBUF): {\n      auto format = reinterpret_cast<fex_v4l2_buffer*>(args);\n      v4l2_buffer Host_format = *format;\n\n      uint64_t Result = ::ioctl(fd, VIDIOC_QBUF, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_DQBUF): {\n      auto format = reinterpret_cast<fex_v4l2_buffer*>(args);\n      v4l2_buffer Host_format = *format;\n\n      uint64_t Result = ::ioctl(fd, VIDIOC_DQBUF, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_ENUMSTD): {\n      auto format = reinterpret_cast<fex_v4l2_standard*>(args);\n      v4l2_standard Host_format = *format;\n\n      uint64_t Result = ::ioctl(fd, VIDIOC_ENUMSTD, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_ENUMINPUT): {\n      auto format = reinterpret_cast<fex_v4l2_input*>(args);\n      v4l2_input Host_format = *format;\n\n      uint64_t Result = ::ioctl(fd, VIDIOC_ENUMINPUT, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_G_EDID): {\n      auto format = reinterpret_cast<fex_v4l2_edid*>(args);\n      v4l2_edid Host_format = *format;\n\n      uint64_t Result = ::ioctl(fd, VIDIOC_G_EDID, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_S_EDID): {\n      auto format = reinterpret_cast<fex_v4l2_edid*>(args);\n      v4l2_edid Host_format = *format;\n\n      uint64_t Result = ::ioctl(fd, VIDIOC_S_EDID, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_TRY_FMT): {\n      fex_v4l2_format* format = reinterpret_cast<fex_v4l2_format*>(args);\n      v4l2_format Host_format = *format;\n      if (Host_format.type == V4L2_BUF_TYPE_VIDEO_OVERLAY || Host_format.type == V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY) {\n        uint64_t Result = ::ioctl(fd, cmd, args);\n        SYSCALL_ERRNO();\n      }\n      uint64_t Result = ::ioctl(fd, VIDIOC_TRY_FMT, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_G_EXT_CTRLS): {\n      auto format = reinterpret_cast<fex_v4l2_ext_controls*>(args);\n      v4l2_ext_controls Host_format = *format;\n\n      uint64_t Result = ::ioctl(fd, VIDIOC_G_EXT_CTRLS, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_S_EXT_CTRLS): {\n      auto format = reinterpret_cast<fex_v4l2_ext_controls*>(args);\n      v4l2_ext_controls Host_format = *format;\n\n      uint64_t Result = ::ioctl(fd, VIDIOC_S_EXT_CTRLS, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_TRY_EXT_CTRLS): {\n      auto format = reinterpret_cast<fex_v4l2_ext_controls*>(args);\n      v4l2_ext_controls Host_format = *format;\n\n      uint64_t Result = ::ioctl(fd, VIDIOC_TRY_EXT_CTRLS, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_DQEVENT): {\n      auto format = reinterpret_cast<fex_v4l2_event*>(args);\n      v4l2_event Host_format = *format;\n\n      uint64_t Result = ::ioctl(fd, VIDIOC_DQEVENT, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_CREATE_BUFS): {\n      auto format = reinterpret_cast<fex_v4l2_create_buffers*>(args);\n      upstream_v4l2_create_buffers Host_format = *format;\n\n      uint64_t Result = ::ioctl(fd, VIDIOC_CREATE_BUFS, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_VIDIOC_PREPARE_BUF): {\n      auto format = reinterpret_cast<fex_v4l2_buffer*>(args);\n      v4l2_buffer Host_format = *format;\n\n      uint64_t Result = ::ioctl(fd, VIDIOC_PREPARE_BUF, &Host_format);\n      if (Result != -1) {\n        *format = Host_format;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n#define _BASIC_META(x) case _IOC_NR(x):\n#define _BASIC_META_VAR(x, args...) case _IOC_NR(x):\n#define _CUSTOM_META(name, ioctl_num)\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset)\n#include \"LinuxSyscalls/x32/Ioctl/v4l2.inl\"\n      {\n        uint64_t Result = ::ioctl(fd, cmd, args);\n        SYSCALL_ERRNO();\n        break;\n      }\n    default:\n      UnhandledIoctl(\"V4L2\", fd, cmd, args);\n      return -EPERM;\n      break;\n    }\n#undef _BASIC_META\n#undef _BASIC_META_VAR\n#undef _CUSTOM_META\n#undef _CUSTOM_META_OFFSET\n    return -EPERM;\n  }\n} // namespace V4l2\n\nnamespace DRM {\n  uint32_t AddAndRunHandler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args);\n  void AssignDeviceTypeToFD(FEXCore::Core::CpuStateFrame* Frame, int fd, const drm_version& Version);\n\n  DRMLRUCacheFDCache::HandlerType FindHandler(FEXCore::Core::CpuStateFrame* Frame, int32_t FD) {\n    auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n    if (!Thread->DRMLRUCache) {\n      Thread->DRMLRUCache = fextl::make_unique<DRMLRUCacheFDCache>();\n    }\n    return Thread->DRMLRUCache->FindHandler(FD);\n  }\n\n  uint32_t AddAndRunHandler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n    auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n    if (!Thread->DRMLRUCache) {\n      Thread->DRMLRUCache = fextl::make_unique<DRMLRUCacheFDCache>();\n    }\n\n    return Thread->DRMLRUCache->AddAndRunMapHandler(Frame, fd, cmd, args);\n  }\n\n  void CheckAndAddFDDuplication(FEXCore::Core::CpuStateFrame* Frame, int fd, int NewFD) {\n    auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n    if (!Thread->DRMLRUCache) {\n      Thread->DRMLRUCache = fextl::make_unique<DRMLRUCacheFDCache>();\n    }\n    Thread->DRMLRUCache->DuplicateFD(fd, NewFD);\n  }\n\n  uint32_t AMDGPU_Handler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n    switch (_IOC_NR(cmd)) {\n    case _IOC_NR(FEX_DRM_IOCTL_AMDGPU_GEM_METADATA): {\n      AMDGPU::fex_drm_amdgpu_gem_metadata* val = reinterpret_cast<AMDGPU::fex_drm_amdgpu_gem_metadata*>(args);\n      drm_amdgpu_gem_metadata Host_val = *val;\n      uint64_t Result = ioctl(fd, DRM_IOCTL_AMDGPU_GEM_METADATA, &Host_val);\n      if (Result != -1) {\n        *val = Host_val;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n#define _BASIC_META(x) case _IOC_NR(x):\n#define _BASIC_META_VAR(x, args...) case _IOC_NR(x):\n#define _CUSTOM_META(name, ioctl_num)\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset)\n    // DRM\n#include \"LinuxSyscalls/x32/Ioctl/amdgpu_drm.inl\"\n      {\n        uint64_t Result = ::ioctl(fd, cmd, args);\n        SYSCALL_ERRNO();\n        break;\n      }\n    default:\n      UnhandledIoctl(\"AMDGPU\", fd, cmd, args);\n      return -EPERM;\n      break;\n    }\n#undef _BASIC_META\n#undef _BASIC_META_VAR\n#undef _CUSTOM_META\n#undef _CUSTOM_META_OFFSET\n    return -EPERM;\n  }\n\n  uint32_t RADEON_Handler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n    switch (_IOC_NR(cmd)) {\n    case _IOC_NR(FEX_DRM_IOCTL_RADEON_CP_INIT): {\n      RADEON::fex_drm_radeon_init_t* val = reinterpret_cast<RADEON::fex_drm_radeon_init_t*>(args);\n      drm_radeon_init_t Host_val = *val;\n      uint64_t Result = ioctl(fd, DRM_IOCTL_RADEON_CP_INIT, &Host_val);\n      if (Result != -1) {\n        *val = Host_val;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_DRM_IOCTL_RADEON_CLEAR): {\n      RADEON::fex_drm_radeon_clear_t* val = reinterpret_cast<RADEON::fex_drm_radeon_clear_t*>(args);\n      drm_radeon_clear_t Host_val = *val;\n      uint64_t Result = ioctl(fd, DRM_IOCTL_RADEON_CLEAR, &Host_val);\n      if (Result != -1) {\n        *val = Host_val;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_DRM_IOCTL_RADEON_STIPPLE): {\n      RADEON::fex_drm_radeon_stipple_t* val = reinterpret_cast<RADEON::fex_drm_radeon_stipple_t*>(args);\n      drm_radeon_stipple_t Host_val = *val;\n      uint64_t Result = ioctl(fd, DRM_IOCTL_RADEON_STIPPLE, &Host_val);\n      if (Result != -1) {\n        *val = Host_val;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_DRM_IOCTL_RADEON_TEXTURE): {\n      RADEON::fex_drm_radeon_texture_t* val = reinterpret_cast<RADEON::fex_drm_radeon_texture_t*>(args);\n      drm_radeon_texture_t Host_val = *val;\n      uint64_t Result = ioctl(fd, DRM_IOCTL_RADEON_TEXTURE, &Host_val);\n      if (Result != -1) {\n        *val = Host_val;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_DRM_IOCTL_RADEON_VERTEX2): {\n      RADEON::fex_drm_radeon_vertex2_t* val = reinterpret_cast<RADEON::fex_drm_radeon_vertex2_t*>(args);\n      drm_radeon_vertex2_t Host_val = *val;\n      uint64_t Result = ioctl(fd, DRM_IOCTL_RADEON_VERTEX2, &Host_val);\n      if (Result != -1) {\n        *val = Host_val;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_DRM_IOCTL_RADEON_CMDBUF): {\n      RADEON::fex_drm_radeon_cmd_buffer_t* val = reinterpret_cast<RADEON::fex_drm_radeon_cmd_buffer_t*>(args);\n      drm_radeon_cmd_buffer_t Host_val = *val;\n      uint64_t Result = ioctl(fd, DRM_IOCTL_RADEON_CMDBUF, &Host_val);\n      if (Result != -1) {\n        *val = Host_val;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_DRM_IOCTL_RADEON_GETPARAM): {\n      RADEON::fex_drm_radeon_getparam_t* val = reinterpret_cast<RADEON::fex_drm_radeon_getparam_t*>(args);\n      drm_radeon_getparam_t Host_val = *val;\n      uint64_t Result = ioctl(fd, DRM_IOCTL_RADEON_GETPARAM, &Host_val);\n      if (Result != -1) {\n        *val = Host_val;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_DRM_IOCTL_RADEON_ALLOC): {\n      RADEON::fex_drm_radeon_mem_alloc_t* val = reinterpret_cast<RADEON::fex_drm_radeon_mem_alloc_t*>(args);\n      drm_radeon_mem_alloc_t Host_val = *val;\n      uint64_t Result = ioctl(fd, DRM_IOCTL_RADEON_ALLOC, &Host_val);\n      if (Result != -1) {\n        *val = Host_val;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_DRM_IOCTL_RADEON_IRQ_EMIT): {\n      RADEON::fex_drm_radeon_irq_emit_t* val = reinterpret_cast<RADEON::fex_drm_radeon_irq_emit_t*>(args);\n      drm_radeon_irq_emit_t Host_val = *val;\n      uint64_t Result = ioctl(fd, DRM_IOCTL_RADEON_IRQ_EMIT, &Host_val);\n      if (Result != -1) {\n        *val = Host_val;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_DRM_IOCTL_RADEON_SETPARAM): {\n      RADEON::fex_drm_radeon_setparam_t* val = reinterpret_cast<RADEON::fex_drm_radeon_setparam_t*>(args);\n      drm_radeon_setparam_t Host_val = *val;\n      uint64_t Result = ioctl(fd, DRM_IOCTL_RADEON_SETPARAM, &Host_val);\n      if (Result != -1) {\n        *val = Host_val;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    case _IOC_NR(FEX_DRM_IOCTL_RADEON_GEM_CREATE): {\n      RADEON::fex_drm_radeon_gem_create* val = reinterpret_cast<RADEON::fex_drm_radeon_gem_create*>(args);\n      drm_radeon_gem_create Host_val = *val;\n      uint64_t Result = ioctl(fd, DRM_IOCTL_RADEON_GEM_CREATE, &Host_val);\n      if (Result != -1) {\n        *val = Host_val;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n#define _BASIC_META(x) case _IOC_NR(x):\n#define _BASIC_META_VAR(x, args...) case _IOC_NR(x):\n#define _CUSTOM_META(name, ioctl_num)\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset)\n    // DRM\n#include \"LinuxSyscalls/x32/Ioctl/radeon_drm.inl\"\n      {\n        uint64_t Result = ::ioctl(fd, cmd, args);\n        SYSCALL_ERRNO();\n        break;\n      }\n    default:\n      UnhandledIoctl(\"RADEON\", fd, cmd, args);\n      return -EPERM;\n      break;\n    }\n#undef _BASIC_META\n#undef _BASIC_META_VAR\n#undef _CUSTOM_META\n#undef _CUSTOM_META_OFFSET\n    return -EPERM;\n  }\n\n  uint32_t MSM_Handler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n    switch (_IOC_NR(cmd)) {\n    case _IOC_NR(FEX_DRM_IOCTL_MSM_WAIT_FENCE): {\n      MSM::fex_drm_msm_wait_fence* val = reinterpret_cast<MSM::fex_drm_msm_wait_fence*>(args);\n      drm_msm_wait_fence Host_val = *val;\n      uint64_t Result = ::ioctl(fd, DRM_IOCTL_MSM_WAIT_FENCE, &Host_val);\n      if (Result != -1) {\n        *val = Host_val;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n\n#define _BASIC_META(x) case _IOC_NR(x):\n#define _BASIC_META_VAR(x, args...) case _IOC_NR(x):\n#define _CUSTOM_META(name, ioctl_num)\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset)\n    // DRM\n#include \"LinuxSyscalls/x32/Ioctl/msm_drm.inl\"\n      {\n        uint64_t Result = ::ioctl(fd, cmd, args);\n        SYSCALL_ERRNO();\n        break;\n      }\n    default:\n      UnhandledIoctl(\"MSM\", fd, cmd, args);\n      return -EPERM;\n      break;\n    }\n#undef _BASIC_META\n#undef _BASIC_META_VAR\n#undef _CUSTOM_META\n#undef _CUSTOM_META_OFFSET\n    return -EPERM;\n  }\n\n  uint32_t Nouveau_Handler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n    switch (_IOC_NR(cmd)) {\n#define _BASIC_META(x) case _IOC_NR(x):\n#define _BASIC_META_VAR(x, args...) case _IOC_NR(x):\n#define _CUSTOM_META(name, ioctl_num)\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset)\n      // DRM\n#include \"LinuxSyscalls/x32/Ioctl/nouveau_drm.inl\"\n    // Let's hope NVIF is arch agnostic.\n    case DRM_COMMAND_BASE + DRM_NOUVEAU_NVIF: {\n      uint64_t Result = ::ioctl(fd, cmd, args);\n      SYSCALL_ERRNO();\n      break;\n    }\n    default:\n      UnhandledIoctl(\"Nouveau\", fd, cmd, args);\n      return -EPERM;\n      break;\n    }\n#undef _BASIC_META\n#undef _BASIC_META_VAR\n#undef _CUSTOM_META\n#undef _CUSTOM_META_OFFSET\n    return -EPERM;\n  }\n\n  uint32_t I915_Handler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n#define SIMPLE(enum, type)                                               \\\n  case _IOC_NR(FEX_##enum): {                                            \\\n    I915::fex_##type* guest = reinterpret_cast<I915::fex_##type*>(args); \\\n    type host = *guest;                                                  \\\n    uint64_t Result = ::ioctl(fd, enum, &host);                          \\\n    if (Result != -1) {                                                  \\\n      *guest = host;                                                     \\\n    }                                                                    \\\n    SYSCALL_ERRNO();                                                     \\\n    break;                                                               \\\n  }\n\n\n    switch (_IOC_NR(cmd)) {\n      SIMPLE(DRM_IOCTL_I915_BATCHBUFFER, drm_i915_batchbuffer_t)\n      SIMPLE(DRM_IOCTL_I915_IRQ_EMIT, drm_i915_irq_emit_t)\n      SIMPLE(DRM_IOCTL_I915_GETPARAM, drm_i915_getparam_t)\n      SIMPLE(DRM_IOCTL_I915_ALLOC, drm_i915_mem_alloc_t)\n      SIMPLE(DRM_IOCTL_I915_CMDBUFFER, drm_i915_cmdbuffer_t)\n\n#define _BASIC_META(x) case _IOC_NR(x):\n#define _BASIC_META_VAR(x, args...) case _IOC_NR(x):\n#define _CUSTOM_META(name, ioctl_num)\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset)\n      // DRM\n#include \"LinuxSyscalls/x32/Ioctl/i915_drm.inl\"\n      {\n        uint64_t Result = ::ioctl(fd, cmd, args);\n        SYSCALL_ERRNO();\n        break;\n      }\n    default:\n      UnhandledIoctl(\"I915\", fd, cmd, args);\n      return -EPERM;\n      break;\n    }\n#undef SIMPLE\n#undef _BASIC_META\n#undef _BASIC_META_VAR\n#undef _CUSTOM_META\n#undef _CUSTOM_META_OFFSET\n    return -EPERM;\n  }\n\n  uint32_t Panfrost_Handler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n    switch (_IOC_NR(cmd)) {\n#define _BASIC_META(x) case _IOC_NR(x):\n#define _BASIC_META_VAR(x, args...) case _IOC_NR(x):\n#define _CUSTOM_META(name, ioctl_num)\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset)\n      // DRM\n#include \"LinuxSyscalls/x32/Ioctl/panfrost_drm.inl\"\n      {\n        uint64_t Result = ::ioctl(fd, cmd, args);\n        SYSCALL_ERRNO();\n        break;\n      }\n    default:\n      UnhandledIoctl(\"Panfrost\", fd, cmd, args);\n      return -EPERM;\n      break;\n    }\n#undef _BASIC_META\n#undef _BASIC_META_VAR\n#undef _CUSTOM_META\n#undef _CUSTOM_META_OFFSET\n    return -EPERM;\n  }\n\n  uint32_t Lima_Handler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n    switch (_IOC_NR(cmd)) {\n#define _BASIC_META(x) case _IOC_NR(x):\n#define _BASIC_META_VAR(x, args...) case _IOC_NR(x):\n#define _CUSTOM_META(name, ioctl_num)\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset)\n      // DRM\n#include \"LinuxSyscalls/x32/Ioctl/lima_drm.inl\"\n      {\n        uint64_t Result = ::ioctl(fd, cmd, args);\n        SYSCALL_ERRNO();\n        break;\n      }\n    default:\n      UnhandledIoctl(\"Lima\", fd, cmd, args);\n      return -EPERM;\n      break;\n    }\n#undef _BASIC_META\n#undef _BASIC_META_VAR\n#undef _CUSTOM_META\n#undef _CUSTOM_META_OFFSET\n    return -EPERM;\n  }\n\n  uint32_t VC4_Handler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n    switch (_IOC_NR(cmd)) {\n    case _IOC_NR(FEX_DRM_IOCTL_VC4_PERFMON_GET_VALUES): {\n      FEX::HLE::x32::VC4::fex_drm_vc4_perfmon_get_values* val = reinterpret_cast<FEX::HLE::x32::VC4::fex_drm_vc4_perfmon_get_values*>(args);\n      drm_vc4_perfmon_get_values Host_val = *val;\n      uint64_t Result = ::ioctl(fd, DRM_IOCTL_VC4_PERFMON_GET_VALUES, &Host_val);\n      if (Result != -1) {\n        *val = Host_val;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n\n#define _BASIC_META(x) case _IOC_NR(x):\n#define _BASIC_META_VAR(x, args...) case _IOC_NR(x):\n#define _CUSTOM_META(name, ioctl_num)\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset)\n    // DRM\n#include \"LinuxSyscalls/x32/Ioctl/vc4_drm.inl\"\n      {\n        uint64_t Result = ::ioctl(fd, cmd, args);\n        SYSCALL_ERRNO();\n        break;\n      }\n    default:\n      UnhandledIoctl(\"VC4\", fd, cmd, args);\n      return -EPERM;\n      break;\n    }\n#undef _BASIC_META\n#undef _BASIC_META_VAR\n#undef _CUSTOM_META\n#undef _CUSTOM_META_OFFSET\n    return -EPERM;\n  }\n\n  uint32_t V3D_Handler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n    switch (_IOC_NR(cmd)) {\n    case _IOC_NR(FEX_DRM_IOCTL_V3D_SUBMIT_CSD): {\n      FEX::HLE::x32::V3D::fex_drm_v3d_submit_csd* val = reinterpret_cast<FEX::HLE::x32::V3D::fex_drm_v3d_submit_csd*>(args);\n      drm_v3d_submit_csd Host_val = FEX::HLE::x32::V3D::fex_drm_v3d_submit_csd::SafeConvertToHost(val, _IOC_SIZE(cmd));\n      uint64_t Result = ::ioctl(fd, DRM_IOCTL_V3D_SUBMIT_CSD, &Host_val);\n      if (Result != -1) {\n        FEX::HLE::x32::V3D::fex_drm_v3d_submit_csd::SafeConvertToGuest(val, Host_val, _IOC_SIZE(cmd));\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n\n#define _BASIC_META(x) case _IOC_NR(x):\n#define _BASIC_META_VAR(x, args...) case _IOC_NR(x):\n#define _CUSTOM_META(name, ioctl_num)\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset)\n    // DRM\n#include \"LinuxSyscalls/x32/Ioctl/v3d_drm.inl\"\n      {\n        uint64_t Result = ::ioctl(fd, cmd, args);\n        SYSCALL_ERRNO();\n        break;\n      }\n    default:\n      UnhandledIoctl(\"V3D\", fd, cmd, args);\n      return -EPERM;\n      break;\n    }\n#undef _BASIC_META\n#undef _BASIC_META_VAR\n#undef _CUSTOM_META\n#undef _CUSTOM_META_OFFSET\n    return -EPERM;\n  }\n\n  uint32_t Virtio_Handler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n    switch (_IOC_NR(cmd)) {\n#define _BASIC_META(x) case _IOC_NR(x):\n#define _BASIC_META_VAR(x, args...) case _IOC_NR(x):\n#define _CUSTOM_META(name, ioctl_num)\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset)\n      // DRM\n#include \"LinuxSyscalls/x32/Ioctl/virtio_drm.inl\"\n      {\n        uint64_t Result = ::ioctl(fd, cmd, args);\n        SYSCALL_ERRNO();\n        break;\n      }\n    default:\n      UnhandledIoctl(\"Virtio\", fd, cmd, args);\n      return -EPERM;\n      break;\n    }\n#undef _BASIC_META\n#undef _BASIC_META_VAR\n#undef _CUSTOM_META\n#undef _CUSTOM_META_OFFSET\n    return -EPERM;\n  }\n\n  uint32_t Default_Handler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n    // Default handler assumes everything is correct and doesn't need to do any work.\n    uint64_t Result = ::ioctl(fd, cmd, args);\n    SYSCALL_ERRNO();\n  }\n\n  void AssignDeviceTypeToFD(FEXCore::Core::CpuStateFrame* Frame, int fd, const drm_version& Version) {\n    if (Version.name) {\n      auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n      if (!Thread->DRMLRUCache) {\n        Thread->DRMLRUCache = fextl::make_unique<DRMLRUCacheFDCache>();\n      }\n\n      const std::string_view Name(Version.name, Version.name_len);\n      if (Name == \"amdgpu\") {\n        Thread->DRMLRUCache->SetFDHandler(fd, AMDGPU_Handler);\n      } else if (Name == \"radeon\") {\n        Thread->DRMLRUCache->SetFDHandler(fd, RADEON_Handler);\n      } else if (Name == \"msm\") {\n        Thread->DRMLRUCache->SetFDHandler(fd, MSM_Handler);\n      } else if (Name == \"nouveau\") {\n        Thread->DRMLRUCache->SetFDHandler(fd, Nouveau_Handler);\n      } else if (Name == \"i915\") {\n        Thread->DRMLRUCache->SetFDHandler(fd, I915_Handler);\n      } else if (Name == \"panfrost\") {\n        Thread->DRMLRUCache->SetFDHandler(fd, Panfrost_Handler);\n      } else if (Name == \"lima\") {\n        Thread->DRMLRUCache->SetFDHandler(fd, Lima_Handler);\n      } else if (Name == \"vc4\") {\n        Thread->DRMLRUCache->SetFDHandler(fd, VC4_Handler);\n      } else if (Name == \"v3d\") {\n        Thread->DRMLRUCache->SetFDHandler(fd, V3D_Handler);\n      } else if (Name == \"virtio_gpu\") {\n        Thread->DRMLRUCache->SetFDHandler(fd, Virtio_Handler);\n      } else {\n        // Known safe drm drivers.\n        if (!(Name == \"asahi\" || Name == \"panthor\" || Name == \"xe\")) {\n          LogMan::Msg::IFmt(\"Unknown DRM device: '{}'. Using default passthrough\", Version.name);\n        }\n        Thread->DRMLRUCache->SetFDHandler(fd, Default_Handler);\n      }\n    }\n  }\n\n  uint32_t Handler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n#define SIMPLE(enum, type)                                             \\\n  case _IOC_NR(FEX_##enum): {                                          \\\n    DRM::fex_##type* guest = reinterpret_cast<DRM::fex_##type*>(args); \\\n    type host = *guest;                                                \\\n    uint64_t Result = ::ioctl(fd, enum, &host);                        \\\n    if (Result != -1) {                                                \\\n      *guest = host;                                                   \\\n    }                                                                  \\\n    SYSCALL_ERRNO();                                                   \\\n    break;                                                             \\\n  }\n\n    switch (_IOC_NR(cmd)) {\n    case _IOC_NR(FEX_DRM_IOCTL_VERSION): {\n      fex_drm_version* version = reinterpret_cast<fex_drm_version*>(args);\n      drm_version Host_Version = *version;\n      uint64_t Result = ::ioctl(fd, DRM_IOCTL_VERSION, &Host_Version);\n      if (Result != -1) {\n        *version = Host_Version;\n        AssignDeviceTypeToFD(Frame, fd, Host_Version);\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n\n      SIMPLE(DRM_IOCTL_GET_UNIQUE, drm_unique)\n      SIMPLE(DRM_IOCTL_GET_CLIENT, drm_client)\n      SIMPLE(DRM_IOCTL_GET_STATS, drm_stats)\n      SIMPLE(DRM_IOCTL_SET_UNIQUE, drm_unique)\n\n      SIMPLE(DRM_IOCTL_ADD_MAP, drm_map)\n      SIMPLE(DRM_IOCTL_ADD_BUFS, drm_buf_desc)\n      SIMPLE(DRM_IOCTL_MARK_BUFS, drm_buf_desc)\n      SIMPLE(DRM_IOCTL_INFO_BUFS, drm_buf_info)\n      SIMPLE(DRM_IOCTL_MAP_BUFS, drm_buf_map)\n      SIMPLE(DRM_IOCTL_FREE_BUFS, drm_buf_free)\n      SIMPLE(DRM_IOCTL_RM_MAP, drm_map)\n      SIMPLE(DRM_IOCTL_SET_SAREA_CTX, drm_ctx_priv_map)\n      SIMPLE(DRM_IOCTL_GET_SAREA_CTX, drm_ctx_priv_map)\n\n      SIMPLE(DRM_IOCTL_RES_CTX, drm_ctx_res)\n      SIMPLE(DRM_IOCTL_DMA, drm_dma)\n      SIMPLE(DRM_IOCTL_SG_ALLOC, drm_scatter_gather)\n      SIMPLE(DRM_IOCTL_SG_FREE, drm_scatter_gather)\n      SIMPLE(DRM_IOCTL_UPDATE_DRAW, drm_update_draw)\n      SIMPLE(DRM_IOCTL_MODE_GETPLANERESOURCES, drm_mode_get_plane_res)\n      SIMPLE(DRM_IOCTL_MODE_ADDFB2, drm_mode_fb_cmd2)\n      SIMPLE(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, drm_mode_obj_get_properties)\n      SIMPLE(DRM_IOCTL_MODE_OBJ_SETPROPERTY, drm_mode_obj_set_property)\n      SIMPLE(DRM_IOCTL_MODE_GETFB2, drm_mode_fb_cmd2)\n\n    case _IOC_NR(FEX_DRM_IOCTL_WAIT_VBLANK): {\n      fex_drm_wait_vblank* guest = reinterpret_cast<fex_drm_wait_vblank*>(args);\n      drm_wait_vblank Host {};\n      Host.request = guest->request;\n      uint64_t Result = ::ioctl(fd, FEX_DRM_IOCTL_WAIT_VBLANK, &Host);\n      if (Result != -1) {\n        guest->reply = Host.reply;\n      }\n      SYSCALL_ERRNO();\n      break;\n    }\n    // Passthrough\n#define _BASIC_META(x) case _IOC_NR(x):\n#define _BASIC_META_VAR(x, args...) case _IOC_NR(x):\n#define _CUSTOM_META(name, ioctl_num)\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset)\n    // DRM\n#include \"LinuxSyscalls/x32/Ioctl/drm.inl\"\n      {\n        uint64_t Result = ::ioctl(fd, cmd, args);\n        SYSCALL_ERRNO();\n        break;\n      }\n\n    case DRM_COMMAND_BASE ...(DRM_COMMAND_END - 1): {\n      // This is the space of the DRM device commands\n      auto it = FindHandler(Frame, fd);\n      return it(Frame, fd, cmd, args);\n      break;\n    }\n    default:\n      UnhandledIoctl(\"DRM\", fd, cmd, args);\n      return -EPERM;\n      break;\n    }\n#undef SIMPLE\n#undef _BASIC_META\n#undef _BASIC_META_VAR\n#undef _CUSTOM_META\n#undef _CUSTOM_META_OFFSET\n\n    return -EPERM;\n  }\n} // namespace DRM\n\nDRMLRUCacheFDCache::DRMLRUCacheFDCache() {\n  // Set the last element to our handler\n  // This element will always be the last one\n  LRUCache[LRUSize] = LRUObject {-1, DRM::AddAndRunHandler};\n}\n\nvoid DRMLRUCacheFDCache::SetFDHandler(uint32_t FD, HandlerType Handler) {\n  FDToHandler[FD] = Handler;\n}\n\nvoid DRMLRUCacheFDCache::DuplicateFD(int fd, int NewFD) {\n  auto it = FDToHandler.find(fd);\n  if (it != FDToHandler.end()) {\n    FDToHandler[NewFD] = it->second;\n  }\n}\n\nDRMLRUCacheFDCache::HandlerType DRMLRUCacheFDCache::FindHandler(int32_t FD) {\n  HandlerType Handler {};\n  for (size_t i = 0; i < LRUSize; ++i) {\n    auto& it = LRUCache[i];\n    if (it.FD == FD) {\n      if (i == 0) {\n        // If we are the first in the queue then just return it\n        return it.Handler;\n      }\n      Handler = it.Handler;\n      break;\n    }\n  }\n\n  if (Handler) {\n    AddToFront(FD, Handler);\n    return Handler;\n  }\n  return LRUCache[LRUSize].Handler;\n}\n\nvoid DRMLRUCacheFDCache::AddToFront(int32_t FD, HandlerType Handler) {\n  // Push the element to the front if we found one\n  // First copy all the other elements back one\n  // Ensuring the final element isn't written over\n  memmove(&LRUCache[1], &LRUCache[0], (LRUSize - 1) * sizeof(LRUCache[0]));\n  // Now set the first element to the one we just found\n  LRUCache[0] = LRUObject {FD, Handler};\n}\n\nuint32_t DRMLRUCacheFDCache::AddAndRunMapHandler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args) {\n  // Couldn't find in cache, check map\n  {\n    auto it = FDToHandler.find(fd);\n    if (it != FDToHandler.end()) {\n      // Found, add to the cache\n      AddToFront(fd, it->second);\n      return it->second(Frame, fd, cmd, args);\n    }\n  }\n\n  // Wasn't found in map, query it\n  drm_version Host_Version {};\n  Host_Version.name = reinterpret_cast<char*>(alloca(128));\n  Host_Version.name_len = 128;\n  uint64_t Result = ioctl(fd, DRM_IOCTL_VERSION, &Host_Version);\n\n  // Add it to the map and double check that it was added\n  // Next time around when the ioctl is used then it will be added to cache\n  if (Result != -1) {\n    DRM::AssignDeviceTypeToFD(Frame, fd, Host_Version);\n  }\n\n  auto it = FDToHandler.find(fd);\n\n  if (it == FDToHandler.end()) {\n    // We don't understand this DRM ioctl\n    return -EPERM;\n  }\n  Result = it->second(Frame, fd, cmd, args);\n  SYSCALL_ERRNO();\n}\n\nstd::array<DRMLRUCacheFDCache::HandlerType, 1U << _IOC_TYPEBITS> Handlers = []() consteval {\n  using namespace DRM;\n  using namespace sockios;\n  using namespace V4l2;\n  std::array<DRMLRUCacheFDCache::HandlerType, 1U << _IOC_TYPEBITS> Handlers {};\n\n  ///< Default fill handlers with BasicHandler.\n  for (auto& Handler : Handlers) {\n    Handler = FEX::HLE::x32::BasicHandler::BasicHandler;\n  }\n\n#define _BASIC_META(x) Handlers[_IOC_TYPE(x)] = FEX::HLE::x32::V4l2::V4l2Handler;\n#define _BASIC_META_VAR(x, args...) Handlers[_IOC_TYPE(x(args))] = FEX::HLE::x32::V4l2::V4l2Handler;\n#define _CUSTOM_META(name, ioctl_num) Handlers[_IOC_TYPE(FEX_##name)] = FEX::HLE::x32::V4l2::V4l2Handler;\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset) Handlers[_IOC_TYPE(FEX_##name)] = FEX::HLE::x32::V4l2::V4l2Handler;\n  // V4L2\n#include \"LinuxSyscalls/x32/Ioctl/v4l2.inl\"\n\n#undef _BASIC_META\n#undef _BASIC_META_VAR\n#undef _CUSTOM_META\n#undef _CUSTOM_META_OFFSET\n\n#define _BASIC_META(x) Handlers[_IOC_TYPE(x)] = FEX::HLE::x32::DRM::Handler;\n#define _BASIC_META_VAR(x, args...) Handlers[_IOC_TYPE(x(args))] = FEX::HLE::x32::DRM::Handler;\n#define _CUSTOM_META(name, ioctl_num) Handlers[_IOC_TYPE(FEX_##name)] = FEX::HLE::x32::DRM::Handler;\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset) Handlers[_IOC_TYPE(FEX_##name)] = FEX::HLE::x32::DRM::Handler;\n  // DRM\n#include \"LinuxSyscalls/x32/Ioctl/drm.inl\"\n\n#include \"LinuxSyscalls/x32/Ioctl/amdgpu_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/msm_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/i915_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/lima_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/panfrost_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/nouveau_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/radeon_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/vc4_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/v3d_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/virtio_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/panthor_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/pvr_drm.inl\"\n#include \"LinuxSyscalls/x32/Ioctl/xe_drm.inl\"\n\n#undef _BASIC_META\n#undef _BASIC_META_VAR\n#undef _CUSTOM_META\n#undef _CUSTOM_META_OFFSET\n\n  return Handlers;\n}();\n\nuint32_t ioctl32(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t request, uint32_t args) {\n  return Handlers[_IOC_TYPE(request)](Frame, fd, request, args);\n}\n\nvoid CheckAndAddFDDuplication(FEXCore::Core::CpuStateFrame* Frame, int fd, int NewFD) {\n  DRM::CheckAndAddFDDuplication(Frame, fd, NewFD);\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/IoctlEmulation.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/fextl/map.h>\n\n#include <cstdint>\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nnamespace FEX::HLE::x32 {\nclass DRMLRUCacheFDCache final {\npublic:\n  using HandlerType = uint32_t (*)(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args);\n  DRMLRUCacheFDCache();\n  void SetFDHandler(uint32_t FD, HandlerType Handler);\n  void DuplicateFD(int fd, int NewFD);\n  HandlerType FindHandler(int32_t FD);\n  uint32_t AddAndRunMapHandler(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t cmd, uint32_t args);\n\nprotected:\n  constexpr static size_t LRUSize = 3;\n  void AddToFront(int32_t FD, HandlerType Handler);\n\n  struct LRUObject {\n    int32_t FD;\n    HandlerType Handler;\n  };\n  // With four elements total (3 + 1) then this is a single cacheline in size\n  LRUObject LRUCache[LRUSize + 1];\n\n  fextl::map<int32_t, HandlerType> FDToHandler;\n};\n\nuint32_t ioctl32(FEXCore::Core::CpuStateFrame* Frame, int fd, uint32_t request, uint32_t args);\nvoid CheckAndAddFDDuplication(FEXCore::Core::CpuStateFrame* Frame, int fd, int NewFD);\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctls.inl",
    "content": "IOCTL(DRM_IOCTL_VERSION, FEX::HLE::x32::DRM::Handler)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Memory.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/Utils/MathUtils.h>\n\n#include <stddef.h>\n#include <stdint.h>\n#include <string.h>\n#include <sys/mman.h>\n#include <sys/shm.h>\n#include <system_error>\n#include <filesystem>\n\nnamespace FEX::HLE::x32 {\n\nvoid RegisterMemory(FEX::HLE::SyscallHandler* Handler) {\n  struct old_mmap_struct {\n    uint32_t addr;\n    uint32_t len;\n    uint32_t prot;\n    uint32_t flags;\n    uint32_t fd;\n    uint32_t offset;\n  };\n  REGISTER_SYSCALL_IMPL_X32(mmap, [](FEXCore::Core::CpuStateFrame* Frame, const old_mmap_struct* arg) -> uint64_t {\n    return reinterpret_cast<uint64_t>(FEX::HLE::_SyscallHandler->GuestMmap(false, Frame->Thread, reinterpret_cast<void*>(arg->addr),\n                                                                           arg->len, arg->prot, arg->flags, arg->fd, arg->offset));\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    mmap2, [](FEXCore::Core::CpuStateFrame* Frame, uint32_t addr, uint32_t length, int prot, int flags, int fd, uint32_t pgoffset) -> uint64_t {\n      return reinterpret_cast<uint64_t>(FEX::HLE::_SyscallHandler->GuestMmap(false, Frame->Thread, reinterpret_cast<void*>(addr), length,\n                                                                             prot, flags, fd, (uint64_t)pgoffset * 0x1000));\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(munmap, [](FEXCore::Core::CpuStateFrame* Frame, void* addr, size_t length) -> uint64_t {\n    return FEX::HLE::_SyscallHandler->GuestMunmap(Frame->Thread, addr, length);\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(mprotect, [](FEXCore::Core::CpuStateFrame* Frame, void* addr, uint32_t len, int prot) -> uint64_t {\n    return FEX::HLE::_SyscallHandler->GuestMprotect(Frame->Thread, addr, len, prot);\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    mremap, [](FEXCore::Core::CpuStateFrame* Frame, void* old_address, size_t old_size, size_t new_size, int flags, void* new_address) -> uint64_t {\n      return FEX::HLE::_SyscallHandler->GuestMremap(false, Frame->Thread, old_address, old_size, new_size, flags, new_address);\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(mlockall, [](FEXCore::Core::CpuStateFrame* Frame, int flags) -> uint64_t {\n    uint64_t Result = ::syscall(SYSCALL_DEF(mlock2), reinterpret_cast<void*>(0x1'0000), 0x1'0000'0000ULL - 0x1'0000, flags);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(munlockall, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t {\n    uint64_t Result = ::munlock(reinterpret_cast<void*>(0x1'0000), 0x1'0000'0000ULL - 0x1'0000);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(shmat, [](FEXCore::Core::CpuStateFrame* Frame, int shmid, const void* shmaddr, int shmflg) -> uint64_t {\n    return FEX::HLE::_SyscallHandler->GuestShmat(false, Frame->Thread, shmid, shmaddr, shmflg);\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(shmdt, [](FEXCore::Core::CpuStateFrame* Frame, const void* shmaddr) -> uint64_t {\n    return FEX::HLE::_SyscallHandler->GuestShmdt(false, Frame->Thread, shmaddr);\n  });\n}\n\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Msg.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Types.h\"\n\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n\n#include <stdint.h>\n#include <syscall.h>\n#include <time.h>\n#include <unistd.h>\n\nARG_TO_STR(FEX::HLE::x32::compat_ptr<FEX::HLE::x32::mq_attr32>, \"%lx\")\nARG_TO_STR(FEX::HLE::x32::compat_ptr<FEX::HLE::x32::sigevent32>, \"%lx\")\n\nnamespace FEX::HLE::x32 {\nvoid RegisterMsg(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X32(mq_timedsend,\n                            [](FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::mqd_t mqdes, const char* msg_ptr, size_t msg_len,\n                               unsigned int msg_prio, const struct timespec32* abs_timeout) -> uint64_t {\n                              struct timespec tp64 {};\n                              struct timespec* timed_ptr {};\n                              if (abs_timeout) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(abs_timeout, sizeof(*abs_timeout));\n                                tp64 = *abs_timeout;\n                                timed_ptr = &tp64;\n                              }\n\n                              uint64_t Result = ::syscall(SYSCALL_DEF(mq_timedsend), mqdes, msg_ptr, msg_len, msg_prio, timed_ptr);\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(mq_timedreceive,\n                            [](FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::mqd_t mqdes, char* msg_ptr, size_t msg_len,\n                               unsigned int* msg_prio, const struct timespec32* abs_timeout) -> uint64_t {\n                              struct timespec tp64 {};\n                              struct timespec* timed_ptr {};\n                              if (abs_timeout) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(abs_timeout, sizeof(*abs_timeout));\n                                tp64 = *abs_timeout;\n                                timed_ptr = &tp64;\n                              }\n\n                              uint64_t Result = ::syscall(SYSCALL_DEF(mq_timedreceive), mqdes, msg_ptr, msg_len, msg_prio, timed_ptr);\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    mq_open, [](FEXCore::Core::CpuStateFrame* Frame, const char* name, int oflag, mode_t mode, compat_ptr<FEX::HLE::x32::mq_attr32> attr) -> uint64_t {\n      mq_attr HostAttr {};\n      mq_attr* HostAttr_p {};\n      if ((oflag & O_CREAT) && attr) {\n        FaultSafeUserMemAccess::VerifyIsReadable(attr, sizeof(*attr));\n        // attr is optional unless O_CREAT is set\n        // Then attr can be valid or nullptr\n        HostAttr = *attr;\n        HostAttr_p = &HostAttr;\n      }\n      uint64_t Result = ::syscall(SYSCALL_DEF(mq_open), name, oflag, mode, HostAttr_p);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    mq_notify, [](FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::mqd_t mqdes, const compat_ptr<FEX::HLE::x32::sigevent32> sevp) -> uint64_t {\n      FaultSafeUserMemAccess::VerifyIsReadable(sevp, sizeof(*sevp));\n      sigevent Host = *sevp;\n      uint64_t Result = ::syscall(SYSCALL_DEF(mq_notify), mqdes, &Host);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(mq_getsetattr,\n                            [](FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::mqd_t mqdes, compat_ptr<FEX::HLE::x32::mq_attr32> newattr,\n                               compat_ptr<FEX::HLE::x32::mq_attr32> oldattr) -> uint64_t {\n                              mq_attr HostNew {};\n                              mq_attr* HostNew_p {};\n\n                              mq_attr HostOld {};\n                              mq_attr* HostOld_p {};\n\n                              if (newattr) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(newattr, sizeof(*newattr));\n                                HostNew = *newattr;\n                                HostNew_p = &HostNew;\n                              }\n\n                              if (oldattr) {\n                                HostOld_p = &HostOld;\n                              }\n\n                              uint64_t Result = ::syscall(SYSCALL_DEF(mq_getsetattr), mqdes, HostNew_p, HostOld_p);\n\n                              if (Result != 1 && oldattr) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(oldattr, sizeof(*oldattr));\n                                *oldattr = HostOld;\n                              }\n\n                              SYSCALL_ERRNO();\n                            });\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/NotImplemented.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include <FEXCore/Utils/LogManager.h>\n\n#include <errno.h>\n#include <stdint.h>\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nnamespace FEX::HLE::x32 {\n#define REGISTER_SYSCALL_NOT_IMPL_X32(name)                                             \\\n  REGISTER_SYSCALL_IMPL_X32(name, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { \\\n    LogMan::Msg::DFmt(\"Using deprecated/removed syscall: \" #name);                      \\\n    return -ENOSYS;                                                                     \\\n  });\n#define REGISTER_SYSCALL_NO_PERM_X32(name) \\\n  REGISTER_SYSCALL_IMPL_X32(name, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { return -EPERM; });\n\n// these are removed/not implemented in the linux kernel we present\nvoid RegisterNotImplemented(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_NOT_IMPL_X32(break);\n  REGISTER_SYSCALL_NOT_IMPL_X32(stty);\n  REGISTER_SYSCALL_NOT_IMPL_X32(gtty);\n  REGISTER_SYSCALL_NOT_IMPL_X32(prof);\n  REGISTER_SYSCALL_NOT_IMPL_X32(ftime);\n  REGISTER_SYSCALL_NOT_IMPL_X32(mpx);\n  REGISTER_SYSCALL_NOT_IMPL_X32(lock);\n  REGISTER_SYSCALL_NOT_IMPL_X32(ulimit);\n  REGISTER_SYSCALL_NOT_IMPL_X32(profil);\n  REGISTER_SYSCALL_NOT_IMPL_X32(idle);\n\n  REGISTER_SYSCALL_NO_PERM_X32(stime);\n  REGISTER_SYSCALL_NO_PERM_X32(bdflush);\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Sched.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Types.h\"\n\n#include <stdint.h>\n#include <sched.h>\n#include <time.h>\n#include <unistd.h>\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nnamespace FEX::HLE::x32 {\nvoid RegisterSched(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X32(sched_rr_get_interval, [](FEXCore::Core::CpuStateFrame* Frame, pid_t pid, struct timespec32* tp) -> uint64_t {\n    struct timespec tp64 {};\n    uint64_t Result = ::sched_rr_get_interval(pid, tp ? &tp64 : nullptr);\n    if (tp) {\n      FaultSafeUserMemAccess::VerifyIsWritable(tp, sizeof(*tp));\n      *tp = tp64;\n    }\n    SYSCALL_ERRNO();\n  });\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Semaphore.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Types.h\"\n\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <cstdint>\n#include <errno.h>\n#include <limits>\n#include <string.h>\n#include <sys/msg.h>\n#include <sys/shm.h>\n#include <time.h>\n#include <type_traits>\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nnamespace FEX::HLE::x32 {\n// Define the IPC ops\nenum IPCOp {\n  OP_SEMOP = 1,\n  OP_SEMGET = 2,\n  OP_SEMCTL = 3,\n  OP_SEMTIMEDOP = 4,\n  OP_MSGSND = 11,\n  OP_MSGRCV = 12,\n  OP_MSGGET = 13,\n  OP_MSGCTL = 14,\n  OP_SHMAT = 21,\n  OP_SHMDT = 22,\n  OP_SHMGET = 23,\n  OP_SHMCTL = 24,\n};\n\nstruct msgbuf_32 {\n  compat_long_t mtype;\n  char mtext[1];\n};\n\nunion semun_32 {\n  int32_t val;                          // Value for SETVAL\n  compat_ptr<semid_ds_32> buf32;        // struct semid_ds* - Buffer ptr for IPC_STAT, IPC_SET\n  compat_ptr<semid_ds_64> buf64;        // struct semid_ds* - Buffer ptr for IPC_STAT, IPC_SET\n  uint32_t array;                       // uint16_t array for GETALL, SETALL\n  compat_ptr<struct fex_seminfo> __buf; // struct seminfo * - Buffer for IPC_INFO\n};\n\nunion msgun_32 {\n  int32_t val;                      // Value for SETVAL\n  compat_ptr<msqid_ds_32> buf32;    // struct msgid_ds* - Buffer ptr for IPC_STAT, IPC_SET\n  compat_ptr<msqid_ds_64> buf64;    // struct msgid_ds* - Buffer ptr for IPC_STAT, IPC_SET\n  uint32_t array;                   // uint16_t array for GETALL, SETALL\n  compat_ptr<struct msginfo> __buf; // struct msginfo * - Buffer for IPC_INFO\n};\n\nunion shmun_32 {\n  int32_t val;                           // Value for SETVAL\n  compat_ptr<shmid_ds_32> buf32;         // struct shmid_ds* - Buffer ptr for IPC_STAT, IPC_SET\n  compat_ptr<shmid_ds_64> buf64;         // struct shmid_ds* - Buffer ptr for IPC_STAT, IPC_SET\n  uint32_t array;                        // uint16_t array for GETALL, SETALL\n  compat_ptr<struct shminfo_32> __buf32; // struct shminfo * - Buffer for IPC_INFO\n  compat_ptr<struct shminfo_64> __buf64; // struct shminfo * - Buffer for IPC_INFO\n\n  compat_ptr<struct shm_info_32> __buf_info_32; // struct shm_info * - Buffer for SHM_INFO\n};\n\nunion semun {\n  int val;                   /* value for SETVAL */\n  struct semid_ds_32* buf;   /* buffer for IPC_STAT & IPC_SET */\n  unsigned short* array;     /* array for GETALL & SETALL */\n  struct fex_seminfo* __buf; /* buffer for IPC_INFO */\n  void* __pad;\n};\n\nuint64_t _ipc(FEXCore::Core::CpuStateFrame* Frame, uint32_t call, uint32_t first, uint32_t second, uint32_t third, uint32_t ptr, uint32_t fifth) {\n  uint64_t Result {};\n\n  const int Version = call >> 16;\n  call &= 0xffff;\n\n  switch (static_cast<IPCOp>(call)) {\n  case OP_SEMOP: {\n    Result = ::syscall(SYSCALL_DEF(semop), first, reinterpret_cast<struct sembuf*>(ptr), second);\n    break;\n  }\n  case OP_SEMGET: {\n    Result = ::syscall(SYSCALL_DEF(semget), first, second, third);\n    break;\n  }\n  case OP_SEMCTL: {\n    uint32_t semid = first;\n    uint32_t semnum = second;\n    // Upper 16bits used for a different flag?\n    int32_t cmd = third & 0xFF;\n    auto_compat_ptr<semun_32> semun(ptr);\n    bool IPC64 = third & 0x100;\n    switch (cmd) {\n    case IPC_SET: {\n      struct semid64_ds buf {};\n      if (IPC64) {\n        FaultSafeUserMemAccess::VerifyIsReadable(semun->buf64, sizeof(*semun->buf64));\n        buf = *semun->buf64;\n      } else {\n        FaultSafeUserMemAccess::VerifyIsReadable(semun->buf32, sizeof(*semun->buf32));\n        buf = *semun->buf32;\n      }\n      Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, &buf);\n      if (Result != -1) {\n        if (IPC64) {\n          FaultSafeUserMemAccess::VerifyIsWritable(semun->buf64, sizeof(*semun->buf64));\n          *semun->buf64 = buf;\n        } else {\n          FaultSafeUserMemAccess::VerifyIsWritable(semun->buf32, sizeof(*semun->buf32));\n          *semun->buf32 = buf;\n        }\n      }\n      break;\n    }\n    case SEM_STAT:\n    case SEM_STAT_ANY:\n    case IPC_STAT: {\n      struct semid64_ds buf {};\n      Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, &buf);\n      if (Result != -1) {\n        if (IPC64) {\n          FaultSafeUserMemAccess::VerifyIsWritable(semun->buf64, sizeof(*semun->buf64));\n          *semun->buf64 = buf;\n        } else {\n          FaultSafeUserMemAccess::VerifyIsWritable(semun->buf32, sizeof(*semun->buf32));\n          *semun->buf32 = buf;\n        }\n      }\n      break;\n    }\n    case SEM_INFO:\n    case IPC_INFO: {\n      struct fex_seminfo si {};\n      Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, &si);\n      if (Result != -1) {\n        FaultSafeUserMemAccess::VerifyIsWritable(semun->__buf, sizeof(*semun->__buf));\n        memcpy(semun->__buf, &si, sizeof(si));\n      }\n      break;\n    }\n    case GETALL:\n    case SETALL: {\n      // ptr is just a int32_t* in this case\n      Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, semun->array);\n      break;\n    }\n    case SETVAL: {\n      // ptr is just a int32_t in this case\n      Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, semun->val);\n      break;\n    }\n    case IPC_RMID:\n    case GETPID:\n    case GETNCNT:\n    case GETZCNT:\n    case GETVAL: Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled semctl cmd: {}\", cmd); return -EINVAL;\n    }\n    break;\n  }\n  case OP_SEMTIMEDOP: {\n    timespec32* timeout = reinterpret_cast<timespec32*>(fifth);\n    struct timespec tp64 {};\n    struct timespec* timed_ptr {};\n    if (timeout) {\n      FaultSafeUserMemAccess::VerifyIsReadable(timeout, sizeof(*timeout));\n      tp64 = *timeout;\n      timed_ptr = &tp64;\n    }\n\n    Result = ::syscall(SYSCALL_DEF(semtimedop), first, reinterpret_cast<struct sembuf*>(ptr), second, timed_ptr);\n    break;\n  }\n  case OP_MSGSND: {\n    // Requires a temporary buffer\n    fextl::vector<uint8_t> Tmp(second + sizeof(size_t));\n    struct msgbuf* TmpMsg = reinterpret_cast<struct msgbuf*>(Tmp.data());\n    msgbuf_32* src = reinterpret_cast<msgbuf_32*>(ptr);\n    FaultSafeUserMemAccess::VerifyIsReadable(src, sizeof(*src));\n    FaultSafeUserMemAccess::VerifyIsReadable(src->mtext, second);\n    TmpMsg->mtype = src->mtype;\n    memcpy(TmpMsg->mtext, src->mtext, second);\n\n    Result = ::syscall(SYSCALL_DEF(msgsnd), first, TmpMsg, second, third);\n    break;\n  }\n  case OP_MSGRCV: {\n    fextl::vector<uint8_t> Tmp(second + sizeof(size_t));\n    struct msgbuf* TmpMsg = reinterpret_cast<struct msgbuf*>(Tmp.data());\n\n    if (Version != 0) {\n      Result = ::syscall(SYSCALL_DEF(msgrcv), first, TmpMsg, second, fifth, third);\n      if (Result != -1) {\n        msgbuf_32* src = reinterpret_cast<msgbuf_32*>(ptr);\n        FaultSafeUserMemAccess::VerifyIsWritable(src, sizeof(*src));\n        FaultSafeUserMemAccess::VerifyIsWritable(src->mtext, Result);\n        src->mtype = TmpMsg->mtype;\n        memcpy(src->mtext, TmpMsg->mtext, Result);\n      }\n\n    } else {\n      struct compat_ipc_kludge {\n        compat_uptr_t msgp;\n        compat_long_t msgtyp;\n      };\n      compat_ipc_kludge* ipck = reinterpret_cast<compat_ipc_kludge*>(ptr);\n      Result = ::syscall(SYSCALL_DEF(msgrcv), first, TmpMsg, second, ipck->msgtyp, third);\n      if (Result != -1) {\n        msgbuf_32* src = reinterpret_cast<msgbuf_32*>(ipck->msgp);\n        FaultSafeUserMemAccess::VerifyIsWritable(src, sizeof(*src));\n        FaultSafeUserMemAccess::VerifyIsWritable(src->mtext, Result);\n        ipck->msgtyp = TmpMsg->mtype;\n        memcpy(src->mtext, TmpMsg->mtext, Result);\n      }\n    }\n\n    break;\n  }\n  case OP_MSGGET: {\n    Result = ::syscall(SYSCALL_DEF(msgget), first, second);\n    break;\n  }\n  case OP_MSGCTL: {\n    uint32_t msqid = first;\n    int32_t cmd = second & 0xFF;\n    msgun_32 msgun {};\n    msgun.val = ptr;\n    bool IPC64 = second & 0x100;\n    switch (cmd) {\n    case IPC_SET: {\n      struct msqid64_ds buf {};\n      if (IPC64) {\n        FaultSafeUserMemAccess::VerifyIsReadable(msgun.buf64, sizeof(*msgun.buf64));\n        buf = *msgun.buf64;\n      } else {\n        FaultSafeUserMemAccess::VerifyIsReadable(msgun.buf32, sizeof(*msgun.buf32));\n        buf = *msgun.buf32;\n      }\n      Result = ::syscall(SYSCALL_DEF(msgctl), msqid, cmd, &buf);\n      break;\n    }\n    case MSG_STAT:\n    case MSG_STAT_ANY:\n    case IPC_STAT: {\n      struct msqid64_ds buf {};\n      Result = ::syscall(SYSCALL_DEF(msgctl), msqid, cmd, &buf);\n      if (Result != -1) {\n        if (IPC64) {\n          FaultSafeUserMemAccess::VerifyIsWritable(msgun.buf64, sizeof(*msgun.buf64));\n          *msgun.buf64 = buf;\n        } else {\n          FaultSafeUserMemAccess::VerifyIsWritable(msgun.buf32, sizeof(*msgun.buf32));\n          *msgun.buf32 = buf;\n        }\n      }\n      break;\n    }\n    case MSG_INFO:\n    case IPC_INFO: {\n      struct msginfo mi {};\n      Result = ::syscall(SYSCALL_DEF(msgctl), msqid, cmd, reinterpret_cast<struct msqid_ds*>(&mi));\n      if (Result != -1) {\n        FaultSafeUserMemAccess::VerifyIsWritable(msgun.__buf, sizeof(mi));\n        memcpy(msgun.__buf, &mi, sizeof(mi));\n      }\n      break;\n    }\n    case IPC_RMID: Result = ::syscall(SYSCALL_DEF(msgctl), msqid, cmd, nullptr); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled msgctl cmd: {}\", cmd); return -EINVAL;\n    }\n    break;\n  }\n  case OP_SHMAT: {\n    if (Version == 1) {\n      // shmat explicitly doesn't support version 1.\n      return -EINVAL;\n    }\n    auto Result = FEX::HLE::_SyscallHandler->GuestShmat(false, Frame->Thread, first, reinterpret_cast<const void*>(ptr), second);\n    if (!FEX::HLE::HasSyscallError(Result)) {\n      *reinterpret_cast<uint32_t*>(third) = Result;\n    }\n    return Result;\n  }\n  case OP_SHMDT: {\n    return FEX::HLE::_SyscallHandler->GuestShmdt(false, Frame->Thread, reinterpret_cast<const void*>(ptr));\n  }\n  case OP_SHMGET: {\n    Result = ::shmget(first, second, third);\n    break;\n  }\n  case OP_SHMCTL: {\n    int32_t shmid = first;\n    int32_t shmcmd = second;\n    int32_t cmd = shmcmd & 0xFF;\n    bool IPC64 = shmcmd & 0x100;\n    shmun_32 shmun {};\n    shmun.val = reinterpret_cast<uint32_t>(ptr);\n\n    switch (cmd) {\n    case IPC_SET: {\n      struct shmid64_ds buf {};\n      if (IPC64) {\n        FaultSafeUserMemAccess::VerifyIsReadable(shmun.buf64, sizeof(*shmun.buf64));\n        buf = *shmun.buf64;\n      } else {\n        FaultSafeUserMemAccess::VerifyIsReadable(shmun.buf32, sizeof(*shmun.buf32));\n        buf = *shmun.buf32;\n      }\n      Result = ::syscall(SYSCALL_DEF(shmctl), shmid, cmd, &buf);\n      // IPC_SET sets the internal data structure that the kernel uses\n      // No need to writeback\n      break;\n    }\n    case SHM_STAT:\n    case SHM_STAT_ANY:\n    case IPC_STAT: {\n      struct shmid64_ds buf {};\n      Result = ::syscall(SYSCALL_DEF(shmctl), shmid, cmd, &buf);\n      if (Result != -1) {\n        if (IPC64) {\n          FaultSafeUserMemAccess::VerifyIsWritable(shmun.buf64, sizeof(*shmun.buf64));\n          *shmun.buf64 = buf;\n        } else {\n          FaultSafeUserMemAccess::VerifyIsWritable(shmun.buf32, sizeof(*shmun.buf32));\n          *shmun.buf32 = buf;\n        }\n      }\n      break;\n    }\n    case IPC_INFO: {\n      struct shminfo si {};\n      Result = ::syscall(SYSCALL_DEF(shmctl), shmid, cmd, reinterpret_cast<struct shmid_ds*>(&si));\n      if (Result != -1) {\n        if (IPC64) {\n          FaultSafeUserMemAccess::VerifyIsWritable(shmun.__buf64, sizeof(*shmun.__buf64));\n          *shmun.__buf64 = si;\n        } else {\n          FaultSafeUserMemAccess::VerifyIsWritable(shmun.__buf32, sizeof(*shmun.__buf32));\n          *shmun.__buf32 = si;\n        }\n      }\n      break;\n    }\n    case SHM_INFO: {\n      struct shm_info si {};\n      Result = ::syscall(SYSCALL_DEF(shmctl), shmid, cmd, reinterpret_cast<struct shmid_ds*>(&si));\n      if (Result != -1) {\n        FaultSafeUserMemAccess::VerifyIsWritable(shmun.__buf_info_32, sizeof(*shmun.__buf_info_32));\n        // SHM_INFO doesn't follow IPC64 behaviour\n        *shmun.__buf_info_32 = si;\n      }\n      break;\n    }\n    case SHM_LOCK: Result = ::syscall(SYSCALL_DEF(shmctl), shmid, cmd, nullptr); break;\n    case SHM_UNLOCK: Result = ::syscall(SYSCALL_DEF(shmctl), shmid, cmd, nullptr); break;\n    case IPC_RMID: Result = ::syscall(SYSCALL_DEF(shmctl), shmid, cmd, nullptr); break;\n\n    default: LOGMAN_MSG_A_FMT(\"Unhandled shmctl cmd: {}\", cmd); return -EINVAL;\n    }\n    break;\n  }\n\n  default: return -ENOSYS;\n  }\n  SYSCALL_ERRNO();\n}\nvoid RegisterSemaphore(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X32(ipc, _ipc);\n\n  REGISTER_SYSCALL_IMPL_X32(semctl, [](FEXCore::Core::CpuStateFrame* Frame, int semid, int semnum, int cmd, semun_32* semun) -> uint64_t {\n    uint64_t Result {};\n    bool IPC64 = cmd & 0x100;\n\n    switch (cmd) {\n    case IPC_SET: {\n      struct semid64_ds buf {};\n      if (IPC64) {\n        FaultSafeUserMemAccess::VerifyIsReadable(semun->buf64, sizeof(*semun->buf64));\n        buf = *semun->buf64;\n      } else {\n        FaultSafeUserMemAccess::VerifyIsReadable(semun->buf32, sizeof(*semun->buf32));\n        buf = *semun->buf32;\n      }\n      Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, &buf);\n      if (Result != -1) {\n        if (IPC64) {\n          FaultSafeUserMemAccess::VerifyIsWritable(semun->buf64, sizeof(*semun->buf64));\n          *semun->buf64 = buf;\n        } else {\n          FaultSafeUserMemAccess::VerifyIsWritable(semun->buf32, sizeof(*semun->buf32));\n          *semun->buf32 = buf;\n        }\n      }\n      break;\n    }\n    case SEM_STAT:\n    case SEM_STAT_ANY:\n    case IPC_STAT: {\n      struct semid64_ds buf {};\n      Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, &buf);\n      if (Result != -1) {\n        if (IPC64) {\n          FaultSafeUserMemAccess::VerifyIsWritable(semun->buf64, sizeof(*semun->buf64));\n          *semun->buf64 = buf;\n        } else {\n          FaultSafeUserMemAccess::VerifyIsWritable(semun->buf32, sizeof(*semun->buf32));\n          *semun->buf32 = buf;\n        }\n      }\n      break;\n    }\n    case SEM_INFO:\n    case IPC_INFO: {\n      struct fex_seminfo si {};\n      Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, &si);\n      if (Result != -1) {\n        FaultSafeUserMemAccess::VerifyIsWritable(semun->__buf, sizeof(*semun->__buf));\n        memcpy(semun->__buf, &si, sizeof(si));\n      }\n      break;\n    }\n    case GETALL:\n    case SETALL: {\n      // ptr is just a int32_t* in this case\n      Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, semun->array);\n      break;\n    }\n    case SETVAL: {\n      // ptr is just a int32_t in this case\n      Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, semun->val);\n      break;\n    }\n    case IPC_RMID:\n    case GETPID:\n    case GETNCNT:\n    case GETZCNT:\n    case GETVAL: Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, semun); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled semctl cmd: {}\", cmd); return -EINVAL;\n    }\n    SYSCALL_ERRNO();\n  });\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Signals.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"ArchHelpers/UContext.h\"\n#include \"LinuxSyscalls/SignalDelegator.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Types.h\"\n\n#include <FEXCore/Core/SignalDelegator.h>\n#include <errno.h>\n#include <signal.h>\n#include <stdint.h>\n#include <sys/syscall.h>\n#include <unistd.h>\n\n#include <time.h>\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nARG_TO_STR(FEX::HLE::x32::compat_ptr<FEXCore::x86::siginfo_t>, \"%lx\")\n\nnamespace FEX::HLE::x32 {\nvoid CopySigInfo(FEXCore::x86::siginfo_t* Info, const siginfo_t& Host) {\n  // Copy the basic things first\n  Info->si_signo = Host.si_signo;\n  Info->si_errno = Host.si_errno;\n  Info->si_code = Host.si_code;\n\n  // Check si_code to determine how we need to interpret this\n  if (Info->si_code == SI_TIMER) {\n    // SI_TIMER means pid, uid, value\n    Info->_sifields._timer.tid = Host.si_timerid;\n    Info->_sifields._timer.overrun = Host.si_overrun;\n    Info->_sifields._timer.sigval.sival_int = Host.si_value.sival_int;\n  } else {\n    // Now we need to copy over the more complex things\n    switch (Info->si_signo) {\n    case SIGSEGV:\n    case SIGBUS:\n      // This is the address trying to be accessed, not the RIP\n      Info->_sifields._sigfault.addr = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(Host.si_addr));\n      break;\n    case SIGFPE:\n    case SIGILL:\n      // Can't really give a real result here. This is the RIP causing a sigill or sigfpe\n      // Claim at RIP 0 for now\n      Info->_sifields._sigfault.addr = 0;\n      break;\n    case SIGCHLD:\n      Info->_sifields._sigchld.pid = Host.si_pid;\n      Info->_sifields._sigchld.uid = Host.si_uid;\n      Info->_sifields._sigchld.status = Host.si_status;\n      Info->_sifields._sigchld.utime = Host.si_utime;\n      Info->_sifields._sigchld.stime = Host.si_stime;\n      break;\n    case SIGALRM:\n    case SIGVTALRM:\n      Info->_sifields._timer.tid = Host.si_timerid;\n      Info->_sifields._timer.overrun = Host.si_overrun;\n      Info->_sifields._timer.sigval.sival_int = Host.si_int;\n      break;\n    default: LogMan::Msg::EFmt(\"Unhandled siginfo_t for sigtimedwait: {}\", Info->si_signo); break;\n    }\n  }\n}\n\nvoid RegisterSignals(FEX::HLE::SyscallHandler* Handler) {\n\n  // Only gets the lower 32-bits of the signal mask\n  REGISTER_SYSCALL_IMPL_X32(sgetmask, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t {\n    uint64_t Set {};\n    FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSigProcMask(FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame), 0, nullptr, &Set);\n    return Set & ~0U;\n  });\n\n  // Only controls the lower 32-bits of the signal mask\n  // Blocks the upper 32-bits\n  REGISTER_SYSCALL_IMPL_X32(ssetmask, [](FEXCore::Core::CpuStateFrame* Frame, uint32_t New) -> uint64_t {\n    uint64_t Set {};\n    uint64_t NewSet = (~0ULL << 32) | New;\n    FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSigProcMask(FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame),\n                                                                      SIG_SETMASK, &NewSet, &Set);\n    return Set & ~0U;\n  });\n\n  // Only masks the lower 32-bits of the signal mask\n  // The upper 32-bits are still active (unmasked) and can signal the program\n  REGISTER_SYSCALL_IMPL_X32(sigsuspend, [](FEXCore::Core::CpuStateFrame* Frame, uint32_t Mask) -> uint64_t {\n    uint64_t Mask64 = Mask;\n    return FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSigSuspend(FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame), &Mask64, 8);\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(sigpending, [](FEXCore::Core::CpuStateFrame* Frame, compat_old_sigset_t* set) -> uint64_t {\n    uint64_t HostSet {};\n    uint64_t Result =\n      FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSigPending(FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame), &HostSet, 8);\n    if (Result == 0) {\n      // This old interface only returns the lower signals\n      FaultSafeUserMemAccess::VerifyIsWritable(set, sizeof(*set));\n      *set = HostSet & ~0U;\n    }\n    return Result;\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(signal, [](FEXCore::Core::CpuStateFrame* Frame, int signum, uint32_t handler) -> uint64_t {\n    GuestSigAction newact {};\n    GuestSigAction oldact {};\n    newact.sigaction_handler.handler = reinterpret_cast<decltype(newact.sigaction_handler.handler)>(handler);\n    FEX::HLE::_SyscallHandler->GetSignalDelegator()->RegisterGuestSignalHandler(signum, &newact, &oldact);\n    return static_cast<uint32_t>(reinterpret_cast<uint64_t>(oldact.sigaction_handler.handler));\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    sigaction, [](FEXCore::Core::CpuStateFrame* Frame, int signum, const OldGuestSigAction_32* act, OldGuestSigAction_32* oldact) -> uint64_t {\n      GuestSigAction* act64_p {};\n      GuestSigAction* old64_p {};\n\n      GuestSigAction act64 {};\n      if (act) {\n        FaultSafeUserMemAccess::VerifyIsReadable(act, sizeof(*act));\n        act64 = *act;\n        act64_p = &act64;\n      }\n      GuestSigAction old64 {};\n\n      if (oldact) {\n        old64_p = &old64;\n      }\n\n      uint64_t Result = FEX::HLE::_SyscallHandler->GetSignalDelegator()->RegisterGuestSignalHandler(signum, act64_p, old64_p);\n      if (Result == 0 && oldact) {\n        FaultSafeUserMemAccess::VerifyIsWritable(oldact, sizeof(*oldact));\n        *oldact = old64;\n      }\n\n      return Result;\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    rt_sigaction,\n    [](FEXCore::Core::CpuStateFrame* Frame, int signum, const GuestSigAction_32* act, GuestSigAction_32* oldact, size_t sigsetsize) -> uint64_t {\n      if (sigsetsize != 8) {\n        return -EINVAL;\n      }\n\n      GuestSigAction* act64_p {};\n      GuestSigAction* old64_p {};\n\n      GuestSigAction act64 {};\n      if (act) {\n        FaultSafeUserMemAccess::VerifyIsReadable(act, sizeof(*act));\n        act64 = *act;\n        act64_p = &act64;\n      }\n      GuestSigAction old64 {};\n\n      if (oldact) {\n        old64_p = &old64;\n      }\n\n      uint64_t Result = FEX::HLE::_SyscallHandler->GetSignalDelegator()->RegisterGuestSignalHandler(signum, act64_p, old64_p);\n      if (Result == 0 && oldact) {\n        FaultSafeUserMemAccess::VerifyIsWritable(oldact, sizeof(*oldact));\n        *oldact = old64;\n      }\n\n      return Result;\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(rt_sigtimedwait,\n                            [](FEXCore::Core::CpuStateFrame* Frame, uint64_t* set, compat_ptr<FEXCore::x86::siginfo_t> info,\n                               const struct timespec32* timeout, size_t sigsetsize) -> uint64_t {\n                              struct timespec* timeout_ptr {};\n                              struct timespec tp64 {};\n                              if (timeout) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(timeout, sizeof(*timeout));\n                                tp64 = *timeout;\n                                timeout_ptr = &tp64;\n                              }\n\n                              siginfo_t HostInfo {};\n                              uint64_t Result =\n                                FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSigTimedWait(set, &HostInfo, timeout_ptr, sigsetsize);\n                              if (Result != -1) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(info, sizeof(*info));\n                                // We need to translate the 64-bit siginfo_t to 32-bit siginfo_t\n                                CopySigInfo(info, HostInfo);\n                              }\n                              return Result;\n                            });\n\n\n  REGISTER_SYSCALL_IMPL_X32(rt_sigtimedwait_time64,\n                            [](FEXCore::Core::CpuStateFrame* Frame, uint64_t* set, compat_ptr<FEXCore::x86::siginfo_t> info,\n                               const struct timespec* timeout, size_t sigsetsize) -> uint64_t {\n                              siginfo_t HostInfo {};\n                              uint64_t Result =\n                                FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSigTimedWait(set, &HostInfo, timeout, sigsetsize);\n                              if (Result != -1) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(info, sizeof(*info));\n                                // We need to translate the 64-bit siginfo_t to 32-bit siginfo_t\n                                CopySigInfo(info, HostInfo);\n                              }\n                              return Result;\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    pidfd_send_signal,\n    [](FEXCore::Core::CpuStateFrame* Frame, int pidfd, int sig, compat_ptr<FEXCore::x86::siginfo_t> info, unsigned int flags) -> uint64_t {\n      siginfo_t* InfoHost_ptr {};\n      siginfo_t InfoHost {};\n      if (info) {\n        FaultSafeUserMemAccess::VerifyIsReadable(info, sizeof(*info));\n        InfoHost = *info;\n        InfoHost_ptr = &InfoHost;\n      }\n\n      uint64_t Result = ::syscall(SYSCALL_DEF(pidfd_send_signal), pidfd, sig, InfoHost_ptr, flags);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    rt_sigqueueinfo, [](FEXCore::Core::CpuStateFrame* Frame, pid_t pid, int sig, compat_ptr<FEXCore::x86::siginfo_t> info) -> uint64_t {\n      siginfo_t info64 {};\n      siginfo_t* info64_p {};\n\n      if (info) {\n        FaultSafeUserMemAccess::VerifyIsReadable(info, sizeof(*info));\n        info64 = *info;\n        info64_p = &info64;\n      }\n\n      uint64_t Result = ::syscall(SYSCALL_DEF(rt_sigqueueinfo), pid, sig, info64_p);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    rt_tgsigqueueinfo, [](FEXCore::Core::CpuStateFrame* Frame, pid_t tgid, pid_t tid, int sig, compat_ptr<FEXCore::x86::siginfo_t> info) -> uint64_t {\n      siginfo_t info64 {};\n      siginfo_t* info64_p {};\n\n      if (info) {\n        FaultSafeUserMemAccess::VerifyIsReadable(info, sizeof(*info));\n        info64 = *info;\n        info64_p = &info64;\n      }\n\n      uint64_t Result = ::syscall(SYSCALL_DEF(rt_tgsigqueueinfo), tgid, tid, sig, info64_p);\n      SYSCALL_ERRNO();\n    });\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Socket.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Types.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <alloca.h>\n#include <cstdint>\n#include <cstring>\n#include <memory>\n#include <stddef.h>\n#include <sys/socket.h>\n#include <unistd.h>\n\nARG_TO_STR(FEX::HLE::x32::auto_compat_ptr<FEX::HLE::x32::mmsghdr_32>, \"%lx\")\nARG_TO_STR(FEX::HLE::x32::auto_compat_ptr<void>, \"%lx\")\nARG_TO_STR(FEX::HLE::x32::auto_compat_ptr<uint32_t>, \"%lx\")\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nnamespace FEX::HLE::x32 {\n\n// Some sockopt defines for older build environments\n#ifndef SO_RCVTIMEO_OLD\n#define SO_RCVTIMEO_OLD 20\n#endif\n#ifndef SO_SNDTIMEO_OLD\n#define SO_SNDTIMEO_OLD 21\n#endif\n#ifndef SO_TIMESTAMP_OLD\n#define SO_TIMESTAMP_OLD 29\n#endif\n#ifndef SO_TIMESTAMPNS_OLD\n#define SO_TIMESTAMPNS_OLD 35\n#endif\n#ifndef SO_TIMESTAMPING_OLD\n#define SO_TIMESTAMPING_OLD 37\n#endif\n#ifndef SO_MEMINFO\n#define SO_MEMINFO 55\n#endif\n#ifndef SO_INCOMING_NAPI_ID\n#define SO_INCOMING_NAPI_ID 56\n#endif\n#ifndef SO_PEERGROUPS\n#define SO_PEERGROUPS 59\n#endif\n#ifndef SO_ZEROCOPY\n#define SO_ZEROCOPY 60\n#endif\n#ifndef SO_TXTIME\n#define SO_TXTIME 61\n#endif\n#ifndef SO_BINDTOIFINDEX\n#define SO_BINDTOIFINDEX 62\n#endif\n#ifndef SO_TIMESTAMP_NEW\n#define SO_TIMESTAMP_NEW 63\n#endif\n#ifndef SO_TIMESTAMPNS_NEW\n#define SO_TIMESTAMPNS_NEW 64\n#endif\n#ifndef SO_TIMESTAMPING_NEW\n#define SO_TIMESTAMPING_NEW 65\n#endif\n#ifndef SO_RCVTIMEO_NEW\n#define SO_RCVTIMEO_NEW 66\n#endif\n#ifndef SO_SNDTIMEO_NEW\n#define SO_SNDTIMEO_NEW 67\n#endif\n#ifndef SO_DETACH_REUSEPORT_BPF\n#define SO_DETACH_REUSEPORT_BPF 68\n#endif\n#ifndef SO_PREFER_BUSY_POLL\n#define SO_PREFER_BUSY_POLL 69\n#endif\n#ifndef SO_BUSY_POLL_BUDGET\n#define SO_BUSY_POLL_BUDGET 70\n#endif\n#ifndef SO_NETNS_COOKIE\n#define SO_NETNS_COOKIE 71\n#endif\n#ifndef SO_BUF_LOCK\n#define SO_BUF_LOCK 72\n#endif\n#ifndef SO_RESERVE_MEM\n#define SO_RESERVE_MEM 73\n#endif\n#ifndef SO_TXREHASH\n#define SO_TXREHASH 74\n#endif\n#ifndef SO_RCVMARK\n#define SO_RCVMARK 75\n#endif\n#ifndef SO_PASSPIDFD\n#define SO_PASSPIDFD 76\n#endif\n#ifndef SO_PEERPIDFD\n#define SO_PEERPIDFD 77\n#endif\n\nenum SockOp {\n  OP_SOCKET = 1,\n  OP_BIND = 2,\n  OP_CONNECT = 3,\n  OP_LISTEN = 4,\n  OP_ACCEPT = 5,\n  OP_GETSOCKNAME = 6,\n  OP_GETPEERNAME = 7,\n  OP_SOCKETPAIR = 8,\n  OP_SEND = 9,\n  OP_RECV = 10,\n  OP_SENDTO = 11,\n  OP_RECVFROM = 12,\n  OP_SHUTDOWN = 13,\n  OP_SETSOCKOPT = 14,\n  OP_GETSOCKOPT = 15,\n  OP_SENDMSG = 16,\n  OP_RECVMSG = 17,\n  OP_ACCEPT4 = 18,\n  OP_RECVMMSG = 19,\n  OP_SENDMMSG = 20,\n};\n\nstatic uint64_t SendMsg(int sockfd, const struct msghdr32* msg, int flags) {\n  struct msghdr HostHeader {};\n  fextl::vector<iovec> Host_iovec(msg->msg_iovlen);\n  for (size_t i = 0; i < msg->msg_iovlen; ++i) {\n    Host_iovec[i] = msg->msg_iov[i];\n  }\n\n  HostHeader.msg_name = msg->msg_name;\n  HostHeader.msg_namelen = msg->msg_namelen;\n\n  HostHeader.msg_iov = Host_iovec.data();\n  HostHeader.msg_iovlen = msg->msg_iovlen;\n\n  HostHeader.msg_control = alloca(msg->msg_controllen * 2);\n  HostHeader.msg_controllen = msg->msg_controllen;\n\n  HostHeader.msg_flags = msg->msg_flags;\n  if (HostHeader.msg_controllen) {\n    void* CurrentGuestPtr = msg->msg_control;\n    struct cmsghdr* CurrentHost = reinterpret_cast<struct cmsghdr*>(HostHeader.msg_control);\n\n    for (cmsghdr32* msghdr_guest = reinterpret_cast<cmsghdr32*>(CurrentGuestPtr); CurrentGuestPtr != 0;\n         msghdr_guest = reinterpret_cast<cmsghdr32*>(CurrentGuestPtr)) {\n\n      CurrentHost->cmsg_level = msghdr_guest->cmsg_level;\n      CurrentHost->cmsg_type = msghdr_guest->cmsg_type;\n\n      if (msghdr_guest->cmsg_len) {\n        size_t SizeIncrease = (CMSG_LEN(0) - sizeof(cmsghdr32));\n        CurrentHost->cmsg_len = msghdr_guest->cmsg_len + SizeIncrease;\n        HostHeader.msg_controllen += SizeIncrease;\n        memcpy(CMSG_DATA(CurrentHost), msghdr_guest->cmsg_data, msghdr_guest->cmsg_len - sizeof(cmsghdr32));\n      }\n\n      // Go to next host\n      CurrentHost = CMSG_NXTHDR(&HostHeader, CurrentHost);\n\n      // Go to next msg\n      if (msghdr_guest->cmsg_len < sizeof(cmsghdr32)) {\n        CurrentGuestPtr = nullptr;\n      } else {\n        CurrentGuestPtr = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(CurrentGuestPtr) + msghdr_guest->cmsg_len);\n        CurrentGuestPtr = reinterpret_cast<void*>((reinterpret_cast<uintptr_t>(CurrentGuestPtr) + 3) & ~3ULL);\n        if (CurrentGuestPtr >= reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(static_cast<void*>(msg->msg_control)) + msg->msg_controllen)) {\n          CurrentGuestPtr = nullptr;\n        }\n      }\n    }\n  }\n\n  uint64_t Result = ::sendmsg(sockfd, &HostHeader, flags);\n  SYSCALL_ERRNO();\n}\n\nstatic uint64_t RecvMsg(int sockfd, struct msghdr32* msg, int flags) {\n  struct msghdr HostHeader {};\n  fextl::vector<iovec> Host_iovec(msg->msg_iovlen);\n  for (size_t i = 0; i < msg->msg_iovlen; ++i) {\n    Host_iovec[i] = msg->msg_iov[i];\n  }\n\n  HostHeader.msg_name = msg->msg_name;\n  HostHeader.msg_namelen = msg->msg_namelen;\n\n  HostHeader.msg_iov = Host_iovec.data();\n  HostHeader.msg_iovlen = msg->msg_iovlen;\n\n  HostHeader.msg_control = alloca(msg->msg_controllen * 2);\n  HostHeader.msg_controllen = msg->msg_controllen * 2;\n\n  HostHeader.msg_flags = msg->msg_flags;\n\n  uint64_t Result = ::recvmsg(sockfd, &HostHeader, flags);\n  if (Result != -1) {\n    for (size_t i = 0; i < msg->msg_iovlen; ++i) {\n      msg->msg_iov[i] = Host_iovec[i];\n    }\n\n    msg->msg_namelen = HostHeader.msg_namelen;\n    msg->msg_controllen = HostHeader.msg_controllen;\n    msg->msg_flags = HostHeader.msg_flags;\n    if (HostHeader.msg_controllen) {\n      // Host and guest cmsg data structures aren't compatible.\n      // Copy them over now\n      void* CurrentGuestPtr = msg->msg_control;\n      for (struct cmsghdr* cmsg = CMSG_FIRSTHDR(&HostHeader); cmsg != nullptr; cmsg = CMSG_NXTHDR(&HostHeader, cmsg)) {\n        cmsghdr32* CurrentGuest = reinterpret_cast<cmsghdr32*>(CurrentGuestPtr);\n\n        // Copy over the header first\n        // cmsg_len needs to be adjusted by the size of the header between host and guest\n        // Host is 16 bytes, guest is 12 bytes\n        CurrentGuest->cmsg_level = cmsg->cmsg_level;\n        CurrentGuest->cmsg_type = cmsg->cmsg_type;\n\n        // Now copy over the data\n        if (cmsg->cmsg_len) {\n          size_t SizeIncrease = (CMSG_LEN(0) - sizeof(cmsghdr32));\n          CurrentGuest->cmsg_len = cmsg->cmsg_len - SizeIncrease;\n\n          // Controllen size also changes\n          msg->msg_controllen -= SizeIncrease;\n\n          memcpy(CurrentGuest->cmsg_data, CMSG_DATA(cmsg), cmsg->cmsg_len - sizeof(struct cmsghdr));\n          CurrentGuestPtr = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(CurrentGuestPtr) + CurrentGuest->cmsg_len);\n          CurrentGuestPtr = reinterpret_cast<void*>((reinterpret_cast<uintptr_t>(CurrentGuestPtr) + 3) & ~3ULL);\n        }\n      }\n    }\n  }\n  SYSCALL_ERRNO();\n}\n\nvoid ConvertHeaderToHost(fextl::vector<iovec>& iovec, struct msghdr* Host, const struct msghdr32* Guest, fextl::vector<uint8_t>& ControlLen,\n                         size_t& ControlLenOffset) {\n  size_t CurrentIOVecSize = iovec.size();\n  iovec.resize(CurrentIOVecSize + Guest->msg_iovlen);\n  for (size_t i = 0; i < Guest->msg_iovlen; ++i) {\n    iovec[CurrentIOVecSize + i] = Guest->msg_iov[i];\n  }\n\n  Host->msg_name = Guest->msg_name;\n  Host->msg_namelen = Guest->msg_namelen;\n\n  Host->msg_iov = &iovec[CurrentIOVecSize];\n  Host->msg_iovlen = Guest->msg_iovlen;\n\n  Host->msg_control = &ControlLen[ControlLenOffset];\n  Host->msg_controllen = Guest->msg_controllen * 2;\n  ControlLenOffset += Host->msg_controllen;\n\n  Host->msg_flags = Guest->msg_flags;\n}\n\nvoid ConvertHeaderToGuest(struct msghdr32* Guest, struct msghdr* Host) {\n  for (size_t i = 0; i < Guest->msg_iovlen; ++i) {\n    Guest->msg_iov[i] = Host->msg_iov[i];\n  }\n\n  Guest->msg_namelen = Host->msg_namelen;\n  Guest->msg_controllen = Host->msg_controllen;\n  Guest->msg_flags = Host->msg_flags;\n\n  if (Host->msg_controllen) {\n    // Host and guest cmsg data structures aren't compatible.\n    // Copy them over now\n    void* CurrentGuestPtr = Guest->msg_control;\n    for (struct cmsghdr* cmsg = CMSG_FIRSTHDR(Host); cmsg != nullptr; cmsg = CMSG_NXTHDR(Host, cmsg)) {\n      cmsghdr32* CurrentGuest = reinterpret_cast<cmsghdr32*>(CurrentGuestPtr);\n\n      // Copy over the header first\n      // cmsg_len needs to be adjusted by the size of the header between host and guest\n      // Host is 16 bytes, guest is 12 bytes\n      CurrentGuest->cmsg_level = cmsg->cmsg_level;\n      CurrentGuest->cmsg_type = cmsg->cmsg_type;\n\n      // Now copy over the data\n      if (cmsg->cmsg_len) {\n        size_t SizeIncrease = (CMSG_LEN(0) - sizeof(cmsghdr32));\n        CurrentGuest->cmsg_len = cmsg->cmsg_len - SizeIncrease;\n\n        // Controllen size also changes\n        Guest->msg_controllen -= SizeIncrease;\n\n        memcpy(CurrentGuest->cmsg_data, CMSG_DATA(cmsg), cmsg->cmsg_len - sizeof(struct cmsghdr));\n        CurrentGuestPtr = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(CurrentGuestPtr) + CurrentGuest->cmsg_len);\n        CurrentGuestPtr = reinterpret_cast<void*>((reinterpret_cast<uintptr_t>(CurrentGuestPtr) + 3) & ~3ULL);\n      }\n    }\n  }\n}\n\nstatic uint64_t RecvMMsg(int sockfd, auto_compat_ptr<mmsghdr_32> msgvec, uint32_t vlen, int flags, struct timespec* timeout_ts) {\n  fextl::vector<iovec> Host_iovec;\n  fextl::vector<struct mmsghdr> HostMHeader(vlen);\n  fextl::vector<uint8_t> control_len;\n\n  size_t total_control_len {};\n  for (size_t i = 0; i < vlen; ++i) {\n    auto Guest = &msgvec[i].msg_hdr;\n    total_control_len += Guest->msg_controllen * 2;\n  }\n  control_len.resize(total_control_len);\n\n  size_t CurrentControlLen {};\n  for (size_t i = 0; i < vlen; ++i) {\n    ConvertHeaderToHost(Host_iovec, &HostMHeader[i].msg_hdr, &msgvec[i].msg_hdr, control_len, CurrentControlLen);\n    HostMHeader[i].msg_len = msgvec[i].msg_len;\n  }\n  uint64_t Result = ::recvmmsg(sockfd, HostMHeader.data(), vlen, flags, timeout_ts);\n  if (Result != -1) {\n    for (size_t i = 0; i < Result; ++i) {\n      ConvertHeaderToGuest(&msgvec[i].msg_hdr, &HostMHeader[i].msg_hdr);\n      msgvec[i].msg_len = HostMHeader[i].msg_len;\n    }\n  }\n  SYSCALL_ERRNO();\n}\n\nstatic uint64_t SendMMsg(int sockfd, auto_compat_ptr<mmsghdr_32> msgvec, uint32_t vlen, int flags) {\n  fextl::vector<iovec> Host_iovec;\n  fextl::vector<struct mmsghdr> HostMmsg(vlen);\n\n  // Walk the iovec and convert them\n  // Calculate controllen at the same time\n  size_t Controllen_size {};\n  for (size_t i = 0; i < vlen; ++i) {\n    msghdr32& guest = msgvec[i].msg_hdr;\n\n    Controllen_size += guest.msg_controllen * 2;\n    for (size_t j = 0; j < guest.msg_iovlen; ++j) {\n      iovec guest_iov = guest.msg_iov[j];\n      Host_iovec.emplace_back(guest_iov);\n    }\n  }\n\n  fextl::vector<uint8_t> Controllen(Controllen_size);\n\n  size_t current_iov {};\n  size_t current_controllen_offset {};\n  for (size_t i = 0; i < vlen; ++i) {\n    msghdr32& guest = msgvec[i].msg_hdr;\n    struct msghdr& msg = HostMmsg[i].msg_hdr;\n    msg.msg_name = guest.msg_name;\n    msg.msg_namelen = guest.msg_namelen;\n\n    msg.msg_iov = &Host_iovec.at(current_iov);\n    msg.msg_iovlen = guest.msg_iovlen;\n    current_iov += msg.msg_iovlen;\n\n    if (guest.msg_controllen) {\n      msg.msg_control = &Controllen.at(current_controllen_offset);\n      current_controllen_offset += guest.msg_controllen * 2;\n    }\n    msg.msg_controllen = guest.msg_controllen;\n\n    msg.msg_flags = guest.msg_flags;\n\n    if (msg.msg_controllen) {\n      void* CurrentGuestPtr = guest.msg_control;\n      struct cmsghdr* CurrentHost = reinterpret_cast<struct cmsghdr*>(msg.msg_control);\n\n      for (cmsghdr32* msghdr_guest = reinterpret_cast<cmsghdr32*>(CurrentGuestPtr); CurrentGuestPtr != 0;\n           msghdr_guest = reinterpret_cast<cmsghdr32*>(CurrentGuestPtr)) {\n\n        CurrentHost->cmsg_level = msghdr_guest->cmsg_level;\n        CurrentHost->cmsg_type = msghdr_guest->cmsg_type;\n\n        if (msghdr_guest->cmsg_len) {\n          size_t SizeIncrease = (CMSG_LEN(0) - sizeof(cmsghdr32));\n          CurrentHost->cmsg_len = msghdr_guest->cmsg_len + SizeIncrease;\n          msg.msg_controllen += SizeIncrease;\n          memcpy(CMSG_DATA(CurrentHost), msghdr_guest->cmsg_data, msghdr_guest->cmsg_len - sizeof(cmsghdr32));\n        }\n\n        // Go to next host\n        CurrentHost = CMSG_NXTHDR(&msg, CurrentHost);\n\n        // Go to next msg\n        if (msghdr_guest->cmsg_len < sizeof(cmsghdr32)) {\n          CurrentGuestPtr = nullptr;\n        } else {\n          CurrentGuestPtr = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(CurrentGuestPtr) + msghdr_guest->cmsg_len);\n          CurrentGuestPtr = reinterpret_cast<void*>((reinterpret_cast<uintptr_t>(CurrentGuestPtr) + 3) & ~3ULL);\n          if (CurrentGuestPtr >= reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(static_cast<void*>(guest.msg_control)) + guest.msg_controllen)) {\n            CurrentGuestPtr = nullptr;\n          }\n        }\n      }\n    }\n\n    HostMmsg[i].msg_len = msgvec[i].msg_len;\n  }\n\n  uint64_t Result = ::sendmmsg(sockfd, HostMmsg.data(), vlen, flags);\n\n  if (Result != -1) {\n    // Update guest msglen\n    for (size_t i = 0; i < Result; ++i) {\n      msgvec[i].msg_len = HostMmsg[i].msg_len;\n    }\n  }\n  SYSCALL_ERRNO();\n}\n\nstatic uint64_t SetSockOpt(int sockfd, int level, int optname, auto_compat_ptr<void> optval, int optlen) {\n  uint64_t Result {};\n\n  if (level == SOL_SOCKET) {\n    switch (optname) {\n    case SO_ATTACH_FILTER:\n    case SO_ATTACH_REUSEPORT_CBPF: {\n      struct sock_fprog32 {\n        uint16_t len;\n        uint32_t filter;\n      };\n      struct sock_fprog64 {\n        uint16_t len;\n        uint64_t filter;\n      };\n\n      if (optlen != sizeof(sock_fprog32)) {\n        return -EINVAL;\n      }\n\n      sock_fprog32* prog = reinterpret_cast<sock_fprog32*>(optval.Ptr);\n      sock_fprog64 prog64 {};\n      prog64.len = prog->len;\n      prog64.filter = prog->filter;\n\n      Result = ::syscall(SYSCALL_DEF(setsockopt), sockfd, level, optname, &prog64, sizeof(sock_fprog64));\n      break;\n    }\n    case SO_RCVTIMEO_OLD: {\n      // _OLD uses old_timeval32. Needs to be converted\n      struct timeval tv64 = *reinterpret_cast<timeval32*>(optval.Ptr);\n      Result = ::syscall(SYSCALL_DEF(setsockopt), sockfd, level, SO_RCVTIMEO_NEW, &tv64, sizeof(tv64));\n      break;\n    }\n    case SO_SNDTIMEO_OLD: {\n      // _OLD uses old_timeval32. Needs to be converted\n      struct timeval tv64 = *reinterpret_cast<timeval32*>(optval.Ptr);\n      Result = ::syscall(SYSCALL_DEF(setsockopt), sockfd, level, SO_SNDTIMEO_NEW, &tv64, sizeof(tv64));\n      break;\n    }\n    // Each optname as a reminder which setting has been manually checked\n    case SO_DEBUG:\n    case SO_REUSEADDR:\n    case SO_TYPE:\n    case SO_ERROR:\n    case SO_DONTROUTE:\n    case SO_BROADCAST:\n    case SO_SNDBUF:\n    case SO_RCVBUF:\n    case SO_SNDBUFFORCE:\n    case SO_RCVBUFFORCE:\n    case SO_KEEPALIVE:\n    case SO_OOBINLINE:\n    case SO_NO_CHECK:\n    case SO_PRIORITY:\n    case SO_LINGER:\n    case SO_BSDCOMPAT:\n    case SO_REUSEPORT:\n    /**\n     * @name These end up differing between {x86,arm} and {powerpc, alpha, sparc, mips, parisc}\n     * @{ */\n    case SO_PASSCRED:\n    case SO_PEERCRED:\n    case SO_RCVLOWAT:\n    case SO_SNDLOWAT:\n    /**  @} */\n    case SO_SECURITY_AUTHENTICATION:\n    case SO_SECURITY_ENCRYPTION_TRANSPORT:\n    case SO_SECURITY_ENCRYPTION_NETWORK:\n    case SO_DETACH_FILTER:\n    case SO_PEERNAME:\n    case SO_TIMESTAMP_OLD: // Returns int32_t boolean\n    case SO_ACCEPTCONN:\n    case SO_PEERSEC:\n    // Gap 32, 33\n    case SO_PASSSEC:\n    case SO_TIMESTAMPNS_OLD: // Returns int32_t boolean\n    case SO_MARK:\n    case SO_TIMESTAMPING_OLD: // Returns so_timestamping\n    case SO_PROTOCOL:\n    case SO_DOMAIN:\n    case SO_RXQ_OVFL:\n    case SO_WIFI_STATUS:\n    case SO_PEEK_OFF:\n    case SO_NOFCS:\n    case SO_LOCK_FILTER:\n    case SO_SELECT_ERR_QUEUE:\n    case SO_BUSY_POLL:\n    case SO_MAX_PACING_RATE:\n    case SO_BPF_EXTENSIONS:\n    case SO_INCOMING_CPU:\n    case SO_ATTACH_BPF:\n    case SO_ATTACH_REUSEPORT_EBPF:\n    case SO_CNX_ADVICE:\n    // Gap 54 (SCM_TIMESTAMPING_OPT_STATS)\n    case SO_MEMINFO:\n    case SO_INCOMING_NAPI_ID:\n    case SO_COOKIE: // Cookie always returns 64-bit even on 32-bit\n    // Gap 58 (SCM_TIMESTAMPING_PKTINFO)\n    case SO_PEERGROUPS:\n    case SO_ZEROCOPY:\n    case SO_TXTIME:\n    case SO_BINDTOIFINDEX:\n    case SO_TIMESTAMP_NEW:\n    case SO_TIMESTAMPNS_NEW:\n    case SO_TIMESTAMPING_NEW:\n    case SO_RCVTIMEO_NEW:\n    case SO_SNDTIMEO_NEW:\n    case SO_DETACH_REUSEPORT_BPF:\n    case SO_PREFER_BUSY_POLL:\n    case SO_BUSY_POLL_BUDGET:\n    case SO_NETNS_COOKIE: // Cookie always returns 64-bit even on 32-bit\n    case SO_BUF_LOCK:\n    case SO_RESERVE_MEM:\n    case SO_TXREHASH:\n    case SO_RCVMARK:\n    case SO_PASSPIDFD:\n    case SO_PEERPIDFD:\n    default: Result = ::syscall(SYSCALL_DEF(setsockopt), sockfd, level, optname, reinterpret_cast<const void*>(optval.Ptr), optlen); break;\n    }\n  } else {\n    Result = ::syscall(SYSCALL_DEF(setsockopt), sockfd, level, optname, reinterpret_cast<const void*>(optval.Ptr), optlen);\n  }\n\n  SYSCALL_ERRNO();\n}\n\nstatic uint64_t GetSockOpt(int sockfd, int level, int optname, auto_compat_ptr<void> optval, auto_compat_ptr<socklen_t> optlen) {\n  uint64_t Result {};\n  if (level == SOL_SOCKET) {\n    switch (optname) {\n    case SO_RCVTIMEO_OLD: {\n      // _OLD uses old_timeval32. Needs to be converted\n      struct timeval tv64 {};\n      Result = ::syscall(SYSCALL_DEF(getsockopt), sockfd, level, SO_RCVTIMEO_NEW, &tv64, sizeof(tv64));\n      *reinterpret_cast<timeval32*>(optval.Ptr) = tv64;\n      break;\n    }\n    case SO_SNDTIMEO_OLD: {\n      // _OLD uses old_timeval32. Needs to be converted\n      struct timeval tv64 {};\n      Result = ::syscall(SYSCALL_DEF(getsockopt), sockfd, level, SO_SNDTIMEO_NEW, &tv64, sizeof(tv64));\n      *reinterpret_cast<timeval32*>(optval.Ptr) = tv64;\n      break;\n    }\n    // Each optname as a reminder which setting has been manually checked\n    case SO_DEBUG:\n    case SO_REUSEADDR:\n    case SO_TYPE:\n    case SO_ERROR:\n    case SO_DONTROUTE:\n    case SO_BROADCAST:\n    case SO_SNDBUF:\n    case SO_RCVBUF:\n    case SO_SNDBUFFORCE:\n    case SO_RCVBUFFORCE:\n    case SO_KEEPALIVE:\n    case SO_OOBINLINE:\n    case SO_NO_CHECK:\n    case SO_PRIORITY:\n    case SO_LINGER:\n    case SO_BSDCOMPAT:\n    case SO_REUSEPORT:\n    /**\n     * @name These end up differing between {x86,arm} and {powerpc, alpha, sparc, mips, parisc}\n     * @{ */\n    case SO_PASSCRED:\n    case SO_PEERCRED:\n    case SO_RCVLOWAT:\n    case SO_SNDLOWAT:\n    /**  @} */\n    case SO_SECURITY_AUTHENTICATION:\n    case SO_SECURITY_ENCRYPTION_TRANSPORT:\n    case SO_SECURITY_ENCRYPTION_NETWORK:\n    case SO_ATTACH_FILTER: // Renamed to SO_GET_FILTER on get. Same between 32-bit and 64-bit\n    case SO_DETACH_FILTER:\n    case SO_PEERNAME:\n    case SO_TIMESTAMP_OLD: // Returns int32_t boolean\n    case SO_ACCEPTCONN:\n    case SO_PEERSEC:\n    // Gap 32, 33\n    case SO_PASSSEC:\n    case SO_TIMESTAMPNS_OLD: // Returns int32_t boolean\n    case SO_MARK:\n    case SO_TIMESTAMPING_OLD: // Returns so_timestamping\n    case SO_PROTOCOL:\n    case SO_DOMAIN:\n    case SO_RXQ_OVFL:\n    case SO_WIFI_STATUS:\n    case SO_PEEK_OFF:\n    case SO_NOFCS:\n    case SO_LOCK_FILTER:\n    case SO_SELECT_ERR_QUEUE:\n    case SO_BUSY_POLL:\n    case SO_MAX_PACING_RATE:\n    case SO_BPF_EXTENSIONS:\n    case SO_INCOMING_CPU:\n    case SO_ATTACH_BPF:\n    case SO_ATTACH_REUSEPORT_CBPF: // Doesn't do anything in get\n    case SO_ATTACH_REUSEPORT_EBPF:\n    case SO_CNX_ADVICE:\n    // Gap 54 (SCM_TIMESTAMPING_OPT_STATS)\n    case SO_MEMINFO:\n    case SO_INCOMING_NAPI_ID:\n    case SO_COOKIE: // Cookie always returns 64-bit even on 32-bit\n    // Gap 58 (SCM_TIMESTAMPING_PKTINFO)\n    case SO_PEERGROUPS:\n    case SO_ZEROCOPY:\n    case SO_TXTIME:\n    case SO_BINDTOIFINDEX:\n    case SO_TIMESTAMP_NEW:\n    case SO_TIMESTAMPNS_NEW:\n    case SO_TIMESTAMPING_NEW:\n    case SO_RCVTIMEO_NEW:\n    case SO_SNDTIMEO_NEW:\n    case SO_DETACH_REUSEPORT_BPF:\n    case SO_PREFER_BUSY_POLL:\n    case SO_BUSY_POLL_BUDGET:\n    case SO_NETNS_COOKIE: // Cookie always returns 64-bit even on 32-bit\n    case SO_BUF_LOCK:\n    case SO_RESERVE_MEM:\n    default: Result = ::syscall(SYSCALL_DEF(getsockopt), sockfd, level, optname, optval, optlen); break;\n    }\n  } else {\n    Result = ::syscall(SYSCALL_DEF(getsockopt), sockfd, level, optname, optval, optlen);\n  }\n  SYSCALL_ERRNO();\n}\n\nvoid RegisterSocket(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X32(socketcall, [](FEXCore::Core::CpuStateFrame* Frame, uint32_t call, uint32_t* Arguments) -> uint64_t {\n    uint64_t Result {};\n\n    switch (call) {\n    case OP_SOCKET: {\n      Result = ::socket(Arguments[0], Arguments[1], Arguments[2]);\n      break;\n    }\n    case OP_BIND: {\n      Result = ::bind(Arguments[0], reinterpret_cast<const struct sockaddr*>(Arguments[1]), Arguments[2]);\n      break;\n    }\n    case OP_CONNECT: {\n      Result = ::connect(Arguments[0], reinterpret_cast<const struct sockaddr*>(Arguments[1]), Arguments[2]);\n      break;\n    }\n    case OP_LISTEN: {\n      Result = ::listen(Arguments[0], Arguments[1]);\n      break;\n    }\n    case OP_ACCEPT: {\n      Result = ::accept(Arguments[0], reinterpret_cast<struct sockaddr*>(Arguments[1]), reinterpret_cast<socklen_t*>(Arguments[2]));\n      break;\n    }\n    case OP_GETSOCKNAME: {\n      Result = ::getsockname(Arguments[0], reinterpret_cast<struct sockaddr*>(Arguments[1]), reinterpret_cast<socklen_t*>(Arguments[2]));\n      break;\n    }\n    case OP_GETPEERNAME: {\n      Result = ::getpeername(Arguments[0], reinterpret_cast<struct sockaddr*>(Arguments[1]), reinterpret_cast<socklen_t*>(Arguments[2]));\n      break;\n    }\n    case OP_SOCKETPAIR: {\n      Result = ::socketpair(Arguments[0], Arguments[1], Arguments[2], reinterpret_cast<int32_t*>(Arguments[3]));\n      break;\n    }\n    case OP_SEND: {\n      Result = ::send(Arguments[0], reinterpret_cast<const void*>(Arguments[1]), Arguments[2], Arguments[3]);\n      break;\n    }\n    case OP_RECV: {\n      Result = ::recv(Arguments[0], reinterpret_cast<void*>(Arguments[1]), Arguments[2], Arguments[3]);\n      break;\n    }\n    case OP_SENDTO: {\n      Result = ::sendto(Arguments[0], reinterpret_cast<const void*>(Arguments[1]), Arguments[2], Arguments[3],\n                        reinterpret_cast<struct sockaddr*>(Arguments[4]), reinterpret_cast<socklen_t>(Arguments[5]));\n      break;\n    }\n    case OP_RECVFROM: {\n      Result = ::recvfrom(Arguments[0], reinterpret_cast<void*>(Arguments[1]), Arguments[2], Arguments[3],\n                          reinterpret_cast<struct sockaddr*>(Arguments[4]), reinterpret_cast<socklen_t*>(Arguments[5]));\n      break;\n    }\n    case OP_SHUTDOWN: {\n      Result = ::shutdown(Arguments[0], Arguments[1]);\n      break;\n    }\n    case OP_SETSOCKOPT: {\n      return SetSockOpt(Arguments[0], Arguments[1], Arguments[2], Arguments[3], reinterpret_cast<socklen_t>(Arguments[4]));\n      break;\n    }\n    case OP_GETSOCKOPT: {\n      return GetSockOpt(Arguments[0], Arguments[1], Arguments[2], reinterpret_cast<void*>(Arguments[3]),\n                        reinterpret_cast<socklen_t*>(Arguments[4]));\n      break;\n    }\n    case OP_SENDMSG: {\n      return SendMsg(Arguments[0], reinterpret_cast<const struct msghdr32*>(Arguments[1]), Arguments[2]);\n      break;\n    }\n    case OP_RECVMSG: {\n      return RecvMsg(Arguments[0], reinterpret_cast<struct msghdr32*>(Arguments[1]), Arguments[2]);\n      break;\n    }\n    case OP_ACCEPT4: {\n      return ::accept4(Arguments[0], reinterpret_cast<struct sockaddr*>(Arguments[1]), reinterpret_cast<socklen_t*>(Arguments[2]), Arguments[3]);\n      break;\n    }\n    case OP_RECVMMSG: {\n      timespec32* timeout_ts = reinterpret_cast<timespec32*>(Arguments[4]);\n      struct timespec tp64 {};\n      struct timespec* timed_ptr {};\n      if (timeout_ts) {\n        tp64 = *timeout_ts;\n        timed_ptr = &tp64;\n      }\n\n      uint64_t Result = RecvMMsg(Arguments[0], Arguments[1], Arguments[2], Arguments[3], timed_ptr);\n\n      if (timeout_ts) {\n        *timeout_ts = tp64;\n      }\n\n      return Result;\n      break;\n    }\n    case OP_SENDMMSG: {\n      return SendMMsg(Arguments[0], reinterpret_cast<mmsghdr_32*>(Arguments[1]), Arguments[2], Arguments[3]);\n      break;\n    }\n    default: LOGMAN_MSG_A_FMT(\"Unsupported socketcall op: {}\", call); break;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(sendmsg, [](FEXCore::Core::CpuStateFrame* Frame, int sockfd, const struct msghdr32* msg, int flags) -> uint64_t {\n    return SendMsg(sockfd, msg, flags);\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(sendmmsg,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int sockfd, auto_compat_ptr<mmsghdr_32> msgvec, uint32_t vlen,\n                               int flags) -> uint64_t { return SendMMsg(sockfd, msgvec, vlen, flags); });\n\n  REGISTER_SYSCALL_IMPL_X32(recvmmsg,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int sockfd, auto_compat_ptr<mmsghdr_32> msgvec, uint32_t vlen,\n                               int flags, timespec32* timeout_ts) -> uint64_t {\n                              struct timespec tp64 {};\n                              struct timespec* timed_ptr {};\n                              if (timeout_ts) {\n                                tp64 = *timeout_ts;\n                                timed_ptr = &tp64;\n                              }\n\n                              uint64_t Result = RecvMMsg(sockfd, msgvec, vlen, flags, timed_ptr);\n\n                              if (timeout_ts) {\n                                *timeout_ts = tp64;\n                              }\n\n                              return Result;\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(recvmmsg_time64,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int sockfd, auto_compat_ptr<mmsghdr_32> msgvec, uint32_t vlen, int flags,\n                               struct timespec* timeout_ts) -> uint64_t { return RecvMMsg(sockfd, msgvec, vlen, flags, timeout_ts); });\n\n  REGISTER_SYSCALL_IMPL_X32(recvmsg, [](FEXCore::Core::CpuStateFrame* Frame, int sockfd, struct msghdr32* msg, int flags) -> uint64_t {\n    return RecvMsg(sockfd, msg, flags);\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(setsockopt,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int sockfd, int level, int optname, auto_compat_ptr<void> optval,\n                               socklen_t optlen) -> uint64_t { return SetSockOpt(sockfd, level, optname, optval, optlen); });\n\n  REGISTER_SYSCALL_IMPL_X32(getsockopt,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int sockfd, int level, int optname, auto_compat_ptr<void> optval,\n                               auto_compat_ptr<socklen_t> optlen) -> uint64_t { return GetSockOpt(sockfd, level, optname, optval, optlen); });\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Stubs.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include <FEXCore/Utils/LogManager.h>\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n\n#include <errno.h>\n#include <stdint.h>\n#include <sys/types.h>\n\n#define SYSCALL_STUB(name)                         \\\n  do {                                             \\\n    ERROR_AND_DIE_FMT(\"Syscall: \" #name \" stub!\"); \\\n    return -ENOSYS;                                \\\n  } while (0)\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nnamespace FEX::HLE::x32 {\nvoid RegisterStubs(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X32(modify_ldt, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { SYSCALL_STUB(readdir); });\n\n  REGISTER_SYSCALL_IMPL_X32(readdir, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { SYSCALL_STUB(readdir); });\n\n  REGISTER_SYSCALL_IMPL_X32(vm86old, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { return -ENOSYS; });\n\n  REGISTER_SYSCALL_IMPL_X32(vm86, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { return -ENOSYS; });\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Syscalls.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x32/IoctlEmulation.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x32/SyscallsEnum.h\"\n\n#include <FEXCore/HLE/SyscallHandler.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/memory.h>\n\n#include <bitset>\n#include <cerrno>\n#include <cstdint>\n#include <limits>\n#include <mutex>\n#include <sys/mman.h>\n#include <sys/shm.h>\n#include <utility>\n\nnamespace FEX::HLE::x32 {\nvoid RegisterEpoll(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterFD(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterFS(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterInfo(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterIO(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterMemory(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterMsg(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterNotImplemented(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterSched(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterSemaphore(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterSignals(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterSocket(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterStubs(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterThread(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterTime(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterTimer(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterPassthrough(FEX::HLE::SyscallHandler* Handler);\n\nx32SyscallHandler::x32SyscallHandler(FEXCore::Context::Context* ctx, FEX::HLE::SignalDelegator* _SignalDelegation,\n                                     FEX::HLE::ThunkHandler* ThunkHandler, fextl::unique_ptr<MemAllocator> Allocator)\n  : SyscallHandler {ctx, _SignalDelegation, ThunkHandler}\n  , AllocHandler {std::move(Allocator)} {\n  OSABI = FEXCore::HLE::SyscallOSABI::OS_LINUX32;\n  RegisterSyscallHandlers();\n}\n\nvoid x32SyscallHandler::RegisterSyscallHandlers() {\n  FEX::HLE::RegisterEpoll(this);\n  FEX::HLE::RegisterFD(this);\n  FEX::HLE::RegisterFS(this);\n  FEX::HLE::RegisterInfo(this);\n  FEX::HLE::RegisterIO(this);\n  FEX::HLE::RegisterMemory(this);\n  FEX::HLE::RegisterSignals(this);\n  FEX::HLE::RegisterThread(this);\n  FEX::HLE::RegisterTimer(this);\n  FEX::HLE::RegisterNotImplemented(this);\n  FEX::HLE::RegisterStubs(this);\n\n  // 32bit specific\n  FEX::HLE::x32::RegisterEpoll(this);\n  FEX::HLE::x32::RegisterFD(this);\n  FEX::HLE::x32::RegisterFS(this);\n  FEX::HLE::x32::RegisterInfo(this);\n  FEX::HLE::x32::RegisterIO(this);\n  FEX::HLE::x32::RegisterMemory(this);\n  FEX::HLE::x32::RegisterMsg(this);\n  FEX::HLE::x32::RegisterNotImplemented(this);\n  FEX::HLE::x32::RegisterSched(this);\n  FEX::HLE::x32::RegisterSemaphore(this);\n  FEX::HLE::x32::RegisterSignals(this);\n  FEX::HLE::x32::RegisterSocket(this);\n  FEX::HLE::x32::RegisterStubs(this);\n  FEX::HLE::x32::RegisterThread(this);\n  FEX::HLE::x32::RegisterTime(this);\n  FEX::HLE::x32::RegisterTimer(this);\n  FEX::HLE::x32::RegisterPassthrough(this);\n\n#if PRINT_MISSING_SYSCALLS\n  for (auto& Syscall : SyscallNames) {\n    if (Definitions[Syscall.first].Ptr == reinterpret_cast<void*>(&UnimplementedSyscall)) {\n      LogMan::Msg::DFmt(\"Unimplemented syscall: {}: {}\", Syscall.first, Syscall.second);\n    }\n  }\n#endif\n}\n\nfextl::unique_ptr<FEX::HLE::SyscallHandler> CreateHandler(FEXCore::Context::Context* ctx, FEX::HLE::SignalDelegator* _SignalDelegation,\n                                                          FEX::HLE::ThunkHandler* ThunkHandler, fextl::unique_ptr<MemAllocator> Allocator) {\n  return fextl::make_unique<x32SyscallHandler>(ctx, _SignalDelegation, ThunkHandler, std::move(Allocator));\n}\n\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Syscalls.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#pragma once\n\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/string.h>\n\n#include \"LinuxSyscalls/Syscalls.h\"\n\n#include <memory>\n#include <stddef.h>\n#include <stdint.h>\n#include <sys/types.h>\n\nnamespace FEXCore {\nnamespace Context {\n  class Context;\n}\nnamespace Core {\n  struct CpuStateFrame;\n}\n} // namespace FEXCore\n\nnamespace FEX::HLE {\nclass SignalDelegator;\nclass ThunkHandler;\n} // namespace FEX::HLE\n\nnamespace FEX::HLE::x32 {\n\nclass x32SyscallHandler final : public FEX::HLE::SyscallHandler {\npublic:\n  x32SyscallHandler(FEXCore::Context::Context* ctx, FEX::HLE::SignalDelegator* _SignalDelegation, FEX::HLE::ThunkHandler* ThunkHandler,\n                    fextl::unique_ptr<MemAllocator> Allocator);\n\n  FEX::HLE::MemAllocator* GetAllocator() {\n    return AllocHandler.get();\n  }\n  FEX::HLE::MemAllocator* Get32BitAllocator() override {\n    return GetAllocator();\n  }\n\n  void* GuestMmap(FEXCore::Core::InternalThreadState* Thread, void* addr, size_t length, int prot, int flags, int fd, off_t offset) override {\n    return FEX::HLE::SyscallHandler::GuestMmap(false, Thread, addr, length, prot, flags, fd, offset);\n  }\n  uint64_t GuestMunmap(FEXCore::Core::InternalThreadState* Thread, void* addr, uint64_t length) override {\n    return FEX::HLE::SyscallHandler::GuestMunmap(false, Thread, addr, length);\n  }\n\n  void RegisterSyscall_32(int SyscallNumber,\n#ifdef DEBUG_STRACE\n                          const fextl::string& TraceFormatString,\n#endif\n                          void* SyscallHandler, int ArgumentCount) override {\n    auto& Def = Definitions.at(SyscallNumber);\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    LOGMAN_THROW_A_FMT(Def.Ptr == reinterpret_cast<void*>(&UnimplementedSyscall), \"Oops overwriting sysall problem, {}\", SyscallNumber);\n#endif\n    Def.Ptr = SyscallHandler;\n    Def.NumArgs = ArgumentCount;\n#ifdef DEBUG_STRACE\n    Def.StraceFmt = TraceFormatString;\n#endif\n  }\n\nprivate:\n  void RegisterSyscallHandlers();\n  fextl::unique_ptr<MemAllocator> AllocHandler {};\n};\n\nfextl::unique_ptr<FEX::HLE::SyscallHandler> CreateHandler(FEXCore::Context::Context* ctx, FEX::HLE::SignalDelegator* _SignalDelegation,\n                                                          FEX::HLE::ThunkHandler* ThunkHandler, fextl::unique_ptr<MemAllocator> Allocator);\n//////\n// REGISTER_SYSCALL_IMPL implementation\n// Given a syscall name + a lambda, and it will generate an strace string, extract number of arguments\n// and register it as a syscall handler\n//////\n\n// RegisterSyscall base\n// Deduces return, args... from the function passed\n// Does not work with lambas, because they are objects with operator (), not functions\ntemplate<typename R, typename... Args>\nvoid RegisterSyscall(SyscallHandler* Handler, int SyscallNumber, const char* Name, R (*fn)(FEXCore::Core::CpuStateFrame* Frame, Args...)) {\n#ifdef DEBUG_STRACE\n  auto TraceFormatString = fextl::string(Name) + \"(\" + CollectArgsFmtString<Args...>() + \") = {}\";\n#endif\n  Handler->RegisterSyscall_32(SyscallNumber,\n#ifdef DEBUG_STRACE\n                              TraceFormatString,\n#endif\n                              reinterpret_cast<void*>(fn), sizeof...(Args));\n}\n\n// Generic RegisterSyscall for lambdas\n// Non-capturing lambdas can be cast to function pointers, but this does not happen on argument matching\n// This is some glue logic that will cast a lambda and call the base RegisterSyscall implementation\ntemplate<class F>\nvoid RegisterSyscall(SyscallHandler* _Handler, int num, const char* name, F f) {\n  RegisterSyscall(_Handler, num, name, +f);\n}\n\n} // namespace FEX::HLE::x32\n\n// Registers syscall for 32bit only\n#define REGISTER_SYSCALL_IMPL_X32(name, lambda)                                      \\\n  do {                                                                               \\\n    FEX::HLE::x32::RegisterSyscall(Handler, x32::SYSCALL_x86_##name, #name, lambda); \\\n  } while (false)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/SyscallsEnum.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n#pragma once\n\nnamespace FEX::HLE::x32 {\n///< Enum containing all 32bit x86 linux syscalls for the guest kernel version\nenum Syscalls_x86 {\n  SYSCALL_x86_restart_syscall = 0,\n  SYSCALL_x86_exit = 1,\n  SYSCALL_x86_fork = 2,\n  SYSCALL_x86_read = 3,\n  SYSCALL_x86_write = 4,\n  SYSCALL_x86_open = 5,\n  SYSCALL_x86_close = 6,\n  SYSCALL_x86_waitpid = 7,\n  SYSCALL_x86_creat = 8,\n  SYSCALL_x86_link = 9,\n  SYSCALL_x86_unlink = 10,\n  SYSCALL_x86_execve = 11,\n  SYSCALL_x86_chdir = 12,\n  SYSCALL_x86_time = 13,\n  SYSCALL_x86_mknod = 14,\n  SYSCALL_x86_chmod = 15,\n  SYSCALL_x86_lchown = 16,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_break = 17,\n  SYSCALL_x86_oldstat = 18,\n  SYSCALL_x86_lseek = 19,\n  SYSCALL_x86_getpid = 20,\n  SYSCALL_x86_mount = 21,\n  SYSCALL_x86_umount = 22,\n  SYSCALL_x86_setuid = 23,\n  SYSCALL_x86_getuid = 24,\n  SYSCALL_x86_stime = 25,\n  SYSCALL_x86_ptrace = 26,\n  SYSCALL_x86_alarm = 27,\n  SYSCALL_x86_oldfstat = 28,\n  SYSCALL_x86_pause = 29,\n  SYSCALL_x86_utime = 30,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_stty = 31,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_gtty = 32,\n  SYSCALL_x86_access = 33,\n  SYSCALL_x86_nice = 34,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_ftime = 35,\n  SYSCALL_x86_sync = 36,\n  SYSCALL_x86_kill = 37,\n  SYSCALL_x86_rename = 38,\n  SYSCALL_x86_mkdir = 39,\n  SYSCALL_x86_rmdir = 40,\n  SYSCALL_x86_dup = 41,\n  SYSCALL_x86_pipe = 42,\n  SYSCALL_x86_times = 43,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_prof = 44,\n  SYSCALL_x86_brk = 45,\n  SYSCALL_x86_setgid = 46,\n  SYSCALL_x86_getgid = 47,\n  SYSCALL_x86_signal = 48,\n  SYSCALL_x86_geteuid = 49,\n  SYSCALL_x86_getegid = 50,\n  SYSCALL_x86_acct = 51,\n  SYSCALL_x86_umount2 = 52,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_lock = 53,\n  SYSCALL_x86_ioctl = 54,\n  SYSCALL_x86_fcntl = 55,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_mpx = 56,\n  SYSCALL_x86_setpgid = 57,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_ulimit = 58,\n  SYSCALL_x86_oldolduname = 59,\n  SYSCALL_x86_umask = 60,\n  SYSCALL_x86_chroot = 61,\n  SYSCALL_x86_ustat = 62,\n  SYSCALL_x86_dup2 = 63,\n  SYSCALL_x86_getppid = 64,\n  SYSCALL_x86_getpgrp = 65,\n  SYSCALL_x86_setsid = 66,\n  SYSCALL_x86_sigaction = 67,\n  SYSCALL_x86_sgetmask = 68,\n  SYSCALL_x86_ssetmask = 69,\n  SYSCALL_x86_setreuid = 70,\n  SYSCALL_x86_setregid = 71,\n  SYSCALL_x86_sigsuspend = 72,\n  SYSCALL_x86_sigpending = 73,\n  SYSCALL_x86_sethostname = 74,\n  SYSCALL_x86_setrlimit = 75,\n  SYSCALL_x86_getrlimit = 76,\n  SYSCALL_x86_getrusage = 77,\n  SYSCALL_x86_gettimeofday = 78,\n  SYSCALL_x86_settimeofday = 79,\n  SYSCALL_x86_getgroups = 80,\n  SYSCALL_x86_setgroups = 81,\n  SYSCALL_x86_select = 82,\n  SYSCALL_x86_symlink = 83,\n  SYSCALL_x86_oldlstat = 84,\n  SYSCALL_x86_readlink = 85,\n  SYSCALL_x86_uselib = 86,\n  SYSCALL_x86_swapon = 87,\n  SYSCALL_x86_reboot = 88,\n  SYSCALL_x86_readdir = 89,\n  SYSCALL_x86_mmap = 90,\n  SYSCALL_x86_munmap = 91,\n  SYSCALL_x86_truncate = 92,\n  SYSCALL_x86_ftruncate = 93,\n  SYSCALL_x86_fchmod = 94,\n  SYSCALL_x86_fchown = 95,\n  SYSCALL_x86_getpriority = 96,\n  SYSCALL_x86_setpriority = 97,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_profil = 98,\n  SYSCALL_x86_statfs = 99,\n  SYSCALL_x86_fstatfs = 100,\n  SYSCALL_x86_ioperm = 101,\n  SYSCALL_x86_socketcall = 102,\n  SYSCALL_x86_syslog = 103,\n  SYSCALL_x86_setitimer = 104,\n  SYSCALL_x86_getitimer = 105,\n  SYSCALL_x86_stat = 106,\n  SYSCALL_x86_lstat = 107,\n  SYSCALL_x86_fstat = 108,\n  SYSCALL_x86_olduname = 109,\n  SYSCALL_x86_iopl = 110,\n  SYSCALL_x86_vhangup = 111,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_idle = 112,\n  SYSCALL_x86_vm86old = 113,\n  SYSCALL_x86_wait4 = 114,\n  SYSCALL_x86_swapoff = 115,\n  SYSCALL_x86_sysinfo = 116,\n  SYSCALL_x86_ipc = 117,\n  SYSCALL_x86_fsync = 118,\n  SYSCALL_x86_sigreturn = 119,\n  SYSCALL_x86_clone = 120,\n  SYSCALL_x86_setdomainname = 121,\n  SYSCALL_x86_uname = 122,\n  SYSCALL_x86_modify_ldt = 123,\n  SYSCALL_x86_adjtimex = 124,\n  SYSCALL_x86_mprotect = 125,\n  SYSCALL_x86_sigprocmask = 126,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_create_module = 127,\n  SYSCALL_x86_init_module = 128,\n  SYSCALL_x86_delete_module = 129,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_get_kernel_syms = 130,\n  SYSCALL_x86_quotactl = 131,\n  SYSCALL_x86_getpgid = 132,\n  SYSCALL_x86_fchdir = 133,\n  SYSCALL_x86_bdflush = 134,\n  SYSCALL_x86_sysfs = 135,\n  SYSCALL_x86_personality = 136,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_afs_syscall = 137,\n  SYSCALL_x86_setfsuid = 138,\n  SYSCALL_x86_setfsgid = 139,\n  SYSCALL_x86__llseek = 140,\n  SYSCALL_x86_getdents = 141,\n  SYSCALL_x86__newselect = 142,\n  SYSCALL_x86_flock = 143,\n  SYSCALL_x86_msync = 144,\n  SYSCALL_x86_readv = 145,\n  SYSCALL_x86_writev = 146,\n  SYSCALL_x86_getsid = 147,\n  SYSCALL_x86_fdatasync = 148,\n  SYSCALL_x86__sysctl = 149,\n  SYSCALL_x86_mlock = 150,\n  SYSCALL_x86_munlock = 151,\n  SYSCALL_x86_mlockall = 152,\n  SYSCALL_x86_munlockall = 153,\n  SYSCALL_x86_sched_setparam = 154,\n  SYSCALL_x86_sched_getparam = 155,\n  SYSCALL_x86_sched_setscheduler = 156,\n  SYSCALL_x86_sched_getscheduler = 157,\n  SYSCALL_x86_sched_yield = 158,\n  SYSCALL_x86_sched_get_priority_max = 159,\n  SYSCALL_x86_sched_get_priority_min = 160,\n  SYSCALL_x86_sched_rr_get_interval = 161,\n  SYSCALL_x86_nanosleep = 162,\n  SYSCALL_x86_mremap = 163,\n  SYSCALL_x86_setresuid = 164,\n  SYSCALL_x86_getresuid = 165,\n  SYSCALL_x86_vm86 = 166,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_query_module = 167,\n  SYSCALL_x86_poll = 168,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_nfsservctl = 169,\n  SYSCALL_x86_setresgid = 170,\n  SYSCALL_x86_getresgid = 171,\n  SYSCALL_x86_prctl = 172,\n  SYSCALL_x86_rt_sigreturn = 173,\n  SYSCALL_x86_rt_sigaction = 174,\n  SYSCALL_x86_rt_sigprocmask = 175,\n  SYSCALL_x86_rt_sigpending = 176,\n  SYSCALL_x86_rt_sigtimedwait = 177,\n  SYSCALL_x86_rt_sigqueueinfo = 178,\n  SYSCALL_x86_rt_sigsuspend = 179,\n  SYSCALL_x86_pread_64 = 180,\n  SYSCALL_x86_pwrite_64 = 181,\n  SYSCALL_x86_chown = 182,\n  SYSCALL_x86_getcwd = 183,\n  SYSCALL_x86_capget = 184,\n  SYSCALL_x86_capset = 185,\n  SYSCALL_x86_sigaltstack = 186,\n  SYSCALL_x86_sendfile = 187,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_getpmsg = 188,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_putpmsg = 189,\n  SYSCALL_x86_vfork = 190,\n  SYSCALL_x86_ugetrlimit = 191,\n  SYSCALL_x86_mmap2 = 192,\n  SYSCALL_x86_truncate64 = 193,\n  SYSCALL_x86_ftruncate64 = 194,\n  SYSCALL_x86_stat64 = 195,\n  SYSCALL_x86_lstat64 = 196,\n  SYSCALL_x86_fstat64 = 197,\n  SYSCALL_x86_lchown32 = 198,\n  SYSCALL_x86_getuid32 = 199,\n  SYSCALL_x86_getgid32 = 200,\n  SYSCALL_x86_geteuid32 = 201,\n  SYSCALL_x86_getegid32 = 202,\n  SYSCALL_x86_setreuid32 = 203,\n  SYSCALL_x86_setregid32 = 204,\n  SYSCALL_x86_getgroups32 = 205,\n  SYSCALL_x86_setgroups32 = 206,\n  SYSCALL_x86_fchown32 = 207,\n  SYSCALL_x86_setresuid32 = 208,\n  SYSCALL_x86_getresuid32 = 209,\n  SYSCALL_x86_setresgid32 = 210,\n  SYSCALL_x86_getresgid32 = 211,\n  SYSCALL_x86_chown32 = 212,\n  SYSCALL_x86_setuid32 = 213,\n  SYSCALL_x86_setgid32 = 214,\n  SYSCALL_x86_setfsuid32 = 215,\n  SYSCALL_x86_setfsgid32 = 216,\n  SYSCALL_x86_pivot_root = 217,\n  SYSCALL_x86_mincore = 218,\n  SYSCALL_x86_madvise = 219,\n  SYSCALL_x86_getdents64 = 220,\n  SYSCALL_x86_fcntl64 = 221,\n  SYSCALL_x86_gettid = 224,\n  SYSCALL_x86_readahead = 225,\n  SYSCALL_x86_setxattr = 226,\n  SYSCALL_x86_lsetxattr = 227,\n  SYSCALL_x86_fsetxattr = 228,\n  SYSCALL_x86_getxattr = 229,\n  SYSCALL_x86_lgetxattr = 230,\n  SYSCALL_x86_fgetxattr = 231,\n  SYSCALL_x86_listxattr = 232,\n  SYSCALL_x86_llistxattr = 233,\n  SYSCALL_x86_flistxattr = 234,\n  SYSCALL_x86_removexattr = 235,\n  SYSCALL_x86_lremovexattr = 236,\n  SYSCALL_x86_fremovexattr = 237,\n  SYSCALL_x86_tkill = 238,\n  SYSCALL_x86_sendfile64 = 239,\n  SYSCALL_x86_futex = 240,\n  SYSCALL_x86_sched_setaffinity = 241,\n  SYSCALL_x86_sched_getaffinity = 242,\n  SYSCALL_x86_set_thread_area = 243,\n  SYSCALL_x86_get_thread_area = 244,\n  SYSCALL_x86_io_setup = 245,\n  SYSCALL_x86_io_destroy = 246,\n  SYSCALL_x86_io_getevents = 247,\n  SYSCALL_x86_io_submit = 248,\n  SYSCALL_x86_io_cancel = 249,\n  SYSCALL_x86_fadvise64 = 250,\n  SYSCALL_x86_exit_group = 252,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_lookup_dcookie = 253,\n  SYSCALL_x86_epoll_create = 254,\n  SYSCALL_x86_epoll_ctl = 255,\n  SYSCALL_x86_epoll_wait = 256,\n  SYSCALL_x86_remap_file_pages = 257,\n  SYSCALL_x86_set_tid_address = 258,\n  SYSCALL_x86_timer_create = 259,\n  SYSCALL_x86_timer_settime = 260,\n  SYSCALL_x86_timer_gettime = 261,\n  SYSCALL_x86_timer_getoverrun = 262,\n  SYSCALL_x86_timer_delete = 263,\n  SYSCALL_x86_clock_settime = 264,\n  SYSCALL_x86_clock_gettime = 265,\n  SYSCALL_x86_clock_getres = 266,\n  SYSCALL_x86_clock_nanosleep = 267,\n  SYSCALL_x86_statfs64 = 268,\n  SYSCALL_x86_fstatfs64 = 269,\n  SYSCALL_x86_tgkill = 270,\n  SYSCALL_x86_utimes = 271,\n  SYSCALL_x86_fadvise64_64 = 272,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x86_vserver = 273,\n  SYSCALL_x86_mbind = 274,\n  SYSCALL_x86_get_mempolicy = 275,\n  SYSCALL_x86_set_mempolicy = 276,\n  SYSCALL_x86_mq_open = 277,\n  SYSCALL_x86_mq_unlink = 278,\n  SYSCALL_x86_mq_timedsend = 279,\n  SYSCALL_x86_mq_timedreceive = 280,\n  SYSCALL_x86_mq_notify = 281,\n  SYSCALL_x86_mq_getsetattr = 282,\n  SYSCALL_x86_kexec_load = 283,\n  SYSCALL_x86_waitid = 284,\n  SYSCALL_x86_add_key = 286,\n  SYSCALL_x86_request_key = 287,\n  SYSCALL_x86_keyctl = 288,\n  SYSCALL_x86_ioprio_set = 289,\n  SYSCALL_x86_ioprio_get = 290,\n  SYSCALL_x86_inotify_init = 291,\n  SYSCALL_x86_inotify_add_watch = 292,\n  SYSCALL_x86_inotify_rm_watch = 293,\n  SYSCALL_x86_migrate_pages = 294,\n  SYSCALL_x86_openat = 295,\n  SYSCALL_x86_mkdirat = 296,\n  SYSCALL_x86_mknodat = 297,\n  SYSCALL_x86_fchownat = 298,\n  SYSCALL_x86_futimesat = 299,\n  SYSCALL_x86_fstatat_64 = 300,\n  SYSCALL_x86_unlinkat = 301,\n  SYSCALL_x86_renameat = 302,\n  SYSCALL_x86_linkat = 303,\n  SYSCALL_x86_symlinkat = 304,\n  SYSCALL_x86_readlinkat = 305,\n  SYSCALL_x86_fchmodat = 306,\n  SYSCALL_x86_faccessat = 307,\n  SYSCALL_x86_pselect6 = 308,\n  SYSCALL_x86_ppoll = 309,\n  SYSCALL_x86_unshare = 310,\n  SYSCALL_x86_set_robust_list = 311,\n  SYSCALL_x86_get_robust_list = 312,\n  SYSCALL_x86_splice = 313,\n  SYSCALL_x86_sync_file_range = 314,\n  SYSCALL_x86_tee = 315,\n  SYSCALL_x86_vmsplice = 316,\n  SYSCALL_x86_move_pages = 317,\n  SYSCALL_x86_getcpu = 318,\n  SYSCALL_x86_epoll_pwait = 319,\n  SYSCALL_x86_utimensat = 320,\n  SYSCALL_x86_signalfd = 321,\n  SYSCALL_x86_timerfd_create = 322,\n  SYSCALL_x86_eventfd = 323,\n  SYSCALL_x86_fallocate = 324,\n  SYSCALL_x86_timerfd_settime = 325,\n  SYSCALL_x86_timerfd_gettime = 326,\n  SYSCALL_x86_signalfd4 = 327,\n  SYSCALL_x86_eventfd2 = 328,\n  SYSCALL_x86_epoll_create1 = 329,\n  SYSCALL_x86_dup3 = 330,\n  SYSCALL_x86_pipe2 = 331,\n  SYSCALL_x86_inotify_init1 = 332,\n  SYSCALL_x86_preadv = 333,\n  SYSCALL_x86_pwritev = 334,\n  SYSCALL_x86_rt_tgsigqueueinfo = 335,\n  SYSCALL_x86_perf_event_open = 336,\n  SYSCALL_x86_recvmmsg = 337,\n  SYSCALL_x86_fanotify_init = 338,\n  SYSCALL_x86_fanotify_mark = 339,\n  SYSCALL_x86_prlimit_64 = 340,\n  SYSCALL_x86_name_to_handle_at = 341,\n  SYSCALL_x86_open_by_handle_at = 342,\n  SYSCALL_x86_clock_adjtime = 343,\n  SYSCALL_x86_syncfs = 344,\n  SYSCALL_x86_sendmmsg = 345,\n  SYSCALL_x86_setns = 346,\n  SYSCALL_x86_process_vm_readv = 347,\n  SYSCALL_x86_process_vm_writev = 348,\n  SYSCALL_x86_kcmp = 349,\n  SYSCALL_x86_finit_module = 350,\n  SYSCALL_x86_sched_setattr = 351,\n  SYSCALL_x86_sched_getattr = 352,\n  SYSCALL_x86_renameat2 = 353,\n  SYSCALL_x86_seccomp = 354,\n  SYSCALL_x86_getrandom = 355,\n  SYSCALL_x86_memfd_create = 356,\n  SYSCALL_x86_bpf = 357,\n  SYSCALL_x86_execveat = 358,\n  SYSCALL_x86_socket = 359,\n  SYSCALL_x86_socketpair = 360,\n  SYSCALL_x86_bind = 361,\n  SYSCALL_x86_connect = 362,\n  SYSCALL_x86_listen = 363,\n  SYSCALL_x86_accept4 = 364,\n  SYSCALL_x86_getsockopt = 365,\n  SYSCALL_x86_setsockopt = 366,\n  SYSCALL_x86_getsockname = 367,\n  SYSCALL_x86_getpeername = 368,\n  SYSCALL_x86_sendto = 369,\n  SYSCALL_x86_sendmsg = 370,\n  SYSCALL_x86_recvfrom = 371,\n  SYSCALL_x86_recvmsg = 372,\n  SYSCALL_x86_shutdown = 373,\n  SYSCALL_x86_userfaultfd = 374,\n  SYSCALL_x86_membarrier = 375,\n  SYSCALL_x86_mlock2 = 376,\n  SYSCALL_x86_copy_file_range = 377,\n  SYSCALL_x86_preadv2 = 378,\n  SYSCALL_x86_pwritev2 = 379,\n  SYSCALL_x86_pkey_mprotect = 380,\n  SYSCALL_x86_pkey_alloc = 381,\n  SYSCALL_x86_pkey_free = 382,\n  SYSCALL_x86_statx = 383,\n  SYSCALL_x86_arch_prctl = 384,\n  SYSCALL_x86_io_pgetevents = 385,\n  SYSCALL_x86_rseq = 386,\n  SYSCALL_x86_semget = 393,\n  SYSCALL_x86_semctl = 394,\n  SYSCALL_x86_shmget = 395,\n  SYSCALL_x86_shmctl = 396,\n  SYSCALL_x86_shmat = 397,\n  SYSCALL_x86_shmdt = 398,\n  SYSCALL_x86_msgget = 399,\n  SYSCALL_x86_msgsnd = 400,\n  SYSCALL_x86_msgrcv = 401,\n  SYSCALL_x86_msgctl = 402,\n  SYSCALL_x86_clock_gettime64 = 403,\n  SYSCALL_x86_clock_settime64 = 404,\n  SYSCALL_x86_clock_adjtime64 = 405,\n  SYSCALL_x86_clock_getres_time64 = 406,\n  SYSCALL_x86_clock_nanosleep_time64 = 407,\n  SYSCALL_x86_timer_gettime64 = 408,\n  SYSCALL_x86_timer_settime64 = 409,\n  SYSCALL_x86_timerfd_gettime64 = 410,\n  SYSCALL_x86_timerfd_settime64 = 411,\n  SYSCALL_x86_utimensat_time64 = 412,\n  SYSCALL_x86_pselect6_time64 = 413,\n  SYSCALL_x86_ppoll_time64 = 414,\n  SYSCALL_x86_io_pgetevents_time64 = 416,\n  SYSCALL_x86_recvmmsg_time64 = 417,\n  SYSCALL_x86_mq_timedsend_time64 = 418,\n  SYSCALL_x86_mq_timedreceive_time64 = 419,\n  SYSCALL_x86_semtimedop_time64 = 420,\n  SYSCALL_x86_rt_sigtimedwait_time64 = 421,\n  SYSCALL_x86_futex_time64 = 422,\n  SYSCALL_x86_sched_rr_get_interval_time64 = 423,\n  SYSCALL_x86_pidfd_send_signal = 424,\n  SYSCALL_x86_io_uring_setup = 425,\n  SYSCALL_x86_io_uring_enter = 426,\n  SYSCALL_x86_io_uring_register = 427,\n  SYSCALL_x86_open_tree = 428,\n  SYSCALL_x86_move_mount = 429,\n  SYSCALL_x86_fsopen = 430,\n  SYSCALL_x86_fsconfig = 431,\n  SYSCALL_x86_fsmount = 432,\n  SYSCALL_x86_fspick = 433,\n  SYSCALL_x86_pidfd_open = 434,\n  SYSCALL_x86_clone3 = 435,\n  SYSCALL_x86_close_range = 436,\n  SYSCALL_x86_openat2 = 437,\n  SYSCALL_x86_pidfd_getfd = 438,\n  SYSCALL_x86_faccessat2 = 439,\n  SYSCALL_x86_process_madvise = 440,\n  SYSCALL_x86_epoll_pwait2 = 441,\n  SYSCALL_x86_mount_setattr = 442,\n  SYSCALL_x86_quotactl_fd = 443,\n  SYSCALL_x86_landlock_create_ruleset = 444,\n  SYSCALL_x86_landlock_add_rule = 445,\n  SYSCALL_x86_landlock_restrict_self = 446,\n  SYSCALL_x86_memfd_secret = 447,\n  SYSCALL_x86_process_mrelease = 448,\n  SYSCALL_x86_futex_waitv = 449,\n  SYSCALL_x86_set_mempolicy_home_node = 450,\n  SYSCALL_x86_cachestat = 451,\n  SYSCALL_x86_fchmodat2 = 452,\n  SYSCALL_x86_map_shadow_stack = 453,\n  SYSCALL_x86_futex_wake = 454,\n  SYSCALL_x86_futex_wait = 455,\n  SYSCALL_x86_futex_requeue = 456,\n  SYSCALL_x86_statmount = 457,\n  SYSCALL_x86_listmount = 458,\n  SYSCALL_x86_lsm_get_self_attr = 459,\n  SYSCALL_x86_lsm_set_self_attr = 460,\n  SYSCALL_x86_lsm_list_modules = 461,\n  SYSCALL_x86_mseal = 462,\n  SYSCALL_x86_setxattrat = 463,\n  SYSCALL_x86_getxattrat = 464,\n  SYSCALL_x86_listxattrat = 465,\n  SYSCALL_x86_removexattrat = 466,\n  SYSCALL_x86_MAX = 512,\n};\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/SyscallsNames.inl",
    "content": "/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n{ 0, \"restart_syscall\" },\n{ 1, \"exit\" },\n{ 2, \"fork\" },\n{ 3, \"read\" },\n{ 4, \"write\" },\n{ 5, \"open\" },\n{ 6, \"close\" },\n{ 7, \"waitpid\" },\n{ 8, \"creat\" },\n{ 9, \"link\" },\n{ 10, \"unlink\" },\n{ 11, \"execve\" },\n{ 12, \"chdir\" },\n{ 13, \"time\" },\n{ 14, \"mknod\" },\n{ 15, \"chmod\" },\n{ 16, \"lchown\" },\n{ 17, \"break\" },\n{ 18, \"oldstat\" },\n{ 19, \"lseek\" },\n{ 20, \"getpid\" },\n{ 21, \"mount\" },\n{ 22, \"umount\" },\n{ 23, \"setuid\" },\n{ 24, \"getuid\" },\n{ 25, \"stime\" },\n{ 26, \"ptrace\" },\n{ 27, \"alarm\" },\n{ 28, \"oldfstat\" },\n{ 29, \"pause\" },\n{ 30, \"utime\" },\n{ 31, \"stty\" },\n{ 32, \"gtty\" },\n{ 33, \"access\" },\n{ 34, \"nice\" },\n{ 35, \"ftime\" },\n{ 36, \"sync\" },\n{ 37, \"kill\" },\n{ 38, \"rename\" },\n{ 39, \"mkdir\" },\n{ 40, \"rmdir\" },\n{ 41, \"dup\" },\n{ 42, \"pipe\" },\n{ 43, \"times\" },\n{ 44, \"prof\" },\n{ 45, \"brk\" },\n{ 46, \"setgid\" },\n{ 47, \"getgid\" },\n{ 48, \"signal\" },\n{ 49, \"geteuid\" },\n{ 50, \"getegid\" },\n{ 51, \"acct\" },\n{ 52, \"umount2\" },\n{ 53, \"lock\" },\n{ 54, \"ioctl\" },\n{ 55, \"fcntl\" },\n{ 56, \"mpx\" },\n{ 57, \"setpgid\" },\n{ 58, \"ulimit\" },\n{ 59, \"oldolduname\" },\n{ 60, \"umask\" },\n{ 61, \"chroot\" },\n{ 62, \"ustat\" },\n{ 63, \"dup2\" },\n{ 64, \"getppid\" },\n{ 65, \"getpgrp\" },\n{ 66, \"setsid\" },\n{ 67, \"sigaction\" },\n{ 68, \"sgetmask\" },\n{ 69, \"ssetmask\" },\n{ 70, \"setreuid\" },\n{ 71, \"setregid\" },\n{ 72, \"sigsuspend\" },\n{ 73, \"sigpending\" },\n{ 74, \"sethostname\" },\n{ 75, \"setrlimit\" },\n{ 76, \"getrlimit\" },\n{ 77, \"getrusage\" },\n{ 78, \"gettimeofday\" },\n{ 79, \"settimeofday\" },\n{ 80, \"getgroups\" },\n{ 81, \"setgroups\" },\n{ 82, \"select\" },\n{ 83, \"symlink\" },\n{ 84, \"oldlstat\" },\n{ 85, \"readlink\" },\n{ 86, \"uselib\" },\n{ 87, \"swapon\" },\n{ 88, \"reboot\" },\n{ 89, \"readdir\" },\n{ 90, \"mmap\" },\n{ 91, \"munmap\" },\n{ 92, \"truncate\" },\n{ 93, \"ftruncate\" },\n{ 94, \"fchmod\" },\n{ 95, \"fchown\" },\n{ 96, \"getpriority\" },\n{ 97, \"setpriority\" },\n{ 98, \"profil\" },\n{ 99, \"statfs\" },\n{ 100, \"fstatfs\" },\n{ 101, \"ioperm\" },\n{ 102, \"socketcall\" },\n{ 103, \"syslog\" },\n{ 104, \"setitimer\" },\n{ 105, \"getitimer\" },\n{ 106, \"stat\" },\n{ 107, \"lstat\" },\n{ 108, \"fstat\" },\n{ 109, \"olduname\" },\n{ 110, \"iopl\" },\n{ 111, \"vhangup\" },\n{ 112, \"idle\" },\n{ 113, \"vm86old\" },\n{ 114, \"wait4\" },\n{ 115, \"swapoff\" },\n{ 116, \"sysinfo\" },\n{ 117, \"ipc\" },\n{ 118, \"fsync\" },\n{ 119, \"sigreturn\" },\n{ 120, \"clone\" },\n{ 121, \"setdomainname\" },\n{ 122, \"uname\" },\n{ 123, \"modify_ldt\" },\n{ 124, \"adjtimex\" },\n{ 125, \"mprotect\" },\n{ 126, \"sigprocmask\" },\n{ 127, \"create_module\" },\n{ 128, \"init_module\" },\n{ 129, \"delete_module\" },\n{ 130, \"get_kernel_syms\" },\n{ 131, \"quotactl\" },\n{ 132, \"getpgid\" },\n{ 133, \"fchdir\" },\n{ 134, \"bdflush\" },\n{ 135, \"sysfs\" },\n{ 136, \"personality\" },\n{ 137, \"afs_syscall\" },\n{ 138, \"setfsuid\" },\n{ 139, \"setfsgid\" },\n{ 140, \"_llseek\" },\n{ 141, \"getdents\" },\n{ 142, \"_newselect\" },\n{ 143, \"flock\" },\n{ 144, \"msync\" },\n{ 145, \"readv\" },\n{ 146, \"writev\" },\n{ 147, \"getsid\" },\n{ 148, \"fdatasync\" },\n{ 149, \"_sysctl\" },\n{ 150, \"mlock\" },\n{ 151, \"munlock\" },\n{ 152, \"mlockall\" },\n{ 153, \"munlockall\" },\n{ 154, \"sched_setparam\" },\n{ 155, \"sched_getparam\" },\n{ 156, \"sched_setscheduler\" },\n{ 157, \"sched_getscheduler\" },\n{ 158, \"sched_yield\" },\n{ 159, \"sched_get_priority_max\" },\n{ 160, \"sched_get_priority_min\" },\n{ 161, \"sched_rr_get_interval\" },\n{ 162, \"nanosleep\" },\n{ 163, \"mremap\" },\n{ 164, \"setresuid\" },\n{ 165, \"getresuid\" },\n{ 166, \"vm86\" },\n{ 167, \"query_module\" },\n{ 168, \"poll\" },\n{ 169, \"nfsservctl\" },\n{ 170, \"setresgid\" },\n{ 171, \"getresgid\" },\n{ 172, \"prctl\" },\n{ 173, \"rt_sigreturn\" },\n{ 174, \"rt_sigaction\" },\n{ 175, \"rt_sigprocmask\" },\n{ 176, \"rt_sigpending\" },\n{ 177, \"rt_sigtimedwait\" },\n{ 178, \"rt_sigqueueinfo\" },\n{ 179, \"rt_sigsuspend\" },\n{ 180, \"pread64\" },\n{ 181, \"pwrite64\" },\n{ 182, \"chown\" },\n{ 183, \"getcwd\" },\n{ 184, \"capget\" },\n{ 185, \"capset\" },\n{ 186, \"sigaltstack\" },\n{ 187, \"sendfile\" },\n{ 188, \"getpmsg\" },\n{ 189, \"putpmsg\" },\n{ 190, \"vfork\" },\n{ 191, \"ugetrlimit\" },\n{ 192, \"mmap2\" },\n{ 193, \"truncate64\" },\n{ 194, \"ftruncate64\" },\n{ 195, \"stat64\" },\n{ 196, \"lstat64\" },\n{ 197, \"fstat64\" },\n{ 198, \"lchown32\" },\n{ 199, \"getuid32\" },\n{ 200, \"getgid32\" },\n{ 201, \"geteuid32\" },\n{ 202, \"getegid32\" },\n{ 203, \"setreuid32\" },\n{ 204, \"setregid32\" },\n{ 205, \"getgroups32\" },\n{ 206, \"setgroups32\" },\n{ 207, \"fchown32\" },\n{ 208, \"setresuid32\" },\n{ 209, \"getresuid32\" },\n{ 210, \"setresgid32\" },\n{ 211, \"getresgid32\" },\n{ 212, \"chown32\" },\n{ 213, \"setuid32\" },\n{ 214, \"setgid32\" },\n{ 215, \"setfsuid32\" },\n{ 216, \"setfsgid32\" },\n{ 217, \"pivot_root\" },\n{ 218, \"mincore\" },\n{ 219, \"madvise\" },\n{ 220, \"getdents64\" },\n{ 221, \"fcntl64\" },\n{ 224, \"gettid\" },\n{ 225, \"readahead\" },\n{ 226, \"setxattr\" },\n{ 227, \"lsetxattr\" },\n{ 228, \"fsetxattr\" },\n{ 229, \"getxattr\" },\n{ 230, \"lgetxattr\" },\n{ 231, \"fgetxattr\" },\n{ 232, \"listxattr\" },\n{ 233, \"llistxattr\" },\n{ 234, \"flistxattr\" },\n{ 235, \"removexattr\" },\n{ 236, \"lremovexattr\" },\n{ 237, \"fremovexattr\" },\n{ 238, \"tkill\" },\n{ 239, \"sendfile64\" },\n{ 240, \"futex\" },\n{ 241, \"sched_setaffinity\" },\n{ 242, \"sched_getaffinity\" },\n{ 243, \"set_thread_area\" },\n{ 244, \"get_thread_area\" },\n{ 245, \"io_setup\" },\n{ 246, \"io_destroy\" },\n{ 247, \"io_getevents\" },\n{ 248, \"io_submit\" },\n{ 249, \"io_cancel\" },\n{ 250, \"fadvise64\" },\n{ 252, \"exit_group\" },\n{ 253, \"lookup_dcookie\" },\n{ 254, \"epoll_create\" },\n{ 255, \"epoll_ctl\" },\n{ 256, \"epoll_wait\" },\n{ 257, \"remap_file_pages\" },\n{ 258, \"set_tid_address\" },\n{ 259, \"timer_create\" },\n{ 260, \"timer_settime\" },\n{ 261, \"timer_gettime\" },\n{ 262, \"timer_getoverrun\" },\n{ 263, \"timer_delete\" },\n{ 264, \"clock_settime\" },\n{ 265, \"clock_gettime\" },\n{ 266, \"clock_getres\" },\n{ 267, \"clock_nanosleep\" },\n{ 268, \"statfs64\" },\n{ 269, \"fstatfs64\" },\n{ 270, \"tgkill\" },\n{ 271, \"utimes\" },\n{ 272, \"fadvise64_64\" },\n{ 273, \"vserver\" },\n{ 274, \"mbind\" },\n{ 275, \"get_mempolicy\" },\n{ 276, \"set_mempolicy\" },\n{ 277, \"mq_open\" },\n{ 278, \"mq_unlink\" },\n{ 279, \"mq_timedsend\" },\n{ 280, \"mq_timedreceive\" },\n{ 281, \"mq_notify\" },\n{ 282, \"mq_getsetattr\" },\n{ 283, \"kexec_load\" },\n{ 284, \"waitid\" },\n{ 286, \"add_key\" },\n{ 287, \"request_key\" },\n{ 288, \"keyctl\" },\n{ 289, \"ioprio_set\" },\n{ 290, \"ioprio_get\" },\n{ 291, \"inotify_init\" },\n{ 292, \"inotify_add_watch\" },\n{ 293, \"inotify_rm_watch\" },\n{ 294, \"migrate_pages\" },\n{ 295, \"openat\" },\n{ 296, \"mkdirat\" },\n{ 297, \"mknodat\" },\n{ 298, \"fchownat\" },\n{ 299, \"futimesat\" },\n{ 300, \"fstatat64\" },\n{ 301, \"unlinkat\" },\n{ 302, \"renameat\" },\n{ 303, \"linkat\" },\n{ 304, \"symlinkat\" },\n{ 305, \"readlinkat\" },\n{ 306, \"fchmodat\" },\n{ 307, \"faccessat\" },\n{ 308, \"pselect6\" },\n{ 309, \"ppoll\" },\n{ 310, \"unshare\" },\n{ 311, \"set_robust_list\" },\n{ 312, \"get_robust_list\" },\n{ 313, \"splice\" },\n{ 314, \"sync_file_range\" },\n{ 315, \"tee\" },\n{ 316, \"vmsplice\" },\n{ 317, \"move_pages\" },\n{ 318, \"getcpu\" },\n{ 319, \"epoll_pwait\" },\n{ 320, \"utimensat\" },\n{ 321, \"signalfd\" },\n{ 322, \"timerfd_create\" },\n{ 323, \"eventfd\" },\n{ 324, \"fallocate\" },\n{ 325, \"timerfd_settime\" },\n{ 326, \"timerfd_gettime\" },\n{ 327, \"signalfd4\" },\n{ 328, \"eventfd2\" },\n{ 329, \"epoll_create1\" },\n{ 330, \"dup3\" },\n{ 331, \"pipe2\" },\n{ 332, \"inotify_init1\" },\n{ 333, \"preadv\" },\n{ 334, \"pwritev\" },\n{ 335, \"rt_tgsigqueueinfo\" },\n{ 336, \"perf_event_open\" },\n{ 337, \"recvmmsg\" },\n{ 338, \"fanotify_init\" },\n{ 339, \"fanotify_mark\" },\n{ 340, \"prlimit64\" },\n{ 341, \"name_to_handle_at\" },\n{ 342, \"open_by_handle_at\" },\n{ 343, \"clock_adjtime\" },\n{ 344, \"syncfs\" },\n{ 345, \"sendmmsg\" },\n{ 346, \"setns\" },\n{ 347, \"process_vm_readv\" },\n{ 348, \"process_vm_writev\" },\n{ 349, \"kcmp\" },\n{ 350, \"finit_module\" },\n{ 351, \"sched_setattr\" },\n{ 352, \"sched_getattr\" },\n{ 353, \"renameat2\" },\n{ 354, \"seccomp\" },\n{ 355, \"getrandom\" },\n{ 356, \"memfd_create\" },\n{ 357, \"bpf\" },\n{ 358, \"execveat\" },\n{ 359, \"socket\" },\n{ 360, \"socketpair\" },\n{ 361, \"bind\" },\n{ 362, \"connect\" },\n{ 363, \"listen\" },\n{ 364, \"accept4\" },\n{ 365, \"getsockopt\" },\n{ 366, \"setsockopt\" },\n{ 367, \"getsockname\" },\n{ 368, \"getpeername\" },\n{ 369, \"sendto\" },\n{ 370, \"sendmsg\" },\n{ 371, \"recvfrom\" },\n{ 372, \"recvmsg\" },\n{ 373, \"shutdown\" },\n{ 374, \"userfaultfd\" },\n{ 375, \"membarrier\" },\n{ 376, \"mlock2\" },\n{ 377, \"copy_file_range\" },\n{ 378, \"preadv2\" },\n{ 379, \"pwritev2\" },\n{ 380, \"pkey_mprotect\" },\n{ 381, \"pkey_alloc\" },\n{ 382, \"pkey_free\" },\n{ 383, \"statx\" },\n{ 384, \"arch_prctl\" },\n{ 385, \"io_pgetevents\" },\n{ 386, \"rseq\" },\n{ 393, \"semget\" },\n{ 394, \"semctl\" },\n{ 395, \"shmget\" },\n{ 396, \"shmctl\" },\n{ 397, \"shmat\" },\n{ 398, \"shmdt\" },\n{ 399, \"msgget\" },\n{ 400, \"msgsnd\" },\n{ 401, \"msgrcv\" },\n{ 402, \"msgctl\" },\n{ 403, \"clock_gettime64\" },\n{ 404, \"clock_settime64\" },\n{ 405, \"clock_adjtime64\" },\n{ 406, \"clock_getres_time64\" },\n{ 407, \"clock_nanosleep_time64\" },\n{ 408, \"timer_gettime64\" },\n{ 409, \"timer_settime64\" },\n{ 410, \"timerfd_gettime64\" },\n{ 411, \"timerfd_settime64\" },\n{ 412, \"utimensat_time64\" },\n{ 413, \"pselect6_time64\" },\n{ 414, \"ppoll_time64\" },\n{ 416, \"io_pgetevents_time64\" },\n{ 417, \"recvmmsg_time64\" },\n{ 418, \"mq_timedsend_time64\" },\n{ 419, \"mq_timedreceive_time64\" },\n{ 420, \"semtimedop_time64\" },\n{ 421, \"rt_sigtimedwait_time64\" },\n{ 422, \"futex_time64\" },\n{ 423, \"sched_rr_get_interval_time64\" },\n{ 424, \"pidfd_send_signal\" },\n{ 425, \"io_uring_setup\" },\n{ 426, \"io_uring_enter\" },\n{ 427, \"io_uring_register\" },\n{ 428, \"open_tree\" },\n{ 429, \"move_mount\" },\n{ 430, \"fsopen\" },\n{ 431, \"fsconfig\" },\n{ 432, \"fsmount\" },\n{ 433, \"fspick\" },\n{ 434, \"pidfd_open\" },\n{ 435, \"clone3\" },\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Thread.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"ArchHelpers/UContext.h\"\n#include \"LinuxSyscalls/SignalDelegator.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Thread.h\"\n#include \"LinuxSyscalls/x32/Types.h\"\n\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <errno.h>\n#include <grp.h>\n#include <linux/futex.h>\n#include <sched.h>\n#include <signal.h>\n#include <sys/fsuid.h>\n#include <sys/resource.h>\n#include <sys/wait.h>\n#include <syscall.h>\n#include <time.h>\n#include <unistd.h>\n\nARG_TO_STR(FEX::HLE::x32::compat_ptr<FEX::HLE::x32::stack_t32>, \"%x\")\nARG_TO_STR(FEX::HLE::x32::compat_ptr<FEXCore::x86::siginfo_t>, \"%x\")\n\nnamespace FEX::HLE::x32 {\n// The kernel only gives 32-bit userspace 3 TLS segments\n// Depending on if the host kernel is 32-bit or 64-bit then the TLS index assigned is different\n//\n// Host kernel x86_64, valid TLS enries: 12,13,14\n// Host kernel x86, valid TLS enries: 6,7,8\n// Since we are claiming to be a 64-bit kernel, use the 64-bit range\n//\n// 6/12 = glibc\n// 7/13 = wine fs\n// 8/14 = etc\nconstexpr uint32_t TLS_NextEntry = 12;\nconstexpr uint32_t TLS_MaxEntry = TLS_NextEntry + 3;\n\nuint64_t SetThreadArea(FEXCore::Core::CpuStateFrame* Frame, void* tls) {\n  struct x32::user_desc* u_info = reinterpret_cast<struct x32::user_desc*>(tls);\n  FaultSafeUserMemAccess::VerifyIsReadable(u_info, sizeof(*u_info));\n\n  if (u_info->entry_number == -1) {\n    for (uint32_t i = TLS_NextEntry; i < TLS_MaxEntry; ++i) {\n      auto GDT = &Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_GDT][i];\n      if (Frame->State.CalculateGDTLimit(*GDT) == 0) {\n        // If the limit is zero then it isn't present with our setup\n        u_info->entry_number = i;\n        break;\n      }\n    }\n\n    if (u_info->entry_number == -1) {\n      // Couldn't find a slot. Return empty handed\n      return -ESRCH;\n    }\n  }\n\n  // Now we need to update the thread's GDT to handle this change\n  auto GDT = &Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_GDT][u_info->entry_number];\n  Frame->State.SetGDTBase(GDT, u_info->base_addr);\n  Frame->State.SetGDTLimit(GDT, 0xF'FFFFU);\n\n  // With the segment register optimization we need to check all of the segment registers and update.\n  const auto GetEntry = [](auto value) {\n    return value >> 3;\n  };\n  if (GetEntry(Frame->State.cs_idx) == u_info->entry_number) {\n    Frame->State.cs_cached = Frame->State.CalculateGDTBase(*GDT);\n  }\n  if (GetEntry(Frame->State.ds_idx) == u_info->entry_number) {\n    Frame->State.ds_cached = Frame->State.CalculateGDTBase(*GDT);\n  }\n  if (GetEntry(Frame->State.es_idx) == u_info->entry_number) {\n    Frame->State.es_cached = Frame->State.CalculateGDTBase(*GDT);\n  }\n  if (GetEntry(Frame->State.fs_idx) == u_info->entry_number) {\n    Frame->State.fs_cached = Frame->State.CalculateGDTBase(*GDT);\n  }\n  if (GetEntry(Frame->State.gs_idx) == u_info->entry_number) {\n    Frame->State.gs_cached = Frame->State.CalculateGDTBase(*GDT);\n  }\n  if (GetEntry(Frame->State.ss_idx) == u_info->entry_number) {\n    Frame->State.ss_cached = Frame->State.CalculateGDTBase(*GDT);\n  }\n  return 0;\n}\n\nvoid AdjustRipForNewThread(FEXCore::Core::CpuStateFrame* Frame) {\n  Frame->State.rip += 2;\n}\n\nvoid RegisterThread(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X32(sigreturn, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t {\n    FEX::HLE::_SyscallHandler->GetSignalDelegator()->HandleSignalHandlerReturn(false);\n    FEX_UNREACHABLE;\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    clone, ([](FEXCore::Core::CpuStateFrame* Frame, uint32_t flags, void* stack, pid_t* parent_tid, void* tls, pid_t* child_tid) -> uint64_t {\n      // This is slightly different EFAULT behaviour, if child_tid or parent_tid is invalid then the kernel just doesn't write to the\n      // pointer. Still need to be EFAULT safe although.\n      if ((flags & (CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)) && child_tid) {\n        FaultSafeUserMemAccess::VerifyIsWritable(child_tid, sizeof(*child_tid));\n      }\n\n      if ((flags & CLONE_PARENT_SETTID) && parent_tid) {\n        FaultSafeUserMemAccess::VerifyIsWritable(parent_tid, sizeof(*parent_tid));\n      }\n\n\n      FEX::HLE::clone3_args args {.Type = TypeOfClone::TYPE_CLONE2,\n                                  .args = {\n                                    .flags = flags & ~CSIGNAL,                       // This no longer contains CSIGNAL\n                                    .pidfd = reinterpret_cast<uint64_t>(parent_tid), // For clone, pidfd is duplicated here\n                                    .child_tid = reinterpret_cast<uint64_t>(child_tid),\n                                    .parent_tid = reinterpret_cast<uint64_t>(parent_tid),\n                                    .exit_signal = flags & CSIGNAL,\n                                    .stack = reinterpret_cast<uint64_t>(stack),\n                                    .stack_size = 0, // This syscall isn't able to see the stack size\n                                    .tls = reinterpret_cast<uint64_t>(tls),\n                                    .set_tid = 0, // This syscall isn't able to select TIDs\n                                    .set_tid_size = 0,\n                                    .cgroup = 0, // This syscall can't select cgroups\n                                  }};\n      return CloneHandler(Frame, &args);\n    }));\n\n  REGISTER_SYSCALL_IMPL_X32(waitpid, [](FEXCore::Core::CpuStateFrame* Frame, pid_t pid, int32_t* status, int32_t options) -> uint64_t {\n    uint64_t Result = ::waitpid(pid, status, options);\n    FaultSafeUserMemAccess::VerifyIsWritableOrNull(status, sizeof(*status));\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(nice, [](FEXCore::Core::CpuStateFrame* Frame, int inc) -> uint64_t {\n    uint64_t Result = ::nice(inc);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    set_thread_area, [](FEXCore::Core::CpuStateFrame* Frame, struct user_desc* u_info) -> uint64_t { return SetThreadArea(Frame, u_info); });\n\n  REGISTER_SYSCALL_IMPL_X32(get_thread_area, [](FEXCore::Core::CpuStateFrame* Frame, struct user_desc* u_info) -> uint64_t {\n    // Index to fetch comes from the user_desc\n    uint32_t Entry = u_info->entry_number;\n    if (Entry < TLS_NextEntry || Entry > TLS_MaxEntry) {\n      return -EINVAL;\n    }\n\n    FaultSafeUserMemAccess::VerifyIsWritable(u_info, sizeof(*u_info));\n\n    const auto& GDT = &Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_GDT][Entry];\n\n    memset(u_info, 0, sizeof(*u_info));\n\n    // FEX only stores base instead of the full GDT\n    u_info->base_addr = Frame->State.CalculateGDTBase(*GDT);\n\n    // Fill the rest of the structure with expected data (even if wrong at the moment)\n    if (u_info->base_addr) {\n      u_info->limit = 0xF'FFFF;\n      u_info->seg_32bit = 1;\n      u_info->limit_in_pages = 1;\n      u_info->useable = 1;\n    } else {\n      u_info->read_exec_only = 1;\n      u_info->seg_not_present = 1;\n    }\n    return 0;\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(set_robust_list, [](FEXCore::Core::CpuStateFrame* Frame, struct robust_list_head* head, size_t len) -> uint64_t {\n    if (len != 12) {\n      // Return invalid if the passed in length doesn't match what's expected.\n      return -EINVAL;\n    }\n\n    auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n    // Retain the robust list head but don't give it to the kernel\n    // The kernel would break if it tried parsing a 32bit robust list from a 64bit process\n    ThreadObject->ThreadInfo.robust_list_head = reinterpret_cast<uint64_t>(head);\n    return 0;\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    get_robust_list, [](FEXCore::Core::CpuStateFrame* Frame, int pid, struct robust_list_head** head, uint32_t* len_ptr) -> uint64_t {\n      FaultSafeUserMemAccess::VerifyIsWritable(head, sizeof(uint32_t));\n      FaultSafeUserMemAccess::VerifyIsWritable(len_ptr, sizeof(*len_ptr));\n\n      auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n      // Give the robust list back to the application\n      // Steam specifically checks to make sure the robust list is set\n      *(uint32_t*)head = (uint32_t)ThreadObject->ThreadInfo.robust_list_head;\n      *len_ptr = 12;\n      return 0;\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    futex, [](FEXCore::Core::CpuStateFrame* Frame, int* uaddr, int futex_op, int val, const timespec32* timeout, int* uaddr2, uint32_t val3) -> uint64_t {\n      const void* timeout_ptr = (const void*)timeout;\n      struct timespec tp64 {};\n      int cmd = futex_op & FUTEX_CMD_MASK;\n      if (timeout && (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI || cmd == FUTEX_WAIT_BITSET || cmd == FUTEX_WAIT_REQUEUE_PI)) {\n        FaultSafeUserMemAccess::VerifyIsReadable(timeout, sizeof(*timeout));\n        // timeout argument is only handled as timespec in these cases\n        // Otherwise just an integer\n        tp64 = *timeout;\n        timeout_ptr = &tp64;\n      }\n\n      uint64_t Result = syscall(SYSCALL_DEF(futex), uaddr, futex_op, val, timeout_ptr, uaddr2, val3);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    sigaltstack, [](FEXCore::Core::CpuStateFrame* Frame, const compat_ptr<stack_t32> ss, compat_ptr<stack_t32> old_ss) -> uint64_t {\n      stack_t ss64 {};\n      stack_t old64 {};\n\n      stack_t* ss64_ptr {};\n      stack_t* old64_ptr {};\n\n      if (ss) {\n        FaultSafeUserMemAccess::VerifyIsReadable(ss, sizeof(*ss));\n        ss64 = *ss;\n        ss64_ptr = &ss64;\n      }\n\n      if (old_ss) {\n        FaultSafeUserMemAccess::VerifyIsReadable(old_ss, sizeof(*old_ss));\n        old64 = *old_ss;\n        old64_ptr = &old64;\n      }\n      uint64_t Result = FEX::HLE::_SyscallHandler->GetSignalDelegator()->RegisterGuestSigAltStack(\n        FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame), ss64_ptr, old64_ptr);\n\n      if (Result == 0 && old_ss) {\n        FaultSafeUserMemAccess::VerifyIsWritable(old_ss, sizeof(*old_ss));\n        *old_ss = old64;\n      }\n      return Result;\n    });\n\n  // launch a new process under fex\n  // currently does not propagate argv[0] correctly\n  REGISTER_SYSCALL_IMPL_X32(execve, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, uint32_t* argv, uint32_t* envp) -> uint64_t {\n    fextl::vector<const char*> Args;\n    fextl::vector<const char*> Envp;\n\n    if (argv) {\n      for (int i = 0; argv[i]; i++) {\n        Args.push_back(reinterpret_cast<const char*>(static_cast<uintptr_t>(argv[i])));\n      }\n\n      Args.push_back(nullptr);\n    }\n\n    if (envp) {\n      for (int i = 0; envp[i]; i++) {\n        Envp.push_back(reinterpret_cast<const char*>(static_cast<uintptr_t>(envp[i])));\n      }\n      Envp.push_back(nullptr);\n    }\n\n    auto* const* ArgsPtr = argv ? const_cast<char* const*>(Args.data()) : nullptr;\n    auto* const* EnvpPtr = envp ? const_cast<char* const*>(Envp.data()) : nullptr;\n\n    FEX::HLE::ExecveAtArgs AtArgs = FEX::HLE::ExecveAtArgs::Empty();\n\n    return FEX::HLE::ExecveHandler(Frame, pathname, ArgsPtr, EnvpPtr, AtArgs);\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    execveat, ([](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, uint32_t* argv, uint32_t* envp, int flags) -> uint64_t {\n      fextl::vector<const char*> Args;\n      fextl::vector<const char*> Envp;\n\n      if (argv) {\n        for (int i = 0; argv[i]; i++) {\n          Args.push_back(reinterpret_cast<const char*>(static_cast<uintptr_t>(argv[i])));\n        }\n\n        Args.push_back(nullptr);\n      }\n\n      if (envp) {\n        for (int i = 0; envp[i]; i++) {\n          Envp.push_back(reinterpret_cast<const char*>(static_cast<uintptr_t>(envp[i])));\n        }\n        Envp.push_back(nullptr);\n      }\n\n      FEX::HLE::ExecveAtArgs AtArgs {\n        .dirfd = dirfd,\n        .flags = flags,\n      };\n\n      auto* const* ArgsPtr = argv ? const_cast<char* const*>(Args.data()) : nullptr;\n      auto* const* EnvpPtr = envp ? const_cast<char* const*>(Envp.data()) : nullptr;\n      return FEX::HLE::ExecveHandler(Frame, pathname, ArgsPtr, EnvpPtr, AtArgs);\n    }));\n\n  REGISTER_SYSCALL_IMPL_X32(wait4, [](FEXCore::Core::CpuStateFrame* Frame, pid_t pid, int* wstatus, int options, struct rusage_32* rusage) -> uint64_t {\n    struct rusage usage64 {};\n    struct rusage* usage64_p {};\n\n    if (rusage) {\n      FaultSafeUserMemAccess::VerifyIsReadable(rusage, sizeof(*rusage));\n      usage64 = *rusage;\n      usage64_p = &usage64;\n    }\n    uint64_t Result = ::wait4(pid, wstatus, options, usage64_p);\n    if (rusage) {\n      FaultSafeUserMemAccess::VerifyIsWritable(rusage, sizeof(*rusage));\n      *rusage = usage64;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(waitid,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int which, pid_t upid, compat_ptr<FEXCore::x86::siginfo_t> info,\n                               int options, struct rusage_32* rusage) -> uint64_t {\n                              struct rusage usage64 {};\n                              struct rusage* usage64_p {};\n\n                              siginfo_t info64 {};\n                              siginfo_t* info64_p {};\n\n                              if (rusage) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(rusage, sizeof(*rusage));\n                                usage64 = *rusage;\n                                usage64_p = &usage64;\n                              }\n\n                              if (info) {\n                                info64_p = &info64;\n                              }\n\n                              uint64_t Result = ::syscall(SYSCALL_DEF(waitid), which, upid, info64_p, options, usage64_p);\n\n                              if (Result != -1) {\n                                if (rusage) {\n                                  FaultSafeUserMemAccess::VerifyIsWritable(rusage, sizeof(*rusage));\n                                  *rusage = usage64;\n                                }\n\n                                if (info) {\n                                  FaultSafeUserMemAccess::VerifyIsWritable(info, sizeof(*info));\n                                  *info = info64;\n                                }\n                              }\n\n                              SYSCALL_ERRNO();\n                            });\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Thread.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#pragma once\n#include <stdint.h>\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nnamespace FEX::HLE::x32 {\n// We must define this ourselves since it doesn't exist on non-x86 platforms\nstruct user_desc {\n  uint32_t entry_number;\n  uint32_t base_addr;\n  uint32_t limit;\n  uint32_t seg_32bit       : 1;\n  uint32_t contents        : 2;\n  uint32_t read_exec_only  : 1;\n  uint32_t limit_in_pages  : 1;\n  uint32_t seg_not_present : 1;\n  uint32_t useable         : 1;\n};\n\nuint64_t SetThreadArea(FEXCore::Core::CpuStateFrame* Frame, void* tls);\nvoid AdjustRipForNewThread(FEXCore::Core::CpuStateFrame* Frame);\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Time.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Types.h\"\n\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n\n#include <stdint.h>\n#include <syscall.h>\n#include <sys/stat.h>\n#include <sys/time.h>\n#include <sys/timex.h>\n#include <time.h>\n#include <unistd.h>\n#include <utime.h>\n\nARG_TO_STR(FEX::HLE::x32::compat_ptr<FEX::HLE::x32::timespec32>, \"%lx\")\nARG_TO_STR(FEX::HLE::x32::compat_ptr<FEX::HLE::x32::timex32>, \"%lx\")\n\nstruct timespec;\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nnamespace FEX::HLE::x32 {\nvoid RegisterTime(FEX::HLE::SyscallHandler* Handler) {\n\n  REGISTER_SYSCALL_IMPL_X32(time, [](FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::x32::old_time32_t* tloc) -> uint64_t {\n    time_t Host {};\n    uint64_t Result = ::time(&Host);\n\n    if (tloc) {\n      FaultSafeUserMemAccess::VerifyIsWritable(tloc, sizeof(*tloc));\n      // On 32-bit this truncates\n      *tloc = (FEX::HLE::x32::old_time32_t)Host;\n    }\n\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(times, [](FEXCore::Core::CpuStateFrame* Frame, struct FEX::HLE::x32::compat_tms* buf) -> uint64_t {\n    struct tms Host {};\n    uint64_t Result = ::times(&Host);\n    if (buf) {\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n      *buf = Host;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(utime, [](FEXCore::Core::CpuStateFrame* Frame, char* filename, const FEX::HLE::x32::old_utimbuf32* times) -> uint64_t {\n    struct utimbuf Host {};\n    struct utimbuf* Host_p {};\n    if (times) {\n      FaultSafeUserMemAccess::VerifyIsReadable(times, sizeof(*times));\n      Host = *times;\n      Host_p = &Host;\n    }\n    uint64_t Result = ::utime(filename, Host_p);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(gettimeofday, [](FEXCore::Core::CpuStateFrame* Frame, timeval32* tv, struct timezone* tz) -> uint64_t {\n    struct timeval tv64 {};\n    struct timeval* tv_ptr {};\n    if (tv) {\n      tv_ptr = &tv64;\n    }\n\n    uint64_t Result = ::gettimeofday(tv_ptr, tz);\n\n    if (tv) {\n      FaultSafeUserMemAccess::VerifyIsWritable(tv, sizeof(*tv));\n      *tv = tv64;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(settimeofday, [](FEXCore::Core::CpuStateFrame* Frame, const timeval32* tv, const struct timezone* tz) -> uint64_t {\n    struct timeval tv64 {};\n    struct timeval* tv_ptr {};\n    if (tv) {\n      FaultSafeUserMemAccess::VerifyIsReadable(tv, sizeof(*tv));\n      tv64 = *tv;\n      tv_ptr = &tv64;\n    }\n\n    const uint64_t Result = ::settimeofday(tv_ptr, tz);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(nanosleep, [](FEXCore::Core::CpuStateFrame* Frame, const timespec32* req, timespec32* rem) -> uint64_t {\n    struct timespec rem64 {};\n    struct timespec* rem64_ptr {};\n\n    if (rem) {\n      FaultSafeUserMemAccess::VerifyIsReadable(rem, sizeof(*rem));\n      rem64 = *rem;\n      rem64_ptr = &rem64;\n    }\n\n    uint64_t Result = 0;\n    if (req) {\n      FaultSafeUserMemAccess::VerifyIsReadable(req, sizeof(*req));\n      const struct timespec req64 = *req;\n      Result = ::nanosleep(&req64, rem64_ptr);\n    } else {\n      Result = ::nanosleep(nullptr, rem64_ptr);\n    }\n\n    if (rem) {\n      FaultSafeUserMemAccess::VerifyIsWritable(rem, sizeof(*rem));\n      *rem = rem64;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(clock_gettime, [](FEXCore::Core::CpuStateFrame* Frame, clockid_t clk_id, timespec32* tp) -> uint64_t {\n    struct timespec tp64 {};\n    uint64_t Result = ::clock_gettime(clk_id, &tp64);\n    if (tp) {\n      FaultSafeUserMemAccess::VerifyIsWritable(tp, sizeof(*tp));\n      *tp = tp64;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(clock_getres, [](FEXCore::Core::CpuStateFrame* Frame, clockid_t clk_id, timespec32* tp) -> uint64_t {\n    struct timespec tp64 {};\n    uint64_t Result = ::clock_getres(clk_id, &tp64);\n    if (tp) {\n      FaultSafeUserMemAccess::VerifyIsWritable(tp, sizeof(*tp));\n      *tp = tp64;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    clock_nanosleep, [](FEXCore::Core::CpuStateFrame* Frame, clockid_t clockid, int flags, const timespec32* request, timespec32* remain) -> uint64_t {\n      struct timespec req64 {};\n      struct timespec* req64_ptr {};\n\n      struct timespec rem64 {};\n      struct timespec* rem64_ptr {};\n\n      if (request) {\n        FaultSafeUserMemAccess::VerifyIsReadable(request, sizeof(*request));\n        req64 = *request;\n        req64_ptr = &req64;\n      }\n\n      if (remain) {\n        FaultSafeUserMemAccess::VerifyIsReadable(remain, sizeof(*remain));\n        rem64 = *remain;\n        rem64_ptr = &rem64;\n      }\n\n      // Can't use glibc helper here since it does additional validation and data munging that breaks games.\n      uint64_t Result = ::syscall(SYSCALL_DEF(clock_nanosleep), clockid, flags, req64_ptr, rem64_ptr);\n\n      if (remain && (flags & TIMER_ABSTIME) == 0) {\n        FaultSafeUserMemAccess::VerifyIsWritable(remain, sizeof(*remain));\n        // Remain is completely ignored if TIMER_ABSTIME is set.\n        *remain = rem64;\n      }\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(clock_settime, [](FEXCore::Core::CpuStateFrame* Frame, clockid_t clockid, const timespec32* tp) -> uint64_t {\n    if (!tp) {\n      // clock_settime is required to pass a timespec.\n      return -EFAULT;\n    }\n\n    uint64_t Result = 0;\n    FaultSafeUserMemAccess::VerifyIsReadable(tp, sizeof(*tp));\n    const struct timespec tp64 = *tp;\n    Result = ::clock_settime(clockid, &tp64);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(futimesat, [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, const timeval32 times[2]) -> uint64_t {\n    return FEX::HLE::futimesat_compat<timeval32>(dirfd, pathname, times);\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    utimensat, [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, const compat_ptr<timespec32> times, int flags) -> uint64_t {\n      uint64_t Result = 0;\n      if (times) {\n        FaultSafeUserMemAccess::VerifyIsReadable(times, sizeof(timeval32) * 2);\n        timespec times64[2] {};\n        times64[0] = times[0];\n        times64[1] = times[1];\n        Result = ::syscall(SYSCALL_DEF(utimensat), dirfd, pathname, times64, flags);\n      } else {\n        Result = ::syscall(SYSCALL_DEF(utimensat), dirfd, pathname, nullptr, flags);\n      }\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(utimes, [](FEXCore::Core::CpuStateFrame* Frame, const char* filename, const timeval32 times[2]) -> uint64_t {\n    uint64_t Result = 0;\n    if (times) {\n      FaultSafeUserMemAccess::VerifyIsReadable(times, sizeof(timeval32) * 2);\n      struct timeval times64[2] {};\n      times64[0] = times[0];\n      times64[1] = times[1];\n      Result = ::utimes(filename, times64);\n    } else {\n      Result = ::utimes(filename, nullptr);\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(adjtimex, [](FEXCore::Core::CpuStateFrame* Frame, compat_ptr<FEX::HLE::x32::timex32> buf) -> uint64_t {\n    FaultSafeUserMemAccess::VerifyIsReadable(buf, sizeof(*buf));\n    struct timex Host {};\n    Host = *buf;\n    uint64_t Result = ::adjtimex(&Host);\n    if (Result != -1) {\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n      *buf = Host;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(clock_adjtime,\n                            [](FEXCore::Core::CpuStateFrame* Frame, clockid_t clk_id, compat_ptr<FEX::HLE::x32::timex32> buf) -> uint64_t {\n                              FaultSafeUserMemAccess::VerifyIsReadable(buf, sizeof(*buf));\n                              struct timex Host {};\n                              Host = *buf;\n                              uint64_t Result = ::clock_adjtime(clk_id, &Host);\n                              if (Result != -1) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n                                *buf = Host;\n                              }\n                              SYSCALL_ERRNO();\n                            });\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Timer.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/Types.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Types.h\"\n\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n\n#include <stdint.h>\n#include <syscall.h>\n#include <sys/time.h>\n#include <unistd.h>\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nARG_TO_STR(FEX::HLE::x32::compat_ptr<FEX::HLE::x32::sigevent32>, \"%lx\")\n\nnamespace FEX::HLE::x32 {\nvoid RegisterTimer(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X32(timer_settime,\n                            [](FEXCore::Core::CpuStateFrame* Frame, kernel_timer_t timerid, int flags,\n                               const FEX::HLE::x32::old_itimerspec32* new_value, FEX::HLE::x32::old_itimerspec32* old_value) -> uint64_t {\n                              itimerspec new_value_host {};\n                              itimerspec old_value_host {};\n                              itimerspec* old_value_host_p {};\n\n                              FaultSafeUserMemAccess::VerifyIsReadable(new_value, sizeof(*new_value));\n                              new_value_host = *new_value;\n                              if (old_value) {\n                                old_value_host_p = &old_value_host;\n                              }\n                              uint64_t Result = ::syscall(SYSCALL_DEF(timer_settime), timerid, flags, &new_value_host, old_value_host_p);\n                              if (Result != -1 && old_value) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(old_value, sizeof(*old_value));\n                                *old_value = old_value_host;\n                              }\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    timer_gettime, [](FEXCore::Core::CpuStateFrame* Frame, kernel_timer_t timerid, FEX::HLE::x32::old_itimerspec32* curr_value) -> uint64_t {\n      itimerspec curr_value_host {};\n      uint64_t Result = ::syscall(SYSCALL_DEF(timer_gettime), timerid, curr_value_host);\n      FaultSafeUserMemAccess::VerifyIsWritable(curr_value, sizeof(*curr_value));\n      *curr_value = curr_value_host;\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X32(getitimer, [](FEXCore::Core::CpuStateFrame* Frame, int which, FEX::HLE::x32::itimerval32* curr_value) -> uint64_t {\n    itimerval val {};\n    itimerval* val_p {};\n    if (curr_value) {\n      val_p = &val;\n    }\n    uint64_t Result = ::getitimer(which, val_p);\n    if (curr_value) {\n      FaultSafeUserMemAccess::VerifyIsWritable(curr_value, sizeof(*curr_value));\n      *curr_value = val;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X32(setitimer,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int which, const FEX::HLE::x32::itimerval32* new_value,\n                               FEX::HLE::x32::itimerval32* old_value) -> uint64_t {\n                              itimerval val {};\n                              itimerval old {};\n                              itimerval* val_p {};\n                              itimerval* old_p {};\n\n                              if (new_value) {\n                                FaultSafeUserMemAccess::VerifyIsReadable(new_value, sizeof(*new_value));\n                                val = *new_value;\n                                val_p = &val;\n                              }\n\n                              if (old_value) {\n                                old_p = &old;\n                              }\n\n                              uint64_t Result = ::setitimer(which, val_p, old_p);\n\n                              if (old_value) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(old_value, sizeof(*old_value));\n                                *old_value = old;\n                              }\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X32(\n    timer_create,\n    [](FEXCore::Core::CpuStateFrame* Frame, clockid_t clockid, compat_ptr<FEX::HLE::x32::sigevent32> sevp, kernel_timer_t* timerid) -> uint64_t {\n      FaultSafeUserMemAccess::VerifyIsReadable(sevp, sizeof(*sevp));\n      sigevent Host = *sevp;\n      uint64_t Result = ::syscall(SYSCALL_DEF(timer_create), clockid, &Host, timerid);\n      SYSCALL_ERRNO();\n    });\n}\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Types.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-32\n$end_info$\n*/\n\n#pragma once\n\n#include <FEXCore/Utils/CompilerDefs.h>\n\n#include <cstddef>\n#include <linux/types.h>\n#include <asm/ipcbuf.h>\n#include <asm/msgbuf.h>\n#include <asm/sembuf.h>\n#include <asm/shmbuf.h>\n#include <cstdint>\n#include <cstring>\n#include <fcntl.h>\n#include <limits>\n#include <linux/mqueue.h>\n#include <signal.h>\n#include <sys/resource.h>\n#include <sys/shm.h>\n#include <sys/socket.h>\n#include <sys/stat.h>\n#include <sys/statfs.h>\n#include <sys/times.h>\n#include <sys/timex.h>\n#include <sys/uio.h>\n#include <time.h>\n#include <type_traits>\n#include <utime.h>\n\n#include \"LinuxSyscalls/Types.h\"\n\nnamespace FEX::HLE::x32 {\n\n// Basic types to make tracking easier\nusing compat_ulong_t = uint32_t;\nusing compat_long_t = int32_t;\nusing compat_uptr_t = uint32_t;\nusing compat_size_t = uint32_t;\nusing compat_off_t = uint32_t;\nusing compat_pid_t = int32_t;\nusing compat_dev_t = uint16_t;\nusing compat_ino_t = uint32_t;\nusing compat_mode_t = uint16_t;\nusing compat_nlink_t = uint16_t;\nusing compat_uid_t = uint16_t;\nusing compat_gid_t = uint16_t;\nusing compat_old_sigset_t = uint32_t;\nusing old_time32_t = int32_t;\nusing compat_clock_t = int32_t;\nusing fd_set32 = uint32_t;\n\n// Can't use using with aligned attributes, clang doesn't honour it\ntypedef FEX_ALIGNED(4) uint64_t compat_uint64_t;\ntypedef FEX_ALIGNED(4) int64_t compat_int64_t;\ntypedef FEX_ALIGNED(4) int64_t compat_loff_t;\n\ntemplate<typename T>\nclass compat_ptr {\nprotected:\n  static compat_ptr FromAddress(uint32_t In) {\n    compat_ptr<T> ret;\n    ret.Ptr = In;\n    return ret;\n  }\n\n  compat_ptr() = default;\n\npublic:\n  template<typename T2 = T, typename = std::enable_if<!std::is_same<T2, void>::value, T2>>\n  T2& operator*() const {\n    return *Interpret();\n  }\n\n  T* operator->() {\n    return Interpret();\n  }\n\n  // In the case of non-void type, we can index the pointer\n  template<typename T2 = T, typename = std::enable_if<!std::is_same<T2, void>::value, T2>>\n  T2& operator[](size_t idx) const {\n    return *reinterpret_cast<T2*>(Ptr + sizeof(T2) * idx);\n  }\n\n  // In the case of void type, we need to trivially convert\n  template<typename T2 = T, typename = std::enable_if<std::is_same<T2, void>::value, T2>>\n  operator T2*() const {\n    return reinterpret_cast<T2*>(Ptr);\n  }\n\n  operator T*() const {\n    return Interpret();\n  }\n\n  explicit operator bool() const noexcept {\n    return !!Ptr;\n  }\n\n  explicit operator uintptr_t() const {\n    return Ptr;\n  }\n\n  uint32_t Ptr;\n\nprivate:\n  T* Interpret() const {\n    return reinterpret_cast<T*>(Ptr);\n  }\n};\nstatic_assert(std::is_trivially_copyable_v<compat_ptr<void>>);\nstatic_assert(sizeof(compat_ptr<void>) == 4);\n\n/**\n * Helper class to import a compat_ptr from a native pointer or raw address.\n *\n * Adding these custom constructors to compat_ptr itself would trigger clang's -Wpacked-non-pod warnings.\n */\ntemplate<typename T>\nclass auto_compat_ptr : public compat_ptr<T> {\n\npublic:\n  auto_compat_ptr(uint32_t In)\n    : compat_ptr<T> {compat_ptr<T>::FromAddress(In)} {}\n  auto_compat_ptr(T* In)\n    : compat_ptr<T> {compat_ptr<T>::FromAddress(static_cast<uint32_t>(reinterpret_cast<uintptr_t>(In)))} {}\n};\n\ntemplate<typename T>\nauto_compat_ptr(T*) -> auto_compat_ptr<T>;\n\n/**\n * @name timespec32\n *\n * This is a timespec implementation that matches 32bit linux implementation\n * Provides conversation operators for the host version\n * @{ */\n\nstruct FEX_ANNOTATE(\"alias-x86_32-timespec\") FEX_ANNOTATE(\"fex-match\") timespec32 {\n  int32_t tv_sec;\n  int32_t tv_nsec;\n\n  timespec32() = default;\n\n  operator timespec() const {\n    timespec spec {};\n    spec.tv_sec = tv_sec;\n    spec.tv_nsec = tv_nsec;\n    return spec;\n  }\n\n  timespec32(const struct timespec& spec) {\n    tv_sec = spec.tv_sec;\n    tv_nsec = spec.tv_nsec;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<timespec32>);\nstatic_assert(sizeof(timespec32) == 8);\n/**  @} */\n\n/**\n * @name timeval32\n *\n * This is a timeval implementation that matches 32bit linux implementation\n * Provides conversation operators for the host version\n * @{ */\n\nstruct FEX_ANNOTATE(\"alias-x86_32-timeval\") FEX_ANNOTATE(\"fex-match\") timeval32 {\n  int32_t tv_sec;\n  int32_t tv_usec;\n\n  timeval32() = delete;\n\n  operator timeval() const {\n    timeval spec {};\n    spec.tv_sec = tv_sec;\n    spec.tv_usec = tv_usec;\n    return spec;\n  }\n\n  timeval32(const struct timeval& spec) {\n    tv_sec = spec.tv_sec;\n    tv_usec = spec.tv_usec;\n  }\n};\n/**  @} */\n\nstatic_assert(std::is_trivially_copyable_v<timeval32>);\nstatic_assert(sizeof(timeval32) == 8);\n\n/**\n * @name itimerval32\n *\n * This is a itimerval implementation that matches 32bit linux implementation\n * Provides conversation operators for the host version\n * @{ */\n\nstruct FEX_ANNOTATE(\"alias-x86_32-itimerval\") FEX_ANNOTATE(\"fex-match\") itimerval32 {\n  FEX::HLE::x32::timeval32 it_interval;\n  FEX::HLE::x32::timeval32 it_value;\n\n  itimerval32() = delete;\n\n  operator itimerval() const {\n    itimerval spec {};\n    spec.it_interval = it_interval;\n    spec.it_value = it_value;\n    return spec;\n  }\n\n  itimerval32(const struct itimerval& spec)\n    : it_interval {spec.it_interval}\n    , it_value {spec.it_value} {}\n};\n/**  @} */\n\nstatic_assert(std::is_trivially_copyable_v<itimerval32>);\nstatic_assert(sizeof(itimerval32) == 16);\n\n/**\n * @name iovec32\n *\n * This is a iovec implementation that matches 32bit linux implementation\n * Provides conversation operators for the host version\n * @{ */\n\nstruct FEX_ANNOTATE(\"alias-x86_32-iovec\") FEX_ANNOTATE(\"fex-match\") iovec32 {\n  uint32_t iov_base;\n  uint32_t iov_len;\n\n  iovec32() = delete;\n\n  operator iovec() const {\n    iovec vec {};\n    vec.iov_base = reinterpret_cast<void*>(iov_base);\n    vec.iov_len = iov_len;\n    return vec;\n  }\n\n  iovec32(const struct iovec& vec) {\n    iov_base = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(vec.iov_base));\n    iov_len = vec.iov_len;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<iovec32>);\nstatic_assert(sizeof(iovec32) == 8);\n/**  @} */\n\nstruct FEX_ANNOTATE(\"alias-x86_32-cmsghdr\") FEX_ANNOTATE(\"fex-match\") cmsghdr32 {\n  uint32_t cmsg_len;\n  int32_t cmsg_level;\n  int32_t cmsg_type;\n  char cmsg_data[];\n};\n\nstatic_assert(std::is_trivially_copyable_v<cmsghdr32>);\nstatic_assert(sizeof(cmsghdr32) == 12);\n\nstruct FEX_ANNOTATE(\"alias-x86_32-msghdr\") FEX_ANNOTATE(\"fex-match\") msghdr32 {\n  compat_ptr<void> msg_name;\n  socklen_t msg_namelen;\n\n  compat_ptr<iovec32> msg_iov;\n  compat_size_t msg_iovlen;\n\n  compat_ptr<void> msg_control;\n  compat_size_t msg_controllen;\n  int32_t msg_flags;\n};\n\nstatic_assert(std::is_trivially_copyable_v<msghdr32>);\nstatic_assert(sizeof(msghdr32) == 28);\n\nstruct FEX_ANNOTATE(\"alias-x86_32-mmsghdr\") FEX_ANNOTATE(\"fex-match\") mmsghdr_32 {\n  msghdr32 msg_hdr;\n  uint32_t msg_len;\n};\n\nstatic_assert(std::is_trivially_copyable_v<mmsghdr_32>);\nstatic_assert(sizeof(mmsghdr_32) == 32);\n\nstruct FEX_ANNOTATE(\"alias-x86_32-stack_t\") FEX_ANNOTATE(\"fex-match\") stack_t32 {\n  compat_ptr<void> ss_sp;\n  int32_t ss_flags;\n  compat_size_t ss_size;\n\n  stack_t32() = delete;\n\n  operator stack_t() const {\n    stack_t ss {};\n    ss.ss_sp = ss_sp;\n    ss.ss_flags = ss_flags;\n    ss.ss_size = ss_size;\n    return ss;\n  }\n\n  stack_t32(const stack_t& ss)\n    : ss_sp {auto_compat_ptr {ss.ss_sp}} {\n    ss_flags = ss.ss_flags;\n    ss_size = ss.ss_size;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<stack_t32>);\nstatic_assert(sizeof(stack_t32) == 12);\n\nstruct\n  // This does not match the glibc implementation of stat\n  // Matches the definition of `struct compat_stat` in `arch/x86/include/asm/compat.h`\n  FEX_ANNOTATE(\"fex-match\") oldstat32 {\n  uint16_t st_dev;\n  uint16_t st_ino;\n  uint16_t st_mode;\n  uint16_t st_nlink;\n\n  uint16_t st_uid;\n  uint16_t st_gid;\n  uint16_t st_rdev;\n\n  uint32_t st_size;\n  uint32_t st_atime_;\n  uint32_t st_mtime_;\n  uint32_t st_ctime_;\n\n  oldstat32() = delete;\n\n  oldstat32(const struct stat& host) {\n#define COPY(x) x = host.x\n    const uint32_t MINORBITS = 20;\n    const uint32_t MINORMASK = (1U << MINORBITS) - 1;\n    auto EncodeOld = [](dev_t dev) -> uint16_t {\n      // This is a bit weird\n      return ((dev >> MINORBITS) << 8) | (dev & MINORMASK);\n    };\n\n    st_dev = EncodeOld(host.st_dev);\n    COPY(st_ino);\n    COPY(st_mode);\n    COPY(st_nlink);\n\n    COPY(st_uid);\n    COPY(st_gid);\n    st_rdev = EncodeOld(host.st_rdev);\n\n    COPY(st_size);\n\n    st_atime_ = host.st_atim.tv_sec;\n    st_mtime_ = host.st_mtime;\n    st_ctime_ = host.st_ctime;\n#undef COPY\n  }\n};\nstatic_assert(std::is_trivially_copyable_v<oldstat32>);\nstatic_assert(sizeof(oldstat32) == 32);\n\nstruct\n  // This does not match the glibc implementation of stat\n  // Matches the definition of `struct compat_stat` in `arch/x86/include/asm/compat.h`\n  FEX_ANNOTATE(\"fex-match\") stat32 {\n  compat_dev_t st_dev;\n  uint16_t __pad1;\n  compat_ino_t st_ino;\n  compat_mode_t st_mode;\n  compat_nlink_t st_nlink;\n\n  compat_uid_t st_uid;\n  compat_gid_t st_gid;\n  compat_dev_t st_rdev;\n\n  uint16_t __pad2;\n  uint32_t st_size;\n  uint32_t st_blksize;\n  uint32_t st_blocks; /* Number 512-byte blocks allocated. */\n  uint32_t st_atime_;\n  uint32_t fex_st_atime_nsec;\n  uint32_t st_mtime_;\n  uint32_t fex_st_mtime_nsec;\n  uint32_t st_ctime_;\n  uint32_t fex_st_ctime_nsec;\n  uint32_t __unused4;\n  uint32_t __unused5;\n\n  stat32() = delete;\n\n  stat32(const struct stat& host) {\n#define COPY(x) x = host.x\n    COPY(st_dev);\n    COPY(st_ino);\n    COPY(st_mode);\n    COPY(st_nlink);\n\n    COPY(st_uid);\n    COPY(st_gid);\n    COPY(st_rdev);\n\n    COPY(st_size);\n    COPY(st_blksize);\n    COPY(st_blocks);\n\n    st_atime_ = host.st_atim.tv_sec;\n    fex_st_atime_nsec = host.st_atim.tv_nsec;\n\n    st_mtime_ = host.st_mtime;\n    fex_st_mtime_nsec = host.st_mtim.tv_nsec;\n\n    st_ctime_ = host.st_ctime;\n    fex_st_ctime_nsec = host.st_ctim.tv_nsec;\n#undef COPY\n    __pad1 = __pad2 = __unused4 = __unused5 = 0;\n  }\n};\nstatic_assert(std::is_trivially_copyable_v<stat32>);\nstatic_assert(sizeof(stat32) == 64);\n\nstruct\n  // This does not match the glibc implementation of stat\n  // Matches the definition of `struct stat64` in `x86_64-linux-gnu/asm/stat.h`\n  FEX_ANNOTATE(\"fex-match\") FEX_PACKED stat64_32 {\n  compat_uint64_t st_dev;\n  uint8_t __pad0[4];\n  uint32_t __st_ino;\n\n  uint32_t st_mode;\n  uint32_t st_nlink;\n\n  uint32_t st_uid;\n  uint32_t st_gid;\n\n  compat_uint64_t st_rdev;\n  uint8_t __pad3[4];\n  compat_int64_t st_size;\n  uint32_t st_blksize;\n  compat_uint64_t st_blocks; /* Number 512-byte blocks allocated. */\n  uint32_t st_atime_;\n  uint32_t fex_st_atime_nsec;\n  uint32_t st_mtime_;\n  uint32_t fex_st_mtime_nsec;\n  uint32_t st_ctime_;\n  uint32_t fex_st_ctime_nsec;\n  compat_uint64_t st_ino;\n\n  stat64_32() = delete;\n\n  stat64_32(const struct stat& host) {\n#define COPY(x) x = host.x\n    COPY(st_dev);\n    COPY(st_ino);\n    COPY(st_nlink);\n\n    COPY(st_mode);\n    COPY(st_uid);\n    COPY(st_gid);\n\n    COPY(st_rdev);\n    COPY(st_size);\n    COPY(st_blksize);\n    COPY(st_blocks);\n\n    __st_ino = host.st_ino;\n\n    st_atime_ = host.st_atim.tv_sec;\n    fex_st_atime_nsec = host.st_atim.tv_nsec;\n\n    st_mtime_ = host.st_mtime;\n    fex_st_mtime_nsec = host.st_mtim.tv_nsec;\n\n    st_ctime_ = host.st_ctime;\n    fex_st_ctime_nsec = host.st_ctim.tv_nsec;\n#undef COPY\n  }\n\n#ifndef stat64\n  stat64_32(const struct stat64& host) {\n#define COPY(x) x = host.x\n    COPY(st_dev);\n    COPY(st_ino);\n    COPY(st_nlink);\n\n    COPY(st_mode);\n    COPY(st_uid);\n    COPY(st_gid);\n\n    COPY(st_rdev);\n    COPY(st_size);\n    COPY(st_blksize);\n    COPY(st_blocks);\n\n    __st_ino = host.st_ino;\n\n    st_atime_ = host.st_atim.tv_sec;\n    fex_st_atime_nsec = host.st_atim.tv_nsec;\n\n    st_mtime_ = host.st_mtime;\n    fex_st_mtime_nsec = host.st_mtim.tv_nsec;\n\n    st_ctime_ = host.st_ctime;\n    fex_st_ctime_nsec = host.st_ctim.tv_nsec;\n#undef COPY\n  }\n#endif\n};\nstatic_assert(std::is_trivially_copyable_v<stat64_32>);\nstatic_assert(sizeof(stat64_32) == 96);\n\nstruct FEX_PACKED FEX_ALIGNED(4) FEX_ANNOTATE(\"alias-x86_32-statfs64\") FEX_ANNOTATE(\"fex-match\") statfs64_32 {\n  uint32_t f_type;\n  uint32_t f_bsize;\n  compat_uint64_t f_blocks;\n  compat_uint64_t f_bfree;\n  compat_uint64_t f_bavail;\n  compat_uint64_t f_files;\n  compat_uint64_t f_ffree;\n  __kernel_fsid_t f_fsid;\n  uint32_t f_namelen;\n  uint32_t f_frsize;\n  uint32_t f_flags;\n  uint32_t pad[4];\n\n  statfs64_32() = delete;\n\n  statfs64_32(const struct statfs& host) {\n#define COPY(x) x = host.x\n    COPY(f_type);\n    COPY(f_bsize);\n    COPY(f_blocks);\n    COPY(f_bfree);\n    COPY(f_bavail);\n    COPY(f_files);\n    COPY(f_ffree);\n    COPY(f_namelen);\n    COPY(f_frsize);\n    COPY(f_flags);\n\n    memcpy(&f_fsid, &host.f_fsid, sizeof(f_fsid));\n#undef COPY\n  }\n\n#ifndef statfs64\n  statfs64_32(const struct statfs64& host) {\n#define COPY(x) x = host.x\n    COPY(f_type);\n    COPY(f_bsize);\n    COPY(f_blocks);\n    COPY(f_bfree);\n    COPY(f_bavail);\n    COPY(f_files);\n    COPY(f_ffree);\n    COPY(f_namelen);\n    COPY(f_frsize);\n    COPY(f_flags);\n\n    memcpy(&f_fsid, &host.f_fsid, sizeof(f_fsid));\n#undef COPY\n  }\n#endif\n};\nstatic_assert(std::is_trivially_copyable_v<statfs64_32>);\nstatic_assert(sizeof(statfs64_32) == 84);\n\nstruct FEX_ANNOTATE(\"alias-x86_32-statfs\") FEX_ANNOTATE(\"fex-match\") statfs32_32 {\n  int32_t f_type;\n  int32_t f_bsize;\n  int32_t f_blocks;\n  int32_t f_bfree;\n  int32_t f_bavail;\n  int32_t f_files;\n  int32_t f_ffree;\n  __kernel_fsid_t f_fsid;\n  int32_t f_namelen;\n  int32_t f_frsize;\n  int32_t f_flags;\n  int32_t pad[4];\n\n  statfs32_32() = delete;\n\n  statfs32_32(const struct statfs& host) {\n#define COPY(x) x = host.x\n    COPY(f_type);\n    COPY(f_bsize);\n    COPY(f_blocks);\n    COPY(f_bfree);\n    COPY(f_bavail);\n    COPY(f_files);\n    COPY(f_ffree);\n    COPY(f_namelen);\n    COPY(f_frsize);\n    COPY(f_flags);\n\n    memcpy(&f_fsid, &host.f_fsid, sizeof(f_fsid));\n#undef COPY\n  }\n\n#ifndef statfs64\n  statfs32_32(struct statfs64 host) {\n#define COPY(x) x = host.x\n    COPY(f_type);\n    COPY(f_bsize);\n    COPY(f_blocks);\n    COPY(f_bfree);\n    COPY(f_bavail);\n    COPY(f_files);\n    COPY(f_ffree);\n    COPY(f_namelen);\n    COPY(f_frsize);\n    COPY(f_flags);\n\n    memcpy(&f_fsid, &host.f_fsid, sizeof(f_fsid));\n#undef COPY\n  }\n#endif\n};\nstatic_assert(std::is_trivially_copyable_v<statfs32_32>);\nstatic_assert(sizeof(statfs32_32) == 64);\n\nstruct FEX_ANNOTATE(\"alias-x86_32-flock\") FEX_ANNOTATE(\"fex-match\") flock_32 {\n  int16_t l_type;\n  int16_t l_whence;\n  int32_t l_start;\n  int32_t l_len;\n  int32_t l_pid;\n\n  flock_32() = delete;\n\n  flock_32(const struct flock& host) {\n    l_type = host.l_type;\n    l_whence = host.l_whence;\n    l_start = host.l_start;\n    l_len = host.l_len;\n    l_pid = host.l_pid;\n  }\n\n  operator struct flock() const {\n    struct flock res {};\n    res.l_type = l_type;\n    res.l_whence = l_whence;\n    res.l_start = l_start;\n    res.l_len = l_len;\n    res.l_pid = l_pid;\n    return res;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<flock_32>);\nstatic_assert(sizeof(flock_32) == 16);\n\n// glibc doesn't pack flock64 while the kernel does\n// This does not match glibc flock64 definition\n// Matches the definition of `struct compat_flock64` in `arch/x86/include/asm/compat.h`\nstruct FEX_ANNOTATE(\"fex-match\") FEX_PACKED flock64_32 {\n  int16_t l_type;\n  int16_t l_whence;\n  compat_loff_t l_start;\n  compat_loff_t l_len;\n  compat_pid_t l_pid;\n\n  flock64_32() = delete;\n\n  flock64_32(const struct flock& host) {\n    l_type = host.l_type;\n    l_whence = host.l_whence;\n    l_start = host.l_start;\n    l_len = host.l_len;\n    l_pid = host.l_pid;\n  }\n\n  operator struct flock() const {\n    struct flock res {};\n    res.l_type = l_type;\n    res.l_whence = l_whence;\n    res.l_start = l_start;\n    res.l_len = l_len;\n    res.l_pid = l_pid;\n    return res;\n  }\n};\nstatic_assert(std::is_trivially_copyable_v<flock64_32>);\nstatic_assert(sizeof(flock64_32) == 24);\n\n// There is no public definition of this struct\n// Matches the definition of `struct linux_dirent` in fs/readdir.c\nstruct FEX_ANNOTATE(\"fex-match\") linux_dirent {\n  compat_uint64_t d_ino;\n  compat_int64_t d_off;\n  uint16_t d_reclen;\n  uint8_t _pad[6];\n  char d_name[];\n};\nstatic_assert(std::is_trivially_copyable_v<linux_dirent>);\nstatic_assert(sizeof(linux_dirent) == 24);\n\n// There is no public definition of this struct\n// Matches the definition of `struct compat_linux_dirent` in fs/readdir.c\nstruct FEX_ANNOTATE(\"fex-match\") linux_dirent_32 {\n  compat_ulong_t d_ino;\n  compat_ulong_t d_off;\n  uint16_t d_reclen;\n  char d_name[1];\n  /* Has hidden null character and d_type */\n};\nstatic_assert(std::is_trivially_copyable_v<linux_dirent_32>);\nstatic_assert(sizeof(linux_dirent_32) == 12);\n\n// There is no public definition of this struct\n// Matches the definition of `struct linux_dirent64` in include/linux/dirent.h\nstruct FEX_ANNOTATE(\"fex-match\") linux_dirent_64 {\n  compat_uint64_t d_ino;\n  compat_uint64_t d_off;\n  uint16_t d_reclen;\n  uint8_t d_type;\n  uint8_t _pad[5];\n  char d_name[];\n};\nstatic_assert(std::is_trivially_copyable_v<linux_dirent_64>);\nstatic_assert(sizeof(linux_dirent_64) == 24);\n\n// There is no public definition of this struct\n// Matches `struct compat_sigset_argpack`\nstruct FEX_ANNOTATE(\"fex-match\") sigset_argpack32 {\n  compat_ptr<uint64_t> sigset;\n  compat_size_t size;\n};\n\nstatic_assert(std::is_trivially_copyable_v<sigset_argpack32>);\nstatic_assert(sizeof(sigset_argpack32) == 8);\n\nstruct FEX_ANNOTATE(\"alias-x86_32-rusage\") FEX_ANNOTATE(\"fex-match\") rusage_32 {\n  timeval32 ru_utime;\n  timeval32 ru_stime;\n  union {\n    compat_long_t ru_maxrss;\n    compat_long_t __ru_maxrss_word;\n  };\n  union {\n    compat_long_t ru_ixrss;\n    compat_long_t __ru_ixrss_word;\n  };\n  union {\n    compat_long_t ru_idrss;\n    compat_long_t __ru_idrss_word;\n  };\n  union {\n    compat_long_t ru_isrss;\n    compat_long_t __ru_isrss_word;\n  };\n  union {\n    compat_long_t ru_minflt;\n    compat_long_t __ru_minflt_word;\n  };\n  union {\n    compat_long_t ru_majflt;\n    compat_long_t __ru_majflt_word;\n  };\n  union {\n    compat_long_t ru_nswap;\n    compat_long_t __ru_nswap_word;\n  };\n  union {\n    compat_long_t ru_inblock;\n    compat_long_t __ru_inblock_word;\n  };\n  union {\n    compat_long_t ru_oublock;\n    compat_long_t __ru_oublock_word;\n  };\n  union {\n    compat_long_t ru_msgsnd;\n    compat_long_t __ru_msgsnd_word;\n  };\n  union {\n    compat_long_t ru_msgrcv;\n    compat_long_t __ru_msgrcv_word;\n  };\n  union {\n    compat_long_t ru_nsignals;\n    compat_long_t __ru_nsignals_word;\n  };\n  union {\n    compat_long_t ru_nvcsw;\n    compat_long_t __ru_nvcsw_word;\n  };\n  union {\n    compat_long_t ru_nivcsw;\n    compat_long_t __ru_nivcsw_word;\n  };\n\n  rusage_32() = delete;\n  rusage_32(const struct rusage& usage)\n    : ru_utime {usage.ru_utime}\n    , ru_stime {usage.ru_stime} {\n    // These only truncate\n    ru_maxrss = usage.ru_maxrss;\n    ru_ixrss = usage.ru_ixrss;\n    ru_idrss = usage.ru_idrss;\n    ru_isrss = usage.ru_isrss;\n    ru_minflt = usage.ru_minflt;\n    ru_majflt = usage.ru_majflt;\n    ru_nswap = usage.ru_nswap;\n    ru_inblock = usage.ru_inblock;\n    ru_oublock = usage.ru_oublock;\n    ru_msgsnd = usage.ru_msgsnd;\n    ru_msgrcv = usage.ru_msgrcv;\n    ru_nsignals = usage.ru_nsignals;\n    ru_nvcsw = usage.ru_nvcsw;\n    ru_nivcsw = usage.ru_nivcsw;\n  }\n\n  operator struct rusage() const {\n    struct rusage usage {};\n    usage.ru_utime = ru_utime;\n    usage.ru_stime = ru_stime;\n    usage.ru_maxrss = ru_maxrss;\n    usage.ru_ixrss = ru_ixrss;\n    usage.ru_idrss = ru_idrss;\n    usage.ru_isrss = ru_isrss;\n    usage.ru_minflt = ru_minflt;\n    usage.ru_majflt = ru_majflt;\n    usage.ru_nswap = ru_nswap;\n    usage.ru_inblock = ru_inblock;\n    usage.ru_oublock = ru_oublock;\n    usage.ru_msgsnd = ru_msgsnd;\n    usage.ru_msgrcv = ru_msgrcv;\n    usage.ru_nsignals = ru_nsignals;\n    usage.ru_nvcsw = ru_nvcsw;\n    usage.ru_nivcsw = ru_nivcsw;\n\n    return usage;\n  }\n};\nstatic_assert(std::is_trivially_copyable_v<rusage_32>);\nstatic_assert(sizeof(rusage_32) == 72);\n\nstruct FEX_PACKED FEX_ANNOTATE(\"fex-match\") OldGuestSigAction_32 {\n  FEX::HLE::x32::compat_ptr<void> handler_32;\n  uint32_t sa_mask;\n  uint32_t sa_flags;\n  FEX::HLE::x32::compat_ptr<void> restorer_32;\n\n  OldGuestSigAction_32() = delete;\n\n  operator FEX::HLE::GuestSigAction() const {\n    FEX::HLE::GuestSigAction action {};\n\n    action.sigaction_handler.handler = reinterpret_cast<decltype(action.sigaction_handler.handler)>(handler_32.Ptr);\n    action.sa_flags = sa_flags;\n    action.restorer = reinterpret_cast<decltype(action.restorer)>(restorer_32.Ptr);\n    action.sa_mask.Val = sa_mask;\n    return action;\n  }\n\n  OldGuestSigAction_32(const FEX::HLE::GuestSigAction& action)\n    : handler_32 {auto_compat_ptr {reinterpret_cast<void*>(action.sigaction_handler.handler)}}\n    , restorer_32 {auto_compat_ptr {reinterpret_cast<void*>(action.restorer)}} {\n    sa_flags = action.sa_flags;\n    sa_mask = action.sa_mask.Val;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<OldGuestSigAction_32>);\nstatic_assert(sizeof(OldGuestSigAction_32) == 16);\n\n// This definition isn't public\n// This is for rt_sigaction\n// Matches the definition for `struct compat_sigaction` in `include/linux/compat.h`\nstruct FEX_PACKED FEX_ANNOTATE(\"fex-match\") GuestSigAction_32 {\n  FEX::HLE::x32::compat_ptr<void> handler_32;\n\n  uint32_t sa_flags;\n  FEX::HLE::x32::compat_ptr<void> restorer_32;\n  FEX::HLE::GuestSAMask sa_mask;\n\n  GuestSigAction_32() = delete;\n\n  operator FEX::HLE::GuestSigAction() const {\n    FEX::HLE::GuestSigAction action {};\n\n    action.sigaction_handler.handler = reinterpret_cast<decltype(action.sigaction_handler.handler)>(handler_32.Ptr);\n    action.sa_flags = sa_flags;\n    action.restorer = reinterpret_cast<decltype(action.restorer)>(restorer_32.Ptr);\n    action.sa_mask = sa_mask;\n    return action;\n  }\n\n  GuestSigAction_32(const FEX::HLE::GuestSigAction& action)\n    : handler_32 {auto_compat_ptr {reinterpret_cast<void*>(action.sigaction_handler.handler)}}\n    , restorer_32 {auto_compat_ptr {reinterpret_cast<void*>(action.restorer)}} {\n    sa_flags = action.sa_flags;\n    sa_mask = action.sa_mask;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<GuestSigAction_32>);\nstatic_assert(sizeof(GuestSigAction_32) == 20);\n\nstruct FEX_ANNOTATE(\"alias-x86_32-tms\") FEX_ANNOTATE(\"fex-match\") compat_tms {\n  compat_clock_t tms_utime;\n  compat_clock_t tms_stime;\n  compat_clock_t tms_cutime;\n  compat_clock_t tms_cstime;\n\n  compat_tms() = delete;\n  operator tms() const {\n    tms val {};\n    val.tms_utime = tms_utime;\n    val.tms_stime = tms_stime;\n    val.tms_cutime = tms_cutime;\n    val.tms_cstime = tms_cstime;\n    return val;\n  }\n  compat_tms(const struct tms& val) {\n    tms_utime = val.tms_utime;\n    tms_stime = val.tms_stime;\n    tms_cutime = val.tms_cutime;\n    tms_cstime = val.tms_cstime;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<compat_tms>);\nstatic_assert(sizeof(compat_tms) == 16);\n\nstruct FEX_ANNOTATE(\"alias-x86_32-utimbuf\") FEX_ANNOTATE(\"fex-match\") old_utimbuf32 {\n  old_time32_t actime;\n  old_time32_t modtime;\n\n  old_utimbuf32() = delete;\n  operator utimbuf() const {\n    utimbuf val {};\n    val.actime = actime;\n    val.modtime = modtime;\n    return val;\n  }\n\n  old_utimbuf32(const struct utimbuf& val) {\n    actime = val.actime;\n    modtime = val.modtime;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<old_utimbuf32>);\nstatic_assert(sizeof(old_utimbuf32) == 8);\n\nstruct FEX_ANNOTATE(\"alias-x86_32-itimerspec\") FEX_ANNOTATE(\"fex-match\") old_itimerspec32 {\n  timespec32 it_interval;\n  timespec32 it_value;\n\n  old_itimerspec32() = delete;\n  operator itimerspec() const {\n    itimerspec val {};\n    val.it_interval = it_interval;\n    val.it_value = it_value;\n    return val;\n  }\n\n  old_itimerspec32(const struct itimerspec& val)\n    : it_interval {val.it_interval}\n    , it_value {val.it_value} {}\n};\n\nstatic_assert(std::is_trivially_copyable_v<old_itimerspec32>);\nstatic_assert(sizeof(old_itimerspec32) == 16);\n\ntemplate<bool Signed>\nstruct FEX_ANNOTATE(\"alias-x86_32-rlimit\") FEX_ANNOTATE(\"fex-match\") rlimit32 {\n  uint32_t rlim_cur;\n  uint32_t rlim_max;\n  rlimit32() = delete;\n\n  operator rlimit() const {\n    static_assert(Signed == false, \"Signed variant doesn't exist\");\n    rlimit val {};\n\n    val.rlim_cur = rlim_cur;\n    val.rlim_max = rlim_max;\n\n    if (val.rlim_cur == ~0U) {\n      val.rlim_cur = ~0UL;\n    }\n    if (val.rlim_max == ~0U) {\n      val.rlim_max = ~0UL;\n    }\n\n    return val;\n  }\n\n  rlimit32(const struct rlimit& val) {\n    constexpr uint32_t Limit = Signed ? 0x7FFF'FFFF : 0xFFFF'FFFF;\n    if (val.rlim_cur > Limit) {\n      rlim_cur = Limit;\n    } else {\n      rlim_cur = val.rlim_cur;\n    }\n\n    if (val.rlim_max > Limit) {\n      rlim_max = Limit;\n    } else {\n      rlim_max = val.rlim_max;\n    }\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<rlimit32<true>>);\nstatic_assert(sizeof(rlimit32<true>) == 8);\n\nstruct FEX_ANNOTATE(\"alias-x86_32-timex\") FEX_ANNOTATE(\"fex-match\") timex32 {\n  uint32_t modes;\n  compat_long_t offset;\n  compat_long_t freq;\n  compat_long_t maxerror;\n  compat_long_t esterror;\n  int32_t status;\n  compat_long_t constant;\n  compat_long_t precision;\n  compat_long_t tolerance;\n  timeval32 time;\n  compat_long_t tick;\n  compat_long_t ppsfreq;\n  compat_long_t jitter;\n  int32_t shift;\n  compat_long_t stabil;\n  compat_long_t jitcnt;\n  compat_long_t calcnt;\n  compat_long_t errcnt;\n  compat_long_t stbcnt;\n\n  int32_t tai;\n\n  // Padding\n  int32_t : 32;\n  int32_t : 32;\n  int32_t : 32;\n  int32_t : 32;\n  int32_t : 32;\n  int32_t : 32;\n  int32_t : 32;\n  int32_t : 32;\n  int32_t : 32;\n  int32_t : 32;\n  int32_t : 32;\n\n  timex32() = delete;\n\n  operator timex() const {\n    timex val {};\n    val.modes = modes;\n    val.offset = offset;\n    val.freq = freq;\n    val.maxerror = maxerror;\n    val.esterror = esterror;\n    val.status = status;\n    val.constant = constant;\n    val.precision = precision;\n    val.tolerance = tolerance;\n    val.time = time;\n    val.tick = tick;\n    val.ppsfreq = ppsfreq;\n    val.jitter = jitter;\n    val.shift = shift;\n    val.stabil = stabil;\n    val.jitcnt = jitcnt;\n    val.calcnt = calcnt;\n    val.errcnt = errcnt;\n    val.stbcnt = stbcnt;\n    val.tai = tai;\n    return val;\n  }\n\n  timex32(const struct timex& val)\n    : time {val.time} {\n    modes = val.modes;\n    offset = val.offset;\n    freq = val.freq;\n    maxerror = val.maxerror;\n    esterror = val.esterror;\n    status = val.status;\n    constant = val.constant;\n    precision = val.precision;\n    tolerance = val.tolerance;\n    tick = val.tick;\n    ppsfreq = val.ppsfreq;\n    jitter = val.jitter;\n    shift = val.shift;\n    stabil = val.stabil;\n    jitcnt = val.jitcnt;\n    calcnt = val.calcnt;\n    errcnt = val.errcnt;\n    stbcnt = val.stbcnt;\n    tai = val.tai;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<timex32>);\nstatic_assert(sizeof(timex32) == 128);\n\nunion FEX_ANNOTATE(\"alias-x86_32-sigval\") FEX_ANNOTATE(\"fex-match\") sigval32 {\n  int sival_int;\n  compat_ptr<void> sival_ptr;\n\n  sigval32() = delete;\n\n  operator sigval() const {\n    sigval val {};\n    val.sival_ptr = sival_ptr;\n    return val;\n  }\n\n  sigval32(sigval val) {\n    sival_ptr = auto_compat_ptr {val.sival_ptr};\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<sigval32>);\nstatic_assert(sizeof(sigval32) == 4);\n\nconstexpr size_t FEX_SIGEV_MAX_SIZE = 64;\nconstexpr size_t FEX_SIGEV_PAD_SIZE = (FEX_SIGEV_MAX_SIZE - (sizeof(int32_t) * 2 + sizeof(sigval32))) / sizeof(int32_t);\n\nstruct FEX_ANNOTATE(\"fex-match\") sigevent32 {\n  FEX::HLE::x32::sigval32 sigev_value;\n  int sigev_signo;\n  int sigev_notify;\n  union {\n    int _pad[FEX_SIGEV_PAD_SIZE];\n    int _tid;\n    struct {\n      uint32_t _function;\n      uint32_t _attribute;\n    } _sigev_thread;\n  } _sigev_un;\n\n  sigevent32() = delete;\n\n// For older build environments\n#ifndef sigev_notify_thread_id\n#define sigev_notify_thread_id _sigev_un._tid\n#endif\n\n  operator sigevent() const {\n    sigevent val {};\n    val.sigev_value = sigev_value;\n    val.sigev_signo = sigev_signo;\n    val.sigev_notify = sigev_notify;\n\n    if (sigev_notify == SIGEV_THREAD_ID) {\n      val.sigev_notify_thread_id = _sigev_un._tid;\n    } else if (sigev_notify == SIGEV_THREAD) {\n      val.sigev_notify_function = reinterpret_cast<void (*)(sigval)>(_sigev_un._sigev_thread._function);\n      val.sigev_notify_attributes = reinterpret_cast<pthread_attr_t*>(_sigev_un._sigev_thread._attribute);\n    }\n    return val;\n  }\n\n  sigevent32(const sigevent& val)\n    : sigev_value {val.sigev_value} {\n    sigev_signo = val.sigev_signo;\n    sigev_notify = val.sigev_notify;\n\n    if (sigev_notify == SIGEV_THREAD_ID) {\n      _sigev_un._tid = val.sigev_notify_thread_id;\n    } else if (sigev_notify == SIGEV_THREAD) {\n      _sigev_un._sigev_thread._function = static_cast<uint32_t>(reinterpret_cast<uint64_t>(val.sigev_notify_function));\n      _sigev_un._sigev_thread._attribute = static_cast<uint32_t>(reinterpret_cast<uint64_t>(val.sigev_notify_attributes));\n    }\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<sigval32>);\nstatic_assert(sizeof(sigval32) == 4);\n\nstruct FEX_ANNOTATE(\"alias-x86_32-mq_attr\") FEX_ANNOTATE(\"fex-match\") mq_attr32 {\n  compat_long_t mq_flags;\n  compat_long_t mq_maxmsg;\n  compat_long_t mq_msgsize;\n  compat_long_t mq_curmsgs;\n  compat_long_t __pad[4];\n  mq_attr32() = delete;\n\n  operator mq_attr() const {\n    struct mq_attr val {};\n    val.mq_flags = mq_flags;\n    val.mq_maxmsg = mq_maxmsg;\n    val.mq_msgsize = mq_msgsize;\n    val.mq_curmsgs = mq_curmsgs;\n    return val;\n  }\n\n  mq_attr32(const struct mq_attr& val) {\n    mq_flags = val.mq_flags;\n    mq_maxmsg = val.mq_maxmsg;\n    mq_msgsize = val.mq_msgsize;\n    mq_curmsgs = val.mq_curmsgs;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<mq_attr32>);\nstatic_assert(sizeof(mq_attr32) == 32);\n\nunion FEX_ANNOTATE(\"alias-x86_32-epoll_data_t\") FEX_ANNOTATE(\"fex-match\") epoll_data32 {\n  compat_ptr<void> ptr;\n  int fd;\n  uint32_t u32;\n  compat_uint64_t u64;\n};\n\nstruct FEX_PACKED FEX_ANNOTATE(\"alias-x86_32-epoll_event\") FEX_ANNOTATE(\"fex-match\") epoll_event32 {\n  uint32_t events;\n  epoll_data32 data;\n\n  epoll_event32() = delete;\n\n  operator struct epoll_event() const {\n    epoll_event event {};\n    event.events = events;\n    event.data.u64 = data.u64;\n    return event;\n  }\n\n  epoll_event32(const struct epoll_event& event)\n    : data {auto_compat_ptr<void> {static_cast<uint32_t>(event.data.u64)}} {\n    events = event.events;\n  }\n};\nstatic_assert(std::is_trivially_copyable_v<epoll_event32>);\nstatic_assert(sizeof(epoll_event32) == 12);\n\nstruct ipc_perm_32 {\n  uint32_t key;\n  uint16_t uid;\n  uint16_t gid;\n  uint16_t cuid;\n  uint16_t cgid;\n  uint16_t mode;\n  uint16_t seq;\n\n  ipc_perm_32() = delete;\n\n  operator struct ipc64_perm() const {\n    struct ipc64_perm perm {};\n    perm.key = key;\n    perm.uid = uid;\n    perm.gid = gid;\n    perm.cuid = cuid;\n    perm.cgid = cgid;\n    perm.mode = mode;\n    perm.seq = seq;\n    return perm;\n  }\n\n  ipc_perm_32(const struct ipc64_perm& perm) {\n    key = perm.key;\n    uid = perm.uid;\n    gid = perm.gid;\n    cuid = perm.cuid;\n    cgid = perm.cgid;\n    mode = perm.mode;\n    seq = perm.seq;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<ipc_perm_32>);\nstatic_assert(sizeof(ipc_perm_32) == 16);\n\nstruct ipc_perm_64 {\n  uint32_t key;\n  uint32_t uid;\n  uint32_t gid;\n  uint32_t cuid;\n  uint32_t cgid;\n  uint16_t mode;\n  uint16_t _pad1;\n  uint16_t seq;\n  uint16_t _pad2;\n  compat_ulong_t _pad[2];\n\n  ipc_perm_64() = delete;\n\n  operator struct ipc64_perm() const {\n    struct ipc64_perm perm {};\n    perm.key = key;\n    perm.uid = uid;\n    perm.gid = gid;\n    perm.cuid = cuid;\n    perm.cgid = cgid;\n    perm.mode = mode;\n    perm.seq = seq;\n    return perm;\n  }\n\n  ipc_perm_64(const struct ipc64_perm& perm) {\n    key = perm.key;\n    uid = perm.uid;\n    gid = perm.gid;\n    cuid = perm.cuid;\n    cgid = perm.cgid;\n    mode = perm.mode;\n    seq = perm.seq;\n    _pad1 = _pad2 = 0;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<ipc_perm_64>);\nstatic_assert(sizeof(ipc_perm_64) == 36);\n\nstruct shmid_ds_32 {\n  ipc_perm_32 shm_perm;\n  int32_t shm_segsz;\n  int32_t shm_atime;\n  int32_t shm_dtime;\n  int32_t shm_ctime;\n  uint16_t shm_cpid;\n  uint16_t shm_lpid;\n  uint16_t shm_nattch;\n  uint16_t shm_unused;\n  uint32_t shm_unused2;\n  uint32_t shm_unused3;\n\n  shmid_ds_32() = delete;\n\n  operator struct shmid64_ds() const {\n    struct shmid64_ds buf {};\n    buf.shm_perm = shm_perm;\n\n    buf.shm_segsz = shm_segsz;\n    buf.shm_atime = shm_atime;\n    buf.shm_dtime = shm_dtime;\n    buf.shm_ctime = shm_ctime;\n    buf.shm_cpid = shm_cpid;\n    buf.shm_lpid = shm_lpid;\n    buf.shm_nattch = shm_nattch;\n    return buf;\n  }\n\n  shmid_ds_32(const struct shmid64_ds& buf)\n    : shm_perm {buf.shm_perm} {\n    shm_segsz = buf.shm_segsz;\n    shm_atime = buf.shm_atime;\n    shm_dtime = buf.shm_dtime;\n    shm_ctime = buf.shm_ctime;\n    shm_cpid = buf.shm_cpid;\n    shm_lpid = buf.shm_lpid;\n    shm_nattch = buf.shm_nattch;\n    shm_unused = 0;\n    shm_unused2 = 0;\n    shm_unused3 = 0;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<shmid_ds_32>);\nstatic_assert(sizeof(shmid_ds_32) == 48);\n\nstruct shmid_ds_64 {\n  ipc_perm_64 shm_perm;\n  compat_size_t shm_segsz;\n  compat_ulong_t shm_atime;\n  compat_ulong_t shm_atime_high;\n  compat_ulong_t shm_dtime;\n  compat_ulong_t shm_dtime_high;\n  compat_ulong_t shm_ctime;\n  compat_ulong_t shm_ctime_high;\n  int32_t shm_cpid;\n  int32_t shm_lpid;\n  compat_ulong_t shm_nattch;\n  compat_ulong_t shm_unused4;\n  compat_ulong_t shm_unused5;\n\n  shmid_ds_64() = delete;\n\n  operator struct shmid64_ds() const {\n    struct shmid64_ds buf {};\n    buf.shm_perm = shm_perm;\n\n    buf.shm_segsz = shm_segsz;\n    buf.shm_atime = shm_atime_high;\n    buf.shm_atime <<= 32;\n    buf.shm_atime |= shm_atime;\n\n    buf.shm_dtime = shm_dtime_high;\n    buf.shm_dtime <<= 32;\n    buf.shm_dtime |= shm_dtime;\n\n    buf.shm_ctime = shm_ctime_high;\n    buf.shm_ctime <<= 32;\n    buf.shm_ctime |= shm_ctime;\n\n    buf.shm_cpid = shm_cpid;\n    buf.shm_lpid = shm_lpid;\n    buf.shm_nattch = shm_nattch;\n    return buf;\n  }\n\n  shmid_ds_64(const struct shmid64_ds& buf)\n    : shm_perm {buf.shm_perm} {\n    shm_segsz = buf.shm_segsz;\n    shm_atime = buf.shm_atime;\n    shm_atime_high = buf.shm_atime >> 32;\n    shm_dtime = buf.shm_dtime;\n    shm_dtime_high = buf.shm_dtime >> 32;\n    shm_ctime = buf.shm_ctime;\n    shm_ctime_high = buf.shm_ctime >> 32;\n    shm_cpid = buf.shm_cpid;\n    shm_lpid = buf.shm_lpid;\n    shm_nattch = buf.shm_nattch;\n    shm_unused4 = shm_unused5 = 0;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<shmid_ds_64>);\nstatic_assert(sizeof(shmid_ds_64) == 84);\n\nstruct semid_ds_32 {\n  struct ipc_perm_32 sem_perm;\n  int32_t sem_otime;\n  int32_t sem_ctime;\n  uint32_t sem_base;\n  uint32_t sem_pending;\n  uint32_t sem_pending_last;\n  uint32_t undo;\n  uint16_t sem_nsems;\n  uint16_t _pad;\n\n  semid_ds_32() = delete;\n\n  operator struct semid64_ds() const {\n    struct semid64_ds buf {};\n    buf.sem_perm = sem_perm;\n\n    buf.sem_otime = sem_otime;\n    buf.sem_ctime = sem_ctime;\n    buf.sem_nsems = sem_nsems;\n\n    // sem_base, sem_pending, sem_pending_last, undo doesn't exist in the definition\n    // Kernel doesn't return anything in them\n    return buf;\n  }\n\n  semid_ds_32(const struct semid64_ds& buf)\n    : sem_perm {buf.sem_perm} {\n    sem_otime = buf.sem_otime;\n    sem_ctime = buf.sem_ctime;\n    sem_nsems = buf.sem_nsems;\n    sem_base = sem_pending = sem_pending_last = undo = _pad = 0;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<semid_ds_32>);\nstatic_assert(sizeof(semid_ds_32) == 44);\n\nstruct semid_ds_64 {\n  struct ipc_perm_64 sem_perm;\n  uint32_t sem_otime;\n  uint32_t sem_otime_high;\n  uint32_t sem_ctime;\n  uint32_t sem_ctime_high;\n  uint32_t sem_nsems;\n  uint32_t _pad[2];\n\n  semid_ds_64() = delete;\n\n  operator struct semid64_ds() const {\n    struct semid64_ds buf {};\n    buf.sem_perm = sem_perm;\n\n    buf.sem_otime = sem_otime_high;\n    buf.sem_otime <<= 32;\n    buf.sem_otime |= sem_otime;\n    buf.sem_ctime = sem_ctime_high;\n    buf.sem_ctime <<= 32;\n    buf.sem_ctime |= sem_ctime;\n    buf.sem_nsems = sem_nsems;\n\n    // sem_base, sem_pending, sem_pending_last, undo doesn't exist in the definition\n    // Kernel doesn't return anything in them\n    return buf;\n  }\n\n  semid_ds_64(const struct semid64_ds& buf)\n    : sem_perm {buf.sem_perm} {\n    sem_otime = buf.sem_otime;\n    sem_otime_high = buf.sem_otime >> 32;\n    sem_ctime = buf.sem_ctime;\n    sem_ctime_high = buf.sem_ctime >> 32;\n    sem_nsems = buf.sem_nsems;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<semid_ds_64>);\nstatic_assert(sizeof(semid_ds_64) == 64);\n\nstruct msqid_ds_32 {\n  struct ipc_perm_32 msg_perm;\n  compat_uptr_t msg_first;\n  compat_uptr_t msg_last;\n  uint32_t msg_stime;\n  uint32_t msg_rtime;\n  uint32_t msg_ctime;\n  uint32_t msg_lcbytes;\n  uint32_t msg_lqbytes;\n  uint16_t msg_cbytes;\n  uint16_t msg_qnum;\n  uint16_t msg_qbytes;\n  uint16_t msg_lspid;\n  uint16_t msg_lrpid;\n\n  msqid_ds_32() = delete;\n  operator struct msqid64_ds() const {\n    struct msqid64_ds val {};\n    // msg_first and msg_last are unused and untouched\n    val.msg_perm = msg_perm;\n    val.msg_stime = msg_stime;\n    val.msg_rtime = msg_rtime;\n    val.msg_ctime = msg_ctime;\n\n    val.msg_cbytes = msg_cbytes;\n    val.msg_qnum = msg_qnum;\n    val.msg_qbytes = msg_qbytes;\n    val.msg_lspid = msg_lspid;\n    val.msg_lrpid = msg_lrpid;\n    return val;\n  }\n\n  msqid_ds_32(const struct msqid64_ds& buf)\n    : msg_perm {buf.msg_perm} {\n    // msg_first and msg_last are unused and untouched\n    msg_stime = buf.msg_stime;\n    msg_rtime = buf.msg_rtime;\n    msg_ctime = buf.msg_ctime;\n    if (buf.msg_cbytes > std::numeric_limits<uint16_t>::max()) {\n      msg_cbytes = std::numeric_limits<uint16_t>::max();\n    } else {\n      msg_cbytes = buf.msg_cbytes;\n    }\n    msg_lcbytes = buf.msg_cbytes;\n\n    if (buf.msg_qnum > std::numeric_limits<uint16_t>::max()) {\n      msg_qnum = std::numeric_limits<uint16_t>::max();\n    } else {\n      msg_qnum = buf.msg_qnum;\n    }\n\n    if (buf.msg_cbytes > std::numeric_limits<uint16_t>::max()) {\n      msg_cbytes = std::numeric_limits<uint16_t>::max();\n    } else {\n      msg_cbytes = buf.msg_cbytes;\n    }\n    msg_lqbytes = buf.msg_qbytes;\n    msg_lspid = buf.msg_lspid;\n    msg_lrpid = buf.msg_lrpid;\n    msg_first = msg_last = msg_qbytes = 0;\n  }\n};\nstatic_assert(std::is_trivially_copyable_v<msqid_ds_32>);\nstatic_assert(sizeof(msqid_ds_32) == 56);\n\nstruct msqid_ds_64 {\n  struct ipc_perm_64 msg_perm;\n  uint32_t msg_stime;\n  uint32_t msg_stime_high;\n  uint32_t msg_rtime;\n  uint32_t msg_rtime_high;\n  uint32_t msg_ctime;\n  uint32_t msg_ctime_high;\n  uint32_t msg_cbytes;\n  uint32_t msg_qnum;\n  uint32_t msg_qbytes;\n  uint32_t msg_lspid;\n  uint32_t msg_lrpid;\n  uint32_t _pad[2];\n\n  msqid_ds_64() = delete;\n  operator struct msqid64_ds() const {\n    struct msqid64_ds val {};\n    val.msg_perm = msg_perm;\n    val.msg_stime = msg_stime_high;\n    val.msg_stime <<= 32;\n    val.msg_stime |= msg_stime;\n\n    val.msg_rtime = msg_rtime_high;\n    val.msg_rtime <<= 32;\n    val.msg_rtime |= msg_rtime;\n\n    val.msg_ctime = msg_ctime_high;\n    val.msg_ctime <<= 32;\n    val.msg_ctime |= msg_ctime;\n\n    val.msg_cbytes = msg_cbytes;\n    val.msg_qnum = msg_qnum;\n    val.msg_qbytes = msg_qbytes;\n    val.msg_lspid = msg_lspid;\n    val.msg_lrpid = msg_lrpid;\n    return val;\n  }\n\n  msqid_ds_64(const struct msqid64_ds& buf)\n    : msg_perm {buf.msg_perm} {\n    msg_stime = buf.msg_stime;\n    msg_stime_high = buf.msg_stime >> 32;\n    msg_rtime = buf.msg_rtime;\n    msg_rtime_high = buf.msg_rtime >> 32;\n    msg_ctime = buf.msg_ctime;\n    msg_ctime_high = buf.msg_ctime >> 32;\n    msg_cbytes = buf.msg_cbytes;\n    msg_qnum = buf.msg_qnum;\n    msg_qbytes = buf.msg_qbytes;\n    msg_lspid = buf.msg_lspid;\n    msg_lrpid = buf.msg_lrpid;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<msqid_ds_64>);\nstatic_assert(sizeof(msqid_ds_64) == 88);\n\nstruct FEX_ANNOTATE(\"fex-match\") shminfo_32 {\n  uint32_t shmmax;\n  uint32_t shmmin;\n  uint32_t shmmni;\n  uint32_t shmseg;\n  uint32_t shmall;\n\n  shminfo_32() = delete;\n\n  operator struct shminfo() const {\n    struct shminfo si {};\n    si.shmmax = shmmax;\n    si.shmmin = shmmin;\n    si.shmmni = shmmni;\n    si.shmseg = shmseg;\n    si.shmall = shmall;\n    return si;\n  }\n\n  shminfo_32(const struct shminfo& si) {\n    shmmax = si.shmmax;\n    shmmin = si.shmmin;\n    shmmni = si.shmmni;\n    shmseg = si.shmseg;\n    shmall = si.shmall;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<shminfo_32>);\nstatic_assert(sizeof(shminfo_32) == 20);\n\nstruct FEX_ANNOTATE(\"alias-x86_32-shminfo64\") FEX_ANNOTATE(\"fex-match\") shminfo_64 {\n  compat_ulong_t shmmax;\n  compat_ulong_t shmmin;\n  compat_ulong_t shmmni;\n  compat_ulong_t shmseg;\n  compat_ulong_t shmall;\n  compat_ulong_t __unused1;\n  compat_ulong_t __unused2;\n  compat_ulong_t __unused3;\n  compat_ulong_t __unused4;\n\n  shminfo_64() = delete;\n\n  operator struct shminfo() const {\n    struct shminfo si {};\n    si.shmmax = shmmax;\n    si.shmmin = shmmin;\n    si.shmmni = shmmni;\n    si.shmseg = shmseg;\n    si.shmall = shmall;\n    return si;\n  }\n\n  shminfo_64(const struct shminfo& si) {\n    shmmax = si.shmmax;\n    shmmin = si.shmmin;\n    shmmni = si.shmmni;\n    shmseg = si.shmseg;\n    shmall = si.shmall;\n    __unused1 = __unused2 = __unused3 = __unused4 = 0;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<shminfo_64>);\nstatic_assert(sizeof(shminfo_64) == 36);\n\nstruct FEX_ANNOTATE(\"alias-x86_32-shm_info\") FEX_ANNOTATE(\"fex-match\") shm_info_32 {\n  int used_ids;\n  uint32_t shm_tot;\n  uint32_t shm_rss;\n  uint32_t shm_swp;\n  uint32_t swap_attempts;\n  uint32_t swap_successes;\n\n  shm_info_32() = delete;\n\n  shm_info_32(const struct shm_info& si) {\n    used_ids = si.used_ids;\n    shm_tot = si.shm_tot;\n    shm_rss = si.shm_rss;\n    shm_swp = si.shm_swp;\n    swap_attempts = si.swap_attempts;\n    swap_successes = si.swap_successes;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<shm_info_32>);\nstatic_assert(sizeof(shm_info_32) == 24);\n\nstruct FEX_ANNOTATE(\"fex-match\") compat_select_args {\n  int nfds;\n  compat_ptr<fd_set32> readfds;\n  compat_ptr<fd_set32> writefds;\n  compat_ptr<fd_set32> exceptfds;\n  compat_ptr<struct timeval32> timeout;\n\n  compat_select_args() = delete;\n};\n\nstatic_assert(std::is_trivially_copyable_v<compat_select_args>);\nstatic_assert(sizeof(compat_select_args) == 20);\n\n} // namespace FEX::HLE::x32\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/EPoll.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\nmeta: LinuxSyscalls|syscalls-x86-64 ~ x86-64 specific syscall implementations\ntags: LinuxSyscalls|syscalls-x86-64\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/Types.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Types.h\"\n\n#include <FEXCore/fextl/vector.h>\n\n#include <algorithm>\n#include <cstdint>\n#include <stddef.h>\n#include <sys/epoll.h>\n#include <syscall.h>\n#include <unistd.h>\n\nstruct timespec;\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nnamespace FEX::HLE::x64 {\nvoid RegisterEpoll(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X64(\n    epoll_wait, [](FEXCore::Core::CpuStateFrame* Frame, int epfd, FEX::HLE::epoll_event_x86* events, int maxevents, int timeout) -> uint64_t {\n      fextl::vector<struct epoll_event> Events(std::max(0, maxevents));\n      uint64_t Result = ::syscall(SYSCALL_DEF(epoll_pwait), epfd, Events.data(), maxevents, timeout, nullptr, 8);\n\n      if (Result != -1) {\n        FaultSafeUserMemAccess::VerifyIsWritable(events, sizeof(FEX::HLE::epoll_event_x86) * Result);\n        for (size_t i = 0; i < Result; ++i) {\n          events[i] = Events[i];\n        }\n      }\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X64(epoll_ctl, [](FEXCore::Core::CpuStateFrame* Frame, int epfd, int op, int fd, FEX::HLE::epoll_event_x86* event) -> uint64_t {\n    struct epoll_event Event;\n    struct epoll_event* EventPtr {};\n    if (event) {\n      FaultSafeUserMemAccess::VerifyIsReadable(event, sizeof(FEX::HLE::epoll_event_x86));\n      Event = *event;\n      EventPtr = &Event;\n    }\n    uint64_t Result = ::syscall(SYSCALL_DEF(epoll_ctl), epfd, op, fd, EventPtr);\n    if (Result != -1 && event) {\n      FaultSafeUserMemAccess::VerifyIsWritable(event, sizeof(FEX::HLE::epoll_event_x86));\n      *event = Event;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X64(epoll_pwait,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int epfd, FEX::HLE::epoll_event_x86* events, int maxevent, int timeout,\n                               const uint64_t* sigmask, size_t sigsetsize) -> uint64_t {\n                              fextl::vector<struct epoll_event> Events(std::max(0, maxevent));\n\n                              uint64_t Result = ::syscall(SYSCALL_DEF(epoll_pwait), epfd, Events.data(), maxevent, timeout, sigmask, sigsetsize);\n\n                              if (Result != -1) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(events, sizeof(FEX::HLE::epoll_event_x86) * Result);\n                                for (size_t i = 0; i < Result; ++i) {\n                                  events[i] = Events[i];\n                                }\n                              }\n\n                              SYSCALL_ERRNO();\n                            });\n\n  REGISTER_SYSCALL_IMPL_X64(epoll_pwait2,\n                            [](FEXCore::Core::CpuStateFrame* Frame, int epfd, FEX::HLE::epoll_event_x86* events, int maxevent,\n                               timespec* timeout, const uint64_t* sigmask, size_t sigsetsize) -> uint64_t {\n                              fextl::vector<struct epoll_event> Events(std::max(0, maxevent));\n\n                              uint64_t Result = ::syscall(SYSCALL_DEF(epoll_pwait2), epfd, Events.data(), maxevent, timeout, sigmask, sigsetsize);\n\n                              if (Result != -1) {\n                                FaultSafeUserMemAccess::VerifyIsWritable(events, sizeof(FEX::HLE::epoll_event_x86) * Result);\n                                for (size_t i = 0; i < Result; ++i) {\n                                  events[i] = Events[i];\n                                }\n                              }\n\n                              SYSCALL_ERRNO();\n                            });\n}\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/FD.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-64\n$end_info$\n*/\n\n#include \"LinuxSyscalls/FileManagement.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Types.h\"\n\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Utils/MathUtils.h>\n\n#include <fcntl.h>\n#include <poll.h>\n#include <stdint.h>\n#include <sys/select.h>\n#include <sys/stat.h>\n#include <sys/statfs.h>\n#include <sys/time.h>\n#include <sys/uio.h>\n#include <sys/sendfile.h>\n#include <sys/timerfd.h>\n#include <syscall.h>\n#include <time.h>\n#include <unistd.h>\n\nnamespace FEX::HLE::x64 {\nvoid RegisterFD(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X64(\n    select, [](FEXCore::Core::CpuStateFrame* Frame, int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout) -> uint64_t {\n      ///< All FD arrays need to be writable\n      FaultSafeUserMemAccess::VerifyIsWritableOrNull(readfds, sizeof(uint64_t) * nfds);\n      FaultSafeUserMemAccess::VerifyIsWritableOrNull(writefds, sizeof(uint64_t) * nfds);\n      FaultSafeUserMemAccess::VerifyIsWritableOrNull(exceptfds, sizeof(uint64_t) * nfds);\n      FaultSafeUserMemAccess::VerifyIsReadableOrNull(timeout, sizeof(*timeout));\n      ///< timeout doesn't actually need to be writable, this is a quirk of glibc. Kernel just doesn't update timeout if not possible.\n      FaultSafeUserMemAccess::VerifyIsWritableOrNull(timeout, sizeof(*timeout));\n      uint64_t Result = ::select(nfds, readfds, writefds, exceptfds, timeout);\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X64(fcntl, [](FEXCore::Core::CpuStateFrame* Frame, int fd, int cmd, uint64_t arg) -> uint64_t {\n    uint64_t Result {};\n    switch (cmd) {\n    case F_GETFL:\n      Result = ::fcntl(fd, cmd, arg);\n      if (Result != -1) {\n        Result = FEX::HLE::RemapToX86Flags(Result);\n      }\n      break;\n    case F_SETFL: Result = ::fcntl(fd, cmd, FEX::HLE::RemapFromX86Flags(arg)); break;\n    default: Result = ::fcntl(fd, cmd, arg); break;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X64(\n    futimesat, [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, const struct timeval times[2]) -> uint64_t {\n      return FEX::HLE::futimesat_compat<timeval>(dirfd, pathname, times);\n    });\n\n  REGISTER_SYSCALL_IMPL_X64(stat, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, FEX::HLE::x64::guest_stat* buf) -> uint64_t {\n    FaultSafeUserMemAccess::VerifyIsStringReadableMaxSize(pathname, PATH_MAX);\n    FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n    struct stat host_stat;\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Stat(pathname, &host_stat);\n    if (Result != -1) {\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X64(fstat, [](FEXCore::Core::CpuStateFrame* Frame, int fd, FEX::HLE::x64::guest_stat* buf) -> uint64_t {\n    FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n    struct stat host_stat;\n    uint64_t Result = ::fstat(fd, &host_stat);\n    if (Result != -1) {\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X64(lstat, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, FEX::HLE::x64::guest_stat* buf) -> uint64_t {\n    FaultSafeUserMemAccess::VerifyIsStringReadableMaxSize(path, PATH_MAX);\n    FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n    struct stat host_stat;\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Lstat(path, &host_stat);\n    if (Result != -1) {\n      *buf = host_stat;\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X64(\n    newfstatat, [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, FEX::HLE::x64::guest_stat* buf, int flag) -> uint64_t {\n      FaultSafeUserMemAccess::VerifyIsStringReadableMaxSize(pathname, PATH_MAX);\n      FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n      struct stat host_stat;\n      uint64_t Result = FEX::HLE::_SyscallHandler->FM.NewFSStatAt(dirfd, pathname, &host_stat, flag);\n      if (Result != -1) {\n        *buf = host_stat;\n      }\n      SYSCALL_ERRNO();\n    });\n\n  REGISTER_SYSCALL_IMPL_X64(getdents, [](FEXCore::Core::CpuStateFrame* Frame, int fd, void* dirp, uint32_t count) -> uint64_t {\n    return GetDentsEmulation<false>(fd, reinterpret_cast<FEX::HLE::x64::linux_dirent*>(dirp), count);\n  });\n\n  REGISTER_SYSCALL_IMPL_X64(getdents64, [](FEXCore::Core::CpuStateFrame* Frame, int fd, void* dirp, uint32_t count) -> uint64_t {\n    uint64_t Result = ::syscall(SYSCALL_DEF(getdents64), static_cast<uint64_t>(fd), dirp, static_cast<uint64_t>(count));\n    if (Result != -1) {\n      // Check for and hide the RootFS FD\n      for (size_t i = 0; i < Result;) {\n        linux_dirent_64* Incoming = (linux_dirent_64*)(reinterpret_cast<uint64_t>(dirp) + i);\n        if (FEX::HLE::_SyscallHandler->FM.IsProtectedFile(fd, Incoming->d_ino)) {\n          Result -= Incoming->d_reclen;\n          memmove(Incoming, (linux_dirent_64*)(reinterpret_cast<uint64_t>(Incoming) + Incoming->d_reclen), Result - i);\n          continue;\n        }\n        i += Incoming->d_reclen;\n      }\n    }\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X64(dup2, [](FEXCore::Core::CpuStateFrame* Frame, int oldfd, int newfd) -> uint64_t {\n    uint64_t Result = ::dup2(oldfd, newfd);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X64(statfs, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, struct statfs* buf) -> uint64_t {\n    FaultSafeUserMemAccess::VerifyIsStringReadableMaxSize(path, PATH_MAX);\n    FaultSafeUserMemAccess::VerifyIsWritable(buf, sizeof(*buf));\n    uint64_t Result = FEX::HLE::_SyscallHandler->FM.Statfs(path, buf);\n    SYSCALL_ERRNO();\n  });\n}\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Info.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-64\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include <FEXCore/Core/Context.h>\n\n#include <cstring>\n#include <sys/utsname.h>\n#include <sys/resource.h>\n#include <sys/sysinfo.h>\n\nnamespace FEX::HLE::x64 {\nvoid RegisterInfo(FEX::HLE::SyscallHandler* Handler) {\n  using namespace FEXCore::IR;\n\n  if (Handler->IsHostKernelVersionAtLeast(6, 6, 0)) {\n    REGISTER_SYSCALL_IMPL_X64(map_shadow_stack, [](FEXCore::Core::CpuStateFrame* Frame, uint64_t addr, uint64_t size, uint32_t flags) -> uint64_t {\n      // Claim that shadow stack isn't supported.\n      return -EOPNOTSUPP;\n    });\n  } else {\n    REGISTER_SYSCALL_IMPL_X64(map_shadow_stack, UnimplementedSyscallSafe);\n  }\n}\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/HelperDefines.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#define STRINGY2(x, y) x##y\n#define STRINGY(x, y) STRINGY2(x, y)\n\n#define STRINGY12(x) STRINGY11(x)\n#define STRINGY11(x) #x\n#define STRINGY1(x) STRINGY12(x)\n\n#ifndef _BASIC_META\n// Meta typedef variable in unnamed and matches upstream\n// Use this for the super basic ioctl passthrough path\n#define _BASIC_META(x)                   \\\n  __attribute__((annotate(\"fex-match\"))) \\\n  __attribute__((annotate(\"ioctl-alias-x86_64-_\" #x STRINGY1(__LINE__)))) typedef uint8_t STRINGY(_##x, __LINE__)[x];\n#endif\n\n#ifndef _BASIC_META_VAR\n// This is similar to _BASIC_META except that it allows you to pass variadic arguments to the original ioctl definition\n#define _BASIC_META_VAR(x, args...)      \\\n  __attribute__((annotate(\"fex-match\"))) \\\n  __attribute__((annotate(\"ioctl-alias-x86_64-_\" #x STRINGY1(__LINE__)))) typedef uint8_t STRINGY(_##x, __LINE__)[x(args)];\n#endif\n\n#ifndef _CUSTOM_META\n// IOCTL doesn't match across architecture\n// Generates a FEX_<name> version of the ioctl with custom ioctl definition\n// eg: _CUSTOM_META(DRM_IOCTL_AMDGPU_GEM_METADATA, DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_METADATA, FEX::HLE::x64::AMDGPU::fex_drm_amdgpu_gem_metadata));\n// Allows you to effectively pass in the original ioctl definition with custom type replacing the upstream type\n#define _CUSTOM_META(name, ioctl_num)                                                              \\\n  typedef uint8_t _meta_##name[name];                                                              \\\n  __attribute__((annotate(\"ioctl-alias-x86_64-_meta_\" #name))) typedef uint8_t _##name[ioctl_num]; \\\n  constexpr static uint32_t FEX_##name = ioctl_num;\n#endif\n\n#ifndef _CUSTOM_META_MATCH\n// IOCTL doesn't match across architecture\n// Generates a FEX_<name> version of the ioctl with custom ioctl definition\n// eg: _CUSTOM_META(DRM_IOCTL_AMDGPU_GEM_METADATA, DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_METADATA, FEX::HLE::x64::AMDGPU::fex_drm_amdgpu_gem_metadata));\n// Allows you to effectively pass in the original ioctl definition with custom type replacing the upstream type\n#define _CUSTOM_META_MATCH(name, ioctl_num)                                  \\\n  typedef uint8_t _meta_##name[ioctl_num];                                   \\\n  __attribute__((annotate(\"fex-match\"))) typedef uint8_t _##name[ioctl_num]; \\\n  constexpr static uint32_t FEX_##name = ioctl_num;\n#endif\n\n#ifndef _CUSTOM_META_OFFSET\n// Same as _CUSTOM_META but allows you to define multiple types from an offset\n// Required to have an ioctl covering a range which some ioctls do\n#define _CUSTOM_META_OFFSET(name, ioctl_num, offset)                                                        \\\n  typedef uint8_t _meta_##name[ioctl_num + offset];                                                         \\\n  __attribute__((annotate(\"ioctl-alias-x86_64-_meta_\" #name))) typedef uint8_t _##name[ioctl_num + offset]; \\\n  constexpr static uint32_t FEX_##name = ioctl_num + offset;\n#endif\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/amdgpu_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_AMDGPU_GEM_CREATE)\n_BASIC_META(DRM_IOCTL_AMDGPU_GEM_MMAP)\n_BASIC_META(DRM_IOCTL_AMDGPU_CTX)\n_BASIC_META(DRM_IOCTL_AMDGPU_BO_LIST)\n_BASIC_META(DRM_IOCTL_AMDGPU_CS)\n_BASIC_META(DRM_IOCTL_AMDGPU_INFO)\n_BASIC_META(DRM_IOCTL_AMDGPU_GEM_METADATA)\n_BASIC_META(DRM_IOCTL_AMDGPU_GEM_WAIT_IDLE)\n_BASIC_META(DRM_IOCTL_AMDGPU_GEM_VA)\n_BASIC_META(DRM_IOCTL_AMDGPU_WAIT_CS)\n_BASIC_META(DRM_IOCTL_AMDGPU_GEM_OP)\n_BASIC_META(DRM_IOCTL_AMDGPU_GEM_USERPTR)\n_BASIC_META(DRM_IOCTL_AMDGPU_WAIT_FENCES)\n_BASIC_META(DRM_IOCTL_AMDGPU_VM)\n_BASIC_META(DRM_IOCTL_AMDGPU_FENCE_TO_HANDLE)\n_BASIC_META(DRM_IOCTL_AMDGPU_SCHED)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/asound.h",
    "content": "// SPDX-License-Identifier: MIT\n#include \"LinuxSyscalls/x64/Types.h\"\n#include \"LinuxSyscalls/x64/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <sound/asound.h>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x64 {\n\nnamespace asound {\n#ifndef SNDRV_TIMER_IOCTL_TREAD_OLD\n#define SNDRV_TIMER_IOCTL_TREAD_OLD _IOW('T', 0x02, int)\n#endif\n\n#ifndef SNDRV_TIMER_IOCTL_TREAD64\n#define SNDRV_TIMER_IOCTL_TREAD64 _IOW('T', 0xa4, int)\n#endif\n\n#include \"LinuxSyscalls/x64/Ioctl/asound.inl\"\n} // namespace asound\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/asound.inl",
    "content": "_BASIC_META(SNDRV_HWDEP_IOCTL_PVERSION)\n_BASIC_META(SNDRV_HWDEP_IOCTL_INFO)\n_BASIC_META(SNDRV_HWDEP_IOCTL_DSP_STATUS)\n//_BASIC_META(SNDRV_HWDEP_IOCTL_DSP_LOAD)\n\n_BASIC_META(SNDRV_PCM_IOCTL_PVERSION)\n_BASIC_META(SNDRV_PCM_IOCTL_INFO)\n_BASIC_META(SNDRV_PCM_IOCTL_TSTAMP)\n_BASIC_META(SNDRV_PCM_IOCTL_TTSTAMP)\n_BASIC_META(SNDRV_PCM_IOCTL_USER_PVERSION)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_HW_REFINE)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_HW_PARAMS)\n_BASIC_META(SNDRV_PCM_IOCTL_HW_FREE)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_SW_PARAMS)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_STATUS)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_DELAY)\n_BASIC_META(SNDRV_PCM_IOCTL_HWSYNC)\n// XXX: _BASIC_META(__SNDRV_PCM_IOCTL_SYNC_PTR)\n// XXX: _BASIC_META(__SNDRV_PCM_IOCTL_SYNC_PTR64)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_SYNC_PTR)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_STATUS_EXT)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_CHANNEL_INFO)\n_BASIC_META(SNDRV_PCM_IOCTL_PREPARE)\n_BASIC_META(SNDRV_PCM_IOCTL_RESET)\n_BASIC_META(SNDRV_PCM_IOCTL_START)\n_BASIC_META(SNDRV_PCM_IOCTL_DROP)\n_BASIC_META(SNDRV_PCM_IOCTL_DRAIN)\n_BASIC_META(SNDRV_PCM_IOCTL_PAUSE)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_REWIND)\n_BASIC_META(SNDRV_PCM_IOCTL_RESUME)\n_BASIC_META(SNDRV_PCM_IOCTL_XRUN)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_FORWARD)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_WRITEI_FRAMES)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_READI_FRAMES)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_WRITEN_FRAMES)\n// XXX: _BASIC_META(SNDRV_PCM_IOCTL_READN_FRAMES)\n_BASIC_META(SNDRV_PCM_IOCTL_LINK)\n_BASIC_META(SNDRV_PCM_IOCTL_UNLINK)\n\n_BASIC_META(SNDRV_RAWMIDI_IOCTL_PVERSION)\n_BASIC_META(SNDRV_RAWMIDI_IOCTL_INFO)\n// XXX: _BASIC_META(SNDRV_RAWMIDI_IOCTL_PARAMS)\n// XXX: _BASIC_META(SNDRV_RAWMIDI_IOCTL_STATUS)\n_BASIC_META(SNDRV_RAWMIDI_IOCTL_DROP)\n_BASIC_META(SNDRV_RAWMIDI_IOCTL_DRAIN)\n\n_BASIC_META(SNDRV_TIMER_IOCTL_PVERSION)\n_BASIC_META(SNDRV_TIMER_IOCTL_NEXT_DEVICE)\n_BASIC_META(SNDRV_TIMER_IOCTL_TREAD_OLD)\n// XXX: _BASIC_META(SNDRV_TIMER_IOCTL_GINFO)\n// XXX: _BASIC_META(SNDRV_TIMER_IOCTL_GPARAMS)\n// XXX: _BASIC_META(SNDRV_TIMER_IOCTL_GSTATUS)\n_BASIC_META(SNDRV_TIMER_IOCTL_SELECT)\n// XXX: _BASIC_META(SNDRV_TIMER_IOCTL_INFO)\n_BASIC_META(SNDRV_TIMER_IOCTL_PARAMS)\n// XXX: _BASIC_META(SNDRV_TIMER_IOCTL_STATUS)\n_BASIC_META(SNDRV_TIMER_IOCTL_START)\n_BASIC_META(SNDRV_TIMER_IOCTL_STOP)\n_BASIC_META(SNDRV_TIMER_IOCTL_CONTINUE)\n_BASIC_META(SNDRV_TIMER_IOCTL_PAUSE)\n_BASIC_META(SNDRV_TIMER_IOCTL_TREAD64)\n\n_BASIC_META(SNDRV_CTL_IOCTL_PVERSION)\n_BASIC_META(SNDRV_CTL_IOCTL_CARD_INFO)\n// XXX: _BASIC_META(SNDRV_CTL_IOCTL_ELEM_LIST)\n_BASIC_META(SNDRV_CTL_IOCTL_ELEM_INFO)\n// XXX: _BASIC_META(SNDRV_CTL_IOCTL_ELEM_READ)\n// XXX: _BASIC_META(SNDRV_CTL_IOCTL_ELEM_WRITE)\n_BASIC_META(SNDRV_CTL_IOCTL_ELEM_LOCK)\n_BASIC_META(SNDRV_CTL_IOCTL_ELEM_UNLOCK)\n_BASIC_META(SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS)\n_BASIC_META(SNDRV_CTL_IOCTL_ELEM_ADD)\n_BASIC_META(SNDRV_CTL_IOCTL_ELEM_REPLACE)\n_BASIC_META(SNDRV_CTL_IOCTL_ELEM_REMOVE)\n_BASIC_META(SNDRV_CTL_IOCTL_TLV_READ)\n_BASIC_META(SNDRV_CTL_IOCTL_TLV_WRITE)\n_BASIC_META(SNDRV_CTL_IOCTL_TLV_COMMAND)\n_BASIC_META(SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE)\n_BASIC_META(SNDRV_CTL_IOCTL_HWDEP_INFO)\n_BASIC_META(SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE)\n_BASIC_META(SNDRV_CTL_IOCTL_PCM_INFO)\n_BASIC_META(SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE)\n_BASIC_META(SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE)\n_BASIC_META(SNDRV_CTL_IOCTL_RAWMIDI_INFO)\n_BASIC_META(SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE)\n_BASIC_META(SNDRV_CTL_IOCTL_POWER)\n_BASIC_META(SNDRV_CTL_IOCTL_POWER_STATE)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/drm.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/CompilerDefs.h>\n\n#include \"LinuxSyscalls/x64/Types.h\"\n#include \"LinuxSyscalls/x64/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\nextern \"C\" {\n#include \"fex-drm/drm.h\"\n#include \"fex-drm/drm_mode.h\"\n#include \"fex-drm/i915_drm.h\"\n#include \"fex-drm/amdgpu_drm.h\"\n#include \"fex-drm/lima_drm.h\"\n#include \"fex-drm/panfrost_drm.h\"\n#include \"fex-drm/msm_drm.h\"\n#include \"fex-drm/nouveau_drm.h\"\n#include \"fex-drm/vc4_drm.h\"\n#include \"fex-drm/v3d_drm.h\"\n#include \"fex-drm/virtgpu_drm.h\"\n}\n#include <sys/ioctl.h>\n\n#define CPYT(x) val.x = x\n#define CPYF(x) x = val.x\nnamespace FEX::HLE::x64 {\n\n#include \"LinuxSyscalls/x64/Ioctl/drm.inl\"\n#include \"LinuxSyscalls/x64/Ioctl/amdgpu_drm.inl\"\n#include \"LinuxSyscalls/x64/Ioctl/msm_drm.inl\"\n\n} // namespace FEX::HLE::x64\n#undef CPYT\n#undef CPYF\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/drm.inl",
    "content": "_CUSTOM_META(DRM_IOCTL_VERSION, DRM_IOWR(0x00, struct drm_version))\n_BASIC_META(DRM_IOCTL_GET_UNIQUE)\n_BASIC_META(DRM_IOCTL_GET_MAGIC)\n_BASIC_META(DRM_IOCTL_IRQ_BUSID)\n_BASIC_META(DRM_IOCTL_GET_MAP)\n_BASIC_META(DRM_IOCTL_GET_CLIENT)\n_BASIC_META(DRM_IOCTL_GET_STATS)\n_BASIC_META(DRM_IOCTL_SET_VERSION)\n_BASIC_META(DRM_IOCTL_MODESET_CTL)\n_BASIC_META(DRM_IOCTL_GEM_CLOSE)\n_BASIC_META(DRM_IOCTL_GEM_FLINK)\n_BASIC_META(DRM_IOCTL_GEM_OPEN)\n_BASIC_META(DRM_IOCTL_GET_CAP)\n_BASIC_META(DRM_IOCTL_SET_CLIENT_CAP)\n\n_BASIC_META(DRM_IOCTL_SET_UNIQUE)\n_BASIC_META(DRM_IOCTL_AUTH_MAGIC)\n_BASIC_META(DRM_IOCTL_BLOCK)\n_BASIC_META(DRM_IOCTL_UNBLOCK)\n_BASIC_META(DRM_IOCTL_CONTROL)\n_BASIC_META(DRM_IOCTL_ADD_MAP)\n_BASIC_META(DRM_IOCTL_ADD_BUFS)\n_BASIC_META(DRM_IOCTL_MARK_BUFS)\n_BASIC_META(DRM_IOCTL_INFO_BUFS)\n_BASIC_META(DRM_IOCTL_MAP_BUFS)\n_BASIC_META(DRM_IOCTL_FREE_BUFS)\n\n_BASIC_META(DRM_IOCTL_RM_MAP)\n\n_BASIC_META(DRM_IOCTL_SET_SAREA_CTX)\n_BASIC_META(DRM_IOCTL_GET_SAREA_CTX)\n\n_BASIC_META(DRM_IOCTL_SET_MASTER)\n_BASIC_META(DRM_IOCTL_DROP_MASTER)\n\n_BASIC_META(DRM_IOCTL_ADD_CTX)\n_BASIC_META(DRM_IOCTL_RM_CTX)\n_BASIC_META(DRM_IOCTL_MOD_CTX)\n_BASIC_META(DRM_IOCTL_GET_CTX)\n_BASIC_META(DRM_IOCTL_SWITCH_CTX)\n_BASIC_META(DRM_IOCTL_NEW_CTX)\n_BASIC_META(DRM_IOCTL_RES_CTX)\n_BASIC_META(DRM_IOCTL_ADD_DRAW)\n_BASIC_META(DRM_IOCTL_RM_DRAW)\n_BASIC_META(DRM_IOCTL_DMA)\n_BASIC_META(DRM_IOCTL_LOCK)\n_BASIC_META(DRM_IOCTL_UNLOCK)\n_BASIC_META(DRM_IOCTL_FINISH)\n\n_BASIC_META(DRM_IOCTL_PRIME_HANDLE_TO_FD)\n_BASIC_META(DRM_IOCTL_PRIME_FD_TO_HANDLE)\n\n_BASIC_META(DRM_IOCTL_AGP_ACQUIRE)\n_BASIC_META(DRM_IOCTL_AGP_RELEASE)\n// XXX: _BASIC_META(DRM_IOCTL_AGP_ENABLE)\n// XXX: _BASIC_META(DRM_IOCTL_AGP_INFO)\n// XXX: _BASIC_META(DRM_IOCTL_AGP_ALLOC)\n// XXX: _BASIC_META(DRM_IOCTL_AGP_FREE)\n// XXX: _BASIC_META(DRM_IOCTL_AGP_BIND)\n// XXX: _BASIC_META(DRM_IOCTL_AGP_UNBIND)\n\n_BASIC_META(DRM_IOCTL_SG_ALLOC)\n_BASIC_META(DRM_IOCTL_SG_FREE)\n\n_BASIC_META(DRM_IOCTL_WAIT_VBLANK)\n\n_BASIC_META(DRM_IOCTL_CRTC_GET_SEQUENCE)\n_BASIC_META(DRM_IOCTL_CRTC_QUEUE_SEQUENCE)\n\n_BASIC_META(DRM_IOCTL_UPDATE_DRAW)\n\n_BASIC_META(DRM_IOCTL_MODE_GETRESOURCES)\n_BASIC_META(DRM_IOCTL_MODE_GETCRTC)\n_BASIC_META(DRM_IOCTL_MODE_SETCRTC)\n_BASIC_META(DRM_IOCTL_MODE_CURSOR)\n_BASIC_META(DRM_IOCTL_MODE_GETGAMMA)\n_BASIC_META(DRM_IOCTL_MODE_SETGAMMA)\n_BASIC_META(DRM_IOCTL_MODE_GETENCODER)\n_BASIC_META(DRM_IOCTL_MODE_GETCONNECTOR)\n_BASIC_META(DRM_IOCTL_MODE_ATTACHMODE)\n_BASIC_META(DRM_IOCTL_MODE_DETACHMODE)\n\n_BASIC_META(DRM_IOCTL_MODE_GETPROPERTY)\n_BASIC_META(DRM_IOCTL_MODE_SETPROPERTY)\n_BASIC_META(DRM_IOCTL_MODE_GETPROPBLOB)\n_BASIC_META(DRM_IOCTL_MODE_GETFB)\n_BASIC_META(DRM_IOCTL_MODE_ADDFB)\n_BASIC_META(DRM_IOCTL_MODE_RMFB)\n_BASIC_META(DRM_IOCTL_MODE_PAGE_FLIP)\n_BASIC_META(DRM_IOCTL_MODE_DIRTYFB)\n\n_BASIC_META(DRM_IOCTL_MODE_CREATE_DUMB)\n_BASIC_META(DRM_IOCTL_MODE_MAP_DUMB)\n_BASIC_META(DRM_IOCTL_MODE_DESTROY_DUMB)\n_BASIC_META(DRM_IOCTL_MODE_GETPLANERESOURCES)\n_BASIC_META(DRM_IOCTL_MODE_GETPLANE)\n_BASIC_META(DRM_IOCTL_MODE_SETPLANE)\n_BASIC_META(DRM_IOCTL_MODE_ADDFB2)\n_BASIC_META(DRM_IOCTL_MODE_OBJ_GETPROPERTIES)\n_BASIC_META(DRM_IOCTL_MODE_OBJ_SETPROPERTY)\n_BASIC_META(DRM_IOCTL_MODE_CURSOR2)\n_BASIC_META(DRM_IOCTL_MODE_ATOMIC)\n_BASIC_META(DRM_IOCTL_MODE_CREATEPROPBLOB)\n_BASIC_META(DRM_IOCTL_MODE_DESTROYPROPBLOB)\n\n_BASIC_META(DRM_IOCTL_SYNCOBJ_CREATE)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_DESTROY)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_WAIT)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_RESET)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_SIGNAL)\n\n_BASIC_META(DRM_IOCTL_MODE_CREATE_LEASE)\n_BASIC_META(DRM_IOCTL_MODE_LIST_LESSEES)\n_BASIC_META(DRM_IOCTL_MODE_GET_LEASE)\n_BASIC_META(DRM_IOCTL_MODE_REVOKE_LEASE)\n\n_BASIC_META(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_QUERY)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_TRANSFER)\n_BASIC_META(DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL)\n\n_BASIC_META(DRM_IOCTL_MODE_GETFB2)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/ext_fs.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"LinuxSyscalls/x64/Types.h\"\n#include \"LinuxSyscalls/x64/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <linux/blktrace_api.h>\n#include <linux/fs.h>\n#include <linux/fiemap.h>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x64 {\n\nnamespace ext_fs {\n#include \"LinuxSyscalls/x64/Ioctl/ext_fs.inl\"\n}\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/ext_fs.inl",
    "content": "_BASIC_META(BLKROSET)\n_BASIC_META(BLKROGET)\n_BASIC_META(BLKRRPART)\n_BASIC_META(BLKGETSIZE)\n_BASIC_META(BLKFLSBUF)\n_BASIC_META(BLKRASET)\n_BASIC_META(BLKRAGET)\n_BASIC_META(BLKFRASET)\n_BASIC_META(BLKFRAGET)\n_BASIC_META(BLKSECTSET)\n_BASIC_META(BLKSECTGET)\n_BASIC_META(BLKSSZGET)\n\n_BASIC_META(BLKBSZGET)\n_BASIC_META(BLKBSZSET)\n_BASIC_META(BLKGETSIZE64)\n_BASIC_META(BLKTRACESETUP)\n_BASIC_META(BLKTRACESTART)\n_BASIC_META(BLKTRACESTOP)\n_BASIC_META(BLKTRACETEARDOWN)\n_BASIC_META(BLKDISCARD)\n_BASIC_META(BLKIOMIN)\n_BASIC_META(BLKIOOPT)\n_BASIC_META(BLKALIGNOFF)\n_BASIC_META(BLKPBSZGET)\n_BASIC_META(BLKDISCARDZEROES)\n_BASIC_META(BLKSECDISCARD)\n_BASIC_META(BLKROTATIONAL)\n_BASIC_META(BLKZEROOUT)\n\n_BASIC_META(FIBMAP)\n_BASIC_META(FIGETBSZ)\n_BASIC_META(FIFREEZE)\n_BASIC_META(FITHAW)\n_BASIC_META(FITRIM)\n_BASIC_META(FICLONE)\n_BASIC_META(FICLONERANGE)\n_BASIC_META(FIDEDUPERANGE)\n\n_BASIC_META(FS_IOC_GETFLAGS)\n_BASIC_META(FS_IOC_SETFLAGS)\n_BASIC_META(FS_IOC_GETVERSION)\n_BASIC_META(FS_IOC_SETVERSION)\n_BASIC_META(FS_IOC_FIEMAP)\n_BASIC_META(FS_IOC32_GETFLAGS)\n_BASIC_META(FS_IOC32_SETFLAGS)\n_BASIC_META(FS_IOC32_GETVERSION)\n_BASIC_META(FS_IOC32_SETVERSION)\n_BASIC_META(FS_IOC_FSGETXATTR)\n_BASIC_META(FS_IOC_FSSETXATTR)\n_BASIC_META(FS_IOC_GETFSLABEL)\n_BASIC_META(FS_IOC_SETFSLABEL)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/f2fs.h",
    "content": "// SPDX-License-Identifier: MIT\n#include \"LinuxSyscalls/x64/Types.h\"\n#include \"LinuxSyscalls/x64/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x64 {\nnamespace f2fs {\n  // There is no userspace definitions for these\n  // Must define everything ourselves\n  constexpr uint32_t F2FS_IOCTL_MAGIC = 0xf5;\n#define F2FS_IOC_START_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 1)\n#define F2FS_IOC_COMMIT_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 2)\n#define F2FS_IOC_START_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 3)\n#define F2FS_IOC_RELEASE_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 4)\n#define F2FS_IOC_ABORT_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 5)\n#define F2FS_IOC_GARBAGE_COLLECT _IOW(F2FS_IOCTL_MAGIC, 6, uint32_t)\n#define F2FS_IOC_WRITE_CHECKPOINT _IO(F2FS_IOCTL_MAGIC, 7)\n//#define F2FS_IOC_DEFRAGMENT         _IOWR(F2FS_IOCTL_MAGIC, 8,    \\\n//                                          struct f2fs_defragment)\n//#define F2FS_IOC_MOVE_RANGE         _IOWR(F2FS_IOCTL_MAGIC, 9,    \\\n//                                          struct f2fs_move_range)\n//#define F2FS_IOC_FLUSH_DEVICE       _IOW(F2FS_IOCTL_MAGIC, 10,    \\\n//                                          struct f2fs_flush_device)\n//#define F2FS_IOC_GARBAGE_COLLECT_RANGE    _IOW(F2FS_IOCTL_MAGIC, 11,    \\\n//                                          struct f2fs_gc_range)\n#define F2FS_IOC_GET_FEATURES _IOR(F2FS_IOCTL_MAGIC, 12, uint32_t)\n#define F2FS_IOC_SET_PIN_FILE _IOW(F2FS_IOCTL_MAGIC, 13, uint32_t)\n#define F2FS_IOC_GET_PIN_FILE _IOR(F2FS_IOCTL_MAGIC, 14, uint32_t)\n#define F2FS_IOC_PRECACHE_EXTENTS _IO(F2FS_IOCTL_MAGIC, 15)\n#define F2FS_IOC_RESIZE_FS _IOW(F2FS_IOCTL_MAGIC, 16, uint64_t)\n#define F2FS_IOC_GET_COMPRESS_BLOCKS _IOR(F2FS_IOCTL_MAGIC, 17, uint64_t)\n#define F2FS_IOC_RELEASE_COMPRESS_BLOCKS _IOR(F2FS_IOCTL_MAGIC, 18, uint64_t)\n#define F2FS_IOC_RESERVE_COMPRESS_BLOCKS _IOR(F2FS_IOCTL_MAGIC, 19, uint64_t)\n//#define F2FS_IOC_SEC_TRIM_FILE            _IOW(F2FS_IOCTL_MAGIC, 20,    \\\n//                                          struct f2fs_sectrim_range)\n#include \"LinuxSyscalls/x64/Ioctl/f2fs.inl\"\n} // namespace f2fs\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/f2fs.inl",
    "content": "_BASIC_META(F2FS_IOC_START_ATOMIC_WRITE)\n_BASIC_META(F2FS_IOC_COMMIT_ATOMIC_WRITE)\n_BASIC_META(F2FS_IOC_START_VOLATILE_WRITE)\n_BASIC_META(F2FS_IOC_RELEASE_VOLATILE_WRITE)\n_BASIC_META(F2FS_IOC_ABORT_VOLATILE_WRITE)\n_BASIC_META(F2FS_IOC_GARBAGE_COLLECT)\n_BASIC_META(F2FS_IOC_WRITE_CHECKPOINT)\n//_CUSTOM_META(F2FS_IOC_DEFRAGMENT, XXX)\n//_CUSTOM_META(F2FS_IOC_MOVE_RANGE, XXX)\n//_CUSTOM_META(F2FS_IOC_FLUSH_DEVICE, XXX)\n//_CUSTOM_META(F2FS_IOC_GARBAGE_COLLECT_RANGE, XXX)\n_BASIC_META(F2FS_IOC_GET_FEATURES)\n_BASIC_META(F2FS_IOC_SET_PIN_FILE)\n_BASIC_META(F2FS_IOC_GET_PIN_FILE)\n_BASIC_META(F2FS_IOC_PRECACHE_EXTENTS)\n_BASIC_META(F2FS_IOC_RESIZE_FS)\n_BASIC_META(F2FS_IOC_GET_COMPRESS_BLOCKS)\n_BASIC_META(F2FS_IOC_RELEASE_COMPRESS_BLOCKS)\n_BASIC_META(F2FS_IOC_RESERVE_COMPRESS_BLOCKS)\n//_CUSTOM_META(F2FS_IOC_SEC_TRIM_FILE, XXX)\n\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/input.h",
    "content": "// SPDX-License-Identifier: MIT\n#include \"LinuxSyscalls/x64/Types.h\"\n#include \"LinuxSyscalls/x64/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <linux/input.h>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x64 {\nnamespace input {\n#include \"LinuxSyscalls/x64/Ioctl/input.inl\"\n}\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/input.inl",
    "content": "_BASIC_META(EVIOCGVERSION)\n_BASIC_META(EVIOCGID)\n_BASIC_META(EVIOCGREP)\n_BASIC_META(EVIOCSREP)\n_BASIC_META(EVIOCGKEYCODE)\n_BASIC_META(EVIOCGKEYCODE_V2)\n_BASIC_META(EVIOCSKEYCODE)\n_BASIC_META(EVIOCSKEYCODE_V2)\n_BASIC_META_VAR(EVIOCGNAME, 0)\n_BASIC_META_VAR(EVIOCGPHYS, 0)\n_BASIC_META_VAR(EVIOCGUNIQ, 0)\n_BASIC_META_VAR(EVIOCGPROP, 0)\n_BASIC_META_VAR(EVIOCGMTSLOTS, 0)\n_BASIC_META_VAR(EVIOCGKEY, 0)\n_BASIC_META_VAR(EVIOCGLED, 0)\n_BASIC_META_VAR(EVIOCGSND, 0)\n_BASIC_META_VAR(EVIOCGSW, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x00, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x01, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x02, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x03, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x04, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x05, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x06, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x07, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x08, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x09, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x0A, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x0B, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x0C, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x0D, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x0E, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x0F, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x10, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x11, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x12, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x13, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x14, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x15, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x16, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x17, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x18, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x19, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x1A, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x1B, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x1C, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x1D, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x1E, 0)\n_BASIC_META_VAR(EVIOCGBIT, 0x1F, 0)\n_BASIC_META_VAR(EVIOCGABS, 0x00)\n_BASIC_META_VAR(EVIOCGABS, 0x01)\n_BASIC_META_VAR(EVIOCGABS, 0x02)\n_BASIC_META_VAR(EVIOCGABS, 0x03)\n_BASIC_META_VAR(EVIOCGABS, 0x04)\n_BASIC_META_VAR(EVIOCGABS, 0x05)\n_BASIC_META_VAR(EVIOCGABS, 0x06)\n_BASIC_META_VAR(EVIOCGABS, 0x07)\n_BASIC_META_VAR(EVIOCGABS, 0x08)\n_BASIC_META_VAR(EVIOCGABS, 0x09)\n_BASIC_META_VAR(EVIOCGABS, 0x0A)\n_BASIC_META_VAR(EVIOCGABS, 0x0B)\n_BASIC_META_VAR(EVIOCGABS, 0x0C)\n_BASIC_META_VAR(EVIOCGABS, 0x0D)\n_BASIC_META_VAR(EVIOCGABS, 0x0E)\n_BASIC_META_VAR(EVIOCGABS, 0x0F)\n_BASIC_META_VAR(EVIOCGABS, 0x10)\n_BASIC_META_VAR(EVIOCGABS, 0x11)\n_BASIC_META_VAR(EVIOCGABS, 0x12)\n_BASIC_META_VAR(EVIOCGABS, 0x13)\n_BASIC_META_VAR(EVIOCGABS, 0x14)\n_BASIC_META_VAR(EVIOCGABS, 0x15)\n_BASIC_META_VAR(EVIOCGABS, 0x16)\n_BASIC_META_VAR(EVIOCGABS, 0x17)\n_BASIC_META_VAR(EVIOCGABS, 0x18)\n_BASIC_META_VAR(EVIOCGABS, 0x19)\n_BASIC_META_VAR(EVIOCGABS, 0x1A)\n_BASIC_META_VAR(EVIOCGABS, 0x1B)\n_BASIC_META_VAR(EVIOCGABS, 0x1C)\n_BASIC_META_VAR(EVIOCGABS, 0x1D)\n_BASIC_META_VAR(EVIOCGABS, 0x1E)\n_BASIC_META_VAR(EVIOCGABS, 0x1F)\n_BASIC_META_VAR(EVIOCGABS, 0x20)\n_BASIC_META_VAR(EVIOCGABS, 0x21)\n_BASIC_META_VAR(EVIOCGABS, 0x22)\n_BASIC_META_VAR(EVIOCGABS, 0x23)\n_BASIC_META_VAR(EVIOCGABS, 0x24)\n_BASIC_META_VAR(EVIOCGABS, 0x25)\n_BASIC_META_VAR(EVIOCGABS, 0x26)\n_BASIC_META_VAR(EVIOCGABS, 0x27)\n_BASIC_META_VAR(EVIOCGABS, 0x28)\n_BASIC_META_VAR(EVIOCGABS, 0x29)\n_BASIC_META_VAR(EVIOCGABS, 0x2A)\n_BASIC_META_VAR(EVIOCGABS, 0x2B)\n_BASIC_META_VAR(EVIOCGABS, 0x2C)\n_BASIC_META_VAR(EVIOCGABS, 0x2D)\n_BASIC_META_VAR(EVIOCGABS, 0x2E)\n_BASIC_META_VAR(EVIOCGABS, 0x2F)\n_BASIC_META_VAR(EVIOCSABS, 0x00)\n_BASIC_META_VAR(EVIOCSABS, 0x01)\n_BASIC_META_VAR(EVIOCSABS, 0x02)\n_BASIC_META_VAR(EVIOCSABS, 0x03)\n_BASIC_META_VAR(EVIOCSABS, 0x04)\n_BASIC_META_VAR(EVIOCSABS, 0x05)\n_BASIC_META_VAR(EVIOCSABS, 0x06)\n_BASIC_META_VAR(EVIOCSABS, 0x07)\n_BASIC_META_VAR(EVIOCSABS, 0x08)\n_BASIC_META_VAR(EVIOCSABS, 0x09)\n_BASIC_META_VAR(EVIOCSABS, 0x0A)\n_BASIC_META_VAR(EVIOCSABS, 0x0B)\n_BASIC_META_VAR(EVIOCSABS, 0x0C)\n_BASIC_META_VAR(EVIOCSABS, 0x0D)\n_BASIC_META_VAR(EVIOCSABS, 0x0E)\n_BASIC_META_VAR(EVIOCSABS, 0x0F)\n_BASIC_META_VAR(EVIOCSABS, 0x10)\n_BASIC_META_VAR(EVIOCSABS, 0x11)\n_BASIC_META_VAR(EVIOCSABS, 0x12)\n_BASIC_META_VAR(EVIOCSABS, 0x13)\n_BASIC_META_VAR(EVIOCSABS, 0x14)\n_BASIC_META_VAR(EVIOCSABS, 0x15)\n_BASIC_META_VAR(EVIOCSABS, 0x16)\n_BASIC_META_VAR(EVIOCSABS, 0x17)\n_BASIC_META_VAR(EVIOCSABS, 0x18)\n_BASIC_META_VAR(EVIOCSABS, 0x19)\n_BASIC_META_VAR(EVIOCSABS, 0x1A)\n_BASIC_META_VAR(EVIOCSABS, 0x1B)\n_BASIC_META_VAR(EVIOCSABS, 0x1C)\n_BASIC_META_VAR(EVIOCSABS, 0x1D)\n_BASIC_META_VAR(EVIOCSABS, 0x1E)\n_BASIC_META_VAR(EVIOCSABS, 0x1F)\n_BASIC_META_VAR(EVIOCSABS, 0x20)\n_BASIC_META_VAR(EVIOCSABS, 0x21)\n_BASIC_META_VAR(EVIOCSABS, 0x22)\n_BASIC_META_VAR(EVIOCSABS, 0x23)\n_BASIC_META_VAR(EVIOCSABS, 0x24)\n_BASIC_META_VAR(EVIOCSABS, 0x25)\n_BASIC_META_VAR(EVIOCSABS, 0x26)\n_BASIC_META_VAR(EVIOCSABS, 0x27)\n_BASIC_META_VAR(EVIOCSABS, 0x28)\n_BASIC_META_VAR(EVIOCSABS, 0x29)\n_BASIC_META_VAR(EVIOCSABS, 0x2A)\n_BASIC_META_VAR(EVIOCSABS, 0x2B)\n_BASIC_META_VAR(EVIOCSABS, 0x2C)\n_BASIC_META_VAR(EVIOCSABS, 0x2D)\n_BASIC_META_VAR(EVIOCSABS, 0x2E)\n_BASIC_META_VAR(EVIOCSABS, 0x2F)\n// XXX: _BASIC_META(EVIOCSFF)\n_BASIC_META(EVIOCRMFF)\n_BASIC_META(EVIOCGEFFECTS)\n_BASIC_META(EVIOCGRAB)\n_BASIC_META(EVIOCREVOKE)\n_BASIC_META(EVIOCGMASK)\n_BASIC_META(EVIOCSMASK)\n_BASIC_META(EVIOCSCLOCKID)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/joystick.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"LinuxSyscalls/x64/Types.h\"\n#include \"LinuxSyscalls/x64/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <linux/joystick.h>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x64 {\n\nnamespace joystick {\n#include \"LinuxSyscalls/x64/Ioctl/joystick.inl\"\n}\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/joystick.inl",
    "content": "_BASIC_META(JSIOCGVERSION)\n_BASIC_META(JSIOCGAXES)\n_BASIC_META(JSIOCGBUTTONS)\n_BASIC_META_VAR(JSIOCGNAME, 0)\n_BASIC_META(JSIOCSCORR)\n_BASIC_META(JSIOCGCORR)\n_BASIC_META(JSIOCSAXMAP)\n_BASIC_META(JSIOCGAXMAP)\n_BASIC_META(JSIOCSBTNMAP)\n_BASIC_META(JSIOCGBTNMAP)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/msdos_fs.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"LinuxSyscalls/x64/Types.h\"\n#include \"LinuxSyscalls/x64/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <linux/msdos_fs.h>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x64 {\n\nnamespace msdos_fs {\n#include \"LinuxSyscalls/x64/Ioctl/msdos_fs.inl\"\n}\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/msdos_fs.inl",
    "content": "_BASIC_META(VFAT_IOCTL_READDIR_BOTH)\n_BASIC_META(VFAT_IOCTL_READDIR_SHORT)\n_BASIC_META(FAT_IOCTL_GET_ATTRIBUTES)\n_BASIC_META(FAT_IOCTL_SET_ATTRIBUTES)\n_BASIC_META(FAT_IOCTL_GET_VOLUME_ID)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/msm_drm.inl",
    "content": "_BASIC_META(DRM_IOCTL_MSM_GET_PARAM)\n_BASIC_META(DRM_IOCTL_MSM_SET_PARAM)\n_BASIC_META(DRM_IOCTL_MSM_GEM_NEW)\n_BASIC_META(DRM_IOCTL_MSM_GEM_INFO)\n_BASIC_META(DRM_IOCTL_MSM_GEM_CPU_PREP)\n_BASIC_META(DRM_IOCTL_MSM_GEM_CPU_FINI)\n_BASIC_META(DRM_IOCTL_MSM_GEM_SUBMIT)\n_BASIC_META(DRM_IOCTL_MSM_WAIT_FENCE)\n_BASIC_META(DRM_IOCTL_MSM_GEM_MADVISE)\n_BASIC_META(DRM_IOCTL_MSM_SUBMITQUEUE_NEW)\n_BASIC_META(DRM_IOCTL_MSM_SUBMITQUEUE_CLOSE)\n_BASIC_META(DRM_IOCTL_MSM_SUBMITQUEUE_QUERY)\n\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/sockios.h",
    "content": "// SPDX-License-Identifier: MIT\n#include \"LinuxSyscalls/x64/Types.h\"\n#include \"LinuxSyscalls/x64/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <linux/if.h>\n#include <linux/sockios.h>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x64 {\nnamespace sockios {\n#include \"LinuxSyscalls/x64/Ioctl/sockios.inl\"\n}\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/sockios.inl",
    "content": "#ifndef SIOCGSTAMP_OLD\n#define SIOCGSTAMP_OLD 0x8906\n#endif\n_BASIC_META(SIOCGSTAMP_OLD)\n#ifndef SIOCGSTAMPNS_OLD\n#define SIOCGSTAMPNS_OLD 0x8907\n#endif\n_BASIC_META(SIOCGSTAMPNS_OLD)\n_BASIC_META(SIOCADDRT)\n_BASIC_META(SIOCDELRT)\n_BASIC_META(SIOCRTMSG)\n_BASIC_META(SIOCGIFNAME)\n_BASIC_META(SIOCSIFLINK)\n_CUSTOM_META(SIOCGIFCONF,\n  _IOC(\n    _IOC_DIR(SIOCGIFCONF),\n    _IOC_TYPE(SIOCGIFCONF),\n    _IOC_NR(SIOCGIFCONF),\n    sizeof(struct ifconf))) // This should hit failure\n_BASIC_META(SIOCGIFFLAGS)\n_BASIC_META(SIOCSIFFLAGS)\n_BASIC_META(SIOCGIFADDR)\n_BASIC_META(SIOCSIFADDR)\n_BASIC_META(SIOCGIFDSTADDR)\n_BASIC_META(SIOCSIFDSTADDR)\n_BASIC_META(SIOCGIFBRDADDR)\n_BASIC_META(SIOCSIFBRDADDR)\n_BASIC_META(SIOCGIFNETMASK)\n_BASIC_META(SIOCSIFNETMASK)\n_BASIC_META(SIOCGIFMETRIC)\n_BASIC_META(SIOCSIFMETRIC)\n_BASIC_META(SIOCGIFMEM)\n_BASIC_META(SIOCSIFMEM)\n_BASIC_META(SIOCGIFMTU)\n_BASIC_META(SIOCSIFMTU)\n_BASIC_META(SIOCSIFNAME)\n_BASIC_META(SIOCSIFHWADDR)\n_BASIC_META(SIOCGIFENCAP)\n_BASIC_META(SIOCSIFENCAP)\n_BASIC_META(SIOCGIFHWADDR)\n_BASIC_META(SIOCGIFSLAVE)\n_BASIC_META(SIOCSIFSLAVE)\n_BASIC_META(SIOCADDMULTI)\n_BASIC_META(SIOCDELMULTI)\n_BASIC_META(SIOCGIFINDEX)\n_BASIC_META(SIOCSIFPFLAGS)\n_BASIC_META(SIOCGIFPFLAGS)\n_BASIC_META(SIOCDIFADDR)\n_BASIC_META(SIOCSIFHWBROADCAST)\n_BASIC_META(SIOCGIFCOUNT)\n_BASIC_META(SIOCGIFBR)\n_BASIC_META(SIOCSIFBR)\n_BASIC_META(SIOCGIFTXQLEN)\n_BASIC_META(SIOCSIFTXQLEN)\n_BASIC_META(SIOCETHTOOL)\n_BASIC_META(SIOCGMIIPHY)\n_BASIC_META(SIOCGMIIREG)\n_BASIC_META(SIOCSMIIREG)\n_BASIC_META(SIOCWANDEV)\n_BASIC_META(SIOCOUTQNSD)\n_BASIC_META(SIOCGSKNS)\n_BASIC_META(SIOCDARP)\n_BASIC_META(SIOCGARP)\n_BASIC_META(SIOCSARP)\n_BASIC_META(SIOCDRARP)\n_BASIC_META(SIOCGRARP)\n_BASIC_META(SIOCSRARP)\n_BASIC_META(SIOCGIFMAP)\n_BASIC_META(SIOCSIFMAP)\n_BASIC_META(SIOCADDDLCI)\n_BASIC_META(SIOCDELDLCI)\n_BASIC_META(SIOCGIFVLAN)\n_BASIC_META(SIOCSIFVLAN)\n_BASIC_META(SIOCBONDENSLAVE)\n_BASIC_META(SIOCBONDRELEASE)\n_BASIC_META(SIOCBONDSETHWADDR)\n_BASIC_META(SIOCBONDSLAVEINFOQUERY)\n_BASIC_META(SIOCBONDINFOQUERY)\n_BASIC_META(SIOCBONDCHANGEACTIVE)\n_BASIC_META(SIOCBRADDBR)\n_BASIC_META(SIOCBRDELBR)\n_BASIC_META(SIOCBRADDIF)\n_BASIC_META(SIOCBRDELIF)\n_BASIC_META(SIOCSHWTSTAMP)\n_BASIC_META(SIOCGHWTSTAMP)\n\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE,   SIOCDEVPRIVATE, 0x0)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_1, SIOCDEVPRIVATE, 0x1)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_2, SIOCDEVPRIVATE, 0x2)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_3, SIOCDEVPRIVATE, 0x3)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_4, SIOCDEVPRIVATE, 0x4)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_5, SIOCDEVPRIVATE, 0x5)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_6, SIOCDEVPRIVATE, 0x6)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_7, SIOCDEVPRIVATE, 0x7)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_8, SIOCDEVPRIVATE, 0x8)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_9, SIOCDEVPRIVATE, 0x9)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_A, SIOCDEVPRIVATE, 0xA)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_B, SIOCDEVPRIVATE, 0xB)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_C, SIOCDEVPRIVATE, 0xC)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_D, SIOCDEVPRIVATE, 0xD)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_E, SIOCDEVPRIVATE, 0xE)\n_CUSTOM_META_OFFSET(SIOCDEVPRIVATE_F, SIOCDEVPRIVATE, 0xF)\n\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE,   SIOCPROTOPRIVATE, 0x0)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_1, SIOCPROTOPRIVATE, 0x1)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_2, SIOCPROTOPRIVATE, 0x2)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_3, SIOCPROTOPRIVATE, 0x3)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_4, SIOCPROTOPRIVATE, 0x4)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_5, SIOCPROTOPRIVATE, 0x5)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_6, SIOCPROTOPRIVATE, 0x6)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_7, SIOCPROTOPRIVATE, 0x7)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_8, SIOCPROTOPRIVATE, 0x8)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_9, SIOCPROTOPRIVATE, 0x9)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_A, SIOCPROTOPRIVATE, 0xA)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_B, SIOCPROTOPRIVATE, 0xB)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_C, SIOCPROTOPRIVATE, 0xC)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_D, SIOCPROTOPRIVATE, 0xD)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_E, SIOCPROTOPRIVATE, 0xE)\n_CUSTOM_META_OFFSET(SIOCPROTOPRIVATE_F, SIOCPROTOPRIVATE, 0xF)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/wireless.h",
    "content": "// SPDX-License-Identifier: MIT\n#include \"LinuxSyscalls/x64/Types.h\"\n#include \"LinuxSyscalls/x64/Ioctl/HelperDefines.h\"\n\n#include <cstdint>\n#include <linux/wireless.h>\n#include <sys/ioctl.h>\n\nnamespace FEX::HLE::x64 {\nnamespace wireless {\n#include \"LinuxSyscalls/x64/Ioctl/wireless.inl\"\n}\n\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Ioctl/wireless.inl",
    "content": "_BASIC_META(SIOCSIWCOMMIT)\n_BASIC_META(SIOCGIWNAME)\n_BASIC_META(SIOCSIWNWID)\n_BASIC_META(SIOCGIWNWID)\n_BASIC_META(SIOCSIWFREQ)\n_BASIC_META(SIOCGIWFREQ)\n_BASIC_META(SIOCSIWMODE)\n_BASIC_META(SIOCGIWMODE)\n_BASIC_META(SIOCSIWSENS)\n_BASIC_META(SIOCGIWSENS)\n_BASIC_META(SIOCSIWRANGE)\n_BASIC_META(SIOCGIWRANGE)\n_BASIC_META(SIOCSIWPRIV)\n_BASIC_META(SIOCGIWPRIV)\n_BASIC_META(SIOCSIWSTATS)\n_BASIC_META(SIOCGIWSTATS)\n_BASIC_META(SIOCSIWSPY)\n_BASIC_META(SIOCGIWSPY)\n_BASIC_META(SIOCSIWTHRSPY)\n_BASIC_META(SIOCGIWTHRSPY)\n_BASIC_META(SIOCSIWAP)\n_BASIC_META(SIOCGIWAP)\n_BASIC_META(SIOCGIWAPLIST)\n_BASIC_META(SIOCSIWSCAN)\n_BASIC_META(SIOCGIWSCAN)\n_BASIC_META(SIOCSIWESSID)\n_BASIC_META(SIOCGIWESSID)\n_BASIC_META(SIOCSIWNICKN)\n_BASIC_META(SIOCGIWNICKN)\n_BASIC_META(SIOCSIWRATE)\n_BASIC_META(SIOCGIWRATE)\n_BASIC_META(SIOCSIWRTS)\n_BASIC_META(SIOCGIWRTS)\n_BASIC_META(SIOCSIWFRAG)\n_BASIC_META(SIOCGIWFRAG)\n_BASIC_META(SIOCSIWTXPOW)\n_BASIC_META(SIOCGIWTXPOW)\n_BASIC_META(SIOCSIWRETRY)\n_BASIC_META(SIOCGIWRETRY)\n_BASIC_META(SIOCSIWENCODE)\n_BASIC_META(SIOCGIWENCODE)\n_BASIC_META(SIOCSIWPOWER)\n_BASIC_META(SIOCGIWPOWER)\n_BASIC_META(SIOCSIWGENIE)\n_BASIC_META(SIOCGIWGENIE)\n_BASIC_META(SIOCSIWMLME)\n_BASIC_META(SIOCSIWAUTH)\n_BASIC_META(SIOCGIWAUTH)\n_BASIC_META(SIOCSIWENCODEEXT)\n_BASIC_META(SIOCGIWENCODEEXT)\n_BASIC_META(SIOCSIWPMKSA)\n\n_BASIC_META(SIOCIWFIRSTPRIV)\n_BASIC_META(SIOCIWLASTPRIV)\n\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Memory.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-64\n$end_info$\n*/\n\n#include \"LinuxSyscalls/LinuxAllocator.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n\n#include <FEXCore/IR/IR.h>\n\n#include <sys/mman.h>\n#include <sys/shm.h>\n#include <unistd.h>\n\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/MathUtils.h>\n\nnamespace FEX::HLE::x64 {\n\nvoid RegisterMemory(FEX::HLE::SyscallHandler* Handler) {\n  using namespace FEXCore::IR;\n\n  REGISTER_SYSCALL_IMPL_X64(\n    mmap, [](FEXCore::Core::CpuStateFrame* Frame, void* addr, size_t length, int prot, int flags, int fd, off_t offset) -> uint64_t {\n      return (uint64_t)FEX::HLE::_SyscallHandler->GuestMmap(Frame->Thread, addr, length, prot, flags, fd, offset);\n    });\n\n  REGISTER_SYSCALL_IMPL_X64(munmap, [](FEXCore::Core::CpuStateFrame* Frame, void* addr, size_t length) -> uint64_t {\n    return FEX::HLE::_SyscallHandler->GuestMunmap(Frame->Thread, addr, length);\n  });\n\n  REGISTER_SYSCALL_IMPL_X64(\n    mremap, [](FEXCore::Core::CpuStateFrame* Frame, void* old_address, size_t old_size, size_t new_size, int flags, void* new_address) -> uint64_t {\n      return FEX::HLE::_SyscallHandler->GuestMremap(true, Frame->Thread, old_address, old_size, new_size, flags, new_address);\n    });\n\n  REGISTER_SYSCALL_IMPL_X64(mprotect, [](FEXCore::Core::CpuStateFrame* Frame, void* addr, size_t len, int prot) -> uint64_t {\n    return FEX::HLE::_SyscallHandler->GuestMprotect(Frame->Thread, addr, len, prot);\n  });\n\n  REGISTER_SYSCALL_IMPL_X64(shmat, ([](FEXCore::Core::CpuStateFrame* Frame, int shmid, const void* shmaddr, int shmflg) -> uint64_t {\n                              return FEX::HLE::_SyscallHandler->GuestShmat(true, Frame->Thread, shmid, shmaddr, shmflg);\n                            }));\n\n  REGISTER_SYSCALL_IMPL_X64(shmdt, [](FEXCore::Core::CpuStateFrame* Frame, const void* shmaddr) -> uint64_t {\n    return FEX::HLE::_SyscallHandler->GuestShmdt(true, Frame->Thread, shmaddr);\n  });\n}\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/NotImplemented.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-64\n$end_info$\n*/\n\n#include <FEXCore/Utils/LogManager.h>\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n\n#include <errno.h>\n#include <stdint.h>\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nnamespace FEX::HLE::x64 {\n#define REGISTER_SYSCALL_NOT_IMPL_X64(name)                                             \\\n  REGISTER_SYSCALL_IMPL_X64(name, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { \\\n    LogMan::Msg::DFmt(\"Using deprecated/removed syscall: \" #name);                      \\\n    return -ENOSYS;                                                                     \\\n  });\n\n#define REGISTER_SYSCALL_NOT_IMPL_SAFE_X64(name) \\\n  REGISTER_SYSCALL_IMPL_X64(name, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { return -ENOSYS; });\n\n#define REGISTER_SYSCALL_NO_PERM_X64(name) \\\n  REGISTER_SYSCALL_IMPL_X64(name, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { return -EPERM; });\n\n// these are removed/not implemented in the linux kernel we present\nvoid RegisterNotImplemented(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_NOT_IMPL_X64(tuxcall);\n  REGISTER_SYSCALL_NOT_IMPL_X64(security);\n  REGISTER_SYSCALL_NOT_IMPL_X64(set_thread_area);\n  REGISTER_SYSCALL_NOT_IMPL_X64(get_thread_area);\n  REGISTER_SYSCALL_NOT_IMPL_X64(epoll_ctl_old);\n  REGISTER_SYSCALL_NOT_IMPL_X64(epoll_wait_old);\n  REGISTER_SYSCALL_NO_PERM_X64(kexec_file_load);\n  REGISTER_SYSCALL_NOT_IMPL_SAFE_X64(uretprobe);\n}\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Semaphore.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-64\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Types.h\"\n\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <linux/sem.h>\n#include <stddef.h>\n#include <stdint.h>\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nARG_TO_STR(FEX::HLE::x64::semun, \"%lx\")\n\nnamespace FEX::HLE::x64 {\nvoid RegisterSemaphore(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X64(semctl, [](FEXCore::Core::CpuStateFrame* Frame, int semid, int semnum, int cmd, FEX::HLE::x64::semun semun) -> uint64_t {\n    uint64_t Result {};\n    switch (cmd) {\n    case IPC_SET: {\n      struct semid64_ds buf {};\n      FaultSafeUserMemAccess::VerifyIsReadable(semun.buf, sizeof(*semun.buf));\n      buf = *semun.buf;\n      Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, &buf);\n      if (Result != -1) {\n        FaultSafeUserMemAccess::VerifyIsWritable(semun.buf, sizeof(*semun.buf));\n        *semun.buf = buf;\n      }\n      break;\n    }\n    case SEM_STAT:\n    case SEM_STAT_ANY:\n    case IPC_STAT: {\n      struct semid64_ds buf {};\n      Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, &buf);\n      if (Result != -1) {\n        FaultSafeUserMemAccess::VerifyIsWritable(semun.buf, sizeof(*semun.buf));\n        *semun.buf = buf;\n      }\n      break;\n    }\n    case SEM_INFO:\n    case IPC_INFO: {\n      struct fex_seminfo si {};\n      Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, &si);\n      if (Result != -1) {\n        FaultSafeUserMemAccess::VerifyIsWritable(semun.__buf, sizeof(si));\n        memcpy(semun.__buf, &si, sizeof(si));\n      }\n      break;\n    }\n    case GETALL:\n    case SETALL: {\n      // ptr is just a int32_t* in this case\n      Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, semun.array);\n      break;\n    }\n    case SETVAL: {\n      // ptr is just a int32_t in this case\n      Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, semun.val);\n      break;\n    }\n    case IPC_RMID:\n    case GETPID:\n    case GETNCNT:\n    case GETZCNT:\n    case GETVAL: Result = ::syscall(SYSCALL_DEF(semctl), semid, semnum, cmd, semun); break;\n    default: LOGMAN_MSG_A_FMT(\"Unhandled semctl cmd: {}\", cmd); return -EINVAL;\n    }\n    SYSCALL_ERRNO();\n  });\n}\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Signals.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-64\n$end_info$\n*/\n\n#include \"LinuxSyscalls/SignalDelegator.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/Syscalls/Thread.h\"\n\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Core/SignalDelegator.h>\n\n#include <signal.h>\n#include <sys/syscall.h>\n#include <unistd.h>\n\nnamespace FEX::HLE::x64 {\nvoid RegisterSignals(FEX::HLE::SyscallHandler* Handler) {\n  REGISTER_SYSCALL_IMPL_X64(\n    rt_sigaction, [](FEXCore::Core::CpuStateFrame* Frame, int signum, const GuestSigAction* act, GuestSigAction* oldact, size_t sigsetsize) -> uint64_t {\n      if (sigsetsize != 8) {\n        return -EINVAL;\n      }\n      FaultSafeUserMemAccess::VerifyIsReadableOrNull(act, sizeof(GuestSigAction));\n      FaultSafeUserMemAccess::VerifyIsWritableOrNull(oldact, sizeof(GuestSigAction));\n\n      return FEX::HLE::_SyscallHandler->GetSignalDelegator()->RegisterGuestSignalHandler(signum, act, oldact);\n    });\n\n  REGISTER_SYSCALL_IMPL_X64(\n    rt_sigtimedwait,\n    [](FEXCore::Core::CpuStateFrame* Frame, uint64_t* set, siginfo_t* info, const struct timespec* timeout, size_t sigsetsize) -> uint64_t {\n      FaultSafeUserMemAccess::VerifyIsReadable(set, sizeof(sigsetsize));\n      FaultSafeUserMemAccess::VerifyIsWritableOrNull(info, sizeof(siginfo_t));\n      FaultSafeUserMemAccess::VerifyIsReadableOrNull(timeout, sizeof(timespec));\n      return FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSigTimedWait(set, info, timeout, sigsetsize);\n    });\n}\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Syscalls.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-64\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x64/SyscallsEnum.h\"\n\n#include <FEXCore/HLE/SyscallHandler.h>\n\nnamespace FEX::HLE::x64 {\nvoid RegisterEpoll(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterFD(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterInfo(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterMemory(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterSemaphore(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterSignals(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterThread(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterTime(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterNotImplemented(FEX::HLE::SyscallHandler* Handler);\nvoid RegisterPassthrough(FEX::HLE::SyscallHandler* Handler);\n\nx64SyscallHandler::x64SyscallHandler(FEXCore::Context::Context* ctx, FEX::HLE::SignalDelegator* _SignalDelegation, FEX::HLE::ThunkHandler* ThunkHandler)\n  : SyscallHandler {ctx, _SignalDelegation, ThunkHandler} {\n  OSABI = FEXCore::HLE::SyscallOSABI::OS_LINUX64;\n\n  RegisterSyscallHandlers();\n}\n\nvoid x64SyscallHandler::RegisterSyscallHandlers() {\n  FEX::HLE::RegisterEpoll(this);\n  FEX::HLE::RegisterFD(this);\n  FEX::HLE::RegisterFS(this);\n  FEX::HLE::RegisterInfo(this);\n  FEX::HLE::RegisterIO(this);\n  FEX::HLE::RegisterMemory(this);\n  FEX::HLE::RegisterSignals(this);\n  FEX::HLE::RegisterThread(this);\n  FEX::HLE::RegisterTimer(this);\n  FEX::HLE::RegisterNotImplemented(this);\n  FEX::HLE::RegisterStubs(this);\n\n  // 64bit specific\n  FEX::HLE::x64::RegisterEpoll(this);\n  FEX::HLE::x64::RegisterFD(this);\n  FEX::HLE::x64::RegisterInfo(this);\n  FEX::HLE::x64::RegisterMemory(this);\n  FEX::HLE::x64::RegisterSemaphore(this);\n  FEX::HLE::x64::RegisterSignals(this);\n  FEX::HLE::x64::RegisterThread(this);\n  FEX::HLE::x64::RegisterTime(this);\n  FEX::HLE::x64::RegisterNotImplemented(this);\n  FEX::HLE::x64::RegisterPassthrough(this);\n\n  // x86-64 has a gap of syscalls in the range of [335, 424) where there aren't any\n  // These are defined that these must return -ENOSYS\n  // This allows x86-64 to start using the common syscall numbers\n  // Fill the gap to ensure that FEX doesn't assert\n  constexpr int SYSCALL_GAP_BEGIN = 335;\n  constexpr int SYSCALL_GAP_END = 424;\n\n  const SyscallFunctionDefinition InvalidSyscall {\n    .Ptr = reinterpret_cast<void*>(&UnimplementedSyscall),\n    .NumArgs = 0,\n#ifdef DEBUG_STRACE\n    .StraceFmt = \"Invalid\",\n#endif\n  };\n  std::fill(Definitions.begin() + SYSCALL_GAP_BEGIN, Definitions.begin() + SYSCALL_GAP_END, InvalidSyscall);\n\n#if PRINT_MISSING_SYSCALLS\n  for (auto& Syscall : SyscallNames) {\n    if (Definitions[Syscall.first].Ptr == reinterpret_cast<void*>(&UnimplementedSyscall)) {\n      LogMan::Msg::DFmt(\"Unimplemented syscall: {}\", Syscall.second);\n    }\n  }\n#endif\n}\n\nfextl::unique_ptr<FEX::HLE::SyscallHandler>\nCreateHandler(FEXCore::Context::Context* ctx, FEX::HLE::SignalDelegator* _SignalDelegation, FEX::HLE::ThunkHandler* ThunkHandler) {\n  return fextl::make_unique<x64SyscallHandler>(ctx, _SignalDelegation, ThunkHandler);\n}\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Syscalls.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-64\n$end_info$\n*/\n\n#pragma once\n\n#include \"LinuxSyscalls/FileManagement.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n\n#include <FEXCore/HLE/SyscallHandler.h>\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/string.h>\n\n#include <atomic>\n#include <condition_variable>\n#include <memory>\n#include <mutex>\n\nnamespace FEX::HLE {\nclass SignalDelegator;\nclass SyscallHandler;\nclass ThunkHandler;\n} // namespace FEX::HLE\n\nnamespace FEXCore::Core {\nstruct InternalThreadState;\n}\n\nnamespace FEX::HLE::x64 {\nclass x64SyscallHandler final : public FEX::HLE::SyscallHandler {\npublic:\n  x64SyscallHandler(FEXCore::Context::Context* ctx, FEX::HLE::SignalDelegator* _SignalDelegation, FEX::HLE::ThunkHandler* ThunkHandler);\n\n  void* GuestMmap(FEXCore::Core::InternalThreadState* Thread, void* addr, size_t length, int prot, int flags, int fd, off_t offset) override {\n    return FEX::HLE::SyscallHandler::GuestMmap(true, Thread, addr, length, prot, flags, fd, offset);\n  }\n  uint64_t GuestMunmap(FEXCore::Core::InternalThreadState* Thread, void* addr, uint64_t length) override {\n    return FEX::HLE::SyscallHandler::GuestMunmap(true, Thread, addr, length);\n  }\n\n\n  void RegisterSyscall_64(int SyscallNumber,\n#ifdef DEBUG_STRACE\n                          const fextl::string& TraceFormatString,\n#endif\n                          void* SyscallHandler, int ArgumentCount) override {\n    auto& Def = Definitions.at(SyscallNumber);\n#if defined(ASSERTIONS_ENABLED) && ASSERTIONS_ENABLED\n    LOGMAN_THROW_A_FMT(Def.Ptr == reinterpret_cast<void*>(&UnimplementedSyscall), \"Oops overwriting sysall problem, {}\", SyscallNumber);\n#endif\n    Def.Ptr = SyscallHandler;\n    Def.NumArgs = ArgumentCount;\n#ifdef DEBUG_STRACE\n    Def.StraceFmt = TraceFormatString;\n#endif\n  }\n\nprivate:\n  void RegisterSyscallHandlers();\n};\n\nfextl::unique_ptr<FEX::HLE::SyscallHandler>\nCreateHandler(FEXCore::Context::Context* ctx, FEX::HLE::SignalDelegator* _SignalDelegation, FEX::HLE::ThunkHandler* ThunkHandler);\n\n//////\n// REGISTER_SYSCALL_IMPL implementation\n// Given a syscall name + a lambda, and it will generate an strace string, extract number of arguments\n// and register it as a syscall handler\n//////\n\n// RegisterSyscall base\n// Deduces return, args... from the function passed\n// Does not work with lambas, because they are objects with operator (), not functions\ntemplate<typename R, typename... Args>\nvoid RegisterSyscall(SyscallHandler* Handler, int SyscallNumber, const char* Name, R (*fn)(FEXCore::Core::CpuStateFrame* Frame, Args...)) {\n#ifdef DEBUG_STRACE\n  auto TraceFormatString = fextl::string(Name) + \"(\" + CollectArgsFmtString<Args...>() + \") = {}\";\n#endif\n  Handler->RegisterSyscall_64(SyscallNumber,\n#ifdef DEBUG_STRACE\n                              TraceFormatString,\n#endif\n                              reinterpret_cast<void*>(fn), sizeof...(Args));\n}\n\n// Generic RegisterSyscall for lambdas\n// Non-capturing lambdas can be cast to function pointers, but this does not happen on argument matching\n// This is some glue logic that will cast a lambda and call the base RegisterSyscall implementation\ntemplate<class F>\nvoid RegisterSyscall(SyscallHandler* _Handler, int num, const char* name, F f) {\n  RegisterSyscall(_Handler, num, name, +f);\n}\n\n} // namespace FEX::HLE::x64\n\n// Registers syscall for 64bit only\n#define REGISTER_SYSCALL_IMPL_X64(name, lambda)                                        \\\n  do {                                                                                 \\\n    FEX::HLE::x64::RegisterSyscall(Handler, x64::SYSCALL_x64_##name, #name, (lambda)); \\\n  } while (false)\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/SyscallsEnum.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-64\n$end_info$\n*/\n#pragma once\n\nnamespace FEX::HLE::x64 {\n///< Enum containing all x86-64 linux syscalls for the guest kernel version\nenum Syscalls_x64 {\n  SYSCALL_x64_read = 0,\n  SYSCALL_x64_write = 1,\n  SYSCALL_x64_open = 2,\n  SYSCALL_x64_close = 3,\n  SYSCALL_x64_stat = 4,\n  SYSCALL_x64_fstat = 5,\n  SYSCALL_x64_lstat = 6,\n  SYSCALL_x64_poll = 7,\n  SYSCALL_x64_lseek = 8,\n  SYSCALL_x64_mmap = 9,\n  SYSCALL_x64_mprotect = 10,\n  SYSCALL_x64_munmap = 11,\n  SYSCALL_x64_brk = 12,\n  SYSCALL_x64_rt_sigaction = 13,\n  SYSCALL_x64_rt_sigprocmask = 14,\n  SYSCALL_x64_rt_sigreturn = 15,\n  SYSCALL_x64_ioctl = 16,\n  SYSCALL_x64_pread_64 = 17,\n  SYSCALL_x64_pwrite_64 = 18,\n  SYSCALL_x64_readv = 19,\n  SYSCALL_x64_writev = 20,\n  SYSCALL_x64_access = 21,\n  SYSCALL_x64_pipe = 22,\n  SYSCALL_x64_select = 23,\n  SYSCALL_x64_sched_yield = 24,\n  SYSCALL_x64_mremap = 25,\n  SYSCALL_x64_msync = 26,\n  SYSCALL_x64_mincore = 27,\n  SYSCALL_x64_madvise = 28,\n  SYSCALL_x64_shmget = 29,\n  SYSCALL_x64_shmat = 30,\n  SYSCALL_x64_shmctl = 31,\n  SYSCALL_x64_dup = 32,\n  SYSCALL_x64_dup2 = 33,\n  SYSCALL_x64_pause = 34,\n  SYSCALL_x64_nanosleep = 35,\n  SYSCALL_x64_getitimer = 36,\n  SYSCALL_x64_alarm = 37,\n  SYSCALL_x64_setitimer = 38,\n  SYSCALL_x64_getpid = 39,\n  SYSCALL_x64_sendfile = 40,\n  SYSCALL_x64_socket = 41,\n  SYSCALL_x64_connect = 42,\n  SYSCALL_x64_accept = 43,\n  SYSCALL_x64_sendto = 44,\n  SYSCALL_x64_recvfrom = 45,\n  SYSCALL_x64_sendmsg = 46,\n  SYSCALL_x64_recvmsg = 47,\n  SYSCALL_x64_shutdown = 48,\n  SYSCALL_x64_bind = 49,\n  SYSCALL_x64_listen = 50,\n  SYSCALL_x64_getsockname = 51,\n  SYSCALL_x64_getpeername = 52,\n  SYSCALL_x64_socketpair = 53,\n  SYSCALL_x64_setsockopt = 54,\n  SYSCALL_x64_getsockopt = 55,\n  SYSCALL_x64_clone = 56,\n  SYSCALL_x64_fork = 57,\n  SYSCALL_x64_vfork = 58,\n  SYSCALL_x64_execve = 59,\n  SYSCALL_x64_exit = 60,\n  SYSCALL_x64_wait4 = 61,\n  SYSCALL_x64_kill = 62,\n  SYSCALL_x64_uname = 63,\n  SYSCALL_x64_semget = 64,\n  SYSCALL_x64_semop = 65,\n  SYSCALL_x64_semctl = 66,\n  SYSCALL_x64_shmdt = 67,\n  SYSCALL_x64_msgget = 68,\n  SYSCALL_x64_msgsnd = 69,\n  SYSCALL_x64_msgrcv = 70,\n  SYSCALL_x64_msgctl = 71,\n  SYSCALL_x64_fcntl = 72,\n  SYSCALL_x64_flock = 73,\n  SYSCALL_x64_fsync = 74,\n  SYSCALL_x64_fdatasync = 75,\n  SYSCALL_x64_truncate = 76,\n  SYSCALL_x64_ftruncate = 77,\n  SYSCALL_x64_getdents = 78,\n  SYSCALL_x64_getcwd = 79,\n  SYSCALL_x64_chdir = 80,\n  SYSCALL_x64_fchdir = 81,\n  SYSCALL_x64_rename = 82,\n  SYSCALL_x64_mkdir = 83,\n  SYSCALL_x64_rmdir = 84,\n  SYSCALL_x64_creat = 85,\n  SYSCALL_x64_link = 86,\n  SYSCALL_x64_unlink = 87,\n  SYSCALL_x64_symlink = 88,\n  SYSCALL_x64_readlink = 89,\n  SYSCALL_x64_chmod = 90,\n  SYSCALL_x64_fchmod = 91,\n  SYSCALL_x64_chown = 92,\n  SYSCALL_x64_fchown = 93,\n  SYSCALL_x64_lchown = 94,\n  SYSCALL_x64_umask = 95,\n  SYSCALL_x64_gettimeofday = 96,\n  SYSCALL_x64_getrlimit = 97,\n  SYSCALL_x64_getrusage = 98,\n  SYSCALL_x64_sysinfo = 99,\n  SYSCALL_x64_times = 100,\n  SYSCALL_x64_ptrace = 101,\n  SYSCALL_x64_getuid = 102,\n  SYSCALL_x64_syslog = 103,\n  SYSCALL_x64_getgid = 104,\n  SYSCALL_x64_setuid = 105,\n  SYSCALL_x64_setgid = 106,\n  SYSCALL_x64_geteuid = 107,\n  SYSCALL_x64_getegid = 108,\n  SYSCALL_x64_setpgid = 109,\n  SYSCALL_x64_getppid = 110,\n  SYSCALL_x64_getpgrp = 111,\n  SYSCALL_x64_setsid = 112,\n  SYSCALL_x64_setreuid = 113,\n  SYSCALL_x64_setregid = 114,\n  SYSCALL_x64_getgroups = 115,\n  SYSCALL_x64_setgroups = 116,\n  SYSCALL_x64_setresuid = 117,\n  SYSCALL_x64_getresuid = 118,\n  SYSCALL_x64_setresgid = 119,\n  SYSCALL_x64_getresgid = 120,\n  SYSCALL_x64_getpgid = 121,\n  SYSCALL_x64_setfsuid = 122,\n  SYSCALL_x64_setfsgid = 123,\n  SYSCALL_x64_getsid = 124,\n  SYSCALL_x64_capget = 125,\n  SYSCALL_x64_capset = 126,\n  SYSCALL_x64_rt_sigpending = 127,\n  SYSCALL_x64_rt_sigtimedwait = 128,\n  SYSCALL_x64_rt_sigqueueinfo = 129,\n  SYSCALL_x64_rt_sigsuspend = 130,\n  SYSCALL_x64_sigaltstack = 131,\n  SYSCALL_x64_utime = 132,\n  SYSCALL_x64_mknod = 133,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_uselib = 134,\n  SYSCALL_x64_personality = 135,\n  SYSCALL_x64_ustat = 136,\n  SYSCALL_x64_statfs = 137,\n  SYSCALL_x64_fstatfs = 138,\n  SYSCALL_x64_sysfs = 139,\n  SYSCALL_x64_getpriority = 140,\n  SYSCALL_x64_setpriority = 141,\n  SYSCALL_x64_sched_setparam = 142,\n  SYSCALL_x64_sched_getparam = 143,\n  SYSCALL_x64_sched_setscheduler = 144,\n  SYSCALL_x64_sched_getscheduler = 145,\n  SYSCALL_x64_sched_get_priority_max = 146,\n  SYSCALL_x64_sched_get_priority_min = 147,\n  SYSCALL_x64_sched_rr_get_interval = 148,\n  SYSCALL_x64_mlock = 149,\n  SYSCALL_x64_munlock = 150,\n  SYSCALL_x64_mlockall = 151,\n  SYSCALL_x64_munlockall = 152,\n  SYSCALL_x64_vhangup = 153,\n  SYSCALL_x64_modify_ldt = 154,\n  SYSCALL_x64_pivot_root = 155,\n  SYSCALL_x64__sysctl = 156,\n  SYSCALL_x64_prctl = 157,\n  SYSCALL_x64_arch_prctl = 158,\n  SYSCALL_x64_adjtimex = 159,\n  SYSCALL_x64_setrlimit = 160,\n  SYSCALL_x64_chroot = 161,\n  SYSCALL_x64_sync = 162,\n  SYSCALL_x64_acct = 163,\n  SYSCALL_x64_settimeofday = 164,\n  SYSCALL_x64_mount = 165,\n  SYSCALL_x64_umount2 = 166,\n  SYSCALL_x64_swapon = 167,\n  SYSCALL_x64_swapoff = 168,\n  SYSCALL_x64_reboot = 169,\n  SYSCALL_x64_sethostname = 170,\n  SYSCALL_x64_setdomainname = 171,\n  SYSCALL_x64_iopl = 172,\n  SYSCALL_x64_ioperm = 173,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_create_module = 174,\n  SYSCALL_x64_init_module = 175,\n  SYSCALL_x64_delete_module = 176,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_get_kernel_syms = 177,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_query_module = 178,\n  SYSCALL_x64_quotactl = 179,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_nfsservctl = 180,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_getpmsg = 181,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_putpmsg = 182,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_afs_syscall = 183,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_tuxcall = 184,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_security = 185,\n  SYSCALL_x64_gettid = 186,\n  SYSCALL_x64_readahead = 187,\n  SYSCALL_x64_setxattr = 188,\n  SYSCALL_x64_lsetxattr = 189,\n  SYSCALL_x64_fsetxattr = 190,\n  SYSCALL_x64_getxattr = 191,\n  SYSCALL_x64_lgetxattr = 192,\n  SYSCALL_x64_fgetxattr = 193,\n  SYSCALL_x64_listxattr = 194,\n  SYSCALL_x64_llistxattr = 195,\n  SYSCALL_x64_flistxattr = 196,\n  SYSCALL_x64_removexattr = 197,\n  SYSCALL_x64_lremovexattr = 198,\n  SYSCALL_x64_fremovexattr = 199,\n  SYSCALL_x64_tkill = 200,\n  SYSCALL_x64_time = 201,\n  SYSCALL_x64_futex = 202,\n  SYSCALL_x64_sched_setaffinity = 203,\n  SYSCALL_x64_sched_getaffinity = 204,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_set_thread_area = 205,\n  SYSCALL_x64_io_setup = 206,\n  SYSCALL_x64_io_destroy = 207,\n  SYSCALL_x64_io_getevents = 208,\n  SYSCALL_x64_io_submit = 209,\n  SYSCALL_x64_io_cancel = 210,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_get_thread_area = 211,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_lookup_dcookie = 212,\n  SYSCALL_x64_epoll_create = 213,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_epoll_ctl_old = 214,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_epoll_wait_old = 215,\n  SYSCALL_x64_remap_file_pages = 216,\n  SYSCALL_x64_getdents64 = 217,\n  SYSCALL_x64_set_tid_address = 218,\n  SYSCALL_x64_restart_syscall = 219,\n  SYSCALL_x64_semtimedop = 220,\n  SYSCALL_x64_fadvise64 = 221,\n  SYSCALL_x64_timer_create = 222,\n  SYSCALL_x64_timer_settime = 223,\n  SYSCALL_x64_timer_gettime = 224,\n  SYSCALL_x64_timer_getoverrun = 225,\n  SYSCALL_x64_timer_delete = 226,\n  SYSCALL_x64_clock_settime = 227,\n  SYSCALL_x64_clock_gettime = 228,\n  SYSCALL_x64_clock_getres = 229,\n  SYSCALL_x64_clock_nanosleep = 230,\n  SYSCALL_x64_exit_group = 231,\n  SYSCALL_x64_epoll_wait = 232,\n  SYSCALL_x64_epoll_ctl = 233,\n  SYSCALL_x64_tgkill = 234,\n  SYSCALL_x64_utimes = 235,\n  // No entrypoint. -ENOSYS\n  SYSCALL_x64_vserver = 236,\n  SYSCALL_x64_mbind = 237,\n  SYSCALL_x64_set_mempolicy = 238,\n  SYSCALL_x64_get_mempolicy = 239,\n  SYSCALL_x64_mq_open = 240,\n  SYSCALL_x64_mq_unlink = 241,\n  SYSCALL_x64_mq_timedsend = 242,\n  SYSCALL_x64_mq_timedreceive = 243,\n  SYSCALL_x64_mq_notify = 244,\n  SYSCALL_x64_mq_getsetattr = 245,\n  SYSCALL_x64_kexec_load = 246,\n  SYSCALL_x64_waitid = 247,\n  SYSCALL_x64_add_key = 248,\n  SYSCALL_x64_request_key = 249,\n  SYSCALL_x64_keyctl = 250,\n  SYSCALL_x64_ioprio_set = 251,\n  SYSCALL_x64_ioprio_get = 252,\n  SYSCALL_x64_inotify_init = 253,\n  SYSCALL_x64_inotify_add_watch = 254,\n  SYSCALL_x64_inotify_rm_watch = 255,\n  SYSCALL_x64_migrate_pages = 256,\n  SYSCALL_x64_openat = 257,\n  SYSCALL_x64_mkdirat = 258,\n  SYSCALL_x64_mknodat = 259,\n  SYSCALL_x64_fchownat = 260,\n  SYSCALL_x64_futimesat = 261,\n  SYSCALL_x64_newfstatat = 262,\n  SYSCALL_x64_unlinkat = 263,\n  SYSCALL_x64_renameat = 264,\n  SYSCALL_x64_linkat = 265,\n  SYSCALL_x64_symlinkat = 266,\n  SYSCALL_x64_readlinkat = 267,\n  SYSCALL_x64_fchmodat = 268,\n  SYSCALL_x64_faccessat = 269,\n  SYSCALL_x64_pselect6 = 270,\n  SYSCALL_x64_ppoll = 271,\n  SYSCALL_x64_unshare = 272,\n  SYSCALL_x64_set_robust_list = 273,\n  SYSCALL_x64_get_robust_list = 274,\n  SYSCALL_x64_splice = 275,\n  SYSCALL_x64_tee = 276,\n  SYSCALL_x64_sync_file_range = 277,\n  SYSCALL_x64_vmsplice = 278,\n  SYSCALL_x64_move_pages = 279,\n  SYSCALL_x64_utimensat = 280,\n  SYSCALL_x64_epoll_pwait = 281,\n  SYSCALL_x64_signalfd = 282,\n  SYSCALL_x64_timerfd_create = 283,\n  SYSCALL_x64_eventfd = 284,\n  SYSCALL_x64_fallocate = 285,\n  SYSCALL_x64_timerfd_settime = 286,\n  SYSCALL_x64_timerfd_gettime = 287,\n  SYSCALL_x64_accept4 = 288,\n  SYSCALL_x64_signalfd4 = 289,\n  SYSCALL_x64_eventfd2 = 290,\n  SYSCALL_x64_epoll_create1 = 291,\n  SYSCALL_x64_dup3 = 292,\n  SYSCALL_x64_pipe2 = 293,\n  SYSCALL_x64_inotify_init1 = 294,\n  SYSCALL_x64_preadv = 295,\n  SYSCALL_x64_pwritev = 296,\n  SYSCALL_x64_rt_tgsigqueueinfo = 297,\n  SYSCALL_x64_perf_event_open = 298,\n  SYSCALL_x64_recvmmsg = 299,\n  SYSCALL_x64_fanotify_init = 300,\n  SYSCALL_x64_fanotify_mark = 301,\n  SYSCALL_x64_prlimit_64 = 302,\n  SYSCALL_x64_name_to_handle_at = 303,\n  SYSCALL_x64_open_by_handle_at = 304,\n  SYSCALL_x64_clock_adjtime = 305,\n  SYSCALL_x64_syncfs = 306,\n  SYSCALL_x64_sendmmsg = 307,\n  SYSCALL_x64_setns = 308,\n  SYSCALL_x64_getcpu = 309,\n  SYSCALL_x64_process_vm_readv = 310,\n  SYSCALL_x64_process_vm_writev = 311,\n  SYSCALL_x64_kcmp = 312,\n  SYSCALL_x64_finit_module = 313,\n  SYSCALL_x64_sched_setattr = 314,\n  SYSCALL_x64_sched_getattr = 315,\n  SYSCALL_x64_renameat2 = 316,\n  SYSCALL_x64_seccomp = 317,\n  SYSCALL_x64_getrandom = 318,\n  SYSCALL_x64_memfd_create = 319,\n  SYSCALL_x64_kexec_file_load = 320,\n  SYSCALL_x64_bpf = 321,\n  SYSCALL_x64_execveat = 322,\n  SYSCALL_x64_userfaultfd = 323,\n  SYSCALL_x64_membarrier = 324,\n  SYSCALL_x64_mlock2 = 325,\n  SYSCALL_x64_copy_file_range = 326,\n  SYSCALL_x64_preadv2 = 327,\n  SYSCALL_x64_pwritev2 = 328,\n  SYSCALL_x64_pkey_mprotect = 329,\n  SYSCALL_x64_pkey_alloc = 330,\n  SYSCALL_x64_pkey_free = 331,\n  SYSCALL_x64_statx = 332,\n  SYSCALL_x64_io_pgetevents = 333,\n  SYSCALL_x64_rseq = 334,\n  SYSCALL_x64_uretprobe = 335,\n  SYSCALL_x64_pidfd_send_signal = 424,\n  SYSCALL_x64_io_uring_setup = 425,\n  SYSCALL_x64_io_uring_enter = 426,\n  SYSCALL_x64_io_uring_register = 427,\n  SYSCALL_x64_open_tree = 428,\n  SYSCALL_x64_move_mount = 429,\n  SYSCALL_x64_fsopen = 430,\n  SYSCALL_x64_fsconfig = 431,\n  SYSCALL_x64_fsmount = 432,\n  SYSCALL_x64_fspick = 433,\n  SYSCALL_x64_pidfd_open = 434,\n  SYSCALL_x64_clone3 = 435,\n  SYSCALL_x64_close_range = 436,\n  SYSCALL_x64_openat2 = 437,\n  SYSCALL_x64_pidfd_getfd = 438,\n  SYSCALL_x64_faccessat2 = 439,\n  SYSCALL_x64_process_madvise = 440,\n  SYSCALL_x64_epoll_pwait2 = 441,\n  SYSCALL_x64_mount_setattr = 442,\n  SYSCALL_x64_quotactl_fd = 443,\n  SYSCALL_x64_landlock_create_ruleset = 444,\n  SYSCALL_x64_landlock_add_rule = 445,\n  SYSCALL_x64_landlock_restrict_self = 446,\n  SYSCALL_x64_memfd_secret = 447,\n  SYSCALL_x64_process_mrelease = 448,\n  SYSCALL_x64_futex_waitv = 449,\n  SYSCALL_x64_set_mempolicy_home_node = 450,\n  SYSCALL_x64_cachestat = 451,\n  SYSCALL_x64_fchmodat2 = 452,\n  SYSCALL_x64_map_shadow_stack = 453,\n  SYSCALL_x64_futex_wake = 454,\n  SYSCALL_x64_futex_wait = 455,\n  SYSCALL_x64_futex_requeue = 456,\n  SYSCALL_x64_statmount = 457,\n  SYSCALL_x64_listmount = 458,\n  SYSCALL_x64_lsm_get_self_attr = 459,\n  SYSCALL_x64_lsm_set_self_attr = 460,\n  SYSCALL_x64_lsm_list_modules = 461,\n  SYSCALL_x64_mseal = 462,\n  SYSCALL_x64_setxattrat = 463,\n  SYSCALL_x64_getxattrat = 464,\n  SYSCALL_x64_listxattrat = 465,\n  SYSCALL_x64_removexattrat = 466,\n  SYSCALL_x64_MAX = 512,\n\n  // Unsupported syscalls on this host\n  SYSCALL_x64_waitpid = ~0,\n  SYSCALL_x64_break = ~0,\n  SYSCALL_x64_oldstat = ~0,\n  SYSCALL_x64_umount = ~0,\n  SYSCALL_x64_stime = ~0,\n  SYSCALL_x64_oldfstat = ~0,\n  SYSCALL_x64_stty = ~0,\n  SYSCALL_x64_gtty = ~0,\n  SYSCALL_x64_nice = ~0,\n  SYSCALL_x64_ftime = ~0,\n  SYSCALL_x64_prof = ~0,\n  SYSCALL_x64_signal = ~0,\n  SYSCALL_x64_lock = ~0,\n  SYSCALL_x64_mpx = ~0,\n  SYSCALL_x64_ulimit = ~0,\n  SYSCALL_x64_oldolduname = ~0,\n  SYSCALL_x64_sigaction = ~0,\n  SYSCALL_x64_sgetmask = ~0,\n  SYSCALL_x64_ssetmask = ~0,\n  SYSCALL_x64_sigsuspend = ~0,\n  SYSCALL_x64_sigpending = ~0,\n  SYSCALL_x64_oldlstat = ~0,\n  SYSCALL_x64_readdir = ~0,\n  SYSCALL_x64_profil = ~0,\n  SYSCALL_x64_socketcall = ~0,\n  SYSCALL_x64_olduname = ~0,\n  SYSCALL_x64_idle = ~0,\n  SYSCALL_x64_vm86old = ~0,\n  SYSCALL_x64_ipc = ~0,\n  SYSCALL_x64_sigreturn = ~0,\n  SYSCALL_x64_sigprocmask = ~0,\n  SYSCALL_x64_bdflush = ~0,\n  SYSCALL_x64__llseek = ~0,\n  SYSCALL_x64__newselect = ~0,\n  SYSCALL_x64_vm86 = ~0,\n  SYSCALL_x64_ugetrlimit = ~0,\n  SYSCALL_x64_mmap2 = ~0,\n  SYSCALL_x64_truncate64 = ~0,\n  SYSCALL_x64_ftruncate64 = ~0,\n  SYSCALL_x64_stat64 = ~0,\n  SYSCALL_x64_lstat64 = ~0,\n  SYSCALL_x64_fstat64 = ~0,\n  SYSCALL_x64_lchown32 = ~0,\n  SYSCALL_x64_getuid32 = ~0,\n  SYSCALL_x64_getgid32 = ~0,\n  SYSCALL_x64_geteuid32 = ~0,\n  SYSCALL_x64_getegid32 = ~0,\n  SYSCALL_x64_setreuid32 = ~0,\n  SYSCALL_x64_setregid32 = ~0,\n  SYSCALL_x64_getgroups32 = ~0,\n  SYSCALL_x64_setgroups32 = ~0,\n  SYSCALL_x64_fchown32 = ~0,\n  SYSCALL_x64_setresuid32 = ~0,\n  SYSCALL_x64_getresuid32 = ~0,\n  SYSCALL_x64_setresgid32 = ~0,\n  SYSCALL_x64_getresgid32 = ~0,\n  SYSCALL_x64_chown32 = ~0,\n  SYSCALL_x64_setuid32 = ~0,\n  SYSCALL_x64_setgid32 = ~0,\n  SYSCALL_x64_setfsuid32 = ~0,\n  SYSCALL_x64_setfsgid32 = ~0,\n  SYSCALL_x64_fcntl64 = ~0,\n  SYSCALL_x64_sendfile64 = ~0,\n  SYSCALL_x64_statfs64 = ~0,\n  SYSCALL_x64_fstatfs64 = ~0,\n  SYSCALL_x64_fadvise64_64 = ~0,\n  SYSCALL_x64_fstatat_64 = ~0,\n  SYSCALL_x64_clock_gettime64 = ~0,\n  SYSCALL_x64_clock_settime64 = ~0,\n  SYSCALL_x64_clock_adjtime64 = ~0,\n  SYSCALL_x64_clock_getres_time64 = ~0,\n  SYSCALL_x64_clock_nanosleep_time64 = ~0,\n  SYSCALL_x64_timer_gettime64 = ~0,\n  SYSCALL_x64_timer_settime64 = ~0,\n  SYSCALL_x64_timerfd_gettime64 = ~0,\n  SYSCALL_x64_timerfd_settime64 = ~0,\n  SYSCALL_x64_utimensat_time64 = ~0,\n  SYSCALL_x64_pselect6_time64 = ~0,\n  SYSCALL_x64_ppoll_time64 = ~0,\n  SYSCALL_x64_io_pgetevents_time64 = ~0,\n  SYSCALL_x64_recvmmsg_time64 = ~0,\n  SYSCALL_x64_mq_timedsend_time64 = ~0,\n  SYSCALL_x64_mq_timedreceive_time64 = ~0,\n  SYSCALL_x64_semtimedop_time64 = ~0,\n  SYSCALL_x64_rt_sigtimedwait_time64 = ~0,\n  SYSCALL_x64_futex_time64 = ~0,\n  SYSCALL_x64_sched_rr_get_interval_time64 = ~0,\n};\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/SyscallsNames.inl",
    "content": "/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-64\n$end_info$\n*/\n\n{ 0, \"read\"},\n{ 1, \"write\"},\n{ 2, \"open\"},\n{ 3, \"close\"},\n{ 4, \"stat\"},\n{ 5, \"fstat\"},\n{ 6, \"lstat\"},\n{ 7, \"poll\"},\n{ 8, \"lseek\"},\n{ 9, \"mmap\"},\n{ 10, \"mprotect\"},\n{ 11, \"munmap\"},\n{ 12, \"brk\"},\n{ 13, \"rt_sigaction\"},\n{ 14, \"rt_sigprocmask\"},\n{ 15, \"rt_sigreturn\"},\n{ 16, \"ioctl\"},\n{ 17, \"pread64\"},\n{ 18, \"pwrite64\"},\n{ 19, \"readv\"},\n{ 20, \"writev\"},\n{ 21, \"access\"},\n{ 22, \"pipe\"},\n{ 23, \"select\"},\n{ 24, \"sched_yield\"},\n{ 25, \"mremap\"},\n{ 26, \"msync\"},\n{ 27, \"mincore\"},\n{ 28, \"madvise\"},\n{ 29, \"shmget\"},\n{ 30, \"shmat\"},\n{ 31, \"shmctl\"},\n{ 32, \"dup\"},\n{ 33, \"dup2\"},\n{ 34, \"pause\"},\n{ 35, \"nanosleep\"},\n{ 36, \"getitimer\"},\n{ 37, \"alarm\"},\n{ 38, \"setitimer\"},\n{ 39, \"getpid\"},\n{ 40, \"sendfile\"},\n{ 41, \"socket\"},\n{ 42, \"connect\"},\n{ 43, \"accept\"},\n{ 44, \"sendto\"},\n{ 45, \"recvfrom\"},\n{ 46, \"sendmsg\"},\n{ 47, \"recvmsg\"},\n{ 48, \"shutdown\"},\n{ 49, \"bind\"},\n{ 50, \"listen\"},\n{ 51, \"getsockname\"},\n{ 52, \"getpeername\"},\n{ 53, \"socketpair\"},\n{ 54, \"setsockopt\"},\n{ 55, \"getsockopt\"},\n{ 56, \"clone\"},\n{ 57, \"fork\"},\n{ 58, \"vfork\"},\n{ 59, \"execve\"},\n{ 60, \"exit\"},\n{ 61, \"wait4\"},\n{ 62, \"kill\"},\n{ 63, \"uname\"},\n{ 64, \"semget\"},\n{ 65, \"semop\"},\n{ 66, \"semctl\"},\n{ 67, \"shmdt\"},\n{ 68, \"msgget\"},\n{ 69, \"msgsnd\"},\n{ 70, \"msgrcv\"},\n{ 71, \"msgctl\"},\n{ 72, \"fcntl\"},\n{ 73, \"flock\"},\n{ 74, \"fsync\"},\n{ 75, \"fdatasync\"},\n{ 76, \"truncate\"},\n{ 77, \"ftruncate\"},\n{ 78, \"getdents\"},\n{ 79, \"getcwd\"},\n{ 80, \"chdir\"},\n{ 81, \"fchdir\"},\n{ 82, \"rename\"},\n{ 83, \"mkdir\"},\n{ 84, \"rmdir\"},\n{ 85, \"creat\"},\n{ 86, \"link\"},\n{ 87, \"unlink\"},\n{ 88, \"symlink\"},\n{ 89, \"readlink\"},\n{ 90, \"chmod\"},\n{ 91, \"fchmod\"},\n{ 92, \"chown\"},\n{ 93, \"fchown\"},\n{ 94, \"lchown\"},\n{ 95, \"umask\"},\n{ 96, \"gettimeofday\"},\n{ 97, \"getrlimit\"},\n{ 98, \"getrusage\"},\n{ 99, \"sysinfo\"},\n{ 100, \"times\"},\n{ 101, \"ptrace\"},\n{ 102, \"getuid\"},\n{ 103, \"syslog\"},\n{ 104, \"getgid\"},\n{ 105, \"setuid\"},\n{ 106, \"setgid\"},\n{ 107, \"geteuid\"},\n{ 108, \"getegid\"},\n{ 109, \"setpgid\"},\n{ 110, \"getppid\"},\n{ 111, \"getpgrp\"},\n{ 112, \"setsid\"},\n{ 113, \"setreuid\"},\n{ 114, \"setregid\"},\n{ 115, \"getgroups\"},\n{ 116, \"setgroups\"},\n{ 117, \"setresuid\"},\n{ 118, \"getresuid\"},\n{ 119, \"setresgid\"},\n{ 120, \"getresgid\"},\n{ 121, \"getpgid\"},\n{ 122, \"setfsuid\"},\n{ 123, \"setfsgid\"},\n{ 124, \"getsid\"},\n{ 125, \"capget\"},\n{ 126, \"capset\"},\n{ 127, \"rt_sigpending\"},\n{ 128, \"rt_sigtimedwait\"},\n{ 129, \"rt_sigqueueinfo\"},\n{ 130, \"rt_sigsuspend\"},\n{ 131, \"sigaltstack\"},\n{ 132, \"utime\"},\n{ 133, \"mknod\"},\n{ 134, \"uselib\"},\n{ 135, \"personality\"},\n{ 136, \"ustat\"},\n{ 137, \"statfs\"},\n{ 138, \"fstatfs\"},\n{ 139, \"sysfs\"},\n{ 140, \"getpriority\"},\n{ 141, \"setpriority\"},\n{ 142, \"sched_setparam\"},\n{ 143, \"sched_getparam\"},\n{ 144, \"sched_setscheduler\"},\n{ 145, \"sched_getscheduler\"},\n{ 146, \"sched_get_priority_max\"},\n{ 147, \"sched_get_priority_min\"},\n{ 148, \"sched_rr_get_interval\"},\n{ 149, \"mlock\"},\n{ 150, \"munlock\"},\n{ 151, \"mlockall\"},\n{ 152, \"munlockall\"},\n{ 153, \"vhangup\"},\n{ 154, \"modify_ldt\"},\n{ 155, \"pivot_root\"},\n{ 156, \"_sysctl\"},\n{ 157, \"prctl\"},\n{ 158, \"arch_prctl\"},\n{ 159, \"adjtimex\"},\n{ 160, \"setrlimit\"},\n{ 161, \"chroot\"},\n{ 162, \"sync\"},\n{ 163, \"acct\"},\n{ 164, \"settimeofday\"},\n{ 165, \"mount\"},\n{ 166, \"umount2\"},\n{ 167, \"swapon\"},\n{ 168, \"swapoff\"},\n{ 169, \"reboot\"},\n{ 170, \"sethostname\"},\n{ 171, \"setdomainname\"},\n{ 172, \"iopl\"},\n{ 173, \"ioperm\"},\n{ 174, \"create_module\"},\n{ 175, \"init_module\"},\n{ 176, \"delete_module\"},\n{ 177, \"get_kernel_syms\"},\n{ 178, \"query_module\"},\n{ 179, \"quotactl\"},\n{ 180, \"nfsservctl\"},\n{ 181, \"getpmsg\"},\n{ 182, \"putpmsg\"},\n{ 183, \"afs_syscall\"},\n{ 184, \"tuxcall\"},\n{ 185, \"security\"},\n{ 186, \"gettid\"},\n{ 187, \"readahead\"},\n{ 188, \"setxattr\"},\n{ 189, \"lsetxattr\"},\n{ 190, \"fsetxattr\"},\n{ 191, \"getxattr\"},\n{ 192, \"lgetxattr\"},\n{ 193, \"fgetxattr\"},\n{ 194, \"listxattr\"},\n{ 195, \"llistxattr\"},\n{ 196, \"flistxattr\"},\n{ 197, \"removexattr\"},\n{ 198, \"lremovexattr\"},\n{ 199, \"fremovexattr\"},\n{ 200, \"tkill\"},\n{ 201, \"time\"},\n{ 202, \"futex\"},\n{ 203, \"sched_setaffinity\"},\n{ 204, \"sched_getaffinity\"},\n{ 205, \"set_thread_area\"},\n{ 206, \"io_setup\"},\n{ 207, \"io_destroy\"},\n{ 208, \"io_getevents\"},\n{ 209, \"io_submit\"},\n{ 210, \"io_cancel\"},\n{ 211, \"get_thread_area\"},\n{ 212, \"lookup_dcookie\"},\n{ 213, \"epoll_create\"},\n{ 214, \"epoll_ctl_old\"},\n{ 215, \"epoll_wait_old\"},\n{ 216, \"remap_file_pages\"},\n{ 217, \"getdents64\"},\n{ 218, \"set_tid_address\"},\n{ 219, \"restart_syscall\"},\n{ 220, \"semtimedop\"},\n{ 221, \"fadvise64\"},\n{ 222, \"timer_create\"},\n{ 223, \"timer_settime\"},\n{ 224, \"timer_gettime\"},\n{ 225, \"timer_getoverrun\"},\n{ 226, \"timer_delete\"},\n{ 227, \"clock_settime\"},\n{ 228, \"clock_gettime\"},\n{ 229, \"clock_getres\"},\n{ 230, \"clock_nanosleep\"},\n{ 231, \"exit_group\"},\n{ 232, \"epoll_wait\"},\n{ 233, \"epoll_ctl\"},\n{ 234, \"tgkill\"},\n{ 235, \"utimes\"},\n{ 236, \"vserver\"},\n{ 237, \"mbind\"},\n{ 238, \"set_mempolicy\"},\n{ 239, \"get_mempolicy\"},\n{ 240, \"mq_open\"},\n{ 241, \"mq_unlink\"},\n{ 242, \"mq_timedsend\"},\n{ 243, \"mq_timedreceive\"},\n{ 244, \"mq_notify\"},\n{ 245, \"mq_getsetattr\"},\n{ 246, \"kexec_load\"},\n{ 247, \"waitid\"},\n{ 248, \"add_key\"},\n{ 249, \"request_key\"},\n{ 250, \"keyctl\"},\n{ 251, \"ioprio_set\"},\n{ 252, \"ioprio_get\"},\n{ 253, \"inotify_init\"},\n{ 254, \"inotify_add_watch\"},\n{ 255, \"inotify_rm_watch\"},\n{ 256, \"migrate_pages\"},\n{ 257, \"openat\"},\n{ 258, \"mkdirat\"},\n{ 259, \"mknodat\"},\n{ 260, \"fchownat\"},\n{ 261, \"futimesat\"},\n{ 262, \"newfstatat\"},\n{ 263, \"unlinkat\"},\n{ 264, \"renameat\"},\n{ 265, \"linkat\"},\n{ 266, \"symlinkat\"},\n{ 267, \"readlinkat\"},\n{ 268, \"fchmodat\"},\n{ 269, \"faccessat\"},\n{ 270, \"pselect6\"},\n{ 271, \"ppoll\"},\n{ 272, \"unshare\"},\n{ 273, \"set_robust_list\"},\n{ 274, \"get_robust_list\"},\n{ 275, \"splice\"},\n{ 276, \"tee\"},\n{ 277, \"sync_file_range\"},\n{ 278, \"vmsplice\"},\n{ 279, \"move_pages\"},\n{ 280, \"utimensat\"},\n{ 281, \"epoll_pwait\"},\n{ 282, \"signalfd\"},\n{ 283, \"timerfd_create\"},\n{ 284, \"eventfd\"},\n{ 285, \"fallocate\"},\n{ 286, \"timerfd_settime\"},\n{ 287, \"timerfd_gettime\"},\n{ 288, \"accept4\"},\n{ 289, \"signalfd4\"},\n{ 290, \"eventfd2\"},\n{ 291, \"epoll_create1\"},\n{ 292, \"dup3\"},\n{ 293, \"pipe2\"},\n{ 294, \"inotify_init1\"},\n{ 295, \"preadv\"},\n{ 296, \"pwritev\"},\n{ 297, \"rt_tgsigqueueinfo\"},\n{ 298, \"perf_event_open\"},\n{ 299, \"recvmmsg\"},\n{ 300, \"fanotify_init\"},\n{ 301, \"fanotify_mark\"},\n{ 302, \"prlimit64\"},\n{ 303, \"name_to_handle_at\"},\n{ 304, \"open_by_handle_at\"},\n{ 305, \"clock_adjtime\"},\n{ 306, \"syncfs\"},\n{ 307, \"sendmmsg\"},\n{ 308, \"setns\"},\n{ 309, \"getcpu\"},\n{ 310, \"process_vm_readv\"},\n{ 311, \"process_vm_writev\"},\n{ 312, \"kcmp\"},\n{ 313, \"finit_module\"},\n{ 314, \"sched_setattr\"},\n{ 315, \"sched_getattr\"},\n{ 316, \"renameat2\"},\n{ 317, \"seccomp\"},\n{ 318, \"getrandom\"},\n{ 319, \"memfd_create\"},\n{ 320, \"kexec_file_load\"},\n{ 321, \"bpf\"},\n{ 322, \"execveat\"},\n{ 323, \"userfaultfd\"},\n{ 324, \"membarrier\"},\n{ 325, \"mlock2\"},\n{ 326, \"copy_file_range\"},\n{ 327, \"preadv2\"},\n{ 328, \"pwritev2\"},\n{ 329, \"pkey_mprotect\"},\n{ 330, \"pkey_alloc\"},\n{ 331, \"pkey_free\"},\n{ 332, \"statx\"},\n{ 333, \"io_pgetevents\"},\n{ 334, \"rseq\"},"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Thread.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-64\n$end_info$\n*/\n\n#include \"LinuxSyscalls/SignalDelegator.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Thread.h\"\n\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/fextl/vector.h>\n\n#include <sched.h>\n#include <signal.h>\n#include <stddef.h>\n#include <syscall.h>\n#include <stdint.h>\n#include <unistd.h>\n\nnamespace FEX::HLE {\nuint64_t SyscallHandler::read_ldt(FEXCore::Core::CpuStateFrame* Frame, void* ptr, unsigned long bytecount) {\n  auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n\n  if (!Thread->ldt_entries) {\n    return 0;\n  }\n\n  bytecount = std::min(bytecount, MAX_LDT_ENTRIES * LDT_ENTRY_SIZE);\n  const auto EntriesToCopySize = std::min(bytecount, Thread->ldt_entry_count * LDT_ENTRY_SIZE);\n\n  if (FaultSafeUserMemAccess::CopyToUser(ptr, Thread->ldt_entries, EntriesToCopySize) != EntriesToCopySize) {\n    return -EFAULT;\n  }\n\n  // Quirk that if the number of bytes that the user is asking for is larger than the amount we have, then zero the remaining memory.\n  // This means the guest can't ever know the actual size of the LDT.\n  size_t RemainingSize = bytecount - EntriesToCopySize;\n  if (RemainingSize) {\n    void* remaining = alloca(RemainingSize);\n    memset(remaining, 0, RemainingSize);\n    if (FaultSafeUserMemAccess::CopyToUser(reinterpret_cast<uint8_t*>(ptr) + EntriesToCopySize, remaining, RemainingSize) != RemainingSize) {\n      return -EFAULT;\n    }\n  }\n\n  // Return the combined size of ldt entries and zero initialized range.\n  // I don't make the rules, it's just the weirdness that the kernel does.\n  return bytecount;\n}\n\nstatic uint64_t read_default_ldt(FEXCore::Core::CpuStateFrame* Frame, void* ptr, unsigned long bytecount) {\n  // This is some weird old legacy thing. Just returns zeroes up to 128-bytes.\n  uint8_t Data[128] {};\n  bytecount = std::min<uint64_t>(bytecount, sizeof(Data));\n\n  if (FaultSafeUserMemAccess::CopyToUser(ptr, Data, bytecount) != bytecount) {\n    return -EFAULT;\n  }\n\n  return bytecount;\n}\n\nuint64_t SyscallHandler::write_ldt(FEXCore::Core::CpuStateFrame* Frame, void* ptr, unsigned long bytecount, bool legacy) {\n  auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame);\n\n  struct user_desc_x64 {\n    uint32_t entry_number;\n    uint32_t base_addr;\n    uint32_t limit;\n    uint32_t seg_32bit       : 1;\n    uint32_t contents        : 2;\n    uint32_t read_exec_only  : 1;\n    uint32_t limit_in_pages  : 1;\n    uint32_t seg_not_present : 1;\n    uint32_t useable         : 1;\n    uint32_t lm              : 1;\n  };\n  static_assert(sizeof(user_desc_x64) == 16);\n\n  // `content` member variables.\n  constexpr static uint32_t MODIFY_LDT_CONTENTS_CONFORMING = 3;\n\n  if (bytecount != sizeof(user_desc_x64)) {\n    // Can only write a single ldt. Reject smaller and larger values.\n    return -EINVAL;\n  }\n\n  user_desc_x64 ldt_info {};\n  FEXCore::Core::CPUState::gdt_segment ldt {};\n\n  if (FaultSafeUserMemAccess::CopyFromUser(&ldt_info, ptr, sizeof(ldt_info)) == EFAULT) {\n    // Reject if we can't read it.\n    return -EFAULT;\n  }\n\n  if (ldt_info.entry_number > MAX_LDT_ENTRIES) {\n    return -EINVAL;\n  }\n\n  if (ldt_info.contents == MODIFY_LDT_CONTENTS_CONFORMING) {\n    // Conforming is mostly ignored.\n    // Legacy doesn't support it at all. Good.\n    if (legacy) {\n      return -EINVAL;\n    }\n    // Non-legacy ignores if only if the `seg_not_present` is set.\n    if (ldt_info.seg_not_present == 0) {\n      return -EINVAL;\n    }\n  }\n\n  auto is_empty = [](user_desc_x64 ldt_info, bool legacy) {\n    // Legacy empty is trivial.\n    const bool legacy_empty = legacy && ldt_info.base_addr == 0 && ldt_info.limit == 0;\n    if (legacy_empty) {\n      return true;\n    }\n\n    // Non-legacy is a bit more work.\n    return ldt_info.base_addr == 0 && ldt_info.limit == 0 && ldt_info.contents == 0 && ldt_info.read_exec_only == 1 &&\n           ldt_info.limit_in_pages == 0 && ldt_info.seg_not_present == 1 && ldt_info.useable == 0;\n  };\n\n  auto fill_ldt = [](FEXCore::Core::CPUState::gdt_segment& segment, user_desc_x64 ldt_info) {\n    FEXCore::Core::CPUState::SetGDTBase(&segment, ldt_info.base_addr);\n    FEXCore::Core::CPUState::SetGDTLimit(&segment, ldt_info.limit);\n\n    // Additional flags\n    // Type: bit [11:8]\n    // - bit[8]  - Accessed\n    // - bit[9]  - Readable\n    // - bit[10] - Conforming\n    // - bit[11]\n    //   - 1 - Code\n    //   - 0 - Data\n    segment.Type = ((ldt_info.read_exec_only ^ 1) << 1) | // Readable\n                   (ldt_info.contents << 2) |             // Code/Data+Conforming\n                   1;                                     // Accessed\n    // S: bit [12]\n    // - 0 (System descriptor)\n    // - 1 (User descriptor)\n    segment.S = 1;\n    // DPL: bit[14:13]\n    segment.DPL = 3;\n    // P: Present\n    segment.P = ldt_info.seg_not_present ^ 1;\n    // AVL: Available to software\n    segment.AVL = ldt_info.useable;\n    // L: Long-mode\n    // This doesn't allow setting 64-bit segments!\n    segment.L = 0;\n    // D: Default operand size\n    // - 0: 16-bit operand size\n    // - 1: 32-bit operand size\n    segment.D = ldt_info.seg_32bit;\n    // G: Granularity\n    segment.G = ldt_info.limit_in_pages;\n  };\n\n  if (is_empty(ldt_info, legacy)) {\n    // If the ldt_info is considered empty then this is a zeroing operation.\n    // Just use the zero ldt.\n  } else {\n    // This syscall only allows installing 32-bit segments. If `seg_32bit` isn't set then\n    // it assumes a 16-bit segment!\n    if (!ldt_info.seg_32bit) {\n      return -EINVAL;\n    }\n\n    fill_ldt(ldt, ldt_info);\n\n    if (legacy) {\n      // Legacy always zeros this.\n      ldt.AVL = 0;\n    }\n  }\n\n  // Need to be careful with ldt replacement here to ensure it is atomically visible.\n  auto old_ldt = Thread->ldt_entries;\n  auto old_ldt_entries = Thread->ldt_entry_count;\n\n  const auto new_ldt_count = std::max<size_t>(old_ldt_entries, ldt_info.entry_number + 1);\n  const auto new_ldt_size = new_ldt_count * LDT_ENTRY_SIZE;\n\n  const auto new_ldt_entries = reinterpret_cast<FEXCore::Core::CPUState::gdt_segment*>(\n    FEXCore::Allocator::mmap(nullptr, new_ldt_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));\n\n  FEXCore::Allocator::VirtualName(\"FEXMem_Misc\", reinterpret_cast<void*>(new_ldt_entries), new_ldt_size);\n\n  if (old_ldt) {\n    // Copy old entries if they existed.\n    memcpy(new_ldt_entries, old_ldt, old_ldt_entries * LDT_ENTRY_SIZE);\n  }\n\n  // Set new LDT.\n  new_ldt_entries[ldt_info.entry_number] = ldt;\n\n  // Set new LDT pointer.\n  Thread->ldt_entries = new_ldt_entries;\n  Thread->ldt_entry_count = new_ldt_count;\n\n  // Give the new LDT to CPUState.\n  Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_LDT] = new_ldt_entries;\n\n  if (old_ldt) {\n    FEXCore::Allocator::munmap(old_ldt, old_ldt_entries * LDT_ENTRY_SIZE);\n  }\n\n  return 0;\n}\n\n} // namespace FEX::HLE\n\nnamespace FEX::HLE::x64 {\nuint64_t SetThreadArea(FEXCore::Core::CpuStateFrame* Frame, void* tls) {\n  Frame->State.fs_cached = reinterpret_cast<uint64_t>(tls);\n  return 0;\n}\n\nvoid AdjustRipForNewThread(FEXCore::Core::CpuStateFrame* Frame) {\n  Frame->State.rip += 2;\n}\n\nenum Modify_ldt_func : int32_t {\n  LDT_READ = 0,\n  LDT_WRITE_LEGACY = 1,\n  LDT_READ_DEFAULT = 2,\n  LDT_WRITE = 0x11,\n};\n\nvoid RegisterThread(FEX::HLE::SyscallHandler* Handler) {\n  using namespace FEXCore::IR;\n  REGISTER_SYSCALL_IMPL_X64(modify_ldt, [](FEXCore::Core::CpuStateFrame* Frame, int func, void* ptr, unsigned long bytecount) -> uint64_t {\n    switch (func) {\n    case Modify_ldt_func::LDT_READ: return FEX::HLE::_SyscallHandler->read_ldt(Frame, ptr, bytecount);\n    case Modify_ldt_func::LDT_WRITE_LEGACY: return FEX::HLE::_SyscallHandler->write_ldt(Frame, ptr, bytecount, true);\n    case Modify_ldt_func::LDT_READ_DEFAULT: return read_default_ldt(Frame, ptr, bytecount);\n    case Modify_ldt_func::LDT_WRITE: return FEX::HLE::_SyscallHandler->write_ldt(Frame, ptr, bytecount, false);\n    default: return -ENOSYS;\n    }\n  });\n\n  REGISTER_SYSCALL_IMPL_X64(\n    clone, ([](FEXCore::Core::CpuStateFrame* Frame, uint32_t flags, void* stack, pid_t* parent_tid, pid_t* child_tid, void* tls) -> uint64_t {\n      // This is slightly different EFAULT behaviour, if child_tid or parent_tid is invalid then the kernel just doesn't write to the\n      // pointer. Still need to be EFAULT safe although.\n      if ((flags & (CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)) && child_tid) {\n        FaultSafeUserMemAccess::VerifyIsWritable(child_tid, sizeof(*child_tid));\n      }\n\n      if ((flags & CLONE_PARENT_SETTID) && parent_tid) {\n        FaultSafeUserMemAccess::VerifyIsWritable(parent_tid, sizeof(*parent_tid));\n      }\n\n      FEX::HLE::clone3_args args {\n        .Type = TypeOfClone::TYPE_CLONE2,\n        .args =\n          {\n\n            .flags = flags & ~CSIGNAL, // This no longer contains CSIGNAL\n            .pidfd = 0,                // For clone, pidfd is duplicated here\n            .child_tid = reinterpret_cast<uint64_t>(child_tid),\n            .parent_tid = reinterpret_cast<uint64_t>(parent_tid),\n            .exit_signal = flags & CSIGNAL,\n            .stack = reinterpret_cast<uint64_t>(stack),\n            .stack_size = 0, // This syscall isn't able to see the stack size\n            .tls = reinterpret_cast<uint64_t>(tls),\n            .set_tid = 0, // This syscall isn't able to select TIDs\n            .set_tid_size = 0,\n            .cgroup = 0, // This syscall can't select cgroups\n          },\n      };\n      return CloneHandler(Frame, &args);\n    }));\n\n  REGISTER_SYSCALL_IMPL_X64(sigaltstack, [](FEXCore::Core::CpuStateFrame* Frame, const stack_t* ss, stack_t* old_ss) -> uint64_t {\n    FaultSafeUserMemAccess::VerifyIsReadableOrNull(ss, sizeof(*ss));\n    FaultSafeUserMemAccess::VerifyIsWritableOrNull(old_ss, sizeof(*old_ss));\n    return FEX::HLE::_SyscallHandler->GetSignalDelegator()->RegisterGuestSigAltStack(\n      FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame), ss, old_ss);\n  });\n\n  // launch a new process under fex\n  // currently does not propagate argv[0] correctly\n  REGISTER_SYSCALL_IMPL_X64(execve, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, char* const argv[], char* const envp[]) -> uint64_t {\n    fextl::vector<const char*> Args;\n    fextl::vector<const char*> Envp;\n\n    if (argv) {\n      for (int i = 0; argv[i]; i++) {\n        Args.push_back(argv[i]);\n      }\n\n      Args.push_back(nullptr);\n    }\n\n    if (envp) {\n      for (int i = 0; envp[i]; i++) {\n        Envp.push_back(envp[i]);\n      }\n\n      Envp.push_back(nullptr);\n    }\n\n    auto* const* ArgsPtr = argv ? const_cast<char* const*>(Args.data()) : nullptr;\n    auto* const* EnvpPtr = envp ? const_cast<char* const*>(Envp.data()) : nullptr;\n\n    FEX::HLE::ExecveAtArgs AtArgs = FEX::HLE::ExecveAtArgs::Empty();\n\n    return FEX::HLE::ExecveHandler(Frame, pathname, ArgsPtr, EnvpPtr, AtArgs);\n  });\n\n  REGISTER_SYSCALL_IMPL_X64(execveat, ([](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, char* const argv[],\n                                          char* const envp[], int flags) -> uint64_t {\n                              fextl::vector<const char*> Args;\n                              fextl::vector<const char*> Envp;\n\n                              if (argv) {\n                                for (int i = 0; argv[i]; i++) {\n                                  Args.push_back(argv[i]);\n                                }\n\n                                Args.push_back(nullptr);\n                              }\n\n                              if (envp) {\n                                for (int i = 0; envp[i]; i++) {\n                                  Envp.push_back(envp[i]);\n                                }\n\n                                Envp.push_back(nullptr);\n                              }\n\n                              FEX::HLE::ExecveAtArgs AtArgs {\n                                .dirfd = dirfd,\n                                .flags = flags,\n                              };\n\n                              auto* const* ArgsPtr = argv ? const_cast<char* const*>(Args.data()) : nullptr;\n                              auto* const* EnvpPtr = envp ? const_cast<char* const*>(Envp.data()) : nullptr;\n                              return FEX::HLE::ExecveHandler(Frame, pathname, ArgsPtr, EnvpPtr, AtArgs);\n                            }));\n}\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Thread.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-64\n$end_info$\n*/\n\n#pragma once\n#include <stdint.h>\n\nnamespace FEXCore::Core {\nstruct CpuStateFrame;\n}\n\nnamespace FEX::HLE::x64 {\nuint64_t SetThreadArea(FEXCore::Core::CpuStateFrame* Frame, void* tls);\nvoid AdjustRipForNewThread(FEXCore::Core::CpuStateFrame* Frame);\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Time.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-64\n$end_info$\n*/\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/Types.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n\n#include <stddef.h>\n#include <stdint.h>\n#include <time.h>\n#include <sys/syscall.h>\n#include <sys/time.h>\n#include <sys/times.h>\n#include <sys/timex.h>\n#include <unistd.h>\n#include <utime.h>\n\nnamespace FEX::HLE::x64 {\nvoid RegisterTime(FEX::HLE::SyscallHandler* Handler) {\n  using namespace FEXCore::IR;\n  REGISTER_SYSCALL_IMPL_X64(time, [](FEXCore::Core::CpuStateFrame* Frame, time_t* tloc) -> uint64_t {\n    FaultSafeUserMemAccess::VerifyIsWritableOrNull(tloc, sizeof(time_t));\n    uint64_t Result = ::time(tloc);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X64(utime, [](FEXCore::Core::CpuStateFrame* Frame, const char* filename, const struct utimbuf* times) -> uint64_t {\n    FaultSafeUserMemAccess::VerifyIsStringReadable(filename);\n    FaultSafeUserMemAccess::VerifyIsReadableOrNull(times, sizeof(utimbuf));\n    uint64_t Result = ::utime(filename, times);\n    SYSCALL_ERRNO();\n  });\n\n  REGISTER_SYSCALL_IMPL_X64(utimes, [](FEXCore::Core::CpuStateFrame* Frame, const char* filename, const struct timeval times[2]) -> uint64_t {\n    FaultSafeUserMemAccess::VerifyIsStringReadable(filename);\n    FaultSafeUserMemAccess::VerifyIsReadableOrNull(times, sizeof(timeval) * 2);\n    uint64_t Result = ::utimes(filename, times);\n    SYSCALL_ERRNO();\n  });\n}\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Types.h",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: LinuxSyscalls|syscalls-x86-64\n$end_info$\n*/\n\n#pragma once\n\n#include \"LinuxSyscalls/Types.h\"\n#include <FEXCore/Utils/CompilerDefs.h>\n\n#include <linux/types.h>\n#include <asm/ipcbuf.h>\n#include <asm/posix_types.h>\n#include <asm/sembuf.h>\n#include <cstdint>\n#include <sys/stat.h>\n#include <type_traits>\n\nnamespace FEX::HLE::x64 {\nusing kernel_old_time_t = int64_t;\nusing kernel_ulong_t = uint64_t;\nusing __time_t = time_t;\n\nstruct ipc_perm_64 {\n  uint32_t key;\n  uint32_t uid;\n  uint32_t gid;\n  uint32_t cuid;\n  uint32_t cgid;\n  uint16_t mode;\n  uint16_t _pad1;\n  uint16_t seq;\n  uint16_t _pad2;\n  kernel_ulong_t _pad[2];\n\n  ipc_perm_64() = delete;\n\n  operator struct ipc64_perm() const {\n    struct ipc64_perm perm {};\n    perm.key = key;\n    perm.uid = uid;\n    perm.gid = gid;\n    perm.cuid = cuid;\n    perm.cgid = cgid;\n    perm.mode = mode;\n    perm.seq = seq;\n    return perm;\n  }\n\n  ipc_perm_64(struct ipc64_perm perm) {\n    key = perm.key;\n    uid = perm.uid;\n    gid = perm.gid;\n    cuid = perm.cuid;\n    cgid = perm.cgid;\n    mode = perm.mode;\n    seq = perm.seq;\n    _pad1 = _pad2 = 0;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<ipc_perm_64>);\nstatic_assert(sizeof(ipc_perm_64) == 48);\n\n// Matches the definition x86/include/uapi/asm/sembuf.h\nstruct FEX_ANNOTATE(\"alias-x86_64-semid64_ds\") FEX_ANNOTATE(\"fex-match\") semid_ds_64 {\n  FEX::HLE::x64::ipc_perm_64 sem_perm;\n  time_t sem_otime;\n  uint64_t __unused1;\n  time_t sem_ctime;\n  uint64_t __unused2;\n  uint64_t sem_nsems;\n  uint64_t __unused3;\n  uint64_t __unused4;\n\n  semid_ds_64() = delete;\n\n  operator struct semid64_ds() const {\n    struct semid64_ds buf {};\n    buf.sem_perm = sem_perm;\n\n    buf.sem_otime = sem_otime;\n    buf.sem_ctime = sem_ctime;\n    buf.sem_nsems = sem_nsems;\n    return buf;\n  }\n\n  semid_ds_64(struct semid64_ds buf)\n    : sem_perm {buf.sem_perm} {\n    sem_otime = buf.sem_otime;\n    sem_ctime = buf.sem_ctime;\n    sem_nsems = buf.sem_nsems;\n  }\n};\n\nstatic_assert(std::is_trivially_copyable_v<FEX::HLE::x64::semid_ds_64>);\nstatic_assert(sizeof(FEX::HLE::x64::semid_ds_64) == 104);\n\nunion semun {\n  int val;\n  FEX::HLE::x64::semid_ds_64* buf;\n  unsigned short* array;\n  struct fex_seminfo* __buf;\n  void* __pad;\n};\n\nstatic_assert(std::is_trivially_copyable_v<FEX::HLE::x64::semun>);\nstatic_assert(sizeof(FEX::HLE::x64::semun) == 8);\n\nstruct FEX_ANNOTATE(\"fex-match\") FEX_PACKED guest_stat {\n  uint64_t st_dev;\n  uint64_t st_ino;\n  uint64_t st_nlink;\n\n  unsigned int st_mode;\n  unsigned int st_uid;\n  unsigned int st_gid;\n  unsigned int __pad0;\n  uint64_t st_rdev;\n  int64_t st_size;\n  int64_t st_blksize;\n  int64_t st_blocks; /* Number 512-byte blocks allocated. */\n\n  uint64_t st_atime_;\n  uint64_t fex_st_atime_nsec;\n  uint64_t st_mtime_;\n  uint64_t fex_st_mtime_nsec;\n  uint64_t st_ctime_;\n  uint64_t fex_st_ctime_nsec;\n  int64_t unused[3];\n\n  guest_stat() = delete;\n  operator struct stat() const {\n    struct stat val {};\n#define COPY(x) val.x = x\n    COPY(st_dev);\n    COPY(st_ino);\n    COPY(st_nlink);\n\n    COPY(st_mode);\n    COPY(st_uid);\n    COPY(st_gid);\n\n    COPY(st_rdev);\n    COPY(st_size);\n    COPY(st_blksize);\n    COPY(st_blocks);\n\n    val.st_atim.tv_sec = st_atime_;\n    val.st_atim.tv_nsec = fex_st_atime_nsec;\n\n    val.st_mtim.tv_sec = st_mtime_;\n    val.st_mtim.tv_nsec = fex_st_mtime_nsec;\n\n    val.st_ctim.tv_sec = st_ctime_;\n    val.st_ctim.tv_nsec = fex_st_ctime_nsec;\n#undef COPY\n    return val;\n  }\n\n  guest_stat(struct stat val) {\n#define COPY(x) x = val.x\n    COPY(st_dev);\n    COPY(st_ino);\n    COPY(st_nlink);\n\n    COPY(st_mode);\n    COPY(st_uid);\n    COPY(st_gid);\n\n    COPY(st_rdev);\n    COPY(st_size);\n    COPY(st_blksize);\n    COPY(st_blocks);\n\n    st_atime_ = val.st_atim.tv_sec;\n    fex_st_atime_nsec = val.st_atim.tv_nsec;\n\n    st_mtime_ = val.st_mtime;\n    fex_st_mtime_nsec = val.st_mtim.tv_nsec;\n\n    st_ctime_ = val.st_ctime;\n    fex_st_ctime_nsec = val.st_ctim.tv_nsec;\n#undef COPY\n    __pad0 = 0;\n  }\n};\n\n// Original definition in `arch/x86/include/uapi/asm/stat.h` for future excavation\nstatic_assert(std::is_trivially_copyable_v<FEX::HLE::x64::guest_stat>);\nstatic_assert(sizeof(FEX::HLE::x64::guest_stat) == 144);\n\n// There is no public definition of this struct\n// Matches the definition of `struct linux_dirent` in fs/readdir.c\nstruct FEX_ANNOTATE(\"fex-match\") linux_dirent {\n  uint64_t d_ino;\n  uint64_t d_off;\n  uint16_t d_reclen;\n  char d_name[1];\n  /* Has hidden null character and d_type */\n};\nstatic_assert(std::is_trivially_copyable_v<linux_dirent>);\nstatic_assert(offsetof(linux_dirent, d_ino) == 0);\nstatic_assert(offsetof(linux_dirent, d_off) == 8);\nstatic_assert(offsetof(linux_dirent, d_reclen) == 16);\nstatic_assert(offsetof(linux_dirent, d_name) == 18);\nstatic_assert(sizeof(linux_dirent) == 24);\n\n// There is no public definition of this struct\n// Matches the definition of `struct linux_dirent64` in include/linux/dirent.h\nstruct FEX_ANNOTATE(\"fex-match\") FEX_PACKED linux_dirent_64 {\n  uint64_t d_ino;\n  uint64_t d_off;\n  uint16_t d_reclen;\n  uint8_t d_type;\n  char d_name[];\n};\nstatic_assert(std::is_trivially_copyable_v<linux_dirent_64>);\nstatic_assert(sizeof(linux_dirent_64) == 19);\n} // namespace FEX::HLE::x64\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/Thunks.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\nmeta: glue|thunks ~ FEXCore side of thunks: Registration, Lookup\ntags: glue|thunks\n$end_info$\n*/\n\n#include \"Thunks.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/ThreadManager.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Core/Thunks.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/fextl/set.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/unordered_map.h>\n\n#include <cstdint>\n#include <dlfcn.h>\n\n#include <malloc.h>\n#include <mutex>\n#include <shared_mutex>\n#include <stdint.h>\n#include <utility>\n\n#ifdef ENABLE_JEMALLOC_GLIBC\nextern \"C\" {\n// jemalloc defines nothrow on its internal C function signatures.\n#define JEMALLOC_NOTHROW __attribute__((nothrow))\n// Forward declare jemalloc functions because we can't include the headers from the glibc jemalloc project.\n// This is because we can't simultaneously set up include paths for both of our internal jemalloc modules.\nFEX_DEFAULT_VISIBILITY JEMALLOC_NOTHROW extern int glibc_je_is_known_allocation(void* ptr);\n}\n#endif\n\nstatic __attribute__((aligned(16), naked, section(\"HostToGuestTrampolineTemplate\"))) void HostToGuestTrampolineTemplate() {\n#if defined(ARCHITECTURE_x86_64)\n  asm(\"lea 0f(%rip), %r11 \\n\"\n      \"jmpq *0f(%rip) \\n\"\n      \".align 8 \\n\"\n      \"0: \\n\"\n      \".quad 0, 0, 0, 0 \\n\" // TrampolineInstanceInfo\n  );\n#elif defined(ARCHITECTURE_arm64)\n  asm(\n    // x11 is part of the custom ABI and needs to point to the TrampolineInstanceInfo.\n    \"ldr x16, 0f \\n\"\n    \"adr x11, 0f \\n\"\n    \"br x16 \\n\"\n    // Manually align to the next 8-byte boundary\n    // NOTE: GCC over-aligns to a full page when using .align directives on ARM (last tested on GCC 11.2)\n    \"nop \\n\"\n    \"0: \\n\"\n    \".quad 0, 0, 0, 0 \\n\" // TrampolineInstanceInfo\n  );\n#else\n#error Unsupported host architecture\n#endif\n}\n\nextern char __start_HostToGuestTrampolineTemplate[];\nextern char __stop_HostToGuestTrampolineTemplate[];\n\nnamespace FEX::HLE {\n\nstatic thread_local FEX::HLE::ThreadStateObject* ThreadObject {};\n\nstruct TrampolineInstanceInfo {\n  void* HostPacker;\n  uintptr_t CallCallback;\n  uintptr_t GuestUnpacker;\n  uintptr_t GuestTarget;\n};\n\n// Opaque type pointing to an instance of HostToGuestTrampolineTemplate and its\n// embedded TrampolineInstanceInfo\nstruct HostToGuestTrampolinePtr;\n\nstatic TrampolineInstanceInfo& GetInstanceInfo(HostToGuestTrampolinePtr* Trampoline) {\n  const auto Length = __stop_HostToGuestTrampolineTemplate - __start_HostToGuestTrampolineTemplate;\n  const auto InstanceInfoOffset = Length - sizeof(TrampolineInstanceInfo);\n  return *reinterpret_cast<TrampolineInstanceInfo*>(reinterpret_cast<char*>(Trampoline) + InstanceInfoOffset);\n}\n\nstruct GuestcallInfo {\n  uintptr_t GuestUnpacker;\n  uintptr_t GuestTarget;\n\n  bool operator==(const GuestcallInfo&) const noexcept = default;\n};\n\nstruct GuestcallInfoHash {\n  size_t operator()(const GuestcallInfo& x) const noexcept {\n    // Hash only the target address, which is generally unique.\n    // For the unlikely case of a hash collision, fextl::unordered_map still picks the correct bucket entry.\n    return std::hash<uintptr_t> {}(x.GuestTarget);\n  }\n};\n\nnamespace ThunkFunctions {\n  void LoadLib(void* ArgsV);\n  void IsLibLoaded(void* ArgsRV);\n  void IsHostHeapAllocation(void* ArgsRV);\n  void LinkAddressToGuestFunction(void* argsv);\n  void AllocateHostTrampolineForGuestFunction(void* ArgsRV);\n} // namespace ThunkFunctions\n\nstruct ThunkHandler_impl final : public FEX::HLE::ThunkHandler {\n  std::shared_mutex ThunksMutex;\n\n  // Can't be a string_view. We need to keep a copy of the library name in-case string_view pointer goes away.\n  // Ideally we track when a library has been unloaded and remove it from this set before the memory backing goes away.\n  fextl::set<fextl::string> Libs;\n\n  fextl::unordered_map<GuestcallInfo, HostToGuestTrampolinePtr*, GuestcallInfoHash> GuestcallToHostTrampoline;\n\n  uint8_t* HostTrampolineInstanceDataPtr;\n  size_t HostTrampolineInstanceDataAvailable = 0;\n\n  /*\n      Set arg0/1 to arg regs, use CTX::HandleCallback to handle the callback\n  */\n  static void CallCallback(void* callback, void* arg0, void* arg1) {\n    if (!ThreadObject) {\n      ERROR_AND_DIE_FMT(\"Thunked library attempted to invoke guest callback asynchronously\");\n    }\n\n    auto CTX = static_cast<FEXCore::Context::Context*>(ThreadObject->Thread->CTX);\n    auto ThunkHandler = reinterpret_cast<ThunkHandler_impl*>(FEX::HLE::_SyscallHandler->GetThunkHandler());\n\n    if (ThunkHandler->Is64BitMode()) {\n      ThreadObject->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RDI] = (uintptr_t)arg0;\n      ThreadObject->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RSI] = (uintptr_t)arg1;\n    } else {\n      if ((reinterpret_cast<uintptr_t>(arg1) >> 32) != 0) {\n        ERROR_AND_DIE_FMT(\"Tried to call guest function with arguments packed to a 64-bit address\");\n      }\n      ThreadObject->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RCX] = (uintptr_t)arg0;\n      ThreadObject->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RDX] = (uintptr_t)arg1;\n    }\n\n    CTX->HandleCallback(ThreadObject->Thread, (uintptr_t)callback);\n  }\n\n  FEXCore::ThunkedFunction* LookupThunk(const FEXCore::IR::SHA256Sum& sha256) override {\n\n    std::shared_lock lk(ThunksMutex);\n\n    auto it = Thunks.find(sha256);\n\n    if (it != Thunks.end()) {\n      return it->second;\n    } else {\n      return nullptr;\n    }\n  }\n\n  void RegisterTLSState(FEX::HLE::ThreadStateObject* _ThreadObject) override {\n    ThreadObject = _ThreadObject;\n  }\n\n  void AppendThunkDefinitions(std::span<const FEXCore::IR::ThunkDefinition> Definitions) override {\n    for (auto& Definition : Definitions) {\n      Thunks.emplace(Definition.Sum, Definition.ThunkFunction);\n    }\n  }\n\n  void LoadLib(std::string_view Name);\n\nprivate:\n  // Bits in a SHA256 sum are already randomly distributed, so truncation yields a suitable hash function\n  struct TruncatingSHA256Hash {\n    size_t operator()(const FEXCore::IR::SHA256Sum& SHA256Sum) const noexcept {\n      return (const size_t&)SHA256Sum;\n    }\n  };\n\n  fextl::unordered_map<FEXCore::IR::SHA256Sum, FEXCore::ThunkedFunction*, TruncatingSHA256Hash> Thunks = {\n    {// sha256(fex:loadlib)\n     {0x27, 0x7e, 0xb7, 0x69, 0x5b, 0xe9, 0xab, 0x12, 0x6e, 0xf7, 0x85, 0x9d, 0x4b, 0xc9, 0xa2, 0x44,\n      0x46, 0xcf, 0xbd, 0xb5, 0x87, 0x43, 0xef, 0x28, 0xa2, 0x65, 0xba, 0xfc, 0x89, 0x0f, 0x77, 0x80},\n     &ThunkFunctions::LoadLib},\n    {// sha256(fex:is_lib_loaded)\n     {0xee, 0x57, 0xba, 0x0c, 0x5f, 0x6e, 0xef, 0x2a, 0x8c, 0xb5, 0x19, 0x81, 0xc9, 0x23, 0xe6, 0x51,\n      0xae, 0x65, 0x02, 0x8f, 0x2b, 0x5d, 0x59, 0x90, 0x6a, 0x7e, 0xe2, 0xe7, 0x1c, 0x33, 0x8a, 0xff},\n     &ThunkFunctions::IsLibLoaded},\n    {// sha256(fex:is_host_heap_allocation)\n     {0xf5, 0x77, 0x68, 0x43, 0xbb, 0x6b, 0x28, 0x18, 0x40, 0xb0, 0xdb, 0x8a, 0x66, 0xfb, 0x0e, 0x2d,\n      0x98, 0xc2, 0xad, 0xe2, 0x5a, 0x18, 0x5a, 0x37, 0x2e, 0x13, 0xc9, 0xe7, 0xb9, 0x8c, 0xa9, 0x3e},\n     &ThunkFunctions::IsHostHeapAllocation},\n    {// sha256(fex:link_address_to_function)\n     {0xe6, 0xa8, 0xec, 0x1c, 0x7b, 0x74, 0x35, 0x27, 0xe9, 0x4f, 0x5b, 0x6e, 0x2d, 0xc9, 0xa0, 0x27,\n      0xd6, 0x1f, 0x2b, 0x87, 0x8f, 0x2d, 0x35, 0x50, 0xea, 0x16, 0xb8, 0xc4, 0x5e, 0x42, 0xfd, 0x77},\n     &ThunkFunctions::LinkAddressToGuestFunction},\n    {// sha256(fex:allocate_host_trampoline_for_guest_function)\n     {0x9b, 0xb2, 0xf4, 0xb4, 0x83, 0x7d, 0x28, 0x93, 0x40, 0xcb, 0xf4, 0x7a, 0x0b, 0x47, 0x85, 0x87,\n      0xf9, 0xbc, 0xb5, 0x27, 0xca, 0xa6, 0x93, 0xa5, 0xc0, 0x73, 0x27, 0x24, 0xae, 0xc8, 0xb8, 0x5a},\n     &ThunkFunctions::AllocateHostTrampolineForGuestFunction},\n  };\n\n  FEX_CONFIG_OPT(Is64BitMode, IS64BIT_MODE);\n  FEX_CONFIG_OPT(ThunkHostLibsPath, THUNKHOSTLIBS);\n};\n\nvoid ThunkHandler_impl::LoadLib(std::string_view Name) {\n  auto SOName = ThunkHostLibsPath();\n  while (SOName.ends_with('/')) {\n    SOName.pop_back();\n  }\n  SOName = fmt::format(\"{}{}/{}-host.so\", SOName, (Is64BitMode() ? \"\" : \"_32\"), Name);\n\n  LogMan::Msg::DFmt(\"LoadLib: {} -> {}\", Name, SOName);\n\n  auto Handle = dlopen(SOName.c_str(), RTLD_LOCAL | RTLD_NOW);\n  if (!Handle) {\n    ERROR_AND_DIE_FMT(\"LoadLib: Failed to dlopen thunk library {}: {}\", SOName, dlerror());\n  }\n\n  // Library names often include dashes, which may not be used in C++ identifiers.\n  // They are replaced with underscores hence.\n  auto InitSym = \"fexthunks_exports_\" + fextl::string {Name};\n  std::replace(InitSym.begin(), InitSym.end(), '-', '_');\n\n  struct ExportEntry {\n    uint8_t* sha256;\n    FEXCore::ThunkedFunction* Fn;\n  };\n\n  ExportEntry* (*InitFN)();\n  (void*&)InitFN = dlsym(Handle, InitSym.c_str());\n  if (!InitFN) {\n    ERROR_AND_DIE_FMT(\"LoadLib: Failed to find export {}\", InitSym);\n  }\n\n  auto Exports = InitFN();\n  if (!Exports) {\n    ERROR_AND_DIE_FMT(\"LoadLib: Failed to initialize thunk library {}. \"\n                      \"Check if the corresponding host library is installed \"\n                      \"or disable thunking of this library.\",\n                      Name);\n  }\n\n  {\n    std::lock_guard lk(ThunksMutex);\n\n    Libs.insert(fextl::string {Name});\n\n    int i;\n    for (i = 0; Exports[i].sha256; i++) {\n      Thunks[*reinterpret_cast<FEXCore::IR::SHA256Sum*>(Exports[i].sha256)] = Exports[i].Fn;\n    }\n\n    LogMan::Msg::DFmt(\"Loaded {} syms\", i);\n  }\n}\n\n/**\n * Generates a host-callable trampoline to call guest functions via the host ABI.\n *\n * This trampoline uses the same calling convention as the given HostPacker. Trampolines\n * are cached, so it's safe to call this function repeatedly on the same arguments without\n * leaking memory.\n *\n * Invoking the returned trampoline has the effect of:\n * - packing the arguments (using the HostPacker identified by its SHA256)\n * - performing a host->guest transition\n * - unpacking the arguments via GuestUnpacker\n * - calling the function at GuestTarget\n *\n * The primary use case of this is ensuring that guest function pointers (\"callbacks\")\n * passed to thunked APIs can safely be called by the native host library.\n *\n * Returns a pointer to the generated host trampoline and its TrampolineInstanceInfo.\n *\n * If HostPacker is zero, the trampoline will be partially initialized and needs to be\n * finalized with a call to FinalizeHostTrampolineForGuestFunction. A typical use case\n * is to allocate the trampoline for a given GuestTarget/GuestUnpacker on the guest-side,\n * and provide the HostPacker host-side.\n */\nFEX_DEFAULT_VISIBILITY HostToGuestTrampolinePtr*\nMakeHostTrampolineForGuestFunction(void* HostPacker, uintptr_t GuestTarget, uintptr_t GuestUnpacker) {\n  LOGMAN_THROW_A_FMT(GuestTarget, \"Tried to create host-trampoline to null pointer guest function\");\n\n  const auto ThunkHandler = reinterpret_cast<ThunkHandler_impl*>(FEX::HLE::_SyscallHandler->GetThunkHandler());\n\n  const GuestcallInfo gci = {GuestUnpacker, GuestTarget};\n\n  // Try first with shared_lock\n  {\n    std::shared_lock lk(ThunkHandler->ThunksMutex);\n\n    auto found = ThunkHandler->GuestcallToHostTrampoline.find(gci);\n    if (found != ThunkHandler->GuestcallToHostTrampoline.end()) {\n      return found->second;\n    }\n  }\n\n  std::lock_guard lk(ThunkHandler->ThunksMutex);\n\n  // Retry lookup with full lock before making a new trampoline to avoid double trampolines\n  {\n    auto found = ThunkHandler->GuestcallToHostTrampoline.find(gci);\n    if (found != ThunkHandler->GuestcallToHostTrampoline.end()) {\n      return found->second;\n    }\n  }\n\n  LogMan::Msg::DFmt(\"Thunks: Adding host trampoline for guest function {:#x} via unpacker {:#x}\", GuestTarget, GuestUnpacker);\n\n  const auto HostToGuestTrampolineSize = __stop_HostToGuestTrampolineTemplate - __start_HostToGuestTrampolineTemplate;\n\n  if (ThunkHandler->HostTrampolineInstanceDataAvailable < HostToGuestTrampolineSize) {\n    const auto allocation_step = 16 * 1024;\n    ThunkHandler->HostTrampolineInstanceDataAvailable = allocation_step;\n    ThunkHandler->HostTrampolineInstanceDataPtr = (uint8_t*)mmap(0, ThunkHandler->HostTrampolineInstanceDataAvailable,\n                                                                 PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n\n    LOGMAN_THROW_A_FMT(ThunkHandler->HostTrampolineInstanceDataPtr != MAP_FAILED, \"Failed to mmap HostTrampolineInstanceDataPtr\");\n  }\n\n  auto HostTrampoline = reinterpret_cast<HostToGuestTrampolinePtr*>(ThunkHandler->HostTrampolineInstanceDataPtr);\n  ThunkHandler->HostTrampolineInstanceDataAvailable -= HostToGuestTrampolineSize;\n  ThunkHandler->HostTrampolineInstanceDataPtr += HostToGuestTrampolineSize;\n  memcpy(HostTrampoline, (void*)&HostToGuestTrampolineTemplate, HostToGuestTrampolineSize);\n  GetInstanceInfo(HostTrampoline) = TrampolineInstanceInfo {\n    .HostPacker = HostPacker, .CallCallback = (uintptr_t)&ThunkHandler_impl::CallCallback, .GuestUnpacker = GuestUnpacker, .GuestTarget = GuestTarget};\n\n  ThunkHandler->GuestcallToHostTrampoline[gci] = HostTrampoline;\n  return HostTrampoline;\n}\n\nFEX_DEFAULT_VISIBILITY void FinalizeHostTrampolineForGuestFunction(HostToGuestTrampolinePtr* TrampolineAddress, void* HostPacker) {\n  if (TrampolineAddress == nullptr) {\n    return;\n  }\n\n  auto& Trampoline = GetInstanceInfo(TrampolineAddress);\n\n  LOGMAN_THROW_A_FMT(Trampoline.CallCallback == (uintptr_t)&ThunkHandler_impl::CallCallback, \"Invalid trampoline at {} passed to {}\",\n                     fmt::ptr(TrampolineAddress), __FUNCTION__);\n\n  if (!Trampoline.HostPacker) {\n    LogMan::Msg::DFmt(\"Thunks: Finalizing trampoline at {} with host packer {}\", fmt::ptr(TrampolineAddress), fmt::ptr(HostPacker));\n    Trampoline.HostPacker = HostPacker;\n  }\n}\n\nnamespace ThunkFunctions {\n  void LoadLib(void* ArgsV) {\n    struct LoadlibArgs {\n      const char* Name;\n    };\n\n    auto Args = reinterpret_cast<LoadlibArgs*>(ArgsV);\n    auto ThunkHandler = reinterpret_cast<ThunkHandler_impl*>(FEX::HLE::_SyscallHandler->GetThunkHandler());\n\n    ThunkHandler->LoadLib(Args->Name);\n  }\n\n  void IsLibLoaded(void* ArgsRV) {\n    struct ArgsRV_t {\n      const char* Name;\n      bool rv;\n    };\n\n    auto& [Name, rv] = *reinterpret_cast<ArgsRV_t*>(ArgsRV);\n    auto ThunkHandler = reinterpret_cast<ThunkHandler_impl*>(FEX::HLE::_SyscallHandler->GetThunkHandler());\n\n    {\n      std::shared_lock lk(ThunkHandler->ThunksMutex);\n      rv = ThunkHandler->Libs.contains(Name);\n    }\n  }\n\n  /**\n   * Checks if the given pointer is allocated on the host heap.\n   *\n   * This is useful for thunking APIs that need to work with both guest\n   * and host heap pointers.\n   */\n  void IsHostHeapAllocation(void* ArgsRV) {\n#ifdef ENABLE_JEMALLOC_GLIBC\n    struct ArgsRV_t {\n      void* ptr;\n      bool rv;\n    }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n    args->rv = glibc_je_is_known_allocation(args->ptr);\n#else\n    // Thunks usage without jemalloc isn't supported\n    ERROR_AND_DIE_FMT(\"Unsupported: Thunks querying for host heap allocation information\");\n#endif\n  }\n\n  /**\n   * Instructs the Core to redirect calls to functions at the given\n   * address to another function. The original callee address is passed\n   * to the target function through an implicit argument stored in r11.\n   *\n   * For 32-bit the implicit argument is stored in the lower 32-bits of mm0.\n   *\n   * The primary use case of this is ensuring that host function pointers\n   * returned from thunked APIs can safely be called by the guest.\n   */\n  void LinkAddressToGuestFunction(void* argsv) {\n    struct args_t {\n      uintptr_t original_callee;\n      uintptr_t target_addr; // Guest function to call when branching to original_callee\n    };\n\n    auto args = reinterpret_cast<args_t*>(argsv);\n    auto CTX = static_cast<FEXCore::Context::Context*>(ThreadObject->Thread->CTX);\n    CTX->AddThunkTrampolineIRHandler(args->original_callee, args->target_addr);\n  }\n\n  /**\n   * Guest-side helper to initiate creation of a host trampoline for\n   * calling guest functions. This must be followed by a host-side call\n   * to FinalizeHostTrampolineForGuestFunction to make the trampoline\n   * usable.\n   *\n   * This two-step initialization is equivalent to a host-side call to\n   * MakeHostTrampolineForGuestFunction. The split is needed if the\n   * host doesn't have all information needed to create the trampoline\n   * on its own.\n   */\n  void AllocateHostTrampolineForGuestFunction(void* ArgsRV) {\n    struct ArgsRV_t {\n      uintptr_t GuestUnpacker;\n      uintptr_t GuestTarget;\n      uintptr_t rv; // Pointer to host trampoline + TrampolineInstanceInfo\n    }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n    args->rv = (uintptr_t)MakeHostTrampolineForGuestFunction(nullptr, args->GuestTarget, args->GuestUnpacker);\n  }\n} // namespace ThunkFunctions\n\nFEX_DEFAULT_VISIBILITY void* GetGuestStack() {\n  if (!ThreadObject) {\n    ERROR_AND_DIE_FMT(\"Thunked library attempted to query guest stack pointer asynchronously\");\n  }\n\n  return (void*)(uintptr_t)((ThreadObject->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RSP]));\n}\n\nFEX_DEFAULT_VISIBILITY void MoveGuestStack(uintptr_t NewAddress) {\n  if (!ThreadObject) {\n    ERROR_AND_DIE_FMT(\"Thunked library attempted to query guest stack pointer asynchronously\");\n  }\n\n  if (NewAddress >> 32) {\n    ERROR_AND_DIE_FMT(\"Tried to set stack pointer for 32-bit guest to a 64-bit address\");\n  }\n\n  ThreadObject->Thread->CurrentFrame->State.gregs[FEXCore::X86State::REG_RSP] = NewAddress;\n}\n\nfextl::unique_ptr<ThunkHandler> CreateThunkHandler() {\n  return fextl::make_unique<ThunkHandler_impl>();\n}\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/Thunks.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Core/Thunks.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/IR/IR.h>\n\n#include <span>\n\nnamespace FEX::HLE {\nstruct ThreadStateObject;\n\nclass ThunkHandler : public FEXCore::ThunkHandler {\npublic:\n  virtual void RegisterTLSState(FEX::HLE::ThreadStateObject* ThreadObject) = 0;\n  /**\n   * @brief Allows the frontend to register its own thunk handlers independent of what is controlled in the backend.\n   *\n   * @param CTX A valid non-null context instance.\n   * @param Definitions A vector of thunk definitions that the frontend controls\n   */\n  virtual void AppendThunkDefinitions(std::span<const FEXCore::IR::ThunkDefinition> Definitions) = 0;\n};\nfextl::unique_ptr<ThunkHandler> CreateThunkHandler();\n} // namespace FEX::HLE\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/VDSO_Emulation.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"VDSO_Emulation.h\"\n\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Types.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/IR/IR.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/SignalScopeGuards.h>\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/map.h>\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <array>\n#include <dlfcn.h>\n#include <elf.h>\n#include <fcntl.h>\n#include <filesystem>\n#include <sys/auxv.h>\n#include <sys/mman.h>\n#include <sys/time.h>\n#include <unistd.h>\n\nnamespace FEX::VDSO {\nVDSOEntrypoints VDSOPointers {};\nnamespace VDSOHandlers {\n  using TimeType = decltype(::time)*;\n  using GetTimeOfDayType = decltype(::gettimeofday)*;\n  using ClockGetTimeType = decltype(::clock_gettime)*;\n  using ClockGetResType = decltype(::clock_getres)*;\n  using GetCPUType = decltype(FHU::Syscalls::getcpu)*;\n  using GetRandomType = ssize_t (*)(void*, size_t, uint32_t, void*, size_t);\n\n  TimeType TimePtr;\n  GetTimeOfDayType GetTimeOfDayPtr;\n  ClockGetTimeType ClockGetTimePtr;\n  ClockGetResType ClockGetResPtr;\n  GetCPUType GetCPUPtr;\n  GetRandomType GetRandomPtr;\n} // namespace VDSOHandlers\n\nusing HandlerPtr = void (*)(void*);\nnamespace x64 {\n  static uint64_t SyscallRet(uint64_t Result) {\n    if (Result == -1) {\n      return -errno;\n    }\n    return Result;\n  }\n  // glibc handlers\n  namespace glibc {\n    static void time(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        time_t* a_0;\n        uint64_t rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      uint64_t Result = ::time(args->a_0);\n      args->rv = SyscallRet(Result);\n    }\n\n    static void gettimeofday(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        struct timeval* tv;\n        struct timezone* tz;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      int Result = ::gettimeofday(args->tv, args->tz);\n      args->rv = SyscallRet(Result);\n    }\n\n    static void clock_gettime(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        clockid_t clk_id;\n        struct timespec* tp;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      int Result = ::clock_gettime(args->clk_id, args->tp);\n      args->rv = SyscallRet(Result);\n    }\n\n    static void clock_getres(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        clockid_t clk_id;\n        struct timespec* tp;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      int Result = ::clock_getres(args->clk_id, args->tp);\n      args->rv = SyscallRet(Result);\n    }\n\n    static void getcpu(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        uint32_t* cpu;\n        uint32_t* node;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      int Result = FHU::Syscalls::getcpu(args->cpu, args->node);\n      args->rv = SyscallRet(Result);\n    }\n\n    static void getrandom(void* ArgsRV) {\n      struct vgetrandom_opaque_params {\n        uint32_t size_of_opaque_state;\n        uint32_t mmap_prot;\n        uint32_t mmap_flags;\n        uint32_t reserved[13];\n      };\n      static_assert(sizeof(vgetrandom_opaque_params) == sizeof(uint32_t[16]));\n\n      struct __attribute__((packed)) ArgsRV_t {\n        void* buffer;\n        size_t len;\n        uint32_t flags;\n        vgetrandom_opaque_params* opaque_state;\n        size_t opaque_len;\n        ssize_t rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      if (args->buffer == nullptr && args->len == 0 && args->flags == 0 && args->opaque_len == ~0ULL) [[unlikely]] {\n        // Special case querying for flags\n        // Since this is the syscall implementation, we need to return valid but unused data.\n        // This will cause glibc to allocate a page of memory, but it ends up being unused.\n        args->opaque_state->size_of_opaque_state = FEXCore::Utils::FEX_PAGE_SIZE;\n        args->opaque_state->mmap_prot = PROT_NONE;\n        args->opaque_state->mmap_flags = MAP_NORESERVE | MAP_ANONYMOUS | MAP_PRIVATE;\n        args->rv = 0;\n        return;\n      }\n\n      int Result = ::syscall(SYS_getrandom, args->buffer, args->len, args->flags);\n      args->rv = SyscallRet(Result);\n    }\n  } // namespace glibc\n\n  namespace VDSO {\n    // VDSO handlers\n    static void time(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        time_t* a_0;\n        uint64_t rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      args->rv = VDSOHandlers::TimePtr(args->a_0);\n    }\n\n    static void gettimeofday(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        struct timeval* tv;\n        struct timezone* tz;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      args->rv = VDSOHandlers::GetTimeOfDayPtr(args->tv, args->tz);\n    }\n\n    static void clock_gettime(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        clockid_t clk_id;\n        struct timespec* tp;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      args->rv = VDSOHandlers::ClockGetTimePtr(args->clk_id, args->tp);\n    }\n\n    static void clock_getres(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        clockid_t clk_id;\n        struct timespec* tp;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      args->rv = VDSOHandlers::ClockGetResPtr(args->clk_id, args->tp);\n    }\n\n    static void getcpu(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        uint32_t* cpu;\n        uint32_t* node;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      args->rv = VDSOHandlers::GetCPUPtr(args->cpu, args->node);\n    }\n\n    static void getrandom(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        void* buffer;\n        size_t len;\n        uint32_t flags;\n        void* opaque_state;\n        size_t opaque_len;\n        ssize_t rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      args->rv = VDSOHandlers::GetRandomPtr(args->buffer, args->len, args->flags, args->opaque_state, args->opaque_len);\n    }\n  } // namespace VDSO\n\n  HandlerPtr Handler_time = FEX::VDSO::x64::glibc::time;\n  HandlerPtr Handler_gettimeofday = FEX::VDSO::x64::glibc::gettimeofday;\n  HandlerPtr Handler_clock_gettime = FEX::VDSO::x64::glibc::clock_gettime;\n  HandlerPtr Handler_clock_getres = FEX::VDSO::x64::glibc::clock_getres;\n  HandlerPtr Handler_getcpu = FEX::VDSO::x64::glibc::getcpu;\n  HandlerPtr Handler_getrandom = FEX::VDSO::x64::glibc::getrandom;\n} // namespace x64\nnamespace x32 {\n  namespace glibc {\n    static int SyscallRet(int Result) {\n      if (Result == -1) {\n        return -errno;\n      }\n      return Result;\n    }\n\n    // glibc handlers\n    static void time(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        HLE::x32::compat_ptr<FEX::HLE::x32::old_time32_t> a_0;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      time_t Host {};\n      int Result = ::time(&Host);\n      args->rv = SyscallRet(Result);\n      if (Result != -1 && args->a_0) {\n        *args->a_0 = Host;\n      }\n    }\n\n    static void gettimeofday(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        HLE::x32::compat_ptr<FEX::HLE::x32::timeval32> tv;\n        HLE::x32::compat_ptr<struct timezone> tz;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      struct timeval tv64 {};\n      struct timeval* tv_ptr {};\n      if (args->tv) {\n        tv_ptr = &tv64;\n      }\n\n      int Result = ::gettimeofday(tv_ptr, args->tz);\n      args->rv = SyscallRet(Result);\n\n      if (Result != -1 && args->tv) {\n        *args->tv = tv64;\n      }\n    }\n\n    static void clock_gettime(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        clockid_t clk_id;\n        HLE::x32::compat_ptr<HLE::x32::timespec32> tp;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      struct timespec tp64 {};\n      int Result = ::clock_gettime(args->clk_id, &tp64);\n      args->rv = SyscallRet(Result);\n\n      if (Result != -1 && args->tp) {\n        *args->tp = tp64;\n      }\n    }\n\n    static void clock_gettime64(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        clockid_t clk_id;\n        HLE::x32::compat_ptr<struct timespec> tp;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      int Result = ::clock_gettime(args->clk_id, args->tp);\n      args->rv = SyscallRet(Result);\n    }\n\n    static void clock_getres(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        clockid_t clk_id;\n        HLE::x32::compat_ptr<HLE::x32::timespec32> tp;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      struct timespec tp64 {};\n\n      int Result = ::clock_getres(args->clk_id, &tp64);\n      args->rv = SyscallRet(Result);\n\n      if (Result != -1 && args->tp) {\n        *args->tp = tp64;\n      }\n    }\n\n    static void getcpu(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        HLE::x32::compat_ptr<uint32_t> cpu;\n        HLE::x32::compat_ptr<uint32_t> node;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      int Result = FHU::Syscalls::getcpu(args->cpu, args->node);\n      args->rv = SyscallRet(Result);\n    }\n  } // namespace glibc\n\n  namespace VDSO {\n    static bool SyscallErr(uint64_t Result) {\n      return Result >= -4095;\n    }\n\n    // VDSO handlers\n    static void time(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        HLE::x32::compat_ptr<FEX::HLE::x32::old_time32_t> a_0;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      time_t Host {};\n      uint64_t Result = VDSOHandlers::TimePtr(&Host);\n      args->rv = Result;\n      if (!SyscallErr(Result) && args->a_0) {\n        *args->a_0 = Host;\n      }\n    }\n\n    static void gettimeofday(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        HLE::x32::compat_ptr<FEX::HLE::x32::timeval32> tv;\n        HLE::x32::compat_ptr<struct timezone> tz;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      struct timeval tv64 {};\n      struct timeval* tv_ptr {};\n      if (args->tv) {\n        tv_ptr = &tv64;\n      }\n\n      uint64_t Result = VDSOHandlers::GetTimeOfDayPtr(tv_ptr, args->tz);\n      args->rv = Result;\n\n      if (!SyscallErr(Result) && args->tv) {\n        *args->tv = tv64;\n      }\n    }\n\n    static void clock_gettime(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        clockid_t clk_id;\n        HLE::x32::compat_ptr<HLE::x32::timespec32> tp;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      struct timespec tp64 {};\n      uint64_t Result = VDSOHandlers::ClockGetTimePtr(args->clk_id, &tp64);\n      args->rv = Result;\n\n      if (!SyscallErr(Result) && args->tp) {\n        *args->tp = tp64;\n      }\n    }\n\n    static void clock_gettime64(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        clockid_t clk_id;\n        HLE::x32::compat_ptr<struct timespec> tp;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      args->rv = VDSOHandlers::ClockGetTimePtr(args->clk_id, args->tp);\n    }\n\n    static void clock_getres(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        clockid_t clk_id;\n        HLE::x32::compat_ptr<HLE::x32::timespec32> tp;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      struct timespec tp64 {};\n\n      uint64_t Result = VDSOHandlers::ClockGetResPtr(args->clk_id, &tp64);\n      args->rv = Result;\n\n      if (!SyscallErr(Result) && args->tp) {\n        *args->tp = tp64;\n      }\n    }\n\n    static void getcpu(void* ArgsRV) {\n      struct __attribute__((packed)) ArgsRV_t {\n        HLE::x32::compat_ptr<uint32_t> cpu;\n        HLE::x32::compat_ptr<uint32_t> node;\n        int rv;\n      }* args = reinterpret_cast<ArgsRV_t*>(ArgsRV);\n\n      args->rv = VDSOHandlers::GetCPUPtr(args->cpu, args->node);\n    }\n  } // namespace VDSO\n\n  HandlerPtr Handler_time = FEX::VDSO::x32::glibc::time;\n  HandlerPtr Handler_gettimeofday = FEX::VDSO::x32::glibc::gettimeofday;\n  HandlerPtr Handler_clock_gettime = FEX::VDSO::x32::glibc::clock_gettime;\n  HandlerPtr Handler_clock_gettime64 = FEX::VDSO::x32::glibc::clock_gettime64;\n  HandlerPtr Handler_clock_getres = FEX::VDSO::x32::glibc::clock_getres;\n  HandlerPtr Handler_getcpu = FEX::VDSO::x32::glibc::getcpu;\n} // namespace x32\n\nclass VDSOParser final {\npublic:\n  VDSOParser(const uint8_t* HeaderBase);\n\n  void* FindSymbol(std::string_view Name) const {\n    auto it = Symbols.find(Name);\n    if (it == Symbols.end()) {\n      return nullptr;\n    }\n    return it->second;\n  }\nprivate:\n  fextl::map<std::string_view, void*> Symbols;\n};\n\nVDSOParser::VDSOParser(const uint8_t* HeaderBase) {\n  // Minimal ELF parser that only knows how to scan for dynamic symbols from VDSO.\n  auto Header = reinterpret_cast<const Elf64_Ehdr*>(HeaderBase);\n  auto SectionHeaderOffset = Header->e_shoff;\n  auto SectionHeaderCount = Header->e_shnum;\n  auto SectionHeaders = reinterpret_cast<const Elf64_Shdr*>(&HeaderBase[SectionHeaderOffset]);\n\n  // Scan for the symbol and string headers.\n  const Elf64_Shdr* DynamicSymbolHeader {};\n  const Elf64_Shdr* DynamicStringHeader {};\n  for (size_t i = 0; i < SectionHeaderCount; ++i) {\n    if (DynamicSymbolHeader && DynamicStringHeader) {\n      // Found both headers.\n      break;\n    }\n\n    if (SectionHeaders[i].sh_type == SHT_DYNSYM) {\n      // Dynamic symbol header found.\n      DynamicSymbolHeader = &SectionHeaders[i];\n    }\n\n    if (SectionHeaders[i].sh_type == SHT_STRTAB && SectionHeaders[i].sh_addr) {\n      // Dynamic string header found.\n      DynamicStringHeader = &SectionHeaders[i];\n    }\n  }\n\n  if (!DynamicSymbolHeader || !DynamicStringHeader) {\n    LogMan::Msg::DFmt(\"Couldn't parse host VDSO symbols. Falling back to glibc implementations.\");\n    return;\n  }\n\n  auto NumberOfDynamicSymbols = DynamicSymbolHeader->sh_size / DynamicSymbolHeader->sh_entsize;\n  const char* DynamicStringTable = reinterpret_cast<const char*>(&HeaderBase[DynamicStringHeader->sh_offset]);\n\n  // Scan all the symbols and populate the look-up table.\n  for (size_t i = 0; i < NumberOfDynamicSymbols; ++i) {\n    auto Offset = DynamicSymbolHeader->sh_offset + (i * DynamicSymbolHeader->sh_entsize);\n    auto Symbol = reinterpret_cast<const Elf64_Sym*>(&HeaderBase[Offset]);\n\n    if (Symbol->st_info != 0) {\n      // Save the symbol.\n      const char* Name = &DynamicStringTable[Symbol->st_name];\n      auto SymbolPtr = HeaderBase + Symbol->st_value;\n      Symbols[Name] = const_cast<void*>(static_cast<const void*>(SymbolPtr));\n    }\n  }\n}\n\nvoid LoadHostVDSO() {\n  // Linux gives the VDSO ELF header base in the auxv value AT_SYSINFO_EHDR.\n  auto VDSOHeader = ::getauxval(AT_SYSINFO_EHDR);\n\n  if (!VDSOHeader) {\n    // We couldn't load VDSO, fallback to C implementations. Which will still be faster than emulated libc versions.\n    LogMan::Msg::IFmt(\"linux-vdso implementation falling back to libc. Consider enabling VDSO in your kernel.\");\n    return;\n  }\n\n  auto VDSO = VDSOParser(reinterpret_cast<const uint8_t*>(VDSOHeader));\n\n  auto SymbolPtr = VDSO.FindSymbol(\"__kernel_time\");\n  if (!SymbolPtr) {\n    SymbolPtr = VDSO.FindSymbol(\"__vdso_time\");\n  }\n  if (SymbolPtr) {\n    VDSOHandlers::TimePtr = reinterpret_cast<VDSOHandlers::TimeType>(SymbolPtr);\n    x64::Handler_time = x64::VDSO::time;\n    x32::Handler_time = x32::VDSO::time;\n  }\n\n  SymbolPtr = VDSO.FindSymbol(\"__kernel_gettimeofday\");\n  if (!SymbolPtr) {\n    SymbolPtr = VDSO.FindSymbol(\"__vdso_gettimeofday\");\n  }\n\n  if (SymbolPtr) {\n    VDSOHandlers::GetTimeOfDayPtr = reinterpret_cast<VDSOHandlers::GetTimeOfDayType>(SymbolPtr);\n    x64::Handler_gettimeofday = x64::VDSO::gettimeofday;\n    x32::Handler_gettimeofday = x32::VDSO::gettimeofday;\n  }\n\n  SymbolPtr = VDSO.FindSymbol(\"__kernel_clock_gettime\");\n  if (!SymbolPtr) {\n    SymbolPtr = VDSO.FindSymbol(\"__vdso_clock_gettime\");\n  }\n\n  if (SymbolPtr) {\n    VDSOHandlers::ClockGetTimePtr = reinterpret_cast<VDSOHandlers::ClockGetTimeType>(SymbolPtr);\n    x64::Handler_clock_gettime = x64::VDSO::clock_gettime;\n    x32::Handler_clock_gettime = x32::VDSO::clock_gettime;\n    x32::Handler_clock_gettime64 = x32::VDSO::clock_gettime64;\n  }\n\n  SymbolPtr = VDSO.FindSymbol(\"__kernel_clock_getres\");\n  if (!SymbolPtr) {\n    SymbolPtr = VDSO.FindSymbol(\"__vdso_clock_getres\");\n  }\n\n  if (SymbolPtr) {\n    VDSOHandlers::ClockGetResPtr = reinterpret_cast<VDSOHandlers::ClockGetResType>(SymbolPtr);\n    x64::Handler_clock_getres = x64::VDSO::clock_getres;\n    x32::Handler_clock_getres = x32::VDSO::clock_getres;\n  }\n\n  SymbolPtr = VDSO.FindSymbol(\"__kernel_getcpu\");\n  if (!SymbolPtr) {\n    SymbolPtr = VDSO.FindSymbol(\"__vdso_getcpu\");\n  }\n\n  if (SymbolPtr) {\n    VDSOHandlers::GetCPUPtr = reinterpret_cast<VDSOHandlers::GetCPUType>(SymbolPtr);\n    x64::Handler_getcpu = x64::VDSO::getcpu;\n    x32::Handler_getcpu = x32::VDSO::getcpu;\n  }\n\n  SymbolPtr = VDSO.FindSymbol(\"__kernel_getrandom\");\n  if (!SymbolPtr) {\n    SymbolPtr = VDSO.FindSymbol(\"__vdso_getrandom\");\n  }\n\n  if (SymbolPtr) {\n    VDSOHandlers::GetRandomPtr = reinterpret_cast<VDSOHandlers::GetRandomType>(SymbolPtr);\n    x64::Handler_getrandom = x64::VDSO::getrandom;\n    // 32-bit doesn't have getrandom vdso\n  }\n}\n\nstatic std::array<FEXCore::IR::ThunkDefinition, 7> VDSODefinitions = {{\n  {\n    // sha256(libVDSO:time)\n    {0x37, 0x63, 0x46, 0xb0, 0x79, 0x06, 0x5f, 0x9d, 0x00, 0xb6, 0x8d, 0xfd, 0x9e, 0x4a, 0x62, 0xcd,\n     0x1e, 0x6c, 0xcc, 0x22, 0xcd, 0xb2, 0xc0, 0x17, 0x7d, 0x42, 0x6a, 0x40, 0xd1, 0xeb, 0xfa, 0xe0},\n    nullptr,\n  },\n  {\n    // sha256(libVDSO:gettimeofday)\n    {0x77, 0x2a, 0xde, 0x1c, 0x13, 0x2d, 0xe9, 0x48, 0xaf, 0xe0, 0xba, 0xcc, 0x6a, 0x89, 0xff, 0xca,\n     0x4a, 0xdc, 0xd5, 0x63, 0x2c, 0xc5, 0x62, 0x8b, 0x5d, 0xde, 0x0b, 0x15, 0x35, 0xc6, 0xc7, 0x14},\n    nullptr,\n  },\n  {\n    // sha256(libVDSO:clock_gettime)\n    {0x3c, 0x96, 0x9b, 0x2d, 0xc3, 0xad, 0x2b, 0x3b, 0x9c, 0x4e, 0x4d, 0xca, 0x1c, 0xe8, 0x18, 0x4a,\n     0x12, 0x8a, 0xe4, 0xc1, 0x56, 0x92, 0x73, 0xce, 0x65, 0x85, 0x5f, 0x65, 0x7e, 0x94, 0x26, 0xbe},\n    nullptr,\n  },\n\n  {\n    // sha256(libVDSO:clock_gettime64)\n    {0xba, 0xe9, 0x6d, 0x30, 0xc0, 0x68, 0xc6, 0xd7, 0x59, 0x04, 0xf7, 0x10, 0x06, 0x72, 0x88, 0xfd,\n     0x4c, 0x57, 0x0f, 0x31, 0xa5, 0xea, 0xa9, 0xb9, 0xd3, 0x8d, 0x03, 0x81, 0x50, 0x16, 0x22, 0x71},\n    nullptr,\n  },\n\n  {\n    // sha256(libVDSO:clock_getres)\n    {0xe4, 0xa1, 0xf6, 0x23, 0x35, 0xae, 0xb7, 0xb6, 0xb0, 0x37, 0xc5, 0xc3, 0xa3, 0xfd, 0xbf, 0xa2,\n     0xa1, 0xc8, 0x95, 0x78, 0xe5, 0x76, 0x86, 0xdb, 0x3e, 0x6c, 0x54, 0xd5, 0x02, 0x60, 0xd8, 0x6d},\n    nullptr,\n  },\n  {\n    // sha256(libVDSO:getcpu)\n    {0x39, 0x83, 0x39, 0x36, 0x0f, 0x68, 0xd6, 0xfc, 0xc2, 0x3a, 0x97, 0x11, 0x85, 0x09, 0xc7, 0x25,\n     0xbb, 0x50, 0x49, 0x55, 0x6b, 0x0c, 0x9f, 0x50, 0x37, 0xf5, 0x9d, 0xb0, 0x38, 0x58, 0x57, 0x12},\n    nullptr,\n  },\n  {\n    // sha256(libVDSO:getrandom)\n    {0xf8, 0x03, 0xe2, 0x70, 0xe3, 0xf1, 0xbb, 0xc1, 0x7d, 0xa7, 0x8b, 0xb3, 0x1f, 0x3e, 0xbd, 0xc6,\n     0x8a, 0x50, 0xd3, 0x4a, 0x1f, 0xb3, 0x4b, 0x7e, 0x32, 0xcb, 0x1e, 0x18, 0x3b, 0x7c, 0xeb, 0x4b},\n    nullptr,\n  },\n}};\n\ntemplate<bool Is64Bit>\nvoid LoadGuestVDSOSymbols(char* VDSOBase) {\n  using ELFHeaderType = std::conditional_t<Is64Bit, Elf64_Ehdr, Elf32_Ehdr>;\n  using ELFSHeaderType = std::conditional_t<Is64Bit, Elf64_Shdr, Elf32_Shdr>;\n  using ELFSymbolType = std::conditional_t<Is64Bit, Elf64_Sym, Elf32_Sym>;\n  constexpr auto ELFClass = Is64Bit ? ELFCLASS64 : ELFCLASS32;\n  constexpr auto ELFMachine = Is64Bit ? EM_X86_64 : EM_386;\n\n  // We need to load symbols we care about.\n  auto Header = reinterpret_cast<const ELFHeaderType*>(VDSOBase);\n\n  // Check ELF magic.\n  if (Header->e_ident[EI_MAG0] != ELFMAG0 || Header->e_ident[EI_MAG1] != ELFMAG1 || Header->e_ident[EI_MAG2] != ELFMAG2 ||\n      Header->e_ident[EI_MAG3] != ELFMAG3) {\n    return;\n  }\n\n  // Check ELF class and Machine.\n  if (Header->e_ident[EI_CLASS] != ELFClass || Header->e_machine != ELFMachine) {\n    return;\n  }\n\n  // First walk the section headers to find the symbol table.\n  auto RawShdrs = reinterpret_cast<const ELFSHeaderType*>(VDSOBase + Header->e_shoff);\n\n  const auto StrHeader = &RawShdrs[Header->e_shstrndx];\n  const char* SHStrings = VDSOBase + StrHeader->sh_offset;\n\n  struct SymbolTypes {\n    const char* name;\n    int sh_type;\n  };\n\n  constexpr std::array<SymbolTypes, 2> symbol_table_names = {{{\".dynsym\", SHT_DYNSYM}, {\".symtab\", SHT_SYMTAB}}};\n\n  for (auto sym_table : symbol_table_names) {\n    const ELFSHeaderType* SymTableHeader {};\n    const ELFSHeaderType* StringTableHeader {};\n\n    for (size_t i = 0; i < Header->e_shnum; ++i) {\n      const auto& Header = RawShdrs[i];\n      if (Header.sh_type == sym_table.sh_type && strcmp(&SHStrings[Header.sh_name], sym_table.name) == 0) {\n        SymTableHeader = &Header;\n        StringTableHeader = &RawShdrs[SymTableHeader->sh_link];\n        break;\n      }\n    }\n\n    if (!SymTableHeader) {\n      // Couldn't find symbol table\n      continue;\n    }\n\n    const char* StrTab = VDSOBase + StringTableHeader->sh_offset;\n    size_t NumSymbols = SymTableHeader->sh_size / SymTableHeader->sh_entsize;\n\n    for (size_t i = 0; i < NumSymbols; ++i) {\n      uint64_t offset = SymTableHeader->sh_offset + i * SymTableHeader->sh_entsize;\n      auto Symbol = reinterpret_cast<const ELFSymbolType*>(VDSOBase + offset);\n      if (ELF32_ST_VISIBILITY(Symbol->st_other) != STV_HIDDEN && Symbol->st_value != 0) {\n        const char* Name = &StrTab[Symbol->st_name];\n        if (Name[0] != '\\0') {\n          if (strcmp(Name, \"__kernel_sigreturn\") == 0) {\n            VDSOPointers.VDSO_kernel_sigreturn = VDSOBase + Symbol->st_value;\n          } else if (strcmp(Name, \"__kernel_rt_sigreturn\") == 0) {\n            VDSOPointers.VDSO_kernel_rt_sigreturn = VDSOBase + Symbol->st_value;\n          } else if (strcmp(Name, \"__fex_callback_ret\") == 0) {\n            VDSOPointers.VDSO_FEX_CallbackRET = VDSOBase + Symbol->st_value;\n          }\n        }\n      }\n    }\n  }\n}\n\nvoid LoadFEXGeneratedCode(FEXCore::Core::InternalThreadState* Thread, bool Is64Bit, VDSOMapping* Mapping, FEX::HLE::SyscallHandler* const Handler) {\n  if (VDSOPointers.VDSO_FEX_CallbackRET && (!Is64Bit || (VDSOPointers.VDSO_kernel_sigreturn && VDSOPointers.VDSO_kernel_rt_sigreturn))) {\n    // Unnecessary if all VDSO paths have already been loaded.\n    return;\n  }\n\n  // Hardcoded to one page for now\n  auto PageSize = sysconf(_SC_PAGESIZE);\n  PageSize = PageSize > 0 ? PageSize : FEXCore::Utils::FEX_PAGE_SIZE;\n  Mapping->X86GeneratedCodeSize = PageSize;\n\n  if (Is64Bit) {\n    // 64bit mode can have its code anywhere\n    auto Result =\n      Handler->GuestMmap(Is64Bit, Thread, nullptr, Mapping->X86GeneratedCodeSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n\n    if (!FEX::HLE::HasSyscallError(Result)) {\n      Mapping->X86GeneratedCodePtr = Result;\n    }\n  } else {\n    // First 64bit page\n    constexpr uintptr_t LOCATION_MAX = 0x1'0000'0000;\n\n    // We need to have the sigret handler in the lower 32bits of memory space\n    // Scan top down and try to allocate a location\n    for (size_t Location = 0xFFFF'E000; Location != 0x0; Location -= PageSize) {\n      auto Ptr = Handler->GuestMmap(Is64Bit, Thread, reinterpret_cast<void*>(Location), PageSize, PROT_READ | PROT_WRITE,\n                                    MAP_FIXED_NOREPLACE | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n\n      if (!FEX::HLE::HasSyscallError(Ptr) && reinterpret_cast<uintptr_t>(Ptr) >= LOCATION_MAX) {\n        // Failed to map in the lower 32bits\n        // Try again\n        // Can happen in the case that host kernel ignores MAP_FIXED_NOREPLACE\n        Handler->GuestMunmap(Thread, Ptr, PageSize);\n        continue;\n      }\n\n      if (!FEX::HLE::HasSyscallError(Ptr)) {\n        Mapping->X86GeneratedCodePtr = Ptr;\n        break;\n      }\n    }\n  }\n\n  // Can't do anything about this\n  // Here's hoping the application doesn't use signals\n  if (!Mapping->X86GeneratedCodePtr) {\n    return;\n  }\n\n  FEXCore::Allocator::VirtualName(\"FEXMem_Misc\", Mapping->X86GeneratedCodePtr, Mapping->X86GeneratedCodeSize);\n\n  size_t CurrentCodeOffset {};\n\n  if (!Is64Bit) {\n    // Signal return handlers need to be bit-exact to what the Linux kernel provides in VDSO.\n    // GDB and unwinding libraries key off of these instructions to understand if the stack frame is a signal frame or not.\n    // This two code sections match exactly what libSegFault expects.\n    //\n    // Typically this handlers are provided by the 32-bit VDSO thunk library, but that isn't available in all cases.\n    // Falling back to this generated code segment still allows a backtrace to work, just might not show\n    // the symbol as VDSO since there is no ELF to parse.\n    constexpr std::array<uint8_t, 9> sigreturn_32_code = {\n      0x58,                         // pop eax\n      0xb8, 0x77, 0x00, 0x00, 0x00, // mov eax, 0x77\n      0xcd, 0x80,                   // int 0x80\n      0x90,                         // nop\n    };\n\n    constexpr std::array<uint8_t, 7> rt_sigreturn_32_code = {\n      0xb8, 0xad, 0x00, 0x00, 0x00, // mov eax, 0xad\n      0xcd, 0x80,                   // int 0x80\n    };\n\n    if (!VDSOPointers.VDSO_kernel_sigreturn) {\n      VDSOPointers.VDSO_kernel_sigreturn = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(Mapping->X86GeneratedCodePtr) + CurrentCodeOffset);\n      memcpy(VDSOPointers.VDSO_kernel_sigreturn, sigreturn_32_code.data(), sigreturn_32_code.size());\n      CurrentCodeOffset += sigreturn_32_code.size();\n    }\n\n    if (!VDSOPointers.VDSO_kernel_rt_sigreturn) {\n      VDSOPointers.VDSO_kernel_rt_sigreturn =\n        reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(Mapping->X86GeneratedCodePtr) + CurrentCodeOffset);\n      memcpy(VDSOPointers.VDSO_kernel_rt_sigreturn, rt_sigreturn_32_code.data(), rt_sigreturn_32_code.size());\n      CurrentCodeOffset += rt_sigreturn_32_code.size();\n    }\n  }\n\n  if (!VDSOPointers.VDSO_FEX_CallbackRET) {\n    constexpr std::array<uint8_t, 2> CallbackRetCode = {\n      0x0F, 0x3E, // CALLBACKRET FEX Instruction\n    };\n\n    VDSOPointers.VDSO_FEX_CallbackRET = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(Mapping->X86GeneratedCodePtr) + CurrentCodeOffset);\n    memcpy(VDSOPointers.VDSO_FEX_CallbackRET, CallbackRetCode.data(), CallbackRetCode.size());\n    CurrentCodeOffset += CallbackRetCode.size();\n  }\n\n  Handler->GuestMprotect(Thread, Mapping->X86GeneratedCodePtr, Mapping->X86GeneratedCodeSize, PROT_READ | PROT_EXEC);\n}\n\nvoid UnloadVDSOMapping(FEXCore::Core::InternalThreadState* Thread, FEX::HLE::SyscallHandler* const Handler, const VDSOMapping& Mapping) {\n  if (Mapping.VDSOBase) {\n    Handler->GuestMunmap(Thread, Mapping.VDSOBase, Mapping.VDSOSize);\n  }\n\n  if (Mapping.X86GeneratedCodePtr) {\n    Handler->GuestMunmap(Thread, Mapping.X86GeneratedCodePtr, Mapping.X86GeneratedCodeSize);\n  }\n}\n\nVDSOMapping LoadVDSOThunks(FEXCore::Core::InternalThreadState* Thread, bool Is64Bit, FEX::HLE::SyscallHandler* const Handler) {\n  VDSOMapping Mapping {};\n  FEX_CONFIG_OPT(ThunkGuestLibs, THUNKGUESTLIBS);\n  fextl::string ThunkGuestPath = ThunkGuestLibs();\n  while (ThunkGuestPath.ends_with('/')) {\n    ThunkGuestPath.pop_back();\n  }\n  ThunkGuestPath = fextl::fmt::format(\"{}{}/libVDSO-guest.so\", ThunkGuestPath, Is64Bit ? \"\" : \"_32\");\n  // Load VDSO if we can\n  int VDSOFD = ::open(ThunkGuestPath.c_str(), O_RDONLY);\n\n  if (VDSOFD != -1) {\n    // Get file size\n    Mapping.VDSOSize = lseek(VDSOFD, 0, SEEK_END);\n\n    if (Mapping.VDSOSize >= std::min(sizeof(Elf32_Ehdr), sizeof(Elf64_Ehdr))) {\n      // Reset to beginning\n      lseek(VDSOFD, 0, SEEK_SET);\n      Mapping.VDSOSize = FEXCore::AlignUp(Mapping.VDSOSize, FEXCore::Utils::FEX_PAGE_SIZE);\n\n      auto VASize = FEXCore::Allocator::DetermineVASize();\n      uint64_t VDSOHint {};\n      if (Is64Bit) {\n        if (VASize > 47) {\n          // If VA size is at least as large as minimum x86 specification, then set to max.\n          VASize = 47;\n        }\n\n        // Calculate the highest point the vdso could go.\n        VDSOHint = (1ULL << VASize) - Mapping.VDSOSize;\n      } else {\n        VDSOHint = 0x1'0000'0000ULL - Mapping.VDSOSize;\n      }\n\n      auto PageSize = sysconf(_SC_PAGESIZE);\n      PageSize = PageSize > 0 ? PageSize : FEXCore::Utils::FEX_PAGE_SIZE;\n\n      // Scan top down and try to allocate a location\n      void* VDSOPointerBase {};\n      do {\n        VDSOPointerBase = Handler->GuestMmap(Is64Bit, Thread, reinterpret_cast<void*>(VDSOHint), Mapping.VDSOSize, PROT_READ | PROT_EXEC,\n                                             MAP_FIXED_NOREPLACE | MAP_SHARED, VDSOFD, 0);\n        // Scan-downward until we fit.\n        VDSOHint -= PageSize;\n      } while (FEX::HLE::HasSyscallError(VDSOPointerBase) && static_cast<int64_t>(VDSOHint) > 0);\n\n      if (FEX::HLE::HasSyscallError(VDSOPointerBase)) {\n        LogMan::Msg::EFmt(\"Couldn't Map VDSO\");\n        close(VDSOFD);\n        return {};\n      }\n\n      Mapping.VDSOBase = VDSOPointerBase;\n\n      // Since we found our VDSO thunk library, find our host VDSO function implementations.\n      LoadHostVDSO();\n    }\n    close(VDSOFD);\n\n    if (!Mapping.VDSOBase) {\n      return {};\n    }\n\n    if (Is64Bit) {\n      LoadGuestVDSOSymbols<true>(reinterpret_cast<char*>(Mapping.VDSOBase));\n    } else {\n      LoadGuestVDSOSymbols<false>(reinterpret_cast<char*>(Mapping.VDSOBase));\n    }\n  }\n\n  // If VDSO couldn't find sigreturn then FEX needs to provide unique implementations.\n  LoadFEXGeneratedCode(Thread, Is64Bit, &Mapping, Handler);\n\n  if (Is64Bit) {\n    // Set the Thunk definition pointers for x86-64\n    VDSODefinitions[0].ThunkFunction = FEX::VDSO::x64::Handler_time;\n    VDSODefinitions[1].ThunkFunction = FEX::VDSO::x64::Handler_gettimeofday;\n    VDSODefinitions[2].ThunkFunction = FEX::VDSO::x64::Handler_clock_gettime;\n    VDSODefinitions[3].ThunkFunction = FEX::VDSO::x64::Handler_clock_gettime;\n    VDSODefinitions[4].ThunkFunction = FEX::VDSO::x64::Handler_clock_getres;\n    VDSODefinitions[5].ThunkFunction = FEX::VDSO::x64::Handler_getcpu;\n    VDSODefinitions[6].ThunkFunction = FEX::VDSO::x64::Handler_getrandom;\n  } else {\n    // Set the Thunk definition pointers for x86\n    VDSODefinitions[0].ThunkFunction = FEX::VDSO::x32::Handler_time;\n    VDSODefinitions[1].ThunkFunction = FEX::VDSO::x32::Handler_gettimeofday;\n    VDSODefinitions[2].ThunkFunction = FEX::VDSO::x32::Handler_clock_gettime;\n    VDSODefinitions[3].ThunkFunction = FEX::VDSO::x32::Handler_clock_gettime64;\n    VDSODefinitions[4].ThunkFunction = FEX::VDSO::x32::Handler_clock_getres;\n    VDSODefinitions[5].ThunkFunction = FEX::VDSO::x32::Handler_getcpu;\n    // getrandom doesn't exist on 32-bit, so leave VDSODefinitions[6] unfilled\n  }\n\n  return Mapping;\n}\n\nuint64_t GetVSyscallEntry(const void* VDSOBase) {\n  if (!VDSOBase) {\n    return 0;\n  }\n\n  // Extract the vsyscall location from the VDSO header.\n  auto Header = reinterpret_cast<const Elf32_Ehdr*>(VDSOBase);\n\n  if (Header->e_entry) {\n    return reinterpret_cast<uint64_t>(VDSOBase) + Header->e_entry;\n  }\n\n  return 0;\n}\n\nconst std::span<FEXCore::IR::ThunkDefinition> GetVDSOThunkDefinitions(bool Is64Bit) {\n  return std::span(VDSODefinitions.begin(), VDSODefinitions.end() - (Is64Bit ? 0 : 1));\n}\n\nconst VDSOEntrypoints& GetVDSOSymbols() {\n  return VDSOPointers;\n}\n} // namespace FEX::VDSO\n"
  },
  {
    "path": "Source/Tools/LinuxEmulation/VDSO_Emulation.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/IR/IR.h>\n\n#include <cstddef>\n#include <cstdint>\n#include <span>\n\nnamespace FEXCore::Core {\nstruct InternalThreadState;\n}\n\nnamespace FEX::HLE {\nclass SyscallHandler;\n}\n\nnamespace FEX::VDSO {\nstruct VDSOMapping {\n  void* VDSOBase {};\n  size_t VDSOSize {};\n  void* X86GeneratedCodePtr {};\n  size_t X86GeneratedCodeSize {};\n};\n\nstruct VDSOEntrypoints {\n  void* VDSO_kernel_sigreturn;\n  void* VDSO_kernel_rt_sigreturn;\n  void* VDSO_FEX_CallbackRET;\n};\nVDSOMapping LoadVDSOThunks(FEXCore::Core::InternalThreadState* Thread, bool Is64Bit, FEX::HLE::SyscallHandler* const Handler);\nvoid UnloadVDSOMapping(FEXCore::Core::InternalThreadState* Thread, FEX::HLE::SyscallHandler* const Handler, const VDSOMapping& Mapping);\n\nuint64_t GetVSyscallEntry(const void* VDSOBase);\n\nconst std::span<FEXCore::IR::ThunkDefinition> GetVDSOThunkDefinitions(bool Is64Bit);\nconst VDSOEntrypoints& GetVDSOSymbols();\n} // namespace FEX::VDSO\n"
  },
  {
    "path": "Source/Tools/TestHarnessRunner/CMakeLists.txt",
    "content": "list(APPEND LIBS FEXCore Common JemallocLibs ${PTHREAD_LIB})\n\nset(SRCS TestHarnessRunner.cpp)\nif (NOT MINGW)\n  list(APPEND SRCS TestHarnessRunner/HostRunner.cpp)\n  list(APPEND LIBS LinuxEmulation CommonTools)\nendif()\n\nadd_executable(TestHarnessRunner ${SRCS})\n\nif (ENABLE_VIXL_SIMULATOR)\n  target_compile_definitions(TestHarnessRunner PRIVATE \"-DVIXL_SIMULATOR=1\")\nendif()\n\ntarget_include_directories(TestHarnessRunner PRIVATE ${CMAKE_BINARY_DIR}/generated)\n\ntarget_link_libraries(TestHarnessRunner PRIVATE ${LIBS})\n"
  },
  {
    "path": "Source/Tools/TestHarnessRunner/TestHarnessRunner/HostRunner.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"ArchHelpers/UContext.h\"\n#include \"LinuxSyscalls/SignalDelegator.h\"\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/fextl/list.h>\n#include <FEXCore/fextl/unordered_map.h>\n#include <FEXCore/fextl/unordered_set.h>\n#include <FEXCore/Utils/LogManager.h>\n\n#ifdef ARCHITECTURE_x86_64\n#include \"Common/X86Features.h\"\n#include <asm/ldt.h>\n#include <sys/syscall.h>\n#endif\n#include <stddef.h>\n#include <stdint.h>\n#include <string.h>\n#include <ucontext.h>\n\n#include <signal.h>\n\n#ifdef ARCHITECTURE_x86_64\nstatic inline int modify_ldt(int func, void* ldt) {\n  return ::syscall(SYS_modify_ldt, func, ldt, sizeof(struct user_desc));\n}\n\n__attribute__((naked)) void Dispatcher(uintptr_t BranchTarget, void* ReturningStackLocation, int CodeSegment, int SupportsFSGSBase) {\n  // BranchTarget: rdi\n  // ReturningStackLocation: rsi\n  // CodeSegment: rdx\n  // SupportsFSGSBase: rcx\n  __asm volatile(R\"(\n  .intel_syntax noprefix;\n    // x86-64 ABI has the stack aligned when /call/ happens\n    // Which means the destination has a misaligned stack at that point\n    push rbx;\n    push rbp;\n    push r12;\n    push r13;\n    push r14;\n    push r15;\n\n    test ecx, ecx;\n    je 1f;\n    rdfsbase rbx;\n    push rbx;\n    rdgsbase rbx;\n    push rbx;\n    1:\n\n    push rcx;\n\n    // Save this stack pointer so we can cleanly shutdown the emulation with a long jump\n    // regardless of where we were in the stack\n    mov [rsi], rsp;\n\n    // Clear all state going in to the branch target.\n    // Only remaining state, rdi, rdx, rsp\n    mov rax, 0;\n    mov rbx, 0;\n    mov rcx, 0;\n    mov rbp, 0;\n    mov rsi, 0;\n    mov r8, 0;\n    mov r9, 0;\n    mov r10, 0;\n    mov r11, 0;\n    mov r12, 0;\n    mov r13, 0;\n    mov r14, 0;\n    mov r15, 0;\n    finit;\n\n    cmp rdx, 0;\n    jnz .32_bit;\n\n    .64_bit:\n      // Set flags to x86 reset state (0x202: IF=1, reserved bit 1=1).\n      push 0x202;\n      popfq;\n      mov rdx, 0;\n      mov rsp, 0;\n\n      // Tail-call\n      jmp rdi;\n\n    .32_bit:\n      // Far call needs to go through a gate\n      // This is setup just like the following packing\n      // {\n      //  uint32_t RIP;\n      //  uint16_t CodeSegment;\n      // }\n      sub rsp, 16\n      mov [rsp], edi;\n      mov [rsp+4], dx\n\n      // Set flags to x86 reset state (0x202: IF=1, reserved bit 1=1).\n      push 0x202;\n      popfq;\n      mov rdx, 0;\n\n      GetCodeSegmentEntryLocation:\n      hlt;\n\n      jmp fword ptr [rsp];\n\n    ThreadStopHandlerAddress:\n\n    pop rcx\n    test ecx, ecx;\n    je 1f;\n    pop rbx;\n    wrgsbase rbx;\n    pop rbx;\n    wrfsbase rbx;\n    1:\n\n    pop r15;\n    pop r14;\n    pop r13;\n    pop r12;\n    pop rbp;\n    pop rbx;\n\n    ret;\n\n  .att_syntax prefix;\n  )\" ::\n                   : \"memory\", \"cc\");\n}\n\nextern \"C\" void* GetCodeSegmentEntryLocation;\nuintptr_t GetCodeSegmentEntryLocationPtr = (uintptr_t)&GetCodeSegmentEntryLocation;\nextern \"C\" void* ThreadStopHandlerAddress;\nuintptr_t ThreadStopHandlerAddressPtr = (uintptr_t)&ThreadStopHandlerAddress;\n\nclass x86HostRunner final {\npublic:\n  x86HostRunner() {\n    Setup32BitCodeSegment();\n  }\n\n  bool HandleSIGSEGV(FEXCore::Core::CPUState* OutState, int Signal, void* info, void* ucontext) {\n    ucontext_t* _context = (ucontext_t*)ucontext;\n    mcontext_t* _mcontext = &_context->uc_mcontext;\n\n    // Check our current instruction that we just executed to ensure it was an HLT\n    uint8_t* Inst {};\n\n    Inst = reinterpret_cast<uint8_t*>(_mcontext->gregs[REG_RIP]);\n    if (!Is64BitMode()) {\n      if (_mcontext->gregs[REG_RIP] == ::GetCodeSegmentEntryLocationPtr) {\n        // Backup the CSGSFS register\n        GlobalCodeSegmentEntry = _mcontext->gregs[REG_CSGSFS];\n        // Skip past this hlt and keep running\n        _mcontext->gregs[REG_RIP] += 1;\n        return true;\n      }\n    }\n    constexpr uint8_t HLT = 0xF4;\n    if (Inst[0] != HLT) {\n      return false;\n    }\n\n    // Store our host state in to the guest for testing against\n    OutState->gregs[FEXCore::X86State::REG_RAX] = _mcontext->gregs[REG_RAX];\n    OutState->gregs[FEXCore::X86State::REG_RBX] = _mcontext->gregs[REG_RBX];\n    OutState->gregs[FEXCore::X86State::REG_RCX] = _mcontext->gregs[REG_RCX];\n    OutState->gregs[FEXCore::X86State::REG_RDX] = _mcontext->gregs[REG_RDX];\n    OutState->gregs[FEXCore::X86State::REG_RBP] = _mcontext->gregs[REG_RBP];\n    OutState->gregs[FEXCore::X86State::REG_RSI] = _mcontext->gregs[REG_RSI];\n    OutState->gregs[FEXCore::X86State::REG_RDI] = _mcontext->gregs[REG_RDI];\n    OutState->gregs[FEXCore::X86State::REG_RSP] = _mcontext->gregs[REG_RSP];\n    OutState->gregs[FEXCore::X86State::REG_R8] = _mcontext->gregs[REG_R8];\n    OutState->gregs[FEXCore::X86State::REG_R9] = _mcontext->gregs[REG_R9];\n    OutState->gregs[FEXCore::X86State::REG_R10] = _mcontext->gregs[REG_R10];\n    OutState->gregs[FEXCore::X86State::REG_R11] = _mcontext->gregs[REG_R11];\n    OutState->gregs[FEXCore::X86State::REG_R12] = _mcontext->gregs[REG_R12];\n    OutState->gregs[FEXCore::X86State::REG_R13] = _mcontext->gregs[REG_R13];\n    OutState->gregs[FEXCore::X86State::REG_R14] = _mcontext->gregs[REG_R14];\n    OutState->gregs[FEXCore::X86State::REG_R15] = _mcontext->gregs[REG_R15];\n    OutState->rip = _mcontext->gregs[REG_RIP];\n\n    for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_XMMS; ++i) {\n      memcpy(&OutState->xmm.avx.data[i], &_mcontext->fpregs->_xmm[i], sizeof(_mcontext->fpregs->_xmm[0]));\n    }\n    const auto* xstate = reinterpret_cast<FEXCore::x86_64::xstate*>(_mcontext->fpregs);\n    const auto* reserved = &xstate->fpstate.sw_reserved;\n    if (reserved->HasExtendedContext() && reserved->HasYMMH()) {\n      for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_XMMS; i++) {\n        memcpy(&OutState->xmm.avx.data[i][2], &xstate->ymmh.ymmh_space[i], sizeof(xstate->ymmh.ymmh_space[0]));\n      }\n    }\n\n    const uint16_t CurrentOffset = (_mcontext->fpregs->swd >> 11) & 7;\n    for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_MMS; ++i) {\n      memcpy(&OutState->mm[(i + CurrentOffset) % 8], &_mcontext->fpregs->_st[i], sizeof(_mcontext->fpregs->_st[0]));\n    }\n\n    // Our thread is stopping\n    // We don't care about anything at this point\n    // Set the stack to our starting location when we entered the JIT and get out safely\n    _mcontext->gregs[REG_RSP] = ReturningStackLocation;\n\n    // Set the new PC\n    _mcontext->gregs[REG_RIP] = ::ThreadStopHandlerAddressPtr;\n\n    if (!Is64BitMode()) {\n      // Unset code segment so we can jump back in to 64-bit mode\n      _mcontext->gregs[REG_CSGSFS] = GlobalCodeSegmentEntry;\n    }\n\n    return true;\n  }\n\n  void Dispatch(uint64_t InitialRip) {\n    FEX::X86::Features Feature {};\n    Dispatcher(InitialRip, &ReturningStackLocation, CodeSegmentEntry, Feature.Feat_fsgsbase);\n  }\n\nprivate:\n  FEX_CONFIG_OPT(Is64BitMode, IS64BIT_MODE);\n  uint64_t GlobalCodeSegmentEntry {};\n  int CodeSegmentEntry {};\n  uint64_t ReturningStackLocation;\n\n  uint32_t MakeSelector(int Segment, bool LDT) const {\n    // Selector Index, Table Indicator (1 = LDT, 0 = GDT), CPL (3 = userland)\n    return (Segment << 3) | ((uint32_t)LDT << 2) | 3;\n  };\n\n  void Setup32BitCodeSegment() {\n    if (Is64BitMode()) {\n      return;\n    }\n\n    struct user_desc ldt {};\n    ldt.entry_number = 1;\n    // This is where HarnessCodeLoader loads code to\n    ldt.base_addr = 0;\n    ldt.limit = ~0U;   // No limit\n    ldt.seg_32bit = 1; // 32-bit\n    ldt.contents = MODIFY_LDT_CONTENTS_CODE;\n    ldt.read_exec_only = 0;\n    ldt.limit_in_pages = 1;\n    ldt.seg_not_present = 0;\n    ldt.useable = 1;\n    ldt.lm = 0; // Not-64-bit\n    int Res = modify_ldt(0x11, &ldt);\n    if (Res == -1) {\n      LogMan::Msg::EFmt(\"Couldn't load 32-bit LDT\");\n      return;\n    }\n\n    CodeSegmentEntry = MakeSelector(ldt.entry_number, 1);\n\n    // Make the data segment follow directly after the code segment\n    // Overlapping region makes it read/write\n    ldt.entry_number = 2;\n    // This is where HarnessCodeLoader loads code to\n    ldt.base_addr = 0;\n    ldt.limit = ~0U;   // No limit\n    ldt.seg_32bit = 1; // 32-bit\n    ldt.contents = MODIFY_LDT_CONTENTS_DATA;\n    ldt.read_exec_only = 0;\n    ldt.limit_in_pages = 1;\n    ldt.seg_not_present = 0;\n    ldt.useable = 1;\n    ldt.lm = 0; // Not-64-bit\n    Res = modify_ldt(0x11, &ldt);\n    if (Res == -1) {\n      LogMan::Msg::EFmt(\"Couldn't load 32-bit LDT\");\n      return;\n    }\n\n    // Stack entry overlapping data\n    ldt.entry_number = 3;\n    // This is where HarnessCodeLoader loads code to\n    ldt.base_addr = 0;\n    ldt.limit = ~0U;   // No limit\n    ldt.seg_32bit = 1; // 32-bit\n    ldt.contents = MODIFY_LDT_CONTENTS_STACK;\n    ldt.read_exec_only = 0;\n    ldt.limit_in_pages = 1;\n    ldt.seg_not_present = 0;\n    ldt.useable = 1;\n    ldt.lm = 0; // Not-64-bit\n    Res = modify_ldt(0x11, &ldt);\n    if (Res == -1) {\n      LogMan::Msg::EFmt(\"Couldn't load 32-bit LDT\");\n      return;\n    }\n  }\n};\n\nvoid RunAsHost(fextl::unique_ptr<FEX::HLE::SignalDelegator>& SignalDelegation, uintptr_t InitialRip, FEXCore::Core::CPUState* OutputState) {\n  x86HostRunner runner;\n  SignalDelegation->RegisterHostSignalHandler(\n    SIGSEGV,\n    [&runner, OutputState](FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext) -> bool {\n      return runner.HandleSIGSEGV(OutputState, Signal, info, ucontext);\n    },\n    true);\n\n  runner.Dispatch(InitialRip);\n}\n#else\nvoid RunAsHost(fextl::unique_ptr<FEX::HLE::SignalDelegator>& SignalDelegation, uintptr_t InitialRip, FEXCore::Core::CPUState* OutputState) {\n  LOGMAN_MSG_A_FMT(\"RunAsHost doesn't exist for this host\");\n}\n#endif\n"
  },
  {
    "path": "Source/Tools/TestHarnessRunner/TestHarnessRunner/HostRunner.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/fextl/memory.h>\n\nnamespace FEXCore::CPU {\nclass CPUBackend;\n}\nnamespace FEXCore::Context {\nclass Context;\n}\nnamespace FEXCore::Core {\nstruct InternalThreadState;\nstruct CPUState;\n} // namespace FEXCore::Core\n\nnamespace FEX::HLE {\nclass SignalDelegator;\n}\n\nvoid RunAsHost(fextl::unique_ptr<FEX::HLE::SignalDelegator>& SignalDelegation, uintptr_t InitialRip, FEXCore::Core::CPUState* OutputState);\n"
  },
  {
    "path": "Source/Tools/TestHarnessRunner/TestHarnessRunner.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: Bin|TestHarnessRunner\ndesc: Used to run Assembly tests\n$end_info$\n*/\n\n#ifdef _WIN32\n#include \"DummyHandlers.h\"\n#include \"ArchHelpers/WinContext.h\"\n#else\n#include \"LinuxSyscalls/LinuxAllocator.h\"\n#include \"LinuxSyscalls/Syscalls.h\"\n#include \"LinuxSyscalls/x32/Syscalls.h\"\n#include \"LinuxSyscalls/x64/Syscalls.h\"\n#include \"LinuxSyscalls/SignalDelegator.h\"\n#endif\n\n#include \"Common/HostFeatures.h\"\n#include \"Common/Linux/SBRKAllocations.h\"\n#include \"HarnessHelpers.h\"\n#include \"TestHarnessRunner/HostRunner.h\"\n\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Core/HostFeatures.h>\n#include <FEXCore/Core/SignalDelegator.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/ArchHelpers/Arm64.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/fextl/memory.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n#include <FEXHeaderUtils/Filesystem.h>\n\n#include <csetjmp>\n#include <cstdint>\n#include <errno.h>\n#include <signal.h>\n#include <stdio.h>\n#include <sys/types.h>\n#include <utility>\n\n#ifdef ARCHITECTURE_x86_64\n#include \"Common/X86Features.h\"\n#endif\n\nvoid MsgHandler(LogMan::DebugLevels Level, const char* Message) {\n  fextl::fmt::print(\"{} {}\\n\", LogMan::DebugLevelStr(Level), Message);\n}\n\nvoid AssertHandler(const char* Message) {\n  fextl::fmt::print(\"A {}\\n\", Message);\n\n  // make sure buffers are flushed\n  fflush(nullptr);\n}\n\nnamespace {\nstatic const fextl::vector<std::pair<const char*, FEXCore::Config::ConfigOption>> EnvConfigLookup = {{\n#define OPT_BASE(type, group, enum, json, default) {\"FEX_\" #enum, FEXCore::Config::ConfigOption::CONFIG_##enum},\n#include <FEXCore/Config/ConfigValues.inl>\n}};\n\n// Claims to be a local application config layer\nclass TestEnvLoader final : public FEXCore::Config::Layer {\npublic:\n  explicit TestEnvLoader(fextl::vector<std::pair<std::string_view, std::string_view>> _Env)\n    : FEXCore::Config::Layer(FEXCore::Config::LayerType::LAYER_LOCAL_APP)\n    , Env {std::move(_Env)} {\n    Load();\n  }\n\n  void Load() override {\n    fextl::unordered_map<std::string_view, std::string> EnvMap;\n    for (auto& Option : Env) {\n      std::string_view Key = Option.first;\n      std::string_view Value_View = Option.second;\n      std::optional<fextl::string> Value;\n\n#define ENVLOADER\n#include <FEXCore/Config/ConfigOptions.inl>\n\n      if (Value) {\n        EnvMap.insert_or_assign(Key, *Value);\n      } else {\n        EnvMap.insert_or_assign(Key, Value_View);\n      }\n    }\n\n    auto GetVar = [&](const std::string_view id) -> std::optional<std::string_view> {\n      const auto it = EnvMap.find(id);\n      if (it == EnvMap.end()) {\n        return std::nullopt;\n      }\n\n      return it->second;\n    };\n\n    for (auto& it : EnvConfigLookup) {\n      if (auto Value = GetVar(it.first); Value) {\n        Set(it.second, *Value);\n      }\n    }\n  }\n\nprivate:\n  fextl::vector<std::pair<std::string_view, std::string_view>> Env;\n};\n} // namespace\n\nnamespace LongJumpHandler {\nstatic jmp_buf LongJump {};\nstatic bool DidFault {};\n\n#ifndef _WIN32\nvoid RegisterLongJumpHandler(FEX::HLE::SignalDelegator* Handler) {\n  Handler->RegisterFrontendHostSignalHandler(\n    SIGSEGV,\n    [](FEXCore::Core::InternalThreadState* Thread, int Signal, void* info, void* ucontext) {\n      constexpr uint8_t HLT = 0xF4;\n      if (reinterpret_cast<uint8_t*>(Thread->CurrentFrame->State.rip)[0] != HLT) {\n        DidFault = true;\n        return false;\n      }\n\n      longjmp(LongJumpHandler::LongJump, 1);\n      return false;\n    },\n    true);\n}\n#else\nFEX::DummyHandlers::DummySignalDelegator* Handler;\n\nstatic void LongJumpHandler() {\n  longjmp(LongJump, 1);\n}\n\nLONG WINAPI VectoredExceptionHandler(struct _EXCEPTION_POINTERS* ExceptionInfo) {\n  auto Thread = Handler->GetBackingTLSThread();\n  PCONTEXT Context;\n  Context = ExceptionInfo->ContextRecord;\n\n  switch (ExceptionInfo->ExceptionRecord->ExceptionCode) {\n  case STATUS_DATATYPE_MISALIGNMENT: {\n    const auto PC = FEX::ArchHelpers::Context::GetPc(Context);\n    if (!Thread->CTX->IsAddressInCodeBuffer(Thread, PC)) {\n      // Wasn't a sigbus in JIT code\n      return EXCEPTION_CONTINUE_SEARCH;\n    }\n\n    const auto Result = FEXCore::ArchHelpers::Arm64::HandleUnalignedAccess(true, PC, FEX::ArchHelpers::Context::GetArmGPRs(Context));\n    FEX::ArchHelpers::Context::SetPc(Context, PC + Result.value_or(0));\n    return Result ? EXCEPTION_CONTINUE_EXECUTION : EXCEPTION_CONTINUE_SEARCH;\n  }\n  case STATUS_ACCESS_VIOLATION: {\n    constexpr uint8_t HLT = 0xF4;\n    if (reinterpret_cast<uint8_t*>(Thread->CurrentFrame->State.rip)[0] != HLT) {\n      DidFault = true;\n      return EXCEPTION_CONTINUE_SEARCH;\n    }\n\n    FEX::ArchHelpers::Context::SetPc(Context, reinterpret_cast<uint64_t>(LongJumpHandler));\n    return EXCEPTION_CONTINUE_EXECUTION;\n  }\n  default: break;\n  }\n\n  printf(\"!Fault!\\n\");\n  printf(\"\\tExceptionCode: 0x%lx\\n\", ExceptionInfo->ExceptionRecord->ExceptionCode);\n  printf(\"\\tExceptionFlags: 0x%lx\\n\", ExceptionInfo->ExceptionRecord->ExceptionFlags);\n  printf(\"\\tExceptionRecord: 0x%p\\n\", ExceptionInfo->ExceptionRecord->ExceptionRecord);\n  printf(\"\\tExceptionAddress: 0x%p\\n\", ExceptionInfo->ExceptionRecord->ExceptionAddress);\n  printf(\"\\tNumberParameters: 0x%lx\\n\", ExceptionInfo->ExceptionRecord->NumberParameters);\n\n  return EXCEPTION_CONTINUE_SEARCH;\n}\n\nvoid RegisterLongJumpHandler(FEX::DummyHandlers::DummySignalDelegator* Handler) {\n  // Install VEH handler.\n  AddVectoredExceptionHandler(0, VectoredExceptionHandler);\n\n  LongJumpHandler::Handler = Handler;\n}\n#endif\n} // namespace LongJumpHandler\n\nint main(int argc, char** argv, char** const envp) {\n#ifndef _WIN32\n  auto SBRKPointer = FEX::SBRKAllocations::DisableSBRKAllocations();\n#endif\n  FEXCore::Allocator::GLIBCScopedFault GLIBFaultScope;\n  LogMan::Throw::InstallHandler(AssertHandler);\n  LogMan::Msg::InstallHandler(MsgHandler);\n\n  FEX::Config::InitializeConfigs(FEX::Config::PortableInformation {});\n  FEXCore::Config::Initialize();\n  FEXCore::Config::AddLayer(FEX::Config::CreateEnvironmentLayer(envp));\n  FEXCore::Config::Load();\n\n  if (argc < 3) {\n    LogMan::Msg::EFmt(\"Not enough arguments\");\n    return -1;\n  }\n\n  auto Filename = argv[1];\n  auto ConfigFile = argv[2];\n\n  if (!FHU::Filesystem::Exists(Filename)) {\n    LogMan::Msg::EFmt(\"File {} does not exist\", Filename);\n    return -1;\n  }\n\n  if (!FHU::Filesystem::Exists(ConfigFile)) {\n    LogMan::Msg::EFmt(\"File {} does not exist\", ConfigFile);\n    return -1;\n  }\n\n  FEX::HarnessHelper::HarnessCodeLoader Loader {Filename, ConfigFile};\n\n  // Adds in environment options from the test harness config\n  FEXCore::Config::AddLayer(fextl::make_unique<TestEnvLoader>(Loader.GetEnvironmentOptions()));\n  FEXCore::Config::ReloadMetaLayer();\n\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_IS64BIT_MODE, Loader.Is64BitMode() ? \"1\" : \"0\");\n#ifdef VIXL_SIMULATOR\n  // If running under the vixl simulator, ensure that indirect runtime calls are enabled.\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_DISABLE_VIXL_INDIRECT_RUNTIME_CALLS, \"0\");\n#endif\n\n#ifndef _WIN32\n  fextl::unique_ptr<FEX::HLE::MemAllocator> Allocator;\n\n  if (!Loader.Is64BitMode()) {\n    // Setup our userspace allocator\n    const auto PageSize = sysconf(_SC_PAGESIZE);\n    FEXCore::Allocator::SetupHooks(PageSize > 0 ? PageSize : FEXCore::Utils::FEX_PAGE_SIZE);\n    Allocator = FEX::HLE::CreatePassthroughAllocator();\n  }\n#endif\n\n  bool SupportsAVX = false;\n  FEXCore::Core::CPUState State;\n\n  auto HostFeatures = FEX::FetchHostFeatures();\n  auto CTX = FEXCore::Context::Context::CreateNewContext(HostFeatures);\n\n#ifndef _WIN32\n  auto SignalDelegation = FEX::HLE::CreateSignalDelegator(CTX.get(), {}, HostFeatures.SupportsAVX);\n#else\n  // Enable exit on HLT while Wine's longjump is broken.\n  //\n  // Once they fix longjump, we can remove this.\n  CTX->EnableExitOnHLT();\n  auto SignalDelegation = FEX::WindowsHandlers::CreateSignalDelegator();\n#endif\n\n  // Skip any tests that the host doesn't support features for\n  SupportsAVX = HostFeatures.SupportsAVX;\n\n  bool TestUnsupported = (!SupportsAVX && Loader.RequiresAVX()) || (!HostFeatures.SupportsRAND && Loader.RequiresRAND()) ||\n                         (!HostFeatures.SupportsSHA && Loader.RequiresSHA()) || (!HostFeatures.SupportsCLZERO && Loader.RequiresCLZERO()) ||\n                         (!HostFeatures.SupportsAES256 && Loader.RequiresAES256()) || (!HostFeatures.SupportsAFP && Loader.RequiresAFP());\n\n\n  bool IsHostRunner = false;\n#if !defined(VIXL_SIMULATOR) && defined(ARCHITECTURE_x86_64)\n  IsHostRunner = true;\n  ///< Features that are only unsupported when running using the HostRunner and the CI machine doesn't support the feature getting tested.\n  FEX::X86::Features Feature {};\n  const bool Supports3DNow = Feature.Feat_3dnow;\n  const bool SupportsSSE4A = Feature.Feat_sse4a;\n  const bool SupportsBMI1 = Feature.Feat_bmi1;\n  const bool SupportsBMI2 = Feature.Feat_bmi2;\n  const bool SupportsCLWB = Feature.Feat_clwb;\n  const bool SupportsSSSE3 = Feature.Feat_ssse3;\n  const bool SupportsSSE4_1 = Feature.Feat_sse4_1;\n  const bool SupportsSSE4_2 = Feature.Feat_sse4_2;\n  const bool SupportsAES = Feature.Feat_aes;\n  const bool SupportsPCLMUL = Feature.Feat_pclmulqdq;\n  const bool SupportsMOVBE = Feature.Feat_movbe;\n  const bool SupportsADX = Feature.Feat_adx;\n  const bool SupportsXSAVE = Feature.Feat_xsave;\n  const bool SupportsRDPID = Feature.Feat_rdpid;\n  const bool SupportsCLFLOPT = Feature.Feat_clflopt;\n  const bool SupportsFSGSBase = Feature.Feat_fsgsbase;\n\n  TestUnsupported |=\n    (!Supports3DNow && Loader.Requires3DNow()) || (!SupportsSSE4A && Loader.RequiresSSE4A()) || (!SupportsBMI1 && Loader.RequiresBMI1()) ||\n    (!SupportsBMI2 && Loader.RequiresBMI2()) || (!SupportsCLWB && Loader.RequiresCLWB()) || (!SupportsSSSE3 && Loader.RequiresSSSE3()) ||\n    (!SupportsSSE4_1 && Loader.RequiresSSE4_1()) || (!SupportsSSE4_2 && Loader.RequiresSSE4_2()) ||\n    (!SupportsAES && Loader.RequiresAES()) || (!SupportsPCLMUL && Loader.RequiresPCLMUL()) || (!SupportsMOVBE && Loader.RequiresMOVBE()) ||\n    (!SupportsADX && Loader.RequiresADX()) || (!SupportsXSAVE && Loader.RequiresXSAVE()) || (!SupportsRDPID && Loader.RequiresRDPID()) ||\n    (!SupportsCLFLOPT && Loader.RequiresCLFLOPT()) || (!SupportsFSGSBase && Loader.RequiresFSGSBase()) || Loader.RequiresEMMI();\n#endif\n\n#ifdef _WIN32\n  TestUnsupported |= Loader.RequiresLinux();\n#endif\n\n  if (TestUnsupported) {\n    return 0;\n  }\n\n#ifndef _WIN32\n  auto SyscallHandler = Loader.Is64BitMode() ? FEX::HLE::x64::CreateHandler(CTX.get(), SignalDelegation.get(), nullptr) :\n                                               FEX::HLE::x32::CreateHandler(CTX.get(), SignalDelegation.get(), nullptr, std::move(Allocator));\n\n  auto DoMmap = [&](uint64_t Address, size_t Size) -> void* {\n    void* Result = SyscallHandler->GuestMmap(nullptr, (void*)Address, Size, PROT_READ | PROT_WRITE | PROT_EXEC,\n                                             MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0);\n    LOGMAN_THROW_A_FMT(Result == reinterpret_cast<void*>(Address), \"Map Memory mmap failed\");\n    return Result;\n  };\n\n#else\n  auto SyscallHandler = FEX::WindowsHandlers::CreateSyscallHandler();\n\n  auto DoMMap = [](uint64_t Address, size_t Size) -> void* {\n    void* Result = FEXCore::Allocator::VirtualAlloc(reinterpret_cast<void*>(Address), Size, true);\n    LOGMAN_THROW_A_FMT(Result == reinterpret_cast<void*>(Address), \"Map Memory mmap failed\");\n    return Result;\n  };\n#endif\n\n  CTX->SetSignalDelegator(SignalDelegation.get());\n  CTX->SetSyscallHandler(SyscallHandler.get());\n\n  if (!CTX->InitCore()) {\n    return 1;\n  }\n\n  if (!IsHostRunner) {\n    LongJumpHandler::RegisterLongJumpHandler(SignalDelegation.get());\n\n    // Run through FEX\n    if (!Loader.MapMemory(DoMmap)) {\n      // failed to map\n      LogMan::Msg::EFmt(\"Failed to map {}-bit elf file.\", Loader.Is64BitMode() ? 64 : 32);\n      return -ENOEXEC;\n    }\n\n    auto ParentThread = SyscallHandler->TM.CreateThread(Loader.DefaultRIP(), 0);\n    SyscallHandler->TM.TrackThread(ParentThread);\n    SignalDelegation->RegisterTLSState(ParentThread);\n\n    if (!ParentThread) {\n      return 1;\n    }\n\n    int LongJumpVal = setjmp(LongJumpHandler::LongJump);\n    if (!LongJumpVal) {\n      CTX->ExecuteThread(ParentThread->Thread);\n    }\n\n    // Just re-use compare state. It also checks against the expected values in config.\n    memcpy(&State, &ParentThread->Thread->CurrentFrame->State, sizeof(State));\n\n    __uint128_t XMM_Low[FEXCore::Core::CPUState::NUM_XMMS];\n    if (SupportsAVX) {\n      ///< Reconstruct the XMM registers even if they are in split view, then remerge them.\n      __uint128_t YMM_High[FEXCore::Core::CPUState::NUM_XMMS];\n      CTX->ReconstructXMMRegisters(ParentThread->Thread, XMM_Low, YMM_High);\n      for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_XMMS; ++i) {\n        memcpy(&State.xmm.avx.data[i][0], &XMM_Low[i], sizeof(__uint128_t));\n        memcpy(&State.xmm.avx.data[i][2], &YMM_High[i], sizeof(__uint128_t));\n      }\n    } else {\n      CTX->ReconstructXMMRegisters(ParentThread->Thread, reinterpret_cast<__uint128_t*>(State.xmm.sse.data), nullptr);\n    }\n\n    SignalDelegation->UninstallTLSState(ParentThread);\n    FEX::HLE::_SyscallHandler->TM.DestroyThread(ParentThread, true);\n  }\n#ifndef _WIN32\n  else {\n    // Run as host\n    SupportsAVX = true;\n    auto ParentThread = SyscallHandler->TM.CreateThread(Loader.DefaultRIP(), 0);\n    SyscallHandler->TM.TrackThread(ParentThread);\n    SignalDelegation->RegisterTLSState(ParentThread);\n\n    auto DoMmap = [&](uint64_t Address, size_t Size) -> void* {\n      void* Result = mmap((void*)Address, Size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0);\n      LOGMAN_THROW_A_FMT(Result == reinterpret_cast<void*>(Address), \"Map Memory mmap failed\");\n      return Result;\n    };\n    if (!Loader.MapMemory(DoMmap)) {\n      // failed to map\n      LogMan::Msg::EFmt(\"Failed to map {}-bit elf file.\", Loader.Is64BitMode() ? 64 : 32);\n      return -ENOEXEC;\n    }\n\n    RunAsHost(SignalDelegation, Loader.DefaultRIP(), &State);\n    SignalDelegation->UninstallTLSState(ParentThread);\n    FEX::HLE::_SyscallHandler->TM.DestroyThread(ParentThread, true);\n  }\n#endif\n\n  SyscallHandler.reset();\n\n  bool Passed = !LongJumpHandler::DidFault && Loader.CompareStates(&State, nullptr, SupportsAVX);\n\n  LogMan::Msg::IFmt(\"Faulted? {}\", LongJumpHandler::DidFault ? \"Yes\" : \"No\");\n  LogMan::Msg::IFmt(\"Passed? {}\", Passed ? \"Yes\" : \"No\");\n\n\n  SignalDelegation.reset();\n\n  FEXCore::Config::Shutdown();\n\n  LogMan::Throw::UnInstallHandler();\n  LogMan::Msg::UnInstallHandler();\n\n#ifndef _WIN32\n  FEXCore::Allocator::ClearHooks();\n\n  FEX::SBRKAllocations::ReenableSBRKAllocations(SBRKPointer);\n#endif\n\n  return Passed ? 0 : -1;\n}\n"
  },
  {
    "path": "Source/Tools/pidof/CMakeLists.txt",
    "content": "add_executable(FEXpidof pidof.cpp)\n\ntarget_link_libraries(FEXpidof PRIVATE\n  cpp-optparse\n  JemallocDummy\n  fmt::fmt\n  range-v3::range-v3)\n\nLinkerGC(FEXpidof)\n\ninstall(TARGETS FEXpidof RUNTIME\n  DESTINATION bin\n  COMPONENT Runtime)\n"
  },
  {
    "path": "Source/Tools/pidof/pidof.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"OptionParser.h\"\n\n#include <FEXHeaderUtils/Filesystem.h>\n\n#include <charconv>\n#include <cstring>\n#include <filesystem>\n#include <fmt/format.h>\n#include <fstream>\n#include <string>\n#include <unordered_set>\n\n#include <range/v3/view/split.hpp>\n#include <range/v3/view/transform.hpp>\n\nnamespace Config {\n\nbool SingleShot {};\nbool SkipZombie {true};\nbool DoNotDisplay {};\nbool AllFEX {};\nstd::string Separator {\" \"};\nstd::unordered_set<int64_t> OmitPids;\nstd::unordered_set<std::string> Programs;\n\nvoid LoadOptions(int argc, char** argv) {\n  optparse::OptionParser Parser {};\n\n  Parser.add_option(\"-s\").help(\"Single shot - Only returns one pid\").action(\"store_true\").set_default(SingleShot);\n\n  Parser.add_option(\"-q\")\n    .help(\"Do not display matched PIDs to stdout. Simply exit with status of true or false if a PID was found\")\n    .action(\"store_true\")\n    .set_default(DoNotDisplay);\n\n  Parser.add_option(\"-z\").help(\"Try to detect zombie processes - Usually zombie processes are skipped\").action(\"store_false\").set_default(SkipZombie);\n\n  Parser.add_option(\"-d\").help(\"Use a different separator if more than one pid is show - Default is space\").set_default(Separator);\n\n  Parser.add_option(\"-o\").help(\"Ignore processes with matched pids\").action(\"append\");\n\n  optparse::Values Options = Parser.parse_args(argc, argv);\n\n  SingleShot = Options.get(\"s\");\n  DoNotDisplay = Options.get(\"q\");\n  SkipZombie = Options.get(\"z\");\n  Separator = Options[\"d\"];\n\n  auto to_string_view = [](auto rng) {\n    return std::string_view(&*rng.begin(), ranges::distance(rng));\n  };\n\n  for (const auto& Omit : Options.all(\"o\")) {\n    for (auto pid_str : ranges::views::split(Omit, ',') | ranges::views::transform(to_string_view)) {\n      int64_t pid;\n      auto ConvResult = std::from_chars(pid_str.data(), pid_str.data() + pid_str.size(), pid, 10);\n\n      // Invalid pid, skip.\n      if (ConvResult.ec == std::errc::invalid_argument) {\n        continue;\n      }\n\n      OmitPids.emplace(pid);\n    }\n  }\n\n  for (const auto& Program : Parser.args()) {\n    if (Program == \"FEX\") {\n      AllFEX = true;\n    }\n    Programs.emplace(Program);\n  }\n}\n} // namespace Config\n\nbool FindWineFEXApplication(int64_t PID, std::string_view exe, const std::vector<std::string_view>& Args) {\n  // Walk the arguments and see if anything contains wine.\n  bool FoundWine = false;\n\n  if (exe.find(\"wine\") != exe.npos) {\n    FoundWine = true;\n  }\n\n  if (!FoundWine) {\n    for (auto Arg : Args) {\n      if (Arg.find(\"wine\") != Arg.npos) {\n        FoundWine = true;\n        break;\n      }\n    }\n  }\n\n  if (!FoundWine) {\n    return false;\n  }\n\n  // Wine was found, scan the mapped files to see if anything mapped \"libarm64ecfex.dll\" or \"libwow64fex.dll\"\n\n  std::error_code ec {};\n  auto dir_iter = std::filesystem::directory_iterator(fmt::format(\"/proc/{}/map_files\", PID), ec);\n  // If error reading symlink then skip.\n  if (ec) {\n    return false;\n  }\n\n  for (const auto& Entry : dir_iter) {\n    // If not a symlink then skip.\n    if (!Entry.is_symlink()) {\n      continue;\n    }\n\n    const auto symlink_path = std::filesystem::read_symlink(Entry.path(), ec);\n    // If error reading symlink then skip.\n    if (ec) {\n      continue;\n    }\n\n    const auto filename = symlink_path.filename().string();\n    if (filename.find(\"arm64ecfex.dll\") != filename.npos || filename.find(\"wow64fex.dll\") != filename.npos) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nstruct PIDInfo {\n  int64_t pid;\n  std::string cmdline;\n  std::string exe_link;\n  char State;\n};\n\nstd::vector<PIDInfo> PIDs;\n\nstatic void IteratePids() {\n  // Iterate over all pids, storing the data for investigating afterwards.\n  for (const auto& Entry : std::filesystem::directory_iterator(\"/proc/\")) {\n    // If not a directory then skip.\n    if (!Entry.is_directory()) {\n      continue;\n    }\n\n    auto CMDLinePath = Entry.path() / \"cmdline\";\n    auto StatusPath = Entry.path() / \"status\";\n    auto ExePath = Entry.path() / \"exe\";\n\n    // If cmdline doesn't exist then skip.\n    std::error_code ec;\n    if (!std::filesystem::exists(CMDLinePath, ec) || ec) {\n      continue;\n    }\n\n    auto Filename = Entry.path().filename().string();\n    int64_t pid;\n    auto ConvResult = std::from_chars(Filename.data(), Filename.data() + Filename.size(), pid, 10);\n\n    // If the filename couldn't be converted to a PID then skip.\n    // Happens with folders like `self` and a few other folders in this directory.\n    if (ConvResult.ec == std::errc::invalid_argument) {\n      continue;\n    }\n\n    std::ostringstream CMDLineData;\n    {\n      std::ifstream fs(CMDLinePath, std::ios_base::in | std::ios_base::binary);\n\n      if (!fs.is_open()) {\n        continue;\n      }\n\n      CMDLineData << fs.rdbuf();\n\n      // If cmdline was empty then skip.\n      if (CMDLineData.str().empty()) {\n        continue;\n      }\n    }\n\n    std::string exe_link = std::filesystem::read_symlink(ExePath, ec);\n\n    auto deleted_pos = exe_link.find(\" (deleted)\");\n    if (deleted_pos != std::string::npos) {\n      exe_link = exe_link.substr(0, deleted_pos);\n    }\n\n    // Couldn't read exe path? skip.\n    if (ec) {\n      continue;\n    }\n\n    // Read state\n    char State {};\n\n    {\n      std::ifstream fs(StatusPath, std::ios_base::in | std::ios_base::binary);\n\n      if (!fs.is_open()) {\n        continue;\n      }\n\n      std::string Line;\n\n      while (std::getline(fs, Line)) {\n        if (fs.eof()) {\n          break;\n        }\n\n        if (Line.find(\"State\") == Line.npos) {\n          continue;\n        }\n\n        if (sscanf(Line.c_str(), \"State: %c\", &State) == 1) {\n          break;\n        }\n      }\n    }\n\n    PIDs.emplace_back(PIDInfo {\n      .pid = pid,\n      .cmdline = CMDLineData.str(),\n      .exe_link = std::move(exe_link),\n      .State = State,\n    });\n  }\n}\n\nint main(int argc, char** argv) {\n  Config::LoadOptions(argc, argv);\n\n  IteratePids();\n\n  std::unordered_set<int64_t> MatchedPIDs;\n  for (const auto& pid : PIDs) {\n    if (pid.State == 'Z' && Config::SkipZombie) {\n      continue;\n    }\n    if (Config::OmitPids.contains(pid.pid)) {\n      continue;\n    }\n\n    std::vector<std::string_view> Args;\n    const char* arg = pid.cmdline.data();\n\n    while (arg[0]) {\n      Args.emplace_back(arg);\n      arg += strlen(arg) + 1;\n    }\n\n    struct ProgramPair {\n      std::string_view ProgramPath;\n      std::string_view ProgramFilename;\n    };\n\n    auto FindEmulatedWineArgument = [](int32_t BeginningArg, const std::vector<std::string_view>& Args, bool Wine) -> ProgramPair {\n      std::string_view ProgramName = Args[BeginningArg];\n\n      for (size_t i = BeginningArg; i < Args.size(); ++i) {\n        auto CurrentProgramName = FHU::Filesystem::GetFilename(Args[i]);\n\n        if (CurrentProgramName == \"wine-preloader\" || CurrentProgramName == \"wine64-preloader\") {\n          // Wine preloader is required to be in the format of `wine-preloader <wine executable>`\n          // The preloader doesn't execve the executable, instead maps it directly itself\n          // Skip the next argument since we know it is wine (potentially with custom wine executable name)\n          ++i;\n          Wine = true;\n        } else if (CurrentProgramName == \"wine\" || CurrentProgramName == \"wine64\") {\n          // Next argument, this isn't the program we want\n          //\n          // If we are running wine or wine64 then we should check the next argument for the application name instead.\n          // wine will change the active program name with `setprogname` or `prctl(PR_SET_NAME`.\n          // Since FEX needs this data far earlier than libraries we need a different check.\n          Wine = true;\n        } else {\n          if (Wine == true) {\n            // If this was path separated with '\\' then we need to check that.\n            auto WinSeparator = CurrentProgramName.find_last_of('\\\\');\n            if (WinSeparator != CurrentProgramName.npos) {\n              // Used windows separators\n              CurrentProgramName = CurrentProgramName.substr(WinSeparator + 1);\n            }\n\n            return {\n              .ProgramPath = Args[i],\n              .ProgramFilename = CurrentProgramName,\n            };\n          }\n          break;\n        }\n      }\n\n      auto ProgramFilename = ProgramName;\n      auto Separator = ProgramName.find_last_of('/');\n      if (Separator != ProgramName.npos) {\n        // Used windows separators\n        ProgramFilename = ProgramFilename.substr(Separator + 1);\n      }\n\n      return {\n        .ProgramPath = ProgramName,\n        .ProgramFilename = ProgramFilename,\n      };\n    };\n\n    int32_t ProgramArg = -1;\n    if (pid.exe_link.ends_with(\"FEX\")) {\n      // Skip the first argument if it contains `FEX`, otherwise the application name begins at 0.\n      ProgramArg = Args[0].ends_with(\"FEX\") ? 1 : 0;\n    }\n\n    // If matching all \"FEX\" instances then add to the matched list.\n    if (ProgramArg != -1 && Config::AllFEX) {\n      MatchedPIDs.emplace(pid.pid);\n      continue;\n    }\n\n    bool IsWine = false;\n    // If we still haven't found a FEX path then this might be an arm64ec FEX application.\n    // The only way to know for sure is the walk the mapped files of the process and check if FEX is mapped.\n    if (FindWineFEXApplication(pid.pid, pid.exe_link, Args)) {\n      // Search from the start.\n      ProgramArg = 0;\n      IsWine = true;\n    }\n\n    if (ProgramArg == -1 || ProgramArg >= Args.size()) {\n      continue;\n    }\n\n    // If matching all \"FEX\" instances then add arm64ec/wow64 FEX to the matched list.\n    if (ProgramArg != -1 && Config::AllFEX) {\n      MatchedPIDs.emplace(pid.pid);\n      continue;\n    }\n\n    ProgramPair Arg = FindEmulatedWineArgument(ProgramArg, Args, IsWine);\n    bool Matched = false;\n    for (const auto& CompareProgram : Config::Programs) {\n      auto CompareProgramFilename = std::filesystem::path(CompareProgram).filename();\n      if (CompareProgram == Arg.ProgramFilename || CompareProgram == Arg.ProgramPath || CompareProgramFilename == Arg.ProgramFilename) {\n        MatchedPIDs.emplace(pid.pid);\n        Matched = true;\n        break;\n      }\n    }\n\n    if (Matched && Config::SingleShot) {\n      break;\n    }\n  }\n\n  if (!MatchedPIDs.empty() && !Config::DoNotDisplay) {\n    bool first = true;\n    for (const auto& MatchedPID : MatchedPIDs) {\n      if (first) {\n        fmt::print(\"{}\", MatchedPID);\n        first = false;\n      } else {\n        fmt::print(\"{}{}\", Config::Separator, MatchedPID);\n      }\n    }\n    fmt::print(\"\\n\");\n  }\n\n  return MatchedPIDs.empty() ? 1 : 0;\n}\n"
  },
  {
    "path": "Source/Windows/ARM64EC/BTInterface.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <windef.h>\n#include <ntstatus.h>\n#include <winternl.h>\n\nextern \"C\" {\nNTSTATUS STDMETHODCALLTYPE ProcessInit();\nvoid STDMETHODCALLTYPE ProcessTerm(HANDLE Handle, BOOL After, NTSTATUS Status);\nNTSTATUS STDMETHODCALLTYPE ThreadInit();\nNTSTATUS STDMETHODCALLTYPE ThreadTerm(HANDLE Thread, LONG ExitCode);\nNTSTATUS STDMETHODCALLTYPE ResetToConsistentState(EXCEPTION_RECORD* Exception, CONTEXT* GuestContext, ARM64_NT_CONTEXT* NativeContext);\nvoid STDMETHODCALLTYPE NotifyMemoryAlloc(void* Address, SIZE_T Size, ULONG Type, ULONG Prot, BOOL After, NTSTATUS Status);\nvoid STDMETHODCALLTYPE NotifyMemoryFree(void* Address, SIZE_T Size, ULONG FreeType, BOOL After, NTSTATUS Status);\nvoid STDMETHODCALLTYPE NotifyMemoryProtect(void* Address, SIZE_T Size, ULONG NewProt, BOOL After, NTSTATUS Status);\nNTSTATUS STDMETHODCALLTYPE NotifyMapViewOfSection(void* Unk1, void* Address, void* Unk2, SIZE_T Size, ULONG AllocType, ULONG Prot);\nvoid STDMETHODCALLTYPE NotifyUnmapViewOfSection(void* Address, BOOL After, NTSTATUS Status);\nvoid STDMETHODCALLTYPE FlushInstructionCacheHeavy(const void* Address, SIZE_T Size);\nvoid STDMETHODCALLTYPE BTCpu64FlushInstructionCache(const void* Address, SIZE_T Size);\nvoid STDMETHODCALLTYPE BTCpu64NotifyMemoryDirty(void* Address, SIZE_T Size);\nvoid STDMETHODCALLTYPE BTCpu64NotifyReadFile(HANDLE Handle, void* Address, SIZE_T Size, BOOL After, NTSTATUS Status);\nBOOLEAN STDMETHODCALLTYPE BTCpu64IsProcessorFeaturePresent(UINT Feature);\nvoid STDMETHODCALLTYPE UpdateProcessorInformation(SYSTEM_CPU_INFORMATION* Info);\n}\n"
  },
  {
    "path": "Source/Windows/ARM64EC/CMakeLists.txt",
    "content": "add_library(arm64ecfex SHARED\n  Module.cpp\n  Module.S\n  libarm64ecfex.def\n  $<TARGET_OBJECTS:FEXCore_object>)\n\npatch_library_wine(arm64ecfex)\n\ntarget_include_directories(arm64ecfex PRIVATE\n  \"${CMAKE_SOURCE_DIR}/Source/Windows/include/\"\n  \"${CMAKE_SOURCE_DIR}/Source/\"\n  \"${CMAKE_SOURCE_DIR}/Source/Windows/\")\n\ntarget_link_libraries(arm64ecfex PRIVATE\n  FEXCore_Base\n  Common\n  CommonTools\n  CommonWindows\n  CommonWindowsRuntime\n  ntdll_ex)\n\ntarget_link_options(arm64ecfex PRIVATE -static -nostdlib -nostartfiles -nodefaultlibs -lc++ -lc++abi -lunwind)\ntarget_link_libraries(arm64ecfex PRIVATE ${LIBGCC_PATH})\ninstall(TARGETS arm64ecfex RUNTIME\n  DESTINATION ${CMAKE_INSTALL_LIBDIR}\n  COMPONENT Runtime)\n"
  },
  {
    "path": "Source/Windows/ARM64EC/Module.S",
    "content": ".text\n.balign 16\n\n  // __os_arm64x_x64_jump in ARM64EC docs\n  // Expects target code address in x9\n.globl DispatchJump\nDispatchJump:\n  str lr, [sp, #-8]! // Push return address to stack, this will be popped by the x86 RET instr.\n  b check_target_ec\n\n  // __os_arm64x_dispatch_ret in ARM64EC docs\n  // Expects target code address in lr\n.globl RetToEntryThunk\nRetToEntryThunk:\n  mov x9, lr\n\ncheck_target_ec:\n  // Check if target is in fact x86 code\n  ldr x16, [x18, #0x60] // TEB->PEB\n  ldr x16, [x16, #0x368] // PEB->EcCodeBitMap\n  lsr x17, x9, #15\n  and x17, x17, #0x1fffffffffff8\n  ldr x16, [x16, x17]\n  lsr x17, x9, #12\n  lsr x16, x16, x17\n  tbnz x16, #0, ExitFunctionEC\n  b enter_jit\n\n  // __os_arm64x_dispatch_call_no_redirect in ARM64EC docs\n  // Expects target code address in x9, and to be called using a 'blr x16' instruction.\n.globl ExitToX64\nExitToX64:\n  str lr, [sp, #-8]! // Push return address to stack, this will be popped by the x86 RET instr.\n\nenter_jit:\n  ldr x17, [x18, #0x1788] // TEB->ChpeV2CpuAreaInfo\n  mov w16, #1\n  strb w16, [x17, #0x0] // ChpeV2CpuAreaInfo->InSimulation\n  ldr x16, [x17, #0x40] // ChpeV2CpuAreaInfo->EmulatorData[2] - DispatcherLoopTopEnterEC\n  br x16 // DispatcherLoopTopEnterEC(RIP:x9, CPUArea:x17)\n\n  // Invoked by KiUserEmulationDispatcher after e.g. an NtContinue to x86 code\n.global BeginSimulation\nBeginSimulation:\n  ldr x17, [x18, #0x1788] // TEB->ChpeV2CpuAreaInfo\n  ldr x16, [x17, #0x8] // ChpeV2CpuAreaInfo->EmulatorStackBase\n  mov sp, x16\n  ldr x0, [x17, #0x18] // ChpeV2CpuAreaInfo->ContextAmd64\n  bl \"#SyncThreadContext\"\n  ldr x17, [x18, #0x1788] // TEB->ChpeV2CpuAreaInfo\n  ldr x16, [x17, #0x48] // ChpeV2CpuAreaInfo->EmulatorData[3] - DispatcherLoopTopEnterECFillSRA\n  mov x11, #0 // Zero ENTRY_FILL_SRA_SINGLE_INST_REG to avoid single step\n  br x16 // DispatcherLoopTopEnterECFillSRA(SingleInst:x10, CPUArea:x17)\n\n  // Called into by FEXCore\n  // Expects the target code address in x9\n.global ExitFunctionEC\nExitFunctionEC:\n  // Clear any the AFP NEP and AH bits in FPCR as native code won't expect their behaviour.\n  mrs x17, fpcr\n  and x17, x17, #~6 // NEP + AH\n  msr fpcr, x17\n  ldr x17, [x18, #0x1788] // TEB->ChpeV2CpuAreaInfo\n  strb wzr, [x17, #0x0] // ChpeV2CpuAreaInfo->InSimulation\n  ldr x17, [x17, #0x20] // ChpeV2CpuAreaInfo->SuspendDoorbell\n  ldr w17, [x17]\n  cbz w17, no_suspend\n.global ExitFunctionSuspendPoint\nExitFunctionSuspendPoint:\n  brk #0xCAFE\n  // Will resume here\nno_suspend:\n  // Either return to an exit thunk (return to ARM64EC function) or call an entry thunk (call to ARM64EC function).\n  // It is assumed that a 'blr x16' instruction is only ever used to call into x86 code from an exit thunk, and that all\n  // exported ARM64EC functions have a 4-byte offset to their entry thunk immediately before their first instruction.\n  mov x17, x9\n  mov w16, #0x200\n  movk w16, #0xd63f, lsl 16 // blr x16\n  ldursw x23, [x17, #-0x4] // Load either the entry thunk offset or the calling instruction.\n  cmp w23, w16\n  beq ret_sp_aligned\n\n  and x23, x23, #-0x4\n  add x17, x17, x23 // Resolve entry thunk address.\n\n  mov x4, sp\n  tbz x4, #3, ret_sp_misaligned\n  ldr lr, [x4], #0x8 // Pop the return address into lr.\n  mov sp, x4\n\nret_sp_aligned:\n  br x17\n\nret_sp_misaligned:\n  // In the case of the x64 caller leaving sp only 8-byte aligned, leave the return address on the stack to keep 16-byte\n  // alignment and have the callee return to an x86 ret instruction. FEX can then return to the actual caller keeping\n  // the misaligned RSP.\n  adrp lr, X64ReturnInstr\n  ldr lr, [lr, #:lo12:X64ReturnInstr]\n  br x17\n\n  // Makes a wrapper for calling a system call directly, skipping the usual ntdll thunks\n#define HASH #\n#define DIRECT_SYSCALL_WRAPPER(Name, WineIdName, WindowsId) \\\n  .global Name; \\\n  Name:; \\\n    adrp x16, WineSyscallDispatcher; \\\n    ldr x16, [x16, HASH:lo12:WineSyscallDispatcher]; \\\n    cbz x16, 1f; \\\n    mov x9, x30; \\\n    adrp x8, WineIdName; \\\n    ldr x8, [x8, HASH:lo12:WineIdName]; \\\n    blr x16; \\\n    ret; \\\n  1:; \\\n    svc HASH WindowsId; \\\n    ret\n\n  // Allows for continuing from a full native context, as the NTDLL NtContinue export takes in an x64 context with EC and\n  // the conversion to that loses the ARM64EC ABI-disallowed registers that FEX uses.\nDIRECT_SYSCALL_WRAPPER(\"#NtContinueNative\", WineNtContinueSyscallId, 0x43)\n\n  // Both of these are wrapped as FEX needs them to setup its call checker at startup time and their NTDLL thunks could\n  // already be patched by then (and because the call checker isn't installed, their patched x86 versions would be invoked\n  // when called by FEX).\nDIRECT_SYSCALL_WRAPPER(\"#NtAllocateVirtualMemoryNative\", WineNtAllocateVirtualMemorySyscallId, 0x18)\nDIRECT_SYSCALL_WRAPPER(\"#NtProtectVirtualMemoryNative\", WineNtProtectVirtualMemorySyscallId, 0x50)\n\n  // A replacement for the standard ARM64EC call checker that ignores any FFS patches and always redirects to a function's\n  // native implementation. As the only library FEX calls into is NTDLL, this is done using a LUT generated at init time.\n  // Expects the FFS address in x11, exit thunk address in x10 (unused) and it's own address in x9. Return address is in x11.\n.global \"CheckCall\"\n\"CheckCall\":\n  adrp x9, NtDllBase\n  ldr x9, [x9, #:lo12:NtDllBase]\n  subs x16, x11, x9\n  b.lo end\n  adrp x17, NtDllRedirectionLUTSize\n  ldr x17, [x17, #:lo12:NtDllRedirectionLUTSize]\n  cmp x16, x17\n  b.hi end\n  adrp x17, NtDllRedirectionLUT\n  ldr x17, [x17, #:lo12:NtDllRedirectionLUT]\n  ldr w11, [x17, x16, lsl #2]\n  add x11, x11, x9\nend:\n  ret\n\n  // Expects target address in x0, and the SP to set in x1\n.global \"#JumpSetStack\"\n\"#JumpSetStack\":\n  mov sp, x1\n  br x0\n"
  },
  {
    "path": "Source/Windows/ARM64EC/Module.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: Bin|ARM64EC\ndesc: Implements the ARM64EC BT module API using FEXCore\n$end_info$\n*/\n\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Core/SignalDelegator.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/Threads.h>\n#include <FEXCore/Utils/Profiler.h>\n#include <FEXCore/Utils/SHMStats.h>\n#include <FEXCore/Utils/EnumOperators.h>\n#include <FEXCore/Utils/EnumUtils.h>\n#include <FEXCore/Utils/FPState.h>\n#include <FEXCore/Utils/ArchHelpers/Arm64.h>\n#include <FEXCore/Utils/MathUtils.h>\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXCore/Utils/SignalScopeGuards.h>\n\n#include \"Common/CallRetStack.h\"\n#include \"Common/JITGuardPage.h\"\n#include \"Common/Config.h\"\n#include \"Common/Exception.h\"\n#include \"Common/ImageTracker.h\"\n#include \"Common/InvalidationTracker.h\"\n#include \"Common/OvercommitTracker.h\"\n#include \"Common/TSOHandlerConfig.h\"\n#include \"Common/CPUFeatures.h\"\n#include \"Common/Logging.h\"\n#include \"Common/Module.h\"\n#include \"Common/CRT/CRT.h\"\n#include \"Common/PortabilityInfo.h\"\n#include \"Common/Handle.h\"\n#include \"DummyHandlers.h\"\n#include \"BTInterface.h\"\n#include \"Windows/Common/SHMStats.h\"\n\n#include <cstdint>\n#include <cstdio>\n#include <type_traits>\n#include <mutex>\n#include <optional>\n#include <unordered_map>\n#include <utility>\n#include <ntstatus.h>\n#include <windef.h>\n#include <winternl.h>\n#include <winnt.h>\n#include <wine/debug.h>\n\nnamespace Exception {\nclass ECSyscallHandler;\n}\n\nextern \"C\" {\nextern IMAGE_DOS_HEADER __ImageBase; // Provided by the linker\n\nextern void* ExitFunctionEC;\nextern void* CheckCall;\nextern void* ExitFunctionSuspendPoint;\n\nvoid* X64ReturnInstr; // See Module.S\nuintptr_t NtDllBase;\n\n// Exports on ARM64EC point to x64 fast forward sequences to allow for redirecting to the JIT if functions are hotpatched. This LUT is from their addresses to the relative addresses of the native code exports.\nuint32_t* NtDllRedirectionLUT;\nuint32_t NtDllRedirectionLUTSize;\n\n// Wine doesn't support issuing direct system calls with SVC, and unlike Windows it doesn't have a 'stable' syscall number for NtContinue\nvoid* WineSyscallDispatcher;\nuint64_t WineNtContinueSyscallId;\nuint64_t WineNtAllocateVirtualMemorySyscallId;\nuint64_t WineNtProtectVirtualMemorySyscallId;\n\nNTSTATUS NtContinueNative(ARM64_NT_CONTEXT* NativeContext, BOOLEAN Alert);\nNTSTATUS NtAllocateVirtualMemoryNative(HANDLE, PVOID*, ULONG_PTR, SIZE_T*, ULONG, ULONG);\nNTSTATUS NtProtectVirtualMemoryNative(HANDLE, PVOID*, SIZE_T*, ULONG, ULONG*);\n\n[[noreturn]]\nvoid JumpSetStack(uintptr_t PC, uintptr_t SP);\n}\n\nstruct ThreadCPUArea {\n  static constexpr size_t TEBCPUAreaOffset = 0x1788;\n  CHPE_V2_CPU_AREA_INFO* Area;\n\n  explicit ThreadCPUArea(_TEB* TEB)\n    : Area(*reinterpret_cast<CHPE_V2_CPU_AREA_INFO**>(reinterpret_cast<uintptr_t>(TEB) + TEBCPUAreaOffset)) {}\n\n  uint64_t& EmulatorStackLimit() const {\n    return Area->EmulatorStackLimit;\n  }\n\n  uint64_t& EmulatorStackBase() const {\n    return Area->EmulatorStackBase;\n  }\n\n  ARM64EC_NT_CONTEXT& ContextAmd64() const {\n    return *Area->ContextAmd64;\n  }\n\n  FEXCore::Core::CpuStateFrame*& StateFrame() const {\n    return reinterpret_cast<FEXCore::Core::CpuStateFrame*&>(Area->EmulatorData[0]);\n  }\n\n  FEXCore::Core::InternalThreadState*& ThreadState() const {\n    return reinterpret_cast<FEXCore::Core::InternalThreadState*&>(Area->EmulatorData[1]);\n  }\n\n  uint64_t& DispatcherLoopTopEnterEC() const {\n    return reinterpret_cast<uint64_t&>(Area->EmulatorData[2]);\n  }\n\n  uint64_t& DispatcherLoopTopEnterECFillSRA() const {\n    return reinterpret_cast<uint64_t&>(Area->EmulatorData[3]);\n  }\n};\n\nstruct FrontendThreadData {\n  bool InLockedRWXRead {};\n};\n\nnamespace {\nfextl::unique_ptr<FEXCore::Context::Context> CTX;\nfextl::unique_ptr<FEX::DummyHandlers::DummySignalDelegator> SignalDelegator;\nfextl::unique_ptr<Exception::ECSyscallHandler> SyscallHandler;\nfextl::unique_ptr<FEX::Windows::StatAlloc> StatAllocHandler;\nstd::optional<FEX::Windows::InvalidationTracker> InvalidationTracker;\nstd::optional<FEX::Windows::CPUFeatures> CPUFeatures;\nstd::optional<FEX::Windows::OvercommitTracker> OvercommitTracker;\nstd::optional<FEX::Windows::ImageTracker> ImageTracker;\n\nstd::recursive_mutex ThreadCreationMutex;\n// Map of TIDs to their FEX thread state, `ThreadCreationMutex` must be locked when accessing\nstd::unordered_map<DWORD, FEXCore::Core::InternalThreadState*> Threads;\n\nstd::pair<NTSTATUS, ThreadCPUArea> GetThreadCPUArea(HANDLE Thread) {\n  THREAD_BASIC_INFORMATION Info;\n  const NTSTATUS Err = NtQueryInformationThread(Thread, ThreadBasicInformation, &Info, sizeof(Info), nullptr);\n  return {Err, ThreadCPUArea(reinterpret_cast<_TEB*>(Info.TebBaseAddress))};\n}\n\nThreadCPUArea GetCPUArea() {\n  return ThreadCPUArea(NtCurrentTeb());\n}\n\nFrontendThreadData* GetFrontendThreadData(FEXCore::Core::InternalThreadState* Thread) {\n  return static_cast<FrontendThreadData*>(Thread->FrontendPtr);\n}\n\nbool IsEmulatorStackAddress(const ThreadCPUArea CPUArea, uint64_t Address) {\n  return Address <= CPUArea.EmulatorStackBase() && Address >= CPUArea.EmulatorStackLimit();\n}\n\nbool IsDispatcherAddress(uint64_t Address) {\n  const auto& Config = SignalDelegator->GetConfig();\n  return Address >= Config.DispatcherBegin && Address < Config.DispatcherEnd;\n}\n\n\nvoid FillNtDllLUTs(HMODULE NtDll) {\n  ULONG Size;\n  const auto* LoadConfig =\n    reinterpret_cast<_IMAGE_LOAD_CONFIG_DIRECTORY64*>(RtlImageDirectoryEntryToData(NtDll, true, IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, &Size));\n  const auto* CHPEMetadata = reinterpret_cast<IMAGE_ARM64EC_METADATA*>(LoadConfig->CHPEMetadataPointer);\n  const auto* RedirectionTableBegin = reinterpret_cast<IMAGE_ARM64EC_REDIRECTION_ENTRY*>(NtDllBase + CHPEMetadata->RedirectionMetadata);\n  const auto* RedirectionTableEnd = RedirectionTableBegin + CHPEMetadata->RedirectionMetadataCount;\n\n  NtDllRedirectionLUTSize = std::prev(RedirectionTableEnd)->Source + 1;\n\n  SIZE_T AllocSize = NtDllRedirectionLUTSize * sizeof(uint32_t);\n  NtAllocateVirtualMemoryNative(NtCurrentProcess(), reinterpret_cast<void**>(&NtDllRedirectionLUT), 0, &AllocSize, MEM_COMMIT | MEM_RESERVE,\n                                PAGE_READWRITE);\n  for (auto It = RedirectionTableBegin; It != RedirectionTableEnd; It++) {\n    NtDllRedirectionLUT[It->Source] = It->Destination;\n  }\n}\n\ntemplate<typename T>\nvoid WriteModuleRVA(HMODULE Module, LONG RVA, T Data) {\n  if (!RVA) {\n    return;\n  }\n\n  void* Address = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(Module) + RVA);\n  void* ProtAddress = Address;\n  SIZE_T ProtSize = sizeof(T);\n  ULONG Prot;\n  NtProtectVirtualMemoryNative(NtCurrentProcess(), &ProtAddress, &ProtSize, PAGE_READWRITE, &Prot);\n  *reinterpret_cast<T*>(Address) = Data;\n  NtProtectVirtualMemoryNative(NtCurrentProcess(), &ProtAddress, &ProtSize, Prot, nullptr);\n}\n\nvoid PatchCallChecker() {\n  // See the comment for CheckCall in Module.S for why this is necessary\n  const auto Module = reinterpret_cast<HMODULE>(&__ImageBase);\n  ULONG Size;\n  const auto* LoadConfig =\n    reinterpret_cast<_IMAGE_LOAD_CONFIG_DIRECTORY64*>(RtlImageDirectoryEntryToData(Module, true, IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, &Size));\n  const auto* CHPEMetadata = reinterpret_cast<IMAGE_ARM64EC_METADATA*>(LoadConfig->CHPEMetadataPointer);\n  WriteModuleRVA(Module, CHPEMetadata->__os_arm64x_dispatch_call, &CheckCall);\n  WriteModuleRVA(Module, CHPEMetadata->__os_arm64x_dispatch_icall, &CheckCall);\n  WriteModuleRVA(Module, CHPEMetadata->__os_arm64x_dispatch_icall_cfg, &CheckCall);\n}\n\n// Fills in the syscall numbers necessary to call *Native variants of syscalls from FEX under wine.\nvoid ParseWineSyscallNumbers(HMODULE NtDll) {\n  ULONG Size;\n  const auto* Exports = reinterpret_cast<IMAGE_EXPORT_DIRECTORY*>(RtlImageDirectoryEntryToData(NtDll, true, IMAGE_DIRECTORY_ENTRY_EXPORT, &Size));\n  const auto* NameTable = reinterpret_cast<uint32_t*>(NtDllBase + Exports->AddressOfNames);\n  const auto* FunctionTable = reinterpret_cast<uint32_t*>(NtDllBase + Exports->AddressOfFunctions);\n  const auto* OrdinalTable = reinterpret_cast<uint16_t*>(NtDllBase + Exports->AddressOfNameOrdinals);\n  struct SyscallEntry {\n    const char* Name;\n    uint32_t RVA;\n\n    bool operator<(const SyscallEntry& Other) const {\n      return RVA < Other.RVA;\n    }\n  };\n\n  // Cannot use any syscalls at this stage, so rely on a stack-allocated array\n  std::array<SyscallEntry, 0x200> SyscallTable;\n  auto SyscallTableEnd = SyscallTable.begin();\n\n  // Windows/Wine orders syscalls in memory by their ID, take advantage of that to find the syscall indices for those\n  // which we need to manually issue. Note that all functions starting with Nt besides NtGetTickCount are syscalls.\n  for (uint32_t Idx = 0; Idx < Exports->NumberOfNames; Idx++) {\n    const char* Name = reinterpret_cast<const char*>(NtDllBase + NameTable[Idx]);\n    if (Name[0] == 'N' && Name[1] == 't' && strcmp(Name, \"NtGetTickCount\") != 0) {\n      *SyscallTableEnd++ = {Name, FunctionTable[OrdinalTable[Idx]]};\n    }\n  }\n\n  // Sort such that index 0 is now syscall 0, etc\n  std::sort(SyscallTable.begin(), SyscallTableEnd);\n\n  for (auto it = SyscallTable.begin(); it != SyscallTableEnd; it++) {\n    uint32_t CurSyscallId = static_cast<uint32_t>(std::distance(SyscallTable.begin(), it));\n    if (strcmp(it->Name, \"NtContinue\") == 0) {\n      WineNtContinueSyscallId = CurSyscallId;\n    } else if (strcmp(it->Name, \"NtAllocateVirtualMemory\") == 0) {\n      WineNtAllocateVirtualMemorySyscallId = CurSyscallId;\n    } else if (strcmp(it->Name, \"NtProtectVirtualMemory\") == 0) {\n      WineNtProtectVirtualMemorySyscallId = CurSyscallId;\n    }\n  }\n}\n\n// Syscall thunks may have been patched before FEX has loaded, the default call checker installed by ntdll into FEX will\n// try to invoke the JIT when calling such patched syscalls but this obviously doesn't work before FEX is initalised.\n// This function parses ntdll and sets up a custom call checker to prevent this, as such it must avoid using any syscall\n// thunks itself.\nvoid InitSyscalls() {\n  // The ntdll exports called by GetModuleHandle/GetProcAddress aren't known to be patched before JIT init by any current\n  // software so are safe to call, but if that changes the loader structures in the PEB could be parsed manually.\n  const auto NtDll = GetModuleHandle(\"ntdll.dll\");\n  NtDllBase = reinterpret_cast<uintptr_t>(NtDll);\n\n  const auto WineSyscallDispatcherPtr = reinterpret_cast<void**>(GetProcAddress(NtDll, \"__wine_syscall_dispatcher\"));\n  if (WineSyscallDispatcherPtr) {\n    WineSyscallDispatcher = *WineSyscallDispatcherPtr;\n    ParseWineSyscallNumbers(NtDll);\n  }\n\n  FillNtDllLUTs(NtDll);\n  PatchCallChecker();\n}\n\nvoid HandleImageMap(uint64_t Address, bool MainImage = false) {\n  fextl::string ModulePath = FEX::Windows::GetSectionFilePath(Address);\n  fextl::string ModuleName = fextl::string {FEX::Windows::BaseName(ModulePath)};\n  InvalidationTracker->HandleImageMap(ModuleName, Address);\n  ImageTracker->HandleImageMap(ModulePath, Address, MainImage);\n}\n\nvoid HandleImageUnmap(uint64_t Address, uint64_t Size) {\n  ImageTracker->HandleImageUnmap(Address, Size);\n}\n} // namespace\n\nnamespace Exception {\nstatic std::optional<FEX::Windows::TSOHandlerConfig> HandlerConfig;\nstatic uintptr_t KiUserExceptionDispatcher;\n\nstruct alignas(16) KiUserExceptionDispatcherStackLayout {\n  ARM64_NT_CONTEXT Context;\n  uint64_t Pad[4]; // Only present on newer Windows versions, likely for SVE.\n  EXCEPTION_RECORD Rec;\n  uint64_t Align;\n  uint64_t Redzone[2];\n};\n\nstatic bool HandleUnalignedAccess(const ThreadCPUArea CPUArea, ARM64_NT_CONTEXT& Context, bool IsJIT) {\n  auto Thread = CPUArea.ThreadState();\n  FEXCORE_PROFILE_INSTANT_INCREMENT(Thread, AccumulatedSIGBUSCount, 1);\n  const auto Result =\n    FEXCore::ArchHelpers::Arm64::HandleUnalignedAccess(Thread, HandlerConfig->GetUnalignedHandlerType(), Context.Pc, &Context.X0, IsJIT);\n  Context.Pc += Result.value_or(0);\n  return Result.has_value();\n}\n\nstatic void LoadStateFromECContext(FEXCore::Core::InternalThreadState* Thread, CONTEXT& Context) {\n  auto& State = Thread->CurrentFrame->State;\n\n  if ((Context.ContextFlags & CONTEXT_INTEGER) == CONTEXT_INTEGER) {\n    // General register state\n    State.gregs[FEXCore::X86State::REG_RAX] = Context.Rax;\n    State.gregs[FEXCore::X86State::REG_RCX] = Context.Rcx;\n    State.gregs[FEXCore::X86State::REG_RDX] = Context.Rdx;\n    State.gregs[FEXCore::X86State::REG_RBX] = Context.Rbx;\n\n    State.gregs[FEXCore::X86State::REG_RSI] = Context.Rsi;\n    State.gregs[FEXCore::X86State::REG_RDI] = Context.Rdi;\n    State.gregs[FEXCore::X86State::REG_R8] = Context.R8;\n    State.gregs[FEXCore::X86State::REG_R9] = Context.R9;\n    State.gregs[FEXCore::X86State::REG_R10] = Context.R10;\n    State.gregs[FEXCore::X86State::REG_R11] = Context.R11;\n    State.gregs[FEXCore::X86State::REG_R12] = Context.R12;\n    State.gregs[FEXCore::X86State::REG_R13] = Context.R13;\n    State.gregs[FEXCore::X86State::REG_R14] = Context.R14;\n    State.gregs[FEXCore::X86State::REG_R15] = Context.R15;\n  }\n\n  if ((Context.ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL) {\n    State.rip = Context.Rip;\n    State.gregs[FEXCore::X86State::REG_RSP] = Context.Rsp;\n    State.gregs[FEXCore::X86State::REG_RBP] = Context.Rbp;\n    CTX->SetFlagsFromCompactedEFLAGS(Thread, Context.EFlags);\n  }\n\n  if ((Context.ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS) {\n    State.es_idx = Context.SegEs & 0xffff;\n    State.cs_idx = Context.SegCs & 0xffff;\n    State.ss_idx = Context.SegSs & 0xffff;\n    State.ds_idx = Context.SegDs & 0xffff;\n    State.fs_idx = Context.SegFs & 0xffff;\n    State.gs_idx = Context.SegGs & 0xffff;\n\n    // The TEB is the only populated GDT entry by default\n    const auto TEB = reinterpret_cast<uint64_t>(NtCurrentTeb());\n    auto GDT = State.GetSegmentFromIndex(State, (Context.SegGs & 0xffff));\n    State.SetGDTBase(GDT, TEB);\n    State.SetGDTLimit(GDT, 0xF'FFFFU);\n    State.gs_cached = TEB;\n    State.fs_cached = 0;\n    State.es_cached = 0;\n    State.cs_cached = 0;\n    State.ss_cached = 0;\n    State.ds_cached = 0;\n  }\n\n  if ((Context.ContextFlags & CONTEXT_FLOATING_POINT) == CONTEXT_FLOATING_POINT) {\n    // Floating-point register state\n    if ((Context.ContextFlags & CONTEXT_XSTATE) == CONTEXT_XSTATE) {\n      const auto* Ymm = RtlLocateExtendedFeature(reinterpret_cast<CONTEXT_EX*>(&Context + 1), XSTATE_AVX, nullptr);\n      CTX->SetXMMRegistersFromState(Thread, reinterpret_cast<const __uint128_t*>(Context.FltSave.XmmRegisters),\n                                    reinterpret_cast<const __uint128_t*>(Ymm));\n    } else {\n      CTX->SetXMMRegistersFromState(Thread, reinterpret_cast<const __uint128_t*>(Context.FltSave.XmmRegisters), nullptr);\n    }\n    memcpy(State.mm, Context.FltSave.FloatRegisters, sizeof(State.mm));\n\n    State.FCW = Context.FltSave.ControlWord;\n    State.flags[FEXCore::X86State::X87FLAG_IE_LOC] = Context.FltSave.StatusWord & 1;\n    State.flags[FEXCore::X86State::X87FLAG_C0_LOC] = (Context.FltSave.StatusWord >> 8) & 1;\n    State.flags[FEXCore::X86State::X87FLAG_C1_LOC] = (Context.FltSave.StatusWord >> 9) & 1;\n    State.flags[FEXCore::X86State::X87FLAG_C2_LOC] = (Context.FltSave.StatusWord >> 10) & 1;\n    State.flags[FEXCore::X86State::X87FLAG_C3_LOC] = (Context.FltSave.StatusWord >> 14) & 1;\n    State.flags[FEXCore::X86State::X87FLAG_TOP_LOC] = (Context.FltSave.StatusWord >> 11) & 0b111;\n    State.AbridgedFTW = Context.FltSave.TagWord;\n  }\n}\n\nstatic void ReconstructThreadState(FEXCore::Core::InternalThreadState* Thread, ARM64_NT_CONTEXT& Context) {\n  const auto& Config = SignalDelegator->GetConfig();\n  auto& State = Thread->CurrentFrame->State;\n\n  State.rip = CTX->RestoreRIPFromHostPC(Thread, Context.Pc);\n\n  // Spill all SRA GPRs\n  for (size_t i = 0; i < Config.SRAGPRCount; i++) {\n    State.gregs[i] = Context.X[Config.SRAGPRMapping[i]];\n  }\n\n  // Spill all SRA FPRs\n  for (size_t i = 0; i < Config.SRAFPRCount; i++) {\n    memcpy(State.xmm.sse.data[i], &Context.V[Config.SRAFPRMapping[i]], sizeof(__uint128_t));\n  }\n\n  // Spill EFlags\n  uint32_t EFlags = CTX->ReconstructCompactedEFLAGS(Thread, true, Context.X, Context.Cpsr);\n  CTX->SetFlagsFromCompactedEFLAGS(Thread, EFlags);\n}\n\n// Reconstructs an x64 context from the input thread's state, packed into a regular ARM64 context following the ARM64EC register mapping\nstatic ARM64_NT_CONTEXT StoreStateToPackedECContext(FEXCore::Core::InternalThreadState* Thread, uint32_t FPCR, uint32_t FPSR) {\n  ARM64_NT_CONTEXT ECContext {};\n\n  ECContext.ContextFlags = CONTEXT_ARM64_FULL;\n  if (CPUFeatures->IsFeaturePresent(PF_AVX2_INSTRUCTIONS_AVAILABLE)) {\n    // This is a FEX extension and requires corresponding wine-side patches to be of use, however it is harmless to set\n    // even if those patches are not used.\n    ECContext.ContextFlags |= CONTEXT_ARM64_FEX_YMMSTATE;\n  }\n\n  auto& State = Thread->CurrentFrame->State;\n\n  ECContext.X8 = State.gregs[FEXCore::X86State::REG_RAX];\n  ECContext.X0 = State.gregs[FEXCore::X86State::REG_RCX];\n  ECContext.X1 = State.gregs[FEXCore::X86State::REG_RDX];\n  ECContext.X27 = State.gregs[FEXCore::X86State::REG_RBX];\n  ECContext.Sp = State.gregs[FEXCore::X86State::REG_RSP];\n  ECContext.Fp = State.gregs[FEXCore::X86State::REG_RBP];\n  ECContext.X25 = State.gregs[FEXCore::X86State::REG_RSI];\n  ECContext.X26 = State.gregs[FEXCore::X86State::REG_RDI];\n  ECContext.X2 = State.gregs[FEXCore::X86State::REG_R8];\n  ECContext.X3 = State.gregs[FEXCore::X86State::REG_R9];\n  ECContext.X4 = State.gregs[FEXCore::X86State::REG_R10];\n  ECContext.X5 = State.gregs[FEXCore::X86State::REG_R11];\n  ECContext.X19 = State.gregs[FEXCore::X86State::REG_R12];\n  ECContext.X20 = State.gregs[FEXCore::X86State::REG_R13];\n  ECContext.X21 = State.gregs[FEXCore::X86State::REG_R14];\n  ECContext.X22 = State.gregs[FEXCore::X86State::REG_R15];\n\n  ECContext.Pc = State.rip;\n\n  CTX->ReconstructXMMRegisters(Thread, reinterpret_cast<__uint128_t*>(&ECContext.V[0]), reinterpret_cast<__uint128_t*>(&ECContext.V[16]));\n\n  ECContext.Lr = State.mm[0][0];\n  ECContext.X6 = State.mm[1][0];\n  ECContext.X7 = State.mm[2][0];\n  ECContext.X9 = State.mm[3][0];\n  ECContext.X16 = (State.mm[3][1] & 0xffff) << 48 | (State.mm[2][1] & 0xffff) << 32 | (State.mm[1][1] & 0xffff) << 16 | (State.mm[0][1] & 0xffff);\n  ECContext.X10 = State.mm[4][0];\n  ECContext.X11 = State.mm[5][0];\n  ECContext.X12 = State.mm[6][0];\n  ECContext.X15 = State.mm[7][0];\n  ECContext.X17 = (State.mm[7][1] & 0xffff) << 48 | (State.mm[6][1] & 0xffff) << 32 | (State.mm[5][1] & 0xffff) << 16 | (State.mm[4][1] & 0xffff);\n\n  // Zero all disallowed registers\n  ECContext.X13 = 0;\n  ECContext.X14 = 0;\n  ECContext.X18 = 0;\n  ECContext.X23 = 0;\n  ECContext.X24 = 0;\n  ECContext.X28 = 0;\n\n  // NZCV+SS will be converted into EFlags by ntdll, the rest are lost during exception handling.\n  // See HandleGuestException\n  uint32_t EFlags = CTX->ReconstructCompactedEFLAGS(Thread, false, nullptr, 0);\n  ECContext.Cpsr = 0;\n  ECContext.Cpsr |= (EFlags & (1U << FEXCore::X86State::RFLAG_TF_RAW_LOC)) ? (1U << 21) : 0;\n  ECContext.Cpsr |= (EFlags & (1U << FEXCore::X86State::RFLAG_OF_RAW_LOC)) ? (1U << 28) : 0;\n  ECContext.Cpsr |= (EFlags & (1U << FEXCore::X86State::RFLAG_CF_RAW_LOC)) ? (1U << 29) : 0;\n  ECContext.Cpsr |= (EFlags & (1U << FEXCore::X86State::RFLAG_ZF_RAW_LOC)) ? (1U << 30) : 0;\n  ECContext.Cpsr |= (EFlags & (1U << FEXCore::X86State::RFLAG_SF_RAW_LOC)) ? (1U << 31) : 0;\n\n  ECContext.Fpcr = FPCR;\n  ECContext.Fpsr = FPSR;\n\n  return ECContext;\n}\n\nstatic void RethrowGuestException(const EXCEPTION_RECORD& Rec, ARM64_NT_CONTEXT& Context) {\n  const auto& Config = SignalDelegator->GetConfig();\n  auto* Thread = GetCPUArea().ThreadState();\n  auto& Fault = Thread->CurrentFrame->SynchronousFaultData;\n  uint64_t GuestSp = Context.X[Config.SRAGPRMapping[static_cast<size_t>(FEXCore::X86State::REG_RSP)]];\n  auto* Args = reinterpret_cast<KiUserExceptionDispatcherStackLayout*>(FEXCore::AlignDown(GuestSp, 64)) - 1;\n\n  LogMan::Msg::DFmt(\"Reconstructing context\");\n  if (!IsDispatcherAddress(Context.Pc)) {\n    ReconstructThreadState(Thread, Context);\n  }\n  Args->Context = StoreStateToPackedECContext(Thread, Context.Fpcr, Context.Fpsr);\n  LogMan::Msg::DFmt(\"pc: {:X} rip: {:X}\", Context.Pc, Args->Context.Pc);\n\n  // X64 Windows always clears TF, DF and AF when handling an exception, restoring after.\n  // Current ARM64EC windows can only restore NZCV+SS when returning from an exception and other flags are left untouched from the handler context.\n  // TODO: Can extend wine to support this by mapping the remaining EFlags into reserved cpsr members.\n  uint32_t EFlags = CTX->ReconstructCompactedEFLAGS(Thread, false, nullptr, 0);\n  EFlags &= ~(1 << FEXCore::X86State::RFLAG_TF_RAW_LOC);\n  CTX->SetFlagsFromCompactedEFLAGS(Thread, EFlags);\n\n  Args->Rec = FEX::Windows::HandleGuestException(Fault, Rec, Args->Context.Pc, Args->Context.X8);\n  if (Args->Rec.ExceptionCode == EXCEPTION_SINGLE_STEP) {\n    Args->Context.Cpsr &= ~(1 << 21); // PSTATE.SS\n  } else if (Args->Rec.ExceptionCode == EXCEPTION_BREAKPOINT) {\n    // INT3 will set RIP to the instruction following it, undo this (any edge cases with multibyte instructions that trigger breakpoints are bugs present in Windows also)\n    Args->Context.Pc -= 1;\n  }\n\n  Context.Sp = reinterpret_cast<uint64_t>(Args);\n  Context.Pc = KiUserExceptionDispatcher;\n}\n\nclass ECSyscallHandler : public FEXCore::HLE::SyscallHandler, public FEXCore::Allocator::FEXAllocOperators {\npublic:\n  ECSyscallHandler() {\n    OSABI = FEXCore::HLE::SyscallOSABI::OS_GENERIC;\n  }\n\n  uint64_t HandleSyscall(FEXCore::Core::CpuStateFrame* Frame, FEXCore::HLE::SyscallArguments* Args) override {\n    ProcessPendingCrossProcessEmulatorWork();\n\n    // Manually raise an exeption with the current JIT state packed into a native context, ntdll handles this and\n    // reenters the JIT (see dlls/ntdll/signal_arm64ec.c in wine).\n    uint64_t FPCR, FPSR;\n    __asm volatile(\"mrs %[fpcr], fpcr\" : [fpcr] \"=r\"(FPCR));\n    __asm volatile(\"mrs %[fpsr], fpsr\" : [fpsr] \"=r\"(FPSR));\n\n    auto* Thread = GetCPUArea().ThreadState();\n    KiUserExceptionDispatcherStackLayout DispatchArgs {\n      .Context = StoreStateToPackedECContext(Thread, static_cast<uint32_t>(FPCR), static_cast<uint32_t>(FPSR)),\n      .Rec = {.ExceptionCode = STATUS_EMULATION_SYSCALL}};\n    // PC is expected to hold the return address after the thunk, so skip over the INT 2E/SYSCALL instruction.\n    DispatchArgs.Context.Pc += 2;\n    JumpSetStack(KiUserExceptionDispatcher, reinterpret_cast<uintptr_t>(&DispatchArgs));\n  }\n\n  std::optional<FEXCore::ExecutableFileSectionInfo> LookupExecutableFileSection(FEXCore::Core::InternalThreadState*, uint64_t Address) override {\n    return ImageTracker->LookupExecutableFileSection(Address);\n  }\n\n  void MarkGuestExecutableRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Start, uint64_t Length) override {\n    InvalidationTracker->ReprotectRWXIntervals(Start, Length);\n  }\n\n  void InvalidateGuestCodeRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Start, uint64_t Length) override {\n    InvalidationTracker->InvalidateAlignedInterval(Start, Length, false);\n  }\n\n  void MarkOvercommitRange(uint64_t Start, uint64_t Length) override {\n    OvercommitTracker->MarkRange(Start, Length);\n  }\n\n  void UnmarkOvercommitRange(uint64_t Start, uint64_t Length) override {\n    OvercommitTracker->UnmarkRange(Start, Length);\n  }\n\n  FEXCore::HLE::ExecutableRangeInfo QueryGuestExecutableRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Address) override {\n    return InvalidationTracker->QueryExecutableRange(Address);\n  }\n\n  void PreCompile() override {\n    ProcessPendingCrossProcessEmulatorWork();\n  }\n};\n} // namespace Exception\n\nextern \"C\" void SyncThreadContext(CONTEXT* Context) {\n  ProcessPendingCrossProcessEmulatorWork();\n  auto* Thread = GetCPUArea().ThreadState();\n  // All other EFlags bits are lost when converting to/from an ARM64EC context, so merge them in from the current JIT state.\n  // This is advisable over dropping their values as thread suspend/resume uses this function, and that can happen at any point in guest code.\n  static constexpr uint32_t ECValidEFlagsMask {(1U << FEXCore::X86State::RFLAG_OF_RAW_LOC) | (1U << FEXCore::X86State::RFLAG_CF_RAW_LOC) |\n                                               (1U << FEXCore::X86State::RFLAG_ZF_RAW_LOC) | (1U << FEXCore::X86State::RFLAG_SF_RAW_LOC) |\n                                               (1U << FEXCore::X86State::RFLAG_TF_RAW_LOC)};\n\n  uint32_t StateEFlags = CTX->ReconstructCompactedEFLAGS(Thread, false, nullptr, 0);\n  Context->EFlags = (Context->EFlags & ECValidEFlagsMask) | (StateEFlags & ~ECValidEFlagsMask);\n  Exception::LoadStateFromECContext(Thread, *Context);\n}\n\nNTSTATUS ProcessInit() {\n  InitSyscalls();\n\n  FEX::Windows::InitCRTProcess();\n  const auto ExecutableName = FEX::Windows::BaseName(FEX::Windows::GetExecutableFilePath());\n  FEX::Config::LoadConfig(fextl::string {ExecutableName}, _environ, FEX::ReadPortabilityInformation());\n  FEXCore::Config::ReloadMetaLayer();\n  FEX::Windows::Logging::Init();\n\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_IS64BIT_MODE, \"1\");\n\n  FEXCore::Profiler::Init(\"\", \"\");\n\n  SignalDelegator = fextl::make_unique<FEX::DummyHandlers::DummySignalDelegator>();\n  SyscallHandler = fextl::make_unique<Exception::ECSyscallHandler>();\n\n  const auto NtDll = GetModuleHandle(\"ntdll.dll\");\n  const bool IsWine = !!GetProcAddress(NtDll, \"wine_get_version\");\n  OvercommitTracker.emplace(IsWine);\n\n  {\n    auto HostFeatures = FEX::Windows::CPUFeatures::FetchHostFeatures(IsWine);\n    CTX = FEXCore::Context::Context::CreateNewContext(HostFeatures);\n  }\n\n  CTX->SetSignalDelegator(SignalDelegator.get());\n  CTX->SetSyscallHandler(SyscallHandler.get());\n  CTX->InitCore();\n  Exception::HandlerConfig.emplace(*CTX);\n  InvalidationTracker.emplace(*CTX, Threads);\n  ImageTracker.emplace(*CTX, false);\n\n  auto MainModule = reinterpret_cast<__TEB*>(NtCurrentTeb())->Peb->ImageBaseAddress;\n  HandleImageMap(reinterpret_cast<uint64_t>(MainModule), true);\n\n  HandleImageMap(NtDllBase);\n\n  CPUFeatures.emplace(*CTX);\n\n  X64ReturnInstr = ::VirtualAlloc(nullptr, FEXCore::Utils::FEX_PAGE_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE);\n  InvalidationTracker->HandleMemoryProtectionNotification(reinterpret_cast<uint64_t>(X64ReturnInstr), FEXCore::Utils::FEX_PAGE_SIZE,\n                                                          PAGE_EXECUTE_READ);\n  *reinterpret_cast<uint8_t*>(X64ReturnInstr) = 0xc3;\n\n  const uintptr_t KiUserExceptionDispatcherFFS = reinterpret_cast<uintptr_t>(GetProcAddress(NtDll, \"KiUserExceptionDispatcher\"));\n  Exception::KiUserExceptionDispatcher = NtDllRedirectionLUT[KiUserExceptionDispatcherFFS - NtDllBase] + NtDllBase;\n\n  FEX_CONFIG_OPT(TSOEnabled, TSOENABLED);\n  if (TSOEnabled()) {\n    BOOL Enable = TRUE;\n    NTSTATUS Status = NtSetInformationProcess(NtCurrentProcess(), ProcessFexHardwareTso, &Enable, sizeof(Enable));\n    if (Status == STATUS_SUCCESS) {\n      CTX->SetHardwareTSOSupport(true);\n    }\n  }\n\n  FEX_CONFIG_OPT(ProfileStats, PROFILESTATS);\n  FEX_CONFIG_OPT(StartupSleep, STARTUPSLEEP);\n  FEX_CONFIG_OPT(StartupSleepProcName, STARTUPSLEEPPROCNAME);\n\n  if (IsWine && ProfileStats()) {\n    StatAllocHandler = fextl::make_unique<FEX::Windows::StatAlloc>(FEXCore::SHMStats::AppType::WIN_ARM64EC);\n  }\n\n  if (StartupSleep() && (StartupSleepProcName().empty() || ExecutableName == StartupSleepProcName())) {\n    LogMan::Msg::IFmt(\"[{}][{}] Sleeping for {} seconds\", GetCurrentProcessId(), ExecutableName, StartupSleep());\n    std::this_thread::sleep_for(std::chrono::seconds(StartupSleep()));\n  }\n\n  return STATUS_SUCCESS;\n}\n\nvoid ProcessTerm(HANDLE Handle, BOOL After, NTSTATUS Status) {}\n\nclass ScopedCallbackDisable {\nprivate:\n  bool Prev;\n\npublic:\n  ScopedCallbackDisable() {\n    const auto CPUArea = GetCPUArea();\n    Prev = CPUArea.Area->InSyscallCallback;\n    CPUArea.Area->InSyscallCallback = true;\n  }\n\n  ~ScopedCallbackDisable() {\n    GetCPUArea().Area->InSyscallCallback = Prev;\n  }\n};\n\n// Returns true if exception dispatch should be halted and the execution context restored to NativeContext\nbool ResetToConsistentStateImpl(const ThreadCPUArea CPUArea, EXCEPTION_RECORD* Exception, CONTEXT* GuestContext, ARM64_NT_CONTEXT* NativeContext) {\n  auto Thread = CPUArea.ThreadState();\n  FEXCORE_PROFILE_ACCUMULATION(Thread, AccumulatedSignalTime);\n  LogMan::Msg::DFmt(\"Exception: Code: {:X} Address: {:X}\", Exception->ExceptionCode, reinterpret_cast<uintptr_t>(Exception->ExceptionAddress));\n\n  if (NativeContext->Pc == reinterpret_cast<uint64_t>(&ExitFunctionSuspendPoint)) {\n    // A suspend interrupt can occur in ExitFunctionEC before InSimulation is unset and set SuspendDoorbell. If this\n    // occurs then it is still our duty to cooperatively suspend with an appropriate context. To support this, after\n    // unsetting InSimulation a brk #0xCAFE instruction will be raised that we can handle here.\n    NativeContext->Pc += 4; // Skip over the brk instruction when we resume\n    *CPUArea.Area->SuspendDoorbell = 0;\n    return true;\n  }\n\n  if (Exception->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) {\n    const auto FaultAddress = static_cast<uint64_t>(Exception->ExceptionInformation[1]);\n\n    if (FEX::Windows::CallRetStack::HandleAccessViolation(Thread, FaultAddress, NativeContext->X17)) {\n      return true;\n    }\n\n    if (FEX::Windows::JITGuardPage::HandleJITGuardPage(Thread, reinterpret_cast<void*>(FaultAddress), NativeContext->X,\n                                                       reinterpret_cast<__uint128_t*>(NativeContext->V), &NativeContext->Pc)) {\n      return true;\n    }\n\n    std::scoped_lock Lock(ThreadCreationMutex);\n    if (InvalidationTracker && InvalidationTracker->HandleRWXAccessViolation(Thread, NativeContext->Pc, FaultAddress)) {\n      FEXCORE_PROFILE_INSTANT_INCREMENT(Thread, AccumulatedSMCCount, 1);\n      if (CTX->IsAddressInCodeBuffer(Thread, NativeContext->Pc) && !CTX->IsCurrentBlockSingleInst(CPUArea.ThreadState()) &&\n          CTX->IsAddressInCurrentBlock(Thread, FaultAddress & FEXCore::Utils::FEX_PAGE_MASK, FEXCore::Utils::FEX_PAGE_SIZE)) {\n        // If we are not patching ourself (single inst block case) and potentially patching the current block, this is inline SMC. Reconstruct the current context (before the SMC write) then single step the write to reduce it to regular SMC.\n        Exception::ReconstructThreadState(Thread, *NativeContext);\n        LogMan::Msg::DFmt(\"Handled inline self-modifying code: pc: {:X} rip: {:X} fault: {:X}\", NativeContext->Pc,\n                          Thread->CurrentFrame->State.rip, FaultAddress);\n        NativeContext->Pc = CPUArea.DispatcherLoopTopEnterECFillSRA();\n        NativeContext->Sp = CPUArea.EmulatorStackBase();\n        NativeContext->X11 = 1;                                        // Set ENTRY_FILL_SRA_SINGLE_INST_REG to force a single step\n        NativeContext->X17 = reinterpret_cast<uint64_t>(CPUArea.Area); // Set EC_ENTRY_CPUAREA_REG\n      } else {\n        LogMan::Msg::DFmt(\"Handled self-modifying code: pc: {:X} fault: {:X}\", NativeContext->Pc, FaultAddress);\n      }\n\n      return true;\n    }\n  }\n\n  bool IsJIT = CTX->IsAddressInCodeBuffer(Thread, NativeContext->Pc);\n  if (Exception->ExceptionCode == EXCEPTION_DATATYPE_MISALIGNMENT && Exception::HandleUnalignedAccess(CPUArea, *NativeContext, IsJIT)) {\n    LogMan::Msg::DFmt(\"Handled unaligned atomic: new pc: {:X}\", NativeContext->Pc);\n    return true;\n  }\n\n  if (!IsJIT && !IsDispatcherAddress(NativeContext->Pc)) {\n    LogMan::Msg::DFmt(\"Passing through exception\");\n    return false;\n  }\n\n  // The JIT (in CompileBlock) emits code to check the suspend doorbell at the start of every block, and run the following instruction if it is set:\n  static constexpr uint32_t SuspendTrapMagic {0xD4395FC0}; // brk #0xCAFE\n  if (Exception->ExceptionCode == EXCEPTION_ILLEGAL_INSTRUCTION && *reinterpret_cast<uint32_t*>(NativeContext->Pc) == SuspendTrapMagic) {\n    Exception::ReconstructThreadState(Thread, *NativeContext);\n    *NativeContext = Exception::StoreStateToPackedECContext(Thread, NativeContext->Fpcr, NativeContext->Fpsr);\n    LogMan::Msg::DFmt(\"Suspending: RIP: {:X} SP: {:X}\", NativeContext->Pc, NativeContext->Sp);\n    CPUArea.Area->InSimulation = 0;\n    *CPUArea.Area->SuspendDoorbell = 0;\n    return true;\n  }\n\n  if (IsEmulatorStackAddress(CPUArea, reinterpret_cast<uint64_t>(__builtin_frame_address(0)))) {\n    Exception::RethrowGuestException(*Exception, *NativeContext);\n    LogMan::Msg::DFmt(\"Rethrowing onto guest stack: {:X}\", NativeContext->Sp);\n    return true;\n  } else {\n    LogMan::Msg::EFmt(\"Unexpected exception in JIT code on guest stack\");\n    return false;\n  }\n}\n\nNTSTATUS ResetToConsistentState(EXCEPTION_RECORD* Exception, CONTEXT* GuestContext, ARM64_NT_CONTEXT* NativeContext) {\n  bool Cont {};\n  if (Exception->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) {\n    const auto FaultAddress = static_cast<uint64_t>(Exception->ExceptionInformation[1]);\n\n    if (OvercommitTracker) {\n      {\n        ScopedCallbackDisable guard;\n        Cont = OvercommitTracker->HandleAccessViolation(FaultAddress);\n      }\n      if (Cont) {\n        NtContinueNative(NativeContext, false);\n      }\n    }\n  }\n\n  const auto CPUArea = GetCPUArea();\n  if (!CPUArea.ThreadState()) {\n    return STATUS_SUCCESS;\n  }\n\n  {\n    ScopedCallbackDisable guard;\n    Cont = ResetToConsistentStateImpl(CPUArea, Exception, GuestContext, NativeContext);\n  }\n\n  if (Cont) {\n    NtContinueNative(NativeContext, false);\n  }\n\n  CPUArea.Area->InSimulation = false;\n  CPUArea.Area->InSyscallCallback = false;\n  return STATUS_SUCCESS;\n}\n\nvoid NotifyMemoryAlloc(void* Address, SIZE_T Size, ULONG Type, ULONG Prot, BOOL After, NTSTATUS Status) {\n  if (!InvalidationTracker || !GetCPUArea().ThreadState()) {\n    return;\n  }\n\n  if (!After) {\n    ThreadCreationMutex.lock();\n  } else {\n    // MEM_RESET(_UNDO) ignores the passed permissions\n    if (!Status && !(Type & (MEM_RESET | MEM_RESET_UNDO))) {\n      InvalidationTracker->HandleMemoryProtectionNotification(reinterpret_cast<uint64_t>(Address), static_cast<uint64_t>(Size), Prot);\n    }\n    ThreadCreationMutex.unlock();\n  }\n}\n\nvoid NotifyMemoryFree(void* Address, SIZE_T Size, ULONG FreeType, BOOL After, NTSTATUS Status) {\n  if (!InvalidationTracker || !GetCPUArea().ThreadState()) {\n    return;\n  }\n\n  if (!After) {\n    ThreadCreationMutex.lock();\n  } else {\n    if (!Status) {\n      InvalidationTracker->InvalidateAlignedInterval(reinterpret_cast<uint64_t>(Address), static_cast<uint64_t>(Size), true);\n    }\n    ThreadCreationMutex.unlock();\n  }\n}\n\nvoid NotifyMemoryProtect(void* Address, SIZE_T Size, ULONG NewProt, BOOL After, NTSTATUS Status) {\n  if (!InvalidationTracker || !GetCPUArea().ThreadState()) {\n    return;\n  }\n\n  if (!After) {\n    ThreadCreationMutex.lock();\n  } else {\n    if (!Status) {\n      InvalidationTracker->HandleMemoryProtectionNotification(reinterpret_cast<uint64_t>(Address), static_cast<uint64_t>(Size), NewProt);\n    }\n    ThreadCreationMutex.unlock();\n  }\n}\n\nNTSTATUS NotifyMapViewOfSection(void* Unk1, void* Address, void* Unk2, SIZE_T Size, ULONG AllocType, ULONG Prot) {\n  if (!InvalidationTracker || !GetCPUArea().ThreadState()) {\n    return STATUS_SUCCESS;\n  }\n\n  {\n    std::scoped_lock Lock(ThreadCreationMutex);\n    HandleImageMap(reinterpret_cast<uint64_t>(Address));\n  }\n\n\n  return STATUS_SUCCESS;\n}\n\nvoid NotifyUnmapViewOfSection(void* Address, BOOL After, NTSTATUS Status) {\n  if (!InvalidationTracker || !GetCPUArea().ThreadState()) {\n    return;\n  }\n\n  if (!After) {\n    ThreadCreationMutex.lock();\n    auto [Start, Size] = InvalidationTracker->InvalidateContainingSection(reinterpret_cast<uint64_t>(Address), true);\n    if (Size) {\n      HandleImageUnmap(Start, Size);\n    }\n  } else {\n    ThreadCreationMutex.unlock();\n  }\n}\n\nvoid FlushInstructionCacheHeavy(const void* Address, SIZE_T Size) {\n  if (!InvalidationTracker || !GetCPUArea().ThreadState()) {\n    return;\n  }\n\n  std::scoped_lock Lock(ThreadCreationMutex);\n  InvalidationTracker->InvalidateAlignedInterval(reinterpret_cast<uint64_t>(Address), static_cast<uint64_t>(Size), false);\n}\n\nvoid BTCpu64FlushInstructionCache(const void* Address, SIZE_T Size) {\n  if (!InvalidationTracker || !GetCPUArea().ThreadState()) {\n    return;\n  }\n\n  std::scoped_lock Lock(ThreadCreationMutex);\n  InvalidationTracker->InvalidateAlignedInterval(reinterpret_cast<uint64_t>(Address), static_cast<uint64_t>(Size), false);\n}\n\nvoid BTCpu64NotifyMemoryDirty(void* Address, SIZE_T Size) {\n  if (!InvalidationTracker || !GetCPUArea().ThreadState()) {\n    return;\n  }\n\n  std::scoped_lock Lock(ThreadCreationMutex);\n  InvalidationTracker->InvalidateAlignedInterval(reinterpret_cast<uint64_t>(Address), static_cast<uint64_t>(Size), false);\n}\n\nvoid BTCpu64NotifyReadFile(HANDLE Handle, void* Address, SIZE_T Size, BOOL After, NTSTATUS Status) {\n  auto* ThreadState = GetCPUArea().ThreadState();\n  if (!InvalidationTracker || !ThreadState) {\n    return;\n  }\n\n  auto& InLockedRWXRead = GetFrontendThreadData(ThreadState)->InLockedRWXRead;\n  if (!After) {\n    ThreadCreationMutex.lock();\n    CTX->GetCodeInvalidationMutex().lock();\n    if (InvalidationTracker->BeginUntrackedWriteLocked(reinterpret_cast<uint64_t>(Address), static_cast<uint64_t>(Size))) {\n      InLockedRWXRead = true;\n    } else {\n      CTX->GetCodeInvalidationMutex().unlock();\n      ThreadCreationMutex.unlock();\n    }\n  } else {\n    if (InLockedRWXRead) {\n      InLockedRWXRead = false;\n      CTX->GetCodeInvalidationMutex().unlock();\n      ThreadCreationMutex.unlock();\n    }\n  }\n}\n\nNTSTATUS ThreadInit() {\n  std::scoped_lock Lock(ThreadCreationMutex);\n  FEX::Windows::InitCRTThread();\n  const auto CPUArea = GetCPUArea();\n\n  static constexpr size_t EmulatorStackSize = 0x40000;\n  const uint64_t EmulatorStack = reinterpret_cast<uint64_t>(::VirtualAlloc(nullptr, EmulatorStackSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));\n  CPUArea.EmulatorStackLimit() = EmulatorStack;\n  CPUArea.EmulatorStackBase() = EmulatorStack + EmulatorStackSize;\n\n  auto* Thread = CTX->CreateThread(0, 0);\n\n  // Default segment setup.\n  auto Frame = Thread->CurrentFrame;\n  auto NewSegments = new FEXCore::Core::CPUState::gdt_segment[32];\n\n  // Setup initial code-segment GDT\n  auto& GDT = NewSegments[FEXCore::Core::CPUState::DEFAULT_USER_CS];\n  FEXCore::Core::CPUState::SetGDTBase(&GDT, 0);\n  FEXCore::Core::CPUState::SetGDTLimit(&GDT, 0xF'FFFFU);\n  GDT.L = 1; // L = Long Mode = 64-bit\n  GDT.D = 0; // D = Default Operand SIze = Reserved\n\n  Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_GDT] = &NewSegments[0];\n  // TODO: LDTs are currently unsupported, mirror them to GDT.\n  Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_LDT] = &NewSegments[0];\n\n  Frame->State.cs_idx = FEXCore::Core::CPUState::DEFAULT_USER_CS << 3;\n  Frame->State.cs_cached = FEXCore::Core::CPUState::CalculateGDTBase(GDT);\n\n  FEX::Windows::CallRetStack::InitializeThread(Thread);\n  Thread->CurrentFrame->Pointers.ExitFunctionEC = reinterpret_cast<uintptr_t>(&ExitFunctionEC);\n  CPUArea.StateFrame() = Thread->CurrentFrame;\n\n  uint64_t EnterEC = Thread->CurrentFrame->Pointers.DispatcherLoopTopEnterEC;\n  CPUArea.DispatcherLoopTopEnterEC() = EnterEC;\n\n  uint64_t EnterECFillSRA = Thread->CurrentFrame->Pointers.DispatcherLoopTopEnterECFillSRA;\n  CPUArea.DispatcherLoopTopEnterECFillSRA() = EnterECFillSRA;\n\n  CPUArea.ContextAmd64() = {.ContextFlags = CONTEXT_CONTROL | CONTEXT_SEGMENTS | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT,\n                            .AMD64_SegCs = (FEXCore::Core::CPUState::DEFAULT_USER_CS << 3) | 3,\n                            .AMD64_SegDs = 0x2b,\n                            .AMD64_SegEs = 0x2b,\n                            .AMD64_SegFs = 0x53,\n                            .AMD64_SegGs = 0x2b,\n                            .AMD64_SegSs = 0x2b,\n                            .AMD64_EFlags = 0x202,\n                            .AMD64_MxCsr = 0x1f80,\n                            .AMD64_MxCsr_copy = 0x1f80,\n                            .AMD64_ControlWord = 0x27f};\n  Exception::LoadStateFromECContext(Thread, CPUArea.ContextAmd64().AMD64_Context);\n\n  Thread->FrontendPtr = new FrontendThreadData();\n\n  {\n    auto ThreadTID = GetCurrentThreadId();\n    Threads.emplace(ThreadTID, Thread);\n    if (StatAllocHandler) {\n      Thread->ThreadStats = StatAllocHandler->AllocateSlot(ThreadTID);\n    }\n  }\n\n  CPUArea.ThreadState() = Thread;\n  CPUArea.Area->SuspendDoorbell = reinterpret_cast<ULONG*>(&Thread->CurrentFrame->SuspendDoorbell);\n  return STATUS_SUCCESS;\n}\n\nNTSTATUS ThreadTerm(HANDLE Thread, LONG ExitCode) {\n  if (!FEX::Windows::ValidateHandleAccess(Thread, THREAD_TERMINATE)) {\n    return STATUS_ACCESS_DENIED;\n  }\n\n  auto ThreadDup = FEX::Windows::DupHandle(Thread, THREAD_QUERY_INFORMATION | THREAD_SUSPEND_RESUME);\n\n  THREAD_BASIC_INFORMATION Info;\n  if (auto Err = NtQueryInformationThread(*ThreadDup, ThreadBasicInformation, &Info, sizeof(Info), nullptr); Err) {\n    return Err;\n  }\n\n  const auto ThreadTID = reinterpret_cast<uint64_t>(Info.ClientId.UniqueThread);\n  bool Self = ThreadTID == GetCurrentThreadId();\n  if (!Self) {\n    CONTEXT TmpContext;\n    // If we are suspending a thread that isn't ourselves, try to suspend it first so we know internal JIT locks aren't being held.\n    NtSuspendThread(*ThreadDup, NULL);\n    // This will wait for the thread to be suspended\n    NtGetContextThread(*ThreadDup, &TmpContext);\n  }\n\n  const auto [Err, CPUArea] = GetThreadCPUArea(*ThreadDup);\n  if (Err) {\n    return Err;\n  }\n\n  {\n    std::scoped_lock Lock(ThreadCreationMutex);\n    auto it = Threads.find(ThreadTID);\n    if (it == Threads.end()) {\n      // Thread already terminated\n      return STATUS_SUCCESS;\n    }\n\n    Threads.erase(it);\n    if (StatAllocHandler) {\n      StatAllocHandler->DeallocateSlot(CPUArea.ThreadState()->ThreadStats);\n    }\n  }\n  auto ThreadState = CPUArea.ThreadState();\n\n  delete GetFrontendThreadData(ThreadState);\n\n  // GDT and LDT are mirrored, only free one.\n  delete[] ThreadState->CurrentFrame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_GDT];\n\n  FEX::Windows::CallRetStack::DestroyThread(ThreadState);\n  CTX->DestroyThread(ThreadState);\n  ::VirtualFree(reinterpret_cast<void*>(CPUArea.EmulatorStackLimit()), 0, MEM_RELEASE);\n  if (ThreadTID == GetCurrentThreadId()) {\n    FEX::Windows::DeinitCRTThread();\n  }\n\n  return STATUS_SUCCESS;\n}\n\nBOOLEAN BTCpu64IsProcessorFeaturePresent(UINT Feature) {\n  return CPUFeatures->IsFeaturePresent(Feature) ? TRUE : FALSE;\n}\n\nvoid UpdateProcessorInformation(SYSTEM_CPU_INFORMATION* Info) {\n  CPUFeatures->UpdateInformation(Info);\n}\n"
  },
  {
    "path": "Source/Windows/ARM64EC/libarm64ecfex.def",
    "content": "LIBRARY libarm64ecfex.dll\n\nEXPORTS\n  BTCpu64FlushInstructionCache\n  BTCpu64IsProcessorFeaturePresent\n  BTCpu64NotifyMemoryDirty\n  BTCpu64NotifyReadFile\n  DispatchJump DATA\n  RetToEntryThunk DATA\n  ExitToX64 DATA\n  BeginSimulation DATA\n  FlushInstructionCacheHeavy\n  NotifyMapViewOfSection\n  NotifyMemoryAlloc\n  NotifyMemoryFree\n  NotifyMemoryProtect\n  NotifyUnmapViewOfSection\n  ProcessInit\n  ProcessTerm\n  ResetToConsistentState\n  ThreadInit\n  ThreadTerm\n  UpdateProcessorInformation\n"
  },
  {
    "path": "Source/Windows/CMakeLists.txt",
    "content": "function(build_implib name)\n  set(name_ex ${name}_ex)\n  add_custom_target(${name_ex}lib ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/lib${name_ex}.a)\n  add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lib${name_ex}.a\n    COMMAND ${CMAKE_DLLTOOL} -d ${CMAKE_CURRENT_SOURCE_DIR}/Defs/${name}.def -k -l lib${name_ex}.a\n    COMMENT \"Building lib${name_ex}.a\")\n\n  add_library(${name_ex} SHARED IMPORTED)\n  set_property(TARGET ${name_ex} PROPERTY IMPORTED_IMPLIB ${CMAKE_CURRENT_BINARY_DIR}/lib${name_ex}.a)\n  add_dependencies(${name_ex} ${name_ex}lib)\nendfunction()\n\nfunction(patch_library_wine target)\n  add_custom_command(TARGET ${target} POST_BUILD\n    COMMAND dd bs=32 count=1 seek=2 conv=notrunc if=${CMAKE_SOURCE_DIR}/Source/Windows/wine_builtin.bin of=$<TARGET_FILE:${target}>)\nendfunction()\n\nexecute_process(COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} -print-libgcc-file-name\n  OUTPUT_VARIABLE LIBGCC_PATH\n  OUTPUT_STRIP_TRAILING_WHITESPACE)\n\nbuild_implib(ntdll)\nbuild_implib(wow64)\n\nadd_subdirectory(Common)\n\nif (ARCHITECTURE_arm64ec)\n  add_subdirectory(ARM64EC)\nelseif (ARCHITECTURE_arm64)\n  add_subdirectory(WOW64)\nendif()\n"
  },
  {
    "path": "Source/Windows/Common/CMakeLists.txt",
    "content": "add_library(CommonWindowsRuntime STATIC LoadConfig.S)\nadd_subdirectory(CRT)\nadd_subdirectory(WinAPI)\n\ntarget_link_libraries(CommonWindowsRuntime FEXCore_Base JemallocLibs)\ntarget_compile_options(CommonWindowsRuntime PRIVATE -Wno-inconsistent-dllimport)\ntarget_include_directories(CommonWindowsRuntime PRIVATE \"${CMAKE_SOURCE_DIR}/Source/Windows/include/\")\n\nadd_library(CommonWindows STATIC\n  CPUFeatures.cpp\n  SHMStats.cpp\n  InvalidationTracker.cpp\n  ImageTracker.cpp\n  Logging.cpp)\n\ntarget_link_libraries(CommonWindows FEXCore_Base)\ntarget_include_directories(CommonWindows PRIVATE \"${CMAKE_SOURCE_DIR}/Source/Windows/include/\")\n"
  },
  {
    "path": "Source/Windows/Common/CPUFeatures.cpp",
    "content": "// SPDX-License-Identifier: MIT\n\n#include \"Common/CPUInfo.h\"\n\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/HostFeatures.h>\n#include <FEXCore/fextl/fmt.h>\n\n#include <windows.h>\n\n#include \"CPUFeatures.h\"\n\nnamespace {\n\nHKEY OpenProcessorKey(uint32_t Idx) {\n  HKEY Out;\n  auto Path = fextl::fmt::format(\"Hardware\\\\Description\\\\System\\\\CentralProcessor\\\\{}\", Idx);\n  if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, Path.c_str(), 0, KEY_READ, &Out)) {\n    return nullptr;\n  }\n  return Out;\n}\n\nuint64_t ReadRegU64(HKEY Key, const char* Name) {\n  uint64_t Value = 0;\n  DWORD Size = sizeof(Value);\n  RegGetValueA(Key, nullptr, Name, 0, nullptr, &Value, &Size);\n  return Value;\n}\n\n} // namespace\n\nnamespace FEX::Windows {\nclass CPUFeaturesFromRegistry final : public FEX::CPUFeatures {\npublic:\n  explicit CPUFeaturesFromRegistry(HKEY Key) {\n    ISAR0.SetReg(ReadRegU64(Key, \"CP 4030\"));\n    PFR0.SetReg(ReadRegU64(Key, \"CP 4020\"));\n    PFR1.SetReg(ReadRegU64(Key, \"CP 4021\"));\n    ISAR1.SetReg(ReadRegU64(Key, \"CP 4031\"));\n    MMFR0.SetReg(ReadRegU64(Key, \"CP 4038\"));\n    MMFR2.SetReg(ReadRegU64(Key, \"CP 403A\"));\n    ZFR0.SetReg(ReadRegU64(Key, \"CP 4024\"));\n    MMFR1.SetReg(ReadRegU64(Key, \"CP 4039\"));\n    ISAR2.SetReg(ReadRegU64(Key, \"CP 4032\"));\n    FillFeatureFlags();\n  }\n};\n\nFEXCore::HostFeatures CPUFeatures::FetchHostFeatures(bool IsWine) {\n  HKEY Key = OpenProcessorKey(0);\n  if (!Key) {\n    ERROR_AND_DIE_FMT(\"Couldn't detect CPU features\");\n  }\n\n  CPUFeaturesFromRegistry Features(Key);\n\n  uint64_t CTR = ReadRegU64(Key, \"CP 5801\");\n  uint64_t MIDR = ReadRegU64(Key, \"CP 4000\");\n\n  FEXCore::HostFeatures HostFeatures = {};\n\n  for (uint32_t Idx = 0; Key; Key = OpenProcessorKey(++Idx)) {\n    // Truncate to 32-bits, top 32-bits are all reserved in MIDR\n    HostFeatures.CPUMIDRs.push_back(static_cast<uint32_t>(ReadRegU64(Key, \"CP 4000\")));\n    RegCloseKey(Key);\n  }\n\n  FEX::FetchHostFeatures(Features, HostFeatures, !IsWine, CTR, MIDR);\n\n  // Force-disable SVE until wine/windows gain support for SVE context save/restore\n  HostFeatures.SupportsSVE128 = false;\n  HostFeatures.SupportsSVE256 = false;\n\n  HostFeatures.SupportsCPUIndexInTPIDRRO = !IsWine;\n  return HostFeatures;\n}\n\nCPUFeatures::CPUFeatures(FEXCore::Context::Context& CTX) {\n#ifdef ARCHITECTURE_arm64ec\n  // Report as a 64-bit host for ARM64EC.\n  CpuInfo.ProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64;\n#else\n  // Report as a 32-bit host for WoW64.\n  CpuInfo.ProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL;\n#endif\n\n  // Baseline FEX feature-set\n  CpuInfo.ProcessorFeatureBits = CPU_FEATURE_VME | CPU_FEATURE_TSC | CPU_FEATURE_CMOV | CPU_FEATURE_PGE | CPU_FEATURE_PSE | CPU_FEATURE_MTRR |\n                                 CPU_FEATURE_CX8 | CPU_FEATURE_MMX | CPU_FEATURE_X86 | CPU_FEATURE_PAT | CPU_FEATURE_FXSR | CPU_FEATURE_SEP |\n                                 CPU_FEATURE_SSE | CPU_FEATURE_3DNOW | CPU_FEATURE_SSE2 | CPU_FEATURE_SSE3 | CPU_FEATURE_CX128 |\n                                 CPU_FEATURE_NX | CPU_FEATURE_SSSE3 | CPU_FEATURE_SSE41 | CPU_FEATURE_PAE | CPU_FEATURE_DAZ;\n\n  // Features that require specific host CPU support\n  const auto CPUIDResult01 = CTX.RunCPUIDFunction(0x01, 0);\n  if (CPUIDResult01.ecx & (1 << 20)) {\n    CpuInfo.ProcessorFeatureBits |= CPU_FEATURE_SSE42;\n  }\n  if (CPUIDResult01.ecx & (1 << 27)) {\n    CpuInfo.ProcessorFeatureBits |= CPU_FEATURE_XSAVE;\n  }\n  if (CPUIDResult01.ecx & (1 << 28)) {\n    CpuInfo.ProcessorFeatureBits |= CPU_FEATURE_AVX;\n  }\n\n  const auto CPUIDResult07 = CTX.RunCPUIDFunction(0x07, 0);\n  if (CPUIDResult07.ebx & (1 << 5)) {\n    CpuInfo.ProcessorFeatureBits |= CPU_FEATURE_AVX2;\n  }\n\n  const auto FamilyIdentifier = CPUIDResult01.eax;\n  CpuInfo.ProcessorLevel = ((FamilyIdentifier >> 8) & 0xf) + ((FamilyIdentifier >> 20) & 0xff); // Family\n  CpuInfo.ProcessorRevision = (FamilyIdentifier & 0xf0000) >> 4;                                // Extended Model\n  CpuInfo.ProcessorRevision |= (FamilyIdentifier & 0xf0) << 4;                                  // Model\n  CpuInfo.ProcessorRevision |= FamilyIdentifier & 0xf;                                          // Stepping\n}\n\nbool CPUFeatures::IsFeaturePresent(uint32_t Feature) {\n  switch (Feature) {\n  case PF_FLOATING_POINT_PRECISION_ERRATA: return FALSE;\n  case PF_FLOATING_POINT_EMULATED: return FALSE;\n  case PF_COMPARE_EXCHANGE_DOUBLE: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_CX8);\n  case PF_MMX_INSTRUCTIONS_AVAILABLE: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_MMX);\n  case PF_XMMI_INSTRUCTIONS_AVAILABLE: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_SSE);\n  case PF_3DNOW_INSTRUCTIONS_AVAILABLE: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_3DNOW);\n  case PF_RDTSC_INSTRUCTION_AVAILABLE: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_TSC);\n  case PF_PAE_ENABLED: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_PAE);\n  case PF_XMMI64_INSTRUCTIONS_AVAILABLE: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_SSE2);\n  case PF_SSE3_INSTRUCTIONS_AVAILABLE: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_SSE3);\n  case PF_SSSE3_INSTRUCTIONS_AVAILABLE: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_SSSE3);\n  case PF_XSAVE_ENABLED: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_XSAVE);\n  case PF_COMPARE_EXCHANGE128: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_CX128);\n  case PF_SSE_DAZ_MODE_AVAILABLE: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_DAZ);\n  case PF_NX_ENABLED: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_NX);\n  case PF_SECOND_LEVEL_ADDRESS_TRANSLATION: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_2NDLEV);\n  case PF_VIRT_FIRMWARE_ENABLED: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_VIRT);\n  case PF_RDWRFSGSBASE_AVAILABLE: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_RDFS);\n  case PF_FASTFAIL_AVAILABLE: return TRUE;\n  case PF_SSE4_1_INSTRUCTIONS_AVAILABLE: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_SSE41);\n  case PF_SSE4_2_INSTRUCTIONS_AVAILABLE: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_SSE42);\n  case PF_AVX_INSTRUCTIONS_AVAILABLE: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_AVX);\n  case PF_AVX2_INSTRUCTIONS_AVAILABLE: return !!(CpuInfo.ProcessorFeatureBits & CPU_FEATURE_AVX2);\n  default: return false;\n  }\n}\n\nvoid CPUFeatures::UpdateInformation(SYSTEM_CPU_INFORMATION* Info) {\n  Info->ProcessorArchitecture = CpuInfo.ProcessorArchitecture;\n  Info->ProcessorLevel = CpuInfo.ProcessorLevel;\n  Info->ProcessorRevision = CpuInfo.ProcessorRevision;\n  Info->ProcessorFeatureBits = CpuInfo.ProcessorFeatureBits;\n}\n} // namespace FEX::Windows\n"
  },
  {
    "path": "Source/Windows/Common/CPUFeatures.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <windef.h>\n#include <winternl.h>\n\n#include <Common/HostFeatures.h>\n\nnamespace FEXCore::Context {\nclass Context;\n}\n\n/**\n * @brief Maps CPUID results to Windows CPU info structures\n */\nnamespace FEX::Windows {\nclass CPUFeatures {\npublic:\n  static FEXCore::HostFeatures FetchHostFeatures(bool IsWine);\n\n  CPUFeatures(FEXCore::Context::Context& CTX);\n\n  /**\n   * @brief If the given PF_* feature is supported\n   */\n  bool IsFeaturePresent(uint32_t Feature);\n\n  /**\n   * @brief Fills in `Info` according to the detected CPU features\n   */\n  void UpdateInformation(SYSTEM_CPU_INFORMATION* Info);\n\nprivate:\n  SYSTEM_CPU_INFORMATION CpuInfo {};\n};\n} // namespace FEX::Windows\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Alloc.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#define _SECIMP\n#define _CRTIMP\n#include <cstdint>\n#include \"../Priv.h\"\n#include <rpmalloc/rpmalloc.h>\n\nvoid* calloc(size_t NumOfElements, size_t SizeOfElements) {\n  return ::rpcalloc(NumOfElements, SizeOfElements);\n}\n\nvoid free(void* Memory) {\n  ::rpfree(Memory);\n}\n\nvoid* malloc(size_t Size) {\n  return ::rpmalloc(Size);\n}\n\nvoid* realloc(void* Memory, size_t NewSize) {\n  return ::rprealloc(Memory, NewSize);\n}\n\nDLLEXPORT_FUNC(void*, _aligned_malloc, (size_t Size, size_t Alignment)) {\n  return ::rpaligned_alloc(Alignment, Size);\n}\n\nDLLEXPORT_FUNC(void, _aligned_free, (void* Memory)) {\n  ::rpfree(Memory);\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/CMakeLists.txt",
    "content": "target_sources(CommonWindowsRuntime PRIVATE Alloc.cpp IO.cpp Math.cpp String.cpp Misc.cpp CRT.cpp)\nadd_subdirectory(Musl)\n"
  },
  {
    "path": "Source/Windows/Common/CRT/CRT.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <iterator>\n#include <windef.h>\n#include <winternl.h>\n#include <wine/debug.h>\n#include <rpmalloc/rpmalloc.h>\n#include \"CRT.h\"\n\nextern \"C\" {\n__attribute__((section(\".CRT$FEXA\"))) void (*FEXA)() = nullptr;\n__attribute__((section(\".CRT$FEXZ\"))) void (*FEXZ)() = nullptr;\n__attribute__((section(\".CRT$XIA\"))) void (*XIA)() = nullptr;\n__attribute__((section(\".CRT$XIZ\"))) void (*XIZ)() = nullptr;\n__attribute__((section(\".CRT$XCA\"))) void (*XCA)() = nullptr;\n__attribute__((section(\".CRT$XCZ\"))) void (*XCZ)() = nullptr;\n__attribute__((section(\".CRT$XDA\"))) void (*XDA)() = nullptr;\n__attribute__((section(\".CRT$XDZ\"))) void (*XDZ)() = nullptr;\n__attribute__((section(\".CRT$XLA\"))) void (*XLA)(HINSTANCE, DWORD, LPVOID*) = nullptr;\n__attribute__((section(\".CRT$XZA\"))) void (*XLZ)(HINSTANCE, DWORD, LPVOID*) = nullptr;\n\nuint64_t _tls_index;\nextern void (*__CTOR_LIST__[])();\nextern void (*__DTOR_LIST__[])();\n\nBOOL DllMainCRTStartup(HMODULE Handle, DWORD Reason, LPVOID Reserved) {\n  LdrDisableThreadCalloutsForDll(Handle);\n  return true;\n}\n}\nnamespace {\ntemplate<typename TFuncIt, typename... TArgs>\nvoid RunFuncArray(TFuncIt Begin, TFuncIt End, TArgs... Args) {\n  for (auto It = Begin; It != End; It++) {\n    if (*It) {\n      (**It)(Args...);\n    }\n  }\n}\n} // namespace\n\nnamespace FEX::Windows {\nvoid InitCRTProcess() {\n  rpmalloc_initialize(nullptr);\n\n  auto GNUCtorBegin = &__CTOR_LIST__[1];\n  auto GNUCtorEnd = GNUCtorBegin;\n  while (*GNUCtorEnd != nullptr) {\n    GNUCtorEnd++;\n  }\n\n  RunFuncArray(&FEXA, &FEXZ);\n  RunFuncArray(std::reverse_iterator(GNUCtorEnd), std::reverse_iterator(GNUCtorBegin));\n  RunFuncArray(&XIA, &XIZ);\n  RunFuncArray(&XCA, &XCZ);\n  RunFuncArray(&XLA, &XLZ, nullptr, DLL_PROCESS_ATTACH, nullptr);\n}\n\nvoid InitCRTThread() {\n  rpmalloc_thread_initialize();\n  RunFuncArray(&XLA, &XLZ, nullptr, DLL_THREAD_ATTACH, nullptr);\n}\n\nvoid DeinitCRTThread() {\n  RunFuncArray(&XLA, &XLZ, nullptr, DLL_THREAD_DETACH, nullptr);\n  rpmalloc_thread_finalize();\n}\n} // namespace FEX::Windows\n"
  },
  {
    "path": "Source/Windows/Common/CRT/CRT.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\nnamespace FEX::Windows {\nvoid InitCRTProcess();\nvoid InitCRTThread();\nvoid DeinitCRTThread();\n} // namespace FEX::Windows\n"
  },
  {
    "path": "Source/Windows/Common/CRT/IO.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#define _FILE_DEFINED\nstruct FILE;\n#define _SECIMP\n#define _CRTIMP\n\n#include <memory>\n#include <vector>\n#include <mutex>\n#include <algorithm>\n#include <cstdlib>\n#include <cstdio>\n#include <cstdint>\n#include <cerrno>\n#include <io.h>\n#include <ctype.h>\n#include <wchar.h>\n#include <windef.h>\n#include <winternl.h>\n#include <winbase.h>\n#include <winerror.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n#include <handleapi.h>\n#include <fileapi.h>\n#include <errhandlingapi.h>\n#include <wine/debug.h>\n#include \"../Priv.h\"\n\nstruct FILE {\n  HANDLE Handle {INVALID_HANDLE_VALUE};\n  int FileHandle {-1};\n  bool Append {false};\n\n  FILE(HANDLE Handle, int FileHandle, bool Append)\n    : Handle {Handle}\n    , FileHandle {FileHandle}\n    , Append {Append} {}\n\n  ~FILE() {\n    CloseHandle(Handle);\n  }\n};\n\nnamespace {\nstd::mutex FileTableLock;\nstd::vector<std::unique_ptr<FILE>> OpenFileTable;\n\n\nint ErrnoReturn(int Value) {\n  errno = Value;\n  return -1;\n}\n\nDWORD OpenFlagToAccess(int OpenFlag) {\n  if (OpenFlag & _O_RDONLY) {\n    return GENERIC_READ;\n  }\n  if (OpenFlag & _O_WRONLY) {\n    return GENERIC_WRITE;\n  }\n  if (OpenFlag & _O_RDWR) {\n    return GENERIC_READ | GENERIC_WRITE;\n  }\n  return 0;\n}\n\nDWORD OpenFlagToCreation(int OpenFlag) {\n  if ((OpenFlag & (_O_TRUNC | _O_CREAT)) == (_O_TRUNC | _O_CREAT)) {\n    return CREATE_ALWAYS;\n  }\n  if ((OpenFlag & (_O_EXCL | _O_CREAT)) == (_O_EXCL | _O_CREAT)) {\n    return CREATE_NEW;\n  }\n  if (OpenFlag & _O_TRUNC) {\n    return TRUNCATE_EXISTING;\n  }\n  if (OpenFlag & _O_CREAT) {\n    return OPEN_ALWAYS;\n  }\n  return OPEN_EXISTING;\n}\n\nint AllocateFile(std::unique_ptr<FILE>&& File) {\n  std::scoped_lock Lock {FileTableLock};\n  auto It = std::find(OpenFileTable.begin(), OpenFileTable.end(), nullptr);\n  if (It == OpenFileTable.end()) {\n    It = OpenFileTable.emplace(OpenFileTable.end(), std::move(File));\n  } else {\n    *It = std::move(File);\n  }\n  size_t Idx = std::distance(OpenFileTable.begin(), It);\n  if (Idx >= std::numeric_limits<int>::max()) {\n    std::terminate();\n  }\n  (*It)->FileHandle = static_cast<int>(Idx);\n  return (*It)->FileHandle;\n}\n\nFILE* GetFile(int FileHandle) {\n  std::scoped_lock Lock {FileTableLock};\n  return OpenFileTable[FileHandle].get();\n}\n\nvoid RemoveFile(int FileHandle) {\n  std::scoped_lock Lock {FileTableLock};\n  OpenFileTable[FileHandle].reset();\n}\n\nDWORD OriginToMoveMethod(int Origin) {\n  switch (Origin) {\n  case SEEK_SET: return FILE_BEGIN;\n  case SEEK_CUR: return FILE_CURRENT;\n  case SEEK_END: return FILE_END;\n  }\n  UNIMPLEMENTED();\n}\n} // namespace\n\n// io.h File Operatons\nDLLEXPORT_FUNC(int, _wsopen, (const wchar_t* Filename, int OpenFlag, int ShareFlag, ...)) {\n  DWORD Attrs = 0;\n  if (OpenFlag & _O_CREAT) {\n    va_list VA;\n    int PermMode;\n    va_start(VA, ShareFlag);\n    PermMode = va_arg(VA, int);\n    va_end(VA);\n    if (!(PermMode & _S_IWRITE)) {\n      Attrs = FILE_ATTRIBUTE_READONLY;\n    }\n  }\n  auto access = OpenFlagToAccess(OpenFlag);\n  ULONG sharing = FILE_SHARE_READ;\n  if (access == GENERIC_WRITE) {\n    sharing |= FILE_SHARE_WRITE;\n  }\n\n  if (ShareFlag == _SH_DENYRW) {\n    sharing = 0;\n  } else if (ShareFlag == _SH_DENYWR) {\n    sharing &= ~FILE_SHARE_WRITE;\n  } else if (ShareFlag == _SH_DENYRD) {\n    sharing &= ~FILE_SHARE_READ;\n  }\n\n  HANDLE Handle = CreateFileW(Filename, access, sharing, nullptr, OpenFlagToCreation(OpenFlag), Attrs, nullptr);\n  if (Handle != INVALID_HANDLE_VALUE) {\n    return AllocateFile(std::make_unique<FILE>(Handle, -1, OpenFlag & _O_APPEND));\n  }\n\n  if (GetLastError() == ERROR_FILE_EXISTS) {\n    return ErrnoReturn(EEXIST);\n  }\n  if (GetLastError() == ERROR_FILE_NOT_FOUND) {\n    return ErrnoReturn(ENOENT);\n  }\n  if (GetLastError() == ERROR_ACCESS_DENIED) {\n    return ErrnoReturn(EACCES);\n  }\n  return ErrnoReturn(ENOENT);\n}\n\nDLLEXPORT_FUNC(int, _wopen, (const wchar_t* Filename, int OpenFlag, ...)) {\n  if (OpenFlag & _O_CREAT) {\n    va_list VA;\n    int PermMode;\n    va_start(VA, OpenFlag);\n    PermMode = va_arg(VA, int);\n    va_end(VA);\n    return _wsopen(Filename, OpenFlag, _SH_DENYNO, PermMode);\n  }\n  return _wsopen(Filename, OpenFlag, _SH_DENYNO);\n}\n\nDLLEXPORT_FUNC(int, _sopen, (const char* Filename, int OpenFlag, int ShareFlag, ...)) {\n  UNICODE_STRING FilenameW;\n  if (!RtlCreateUnicodeStringFromAsciiz(&FilenameW, Filename)) {\n    return ErrnoReturn(EINVAL);\n  }\n  int ret = 0;\n  if (OpenFlag & _O_CREAT) {\n    va_list VA;\n    int PermMode;\n    va_start(VA, ShareFlag);\n    PermMode = va_arg(VA, int);\n    va_end(VA);\n    ret = _wopen(FilenameW.Buffer, OpenFlag, ShareFlag, PermMode);\n  } else {\n    ret = _wopen(FilenameW.Buffer, OpenFlag, ShareFlag);\n  }\n  RtlFreeUnicodeString(&FilenameW);\n  return ret;\n}\n\nDLLEXPORT_FUNC(int, _open, (const char* Filename, int OpenFlag, ...)) {\n  if (OpenFlag & _O_CREAT) {\n    va_list VA;\n    int PermMode;\n    va_start(VA, OpenFlag);\n    PermMode = va_arg(VA, int);\n    va_end(VA);\n    return _sopen(Filename, OpenFlag, _SH_DENYNO, PermMode);\n  }\n  return _sopen(Filename, OpenFlag, _SH_DENYNO);\n}\n\nDLLEXPORT_FUNC(int, open, (const char* Filename, int OpenFlag, ...)) {\n  if (OpenFlag & _O_CREAT) {\n    va_list VA;\n    int PermMode;\n    va_start(VA, OpenFlag);\n    PermMode = va_arg(VA, int);\n    va_end(VA);\n    return _open(Filename, OpenFlag, PermMode);\n  }\n  return _open(Filename, OpenFlag);\n}\n\nDLLEXPORT_FUNC(int, _close, (int FileHandle)) {\n  RemoveFile(FileHandle);\n  return 0;\n}\n\nint close(int FileHandle) {\n  return _close(FileHandle);\n}\n\nint64_t _lseeki64(int FileHandle, int64_t Offset, int Origin) {\n  LARGE_INTEGER Res;\n  SetFilePointerEx(GetFile(FileHandle)->Handle, LARGE_INTEGER {.QuadPart = Offset}, &Res, OriginToMoveMethod(Origin));\n  return Res.QuadPart;\n}\n\nDLLEXPORT_FUNC(long, _lseek, (int FileHandle, long Offset, int Origin)) {\n  LARGE_INTEGER Res;\n  SetFilePointerEx(GetFile(FileHandle)->Handle, LARGE_INTEGER {.QuadPart = Offset}, &Res, OriginToMoveMethod(Origin));\n  return Res.QuadPart;\n}\n\nlong lseek(int FileHandle, long Offset, int Origin) {\n  return _lseek(FileHandle, Offset, Origin);\n}\n\nint64_t _telli64(int FileHandle) {\n  LARGE_INTEGER Res;\n  SetFilePointerEx(GetFile(FileHandle)->Handle, LARGE_INTEGER {}, &Res, FILE_CURRENT);\n  return Res.QuadPart;\n}\n\nDLLEXPORT_FUNC(int, _read, (int FileHandle, void* DstBuf, unsigned int MaxCharCount)) {\n  DWORD Read;\n  ReadFile(GetFile(FileHandle)->Handle, DstBuf, MaxCharCount, &Read, nullptr);\n  return static_cast<int>(Read);\n}\n\nint read(int FileHandle, void* DstBuf, unsigned int MaxCharCount) {\n  return _read(FileHandle, DstBuf, MaxCharCount);\n}\n\nDLLEXPORT_FUNC(int, _write, (int FileHandle, const void* Buf, unsigned int MaxCharCount)) {\n  DWORD Written;\n  FILE* File = GetFile(FileHandle);\n  if (File->Append) {\n    SetFilePointerEx(File->Handle, LARGE_INTEGER {}, nullptr, FILE_END);\n  }\n  WriteFile(File->Handle, Buf, MaxCharCount, &Written, nullptr);\n  return static_cast<int>(Written);\n}\n\nint write(int FileHandle, const void* Buf, unsigned int MaxCharCount) {\n  return _write(FileHandle, Buf, MaxCharCount);\n}\n\nDLLEXPORT_FUNC(int, _isatty, (int _FileHandle)) {\n  return 0;\n}\n\nDLLEXPORT_FUNC(intptr_t, _get_osfhandle, (int _FileHandle)) {\n  UNIMPLEMENTED();\n}\n\nnamespace {\ntemplate<typename TStr, typename TChar, TStr (*StrchrFunc)(TStr, TChar)>\nint ModeToOpenFlag(TStr Mode) {\n  int OpenFlag = 0;\n  if (StrchrFunc(Mode, 'a')) {\n    OpenFlag |= _O_RDWR | _O_CREAT | _O_APPEND;\n  } else if (StrchrFunc(Mode, 'r')) {\n    if (StrchrFunc(Mode, '+')) {\n      OpenFlag |= _O_RDWR;\n    } else {\n      OpenFlag |= _O_RDONLY;\n    }\n  } else {\n    OpenFlag |= _O_RDWR | _O_CREAT | _O_TRUNC;\n  }\n  if (StrchrFunc(Mode, 'x')) {\n    OpenFlag |= _O_EXCL;\n  }\n  return OpenFlag;\n}\n} // namespace\n\n// stdio.h File Operations\nDLLEXPORT_FUNC(FILE*, _wfopen, (const wchar_t* __restrict__ Filename, const wchar_t* __restrict__ Mode)) {\n  int OpenFlag = ModeToOpenFlag<const wchar_t*, wchar_t, &wcschr>(Mode);\n  int Ret = _wopen(Filename, OpenFlag, _S_IWRITE | _S_IREAD);\n  if (Ret == -1) {\n    return nullptr;\n  }\n  return GetFile(Ret);\n}\n\nFILE* fopen(const char* __restrict__ Filename, const char* __restrict__ Mode) {\n  int OpenFlag = ModeToOpenFlag<const char*, int, &strchr>(Mode);\n  int Ret = _open(Filename, OpenFlag, _S_IWRITE | _S_IREAD);\n  if (Ret == -1) {\n    return nullptr;\n  }\n  return GetFile(Ret);\n}\n\nFILE* fdopen(int _FileHandle, const char* _Mode) {\n  UNIMPLEMENTED();\n}\n\nint fclose(FILE* File) {\n  RemoveFile(File->FileHandle);\n  return 0;\n}\n\nDLLEXPORT_FUNC(int, _fseeki64, (FILE * File, _off64_t Offset, int Origin)) {\n  SetFilePointerEx(File->Handle, LARGE_INTEGER {.QuadPart = Offset}, nullptr, OriginToMoveMethod(Origin));\n  return 0;\n}\n\nint fseek(FILE* File, long Offset, int Origin) {\n  return _fseeki64(File, Offset, Origin);\n}\n\nDLLEXPORT_FUNC(_off64_t, _ftelli64, (FILE * File)) {\n  LARGE_INTEGER Res;\n  SetFilePointerEx(File->Handle, LARGE_INTEGER {}, &Res, FILE_CURRENT);\n  return Res.QuadPart;\n}\n\nlong ftell(FILE* File) {\n  return static_cast<long>(_ftelli64(File));\n}\n\nsize_t fread(void* __restrict__ DstBuf, size_t ElementSize, size_t Count, FILE* __restrict__ File) {\n  DWORD Read;\n  ReadFile(File->Handle, DstBuf, ElementSize * Count, &Read, nullptr);\n  return static_cast<size_t>(Read);\n}\n\nsize_t fwrite(const void* __restrict__ Str, size_t Size, size_t Count, FILE* __restrict__ File) {\n  DWORD Written;\n  if (File->Append) {\n    SetFilePointerEx(File->Handle, LARGE_INTEGER {}, nullptr, FILE_END);\n  }\n  WriteFile(File->Handle, Str, Size * Count, &Written, nullptr);\n  return static_cast<size_t>(Written);\n}\n\nvoid setbuf(FILE* __restrict__ _File, char* __restrict__ _Buffer) {\n  UNIMPLEMENTED();\n}\n\nint fflush(FILE* _File) {\n  UNIMPLEMENTED();\n}\n\nint fprintf(FILE* __restrict__, const char* __restrict__, ...) {\n  UNIMPLEMENTED();\n}\n\nint vfprintf(FILE* __restrict__, const char* __restrict__, va_list) {\n  UNIMPLEMENTED();\n}\n\nint ungetc(int _Ch, FILE* _File) {\n  UNIMPLEMENTED();\n}\n\nwint_t fgetwc(FILE* _File) {\n  UNIMPLEMENTED();\n}\n\nwint_t fputwc(wchar_t _Ch, FILE* _File) {\n  UNIMPLEMENTED();\n}\n\nint fputc(int _Ch, FILE* _File) {\n  UNIMPLEMENTED();\n}\n\nint fputs(const char* __restrict__ _Str, FILE* __restrict__ _File) {\n  UNIMPLEMENTED();\n}\n\nint getc(FILE* _File) {\n  UNIMPLEMENTED();\n}\n\nvoid _lock_file(FILE* _File) {\n  UNIMPLEMENTED();\n}\n\nwint_t ungetwc(wint_t _Ch, FILE* _File) {\n  UNIMPLEMENTED();\n}\n\nvoid _unlock_file(FILE* _File) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(FILE*, __acrt_iob_func, (unsigned index)) {\n  return nullptr;\n}\n\nDLLEXPORT_FUNC(int, _fileno, (FILE * _File)) {\n  UNIMPLEMENTED();\n}\n\nint access(const char* Path, int AccessMode) {\n  UNICODE_STRING PathW;\n  if (!RtlCreateUnicodeStringFromAsciiz(&PathW, Path)) {\n    return ErrnoReturn(EINVAL);\n  }\n\n  UNICODE_STRING NTPath;\n  bool Success = RtlDosPathNameToNtPathName_U(PathW.Buffer, &NTPath, nullptr, nullptr);\n  RtlFreeUnicodeString(&PathW);\n  if (!Success) {\n    return ErrnoReturn(EINVAL);\n  }\n\n  OBJECT_ATTRIBUTES ObjAttributes;\n  InitializeObjectAttributes(&ObjAttributes, &NTPath, OBJ_CASE_INSENSITIVE, nullptr, nullptr);\n\n  FILE_BASIC_INFORMATION Info;\n  Success = !NtQueryAttributesFile(&ObjAttributes, &Info);\n  RtlFreeUnicodeString(&NTPath);\n\n  if (!Success) {\n    return ErrnoReturn(ENOENT);\n  }\n\n  if ((AccessMode & W_OK) && (Info.FileAttributes & FILE_ATTRIBUTE_READONLY)) {\n    return ErrnoReturn(EACCES);\n  }\n\n  return 0;\n}\n\nint rename(const char* _OldFilename, const char* _NewFilename) {\n  UNIMPLEMENTED();\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Math.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#define _SECIMP\n#define _CRTIMP\n#include <cstdlib>\n#include <cstdint>\n#include <cmath>\n\nlong double tanl(long double X) {\n  return tan(static_cast<double>(X));\n}\n\nlong double sinl(long double X) {\n  return sin(static_cast<double>(X));\n}\n\nlong double cosl(long double X) {\n  return cos(static_cast<double>(X));\n}\n\nlong double exp2l(long double N) {\n  return exp2(static_cast<double>(N));\n}\n\nlong double log2l(long double N) {\n  return log2(static_cast<double>(N));\n}\n\nlong double atan2l(long double X, long double Y) {\n  return atan2(static_cast<double>(X), static_cast<double>(Y));\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Misc.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#define _SECIMP\n#define _CRTIMP\n#include <cstdlib>\n#include <cstdint>\n#include <unistd.h>\n#include <wchar.h>\n#include <windef.h>\n#include <winternl.h>\n#include <winbase.h>\n#include \"../Priv.h\"\n\nnamespace {\nchar* Env;\nchar** EnvArray;\n} // namespace\n\nnamespace {\nvoid InitEnv() {\n  RtlAcquirePebLock();\n  auto ProcessParams = reinterpret_cast<RTL_USER_PROCESS_PARAMETERS64*>(NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters);\n  wchar_t* EnvW = reinterpret_cast<wchar_t*>(ProcessParams->Environment);\n  DWORD SizeW = 4;\n  // The PEB environment is terminated by two null wchars.\n  for (wchar_t* It = EnvW; It[0] != 0 || It[1] != 0; It++, SizeW += 2)\n    ;\n  DWORD Size;\n  RtlUnicodeToMultiByteSize(&Size, EnvW, SizeW);\n  Env = reinterpret_cast<char*>(RtlAllocateHeap(GetProcessHeap(), 0, Size + 1));\n  RtlUnicodeToMultiByteN(Env, Size + 1, nullptr, EnvW, SizeW);\n\n  size_t EnvCount = 0;\n  char* It = Env;\n  while (*It) {\n    EnvCount++;\n    It += strlen(It) + 1;\n  }\n\n  EnvArray = reinterpret_cast<char**>(RtlAllocateHeap(GetProcessHeap(), 0, (EnvCount + 1) * sizeof(char*)));\n\n  It = Env;\n  for (size_t i = 0; i < EnvCount; i++) {\n    EnvArray[i] = It;\n    It += strlen(It) + 1;\n  }\n  EnvArray[EnvCount] = nullptr;\n\n  RtlReleasePebLock();\n}\n\n__attribute__((used, section(\".CRT$FEXB\"))) void (*_InitEnv)(void) = InitEnv;\n} // namespace\n\nchar*** __p__environ() {\n  return &EnvArray;\n}\n\nchar* getenv(const char* VarName) {\n  size_t VarNameLen = strlen(VarName);\n  char* It = Env;\n  char* Ret = nullptr;\n\n  while (*It) {\n    char* Eq = strchr(It, '=');\n    if (Eq && Eq - It == VarNameLen && !strncmp(It, VarName, VarNameLen)) {\n      Ret = Eq + 1;\n      break;\n    }\n\n    It += strlen(It) + 1;\n  }\n\n  return Ret;\n}\n\nint atexit(void (*)(void)) {\n  return 0;\n}\n\n#pragma push_macro(\"abort\")\n#undef abort\nvoid abort(void) {\n  UNIMPLEMENTED();\n}\n#pragma pop_macro(\"abort\")\n\nint getpid(void) {\n  return static_cast<int>(GetCurrentProcessId());\n}\n\nvoid exit(int _Code) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(void, _assert, (const char* message, const char* file, unsigned line)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(\n  uintptr_t, _beginthreadex,\n  (void* security, unsigned stack_size, unsigned(__stdcall* start_address)(void*), void* arglist, unsigned initflag, unsigned* thrdaddr)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int*, __sys_nerr, (void)) {\n  UNIMPLEMENTED();\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/CMakeLists.txt",
    "content": "target_sources(CommonWindowsRuntime PRIVATE exp2.c log2_data.c remainder.c strtoimax.c strtoull.c exp_data.c fmod.c log2.c isnan.c remquo.c strtoll.c strtoumax.c __math_uflow.c __math_oflow.c __math_xflow.c __math_invalid.c __math_divzero.c)\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/__math_divzero.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright © 2005-2020 Rich Felker, et al.\n\n#include \"libm.h\"\n\ndouble __math_divzero(uint32_t sign) {\n  return fp_barrier(sign ? -1.0 : 1.0) / 0.0;\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/__math_invalid.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright © 2005-2020 Rich Felker, et al.\n\n#include \"libm.h\"\n\ndouble __math_invalid(double x) {\n  return (x - x) / (x - x);\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/__math_oflow.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright © 2005-2020 Rich Felker, et al.\n\n#include \"libm.h\"\n\ndouble __math_oflow(uint32_t sign) {\n  return __math_xflow(sign, 0x1p769);\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/__math_uflow.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright © 2005-2020 Rich Felker, et al.\n\n#include \"libm.h\"\n\ndouble __math_uflow(uint32_t sign) {\n  return __math_xflow(sign, 0x1p-767);\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/__math_xflow.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright © 2005-2020 Rich Felker, et al.\n\n#include \"libm.h\"\n\ndouble __math_xflow(uint32_t sign, double y) {\n  return eval_as_double(fp_barrier(sign ? -y : y) * y);\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/exp2.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright (c) 2018, Arm Limited.\n\n#include <math.h>\n#include <stdint.h>\n#include \"libm.h\"\n#include \"exp_data.h\"\n\n#define N (1 << EXP_TABLE_BITS)\n#define Shift __exp_data.exp2_shift\n#define T __exp_data.tab\n#define C1 __exp_data.exp2_poly[0]\n#define C2 __exp_data.exp2_poly[1]\n#define C3 __exp_data.exp2_poly[2]\n#define C4 __exp_data.exp2_poly[3]\n#define C5 __exp_data.exp2_poly[4]\n\n/* Handle cases that may overflow or underflow when computing the result that\n   is scale*(1+TMP) without intermediate rounding.  The bit representation of\n   scale is in SBITS, however it has a computed exponent that may have\n   overflown into the sign bit so that needs to be adjusted before using it as\n   a double.  (int32_t)KI is the k used in the argument reduction and exponent\n   adjustment of scale, positive k here means the result may overflow and\n   negative k means the result may underflow.  */\nstatic inline double specialcase(double_t tmp, uint64_t sbits, uint64_t ki) {\n  double_t scale, y;\n\n  if ((ki & 0x80000000) == 0) {\n    /* k > 0, the exponent of scale might have overflowed by 1.  */\n    sbits -= 1ull << 52;\n    scale = asdouble(sbits);\n    y = 2 * (scale + scale * tmp);\n    return eval_as_double(y);\n  }\n  /* k < 0, need special care in the subnormal range.  */\n  sbits += 1022ull << 52;\n  scale = asdouble(sbits);\n  y = scale + scale * tmp;\n  if (y < 1.0) {\n    /* Round y to the right precision before scaling it into the subnormal\n       range to avoid double rounding that can cause 0.5+E/2 ulp error where\n       E is the worst-case ulp error outside the subnormal range.  So this\n       is only useful if the goal is better than 1 ulp worst-case error.  */\n    double_t hi, lo;\n    lo = scale - y + scale * tmp;\n    hi = 1.0 + y;\n    lo = 1.0 - hi + y + lo;\n    y = eval_as_double(hi + lo) - 1.0;\n    /* Avoid -0.0 with downward rounding.  */\n    if (WANT_ROUNDING && y == 0.0) {\n      y = 0.0;\n    }\n    /* The underflow exception needs to be signaled explicitly.  */\n    fp_force_eval(fp_barrier(0x1p-1022) * 0x1p-1022);\n  }\n  y = 0x1p-1022 * y;\n  return eval_as_double(y);\n}\n\n/* Top 12 bits of a double (sign and exponent bits).  */\nstatic inline uint32_t top12(double x) {\n  return asuint64(x) >> 52;\n}\n\ndouble exp2(double x) {\n  uint32_t abstop;\n  uint64_t ki, idx, top, sbits;\n  double_t kd, r, r2, scale, tail, tmp;\n\n  abstop = top12(x) & 0x7ff;\n  if (predict_false(abstop - top12(0x1p-54) >= top12(512.0) - top12(0x1p-54))) {\n    if (abstop - top12(0x1p-54) >= 0x80000000) {\n      /* Avoid spurious underflow for tiny x.  */\n      /* Note: 0 is common input.  */\n      return WANT_ROUNDING ? 1.0 + x : 1.0;\n    }\n    if (abstop >= top12(1024.0)) {\n      if (asuint64(x) == asuint64(-INFINITY)) {\n        return 0.0;\n      }\n      if (abstop >= top12(INFINITY)) {\n        return 1.0 + x;\n      }\n      if (!(asuint64(x) >> 63)) {\n        return __math_oflow(0);\n      } else if (asuint64(x) >= asuint64(-1075.0)) {\n        return __math_uflow(0);\n      }\n    }\n    if (2 * asuint64(x) > 2 * asuint64(928.0)) {\n      /* Large x is special cased below.  */\n      abstop = 0;\n    }\n  }\n\n  /* exp2(x) = 2^(k/N) * 2^r, with 2^r in [2^(-1/2N),2^(1/2N)].  */\n  /* x = k/N + r, with int k and r in [-1/2N, 1/2N].  */\n  kd = eval_as_double(x + Shift);\n  ki = asuint64(kd); /* k.  */\n  kd -= Shift;       /* k/N for int k.  */\n  r = x - kd;\n  /* 2^(k/N) ~= scale * (1 + tail).  */\n  idx = 2 * (ki % N);\n  top = ki << (52 - EXP_TABLE_BITS);\n  tail = asdouble(T[idx]);\n  /* This is only a valid scale when -1023*N < k < 1024*N.  */\n  sbits = T[idx + 1] + top;\n  /* exp2(x) = 2^(k/N) * 2^r ~= scale + scale * (tail + 2^r - 1).  */\n  /* Evaluation is optimized assuming superscalar pipelined execution.  */\n  r2 = r * r;\n  /* Without fma the worst case error is 0.5/N ulp larger.  */\n  /* Worst case error is less than 0.5+0.86/N+(abs poly error * 2^53) ulp.  */\n  tmp = tail + r * C1 + r2 * (C2 + r * C3) + r2 * r2 * (C4 + r * C5);\n  if (predict_false(abstop == 0)) {\n    return specialcase(tmp, sbits, ki);\n  }\n  scale = asdouble(sbits);\n  /* Note: tmp == 0 or |tmp| > 2^-65 and scale > 2^-928, so there\n     is no spurious underflow here even without fma.  */\n  return eval_as_double(scale + scale * tmp);\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/exp_data.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright (c) 2018, Arm Limited.\n\n#include \"exp_data.h\"\n\n#define N (1 << EXP_TABLE_BITS)\n\nconst struct exp_data __exp_data = {\n  // N/ln2\n  .invln2N = 0x1.71547652b82fep0 * N,\n  // -ln2/N\n  .negln2hiN = -0x1.62e42fefa0000p-8,\n  .negln2loN = -0x1.cf79abc9e3b3ap-47,\n// Used for rounding when !TOINT_INTRINSICS\n#if EXP_USE_TOINT_NARROW\n  .shift = 0x1800000000.8p0,\n#else\n  .shift = 0x1.8p52,\n#endif\n  // exp polynomial coefficients.\n  .poly =\n    {\n      // abs error: 1.555*2^-66\n      // ulp error: 0.509 (0.511 without fma)\n      // if |x| < ln2/256+eps\n      // abs error if |x| < ln2/256+0x1p-15: 1.09*2^-65\n      // abs error if |x| < ln2/128: 1.7145*2^-56\n      0x1.ffffffffffdbdp-2,\n      0x1.555555555543cp-3,\n      0x1.55555cf172b91p-5,\n      0x1.1111167a4d017p-7,\n    },\n  .exp2_shift = 0x1.8p52 / N,\n  // exp2 polynomial coefficients.\n  .exp2_poly =\n    {\n      // abs error: 1.2195*2^-65\n      // ulp error: 0.507 (0.511 without fma)\n      // if |x| < 1/256\n      // abs error if |x| < 1/128: 1.9941*2^-56\n      0x1.62e42fefa39efp-1,\n      0x1.ebfbdff82c424p-3,\n      0x1.c6b08d70cf4b5p-5,\n      0x1.3b2abd24650ccp-7,\n      0x1.5d7e09b4e3a84p-10,\n    },\n  // 2^(k/N) ~= H[k]*(1 + T[k]) for int k in [0,N)\n  // tab[2*k] = asuint64(T[k])\n  // tab[2*k+1] = asuint64(H[k]) - (k << 52)/N\n  .tab =\n    {\n      0x0,\n      0x3ff0000000000000,\n      0x3c9b3b4f1a88bf6e,\n      0x3feff63da9fb3335,\n      0xbc7160139cd8dc5d,\n      0x3fefec9a3e778061,\n      0xbc905e7a108766d1,\n      0x3fefe315e86e7f85,\n      0x3c8cd2523567f613,\n      0x3fefd9b0d3158574,\n      0xbc8bce8023f98efa,\n      0x3fefd06b29ddf6de,\n      0x3c60f74e61e6c861,\n      0x3fefc74518759bc8,\n      0x3c90a3e45b33d399,\n      0x3fefbe3ecac6f383,\n      0x3c979aa65d837b6d,\n      0x3fefb5586cf9890f,\n      0x3c8eb51a92fdeffc,\n      0x3fefac922b7247f7,\n      0x3c3ebe3d702f9cd1,\n      0x3fefa3ec32d3d1a2,\n      0xbc6a033489906e0b,\n      0x3fef9b66affed31b,\n      0xbc9556522a2fbd0e,\n      0x3fef9301d0125b51,\n      0xbc5080ef8c4eea55,\n      0x3fef8abdc06c31cc,\n      0xbc91c923b9d5f416,\n      0x3fef829aaea92de0,\n      0x3c80d3e3e95c55af,\n      0x3fef7a98c8a58e51,\n      0xbc801b15eaa59348,\n      0x3fef72b83c7d517b,\n      0xbc8f1ff055de323d,\n      0x3fef6af9388c8dea,\n      0x3c8b898c3f1353bf,\n      0x3fef635beb6fcb75,\n      0xbc96d99c7611eb26,\n      0x3fef5be084045cd4,\n      0x3c9aecf73e3a2f60,\n      0x3fef54873168b9aa,\n      0xbc8fe782cb86389d,\n      0x3fef4d5022fcd91d,\n      0x3c8a6f4144a6c38d,\n      0x3fef463b88628cd6,\n      0x3c807a05b0e4047d,\n      0x3fef3f49917ddc96,\n      0x3c968efde3a8a894,\n      0x3fef387a6e756238,\n      0x3c875e18f274487d,\n      0x3fef31ce4fb2a63f,\n      0x3c80472b981fe7f2,\n      0x3fef2b4565e27cdd,\n      0xbc96b87b3f71085e,\n      0x3fef24dfe1f56381,\n      0x3c82f7e16d09ab31,\n      0x3fef1e9df51fdee1,\n      0xbc3d219b1a6fbffa,\n      0x3fef187fd0dad990,\n      0x3c8b3782720c0ab4,\n      0x3fef1285a6e4030b,\n      0x3c6e149289cecb8f,\n      0x3fef0cafa93e2f56,\n      0x3c834d754db0abb6,\n      0x3fef06fe0a31b715,\n      0x3c864201e2ac744c,\n      0x3fef0170fc4cd831,\n      0x3c8fdd395dd3f84a,\n      0x3feefc08b26416ff,\n      0xbc86a3803b8e5b04,\n      0x3feef6c55f929ff1,\n      0xbc924aedcc4b5068,\n      0x3feef1a7373aa9cb,\n      0xbc9907f81b512d8e,\n      0x3feeecae6d05d866,\n      0xbc71d1e83e9436d2,\n      0x3feee7db34e59ff7,\n      0xbc991919b3ce1b15,\n      0x3feee32dc313a8e5,\n      0x3c859f48a72a4c6d,\n      0x3feedea64c123422,\n      0xbc9312607a28698a,\n      0x3feeda4504ac801c,\n      0xbc58a78f4817895b,\n      0x3feed60a21f72e2a,\n      0xbc7c2c9b67499a1b,\n      0x3feed1f5d950a897,\n      0x3c4363ed60c2ac11,\n      0x3feece086061892d,\n      0x3c9666093b0664ef,\n      0x3feeca41ed1d0057,\n      0x3c6ecce1daa10379,\n      0x3feec6a2b5c13cd0,\n      0x3c93ff8e3f0f1230,\n      0x3feec32af0d7d3de,\n      0x3c7690cebb7aafb0,\n      0x3feebfdad5362a27,\n      0x3c931dbdeb54e077,\n      0x3feebcb299fddd0d,\n      0xbc8f94340071a38e,\n      0x3feeb9b2769d2ca7,\n      0xbc87deccdc93a349,\n      0x3feeb6daa2cf6642,\n      0xbc78dec6bd0f385f,\n      0x3feeb42b569d4f82,\n      0xbc861246ec7b5cf6,\n      0x3feeb1a4ca5d920f,\n      0x3c93350518fdd78e,\n      0x3feeaf4736b527da,\n      0x3c7b98b72f8a9b05,\n      0x3feead12d497c7fd,\n      0x3c9063e1e21c5409,\n      0x3feeab07dd485429,\n      0x3c34c7855019c6ea,\n      0x3feea9268a5946b7,\n      0x3c9432e62b64c035,\n      0x3feea76f15ad2148,\n      0xbc8ce44a6199769f,\n      0x3feea5e1b976dc09,\n      0xbc8c33c53bef4da8,\n      0x3feea47eb03a5585,\n      0xbc845378892be9ae,\n      0x3feea34634ccc320,\n      0xbc93cedd78565858,\n      0x3feea23882552225,\n      0x3c5710aa807e1964,\n      0x3feea155d44ca973,\n      0xbc93b3efbf5e2228,\n      0x3feea09e667f3bcd,\n      0xbc6a12ad8734b982,\n      0x3feea012750bdabf,\n      0xbc6367efb86da9ee,\n      0x3fee9fb23c651a2f,\n      0xbc80dc3d54e08851,\n      0x3fee9f7df9519484,\n      0xbc781f647e5a3ecf,\n      0x3fee9f75e8ec5f74,\n      0xbc86ee4ac08b7db0,\n      0x3fee9f9a48a58174,\n      0xbc8619321e55e68a,\n      0x3fee9feb564267c9,\n      0x3c909ccb5e09d4d3,\n      0x3feea0694fde5d3f,\n      0xbc7b32dcb94da51d,\n      0x3feea11473eb0187,\n      0x3c94ecfd5467c06b,\n      0x3feea1ed0130c132,\n      0x3c65ebe1abd66c55,\n      0x3feea2f336cf4e62,\n      0xbc88a1c52fb3cf42,\n      0x3feea427543e1a12,\n      0xbc9369b6f13b3734,\n      0x3feea589994cce13,\n      0xbc805e843a19ff1e,\n      0x3feea71a4623c7ad,\n      0xbc94d450d872576e,\n      0x3feea8d99b4492ed,\n      0x3c90ad675b0e8a00,\n      0x3feeaac7d98a6699,\n      0x3c8db72fc1f0eab4,\n      0x3feeace5422aa0db,\n      0xbc65b6609cc5e7ff,\n      0x3feeaf3216b5448c,\n      0x3c7bf68359f35f44,\n      0x3feeb1ae99157736,\n      0xbc93091fa71e3d83,\n      0x3feeb45b0b91ffc6,\n      0xbc5da9b88b6c1e29,\n      0x3feeb737b0cdc5e5,\n      0xbc6c23f97c90b959,\n      0x3feeba44cbc8520f,\n      0xbc92434322f4f9aa,\n      0x3feebd829fde4e50,\n      0xbc85ca6cd7668e4b,\n      0x3feec0f170ca07ba,\n      0x3c71affc2b91ce27,\n      0x3feec49182a3f090,\n      0x3c6dd235e10a73bb,\n      0x3feec86319e32323,\n      0xbc87c50422622263,\n      0x3feecc667b5de565,\n      0x3c8b1c86e3e231d5,\n      0x3feed09bec4a2d33,\n      0xbc91bbd1d3bcbb15,\n      0x3feed503b23e255d,\n      0x3c90cc319cee31d2,\n      0x3feed99e1330b358,\n      0x3c8469846e735ab3,\n      0x3feede6b5579fdbf,\n      0xbc82dfcd978e9db4,\n      0x3feee36bbfd3f37a,\n      0x3c8c1a7792cb3387,\n      0x3feee89f995ad3ad,\n      0xbc907b8f4ad1d9fa,\n      0x3feeee07298db666,\n      0xbc55c3d956dcaeba,\n      0x3feef3a2b84f15fb,\n      0xbc90a40e3da6f640,\n      0x3feef9728de5593a,\n      0xbc68d6f438ad9334,\n      0x3feeff76f2fb5e47,\n      0xbc91eee26b588a35,\n      0x3fef05b030a1064a,\n      0x3c74ffd70a5fddcd,\n      0x3fef0c1e904bc1d2,\n      0xbc91bdfbfa9298ac,\n      0x3fef12c25bd71e09,\n      0x3c736eae30af0cb3,\n      0x3fef199bdd85529c,\n      0x3c8ee3325c9ffd94,\n      0x3fef20ab5fffd07a,\n      0x3c84e08fd10959ac,\n      0x3fef27f12e57d14b,\n      0x3c63cdaf384e1a67,\n      0x3fef2f6d9406e7b5,\n      0x3c676b2c6c921968,\n      0x3fef3720dcef9069,\n      0xbc808a1883ccb5d2,\n      0x3fef3f0b555dc3fa,\n      0xbc8fad5d3ffffa6f,\n      0x3fef472d4a07897c,\n      0xbc900dae3875a949,\n      0x3fef4f87080d89f2,\n      0x3c74a385a63d07a7,\n      0x3fef5818dcfba487,\n      0xbc82919e2040220f,\n      0x3fef60e316c98398,\n      0x3c8e5a50d5c192ac,\n      0x3fef69e603db3285,\n      0x3c843a59ac016b4b,\n      0x3fef7321f301b460,\n      0xbc82d52107b43e1f,\n      0x3fef7c97337b9b5f,\n      0xbc892ab93b470dc9,\n      0x3fef864614f5a129,\n      0x3c74b604603a88d3,\n      0x3fef902ee78b3ff6,\n      0x3c83c5ec519d7271,\n      0x3fef9a51fbc74c83,\n      0xbc8ff7128fd391f0,\n      0x3fefa4afa2a490da,\n      0xbc8dae98e223747d,\n      0x3fefaf482d8e67f1,\n      0x3c8ec3bc41aa2008,\n      0x3fefba1bee615a27,\n      0x3c842b94c3a9eb32,\n      0x3fefc52b376bba97,\n      0x3c8a64a931d185ee,\n      0x3fefd0765b6e4540,\n      0xbc8e37bae43be3ed,\n      0x3fefdbfdad9cbe14,\n      0x3c77893b4d91cd9d,\n      0x3fefe7c1819e90d8,\n      0x3c5305c14160cc89,\n      0x3feff3c22b8f71f1,\n    },\n};\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/exp_data.h",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright (c) 2018, Arm Limited.\n\n#ifndef _EXP_DATA_H\n#define _EXP_DATA_H\n\n#include <stdint.h>\n\n#define EXP_TABLE_BITS 7\n#define EXP_POLY_ORDER 5\n#define EXP_USE_TOINT_NARROW 0\n#define EXP2_POLY_ORDER 5\nextern const struct exp_data {\n  double invln2N;\n  double shift;\n  double negln2hiN;\n  double negln2loN;\n  double poly[4]; /* Last four coefficients.  */\n  double exp2_shift;\n  double exp2_poly[EXP2_POLY_ORDER];\n  uint64_t tab[2 * (1 << EXP_TABLE_BITS)];\n} __exp_data;\n\n#endif\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/fmod.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright © 2005-2020 Rich Felker, et al.\n\n#include <math.h>\n#include <stdint.h>\n\ndouble fmod(double x, double y) {\n  union {\n    double f;\n    uint64_t i;\n  } ux = {x}, uy = {y};\n  int ex = ux.i >> 52 & 0x7ff;\n  int ey = uy.i >> 52 & 0x7ff;\n  int sx = ux.i >> 63;\n  uint64_t i;\n\n  /* in the followings uxi should be ux.i, but then gcc wrongly adds */\n  /* float load/store to inner loops ruining performance and code size */\n  uint64_t uxi = ux.i;\n\n  if (uy.i << 1 == 0 || isnan(y) || ex == 0x7ff) {\n    return (x * y) / (x * y);\n  }\n  if (uxi << 1 <= uy.i << 1) {\n    if (uxi << 1 == uy.i << 1) {\n      return 0 * x;\n    }\n    return x;\n  }\n\n  /* normalize x and y */\n  if (!ex) {\n    for (i = uxi << 12; i >> 63 == 0; ex--, i <<= 1)\n      ;\n    uxi <<= -ex + 1;\n  } else {\n    uxi &= -1ULL >> 12;\n    uxi |= 1ULL << 52;\n  }\n  if (!ey) {\n    for (i = uy.i << 12; i >> 63 == 0; ey--, i <<= 1)\n      ;\n    uy.i <<= -ey + 1;\n  } else {\n    uy.i &= -1ULL >> 12;\n    uy.i |= 1ULL << 52;\n  }\n\n  /* x mod y */\n  for (; ex > ey; ex--) {\n    i = uxi - uy.i;\n    if (i >> 63 == 0) {\n      if (i == 0) {\n        return 0 * x;\n      }\n      uxi = i;\n    }\n    uxi <<= 1;\n  }\n  i = uxi - uy.i;\n  if (i >> 63 == 0) {\n    if (i == 0) {\n      return 0 * x;\n    }\n    uxi = i;\n  }\n  for (; uxi >> 52 == 0; uxi <<= 1, ex--)\n    ;\n\n  /* scale result */\n  if (ex > 0) {\n    uxi -= 1ULL << 52;\n    uxi |= (uint64_t)ex << 52;\n  } else {\n    uxi >>= -ex + 1;\n  }\n  uxi |= (uint64_t)sx << 63;\n  ux.i = uxi;\n  return ux.f;\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/isnan.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright © 2005-2020 Rich Felker, et al.\n\nstatic unsigned long long __DOUBLE_BITS(double __f) {\n  union {\n    double __f;\n    unsigned long long __i;\n  } __u;\n  __u.__f = __f;\n  return __u.__i;\n}\n\n\nint __isnan(double x) {\n  return (__DOUBLE_BITS(x) & -1ULL >> 1) > 0x7ffULL << 52;\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/libm.h",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright © 2005-2020 Rich Felker, et al.\n\n#ifndef _LIBM_H\n#define _LIBM_H\n\n#include <stdint.h>\n#include <float.h>\n#include <math.h>\n\n#define hidden\n\n#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024\n#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN\nunion ldshape {\n  long double f;\n  struct {\n    uint64_t m;\n    uint16_t se;\n  } i;\n};\n#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __BIG_ENDIAN\n/* This is the m68k variant of 80-bit long double, and this definition only works\n * on archs where the alignment requirement of uint64_t is <= 4. */\nunion ldshape {\n  long double f;\n  struct {\n    uint16_t se;\n    uint16_t pad;\n    uint64_t m;\n  } i;\n};\n#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN\nunion ldshape {\n  long double f;\n  struct {\n    uint64_t lo;\n    uint32_t mid;\n    uint16_t top;\n    uint16_t se;\n  } i;\n  struct {\n    uint64_t lo;\n    uint64_t hi;\n  } i2;\n};\n#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __BIG_ENDIAN\nunion ldshape {\n  long double f;\n  struct {\n    uint16_t se;\n    uint16_t top;\n    uint32_t mid;\n    uint64_t lo;\n  } i;\n  struct {\n    uint64_t hi;\n    uint64_t lo;\n  } i2;\n};\n#else\n#error Unsupported long double representation\n#endif\n\n/* Support non-nearest rounding mode.  */\n#define WANT_ROUNDING 1\n/* Support signaling NaNs.  */\n#define WANT_SNAN 0\n\n#if WANT_SNAN\n#error SNaN is unsupported\n#else\n#define issignalingf_inline(x) 0\n#define issignaling_inline(x) 0\n#endif\n\n#ifndef TOINT_INTRINSICS\n#define TOINT_INTRINSICS 0\n#endif\n\n#if TOINT_INTRINSICS\n/* Round x to nearest int in all rounding modes, ties have to be rounded\n   consistently with converttoint so the results match.  If the result\n   would be outside of [-2^31, 2^31-1] then the semantics is unspecified.  */\nstatic double_t roundtoint(double_t);\n\n/* Convert x to nearest int in all rounding modes, ties have to be rounded\n   consistently with roundtoint.  If the result is not representible in an\n   int32_t then the semantics is unspecified.  */\nstatic int32_t converttoint(double_t);\n#endif\n\n/* Helps static branch prediction so hot path can be better optimized.  */\n#ifdef __GNUC__\n#define predict_true(x) __builtin_expect(!!(x), 1)\n#define predict_false(x) __builtin_expect(x, 0)\n#else\n#define predict_true(x) (x)\n#define predict_false(x) (x)\n#endif\n\n/* Evaluate an expression as the specified type. With standard excess\n   precision handling a type cast or assignment is enough (with\n   -ffloat-store an assignment is required, in old compilers argument\n   passing and return statement may not drop excess precision).  */\n\nstatic inline float eval_as_float(float x) {\n  float y = x;\n  return y;\n}\n\nstatic inline double eval_as_double(double x) {\n  double y = x;\n  return y;\n}\n\n/* fp_barrier returns its input, but limits code transformations\n   as if it had a side-effect (e.g. observable io) and returned\n   an arbitrary value.  */\n\n#ifndef fp_barrierf\n#define fp_barrierf fp_barrierf\nstatic inline float fp_barrierf(float x) {\n  volatile float y = x;\n  return y;\n}\n#endif\n\n#ifndef fp_barrier\n#define fp_barrier fp_barrier\nstatic inline double fp_barrier(double x) {\n  volatile double y = x;\n  return y;\n}\n#endif\n\n#ifndef fp_barrierl\n#define fp_barrierl fp_barrierl\nstatic inline long double fp_barrierl(long double x) {\n  volatile long double y = x;\n  return y;\n}\n#endif\n\n/* fp_force_eval ensures that the input value is computed when that's\n   otherwise unused.  To prevent the constant folding of the input\n   expression, an additional fp_barrier may be needed or a compilation\n   mode that does so (e.g. -frounding-math in gcc). Then it can be\n   used to evaluate an expression for its fenv side-effects only.   */\n\n#ifndef fp_force_evalf\n#define fp_force_evalf fp_force_evalf\nstatic inline void fp_force_evalf(float x) {\n  volatile float y;\n  y = x;\n}\n#endif\n\n#ifndef fp_force_eval\n#define fp_force_eval fp_force_eval\nstatic inline void fp_force_eval(double x) {\n  volatile double y;\n  y = x;\n}\n#endif\n\n#ifndef fp_force_evall\n#define fp_force_evall fp_force_evall\nstatic inline void fp_force_evall(long double x) {\n  volatile long double y;\n  y = x;\n}\n#endif\n\n#define FORCE_EVAL(x)                         \\\n  do {                                        \\\n    if (sizeof(x) == sizeof(float)) {         \\\n      fp_force_evalf(x);                      \\\n    } else if (sizeof(x) == sizeof(double)) { \\\n      fp_force_eval(x);                       \\\n    } else {                                  \\\n      fp_force_evall(x);                      \\\n    }                                         \\\n  } while (0)\n\n#define asuint(f) \\\n  ((union {       \\\n    float _f;     \\\n    uint32_t _i;  \\\n  }) {f})         \\\n    ._i\n#define asfloat(i) \\\n  ((union {        \\\n    uint32_t _i;   \\\n    float _f;      \\\n  }) {i})          \\\n    ._f\n#define asuint64(f) \\\n  ((union {         \\\n    double _f;      \\\n    uint64_t _i;    \\\n  }) {f})           \\\n    ._i\n#define asdouble(i) \\\n  ((union {         \\\n    uint64_t _i;    \\\n    double _f;      \\\n  }) {i})           \\\n    ._f\n\n#define EXTRACT_WORDS(hi, lo, d) \\\n  do {                           \\\n    uint64_t __u = asuint64(d);  \\\n    (hi) = __u >> 32;            \\\n    (lo) = (uint32_t)__u;        \\\n  } while (0)\n\n#define GET_HIGH_WORD(hi, d)  \\\n  do {                        \\\n    (hi) = asuint64(d) >> 32; \\\n  } while (0)\n\n#define GET_LOW_WORD(lo, d)       \\\n  do {                            \\\n    (lo) = (uint32_t)asuint64(d); \\\n  } while (0)\n\n#define INSERT_WORDS(d, hi, lo)                              \\\n  do {                                                       \\\n    (d) = asdouble(((uint64_t)(hi) << 32) | (uint32_t)(lo)); \\\n  } while (0)\n\n#define SET_HIGH_WORD(d, hi) INSERT_WORDS(d, hi, (uint32_t)asuint64(d))\n\n#define SET_LOW_WORD(d, lo) INSERT_WORDS(d, asuint64(d) >> 32, lo)\n\n#define GET_FLOAT_WORD(w, d) \\\n  do {                       \\\n    (w) = asuint(d);         \\\n  } while (0)\n\n#define SET_FLOAT_WORD(d, w) \\\n  do {                       \\\n    (d) = asfloat(w);        \\\n  } while (0)\n\nhidden int __rem_pio2_large(double*, double*, int, int, int);\n\nhidden int __rem_pio2(double, double*);\nhidden double __sin(double, double, int);\nhidden double __cos(double, double);\nhidden double __tan(double, double, int);\nhidden double __expo2(double, double);\n\nhidden int __rem_pio2f(float, double*);\nhidden float __sindf(double);\nhidden float __cosdf(double);\nhidden float __tandf(double, int);\nhidden float __expo2f(float, float);\n\nhidden int __rem_pio2l(long double, long double*);\nhidden long double __sinl(long double, long double, int);\nhidden long double __cosl(long double, long double);\nhidden long double __tanl(long double, long double, int);\n\nhidden long double __polevll(long double, const long double*, int);\nhidden long double __p1evll(long double, const long double*, int);\n\nextern int __signgam;\nhidden double __lgamma_r(double, int*);\nhidden float __lgammaf_r(float, int*);\n\n/* error handling functions */\nhidden float __math_xflowf(uint32_t, float);\nhidden float __math_uflowf(uint32_t);\nhidden float __math_oflowf(uint32_t);\nhidden float __math_divzerof(uint32_t);\nhidden float __math_invalidf(float);\nhidden double __math_xflow(uint32_t, double);\nhidden double __math_uflow(uint32_t);\nhidden double __math_oflow(uint32_t);\nhidden double __math_divzero(uint32_t);\nhidden double __math_invalid(double);\n#if LDBL_MANT_DIG != DBL_MANT_DIG\nhidden long double __math_invalidl(long double);\n#endif\n\n#endif\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/log2.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright (c) 2018, Arm Limited.\n\n#include <math.h>\n#include <stdint.h>\n#include \"libm.h\"\n#include \"log2_data.h\"\n\n#define T __log2_data.tab\n#define T2 __log2_data.tab2\n#define B __log2_data.poly1\n#define A __log2_data.poly\n#define InvLn2hi __log2_data.invln2hi\n#define InvLn2lo __log2_data.invln2lo\n#define N (1 << LOG2_TABLE_BITS)\n#define OFF 0x3fe6000000000000\n\n/* Top 16 bits of a double.  */\nstatic inline uint32_t top16(double x) {\n  return asuint64(x) >> 48;\n}\n\ndouble log2(double x) {\n  double_t z, r, r2, r4, y, invc, logc, kd, hi, lo, t1, t2, t3, p;\n  uint64_t ix, iz, tmp;\n  uint32_t top;\n  int k, i;\n\n  ix = asuint64(x);\n  top = top16(x);\n#define LO asuint64(1.0 - 0x1.5b51p-5)\n#define HI asuint64(1.0 + 0x1.6ab2p-5)\n  if (predict_false(ix - LO < HI - LO)) {\n    /* Handle close to 1.0 inputs separately.  */\n    /* Fix sign of zero with downward rounding when x==1.  */\n    if (WANT_ROUNDING && predict_false(ix == asuint64(1.0))) {\n      return 0;\n    }\n    r = x - 1.0;\n#if __FP_FAST_FMA\n    hi = r * InvLn2hi;\n    lo = r * InvLn2lo + __builtin_fma(r, InvLn2hi, -hi);\n#else\n    double_t rhi, rlo;\n    rhi = asdouble(asuint64(r) & -1ULL << 32);\n    rlo = r - rhi;\n    hi = rhi * InvLn2hi;\n    lo = rlo * InvLn2hi + r * InvLn2lo;\n#endif\n    r2 = r * r; /* rounding error: 0x1p-62.  */\n    r4 = r2 * r2;\n    /* Worst-case error is less than 0.54 ULP (0.55 ULP without fma).  */\n    p = r2 * (B[0] + r * B[1]);\n    y = hi + p;\n    lo += hi - y + p;\n    lo += r4 * (B[2] + r * B[3] + r2 * (B[4] + r * B[5]) + r4 * (B[6] + r * B[7] + r2 * (B[8] + r * B[9])));\n    y += lo;\n    return eval_as_double(y);\n  }\n  if (predict_false(top - 0x0010 >= 0x7ff0 - 0x0010)) {\n    /* x < 0x1p-1022 or inf or nan.  */\n    if (ix * 2 == 0) {\n      return __math_divzero(1);\n    }\n    if (ix == asuint64(INFINITY)) { /* log(inf) == inf.  */\n      return x;\n    }\n    if ((top & 0x8000) || (top & 0x7ff0) == 0x7ff0) {\n      return __math_invalid(x);\n    }\n    /* x is subnormal, normalize it.  */\n    ix = asuint64(x * 0x1p52);\n    ix -= 52ULL << 52;\n  }\n\n  /* x = 2^k z; where z is in range [OFF,2*OFF) and exact.\n     The range is split into N subintervals.\n     The ith subinterval contains z and c is near its center.  */\n  tmp = ix - OFF;\n  i = (tmp >> (52 - LOG2_TABLE_BITS)) % N;\n  k = (int64_t)tmp >> 52; /* arithmetic shift */\n  iz = ix - (tmp & 0xfffULL << 52);\n  invc = T[i].invc;\n  logc = T[i].logc;\n  z = asdouble(iz);\n  kd = (double_t)k;\n\n  /* log2(x) = log2(z/c) + log2(c) + k.  */\n  /* r ~= z/c - 1, |r| < 1/(2*N).  */\n#if __FP_FAST_FMA\n  /* rounding error: 0x1p-55/N.  */\n  r = __builtin_fma(z, invc, -1.0);\n  t1 = r * InvLn2hi;\n  t2 = r * InvLn2lo + __builtin_fma(r, InvLn2hi, -t1);\n#else\n  double_t rhi, rlo;\n  /* rounding error: 0x1p-55/N + 0x1p-65.  */\n  r = (z - T2[i].chi - T2[i].clo) * invc;\n  rhi = asdouble(asuint64(r) & -1ULL << 32);\n  rlo = r - rhi;\n  t1 = rhi * InvLn2hi;\n  t2 = rlo * InvLn2hi + r * InvLn2lo;\n#endif\n\n  /* hi + lo = r/ln2 + log2(c) + k.  */\n  t3 = kd + logc;\n  hi = t3 + t1;\n  lo = t3 - hi + t1 + t2;\n\n  /* log2(r+1) = r/ln2 + r^2*poly(r).  */\n  /* Evaluation is optimized assuming superscalar pipelined execution.  */\n  r2 = r * r; /* rounding error: 0x1p-54/N^2.  */\n  r4 = r2 * r2;\n  /* Worst-case error if |y| > 0x1p-4: 0.547 ULP (0.550 ULP without fma).\n     ~ 0.5 + 2/N/ln2 + abs-poly-error*0x1p56 ULP (+ 0.003 ULP without fma).  */\n  p = A[0] + r * A[1] + r2 * (A[2] + r * A[3]) + r4 * (A[4] + r * A[5]);\n  y = lo + r2 * p + hi;\n  return eval_as_double(y);\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/log2_data.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright (c) 2018, Arm Limited.\n\n#include \"log2_data.h\"\n\n#define N (1 << LOG2_TABLE_BITS)\n\nconst struct log2_data __log2_data = {\n  // First coefficient: 0x1.71547652b82fe1777d0ffda0d24p0\n  .invln2hi = 0x1.7154765200000p+0,\n  .invln2lo = 0x1.705fc2eefa200p-33,\n  .poly1 =\n    {\n      // relative error: 0x1.2fad8188p-63\n      // in -0x1.5b51p-5 0x1.6ab2p-5\n      -0x1.71547652b82fep-1,\n      0x1.ec709dc3a03f7p-2,\n      -0x1.71547652b7c3fp-2,\n      0x1.2776c50f05be4p-2,\n      -0x1.ec709dd768fe5p-3,\n      0x1.a61761ec4e736p-3,\n      -0x1.7153fbc64a79bp-3,\n      0x1.484d154f01b4ap-3,\n      -0x1.289e4a72c383cp-3,\n      0x1.0b32f285aee66p-3,\n    },\n  .poly =\n    {\n      // relative error: 0x1.a72c2bf8p-58\n      // abs error: 0x1.67a552c8p-66\n      // in -0x1.f45p-8 0x1.f45p-8\n      -0x1.71547652b8339p-1,\n      0x1.ec709dc3a04bep-2,\n      -0x1.7154764702ffbp-2,\n      0x1.2776c50034c48p-2,\n      -0x1.ec7b328ea92bcp-3,\n      0x1.a6225e117f92ep-3,\n    },\n  /* Algorithm:\n\n          x = 2^k z\n          log2(x) = k + log2(c) + log2(z/c)\n          log2(z/c) = poly(z/c - 1)\n\n  where z is in [1.6p-1; 1.6p0] which is split into N subintervals and z falls\n  into the ith one, then table entries are computed as\n\n          tab[i].invc = 1/c\n          tab[i].logc = (double)log2(c)\n          tab2[i].chi = (double)c\n          tab2[i].clo = (double)(c - (double)c)\n\n  where c is near the center of the subinterval and is chosen by trying +-2^29\n  floating point invc candidates around 1/center and selecting one for which\n\n          1) the rounding error in 0x1.8p10 + logc is 0,\n          2) the rounding error in z - chi - clo is < 0x1p-64 and\n          3) the rounding error in (double)log2(c) is minimized (< 0x1p-68).\n\n  Note: 1) ensures that k + logc can be computed without rounding error, 2)\n  ensures that z/c - 1 can be computed as (z - chi - clo)*invc with close to a\n  single rounding error when there is no fast fma for z*invc - 1, 3) ensures\n  that logc + poly(z/c - 1) has small error, however near x == 1 when\n  |log2(x)| < 0x1p-4, this is not enough so that is special cased.  */\n  .tab =\n    {\n      {0x1.724286bb1acf8p+0, -0x1.1095feecdb000p-1}, {0x1.6e1f766d2cca1p+0, -0x1.08494bd76d000p-1},\n      {0x1.6a13d0e30d48ap+0, -0x1.00143aee8f800p-1}, {0x1.661ec32d06c85p+0, -0x1.efec5360b4000p-2},\n      {0x1.623fa951198f8p+0, -0x1.dfdd91ab7e000p-2}, {0x1.5e75ba4cf026cp+0, -0x1.cffae0cc79000p-2},\n      {0x1.5ac055a214fb8p+0, -0x1.c043811fda000p-2}, {0x1.571ed0f166e1ep+0, -0x1.b0b67323ae000p-2},\n      {0x1.53909590bf835p+0, -0x1.a152f5a2db000p-2}, {0x1.5014fed61adddp+0, -0x1.9217f5af86000p-2},\n      {0x1.4cab88e487bd0p+0, -0x1.8304db0719000p-2}, {0x1.49539b4334feep+0, -0x1.74189f9a9e000p-2},\n      {0x1.460cbdfafd569p+0, -0x1.6552bb5199000p-2}, {0x1.42d664ee4b953p+0, -0x1.56b23a29b1000p-2},\n      {0x1.3fb01111dd8a6p+0, -0x1.483650f5fa000p-2}, {0x1.3c995b70c5836p+0, -0x1.39de937f6a000p-2},\n      {0x1.3991c4ab6fd4ap+0, -0x1.2baa1538d6000p-2}, {0x1.3698e0ce099b5p+0, -0x1.1d98340ca4000p-2},\n      {0x1.33ae48213e7b2p+0, -0x1.0fa853a40e000p-2}, {0x1.30d191985bdb1p+0, -0x1.01d9c32e73000p-2},\n      {0x1.2e025cab271d7p+0, -0x1.e857da2fa6000p-3}, {0x1.2b404cf13cd82p+0, -0x1.cd3c8633d8000p-3},\n      {0x1.288b02c7ccb50p+0, -0x1.b26034c14a000p-3}, {0x1.25e2263944de5p+0, -0x1.97c1c2f4fe000p-3},\n      {0x1.234563d8615b1p+0, -0x1.7d6023f800000p-3}, {0x1.20b46e33eaf38p+0, -0x1.633a71a05e000p-3},\n      {0x1.1e2eefdcda3ddp+0, -0x1.494f5e9570000p-3}, {0x1.1bb4a580b3930p+0, -0x1.2f9e424e0a000p-3},\n      {0x1.19453847f2200p+0, -0x1.162595afdc000p-3}, {0x1.16e06c0d5d73cp+0, -0x1.f9c9a75bd8000p-4},\n      {0x1.1485f47b7e4c2p+0, -0x1.c7b575bf9c000p-4}, {0x1.12358ad0085d1p+0, -0x1.960c60ff48000p-4},\n      {0x1.0fef00f532227p+0, -0x1.64ce247b60000p-4}, {0x1.0db2077d03a8fp+0, -0x1.33f78b2014000p-4},\n      {0x1.0b7e6d65980d9p+0, -0x1.0387d1a42c000p-4}, {0x1.0953efe7b408dp+0, -0x1.a6f9208b50000p-5},\n      {0x1.07325cac53b83p+0, -0x1.47a954f770000p-5}, {0x1.05197e40d1b5cp+0, -0x1.d23a8c50c0000p-6},\n      {0x1.03091c1208ea2p+0, -0x1.16a2629780000p-6}, {0x1.0101025b37e21p+0, -0x1.720f8d8e80000p-8},\n      {0x1.fc07ef9caa76bp-1, 0x1.6fe53b1500000p-7},  {0x1.f4465d3f6f184p-1, 0x1.11ccce10f8000p-5},\n      {0x1.ecc079f84107fp-1, 0x1.c4dfc8c8b8000p-5},  {0x1.e573a99975ae8p-1, 0x1.3aa321e574000p-4},\n      {0x1.de5d6f0bd3de6p-1, 0x1.918a0d08b8000p-4},  {0x1.d77b681ff38b3p-1, 0x1.e72e9da044000p-4},\n      {0x1.d0cb5724de943p-1, 0x1.1dcd2507f6000p-3},  {0x1.ca4b2dc0e7563p-1, 0x1.476ab03dea000p-3},\n      {0x1.c3f8ee8d6cb51p-1, 0x1.7074377e22000p-3},  {0x1.bdd2b4f020c4cp-1, 0x1.98ede8ba94000p-3},\n      {0x1.b7d6c006015cap-1, 0x1.c0db86ad2e000p-3},  {0x1.b20366e2e338fp-1, 0x1.e840aafcee000p-3},\n      {0x1.ac57026295039p-1, 0x1.0790ab4678000p-2},  {0x1.a6d01bc2731ddp-1, 0x1.1ac056801c000p-2},\n      {0x1.a16d3bc3ff18bp-1, 0x1.2db11d4fee000p-2},  {0x1.9c2d14967feadp-1, 0x1.406464ec58000p-2},\n      {0x1.970e4f47c9902p-1, 0x1.52dbe093af000p-2},  {0x1.920fb3982bcf2p-1, 0x1.651902050d000p-2},\n      {0x1.8d30187f759f1p-1, 0x1.771d2cdeaf000p-2},  {0x1.886e5ebb9f66dp-1, 0x1.88e9c857d9000p-2},\n      {0x1.83c97b658b994p-1, 0x1.9a80155e16000p-2},  {0x1.7f405ffc61022p-1, 0x1.abe186ed3d000p-2},\n      {0x1.7ad22181415cap-1, 0x1.bd0f2aea0e000p-2},  {0x1.767dcf99eff8cp-1, 0x1.ce0a43dbf4000p-2},\n    },\n#if !__FP_FAST_FMA\n  .tab2 =\n    {\n      {0x1.6200012b90a8ep-1, 0x1.904ab0644b605p-55},  {0x1.66000045734a6p-1, 0x1.1ff9bea62f7a9p-57},\n      {0x1.69fffc325f2c5p-1, 0x1.27ecfcb3c90bap-55},  {0x1.6e00038b95a04p-1, 0x1.8ff8856739326p-55},\n      {0x1.71fffe09994e3p-1, 0x1.afd40275f82b1p-55},  {0x1.7600015590e1p-1, -0x1.2fd75b4238341p-56},\n      {0x1.7a00012655bd5p-1, 0x1.808e67c242b76p-56},  {0x1.7e0003259e9a6p-1, -0x1.208e426f622b7p-57},\n      {0x1.81fffedb4b2d2p-1, -0x1.402461ea5c92fp-55}, {0x1.860002dfafcc3p-1, 0x1.df7f4a2f29a1fp-57},\n      {0x1.89ffff78c6b5p-1, -0x1.e0453094995fdp-55},  {0x1.8e00039671566p-1, -0x1.a04f3bec77b45p-55},\n      {0x1.91fffe2bf1745p-1, -0x1.7fa34400e203cp-56}, {0x1.95fffcc5c9fd1p-1, -0x1.6ff8005a0695dp-56},\n      {0x1.9a0003bba4767p-1, 0x1.0f8c4c4ec7e03p-56},  {0x1.9dfffe7b92da5p-1, 0x1.e7fd9478c4602p-55},\n      {0x1.a1fffd72efdafp-1, -0x1.a0c554dcdae7ep-57}, {0x1.a5fffde04ff95p-1, 0x1.67da98ce9b26bp-55},\n      {0x1.a9fffca5e8d2bp-1, -0x1.284c9b54c13dep-55}, {0x1.adfffddad03eap-1, 0x1.812c8ea602e3cp-58},\n      {0x1.b1ffff10d3d4dp-1, -0x1.efaddad27789cp-55}, {0x1.b5fffce21165ap-1, 0x1.3cb1719c61237p-58},\n      {0x1.b9fffd950e674p-1, 0x1.3f7d94194cep-56},    {0x1.be000139ca8afp-1, 0x1.50ac4215d9bcp-56},\n      {0x1.c20005b46df99p-1, 0x1.beea653e9c1c9p-57},  {0x1.c600040b9f7aep-1, -0x1.c079f274a70d6p-56},\n      {0x1.ca0006255fd8ap-1, -0x1.a0b4076e84c1fp-56}, {0x1.cdfffd94c095dp-1, 0x1.8f933f99ab5d7p-55},\n      {0x1.d1ffff975d6cfp-1, -0x1.82c08665fe1bep-58}, {0x1.d5fffa2561c93p-1, -0x1.b04289bd295f3p-56},\n      {0x1.d9fff9d228b0cp-1, 0x1.70251340fa236p-55},  {0x1.de00065bc7e16p-1, -0x1.5011e16a4d80cp-56},\n      {0x1.e200002f64791p-1, 0x1.9802f09ef62ep-55},   {0x1.e600057d7a6d8p-1, -0x1.e0b75580cf7fap-56},\n      {0x1.ea00027edc00cp-1, -0x1.c848309459811p-55}, {0x1.ee0006cf5cb7cp-1, -0x1.f8027951576f4p-55},\n      {0x1.f2000782b7dccp-1, -0x1.f81d97274538fp-55}, {0x1.f6000260c450ap-1, -0x1.071002727ffdcp-59},\n      {0x1.f9fffe88cd533p-1, -0x1.81bdce1fda8bp-58},  {0x1.fdfffd50f8689p-1, 0x1.7f91acb918e6ep-55},\n      {0x1.0200004292367p+0, 0x1.b7ff365324681p-54},  {0x1.05fffe3e3d668p+0, 0x1.6fa08ddae957bp-55},\n      {0x1.0a0000a85a757p+0, -0x1.7e2de80d3fb91p-58}, {0x1.0e0001a5f3fccp+0, -0x1.1823305c5f014p-54},\n      {0x1.11ffff8afbaf5p+0, -0x1.bfabb6680bac2p-55}, {0x1.15fffe54d91adp+0, -0x1.d7f121737e7efp-54},\n      {0x1.1a00011ac36e1p+0, 0x1.c000a0516f5ffp-54},  {0x1.1e00019c84248p+0, -0x1.082fbe4da5dap-54},\n      {0x1.220000ffe5e6ep+0, -0x1.8fdd04c9cfb43p-55}, {0x1.26000269fd891p+0, 0x1.cfe2a7994d182p-55},\n      {0x1.2a00029a6e6dap+0, -0x1.00273715e8bc5p-56}, {0x1.2dfffe0293e39p+0, 0x1.b7c39dab2a6f9p-54},\n      {0x1.31ffff7dcf082p+0, 0x1.df1336edc5254p-56},  {0x1.35ffff05a8b6p+0, -0x1.e03564ccd31ebp-54},\n      {0x1.3a0002e0eaeccp+0, 0x1.5f0e74bd3a477p-56},  {0x1.3e000043bb236p+0, 0x1.c7dcb149d8833p-54},\n      {0x1.4200002d187ffp+0, 0x1.e08afcf2d3d28p-56},  {0x1.460000d387cb1p+0, 0x1.20837856599a6p-55},\n      {0x1.4a00004569f89p+0, -0x1.9fa5c904fbcd2p-55}, {0x1.4e000043543f3p+0, -0x1.81125ed175329p-56},\n      {0x1.51fffcc027f0fp+0, 0x1.883d8847754dcp-54},  {0x1.55ffffd87b36fp+0, -0x1.709e731d02807p-55},\n      {0x1.59ffff21df7bap+0, 0x1.7f79f68727b02p-55},  {0x1.5dfffebfc3481p+0, -0x1.180902e30e93ep-54},\n    },\n#endif\n};\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/log2_data.h",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright (c) 2018, Arm Limited.\n\n#ifndef _LOG2_DATA_H\n#define _LOG2_DATA_H\n\n#define LOG2_TABLE_BITS 6\n#define LOG2_POLY_ORDER 7\n#define LOG2_POLY1_ORDER 11\nextern const struct log2_data {\n  double invln2hi;\n  double invln2lo;\n  double poly[LOG2_POLY_ORDER - 1];\n  double poly1[LOG2_POLY1_ORDER - 1];\n  struct {\n    double invc, logc;\n  } tab[1 << LOG2_TABLE_BITS];\n#if !__FP_FAST_FMA\n  struct {\n    double chi, clo;\n  } tab2[1 << LOG2_TABLE_BITS];\n#endif\n} __log2_data;\n\n#endif\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/remainder.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright © 2005-2020 Rich Felker, et al.\n\n#include <math.h>\n\ndouble remainder(double x, double y) {\n  int q;\n  return remquo(x, y, &q);\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/remquo.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright © 2005-2020 Rich Felker, et al.\n\n#include <math.h>\n#include <stdint.h>\n\ndouble remquo(double x, double y, int* quo) {\n  union {\n    double f;\n    uint64_t i;\n  } ux = {x}, uy = {y};\n  int ex = ux.i >> 52 & 0x7ff;\n  int ey = uy.i >> 52 & 0x7ff;\n  int sx = ux.i >> 63;\n  int sy = uy.i >> 63;\n  uint32_t q;\n  uint64_t i;\n  uint64_t uxi = ux.i;\n\n  *quo = 0;\n  if (uy.i << 1 == 0 || isnan(y) || ex == 0x7ff) {\n    return (x * y) / (x * y);\n  }\n  if (ux.i << 1 == 0) {\n    return x;\n  }\n\n  /* normalize x and y */\n  if (!ex) {\n    for (i = uxi << 12; i >> 63 == 0; ex--, i <<= 1)\n      ;\n    uxi <<= -ex + 1;\n  } else {\n    uxi &= -1ULL >> 12;\n    uxi |= 1ULL << 52;\n  }\n  if (!ey) {\n    for (i = uy.i << 12; i >> 63 == 0; ey--, i <<= 1)\n      ;\n    uy.i <<= -ey + 1;\n  } else {\n    uy.i &= -1ULL >> 12;\n    uy.i |= 1ULL << 52;\n  }\n\n  q = 0;\n  if (ex < ey) {\n    if (ex + 1 == ey) {\n      goto end;\n    }\n    return x;\n  }\n\n  /* x mod y */\n  for (; ex > ey; ex--) {\n    i = uxi - uy.i;\n    if (i >> 63 == 0) {\n      uxi = i;\n      q++;\n    }\n    uxi <<= 1;\n    q <<= 1;\n  }\n  i = uxi - uy.i;\n  if (i >> 63 == 0) {\n    uxi = i;\n    q++;\n  }\n  if (uxi == 0) {\n    ex = -60;\n  } else {\n    for (; uxi >> 52 == 0; uxi <<= 1, ex--)\n      ;\n  }\nend:\n  /* scale result and decide between |x| and |x|-|y| */\n  if (ex > 0) {\n    uxi -= 1ULL << 52;\n    uxi |= (uint64_t)ex << 52;\n  } else {\n    uxi >>= -ex + 1;\n  }\n  ux.i = uxi;\n  x = ux.f;\n  if (sy) {\n    y = -y;\n  }\n  if (ex == ey || (ex + 1 == ey && (2 * x > y || (2 * x == y && q % 2)))) {\n    x -= y;\n    q++;\n  }\n  q &= 0x7fffffff;\n  *quo = sx ^ sy ? -(int)q : (int)q;\n  return sx ? -x : x;\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/strtoimax.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright © 2005-2011 Rich Felker, et al.\n// NOTE: From an older musl release that avoids stdio usage\n\n#include <inttypes.h>\n#include <errno.h>\n#include <ctype.h>\n\nintmax_t strtoimax(const char* s1, char** p, int base) {\n  const unsigned char* s = s1;\n  int sign = 0;\n  uintmax_t x;\n\n  /* Initial whitespace */\n  for (; isspace(*s); s++)\n    ;\n\n  /* Optional sign */\n  if (*s == '-') {\n    sign = *s++;\n  } else if (*s == '+') {\n    s++;\n  }\n\n  x = strtoumax(s, p, base);\n  if (x > INTMAX_MAX) {\n    if (!sign || -x != INTMAX_MIN) {\n      errno = ERANGE;\n    }\n    return sign ? INTMAX_MIN : INTMAX_MAX;\n  }\n  return sign ? -x : x;\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/strtoll.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright © 2005-2011 Rich Felker, et al.\n// NOTE: From an older musl release that avoids stdio usage\n\n#include <stdlib.h>\n#include <inttypes.h>\n#include <errno.h>\n#include <limits.h>\n\nlong long strtoll(const char* s, char** p, int base) {\n  intmax_t x = strtoimax(s, p, base);\n  if (x > LLONG_MAX) {\n    errno = ERANGE;\n    return LLONG_MAX;\n  } else if (x < LLONG_MIN) {\n    errno = ERANGE;\n    return LLONG_MIN;\n  }\n  return x;\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/strtoull.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright © 2005-2011 Rich Felker, et al.\n// NOTE: From an older musl release that avoids stdio usage\n\n#include <stdlib.h>\n#include <inttypes.h>\n#include <errno.h>\n#include <limits.h>\n\nunsigned long long strtoull(const char* s, char** p, int base) {\n  uintmax_t x = strtoumax(s, p, base);\n  if (x > ULLONG_MAX) {\n    errno = ERANGE;\n    return ULLONG_MAX;\n  }\n  return x;\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/Musl/strtoumax.c",
    "content": "// SPDX-License-Identifier: MIT\n// SPDX-FileCopyrightText: Copyright © 2005-2011 Rich Felker, et al.\n// NOTE: From an older musl release that avoids stdio usage\n\n#include <inttypes.h>\n#include <stdlib.h>\n#include <errno.h>\n#include <ctype.h>\n#include <stdio.h>\n\n/* Lookup table for digit values. -1==255>=36 -> invalid */\nstatic const unsigned char digits[] = {\n  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  -1, -1, -1, -1, -1, -1,\n  -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,\n  -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,\n  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n};\n\nuintmax_t strtoumax(const char* s1, char** p, int base) {\n  const unsigned char* s = s1;\n  size_t x1, z1;\n  uintmax_t x, z = 0;\n  int sign = 0;\n  int shift;\n\n  if (!p) {\n    p = (char**)&s1;\n  }\n\n  /* Initial whitespace */\n  for (; isspace(*s); s++)\n    ;\n\n  /* Optional sign */\n  if (*s == '-') {\n    sign = *s++;\n  } else if (*s == '+') {\n    s++;\n  }\n\n  /* Default base 8, 10, or 16 depending on prefix */\n  if (base == 0) {\n    if (s[0] == '0') {\n      if ((s[1] | 32) == 'x') {\n        base = 16;\n      } else {\n        base = 8;\n      }\n    } else {\n      base = 10;\n    }\n  }\n\n  if ((unsigned)base - 2 > 36 - 2 || digits[*s] >= base) {\n    *p = (char*)s1;\n    errno = EINVAL;\n    return 0;\n  }\n\n  /* Main loops. Only use big types if we have to. */\n  if (base == 10) {\n    for (x1 = 0; isdigit(*s) && x1 <= SIZE_MAX / 10 - 10; s++) {\n      x1 = 10 * x1 + *s - '0';\n    }\n    for (x = x1; isdigit(*s) && x <= UINTMAX_MAX / 10 - 10; s++) {\n      x = 10 * x + *s - '0';\n    }\n    if (isdigit(*s)) {\n      if (isdigit(s[1]) || 10 * x > UINTMAX_MAX - (*s - '0')) {\n        goto overflow;\n      }\n      x = 10 * x + *s - '0';\n    }\n  } else if (!(base & base / 2)) {\n    if (base == 16) {\n      if (s[0] == '0' && (s[1] | 32) == 'x' && digits[s[2]] < 16) {\n        s += 2;\n      }\n      shift = 4;\n      z1 = SIZE_MAX / 16;\n      z = UINTMAX_MAX / 16;\n    } else if (base == 8) {\n      shift = 3;\n      z1 = SIZE_MAX / 8;\n      z = UINTMAX_MAX / 8;\n    } else if (base == 2) {\n      shift = 1;\n      z1 = SIZE_MAX / 2;\n      z = UINTMAX_MAX / 2;\n    } else if (base == 4) {\n      shift = 2;\n      z1 = SIZE_MAX / 4;\n      z = UINTMAX_MAX / 4;\n    } else /* if (base == 32) */ {\n      shift = 5;\n      z1 = SIZE_MAX / 32;\n      z = UINTMAX_MAX / 32;\n    }\n    for (x1 = 0; digits[*s] < base && x1 <= z1; s++) {\n      x1 = (x1 << shift) + digits[*s];\n    }\n    for (x = x1; digits[*s] < base && x <= z; s++) {\n      x = (x << shift) + digits[*s];\n    }\n    if (digits[*s] < base) {\n      goto overflow;\n    }\n  } else {\n    z1 = SIZE_MAX / base - base;\n    for (x1 = 0; digits[*s] < base && x1 <= z1; s++) {\n      x1 = x1 * base + digits[*s];\n    }\n    if (digits[*s] < base) {\n      z = UINTMAX_MAX / base - base;\n    }\n    for (x = x1; digits[*s] < base && x <= z; s++) {\n      x = x * base + digits[*s];\n    }\n    if (digits[*s] < base) {\n      if (digits[s[1]] < base || x * base > UINTMAX_MAX - digits[*s]) {\n        goto overflow;\n      }\n      x = x * base + digits[*s];\n    }\n  }\n\n  *p = (char*)s;\n  return sign ? -x : x;\n\noverflow:\n  for (; digits[*s] < base; s++)\n    ;\n  *p = (char*)s;\n  errno = ERANGE;\n  return UINTMAX_MAX;\n}\n"
  },
  {
    "path": "Source/Windows/Common/CRT/String.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#define _SECIMP\n#define _CRTIMP\n\n\n#define vsprintf __ignore__vsprintf\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <cerrno>\n#include <unistd.h>\n#include <ctype.h>\n#include <locale.h>\n#include <wchar.h>\n#include <time.h>\n#include \"../Priv.h\"\n#undef vsprintf\n\nextern \"C\" int __cdecl vsprintf(char* __restrict__ _Dest, const char* __restrict__ _Format, va_list _Args) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;\n\nstatic unsigned short CTypeData[256];\nstatic char Locale[2] = \"C\";\n\nDLLEXPORT_FUNC(char*, _strdup, (const char* Src)) {\n  size_t Len = strlen(Src) + 1;\n  char* Dst = reinterpret_cast<char*>(malloc(Len));\n  memcpy(Dst, Src, Len);\n  return Dst;\n}\n\nchar* strdup(const char* Src) {\n  return _strdup(Src);\n}\n\nfloat strtof(const char* __restrict__, char** __restrict__) {\n  UNIMPLEMENTED();\n}\n\ndouble strtod(const char* __restrict__, char** __restrict__) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(double, _strtod_l, (const char* __restrict__ _Str, char** __restrict__ _EndPtr, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nlong long wcstoll(const wchar_t* __restrict__ nptr, wchar_t** __restrict__ endptr, int base) {\n  UNIMPLEMENTED();\n}\n\nunsigned long long wcstoull(const wchar_t* __restrict__ nptr, wchar_t** __restrict__ endptr, int base) {\n  UNIMPLEMENTED();\n}\n\nlong long atoll(const char*) {\n  UNIMPLEMENTED();\n}\n\nlong double strtold(const char* __restrict__, char** __restrict__) {\n  UNIMPLEMENTED();\n}\n\ndouble wcstod(const wchar_t* __restrict__ _Str, wchar_t** __restrict__ _EndPtr) {\n  UNIMPLEMENTED();\n}\n\nlong double wcstold(const wchar_t* __restrict__, wchar_t** __restrict__) {\n  UNIMPLEMENTED();\n}\n\nfloat wcstof(const wchar_t* __restrict__ nptr, wchar_t** __restrict__ endptr) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(__int64, _strtoi64_l, (const char* _String, char** _EndPtr, int _Radix, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(unsigned __int64, _strtoui64_l, (const char* _String, char** _EndPtr, int _Radix, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nint __stdio_common_vsscanf(unsigned __int64 options, const char* input, size_t length, const char* format, _locale_t locale, va_list valist) {\n  UNIMPLEMENTED();\n}\n\nint __stdio_common_vswprintf(unsigned __int64 options, wchar_t* str, size_t len, const wchar_t* format, _locale_t locale, va_list valist) {\n  return _vsnwprintf(str, len, format, valist);\n}\n\nint __mingw_vsnwprintf(wchar_t* __restrict__ Dest, size_t Count, const wchar_t* __restrict__ Format, va_list Args) {\n  int ret = _vsnwprintf(Dest, Count, Format, Args);\n  return ret;\n}\n\nint __mingw_vsprintf(char* __restrict__ Dest, const char* __restrict__ Format, va_list Args) {\n  int ret = vsprintf(Dest, Format, Args);\n  return ret;\n}\n\nDLLEXPORT_FUNC(size_t, _strftime_l,\n               (char* __restrict__ Buf, size_t Max_size, const char* __restrict__ Format, const struct tm* __restrict__ Tm, _locale_t Locale)) {\n  UNIMPLEMENTED();\n}\n\nint vsnprintf(char* __restrict__ Dest, size_t Count, const char* __restrict__ Format, va_list Args) {\n  int ret = _vsnprintf(Dest, Count, Format, Args);\n  if (ret == -1) {\n    Dest[Count - 1] = '\\0';\n    return _vsnprintf(nullptr, 0, Format, Args);\n  }\n  return ret;\n}\n\nint snprintf(char* stream, size_t n, const char* format, ...) {\n  __builtin_va_list args;\n  __builtin_va_start(args, format);\n  int ret = vsnprintf(stream, n, format, args);\n  __builtin_va_end(args);\n  return ret;\n}\n\nchar* setlocale(int _Category, const char* _Locale) {\n  return Locale;\n}\n\nint _configthreadlocale(int _Flag) {\n  return 0;\n}\n\nDLLEXPORT_FUNC(_locale_t, _create_locale, (int _Category, const char* _Locale)) {\n  return nullptr;\n}\n\nDLLEXPORT_FUNC(struct lconv*, localeconv, (void)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(void, _free_locale, (_locale_t _Locale)) {}\n\nwint_t btowc(int) {\n  UNIMPLEMENTED();\n}\n\nsize_t mbsrtowcs(wchar_t* __restrict__ _Dest, const char** __restrict__ _PSrc, size_t _Count,\n                 mbstate_t* __restrict__ _State) __MINGW_ATTRIB_DEPRECATED_SEC_WARN {\n  UNIMPLEMENTED();\n}\n\nsize_t mbrtowc(wchar_t* __restrict__ _DstCh, const char* __restrict__ _SrcCh, size_t _SizeInBytes, mbstate_t* __restrict__ _State) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _mbtowc_l, (wchar_t* __restrict__ DstCh, const char* __restrict__ SrcCh, size_t SrcSizeInBytes, _locale_t Locale)) {\n  if (!SrcCh || SrcSizeInBytes == 0) {\n    return 0;\n  }\n  *DstCh = static_cast<wchar_t>(*SrcCh);\n  return 1;\n}\n\nsize_t mbrlen(const char* __restrict__ _Ch, size_t _SizeInBytes, mbstate_t* __restrict__ _State) {\n  UNIMPLEMENTED();\n}\n\nsize_t wcrtomb(char* __restrict__ _Dest, wchar_t _Source, mbstate_t* __restrict__ _State) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(errno_t, wcrtomb_s, (size_t* _Retval, char* _Dst, size_t _SizeInBytes, wchar_t _Ch, mbstate_t* _State)) {\n  UNIMPLEMENTED();\n}\n\nint wctob(wint_t _WCh) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(errno_t, strerror_s, (char* _Buf, size_t _SizeInBytes, int _ErrNum)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _isctype, (int _C, int _Type)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(const unsigned short*, __pctype_func, (void)) {\n  return CTypeData;\n}\n\nDLLEXPORT_FUNC(int, _isctype_l, (int _C, int _Type, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _strcoll_l, (const char* _Str1, const char* _Str2, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(size_t, _strxfrm_l, (char* __restrict__ _Dst, const char* __restrict__ _Src, size_t _MaxCount, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _wcscoll_l, (const wchar_t* _Str1, const wchar_t* _Str2, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(size_t, _wcsxfrm_l, (wchar_t* __restrict__ _Dst, const wchar_t* __restrict__ _Src, size_t _MaxCount, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _iswalpha_l, (wint_t _C, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _iswupper_l, (wint_t _C, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _iswlower_l, (wint_t _C, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _iswdigit_l, (wint_t _C, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _iswxdigit_l, (wint_t _C, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _iswspace_l, (wint_t _C, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _iswpunct_l, (wint_t _C, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _iswalnum_l, (wint_t _C, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _iswprint_l, (wint_t _C, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _iswgraph_l, (wint_t _C, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _iswcntrl_l, (wint_t _C, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(wint_t, _towupper_l, (wint_t _C, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(wint_t, _towlower_l, (wint_t _C, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _toupper_l, (int _C, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, _tolower_l, (int _C, _locale_t _Locale)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(int, ___mb_cur_max_func, (void)) {\n  UNIMPLEMENTED();\n}\n"
  },
  {
    "path": "Source/Windows/Common/CallRetStack.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n\nnamespace FEX::Windows::CallRetStack {\nstruct CallRetStackInfo {\n  uint64_t AllocationBase;\n  uint64_t AllocationEnd;\n  uint64_t DefaultLocation;\n};\n\nCallRetStackInfo GetInfoThread(FEXCore::Core::InternalThreadState* Thread) {\n  uint64_t Base = reinterpret_cast<uint64_t>(Thread->CallRetStackBase);\n  // Leave some room from the base for the default location to allow for underflows without constant exceptions\n  return {Base - FEXCore::Utils::FEX_PAGE_SIZE, Base + FEXCore::Core::InternalThreadState::CALLRET_STACK_SIZE + FEXCore::Utils::FEX_PAGE_SIZE,\n          Base + FEXCore::Core::InternalThreadState::CALLRET_STACK_SIZE / 4};\n}\n\nvoid InitializeThread(FEXCore::Core::InternalThreadState* Thread) {\n  // Allocate the call-ret stack with guard pages on both sides\n  const void* CallRetStackAlloc = ::VirtualAlloc(\n    nullptr, FEXCore::Core::InternalThreadState::CALLRET_STACK_SIZE + 2 * FEXCore::Utils::FEX_PAGE_SIZE, MEM_RESERVE, PAGE_NOACCESS);\n\n  Thread->CallRetStackBase = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(CallRetStackAlloc) + FEXCore::Utils::FEX_PAGE_SIZE);\n  ::VirtualAlloc(Thread->CallRetStackBase, FEXCore::Core::InternalThreadState::CALLRET_STACK_SIZE, MEM_COMMIT, PAGE_READWRITE);\n\n  Thread->CurrentFrame->State.callret_sp = GetInfoThread(Thread).DefaultLocation;\n}\n\nvoid DestroyThread(FEXCore::Core::InternalThreadState* Thread) {\n  auto CallRetStackInfo = GetInfoThread(Thread);\n  ::VirtualFree(reinterpret_cast<void*>(CallRetStackInfo.AllocationBase), 0, MEM_RELEASE);\n}\n\nbool HandleAccessViolation(FEXCore::Core::InternalThreadState* Thread, uint64_t Address, uint64_t& CallRetSPReg) {\n  auto CallRetStackInfo = GetInfoThread(Thread);\n  if (Address >= CallRetStackInfo.AllocationBase && Address < CallRetStackInfo.AllocationEnd) {\n    LogMan::Msg::DFmt(\"Call-ret stack inbalance: {:X}\", Address);\n    CallRetSPReg = CallRetStackInfo.DefaultLocation;\n    return true;\n  }\n  return false;\n}\n} // namespace FEX::Windows::CallRetStack\n"
  },
  {
    "path": "Source/Windows/Common/Exception.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <ntstatus.h>\n#include <windef.h>\n#include <winternl.h>\n\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n\nnamespace FEX::Windows {\ntemplate<typename TReg>\nstatic inline EXCEPTION_RECORD\nHandleGuestException(FEXCore::Core::CpuStateFrame::SynchronousFaultDataStruct& Fault, const EXCEPTION_RECORD& Src, TReg& Rip, TReg Rax) {\n  EXCEPTION_RECORD Dst = Src;\n  Dst.ExceptionAddress = reinterpret_cast<void*>(Rip);\n\n  if (!Fault.FaultToTopAndGeneratedException) {\n    return Dst;\n  }\n  Fault.FaultToTopAndGeneratedException = false;\n\n  Dst.ExceptionFlags = 0;\n  Dst.NumberParameters = 0;\n\n  switch (Fault.Signal) {\n  case FEXCore::Core::FAULT_SIGILL: Dst.ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION; return Dst;\n  case FEXCore::Core::FAULT_SIGTRAP:\n    switch (Fault.TrapNo) {\n    case FEXCore::X86State::X86_TRAPNO_DB: Dst.ExceptionCode = EXCEPTION_SINGLE_STEP; return Dst;\n    case FEXCore::X86State::X86_TRAPNO_BP:\n      Dst.ExceptionAddress = reinterpret_cast<void*>(Rip - 1);\n      Dst.ExceptionCode = EXCEPTION_BREAKPOINT;\n      Dst.NumberParameters = 1;\n      Dst.ExceptionInformation[0] = 0;\n      return Dst;\n    default: LogMan::Msg::EFmt(\"Unknown SIGTRAP trap: {}\", Fault.TrapNo); break;\n    }\n    break;\n  case FEXCore::Core::FAULT_SIGSEGV:\n    switch (Fault.TrapNo) {\n    case FEXCore::X86State::X86_TRAPNO_GP:\n      if ((Fault.err_code & 0b111) == 0b010) {\n        switch (Fault.err_code >> 3) {\n        case 0x2d:\n          Rip += 3;\n          Dst.ExceptionCode = EXCEPTION_BREAKPOINT;\n          Dst.ExceptionAddress = reinterpret_cast<void*>(Rip);\n          Dst.NumberParameters = 1;\n          Dst.ExceptionInformation[0] = Rax; // RAX\n          // Note that ExceptionAddress doesn't equal the reported context RIP here, this discrepancy expected and not having it can trigger anti-debug logic.\n          return Dst;\n        default: LogMan::Msg::EFmt(\"Unknown interrupt: 0x{:X}\", Fault.err_code >> 3); break;\n        }\n      } else {\n        Dst.ExceptionCode = EXCEPTION_PRIV_INSTRUCTION;\n        return Dst;\n      }\n      break;\n    case FEXCore::X86State::X86_TRAPNO_OF: Dst.ExceptionCode = EXCEPTION_INT_OVERFLOW; return Dst;\n    case FEXCore::X86State::X86_TRAPNO_PF:\n      // A page-fault raised by an explicit break in JIT code is always an execute fault\n      Dst.NumberParameters = 2;\n      Dst.ExceptionInformation[0] = EXCEPTION_EXECUTE_FAULT;\n      Dst.ExceptionInformation[1] = Rip;\n      return Dst;\n    default: LogMan::Msg::EFmt(\"Unknown SIGSEGV trap: {}\", Fault.TrapNo); break;\n    }\n    break;\n  default: LogMan::Msg::EFmt(\"Unknown signal type: {}\", Fault.Signal); break;\n  }\n\n  // Default to SIGILL\n  Dst.ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION;\n  return Dst;\n}\n} // namespace FEX::Windows\n"
  },
  {
    "path": "Source/Windows/Common/Handle.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <winternl.h>\n\nnamespace FEX::Windows {\nclass ScopedHandle final {\npublic:\n  ScopedHandle() = default;\n\n  explicit ScopedHandle(HANDLE Handle)\n    : Handle(Handle) {}\n\n  // Move-only type\n  ScopedHandle(const ScopedHandle&) = delete;\n  ScopedHandle& operator=(ScopedHandle&) = delete;\n  ScopedHandle(ScopedHandle&& rhs)\n    : Handle(rhs.Handle) {\n    rhs.Handle = INVALID_HANDLE_VALUE;\n  }\n\n  ~ScopedHandle() {\n    if (Handle != INVALID_HANDLE_VALUE) {\n      NtClose(Handle);\n    }\n  }\n\n  const HANDLE& operator*() const {\n    return Handle;\n  }\n\n  HANDLE& operator*() {\n    return Handle;\n  }\n\n  operator bool() const {\n    return Handle != INVALID_HANDLE_VALUE;\n  }\n\nprivate:\n  HANDLE Handle {INVALID_HANDLE_VALUE};\n};\n\n\ninline bool ValidateHandleAccess(HANDLE Handle, ACCESS_MASK Access) {\n  OBJECT_BASIC_INFORMATION Info;\n\n  if (NtQueryObject(Handle, ObjectBasicInformation, &Info, sizeof(Info), nullptr)) {\n    return false;\n  }\n\n  return (Info.GrantedAccess & Access) == Access;\n}\n\ninline ScopedHandle DupHandle(HANDLE Handle, ACCESS_MASK Access) {\n  HANDLE Duplicated = INVALID_HANDLE_VALUE;\n  NtDuplicateObject(NtCurrentProcess(), Handle, NtCurrentProcess(), &Duplicated, Access, 0, 0);\n  return ScopedHandle {Duplicated};\n}\n} // namespace FEX::Windows\n"
  },
  {
    "path": "Source/Windows/Common/ImageTracker.cpp",
    "content": "// SPDX-License-Identifier: MIT\n\n#include <array>\n#include <mutex>\n#include <filesystem>\n#include <optional>\n#include <string_view>\n#include <cctype>\n\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/HLE/SourcecodeResolver.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/SignalScopeGuards.h>\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/fextl/string.h>\n#include <FEXCore/fextl/vector.h>\n#include \"Common/Config.h\"\n\n#include <fcntl.h>\n#include <io.h>\n#include <winternl.h>\n#include <xxhash.h>\n\n#include \"Handle.h\"\n#include \"Module.h\"\n#include \"Priv.h\"\n#include \"ImageTracker.h\"\n\nnamespace FEX::Windows {\nstatic fextl::string ToLower(std::string_view String) {\n  fextl::string Res;\n  Res.resize(String.size());\n  std::transform(String.begin(), String.end(), Res.begin(), [](unsigned char c) { return std::tolower(c); });\n  return Res;\n}\n\nFEXCore::CodeMapFileId ComputeCodeMapId(std::string_view FileName, uint32_t TimeDateStamp, uint32_t SizeOfImage) {\n  const auto Norm {ToLower(FileName)};\n  return XXH3_64bits(Norm.data(), Norm.size()) ^ (static_cast<uint64_t>(SizeOfImage) << 32 | TimeDateStamp);\n}\n\nstatic void LoadImageVolatileMetadata(fextl::set<uint64_t>& VolatileInstructions, FEXCore::IntervalList<uint64_t>& VolatileValidRanges,\n                                      HMODULE Module, ArchImageNtHeaders* Nt, uint64_t Address, uint64_t EndAddress) {\n  ULONG Size;\n\n  const auto* LoadConfig =\n    reinterpret_cast<ArchImageLoadConfigDirectory*>(RtlImageDirectoryEntryToData(Module, true, IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, &Size));\n  if (!LoadConfig || LoadConfig->Size <= offsetof(ArchImageLoadConfigDirectory, VolatileMetadataPointer)) {\n    return;\n  }\n\n  if (LoadConfig->VolatileMetadataPointer < Address || LoadConfig->VolatileMetadataPointer + sizeof(IMAGE_VOLATILE_METADATA) >= EndAddress) {\n    return;\n  }\n\n  const auto* VolatileMetadata = reinterpret_cast<IMAGE_VOLATILE_METADATA*>(LoadConfig->VolatileMetadataPointer);\n  if (!VolatileMetadata || Address + VolatileMetadata->VolatileAccessTable + VolatileMetadata->VolatileAccessTableSize >= EndAddress ||\n      Address + VolatileMetadata->VolatileInfoRangeTable + VolatileMetadata->VolatileInfoRangeTableSize >= EndAddress) {\n    return;\n  }\n\n  const auto* VolatileAccessTableBegin = reinterpret_cast<IMAGE_VOLATILE_RVA_METADATA*>(Address + VolatileMetadata->VolatileAccessTable);\n  const auto* VolatileAccessTableEnd =\n    VolatileAccessTableBegin + (VolatileMetadata->VolatileAccessTableSize / sizeof(IMAGE_VOLATILE_RVA_METADATA));\n  for (auto It = VolatileAccessTableBegin; It != VolatileAccessTableEnd; It++) {\n    VolatileInstructions.emplace(Address + It->Rva);\n  }\n\n  const auto* VolatileInfoRangeTableBegin = reinterpret_cast<IMAGE_VOLATILE_RANGE_METADATA*>(Address + VolatileMetadata->VolatileInfoRangeTable);\n  const auto* VolatileInfoRangeTableEnd =\n    VolatileInfoRangeTableBegin + (VolatileMetadata->VolatileInfoRangeTableSize / sizeof(IMAGE_VOLATILE_RANGE_METADATA));\n  for (auto It = VolatileInfoRangeTableBegin; It != VolatileInfoRangeTableEnd; It++) {\n    VolatileValidRanges.Insert({Address + It->Rva, Address + It->Rva + It->Size});\n  }\n}\n\nstatic fextl::robin_map<uint32_t, FEXCore::GuestRelocationType> LoadImageRelocations(ArchImageNtHeaders* Nt, uint64_t Address) {\n  const auto Module = reinterpret_cast<HMODULE>(Address);\n  ULONG Size;\n\n  const auto RelocationBlocksBegin =\n    reinterpret_cast<uint64_t>(RtlImageDirectoryEntryToData(Module, true, IMAGE_DIRECTORY_ENTRY_BASERELOC, &Size));\n  if (!RelocationBlocksBegin) {\n    return {};\n  }\n\n  fextl::robin_map<uint32_t, FEXCore::GuestRelocationType> Result;\n  const uint64_t RelocationBlocksEnd = RelocationBlocksBegin + Size - sizeof(IMAGE_BASE_RELOCATION);\n  for (uint64_t CurrentRelocation = RelocationBlocksBegin; CurrentRelocation < RelocationBlocksEnd;) {\n    const auto* Block = reinterpret_cast<IMAGE_BASE_RELOCATION*>(CurrentRelocation);\n    if (!Block->SizeOfBlock) {\n      break;\n    }\n    const uint64_t BlockEnd = CurrentRelocation + Block->SizeOfBlock; // Includes the size of IMAGE_BASE_RELOCATION\n    CurrentRelocation += sizeof(IMAGE_BASE_RELOCATION);\n\n    for (; CurrentRelocation < BlockEnd; CurrentRelocation += 2) {\n      auto PackedRelocation = *reinterpret_cast<uint16_t*>(CurrentRelocation);\n      uint32_t RelocatedRVA = Block->VirtualAddress + (PackedRelocation & 0xfff);\n      uint8_t Type = PackedRelocation >> 12;\n\n      switch (Type) {\n      case IMAGE_REL_BASED_ABSOLUTE: break;\n      case IMAGE_REL_BASED_HIGHLOW: Result[RelocatedRVA] = FEXCore::GuestRelocationType::Rel32; break;\n      case IMAGE_REL_BASED_DIR64: Result[RelocatedRVA] = FEXCore::GuestRelocationType::Rel64; break;\n      default: ERROR_AND_DIE_FMT(\"Unhandled relocation\");\n      }\n    }\n  }\n\n  return Result;\n}\n\nImageTracker::ImageTracker(FEXCore::Context::Context& CTX, bool IsGeneratingCache)\n  : CTX {CTX}\n  , ExtendedMetaData {FEX::VolatileMetadata::ParseExtendedVolatileMetadata(ExtendedVolatileMetadataConfig())}\n  , IsGeneratingCache {IsGeneratingCache} {}\n\nImageTracker::MappedImageInfo::MappedImageInfo(std::string_view Path, uint64_t Address, ArchImageNtHeaders* Nt,\n                                               fextl::robin_map<uint32_t, FEXCore::GuestRelocationType> Relocations)\n  : Info {.FileId = ComputeCodeMapId(BaseName(Path), Nt->FileHeader.TimeDateStamp, Nt->OptionalHeader.SizeOfImage),\n          .Filename = ToLower(Path), // Normalize path case as Windows paths are case-insensitive\n          .Relocations = std::move(Relocations)}\n  , SectionInfo {.FileInfo = Info, .FileStartVA = Address, .BeginVA = Address, .EndVA = Address + Nt->OptionalHeader.SizeOfImage} {}\n\nFEXCore::ExecutableFileSectionInfo ImageTracker::HandleImageMap(std::string_view Path, uint64_t Address, bool MainImage) {\n  std::scoped_lock Lock(CTX.GetCodeInvalidationMutex());\n  const fextl::string ModuleName {BaseName(Path)};\n  const auto Module = reinterpret_cast<HMODULE>(Address);\n  auto* Nt = reinterpret_cast<ArchImageNtHeaders*>(RtlImageNtHeader(Module));\n  MappedImageInfo* ImageInfo = nullptr;\n  {\n    auto Relocations = [&]() {\n      if (IsGeneratingCache) {\n        return LoadImageRelocations(Nt, Address);\n      }\n      return fextl::robin_map<uint32_t, FEXCore::GuestRelocationType> {};\n    }();\n    std::unique_lock Lk {ImagesLock};\n    auto [It, Inserted] = MappedImages.emplace(std::piecewise_construct, std::forward_as_tuple(Address),\n                                               std::forward_as_tuple(Path, Address, Nt, std::move(Relocations)));\n\n    if (!Inserted) {\n      return It->second.SectionInfo;\n    }\n\n    ImageInfo = &It->second;\n  }\n\n  auto ID = FEXCore::CodeMap::GetBaseFilename(ImageInfo->Info, false);\n  LogMan::Msg::DFmt(\"Load module {} ({}): {:X}\", ModuleName, ID, Address);\n\n  if (FEXCore::Config::Get_ENABLECODECACHINGWIP() && !IsGeneratingCache) {\n    if (MainImage) {\n      LARGE_INTEGER Time;\n      NtQuerySystemTime(&Time);\n      const auto CodeMapDir = fmt::format(\"{}codemap\\\\new\\\\\", FEX::Config::GetCacheDirectory());\n      std::error_code ec;\n      if (!std::filesystem::exists(CodeMapDir, ec)) {\n        std::filesystem::create_directories(CodeMapDir, ec);\n      }\n      if (!ec) {\n        ActiveCodeMapPath = fmt::format(\"{}{}.{}.bin\", CodeMapDir, ID, Time.QuadPart);\n\n        auto Writer = fextl::make_unique<FEXCore::CodeMapWriter>(*this, false);\n        Writer->AppendSetMainExecutable(ImageInfo->Info);\n        CTX.SetCodeMapWriter(std::move(Writer));\n      }\n      LoadAOTImages(*ImageInfo);\n    }\n\n    auto AOTImage = AOTImages.find(ID);\n    if (AOTImage != AOTImages.end()) {\n      CTX.GetCodeCache().LoadData(nullptr, AOTImage->second.Data, ImageInfo->SectionInfo);\n    }\n  }\n\n  uint64_t EndAddress = Address + Nt->OptionalHeader.SizeOfImage;\n  fextl::set<uint64_t> VolatileInstructions {};\n  FEXCore::IntervalList<uint64_t> VolatileValidRanges {};\n  LoadImageVolatileMetadata(VolatileInstructions, VolatileValidRanges, Module, Nt, Address, EndAddress);\n  if (auto It = ExtendedMetaData.find(ModuleName); It != ExtendedMetaData.end()) {\n    FEX::VolatileMetadata::ApplyFEXExtendedVolatileMetadata(It->second, VolatileInstructions, VolatileValidRanges, Address, EndAddress);\n  }\n\n  if (!VolatileInstructions.empty() || !VolatileValidRanges.Empty()) {\n    LogMan::Msg::DFmt(\"Loaded volatile metadata for {:X}: {} entries\", Address, VolatileInstructions.size());\n    CTX.AddForceTSOInformation(VolatileValidRanges, std::move(VolatileInstructions));\n  }\n\n  return ImageInfo->SectionInfo;\n}\n\nvoid ImageTracker::HandleImageUnmap(uint64_t Address, uint64_t Size) {\n  std::scoped_lock Lock(CTX.GetCodeInvalidationMutex());\n  CTX.RemoveForceTSOInformation(Address, Size);\n\n  std::unique_lock Lk {ImagesLock};\n  MappedImages.erase(Address);\n}\n\nstd::optional<FEXCore::ExecutableFileSectionInfo> ImageTracker::LookupExecutableFileSection(uint64_t Address) {\n  std::shared_lock Lk {ImagesLock};\n  auto It = MappedImages.upper_bound(Address);\n  if (It == MappedImages.begin() || std::prev(It)->second.SectionInfo.EndVA <= Address) {\n    return {};\n  }\n  return std::prev(It)->second.SectionInfo;\n}\n\nint ImageTracker::OpenCodeMapFile() {\n  if (ActiveCodeMapPath.empty()) {\n    return -1;\n  }\n  return _sopen(ActiveCodeMapPath.c_str(), O_CREAT | O_TRUNC | O_WRONLY | O_APPEND, _SH_DENYRW, 0644);\n}\n\nvoid ImageTracker::LoadAOTImages(MappedImageInfo& ImageInfo) {\n  const auto AnsiPath =\n    fmt::format(\"\\\\??\\\\{}cache\\\\{}\", FEX::Config::GetCacheDirectory(), FEXCore::CodeMap::GetBaseFilename(ImageInfo.Info, false));\n\n  // Iterate over all files in the given executable's cache directory, mapping them into memory for future use.\n  // Each cache file name matches the unique ID (as returned by FEXCore::CodeMap::GetBaseFilename) of the image it corresponds to.\n  ScopedUnicodeString NtPath(AnsiPath.c_str());\n\n  OBJECT_ATTRIBUTES DirAttr;\n  InitializeObjectAttributes(&DirAttr, &*NtPath, OBJ_CASE_INSENSITIVE, NULL, NULL);\n\n  ScopedHandle DirHandle;\n  IO_STATUS_BLOCK IOSB;\n  if (!NT_SUCCESS(NtOpenFile(&*DirHandle, FILE_LIST_DIRECTORY | SYNCHRONIZE, &DirAttr, &IOSB, FILE_SHARE_READ | FILE_SHARE_WRITE,\n                             FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT))) {\n    return;\n  }\n\n  std::array<uint8_t, 0x1000> DirBuffer;\n  bool FirstScan = true;\n  auto QueryDir = [&]() {\n    NTSTATUS Status = NtQueryDirectoryFile(*DirHandle, nullptr, nullptr, nullptr, &IOSB, DirBuffer.data(), DirBuffer.size(),\n                                           FileBothDirectoryInformation, FALSE, nullptr, FirstScan);\n    if (FirstScan) {\n      FirstScan = false;\n    }\n    return NT_SUCCESS(Status);\n  };\n\n  while (QueryDir()) {\n    auto* Info = reinterpret_cast<PFILE_BOTH_DIRECTORY_INFORMATION>(DirBuffer.data());\n\n    while (true) {\n      UNICODE_STRING CurrentFileName;\n      CurrentFileName.Buffer = Info->FileName;\n      CurrentFileName.Length = static_cast<USHORT>(Info->FileNameLength);\n      CurrentFileName.MaximumLength = CurrentFileName.Length;\n\n      bool Skip = (Info->FileAttributes & FILE_ATTRIBUTE_DIRECTORY) || (Info->FileNameLength == 2 && Info->FileName[0] == '.') ||\n                  (Info->FileNameLength == 4 && Info->FileName[0] == '.' && Info->FileName[1] == '.');\n\n      if (!Skip) {\n        OBJECT_ATTRIBUTES FileAttr;\n        InitializeObjectAttributes(&FileAttr, &CurrentFileName, OBJ_CASE_INSENSITIVE, *DirHandle, nullptr);\n\n        ScopedHandle FileHandle;\n        if (NT_SUCCESS(NtOpenFile(&*FileHandle, GENERIC_READ | SYNCHRONIZE, &FileAttr, &IOSB, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT))) {\n          ScopedHandle SectionHandle;\n          if (NT_SUCCESS(NtCreateSection(&*SectionHandle, SECTION_MAP_EXECUTE | SECTION_MAP_READ, nullptr, nullptr, PAGE_EXECUTE_READ,\n                                         SEC_COMMIT, *FileHandle))) {\n            void* LoadAddress = nullptr;\n            SIZE_T MappedSize = 0;\n            if (NT_SUCCESS(NtMapViewOfSection(*SectionHandle, NtCurrentProcess(), &LoadAddress, 0, 0, nullptr, &MappedSize, ViewUnmap,\n                                              MEM_RESERVE | MEM_TOP_DOWN, PAGE_EXECUTE_READ))) {\n              fextl::string UniqueId;\n              ULONG AnsiLength = 0;\n              RtlUnicodeToMultiByteSize(&AnsiLength, Info->FileName, Info->FileNameLength);\n              UniqueId.resize(AnsiLength);\n              RtlUnicodeToMultiByteN(UniqueId.data(), AnsiLength, NULL, Info->FileName, Info->FileNameLength);\n\n              AOTImages[UniqueId] = {.Data = static_cast<std::byte*>(LoadAddress)};\n              LogMan::Msg::IFmt(\"Loaded cache: {}\", UniqueId);\n            }\n          }\n        }\n      }\n\n      if (Info->NextEntryOffset == 0) {\n        break;\n      }\n      Info = reinterpret_cast<PFILE_BOTH_DIRECTORY_INFORMATION>(reinterpret_cast<uint8_t*>(Info) + Info->NextEntryOffset);\n    }\n  }\n}\n} // namespace FEX::Windows\n"
  },
  {
    "path": "Source/Windows/Common/ImageTracker.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <cstdint>\n#include <mutex>\n#include <map>\n#include <shared_mutex>\n#include <string_view>\n\n#include <FEXCore/Utils/CompilerDefs.h>\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Core/CodeCache.h>\n\n#include \"Common/VolatileMetadata.h\"\n#include \"Module.h\"\n\nnamespace FEXCore::Core {\nstruct InternalThreadState;\n}\n\nnamespace FEXCore::Context {\nclass Context;\n}\n\nnamespace FEX::Windows {\n#ifdef ARCHITECTURE_arm64ec\nusing ArchImageNtHeaders = IMAGE_NT_HEADERS64;\nusing ArchImageLoadConfigDirectory = _IMAGE_LOAD_CONFIG_DIRECTORY64;\n#else\nusing ArchImageNtHeaders = IMAGE_NT_HEADERS32;\nusing ArchImageLoadConfigDirectory = _IMAGE_LOAD_CONFIG_DIRECTORY32;\n#endif\n\nFEXCore::CodeMapFileId ComputeCodeMapId(std::string_view FileName, uint32_t TimeDateStamp, uint32_t SizeOfImage);\n\n/**\n * @brief Tracks mapped PE code images and handles their volatile metadata\n */\nclass ImageTracker : public FEXCore::CodeMapOpener {\npublic:\n  ImageTracker(FEXCore::Context::Context& CTX, bool IsGeneratingCache);\n  FEXCore::ExecutableFileSectionInfo HandleImageMap(std::string_view Path, uint64_t Address, bool MainImage);\n  void HandleImageUnmap(uint64_t Address, uint64_t Size);\n\n  std::optional<FEXCore::ExecutableFileSectionInfo> LookupExecutableFileSection(uint64_t Address);\n\n  int OpenCodeMapFile() override;\n\nprivate:\n  struct MappedImageInfo {\n    FEXCore::ExecutableFileInfo Info;\n    FEXCore::ExecutableFileSectionInfo SectionInfo;\n\n    MappedImageInfo(std::string_view Path, uint64_t Address, ArchImageNtHeaders* Nt,\n                    fextl::robin_map<uint32_t, FEXCore::GuestRelocationType> Relocations);\n  };\n\n  struct AOTImageInfo {\n    std::byte* Data;\n  };\n\n  void LoadAOTImages(MappedImageInfo& Info);\n\n  FEXCore::Context::Context& CTX;\n\n  FEX_CONFIG_OPT(ExtendedVolatileMetadataConfig, EXTENDEDVOLATILEMETADATA);\n  fextl::unordered_map<fextl::string, FEX::VolatileMetadata::ExtendedVolatileMetadata> ExtendedMetaData;\n\n  std::shared_mutex ImagesLock;\n  std::map<uint64_t, MappedImageInfo> MappedImages;\n  std::map<fextl::string, AOTImageInfo> AOTImages;\n\n  std::string ActiveCodeMapPath;\n  bool IsGeneratingCache;\n};\n\n} // namespace FEX::Windows\n"
  },
  {
    "path": "Source/Windows/Common/InvalidationTracker.cpp",
    "content": "// SPDX-License-Identifier: MIT\n\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXCore/Utils/SignalScopeGuards.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include \"InvalidationTracker.h\"\n#include <windef.h>\n#include <winternl.h>\n\nnamespace FEX::Windows {\nInvalidationTracker::InvalidationTracker(FEXCore::Context::Context& CTX, const std::unordered_map<DWORD, FEXCore::Core::InternalThreadState*>& Threads)\n  : CTX {CTX}\n  , Threads {Threads} {\n  FEX_CONFIG_OPT(SMCChecks, SMCCHECKS);\n  SMCDetectionDisabled = (SMCChecks == FEXCore::Config::CONFIG_SMC_NONE);\n\n  MEMORY_BASIC_INFORMATION Info;\n  uint64_t Address = 0;\n\n  while (VirtualQuery(reinterpret_cast<LPCVOID>(Address), &Info, sizeof(Info))) {\n    uint64_t BaseAddress = reinterpret_cast<uint64_t>(Info.BaseAddress);\n    if (Info.State == MEM_COMMIT) {\n      HandleMemoryProtectionNotification(BaseAddress, Info.RegionSize, Info.Protect);\n    }\n\n    Address = BaseAddress + Info.RegionSize;\n  }\n}\n\nvoid InvalidationTracker::HandleMemoryProtectionNotification(uint64_t Address, uint64_t Size, ULONG Prot) {\n  const auto AlignedBase = Address & FEXCore::Utils::FEX_PAGE_MASK;\n  const auto AlignedSize = (Address - AlignedBase + Size + FEXCore::Utils::FEX_PAGE_SIZE - 1) & FEXCore::Utils::FEX_PAGE_MASK;\n\n  const bool NeedsInvalidate = [&]() {\n    std::unique_lock Lock(IntervalsLock);\n\n    FEXCore::IntervalList<uint64_t>::Interval ProtInterval {AlignedBase, AlignedBase + AlignedSize};\n    if (Prot & (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY)) {\n      XIntervals.Insert(ProtInterval);\n      if (Prot & (PAGE_EXECUTE_WRITECOPY | PAGE_EXECUTE_READWRITE)) {\n        LogMan::Msg::DFmt(\"Add SMC interval: {:X} - {:X}\", AlignedBase, AlignedBase + AlignedSize);\n        RWXIntervals.Insert(ProtInterval);\n      }\n      return true;\n    } else if (XIntervals.Intersect(ProtInterval)) {\n      XIntervals.Remove(ProtInterval);\n      RWXIntervals.Remove(ProtInterval);\n      return true;\n    }\n\n    return false;\n  }();\n\n  if (NeedsInvalidate) {\n    // IntervalsLock cannot be held during invalidation\n    InvalidateIntervalInternal(AlignedBase, AlignedSize);\n  }\n}\n\nvoid InvalidationTracker::HandleImageMap(std::string_view Name, uint64_t Address) {\n  auto* Nt = RtlImageNtHeader(reinterpret_cast<HMODULE>(Address));\n  auto* SectionsBegin = IMAGE_FIRST_SECTION(Nt);\n  auto* SectionsEnd = SectionsBegin + Nt->FileHeader.NumberOfSections;\n  uint64_t LastExecutableSectionEnd = 0;\n\n  for (auto* Section = SectionsBegin; Section != SectionsEnd; Section++) {\n    if (Section->Characteristics & IMAGE_SCN_MEM_EXECUTE) {\n      std::unique_lock Lock(IntervalsLock);\n\n      uint64_t SectionBase = Address + Section->VirtualAddress;\n      uint64_t SectionEnd = SectionBase + Section->Misc.VirtualSize;\n      XIntervals.Insert({SectionBase, SectionEnd});\n      LastExecutableSectionEnd = std::max(LastExecutableSectionEnd, SectionEnd);\n      if (Section->Characteristics & IMAGE_SCN_MEM_WRITE) {\n        LogMan::Msg::DFmt(\"Add image SMC interval: {:X} - {:X}\", SectionBase, SectionBase + Section->Misc.VirtualSize);\n        RWXIntervals.Insert({SectionBase, SectionBase + Section->Misc.VirtualSize});\n      }\n    }\n  }\n\n  FEX_CONFIG_OPT(MonoHacks, MONOHACKS);\n  if (MonoHacks && (Name == \"mono-2.0-bdwgc.dll\" || Name == \"mono.dll\")) {\n    FEX_CONFIG_OPT(MaxInst, MAXINST);\n    FEX_CONFIG_OPT(Multiblock, MULTIBLOCK);\n    if (Multiblock && MaxInst() >= 500) {\n      // Require these settings to ensure we can safely hook all SMC sites in a single block\n      CTX.MarkMonoDetected();\n      MonoBackpatcherDetectionPending = true;\n      MonoBase = Address;\n      MonoEnd = LastExecutableSectionEnd;\n    } else {\n      LogMan::Msg::IFmt(\"Not applying mono hacks, Multiblock with MaxInst >= 500 required\");\n    }\n  }\n}\n\nInvalidationTracker::InvalidateContainingSectionResult InvalidationTracker::InvalidateContainingSection(uint64_t Address, bool Free) {\n  MEMORY_BASIC_INFORMATION Info;\n  if (NtQueryVirtualMemory(NtCurrentProcess(), reinterpret_cast<void*>(Address), MemoryBasicInformation, &Info, sizeof(Info), nullptr)) {\n    return {Address, 0};\n  }\n\n  const auto SectionBase = reinterpret_cast<uint64_t>(Info.AllocationBase);\n  auto SectionSize = reinterpret_cast<uint64_t>(Info.BaseAddress) + Info.RegionSize - SectionBase;\n\n  while (!NtQueryVirtualMemory(NtCurrentProcess(), reinterpret_cast<void*>(SectionBase + SectionSize), MemoryBasicInformation, &Info,\n                               sizeof(Info), nullptr) &&\n         reinterpret_cast<uint64_t>(Info.AllocationBase) == SectionBase) {\n    SectionSize += Info.RegionSize;\n  }\n\n  InvalidateIntervalInternal(SectionBase, SectionSize);\n\n  if (Free) {\n    std::unique_lock Lock(IntervalsLock);\n    XIntervals.Remove({SectionBase, SectionBase + SectionSize});\n    RWXIntervals.Remove({SectionBase, SectionBase + SectionSize});\n  }\n\n  return {SectionBase, SectionSize};\n}\n\nvoid InvalidationTracker::InvalidateAlignedInterval(uint64_t Address, uint64_t Size, bool Free) {\n  if (!Address) {\n    // Match the Windows behaviour when passed a NULL base address.\n    Size = std::numeric_limits<uint64_t>::max();\n  }\n\n  const auto AlignedBase = Address & FEXCore::Utils::FEX_PAGE_MASK;\n  const auto AlignedSize = std::max(Size, (Address - AlignedBase + Size + FEXCore::Utils::FEX_PAGE_SIZE - 1) & FEXCore::Utils::FEX_PAGE_MASK);\n\n  InvalidateIntervalInternal(AlignedBase, AlignedSize);\n\n  if (Free) {\n    std::unique_lock Lock(IntervalsLock);\n    XIntervals.Remove({AlignedBase, AlignedBase + AlignedSize});\n    RWXIntervals.Remove({AlignedBase, AlignedBase + AlignedSize});\n  }\n}\n\nvoid InvalidationTracker::ReprotectRWXIntervals(uint64_t Address, uint64_t Size) {\n  ProtectRWXIntervalsInternal(Address, Size, false);\n}\n\nbool InvalidationTracker::HandleRWXAccessViolation(FEXCore::Core::InternalThreadState* Thread, uint64_t HostPc, uint64_t FaultAddress) {\n  const bool NeedsInvalidate = [&](uint64_t Address) {\n    std::shared_lock Lock(IntervalsLock);\n    return RWXIntervals.Query(Address).Enclosed;\n  }(FaultAddress);\n\n  if (NeedsInvalidate) {\n    // IntervalsLock cannot be held during invalidation\n    {\n      std::scoped_lock Lock(CTX.GetCodeInvalidationMutex());\n\n      InvalidateIntervalInternalLocked(FaultAddress & FEXCore::Utils::FEX_PAGE_MASK, FEXCore::Utils::FEX_PAGE_SIZE);\n\n      // Invalidate, then unprotect the faulting page with the compilation lock held to ensure that any racing invalidations are not dropped.\n      ULONG TmpProt;\n      void* TmpAddress = reinterpret_cast<void*>(FaultAddress);\n      SIZE_T TmpSize = 1;\n      NtProtectVirtualMemory(NtCurrentProcess(), &TmpAddress, &TmpSize, PAGE_EXECUTE_READWRITE, &TmpProt);\n    }\n    DetectMonoBackpatcherBlock(Thread, HostPc);\n    return true;\n  }\n  return false;\n}\n\nbool InvalidationTracker::BeginUntrackedWriteLocked(uint64_t Address, uint64_t Size) {\n  return ProtectRWXIntervalsInternal(Address, Size, true);\n}\n\nFEXCore::HLE::ExecutableRangeInfo InvalidationTracker::QueryExecutableRange(uint64_t Address) {\n  std::shared_lock Lock(IntervalsLock);\n  const auto XResult = XIntervals.Query(Address);\n  if (!XResult.Enclosed) {\n    return {};\n  }\n  const auto RWXResult = RWXIntervals.Query(Address);\n  if (RWXResult.Enclosed) {\n    return {RWXResult.Interval.Offset, RWXResult.Interval.End - RWXResult.Interval.Offset, true};\n  } else if (RWXResult.Size && RWXResult.Size < XResult.Size) {\n    return {XResult.Interval.Offset, RWXResult.Interval.Offset - XResult.Interval.Offset, false};\n  }\n  return {XResult.Interval.Offset, XResult.Interval.End - XResult.Interval.Offset, false};\n}\n\nvoid InvalidationTracker::DetectMonoBackpatcherBlock(FEXCore::Core::InternalThreadState* Thread, uint64_t HostPc) {\n  if (!MonoBackpatcherDetectionPending) {\n    return;\n  }\n\n  if (!CTX.IsAddressInCodeBuffer(Thread, HostPc)) {\n    return;\n  }\n\n  uint64_t RIP = CTX.RestoreRIPFromHostPC(Thread, HostPc);\n  if (!RIP || RIP < MonoBase || RIP >= MonoEnd) {\n    return;\n  }\n\n  static constexpr uint8_t XChgOp = 0x87;\n  if (*reinterpret_cast<uint8_t*>(RIP) != XChgOp && *reinterpret_cast<uint8_t*>(RIP + 1) != XChgOp) {\n    return;\n  }\n\n  uint64_t BlockEntry = CTX.GetGuestBlockEntry(Thread);\n  LogMan::Msg::DFmt(\"Detected mono backpatcher at: {:X}\", BlockEntry);\n  DisableSMCDetection();\n  {\n    std::scoped_lock CodeLock(CTX.GetCodeInvalidationMutex());\n    CTX.MarkMonoBackpatcherBlock(BlockEntry);\n  }\n  InvalidateAlignedInterval(BlockEntry, FEXCore::Utils::FEX_PAGE_SIZE, false);\n}\n\nvoid InvalidationTracker::DisableSMCDetection() {\n  std::unique_lock Lock(IntervalsLock);\n  SMCDetectionDisabled = true;\n  uint64_t Address = 0;\n\n  // Reprotect all RWX intervals as RWX\n  FEXCore::IntervalList<uint64_t>::QueryResult Query;\n  do {\n    Query = RWXIntervals.Query(Address);\n    if (Query.Enclosed) {\n      void* TmpAddress = reinterpret_cast<void*>(Address);\n      SIZE_T TmpSize = static_cast<SIZE_T>(Query.Size);\n      ULONG TmpProt;\n      NtProtectVirtualMemory(NtCurrentProcess(), &TmpAddress, &TmpSize, PAGE_EXECUTE_READWRITE, &TmpProt);\n    }\n    Address += Query.Size;\n  } while (Query.Size);\n}\n\nvoid InvalidationTracker::InvalidateIntervalInternal(uint64_t Address, uint64_t Size) {\n  std::scoped_lock CodeLock(CTX.GetCodeInvalidationMutex());\n  InvalidateIntervalInternalLocked(Address, Size);\n}\n\nvoid InvalidationTracker::InvalidateIntervalInternalLocked(uint64_t Address, uint64_t Size) {\n  // NOTE: This assumes CodeInvalidationMutex is locked by the caller\n  CTX.InvalidateCodeBuffersCodeRange(Address, Size);\n  for (auto Thread : Threads) {\n    CTX.InvalidateThreadCachedCodeRange(Thread.second, Address, Size);\n  }\n}\n\nbool InvalidationTracker::ProtectRWXIntervalsInternal(uint64_t Address, uint64_t Size, bool ForWriteLocked) {\n  const auto End = Address + Size;\n  std::shared_lock Lock(IntervalsLock);\n\n  if (SMCDetectionDisabled) {\n    return false;\n  }\n\n  bool HitRWXInterval = false;\n  do {\n    const auto Query = RWXIntervals.Query(Address);\n    if (Query.Enclosed) {\n      if (!HitRWXInterval) {\n        if (ForWriteLocked) {\n          // If we are protecting as writable, then the entire range must be invalidated before any protections are\n          // applied and the invalidation mutex must be locked throughout.\n          // Do this lazily only when an RWX region is actually hit.\n          // NOTE: This assumes CodeInvalidationMutex is locked by the caller\n          InvalidateIntervalInternalLocked(Address, Size);\n        }\n        HitRWXInterval = true;\n      }\n      void* TmpAddress = reinterpret_cast<void*>(Address);\n      SIZE_T TmpSize = static_cast<SIZE_T>(std::min(End, Address + Query.Size) - Address);\n      ULONG TmpProt;\n      NtProtectVirtualMemory(NtCurrentProcess(), &TmpAddress, &TmpSize, ForWriteLocked ? PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ, &TmpProt);\n    } else if (!Query.Size) {\n      // No more regions past `Address` in the interval list\n      break;\n    }\n\n    Address += Query.Size;\n  } while (Address < End);\n\n  return HitRWXInterval;\n}\n\n} // namespace FEX::Windows\n"
  },
  {
    "path": "Source/Windows/Common/InvalidationTracker.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/IntervalList.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n#include <mutex>\n#include <shared_mutex>\n#include <unordered_map>\n#include <string_view>\n\nnamespace FEXCore::Core {\nstruct InternalThreadState;\n}\n\nnamespace FEXCore::Context {\nclass Context;\n}\n\nnamespace FEX::Windows {\n/**\n * @brief Handles SMC and regular code invalidation\n */\nclass InvalidationTracker {\npublic:\n  InvalidationTracker(FEXCore::Context::Context& CTX, const std::unordered_map<DWORD, FEXCore::Core::InternalThreadState*>& Threads);\n  void HandleMemoryProtectionNotification(uint64_t Address, uint64_t Size, ULONG Prot);\n  void HandleImageMap(std::string_view Name, uint64_t Address);\n  struct InvalidateContainingSectionResult {\n    uint64_t SectionStart;\n    uint64_t SectionSize;\n  };\n  InvalidateContainingSectionResult InvalidateContainingSection(uint64_t Address, bool Free);\n  void InvalidateAlignedInterval(uint64_t Address, uint64_t Size, bool Free);\n  void ReprotectRWXIntervals(uint64_t Address, uint64_t Size);\n  bool HandleRWXAccessViolation(FEXCore::Core::InternalThreadState* Thread, uint64_t HostPC, uint64_t FaultAddress);\n\n  // Unprotects any RWX intervals in the input interval and invalidates code\n  // NOTE: CodeInvalidationMutex must be locked when calling this, and if true is returned, kept locked until the write ends.\n  bool BeginUntrackedWriteLocked(uint64_t Address, uint64_t Size);\n\n  FEXCore::HLE::ExecutableRangeInfo QueryExecutableRange(uint64_t Address);\n\nprivate:\n  void DetectMonoBackpatcherBlock(FEXCore::Core::InternalThreadState* Thread, uint64_t HostPC);\n  void DisableSMCDetection();\n  void InvalidateIntervalInternal(uint64_t Address, uint64_t Size);\n  // NOTE: This assumed CodeInvalidationMutex is locked by the caller\n  void InvalidateIntervalInternalLocked(uint64_t Address, uint64_t Size);\n\n  // NOTE: If ForWriteLocked is true then this assumes CodeInvalidationMutex is locked by the caller,\n  // and any code in the range will be invalidated before protection as RWX, otherwise protects as RX if false.\n  bool ProtectRWXIntervalsInternal(uint64_t Address, uint64_t Size, bool ForWriteLocked);\n\n  FEXCore::IntervalList<uint64_t> XIntervals;\n  FEXCore::IntervalList<uint64_t> RWXIntervals;\n  std::shared_mutex IntervalsLock;\n  FEXCore::Context::Context& CTX;\n  const std::unordered_map<DWORD, FEXCore::Core::InternalThreadState*>& Threads;\n  bool SMCDetectionDisabled {false}; // Protected by IntervalsLock\n\n  bool MonoBackpatcherDetectionPending {false};\n  uint64_t MonoBase {0};\n  uint64_t MonoEnd {0};\n};\n} // namespace FEX::Windows\n"
  },
  {
    "path": "Source/Windows/Common/JITGuardPage.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/Utils/LongJump.h>\n\nnamespace FEX::Windows::JITGuardPage {\nstatic inline bool HandleJITGuardPage(FEXCore::Core::InternalThreadState* Thread, void* Address, uint64_t* GPRs, __uint128_t* FPRs, uint64_t* PC) {\n  if (Address >= reinterpret_cast<void*>(Thread->JITGuardPage) &&\n      Address < reinterpret_cast<void*>(Thread->JITGuardPage + FEXCore::Utils::FEX_PAGE_SIZE)) {\n    FEXCore::UncheckedLongJump::ManuallyLoadJumpBuf(Thread->RestartJump, Thread->JITGuardOverflowArgument, GPRs, FPRs, PC);\n    return true;\n  }\n\n  return false;\n}\n\n} // namespace FEX::Windows::JITGuardPage\n"
  },
  {
    "path": "Source/Windows/Common/LoadConfig.S",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the mingw-w64 runtime package.\n * No warranty is given; refer to the file DISCLAIMER.PD within this package.\n */\n\n#define PTR .8byte\n#define ALIGN 16\n#define EXPORT_SYM(x) .globl x; x:\n#define SYM(x) x\n\n.text\n.balign ALIGN\n#ifdef __arm64ec__\n/*\nCalls to this are synthesized by the linker when calling into import libraries,\nthis is referred to as an 'Adjustor Thunk' in ARM64EC documentation.\n*/\nEXPORT_SYM(__icall_helper_arm64ec)\n.seh_proc \"__icall_helper_arm64ec\"\n  stp  fp,   lr, [sp, #-16]!\n.seh_save_fplr_x 16\n  mov  fp,   sp\n.seh_set_fp\n.seh_endprologue\n  adrp x16, __os_arm64x_check_icall\n  ldr  x16, [x16, #:lo12:__os_arm64x_check_icall]\n  blr  x16\n.seh_startepilogue\n  ldp  fp,  lr,  [sp], #16\n.seh_save_fplr_x 16\n.seh_endepilogue\n  br   x11\n.seh_endproc\n#endif\n\nSYM(__guard_check_icall_dummy):\n  ret\n\n.section  .00cfg, \"dr\"\n.balign ALIGN\n#ifdef __arm64ec__\n/*\nThese symbols are updated at runtime by the dynamic linker to point to emulator\nhelper routines.\n*/\nEXPORT_SYM(__os_arm64x_dispatch_call_no_redirect)\n  PTR 0\nEXPORT_SYM(__os_arm64x_dispatch_ret)\n  PTR 0\nEXPORT_SYM(__os_arm64x_check_icall)\nEXPORT_SYM(__os_arm64x_dispatch_icall)\n  PTR 0\nEXPORT_SYM(__os_arm64x_check_call)\nEXPORT_SYM(__os_arm64x_dispatch_call)\n  PTR 0\nEXPORT_SYM(__os_arm64x_check_icall_cfg)\nEXPORT_SYM(__os_arm64x_check_dispatch_cfg)\n  PTR 0\nEXPORT_SYM(__os_arm64x_rdtsc)\nEXPORT_SYM(__os_arm64x_get_x64_information)\n  PTR 0\nEXPORT_SYM(__os_arm64x_set_x64_information)\nEXPORT_SYM(__os_arm64x_cpuidex)\n  PTR 0\nEXPORT_SYM(__os_arm64x_x64_jump)\nEXPORT_SYM(__os_arm64x_dispatch_fptr)\n  PTR 0\nEXPORT_SYM(__os_arm64x_helper0)\n  PTR 0\nEXPORT_SYM(__os_arm64x_helper1)\n  PTR 0\nEXPORT_SYM(__os_arm64x_helper2)\n  PTR 0\nEXPORT_SYM(__os_arm64x_helper3)\n  PTR 0\nEXPORT_SYM(__os_arm64x_helper4)\n  PTR 0\nEXPORT_SYM(__os_arm64x_helper5)\n  PTR 0\nEXPORT_SYM(__os_arm64x_helper6)\n  PTR 0\nEXPORT_SYM(__os_arm64x_helper7)\n  PTR 0\nEXPORT_SYM(__os_arm64x_helper8)\n  PTR 0\n#endif\nEXPORT_SYM(__guard_check_icall_fptr)\n  PTR SYM(__guard_check_icall_dummy)\n\n#ifdef __arm64ec__\n/*\nThis structure is read at runtime by the dynamic linker on ARM64EC to configure\nmetadata necessary for EC code to interface with x86_64 code.\n*/\n.section  .rdata,\"dr\"\n.balign ALIGN\nEXPORT_SYM(__chpe_metadata)\n  .4byte 1 /* Version */\n  .4byte __hybrid_code_map@IMGREL /* CodeMap */\n  .4byte __hybrid_code_map_count /* CodeMapCount */\n  .4byte __x64_code_ranges_to_entry_points@IMGREL /* CodeRangesToEntryPoints */\n  .4byte __arm64x_redirection_metadata@IMGREL /* RedirectionMetadata */\n  .4byte __os_arm64x_dispatch_call_no_redirect@IMGREL /* __os_arm64x_dispatch_call_no_redirect */\n  .4byte __os_arm64x_dispatch_ret@IMGREL /* __os_arm64x_dispatch_ret */\n  .4byte __os_arm64x_check_call@IMGREL /* __os_arm64x_dispatch_call */\n  .4byte __os_arm64x_check_icall@IMGREL /* __os_arm64x_dispatch_icall */\n  .4byte __os_arm64x_check_icall_cfg@IMGREL /* __os_arm64x_dispatch_icall_cfg */\n  .4byte __arm64x_native_entrypoint@IMGREL /* AlternateEntryPoint */\n  .4byte __hybrid_auxiliary_iat@IMGREL /* AuxiliaryIAT */\n  .4byte __x64_code_ranges_to_entry_points_count /* CodeRangesToEntryPointsCount */\n  .4byte __arm64x_redirection_metadata_count /* RedirectionMetadataCount */\n  .4byte __os_arm64x_get_x64_information@IMGREL /* GetX64InformationFunctionPointer */\n  .4byte __os_arm64x_set_x64_information@IMGREL /* SetX64InformationFunctionPointer */\n  .4byte __arm64x_extra_rfe_table@IMGREL /* ExtraRFETable */\n  .4byte __arm64x_extra_rfe_table_size /* ExtraRFETableSize */\n  .4byte __os_arm64x_x64_jump@IMGREL /* __os_arm64x_dispatch_fptr */\n  .4byte __hybrid_auxiliary_iat_copy@IMGREL /* AuxiliaryIATCopy */\n  /* The following members are undocumented */\n  .4byte __os_arm64x_helper0@IMGREL\n  .4byte __os_arm64x_helper1@IMGREL\n  .4byte __os_arm64x_helper2@IMGREL\n  .4byte __os_arm64x_helper3@IMGREL\n  .4byte __os_arm64x_helper4@IMGREL\n  .4byte __os_arm64x_helper5@IMGREL\n  .4byte __os_arm64x_helper6@IMGREL\n  .4byte __os_arm64x_helper7@IMGREL\n  .4byte __os_arm64x_helper8@IMGREL\n#endif\n\n.section  .rdata,\"dr\"\n.globl  SYM(_load_config_used)\n.balign ALIGN\nSYM(_load_config_used):\n  .4byte  SYM(_load_config_used__end) - SYM(_load_config_used) /* Size */\n  .4byte  0 /* TimeDateStamp */\n  .2byte  0 /* MajorVersion */\n  .2byte  0 /* MinorVersion */\n  .4byte  0 /* GLobalFlagsClear */\n  .4byte  0 /* GlobalFlagsSet */\n  .4byte  0 /* CriticalSectionDefaultTimeout */\n  PTR  0 /* DeCommitFreeBlockThreshold */\n  PTR  0 /* DeCommitTotalFreeThreshold */\n  PTR  0 /* LockPrefixTable */\n  PTR  0 /* MaximumAllocationSize */\n  PTR  0 /* VirtualMemoryThreshold */\n  PTR  0 /* ProcessAffinityMask */\n  .4byte  0 /* ProcessHeapFlags */\n  .2byte  0 /* CSDVersion */\n  .2byte  0 /* DependentLoadFlags */\n  PTR  0 /* EditList */\n  PTR  0 /* SecurityCookie */\n  PTR  0 /* SEHandlerTable */\n  PTR  0 /* SEHandlerCount */\n  PTR  SYM(__guard_check_icall_fptr) /* GuardCFCheckFunction */\n  PTR  0 /* GuardCFCheckDispatch */\n  PTR  SYM(__guard_fids_table) /* GuardCFFunctionTable */\n  PTR  SYM(__guard_fids_count) /* GuardCFFunctionCount */\n  .4byte  SYM(__guard_flags) /* GuardFlags */\n  .2byte  0 /* CodeIntegrity_Flags */\n  .2byte  0 /* CodeIntegrity_Catalog */\n  .4byte  0 /* CodeIntegrity_CatalogOffset */\n  .4byte  0 /* CodeIntegrity_Reserved */\n  PTR  SYM(__guard_iat_table) /* GuardAddressTakenIatEntryTable */\n  PTR  SYM(__guard_iat_count) /* GuardAddressTakenIatEntryCount */\n  PTR  SYM(__guard_longjmp_table) /* GuardLongJumpTargetTable */\n  PTR  SYM(__guard_longjmp_count) /* GuardLongJumpTargetCount */\n  PTR  0 /* DynamicValueRelocTable */\n#ifdef __arm64ec__\n  PTR  SYM(__chpe_metadata) /* CHPEMetadataPointer */\n#endif\n  PTR  0 /* GuardRFFailureRoutine */\n  PTR  0 /* GuardRFFailureRoutineFunctionPointer */\n  .4byte  0 /* DynamicValueRelocTableOffset */\n  .2byte  0 /* DynamicValueRelocTableSection */\n  .2byte  0 /* Reserved2 */\n  PTR  0 /* GuardRFVerifyStackPointerFunctionPointer */\n  .4byte  0 /* HotPatchTableOffset */\n  .4byte  0 /* Reserved3 */\n  PTR  0 /* EnclaveConfigurationPointer */\n  PTR  0 /* VolatileMetadataPointer */\n  PTR SYM(__guard_eh_cont_table) /* GuardEHContinuationTable */\n  PTR SYM(__guard_eh_cont_count) /* GuardEHContinuationCount */\n  PTR  0 /* GuardXFGCheckFunctionPointer */\n  PTR  0 /* GuardXFGDispatchFunctionPointer */\n  PTR  0 /* GuardXFGTableDispatchFunctionPointer */\n  PTR  0 /* CastGuardOsDeterminedFailureMode */\n\nSYM(_load_config_used__end):\n"
  },
  {
    "path": "Source/Windows/Common/Logging.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Utils/LogManager.h>\n\n#include <cstdio>\n#include <ntstatus.h>\n#include <windef.h>\n#include <winternl.h>\n#include <winnt.h>\n\nnamespace {\nvoid (*WineDbgOut)(const char* Message);\nFILE* LogFile;\n\nstatic void MsgHandler(LogMan::DebugLevels Level, const char* Message) {\n  const auto Output = fextl::fmt::format(\"{} {:X} {}\\n\", LogMan::DebugLevelStr(Level), GetCurrentThreadId(), Message);\n  if (WineDbgOut) {\n    WineDbgOut(Output.c_str());\n  } else if (LogFile) {\n    fwrite(Output.c_str(), 1, Output.size(), LogFile);\n  }\n}\n\nstatic void AssertHandler(const char* Message) {\n  const auto Output = fextl::fmt::format(\"A {}\\n\", Message);\n  if (WineDbgOut) {\n    WineDbgOut(Output.c_str());\n  } else if (LogFile) {\n    fwrite(Output.c_str(), 1, Output.size(), LogFile);\n  }\n}\n} // namespace\n\nnamespace FEX::Windows::Logging {\nvoid Init() {\n  FEX_CONFIG_OPT(SilentLog, SILENTLOG);\n  if (SilentLog()) {\n    return;\n  }\n\n  WineDbgOut = reinterpret_cast<decltype(WineDbgOut)>(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"__wine_dbg_output\"));\n  if (!WineDbgOut) {\n    const auto Path = fextl::fmt::format(\"{}\\\\fex-{}.log\", getenv(\"LOCALAPPDATA\"), GetCurrentProcessId());\n    LogFile = fopen(Path.c_str(), \"a\");\n  }\n  LogMan::Throw::InstallHandler(AssertHandler);\n  LogMan::Msg::InstallHandler(MsgHandler);\n}\n} // namespace FEX::Windows::Logging\n"
  },
  {
    "path": "Source/Windows/Common/Logging.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\nnamespace FEX::Windows::Logging {\nvoid Init();\n} // namespace FEX::Windows::Logging\n"
  },
  {
    "path": "Source/Windows/Common/Module.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <array>\n#include <FEXCore/fextl/string.h>\n#include <winternl.h>\n\nnamespace FEX::Windows {\ninline fextl::string GetExecutableFilePath() {\n  std::array<WCHAR, PATH_MAX> Buf;\n  UNICODE_STRING PathW {.Length = 0, .MaximumLength = Buf.size() * sizeof(WCHAR), .Buffer = Buf.data()};\n\n  if (LdrGetDllFullName(nullptr, &PathW)) {\n    return {};\n  }\n\n  STRING PathA;\n  RtlUnicodeStringToAnsiString(&PathA, &PathW, TRUE);\n  fextl::string Path(PathA.Buffer);\n  RtlFreeAnsiString(&PathA);\n\n  return Path;\n}\n\ninline fextl::string GetSectionFilePath(uint64_t Address) {\n  struct {\n    MEMORY_SECTION_NAME Info;\n    std::array<WCHAR, PATH_MAX> PathW;\n  } Buffer;\n\n  if (NtQueryVirtualMemory(NtCurrentProcess(), reinterpret_cast<void*>(Address), MemoryMappedFilenameInformation, &Buffer, sizeof(Buffer), NULL)) {\n    return {};\n  }\n\n  STRING PathA;\n  RtlUnicodeStringToAnsiString(&PathA, &Buffer.Info.SectionFileName, TRUE);\n  fextl::string Path(PathA.Buffer);\n  RtlFreeAnsiString(&PathA);\n\n  return Path;\n}\n\ninline std::string_view BaseName(std::string_view Path) {\n  return Path.substr(Path.find_last_of('\\\\') + 1);\n}\n} // namespace FEX::Windows\n"
  },
  {
    "path": "Source/Windows/Common/OvercommitTracker.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Utils/IntervalList.h>\n#include <thread>\n#include <shared_mutex>\n\n\nnamespace FEX::Windows {\n/**\n * @brief Emulates memory overcommit of reserved regions with exceptions\n */\nclass OvercommitTracker {\nprivate:\n  bool IsWine;\n  FEXCore::IntervalList<uint64_t> OvercommitIntervals;\n  std::shared_mutex OvercommitIntervalsMutex;\n\npublic:\n  OvercommitTracker(bool IsWine)\n    : IsWine {IsWine} {}\n\n  void MarkRange(uint64_t Start, uint64_t Length) {\n    std::unique_lock Lock {OvercommitIntervalsMutex};\n    OvercommitIntervals.Insert({Start, Start + Length});\n  }\n\n  void UnmarkRange(uint64_t Start, uint64_t Length) {\n    std::unique_lock Lock {OvercommitIntervalsMutex};\n    OvercommitIntervals.Remove({Start, Start + Length});\n  }\n\n  bool HandleAccessViolation(uint64_t FaultAddress) {\n    std::shared_lock Lock {OvercommitIntervalsMutex};\n    auto Query = OvercommitIntervals.Query(FaultAddress);\n\n    if (Query.Enclosed) {\n      if (IsWine) {\n        MEMORY_BASIC_INFORMATION Info;\n        NtQueryVirtualMemory(NtCurrentProcess(), reinterpret_cast<void*>(FaultAddress), MemoryBasicInformation, &Info, sizeof(Info), nullptr);\n        const auto CommitSize = reinterpret_cast<SIZE_T>(Info.BaseAddress) + Info.RegionSize - reinterpret_cast<SIZE_T>(Info.AllocationBase);\n        VirtualAlloc(reinterpret_cast<void*>(Info.AllocationBase), CommitSize, MEM_COMMIT, PAGE_READWRITE);\n      } else {\n        static constexpr size_t MaxFaultCommitSize = 1024 * 64;\n        const auto AlignedFaultAddress = reinterpret_cast<void*>(FaultAddress & FEXCore::Utils::FEX_PAGE_MASK);\n        VirtualAlloc(AlignedFaultAddress, std::min(Query.Size, MaxFaultCommitSize), MEM_COMMIT, PAGE_READWRITE);\n      }\n      return true;\n    }\n    return false;\n  }\n};\n} // namespace FEX::Windows\n"
  },
  {
    "path": "Source/Windows/Common/PortabilityInfo.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n#include \"Common/Config.h\"\n\nnamespace FEX {\nstatic inline FEX::Config::PortableInformation ReadPortabilityInformation() {\n  const FEX::Config::PortableInformation BadResult {false, {}};\n  const char* PortableConfig = getenv(\"FEX_PORTABLE\");\n  if (!PortableConfig || strtol(PortableConfig, nullptr, 0) == 0) {\n    return BadResult;\n  }\n\n  return {true, getenv(\"LOCALAPPDATA\")};\n}\n} // namespace FEX\n"
  },
  {
    "path": "Source/Windows/Common/Priv.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <exception>\n#include <winternl.h>\n\nstatic inline __TEB* GetCurrentTEB() {\n  return reinterpret_cast<__TEB*>(NtCurrentTeb());\n}\n\nstatic inline __PEB* GetCurrentPEB() {\n  return GetCurrentTEB()->Peb;\n}\n\nstatic inline bool WinAPIReturn(NTSTATUS Status) {\n  if (!Status) {\n    return true;\n  }\n  GetCurrentTEB()->LastErrorValue = RtlNtStatusToDosError(Status);\n  return false;\n}\n\nstatic inline UNICODE_STRING InitUnicodeString(const wchar_t* String) {\n  UNICODE_STRING StringDesc;\n  RtlInitUnicodeString(&StringDesc, String);\n  return StringDesc;\n}\n\nstatic inline STRING InitAnsiString(const char* String) {\n  STRING StringDesc;\n  RtlInitAnsiString(&StringDesc, String);\n  return StringDesc;\n}\n\nclass ScopedUnicodeString {\nprivate:\n  UNICODE_STRING Str {};\npublic:\n  ScopedUnicodeString() = default;\n\n  ScopedUnicodeString(const char* AStr) {\n    RtlCreateUnicodeStringFromAsciiz(&Str, AStr);\n  }\n\n  ~ScopedUnicodeString() {\n    RtlFreeUnicodeString(&Str);\n  }\n\n  UNICODE_STRING* operator->() {\n    return &Str;\n  }\n\n  UNICODE_STRING& operator*() {\n    return Str;\n  }\n};\n\n\n#define UNIMPLEMENTED()                        \\\n  do {                                         \\\n    NtTerminateProcess(NtCurrentProcess(), 0); \\\n    __fastfail(0);                             \\\n  } while (0)\n\n#define DLLEXPORT_FUNC(Ret, Name, Args) \\\n  extern \"C\" Ret Name Args;             \\\n  Ret(*__imp_##Name) Args = Name;       \\\n  Ret(*__imp_aux_##Name) Args = Name;   \\\n  Ret Name Args\n"
  },
  {
    "path": "Source/Windows/Common/SHMStats.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include \"Windows/Common/SHMStats.h\"\n\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/TypeDefines.h>\n\n#include <ntstatus.h>\n#include <windef.h>\n#include <winternl.h>\n#include <winnt.h>\n#include <wine/debug.h>\n\nnamespace FEX::Windows {\n__attribute__((naked)) uint64_t linux_getpid() {\n  asm volatile(R\"(\n  mov x8, 172;\n  svc #0;\n  ret;\n  )\" ::\n                 : \"r0\", \"r8\");\n}\n\nuint32_t StatAlloc::FrontendAllocateSlots(uint32_t NewSize) {\n  if (CurrentSize == MAX_STATS_SIZE || !UsingNTQueryPath) {\n    LogMan::Msg::DFmt(\"Ran out of slots. Can't allocate more\");\n    return CurrentSize;\n  }\n\n  MEMORY_FEX_STATS_SHM_INFORMATION Info {\n    .shm_base = nullptr,\n    .map_size = std::min(CurrentSize * 2, MAX_STATS_SIZE),\n    .max_size = MAX_STATS_SIZE,\n  };\n  size_t Length {};\n  auto Result = NtQueryVirtualMemory(NtCurrentProcess(), nullptr, MemoryFexStatsShm, &Info, sizeof(Info), &Length);\n  if (!Result) {\n    CurrentSize = Info.map_size;\n  }\n\n  return CurrentSize;\n}\n\nStatAlloc::StatAlloc(FEXCore::SHMStats::AppType AppType) {\n  // Try wine+fex magic path.\n\n  {\n    MEMORY_FEX_STATS_SHM_INFORMATION Info {\n      .shm_base = nullptr,\n      .map_size = FEXCore::Utils::FEX_PAGE_SIZE,\n      .max_size = MAX_STATS_SIZE,\n    };\n    size_t Length {};\n    auto Result = NtQueryVirtualMemory(NtCurrentProcess(), nullptr, MemoryFexStatsShm, &Info, sizeof(Info), &Length);\n    if (!Result) {\n      UsingNTQueryPath = true;\n      CurrentSize = Info.map_size;\n      Base = Info.shm_base;\n      SaveHeader(AppType);\n      return;\n    }\n  }\n  CurrentSize = MAX_STATS_SIZE;\n\n  auto handle = CreateFile(fextl::fmt::format(\"/dev/shm/fex-{}-stats\", linux_getpid()).c_str(), GENERIC_READ | GENERIC_WRITE,\n                           FILE_SHARE_READ, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);\n\n  // Create the section mapping for the file handle for the full size.\n  HANDLE SectionMapping;\n  LARGE_INTEGER SectionSize {{MAX_STATS_SIZE}};\n  auto Result = NtCreateSection(&SectionMapping, SECTION_EXTEND_SIZE | SECTION_MAP_READ | SECTION_MAP_WRITE, nullptr, &SectionSize,\n                                PAGE_READWRITE, SEC_COMMIT, handle);\n  if (Result != 0) {\n    CloseHandle(handle);\n    return;\n  }\n\n  // Section mapping is used from now on.\n  CloseHandle(handle);\n\n  // Now actually map the view of the section.\n  Base = 0;\n  size_t FullSize = MAX_STATS_SIZE;\n  Result = NtMapViewOfSection(SectionMapping, NtCurrentProcess(), &Base, 0, 0, nullptr, &FullSize, ViewUnmap, MEM_RESERVE | MEM_TOP_DOWN,\n                              PAGE_READWRITE);\n  if (Result != 0) {\n    CloseHandle(SectionMapping);\n    return;\n  }\n\n  // Once WINE supports NtExtendSection and SECTION_EXTEND_SIZE correctly then we can map/commit a single page, map the full MAX_STATS_SIZE\n  // view as reserved, and extend the view using NtExtendSection.\n  SaveHeader(AppType);\n}\nStatAlloc::~StatAlloc() {\n  DeleteFile(fextl::fmt::format(\"/dev/shm/fex-{}-stats\", linux_getpid()).c_str());\n}\n\n} // namespace FEX::Windows\n"
  },
  {
    "path": "Source/Windows/Common/SHMStats.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include \"Common/SHMStats.h\"\n\nnamespace FEX::Windows {\nclass StatAlloc final : public FEX::SHMStats::StatAllocBase {\npublic:\n  StatAlloc(FEXCore::SHMStats::AppType AppType);\n  virtual ~StatAlloc();\n\n  FEXCore::SHMStats::ThreadStats* AllocateSlot(uint32_t TID) {\n    return StatAllocBase::AllocateSlot(TID);\n  }\n\n  void DeallocateSlot(FEXCore::SHMStats::ThreadStats* AllocatedSlot) {\n    if (!AllocatedSlot) {\n      return;\n    }\n\n    StatAllocBase::DeallocateSlot(AllocatedSlot);\n  }\n\nprivate:\n  uint32_t FrontendAllocateSlots(uint32_t NewSize) override;\n  bool UsingNTQueryPath {};\n};\n\n} // namespace FEX::Windows\n"
  },
  {
    "path": "Source/Windows/Common/TSOHandlerConfig.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Utils/ArchHelpers/Arm64.h>\n\nnamespace FEX::Windows {\nclass TSOHandlerConfig final {\npublic:\n  TSOHandlerConfig(FEXCore::Context::Context& CTX) {\n    if (HalfBarrierTSOEnabled()) {\n      UnalignedHandlerType = FEXCore::ArchHelpers::Arm64::UnalignedHandlerType::HalfBarrier;\n    } else {\n      UnalignedHandlerType = FEXCore::ArchHelpers::Arm64::UnalignedHandlerType::NonAtomic;\n    }\n\n    if (TSOEnabled()) {\n      BOOL Enable = TRUE;\n      NTSTATUS Status = NtSetInformationProcess(NtCurrentProcess(), ProcessFexHardwareTso, &Enable, sizeof(Enable));\n      if (Status == STATUS_SUCCESS) {\n        CTX.SetHardwareTSOSupport(true);\n      }\n    }\n\n    uint64_t Flags = (StrictInProcessSplitLocks() ? FEX_UNALIGN_ATOMIC_STRICT_SPLIT_LOCKS : 0) |\n                     (KernelUnalignedAtomicBackpatching() ? FEX_UNALIGN_ATOMIC_BACKPATCH : 0) | FEX_UNALIGN_ATOMIC_EMULATE;\n\n    if (NtSetInformationProcess(NtCurrentProcess(), ProcessFexUnalignAtomic, &Flags, sizeof(Flags)) == STATUS_SUCCESS) {\n      LogMan::Msg::IFmt(\"FEX: Kernel unaligned atomics enabled!\");\n    }\n  }\n\n  FEXCore::ArchHelpers::Arm64::UnalignedHandlerType GetUnalignedHandlerType() const {\n    return UnalignedHandlerType;\n  }\n\nprivate:\n  FEX_CONFIG_OPT(TSOEnabled, TSOENABLED);\n  FEX_CONFIG_OPT(HalfBarrierTSOEnabled, HALFBARRIERTSOENABLED);\n  FEX_CONFIG_OPT(StrictInProcessSplitLocks, STRICTINPROCESSSPLITLOCKS);\n  FEX_CONFIG_OPT(KernelUnalignedAtomicBackpatching, KERNELUNALIGNEDATOMICBACKPATCHING);\n\n  FEXCore::ArchHelpers::Arm64::UnalignedHandlerType UnalignedHandlerType {FEXCore::ArchHelpers::Arm64::UnalignedHandlerType::HalfBarrier};\n};\n} // namespace FEX::Windows\n"
  },
  {
    "path": "Source/Windows/Common/WinAPI/Alloc.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#define NTDDI_VERSION 0x0A000005\n#define WINAPI\n#define WINBASEAPI\n\n#include <cstdlib>\n#include <cstdio>\n#include <cstdint>\n#include <cerrno>\n#include <winternl.h>\n#include <windows.h>\n#include <processenv.h>\n#include \"../Priv.h\"\n\n#ifndef _M_ARM64EC\nnamespace {\nSYSTEM_BASIC_INFORMATION BasicInfo;\n\nvoid InitBasicInfo() {\n  NtQuerySystemInformation(SystemEmulationBasicInformation, &BasicInfo, sizeof(BasicInfo), nullptr);\n}\n\n__attribute__((used, section(\".CRT$FEXH\"))) void (*_InitBasicInfo)(void) = InitBasicInfo;\n\nMEM_ADDRESS_REQUIREMENTS MakeWOW64AddressReqs() {\n  MEM_ADDRESS_REQUIREMENTS Reqs {};\n  Reqs.LowestStartingAddress = reinterpret_cast<void*>(BasicInfo.HighestUserAddress & ~(BasicInfo.AllocationGranularity - 1));\n  return Reqs;\n}\n} // namespace\n#endif\n\nDLLEXPORT_FUNC(void*, VirtualAlloc, (void* lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect)) {\n  NTSTATUS Status;\n#ifndef _M_ARM64EC\n  if (!lpAddress) {\n    // Add address requirements for WOW64 to limit allocations to outside the 32-bit user address space\n    MEM_EXTENDED_PARAMETER ExtParam {};\n    MEM_ADDRESS_REQUIREMENTS AddrReq = MakeWOW64AddressReqs();\n\n    ExtParam.Type = MemExtendedParameterAddressRequirements;\n    ExtParam.Pointer = &AddrReq;\n\n    Status = NtAllocateVirtualMemoryEx(NtCurrentProcess(), &lpAddress, &dwSize, flAllocationType, flProtect, &ExtParam, 1);\n  } else {\n#endif\n    Status = NtAllocateVirtualMemory(NtCurrentProcess(), &lpAddress, 0, &dwSize, flAllocationType, flProtect);\n#ifndef _M_ARM64EC\n  }\n#endif\n  if (Status) {\n    SetLastError(RtlNtStatusToDosError(Status));\n    return nullptr;\n  }\n  return lpAddress;\n}\n\nDLLEXPORT_FUNC(SIZE_T, VirtualQuery, (LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, SIZE_T dwLength)) {\n  SIZE_T WrittenSize;\n  NTSTATUS Status =\n    NtQueryVirtualMemory(NtCurrentProcess(), lpAddress, MemoryBasicInformation, reinterpret_cast<void*>(lpBuffer), dwLength, &WrittenSize);\n  if (Status) {\n    SetLastError(RtlNtStatusToDosError(Status));\n    return 0;\n  }\n  return WrittenSize;\n}\n\nDLLEXPORT_FUNC(WINBOOL, VirtualProtect, (void* lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect)) {\n  return WinAPIReturn(NtProtectVirtualMemory(NtCurrentProcess(), &lpAddress, &dwSize, flNewProtect, lpflOldProtect));\n}\n\nDLLEXPORT_FUNC(void*, VirtualAlloc2,\n               (HANDLE Process, void* BaseAddress, SIZE_T Size, ULONG AllocationType, ULONG PageProtection,\n                MEM_EXTENDED_PARAMETER* ExtendedParameters, ULONG ParameterCount)) {\n  NTSTATUS Status;\n#ifndef _M_ARM64EC\n  if (!BaseAddress) {\n    // Add address requirements for WOW64 to limit allocations to outside the 32-bit user address space\n    auto* NewExtParams = reinterpret_cast<MEM_EXTENDED_PARAMETER*>(alloca((ParameterCount + 1) * sizeof(MEM_EXTENDED_PARAMETER)));\n    if (ExtendedParameters && ParameterCount > 0) {\n      memcpy(NewExtParams, ExtendedParameters, ParameterCount * sizeof(MEM_EXTENDED_PARAMETER));\n    }\n\n    MEM_ADDRESS_REQUIREMENTS AddrReq = MakeWOW64AddressReqs();\n\n    NewExtParams[ParameterCount].Type = MemExtendedParameterAddressRequirements;\n    NewExtParams[ParameterCount].Pointer = &AddrReq;\n\n    Status = NtAllocateVirtualMemoryEx(Process ? Process : NtCurrentProcess(), &BaseAddress, &Size, AllocationType, PageProtection,\n                                       NewExtParams, ParameterCount + 1);\n  } else {\n#endif\n    Status = NtAllocateVirtualMemoryEx(Process ? Process : NtCurrentProcess(), &BaseAddress, &Size, AllocationType, PageProtection,\n                                       ExtendedParameters, ParameterCount);\n#ifndef _M_ARM64EC\n  }\n#endif\n  if (Status) {\n    SetLastError(RtlNtStatusToDosError(Status));\n    return nullptr;\n  }\n  return BaseAddress;\n}\n\nDLLEXPORT_FUNC(WINBOOL, VirtualFree, (void* lpAddress, SIZE_T dwSize, DWORD dwFreeType)) {\n  return WinAPIReturn(NtFreeVirtualMemory(NtCurrentProcess(), &lpAddress, &dwSize, dwFreeType));\n}\n\nDLLEXPORT_FUNC(WINBOOL, FlushInstructionCache, (HANDLE hProcess, const void* lpBaseAddress, SIZE_T dwSize)) {\n  return WinAPIReturn(NtFlushInstructionCache(hProcess, const_cast<void*>(lpBaseAddress), dwSize));\n}\n\nDLLEXPORT_FUNC(DWORD, FlsAlloc, (PFLS_CALLBACK_FUNCTION lpCallback)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(void*, FlsGetValue, (DWORD dwFlsIndex)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, FlsSetValue, (DWORD dwFlsIndex, void* lpFlsData)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, FlsFree, (DWORD dwFlsIndex)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(HLOCAL, LocalFree, (HLOCAL hMem)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(DWORD, TlsAlloc, ()) {\n  RtlAcquirePebLock();\n\n  // Cannot use expansion slots or FLS here, as they would be freed before FEX can cleanup.\n  DWORD Slot = RtlFindClearBitsAndSet(GetCurrentPEB()->TlsBitmap, 1, 1);\n  if (Slot != -1) {\n    GetCurrentTEB()->TlsSlots[Slot] = nullptr;\n  }\n  RtlReleasePebLock();\n  return Slot;\n}\n\nDLLEXPORT_FUNC(void*, TlsGetValue, (DWORD dwTlsIndex)) {\n  return GetCurrentTEB()->TlsSlots[dwTlsIndex];\n}\n\nDLLEXPORT_FUNC(WINBOOL, TlsSetValue, (DWORD dwTlsIndex, void* lpTlsValue)) {\n  GetCurrentTEB()->TlsSlots[dwTlsIndex] = lpTlsValue;\n  return true;\n}\n\nDLLEXPORT_FUNC(WINBOOL, TlsFree, (DWORD dwTlsIndex)) {\n  RtlAcquirePebLock();\n\n  RtlClearBits(GetCurrentPEB()->TlsBitmap, dwTlsIndex, 1);\n  NTSTATUS Status = NtSetInformationThread(NtCurrentThread(), ThreadZeroTlsCell, &dwTlsIndex, sizeof(dwTlsIndex));\n  RtlReleasePebLock();\n  return WinAPIReturn(Status);\n}\n"
  },
  {
    "path": "Source/Windows/Common/WinAPI/CMakeLists.txt",
    "content": "target_sources(CommonWindowsRuntime PRIVATE Alloc.cpp Sync.cpp IO.cpp Misc.cpp)\n"
  },
  {
    "path": "Source/Windows/Common/WinAPI/IO.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#define NTDDI_VERSION 0x0A000005\n#define WINAPI\n#define WINBASEAPI\n\n#include <cstdlib>\n#include <cstdio>\n#include <cstdint>\n#include <cerrno>\n#include <winternl.h>\n#include <windows.h>\n#include <processenv.h>\n#include <wine/debug.h>\n#include \"../Priv.h\"\n\nnamespace {\nULONG CreateDispositionToNT(DWORD Disposition) {\n  switch (Disposition) {\n  case CREATE_ALWAYS: return FILE_OVERWRITE_IF;\n  case CREATE_NEW: return FILE_CREATE;\n  case TRUNCATE_EXISTING: return FILE_OVERWRITE;\n  case OPEN_ALWAYS: return FILE_OPEN_IF;\n  case OPEN_EXISTING: return FILE_OPEN;\n  default: UNIMPLEMENTED();\n  }\n}\n\nULONG OpenFlagsToNT(DWORD Flags) {\n  ULONG NTFlags = 0;\n  NTFlags |= (Flags & FILE_FLAG_BACKUP_SEMANTICS) ? FILE_OPEN_FOR_BACKUP_INTENT : 0;\n  NTFlags |= (Flags & FILE_FLAG_DELETE_ON_CLOSE) ? FILE_DELETE_ON_CLOSE : 0;\n  NTFlags |= (Flags & FILE_FLAG_NO_BUFFERING) ? FILE_NO_INTERMEDIATE_BUFFERING : 0;\n  NTFlags |= (Flags & FILE_FLAG_RANDOM_ACCESS) ? FILE_RANDOM_ACCESS : 0;\n  NTFlags |= (Flags & FILE_FLAG_SEQUENTIAL_SCAN) ? FILE_SEQUENTIAL_ONLY : 0;\n  NTFlags |= (Flags & FILE_FLAG_WRITE_THROUGH) ? FILE_WRITE_THROUGH : 0;\n  return NTFlags;\n}\n\nFILE_INFORMATION_CLASS FileInfoClassToNT(FILE_INFO_BY_HANDLE_CLASS InformationClass) {\n  switch (InformationClass) {\n  case FileBasicInfo: return FileBasicInformation;\n  case FileStandardInfo: return FileStandardInformation;\n  default: UNIMPLEMENTED();\n  }\n}\n} // namespace\n\nDLLEXPORT_FUNC(BOOL, DeleteFileA, (LPCSTR lpFileName)) {\n  ScopedUnicodeString FileName {lpFileName};\n  return DeleteFileW(FileName->Buffer);\n}\n\nDLLEXPORT_FUNC(BOOL, DeleteFileW, (LPCWSTR lpFileName)) {\n  UNICODE_STRING PathW;\n  RtlInitUnicodeString(&PathW, lpFileName);\n\n  ScopedUnicodeString NTPath;\n  if (!RtlDosPathNameToNtPathName_U(PathW.Buffer, &*NTPath, nullptr, nullptr)) {\n    SetLastError(ERROR_PATH_NOT_FOUND);\n    return false;\n  }\n\n  OBJECT_ATTRIBUTES ObjAttributes;\n  InitializeObjectAttributes(&ObjAttributes, &*NTPath, OBJ_CASE_INSENSITIVE, nullptr, nullptr);\n\n  HANDLE Handle;\n  IO_STATUS_BLOCK IOSB;\n\n  NTSTATUS Status =\n    NtCreateFile(&Handle, SYNCHRONIZE | DELETE, &ObjAttributes, &IOSB, nullptr, 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,\n                 FILE_OPEN, FILE_DELETE_ON_CLOSE | FILE_NON_DIRECTORY_FILE, nullptr, 0);\n  if (WinAPIReturn(Status)) {\n    Status = NtClose(Handle);\n  }\n\n  return WinAPIReturn(Status);\n}\n\nDLLEXPORT_FUNC(HANDLE, CreateFileA,\n               (LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes,\n                DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)) {\n\n  ScopedUnicodeString FileName {lpFileName};\n  return CreateFileW(FileName->Buffer, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes,\n                     hTemplateFile);\n}\n\nDLLEXPORT_FUNC(HANDLE, CreateFileW,\n               (LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes,\n                DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)) {\n  UNICODE_STRING PathW;\n  RtlInitUnicodeString(&PathW, lpFileName);\n\n  ScopedUnicodeString NTPath;\n  if (!RtlDosPathNameToNtPathName_U(PathW.Buffer, &*NTPath, nullptr, nullptr)) {\n    SetLastError(ERROR_PATH_NOT_FOUND);\n    return INVALID_HANDLE_VALUE;\n  }\n\n  OBJECT_ATTRIBUTES ObjAttributes;\n  InitializeObjectAttributes(&ObjAttributes, &*NTPath, OBJ_CASE_INSENSITIVE, nullptr, nullptr);\n\n  HANDLE Handle;\n  IO_STATUS_BLOCK IOSB;\n  NTSTATUS Status =\n    NtCreateFile(&Handle, dwDesiredAccess | GENERIC_READ | SYNCHRONIZE, &ObjAttributes, &IOSB, nullptr, OpenFlagsToNT(dwFlagsAndAttributes),\n                 dwShareMode, CreateDispositionToNT(dwCreationDisposition), FILE_SYNCHRONOUS_IO_NONALERT, nullptr, 0);\n  return WinAPIReturn(Status) ? Handle : INVALID_HANDLE_VALUE;\n}\n\nDLLEXPORT_FUNC(WINBOOL, WriteFile,\n               (HANDLE hFile, const void* lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped)) {\n  IO_STATUS_BLOCK IOSB;\n  if (lpOverlapped) {\n    UNIMPLEMENTED();\n  }\n  NTSTATUS Status = NtWriteFile(hFile, nullptr, nullptr, nullptr, &IOSB, lpBuffer, nNumberOfBytesToWrite, nullptr, nullptr);\n  if (lpNumberOfBytesWritten) {\n    *lpNumberOfBytesWritten = static_cast<DWORD>(IOSB.Information);\n  }\n  return WinAPIReturn(Status);\n}\n\nDLLEXPORT_FUNC(HANDLE, GetStdHandle, (DWORD nStdHandle)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, WriteConsoleA,\n               (HANDLE hConsoleOutput, CONST void* lpBuffer, DWORD nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten, void* lpReserved)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, WriteConsoleW,\n               (HANDLE hConsoleOutput, CONST void* lpBuffer, DWORD nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten, void* lpReserved)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, SetFilePointerEx, (HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod)) {\n  IO_STATUS_BLOCK IOSB;\n  FILE_POSITION_INFORMATION PositionInfo;\n  if (NTSTATUS Status = NtQueryInformationFile(hFile, &IOSB, &PositionInfo, sizeof(PositionInfo), FilePositionInformation); Status) {\n    return WinAPIReturn(Status);\n  }\n  FILE_STANDARD_INFORMATION StandardInfo;\n  if (NTSTATUS Status = NtQueryInformationFile(hFile, &IOSB, &StandardInfo, sizeof(StandardInfo), FileStandardInformation); Status) {\n    return WinAPIReturn(Status);\n  }\n\n  switch (dwMoveMethod) {\n  case FILE_BEGIN: PositionInfo.CurrentByteOffset = liDistanceToMove; break;\n  case FILE_CURRENT: PositionInfo.CurrentByteOffset.QuadPart += liDistanceToMove.QuadPart; break;\n  case FILE_END: PositionInfo.CurrentByteOffset = StandardInfo.EndOfFile; break;\n  default: UNIMPLEMENTED();\n  }\n  if (NTSTATUS Status = NtSetInformationFile(hFile, &IOSB, &PositionInfo, sizeof(PositionInfo), FilePositionInformation); Status) {\n    return WinAPIReturn(Status);\n  }\n  if (lpNewFilePointer) {\n    *lpNewFilePointer = PositionInfo.CurrentByteOffset;\n  }\n  return true;\n}\n\nDLLEXPORT_FUNC(WINBOOL, ReadFile,\n               (HANDLE hFile, void* lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)) {\n  IO_STATUS_BLOCK IOSB;\n  if (lpOverlapped) {\n    UNIMPLEMENTED();\n  }\n  NTSTATUS Status = NtReadFile(hFile, nullptr, nullptr, nullptr, &IOSB, lpBuffer, nNumberOfBytesToRead, nullptr, nullptr);\n  if (lpNumberOfBytesRead) {\n    *lpNumberOfBytesRead = static_cast<DWORD>(IOSB.Information);\n  }\n  return WinAPIReturn(Status);\n}\n\nDLLEXPORT_FUNC(WINBOOL, FlushFileBuffers, (HANDLE hFile)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(DWORD, GetFinalPathNameByHandleA, (HANDLE hFile, LPSTR lpszFilePath, DWORD cchFilePath, DWORD dwFlags)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(DWORD, GetFinalPathNameByHandleW, (HANDLE hFile, LPWSTR lpszFilePath, DWORD cchFilePath, DWORD dwFlags)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, CreateHardLinkA, (LPCSTR lpFileName, LPCSTR lpExistingFileName, LPSECURITY_ATTRIBUTES lpSecurityAttributes)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, CreateHardLinkW, (LPCWSTR lpFileName, LPCWSTR lpExistingFileName, LPSECURITY_ATTRIBUTES lpSecurityAttributes)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, CreateDirectoryA, (LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, CreateDirectoryW, (LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes)) {\n  UNICODE_STRING PathW;\n  RtlInitUnicodeString(&PathW, lpPathName);\n\n  ScopedUnicodeString NTPath;\n  if (!RtlDosPathNameToNtPathName_U(PathW.Buffer, &*NTPath, nullptr, nullptr)) {\n    SetLastError(ERROR_PATH_NOT_FOUND);\n    return false;\n  }\n\n  OBJECT_ATTRIBUTES ObjAttributes;\n  InitializeObjectAttributes(&ObjAttributes, &*NTPath, OBJ_CASE_INSENSITIVE, nullptr, nullptr);\n\n  HANDLE Handle;\n  IO_STATUS_BLOCK IOSB;\n  NTSTATUS Status = NtCreateFile(&Handle, GENERIC_READ | SYNCHRONIZE, &ObjAttributes, &IOSB, nullptr, FILE_ATTRIBUTE_NORMAL,\n                                 FILE_SHARE_READ, FILE_CREATE, FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, nullptr, 0);\n  return WinAPIReturn(Status);\n}\n\nDLLEXPORT_FUNC(WINBOOL, GetFileInformationByHandle, (HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation)) {\n  FILE_BASIC_INFO BasicInfo;\n  if (!GetFileInformationByHandleEx(hFile, FileBasicInfo, &BasicInfo, sizeof(BasicInfo))) {\n    return false;\n  }\n  FILE_STANDARD_INFO StandardInfo;\n  if (!GetFileInformationByHandleEx(hFile, FileStandardInfo, &StandardInfo, sizeof(StandardInfo))) {\n    return false;\n  }\n\n  *lpFileInformation = BY_HANDLE_FILE_INFORMATION {\n    .dwFileAttributes = BasicInfo.FileAttributes,\n    .ftCreationTime = {static_cast<DWORD>(BasicInfo.CreationTime.LowPart), static_cast<DWORD>(BasicInfo.CreationTime.HighPart)},\n    .ftLastAccessTime = {static_cast<DWORD>(BasicInfo.LastAccessTime.LowPart), static_cast<DWORD>(BasicInfo.LastAccessTime.HighPart)},\n    .ftLastWriteTime = {static_cast<DWORD>(BasicInfo.LastWriteTime.LowPart), static_cast<DWORD>(BasicInfo.LastWriteTime.HighPart)},\n    .dwVolumeSerialNumber = 0,\n    .nFileSizeHigh = static_cast<DWORD>(StandardInfo.EndOfFile.HighPart),\n    .nFileSizeLow = static_cast<DWORD>(StandardInfo.EndOfFile.LowPart),\n    .nNumberOfLinks = StandardInfo.NumberOfLinks,\n    .nFileIndexHigh = 0,\n    .nFileIndexLow = 0};\n  return true;\n}\n\nDLLEXPORT_FUNC(WINBOOL, SetFileInformationByHandle,\n               (HANDLE hFile, FILE_INFO_BY_HANDLE_CLASS FileInformationClass, void* lpFileInformation, DWORD dwBufferSize)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, SetEndOfFile, (HANDLE hFile)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(DWORD, GetFileAttributesA, (LPCSTR lpFileName)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(DWORD, GetFileAttributesW, (LPCWSTR lpFileName)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, SetFileAttributesA, (LPCSTR lpFileName, DWORD dwFileAttributes)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, SetFileAttributesW, (LPCWSTR lpFileName, DWORD dwFileAttributes)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, SetFileTime,\n               (HANDLE hFile, CONST FILETIME* lpCreationTime, CONST FILETIME* lpLastAccessTime, CONST FILETIME* lpLastWriteTime)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, MoveFileExA, (LPCSTR lpExistingFileName, LPCSTR lpNewFileName, DWORD dwFlags)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, MoveFileExW, (LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName, DWORD dwFlags)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, GetDiskFreeSpaceExA,\n               (LPCSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailableToCaller, PULARGE_INTEGER lpTotalNumberOfBytes,\n                PULARGE_INTEGER lpTotalNumberOfFreeBytes)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, GetDiskFreeSpaceExW,\n               (LPCWSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailableToCaller, PULARGE_INTEGER lpTotalNumberOfBytes,\n                PULARGE_INTEGER lpTotalNumberOfFreeBytes)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(DWORD, GetTempPathA, (DWORD nBufferLength, LPSTR lpBuffer)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(DWORD, GetTempPathW, (DWORD nBufferLength, LPWSTR lpBuffer)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(BOOLEAN, CreateSymbolicLinkA, (LPCSTR lpSymlinkFileName, LPCSTR lpTargetFileName, DWORD dwFlags)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(BOOLEAN, CreateSymbolicLinkW, (LPCWSTR lpSymlinkFileName, LPCWSTR lpTargetFileName, DWORD dwFlags)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, AreFileApisANSI, ()) {\n  return true;\n}\n\nDLLEXPORT_FUNC(WINBOOL, FindNextFileA, (HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, FindNextFileW, (HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, FindClose, (HANDLE hFindFile)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(HANDLE, FindFirstFileA, (LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(HANDLE, FindFirstFileW, (LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, DeviceIoControl,\n               (HANDLE hDevice, DWORD dwIoControlCode, void* lpInBuffer, DWORD nInBufferSize, void* lpOutBuffer, DWORD nOutBufferSize,\n                LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, GetFileInformationByHandleEx,\n               (HANDLE hFile, FILE_INFO_BY_HANDLE_CLASS FileInformationClass, void* lpFileInformation, DWORD dwBufferSize)) {\n  IO_STATUS_BLOCK IOSB;\n  return WinAPIReturn(NtQueryInformationFile(hFile, &IOSB, lpFileInformation, dwBufferSize, FileInfoClassToNT(FileInformationClass)));\n}\n\nDLLEXPORT_FUNC(void, GetSystemTimeAsFileTime, (LPFILETIME lpSystemTimeAsFileTime)) {\n  LARGE_INTEGER Time;\n  NtQuerySystemTime(&Time);\n  lpSystemTimeAsFileTime->dwLowDateTime = Time.LowPart;\n  lpSystemTimeAsFileTime->dwHighDateTime = Time.HighPart;\n}\n\nDLLEXPORT_FUNC(void, GetSystemTimePreciseAsFileTime, (LPFILETIME lpSystemTimeAsFileTime)) {\n  GetSystemTimeAsFileTime(lpSystemTimeAsFileTime);\n}\n\nDLLEXPORT_FUNC(WINBOOL, SetCurrentDirectoryA, (LPCSTR lpPathName)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, SetCurrentDirectoryW, (LPCWSTR lpPathName)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(DWORD, GetCurrentDirectoryA, (DWORD nBufferLength, LPSTR lpBuffer)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(DWORD, GetCurrentDirectoryW, (DWORD nBufferLength, LPWSTR lpBuffer)) {\n  return RtlGetCurrentDirectory_U(nBufferLength * sizeof(wchar_t), lpBuffer) / sizeof(wchar_t);\n}\n"
  },
  {
    "path": "Source/Windows/Common/WinAPI/Misc.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#define NTDDI_VERSION 0x0A000005\n#define WINAPI\n#define WINBASEAPI\n\n#include <cstdlib>\n#include <cstdio>\n#include <cstdint>\n#include <cerrno>\n#include <winternl.h>\n#include <windows.h>\n#include <processenv.h>\n#include \"../Priv.h\"\n\nDLLEXPORT_FUNC(HMODULE, GetModuleHandleA, (LPCSTR lpModuleName)) {\n  ScopedUnicodeString ModuleName {lpModuleName};\n  return GetModuleHandleW(ModuleName->Buffer);\n}\n\nDLLEXPORT_FUNC(HMODULE, GetModuleHandleW, (LPCWSTR lpModuleName)) {\n  HMODULE Res = nullptr;\n  UNICODE_STRING ModuleName = InitUnicodeString(lpModuleName);\n\n  NTSTATUS Status = LdrGetDllHandle(nullptr, 0, &ModuleName, &Res);\n  if (Status) {\n    SetLastError(RtlNtStatusToDosError(Status));\n    return nullptr;\n  }\n  return Res;\n}\n\nDLLEXPORT_FUNC(FARPROC, GetProcAddress, (HMODULE hModule, LPCSTR lpProcName)) {\n  void* Res = nullptr;\n  STRING ProcName = InitAnsiString(lpProcName);\n  NTSTATUS Status = LdrGetProcedureAddress(hModule, &ProcName, 0, &Res);\n  if (Status) {\n    SetLastError(RtlNtStatusToDosError(Status));\n    return nullptr;\n  }\n  return reinterpret_cast<FARPROC>(Res);\n}\n\nDLLEXPORT_FUNC(void, RaiseException, (DWORD dwExceptionCode, DWORD dwExceptionFlags, DWORD nNumberOfArguments, CONST ULONG_PTR* lpArguments)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(WINBOOL, CloseHandle, (HANDLE hObject)) {\n  return WinAPIReturn(NtClose(hObject));\n}\n\nDLLEXPORT_FUNC(WINBOOL, QueryPerformanceCounter, (LARGE_INTEGER * lpPerformanceCount)) {\n  return RtlQueryPerformanceCounter(lpPerformanceCount);\n}\n\nDLLEXPORT_FUNC(WINBOOL, QueryPerformanceFrequency, (LARGE_INTEGER * lpFrequency)) {\n  return RtlQueryPerformanceFrequency(lpFrequency);\n}\n\nDLLEXPORT_FUNC(void, GetSystemInfo, (LPSYSTEM_INFO lpSystemInfo)) {\n  SYSTEM_BASIC_INFORMATION Info;\n\n  if (NtQuerySystemInformation(SystemBasicInformation, &Info, sizeof(Info), nullptr)) {\n    return;\n  }\n\n  *lpSystemInfo = SYSTEM_INFO {\n    .wProcessorArchitecture = PROCESSOR_ARCHITECTURE_ARM64,\n    .dwPageSize = Info.PhysicalPageSize,\n    .lpMinimumApplicationAddress = reinterpret_cast<void*>(Info.LowestUserAddress),\n    .lpMaximumApplicationAddress = reinterpret_cast<void*>(Info.HighestUserAddress),\n    .dwActiveProcessorMask = Info.ActiveProcessors,\n    .dwNumberOfProcessors = static_cast<BYTE>(Info.NumberOfProcessors),\n    .dwProcessorType = 0,\n    .dwAllocationGranularity = Info.AllocationGranularity,\n    .wProcessorLevel = 0,\n    .wProcessorRevision = 0,\n  };\n}\n\nDLLEXPORT_FUNC(int, MultiByteToWideChar,\n               (UINT CodePage, DWORD dwFlags, LPCCH lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar)) {\n  DWORD Size = (cbMultiByte == -1) ? (strlen(lpMultiByteStr) + 1) : cbMultiByte;\n  DWORD Res;\n  if (!cchWideChar) {\n    RtlMultiByteToUnicodeSize(&Res, lpMultiByteStr, Size);\n  } else {\n    RtlMultiByteToUnicodeN(lpWideCharStr, cchWideChar * sizeof(wchar_t), &Res, lpMultiByteStr, Size);\n  }\n  return static_cast<int>(Res / sizeof(wchar_t));\n}\n\nDLLEXPORT_FUNC(int, WideCharToMultiByte,\n               (UINT CodePage, DWORD dwFlags, LPCWCH lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte,\n                LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar)) {\n  DWORD SizeW = ((cchWideChar == -1) ? (wcslen(lpWideCharStr) + 1) : cchWideChar) * sizeof(wchar_t);\n  DWORD Res;\n  if (!cbMultiByte) {\n    RtlUnicodeToMultiByteSize(&Res, const_cast<wchar_t*>(lpWideCharStr), SizeW);\n  } else {\n    RtlUnicodeToMultiByteN(lpMultiByteStr, cbMultiByte, &Res, lpWideCharStr, SizeW);\n  }\n  if (lpUsedDefaultChar) {\n    *lpUsedDefaultChar = false;\n  }\n  return static_cast<int>(Res);\n}\n\nDLLEXPORT_FUNC(DWORD, FormatMessageA,\n               (DWORD dwFlags, const void* lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPSTR lpBuffer, DWORD nSize, va_list* Arguments)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(DWORD, FormatMessageW,\n               (DWORD dwFlags, const void* lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPWSTR lpBuffer, DWORD nSize, va_list* Arguments)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(DWORD, GetLastError, ()) {\n  return GetCurrentTEB()->LastErrorValue;\n}\n\nDLLEXPORT_FUNC(void, SetLastError, (DWORD dwErrCode)) {\n  GetCurrentTEB()->LastErrorValue = dwErrCode;\n}\n\nDLLEXPORT_FUNC(LONG, RegOpenKeyExA, (HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)) {\n  if (hKey != HKEY_LOCAL_MACHINE) {\n    UNIMPLEMENTED();\n  }\n\n  ScopedUnicodeString RootKey {\"\\\\Registry\\\\Machine\"};\n  OBJECT_ATTRIBUTES ObjAttributes;\n  InitializeObjectAttributes(&ObjAttributes, &*RootKey, OBJ_CASE_INSENSITIVE, nullptr, nullptr);\n  HKEY HKLM;\n  NTSTATUS Status = NtOpenKeyEx(reinterpret_cast<HANDLE*>(&HKLM), MAXIMUM_ALLOWED, &ObjAttributes, 0);\n  if (Status) {\n    return RtlNtStatusToDosError(Status);\n  }\n\n  ScopedUnicodeString SubKey {lpSubKey};\n  InitializeObjectAttributes(&ObjAttributes, &*SubKey, OBJ_CASE_INSENSITIVE, reinterpret_cast<HANDLE>(HKLM), nullptr);\n  Status = NtOpenKeyEx(reinterpret_cast<HANDLE*>(phkResult), samDesired, &ObjAttributes, ulOptions);\n  NtClose(HKLM);\n  return RtlNtStatusToDosError(Status);\n}\n\nDLLEXPORT_FUNC(LONG, RegGetValueA, (HKEY hKey, LPCSTR lpSubKey, LPCSTR lpValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)) {\n  if (lpSubKey || dwFlags) {\n    UNIMPLEMENTED();\n  }\n\n  ScopedUnicodeString ValueName {lpValue};\n\n  union {\n    KEY_VALUE_PARTIAL_INFORMATION Info;\n    uint8_t Buf[512];\n  } Data;\n  ULONG OutSize;\n  NTSTATUS Status = NtQueryValueKey(hKey, &*ValueName, KeyValuePartialInformation, &Data.Info, sizeof(Data), &OutSize);\n  if (Status) {\n    return RtlNtStatusToDosError(Status);\n  }\n\n  if (pdwType) {\n    *pdwType = Data.Info.Type;\n  }\n\n  if (pvData) {\n    if (*pcbData < Data.Info.DataLength) {\n      *pcbData = Data.Info.DataLength;\n      return ERROR_MORE_DATA;\n    }\n\n    memcpy(pvData, &Data.Info.Data, Data.Info.DataLength);\n  }\n\n  if (pcbData) {\n    *pcbData = Data.Info.DataLength;\n  }\n\n  return ERROR_SUCCESS;\n}\n\nDLLEXPORT_FUNC(LONG, RegCloseKey, (HKEY hKey)) {\n  return RtlNtStatusToDosError(NtClose(hKey));\n}\n\nDLLEXPORT_FUNC(DWORD, GetActiveProcessorCount, (WORD group)) {\n  UNIMPLEMENTED();\n}\n"
  },
  {
    "path": "Source/Windows/Common/WinAPI/Sync.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#define NTDDI_VERSION 0x0A000005\n#define WINAPI\n#define WINBASEAPI\n\n#include <cstdlib>\n#include <cstdio>\n#include <cstdint>\n#include <cerrno>\n#include <ntstatus.h>\n#include <winternl.h>\n#include <windows.h>\n#include <processenv.h>\n#include \"../Priv.h\"\n\nWINBOOL WaitOnAddress(volatile void* Address, void* CompareAddress, SIZE_T AddressSize, DWORD dwMilliseconds) {\n  LARGE_INTEGER Time;\n  // A negative value indicates a relative time measured in 100ns intervals.\n  Time.QuadPart = static_cast<ULONGLONG>(dwMilliseconds) * -10000;\n  return RtlWaitOnAddress(const_cast<void*>(Address), CompareAddress, AddressSize, dwMilliseconds == INFINITE ? nullptr : &Time) == STATUS_SUCCESS;\n}\n\nvoid WakeByAddressAll(PVOID Address) {\n  RtlWakeAddressAll(Address);\n}\n\nvoid WINAPI WakeByAddressSingle(PVOID Address) {\n  RtlWakeAddressSingle(Address);\n}\n\nDLLEXPORT_FUNC(void, InitializeSRWLock, (PSRWLOCK SRWLock)) {\n  RtlInitializeSRWLock(SRWLock);\n}\n\nvoid AcquireSRWLockExclusive(PSRWLOCK SRWLock) {\n  RtlAcquireSRWLockExclusive(SRWLock);\n}\n\nvoid ReleaseSRWLockExclusive(PSRWLOCK SRWLock) {\n  RtlReleaseSRWLockExclusive(SRWLock);\n}\n\nvoid AcquireSRWLockShared(PSRWLOCK SRWLock) {\n  RtlAcquireSRWLockShared(SRWLock);\n}\n\nvoid ReleaseSRWLockShared(PSRWLOCK SRWLock) {\n  RtlReleaseSRWLockShared(SRWLock);\n}\n\nDLLEXPORT_FUNC(BOOLEAN, TryAcquireSRWLockShared, (PSRWLOCK SRWLock)) {\n  return RtlTryAcquireSRWLockShared(SRWLock);\n}\n\nDLLEXPORT_FUNC(BOOLEAN, TryAcquireSRWLockExclusive, (PSRWLOCK SRWLock)) {\n  return RtlTryAcquireSRWLockExclusive(SRWLock);\n}\n\nDLLEXPORT_FUNC(void, InitializeCriticalSection, (LPCRITICAL_SECTION lpCriticalSection)) {\n  RtlInitializeCriticalSection(lpCriticalSection);\n}\n\nDLLEXPORT_FUNC(void, EnterCriticalSection, (LPCRITICAL_SECTION lpCriticalSection)) {\n  RtlEnterCriticalSection(lpCriticalSection);\n}\n\nDLLEXPORT_FUNC(void, LeaveCriticalSection, (LPCRITICAL_SECTION lpCriticalSection)) {\n  RtlLeaveCriticalSection(lpCriticalSection);\n}\n\nDLLEXPORT_FUNC(WINBOOL, TryEnterCriticalSection, (LPCRITICAL_SECTION lpCriticalSection)) {\n  return RtlTryEnterCriticalSection(lpCriticalSection);\n}\n\nDLLEXPORT_FUNC(void, DeleteCriticalSection, (LPCRITICAL_SECTION lpCriticalSection)) {\n  RtlDeleteCriticalSection(lpCriticalSection);\n}\n\nDLLEXPORT_FUNC(void, InitializeConditionVariable, (PCONDITION_VARIABLE ConditionVariable)) {\n  RtlInitializeConditionVariable(ConditionVariable);\n}\n\nDLLEXPORT_FUNC(void, WakeConditionVariable, (PCONDITION_VARIABLE ConditionVariable)) {\n  RtlWakeConditionVariable(ConditionVariable);\n}\n\nDLLEXPORT_FUNC(void, WakeAllConditionVariable, (PCONDITION_VARIABLE ConditionVariable)) {\n  RtlWakeAllConditionVariable(ConditionVariable);\n}\n\nDLLEXPORT_FUNC(WINBOOL, SleepConditionVariableSRW, (PCONDITION_VARIABLE ConditionVariable, PSRWLOCK SRWLock, DWORD dwMilliseconds, ULONG Flags)) {\n  LARGE_INTEGER Time;\n  // A negative value indicates a relative time measured in 100ns intervals.\n  Time.QuadPart = static_cast<ULONGLONG>(dwMilliseconds) * -10000;\n  return RtlSleepConditionVariableSRW(ConditionVariable, SRWLock, dwMilliseconds == INFINITE ? nullptr : &Time, Flags);\n}\n\nDLLEXPORT_FUNC(WINBOOL, InitOnceExecuteOnce, (PINIT_ONCE InitOnce, PINIT_ONCE_FN InitFn, void* Parameter, void** Context)) {\n  return !RtlRunOnceExecuteOnce(InitOnce, reinterpret_cast<PRTL_RUN_ONCE_INIT_FN>(InitFn), Parameter, Context);\n}\n\nDLLEXPORT_FUNC(DWORD, WaitForSingleObjectEx, (HANDLE hHandle, DWORD dwMilliseconds, WINBOOL bAlertable)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(HANDLE, GetProcessHeap, ()) {\n  return GetCurrentPEB()->ProcessHeap;\n}\n\nDLLEXPORT_FUNC(DWORD, GetCurrentProcessId, ()) {\n  return static_cast<DWORD>(reinterpret_cast<uintptr_t>(GetCurrentTEB()->ClientId.UniqueProcess));\n}\n\nDLLEXPORT_FUNC(DWORD, GetCurrentThreadId, ()) {\n  return static_cast<DWORD>(reinterpret_cast<uintptr_t>(GetCurrentTEB()->ClientId.UniqueThread));\n}\n\nDLLEXPORT_FUNC(DWORD, GetThreadId, (HANDLE Thread)) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(HANDLE, GetCurrentProcess, ()) {\n  return NtCurrentProcess();\n}\n\nDLLEXPORT_FUNC(HANDLE, GetCurrentThread, ()) {\n  return NtCurrentThread();\n}\n\nDLLEXPORT_FUNC(DWORD, GetCurrentProcessorNumber, ()) {\n  return NtGetCurrentProcessorNumber();\n}\n\nDLLEXPORT_FUNC(WINBOOL, SwitchToThread, ()) {\n  UNIMPLEMENTED();\n}\n\nDLLEXPORT_FUNC(void, Sleep, (DWORD dwMilliseconds)) {\n  LARGE_INTEGER Time;\n  // A negative value indicates a relative time measured in 100ns intervals.\n  Time.QuadPart = static_cast<ULONGLONG>(dwMilliseconds) * -10000;\n  NtDelayExecution(false, &Time);\n}\n"
  },
  {
    "path": "Source/Windows/Defs/ntdll.def",
    "content": "; generated from wine/dlls/ntdll/ntdll.spec with ordinals removed and RtlIsEcCode added\n\nLIBRARY ntdll.dll\n\nEXPORTS\n  A_SHAFinal\n  A_SHAInit\n  A_SHAUpdate\n  ApiSetQueryApiSetPresence\n  ApiSetQueryApiSetPresenceEx\n  CsrAllocateCaptureBuffer PRIVATE\n  CsrAllocateCapturePointer PRIVATE\n  CsrAllocateMessagePointer PRIVATE\n  CsrCaptureMessageBuffer PRIVATE\n  CsrCaptureMessageString PRIVATE\n  CsrCaptureTimeout PRIVATE\n  CsrClientCallServer PRIVATE\n  CsrClientConnectToServer PRIVATE\n  CsrClientMaxMessage PRIVATE\n  CsrClientSendMessage PRIVATE\n  CsrClientThreadConnect PRIVATE\n  CsrFreeCaptureBuffer PRIVATE\n  CsrIdentifyAlertableThread PRIVATE\n  CsrNewThread PRIVATE\n  CsrProbeForRead PRIVATE\n  CsrProbeForWrite PRIVATE\n  CsrSetPriorityClass PRIVATE\n  CsrpProcessCallbackRequest PRIVATE\n  DbgBreakPoint\n  DbgPrint\n  DbgPrintEx\n  DbgPrompt PRIVATE\n  DbgUiConnectToDbg\n  DbgUiContinue\n  DbgUiConvertStateChangeStructure\n  DbgUiDebugActiveProcess\n  DbgUiGetThreadDebugObject\n  DbgUiIssueRemoteBreakin\n  DbgUiRemoteBreakin\n  DbgUiSetThreadDebugObject\n  DbgUiStopDebugging\n  DbgUiWaitStateChange\n  DbgUserBreakPoint\n  EtwEventActivityIdControl\n  EtwEventEnabled\n  EtwEventProviderEnabled\n  EtwEventRegister\n  EtwEventSetInformation\n  EtwEventUnregister\n  EtwEventWrite\n  EtwEventWriteString\n  EtwEventWriteTransfer\n  EtwGetTraceEnableFlags\n  EtwGetTraceEnableLevel\n  EtwGetTraceLoggerHandle\n  EtwLogTraceEvent\n  EtwRegisterTraceGuidsA\n  EtwRegisterTraceGuidsW\n  EtwTraceMessage\n  EtwTraceMessageVa\n  EtwUnregisterTraceGuids\n  KiRaiseUserExceptionDispatcher\n  KiUserApcDispatcher\n  KiUserCallbackDispatcher\n  KiUserCallbackDispatcherReturn\n  KiUserExceptionDispatcher\n  LdrAccessResource\n  LdrAddDllDirectory\n  LdrAddRefDll\n  LdrDisableThreadCalloutsForDll\n  LdrEnumResources PRIVATE\n  LdrEnumerateLoadedModules\n  LdrFindEntryForAddress\n  LdrFindResourceDirectory_U\n  LdrFindResource_U\n  LdrFlushAlternateResourceModules PRIVATE\n  LdrGetDllDirectory\n  LdrGetDllFullName\n  LdrGetDllHandle\n  LdrGetDllHandleEx\n  LdrGetDllPath\n  LdrGetProcedureAddress\n  LdrInitShimEngineDynamic PRIVATE\n  LdrInitializeThunk\n  LdrLoadAlternateResourceModule PRIVATE\n  LdrLoadDll\n  LdrLockLoaderLock\n  LdrProcessRelocationBlock\n  LdrQueryImageFileExecutionOptions\n  LdrQueryProcessModuleInformation\n  LdrRegisterDllNotification\n  LdrRemoveDllDirectory\n  LdrResolveDelayLoadedAPI\n  LdrSetAppCompatDllRedirectionCallback PRIVATE\n  LdrSetDefaultDllDirectories\n  LdrSetDllDirectory\n  LdrSetDllManifestProber PRIVATE\n  LdrShutdownProcess\n  LdrShutdownThread\n  LdrSystemDllInitBlock DATA\n  LdrUnloadAlternateResourceModule PRIVATE\n  LdrUnloadDll\n  LdrUnlockLoaderLock\n  LdrUnregisterDllNotification\n  LdrVerifyImageMatchesChecksum PRIVATE\n  MD4Final\n  MD4Init\n  MD4Update\n  MD5Final\n  MD5Init\n  MD5Update\n  NlsAnsiCodePage DATA\n  NlsMbCodePageTag DATA\n  NlsMbOemCodePageTag DATA\n  NtAcceptConnectPort\n  NtAccessCheck\n  NtAccessCheckAndAuditAlarm\n  NtAddAtom\n  NtAdjustGroupsToken\n  NtAdjustPrivilegesToken\n  NtAlertResumeThread\n  NtAlertThread\n  NtAlertThreadByThreadId\n  NtAllocateLocallyUniqueId\n  NtAllocateUuids\n  NtAllocateVirtualMemory\n  NtAllocateVirtualMemoryEx\n  NtAreMappedFilesTheSame\n  NtAssignProcessToJobObject\n  NtCallbackReturn\n  NtCancelIoFile\n  NtCancelIoFileEx\n  NtCancelSynchronousIoFile\n  NtCancelTimer\n  NtClearEvent\n  NtClose\n  NtCommitTransaction\n  NtCompareObjects\n  NtCompleteConnectPort\n  NtConnectPort\n  NtContinue\n  NtCreateDebugObject\n  NtCreateDirectoryObject\n  NtCreateEvent\n  NtCreateFile\n  NtCreateIoCompletion\n  NtCreateJobObject\n  NtCreateKey\n  NtCreateKeyTransacted\n  NtCreateKeyedEvent\n  NtCreateLowBoxToken\n  NtCreateMailslotFile\n  NtCreateMutant\n  NtCreateNamedPipeFile\n  NtCreatePagingFile\n  NtCreatePort\n  NtCreateSection\n  NtCreateSemaphore\n  NtCreateSymbolicLinkObject\n  NtCreateThread\n  NtCreateThreadEx\n  NtCreateTimer\n  NtCreateToken\n  NtCreateTransaction\n  NtCreateUserProcess\n  NtDebugActiveProcess\n  NtDebugContinue\n  NtDelayExecution\n  NtDeleteAtom\n  NtDeleteFile\n  NtDeleteKey\n  NtDeleteValueKey\n  NtDeviceIoControlFile\n  NtDisplayString\n  NtDuplicateObject\n  NtDuplicateToken\n  NtEnumerateKey\n  NtEnumerateValueKey\n  NtFilterToken\n  NtFindAtom\n  NtFlushBuffersFile\n  NtFlushInstructionCache\n  NtFlushKey\n  NtFlushProcessWriteBuffers\n  NtFlushVirtualMemory\n  NtFreeVirtualMemory\n  NtFsControlFile\n  NtGetContextThread\n  NtGetCurrentProcessorNumber\n  NtGetNextThread\n  NtGetNlsSectionPtr\n  NtGetTickCount\n  NtGetWriteWatch\n  NtImpersonateAnonymousToken\n  NtInitializeNlsFiles\n  NtInitiatePowerAction\n  NtIsProcessInJob\n  NtListenPort\n  NtLoadDriver\n  NtLoadKey2\n  NtLoadKey\n  NtLoadKeyEx\n  NtLockFile\n  NtLockVirtualMemory\n  NtMakeTemporaryObject\n  NtMapViewOfSection\n  NtMapViewOfSectionEx\n  NtNotifyChangeDirectoryFile\n  NtNotifyChangeKey\n  NtNotifyChangeMultipleKeys\n  NtOpenDirectoryObject\n  NtOpenEvent\n  NtOpenFile\n  NtOpenIoCompletion\n  NtOpenJobObject\n  NtOpenKey\n  NtOpenKeyEx\n  NtOpenKeyTransacted\n  NtOpenKeyTransactedEx\n  NtOpenKeyedEvent\n  NtOpenMutant\n  NtOpenProcess\n  NtOpenProcessToken\n  NtOpenProcessTokenEx\n  NtOpenSection\n  NtOpenSemaphore\n  NtOpenSymbolicLinkObject\n  NtOpenThread\n  NtOpenThreadToken\n  NtOpenThreadTokenEx\n  NtOpenTimer\n  NtPowerInformation\n  NtPrivilegeCheck\n  NtProtectVirtualMemory\n  NtPulseEvent\n  NtQueryAttributesFile\n  NtQueryDefaultLocale\n  NtQueryDefaultUILanguage\n  NtQueryDirectoryFile\n  NtQueryDirectoryObject\n  NtQueryEaFile\n  NtQueryEvent\n  NtQueryFullAttributesFile\n  NtQueryInformationAtom\n  NtQueryInformationFile\n  NtQueryInformationJobObject\n  NtQueryInformationProcess\n  NtQueryInformationThread\n  NtQueryInformationToken\n  NtQueryInstallUILanguage\n  NtQueryIoCompletion\n  NtQueryKey\n  NtQueryLicenseValue\n  NtQueryMultipleValueKey\n  NtQueryMutant\n  NtQueryObject\n  NtQueryPerformanceCounter\n  NtQuerySection\n  NtQuerySecurityObject\n  NtQuerySemaphore\n  NtQuerySymbolicLinkObject\n  NtQuerySystemEnvironmentValue\n  NtQuerySystemEnvironmentValueEx\n  NtQuerySystemInformation\n  NtQuerySystemInformationEx\n  NtQuerySystemTime\n  NtQueryTimer\n  NtQueryTimerResolution\n  NtQueryValueKey\n  NtQueryVirtualMemory\n  NtQueryVolumeInformationFile\n  NtQueueApcThread\n  NtRaiseException\n  NtRaiseHardError\n  NtReadFile\n  NtReadFileScatter\n  NtReadVirtualMemory\n  NtRegisterThreadTerminatePort\n  NtReleaseKeyedEvent\n  NtReleaseMutant\n  NtReleaseSemaphore\n  NtRemoveIoCompletion\n  NtRemoveIoCompletionEx\n  NtRemoveProcessDebug\n  NtRenameKey\n  NtReplaceKey\n  NtReplyWaitReceivePort\n  NtRequestWaitReplyPort\n  NtResetEvent\n  NtResetWriteWatch\n  NtRestoreKey\n  NtResumeProcess\n  NtResumeThread\n  NtRollbackTransaction\n  NtSaveKey\n  NtSecureConnectPort\n  NtSetContextThread\n  NtSetDebugFilterState\n  NtSetDefaultLocale\n  NtSetDefaultUILanguage\n  NtSetEaFile\n  NtSetEvent\n  NtSetInformationDebugObject\n  NtSetInformationFile\n  NtSetInformationJobObject\n  NtSetInformationKey\n  NtSetInformationObject\n  NtSetInformationProcess\n  NtSetInformationThread\n  NtSetInformationToken\n  NtSetInformationVirtualMemory\n  NtSetIntervalProfile\n  NtSetIoCompletion\n  NtSetLdtEntries\n  NtSetSecurityObject\n  NtSetSystemInformation\n  NtSetSystemTime\n  NtSetThreadExecutionState\n  NtSetTimer\n  NtSetTimerResolution\n  NtSetValueKey\n  NtSetVolumeInformationFile\n  NtShutdownSystem\n  NtSignalAndWaitForSingleObject\n  NtSuspendProcess\n  NtSuspendThread\n  NtSystemDebugControl\n  NtTerminateJobObject\n  NtTerminateProcess\n  NtTerminateThread\n  NtTestAlert\n  NtTraceControl\n  NtUnloadDriver\n  NtUnloadKey\n  NtUnlockFile\n  NtUnlockVirtualMemory\n  NtUnmapViewOfSection\n  NtUnmapViewOfSectionEx\n  NtWaitForAlertByThreadId\n  NtWaitForDebugEvent\n  NtWaitForKeyedEvent\n  NtWaitForMultipleObjects\n  NtWaitForSingleObject\n  NtWriteFile\n  NtWriteFileGather\n  NtWriteVirtualMemory\n  NtYieldExecution\n  PfxFindPrefix PRIVATE\n  PfxInitialize PRIVATE\n  PfxInsertPrefix PRIVATE\n  PfxRemovePrefix PRIVATE\n  ProcessPendingCrossProcessEmulatorWork\n  RtlAbortRXact PRIVATE\n  RtlAbsoluteToSelfRelativeSD\n  RtlAcquirePebLock\n  RtlAcquireResourceExclusive\n  RtlAcquireResourceShared\n  RtlAcquireSRWLockExclusive\n  RtlAcquireSRWLockShared\n  RtlActivateActivationContext\n  RtlActivateActivationContextEx\n  RtlActivateActivationContextUnsafeFast PRIVATE\n  RtlAddAccessAllowedAce\n  RtlAddAccessAllowedAceEx\n  RtlAddAccessAllowedObjectAce\n  RtlAddAccessDeniedAce\n  RtlAddAccessDeniedAceEx\n  RtlAddAccessDeniedObjectAce\n  RtlAddAce\n  RtlAddActionToRXact PRIVATE\n  RtlAddAtomToAtomTable\n  RtlAddAttributeActionToRXact PRIVATE\n  RtlAddAuditAccessAce\n  RtlAddAuditAccessAceEx\n  RtlAddAuditAccessObjectAce\n  RtlAddFunctionTable\n  RtlAddGrowableFunctionTable\n  RtlAddMandatoryAce\n  RtlAddProcessTrustLabelAce\n  RtlAddRefActivationContext\n  RtlAddVectoredContinueHandler\n  RtlAddVectoredExceptionHandler\n  RtlAddressInSectionTable\n  RtlAdjustPrivilege\n  RtlAllocateAndInitializeSid\n  RtlAllocateHandle\n  RtlAllocateHeap\n  RtlAnsiCharToUnicodeChar\n  RtlAnsiStringToUnicodeSize\n  RtlAnsiStringToUnicodeString\n  RtlAppendAsciizToString\n  RtlAppendStringToString\n  RtlAppendUnicodeStringToString\n  RtlAppendUnicodeToString\n  RtlApplyRXact PRIVATE\n  RtlApplyRXactNoFlush PRIVATE\n  RtlAreAllAccessesGranted\n  RtlAreAnyAccessesGranted\n  RtlAreBitsClear\n  RtlAreBitsSet\n  RtlAssert\n  RtlCaptureContext\n  RtlCaptureStackBackTrace\n  RtlCharToInteger\n  RtlCheckRegistryKey\n  RtlClearAllBits\n  RtlClearBits\n  RtlClosePropertySet PRIVATE\n  RtlCompactHeap\n  RtlCompareMemory\n  RtlCompareMemoryUlong\n  RtlCompareString\n  RtlCompareUnicodeString\n  RtlCompareUnicodeStrings\n  RtlCompressBuffer\n  RtlComputeCrc32\n  RtlConsoleMultiByteToUnicodeN PRIVATE\n  RtlConvertExclusiveToShared PRIVATE\n  RtlConvertSharedToExclusive PRIVATE\n  RtlConvertSidToUnicodeString\n  RtlConvertToAutoInheritSecurityObject\n  RtlConvertUiListToApiList PRIVATE\n  RtlCopyContext\n  RtlCopyExtendedContext\n  RtlCopyLuid\n  RtlCopyLuidAndAttributesArray\n  RtlCopyMemory\n  RtlCopySecurityDescriptor\n  RtlCopySid\n  RtlCopySidAndAttributesArray PRIVATE\n  RtlCopyString\n  RtlCopyUnicodeString\n  RtlCreateAcl\n  RtlCreateActivationContext\n  RtlCreateAndSetSD PRIVATE\n  RtlCreateAtomTable\n  RtlCreateEnvironment\n  RtlCreateHeap\n  RtlCreateProcessParameters\n  RtlCreateProcessParametersEx\n  RtlCreatePropertySet PRIVATE\n  RtlCreateQueryDebugBuffer\n  RtlCreateRegistryKey\n  RtlCreateSecurityDescriptor\n  RtlCreateTagHeap PRIVATE\n  RtlCreateTimer\n  RtlCreateTimerQueue\n  RtlCreateUnicodeString\n  RtlCreateUnicodeStringFromAsciiz\n  RtlCreateUserProcess\n  RtlCreateUserSecurityObject PRIVATE\n  RtlCreateUserStack\n  RtlCreateUserThread\n  RtlCustomCPToUnicodeN\n  RtlCutoverTimeToSystemTime PRIVATE\n  RtlDeNormalizeProcessParams\n  RtlDeactivateActivationContext\n  RtlDeactivateActivationContextUnsafeFast PRIVATE\n  RtlDebugPrintTimes PRIVATE\n  RtlDecodePointer\n  RtlDecodeSystemPointer\n  RtlDecompressBuffer\n  RtlDecompressFragment\n  RtlDefaultNpAcl\n  RtlDelete PRIVATE\n  RtlDeleteAce\n  RtlDeleteAtomFromAtomTable\n  RtlDeleteCriticalSection\n  RtlDeleteGrowableFunctionTable\n  RtlDeleteElementGenericTable PRIVATE\n  RtlDeleteElementGenericTableAvl PRIVATE\n  RtlDeleteFunctionTable\n  RtlDeleteNoSplay PRIVATE\n  RtlDeleteOwnersRanges PRIVATE\n  RtlDeleteRange PRIVATE\n  RtlDeleteRegistryValue\n  RtlDeleteResource\n  RtlDeleteSecurityObject\n  RtlDeleteTimer\n  RtlDeleteTimerQueueEx\n  RtlDeregisterWait\n  RtlDeregisterWaitEx\n  RtlDestroyAtomTable\n  RtlDestroyEnvironment\n  RtlDestroyHandleTable\n  RtlDestroyHeap\n  RtlDestroyProcessParameters\n  RtlDestroyQueryDebugBuffer\n  RtlDetermineDosPathNameType_U\n  RtlDllShutdownInProgress\n  RtlDoesFileExists_U\n  RtlDosPathNameToNtPathName_U\n  RtlDosPathNameToNtPathName_U_WithStatus\n  RtlDosPathNameToRelativeNtPathName_U\n  RtlDosPathNameToRelativeNtPathName_U_WithStatus\n  RtlDosSearchPath_U\n  RtlDowncaseUnicodeChar\n  RtlDowncaseUnicodeString\n  RtlDumpResource\n  RtlDuplicateUnicodeString\n  RtlEmptyAtomTable\n  RtlEncodePointer\n  RtlEncodeSystemPointer\n  RtlEnterCriticalSection\n  RtlEnumProcessHeaps PRIVATE\n  RtlEnumerateGenericTable PRIVATE\n  RtlEnumerateGenericTableWithoutSplaying\n  RtlEnumerateProperties PRIVATE\n  RtlEqualComputerName\n  RtlEqualDomainName\n  RtlEqualLuid\n  RtlEqualPrefixSid\n  RtlEqualSid\n  RtlEqualString\n  RtlEqualUnicodeString\n  RtlEraseUnicodeString\n  RtlExitUserProcess\n  RtlExitUserThread\n  RtlExpandEnvironmentStrings\n  RtlExpandEnvironmentStrings_U\n  RtlExtendHeap PRIVATE\n  RtlFillMemory\n  RtlFillMemoryUlong\n  RtlFinalReleaseOutOfProcessMemoryStream PRIVATE\n  RtlFindActivationContextSectionGuid\n  RtlFindActivationContextSectionString\n  RtlFindCharInUnicodeString\n  RtlFindClearBits\n  RtlFindClearBitsAndSet\n  RtlFindClearRuns\n  RtlFindExportedRoutineByName\n  RtlFindLastBackwardRunClear\n  RtlFindLastBackwardRunSet\n  RtlFindLeastSignificantBit\n  RtlFindLongestRunClear\n  RtlFindLongestRunSet\n  RtlFindMessage\n  RtlFindMostSignificantBit\n  RtlFindNextForwardRunClear\n  RtlFindNextForwardRunSet\n  RtlFindRange PRIVATE\n  RtlFindSetBits\n  RtlFindSetBitsAndClear\n  RtlFindSetRuns\n  RtlFirstEntrySList\n  RtlFirstFreeAce\n  RtlFlsAlloc\n  RtlFlsFree\n  RtlFlsGetValue\n  RtlFlsSetValue\n  RtlFlushPropertySet PRIVATE\n  RtlFormatCurrentUserKeyPath\n  RtlFormatMessage\n  RtlFormatMessageEx\n  RtlFreeActivationContextStack\n  RtlFreeAnsiString\n  RtlFreeHandle\n  RtlFreeHeap\n  RtlFreeOemString\n  RtlFreeSid\n  RtlFreeThreadActivationContextStack\n  RtlFreeUnicodeString\n  RtlFreeUserStack\n  RtlGUIDFromString\n  RtlGenerate8dot3Name PRIVATE\n  RtlGetAce\n  RtlGetActiveActivationContext\n  RtlGetCallersAddress\n  RtlGetCompressionWorkSpaceSize\n  RtlGetControlSecurityDescriptor\n  RtlGetCurrentDirectory_U\n  RtlGetCurrentPeb\n  RtlGetCurrentProcessorNumberEx\n  RtlGetCurrentTransaction\n  RtlGetDaclSecurityDescriptor\n  RtlGetElementGenericTable\n  RtlGetEnabledExtendedFeatures\n  RtlGetExePath\n  RtlGetExtendedContextLength\n  RtlGetExtendedContextLength2\n  RtlGetExtendedFeaturesMask\n  RtlGetFrame\n  RtlGetFullPathName_U\n  RtlGetGroupSecurityDescriptor\n  RtlGetLastNtStatus\n  RtlGetLastWin32Error\n  RtlGetLocaleFileMappingAddress\n  RtlGetLongestNtPathLength\n  RtlGetNativeSystemInformation\n  RtlGetNtGlobalFlags\n  RtlGetNtProductType\n  RtlGetNtVersionNumbers\n  RtlGetOwnerSecurityDescriptor\n  RtlGetProductInfo\n  RtlGetProcessHeaps\n  RtlGetProcessPreferredUILanguages\n  RtlGetSaclSecurityDescriptor\n  RtlGetSearchPath\n  RtlGetSystemPreferredUILanguages\n  RtlGetSystemTimePrecise\n  RtlGetThreadErrorMode\n  RtlGetThreadPreferredUILanguages\n  RtlGetUnloadEventTrace\n  RtlGetUnloadEventTraceEx\n  RtlGetUserInfoHeap\n  RtlGetUserPreferredUILanguages\n  RtlGetVersion\n  RtlGrowFunctionTable\n  RtlGuidToPropertySetName PRIVATE\n  RtlHashUnicodeString\n  RtlIdentifierAuthoritySid\n  RtlIdnToAscii\n  RtlIdnToNameprepUnicode\n  RtlIdnToUnicode\n  RtlImageDirectoryEntryToData\n  RtlImageNtHeader\n  RtlImageRvaToSection\n  RtlImageRvaToVa\n  RtlImpersonateSelf\n  RtlInitAnsiString\n  RtlInitAnsiStringEx\n  RtlInitCodePageTable\n  RtlInitNlsTables\n  RtlInitString\n  RtlInitUnicodeString\n  RtlInitUnicodeStringEx\n  RtlInitializeBitMap\n  RtlInitializeConditionVariable\n  RtlInitializeContext PRIVATE\n  RtlInitializeCriticalSection\n  RtlInitializeCriticalSectionAndSpinCount\n  RtlInitializeCriticalSectionEx\n  RtlInitializeExtendedContext\n  RtlInitializeExtendedContext2\n  RtlInitializeGenericTable\n  RtlInitializeGenericTableAvl\n  RtlInitializeHandleTable\n  RtlInitializeRXact PRIVATE\n  RtlInitializeResource\n  RtlInitializeSListHead\n  RtlInitializeSRWLock\n  RtlInitializeSid\n  RtlInsertElementGenericTable PRIVATE\n  RtlInsertElementGenericTableAvl\n  RtlInstallFunctionTableCallback\n  RtlInt64ToUnicodeString\n  RtlIntegerToChar\n  RtlIntegerToUnicodeString\n  RtlInterlockedFlushSList\n  RtlInterlockedPopEntrySList\n  RtlInterlockedPushEntrySList\n  RtlInterlockedPushListSList\n  RtlInterlockedPushListSListEx\n  RtlIpv4AddressToStringA\n  RtlIpv4AddressToStringExA\n  RtlIpv4AddressToStringExW\n  RtlIpv4AddressToStringW\n  RtlIpv4StringToAddressA\n  RtlIpv4StringToAddressExA\n  RtlIpv4StringToAddressExW\n  RtlIpv4StringToAddressW\n  RtlIpv6AddressToStringA\n  RtlIpv6AddressToStringExA\n  RtlIpv6AddressToStringExW\n  RtlIpv6AddressToStringW\n  RtlIpv6StringToAddressA\n  RtlIpv6StringToAddressExA\n  RtlIpv6StringToAddressExW\n  RtlIpv6StringToAddressW\n  RtlIsActivationContextActive\n  RtlIsCriticalSectionLocked\n  RtlIsCriticalSectionLockedByThread\n  RtlIsCurrentProcess\n  RtlIsCurrentThread\n  RtlIsDosDeviceName_U\n  RtlIsEcCode\n  RtlIsGenericTableEmpty PRIVATE\n  RtlIsNameLegalDOS8Dot3\n  RtlIsNormalizedString\n  RtlIsProcessorFeaturePresent\n  RtlIsTextUnicode\n  RtlIsValidHandle\n  RtlIsValidIndexHandle\n  RtlIsValidLocaleName\n  RtlLargeIntegerToChar\n  RtlLcidToLocaleName\n  RtlLeaveCriticalSection\n  RtlLengthRequiredSid\n  RtlLengthSecurityDescriptor\n  RtlLengthSid\n  RtlLocalTimeToSystemTime\n  RtlLocaleNameToLcid\n  RtlLocateExtendedFeature\n  RtlLocateExtendedFeature2\n  RtlLocateLegacyContext\n  RtlLockHeap\n  RtlLookupAtomInAtomTable\n  RtlLookupElementGenericTable\n  RtlLookupFunctionEntry\n  RtlLookupFunctionTable\n  RtlMakeSelfRelativeSD\n  RtlMapGenericMask\n  RtlMoveMemory\n  RtlMultiByteToUnicodeN\n  RtlMultiByteToUnicodeSize\n  RtlNewInstanceSecurityObject PRIVATE\n  RtlNewSecurityGrantedAccess PRIVATE\n  RtlNewSecurityObject\n  RtlNewSecurityObjectEx\n  RtlNewSecurityObjectWithMultipleInheritance\n  RtlNormalizeProcessParams\n  RtlNormalizeString\n  RtlNtStatusToDosError\n  RtlNtStatusToDosErrorNoTeb\n  RtlNumberGenericTableElements\n  RtlNumberOfClearBits\n  RtlNumberOfSetBits\n  RtlOemStringToUnicodeSize\n  RtlOemStringToUnicodeString\n  RtlOemToUnicodeN\n  RtlOpenCrossProcessEmulatorWorkConnection\n  RtlOpenCurrentUser\n  RtlPcToFileHeader\n  RtlPinAtomInAtomTable\n  RtlPopFrame\n  RtlPrefixString\n  RtlPrefixUnicodeString\n  RtlProcessFlsData\n  RtlPropertySetNameToGuid PRIVATE\n  RtlProtectHeap PRIVATE\n  RtlPushFrame\n  RtlQueryActivationContextApplicationSettings\n  RtlQueryAtomInAtomTable\n  RtlQueryDepthSList\n  RtlQueryDynamicTimeZoneInformation\n  RtlQueryEnvironmentVariable_U\n  RtlQueryEnvironmentVariable\n  RtlQueryHeapInformation\n  RtlQueryInformationAcl\n  RtlQueryInformationActivationContext\n  RtlQueryInformationActiveActivationContext PRIVATE\n  RtlQueryInterfaceMemoryStream PRIVATE\n  RtlQueryPackageIdentity\n  RtlQueryPerformanceCounter\n  RtlQueryPerformanceFrequency\n  RtlQueryProcessBackTraceInformation PRIVATE\n  RtlQueryProcessDebugInformation\n  RtlQueryProcessHeapInformation PRIVATE\n  RtlQueryProcessLockInformation PRIVATE\n  RtlQueryProcessPlaceholderCompatibilityMode\n  RtlQueryProperties PRIVATE\n  RtlQueryPropertyNames PRIVATE\n  RtlQueryPropertySet PRIVATE\n  RtlQueryRegistryValues\n  RtlQueryRegistryValuesEx\n  RtlQuerySecurityObject PRIVATE\n  RtlQueryTagHeap PRIVATE\n  RtlQueryTimeZoneInformation\n  RtlQueryUnbiasedInterruptTime\n  RtlQueueApcWow64Thread PRIVATE\n  RtlQueueWorkItem\n  RtlRaiseException\n  RtlRaiseStatus\n  RtlRandom\n  RtlRandomEx\n  RtlReAllocateHeap\n  RtlReadMemoryStream PRIVATE\n  RtlReadOutOfProcessMemoryStream PRIVATE\n  RtlRealPredecessor PRIVATE\n  RtlRealSuccessor PRIVATE\n  RtlRegisterSecureMemoryCacheCallback PRIVATE\n  RtlRegisterWait\n  RtlReleaseActivationContext\n  RtlReleaseMemoryStream PRIVATE\n  RtlReleasePath\n  RtlReleasePebLock\n  RtlReleaseRelativeName\n  RtlReleaseResource\n  RtlReleaseSRWLockExclusive\n  RtlReleaseSRWLockShared\n  RtlRemoteCall PRIVATE\n  RtlRemoveVectoredContinueHandler\n  RtlRemoveVectoredExceptionHandler\n  RtlResetRtlTranslations\n  RtlRestoreContext\n  RtlRestoreLastWin32Error\n  RtlRevertMemoryStream PRIVATE\n  RtlRunDecodeUnicodeString PRIVATE\n  RtlRunEncodeUnicodeString PRIVATE\n  RtlRunOnceBeginInitialize\n  RtlRunOnceComplete\n  RtlRunOnceExecuteOnce\n  RtlRunOnceInitialize\n  RtlSecondsSince1970ToTime\n  RtlSecondsSince1980ToTime\n  RtlSelfRelativeToAbsoluteSD\n  RtlSetAllBits\n  RtlSetBits\n  RtlSetControlSecurityDescriptor\n  RtlSetCriticalSectionSpinCount\n  RtlSetCurrentDirectory_U\n  RtlSetCurrentEnvironment\n  RtlSetCurrentTransaction\n  RtlSetDaclSecurityDescriptor\n  RtlSetEnvironmentVariable\n  RtlSetExtendedFeaturesMask\n  RtlSetGroupSecurityDescriptor\n  RtlSetHeapInformation\n  RtlSetInformationAcl PRIVATE\n  RtlSetIoCompletionCallback\n  RtlSetLastWin32Error\n  RtlSetLastWin32ErrorAndNtStatusFromNtStatus\n  RtlSetOwnerSecurityDescriptor\n  RtlSetProcessPreferredUILanguages\n  RtlSetProperties PRIVATE\n  RtlSetPropertyClassId PRIVATE\n  RtlSetPropertyNames PRIVATE\n  RtlSetPropertySetClassId PRIVATE\n  RtlSetSaclSecurityDescriptor\n  RtlSetSearchPathMode\n  RtlSetSecurityObject PRIVATE\n  RtlSetThreadErrorMode\n  RtlSetThreadPreferredUILanguages\n  RtlSetTimeZoneInformation\n  RtlSetUnhandledExceptionFilter\n  RtlSetUnicodeCallouts PRIVATE\n  RtlSetUserFlagsHeap\n  RtlSetUserValueHeap\n  RtlSizeHeap\n  RtlSleepConditionVariableCS\n  RtlSleepConditionVariableSRW\n  RtlSplay PRIVATE\n  RtlStartRXact PRIVATE\n  RtlStringFromGUID\n  RtlSubAuthorityCountSid\n  RtlSubAuthoritySid\n  RtlSubtreePredecessor PRIVATE\n  RtlSubtreeSuccessor PRIVATE\n  RtlSystemTimeToLocalTime\n  RtlTimeFieldsToTime\n  RtlTimeToElapsedTimeFields\n  RtlTimeToSecondsSince1970\n  RtlTimeToSecondsSince1980\n  RtlTimeToTimeFields\n  RtlTryAcquireSRWLockExclusive\n  RtlTryAcquireSRWLockShared\n  RtlTryEnterCriticalSection\n  RtlUTF8ToUnicodeN\n  RtlUnicodeStringToAnsiSize\n  RtlUnicodeStringToAnsiString\n  RtlUnicodeStringToCountedOemString PRIVATE\n  RtlUnicodeStringToInteger\n  RtlUnicodeStringToOemSize\n  RtlUnicodeStringToOemString\n  RtlUnicodeToCustomCPN\n  RtlUnicodeToMultiByteN\n  RtlUnicodeToMultiByteSize\n  RtlUnicodeToOemN\n  RtlUnicodeToUTF8N\n  RtlUniform\n  RtlUnlockHeap\n  RtlUnwind\n  RtlUnwindEx\n  RtlUpcaseUnicodeChar\n  RtlUpcaseUnicodeString\n  RtlUpcaseUnicodeStringToAnsiString\n  RtlUpcaseUnicodeStringToCountedOemString\n  RtlUpcaseUnicodeStringToOemString\n  RtlUpcaseUnicodeToCustomCPN\n  RtlUpcaseUnicodeToMultiByteN\n  RtlUpcaseUnicodeToOemN\n  RtlUpdateTimer\n  RtlUpperChar\n  RtlUpperString\n  RtlUsageHeap PRIVATE\n  RtlUserThreadStart\n  RtlValidAcl\n  RtlValidRelativeSecurityDescriptor\n  RtlValidSecurityDescriptor\n  RtlValidSid\n  RtlValidateHeap\n  RtlValidateProcessHeaps PRIVATE\n  RtlVerifyVersionInfo\n  RtlVirtualUnwind\n  RtlVirtualUnwind2\n  RtlWaitOnAddress\n  RtlWakeAddressAll\n  RtlWakeAddressSingle\n  RtlWakeAllConditionVariable\n  RtlWakeConditionVariable\n  RtlWalkFrameChain\n  RtlWalkHeap\n  RtlWow64EnableFsRedirection\n  RtlWow64EnableFsRedirectionEx\n  RtlWow64GetCpuAreaInfo\n  RtlWow64GetCurrentCpuArea\n  RtlWow64GetCurrentMachine\n  RtlWow64GetProcessMachines\n  RtlWow64GetSharedInfoProcess\n  RtlWow64GetThreadContext\n  RtlWow64GetThreadSelectorEntry\n  RtlWow64IsWowGuestMachineSupported\n  RtlWow64PopAllCrossProcessWorkFromWorkList\n  RtlWow64PopCrossProcessWorkFromFreeList\n  RtlWow64PushCrossProcessWorkOntoFreeList\n  RtlWow64PushCrossProcessWorkOntoWorkList\n  RtlWow64RequestCrossProcessHeavyFlush\n  RtlWow64SetThreadContext\n  RtlWow64SuspendThread\n  RtlWriteMemoryStream PRIVATE\n  RtlWriteRegistryValue\n  RtlZeroHeap PRIVATE\n  RtlZeroMemory\n  RtlZombifyActivationContext\n  RtlpNtCreateKey\n  RtlpNtEnumerateSubKey\n  RtlpNtMakeTemporaryKey\n  RtlpNtOpenKey\n  RtlpNtQueryValueKey\n  RtlpNtSetValueKey\n  RtlpUnWaitCriticalSection\n  RtlpWaitForCriticalSection\n  RtlxAnsiStringToUnicodeSize\n  RtlxOemStringToUnicodeSize\n  RtlxUnicodeStringToAnsiSize\n  RtlxUnicodeStringToOemSize\n  TpAllocCleanupGroup\n  TpAllocIoCompletion\n  TpAllocPool\n  TpAllocTimer\n  TpAllocWait\n  TpAllocWork\n  TpCallbackLeaveCriticalSectionOnCompletion\n  TpCallbackMayRunLong\n  TpCallbackReleaseMutexOnCompletion\n  TpCallbackReleaseSemaphoreOnCompletion\n  TpCallbackSetEventOnCompletion\n  TpCallbackUnloadDllOnCompletion\n  TpCancelAsyncIoOperation\n  TpDisassociateCallback\n  TpIsTimerSet\n  TpPostWork\n  TpQueryPoolStackInformation\n  TpReleaseCleanupGroup\n  TpReleaseCleanupGroupMembers\n  TpReleaseIoCompletion\n  TpReleasePool\n  TpReleaseTimer\n  TpReleaseWait\n  TpReleaseWork\n  TpSetPoolMaxThreads\n  TpSetPoolMinThreads\n  TpSetPoolStackInformation\n  TpSetTimer\n  TpSetWait\n  TpSimpleTryPost\n  TpStartAsyncIoOperation\n  TpWaitForIoCompletion\n  TpWaitForTimer\n  TpWaitForWait\n  TpWaitForWork\n  VerSetConditionMask\n  WinSqmEndSession\n  WinSqmIncrementDWORD\n  WinSqmIsOptedIn\n  WinSqmSetDWORD\n  WinSqmSetIfMaxDWORD\n  WinSqmStartSession\n  ZwAcceptConnectPort\n  ZwAccessCheck\n  ZwAccessCheckAndAuditAlarm\n  ZwAddAtom\n  ZwAdjustGroupsToken\n  ZwAdjustPrivilegesToken\n  ZwAlertResumeThread\n  ZwAlertThread\n  ZwAlertThreadByThreadId\n  ZwAllocateLocallyUniqueId\n  ZwAllocateUuids\n  ZwAllocateVirtualMemory\n  ZwAllocateVirtualMemoryEx\n  ZwAreMappedFilesTheSame\n  ZwAssignProcessToJobObject\n  ZwCancelIoFile\n  ZwCancelIoFileEx\n  ZwCancelSynchronousIoFile\n  ZwCancelTimer\n  ZwClearEvent\n  ZwClose\n  ZwCompareObjects\n  ZwCompleteConnectPort\n  ZwConnectPort\n  ZwContinue\n  ZwCreateDirectoryObject\n  ZwCreateEvent\n  ZwCreateFile\n  ZwCreateIoCompletion\n  ZwCreateJobObject\n  ZwCreateKey\n  ZwCreateKeyTransacted\n  ZwCreateKeyedEvent\n  ZwCreateLowBoxToken\n  ZwCreateMailslotFile\n  ZwCreateMutant\n  ZwCreateNamedPipeFile\n  ZwCreatePagingFile\n  ZwCreatePort\n  ZwCreateSection\n  ZwCreateSemaphore\n  ZwCreateSymbolicLinkObject\n  ZwCreateThread\n  ZwCreateThreadEx\n  ZwCreateTimer\n  ZwCreateToken\n  ZwCreateUserProcess\n  ZwDebugActiveProcess\n  ZwDebugContinue\n  ZwDelayExecution\n  ZwDeleteAtom\n  ZwDeleteFile\n  ZwDeleteKey\n  ZwDeleteValueKey\n  ZwDeviceIoControlFile\n  ZwDisplayString\n  ZwDuplicateObject\n  ZwDuplicateToken\n  ZwEnumerateKey\n  ZwEnumerateValueKey\n  ZwFilterToken\n  ZwFindAtom\n  ZwFlushBuffersFile\n  ZwFlushInstructionCache\n  ZwFlushKey\n  ZwFlushProcessWriteBuffers\n  ZwFlushVirtualMemory\n  ZwFreeVirtualMemory\n  ZwFsControlFile\n  ZwGetContextThread\n  ZwGetCurrentProcessorNumber\n  ZwGetNlsSectionPtr\n  ZwGetTickCount\n  ZwGetWriteWatch\n  ZwImpersonateAnonymousToken\n  ZwInitializeNlsFiles\n  ZwInitiatePowerAction\n  ZwIsProcessInJob\n  ZwListenPort\n  ZwLoadDriver\n  ZwLoadKey2\n  ZwLoadKey\n  ZwLockFile\n  ZwLockVirtualMemory\n  ZwMakeTemporaryObject\n  ZwMapViewOfSection\n  ZwMapViewOfSectionEx\n  ZwNotifyChangeDirectoryFile\n  ZwNotifyChangeKey\n  ZwNotifyChangeMultipleKeys\n  ZwOpenDirectoryObject\n  ZwOpenEvent\n  ZwOpenFile\n  ZwOpenIoCompletion\n  ZwOpenJobObject\n  ZwOpenKey\n  ZwOpenKeyEx\n  ZwOpenKeyTransacted\n  ZwOpenKeyTransactedEx\n  ZwOpenKeyedEvent\n  ZwOpenMutant\n  ZwOpenProcess\n  ZwOpenProcessToken\n  ZwOpenProcessTokenEx\n  ZwOpenSection\n  ZwOpenSemaphore\n  ZwOpenSymbolicLinkObject\n  ZwOpenThread\n  ZwOpenThreadToken\n  ZwOpenThreadTokenEx\n  ZwOpenTimer\n  ZwPowerInformation\n  ZwPrivilegeCheck\n  ZwProtectVirtualMemory\n  ZwPulseEvent\n  ZwQueryAttributesFile\n  ZwQueryDefaultLocale\n  ZwQueryDefaultUILanguage\n  ZwQueryDirectoryFile\n  ZwQueryDirectoryObject\n  ZwQueryEaFile\n  ZwQueryEvent\n  ZwQueryFullAttributesFile\n  ZwQueryInformationAtom\n  ZwQueryInformationFile\n  ZwQueryInformationJobObject\n  ZwQueryInformationProcess\n  ZwQueryInformationThread\n  ZwQueryInformationToken\n  ZwQueryInstallUILanguage\n  ZwQueryIoCompletion\n  ZwQueryKey\n  ZwQueryLicenseValue\n  ZwQueryMultipleValueKey\n  ZwQueryMutant\n  ZwQueryObject\n  ZwQueryPerformanceCounter\n  ZwQuerySection\n  ZwQuerySecurityObject\n  ZwQuerySemaphore\n  ZwQuerySymbolicLinkObject\n  ZwQuerySystemEnvironmentValue\n  ZwQuerySystemEnvironmentValueEx\n  ZwQuerySystemInformation\n  ZwQuerySystemInformationEx\n  ZwQuerySystemTime\n  ZwQueryTimer\n  ZwQueryTimerResolution\n  ZwQueryValueKey\n  ZwQueryVirtualMemory\n  ZwQueryVolumeInformationFile\n  ZwQueueApcThread\n  ZwRaiseException\n  ZwRaiseHardError\n  ZwReadFile\n  ZwReadFileScatter\n  ZwReadVirtualMemory\n  ZwRegisterThreadTerminatePort\n  ZwReleaseKeyedEvent\n  ZwReleaseMutant\n  ZwReleaseSemaphore\n  ZwRemoveIoCompletion\n  ZwRemoveIoCompletionEx\n  ZwRemoveProcessDebug\n  ZwRenameKey\n  ZwReplaceKey\n  ZwReplyWaitReceivePort\n  ZwRequestWaitReplyPort\n  ZwResetEvent\n  ZwResetWriteWatch\n  ZwRestoreKey\n  ZwResumeProcess\n  ZwResumeThread\n  ZwSaveKey\n  ZwSecureConnectPort\n  ZwSetContextThread\n  ZwSetDebugFilterState\n  ZwSetDefaultLocale\n  ZwSetDefaultUILanguage\n  ZwSetEaFile\n  ZwSetEvent\n  ZwSetInformationDebugObject\n  ZwSetInformationFile\n  ZwSetInformationJobObject\n  ZwSetInformationKey\n  ZwSetInformationObject\n  ZwSetInformationProcess\n  ZwSetInformationThread\n  ZwSetInformationToken\n  ZwSetInformationVirtualMemory\n  ZwSetIntervalProfile\n  ZwSetIoCompletion\n  ZwSetLdtEntries\n  ZwSetSecurityObject\n  ZwSetSystemInformation\n  ZwSetSystemTime\n  ZwSetThreadExecutionState\n  ZwSetTimer\n  ZwSetTimerResolution\n  ZwSetValueKey\n  ZwSetVolumeInformationFile\n  ZwShutdownSystem\n  ZwSignalAndWaitForSingleObject\n  ZwSuspendProcess\n  ZwSuspendThread\n  ZwSystemDebugControl\n  ZwTerminateJobObject\n  ZwTerminateProcess\n  ZwTerminateThread\n  ZwTestAlert\n  ZwTraceControl\n  ZwUnloadDriver\n  ZwUnloadKey\n  ZwUnlockFile\n  ZwUnlockVirtualMemory\n  ZwUnmapViewOfSection\n  ZwUnmapViewOfSectionEx\n  ZwWaitForAlertByThreadId\n  ZwWaitForDebugEvent\n  ZwWaitForKeyedEvent\n  ZwWaitForMultipleObjects\n  ZwWaitForSingleObject\n  ZwWriteFile\n  ZwWriteFileGather\n  ZwWriteVirtualMemory\n  ZwYieldExecution\n  __C_specific_handler\n  __chkstk\n  __isascii\n  __iscsym\n  __iscsymf\n  __toascii\n  _atoi64\n  _errno\n  _fltused PRIVATE\n  _i64toa\n  _i64toa_s\n  _i64tow\n  _i64tow_s\n  _itoa\n  _itoa_s\n  _itow\n  _itow_s\n  _lfind\n  _local_unwind\n  _ltoa\n  _ltoa_s\n  _ltow\n  _ltow_s\n  _makepath_s\n  _memccpy\n  _memicmp\n  _setjmpex\n  _snprintf\n  _snprintf_s\n  _snwprintf\n  _snwprintf_s\n  _splitpath\n  _splitpath_s\n  _strcmpi\n  _stricmp\n  _strlwr\n  _strlwr_s\n  _strnicmp\n  _strupr\n  _strupr_s\n  _swprintf\n  _tolower\n  _toupper\n  _ui64toa\n  _ui64toa_s\n  _ui64tow\n  _ui64tow_s\n  _ultoa\n  _ultoa_s\n  _ultow\n  _ultow_s\n  _vscprintf\n  _vscwprintf\n  _vsnprintf\n  _vsnprintf_s\n  _vsnwprintf\n  _vsnwprintf_s\n  _vswprintf\n  _wcsicmp\n  _wcslwr\n  _wcslwr_s\n  _wcsnicmp\n  _wcstoi64\n  _wcstoui64\n  _wcsupr\n  _wcsupr_s\n  _wmakepath_s\n  _wsplitpath_s\n  _wtoi\n  _wtoi64\n  _wtol\n  abs\n  atan\n  atan2\n  atoi\n  atol\n  bsearch\n  bsearch_s\n  ceil\n  cos\n  fabs\n  floor\n  isalnum\n  isalpha\n  iscntrl\n  isdigit\n  isgraph\n  islower\n  isprint\n  ispunct\n  isspace\n  isupper\n  iswalnum\n  iswalpha\n  iswascii\n  iswctype\n  iswdigit\n  iswgraph\n  iswlower\n  iswprint\n  iswspace\n  iswxdigit\n  isxdigit\n  labs\n  log\n  longjmp\n  mbstowcs\n  memchr\n  memcmp\n  memcpy\n  memcpy_s\n  memmove\n  memmove_s\n  memset\n  pow\n  qsort\n  qsort_s\n  sin\n  sprintf\n  sprintf_s\n  sqrt\n  sscanf\n  strcat\n  strcat_s\n  strchr\n  strcmp\n  strcpy\n  strcpy_s\n  strcspn\n  strlen\n  strncat\n  strncat_s\n  strncmp\n  strncpy\n  strncpy_s\n  strnlen\n  strpbrk\n  strrchr\n  strspn\n  strstr\n  strtok_s\n  strtol\n  strtoul\n  swprintf\n  swprintf_s\n  tan\n  tolower\n  toupper\n  towlower\n  towupper\n  vDbgPrintEx\n  vDbgPrintExWithPrefix\n  vsprintf\n  vsprintf_s\n  vswprintf_s\n  wcscat\n  wcscat_s\n  wcschr\n  wcscmp\n  wcscpy\n  wcscpy_s\n  wcscspn\n  wcslen\n  wcsncat\n  wcsncat_s\n  wcsncmp\n  wcsncpy\n  wcsncpy_s\n  wcsnlen\n  wcspbrk\n  wcsrchr\n  wcsspn\n  wcsstr\n  wcstok\n  wcstok_s\n  wcstol\n  wcstombs\n  wcstoul\n  wine_server_call\n  wine_server_fd_to_handle\n  wine_server_handle_to_fd\n  __wine_unix_spawnvp\n  __wine_ctrl_routine\n  __wine_syscall_dispatcher DATA PRIVATE\n  __wine_unix_call_dispatcher DATA PRIVATE\n  __wine_unixlib_handle DATA PRIVATE\n  __wine_set_unix_env\n  __wine_dbg_write\n  __wine_dbg_get_channel_flags\n  __wine_dbg_header\n  __wine_dbg_output\n  __wine_dbg_strdup\n  __wine_dbg_ftrace\n  wine_get_version\n  wine_get_build_id\n  wine_get_host_version\n  wine_nt_to_unix_file_name\n  wine_unix_to_nt_file_name\n  __wine_needs_override_large_address_aware\n"
  },
  {
    "path": "Source/Windows/Defs/wow64.def",
    "content": "; File generated automatically from wine/dlls/wow64/wow64.spec; do not edit!\n; To generate: winebuild --def -E wine/dlls/wow64/wow64.spec > wow64.def\n\nLIBRARY wow64.dll\n\nEXPORTS\n  Wow64AllocThreadHeap @1 PRIVATE\n  Wow64AllocateHeap @2 PRIVATE\n  Wow64AllocateTemp @3\n  Wow64ApcRoutine @4\n  Wow64CheckIfNXEnabled @5 PRIVATE\n  Wow64EmulateAtlThunk @6 PRIVATE\n  Wow64FreeHeap @7 PRIVATE\n  Wow64FreeThreadHeap @8 PRIVATE\n  Wow64GetWow64ImageOption @9 PRIVATE\n  Wow64IsControlFlowGuardEnforced @10 PRIVATE\n  Wow64IsStackExtentsCheckEnforced @11 PRIVATE\n  Wow64KiUserCallbackDispatcher @12\n  Wow64LdrpInitialize @13\n  Wow64LogPrint @14 PRIVATE\n  Wow64NotifyUnsimulateComplete @15 PRIVATE\n  Wow64PassExceptionToGuest @16\n  Wow64PrepareForDebuggerAttach @17 PRIVATE\n  Wow64PrepareForException @18\n  Wow64ProcessPendingCrossProcessItems @19\n  Wow64RaiseException @20\n  Wow64ShallowThunkAllocObjectAttributes32TO64_FNC @21 PRIVATE\n  Wow64ShallowThunkAllocSecurityQualityOfService32TO64_FNC @22 PRIVATE\n  Wow64ShallowThunkSIZE_T32TO64 @23 PRIVATE\n  Wow64ShallowThunkSIZE_T64TO32 @24 PRIVATE\n  Wow64SuspendLocalThread @25 PRIVATE\n  Wow64SystemServiceEx @26\n  Wow64ValidateUserCallTarget @27 PRIVATE\n  Wow64ValidateUserCallTargetFilter @28 PRIVATE\n"
  },
  {
    "path": "Source/Windows/WOW64/BTInterface.h",
    "content": "// SPDX-License-Identifier: MIT\n#pragma once\n\n#include <windef.h>\n#include <ntstatus.h>\n#include <winternl.h>\n\nextern \"C\" {\nvoid STDMETHODCALLTYPE BTCpuProcessInit();\nvoid STDMETHODCALLTYPE BTCpuProcessTerm(HANDLE Handle, BOOL After, ULONG Status);\nvoid STDMETHODCALLTYPE BTCpuThreadInit();\nvoid STDMETHODCALLTYPE BTCpuThreadTerm(HANDLE Thread, LONG ExitCode);\nvoid STDMETHODCALLTYPE* BTCpuGetBopCode();\nvoid STDMETHODCALLTYPE* __wine_get_unix_opcode();\nNTSTATUS STDMETHODCALLTYPE BTCpuGetContext(HANDLE Thread, HANDLE Process, void* Unknown, WOW64_CONTEXT* Context);\nNTSTATUS STDMETHODCALLTYPE BTCpuSetContext(HANDLE Thread, HANDLE Process, void* Unknown, WOW64_CONTEXT* Context);\nvoid STDMETHODCALLTYPE BTCpuSimulate();\nNTSTATUS STDMETHODCALLTYPE BTCpuSuspendLocalThread(HANDLE Thread, ULONG* Count);\nNTSTATUS STDMETHODCALLTYPE BTCpuResetToConsistentState(EXCEPTION_POINTERS* Ptrs);\nvoid STDMETHODCALLTYPE BTCpuFlushInstructionCache2(const void* Address, SIZE_T Size);\nvoid STDMETHODCALLTYPE BTCpuFlushInstructionCacheHeavy(const void* Address, SIZE_T Size);\nvoid STDMETHODCALLTYPE BTCpuNotifyMemoryAlloc(void* Address, SIZE_T Size, ULONG Type, ULONG Prot, BOOL After, ULONG Status);\nvoid STDMETHODCALLTYPE BTCpuNotifyMemoryProtect(void* Address, SIZE_T Size, ULONG NewProt, BOOL After, ULONG Status);\nvoid STDMETHODCALLTYPE BTCpuNotifyMemoryDirty(void* Address, SIZE_T Size);\nvoid STDMETHODCALLTYPE BTCpuNotifyMemoryFree(void* Address, SIZE_T Size, ULONG FreeType, BOOL After, ULONG Status);\nNTSTATUS STDMETHODCALLTYPE BTCpuNotifyMapViewOfSection(void* Unk1, void* Address, void* Unk2, SIZE_T Size, ULONG AllocType, ULONG Prot);\nvoid STDMETHODCALLTYPE BTCpuNotifyUnmapViewOfSection(void* Address, BOOL After, ULONG Status);\nvoid STDMETHODCALLTYPE BTCpuNotifyReadFile(HANDLE Handle, void* Address, SIZE_T Size, BOOL After, NTSTATUS Status);\nBOOLEAN STDMETHODCALLTYPE BTCpuIsProcessorFeaturePresent(UINT Feature);\nvoid STDMETHODCALLTYPE BTCpuUpdateProcessorInformation(SYSTEM_CPU_INFORMATION* Info);\n}\n"
  },
  {
    "path": "Source/Windows/WOW64/CMakeLists.txt",
    "content": "add_library(wow64fex SHARED\n  Module.cpp\n  libwow64fex.def\n  $<TARGET_OBJECTS:FEXCore_object>)\n\npatch_library_wine(wow64fex)\n\ntarget_include_directories(wow64fex PRIVATE\n  \"${CMAKE_SOURCE_DIR}/Source/Windows/include/\"\n  \"${CMAKE_SOURCE_DIR}/Source/Windows/\"\n  \"${CMAKE_SOURCE_DIR}/Source/\")\n\ntarget_link_libraries(wow64fex PRIVATE\n  FEXCore_Base\n  Common\n  CommonTools\n  CommonWindows\n  CommonWindowsRuntime\n  wow64_ex\n  ntdll_ex)\n\ntarget_link_options(wow64fex PRIVATE -static -nostdlib -nostartfiles -nodefaultlibs -lc++ -lc++abi -lunwind)\ntarget_link_libraries(wow64fex PRIVATE ${LIBGCC_PATH})\ninstall(TARGETS wow64fex RUNTIME\n  DESTINATION ${CMAKE_INSTALL_LIBDIR}\n  COMPONENT Runtime)\n"
  },
  {
    "path": "Source/Windows/WOW64/Module.cpp",
    "content": "// SPDX-License-Identifier: MIT\n/*\n$info$\ntags: Bin|WOW64\ndesc: Implements the WOW64 BT module API using FEXCore\n$end_info$\n*/\n\n// Thanks to André Zwing, whose ideas from https://github.com/AndreRH/hangover this code is based upon\n\n#include <FEXCore/fextl/fmt.h>\n#include <FEXCore/Core/X86Enums.h>\n#include <FEXCore/Core/SignalDelegator.h>\n#include <FEXCore/Core/Context.h>\n#include <FEXCore/Core/CoreState.h>\n#include <FEXCore/Debug/InternalThreadState.h>\n#include <FEXCore/HLE/SyscallHandler.h>\n#include <FEXCore/Config/Config.h>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/Utils/LogManager.h>\n#include <FEXCore/Utils/Threads.h>\n#include <FEXCore/Utils/Profiler.h>\n#include <FEXCore/Utils/SHMStats.h>\n#include <FEXCore/Utils/EnumOperators.h>\n#include <FEXCore/Utils/EnumUtils.h>\n#include <FEXCore/Utils/FPState.h>\n#include <FEXCore/Utils/ArchHelpers/Arm64.h>\n#include <FEXCore/Utils/TypeDefines.h>\n#include <FEXCore/Utils/SignalScopeGuards.h>\n\n#include \"Common/CallRetStack.h\"\n#include \"Common/JITGuardPage.h\"\n#include \"Common/Config.h\"\n#include \"Common/Exception.h\"\n#include \"Common/TSOHandlerConfig.h\"\n#include \"Common/ImageTracker.h\"\n#include \"Common/InvalidationTracker.h\"\n#include \"Common/OvercommitTracker.h\"\n#include \"Common/CPUFeatures.h\"\n#include \"Common/Logging.h\"\n#include \"Common/Module.h\"\n#include \"Common/CRT/CRT.h\"\n#include \"Common/PortabilityInfo.h\"\n#include \"Common/Handle.h\"\n#include \"DummyHandlers.h\"\n#include \"BTInterface.h\"\n#include \"Windows/Common/SHMStats.h\"\n\n#include <cstdint>\n#include <type_traits>\n#include <atomic>\n#include <mutex>\n#include <utility>\n#include <unordered_map>\n#include <ntstatus.h>\n#include <windef.h>\n#include <winternl.h>\n#include <wine/debug.h>\n#include <wine/unixlib.h>\n\nnamespace ControlBits {\n// When this is unset, a thread can be safely interrupted and have its context recovered\n// IMPORTANT: This can only safely be written by the owning thread\nstatic constexpr uint32_t IN_JIT {1U << 0};\n\n// JIT entry polls this bit until it is unset, at which point CONTROL_IN_JIT will be set\nstatic constexpr uint32_t PAUSED {1U << 1};\n\n// When this is set, the CPU context stored in the CPU area has not yet been flushed to the FEX TLS\nstatic constexpr uint32_t WOW_CPU_AREA_DIRTY {1U << 2};\n}; // namespace ControlBits\n\nstruct TLS {\n  enum class Slot : size_t {\n    ENTRY_CONTEXT = WOW64_TLS_MAX_NUMBER - 1,\n    CONTROL_WORD = WOW64_TLS_MAX_NUMBER - 2,\n    THREAD_STATE = WOW64_TLS_MAX_NUMBER - 3,\n    CACHED_CALLRET_SP = WOW64_TLS_MAX_NUMBER - 4,\n  };\n\n  _TEB* TEB;\n\n  explicit TLS(_TEB* TEB)\n    : TEB(TEB) {}\n\n  WOW64INFO& Wow64Info() const {\n    return *reinterpret_cast<WOW64INFO*>(TEB->TlsSlots[WOW64_TLS_WOW64INFO]);\n  }\n\n  std::atomic<uint32_t>& ControlWord() const {\n    // TODO: Change this when libc++ gains std::atomic_ref support\n    return reinterpret_cast<std::atomic<uint32_t>&>(TEB->TlsSlots[FEXCore::ToUnderlying(Slot::CONTROL_WORD)]);\n  }\n\n  CONTEXT*& EntryContext() const {\n    return reinterpret_cast<CONTEXT*&>(TEB->TlsSlots[FEXCore::ToUnderlying(Slot::ENTRY_CONTEXT)]);\n  }\n\n  FEXCore::Core::InternalThreadState*& ThreadState() const {\n    return reinterpret_cast<FEXCore::Core::InternalThreadState*&>(TEB->TlsSlots[FEXCore::ToUnderlying(Slot::THREAD_STATE)]);\n  }\n\n  // This is used to work around user callback handling (see Wow64KiUserCallbackDispatcher in wine) unbalancing the\n  // call-ret stace since user callbacks are returned from using a syscall that we can't really intercept.\n  uint64_t& CachedCallRetSp() const {\n    return reinterpret_cast<uint64_t&>(TEB->TlsSlots[FEXCore::ToUnderlying(Slot::CACHED_CALLRET_SP)]);\n  }\n};\n\nstruct FrontendThreadData {\n  bool InLockedRWXRead {};\n};\n\nclass WowSyscallHandler;\n\nnamespace {\nnamespace BridgeInstrs {\n  // These directly jumped to by the guest to make system calls\n  void* Syscall {};\n  void* UnixCall {};\n} // namespace BridgeInstrs\n\nfextl::unique_ptr<FEXCore::Context::Context> CTX;\nfextl::unique_ptr<FEX::DummyHandlers::DummySignalDelegator> SignalDelegator;\nfextl::unique_ptr<WowSyscallHandler> SyscallHandler;\nfextl::unique_ptr<FEX::Windows::StatAlloc> StatAllocHandler;\n\nstd::optional<FEX::Windows::InvalidationTracker> InvalidationTracker;\nstd::optional<FEX::Windows::CPUFeatures> CPUFeatures;\nstd::optional<FEX::Windows::OvercommitTracker> OvercommitTracker;\nstd::optional<FEX::Windows::ImageTracker> ImageTracker;\n\nstd::mutex ThreadCreationMutex;\n// Map of TIDs to their FEX thread state, `ThreadCreationMutex` must be locked when accessing\nstd::unordered_map<DWORD, FEXCore::Core::InternalThreadState*> Threads;\n\ndecltype(__wine_unix_call_dispatcher) WineUnixCall;\n\nstd::pair<NTSTATUS, TLS> GetThreadTLS(HANDLE Thread) {\n  THREAD_BASIC_INFORMATION Info;\n  const NTSTATUS Err = NtQueryInformationThread(Thread, ThreadBasicInformation, &Info, sizeof(Info), nullptr);\n  return {Err, TLS {reinterpret_cast<_TEB*>(Info.TebBaseAddress)}};\n}\n\nTLS GetTLS() {\n  return TLS {NtCurrentTeb()};\n}\n\nFrontendThreadData* GetFrontendThreadData(FEXCore::Core::InternalThreadState* Thread) {\n  return static_cast<FrontendThreadData*>(Thread->FrontendPtr);\n}\n\nuint64_t GetWowTEB(void* TEB) {\n  static constexpr size_t WowTEBOffsetMemberOffset {0x180c};\n  return static_cast<uint64_t>(\n    *reinterpret_cast<LONG*>(reinterpret_cast<uintptr_t>(TEB) + WowTEBOffsetMemberOffset) + reinterpret_cast<uint64_t>(TEB));\n}\n\nbool IsDispatcherAddress(uint64_t Address) {\n  const auto& Config = SignalDelegator->GetConfig();\n  return Address >= Config.DispatcherBegin && Address < Config.DispatcherEnd;\n}\n\nbool IsAddressInJit(uint64_t Address) {\n  if (IsDispatcherAddress(Address)) {\n    return true;\n  }\n\n  auto Thread = GetTLS().ThreadState();\n  return Thread->CTX->IsAddressInCodeBuffer(Thread, Address);\n}\n\nvoid HandleImageMap(uint64_t Address, bool MainImage = false) {\n  fextl::string ModulePath = FEX::Windows::GetSectionFilePath(Address);\n  fextl::string ModuleName = fextl::string {FEX::Windows::BaseName(ModulePath)};\n  InvalidationTracker->HandleImageMap(ModuleName, Address);\n  ImageTracker->HandleImageMap(ModulePath, Address, MainImage);\n}\n\nvoid HandleImageUnmap(uint64_t Address, uint64_t Size) {\n  ImageTracker->HandleImageUnmap(Address, Size);\n}\n} // namespace\n\nnamespace Context {\nvoid LoadStateFromWowContext(FEXCore::Core::InternalThreadState* Thread, uint64_t WowTEB, WOW64_CONTEXT* Context) {\n  auto& State = Thread->CurrentFrame->State;\n\n  // General register state\n\n  State.gregs[FEXCore::X86State::REG_RAX] = Context->Eax;\n  State.gregs[FEXCore::X86State::REG_RBX] = Context->Ebx;\n  State.gregs[FEXCore::X86State::REG_RCX] = Context->Ecx;\n  State.gregs[FEXCore::X86State::REG_RDX] = Context->Edx;\n  State.gregs[FEXCore::X86State::REG_RSI] = Context->Esi;\n  State.gregs[FEXCore::X86State::REG_RDI] = Context->Edi;\n  State.gregs[FEXCore::X86State::REG_RBP] = Context->Ebp;\n  State.gregs[FEXCore::X86State::REG_RSP] = Context->Esp;\n\n  State.rip = Context->Eip;\n  CTX->SetFlagsFromCompactedEFLAGS(Thread, Context->EFlags);\n\n  State.es_idx = Context->SegEs & 0xffff;\n  State.cs_idx = Context->SegCs & 0xffff;\n  State.ss_idx = Context->SegSs & 0xffff;\n  State.ds_idx = Context->SegDs & 0xffff;\n  State.fs_idx = Context->SegFs & 0xffff;\n  State.gs_idx = Context->SegGs & 0xffff;\n\n  // The TEB is the only populated GDT entry by default\n  auto GDT = State.GetSegmentFromIndex(State, (Context->SegFs & 0xffff));\n  State.SetGDTBase(GDT, WowTEB);\n  State.SetGDTLimit(GDT, 0xF'FFFFU);\n  State.fs_cached = WowTEB;\n  State.es_cached = 0;\n  State.cs_cached = 0;\n  State.ss_cached = 0;\n  State.ds_cached = 0;\n\n  // Floating-point register state\n  const auto* XSave = reinterpret_cast<XSAVE_FORMAT*>(Context->ExtendedRegisters);\n\n  CTX->SetXMMRegistersFromState(Thread, reinterpret_cast<const __uint128_t*>(XSave->XmmRegisters), nullptr);\n  memcpy(State.mm, XSave->FloatRegisters, sizeof(State.mm));\n\n  State.FCW = XSave->ControlWord;\n  State.flags[FEXCore::X86State::X87FLAG_IE_LOC] = XSave->StatusWord & 1;\n  State.flags[FEXCore::X86State::X87FLAG_C0_LOC] = (XSave->StatusWord >> 8) & 1;\n  State.flags[FEXCore::X86State::X87FLAG_C1_LOC] = (XSave->StatusWord >> 9) & 1;\n  State.flags[FEXCore::X86State::X87FLAG_C2_LOC] = (XSave->StatusWord >> 10) & 1;\n  State.flags[FEXCore::X86State::X87FLAG_C3_LOC] = (XSave->StatusWord >> 14) & 1;\n  State.flags[FEXCore::X86State::X87FLAG_TOP_LOC] = (XSave->StatusWord >> 11) & 0b111;\n  State.AbridgedFTW = XSave->TagWord;\n}\n\nvoid StoreWowContextFromState(FEXCore::Core::InternalThreadState* Thread, WOW64_CONTEXT* Context) {\n  auto& State = Thread->CurrentFrame->State;\n\n  // General register state\n\n  Context->Eax = State.gregs[FEXCore::X86State::REG_RAX];\n  Context->Ebx = State.gregs[FEXCore::X86State::REG_RBX];\n  Context->Ecx = State.gregs[FEXCore::X86State::REG_RCX];\n  Context->Edx = State.gregs[FEXCore::X86State::REG_RDX];\n  Context->Esi = State.gregs[FEXCore::X86State::REG_RSI];\n  Context->Edi = State.gregs[FEXCore::X86State::REG_RDI];\n  Context->Ebp = State.gregs[FEXCore::X86State::REG_RBP];\n  Context->Esp = State.gregs[FEXCore::X86State::REG_RSP];\n\n  Context->Eip = State.rip;\n  Context->EFlags = CTX->ReconstructCompactedEFLAGS(Thread, false, nullptr, 0);\n\n  Context->SegEs = State.es_idx;\n  Context->SegCs = State.cs_idx;\n  Context->SegSs = State.ss_idx;\n  Context->SegDs = State.ds_idx;\n  Context->SegFs = State.fs_idx;\n  Context->SegGs = State.gs_idx;\n\n  // Floating-point register state\n\n  auto* XSave = reinterpret_cast<XSAVE_FORMAT*>(Context->ExtendedRegisters);\n\n  CTX->ReconstructXMMRegisters(Thread, reinterpret_cast<__uint128_t*>(XSave->XmmRegisters), nullptr);\n  memcpy(XSave->FloatRegisters, State.mm, sizeof(State.mm));\n\n  XSave->ControlWord = State.FCW;\n  XSave->StatusWord = (State.flags[FEXCore::X86State::X87FLAG_TOP_LOC] << 11) | (State.flags[FEXCore::X86State::X87FLAG_C0_LOC] << 8) |\n                      (State.flags[FEXCore::X86State::X87FLAG_C1_LOC] << 9) | (State.flags[FEXCore::X86State::X87FLAG_C2_LOC] << 10) |\n                      (State.flags[FEXCore::X86State::X87FLAG_C3_LOC] << 14) | State.flags[FEXCore::X86State::X87FLAG_IE_LOC];\n  XSave->TagWord = State.AbridgedFTW;\n\n  Context->FloatSave.ControlWord = XSave->ControlWord;\n  Context->FloatSave.StatusWord = XSave->StatusWord;\n  Context->FloatSave.TagWord = FEXCore::FPState::ConvertFromAbridgedFTW(XSave->StatusWord, State.mm, XSave->TagWord);\n  Context->FloatSave.ErrorOffset = XSave->ErrorOffset;\n  Context->FloatSave.ErrorSelector = XSave->ErrorSelector | (XSave->ErrorOpcode << 16);\n  Context->FloatSave.DataOffset = XSave->DataOffset;\n  Context->FloatSave.DataSelector = XSave->DataSelector;\n  Context->FloatSave.Cr0NpxState = XSave->StatusWord | 0xffff0000;\n}\n\nNTSTATUS FlushThreadStateContext(HANDLE Thread) {\n  const auto [Err, TLS] = GetThreadTLS(Thread);\n  if (Err) {\n    return Err;\n  }\n\n  WOW64_CONTEXT TmpWowContext {.ContextFlags = WOW64_CONTEXT_FULL | WOW64_CONTEXT_EXTENDED_REGISTERS};\n\n  Context::StoreWowContextFromState(TLS.ThreadState(), &TmpWowContext);\n  return RtlWow64SetThreadContext(Thread, &TmpWowContext);\n}\n\nvoid ReconstructThreadState(TLS TLS, CONTEXT* Context) {\n  const auto& Config = SignalDelegator->GetConfig();\n  auto* Thread = TLS.ThreadState();\n  auto& State = Thread->CurrentFrame->State;\n\n  State.rip = CTX->RestoreRIPFromHostPC(Thread, Context->Pc);\n\n  // Spill all SRA GPRs\n  for (size_t i = 0; i < Config.SRAGPRCount; i++) {\n    State.gregs[i] = Context->X[Config.SRAGPRMapping[i]];\n  }\n\n  // Spill all SRA FPRs\n  for (size_t i = 0; i < Config.SRAFPRCount; i++) {\n    memcpy(State.xmm.sse.data[i], &Context->V[Config.SRAFPRMapping[i]], sizeof(__uint128_t));\n  }\n\n  // Spill EFlags\n  uint32_t EFlags = CTX->ReconstructCompactedEFLAGS(Thread, true, Context->X, Context->Cpsr);\n  CTX->SetFlagsFromCompactedEFLAGS(Thread, EFlags);\n}\n\nWOW64_CONTEXT ReconstructWowContext(TLS TLS, CONTEXT* Context) {\n  if (!IsDispatcherAddress(Context->Pc)) {\n    ReconstructThreadState(TLS, Context);\n  }\n\n  WOW64_CONTEXT WowContext {\n    .ContextFlags = WOW64_CONTEXT_ALL,\n  };\n\n  auto* XSave = reinterpret_cast<XSAVE_FORMAT*>(WowContext.ExtendedRegisters);\n  XSave->ControlWord = 0x27f;\n  XSave->MxCsr = 0x1f80;\n\n  Context::StoreWowContextFromState(TLS.ThreadState(), &WowContext);\n  return WowContext;\n}\n\nstatic std::optional<FEX::Windows::TSOHandlerConfig> HandlerConfig;\n\nbool HandleUnalignedAccess(TLS TLS, CONTEXT* Context) {\n  auto Thread = TLS.ThreadState();\n  if (!Thread->CTX->IsAddressInCodeBuffer(Thread, Context->Pc)) {\n    return false;\n  }\n\n  const auto Result =\n    FEXCore::ArchHelpers::Arm64::HandleUnalignedAccess(Thread, HandlerConfig->GetUnalignedHandlerType(), Context->Pc, &Context->X0);\n  Context->Pc += Result.value_or(0);\n  return Result.has_value();\n}\n\nvoid LockJITContext(TLS TLS) {\n  uint32_t Expected = TLS.ControlWord().load(), New;\n\n  // Spin until PAUSED is unset, setting IN_JIT when that occurs\n  do {\n    Expected = Expected & ~ControlBits::PAUSED;\n    New = (Expected | ControlBits::IN_JIT) & ~ControlBits::WOW_CPU_AREA_DIRTY;\n  } while (!TLS.ControlWord().compare_exchange_weak(Expected, New, std::memory_order::relaxed));\n  std::atomic_signal_fence(std::memory_order::seq_cst);\n\n  // If the CPU area is dirty, flush it to the JIT context before reentry\n  if (Expected & ControlBits::WOW_CPU_AREA_DIRTY) {\n    WOW64_CONTEXT* WowContext;\n    RtlWow64GetCurrentCpuArea(nullptr, reinterpret_cast<void**>(&WowContext), nullptr);\n    Context::LoadStateFromWowContext(TLS.ThreadState(), GetWowTEB(NtCurrentTeb()), WowContext);\n  }\n}\n\nvoid UnlockJITContext(TLS TLS) {\n  std::atomic_signal_fence(std::memory_order::seq_cst);\n  TLS.ControlWord().fetch_and(~ControlBits::IN_JIT, std::memory_order::relaxed);\n}\n\nclass ScopedJITContextLock {\nprivate:\n  TLS TLSData;\n\npublic:\n  ScopedJITContextLock(TLS TLSData)\n    : TLSData {TLSData} {\n    LockJITContext(TLSData);\n  }\n\n  ~ScopedJITContextLock() {\n    UnlockJITContext(TLSData);\n  }\n};\n\nbool HandleSuspendInterrupt(TLS TLS, CONTEXT* Context, uint64_t FaultAddress) {\n  if (FaultAddress != reinterpret_cast<uint64_t>(&TLS.ThreadState()->InterruptFaultPage)) {\n    return false;\n  }\n\n  void* TmpAddress = reinterpret_cast<void*>(FaultAddress);\n  SIZE_T TmpSize = FEXCore::Utils::FEX_PAGE_SIZE;\n  ULONG TmpProt;\n  NtProtectVirtualMemory(NtCurrentProcess(), &TmpAddress, &TmpSize, PAGE_READWRITE, &TmpProt);\n\n  // Since interrupts only happen at the start of blocks, the reconstructed state should be entirely accurate\n  ReconstructThreadState(TLS, Context);\n\n  // Yield to the suspender\n  UnlockJITContext(TLS);\n  LockJITContext(TLS);\n\n  // Adjust context to return to the dispatcher, reloading SRA from thread state\n  const auto& Config = SignalDelegator->GetConfig();\n  Context->Pc = Config.AbsoluteLoopTopAddressFillSRA;\n  Context->X1 = 0; // Set ENTRY_FILL_SRA_SINGLE_INST_REG\n  return true;\n}\n} // namespace Context\n\n// Calls a 2-argument function `Func` setting the parent unwind frame information to the given SP and PC\n__attribute__((naked)) extern \"C\" uint64_t SEHFrameTrampoline2Args(void* Arg0, void* Arg1, void* Func, uint64_t Sp, uint64_t Pc) {\n  asm(\".seh_proc SEHFrameTrampoline2Args;\"\n      \"stp x3, x4, [sp, #-0x10]!;\"\n      \".seh_pushframe;\"\n      \"stp x29, x30, [sp, #-0x10]!;\"\n      \".seh_save_fplr_x 16;\"\n      \".seh_endprologue;\"\n      \"blr x2;\"\n      \"ldp x29, x30, [sp], 0x20;\"\n      \"ret;\"\n      \".seh_endproc;\");\n}\n\nclass WowSyscallHandler : public FEXCore::HLE::SyscallHandler, public FEXCore::Allocator::FEXAllocOperators {\npublic:\n  WowSyscallHandler() {\n    OSABI = FEXCore::HLE::SyscallOSABI::OS_GENERIC;\n  }\n\n  static uint64_t HandleSyscallImpl(FEXCore::Core::CpuStateFrame* Frame, FEXCore::HLE::SyscallArguments* Args) {\n    const uint64_t ReturnRIP = *(uint32_t*)(Frame->State.gregs[FEXCore::X86State::REG_RSP]); // Return address from the stack\n    uint64_t ReturnRSP = Frame->State.gregs[FEXCore::X86State::REG_RSP] + 4;                 // Stack pointer after popping return address\n    uint64_t ReturnRAX = 0;\n\n    if (Frame->State.rip == (uint64_t)BridgeInstrs::UnixCall) {\n      struct StackLayout {\n        unixlib_handle_t Handle;\n        UINT32 ID;\n        ULONG32 Args;\n      }* StackArgs = reinterpret_cast<StackLayout*>(ReturnRSP);\n\n      ReturnRSP += sizeof(StackLayout);\n\n      const auto TLS = GetTLS();\n      Context::UnlockJITContext(TLS);\n      ReturnRAX = static_cast<uint64_t>(WineUnixCall(StackArgs->Handle, StackArgs->ID, ULongToPtr(StackArgs->Args)));\n      Context::LockJITContext(TLS);\n    } else if (Frame->State.rip == (uint64_t)BridgeInstrs::Syscall) {\n      const uint64_t EntryRAX = Frame->State.gregs[FEXCore::X86State::REG_RAX];\n\n      const auto TLS = GetTLS();\n      Context::UnlockJITContext(TLS);\n      Wow64ProcessPendingCrossProcessItems();\n      ReturnRAX = static_cast<uint64_t>(Wow64SystemServiceEx(static_cast<UINT>(EntryRAX), reinterpret_cast<UINT*>(ReturnRSP + 4)));\n      Context::LockJITContext(TLS);\n    }\n    // If a new context has been set, use it directly and don't return to the syscall caller\n    if (Frame->State.rip == (uint64_t)BridgeInstrs::Syscall || Frame->State.rip == (uint64_t)BridgeInstrs::UnixCall) {\n      Frame->State.gregs[FEXCore::X86State::REG_RAX] = ReturnRAX;\n      Frame->State.gregs[FEXCore::X86State::REG_RSP] = ReturnRSP;\n      Frame->State.rip = ReturnRIP;\n    }\n\n    // NORETURNEDRESULT causes this result to be ignored since we restore all registers back from memory after a syscall anyway\n    return 0;\n  }\n\n  uint64_t HandleSyscall(FEXCore::Core::CpuStateFrame* Frame, FEXCore::HLE::SyscallArguments* Args) override {\n    const auto TLS = GetTLS();\n    // Stash the the context pointer on the stack, as Simulate can be called from this syscall handler which would overwrite it\n    CONTEXT* EntryContext = TLS.EntryContext();\n    // Call the syscall handler with unwind information pointing to Simulate as its caller\n    uint64_t Ret = SEHFrameTrampoline2Args(reinterpret_cast<void*>(Frame), reinterpret_cast<void*>(Args),\n                                           reinterpret_cast<void*>(&HandleSyscallImpl), EntryContext->Sp, EntryContext->Pc);\n    TLS.EntryContext() = EntryContext;\n    return Ret;\n  }\n\n  std::optional<FEXCore::ExecutableFileSectionInfo> LookupExecutableFileSection(FEXCore::Core::InternalThreadState*, uint64_t Address) override {\n    return ImageTracker->LookupExecutableFileSection(Address);\n  }\n\n  void MarkGuestExecutableRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Start, uint64_t Length) override {\n    InvalidationTracker->ReprotectRWXIntervals(Start, Length);\n  }\n\n  void InvalidateGuestCodeRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Start, uint64_t Length) override {\n    InvalidationTracker->InvalidateAlignedInterval(Start, Length, false);\n  }\n\n  void MarkOvercommitRange(uint64_t Start, uint64_t Length) override {\n    OvercommitTracker->MarkRange(Start, Length);\n  }\n\n  void UnmarkOvercommitRange(uint64_t Start, uint64_t Length) override {\n    OvercommitTracker->UnmarkRange(Start, Length);\n  }\n\n  FEXCore::HLE::ExecutableRangeInfo QueryGuestExecutableRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Address) override {\n    return InvalidationTracker->QueryExecutableRange(Address);\n  }\n\n  void PreCompile() override {\n    Wow64ProcessPendingCrossProcessItems();\n  }\n};\n\nvoid BTCpuProcessInit() {\n  FEX::Windows::InitCRTProcess();\n  const auto ExecutableName = FEX::Windows::BaseName(FEX::Windows::GetExecutableFilePath());\n  FEX::Config::LoadConfig(fextl::string {ExecutableName}, _environ, FEX::ReadPortabilityInformation());\n  FEXCore::Config::ReloadMetaLayer();\n  FEX::Windows::Logging::Init();\n\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_INTERPRETER_INSTALLED, \"0\");\n  FEXCore::Config::Set(FEXCore::Config::CONFIG_IS64BIT_MODE, \"0\");\n\n  FEXCore::Profiler::Init(\"\", \"\");\n\n  SignalDelegator = fextl::make_unique<FEX::DummyHandlers::DummySignalDelegator>();\n  SyscallHandler = fextl::make_unique<WowSyscallHandler>();\n  const auto NtDll = GetModuleHandle(\"ntdll.dll\");\n  const bool IsWine = !!GetProcAddress(NtDll, \"wine_get_version\");\n  OvercommitTracker.emplace(IsWine);\n\n  {\n    auto HostFeatures = FEX::Windows::CPUFeatures::FetchHostFeatures(IsWine);\n    // AVX is unsupported for WOW64\n    HostFeatures.SupportsAVX = false;\n    CTX = FEXCore::Context::Context::CreateNewContext(HostFeatures);\n  }\n\n  CTX->SetSignalDelegator(SignalDelegator.get());\n  CTX->SetSyscallHandler(SyscallHandler.get());\n  CTX->InitCore();\n  Context::HandlerConfig.emplace(*CTX);\n  InvalidationTracker.emplace(*CTX, Threads);\n  ImageTracker.emplace(*CTX, false);\n\n  auto MainModule = reinterpret_cast<__TEB*>(NtCurrentTeb())->Peb->ImageBaseAddress;\n  HandleImageMap(reinterpret_cast<uint64_t>(MainModule), true);\n\n  auto NtDllX86 = reinterpret_cast<SYSTEM_DLL_INIT_BLOCK*>(GetProcAddress(NtDll, \"LdrSystemDllInitBlock\"))->ntdll_handle;\n  HandleImageMap(NtDllX86);\n\n  CPUFeatures.emplace(*CTX);\n\n  // Allocate the syscall/unixcall trampolines in the lower 2GB of the address space\n  SIZE_T Size = 4;\n  void* Addr = nullptr;\n  NtAllocateVirtualMemory(NtCurrentProcess(), &Addr, (1U << 31) - 1, &Size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);\n  InvalidationTracker->HandleMemoryProtectionNotification(reinterpret_cast<uint64_t>(Addr), Size, PAGE_EXECUTE);\n  *reinterpret_cast<uint32_t*>(Addr) = 0x2ecd2ecd;\n  BridgeInstrs::Syscall = Addr;\n  BridgeInstrs::UnixCall = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(Addr) + 2);\n\n  const auto Sym = GetProcAddress(NtDll, \"__wine_unix_call_dispatcher\");\n  if (Sym) {\n    WineUnixCall = *reinterpret_cast<decltype(WineUnixCall)*>(Sym);\n  }\n\n  // wow64.dll will only initialise the cross-process queue if this is set\n  GetTLS().Wow64Info().CpuFlags = WOW64_CPUFLAGS_SOFTWARE;\n\n  FEX_CONFIG_OPT(TSOEnabled, TSOENABLED);\n  if (TSOEnabled()) {\n    BOOL Enable = TRUE;\n    NTSTATUS Status = NtSetInformationProcess(NtCurrentProcess(), ProcessFexHardwareTso, &Enable, sizeof(Enable));\n    if (Status == STATUS_SUCCESS) {\n      CTX->SetHardwareTSOSupport(true);\n    }\n  }\n\n  FEX_CONFIG_OPT(ProfileStats, PROFILESTATS);\n  FEX_CONFIG_OPT(StartupSleep, STARTUPSLEEP);\n  FEX_CONFIG_OPT(StartupSleepProcName, STARTUPSLEEPPROCNAME);\n\n  if (IsWine && ProfileStats()) {\n    StatAllocHandler = fextl::make_unique<FEX::Windows::StatAlloc>(FEXCore::SHMStats::AppType::WIN_WOW64);\n  }\n\n  if (StartupSleep() && (StartupSleepProcName().empty() || ExecutableName == StartupSleepProcName())) {\n    LogMan::Msg::IFmt(\"[{}][{}] Sleeping for {} seconds\", GetCurrentProcessId(), ExecutableName, StartupSleep());\n    std::this_thread::sleep_for(std::chrono::seconds(StartupSleep()));\n  }\n}\n\nvoid BTCpuProcessTerm(HANDLE Handle, BOOL After, ULONG Status) {}\n\nvoid BTCpuThreadInit() {\n  static constexpr size_t DefaultWow64CS {4};\n  std::scoped_lock Lock(ThreadCreationMutex);\n  FEX::Windows::InitCRTThread();\n  auto* Thread = CTX->CreateThread(0, 0);\n\n  // Default segment setup.\n  auto Frame = Thread->CurrentFrame;\n  auto NewSegments = new FEXCore::Core::CPUState::gdt_segment[32]();\n\n  // Setup initial code-segment GDT\n  auto& GDT = NewSegments[DefaultWow64CS];\n  FEXCore::Core::CPUState::SetGDTBase(&GDT, 0);\n  FEXCore::Core::CPUState::SetGDTLimit(&GDT, 0xF'FFFFU);\n  GDT.L = 0; // L = Long Mode = 32-bit\n  GDT.D = 1; // D = Default Operand Size = 32-bit\n\n  Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_GDT] = &NewSegments[0];\n  // TODO: LDTs are currently unsupported, mirror them to GDT.\n  Frame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_LDT] = &NewSegments[0];\n\n  Frame->State.cs_idx = DefaultWow64CS << 3;\n  Frame->State.cs_cached = FEXCore::Core::CPUState::CalculateGDTBase(GDT);\n\n  FEX::Windows::CallRetStack::InitializeThread(Thread);\n\n  const auto TLS = GetTLS();\n  TLS.ThreadState() = Thread;\n  TLS.ControlWord().fetch_or(ControlBits::WOW_CPU_AREA_DIRTY, std::memory_order::relaxed);\n\n  Thread->FrontendPtr = new FrontendThreadData();\n\n  auto ThreadTID = GetCurrentThreadId();\n  Threads.emplace(ThreadTID, Thread);\n  if (StatAllocHandler) {\n    Thread->ThreadStats = StatAllocHandler->AllocateSlot(ThreadTID);\n  }\n}\n\nvoid BTCpuThreadTerm(HANDLE Thread, LONG ExitCode) {\n  if (!FEX::Windows::ValidateHandleAccess(Thread, THREAD_TERMINATE)) {\n    return;\n  }\n\n  auto ThreadDup = FEX::Windows::DupHandle(Thread, THREAD_QUERY_INFORMATION | THREAD_SUSPEND_RESUME);\n\n  THREAD_BASIC_INFORMATION Info;\n  if (auto Err = NtQueryInformationThread(*ThreadDup, ThreadBasicInformation, &Info, sizeof(Info), nullptr); Err) {\n    return;\n  }\n\n  const auto ThreadTID = reinterpret_cast<uint64_t>(Info.ClientId.UniqueThread);\n  bool Self = ThreadTID == GetCurrentThreadId();\n  if (!Self) {\n    // If we are suspending a thread that isn't ourselves, try to suspend it first so we know internal JIT locks aren't being held.\n    RtlWow64SuspendThread(*ThreadDup, NULL);\n  }\n\n  auto [Err, TLS] = GetThreadTLS(*ThreadDup);\n  if (Err) {\n    return;\n  }\n\n  {\n    std::scoped_lock Lock(ThreadCreationMutex);\n    auto it = Threads.find(ThreadTID);\n    if (it == Threads.end()) {\n      // Thread already terminated\n      return;\n    }\n\n    Threads.erase(it);\n    if (StatAllocHandler) {\n      StatAllocHandler->DeallocateSlot(TLS.ThreadState()->ThreadStats);\n    }\n  }\n  auto ThreadState = TLS.ThreadState();\n\n  delete GetFrontendThreadData(ThreadState);\n\n  // GDT and LDT are mirrored, only free one.\n  delete[] ThreadState->CurrentFrame->State.segment_arrays[FEXCore::Core::CPUState::SEGMENT_ARRAY_INDEX_GDT];\n\n  FEX::Windows::CallRetStack::DestroyThread(ThreadState);\n  CTX->DestroyThread(ThreadState);\n  if (Self) {\n    FEX::Windows::DeinitCRTThread();\n  }\n}\n\nvoid* BTCpuGetBopCode() {\n  return BridgeInstrs::Syscall;\n}\n\nvoid* __wine_get_unix_opcode() {\n  return BridgeInstrs::UnixCall;\n}\n\nNTSTATUS BTCpuGetContext(HANDLE Thread, HANDLE Process, void* Unknown, WOW64_CONTEXT* Context) {\n  if (!FEX::Windows::ValidateHandleAccess(Thread, THREAD_GET_CONTEXT)) {\n    return STATUS_ACCESS_DENIED;\n  }\n\n  auto ThreadDup = FEX::Windows::DupHandle(Thread, THREAD_QUERY_INFORMATION | THREAD_GET_CONTEXT | THREAD_SET_CONTEXT);\n  auto [Err, TLS] = GetThreadTLS(*ThreadDup);\n  if (Err) {\n    return Err;\n  }\n\n  Context::ScopedJITContextLock Lk {TLS};\n  if (Err = Context::FlushThreadStateContext(*ThreadDup); Err) {\n    return Err;\n  }\n\n  return RtlWow64GetThreadContext(*ThreadDup, Context);\n}\n\nNTSTATUS BTCpuSetContext(HANDLE Thread, HANDLE Process, void* Unknown, WOW64_CONTEXT* Context) {\n  if (!FEX::Windows::ValidateHandleAccess(Thread, THREAD_SET_CONTEXT)) {\n    return STATUS_ACCESS_DENIED;\n  }\n\n  auto ThreadDup = FEX::Windows::DupHandle(Thread, THREAD_QUERY_INFORMATION | THREAD_GET_CONTEXT | THREAD_SET_CONTEXT);\n  auto [Err, TLS] = GetThreadTLS(*ThreadDup);\n  if (Err) {\n    return Err;\n  }\n\n  // Back-up the input context incase we've been passed the CPU area (the flush below would wipe it out otherwise)\n  WOW64_CONTEXT TmpContext = *Context;\n\n  Context::ScopedJITContextLock Lk {TLS};\n  if (Err = Context::FlushThreadStateContext(*ThreadDup); Err) {\n    return Err;\n  }\n\n  // Merge the input context into the CPU area then pass the full context into the JIT\n  if (Err = RtlWow64SetThreadContext(*ThreadDup, &TmpContext); Err) {\n    return Err;\n  }\n\n  TmpContext.ContextFlags = WOW64_CONTEXT_FULL | WOW64_CONTEXT_EXTENDED_REGISTERS;\n\n  if (Err = RtlWow64GetThreadContext(*ThreadDup, &TmpContext); Err) {\n    return Err;\n  }\n\n  if (Thread == GetCurrentThread() && TLS.CachedCallRetSp()) {\n    TLS.ThreadState()->CurrentFrame->State.callret_sp = TLS.CachedCallRetSp();\n  }\n\n  Context::LoadStateFromWowContext(TLS.ThreadState(), GetWowTEB(TLS.TEB), &TmpContext);\n  return STATUS_SUCCESS;\n}\n\n// .seh_pushframe doesn't restore the frame pointer, so if when unwinding from RtlCaptureContext an operation is used\n// that sets SP from FP, the unwound SP value will be incorrect. Wrap RtlCaptureContext so the correct FP is immediately\n// restored from the stack to prevent this.\n__attribute__((naked)) void BTCpuSimulate() {\n  asm(\".seh_proc BTCpuSimulate;\"\n      \"sub sp, sp, #0x390;\"\n      \".seh_stackalloc 0x390;\"\n      \"stp x29, x30, [sp, #-0x10]!;\"\n      \".seh_save_fplr_x 16;\"\n      \".seh_endprologue;\"\n      \"add x0, sp, #0x10;\"\n      \"bl RtlCaptureContext;\"\n      \"add x0, sp, #0x10;\"\n      \"bl BTCpuSimulateImpl;\"\n      \"ldp x29, x30, [sp], 0x10;\"\n      \"add sp, sp, #0x390;\"\n      \"ret;\"\n      \".seh_endproc;\");\n}\n\nextern \"C\" void BTCpuSimulateImpl(CONTEXT* entry_context) {\n  const auto TLS = GetTLS();\n  TLS.EntryContext() = entry_context;\n  TLS.CachedCallRetSp() = TLS.ThreadState()->CurrentFrame->State.callret_sp;\n\n  Context::ScopedJITContextLock Lk {TLS};\n  CTX->ExecuteThread(TLS.ThreadState());\n}\n\nNTSTATUS BTCpuSuspendLocalThread(HANDLE Thread, ULONG* Count) {\n  if (!FEX::Windows::ValidateHandleAccess(Thread, THREAD_SUSPEND_RESUME)) {\n    return STATUS_ACCESS_DENIED;\n  }\n\n  auto ThreadDup = FEX::Windows::DupHandle(Thread, THREAD_QUERY_INFORMATION | THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_SET_CONTEXT);\n  THREAD_BASIC_INFORMATION Info;\n  if (NTSTATUS Err = NtQueryInformationThread(*ThreadDup, ThreadBasicInformation, &Info, sizeof(Info), nullptr); Err) {\n    return Err;\n  }\n\n  const auto ThreadTID = reinterpret_cast<uint64_t>(Info.ClientId.UniqueThread);\n  if (ThreadTID == GetCurrentThreadId()) {\n    LogMan::Msg::DFmt(\"Suspending self\");\n    // Mark the CPU area as dirty, to force the JIT context to be restored from it on entry as it may be changed using\n    // SetThreadContext (which doesn't use the BTCpu API)\n    if (!(GetTLS().ControlWord().fetch_or(ControlBits::WOW_CPU_AREA_DIRTY, std::memory_order::relaxed) & ControlBits::WOW_CPU_AREA_DIRTY)) {\n      if (NTSTATUS Err = Context::FlushThreadStateContext(*ThreadDup); Err) {\n        return Err;\n      }\n    }\n\n    return NtSuspendThread(*ThreadDup, Count);\n  }\n\n  LogMan::Msg::DFmt(\"Suspending thread: {:X}\", ThreadTID);\n\n  auto [Err, TLS] = GetThreadTLS(*ThreadDup);\n  if (Err) {\n    return Err;\n  }\n\n  std::scoped_lock Lock(ThreadCreationMutex);\n\n  // If the thread hasn't yet been initialized, suspend it without special handling as it wont yet have entered the JIT\n  if (!Threads.contains(ThreadTID)) {\n    LogMan::Msg::DFmt(\"Thread suspended: {:X}\", ThreadTID);\n    return NtSuspendThread(*ThreadDup, Count);\n  }\n\n  // If CONTROL_IN_JIT is unset at this point, then it can never be set (and thus the JIT cannot be reentered) as\n  // CONTROL_PAUSED has been set, as such, while this may redundantly request interrupts in rare cases it will never\n  // miss them\n  if (TLS.ControlWord().fetch_or(ControlBits::PAUSED, std::memory_order::relaxed) & ControlBits::IN_JIT) {\n    LogMan::Msg::DFmt(\"Thread {:X} is in JIT, polling for interrupt\", ThreadTID);\n\n    ULONG TmpProt;\n    void* TmpAddress = &TLS.ThreadState()->InterruptFaultPage;\n    SIZE_T TmpSize = FEXCore::Utils::FEX_PAGE_SIZE;\n    NtProtectVirtualMemory(NtCurrentProcess(), &TmpAddress, &TmpSize, PAGE_READONLY, &TmpProt);\n  }\n\n  // Spin until the JIT is interrupted\n  while (TLS.ControlWord().load() & ControlBits::IN_JIT)\n    ;\n\n  // The JIT has now been interrupted and the context stored in the thread's CPU area is up-to-date\n  if (Err = NtSuspendThread(*ThreadDup, Count); Err) {\n    TLS.ControlWord().fetch_and(~ControlBits::PAUSED, std::memory_order::relaxed);\n    return Err;\n  }\n\n  CONTEXT TmpContext {\n    .ContextFlags = CONTEXT_INTEGER,\n  };\n\n  // NtSuspendThread may return before the thread is actually suspended, so a sync operation like NtGetContextThread\n  // needs to be called to ensure it is before we unset CONTROL_PAUSED\n  std::ignore = NtGetContextThread(*ThreadDup, &TmpContext);\n\n  // Mark the CPU area as dirty, to force the JIT context to be restored from it on entry as it may be changed using\n  // SetThreadContext (which doesn't use the BTCpu API)\n  if (!(TLS.ControlWord().fetch_or(ControlBits::WOW_CPU_AREA_DIRTY, std::memory_order::relaxed) & ControlBits::WOW_CPU_AREA_DIRTY)) {\n    if (Err = Context::FlushThreadStateContext(*ThreadDup); Err) {\n      return Err;\n    }\n  }\n\n  LogMan::Msg::DFmt(\"Thread suspended: {:X}\", ThreadTID);\n\n  // Now the thread is suspended on the host, unset CONTROL_PAUSED so that NtResumeThread will\n  // continue execution in the JIT\n  TLS.ControlWord().fetch_and(~ControlBits::PAUSED, std::memory_order::relaxed);\n\n  return Err;\n}\n\n// Returns true if exception dispatch should be halted and the execution context restored to Ptrs->Context\nbool BTCpuResetToConsistentStateImpl(EXCEPTION_POINTERS* Ptrs) {\n  auto* Context = Ptrs->ContextRecord;\n  auto* Exception = Ptrs->ExceptionRecord;\n  auto TLS = GetTLS();\n  auto Thread = TLS.ThreadState();\n  FEXCORE_PROFILE_ACCUMULATION(Thread, AccumulatedSignalTime);\n\n  if (Exception->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) {\n    const auto FaultAddress = static_cast<uint64_t>(Exception->ExceptionInformation[1]);\n\n    if (FEX::Windows::CallRetStack::HandleAccessViolation(Thread, FaultAddress, Context->X25)) {\n      return true;\n    }\n\n    if (OvercommitTracker && OvercommitTracker->HandleAccessViolation(FaultAddress)) {\n      return true;\n    }\n\n    if (Context::HandleSuspendInterrupt(TLS, Context, FaultAddress)) {\n      LogMan::Msg::DFmt(\"Resumed from suspend\");\n      return true;\n    }\n\n    if (FEX::Windows::JITGuardPage::HandleJITGuardPage(Thread, reinterpret_cast<void*>(FaultAddress), Context->X,\n                                                       reinterpret_cast<__uint128_t*>(Context->V), &Context->Pc)) {\n      return true;\n    }\n\n    if (Thread) {\n      std::scoped_lock Lock(ThreadCreationMutex);\n      FEXCORE_PROFILE_INSTANT_INCREMENT(Thread, AccumulatedSMCCount, 1);\n      if (InvalidationTracker->HandleRWXAccessViolation(Thread, Context->Pc, FaultAddress)) {\n        if (CTX->IsAddressInCodeBuffer(Thread, Context->Pc) && !CTX->IsCurrentBlockSingleInst(Thread) &&\n            CTX->IsAddressInCurrentBlock(Thread, FaultAddress & FEXCore::Utils::FEX_PAGE_MASK, FEXCore::Utils::FEX_PAGE_SIZE)) {\n          Context::ReconstructThreadState(TLS, Context);\n          LogMan::Msg::DFmt(\"Handled inline self-modifying code: pc: {:X} rip: {:X} fault: {:X}\", Context->Pc,\n                            Thread->CurrentFrame->State.rip, FaultAddress);\n\n          // Adjust context to return to the dispatcher, reloading SRA from thread state\n          const auto& Config = SignalDelegator->GetConfig();\n          Context->Pc = Config.AbsoluteLoopTopAddressFillSRA;\n          Context->X1 = 1; // Set ENTRY_FILL_SRA_SINGLE_INST_REG to force a single step\n        } else {\n          LogMan::Msg::DFmt(\"Handled self-modifying code: pc: {:X} fault: {:X}\", Context->Pc, FaultAddress);\n        }\n        return true;\n      }\n    }\n  }\n\n  if (!Thread || !IsAddressInJit(Context->Pc)) {\n    return false;\n  }\n\n  FEXCORE_PROFILE_INSTANT_INCREMENT(Thread, AccumulatedSIGBUSCount, 1);\n  if (Exception->ExceptionCode == EXCEPTION_DATATYPE_MISALIGNMENT && Context::HandleUnalignedAccess(TLS, Context)) {\n    LogMan::Msg::DFmt(\"Handled unaligned atomic: new pc: {:X}\", Context->Pc);\n    return true;\n  }\n\n  LogMan::Msg::DFmt(\"Reconstructing context\");\n\n  WOW64_CONTEXT WowContext = Context::ReconstructWowContext(TLS, Context);\n  LogMan::Msg::DFmt(\"pc: {:X} eip: {:X}\", Context->Pc, WowContext.Eip);\n\n  auto& Fault = Thread->CurrentFrame->SynchronousFaultData;\n  *Exception = FEX::Windows::HandleGuestException(Fault, *Exception, WowContext.Eip, WowContext.Eax);\n  if (Exception->ExceptionCode == EXCEPTION_SINGLE_STEP) {\n    WowContext.EFlags &= ~(1 << FEXCore::X86State::RFLAG_TF_RAW_LOC);\n  }\n  // wow64.dll will handle adjusting PC in the dispatched context after a breakpoint\n\n  BTCpuSetContext(GetCurrentThread(), GetCurrentProcess(), nullptr, &WowContext);\n  Context::UnlockJITContext(TLS);\n\n  // Replace the host context with one captured before JIT entry so host code can unwind\n  memcpy(Context, TLS.EntryContext(), sizeof(*Context));\n\n  return false;\n}\n\nNTSTATUS BTCpuResetToConsistentState(EXCEPTION_POINTERS* Ptrs) {\n  if (BTCpuResetToConsistentStateImpl(Ptrs)) {\n    NtContinue(Ptrs->ContextRecord, FALSE);\n  }\n\n  return STATUS_SUCCESS;\n}\n\nvoid BTCpuFlushInstructionCache2(const void* Address, SIZE_T Size) {\n  std::scoped_lock Lock(ThreadCreationMutex);\n  InvalidationTracker->InvalidateAlignedInterval(reinterpret_cast<uint64_t>(Address), static_cast<uint64_t>(Size), false);\n}\n\nvoid BTCpuFlushInstructionCacheHeavy(const void* Address, SIZE_T Size) {\n  std::scoped_lock Lock(ThreadCreationMutex);\n  InvalidationTracker->InvalidateAlignedInterval(reinterpret_cast<uint64_t>(Address), static_cast<uint64_t>(Size), false);\n}\n\nvoid BTCpuNotifyMemoryDirty(void* Address, SIZE_T Size) {\n  std::scoped_lock Lock(ThreadCreationMutex);\n  InvalidationTracker->InvalidateAlignedInterval(reinterpret_cast<uint64_t>(Address), static_cast<uint64_t>(Size), false);\n}\n\nvoid BTCpuNotifyMemoryAlloc(void* Address, SIZE_T Size, ULONG Type, ULONG Prot, BOOL After, ULONG Status) {\n  if (!After) {\n    ThreadCreationMutex.lock();\n  } else {\n    // MEM_RESET(_UNDO) ignores the passed permissions\n    if (!Status && !(Type & (MEM_RESET | MEM_RESET_UNDO))) {\n      InvalidationTracker->HandleMemoryProtectionNotification(reinterpret_cast<uint64_t>(Address), static_cast<uint64_t>(Size), Prot);\n    }\n    ThreadCreationMutex.unlock();\n  }\n}\n\nvoid BTCpuNotifyMemoryProtect(void* Address, SIZE_T Size, ULONG NewProt, BOOL After, ULONG Status) {\n  if (!After) {\n    ThreadCreationMutex.lock();\n  } else {\n    if (!Status) {\n      InvalidationTracker->HandleMemoryProtectionNotification(reinterpret_cast<uint64_t>(Address), static_cast<uint64_t>(Size), NewProt);\n    }\n    ThreadCreationMutex.unlock();\n  }\n}\n\nvoid BTCpuNotifyMemoryFree(void* Address, SIZE_T Size, ULONG FreeType, BOOL After, ULONG Status) {\n  if (!After) {\n    ThreadCreationMutex.lock();\n  } else {\n    if (!Status) {\n      InvalidationTracker->InvalidateAlignedInterval(reinterpret_cast<uint64_t>(Address), static_cast<uint64_t>(Size), true);\n    }\n    ThreadCreationMutex.unlock();\n  }\n}\n\nNTSTATUS BTCpuNotifyMapViewOfSection(void* Unk1, void* Address, void* Unk2, SIZE_T Size, ULONG AllocType, ULONG Prot) {\n  std::scoped_lock Lock(ThreadCreationMutex);\n  HandleImageMap(reinterpret_cast<uint64_t>(Address));\n  return STATUS_SUCCESS;\n}\n\nvoid BTCpuNotifyUnmapViewOfSection(void* Address, BOOL After, ULONG Status) {\n  if (!After) {\n    ThreadCreationMutex.lock();\n    auto [Start, Size] = InvalidationTracker->InvalidateContainingSection(reinterpret_cast<uint64_t>(Address), true);\n    if (Size) {\n      HandleImageUnmap(Start, Size);\n    }\n  } else {\n    ThreadCreationMutex.unlock();\n  }\n}\n\nvoid BTCpuNotifyReadFile(HANDLE Handle, void* Address, SIZE_T Size, BOOL After, NTSTATUS Status) {\n  auto& InLockedRWXRead = GetFrontendThreadData(GetTLS().ThreadState())->InLockedRWXRead;\n  if (!After) {\n    ThreadCreationMutex.lock();\n    CTX->GetCodeInvalidationMutex().lock();\n    if (InvalidationTracker->BeginUntrackedWriteLocked(reinterpret_cast<uint64_t>(Address), static_cast<uint64_t>(Size))) {\n      InLockedRWXRead = true;\n    } else {\n      CTX->GetCodeInvalidationMutex().unlock();\n      ThreadCreationMutex.unlock();\n    }\n  } else {\n    if (InLockedRWXRead) {\n      InLockedRWXRead = false;\n      CTX->GetCodeInvalidationMutex().unlock();\n      ThreadCreationMutex.unlock();\n    }\n  }\n}\n\nBOOLEAN WINAPI BTCpuIsProcessorFeaturePresent(UINT Feature) {\n  return CPUFeatures->IsFeaturePresent(Feature) ? TRUE : FALSE;\n}\n\nvoid BTCpuUpdateProcessorInformation(SYSTEM_CPU_INFORMATION* Info) {\n  CPUFeatures->UpdateInformation(Info);\n}\n"
  },
  {
    "path": "Source/Windows/WOW64/libwow64fex.def",
    "content": "LIBRARY libwow64fex.dll\n\nEXPORTS\n  BTCpuFlushInstructionCache2\n  BTCpuFlushInstructionCacheHeavy\n  BTCpuGetBopCode\n  BTCpuGetContext\n  BTCpuIsProcessorFeaturePresent\n  BTCpuNotifyMemoryAlloc\n  BTCpuNotifyMemoryProtect\n  BTCpuNotifyMemoryDirty\n  BTCpuNotifyMemoryFree\n  BTCpuNotifyMapViewOfSection\n  BTCpuNotifyUnmapViewOfSection\n  BTCpuNotifyReadFile\n  BTCpuProcessInit\n  BTCpuResetToConsistentState\n  BTCpuSetContext\n  BTCpuSimulate\n  BTCpuSuspendLocalThread\n  BTCpuThreadInit\n  BTCpuProcessTerm\n  BTCpuThreadTerm\n  BTCpuUpdateProcessorInformation\n  __wine_get_unix_opcode\n"
  },
  {
    "path": "Source/Windows/include/wine/debug.h",
    "content": "// SPDX-License-Identifier: LGPL-2.1-or-later\n// SPDX-FileCopyrightText: Copyright 1999 Patrik Stridvall\n\n#pragma once\n\n#include <windef.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint __cdecl __wine_dbg_output(const char* str);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "Source/Windows/include/wine/unixlib.h",
    "content": "// SPDX-License-Identifier: LGPL-2.1-or-later\n// SPDX-FileCopyrightText: Copyright (C) 2021 Alexandre Julliard\n\n#pragma once\n\n#include <winternl.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef UINT64 unixlib_handle_t;\n\nextern NTSTATUS(WINAPI* __wine_unix_call_dispatcher)(unixlib_handle_t, unsigned int, void*);\n\nstatic inline NTSTATUS __wine_unix_call(unixlib_handle_t handle, unsigned int code, void* args) {\n  return __wine_unix_call_dispatcher(handle, code, args);\n}\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "Source/Windows/include/winnt.h",
    "content": "// SPDX-License-Identifier: LGPL-2.1-or-later\n// SPDX-FileCopyrightText: Copyright (C) the Wine project\n\n#pragma once\n\n#include_next <winnt.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct ___IMAGE_LOAD_CONFIG_CODE_INTEGRITY {\n  WORD Flags;\n  WORD Catalog;\n  DWORD CatalogOffset;\n  DWORD Reserved;\n} __IMAGE_LOAD_CONFIG_CODE_INTEGRITY, *__PIMAGE_LOAD_CONFIG_CODE_INTEGRITY;\n\ntypedef struct __IMAGE_LOAD_CONFIG_DIRECTORY64 {\n  DWORD Size; /* 000 */\n  DWORD TimeDateStamp;\n  WORD MajorVersion;\n  WORD MinorVersion;\n  DWORD GlobalFlagsClear;\n  DWORD GlobalFlagsSet; /* 010 */\n  DWORD CriticalSectionDefaultTimeout;\n  ULONGLONG DeCommitFreeBlockThreshold;\n  ULONGLONG DeCommitTotalFreeThreshold; /* 020 */\n  ULONGLONG LockPrefixTable;\n  ULONGLONG MaximumAllocationSize; /* 030 */\n  ULONGLONG VirtualMemoryThreshold;\n  ULONGLONG ProcessAffinityMask; /* 040 */\n  DWORD ProcessHeapFlags;\n  WORD CSDVersion;\n  WORD DependentLoadFlags;\n  ULONGLONG EditList; /* 050 */\n  ULONGLONG SecurityCookie;\n  ULONGLONG SEHandlerTable; /* 060 */\n  ULONGLONG SEHandlerCount;\n  ULONGLONG GuardCFCheckFunctionPointer; /* 070 */\n  ULONGLONG GuardCFDispatchFunctionPointer;\n  ULONGLONG GuardCFFunctionTable; /* 080 */\n  ULONGLONG GuardCFFunctionCount;\n  DWORD GuardFlags; /* 090 */\n  __IMAGE_LOAD_CONFIG_CODE_INTEGRITY CodeIntegrity;\n  ULONGLONG GuardAddressTakenIatEntryTable; /* 0a0 */\n  ULONGLONG GuardAddressTakenIatEntryCount;\n  ULONGLONG GuardLongJumpTargetTable; /* 0b0 */\n  ULONGLONG GuardLongJumpTargetCount;\n  ULONGLONG DynamicValueRelocTable; /* 0c0 */\n  ULONGLONG CHPEMetadataPointer;\n  ULONGLONG GuardRFFailureRoutine; /* 0d0 */\n  ULONGLONG GuardRFFailureRoutineFunctionPointer;\n  DWORD DynamicValueRelocTableOffset; /* 0e0 */\n  WORD DynamicValueRelocTableSection;\n  WORD Reserved2;\n  ULONGLONG GuardRFVerifyStackPointerFunctionPointer;\n  DWORD HotPatchTableOffset; /* 0f0 */\n  DWORD Reserved3;\n  ULONGLONG EnclaveConfigurationPointer;\n  ULONGLONG VolatileMetadataPointer; /* 100 */\n  ULONGLONG GuardEHContinuationTable;\n  ULONGLONG GuardEHContinuationCount; /* 110 */\n  ULONGLONG GuardXFGCheckFunctionPointer;\n  ULONGLONG GuardXFGDispatchFunctionPointer; /* 120 */\n  ULONGLONG GuardXFGTableDispatchFunctionPointer;\n  ULONGLONG CastGuardOsDeterminedFailureMode; /* 130 */\n  ULONGLONG GuardMemcpyFunctionPointer;\n} _IMAGE_LOAD_CONFIG_DIRECTORY64, *_PIMAGE_LOAD_CONFIG_DIRECTORY64;\n\ntypedef struct __IMAGE_LOAD_CONFIG_DIRECTORY32 {\n  DWORD Size; /* 000 */\n  DWORD TimeDateStamp;\n  WORD MajorVersion;\n  WORD MinorVersion;\n  DWORD GlobalFlagsClear;\n  DWORD GlobalFlagsSet; /* 010 */\n  DWORD CriticalSectionDefaultTimeout;\n  DWORD DeCommitFreeBlockThreshold;\n  DWORD DeCommitTotalFreeThreshold;\n  DWORD LockPrefixTable; /* 020 */\n  DWORD MaximumAllocationSize;\n  DWORD VirtualMemoryThreshold;\n  DWORD ProcessHeapFlags;\n  DWORD ProcessAffinityMask; /* 030 */\n  WORD CSDVersion;\n  WORD DependentLoadFlags;\n  DWORD EditList;\n  DWORD SecurityCookie;\n  DWORD SEHandlerTable; /* 040 */\n  DWORD SEHandlerCount;\n  DWORD GuardCFCheckFunctionPointer;\n  DWORD GuardCFDispatchFunctionPointer;\n  DWORD GuardCFFunctionTable; /* 050 */\n  DWORD GuardCFFunctionCount;\n  DWORD GuardFlags;\n  IMAGE_LOAD_CONFIG_CODE_INTEGRITY CodeIntegrity;\n  DWORD GuardAddressTakenIatEntryTable;\n  DWORD GuardAddressTakenIatEntryCount;\n  DWORD GuardLongJumpTargetTable; /* 070 */\n  DWORD GuardLongJumpTargetCount;\n  DWORD DynamicValueRelocTable;\n  DWORD CHPEMetadataPointer;\n  DWORD GuardRFFailureRoutine; /* 080 */\n  DWORD GuardRFFailureRoutineFunctionPointer;\n  DWORD DynamicValueRelocTableOffset;\n  WORD DynamicValueRelocTableSection;\n  WORD Reserved2;\n  DWORD GuardRFVerifyStackPointerFunctionPointer; /* 090 */\n  DWORD HotPatchTableOffset;\n  DWORD Reserved3;\n  DWORD EnclaveConfigurationPointer;\n  DWORD VolatileMetadataPointer; /* 0a0 */\n  DWORD GuardEHContinuationTable;\n  DWORD GuardEHContinuationCount;\n  DWORD GuardXFGCheckFunctionPointer;\n  DWORD GuardXFGDispatchFunctionPointer; /* 0b0 */\n  DWORD GuardXFGTableDispatchFunctionPointer;\n  DWORD CastGuardOsDeterminedFailureMode;\n  DWORD GuardMemcpyFunctionPointer;\n} _IMAGE_LOAD_CONFIG_DIRECTORY32, *_PIMAGE_LOAD_CONFIG_DIRECTORY32;\n\ntypedef struct _IMAGE_CHPE_RANGE_ENTRY {\n  union {\n    ULONG StartOffset;\n    struct {\n      ULONG NativeCode  : 1;\n      ULONG AddressBits : 31;\n    } DUMMYSTRUCTNAME;\n  } DUMMYUNIONNAME;\n  ULONG Length;\n} IMAGE_CHPE_RANGE_ENTRY, *PIMAGE_CHPE_RANGE_ENTRY;\n\ntypedef struct _IMAGE_ARM64EC_METADATA {\n  ULONG Version;\n  ULONG CodeMap;\n  ULONG CodeMapCount;\n  ULONG CodeRangesToEntryPoints;\n  ULONG RedirectionMetadata;\n  ULONG __os_arm64x_dispatch_call_no_redirect;\n  ULONG __os_arm64x_dispatch_ret;\n  ULONG __os_arm64x_dispatch_call;\n  ULONG __os_arm64x_dispatch_icall;\n  ULONG __os_arm64x_dispatch_icall_cfg;\n  ULONG AlternateEntryPoint;\n  ULONG AuxiliaryIAT;\n  ULONG CodeRangesToEntryPointsCount;\n  ULONG RedirectionMetadataCount;\n  ULONG GetX64InformationFunctionPointer;\n  ULONG SetX64InformationFunctionPointer;\n  ULONG ExtraRFETable;\n  ULONG ExtraRFETableSize;\n  ULONG __os_arm64x_dispatch_fptr;\n  ULONG AuxiliaryIATCopy;\n  ULONG __os_arm64x_helper0;\n  ULONG __os_arm64x_helper1;\n  ULONG __os_arm64x_helper2;\n  ULONG __os_arm64x_helper3;\n  ULONG __os_arm64x_helper4;\n  ULONG __os_arm64x_helper5;\n  ULONG __os_arm64x_helper6;\n  ULONG __os_arm64x_helper7;\n  ULONG __os_arm64x_helper8;\n} IMAGE_ARM64EC_METADATA;\n\ntypedef struct _IMAGE_ARM64EC_REDIRECTION_ENTRY {\n  ULONG Source;\n  ULONG Destination;\n} IMAGE_ARM64EC_REDIRECTION_ENTRY;\n\ntypedef struct _IMAGE_ARM64EC_CODE_RANGE_ENTRY_POINT {\n  ULONG StartRva;\n  ULONG EndRva;\n  ULONG EntryPoint;\n} IMAGE_ARM64EC_CODE_RANGE_ENTRY_POINT;\n\ntypedef struct _CONTEXT_CHUNK {\n  LONG Offset;\n  ULONG Length;\n} CONTEXT_CHUNK, *PCONTEXT_CHUNK;\n\ntypedef struct _CONTEXT_EX {\n  CONTEXT_CHUNK All;\n  CONTEXT_CHUNK Legacy;\n  CONTEXT_CHUNK XState;\n#ifdef _WIN64\n  ULONG64 align;\n#endif\n} CONTEXT_EX, *PCONTEXT_EX;\n\n// From process hacker\ntypedef struct _IMAGE_VOLATILE_METADATA {\n  ULONG Size;\n  ULONG Version;\n  ULONG VolatileAccessTable;\n  ULONG VolatileAccessTableSize;\n  ULONG VolatileInfoRangeTable;\n  ULONG VolatileInfoRangeTableSize;\n} IMAGE_VOLATILE_METADATA, *PIMAGE_VOLATILE_METADATA;\n\ntypedef struct _IMAGE_VOLATILE_RVA_METADATA {\n  ULONG Rva;\n} IMAGE_VOLATILE_RVA_METADATA, *PIMAGE_VOLATILE_RVA_METADATA;\n\ntypedef struct _IMAGE_VOLATILE_RANGE_METADATA {\n  ULONG Rva;\n  ULONG Size;\n} IMAGE_VOLATILE_RANGE_METADATA, *PIMAGE_VOLATILE_RANGE_METADATA;\n\nNTSYSAPI DWORD WINAPI RtlRunOnceExecuteOnce(PRTL_RUN_ONCE, PRTL_RUN_ONCE_INIT_FN, PVOID, PVOID*);\n\n// This is a FEX extension, and requires corresponding wine patches\n#define CONTEXT_ARM64_FEX_YMMSTATE (CONTEXT_ARM64 | 0x00000040)\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "Source/Windows/include/winternl.h",
    "content": "// SPDX-License-Identifier: LGPL-2.1-or-later\n// SPDX-FileCopyrightText: Copyright (C) the Wine project\n\n#pragma once\n\n#include_next <winternl.h>\n#include <winnt.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define SH_COMPAT 0x00 /* Compatibility */\n#define SH_DENYRW 0x10 /* Deny read/write */\n#define SH_DENYWR 0x20 /* Deny write */\n#define SH_DENYRD 0x30 /* Deny read */\n#define SH_DENYNO 0x40 /* Deny nothing */\n\n#define _SH_COMPAT SH_COMPAT\n#define _SH_DENYRW SH_DENYRW\n#define _SH_DENYWR SH_DENYWR\n#define _SH_DENYRD SH_DENYRD\n#define _SH_DENYNO SH_DENYNO\n\n#define NtCurrentProcess() ((HANDLE) ~(ULONG_PTR)0)\n#define NtCurrentThread() ((HANDLE) ~(ULONG_PTR)1)\n\n#define WOW64_TLS_WOW64INFO 10\n#define WOW64_TLS_MAX_NUMBER 19\n\n#define WOW64_CPUFLAGS_SOFTWARE 0x02\n\n#define STATUS_EMULATION_SYSCALL ((NTSTATUS)0x40000039)\n\n#ifdef ARCHITECTURE_arm64ec\ntypedef struct _CHPE_V2_CPU_AREA_INFO {\n  BOOLEAN InSimulation;             /* 000 */\n  BOOLEAN InSyscallCallback;        /* 001 */\n  ULONG64 EmulatorStackBase;        /* 008 */\n  ULONG64 EmulatorStackLimit;       /* 010 */\n  ARM64EC_NT_CONTEXT* ContextAmd64; /* 018 */\n  ULONG* SuspendDoorbell;           /* 020 */\n  ULONG64 LoadingModuleModflag;     /* 028 */\n  void* EmulatorData[4];            /* 030 */\n  ULONG64 EmulatorDataInline;       /* 050 */\n} CHPE_V2_CPU_AREA_INFO, *PCHPE_V2_CPU_AREA_INFO;\n#endif\n\ntypedef struct {\n  ULONG version;\n  ULONG unknown1[3];\n  ULONG64 unknown2;\n  ULONG64 pLdrInitializeThunk;\n  ULONG64 pKiUserExceptionDispatcher;\n  ULONG64 pKiUserApcDispatcher;\n  ULONG64 pKiUserCallbackDispatcher;\n  ULONG64 pRtlUserThreadStart;\n  ULONG64 pRtlpQueryProcessDebugInformationRemote;\n  ULONG64 ntdll_handle;\n  ULONG64 pLdrSystemDllInitBlock;\n  ULONG64 pRtlpFreezeTimeBias;\n} SYSTEM_DLL_INIT_BLOCK;\n\ntypedef struct _UNICODE_STRING64 {\n  USHORT Length;\n  USHORT MaximumLength;\n  ULONG64 Buffer;\n} UNICODE_STRING64;\n\ntypedef struct _CURDIR64 {\n  UNICODE_STRING64 DosPath;\n  ULONG64 Handle;\n} CURDIR64;\n\ntypedef struct RTL_DRIVE_LETTER_CURDIR64 {\n  USHORT Flags;\n  USHORT Length;\n  ULONG TimeStamp;\n  UNICODE_STRING64 DosPath;\n} RTL_DRIVE_LETTER_CURDIR64;\n\ntypedef struct _RTL_USER_PROCESS_PARAMETERS64 {\n  ULONG AllocationSize;\n  ULONG Size;\n  ULONG Flags;\n  ULONG DebugFlags;\n  ULONG64 ConsoleHandle;\n  ULONG ConsoleFlags;\n  ULONG64 hStdInput;\n  ULONG64 hStdOutput;\n  ULONG64 hStdError;\n  CURDIR64 CurrentDirectory;\n  UNICODE_STRING64 DllPath;\n  UNICODE_STRING64 ImagePathName;\n  UNICODE_STRING64 CommandLine;\n  ULONG64 Environment;\n  ULONG dwX;\n  ULONG dwY;\n  ULONG dwXSize;\n  ULONG dwYSize;\n  ULONG dwXCountChars;\n  ULONG dwYCountChars;\n  ULONG dwFillAttribute;\n  ULONG dwFlags;\n  ULONG wShowWindow;\n  UNICODE_STRING64 WindowTitle;\n  UNICODE_STRING64 Desktop;\n  UNICODE_STRING64 ShellInfo;\n  UNICODE_STRING64 RuntimeInfo;\n  RTL_DRIVE_LETTER_CURDIR64 DLCurrentDirectory[0x20];\n  ULONG64 EnvironmentSize;\n  ULONG64 EnvironmentVersion;\n  ULONG64 PackageDependencyData;\n  ULONG ProcessGroupId;\n  ULONG LoaderThreads;\n} RTL_USER_PROCESS_PARAMETERS64;\ntypedef struct tagRTL_BITMAP {\n  ULONG SizeOfBitMap; /* Number of bits in the bitmap */\n  PULONG Buffer;      /* Bitmap data, assumed sized to a DWORD boundary */\n} RTL_BITMAP, *PRTL_BITMAP;\n\ntypedef const RTL_BITMAP* PCRTL_BITMAP;\n\n\ntypedef struct __PEB {                    /* win32/win64 */\n  BOOLEAN InheritedAddressSpace;          /* 000/000 */\n  BOOLEAN ReadImageFileExecOptions;       /* 001/001 */\n  BOOLEAN BeingDebugged;                  /* 002/002 */\n  UCHAR ImageUsedLargePages          : 1; /* 003/003 */\n  UCHAR IsProtectedProcess           : 1;\n  UCHAR IsImageDynamicallyRelocated  : 1;\n  UCHAR SkipPatchingUser32Forwarders : 1;\n  UCHAR IsPackagedProcess            : 1;\n  UCHAR IsAppContainer               : 1;\n  UCHAR IsProtectedProcessLight      : 1;\n  UCHAR IsLongPathAwareProcess       : 1;\n  HANDLE Mutant;                                    /* 004/008 */\n  HMODULE ImageBaseAddress;                         /* 008/010 */\n  PPEB_LDR_DATA LdrData;                            /* 00c/018 */\n  RTL_USER_PROCESS_PARAMETERS64* ProcessParameters; /* 010/020 */\n  PVOID SubSystemData;                              /* 014/028 */\n  HANDLE ProcessHeap;                               /* 018/030 */\n  PRTL_CRITICAL_SECTION FastPebLock;                /* 01c/038 */\n  PVOID AtlThunkSListPtr;                           /* 020/040 */\n  PVOID IFEOKey;                                    /* 024/048 */\n  ULONG ProcessInJob               : 1;             /* 028/050 */\n  ULONG ProcessInitializing        : 1;\n  ULONG ProcessUsingVEH            : 1;\n  ULONG ProcessUsingVCH            : 1;\n  ULONG ProcessUsingFTH            : 1;\n  ULONG ProcessPreviouslyThrottled : 1;\n  ULONG ProcessCurrentlyThrottled  : 1;\n  ULONG ProcessImagesHotPatched    : 1;\n  ULONG ReservedBits0              : 24;\n  void* KernelCallbackTable;             /* 02c/058 */\n  ULONG Reserved;                        /* 030/060 */\n  ULONG AtlThunkSListPtr32;              /* 034/064 */\n  PVOID ApiSetMap;                       /* 038/068 */\n  ULONG TlsExpansionCounter;             /* 03c/070 */\n  PRTL_BITMAP TlsBitmap;                 /* 040/078 */\n  ULONG TlsBitmapBits[2];                /* 044/080 */\n  PVOID ReadOnlySharedMemoryBase;        /* 04c/088 */\n  PVOID SharedData;                      /* 050/090 */\n  PVOID* ReadOnlyStaticServerData;       /* 054/098 */\n  PVOID AnsiCodePageData;                /* 058/0a0 */\n  PVOID OemCodePageData;                 /* 05c/0a8 */\n  PVOID UnicodeCaseTableData;            /* 060/0b0 */\n  ULONG NumberOfProcessors;              /* 064/0b8 */\n  ULONG NtGlobalFlag;                    /* 068/0bc */\n  LARGE_INTEGER CriticalSectionTimeout;  /* 070/0c0 */\n  SIZE_T HeapSegmentReserve;             /* 078/0c8 */\n  SIZE_T HeapSegmentCommit;              /* 07c/0d0 */\n  SIZE_T HeapDeCommitTotalFreeThreshold; /* 080/0d8 */\n  SIZE_T HeapDeCommitFreeBlockThreshold; /* 084/0e0 */\n  ULONG NumberOfHeaps;                   /* 088/0e8 */\n  ULONG MaximumNumberOfHeaps;            /* 08c/0ec */\n  PVOID* ProcessHeaps;                   /* 090/0f0 */\n  PVOID GdiSharedHandleTable;            /* 094/0f8 */\n  PVOID ProcessStarterHelper;            /* 098/100 */\n  PVOID GdiDCAttributeList;              /* 09c/108 */\n  PVOID LoaderLock;                      /* 0a0/110 */\n  ULONG OSMajorVersion;                  /* 0a4/118 */\n  ULONG OSMinorVersion;                  /* 0a8/11c */\n  ULONG OSBuildNumber;                   /* 0ac/120 */\n  ULONG OSPlatformId;                    /* 0b0/124 */\n  ULONG ImageSubSystem;                  /* 0b4/128 */\n  ULONG ImageSubSystemMajorVersion;      /* 0b8/12c */\n  ULONG ImageSubSystemMinorVersion;      /* 0bc/130 */\n  KAFFINITY ActiveProcessAffinityMask;   /* 0c0/138 */\n#ifdef _WIN64\n  ULONG GdiHandleBuffer[60]; /*    /140 */\n#else\n  ULONG GdiHandleBuffer[34]; /* 0c4/    */\n#endif\n  PVOID PostProcessInitRoutine;      /* 14c/230 */\n  PRTL_BITMAP TlsExpansionBitmap;    /* 150/238 */\n  ULONG TlsExpansionBitmapBits[32];  /* 154/240 */\n  ULONG SessionId;                   /* 1d4/2c0 */\n  ULARGE_INTEGER AppCompatFlags;     /* 1d8/2c8 */\n  ULARGE_INTEGER AppCompatFlagsUser; /* 1e0/2d0 */\n  PVOID ShimData;                    /* 1e8/2d8 */\n  PVOID AppCompatInfo;               /* 1ec/2e0 */\n  UNICODE_STRING64 CSDVersion;       /* 1f0/2e8 */\n  PVOID ActivationContextData;       /* 1f8/2f8 */\n  PVOID ProcessAssemblyStorageMap;   /* 1fc/300 */\n  PVOID SystemDefaultActivationData; /* 200/308 */\n  PVOID SystemAssemblyStorageMap;    /* 204/310 */\n  SIZE_T MinimumStackCommit;         /* 208/318 */\n  PVOID* FlsCallback;                /* 20c/320 */\n  LIST_ENTRY FlsListHead;            /* 210/328 */\n  PRTL_BITMAP FlsBitmap;             /* 218/338 */\n  ULONG FlsBitmapBits[4];            /* 21c/340 */\n  ULONG FlsHighIndex;                /* 22c/350 */\n  PVOID WerRegistrationData;         /* 230/358 */\n  PVOID WerShipAssertPtr;            /* 234/360 */\n  PVOID EcCodeBitMap;                /* 238/368 */\n  PVOID pImageHeaderHash;            /* 23c/370 */\n  ULONG HeapTracingEnabled      : 1; /* 240/378 */\n  ULONG CritSecTracingEnabled   : 1;\n  ULONG LibLoaderTracingEnabled : 1;\n  ULONG SpareTracingBits        : 29;\n  ULONGLONG CsrServerReadOnlySharedMemoryBase;  /* 248/380 */\n  ULONG TppWorkerpListLock;                     /* 250/388 */\n  LIST_ENTRY TppWorkerpList;                    /* 254/390 */\n  PVOID WaitOnAddressHashTable[0x80];           /* 25c/3a0 */\n  PVOID TelemetryCoverageHeader;                /* 45c/7a0 */\n  ULONG CloudFileFlags;                         /* 460/7a8 */\n  ULONG CloudFileDiagFlags;                     /* 464/7ac */\n  CHAR PlaceholderCompatibilityMode;            /* 468/7b0 */\n  CHAR PlaceholderCompatibilityModeReserved[7]; /* 469/7b1 */\n  PVOID LeapSecondData;                         /* 470/7b8 */\n  ULONG LeapSecondFlags;                        /* 474/7c0 */\n  ULONG NtGlobalFlag2;                          /* 478/7c4 */\n} __PEB, *__PPEB;\n\ntypedef struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME {\n  struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME* Previous;\n  struct _ACTIVATION_CONTEXT* ActivationContext;\n  ULONG Flags;\n} RTL_ACTIVATION_CONTEXT_STACK_FRAME, *PRTL_ACTIVATION_CONTEXT_STACK_FRAME;\n\ntypedef struct _ACTIVATION_CONTEXT_STACK {\n  RTL_ACTIVATION_CONTEXT_STACK_FRAME* ActiveFrame;\n  LIST_ENTRY FrameListCache;\n  ULONG Flags;\n  ULONG NextCookieSequenceNumber;\n  ULONG_PTR StackId;\n} ACTIVATION_CONTEXT_STACK, *PACTIVATION_CONTEXT_STACK;\ntypedef struct _GDI_TEB_BATCH {\n  ULONG Offset;\n  HANDLE HDC;\n  ULONG Buffer[0x136];\n} GDI_TEB_BATCH;\ntypedef struct __TEB {                          /* win32/win64 */\n  NT_TIB Tib;                                   /* 000/0000 */\n  PVOID EnvironmentPointer;                     /* 01c/0038 */\n  CLIENT_ID ClientId;                           /* 020/0040 */\n  PVOID ActiveRpcHandle;                        /* 028/0050 */\n  PVOID ThreadLocalStoragePointer;              /* 02c/0058 */\n  __PPEB Peb;                                   /* 030/0060 */\n  ULONG LastErrorValue;                         /* 034/0068 */\n  ULONG CountOfOwnedCriticalSections;           /* 038/006c */\n  PVOID CsrClientThread;                        /* 03c/0070 */\n  PVOID Win32ThreadInfo;                        /* 040/0078 */\n  ULONG User32Reserved[26];                     /* 044/0080 */\n  ULONG UserReserved[5];                        /* 0ac/00e8 */\n  PVOID WOW32Reserved;                          /* 0c0/0100 */\n  ULONG CurrentLocale;                          /* 0c4/0108 */\n  ULONG FpSoftwareStatusRegister;               /* 0c8/010c */\n  PVOID ReservedForDebuggerInstrumentation[16]; /* 0cc/0110 */\n#ifdef _WIN64\n  PVOID SystemReserved1[30]; /*    /0190 */\n#else\n  PVOID SystemReserved1[26]; /* 10c/     used for krnl386 private data in Wine */\n#endif\n  char PlaceholderCompatibilityMode;                       /* 174/0280 */\n  BOOLEAN PlaceholderHydrationAlwaysExplicit;              /* 175/0281 */\n  char PlaceholderReserved[10];                            /* 176/0282 */\n  DWORD ProxiedProcessId;                                  /* 180/028c */\n  ACTIVATION_CONTEXT_STACK ActivationContextStack;         /* 184/0290 */\n  UCHAR WorkingOnBehalfOfTicket[8];                        /* 19c/02b8 */\n  LONG ExceptionCode;                                      /* 1a4/02c0 */\n  ACTIVATION_CONTEXT_STACK* ActivationContextStackPointer; /* 1a8/02c8 */\n  ULONG_PTR InstrumentationCallbackSp;                     /* 1ac/02d0 */\n  ULONG_PTR InstrumentationCallbackPreviousPc;             /* 1b0/02d8 */\n  ULONG_PTR InstrumentationCallbackPreviousSp;             /* 1b4/02e0 */\n#ifdef _WIN64\n  ULONG TxFsContext;                       /*    /02e8 */\n  BOOLEAN InstrumentationCallbackDisabled; /*    /02ec */\n  BOOLEAN UnalignedLoadStoreExceptions;    /*    /02ed */\n#else\n  BOOLEAN InstrumentationCallbackDisabled; /* 1b8/     */\n  BYTE SpareBytes1[23];                    /* 1b9/     */\n  ULONG TxFsContext;                       /* 1d0/     */\n#endif\n  GDI_TEB_BATCH GdiTebBatch;          /* 1d4/02f0 used for ntdll private data in Wine */\n  CLIENT_ID RealClientId;             /* 6b4/07d8 */\n  HANDLE GdiCachedProcessHandle;      /* 6bc/07e8 */\n  ULONG GdiClientPID;                 /* 6c0/07f0 */\n  ULONG GdiClientTID;                 /* 6c4/07f4 */\n  PVOID GdiThreadLocaleInfo;          /* 6c8/07f8 */\n  ULONG_PTR Win32ClientInfo[62];      /* 6cc/0800 used for user32 private data in Wine */\n  PVOID glDispatchTable[233];         /* 7c4/09f0 */\n  PVOID glReserved1[29];              /* b68/1138 */\n  PVOID glReserved2;                  /* bdc/1220 */\n  PVOID glSectionInfo;                /* be0/1228 */\n  PVOID glSection;                    /* be4/1230 */\n  PVOID glTable;                      /* be8/1238 */\n  PVOID glCurrentRC;                  /* bec/1240 */\n  PVOID glContext;                    /* bf0/1248 */\n  ULONG LastStatusValue;              /* bf4/1250 */\n  UNICODE_STRING StaticUnicodeString; /* bf8/1258 */\n  WCHAR StaticUnicodeBuffer[261];     /* c00/1268 */\n  PVOID DeallocationStack;            /* e0c/1478 */\n  PVOID TlsSlots[64];                 /* e10/1480 */\n  LIST_ENTRY TlsLinks;                /* f10/1680 */\n  PVOID Vdm;                          /* f18/1690 */\n  PVOID ReservedForNtRpc;             /* f1c/1698 */\n  PVOID DbgSsReserved[2];             /* f20/16a0 */\n  ULONG HardErrorMode;                /* f28/16b0 */\n#ifdef _WIN64\n  PVOID Instrumentation[11]; /*    /16b8 */\n#else\n  PVOID Instrumentation[9]; /* f2c/ */\n#endif\n  GUID ActivityId;                   /* f50/1710 */\n  PVOID SubProcessTag;               /* f60/1720 */\n  PVOID PerflibData;                 /* f64/1728 */\n  PVOID EtwTraceData;                /* f68/1730 */\n  PVOID WinSockData;                 /* f6c/1738 */\n  ULONG GdiBatchCount;               /* f70/1740 */\n  ULONG IdealProcessorValue;         /* f74/1744 */\n  ULONG GuaranteedStackBytes;        /* f78/1748 */\n  PVOID ReservedForPerf;             /* f7c/1750 */\n  PVOID ReservedForOle;              /* f80/1758 */\n  ULONG WaitingOnLoaderLock;         /* f84/1760 */\n  PVOID SavedPriorityState;          /* f88/1768 */\n  ULONG_PTR ReservedForCodeCoverage; /* f8c/1770 */\n  PVOID ThreadPoolData;              /* f90/1778 */\n  PVOID* TlsExpansionSlots;          /* f94/1780 */\n#ifdef _WIN64\n  union {\n    PVOID DeallocationBStore; /*    /1788 */\n#ifdef ARCHITECTURE_arm64ec\n    CHPE_V2_CPU_AREA_INFO* ChpeV2CpuAreaInfo; /*    /1788 */\n#endif\n  } DUMMYUNIONNAME;\n  PVOID BStoreLimit; /*    /1790 */\n#endif\n  ULONG MuiGeneration;            /* f98/1798 */\n  ULONG IsImpersonating;          /* f9c/179c */\n  PVOID NlsCache;                 /* fa0/17a0 */\n  PVOID ShimData;                 /* fa4/17a8 */\n  ULONG HeapVirtualAffinity;      /* fa8/17b0 */\n  PVOID CurrentTransactionHandle; /* fac/17b8 */\n  PVOID ActiveFrame;              /* fb0/17c0 */\n  PVOID FlsSlots;                 /* fb4/17c8 */\n  PVOID PreferredLanguages;       /* fb8/17d0 */\n  PVOID UserPrefLanguages;        /* fbc/17d8 */\n  PVOID MergedPrefLanguages;      /* fc0/17e0 */\n  ULONG MuiImpersonation;         /* fc4/17e8 */\n  USHORT CrossTebFlags;           /* fc8/17ec */\n  USHORT SameTebFlags;            /* fca/17ee */\n  PVOID TxnScopeEnterCallback;    /* fcc/17f0 */\n  PVOID TxnScopeExitCallback;     /* fd0/17f8 */\n  PVOID TxnScopeContext;          /* fd4/1800 */\n  ULONG LockCount;                /* fd8/1808 */\n  LONG WowTebOffset;              /* fdc/180c */\n  PVOID ResourceRetValue;         /* fe0/1810 */\n  PVOID ReservedForWdf;           /* fe4/1818 */\n  ULONGLONG ReservedForCrt;       /* fe8/1820 */\n  GUID EffectiveContainerId;      /* ff0/1828 */\n} __TEB, *__PTEB;\n\ntypedef struct _WOW64INFO {\n  ULONG NativeSystemPageSize;\n  ULONG CpuFlags;\n  ULONG Wow64ExecuteFlags;\n  ULONG unknown;\n  ULONGLONG SectionHandle;\n  ULONGLONG CrossProcessWorkList;\n  USHORT NativeMachineType;\n  USHORT EmulatedMachineType;\n} WOW64INFO;\n\ntypedef struct _THREAD_BASIC_INFORMATION {\n  NTSTATUS ExitStatus;\n  PVOID TebBaseAddress;\n  CLIENT_ID ClientId;\n  ULONG_PTR AffinityMask;\n  LONG Priority;\n  LONG BasePriority;\n} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;\n\n/* System Information Class 0x01 */\n\ntypedef struct _SYSTEM_CPU_INFORMATION {\n  USHORT ProcessorArchitecture;\n  USHORT ProcessorLevel;\n  USHORT ProcessorRevision;\n  USHORT MaximumProcessors;\n  ULONG ProcessorFeatureBits;\n} SYSTEM_CPU_INFORMATION, *PSYSTEM_CPU_INFORMATION;\n\ntypedef enum _SECTION_INHERIT {\n  ViewShare = 1,\n  ViewUnmap = 2,\n} SECTION_INHERIT;\n\n/* definitions of bits in the Feature set for the x86 processors */\n#define CPU_FEATURE_VME 0x00000005    /* Virtual 86 Mode Extensions */\n#define CPU_FEATURE_TSC 0x00000002    /* Time Stamp Counter available */\n#define CPU_FEATURE_CMOV 0x00000008   /* Conditional Move instruction*/\n#define CPU_FEATURE_PGE 0x00000014    /* Page table Entry Global bit */\n#define CPU_FEATURE_PSE 0x00000024    /* Page Size Extension */\n#define CPU_FEATURE_MTRR 0x00000040   /* Memory Type Range Registers */\n#define CPU_FEATURE_CX8 0x00000080    /* Compare and eXchange 8 byte instr. */\n#define CPU_FEATURE_MMX 0x00000100    /* Multi Media eXtensions */\n#define CPU_FEATURE_X86 0x00000200    /* seems to be always ON, on the '86 */\n#define CPU_FEATURE_PAT 0x00000400    /* Page Attribute Table */\n#define CPU_FEATURE_FXSR 0x00000800   /* FXSAVE and FXSTORE instructions */\n#define CPU_FEATURE_SEP 0x00001000    /* SYSENTER and SYSEXIT instructions */\n#define CPU_FEATURE_SSE 0x00002000    /* SSE extensions (ext. MMX) */\n#define CPU_FEATURE_3DNOW 0x00004000  /* 3DNOW instructions available */\n#define CPU_FEATURE_SSE2 0x00010000   /* SSE2 extensions (XMMI64) */\n#define CPU_FEATURE_DS 0x00020000     /* Debug Store */\n#define CPU_FEATURE_HTT 0x00040000    /* Hyper Threading Technology */\n#define CPU_FEATURE_SSE3 0x00080000   /* SSE3 extensions */\n#define CPU_FEATURE_CX128 0x00100000  /* cmpxchg16b instruction */\n#define CPU_FEATURE_XSAVE 0x00800000  /* XSAVE instructions */\n#define CPU_FEATURE_2NDLEV 0x04000000 /* Second-level address translation */\n#define CPU_FEATURE_VIRT 0x08000000   /* Virtualization support */\n#define CPU_FEATURE_RDFS 0x10000000   /* RDFSBASE etc. instructions */\n#define CPU_FEATURE_NX 0x20000000     /* Data execution prevention */\n\n/* FIXME: following values are made up, actual flags are unknown */\n#define CPU_FEATURE_SSSE3 0x00008000 /* SSSE3 instructions */\n#define CPU_FEATURE_SSE41 0x01000000 /* SSE41 instructions */\n#define CPU_FEATURE_SSE42 0x02000000 /* SSE42 instructions */\n#define CPU_FEATURE_AVX 0x40000000   /* AVX instructions */\n#define CPU_FEATURE_AVX2 0x80000000  /* AVX2 instructions */\n#define CPU_FEATURE_PAE 0x00200000\n#define CPU_FEATURE_DAZ 0x00400000\n\ntypedef enum _MEMORY_INFORMATION_CLASS {\n  MemoryBasicInformation,\n  MemoryWorkingSetInformation,\n  MemoryMappedFilenameInformation,\n  MemoryRegionInformation,\n  MemoryWorkingSetExInformation,\n  MemorySharedCommitInformation,\n  MemoryImageInformation,\n  MemoryRegionInformationEx,\n  MemoryPrivilegedBasicInformation,\n  MemoryEnclaveImageInformation,\n  MemoryBasicInformationCapped,\n  MemoryPhysicalContiguityInformation,\n  MemoryBadInformation,\n  MemoryBadInformationAllProcesses,\n#ifdef __WINESRC__\n  MemoryWineUnixFuncs = 1000,\n  MemoryWineUnixWow64Funcs,\n#endif\n  MemoryFexStatsShm = 2000,\n} MEMORY_INFORMATION_CLASS;\n\n#define SystemEmulationBasicInformation (SYSTEM_INFORMATION_CLASS)62\n\n#define ProcessFexHardwareTso (PROCESSINFOCLASS)2000\n#define ProcessFexUnalignAtomic (PROCESSINFOCLASS)2001\n\n// These match the prctl flag values\n#define FEX_UNALIGN_ATOMIC_EMULATE (1ULL << 0)\n#define FEX_UNALIGN_ATOMIC_BACKPATCH (1ULL << 1)\n#define FEX_UNALIGN_ATOMIC_STRICT_SPLIT_LOCKS (1ULL << 2)\n\ntypedef enum _KEY_VALUE_INFORMATION_CLASS {\n  KeyValueBasicInformation,\n  KeyValueFullInformation,\n  KeyValuePartialInformation,\n  KeyValueFullInformationAlign64,\n  KeyValuePartialInformationAlign64,\n  KeyValueLayerInformation,\n} KEY_VALUE_INFORMATION_CLASS;\n\ntypedef struct _KEY_VALUE_PARTIAL_INFORMATION {\n  ULONG TitleIndex;\n  ULONG Type;\n  ULONG DataLength;\n  UCHAR Data[1];\n} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;\n\ntypedef struct _MEMORY_FEX_STATS_SHM_INFORMATION {\n  void* shm_base;\n  DWORD map_size;\n  DWORD max_size;\n} MEMORY_FEX_STATS_SHM_INFORMATION, *PMEMORY_FEX_STATS_SHM_INFORMATION;\n\ntypedef struct _MEMORY_SECTION_NAME {\n  UNICODE_STRING SectionFileName;\n} MEMORY_SECTION_NAME, *PMEMORY_SECTION_NAME;\n\nNTSTATUS WINAPIV DbgPrint(LPCSTR fmt, ...);\nNTSTATUS WINAPI LdrDisableThreadCalloutsForDll(HMODULE);\nNTSTATUS WINAPI LdrGetDllFullName(HMODULE, UNICODE_STRING*);\nNTSTATUS WINAPI LdrGetDllHandle(LPCWSTR, ULONG, const UNICODE_STRING*, HMODULE*);\nNTSTATUS WINAPI LdrGetProcedureAddress(HMODULE, const ANSI_STRING*, ULONG, void**);\nNTSTATUS WINAPI NtAllocateVirtualMemoryEx(HANDLE, PVOID*, SIZE_T*, ULONG, ULONG, MEM_EXTENDED_PARAMETER*, ULONG);\nNTSTATUS WINAPI NtAllocateVirtualMemory(HANDLE, PVOID*, ULONG_PTR, SIZE_T*, ULONG, ULONG);\nNTSTATUS WINAPI NtContinue(PCONTEXT, BOOLEAN);\nNTSTATUS WINAPI NtCreateSection(HANDLE*, ACCESS_MASK, const OBJECT_ATTRIBUTES*, const LARGE_INTEGER*, ULONG, ULONG, HANDLE);\nNTSTATUS WINAPI NtDelayExecution(BOOLEAN, const LARGE_INTEGER*);\nNTSTATUS WINAPI NtDuplicateObject(HANDLE, HANDLE, HANDLE, PHANDLE, ACCESS_MASK, ULONG, ULONG);\nNTSTATUS WINAPI NtFlushInstructionCache(HANDLE, LPCVOID, SIZE_T);\nNTSTATUS WINAPI NtFreeVirtualMemory(HANDLE, PVOID*, SIZE_T*, ULONG);\nNTSTATUS WINAPI NtGetContextThread(HANDLE, CONTEXT*);\nULONG WINAPI NtGetCurrentProcessorNumber(void);\nNTSYSAPI NTSTATUS WINAPI NtMapViewOfSection(HANDLE, HANDLE, PVOID*, ULONG_PTR, SIZE_T, const LARGE_INTEGER*, SIZE_T*, SECTION_INHERIT, ULONG, ULONG);\nNTSTATUS WINAPI NtOpenKeyEx(PHANDLE, ACCESS_MASK, const OBJECT_ATTRIBUTES*, ULONG);\nNTSTATUS WINAPI NtProtectVirtualMemory(HANDLE, PVOID*, SIZE_T*, ULONG, ULONG*);\nNTSTATUS WINAPI NtQueryAttributesFile(const OBJECT_ATTRIBUTES*, FILE_BASIC_INFORMATION*);\nNTSTATUS WINAPI NtQueryDirectoryFile(HANDLE, HANDLE, PIO_APC_ROUTINE, PVOID, PIO_STATUS_BLOCK, PVOID, ULONG, FILE_INFORMATION_CLASS,\n                                     BOOLEAN, PUNICODE_STRING, BOOLEAN);\nNTSTATUS WINAPI NtQueryValueKey(HANDLE, const UNICODE_STRING*, KEY_VALUE_INFORMATION_CLASS, void*, DWORD, DWORD*);\nNTSTATUS WINAPI NtQueryVirtualMemory(HANDLE, LPCVOID, MEMORY_INFORMATION_CLASS, PVOID, SIZE_T, SIZE_T*);\nNTSTATUS WINAPI NtReadFile(HANDLE, HANDLE, PIO_APC_ROUTINE, PVOID, PIO_STATUS_BLOCK, PVOID, ULONG, PLARGE_INTEGER, PULONG);\nNTSTATUS WINAPI NtSetContextThread(HANDLE, const CONTEXT*);\nNTSTATUS WINAPI NtSuspendThread(HANDLE, PULONG);\nNTSTATUS WINAPI NtTerminateProcess(HANDLE, LONG);\nNTSTATUS WINAPI NtWriteFile(HANDLE, HANDLE, PIO_APC_ROUTINE, PVOID, PIO_STATUS_BLOCK, const void*, ULONG, PLARGE_INTEGER, PULONG);\nvoid WINAPI ProcessPendingCrossProcessEmulatorWork();\nvoid WINAPI RtlAcquirePebLock(void);\nvoid WINAPI RtlAcquireSRWLockExclusive(RTL_SRWLOCK*);\nvoid WINAPI RtlClearBits(PRTL_BITMAP, ULONG, ULONG);\nNTSTATUS WINAPI RtlDeleteCriticalSection(RTL_CRITICAL_SECTION*);\nNTSTATUS WINAPI RtlEnterCriticalSection(RTL_CRITICAL_SECTION*);\nULONG WINAPI RtlFindClearBitsAndSet(PRTL_BITMAP, ULONG, ULONG);\nULONG WINAPI RtlGetCurrentDirectory_U(ULONG, LPWSTR);\nPIMAGE_NT_HEADERS WINAPI RtlImageNtHeader(HMODULE);\nPVOID WINAPI RtlImageDirectoryEntryToData(HMODULE, BOOL, WORD, ULONG*);\nvoid WINAPI RtlInitializeConditionVariable(RTL_CONDITION_VARIABLE*);\nNTSTATUS WINAPI RtlInitializeCriticalSection(RTL_CRITICAL_SECTION*);\nvoid WINAPI RtlInitializeSRWLock(RTL_SRWLOCK*);\nNTSTATUS WINAPI RtlLeaveCriticalSection(RTL_CRITICAL_SECTION*);\nvoid* WINAPI RtlLocateExtendedFeature(CONTEXT_EX*, ULONG, ULONG*);\nNTSTATUS WINAPI RtlMultiByteToUnicodeN(LPWSTR, DWORD, LPDWORD, LPCSTR, DWORD);\nNTSTATUS WINAPI RtlMultiByteToUnicodeSize(DWORD*, LPCSTR, ULONG);\nBOOL WINAPI RtlQueryPerformanceCounter(LARGE_INTEGER*);\nBOOL WINAPI RtlQueryPerformanceFrequency(LARGE_INTEGER*);\nvoid WINAPI RtlReleasePebLock(void);\nvoid WINAPI RtlReleaseSRWLockExclusive(RTL_SRWLOCK*);\nNTSTATUS WINAPI RtlSleepConditionVariableSRW(RTL_CONDITION_VARIABLE*, RTL_SRWLOCK*, const LARGE_INTEGER*, ULONG);\nBOOLEAN WINAPI RtlTryAcquireSRWLockExclusive(RTL_SRWLOCK*);\nBOOL WINAPI RtlTryEnterCriticalSection(RTL_CRITICAL_SECTION*);\nNTSTATUS WINAPI RtlUnicodeToMultiByteN(LPSTR, DWORD, LPDWORD, LPCWSTR, DWORD);\nvoid WINAPI RtlWakeAllConditionVariable(RTL_CONDITION_VARIABLE*);\nvoid WINAPI RtlWakeConditionVariable(RTL_CONDITION_VARIABLE*);\nNTSTATUS WINAPI RtlWow64GetCurrentCpuArea(USHORT*, void**, void**);\nNTSTATUS WINAPI RtlWow64GetThreadContext(HANDLE, WOW64_CONTEXT*);\nNTSTATUS WINAPI RtlWow64SetThreadContext(HANDLE, const WOW64_CONTEXT*);\nvoid WINAPI Wow64ProcessPendingCrossProcessItems(void);\nNTSTATUS WINAPI Wow64SystemServiceEx(UINT, UINT*);\nNTSTATUS WINAPI RtlWow64SuspendThread(HANDLE, ULONG*);\nvoid WINAPI RtlAcquireSRWLockShared(RTL_SRWLOCK*);\nvoid WINAPI RtlReleaseSRWLockShared(RTL_SRWLOCK*);\nBOOLEAN WINAPI RtlTryAcquireSRWLockShared(RTL_SRWLOCK*);\nvoid WINAPI RtlWakeAddressAll(const void*);\nNTSTATUS WINAPI RtlWaitOnAddress(const void*, const void*, SIZE_T, const LARGE_INTEGER*);\nvoid WINAPI RtlWakeAddressSingle(const void*);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "ThunkLibs/Generator/CMakeLists.txt",
    "content": "find_package(Clang REQUIRED CONFIG)\nfind_package(OpenSSL REQUIRED COMPONENTS Crypto)\n\n# Query clang's global resource directory for system include directories\nif (NOT CLANG_RESOURCE_DIR)\n  find_program(CLANG_EXEC_PATH clang REQUIRED)\n\n  execute_process(COMMAND ${CLANG_EXEC_PATH} -print-resource-dir\n    OUTPUT_VARIABLE CLANG_RESOURCE_DIR\n    OUTPUT_STRIP_TRAILING_WHITESPACE)\nendif()\n\nadd_library(thunkgenlib STATIC analysis.cpp data_layout.cpp gen.cpp)\ntarget_include_directories(thunkgenlib INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})\ntarget_include_directories(thunkgenlib SYSTEM PUBLIC ${CLANG_INCLUDE_DIRS})\ntarget_link_libraries(thunkgenlib PUBLIC clang-cpp LLVM)\ntarget_link_libraries(thunkgenlib PRIVATE OpenSSL::Crypto)\ntarget_link_libraries(thunkgenlib PRIVATE fmt::fmt)\ntarget_compile_definitions(thunkgenlib INTERFACE -DCLANG_RESOURCE_DIR=\"${CLANG_RESOURCE_DIR}\")\n\n# Clang's libtooling won't compile with libstdc++'s debug mode\ntarget_compile_options(thunkgenlib PUBLIC \"-U_GLIBCXX_DEBUG\")\n\nadd_executable(thunkgen main.cpp)\ntarget_link_libraries(thunkgen PRIVATE thunkgenlib)\n"
  },
  {
    "path": "ThunkLibs/Generator/analysis.cpp",
    "content": "#include \"analysis.h\"\n#include \"diagnostics.h\"\n\n#include <clang/AST/RecursiveASTVisitor.h>\n#include <clang/Basic/Version.h>\n#include <clang/Frontend/CompilerInstance.h>\n\n#include <fmt/format.h>\n\nstruct NamespaceAnnotations {\n  std::optional<unsigned> version;\n  std::optional<std::string> load_host_endpoint_via;\n  bool generate_guest_symtable = false;\n  bool indirect_guest_calls = false;\n};\n\nstatic clang::SourceLocation GetTemplateArgLocation(clang::ClassTemplateSpecializationDecl* decl, unsigned i) {\n#if CLANG_VERSION_MAJOR >= 19\n  return decl->getTemplateArgsAsWritten()->getTemplateArgs()[i].getLocation();\n#else\n  return decl->getTypeAsWritten()->getTypeLoc().getAs<clang::TemplateSpecializationTypeLoc>().getArgLoc(i).getLocation();\n#endif\n}\n\nstatic NamespaceAnnotations GetNamespaceAnnotations(clang::ASTContext& context, clang::CXXRecordDecl* decl) {\n  if (!decl->hasDefinition()) {\n    return {};\n  }\n\n  ErrorReporter report_error {context};\n  NamespaceAnnotations ret;\n\n  for (const clang::CXXBaseSpecifier& base : decl->bases()) {\n    auto annotation = base.getType().getAsString();\n    if (annotation == \"fexgen::generate_guest_symtable\") {\n      ret.generate_guest_symtable = true;\n    } else if (annotation == \"fexgen::indirect_guest_calls\") {\n      ret.indirect_guest_calls = true;\n    } else {\n      throw report_error(base.getSourceRange().getBegin(), \"Unknown namespace annotation\");\n    }\n  }\n\n  for (const clang::FieldDecl* field : decl->fields()) {\n    auto name = field->getNameAsString();\n    if (name == \"load_host_endpoint_via\") {\n      auto loader_function_expr = field->getInClassInitializer()->IgnoreCasts();\n      auto loader_function_str = llvm::dyn_cast_or_null<clang::StringLiteral>(loader_function_expr);\n      if (loader_function_expr && !loader_function_str) {\n        throw report_error(loader_function_expr->getBeginLoc(), \"Must initialize load_host_endpoint_via with a string\");\n      }\n      if (loader_function_str) {\n        ret.load_host_endpoint_via = loader_function_str->getString();\n      }\n    } else if (name == \"version\") {\n      auto initializer = field->getInClassInitializer()->IgnoreCasts();\n      auto version_literal = llvm::dyn_cast_or_null<clang::IntegerLiteral>(initializer);\n      if (!initializer || !version_literal) {\n        throw report_error(field->getBeginLoc(), \"No version given (expected integral typed member, e.g. \\\"int version = 5;\\\")\");\n      }\n      ret.version = version_literal->getValue().getZExtValue();\n    } else {\n      throw report_error(field->getBeginLoc(), \"Unknown namespace annotation\");\n    }\n  }\n\n  return ret;\n}\n\nenum class CallbackStrategy {\n  Default,\n  Stub,\n};\n\nstruct Annotations {\n  bool custom_host_impl = false;\n  bool custom_guest_entrypoint = false;\n\n  bool returns_guest_pointer = false;\n\n  std::optional<clang::QualType> uniform_va_type;\n\n  CallbackStrategy callback_strategy = CallbackStrategy::Default;\n};\n\nstatic Annotations GetAnnotations(clang::ASTContext& context, clang::CXXRecordDecl* decl) {\n  ErrorReporter report_error {context};\n  Annotations ret;\n\n  for (const auto& base : decl->bases()) {\n    auto annotation = base.getType().getAsString();\n    if (annotation == \"fexgen::returns_guest_pointer\") {\n      ret.returns_guest_pointer = true;\n    } else if (annotation == \"fexgen::custom_host_impl\") {\n      ret.custom_host_impl = true;\n    } else if (annotation == \"fexgen::callback_stub\") {\n      ret.callback_strategy = CallbackStrategy::Stub;\n    } else if (annotation == \"fexgen::custom_guest_entrypoint\") {\n      ret.custom_guest_entrypoint = true;\n    } else {\n      throw report_error(base.getSourceRange().getBegin(), \"Unknown annotation\");\n    }\n  }\n\n  for (const auto& child_decl : decl->getPrimaryContext()->decls()) {\n    if (auto field = llvm::dyn_cast_or_null<clang::FieldDecl>(child_decl)) {\n      throw report_error(field->getBeginLoc(), \"Unknown field annotation\");\n    } else if (auto type_alias = llvm::dyn_cast_or_null<clang::TypedefNameDecl>(child_decl)) {\n      auto name = type_alias->getNameAsString();\n      if (name == \"uniform_va_type\") {\n        ret.uniform_va_type = type_alias->getUnderlyingType();\n      } else {\n        throw report_error(type_alias->getBeginLoc(), \"Unknown type alias annotation\");\n      }\n    }\n  }\n\n  return ret;\n}\n\nvoid AnalysisAction::ExecuteAction() {\n  clang::ASTFrontendAction::ExecuteAction();\n\n  // Post-processing happens here rather than in an overridden EndSourceFileAction implementation.\n  // We can't move the logic to the latter since this code might still raise errors, but\n  // clang's diagnostics engine is already shut down by the time EndSourceFileAction is called.\n\n  auto& context = getCompilerInstance().getASTContext();\n  if (context.getDiagnostics().hasErrorOccurred()) {\n    return;\n  }\n  decl_contexts.front() = context.getTranslationUnitDecl();\n\n  try {\n    ParseInterface(context);\n    CoverReferencedTypes(context);\n    OnAnalysisComplete(context);\n  } catch (ClangDiagnosticAsException& exception) {\n    exception.Report(context.getDiagnostics());\n  }\n}\n\nstatic clang::ClassTemplateDecl* FindClassTemplateDeclByName(clang::DeclContext& decl_context, std::string_view symbol_name) {\n  auto& ast_context = decl_context.getParentASTContext();\n  auto* ident = &ast_context.Idents.get(symbol_name);\n  auto declname = ast_context.DeclarationNames.getIdentifier(ident);\n  auto result = decl_context.noload_lookup(declname);\n  if (result.empty()) {\n    return nullptr;\n  } else if (std::next(result.begin()) == result.end()) {\n    return llvm::dyn_cast<clang::ClassTemplateDecl>(*result.begin());\n  } else {\n    throw std::runtime_error(\"Found multiple matches to symbol \" + std::string {symbol_name});\n  }\n}\n\nstruct TypeAnnotations {\n  bool is_opaque = false;\n  bool assumed_compatible = false;\n  bool emit_layout_wrappers = false;\n};\n\nstatic TypeAnnotations GetTypeAnnotations(clang::ASTContext& context, clang::CXXRecordDecl* decl) {\n  if (!decl->hasDefinition()) {\n    return {};\n  }\n\n  ErrorReporter report_error {context};\n  TypeAnnotations ret;\n\n  for (const clang::CXXBaseSpecifier& base : decl->bases()) {\n    auto annotation = base.getType().getAsString();\n    if (annotation == \"fexgen::opaque_type\") {\n      ret.is_opaque = true;\n    } else if (annotation == \"fexgen::assume_compatible_data_layout\") {\n      ret.assumed_compatible = true;\n    } else if (annotation == \"fexgen::emit_layout_wrappers\") {\n      ret.emit_layout_wrappers = true;\n    } else {\n      throw report_error(base.getSourceRange().getBegin(), \"Unknown type annotation\");\n    }\n  }\n\n  return ret;\n}\n\nstatic ParameterAnnotations GetParameterAnnotations(clang::ASTContext& context, clang::CXXRecordDecl* decl) {\n  if (!decl->hasDefinition()) {\n    return {};\n  }\n\n  ErrorReporter report_error {context};\n  ParameterAnnotations ret;\n\n  for (const clang::CXXBaseSpecifier& base : decl->bases()) {\n    auto annotation = base.getType().getAsString();\n    if (annotation == \"fexgen::ptr_passthrough\") {\n      ret.is_passthrough = true;\n    } else if (annotation == \"fexgen::assume_compatible_data_layout\") {\n      ret.assume_compatible = true;\n    } else {\n      throw report_error(base.getSourceRange().getBegin(), \"Unknown parameter annotation\");\n    }\n  }\n\n  return ret;\n}\n\nvoid AnalysisAction::ParseInterface(clang::ASTContext& context) {\n  ErrorReporter report_error {context};\n\n  const std::unordered_map<unsigned, ParameterAnnotations> no_param_annotations {};\n\n  // TODO: Assert fex_gen_type is not declared at non-global namespaces\n  if (auto template_decl = FindClassTemplateDeclByName(*context.getTranslationUnitDecl(), \"fex_gen_type\")) {\n    for (auto* decl : template_decl->specializations()) {\n      const auto& template_args = decl->getTemplateArgs();\n      assert(template_args.size() == 1);\n\n      // NOTE: Function types that are equivalent but use differently\n      //       named types (e.g. GLuint/GLenum) are represented by\n      //       different Type instances. The canonical type they refer\n      //       to is unique, however.\n      clang::QualType type = context.getCanonicalType(template_args[0].getAsType());\n      type = type->getLocallyUnqualifiedSingleStepDesugaredType();\n\n      const auto annotations = GetTypeAnnotations(context, decl);\n      if (type->isFunctionPointerType() || type->isFunctionType()) {\n        if (decl->getNumBases()) {\n          throw report_error(decl->getBeginLoc(), \"Function pointer types cannot be annotated\");\n        }\n        thunked_funcptrs[type.getAsString()] = std::pair {type.getTypePtr(), no_param_annotations};\n      } else {\n        RepackedType repack_info = {.assumed_compatible = annotations.is_opaque || annotations.assumed_compatible,\n                                    .pointers_only = annotations.is_opaque && !annotations.assumed_compatible,\n                                    .emit_layout_wrappers = annotations.emit_layout_wrappers};\n        [[maybe_unused]] auto [it, inserted] = types.emplace(context.getCanonicalType(type.getTypePtr()), repack_info);\n        assert(inserted);\n      }\n    }\n  }\n\n  // Process function parameter annotations\n  std::unordered_map<const clang::FunctionDecl*, std::unordered_map<unsigned, ParameterAnnotations>> param_annotations;\n  for (auto& decl_context : decl_contexts) {\n    if (auto template_decl = FindClassTemplateDeclByName(*decl_context, \"fex_gen_param\")) {\n      for (auto* decl : template_decl->specializations()) {\n        const auto& template_args = decl->getTemplateArgs();\n        assert(template_args.size() == 3);\n\n        auto function = llvm::dyn_cast<clang::FunctionDecl>(template_args[0].getAsDecl());\n        auto param_idx = template_args[1].getAsIntegral().getSExtValue();\n        clang::QualType type = context.getCanonicalType(template_args[2].getAsType());\n        type = type->getLocallyUnqualifiedSingleStepDesugaredType();\n\n        if (param_idx >= function->getNumParams() || param_idx < -1) {\n          throw report_error(GetTemplateArgLocation(decl, 1), \"Out-of-bounds parameter index passed to fex_gen_param\");\n        }\n\n        auto expected_type = param_idx == -1 ? function->getReturnType() : function->getParamDecl(param_idx)->getType();\n\n        if (!type->isVoidType() && !context.hasSameType(type, expected_type)) {\n          auto loc = param_idx == -1 ? function->getReturnTypeSourceRange().getBegin() :\n                                       function->getParamDecl(param_idx)->getTypeSourceInfo()->getTypeLoc().getBeginLoc();\n          throw report_error(GetTemplateArgLocation(decl, 2), \"Type passed to fex_gen_param doesn't match the function signature\")\n            .addNote(report_error(loc, \"Expected this type instead\"));\n        }\n\n        param_annotations[function][param_idx] = GetParameterAnnotations(context, decl);\n      }\n    }\n  }\n\n  // Process declarations and specializations of fex_gen_config,\n  // i.e. the function descriptions of the thunked API\n  for (auto& decl_context : decl_contexts) {\n    if (const auto template_decl = FindClassTemplateDeclByName(*decl_context, \"fex_gen_config\")) {\n      // Gather general information about symbols in this namespace\n      const auto annotations = GetNamespaceAnnotations(context, template_decl->getTemplatedDecl());\n\n      auto namespace_decl = llvm::dyn_cast<clang::NamespaceDecl>(decl_context);\n      namespaces.push_back(\n        {namespace_decl, namespace_decl ? namespace_decl->getNameAsString() : \"\", annotations.load_host_endpoint_via.value_or(\"\"),\n         annotations.generate_guest_symtable, annotations.indirect_guest_calls});\n      const auto namespace_idx = namespaces.size() - 1;\n      const NamespaceInfo& namespace_info = namespaces.back();\n\n      if (annotations.version) {\n        if (namespace_decl) {\n          throw report_error(template_decl->getBeginLoc(), \"Library version must be defined in the global namespace\");\n        }\n        lib_version = annotations.version;\n      }\n\n      // Process specializations of template fex_gen_config\n      // First, perform some validation and process member annotations\n      // In a second iteration, process the actual function API\n      for (auto* decl : template_decl->specializations()) {\n        if (decl->getSpecializationKind() == clang::TSK_ExplicitInstantiationDefinition) {\n          throw report_error(decl->getBeginLoc(), \"fex_gen_config may not be partially specialized\\n\");\n        }\n\n        const auto& template_args = decl->getTemplateArgs();\n        assert(template_args.size() == 1);\n\n        const auto template_arg_loc = GetTemplateArgLocation(decl, 0);\n\n        if (llvm::isa<clang::FunctionDecl>(template_args[0].getAsDecl())) {\n          // Process later\n        } else if (auto annotated_member = llvm::dyn_cast<clang::FieldDecl>(template_args[0].getAsDecl())) {\n          if (decl->getNumBases() != 1 || decl->bases_begin()->getType().getAsString() != \"fexgen::custom_repack\") {\n            throw report_error(template_arg_loc, \"Unsupported member annotation(s)\");\n          }\n\n          // Get or add parent type to list of structure types\n#if CLANG_VERSION_MAJOR >= 22\n          auto parent_qt = context.getTagType(clang::ElaboratedTypeKeyword::None, std::nullopt, annotated_member->getParent(), false);\n          auto repack_info_it = types.emplace(context.getCanonicalType(parent_qt).getTypePtr(), RepackedType {}).first;\n#else\n          auto repack_info_it = types.emplace(context.getCanonicalType(annotated_member->getParent()->getTypeForDecl()), RepackedType {}).first;\n#endif\n          if (repack_info_it->second.assumed_compatible) {\n            throw report_error(template_arg_loc, \"May not annotate members of opaque types\");\n          }\n          // Add member to its list of members\n          repack_info_it->second.custom_repacked_members.insert(annotated_member->getNameAsString());\n        } else {\n          throw report_error(template_arg_loc, \"Cannot annotate this kind of symbol\");\n        }\n      }\n\n      // Process API functions\n      for (auto* decl : template_decl->specializations()) {\n        if (decl->getSpecializationKind() == clang::TSK_ExplicitInstantiationDefinition) {\n          throw report_error(decl->getBeginLoc(), \"fex_gen_config may not be partially specialized\\n\");\n        }\n\n        const auto& template_args = decl->getTemplateArgs();\n        assert(template_args.size() == 1);\n\n        const auto template_arg_loc = GetTemplateArgLocation(decl, 0);\n\n        if (auto emitted_function = llvm::dyn_cast<clang::FunctionDecl>(template_args[0].getAsDecl())) {\n          auto return_type = emitted_function->getReturnType();\n\n          const auto annotations = GetAnnotations(context, decl);\n          if (return_type->isFunctionPointerType() && !annotations.returns_guest_pointer) {\n            throw report_error(template_arg_loc, \"Function pointer return types require explicit annotation\\n\");\n          }\n\n          // TODO: Use the types as written in the signature instead?\n          ThunkedFunction data;\n          data.function_name = emitted_function->getName().str();\n          data.return_type = return_type;\n          data.is_variadic = emitted_function->isVariadic();\n\n          data.decl = emitted_function;\n\n          data.custom_host_impl = annotations.custom_host_impl;\n\n          data.param_annotations = param_annotations[emitted_function];\n\n          const int retval_index = -1;\n          for (int param_idx = retval_index; param_idx < (int)emitted_function->param_size(); ++param_idx) {\n            auto param_type =\n              param_idx == retval_index ? emitted_function->getReturnType() : emitted_function->getParamDecl(param_idx)->getType();\n            auto param_loc = param_idx == retval_index ? emitted_function->getReturnTypeSourceRange().getBegin() :\n                                                         emitted_function->getParamDecl(param_idx)->getBeginLoc();\n\n            if (param_idx != retval_index) {\n              data.param_types.push_back(param_type);\n            } else if (param_type->isVoidType()) {\n              continue;\n            }\n\n            if (data.param_annotations[param_idx].is_passthrough && !data.custom_host_impl) {\n              throw report_error(param_loc, \"Passthrough annotation requires custom host implementation\");\n            }\n            // Skip pointers-to-structs passed through to the host in guest_layout.\n            // This avoids pulling in member types that can't be processed.\n            if (data.param_annotations[param_idx].is_passthrough && param_type->isPointerType() &&\n                param_type->getPointeeType()->isStructureType()) {\n              continue;\n            }\n\n            auto check_struct_type = [&](const clang::Type* type) {\n              if (type->isIncompleteType()) {\n                throw report_error(type->getAsTagDecl()->getBeginLoc(), \"Unannotated pointer with incomplete struct type; consider using \"\n                                                                        \"an opaque_type annotation\")\n                  .addNote(report_error(emitted_function->getNameInfo().getLoc(), \"in function\", clang::DiagnosticsEngine::Note))\n                  .addNote(report_error(template_arg_loc, \"used in annotation here\", clang::DiagnosticsEngine::Note));\n              }\n\n              for (auto* member : type->getAsStructureType()->getDecl()->fields()) {\n                auto annotated_type = types.find(type->getCanonicalTypeUnqualified().getTypePtr());\n                if (annotated_type == types.end() || !annotated_type->second.UsesCustomRepackFor(member)) {\n                  /*if (!member->getType()->isPointerType())*/ {\n                    // TODO: Perform more elaborate validation for non-pointers to ensure ABI compatibility\n                    continue;\n                  }\n\n                  throw report_error(member->getBeginLoc(), \"Unannotated pointer member\")\n                    .addNote(report_error(param_loc, \"in struct type\", clang::DiagnosticsEngine::Note))\n                    .addNote(report_error(template_arg_loc, \"used in annotation here\", clang::DiagnosticsEngine::Note));\n                }\n              }\n            };\n\n            if (param_type->isFunctionPointerType()) {\n              if (param_idx == retval_index) {\n                // TODO: We already rely on this in a few places...\n                // TODO: Revisit now that we support ptr_passthrough for return values\n                //                                throw report_error(template_arg_loc, \"Support for returning function pointers is not implemented\");\n                continue;\n              }\n              auto funcptr = emitted_function->getParamDecl(param_idx)->getFunctionType()->getAs<clang::FunctionProtoType>();\n              ThunkedCallback callback;\n              callback.return_type = funcptr->getReturnType();\n              for (auto& cb_param : funcptr->getParamTypes()) {\n                callback.param_types.push_back(cb_param);\n              }\n              callback.is_stub = annotations.callback_strategy == CallbackStrategy::Stub;\n              callback.is_variadic = funcptr->isVariadic();\n\n              data.callbacks.emplace(param_idx, callback);\n              if (!callback.is_stub && !data.custom_host_impl) {\n                thunked_funcptrs[emitted_function->getNameAsString() + \"_cb\" + std::to_string(param_idx)] =\n                  std::pair {context.getCanonicalType(funcptr), no_param_annotations};\n              }\n\n              if (data.callbacks.size() != 1) {\n                throw report_error(template_arg_loc, \"Support for more than one callback is untested\");\n              }\n              if (funcptr->isVariadic() && !callback.is_stub) {\n                throw report_error(template_arg_loc, \"Variadic callbacks are not supported\");\n              }\n\n              // Force treatment as passthrough-pointer\n              data.param_annotations[param_idx].is_passthrough = true;\n            } else if (param_type->isBuiltinType()) {\n              // NOTE: Intentionally not using getCanonicalType here since that would turn e.g. size_t into platform-specific types\n              // TODO: Still, we may want to de-duplicate some of these...\n              types.emplace(param_type.getTypePtr(), RepackedType {});\n            } else if (param_type->isEnumeralType()) {\n              types.emplace(context.getCanonicalType(param_type.getTypePtr()), RepackedType {});\n            } else if (param_type->isStructureType() && !(types.contains(context.getCanonicalType(param_type.getTypePtr())) &&\n                                                          LookupType(context, param_type.getTypePtr()).assumed_compatible)) {\n              check_struct_type(param_type.getTypePtr());\n              types.emplace(context.getCanonicalType(param_type.getTypePtr()), RepackedType {});\n            } else if (param_type->isPointerType()) {\n              auto pointee_type = param_type->getPointeeType();\n\n              if (pointee_type->isIntegerType()) {\n                // Add builtin pointee type to type list\n                if (!pointee_type->isEnumeralType()) {\n                  types.emplace(pointee_type.getTypePtr(), RepackedType {});\n                } else {\n                  types.emplace(context.getCanonicalType(pointee_type.getTypePtr()), RepackedType {});\n                }\n              }\n\n              if (data.param_annotations[param_idx].assume_compatible) {\n                // Nothing to do\n              } else if (types.contains(context.getCanonicalType(pointee_type.getTypePtr())) &&\n                         LookupType(context, pointee_type.getTypePtr()).assumed_compatible) {\n                // Parameter points to a type that is assumed compatible\n                data.param_annotations[param_idx].assume_compatible = true;\n              } else if (pointee_type->isStructureType()) {\n                // Unannotated pointer to unannotated structure.\n                // Append the structure type to the type list for checking data layout compatibility.\n                check_struct_type(pointee_type.getTypePtr());\n                types.emplace(context.getCanonicalType(pointee_type.getTypePtr()), RepackedType {});\n              } else if (data.param_annotations[param_idx].is_passthrough) {\n                // Nothing to do\n              } else {\n                // Assume this parameter type is unsupported.\n                // Since not all of our libraries are adapted for this yet, so\n                // an error is only thrown for a curated set of functions.\n                // TODO: At least detect and reject pointers-to-pointers on 32-bit\n                if (emitted_function->getNameAsString().starts_with(\"gl\") && pointee_type->isPointerType()) {\n                  throw report_error(param_loc, \"Unsupported parameter type\")\n                    .addNote(report_error(emitted_function->getNameInfo().getLoc(), \"in function\", clang::DiagnosticsEngine::Note))\n                    .addNote(report_error(template_arg_loc, \"used in definition here\", clang::DiagnosticsEngine::Note));\n                }\n              }\n            } else {\n              // TODO: For non-pointer parameters, perform more elaborate validation to ensure ABI compatibility\n            }\n          }\n\n          thunked_api.push_back(ThunkedAPIFunction {(const FunctionParams&)data, data.function_name, data.return_type,\n                                                    namespace_info.host_loader.empty() ? \"dlsym_default\" : namespace_info.host_loader,\n                                                    data.is_variadic || annotations.custom_guest_entrypoint, data.is_variadic, std::nullopt});\n          if (namespace_info.generate_guest_symtable) {\n            thunked_api.back().symtable_namespace = namespace_idx;\n          }\n\n          if (data.is_variadic) {\n            if (!annotations.uniform_va_type) {\n              throw report_error(decl->getBeginLoc(), \"Variadic functions must be annotated with parameter type using uniform_va_type\");\n            }\n\n            // Convert variadic argument list into a count + pointer pair\n            data.param_types.push_back(context.getSizeType());\n            data.param_types.push_back(context.getPointerType(*annotations.uniform_va_type));\n            types.emplace(context.getSizeType().getTypePtr(), RepackedType {});\n            if (!annotations.uniform_va_type.value()->isVoidPointerType()) {\n              types.emplace(annotations.uniform_va_type->getTypePtr(), RepackedType {});\n            }\n          }\n\n          if (data.is_variadic) {\n            // This function is thunked through an \"_internal\" symbol since its signature\n            // is different from the one in the native host/guest libraries.\n            data.function_name = data.function_name + \"_internal\";\n            if (data.custom_host_impl) {\n              throw report_error(decl->getBeginLoc(), \"Custom host impl requested but this is implied by the function signature already\");\n            }\n            data.custom_host_impl = true;\n          }\n\n          // For indirect calls, register the function signature as a function pointer type\n          if (namespace_info.indirect_guest_calls) {\n            thunked_funcptrs[emitted_function->getNameAsString()] =\n              std::pair {context.getCanonicalType(emitted_function->getFunctionType()), data.param_annotations};\n          }\n\n          thunks.push_back(std::move(data));\n        }\n      }\n    }\n  }\n}\n\nvoid AnalysisAction::CoverReferencedTypes(clang::ASTContext& context) {\n  // Add common fixed-size integer types explicitly\n  for (unsigned size : {8, 32, 64}) {\n    types.emplace(context.getIntTypeForBitwidth(size, false).getTypePtr(), RepackedType {});\n    types.emplace(context.getIntTypeForBitwidth(size, true).getTypePtr(), RepackedType {});\n  }\n\n  // Repeat until no more children are appended\n  for (bool changed = true; std::exchange(changed, false);) {\n    for (auto next_type_it = types.begin(), type_it = next_type_it; type_it != types.end(); type_it = next_type_it) {\n      ++next_type_it;\n      const auto& [type, type_repack_info] = *type_it;\n      if (!type->isStructureType()) {\n        continue;\n      }\n\n      if (type_repack_info.assumed_compatible) {\n        // If assumed compatible, we don't need the member definitions\n        continue;\n      }\n\n      for (auto* member : type->getAsStructureType()->getDecl()->fields()) {\n        auto member_type = member->getType().getTypePtr();\n        if (type_repack_info.UsesCustomRepackFor(member) && member_type->isPointerType() && member_type->getPointeeType()->isStructureType()) {\n          continue;\n        }\n\n        while (member_type->isArrayType()) {\n          member_type = member_type->getArrayElementTypeNoTypeQual();\n        }\n        while (member_type->isPointerType()) {\n          member_type = member_type->getPointeeType().getTypePtr();\n        }\n\n        if (!member_type->isBuiltinType()) {\n          member_type = context.getCanonicalType(member_type);\n        }\n        if (types.contains(member_type) && types.at(member_type).pointers_only) {\n          if (member_type == context.getCanonicalType(member->getType().getTypePtr())) {\n            throw std::runtime_error(\n              fmt::format(\"\\\"{}\\\" references opaque type \\\"{}\\\" via non-pointer member \\\"{}\\\"\", clang::QualType {type, 0}.getAsString(),\n                          clang::QualType {member_type, 0}.getAsString(), member->getNameAsString()));\n          }\n          continue;\n        }\n        if (member_type->isUnionType() && !types.contains(member_type) && !type_repack_info.UsesCustomRepackFor(member)) {\n          throw std::runtime_error(fmt::format(\"\\\"{}\\\" has unannotated member \\\"{}\\\" of union type \\\"{}\\\"\", clang::QualType {type, 0}.getAsString(),\n                                               member->getNameAsString(), clang::QualType {member_type, 0}.getAsString()));\n        }\n\n        if (!member_type->isStructureType() && !(member_type->isBuiltinType() && !member_type->isVoidType()) && !member_type->isEnumeralType()) {\n          continue;\n        }\n\n        auto [new_type_it, inserted] = types.emplace(member_type, RepackedType {});\n        if (inserted) {\n          changed = true;\n          next_type_it = new_type_it;\n        }\n      }\n    }\n  }\n}\n\nclass ASTVisitor : public clang::RecursiveASTVisitor<ASTVisitor> {\n  std::vector<clang::DeclContext*>& decl_contexts;\n\npublic:\n  ASTVisitor(std::vector<clang::DeclContext*>& decl_contexts_)\n    : decl_contexts(decl_contexts_) {}\n\n  /**\n   * Matches \"template<auto> struct fex_gen_config { ... }\"\n   */\n  bool VisitClassTemplateDecl(clang::ClassTemplateDecl* decl) {\n    if (decl->getName() != \"fex_gen_config\") {\n      return true;\n    }\n\n    if (llvm::dyn_cast<clang::NamespaceDecl>(decl->getDeclContext())) {\n      decl_contexts.push_back(decl->getDeclContext());\n    }\n\n    return true;\n  }\n};\n\nclass ASTConsumer : public clang::ASTConsumer {\n  std::vector<clang::DeclContext*>& decl_contexts;\n\npublic:\n  ASTConsumer(std::vector<clang::DeclContext*>& decl_contexts_)\n    : decl_contexts(decl_contexts_) {}\n\n  void HandleTranslationUnit(clang::ASTContext& context) override {\n    ASTVisitor {decl_contexts}.TraverseDecl(context.getTranslationUnitDecl());\n  }\n};\n\nstd::unique_ptr<clang::ASTConsumer> AnalysisAction::CreateASTConsumer(clang::CompilerInstance&, clang::StringRef) {\n  return std::make_unique<ASTConsumer>(decl_contexts);\n}\n"
  },
  {
    "path": "ThunkLibs/Generator/analysis.h",
    "content": "#pragma once\n\n#include <clang/Basic/FileEntry.h>\n#include <clang/Frontend/FrontendAction.h>\n\n#include <memory>\n#include <optional>\n#include <string>\n#include <unordered_map>\n#include <unordered_set>\n#include <vector>\n\nstruct FunctionParams {\n  std::vector<clang::QualType> param_types;\n};\n\nstruct ThunkedCallback : FunctionParams {\n  clang::QualType return_type;\n\n  bool is_stub = false; // Callback will be replaced by a stub that calls std::abort\n  bool is_variadic = false;\n};\n\nstruct ParameterAnnotations {\n  bool is_passthrough = false;\n  bool assume_compatible = false;\n\n  bool operator==(const ParameterAnnotations&) const = default;\n};\n\n/**\n * Guest<->Host transition point.\n *\n * These are normally used to translate the public API of the guest to host\n * function calls (ThunkedAPIFunction), but a thunk library may also define\n * internal thunks that don't correspond to any function in the implemented\n * API.\n */\nstruct ThunkedFunction : FunctionParams {\n  std::string function_name;\n  clang::QualType return_type;\n\n  // If true, param_types contains an extra size_t and the valist for marshalling through an internal function\n  bool is_variadic = false;\n\n  // If true, the unpacking function will call a custom fexfn_impl function\n  // to be provided manually instead of calling the host library function\n  // directly.\n  // This is implied e.g. for thunks generated for variadic functions\n  bool custom_host_impl = false;\n\n  std::string GetOriginalFunctionName() const {\n    const std::string suffix = \"_internal\";\n    assert(function_name.length() > suffix.size());\n    assert((std::string_view {&*function_name.end() - suffix.size(), suffix.size()} == suffix));\n    return function_name.substr(0, function_name.size() - suffix.size());\n  }\n\n  // Maps parameter index to ThunkedCallback\n  std::unordered_map<unsigned, ThunkedCallback> callbacks;\n\n  // Maps parameter index to ParameterAnnotations\n  // TODO: Use index -1 for the return value?\n  std::unordered_map<unsigned, ParameterAnnotations> param_annotations;\n\n  clang::FunctionDecl* decl;\n};\n\n/**\n * Function that is part of the API of the thunked library.\n *\n * For each of these, there is:\n * - A publicly visible guest entrypoint (usually auto-generated but may be manually defined)\n * - A pointer to the native host library function loaded through dlsym (or a user-provided function specified via host_loader)\n * - A ThunkedFunction with the same function_name (possibly suffixed with _internal)\n */\nstruct ThunkedAPIFunction : FunctionParams {\n  std::string function_name;\n\n  clang::QualType return_type;\n\n  // name of the function to load the native host symbol with\n  std::string host_loader;\n\n  // If true, no guest-side implementation of this function will be autogenerated\n  bool custom_guest_impl;\n\n  bool is_variadic;\n\n  // Index of the symbol table to store this export in (see guest_symtables).\n  // If empty, a library export is created, otherwise the function is entered into a function pointer array\n  std::optional<std::size_t> symtable_namespace;\n};\n\nstruct NamespaceInfo {\n  clang::DeclContext* context;\n\n  std::string name;\n\n  // Function to load native host library functions with.\n  // This function must be defined manually with the signature \"void* func(void*, const char*)\"\n  std::string host_loader;\n\n  bool generate_guest_symtable;\n\n  bool indirect_guest_calls;\n};\n\nclass AnalysisAction : public clang::ASTFrontendAction {\npublic:\n  AnalysisAction() {\n    decl_contexts.push_back(nullptr); // global namespace (replaced by getTranslationUnitDecl later)\n  }\n\n  void ExecuteAction() override;\n\n  std::unique_ptr<clang::ASTConsumer> CreateASTConsumer(clang::CompilerInstance&, clang::StringRef /*file*/) override;\n\n  struct RepackedType {\n    bool assumed_compatible = false;         // opaque_type or assume_compatible_data_layout\n    bool pointers_only = assumed_compatible; // if true, only pointers to this type may be used\n\n    // If true, emit guest_layout/host_layout definitions even if the type is non-repackable\n    bool emit_layout_wrappers = false;\n\n    // Set of members (identified by their field name) with custom repacking\n    std::unordered_set<std::string> custom_repacked_members;\n\n    bool UsesCustomRepackFor(const clang::FieldDecl* member) const {\n      return custom_repacked_members.contains(member->getNameAsString());\n    }\n    bool UsesCustomRepackFor(const std::string& member_name) const {\n      return custom_repacked_members.contains(member_name);\n    }\n  };\n\nprotected:\n  // Build the internal API representation by processing fex_gen_config and other annotated entities\n  void ParseInterface(clang::ASTContext&);\n\n  // Recursively extend the type set to include types of struct members\n  void CoverReferencedTypes(clang::ASTContext&);\n\n  // Called from ExecuteAction() after parsing is complete\n  virtual void OnAnalysisComplete(clang::ASTContext&) {};\n\n  std::vector<clang::DeclContext*> decl_contexts;\n\n  std::vector<ThunkedFunction> thunks;\n  std::vector<ThunkedAPIFunction> thunked_api;\n\n  // Set of function types for which to generate Guest->Host thunking trampolines.\n  // The map key is a unique identifier that must be consistent between guest/host processing passes.\n  // The map value is a pair of the function pointer's clang::Type and the mapping of parameter annotations\n  std::unordered_map<std::string, std::pair<const clang::Type*, std::unordered_map<unsigned, ParameterAnnotations>>> thunked_funcptrs;\n\n  std::unordered_map<const clang::Type*, RepackedType> types;\n  std::optional<unsigned> lib_version;\n  std::vector<NamespaceInfo> namespaces;\n\n  RepackedType& LookupType(clang::ASTContext& context, const clang::Type* type) {\n    return types.at(context.getCanonicalType(type));\n  }\n};\n\ninline std::string get_type_name(const clang::ASTContext& context, const clang::Type* type) {\n  if (type->isBuiltinType()) {\n    // Skip canonicalization\n    return clang::QualType {type, 0}.getAsString();\n  }\n\n  if (auto decl = type->getAsTagDecl()) {\n    // Replace unnamed types with a placeholder. This will fail to compile if referenced\n    // anywhere in generated code, but at least it will point to a useful location.\n    //\n    // A notable exception are C-style struct declarations like \"typedef struct (unnamed) { ... } MyStruct;\".\n    // A typedef name is associated with these for linking purposes, so\n    // getAsString() will produce a usable identifier.\n    // TODO: Consider turning this into a hard error instead of replacing the name\n    if (!decl->getDeclName() && !decl->getTypedefNameForAnonDecl()) {\n      auto loc = context.getSourceManager().getPresumedLoc(decl->getLocation());\n      std::string filename = loc.getFilename();\n      filename = std::move(filename).substr(filename.rfind(\"/\"));\n      filename = std::move(filename).substr(1);\n      std::replace(filename.begin(), filename.end(), '.', '_');\n      return \"unnamed_type_\" + filename + \"_\" + std::to_string(loc.getLine());\n    }\n  }\n\n  auto type_name = clang::QualType {context.getCanonicalType(type), 0}.getAsString();\n  if (type_name.starts_with(\"struct \")) {\n    type_name = type_name.substr(7);\n  }\n  if (type_name.starts_with(\"class \") || type_name.starts_with(\"union \")) {\n    type_name = type_name.substr(6);\n  }\n  if (type_name.starts_with(\"enum \")) {\n    type_name = type_name.substr(5);\n  }\n  return type_name;\n}\n\ninline std::string get_fixed_size_int_name(bool is_signed, int size) {\n  return (!is_signed ? \"u\" : \"\") + std::string {\"int\"} + std::to_string(size) + \"_t\";\n}\n\ninline std::string get_fixed_size_int_name(const clang::Type* type, int size) {\n  return get_fixed_size_int_name(type->isSignedIntegerType(), size);\n}\n\ninline std::string get_fixed_size_int_name(const clang::Type* type, const clang::ASTContext& context) {\n  return get_fixed_size_int_name(type, context.getTypeSize(type));\n}\n"
  },
  {
    "path": "ThunkLibs/Generator/data_layout.cpp",
    "content": "#include \"analysis.h\"\n#include \"data_layout.h\"\n#include \"interface.h\"\n\n#include <fmt/format.h>\n\n#include <openssl/sha.h>\n\nconstexpr bool enable_debug_output = false;\n\n// Visitor for gathering data layout information that can be passed across libclang invocations\nclass AnalyzeDataLayoutAction : public AnalysisAction {\n  ABI& type_abi;\n\n  void OnAnalysisComplete(clang::ASTContext&) override;\n\npublic:\n  AnalyzeDataLayoutAction(ABI&);\n};\n\nAnalyzeDataLayoutAction::AnalyzeDataLayoutAction(ABI& abi_)\n  : type_abi(abi_) {}\n\nstd::unordered_map<const clang::Type*, TypeInfo>\nComputeDataLayout(const clang::ASTContext& context, const std::unordered_map<const clang::Type*, AnalysisAction::RepackedType>& types) {\n  std::unordered_map<const clang::Type*, TypeInfo> layout;\n\n  // First, add all types directly used in function signatures of the library API to the meta set\n  for (const auto& [type, type_repack_info] : types) {\n    if (type_repack_info.assumed_compatible) {\n      auto [_, inserted] = layout.insert(std::pair {context.getCanonicalType(type), TypeInfo {}});\n      if (!inserted) {\n        throw std::runtime_error(\n          \"Failed to gather type metadata: Opaque type \\\"\" + clang::QualType {type, 0}.getAsString() + \"\\\" already registered\");\n      }\n      continue;\n    }\n\n    if (type->isIncompleteType()) {\n      throw std::runtime_error(\n        \"Cannot compute data layout of incomplete type \\\"\" + clang::QualType {type, 0}.getAsString() + \"\\\". Did you forget any annotations?\");\n    }\n\n    if (type->isStructureType()) {\n      StructInfo info;\n      info.size_bits = context.getTypeSize(type);\n      info.alignment_bits = context.getTypeAlign(type);\n\n      auto [_, inserted] = layout.insert(std::pair {context.getCanonicalType(type), info});\n      if (!inserted) {\n        throw std::runtime_error(\"Failed to gather type metadata: Type \\\"\" + clang::QualType {type, 0}.getAsString() + \"\\\" already registered\");\n      }\n    } else if (type->isBuiltinType() || type->isEnumeralType()) {\n      SimpleTypeInfo info;\n      info.size_bits = context.getTypeSize(type);\n      info.alignment_bits = context.getTypeAlign(type);\n\n      // NOTE: Non-enum types are intentionally not canonicalized since that would turn e.g. size_t into platform-specific types\n      auto [_, inserted] = layout.insert(std::pair {type->isEnumeralType() ? context.getCanonicalType(type) : type, info});\n      if (!inserted) {\n        throw std::runtime_error(\"Failed to gather type metadata: Type \\\"\" + clang::QualType {type, 0}.getAsString() + \"\\\" already registered\");\n      }\n    }\n  }\n\n  // Then, add information about members\n  for (const auto& [type, type_repack_info] : types) {\n    if (!type->isStructureType() || type_repack_info.assumed_compatible) {\n      continue;\n    }\n\n    auto& info = *layout.at(context.getCanonicalType(type)).get_if_struct();\n\n    for (auto* field : type->getAsStructureType()->getDecl()->fields()) {\n      auto field_type = field->getType().getTypePtr();\n      std::optional<uint64_t> array_size;\n      if (auto array_type = llvm::dyn_cast<clang::ConstantArrayType>(field->getType())) {\n        array_size = array_type->getSize().getZExtValue();\n        field_type = array_type->getElementType().getTypePtr();\n        if (llvm::isa<clang::ConstantArrayType>(field_type)) {\n          throw std::runtime_error(\"Unsupported multi-dimensional array member \\\"\" + field->getNameAsString() + \"\\\" in type \\\"\" +\n                                   clang::QualType {type, 0}.getAsString() + \"\\\"\");\n        }\n      }\n\n      StructInfo::MemberInfo member_info {\n        .size_bits = context.getTypeSize(field->getType()), // Total size even for arrays\n        .offset_bits = context.getFieldOffset(field),\n        .type_name = get_type_name(context, field_type),\n        .member_name = field->getNameAsString(),\n        .array_size = array_size,\n        .is_function_pointer = field_type->isFunctionPointerType(),\n        .is_integral = field->getType()->isIntegerType(),\n        .is_signed_integer = field->getType()->isSignedIntegerType(),\n      };\n\n      // TODO: Process types in dependency-order. Currently we skip this\n      //       check if we haven't processed the member type already,\n      //       which is only safe since this is a consistency check\n      if (field_type->isStructureType() && layout.contains(context.getCanonicalType(field_type))) {\n        // Assert for self-consistency\n        auto field_meta = layout.at(context.getCanonicalType(field_type));\n        (void)types.at(context.getCanonicalType(field_type));\n        if (auto field_info = field_meta.get_if_simple_or_struct()) {\n          if (field_info->size_bits != member_info.size_bits / member_info.array_size.value_or(1)) {\n            throw std::runtime_error(\"Inconsistent type size detected\");\n          }\n        }\n      }\n\n      // Add built-in types, even if referenced through a pointer\n      for (auto* inner_field_type = field_type; inner_field_type; inner_field_type = inner_field_type->getPointeeType().getTypePtrOrNull()) {\n        if (inner_field_type->isBuiltinType() || inner_field_type->isEnumeralType()) {\n          // The analysis pass doesn't explicitly register built-in types, so add them manually here\n          SimpleTypeInfo info {\n            .size_bits = context.getTypeSize(inner_field_type),\n            .alignment_bits = context.getTypeAlign(inner_field_type),\n          };\n          if (!inner_field_type->isBuiltinType()) {\n            inner_field_type = context.getCanonicalType(inner_field_type);\n          }\n          [[maybe_unused]] auto [prev, inserted] = layout.insert(std::pair {inner_field_type, info});\n          //                    if (!inserted && prev->second != TypeInfo { info }) {\n          //                        // TODO: Throw error since consistency check failed\n          //                    }\n        }\n      }\n\n      info.members.push_back(std::move(member_info));\n    }\n  }\n\n  if (enable_debug_output) {\n    for (const auto& [type, info] : layout) {\n      auto basic_info = info.get_if_simple_or_struct();\n      if (!basic_info) {\n        continue;\n      }\n\n      fprintf(stderr, \"  Host entry %s: %lu (%lu)\\n\", clang::QualType {type, 0}.getAsString().c_str(), basic_info->size_bits / 8,\n              basic_info->alignment_bits / 8);\n\n      if (auto struct_info = info.get_if_struct()) {\n        for (const auto& member : struct_info->members) {\n          fprintf(stderr, \"    Offset %lu-%lu: %s %s%s\\n\", member.offset_bits / 8, (member.offset_bits + member.size_bits - 1) / 8,\n                  member.type_name.c_str(), member.member_name.c_str(),\n                  member.array_size ? fmt::format(\"[{}]\", member.array_size.value()).c_str() : \"\");\n        }\n      }\n    }\n  }\n\n  return layout;\n}\n\nABI GetStableLayout(const clang::ASTContext& context, const std::unordered_map<const clang::Type*, TypeInfo>& data_layout) {\n  ABI stable_layout;\n\n  for (auto [type, type_info] : data_layout) {\n    auto type_name = get_type_name(context, type);\n    if (auto struct_info = type_info.get_if_struct()) {\n      for (auto& member : struct_info->members) {\n        if (member.is_integral) {\n          // Map member types to fixed-size integers\n          auto alt_type_name = get_fixed_size_int_name(member.is_signed_integer, member.size_bits);\n          auto alt_type_info = SimpleTypeInfo {\n            .size_bits = member.size_bits,\n            .alignment_bits = context.getTypeAlign(context.getIntTypeForBitwidth(member.size_bits, member.is_signed_integer)),\n          };\n          stable_layout.insert(std::pair {alt_type_name, alt_type_info});\n          member.type_name = std::move(alt_type_name);\n        }\n      }\n    }\n\n    auto [it, inserted] = stable_layout.insert(std::pair {type_name, std::move(type_info)});\n    if (type->isIntegerType()) {\n      auto alt_type_name = get_fixed_size_int_name(type, context);\n      stable_layout.insert(std::pair {std::move(alt_type_name), type_info});\n    }\n\n    if (!inserted && it->second != type_info && !type->isIntegerType()) {\n      throw std::runtime_error(\"Duplicate type information: Tried to re-register type \\\"\" + type_name + \"\\\"\");\n    }\n  }\n\n  stable_layout.pointer_size = context.getTypeSize(context.getUIntPtrType()) / 8;\n\n  return stable_layout;\n}\n\nstatic std::array<uint8_t, 32> GetSha256(const std::string& function_name) {\n  std::array<uint8_t, 32> sha256;\n  SHA256(reinterpret_cast<const unsigned char*>(function_name.data()), function_name.size(), sha256.data());\n  return sha256;\n};\n\nstd::string GetTypeNameWithFixedSizeIntegers(clang::ASTContext& context, clang::QualType type) {\n  if (type->isBuiltinType() && type->isIntegerType()) {\n    auto size = context.getTypeSize(type);\n    return fmt::format(\"uint{}_t\", size);\n  } else if (type->isPointerType() && type->getPointeeType()->isBuiltinType() && type->getPointeeType()->isIntegerType() &&\n             context.getTypeSize(type->getPointeeType()) > 8) {\n    // TODO: Also apply this path to char-like types\n    auto size = context.getTypeSize(type->getPointeeType());\n    return fmt::format(\"uint{}_t*\", size);\n  } else {\n    return type.getAsString();\n  }\n}\n\nvoid AnalyzeDataLayoutAction::OnAnalysisComplete(clang::ASTContext& context) {\n  type_abi = GetStableLayout(context, ComputeDataLayout(context, types));\n\n  // Register functions that must be guest-callable through host function pointers\n  for (auto funcptr_type_it = thunked_funcptrs.begin(); funcptr_type_it != thunked_funcptrs.end(); ++funcptr_type_it) {\n    auto& funcptr_id = funcptr_type_it->first;\n    auto& [type, param_annotations] = funcptr_type_it->second;\n    auto func_type = type->getAs<clang::FunctionProtoType>();\n    std::string mangled_name = clang::QualType {type, 0}.getAsString();\n    auto cb_sha256 = GetSha256(\"fexcallback_\" + mangled_name);\n    FuncPtrInfo info = {cb_sha256};\n\n    // TODO: Also apply GetTypeNameWithFixedSizeIntegers here\n    info.result = func_type->getReturnType().getAsString();\n\n    for (auto arg : func_type->getParamTypes()) {\n      info.args.push_back(GetTypeNameWithFixedSizeIntegers(context, arg));\n    }\n    type_abi.thunked_funcptrs[funcptr_id] = std::move(info);\n  }\n}\n\nTypeCompatibility DataLayoutCompareAction::GetTypeCompatibility(const clang::ASTContext& context, const clang::Type* type,\n                                                                const std::unordered_map<const clang::Type*, TypeInfo> host_abi,\n                                                                std::unordered_map<const clang::Type*, TypeCompatibility>& type_compat) {\n  assert(type->isCanonicalUnqualified() || type->isBuiltinType() || type->isEnumeralType());\n\n  {\n    // Reserve a slot to be filled later. The placeholder value is used\n    // to detect infinite recursions.\n    constexpr auto placeholder_compat = TypeCompatibility {100};\n    auto [existing_compat_it, is_new_type] = type_compat.emplace(type, placeholder_compat);\n    if (!is_new_type) {\n      if (existing_compat_it->second == placeholder_compat) {\n        throw std::runtime_error(\"Found recursive reference to type \\\"\" + clang::QualType {type, 0}.getAsString() + \"\\\"\");\n      }\n\n      return existing_compat_it->second;\n    }\n  }\n\n  if (types.contains(type) && types.at(type).assumed_compatible) {\n    if (types.at(type).pointers_only && !type->isPointerType()) {\n      throw std::runtime_error(\n        \"Tried to dereference opaque type \\\"\" + clang::QualType {type, 0}.getAsString() + \"\\\" when querying data layout compatibility\");\n    }\n    type_compat.at(type) = TypeCompatibility::Full;\n    return TypeCompatibility::Full;\n  }\n\n  auto type_name = get_type_name(context, type);\n  // Look up the same type name in the guest map,\n  // unless it's an integer (which is mapped to fixed-size uintX_t types)\n  auto guest_info = guest_abi.at(!type->isIntegerType() ? std::move(type_name) : get_fixed_size_int_name(type, context));\n  auto& host_info = host_abi.at(type->isBuiltinType() ? type : context.getCanonicalType(type));\n\n  const bool is_32bit = (guest_abi.pointer_size == 4);\n\n  // Assume full compatibility, then downgrade as needed\n  auto compat = TypeCompatibility::Full;\n\n  if (guest_info != host_info) {\n    // Non-matching data layout... downgrade to Repackable\n    // TODO: Even for non-structs, this only works if the types are reasonably similar (e.g. uint32_t -> uint64_t)\n    compat = TypeCompatibility::Repackable;\n  }\n\n  auto guest_struct_info = guest_info.get_if_struct();\n  if (guest_struct_info && guest_struct_info->members.size() != host_info.get_if_struct()->members.size()) {\n    // Members are missing from either the guest or host layout\n    // NOTE: If the members are merely named differently, this will be caught in the else-if below\n    compat = TypeCompatibility::None;\n  } else if (guest_struct_info) {\n    std::vector<TypeCompatibility> member_compat;\n    for (std::size_t member_idx = 0; member_idx < guest_struct_info->members.size(); ++member_idx) {\n      // Look up the corresponding member in the host struct definition.\n      // The members may be listed in a different order, so we can't\n      // directly use member_idx for this\n      auto* host_member_field = [&]() -> clang::FieldDecl* {\n        auto struct_decl = type->getAsStructureType()->getDecl();\n        auto it = std::find_if(struct_decl->field_begin(), struct_decl->field_end(),\n                               [&](auto* field) { return field->getName() == guest_struct_info->members.at(member_idx).member_name; });\n        if (it == struct_decl->field_end()) {\n          return nullptr;\n        }\n        return *it;\n      }();\n      if (!host_member_field) {\n        // No corresponding host struct member\n        // TODO: Also detect host members that are missing from the guest struct\n        member_compat.push_back(TypeCompatibility::None);\n        break;\n      }\n\n      auto host_member_type = context.getCanonicalType(host_member_field->getType().getTypePtr());\n      if (auto array_type = llvm::dyn_cast<clang::ConstantArrayType>(host_member_type)) {\n        // Compare array element type only. The array size is already considered by the layout information of the containing struct.\n        host_member_type = context.getCanonicalType(array_type->getElementType().getTypePtr());\n      }\n\n      if (types.at(type).UsesCustomRepackFor(host_member_field)) {\n        member_compat.push_back(TypeCompatibility::Repackable);\n        continue;\n      } else if (host_member_type->isPointerType()) {\n        // Automatic repacking of pointers to non-compatible types is only possible if:\n        // * Pointee is fully compatible, or\n        // * Pointer member is annotated\n        auto host_member_pointee_type = context.getCanonicalType(host_member_type->getPointeeType().getTypePtr());\n        if (types.contains(host_member_pointee_type) && types.at(host_member_pointee_type).assumed_compatible) {\n          // Pointee doesn't need repacking, but pointer needs extending on 32-bit\n          member_compat.push_back(is_32bit ? TypeCompatibility::Repackable : TypeCompatibility::Full);\n        } else if (host_member_pointee_type->isPointerType()) {\n          // This is a nested pointer, e.g. void**\n\n          if (is_32bit) {\n            // Nested pointers can't be repacked on 32-bit\n            member_compat.push_back(TypeCompatibility::None);\n          } else if (types.contains(host_member_pointee_type->getPointeeType().getTypePtr()) &&\n                     types.at(host_member_pointee_type->getPointeeType().getTypePtr()).assumed_compatible) {\n            // Pointers to opaque types are fine\n            member_compat.push_back(TypeCompatibility::Full);\n          } else {\n            // Check the innermost type's compatibility on 64-bit\n            auto pointee_pointee_type = host_member_pointee_type->getPointeeType().getTypePtr();\n            // TODO: Not sure how to handle void here. Probably should require an annotation instead of \"just working\"\n            auto pointee_pointee_compat = pointee_pointee_type->isVoidType() ?\n                                            TypeCompatibility::Full :\n                                            GetTypeCompatibility(context, pointee_pointee_type, host_abi, type_compat);\n            if (pointee_pointee_compat == TypeCompatibility::Full) {\n              member_compat.push_back(TypeCompatibility::Full);\n            } else {\n              member_compat.push_back(TypeCompatibility::None);\n            }\n          }\n        } else if (!host_member_pointee_type->isVoidType() &&\n                   (host_member_pointee_type->isBuiltinType() || host_member_pointee_type->isEnumeralType())) {\n          // TODO: What are good heuristics for this?\n          // size_t should yield TypeCompatibility::Repackable\n          // inconsistent types should probably default to TypeCompatibility::None\n          // For now, just always assume compatible... (will degrade to Repackable below)\n          member_compat.push_back(TypeCompatibility::Full);\n        } else if (!host_member_pointee_type->isVoidType() &&\n                   (host_member_pointee_type->isStructureType() || types.contains(host_member_pointee_type))) {\n          auto pointee_compat = GetTypeCompatibility(context, host_member_pointee_type, host_abi, type_compat);\n          if (pointee_compat == TypeCompatibility::Full) {\n            // Pointee is fully compatible, so automatic repacking only requires converting the pointers themselves\n            member_compat.push_back(is_32bit ? TypeCompatibility::Repackable : TypeCompatibility::Full);\n          } else {\n            // If the pointee is incompatible (even if repackable), automatic repacking isn't possible\n            member_compat.push_back(TypeCompatibility::None);\n          }\n        } else if (!is_32bit && host_member_pointee_type->isVoidType()) {\n          // TODO: Not sure how to handle void here. Probably should require an annotation instead of \"just working\"\n          member_compat.push_back(TypeCompatibility::Full);\n        } else {\n          member_compat.push_back(TypeCompatibility::None);\n        }\n        continue;\n      }\n\n      if (guest_abi.at(guest_struct_info->members[member_idx].type_name).get_if_struct()) {\n        auto host_type_info = host_abi.at(host_member_type);\n        member_compat.push_back(GetTypeCompatibility(context, host_member_type, host_abi, type_compat));\n      } else {\n        // Member was checked for size/alignment above already\n      }\n    }\n\n    if (std::all_of(member_compat.begin(), member_compat.end(), [](auto compat) { return compat == TypeCompatibility::Full; })) {\n      // TypeCompatibility::Full or ::Repackable\n    } else if (std::none_of(member_compat.begin(), member_compat.end(), [](auto compat) { return compat == TypeCompatibility::None; })) {\n      // Downgrade to Repackable\n      compat = TypeCompatibility::Repackable;\n    } else {\n      // Downgrade to None\n      compat = TypeCompatibility::None;\n    }\n  }\n\n  type_compat.at(type) = compat;\n  return compat;\n}\n\nFuncPtrInfo DataLayoutCompareAction::LookupGuestFuncPtrInfo(const char* funcptr_id) {\n  return guest_abi.thunked_funcptrs.at(funcptr_id);\n}\n\nDataLayoutCompareActionFactory::DataLayoutCompareActionFactory(const ABI& abi)\n  : abi(abi) {}\n\nDataLayoutCompareActionFactory::~DataLayoutCompareActionFactory() = default;\n\nstd::unique_ptr<clang::FrontendAction> DataLayoutCompareActionFactory::create() {\n  return std::make_unique<DataLayoutCompareAction>(abi);\n}\n\nAnalyzeDataLayoutActionFactory::AnalyzeDataLayoutActionFactory()\n  : abi(std::make_unique<ABI>()) {}\n\nAnalyzeDataLayoutActionFactory::~AnalyzeDataLayoutActionFactory() = default;\n\nstd::unique_ptr<clang::FrontendAction> AnalyzeDataLayoutActionFactory::create() {\n  return std::make_unique<AnalyzeDataLayoutAction>(*abi);\n}\n"
  },
  {
    "path": "ThunkLibs/Generator/data_layout.h",
    "content": "#pragma once\n\n#include \"analysis.h\"\n\n#include <clang/Frontend/FrontendAction.h>\n\n#include <cstdint>\n#include <optional>\n#include <string>\n#include <unordered_map>\n#include <variant>\n#include <vector>\n\nstruct SimpleTypeInfo {\n  uint64_t size_bits;\n  uint64_t alignment_bits;\n\n  bool operator==(const SimpleTypeInfo& other) const {\n    return size_bits == other.size_bits && alignment_bits == other.alignment_bits;\n  }\n};\n\nstruct StructInfo : SimpleTypeInfo {\n  struct MemberInfo {\n    uint64_t size_bits; // size of this member. For arrays, total size of all elements\n    uint64_t offset_bits;\n    std::string type_name;\n    std::string member_name;\n    std::optional<uint64_t> array_size;\n    bool is_function_pointer;\n    bool is_integral;\n    bool is_signed_integer;\n\n    bool operator==(const MemberInfo& other) const {\n      return size_bits == other.size_bits && offset_bits == other.offset_bits &&\n             // The type name may differ for integral types if all other parameters are equal\n             (type_name == other.type_name || (is_integral && other.is_integral)) && member_name == other.member_name &&\n             array_size == other.array_size && is_function_pointer == other.is_function_pointer && is_integral == other.is_integral;\n    }\n  };\n\n  std::vector<MemberInfo> members;\n\n  bool operator==(const StructInfo& other) const {\n    return (const SimpleTypeInfo&)*this == (const SimpleTypeInfo&)other &&\n           std::equal(members.begin(), members.end(), other.members.begin(), other.members.end());\n  }\n};\n\nstruct TypeInfo : std::variant<std::monostate, SimpleTypeInfo, StructInfo> {\n  using Parent = std::variant<std::monostate, SimpleTypeInfo, StructInfo>;\n\n  TypeInfo() = default;\n  TypeInfo(const SimpleTypeInfo& info)\n    : Parent(info) {}\n  TypeInfo(const StructInfo& info)\n    : Parent(info) {}\n\n  // Opaque declaration with no full definition.\n  // Pointers to these can still be passed along ABI boundaries assuming\n  // implementation details are only ever accessed on one side.\n  bool is_opaque() const {\n    return std::holds_alternative<std::monostate>(*this);\n  }\n\n  const StructInfo* get_if_struct() const {\n    return std::get_if<StructInfo>(this);\n  }\n\n  StructInfo* get_if_struct() {\n    return std::get_if<StructInfo>(this);\n  }\n\n  const SimpleTypeInfo* get_if_simple_or_struct() const {\n    auto as_struct = std::get_if<StructInfo>(this);\n    if (as_struct) {\n      return as_struct;\n    }\n    return std::get_if<SimpleTypeInfo>(this);\n  }\n};\n\nstruct FuncPtrInfo {\n  std::array<uint8_t, 32> sha256;\n  std::string result;\n  std::vector<std::string> args;\n};\n\nstruct ABI : std::unordered_map<std::string, TypeInfo> {\n  std::unordered_map<std::string, FuncPtrInfo> thunked_funcptrs;\n  int pointer_size; // in bytes\n};\n\nstd::unordered_map<const clang::Type*, TypeInfo>\nComputeDataLayout(const clang::ASTContext& context, const std::unordered_map<const clang::Type*, AnalysisAction::RepackedType>& types);\n\n// Convert the output of ComputeDataLayout to a format that isn't tied to a libclang session.\n// As a consequence, type information is indexed by type name instead of clang::Type.\nABI GetStableLayout(const clang::ASTContext& context, const std::unordered_map<const clang::Type*, TypeInfo>& data_layout);\n\n/**\n * Returns the type of the given name, but replaces any mentions of integer\n * types with fixed-size equivalents.\n *\n * Examples:\n * - int -> int32_t\n * - unsigned long long* -> uint64_t*\n * - MyStruct -> MyStruct (no change)\n */\nstd::string GetTypeNameWithFixedSizeIntegers(clang::ASTContext&, clang::QualType);\n\nenum class TypeCompatibility {\n  Full,       // Type has matching data layout across architectures\n  Repackable, // Type has different data layout but can be repacked automatically\n  None,       // Type has different data layout and cannot be repacked automatically\n};\n\nclass DataLayoutCompareAction : public AnalysisAction {\npublic:\n  DataLayoutCompareAction(const ABI& guest_abi)\n    : guest_abi(guest_abi) {}\n\n  TypeCompatibility GetTypeCompatibility(const clang::ASTContext&, const clang::Type*,\n                                         const std::unordered_map<const clang::Type*, TypeInfo> host_abi,\n                                         std::unordered_map<const clang::Type*, TypeCompatibility>& type_compat);\n\n  FuncPtrInfo LookupGuestFuncPtrInfo(const char* funcptr_id);\n\nprotected:\n  const ABI& guest_abi;\n};\n"
  },
  {
    "path": "ThunkLibs/Generator/diagnostics.h",
    "content": "#pragma once\n\n#include <clang/AST/ASTContext.h>\n#include <clang/Basic/Diagnostic.h>\n#include <clang/Basic/SourceLocation.h>\n\n#include <utility>\n#include <vector>\n\nstruct ClangDiagnosticAsException {\n  std::pair<clang::SourceLocation, unsigned> diagnostic;\n\n  std::vector<ClangDiagnosticAsException> notes;\n\n  // List of callbacks that add an argument to a clang::DiagnosticBuilder\n  std::vector<std::function<void(clang::DiagnosticBuilder&)>> args;\n\n  ClangDiagnosticAsException& AddString(std::string str) {\n    args.push_back([arg = std::move(str)](clang::DiagnosticBuilder& db) { db.AddString(arg); });\n    return *this;\n  }\n\n  ClangDiagnosticAsException& AddTaggedVal(clang::QualType type) {\n    args.push_back([val = type](clang::DiagnosticBuilder& db) {\n      db.AddTaggedVal(reinterpret_cast<uintptr_t>(val.getAsOpaquePtr()), clang::DiagnosticsEngine::ak_qualtype);\n    });\n    return *this;\n  }\n\n  ClangDiagnosticAsException& addNote(ClangDiagnosticAsException diagnostic) {\n    notes.push_back(std::move(diagnostic));\n    return *this;\n  }\n\n  void Report(clang::DiagnosticsEngine& diagnostics) const {\n    {\n      auto builder = diagnostics.Report(diagnostic.first, diagnostic.second);\n      for (auto& arg_appender : args) {\n        arg_appender(builder);\n      }\n    }\n    for (auto& note : notes) {\n      note.Report(diagnostics);\n    }\n  }\n};\n\n// Helper class to build a custom DiagID from the given message and store it in a throwable object\nstruct ErrorReporter {\n  clang::ASTContext& context;\n\n  template<std::size_t N>\n  [[nodiscard]]\n  ClangDiagnosticAsException\n  operator()(clang::SourceLocation loc, const char (&message)[N], clang::DiagnosticsEngine::Level level = clang::DiagnosticsEngine::Error) {\n    auto id = context.getDiagnostics().getCustomDiagID(level, message);\n    return {std::pair(loc, id)};\n  }\n};\n"
  },
  {
    "path": "ThunkLibs/Generator/gen.cpp",
    "content": "#include \"analysis.h\"\n#include \"data_layout.h\"\n#include \"diagnostics.h\"\n#include \"interface.h\"\n#include <clang/Frontend/CompilerInstance.h>\n#include <clang/Basic/DiagnosticOptions.h>\n\n#include <fstream>\n#include <numeric>\n#include <iostream>\n#include <string_view>\n#include <unordered_map>\n#include <variant>\n\n#include <fmt/format.h>\n#include <fmt/ostream.h>\n#include <fmt/ranges.h>\n\n#include <openssl/sha.h>\n\nclass GenerateThunkLibsAction : public DataLayoutCompareAction {\npublic:\n  GenerateThunkLibsAction(const std::string& libname, const OutputFilenames&, const ABI& abi);\n\nprivate:\n  // Generate helper code for thunk libraries and write them to the output file\n  void OnAnalysisComplete(clang::ASTContext&) override;\n\n  // Emit guest_layout/host_layout wrappers for types passed across architecture boundaries\n  void EmitLayoutWrappers(clang::ASTContext&, std::ofstream&, std::unordered_map<const clang::Type*, TypeCompatibility>& type_compat);\n\n  const std::string& libfilename;\n  std::string libname; // sanitized filename, usable as part of emitted function names\n  const OutputFilenames& output_filenames;\n};\n\nGenerateThunkLibsAction::GenerateThunkLibsAction(const std::string& libname_, const OutputFilenames& output_filenames_, const ABI& abi)\n  : DataLayoutCompareAction(abi)\n  , libfilename(libname_)\n  , libname(libname_)\n  , output_filenames(output_filenames_) {\n  for (auto& c : libname) {\n    if (c == '-') {\n      c = '_';\n    }\n  }\n}\n\ntemplate<typename Fn>\nstatic std::string format_function_args(const FunctionParams& params, Fn&& format_arg) {\n  std::string ret;\n  for (std::size_t idx = 0; idx < params.param_types.size(); ++idx) {\n    ret += std::forward<Fn>(format_arg)(idx) + \", \";\n  }\n  // drop trailing \", \"\n  ret.resize(ret.size() > 2 ? ret.size() - 2 : 0);\n  return ret;\n};\n\n// Custom sort algorithm that works with partial orders.\n//\n// In contrast, std::sort requires that any two different elements A and B of\n// the input range compare either A<B or B<A. This requirement is violated e.g.\n// for dependency relations: Elements A and B might not depend on each other,\n// but they both might depend on some third element C. BubbleSort then ensures\n// C preceeds both A and B in the sorted range, while leaving the relative\n// order of A and B undetermined. In effect when iterating over the sorted\n// range, each dependency is visited before any of its dependees.\ntemplate<std::forward_iterator It>\nvoid BubbleSort(It begin, It end, std::relation<std::iter_value_t<It>, std::iter_value_t<It>> auto compare) {\n  bool fixpoint;\n  do {\n    fixpoint = true;\n    for (auto it = begin; it != end; ++it) {\n      for (auto it2 = std::next(it); it2 != end; ++it2) {\n        if (compare(*it2, *it)) {\n          std::swap(*it, *it2);\n          fixpoint = false;\n          it2 = it;\n        }\n      }\n    }\n  } while (!fixpoint);\n}\n\n// Compares such that A < B if B contains A as a member and requires A to be completely defined (i.e. non-pointer/non-reference).\n// This applies recursively to structs contained by B.\nstruct compare_by_struct_dependency {\n  clang::ASTContext& context;\n\n  bool operator()(const std::pair<const clang::Type*, GenerateThunkLibsAction::RepackedType>& a,\n                  const std::pair<const clang::Type*, GenerateThunkLibsAction::RepackedType>& b) const {\n    return (*this)(a.first, b.first);\n  }\n\n  bool operator()(const clang::Type* a, const clang::Type* b) const {\n    if (llvm::isa<clang::ConstantArrayType>(b)) {\n      throw std::runtime_error(\"Cannot have \\\"b\\\" be an array\");\n    }\n\n    auto* b_as_struct = b->getAsStructureType();\n    if (!b_as_struct) {\n      // Not a struct => no dependency\n      return false;\n    }\n\n    if (a->isArrayType()) {\n      throw std::runtime_error(\"Cannot have \\\"a\\\" be an array\");\n    }\n\n    for (auto* child : b_as_struct->getDecl()->fields()) {\n      auto child_type = child->getType().getTypePtr();\n\n      if (child_type->isPointerType()) {\n        // Pointers don't need the definition to be available\n        continue;\n      }\n\n      // Peel off any array type layers from the member\n      while (auto child_as_array = llvm::dyn_cast<clang::ConstantArrayType>(child_type)) {\n        child_type = child_as_array->getArrayElementTypeNoTypeQual();\n      }\n\n      if (context.hasSameType(a, child_type)) {\n        return true;\n      }\n\n      if ((*this)(a, child_type)) {\n        // Child depends on A => transitive dependency\n        return true;\n      }\n    }\n\n    // No dependency found\n    return false;\n  }\n};\n\nvoid GenerateThunkLibsAction::EmitLayoutWrappers(clang::ASTContext& context, std::ofstream& file,\n                                                 std::unordered_map<const clang::Type*, TypeCompatibility>& type_compat) {\n  // Sort struct types by dependency so that repacking code is emitted in an order that compiles fine\n  std::vector<std::pair<const clang::Type*, RepackedType>> types {this->types.begin(), this->types.end()};\n  BubbleSort(types.begin(), types.end(), compare_by_struct_dependency {context});\n\n  for (const auto& [type, type_repack_info] : types) {\n    auto struct_name = get_type_name(context, type);\n\n    // Opaque types don't need layout definitions\n    if (type_repack_info.assumed_compatible && type_repack_info.pointers_only && struct_name != \"void\") {\n      if (guest_abi.pointer_size != 4) {\n        fmt::print(file, \"template<> inline constexpr bool has_compatible_data_layout<{}*> = true;\\n\", struct_name);\n      }\n      continue;\n    } else if (type_repack_info.assumed_compatible) {\n      // TODO: Handle more cleanly\n      type_compat[type] = TypeCompatibility::Full;\n    }\n\n    // These must be handled later since they are not canonicalized and hence must be de-duplicated first\n    if (type->isBuiltinType()) {\n      continue;\n    }\n\n    // TODO: Instead, map these names back to *some* type that's named?\n    if (struct_name.starts_with(\"unnamed_\")) {\n      continue;\n    }\n\n    if (type->isEnumeralType()) {\n      fmt::print(file, \"template<>\\nstruct __attribute__((packed)) guest_layout<{}> {{\\n\", struct_name);\n      fmt::print(file, \"  using type = {}int{}_t;\\n\", type->isUnsignedIntegerOrEnumerationType() ? \"u\" : \"\",\n                 guest_abi.at(struct_name).get_if_simple_or_struct()->size_bits);\n      fmt::print(file, \"  type data;\\n\");\n      fmt::print(file, \"}};\\n\");\n      continue;\n    }\n\n    if (type_compat.at(type) == TypeCompatibility::None && !type_repack_info.emit_layout_wrappers) {\n      // Disallow use of layout wrappers for this type by specializing without a definition\n      fmt::print(file, \"template<>\\nstruct guest_layout<{}>;\\n\", struct_name);\n      fmt::print(file, \"template<>\\nstruct host_layout<{}>;\\n\", struct_name);\n      fmt::print(file, \"guest_layout<{}>& to_guest(const host_layout<{}>&) = delete;\\n\", struct_name, struct_name);\n      continue;\n    }\n\n    // Guest layout definition\n    // NOTE: uint64_t has lower alignment requirements on 32-bit than on 64-bit, so we require tightly packed structs\n    // TODO: Now we must emit padding bytes explicitly, though!\n    fmt::print(file, \"template<>\\nstruct __attribute__((packed)) guest_layout<{}> {{\\n\", struct_name);\n    if (type_compat.at(type) == TypeCompatibility::Full) {\n      fmt::print(file, \"  using type = {};\\n\", struct_name);\n    } else {\n      fmt::print(file, \"  struct type {{\\n\");\n      for (auto& member : guest_abi.at(struct_name).get_if_struct()->members) {\n        fmt::print(file, \"    guest_layout<{}{}> {};\\n\", member.type_name,\n                   member.array_size ? fmt::format(\"[{}]\", member.array_size.value()) : \"\", member.member_name);\n      }\n      fmt::print(file, \"  }};\\n\");\n    }\n    fmt::print(file, \"  type data;\\n\");\n    fmt::print(file, \"}};\\n\");\n\n    fmt::print(file, \"template<>\\nstruct guest_layout<const {}> : guest_layout<{}> {{\\n\", struct_name, struct_name);\n    fmt::print(file, \"  guest_layout& operator=(const guest_layout<{}>& other) {{ memcpy(this, &other, sizeof(other)); return *this; }}\\n\",\n               struct_name);\n    fmt::print(file, \"}};\\n\");\n\n    // Host layout definition\n    fmt::print(file, \"template<>\\n\");\n    fmt::print(file, \"struct host_layout<{}> {{\\n\", struct_name);\n    fmt::print(file, \"  using type = {};\\n\", struct_name);\n    fmt::print(file, \"  type data;\\n\");\n    fmt::print(file, \"\\n\");\n    // Host->guest layout conversion\n    fmt::print(file, \"  host_layout(const guest_layout<{}>& from) :\\n\", struct_name);\n    if (type_compat.at(type) == TypeCompatibility::Full) {\n      fmt::print(file, \"    data {{ from.data }} {{\\n\");\n    } else {\n      // Conversion needs struct repacking.\n      // Wrapping each member in `host_layout<>` ensures this is done recursively.\n      fmt::print(file, \"    data {{\\n\");\n      auto map_field = [&file](clang::FieldDecl* member, bool skip_arrays) {\n        auto decl_name = member->getNameAsString();\n        auto type_name = member->getType().getAsString();\n        auto array_type = llvm::dyn_cast<clang::ConstantArrayType>(member->getType());\n        if (!array_type && skip_arrays) {\n          if (member->getType()->isFunctionPointerType()) {\n            // Function pointers must be handled manually, so zero them out by default\n            fmt::print(file, \"      .{} {{ }},\\n\", decl_name);\n          } else {\n            fmt::print(file, \"      .{} = host_layout<{}> {{ from.data.{} }}.data,\\n\", decl_name, type_name, decl_name);\n          }\n        } else if (array_type && !skip_arrays) {\n          // Copy element-wise below\n          fmt::print(file, \"      for (size_t i = 0; i < {}; ++i) {{\\n\", array_type->getSize().getZExtValue());\n          fmt::print(file, \"        data.{}[i] = host_layout<{}> {{ from.data.{} }}.data[i];\\n\", decl_name, type_name, decl_name);\n          fmt::print(file, \"      }}\\n\");\n        }\n      };\n      // Prefer initialization via the constructor's initializer list if possible (to detect unintended narrowing), otherwise initialize in the body\n      for (auto* member : type->getAsStructureType()->getDecl()->fields()) {\n        if (!type_repack_info.UsesCustomRepackFor(member)) {\n          map_field(member, true);\n        } else {\n          // Leave field uninitialized\n        }\n      }\n      fmt::print(file, \"    }} {{\\n\");\n      for (auto* member : type->getAsStructureType()->getDecl()->fields()) {\n        if (!type_repack_info.UsesCustomRepackFor(member)) {\n          map_field(member, false);\n        } else {\n          // Leave field uninitialized\n        }\n      }\n    }\n    fmt::print(file, \"  }}\\n\");\n    fmt::print(file, \"}};\\n\\n\");\n\n    // Guest->host layout conversion\n    fmt::print(file, \"inline guest_layout<{}> to_guest(const host_layout<{}>& from) {{\\n\", struct_name, struct_name);\n    if (type_compat.at(type) == TypeCompatibility::Full) {\n      fmt::print(file, \"  guest_layout<{}> ret;\\n\", struct_name);\n      fmt::print(file, \"  static_assert(sizeof(from) == sizeof(ret));\\n\");\n      fmt::print(file, \"  memcpy(&ret, &from, sizeof(from));\\n\");\n    } else {\n      // Conversion needs struct repacking.\n      // Wrapping each member in `to_guest(to_host_layout(...))` ensures this is done recursively.\n      fmt::print(file, \"  guest_layout<{}> ret {{ .data {{\\n\", struct_name);\n      auto map_field2 = [&file](const StructInfo::MemberInfo& member, bool skip_arrays) {\n        auto& decl_name = member.member_name;\n        auto& array_size = member.array_size;\n        if (!array_size && skip_arrays) {\n          if (member.is_function_pointer) {\n            // Function pointers must be handled manually, so zero them out by default\n            fmt::print(file, \"    .{} {{ }},\\n\", decl_name);\n          } else {\n            fmt::print(file, \"    .{} = to_guest(to_host_layout(from.data.{})),\\n\", decl_name, decl_name);\n          }\n        } else if (array_size && !skip_arrays) {\n          // Copy element-wise below\n          fmt::print(file, \"    for (size_t i = 0; i < {}; ++i) {{\\n\", array_size.value());\n          fmt::print(file, \"      ret.data.{}.data[i] = to_guest(to_host_layout(from.data.{}[i]));\\n\", decl_name, decl_name);\n          fmt::print(file, \"    }}\\n\");\n        }\n      };\n\n      // Prefer initialization via the constructor's initializer list if possible (to detect unintended narrowing), otherwise initialize in the body\n      for (auto& member : guest_abi.at(struct_name).get_if_struct()->members) {\n        if (!type_repack_info.UsesCustomRepackFor(member.member_name)) {\n          map_field2(member, true);\n        } else {\n          // Leave field uninitialized\n        }\n      }\n      fmt::print(file, \"  }} }};\\n\");\n      for (auto& member : guest_abi.at(struct_name).get_if_struct()->members) {\n        if (!type_repack_info.UsesCustomRepackFor(member.member_name)) {\n          map_field2(member, false);\n        } else {\n          // Leave field uninitialized\n        }\n      }\n    }\n    fmt::print(file, \"  return ret;\\n\");\n    fmt::print(file, \"}}\\n\\n\");\n\n    // Forward-declare user-provided repacking functions\n    if (type_repack_info.custom_repacked_members.empty()) {\n      fmt::print(file, \"void fex_apply_custom_repacking_entry(host_layout<{}>& source, const guest_layout<{}>& from) {{\\n\", struct_name, struct_name);\n      fmt::print(file, \"}}\\n\");\n      fmt::print(file, \"bool fex_apply_custom_repacking_exit(guest_layout<{}>& into, const host_layout<{}>& from) {{\\n\", struct_name, struct_name);\n      fmt::print(file, \"  return false;\\n\");\n      fmt::print(file, \"}}\\n\");\n    } else {\n      fmt::print(file, \"void fex_custom_repack_entry(host_layout<{}>& into, const guest_layout<{}>& from);\\n\", struct_name, struct_name);\n      fmt::print(file, \"bool fex_custom_repack_exit(guest_layout<{}>& into, const host_layout<{}>& from);\\n\\n\", struct_name, struct_name);\n\n      fmt::print(file, \"void fex_apply_custom_repacking_entry(host_layout<{}>& source, const guest_layout<{}>& from) {{\\n\", struct_name, struct_name);\n      fmt::print(file, \"  fex_custom_repack_entry(source, from);\\n\");\n      fmt::print(file, \"}}\\n\");\n\n      fmt::print(file, \"bool fex_apply_custom_repacking_exit(guest_layout<{}>& into, const host_layout<{}>& from) {{\\n\", struct_name, struct_name);\n      fmt::print(file, \"  return fex_custom_repack_exit(into, from);\\n\");\n      fmt::print(file, \"}}\\n\");\n    }\n\n    fmt::print(file, \"template<> inline constexpr bool has_compatible_data_layout<{}> = {};\\n\", struct_name,\n               (type_compat.at(type) == TypeCompatibility::Full));\n  }\n}\n\nvoid GenerateThunkLibsAction::OnAnalysisComplete(clang::ASTContext& context) {\n  ErrorReporter report_error {context};\n\n  // Compute data layout differences between host and guest\n  auto type_compat = [&]() {\n    std::unordered_map<const clang::Type*, TypeCompatibility> ret;\n    const auto host_abi = ComputeDataLayout(context, types);\n    for (const auto& [type, type_repack_info] : types) {\n      if (type_repack_info.emit_layout_wrappers) {\n        // Assume incompatible, since this annotation is set when\n        // compatibility checks would otherwise fail (e.g. due to\n        // circular references)\n        ret.emplace(type, TypeCompatibility::None);\n      } else if (!type_repack_info.pointers_only) {\n        GetTypeCompatibility(context, type, host_abi, ret);\n      }\n    }\n    return ret;\n  }();\n\n  static auto format_decl = [](clang::QualType type, const std::string_view& name) {\n    clang::QualType innermostPointee = type;\n    while (innermostPointee->isPointerType()) {\n      innermostPointee = innermostPointee->getPointeeType();\n    }\n    if (innermostPointee->isFunctionType()) {\n      // Function pointer declarations (e.g. void (**callback)()) require\n      // the variable name to be prefixed *and* suffixed.\n\n      auto signature = type.getAsString();\n\n      // Search for strings like (*), (**), or (*****). Insert the\n      // variable name before the closing parenthesis\n      auto needle = signature.begin();\n      for (; needle != signature.end(); ++needle) {\n        if (signature.end() - needle < 3 || std::string_view {&*needle, 2} != \"(*\") {\n          continue;\n        }\n        while (*++needle == '*') {}\n        if (*needle == ')') {\n          break;\n        }\n      }\n      if (needle == signature.end()) {\n        // It's *probably* a typedef, so this should be safe after all\n        return fmt::format(\"{} {}\", signature, name);\n      } else {\n        signature.insert(needle, name.begin(), name.end());\n        return signature;\n      }\n    } else {\n      return type.getAsString() + \" \" + std::string(name);\n    }\n  };\n\n  auto format_function_params = [](const FunctionParams& params) {\n    std::string ret;\n    for (std::size_t idx = 0; idx < params.param_types.size(); ++idx) {\n      auto& type = params.param_types[idx];\n      ret += format_decl(type, fmt::format(\"a_{}\", idx)) + \", \";\n    }\n    // drop trailing \", \"\n    ret.resize(ret.size() > 2 ? ret.size() - 2 : 0);\n    return ret;\n  };\n\n  auto get_sha256 = [this](const std::string& function_name, bool include_libname) {\n    std::string sha256_message = (include_libname ? libname + \":\" : \"\") + function_name;\n    std::vector<unsigned char> sha256(SHA256_DIGEST_LENGTH);\n    SHA256(reinterpret_cast<const unsigned char*>(sha256_message.data()), sha256_message.size(), sha256.data());\n    return sha256;\n  };\n\n  auto get_callback_name = [](std::string_view function_name, unsigned param_index) -> std::string {\n    return fmt::format(\"{}CBFN{}\", function_name, param_index);\n  };\n\n  // Files used guest-side\n  if (!output_filenames.guest.empty()) {\n    std::ofstream file(output_filenames.guest);\n\n    // Guest->Host transition points for API functions\n    file << \"extern \\\"C\\\" {\\n\";\n    for (auto& thunk : thunks) {\n      const auto& function_name = thunk.function_name;\n      auto sha256 = get_sha256(function_name, true);\n      fmt::print(file, \"MAKE_THUNK({}, {}, \\\"{:#02x}\\\")\\n\", libname, function_name, fmt::join(sha256, \", \"));\n    }\n    file << \"}\\n\";\n\n    // Guest->Host transition points for invoking runtime host-function pointers based on their signature\n    std::vector<std::vector<unsigned char>> sha256s;\n    for (auto type_it = thunked_funcptrs.begin(); type_it != thunked_funcptrs.end(); ++type_it) {\n      auto* type = type_it->second.first;\n      std::string funcptr_signature = clang::QualType {type, 0}.getAsString();\n\n      auto cb_sha256 = get_sha256(\"fexcallback_\" + funcptr_signature, false);\n      auto it = std::find(sha256s.begin(), sha256s.end(), cb_sha256);\n      if (it != sha256s.end()) {\n        // TODO: Avoid this ugly way of avoiding duplicates\n        continue;\n      } else {\n        sha256s.push_back(cb_sha256);\n      }\n\n      // Thunk used for guest-side calls to host function pointers\n      file << \"  // \" << funcptr_signature << \"\\n\";\n      auto funcptr_idx = std::distance(thunked_funcptrs.begin(), type_it);\n      fmt::print(file, \"  MAKE_CALLBACK_THUNK(callback_{}, {}, \\\"{:#02x}\\\");\\n\", funcptr_idx, funcptr_signature, fmt::join(cb_sha256, \", \"));\n    }\n\n    // Thunks-internal packing functions\n    file << \"extern \\\"C\\\" {\\n\";\n    for (auto& data : thunks) {\n      const auto& function_name = data.function_name;\n      bool is_void = data.return_type->isVoidType();\n      file << \"FEX_PACKFN_LINKAGE auto fexfn_pack_\" << function_name << \"(\";\n      for (std::size_t idx = 0; idx < data.param_types.size(); ++idx) {\n        auto& type = data.param_types[idx];\n        file << (idx == 0 ? \"\" : \", \") << format_decl(type, fmt::format(\"a_{}\", idx));\n      }\n      // Using trailing return type as it makes handling function pointer returns much easier\n      file << \") -> \" << data.return_type.getAsString() << \" {\\n\";\n      file << \"  struct __attribute__((packed)) {\\n\";\n      for (std::size_t idx = 0; idx < data.param_types.size(); ++idx) {\n        auto& type = data.param_types[idx];\n        file << \"    \" << format_decl(type.getUnqualifiedType(), fmt::format(\"a_{}\", idx)) << \";\\n\";\n      }\n      if (!is_void) {\n        file << \"    \" << format_decl(data.return_type, \"rv\") << \";\\n\";\n      } else if (data.param_types.size() == 0) {\n        // Avoid \"empty struct has size 0 in C, size 1 in C++\" warning\n        file << \"    char force_nonempty;\\n\";\n      }\n      file << \"  } args;\\n\";\n\n      for (std::size_t idx = 0; idx < data.param_types.size(); ++idx) {\n        auto cb = data.callbacks.find(idx);\n\n        file << \"  args.a_\" << idx << \" = \";\n        if (cb == data.callbacks.end() || cb->second.is_stub) {\n          file << \"a_\" << idx << \";\\n\";\n        } else {\n          // Before passing guest function pointers to the host, wrap them in a host-callable trampoline\n          fmt::print(file, \"AllocateHostTrampolineForGuestFunction(a_{});\\n\", idx);\n        }\n      }\n      file << \"  fexthunks_\" << libname << \"_\" << function_name << \"(&args);\\n\";\n      if (!is_void) {\n        file << \"  return args.rv;\\n\";\n      }\n      file << \"}\\n\";\n    }\n    file << \"}\\n\";\n\n    // Publicly exports equivalent to symbols exported from the native guest library\n    file << \"extern \\\"C\\\" {\\n\";\n    for (auto& data : thunked_api) {\n      if (data.custom_guest_impl) {\n        continue;\n      }\n\n      const auto& function_name = data.function_name;\n\n      file << \"__attribute__((alias(\\\"fexfn_pack_\" << function_name << \"\\\"))) auto \" << function_name << \"(\";\n      for (std::size_t idx = 0; idx < data.param_types.size(); ++idx) {\n        auto& type = data.param_types[idx];\n        file << (idx == 0 ? \"\" : \", \") << format_decl(type, \"a_\" + std::to_string(idx));\n      }\n      file << \") -> \" << data.return_type.getAsString() << \";\\n\";\n    }\n    file << \"}\\n\";\n\n    // Symbol enumerators\n    for (std::size_t namespace_idx = 0; namespace_idx < namespaces.size(); ++namespace_idx) {\n      const auto& ns = namespaces[namespace_idx];\n      file << \"#define FOREACH_\" << ns.name << (ns.name.empty() ? \"\" : \"_\") << \"SYMBOL(EXPAND) \\\\\\n\";\n      for (auto& symbol : thunked_api) {\n        if (symbol.symtable_namespace.value_or(0) == namespace_idx) {\n          file << \"  EXPAND(\" << symbol.function_name << \", \\\"TODO\\\") \\\\\\n\";\n        }\n      }\n      file << \"\\n\";\n    }\n  }\n\n  // Files used host-side\n  if (!output_filenames.host.empty()) {\n    std::ofstream file(output_filenames.host);\n\n    EmitLayoutWrappers(context, file, type_compat);\n\n    // Forward declarations for symbols loaded from the native host library\n    for (auto& import : thunked_api) {\n      const auto& function_name = import.function_name;\n      const char* variadic_ellipsis = import.is_variadic ? \", ...\" : \"\";\n      file << \"using fexldr_type_\" << libname << \"_\" << function_name << \" = auto (\" << format_function_params(import) << variadic_ellipsis\n           << \") -> \" << import.return_type.getAsString() << \";\\n\";\n      file << \"static fexldr_type_\" << libname << \"_\" << function_name << \" *fexldr_ptr_\" << libname << \"_\" << function_name << \";\\n\";\n    }\n\n    file << \"extern \\\"C\\\" {\\n\";\n    for (auto& thunk : thunks) {\n      const auto& function_name = thunk.function_name;\n\n      // Generate stub callbacks\n      for (auto& [cb_idx, cb] : thunk.callbacks) {\n        if (cb.is_stub) {\n          const char* variadic_ellipsis = cb.is_variadic ? \", ...\" : \"\";\n          auto cb_function_name = \"fexfn_unpack_\" + get_callback_name(function_name, cb_idx) + \"_stub\";\n          file << \"[[noreturn]] static \" << cb.return_type.getAsString() << \" \" << cb_function_name << \"(\" << format_function_params(cb)\n               << variadic_ellipsis << \") {\\n\";\n          file << \"  fprintf(stderr, \\\"FATAL: Attempted to invoke callback stub for \" << function_name << \"\\\\n\\\");\\n\";\n          file << \"  std::abort();\\n\";\n          file << \"}\\n\";\n        }\n      }\n\n      auto get_guest_type_name = [this](clang::QualType type) {\n        if (type->isBuiltinType() && type->isIntegerType()) {\n          auto size = guest_abi.at(type.getUnqualifiedType().getAsString()).get_if_simple_or_struct()->size_bits;\n          return get_fixed_size_int_name(type.getTypePtr(), size);\n        } else if (type->isPointerType() && type->getPointeeType()->isBuiltinType() && type->getPointeeType()->isIntegerType() &&\n                   !type->getPointeeType()->isVoidType()) {\n          auto size = guest_abi.at(type->getPointeeType().getUnqualifiedType().getAsString()).get_if_simple_or_struct()->size_bits;\n          return fmt::format(\"{}{}*\", type->getPointeeType().isConstQualified() ? \"const \" : \"\",\n                             get_fixed_size_int_name(type->getPointeeType().getTypePtr(), size));\n        } else {\n          return type.getUnqualifiedType().getAsString();\n        }\n      };\n\n      // Forward declarations for user-provided implementations\n      if (thunk.custom_host_impl) {\n        file << \"static auto fexfn_impl_\" << libname << \"_\" << function_name << \"(\";\n        for (std::size_t idx = 0; idx < thunk.param_types.size(); ++idx) {\n          auto& type = thunk.param_types[idx];\n\n          file << (idx == 0 ? \"\" : \", \");\n\n          if (thunk.param_annotations[idx].is_passthrough) {\n            fmt::print(file, \"guest_layout<{}> a_{}\", get_guest_type_name(type), idx);\n          } else {\n            fmt::print(file, \"{}\", format_decl(type, fmt::format(\"a_{}\", idx)));\n          }\n        }\n        // Using trailing return type as it makes handling function pointer returns much easier\n        bool is_passthrough_ret = thunk.param_annotations[-1].is_passthrough;\n        fmt::print(file, \") -> {}{}{};\\n\", is_passthrough_ret ? \"guest_layout<\" : \"\", thunk.return_type.getAsString(),\n                   is_passthrough_ret ? \">\" : \"\");\n      }\n\n      // Check data layout compatibility of parameter types\n      // TODO: Also check non-struct/non-pointer types\n      // TODO: Also check return type\n      for (size_t param_idx = 0; param_idx != thunk.param_types.size(); ++param_idx) {\n        const auto& param_type = thunk.param_types[param_idx];\n        if (!param_type->isPointerType() || !param_type->getPointeeType()->isStructureType()) {\n          continue;\n        }\n        if (!thunk.param_annotations[param_idx].is_passthrough) {\n          auto type = param_type->getPointeeType();\n          if (!types.at(context.getCanonicalType(type.getTypePtr())).assumed_compatible &&\n              type_compat.at(context.getCanonicalType(type.getTypePtr())) == TypeCompatibility::None) {\n            // TODO: Factor in \"assume_compatible_layout\" annotations here\n            //       That annotation should cause the type to be treated as TypeCompatibility::Full\n            throw report_error(thunk.decl->getLocation(), \"Unsupported parameter type %0\").AddTaggedVal(param_type);\n          }\n        }\n      }\n\n      // Packed argument structs used in fexfn_unpack_*\n      auto GeneratePackedArgs = [&](const auto& function_name, const ThunkedFunction& thunk) -> std::string {\n        std::string struct_name = \"fexfn_packed_args_\" + libname + \"_\" + function_name;\n        file << \"struct __attribute__((packed)) \" << struct_name << \" {\\n\";\n\n        for (std::size_t idx = 0; idx < thunk.param_types.size(); ++idx) {\n          fmt::print(file, \"  guest_layout<{}> a_{};\\n\", get_guest_type_name(thunk.param_types[idx]), idx);\n        }\n        if (!thunk.return_type->isVoidType()) {\n          fmt::print(file, \"  guest_layout<{}> rv;\\n\", get_guest_type_name(thunk.return_type));\n        } else if (thunk.param_types.size() == 0) {\n          // Avoid \"empty struct has size 0 in C, size 1 in C++\" warning\n          file << \"    char force_nonempty;\\n\";\n        }\n        file << \"};\\n\";\n        return struct_name;\n      };\n      auto struct_name = GeneratePackedArgs(function_name, thunk);\n\n      // Unpacking functions\n      auto function_to_call = \"fexldr_ptr_\" + libname + \"_\" + function_name;\n      if (thunk.custom_host_impl) {\n        function_to_call = \"fexfn_impl_\" + libname + \"_\" + function_name;\n      }\n\n      auto get_type_name_with_nonconst_pointee = [&](clang::QualType type) {\n        type = type.getLocalUnqualifiedType();\n        if (type->isPointerType()) {\n          // Strip away \"const\" from pointee type\n          type = context.getPointerType(type->getPointeeType().getLocalUnqualifiedType());\n        }\n        return get_type_name(context, type.getTypePtr());\n      };\n\n\n      file << \"static void fexfn_unpack_\" << libname << \"_\" << function_name << \"(\" << struct_name << \"* args) {\\n\";\n\n      for (unsigned param_idx = 0; param_idx != thunk.param_types.size(); ++param_idx) {\n        if (thunk.callbacks.contains(param_idx) && thunk.callbacks.at(param_idx).is_stub) {\n          continue;\n        }\n\n        auto& param_type = thunk.param_types[param_idx];\n        const bool is_assumed_compatible =\n          param_type->isPointerType() &&\n          (thunk.param_annotations[param_idx].assume_compatible ||\n           ((param_type->getPointeeType()->isStructureType() ||\n             (param_type->getPointeeType()->isPointerType() && param_type->getPointeeType()->getPointeeType()->isStructureType())) &&\n            (types.contains(context.getCanonicalType(param_type->getPointeeType()->getLocallyUnqualifiedSingleStepDesugaredType().getTypePtr())) &&\n             LookupType(context, context.getCanonicalType(param_type->getPointeeType()->getLocallyUnqualifiedSingleStepDesugaredType().getTypePtr()))\n               .assumed_compatible)));\n\n        std::optional<TypeCompatibility> pointee_compat;\n        if (param_type->isPointerType()) {\n          // Get TypeCompatibility from existing entry, or register TypeCompatibility::None if no entry exists\n          // TODO: Currently needs TypeCompatibility::Full workaround...\n          pointee_compat =\n            type_compat.emplace(context.getCanonicalType(param_type->getPointeeType().getTypePtr()), TypeCompatibility::Full).first->second;\n        }\n\n        if (thunk.param_annotations[param_idx].is_passthrough) {\n          // args are passed directly to function, no need to use `unpacked` wrappers\n          continue;\n        }\n\n        // Layout repacking happens here\n        if (!param_type->isPointerType() || (is_assumed_compatible || pointee_compat == TypeCompatibility::Full) ||\n            param_type->getPointeeType()->isBuiltinType() /* TODO: handle size_t. Actually, properly check for data layout compatibility */) {\n          // Fully compatible\n          fmt::print(file, \"  host_layout<{}> a_{} {{ args->a_{} }};\\n\", get_type_name(context, param_type.getTypePtr()), param_idx, param_idx);\n        } else if (pointee_compat == TypeCompatibility::Repackable) {\n          // TODO: Require opt-in for this to be emitted since it's single-element only; otherwise, pointers-to-arrays arguments will cause stack trampling\n          fmt::print(file, \"  auto a_{} = make_repack_wrapper<{}>(args->a_{});\\n\", param_idx,\n                     get_type_name_with_nonconst_pointee(param_type), param_idx);\n        } else {\n          throw report_error(thunk.decl->getLocation(), \"Cannot generate unpacking function for function %0 with unannotated pointer \"\n                                                        \"parameter %1\")\n            .AddString(function_name)\n            .AddTaggedVal(param_type);\n        }\n      }\n\n      if (!thunk.return_type->isVoidType()) {\n        fmt::print(file, \"  args->rv = \");\n        if (!thunk.return_type->isFunctionPointerType() && !thunk.param_annotations[-1].is_passthrough) {\n          fmt::print(file, \"to_guest(to_host_layout<{}>(\", thunk.return_type.getAsString());\n        }\n      }\n      fmt::print(file, \"{}(\", function_to_call);\n      {\n        auto format_param = [&](std::size_t idx) {\n          auto cb = thunk.callbacks.find(idx);\n          if (cb != thunk.callbacks.end() && cb->second.is_stub) {\n            return \"fexfn_unpack_\" + get_callback_name(function_name, cb->first) + \"_stub\";\n          } else if (cb != thunk.callbacks.end()) {\n            auto arg_name = fmt::format(\"args->a_{}\", idx); // Use parameter directly\n            // Use comma operator to inject a function call before returning the argument\n            // TODO: Avoid casting away the guest_layout\n            if (thunk.custom_host_impl) {\n              return fmt::format(\"(FinalizeHostTrampolineForGuestFunction({}), {})\", arg_name, arg_name);\n            } else {\n              return fmt::format(\"(FinalizeHostTrampolineForGuestFunction({}), ({})(uint64_t {{ {}.data }}))\", arg_name,\n                                 get_type_name(context, thunk.param_types[idx].getTypePtr()), arg_name);\n            }\n          } else if (thunk.param_annotations[idx].is_passthrough) {\n            // Pass raw guest_layout<T*>\n            return fmt::format(\"args->a_{}\", idx);\n          } else {\n            // Unwrap host_layout/repack_wrapper layer\n            return fmt::format(\"unwrap_host(a_{})\", idx);\n          }\n        };\n\n        fmt::print(file, \"{}\", format_function_args(thunk, format_param));\n      }\n      if (!thunk.return_type->isVoidType() && !thunk.return_type->isFunctionPointerType() && !thunk.param_annotations[-1].is_passthrough) {\n        fmt::print(file, \"))\");\n      }\n      fmt::print(file, \");\\n\");\n\n      file << \"}\\n\";\n    }\n    file << \"}\\n\";\n\n    // Endpoints for Guest->Host invocation of API functions\n    file << \"static ExportEntry exports[] = {\\n\";\n    for (auto& thunk : thunks) {\n      const auto& function_name = thunk.function_name;\n      auto sha256 = get_sha256(function_name, true);\n      fmt::print(file, \"  {{(uint8_t*)\\\"\\\\x{:02x}\\\", (void(*)(void *))&fexfn_unpack_{}_{}}}, // {}:{}\\n\", fmt::join(sha256, \"\\\\x\"), libname,\n                 function_name, libname, function_name);\n    }\n\n    // Endpoints for Guest->Host invocation of runtime host-function pointers\n    // NOTE: The function parameters may differ slightly between guest and host,\n    //       e.g. due to differing sizes or due to data layout differences.\n    //       Hence, two separate parameter lists are managed here.\n    for (auto& host_funcptr_entry : thunked_funcptrs) {\n      auto& [type, param_annotations] = host_funcptr_entry.second;\n      auto func_type = type->getAs<clang::FunctionProtoType>();\n      FuncPtrInfo info = {};\n\n      // TODO: Use GetTypeNameWithFixedSizeIntegers\n      info.result = func_type->getReturnType().getAsString();\n\n      // NOTE: In guest contexts, integer types must be mapped to\n      //       fixed-size equivalents. Since this is a host context, this\n      //       isn't strictly necessary here, but it makes matching up\n      //       guest_layout/host_layout constructors easier.\n      for (auto arg : func_type->getParamTypes()) {\n        info.args.push_back(GetTypeNameWithFixedSizeIntegers(context, arg));\n      }\n\n      std::string annotations;\n      for (int param_idx = -1; param_idx < (int)info.args.size(); ++param_idx) {\n        if (param_idx != -1) {\n          annotations += \", \";\n        }\n\n        annotations += \"ParameterAnnotations {\";\n        if (param_annotations.contains(param_idx) && param_annotations.at(param_idx).is_passthrough) {\n          annotations += \".is_passthrough=true,\";\n        }\n        if (param_annotations.contains(param_idx) && param_annotations.at(param_idx).assume_compatible) {\n          annotations += \".assume_compatible=true,\";\n        }\n        annotations += \"}\";\n      }\n      auto guest_info = LookupGuestFuncPtrInfo(host_funcptr_entry.first.c_str());\n      // TODO: Consider differences in guest/host return types\n      fmt::print(file, \"  {{(uint8_t*)\\\"\\\\x{:02x}\\\", (void(*)(void *))&GuestWrapperForHostFunction<{}({}){}{}>::Call<{}>}}, // {}\\n\",\n                 fmt::join(guest_info.sha256, \"\\\\x\"), guest_info.result, fmt::join(info.args, \", \"), guest_info.args.empty() ? \"\" : \", \",\n                 fmt::join(guest_info.args, \", \"), annotations, host_funcptr_entry.first);\n    }\n\n    file << \"  { nullptr, nullptr }\\n\";\n    file << \"};\\n\";\n\n    // Symbol lookup from native host library\n    file << \"static void* fexldr_ptr_\" << libname << \"_so;\\n\";\n    file << \"extern \\\"C\\\" bool fexldr_init_\" << libname << \"() {\\n\";\n\n    std::string version_suffix;\n    if (lib_version) {\n      version_suffix = '.' + std::to_string(*lib_version);\n    }\n    const std::string library_filename = libfilename + \".so\" + version_suffix;\n\n    // Load the host library in the global symbol namespace.\n    // This follows how these libraries get loaded in a non-emulated environment,\n    // Either by directly linking to the library or a loader (In OpenGL or Vulkan) putting everything in the global namespace.\n    file << \"  fexldr_ptr_\" << libname << \"_so = dlopen(\\\"\" << library_filename << \"\\\", RTLD_GLOBAL | RTLD_LAZY);\\n\";\n\n    file << \"  if (!fexldr_ptr_\" << libname << \"_so) { return false; }\\n\\n\";\n    for (auto& import : thunked_api) {\n      fmt::print(file, \"  (void*&)fexldr_ptr_{}_{} = {}(fexldr_ptr_{}_so, \\\"{}\\\");\\n\", libname, import.function_name, import.host_loader,\n                 libname, import.function_name);\n    }\n    file << \"  return true;\\n\";\n    file << \"}\\n\";\n  }\n}\n\nbool GenerateThunkLibsActionFactory::runInvocation(std::shared_ptr<clang::CompilerInvocation> Invocation, clang::FileManager* Files,\n                                                   std::shared_ptr<clang::PCHContainerOperations> PCHContainerOps,\n                                                   clang::DiagnosticConsumer* DiagConsumer) {\n#if LLVM_VERSION_MAJOR >= 21\n  clang::CompilerInstance Compiler(std::move(Invocation), std::move(PCHContainerOps));\n#else\n  clang::CompilerInstance Compiler(std::move(PCHContainerOps));\n  Compiler.setInvocation(std::move(Invocation));\n#endif\n  Compiler.setFileManager(Files);\n\n  GenerateThunkLibsAction Action(libname, output_filenames, abi);\n\n#if LLVM_VERSION_MAJOR >= 22\n  auto Diags = clang::CompilerInstance::createDiagnostics(Compiler.getVirtualFileSystem(), Compiler.getDiagnosticOpts(), DiagConsumer, false);\n  Compiler.setDiagnostics(std::move(Diags));\n#elif LLVM_VERSION_MAJOR >= 20\n  Compiler.createDiagnostics(Compiler.getVirtualFileSystem(), DiagConsumer, false);\n#else\n  Compiler.createDiagnostics(DiagConsumer, false);\n#endif\n  if (!Compiler.hasDiagnostics()) {\n    return false;\n  }\n\n#if LLVM_VERSION_MAJOR >= 22\n  Compiler.createSourceManager();\n#else\n  Compiler.createSourceManager(*Files);\n#endif\n\n  const bool Success = Compiler.ExecuteAction(Action);\n\n  Files->clearStatCache();\n  return Success;\n}\n"
  },
  {
    "path": "ThunkLibs/Generator/interface.h",
    "content": "#include <clang/Tooling/Tooling.h>\n\n#include <optional>\n#include <string>\n\nstruct OutputFilenames {\n  std::string host;\n  std::string guest;\n};\n\nclass AnalyzeDataLayoutActionFactory : public clang::tooling::FrontendActionFactory {\n  std::unique_ptr<struct ABI> abi;\n\npublic:\n  AnalyzeDataLayoutActionFactory();\n  ~AnalyzeDataLayoutActionFactory();\n\n  std::unique_ptr<clang::FrontendAction> create() override;\n\n  const ABI& GetDataLayout() {\n    return *abi;\n  }\n\n  std::unique_ptr<ABI> TakeDataLayout() {\n    return std::move(abi);\n  }\n};\n\nclass DataLayoutCompareActionFactory : public clang::tooling::FrontendActionFactory {\n  const ABI& abi;\n\npublic:\n  DataLayoutCompareActionFactory(const ABI&);\n  ~DataLayoutCompareActionFactory();\n\n  std::unique_ptr<clang::FrontendAction> create() override;\n};\n\nclass GenerateThunkLibsActionFactory : public clang::tooling::ToolAction {\npublic:\n  GenerateThunkLibsActionFactory(std::string_view libname_, OutputFilenames output_filenames_, const ABI& abi_)\n    : libname(std::move(libname_))\n    , output_filenames(std::move(output_filenames_))\n    , abi(abi_) {}\n\n  bool runInvocation(std::shared_ptr<clang::CompilerInvocation> Invocation, clang::FileManager* Files,\n                     std::shared_ptr<clang::PCHContainerOperations> PCHContainerOps, clang::DiagnosticConsumer* DiagConsumer) override;\n\nprivate:\n  std::string libname;\n  OutputFilenames output_filenames;\n  const ABI& abi;\n};\n"
  },
  {
    "path": "ThunkLibs/Generator/main.cpp",
    "content": "#include \"clang/Tooling/Tooling.h\"\n#include \"clang/Tooling/CompilationDatabase.h\"\n\n#include \"llvm/Support/Signals.h\"\n\n#include <iostream>\n#include <optional>\n#include <string>\n\n#include \"interface.h\"\n\nusing namespace clang::tooling;\n\nvoid print_usage(const char* program_name) {\n  std::cerr << \"Usage: \" << program_name << \" <filename> <libname> <gen_target> <output_filename> -- <clang_flags>\\n\";\n}\n\nint main(int argc, char* const argv[]) {\n  llvm::sys::PrintStackTraceOnErrorSignal(argv[0]);\n\n  if (argc < 6) {\n    print_usage(argv[0]);\n    return EXIT_FAILURE;\n  }\n\n  // Parse compile flags after \"--\" (this updates argc to the index of the \"--\" separator)\n  std::string error;\n  auto compile_db = FixedCompilationDatabase::loadFromCommandLine(argc, argv, error);\n  if (!compile_db) {\n    print_usage(argv[0]);\n    std::cerr << \"\\nError: \" << error << \"\\n\";\n    return EXIT_FAILURE;\n  }\n\n  // Process arguments before the \"--\" separator\n  if (argc != 6 && argc != 7) {\n    print_usage(argv[0]);\n    return EXIT_FAILURE;\n  }\n\n  char* const* arg = argv + 1;\n  const auto filename = *arg++;\n  const std::string libname = *arg++;\n  const std::string target_abi = *arg++;\n  const std::string output_filename = *arg++;\n  const std::string x86_rootfs = *arg++;\n\n  OutputFilenames output_filenames;\n  if (target_abi == \"-host\") {\n    output_filenames.host = std::move(output_filename);\n  } else if (target_abi == \"-guest\") {\n    output_filenames.guest = std::move(output_filename);\n  } else {\n    std::cerr << \"Unrecognized generator target ABI \\\"\" << target_abi << \"\\\"\\n\";\n    return EXIT_FAILURE;\n  }\n\n  ClangTool Tool(*compile_db, {filename});\n  if (CLANG_RESOURCE_DIR[0] != 0) {\n    auto set_resource_directory = [](const clang::tooling::CommandLineArguments& Args, clang::StringRef) {\n      clang::tooling::CommandLineArguments AdjustedArgs = Args;\n      AdjustedArgs.push_back(std::string {\"-resource-dir=\"} + CLANG_RESOURCE_DIR);\n      return AdjustedArgs;\n    };\n    Tool.appendArgumentsAdjuster(set_resource_directory);\n  }\n\n  ClangTool GuestTool = Tool;\n\n  auto append_x86_rootfs_includes = [&x86_rootfs](clang::tooling::CommandLineArguments& Args, const char* triple) {\n    if (x86_rootfs == \"/\") {\n      return;\n    }\n\n    Args.push_back(\"--sysroot\");\n    Args.push_back(x86_rootfs);\n\n    // The dev rootfs is only really needed for the standard library.\n    // Other libraries generally don't have platform specific headers.\n    Args.push_back(\"-idirafter\");\n    Args.push_back(\"/usr/include/\");\n  };\n\n  // Analyse data layout for guest ABI\n  const bool is_32bit_guest = (argv[6] == std::string_view {\"-for-32bit-guest\"});\n  GuestTool.appendArgumentsAdjuster([&](const clang::tooling::CommandLineArguments& Args, clang::StringRef) {\n    clang::tooling::CommandLineArguments AdjustedArgs = Args;\n    const char* platform = is_32bit_guest ? \"i686-linux-gnu\" : \"x86_64-linux-gnu\";\n    if (is_32bit_guest) {\n      AdjustedArgs.push_back(\"-m32\");\n      AdjustedArgs.push_back(\"-DIS_32BIT_THUNK\");\n    }\n    AdjustedArgs.push_back(\"-DGUEST_THUNK_LIBRARY\");\n    AdjustedArgs.push_back(std::string {\"--target=\"} + platform);\n    AdjustedArgs.push_back(\"-isystem\");\n    AdjustedArgs.push_back(std::string {\"/usr/\"} + platform + \"/include/\");\n\n    append_x86_rootfs_includes(AdjustedArgs, platform);\n\n    return AdjustedArgs;\n  });\n  auto data_layout_analysis_factory = std::make_unique<AnalyzeDataLayoutActionFactory>();\n  GuestTool.run(data_layout_analysis_factory.get());\n  auto& data_layout = data_layout_analysis_factory->GetDataLayout();\n\n  // Run generator for target ABI\n  Tool.appendArgumentsAdjuster([&](const clang::tooling::CommandLineArguments& Args, clang::StringRef) {\n    clang::tooling::CommandLineArguments AdjustedArgs = Args;\n    AdjustedArgs.push_back(\"-DIS_HOST_THUNKGEN_PASS\");\n    if (target_abi == \"-guest\") {\n      const char* platform = is_32bit_guest ? \"i686-linux-gnu\" : \"x86_64-linux-gnu\";\n      append_x86_rootfs_includes(AdjustedArgs, platform);\n    }\n\n    return AdjustedArgs;\n  });\n  return Tool.run(std::make_unique<GenerateThunkLibsActionFactory>(std::move(libname), std::move(output_filenames), data_layout).get());\n}\n"
  },
  {
    "path": "ThunkLibs/GuestLibs/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.14)\nproject(guest-thunks)\ninclude(${FEX_PROJECT_SOURCE_DIR}/Data/CMake/version_to_variables.cmake)\n\noption(ENABLE_CLANG_THUNKS \"Enable building thunks with clang\" FALSE)\n\nif (ENABLE_CLANG_THUNKS)\n  set(LD_OVERRIDE \"-fuse-ld=lld\")\n  add_link_options(${LD_OVERRIDE})\nendif()\n\nif (NOT X86_DEV_ROOTFS)\n  message(FATAL_ERROR \"X86_DEV_ROOTFS must be set(use \\\"/\\\" to ignore)\")\nendif()\n\nfind_program(CCACHE_PROGRAM ccache)\nif(CCACHE_PROGRAM)\n  message(STATUS \"CCache enabled for guest thunks\")\n  set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE \"${CCACHE_PROGRAM}\")\nendif()\n\nif (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)\n  # We've been included using ExternalProject_add, so set up the actual thunk libraries to be cross-compiled\n  set(CMAKE_CXX_STANDARD 20)\n\n  # This gets passed in from the main cmake project\n  set(DATA_DIRECTORY \"\" CACHE PATH \"Global data directory (override)\")\n  if (NOT DATA_DIRECTORY)\n    set(DATA_DIRECTORY \"${CMAKE_INSTALL_PREFIX}/share/fex-emu\")\n  endif()\n\n  set(TARGET_TYPE SHARED)\n  set(GENERATE_GUEST_INSTALL_TARGETS TRUE)\n\n  # uninstall target\n  if(NOT TARGET uninstall)\n    configure_file(\"${FEX_PROJECT_SOURCE_DIR}/Data/CMake/cmake_uninstall.cmake.in\"\n      \"${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/cmake_uninstall.cmake\"\n      IMMEDIATE @ONLY)\n\n    add_custom_target(uninstall\n      COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/cmake_uninstall.cmake)\n  endif()\nelse()\n  # We've been included using add_subdirectory, so set up targets for IDE integration using the host toolchain\n  set(GENERATOR_EXE thunkgen)\n  set(TARGET_TYPE OBJECT)\n  set(GENERATE_GUEST_INSTALL_TARGETS FALSE)\n  set(BITNESS 64)\nendif()\n\n# Syntax: generate(libxyz libxyz-interface.cpp)\n# This defines a target and a custom command:\n# - custom command: Main build step that runs the thunk generator on the given interface definition\n# - libxyz-guest-deps: Interface target to read include directories from which are passed to libclang when parsing the interface definition\nfunction(generate NAME SOURCE_FILE)\n  # Interface target for the user to add include directories\n  add_library(${NAME}-guest-deps INTERFACE)\n  target_include_directories(${NAME}-guest-deps INTERFACE \"${CMAKE_CURRENT_SOURCE_DIR}/../include\")\n  if (BITNESS EQUAL 32)\n    target_compile_definitions(${NAME}-guest-deps INTERFACE IS_32BIT_THUNK)\n  endif()\n  # Shorthand for the include directories added after calling this function.\n  # This is not evaluated directly, hence directories added after return are still picked up\n  set(prop \"$<TARGET_PROPERTY:${NAME}-guest-deps,INTERFACE_INCLUDE_DIRECTORIES>\")\n  set(compile_prop \"$<TARGET_PROPERTY:${NAME}-guest-deps,INTERFACE_COMPILE_DEFINITIONS>\")\n\n  # Run thunk generator for each of the given output files\n  set(OUTFOLDER \"${CMAKE_CURRENT_BINARY_DIR}/gen\")\n  set(OUTFILE \"${OUTFOLDER}/thunkgen_guest_${NAME}.inl\")\n\n  file(MAKE_DIRECTORY \"${OUTFOLDER}\")\n\n  if (BITNESS EQUAL 32)\n    set(BITNESS_FLAGS \"-for-32bit-guest\")\n    set(BITNESS_FLAGS2 \"-m32\" \"--target=i686-linux-gnu\" \"-isystem\" \"/usr/i686-linux-gnu/include/\")\n  else()\n    set(BITNESS_FLAGS \"\")\n    set(BITNESS_FLAGS2 \"--target=x86_64-linux-gnu\" \"-isystem\" \"/usr/x86_64-linux-gnu/include/\")\n  endif()\n\n  add_custom_command(\n    OUTPUT \"${OUTFILE}\"\n    DEPENDS \"${GENERATOR_EXE}\"\n    DEPENDS \"${SOURCE_FILE}\"\n    COMMAND \"${GENERATOR_EXE}\" \"${SOURCE_FILE}\" \"${NAME}\" \"-guest\" \"${OUTFILE}\" \"${X86_DEV_ROOTFS}\" ${BITNESS_FLAGS} -- -std=c++20 ${BITNESS_FLAGS2}\n      # Expand compile definitions to space-separated list of -D parameters\n      \"$<$<BOOL:${compile_prop}>:;-D$<JOIN:${compile_prop},;-D>>\"\n      # Expand include directories to space-separated list of -isystem parameters\n      \"$<$<BOOL:${prop}>:;-isystem$<JOIN:${prop},;-isystem>>\"\n    VERBATIM\n    COMMAND_EXPAND_LISTS)\n\n  list(APPEND OUTPUTS \"${OUTFILE}\")\n  set(GEN_${NAME} ${OUTPUTS} PARENT_SCOPE)\nendfunction()\n\nfunction(add_guest_lib NAME SONAME)\n  set(SOURCE_FILE ../lib${NAME}/lib${NAME}_Guest.cpp)\n  get_filename_component(SOURCE_FILE_ABS \"${SOURCE_FILE}\" ABSOLUTE)\n\n  set(SOURCE_LDS_FILE ../lib${NAME}/lib${NAME}_Guest.lds)\n  get_filename_component(SOURCE_LDS_FILE_ABS \"${SOURCE_LDS_FILE}\" ABSOLUTE)\n\n  set(SOURCE_LDS_32_FILE ../lib${NAME}/lib${NAME}_Guest_32.lds)\n  get_filename_component(SOURCE_LDS_32_FILE_ABS \"${SOURCE_LDS_32_FILE}\" ABSOLUTE)\n\n  if (NOT EXISTS \"${SOURCE_FILE_ABS}\")\n    set(SOURCE_FILE ../lib${NAME}/Guest.cpp)\n    get_filename_component(SOURCE_FILE_ABS \"${SOURCE_FILE}\" ABSOLUTE)\n    if (NOT EXISTS \"${SOURCE_FILE_ABS}\")\n      message (FATAL_ERROR \"Thunk source file for Guest lib ${NAME} doesn't exist!\")\n    endif()\n  endif()\n\n  add_library(${NAME}-guest ${TARGET_TYPE} ${SOURCE_FILE} ${GEN_lib${NAME}})\n  target_include_directories(${NAME}-guest PRIVATE \"${CMAKE_CURRENT_BINARY_DIR}/gen/\")\n  target_compile_definitions(${NAME}-guest PRIVATE GUEST_THUNK_LIBRARY)\n  target_link_libraries(${NAME}-guest PRIVATE lib${NAME}-guest-deps)\n\n  ## Make signed overflow well defined 2's complement overflow\n  target_compile_options(${NAME}-guest PRIVATE -fwrapv)\n  if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)\n    ## Compile for SSE2\n    ## Compile with fpmath=sse to remove x87 usage\n    target_compile_options(${NAME}-guest PRIVATE -msse2 -mfpmath=sse)\n  endif()\n\n  if (BITNESS EQUAL 32)\n    # Makes the GOT/PLT lookups slightly less painful\n    target_compile_options(${NAME}-guest PRIVATE -fno-plt -fno-stack-protector)\n    target_link_options(${NAME}-guest PRIVATE \"LINKER:-z,now\" \"LINKER:-z,relro\" \"LINKER:-z,notext\")\n  endif()\n\n  # Add linker script if set\n  if (BITNESS EQUAL 64 AND EXISTS \"${SOURCE_LDS_FILE_ABS}\")\n    target_link_options(${NAME}-guest PRIVATE \"-T\" \"${CMAKE_CURRENT_SOURCE_DIR}/../lib${NAME}/lib${NAME}_Guest.lds\")\n    set_property(TARGET ${NAME}-guest APPEND PROPERTY LINK_DEPENDS \"${CMAKE_CURRENT_SOURCE_DIR}/../lib${NAME}/lib${NAME}_Guest.lds\")\n  endif()\n\n  if (BITNESS EQUAL 32 AND EXISTS \"${SOURCE_LDS_32_FILE_ABS}\")\n    target_link_options(${NAME}-guest PRIVATE \"-T\" \"${CMAKE_CURRENT_SOURCE_DIR}/../lib${NAME}/lib${NAME}_Guest_32.lds\")\n    set_property(TARGET ${NAME}-guest APPEND PROPERTY LINK_DEPENDS \"${CMAKE_CURRENT_SOURCE_DIR}/../lib${NAME}/lib${NAME}_Guest_32.lds\")\n  endif()\n\n  # We need to override the soname for the linker.\n  # Our guest thunk libraries are named `lib<Thunk>-guest`.\n  # Once we override the loaded name, the guest is free to dlopen again by SONAME rather than filepath.\n  # eg:\n  # dlopen(\"libGL.so.1\", RTLD_GLOBAL | RTLD_NOW); -> We override this `libGL.so.1` to `libGL-guest.so`\n  # Later on in the program, it can do:\n  # dlopen(\"libGL.so.1\", RTLD_GLOBAL | RTLD_NOLOAD);\n  # This second dlopen will only check to see if the previous load has made the library resident\n  # Searching for SONAME in the process.\n  #\n  # Additionally, VDSO can only be opened by SONAME.\n  # This means it will only ever open the handle with `dlopen(\"linux-vdso.so.1\", RTLD_GLOBAL | RTLD_NOLOAD);\n  # Note that this doesn't have a lib prefix, and also since it doesn't exist on the filesystem, it can never\n  # Actually load from a path.\n  target_link_options(${NAME}-guest PRIVATE \"LINKER:-soname,${SONAME}\")\n  set_target_properties(${NAME}-guest PROPERTIES NO_SONAME ON)\n\n  if (GENERATE_GUEST_INSTALL_TARGETS)\n    if (BITNESS EQUAL 64)\n      install(TARGETS ${NAME}-guest DESTINATION ${DATA_DIRECTORY}/GuestThunks/)\n    else()\n      install(TARGETS ${NAME}-guest DESTINATION ${DATA_DIRECTORY}/GuestThunks_32/)\n    endif()\n  endif()\nendfunction()\n\n# These thunks only support 64-bit\nif (BITNESS EQUAL 64)\n  #add_guest_lib(fex_malloc_loader)\n  #target_link_libraries(fex_malloc_loader-guest PRIVATE dl)\n\n  #generate(libfex_malloc)\n  #add_guest_lib(fex_malloc)\n\n  generate(libasound ${CMAKE_CURRENT_SOURCE_DIR}/../libasound/libasound_interface.cpp)\n  add_guest_lib(asound \"libasound.so.2\")\n\n  # disabled for now, headers are platform specific\n  # find_package(SDL2 REQUIRED)\n  # generate(libSDL2)\n  # add_guest_lib(SDL2)\n  # target_include_directories(SDL2-guest PRIVATE ${SDL2_INCLUDE_DIRS})\n  # target_link_libraries(SDL2-guest PRIVATE GL)\n  # target_link_libraries(SDL2-guest PRIVATE dl)\n\n  generate(libvulkan ${CMAKE_CURRENT_SOURCE_DIR}/../libvulkan/libvulkan_interface.cpp)\n  target_include_directories(libvulkan-guest-deps INTERFACE ${FEX_PROJECT_SOURCE_DIR}/External/Vulkan-Headers/include/)\n  add_guest_lib(vulkan \"libvulkan.so.1\")\n\n  generate(libdrm ${CMAKE_CURRENT_SOURCE_DIR}/../libdrm/libdrm_interface.cpp)\n  target_include_directories(libdrm-guest-deps INTERFACE /usr/include/drm/)\n  target_include_directories(libdrm-guest-deps INTERFACE /usr/include/libdrm/)\n  add_guest_lib(drm \"libdrm.so.2\")\nendif()\n\ngenerate(libwayland-client ${CMAKE_CURRENT_SOURCE_DIR}/../libwayland-client/libwayland-client_interface.cpp)\nadd_guest_lib(wayland-client \"libwayland-client.so.0.20.0\")\ntarget_include_directories(libwayland-client-guest-deps INTERFACE /usr/include/wayland)\n\ngenerate(libVDSO ${CMAKE_CURRENT_SOURCE_DIR}/../libVDSO/libVDSO_interface.cpp)\nadd_guest_lib(VDSO \"linux-vdso.so.1\")\n# Can't use a stack protector because otherwise cross-compiling fails\n# Not necessary anyway because it only trampolines\ntarget_compile_options(VDSO-guest PRIVATE \"-fno-stack-protector\")\ntarget_link_options(VDSO-guest PRIVATE \"-nostdlib\" \"LINKER:--no-undefined\" \"LINKER:-z,max-page-size=4096\" \"LINKER:--hash-style=both\")\n\nif (BITNESS EQUAL 32)\n  # 32-bit entrypoint points to __kernel_vsyscall and needs to exist\n  target_link_options(VDSO-guest PRIVATE \"LINKER:-e,__kernel_vsyscall\")\n  # 32-bit VDSO needs to have PIC disabled.\n  # Otherwise GCC/Clang generates GOT prologues on the functions that corrupt vsyscall.\n  # Correct:\n  # 00000350 <__kernel_vsyscall>:\n  #  350:   cd 80                   int    0x80\n  #  352:   c3                      ret\n  #  353:   0f 0b                   ud2\n  # Incorrect:\n  # 0000032a <__kernel_vsyscall>:\n  #  32a:   e8 0b 00 00 00          call   33a <__x86.get_pc_thunk.ax>\n  #  32f:   05 79 03 00 00          add    eax,0x379\n  #  334:   cd 80                   int    0x80\n  #  336:   c3                      ret\n  #  337:   90                      nop\n  #  338:   0f 0b                   ud2\n  target_compile_options(VDSO-guest PRIVATE \"-fno-pic\")\nendif()\n\nif (BUILD_FEX_LINUX_TESTS)\n  generate(libfex_thunk_test ${CMAKE_CURRENT_SOURCE_DIR}/../libfex_thunk_test/libfex_thunk_test_interface.cpp)\n  add_guest_lib(fex_thunk_test \"libfex_thunk_test.so\")\nendif()\n\ngenerate(libGL ${CMAKE_CURRENT_SOURCE_DIR}/../libGL/libGL_interface.cpp)\nadd_guest_lib(GL \"libGL.so.1\")\n\ngenerate(libEGL ${CMAKE_CURRENT_SOURCE_DIR}/../libEGL/libEGL_interface.cpp)\nadd_guest_lib(EGL \"libEGL.so.1\")\ntarget_link_libraries(EGL-guest PRIVATE GL-guest)\n\n# libGL must pull in libX11.so, so generate a placeholder libX11.so to link against\nadd_library(PlaceholderX11 SHARED ../libX11/libX11_NativeGuest.cpp)\ntarget_link_options(PlaceholderX11 PRIVATE \"LINKER:-soname,libX11.so.6\")\nset_target_properties(PlaceholderX11 PROPERTIES NO_SONAME ON)\ntarget_link_libraries(GL-guest PRIVATE PlaceholderX11)\n"
  },
  {
    "path": "ThunkLibs/HostLibs/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.14)\nproject(host-thunks)\ninclude(${FEX_PROJECT_SOURCE_DIR}/Data/CMake/version_to_variables.cmake)\n\nset(CMAKE_CXX_STANDARD 20)\noption(ENABLE_CLANG_THUNKS \"Enable building thunks with clang\" FALSE)\n\nif (ENABLE_CLANG_THUNKS)\n  set(LD_OVERRIDE \"-fuse-ld=lld\")\n  add_link_options(${LD_OVERRIDE})\nendif()\n\n# Syntax: generate(libxyz libxyz-interface.cpp)\n# This defines two targets and a custom command:\n# - custom command: Main build step that runs the thunk generator on the given interface definition\n# - libxyz-interface: Target for IDE integration (making sure libxyz-interface.cpp shows up as a source file in the project tree)\n# - libxyz-deps: Interface target to read include directories from which are passed to libclang when parsing the interface definition\nfunction(generate NAME SOURCE_FILE GUEST_BITNESS)\n  # Interface target for the user to add include directories\n  add_library(${NAME}-${GUEST_BITNESS}-deps INTERFACE)\n  target_include_directories(${NAME}-${GUEST_BITNESS}-deps INTERFACE \"${CMAKE_CURRENT_SOURCE_DIR}/../include\")\n  if (GUEST_BITNESS EQUAL 32)\n    target_compile_definitions(${NAME}-${GUEST_BITNESS}-deps INTERFACE IS_32BIT_THUNK)\n  endif()\n  # Shorthand for the include directories added after calling this function.\n  # This is not evaluated directly, hence directories added after return are still picked up\n  set(prop \"$<TARGET_PROPERTY:${NAME}-${GUEST_BITNESS}-deps,INTERFACE_INCLUDE_DIRECTORIES>\")\n  set(compile_prop \"$<TARGET_PROPERTY:${NAME}-${GUEST_BITNESS}-deps,INTERFACE_COMPILE_DEFINITIONS>\")\n  if (CMAKE_SYSTEM_PROCESSOR MATCHES \"x86_64\")\n    list(APPEND compile_prop ARCHITECTURE_x86_64=1)\n  elseif (CMAKE_SYSTEM_PROCESSOR MATCHES \"aarch64\")\n    list(APPEND compile_prop ARCHITECTURE_arm64=1)\n  endif()\n\n  # Target for IDE integration\n  add_library(${NAME}-${GUEST_BITNESS}-interface EXCLUDE_FROM_ALL ${SOURCE_FILE})\n  target_link_libraries(${NAME}-${GUEST_BITNESS}-interface PRIVATE ${NAME}-${GUEST_BITNESS}-deps)\n\n  # Run thunk generator for each of the given output files\n  set(OUTFOLDER \"${CMAKE_CURRENT_BINARY_DIR}/gen_${GUEST_BITNESS}\")\n  set(OUTFILE \"${OUTFOLDER}/thunkgen_host_${NAME}.inl\")\n\n  file(MAKE_DIRECTORY \"${OUTFOLDER}\")\n\n  set(BITNESS_FLAGS \"\")\n  if (GUEST_BITNESS EQUAL 32)\n    set(BITNESS_FLAGS \"-for-32bit-guest\")\n  endif()\n\n  add_custom_command(\n    OUTPUT \"${OUTFILE}\"\n    DEPENDS \"${SOURCE_FILE}\"\n    DEPENDS thunkgen\n    COMMAND thunkgen \"${SOURCE_FILE}\" \"${NAME}\" \"-host\" \"${OUTFILE}\" \"${X86_DEV_ROOTFS}\" ${BITNESS_FLAGS} -- -std=c++20\n      # Expand compile definitions to space-separated list of -D parameters\n      \"$<$<BOOL:${compile_prop}>:;-D$<JOIN:${compile_prop},;-D>>\"\n      # Expand include directories to space-separated list of -isystem parameters\n      \"$<$<BOOL:${prop}>:;-isystem$<JOIN:${prop},;-isystem>>\"\n    VERBATIM\n    COMMAND_EXPAND_LISTS)\n\n  list(APPEND OUTPUTS \"${OUTFILE}\")\n  set(GEN_${NAME} ${OUTPUTS} PARENT_SCOPE)\nendfunction()\n\nfunction(add_host_lib NAME GUEST_BITNESS)\n  set(SOURCE_FILE ../lib${NAME}/lib${NAME}_Host.cpp)\n    get_filename_component(SOURCE_FILE_ABS \"${SOURCE_FILE}\" ABSOLUTE)\n  if (NOT EXISTS \"${SOURCE_FILE_ABS}\")\n    set(SOURCE_FILE ../lib${NAME}/Host.cpp)\n    get_filename_component(SOURCE_FILE_ABS \"${SOURCE_FILE}\" ABSOLUTE)\n    if (NOT EXISTS \"${SOURCE_FILE_ABS}\")\n      message (FATAL_ERROR \"Thunk source file for Host lib ${NAME} doesn't exist!\")\n    endif()\n  endif()\n\n  add_library(${NAME}-host-${GUEST_BITNESS} SHARED ${SOURCE_FILE} ${GEN_lib${NAME}})\n  set_target_properties(${NAME}-host-${GUEST_BITNESS} PROPERTIES OUTPUT_NAME \"${NAME}-host\")\n  set_target_properties(${NAME}-host-${GUEST_BITNESS} PROPERTIES LIBRARY_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/HostLibs_${GUEST_BITNESS}\")\n  target_include_directories(${NAME}-host-${GUEST_BITNESS} PRIVATE \"${CMAKE_CURRENT_BINARY_DIR}/gen_${GUEST_BITNESS}/\")\n  target_link_libraries(${NAME}-host-${GUEST_BITNESS} PRIVATE dl)\n  target_link_libraries(${NAME}-host-${GUEST_BITNESS} PRIVATE lib${NAME}-${GUEST_BITNESS}-deps)\n  target_link_libraries(${NAME}-host-${GUEST_BITNESS} PRIVATE FEX)\n  ## Make signed overflow well defined 2's complement overflow\n  target_compile_options(${NAME}-host-${GUEST_BITNESS} PRIVATE -fwrapv)\n\n  if (NOT ENABLE_ASAN)\n    # generated files forward-declare functions that need to be implemented manually, so pass --no-undefined to make sure errors are detected at compile-time rather than runtime\n    # NOTE: ASan is not compatible with --no-undefined, see https://github.com/google/sanitizers/issues/380 for details\n    target_link_options(${NAME}-host-${GUEST_BITNESS} PRIVATE \"LINKER:--no-undefined\")\n  endif()\n\n  if (${GUEST_BITNESS} EQUAL 32)\n    install(TARGETS ${NAME}-host-${GUEST_BITNESS} COMPONENT Runtime DESTINATION ${HOSTLIBS_DATA_DIRECTORY}/HostThunks_32/)\n  else()\n    install(TARGETS ${NAME}-host-${GUEST_BITNESS} COMPONENT Runtime DESTINATION ${HOSTLIBS_DATA_DIRECTORY}/HostThunks/)\n  endif()\nendfunction()\n\nset(BITNESS_LIST \"64\")\nforeach(GUEST_BITNESS IN LISTS BITNESS_LIST)\n  #add_host_lib(fex_malloc_symbols ${GUEST_BITNESS})\n\n  #generate(libfex_malloc)\n  #add_host_lib(fex_malloc ${GUEST_BITNESS})\n\n  generate(libasound ${CMAKE_CURRENT_SOURCE_DIR}/../libasound/libasound_interface.cpp ${GUEST_BITNESS})\n  add_host_lib(asound ${GUEST_BITNESS})\n\n  # disabled for now, headers are platform specific\n  # find_package(SDL2 REQUIRED)\n  # generate(libSDL2)\n  # add_host_lib(SDL2 ${GUEST_BITNESS})\n  # target_include_directories(SDL2-host PRIVATE ${SDL2_INCLUDE_DIRS})\n\n  generate(libdrm ${CMAKE_CURRENT_SOURCE_DIR}/../libdrm/libdrm_interface.cpp ${GUEST_BITNESS})\n  target_include_directories(libdrm-${GUEST_BITNESS}-deps INTERFACE /usr/include/drm/)\n  target_include_directories(libdrm-${GUEST_BITNESS}-deps INTERFACE /usr/include/libdrm/)\n  add_host_lib(drm ${GUEST_BITNESS})\nendforeach()\n\nset(BITNESS_LIST \"32;64\")\nforeach(GUEST_BITNESS IN LISTS BITNESS_LIST)\n  if (BUILD_FEX_LINUX_TESTS)\n    generate(libfex_thunk_test ${CMAKE_CURRENT_SOURCE_DIR}/../libfex_thunk_test/libfex_thunk_test_interface.cpp ${GUEST_BITNESS})\n    add_host_lib(fex_thunk_test ${GUEST_BITNESS})\n  endif()\n\n  generate(libvulkan ${CMAKE_CURRENT_SOURCE_DIR}/../libvulkan/libvulkan_interface.cpp ${GUEST_BITNESS})\n  target_include_directories(libvulkan-${GUEST_BITNESS}-deps INTERFACE ${FEX_PROJECT_SOURCE_DIR}/External/Vulkan-Headers/include/)\n  add_host_lib(vulkan ${GUEST_BITNESS})\n\n  generate(libwayland-client ${CMAKE_CURRENT_SOURCE_DIR}/../libwayland-client/libwayland-client_interface.cpp ${GUEST_BITNESS})\n  add_host_lib(wayland-client ${GUEST_BITNESS})\n  target_include_directories(libwayland-client-${GUEST_BITNESS}-deps INTERFACE /usr/include/wayland)\n\n  generate(libEGL ${CMAKE_CURRENT_SOURCE_DIR}/../libEGL/libEGL_interface.cpp ${GUEST_BITNESS})\n  add_host_lib(EGL ${GUEST_BITNESS})\n\n  generate(libGL ${CMAKE_CURRENT_SOURCE_DIR}/../libGL/libGL_interface.cpp ${GUEST_BITNESS})\n  add_host_lib(GL ${GUEST_BITNESS})\n\n  find_package(OpenGL REQUIRED)\n  target_link_libraries(GL-host-${GUEST_BITNESS} PRIVATE OpenGL::GL)\nendforeach()\n\nif (BUILD_FEX_LINUX_TESTS)\n  add_library(fex_thunk_test SHARED ../libfex_thunk_test/lib.cpp)\n  install(TARGETS fex_thunk_test LIBRARY DESTINATION lib COMPONENT TestLibraries)\nendif()\n"
  },
  {
    "path": "ThunkLibs/README.md",
    "content": "# FEX Library Thunking (Thunklibs)\nFEX supports special guest libraries that call out to host code for speed and compatibility.\n\nWe support both guest->host thunks, as well as host->guest callbacks\n\n## Building and using\nThe thunked libraries can be built via the `guest-libs` and `host-libs` targets of the main FEX project. The outputs are in `$BUILDDIR/Guest` and `$BUILDDIR/Host`\n\nAfter that, a guest rootfs is needed with the guest-libs installed. Typically this is done with symlinks that replace the native guest libraries. eg \n```\n# Unlink original guest lib\nunlink $ROOTFS/lib/x86_64-linux-gnu/libX11.so.6\n# Make it point to thunked version\nln -s $BUILDDIR/Guest/libX11-guest.so $ROOTFS/lib/x86_64-linux-gnu/libX11.so.6\n```\n\nFinally, FEX needs to be told where to look for the matching host libraries with `-t /Host/Libs/Path`. eg\n```FEX_THUNKHOSTLIBS= $BUILDDIR/Host FEX /PATH/TO/ELF```\n\nWe currently don't have any unit tests for the guest libraries, only for OP_THUNK.\n\n## Implementation outline\nThere are several parts that make this possible. This is a rough outline.\n\nIn FEX\n- Opcode 0xF 0x3F (IR::OP_THUNK) is used for the Guest -> Host transition. Register RSI (arg0 in guest) is passed as arg0 in host. Thunks are identified by a string in the form `library:function` that directly follows the Guest opcode.\n- `Context::HandleCallback` does the Host -> Guest transition, and returns when the Guest function returns.\n- A special thunk, `fex:loadlib` is used to load and initialize a matching host lib. For more details, look in `ThunkHandler_impl::LoadLib`\n- `ThunkHandler_impl::CallCallback` is provided to the host libs, so they can call callbacks. It prepares guest arguments and uses `Context::HandleCallback` \n\nThunkLibs, Library loading\n- In Guest code, when a thunking library is loaded it has a constructor that calls the `fex:loadlib` thunk, with the library name and callback unpackers, if any.\n- In FEX, a matching host library is loaded using dlopen, `fexthunks_exports_$libname(CallCallbackPtr, GuestUnpackers)` is called to initialize the host library.\n- In Host code, the real host library is loaded using dlopen and dlsym (see ldr generation)\n\nThunkLibs, Guest -> Host\n- In Guest code (guest packer), a packer takes care of packing the arguments & return value into a struct in Guest stack. The packer is usually exported as a symbol from the Guest library.\n- In Guest code (guest thunk), a thunk does the Guest -> Host transition via OP_THUNK, and passes the struct pointer as an argument\n- FEX handles OP_THUNK and looks up the Host function from the opcode argument\n- In Host code (host unpacker), an unpacker takes the arguments from the struct, and calls a function pointer with the implementation of that function. It also stores the return value, if any, to the struct.\n- In Host code (host unpacker), the unpacker returns, and we do an implicit Host -> Guest transition\n- In Guest code (guest packer), the return value is loaded from the struct and returned, if needed\n\nThunkLibs, Host -> Guest. This is only possible while handling a Guest -> Host call (ie, callbacks). \n- In Host code (host packer), a packer packs the arguments & return value to a struct in Host stack.\n- In Host code (host packer), `ThunkHandler_impl::CallCallback` is called with the Guest unpacker, and Guest function as arguments\n- In Guest code (guest unpacker), the arguments are unpacked, the Guest function is called, and the return value is stored to the struct\n- In Guest code (guest unpacker), the unpacker returns and we do an implicit Guest -> Host transition\n- In host code (host packer), the return value is loaded from the struct and returned, if needed\n\nBoilerplate code is automated using a dedicated code generator tool, which parses a C++ source file (`libX_interface.cpp`) that specializes\na templated `fex_gen_config` struct for each thunked function. The generator will pull all required function signatures from the original\nlibrary's header files and emit the appropriate boilerplate (guest->host thunks, argument packers/unpackers, host library loader, ...).\n\nIn most cases, an empty `fex_gen_config` specialization is sufficient, but if needed the generator behavior can be customized on a\nfunction-by-function basis using an annotation-syntax: Binary properties are toggled by inheriting from a fixed set of tag types\n(e.g. `fexgen::custom_host_impl`), whereas complicated properties are customized by defining struct members/aliases with a magic name\ndetected by the generator (e.g. `using uniform_va_type = char`).\n\nFor each thunked library, the generator outputs the following files:\n- `thunks.inl`: Guest -> Host transition functions that use 0xF 0x3F\n- `function_packs.inl`: Guest argument packers / rv handling, private to the SO. These are used to solve symbol resolution issues with glxGetProc*, etc.\n- `function_packs_public.inl`: Guest argument packers / rv handling, exported from the SO. These are identical to the function_packs, but exported from the SO\n- `function_unpacks.inl`: Host argument unpackers / rv handling\n- `ldr.inl`: Host loader that dlopens/dlsyms the \"real\" host library for the implementation functions.\n- `ldr_ptrs.inl`: Host loader pointer declarations, used by ldr and function_unpacks\n- `tab_function_unpacks.inl`: Host function unpackers list, passed to FEX after Host library init so it can resolve the Guest Thunks to Host functions\n\n\n## Adding a new library\n\nThere are two kinds of libs, simpler ones with no callbacks, and complex ones with callbacks. You can see how `libX11` is implemented for a callbacks example, and `libasound` for a non-callbacks example.\n\nGetting started\n- Create `libName/libName_interface.cpp` and customize the `fex_gen_config` template for each thunked function. See some existing lib for details.\n- Create `libName/libName_Guest.cpp` and `libName/libName_Host.cpp`. Copy & rename from some existing lib is the way to go.\n- Edit `GuestLibs/CMakeLists.txt` and `HostLibs/CMakeLists.txt` to add the new targets, similar to how other libs are done.\n\nNow the host and the guest libs should be built as part of `guest-libs` and `host-libs`\n"
  },
  {
    "path": "ThunkLibs/include/common/GeneratorInterface.h",
    "content": "namespace fexgen {\nstruct returns_guest_pointer {};\nstruct custom_host_impl {};\nstruct custom_guest_entrypoint {};\n\nstruct generate_guest_symtable {};\nstruct indirect_guest_calls {};\n\nstruct callback_annotation_base {\n  // Prevent annotating multiple callback strategies\n  bool prevent_multiple;\n};\nstruct callback_stub : callback_annotation_base {};\n\n// Member annotation to mark members handled by custom repacking. This enables\n// automatic struct repacking of structs with non-trivial members (pointers,\n// unions, ...). Repacking logic is auto-generated as usual, with the\n// difference that an external function is called to manually repack the\n// annotated members.\n//\n// Two functions must be implemented for the parent struct type:\n// * fex_custom_repack_entry, called after automatic repacking of the other members\n// * fex_custom_repack_exit, called on exit but before automatic exit-repacking\n//     of the other members. Non-trivial implementations must perform host->guest\n//     repacking manually and return the boolean value true.\n//\n// If multiple members of the same struct are annotated as custom_repack,\n// they must be handled in the same fex_custom_repack_entry/exit functions.\nstruct custom_repack {};\n\n// Type annotation to indicate that guest_layout/host_layout definitions should\n// be emitted even if the type is non-repackable. Pointer members will be\n// copied (or zero-extended) without regard for the referred data.\nstruct emit_layout_wrappers {};\n\nstruct type_annotation_base {\n  bool prevent_multiple;\n};\n\n// Pointers to types annotated with this will be passed through without change\nstruct opaque_type : type_annotation_base {};\n\n// Function parameter annotation.\n// Pointers are passed through to host (extending to 64-bit if needed) without modifying the pointee.\n// The type passed to Host will be guest_layout<pointee_type>*.\nstruct ptr_passthrough {};\n\n// Type / Function parameter annotation.\n// Assume objects of the given type are compatible across architectures,\n// even if the generator can't automatically prove this. For pointers, this refers to the pointee type.\n// NOTE: In contrast to opaque_type, this allows for non-pointer members with the annotated type to be repacked automatically.\nstruct assume_compatible_data_layout : type_annotation_base {};\n\n} // namespace fexgen\n"
  },
  {
    "path": "ThunkLibs/include/common/Guest.h",
    "content": "#pragma once\n#include <stdint.h>\n#include <type_traits>\n\n#include \"PackedArguments.h\"\n\n#if __SIZEOF_POINTER__ == 8\n#define THUNK_ABI\n#else\n#ifdef __clang__\n#define THUNK_ABI __fastcall\n#else\n#define THUNK_ABI __attribute__((fastcall))\n#endif\n#endif\n\ntemplate<typename signature>\nTHUNK_ABI const int (*fexthunks_invoke_callback)(void*);\n\n#ifndef ARCHITECTURE_arm64\n#define MAKE_THUNK(lib, name, hash)                                                                    \\\n  extern \"C\" __attribute__((visibility(\"hidden\"))) THUNK_ABI int fexthunks_##lib##_##name(void* args); \\\n  asm(\".text\\nfexthunks_\" #lib \"_\" #name \":\\n.byte 0xF, 0x3F\\n.byte \" hash);\n\n#define MAKE_CALLBACK_THUNK(name, signature, hash)                                             \\\n  extern \"C\" __attribute__((visibility(\"hidden\"))) THUNK_ABI int fexthunks_##name(void* args); \\\n  asm(\".text\\nfexthunks_\" #name \":\\n.byte 0xF, 0x3F\\n.byte \" hash);                            \\\n  template<>                                                                                   \\\n  THUNK_ABI inline constexpr int (*fexthunks_invoke_callback<signature>)(void*) = fexthunks_##name;\n\n#else\n// We're compiling for IDE integration, so provide a dummy-implementation that just calls an undefined function.\n// The name of that function serves as an error message if this library somehow gets loaded at runtime.\nextern \"C\" void BROKEN_INSTALL___TRIED_LOADING_AARCH64_BUILD_OF_GUEST_THUNK();\n#define MAKE_THUNK(lib, name, hash)                                \\\n  extern \"C\" int fexthunks_##lib##_##name(void* args) {            \\\n    BROKEN_INSTALL___TRIED_LOADING_AARCH64_BUILD_OF_GUEST_THUNK(); \\\n    return 0;                                                      \\\n  }\n#define MAKE_CALLBACK_THUNK(name, signature, hash) \\\n  extern \"C\" int fexthunks_##name(void* args);     \\\n  template<>                                       \\\n  inline constexpr int (*fexthunks_invoke_callback<signature>)(void*) = fexthunks_##name;\n#endif\n\n// Generated fexfn_pack_ symbols should be hidden by default, but clang does\n// not support aliasing to static functions. Make them regular non-static\n// functions on that compiler instead, hence.\n#if defined(__clang__)\n#define FEX_PACKFN_LINKAGE\n#else\n#define FEX_PACKFN_LINKAGE static\n#endif\n\nstruct LoadlibArgs {\n  const char* Name;\n  uintptr_t CallbackThunks;\n};\n\nMAKE_THUNK(fex, loadlib,\n           \"0x27, 0x7e, 0xb7, 0x69, 0x5b, 0xe9, 0xab, 0x12, 0x6e, 0xf7, 0x85, 0x9d, 0x4b, 0xc9, 0xa2, 0x44, 0x46, 0xcf, 0xbd, 0xb5, 0x87, \"\n           \"0x43, 0xef, 0x28, 0xa2, 0x65, 0xba, 0xfc, 0x89, 0x0f, 0x77, 0x80\")\nMAKE_THUNK(fex, is_lib_loaded,\n           \"0xee, 0x57, 0xba, 0x0c, 0x5f, 0x6e, 0xef, 0x2a, 0x8c, 0xb5, 0x19, 0x81, 0xc9, 0x23, 0xe6, 0x51, 0xae, 0x65, 0x02, 0x8f, 0x2b, \"\n           \"0x5d, 0x59, 0x90, 0x6a, 0x7e, 0xe2, 0xe7, 0x1c, 0x33, 0x8a, 0xff\")\nMAKE_THUNK(fex, is_host_heap_allocation,\n           \"0xf5, 0x77, 0x68, 0x43, 0xbb, 0x6b, 0x28, 0x18, 0x40, 0xb0, 0xdb, 0x8a, 0x66, 0xfb, 0x0e, 0x2d, 0x98, 0xc2, 0xad, 0xe2, 0x5a, \"\n           \"0x18, 0x5a, 0x37, 0x2e, 0x13, 0xc9, 0xe7, 0xb9, 0x8c, 0xa9, 0x3e\")\nMAKE_THUNK(fex, link_address_to_function,\n           \"0xe6, 0xa8, 0xec, 0x1c, 0x7b, 0x74, 0x35, 0x27, 0xe9, 0x4f, 0x5b, 0x6e, 0x2d, 0xc9, 0xa0, 0x27, 0xd6, 0x1f, 0x2b, 0x87, 0x8f, \"\n           \"0x2d, 0x35, 0x50, 0xea, 0x16, 0xb8, 0xc4, 0x5e, 0x42, 0xfd, 0x77\")\nMAKE_THUNK(fex, allocate_host_trampoline_for_guest_function,\n           \"0x9b, 0xb2, 0xf4, 0xb4, 0x83, 0x7d, 0x28, 0x93, 0x40, 0xcb, 0xf4, 0x7a, 0x0b, 0x47, 0x85, 0x87, 0xf9, 0xbc, 0xb5, 0x27, 0xca, \"\n           \"0xa6, 0x93, 0xa5, 0xc0, 0x73, 0x27, 0x24, 0xae, 0xc8, 0xb8, 0x5a\")\n\n#define LOAD_LIB_BASE(name, init_fn)                   \\\n  __attribute__((constructor)) static void loadlib() { \\\n    LoadlibArgs args = {#name};                        \\\n    fexthunks_fex_loadlib(&args);                      \\\n    if ((init_fn)) ((void (*)())init_fn)();            \\\n  }\n\n#define LOAD_LIB(name) LOAD_LIB_BASE(name, nullptr)\n#define LOAD_LIB_INIT(name, init_fn) LOAD_LIB_BASE(name, init_fn)\n\ninline void LinkAddressToFunction(uintptr_t addr, uintptr_t target) {\n  struct args_t {\n    uint64_t original_callee;\n    uint64_t target_addr; // Function to call when branching to replaced_addr\n  };\n  args_t args = {addr, target};\n  fexthunks_fex_link_address_to_function(&args);\n}\n\ninline bool IsLibLoaded(const char* libname) {\n  struct {\n    const char* Name;\n    bool rv;\n  } argsrv = {libname};\n\n  fexthunks_fex_is_lib_loaded(&argsrv);\n\n  return argsrv.rv;\n}\n\n// Helper template that packs the given arguments and invokes a thunk at the\n// address stored in the `r11` guest register. The signature of the thunk must\n// be specified at compile-time via the Thunk template parameter.\n// Other than reading the thunk address from `r11`, this is equivalent to the\n// fexfn_pack_* functions generated for global API functions.\ntemplate<auto Thunk, typename Result, typename... Args>\ninline Result CallHostFunction(Args... args) {\n#ifndef ARCHITECTURE_arm64\n#if __SIZEOF_POINTER__ == 8\n  // This magic incantation of using a register variable with an empty asm block is necessary for correct operation!\n  // If we only use inline asm that sets a variable then the compiler will reorder the function\n  // prologue to be BEFORE our inline asm. Which makes sense in hindsight, but for anything with 8+ arguments this\n  // will clobber our r11 register we save the data that is inside of it.\n\n  // First we need to declare the r11 register variable\n  register uintptr_t host_addr asm(\"r11\");\n\n  // We then create an empty *volatile* asm block saying that it is assigning the register variable.\n  // Yes, it is already set coming in to this function due to custom ABI.\n  // This gets both GCC and Clang to understand that the variable is set, seemingly at the start of the function.\n  // So its own internal live-range tracking extends its begining range to the start of the function.\n  //\n  // To verify this in the future, search for `mov     r11` in binaryninja, and ensure that all uses inside of `CallHostFunction`\n  // don't have intersecting ranges.\n  //\n  // Note that this issue is more likely to occur when clang is used to compile thunks, since its optimizer is more aggressive at using R11.\n  // This magic incantation also works in that instance so this is about the best we can do without adding a new attribute to clang for\n  // modifying the ABI.\n  asm volatile(\"\" : \"=r\"(host_addr));\n#else\n  // Use mm0 to pass in host_addr (chosen to avoid conflicts with vectorcall).\n  // Note this register overlaps the x87 st(0) register (used to return float values),\n  // so applications that expect this register to be preserved could run into problems.\n  uintptr_t host_addr;\n  asm volatile(\"movd %%mm0, %0\" : \"=r\"(host_addr));\n#endif\n#else\n  uintptr_t host_addr = 0;\n#endif\n\n  PackedArguments<Result, Args..., uint64_t> packed_args = {\n    args..., host_addr\n    // Return value not explicitly initialized since an initializer would fail to compile for the void case\n  };\n\n  Thunk(reinterpret_cast<void*>(&packed_args));\n\n  if constexpr (!std::is_void_v<Result>) {\n    return packed_args.rv;\n  }\n}\n\n// Convenience wrapper that returns the function pointer to a CallHostFunction\n// instantiation matching the function signature of `host_func`\ntemplate<typename Result, typename... Args>\nstatic auto GetCallerForHostFunction(Result (*host_func)(Args...)) -> Result (*)(Args...) {\n  return &CallHostFunction<fexthunks_invoke_callback<Result(Args...)>, Result, Args...>;\n}\n\n// Ensures the given host function can safely be called from guest code.\ntemplate<typename Result, typename... Args>\ninline void MakeHostFunctionGuestCallable(THUNK_ABI Result (*host_func)(Args...)) {\n  auto caller = (uintptr_t)GetCallerForHostFunction(host_func);\n  LinkAddressToFunction((uintptr_t)host_func, (uintptr_t)caller);\n}\n\ntemplate<typename Target>\ninline Target* AllocateHostTrampolineForGuestFunction(void THUNK_ABI (*GuestUnpacker)(uintptr_t, void*), Target* GuestTarget) {\n  if (!GuestTarget) {\n    return 0;\n  }\n\n  struct {\n    uint64_t GuestUnpacker;\n    uint64_t GuestTarget;\n    uint64_t rv;\n  } argsrv = {(uintptr_t)GuestUnpacker, (uintptr_t)GuestTarget};\n\n  fexthunks_fex_allocate_host_trampoline_for_guest_function((void*)&argsrv);\n\n  return (Target*)argsrv.rv;\n}\n\ntemplate<typename F>\nstruct CallbackUnpack;\n\ntemplate<typename Result, typename... Args>\nstruct CallbackUnpack<Result(Args...)> {\n  static void THUNK_ABI Unpack(uintptr_t cb, void* argsv) {\n    using fn_t = Result(Args...);\n    auto callback = reinterpret_cast<fn_t*>(cb);\n    auto args = reinterpret_cast<PackedArguments<Result, Args...>*>(argsv);\n    Invoke(callback, *args);\n  }\n};\n\ntemplate<typename Result, typename... Args>\nstruct CallbackUnpack<Result (*)(Args...)> : CallbackUnpack<Result(Args...)> {};\n\ntemplate<typename Target>\ninline Target* AllocateHostTrampolineForGuestFunction(Target* GuestTarget) {\n  return AllocateHostTrampolineForGuestFunction(CallbackUnpack<Target*>::Unpack, GuestTarget);\n}\n\ninline bool IsHostHeapAllocation(void* ptr) {\n  struct {\n    void* ptr;\n    bool rv;\n  } args = {ptr, {}};\n\n  fexthunks_fex_is_host_heap_allocation(&args);\n  return args.rv;\n}\n"
  },
  {
    "path": "ThunkLibs/include/common/Host.h",
    "content": "/*\n$info$\ncategory: thunklibs ~ These are generated + glue logic 1:1 thunks unless noted otherwise\n$end_info$\n*/\n\n#pragma once\n#include <array>\n#include <cstdint>\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n#include <dlfcn.h>\n#include <optional>\n\n#include \"PackedArguments.h\"\n\n// Import FEX::HLE functions for use in host thunk libraries.\n//\n// Note these are statically linked into the FEX executable. The linker hence\n// doesn't know about them when linking thunk libraries. This issue is avoided\n// by declaring the functions as weak symbols.\nnamespace FEX::HLE {\nstruct HostToGuestTrampolinePtr;\n\n__attribute__((weak)) HostToGuestTrampolinePtr* MakeHostTrampolineForGuestFunction(void* HostPacker, uintptr_t GuestTarget, uintptr_t GuestUnpacker);\n\n__attribute__((weak)) HostToGuestTrampolinePtr* FinalizeHostTrampolineForGuestFunction(HostToGuestTrampolinePtr*, void* HostPacker);\n\n__attribute__((weak)) void* GetGuestStack();\n\n__attribute__((weak)) void MoveGuestStack(uintptr_t NewAddress);\n} // namespace FEX::HLE\n\ntemplate<typename Fn>\nstruct function_traits;\ntemplate<typename Result, typename Arg>\nstruct function_traits<Result (*)(Arg)> {\n  using result_t = Result;\n  using arg_t = Arg;\n};\n\ntemplate<auto Fn>\nstatic typename function_traits<decltype(Fn)>::result_t fexfn_type_erased_unpack(void* argsv) {\n  using args_t = typename function_traits<decltype(Fn)>::arg_t;\n  return Fn(reinterpret_cast<args_t>(argsv));\n}\n\nstruct ExportEntry {\n  uint8_t* sha256;\n  void (*fn)(void*);\n};\n\ntypedef void fex_call_callback_t(uintptr_t callback, void* arg0, void* arg1);\n\n#define EXPORTS(name)                       \\\n  extern \"C\" {                              \\\n  ExportEntry* fexthunks_exports_##name() { \\\n    if (!fexldr_init_##name()) {            \\\n      return nullptr;                       \\\n    }                                       \\\n    return exports;                         \\\n  }                                         \\\n  }\n\n#define LOAD_LIB_INIT(init_fn)                         \\\n  __attribute__((constructor)) static void loadlib() { \\\n    init_fn();                                         \\\n  }\n\nstruct GuestcallInfo {\n  uintptr_t HostPacker;\n  void (*CallCallback)(uintptr_t GuestUnpacker, uintptr_t GuestTarget, void* argsrv);\n  uintptr_t GuestUnpacker;\n  uintptr_t GuestTarget;\n};\n\n// Helper macro for reading an internal argument passed through the `r11`\n// host register. This macro must be placed at the very beginning of\n// the function it is used in.\n#if defined(ARCHITECTURE_x86_64)\n#define LOAD_INTERNAL_GUESTPTR_VIA_CUSTOM_ABI(target_variable) asm volatile(\"mov %%r11, %0\" : \"=r\"(target_variable))\n#elif defined(ARCHITECTURE_arm64)\n#define LOAD_INTERNAL_GUESTPTR_VIA_CUSTOM_ABI(target_variable) asm volatile(\"mov %0, x11\" : \"=r\"(target_variable))\n#endif\n\nstruct ParameterAnnotations {\n  bool is_passthrough = false;\n  bool assume_compatible = false;\n};\n\n// Generator emits specializations for this for each type that has compatible layout\ntemplate<typename T>\ninline constexpr bool has_compatible_data_layout =\n  std::is_integral_v<T> || std::is_enum_v<T> ||\n  std::is_floating_point_v<T>\n#ifndef IS_32BIT_THUNK\n  // If none of the previous predicates matched, the thunk generator did *not* emit a specialization for T.\n  // This should not happen on 64-bit with the currently thunked libraries, since their types\n  // * either have fully consistent data layout across 64-bit architectures.\n  // * or use custom repacking, in which case has_compatible_data_layout isn't used\n  //\n  // Throwing a fake exception here will trigger a build failure.\n  || (throw \"Instantiated on a type that was expected to be compatible\", true)\n#endif\n  ;\n\n#ifndef IS_32BIT_THUNK\n// Pointers have the same size, hence data layout compatibility only depends on the pointee type\ntemplate<typename T>\ninline constexpr bool has_compatible_data_layout<T*> = has_compatible_data_layout<std::remove_cv_t<T>>;\ntemplate<typename T>\ninline constexpr bool has_compatible_data_layout<T* const> = has_compatible_data_layout<std::remove_cv_t<T>*>;\n\n// void* and void** are assumed to be compatible to simplify handling of libraries that use them ubiquitously\ntemplate<>\ninline constexpr bool has_compatible_data_layout<void*> = true;\ntemplate<>\ninline constexpr bool has_compatible_data_layout<const void*> = true;\ntemplate<>\ninline constexpr bool has_compatible_data_layout<void**> = true;\ntemplate<>\ninline constexpr bool has_compatible_data_layout<const void**> = true;\n#endif\n\n// Placeholder type to indicate the given data is in guest-layout\ntemplate<typename T>\nstruct __attribute__((packed)) guest_layout {\n  static_assert(!std::is_class_v<T>, \"No guest layout defined for this non-opaque struct type. This may be a bug in the thunk generator.\");\n  static_assert(!std::is_union_v<T>, \"No guest layout defined for this non-opaque union type. This may be a bug in the thunk generator.\");\n  static_assert(!std::is_enum_v<T>, \"No guest layout defined for this enum type. This is a bug in the thunk generator.\");\n  static_assert(!std::is_void_v<T>, \"Attempted to get guest layout of void. Missing annotation for void pointer?\");\n\n  static_assert(std::is_fundamental_v<T> || has_compatible_data_layout<T>, \"Default guest_layout may not be used for non-compatible data\");\n\n  using type = std::enable_if_t<!std::is_pointer_v<T>, T>;\n  type data;\n\n  guest_layout& operator=(const T from) {\n    data = from;\n    return *this;\n  }\n};\n\ntemplate<typename T, std::size_t N>\nstruct __attribute__((packed)) guest_layout<T[N]> {\n  using type = std::enable_if_t<!std::is_pointer_v<T>, T>;\n  std::array<guest_layout<type>, N> data;\n};\n\ntemplate<typename T>\nstruct guest_layout<T*> {\n#ifdef IS_32BIT_THUNK\n  using type = uint32_t;\n#else\n  using type = uint64_t;\n#endif\n  type data;\n\n  // Allow implicit conversion for function pointers, since they disallow use of host_layout\n  guest_layout& operator=(const T* from) requires (std::is_function_v<T>)\n  {\n    // TODO: Assert upper 32 bits are zero\n    data = reinterpret_cast<uintptr_t>(from);\n    return *this;\n  }\n\n  guest_layout<T>* get_pointer() {\n    return reinterpret_cast<guest_layout<T>*>(uintptr_t {data});\n  }\n\n  const guest_layout<T>* get_pointer() const {\n    return reinterpret_cast<const guest_layout<T>*>(uintptr_t {data});\n  }\n\n  T* force_get_host_pointer() {\n    return reinterpret_cast<T*>(uintptr_t {data});\n  }\n\n  const T* force_get_host_pointer() const {\n    return reinterpret_cast<const T*>(uintptr_t {data});\n  }\n};\n\ntemplate<typename T>\nstruct guest_layout<T* const> {\n#ifdef IS_32BIT_THUNK\n  using type = uint32_t;\n#else\n  using type = uint64_t;\n#endif\n  type data;\n\n  // Allow implicit conversion for function pointers, since they disallow use of host_layout\n  guest_layout& operator=(const T* from) requires (std::is_function_v<T>)\n  {\n    // TODO: Assert upper 32 bits are zero\n    data = reinterpret_cast<uintptr_t>(from);\n    return *this;\n  }\n\n  guest_layout<T>* get_pointer() {\n    return reinterpret_cast<guest_layout<T>*>(uintptr_t {data});\n  }\n\n  const guest_layout<T>* get_pointer() const {\n    return reinterpret_cast<const guest_layout<T>*>(uintptr_t {data});\n  }\n};\n\ntemplate<typename T>\nstruct host_layout;\n\ntemplate<typename T>\nstruct host_layout {\n  static_assert(!std::is_class_v<T>, \"No host_layout specialization generated for struct/class type\");\n  static_assert(!std::is_union_v<T>, \"No host_layout specialization generated for union type\");\n  static_assert(!std::is_void_v<T>, \"Attempted to get host layout of void. Missing annotation for void pointer?\");\n\n  // TODO: This generic implementation shouldn't be needed. Instead, auto-specialize host_layout for all types used as members.\n\n  T data;\n\n  explicit host_layout(const guest_layout<T>& from) requires (!std::is_enum_v<T>)\n    : data {from.data} {\n    // NOTE: This is not strictly neccessary since differently sized types may\n    //       be used across architectures. It's important that the host type\n    //       can represent all guest values without loss, however.\n    static_assert(sizeof(data) == sizeof(from));\n  }\n\n  explicit host_layout(const guest_layout<T>& from) requires (std::is_enum_v<T>)\n    : data {static_cast<T>(from.data)} {}\n\n  // Allow conversion of integral types of smaller or equal size and same sign\n  // to each other. Zero-extension is applied if needed.\n  // Notably, this is useful for handling \"long\"/\"long long\" on 64-bit, as well\n  // as uint8_t/char.\n  template<typename U>\n  explicit host_layout(const guest_layout<U>& from)\n    requires (std::is_integral_v<U> && sizeof(U) <= sizeof(T) && std::is_convertible_v<T, U> && std::is_signed_v<T> == std::is_signed_v<U>)\n    : data {static_cast<T>(from.data)} {}\n};\n\n// Explicitly turn a host type into its corresponding host_layout\ntemplate<typename T>\nconst host_layout<T>& to_host_layout(const T& t) {\n  static_assert(std::is_same_v<decltype(host_layout<T>::data), T>);\n  return reinterpret_cast<const host_layout<T>&>(t);\n}\n\ntemplate<typename T, size_t N>\nstruct host_layout<T[N]> {\n  std::array<T, N> data;\n\n  explicit host_layout(const guest_layout<T[N]>& from) {\n    for (size_t i = 0; i < N; ++i) {\n      data[i] = host_layout<T> {from.data[i]}.data;\n    }\n  }\n};\n\ntemplate<typename T>\nconstexpr bool is_long_or_longlong =\n  std::is_same_v<T, long> || std::is_same_v<T, unsigned long> || std::is_same_v<T, long long> || std::is_same_v<T, unsigned long long>;\n\ntemplate<typename T>\nstruct host_layout<T*> {\n  T* data;\n\n  static_assert(!std::is_function_v<T>, \"Function types must be handled separately\");\n\n  // Assume underlying data is compatible and just convert the guest-sized pointer to 64-bit\n  explicit host_layout(const guest_layout<T*>& from)\n    : data {(T*)(uintptr_t)from.data} {}\n\n  host_layout() = default;\n\n  // Allow conversion of pointers to 64-bit integer types to \"(un)signed long (long)*\".\n  // This is useful for handling \"long\"/\"long long\" on 64-bit, which are distinct types\n  // but have equal data layout.\n  template<typename U>\n  explicit host_layout(const guest_layout<U*>& from)\n    requires (is_long_or_longlong<std::remove_cv_t<T>> && std::is_integral_v<U> && std::is_convertible_v<T, U> &&\n              std::is_signed_v<T> == std::is_signed_v<U>\n#if __clang_major__ >= 16\n              // Old clang versions don't support using sizeof on incomplete types when evaluating requires()\n              && sizeof(T) == sizeof(U)\n#endif\n                )\n    : data {(T*)(uintptr_t)from.data} {\n  }\n\n  // Allow conversion of pointers to 8-bit integer types to \"char*\".\n  // This is useful since \"char\"/\"signed char\"/\"unsigned char\"/\"int8_t\"/\"uint8_t\"\n  // may all be distinct types but have equal data layout\n  template<typename U>\n  explicit host_layout(const guest_layout<U*>& from)\n    requires (std::is_same_v<std::remove_cv_t<T>, char> && std::is_integral_v<U> && std::is_convertible_v<T, U> && sizeof(U) == 1)\n    : data {(T*)(uintptr_t)from.data} {}\n\n  // Allow conversion of pointers to 32-bit integer types to \"wchar_t*\".\n  template<typename U>\n  explicit host_layout(const guest_layout<U*>& from) requires (\n    std::is_same_v<std::remove_cv_t<T>, wchar_t> && std::is_integral_v<U> && std::is_convertible_v<T, U> && sizeof(U) == sizeof(wchar_t))\n    : data {(T*)(uintptr_t)from.data} {}\n};\n\ntemplate<typename T>\nstruct host_layout<T* const> {\n  T* data;\n\n  static_assert(!std::is_function_v<T>, \"Function types must be handled separately\");\n\n  // Assume underlying data is compatible and just convert the guest-sized pointer to 64-bit\n  explicit host_layout(const guest_layout<T* const>& from)\n    : data {(T*)(uintptr_t)from.data} {}\n};\n\n// Wrapper around host_layout that repacks from a guest_layout on construction\n// and exit-repacks on scope exit (if needed). The wrapper manages the storage\n// needed for repacked data itself.\n// This also implicitly converts to a pointer of the wrapped host type, since\n// this conversion is required at all call sites anyway\ntemplate<typename T, typename GuestT>\nstruct repack_wrapper {\n  static_assert(std::is_pointer_v<T>);\n\n  // Strip \"const\" from pointee type in host_layout storage\n  using PointeeT = std::remove_cv_t<std::remove_pointer_t<T>>;\n\n  std::optional<host_layout<PointeeT>> data;\n  guest_layout<GuestT>& orig_arg;\n\n  repack_wrapper(guest_layout<GuestT>& orig_arg_)\n    : orig_arg(orig_arg_) {\n    if (orig_arg.get_pointer()) {\n      data = {*orig_arg_.get_pointer()};\n\n      if constexpr (!std::is_enum_v<T>) {\n        constexpr bool is_compatible = has_compatible_data_layout<T> && std::is_same_v<T, GuestT>;\n        if constexpr (!is_compatible && std::is_class_v<std::remove_pointer_t<T>>) {\n          fex_apply_custom_repacking_entry(*data, *orig_arg_.get_pointer());\n        }\n      }\n    }\n  }\n\n  ~repack_wrapper() {\n    // TODO: Properly detect opaque types\n    if constexpr (std::is_class_v<std::remove_pointer_t<T>> && requires(guest_layout<T> t, decltype(data) h) {\n                    t.get_pointer();\n                    (bool)h;\n                    *data;\n                  }) {\n      if (data) {\n        // NOTE: It's assumed that the native host library didn't modify any\n        //       const-pointees, so we skip automatic exit repacking for them.\n        //       However, *custom* repacking must still be applied since it\n        //       might have unrelated side effects (such as deallocation of\n        //       memory reserved on entry)\n        if (!fex_apply_custom_repacking_exit(*orig_arg.get_pointer(), *data)) {\n          if constexpr (!std::is_const_v<std::remove_pointer_t<T>>) { // Skip exit-repacking for const pointees\n            if constexpr (!(has_compatible_data_layout<T> && std::is_same_v<T, GuestT>)) {\n              *orig_arg.get_pointer() = to_guest(*data); // TODO: Only if annotated as out-parameter\n            }\n          }\n        }\n      }\n    }\n  }\n\n  operator PointeeT*() {\n    static_assert(sizeof(PointeeT) == sizeof(host_layout<PointeeT>));\n    static_assert(alignof(PointeeT) == alignof(host_layout<PointeeT>));\n    return data ? &data.value().data : nullptr;\n  }\n};\n\ntemplate<typename T, typename GuestT>\nstatic repack_wrapper<T, GuestT> make_repack_wrapper(guest_layout<GuestT>& orig_arg) {\n  return {orig_arg};\n}\n\ntemplate<typename T>\nT& unwrap_host(host_layout<T>& val) {\n  return val.data;\n}\n\ntemplate<typename T, typename T2>\nT* unwrap_host(repack_wrapper<T*, T2>& val) {\n  return val;\n}\n\ntemplate<typename T>\nstruct host_to_guest_convertible {\n  const host_layout<T>& from;\n\n  // Conversion from host to guest layout for non-pointers\n  operator guest_layout<T>() const requires (!std::is_pointer_v<T>)\n  {\n    if constexpr (std::is_enum_v<T>) {\n      // enums are represented by fixed-size integers in guest_layout, so explicitly cast them\n      return guest_layout<T> {static_cast<std::underlying_type_t<T>>(from.data)};\n    } else {\n      guest_layout<T> ret {.data = from.data};\n      return ret;\n    }\n  }\n\n  operator guest_layout<T>() const requires (std::is_pointer_v<T>)\n  {\n    // TODO: Assert upper 32 bits are zero\n    guest_layout<T> ret;\n    ret.data = reinterpret_cast<uintptr_t>(from.data);\n    return ret;\n  }\n\n#if IS_32BIT_THUNK\n  // Allow size_t -> uint32_t conversions, since they are so common on 32-bit\n  operator guest_layout<uint32_t>() const requires (std::is_same_v<T, size_t>)\n  {\n    return {static_cast<uint32_t>(from.data)};\n  }\n\n  // libGL also needs to allow long->int conversions for return values...\n  operator guest_layout<int32_t>() const requires (std::is_same_v<T, long>)\n  {\n    return {static_cast<int32_t>(from.data)};\n  }\n#endif\n\n  // Make guest_layout of \"long long\" and \"long\" interoperable, since they are\n  // the same type as far as data layout is concerned.\n  operator guest_layout<const unsigned long long*>() const requires (std::is_same_v<T, const unsigned long*>)\n  {\n    return (guest_layout<const unsigned long long*>)reinterpret_cast<const host_to_guest_convertible<const unsigned long long*>&>(*this);\n  }\n\n  // Make guest_layout of \"char\" and \"uint8_t\" interoperable\n  operator guest_layout<const uint8_t*>() const requires (std::is_same_v<T, const char*>)\n  {\n    return (guest_layout<const uint8_t*>)reinterpret_cast<const host_to_guest_convertible<const uint8_t*>&>(*this);\n  }\n\n  operator guest_layout<uint8_t*>() const requires (std::is_same_v<T, char*>)\n  {\n    return (guest_layout<uint8_t*>)reinterpret_cast<const host_to_guest_convertible<uint8_t*>&>(*this);\n  }\n\n  // Make guest_layout of \"wchar_t\" and \"uint32_t\" interoperable\n  operator guest_layout<uint32_t*>() const requires (std::is_same_v<T, wchar_t*>)\n  {\n    return (guest_layout<uint32_t*>)reinterpret_cast<const host_to_guest_convertible<uint32_t*>&>(*this);\n  }\n\n  static_assert(sizeof(wchar_t) == 4);\n\n  // Allow conversion of integral types of same size and sign to each other.\n  // This is useful for handling \"long\"/\"long long\" on 64-bit, as well as uint8_t/char.\n  template<typename U>\n  operator guest_layout<U>() const\n    requires (std::is_integral_v<U> && sizeof(U) == sizeof(T) && std::is_convertible_v<T, U> && std::is_signed_v<T> == std::is_signed_v<U>)\n  {\n    return guest_layout<U> {.data {static_cast<T>(from.data)}};\n  }\n};\n\ntemplate<typename T>\ninline host_to_guest_convertible<T> to_guest(const host_layout<T>& from) {\n  return {from};\n}\n\ntemplate<typename>\nstruct CallbackUnpack;\n\ntemplate<typename T, ParameterAnnotations Annotation>\nconstexpr bool IsCompatible() {\n  if constexpr (Annotation.assume_compatible) {\n    return true;\n  } else if constexpr (has_compatible_data_layout<T>) {\n    return true;\n  } else {\n    if constexpr (std::is_pointer_v<T>) {\n      return has_compatible_data_layout<std::remove_cv_t<std::remove_pointer_t<T>>>;\n    } else {\n      return false;\n    }\n  }\n}\n\ntemplate<typename T>\nstruct decaying_host_layout {\n  host_layout<T> data;\n  operator T() {\n    return data.data;\n  }\n};\n\ntemplate<ParameterAnnotations Annotation, typename HostT, typename T>\nauto Projection(guest_layout<T>& data) {\n  if constexpr (Annotation.is_passthrough) {\n    return data;\n  } else if constexpr ((IsCompatible<T, Annotation>() && std::is_same_v<T, HostT>) || !std::is_pointer_v<T>) {\n    // Instead of using host_layout<HostT> { data }.data, return a wrapper object.\n    // This ensures that temporary lifetime extension can kick in at call-site.\n    return decaying_host_layout<HostT> {.data {data}};\n  } else {\n    // This argument requires temporary storage for repacked data\n    // *and* it needs to call custom repack functions (if any)\n    return make_repack_wrapper<HostT>(data);\n  }\n}\n\n#ifdef IS_32BIT_THUNK\n/**\n * Helper class to manage guest stack memory from a host function.\n *\n * The current guest stack position is saved upon construction and bumped\n * for each object construction. Upon destruction, the old guest stack is\n * restored.\n */\nclass GuestStackBumpAllocator final {\n  uintptr_t Top = reinterpret_cast<uintptr_t>(FEX::HLE::GetGuestStack());\n  uintptr_t Next = Top;\n\npublic:\n  ~GuestStackBumpAllocator() {\n    FEX::HLE::MoveGuestStack(Top);\n  }\n\n  template<typename T, typename... Args>\n  T* New(Args&&... args) {\n    Next -= sizeof(T);\n    Next &= ~uintptr_t {alignof(T) - 1};\n    FEX::HLE::MoveGuestStack(Next);\n    return new (reinterpret_cast<void*>(Next)) T {std::forward<Args>(args)...};\n  }\n};\n#endif\n\ntemplate<typename Result, typename... Args>\nstruct CallbackUnpack<Result(Args...)> {\n  static Result CallGuestPtr(Args... args) {\n    GuestcallInfo* guestcall;\n    LOAD_INTERNAL_GUESTPTR_VIA_CUSTOM_ABI(guestcall);\n\n#ifndef IS_32BIT_THUNK\n    PackedArguments<Result, guest_layout<Args>...> packed_args = {to_guest(to_host_layout(args))...};\n#else\n    GuestStackBumpAllocator GuestStack;\n    auto& packed_args = *GuestStack.New<PackedArguments<Result, guest_layout<Args>...>>(to_guest(to_host_layout(args))...);\n#endif\n    guestcall->CallCallback(guestcall->GuestUnpacker, guestcall->GuestTarget, &packed_args);\n\n    if constexpr (!std::is_void_v<Result>) {\n      return packed_args.rv;\n    }\n  }\n};\n\ntemplate<bool Cond, typename T, typename GuestT>\nusing as_guest_layout_if = std::conditional_t<Cond, guest_layout<GuestT>, T>;\n\ntemplate<typename, typename...>\nstruct GuestWrapperForHostFunction;\n\ntemplate<typename Result, typename... Args, typename... GuestArgs>\nstruct GuestWrapperForHostFunction<Result(Args...), GuestArgs...> {\n  // Host functions called from Guest\n  // NOTE: GuestArgs typically matches up with Args, however there may be exceptions (e.g. size_t)\n  template<ParameterAnnotations RetAnnotations, ParameterAnnotations... Annotations>\n  static void Call(void* argsv) {\n    static_assert(sizeof...(Annotations) == sizeof...(Args));\n    static_assert(sizeof...(GuestArgs) == sizeof...(Args));\n\n    auto args =\n      reinterpret_cast<PackedArguments<as_guest_layout_if<!std::is_void_v<Result>, Result, Result>, guest_layout<GuestArgs>..., uintptr_t>*>(argsv);\n    constexpr auto CBIndex = sizeof...(GuestArgs);\n    uintptr_t cb;\n    static_assert(CBIndex <= 18 || CBIndex == 23);\n    if constexpr (CBIndex == 0) {\n      cb = args->a0;\n    } else if constexpr (CBIndex == 1) {\n      cb = args->a1;\n    } else if constexpr (CBIndex == 2) {\n      cb = args->a2;\n    } else if constexpr (CBIndex == 3) {\n      cb = args->a3;\n    } else if constexpr (CBIndex == 4) {\n      cb = args->a4;\n    } else if constexpr (CBIndex == 5) {\n      cb = args->a5;\n    } else if constexpr (CBIndex == 6) {\n      cb = args->a6;\n    } else if constexpr (CBIndex == 7) {\n      cb = args->a7;\n    } else if constexpr (CBIndex == 8) {\n      cb = args->a8;\n    } else if constexpr (CBIndex == 9) {\n      cb = args->a9;\n    } else if constexpr (CBIndex == 10) {\n      cb = args->a10;\n    } else if constexpr (CBIndex == 11) {\n      cb = args->a11;\n    } else if constexpr (CBIndex == 12) {\n      cb = args->a12;\n    } else if constexpr (CBIndex == 13) {\n      cb = args->a13;\n    } else if constexpr (CBIndex == 14) {\n      cb = args->a14;\n    } else if constexpr (CBIndex == 15) {\n      cb = args->a15;\n    } else if constexpr (CBIndex == 16) {\n      cb = args->a16;\n    } else if constexpr (CBIndex == 17) {\n      cb = args->a17;\n    } else if constexpr (CBIndex == 18) {\n      cb = args->a18;\n    } else if constexpr (CBIndex == 23) {\n      cb = args->a23;\n    }\n\n    // This is almost the same type as \"Result func(Args..., uintptr_t)\", but\n    // individual types annotated as passthrough are wrapped in guest_layout<>\n    auto callback = reinterpret_cast<as_guest_layout_if<RetAnnotations.is_passthrough, Result, Result> (*)(\n      as_guest_layout_if<Annotations.is_passthrough, Args, GuestArgs>..., uintptr_t)>(cb);\n\n    auto f = [&callback](guest_layout<GuestArgs>... args, uintptr_t target) {\n      // Fold over each of Annotations, Args, and args. This will match up the elements in triplets.\n      if constexpr (std::is_void_v<Result>) {\n        callback(Projection<Annotations, Args>(args)..., target);\n      } else if constexpr (!RetAnnotations.is_passthrough) {\n        return (guest_layout<Result>)to_guest(to_host_layout(callback(Projection<Annotations, Args>(args)..., target)));\n      } else {\n        return callback(Projection<Annotations, Args>(args)..., target);\n      }\n    };\n    Invoke(f, *args);\n  }\n};\n\ntemplate<typename FuncType>\nvoid MakeHostTrampolineForGuestFunctionAt(uintptr_t GuestTarget, uintptr_t GuestUnpacker, FuncType** Func) {\n  *Func = (FuncType*)FEX::HLE::MakeHostTrampolineForGuestFunction((void*)&CallbackUnpack<FuncType>::CallGuestPtr, GuestTarget, GuestUnpacker);\n}\n\ntemplate<typename F>\nvoid FinalizeHostTrampolineForGuestFunction(F* PreallocatedTrampolineForGuestFunction) {\n  FEX::HLE::FinalizeHostTrampolineForGuestFunction((FEX::HLE::HostToGuestTrampolinePtr*)PreallocatedTrampolineForGuestFunction,\n                                                   (void*)&CallbackUnpack<F>::CallGuestPtr);\n}\n\ntemplate<typename F>\nvoid FinalizeHostTrampolineForGuestFunction(guest_layout<F*> PreallocatedTrampolineForGuestFunction) {\n  FEX::HLE::FinalizeHostTrampolineForGuestFunction((FEX::HLE::HostToGuestTrampolinePtr*)PreallocatedTrampolineForGuestFunction.data,\n                                                   (void*)&CallbackUnpack<F>::CallGuestPtr);\n}\n\n// In the case of the thunk host_loader being the default, FEX need to use dlsym with RTLD_DEFAULT.\n// If FEX queried the symbol object directly then it wouldn't follow symbol overriding rules.\n//\n// Common usecase is LD_PRELOAD with a library that defines some symbols.\n// And then programs and libraries will pick up the preloaded symbols.\n// ex: MangoHud overrides GLX and EGL symbols.\ninline void* dlsym_default(void* handle, const char* symbol) {\n  return dlsym(RTLD_DEFAULT, symbol);\n}\n"
  },
  {
    "path": "ThunkLibs/include/common/PackedArguments.h",
    "content": "#pragma once\n\n#include <cstdint>\n#include <type_traits>\n#include <utility>\n\ntemplate<typename Result, typename... Args>\nstruct __attribute__((packed)) PackedArguments;\n\ntemplate<typename R>\nstruct __attribute__((packed)) PackedArguments<R> {\n  R rv;\n};\ntemplate<typename R, typename A0>\nstruct __attribute__((packed)) PackedArguments<R, A0> {\n  A0 a0;\n  R rv;\n};\ntemplate<typename R, typename A0, typename A1>\nstruct __attribute__((packed)) PackedArguments<R, A0, A1> {\n  A0 a0;\n  A1 a1;\n  R rv;\n};\ntemplate<typename R, typename A0, typename A1, typename A2>\nstruct __attribute__((packed)) PackedArguments<R, A0, A1, A2> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  R rv;\n};\ntemplate<typename R, typename A0, typename A1, typename A2, typename A3>\nstruct __attribute__((packed)) PackedArguments<R, A0, A1, A2, A3> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  R rv;\n};\ntemplate<typename R, typename A0, typename A1, typename A2, typename A3, typename A4>\nstruct __attribute__((packed)) PackedArguments<R, A0, A1, A2, A3, A4> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  R rv;\n};\ntemplate<typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>\nstruct __attribute__((packed)) PackedArguments<R, A0, A1, A2, A3, A4, A5> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  R rv;\n};\ntemplate<typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>\nstruct __attribute__((packed)) PackedArguments<R, A0, A1, A2, A3, A4, A5, A6> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  R rv;\n};\ntemplate<typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>\nstruct __attribute__((packed)) PackedArguments<R, A0, A1, A2, A3, A4, A5, A6, A7> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  R rv;\n};\ntemplate<typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>\nstruct __attribute__((packed)) PackedArguments<R, A0, A1, A2, A3, A4, A5, A6, A7, A8> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  R rv;\n};\ntemplate<typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>\nstruct __attribute__((packed)) PackedArguments<R, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  R rv;\n};\ntemplate<typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>\nstruct __attribute__((packed)) PackedArguments<R, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n  R rv;\n};\ntemplate<typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8,\n         typename A9, typename A10, typename A11>\nstruct __attribute__((packed)) PackedArguments<R, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n  A11 a11;\n  R rv;\n};\ntemplate<typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8,\n         typename A9, typename A10, typename A11, typename A12>\nstruct __attribute__((packed)) PackedArguments<R, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n  A11 a11;\n  A12 a12;\n  R rv;\n};\ntemplate<typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8,\n         typename A9, typename A10, typename A11, typename A12, typename A13>\nstruct __attribute__((packed)) PackedArguments<R, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n  A11 a11;\n  A12 a12;\n  A13 a13;\n  R rv;\n};\ntemplate<typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8,\n         typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>\nstruct __attribute__((packed)) PackedArguments<R, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n  A11 a11;\n  A12 a12;\n  A13 a13;\n  A14 a14;\n  R rv;\n};\n\ntemplate<typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8,\n         typename A9, typename A10, typename A11, typename A12, typename A13, typename A14, typename A15, typename A16, typename A17,\n         typename A18, typename A19, typename A20, typename A21, typename A22>\nstruct __attribute__((\n  packed)) PackedArguments<R, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n  A11 a11;\n  A12 a12;\n  A13 a13;\n  A14 a14;\n  A15 a15;\n  A16 a16;\n  A17 a17;\n  A18 a18;\n  A19 a19;\n  A20 a20;\n  A21 a21;\n  A22 a22;\n  R rv;\n};\n\ntemplate<typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8,\n         typename A9, typename A10, typename A11, typename A12, typename A13, typename A14, typename A15, typename A16, typename A17,\n         typename A18, typename A19, typename A20, typename A21, typename A22, typename A23>\nstruct __attribute__((\n  packed)) PackedArguments<R, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n  A11 a11;\n  A12 a12;\n  A13 a13;\n  A14 a14;\n  A15 a15;\n  A16 a16;\n  A17 a17;\n  A18 a18;\n  A19 a19;\n  A20 a20;\n  A21 a21;\n  A22 a22;\n  A23 a23;\n  R rv;\n};\n\ntemplate<>\nstruct __attribute__((packed)) PackedArguments<void> {};\ntemplate<typename A0>\nstruct __attribute__((packed)) PackedArguments<void, A0> {\n  A0 a0;\n};\ntemplate<typename A0, typename A1>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1> {\n  A0 a0;\n  A1 a1;\n};\ntemplate<typename A0, typename A1, typename A2>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3, typename A4>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3, A4> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3, A4, A5> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3, A4, A5, A6> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3, A4, A5, A6, A7> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3, A4, A5, A6, A7, A8> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n  A11 a11;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9,\n         typename A10, typename A11, typename A12>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n  A11 a11;\n  A12 a12;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9,\n         typename A10, typename A11, typename A12, typename A13>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n  A11 a11;\n  A12 a12;\n  A13 a13;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9,\n         typename A10, typename A11, typename A12, typename A13, typename A14>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n  A11 a11;\n  A12 a12;\n  A13 a13;\n  A14 a14;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9,\n         typename A10, typename A11, typename A12, typename A13, typename A14, typename A15>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n  A11 a11;\n  A12 a12;\n  A13 a13;\n  A14 a14;\n  A15 a15;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9,\n         typename A10, typename A11, typename A12, typename A13, typename A14, typename A15, typename A16>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n  A11 a11;\n  A12 a12;\n  A13 a13;\n  A14 a14;\n  A15 a15;\n  A16 a16;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9,\n         typename A10, typename A11, typename A12, typename A13, typename A14, typename A15, typename A16, typename A17>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n  A11 a11;\n  A12 a12;\n  A13 a13;\n  A14 a14;\n  A15 a15;\n  A16 a16;\n  A17 a17;\n};\ntemplate<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9,\n         typename A10, typename A11, typename A12, typename A13, typename A14, typename A15, typename A16, typename A17, typename A18>\nstruct __attribute__((packed)) PackedArguments<void, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18> {\n  A0 a0;\n  A1 a1;\n  A2 a2;\n  A3 a3;\n  A4 a4;\n  A5 a5;\n  A6 a6;\n  A7 a7;\n  A8 a8;\n  A9 a9;\n  A10 a10;\n  A11 a11;\n  A12 a12;\n  A13 a13;\n  A14 a14;\n  A15 a15;\n  A16 a16;\n  A17 a17;\n  A18 a18;\n};\n\n// Helper struct that allows assigning the result of a function to a variable, even if that result is a void type.\n//\n// For non-void result types, the overloaded the comma operator will always returns its left argument.\n// For void types, the overloaded comma operator is *not* used. Instead, a dummy object is returned.\nstruct Regularize {};\ntemplate<typename T>\nT&& operator,(T&& t, Regularize) {\n  return std::forward<T>(t);\n}\n\ntemplate<typename Result, typename... Args, typename Func>\nvoid Invoke(Func&& func, PackedArguments<Result, Args...>& args) requires (std::is_invocable_r_v<Result, Func, Args...>)\n{\n  constexpr auto NumArgs = sizeof...(Args);\n  static_assert(NumArgs <= 19 || NumArgs == 24);\n\n  std::conditional_t<std::is_void_v<Result>, Regularize, Result> rv;\n  if constexpr (NumArgs == 0) {\n    rv = (func(), Regularize {});\n  } else if constexpr (NumArgs == 1) {\n    rv = (func(args.a0), Regularize {});\n  } else if constexpr (NumArgs == 2) {\n    rv = (func(args.a0, args.a1), Regularize {});\n  } else if constexpr (NumArgs == 3) {\n    rv = (func(args.a0, args.a1, args.a2), Regularize {});\n  } else if constexpr (NumArgs == 4) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3), Regularize {});\n  } else if constexpr (NumArgs == 5) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4), Regularize {});\n  } else if constexpr (NumArgs == 6) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4, args.a5), Regularize {});\n  } else if constexpr (NumArgs == 7) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6), Regularize {});\n  } else if constexpr (NumArgs == 8) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6, args.a7), Regularize {});\n  } else if constexpr (NumArgs == 9) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6, args.a7, args.a8), Regularize {});\n  } else if constexpr (NumArgs == 10) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6, args.a7, args.a8, args.a9), Regularize {});\n  } else if constexpr (NumArgs == 11) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6, args.a7, args.a8, args.a9, args.a10), Regularize {});\n  } else if constexpr (NumArgs == 12) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6, args.a7, args.a8, args.a9, args.a10, args.a11), Regularize {});\n  } else if constexpr (NumArgs == 13) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6, args.a7, args.a8, args.a9, args.a10, args.a11, args.a12),\n          Regularize {});\n  } else if constexpr (NumArgs == 14) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6, args.a7, args.a8, args.a9, args.a10, args.a11, args.a12, args.a13),\n          Regularize {});\n  } else if constexpr (NumArgs == 15) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6, args.a7, args.a8, args.a9, args.a10, args.a11, args.a12,\n               args.a13, args.a14),\n          Regularize {});\n  } else if constexpr (NumArgs == 16) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6, args.a7, args.a8, args.a9, args.a10, args.a11, args.a12,\n               args.a13, args.a14, args.a15),\n          Regularize {});\n  } else if constexpr (NumArgs == 17) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6, args.a7, args.a8, args.a9, args.a10, args.a11, args.a12,\n               args.a13, args.a14, args.a15, args.a16),\n          Regularize {});\n  } else if constexpr (NumArgs == 18) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6, args.a7, args.a8, args.a9, args.a10, args.a11, args.a12,\n               args.a13, args.a14, args.a15, args.a16, args.a17),\n          Regularize {});\n  } else if constexpr (NumArgs == 19) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6, args.a7, args.a8, args.a9, args.a10, args.a11, args.a12,\n               args.a13, args.a14, args.a15, args.a16, args.a17, args.a18),\n          Regularize {});\n  } else if constexpr (NumArgs == 24) {\n    rv = (func(args.a0, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6, args.a7, args.a8, args.a9, args.a10, args.a11, args.a12,\n               args.a13, args.a14, args.a15, args.a16, args.a17, args.a18, args.a19, args.a20, args.a21, args.a22, args.a23),\n          Regularize {});\n  }\n\n  if constexpr (!std::is_void_v<Result>) {\n    args.rv = rv;\n  }\n}\n"
  },
  {
    "path": "ThunkLibs/include/common/X11Manager.h",
    "content": "#include \"Host.h\"\n\n#include <cstdio>\n#include <cstdlib>\n#include <cstdint>\n#include <dlfcn.h>\n#include <mutex>\n#include <unordered_map>\n\n#include <X11/Xlib.h>\n#include <xcb/xcb.h>\n\n#ifdef IS_32BIT_THUNK\nusing guest_long = int32_t;\nusing guest_size_t = int32_t;\n#else\nusing guest_long = long;\nusing guest_size_t = size_t;\n#endif\n\n/**\n * Guest X11 displays and xcb connections can't be used by the host, so\n * instead an intermediary object is created and mapped to the original\n * guest display/connection.\n */\nstruct X11Manager {\n  std::mutex mutex;\n\n  // Maps guest connection to intermediary host connection\n  std::unordered_map<xcb_connection_t*, xcb_connection_t*> connections;\n\n  xcb_connection_t* GuestToHostConnection(xcb_connection_t* GuestConnection) {\n    std::unique_lock lock(mutex);\n    auto [it, inserted] = connections.emplace(GuestConnection, nullptr);\n    if (inserted) {\n      // NOTE: There's no easy way to query the display name from the guest, so just connect to the default display.\n      static void* libxcb = dlopen(\"libxcb.so.1\", RTLD_LAZY);\n      static auto ptr_xcb_connect = (decltype(&xcb_connect))dlsym(libxcb, \"xcb_connect\");\n      static auto ptr_xcb_connection_has_error = (decltype(&xcb_connection_has_error))dlsym(libxcb, \"xcb_connection_has_error\");\n      it->second = ptr_xcb_connect(nullptr, nullptr);\n      if (ptr_xcb_connection_has_error(it->second)) {\n        fprintf(stderr, \"ERROR: Could not open xcb connection\\n\");\n        std::abort();\n      }\n    }\n    return it->second;\n  }\n\n  // Maps guest display to intermediary host display\n  std::unordered_map<_XDisplay*, _XDisplay*> displays;\n\n  _XDisplay* GuestToHostDisplay(_XDisplay* GuestDisplay) {\n    // Flush event queue to make effects of the guest-side connection visible\n    GuestXSync(GuestDisplay, 0);\n\n    std::unique_lock lock(mutex);\n    auto [it, inserted] = displays.emplace(GuestDisplay, nullptr);\n    if (inserted) {\n      auto host_display = HostXOpenDisplay(GuestXDisplayString(GuestDisplay));\n      fprintf(stderr, \"Opening host-side X11 display: %p -> %p\\n\", GuestDisplay, host_display);\n      if (!host_display) {\n        fprintf(stderr, \"ERROR: Could not open X display\\n\");\n        std::abort();\n      } else {\n        it->second = host_display;\n      }\n    }\n    return it->second;\n  }\n\n  guest_layout<_XDisplay*> HostToGuestDisplay(const _XDisplay* from) {\n    if (from == nullptr) {\n      return {.data = 0};\n    }\n\n    std::unique_lock lock(mutex);\n    for (auto& [guest, host] : displays) {\n      if (host == from) {\n        guest_layout<_XDisplay*> ret;\n        ret.data = reinterpret_cast<uintptr_t>(guest);\n        return ret;\n      }\n    }\n\n    fprintf(stderr, \"ERROR: Could not map host display %p back to guest\\n\", from);\n    std::abort();\n  }\n\n  static void* GetLibX11() {\n    static void* libx11 = dlopen(\"libX11.so.6\", RTLD_LAZY);\n    return libx11;\n  }\n\n  static int HostXFree(void* Ptr) {\n    static auto func = reinterpret_cast<decltype(&XFree)>(dlsym(GetLibX11(), \"XFree\"));\n    return func(Ptr);\n  }\n\n  static int HostXFlush(Display* Dis) {\n    static auto func = reinterpret_cast<decltype(&XFlush)>(dlsym(GetLibX11(), \"XFlush\"));\n    return func(Dis);\n  }\n\n  static Display* HostXOpenDisplay(const char* Name) {\n    static auto func = reinterpret_cast<decltype(&XOpenDisplay)>(dlsym(GetLibX11(), \"XOpenDisplay\"));\n    return func(Name);\n  }\n\n  static XVisualInfo* HostXGetVisualInfo(Display* a, long b, XVisualInfo* c, int* d) {\n    static auto func = reinterpret_cast<decltype(&XGetVisualInfo)>(dlsym(GetLibX11(), \"XGetVisualInfo\"));\n    return func(a, b, c, d);\n  }\n\n  // NOTE: Struct pointers are replaced by void* to avoid involving data layout conversion here.\n  int (*GuestXSync)(void*, int) = nullptr;\n  void* (*GuestXGetVisualInfo)(void*, guest_long, void*, int*) = nullptr;\n\n  // XDisplayString internally just reads data from _XDisplay's internal struct definition.\n  // This breaks when data layout is different, so allow reading from a guest context instead.\n  char* (*GuestXDisplayString)(void*) = nullptr;\n};\n"
  },
  {
    "path": "ThunkLibs/libEGL/libEGL_Guest.cpp",
    "content": "/*\n$info$\ntags: thunklibs|EGL\ndesc: Depends on glXGetProcAddress thunk\n$end_info$\n*/\n\n#include <GL/glx.h>\n#include <EGL/egl.h>\n\n#include <stdio.h>\n#include <cstring>\n\n#include \"common/Guest.h\"\n\n#include \"thunkgen_guest_libEGL.inl\"\n\ntypedef void voidFunc();\n\n\nextern \"C\" {\nvoidFunc* eglGetProcAddress(const char* procname) {\n  // TODO: Fix this HACK\n  return glXGetProcAddress((const GLubyte*)procname);\n}\n}\n\nLOAD_LIB(libEGL)\n"
  },
  {
    "path": "ThunkLibs/libEGL/libEGL_Host.cpp",
    "content": "/*\n$info$\ntags: thunklibs|EGL\n$end_info$\n*/\n\n#include <cstdio>\n#include <dlfcn.h>\n\n#include <EGL/egl.h>\n\n#include \"common/Host.h\"\n#include <dlfcn.h>\n\n#include \"thunkgen_host_libEGL.inl\"\n\nEXPORTS(libEGL)\n"
  },
  {
    "path": "ThunkLibs/libEGL/libEGL_interface.cpp",
    "content": "#include <common/GeneratorInterface.h>\n\n#include <EGL/egl.h>\n\ntemplate<auto>\nstruct fex_gen_config {\n  unsigned version = 1;\n};\n\n// Function, parameter index, parameter type [optional]\ntemplate<auto, int, typename = void>\nstruct fex_gen_param {};\n\ntemplate<>\nstruct fex_gen_config<eglBindAPI> {};\ntemplate<>\nstruct fex_gen_config<eglChooseConfig> {};\ntemplate<>\nstruct fex_gen_config<eglDestroyContext> {};\ntemplate<>\nstruct fex_gen_config<eglDestroySurface> {};\ntemplate<>\nstruct fex_gen_config<eglInitialize> {};\ntemplate<>\nstruct fex_gen_config<eglMakeCurrent> {};\ntemplate<>\nstruct fex_gen_config<eglQuerySurface> {};\ntemplate<>\nstruct fex_gen_config<eglSurfaceAttrib> {};\ntemplate<>\nstruct fex_gen_config<eglSwapBuffers> {};\ntemplate<>\nstruct fex_gen_config<eglTerminate> {};\ntemplate<>\nstruct fex_gen_config<eglGetError> {};\ntemplate<>\nstruct fex_gen_config<eglCreateContext> {};\ntemplate<>\nstruct fex_gen_config<eglCreateWindowSurface> {};\ntemplate<>\nstruct fex_gen_config<eglGetCurrentContext> {};\ntemplate<>\nstruct fex_gen_config<eglGetCurrentDisplay> {};\ntemplate<>\nstruct fex_gen_config<eglGetCurrentSurface> {};\n\n// EGLNativeDisplayType is a pointer to opaque data (wl_display/(X)Display/...)\ntemplate<>\nstruct fex_gen_config<eglGetDisplay> {};\ntemplate<>\nstruct fex_gen_param<eglGetDisplay, 0, EGLNativeDisplayType> : fexgen::assume_compatible_data_layout {};\n"
  },
  {
    "path": "ThunkLibs/libGL/glcorearb.h",
    "content": "#ifndef __gl_glcorearb_h_\n#define __gl_glcorearb_h_ 1\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n** Copyright (c) 2013-2018 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and/or associated documentation files (the\n** \"Materials\"), to deal in the Materials without restriction, including\n** without limitation the rights to use, copy, modify, merge, publish,\n** distribute, sublicense, and/or sell copies of the Materials, and to\n** permit persons to whom the Materials are furnished to do so, subject to\n** the following conditions:\n**\n** The above copyright notice and this permission notice shall be included\n** in all copies or substantial portions of the Materials.\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n*/\n/*\n** This header is generated from the Khronos OpenGL / OpenGL ES XML\n** API Registry. The current version of the Registry, generator scripts\n** used to make the header, and the header can be found at\n**   https://github.com/KhronosGroup/OpenGL-Registry\n*/\n\n#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN 1\n#endif\n#include <windows.h>\n#endif\n\n#ifndef APIENTRY\n#define APIENTRY\n#endif\n#ifndef APIENTRYP\n#define APIENTRYP APIENTRY*\n#endif\n#ifndef GLAPI\n#define GLAPI extern\n#endif\n\n/* glcorearb.h is for use with OpenGL core profile implementations.\n** It should should be placed in the same directory as gl.h and\n** included as <GL/glcorearb.h>.\n**\n** glcorearb.h includes only APIs in the latest OpenGL core profile\n** implementation together with APIs in newer ARB extensions which\n** can be supported by the core profile. It does not, and never will\n** include functionality removed from the core profile, such as\n** fixed-function vertex and fragment processing.\n**\n** Do not #include both <GL/glcorearb.h> and either of <GL/gl.h> or\n** <GL/glext.h> in the same source file.\n*/\n\n/* Generated C header for:\n * API: gl\n * Profile: core\n * Versions considered: .*\n * Versions emitted: .*\n * Default extensions included: glcore\n * Additional extensions included: _nomatch_^\n * Extensions removed: _nomatch_^\n */\n\n#ifndef GL_VERSION_1_0\n#define GL_VERSION_1_0 1\ntypedef void GLvoid;\ntypedef unsigned int GLenum;\n#include <KHR/khrplatform.h>\ntypedef khronos_float_t GLfloat;\ntypedef int GLint;\ntypedef int GLsizei;\ntypedef unsigned int GLbitfield;\ntypedef double GLdouble;\ntypedef unsigned int GLuint;\ntypedef unsigned char GLboolean;\ntypedef khronos_uint8_t GLubyte;\n#define GL_DEPTH_BUFFER_BIT 0x00000100\n#define GL_STENCIL_BUFFER_BIT 0x00000400\n#define GL_COLOR_BUFFER_BIT 0x00004000\n#define GL_FALSE 0\n#define GL_TRUE 1\n#define GL_POINTS 0x0000\n#define GL_LINES 0x0001\n#define GL_LINE_LOOP 0x0002\n#define GL_LINE_STRIP 0x0003\n#define GL_TRIANGLES 0x0004\n#define GL_TRIANGLE_STRIP 0x0005\n#define GL_TRIANGLE_FAN 0x0006\n#define GL_QUADS 0x0007\n#define GL_NEVER 0x0200\n#define GL_LESS 0x0201\n#define GL_EQUAL 0x0202\n#define GL_LEQUAL 0x0203\n#define GL_GREATER 0x0204\n#define GL_NOTEQUAL 0x0205\n#define GL_GEQUAL 0x0206\n#define GL_ALWAYS 0x0207\n#define GL_ZERO 0\n#define GL_ONE 1\n#define GL_SRC_COLOR 0x0300\n#define GL_ONE_MINUS_SRC_COLOR 0x0301\n#define GL_SRC_ALPHA 0x0302\n#define GL_ONE_MINUS_SRC_ALPHA 0x0303\n#define GL_DST_ALPHA 0x0304\n#define GL_ONE_MINUS_DST_ALPHA 0x0305\n#define GL_DST_COLOR 0x0306\n#define GL_ONE_MINUS_DST_COLOR 0x0307\n#define GL_SRC_ALPHA_SATURATE 0x0308\n#define GL_NONE 0\n#define GL_FRONT_LEFT 0x0400\n#define GL_FRONT_RIGHT 0x0401\n#define GL_BACK_LEFT 0x0402\n#define GL_BACK_RIGHT 0x0403\n#define GL_FRONT 0x0404\n#define GL_BACK 0x0405\n#define GL_LEFT 0x0406\n#define GL_RIGHT 0x0407\n#define GL_FRONT_AND_BACK 0x0408\n#define GL_NO_ERROR 0\n#define GL_INVALID_ENUM 0x0500\n#define GL_INVALID_VALUE 0x0501\n#define GL_INVALID_OPERATION 0x0502\n#define GL_OUT_OF_MEMORY 0x0505\n#define GL_CW 0x0900\n#define GL_CCW 0x0901\n#define GL_POINT_SIZE 0x0B11\n#define GL_POINT_SIZE_RANGE 0x0B12\n#define GL_POINT_SIZE_GRANULARITY 0x0B13\n#define GL_LINE_SMOOTH 0x0B20\n#define GL_LINE_WIDTH 0x0B21\n#define GL_LINE_WIDTH_RANGE 0x0B22\n#define GL_LINE_WIDTH_GRANULARITY 0x0B23\n#define GL_POLYGON_MODE 0x0B40\n#define GL_POLYGON_SMOOTH 0x0B41\n#define GL_CULL_FACE 0x0B44\n#define GL_CULL_FACE_MODE 0x0B45\n#define GL_FRONT_FACE 0x0B46\n#define GL_DEPTH_RANGE 0x0B70\n#define GL_DEPTH_TEST 0x0B71\n#define GL_DEPTH_WRITEMASK 0x0B72\n#define GL_DEPTH_CLEAR_VALUE 0x0B73\n#define GL_DEPTH_FUNC 0x0B74\n#define GL_STENCIL_TEST 0x0B90\n#define GL_STENCIL_CLEAR_VALUE 0x0B91\n#define GL_STENCIL_FUNC 0x0B92\n#define GL_STENCIL_VALUE_MASK 0x0B93\n#define GL_STENCIL_FAIL 0x0B94\n#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95\n#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96\n#define GL_STENCIL_REF 0x0B97\n#define GL_STENCIL_WRITEMASK 0x0B98\n#define GL_VIEWPORT 0x0BA2\n#define GL_DITHER 0x0BD0\n#define GL_BLEND_DST 0x0BE0\n#define GL_BLEND_SRC 0x0BE1\n#define GL_BLEND 0x0BE2\n#define GL_LOGIC_OP_MODE 0x0BF0\n#define GL_DRAW_BUFFER 0x0C01\n#define GL_READ_BUFFER 0x0C02\n#define GL_SCISSOR_BOX 0x0C10\n#define GL_SCISSOR_TEST 0x0C11\n#define GL_COLOR_CLEAR_VALUE 0x0C22\n#define GL_COLOR_WRITEMASK 0x0C23\n#define GL_DOUBLEBUFFER 0x0C32\n#define GL_STEREO 0x0C33\n#define GL_LINE_SMOOTH_HINT 0x0C52\n#define GL_POLYGON_SMOOTH_HINT 0x0C53\n#define GL_UNPACK_SWAP_BYTES 0x0CF0\n#define GL_UNPACK_LSB_FIRST 0x0CF1\n#define GL_UNPACK_ROW_LENGTH 0x0CF2\n#define GL_UNPACK_SKIP_ROWS 0x0CF3\n#define GL_UNPACK_SKIP_PIXELS 0x0CF4\n#define GL_UNPACK_ALIGNMENT 0x0CF5\n#define GL_PACK_SWAP_BYTES 0x0D00\n#define GL_PACK_LSB_FIRST 0x0D01\n#define GL_PACK_ROW_LENGTH 0x0D02\n#define GL_PACK_SKIP_ROWS 0x0D03\n#define GL_PACK_SKIP_PIXELS 0x0D04\n#define GL_PACK_ALIGNMENT 0x0D05\n#define GL_MAX_TEXTURE_SIZE 0x0D33\n#define GL_MAX_VIEWPORT_DIMS 0x0D3A\n#define GL_SUBPIXEL_BITS 0x0D50\n#define GL_TEXTURE_1D 0x0DE0\n#define GL_TEXTURE_2D 0x0DE1\n#define GL_TEXTURE_WIDTH 0x1000\n#define GL_TEXTURE_HEIGHT 0x1001\n#define GL_TEXTURE_BORDER_COLOR 0x1004\n#define GL_DONT_CARE 0x1100\n#define GL_FASTEST 0x1101\n#define GL_NICEST 0x1102\n#define GL_BYTE 0x1400\n#define GL_UNSIGNED_BYTE 0x1401\n#define GL_SHORT 0x1402\n#define GL_UNSIGNED_SHORT 0x1403\n#define GL_INT 0x1404\n#define GL_UNSIGNED_INT 0x1405\n#define GL_FLOAT 0x1406\n#define GL_STACK_OVERFLOW 0x0503\n#define GL_STACK_UNDERFLOW 0x0504\n#define GL_CLEAR 0x1500\n#define GL_AND 0x1501\n#define GL_AND_REVERSE 0x1502\n#define GL_COPY 0x1503\n#define GL_AND_INVERTED 0x1504\n#define GL_NOOP 0x1505\n#define GL_XOR 0x1506\n#define GL_OR 0x1507\n#define GL_NOR 0x1508\n#define GL_EQUIV 0x1509\n#define GL_INVERT 0x150A\n#define GL_OR_REVERSE 0x150B\n#define GL_COPY_INVERTED 0x150C\n#define GL_OR_INVERTED 0x150D\n#define GL_NAND 0x150E\n#define GL_SET 0x150F\n#define GL_TEXTURE 0x1702\n#define GL_COLOR 0x1800\n#define GL_DEPTH 0x1801\n#define GL_STENCIL 0x1802\n#define GL_STENCIL_INDEX 0x1901\n#define GL_DEPTH_COMPONENT 0x1902\n#define GL_RED 0x1903\n#define GL_GREEN 0x1904\n#define GL_BLUE 0x1905\n#define GL_ALPHA 0x1906\n#define GL_RGB 0x1907\n#define GL_RGBA 0x1908\n#define GL_POINT 0x1B00\n#define GL_LINE 0x1B01\n#define GL_FILL 0x1B02\n#define GL_KEEP 0x1E00\n#define GL_REPLACE 0x1E01\n#define GL_INCR 0x1E02\n#define GL_DECR 0x1E03\n#define GL_VENDOR 0x1F00\n#define GL_RENDERER 0x1F01\n#define GL_VERSION 0x1F02\n#define GL_EXTENSIONS 0x1F03\n#define GL_NEAREST 0x2600\n#define GL_LINEAR 0x2601\n#define GL_NEAREST_MIPMAP_NEAREST 0x2700\n#define GL_LINEAR_MIPMAP_NEAREST 0x2701\n#define GL_NEAREST_MIPMAP_LINEAR 0x2702\n#define GL_LINEAR_MIPMAP_LINEAR 0x2703\n#define GL_TEXTURE_MAG_FILTER 0x2800\n#define GL_TEXTURE_MIN_FILTER 0x2801\n#define GL_TEXTURE_WRAP_S 0x2802\n#define GL_TEXTURE_WRAP_T 0x2803\n#define GL_REPEAT 0x2901\ntypedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode);\ntypedef void(APIENTRYP PFNGLFRONTFACEPROC)(GLenum mode);\ntypedef void(APIENTRYP PFNGLHINTPROC)(GLenum target, GLenum mode);\ntypedef void(APIENTRYP PFNGLLINEWIDTHPROC)(GLfloat width);\ntypedef void(APIENTRYP PFNGLPOINTSIZEPROC)(GLfloat size);\ntypedef void(APIENTRYP PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode);\ntypedef void(APIENTRYP PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param);\ntypedef void(APIENTRYP PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat* params);\ntypedef void(APIENTRYP PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param);\ntypedef void(APIENTRYP PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint* params);\ntypedef void(APIENTRYP PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format,\n                                            GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border,\n                                            GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLDRAWBUFFERPROC)(GLenum buf);\ntypedef void(APIENTRYP PFNGLCLEARPROC)(GLbitfield mask);\ntypedef void(APIENTRYP PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\ntypedef void(APIENTRYP PFNGLCLEARSTENCILPROC)(GLint s);\ntypedef void(APIENTRYP PFNGLCLEARDEPTHPROC)(GLdouble depth);\ntypedef void(APIENTRYP PFNGLSTENCILMASKPROC)(GLuint mask);\ntypedef void(APIENTRYP PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);\ntypedef void(APIENTRYP PFNGLDEPTHMASKPROC)(GLboolean flag);\ntypedef void(APIENTRYP PFNGLDISABLEPROC)(GLenum cap);\ntypedef void(APIENTRYP PFNGLENABLEPROC)(GLenum cap);\ntypedef void(APIENTRYP PFNGLFINISHPROC)(void);\ntypedef void(APIENTRYP PFNGLFLUSHPROC)(void);\ntypedef void(APIENTRYP PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor);\ntypedef void(APIENTRYP PFNGLLOGICOPPROC)(GLenum opcode);\ntypedef void(APIENTRYP PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask);\ntypedef void(APIENTRYP PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass);\ntypedef void(APIENTRYP PFNGLDEPTHFUNCPROC)(GLenum func);\ntypedef void(APIENTRYP PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param);\ntypedef void(APIENTRYP PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param);\ntypedef void(APIENTRYP PFNGLREADBUFFERPROC)(GLenum src);\ntypedef void(APIENTRYP PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);\ntypedef void(APIENTRYP PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean* data);\ntypedef void(APIENTRYP PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble* data);\ntypedef GLenum(APIENTRYP PFNGLGETERRORPROC)(void);\ntypedef void(APIENTRYP PFNGLGETFLOATVPROC)(GLenum pname, GLfloat* data);\ntypedef void(APIENTRYP PFNGLGETINTEGERVPROC)(GLenum pname, GLint* data);\ntypedef const GLubyte*(APIENTRYP PFNGLGETSTRINGPROC)(GLenum name);\ntypedef void(APIENTRYP PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void* pixels);\ntypedef void(APIENTRYP PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint* params);\ntypedef GLboolean(APIENTRYP PFNGLISENABLEDPROC)(GLenum cap);\ntypedef void(APIENTRYP PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f);\ntypedef void(APIENTRYP PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glCullFace(GLenum mode);\nGLAPI void APIENTRY glFrontFace(GLenum mode);\nGLAPI void APIENTRY glHint(GLenum target, GLenum mode);\nGLAPI void APIENTRY glLineWidth(GLfloat width);\nGLAPI void APIENTRY glPointSize(GLfloat size);\nGLAPI void APIENTRY glPolygonMode(GLenum face, GLenum mode);\nGLAPI void APIENTRY glScissor(GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glTexParameterf(GLenum target, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params);\nGLAPI void APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param);\nGLAPI void APIENTRY glTexParameteriv(GLenum target, GLenum pname, const GLint* params);\nGLAPI void APIENTRY glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type,\n                                 const void* pixels);\nGLAPI void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border,\n                                 GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glDrawBuffer(GLenum buf);\nGLAPI void APIENTRY glClear(GLbitfield mask);\nGLAPI void APIENTRY glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\nGLAPI void APIENTRY glClearStencil(GLint s);\nGLAPI void APIENTRY glClearDepth(GLdouble depth);\nGLAPI void APIENTRY glStencilMask(GLuint mask);\nGLAPI void APIENTRY glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);\nGLAPI void APIENTRY glDepthMask(GLboolean flag);\nGLAPI void APIENTRY glDisable(GLenum cap);\nGLAPI void APIENTRY glEnable(GLenum cap);\nGLAPI void APIENTRY glFinish(void);\nGLAPI void APIENTRY glFlush(void);\nGLAPI void APIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor);\nGLAPI void APIENTRY glLogicOp(GLenum opcode);\nGLAPI void APIENTRY glStencilFunc(GLenum func, GLint ref, GLuint mask);\nGLAPI void APIENTRY glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);\nGLAPI void APIENTRY glDepthFunc(GLenum func);\nGLAPI void APIENTRY glPixelStoref(GLenum pname, GLfloat param);\nGLAPI void APIENTRY glPixelStorei(GLenum pname, GLint param);\nGLAPI void APIENTRY glReadBuffer(GLenum src);\nGLAPI void APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);\nGLAPI void APIENTRY glGetBooleanv(GLenum pname, GLboolean* data);\nGLAPI void APIENTRY glGetDoublev(GLenum pname, GLdouble* data);\nGLAPI GLenum APIENTRY glGetError(void);\nGLAPI void APIENTRY glGetFloatv(GLenum pname, GLfloat* data);\nGLAPI void APIENTRY glGetIntegerv(GLenum pname, GLint* data);\nGLAPI const GLubyte* APIENTRY glGetString(GLenum name);\nGLAPI void APIENTRY glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void* pixels);\nGLAPI void APIENTRY glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params);\nGLAPI void APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat* params);\nGLAPI void APIENTRY glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint* params);\nGLAPI GLboolean APIENTRY glIsEnabled(GLenum cap);\nGLAPI void APIENTRY glDepthRange(GLdouble n, GLdouble f);\nGLAPI void APIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height);\n#endif\n#endif /* GL_VERSION_1_0 */\n\n#ifndef GL_VERSION_1_1\n#define GL_VERSION_1_1 1\ntypedef khronos_float_t GLclampf;\ntypedef double GLclampd;\n#define GL_COLOR_LOGIC_OP 0x0BF2\n#define GL_POLYGON_OFFSET_UNITS 0x2A00\n#define GL_POLYGON_OFFSET_POINT 0x2A01\n#define GL_POLYGON_OFFSET_LINE 0x2A02\n#define GL_POLYGON_OFFSET_FILL 0x8037\n#define GL_POLYGON_OFFSET_FACTOR 0x8038\n#define GL_TEXTURE_BINDING_1D 0x8068\n#define GL_TEXTURE_BINDING_2D 0x8069\n#define GL_TEXTURE_INTERNAL_FORMAT 0x1003\n#define GL_TEXTURE_RED_SIZE 0x805C\n#define GL_TEXTURE_GREEN_SIZE 0x805D\n#define GL_TEXTURE_BLUE_SIZE 0x805E\n#define GL_TEXTURE_ALPHA_SIZE 0x805F\n#define GL_DOUBLE 0x140A\n#define GL_PROXY_TEXTURE_1D 0x8063\n#define GL_PROXY_TEXTURE_2D 0x8064\n#define GL_R3_G3_B2 0x2A10\n#define GL_RGB4 0x804F\n#define GL_RGB5 0x8050\n#define GL_RGB8 0x8051\n#define GL_RGB10 0x8052\n#define GL_RGB12 0x8053\n#define GL_RGB16 0x8054\n#define GL_RGBA2 0x8055\n#define GL_RGBA4 0x8056\n#define GL_RGB5_A1 0x8057\n#define GL_RGBA8 0x8058\n#define GL_RGB10_A2 0x8059\n#define GL_RGBA12 0x805A\n#define GL_RGBA16 0x805B\n#define GL_VERTEX_ARRAY 0x8074\ntypedef void(APIENTRYP PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count);\ntypedef void(APIENTRYP PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void* indices);\ntypedef void(APIENTRYP PFNGLGETPOINTERVPROC)(GLenum pname, void** params);\ntypedef void(APIENTRYP PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units);\ntypedef void(APIENTRYP PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\ntypedef void(APIENTRYP PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width,\n                                                GLsizei height, GLint border);\ntypedef void(APIENTRYP PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\ntypedef void(APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y,\n                                                   GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type,\n                                               const void* pixels);\ntypedef void(APIENTRYP PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,\n                                               GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture);\ntypedef void(APIENTRYP PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint* textures);\ntypedef void(APIENTRYP PFNGLGENTEXTURESPROC)(GLsizei n, GLuint* textures);\ntypedef GLboolean(APIENTRYP PFNGLISTEXTUREPROC)(GLuint texture);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count);\nGLAPI void APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices);\nGLAPI void APIENTRY glGetPointerv(GLenum pname, void** params);\nGLAPI void APIENTRY glPolygonOffset(GLfloat factor, GLfloat units);\nGLAPI void APIENTRY glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\nGLAPI void APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height,\n                                     GLint border);\nGLAPI void APIENTRY glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\nGLAPI void APIENTRY glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format,\n                                    GLenum type, const void* pixels);\nGLAPI void APIENTRY glBindTexture(GLenum target, GLuint texture);\nGLAPI void APIENTRY glDeleteTextures(GLsizei n, const GLuint* textures);\nGLAPI void APIENTRY glGenTextures(GLsizei n, GLuint* textures);\nGLAPI GLboolean APIENTRY glIsTexture(GLuint texture);\n#endif\n#endif /* GL_VERSION_1_1 */\n\n#ifndef GL_VERSION_1_2\n#define GL_VERSION_1_2 1\n#define GL_UNSIGNED_BYTE_3_3_2 0x8032\n#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033\n#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034\n#define GL_UNSIGNED_INT_8_8_8_8 0x8035\n#define GL_UNSIGNED_INT_10_10_10_2 0x8036\n#define GL_TEXTURE_BINDING_3D 0x806A\n#define GL_PACK_SKIP_IMAGES 0x806B\n#define GL_PACK_IMAGE_HEIGHT 0x806C\n#define GL_UNPACK_SKIP_IMAGES 0x806D\n#define GL_UNPACK_IMAGE_HEIGHT 0x806E\n#define GL_TEXTURE_3D 0x806F\n#define GL_PROXY_TEXTURE_3D 0x8070\n#define GL_TEXTURE_DEPTH 0x8071\n#define GL_TEXTURE_WRAP_R 0x8072\n#define GL_MAX_3D_TEXTURE_SIZE 0x8073\n#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362\n#define GL_UNSIGNED_SHORT_5_6_5 0x8363\n#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364\n#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365\n#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366\n#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367\n#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368\n#define GL_BGR 0x80E0\n#define GL_BGRA 0x80E1\n#define GL_MAX_ELEMENTS_VERTICES 0x80E8\n#define GL_MAX_ELEMENTS_INDICES 0x80E9\n#define GL_CLAMP_TO_EDGE 0x812F\n#define GL_TEXTURE_MIN_LOD 0x813A\n#define GL_TEXTURE_MAX_LOD 0x813B\n#define GL_TEXTURE_BASE_LEVEL 0x813C\n#define GL_TEXTURE_MAX_LEVEL 0x813D\n#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12\n#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13\n#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22\n#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23\n#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E\ntypedef void(APIENTRYP PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices);\ntypedef void(APIENTRYP PFNGLTEXIMAGE3DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth,\n                                            GLint border, GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,\n                                               GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x,\n                                                   GLint y, GLsizei width, GLsizei height);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices);\nGLAPI void APIENTRY glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth,\n                                 GLint border, GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height,\n                                    GLsizei depth, GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,\n                                        GLsizei width, GLsizei height);\n#endif\n#endif /* GL_VERSION_1_2 */\n\n#ifndef GL_VERSION_1_3\n#define GL_VERSION_1_3 1\n#define GL_TEXTURE0 0x84C0\n#define GL_TEXTURE1 0x84C1\n#define GL_TEXTURE2 0x84C2\n#define GL_TEXTURE3 0x84C3\n#define GL_TEXTURE4 0x84C4\n#define GL_TEXTURE5 0x84C5\n#define GL_TEXTURE6 0x84C6\n#define GL_TEXTURE7 0x84C7\n#define GL_TEXTURE8 0x84C8\n#define GL_TEXTURE9 0x84C9\n#define GL_TEXTURE10 0x84CA\n#define GL_TEXTURE11 0x84CB\n#define GL_TEXTURE12 0x84CC\n#define GL_TEXTURE13 0x84CD\n#define GL_TEXTURE14 0x84CE\n#define GL_TEXTURE15 0x84CF\n#define GL_TEXTURE16 0x84D0\n#define GL_TEXTURE17 0x84D1\n#define GL_TEXTURE18 0x84D2\n#define GL_TEXTURE19 0x84D3\n#define GL_TEXTURE20 0x84D4\n#define GL_TEXTURE21 0x84D5\n#define GL_TEXTURE22 0x84D6\n#define GL_TEXTURE23 0x84D7\n#define GL_TEXTURE24 0x84D8\n#define GL_TEXTURE25 0x84D9\n#define GL_TEXTURE26 0x84DA\n#define GL_TEXTURE27 0x84DB\n#define GL_TEXTURE28 0x84DC\n#define GL_TEXTURE29 0x84DD\n#define GL_TEXTURE30 0x84DE\n#define GL_TEXTURE31 0x84DF\n#define GL_ACTIVE_TEXTURE 0x84E0\n#define GL_MULTISAMPLE 0x809D\n#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E\n#define GL_SAMPLE_ALPHA_TO_ONE 0x809F\n#define GL_SAMPLE_COVERAGE 0x80A0\n#define GL_SAMPLE_BUFFERS 0x80A8\n#define GL_SAMPLES 0x80A9\n#define GL_SAMPLE_COVERAGE_VALUE 0x80AA\n#define GL_SAMPLE_COVERAGE_INVERT 0x80AB\n#define GL_TEXTURE_CUBE_MAP 0x8513\n#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A\n#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B\n#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C\n#define GL_COMPRESSED_RGB 0x84ED\n#define GL_COMPRESSED_RGBA 0x84EE\n#define GL_TEXTURE_COMPRESSION_HINT 0x84EF\n#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0\n#define GL_TEXTURE_COMPRESSED 0x86A1\n#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2\n#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3\n#define GL_CLAMP_TO_BORDER 0x812D\ntypedef void(APIENTRYP PFNGLACTIVETEXTUREPROC)(GLenum texture);\ntypedef void(APIENTRYP PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,\n                                                      GLsizei depth, GLint border, GLsizei imageSize, const void* data);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,\n                                                      GLint border, GLsizei imageSize, const void* data);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border,\n                                                      GLsizei imageSize, const void* data);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,\n                                                         GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,\n                                                         GLsizei height, GLenum format, GLsizei imageSize, const void* data);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format,\n                                                         GLsizei imageSize, const void* data);\ntypedef void(APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void* img);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glActiveTexture(GLenum texture);\nGLAPI void APIENTRY glSampleCoverage(GLfloat value, GLboolean invert);\nGLAPI void APIENTRY glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,\n                                           GLint border, GLsizei imageSize, const void* data);\nGLAPI void APIENTRY glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border,\n                                           GLsizei imageSize, const void* data);\nGLAPI void APIENTRY glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border,\n                                           GLsizei imageSize, const void* data);\nGLAPI void APIENTRY glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,\n                                              GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);\nGLAPI void APIENTRY glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,\n                                              GLenum format, GLsizei imageSize, const void* data);\nGLAPI void APIENTRY glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize,\n                                              const void* data);\nGLAPI void APIENTRY glGetCompressedTexImage(GLenum target, GLint level, void* img);\n#endif\n#endif /* GL_VERSION_1_3 */\n\n#ifndef GL_VERSION_1_4\n#define GL_VERSION_1_4 1\n#define GL_BLEND_DST_RGB 0x80C8\n#define GL_BLEND_SRC_RGB 0x80C9\n#define GL_BLEND_DST_ALPHA 0x80CA\n#define GL_BLEND_SRC_ALPHA 0x80CB\n#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128\n#define GL_DEPTH_COMPONENT16 0x81A5\n#define GL_DEPTH_COMPONENT24 0x81A6\n#define GL_DEPTH_COMPONENT32 0x81A7\n#define GL_MIRRORED_REPEAT 0x8370\n#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD\n#define GL_TEXTURE_LOD_BIAS 0x8501\n#define GL_INCR_WRAP 0x8507\n#define GL_DECR_WRAP 0x8508\n#define GL_TEXTURE_DEPTH_SIZE 0x884A\n#define GL_TEXTURE_COMPARE_MODE 0x884C\n#define GL_TEXTURE_COMPARE_FUNC 0x884D\n#define GL_BLEND_COLOR 0x8005\n#define GL_BLEND_EQUATION 0x8009\n#define GL_CONSTANT_COLOR 0x8001\n#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002\n#define GL_CONSTANT_ALPHA 0x8003\n#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004\n#define GL_FUNC_ADD 0x8006\n#define GL_FUNC_REVERSE_SUBTRACT 0x800B\n#define GL_FUNC_SUBTRACT 0x800A\n#define GL_MIN 0x8007\n#define GL_MAX 0x8008\ntypedef void(APIENTRYP PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\ntypedef void(APIENTRYP PFNGLMULTIDRAWARRAYSPROC)(GLenum mode, const GLint* first, const GLsizei* count, GLsizei drawcount);\ntypedef void(APIENTRYP PFNGLMULTIDRAWELEMENTSPROC)(GLenum mode, const GLsizei* count, GLenum type, const void* const* indices, GLsizei drawcount);\ntypedef void(APIENTRYP PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param);\ntypedef void(APIENTRYP PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat* params);\ntypedef void(APIENTRYP PFNGLPOINTPARAMETERIPROC)(GLenum pname, GLint param);\ntypedef void(APIENTRYP PFNGLPOINTPARAMETERIVPROC)(GLenum pname, const GLint* params);\ntypedef void(APIENTRYP PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\ntypedef void(APIENTRYP PFNGLBLENDEQUATIONPROC)(GLenum mode);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\nGLAPI void APIENTRY glMultiDrawArrays(GLenum mode, const GLint* first, const GLsizei* count, GLsizei drawcount);\nGLAPI void APIENTRY glMultiDrawElements(GLenum mode, const GLsizei* count, GLenum type, const void* const* indices, GLsizei drawcount);\nGLAPI void APIENTRY glPointParameterf(GLenum pname, GLfloat param);\nGLAPI void APIENTRY glPointParameterfv(GLenum pname, const GLfloat* params);\nGLAPI void APIENTRY glPointParameteri(GLenum pname, GLint param);\nGLAPI void APIENTRY glPointParameteriv(GLenum pname, const GLint* params);\nGLAPI void APIENTRY glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\nGLAPI void APIENTRY glBlendEquation(GLenum mode);\n#endif\n#endif /* GL_VERSION_1_4 */\n\n#ifndef GL_VERSION_1_5\n#define GL_VERSION_1_5 1\ntypedef khronos_ssize_t GLsizeiptr;\ntypedef khronos_intptr_t GLintptr;\n#define GL_BUFFER_SIZE 0x8764\n#define GL_BUFFER_USAGE 0x8765\n#define GL_QUERY_COUNTER_BITS 0x8864\n#define GL_CURRENT_QUERY 0x8865\n#define GL_QUERY_RESULT 0x8866\n#define GL_QUERY_RESULT_AVAILABLE 0x8867\n#define GL_ARRAY_BUFFER 0x8892\n#define GL_ELEMENT_ARRAY_BUFFER 0x8893\n#define GL_ARRAY_BUFFER_BINDING 0x8894\n#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895\n#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F\n#define GL_READ_ONLY 0x88B8\n#define GL_WRITE_ONLY 0x88B9\n#define GL_READ_WRITE 0x88BA\n#define GL_BUFFER_ACCESS 0x88BB\n#define GL_BUFFER_MAPPED 0x88BC\n#define GL_BUFFER_MAP_POINTER 0x88BD\n#define GL_STREAM_DRAW 0x88E0\n#define GL_STREAM_READ 0x88E1\n#define GL_STREAM_COPY 0x88E2\n#define GL_STATIC_DRAW 0x88E4\n#define GL_STATIC_READ 0x88E5\n#define GL_STATIC_COPY 0x88E6\n#define GL_DYNAMIC_DRAW 0x88E8\n#define GL_DYNAMIC_READ 0x88E9\n#define GL_DYNAMIC_COPY 0x88EA\n#define GL_SAMPLES_PASSED 0x8914\n#define GL_SRC1_ALPHA 0x8589\ntypedef void(APIENTRYP PFNGLGENQUERIESPROC)(GLsizei n, GLuint* ids);\ntypedef void(APIENTRYP PFNGLDELETEQUERIESPROC)(GLsizei n, const GLuint* ids);\ntypedef GLboolean(APIENTRYP PFNGLISQUERYPROC)(GLuint id);\ntypedef void(APIENTRYP PFNGLBEGINQUERYPROC)(GLenum target, GLuint id);\ntypedef void(APIENTRYP PFNGLENDQUERYPROC)(GLenum target);\ntypedef void(APIENTRYP PFNGLGETQUERYIVPROC)(GLenum target, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETQUERYOBJECTIVPROC)(GLuint id, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETQUERYOBJECTUIVPROC)(GLuint id, GLenum pname, GLuint* params);\ntypedef void(APIENTRYP PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer);\ntypedef void(APIENTRYP PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint* buffers);\ntypedef void(APIENTRYP PFNGLGENBUFFERSPROC)(GLsizei n, GLuint* buffers);\ntypedef GLboolean(APIENTRYP PFNGLISBUFFERPROC)(GLuint buffer);\ntypedef void(APIENTRYP PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void* data, GLenum usage);\ntypedef void(APIENTRYP PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void* data);\ntypedef void(APIENTRYP PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void* data);\ntypedef void*(APIENTRYP PFNGLMAPBUFFERPROC)(GLenum target, GLenum access);\ntypedef GLboolean(APIENTRYP PFNGLUNMAPBUFFERPROC)(GLenum target);\ntypedef void(APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void** params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGenQueries(GLsizei n, GLuint* ids);\nGLAPI void APIENTRY glDeleteQueries(GLsizei n, const GLuint* ids);\nGLAPI GLboolean APIENTRY glIsQuery(GLuint id);\nGLAPI void APIENTRY glBeginQuery(GLenum target, GLuint id);\nGLAPI void APIENTRY glEndQuery(GLenum target);\nGLAPI void APIENTRY glGetQueryiv(GLenum target, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetQueryObjectiv(GLuint id, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params);\nGLAPI void APIENTRY glBindBuffer(GLenum target, GLuint buffer);\nGLAPI void APIENTRY glDeleteBuffers(GLsizei n, const GLuint* buffers);\nGLAPI void APIENTRY glGenBuffers(GLsizei n, GLuint* buffers);\nGLAPI GLboolean APIENTRY glIsBuffer(GLuint buffer);\nGLAPI void APIENTRY glBufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage);\nGLAPI void APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data);\nGLAPI void APIENTRY glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void* data);\nGLAPI void* APIENTRY glMapBuffer(GLenum target, GLenum access);\nGLAPI GLboolean APIENTRY glUnmapBuffer(GLenum target);\nGLAPI void APIENTRY glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetBufferPointerv(GLenum target, GLenum pname, void** params);\n#endif\n#endif /* GL_VERSION_1_5 */\n\n#ifndef GL_VERSION_2_0\n#define GL_VERSION_2_0 1\ntypedef char GLchar;\ntypedef khronos_int16_t GLshort;\ntypedef khronos_int8_t GLbyte;\ntypedef khronos_uint16_t GLushort;\n#define GL_BLEND_EQUATION_RGB 0x8009\n#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622\n#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623\n#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624\n#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625\n#define GL_CURRENT_VERTEX_ATTRIB 0x8626\n#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642\n#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645\n#define GL_STENCIL_BACK_FUNC 0x8800\n#define GL_STENCIL_BACK_FAIL 0x8801\n#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802\n#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803\n#define GL_MAX_DRAW_BUFFERS 0x8824\n#define GL_DRAW_BUFFER0 0x8825\n#define GL_DRAW_BUFFER1 0x8826\n#define GL_DRAW_BUFFER2 0x8827\n#define GL_DRAW_BUFFER3 0x8828\n#define GL_DRAW_BUFFER4 0x8829\n#define GL_DRAW_BUFFER5 0x882A\n#define GL_DRAW_BUFFER6 0x882B\n#define GL_DRAW_BUFFER7 0x882C\n#define GL_DRAW_BUFFER8 0x882D\n#define GL_DRAW_BUFFER9 0x882E\n#define GL_DRAW_BUFFER10 0x882F\n#define GL_DRAW_BUFFER11 0x8830\n#define GL_DRAW_BUFFER12 0x8831\n#define GL_DRAW_BUFFER13 0x8832\n#define GL_DRAW_BUFFER14 0x8833\n#define GL_DRAW_BUFFER15 0x8834\n#define GL_BLEND_EQUATION_ALPHA 0x883D\n#define GL_MAX_VERTEX_ATTRIBS 0x8869\n#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A\n#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872\n#define GL_FRAGMENT_SHADER 0x8B30\n#define GL_VERTEX_SHADER 0x8B31\n#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49\n#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A\n#define GL_MAX_VARYING_FLOATS 0x8B4B\n#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C\n#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D\n#define GL_SHADER_TYPE 0x8B4F\n#define GL_FLOAT_VEC2 0x8B50\n#define GL_FLOAT_VEC3 0x8B51\n#define GL_FLOAT_VEC4 0x8B52\n#define GL_INT_VEC2 0x8B53\n#define GL_INT_VEC3 0x8B54\n#define GL_INT_VEC4 0x8B55\n#define GL_BOOL 0x8B56\n#define GL_BOOL_VEC2 0x8B57\n#define GL_BOOL_VEC3 0x8B58\n#define GL_BOOL_VEC4 0x8B59\n#define GL_FLOAT_MAT2 0x8B5A\n#define GL_FLOAT_MAT3 0x8B5B\n#define GL_FLOAT_MAT4 0x8B5C\n#define GL_SAMPLER_1D 0x8B5D\n#define GL_SAMPLER_2D 0x8B5E\n#define GL_SAMPLER_3D 0x8B5F\n#define GL_SAMPLER_CUBE 0x8B60\n#define GL_SAMPLER_1D_SHADOW 0x8B61\n#define GL_SAMPLER_2D_SHADOW 0x8B62\n#define GL_DELETE_STATUS 0x8B80\n#define GL_COMPILE_STATUS 0x8B81\n#define GL_LINK_STATUS 0x8B82\n#define GL_VALIDATE_STATUS 0x8B83\n#define GL_INFO_LOG_LENGTH 0x8B84\n#define GL_ATTACHED_SHADERS 0x8B85\n#define GL_ACTIVE_UNIFORMS 0x8B86\n#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87\n#define GL_SHADER_SOURCE_LENGTH 0x8B88\n#define GL_ACTIVE_ATTRIBUTES 0x8B89\n#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A\n#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B\n#define GL_SHADING_LANGUAGE_VERSION 0x8B8C\n#define GL_CURRENT_PROGRAM 0x8B8D\n#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0\n#define GL_LOWER_LEFT 0x8CA1\n#define GL_UPPER_LEFT 0x8CA2\n#define GL_STENCIL_BACK_REF 0x8CA3\n#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4\n#define GL_STENCIL_BACK_WRITEMASK 0x8CA5\ntypedef void(APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha);\ntypedef void(APIENTRYP PFNGLDRAWBUFFERSPROC)(GLsizei n, const GLenum* bufs);\ntypedef void(APIENTRYP PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);\ntypedef void(APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask);\ntypedef void(APIENTRYP PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask);\ntypedef void(APIENTRYP PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader);\ntypedef void(APIENTRYP PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar* name);\ntypedef void(APIENTRYP PFNGLCOMPILESHADERPROC)(GLuint shader);\ntypedef GLuint(APIENTRYP PFNGLCREATEPROGRAMPROC)(void);\ntypedef GLuint(APIENTRYP PFNGLCREATESHADERPROC)(GLenum type);\ntypedef void(APIENTRYP PFNGLDELETEPROGRAMPROC)(GLuint program);\ntypedef void(APIENTRYP PFNGLDELETESHADERPROC)(GLuint shader);\ntypedef void(APIENTRYP PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader);\ntypedef void(APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index);\ntypedef void(APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index);\ntypedef void(APIENTRYP PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type,\n                                                 GLchar* name);\ntypedef void(APIENTRYP PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type,\n                                                  GLchar* name);\ntypedef void(APIENTRYP PFNGLGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders);\ntypedef GLint(APIENTRYP PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar* name);\ntypedef void(APIENTRYP PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog);\ntypedef void(APIENTRYP PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog);\ntypedef void(APIENTRYP PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source);\ntypedef GLint(APIENTRYP PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar* name);\ntypedef void(APIENTRYP PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint* params);\ntypedef void(APIENTRYP PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble* params);\ntypedef void(APIENTRYP PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void** pointer);\ntypedef GLboolean(APIENTRYP PFNGLISPROGRAMPROC)(GLuint program);\ntypedef GLboolean(APIENTRYP PFNGLISSHADERPROC)(GLuint shader);\ntypedef void(APIENTRYP PFNGLLINKPROGRAMPROC)(GLuint program);\ntypedef void(APIENTRYP PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length);\ntypedef void(APIENTRYP PFNGLUSEPROGRAMPROC)(GLuint program);\ntypedef void(APIENTRYP PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0);\ntypedef void(APIENTRYP PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1);\ntypedef void(APIENTRYP PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\ntypedef void(APIENTRYP PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\ntypedef void(APIENTRYP PFNGLUNIFORM1IPROC)(GLint location, GLint v0);\ntypedef void(APIENTRYP PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1);\ntypedef void(APIENTRYP PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2);\ntypedef void(APIENTRYP PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\ntypedef void(APIENTRYP PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint* value);\ntypedef void(APIENTRYP PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint* value);\ntypedef void(APIENTRYP PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint* value);\ntypedef void(APIENTRYP PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLVALIDATEPROGRAMPROC)(GLuint program);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride,\n                                                     const void* pointer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);\nGLAPI void APIENTRY glDrawBuffers(GLsizei n, const GLenum* bufs);\nGLAPI void APIENTRY glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);\nGLAPI void APIENTRY glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);\nGLAPI void APIENTRY glStencilMaskSeparate(GLenum face, GLuint mask);\nGLAPI void APIENTRY glAttachShader(GLuint program, GLuint shader);\nGLAPI void APIENTRY glBindAttribLocation(GLuint program, GLuint index, const GLchar* name);\nGLAPI void APIENTRY glCompileShader(GLuint shader);\nGLAPI GLuint APIENTRY glCreateProgram(void);\nGLAPI GLuint APIENTRY glCreateShader(GLenum type);\nGLAPI void APIENTRY glDeleteProgram(GLuint program);\nGLAPI void APIENTRY glDeleteShader(GLuint shader);\nGLAPI void APIENTRY glDetachShader(GLuint program, GLuint shader);\nGLAPI void APIENTRY glDisableVertexAttribArray(GLuint index);\nGLAPI void APIENTRY glEnableVertexAttribArray(GLuint index);\nGLAPI void APIENTRY glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);\nGLAPI void APIENTRY glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);\nGLAPI void APIENTRY glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders);\nGLAPI GLint APIENTRY glGetAttribLocation(GLuint program, const GLchar* name);\nGLAPI void APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog);\nGLAPI void APIENTRY glGetShaderiv(GLuint shader, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog);\nGLAPI void APIENTRY glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source);\nGLAPI GLint APIENTRY glGetUniformLocation(GLuint program, const GLchar* name);\nGLAPI void APIENTRY glGetUniformfv(GLuint program, GLint location, GLfloat* params);\nGLAPI void APIENTRY glGetUniformiv(GLuint program, GLint location, GLint* params);\nGLAPI void APIENTRY glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble* params);\nGLAPI void APIENTRY glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params);\nGLAPI void APIENTRY glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer);\nGLAPI GLboolean APIENTRY glIsProgram(GLuint program);\nGLAPI GLboolean APIENTRY glIsShader(GLuint shader);\nGLAPI void APIENTRY glLinkProgram(GLuint program);\nGLAPI void APIENTRY glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length);\nGLAPI void APIENTRY glUseProgram(GLuint program);\nGLAPI void APIENTRY glUniform1f(GLint location, GLfloat v0);\nGLAPI void APIENTRY glUniform2f(GLint location, GLfloat v0, GLfloat v1);\nGLAPI void APIENTRY glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\nGLAPI void APIENTRY glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\nGLAPI void APIENTRY glUniform1i(GLint location, GLint v0);\nGLAPI void APIENTRY glUniform2i(GLint location, GLint v0, GLint v1);\nGLAPI void APIENTRY glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);\nGLAPI void APIENTRY glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\nGLAPI void APIENTRY glUniform1fv(GLint location, GLsizei count, const GLfloat* value);\nGLAPI void APIENTRY glUniform2fv(GLint location, GLsizei count, const GLfloat* value);\nGLAPI void APIENTRY glUniform3fv(GLint location, GLsizei count, const GLfloat* value);\nGLAPI void APIENTRY glUniform4fv(GLint location, GLsizei count, const GLfloat* value);\nGLAPI void APIENTRY glUniform1iv(GLint location, GLsizei count, const GLint* value);\nGLAPI void APIENTRY glUniform2iv(GLint location, GLsizei count, const GLint* value);\nGLAPI void APIENTRY glUniform3iv(GLint location, GLsizei count, const GLint* value);\nGLAPI void APIENTRY glUniform4iv(GLint location, GLsizei count, const GLint* value);\nGLAPI void APIENTRY glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glValidateProgram(GLuint program);\nGLAPI void APIENTRY glVertexAttrib1d(GLuint index, GLdouble x);\nGLAPI void APIENTRY glVertexAttrib1dv(GLuint index, const GLdouble* v);\nGLAPI void APIENTRY glVertexAttrib1f(GLuint index, GLfloat x);\nGLAPI void APIENTRY glVertexAttrib1fv(GLuint index, const GLfloat* v);\nGLAPI void APIENTRY glVertexAttrib1s(GLuint index, GLshort x);\nGLAPI void APIENTRY glVertexAttrib1sv(GLuint index, const GLshort* v);\nGLAPI void APIENTRY glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);\nGLAPI void APIENTRY glVertexAttrib2dv(GLuint index, const GLdouble* v);\nGLAPI void APIENTRY glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);\nGLAPI void APIENTRY glVertexAttrib2fv(GLuint index, const GLfloat* v);\nGLAPI void APIENTRY glVertexAttrib2s(GLuint index, GLshort x, GLshort y);\nGLAPI void APIENTRY glVertexAttrib2sv(GLuint index, const GLshort* v);\nGLAPI void APIENTRY glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glVertexAttrib3dv(GLuint index, const GLdouble* v);\nGLAPI void APIENTRY glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glVertexAttrib3fv(GLuint index, const GLfloat* v);\nGLAPI void APIENTRY glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);\nGLAPI void APIENTRY glVertexAttrib3sv(GLuint index, const GLshort* v);\nGLAPI void APIENTRY glVertexAttrib4Nbv(GLuint index, const GLbyte* v);\nGLAPI void APIENTRY glVertexAttrib4Niv(GLuint index, const GLint* v);\nGLAPI void APIENTRY glVertexAttrib4Nsv(GLuint index, const GLshort* v);\nGLAPI void APIENTRY glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\nGLAPI void APIENTRY glVertexAttrib4Nubv(GLuint index, const GLubyte* v);\nGLAPI void APIENTRY glVertexAttrib4Nuiv(GLuint index, const GLuint* v);\nGLAPI void APIENTRY glVertexAttrib4Nusv(GLuint index, const GLushort* v);\nGLAPI void APIENTRY glVertexAttrib4bv(GLuint index, const GLbyte* v);\nGLAPI void APIENTRY glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glVertexAttrib4dv(GLuint index, const GLdouble* v);\nGLAPI void APIENTRY glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI void APIENTRY glVertexAttrib4fv(GLuint index, const GLfloat* v);\nGLAPI void APIENTRY glVertexAttrib4iv(GLuint index, const GLint* v);\nGLAPI void APIENTRY glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\nGLAPI void APIENTRY glVertexAttrib4sv(GLuint index, const GLshort* v);\nGLAPI void APIENTRY glVertexAttrib4ubv(GLuint index, const GLubyte* v);\nGLAPI void APIENTRY glVertexAttrib4uiv(GLuint index, const GLuint* v);\nGLAPI void APIENTRY glVertexAttrib4usv(GLuint index, const GLushort* v);\nGLAPI void APIENTRY glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer);\n#endif\n#endif /* GL_VERSION_2_0 */\n\n#ifndef GL_VERSION_2_1\n#define GL_VERSION_2_1 1\n#define GL_PIXEL_PACK_BUFFER 0x88EB\n#define GL_PIXEL_UNPACK_BUFFER 0x88EC\n#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED\n#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF\n#define GL_FLOAT_MAT2x3 0x8B65\n#define GL_FLOAT_MAT2x4 0x8B66\n#define GL_FLOAT_MAT3x2 0x8B67\n#define GL_FLOAT_MAT3x4 0x8B68\n#define GL_FLOAT_MAT4x2 0x8B69\n#define GL_FLOAT_MAT4x3 0x8B6A\n#define GL_SRGB 0x8C40\n#define GL_SRGB8 0x8C41\n#define GL_SRGB_ALPHA 0x8C42\n#define GL_SRGB8_ALPHA8 0x8C43\n#define GL_COMPRESSED_SRGB 0x8C48\n#define GL_COMPRESSED_SRGB_ALPHA 0x8C49\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\n#endif\n#endif /* GL_VERSION_2_1 */\n\n#ifndef GL_VERSION_3_0\n#define GL_VERSION_3_0 1\ntypedef khronos_uint16_t GLhalf;\n#define GL_COMPARE_REF_TO_TEXTURE 0x884E\n#define GL_CLIP_DISTANCE0 0x3000\n#define GL_CLIP_DISTANCE1 0x3001\n#define GL_CLIP_DISTANCE2 0x3002\n#define GL_CLIP_DISTANCE3 0x3003\n#define GL_CLIP_DISTANCE4 0x3004\n#define GL_CLIP_DISTANCE5 0x3005\n#define GL_CLIP_DISTANCE6 0x3006\n#define GL_CLIP_DISTANCE7 0x3007\n#define GL_MAX_CLIP_DISTANCES 0x0D32\n#define GL_MAJOR_VERSION 0x821B\n#define GL_MINOR_VERSION 0x821C\n#define GL_NUM_EXTENSIONS 0x821D\n#define GL_CONTEXT_FLAGS 0x821E\n#define GL_COMPRESSED_RED 0x8225\n#define GL_COMPRESSED_RG 0x8226\n#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001\n#define GL_RGBA32F 0x8814\n#define GL_RGB32F 0x8815\n#define GL_RGBA16F 0x881A\n#define GL_RGB16F 0x881B\n#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD\n#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF\n#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904\n#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905\n#define GL_CLAMP_READ_COLOR 0x891C\n#define GL_FIXED_ONLY 0x891D\n#define GL_MAX_VARYING_COMPONENTS 0x8B4B\n#define GL_TEXTURE_1D_ARRAY 0x8C18\n#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19\n#define GL_TEXTURE_2D_ARRAY 0x8C1A\n#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B\n#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C\n#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D\n#define GL_R11F_G11F_B10F 0x8C3A\n#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B\n#define GL_RGB9_E5 0x8C3D\n#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E\n#define GL_TEXTURE_SHARED_SIZE 0x8C3F\n#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76\n#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80\n#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83\n#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84\n#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85\n#define GL_PRIMITIVES_GENERATED 0x8C87\n#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88\n#define GL_RASTERIZER_DISCARD 0x8C89\n#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B\n#define GL_INTERLEAVED_ATTRIBS 0x8C8C\n#define GL_SEPARATE_ATTRIBS 0x8C8D\n#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E\n#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F\n#define GL_RGBA32UI 0x8D70\n#define GL_RGB32UI 0x8D71\n#define GL_RGBA16UI 0x8D76\n#define GL_RGB16UI 0x8D77\n#define GL_RGBA8UI 0x8D7C\n#define GL_RGB8UI 0x8D7D\n#define GL_RGBA32I 0x8D82\n#define GL_RGB32I 0x8D83\n#define GL_RGBA16I 0x8D88\n#define GL_RGB16I 0x8D89\n#define GL_RGBA8I 0x8D8E\n#define GL_RGB8I 0x8D8F\n#define GL_RED_INTEGER 0x8D94\n#define GL_GREEN_INTEGER 0x8D95\n#define GL_BLUE_INTEGER 0x8D96\n#define GL_RGB_INTEGER 0x8D98\n#define GL_RGBA_INTEGER 0x8D99\n#define GL_BGR_INTEGER 0x8D9A\n#define GL_BGRA_INTEGER 0x8D9B\n#define GL_SAMPLER_1D_ARRAY 0x8DC0\n#define GL_SAMPLER_2D_ARRAY 0x8DC1\n#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3\n#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4\n#define GL_SAMPLER_CUBE_SHADOW 0x8DC5\n#define GL_UNSIGNED_INT_VEC2 0x8DC6\n#define GL_UNSIGNED_INT_VEC3 0x8DC7\n#define GL_UNSIGNED_INT_VEC4 0x8DC8\n#define GL_INT_SAMPLER_1D 0x8DC9\n#define GL_INT_SAMPLER_2D 0x8DCA\n#define GL_INT_SAMPLER_3D 0x8DCB\n#define GL_INT_SAMPLER_CUBE 0x8DCC\n#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE\n#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF\n#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1\n#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2\n#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3\n#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4\n#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6\n#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7\n#define GL_QUERY_WAIT 0x8E13\n#define GL_QUERY_NO_WAIT 0x8E14\n#define GL_QUERY_BY_REGION_WAIT 0x8E15\n#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16\n#define GL_BUFFER_ACCESS_FLAGS 0x911F\n#define GL_BUFFER_MAP_LENGTH 0x9120\n#define GL_BUFFER_MAP_OFFSET 0x9121\n#define GL_DEPTH_COMPONENT32F 0x8CAC\n#define GL_DEPTH32F_STENCIL8 0x8CAD\n#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD\n#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506\n#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210\n#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211\n#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212\n#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213\n#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214\n#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215\n#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216\n#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217\n#define GL_FRAMEBUFFER_DEFAULT 0x8218\n#define GL_FRAMEBUFFER_UNDEFINED 0x8219\n#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A\n#define GL_MAX_RENDERBUFFER_SIZE 0x84E8\n#define GL_DEPTH_STENCIL 0x84F9\n#define GL_UNSIGNED_INT_24_8 0x84FA\n#define GL_DEPTH24_STENCIL8 0x88F0\n#define GL_TEXTURE_STENCIL_SIZE 0x88F1\n#define GL_TEXTURE_RED_TYPE 0x8C10\n#define GL_TEXTURE_GREEN_TYPE 0x8C11\n#define GL_TEXTURE_BLUE_TYPE 0x8C12\n#define GL_TEXTURE_ALPHA_TYPE 0x8C13\n#define GL_TEXTURE_DEPTH_TYPE 0x8C16\n#define GL_UNSIGNED_NORMALIZED 0x8C17\n#define GL_FRAMEBUFFER_BINDING 0x8CA6\n#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6\n#define GL_RENDERBUFFER_BINDING 0x8CA7\n#define GL_READ_FRAMEBUFFER 0x8CA8\n#define GL_DRAW_FRAMEBUFFER 0x8CA9\n#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA\n#define GL_RENDERBUFFER_SAMPLES 0x8CAB\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4\n#define GL_FRAMEBUFFER_COMPLETE 0x8CD5\n#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6\n#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7\n#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB\n#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC\n#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD\n#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF\n#define GL_COLOR_ATTACHMENT0 0x8CE0\n#define GL_COLOR_ATTACHMENT1 0x8CE1\n#define GL_COLOR_ATTACHMENT2 0x8CE2\n#define GL_COLOR_ATTACHMENT3 0x8CE3\n#define GL_COLOR_ATTACHMENT4 0x8CE4\n#define GL_COLOR_ATTACHMENT5 0x8CE5\n#define GL_COLOR_ATTACHMENT6 0x8CE6\n#define GL_COLOR_ATTACHMENT7 0x8CE7\n#define GL_COLOR_ATTACHMENT8 0x8CE8\n#define GL_COLOR_ATTACHMENT9 0x8CE9\n#define GL_COLOR_ATTACHMENT10 0x8CEA\n#define GL_COLOR_ATTACHMENT11 0x8CEB\n#define GL_COLOR_ATTACHMENT12 0x8CEC\n#define GL_COLOR_ATTACHMENT13 0x8CED\n#define GL_COLOR_ATTACHMENT14 0x8CEE\n#define GL_COLOR_ATTACHMENT15 0x8CEF\n#define GL_COLOR_ATTACHMENT16 0x8CF0\n#define GL_COLOR_ATTACHMENT17 0x8CF1\n#define GL_COLOR_ATTACHMENT18 0x8CF2\n#define GL_COLOR_ATTACHMENT19 0x8CF3\n#define GL_COLOR_ATTACHMENT20 0x8CF4\n#define GL_COLOR_ATTACHMENT21 0x8CF5\n#define GL_COLOR_ATTACHMENT22 0x8CF6\n#define GL_COLOR_ATTACHMENT23 0x8CF7\n#define GL_COLOR_ATTACHMENT24 0x8CF8\n#define GL_COLOR_ATTACHMENT25 0x8CF9\n#define GL_COLOR_ATTACHMENT26 0x8CFA\n#define GL_COLOR_ATTACHMENT27 0x8CFB\n#define GL_COLOR_ATTACHMENT28 0x8CFC\n#define GL_COLOR_ATTACHMENT29 0x8CFD\n#define GL_COLOR_ATTACHMENT30 0x8CFE\n#define GL_COLOR_ATTACHMENT31 0x8CFF\n#define GL_DEPTH_ATTACHMENT 0x8D00\n#define GL_STENCIL_ATTACHMENT 0x8D20\n#define GL_FRAMEBUFFER 0x8D40\n#define GL_RENDERBUFFER 0x8D41\n#define GL_RENDERBUFFER_WIDTH 0x8D42\n#define GL_RENDERBUFFER_HEIGHT 0x8D43\n#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44\n#define GL_STENCIL_INDEX1 0x8D46\n#define GL_STENCIL_INDEX4 0x8D47\n#define GL_STENCIL_INDEX8 0x8D48\n#define GL_STENCIL_INDEX16 0x8D49\n#define GL_RENDERBUFFER_RED_SIZE 0x8D50\n#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51\n#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52\n#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53\n#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54\n#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56\n#define GL_MAX_SAMPLES 0x8D57\n#define GL_FRAMEBUFFER_SRGB 0x8DB9\n#define GL_HALF_FLOAT 0x140B\n#define GL_MAP_READ_BIT 0x0001\n#define GL_MAP_WRITE_BIT 0x0002\n#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004\n#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008\n#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010\n#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020\n#define GL_COMPRESSED_RED_RGTC1 0x8DBB\n#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC\n#define GL_COMPRESSED_RG_RGTC2 0x8DBD\n#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE\n#define GL_RG 0x8227\n#define GL_RG_INTEGER 0x8228\n#define GL_R8 0x8229\n#define GL_R16 0x822A\n#define GL_RG8 0x822B\n#define GL_RG16 0x822C\n#define GL_R16F 0x822D\n#define GL_R32F 0x822E\n#define GL_RG16F 0x822F\n#define GL_RG32F 0x8230\n#define GL_R8I 0x8231\n#define GL_R8UI 0x8232\n#define GL_R16I 0x8233\n#define GL_R16UI 0x8234\n#define GL_R32I 0x8235\n#define GL_R32UI 0x8236\n#define GL_RG8I 0x8237\n#define GL_RG8UI 0x8238\n#define GL_RG16I 0x8239\n#define GL_RG16UI 0x823A\n#define GL_RG32I 0x823B\n#define GL_RG32UI 0x823C\n#define GL_VERTEX_ARRAY_BINDING 0x85B5\ntypedef void(APIENTRYP PFNGLCOLORMASKIPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\ntypedef void(APIENTRYP PFNGLGETBOOLEANI_VPROC)(GLenum target, GLuint index, GLboolean* data);\ntypedef void(APIENTRYP PFNGLGETINTEGERI_VPROC)(GLenum target, GLuint index, GLint* data);\ntypedef void(APIENTRYP PFNGLENABLEIPROC)(GLenum target, GLuint index);\ntypedef void(APIENTRYP PFNGLDISABLEIPROC)(GLenum target, GLuint index);\ntypedef GLboolean(APIENTRYP PFNGLISENABLEDIPROC)(GLenum target, GLuint index);\ntypedef void(APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode);\ntypedef void(APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC)(void);\ntypedef void(APIENTRYP PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\ntypedef void(APIENTRYP PFNGLBINDBUFFERBASEPROC)(GLenum target, GLuint index, GLuint buffer);\ntypedef void(APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode);\ntypedef void(APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size,\n                                                             GLenum* type, GLchar* name);\ntypedef void(APIENTRYP PFNGLCLAMPCOLORPROC)(GLenum target, GLenum clamp);\ntypedef void(APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode);\ntypedef void(APIENTRYP PFNGLENDCONDITIONALRENDERPROC)(void);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer);\ntypedef void(APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC)(GLuint index, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint index, GLenum pname, GLuint* params);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI1IPROC)(GLuint index, GLint x);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI2IPROC)(GLuint index, GLint x, GLint y);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI3IPROC)(GLuint index, GLint x, GLint y, GLint z);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI4IPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI1UIPROC)(GLuint index, GLuint x);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI2UIPROC)(GLuint index, GLuint x, GLuint y);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI3UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI4UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI1IVPROC)(GLuint index, const GLint* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI2IVPROC)(GLuint index, const GLint* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI3IVPROC)(GLuint index, const GLint* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI4IVPROC)(GLuint index, const GLint* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC)(GLuint index, const GLuint* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC)(GLuint index, const GLuint* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC)(GLuint index, const GLuint* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC)(GLuint index, const GLuint* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI4BVPROC)(GLuint index, const GLbyte* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI4SVPROC)(GLuint index, const GLshort* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC)(GLuint index, const GLubyte* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBI4USVPROC)(GLuint index, const GLushort* v);\ntypedef void(APIENTRYP PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint* params);\ntypedef void(APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC)(GLuint program, GLuint color, const GLchar* name);\ntypedef GLint(APIENTRYP PFNGLGETFRAGDATALOCATIONPROC)(GLuint program, const GLchar* name);\ntypedef void(APIENTRYP PFNGLUNIFORM1UIPROC)(GLint location, GLuint v0);\ntypedef void(APIENTRYP PFNGLUNIFORM2UIPROC)(GLint location, GLuint v0, GLuint v1);\ntypedef void(APIENTRYP PFNGLUNIFORM3UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2);\ntypedef void(APIENTRYP PFNGLUNIFORM4UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\ntypedef void(APIENTRYP PFNGLUNIFORM1UIVPROC)(GLint location, GLsizei count, const GLuint* value);\ntypedef void(APIENTRYP PFNGLUNIFORM2UIVPROC)(GLint location, GLsizei count, const GLuint* value);\ntypedef void(APIENTRYP PFNGLUNIFORM3UIVPROC)(GLint location, GLsizei count, const GLuint* value);\ntypedef void(APIENTRYP PFNGLUNIFORM4UIVPROC)(GLint location, GLsizei count, const GLuint* value);\ntypedef void(APIENTRYP PFNGLTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, const GLint* params);\ntypedef void(APIENTRYP PFNGLTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, const GLuint* params);\ntypedef void(APIENTRYP PFNGLGETTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, GLuint* params);\ntypedef void(APIENTRYP PFNGLCLEARBUFFERIVPROC)(GLenum buffer, GLint drawbuffer, const GLint* value);\ntypedef void(APIENTRYP PFNGLCLEARBUFFERUIVPROC)(GLenum buffer, GLint drawbuffer, const GLuint* value);\ntypedef void(APIENTRYP PFNGLCLEARBUFFERFVPROC)(GLenum buffer, GLint drawbuffer, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLCLEARBUFFERFIPROC)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);\ntypedef const GLubyte*(APIENTRYP PFNGLGETSTRINGIPROC)(GLenum name, GLuint index);\ntypedef GLboolean(APIENTRYP PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer);\ntypedef void(APIENTRYP PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer);\ntypedef void(APIENTRYP PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint* renderbuffers);\ntypedef void(APIENTRYP PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint* renderbuffers);\ntypedef void(APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint* params);\ntypedef GLboolean(APIENTRYP PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer);\ntypedef void(APIENTRYP PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer);\ntypedef void(APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint* framebuffers);\ntypedef void(APIENTRYP PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint* framebuffers);\ntypedef GLenum(APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target);\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\ntypedef void(APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGENERATEMIPMAPPROC)(GLenum target);\ntypedef void(APIENTRYP PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1,\n                                                 GLint dstY1, GLbitfield mask, GLenum filter);\ntypedef void(APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\ntypedef void*(APIENTRYP PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);\ntypedef void(APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length);\ntypedef void(APIENTRYP PFNGLBINDVERTEXARRAYPROC)(GLuint array);\ntypedef void(APIENTRYP PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint* arrays);\ntypedef void(APIENTRYP PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint* arrays);\ntypedef GLboolean(APIENTRYP PFNGLISVERTEXARRAYPROC)(GLuint array);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\nGLAPI void APIENTRY glGetBooleani_v(GLenum target, GLuint index, GLboolean* data);\nGLAPI void APIENTRY glGetIntegeri_v(GLenum target, GLuint index, GLint* data);\nGLAPI void APIENTRY glEnablei(GLenum target, GLuint index);\nGLAPI void APIENTRY glDisablei(GLenum target, GLuint index);\nGLAPI GLboolean APIENTRY glIsEnabledi(GLenum target, GLuint index);\nGLAPI void APIENTRY glBeginTransformFeedback(GLenum primitiveMode);\nGLAPI void APIENTRY glEndTransformFeedback(void);\nGLAPI void APIENTRY glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\nGLAPI void APIENTRY glBindBufferBase(GLenum target, GLuint index, GLuint buffer);\nGLAPI void APIENTRY glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode);\nGLAPI void APIENTRY glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size,\n                                                  GLenum* type, GLchar* name);\nGLAPI void APIENTRY glClampColor(GLenum target, GLenum clamp);\nGLAPI void APIENTRY glBeginConditionalRender(GLuint id, GLenum mode);\nGLAPI void APIENTRY glEndConditionalRender(void);\nGLAPI void APIENTRY glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer);\nGLAPI void APIENTRY glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params);\nGLAPI void APIENTRY glVertexAttribI1i(GLuint index, GLint x);\nGLAPI void APIENTRY glVertexAttribI2i(GLuint index, GLint x, GLint y);\nGLAPI void APIENTRY glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);\nGLAPI void APIENTRY glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);\nGLAPI void APIENTRY glVertexAttribI1ui(GLuint index, GLuint x);\nGLAPI void APIENTRY glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);\nGLAPI void APIENTRY glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);\nGLAPI void APIENTRY glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\nGLAPI void APIENTRY glVertexAttribI1iv(GLuint index, const GLint* v);\nGLAPI void APIENTRY glVertexAttribI2iv(GLuint index, const GLint* v);\nGLAPI void APIENTRY glVertexAttribI3iv(GLuint index, const GLint* v);\nGLAPI void APIENTRY glVertexAttribI4iv(GLuint index, const GLint* v);\nGLAPI void APIENTRY glVertexAttribI1uiv(GLuint index, const GLuint* v);\nGLAPI void APIENTRY glVertexAttribI2uiv(GLuint index, const GLuint* v);\nGLAPI void APIENTRY glVertexAttribI3uiv(GLuint index, const GLuint* v);\nGLAPI void APIENTRY glVertexAttribI4uiv(GLuint index, const GLuint* v);\nGLAPI void APIENTRY glVertexAttribI4bv(GLuint index, const GLbyte* v);\nGLAPI void APIENTRY glVertexAttribI4sv(GLuint index, const GLshort* v);\nGLAPI void APIENTRY glVertexAttribI4ubv(GLuint index, const GLubyte* v);\nGLAPI void APIENTRY glVertexAttribI4usv(GLuint index, const GLushort* v);\nGLAPI void APIENTRY glGetUniformuiv(GLuint program, GLint location, GLuint* params);\nGLAPI void APIENTRY glBindFragDataLocation(GLuint program, GLuint color, const GLchar* name);\nGLAPI GLint APIENTRY glGetFragDataLocation(GLuint program, const GLchar* name);\nGLAPI void APIENTRY glUniform1ui(GLint location, GLuint v0);\nGLAPI void APIENTRY glUniform2ui(GLint location, GLuint v0, GLuint v1);\nGLAPI void APIENTRY glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);\nGLAPI void APIENTRY glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\nGLAPI void APIENTRY glUniform1uiv(GLint location, GLsizei count, const GLuint* value);\nGLAPI void APIENTRY glUniform2uiv(GLint location, GLsizei count, const GLuint* value);\nGLAPI void APIENTRY glUniform3uiv(GLint location, GLsizei count, const GLuint* value);\nGLAPI void APIENTRY glUniform4uiv(GLint location, GLsizei count, const GLuint* value);\nGLAPI void APIENTRY glTexParameterIiv(GLenum target, GLenum pname, const GLint* params);\nGLAPI void APIENTRY glTexParameterIuiv(GLenum target, GLenum pname, const GLuint* params);\nGLAPI void APIENTRY glGetTexParameterIiv(GLenum target, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint* params);\nGLAPI void APIENTRY glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value);\nGLAPI void APIENTRY glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value);\nGLAPI void APIENTRY glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value);\nGLAPI void APIENTRY glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);\nGLAPI const GLubyte* APIENTRY glGetStringi(GLenum name, GLuint index);\nGLAPI GLboolean APIENTRY glIsRenderbuffer(GLuint renderbuffer);\nGLAPI void APIENTRY glBindRenderbuffer(GLenum target, GLuint renderbuffer);\nGLAPI void APIENTRY glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers);\nGLAPI void APIENTRY glGenRenderbuffers(GLsizei n, GLuint* renderbuffers);\nGLAPI void APIENTRY glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params);\nGLAPI GLboolean APIENTRY glIsFramebuffer(GLuint framebuffer);\nGLAPI void APIENTRY glBindFramebuffer(GLenum target, GLuint framebuffer);\nGLAPI void APIENTRY glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers);\nGLAPI void APIENTRY glGenFramebuffers(GLsizei n, GLuint* framebuffers);\nGLAPI GLenum APIENTRY glCheckFramebufferStatus(GLenum target);\nGLAPI void APIENTRY glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\nGLAPI void APIENTRY glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\nGLAPI void APIENTRY glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\nGLAPI void APIENTRY glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\nGLAPI void APIENTRY glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGenerateMipmap(GLenum target);\nGLAPI void APIENTRY glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1,\n                                      GLint dstY1, GLbitfield mask, GLenum filter);\nGLAPI void APIENTRY glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\nGLAPI void* APIENTRY glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);\nGLAPI void APIENTRY glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);\nGLAPI void APIENTRY glBindVertexArray(GLuint array);\nGLAPI void APIENTRY glDeleteVertexArrays(GLsizei n, const GLuint* arrays);\nGLAPI void APIENTRY glGenVertexArrays(GLsizei n, GLuint* arrays);\nGLAPI GLboolean APIENTRY glIsVertexArray(GLuint array);\n#endif\n#endif /* GL_VERSION_3_0 */\n\n#ifndef GL_VERSION_3_1\n#define GL_VERSION_3_1 1\n#define GL_SAMPLER_2D_RECT 0x8B63\n#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64\n#define GL_SAMPLER_BUFFER 0x8DC2\n#define GL_INT_SAMPLER_2D_RECT 0x8DCD\n#define GL_INT_SAMPLER_BUFFER 0x8DD0\n#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5\n#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8\n#define GL_TEXTURE_BUFFER 0x8C2A\n#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B\n#define GL_TEXTURE_BINDING_BUFFER 0x8C2C\n#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D\n#define GL_TEXTURE_RECTANGLE 0x84F5\n#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6\n#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7\n#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8\n#define GL_R8_SNORM 0x8F94\n#define GL_RG8_SNORM 0x8F95\n#define GL_RGB8_SNORM 0x8F96\n#define GL_RGBA8_SNORM 0x8F97\n#define GL_R16_SNORM 0x8F98\n#define GL_RG16_SNORM 0x8F99\n#define GL_RGB16_SNORM 0x8F9A\n#define GL_RGBA16_SNORM 0x8F9B\n#define GL_SIGNED_NORMALIZED 0x8F9C\n#define GL_PRIMITIVE_RESTART 0x8F9D\n#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E\n#define GL_COPY_READ_BUFFER 0x8F36\n#define GL_COPY_WRITE_BUFFER 0x8F37\n#define GL_UNIFORM_BUFFER 0x8A11\n#define GL_UNIFORM_BUFFER_BINDING 0x8A28\n#define GL_UNIFORM_BUFFER_START 0x8A29\n#define GL_UNIFORM_BUFFER_SIZE 0x8A2A\n#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B\n#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C\n#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D\n#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E\n#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F\n#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30\n#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31\n#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32\n#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33\n#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34\n#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35\n#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36\n#define GL_UNIFORM_TYPE 0x8A37\n#define GL_UNIFORM_SIZE 0x8A38\n#define GL_UNIFORM_NAME_LENGTH 0x8A39\n#define GL_UNIFORM_BLOCK_INDEX 0x8A3A\n#define GL_UNIFORM_OFFSET 0x8A3B\n#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C\n#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D\n#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E\n#define GL_UNIFORM_BLOCK_BINDING 0x8A3F\n#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40\n#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46\n#define GL_INVALID_INDEX 0xFFFFFFFFu\ntypedef void(APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);\ntypedef void(APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount);\ntypedef void(APIENTRYP PFNGLTEXBUFFERPROC)(GLenum target, GLenum internalformat, GLuint buffer);\ntypedef void(APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index);\ntypedef void(APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset,\n                                                   GLsizeiptr size);\ntypedef void(APIENTRYP PFNGLGETUNIFORMINDICESPROC)(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices);\ntypedef void(APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName);\ntypedef GLuint(APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint program, const GLchar* uniformBlockName);\ntypedef void(APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length,\n                                                           GLchar* uniformBlockName);\ntypedef void(APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);\nGLAPI void APIENTRY glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount);\nGLAPI void APIENTRY glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);\nGLAPI void APIENTRY glPrimitiveRestartIndex(GLuint index);\nGLAPI void APIENTRY glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);\nGLAPI void APIENTRY glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices);\nGLAPI void APIENTRY glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName);\nGLAPI GLuint APIENTRY glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName);\nGLAPI void APIENTRY glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName);\nGLAPI void APIENTRY glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);\n#endif\n#endif /* GL_VERSION_3_1 */\n\n#ifndef GL_VERSION_3_2\n#define GL_VERSION_3_2 1\ntypedef struct __GLsync* GLsync;\ntypedef khronos_uint64_t GLuint64;\ntypedef khronos_int64_t GLint64;\n#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001\n#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002\n#define GL_LINES_ADJACENCY 0x000A\n#define GL_LINE_STRIP_ADJACENCY 0x000B\n#define GL_TRIANGLES_ADJACENCY 0x000C\n#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D\n#define GL_PROGRAM_POINT_SIZE 0x8642\n#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29\n#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8\n#define GL_GEOMETRY_SHADER 0x8DD9\n#define GL_GEOMETRY_VERTICES_OUT 0x8916\n#define GL_GEOMETRY_INPUT_TYPE 0x8917\n#define GL_GEOMETRY_OUTPUT_TYPE 0x8918\n#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF\n#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0\n#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1\n#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122\n#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123\n#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124\n#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125\n#define GL_CONTEXT_PROFILE_MASK 0x9126\n#define GL_DEPTH_CLAMP 0x864F\n#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C\n#define GL_FIRST_VERTEX_CONVENTION 0x8E4D\n#define GL_LAST_VERTEX_CONVENTION 0x8E4E\n#define GL_PROVOKING_VERTEX 0x8E4F\n#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F\n#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111\n#define GL_OBJECT_TYPE 0x9112\n#define GL_SYNC_CONDITION 0x9113\n#define GL_SYNC_STATUS 0x9114\n#define GL_SYNC_FLAGS 0x9115\n#define GL_SYNC_FENCE 0x9116\n#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117\n#define GL_UNSIGNALED 0x9118\n#define GL_SIGNALED 0x9119\n#define GL_ALREADY_SIGNALED 0x911A\n#define GL_TIMEOUT_EXPIRED 0x911B\n#define GL_CONDITION_SATISFIED 0x911C\n#define GL_WAIT_FAILED 0x911D\n#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull\n#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001\n#define GL_SAMPLE_POSITION 0x8E50\n#define GL_SAMPLE_MASK 0x8E51\n#define GL_SAMPLE_MASK_VALUE 0x8E52\n#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59\n#define GL_TEXTURE_2D_MULTISAMPLE 0x9100\n#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101\n#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102\n#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103\n#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104\n#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105\n#define GL_TEXTURE_SAMPLES 0x9106\n#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107\n#define GL_SAMPLER_2D_MULTISAMPLE 0x9108\n#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A\n#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B\n#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D\n#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E\n#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F\n#define GL_MAX_INTEGER_SAMPLES 0x9110\ntypedef void(APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void* indices, GLint basevertex);\ntypedef void(APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type,\n                                                             const void* indices, GLint basevertex);\ntypedef void(APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void* indices,\n                                                                 GLsizei instancecount, GLint basevertex);\ntypedef void(APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, const GLsizei* count, GLenum type, const void* const* indices,\n                                                             GLsizei drawcount, const GLint* basevertex);\ntypedef void(APIENTRYP PFNGLPROVOKINGVERTEXPROC)(GLenum mode);\ntypedef GLsync(APIENTRYP PFNGLFENCESYNCPROC)(GLenum condition, GLbitfield flags);\ntypedef GLboolean(APIENTRYP PFNGLISSYNCPROC)(GLsync sync);\ntypedef void(APIENTRYP PFNGLDELETESYNCPROC)(GLsync sync);\ntypedef GLenum(APIENTRYP PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout);\ntypedef void(APIENTRYP PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout);\ntypedef void(APIENTRYP PFNGLGETINTEGER64VPROC)(GLenum pname, GLint64* data);\ntypedef void(APIENTRYP PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei count, GLsizei* length, GLint* values);\ntypedef void(APIENTRYP PFNGLGETINTEGER64I_VPROC)(GLenum target, GLuint index, GLint64* data);\ntypedef void(APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC)(GLenum target, GLenum pname, GLint64* params);\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level);\ntypedef void(APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height,\n                                                       GLboolean fixedsamplelocations);\ntypedef void(APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height,\n                                                       GLsizei depth, GLboolean fixedsamplelocations);\ntypedef void(APIENTRYP PFNGLGETMULTISAMPLEFVPROC)(GLenum pname, GLuint index, GLfloat* val);\ntypedef void(APIENTRYP PFNGLSAMPLEMASKIPROC)(GLuint maskNumber, GLbitfield mask);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void* indices, GLint basevertex);\nGLAPI void APIENTRY glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices,\n                                                  GLint basevertex);\nGLAPI void APIENTRY glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount,\n                                                      GLint basevertex);\nGLAPI void APIENTRY glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei* count, GLenum type, const void* const* indices,\n                                                  GLsizei drawcount, const GLint* basevertex);\nGLAPI void APIENTRY glProvokingVertex(GLenum mode);\nGLAPI GLsync APIENTRY glFenceSync(GLenum condition, GLbitfield flags);\nGLAPI GLboolean APIENTRY glIsSync(GLsync sync);\nGLAPI void APIENTRY glDeleteSync(GLsync sync);\nGLAPI GLenum APIENTRY glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);\nGLAPI void APIENTRY glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);\nGLAPI void APIENTRY glGetInteger64v(GLenum pname, GLint64* data);\nGLAPI void APIENTRY glGetSynciv(GLsync sync, GLenum pname, GLsizei count, GLsizei* length, GLint* values);\nGLAPI void APIENTRY glGetInteger64i_v(GLenum target, GLuint index, GLint64* data);\nGLAPI void APIENTRY glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params);\nGLAPI void APIENTRY glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);\nGLAPI void APIENTRY glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height,\n                                            GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height,\n                                            GLsizei depth, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glGetMultisamplefv(GLenum pname, GLuint index, GLfloat* val);\nGLAPI void APIENTRY glSampleMaski(GLuint maskNumber, GLbitfield mask);\n#endif\n#endif /* GL_VERSION_3_2 */\n\n#ifndef GL_VERSION_3_3\n#define GL_VERSION_3_3 1\n#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE\n#define GL_SRC1_COLOR 0x88F9\n#define GL_ONE_MINUS_SRC1_COLOR 0x88FA\n#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB\n#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC\n#define GL_ANY_SAMPLES_PASSED 0x8C2F\n#define GL_SAMPLER_BINDING 0x8919\n#define GL_RGB10_A2UI 0x906F\n#define GL_TEXTURE_SWIZZLE_R 0x8E42\n#define GL_TEXTURE_SWIZZLE_G 0x8E43\n#define GL_TEXTURE_SWIZZLE_B 0x8E44\n#define GL_TEXTURE_SWIZZLE_A 0x8E45\n#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46\n#define GL_TIME_ELAPSED 0x88BF\n#define GL_TIMESTAMP 0x8E28\n#define GL_INT_2_10_10_10_REV 0x8D9F\ntypedef void(APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)(GLuint program, GLuint colorNumber, GLuint index, const GLchar* name);\ntypedef GLint(APIENTRYP PFNGLGETFRAGDATAINDEXPROC)(GLuint program, const GLchar* name);\ntypedef void(APIENTRYP PFNGLGENSAMPLERSPROC)(GLsizei count, GLuint* samplers);\ntypedef void(APIENTRYP PFNGLDELETESAMPLERSPROC)(GLsizei count, const GLuint* samplers);\ntypedef GLboolean(APIENTRYP PFNGLISSAMPLERPROC)(GLuint sampler);\ntypedef void(APIENTRYP PFNGLBINDSAMPLERPROC)(GLuint unit, GLuint sampler);\ntypedef void(APIENTRYP PFNGLSAMPLERPARAMETERIPROC)(GLuint sampler, GLenum pname, GLint param);\ntypedef void(APIENTRYP PFNGLSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, const GLint* param);\ntypedef void(APIENTRYP PFNGLSAMPLERPARAMETERFPROC)(GLuint sampler, GLenum pname, GLfloat param);\ntypedef void(APIENTRYP PFNGLSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, const GLfloat* param);\ntypedef void(APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, const GLint* param);\ntypedef void(APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, const GLuint* param);\ntypedef void(APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, GLuint* params);\ntypedef void(APIENTRYP PFNGLQUERYCOUNTERPROC)(GLuint id, GLenum target);\ntypedef void(APIENTRYP PFNGLGETQUERYOBJECTI64VPROC)(GLuint id, GLenum pname, GLint64* params);\ntypedef void(APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC)(GLuint id, GLenum pname, GLuint64* params);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC)(GLuint index, GLuint divisor);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBP1UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint* value);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBP2UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint* value);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBP3UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint* value);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBP4UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint* value);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar* name);\nGLAPI GLint APIENTRY glGetFragDataIndex(GLuint program, const GLchar* name);\nGLAPI void APIENTRY glGenSamplers(GLsizei count, GLuint* samplers);\nGLAPI void APIENTRY glDeleteSamplers(GLsizei count, const GLuint* samplers);\nGLAPI GLboolean APIENTRY glIsSampler(GLuint sampler);\nGLAPI void APIENTRY glBindSampler(GLuint unit, GLuint sampler);\nGLAPI void APIENTRY glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);\nGLAPI void APIENTRY glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param);\nGLAPI void APIENTRY glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param);\nGLAPI void APIENTRY glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint* param);\nGLAPI void APIENTRY glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint* param);\nGLAPI void APIENTRY glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params);\nGLAPI void APIENTRY glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint* params);\nGLAPI void APIENTRY glQueryCounter(GLuint id, GLenum target);\nGLAPI void APIENTRY glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64* params);\nGLAPI void APIENTRY glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64* params);\nGLAPI void APIENTRY glVertexAttribDivisor(GLuint index, GLuint divisor);\nGLAPI void APIENTRY glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);\nGLAPI void APIENTRY glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint* value);\nGLAPI void APIENTRY glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);\nGLAPI void APIENTRY glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint* value);\nGLAPI void APIENTRY glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);\nGLAPI void APIENTRY glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint* value);\nGLAPI void APIENTRY glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);\nGLAPI void APIENTRY glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint* value);\n#endif\n#endif /* GL_VERSION_3_3 */\n\n#ifndef GL_VERSION_4_0\n#define GL_VERSION_4_0 1\n#define GL_SAMPLE_SHADING 0x8C36\n#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37\n#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F\n#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009\n#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A\n#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B\n#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C\n#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D\n#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F\n#define GL_DRAW_INDIRECT_BUFFER 0x8F3F\n#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43\n#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F\n#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A\n#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B\n#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C\n#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D\n#define GL_MAX_VERTEX_STREAMS 0x8E71\n#define GL_DOUBLE_VEC2 0x8FFC\n#define GL_DOUBLE_VEC3 0x8FFD\n#define GL_DOUBLE_VEC4 0x8FFE\n#define GL_DOUBLE_MAT2 0x8F46\n#define GL_DOUBLE_MAT3 0x8F47\n#define GL_DOUBLE_MAT4 0x8F48\n#define GL_DOUBLE_MAT2x3 0x8F49\n#define GL_DOUBLE_MAT2x4 0x8F4A\n#define GL_DOUBLE_MAT3x2 0x8F4B\n#define GL_DOUBLE_MAT3x4 0x8F4C\n#define GL_DOUBLE_MAT4x2 0x8F4D\n#define GL_DOUBLE_MAT4x3 0x8F4E\n#define GL_ACTIVE_SUBROUTINES 0x8DE5\n#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6\n#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47\n#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48\n#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49\n#define GL_MAX_SUBROUTINES 0x8DE7\n#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8\n#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A\n#define GL_COMPATIBLE_SUBROUTINES 0x8E4B\n#define GL_PATCHES 0x000E\n#define GL_PATCH_VERTICES 0x8E72\n#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73\n#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74\n#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75\n#define GL_TESS_GEN_MODE 0x8E76\n#define GL_TESS_GEN_SPACING 0x8E77\n#define GL_TESS_GEN_VERTEX_ORDER 0x8E78\n#define GL_TESS_GEN_POINT_MODE 0x8E79\n#define GL_ISOLINES 0x8E7A\n#define GL_FRACTIONAL_ODD 0x8E7B\n#define GL_FRACTIONAL_EVEN 0x8E7C\n#define GL_MAX_PATCH_VERTICES 0x8E7D\n#define GL_MAX_TESS_GEN_LEVEL 0x8E7E\n#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F\n#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80\n#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81\n#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82\n#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83\n#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84\n#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85\n#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86\n#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89\n#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A\n#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C\n#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D\n#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E\n#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1\n#define GL_TESS_EVALUATION_SHADER 0x8E87\n#define GL_TESS_CONTROL_SHADER 0x8E88\n#define GL_TRANSFORM_FEEDBACK 0x8E22\n#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23\n#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24\n#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25\n#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70\ntypedef void(APIENTRYP PFNGLMINSAMPLESHADINGPROC)(GLfloat value);\ntypedef void(APIENTRYP PFNGLBLENDEQUATIONIPROC)(GLuint buf, GLenum mode);\ntypedef void(APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC)(GLuint buf, GLenum modeRGB, GLenum modeAlpha);\ntypedef void(APIENTRYP PFNGLBLENDFUNCIPROC)(GLuint buf, GLenum src, GLenum dst);\ntypedef void(APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\ntypedef void(APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC)(GLenum mode, const void* indirect);\ntypedef void(APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void* indirect);\ntypedef void(APIENTRYP PFNGLUNIFORM1DPROC)(GLint location, GLdouble x);\ntypedef void(APIENTRYP PFNGLUNIFORM2DPROC)(GLint location, GLdouble x, GLdouble y);\ntypedef void(APIENTRYP PFNGLUNIFORM3DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z);\ntypedef void(APIENTRYP PFNGLUNIFORM4DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void(APIENTRYP PFNGLUNIFORM1DVPROC)(GLint location, GLsizei count, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLUNIFORM2DVPROC)(GLint location, GLsizei count, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLUNIFORM3DVPROC)(GLint location, GLsizei count, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLUNIFORM4DVPROC)(GLint location, GLsizei count, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLGETUNIFORMDVPROC)(GLuint program, GLint location, GLdouble* params);\ntypedef GLint(APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)(GLuint program, GLenum shadertype, const GLchar* name);\ntypedef GLuint(APIENTRYP PFNGLGETSUBROUTINEINDEXPROC)(GLuint program, GLenum shadertype, const GLchar* name);\ntypedef void(APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values);\ntypedef void(APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize,\n                                                                GLsizei* length, GLchar* name);\ntypedef void(APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei* length,\n                                                         GLchar* name);\ntypedef void(APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC)(GLenum shadertype, GLsizei count, const GLuint* indices);\ntypedef void(APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC)(GLenum shadertype, GLint location, GLuint* params);\ntypedef void(APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC)(GLuint program, GLenum shadertype, GLenum pname, GLint* values);\ntypedef void(APIENTRYP PFNGLPATCHPARAMETERIPROC)(GLenum pname, GLint value);\ntypedef void(APIENTRYP PFNGLPATCHPARAMETERFVPROC)(GLenum pname, const GLfloat* values);\ntypedef void(APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC)(GLenum target, GLuint id);\ntypedef void(APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC)(GLsizei n, const GLuint* ids);\ntypedef void(APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC)(GLsizei n, GLuint* ids);\ntypedef GLboolean(APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC)(GLuint id);\ntypedef void(APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC)(void);\ntypedef void(APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC)(void);\ntypedef void(APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC)(GLenum mode, GLuint id);\ntypedef void(APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)(GLenum mode, GLuint id, GLuint stream);\ntypedef void(APIENTRYP PFNGLBEGINQUERYINDEXEDPROC)(GLenum target, GLuint index, GLuint id);\ntypedef void(APIENTRYP PFNGLENDQUERYINDEXEDPROC)(GLenum target, GLuint index);\ntypedef void(APIENTRYP PFNGLGETQUERYINDEXEDIVPROC)(GLenum target, GLuint index, GLenum pname, GLint* params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMinSampleShading(GLfloat value);\nGLAPI void APIENTRY glBlendEquationi(GLuint buf, GLenum mode);\nGLAPI void APIENTRY glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);\nGLAPI void APIENTRY glBlendFunci(GLuint buf, GLenum src, GLenum dst);\nGLAPI void APIENTRY glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\nGLAPI void APIENTRY glDrawArraysIndirect(GLenum mode, const void* indirect);\nGLAPI void APIENTRY glDrawElementsIndirect(GLenum mode, GLenum type, const void* indirect);\nGLAPI void APIENTRY glUniform1d(GLint location, GLdouble x);\nGLAPI void APIENTRY glUniform2d(GLint location, GLdouble x, GLdouble y);\nGLAPI void APIENTRY glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glUniform1dv(GLint location, GLsizei count, const GLdouble* value);\nGLAPI void APIENTRY glUniform2dv(GLint location, GLsizei count, const GLdouble* value);\nGLAPI void APIENTRY glUniform3dv(GLint location, GLsizei count, const GLdouble* value);\nGLAPI void APIENTRY glUniform4dv(GLint location, GLsizei count, const GLdouble* value);\nGLAPI void APIENTRY glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glGetUniformdv(GLuint program, GLint location, GLdouble* params);\nGLAPI GLint APIENTRY glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar* name);\nGLAPI GLuint APIENTRY glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar* name);\nGLAPI void APIENTRY glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values);\nGLAPI void APIENTRY glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei* length,\n                                                     GLchar* name);\nGLAPI void APIENTRY glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei* length, GLchar* name);\nGLAPI void APIENTRY glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint* indices);\nGLAPI void APIENTRY glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint* params);\nGLAPI void APIENTRY glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint* values);\nGLAPI void APIENTRY glPatchParameteri(GLenum pname, GLint value);\nGLAPI void APIENTRY glPatchParameterfv(GLenum pname, const GLfloat* values);\nGLAPI void APIENTRY glBindTransformFeedback(GLenum target, GLuint id);\nGLAPI void APIENTRY glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids);\nGLAPI void APIENTRY glGenTransformFeedbacks(GLsizei n, GLuint* ids);\nGLAPI GLboolean APIENTRY glIsTransformFeedback(GLuint id);\nGLAPI void APIENTRY glPauseTransformFeedback(void);\nGLAPI void APIENTRY glResumeTransformFeedback(void);\nGLAPI void APIENTRY glDrawTransformFeedback(GLenum mode, GLuint id);\nGLAPI void APIENTRY glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);\nGLAPI void APIENTRY glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);\nGLAPI void APIENTRY glEndQueryIndexed(GLenum target, GLuint index);\nGLAPI void APIENTRY glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint* params);\n#endif\n#endif /* GL_VERSION_4_0 */\n\n#ifndef GL_VERSION_4_1\n#define GL_VERSION_4_1 1\n#define GL_FIXED 0x140C\n#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A\n#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B\n#define GL_LOW_FLOAT 0x8DF0\n#define GL_MEDIUM_FLOAT 0x8DF1\n#define GL_HIGH_FLOAT 0x8DF2\n#define GL_LOW_INT 0x8DF3\n#define GL_MEDIUM_INT 0x8DF4\n#define GL_HIGH_INT 0x8DF5\n#define GL_SHADER_COMPILER 0x8DFA\n#define GL_SHADER_BINARY_FORMATS 0x8DF8\n#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9\n#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB\n#define GL_MAX_VARYING_VECTORS 0x8DFC\n#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD\n#define GL_RGB565 0x8D62\n#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257\n#define GL_PROGRAM_BINARY_LENGTH 0x8741\n#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE\n#define GL_PROGRAM_BINARY_FORMATS 0x87FF\n#define GL_VERTEX_SHADER_BIT 0x00000001\n#define GL_FRAGMENT_SHADER_BIT 0x00000002\n#define GL_GEOMETRY_SHADER_BIT 0x00000004\n#define GL_TESS_CONTROL_SHADER_BIT 0x00000008\n#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010\n#define GL_ALL_SHADER_BITS 0xFFFFFFFF\n#define GL_PROGRAM_SEPARABLE 0x8258\n#define GL_ACTIVE_PROGRAM 0x8259\n#define GL_PROGRAM_PIPELINE_BINDING 0x825A\n#define GL_MAX_VIEWPORTS 0x825B\n#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C\n#define GL_VIEWPORT_BOUNDS_RANGE 0x825D\n#define GL_LAYER_PROVOKING_VERTEX 0x825E\n#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F\n#define GL_UNDEFINED_VERTEX 0x8260\ntypedef void(APIENTRYP PFNGLRELEASESHADERCOMPILERPROC)(void);\ntypedef void(APIENTRYP PFNGLSHADERBINARYPROC)(GLsizei count, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length);\ntypedef void(APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC)(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);\ntypedef void(APIENTRYP PFNGLDEPTHRANGEFPROC)(GLfloat n, GLfloat f);\ntypedef void(APIENTRYP PFNGLCLEARDEPTHFPROC)(GLfloat d);\ntypedef void(APIENTRYP PFNGLGETPROGRAMBINARYPROC)(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, void* binary);\ntypedef void(APIENTRYP PFNGLPROGRAMBINARYPROC)(GLuint program, GLenum binaryFormat, const void* binary, GLsizei length);\ntypedef void(APIENTRYP PFNGLPROGRAMPARAMETERIPROC)(GLuint program, GLenum pname, GLint value);\ntypedef void(APIENTRYP PFNGLUSEPROGRAMSTAGESPROC)(GLuint pipeline, GLbitfield stages, GLuint program);\ntypedef void(APIENTRYP PFNGLACTIVESHADERPROGRAMPROC)(GLuint pipeline, GLuint program);\ntypedef GLuint(APIENTRYP PFNGLCREATESHADERPROGRAMVPROC)(GLenum type, GLsizei count, const GLchar* const* strings);\ntypedef void(APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC)(GLuint pipeline);\ntypedef void(APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC)(GLsizei n, const GLuint* pipelines);\ntypedef void(APIENTRYP PFNGLGENPROGRAMPIPELINESPROC)(GLsizei n, GLuint* pipelines);\ntypedef GLboolean(APIENTRYP PFNGLISPROGRAMPIPELINEPROC)(GLuint pipeline);\ntypedef void(APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC)(GLuint pipeline, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1IPROC)(GLuint program, GLint location, GLint v0);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC)(GLuint program, GLint location, GLsizei count, const GLint* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1FPROC)(GLuint program, GLint location, GLfloat v0);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1DPROC)(GLuint program, GLint location, GLdouble v0);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC)(GLuint program, GLint location, GLuint v0);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2IPROC)(GLuint program, GLint location, GLint v0, GLint v1);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC)(GLuint program, GLint location, GLsizei count, const GLint* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC)(GLuint program, GLint location, GLsizei count, const GLint* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC)(GLuint program, GLint location, GLsizei count, const GLint* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                           const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                           const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                           const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                           const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                           const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                           const GLdouble* value);\ntypedef void(APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC)(GLuint pipeline);\ntypedef void(APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC)(GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar* infoLog);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL1DPROC)(GLuint index, GLdouble x);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL2DPROC)(GLuint index, GLdouble x, GLdouble y);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL1DVPROC)(GLuint index, const GLdouble* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL2DVPROC)(GLuint index, const GLdouble* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL3DVPROC)(GLuint index, const GLdouble* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL4DVPROC)(GLuint index, const GLdouble* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer);\ntypedef void(APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC)(GLuint index, GLenum pname, GLdouble* params);\ntypedef void(APIENTRYP PFNGLVIEWPORTARRAYVPROC)(GLuint first, GLsizei count, const GLfloat* v);\ntypedef void(APIENTRYP PFNGLVIEWPORTINDEXEDFPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);\ntypedef void(APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC)(GLuint index, const GLfloat* v);\ntypedef void(APIENTRYP PFNGLSCISSORARRAYVPROC)(GLuint first, GLsizei count, const GLint* v);\ntypedef void(APIENTRYP PFNGLSCISSORINDEXEDPROC)(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLSCISSORINDEXEDVPROC)(GLuint index, const GLint* v);\ntypedef void(APIENTRYP PFNGLDEPTHRANGEARRAYVPROC)(GLuint first, GLsizei count, const GLdouble* v);\ntypedef void(APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC)(GLuint index, GLdouble n, GLdouble f);\ntypedef void(APIENTRYP PFNGLGETFLOATI_VPROC)(GLenum target, GLuint index, GLfloat* data);\ntypedef void(APIENTRYP PFNGLGETDOUBLEI_VPROC)(GLenum target, GLuint index, GLdouble* data);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glReleaseShaderCompiler(void);\nGLAPI void APIENTRY glShaderBinary(GLsizei count, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length);\nGLAPI void APIENTRY glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);\nGLAPI void APIENTRY glDepthRangef(GLfloat n, GLfloat f);\nGLAPI void APIENTRY glClearDepthf(GLfloat d);\nGLAPI void APIENTRY glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, void* binary);\nGLAPI void APIENTRY glProgramBinary(GLuint program, GLenum binaryFormat, const void* binary, GLsizei length);\nGLAPI void APIENTRY glProgramParameteri(GLuint program, GLenum pname, GLint value);\nGLAPI void APIENTRY glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);\nGLAPI void APIENTRY glActiveShaderProgram(GLuint pipeline, GLuint program);\nGLAPI GLuint APIENTRY glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const* strings);\nGLAPI void APIENTRY glBindProgramPipeline(GLuint pipeline);\nGLAPI void APIENTRY glDeleteProgramPipelines(GLsizei n, const GLuint* pipelines);\nGLAPI void APIENTRY glGenProgramPipelines(GLsizei n, GLuint* pipelines);\nGLAPI GLboolean APIENTRY glIsProgramPipeline(GLuint pipeline);\nGLAPI void APIENTRY glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint* params);\nGLAPI void APIENTRY glProgramUniform1i(GLuint program, GLint location, GLint v0);\nGLAPI void APIENTRY glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint* value);\nGLAPI void APIENTRY glProgramUniform1f(GLuint program, GLint location, GLfloat v0);\nGLAPI void APIENTRY glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniform1d(GLuint program, GLint location, GLdouble v0);\nGLAPI void APIENTRY glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniform1ui(GLuint program, GLint location, GLuint v0);\nGLAPI void APIENTRY glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint* value);\nGLAPI void APIENTRY glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);\nGLAPI void APIENTRY glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint* value);\nGLAPI void APIENTRY glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);\nGLAPI void APIENTRY glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);\nGLAPI void APIENTRY glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);\nGLAPI void APIENTRY glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint* value);\nGLAPI void APIENTRY glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);\nGLAPI void APIENTRY glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint* value);\nGLAPI void APIENTRY glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\nGLAPI void APIENTRY glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);\nGLAPI void APIENTRY glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);\nGLAPI void APIENTRY glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint* value);\nGLAPI void APIENTRY glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\nGLAPI void APIENTRY glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint* value);\nGLAPI void APIENTRY glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\nGLAPI void APIENTRY glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);\nGLAPI void APIENTRY glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\nGLAPI void APIENTRY glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint* value);\nGLAPI void APIENTRY glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glValidateProgramPipeline(GLuint pipeline);\nGLAPI void APIENTRY glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar* infoLog);\nGLAPI void APIENTRY glVertexAttribL1d(GLuint index, GLdouble x);\nGLAPI void APIENTRY glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);\nGLAPI void APIENTRY glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glVertexAttribL1dv(GLuint index, const GLdouble* v);\nGLAPI void APIENTRY glVertexAttribL2dv(GLuint index, const GLdouble* v);\nGLAPI void APIENTRY glVertexAttribL3dv(GLuint index, const GLdouble* v);\nGLAPI void APIENTRY glVertexAttribL4dv(GLuint index, const GLdouble* v);\nGLAPI void APIENTRY glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer);\nGLAPI void APIENTRY glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble* params);\nGLAPI void APIENTRY glViewportArrayv(GLuint first, GLsizei count, const GLfloat* v);\nGLAPI void APIENTRY glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);\nGLAPI void APIENTRY glViewportIndexedfv(GLuint index, const GLfloat* v);\nGLAPI void APIENTRY glScissorArrayv(GLuint first, GLsizei count, const GLint* v);\nGLAPI void APIENTRY glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glScissorIndexedv(GLuint index, const GLint* v);\nGLAPI void APIENTRY glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble* v);\nGLAPI void APIENTRY glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);\nGLAPI void APIENTRY glGetFloati_v(GLenum target, GLuint index, GLfloat* data);\nGLAPI void APIENTRY glGetDoublei_v(GLenum target, GLuint index, GLdouble* data);\n#endif\n#endif /* GL_VERSION_4_1 */\n\n#ifndef GL_VERSION_4_2\n#define GL_VERSION_4_2 1\n#define GL_COPY_READ_BUFFER_BINDING 0x8F36\n#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37\n#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24\n#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23\n#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127\n#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128\n#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129\n#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A\n#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B\n#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C\n#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D\n#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E\n#define GL_NUM_SAMPLE_COUNTS 0x9380\n#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC\n#define GL_ATOMIC_COUNTER_BUFFER 0x92C0\n#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1\n#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2\n#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3\n#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4\n#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5\n#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB\n#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC\n#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD\n#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE\n#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF\n#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0\n#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1\n#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2\n#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3\n#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4\n#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5\n#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6\n#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7\n#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8\n#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC\n#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9\n#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA\n#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB\n#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001\n#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002\n#define GL_UNIFORM_BARRIER_BIT 0x00000004\n#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008\n#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020\n#define GL_COMMAND_BARRIER_BIT 0x00000040\n#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080\n#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100\n#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200\n#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400\n#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800\n#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000\n#define GL_ALL_BARRIER_BITS 0xFFFFFFFF\n#define GL_MAX_IMAGE_UNITS 0x8F38\n#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39\n#define GL_IMAGE_BINDING_NAME 0x8F3A\n#define GL_IMAGE_BINDING_LEVEL 0x8F3B\n#define GL_IMAGE_BINDING_LAYERED 0x8F3C\n#define GL_IMAGE_BINDING_LAYER 0x8F3D\n#define GL_IMAGE_BINDING_ACCESS 0x8F3E\n#define GL_IMAGE_1D 0x904C\n#define GL_IMAGE_2D 0x904D\n#define GL_IMAGE_3D 0x904E\n#define GL_IMAGE_2D_RECT 0x904F\n#define GL_IMAGE_CUBE 0x9050\n#define GL_IMAGE_BUFFER 0x9051\n#define GL_IMAGE_1D_ARRAY 0x9052\n#define GL_IMAGE_2D_ARRAY 0x9053\n#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054\n#define GL_IMAGE_2D_MULTISAMPLE 0x9055\n#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056\n#define GL_INT_IMAGE_1D 0x9057\n#define GL_INT_IMAGE_2D 0x9058\n#define GL_INT_IMAGE_3D 0x9059\n#define GL_INT_IMAGE_2D_RECT 0x905A\n#define GL_INT_IMAGE_CUBE 0x905B\n#define GL_INT_IMAGE_BUFFER 0x905C\n#define GL_INT_IMAGE_1D_ARRAY 0x905D\n#define GL_INT_IMAGE_2D_ARRAY 0x905E\n#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F\n#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060\n#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061\n#define GL_UNSIGNED_INT_IMAGE_1D 0x9062\n#define GL_UNSIGNED_INT_IMAGE_2D 0x9063\n#define GL_UNSIGNED_INT_IMAGE_3D 0x9064\n#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065\n#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066\n#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067\n#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068\n#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069\n#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C\n#define GL_MAX_IMAGE_SAMPLES 0x906D\n#define GL_IMAGE_BINDING_FORMAT 0x906E\n#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7\n#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8\n#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9\n#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA\n#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB\n#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC\n#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD\n#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE\n#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF\n#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C\n#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D\n#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E\n#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F\n#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F\ntypedef void(APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);\ntypedef void(APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void* indices,\n                                                                   GLsizei instancecount, GLuint baseinstance);\ntypedef void(APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void* indices,\n                                                                             GLsizei instancecount, GLint basevertex, GLuint baseinstance);\ntypedef void(APIENTRYP PFNGLGETINTERNALFORMATIVPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint* params);\ntypedef void(APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)(GLuint program, GLuint bufferIndex, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLBINDIMAGETEXTUREPROC)(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access,\n                                                  GLenum format);\ntypedef void(APIENTRYP PFNGLMEMORYBARRIERPROC)(GLbitfield barriers);\ntypedef void(APIENTRYP PFNGLTEXSTORAGE1DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\ntypedef void(APIENTRYP PFNGLTEXSTORAGE2DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLTEXSTORAGE3DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\ntypedef void(APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)(GLenum mode, GLuint id, GLsizei instancecount);\ntypedef void(APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);\nGLAPI void APIENTRY glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount,\n                                                        GLuint baseinstance);\nGLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void* indices,\n                                                                  GLsizei instancecount, GLint basevertex, GLuint baseinstance);\nGLAPI void APIENTRY glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint* params);\nGLAPI void APIENTRY glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint* params);\nGLAPI void APIENTRY glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);\nGLAPI void APIENTRY glMemoryBarrier(GLbitfield barriers);\nGLAPI void APIENTRY glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\nGLAPI void APIENTRY glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\nGLAPI void APIENTRY glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);\nGLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);\n#endif\n#endif /* GL_VERSION_4_2 */\n\n#ifndef GL_VERSION_4_3\n#define GL_VERSION_4_3 1\ntypedef void(APIENTRY* GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message,\n                                    const void* userParam);\n#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9\n#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E\n#define GL_COMPRESSED_RGB8_ETC2 0x9274\n#define GL_COMPRESSED_SRGB8_ETC2 0x9275\n#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276\n#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277\n#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278\n#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279\n#define GL_COMPRESSED_R11_EAC 0x9270\n#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271\n#define GL_COMPRESSED_RG11_EAC 0x9272\n#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273\n#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69\n#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A\n#define GL_MAX_ELEMENT_INDEX 0x8D6B\n#define GL_COMPUTE_SHADER 0x91B9\n#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB\n#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC\n#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD\n#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262\n#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263\n#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264\n#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265\n#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266\n#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB\n#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE\n#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF\n#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED\n#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE\n#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF\n#define GL_COMPUTE_SHADER_BIT 0x00000020\n#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242\n#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243\n#define GL_DEBUG_CALLBACK_FUNCTION 0x8244\n#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245\n#define GL_DEBUG_SOURCE_API 0x8246\n#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247\n#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248\n#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249\n#define GL_DEBUG_SOURCE_APPLICATION 0x824A\n#define GL_DEBUG_SOURCE_OTHER 0x824B\n#define GL_DEBUG_TYPE_ERROR 0x824C\n#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D\n#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E\n#define GL_DEBUG_TYPE_PORTABILITY 0x824F\n#define GL_DEBUG_TYPE_PERFORMANCE 0x8250\n#define GL_DEBUG_TYPE_OTHER 0x8251\n#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143\n#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144\n#define GL_DEBUG_LOGGED_MESSAGES 0x9145\n#define GL_DEBUG_SEVERITY_HIGH 0x9146\n#define GL_DEBUG_SEVERITY_MEDIUM 0x9147\n#define GL_DEBUG_SEVERITY_LOW 0x9148\n#define GL_DEBUG_TYPE_MARKER 0x8268\n#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269\n#define GL_DEBUG_TYPE_POP_GROUP 0x826A\n#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B\n#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C\n#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D\n#define GL_BUFFER 0x82E0\n#define GL_SHADER 0x82E1\n#define GL_PROGRAM 0x82E2\n#define GL_QUERY 0x82E3\n#define GL_PROGRAM_PIPELINE 0x82E4\n#define GL_SAMPLER 0x82E6\n#define GL_MAX_LABEL_LENGTH 0x82E8\n#define GL_DEBUG_OUTPUT 0x92E0\n#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002\n#define GL_MAX_UNIFORM_LOCATIONS 0x826E\n#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310\n#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311\n#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312\n#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313\n#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314\n#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315\n#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316\n#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317\n#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318\n#define GL_INTERNALFORMAT_SUPPORTED 0x826F\n#define GL_INTERNALFORMAT_PREFERRED 0x8270\n#define GL_INTERNALFORMAT_RED_SIZE 0x8271\n#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272\n#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273\n#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274\n#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275\n#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276\n#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277\n#define GL_INTERNALFORMAT_RED_TYPE 0x8278\n#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279\n#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A\n#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B\n#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C\n#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D\n#define GL_MAX_WIDTH 0x827E\n#define GL_MAX_HEIGHT 0x827F\n#define GL_MAX_DEPTH 0x8280\n#define GL_MAX_LAYERS 0x8281\n#define GL_MAX_COMBINED_DIMENSIONS 0x8282\n#define GL_COLOR_COMPONENTS 0x8283\n#define GL_DEPTH_COMPONENTS 0x8284\n#define GL_STENCIL_COMPONENTS 0x8285\n#define GL_COLOR_RENDERABLE 0x8286\n#define GL_DEPTH_RENDERABLE 0x8287\n#define GL_STENCIL_RENDERABLE 0x8288\n#define GL_FRAMEBUFFER_RENDERABLE 0x8289\n#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A\n#define GL_FRAMEBUFFER_BLEND 0x828B\n#define GL_READ_PIXELS 0x828C\n#define GL_READ_PIXELS_FORMAT 0x828D\n#define GL_READ_PIXELS_TYPE 0x828E\n#define GL_TEXTURE_IMAGE_FORMAT 0x828F\n#define GL_TEXTURE_IMAGE_TYPE 0x8290\n#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291\n#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292\n#define GL_MIPMAP 0x8293\n#define GL_MANUAL_GENERATE_MIPMAP 0x8294\n#define GL_AUTO_GENERATE_MIPMAP 0x8295\n#define GL_COLOR_ENCODING 0x8296\n#define GL_SRGB_READ 0x8297\n#define GL_SRGB_WRITE 0x8298\n#define GL_FILTER 0x829A\n#define GL_VERTEX_TEXTURE 0x829B\n#define GL_TESS_CONTROL_TEXTURE 0x829C\n#define GL_TESS_EVALUATION_TEXTURE 0x829D\n#define GL_GEOMETRY_TEXTURE 0x829E\n#define GL_FRAGMENT_TEXTURE 0x829F\n#define GL_COMPUTE_TEXTURE 0x82A0\n#define GL_TEXTURE_SHADOW 0x82A1\n#define GL_TEXTURE_GATHER 0x82A2\n#define GL_TEXTURE_GATHER_SHADOW 0x82A3\n#define GL_SHADER_IMAGE_LOAD 0x82A4\n#define GL_SHADER_IMAGE_STORE 0x82A5\n#define GL_SHADER_IMAGE_ATOMIC 0x82A6\n#define GL_IMAGE_TEXEL_SIZE 0x82A7\n#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8\n#define GL_IMAGE_PIXEL_FORMAT 0x82A9\n#define GL_IMAGE_PIXEL_TYPE 0x82AA\n#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC\n#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD\n#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE\n#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF\n#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1\n#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2\n#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3\n#define GL_CLEAR_BUFFER 0x82B4\n#define GL_TEXTURE_VIEW 0x82B5\n#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6\n#define GL_FULL_SUPPORT 0x82B7\n#define GL_CAVEAT_SUPPORT 0x82B8\n#define GL_IMAGE_CLASS_4_X_32 0x82B9\n#define GL_IMAGE_CLASS_2_X_32 0x82BA\n#define GL_IMAGE_CLASS_1_X_32 0x82BB\n#define GL_IMAGE_CLASS_4_X_16 0x82BC\n#define GL_IMAGE_CLASS_2_X_16 0x82BD\n#define GL_IMAGE_CLASS_1_X_16 0x82BE\n#define GL_IMAGE_CLASS_4_X_8 0x82BF\n#define GL_IMAGE_CLASS_2_X_8 0x82C0\n#define GL_IMAGE_CLASS_1_X_8 0x82C1\n#define GL_IMAGE_CLASS_11_11_10 0x82C2\n#define GL_IMAGE_CLASS_10_10_10_2 0x82C3\n#define GL_VIEW_CLASS_128_BITS 0x82C4\n#define GL_VIEW_CLASS_96_BITS 0x82C5\n#define GL_VIEW_CLASS_64_BITS 0x82C6\n#define GL_VIEW_CLASS_48_BITS 0x82C7\n#define GL_VIEW_CLASS_32_BITS 0x82C8\n#define GL_VIEW_CLASS_24_BITS 0x82C9\n#define GL_VIEW_CLASS_16_BITS 0x82CA\n#define GL_VIEW_CLASS_8_BITS 0x82CB\n#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC\n#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD\n#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE\n#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF\n#define GL_VIEW_CLASS_RGTC1_RED 0x82D0\n#define GL_VIEW_CLASS_RGTC2_RG 0x82D1\n#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2\n#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3\n#define GL_UNIFORM 0x92E1\n#define GL_UNIFORM_BLOCK 0x92E2\n#define GL_PROGRAM_INPUT 0x92E3\n#define GL_PROGRAM_OUTPUT 0x92E4\n#define GL_BUFFER_VARIABLE 0x92E5\n#define GL_SHADER_STORAGE_BLOCK 0x92E6\n#define GL_VERTEX_SUBROUTINE 0x92E8\n#define GL_TESS_CONTROL_SUBROUTINE 0x92E9\n#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA\n#define GL_GEOMETRY_SUBROUTINE 0x92EB\n#define GL_FRAGMENT_SUBROUTINE 0x92EC\n#define GL_COMPUTE_SUBROUTINE 0x92ED\n#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE\n#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF\n#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0\n#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1\n#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2\n#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3\n#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4\n#define GL_ACTIVE_RESOURCES 0x92F5\n#define GL_MAX_NAME_LENGTH 0x92F6\n#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7\n#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8\n#define GL_NAME_LENGTH 0x92F9\n#define GL_TYPE 0x92FA\n#define GL_ARRAY_SIZE 0x92FB\n#define GL_OFFSET 0x92FC\n#define GL_BLOCK_INDEX 0x92FD\n#define GL_ARRAY_STRIDE 0x92FE\n#define GL_MATRIX_STRIDE 0x92FF\n#define GL_IS_ROW_MAJOR 0x9300\n#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301\n#define GL_BUFFER_BINDING 0x9302\n#define GL_BUFFER_DATA_SIZE 0x9303\n#define GL_NUM_ACTIVE_VARIABLES 0x9304\n#define GL_ACTIVE_VARIABLES 0x9305\n#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306\n#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307\n#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308\n#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309\n#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A\n#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B\n#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C\n#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D\n#define GL_LOCATION 0x930E\n#define GL_LOCATION_INDEX 0x930F\n#define GL_IS_PER_PATCH 0x92E7\n#define GL_SHADER_STORAGE_BUFFER 0x90D2\n#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3\n#define GL_SHADER_STORAGE_BUFFER_START 0x90D4\n#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5\n#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6\n#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7\n#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8\n#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9\n#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA\n#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB\n#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC\n#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD\n#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE\n#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF\n#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000\n#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39\n#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA\n#define GL_TEXTURE_BUFFER_OFFSET 0x919D\n#define GL_TEXTURE_BUFFER_SIZE 0x919E\n#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F\n#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB\n#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC\n#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD\n#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE\n#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF\n#define GL_VERTEX_ATTRIB_BINDING 0x82D4\n#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5\n#define GL_VERTEX_BINDING_DIVISOR 0x82D6\n#define GL_VERTEX_BINDING_OFFSET 0x82D7\n#define GL_VERTEX_BINDING_STRIDE 0x82D8\n#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9\n#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA\n#define GL_VERTEX_BINDING_BUFFER 0x8F4F\ntypedef void(APIENTRYP PFNGLCLEARBUFFERDATAPROC)(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void* data);\ntypedef void(APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC)(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format,\n                                                    GLenum type, const void* data);\ntypedef void(APIENTRYP PFNGLDISPATCHCOMPUTEPROC)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);\ntypedef void(APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC)(GLintptr indirect);\ntypedef void(APIENTRYP PFNGLCOPYIMAGESUBDATAPROC)(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ,\n                                                  GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ,\n                                                  GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC)(GLenum target, GLenum pname, GLint param);\ntypedef void(APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETINTERNALFORMATI64VPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint64* params);\ntypedef void(APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,\n                                                       GLsizei width, GLsizei height, GLsizei depth);\ntypedef void(APIENTRYP PFNGLINVALIDATETEXIMAGEPROC)(GLuint texture, GLint level);\ntypedef void(APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length);\ntypedef void(APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer);\ntypedef void(APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum* attachments);\ntypedef void(APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x,\n                                                          GLint y, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC)(GLenum mode, const void* indirect, GLsizei drawcount, GLsizei stride);\ntypedef void(APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void* indirect, GLsizei drawcount, GLsizei stride);\ntypedef void(APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC)(GLuint program, GLenum programInterface, GLenum pname, GLint* params);\ntypedef GLuint(APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC)(GLuint program, GLenum programInterface, const GLchar* name);\ntypedef void(APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize,\n                                                        GLsizei* length, GLchar* name);\ntypedef void(APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount,\n                                                      const GLenum* props, GLsizei count, GLsizei* length, GLint* params);\ntypedef GLint(APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC)(GLuint program, GLenum programInterface, const GLchar* name);\ntypedef GLint(APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)(GLuint program, GLenum programInterface, const GLchar* name);\ntypedef void(APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC)(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);\ntypedef void(APIENTRYP PFNGLTEXBUFFERRANGEPROC)(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);\ntypedef void(APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width,\n                                                         GLsizei height, GLboolean fixedsamplelocations);\ntypedef void(APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width,\n                                                         GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\ntypedef void(APIENTRYP PFNGLTEXTUREVIEWPROC)(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel,\n                                             GLuint numlevels, GLuint minlayer, GLuint numlayers);\ntypedef void(APIENTRYP PFNGLBINDVERTEXBUFFERPROC)(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC)(GLuint attribindex, GLuint bindingindex);\ntypedef void(APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC)(GLuint bindingindex, GLuint divisor);\ntypedef void(APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids,\n                                                     GLboolean enabled);\ntypedef void(APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf);\ntypedef void(APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC callback, const void* userParam);\ntypedef GLuint(APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC)(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids,\n                                                      GLenum* severities, GLsizei* lengths, GLchar* messageLog);\ntypedef void(APIENTRYP PFNGLPUSHDEBUGGROUPPROC)(GLenum source, GLuint id, GLsizei length, const GLchar* message);\ntypedef void(APIENTRYP PFNGLPOPDEBUGGROUPPROC)(void);\ntypedef void(APIENTRYP PFNGLOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar* label);\ntypedef void(APIENTRYP PFNGLGETOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar* label);\ntypedef void(APIENTRYP PFNGLOBJECTPTRLABELPROC)(const void* ptr, GLsizei length, const GLchar* label);\ntypedef void(APIENTRYP PFNGLGETOBJECTPTRLABELPROC)(const void* ptr, GLsizei bufSize, GLsizei* length, GLchar* label);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void* data);\nGLAPI void APIENTRY glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type,\n                                         const void* data);\nGLAPI void APIENTRY glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);\nGLAPI void APIENTRY glDispatchComputeIndirect(GLintptr indirect);\nGLAPI void APIENTRY glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName,\n                                       GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth,\n                                       GLsizei srcHeight, GLsizei srcDepth);\nGLAPI void APIENTRY glFramebufferParameteri(GLenum target, GLenum pname, GLint param);\nGLAPI void APIENTRY glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint64* params);\nGLAPI void APIENTRY glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,\n                                            GLsizei height, GLsizei depth);\nGLAPI void APIENTRY glInvalidateTexImage(GLuint texture, GLint level);\nGLAPI void APIENTRY glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length);\nGLAPI void APIENTRY glInvalidateBufferData(GLuint buffer);\nGLAPI void APIENTRY glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments);\nGLAPI void APIENTRY glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y,\n                                               GLsizei width, GLsizei height);\nGLAPI void APIENTRY glMultiDrawArraysIndirect(GLenum mode, const void* indirect, GLsizei drawcount, GLsizei stride);\nGLAPI void APIENTRY glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void* indirect, GLsizei drawcount, GLsizei stride);\nGLAPI void APIENTRY glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint* params);\nGLAPI GLuint APIENTRY glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar* name);\nGLAPI void APIENTRY glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, GLchar* name);\nGLAPI void APIENTRY glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props,\n                                           GLsizei count, GLsizei* length, GLint* params);\nGLAPI GLint APIENTRY glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar* name);\nGLAPI GLint APIENTRY glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar* name);\nGLAPI void APIENTRY glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);\nGLAPI void APIENTRY glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);\nGLAPI void APIENTRY glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height,\n                                              GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height,\n                                              GLsizei depth, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel,\n                                  GLuint numlevels, GLuint minlayer, GLuint numlayers);\nGLAPI void APIENTRY glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\nGLAPI void APIENTRY glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexAttribBinding(GLuint attribindex, GLuint bindingindex);\nGLAPI void APIENTRY glVertexBindingDivisor(GLuint bindingindex, GLuint divisor);\nGLAPI void APIENTRY glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled);\nGLAPI void APIENTRY glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf);\nGLAPI void APIENTRY glDebugMessageCallback(GLDEBUGPROC callback, const void* userParam);\nGLAPI GLuint APIENTRY glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities,\n                                           GLsizei* lengths, GLchar* messageLog);\nGLAPI void APIENTRY glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar* message);\nGLAPI void APIENTRY glPopDebugGroup(void);\nGLAPI void APIENTRY glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar* label);\nGLAPI void APIENTRY glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar* label);\nGLAPI void APIENTRY glObjectPtrLabel(const void* ptr, GLsizei length, const GLchar* label);\nGLAPI void APIENTRY glGetObjectPtrLabel(const void* ptr, GLsizei bufSize, GLsizei* length, GLchar* label);\n#endif\n#endif /* GL_VERSION_4_3 */\n\n#ifndef GL_VERSION_4_4\n#define GL_VERSION_4_4 1\n#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5\n#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221\n#define GL_TEXTURE_BUFFER_BINDING 0x8C2A\n#define GL_MAP_PERSISTENT_BIT 0x0040\n#define GL_MAP_COHERENT_BIT 0x0080\n#define GL_DYNAMIC_STORAGE_BIT 0x0100\n#define GL_CLIENT_STORAGE_BIT 0x0200\n#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000\n#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F\n#define GL_BUFFER_STORAGE_FLAGS 0x8220\n#define GL_CLEAR_TEXTURE 0x9365\n#define GL_LOCATION_COMPONENT 0x934A\n#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B\n#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C\n#define GL_QUERY_BUFFER 0x9192\n#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000\n#define GL_QUERY_BUFFER_BINDING 0x9193\n#define GL_QUERY_RESULT_NO_WAIT 0x9194\n#define GL_MIRROR_CLAMP_TO_EDGE 0x8743\ntypedef void(APIENTRYP PFNGLBUFFERSTORAGEPROC)(GLenum target, GLsizeiptr size, const void* data, GLbitfield flags);\ntypedef void(APIENTRYP PFNGLCLEARTEXIMAGEPROC)(GLuint texture, GLint level, GLenum format, GLenum type, const void* data);\ntypedef void(APIENTRYP PFNGLCLEARTEXSUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,\n                                                  GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* data);\ntypedef void(APIENTRYP PFNGLBINDBUFFERSBASEPROC)(GLenum target, GLuint first, GLsizei count, const GLuint* buffers);\ntypedef void(APIENTRYP PFNGLBINDBUFFERSRANGEPROC)(GLenum target, GLuint first, GLsizei count, const GLuint* buffers,\n                                                  const GLintptr* offsets, const GLsizeiptr* sizes);\ntypedef void(APIENTRYP PFNGLBINDTEXTURESPROC)(GLuint first, GLsizei count, const GLuint* textures);\ntypedef void(APIENTRYP PFNGLBINDSAMPLERSPROC)(GLuint first, GLsizei count, const GLuint* samplers);\ntypedef void(APIENTRYP PFNGLBINDIMAGETEXTURESPROC)(GLuint first, GLsizei count, const GLuint* textures);\ntypedef void(APIENTRYP PFNGLBINDVERTEXBUFFERSPROC)(GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets,\n                                                   const GLsizei* strides);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBufferStorage(GLenum target, GLsizeiptr size, const void* data, GLbitfield flags);\nGLAPI void APIENTRY glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void* data);\nGLAPI void APIENTRY glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,\n                                       GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* data);\nGLAPI void APIENTRY glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint* buffers);\nGLAPI void APIENTRY glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets,\n                                       const GLsizeiptr* sizes);\nGLAPI void APIENTRY glBindTextures(GLuint first, GLsizei count, const GLuint* textures);\nGLAPI void APIENTRY glBindSamplers(GLuint first, GLsizei count, const GLuint* samplers);\nGLAPI void APIENTRY glBindImageTextures(GLuint first, GLsizei count, const GLuint* textures);\nGLAPI void APIENTRY glBindVertexBuffers(GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets, const GLsizei* strides);\n#endif\n#endif /* GL_VERSION_4_4 */\n\n#ifndef GL_VERSION_4_5\n#define GL_VERSION_4_5 1\n#define GL_CONTEXT_LOST 0x0507\n#define GL_NEGATIVE_ONE_TO_ONE 0x935E\n#define GL_ZERO_TO_ONE 0x935F\n#define GL_CLIP_ORIGIN 0x935C\n#define GL_CLIP_DEPTH_MODE 0x935D\n#define GL_QUERY_WAIT_INVERTED 0x8E17\n#define GL_QUERY_NO_WAIT_INVERTED 0x8E18\n#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19\n#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A\n#define GL_MAX_CULL_DISTANCES 0x82F9\n#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA\n#define GL_TEXTURE_TARGET 0x1006\n#define GL_QUERY_TARGET 0x82EA\n#define GL_GUILTY_CONTEXT_RESET 0x8253\n#define GL_INNOCENT_CONTEXT_RESET 0x8254\n#define GL_UNKNOWN_CONTEXT_RESET 0x8255\n#define GL_RESET_NOTIFICATION_STRATEGY 0x8256\n#define GL_LOSE_CONTEXT_ON_RESET 0x8252\n#define GL_NO_RESET_NOTIFICATION 0x8261\n#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004\n#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB\n#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC\ntypedef void(APIENTRYP PFNGLCLIPCONTROLPROC)(GLenum origin, GLenum depth);\ntypedef void(APIENTRYP PFNGLCREATETRANSFORMFEEDBACKSPROC)(GLsizei n, GLuint* ids);\ntypedef void(APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC)(GLuint xfb, GLuint index, GLuint buffer);\ntypedef void(APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC)(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\ntypedef void(APIENTRYP PFNGLGETTRANSFORMFEEDBACKIVPROC)(GLuint xfb, GLenum pname, GLint* param);\ntypedef void(APIENTRYP PFNGLGETTRANSFORMFEEDBACKI_VPROC)(GLuint xfb, GLenum pname, GLuint index, GLint* param);\ntypedef void(APIENTRYP PFNGLGETTRANSFORMFEEDBACKI64_VPROC)(GLuint xfb, GLenum pname, GLuint index, GLint64* param);\ntypedef void(APIENTRYP PFNGLCREATEBUFFERSPROC)(GLsizei n, GLuint* buffers);\ntypedef void(APIENTRYP PFNGLNAMEDBUFFERSTORAGEPROC)(GLuint buffer, GLsizeiptr size, const void* data, GLbitfield flags);\ntypedef void(APIENTRYP PFNGLNAMEDBUFFERDATAPROC)(GLuint buffer, GLsizeiptr size, const void* data, GLenum usage);\ntypedef void(APIENTRYP PFNGLNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data);\ntypedef void(APIENTRYP PFNGLCOPYNAMEDBUFFERSUBDATAPROC)(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset,\n                                                        GLsizeiptr size);\ntypedef void(APIENTRYP PFNGLCLEARNAMEDBUFFERDATAPROC)(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void* data);\ntypedef void(APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size,\n                                                         GLenum format, GLenum type, const void* data);\ntypedef void*(APIENTRYP PFNGLMAPNAMEDBUFFERPROC)(GLuint buffer, GLenum access);\ntypedef void*(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access);\ntypedef GLboolean(APIENTRYP PFNGLUNMAPNAMEDBUFFERPROC)(GLuint buffer);\ntypedef void(APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length);\ntypedef void(APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVPROC)(GLuint buffer, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERI64VPROC)(GLuint buffer, GLenum pname, GLint64* params);\ntypedef void(APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVPROC)(GLuint buffer, GLenum pname, void** params);\ntypedef void(APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, void* data);\ntypedef void(APIENTRYP PFNGLCREATEFRAMEBUFFERSPROC)(GLsizei n, GLuint* framebuffers);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC)(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC)(GLuint framebuffer, GLenum pname, GLint param);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)(GLuint framebuffer, GLenum buf);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC)(GLuint framebuffer, GLsizei n, const GLenum* bufs);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC)(GLuint framebuffer, GLenum src);\ntypedef void(APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC)(GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments);\ntypedef void(APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC)(GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments,\n                                                                   GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERIVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value);\ntypedef void(APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value);\ntypedef void(APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFIPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);\ntypedef void(APIENTRYP PFNGLBLITNAMEDFRAMEBUFFERPROC)(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1,\n                                                      GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask,\n                                                      GLenum filter);\ntypedef GLenum(APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)(GLuint framebuffer, GLenum target);\ntypedef void(APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC)(GLuint framebuffer, GLenum pname, GLint* param);\ntypedef void(APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLCREATERENDERBUFFERSPROC)(GLsizei n, GLuint* renderbuffers);\ntypedef void(APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEPROC)(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLuint renderbuffer, GLsizei samples, GLenum internalformat,\n                                                                     GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC)(GLuint renderbuffer, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLCREATETEXTURESPROC)(GLenum target, GLsizei n, GLuint* textures);\ntypedef void(APIENTRYP PFNGLTEXTUREBUFFERPROC)(GLuint texture, GLenum internalformat, GLuint buffer);\ntypedef void(APIENTRYP PFNGLTEXTUREBUFFERRANGEPROC)(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);\ntypedef void(APIENTRYP PFNGLTEXTURESTORAGE1DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width);\ntypedef void(APIENTRYP PFNGLTEXTURESTORAGE2DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLTEXTURESTORAGE3DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height,\n                                                  GLsizei depth);\ntypedef void(APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC)(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width,\n                                                             GLsizei height, GLboolean fixedsamplelocations);\ntypedef void(APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC)(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width,\n                                                             GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\ntypedef void(APIENTRYP PFNGLTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type,\n                                                   const void* pixels);\ntypedef void(APIENTRYP PFNGLTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,\n                                                   GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,\n                                                   GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format,\n                                                             GLsizei imageSize, const void* data);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width,\n                                                             GLsizei height, GLenum format, GLsizei imageSize, const void* data);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,\n                                                             GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize,\n                                                             const void* data);\ntypedef void(APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\ntypedef void(APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y,\n                                                       GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x,\n                                                       GLint y, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLTEXTUREPARAMETERFPROC)(GLuint texture, GLenum pname, GLfloat param);\ntypedef void(APIENTRYP PFNGLTEXTUREPARAMETERFVPROC)(GLuint texture, GLenum pname, const GLfloat* param);\ntypedef void(APIENTRYP PFNGLTEXTUREPARAMETERIPROC)(GLuint texture, GLenum pname, GLint param);\ntypedef void(APIENTRYP PFNGLTEXTUREPARAMETERIIVPROC)(GLuint texture, GLenum pname, const GLint* params);\ntypedef void(APIENTRYP PFNGLTEXTUREPARAMETERIUIVPROC)(GLuint texture, GLenum pname, const GLuint* params);\ntypedef void(APIENTRYP PFNGLTEXTUREPARAMETERIVPROC)(GLuint texture, GLenum pname, const GLint* param);\ntypedef void(APIENTRYP PFNGLGENERATETEXTUREMIPMAPPROC)(GLuint texture);\ntypedef void(APIENTRYP PFNGLBINDTEXTUREUNITPROC)(GLuint unit, GLuint texture);\ntypedef void(APIENTRYP PFNGLGETTEXTUREIMAGEPROC)(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* pixels);\ntypedef void(APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC)(GLuint texture, GLint level, GLsizei bufSize, void* pixels);\ntypedef void(APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVPROC)(GLuint texture, GLint level, GLenum pname, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVPROC)(GLuint texture, GLint level, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETTEXTUREPARAMETERFVPROC)(GLuint texture, GLenum pname, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETTEXTUREPARAMETERIIVPROC)(GLuint texture, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVPROC)(GLuint texture, GLenum pname, GLuint* params);\ntypedef void(APIENTRYP PFNGLGETTEXTUREPARAMETERIVPROC)(GLuint texture, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLCREATEVERTEXARRAYSPROC)(GLsizei n, GLuint* arrays);\ntypedef void(APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBPROC)(GLuint vaobj, GLuint index);\ntypedef void(APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBPROC)(GLuint vaobj, GLuint index);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYELEMENTBUFFERPROC)(GLuint vaobj, GLuint buffer);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERPROC)(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERSPROC)(GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers,\n                                                          const GLintptr* offsets, const GLsizei* strides);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYATTRIBBINDINGPROC)(GLuint vaobj, GLuint attribindex, GLuint bindingindex);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYATTRIBFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized,\n                                                         GLuint relativeoffset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYATTRIBIFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYATTRIBLFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYBINDINGDIVISORPROC)(GLuint vaobj, GLuint bindingindex, GLuint divisor);\ntypedef void(APIENTRYP PFNGLGETVERTEXARRAYIVPROC)(GLuint vaobj, GLenum pname, GLint* param);\ntypedef void(APIENTRYP PFNGLGETVERTEXARRAYINDEXEDIVPROC)(GLuint vaobj, GLuint index, GLenum pname, GLint* param);\ntypedef void(APIENTRYP PFNGLGETVERTEXARRAYINDEXED64IVPROC)(GLuint vaobj, GLuint index, GLenum pname, GLint64* param);\ntypedef void(APIENTRYP PFNGLCREATESAMPLERSPROC)(GLsizei n, GLuint* samplers);\ntypedef void(APIENTRYP PFNGLCREATEPROGRAMPIPELINESPROC)(GLsizei n, GLuint* pipelines);\ntypedef void(APIENTRYP PFNGLCREATEQUERIESPROC)(GLenum target, GLsizei n, GLuint* ids);\ntypedef void(APIENTRYP PFNGLGETQUERYBUFFEROBJECTI64VPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);\ntypedef void(APIENTRYP PFNGLGETQUERYBUFFEROBJECTIVPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);\ntypedef void(APIENTRYP PFNGLGETQUERYBUFFEROBJECTUI64VPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);\ntypedef void(APIENTRYP PFNGLGETQUERYBUFFEROBJECTUIVPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);\ntypedef void(APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC)(GLbitfield barriers);\ntypedef void(APIENTRYP PFNGLGETTEXTURESUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,\n                                                    GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void* pixels);\ntypedef void(APIENTRYP PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,\n                                                              GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void* pixels);\ntypedef GLenum(APIENTRYP PFNGLGETGRAPHICSRESETSTATUSPROC)(void);\ntypedef void(APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint lod, GLsizei bufSize, void* pixels);\ntypedef void(APIENTRYP PFNGLGETNTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* pixels);\ntypedef void(APIENTRYP PFNGLGETNUNIFORMDVPROC)(GLuint program, GLint location, GLsizei bufSize, GLdouble* params);\ntypedef void(APIENTRYP PFNGLGETNUNIFORMFVPROC)(GLuint program, GLint location, GLsizei bufSize, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETNUNIFORMIVPROC)(GLuint program, GLint location, GLsizei bufSize, GLint* params);\ntypedef void(APIENTRYP PFNGLGETNUNIFORMUIVPROC)(GLuint program, GLint location, GLsizei bufSize, GLuint* params);\ntypedef void(APIENTRYP PFNGLREADNPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize,\n                                             void* data);\ntypedef void(APIENTRYP PFNGLTEXTUREBARRIERPROC)(void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glClipControl(GLenum origin, GLenum depth);\nGLAPI void APIENTRY glCreateTransformFeedbacks(GLsizei n, GLuint* ids);\nGLAPI void APIENTRY glTransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer);\nGLAPI void APIENTRY glTransformFeedbackBufferRange(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\nGLAPI void APIENTRY glGetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint* param);\nGLAPI void APIENTRY glGetTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint* param);\nGLAPI void APIENTRY glGetTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64* param);\nGLAPI void APIENTRY glCreateBuffers(GLsizei n, GLuint* buffers);\nGLAPI void APIENTRY glNamedBufferStorage(GLuint buffer, GLsizeiptr size, const void* data, GLbitfield flags);\nGLAPI void APIENTRY glNamedBufferData(GLuint buffer, GLsizeiptr size, const void* data, GLenum usage);\nGLAPI void APIENTRY glNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data);\nGLAPI void APIENTRY glCopyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);\nGLAPI void APIENTRY glClearNamedBufferData(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void* data);\nGLAPI void APIENTRY glClearNamedBufferSubData(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format,\n                                              GLenum type, const void* data);\nGLAPI void* APIENTRY glMapNamedBuffer(GLuint buffer, GLenum access);\nGLAPI void* APIENTRY glMapNamedBufferRange(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access);\nGLAPI GLboolean APIENTRY glUnmapNamedBuffer(GLuint buffer);\nGLAPI void APIENTRY glFlushMappedNamedBufferRange(GLuint buffer, GLintptr offset, GLsizeiptr length);\nGLAPI void APIENTRY glGetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetNamedBufferParameteri64v(GLuint buffer, GLenum pname, GLint64* params);\nGLAPI void APIENTRY glGetNamedBufferPointerv(GLuint buffer, GLenum pname, void** params);\nGLAPI void APIENTRY glGetNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size, void* data);\nGLAPI void APIENTRY glCreateFramebuffers(GLsizei n, GLuint* framebuffers);\nGLAPI void APIENTRY glNamedFramebufferRenderbuffer(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\nGLAPI void APIENTRY glNamedFramebufferParameteri(GLuint framebuffer, GLenum pname, GLint param);\nGLAPI void APIENTRY glNamedFramebufferTexture(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);\nGLAPI void APIENTRY glNamedFramebufferTextureLayer(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);\nGLAPI void APIENTRY glNamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf);\nGLAPI void APIENTRY glNamedFramebufferDrawBuffers(GLuint framebuffer, GLsizei n, const GLenum* bufs);\nGLAPI void APIENTRY glNamedFramebufferReadBuffer(GLuint framebuffer, GLenum src);\nGLAPI void APIENTRY glInvalidateNamedFramebufferData(GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments);\nGLAPI void APIENTRY glInvalidateNamedFramebufferSubData(GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments, GLint x,\n                                                        GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glClearNamedFramebufferiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value);\nGLAPI void APIENTRY glClearNamedFramebufferuiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value);\nGLAPI void APIENTRY glClearNamedFramebufferfv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat* value);\nGLAPI void APIENTRY glClearNamedFramebufferfi(GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);\nGLAPI void APIENTRY glBlitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1,\n                                           GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\nGLAPI GLenum APIENTRY glCheckNamedFramebufferStatus(GLuint framebuffer, GLenum target);\nGLAPI void APIENTRY glGetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint* param);\nGLAPI void APIENTRY glGetNamedFramebufferAttachmentParameteriv(GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params);\nGLAPI void APIENTRY glCreateRenderbuffers(GLsizei n, GLuint* renderbuffers);\nGLAPI void APIENTRY glNamedRenderbufferStorage(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glNamedRenderbufferStorageMultisample(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glGetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname, GLint* params);\nGLAPI void APIENTRY glCreateTextures(GLenum target, GLsizei n, GLuint* textures);\nGLAPI void APIENTRY glTextureBuffer(GLuint texture, GLenum internalformat, GLuint buffer);\nGLAPI void APIENTRY glTextureBufferRange(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);\nGLAPI void APIENTRY glTextureStorage1D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width);\nGLAPI void APIENTRY glTextureStorage2D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glTextureStorage3D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\nGLAPI void APIENTRY glTextureStorage2DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height,\n                                                  GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glTextureStorage3DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height,\n                                                  GLsizei depth, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,\n                                        GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,\n                                        GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glCompressedTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format,\n                                                  GLsizei imageSize, const void* data);\nGLAPI void APIENTRY glCompressedTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,\n                                                  GLenum format, GLsizei imageSize, const void* data);\nGLAPI void APIENTRY glCompressedTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,\n                                                  GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);\nGLAPI void APIENTRY glCopyTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\nGLAPI void APIENTRY glCopyTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width,\n                                            GLsizei height);\nGLAPI void APIENTRY glCopyTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,\n                                            GLsizei width, GLsizei height);\nGLAPI void APIENTRY glTextureParameterf(GLuint texture, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glTextureParameterfv(GLuint texture, GLenum pname, const GLfloat* param);\nGLAPI void APIENTRY glTextureParameteri(GLuint texture, GLenum pname, GLint param);\nGLAPI void APIENTRY glTextureParameterIiv(GLuint texture, GLenum pname, const GLint* params);\nGLAPI void APIENTRY glTextureParameterIuiv(GLuint texture, GLenum pname, const GLuint* params);\nGLAPI void APIENTRY glTextureParameteriv(GLuint texture, GLenum pname, const GLint* param);\nGLAPI void APIENTRY glGenerateTextureMipmap(GLuint texture);\nGLAPI void APIENTRY glBindTextureUnit(GLuint unit, GLuint texture);\nGLAPI void APIENTRY glGetTextureImage(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* pixels);\nGLAPI void APIENTRY glGetCompressedTextureImage(GLuint texture, GLint level, GLsizei bufSize, void* pixels);\nGLAPI void APIENTRY glGetTextureLevelParameterfv(GLuint texture, GLint level, GLenum pname, GLfloat* params);\nGLAPI void APIENTRY glGetTextureLevelParameteriv(GLuint texture, GLint level, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetTextureParameterfv(GLuint texture, GLenum pname, GLfloat* params);\nGLAPI void APIENTRY glGetTextureParameterIiv(GLuint texture, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint* params);\nGLAPI void APIENTRY glGetTextureParameteriv(GLuint texture, GLenum pname, GLint* params);\nGLAPI void APIENTRY glCreateVertexArrays(GLsizei n, GLuint* arrays);\nGLAPI void APIENTRY glDisableVertexArrayAttrib(GLuint vaobj, GLuint index);\nGLAPI void APIENTRY glEnableVertexArrayAttrib(GLuint vaobj, GLuint index);\nGLAPI void APIENTRY glVertexArrayElementBuffer(GLuint vaobj, GLuint buffer);\nGLAPI void APIENTRY glVertexArrayVertexBuffer(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\nGLAPI void APIENTRY glVertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets,\n                                               const GLsizei* strides);\nGLAPI void APIENTRY glVertexArrayAttribBinding(GLuint vaobj, GLuint attribindex, GLuint bindingindex);\nGLAPI void APIENTRY glVertexArrayAttribFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexArrayAttribIFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexArrayAttribLFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexArrayBindingDivisor(GLuint vaobj, GLuint bindingindex, GLuint divisor);\nGLAPI void APIENTRY glGetVertexArrayiv(GLuint vaobj, GLenum pname, GLint* param);\nGLAPI void APIENTRY glGetVertexArrayIndexediv(GLuint vaobj, GLuint index, GLenum pname, GLint* param);\nGLAPI void APIENTRY glGetVertexArrayIndexed64iv(GLuint vaobj, GLuint index, GLenum pname, GLint64* param);\nGLAPI void APIENTRY glCreateSamplers(GLsizei n, GLuint* samplers);\nGLAPI void APIENTRY glCreateProgramPipelines(GLsizei n, GLuint* pipelines);\nGLAPI void APIENTRY glCreateQueries(GLenum target, GLsizei n, GLuint* ids);\nGLAPI void APIENTRY glGetQueryBufferObjecti64v(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);\nGLAPI void APIENTRY glGetQueryBufferObjectiv(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);\nGLAPI void APIENTRY glGetQueryBufferObjectui64v(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);\nGLAPI void APIENTRY glGetQueryBufferObjectuiv(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);\nGLAPI void APIENTRY glMemoryBarrierByRegion(GLbitfield barriers);\nGLAPI void APIENTRY glGetTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,\n                                         GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void* pixels);\nGLAPI void APIENTRY glGetCompressedTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,\n                                                   GLsizei height, GLsizei depth, GLsizei bufSize, void* pixels);\nGLAPI GLenum APIENTRY glGetGraphicsResetStatus(void);\nGLAPI void APIENTRY glGetnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void* pixels);\nGLAPI void APIENTRY glGetnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* pixels);\nGLAPI void APIENTRY glGetnUniformdv(GLuint program, GLint location, GLsizei bufSize, GLdouble* params);\nGLAPI void APIENTRY glGetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat* params);\nGLAPI void APIENTRY glGetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint* params);\nGLAPI void APIENTRY glGetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint* params);\nGLAPI void APIENTRY glReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data);\nGLAPI void APIENTRY glTextureBarrier(void);\n#endif\n#endif /* GL_VERSION_4_5 */\n\n#ifndef GL_VERSION_4_6\n#define GL_VERSION_4_6 1\n#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551\n#define GL_SPIR_V_BINARY 0x9552\n#define GL_PARAMETER_BUFFER 0x80EE\n#define GL_PARAMETER_BUFFER_BINDING 0x80EF\n#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008\n#define GL_VERTICES_SUBMITTED 0x82EE\n#define GL_PRIMITIVES_SUBMITTED 0x82EF\n#define GL_VERTEX_SHADER_INVOCATIONS 0x82F0\n#define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1\n#define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2\n#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3\n#define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4\n#define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5\n#define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6\n#define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7\n#define GL_POLYGON_OFFSET_CLAMP 0x8E1B\n#define GL_SPIR_V_EXTENSIONS 0x9553\n#define GL_NUM_SPIR_V_EXTENSIONS 0x9554\n#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE\n#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF\n#define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC\n#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED\ntypedef void(APIENTRYP PFNGLSPECIALIZESHADERPROC)(GLuint shader, const GLchar* pEntryPoint, GLuint numSpecializationConstants,\n                                                  const GLuint* pConstantIndex, const GLuint* pConstantValue);\ntypedef void(APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC)(GLenum mode, const void* indirect, GLintptr drawcount, GLsizei maxdrawcount,\n                                                              GLsizei stride);\ntypedef void(APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC)(GLenum mode, GLenum type, const void* indirect, GLintptr drawcount,\n                                                                GLsizei maxdrawcount, GLsizei stride);\ntypedef void(APIENTRYP PFNGLPOLYGONOFFSETCLAMPPROC)(GLfloat factor, GLfloat units, GLfloat clamp);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glSpecializeShader(GLuint shader, const GLchar* pEntryPoint, GLuint numSpecializationConstants,\n                                       const GLuint* pConstantIndex, const GLuint* pConstantValue);\nGLAPI void APIENTRY glMultiDrawArraysIndirectCount(GLenum mode, const void* indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);\nGLAPI void APIENTRY glMultiDrawElementsIndirectCount(GLenum mode, GLenum type, const void* indirect, GLintptr drawcount,\n                                                     GLsizei maxdrawcount, GLsizei stride);\nGLAPI void APIENTRY glPolygonOffsetClamp(GLfloat factor, GLfloat units, GLfloat clamp);\n#endif\n#endif /* GL_VERSION_4_6 */\n\n#ifndef GL_ARB_ES2_compatibility\n#define GL_ARB_ES2_compatibility 1\n#endif /* GL_ARB_ES2_compatibility */\n\n#ifndef GL_ARB_ES3_1_compatibility\n#define GL_ARB_ES3_1_compatibility 1\n#endif /* GL_ARB_ES3_1_compatibility */\n\n#ifndef GL_ARB_ES3_2_compatibility\n#define GL_ARB_ES3_2_compatibility 1\n#define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE\n#define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381\n#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382\ntypedef void(APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXARBPROC)(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY,\n                                                         GLfloat maxZ, GLfloat maxW);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glPrimitiveBoundingBoxARB(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY,\n                                              GLfloat maxZ, GLfloat maxW);\n#endif\n#endif /* GL_ARB_ES3_2_compatibility */\n\n#ifndef GL_ARB_ES3_compatibility\n#define GL_ARB_ES3_compatibility 1\n#endif /* GL_ARB_ES3_compatibility */\n\n#ifndef GL_ARB_arrays_of_arrays\n#define GL_ARB_arrays_of_arrays 1\n#endif /* GL_ARB_arrays_of_arrays */\n\n#ifndef GL_ARB_base_instance\n#define GL_ARB_base_instance 1\n#endif /* GL_ARB_base_instance */\n\n#ifndef GL_ARB_bindless_texture\n#define GL_ARB_bindless_texture 1\ntypedef khronos_uint64_t GLuint64EXT;\n#define GL_UNSIGNED_INT64_ARB 0x140F\ntypedef GLuint64(APIENTRYP PFNGLGETTEXTUREHANDLEARBPROC)(GLuint texture);\ntypedef GLuint64(APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEARBPROC)(GLuint texture, GLuint sampler);\ntypedef void(APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTARBPROC)(GLuint64 handle);\ntypedef void(APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC)(GLuint64 handle);\ntypedef GLuint64(APIENTRYP PFNGLGETIMAGEHANDLEARBPROC)(GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);\ntypedef void(APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTARBPROC)(GLuint64 handle, GLenum access);\ntypedef void(APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC)(GLuint64 handle);\ntypedef void(APIENTRYP PFNGLUNIFORMHANDLEUI64ARBPROC)(GLint location, GLuint64 value);\ntypedef void(APIENTRYP PFNGLUNIFORMHANDLEUI64VARBPROC)(GLint location, GLsizei count, const GLuint64* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC)(GLuint program, GLint location, GLuint64 value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLuint64* values);\ntypedef GLboolean(APIENTRYP PFNGLISTEXTUREHANDLERESIDENTARBPROC)(GLuint64 handle);\ntypedef GLboolean(APIENTRYP PFNGLISIMAGEHANDLERESIDENTARBPROC)(GLuint64 handle);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL1UI64ARBPROC)(GLuint index, GLuint64EXT x);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL1UI64VARBPROC)(GLuint index, const GLuint64EXT* v);\ntypedef void(APIENTRYP PFNGLGETVERTEXATTRIBLUI64VARBPROC)(GLuint index, GLenum pname, GLuint64EXT* params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLuint64 APIENTRY glGetTextureHandleARB(GLuint texture);\nGLAPI GLuint64 APIENTRY glGetTextureSamplerHandleARB(GLuint texture, GLuint sampler);\nGLAPI void APIENTRY glMakeTextureHandleResidentARB(GLuint64 handle);\nGLAPI void APIENTRY glMakeTextureHandleNonResidentARB(GLuint64 handle);\nGLAPI GLuint64 APIENTRY glGetImageHandleARB(GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);\nGLAPI void APIENTRY glMakeImageHandleResidentARB(GLuint64 handle, GLenum access);\nGLAPI void APIENTRY glMakeImageHandleNonResidentARB(GLuint64 handle);\nGLAPI void APIENTRY glUniformHandleui64ARB(GLint location, GLuint64 value);\nGLAPI void APIENTRY glUniformHandleui64vARB(GLint location, GLsizei count, const GLuint64* value);\nGLAPI void APIENTRY glProgramUniformHandleui64ARB(GLuint program, GLint location, GLuint64 value);\nGLAPI void APIENTRY glProgramUniformHandleui64vARB(GLuint program, GLint location, GLsizei count, const GLuint64* values);\nGLAPI GLboolean APIENTRY glIsTextureHandleResidentARB(GLuint64 handle);\nGLAPI GLboolean APIENTRY glIsImageHandleResidentARB(GLuint64 handle);\nGLAPI void APIENTRY glVertexAttribL1ui64ARB(GLuint index, GLuint64EXT x);\nGLAPI void APIENTRY glVertexAttribL1ui64vARB(GLuint index, const GLuint64EXT* v);\nGLAPI void APIENTRY glGetVertexAttribLui64vARB(GLuint index, GLenum pname, GLuint64EXT* params);\n#endif\n#endif /* GL_ARB_bindless_texture */\n\n#ifndef GL_ARB_blend_func_extended\n#define GL_ARB_blend_func_extended 1\n#endif /* GL_ARB_blend_func_extended */\n\n#ifndef GL_ARB_buffer_storage\n#define GL_ARB_buffer_storage 1\n#endif /* GL_ARB_buffer_storage */\n\n#ifndef GL_ARB_cl_event\n#define GL_ARB_cl_event 1\nstruct _cl_context;\nstruct _cl_event;\n#define GL_SYNC_CL_EVENT_ARB 0x8240\n#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241\ntypedef GLsync(APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC)(struct _cl_context* context, struct _cl_event* event, GLbitfield flags);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLsync APIENTRY glCreateSyncFromCLeventARB(struct _cl_context* context, struct _cl_event* event, GLbitfield flags);\n#endif\n#endif /* GL_ARB_cl_event */\n\n#ifndef GL_ARB_clear_buffer_object\n#define GL_ARB_clear_buffer_object 1\n#endif /* GL_ARB_clear_buffer_object */\n\n#ifndef GL_ARB_clear_texture\n#define GL_ARB_clear_texture 1\n#endif /* GL_ARB_clear_texture */\n\n#ifndef GL_ARB_clip_control\n#define GL_ARB_clip_control 1\n#endif /* GL_ARB_clip_control */\n\n#ifndef GL_ARB_compressed_texture_pixel_storage\n#define GL_ARB_compressed_texture_pixel_storage 1\n#endif /* GL_ARB_compressed_texture_pixel_storage */\n\n#ifndef GL_ARB_compute_shader\n#define GL_ARB_compute_shader 1\n#endif /* GL_ARB_compute_shader */\n\n#ifndef GL_ARB_compute_variable_group_size\n#define GL_ARB_compute_variable_group_size 1\n#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344\n#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB\n#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345\n#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF\ntypedef void(APIENTRYP PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z,\n                                                             GLuint group_size_x, GLuint group_size_y, GLuint group_size_z);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDispatchComputeGroupSizeARB(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x,\n                                                  GLuint group_size_y, GLuint group_size_z);\n#endif\n#endif /* GL_ARB_compute_variable_group_size */\n\n#ifndef GL_ARB_conditional_render_inverted\n#define GL_ARB_conditional_render_inverted 1\n#endif /* GL_ARB_conditional_render_inverted */\n\n#ifndef GL_ARB_conservative_depth\n#define GL_ARB_conservative_depth 1\n#endif /* GL_ARB_conservative_depth */\n\n#ifndef GL_ARB_copy_buffer\n#define GL_ARB_copy_buffer 1\n#endif /* GL_ARB_copy_buffer */\n\n#ifndef GL_ARB_copy_image\n#define GL_ARB_copy_image 1\n#endif /* GL_ARB_copy_image */\n\n#ifndef GL_ARB_cull_distance\n#define GL_ARB_cull_distance 1\n#endif /* GL_ARB_cull_distance */\n\n#ifndef GL_ARB_debug_output\n#define GL_ARB_debug_output 1\ntypedef void(APIENTRY* GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message,\n                                       const void* userParam);\n#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242\n#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243\n#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244\n#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245\n#define GL_DEBUG_SOURCE_API_ARB 0x8246\n#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247\n#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248\n#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249\n#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A\n#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B\n#define GL_DEBUG_TYPE_ERROR_ARB 0x824C\n#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D\n#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E\n#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F\n#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250\n#define GL_DEBUG_TYPE_OTHER_ARB 0x8251\n#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143\n#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144\n#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145\n#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146\n#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147\n#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148\ntypedef void(APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids,\n                                                        GLboolean enabled);\ntypedef void(APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf);\ntypedef void(APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC)(GLDEBUGPROCARB callback, const void* userParam);\ntypedef GLuint(APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC)(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids,\n                                                         GLenum* severities, GLsizei* lengths, GLchar* messageLog);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDebugMessageControlARB(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled);\nGLAPI void APIENTRY glDebugMessageInsertARB(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf);\nGLAPI void APIENTRY glDebugMessageCallbackARB(GLDEBUGPROCARB callback, const void* userParam);\nGLAPI GLuint APIENTRY glGetDebugMessageLogARB(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids,\n                                              GLenum* severities, GLsizei* lengths, GLchar* messageLog);\n#endif\n#endif /* GL_ARB_debug_output */\n\n#ifndef GL_ARB_depth_buffer_float\n#define GL_ARB_depth_buffer_float 1\n#endif /* GL_ARB_depth_buffer_float */\n\n#ifndef GL_ARB_depth_clamp\n#define GL_ARB_depth_clamp 1\n#endif /* GL_ARB_depth_clamp */\n\n#ifndef GL_ARB_derivative_control\n#define GL_ARB_derivative_control 1\n#endif /* GL_ARB_derivative_control */\n\n#ifndef GL_ARB_direct_state_access\n#define GL_ARB_direct_state_access 1\n#endif /* GL_ARB_direct_state_access */\n\n#ifndef GL_ARB_draw_buffers_blend\n#define GL_ARB_draw_buffers_blend 1\ntypedef void(APIENTRYP PFNGLBLENDEQUATIONIARBPROC)(GLuint buf, GLenum mode);\ntypedef void(APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC)(GLuint buf, GLenum modeRGB, GLenum modeAlpha);\ntypedef void(APIENTRYP PFNGLBLENDFUNCIARBPROC)(GLuint buf, GLenum src, GLenum dst);\ntypedef void(APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlendEquationiARB(GLuint buf, GLenum mode);\nGLAPI void APIENTRY glBlendEquationSeparateiARB(GLuint buf, GLenum modeRGB, GLenum modeAlpha);\nGLAPI void APIENTRY glBlendFunciARB(GLuint buf, GLenum src, GLenum dst);\nGLAPI void APIENTRY glBlendFuncSeparateiARB(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\n#endif\n#endif /* GL_ARB_draw_buffers_blend */\n\n#ifndef GL_ARB_draw_elements_base_vertex\n#define GL_ARB_draw_elements_base_vertex 1\n#endif /* GL_ARB_draw_elements_base_vertex */\n\n#ifndef GL_ARB_draw_indirect\n#define GL_ARB_draw_indirect 1\n#endif /* GL_ARB_draw_indirect */\n\n#ifndef GL_ARB_draw_instanced\n#define GL_ARB_draw_instanced 1\ntypedef void(APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC)(GLenum mode, GLint first, GLsizei count, GLsizei primcount);\ntypedef void(APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC)(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawArraysInstancedARB(GLenum mode, GLint first, GLsizei count, GLsizei primcount);\nGLAPI void APIENTRY glDrawElementsInstancedARB(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount);\n#endif\n#endif /* GL_ARB_draw_instanced */\n\n#ifndef GL_ARB_enhanced_layouts\n#define GL_ARB_enhanced_layouts 1\n#endif /* GL_ARB_enhanced_layouts */\n\n#ifndef GL_ARB_explicit_attrib_location\n#define GL_ARB_explicit_attrib_location 1\n#endif /* GL_ARB_explicit_attrib_location */\n\n#ifndef GL_ARB_explicit_uniform_location\n#define GL_ARB_explicit_uniform_location 1\n#endif /* GL_ARB_explicit_uniform_location */\n\n#ifndef GL_ARB_fragment_coord_conventions\n#define GL_ARB_fragment_coord_conventions 1\n#endif /* GL_ARB_fragment_coord_conventions */\n\n#ifndef GL_ARB_fragment_layer_viewport\n#define GL_ARB_fragment_layer_viewport 1\n#endif /* GL_ARB_fragment_layer_viewport */\n\n#ifndef GL_ARB_fragment_shader_interlock\n#define GL_ARB_fragment_shader_interlock 1\n#endif /* GL_ARB_fragment_shader_interlock */\n\n#ifndef GL_ARB_framebuffer_no_attachments\n#define GL_ARB_framebuffer_no_attachments 1\n#endif /* GL_ARB_framebuffer_no_attachments */\n\n#ifndef GL_ARB_framebuffer_object\n#define GL_ARB_framebuffer_object 1\n#endif /* GL_ARB_framebuffer_object */\n\n#ifndef GL_ARB_framebuffer_sRGB\n#define GL_ARB_framebuffer_sRGB 1\n#endif /* GL_ARB_framebuffer_sRGB */\n\n#ifndef GL_ARB_geometry_shader4\n#define GL_ARB_geometry_shader4 1\n#define GL_LINES_ADJACENCY_ARB 0x000A\n#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B\n#define GL_TRIANGLES_ADJACENCY_ARB 0x000C\n#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D\n#define GL_PROGRAM_POINT_SIZE_ARB 0x8642\n#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29\n#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9\n#define GL_GEOMETRY_SHADER_ARB 0x8DD9\n#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA\n#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB\n#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC\n#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD\n#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE\n#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF\n#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0\n#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1\ntypedef void(APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC)(GLuint program, GLenum pname, GLint value);\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level);\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glProgramParameteriARB(GLuint program, GLenum pname, GLint value);\nGLAPI void APIENTRY glFramebufferTextureARB(GLenum target, GLenum attachment, GLuint texture, GLint level);\nGLAPI void APIENTRY glFramebufferTextureLayerARB(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\nGLAPI void APIENTRY glFramebufferTextureFaceARB(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);\n#endif\n#endif /* GL_ARB_geometry_shader4 */\n\n#ifndef GL_ARB_get_program_binary\n#define GL_ARB_get_program_binary 1\n#endif /* GL_ARB_get_program_binary */\n\n#ifndef GL_ARB_get_texture_sub_image\n#define GL_ARB_get_texture_sub_image 1\n#endif /* GL_ARB_get_texture_sub_image */\n\n#ifndef GL_ARB_gl_spirv\n#define GL_ARB_gl_spirv 1\n#define GL_SHADER_BINARY_FORMAT_SPIR_V_ARB 0x9551\n#define GL_SPIR_V_BINARY_ARB 0x9552\ntypedef void(APIENTRYP PFNGLSPECIALIZESHADERARBPROC)(GLuint shader, const GLchar* pEntryPoint, GLuint numSpecializationConstants,\n                                                     const GLuint* pConstantIndex, const GLuint* pConstantValue);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glSpecializeShaderARB(GLuint shader, const GLchar* pEntryPoint, GLuint numSpecializationConstants,\n                                          const GLuint* pConstantIndex, const GLuint* pConstantValue);\n#endif\n#endif /* GL_ARB_gl_spirv */\n\n#ifndef GL_ARB_gpu_shader5\n#define GL_ARB_gpu_shader5 1\n#endif /* GL_ARB_gpu_shader5 */\n\n#ifndef GL_ARB_gpu_shader_fp64\n#define GL_ARB_gpu_shader_fp64 1\n#endif /* GL_ARB_gpu_shader_fp64 */\n\n#ifndef GL_ARB_gpu_shader_int64\n#define GL_ARB_gpu_shader_int64 1\n#define GL_INT64_ARB 0x140E\n#define GL_INT64_VEC2_ARB 0x8FE9\n#define GL_INT64_VEC3_ARB 0x8FEA\n#define GL_INT64_VEC4_ARB 0x8FEB\n#define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5\n#define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6\n#define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7\ntypedef void(APIENTRYP PFNGLUNIFORM1I64ARBPROC)(GLint location, GLint64 x);\ntypedef void(APIENTRYP PFNGLUNIFORM2I64ARBPROC)(GLint location, GLint64 x, GLint64 y);\ntypedef void(APIENTRYP PFNGLUNIFORM3I64ARBPROC)(GLint location, GLint64 x, GLint64 y, GLint64 z);\ntypedef void(APIENTRYP PFNGLUNIFORM4I64ARBPROC)(GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w);\ntypedef void(APIENTRYP PFNGLUNIFORM1I64VARBPROC)(GLint location, GLsizei count, const GLint64* value);\ntypedef void(APIENTRYP PFNGLUNIFORM2I64VARBPROC)(GLint location, GLsizei count, const GLint64* value);\ntypedef void(APIENTRYP PFNGLUNIFORM3I64VARBPROC)(GLint location, GLsizei count, const GLint64* value);\ntypedef void(APIENTRYP PFNGLUNIFORM4I64VARBPROC)(GLint location, GLsizei count, const GLint64* value);\ntypedef void(APIENTRYP PFNGLUNIFORM1UI64ARBPROC)(GLint location, GLuint64 x);\ntypedef void(APIENTRYP PFNGLUNIFORM2UI64ARBPROC)(GLint location, GLuint64 x, GLuint64 y);\ntypedef void(APIENTRYP PFNGLUNIFORM3UI64ARBPROC)(GLint location, GLuint64 x, GLuint64 y, GLuint64 z);\ntypedef void(APIENTRYP PFNGLUNIFORM4UI64ARBPROC)(GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w);\ntypedef void(APIENTRYP PFNGLUNIFORM1UI64VARBPROC)(GLint location, GLsizei count, const GLuint64* value);\ntypedef void(APIENTRYP PFNGLUNIFORM2UI64VARBPROC)(GLint location, GLsizei count, const GLuint64* value);\ntypedef void(APIENTRYP PFNGLUNIFORM3UI64VARBPROC)(GLint location, GLsizei count, const GLuint64* value);\ntypedef void(APIENTRYP PFNGLUNIFORM4UI64VARBPROC)(GLint location, GLsizei count, const GLuint64* value);\ntypedef void(APIENTRYP PFNGLGETUNIFORMI64VARBPROC)(GLuint program, GLint location, GLint64* params);\ntypedef void(APIENTRYP PFNGLGETUNIFORMUI64VARBPROC)(GLuint program, GLint location, GLuint64* params);\ntypedef void(APIENTRYP PFNGLGETNUNIFORMI64VARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLint64* params);\ntypedef void(APIENTRYP PFNGLGETNUNIFORMUI64VARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLuint64* params);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1I64ARBPROC)(GLuint program, GLint location, GLint64 x);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2I64ARBPROC)(GLuint program, GLint location, GLint64 x, GLint64 y);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3I64ARBPROC)(GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4I64ARBPROC)(GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1I64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLint64* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2I64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLint64* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3I64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLint64* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4I64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLint64* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1UI64ARBPROC)(GLuint program, GLint location, GLuint64 x);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2UI64ARBPROC)(GLuint program, GLint location, GLuint64 x, GLuint64 y);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3UI64ARBPROC)(GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4UI64ARBPROC)(GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1UI64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLuint64* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2UI64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLuint64* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3UI64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLuint64* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4UI64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLuint64* value);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glUniform1i64ARB(GLint location, GLint64 x);\nGLAPI void APIENTRY glUniform2i64ARB(GLint location, GLint64 x, GLint64 y);\nGLAPI void APIENTRY glUniform3i64ARB(GLint location, GLint64 x, GLint64 y, GLint64 z);\nGLAPI void APIENTRY glUniform4i64ARB(GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w);\nGLAPI void APIENTRY glUniform1i64vARB(GLint location, GLsizei count, const GLint64* value);\nGLAPI void APIENTRY glUniform2i64vARB(GLint location, GLsizei count, const GLint64* value);\nGLAPI void APIENTRY glUniform3i64vARB(GLint location, GLsizei count, const GLint64* value);\nGLAPI void APIENTRY glUniform4i64vARB(GLint location, GLsizei count, const GLint64* value);\nGLAPI void APIENTRY glUniform1ui64ARB(GLint location, GLuint64 x);\nGLAPI void APIENTRY glUniform2ui64ARB(GLint location, GLuint64 x, GLuint64 y);\nGLAPI void APIENTRY glUniform3ui64ARB(GLint location, GLuint64 x, GLuint64 y, GLuint64 z);\nGLAPI void APIENTRY glUniform4ui64ARB(GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w);\nGLAPI void APIENTRY glUniform1ui64vARB(GLint location, GLsizei count, const GLuint64* value);\nGLAPI void APIENTRY glUniform2ui64vARB(GLint location, GLsizei count, const GLuint64* value);\nGLAPI void APIENTRY glUniform3ui64vARB(GLint location, GLsizei count, const GLuint64* value);\nGLAPI void APIENTRY glUniform4ui64vARB(GLint location, GLsizei count, const GLuint64* value);\nGLAPI void APIENTRY glGetUniformi64vARB(GLuint program, GLint location, GLint64* params);\nGLAPI void APIENTRY glGetUniformui64vARB(GLuint program, GLint location, GLuint64* params);\nGLAPI void APIENTRY glGetnUniformi64vARB(GLuint program, GLint location, GLsizei bufSize, GLint64* params);\nGLAPI void APIENTRY glGetnUniformui64vARB(GLuint program, GLint location, GLsizei bufSize, GLuint64* params);\nGLAPI void APIENTRY glProgramUniform1i64ARB(GLuint program, GLint location, GLint64 x);\nGLAPI void APIENTRY glProgramUniform2i64ARB(GLuint program, GLint location, GLint64 x, GLint64 y);\nGLAPI void APIENTRY glProgramUniform3i64ARB(GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z);\nGLAPI void APIENTRY glProgramUniform4i64ARB(GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w);\nGLAPI void APIENTRY glProgramUniform1i64vARB(GLuint program, GLint location, GLsizei count, const GLint64* value);\nGLAPI void APIENTRY glProgramUniform2i64vARB(GLuint program, GLint location, GLsizei count, const GLint64* value);\nGLAPI void APIENTRY glProgramUniform3i64vARB(GLuint program, GLint location, GLsizei count, const GLint64* value);\nGLAPI void APIENTRY glProgramUniform4i64vARB(GLuint program, GLint location, GLsizei count, const GLint64* value);\nGLAPI void APIENTRY glProgramUniform1ui64ARB(GLuint program, GLint location, GLuint64 x);\nGLAPI void APIENTRY glProgramUniform2ui64ARB(GLuint program, GLint location, GLuint64 x, GLuint64 y);\nGLAPI void APIENTRY glProgramUniform3ui64ARB(GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z);\nGLAPI void APIENTRY glProgramUniform4ui64ARB(GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w);\nGLAPI void APIENTRY glProgramUniform1ui64vARB(GLuint program, GLint location, GLsizei count, const GLuint64* value);\nGLAPI void APIENTRY glProgramUniform2ui64vARB(GLuint program, GLint location, GLsizei count, const GLuint64* value);\nGLAPI void APIENTRY glProgramUniform3ui64vARB(GLuint program, GLint location, GLsizei count, const GLuint64* value);\nGLAPI void APIENTRY glProgramUniform4ui64vARB(GLuint program, GLint location, GLsizei count, const GLuint64* value);\n#endif\n#endif /* GL_ARB_gpu_shader_int64 */\n\n#ifndef GL_ARB_half_float_vertex\n#define GL_ARB_half_float_vertex 1\n#endif /* GL_ARB_half_float_vertex */\n\n#ifndef GL_ARB_imaging\n#define GL_ARB_imaging 1\n#endif /* GL_ARB_imaging */\n\n#ifndef GL_ARB_indirect_parameters\n#define GL_ARB_indirect_parameters 1\n#define GL_PARAMETER_BUFFER_ARB 0x80EE\n#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF\ntypedef void(APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC)(GLenum mode, const void* indirect, GLintptr drawcount,\n                                                                 GLsizei maxdrawcount, GLsizei stride);\ntypedef void(APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC)(GLenum mode, GLenum type, const void* indirect, GLintptr drawcount,\n                                                                   GLsizei maxdrawcount, GLsizei stride);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMultiDrawArraysIndirectCountARB(GLenum mode, const void* indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);\nGLAPI void APIENTRY glMultiDrawElementsIndirectCountARB(GLenum mode, GLenum type, const void* indirect, GLintptr drawcount,\n                                                        GLsizei maxdrawcount, GLsizei stride);\n#endif\n#endif /* GL_ARB_indirect_parameters */\n\n#ifndef GL_ARB_instanced_arrays\n#define GL_ARB_instanced_arrays 1\n#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC)(GLuint index, GLuint divisor);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glVertexAttribDivisorARB(GLuint index, GLuint divisor);\n#endif\n#endif /* GL_ARB_instanced_arrays */\n\n#ifndef GL_ARB_internalformat_query\n#define GL_ARB_internalformat_query 1\n#endif /* GL_ARB_internalformat_query */\n\n#ifndef GL_ARB_internalformat_query2\n#define GL_ARB_internalformat_query2 1\n#define GL_SRGB_DECODE_ARB 0x8299\n#define GL_VIEW_CLASS_EAC_R11 0x9383\n#define GL_VIEW_CLASS_EAC_RG11 0x9384\n#define GL_VIEW_CLASS_ETC2_RGB 0x9385\n#define GL_VIEW_CLASS_ETC2_RGBA 0x9386\n#define GL_VIEW_CLASS_ETC2_EAC_RGBA 0x9387\n#define GL_VIEW_CLASS_ASTC_4x4_RGBA 0x9388\n#define GL_VIEW_CLASS_ASTC_5x4_RGBA 0x9389\n#define GL_VIEW_CLASS_ASTC_5x5_RGBA 0x938A\n#define GL_VIEW_CLASS_ASTC_6x5_RGBA 0x938B\n#define GL_VIEW_CLASS_ASTC_6x6_RGBA 0x938C\n#define GL_VIEW_CLASS_ASTC_8x5_RGBA 0x938D\n#define GL_VIEW_CLASS_ASTC_8x6_RGBA 0x938E\n#define GL_VIEW_CLASS_ASTC_8x8_RGBA 0x938F\n#define GL_VIEW_CLASS_ASTC_10x5_RGBA 0x9390\n#define GL_VIEW_CLASS_ASTC_10x6_RGBA 0x9391\n#define GL_VIEW_CLASS_ASTC_10x8_RGBA 0x9392\n#define GL_VIEW_CLASS_ASTC_10x10_RGBA 0x9393\n#define GL_VIEW_CLASS_ASTC_12x10_RGBA 0x9394\n#define GL_VIEW_CLASS_ASTC_12x12_RGBA 0x9395\n#endif /* GL_ARB_internalformat_query2 */\n\n#ifndef GL_ARB_invalidate_subdata\n#define GL_ARB_invalidate_subdata 1\n#endif /* GL_ARB_invalidate_subdata */\n\n#ifndef GL_ARB_map_buffer_alignment\n#define GL_ARB_map_buffer_alignment 1\n#endif /* GL_ARB_map_buffer_alignment */\n\n#ifndef GL_ARB_map_buffer_range\n#define GL_ARB_map_buffer_range 1\n#endif /* GL_ARB_map_buffer_range */\n\n#ifndef GL_ARB_multi_bind\n#define GL_ARB_multi_bind 1\n#endif /* GL_ARB_multi_bind */\n\n#ifndef GL_ARB_multi_draw_indirect\n#define GL_ARB_multi_draw_indirect 1\n#endif /* GL_ARB_multi_draw_indirect */\n\n#ifndef GL_ARB_occlusion_query2\n#define GL_ARB_occlusion_query2 1\n#endif /* GL_ARB_occlusion_query2 */\n\n#ifndef GL_ARB_parallel_shader_compile\n#define GL_ARB_parallel_shader_compile 1\n#define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0\n#define GL_COMPLETION_STATUS_ARB 0x91B1\ntypedef void(APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSARBPROC)(GLuint count);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMaxShaderCompilerThreadsARB(GLuint count);\n#endif\n#endif /* GL_ARB_parallel_shader_compile */\n\n#ifndef GL_ARB_pipeline_statistics_query\n#define GL_ARB_pipeline_statistics_query 1\n#define GL_VERTICES_SUBMITTED_ARB 0x82EE\n#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF\n#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0\n#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1\n#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2\n#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3\n#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4\n#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5\n#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6\n#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7\n#endif /* GL_ARB_pipeline_statistics_query */\n\n#ifndef GL_ARB_pixel_buffer_object\n#define GL_ARB_pixel_buffer_object 1\n#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB\n#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC\n#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED\n#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF\n#endif /* GL_ARB_pixel_buffer_object */\n\n#ifndef GL_ARB_polygon_offset_clamp\n#define GL_ARB_polygon_offset_clamp 1\n#endif /* GL_ARB_polygon_offset_clamp */\n\n#ifndef GL_ARB_post_depth_coverage\n#define GL_ARB_post_depth_coverage 1\n#endif /* GL_ARB_post_depth_coverage */\n\n#ifndef GL_ARB_program_interface_query\n#define GL_ARB_program_interface_query 1\n#endif /* GL_ARB_program_interface_query */\n\n#ifndef GL_ARB_provoking_vertex\n#define GL_ARB_provoking_vertex 1\n#endif /* GL_ARB_provoking_vertex */\n\n#ifndef GL_ARB_query_buffer_object\n#define GL_ARB_query_buffer_object 1\n#endif /* GL_ARB_query_buffer_object */\n\n#ifndef GL_ARB_robust_buffer_access_behavior\n#define GL_ARB_robust_buffer_access_behavior 1\n#endif /* GL_ARB_robust_buffer_access_behavior */\n\n#ifndef GL_ARB_robustness\n#define GL_ARB_robustness 1\n#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004\n#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252\n#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253\n#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254\n#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255\n#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256\n#define GL_NO_RESET_NOTIFICATION_ARB 0x8261\ntypedef GLenum(APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC)(void);\ntypedef void(APIENTRYP PFNGLGETNTEXIMAGEARBPROC)(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img);\ntypedef void(APIENTRYP PFNGLREADNPIXELSARBPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,\n                                                GLsizei bufSize, void* data);\ntypedef void(APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC)(GLenum target, GLint lod, GLsizei bufSize, void* img);\ntypedef void(APIENTRYP PFNGLGETNUNIFORMFVARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETNUNIFORMIVARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLint* params);\ntypedef void(APIENTRYP PFNGLGETNUNIFORMUIVARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLuint* params);\ntypedef void(APIENTRYP PFNGLGETNUNIFORMDVARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLdouble* params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLenum APIENTRY glGetGraphicsResetStatusARB(void);\nGLAPI void APIENTRY glGetnTexImageARB(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img);\nGLAPI void APIENTRY glReadnPixelsARB(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data);\nGLAPI void APIENTRY glGetnCompressedTexImageARB(GLenum target, GLint lod, GLsizei bufSize, void* img);\nGLAPI void APIENTRY glGetnUniformfvARB(GLuint program, GLint location, GLsizei bufSize, GLfloat* params);\nGLAPI void APIENTRY glGetnUniformivARB(GLuint program, GLint location, GLsizei bufSize, GLint* params);\nGLAPI void APIENTRY glGetnUniformuivARB(GLuint program, GLint location, GLsizei bufSize, GLuint* params);\nGLAPI void APIENTRY glGetnUniformdvARB(GLuint program, GLint location, GLsizei bufSize, GLdouble* params);\n#endif\n#endif /* GL_ARB_robustness */\n\n#ifndef GL_ARB_robustness_isolation\n#define GL_ARB_robustness_isolation 1\n#endif /* GL_ARB_robustness_isolation */\n\n#ifndef GL_ARB_sample_locations\n#define GL_ARB_sample_locations 1\n#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D\n#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E\n#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F\n#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340\n#define GL_SAMPLE_LOCATION_ARB 0x8E50\n#define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341\n#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342\n#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)(GLenum target, GLuint start, GLsizei count, const GLfloat* v);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)(GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v);\ntypedef void(APIENTRYP PFNGLEVALUATEDEPTHVALUESARBPROC)(void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glFramebufferSampleLocationsfvARB(GLenum target, GLuint start, GLsizei count, const GLfloat* v);\nGLAPI void APIENTRY glNamedFramebufferSampleLocationsfvARB(GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v);\nGLAPI void APIENTRY glEvaluateDepthValuesARB(void);\n#endif\n#endif /* GL_ARB_sample_locations */\n\n#ifndef GL_ARB_sample_shading\n#define GL_ARB_sample_shading 1\n#define GL_SAMPLE_SHADING_ARB 0x8C36\n#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37\ntypedef void(APIENTRYP PFNGLMINSAMPLESHADINGARBPROC)(GLfloat value);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMinSampleShadingARB(GLfloat value);\n#endif\n#endif /* GL_ARB_sample_shading */\n\n#ifndef GL_ARB_sampler_objects\n#define GL_ARB_sampler_objects 1\n#endif /* GL_ARB_sampler_objects */\n\n#ifndef GL_ARB_seamless_cube_map\n#define GL_ARB_seamless_cube_map 1\n#endif /* GL_ARB_seamless_cube_map */\n\n#ifndef GL_ARB_seamless_cubemap_per_texture\n#define GL_ARB_seamless_cubemap_per_texture 1\n#endif /* GL_ARB_seamless_cubemap_per_texture */\n\n#ifndef GL_ARB_separate_shader_objects\n#define GL_ARB_separate_shader_objects 1\n#endif /* GL_ARB_separate_shader_objects */\n\n#ifndef GL_ARB_shader_atomic_counter_ops\n#define GL_ARB_shader_atomic_counter_ops 1\n#endif /* GL_ARB_shader_atomic_counter_ops */\n\n#ifndef GL_ARB_shader_atomic_counters\n#define GL_ARB_shader_atomic_counters 1\n#endif /* GL_ARB_shader_atomic_counters */\n\n#ifndef GL_ARB_shader_ballot\n#define GL_ARB_shader_ballot 1\n#endif /* GL_ARB_shader_ballot */\n\n#ifndef GL_ARB_shader_bit_encoding\n#define GL_ARB_shader_bit_encoding 1\n#endif /* GL_ARB_shader_bit_encoding */\n\n#ifndef GL_ARB_shader_clock\n#define GL_ARB_shader_clock 1\n#endif /* GL_ARB_shader_clock */\n\n#ifndef GL_ARB_shader_draw_parameters\n#define GL_ARB_shader_draw_parameters 1\n#endif /* GL_ARB_shader_draw_parameters */\n\n#ifndef GL_ARB_shader_group_vote\n#define GL_ARB_shader_group_vote 1\n#endif /* GL_ARB_shader_group_vote */\n\n#ifndef GL_ARB_shader_image_load_store\n#define GL_ARB_shader_image_load_store 1\n#endif /* GL_ARB_shader_image_load_store */\n\n#ifndef GL_ARB_shader_image_size\n#define GL_ARB_shader_image_size 1\n#endif /* GL_ARB_shader_image_size */\n\n#ifndef GL_ARB_shader_precision\n#define GL_ARB_shader_precision 1\n#endif /* GL_ARB_shader_precision */\n\n#ifndef GL_ARB_shader_stencil_export\n#define GL_ARB_shader_stencil_export 1\n#endif /* GL_ARB_shader_stencil_export */\n\n#ifndef GL_ARB_shader_storage_buffer_object\n#define GL_ARB_shader_storage_buffer_object 1\n#endif /* GL_ARB_shader_storage_buffer_object */\n\n#ifndef GL_ARB_shader_subroutine\n#define GL_ARB_shader_subroutine 1\n#endif /* GL_ARB_shader_subroutine */\n\n#ifndef GL_ARB_shader_texture_image_samples\n#define GL_ARB_shader_texture_image_samples 1\n#endif /* GL_ARB_shader_texture_image_samples */\n\n#ifndef GL_ARB_shader_viewport_layer_array\n#define GL_ARB_shader_viewport_layer_array 1\n#endif /* GL_ARB_shader_viewport_layer_array */\n\n#ifndef GL_ARB_shading_language_420pack\n#define GL_ARB_shading_language_420pack 1\n#endif /* GL_ARB_shading_language_420pack */\n\n#ifndef GL_ARB_shading_language_include\n#define GL_ARB_shading_language_include 1\n#define GL_SHADER_INCLUDE_ARB 0x8DAE\n#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9\n#define GL_NAMED_STRING_TYPE_ARB 0x8DEA\ntypedef void(APIENTRYP PFNGLNAMEDSTRINGARBPROC)(GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar* string);\ntypedef void(APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC)(GLint namelen, const GLchar* name);\ntypedef void(APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC)(GLuint shader, GLsizei count, const GLchar* const* path, const GLint* length);\ntypedef GLboolean(APIENTRYP PFNGLISNAMEDSTRINGARBPROC)(GLint namelen, const GLchar* name);\ntypedef void(APIENTRYP PFNGLGETNAMEDSTRINGARBPROC)(GLint namelen, const GLchar* name, GLsizei bufSize, GLint* stringlen, GLchar* string);\ntypedef void(APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC)(GLint namelen, const GLchar* name, GLenum pname, GLint* params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glNamedStringARB(GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar* string);\nGLAPI void APIENTRY glDeleteNamedStringARB(GLint namelen, const GLchar* name);\nGLAPI void APIENTRY glCompileShaderIncludeARB(GLuint shader, GLsizei count, const GLchar* const* path, const GLint* length);\nGLAPI GLboolean APIENTRY glIsNamedStringARB(GLint namelen, const GLchar* name);\nGLAPI void APIENTRY glGetNamedStringARB(GLint namelen, const GLchar* name, GLsizei bufSize, GLint* stringlen, GLchar* string);\nGLAPI void APIENTRY glGetNamedStringivARB(GLint namelen, const GLchar* name, GLenum pname, GLint* params);\n#endif\n#endif /* GL_ARB_shading_language_include */\n\n#ifndef GL_ARB_shading_language_packing\n#define GL_ARB_shading_language_packing 1\n#endif /* GL_ARB_shading_language_packing */\n\n#ifndef GL_ARB_sparse_buffer\n#define GL_ARB_sparse_buffer 1\n#define GL_SPARSE_STORAGE_BIT_ARB 0x0400\n#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8\ntypedef void(APIENTRYP PFNGLBUFFERPAGECOMMITMENTARBPROC)(GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit);\ntypedef void(APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTEXTPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit);\ntypedef void(APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBufferPageCommitmentARB(GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit);\nGLAPI void APIENTRY glNamedBufferPageCommitmentEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit);\nGLAPI void APIENTRY glNamedBufferPageCommitmentARB(GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit);\n#endif\n#endif /* GL_ARB_sparse_buffer */\n\n#ifndef GL_ARB_sparse_texture\n#define GL_ARB_sparse_texture 1\n#define GL_TEXTURE_SPARSE_ARB 0x91A6\n#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7\n#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA\n#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8\n#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195\n#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196\n#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197\n#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198\n#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199\n#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A\n#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9\ntypedef void(APIENTRYP PFNGLTEXPAGECOMMITMENTARBPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,\n                                                      GLsizei width, GLsizei height, GLsizei depth, GLboolean commit);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTexPageCommitmentARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,\n                                           GLsizei height, GLsizei depth, GLboolean commit);\n#endif\n#endif /* GL_ARB_sparse_texture */\n\n#ifndef GL_ARB_sparse_texture2\n#define GL_ARB_sparse_texture2 1\n#endif /* GL_ARB_sparse_texture2 */\n\n#ifndef GL_ARB_sparse_texture_clamp\n#define GL_ARB_sparse_texture_clamp 1\n#endif /* GL_ARB_sparse_texture_clamp */\n\n#ifndef GL_ARB_spirv_extensions\n#define GL_ARB_spirv_extensions 1\n#endif /* GL_ARB_spirv_extensions */\n\n#ifndef GL_ARB_stencil_texturing\n#define GL_ARB_stencil_texturing 1\n#endif /* GL_ARB_stencil_texturing */\n\n#ifndef GL_ARB_sync\n#define GL_ARB_sync 1\n#endif /* GL_ARB_sync */\n\n#ifndef GL_ARB_tessellation_shader\n#define GL_ARB_tessellation_shader 1\n#endif /* GL_ARB_tessellation_shader */\n\n#ifndef GL_ARB_texture_barrier\n#define GL_ARB_texture_barrier 1\n#endif /* GL_ARB_texture_barrier */\n\n#ifndef GL_ARB_texture_border_clamp\n#define GL_ARB_texture_border_clamp 1\n#define GL_CLAMP_TO_BORDER_ARB 0x812D\n#endif /* GL_ARB_texture_border_clamp */\n\n#ifndef GL_ARB_texture_buffer_object\n#define GL_ARB_texture_buffer_object 1\n#define GL_TEXTURE_BUFFER_ARB 0x8C2A\n#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B\n#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C\n#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D\n#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E\ntypedef void(APIENTRYP PFNGLTEXBUFFERARBPROC)(GLenum target, GLenum internalformat, GLuint buffer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTexBufferARB(GLenum target, GLenum internalformat, GLuint buffer);\n#endif\n#endif /* GL_ARB_texture_buffer_object */\n\n#ifndef GL_ARB_texture_buffer_object_rgb32\n#define GL_ARB_texture_buffer_object_rgb32 1\n#endif /* GL_ARB_texture_buffer_object_rgb32 */\n\n#ifndef GL_ARB_texture_buffer_range\n#define GL_ARB_texture_buffer_range 1\n#endif /* GL_ARB_texture_buffer_range */\n\n#ifndef GL_ARB_texture_compression_bptc\n#define GL_ARB_texture_compression_bptc 1\n#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C\n#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D\n#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E\n#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F\n#endif /* GL_ARB_texture_compression_bptc */\n\n#ifndef GL_ARB_texture_compression_rgtc\n#define GL_ARB_texture_compression_rgtc 1\n#endif /* GL_ARB_texture_compression_rgtc */\n\n#ifndef GL_ARB_texture_cube_map_array\n#define GL_ARB_texture_cube_map_array 1\n#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009\n#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A\n#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B\n#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C\n#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D\n#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F\n#endif /* GL_ARB_texture_cube_map_array */\n\n#ifndef GL_ARB_texture_filter_anisotropic\n#define GL_ARB_texture_filter_anisotropic 1\n#endif /* GL_ARB_texture_filter_anisotropic */\n\n#ifndef GL_ARB_texture_filter_minmax\n#define GL_ARB_texture_filter_minmax 1\n#define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366\n#define GL_WEIGHTED_AVERAGE_ARB 0x9367\n#endif /* GL_ARB_texture_filter_minmax */\n\n#ifndef GL_ARB_texture_gather\n#define GL_ARB_texture_gather 1\n#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F\n#endif /* GL_ARB_texture_gather */\n\n#ifndef GL_ARB_texture_mirror_clamp_to_edge\n#define GL_ARB_texture_mirror_clamp_to_edge 1\n#endif /* GL_ARB_texture_mirror_clamp_to_edge */\n\n#ifndef GL_ARB_texture_mirrored_repeat\n#define GL_ARB_texture_mirrored_repeat 1\n#define GL_MIRRORED_REPEAT_ARB 0x8370\n#endif /* GL_ARB_texture_mirrored_repeat */\n\n#ifndef GL_ARB_texture_multisample\n#define GL_ARB_texture_multisample 1\n#endif /* GL_ARB_texture_multisample */\n\n#ifndef GL_ARB_texture_non_power_of_two\n#define GL_ARB_texture_non_power_of_two 1\n#endif /* GL_ARB_texture_non_power_of_two */\n\n#ifndef GL_ARB_texture_query_levels\n#define GL_ARB_texture_query_levels 1\n#endif /* GL_ARB_texture_query_levels */\n\n#ifndef GL_ARB_texture_query_lod\n#define GL_ARB_texture_query_lod 1\n#endif /* GL_ARB_texture_query_lod */\n\n#ifndef GL_ARB_texture_rg\n#define GL_ARB_texture_rg 1\n#endif /* GL_ARB_texture_rg */\n\n#ifndef GL_ARB_texture_rgb10_a2ui\n#define GL_ARB_texture_rgb10_a2ui 1\n#endif /* GL_ARB_texture_rgb10_a2ui */\n\n#ifndef GL_ARB_texture_stencil8\n#define GL_ARB_texture_stencil8 1\n#endif /* GL_ARB_texture_stencil8 */\n\n#ifndef GL_ARB_texture_storage\n#define GL_ARB_texture_storage 1\n#endif /* GL_ARB_texture_storage */\n\n#ifndef GL_ARB_texture_storage_multisample\n#define GL_ARB_texture_storage_multisample 1\n#endif /* GL_ARB_texture_storage_multisample */\n\n#ifndef GL_ARB_texture_swizzle\n#define GL_ARB_texture_swizzle 1\n#endif /* GL_ARB_texture_swizzle */\n\n#ifndef GL_ARB_texture_view\n#define GL_ARB_texture_view 1\n#endif /* GL_ARB_texture_view */\n\n#ifndef GL_ARB_timer_query\n#define GL_ARB_timer_query 1\n#endif /* GL_ARB_timer_query */\n\n#ifndef GL_ARB_transform_feedback2\n#define GL_ARB_transform_feedback2 1\n#endif /* GL_ARB_transform_feedback2 */\n\n#ifndef GL_ARB_transform_feedback3\n#define GL_ARB_transform_feedback3 1\n#endif /* GL_ARB_transform_feedback3 */\n\n#ifndef GL_ARB_transform_feedback_instanced\n#define GL_ARB_transform_feedback_instanced 1\n#endif /* GL_ARB_transform_feedback_instanced */\n\n#ifndef GL_ARB_transform_feedback_overflow_query\n#define GL_ARB_transform_feedback_overflow_query 1\n#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC\n#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED\n#endif /* GL_ARB_transform_feedback_overflow_query */\n\n#ifndef GL_ARB_uniform_buffer_object\n#define GL_ARB_uniform_buffer_object 1\n#endif /* GL_ARB_uniform_buffer_object */\n\n#ifndef GL_ARB_vertex_array_bgra\n#define GL_ARB_vertex_array_bgra 1\n#endif /* GL_ARB_vertex_array_bgra */\n\n#ifndef GL_ARB_vertex_array_object\n#define GL_ARB_vertex_array_object 1\n#endif /* GL_ARB_vertex_array_object */\n\n#ifndef GL_ARB_vertex_attrib_64bit\n#define GL_ARB_vertex_attrib_64bit 1\n#endif /* GL_ARB_vertex_attrib_64bit */\n\n#ifndef GL_ARB_vertex_attrib_binding\n#define GL_ARB_vertex_attrib_binding 1\n#endif /* GL_ARB_vertex_attrib_binding */\n\n#ifndef GL_ARB_vertex_type_10f_11f_11f_rev\n#define GL_ARB_vertex_type_10f_11f_11f_rev 1\n#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */\n\n#ifndef GL_ARB_vertex_type_2_10_10_10_rev\n#define GL_ARB_vertex_type_2_10_10_10_rev 1\n#endif /* GL_ARB_vertex_type_2_10_10_10_rev */\n\n#ifndef GL_ARB_viewport_array\n#define GL_ARB_viewport_array 1\ntypedef void(APIENTRYP PFNGLDEPTHRANGEARRAYDVNVPROC)(GLuint first, GLsizei count, const GLdouble* v);\ntypedef void(APIENTRYP PFNGLDEPTHRANGEINDEXEDDNVPROC)(GLuint index, GLdouble n, GLdouble f);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDepthRangeArraydvNV(GLuint first, GLsizei count, const GLdouble* v);\nGLAPI void APIENTRY glDepthRangeIndexeddNV(GLuint index, GLdouble n, GLdouble f);\n#endif\n#endif /* GL_ARB_viewport_array */\n\n#ifndef GL_KHR_blend_equation_advanced\n#define GL_KHR_blend_equation_advanced 1\n#define GL_MULTIPLY_KHR 0x9294\n#define GL_SCREEN_KHR 0x9295\n#define GL_OVERLAY_KHR 0x9296\n#define GL_DARKEN_KHR 0x9297\n#define GL_LIGHTEN_KHR 0x9298\n#define GL_COLORDODGE_KHR 0x9299\n#define GL_COLORBURN_KHR 0x929A\n#define GL_HARDLIGHT_KHR 0x929B\n#define GL_SOFTLIGHT_KHR 0x929C\n#define GL_DIFFERENCE_KHR 0x929E\n#define GL_EXCLUSION_KHR 0x92A0\n#define GL_HSL_HUE_KHR 0x92AD\n#define GL_HSL_SATURATION_KHR 0x92AE\n#define GL_HSL_COLOR_KHR 0x92AF\n#define GL_HSL_LUMINOSITY_KHR 0x92B0\ntypedef void(APIENTRYP PFNGLBLENDBARRIERKHRPROC)(void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlendBarrierKHR(void);\n#endif\n#endif /* GL_KHR_blend_equation_advanced */\n\n#ifndef GL_KHR_blend_equation_advanced_coherent\n#define GL_KHR_blend_equation_advanced_coherent 1\n#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285\n#endif /* GL_KHR_blend_equation_advanced_coherent */\n\n#ifndef GL_KHR_context_flush_control\n#define GL_KHR_context_flush_control 1\n#endif /* GL_KHR_context_flush_control */\n\n#ifndef GL_KHR_debug\n#define GL_KHR_debug 1\n#endif /* GL_KHR_debug */\n\n#ifndef GL_KHR_no_error\n#define GL_KHR_no_error 1\n#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008\n#endif /* GL_KHR_no_error */\n\n#ifndef GL_KHR_parallel_shader_compile\n#define GL_KHR_parallel_shader_compile 1\n#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0\n#define GL_COMPLETION_STATUS_KHR 0x91B1\ntypedef void(APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSKHRPROC)(GLuint count);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMaxShaderCompilerThreadsKHR(GLuint count);\n#endif\n#endif /* GL_KHR_parallel_shader_compile */\n\n#ifndef GL_KHR_robust_buffer_access_behavior\n#define GL_KHR_robust_buffer_access_behavior 1\n#endif /* GL_KHR_robust_buffer_access_behavior */\n\n#ifndef GL_KHR_robustness\n#define GL_KHR_robustness 1\n#define GL_CONTEXT_ROBUST_ACCESS 0x90F3\n#endif /* GL_KHR_robustness */\n\n#ifndef GL_KHR_shader_subgroup\n#define GL_KHR_shader_subgroup 1\n#define GL_SUBGROUP_SIZE_KHR 0x9532\n#define GL_SUBGROUP_SUPPORTED_STAGES_KHR 0x9533\n#define GL_SUBGROUP_SUPPORTED_FEATURES_KHR 0x9534\n#define GL_SUBGROUP_QUAD_ALL_STAGES_KHR 0x9535\n#define GL_SUBGROUP_FEATURE_BASIC_BIT_KHR 0x00000001\n#define GL_SUBGROUP_FEATURE_VOTE_BIT_KHR 0x00000002\n#define GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR 0x00000004\n#define GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR 0x00000008\n#define GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR 0x00000010\n#define GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR 0x00000020\n#define GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR 0x00000040\n#define GL_SUBGROUP_FEATURE_QUAD_BIT_KHR 0x00000080\n#endif /* GL_KHR_shader_subgroup */\n\n#ifndef GL_KHR_texture_compression_astc_hdr\n#define GL_KHR_texture_compression_astc_hdr 1\n#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0\n#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1\n#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2\n#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3\n#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4\n#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5\n#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6\n#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7\n#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8\n#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9\n#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA\n#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB\n#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC\n#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD\n#endif /* GL_KHR_texture_compression_astc_hdr */\n\n#ifndef GL_KHR_texture_compression_astc_ldr\n#define GL_KHR_texture_compression_astc_ldr 1\n#endif /* GL_KHR_texture_compression_astc_ldr */\n\n#ifndef GL_KHR_texture_compression_astc_sliced_3d\n#define GL_KHR_texture_compression_astc_sliced_3d 1\n#endif /* GL_KHR_texture_compression_astc_sliced_3d */\n\n#ifndef GL_AMD_framebuffer_multisample_advanced\n#define GL_AMD_framebuffer_multisample_advanced 1\n#define GL_RENDERBUFFER_STORAGE_SAMPLES_AMD 0x91B2\n#define GL_MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD 0x91B3\n#define GL_MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD 0x91B4\n#define GL_MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD 0x91B5\n#define GL_NUM_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B6\n#define GL_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B7\ntypedef void(APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC)(GLenum target, GLsizei samples, GLsizei storageSamples,\n                                                                           GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC)(\n  GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glRenderbufferStorageMultisampleAdvancedAMD(GLenum target, GLsizei samples, GLsizei storageSamples,\n                                                                GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glNamedRenderbufferStorageMultisampleAdvancedAMD(GLuint renderbuffer, GLsizei samples, GLsizei storageSamples,\n                                                                     GLenum internalformat, GLsizei width, GLsizei height);\n#endif\n#endif /* GL_AMD_framebuffer_multisample_advanced */\n\n#ifndef GL_AMD_performance_monitor\n#define GL_AMD_performance_monitor 1\n#define GL_COUNTER_TYPE_AMD 0x8BC0\n#define GL_COUNTER_RANGE_AMD 0x8BC1\n#define GL_UNSIGNED_INT64_AMD 0x8BC2\n#define GL_PERCENTAGE_AMD 0x8BC3\n#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4\n#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5\n#define GL_PERFMON_RESULT_AMD 0x8BC6\ntypedef void(APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC)(GLint* numGroups, GLsizei groupsSize, GLuint* groups);\ntypedef void(APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC)(GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize,\n                                                           GLuint* counters);\ntypedef void(APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC)(GLuint group, GLsizei bufSize, GLsizei* length, GLchar* groupString);\ntypedef void(APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC)(GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length,\n                                                                GLchar* counterString);\ntypedef void(APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC)(GLuint group, GLuint counter, GLenum pname, void* data);\ntypedef void(APIENTRYP PFNGLGENPERFMONITORSAMDPROC)(GLsizei n, GLuint* monitors);\ntypedef void(APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC)(GLsizei n, GLuint* monitors);\ntypedef void(APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC)(GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList);\ntypedef void(APIENTRYP PFNGLBEGINPERFMONITORAMDPROC)(GLuint monitor);\ntypedef void(APIENTRYP PFNGLENDPERFMONITORAMDPROC)(GLuint monitor);\ntypedef void(APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC)(GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGetPerfMonitorGroupsAMD(GLint* numGroups, GLsizei groupsSize, GLuint* groups);\nGLAPI void APIENTRY glGetPerfMonitorCountersAMD(GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters);\nGLAPI void APIENTRY glGetPerfMonitorGroupStringAMD(GLuint group, GLsizei bufSize, GLsizei* length, GLchar* groupString);\nGLAPI void APIENTRY glGetPerfMonitorCounterStringAMD(GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar* counterString);\nGLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD(GLuint group, GLuint counter, GLenum pname, void* data);\nGLAPI void APIENTRY glGenPerfMonitorsAMD(GLsizei n, GLuint* monitors);\nGLAPI void APIENTRY glDeletePerfMonitorsAMD(GLsizei n, GLuint* monitors);\nGLAPI void APIENTRY glSelectPerfMonitorCountersAMD(GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList);\nGLAPI void APIENTRY glBeginPerfMonitorAMD(GLuint monitor);\nGLAPI void APIENTRY glEndPerfMonitorAMD(GLuint monitor);\nGLAPI void APIENTRY glGetPerfMonitorCounterDataAMD(GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten);\n#endif\n#endif /* GL_AMD_performance_monitor */\n\n#ifndef GL_APPLE_rgb_422\n#define GL_APPLE_rgb_422 1\n#define GL_RGB_422_APPLE 0x8A1F\n#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA\n#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB\n#define GL_RGB_RAW_422_APPLE 0x8A51\n#endif /* GL_APPLE_rgb_422 */\n\n#ifndef GL_EXT_EGL_image_storage\n#define GL_EXT_EGL_image_storage 1\ntypedef void* GLeglImageOES;\ntypedef void(APIENTRYP PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC)(GLenum target, GLeglImageOES image, const GLint* attrib_list);\ntypedef void(APIENTRYP PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC)(GLuint texture, GLeglImageOES image, const GLint* attrib_list);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glEGLImageTargetTexStorageEXT(GLenum target, GLeglImageOES image, const GLint* attrib_list);\nGLAPI void APIENTRY glEGLImageTargetTextureStorageEXT(GLuint texture, GLeglImageOES image, const GLint* attrib_list);\n#endif\n#endif /* GL_EXT_EGL_image_storage */\n\n#ifndef GL_EXT_EGL_sync\n#define GL_EXT_EGL_sync 1\n#endif /* GL_EXT_EGL_sync */\n\n#ifndef GL_EXT_debug_label\n#define GL_EXT_debug_label 1\n#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F\n#define GL_PROGRAM_OBJECT_EXT 0x8B40\n#define GL_SHADER_OBJECT_EXT 0x8B48\n#define GL_BUFFER_OBJECT_EXT 0x9151\n#define GL_QUERY_OBJECT_EXT 0x9153\n#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154\ntypedef void(APIENTRYP PFNGLLABELOBJECTEXTPROC)(GLenum type, GLuint object, GLsizei length, const GLchar* label);\ntypedef void(APIENTRYP PFNGLGETOBJECTLABELEXTPROC)(GLenum type, GLuint object, GLsizei bufSize, GLsizei* length, GLchar* label);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glLabelObjectEXT(GLenum type, GLuint object, GLsizei length, const GLchar* label);\nGLAPI void APIENTRY glGetObjectLabelEXT(GLenum type, GLuint object, GLsizei bufSize, GLsizei* length, GLchar* label);\n#endif\n#endif /* GL_EXT_debug_label */\n\n#ifndef GL_EXT_debug_marker\n#define GL_EXT_debug_marker 1\ntypedef void(APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC)(GLsizei length, const GLchar* marker);\ntypedef void(APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC)(GLsizei length, const GLchar* marker);\ntypedef void(APIENTRYP PFNGLPOPGROUPMARKEREXTPROC)(void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glInsertEventMarkerEXT(GLsizei length, const GLchar* marker);\nGLAPI void APIENTRY glPushGroupMarkerEXT(GLsizei length, const GLchar* marker);\nGLAPI void APIENTRY glPopGroupMarkerEXT(void);\n#endif\n#endif /* GL_EXT_debug_marker */\n\n#ifndef GL_EXT_direct_state_access\n#define GL_EXT_direct_state_access 1\n#define GL_PROGRAM_MATRIX_EXT 0x8E2D\n#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E\n#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F\ntypedef void(APIENTRYP PFNGLMATRIXLOADFEXTPROC)(GLenum mode, const GLfloat* m);\ntypedef void(APIENTRYP PFNGLMATRIXLOADDEXTPROC)(GLenum mode, const GLdouble* m);\ntypedef void(APIENTRYP PFNGLMATRIXMULTFEXTPROC)(GLenum mode, const GLfloat* m);\ntypedef void(APIENTRYP PFNGLMATRIXMULTDEXTPROC)(GLenum mode, const GLdouble* m);\ntypedef void(APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC)(GLenum mode);\ntypedef void(APIENTRYP PFNGLMATRIXROTATEFEXTPROC)(GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);\ntypedef void(APIENTRYP PFNGLMATRIXROTATEDEXTPROC)(GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z);\ntypedef void(APIENTRYP PFNGLMATRIXSCALEFEXTPROC)(GLenum mode, GLfloat x, GLfloat y, GLfloat z);\ntypedef void(APIENTRYP PFNGLMATRIXSCALEDEXTPROC)(GLenum mode, GLdouble x, GLdouble y, GLdouble z);\ntypedef void(APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC)(GLenum mode, GLfloat x, GLfloat y, GLfloat z);\ntypedef void(APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC)(GLenum mode, GLdouble x, GLdouble y, GLdouble z);\ntypedef void(APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC)(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear,\n                                                  GLdouble zFar);\ntypedef void(APIENTRYP PFNGLMATRIXORTHOEXTPROC)(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear,\n                                                GLdouble zFar);\ntypedef void(APIENTRYP PFNGLMATRIXPOPEXTPROC)(GLenum mode);\ntypedef void(APIENTRYP PFNGLMATRIXPUSHEXTPROC)(GLenum mode);\ntypedef void(APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC)(GLbitfield mask);\ntypedef void(APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC)(GLbitfield mask);\ntypedef void(APIENTRYP PFNGLTEXTUREPARAMETERFEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLfloat param);\ntypedef void(APIENTRYP PFNGLTEXTUREPARAMETERFVEXTPROC)(GLuint texture, GLenum target, GLenum pname, const GLfloat* params);\ntypedef void(APIENTRYP PFNGLTEXTUREPARAMETERIEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLint param);\ntypedef void(APIENTRYP PFNGLTEXTUREPARAMETERIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, const GLint* params);\ntypedef void(APIENTRYP PFNGLTEXTUREIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width,\n                                                   GLint border, GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLTEXTUREIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width,\n                                                   GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLTEXTURESUBIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width,\n                                                      GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLTEXTURESUBIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                                                      GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLCOPYTEXTUREIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y,\n                                                       GLsizei width, GLint border);\ntypedef void(APIENTRYP PFNGLCOPYTEXTUREIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y,\n                                                       GLsizei width, GLsizei height, GLint border);\ntypedef void(APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y,\n                                                          GLsizei width);\ntypedef void(APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x,\n                                                          GLint y, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLGETTEXTUREIMAGEEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void* pixels);\ntypedef void(APIENTRYP PFNGLGETTEXTUREPARAMETERFVEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETTEXTUREPARAMETERIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLTEXTUREIMAGE3DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width,\n                                                   GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLTEXTURESUBIMAGE3DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                                                      GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format,\n                                                      GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                                                          GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLBINDMULTITEXTUREEXTPROC)(GLenum texunit, GLenum target, GLuint texture);\ntypedef void(APIENTRYP PFNGLMULTITEXCOORDPOINTEREXTPROC)(GLenum texunit, GLint size, GLenum type, GLsizei stride, const void* pointer);\ntypedef void(APIENTRYP PFNGLMULTITEXENVFEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLfloat param);\ntypedef void(APIENTRYP PFNGLMULTITEXENVFVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLfloat* params);\ntypedef void(APIENTRYP PFNGLMULTITEXENVIEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLint param);\ntypedef void(APIENTRYP PFNGLMULTITEXENVIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLint* params);\ntypedef void(APIENTRYP PFNGLMULTITEXGENDEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLdouble param);\ntypedef void(APIENTRYP PFNGLMULTITEXGENDVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params);\ntypedef void(APIENTRYP PFNGLMULTITEXGENFEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLfloat param);\ntypedef void(APIENTRYP PFNGLMULTITEXGENFVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params);\ntypedef void(APIENTRYP PFNGLMULTITEXGENIEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLint param);\ntypedef void(APIENTRYP PFNGLMULTITEXGENIVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, const GLint* params);\ntypedef void(APIENTRYP PFNGLGETMULTITEXENVFVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETMULTITEXENVIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETMULTITEXGENDVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLdouble* params);\ntypedef void(APIENTRYP PFNGLGETMULTITEXGENFVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETMULTITEXGENIVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLMULTITEXPARAMETERIEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLint param);\ntypedef void(APIENTRYP PFNGLMULTITEXPARAMETERIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLint* params);\ntypedef void(APIENTRYP PFNGLMULTITEXPARAMETERFEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLfloat param);\ntypedef void(APIENTRYP PFNGLMULTITEXPARAMETERFVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLfloat* params);\ntypedef void(APIENTRYP PFNGLMULTITEXIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width,\n                                                    GLint border, GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLMULTITEXIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width,\n                                                    GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLMULTITEXSUBIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width,\n                                                       GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLMULTITEXSUBIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                                                       GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLCOPYMULTITEXIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y,\n                                                        GLsizei width, GLint border);\ntypedef void(APIENTRYP PFNGLCOPYMULTITEXIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y,\n                                                        GLsizei width, GLsizei height, GLint border);\ntypedef void(APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y,\n                                                           GLsizei width);\ntypedef void(APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                                                           GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLGETMULTITEXIMAGEEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void* pixels);\ntypedef void(APIENTRYP PFNGLGETMULTITEXPARAMETERFVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETMULTITEXPARAMETERIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLMULTITEXIMAGE3DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width,\n                                                    GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLMULTITEXSUBIMAGE3DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                                                       GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format,\n                                                       GLenum type, const void* pixels);\ntypedef void(APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                                                           GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLENABLECLIENTSTATEINDEXEDEXTPROC)(GLenum array, GLuint index);\ntypedef void(APIENTRYP PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC)(GLenum array, GLuint index);\ntypedef void(APIENTRYP PFNGLGETFLOATINDEXEDVEXTPROC)(GLenum target, GLuint index, GLfloat* data);\ntypedef void(APIENTRYP PFNGLGETDOUBLEINDEXEDVEXTPROC)(GLenum target, GLuint index, GLdouble* data);\ntypedef void(APIENTRYP PFNGLGETPOINTERINDEXEDVEXTPROC)(GLenum target, GLuint index, void** data);\ntypedef void(APIENTRYP PFNGLENABLEINDEXEDEXTPROC)(GLenum target, GLuint index);\ntypedef void(APIENTRYP PFNGLDISABLEINDEXEDEXTPROC)(GLenum target, GLuint index);\ntypedef GLboolean(APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC)(GLenum target, GLuint index);\ntypedef void(APIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC)(GLenum target, GLuint index, GLint* data);\ntypedef void(APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC)(GLenum target, GLuint index, GLboolean* data);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width,\n                                                             GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* bits);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width,\n                                                             GLsizei height, GLint border, GLsizei imageSize, const void* bits);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum internalformat,\n                                                             GLsizei width, GLint border, GLsizei imageSize, const void* bits);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                                                                GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format,\n                                                                GLsizei imageSize, const void* bits);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                                                                GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* bits);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width,\n                                                                GLenum format, GLsizei imageSize, const void* bits);\ntypedef void(APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC)(GLuint texture, GLenum target, GLint lod, void* img);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width,\n                                                              GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* bits);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width,\n                                                              GLsizei height, GLint border, GLsizei imageSize, const void* bits);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum internalformat,\n                                                              GLsizei width, GLint border, GLsizei imageSize, const void* bits);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                                                                 GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format,\n                                                                 GLsizei imageSize, const void* bits);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                                                                 GLsizei width, GLsizei height, GLenum format, GLsizei imageSize,\n                                                                 const void* bits);\ntypedef void(APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width,\n                                                                 GLenum format, GLsizei imageSize, const void* bits);\ntypedef void(APIENTRYP PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC)(GLenum texunit, GLenum target, GLint lod, void* img);\ntypedef void(APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC)(GLenum mode, const GLfloat* m);\ntypedef void(APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC)(GLenum mode, const GLdouble* m);\ntypedef void(APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC)(GLenum mode, const GLfloat* m);\ntypedef void(APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC)(GLenum mode, const GLdouble* m);\ntypedef void(APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC)(GLuint buffer, GLsizeiptr size, const void* data, GLenum usage);\ntypedef void(APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data);\ntypedef void*(APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC)(GLuint buffer, GLenum access);\ntypedef GLboolean(APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC)(GLuint buffer);\ntypedef void(APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC)(GLuint buffer, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC)(GLuint buffer, GLenum pname, void** params);\ntypedef void(APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, void* data);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC)(GLuint program, GLint location, GLfloat v0);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC)(GLuint program, GLint location, GLint v0);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC)(GLuint program, GLint location, GLint v0, GLint v1);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLint* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLint* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLint* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLint* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                            const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                            const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                            const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                              const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                              const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                              const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                              const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                              const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                              const GLfloat* value);\ntypedef void(APIENTRYP PFNGLTEXTUREBUFFEREXTPROC)(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer);\ntypedef void(APIENTRYP PFNGLMULTITEXBUFFEREXTPROC)(GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer);\ntypedef void(APIENTRYP PFNGLTEXTUREPARAMETERIIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, const GLint* params);\ntypedef void(APIENTRYP PFNGLTEXTUREPARAMETERIUIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, const GLuint* params);\ntypedef void(APIENTRYP PFNGLGETTEXTUREPARAMETERIIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLuint* params);\ntypedef void(APIENTRYP PFNGLMULTITEXPARAMETERIIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLint* params);\ntypedef void(APIENTRYP PFNGLMULTITEXPARAMETERIUIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLuint* params);\ntypedef void(APIENTRYP PFNGLGETMULTITEXPARAMETERIIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETMULTITEXPARAMETERIUIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLuint* params);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC)(GLuint program, GLint location, GLuint v0);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC)(GLuint program, GLint location, GLuint v0, GLuint v1);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLuint* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLuint* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLuint* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLuint* value);\ntypedef void(APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC)(GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params);\ntypedef void(APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC)(GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);\ntypedef void(APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC)(GLuint program, GLenum target, GLuint index, const GLint* params);\ntypedef void(APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC)(GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params);\ntypedef void(APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC)(GLuint program, GLenum target, GLuint index, GLuint x, GLuint y,\n                                                                   GLuint z, GLuint w);\ntypedef void(APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC)(GLuint program, GLenum target, GLuint index, const GLuint* params);\ntypedef void(APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC)(GLuint program, GLenum target, GLuint index, GLsizei count,\n                                                                     const GLuint* params);\ntypedef void(APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC)(GLuint program, GLenum target, GLuint index, GLint* params);\ntypedef void(APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC)(GLuint program, GLenum target, GLuint index, GLuint* params);\ntypedef void(APIENTRYP PFNGLENABLECLIENTSTATEIEXTPROC)(GLenum array, GLuint index);\ntypedef void(APIENTRYP PFNGLDISABLECLIENTSTATEIEXTPROC)(GLenum array, GLuint index);\ntypedef void(APIENTRYP PFNGLGETFLOATI_VEXTPROC)(GLenum pname, GLuint index, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETDOUBLEI_VEXTPROC)(GLenum pname, GLuint index, GLdouble* params);\ntypedef void(APIENTRYP PFNGLGETPOINTERI_VEXTPROC)(GLenum pname, GLuint index, void** params);\ntypedef void(APIENTRYP PFNGLNAMEDPROGRAMSTRINGEXTPROC)(GLuint program, GLenum target, GLenum format, GLsizei len, const void* string);\ntypedef void(APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC)(GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y,\n                                                                 GLdouble z, GLdouble w);\ntypedef void(APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC)(GLuint program, GLenum target, GLuint index, const GLdouble* params);\ntypedef void(APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC)(GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y,\n                                                                 GLfloat z, GLfloat w);\ntypedef void(APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC)(GLuint program, GLenum target, GLuint index, const GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC)(GLuint program, GLenum target, GLuint index, GLdouble* params);\ntypedef void(APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC)(GLuint program, GLenum target, GLuint index, GLfloat* params);\ntypedef void(APIENTRYP PFNGLGETNAMEDPROGRAMIVEXTPROC)(GLuint program, GLenum target, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGETNAMEDPROGRAMSTRINGEXTPROC)(GLuint program, GLenum target, GLenum pname, void* string);\ntypedef void(APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC)(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC)(GLuint renderbuffer, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLuint renderbuffer, GLsizei samples, GLenum internalformat,\n                                                                        GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC)(\n  GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef GLenum(APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC)(GLuint framebuffer, GLenum target);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC)(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC)(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC)(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture,\n                                                              GLint level, GLint zoffset);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC)(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget,\n                                                                 GLuint renderbuffer);\ntypedef void(APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLGENERATETEXTUREMIPMAPEXTPROC)(GLuint texture, GLenum target);\ntypedef void(APIENTRYP PFNGLGENERATEMULTITEXMIPMAPEXTPROC)(GLenum texunit, GLenum target);\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC)(GLuint framebuffer, GLenum mode);\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC)(GLuint framebuffer, GLsizei n, const GLenum* bufs);\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERREADBUFFEREXTPROC)(GLuint framebuffer, GLenum mode);\ntypedef void(APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC)(GLuint framebuffer, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC)(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset,\n                                                           GLsizeiptr size);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face);\ntypedef void(APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC)(GLuint texture, GLenum target, GLuint renderbuffer);\ntypedef void(APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC)(GLenum texunit, GLenum target, GLuint renderbuffer);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYCOLOROFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYINDEXOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYNORMALOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type,\n                                                                   GLsizei stride, GLintptr offset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride,\n                                                                    GLintptr offset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type,\n                                                                  GLboolean normalized, GLsizei stride, GLintptr offset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type,\n                                                                   GLsizei stride, GLintptr offset);\ntypedef void(APIENTRYP PFNGLENABLEVERTEXARRAYEXTPROC)(GLuint vaobj, GLenum array);\ntypedef void(APIENTRYP PFNGLDISABLEVERTEXARRAYEXTPROC)(GLuint vaobj, GLenum array);\ntypedef void(APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBEXTPROC)(GLuint vaobj, GLuint index);\ntypedef void(APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC)(GLuint vaobj, GLuint index);\ntypedef void(APIENTRYP PFNGLGETVERTEXARRAYINTEGERVEXTPROC)(GLuint vaobj, GLenum pname, GLint* param);\ntypedef void(APIENTRYP PFNGLGETVERTEXARRAYPOINTERVEXTPROC)(GLuint vaobj, GLenum pname, void** param);\ntypedef void(APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC)(GLuint vaobj, GLuint index, GLenum pname, GLint* param);\ntypedef void(APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC)(GLuint vaobj, GLuint index, GLenum pname, void** param);\ntypedef void*(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access);\ntypedef void(APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length);\ntypedef void(APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTPROC)(GLuint buffer, GLsizeiptr size, const void* data, GLbitfield flags);\ntypedef void(APIENTRYP PFNGLCLEARNAMEDBUFFERDATAEXTPROC)(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void* data);\ntypedef void(APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC)(GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size,\n                                                            GLenum format, GLenum type, const void* data);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC)(GLuint framebuffer, GLenum pname, GLint param);\ntypedef void(APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC)(GLuint framebuffer, GLenum pname, GLint* params);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC)(GLuint program, GLint location, GLdouble x);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC)(GLuint program, GLint location, GLdouble x, GLdouble y);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC)(GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC)(GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                            const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                            const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                            const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                              const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                              const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                              const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                              const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                              const GLdouble* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose,\n                                                              const GLdouble* value);\ntypedef void(APIENTRYP PFNGLTEXTUREBUFFERRANGEEXTPROC)(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset,\n                                                       GLsizeiptr size);\ntypedef void(APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\ntypedef void(APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width,\n                                                     GLsizei height);\ntypedef void(APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width,\n                                                     GLsizei height, GLsizei depth);\ntypedef void(APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC)(GLuint texture, GLenum target, GLsizei samples, GLenum internalformat,\n                                                                GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\ntypedef void(APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC)(GLuint texture, GLenum target, GLsizei samples, GLenum internalformat,\n                                                                GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC)(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type,\n                                                                  GLboolean normalized, GLuint relativeoffset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC)(GLuint vaobj, GLuint attribindex, GLuint bindingindex);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC)(GLuint vaobj, GLuint bindingindex, GLuint divisor);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type,\n                                                                   GLsizei stride, GLintptr offset);\ntypedef void(APIENTRYP PFNGLTEXTUREPAGECOMMITMENTEXTPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,\n                                                          GLsizei width, GLsizei height, GLsizei depth, GLboolean commit);\ntypedef void(APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC)(GLuint vaobj, GLuint index, GLuint divisor);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMatrixLoadfEXT(GLenum mode, const GLfloat* m);\nGLAPI void APIENTRY glMatrixLoaddEXT(GLenum mode, const GLdouble* m);\nGLAPI void APIENTRY glMatrixMultfEXT(GLenum mode, const GLfloat* m);\nGLAPI void APIENTRY glMatrixMultdEXT(GLenum mode, const GLdouble* m);\nGLAPI void APIENTRY glMatrixLoadIdentityEXT(GLenum mode);\nGLAPI void APIENTRY glMatrixRotatefEXT(GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glMatrixRotatedEXT(GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glMatrixScalefEXT(GLenum mode, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glMatrixScaledEXT(GLenum mode, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glMatrixTranslatefEXT(GLenum mode, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glMatrixTranslatedEXT(GLenum mode, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glMatrixFrustumEXT(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\nGLAPI void APIENTRY glMatrixOrthoEXT(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\nGLAPI void APIENTRY glMatrixPopEXT(GLenum mode);\nGLAPI void APIENTRY glMatrixPushEXT(GLenum mode);\nGLAPI void APIENTRY glClientAttribDefaultEXT(GLbitfield mask);\nGLAPI void APIENTRY glPushClientAttribDefaultEXT(GLbitfield mask);\nGLAPI void APIENTRY glTextureParameterfEXT(GLuint texture, GLenum target, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, const GLfloat* params);\nGLAPI void APIENTRY glTextureParameteriEXT(GLuint texture, GLenum target, GLenum pname, GLint param);\nGLAPI void APIENTRY glTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, const GLint* params);\nGLAPI void APIENTRY glTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border,\n                                        GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,\n                                        GLint border, GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format,\n                                           GLenum type, const void* pixels);\nGLAPI void APIENTRY glTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,\n                                           GLsizei height, GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glCopyTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y,\n                                            GLsizei width, GLint border);\nGLAPI void APIENTRY glCopyTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y,\n                                            GLsizei width, GLsizei height, GLint border);\nGLAPI void APIENTRY glCopyTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\nGLAPI void APIENTRY glCopyTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y,\n                                               GLsizei width, GLsizei height);\nGLAPI void APIENTRY glGetTextureImageEXT(GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void* pixels);\nGLAPI void APIENTRY glGetTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, GLfloat* params);\nGLAPI void APIENTRY glGetTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetTextureLevelParameterfvEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params);\nGLAPI void APIENTRY glGetTextureLevelParameterivEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params);\nGLAPI void APIENTRY glTextureImage3DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,\n                                        GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,\n                                           GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glCopyTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,\n                                               GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glBindMultiTextureEXT(GLenum texunit, GLenum target, GLuint texture);\nGLAPI void APIENTRY glMultiTexCoordPointerEXT(GLenum texunit, GLint size, GLenum type, GLsizei stride, const void* pointer);\nGLAPI void APIENTRY glMultiTexEnvfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glMultiTexEnvfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat* params);\nGLAPI void APIENTRY glMultiTexEnviEXT(GLenum texunit, GLenum target, GLenum pname, GLint param);\nGLAPI void APIENTRY glMultiTexEnvivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint* params);\nGLAPI void APIENTRY glMultiTexGendEXT(GLenum texunit, GLenum coord, GLenum pname, GLdouble param);\nGLAPI void APIENTRY glMultiTexGendvEXT(GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params);\nGLAPI void APIENTRY glMultiTexGenfEXT(GLenum texunit, GLenum coord, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glMultiTexGenfvEXT(GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params);\nGLAPI void APIENTRY glMultiTexGeniEXT(GLenum texunit, GLenum coord, GLenum pname, GLint param);\nGLAPI void APIENTRY glMultiTexGenivEXT(GLenum texunit, GLenum coord, GLenum pname, const GLint* params);\nGLAPI void APIENTRY glGetMultiTexEnvfvEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat* params);\nGLAPI void APIENTRY glGetMultiTexEnvivEXT(GLenum texunit, GLenum target, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetMultiTexGendvEXT(GLenum texunit, GLenum coord, GLenum pname, GLdouble* params);\nGLAPI void APIENTRY glGetMultiTexGenfvEXT(GLenum texunit, GLenum coord, GLenum pname, GLfloat* params);\nGLAPI void APIENTRY glGetMultiTexGenivEXT(GLenum texunit, GLenum coord, GLenum pname, GLint* params);\nGLAPI void APIENTRY glMultiTexParameteriEXT(GLenum texunit, GLenum target, GLenum pname, GLint param);\nGLAPI void APIENTRY glMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint* params);\nGLAPI void APIENTRY glMultiTexParameterfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat* params);\nGLAPI void APIENTRY glMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border,\n                                         GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,\n                                         GLint border, GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format,\n                                            GLenum type, const void* pixels);\nGLAPI void APIENTRY glMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,\n                                            GLsizei height, GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glCopyMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y,\n                                             GLsizei width, GLint border);\nGLAPI void APIENTRY glCopyMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y,\n                                             GLsizei width, GLsizei height, GLint border);\nGLAPI void APIENTRY glCopyMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\nGLAPI void APIENTRY glCopyMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y,\n                                                GLsizei width, GLsizei height);\nGLAPI void APIENTRY glGetMultiTexImageEXT(GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void* pixels);\nGLAPI void APIENTRY glGetMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat* params);\nGLAPI void APIENTRY glGetMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params);\nGLAPI void APIENTRY glGetMultiTexLevelParameterivEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params);\nGLAPI void APIENTRY glMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,\n                                         GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,\n                                            GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);\nGLAPI void APIENTRY glCopyMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,\n                                                GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glEnableClientStateIndexedEXT(GLenum array, GLuint index);\nGLAPI void APIENTRY glDisableClientStateIndexedEXT(GLenum array, GLuint index);\nGLAPI void APIENTRY glGetFloatIndexedvEXT(GLenum target, GLuint index, GLfloat* data);\nGLAPI void APIENTRY glGetDoubleIndexedvEXT(GLenum target, GLuint index, GLdouble* data);\nGLAPI void APIENTRY glGetPointerIndexedvEXT(GLenum target, GLuint index, void** data);\nGLAPI void APIENTRY glEnableIndexedEXT(GLenum target, GLuint index);\nGLAPI void APIENTRY glDisableIndexedEXT(GLenum target, GLuint index);\nGLAPI GLboolean APIENTRY glIsEnabledIndexedEXT(GLenum target, GLuint index);\nGLAPI void APIENTRY glGetIntegerIndexedvEXT(GLenum target, GLuint index, GLint* data);\nGLAPI void APIENTRY glGetBooleanIndexedvEXT(GLenum target, GLuint index, GLboolean* data);\nGLAPI void APIENTRY glCompressedTextureImage3DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width,\n                                                  GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* bits);\nGLAPI void APIENTRY glCompressedTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width,\n                                                  GLsizei height, GLint border, GLsizei imageSize, const void* bits);\nGLAPI void APIENTRY glCompressedTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width,\n                                                  GLint border, GLsizei imageSize, const void* bits);\nGLAPI void APIENTRY glCompressedTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                                                     GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format,\n                                                     GLsizei imageSize, const void* bits);\nGLAPI void APIENTRY glCompressedTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                                                     GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* bits);\nGLAPI void APIENTRY glCompressedTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width,\n                                                     GLenum format, GLsizei imageSize, const void* bits);\nGLAPI void APIENTRY glGetCompressedTextureImageEXT(GLuint texture, GLenum target, GLint lod, void* img);\nGLAPI void APIENTRY glCompressedMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width,\n                                                   GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* bits);\nGLAPI void APIENTRY glCompressedMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width,\n                                                   GLsizei height, GLint border, GLsizei imageSize, const void* bits);\nGLAPI void APIENTRY glCompressedMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width,\n                                                   GLint border, GLsizei imageSize, const void* bits);\nGLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                                                      GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format,\n                                                      GLsizei imageSize, const void* bits);\nGLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                                                      GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* bits);\nGLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width,\n                                                      GLenum format, GLsizei imageSize, const void* bits);\nGLAPI void APIENTRY glGetCompressedMultiTexImageEXT(GLenum texunit, GLenum target, GLint lod, void* img);\nGLAPI void APIENTRY glMatrixLoadTransposefEXT(GLenum mode, const GLfloat* m);\nGLAPI void APIENTRY glMatrixLoadTransposedEXT(GLenum mode, const GLdouble* m);\nGLAPI void APIENTRY glMatrixMultTransposefEXT(GLenum mode, const GLfloat* m);\nGLAPI void APIENTRY glMatrixMultTransposedEXT(GLenum mode, const GLdouble* m);\nGLAPI void APIENTRY glNamedBufferDataEXT(GLuint buffer, GLsizeiptr size, const void* data, GLenum usage);\nGLAPI void APIENTRY glNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data);\nGLAPI void* APIENTRY glMapNamedBufferEXT(GLuint buffer, GLenum access);\nGLAPI GLboolean APIENTRY glUnmapNamedBufferEXT(GLuint buffer);\nGLAPI void APIENTRY glGetNamedBufferParameterivEXT(GLuint buffer, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetNamedBufferPointervEXT(GLuint buffer, GLenum pname, void** params);\nGLAPI void APIENTRY glGetNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, void* data);\nGLAPI void APIENTRY glProgramUniform1fEXT(GLuint program, GLint location, GLfloat v0);\nGLAPI void APIENTRY glProgramUniform2fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1);\nGLAPI void APIENTRY glProgramUniform3fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\nGLAPI void APIENTRY glProgramUniform4fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\nGLAPI void APIENTRY glProgramUniform1iEXT(GLuint program, GLint location, GLint v0);\nGLAPI void APIENTRY glProgramUniform2iEXT(GLuint program, GLint location, GLint v0, GLint v1);\nGLAPI void APIENTRY glProgramUniform3iEXT(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);\nGLAPI void APIENTRY glProgramUniform4iEXT(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\nGLAPI void APIENTRY glProgramUniform1fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniform2fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniform3fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniform4fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniform1ivEXT(GLuint program, GLint location, GLsizei count, const GLint* value);\nGLAPI void APIENTRY glProgramUniform2ivEXT(GLuint program, GLint location, GLsizei count, const GLint* value);\nGLAPI void APIENTRY glProgramUniform3ivEXT(GLuint program, GLint location, GLsizei count, const GLint* value);\nGLAPI void APIENTRY glProgramUniform4ivEXT(GLuint program, GLint location, GLsizei count, const GLint* value);\nGLAPI void APIENTRY glProgramUniformMatrix2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGLAPI void APIENTRY glTextureBufferEXT(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer);\nGLAPI void APIENTRY glMultiTexBufferEXT(GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer);\nGLAPI void APIENTRY glTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, const GLint* params);\nGLAPI void APIENTRY glTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, const GLuint* params);\nGLAPI void APIENTRY glGetTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, GLuint* params);\nGLAPI void APIENTRY glMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint* params);\nGLAPI void APIENTRY glMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, const GLuint* params);\nGLAPI void APIENTRY glGetMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, GLuint* params);\nGLAPI void APIENTRY glProgramUniform1uiEXT(GLuint program, GLint location, GLuint v0);\nGLAPI void APIENTRY glProgramUniform2uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1);\nGLAPI void APIENTRY glProgramUniform3uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);\nGLAPI void APIENTRY glProgramUniform4uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\nGLAPI void APIENTRY glProgramUniform1uivEXT(GLuint program, GLint location, GLsizei count, const GLuint* value);\nGLAPI void APIENTRY glProgramUniform2uivEXT(GLuint program, GLint location, GLsizei count, const GLuint* value);\nGLAPI void APIENTRY glProgramUniform3uivEXT(GLuint program, GLint location, GLsizei count, const GLuint* value);\nGLAPI void APIENTRY glProgramUniform4uivEXT(GLuint program, GLint location, GLsizei count, const GLuint* value);\nGLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params);\nGLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT(GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);\nGLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT(GLuint program, GLenum target, GLuint index, const GLint* params);\nGLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params);\nGLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT(GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\nGLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT(GLuint program, GLenum target, GLuint index, const GLuint* params);\nGLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params);\nGLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT(GLuint program, GLenum target, GLuint index, GLint* params);\nGLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT(GLuint program, GLenum target, GLuint index, GLuint* params);\nGLAPI void APIENTRY glEnableClientStateiEXT(GLenum array, GLuint index);\nGLAPI void APIENTRY glDisableClientStateiEXT(GLenum array, GLuint index);\nGLAPI void APIENTRY glGetFloati_vEXT(GLenum pname, GLuint index, GLfloat* params);\nGLAPI void APIENTRY glGetDoublei_vEXT(GLenum pname, GLuint index, GLdouble* params);\nGLAPI void APIENTRY glGetPointeri_vEXT(GLenum pname, GLuint index, void** params);\nGLAPI void APIENTRY glNamedProgramStringEXT(GLuint program, GLenum target, GLenum format, GLsizei len, const void* string);\nGLAPI void APIENTRY glNamedProgramLocalParameter4dEXT(GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT(GLuint program, GLenum target, GLuint index, const GLdouble* params);\nGLAPI void APIENTRY glNamedProgramLocalParameter4fEXT(GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT(GLuint program, GLenum target, GLuint index, const GLfloat* params);\nGLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT(GLuint program, GLenum target, GLuint index, GLdouble* params);\nGLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT(GLuint program, GLenum target, GLuint index, GLfloat* params);\nGLAPI void APIENTRY glGetNamedProgramivEXT(GLuint program, GLenum target, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGetNamedProgramStringEXT(GLuint program, GLenum target, GLenum pname, void* string);\nGLAPI void APIENTRY glNamedRenderbufferStorageEXT(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT(GLuint renderbuffer, GLenum pname, GLint* params);\nGLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width,\n                                                             GLsizei height);\nGLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT(GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples,\n                                                                     GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT(GLuint framebuffer, GLenum target);\nGLAPI void APIENTRY glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\nGLAPI void APIENTRY glNamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\nGLAPI void APIENTRY glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level,\n                                                   GLint zoffset);\nGLAPI void APIENTRY glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\nGLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT(GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params);\nGLAPI void APIENTRY glGenerateTextureMipmapEXT(GLuint texture, GLenum target);\nGLAPI void APIENTRY glGenerateMultiTexMipmapEXT(GLenum texunit, GLenum target);\nGLAPI void APIENTRY glFramebufferDrawBufferEXT(GLuint framebuffer, GLenum mode);\nGLAPI void APIENTRY glFramebufferDrawBuffersEXT(GLuint framebuffer, GLsizei n, const GLenum* bufs);\nGLAPI void APIENTRY glFramebufferReadBufferEXT(GLuint framebuffer, GLenum mode);\nGLAPI void APIENTRY glGetFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, GLint* params);\nGLAPI void APIENTRY glNamedCopyBufferSubDataEXT(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);\nGLAPI void APIENTRY glNamedFramebufferTextureEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);\nGLAPI void APIENTRY glNamedFramebufferTextureLayerEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);\nGLAPI void APIENTRY glNamedFramebufferTextureFaceEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face);\nGLAPI void APIENTRY glTextureRenderbufferEXT(GLuint texture, GLenum target, GLuint renderbuffer);\nGLAPI void APIENTRY glMultiTexRenderbufferEXT(GLenum texunit, GLenum target, GLuint renderbuffer);\nGLAPI void APIENTRY glVertexArrayVertexOffsetEXT(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayColorOffsetEXT(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayEdgeFlagOffsetEXT(GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayIndexOffsetEXT(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayNormalOffsetEXT(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayTexCoordOffsetEXT(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayMultiTexCoordOffsetEXT(GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type,\n                                                        GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayFogCoordOffsetEXT(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArraySecondaryColorOffsetEXT(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayVertexAttribOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type,\n                                                       GLboolean normalized, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayVertexAttribIOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride,\n                                                        GLintptr offset);\nGLAPI void APIENTRY glEnableVertexArrayEXT(GLuint vaobj, GLenum array);\nGLAPI void APIENTRY glDisableVertexArrayEXT(GLuint vaobj, GLenum array);\nGLAPI void APIENTRY glEnableVertexArrayAttribEXT(GLuint vaobj, GLuint index);\nGLAPI void APIENTRY glDisableVertexArrayAttribEXT(GLuint vaobj, GLuint index);\nGLAPI void APIENTRY glGetVertexArrayIntegervEXT(GLuint vaobj, GLenum pname, GLint* param);\nGLAPI void APIENTRY glGetVertexArrayPointervEXT(GLuint vaobj, GLenum pname, void** param);\nGLAPI void APIENTRY glGetVertexArrayIntegeri_vEXT(GLuint vaobj, GLuint index, GLenum pname, GLint* param);\nGLAPI void APIENTRY glGetVertexArrayPointeri_vEXT(GLuint vaobj, GLuint index, GLenum pname, void** param);\nGLAPI void* APIENTRY glMapNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access);\nGLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GLsizeiptr length);\nGLAPI void APIENTRY glNamedBufferStorageEXT(GLuint buffer, GLsizeiptr size, const void* data, GLbitfield flags);\nGLAPI void APIENTRY glClearNamedBufferDataEXT(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void* data);\nGLAPI void APIENTRY glClearNamedBufferSubDataEXT(GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format,\n                                                 GLenum type, const void* data);\nGLAPI void APIENTRY glNamedFramebufferParameteriEXT(GLuint framebuffer, GLenum pname, GLint param);\nGLAPI void APIENTRY glGetNamedFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, GLint* params);\nGLAPI void APIENTRY glProgramUniform1dEXT(GLuint program, GLint location, GLdouble x);\nGLAPI void APIENTRY glProgramUniform2dEXT(GLuint program, GLint location, GLdouble x, GLdouble y);\nGLAPI void APIENTRY glProgramUniform3dEXT(GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glProgramUniform4dEXT(GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glProgramUniform1dvEXT(GLuint program, GLint location, GLsizei count, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniform2dvEXT(GLuint program, GLint location, GLsizei count, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniform3dvEXT(GLuint program, GLint location, GLsizei count, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniform4dvEXT(GLuint program, GLint location, GLsizei count, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix2dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix3dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix4dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);\nGLAPI void APIENTRY glTextureBufferRangeEXT(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);\nGLAPI void APIENTRY glTextureStorage1DEXT(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\nGLAPI void APIENTRY glTextureStorage2DEXT(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glTextureStorage3DEXT(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width,\n                                          GLsizei height, GLsizei depth);\nGLAPI void APIENTRY glTextureStorage2DMultisampleEXT(GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width,\n                                                     GLsizei height, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glTextureStorage3DMultisampleEXT(GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width,\n                                                     GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glVertexArrayBindVertexBufferEXT(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\nGLAPI void APIENTRY glVertexArrayVertexAttribFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized,\n                                                       GLuint relativeoffset);\nGLAPI void APIENTRY glVertexArrayVertexAttribIFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexArrayVertexAttribLFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexArrayVertexAttribBindingEXT(GLuint vaobj, GLuint attribindex, GLuint bindingindex);\nGLAPI void APIENTRY glVertexArrayVertexBindingDivisorEXT(GLuint vaobj, GLuint bindingindex, GLuint divisor);\nGLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride,\n                                                        GLintptr offset);\nGLAPI void APIENTRY glTexturePageCommitmentEXT(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,\n                                               GLsizei height, GLsizei depth, GLboolean commit);\nGLAPI void APIENTRY glVertexArrayVertexAttribDivisorEXT(GLuint vaobj, GLuint index, GLuint divisor);\n#endif\n#endif /* GL_EXT_direct_state_access */\n\n#ifndef GL_EXT_draw_instanced\n#define GL_EXT_draw_instanced 1\ntypedef void(APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC)(GLenum mode, GLint start, GLsizei count, GLsizei primcount);\ntypedef void(APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC)(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawArraysInstancedEXT(GLenum mode, GLint start, GLsizei count, GLsizei primcount);\nGLAPI void APIENTRY glDrawElementsInstancedEXT(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount);\n#endif\n#endif /* GL_EXT_draw_instanced */\n\n#ifndef GL_EXT_multiview_tessellation_geometry_shader\n#define GL_EXT_multiview_tessellation_geometry_shader 1\n#endif /* GL_EXT_multiview_tessellation_geometry_shader */\n\n#ifndef GL_EXT_multiview_texture_multisample\n#define GL_EXT_multiview_texture_multisample 1\n#endif /* GL_EXT_multiview_texture_multisample */\n\n#ifndef GL_EXT_multiview_timer_query\n#define GL_EXT_multiview_timer_query 1\n#endif /* GL_EXT_multiview_timer_query */\n\n#ifndef GL_EXT_polygon_offset_clamp\n#define GL_EXT_polygon_offset_clamp 1\n#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B\ntypedef void(APIENTRYP PFNGLPOLYGONOFFSETCLAMPEXTPROC)(GLfloat factor, GLfloat units, GLfloat clamp);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glPolygonOffsetClampEXT(GLfloat factor, GLfloat units, GLfloat clamp);\n#endif\n#endif /* GL_EXT_polygon_offset_clamp */\n\n#ifndef GL_EXT_post_depth_coverage\n#define GL_EXT_post_depth_coverage 1\n#endif /* GL_EXT_post_depth_coverage */\n\n#ifndef GL_EXT_raster_multisample\n#define GL_EXT_raster_multisample 1\n#define GL_RASTER_MULTISAMPLE_EXT 0x9327\n#define GL_RASTER_SAMPLES_EXT 0x9328\n#define GL_MAX_RASTER_SAMPLES_EXT 0x9329\n#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A\n#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B\n#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C\ntypedef void(APIENTRYP PFNGLRASTERSAMPLESEXTPROC)(GLuint samples, GLboolean fixedsamplelocations);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glRasterSamplesEXT(GLuint samples, GLboolean fixedsamplelocations);\n#endif\n#endif /* GL_EXT_raster_multisample */\n\n#ifndef GL_EXT_separate_shader_objects\n#define GL_EXT_separate_shader_objects 1\n#define GL_ACTIVE_PROGRAM_EXT 0x8B8D\ntypedef void(APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC)(GLenum type, GLuint program);\ntypedef void(APIENTRYP PFNGLACTIVEPROGRAMEXTPROC)(GLuint program);\ntypedef GLuint(APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC)(GLenum type, const GLchar* string);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glUseShaderProgramEXT(GLenum type, GLuint program);\nGLAPI void APIENTRY glActiveProgramEXT(GLuint program);\nGLAPI GLuint APIENTRY glCreateShaderProgramEXT(GLenum type, const GLchar* string);\n#endif\n#endif /* GL_EXT_separate_shader_objects */\n\n#ifndef GL_EXT_shader_framebuffer_fetch\n#define GL_EXT_shader_framebuffer_fetch 1\n#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52\n#endif /* GL_EXT_shader_framebuffer_fetch */\n\n#ifndef GL_EXT_shader_framebuffer_fetch_non_coherent\n#define GL_EXT_shader_framebuffer_fetch_non_coherent 1\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC)(void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glFramebufferFetchBarrierEXT(void);\n#endif\n#endif /* GL_EXT_shader_framebuffer_fetch_non_coherent */\n\n#ifndef GL_EXT_shader_integer_mix\n#define GL_EXT_shader_integer_mix 1\n#endif /* GL_EXT_shader_integer_mix */\n\n#ifndef GL_EXT_texture_compression_s3tc\n#define GL_EXT_texture_compression_s3tc 1\n#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0\n#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1\n#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2\n#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3\n#endif /* GL_EXT_texture_compression_s3tc */\n\n#ifndef GL_EXT_texture_filter_minmax\n#define GL_EXT_texture_filter_minmax 1\n#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366\n#define GL_WEIGHTED_AVERAGE_EXT 0x9367\n#endif /* GL_EXT_texture_filter_minmax */\n\n#ifndef GL_EXT_texture_sRGB_R8\n#define GL_EXT_texture_sRGB_R8 1\n#define GL_SR8_EXT 0x8FBD\n#endif /* GL_EXT_texture_sRGB_R8 */\n\n#ifndef GL_EXT_texture_sRGB_decode\n#define GL_EXT_texture_sRGB_decode 1\n#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48\n#define GL_DECODE_EXT 0x8A49\n#define GL_SKIP_DECODE_EXT 0x8A4A\n#endif /* GL_EXT_texture_sRGB_decode */\n\n#ifndef GL_EXT_texture_shadow_lod\n#define GL_EXT_texture_shadow_lod 1\n#endif /* GL_EXT_texture_shadow_lod */\n\n#ifndef GL_EXT_window_rectangles\n#define GL_EXT_window_rectangles 1\n#define GL_INCLUSIVE_EXT 0x8F10\n#define GL_EXCLUSIVE_EXT 0x8F11\n#define GL_WINDOW_RECTANGLE_EXT 0x8F12\n#define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13\n#define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14\n#define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15\ntypedef void(APIENTRYP PFNGLWINDOWRECTANGLESEXTPROC)(GLenum mode, GLsizei count, const GLint* box);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glWindowRectanglesEXT(GLenum mode, GLsizei count, const GLint* box);\n#endif\n#endif /* GL_EXT_window_rectangles */\n\n#ifndef GL_INTEL_blackhole_render\n#define GL_INTEL_blackhole_render 1\n#define GL_BLACKHOLE_RENDER_INTEL 0x83FC\n#endif /* GL_INTEL_blackhole_render */\n\n#ifndef GL_INTEL_conservative_rasterization\n#define GL_INTEL_conservative_rasterization 1\n#define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE\n#endif /* GL_INTEL_conservative_rasterization */\n\n#ifndef GL_INTEL_framebuffer_CMAA\n#define GL_INTEL_framebuffer_CMAA 1\ntypedef void(APIENTRYP PFNGLAPPLYFRAMEBUFFERATTACHMENTCMAAINTELPROC)(void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glApplyFramebufferAttachmentCMAAINTEL(void);\n#endif\n#endif /* GL_INTEL_framebuffer_CMAA */\n\n#ifndef GL_INTEL_performance_query\n#define GL_INTEL_performance_query 1\n#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000\n#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001\n#define GL_PERFQUERY_WAIT_INTEL 0x83FB\n#define GL_PERFQUERY_FLUSH_INTEL 0x83FA\n#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9\n#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0\n#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1\n#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2\n#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3\n#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4\n#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5\n#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8\n#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9\n#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA\n#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB\n#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC\n#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD\n#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE\n#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF\n#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500\ntypedef void(APIENTRYP PFNGLBEGINPERFQUERYINTELPROC)(GLuint queryHandle);\ntypedef void(APIENTRYP PFNGLCREATEPERFQUERYINTELPROC)(GLuint queryId, GLuint* queryHandle);\ntypedef void(APIENTRYP PFNGLDELETEPERFQUERYINTELPROC)(GLuint queryHandle);\ntypedef void(APIENTRYP PFNGLENDPERFQUERYINTELPROC)(GLuint queryHandle);\ntypedef void(APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC)(GLuint* queryId);\ntypedef void(APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC)(GLuint queryId, GLuint* nextQueryId);\ntypedef void(APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC)(\n  GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar* counterName, GLuint counterDescLength, GLchar* counterDesc,\n  GLuint* counterOffset, GLuint* counterDataSize, GLuint* counterTypeEnum, GLuint* counterDataTypeEnum, GLuint64* rawCounterMaxValue);\ntypedef void(APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC)(GLuint queryHandle, GLuint flags, GLsizei dataSize, void* data, GLuint* bytesWritten);\ntypedef void(APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC)(GLchar* queryName, GLuint* queryId);\ntypedef void(APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC)(GLuint queryId, GLuint queryNameLength, GLchar* queryName, GLuint* dataSize,\n                                                       GLuint* noCounters, GLuint* noInstances, GLuint* capsMask);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBeginPerfQueryINTEL(GLuint queryHandle);\nGLAPI void APIENTRY glCreatePerfQueryINTEL(GLuint queryId, GLuint* queryHandle);\nGLAPI void APIENTRY glDeletePerfQueryINTEL(GLuint queryHandle);\nGLAPI void APIENTRY glEndPerfQueryINTEL(GLuint queryHandle);\nGLAPI void APIENTRY glGetFirstPerfQueryIdINTEL(GLuint* queryId);\nGLAPI void APIENTRY glGetNextPerfQueryIdINTEL(GLuint queryId, GLuint* nextQueryId);\nGLAPI void APIENTRY glGetPerfCounterInfoINTEL(GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar* counterName,\n                                              GLuint counterDescLength, GLchar* counterDesc, GLuint* counterOffset, GLuint* counterDataSize,\n                                              GLuint* counterTypeEnum, GLuint* counterDataTypeEnum, GLuint64* rawCounterMaxValue);\nGLAPI void APIENTRY glGetPerfQueryDataINTEL(GLuint queryHandle, GLuint flags, GLsizei dataSize, void* data, GLuint* bytesWritten);\nGLAPI void APIENTRY glGetPerfQueryIdByNameINTEL(GLchar* queryName, GLuint* queryId);\nGLAPI void APIENTRY glGetPerfQueryInfoINTEL(GLuint queryId, GLuint queryNameLength, GLchar* queryName, GLuint* dataSize, GLuint* noCounters,\n                                            GLuint* noInstances, GLuint* capsMask);\n#endif\n#endif /* GL_INTEL_performance_query */\n\n#ifndef GL_MESA_framebuffer_flip_x\n#define GL_MESA_framebuffer_flip_x 1\n#define GL_FRAMEBUFFER_FLIP_X_MESA 0x8BBC\n#endif /* GL_MESA_framebuffer_flip_x */\n\n#ifndef GL_MESA_framebuffer_flip_y\n#define GL_MESA_framebuffer_flip_y 1\n#define GL_FRAMEBUFFER_FLIP_Y_MESA 0x8BBB\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERPARAMETERIMESAPROC)(GLenum target, GLenum pname, GLint param);\ntypedef void(APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVMESAPROC)(GLenum target, GLenum pname, GLint* params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glFramebufferParameteriMESA(GLenum target, GLenum pname, GLint param);\nGLAPI void APIENTRY glGetFramebufferParameterivMESA(GLenum target, GLenum pname, GLint* params);\n#endif\n#endif /* GL_MESA_framebuffer_flip_y */\n\n#ifndef GL_MESA_framebuffer_swap_xy\n#define GL_MESA_framebuffer_swap_xy 1\n#define GL_FRAMEBUFFER_SWAP_XY_MESA 0x8BBD\n#endif /* GL_MESA_framebuffer_swap_xy */\n\n#ifndef GL_NV_bindless_multi_draw_indirect\n#define GL_NV_bindless_multi_draw_indirect 1\ntypedef void(APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC)(GLenum mode, const void* indirect, GLsizei drawCount, GLsizei stride,\n                                                                   GLint vertexBufferCount);\ntypedef void(APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC)(GLenum mode, GLenum type, const void* indirect, GLsizei drawCount,\n                                                                     GLsizei stride, GLint vertexBufferCount);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMultiDrawArraysIndirectBindlessNV(GLenum mode, const void* indirect, GLsizei drawCount, GLsizei stride,\n                                                        GLint vertexBufferCount);\nGLAPI void APIENTRY glMultiDrawElementsIndirectBindlessNV(GLenum mode, GLenum type, const void* indirect, GLsizei drawCount, GLsizei stride,\n                                                          GLint vertexBufferCount);\n#endif\n#endif /* GL_NV_bindless_multi_draw_indirect */\n\n#ifndef GL_NV_bindless_multi_draw_indirect_count\n#define GL_NV_bindless_multi_draw_indirect_count 1\ntypedef void(APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC)(GLenum mode, const void* indirect, GLsizei drawCount,\n                                                                        GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount);\ntypedef void(APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC)(GLenum mode, GLenum type, const void* indirect, GLsizei drawCount,\n                                                                          GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMultiDrawArraysIndirectBindlessCountNV(GLenum mode, const void* indirect, GLsizei drawCount, GLsizei maxDrawCount,\n                                                             GLsizei stride, GLint vertexBufferCount);\nGLAPI void APIENTRY glMultiDrawElementsIndirectBindlessCountNV(GLenum mode, GLenum type, const void* indirect, GLsizei drawCount,\n                                                               GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount);\n#endif\n#endif /* GL_NV_bindless_multi_draw_indirect_count */\n\n#ifndef GL_NV_bindless_texture\n#define GL_NV_bindless_texture 1\ntypedef GLuint64(APIENTRYP PFNGLGETTEXTUREHANDLENVPROC)(GLuint texture);\ntypedef GLuint64(APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC)(GLuint texture, GLuint sampler);\ntypedef void(APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC)(GLuint64 handle);\ntypedef void(APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC)(GLuint64 handle);\ntypedef GLuint64(APIENTRYP PFNGLGETIMAGEHANDLENVPROC)(GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);\ntypedef void(APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC)(GLuint64 handle, GLenum access);\ntypedef void(APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC)(GLuint64 handle);\ntypedef void(APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC)(GLint location, GLuint64 value);\ntypedef void(APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC)(GLint location, GLsizei count, const GLuint64* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC)(GLuint program, GLint location, GLuint64 value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLuint64* values);\ntypedef GLboolean(APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC)(GLuint64 handle);\ntypedef GLboolean(APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC)(GLuint64 handle);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLuint64 APIENTRY glGetTextureHandleNV(GLuint texture);\nGLAPI GLuint64 APIENTRY glGetTextureSamplerHandleNV(GLuint texture, GLuint sampler);\nGLAPI void APIENTRY glMakeTextureHandleResidentNV(GLuint64 handle);\nGLAPI void APIENTRY glMakeTextureHandleNonResidentNV(GLuint64 handle);\nGLAPI GLuint64 APIENTRY glGetImageHandleNV(GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);\nGLAPI void APIENTRY glMakeImageHandleResidentNV(GLuint64 handle, GLenum access);\nGLAPI void APIENTRY glMakeImageHandleNonResidentNV(GLuint64 handle);\nGLAPI void APIENTRY glUniformHandleui64NV(GLint location, GLuint64 value);\nGLAPI void APIENTRY glUniformHandleui64vNV(GLint location, GLsizei count, const GLuint64* value);\nGLAPI void APIENTRY glProgramUniformHandleui64NV(GLuint program, GLint location, GLuint64 value);\nGLAPI void APIENTRY glProgramUniformHandleui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64* values);\nGLAPI GLboolean APIENTRY glIsTextureHandleResidentNV(GLuint64 handle);\nGLAPI GLboolean APIENTRY glIsImageHandleResidentNV(GLuint64 handle);\n#endif\n#endif /* GL_NV_bindless_texture */\n\n#ifndef GL_NV_blend_equation_advanced\n#define GL_NV_blend_equation_advanced 1\n#define GL_BLEND_OVERLAP_NV 0x9281\n#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280\n#define GL_BLUE_NV 0x1905\n#define GL_COLORBURN_NV 0x929A\n#define GL_COLORDODGE_NV 0x9299\n#define GL_CONJOINT_NV 0x9284\n#define GL_CONTRAST_NV 0x92A1\n#define GL_DARKEN_NV 0x9297\n#define GL_DIFFERENCE_NV 0x929E\n#define GL_DISJOINT_NV 0x9283\n#define GL_DST_ATOP_NV 0x928F\n#define GL_DST_IN_NV 0x928B\n#define GL_DST_NV 0x9287\n#define GL_DST_OUT_NV 0x928D\n#define GL_DST_OVER_NV 0x9289\n#define GL_EXCLUSION_NV 0x92A0\n#define GL_GREEN_NV 0x1904\n#define GL_HARDLIGHT_NV 0x929B\n#define GL_HARDMIX_NV 0x92A9\n#define GL_HSL_COLOR_NV 0x92AF\n#define GL_HSL_HUE_NV 0x92AD\n#define GL_HSL_LUMINOSITY_NV 0x92B0\n#define GL_HSL_SATURATION_NV 0x92AE\n#define GL_INVERT_OVG_NV 0x92B4\n#define GL_INVERT_RGB_NV 0x92A3\n#define GL_LIGHTEN_NV 0x9298\n#define GL_LINEARBURN_NV 0x92A5\n#define GL_LINEARDODGE_NV 0x92A4\n#define GL_LINEARLIGHT_NV 0x92A7\n#define GL_MINUS_CLAMPED_NV 0x92B3\n#define GL_MINUS_NV 0x929F\n#define GL_MULTIPLY_NV 0x9294\n#define GL_OVERLAY_NV 0x9296\n#define GL_PINLIGHT_NV 0x92A8\n#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2\n#define GL_PLUS_CLAMPED_NV 0x92B1\n#define GL_PLUS_DARKER_NV 0x9292\n#define GL_PLUS_NV 0x9291\n#define GL_RED_NV 0x1903\n#define GL_SCREEN_NV 0x9295\n#define GL_SOFTLIGHT_NV 0x929C\n#define GL_SRC_ATOP_NV 0x928E\n#define GL_SRC_IN_NV 0x928A\n#define GL_SRC_NV 0x9286\n#define GL_SRC_OUT_NV 0x928C\n#define GL_SRC_OVER_NV 0x9288\n#define GL_UNCORRELATED_NV 0x9282\n#define GL_VIVIDLIGHT_NV 0x92A6\n#define GL_XOR_NV 0x1506\ntypedef void(APIENTRYP PFNGLBLENDPARAMETERINVPROC)(GLenum pname, GLint value);\ntypedef void(APIENTRYP PFNGLBLENDBARRIERNVPROC)(void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlendParameteriNV(GLenum pname, GLint value);\nGLAPI void APIENTRY glBlendBarrierNV(void);\n#endif\n#endif /* GL_NV_blend_equation_advanced */\n\n#ifndef GL_NV_blend_equation_advanced_coherent\n#define GL_NV_blend_equation_advanced_coherent 1\n#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285\n#endif /* GL_NV_blend_equation_advanced_coherent */\n\n#ifndef GL_NV_blend_minmax_factor\n#define GL_NV_blend_minmax_factor 1\n#define GL_FACTOR_MIN_AMD 0x901C\n#define GL_FACTOR_MAX_AMD 0x901D\n#endif /* GL_NV_blend_minmax_factor */\n\n#ifndef GL_NV_clip_space_w_scaling\n#define GL_NV_clip_space_w_scaling 1\n#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C\n#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D\n#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E\ntypedef void(APIENTRYP PFNGLVIEWPORTPOSITIONWSCALENVPROC)(GLuint index, GLfloat xcoeff, GLfloat ycoeff);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glViewportPositionWScaleNV(GLuint index, GLfloat xcoeff, GLfloat ycoeff);\n#endif\n#endif /* GL_NV_clip_space_w_scaling */\n\n#ifndef GL_NV_command_list\n#define GL_NV_command_list 1\n#define GL_TERMINATE_SEQUENCE_COMMAND_NV 0x0000\n#define GL_NOP_COMMAND_NV 0x0001\n#define GL_DRAW_ELEMENTS_COMMAND_NV 0x0002\n#define GL_DRAW_ARRAYS_COMMAND_NV 0x0003\n#define GL_DRAW_ELEMENTS_STRIP_COMMAND_NV 0x0004\n#define GL_DRAW_ARRAYS_STRIP_COMMAND_NV 0x0005\n#define GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV 0x0006\n#define GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV 0x0007\n#define GL_ELEMENT_ADDRESS_COMMAND_NV 0x0008\n#define GL_ATTRIBUTE_ADDRESS_COMMAND_NV 0x0009\n#define GL_UNIFORM_ADDRESS_COMMAND_NV 0x000A\n#define GL_BLEND_COLOR_COMMAND_NV 0x000B\n#define GL_STENCIL_REF_COMMAND_NV 0x000C\n#define GL_LINE_WIDTH_COMMAND_NV 0x000D\n#define GL_POLYGON_OFFSET_COMMAND_NV 0x000E\n#define GL_ALPHA_REF_COMMAND_NV 0x000F\n#define GL_VIEWPORT_COMMAND_NV 0x0010\n#define GL_SCISSOR_COMMAND_NV 0x0011\n#define GL_FRONT_FACE_COMMAND_NV 0x0012\ntypedef void(APIENTRYP PFNGLCREATESTATESNVPROC)(GLsizei n, GLuint* states);\ntypedef void(APIENTRYP PFNGLDELETESTATESNVPROC)(GLsizei n, const GLuint* states);\ntypedef GLboolean(APIENTRYP PFNGLISSTATENVPROC)(GLuint state);\ntypedef void(APIENTRYP PFNGLSTATECAPTURENVPROC)(GLuint state, GLenum mode);\ntypedef GLuint(APIENTRYP PFNGLGETCOMMANDHEADERNVPROC)(GLenum tokenID, GLuint size);\ntypedef GLushort(APIENTRYP PFNGLGETSTAGEINDEXNVPROC)(GLenum shadertype);\ntypedef void(APIENTRYP PFNGLDRAWCOMMANDSNVPROC)(GLenum primitiveMode, GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, GLuint count);\ntypedef void(APIENTRYP PFNGLDRAWCOMMANDSADDRESSNVPROC)(GLenum primitiveMode, const GLuint64* indirects, const GLsizei* sizes, GLuint count);\ntypedef void(APIENTRYP PFNGLDRAWCOMMANDSSTATESNVPROC)(GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, const GLuint* states,\n                                                      const GLuint* fbos, GLuint count);\ntypedef void(APIENTRYP PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC)(const GLuint64* indirects, const GLsizei* sizes, const GLuint* states,\n                                                             const GLuint* fbos, GLuint count);\ntypedef void(APIENTRYP PFNGLCREATECOMMANDLISTSNVPROC)(GLsizei n, GLuint* lists);\ntypedef void(APIENTRYP PFNGLDELETECOMMANDLISTSNVPROC)(GLsizei n, const GLuint* lists);\ntypedef GLboolean(APIENTRYP PFNGLISCOMMANDLISTNVPROC)(GLuint list);\ntypedef void(APIENTRYP PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC)(GLuint list, GLuint segment, const void** indirects, const GLsizei* sizes,\n                                                                const GLuint* states, const GLuint* fbos, GLuint count);\ntypedef void(APIENTRYP PFNGLCOMMANDLISTSEGMENTSNVPROC)(GLuint list, GLuint segments);\ntypedef void(APIENTRYP PFNGLCOMPILECOMMANDLISTNVPROC)(GLuint list);\ntypedef void(APIENTRYP PFNGLCALLCOMMANDLISTNVPROC)(GLuint list);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glCreateStatesNV(GLsizei n, GLuint* states);\nGLAPI void APIENTRY glDeleteStatesNV(GLsizei n, const GLuint* states);\nGLAPI GLboolean APIENTRY glIsStateNV(GLuint state);\nGLAPI void APIENTRY glStateCaptureNV(GLuint state, GLenum mode);\nGLAPI GLuint APIENTRY glGetCommandHeaderNV(GLenum tokenID, GLuint size);\nGLAPI GLushort APIENTRY glGetStageIndexNV(GLenum shadertype);\nGLAPI void APIENTRY glDrawCommandsNV(GLenum primitiveMode, GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, GLuint count);\nGLAPI void APIENTRY glDrawCommandsAddressNV(GLenum primitiveMode, const GLuint64* indirects, const GLsizei* sizes, GLuint count);\nGLAPI void APIENTRY glDrawCommandsStatesNV(GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, const GLuint* states,\n                                           const GLuint* fbos, GLuint count);\nGLAPI void APIENTRY glDrawCommandsStatesAddressNV(const GLuint64* indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos,\n                                                  GLuint count);\nGLAPI void APIENTRY glCreateCommandListsNV(GLsizei n, GLuint* lists);\nGLAPI void APIENTRY glDeleteCommandListsNV(GLsizei n, const GLuint* lists);\nGLAPI GLboolean APIENTRY glIsCommandListNV(GLuint list);\nGLAPI void APIENTRY glListDrawCommandsStatesClientNV(GLuint list, GLuint segment, const void** indirects, const GLsizei* sizes,\n                                                     const GLuint* states, const GLuint* fbos, GLuint count);\nGLAPI void APIENTRY glCommandListSegmentsNV(GLuint list, GLuint segments);\nGLAPI void APIENTRY glCompileCommandListNV(GLuint list);\nGLAPI void APIENTRY glCallCommandListNV(GLuint list);\n#endif\n#endif /* GL_NV_command_list */\n\n#ifndef GL_NV_compute_shader_derivatives\n#define GL_NV_compute_shader_derivatives 1\n#endif /* GL_NV_compute_shader_derivatives */\n\n#ifndef GL_NV_conditional_render\n#define GL_NV_conditional_render 1\n#define GL_QUERY_WAIT_NV 0x8E13\n#define GL_QUERY_NO_WAIT_NV 0x8E14\n#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15\n#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16\ntypedef void(APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC)(GLuint id, GLenum mode);\ntypedef void(APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC)(void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBeginConditionalRenderNV(GLuint id, GLenum mode);\nGLAPI void APIENTRY glEndConditionalRenderNV(void);\n#endif\n#endif /* GL_NV_conditional_render */\n\n#ifndef GL_NV_conservative_raster\n#define GL_NV_conservative_raster 1\n#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346\n#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347\n#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348\n#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349\ntypedef void(APIENTRYP PFNGLSUBPIXELPRECISIONBIASNVPROC)(GLuint xbits, GLuint ybits);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glSubpixelPrecisionBiasNV(GLuint xbits, GLuint ybits);\n#endif\n#endif /* GL_NV_conservative_raster */\n\n#ifndef GL_NV_conservative_raster_dilate\n#define GL_NV_conservative_raster_dilate 1\n#define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379\n#define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A\n#define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B\ntypedef void(APIENTRYP PFNGLCONSERVATIVERASTERPARAMETERFNVPROC)(GLenum pname, GLfloat value);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glConservativeRasterParameterfNV(GLenum pname, GLfloat value);\n#endif\n#endif /* GL_NV_conservative_raster_dilate */\n\n#ifndef GL_NV_conservative_raster_pre_snap\n#define GL_NV_conservative_raster_pre_snap 1\n#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV 0x9550\n#endif /* GL_NV_conservative_raster_pre_snap */\n\n#ifndef GL_NV_conservative_raster_pre_snap_triangles\n#define GL_NV_conservative_raster_pre_snap_triangles 1\n#define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D\n#define GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 0x954E\n#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV 0x954F\ntypedef void(APIENTRYP PFNGLCONSERVATIVERASTERPARAMETERINVPROC)(GLenum pname, GLint param);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glConservativeRasterParameteriNV(GLenum pname, GLint param);\n#endif\n#endif /* GL_NV_conservative_raster_pre_snap_triangles */\n\n#ifndef GL_NV_conservative_raster_underestimation\n#define GL_NV_conservative_raster_underestimation 1\n#endif /* GL_NV_conservative_raster_underestimation */\n\n#ifndef GL_NV_depth_buffer_float\n#define GL_NV_depth_buffer_float 1\n#define GL_DEPTH_COMPONENT32F_NV 0x8DAB\n#define GL_DEPTH32F_STENCIL8_NV 0x8DAC\n#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD\n#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF\ntypedef void(APIENTRYP PFNGLDEPTHRANGEDNVPROC)(GLdouble zNear, GLdouble zFar);\ntypedef void(APIENTRYP PFNGLCLEARDEPTHDNVPROC)(GLdouble depth);\ntypedef void(APIENTRYP PFNGLDEPTHBOUNDSDNVPROC)(GLdouble zmin, GLdouble zmax);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDepthRangedNV(GLdouble zNear, GLdouble zFar);\nGLAPI void APIENTRY glClearDepthdNV(GLdouble depth);\nGLAPI void APIENTRY glDepthBoundsdNV(GLdouble zmin, GLdouble zmax);\n#endif\n#endif /* GL_NV_depth_buffer_float */\n\n#ifndef GL_NV_draw_vulkan_image\n#define GL_NV_draw_vulkan_image 1\ntypedef void(APIENTRY* GLVULKANPROCNV)(void);\ntypedef void(APIENTRYP PFNGLDRAWVKIMAGENVPROC)(GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z,\n                                               GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1);\ntypedef GLVULKANPROCNV(APIENTRYP PFNGLGETVKPROCADDRNVPROC)(const GLchar* name);\ntypedef void(APIENTRYP PFNGLWAITVKSEMAPHORENVPROC)(GLuint64 vkSemaphore);\ntypedef void(APIENTRYP PFNGLSIGNALVKSEMAPHORENVPROC)(GLuint64 vkSemaphore);\ntypedef void(APIENTRYP PFNGLSIGNALVKFENCENVPROC)(GLuint64 vkFence);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawVkImageNV(GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0,\n                                    GLfloat t0, GLfloat s1, GLfloat t1);\nGLAPI GLVULKANPROCNV APIENTRY glGetVkProcAddrNV(const GLchar* name);\nGLAPI void APIENTRY glWaitVkSemaphoreNV(GLuint64 vkSemaphore);\nGLAPI void APIENTRY glSignalVkSemaphoreNV(GLuint64 vkSemaphore);\nGLAPI void APIENTRY glSignalVkFenceNV(GLuint64 vkFence);\n#endif\n#endif /* GL_NV_draw_vulkan_image */\n\n#ifndef GL_NV_fill_rectangle\n#define GL_NV_fill_rectangle 1\n#define GL_FILL_RECTANGLE_NV 0x933C\n#endif /* GL_NV_fill_rectangle */\n\n#ifndef GL_NV_fragment_coverage_to_color\n#define GL_NV_fragment_coverage_to_color 1\n#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD\n#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE\ntypedef void(APIENTRYP PFNGLFRAGMENTCOVERAGECOLORNVPROC)(GLuint color);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glFragmentCoverageColorNV(GLuint color);\n#endif\n#endif /* GL_NV_fragment_coverage_to_color */\n\n#ifndef GL_NV_fragment_shader_barycentric\n#define GL_NV_fragment_shader_barycentric 1\n#endif /* GL_NV_fragment_shader_barycentric */\n\n#ifndef GL_NV_fragment_shader_interlock\n#define GL_NV_fragment_shader_interlock 1\n#endif /* GL_NV_fragment_shader_interlock */\n\n#ifndef GL_NV_framebuffer_mixed_samples\n#define GL_NV_framebuffer_mixed_samples 1\n#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331\n#define GL_COLOR_SAMPLES_NV 0x8E20\n#define GL_DEPTH_SAMPLES_NV 0x932D\n#define GL_STENCIL_SAMPLES_NV 0x932E\n#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F\n#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330\n#define GL_COVERAGE_MODULATION_NV 0x9332\n#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333\ntypedef void(APIENTRYP PFNGLCOVERAGEMODULATIONTABLENVPROC)(GLsizei n, const GLfloat* v);\ntypedef void(APIENTRYP PFNGLGETCOVERAGEMODULATIONTABLENVPROC)(GLsizei bufSize, GLfloat* v);\ntypedef void(APIENTRYP PFNGLCOVERAGEMODULATIONNVPROC)(GLenum components);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glCoverageModulationTableNV(GLsizei n, const GLfloat* v);\nGLAPI void APIENTRY glGetCoverageModulationTableNV(GLsizei bufSize, GLfloat* v);\nGLAPI void APIENTRY glCoverageModulationNV(GLenum components);\n#endif\n#endif /* GL_NV_framebuffer_mixed_samples */\n\n#ifndef GL_NV_framebuffer_multisample_coverage\n#define GL_NV_framebuffer_multisample_coverage 1\n#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB\n#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10\n#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11\n#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12\ntypedef void(APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC)(GLenum target, GLsizei coverageSamples, GLsizei colorSamples,\n                                                                          GLenum internalformat, GLsizei width, GLsizei height);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV(GLenum target, GLsizei coverageSamples, GLsizei colorSamples,\n                                                               GLenum internalformat, GLsizei width, GLsizei height);\n#endif\n#endif /* GL_NV_framebuffer_multisample_coverage */\n\n#ifndef GL_NV_geometry_shader_passthrough\n#define GL_NV_geometry_shader_passthrough 1\n#endif /* GL_NV_geometry_shader_passthrough */\n\n#ifndef GL_NV_gpu_shader5\n#define GL_NV_gpu_shader5 1\ntypedef khronos_int64_t GLint64EXT;\n#define GL_INT64_NV 0x140E\n#define GL_UNSIGNED_INT64_NV 0x140F\n#define GL_INT8_NV 0x8FE0\n#define GL_INT8_VEC2_NV 0x8FE1\n#define GL_INT8_VEC3_NV 0x8FE2\n#define GL_INT8_VEC4_NV 0x8FE3\n#define GL_INT16_NV 0x8FE4\n#define GL_INT16_VEC2_NV 0x8FE5\n#define GL_INT16_VEC3_NV 0x8FE6\n#define GL_INT16_VEC4_NV 0x8FE7\n#define GL_INT64_VEC2_NV 0x8FE9\n#define GL_INT64_VEC3_NV 0x8FEA\n#define GL_INT64_VEC4_NV 0x8FEB\n#define GL_UNSIGNED_INT8_NV 0x8FEC\n#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED\n#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE\n#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF\n#define GL_UNSIGNED_INT16_NV 0x8FF0\n#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1\n#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2\n#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3\n#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5\n#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6\n#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7\n#define GL_FLOAT16_NV 0x8FF8\n#define GL_FLOAT16_VEC2_NV 0x8FF9\n#define GL_FLOAT16_VEC3_NV 0x8FFA\n#define GL_FLOAT16_VEC4_NV 0x8FFB\ntypedef void(APIENTRYP PFNGLUNIFORM1I64NVPROC)(GLint location, GLint64EXT x);\ntypedef void(APIENTRYP PFNGLUNIFORM2I64NVPROC)(GLint location, GLint64EXT x, GLint64EXT y);\ntypedef void(APIENTRYP PFNGLUNIFORM3I64NVPROC)(GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);\ntypedef void(APIENTRYP PFNGLUNIFORM4I64NVPROC)(GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);\ntypedef void(APIENTRYP PFNGLUNIFORM1I64VNVPROC)(GLint location, GLsizei count, const GLint64EXT* value);\ntypedef void(APIENTRYP PFNGLUNIFORM2I64VNVPROC)(GLint location, GLsizei count, const GLint64EXT* value);\ntypedef void(APIENTRYP PFNGLUNIFORM3I64VNVPROC)(GLint location, GLsizei count, const GLint64EXT* value);\ntypedef void(APIENTRYP PFNGLUNIFORM4I64VNVPROC)(GLint location, GLsizei count, const GLint64EXT* value);\ntypedef void(APIENTRYP PFNGLUNIFORM1UI64NVPROC)(GLint location, GLuint64EXT x);\ntypedef void(APIENTRYP PFNGLUNIFORM2UI64NVPROC)(GLint location, GLuint64EXT x, GLuint64EXT y);\ntypedef void(APIENTRYP PFNGLUNIFORM3UI64NVPROC)(GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);\ntypedef void(APIENTRYP PFNGLUNIFORM4UI64NVPROC)(GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);\ntypedef void(APIENTRYP PFNGLUNIFORM1UI64VNVPROC)(GLint location, GLsizei count, const GLuint64EXT* value);\ntypedef void(APIENTRYP PFNGLUNIFORM2UI64VNVPROC)(GLint location, GLsizei count, const GLuint64EXT* value);\ntypedef void(APIENTRYP PFNGLUNIFORM3UI64VNVPROC)(GLint location, GLsizei count, const GLuint64EXT* value);\ntypedef void(APIENTRYP PFNGLUNIFORM4UI64VNVPROC)(GLint location, GLsizei count, const GLuint64EXT* value);\ntypedef void(APIENTRYP PFNGLGETUNIFORMI64VNVPROC)(GLuint program, GLint location, GLint64EXT* params);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC)(GLuint program, GLint location, GLint64EXT x);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC)(GLuint program, GLint location, GLint64EXT x, GLint64EXT y);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC)(GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC)(GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLint64EXT* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLint64EXT* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLint64EXT* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLint64EXT* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC)(GLuint program, GLint location, GLuint64EXT x);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC)(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC)(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC)(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glUniform1i64NV(GLint location, GLint64EXT x);\nGLAPI void APIENTRY glUniform2i64NV(GLint location, GLint64EXT x, GLint64EXT y);\nGLAPI void APIENTRY glUniform3i64NV(GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);\nGLAPI void APIENTRY glUniform4i64NV(GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);\nGLAPI void APIENTRY glUniform1i64vNV(GLint location, GLsizei count, const GLint64EXT* value);\nGLAPI void APIENTRY glUniform2i64vNV(GLint location, GLsizei count, const GLint64EXT* value);\nGLAPI void APIENTRY glUniform3i64vNV(GLint location, GLsizei count, const GLint64EXT* value);\nGLAPI void APIENTRY glUniform4i64vNV(GLint location, GLsizei count, const GLint64EXT* value);\nGLAPI void APIENTRY glUniform1ui64NV(GLint location, GLuint64EXT x);\nGLAPI void APIENTRY glUniform2ui64NV(GLint location, GLuint64EXT x, GLuint64EXT y);\nGLAPI void APIENTRY glUniform3ui64NV(GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);\nGLAPI void APIENTRY glUniform4ui64NV(GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);\nGLAPI void APIENTRY glUniform1ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value);\nGLAPI void APIENTRY glUniform2ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value);\nGLAPI void APIENTRY glUniform3ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value);\nGLAPI void APIENTRY glUniform4ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value);\nGLAPI void APIENTRY glGetUniformi64vNV(GLuint program, GLint location, GLint64EXT* params);\nGLAPI void APIENTRY glProgramUniform1i64NV(GLuint program, GLint location, GLint64EXT x);\nGLAPI void APIENTRY glProgramUniform2i64NV(GLuint program, GLint location, GLint64EXT x, GLint64EXT y);\nGLAPI void APIENTRY glProgramUniform3i64NV(GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);\nGLAPI void APIENTRY glProgramUniform4i64NV(GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);\nGLAPI void APIENTRY glProgramUniform1i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value);\nGLAPI void APIENTRY glProgramUniform2i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value);\nGLAPI void APIENTRY glProgramUniform3i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value);\nGLAPI void APIENTRY glProgramUniform4i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value);\nGLAPI void APIENTRY glProgramUniform1ui64NV(GLuint program, GLint location, GLuint64EXT x);\nGLAPI void APIENTRY glProgramUniform2ui64NV(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y);\nGLAPI void APIENTRY glProgramUniform3ui64NV(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);\nGLAPI void APIENTRY glProgramUniform4ui64NV(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);\nGLAPI void APIENTRY glProgramUniform1ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);\nGLAPI void APIENTRY glProgramUniform2ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);\nGLAPI void APIENTRY glProgramUniform3ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);\nGLAPI void APIENTRY glProgramUniform4ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);\n#endif\n#endif /* GL_NV_gpu_shader5 */\n\n#ifndef GL_NV_internalformat_sample_query\n#define GL_NV_internalformat_sample_query 1\n#define GL_MULTISAMPLES_NV 0x9371\n#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372\n#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373\n#define GL_CONFORMANT_NV 0x9374\ntypedef void(APIENTRYP PFNGLGETINTERNALFORMATSAMPLEIVNVPROC)(GLenum target, GLenum internalformat, GLsizei samples, GLenum pname,\n                                                             GLsizei count, GLint* params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGetInternalformatSampleivNV(GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei count, GLint* params);\n#endif\n#endif /* GL_NV_internalformat_sample_query */\n\n#ifndef GL_NV_memory_attachment\n#define GL_NV_memory_attachment 1\n#define GL_ATTACHED_MEMORY_OBJECT_NV 0x95A4\n#define GL_ATTACHED_MEMORY_OFFSET_NV 0x95A5\n#define GL_MEMORY_ATTACHABLE_ALIGNMENT_NV 0x95A6\n#define GL_MEMORY_ATTACHABLE_SIZE_NV 0x95A7\n#define GL_MEMORY_ATTACHABLE_NV 0x95A8\n#define GL_DETACHED_MEMORY_INCARNATION_NV 0x95A9\n#define GL_DETACHED_TEXTURES_NV 0x95AA\n#define GL_DETACHED_BUFFERS_NV 0x95AB\n#define GL_MAX_DETACHED_TEXTURES_NV 0x95AC\n#define GL_MAX_DETACHED_BUFFERS_NV 0x95AD\ntypedef void(APIENTRYP PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC)(GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint* params);\ntypedef void(APIENTRYP PFNGLRESETMEMORYOBJECTPARAMETERNVPROC)(GLuint memory, GLenum pname);\ntypedef void(APIENTRYP PFNGLTEXATTACHMEMORYNVPROC)(GLenum target, GLuint memory, GLuint64 offset);\ntypedef void(APIENTRYP PFNGLBUFFERATTACHMEMORYNVPROC)(GLenum target, GLuint memory, GLuint64 offset);\ntypedef void(APIENTRYP PFNGLTEXTUREATTACHMEMORYNVPROC)(GLuint texture, GLuint memory, GLuint64 offset);\ntypedef void(APIENTRYP PFNGLNAMEDBUFFERATTACHMEMORYNVPROC)(GLuint buffer, GLuint memory, GLuint64 offset);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGetMemoryObjectDetachedResourcesuivNV(GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint* params);\nGLAPI void APIENTRY glResetMemoryObjectParameterNV(GLuint memory, GLenum pname);\nGLAPI void APIENTRY glTexAttachMemoryNV(GLenum target, GLuint memory, GLuint64 offset);\nGLAPI void APIENTRY glBufferAttachMemoryNV(GLenum target, GLuint memory, GLuint64 offset);\nGLAPI void APIENTRY glTextureAttachMemoryNV(GLuint texture, GLuint memory, GLuint64 offset);\nGLAPI void APIENTRY glNamedBufferAttachMemoryNV(GLuint buffer, GLuint memory, GLuint64 offset);\n#endif\n#endif /* GL_NV_memory_attachment */\n\n#ifndef GL_NV_mesh_shader\n#define GL_NV_mesh_shader 1\n#define GL_MESH_SHADER_NV 0x9559\n#define GL_TASK_SHADER_NV 0x955A\n#define GL_MAX_MESH_UNIFORM_BLOCKS_NV 0x8E60\n#define GL_MAX_MESH_TEXTURE_IMAGE_UNITS_NV 0x8E61\n#define GL_MAX_MESH_IMAGE_UNIFORMS_NV 0x8E62\n#define GL_MAX_MESH_UNIFORM_COMPONENTS_NV 0x8E63\n#define GL_MAX_MESH_ATOMIC_COUNTER_BUFFERS_NV 0x8E64\n#define GL_MAX_MESH_ATOMIC_COUNTERS_NV 0x8E65\n#define GL_MAX_MESH_SHADER_STORAGE_BLOCKS_NV 0x8E66\n#define GL_MAX_COMBINED_MESH_UNIFORM_COMPONENTS_NV 0x8E67\n#define GL_MAX_TASK_UNIFORM_BLOCKS_NV 0x8E68\n#define GL_MAX_TASK_TEXTURE_IMAGE_UNITS_NV 0x8E69\n#define GL_MAX_TASK_IMAGE_UNIFORMS_NV 0x8E6A\n#define GL_MAX_TASK_UNIFORM_COMPONENTS_NV 0x8E6B\n#define GL_MAX_TASK_ATOMIC_COUNTER_BUFFERS_NV 0x8E6C\n#define GL_MAX_TASK_ATOMIC_COUNTERS_NV 0x8E6D\n#define GL_MAX_TASK_SHADER_STORAGE_BLOCKS_NV 0x8E6E\n#define GL_MAX_COMBINED_TASK_UNIFORM_COMPONENTS_NV 0x8E6F\n#define GL_MAX_MESH_WORK_GROUP_INVOCATIONS_NV 0x95A2\n#define GL_MAX_TASK_WORK_GROUP_INVOCATIONS_NV 0x95A3\n#define GL_MAX_MESH_TOTAL_MEMORY_SIZE_NV 0x9536\n#define GL_MAX_TASK_TOTAL_MEMORY_SIZE_NV 0x9537\n#define GL_MAX_MESH_OUTPUT_VERTICES_NV 0x9538\n#define GL_MAX_MESH_OUTPUT_PRIMITIVES_NV 0x9539\n#define GL_MAX_TASK_OUTPUT_COUNT_NV 0x953A\n#define GL_MAX_DRAW_MESH_TASKS_COUNT_NV 0x953D\n#define GL_MAX_MESH_VIEWS_NV 0x9557\n#define GL_MESH_OUTPUT_PER_VERTEX_GRANULARITY_NV 0x92DF\n#define GL_MESH_OUTPUT_PER_PRIMITIVE_GRANULARITY_NV 0x9543\n#define GL_MAX_MESH_WORK_GROUP_SIZE_NV 0x953B\n#define GL_MAX_TASK_WORK_GROUP_SIZE_NV 0x953C\n#define GL_MESH_WORK_GROUP_SIZE_NV 0x953E\n#define GL_TASK_WORK_GROUP_SIZE_NV 0x953F\n#define GL_MESH_VERTICES_OUT_NV 0x9579\n#define GL_MESH_PRIMITIVES_OUT_NV 0x957A\n#define GL_MESH_OUTPUT_TYPE_NV 0x957B\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_MESH_SHADER_NV 0x959C\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_TASK_SHADER_NV 0x959D\n#define GL_REFERENCED_BY_MESH_SHADER_NV 0x95A0\n#define GL_REFERENCED_BY_TASK_SHADER_NV 0x95A1\n#define GL_MESH_SHADER_BIT_NV 0x00000040\n#define GL_TASK_SHADER_BIT_NV 0x00000080\n#define GL_MESH_SUBROUTINE_NV 0x957C\n#define GL_TASK_SUBROUTINE_NV 0x957D\n#define GL_MESH_SUBROUTINE_UNIFORM_NV 0x957E\n#define GL_TASK_SUBROUTINE_UNIFORM_NV 0x957F\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_MESH_SHADER_NV 0x959E\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TASK_SHADER_NV 0x959F\ntypedef void(APIENTRYP PFNGLDRAWMESHTASKSNVPROC)(GLuint first, GLuint count);\ntypedef void(APIENTRYP PFNGLDRAWMESHTASKSINDIRECTNVPROC)(GLintptr indirect);\ntypedef void(APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC)(GLintptr indirect, GLsizei drawcount, GLsizei stride);\ntypedef void(APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC)(GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawMeshTasksNV(GLuint first, GLuint count);\nGLAPI void APIENTRY glDrawMeshTasksIndirectNV(GLintptr indirect);\nGLAPI void APIENTRY glMultiDrawMeshTasksIndirectNV(GLintptr indirect, GLsizei drawcount, GLsizei stride);\nGLAPI void APIENTRY glMultiDrawMeshTasksIndirectCountNV(GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);\n#endif\n#endif /* GL_NV_mesh_shader */\n\n#ifndef GL_NV_path_rendering\n#define GL_NV_path_rendering 1\n#define GL_PATH_FORMAT_SVG_NV 0x9070\n#define GL_PATH_FORMAT_PS_NV 0x9071\n#define GL_STANDARD_FONT_NAME_NV 0x9072\n#define GL_SYSTEM_FONT_NAME_NV 0x9073\n#define GL_FILE_NAME_NV 0x9074\n#define GL_PATH_STROKE_WIDTH_NV 0x9075\n#define GL_PATH_END_CAPS_NV 0x9076\n#define GL_PATH_INITIAL_END_CAP_NV 0x9077\n#define GL_PATH_TERMINAL_END_CAP_NV 0x9078\n#define GL_PATH_JOIN_STYLE_NV 0x9079\n#define GL_PATH_MITER_LIMIT_NV 0x907A\n#define GL_PATH_DASH_CAPS_NV 0x907B\n#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C\n#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D\n#define GL_PATH_DASH_OFFSET_NV 0x907E\n#define GL_PATH_CLIENT_LENGTH_NV 0x907F\n#define GL_PATH_FILL_MODE_NV 0x9080\n#define GL_PATH_FILL_MASK_NV 0x9081\n#define GL_PATH_FILL_COVER_MODE_NV 0x9082\n#define GL_PATH_STROKE_COVER_MODE_NV 0x9083\n#define GL_PATH_STROKE_MASK_NV 0x9084\n#define GL_COUNT_UP_NV 0x9088\n#define GL_COUNT_DOWN_NV 0x9089\n#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A\n#define GL_CONVEX_HULL_NV 0x908B\n#define GL_BOUNDING_BOX_NV 0x908D\n#define GL_TRANSLATE_X_NV 0x908E\n#define GL_TRANSLATE_Y_NV 0x908F\n#define GL_TRANSLATE_2D_NV 0x9090\n#define GL_TRANSLATE_3D_NV 0x9091\n#define GL_AFFINE_2D_NV 0x9092\n#define GL_AFFINE_3D_NV 0x9094\n#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096\n#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098\n#define GL_UTF8_NV 0x909A\n#define GL_UTF16_NV 0x909B\n#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C\n#define GL_PATH_COMMAND_COUNT_NV 0x909D\n#define GL_PATH_COORD_COUNT_NV 0x909E\n#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F\n#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0\n#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1\n#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2\n#define GL_SQUARE_NV 0x90A3\n#define GL_ROUND_NV 0x90A4\n#define GL_TRIANGULAR_NV 0x90A5\n#define GL_BEVEL_NV 0x90A6\n#define GL_MITER_REVERT_NV 0x90A7\n#define GL_MITER_TRUNCATE_NV 0x90A8\n#define GL_SKIP_MISSING_GLYPH_NV 0x90A9\n#define GL_USE_MISSING_GLYPH_NV 0x90AA\n#define GL_PATH_ERROR_POSITION_NV 0x90AB\n#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD\n#define GL_ADJACENT_PAIRS_NV 0x90AE\n#define GL_FIRST_TO_REST_NV 0x90AF\n#define GL_PATH_GEN_MODE_NV 0x90B0\n#define GL_PATH_GEN_COEFF_NV 0x90B1\n#define GL_PATH_GEN_COMPONENTS_NV 0x90B3\n#define GL_PATH_STENCIL_FUNC_NV 0x90B7\n#define GL_PATH_STENCIL_REF_NV 0x90B8\n#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9\n#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD\n#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE\n#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF\n#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4\n#define GL_MOVE_TO_RESETS_NV 0x90B5\n#define GL_MOVE_TO_CONTINUES_NV 0x90B6\n#define GL_CLOSE_PATH_NV 0x00\n#define GL_MOVE_TO_NV 0x02\n#define GL_RELATIVE_MOVE_TO_NV 0x03\n#define GL_LINE_TO_NV 0x04\n#define GL_RELATIVE_LINE_TO_NV 0x05\n#define GL_HORIZONTAL_LINE_TO_NV 0x06\n#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07\n#define GL_VERTICAL_LINE_TO_NV 0x08\n#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09\n#define GL_QUADRATIC_CURVE_TO_NV 0x0A\n#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B\n#define GL_CUBIC_CURVE_TO_NV 0x0C\n#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D\n#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E\n#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F\n#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10\n#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11\n#define GL_SMALL_CCW_ARC_TO_NV 0x12\n#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13\n#define GL_SMALL_CW_ARC_TO_NV 0x14\n#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15\n#define GL_LARGE_CCW_ARC_TO_NV 0x16\n#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17\n#define GL_LARGE_CW_ARC_TO_NV 0x18\n#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19\n#define GL_RESTART_PATH_NV 0xF0\n#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2\n#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4\n#define GL_RECT_NV 0xF6\n#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8\n#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA\n#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC\n#define GL_ARC_TO_NV 0xFE\n#define GL_RELATIVE_ARC_TO_NV 0xFF\n#define GL_BOLD_BIT_NV 0x01\n#define GL_ITALIC_BIT_NV 0x02\n#define GL_GLYPH_WIDTH_BIT_NV 0x01\n#define GL_GLYPH_HEIGHT_BIT_NV 0x02\n#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04\n#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08\n#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10\n#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20\n#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40\n#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80\n#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100\n#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000\n#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000\n#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000\n#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000\n#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000\n#define GL_FONT_ASCENDER_BIT_NV 0x00200000\n#define GL_FONT_DESCENDER_BIT_NV 0x00400000\n#define GL_FONT_HEIGHT_BIT_NV 0x00800000\n#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000\n#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000\n#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000\n#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000\n#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000\n#define GL_ROUNDED_RECT_NV 0xE8\n#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9\n#define GL_ROUNDED_RECT2_NV 0xEA\n#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB\n#define GL_ROUNDED_RECT4_NV 0xEC\n#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED\n#define GL_ROUNDED_RECT8_NV 0xEE\n#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF\n#define GL_RELATIVE_RECT_NV 0xF7\n#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368\n#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369\n#define GL_FONT_UNAVAILABLE_NV 0x936A\n#define GL_FONT_UNINTELLIGIBLE_NV 0x936B\n#define GL_CONIC_CURVE_TO_NV 0x1A\n#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B\n#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000\n#define GL_STANDARD_FONT_FORMAT_NV 0x936C\n#define GL_PATH_PROJECTION_NV 0x1701\n#define GL_PATH_MODELVIEW_NV 0x1700\n#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3\n#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6\n#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36\n#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3\n#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4\n#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7\n#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38\n#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4\n#define GL_FRAGMENT_INPUT_NV 0x936D\ntypedef GLuint(APIENTRYP PFNGLGENPATHSNVPROC)(GLsizei range);\ntypedef void(APIENTRYP PFNGLDELETEPATHSNVPROC)(GLuint path, GLsizei range);\ntypedef GLboolean(APIENTRYP PFNGLISPATHNVPROC)(GLuint path);\ntypedef void(APIENTRYP PFNGLPATHCOMMANDSNVPROC)(GLuint path, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords,\n                                                GLenum coordType, const void* coords);\ntypedef void(APIENTRYP PFNGLPATHCOORDSNVPROC)(GLuint path, GLsizei numCoords, GLenum coordType, const void* coords);\ntypedef void(APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC)(GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands,\n                                                   const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void* coords);\ntypedef void(APIENTRYP PFNGLPATHSUBCOORDSNVPROC)(GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void* coords);\ntypedef void(APIENTRYP PFNGLPATHSTRINGNVPROC)(GLuint path, GLenum format, GLsizei length, const void* pathString);\ntypedef void(APIENTRYP PFNGLPATHGLYPHSNVPROC)(GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle,\n                                              GLsizei numGlyphs, GLenum type, const void* charcodes, GLenum handleMissingGlyphs,\n                                              GLuint pathParameterTemplate, GLfloat emScale);\ntypedef void(APIENTRYP PFNGLPATHGLYPHRANGENVPROC)(GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle,\n                                                  GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs,\n                                                  GLuint pathParameterTemplate, GLfloat emScale);\ntypedef void(APIENTRYP PFNGLWEIGHTPATHSNVPROC)(GLuint resultPath, GLsizei numPaths, const GLuint* paths, const GLfloat* weights);\ntypedef void(APIENTRYP PFNGLCOPYPATHNVPROC)(GLuint resultPath, GLuint srcPath);\ntypedef void(APIENTRYP PFNGLINTERPOLATEPATHSNVPROC)(GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight);\ntypedef void(APIENTRYP PFNGLTRANSFORMPATHNVPROC)(GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat* transformValues);\ntypedef void(APIENTRYP PFNGLPATHPARAMETERIVNVPROC)(GLuint path, GLenum pname, const GLint* value);\ntypedef void(APIENTRYP PFNGLPATHPARAMETERINVPROC)(GLuint path, GLenum pname, GLint value);\ntypedef void(APIENTRYP PFNGLPATHPARAMETERFVNVPROC)(GLuint path, GLenum pname, const GLfloat* value);\ntypedef void(APIENTRYP PFNGLPATHPARAMETERFNVPROC)(GLuint path, GLenum pname, GLfloat value);\ntypedef void(APIENTRYP PFNGLPATHDASHARRAYNVPROC)(GLuint path, GLsizei dashCount, const GLfloat* dashArray);\ntypedef void(APIENTRYP PFNGLPATHSTENCILFUNCNVPROC)(GLenum func, GLint ref, GLuint mask);\ntypedef void(APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC)(GLfloat factor, GLfloat units);\ntypedef void(APIENTRYP PFNGLSTENCILFILLPATHNVPROC)(GLuint path, GLenum fillMode, GLuint mask);\ntypedef void(APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC)(GLuint path, GLint reference, GLuint mask);\ntypedef void(APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC)(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase,\n                                                            GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat* transformValues);\ntypedef void(APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC)(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase,\n                                                              GLint reference, GLuint mask, GLenum transformType, const GLfloat* transformValues);\ntypedef void(APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC)(GLenum func);\ntypedef void(APIENTRYP PFNGLCOVERFILLPATHNVPROC)(GLuint path, GLenum coverMode);\ntypedef void(APIENTRYP PFNGLCOVERSTROKEPATHNVPROC)(GLuint path, GLenum coverMode);\ntypedef void(APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC)(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase,\n                                                          GLenum coverMode, GLenum transformType, const GLfloat* transformValues);\ntypedef void(APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC)(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase,\n                                                            GLenum coverMode, GLenum transformType, const GLfloat* transformValues);\ntypedef void(APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC)(GLuint path, GLenum pname, GLint* value);\ntypedef void(APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC)(GLuint path, GLenum pname, GLfloat* value);\ntypedef void(APIENTRYP PFNGLGETPATHCOMMANDSNVPROC)(GLuint path, GLubyte* commands);\ntypedef void(APIENTRYP PFNGLGETPATHCOORDSNVPROC)(GLuint path, GLfloat* coords);\ntypedef void(APIENTRYP PFNGLGETPATHDASHARRAYNVPROC)(GLuint path, GLfloat* dashArray);\ntypedef void(APIENTRYP PFNGLGETPATHMETRICSNVPROC)(GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void* paths,\n                                                  GLuint pathBase, GLsizei stride, GLfloat* metrics);\ntypedef void(APIENTRYP PFNGLGETPATHMETRICRANGENVPROC)(GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride,\n                                                      GLfloat* metrics);\ntypedef void(APIENTRYP PFNGLGETPATHSPACINGNVPROC)(GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase,\n                                                  GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat* returnedSpacing);\ntypedef GLboolean(APIENTRYP PFNGLISPOINTINFILLPATHNVPROC)(GLuint path, GLuint mask, GLfloat x, GLfloat y);\ntypedef GLboolean(APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC)(GLuint path, GLfloat x, GLfloat y);\ntypedef GLfloat(APIENTRYP PFNGLGETPATHLENGTHNVPROC)(GLuint path, GLsizei startSegment, GLsizei numSegments);\ntypedef GLboolean(APIENTRYP PFNGLPOINTALONGPATHNVPROC)(GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x,\n                                                       GLfloat* y, GLfloat* tangentX, GLfloat* tangentY);\ntypedef void(APIENTRYP PFNGLMATRIXLOAD3X2FNVPROC)(GLenum matrixMode, const GLfloat* m);\ntypedef void(APIENTRYP PFNGLMATRIXLOAD3X3FNVPROC)(GLenum matrixMode, const GLfloat* m);\ntypedef void(APIENTRYP PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC)(GLenum matrixMode, const GLfloat* m);\ntypedef void(APIENTRYP PFNGLMATRIXMULT3X2FNVPROC)(GLenum matrixMode, const GLfloat* m);\ntypedef void(APIENTRYP PFNGLMATRIXMULT3X3FNVPROC)(GLenum matrixMode, const GLfloat* m);\ntypedef void(APIENTRYP PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC)(GLenum matrixMode, const GLfloat* m);\ntypedef void(APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHNVPROC)(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode);\ntypedef void(APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC)(GLuint path, GLint reference, GLuint mask, GLenum coverMode);\ntypedef void(APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC)(GLsizei numPaths, GLenum pathNameType, const void* paths,\n                                                                     GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode,\n                                                                     GLenum transformType, const GLfloat* transformValues);\ntypedef void(APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC)(GLsizei numPaths, GLenum pathNameType, const void* paths,\n                                                                       GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode,\n                                                                       GLenum transformType, const GLfloat* transformValues);\ntypedef GLenum(APIENTRYP PFNGLPATHGLYPHINDEXRANGENVPROC)(GLenum fontTarget, const void* fontName, GLbitfield fontStyle,\n                                                         GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]);\ntypedef GLenum(APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC)(GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle,\n                                                         GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);\ntypedef GLenum(APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC)(GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize,\n                                                               const void* fontData, GLsizei faceIndex, GLuint firstGlyphIndex,\n                                                               GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);\ntypedef void(APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC)(GLuint program, GLint location, GLenum genMode, GLint components,\n                                                               const GLfloat* coeffs);\ntypedef void(APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount,\n                                                        const GLenum* props, GLsizei count, GLsizei* length, GLfloat* params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLuint APIENTRY glGenPathsNV(GLsizei range);\nGLAPI void APIENTRY glDeletePathsNV(GLuint path, GLsizei range);\nGLAPI GLboolean APIENTRY glIsPathNV(GLuint path);\nGLAPI void APIENTRY glPathCommandsNV(GLuint path, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType,\n                                     const void* coords);\nGLAPI void APIENTRY glPathCoordsNV(GLuint path, GLsizei numCoords, GLenum coordType, const void* coords);\nGLAPI void APIENTRY glPathSubCommandsNV(GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands,\n                                        const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void* coords);\nGLAPI void APIENTRY glPathSubCoordsNV(GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void* coords);\nGLAPI void APIENTRY glPathStringNV(GLuint path, GLenum format, GLsizei length, const void* pathString);\nGLAPI void APIENTRY glPathGlyphsNV(GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle, GLsizei numGlyphs,\n                                   GLenum type, const void* charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);\nGLAPI void APIENTRY glPathGlyphRangeNV(GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle, GLuint firstGlyph,\n                                       GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);\nGLAPI void APIENTRY glWeightPathsNV(GLuint resultPath, GLsizei numPaths, const GLuint* paths, const GLfloat* weights);\nGLAPI void APIENTRY glCopyPathNV(GLuint resultPath, GLuint srcPath);\nGLAPI void APIENTRY glInterpolatePathsNV(GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight);\nGLAPI void APIENTRY glTransformPathNV(GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat* transformValues);\nGLAPI void APIENTRY glPathParameterivNV(GLuint path, GLenum pname, const GLint* value);\nGLAPI void APIENTRY glPathParameteriNV(GLuint path, GLenum pname, GLint value);\nGLAPI void APIENTRY glPathParameterfvNV(GLuint path, GLenum pname, const GLfloat* value);\nGLAPI void APIENTRY glPathParameterfNV(GLuint path, GLenum pname, GLfloat value);\nGLAPI void APIENTRY glPathDashArrayNV(GLuint path, GLsizei dashCount, const GLfloat* dashArray);\nGLAPI void APIENTRY glPathStencilFuncNV(GLenum func, GLint ref, GLuint mask);\nGLAPI void APIENTRY glPathStencilDepthOffsetNV(GLfloat factor, GLfloat units);\nGLAPI void APIENTRY glStencilFillPathNV(GLuint path, GLenum fillMode, GLuint mask);\nGLAPI void APIENTRY glStencilStrokePathNV(GLuint path, GLint reference, GLuint mask);\nGLAPI void APIENTRY glStencilFillPathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum fillMode,\n                                                 GLuint mask, GLenum transformType, const GLfloat* transformValues);\nGLAPI void APIENTRY glStencilStrokePathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase,\n                                                   GLint reference, GLuint mask, GLenum transformType, const GLfloat* transformValues);\nGLAPI void APIENTRY glPathCoverDepthFuncNV(GLenum func);\nGLAPI void APIENTRY glCoverFillPathNV(GLuint path, GLenum coverMode);\nGLAPI void APIENTRY glCoverStrokePathNV(GLuint path, GLenum coverMode);\nGLAPI void APIENTRY glCoverFillPathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum coverMode,\n                                               GLenum transformType, const GLfloat* transformValues);\nGLAPI void APIENTRY glCoverStrokePathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase,\n                                                 GLenum coverMode, GLenum transformType, const GLfloat* transformValues);\nGLAPI void APIENTRY glGetPathParameterivNV(GLuint path, GLenum pname, GLint* value);\nGLAPI void APIENTRY glGetPathParameterfvNV(GLuint path, GLenum pname, GLfloat* value);\nGLAPI void APIENTRY glGetPathCommandsNV(GLuint path, GLubyte* commands);\nGLAPI void APIENTRY glGetPathCoordsNV(GLuint path, GLfloat* coords);\nGLAPI void APIENTRY glGetPathDashArrayNV(GLuint path, GLfloat* dashArray);\nGLAPI void APIENTRY glGetPathMetricsNV(GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void* paths,\n                                       GLuint pathBase, GLsizei stride, GLfloat* metrics);\nGLAPI void APIENTRY glGetPathMetricRangeNV(GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat* metrics);\nGLAPI void APIENTRY glGetPathSpacingNV(GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase,\n                                       GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat* returnedSpacing);\nGLAPI GLboolean APIENTRY glIsPointInFillPathNV(GLuint path, GLuint mask, GLfloat x, GLfloat y);\nGLAPI GLboolean APIENTRY glIsPointInStrokePathNV(GLuint path, GLfloat x, GLfloat y);\nGLAPI GLfloat APIENTRY glGetPathLengthNV(GLuint path, GLsizei startSegment, GLsizei numSegments);\nGLAPI GLboolean APIENTRY glPointAlongPathNV(GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x,\n                                            GLfloat* y, GLfloat* tangentX, GLfloat* tangentY);\nGLAPI void APIENTRY glMatrixLoad3x2fNV(GLenum matrixMode, const GLfloat* m);\nGLAPI void APIENTRY glMatrixLoad3x3fNV(GLenum matrixMode, const GLfloat* m);\nGLAPI void APIENTRY glMatrixLoadTranspose3x3fNV(GLenum matrixMode, const GLfloat* m);\nGLAPI void APIENTRY glMatrixMult3x2fNV(GLenum matrixMode, const GLfloat* m);\nGLAPI void APIENTRY glMatrixMult3x3fNV(GLenum matrixMode, const GLfloat* m);\nGLAPI void APIENTRY glMatrixMultTranspose3x3fNV(GLenum matrixMode, const GLfloat* m);\nGLAPI void APIENTRY glStencilThenCoverFillPathNV(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode);\nGLAPI void APIENTRY glStencilThenCoverStrokePathNV(GLuint path, GLint reference, GLuint mask, GLenum coverMode);\nGLAPI void APIENTRY glStencilThenCoverFillPathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase,\n                                                          GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType,\n                                                          const GLfloat* transformValues);\nGLAPI void APIENTRY glStencilThenCoverStrokePathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase,\n                                                            GLint reference, GLuint mask, GLenum coverMode, GLenum transformType,\n                                                            const GLfloat* transformValues);\nGLAPI GLenum APIENTRY glPathGlyphIndexRangeNV(GLenum fontTarget, const void* fontName, GLbitfield fontStyle, GLuint pathParameterTemplate,\n                                              GLfloat emScale, GLuint baseAndCount[2]);\nGLAPI GLenum APIENTRY glPathGlyphIndexArrayNV(GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle,\n                                              GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);\nGLAPI GLenum APIENTRY glPathMemoryGlyphIndexArrayNV(GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void* fontData,\n                                                    GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs,\n                                                    GLuint pathParameterTemplate, GLfloat emScale);\nGLAPI void APIENTRY glProgramPathFragmentInputGenNV(GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat* coeffs);\nGLAPI void APIENTRY glGetProgramResourcefvNV(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props,\n                                             GLsizei count, GLsizei* length, GLfloat* params);\n#endif\n#endif /* GL_NV_path_rendering */\n\n#ifndef GL_NV_path_rendering_shared_edge\n#define GL_NV_path_rendering_shared_edge 1\n#define GL_SHARED_EDGE_NV 0xC0\n#endif /* GL_NV_path_rendering_shared_edge */\n\n#ifndef GL_NV_representative_fragment_test\n#define GL_NV_representative_fragment_test 1\n#define GL_REPRESENTATIVE_FRAGMENT_TEST_NV 0x937F\n#endif /* GL_NV_representative_fragment_test */\n\n#ifndef GL_NV_sample_locations\n#define GL_NV_sample_locations 1\n#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D\n#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E\n#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F\n#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340\n#define GL_SAMPLE_LOCATION_NV 0x8E50\n#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341\n#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342\n#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)(GLenum target, GLuint start, GLsizei count, const GLfloat* v);\ntypedef void(APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)(GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v);\ntypedef void(APIENTRYP PFNGLRESOLVEDEPTHVALUESNVPROC)(void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glFramebufferSampleLocationsfvNV(GLenum target, GLuint start, GLsizei count, const GLfloat* v);\nGLAPI void APIENTRY glNamedFramebufferSampleLocationsfvNV(GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v);\nGLAPI void APIENTRY glResolveDepthValuesNV(void);\n#endif\n#endif /* GL_NV_sample_locations */\n\n#ifndef GL_NV_sample_mask_override_coverage\n#define GL_NV_sample_mask_override_coverage 1\n#endif /* GL_NV_sample_mask_override_coverage */\n\n#ifndef GL_NV_scissor_exclusive\n#define GL_NV_scissor_exclusive 1\n#define GL_SCISSOR_TEST_EXCLUSIVE_NV 0x9555\n#define GL_SCISSOR_BOX_EXCLUSIVE_NV 0x9556\ntypedef void(APIENTRYP PFNGLSCISSOREXCLUSIVENVPROC)(GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void(APIENTRYP PFNGLSCISSOREXCLUSIVEARRAYVNVPROC)(GLuint first, GLsizei count, const GLint* v);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glScissorExclusiveNV(GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glScissorExclusiveArrayvNV(GLuint first, GLsizei count, const GLint* v);\n#endif\n#endif /* GL_NV_scissor_exclusive */\n\n#ifndef GL_NV_shader_atomic_counters\n#define GL_NV_shader_atomic_counters 1\n#endif /* GL_NV_shader_atomic_counters */\n\n#ifndef GL_NV_shader_atomic_float\n#define GL_NV_shader_atomic_float 1\n#endif /* GL_NV_shader_atomic_float */\n\n#ifndef GL_NV_shader_atomic_float64\n#define GL_NV_shader_atomic_float64 1\n#endif /* GL_NV_shader_atomic_float64 */\n\n#ifndef GL_NV_shader_atomic_fp16_vector\n#define GL_NV_shader_atomic_fp16_vector 1\n#endif /* GL_NV_shader_atomic_fp16_vector */\n\n#ifndef GL_NV_shader_atomic_int64\n#define GL_NV_shader_atomic_int64 1\n#endif /* GL_NV_shader_atomic_int64 */\n\n#ifndef GL_NV_shader_buffer_load\n#define GL_NV_shader_buffer_load 1\n#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D\n#define GL_GPU_ADDRESS_NV 0x8F34\n#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35\ntypedef void(APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC)(GLenum target, GLenum access);\ntypedef void(APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC)(GLenum target);\ntypedef GLboolean(APIENTRYP PFNGLISBUFFERRESIDENTNVPROC)(GLenum target);\ntypedef void(APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC)(GLuint buffer, GLenum access);\ntypedef void(APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC)(GLuint buffer);\ntypedef GLboolean(APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC)(GLuint buffer);\ntypedef void(APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC)(GLenum target, GLenum pname, GLuint64EXT* params);\ntypedef void(APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC)(GLuint buffer, GLenum pname, GLuint64EXT* params);\ntypedef void(APIENTRYP PFNGLGETINTEGERUI64VNVPROC)(GLenum value, GLuint64EXT* result);\ntypedef void(APIENTRYP PFNGLUNIFORMUI64NVPROC)(GLint location, GLuint64EXT value);\ntypedef void(APIENTRYP PFNGLUNIFORMUI64VNVPROC)(GLint location, GLsizei count, const GLuint64EXT* value);\ntypedef void(APIENTRYP PFNGLGETUNIFORMUI64VNVPROC)(GLuint program, GLint location, GLuint64EXT* params);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC)(GLuint program, GLint location, GLuint64EXT value);\ntypedef void(APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMakeBufferResidentNV(GLenum target, GLenum access);\nGLAPI void APIENTRY glMakeBufferNonResidentNV(GLenum target);\nGLAPI GLboolean APIENTRY glIsBufferResidentNV(GLenum target);\nGLAPI void APIENTRY glMakeNamedBufferResidentNV(GLuint buffer, GLenum access);\nGLAPI void APIENTRY glMakeNamedBufferNonResidentNV(GLuint buffer);\nGLAPI GLboolean APIENTRY glIsNamedBufferResidentNV(GLuint buffer);\nGLAPI void APIENTRY glGetBufferParameterui64vNV(GLenum target, GLenum pname, GLuint64EXT* params);\nGLAPI void APIENTRY glGetNamedBufferParameterui64vNV(GLuint buffer, GLenum pname, GLuint64EXT* params);\nGLAPI void APIENTRY glGetIntegerui64vNV(GLenum value, GLuint64EXT* result);\nGLAPI void APIENTRY glUniformui64NV(GLint location, GLuint64EXT value);\nGLAPI void APIENTRY glUniformui64vNV(GLint location, GLsizei count, const GLuint64EXT* value);\nGLAPI void APIENTRY glGetUniformui64vNV(GLuint program, GLint location, GLuint64EXT* params);\nGLAPI void APIENTRY glProgramUniformui64NV(GLuint program, GLint location, GLuint64EXT value);\nGLAPI void APIENTRY glProgramUniformui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);\n#endif\n#endif /* GL_NV_shader_buffer_load */\n\n#ifndef GL_NV_shader_buffer_store\n#define GL_NV_shader_buffer_store 1\n#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010\n#endif /* GL_NV_shader_buffer_store */\n\n#ifndef GL_NV_shader_subgroup_partitioned\n#define GL_NV_shader_subgroup_partitioned 1\n#define GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV 0x00000100\n#endif /* GL_NV_shader_subgroup_partitioned */\n\n#ifndef GL_NV_shader_texture_footprint\n#define GL_NV_shader_texture_footprint 1\n#endif /* GL_NV_shader_texture_footprint */\n\n#ifndef GL_NV_shader_thread_group\n#define GL_NV_shader_thread_group 1\n#define GL_WARP_SIZE_NV 0x9339\n#define GL_WARPS_PER_SM_NV 0x933A\n#define GL_SM_COUNT_NV 0x933B\n#endif /* GL_NV_shader_thread_group */\n\n#ifndef GL_NV_shader_thread_shuffle\n#define GL_NV_shader_thread_shuffle 1\n#endif /* GL_NV_shader_thread_shuffle */\n\n#ifndef GL_NV_shading_rate_image\n#define GL_NV_shading_rate_image 1\n#define GL_SHADING_RATE_IMAGE_NV 0x9563\n#define GL_SHADING_RATE_NO_INVOCATIONS_NV 0x9564\n#define GL_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV 0x9565\n#define GL_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV 0x9566\n#define GL_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV 0x9567\n#define GL_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV 0x9568\n#define GL_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV 0x9569\n#define GL_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV 0x956A\n#define GL_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV 0x956B\n#define GL_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV 0x956C\n#define GL_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV 0x956D\n#define GL_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV 0x956E\n#define GL_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV 0x956F\n#define GL_SHADING_RATE_IMAGE_BINDING_NV 0x955B\n#define GL_SHADING_RATE_IMAGE_TEXEL_WIDTH_NV 0x955C\n#define GL_SHADING_RATE_IMAGE_TEXEL_HEIGHT_NV 0x955D\n#define GL_SHADING_RATE_IMAGE_PALETTE_SIZE_NV 0x955E\n#define GL_MAX_COARSE_FRAGMENT_SAMPLES_NV 0x955F\n#define GL_SHADING_RATE_SAMPLE_ORDER_DEFAULT_NV 0x95AE\n#define GL_SHADING_RATE_SAMPLE_ORDER_PIXEL_MAJOR_NV 0x95AF\n#define GL_SHADING_RATE_SAMPLE_ORDER_SAMPLE_MAJOR_NV 0x95B0\ntypedef void(APIENTRYP PFNGLBINDSHADINGRATEIMAGENVPROC)(GLuint texture);\ntypedef void(APIENTRYP PFNGLGETSHADINGRATEIMAGEPALETTENVPROC)(GLuint viewport, GLuint entry, GLenum* rate);\ntypedef void(APIENTRYP PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC)(GLenum rate, GLuint samples, GLuint index, GLint* location);\ntypedef void(APIENTRYP PFNGLSHADINGRATEIMAGEBARRIERNVPROC)(GLboolean synchronize);\ntypedef void(APIENTRYP PFNGLSHADINGRATEIMAGEPALETTENVPROC)(GLuint viewport, GLuint first, GLsizei count, const GLenum* rates);\ntypedef void(APIENTRYP PFNGLSHADINGRATESAMPLEORDERNVPROC)(GLenum order);\ntypedef void(APIENTRYP PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC)(GLenum rate, GLuint samples, const GLint* locations);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBindShadingRateImageNV(GLuint texture);\nGLAPI void APIENTRY glGetShadingRateImagePaletteNV(GLuint viewport, GLuint entry, GLenum* rate);\nGLAPI void APIENTRY glGetShadingRateSampleLocationivNV(GLenum rate, GLuint samples, GLuint index, GLint* location);\nGLAPI void APIENTRY glShadingRateImageBarrierNV(GLboolean synchronize);\nGLAPI void APIENTRY glShadingRateImagePaletteNV(GLuint viewport, GLuint first, GLsizei count, const GLenum* rates);\nGLAPI void APIENTRY glShadingRateSampleOrderNV(GLenum order);\nGLAPI void APIENTRY glShadingRateSampleOrderCustomNV(GLenum rate, GLuint samples, const GLint* locations);\n#endif\n#endif /* GL_NV_shading_rate_image */\n\n#ifndef GL_NV_stereo_view_rendering\n#define GL_NV_stereo_view_rendering 1\n#endif /* GL_NV_stereo_view_rendering */\n\n#ifndef GL_NV_texture_barrier\n#define GL_NV_texture_barrier 1\ntypedef void(APIENTRYP PFNGLTEXTUREBARRIERNVPROC)(void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTextureBarrierNV(void);\n#endif\n#endif /* GL_NV_texture_barrier */\n\n#ifndef GL_NV_texture_rectangle_compressed\n#define GL_NV_texture_rectangle_compressed 1\n#endif /* GL_NV_texture_rectangle_compressed */\n\n#ifndef GL_NV_uniform_buffer_unified_memory\n#define GL_NV_uniform_buffer_unified_memory 1\n#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E\n#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F\n#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370\n#endif /* GL_NV_uniform_buffer_unified_memory */\n\n#ifndef GL_NV_vertex_attrib_integer_64bit\n#define GL_NV_vertex_attrib_integer_64bit 1\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC)(GLuint index, GLint64EXT x);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC)(GLuint index, GLint64EXT x, GLint64EXT y);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC)(GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC)(GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC)(GLuint index, const GLint64EXT* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC)(GLuint index, const GLint64EXT* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC)(GLuint index, const GLint64EXT* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC)(GLuint index, const GLint64EXT* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC)(GLuint index, GLuint64EXT x);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC)(GLuint index, GLuint64EXT x, GLuint64EXT y);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC)(GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC)(GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC)(GLuint index, const GLuint64EXT* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC)(GLuint index, const GLuint64EXT* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC)(GLuint index, const GLuint64EXT* v);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC)(GLuint index, const GLuint64EXT* v);\ntypedef void(APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC)(GLuint index, GLenum pname, GLint64EXT* params);\ntypedef void(APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC)(GLuint index, GLenum pname, GLuint64EXT* params);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC)(GLuint index, GLint size, GLenum type, GLsizei stride);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glVertexAttribL1i64NV(GLuint index, GLint64EXT x);\nGLAPI void APIENTRY glVertexAttribL2i64NV(GLuint index, GLint64EXT x, GLint64EXT y);\nGLAPI void APIENTRY glVertexAttribL3i64NV(GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z);\nGLAPI void APIENTRY glVertexAttribL4i64NV(GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);\nGLAPI void APIENTRY glVertexAttribL1i64vNV(GLuint index, const GLint64EXT* v);\nGLAPI void APIENTRY glVertexAttribL2i64vNV(GLuint index, const GLint64EXT* v);\nGLAPI void APIENTRY glVertexAttribL3i64vNV(GLuint index, const GLint64EXT* v);\nGLAPI void APIENTRY glVertexAttribL4i64vNV(GLuint index, const GLint64EXT* v);\nGLAPI void APIENTRY glVertexAttribL1ui64NV(GLuint index, GLuint64EXT x);\nGLAPI void APIENTRY glVertexAttribL2ui64NV(GLuint index, GLuint64EXT x, GLuint64EXT y);\nGLAPI void APIENTRY glVertexAttribL3ui64NV(GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);\nGLAPI void APIENTRY glVertexAttribL4ui64NV(GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);\nGLAPI void APIENTRY glVertexAttribL1ui64vNV(GLuint index, const GLuint64EXT* v);\nGLAPI void APIENTRY glVertexAttribL2ui64vNV(GLuint index, const GLuint64EXT* v);\nGLAPI void APIENTRY glVertexAttribL3ui64vNV(GLuint index, const GLuint64EXT* v);\nGLAPI void APIENTRY glVertexAttribL4ui64vNV(GLuint index, const GLuint64EXT* v);\nGLAPI void APIENTRY glGetVertexAttribLi64vNV(GLuint index, GLenum pname, GLint64EXT* params);\nGLAPI void APIENTRY glGetVertexAttribLui64vNV(GLuint index, GLenum pname, GLuint64EXT* params);\nGLAPI void APIENTRY glVertexAttribLFormatNV(GLuint index, GLint size, GLenum type, GLsizei stride);\n#endif\n#endif /* GL_NV_vertex_attrib_integer_64bit */\n\n#ifndef GL_NV_vertex_buffer_unified_memory\n#define GL_NV_vertex_buffer_unified_memory 1\n#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E\n#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F\n#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20\n#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21\n#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22\n#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23\n#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24\n#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25\n#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26\n#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27\n#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28\n#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29\n#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A\n#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B\n#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C\n#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D\n#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E\n#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F\n#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30\n#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31\n#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32\n#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33\n#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40\n#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41\n#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42\ntypedef void(APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC)(GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length);\ntypedef void(APIENTRYP PFNGLVERTEXFORMATNVPROC)(GLint size, GLenum type, GLsizei stride);\ntypedef void(APIENTRYP PFNGLNORMALFORMATNVPROC)(GLenum type, GLsizei stride);\ntypedef void(APIENTRYP PFNGLCOLORFORMATNVPROC)(GLint size, GLenum type, GLsizei stride);\ntypedef void(APIENTRYP PFNGLINDEXFORMATNVPROC)(GLenum type, GLsizei stride);\ntypedef void(APIENTRYP PFNGLTEXCOORDFORMATNVPROC)(GLint size, GLenum type, GLsizei stride);\ntypedef void(APIENTRYP PFNGLEDGEFLAGFORMATNVPROC)(GLsizei stride);\ntypedef void(APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC)(GLint size, GLenum type, GLsizei stride);\ntypedef void(APIENTRYP PFNGLFOGCOORDFORMATNVPROC)(GLenum type, GLsizei stride);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride);\ntypedef void(APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC)(GLuint index, GLint size, GLenum type, GLsizei stride);\ntypedef void(APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC)(GLenum value, GLuint index, GLuint64EXT* result);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBufferAddressRangeNV(GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length);\nGLAPI void APIENTRY glVertexFormatNV(GLint size, GLenum type, GLsizei stride);\nGLAPI void APIENTRY glNormalFormatNV(GLenum type, GLsizei stride);\nGLAPI void APIENTRY glColorFormatNV(GLint size, GLenum type, GLsizei stride);\nGLAPI void APIENTRY glIndexFormatNV(GLenum type, GLsizei stride);\nGLAPI void APIENTRY glTexCoordFormatNV(GLint size, GLenum type, GLsizei stride);\nGLAPI void APIENTRY glEdgeFlagFormatNV(GLsizei stride);\nGLAPI void APIENTRY glSecondaryColorFormatNV(GLint size, GLenum type, GLsizei stride);\nGLAPI void APIENTRY glFogCoordFormatNV(GLenum type, GLsizei stride);\nGLAPI void APIENTRY glVertexAttribFormatNV(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride);\nGLAPI void APIENTRY glVertexAttribIFormatNV(GLuint index, GLint size, GLenum type, GLsizei stride);\nGLAPI void APIENTRY glGetIntegerui64i_vNV(GLenum value, GLuint index, GLuint64EXT* result);\n#endif\n#endif /* GL_NV_vertex_buffer_unified_memory */\n\n#ifndef GL_NV_viewport_array2\n#define GL_NV_viewport_array2 1\n#endif /* GL_NV_viewport_array2 */\n\n#ifndef GL_NV_viewport_swizzle\n#define GL_NV_viewport_swizzle 1\n#define GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV 0x9350\n#define GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV 0x9351\n#define GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV 0x9352\n#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV 0x9353\n#define GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV 0x9354\n#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV 0x9355\n#define GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV 0x9356\n#define GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV 0x9357\n#define GL_VIEWPORT_SWIZZLE_X_NV 0x9358\n#define GL_VIEWPORT_SWIZZLE_Y_NV 0x9359\n#define GL_VIEWPORT_SWIZZLE_Z_NV 0x935A\n#define GL_VIEWPORT_SWIZZLE_W_NV 0x935B\ntypedef void(APIENTRYP PFNGLVIEWPORTSWIZZLENVPROC)(GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glViewportSwizzleNV(GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew);\n#endif\n#endif /* GL_NV_viewport_swizzle */\n\n#ifndef GL_OVR_multiview\n#define GL_OVR_multiview 1\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632\n#define GL_MAX_VIEWS_OVR 0x9631\n#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633\ntypedef void(APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level,\n                                                                GLint baseViewIndex, GLsizei numViews);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glFramebufferTextureMultiviewOVR(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex,\n                                                     GLsizei numViews);\n#endif\n#endif /* GL_OVR_multiview */\n\n#ifndef GL_OVR_multiview2\n#define GL_OVR_multiview2 1\n#endif /* GL_OVR_multiview2 */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "ThunkLibs/libGL/libGL_Guest.cpp",
    "content": "/*\n$info$\ntags: thunklibs|GL\ndesc: Handles glXGetProcAddress\n$end_info$\n*/\n\n#define GL_GLEXT_PROTOTYPES 1\n#define GLX_GLXEXT_PROTOTYPES 1\n\n#include <GL/glx.h>\n#include <GL/glxext.h>\n#include <GL/gl.h>\n#include <GL/glext.h>\n\n#undef GL_ARB_viewport_array\n#include \"glcorearb.h\"\n\n#include <dlfcn.h>\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n#include <functional>\n#include <string_view>\n#include <unordered_map>\n\n#include \"common/Guest.h\"\n\n#include \"thunkgen_guest_libGL.inl\"\n\ntypedef void voidFunc();\n\n// Maps OpenGL API function names to the address of a guest function which is\n// linked to the corresponding host function pointer\nconst std::unordered_map<std::string_view, uintptr_t /* guest function address */> HostPtrInvokers = std::invoke([]() {\n#define PAIR(name, unused) Ret[#name] = reinterpret_cast<uintptr_t>(GetCallerForHostFunction(name));\n  std::unordered_map<std::string_view, uintptr_t> Ret;\n  FOREACH_internal_SYMBOL(PAIR);\n  return Ret;\n#undef PAIR\n});\n\nextern \"C\" {\nvoidFunc* glXGetProcAddress(const GLubyte* procname) {\n  auto Ret = fexfn_pack_glXGetProcAddress(procname);\n  if (!Ret) {\n    return nullptr;\n  }\n\n  auto TargetFuncIt = HostPtrInvokers.find(reinterpret_cast<const char*>(procname));\n  if (TargetFuncIt == HostPtrInvokers.end()) {\n    std::string_view procname_s {reinterpret_cast<const char*>(procname)};\n    // If glXGetProcAddress is querying itself, then we can just return itself.\n    // Some games do this for unknown reasons.\n    if (procname_s == \"glXGetProcAddress\" || procname_s == \"glXGetProcAddressARB\") {\n      return reinterpret_cast<voidFunc*>(glXGetProcAddress);\n    }\n\n    // Extension found in host but not in our interface definition => Not fatal but warn about it\n    // Some games query leaked GLES symbols but don't use them\n    // glFrustrumf : ES 1.x function\n    //  - Papers, Please\n    //  - Dicey Dungeons\n    fprintf(stderr, \"glXGetProcAddress: not found %s\\n\", procname);\n    return nullptr;\n  }\n\n  LinkAddressToFunction((uintptr_t)Ret, TargetFuncIt->second);\n  return Ret;\n}\n\nvoidFunc* glXGetProcAddressARB(const GLubyte* procname) {\n  return glXGetProcAddress(procname);\n}\n}\n\n// Wrapper around malloc() without noexcept specifiers\nstatic void* malloc_wrapper(size_t size) {\n  return malloc(size);\n}\n\nstatic void OnInit() {\n  fexfn_pack_GL_SetGuestMalloc((uintptr_t)malloc_wrapper, (uintptr_t)CallbackUnpack<decltype(malloc_wrapper)>::Unpack);\n  fexfn_pack_GL_SetGuestXSync((uintptr_t)XSync, (uintptr_t)CallbackUnpack<decltype(XSync)>::Unpack);\n  fexfn_pack_GL_SetGuestXGetVisualInfo((uintptr_t)XGetVisualInfo, (uintptr_t)CallbackUnpack<decltype(XGetVisualInfo)>::Unpack);\n  fexfn_pack_GL_SetGuestXDisplayString((uintptr_t)XDisplayString, (uintptr_t)CallbackUnpack<decltype(XDisplayString)>::Unpack);\n}\n\n// libGL.so must pull in libX11.so as a dependency. Referencing some libX11\n// symbol here prevents the linker from optimizing away the unused dependency\nauto implicit_libx11_dependency = XSetErrorHandler;\n\nLOAD_LIB_INIT(libGL, OnInit)\n"
  },
  {
    "path": "ThunkLibs/libGL/libGL_Host.cpp",
    "content": "/*\n$info$\ntags: thunklibs|GL\ndesc: Uses glXGetProcAddress instead of dlsym\n$end_info$\n*/\n\n#include <cstdio>\n#include <cstdlib>\n#include <string_view>\n\n#define GL_GLEXT_PROTOTYPES 1\n#define GLX_GLXEXT_PROTOTYPES 1\n\n#include \"glcorearb.h\"\n\n#include <GL/glx.h>\n#include <GL/glxext.h>\n#include <GL/gl.h>\n#include <GL/glext.h>\n#include <xcb/xcb.h>\n\n#include \"common/Host.h\"\n#include \"common/X11Manager.h\"\n\ntemplate<>\nstruct host_layout<_XDisplay*> {\n  _XDisplay* data;\n  _XDisplay* guest_display;\n\n  host_layout(guest_layout<_XDisplay*>&);\n\n  ~host_layout();\n};\n\nstatic X11Manager x11_manager;\n\nstatic void* (*GuestMalloc)(guest_size_t) = nullptr;\n\nhost_layout<_XDisplay*>::host_layout(guest_layout<_XDisplay*>& guest)\n  : guest_display(guest.force_get_host_pointer()) {\n  data = x11_manager.GuestToHostDisplay(guest_display);\n}\n\nhost_layout<_XDisplay*>::~host_layout() {\n  // Flush host-side event queue to make effects of the guest-side connection visible\n  x11_manager.HostXFlush(data);\n}\n\n// Functions returning _XDisplay* should be handled explicitly via ptr_passthrough\nguest_layout<_XDisplay*> to_guest(host_layout<_XDisplay*>) = delete;\n\nstatic void fexfn_impl_libGL_GL_SetGuestMalloc(uintptr_t GuestTarget, uintptr_t GuestUnpacker) {\n  MakeHostTrampolineForGuestFunctionAt(GuestTarget, GuestUnpacker, &GuestMalloc);\n}\n\nstatic void fexfn_impl_libGL_GL_SetGuestXGetVisualInfo(uintptr_t GuestTarget, uintptr_t GuestUnpacker) {\n  MakeHostTrampolineForGuestFunctionAt(GuestTarget, GuestUnpacker, &x11_manager.GuestXGetVisualInfo);\n}\n\nstatic void fexfn_impl_libGL_GL_SetGuestXSync(uintptr_t GuestTarget, uintptr_t GuestUnpacker) {\n  MakeHostTrampolineForGuestFunctionAt(GuestTarget, GuestUnpacker, &x11_manager.GuestXSync);\n}\n\nstatic void fexfn_impl_libGL_GL_SetGuestXDisplayString(uintptr_t GuestTarget, uintptr_t GuestUnpacker) {\n  MakeHostTrampolineForGuestFunctionAt(GuestTarget, GuestUnpacker, &x11_manager.GuestXDisplayString);\n}\n\n#include \"thunkgen_host_libGL.inl\"\n\nauto fexfn_impl_libGL_glXGetProcAddress(const GLubyte* name) -> void (*)() {\n  using VoidFn = void (*)();\n  std::string_view name_sv {reinterpret_cast<const char*>(name)};\n  if (name_sv == \"glCompileShaderIncludeARB\") {\n    return (VoidFn)fexfn_impl_libGL_glCompileShaderIncludeARB;\n  } else if (name_sv == \"glCreateShaderProgramv\") {\n    return (VoidFn)fexfn_impl_libGL_glCreateShaderProgramv;\n  } else if (name_sv == \"glGetBufferPointerv\") {\n    return (VoidFn)fexfn_impl_libGL_glGetBufferPointerv;\n  } else if (name_sv == \"glGetBufferPointervARB\") {\n    return (VoidFn)fexfn_impl_libGL_glGetBufferPointervARB;\n  } else if (name_sv == \"glGetNamedBufferPointerv\") {\n    return (VoidFn)fexfn_impl_libGL_glGetNamedBufferPointerv;\n  } else if (name_sv == \"glGetNamedBufferPointervEXT\") {\n    return (VoidFn)fexfn_impl_libGL_glGetNamedBufferPointervEXT;\n  } else if (name_sv == \"glGetPointerv\") {\n    return (VoidFn)fexfn_impl_libGL_glGetPointerv;\n  } else if (name_sv == \"glGetPointervEXT\") {\n    return (VoidFn)fexfn_impl_libGL_glGetPointervEXT;\n  } else if (name_sv == \"glGetPointeri_vEXT\") {\n    return (VoidFn)fexfn_impl_libGL_glGetPointeri_vEXT;\n  } else if (name_sv == \"glGetPointerIndexedvEXT\") {\n    return (VoidFn)fexfn_impl_libGL_glGetPointerIndexedvEXT;\n  } else if (name_sv == \"glGetVariantPointervEXT\") {\n    return (VoidFn)fexfn_impl_libGL_glGetVariantPointervEXT;\n  } else if (name_sv == \"glGetVertexAttribPointervARB\") {\n    return (VoidFn)fexfn_impl_libGL_glGetVertexAttribPointervARB;\n  } else if (name_sv == \"glGetVertexAttribPointerv\") {\n    return (VoidFn)fexfn_impl_libGL_glGetVertexAttribPointerv;\n  } else if (name_sv == \"glGetVertexAttribPointervNV\") {\n    return (VoidFn)fexfn_impl_libGL_glGetVertexAttribPointervNV;\n  } else if (name_sv == \"glGetVertexArrayPointeri_vEXT\") {\n    return (VoidFn)fexfn_impl_libGL_glGetVertexArrayPointeri_vEXT;\n  } else if (name_sv == \"glGetVertexArrayPointervEXT\") {\n    return (VoidFn)fexfn_impl_libGL_glGetVertexArrayPointervEXT;\n  } else if (name_sv == \"glShaderSource\") {\n    return (VoidFn)fexfn_impl_libGL_glShaderSource;\n  } else if (name_sv == \"glShaderSourceARB\") {\n    return (VoidFn)fexfn_impl_libGL_glShaderSourceARB;\n#ifdef IS_32BIT_THUNK\n  } else if (name_sv == \"glBindBuffersRange\") {\n    return (VoidFn)fexfn_impl_libGL_glBindBuffersRange;\n  } else if (name_sv == \"glBindVertexBuffers\") {\n    return (VoidFn)fexfn_impl_libGL_glBindVertexBuffers;\n  } else if (name_sv == \"glGetUniformIndices\") {\n    return (VoidFn)fexfn_impl_libGL_glGetUniformIndices;\n  } else if (name_sv == \"glVertexArrayVertexBuffers\") {\n    return (VoidFn)fexfn_impl_libGL_glVertexArrayVertexBuffers;\n#endif\n  } else if (name_sv == \"glXChooseFBConfig\") {\n    return (VoidFn)fexfn_impl_libGL_glXChooseFBConfig;\n  } else if (name_sv == \"glXChooseFBConfigSGIX\") {\n    return (VoidFn)fexfn_impl_libGL_glXChooseFBConfigSGIX;\n  } else if (name_sv == \"glXGetCurrentDisplay\") {\n    return (VoidFn)fexfn_impl_libGL_glXGetCurrentDisplay;\n  } else if (name_sv == \"glXGetCurrentDisplayEXT\") {\n    return (VoidFn)fexfn_impl_libGL_glXGetCurrentDisplayEXT;\n  } else if (name_sv == \"glXGetFBConfigs\") {\n    return (VoidFn)fexfn_impl_libGL_glXGetFBConfigs;\n  } else if (name_sv == \"glXGetFBConfigFromVisualSGIX\") {\n    return (VoidFn)fexfn_impl_libGL_glXGetFBConfigFromVisualSGIX;\n  } else if (name_sv == \"glXGetVisualFromFBConfigSGIX\") {\n    return (VoidFn)fexfn_impl_libGL_glXGetVisualFromFBConfigSGIX;\n  } else if (name_sv == \"glXChooseVisual\") {\n    return (VoidFn)fexfn_impl_libGL_glXChooseVisual;\n  } else if (name_sv == \"glXCreateContext\") {\n    return (VoidFn)fexfn_impl_libGL_glXCreateContext;\n  } else if (name_sv == \"glXCreateGLXPixmap\") {\n    return (VoidFn)fexfn_impl_libGL_glXCreateGLXPixmap;\n  } else if (name_sv == \"glXCreateGLXPixmapMESA\") {\n    return (VoidFn)fexfn_impl_libGL_glXCreateGLXPixmapMESA;\n  } else if (name_sv == \"glXGetConfig\") {\n    return (VoidFn)fexfn_impl_libGL_glXGetConfig;\n  } else if (name_sv == \"glXGetVisualFromFBConfig\") {\n    return (VoidFn)fexfn_impl_libGL_glXGetVisualFromFBConfig;\n#ifdef IS_32BIT_THUNK\n  } else if (name_sv == \"glXGetSelectedEvent\") {\n    return (VoidFn)fexfn_impl_libGL_glXGetSelectedEvent;\n  } else if (name_sv == \"glXGetSelectedEventSGIX\") {\n    return (VoidFn)fexfn_impl_libGL_glXGetSelectedEventSGIX;\n#endif\n  }\n  return (VoidFn)glXGetProcAddress((const GLubyte*)name);\n}\n\n// TODO: unsigned int *glXEnumerateVideoDevicesNV (Display *dpy, int screen, int *nelements);\n\n\nvoid fexfn_impl_libGL_glCompileShaderIncludeARB(GLuint a_0, GLsizei Count, guest_layout<const GLchar* const*> a_2, const GLint* a_3) {\n#ifndef IS_32BIT_THUNK\n  auto sources = a_2.force_get_host_pointer();\n#else\n  auto sources = (const char**)alloca(Count * sizeof(const char*));\n  for (GLsizei i = 0; i < Count; ++i) {\n    sources[i] = host_layout<const char* const> {a_2.get_pointer()[i]}.data;\n  }\n#endif\n  return fexldr_ptr_libGL_glCompileShaderIncludeARB(a_0, Count, sources, a_3);\n}\n\nGLuint fexfn_impl_libGL_glCreateShaderProgramv(GLuint a_0, GLsizei count, guest_layout<const GLchar* const*> a_2) {\n#ifndef IS_32BIT_THUNK\n  auto sources = a_2.force_get_host_pointer();\n#else\n  auto sources = (const char**)alloca(count * sizeof(const char*));\n  for (GLsizei i = 0; i < count; ++i) {\n    sources[i] = host_layout<const char* const> {a_2.get_pointer()[i]}.data;\n  }\n#endif\n  return fexldr_ptr_libGL_glCreateShaderProgramv(a_0, count, sources);\n}\n\nvoid fexfn_impl_libGL_glGetBufferPointerv(GLenum a_0, GLenum a_1, guest_layout<void**> GuestOut) {\n  void* HostOut;\n  fexldr_ptr_libGL_glGetBufferPointerv(a_0, a_1, &HostOut);\n  *GuestOut.get_pointer() = to_guest(to_host_layout(HostOut));\n}\n\nvoid fexfn_impl_libGL_glGetBufferPointervARB(GLenum a_0, GLenum a_1, guest_layout<void**> GuestOut) {\n  void* HostOut;\n  fexldr_ptr_libGL_glGetBufferPointervARB(a_0, a_1, &HostOut);\n  *GuestOut.get_pointer() = to_guest(to_host_layout(HostOut));\n}\n\nvoid fexfn_impl_libGL_glGetNamedBufferPointerv(GLuint a_0, GLenum a_1, guest_layout<void**> GuestOut) {\n  void* HostOut;\n  fexldr_ptr_libGL_glGetNamedBufferPointerv(a_0, a_1, &HostOut);\n  *GuestOut.get_pointer() = to_guest(to_host_layout(HostOut));\n}\n\nvoid fexfn_impl_libGL_glGetNamedBufferPointervEXT(GLuint a_0, GLenum a_1, guest_layout<void**> GuestOut) {\n  void* HostOut;\n  fexldr_ptr_libGL_glGetNamedBufferPointervEXT(a_0, a_1, &HostOut);\n  *GuestOut.get_pointer() = to_guest(to_host_layout(HostOut));\n}\n\nvoid fexfn_impl_libGL_glGetPointerv(GLenum a_0, guest_layout<void**> GuestOut) {\n  void* HostOut;\n  fexldr_ptr_libGL_glGetPointerv(a_0, &HostOut);\n  *GuestOut.get_pointer() = to_guest(to_host_layout(HostOut));\n}\n\nvoid fexfn_impl_libGL_glGetPointervEXT(GLenum a_0, guest_layout<void**> GuestOut) {\n  void* HostOut;\n  fexldr_ptr_libGL_glGetPointervEXT(a_0, &HostOut);\n  *GuestOut.get_pointer() = to_guest(to_host_layout(HostOut));\n}\n\nvoid fexfn_impl_libGL_glGetPointeri_vEXT(GLenum a_0, GLuint a_1, guest_layout<void**> GuestOut) {\n  void* HostOut;\n  fexldr_ptr_libGL_glGetPointeri_vEXT(a_0, a_1, &HostOut);\n  *GuestOut.get_pointer() = to_guest(to_host_layout(HostOut));\n}\n\nvoid fexfn_impl_libGL_glGetPointerIndexedvEXT(GLenum a_0, GLuint a_1, guest_layout<void**> GuestOut) {\n  void* HostOut;\n  fexldr_ptr_libGL_glGetPointerIndexedvEXT(a_0, a_1, &HostOut);\n  *GuestOut.get_pointer() = to_guest(to_host_layout(HostOut));\n}\n\nvoid fexfn_impl_libGL_glGetVariantPointervEXT(GLuint a_0, GLenum a_1, guest_layout<void**> GuestOut) {\n  void* HostOut;\n  fexldr_ptr_libGL_glGetVariantPointervEXT(a_0, a_1, &HostOut);\n  *GuestOut.get_pointer() = to_guest(to_host_layout(HostOut));\n}\n\nvoid fexfn_impl_libGL_glGetVertexAttribPointervARB(GLuint a_0, GLenum a_1, guest_layout<void**> GuestOut) {\n  void* HostOut;\n  fexldr_ptr_libGL_glGetVertexAttribPointervARB(a_0, a_1, &HostOut);\n  *GuestOut.get_pointer() = to_guest(to_host_layout(HostOut));\n}\n\nvoid fexfn_impl_libGL_glGetVertexAttribPointerv(GLuint a_0, GLenum a_1, guest_layout<void**> GuestOut) {\n  void* HostOut;\n  fexldr_ptr_libGL_glGetVertexAttribPointerv(a_0, a_1, &HostOut);\n  *GuestOut.get_pointer() = to_guest(to_host_layout(HostOut));\n}\n\nvoid fexfn_impl_libGL_glGetVertexAttribPointervNV(GLuint a_0, GLenum a_1, guest_layout<void**> GuestOut) {\n  void* HostOut;\n  fexldr_ptr_libGL_glGetVertexAttribPointervNV(a_0, a_1, &HostOut);\n  *GuestOut.get_pointer() = to_guest(to_host_layout(HostOut));\n}\n\nvoid fexfn_impl_libGL_glGetVertexArrayPointeri_vEXT(GLuint a_0, GLuint a_1, GLenum a_2, guest_layout<void**> GuestOut) {\n  void* HostOut;\n  fexldr_ptr_libGL_glGetVertexArrayPointeri_vEXT(a_0, a_1, a_2, &HostOut);\n  *GuestOut.get_pointer() = to_guest(to_host_layout(HostOut));\n}\n\nvoid fexfn_impl_libGL_glGetVertexArrayPointervEXT(GLuint a_0, GLenum a_1, guest_layout<void**> GuestOut) {\n  void* HostOut;\n  fexldr_ptr_libGL_glGetVertexArrayPointervEXT(a_0, a_1, &HostOut);\n  *GuestOut.get_pointer() = to_guest(to_host_layout(HostOut));\n}\n\nvoid fexfn_impl_libGL_glShaderSource(GLuint a_0, GLsizei count, guest_layout<const GLchar* const*> a_2, const GLint* a_3) {\n#ifndef IS_32BIT_THUNK\n  auto sources = a_2.force_get_host_pointer();\n#else\n  auto sources = (const char**)alloca(count * sizeof(const char*));\n  for (GLsizei i = 0; i < count; ++i) {\n    sources[i] = host_layout<const char* const> {a_2.get_pointer()[i]}.data;\n  }\n#endif\n  return fexldr_ptr_libGL_glShaderSource(a_0, count, sources, a_3);\n}\n\nvoid fexfn_impl_libGL_glShaderSourceARB(GLuint a_0, GLsizei count, guest_layout<const GLcharARB**> a_2, const GLint* a_3) {\n#ifndef IS_32BIT_THUNK\n  auto sources = a_2.force_get_host_pointer();\n#else\n  auto sources = (const char**)alloca(count * sizeof(const char*));\n  for (GLsizei i = 0; i < count; ++i) {\n    sources[i] = a_2.get_pointer()[i].force_get_host_pointer();\n  }\n#endif\n  return fexldr_ptr_libGL_glShaderSourceARB(a_0, count, sources, a_3);\n}\n\n// Relocate data to guest heap so it can be called with XFree.\n// The memory at the given host location will be de-allocated.\ntemplate<typename T>\nguest_layout<T*> RelocateArrayToGuestHeap(T* Data, int NumItems) {\n  if (!Data) {\n    return guest_layout<T*> {.data = 0};\n  }\n\n  guest_layout<T*> GuestData;\n  GuestData.data = reinterpret_cast<uintptr_t>(GuestMalloc(sizeof(guest_layout<T>) * NumItems));\n  for (int Index = 0; Index < NumItems; ++Index) {\n    GuestData.get_pointer()[Index] = to_guest(to_host_layout(Data[Index]));\n  }\n  x11_manager.HostXFree(Data);\n  return GuestData;\n}\n\n// Maps to a host-side XVisualInfo, which must be XFree'ed by the caller.\nstatic XVisualInfo* LookupHostVisualInfo(Display* HostDisplay, guest_layout<XVisualInfo*> GuestInfo) {\n  if (!GuestInfo.data) {\n    return nullptr;\n  }\n\n  int num_matches;\n  auto HostInfo = host_layout<XVisualInfo> {*GuestInfo.get_pointer()}.data;\n  auto ret = x11_manager.HostXGetVisualInfo(HostDisplay, uint64_t {VisualScreenMask | VisualIDMask}, &HostInfo, &num_matches);\n  if (num_matches != 1) {\n    fprintf(stderr, \"ERROR: Did not find unique host XVisualInfo\\n\");\n    std::abort();\n  }\n  return ret;\n}\n\n// Maps to a guest-side XVisualInfo and destroys the host argument.\nstatic guest_layout<XVisualInfo*> MapToGuestVisualInfo(Display* HostDisplay, XVisualInfo* HostInfo) {\n  if (!HostInfo) {\n    return guest_layout<XVisualInfo*> {.data = 0};\n  }\n\n  auto guest_display = x11_manager.HostToGuestDisplay(HostDisplay);\n#ifndef IS_32BIT_THUNK\n  int num_matches;\n  auto GuestInfo = to_guest(to_host_layout(*HostInfo));\n#else\n  GuestStackBumpAllocator GuestStack;\n  auto& num_matches = *GuestStack.New<int>();\n  auto& GuestInfo = *GuestStack.New<guest_layout<XVisualInfo>>(to_guest(to_host_layout(*HostInfo)));\n#endif\n  auto ret = x11_manager.GuestXGetVisualInfo(guest_display.get_pointer(), VisualScreenMask | VisualIDMask, &GuestInfo, &num_matches);\n\n  if (num_matches != 1) {\n    fprintf(stderr, \"ERROR: Did not find unique guest XVisualInfo\\n\");\n    std::abort();\n  }\n\n  // We effectively relocated the VisualInfo, so free the original one now\n  x11_manager.HostXFree(HostInfo);\n  guest_layout<XVisualInfo*> GuestRet;\n  GuestRet.data = reinterpret_cast<uintptr_t>(ret);\n  return GuestRet;\n}\n\nguest_layout<GLXFBConfig*> fexfn_impl_libGL_glXChooseFBConfig(Display* Display, int Screen, const int* Attributes, int* NumItems) {\n  auto ret = fexldr_ptr_libGL_glXChooseFBConfig(Display, Screen, Attributes, NumItems);\n  return RelocateArrayToGuestHeap(ret, *NumItems);\n}\n\nguest_layout<GLXFBConfigSGIX*> fexfn_impl_libGL_glXChooseFBConfigSGIX(Display* Display, int Screen, int* Attributes, int* NumItems) {\n  auto ret = fexldr_ptr_libGL_glXChooseFBConfigSGIX(Display, Screen, Attributes, NumItems);\n  return RelocateArrayToGuestHeap(ret, *NumItems);\n}\n\nguest_layout<_XDisplay*> fexfn_impl_libGL_glXGetCurrentDisplay() {\n  auto ret = fexldr_ptr_libGL_glXGetCurrentDisplay();\n  return x11_manager.HostToGuestDisplay(ret);\n}\n\nguest_layout<_XDisplay*> fexfn_impl_libGL_glXGetCurrentDisplayEXT() {\n  auto ret = fexldr_ptr_libGL_glXGetCurrentDisplayEXT();\n  return x11_manager.HostToGuestDisplay(ret);\n}\n\nguest_layout<GLXFBConfig*> fexfn_impl_libGL_glXGetFBConfigs(Display* Display, int Screen, int* NumItems) {\n  auto ret = fexldr_ptr_libGL_glXGetFBConfigs(Display, Screen, NumItems);\n  return RelocateArrayToGuestHeap(ret, *NumItems);\n}\n\nGLXFBConfigSGIX fexfn_impl_libGL_glXGetFBConfigFromVisualSGIX(Display* Display, guest_layout<XVisualInfo*> Info) {\n  auto HostInfo = LookupHostVisualInfo(Display, Info);\n  auto ret = fexldr_ptr_libGL_glXGetFBConfigFromVisualSGIX(Display, HostInfo);\n  x11_manager.HostXFree(HostInfo);\n  return ret;\n}\n\nguest_layout<XVisualInfo*> fexfn_impl_libGL_glXGetVisualFromFBConfigSGIX(Display* Display, GLXFBConfigSGIX Config) {\n  return MapToGuestVisualInfo(Display, fexldr_ptr_libGL_glXGetVisualFromFBConfigSGIX(Display, Config));\n}\n\nguest_layout<XVisualInfo*> fexfn_impl_libGL_glXChooseVisual(Display* Display, int Screen, int* Attributes) {\n  return MapToGuestVisualInfo(Display, fexldr_ptr_libGL_glXChooseVisual(Display, Screen, Attributes));\n}\n\nGLXContext fexfn_impl_libGL_glXCreateContext(Display* Display, guest_layout<XVisualInfo*> Info, GLXContext ShareList, Bool Direct) {\n  auto HostInfo = LookupHostVisualInfo(Display, Info);\n  auto ret = fexldr_ptr_libGL_glXCreateContext(Display, HostInfo, ShareList, Direct);\n  x11_manager.HostXFree(HostInfo);\n  return ret;\n}\n\nGLXPixmap fexfn_impl_libGL_glXCreateGLXPixmap(Display* Display, guest_layout<XVisualInfo*> Info, Pixmap Pixmap) {\n  auto HostInfo = LookupHostVisualInfo(Display, Info);\n  auto ret = fexldr_ptr_libGL_glXCreateGLXPixmap(Display, HostInfo, Pixmap);\n  x11_manager.HostXFree(HostInfo);\n  return ret;\n}\n\nGLXPixmap fexfn_impl_libGL_glXCreateGLXPixmapMESA(Display* Display, guest_layout<XVisualInfo*> Info, Pixmap Pixmap, Colormap Colormap) {\n  auto HostInfo = LookupHostVisualInfo(Display, Info);\n  auto ret = fexldr_ptr_libGL_glXCreateGLXPixmapMESA(Display, HostInfo, Pixmap, Colormap);\n  x11_manager.HostXFree(HostInfo);\n  return ret;\n}\n\nint fexfn_impl_libGL_glXGetConfig(Display* Display, guest_layout<XVisualInfo*> Info, int Attribute, int* Value) {\n  auto HostInfo = LookupHostVisualInfo(Display, Info);\n  auto ret = fexldr_ptr_libGL_glXGetConfig(Display, HostInfo, Attribute, Value);\n  x11_manager.HostXFree(HostInfo);\n  return ret;\n}\n\nguest_layout<XVisualInfo*> fexfn_impl_libGL_glXGetVisualFromFBConfig(Display* Display, GLXFBConfig Config) {\n  return MapToGuestVisualInfo(Display, fexldr_ptr_libGL_glXGetVisualFromFBConfig(Display, Config));\n}\n\n#ifdef IS_32BIT_THUNK\nvoid fexfn_impl_libGL_glBindBuffersRange(GLenum a_0, GLuint a_1, GLsizei Count, const GLuint* a_3, guest_layout<const int*> Offsets,\n                                         guest_layout<const int*> Sizes) {\n  auto HostOffsets = (GLintptr*)alloca(Count * sizeof(GLintptr));\n  auto HostSizes = (GLsizeiptr*)alloca(Count * sizeof(GLsizeiptr));\n  for (int i = 0; i < Count; ++i) {\n    HostOffsets[i] = Offsets.get_pointer()[i].data;\n    HostSizes[i] = Sizes.get_pointer()[i].data;\n  }\n  return fexldr_ptr_libGL_glBindBuffersRange(a_0, a_1, Count, a_3, HostOffsets, HostSizes);\n}\n\nvoid fexfn_impl_libGL_glBindVertexBuffers(GLuint a_0, GLsizei count, const GLuint* a_2, guest_layout<const int*> Offsets, const GLsizei* a_4) {\n  auto HostOffsets = (GLintptr*)alloca(count * sizeof(GLintptr));\n  for (int i = 0; i < count; ++i) {\n    HostOffsets[i] = Offsets.get_pointer()[i].data;\n  }\n  fexldr_ptr_libGL_glBindVertexBuffers(a_0, count, a_2, HostOffsets, a_4);\n}\n\nvoid fexfn_impl_libGL_glGetUniformIndices(GLuint a_0, GLsizei Count, guest_layout<const GLchar* const*> Names, GLuint* a_3) {\n  auto HostNames = (const GLchar**)alloca(Count * sizeof(GLintptr));\n  for (int i = 0; i < Count; ++i) {\n    HostNames[i] = host_layout<const char* const> {Names.get_pointer()[i]}.data;\n  }\n  fexldr_ptr_libGL_glGetUniformIndices(a_0, Count, HostNames, a_3);\n}\n\nvoid fexfn_impl_libGL_glVertexArrayVertexBuffers(GLuint a_0, GLuint a_1, GLsizei count, const GLuint* a_3, guest_layout<const int*> Offsets,\n                                                 const GLsizei* a_5) {\n  auto HostOffsets = (GLintptr*)alloca(count * sizeof(GLintptr));\n  for (int i = 0; i < count; ++i) {\n    HostOffsets[i] = Offsets.get_pointer()[i].data;\n  }\n  fexldr_ptr_libGL_glVertexArrayVertexBuffers(a_0, a_1, count, a_3, HostOffsets, a_5);\n}\n\nvoid fexfn_impl_libGL_glXGetSelectedEvent(Display* Display, GLXDrawable Drawable, guest_layout<uint32_t*> Mask) {\n  unsigned long HostMask;\n  fexldr_ptr_libGL_glXGetSelectedEvent(Display, Drawable, &HostMask);\n  *Mask.get_pointer() = HostMask;\n}\nvoid fexfn_impl_libGL_glXGetSelectedEventSGIX(Display* Display, GLXDrawable Drawable, guest_layout<uint32_t*> Mask) {\n  unsigned long HostMask;\n  fexldr_ptr_libGL_glXGetSelectedEventSGIX(Display, Drawable, &HostMask);\n  *Mask.get_pointer() = HostMask;\n}\n#endif\n\nEXPORTS(libGL)\n"
  },
  {
    "path": "ThunkLibs/libGL/libGL_interface.cpp",
    "content": "#include <common/GeneratorInterface.h>\n\n#define GL_GLEXT_PROTOTYPES 1\n#define GLX_GLXEXT_PROTOTYPES 1\n\n#include <GL/glx.h>\n#include <GL/glxext.h>\n#include <GL/gl.h>\n#include <GL/glext.h>\n\n#undef GL_ARB_viewport_array\n#include \"glcorearb.h\"\n\n#include <type_traits>\n\ntemplate<auto>\nstruct fex_gen_config {\n  unsigned version = 1;\n};\n\ntemplate<>\nstruct fex_gen_config<glXGetProcAddress> : fexgen::custom_host_impl, fexgen::custom_guest_entrypoint, fexgen::returns_guest_pointer {};\n\n// internal use\nvoid GL_SetGuestMalloc(uintptr_t, uintptr_t);\nvoid GL_SetGuestXSync(uintptr_t, uintptr_t);\nvoid GL_SetGuestXGetVisualInfo(uintptr_t, uintptr_t);\nvoid GL_SetGuestXDisplayString(uintptr_t, uintptr_t);\ntemplate<>\nstruct fex_gen_config<GL_SetGuestMalloc> : fexgen::custom_guest_entrypoint, fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_config<GL_SetGuestXSync> : fexgen::custom_guest_entrypoint, fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_config<GL_SetGuestXGetVisualInfo> : fexgen::custom_guest_entrypoint, fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_config<GL_SetGuestXDisplayString> : fexgen::custom_guest_entrypoint, fexgen::custom_host_impl {};\n\ntemplate<typename>\nstruct fex_gen_type {};\n\n// Assume void* always points to data with consistent layout.\n// It's used in too many functions to annotate them all.\ntemplate<>\nstruct fex_gen_type<void> : fexgen::opaque_type {};\n\ntemplate<>\nstruct fex_gen_type<std::remove_pointer_t<GLXContext>> : fexgen::opaque_type {};\n// NOTE: The data layout of this is almost the same between 64-bit and 32-bit,\n//       but the total struct size is 4 bytes larger on 64-bit due to stricter\n//       alignment requirements (8 vs 4 bytes). Since it's always allocated on\n//       the host *and* never directly used in arrays, this is not a problem.\ntemplate<>\nstruct fex_gen_type<std::remove_pointer_t<GLXFBConfig>> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<std::remove_pointer_t<GLsync>> : fexgen::opaque_type {};\n\n// NOTE: These should be opaque, but actually aren't because the respective libraries aren't thunked\ntemplate<>\nstruct fex_gen_type<_cl_context> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<_cl_event> : fexgen::opaque_type {};\n\n// host_layout is manually customized for this. Mark as opaque to please the interface parser\ntemplate<>\nstruct fex_gen_type<_XDisplay> : fexgen::opaque_type {};\n\ntemplate<>\nstruct fex_gen_type<XVisualInfo> : fexgen::emit_layout_wrappers {};\ntemplate<>\nstruct fex_gen_type<Visual> : fexgen::opaque_type {}; // Used in XVisualInfo; treat as opaque\n\n// Symbols queryable through glXGetProcAddr\nnamespace internal {\ntemplate<auto>\nstruct fex_gen_config : fexgen::generate_guest_symtable, fexgen::indirect_guest_calls {};\n\n// Function, parameter index, parameter type [optional]\ntemplate<auto, int, typename = void>\nstruct fex_gen_param {};\n\ntemplate<>\nstruct fex_gen_config<glXQueryCurrentRendererStringMESA> {};\ntemplate<>\nstruct fex_gen_config<glXQueryRendererStringMESA> {};\ntemplate<>\nstruct fex_gen_config<glXGetContextIDEXT> {};\ntemplate<>\nstruct fex_gen_config<glXCreateContextWithConfigSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXImportContextEXT> {};\ntemplate<>\nstruct fex_gen_config<glXGetCurrentReadDrawableSGI> {};\ntemplate<>\nstruct fex_gen_config<glXChooseFBConfigSGIX> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glXChooseFBConfigSGIX, -1, GLXFBConfigSGIX*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glXGetFBConfigFromVisualSGIX> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glXGetFBConfigFromVisualSGIX, 1, XVisualInfo*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glXCreateGLXPbufferSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXCreateGLXPixmapWithConfigSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXSwapBuffersMscOML> {};\ntemplate<>\nstruct fex_gen_config<glXGetFBConfigAttribSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXGetMscRateOML> {};\ntemplate<>\nstruct fex_gen_config<glXGetSwapIntervalMESA> {};\ntemplate<>\nstruct fex_gen_config<glXGetSyncValuesOML> {};\ntemplate<>\nstruct fex_gen_config<glXGetVideoSyncSGI> {};\ntemplate<>\nstruct fex_gen_config<glXMakeCurrentReadSGI> {};\ntemplate<>\nstruct fex_gen_config<glXQueryContextInfoEXT> {};\ntemplate<>\nstruct fex_gen_config<glXQueryCurrentRendererIntegerMESA> {};\ntemplate<>\nstruct fex_gen_config<glXQueryRendererIntegerMESA> {};\ntemplate<>\nstruct fex_gen_config<glXSwapIntervalMESA> {};\ntemplate<>\nstruct fex_gen_config<glXSwapIntervalSGI> {};\ntemplate<>\nstruct fex_gen_config<glXWaitForMscOML> {};\ntemplate<>\nstruct fex_gen_config<glXWaitForSbcOML> {};\ntemplate<>\nstruct fex_gen_config<glXWaitVideoSyncSGI> {};\ntemplate<>\nstruct fex_gen_config<glXBindTexImageEXT> {};\ntemplate<>\nstruct fex_gen_config<glXCopySubBufferMESA> {};\ntemplate<>\nstruct fex_gen_config<glXDestroyGLXPbufferSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXFreeContextEXT> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<glXGetSelectedEventSGIX> {};\n#else\ntemplate<>\nstruct fex_gen_config<glXGetSelectedEventSGIX> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glXGetSelectedEventSGIX, 2, unsigned long*> : fexgen::ptr_passthrough {};\n#endif\n\ntemplate<>\nstruct fex_gen_config<glXQueryGLXPbufferSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXReleaseTexImageEXT> {};\ntemplate<>\nstruct fex_gen_config<glXSelectEventSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXGetVisualFromFBConfigSGIX> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glXGetVisualFromFBConfigSGIX, -1, XVisualInfo*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glXGetClientString> {};\ntemplate<>\nstruct fex_gen_config<glXQueryExtensionsString> {};\ntemplate<>\nstruct fex_gen_config<glXQueryServerString> {};\ntemplate<>\nstruct fex_gen_config<glXGetCurrentDisplay> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glXGetCurrentDisplay, -1, _XDisplay*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glXCreateContext> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glXCreateContext, 1, XVisualInfo*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glXCreateNewContext> {};\ntemplate<>\nstruct fex_gen_config<glXGetCurrentContext> {};\ntemplate<>\nstruct fex_gen_config<glXGetCurrentDrawable> {};\ntemplate<>\nstruct fex_gen_config<glXGetCurrentReadDrawable> {};\ntemplate<>\nstruct fex_gen_config<glXChooseFBConfig> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glXChooseFBConfig, -1, GLXFBConfig*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glXGetFBConfigs> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glXGetFBConfigs, -1, GLXFBConfig*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glXCreatePbuffer> {};\ntemplate<>\nstruct fex_gen_config<glXCreateGLXPixmap> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glXCreateGLXPixmap, 1, XVisualInfo*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glXCreatePixmap> {};\ntemplate<>\nstruct fex_gen_config<glXCreateWindow> {};\ntemplate<>\nstruct fex_gen_config<glXGetConfig> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glXGetConfig, 1, XVisualInfo*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glXGetFBConfigAttrib> {};\ntemplate<>\nstruct fex_gen_config<glXIsDirect> {};\ntemplate<>\nstruct fex_gen_config<glXMakeContextCurrent> {};\ntemplate<>\nstruct fex_gen_config<glXMakeCurrent> {};\ntemplate<>\nstruct fex_gen_config<glXQueryContext> {};\ntemplate<>\nstruct fex_gen_config<glXQueryExtension> {};\ntemplate<>\nstruct fex_gen_config<glXQueryVersion> {};\ntemplate<>\nstruct fex_gen_config<glXCopyContext> {};\ntemplate<>\nstruct fex_gen_config<glXDestroyContext> {};\ntemplate<>\nstruct fex_gen_config<glXDestroyGLXPixmap> {};\ntemplate<>\nstruct fex_gen_config<glXDestroyPbuffer> {};\ntemplate<>\nstruct fex_gen_config<glXDestroyPixmap> {};\ntemplate<>\nstruct fex_gen_config<glXDestroyWindow> {};\n#ifdef GLX_NV_vertex_array_range\ntemplate<>\nstruct fex_gen_config<glXAllocateMemoryNV> {};\ntemplate<>\nstruct fex_gen_config<glXFreeMemoryNV> {};\n#endif\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<glXGetSelectedEvent> {};\n#else\ntemplate<>\nstruct fex_gen_config<glXGetSelectedEvent> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glXGetSelectedEvent, 2, unsigned long*> : fexgen::ptr_passthrough {};\n#endif\ntemplate<>\nstruct fex_gen_config<glXQueryDrawable> {};\ntemplate<>\nstruct fex_gen_config<glXSelectEvent> {};\ntemplate<>\nstruct fex_gen_config<glXSwapBuffers> {};\ntemplate<>\nstruct fex_gen_config<glXUseXFont> {};\ntemplate<>\nstruct fex_gen_config<glXWaitGL> {};\ntemplate<>\nstruct fex_gen_config<glXChooseVisual> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glXChooseVisual, -1, XVisualInfo*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glXGetVisualFromFBConfig> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glXGetVisualFromFBConfig, -1, XVisualInfo*> : fexgen::ptr_passthrough {};\n\n// template<> struct fex_gen_config<glXCreateContextAttribs> {};\ntemplate<>\nstruct fex_gen_config<glXCreateContextAttribsARB> {};\ntemplate<>\nstruct fex_gen_config<glXSwapIntervalEXT> {};\n\ntemplate<>\nstruct fex_gen_config<glColorP3ui> {};\ntemplate<>\nstruct fex_gen_config<glColorP3uiv> {};\ntemplate<>\nstruct fex_gen_config<glColorP4ui> {};\ntemplate<>\nstruct fex_gen_config<glColorP4uiv> {};\ntemplate<>\nstruct fex_gen_config<glFogCoordd> {};\ntemplate<>\nstruct fex_gen_config<glFogCoorddv> {};\ntemplate<>\nstruct fex_gen_config<glFogCoordf> {};\ntemplate<>\nstruct fex_gen_config<glFogCoordfv> {};\ntemplate<>\nstruct fex_gen_config<glFogCoordPointer> {};\ntemplate<>\nstruct fex_gen_config<glGetnColorTableARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnConvolutionFilterARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnHistogramARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnColorTable> {};\ntemplate<>\nstruct fex_gen_config<glGetnConvolutionFilter> {};\ntemplate<>\nstruct fex_gen_config<glGetnHistogram> {};\ntemplate<>\nstruct fex_gen_config<glGetnMapdv> {};\ntemplate<>\nstruct fex_gen_config<glGetnMapfv> {};\ntemplate<>\nstruct fex_gen_config<glGetnMapiv> {};\ntemplate<>\nstruct fex_gen_config<glGetnPixelMapfv> {};\ntemplate<>\nstruct fex_gen_config<glGetnPixelMapuiv> {};\ntemplate<>\nstruct fex_gen_config<glGetnPixelMapusv> {};\ntemplate<>\nstruct fex_gen_config<glGetnPolygonStipple> {};\ntemplate<>\nstruct fex_gen_config<glGetnSeparableFilter> {};\ntemplate<>\nstruct fex_gen_config<glGetnMinmax> {};\ntemplate<>\nstruct fex_gen_config<glGetnMapdvARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnMapfvARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnMapivARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnMinmaxARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnPixelMapfvARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnPixelMapuivARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnPixelMapusvARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnPolygonStippleARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnSeparableFilterARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoordP1ui> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoordP1uiv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoordP2ui> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoordP2uiv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoordP3ui> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoordP3uiv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoordP4ui> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoordP4uiv> {};\ntemplate<>\nstruct fex_gen_config<glNormalP3ui> {};\ntemplate<>\nstruct fex_gen_config<glNormalP3uiv> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3b> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3bv> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3d> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3dv> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3f> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3fv> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3i> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3iv> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3s> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3sv> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3ub> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3ubv> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3ui> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3uiv> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3us> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3usv> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColorP3ui> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColorP3uiv> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColorPointer> {};\ntemplate<>\nstruct fex_gen_config<glTexCoordP1ui> {};\ntemplate<>\nstruct fex_gen_config<glTexCoordP1uiv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoordP2ui> {};\ntemplate<>\nstruct fex_gen_config<glTexCoordP2uiv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoordP3ui> {};\ntemplate<>\nstruct fex_gen_config<glTexCoordP3uiv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoordP4ui> {};\ntemplate<>\nstruct fex_gen_config<glTexCoordP4uiv> {};\ntemplate<>\nstruct fex_gen_config<glVertexP2ui> {};\ntemplate<>\nstruct fex_gen_config<glVertexP2uiv> {};\ntemplate<>\nstruct fex_gen_config<glVertexP3ui> {};\ntemplate<>\nstruct fex_gen_config<glVertexP3uiv> {};\ntemplate<>\nstruct fex_gen_config<glVertexP4ui> {};\ntemplate<>\nstruct fex_gen_config<glVertexP4uiv> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2d> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2dv> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2f> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2fv> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2i> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2iv> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2s> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2sv> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3d> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3dv> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3f> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3fv> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3i> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3iv> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3s> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3sv> {};\ntemplate<>\nstruct fex_gen_config<glGetString> {};\ntemplate<>\nstruct fex_gen_config<glGetStringi> {};\ntemplate<>\nstruct fex_gen_config<glQueryMatrixxOES> {};\ntemplate<>\nstruct fex_gen_config<glAcquireKeyedMutexWin32EXT> {};\ntemplate<>\nstruct fex_gen_config<glAreProgramsResidentNV> {};\ntemplate<>\nstruct fex_gen_config<glAreTexturesResidentEXT> {};\ntemplate<>\nstruct fex_gen_config<glAreTexturesResident> {};\ntemplate<>\nstruct fex_gen_config<glIsAsyncMarkerSGIX> {};\ntemplate<>\nstruct fex_gen_config<glIsBufferARB> {};\ntemplate<>\nstruct fex_gen_config<glIsBuffer> {};\ntemplate<>\nstruct fex_gen_config<glIsBufferResidentNV> {};\ntemplate<>\nstruct fex_gen_config<glIsCommandListNV> {};\ntemplate<>\nstruct fex_gen_config<glIsEnabled> {};\ntemplate<>\nstruct fex_gen_config<glIsEnabledi> {};\ntemplate<>\nstruct fex_gen_config<glIsEnabledIndexedEXT> {};\ntemplate<>\nstruct fex_gen_config<glIsFenceAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glIsFenceNV> {};\ntemplate<>\nstruct fex_gen_config<glIsFramebufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glIsFramebuffer> {};\ntemplate<>\nstruct fex_gen_config<glIsImageHandleResidentARB> {};\ntemplate<>\nstruct fex_gen_config<glIsImageHandleResidentNV> {};\ntemplate<>\nstruct fex_gen_config<glIsList> {};\ntemplate<>\nstruct fex_gen_config<glIsMemoryObjectEXT> {};\ntemplate<>\nstruct fex_gen_config<glIsNameAMD> {};\ntemplate<>\nstruct fex_gen_config<glIsNamedBufferResidentNV> {};\ntemplate<>\nstruct fex_gen_config<glIsNamedStringARB> {};\ntemplate<>\nstruct fex_gen_config<glIsObjectBufferATI> {};\ntemplate<>\nstruct fex_gen_config<glIsOcclusionQueryNV> {};\ntemplate<>\nstruct fex_gen_config<glIsPathNV> {};\ntemplate<>\nstruct fex_gen_config<glIsPointInFillPathNV> {};\ntemplate<>\nstruct fex_gen_config<glIsPointInStrokePathNV> {};\ntemplate<>\nstruct fex_gen_config<glIsProgramARB> {};\ntemplate<>\nstruct fex_gen_config<glIsProgram> {};\ntemplate<>\nstruct fex_gen_config<glIsProgramNV> {};\ntemplate<>\nstruct fex_gen_config<glIsProgramPipeline> {};\ntemplate<>\nstruct fex_gen_config<glIsQueryARB> {};\ntemplate<>\nstruct fex_gen_config<glIsQuery> {};\ntemplate<>\nstruct fex_gen_config<glIsRenderbufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glIsRenderbuffer> {};\ntemplate<>\nstruct fex_gen_config<glIsSampler> {};\ntemplate<>\nstruct fex_gen_config<glIsSemaphoreEXT> {};\ntemplate<>\nstruct fex_gen_config<glIsShader> {};\ntemplate<>\nstruct fex_gen_config<glIsStateNV> {};\ntemplate<>\nstruct fex_gen_config<glIsSync> {};\ntemplate<>\nstruct fex_gen_config<glIsTextureEXT> {};\ntemplate<>\nstruct fex_gen_config<glIsTexture> {};\ntemplate<>\nstruct fex_gen_config<glIsTextureHandleResidentARB> {};\ntemplate<>\nstruct fex_gen_config<glIsTextureHandleResidentNV> {};\ntemplate<>\nstruct fex_gen_config<glIsTransformFeedback> {};\ntemplate<>\nstruct fex_gen_config<glIsTransformFeedbackNV> {};\ntemplate<>\nstruct fex_gen_config<glIsVariantEnabledEXT> {};\ntemplate<>\nstruct fex_gen_config<glIsVertexArrayAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glIsVertexArray> {};\ntemplate<>\nstruct fex_gen_config<glIsVertexAttribEnabledAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glPointAlongPathNV> {};\ntemplate<>\nstruct fex_gen_config<glReleaseKeyedMutexWin32EXT> {};\ntemplate<>\nstruct fex_gen_config<glTestFenceAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glTestFenceNV> {};\ntemplate<>\nstruct fex_gen_config<glTestObjectAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glUnmapBufferARB> {};\ntemplate<>\nstruct fex_gen_config<glUnmapBuffer> {};\ntemplate<>\nstruct fex_gen_config<glUnmapNamedBufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glUnmapNamedBuffer> {};\ntemplate<>\nstruct fex_gen_config<glVDPAUIsSurfaceNV> {};\ntemplate<>\nstruct fex_gen_config<glCheckFramebufferStatusEXT> {};\ntemplate<>\nstruct fex_gen_config<glCheckFramebufferStatus> {};\ntemplate<>\nstruct fex_gen_config<glCheckNamedFramebufferStatusEXT> {};\ntemplate<>\nstruct fex_gen_config<glCheckNamedFramebufferStatus> {};\ntemplate<>\nstruct fex_gen_config<glClientWaitSync> {};\ntemplate<>\nstruct fex_gen_config<glGetError> {};\ntemplate<>\nstruct fex_gen_config<glGetGraphicsResetStatus> {};\ntemplate<>\nstruct fex_gen_config<glGetGraphicsResetStatusARB> {};\ntemplate<>\nstruct fex_gen_config<glObjectPurgeableAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glObjectUnpurgeableAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glPathGlyphIndexArrayNV> {};\ntemplate<>\nstruct fex_gen_config<glPathGlyphIndexRangeNV> {};\ntemplate<>\nstruct fex_gen_config<glPathMemoryGlyphIndexArrayNV> {};\ntemplate<>\nstruct fex_gen_config<glVideoCaptureNV> {};\ntemplate<>\nstruct fex_gen_config<glGetPathLengthNV> {};\ntemplate<>\nstruct fex_gen_config<glCreateProgramObjectARB> {};\ntemplate<>\nstruct fex_gen_config<glCreateShaderObjectARB> {};\ntemplate<>\nstruct fex_gen_config<glGetHandleARB> {};\ntemplate<>\nstruct fex_gen_config<glFinishAsyncSGIX> {};\ntemplate<>\nstruct fex_gen_config<glGetAttribLocationARB> {};\ntemplate<>\nstruct fex_gen_config<glGetAttribLocation> {};\ntemplate<>\nstruct fex_gen_config<glGetFragDataIndex> {};\ntemplate<>\nstruct fex_gen_config<glGetFragDataLocationEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetFragDataLocation> {};\ntemplate<>\nstruct fex_gen_config<glGetInstrumentsSGIX> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramResourceLocation> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramResourceLocationIndex> {};\ntemplate<>\nstruct fex_gen_config<glGetSubroutineUniformLocation> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformBufferSizeEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformLocationARB> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformLocation> {};\ntemplate<>\nstruct fex_gen_config<glGetVaryingLocationNV> {};\ntemplate<>\nstruct fex_gen_config<glPollAsyncSGIX> {};\ntemplate<>\nstruct fex_gen_config<glPollInstrumentsSGIX> {};\ntemplate<>\nstruct fex_gen_config<glQueryResourceNV> {};\ntemplate<>\nstruct fex_gen_config<glRenderMode> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<glCreateSyncFromCLeventARB> {};\ntemplate<>\nstruct fex_gen_config<glFenceSync> {};\ntemplate<>\nstruct fex_gen_config<glImportSyncEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetImageHandleARB> {};\ntemplate<>\nstruct fex_gen_config<glGetImageHandleNV> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureHandleARB> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureHandleNV> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureSamplerHandleARB> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureSamplerHandleNV> {};\ntemplate<>\nstruct fex_gen_config<glAsyncCopyBufferSubDataNVX> {};\ntemplate<>\nstruct fex_gen_config<glAsyncCopyImageSubDataNVX> {};\ntemplate<>\nstruct fex_gen_config<glBindLightParameterEXT> {};\ntemplate<>\nstruct fex_gen_config<glBindMaterialParameterEXT> {};\ntemplate<>\nstruct fex_gen_config<glBindParameterEXT> {};\ntemplate<>\nstruct fex_gen_config<glBindTexGenParameterEXT> {};\ntemplate<>\nstruct fex_gen_config<glBindTextureUnitParameterEXT> {};\ntemplate<>\nstruct fex_gen_config<glCreateProgram> {};\ntemplate<>\nstruct fex_gen_config<glCreateProgressFenceNVX> {};\ntemplate<>\nstruct fex_gen_config<glCreateShader> {};\ntemplate<>\nstruct fex_gen_config<glCreateShaderProgramEXT> {};\ntemplate<>\nstruct fex_gen_config<glCreateShaderProgramv> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glCreateShaderProgramv, 2, const GLchar* const*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glGenAsyncMarkersSGIX> {};\ntemplate<>\nstruct fex_gen_config<glGenFragmentShadersATI> {};\ntemplate<>\nstruct fex_gen_config<glGenLists> {};\ntemplate<>\nstruct fex_gen_config<glGenPathsNV> {};\ntemplate<>\nstruct fex_gen_config<glGenSymbolsEXT> {};\ntemplate<>\nstruct fex_gen_config<glGenVertexShadersEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetCommandHeaderNV> {};\ntemplate<>\nstruct fex_gen_config<glGetDebugMessageLogAMD> {};\ntemplate<>\nstruct fex_gen_config<glGetDebugMessageLogARB> {};\ntemplate<>\nstruct fex_gen_config<glGetDebugMessageLog> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramResourceIndex> {};\ntemplate<>\nstruct fex_gen_config<glGetSubroutineIndex> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformBlockIndex> {};\ntemplate<>\nstruct fex_gen_config<glNewObjectBufferATI> {};\ntemplate<>\nstruct fex_gen_config<glGetStageIndexNV> {};\ntemplate<>\nstruct fex_gen_config<glVDPAURegisterOutputSurfaceNV> {};\ntemplate<>\nstruct fex_gen_config<glVDPAURegisterVideoSurfaceNV> {};\ntemplate<>\nstruct fex_gen_config<glVDPAURegisterVideoSurfaceWithPictureStructureNV> {};\ntemplate<>\nstruct fex_gen_config<glAccum> {};\ntemplate<>\nstruct fex_gen_config<glAccumxOES> {};\ntemplate<>\nstruct fex_gen_config<glActiveProgramEXT> {};\ntemplate<>\nstruct fex_gen_config<glActiveShaderProgram> {};\ntemplate<>\nstruct fex_gen_config<glActiveStencilFaceEXT> {};\ntemplate<>\nstruct fex_gen_config<glActiveTextureARB> {};\ntemplate<>\nstruct fex_gen_config<glActiveTexture> {};\ntemplate<>\nstruct fex_gen_config<glActiveVaryingNV> {};\ntemplate<>\nstruct fex_gen_config<glAlphaFragmentOp1ATI> {};\ntemplate<>\nstruct fex_gen_config<glAlphaFragmentOp2ATI> {};\ntemplate<>\nstruct fex_gen_config<glAlphaFragmentOp3ATI> {};\ntemplate<>\nstruct fex_gen_config<glAlphaFunc> {};\ntemplate<>\nstruct fex_gen_config<glAlphaFuncxOES> {};\ntemplate<>\nstruct fex_gen_config<glAlphaToCoverageDitherControlNV> {};\ntemplate<>\nstruct fex_gen_config<glApplyFramebufferAttachmentCMAAINTEL> {};\ntemplate<>\nstruct fex_gen_config<glApplyTextureEXT> {};\ntemplate<>\nstruct fex_gen_config<glArrayElementEXT> {};\ntemplate<>\nstruct fex_gen_config<glArrayElement> {};\ntemplate<>\nstruct fex_gen_config<glArrayObjectATI> {};\ntemplate<>\nstruct fex_gen_config<glAsyncMarkerSGIX> {};\ntemplate<>\nstruct fex_gen_config<glAttachObjectARB> {};\ntemplate<>\nstruct fex_gen_config<glAttachShader> {};\ntemplate<>\nstruct fex_gen_config<glBeginConditionalRender> {};\ntemplate<>\nstruct fex_gen_config<glBeginConditionalRenderNV> {};\ntemplate<>\nstruct fex_gen_config<glBeginConditionalRenderNVX> {};\ntemplate<>\nstruct fex_gen_config<glBeginFragmentShaderATI> {};\ntemplate<>\nstruct fex_gen_config<glBegin> {};\ntemplate<>\nstruct fex_gen_config<glBeginOcclusionQueryNV> {};\ntemplate<>\nstruct fex_gen_config<glBeginPerfMonitorAMD> {};\ntemplate<>\nstruct fex_gen_config<glBeginPerfQueryINTEL> {};\ntemplate<>\nstruct fex_gen_config<glBeginQueryARB> {};\ntemplate<>\nstruct fex_gen_config<glBeginQuery> {};\ntemplate<>\nstruct fex_gen_config<glBeginQueryIndexed> {};\ntemplate<>\nstruct fex_gen_config<glBeginTransformFeedbackEXT> {};\ntemplate<>\nstruct fex_gen_config<glBeginTransformFeedback> {};\ntemplate<>\nstruct fex_gen_config<glBeginTransformFeedbackNV> {};\ntemplate<>\nstruct fex_gen_config<glBeginVertexShaderEXT> {};\ntemplate<>\nstruct fex_gen_config<glBeginVideoCaptureNV> {};\ntemplate<>\nstruct fex_gen_config<glBindAttribLocationARB> {};\ntemplate<>\nstruct fex_gen_config<glBindAttribLocation> {};\ntemplate<>\nstruct fex_gen_config<glBindBufferARB> {};\ntemplate<>\nstruct fex_gen_config<glBindBufferBaseEXT> {};\ntemplate<>\nstruct fex_gen_config<glBindBufferBase> {};\ntemplate<>\nstruct fex_gen_config<glBindBufferBaseNV> {};\ntemplate<>\nstruct fex_gen_config<glBindBuffer> {};\ntemplate<>\nstruct fex_gen_config<glBindBufferOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<glBindBufferOffsetNV> {};\ntemplate<>\nstruct fex_gen_config<glBindBufferRangeEXT> {};\ntemplate<>\nstruct fex_gen_config<glBindBufferRange> {};\ntemplate<>\nstruct fex_gen_config<glBindBufferRangeNV> {};\ntemplate<>\nstruct fex_gen_config<glBindBuffersBase> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<glBindBuffersRange> {};\n#else\ntemplate<>\nstruct fex_gen_config<glBindBuffersRange> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glBindBuffersRange, 4, const GLintptr*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_param<glBindBuffersRange, 5, const GLsizeiptr*> : fexgen::ptr_passthrough {};\n#endif\ntemplate<>\nstruct fex_gen_config<glBindFragDataLocationEXT> {};\ntemplate<>\nstruct fex_gen_config<glBindFragDataLocation> {};\ntemplate<>\nstruct fex_gen_config<glBindFragDataLocationIndexed> {};\ntemplate<>\nstruct fex_gen_config<glBindFragmentShaderATI> {};\ntemplate<>\nstruct fex_gen_config<glBindFramebufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glBindFramebuffer> {};\ntemplate<>\nstruct fex_gen_config<glBindImageTextureEXT> {};\ntemplate<>\nstruct fex_gen_config<glBindImageTexture> {};\ntemplate<>\nstruct fex_gen_config<glBindImageTextures> {};\ntemplate<>\nstruct fex_gen_config<glBindMultiTextureEXT> {};\ntemplate<>\nstruct fex_gen_config<glBindProgramARB> {};\ntemplate<>\nstruct fex_gen_config<glBindProgramNV> {};\ntemplate<>\nstruct fex_gen_config<glBindProgramPipeline> {};\ntemplate<>\nstruct fex_gen_config<glBindRenderbufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glBindRenderbuffer> {};\ntemplate<>\nstruct fex_gen_config<glBindSampler> {};\ntemplate<>\nstruct fex_gen_config<glBindSamplers> {};\ntemplate<>\nstruct fex_gen_config<glBindShadingRateImageNV> {};\ntemplate<>\nstruct fex_gen_config<glBindTextureEXT> {};\ntemplate<>\nstruct fex_gen_config<glBindTexture> {};\ntemplate<>\nstruct fex_gen_config<glBindTextures> {};\ntemplate<>\nstruct fex_gen_config<glBindTextureUnit> {};\ntemplate<>\nstruct fex_gen_config<glBindTransformFeedback> {};\ntemplate<>\nstruct fex_gen_config<glBindTransformFeedbackNV> {};\ntemplate<>\nstruct fex_gen_config<glBindVertexArrayAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glBindVertexArray> {};\ntemplate<>\nstruct fex_gen_config<glBindVertexBuffer> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<glBindVertexBuffers> {};\n#else\ntemplate<>\nstruct fex_gen_config<glBindVertexBuffers> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glBindVertexBuffers, 3, const GLintptr*> : fexgen::ptr_passthrough {};\n#endif\ntemplate<>\nstruct fex_gen_config<glBindVertexShaderEXT> {};\ntemplate<>\nstruct fex_gen_config<glBindVideoCaptureStreamBufferNV> {};\ntemplate<>\nstruct fex_gen_config<glBindVideoCaptureStreamTextureNV> {};\ntemplate<>\nstruct fex_gen_config<glBinormal3bEXT> {};\ntemplate<>\nstruct fex_gen_config<glBinormal3bvEXT> {};\ntemplate<>\nstruct fex_gen_config<glBinormal3dEXT> {};\ntemplate<>\nstruct fex_gen_config<glBinormal3dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glBinormal3fEXT> {};\ntemplate<>\nstruct fex_gen_config<glBinormal3fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glBinormal3iEXT> {};\ntemplate<>\nstruct fex_gen_config<glBinormal3ivEXT> {};\ntemplate<>\nstruct fex_gen_config<glBinormal3sEXT> {};\ntemplate<>\nstruct fex_gen_config<glBinormal3svEXT> {};\ntemplate<>\nstruct fex_gen_config<glBinormalPointerEXT> {};\ntemplate<>\nstruct fex_gen_config<glBitmap> {};\ntemplate<>\nstruct fex_gen_config<glBitmapxOES> {};\ntemplate<>\nstruct fex_gen_config<glBlendBarrierKHR> {};\ntemplate<>\nstruct fex_gen_config<glBlendBarrierNV> {};\ntemplate<>\nstruct fex_gen_config<glBlendColorEXT> {};\ntemplate<>\nstruct fex_gen_config<glBlendColor> {};\ntemplate<>\nstruct fex_gen_config<glBlendColorxOES> {};\ntemplate<>\nstruct fex_gen_config<glBlendEquationEXT> {};\ntemplate<>\nstruct fex_gen_config<glBlendEquation> {};\ntemplate<>\nstruct fex_gen_config<glBlendEquationiARB> {};\ntemplate<>\nstruct fex_gen_config<glBlendEquationi> {};\ntemplate<>\nstruct fex_gen_config<glBlendEquationIndexedAMD> {};\ntemplate<>\nstruct fex_gen_config<glBlendEquationSeparateEXT> {};\ntemplate<>\nstruct fex_gen_config<glBlendEquationSeparate> {};\ntemplate<>\nstruct fex_gen_config<glBlendEquationSeparateiARB> {};\ntemplate<>\nstruct fex_gen_config<glBlendEquationSeparatei> {};\ntemplate<>\nstruct fex_gen_config<glBlendEquationSeparateIndexedAMD> {};\ntemplate<>\nstruct fex_gen_config<glBlendFunc> {};\ntemplate<>\nstruct fex_gen_config<glBlendFunciARB> {};\ntemplate<>\nstruct fex_gen_config<glBlendFunci> {};\ntemplate<>\nstruct fex_gen_config<glBlendFuncIndexedAMD> {};\ntemplate<>\nstruct fex_gen_config<glBlendFuncSeparateEXT> {};\ntemplate<>\nstruct fex_gen_config<glBlendFuncSeparate> {};\ntemplate<>\nstruct fex_gen_config<glBlendFuncSeparateiARB> {};\ntemplate<>\nstruct fex_gen_config<glBlendFuncSeparatei> {};\ntemplate<>\nstruct fex_gen_config<glBlendFuncSeparateIndexedAMD> {};\ntemplate<>\nstruct fex_gen_config<glBlendFuncSeparateINGR> {};\ntemplate<>\nstruct fex_gen_config<glBlendParameteriNV> {};\ntemplate<>\nstruct fex_gen_config<glBlitFramebufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glBlitFramebuffer> {};\ntemplate<>\nstruct fex_gen_config<glBlitNamedFramebuffer> {};\ntemplate<>\nstruct fex_gen_config<glBufferAddressRangeNV> {};\ntemplate<>\nstruct fex_gen_config<glBufferAttachMemoryNV> {};\ntemplate<>\nstruct fex_gen_config<glBufferDataARB> {};\ntemplate<>\nstruct fex_gen_config<glBufferData> {};\ntemplate<>\nstruct fex_gen_config<glBufferPageCommitmentARB> {};\ntemplate<>\nstruct fex_gen_config<glBufferParameteriAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glBufferStorageExternalEXT> {};\ntemplate<>\nstruct fex_gen_config<glBufferStorage> {};\ntemplate<>\nstruct fex_gen_config<glBufferStorageMemEXT> {};\ntemplate<>\nstruct fex_gen_config<glBufferSubDataARB> {};\ntemplate<>\nstruct fex_gen_config<glBufferSubData> {};\ntemplate<>\nstruct fex_gen_config<glCallCommandListNV> {};\ntemplate<>\nstruct fex_gen_config<glCallList> {};\ntemplate<>\nstruct fex_gen_config<glCallLists> {};\ntemplate<>\nstruct fex_gen_config<glClampColorARB> {};\ntemplate<>\nstruct fex_gen_config<glClampColor> {};\ntemplate<>\nstruct fex_gen_config<glClearAccum> {};\ntemplate<>\nstruct fex_gen_config<glClearAccumxOES> {};\ntemplate<>\nstruct fex_gen_config<glClearBufferData> {};\ntemplate<>\nstruct fex_gen_config<glClearBufferfi> {};\ntemplate<>\nstruct fex_gen_config<glClearBufferfv> {};\ntemplate<>\nstruct fex_gen_config<glClearBufferiv> {};\ntemplate<>\nstruct fex_gen_config<glClearBufferSubData> {};\ntemplate<>\nstruct fex_gen_config<glClearBufferuiv> {};\ntemplate<>\nstruct fex_gen_config<glClearColor> {};\ntemplate<>\nstruct fex_gen_config<glClearColorIiEXT> {};\ntemplate<>\nstruct fex_gen_config<glClearColorIuiEXT> {};\ntemplate<>\nstruct fex_gen_config<glClearColorxOES> {};\ntemplate<>\nstruct fex_gen_config<glClearDepthdNV> {};\ntemplate<>\nstruct fex_gen_config<glClearDepthf> {};\ntemplate<>\nstruct fex_gen_config<glClearDepthfOES> {};\ntemplate<>\nstruct fex_gen_config<glClearDepth> {};\ntemplate<>\nstruct fex_gen_config<glClearDepthxOES> {};\ntemplate<>\nstruct fex_gen_config<glClear> {};\ntemplate<>\nstruct fex_gen_config<glClearIndex> {};\ntemplate<>\nstruct fex_gen_config<glClearNamedBufferDataEXT> {};\ntemplate<>\nstruct fex_gen_config<glClearNamedBufferData> {};\ntemplate<>\nstruct fex_gen_config<glClearNamedBufferSubDataEXT> {};\ntemplate<>\nstruct fex_gen_config<glClearNamedBufferSubData> {};\ntemplate<>\nstruct fex_gen_config<glClearNamedFramebufferfi> {};\ntemplate<>\nstruct fex_gen_config<glClearNamedFramebufferfv> {};\ntemplate<>\nstruct fex_gen_config<glClearNamedFramebufferiv> {};\ntemplate<>\nstruct fex_gen_config<glClearNamedFramebufferuiv> {};\ntemplate<>\nstruct fex_gen_config<glClearStencil> {};\ntemplate<>\nstruct fex_gen_config<glClearTexImage> {};\ntemplate<>\nstruct fex_gen_config<glClearTexSubImage> {};\ntemplate<>\nstruct fex_gen_config<glClientActiveTextureARB> {};\ntemplate<>\nstruct fex_gen_config<glClientActiveTexture> {};\ntemplate<>\nstruct fex_gen_config<glClientActiveVertexStreamATI> {};\ntemplate<>\nstruct fex_gen_config<glClientAttribDefaultEXT> {};\ntemplate<>\nstruct fex_gen_config<glClientWaitSemaphoreui64NVX> {};\ntemplate<>\nstruct fex_gen_config<glClipControl> {};\ntemplate<>\nstruct fex_gen_config<glClipPlanefOES> {};\ntemplate<>\nstruct fex_gen_config<glClipPlane> {};\ntemplate<>\nstruct fex_gen_config<glClipPlanexOES> {};\ntemplate<>\nstruct fex_gen_config<glColor3b> {};\ntemplate<>\nstruct fex_gen_config<glColor3bv> {};\ntemplate<>\nstruct fex_gen_config<glColor3d> {};\ntemplate<>\nstruct fex_gen_config<glColor3dv> {};\ntemplate<>\nstruct fex_gen_config<glColor3f> {};\ntemplate<>\nstruct fex_gen_config<glColor3fv> {};\ntemplate<>\nstruct fex_gen_config<glColor3fVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glColor3fVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glColor3hNV> {};\ntemplate<>\nstruct fex_gen_config<glColor3hvNV> {};\ntemplate<>\nstruct fex_gen_config<glColor3i> {};\ntemplate<>\nstruct fex_gen_config<glColor3iv> {};\ntemplate<>\nstruct fex_gen_config<glColor3s> {};\ntemplate<>\nstruct fex_gen_config<glColor3sv> {};\ntemplate<>\nstruct fex_gen_config<glColor3ub> {};\ntemplate<>\nstruct fex_gen_config<glColor3ubv> {};\ntemplate<>\nstruct fex_gen_config<glColor3ui> {};\ntemplate<>\nstruct fex_gen_config<glColor3uiv> {};\ntemplate<>\nstruct fex_gen_config<glColor3us> {};\ntemplate<>\nstruct fex_gen_config<glColor3usv> {};\ntemplate<>\nstruct fex_gen_config<glColor3xOES> {};\ntemplate<>\nstruct fex_gen_config<glColor3xvOES> {};\ntemplate<>\nstruct fex_gen_config<glColor4b> {};\ntemplate<>\nstruct fex_gen_config<glColor4bv> {};\ntemplate<>\nstruct fex_gen_config<glColor4d> {};\ntemplate<>\nstruct fex_gen_config<glColor4dv> {};\ntemplate<>\nstruct fex_gen_config<glColor4f> {};\ntemplate<>\nstruct fex_gen_config<glColor4fNormal3fVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glColor4fNormal3fVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glColor4fv> {};\ntemplate<>\nstruct fex_gen_config<glColor4hNV> {};\ntemplate<>\nstruct fex_gen_config<glColor4hvNV> {};\ntemplate<>\nstruct fex_gen_config<glColor4i> {};\ntemplate<>\nstruct fex_gen_config<glColor4iv> {};\ntemplate<>\nstruct fex_gen_config<glColor4s> {};\ntemplate<>\nstruct fex_gen_config<glColor4sv> {};\ntemplate<>\nstruct fex_gen_config<glColor4ub> {};\ntemplate<>\nstruct fex_gen_config<glColor4ubv> {};\ntemplate<>\nstruct fex_gen_config<glColor4ubVertex2fSUN> {};\ntemplate<>\nstruct fex_gen_config<glColor4ubVertex2fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glColor4ubVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glColor4ubVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glColor4ui> {};\ntemplate<>\nstruct fex_gen_config<glColor4uiv> {};\ntemplate<>\nstruct fex_gen_config<glColor4us> {};\ntemplate<>\nstruct fex_gen_config<glColor4usv> {};\ntemplate<>\nstruct fex_gen_config<glColor4xOES> {};\ntemplate<>\nstruct fex_gen_config<glColor4xvOES> {};\ntemplate<>\nstruct fex_gen_config<glColorFormatNV> {};\ntemplate<>\nstruct fex_gen_config<glColorFragmentOp1ATI> {};\ntemplate<>\nstruct fex_gen_config<glColorFragmentOp2ATI> {};\ntemplate<>\nstruct fex_gen_config<glColorFragmentOp3ATI> {};\ntemplate<>\nstruct fex_gen_config<glColorMask> {};\ntemplate<>\nstruct fex_gen_config<glColorMaski> {};\ntemplate<>\nstruct fex_gen_config<glColorMaskIndexedEXT> {};\ntemplate<>\nstruct fex_gen_config<glColorMaterial> {};\ntemplate<>\nstruct fex_gen_config<glColorPointerEXT> {};\ntemplate<>\nstruct fex_gen_config<glColorPointer> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glColorPointerListIBM> {};\ntemplate<>\nstruct fex_gen_param<glColorPointerListIBM, 3, const void**> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<glColorPointervINTEL> {};\ntemplate<>\nstruct fex_gen_param<glColorPointervINTEL, 2, const void**> : fexgen::assume_compatible_data_layout {};\n#endif\ntemplate<>\nstruct fex_gen_config<glColorSubTableEXT> {};\ntemplate<>\nstruct fex_gen_config<glColorSubTable> {};\ntemplate<>\nstruct fex_gen_config<glColorTableEXT> {};\ntemplate<>\nstruct fex_gen_config<glColorTable> {};\ntemplate<>\nstruct fex_gen_config<glColorTableParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glColorTableParameterfvSGI> {};\ntemplate<>\nstruct fex_gen_config<glColorTableParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glColorTableParameterivSGI> {};\ntemplate<>\nstruct fex_gen_config<glColorTableSGI> {};\ntemplate<>\nstruct fex_gen_config<glCombinerInputNV> {};\ntemplate<>\nstruct fex_gen_config<glCombinerOutputNV> {};\ntemplate<>\nstruct fex_gen_config<glCombinerParameterfNV> {};\ntemplate<>\nstruct fex_gen_config<glCombinerParameterfvNV> {};\ntemplate<>\nstruct fex_gen_config<glCombinerParameteriNV> {};\ntemplate<>\nstruct fex_gen_config<glCombinerParameterivNV> {};\ntemplate<>\nstruct fex_gen_config<glCombinerStageParameterfvNV> {};\ntemplate<>\nstruct fex_gen_config<glCommandListSegmentsNV> {};\ntemplate<>\nstruct fex_gen_config<glCompileCommandListNV> {};\ntemplate<>\nstruct fex_gen_config<glCompileShaderARB> {};\ntemplate<>\nstruct fex_gen_config<glCompileShader> {};\ntemplate<>\nstruct fex_gen_config<glCompileShaderIncludeARB> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glCompileShaderIncludeARB, 2, const GLchar* const*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glCompressedMultiTexImage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCompressedMultiTexImage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCompressedMultiTexImage3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCompressedMultiTexSubImage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCompressedMultiTexSubImage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCompressedMultiTexSubImage3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTexImage1DARB> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTexImage1D> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTexImage2DARB> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTexImage2D> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTexImage3DARB> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTexImage3D> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTexSubImage1DARB> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTexSubImage1D> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTexSubImage2DARB> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTexSubImage2D> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTexSubImage3DARB> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTexSubImage3D> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTextureImage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTextureImage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTextureImage3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTextureSubImage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTextureSubImage1D> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTextureSubImage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTextureSubImage2D> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTextureSubImage3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCompressedTextureSubImage3D> {};\ntemplate<>\nstruct fex_gen_config<glConservativeRasterParameterfNV> {};\ntemplate<>\nstruct fex_gen_config<glConservativeRasterParameteriNV> {};\ntemplate<>\nstruct fex_gen_config<glConvolutionFilter1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glConvolutionFilter1D> {};\ntemplate<>\nstruct fex_gen_config<glConvolutionFilter2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glConvolutionFilter2D> {};\ntemplate<>\nstruct fex_gen_config<glConvolutionParameterfEXT> {};\ntemplate<>\nstruct fex_gen_config<glConvolutionParameterf> {};\ntemplate<>\nstruct fex_gen_config<glConvolutionParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glConvolutionParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glConvolutionParameteriEXT> {};\ntemplate<>\nstruct fex_gen_config<glConvolutionParameteri> {};\ntemplate<>\nstruct fex_gen_config<glConvolutionParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glConvolutionParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glConvolutionParameterxOES> {};\ntemplate<>\nstruct fex_gen_config<glConvolutionParameterxvOES> {};\ntemplate<>\nstruct fex_gen_config<glCopyBufferSubData> {};\ntemplate<>\nstruct fex_gen_config<glCopyColorSubTableEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyColorSubTable> {};\ntemplate<>\nstruct fex_gen_config<glCopyColorTable> {};\ntemplate<>\nstruct fex_gen_config<glCopyColorTableSGI> {};\ntemplate<>\nstruct fex_gen_config<glCopyConvolutionFilter1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyConvolutionFilter1D> {};\ntemplate<>\nstruct fex_gen_config<glCopyConvolutionFilter2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyConvolutionFilter2D> {};\ntemplate<>\nstruct fex_gen_config<glCopyImageSubData> {};\ntemplate<>\nstruct fex_gen_config<glCopyImageSubDataNV> {};\ntemplate<>\nstruct fex_gen_config<glCopyMultiTexImage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyMultiTexImage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyMultiTexSubImage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyMultiTexSubImage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyMultiTexSubImage3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyNamedBufferSubData> {};\ntemplate<>\nstruct fex_gen_config<glCopyPathNV> {};\ntemplate<>\nstruct fex_gen_config<glCopyPixels> {};\ntemplate<>\nstruct fex_gen_config<glCopyTexImage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyTexImage1D> {};\ntemplate<>\nstruct fex_gen_config<glCopyTexImage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyTexImage2D> {};\ntemplate<>\nstruct fex_gen_config<glCopyTexSubImage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyTexSubImage1D> {};\ntemplate<>\nstruct fex_gen_config<glCopyTexSubImage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyTexSubImage2D> {};\ntemplate<>\nstruct fex_gen_config<glCopyTexSubImage3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyTexSubImage3D> {};\ntemplate<>\nstruct fex_gen_config<glCopyTextureImage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyTextureImage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyTextureSubImage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyTextureSubImage1D> {};\ntemplate<>\nstruct fex_gen_config<glCopyTextureSubImage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyTextureSubImage2D> {};\ntemplate<>\nstruct fex_gen_config<glCopyTextureSubImage3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glCopyTextureSubImage3D> {};\ntemplate<>\nstruct fex_gen_config<glCoverageModulationNV> {};\ntemplate<>\nstruct fex_gen_config<glCoverageModulationTableNV> {};\ntemplate<>\nstruct fex_gen_config<glCoverFillPathInstancedNV> {};\ntemplate<>\nstruct fex_gen_config<glCoverFillPathNV> {};\ntemplate<>\nstruct fex_gen_config<glCoverStrokePathInstancedNV> {};\ntemplate<>\nstruct fex_gen_config<glCoverStrokePathNV> {};\ntemplate<>\nstruct fex_gen_config<glCreateBuffers> {};\ntemplate<>\nstruct fex_gen_config<glCreateCommandListsNV> {};\ntemplate<>\nstruct fex_gen_config<glCreateFramebuffers> {};\ntemplate<>\nstruct fex_gen_config<glCreateMemoryObjectsEXT> {};\ntemplate<>\nstruct fex_gen_config<glCreatePerfQueryINTEL> {};\ntemplate<>\nstruct fex_gen_config<glCreateProgramPipelines> {};\ntemplate<>\nstruct fex_gen_config<glCreateQueries> {};\ntemplate<>\nstruct fex_gen_config<glCreateRenderbuffers> {};\ntemplate<>\nstruct fex_gen_config<glCreateSamplers> {};\ntemplate<>\nstruct fex_gen_config<glCreateStatesNV> {};\ntemplate<>\nstruct fex_gen_config<glCreateTextures> {};\ntemplate<>\nstruct fex_gen_config<glCreateTransformFeedbacks> {};\ntemplate<>\nstruct fex_gen_config<glCreateVertexArrays> {};\ntemplate<>\nstruct fex_gen_config<glCullFace> {};\ntemplate<>\nstruct fex_gen_config<glCullParameterdvEXT> {};\ntemplate<>\nstruct fex_gen_config<glCullParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glCurrentPaletteMatrixARB> {};\ntemplate<>\nstruct fex_gen_config<glDebugMessageCallbackAMD> : fexgen::callback_stub {};\ntemplate<>\nstruct fex_gen_config<glDebugMessageCallbackARB> : fexgen::callback_stub {};\ntemplate<>\nstruct fex_gen_config<glDebugMessageCallback> : fexgen::callback_stub {};\ntemplate<>\nstruct fex_gen_config<glDebugMessageControlARB> {};\ntemplate<>\nstruct fex_gen_config<glDebugMessageControl> {};\ntemplate<>\nstruct fex_gen_config<glDebugMessageEnableAMD> {};\ntemplate<>\nstruct fex_gen_config<glDebugMessageInsertAMD> {};\ntemplate<>\nstruct fex_gen_config<glDebugMessageInsertARB> {};\ntemplate<>\nstruct fex_gen_config<glDebugMessageInsert> {};\ntemplate<>\nstruct fex_gen_config<glDeformationMap3dSGIX> {};\ntemplate<>\nstruct fex_gen_config<glDeformationMap3fSGIX> {};\ntemplate<>\nstruct fex_gen_config<glDeformSGIX> {};\ntemplate<>\nstruct fex_gen_config<glDeleteAsyncMarkersSGIX> {};\ntemplate<>\nstruct fex_gen_config<glDeleteBuffersARB> {};\ntemplate<>\nstruct fex_gen_config<glDeleteBuffers> {};\ntemplate<>\nstruct fex_gen_config<glDeleteCommandListsNV> {};\ntemplate<>\nstruct fex_gen_config<glDeleteFencesAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glDeleteFencesNV> {};\ntemplate<>\nstruct fex_gen_config<glDeleteFragmentShaderATI> {};\ntemplate<>\nstruct fex_gen_config<glDeleteFramebuffersEXT> {};\ntemplate<>\nstruct fex_gen_config<glDeleteFramebuffers> {};\ntemplate<>\nstruct fex_gen_config<glDeleteLists> {};\ntemplate<>\nstruct fex_gen_config<glDeleteMemoryObjectsEXT> {};\ntemplate<>\nstruct fex_gen_config<glDeleteNamedStringARB> {};\ntemplate<>\nstruct fex_gen_config<glDeleteNamesAMD> {};\ntemplate<>\nstruct fex_gen_config<glDeleteObjectARB> {};\ntemplate<>\nstruct fex_gen_config<glDeleteOcclusionQueriesNV> {};\ntemplate<>\nstruct fex_gen_config<glDeletePathsNV> {};\ntemplate<>\nstruct fex_gen_config<glDeletePerfMonitorsAMD> {};\ntemplate<>\nstruct fex_gen_config<glDeletePerfQueryINTEL> {};\ntemplate<>\nstruct fex_gen_config<glDeleteProgram> {};\ntemplate<>\nstruct fex_gen_config<glDeleteProgramPipelines> {};\ntemplate<>\nstruct fex_gen_config<glDeleteProgramsARB> {};\ntemplate<>\nstruct fex_gen_config<glDeleteProgramsNV> {};\ntemplate<>\nstruct fex_gen_config<glDeleteQueriesARB> {};\ntemplate<>\nstruct fex_gen_config<glDeleteQueries> {};\ntemplate<>\nstruct fex_gen_config<glDeleteQueryResourceTagNV> {};\ntemplate<>\nstruct fex_gen_config<glDeleteRenderbuffersEXT> {};\ntemplate<>\nstruct fex_gen_config<glDeleteRenderbuffers> {};\ntemplate<>\nstruct fex_gen_config<glDeleteSamplers> {};\ntemplate<>\nstruct fex_gen_config<glDeleteSemaphoresEXT> {};\ntemplate<>\nstruct fex_gen_config<glDeleteShader> {};\ntemplate<>\nstruct fex_gen_config<glDeleteStatesNV> {};\ntemplate<>\nstruct fex_gen_config<glDeleteSync> {};\ntemplate<>\nstruct fex_gen_config<glDeleteTexturesEXT> {};\ntemplate<>\nstruct fex_gen_config<glDeleteTextures> {};\ntemplate<>\nstruct fex_gen_config<glDeleteTransformFeedbacks> {};\ntemplate<>\nstruct fex_gen_config<glDeleteTransformFeedbacksNV> {};\ntemplate<>\nstruct fex_gen_config<glDeleteVertexArraysAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glDeleteVertexArrays> {};\ntemplate<>\nstruct fex_gen_config<glDeleteVertexShaderEXT> {};\ntemplate<>\nstruct fex_gen_config<glDepthBoundsdNV> {};\ntemplate<>\nstruct fex_gen_config<glDepthBoundsEXT> {};\ntemplate<>\nstruct fex_gen_config<glDepthFunc> {};\ntemplate<>\nstruct fex_gen_config<glDepthMask> {};\ntemplate<>\nstruct fex_gen_config<glDepthRangeArraydvNV> {};\ntemplate<>\nstruct fex_gen_config<glDepthRangeArrayv> {};\ntemplate<>\nstruct fex_gen_config<glDepthRangedNV> {};\ntemplate<>\nstruct fex_gen_config<glDepthRangef> {};\ntemplate<>\nstruct fex_gen_config<glDepthRangefOES> {};\ntemplate<>\nstruct fex_gen_config<glDepthRange> {};\ntemplate<>\nstruct fex_gen_config<glDepthRangeIndexeddNV> {};\ntemplate<>\nstruct fex_gen_config<glDepthRangeIndexed> {};\ntemplate<>\nstruct fex_gen_config<glDepthRangexOES> {};\ntemplate<>\nstruct fex_gen_config<glDetachObjectARB> {};\ntemplate<>\nstruct fex_gen_config<glDetachShader> {};\ntemplate<>\nstruct fex_gen_config<glDetailTexFuncSGIS> {};\ntemplate<>\nstruct fex_gen_config<glDisableClientState> {};\ntemplate<>\nstruct fex_gen_config<glDisableClientStateiEXT> {};\ntemplate<>\nstruct fex_gen_config<glDisableClientStateIndexedEXT> {};\ntemplate<>\nstruct fex_gen_config<glDisable> {};\ntemplate<>\nstruct fex_gen_config<glDisablei> {};\ntemplate<>\nstruct fex_gen_config<glDisableIndexedEXT> {};\ntemplate<>\nstruct fex_gen_config<glDisableVariantClientStateEXT> {};\ntemplate<>\nstruct fex_gen_config<glDisableVertexArrayAttribEXT> {};\ntemplate<>\nstruct fex_gen_config<glDisableVertexArrayAttrib> {};\ntemplate<>\nstruct fex_gen_config<glDisableVertexArrayEXT> {};\ntemplate<>\nstruct fex_gen_config<glDisableVertexAttribAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glDisableVertexAttribArrayARB> {};\ntemplate<>\nstruct fex_gen_config<glDisableVertexAttribArray> {};\ntemplate<>\nstruct fex_gen_config<glDispatchCompute> {};\ntemplate<>\nstruct fex_gen_config<glDispatchComputeGroupSizeARB> {};\ntemplate<>\nstruct fex_gen_config<glDispatchComputeIndirect> {};\ntemplate<>\nstruct fex_gen_config<glDrawArraysEXT> {};\ntemplate<>\nstruct fex_gen_config<glDrawArrays> {};\ntemplate<>\nstruct fex_gen_config<glDrawArraysIndirect> {};\ntemplate<>\nstruct fex_gen_config<glDrawArraysInstancedARB> {};\ntemplate<>\nstruct fex_gen_config<glDrawArraysInstancedBaseInstance> {};\ntemplate<>\nstruct fex_gen_config<glDrawArraysInstancedEXT> {};\ntemplate<>\nstruct fex_gen_config<glDrawArraysInstanced> {};\ntemplate<>\nstruct fex_gen_config<glDrawBuffer> {};\ntemplate<>\nstruct fex_gen_config<glDrawBuffersARB> {};\ntemplate<>\nstruct fex_gen_config<glDrawBuffersATI> {};\ntemplate<>\nstruct fex_gen_config<glDrawBuffers> {};\ntemplate<>\nstruct fex_gen_config<glDrawCommandsAddressNV> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glDrawCommandsNV> {};\n#endif\ntemplate<>\nstruct fex_gen_config<glDrawCommandsStatesAddressNV> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glDrawCommandsStatesNV> {};\n#endif\ntemplate<>\nstruct fex_gen_config<glDrawElementArrayAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glDrawElementArrayATI> {};\ntemplate<>\nstruct fex_gen_config<glDrawElementsBaseVertex> {};\ntemplate<>\nstruct fex_gen_config<glDrawElements> {};\ntemplate<>\nstruct fex_gen_config<glDrawElementsIndirect> {};\ntemplate<>\nstruct fex_gen_config<glDrawElementsInstancedARB> {};\ntemplate<>\nstruct fex_gen_config<glDrawElementsInstancedBaseInstance> {};\ntemplate<>\nstruct fex_gen_config<glDrawElementsInstancedBaseVertexBaseInstance> {};\ntemplate<>\nstruct fex_gen_config<glDrawElementsInstancedBaseVertex> {};\ntemplate<>\nstruct fex_gen_config<glDrawElementsInstancedEXT> {};\ntemplate<>\nstruct fex_gen_config<glDrawElementsInstanced> {};\ntemplate<>\nstruct fex_gen_config<glDrawMeshArraysSUN> {};\ntemplate<>\nstruct fex_gen_config<glDrawMeshTasksIndirectNV> {};\ntemplate<>\nstruct fex_gen_config<glDrawMeshTasksNV> {};\ntemplate<>\nstruct fex_gen_config<glDrawPixels> {};\ntemplate<>\nstruct fex_gen_config<glDrawRangeElementArrayAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glDrawRangeElementArrayATI> {};\ntemplate<>\nstruct fex_gen_config<glDrawRangeElementsBaseVertex> {};\ntemplate<>\nstruct fex_gen_config<glDrawRangeElementsEXT> {};\ntemplate<>\nstruct fex_gen_config<glDrawRangeElements> {};\ntemplate<>\nstruct fex_gen_config<glDrawTextureNV> {};\ntemplate<>\nstruct fex_gen_config<glDrawTransformFeedback> {};\ntemplate<>\nstruct fex_gen_config<glDrawTransformFeedbackInstanced> {};\ntemplate<>\nstruct fex_gen_config<glDrawTransformFeedbackNV> {};\ntemplate<>\nstruct fex_gen_config<glDrawTransformFeedbackStream> {};\ntemplate<>\nstruct fex_gen_config<glDrawTransformFeedbackStreamInstanced> {};\ntemplate<>\nstruct fex_gen_config<glDrawVkImageNV> {};\ntemplate<>\nstruct fex_gen_config<glEdgeFlagFormatNV> {};\ntemplate<>\nstruct fex_gen_config<glEdgeFlag> {};\ntemplate<>\nstruct fex_gen_config<glEdgeFlagPointerEXT> {};\ntemplate<>\nstruct fex_gen_config<glEdgeFlagPointer> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glEdgeFlagPointerListIBM> {};\ntemplate<>\nstruct fex_gen_param<glEdgeFlagPointerListIBM, 1, const GLboolean**> : fexgen::assume_compatible_data_layout {};\n#endif\ntemplate<>\nstruct fex_gen_config<glEdgeFlagv> {};\ntemplate<>\nstruct fex_gen_config<glEGLImageTargetRenderbufferStorageOES> {};\ntemplate<>\nstruct fex_gen_config<glEGLImageTargetTexStorageEXT> {};\ntemplate<>\nstruct fex_gen_config<glEGLImageTargetTexture2DOES> {};\ntemplate<>\nstruct fex_gen_config<glEGLImageTargetTextureStorageEXT> {};\ntemplate<>\nstruct fex_gen_config<glElementPointerAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glElementPointerATI> {};\ntemplate<>\nstruct fex_gen_config<glEnableClientState> {};\ntemplate<>\nstruct fex_gen_config<glEnableClientStateiEXT> {};\ntemplate<>\nstruct fex_gen_config<glEnableClientStateIndexedEXT> {};\ntemplate<>\nstruct fex_gen_config<glEnable> {};\ntemplate<>\nstruct fex_gen_config<glEnablei> {};\ntemplate<>\nstruct fex_gen_config<glEnableIndexedEXT> {};\ntemplate<>\nstruct fex_gen_config<glEnableVariantClientStateEXT> {};\ntemplate<>\nstruct fex_gen_config<glEnableVertexArrayAttribEXT> {};\ntemplate<>\nstruct fex_gen_config<glEnableVertexArrayAttrib> {};\ntemplate<>\nstruct fex_gen_config<glEnableVertexArrayEXT> {};\ntemplate<>\nstruct fex_gen_config<glEnableVertexAttribAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glEnableVertexAttribArrayARB> {};\ntemplate<>\nstruct fex_gen_config<glEnableVertexAttribArray> {};\ntemplate<>\nstruct fex_gen_config<glEnd> {};\ntemplate<>\nstruct fex_gen_config<glEndConditionalRender> {};\ntemplate<>\nstruct fex_gen_config<glEndConditionalRenderNV> {};\ntemplate<>\nstruct fex_gen_config<glEndConditionalRenderNVX> {};\ntemplate<>\nstruct fex_gen_config<glEndFragmentShaderATI> {};\ntemplate<>\nstruct fex_gen_config<glEndList> {};\ntemplate<>\nstruct fex_gen_config<glEndOcclusionQueryNV> {};\ntemplate<>\nstruct fex_gen_config<glEndPerfMonitorAMD> {};\ntemplate<>\nstruct fex_gen_config<glEndPerfQueryINTEL> {};\ntemplate<>\nstruct fex_gen_config<glEndQueryARB> {};\ntemplate<>\nstruct fex_gen_config<glEndQuery> {};\ntemplate<>\nstruct fex_gen_config<glEndQueryIndexed> {};\ntemplate<>\nstruct fex_gen_config<glEndTransformFeedback> {};\ntemplate<>\nstruct fex_gen_config<glEndTransformFeedbackEXT> {};\ntemplate<>\nstruct fex_gen_config<glEndTransformFeedbackNV> {};\ntemplate<>\nstruct fex_gen_config<glEndVertexShaderEXT> {};\ntemplate<>\nstruct fex_gen_config<glEndVideoCaptureNV> {};\ntemplate<>\nstruct fex_gen_config<glEvalCoord1d> {};\ntemplate<>\nstruct fex_gen_config<glEvalCoord1dv> {};\ntemplate<>\nstruct fex_gen_config<glEvalCoord1f> {};\ntemplate<>\nstruct fex_gen_config<glEvalCoord1fv> {};\ntemplate<>\nstruct fex_gen_config<glEvalCoord1xOES> {};\ntemplate<>\nstruct fex_gen_config<glEvalCoord1xvOES> {};\ntemplate<>\nstruct fex_gen_config<glEvalCoord2d> {};\ntemplate<>\nstruct fex_gen_config<glEvalCoord2dv> {};\ntemplate<>\nstruct fex_gen_config<glEvalCoord2f> {};\ntemplate<>\nstruct fex_gen_config<glEvalCoord2fv> {};\ntemplate<>\nstruct fex_gen_config<glEvalCoord2xOES> {};\ntemplate<>\nstruct fex_gen_config<glEvalCoord2xvOES> {};\ntemplate<>\nstruct fex_gen_config<glEvalMapsNV> {};\ntemplate<>\nstruct fex_gen_config<glEvalMesh1> {};\ntemplate<>\nstruct fex_gen_config<glEvalMesh2> {};\ntemplate<>\nstruct fex_gen_config<glEvalPoint1> {};\ntemplate<>\nstruct fex_gen_config<glEvalPoint2> {};\ntemplate<>\nstruct fex_gen_config<glEvaluateDepthValuesARB> {};\ntemplate<>\nstruct fex_gen_config<glExecuteProgramNV> {};\ntemplate<>\nstruct fex_gen_config<glExtractComponentEXT> {};\ntemplate<>\nstruct fex_gen_config<glFeedbackBuffer> {};\ntemplate<>\nstruct fex_gen_config<glFeedbackBufferxOES> {};\ntemplate<>\nstruct fex_gen_config<glFinalCombinerInputNV> {};\ntemplate<>\nstruct fex_gen_config<glFinish> {};\ntemplate<>\nstruct fex_gen_config<glFinishFenceAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glFinishFenceNV> {};\ntemplate<>\nstruct fex_gen_config<glFinishObjectAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glFinishTextureSUNX> {};\ntemplate<>\nstruct fex_gen_config<glFlush> {};\ntemplate<>\nstruct fex_gen_config<glFlushMappedBufferRangeAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glFlushMappedBufferRange> {};\ntemplate<>\nstruct fex_gen_config<glFlushMappedNamedBufferRangeEXT> {};\ntemplate<>\nstruct fex_gen_config<glFlushMappedNamedBufferRange> {};\ntemplate<>\nstruct fex_gen_config<glFlushPixelDataRangeNV> {};\ntemplate<>\nstruct fex_gen_config<glFlushRasterSGIX> {};\ntemplate<>\nstruct fex_gen_config<glFlushStaticDataIBM> {};\ntemplate<>\nstruct fex_gen_config<glFlushVertexArrayRangeAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glFlushVertexArrayRangeNV> {};\ntemplate<>\nstruct fex_gen_config<glFogCoorddEXT> {};\ntemplate<>\nstruct fex_gen_config<glFogCoorddvEXT> {};\ntemplate<>\nstruct fex_gen_config<glFogCoordfEXT> {};\ntemplate<>\nstruct fex_gen_config<glFogCoordFormatNV> {};\ntemplate<>\nstruct fex_gen_config<glFogCoordfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glFogCoordhNV> {};\ntemplate<>\nstruct fex_gen_config<glFogCoordhvNV> {};\ntemplate<>\nstruct fex_gen_config<glFogCoordPointerEXT> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glFogCoordPointerListIBM> {};\ntemplate<>\nstruct fex_gen_param<glFogCoordPointerListIBM, 2, const void**> : fexgen::assume_compatible_data_layout {};\n#endif\ntemplate<>\nstruct fex_gen_config<glFogf> {};\ntemplate<>\nstruct fex_gen_config<glFogFuncSGIS> {};\ntemplate<>\nstruct fex_gen_config<glFogfv> {};\ntemplate<>\nstruct fex_gen_config<glFogi> {};\ntemplate<>\nstruct fex_gen_config<glFogiv> {};\ntemplate<>\nstruct fex_gen_config<glFogxOES> {};\ntemplate<>\nstruct fex_gen_config<glFogxvOES> {};\ntemplate<>\nstruct fex_gen_config<glFragmentColorMaterialSGIX> {};\ntemplate<>\nstruct fex_gen_config<glFragmentCoverageColorNV> {};\ntemplate<>\nstruct fex_gen_config<glFragmentLightfSGIX> {};\ntemplate<>\nstruct fex_gen_config<glFragmentLightfvSGIX> {};\ntemplate<>\nstruct fex_gen_config<glFragmentLightiSGIX> {};\ntemplate<>\nstruct fex_gen_config<glFragmentLightivSGIX> {};\ntemplate<>\nstruct fex_gen_config<glFragmentLightModelfSGIX> {};\ntemplate<>\nstruct fex_gen_config<glFragmentLightModelfvSGIX> {};\ntemplate<>\nstruct fex_gen_config<glFragmentLightModeliSGIX> {};\ntemplate<>\nstruct fex_gen_config<glFragmentLightModelivSGIX> {};\ntemplate<>\nstruct fex_gen_config<glFragmentMaterialfSGIX> {};\ntemplate<>\nstruct fex_gen_config<glFragmentMaterialfvSGIX> {};\ntemplate<>\nstruct fex_gen_config<glFragmentMaterialiSGIX> {};\ntemplate<>\nstruct fex_gen_config<glFragmentMaterialivSGIX> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferDrawBufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferDrawBuffersEXT> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferFetchBarrierEXT> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferParameteri> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferParameteriMESA> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferReadBufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferRenderbufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferRenderbuffer> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferSampleLocationsfvARB> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferSampleLocationsfvNV> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferSamplePositionsfvAMD> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferTexture1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferTexture1D> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferTexture2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferTexture2D> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferTexture3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferTexture3D> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferTextureARB> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferTextureEXT> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferTextureFaceARB> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferTextureFaceEXT> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferTexture> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferTextureLayerARB> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferTextureLayerEXT> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferTextureLayer> {};\ntemplate<>\nstruct fex_gen_config<glFramebufferTextureMultiviewOVR> {};\ntemplate<>\nstruct fex_gen_config<glFrameTerminatorGREMEDY> {};\ntemplate<>\nstruct fex_gen_config<glFrameZoomSGIX> {};\ntemplate<>\nstruct fex_gen_config<glFreeObjectBufferATI> {};\ntemplate<>\nstruct fex_gen_config<glFrontFace> {};\ntemplate<>\nstruct fex_gen_config<glFrustumfOES> {};\ntemplate<>\nstruct fex_gen_config<glFrustum> {};\ntemplate<>\nstruct fex_gen_config<glFrustumxOES> {};\ntemplate<>\nstruct fex_gen_config<glGenBuffersARB> {};\ntemplate<>\nstruct fex_gen_config<glGenBuffers> {};\ntemplate<>\nstruct fex_gen_config<glGenerateMipmapEXT> {};\ntemplate<>\nstruct fex_gen_config<glGenerateMipmap> {};\ntemplate<>\nstruct fex_gen_config<glGenerateMultiTexMipmapEXT> {};\ntemplate<>\nstruct fex_gen_config<glGenerateTextureMipmapEXT> {};\ntemplate<>\nstruct fex_gen_config<glGenerateTextureMipmap> {};\ntemplate<>\nstruct fex_gen_config<glGenFencesAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glGenFencesNV> {};\ntemplate<>\nstruct fex_gen_config<glGenFramebuffersEXT> {};\ntemplate<>\nstruct fex_gen_config<glGenFramebuffers> {};\ntemplate<>\nstruct fex_gen_config<glGenNamesAMD> {};\ntemplate<>\nstruct fex_gen_config<glGenOcclusionQueriesNV> {};\ntemplate<>\nstruct fex_gen_config<glGenPerfMonitorsAMD> {};\ntemplate<>\nstruct fex_gen_config<glGenProgramPipelines> {};\ntemplate<>\nstruct fex_gen_config<glGenProgramsARB> {};\ntemplate<>\nstruct fex_gen_config<glGenProgramsNV> {};\ntemplate<>\nstruct fex_gen_config<glGenQueriesARB> {};\ntemplate<>\nstruct fex_gen_config<glGenQueries> {};\ntemplate<>\nstruct fex_gen_config<glGenQueryResourceTagNV> {};\ntemplate<>\nstruct fex_gen_config<glGenRenderbuffersEXT> {};\ntemplate<>\nstruct fex_gen_config<glGenRenderbuffers> {};\ntemplate<>\nstruct fex_gen_config<glGenSamplers> {};\ntemplate<>\nstruct fex_gen_config<glGenSemaphoresEXT> {};\ntemplate<>\nstruct fex_gen_config<glGenTexturesEXT> {};\ntemplate<>\nstruct fex_gen_config<glGenTextures> {};\ntemplate<>\nstruct fex_gen_config<glGenTransformFeedbacks> {};\ntemplate<>\nstruct fex_gen_config<glGenTransformFeedbacksNV> {};\ntemplate<>\nstruct fex_gen_config<glGenVertexArraysAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glGenVertexArrays> {};\ntemplate<>\nstruct fex_gen_config<glGetActiveAtomicCounterBufferiv> {};\ntemplate<>\nstruct fex_gen_config<glGetActiveAttribARB> {};\ntemplate<>\nstruct fex_gen_config<glGetActiveAttrib> {};\ntemplate<>\nstruct fex_gen_config<glGetActiveSubroutineName> {};\ntemplate<>\nstruct fex_gen_config<glGetActiveSubroutineUniformiv> {};\ntemplate<>\nstruct fex_gen_config<glGetActiveSubroutineUniformName> {};\ntemplate<>\nstruct fex_gen_config<glGetActiveUniformARB> {};\ntemplate<>\nstruct fex_gen_config<glGetActiveUniformBlockiv> {};\ntemplate<>\nstruct fex_gen_config<glGetActiveUniformBlockName> {};\ntemplate<>\nstruct fex_gen_config<glGetActiveUniform> {};\ntemplate<>\nstruct fex_gen_config<glGetActiveUniformName> {};\ntemplate<>\nstruct fex_gen_config<glGetActiveUniformsiv> {};\ntemplate<>\nstruct fex_gen_config<glGetActiveVaryingNV> {};\ntemplate<>\nstruct fex_gen_config<glGetArrayObjectfvATI> {};\ntemplate<>\nstruct fex_gen_config<glGetArrayObjectivATI> {};\ntemplate<>\nstruct fex_gen_config<glGetAttachedObjectsARB> {};\ntemplate<>\nstruct fex_gen_config<glGetAttachedShaders> {};\ntemplate<>\nstruct fex_gen_config<glGetBooleanIndexedvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetBooleani_v> {};\ntemplate<>\nstruct fex_gen_config<glGetBooleanv> {};\ntemplate<>\nstruct fex_gen_config<glGetBufferParameteri64v> {};\ntemplate<>\nstruct fex_gen_config<glGetBufferParameterivARB> {};\ntemplate<>\nstruct fex_gen_config<glGetBufferParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetBufferParameterui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glGetBufferPointerv> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glGetBufferPointerv, 2, void**> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glGetBufferPointervARB> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glGetBufferPointervARB, 2, void**> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glGetBufferSubDataARB> {};\ntemplate<>\nstruct fex_gen_config<glGetBufferSubData> {};\ntemplate<>\nstruct fex_gen_config<glGetClipPlanefOES> {};\ntemplate<>\nstruct fex_gen_config<glGetClipPlane> {};\ntemplate<>\nstruct fex_gen_config<glGetClipPlanexOES> {};\ntemplate<>\nstruct fex_gen_config<glGetColorTableEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetColorTable> {};\ntemplate<>\nstruct fex_gen_config<glGetColorTableParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetColorTableParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glGetColorTableParameterfvSGI> {};\ntemplate<>\nstruct fex_gen_config<glGetColorTableParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetColorTableParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetColorTableParameterivSGI> {};\ntemplate<>\nstruct fex_gen_config<glGetColorTableSGI> {};\ntemplate<>\nstruct fex_gen_config<glGetCombinerInputParameterfvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetCombinerInputParameterivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetCombinerOutputParameterfvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetCombinerOutputParameterivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetCombinerStageParameterfvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetCompressedMultiTexImageEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetCompressedTexImageARB> {};\ntemplate<>\nstruct fex_gen_config<glGetCompressedTexImage> {};\ntemplate<>\nstruct fex_gen_config<glGetCompressedTextureImageEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetCompressedTextureImage> {};\ntemplate<>\nstruct fex_gen_config<glGetCompressedTextureSubImage> {};\ntemplate<>\nstruct fex_gen_config<glGetConvolutionFilterEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetConvolutionFilter> {};\ntemplate<>\nstruct fex_gen_config<glGetConvolutionParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetConvolutionParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glGetConvolutionParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetConvolutionParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetConvolutionParameterxvOES> {};\ntemplate<>\nstruct fex_gen_config<glGetCoverageModulationTableNV> {};\ntemplate<>\nstruct fex_gen_config<glGetDetailTexFuncSGIS> {};\ntemplate<>\nstruct fex_gen_config<glGetDoubleIndexedvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetDoublei_vEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetDoublei_v> {};\ntemplate<>\nstruct fex_gen_config<glGetDoublev> {};\ntemplate<>\nstruct fex_gen_config<glGetFenceivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetFinalCombinerInputParameterfvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetFinalCombinerInputParameterivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetFirstPerfQueryIdINTEL> {};\ntemplate<>\nstruct fex_gen_config<glGetFixedvOES> {};\ntemplate<>\nstruct fex_gen_config<glGetFloatIndexedvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetFloati_vEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetFloati_v> {};\ntemplate<>\nstruct fex_gen_config<glGetFloatv> {};\ntemplate<>\nstruct fex_gen_config<glGetFogFuncSGIS> {};\ntemplate<>\nstruct fex_gen_config<glGetFragmentLightfvSGIX> {};\ntemplate<>\nstruct fex_gen_config<glGetFragmentLightivSGIX> {};\ntemplate<>\nstruct fex_gen_config<glGetFragmentMaterialfvSGIX> {};\ntemplate<>\nstruct fex_gen_config<glGetFragmentMaterialivSGIX> {};\ntemplate<>\nstruct fex_gen_config<glGetFramebufferAttachmentParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetFramebufferAttachmentParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetFramebufferParameterfvAMD> {};\ntemplate<>\nstruct fex_gen_config<glGetFramebufferParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetFramebufferParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetFramebufferParameterivMESA> {};\ntemplate<>\nstruct fex_gen_config<glGetHistogramEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetHistogram> {};\ntemplate<>\nstruct fex_gen_config<glGetHistogramParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetHistogramParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glGetHistogramParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetHistogramParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetHistogramParameterxvOES> {};\ntemplate<>\nstruct fex_gen_config<glGetImageTransformParameterfvHP> {};\ntemplate<>\nstruct fex_gen_config<glGetImageTransformParameterivHP> {};\ntemplate<>\nstruct fex_gen_config<glGetInfoLogARB> {};\ntemplate<>\nstruct fex_gen_config<glGetInteger64i_v> {};\ntemplate<>\nstruct fex_gen_config<glGetInteger64v> {};\ntemplate<>\nstruct fex_gen_config<glGetIntegerIndexedvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetIntegeri_v> {};\ntemplate<>\nstruct fex_gen_config<glGetIntegerui64i_vNV> {};\ntemplate<>\nstruct fex_gen_config<glGetIntegerui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glGetIntegerv> {};\ntemplate<>\nstruct fex_gen_config<glGetInternalformati64v> {};\ntemplate<>\nstruct fex_gen_config<glGetInternalformativ> {};\ntemplate<>\nstruct fex_gen_config<glGetInternalformatSampleivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetInvariantBooleanvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetInvariantFloatvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetInvariantIntegervEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetLightfv> {};\ntemplate<>\nstruct fex_gen_config<glGetLightiv> {};\ntemplate<>\nstruct fex_gen_config<glGetLightxOES> {};\ntemplate<>\nstruct fex_gen_config<glGetListParameterfvSGIX> {};\ntemplate<>\nstruct fex_gen_config<glGetListParameterivSGIX> {};\ntemplate<>\nstruct fex_gen_config<glGetLocalConstantBooleanvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetLocalConstantFloatvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetLocalConstantIntegervEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMapAttribParameterfvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetMapAttribParameterivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetMapControlPointsNV> {};\ntemplate<>\nstruct fex_gen_config<glGetMapdv> {};\ntemplate<>\nstruct fex_gen_config<glGetMapfv> {};\ntemplate<>\nstruct fex_gen_config<glGetMapiv> {};\ntemplate<>\nstruct fex_gen_config<glGetMapParameterfvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetMapParameterivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetMapxvOES> {};\ntemplate<>\nstruct fex_gen_config<glGetMaterialfv> {};\ntemplate<>\nstruct fex_gen_config<glGetMaterialiv> {};\ntemplate<>\nstruct fex_gen_config<glGetMaterialxOES> {};\ntemplate<>\nstruct fex_gen_config<glGetMemoryObjectDetachedResourcesuivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetMemoryObjectParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMinmaxEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMinmax> {};\ntemplate<>\nstruct fex_gen_config<glGetMinmaxParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMinmaxParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glGetMinmaxParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMinmaxParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetMultisamplefv> {};\ntemplate<>\nstruct fex_gen_config<glGetMultisamplefvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetMultiTexEnvfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMultiTexEnvivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMultiTexGendvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMultiTexGenfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMultiTexGenivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMultiTexImageEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMultiTexLevelParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMultiTexLevelParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMultiTexParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMultiTexParameterIivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMultiTexParameterIuivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetMultiTexParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedBufferParameteri64v> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedBufferParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedBufferParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedBufferParameterui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedBufferPointerv> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glGetNamedBufferPointerv, 2, void**> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glGetNamedBufferPointervEXT> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glGetNamedBufferPointervEXT, 2, void**> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glGetNamedBufferSubDataEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedBufferSubData> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedFramebufferAttachmentParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedFramebufferAttachmentParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedFramebufferParameterfvAMD> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedFramebufferParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedFramebufferParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedProgramivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedProgramLocalParameterdvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedProgramLocalParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedProgramLocalParameterIivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedProgramLocalParameterIuivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedProgramStringEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedRenderbufferParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedRenderbufferParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedStringARB> {};\ntemplate<>\nstruct fex_gen_config<glGetNamedStringivARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnCompressedTexImageARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnCompressedTexImage> {};\ntemplate<>\nstruct fex_gen_config<glGetNextPerfQueryIdINTEL> {};\ntemplate<>\nstruct fex_gen_config<glGetnTexImageARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnTexImage> {};\ntemplate<>\nstruct fex_gen_config<glGetnUniformdvARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnUniformdv> {};\ntemplate<>\nstruct fex_gen_config<glGetnUniformfvARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnUniformfv> {};\ntemplate<>\nstruct fex_gen_config<glGetnUniformi64vARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnUniformivARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnUniformiv> {};\ntemplate<>\nstruct fex_gen_config<glGetnUniformui64vARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnUniformuivARB> {};\ntemplate<>\nstruct fex_gen_config<glGetnUniformuiv> {};\ntemplate<>\nstruct fex_gen_config<glGetObjectBufferfvATI> {};\ntemplate<>\nstruct fex_gen_config<glGetObjectBufferivATI> {};\ntemplate<>\nstruct fex_gen_config<glGetObjectLabelEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetObjectLabel> {};\ntemplate<>\nstruct fex_gen_config<glGetObjectParameterfvARB> {};\ntemplate<>\nstruct fex_gen_config<glGetObjectParameterivAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glGetObjectParameterivARB> {};\ntemplate<>\nstruct fex_gen_config<glGetObjectPtrLabel> {};\ntemplate<>\nstruct fex_gen_config<glGetOcclusionQueryivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetOcclusionQueryuivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetPathCommandsNV> {};\ntemplate<>\nstruct fex_gen_config<glGetPathCoordsNV> {};\ntemplate<>\nstruct fex_gen_config<glGetPathDashArrayNV> {};\ntemplate<>\nstruct fex_gen_config<glGetPathMetricRangeNV> {};\ntemplate<>\nstruct fex_gen_config<glGetPathMetricsNV> {};\ntemplate<>\nstruct fex_gen_config<glGetPathParameterfvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetPathParameterivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetPathSpacingNV> {};\ntemplate<>\nstruct fex_gen_config<glGetPerfCounterInfoINTEL> {};\ntemplate<>\nstruct fex_gen_config<glGetPerfMonitorCounterDataAMD> {};\ntemplate<>\nstruct fex_gen_config<glGetPerfMonitorCounterInfoAMD> {};\ntemplate<>\nstruct fex_gen_config<glGetPerfMonitorCountersAMD> {};\ntemplate<>\nstruct fex_gen_config<glGetPerfMonitorCounterStringAMD> {};\ntemplate<>\nstruct fex_gen_config<glGetPerfMonitorGroupsAMD> {};\ntemplate<>\nstruct fex_gen_config<glGetPerfMonitorGroupStringAMD> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glGetPerfQueryDataINTEL> {};\n#endif\ntemplate<>\nstruct fex_gen_config<glGetPerfQueryIdByNameINTEL> {};\ntemplate<>\nstruct fex_gen_config<glGetPerfQueryInfoINTEL> {};\ntemplate<>\nstruct fex_gen_config<glGetPixelMapfv> {};\ntemplate<>\nstruct fex_gen_config<glGetPixelMapuiv> {};\ntemplate<>\nstruct fex_gen_config<glGetPixelMapusv> {};\ntemplate<>\nstruct fex_gen_config<glGetPixelMapxv> {};\ntemplate<>\nstruct fex_gen_config<glGetPixelTexGenParameterfvSGIS> {};\ntemplate<>\nstruct fex_gen_config<glGetPixelTexGenParameterivSGIS> {};\ntemplate<>\nstruct fex_gen_config<glGetPixelTransformParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetPixelTransformParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetPointerv> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glGetPointerv, 1, void**> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glGetPointervEXT> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glGetPointervEXT, 1, void**> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glGetPointeri_vEXT> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glGetPointeri_vEXT, 2, void**> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glGetPointerIndexedvEXT> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glGetPointerIndexedvEXT, 2, void**> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glGetPolygonStipple> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramBinary> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramEnvParameterdvARB> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramEnvParameterfvARB> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramEnvParameterIivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramEnvParameterIuivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramInfoLog> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramInterfaceiv> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramivARB> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramiv> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramLocalParameterdvARB> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramLocalParameterfvARB> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramLocalParameterIivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramLocalParameterIuivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramNamedParameterdvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramNamedParameterfvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramParameterdvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramParameterfvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramPipelineInfoLog> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramPipelineiv> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramResourcefvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramResourceiv> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramResourceName> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramStageiv> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramStringARB> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramStringNV> {};\ntemplate<>\nstruct fex_gen_config<glGetProgramSubroutineParameteruivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetQueryBufferObjecti64v> {};\ntemplate<>\nstruct fex_gen_config<glGetQueryBufferObjectiv> {};\ntemplate<>\nstruct fex_gen_config<glGetQueryBufferObjectui64v> {};\ntemplate<>\nstruct fex_gen_config<glGetQueryBufferObjectuiv> {};\ntemplate<>\nstruct fex_gen_config<glGetQueryIndexediv> {};\ntemplate<>\nstruct fex_gen_config<glGetQueryivARB> {};\ntemplate<>\nstruct fex_gen_config<glGetQueryiv> {};\ntemplate<>\nstruct fex_gen_config<glGetQueryObjecti64vEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetQueryObjecti64v> {};\ntemplate<>\nstruct fex_gen_config<glGetQueryObjectivARB> {};\ntemplate<>\nstruct fex_gen_config<glGetQueryObjectiv> {};\ntemplate<>\nstruct fex_gen_config<glGetQueryObjectui64vEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetQueryObjectui64v> {};\ntemplate<>\nstruct fex_gen_config<glGetQueryObjectuivARB> {};\ntemplate<>\nstruct fex_gen_config<glGetQueryObjectuiv> {};\ntemplate<>\nstruct fex_gen_config<glGetRenderbufferParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetRenderbufferParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetSamplerParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glGetSamplerParameterIiv> {};\ntemplate<>\nstruct fex_gen_config<glGetSamplerParameterIuiv> {};\ntemplate<>\nstruct fex_gen_config<glGetSamplerParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetSemaphoreParameterui64vEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetSeparableFilterEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetSeparableFilter> {};\ntemplate<>\nstruct fex_gen_config<glGetShaderInfoLog> {};\ntemplate<>\nstruct fex_gen_config<glGetShaderiv> {};\ntemplate<>\nstruct fex_gen_config<glGetShaderPrecisionFormat> {};\ntemplate<>\nstruct fex_gen_config<glGetShaderSourceARB> {};\ntemplate<>\nstruct fex_gen_config<glGetShaderSource> {};\ntemplate<>\nstruct fex_gen_config<glGetShadingRateImagePaletteNV> {};\ntemplate<>\nstruct fex_gen_config<glGetShadingRateSampleLocationivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetSharpenTexFuncSGIS> {};\ntemplate<>\nstruct fex_gen_config<glGetSynciv> {};\ntemplate<>\nstruct fex_gen_config<glGetTexBumpParameterfvATI> {};\ntemplate<>\nstruct fex_gen_config<glGetTexBumpParameterivATI> {};\ntemplate<>\nstruct fex_gen_config<glGetTexEnvfv> {};\ntemplate<>\nstruct fex_gen_config<glGetTexEnviv> {};\ntemplate<>\nstruct fex_gen_config<glGetTexEnvxvOES> {};\ntemplate<>\nstruct fex_gen_config<glGetTexFilterFuncSGIS> {};\ntemplate<>\nstruct fex_gen_config<glGetTexGendv> {};\ntemplate<>\nstruct fex_gen_config<glGetTexGenfv> {};\ntemplate<>\nstruct fex_gen_config<glGetTexGeniv> {};\ntemplate<>\nstruct fex_gen_config<glGetTexGenxvOES> {};\ntemplate<>\nstruct fex_gen_config<glGetTexImage> {};\ntemplate<>\nstruct fex_gen_config<glGetTexLevelParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glGetTexLevelParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetTexLevelParameterxvOES> {};\ntemplate<>\nstruct fex_gen_config<glGetTexParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glGetTexParameterIivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetTexParameterIiv> {};\ntemplate<>\nstruct fex_gen_config<glGetTexParameterIuivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetTexParameterIuiv> {};\ntemplate<>\nstruct fex_gen_config<glGetTexParameteriv> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glGetTexParameterPointervAPPLE> {};\ntemplate<>\nstruct fex_gen_param<glGetTexParameterPointervAPPLE, 2, void**> : fexgen::assume_compatible_data_layout {};\n#endif\ntemplate<>\nstruct fex_gen_config<glGetTexParameterxvOES> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureImageEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureImage> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureLevelParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureLevelParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureLevelParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureLevelParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureParameterIivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureParameterIiv> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureParameterIuivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureParameterIuiv> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glGetTextureSubImage> {};\ntemplate<>\nstruct fex_gen_config<glGetTrackMatrixivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetTransformFeedbacki64_v> {};\ntemplate<>\nstruct fex_gen_config<glGetTransformFeedbackiv> {};\ntemplate<>\nstruct fex_gen_config<glGetTransformFeedbacki_v> {};\ntemplate<>\nstruct fex_gen_config<glGetTransformFeedbackVaryingEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetTransformFeedbackVarying> {};\ntemplate<>\nstruct fex_gen_config<glGetTransformFeedbackVaryingNV> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformdv> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformfvARB> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformfv> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformi64vARB> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformi64vNV> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<glGetUniformIndices> {};\ntemplate<>\nstruct fex_gen_param<glGetUniformIndices, 2, const char* const*> : fexgen::assume_compatible_data_layout {};\n#else\ntemplate<>\nstruct fex_gen_config<glGetUniformIndices> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glGetUniformIndices, 2, const char* const*> : fexgen::ptr_passthrough {};\n#endif\ntemplate<>\nstruct fex_gen_config<glGetUniformivARB> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformiv> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformSubroutineuiv> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformui64vARB> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformuivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetUniformuiv> {};\ntemplate<>\nstruct fex_gen_config<glGetUnsignedBytei_vEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetUnsignedBytevEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetVariantArrayObjectfvATI> {};\ntemplate<>\nstruct fex_gen_config<glGetVariantArrayObjectivATI> {};\ntemplate<>\nstruct fex_gen_config<glGetVariantBooleanvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetVariantFloatvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetVariantIntegervEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetVariantPointervEXT> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glGetVariantPointervEXT, 2, void**> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glGetVertexArrayIndexed64iv> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexArrayIndexediv> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexArrayIntegeri_vEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexArrayIntegervEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexArrayiv> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexArrayPointeri_vEXT> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glGetVertexArrayPointeri_vEXT, 3, void**> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glGetVertexArrayPointervEXT> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glGetVertexArrayPointervEXT, 2, void**> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribArrayObjectfvATI> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribArrayObjectivATI> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribdvARB> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribdv> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribdvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribfvARB> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribfv> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribfvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribIivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribIiv> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribIuivEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribIuiv> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribivARB> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribiv> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribLdvEXT> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribLdv> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribLi64vNV> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribLui64vARB> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribLui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribPointervARB> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glGetVertexAttribPointervARB, 2, void**> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribPointerv> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glGetVertexAttribPointerv, 2, void**> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glGetVertexAttribPointervNV> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glGetVertexAttribPointervNV, 2, void**> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glGetVideoCaptureivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetVideoCaptureStreamdvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetVideoCaptureStreamfvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetVideoCaptureStreamivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetVideoi64vNV> {};\ntemplate<>\nstruct fex_gen_config<glGetVideoivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetVideoui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glGetVideouivNV> {};\ntemplate<>\nstruct fex_gen_config<glGlobalAlphaFactorbSUN> {};\ntemplate<>\nstruct fex_gen_config<glGlobalAlphaFactordSUN> {};\ntemplate<>\nstruct fex_gen_config<glGlobalAlphaFactorfSUN> {};\ntemplate<>\nstruct fex_gen_config<glGlobalAlphaFactoriSUN> {};\ntemplate<>\nstruct fex_gen_config<glGlobalAlphaFactorsSUN> {};\ntemplate<>\nstruct fex_gen_config<glGlobalAlphaFactorubSUN> {};\ntemplate<>\nstruct fex_gen_config<glGlobalAlphaFactoruiSUN> {};\ntemplate<>\nstruct fex_gen_config<glGlobalAlphaFactorusSUN> {};\ntemplate<>\nstruct fex_gen_config<glHint> {};\ntemplate<>\nstruct fex_gen_config<glHintPGI> {};\ntemplate<>\nstruct fex_gen_config<glHistogramEXT> {};\ntemplate<>\nstruct fex_gen_config<glHistogram> {};\ntemplate<>\nstruct fex_gen_config<glIglooInterfaceSGIX> {};\ntemplate<>\nstruct fex_gen_config<glImageTransformParameterfHP> {};\ntemplate<>\nstruct fex_gen_config<glImageTransformParameterfvHP> {};\ntemplate<>\nstruct fex_gen_config<glImageTransformParameteriHP> {};\ntemplate<>\nstruct fex_gen_config<glImageTransformParameterivHP> {};\ntemplate<>\nstruct fex_gen_config<glImportMemoryFdEXT> {};\ntemplate<>\nstruct fex_gen_config<glImportMemoryWin32HandleEXT> {};\ntemplate<>\nstruct fex_gen_config<glImportMemoryWin32NameEXT> {};\ntemplate<>\nstruct fex_gen_config<glImportSemaphoreFdEXT> {};\ntemplate<>\nstruct fex_gen_config<glImportSemaphoreWin32HandleEXT> {};\ntemplate<>\nstruct fex_gen_config<glImportSemaphoreWin32NameEXT> {};\ntemplate<>\nstruct fex_gen_config<glIndexd> {};\ntemplate<>\nstruct fex_gen_config<glIndexdv> {};\ntemplate<>\nstruct fex_gen_config<glIndexf> {};\ntemplate<>\nstruct fex_gen_config<glIndexFormatNV> {};\ntemplate<>\nstruct fex_gen_config<glIndexFuncEXT> {};\ntemplate<>\nstruct fex_gen_config<glIndexfv> {};\ntemplate<>\nstruct fex_gen_config<glIndexi> {};\ntemplate<>\nstruct fex_gen_config<glIndexiv> {};\ntemplate<>\nstruct fex_gen_config<glIndexMask> {};\ntemplate<>\nstruct fex_gen_config<glIndexMaterialEXT> {};\ntemplate<>\nstruct fex_gen_config<glIndexPointerEXT> {};\ntemplate<>\nstruct fex_gen_config<glIndexPointer> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glIndexPointerListIBM> {};\ntemplate<>\nstruct fex_gen_param<glIndexPointerListIBM, 2, const void**> : fexgen::assume_compatible_data_layout {};\n#endif\ntemplate<>\nstruct fex_gen_config<glIndexs> {};\ntemplate<>\nstruct fex_gen_config<glIndexsv> {};\ntemplate<>\nstruct fex_gen_config<glIndexub> {};\ntemplate<>\nstruct fex_gen_config<glIndexubv> {};\ntemplate<>\nstruct fex_gen_config<glIndexxOES> {};\ntemplate<>\nstruct fex_gen_config<glIndexxvOES> {};\ntemplate<>\nstruct fex_gen_config<glInitNames> {};\ntemplate<>\nstruct fex_gen_config<glInsertComponentEXT> {};\ntemplate<>\nstruct fex_gen_config<glInsertEventMarkerEXT> {};\ntemplate<>\nstruct fex_gen_config<glInstrumentsBufferSGIX> {};\ntemplate<>\nstruct fex_gen_config<glInterleavedArrays> {};\ntemplate<>\nstruct fex_gen_config<glInterpolatePathsNV> {};\ntemplate<>\nstruct fex_gen_config<glInvalidateBufferData> {};\ntemplate<>\nstruct fex_gen_config<glInvalidateBufferSubData> {};\ntemplate<>\nstruct fex_gen_config<glInvalidateFramebuffer> {};\ntemplate<>\nstruct fex_gen_config<glInvalidateNamedFramebufferData> {};\ntemplate<>\nstruct fex_gen_config<glInvalidateNamedFramebufferSubData> {};\ntemplate<>\nstruct fex_gen_config<glInvalidateSubFramebuffer> {};\ntemplate<>\nstruct fex_gen_config<glInvalidateTexImage> {};\ntemplate<>\nstruct fex_gen_config<glInvalidateTexSubImage> {};\ntemplate<>\nstruct fex_gen_config<glLabelObjectEXT> {};\ntemplate<>\nstruct fex_gen_config<glLGPUCopyImageSubDataNVX> {};\ntemplate<>\nstruct fex_gen_config<glLGPUInterlockNVX> {};\ntemplate<>\nstruct fex_gen_config<glLGPUNamedBufferSubDataNVX> {};\ntemplate<>\nstruct fex_gen_config<glLightEnviSGIX> {};\ntemplate<>\nstruct fex_gen_config<glLightf> {};\ntemplate<>\nstruct fex_gen_config<glLightfv> {};\ntemplate<>\nstruct fex_gen_config<glLighti> {};\ntemplate<>\nstruct fex_gen_config<glLightiv> {};\ntemplate<>\nstruct fex_gen_config<glLightModelf> {};\ntemplate<>\nstruct fex_gen_config<glLightModelfv> {};\ntemplate<>\nstruct fex_gen_config<glLightModeli> {};\ntemplate<>\nstruct fex_gen_config<glLightModeliv> {};\ntemplate<>\nstruct fex_gen_config<glLightModelxOES> {};\ntemplate<>\nstruct fex_gen_config<glLightModelxvOES> {};\ntemplate<>\nstruct fex_gen_config<glLightxOES> {};\ntemplate<>\nstruct fex_gen_config<glLightxvOES> {};\ntemplate<>\nstruct fex_gen_config<glLineStipple> {};\ntemplate<>\nstruct fex_gen_config<glLineWidth> {};\ntemplate<>\nstruct fex_gen_config<glLineWidthxOES> {};\ntemplate<>\nstruct fex_gen_config<glLinkProgramARB> {};\ntemplate<>\nstruct fex_gen_config<glLinkProgram> {};\ntemplate<>\nstruct fex_gen_config<glListBase> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glListDrawCommandsStatesClientNV> {};\ntemplate<>\nstruct fex_gen_param<glListDrawCommandsStatesClientNV, 2, const void**> : fexgen::assume_compatible_data_layout {};\n#endif\ntemplate<>\nstruct fex_gen_config<glListParameterfSGIX> {};\ntemplate<>\nstruct fex_gen_config<glListParameterfvSGIX> {};\ntemplate<>\nstruct fex_gen_config<glListParameteriSGIX> {};\ntemplate<>\nstruct fex_gen_config<glListParameterivSGIX> {};\ntemplate<>\nstruct fex_gen_config<glLoadIdentity> {};\ntemplate<>\nstruct fex_gen_config<glLoadIdentityDeformationMapSGIX> {};\ntemplate<>\nstruct fex_gen_config<glLoadMatrixd> {};\ntemplate<>\nstruct fex_gen_config<glLoadMatrixf> {};\ntemplate<>\nstruct fex_gen_config<glLoadMatrixxOES> {};\ntemplate<>\nstruct fex_gen_config<glLoadName> {};\ntemplate<>\nstruct fex_gen_config<glLoadProgramNV> {};\ntemplate<>\nstruct fex_gen_config<glLoadTransposeMatrixdARB> {};\ntemplate<>\nstruct fex_gen_config<glLoadTransposeMatrixd> {};\ntemplate<>\nstruct fex_gen_config<glLoadTransposeMatrixfARB> {};\ntemplate<>\nstruct fex_gen_config<glLoadTransposeMatrixf> {};\ntemplate<>\nstruct fex_gen_config<glLoadTransposeMatrixxOES> {};\ntemplate<>\nstruct fex_gen_config<glLockArraysEXT> {};\ntemplate<>\nstruct fex_gen_config<glLogicOp> {};\ntemplate<>\nstruct fex_gen_config<glMakeBufferNonResidentNV> {};\ntemplate<>\nstruct fex_gen_config<glMakeBufferResidentNV> {};\ntemplate<>\nstruct fex_gen_config<glMakeImageHandleNonResidentARB> {};\ntemplate<>\nstruct fex_gen_config<glMakeImageHandleNonResidentNV> {};\ntemplate<>\nstruct fex_gen_config<glMakeImageHandleResidentARB> {};\ntemplate<>\nstruct fex_gen_config<glMakeImageHandleResidentNV> {};\ntemplate<>\nstruct fex_gen_config<glMakeNamedBufferNonResidentNV> {};\ntemplate<>\nstruct fex_gen_config<glMakeNamedBufferResidentNV> {};\ntemplate<>\nstruct fex_gen_config<glMakeTextureHandleNonResidentARB> {};\ntemplate<>\nstruct fex_gen_config<glMakeTextureHandleNonResidentNV> {};\ntemplate<>\nstruct fex_gen_config<glMakeTextureHandleResidentARB> {};\ntemplate<>\nstruct fex_gen_config<glMakeTextureHandleResidentNV> {};\ntemplate<>\nstruct fex_gen_config<glMap1d> {};\ntemplate<>\nstruct fex_gen_config<glMap1f> {};\ntemplate<>\nstruct fex_gen_config<glMap1xOES> {};\ntemplate<>\nstruct fex_gen_config<glMap2d> {};\ntemplate<>\nstruct fex_gen_config<glMap2f> {};\ntemplate<>\nstruct fex_gen_config<glMap2xOES> {};\ntemplate<>\nstruct fex_gen_config<glMapBufferARB> {};\ntemplate<>\nstruct fex_gen_config<glMapBuffer> {};\ntemplate<>\nstruct fex_gen_config<glMapBufferRange> {};\ntemplate<>\nstruct fex_gen_config<glMapControlPointsNV> {};\ntemplate<>\nstruct fex_gen_config<glMapGrid1d> {};\ntemplate<>\nstruct fex_gen_config<glMapGrid1f> {};\ntemplate<>\nstruct fex_gen_config<glMapGrid1xOES> {};\ntemplate<>\nstruct fex_gen_config<glMapGrid2d> {};\ntemplate<>\nstruct fex_gen_config<glMapGrid2f> {};\ntemplate<>\nstruct fex_gen_config<glMapGrid2xOES> {};\ntemplate<>\nstruct fex_gen_config<glMapNamedBufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glMapNamedBuffer> {};\ntemplate<>\nstruct fex_gen_config<glMapNamedBufferRangeEXT> {};\ntemplate<>\nstruct fex_gen_config<glMapNamedBufferRange> {};\ntemplate<>\nstruct fex_gen_config<glMapObjectBufferATI> {};\ntemplate<>\nstruct fex_gen_config<glMapParameterfvNV> {};\ntemplate<>\nstruct fex_gen_config<glMapParameterivNV> {};\ntemplate<>\nstruct fex_gen_config<glMapTexture2DINTEL> {};\ntemplate<>\nstruct fex_gen_config<glMapVertexAttrib1dAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glMapVertexAttrib1fAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glMapVertexAttrib2dAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glMapVertexAttrib2fAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glMaterialf> {};\ntemplate<>\nstruct fex_gen_config<glMaterialfv> {};\ntemplate<>\nstruct fex_gen_config<glMateriali> {};\ntemplate<>\nstruct fex_gen_config<glMaterialiv> {};\ntemplate<>\nstruct fex_gen_config<glMaterialxOES> {};\ntemplate<>\nstruct fex_gen_config<glMaterialxvOES> {};\ntemplate<>\nstruct fex_gen_config<glMatrixFrustumEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixIndexPointerARB> {};\ntemplate<>\nstruct fex_gen_config<glMatrixIndexubvARB> {};\ntemplate<>\nstruct fex_gen_config<glMatrixIndexuivARB> {};\ntemplate<>\nstruct fex_gen_config<glMatrixIndexusvARB> {};\ntemplate<>\nstruct fex_gen_config<glMatrixLoad3x2fNV> {};\ntemplate<>\nstruct fex_gen_config<glMatrixLoad3x3fNV> {};\ntemplate<>\nstruct fex_gen_config<glMatrixLoaddEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixLoadfEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixLoadIdentityEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixLoadTranspose3x3fNV> {};\ntemplate<>\nstruct fex_gen_config<glMatrixLoadTransposedEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixLoadTransposefEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixMode> {};\ntemplate<>\nstruct fex_gen_config<glMatrixMult3x2fNV> {};\ntemplate<>\nstruct fex_gen_config<glMatrixMult3x3fNV> {};\ntemplate<>\nstruct fex_gen_config<glMatrixMultdEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixMultfEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixMultTranspose3x3fNV> {};\ntemplate<>\nstruct fex_gen_config<glMatrixMultTransposedEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixMultTransposefEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixOrthoEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixPopEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixPushEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixRotatedEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixRotatefEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixScaledEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixScalefEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixTranslatedEXT> {};\ntemplate<>\nstruct fex_gen_config<glMatrixTranslatefEXT> {};\ntemplate<>\nstruct fex_gen_config<glMaxShaderCompilerThreadsARB> {};\ntemplate<>\nstruct fex_gen_config<glMaxShaderCompilerThreadsKHR> {};\ntemplate<>\nstruct fex_gen_config<glMemoryBarrierByRegion> {};\ntemplate<>\nstruct fex_gen_config<glMemoryBarrierEXT> {};\ntemplate<>\nstruct fex_gen_config<glMemoryBarrier> {};\ntemplate<>\nstruct fex_gen_config<glMemoryObjectParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glMinmaxEXT> {};\ntemplate<>\nstruct fex_gen_config<glMinmax> {};\ntemplate<>\nstruct fex_gen_config<glMinSampleShadingARB> {};\ntemplate<>\nstruct fex_gen_config<glMinSampleShading> {};\ntemplate<>\nstruct fex_gen_config<glMulticastBarrierNV> {};\ntemplate<>\nstruct fex_gen_config<glMulticastBlitFramebufferNV> {};\ntemplate<>\nstruct fex_gen_config<glMulticastBufferSubDataNV> {};\ntemplate<>\nstruct fex_gen_config<glMulticastCopyBufferSubDataNV> {};\ntemplate<>\nstruct fex_gen_config<glMulticastCopyImageSubDataNV> {};\ntemplate<>\nstruct fex_gen_config<glMulticastFramebufferSampleLocationsfvNV> {};\ntemplate<>\nstruct fex_gen_config<glMulticastGetQueryObjecti64vNV> {};\ntemplate<>\nstruct fex_gen_config<glMulticastGetQueryObjectivNV> {};\ntemplate<>\nstruct fex_gen_config<glMulticastGetQueryObjectui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glMulticastGetQueryObjectuivNV> {};\ntemplate<>\nstruct fex_gen_config<glMulticastScissorArrayvNVX> {};\ntemplate<>\nstruct fex_gen_config<glMulticastViewportArrayvNVX> {};\ntemplate<>\nstruct fex_gen_config<glMulticastViewportPositionWScaleNVX> {};\ntemplate<>\nstruct fex_gen_config<glMulticastWaitSyncNV> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawArraysEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawArrays> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawArraysIndirectAMD> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawArraysIndirectBindlessCountNV> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawArraysIndirectBindlessNV> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawArraysIndirectCountARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawArraysIndirectCount> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawArraysIndirect> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawElementArrayAPPLE> {};\n#ifndef IS_32BIT_THUNK\n// Needs manual handling: The type of this is actually int8_t**, int16_t**, or int32_t**, depending on the \"type\" argument\n// TODO: Do these values get copied or do they have to stay valid past the call?\ntemplate<>\nstruct fex_gen_config<glMultiDrawElementsBaseVertex> {};\ntemplate<>\nstruct fex_gen_param<glMultiDrawElementsBaseVertex, 3, const void* const*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawElementsEXT> {};\ntemplate<>\nstruct fex_gen_param<glMultiDrawElementsEXT, 3, const void* const*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawElements> {};\ntemplate<>\nstruct fex_gen_param<glMultiDrawElements, 3, const void* const*> : fexgen::assume_compatible_data_layout {};\n#endif\ntemplate<>\nstruct fex_gen_config<glMultiDrawElementsIndirectAMD> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawElementsIndirectBindlessCountNV> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawElementsIndirectBindlessNV> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawElementsIndirectCountARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawElementsIndirectCount> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawElementsIndirect> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawMeshTasksIndirectCountNV> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawMeshTasksIndirectNV> {};\ntemplate<>\nstruct fex_gen_config<glMultiDrawRangeElementArrayAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glMultiModeDrawArraysIBM> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glMultiModeDrawElementsIBM> {};\ntemplate<>\nstruct fex_gen_param<glMultiModeDrawElementsIBM, 3, const void* const*> : fexgen::assume_compatible_data_layout {};\n#endif\ntemplate<>\nstruct fex_gen_config<glMultiTexBufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1bOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1bvOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1dARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1d> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1dvARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1dv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1fARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1f> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1fvARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1fv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1hNV> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1hvNV> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1iARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1i> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1ivARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1iv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1sARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1s> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1svARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1sv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1xOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord1xvOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2bOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2bvOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2dARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2d> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2dvARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2dv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2fARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2f> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2fvARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2fv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2hNV> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2hvNV> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2iARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2i> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2ivARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2iv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2sARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2s> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2svARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2sv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2xOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord2xvOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3bOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3bvOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3dARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3d> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3dvARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3dv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3fARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3f> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3fvARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3fv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3hNV> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3hvNV> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3iARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3i> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3ivARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3iv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3sARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3s> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3svARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3sv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3xOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord3xvOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4bOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4bvOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4dARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4d> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4dvARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4dv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4fARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4f> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4fvARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4fv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4hNV> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4hvNV> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4iARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4i> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4ivARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4iv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4sARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4s> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4svARB> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4sv> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4xOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoord4xvOES> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexCoordPointerEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexEnvfEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexEnvfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexEnviEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexEnvivEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexGendEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexGendvEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexGenfEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexGenfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexGeniEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexGenivEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexImage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexImage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexImage3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexParameterfEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexParameteriEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexParameterIivEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexParameterIuivEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexRenderbufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexSubImage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexSubImage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultiTexSubImage3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glMultMatrixd> {};\ntemplate<>\nstruct fex_gen_config<glMultMatrixf> {};\ntemplate<>\nstruct fex_gen_config<glMultMatrixxOES> {};\ntemplate<>\nstruct fex_gen_config<glMultTransposeMatrixdARB> {};\ntemplate<>\nstruct fex_gen_config<glMultTransposeMatrixd> {};\ntemplate<>\nstruct fex_gen_config<glMultTransposeMatrixfARB> {};\ntemplate<>\nstruct fex_gen_config<glMultTransposeMatrixf> {};\ntemplate<>\nstruct fex_gen_config<glMultTransposeMatrixxOES> {};\ntemplate<>\nstruct fex_gen_config<glNamedBufferAttachMemoryNV> {};\ntemplate<>\nstruct fex_gen_config<glNamedBufferDataEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedBufferData> {};\ntemplate<>\nstruct fex_gen_config<glNamedBufferPageCommitmentARB> {};\ntemplate<>\nstruct fex_gen_config<glNamedBufferPageCommitmentEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedBufferStorageExternalEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedBufferStorageEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedBufferStorage> {};\ntemplate<>\nstruct fex_gen_config<glNamedBufferStorageMemEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedBufferSubDataEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedBufferSubData> {};\ntemplate<>\nstruct fex_gen_config<glNamedCopyBufferSubDataEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferDrawBuffer> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferDrawBuffers> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferParameteriEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferParameteri> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferReadBuffer> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferRenderbufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferRenderbuffer> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferSampleLocationsfvARB> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferSampleLocationsfvNV> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferSamplePositionsfvAMD> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferTexture1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferTexture2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferTexture3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferTextureEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferTextureFaceEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferTexture> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferTextureLayerEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedFramebufferTextureLayer> {};\ntemplate<>\nstruct fex_gen_config<glNamedProgramLocalParameter4dEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedProgramLocalParameter4dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedProgramLocalParameter4fEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedProgramLocalParameter4fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedProgramLocalParameterI4iEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedProgramLocalParameterI4ivEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedProgramLocalParameterI4uiEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedProgramLocalParameterI4uivEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedProgramLocalParameters4fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedProgramLocalParametersI4ivEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedProgramLocalParametersI4uivEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedProgramStringEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedRenderbufferStorageEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedRenderbufferStorage> {};\ntemplate<>\nstruct fex_gen_config<glNamedRenderbufferStorageMultisampleAdvancedAMD> {};\ntemplate<>\nstruct fex_gen_config<glNamedRenderbufferStorageMultisampleCoverageEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedRenderbufferStorageMultisampleEXT> {};\ntemplate<>\nstruct fex_gen_config<glNamedRenderbufferStorageMultisample> {};\ntemplate<>\nstruct fex_gen_config<glNamedStringARB> {};\ntemplate<>\nstruct fex_gen_config<glNewList> {};\ntemplate<>\nstruct fex_gen_config<glNormal3b> {};\ntemplate<>\nstruct fex_gen_config<glNormal3bv> {};\ntemplate<>\nstruct fex_gen_config<glNormal3d> {};\ntemplate<>\nstruct fex_gen_config<glNormal3dv> {};\ntemplate<>\nstruct fex_gen_config<glNormal3f> {};\ntemplate<>\nstruct fex_gen_config<glNormal3fv> {};\ntemplate<>\nstruct fex_gen_config<glNormal3fVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glNormal3fVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glNormal3hNV> {};\ntemplate<>\nstruct fex_gen_config<glNormal3hvNV> {};\ntemplate<>\nstruct fex_gen_config<glNormal3i> {};\ntemplate<>\nstruct fex_gen_config<glNormal3iv> {};\ntemplate<>\nstruct fex_gen_config<glNormal3s> {};\ntemplate<>\nstruct fex_gen_config<glNormal3sv> {};\ntemplate<>\nstruct fex_gen_config<glNormal3xOES> {};\ntemplate<>\nstruct fex_gen_config<glNormal3xvOES> {};\ntemplate<>\nstruct fex_gen_config<glNormalFormatNV> {};\ntemplate<>\nstruct fex_gen_config<glNormalPointerEXT> {};\ntemplate<>\nstruct fex_gen_config<glNormalPointer> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glNormalPointerListIBM> {};\ntemplate<>\nstruct fex_gen_param<glNormalPointerListIBM, 2, const void**> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<glNormalPointervINTEL> {};\ntemplate<>\nstruct fex_gen_param<glNormalPointervINTEL, 1, const void**> : fexgen::assume_compatible_data_layout {};\n#endif\ntemplate<>\nstruct fex_gen_config<glNormalStream3bATI> {};\ntemplate<>\nstruct fex_gen_config<glNormalStream3bvATI> {};\ntemplate<>\nstruct fex_gen_config<glNormalStream3dATI> {};\ntemplate<>\nstruct fex_gen_config<glNormalStream3dvATI> {};\ntemplate<>\nstruct fex_gen_config<glNormalStream3fATI> {};\ntemplate<>\nstruct fex_gen_config<glNormalStream3fvATI> {};\ntemplate<>\nstruct fex_gen_config<glNormalStream3iATI> {};\ntemplate<>\nstruct fex_gen_config<glNormalStream3ivATI> {};\ntemplate<>\nstruct fex_gen_config<glNormalStream3sATI> {};\ntemplate<>\nstruct fex_gen_config<glNormalStream3svATI> {};\ntemplate<>\nstruct fex_gen_config<glObjectLabel> {};\ntemplate<>\nstruct fex_gen_config<glObjectPtrLabel> {};\ntemplate<>\nstruct fex_gen_config<glOrthofOES> {};\ntemplate<>\nstruct fex_gen_config<glOrtho> {};\ntemplate<>\nstruct fex_gen_config<glOrthoxOES> {};\ntemplate<>\nstruct fex_gen_config<glPassTexCoordATI> {};\ntemplate<>\nstruct fex_gen_config<glPassThrough> {};\ntemplate<>\nstruct fex_gen_config<glPassThroughxOES> {};\ntemplate<>\nstruct fex_gen_config<glPatchParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glPatchParameteri> {};\ntemplate<>\nstruct fex_gen_config<glPathCommandsNV> {};\ntemplate<>\nstruct fex_gen_config<glPathCoordsNV> {};\ntemplate<>\nstruct fex_gen_config<glPathCoverDepthFuncNV> {};\ntemplate<>\nstruct fex_gen_config<glPathDashArrayNV> {};\ntemplate<>\nstruct fex_gen_config<glPathGlyphRangeNV> {};\ntemplate<>\nstruct fex_gen_config<glPathGlyphsNV> {};\ntemplate<>\nstruct fex_gen_config<glPathParameterfNV> {};\ntemplate<>\nstruct fex_gen_config<glPathParameterfvNV> {};\ntemplate<>\nstruct fex_gen_config<glPathParameteriNV> {};\ntemplate<>\nstruct fex_gen_config<glPathParameterivNV> {};\ntemplate<>\nstruct fex_gen_config<glPathStencilDepthOffsetNV> {};\ntemplate<>\nstruct fex_gen_config<glPathStencilFuncNV> {};\ntemplate<>\nstruct fex_gen_config<glPathStringNV> {};\ntemplate<>\nstruct fex_gen_config<glPathSubCommandsNV> {};\ntemplate<>\nstruct fex_gen_config<glPathSubCoordsNV> {};\ntemplate<>\nstruct fex_gen_config<glPauseTransformFeedback> {};\ntemplate<>\nstruct fex_gen_config<glPauseTransformFeedbackNV> {};\ntemplate<>\nstruct fex_gen_config<glPixelDataRangeNV> {};\ntemplate<>\nstruct fex_gen_config<glPixelMapfv> {};\ntemplate<>\nstruct fex_gen_config<glPixelMapuiv> {};\ntemplate<>\nstruct fex_gen_config<glPixelMapusv> {};\ntemplate<>\nstruct fex_gen_config<glPixelMapx> {};\ntemplate<>\nstruct fex_gen_config<glPixelStoref> {};\ntemplate<>\nstruct fex_gen_config<glPixelStorei> {};\ntemplate<>\nstruct fex_gen_config<glPixelStorex> {};\ntemplate<>\nstruct fex_gen_config<glPixelTexGenParameterfSGIS> {};\ntemplate<>\nstruct fex_gen_config<glPixelTexGenParameterfvSGIS> {};\ntemplate<>\nstruct fex_gen_config<glPixelTexGenParameteriSGIS> {};\ntemplate<>\nstruct fex_gen_config<glPixelTexGenParameterivSGIS> {};\ntemplate<>\nstruct fex_gen_config<glPixelTexGenSGIX> {};\ntemplate<>\nstruct fex_gen_config<glPixelTransferf> {};\ntemplate<>\nstruct fex_gen_config<glPixelTransferi> {};\ntemplate<>\nstruct fex_gen_config<glPixelTransferxOES> {};\ntemplate<>\nstruct fex_gen_config<glPixelTransformParameterfEXT> {};\ntemplate<>\nstruct fex_gen_config<glPixelTransformParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glPixelTransformParameteriEXT> {};\ntemplate<>\nstruct fex_gen_config<glPixelTransformParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glPixelZoom> {};\ntemplate<>\nstruct fex_gen_config<glPixelZoomxOES> {};\ntemplate<>\nstruct fex_gen_config<glPNTrianglesfATI> {};\ntemplate<>\nstruct fex_gen_config<glPNTrianglesiATI> {};\ntemplate<>\nstruct fex_gen_config<glPointParameterfARB> {};\ntemplate<>\nstruct fex_gen_config<glPointParameterfEXT> {};\ntemplate<>\nstruct fex_gen_config<glPointParameterf> {};\ntemplate<>\nstruct fex_gen_config<glPointParameterfSGIS> {};\ntemplate<>\nstruct fex_gen_config<glPointParameterfvARB> {};\ntemplate<>\nstruct fex_gen_config<glPointParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glPointParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glPointParameterfvSGIS> {};\ntemplate<>\nstruct fex_gen_config<glPointParameteri> {};\ntemplate<>\nstruct fex_gen_config<glPointParameteriNV> {};\ntemplate<>\nstruct fex_gen_config<glPointParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glPointParameterivNV> {};\ntemplate<>\nstruct fex_gen_config<glPointParameterxvOES> {};\ntemplate<>\nstruct fex_gen_config<glPointSize> {};\ntemplate<>\nstruct fex_gen_config<glPointSizexOES> {};\ntemplate<>\nstruct fex_gen_config<glPolygonMode> {};\ntemplate<>\nstruct fex_gen_config<glPolygonOffsetClampEXT> {};\ntemplate<>\nstruct fex_gen_config<glPolygonOffsetClamp> {};\ntemplate<>\nstruct fex_gen_config<glPolygonOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<glPolygonOffset> {};\ntemplate<>\nstruct fex_gen_config<glPolygonOffsetxOES> {};\ntemplate<>\nstruct fex_gen_config<glPolygonStipple> {};\ntemplate<>\nstruct fex_gen_config<glPopAttrib> {};\ntemplate<>\nstruct fex_gen_config<glPopClientAttrib> {};\ntemplate<>\nstruct fex_gen_config<glPopDebugGroup> {};\ntemplate<>\nstruct fex_gen_config<glPopGroupMarkerEXT> {};\ntemplate<>\nstruct fex_gen_config<glPopMatrix> {};\ntemplate<>\nstruct fex_gen_config<glPopName> {};\ntemplate<>\nstruct fex_gen_config<glPresentFrameDualFillNV> {};\ntemplate<>\nstruct fex_gen_config<glPresentFrameKeyedNV> {};\ntemplate<>\nstruct fex_gen_config<glPrimitiveBoundingBoxARB> {};\ntemplate<>\nstruct fex_gen_config<glPrimitiveRestartIndex> {};\ntemplate<>\nstruct fex_gen_config<glPrimitiveRestartIndexNV> {};\ntemplate<>\nstruct fex_gen_config<glPrimitiveRestartNV> {};\ntemplate<>\nstruct fex_gen_config<glPrioritizeTexturesEXT> {};\ntemplate<>\nstruct fex_gen_config<glPrioritizeTextures> {};\ntemplate<>\nstruct fex_gen_config<glPrioritizeTexturesxOES> {};\ntemplate<>\nstruct fex_gen_config<glProgramBinary> {};\ntemplate<>\nstruct fex_gen_config<glProgramBufferParametersfvNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramBufferParametersIivNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramBufferParametersIuivNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramEnvParameter4dARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramEnvParameter4dvARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramEnvParameter4fARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramEnvParameter4fvARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramEnvParameterI4iNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramEnvParameterI4ivNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramEnvParameterI4uiNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramEnvParameterI4uivNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramEnvParameters4fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramEnvParametersI4ivNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramEnvParametersI4uivNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramLocalParameter4dARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramLocalParameter4dvARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramLocalParameter4fARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramLocalParameter4fvARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramLocalParameterI4iNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramLocalParameterI4ivNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramLocalParameterI4uiNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramLocalParameterI4uivNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramLocalParameters4fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramLocalParametersI4ivNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramLocalParametersI4uivNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramNamedParameter4dNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramNamedParameter4dvNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramNamedParameter4fNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramNamedParameter4fvNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramParameter4dNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramParameter4dvNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramParameter4fNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramParameter4fvNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramParameteriARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramParameteriEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramParameteri> {};\ntemplate<>\nstruct fex_gen_config<glProgramParameters4dvNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramParameters4fvNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramPathFragmentInputGenNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramStringARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramSubroutineParametersuivNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1dEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1d> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1dv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1fEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1f> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1fv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1i64ARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1i64NV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1i64vARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1i64vNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1iEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1i> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1ivEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1iv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1ui64ARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1ui64NV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1ui64vARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1ui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1uiEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1ui> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1uivEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform1uiv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2dEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2d> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2dv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2fEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2f> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2fv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2i64ARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2i64NV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2i64vARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2i64vNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2iEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2i> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2ivEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2iv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2ui64ARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2ui64NV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2ui64vARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2ui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2uiEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2ui> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2uivEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform2uiv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3dEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3d> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3dv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3fEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3f> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3fv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3i64ARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3i64NV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3i64vARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3i64vNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3iEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3i> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3ivEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3iv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3ui64ARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3ui64NV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3ui64vARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3ui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3uiEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3ui> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3uivEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform3uiv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4dEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4d> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4dv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4fEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4f> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4fv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4i64ARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4i64NV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4i64vARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4i64vNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4iEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4i> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4ivEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4iv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4ui64ARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4ui64NV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4ui64vARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4ui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4uiEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4ui> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4uivEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniform4uiv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformHandleui64ARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformHandleui64NV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformHandleui64vARB> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformHandleui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix2dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix2dv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix2fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix2fv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix2x3dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix2x3dv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix2x3fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix2x3fv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix2x4dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix2x4dv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix2x4fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix2x4fv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix3dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix3dv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix3fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix3fv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix3x2dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix3x2dv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix3x2fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix3x2fv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix3x4dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix3x4dv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix3x4fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix3x4fv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix4dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix4dv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix4fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix4fv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix4x2dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix4x2dv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix4x2fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix4x2fv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix4x3dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix4x3dv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix4x3fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformMatrix4x3fv> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformui64NV> {};\ntemplate<>\nstruct fex_gen_config<glProgramUniformui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glProgramVertexLimitNV> {};\ntemplate<>\nstruct fex_gen_config<glProvokingVertexEXT> {};\ntemplate<>\nstruct fex_gen_config<glProvokingVertex> {};\ntemplate<>\nstruct fex_gen_config<glPushAttrib> {};\ntemplate<>\nstruct fex_gen_config<glPushClientAttribDefaultEXT> {};\ntemplate<>\nstruct fex_gen_config<glPushClientAttrib> {};\ntemplate<>\nstruct fex_gen_config<glPushDebugGroup> {};\ntemplate<>\nstruct fex_gen_config<glPushGroupMarkerEXT> {};\ntemplate<>\nstruct fex_gen_config<glPushMatrix> {};\ntemplate<>\nstruct fex_gen_config<glPushName> {};\ntemplate<>\nstruct fex_gen_config<glQueryCounter> {};\ntemplate<>\nstruct fex_gen_config<glQueryObjectParameteruiAMD> {};\ntemplate<>\nstruct fex_gen_config<glQueryResourceTagNV> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos2d> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos2dv> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos2f> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos2fv> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos2i> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos2iv> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos2s> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos2sv> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos2xOES> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos2xvOES> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos3d> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos3dv> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos3f> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos3fv> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos3i> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos3iv> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos3s> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos3sv> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos3xOES> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos3xvOES> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos4d> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos4dv> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos4f> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos4fv> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos4i> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos4iv> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos4s> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos4sv> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos4xOES> {};\ntemplate<>\nstruct fex_gen_config<glRasterPos4xvOES> {};\ntemplate<>\nstruct fex_gen_config<glRasterSamplesEXT> {};\ntemplate<>\nstruct fex_gen_config<glReadBuffer> {};\ntemplate<>\nstruct fex_gen_config<glReadInstrumentsSGIX> {};\ntemplate<>\nstruct fex_gen_config<glReadnPixelsARB> {};\ntemplate<>\nstruct fex_gen_config<glReadnPixels> {};\ntemplate<>\nstruct fex_gen_config<glReadPixels> {};\ntemplate<>\nstruct fex_gen_config<glRectd> {};\ntemplate<>\nstruct fex_gen_config<glRectdv> {};\ntemplate<>\nstruct fex_gen_config<glRectf> {};\ntemplate<>\nstruct fex_gen_config<glRectfv> {};\ntemplate<>\nstruct fex_gen_config<glRecti> {};\ntemplate<>\nstruct fex_gen_config<glRectiv> {};\ntemplate<>\nstruct fex_gen_config<glRects> {};\ntemplate<>\nstruct fex_gen_config<glRectsv> {};\ntemplate<>\nstruct fex_gen_config<glRectxOES> {};\ntemplate<>\nstruct fex_gen_config<glRectxvOES> {};\ntemplate<>\nstruct fex_gen_config<glReferencePlaneSGIX> {};\ntemplate<>\nstruct fex_gen_config<glReleaseShaderCompiler> {};\ntemplate<>\nstruct fex_gen_config<glRenderbufferStorageEXT> {};\ntemplate<>\nstruct fex_gen_config<glRenderbufferStorage> {};\ntemplate<>\nstruct fex_gen_config<glRenderbufferStorageMultisampleAdvancedAMD> {};\ntemplate<>\nstruct fex_gen_config<glRenderbufferStorageMultisampleCoverageNV> {};\ntemplate<>\nstruct fex_gen_config<glRenderbufferStorageMultisampleEXT> {};\ntemplate<>\nstruct fex_gen_config<glRenderbufferStorageMultisample> {};\ntemplate<>\nstruct fex_gen_config<glRenderGpuMaskNV> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glReplacementCodePointerSUN> {};\ntemplate<>\nstruct fex_gen_param<glReplacementCodePointerSUN, 2, const void**> : fexgen::assume_compatible_data_layout {};\n#endif\ntemplate<>\nstruct fex_gen_config<glReplacementCodeubSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeubvSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiColor3fVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiColor3fVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiColor4fNormal3fVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiColor4fNormal3fVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiColor4ubVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiColor4ubVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiNormal3fVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiNormal3fVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiTexCoord2fVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiTexCoord2fVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuiVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeuivSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeusSUN> {};\ntemplate<>\nstruct fex_gen_config<glReplacementCodeusvSUN> {};\ntemplate<>\nstruct fex_gen_config<glRequestResidentProgramsNV> {};\ntemplate<>\nstruct fex_gen_config<glResetHistogramEXT> {};\ntemplate<>\nstruct fex_gen_config<glResetHistogram> {};\ntemplate<>\nstruct fex_gen_config<glResetMemoryObjectParameterNV> {};\ntemplate<>\nstruct fex_gen_config<glResetMinmaxEXT> {};\ntemplate<>\nstruct fex_gen_config<glResetMinmax> {};\ntemplate<>\nstruct fex_gen_config<glResizeBuffersMESA> {};\ntemplate<>\nstruct fex_gen_config<glResolveDepthValuesNV> {};\ntemplate<>\nstruct fex_gen_config<glResumeTransformFeedback> {};\ntemplate<>\nstruct fex_gen_config<glResumeTransformFeedbackNV> {};\ntemplate<>\nstruct fex_gen_config<glRotated> {};\ntemplate<>\nstruct fex_gen_config<glRotatef> {};\ntemplate<>\nstruct fex_gen_config<glRotatexOES> {};\ntemplate<>\nstruct fex_gen_config<glSampleCoverageARB> {};\ntemplate<>\nstruct fex_gen_config<glSampleCoverage> {};\ntemplate<>\nstruct fex_gen_config<glSampleMapATI> {};\ntemplate<>\nstruct fex_gen_config<glSampleMaskEXT> {};\ntemplate<>\nstruct fex_gen_config<glSampleMaski> {};\ntemplate<>\nstruct fex_gen_config<glSampleMaskIndexedNV> {};\ntemplate<>\nstruct fex_gen_config<glSampleMaskSGIS> {};\ntemplate<>\nstruct fex_gen_config<glSamplePatternEXT> {};\ntemplate<>\nstruct fex_gen_config<glSamplePatternSGIS> {};\ntemplate<>\nstruct fex_gen_config<glSamplerParameterf> {};\ntemplate<>\nstruct fex_gen_config<glSamplerParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glSamplerParameteri> {};\ntemplate<>\nstruct fex_gen_config<glSamplerParameterIiv> {};\ntemplate<>\nstruct fex_gen_config<glSamplerParameterIuiv> {};\ntemplate<>\nstruct fex_gen_config<glSamplerParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glScaled> {};\ntemplate<>\nstruct fex_gen_config<glScalef> {};\ntemplate<>\nstruct fex_gen_config<glScalexOES> {};\ntemplate<>\nstruct fex_gen_config<glScissorArrayv> {};\ntemplate<>\nstruct fex_gen_config<glScissorExclusiveArrayvNV> {};\ntemplate<>\nstruct fex_gen_config<glScissorExclusiveNV> {};\ntemplate<>\nstruct fex_gen_config<glScissor> {};\ntemplate<>\nstruct fex_gen_config<glScissorIndexed> {};\ntemplate<>\nstruct fex_gen_config<glScissorIndexedv> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3bEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3bvEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3dEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3fEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3hNV> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3hvNV> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3iEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3ivEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3sEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3svEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3ubEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3ubvEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3uiEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3uivEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3usEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColor3usvEXT> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColorFormatNV> {};\ntemplate<>\nstruct fex_gen_config<glSecondaryColorPointerEXT> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glSecondaryColorPointerListIBM> {};\ntemplate<>\nstruct fex_gen_param<glSecondaryColorPointerListIBM, 3, const void**> : fexgen::assume_compatible_data_layout {};\n#endif\ntemplate<>\nstruct fex_gen_config<glSelectBuffer> {};\ntemplate<>\nstruct fex_gen_config<glSelectPerfMonitorCountersAMD> {};\ntemplate<>\nstruct fex_gen_config<glSemaphoreParameterui64vEXT> {};\ntemplate<>\nstruct fex_gen_config<glSeparableFilter2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glSeparableFilter2D> {};\ntemplate<>\nstruct fex_gen_config<glSetFenceAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glSetFenceNV> {};\ntemplate<>\nstruct fex_gen_config<glSetFragmentShaderConstantATI> {};\ntemplate<>\nstruct fex_gen_config<glSetInvariantEXT> {};\ntemplate<>\nstruct fex_gen_config<glSetLocalConstantEXT> {};\ntemplate<>\nstruct fex_gen_config<glSetMultisamplefvAMD> {};\ntemplate<>\nstruct fex_gen_config<glShadeModel> {};\ntemplate<>\nstruct fex_gen_config<glShaderBinary> {};\ntemplate<>\nstruct fex_gen_config<glShaderOp1EXT> {};\ntemplate<>\nstruct fex_gen_config<glShaderOp2EXT> {};\ntemplate<>\nstruct fex_gen_config<glShaderOp3EXT> {};\ntemplate<>\nstruct fex_gen_config<glShaderSource> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glShaderSource, 2, const GLchar* const*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glShaderSourceARB> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glShaderSourceARB, 2, const GLcharARB**> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glShaderStorageBlockBinding> {};\ntemplate<>\nstruct fex_gen_config<glShadingRateImageBarrierNV> {};\ntemplate<>\nstruct fex_gen_config<glShadingRateImagePaletteNV> {};\ntemplate<>\nstruct fex_gen_config<glShadingRateSampleOrderCustomNV> {};\ntemplate<>\nstruct fex_gen_config<glShadingRateSampleOrderNV> {};\ntemplate<>\nstruct fex_gen_config<glSharpenTexFuncSGIS> {};\ntemplate<>\nstruct fex_gen_config<glSignalSemaphoreEXT> {};\ntemplate<>\nstruct fex_gen_config<glSignalSemaphoreui64NVX> {};\ntemplate<>\nstruct fex_gen_config<glSignalVkFenceNV> {};\ntemplate<>\nstruct fex_gen_config<glSignalVkSemaphoreNV> {};\ntemplate<>\nstruct fex_gen_config<glSpecializeShaderARB> {};\ntemplate<>\nstruct fex_gen_config<glSpecializeShader> {};\ntemplate<>\nstruct fex_gen_config<glSpriteParameterfSGIX> {};\ntemplate<>\nstruct fex_gen_config<glSpriteParameterfvSGIX> {};\ntemplate<>\nstruct fex_gen_config<glSpriteParameteriSGIX> {};\ntemplate<>\nstruct fex_gen_config<glSpriteParameterivSGIX> {};\ntemplate<>\nstruct fex_gen_config<glStartInstrumentsSGIX> {};\ntemplate<>\nstruct fex_gen_config<glStateCaptureNV> {};\ntemplate<>\nstruct fex_gen_config<glStencilClearTagEXT> {};\ntemplate<>\nstruct fex_gen_config<glStencilFillPathInstancedNV> {};\ntemplate<>\nstruct fex_gen_config<glStencilFillPathNV> {};\ntemplate<>\nstruct fex_gen_config<glStencilFunc> {};\ntemplate<>\nstruct fex_gen_config<glStencilFuncSeparateATI> {};\ntemplate<>\nstruct fex_gen_config<glStencilFuncSeparate> {};\ntemplate<>\nstruct fex_gen_config<glStencilMask> {};\ntemplate<>\nstruct fex_gen_config<glStencilMaskSeparate> {};\ntemplate<>\nstruct fex_gen_config<glStencilOp> {};\ntemplate<>\nstruct fex_gen_config<glStencilOpSeparateATI> {};\ntemplate<>\nstruct fex_gen_config<glStencilOpSeparate> {};\ntemplate<>\nstruct fex_gen_config<glStencilOpValueAMD> {};\ntemplate<>\nstruct fex_gen_config<glStencilStrokePathInstancedNV> {};\ntemplate<>\nstruct fex_gen_config<glStencilStrokePathNV> {};\ntemplate<>\nstruct fex_gen_config<glStencilThenCoverFillPathInstancedNV> {};\ntemplate<>\nstruct fex_gen_config<glStencilThenCoverFillPathNV> {};\ntemplate<>\nstruct fex_gen_config<glStencilThenCoverStrokePathInstancedNV> {};\ntemplate<>\nstruct fex_gen_config<glStencilThenCoverStrokePathNV> {};\ntemplate<>\nstruct fex_gen_config<glStopInstrumentsSGIX> {};\ntemplate<>\nstruct fex_gen_config<glStringMarkerGREMEDY> {};\ntemplate<>\nstruct fex_gen_config<glSubpixelPrecisionBiasNV> {};\ntemplate<>\nstruct fex_gen_config<glSwizzleEXT> {};\ntemplate<>\nstruct fex_gen_config<glSyncTextureINTEL> {};\ntemplate<>\nstruct fex_gen_config<glTagSampleBufferSGIX> {};\ntemplate<>\nstruct fex_gen_config<glTangent3bEXT> {};\ntemplate<>\nstruct fex_gen_config<glTangent3bvEXT> {};\ntemplate<>\nstruct fex_gen_config<glTangent3dEXT> {};\ntemplate<>\nstruct fex_gen_config<glTangent3dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glTangent3fEXT> {};\ntemplate<>\nstruct fex_gen_config<glTangent3fvEXT> {};\ntemplate<>\nstruct fex_gen_config<glTangent3iEXT> {};\ntemplate<>\nstruct fex_gen_config<glTangent3ivEXT> {};\ntemplate<>\nstruct fex_gen_config<glTangent3sEXT> {};\ntemplate<>\nstruct fex_gen_config<glTangent3svEXT> {};\ntemplate<>\nstruct fex_gen_config<glTangentPointerEXT> {};\ntemplate<>\nstruct fex_gen_config<glTbufferMask3DFX> {};\ntemplate<>\nstruct fex_gen_config<glTessellationFactorAMD> {};\ntemplate<>\nstruct fex_gen_config<glTessellationModeAMD> {};\ntemplate<>\nstruct fex_gen_config<glTexAttachMemoryNV> {};\ntemplate<>\nstruct fex_gen_config<glTexBufferARB> {};\ntemplate<>\nstruct fex_gen_config<glTexBufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glTexBuffer> {};\ntemplate<>\nstruct fex_gen_config<glTexBufferRange> {};\ntemplate<>\nstruct fex_gen_config<glTexBumpParameterfvATI> {};\ntemplate<>\nstruct fex_gen_config<glTexBumpParameterivATI> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord1bOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord1bvOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord1d> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord1dv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord1f> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord1fv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord1hNV> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord1hvNV> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord1i> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord1iv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord1s> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord1sv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord1xOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord1xvOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2bOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2bvOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2d> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2dv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2fColor3fVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2fColor3fVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2fColor4fNormal3fVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2fColor4fNormal3fVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2fColor4ubVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2fColor4ubVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2f> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2fNormal3fVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2fNormal3fVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2fv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2fVertex3fSUN> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2fVertex3fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2hNV> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2hvNV> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2i> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2iv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2s> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2sv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2xOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord2xvOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord3bOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord3bvOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord3d> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord3dv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord3f> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord3fv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord3hNV> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord3hvNV> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord3i> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord3iv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord3s> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord3sv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord3xOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord3xvOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4bOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4bvOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4d> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4dv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4fColor4fNormal3fVertex4fSUN> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4fColor4fNormal3fVertex4fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4f> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4fv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4fVertex4fSUN> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4fVertex4fvSUN> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4hNV> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4hvNV> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4i> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4iv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4s> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4sv> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4xOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoord4xvOES> {};\ntemplate<>\nstruct fex_gen_config<glTexCoordFormatNV> {};\ntemplate<>\nstruct fex_gen_config<glTexCoordPointerEXT> {};\ntemplate<>\nstruct fex_gen_config<glTexCoordPointer> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glTexCoordPointerListIBM> {};\ntemplate<>\nstruct fex_gen_param<glTexCoordPointerListIBM, 3, const void**> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<glTexCoordPointervINTEL> {};\ntemplate<>\nstruct fex_gen_param<glTexCoordPointervINTEL, 2, const void**> : fexgen::assume_compatible_data_layout {};\n#endif\ntemplate<>\nstruct fex_gen_config<glTexEnvf> {};\ntemplate<>\nstruct fex_gen_config<glTexEnvfv> {};\ntemplate<>\nstruct fex_gen_config<glTexEnvi> {};\ntemplate<>\nstruct fex_gen_config<glTexEnviv> {};\ntemplate<>\nstruct fex_gen_config<glTexEnvxOES> {};\ntemplate<>\nstruct fex_gen_config<glTexEnvxvOES> {};\ntemplate<>\nstruct fex_gen_config<glTexFilterFuncSGIS> {};\ntemplate<>\nstruct fex_gen_config<glTexGend> {};\ntemplate<>\nstruct fex_gen_config<glTexGendv> {};\ntemplate<>\nstruct fex_gen_config<glTexGenf> {};\ntemplate<>\nstruct fex_gen_config<glTexGenfv> {};\ntemplate<>\nstruct fex_gen_config<glTexGeni> {};\ntemplate<>\nstruct fex_gen_config<glTexGeniv> {};\ntemplate<>\nstruct fex_gen_config<glTexGenxOES> {};\ntemplate<>\nstruct fex_gen_config<glTexGenxvOES> {};\ntemplate<>\nstruct fex_gen_config<glTexImage1D> {};\ntemplate<>\nstruct fex_gen_config<glTexImage2D> {};\ntemplate<>\nstruct fex_gen_config<glTexImage2DMultisampleCoverageNV> {};\ntemplate<>\nstruct fex_gen_config<glTexImage2DMultisample> {};\ntemplate<>\nstruct fex_gen_config<glTexImage3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTexImage3D> {};\ntemplate<>\nstruct fex_gen_config<glTexImage3DMultisampleCoverageNV> {};\ntemplate<>\nstruct fex_gen_config<glTexImage3DMultisample> {};\ntemplate<>\nstruct fex_gen_config<glTexImage4DSGIS> {};\ntemplate<>\nstruct fex_gen_config<glTexPageCommitmentARB> {};\ntemplate<>\nstruct fex_gen_config<glTexParameterf> {};\ntemplate<>\nstruct fex_gen_config<glTexParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glTexParameteri> {};\ntemplate<>\nstruct fex_gen_config<glTexParameterIivEXT> {};\ntemplate<>\nstruct fex_gen_config<glTexParameterIiv> {};\ntemplate<>\nstruct fex_gen_config<glTexParameterIuivEXT> {};\ntemplate<>\nstruct fex_gen_config<glTexParameterIuiv> {};\ntemplate<>\nstruct fex_gen_config<glTexParameteriv> {};\ntemplate<>\nstruct fex_gen_config<glTexParameterxOES> {};\ntemplate<>\nstruct fex_gen_config<glTexParameterxvOES> {};\ntemplate<>\nstruct fex_gen_config<glTexRenderbufferNV> {};\ntemplate<>\nstruct fex_gen_config<glTexStorage1D> {};\ntemplate<>\nstruct fex_gen_config<glTexStorage2D> {};\ntemplate<>\nstruct fex_gen_config<glTexStorage2DMultisample> {};\ntemplate<>\nstruct fex_gen_config<glTexStorage3D> {};\ntemplate<>\nstruct fex_gen_config<glTexStorage3DMultisample> {};\ntemplate<>\nstruct fex_gen_config<glTexStorageMem1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTexStorageMem2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTexStorageMem2DMultisampleEXT> {};\ntemplate<>\nstruct fex_gen_config<glTexStorageMem3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTexStorageMem3DMultisampleEXT> {};\ntemplate<>\nstruct fex_gen_config<glTexStorageSparseAMD> {};\ntemplate<>\nstruct fex_gen_config<glTexSubImage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTexSubImage1D> {};\ntemplate<>\nstruct fex_gen_config<glTexSubImage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTexSubImage2D> {};\ntemplate<>\nstruct fex_gen_config<glTexSubImage3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTexSubImage3D> {};\ntemplate<>\nstruct fex_gen_config<glTexSubImage4DSGIS> {};\ntemplate<>\nstruct fex_gen_config<glTextureAttachMemoryNV> {};\ntemplate<>\nstruct fex_gen_config<glTextureBarrier> {};\ntemplate<>\nstruct fex_gen_config<glTextureBarrierNV> {};\ntemplate<>\nstruct fex_gen_config<glTextureBufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureBuffer> {};\ntemplate<>\nstruct fex_gen_config<glTextureBufferRangeEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureBufferRange> {};\ntemplate<>\nstruct fex_gen_config<glTextureColorMaskSGIS> {};\ntemplate<>\nstruct fex_gen_config<glTextureImage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureImage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureImage2DMultisampleCoverageNV> {};\ntemplate<>\nstruct fex_gen_config<glTextureImage2DMultisampleNV> {};\ntemplate<>\nstruct fex_gen_config<glTextureImage3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureImage3DMultisampleCoverageNV> {};\ntemplate<>\nstruct fex_gen_config<glTextureImage3DMultisampleNV> {};\ntemplate<>\nstruct fex_gen_config<glTextureLightEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureMaterialEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureNormalEXT> {};\ntemplate<>\nstruct fex_gen_config<glTexturePageCommitmentEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureParameterfEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureParameterf> {};\ntemplate<>\nstruct fex_gen_config<glTextureParameterfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureParameterfv> {};\ntemplate<>\nstruct fex_gen_config<glTextureParameteriEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureParameteri> {};\ntemplate<>\nstruct fex_gen_config<glTextureParameterIivEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureParameterIiv> {};\ntemplate<>\nstruct fex_gen_config<glTextureParameterIuivEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureParameterIuiv> {};\ntemplate<>\nstruct fex_gen_config<glTextureParameterivEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureParameteriv> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glTextureRangeAPPLE> {};\n#endif\ntemplate<>\nstruct fex_gen_config<glTextureRenderbufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorage1D> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorage2D> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorage2DMultisampleEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorage2DMultisample> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorage3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorage3D> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorage3DMultisampleEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorage3DMultisample> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorageMem1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorageMem2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorageMem2DMultisampleEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorageMem3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorageMem3DMultisampleEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureStorageSparseAMD> {};\ntemplate<>\nstruct fex_gen_config<glTextureSubImage1DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureSubImage1D> {};\ntemplate<>\nstruct fex_gen_config<glTextureSubImage2DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureSubImage2D> {};\ntemplate<>\nstruct fex_gen_config<glTextureSubImage3DEXT> {};\ntemplate<>\nstruct fex_gen_config<glTextureSubImage3D> {};\ntemplate<>\nstruct fex_gen_config<glTextureView> {};\ntemplate<>\nstruct fex_gen_config<glTrackMatrixNV> {};\ntemplate<>\nstruct fex_gen_config<glTransformFeedbackAttribsNV> {};\ntemplate<>\nstruct fex_gen_config<glTransformFeedbackBufferBase> {};\ntemplate<>\nstruct fex_gen_config<glTransformFeedbackBufferRange> {};\ntemplate<>\nstruct fex_gen_config<glTransformFeedbackStreamAttribsNV> {};\n#ifndef IS_32BIT_THUNK\n// TODO\ntemplate<>\nstruct fex_gen_config<glTransformFeedbackVaryingsEXT> {};\ntemplate<>\nstruct fex_gen_param<glTransformFeedbackVaryingsEXT, 2, const char* const*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<glTransformFeedbackVaryings> {};\ntemplate<>\nstruct fex_gen_param<glTransformFeedbackVaryings, 2, const char* const*> : fexgen::assume_compatible_data_layout {};\n#endif\ntemplate<>\nstruct fex_gen_config<glTransformFeedbackVaryingsNV> {};\ntemplate<>\nstruct fex_gen_config<glTransformPathNV> {};\ntemplate<>\nstruct fex_gen_config<glTranslated> {};\ntemplate<>\nstruct fex_gen_config<glTranslatef> {};\ntemplate<>\nstruct fex_gen_config<glTranslatexOES> {};\ntemplate<>\nstruct fex_gen_config<glUniform1d> {};\ntemplate<>\nstruct fex_gen_config<glUniform1dv> {};\ntemplate<>\nstruct fex_gen_config<glUniform1fARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform1f> {};\ntemplate<>\nstruct fex_gen_config<glUniform1fvARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform1fv> {};\ntemplate<>\nstruct fex_gen_config<glUniform1i64ARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform1i64NV> {};\ntemplate<>\nstruct fex_gen_config<glUniform1i64vARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform1i64vNV> {};\ntemplate<>\nstruct fex_gen_config<glUniform1iARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform1i> {};\ntemplate<>\nstruct fex_gen_config<glUniform1ivARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform1iv> {};\ntemplate<>\nstruct fex_gen_config<glUniform1ui64ARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform1ui64NV> {};\ntemplate<>\nstruct fex_gen_config<glUniform1ui64vARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform1ui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glUniform1uiEXT> {};\ntemplate<>\nstruct fex_gen_config<glUniform1ui> {};\ntemplate<>\nstruct fex_gen_config<glUniform1uivEXT> {};\ntemplate<>\nstruct fex_gen_config<glUniform1uiv> {};\ntemplate<>\nstruct fex_gen_config<glUniform2d> {};\ntemplate<>\nstruct fex_gen_config<glUniform2dv> {};\ntemplate<>\nstruct fex_gen_config<glUniform2fARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform2f> {};\ntemplate<>\nstruct fex_gen_config<glUniform2fvARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform2fv> {};\ntemplate<>\nstruct fex_gen_config<glUniform2i64ARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform2i64NV> {};\ntemplate<>\nstruct fex_gen_config<glUniform2i64vARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform2i64vNV> {};\ntemplate<>\nstruct fex_gen_config<glUniform2iARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform2i> {};\ntemplate<>\nstruct fex_gen_config<glUniform2ivARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform2iv> {};\ntemplate<>\nstruct fex_gen_config<glUniform2ui64ARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform2ui64NV> {};\ntemplate<>\nstruct fex_gen_config<glUniform2ui64vARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform2ui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glUniform2uiEXT> {};\ntemplate<>\nstruct fex_gen_config<glUniform2ui> {};\ntemplate<>\nstruct fex_gen_config<glUniform2uivEXT> {};\ntemplate<>\nstruct fex_gen_config<glUniform2uiv> {};\ntemplate<>\nstruct fex_gen_config<glUniform3d> {};\ntemplate<>\nstruct fex_gen_config<glUniform3dv> {};\ntemplate<>\nstruct fex_gen_config<glUniform3fARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform3f> {};\ntemplate<>\nstruct fex_gen_config<glUniform3fvARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform3fv> {};\ntemplate<>\nstruct fex_gen_config<glUniform3i64ARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform3i64NV> {};\ntemplate<>\nstruct fex_gen_config<glUniform3i64vARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform3i64vNV> {};\ntemplate<>\nstruct fex_gen_config<glUniform3iARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform3i> {};\ntemplate<>\nstruct fex_gen_config<glUniform3ivARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform3iv> {};\ntemplate<>\nstruct fex_gen_config<glUniform3ui64ARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform3ui64NV> {};\ntemplate<>\nstruct fex_gen_config<glUniform3ui64vARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform3ui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glUniform3uiEXT> {};\ntemplate<>\nstruct fex_gen_config<glUniform3ui> {};\ntemplate<>\nstruct fex_gen_config<glUniform3uivEXT> {};\ntemplate<>\nstruct fex_gen_config<glUniform3uiv> {};\ntemplate<>\nstruct fex_gen_config<glUniform4d> {};\ntemplate<>\nstruct fex_gen_config<glUniform4dv> {};\ntemplate<>\nstruct fex_gen_config<glUniform4fARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform4f> {};\ntemplate<>\nstruct fex_gen_config<glUniform4fvARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform4fv> {};\ntemplate<>\nstruct fex_gen_config<glUniform4i64ARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform4i64NV> {};\ntemplate<>\nstruct fex_gen_config<glUniform4i64vARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform4i64vNV> {};\ntemplate<>\nstruct fex_gen_config<glUniform4iARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform4i> {};\ntemplate<>\nstruct fex_gen_config<glUniform4ivARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform4iv> {};\ntemplate<>\nstruct fex_gen_config<glUniform4ui64ARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform4ui64NV> {};\ntemplate<>\nstruct fex_gen_config<glUniform4ui64vARB> {};\ntemplate<>\nstruct fex_gen_config<glUniform4ui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glUniform4uiEXT> {};\ntemplate<>\nstruct fex_gen_config<glUniform4ui> {};\ntemplate<>\nstruct fex_gen_config<glUniform4uivEXT> {};\ntemplate<>\nstruct fex_gen_config<glUniform4uiv> {};\ntemplate<>\nstruct fex_gen_config<glUniformBlockBinding> {};\ntemplate<>\nstruct fex_gen_config<glUniformBufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glUniformHandleui64ARB> {};\ntemplate<>\nstruct fex_gen_config<glUniformHandleui64NV> {};\ntemplate<>\nstruct fex_gen_config<glUniformHandleui64vARB> {};\ntemplate<>\nstruct fex_gen_config<glUniformHandleui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix2dv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix2fvARB> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix2fv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix2x3dv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix2x3fv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix2x4dv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix2x4fv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix3dv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix3fvARB> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix3fv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix3x2dv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix3x2fv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix3x4dv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix3x4fv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix4dv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix4fvARB> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix4fv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix4x2dv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix4x2fv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix4x3dv> {};\ntemplate<>\nstruct fex_gen_config<glUniformMatrix4x3fv> {};\ntemplate<>\nstruct fex_gen_config<glUniformSubroutinesuiv> {};\ntemplate<>\nstruct fex_gen_config<glUniformui64NV> {};\ntemplate<>\nstruct fex_gen_config<glUniformui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glUnlockArraysEXT> {};\ntemplate<>\nstruct fex_gen_config<glUnmapObjectBufferATI> {};\ntemplate<>\nstruct fex_gen_config<glUnmapTexture2DINTEL> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glUpdateObjectBufferATI> {};\n#endif\ntemplate<>\nstruct fex_gen_config<glUploadGpuMaskNVX> {};\ntemplate<>\nstruct fex_gen_config<glUseProgram> {};\ntemplate<>\nstruct fex_gen_config<glUseProgramObjectARB> {};\ntemplate<>\nstruct fex_gen_config<glUseProgramStages> {};\ntemplate<>\nstruct fex_gen_config<glUseShaderProgramEXT> {};\ntemplate<>\nstruct fex_gen_config<glValidateProgramARB> {};\ntemplate<>\nstruct fex_gen_config<glValidateProgram> {};\ntemplate<>\nstruct fex_gen_config<glValidateProgramPipeline> {};\ntemplate<>\nstruct fex_gen_config<glVariantArrayObjectATI> {};\ntemplate<>\nstruct fex_gen_config<glVariantbvEXT> {};\ntemplate<>\nstruct fex_gen_config<glVariantdvEXT> {};\ntemplate<>\nstruct fex_gen_config<glVariantfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glVariantivEXT> {};\ntemplate<>\nstruct fex_gen_config<glVariantPointerEXT> {};\ntemplate<>\nstruct fex_gen_config<glVariantsvEXT> {};\ntemplate<>\nstruct fex_gen_config<glVariantubvEXT> {};\ntemplate<>\nstruct fex_gen_config<glVariantuivEXT> {};\ntemplate<>\nstruct fex_gen_config<glVariantusvEXT> {};\ntemplate<>\nstruct fex_gen_config<glVDPAUFiniNV> {};\ntemplate<>\nstruct fex_gen_config<glVDPAUGetSurfaceivNV> {};\ntemplate<>\nstruct fex_gen_config<glVDPAUInitNV> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glVDPAUMapSurfacesNV> {};\n#endif\ntemplate<>\nstruct fex_gen_config<glVDPAUSurfaceAccessNV> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glVDPAUUnmapSurfacesNV> {};\n#endif\ntemplate<>\nstruct fex_gen_config<glVDPAUUnregisterSurfaceNV> {};\ntemplate<>\nstruct fex_gen_config<glVertex2bOES> {};\ntemplate<>\nstruct fex_gen_config<glVertex2bvOES> {};\ntemplate<>\nstruct fex_gen_config<glVertex2d> {};\ntemplate<>\nstruct fex_gen_config<glVertex2dv> {};\ntemplate<>\nstruct fex_gen_config<glVertex2f> {};\ntemplate<>\nstruct fex_gen_config<glVertex2fv> {};\ntemplate<>\nstruct fex_gen_config<glVertex2hNV> {};\ntemplate<>\nstruct fex_gen_config<glVertex2hvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertex2i> {};\ntemplate<>\nstruct fex_gen_config<glVertex2iv> {};\ntemplate<>\nstruct fex_gen_config<glVertex2s> {};\ntemplate<>\nstruct fex_gen_config<glVertex2sv> {};\ntemplate<>\nstruct fex_gen_config<glVertex2xOES> {};\ntemplate<>\nstruct fex_gen_config<glVertex2xvOES> {};\ntemplate<>\nstruct fex_gen_config<glVertex3bOES> {};\ntemplate<>\nstruct fex_gen_config<glVertex3bvOES> {};\ntemplate<>\nstruct fex_gen_config<glVertex3d> {};\ntemplate<>\nstruct fex_gen_config<glVertex3dv> {};\ntemplate<>\nstruct fex_gen_config<glVertex3f> {};\ntemplate<>\nstruct fex_gen_config<glVertex3fv> {};\ntemplate<>\nstruct fex_gen_config<glVertex3hNV> {};\ntemplate<>\nstruct fex_gen_config<glVertex3hvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertex3i> {};\ntemplate<>\nstruct fex_gen_config<glVertex3iv> {};\ntemplate<>\nstruct fex_gen_config<glVertex3s> {};\ntemplate<>\nstruct fex_gen_config<glVertex3sv> {};\ntemplate<>\nstruct fex_gen_config<glVertex3xOES> {};\ntemplate<>\nstruct fex_gen_config<glVertex3xvOES> {};\ntemplate<>\nstruct fex_gen_config<glVertex4bOES> {};\ntemplate<>\nstruct fex_gen_config<glVertex4bvOES> {};\ntemplate<>\nstruct fex_gen_config<glVertex4d> {};\ntemplate<>\nstruct fex_gen_config<glVertex4dv> {};\ntemplate<>\nstruct fex_gen_config<glVertex4f> {};\ntemplate<>\nstruct fex_gen_config<glVertex4fv> {};\ntemplate<>\nstruct fex_gen_config<glVertex4hNV> {};\ntemplate<>\nstruct fex_gen_config<glVertex4hvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertex4i> {};\ntemplate<>\nstruct fex_gen_config<glVertex4iv> {};\ntemplate<>\nstruct fex_gen_config<glVertex4s> {};\ntemplate<>\nstruct fex_gen_config<glVertex4sv> {};\ntemplate<>\nstruct fex_gen_config<glVertex4xOES> {};\ntemplate<>\nstruct fex_gen_config<glVertex4xvOES> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayAttribBinding> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayAttribFormat> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayAttribIFormat> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayAttribLFormat> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayBindingDivisor> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayBindVertexBufferEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayColorOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayEdgeFlagOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayElementBuffer> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayFogCoordOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayIndexOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayMultiTexCoordOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayNormalOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayParameteriAPPLE> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayRangeAPPLE> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glVertexArrayRangeNV> {};\n#endif\ntemplate<>\nstruct fex_gen_config<glVertexArraySecondaryColorOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayTexCoordOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayVertexAttribBindingEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayVertexAttribDivisorEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayVertexAttribFormatEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayVertexAttribIFormatEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayVertexAttribIOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayVertexAttribLFormatEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayVertexAttribLOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayVertexAttribOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayVertexBindingDivisorEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexArrayVertexBuffer> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<glVertexArrayVertexBuffers> {};\n#else\ntemplate<>\nstruct fex_gen_config<glVertexArrayVertexBuffers> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glVertexArrayVertexBuffers, 4, const GLintptr*> : fexgen::ptr_passthrough {};\n#endif\ntemplate<>\nstruct fex_gen_config<glVertexArrayVertexOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1dARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1d> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1dNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1dvARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1dv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1dvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1fARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1f> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1fNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1fvARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1fv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1fvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1hNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1hvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1sARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1s> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1sNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1svARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1sv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib1svNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2dARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2d> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2dNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2dvARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2dv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2dvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2fARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2f> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2fNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2fvARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2fv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2fvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2hNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2hvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2sARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2s> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2sNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2svARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2sv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib2svNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3dARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3d> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3dNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3dvARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3dv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3dvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3fARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3f> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3fNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3fvARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3fv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3fvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3hNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3hvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3sARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3s> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3sNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3svARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3sv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib3svNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4bvARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4bv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4dARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4d> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4dNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4dvARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4dv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4dvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4fARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4f> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4fNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4fvARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4fv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4fvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4hNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4hvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4ivARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4iv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4NbvARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4Nbv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4NivARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4Niv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4NsvARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4Nsv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4NubARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4Nub> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4NubvARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4Nubv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4NuivARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4Nuiv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4NusvARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4Nusv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4sARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4s> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4sNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4svARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4sv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4svNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4ubNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4ubvARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4ubv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4ubvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4uivARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4uiv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4usvARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttrib4usv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribArrayObjectATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribBinding> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribDivisorARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribDivisor> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribFormat> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribFormatNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI1iEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI1i> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI1ivEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI1iv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI1uiEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI1ui> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI1uivEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI1uiv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI2iEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI2i> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI2ivEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI2iv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI2uiEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI2ui> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI2uivEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI2uiv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI3iEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI3i> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI3ivEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI3iv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI3uiEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI3ui> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI3uivEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI3uiv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4bvEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4bv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4iEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4i> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4ivEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4iv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4svEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4sv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4ubvEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4ubv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4uiEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4ui> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4uivEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4uiv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4usvEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribI4usv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribIFormat> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribIFormatNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribIPointerEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribIPointer> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL1dEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL1d> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL1dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL1dv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL1i64NV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL1i64vNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL1ui64ARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL1ui64NV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL1ui64vARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL1ui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL2dEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL2d> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL2dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL2dv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL2i64NV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL2i64vNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL2ui64NV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL2ui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL3dEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL3d> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL3dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL3dv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL3i64NV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL3i64vNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL3ui64NV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL3ui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL4dEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL4d> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL4dvEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL4dv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL4i64NV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL4i64vNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL4ui64NV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribL4ui64vNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribLFormat> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribLFormatNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribLPointerEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribLPointer> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribP1ui> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribP1uiv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribP2ui> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribP2uiv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribP3ui> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribP3uiv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribP4ui> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribP4uiv> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribParameteriAMD> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribPointerARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribPointer> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribPointerNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs1dvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs1fvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs1hvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs1svNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs2dvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs2fvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs2hvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs2svNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs3dvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs3fvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs3hvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs3svNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs4dvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs4fvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs4hvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs4svNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexAttribs4ubvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexBindingDivisor> {};\ntemplate<>\nstruct fex_gen_config<glVertexBlendARB> {};\ntemplate<>\nstruct fex_gen_config<glVertexBlendEnvfATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexBlendEnviATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexFormatNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexPointerEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexPointer> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glVertexPointerListIBM> {};\ntemplate<>\nstruct fex_gen_param<glVertexPointerListIBM, 3, const void**> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<glVertexPointervINTEL> {};\ntemplate<>\nstruct fex_gen_param<glVertexPointervINTEL, 2, const void**> : fexgen::assume_compatible_data_layout {};\n#endif\ntemplate<>\nstruct fex_gen_config<glVertexStream1dATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream1dvATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream1fATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream1fvATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream1iATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream1ivATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream1sATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream1svATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream2dATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream2dvATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream2fATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream2fvATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream2iATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream2ivATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream2sATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream2svATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream3dATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream3dvATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream3fATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream3fvATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream3iATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream3ivATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream3sATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream3svATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream4dATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream4dvATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream4fATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream4fvATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream4iATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream4ivATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream4sATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexStream4svATI> {};\ntemplate<>\nstruct fex_gen_config<glVertexWeightfEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexWeightfvEXT> {};\ntemplate<>\nstruct fex_gen_config<glVertexWeighthNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexWeighthvNV> {};\ntemplate<>\nstruct fex_gen_config<glVertexWeightPointerEXT> {};\ntemplate<>\nstruct fex_gen_config<glVideoCaptureStreamParameterdvNV> {};\ntemplate<>\nstruct fex_gen_config<glVideoCaptureStreamParameterfvNV> {};\ntemplate<>\nstruct fex_gen_config<glVideoCaptureStreamParameterivNV> {};\ntemplate<>\nstruct fex_gen_config<glViewportArrayv> {};\ntemplate<>\nstruct fex_gen_config<glViewport> {};\ntemplate<>\nstruct fex_gen_config<glViewportIndexedf> {};\ntemplate<>\nstruct fex_gen_config<glViewportIndexedfv> {};\ntemplate<>\nstruct fex_gen_config<glViewportPositionWScaleNV> {};\ntemplate<>\nstruct fex_gen_config<glViewportSwizzleNV> {};\ntemplate<>\nstruct fex_gen_config<glWaitSemaphoreEXT> {};\ntemplate<>\nstruct fex_gen_config<glWaitSemaphoreui64NVX> {};\ntemplate<>\nstruct fex_gen_config<glWaitSync> {};\ntemplate<>\nstruct fex_gen_config<glWaitVkSemaphoreNV> {};\ntemplate<>\nstruct fex_gen_config<glWeightbvARB> {};\ntemplate<>\nstruct fex_gen_config<glWeightdvARB> {};\ntemplate<>\nstruct fex_gen_config<glWeightfvARB> {};\ntemplate<>\nstruct fex_gen_config<glWeightivARB> {};\ntemplate<>\nstruct fex_gen_config<glWeightPathsNV> {};\ntemplate<>\nstruct fex_gen_config<glWeightPointerARB> {};\ntemplate<>\nstruct fex_gen_config<glWeightsvARB> {};\ntemplate<>\nstruct fex_gen_config<glWeightubvARB> {};\ntemplate<>\nstruct fex_gen_config<glWeightuivARB> {};\ntemplate<>\nstruct fex_gen_config<glWeightusvARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2dARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2dMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2dvARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2dvMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2fARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2fMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2fvARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2fvMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2iARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2iMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2ivARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2ivMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2sARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2sMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2svARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos2svMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3dARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3dMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3dvARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3dvMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3fARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3fMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3fvARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3fvMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3iARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3iMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3ivARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3ivMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3sARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3sMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3svARB> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos3svMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos4dMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos4dvMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos4fMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos4fvMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos4iMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos4ivMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos4sMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowPos4svMESA> {};\ntemplate<>\nstruct fex_gen_config<glWindowRectanglesEXT> {};\ntemplate<>\nstruct fex_gen_config<glWriteMaskEXT> {};\n\n// GLext.h\n// template<> struct fex_gen_config<glGetVkProcAddrNV> : fexgen::custom_guest_entrypoint, fexgen::returns_guest_pointer{};\ntemplate<>\nstruct fex_gen_config<glPathColorGenNV> {};\ntemplate<>\nstruct fex_gen_config<glPathTexGenNV> {};\ntemplate<>\nstruct fex_gen_config<glPathFogGenNV> {};\ntemplate<>\nstruct fex_gen_config<glGetPathColorGenivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetPathColorGenfvNV> {};\ntemplate<>\nstruct fex_gen_config<glGetPathTexGenivNV> {};\ntemplate<>\nstruct fex_gen_config<glGetPathTexGenfvNV> {};\ntemplate<>\nstruct fex_gen_config<glBlendEquationSeparateATI> {};\n\n// glx.h\ntemplate<>\nstruct fex_gen_config<glXWaitX> {};\n#ifdef GLX_ARB_render_texture\ntemplate<>\nstruct fex_gen_config<glXBindTexImageARB> {};\ntemplate<>\nstruct fex_gen_config<glXReleaseTexImageARB> {};\ntemplate<>\nstruct fex_gen_config<glXDrawableAttribARB> {};\n#endif\n#ifdef GLX_MESA_swap_frame_usage\ntemplate<>\nstruct fex_gen_config<glXGetFrameUsageMESA> {};\ntemplate<>\nstruct fex_gen_config<glXBeginFrameTrackingMESA> {};\ntemplate<>\nstruct fex_gen_config<glXEndFrameTrackingMESA> {};\ntemplate<>\nstruct fex_gen_config<glXQueryFrameTrackingMESA> {};\n#endif\n\n// glxext.h\ntemplate<>\nstruct fex_gen_config<glXGetGPUIDsAMD> {};\ntemplate<>\nstruct fex_gen_config<glXGetGPUInfoAMD> {};\ntemplate<>\nstruct fex_gen_config<glXGetContextGPUIDAMD> {};\ntemplate<>\nstruct fex_gen_config<glXCreateAssociatedContextAMD> {};\ntemplate<>\nstruct fex_gen_config<glXCreateAssociatedContextAttribsAMD> {};\ntemplate<>\nstruct fex_gen_config<glXDeleteAssociatedContextAMD> {};\ntemplate<>\nstruct fex_gen_config<glXMakeAssociatedContextCurrentAMD> {};\ntemplate<>\nstruct fex_gen_config<glXGetCurrentAssociatedContextAMD> {};\ntemplate<>\nstruct fex_gen_config<glXBlitContextFramebufferAMD> {};\ntemplate<>\nstruct fex_gen_config<glXGetCurrentDisplayEXT> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glXGetCurrentDisplayEXT, -1, _XDisplay*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glXGetAGPOffsetMESA> {};\ntemplate<>\nstruct fex_gen_config<glXCreateGLXPixmapMESA> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<glXCreateGLXPixmapMESA, 1, XVisualInfo*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<glXReleaseBuffersMESA> {};\ntemplate<>\nstruct fex_gen_config<glXSet3DfxModeMESA> {};\ntemplate<>\nstruct fex_gen_config<glXCopyBufferSubDataNV> {};\ntemplate<>\nstruct fex_gen_config<glXNamedCopyBufferSubDataNV> {};\ntemplate<>\nstruct fex_gen_config<glXCopyImageSubDataNV> {};\ntemplate<>\nstruct fex_gen_config<glXDelayBeforeSwapNV> {};\ntemplate<>\nstruct fex_gen_config<glXEnumerateVideoDevicesNV> {}; // TODO: Custom host impl\ntemplate<>\nstruct fex_gen_config<glXBindVideoDeviceNV> {};\ntemplate<>\nstruct fex_gen_config<glXJoinSwapGroupNV> {};\ntemplate<>\nstruct fex_gen_config<glXBindSwapBarrierNV> {};\ntemplate<>\nstruct fex_gen_config<glXQuerySwapGroupNV> {};\ntemplate<>\nstruct fex_gen_config<glXQueryMaxSwapGroupsNV> {};\ntemplate<>\nstruct fex_gen_config<glXQueryFrameCountNV> {};\ntemplate<>\nstruct fex_gen_config<glXResetFrameCountNV> {};\ntemplate<>\nstruct fex_gen_config<glXBindVideoCaptureDeviceNV> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glXEnumerateVideoCaptureDevicesNV> {};\n#endif\ntemplate<>\nstruct fex_gen_config<glXLockVideoCaptureDeviceNV> {};\ntemplate<>\nstruct fex_gen_config<glXQueryVideoCaptureDeviceNV> {};\ntemplate<>\nstruct fex_gen_config<glXReleaseVideoCaptureDeviceNV> {};\ntemplate<>\nstruct fex_gen_config<glXGetVideoDeviceNV> {};\ntemplate<>\nstruct fex_gen_config<glXReleaseVideoDeviceNV> {};\ntemplate<>\nstruct fex_gen_config<glXBindVideoImageNV> {};\ntemplate<>\nstruct fex_gen_config<glXReleaseVideoImageNV> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glXSendPbufferToVideoNV> {};\ntemplate<>\nstruct fex_gen_config<glXGetVideoInfoNV> {};\n#endif\ntemplate<>\nstruct fex_gen_config<glXQueryHyperpipeNetworkSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXHyperpipeConfigSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXQueryHyperpipeConfigSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXDestroyHyperpipeConfigSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXBindHyperpipeSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXQueryHyperpipeBestAttribSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXHyperpipeAttribSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXQueryHyperpipeAttribSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXBindSwapBarrierSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXQueryMaxSwapBarriersSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXJoinSwapGroupSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXBindChannelToWindowSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXChannelRectSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXQueryChannelRectSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXQueryChannelDeltasSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXChannelRectSyncSGIX> {};\ntemplate<>\nstruct fex_gen_config<glXCushionSGI> {};\n#ifndef IS_32BIT_THUNK\n// TODO: 32-bit support\ntemplate<>\nstruct fex_gen_config<glXGetTransparentIndexSUN> {};\n#endif\n} // namespace internal\n"
  },
  {
    "path": "ThunkLibs/libSDL2/libSDL2_Guest.cpp",
    "content": "/*\n$info$\ntags: thunklibs|SDL2\ndesc: Handles sdlglproc, dload, stubs a few log fns\n$end_info$\n*/\n\n#include <SDL2/SDL.h>\n#include <SDL2/SDL_syswm.h>\n\n#include <GL/glx.h>\n#include <dlfcn.h>\n\n#include <stdio.h>\n#include <cstring>\n#include <map>\n#include <string>\n#include <stdarg.h>\n\n#include \"common/Guest.h\"\n\n#include \"thunkgen_guest_libSDL2.inl\"\n\nLOAD_LIB(libSDL2)\n\n#include <vector>\n\nstruct __va_list_tag;\n\n\nint SDL_snprintf(char*, size_t, const char*, ...) {\n  return printf(\"SDL2: SDL_snprintf\\n\");\n}\nint SDL_sscanf(const char*, const char*, ...) {\n  return printf(\"SDL2: SDL_sscanf\\n\");\n}\nvoid SDL_Log(const char*, ...) {\n  printf(\"SDL2: SDL_Log\\n\");\n}\nvoid SDL_LogCritical(int, const char*, ...) {\n  printf(\"SDL2: SDL_LogCritical\\n\");\n}\nvoid SDL_LogDebug(int, const char*, ...) {\n  printf(\"SDL2: SDL_LogDebug\\n\");\n}\nvoid SDL_LogError(int, const char*, ...) {\n  printf(\"SDL2: SDL_LogError\\n\");\n}\nvoid SDL_LogInfo(int, const char*, ...) {\n  printf(\"SDL2: SDL_LogInfo\\n\");\n}\nvoid SDL_LogMessage(int, SDL_LogPriority, const char*, ...) {\n  printf(\"SDL2: SDL_LogMessage\\n\");\n}\nvoid SDL_LogVerbose(int, const char*, ...) {\n  printf(\"SDL2: SDL_LogVerbose\\n\");\n}\nvoid SDL_LogWarn(int, const char*, ...) {\n  printf(\"SDL2: SDL_LogWarn\\n\");\n}\nint SDL_SetError(const char*, ...) {\n  return printf(\"SDL2: SDL_SetError\\n\");\n}\n\nvoid SDL_LogMessageV(int, SDL_LogPriority, const char*, __va_list_tag*) {\n  printf(\"SDL2: SDL_LogMessageV\\n\");\n}\nint SDL_vsnprintf(char*, size_t, const char*, __va_list_tag*) {\n  return printf(\"SDL2: SDL_vsnprintf\\n\");\n}\nint SDL_vsscanf(const char*, const char*, __va_list_tag*) {\n  return printf(\"SDL2: SDL_vsscanf\\n\");\n}\n\nextern \"C\" {\nvoid* SDL_GL_GetProcAddress(const char* name) {\n  // TODO: Fix this HACK\n  return (void*)glXGetProcAddress((const GLubyte*)name);\n}\n\n// TODO: These are not 100% conforming to SDL either\nvoid* SDL_LoadObject(const char* sofile) {\n  auto lib = dlopen(sofile, RTLD_NOW | RTLD_LOCAL);\n  if (!lib) {\n    printf(\"SDL_LoadObject: Failed to load %s\\n\", sofile);\n  }\n  return lib;\n}\n\nvoid* SDL_LoadFunction(void* lib, const char* name) {\n  return dlsym(lib, name);\n}\n\nvoid SDL_UnloadObject(void* lib) {\n  if (lib) {\n    dlclose(lib);\n  }\n}\n}\n"
  },
  {
    "path": "ThunkLibs/libSDL2/libSDL2_Host.cpp",
    "content": "/*\n$info$\ntags: thunklibs|SDL2\n$end_info$\n*/\n\n#include <stdio.h>\n\n#include <SDL2/SDL.h>\n#include <SDL2/SDL_syswm.h>\n\n#include \"common/Host.h\"\n#include <dlfcn.h>\n\n#include \"thunkgen_host_libSDL2.inl\"\n\nEXPORTS(libSDL2)\n"
  },
  {
    "path": "ThunkLibs/libVDSO/Types.h",
    "content": "#pragma once\n#include <cstdint>\n\nstruct timespec64 {\n  int64_t tv_sec;\n  int64_t tv_nsec;\n};\n"
  },
  {
    "path": "ThunkLibs/libVDSO/libVDSO_Guest.cpp",
    "content": "\n/*\n$info$\ntags: thunklibs|VDSO\ndesc: Linux VDSO thunking\n$end_info$\n*/\n\n#include <stdio.h>\n#include <cstring>\n\n#include <sched.h>\n#include <sys/time.h>\n#include <time.h>\n\n#include \"Types.h\"\n#include \"common/Guest.h\"\n\n#include \"thunkgen_guest_libVDSO.inl\"\n\nextern \"C\" {\ntime_t __vdso_time(time_t* tloc) __attribute__((alias(\"fexfn_pack_time\")));\nint __vdso_gettimeofday(struct timeval* tv, struct timezone* tz) __attribute__((alias(\"fexfn_pack_gettimeofday\")));\nint __vdso_clock_gettime(clockid_t, struct timespec*) __attribute__((alias(\"fexfn_pack_clock_gettime\")));\nint __vdso_clock_getres(clockid_t, struct timespec*) __attribute__((alias(\"fexfn_pack_clock_getres\")));\nint __vdso_getcpu(uint32_t*, uint32_t*) __attribute__((alias(\"fexfn_pack_getcpu\")));\n\n#if __SIZEOF_POINTER__ == 4\nint __vdso_clock_gettime64(clockid_t, struct timespec64*) __attribute__((alias(\"fexfn_pack_clock_gettime64\")));\n\n__attribute__((naked)) int __kernel_vsyscall() {\n  asm volatile(R\"(\n  .intel_syntax noprefix\n  int 0x80;\n  ret;\n  .att_syntax prefix\n  )\" ::\n                 : \"memory\");\n}\n\n__attribute__((naked)) void __kernel_sigreturn() {\n  asm volatile(R\"(\n  .intel_syntax noprefix\n  pop eax;\n  mov eax, 0x77;\n  int 0x80;\n  nop;\n  .att_syntax prefix\n  )\" ::\n                 : \"memory\");\n}\n__attribute__((naked)) void __kernel_rt_sigreturn() {\n  asm volatile(R\"(\n  .intel_syntax noprefix\n  mov eax, 0xad;\n  int 0x80;\n  .att_syntax prefix\n  )\" ::\n                 : \"memory\");\n}\n#else\nssize_t __vdso_getrandom(void*, size_t, uint32_t, void*, size_t) __attribute__((alias(\"fexfn_pack_getrandom\")));\n#endif\n\n__attribute__((naked)) void __fex_callback_ret() {\n  // CALLBACKRET FEX Instruction\n  asm volatile(R\"(\n  .byte 0x0f, 0x3e;\n  )\" ::\n                 : \"memory\");\n}\n}\n"
  },
  {
    "path": "ThunkLibs/libVDSO/libVDSO_Guest.lds",
    "content": "SECTIONS {\n  . = SIZEOF_HEADERS;\n  .hash : { *(.hash) } :text\n  .gnu.hash : { *(.gnu.hash) }\n  .dynsym : { *(.dynsym) }\n  .dynstr : { *(.dynstr) }\n  .gnu.version : { *(.gnu.version) }\n  .gnu.version_d : { *(.gnu.version_d) }\n  .gnu.version_r : { *(.gnu.version_r) }\n  .dynamic : { *(.dynamic) } :text :dynamic\n  .rodata : {\n    *(.rodata*)\n      *(.data*)\n      *(.sdata*)\n      *(.got.plt) *(.got)\n      *(.gnu.linkonce.d.*)\n      *(.bss*)\n      *(.dynbss*)\n      *(.gnu.linkonce.b.*)\n  } :text\n\n  /DISCARD/ : {\n    *(.note)\n    *(.note.gnu.property)\n    *(.eh_frame_hdr)\n    *(.eh_frame)\n    *(.symtab)\n  }\n}\n\nPHDRS {\n  text PT_LOAD FLAGS(4 | 1) FILEHDR PHDRS;\n  dynamic PT_DYNAMIC FLAGS(4);\n  note PT_NOTE FLAGS(4);\n}\n\nVERSION {\n  LINUX_2.6 {\n  global:\n    __vdso_time;\n    time;\n    __vdso_gettimeofday;\n    gettimeofday;\n    __vdso_clock_gettime;\n    clock_gettime;\n    __vdso_clock_getres;\n    clock_getres;\n    __vdso_getcpu;\n    getcpu;\n    __vdso_getrandom;\n    getrandom;\n    __fex_callback_ret;\n  local: *;\n  };\n}\n"
  },
  {
    "path": "ThunkLibs/libVDSO/libVDSO_Guest_32.lds",
    "content": "SECTIONS {\n  . = SIZEOF_HEADERS;\n  .hash : { *(.hash) } :text\n  .gnu.hash : { *(.gnu.hash) }\n  .dynsym : { *(.dynsym) }\n  .dynstr : { *(.dynstr) }\n  .gnu.version : { *(.gnu.version) }\n  .gnu.version_d : { *(.gnu.version_d) }\n  .gnu.version_r : { *(.gnu.version_r) }\n  .dynamic : { *(.dynamic) } :text :dynamic\n  .rodata : {\n    *(.rodata*)\n      *(.data*)\n      *(.sdata*)\n      *(.got.plt) *(.got)\n      *(.gnu.linkonce.d.*)\n      *(.bss*)\n      *(.dynbss*)\n      *(.gnu.linkonce.b.*)\n  } :text\n\n  /DISCARD/ : {\n    *(.note)\n    *(.note.gnu.property)\n    *(.eh_frame_hdr)\n    *(.eh_frame)\n    *(.symtab)\n  }\n}\n\nPHDRS {\n  text PT_LOAD FLAGS(4 | 1) FILEHDR PHDRS;\n  dynamic PT_DYNAMIC FLAGS(4);\n  note PT_NOTE FLAGS(4);\n}\n\nVERSION {\n  LINUX_2.6 {\n  global:\n    __vdso_time;\n    time;\n    __vdso_gettimeofday;\n    gettimeofday;\n    __vdso_clock_gettime;\n    clock_gettime;\n    __vdso_clock_getres;\n    clock_getres;\n    __vdso_getcpu;\n    getcpu;\n    __vdso_clock_gettime64;\n    clock_gettime64;\n    __fex_callback_ret;\n  local: *;\n  };\n  LINUX_2.5 {\n  global:\n    __kernel_vsyscall;\n    __kernel_sigreturn;\n    __kernel_rt_sigreturn;\n  local: *;\n  };\n}\n"
  },
  {
    "path": "ThunkLibs/libVDSO/libVDSO_interface.cpp",
    "content": "#include <common/GeneratorInterface.h>\n\n#include <sched.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <time.h>\n\n#include \"Types.h\"\n\ntemplate<auto>\nstruct fex_gen_config {};\n\ntemplate<>\nstruct fex_gen_config<time> {};\ntemplate<>\nstruct fex_gen_config<gettimeofday> {};\ntemplate<>\nstruct fex_gen_config<clock_gettime> {};\ntemplate<>\nstruct fex_gen_config<clock_getres> {};\ntemplate<>\nstruct fex_gen_config<getcpu> {};\n\n#if __SIZEOF_POINTER__ == 4\nextern int clock_gettime64(clockid_t __clock_id, struct timespec64* __tp) __THROW;\ntemplate<>\nstruct fex_gen_config<clock_gettime64> {};\n#else\nextern ssize_t getrandom(void* buffer, size_t len, uint32_t flags, void* opaque_state, size_t opaque_len);\ntemplate<>\nstruct fex_gen_config<getrandom> {};\n#endif\n"
  },
  {
    "path": "ThunkLibs/libX11/libX11_NativeGuest.cpp",
    "content": "// This file only exists to create a placeholder library to link against for\n// libraries that are supposed to implicitly load libX11. At runtime, the guest\n// linker will select the library from the RootFS instead, which is then\n// replaced by libX11-guest.so.\n\n// Define some symbol so that the linker doesn't consider this library unused\nextern \"C\" void XSetErrorHandler() {}\n"
  },
  {
    "path": "ThunkLibs/libasound/libasound_Guest.cpp",
    "content": "/*\n$info$\ntags: thunklibs|asound\n$end_info$\n*/\n\nextern \"C\" {\n#include <alsa/asoundlib.h>\n}\n\n#include <stdio.h>\n#include <cstring>\n#include <map>\n#include <string>\n\n#include \"common/Guest.h\"\n#include <stdarg.h>\n\n#include \"thunkgen_guest_libasound.inl\"\n\nLOAD_LIB(libasound)\n"
  },
  {
    "path": "ThunkLibs/libasound/libasound_Host.cpp",
    "content": "/*\n$info$\ntags: thunklibs|asound\n$end_info$\n*/\n\n#include <stdio.h>\n\n#include <alsa/asoundlib.h>\n\n#include \"common/Host.h\"\n#include <dlfcn.h>\n\n#include \"thunkgen_host_libasound.inl\"\n\nEXPORTS(libasound)\n"
  },
  {
    "path": "ThunkLibs/libasound/libasound_interface.cpp",
    "content": "#include <common/GeneratorInterface.h>\n\n#include <alsa/asoundlib.h>\n#include <alsa/version.h>\n\n#include <type_traits>\n\ntemplate<auto>\nstruct fex_gen_config {\n  unsigned version = 2;\n};\n\n// Function, parameter index, parameter type [optional]\ntemplate<auto, int, typename = void>\nstruct fex_gen_param {};\n\ntemplate<typename>\nstruct fex_gen_type {};\n\ntemplate<>\nstruct fex_gen_type<snd_pcm_status_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_shm_area> : fexgen::opaque_type {};\n\ntemplate<>\nstruct fex_gen_type<snd_async_handler_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<std::remove_pointer_t<snd_config_iterator_t>> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_config_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_config_update_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_ctl_card_info_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_ctl_elem_id_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_ctl_elem_info_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_ctl_elem_list_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_ctl_elem_value_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_ctl_event_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_ctl_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_devname_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_hctl_elem_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_hctl_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_hwdep_dsp_image_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_hwdep_dsp_status_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_hwdep_info_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_hwdep_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_input_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_midi_event_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_mixer_class_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_mixer_elem_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_mixer_selem_id_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_mixer_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_output_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_pcm_access_mask_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_pcm_format_mask_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_pcm_hook_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_pcm_hw_params_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_pcm_info_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_pcm_scope_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_pcm_subformat_mask_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_pcm_sw_params_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_pcm_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_rawmidi_info_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_rawmidi_params_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_rawmidi_status_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_rawmidi_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_sctl_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_seq_client_info_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_seq_client_pool_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_seq_ev_ext_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_seq_port_info_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_seq_port_subscribe_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_seq_query_subscribe_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_seq_queue_info_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_seq_queue_status_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_seq_queue_tempo_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_seq_queue_timer_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_seq_remove_events_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_seq_system_info_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_seq_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_timer_ginfo_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_timer_gparams_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_timer_gstatus_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_timer_id_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_timer_info_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_timer_params_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_timer_query_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_timer_status_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_timer_t> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<snd_timestamp_t> : fexgen::opaque_type {};\n\ntemplate<>\nstruct fex_gen_type<FILE> : fexgen::opaque_type {};\n\n// Union types with compatible data layout\ntemplate<>\nstruct fex_gen_type<snd_pcm_sync_id_t> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_type<snd_seq_timestamp> : fexgen::assume_compatible_data_layout {};\n// Has anonymous union member\ntemplate<>\nstruct fex_gen_type<snd_seq_event> : fexgen::assume_compatible_data_layout {};\n\n#ifndef IS_32BIT_THUNK\n// TODO: Convert vtable\ntemplate<>\nstruct fex_gen_type<snd_pcm_scope_ops_t> : fexgen::assume_compatible_data_layout {};\n#endif\n\ntemplate<>\nstruct fex_gen_config<snd_asoundlib_version> {};\n#if SND_LIB_VERSION < ((1 << 16) | (2 << 8) | (6))\n// Exists on 1.2.6\nint snd_dlpath(char* path, size_t path_len, const char* name);\n#endif\ntemplate<>\nstruct fex_gen_config<snd_dlpath> {};\ntemplate<>\nstruct fex_gen_config<snd_dlopen> {};\ntemplate<>\nstruct fex_gen_config<snd_dlsym> {};\ntemplate<>\nstruct fex_gen_config<snd_dlclose> {};\n// template<> struct fex_gen_config<snd_async_add_handler> {};\n// template<> struct fex_gen_config<snd_async_del_handler> {};\n// template<> struct fex_gen_config<snd_async_handler_get_fd> {};\n// template<> struct fex_gen_config<snd_async_handler_get_signo> {};\n// template<> struct fex_gen_config<snd_async_handler_get_callback_private> {};\ntemplate<>\nstruct fex_gen_config<snd_shm_area_create> {};\ntemplate<>\nstruct fex_gen_config<snd_shm_area_share> {};\ntemplate<>\nstruct fex_gen_config<snd_shm_area_destroy> {};\ntemplate<>\nstruct fex_gen_config<snd_user_file> {};\ntemplate<>\nstruct fex_gen_config<snd_input_stdio_open> {};\ntemplate<>\nstruct fex_gen_config<snd_input_stdio_attach> {};\ntemplate<>\nstruct fex_gen_config<snd_input_buffer_open> {};\ntemplate<>\nstruct fex_gen_config<snd_input_close> {};\ntemplate<>\nstruct fex_gen_config<snd_input_gets> {};\ntemplate<>\nstruct fex_gen_config<snd_input_getc> {};\ntemplate<>\nstruct fex_gen_config<snd_input_ungetc> {};\ntemplate<>\nstruct fex_gen_config<snd_output_stdio_open> {};\ntemplate<>\nstruct fex_gen_config<snd_output_stdio_attach> {};\ntemplate<>\nstruct fex_gen_config<snd_output_buffer_open> {};\ntemplate<>\nstruct fex_gen_config<snd_output_buffer_string> {};\ntemplate<>\nstruct fex_gen_config<snd_output_close> {};\ntemplate<>\nstruct fex_gen_config<snd_output_puts> {};\ntemplate<>\nstruct fex_gen_config<snd_output_putc> {};\ntemplate<>\nstruct fex_gen_config<snd_output_flush> {};\ntemplate<>\nstruct fex_gen_config<snd_strerror> {};\n// Variadic callback not supported\ntemplate<>\nstruct fex_gen_config<snd_lib_error_set_handler> : fexgen::callback_stub {};\n// template<> struct fex_gen_config<snd_lib_error_set_local> {};\ntemplate<>\nstruct fex_gen_config<snd_config_topdir> {};\ntemplate<>\nstruct fex_gen_config<snd_config_top> {};\ntemplate<>\nstruct fex_gen_config<snd_config_load> {};\ntemplate<>\nstruct fex_gen_config<snd_config_load_override> {};\ntemplate<>\nstruct fex_gen_config<snd_config_save> {};\ntemplate<>\nstruct fex_gen_config<snd_config_update> {};\ntemplate<>\nstruct fex_gen_config<snd_config_update_r> {};\ntemplate<>\nstruct fex_gen_config<snd_config_update_free> {};\ntemplate<>\nstruct fex_gen_config<snd_config_update_free_global> {};\ntemplate<>\nstruct fex_gen_config<snd_config_update_ref> {};\ntemplate<>\nstruct fex_gen_config<snd_config_ref> {};\ntemplate<>\nstruct fex_gen_config<snd_config_unref> {};\ntemplate<>\nstruct fex_gen_config<snd_config_search> {};\ntemplate<>\nstruct fex_gen_config<snd_config_search_definition> {};\ntemplate<>\nstruct fex_gen_config<snd_config_expand> {};\ntemplate<>\nstruct fex_gen_config<snd_config_evaluate> {};\ntemplate<>\nstruct fex_gen_config<snd_config_add> {};\ntemplate<>\nstruct fex_gen_config<snd_config_add_before> {};\ntemplate<>\nstruct fex_gen_config<snd_config_add_after> {};\ntemplate<>\nstruct fex_gen_config<snd_config_remove> {};\ntemplate<>\nstruct fex_gen_config<snd_config_delete> {};\ntemplate<>\nstruct fex_gen_config<snd_config_delete_compound_members> {};\ntemplate<>\nstruct fex_gen_config<snd_config_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_config_make> {};\ntemplate<>\nstruct fex_gen_config<snd_config_make_integer> {};\ntemplate<>\nstruct fex_gen_config<snd_config_make_integer64> {};\ntemplate<>\nstruct fex_gen_config<snd_config_make_real> {};\ntemplate<>\nstruct fex_gen_config<snd_config_make_string> {};\ntemplate<>\nstruct fex_gen_config<snd_config_make_pointer> {};\ntemplate<>\nstruct fex_gen_config<snd_config_make_compound> {};\n// template<> struct fex_gen_config<snd_config_imake_integer> {};\n// template<> struct fex_gen_config<snd_config_imake_integer64> {};\n// template<> struct fex_gen_config<snd_config_imake_real> {};\ntemplate<>\nstruct fex_gen_config<snd_config_imake_string> {};\ntemplate<>\nstruct fex_gen_config<snd_config_imake_safe_string> {};\ntemplate<>\nstruct fex_gen_config<snd_config_imake_pointer> {};\ntemplate<>\nstruct fex_gen_config<snd_config_get_type> {};\ntemplate<>\nstruct fex_gen_config<snd_config_is_array> {};\ntemplate<>\nstruct fex_gen_config<snd_config_set_id> {};\ntemplate<>\nstruct fex_gen_config<snd_config_set_integer> {};\ntemplate<>\nstruct fex_gen_config<snd_config_set_integer64> {};\ntemplate<>\nstruct fex_gen_config<snd_config_set_real> {};\ntemplate<>\nstruct fex_gen_config<snd_config_set_string> {};\ntemplate<>\nstruct fex_gen_config<snd_config_set_ascii> {};\ntemplate<>\nstruct fex_gen_config<snd_config_set_pointer> {};\ntemplate<>\nstruct fex_gen_config<snd_config_get_id> {};\ntemplate<>\nstruct fex_gen_config<snd_config_get_integer> {};\ntemplate<>\nstruct fex_gen_config<snd_config_get_integer64> {};\ntemplate<>\nstruct fex_gen_config<snd_config_get_real> {};\ntemplate<>\nstruct fex_gen_config<snd_config_get_ireal> {};\ntemplate<>\nstruct fex_gen_config<snd_config_get_string> {};\ntemplate<>\nstruct fex_gen_config<snd_config_get_ascii> {};\ntemplate<>\nstruct fex_gen_config<snd_config_get_pointer> {};\ntemplate<>\nstruct fex_gen_config<snd_config_test_id> {};\ntemplate<>\nstruct fex_gen_config<snd_config_iterator_first> {};\n// template<> struct fex_gen_config<snd_config_iterator_next> {};\ntemplate<>\nstruct fex_gen_config<snd_config_iterator_end> {};\n// template<> struct fex_gen_config<snd_config_iterator_entry> {};\ntemplate<>\nstruct fex_gen_config<snd_config_get_bool_ascii> {};\ntemplate<>\nstruct fex_gen_config<snd_config_get_bool> {};\ntemplate<>\nstruct fex_gen_config<snd_config_get_ctl_iface_ascii> {};\ntemplate<>\nstruct fex_gen_config<snd_config_get_ctl_iface> {};\ntemplate<>\nstruct fex_gen_config<snd_names_list> {};\ntemplate<>\nstruct fex_gen_config<snd_names_list_free> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_open> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_open_lconf> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_open_fallback> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_close> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_name> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_type> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_stream> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_poll_descriptors_count> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_poll_descriptors> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_poll_descriptors_revents> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_nonblock> {};\n// template<> struct fex_gen_config<snd_async_add_pcm_handler> {};\ntemplate<>\nstruct fex_gen_config<snd_async_handler_get_pcm> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_current> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_free> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_current> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_prepare> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_reset> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_start> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_drop> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_drain> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_pause> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_state> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hwsync> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_delay> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_resume> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_htimestamp> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_avail> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_avail_update> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_avail_delay> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_rewindable> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_rewind> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_forwardable> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_forward> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_writei> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_readi> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_writen> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_readn> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_wait> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_link> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_unlink> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_query_chmaps> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_query_chmaps_from_hw> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_free_chmaps> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_get_chmap> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_set_chmap> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_chmap_type_name> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_chmap_name> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_chmap_long_name> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_chmap_print> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_chmap_from_string> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_chmap_parse_string> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_recover> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_set_params> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_get_params> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_free> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_get_device> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_get_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_get_stream> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_get_card> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_get_id> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_get_subdevice_name> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_get_class> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_get_subclass> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_get_subdevices_count> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_get_subdevices_avail> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_get_sync> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_set_device> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_set_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_info_set_stream> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_any> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_can_mmap_sample_resolution> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_is_double> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_is_batch> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_is_block_transfer> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_is_monotonic> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_can_overrange> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_can_pause> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_can_resume> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_is_half_duplex> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_is_joint_duplex> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_can_sync_start> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_can_disable_period_wakeup> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_supports_audio_wallclock_ts> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_supports_audio_ts_type> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_rate_numden> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_sbits> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_fifo_size> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_free> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_access> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_test_access> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_access> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_access_first> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_access_last> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_access_mask> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_access_mask> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_format> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_test_format> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_format> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_format_first> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_format_last> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_format_mask> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_format_mask> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_subformat> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_test_subformat> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_subformat> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_subformat_first> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_subformat_last> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_subformat_mask> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_subformat_mask> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_channels> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_channels_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_channels_max> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_test_channels> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_channels> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_channels_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_channels_max> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_channels_minmax> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_channels_near> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_channels_first> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_channels_last> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_rate> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_rate_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_rate_max> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_test_rate> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_rate> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_rate_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_rate_max> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_rate_minmax> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_rate_near> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_rate_first> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_rate_last> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_rate_resample> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_rate_resample> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_export_buffer> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_export_buffer> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_wakeup> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_period_wakeup> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_period_time> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_period_time_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_period_time_max> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_test_period_time> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_time> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_time_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_time_max> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_time_minmax> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_time_near> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_time_first> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_time_last> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_period_size> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_period_size_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_period_size_max> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_test_period_size> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_size> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_size_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_size_max> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_size_minmax> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_size_near> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_size_first> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_size_last> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_period_size_integer> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_periods> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_periods_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_periods_max> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_test_periods> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_periods> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_periods_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_periods_max> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_periods_minmax> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_periods_near> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_periods_first> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_periods_last> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_periods_integer> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_buffer_time> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_buffer_time_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_buffer_time_max> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_test_buffer_time> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_buffer_time> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_buffer_time_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_buffer_time_max> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_buffer_time_minmax> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_buffer_time_near> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_buffer_time_first> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_buffer_time_last> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_buffer_size> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_buffer_size_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_buffer_size_max> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_test_buffer_size> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_buffer_size> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_buffer_size_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_buffer_size_max> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_buffer_size_minmax> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_buffer_size_near> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_buffer_size_first> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_set_buffer_size_last> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_get_min_align> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_free> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_get_boundary> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_set_tstamp_mode> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_get_tstamp_mode> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_set_tstamp_type> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_get_tstamp_type> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_set_avail_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_get_avail_min> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_set_period_event> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_get_period_event> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_set_start_threshold> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_get_start_threshold> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_set_stop_threshold> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_get_stop_threshold> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_set_silence_threshold> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_get_silence_threshold> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_set_silence_size> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_get_silence_size> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_access_mask_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_access_mask_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_access_mask_free> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_access_mask_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_access_mask_none> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_access_mask_any> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_access_mask_test> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_access_mask_empty> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_access_mask_set> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_access_mask_reset> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_mask_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_mask_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_mask_free> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_mask_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_mask_none> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_mask_any> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_mask_test> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_mask_empty> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_mask_set> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_mask_reset> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_subformat_mask_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_subformat_mask_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_subformat_mask_free> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_subformat_mask_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_subformat_mask_none> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_subformat_mask_any> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_subformat_mask_test> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_subformat_mask_empty> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_subformat_mask_set> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_subformat_mask_reset> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_free> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_get_state> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_get_trigger_tstamp> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_get_trigger_htstamp> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_get_tstamp> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_get_htstamp> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_get_audio_htstamp> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_get_driver_htstamp> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_get_audio_htstamp_report> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_set_audio_htstamp_config> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_get_delay> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_get_avail> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_get_avail_max> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_get_overrange> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_type_name> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_stream_name> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_access_name> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_name> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_description> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_subformat_name> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_subformat_description> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_value> {};\n// template<> struct fex_gen_config<snd_pcm_tstamp_mode_name> {};\n// template<> struct fex_gen_config<snd_pcm_state_name> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_dump> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_dump_hw_setup> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_dump_sw_setup> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_dump_setup> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_hw_params_dump> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_sw_params_dump> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_status_dump> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_mmap_begin> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_mmap_commit> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_mmap_writei> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_mmap_readi> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_mmap_writen> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_mmap_readn> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_signed> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_unsigned> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_linear> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_float> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_little_endian> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_big_endian> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_cpu_endian> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_width> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_physical_width> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_build_linear_format> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_size> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_silence> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_silence_16> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_silence_32> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_silence_64> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_format_set_silence> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_bytes_to_frames> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_frames_to_bytes> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_bytes_to_samples> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_samples_to_bytes> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_area_silence> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_areas_silence> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_area_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_areas_copy> {};\n// template<> struct fex_gen_config<snd_pcm_areas_copy_wrap> {};\n// template<> struct fex_gen_config<snd_pcm_hook_get_pcm> {};\n// template<> struct fex_gen_config<snd_pcm_hook_get_private> {};\n// template<> struct fex_gen_config<snd_pcm_hook_set_private> {};\n// template<> struct fex_gen_config<snd_pcm_hook_add> {};\n// template<> struct fex_gen_config<snd_pcm_hook_remove> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_meter_get_bufsize> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_meter_get_channels> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_meter_get_rate> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_meter_get_now> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_meter_get_boundary> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_meter_add_scope> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_meter_search_scope> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_scope_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_scope_set_ops> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_scope_set_name> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_scope_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_scope_get_callback_private> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_scope_set_callback_private> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_scope_s16_open> {};\ntemplate<>\nstruct fex_gen_config<snd_pcm_scope_s16_get_channel_buffer> {};\ntemplate<>\nstruct fex_gen_config<snd_spcm_init> {};\ntemplate<>\nstruct fex_gen_config<snd_spcm_init_duplex> {};\ntemplate<>\nstruct fex_gen_config<snd_spcm_init_get_params> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_open> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_open_lconf> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_close> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_poll_descriptors_count> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_poll_descriptors> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_poll_descriptors_revents> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_nonblock> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_free> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_get_device> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_get_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_get_stream> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_get_card> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_get_flags> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_get_id> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_get_subdevice_name> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_get_subdevices_count> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_get_subdevices_avail> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_set_device> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_set_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info_set_stream> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_info> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_params_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_params_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_params_free> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_params_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_params_set_buffer_size> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_params_get_buffer_size> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_params_set_avail_min> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_params_get_avail_min> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_params_set_no_active_sensing> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_params_get_no_active_sensing> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_params> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_params_current> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_status_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_status_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_status_free> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_status_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_status_get_tstamp> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_status_get_avail> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_status_get_xruns> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_status> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_drain> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_drop> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_write> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_read> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_name> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_type> {};\ntemplate<>\nstruct fex_gen_config<snd_rawmidi_stream> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_query_open> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_query_open_lconf> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_query_close> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_query_next_device> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_query_info> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_query_params> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_query_status> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_open> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_open_lconf> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_close> {};\n// template<> struct fex_gen_config<snd_async_add_timer_handler> {};\n// template<> struct fex_gen_config<snd_async_handler_get_timer> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_poll_descriptors_count> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_poll_descriptors> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_poll_descriptors_revents> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_info> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_status> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_start> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_stop> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_continue> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_read> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_id_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_id_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_id_free> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_id_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_id_set_class> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_id_get_class> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_id_set_sclass> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_id_get_sclass> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_id_set_card> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_id_get_card> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_id_set_device> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_id_get_device> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_id_set_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_id_get_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_ginfo_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_ginfo_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_ginfo_free> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_ginfo_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_ginfo_set_tid> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_ginfo_get_tid> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_ginfo_get_flags> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_ginfo_get_card> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_ginfo_get_id> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_ginfo_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_ginfo_get_resolution> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_ginfo_get_resolution_min> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_ginfo_get_resolution_max> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_ginfo_get_clients> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_info_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_info_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_info_free> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_info_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_info_is_slave> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_info_get_card> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_info_get_id> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_info_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_info_get_resolution> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_free> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_set_auto_start> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_get_auto_start> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_set_exclusive> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_get_exclusive> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_set_early_event> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_get_early_event> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_set_ticks> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_get_ticks> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_set_queue_size> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_get_queue_size> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_set_filter> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_params_get_filter> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_status_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_status_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_status_free> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_status_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_status_get_timestamp> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_status_get_resolution> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_status_get_lost> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_status_get_overrun> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_status_get_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_timer_info_get_ticks> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_open> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_close> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_poll_descriptors> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_poll_descriptors_count> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_poll_descriptors_revents> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_nonblock> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_info> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_status> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_load> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_ioctl> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_write> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_read> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_info_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_info_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_info_free> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_info_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_info_get_device> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_info_get_card> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_info_get_id> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_info_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_info_get_iface> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_info_set_device> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_status_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_status_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_status_free> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_status_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_status_get_version> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_status_get_id> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_status_get_num_dsps> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_status_get_dsp_loaded> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_status_get_chip_ready> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_image_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_image_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_image_free> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_image_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_image_get_index> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_image_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_image_get_image> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_image_get_length> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_image_set_index> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_image_set_name> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_image_set_image> {};\ntemplate<>\nstruct fex_gen_config<snd_hwdep_dsp_image_set_length> {};\ntemplate<>\nstruct fex_gen_config<snd_card_load> {};\ntemplate<>\nstruct fex_gen_config<snd_card_next> {};\ntemplate<>\nstruct fex_gen_config<snd_card_get_index> {};\ntemplate<>\nstruct fex_gen_config<snd_card_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_card_get_longname> {};\ntemplate<>\nstruct fex_gen_config<snd_device_name_hint> {};\ntemplate<>\nstruct fex_gen_config<snd_device_name_free_hint> {};\ntemplate<>\nstruct fex_gen_config<snd_device_name_get_hint> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_open> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_open_lconf> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_open_fallback> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_close> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_nonblock> {};\n// template<> struct fex_gen_config<snd_async_add_ctl_handler> {};\n// template<> struct fex_gen_config<snd_async_handler_get_ctl> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_poll_descriptors_count> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_poll_descriptors> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_poll_descriptors_revents> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_subscribe_events> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_card_info> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_read> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_write> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_lock> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_unlock> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_tlv_read> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_tlv_write> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_tlv_command> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_hwdep_next_device> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_hwdep_info> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_pcm_next_device> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_pcm_info> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_pcm_prefer_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_rawmidi_next_device> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_rawmidi_info> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_rawmidi_prefer_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_set_power_state> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_get_power_state> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_read> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_wait> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_name> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_type> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_type_name> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_iface_name> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_event_type_name> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_event_elem_get_mask> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_event_elem_get_numid> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_event_elem_get_id> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_event_elem_get_interface> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_event_elem_get_device> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_event_elem_get_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_event_elem_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_event_elem_get_index> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_alloc_space> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_free_space> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_ascii_elem_id_get> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_ascii_elem_id_parse> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_ascii_value_parse> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_free> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_clear> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_get_numid> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_get_interface> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_get_device> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_get_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_get_index> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_set_numid> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_set_interface> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_set_device> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_set_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_set_name> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_id_set_index> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_card_info_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_card_info_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_card_info_free> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_card_info_clear> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_card_info_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_card_info_get_card> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_card_info_get_id> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_card_info_get_driver> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_card_info_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_card_info_get_longname> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_card_info_get_mixername> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_card_info_get_components> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_event_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_event_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_event_free> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_event_clear> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_event_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_event_get_type> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_free> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_clear> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_set_offset> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_get_used> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_get_count> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_get_id> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_get_numid> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_get_interface> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_get_device> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_get_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_list_get_index> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_free> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_clear> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_type> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_is_readable> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_is_writable> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_is_volatile> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_is_inactive> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_is_locked> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_is_tlv_readable> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_is_tlv_writable> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_is_tlv_commandable> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_is_owner> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_is_user> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_owner> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_count> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_min> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_max> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_step> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_min64> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_max64> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_step64> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_items> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_set_item> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_item_name> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_dimensions> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_dimension> {};\n// template<> struct fex_gen_config<snd_ctl_elem_info_set_dimension> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_id> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_numid> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_interface> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_device> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_get_index> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_set_id> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_set_numid> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_set_interface> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_set_device> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_set_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_set_name> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_info_set_index> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_add_integer_elem_set> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_add_integer64_elem_set> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_add_boolean_elem_set> {};\n// template<> struct fex_gen_config<snd_ctl_add_enumerated_elem_set> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_add_bytes_elem_set> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_add_integer> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_add_integer64> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_add_boolean> {};\n// template<> struct fex_gen_config<snd_ctl_elem_add_enumerated> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_add_iec958> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_remove> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_free> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_clear> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_compare> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_get_id> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_get_numid> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_get_interface> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_get_device> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_get_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_get_index> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_set_id> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_set_numid> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_set_interface> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_set_device> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_set_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_set_name> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_set_index> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_get_boolean> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_get_integer> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_get_integer64> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_get_enumerated> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_get_byte> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_set_boolean> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_set_integer> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_set_integer64> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_set_enumerated> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_set_byte> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_set_bytes> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_get_bytes> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_get_iec958> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_elem_value_set_iec958> {};\ntemplate<>\nstruct fex_gen_config<snd_tlv_parse_dB_info> {};\ntemplate<>\nstruct fex_gen_config<snd_tlv_get_dB_range> {};\ntemplate<>\nstruct fex_gen_config<snd_tlv_convert_to_dB> {};\ntemplate<>\nstruct fex_gen_config<snd_tlv_convert_from_dB> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_get_dB_range> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_convert_to_dB> {};\ntemplate<>\nstruct fex_gen_config<snd_ctl_convert_from_dB> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_compare_fast> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_open> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_open_ctl> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_close> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_nonblock> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_poll_descriptors_count> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_poll_descriptors> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_poll_descriptors_revents> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_get_count> {};\n// template<> struct fex_gen_config<snd_hctl_set_compare> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_first_elem> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_last_elem> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_find_elem> {};\n// template<> struct fex_gen_config<snd_hctl_set_callback> {};\n// template<> struct fex_gen_config<snd_hctl_set_callback_private> {};\n// template<> struct fex_gen_config<snd_hctl_get_callback_private> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_load> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_free> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_handle_events> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_name> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_wait> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_ctl> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_next> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_prev> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_info> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_read> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_write> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_tlv_read> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_tlv_write> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_tlv_command> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_get_hctl> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_get_id> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_get_numid> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_get_interface> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_get_device> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_get_subdevice> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_hctl_elem_get_index> {};\n// template<> struct fex_gen_config<snd_hctl_elem_set_callback> {};\n// template<> struct fex_gen_config<snd_hctl_elem_get_callback_private> {};\n// template<> struct fex_gen_config<snd_hctl_elem_set_callback_private> {};\ntemplate<>\nstruct fex_gen_config<snd_sctl_build> {};\ntemplate<>\nstruct fex_gen_config<snd_sctl_free> {};\ntemplate<>\nstruct fex_gen_config<snd_sctl_install> {};\ntemplate<>\nstruct fex_gen_config<snd_sctl_remove> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_open> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_close> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_first_elem> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_last_elem> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_handle_events> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_attach> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_attach_hctl> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_detach> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_detach_hctl> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_get_hctl> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_poll_descriptors_count> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_poll_descriptors> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_poll_descriptors_revents> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_load> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_free> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_wait> {};\n// template<> struct fex_gen_config<snd_mixer_set_compare> {};\n// template<> struct fex_gen_config<snd_mixer_set_callback> {};\n// template<> struct fex_gen_config<snd_mixer_get_callback_private> {};\n// template<> struct fex_gen_config<snd_mixer_set_callback_private> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_get_count> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_class_unregister> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_elem_next> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_elem_prev> {};\n// template<> struct fex_gen_config<snd_mixer_elem_set_callback> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_elem_get_callback_private> {};\n// template<> struct fex_gen_config<snd_mixer_elem_set_callback_private> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_elem_get_type> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_class_register> {};\n// template<> struct fex_gen_config<snd_mixer_elem_new> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_elem_add> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_elem_remove> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_elem_free> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_elem_info> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_elem_value> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_elem_attach> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_elem_detach> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_elem_empty> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_elem_get_private> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_class_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_class_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_class_free> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_class_copy> {};\n// template<> struct fex_gen_config<snd_mixer_class_get_mixer> {};\n// template<> struct fex_gen_config<snd_mixer_class_get_event> {};\n// template<> struct fex_gen_config<snd_mixer_class_get_private> {};\n// template<> struct fex_gen_config<snd_mixer_class_get_compare> {};\n// template<> struct fex_gen_config<snd_mixer_class_set_event> {};\n// template<> struct fex_gen_config<snd_mixer_class_set_private> {};\n// template<> struct fex_gen_config<snd_mixer_class_set_private_free> {};\n// template<> struct fex_gen_config<snd_mixer_class_set_compare> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_channel_name> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_register> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_id> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_index> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_find_selem> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_is_active> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_is_playback_mono> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_has_playback_channel> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_is_capture_mono> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_has_capture_channel> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_capture_group> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_has_common_volume> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_has_playback_volume> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_has_playback_volume_joined> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_has_capture_volume> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_has_capture_volume_joined> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_has_common_switch> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_has_playback_switch> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_has_playback_switch_joined> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_has_capture_switch> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_has_capture_switch_joined> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_has_capture_switch_exclusive> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_ask_playback_vol_dB> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_ask_capture_vol_dB> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_ask_playback_dB_vol> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_ask_capture_dB_vol> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_playback_volume> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_capture_volume> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_playback_dB> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_capture_dB> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_playback_switch> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_capture_switch> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_set_playback_volume> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_set_capture_volume> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_set_playback_dB> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_set_capture_dB> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_set_playback_volume_all> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_set_capture_volume_all> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_set_playback_dB_all> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_set_capture_dB_all> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_set_playback_switch> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_set_capture_switch> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_set_playback_switch_all> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_set_capture_switch_all> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_playback_volume_range> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_playback_dB_range> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_set_playback_volume_range> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_capture_volume_range> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_capture_dB_range> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_set_capture_volume_range> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_is_enumerated> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_is_enum_playback> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_is_enum_capture> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_enum_items> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_enum_item_name> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_get_enum_item> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_set_enum_item> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_id_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_id_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_id_free> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_id_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_id_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_id_get_index> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_id_set_name> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_id_set_index> {};\ntemplate<>\nstruct fex_gen_config<snd_mixer_selem_id_parse> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_open> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_open_lconf> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_name> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_type> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_close> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_poll_descriptors_count> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_poll_descriptors> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_poll_descriptors_revents> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_nonblock> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_id> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_get_output_buffer_size> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_get_input_buffer_size> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_set_output_buffer_size> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_set_input_buffer_size> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_system_info_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_system_info_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_system_info_free> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_system_info_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_system_info_get_queues> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_system_info_get_clients> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_system_info_get_ports> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_system_info_get_channels> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_system_info_get_cur_clients> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_system_info_get_cur_queues> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_system_info> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_free> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_get_client> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_get_type> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_get_broadcast_filter> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_get_error_bounce> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_get_card> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_get_pid> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_get_event_filter> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_get_num_ports> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_get_event_lost> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_set_client> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_set_name> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_set_broadcast_filter> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_set_error_bounce> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_set_event_filter> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_event_filter_clear> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_event_filter_add> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_event_filter_del> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_info_event_filter_check> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_get_client_info> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_get_any_client_info> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_set_client_info> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_next_client> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_pool_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_pool_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_pool_free> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_pool_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_pool_get_client> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_pool_get_output_pool> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_pool_get_input_pool> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_pool_get_output_room> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_pool_get_output_free> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_pool_get_input_free> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_pool_set_output_pool> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_pool_set_input_pool> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_client_pool_set_output_room> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_get_client_pool> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_set_client_pool> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_free> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_get_client> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_get_port> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_get_addr> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_get_capability> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_get_type> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_get_midi_channels> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_get_midi_voices> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_get_synth_voices> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_get_read_use> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_get_write_use> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_get_port_specified> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_get_timestamping> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_get_timestamp_real> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_get_timestamp_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_set_client> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_set_port> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_set_addr> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_set_name> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_set_capability> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_set_type> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_set_midi_channels> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_set_midi_voices> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_set_synth_voices> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_set_port_specified> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_set_timestamping> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_set_timestamp_real> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_info_set_timestamp_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_create_port> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_delete_port> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_get_port_info> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_get_any_port_info> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_set_port_info> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_next_port> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_free> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_get_sender> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_get_dest> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_get_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_get_exclusive> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_get_time_update> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_get_time_real> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_set_sender> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_set_dest> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_set_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_set_exclusive> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_set_time_update> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_port_subscribe_set_time_real> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_get_port_subscription> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_subscribe_port> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_unsubscribe_port> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_free> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_get_client> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_get_port> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_get_root> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_get_type> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_get_index> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_get_num_subs> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_get_addr> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_get_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_get_exclusive> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_get_time_update> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_get_time_real> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_set_client> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_set_port> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_set_root> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_set_type> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_subscribe_set_index> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_port_subscribers> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_info_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_info_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_info_free> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_info_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_info_get_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_info_get_name> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_info_get_owner> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_info_get_locked> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_info_get_flags> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_info_set_name> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_info_set_owner> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_info_set_locked> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_info_set_flags> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_create_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_alloc_named_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_alloc_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_free_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_get_queue_info> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_set_queue_info> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_query_named_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_get_queue_usage> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_set_queue_usage> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_status_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_status_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_status_free> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_status_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_status_get_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_status_get_events> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_status_get_tick_time> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_status_get_real_time> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_status_get_status> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_get_queue_status> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_tempo_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_tempo_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_tempo_free> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_tempo_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_tempo_get_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_tempo_get_tempo> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_tempo_get_ppq> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_tempo_get_skew> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_tempo_get_skew_base> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_tempo_set_tempo> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_tempo_set_ppq> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_tempo_set_skew> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_tempo_set_skew_base> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_get_queue_tempo> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_set_queue_tempo> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_timer_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_timer_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_timer_free> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_timer_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_timer_get_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_timer_get_type> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_timer_get_id> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_timer_get_resolution> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_timer_set_type> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_timer_set_id> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_queue_timer_set_resolution> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_get_queue_timer> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_set_queue_timer> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_free_event> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_event_length> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_event_output> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_event_output_buffer> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_event_output_direct> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_event_input> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_event_input_pending> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_drain_output> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_event_output_pending> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_extract_output> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_drop_output> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_drop_output_buffer> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_drop_input> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_drop_input_buffer> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_sizeof> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_malloc> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_free> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_copy> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_get_condition> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_get_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_get_time> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_get_dest> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_get_channel> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_get_event_type> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_get_tag> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_set_condition> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_set_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_set_time> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_set_dest> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_set_channel> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_set_event_type> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events_set_tag> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_remove_events> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_set_bit> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_unset_bit> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_change_bit> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_get_bit> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_control_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_create_simple_port> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_delete_simple_port> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_connect_from> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_connect_to> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_disconnect_from> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_disconnect_to> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_set_client_name> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_set_client_event_filter> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_set_client_pool_output> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_set_client_pool_output_room> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_set_client_pool_input> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_sync_output_queue> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_parse_address> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_reset_pool_output> {};\ntemplate<>\nstruct fex_gen_config<snd_seq_reset_pool_input> {};\ntemplate<>\nstruct fex_gen_config<snd_midi_event_new> {};\ntemplate<>\nstruct fex_gen_config<snd_midi_event_resize_buffer> {};\ntemplate<>\nstruct fex_gen_config<snd_midi_event_free> {};\ntemplate<>\nstruct fex_gen_config<snd_midi_event_init> {};\ntemplate<>\nstruct fex_gen_config<snd_midi_event_reset_encode> {};\ntemplate<>\nstruct fex_gen_config<snd_midi_event_reset_decode> {};\ntemplate<>\nstruct fex_gen_config<snd_midi_event_no_status> {};\ntemplate<>\nstruct fex_gen_config<snd_midi_event_encode> {};\ntemplate<>\nstruct fex_gen_config<snd_midi_event_encode_byte> {};\ntemplate<>\nstruct fex_gen_config<snd_midi_event_decode> {};\n"
  },
  {
    "path": "ThunkLibs/libdrm/Guest.cpp",
    "content": "/*\n$info$\ntags: thunklibs|drm\n$end_info$\n*/\n\n#include <xf86drm.h>\n\n#include <stdio.h>\n#include <cstring>\n#include <map>\n#include <string>\n\n#include \"common/Guest.h\"\n#include <stdarg.h>\n\n#include \"thunkgen_guest_libdrm.inl\"\n\nextern \"C\" {\nvoid FEX_malloc_free_on_host(void* Ptr) {\n  struct {\n    void* p;\n  } args;\n  args.p = Ptr;\n  fexthunks_libdrm_FEX_free_on_host(&args);\n}\n\nsize_t FEX_malloc_usable_size(void* Ptr) {\n  struct {\n    void* p;\n    size_t rv;\n  } args;\n  args.p = Ptr;\n  fexthunks_libdrm_FEX_usable_size(&args);\n  return args.rv;\n}\n\nvoid drmMsg(const char* format, ...) {\n  va_list ap;\n  if (1) {\n    va_start(ap, format);\n    vfprintf(stderr, format, ap);\n    va_end(ap);\n  }\n}\n\nchar* drmGetDeviceNameFromFd(int a_0) {\n  auto ret = fexfn_pack_drmGetDeviceNameFromFd(a_0);\n\n  if (ret) {\n    // Usable size\n    size_t Usable = FEX_malloc_usable_size(ret);\n\n    // This will be a bit wasteful but this is an unsized pointer\n    void* NewPtr = malloc(Usable);\n    memcpy(NewPtr, ret, Usable);\n\n    FEX_malloc_free_on_host(ret);\n    ret = (char*)NewPtr;\n  }\n\n  return ret;\n}\n\nchar* drmGetDeviceNameFromFd2(int a_0) {\n  auto ret = fexfn_pack_drmGetDeviceNameFromFd2(a_0);\n  if (ret) {\n    // Usable size\n    size_t Usable = FEX_malloc_usable_size(ret);\n\n    // This will be a bit wasteful but this is an unsized pointer\n    void* NewPtr = malloc(Usable);\n    memcpy(NewPtr, ret, Usable);\n\n    FEX_malloc_free_on_host(ret);\n    ret = (char*)NewPtr;\n  }\n\n  return ret;\n}\n\nchar* drmGetPrimaryDeviceNameFromFd(int a_0) {\n  auto ret = fexfn_pack_drmGetPrimaryDeviceNameFromFd(a_0);\n  if (ret) {\n    // Usable size\n    size_t Usable = FEX_malloc_usable_size(ret);\n\n    // This will be a bit wasteful but this is an unsized pointer\n    void* NewPtr = malloc(Usable);\n    memcpy(NewPtr, ret, Usable);\n\n    FEX_malloc_free_on_host(ret);\n    ret = (char*)NewPtr;\n  }\n\n  return ret;\n}\n\nchar* drmGetRenderDeviceNameFromFd(int a_0) {\n  auto ret = fexfn_pack_drmGetRenderDeviceNameFromFd(a_0);\n\n  if (ret) {\n    // Usable size\n    size_t Usable = FEX_malloc_usable_size(ret);\n\n    // This will be a bit wasteful but this is an unsized pointer\n    void* NewPtr = malloc(Usable);\n    memcpy(NewPtr, ret, Usable);\n\n    FEX_malloc_free_on_host(ret);\n    ret = (char*)NewPtr;\n  }\n\n  return ret;\n}\n}\n\nLOAD_LIB(libdrm)\n"
  },
  {
    "path": "ThunkLibs/libdrm/Host.cpp",
    "content": "/*\n$info$\ntags: thunklibs|drm\n$end_info$\n*/\n\n#include <stdio.h>\n\n#include <xf86drm.h>\n\n#include \"common/Host.h\"\n#include <dlfcn.h>\n#include <malloc.h>\n\n#include \"thunkgen_host_libdrm.inl\"\n\nstatic size_t fexfn_impl_libdrm_FEX_usable_size(void* a_0) {\n  return malloc_usable_size(a_0);\n}\n\nstatic void fexfn_impl_libdrm_FEX_free_on_host(void* a_0) {\n  free(a_0);\n}\n\nEXPORTS(libdrm)\n"
  },
  {
    "path": "ThunkLibs/libdrm/libdrm_interface.cpp",
    "content": "#include <common/GeneratorInterface.h>\n\n#include <xf86drm.h>\n\ntemplate<auto>\nstruct fex_gen_config {\n  unsigned version = 2;\n};\n\ntemplate<typename>\nstruct fex_gen_type {};\n\n#ifndef IS_32BIT_THUNK\n// Union types with compatible data layout\ntemplate<>\nstruct fex_gen_type<drmDevice> : fexgen::assume_compatible_data_layout {};\n\n// Anonymous sub-structs\ntemplate<>\nstruct fex_gen_type<drmStatsT> : fexgen::assume_compatible_data_layout {};\n\n// TODO: Convert vtable\ntemplate<>\nstruct fex_gen_type<drmServerInfo> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_type<drmEventContext> : fexgen::assume_compatible_data_layout {};\n#endif\n\nsize_t FEX_usable_size(void*);\nvoid FEX_free_on_host(void*);\n\ntemplate<>\nstruct fex_gen_config<FEX_usable_size> : fexgen::custom_host_impl, fexgen::custom_guest_entrypoint {};\ntemplate<>\nstruct fex_gen_config<FEX_free_on_host> : fexgen::custom_host_impl, fexgen::custom_guest_entrypoint {};\ntemplate<>\nstruct fex_gen_config<drmIoctl> {};\ntemplate<>\nstruct fex_gen_config<drmGetHashTable> {};\ntemplate<>\nstruct fex_gen_config<drmGetEntry> {};\ntemplate<>\nstruct fex_gen_config<drmAvailable> {};\ntemplate<>\nstruct fex_gen_config<drmOpen> {};\ntemplate<>\nstruct fex_gen_config<drmOpenWithType> {};\ntemplate<>\nstruct fex_gen_config<drmOpenControl> {};\ntemplate<>\nstruct fex_gen_config<drmOpenRender> {};\ntemplate<>\nstruct fex_gen_config<drmClose> {};\ntemplate<>\nstruct fex_gen_config<drmGetVersion> {};\ntemplate<>\nstruct fex_gen_config<drmGetLibVersion> {};\ntemplate<>\nstruct fex_gen_config<drmGetCap> {};\ntemplate<>\nstruct fex_gen_config<drmFreeVersion> {};\ntemplate<>\nstruct fex_gen_config<drmGetMagic> {};\ntemplate<>\nstruct fex_gen_config<drmGetBusid> {};\ntemplate<>\nstruct fex_gen_config<drmGetInterruptFromBusID> {};\ntemplate<>\nstruct fex_gen_config<drmGetMap> {};\ntemplate<>\nstruct fex_gen_config<drmGetClient> {};\ntemplate<>\nstruct fex_gen_config<drmGetStats> {};\ntemplate<>\nstruct fex_gen_config<drmSetInterfaceVersion> {};\ntemplate<>\nstruct fex_gen_config<drmCommandNone> {};\ntemplate<>\nstruct fex_gen_config<drmCommandRead> {};\ntemplate<>\nstruct fex_gen_config<drmCommandWrite> {};\ntemplate<>\nstruct fex_gen_config<drmCommandWriteRead> {};\ntemplate<>\nstruct fex_gen_config<drmFreeBusid> {};\ntemplate<>\nstruct fex_gen_config<drmSetBusid> {};\ntemplate<>\nstruct fex_gen_config<drmAuthMagic> {};\ntemplate<>\nstruct fex_gen_config<drmAddMap> {};\ntemplate<>\nstruct fex_gen_config<drmRmMap> {};\ntemplate<>\nstruct fex_gen_config<drmAddContextPrivateMapping> {};\ntemplate<>\nstruct fex_gen_config<drmAddBufs> {};\ntemplate<>\nstruct fex_gen_config<drmMarkBufs> {};\ntemplate<>\nstruct fex_gen_config<drmCreateContext> {};\ntemplate<>\nstruct fex_gen_config<drmSetContextFlags> {};\ntemplate<>\nstruct fex_gen_config<drmGetContextFlags> {};\ntemplate<>\nstruct fex_gen_config<drmAddContextTag> {};\ntemplate<>\nstruct fex_gen_config<drmDelContextTag> {};\ntemplate<>\nstruct fex_gen_config<drmGetContextTag> {};\ntemplate<>\nstruct fex_gen_config<drmGetReservedContextList> {};\ntemplate<>\nstruct fex_gen_config<drmFreeReservedContextList> {};\ntemplate<>\nstruct fex_gen_config<drmSwitchToContext> {};\ntemplate<>\nstruct fex_gen_config<drmDestroyContext> {};\ntemplate<>\nstruct fex_gen_config<drmCreateDrawable> {};\ntemplate<>\nstruct fex_gen_config<drmDestroyDrawable> {};\ntemplate<>\nstruct fex_gen_config<drmUpdateDrawableInfo> {};\ntemplate<>\nstruct fex_gen_config<drmCtlInstHandler> {};\ntemplate<>\nstruct fex_gen_config<drmCtlUninstHandler> {};\ntemplate<>\nstruct fex_gen_config<drmSetClientCap> {};\ntemplate<>\nstruct fex_gen_config<drmCrtcGetSequence> {};\ntemplate<>\nstruct fex_gen_config<drmCrtcQueueSequence> {};\ntemplate<>\nstruct fex_gen_config<drmMap> {};\ntemplate<>\nstruct fex_gen_config<drmUnmap> {};\ntemplate<>\nstruct fex_gen_config<drmGetBufInfo> {};\ntemplate<>\nstruct fex_gen_config<drmMapBufs> {};\ntemplate<>\nstruct fex_gen_config<drmUnmapBufs> {};\ntemplate<>\nstruct fex_gen_config<drmDMA> {};\ntemplate<>\nstruct fex_gen_config<drmFreeBufs> {};\ntemplate<>\nstruct fex_gen_config<drmGetLock> {};\ntemplate<>\nstruct fex_gen_config<drmUnlock> {};\ntemplate<>\nstruct fex_gen_config<drmFinish> {};\ntemplate<>\nstruct fex_gen_config<drmGetContextPrivateMapping> {};\ntemplate<>\nstruct fex_gen_config<drmScatterGatherAlloc> {};\ntemplate<>\nstruct fex_gen_config<drmScatterGatherFree> {};\ntemplate<>\nstruct fex_gen_config<drmWaitVBlank> {};\ntemplate<>\nstruct fex_gen_config<drmSetServerInfo> {};\ntemplate<>\nstruct fex_gen_config<drmError> {};\ntemplate<>\nstruct fex_gen_config<drmMalloc> {};\ntemplate<>\nstruct fex_gen_config<drmFree> {};\ntemplate<>\nstruct fex_gen_config<drmHashCreate> {};\ntemplate<>\nstruct fex_gen_config<drmHashDestroy> {};\ntemplate<>\nstruct fex_gen_config<drmHashLookup> {};\ntemplate<>\nstruct fex_gen_config<drmHashInsert> {};\ntemplate<>\nstruct fex_gen_config<drmHashDelete> {};\ntemplate<>\nstruct fex_gen_config<drmHashFirst> {};\ntemplate<>\nstruct fex_gen_config<drmHashNext> {};\ntemplate<>\nstruct fex_gen_config<drmRandomCreate> {};\ntemplate<>\nstruct fex_gen_config<drmRandomDestroy> {};\ntemplate<>\nstruct fex_gen_config<drmRandom> {};\ntemplate<>\nstruct fex_gen_config<drmRandomDouble> {};\ntemplate<>\nstruct fex_gen_config<drmSLCreate> {};\ntemplate<>\nstruct fex_gen_config<drmSLDestroy> {};\ntemplate<>\nstruct fex_gen_config<drmSLLookup> {};\ntemplate<>\nstruct fex_gen_config<drmSLInsert> {};\ntemplate<>\nstruct fex_gen_config<drmSLDelete> {};\ntemplate<>\nstruct fex_gen_config<drmSLNext> {};\ntemplate<>\nstruct fex_gen_config<drmSLFirst> {};\ntemplate<>\nstruct fex_gen_config<drmSLDump> {};\ntemplate<>\nstruct fex_gen_config<drmSLLookupNeighbors> {};\ntemplate<>\nstruct fex_gen_config<drmOpenOnce> {};\ntemplate<>\nstruct fex_gen_config<drmOpenOnceWithType> {};\ntemplate<>\nstruct fex_gen_config<drmCloseOnce> {};\ntemplate<>\nstruct fex_gen_config<drmSetMaster> {};\ntemplate<>\nstruct fex_gen_config<drmDropMaster> {};\ntemplate<>\nstruct fex_gen_config<drmIsMaster> {};\ntemplate<>\nstruct fex_gen_config<drmHandleEvent> {};\ntemplate<>\nstruct fex_gen_config<drmGetDeviceNameFromFd> : fexgen::custom_guest_entrypoint {};\ntemplate<>\nstruct fex_gen_config<drmGetDeviceNameFromFd2> : fexgen::custom_guest_entrypoint {};\n\ntemplate<>\nstruct fex_gen_config<drmGetNodeTypeFromFd> {};\ntemplate<>\nstruct fex_gen_config<drmPrimeHandleToFD> {};\ntemplate<>\nstruct fex_gen_config<drmPrimeFDToHandle> {};\ntemplate<>\nstruct fex_gen_config<drmGetPrimaryDeviceNameFromFd> : fexgen::custom_guest_entrypoint {};\ntemplate<>\nstruct fex_gen_config<drmGetRenderDeviceNameFromFd> : fexgen::custom_guest_entrypoint {};\n\ntemplate<>\nstruct fex_gen_config<drmGetDevice> {};\ntemplate<>\nstruct fex_gen_config<drmFreeDevice> {};\ntemplate<>\nstruct fex_gen_config<drmGetDevices> {};\ntemplate<>\nstruct fex_gen_config<drmFreeDevices> {};\ntemplate<>\nstruct fex_gen_config<drmGetDevice2> {};\ntemplate<>\nstruct fex_gen_config<drmGetDevices2> {};\ntemplate<>\nstruct fex_gen_config<drmDevicesEqual> {};\ntemplate<>\nstruct fex_gen_config<drmSyncobjCreate> {};\ntemplate<>\nstruct fex_gen_config<drmSyncobjDestroy> {};\ntemplate<>\nstruct fex_gen_config<drmSyncobjHandleToFD> {};\ntemplate<>\nstruct fex_gen_config<drmSyncobjFDToHandle> {};\ntemplate<>\nstruct fex_gen_config<drmSyncobjImportSyncFile> {};\ntemplate<>\nstruct fex_gen_config<drmSyncobjExportSyncFile> {};\ntemplate<>\nstruct fex_gen_config<drmSyncobjWait> {};\ntemplate<>\nstruct fex_gen_config<drmSyncobjReset> {};\ntemplate<>\nstruct fex_gen_config<drmSyncobjSignal> {};\ntemplate<>\nstruct fex_gen_config<drmSyncobjTimelineSignal> {};\ntemplate<>\nstruct fex_gen_config<drmSyncobjTimelineWait> {};\ntemplate<>\nstruct fex_gen_config<drmSyncobjQuery> {};\ntemplate<>\nstruct fex_gen_config<drmSyncobjQuery2> {};\ntemplate<>\nstruct fex_gen_config<drmSyncobjTransfer> {};\n"
  },
  {
    "path": "ThunkLibs/libfex_malloc/Guest.cpp",
    "content": "/*\n$info$\ntags: thunklibs|fex_malloc\ndesc: Handles allocations between guest and host thunks\n$end_info$\n*/\n\n#include <cstring>\n#include <map>\n#include <string>\n\n#include \"common/Guest.h\"\n#include <stdarg.h>\n\n#include \"Types.h\"\n\n#include \"thunkgen_guest_libfex_malloc.inl\"\n\n#include <vector>\n\nextern \"C\" {\nvoid fex_malloc_NoOptimize() {\n  // Does nothing, just ensures our libraries pull it in\n}\n\n#define ALIAS(fn) __attribute__((alias(#fn), used))\n#define PREALIAS(fn) ALIAS(fn)\n\n\nvoid* __libc_calloc(size_t n, size_t size) PREALIAS(fexfn_pack_calloc);\n\nvoid __libc_free(void* ptr) PREALIAS(fexfn_pack_free);\n\nvoid* __libc_malloc(size_t size) PREALIAS(fexfn_pack_malloc);\n\nvoid* __libc_memalign(size_t align, size_t s) PREALIAS(fexfn_pack_memalign);\n\nvoid* __libc_realloc(void* ptr, size_t size) PREALIAS(fexfn_pack_realloc);\n\nvoid* __libc_valloc(size_t size) PREALIAS(fexfn_pack_valloc);\n\nint __posix_memalign(void** r, size_t a, size_t s) PREALIAS(fexfn_pack_posix_memalign);\n\n// If we replace libc malloc and an application calls the malloc_usable_size then we can get a crash\n// Symbol doesn't alias exactly so just wrap it\n\nsize_t __malloc_usable_size(void* ptr) {\n  return fexfn_pack_malloc_usable_size(ptr);\n}\n}\n\nLOAD_LIB(libfex_malloc)\n"
  },
  {
    "path": "ThunkLibs/libfex_malloc/Host.cpp",
    "content": "/*\n$info$\ntags: thunklibs|fex_malloc\ndesc: Handles allocations between guest and host thunks\n$end_info$\n*/\n\n#include <cstring>\n#include <cstdlib>\n#include <stdio.h>\n#include <memory.h>\n\n#include \"common/Host.h\"\n#include <dlfcn.h>\n\n#include \"Types.h\"\n\n#include \"thunkgen_host_libfex_malloc.inl\"\n\nvoid fexfn_impl_libfex_malloc_fex_get_allocation_ptrs(AllocationPtrs* Ptrs);\n\nextern \"C\" {\n// FEX allocation routines\nextern MallocPtr FEX_Malloc_Ptr;\nextern FreePtr FEX_Free_Ptr;\nextern CallocPtr FEX_Calloc_Ptr;\nextern MemalignPtr FEX_Memalign_Ptr;\nextern ReallocPtr FEX_Realloc_Ptr;\nextern VallocPtr FEX_Valloc_Ptr;\nextern PosixMemalignPtr FEX_PosixMemalign_Ptr;\nextern AlignedAllocPtr FEX_AlignedAlloc_Ptr;\nextern MallocUsablePtr FEX_MallocUsable_Ptr;\n}\n\nextern \"C\" {\nAllocationPtrs AllocationPointers {\n  .Malloc = FEX_Malloc_Ptr,\n  .Free = FEX_Free_Ptr,\n  .Calloc = FEX_Calloc_Ptr,\n  .Memalign = FEX_Memalign_Ptr,\n  .Realloc = FEX_Realloc_Ptr,\n  .Valloc = FEX_Valloc_Ptr,\n  .PosixMemalign = FEX_PosixMemalign_Ptr,\n  .AlignedAlloc = FEX_AlignedAlloc_Ptr,\n  .MallocUsable = FEX_MallocUsable_Ptr,\n};\n\n// Our allocators\n#define ALIAS(fn) __attribute__((alias(#fn), used))\n#define PREALIAS(fn) ALIAS(fn)\n\nvoid* fex_malloc(size_t Size) {\n  return AllocationPointers.Malloc(Size);\n}\nvoid* __libc_malloc(size_t Size) __attribute__((alias(\"fex_malloc\"), used));\nvoid* malloc(size_t Size) __attribute__((alias(\"fex_malloc\"), used));\n\nvoid fex_free(void* p) {\n  AllocationPointers.Free(p);\n}\nvoid __libc_free(void* ptr) PREALIAS(fex_free);\nvoid __GI___libc_free(void* ptr) PREALIAS(fex_free);\nvoid free(void* ptr) PREALIAS(fex_free);\n\nvoid* fex_calloc(size_t n, size_t size) {\n  return AllocationPointers.Calloc(n, size);\n}\nvoid* __libc_calloc(size_t n, size_t size) PREALIAS(fex_calloc);\nvoid* calloc(size_t n, size_t size) PREALIAS(fex_calloc);\n\nvoid* fex_memalign(size_t align, size_t s) {\n  return AllocationPointers.Memalign(align, s);\n}\nvoid* __libc_memalign(size_t align, size_t s) PREALIAS(fex_memalign);\nvoid* memalign(size_t align, size_t s) PREALIAS(fex_memalign);\n\nvoid* fex_realloc(void* ptr, size_t size) {\n  return AllocationPointers.Realloc(ptr, size);\n}\nvoid* __libc_realloc(void* ptr, size_t size) PREALIAS(fex_realloc);\nvoid* realloc(void* ptr, size_t size) PREALIAS(fex_realloc);\n\nvoid* fex_valloc(size_t size) {\n  return AllocationPointers.Valloc(size);\n}\nvoid* __libc_valloc(size_t size) PREALIAS(fex_valloc);\nvoid* valloc(size_t size) PREALIAS(fex_valloc);\n\nint fex_posix_memalign(void** r, size_t a, size_t s) {\n  return AllocationPointers.PosixMemalign(r, a, s);\n}\nint __posix_memalign(void** r, size_t a, size_t s) PREALIAS(fex_posix_memalign);\nint posix_memalign(void** r, size_t a, size_t s) PREALIAS(fex_posix_memalign);\n\nvoid* fex_aligned_alloc(size_t a, size_t s) {\n  return AllocationPointers.AlignedAlloc(a, s);\n}\nvoid* aligned_alloc(size_t a, size_t s) PREALIAS(fex_aligned_alloc);\n\nsize_t fex_malloc_usable_size(void* ptr) {\n  return AllocationPointers.MallocUsable(ptr);\n}\n\nsize_t __malloc_usable_size(void* ptr) {\n  return fex_malloc_usable_size(ptr);\n}\nsize_t malloc_usable_size(void* ptr) {\n  return fex_malloc_usable_size(ptr);\n}\n\nstatic void fexfn_unpack_libfex_malloc_malloc(void* argsv) {\n  struct arg_t {\n    size_t a_0;\n    void* rv;\n  };\n  auto args = (arg_t*)argsv;\n  args->rv = AllocationPointers.Malloc(args->a_0);\n}\n\nstatic void fexfn_unpack_libfex_malloc_free(void* argsv) {\n  struct arg_t {\n    void* a_0;\n  };\n  auto args = (arg_t*)argsv;\n  AllocationPointers.Free(args->a_0);\n}\n\nstatic void fexfn_unpack_libfex_malloc_calloc(void* argsv) {\n  struct arg_t {\n    size_t a_0;\n    size_t a_1;\n    void* rv;\n  };\n  auto args = (arg_t*)argsv;\n  args->rv = AllocationPointers.Calloc(args->a_0, args->a_1);\n}\nstatic void fexfn_unpack_libfex_malloc_memalign(void* argsv) {\n  struct arg_t {\n    size_t a_0;\n    size_t a_1;\n    void* rv;\n  };\n  auto args = (arg_t*)argsv;\n  args->rv = AllocationPointers.Memalign(args->a_0, args->a_1);\n}\nstatic void fexfn_unpack_libfex_malloc_realloc(void* argsv) {\n  struct arg_t {\n    void* a_0;\n    size_t a_1;\n    void* rv;\n  };\n  auto args = (arg_t*)argsv;\n  args->rv = AllocationPointers.Realloc(args->a_0, args->a_1);\n}\nstatic void fexfn_unpack_libfex_malloc_valloc(void* argsv) {\n  struct arg_t {\n    size_t a_0;\n    void* rv;\n  };\n  auto args = (arg_t*)argsv;\n\n  args->rv = AllocationPointers.Valloc(args->a_0);\n}\nstatic void fexfn_unpack_libfex_malloc_posix_memalign(void* argsv) {\n  struct arg_t {\n    void** a_0;\n    size_t a_1;\n    size_t a_2;\n    int rv;\n  };\n  auto args = (arg_t*)argsv;\n\n  args->rv = AllocationPointers.PosixMemalign(args->a_0, args->a_1, args->a_2);\n}\nstatic void fexfn_unpack_libfex_malloc_aligned_alloc(void* argsv) {\n  struct arg_t {\n    size_t a_0;\n    size_t a_1;\n    void* rv;\n  };\n  auto args = (arg_t*)argsv;\n\n  args->rv = AllocationPointers.AlignedAlloc(args->a_0, args->a_1);\n}\nstatic void fexfn_unpack_libfex_malloc_malloc_usable_size(void* argsv) {\n  struct arg_t {\n    void* a_0;\n    size_t rv;\n  };\n  auto args = (arg_t*)argsv;\n\n  args->rv = AllocationPointers.MallocUsable(args->a_0);\n}\n\nvoid (*__free_hook)(void* ptr) = fex_free;\nvoid* (*__malloc_hook)(size_t size) = fex_malloc;\nvoid* (*__realloc_hook)(void* ptr, size_t size) = fex_realloc;\nvoid* (*__memalign_hook)(size_t alignment, size_t size) = fex_memalign;\n}\n\nvoid fexfn_impl_libfex_malloc_fex_get_allocation_ptrs(AllocationPtrs* Ptrs) {\n  *Ptrs = AllocationPointers;\n}\n\nstatic void init_lib() {\n  // Set pointers\n  AllocationPointers.Malloc = FEX_Malloc_Ptr;\n  AllocationPointers.Free = FEX_Free_Ptr;\n  AllocationPointers.Calloc = FEX_Calloc_Ptr;\n  AllocationPointers.Memalign = FEX_Memalign_Ptr;\n  AllocationPointers.Realloc = FEX_Realloc_Ptr;\n  AllocationPointers.Valloc = FEX_Valloc_Ptr;\n  AllocationPointers.PosixMemalign = FEX_PosixMemalign_Ptr;\n  AllocationPointers.AlignedAlloc = FEX_AlignedAlloc_Ptr;\n  AllocationPointers.MallocUsable = FEX_MallocUsable_Ptr;\n}\n\nEXPORTS(libfex_malloc)\nLOAD_LIB_INIT(init_lib)\n"
  },
  {
    "path": "ThunkLibs/libfex_malloc/Types.h",
    "content": "#pragma once\n\n#include <cstddef>\n\nusing MallocPtr = void* (*)(size_t);\nusing FreePtr = void (*)(void*);\nusing CallocPtr = void* (*)(size_t, size_t);\nusing MemalignPtr = void* (*)(size_t, size_t);\nusing ReallocPtr = void* (*)(void*, size_t);\nusing VallocPtr = void* (*)(size_t);\nusing PosixMemalignPtr = int (*)(void**, size_t, size_t);\nusing AlignedAllocPtr = void* (*)(size_t, size_t);\nusing MallocUsablePtr = size_t (*)(void*);\n\nstruct AllocationPtrs {\n  MallocPtr Malloc;\n  FreePtr Free;\n  CallocPtr Calloc;\n  MemalignPtr Memalign;\n  ReallocPtr Realloc;\n  VallocPtr Valloc;\n  PosixMemalignPtr PosixMemalign;\n  AlignedAllocPtr AlignedAlloc;\n  MallocUsablePtr MallocUsable;\n};\n"
  },
  {
    "path": "ThunkLibs/libfex_malloc_loader/Guest.cpp",
    "content": "/*\n$info$\ntags: thunklibs|fex_malloc_loader\ndesc: Delays malloc symbol replacement until it is safe to run constructors\n$end_info$\n*/\n\n#include <stdio.h>\n#include <dlfcn.h>\nextern \"C\" {\n__attribute__((constructor)) static void loadlib() {\n  fprintf(stderr, \"Time to load mallocs\\n\");\n  dlopen(\"/mnt/Work/Work/work/FEXNew/Build/Guest/libfex_malloc-guest.so\", RTLD_GLOBAL | RTLD_NOW | RTLD_NODELETE | RTLD_DEEPBIND);\n}\n}\n"
  },
  {
    "path": "ThunkLibs/libfex_malloc_symbols/Host.cpp",
    "content": "/*\n$info$\ntags: thunklibs|fex_malloc_symbols\ndesc: Allows FEX to export allocation symbols\n$end_info$\n*/\n\n#include <cstring>\n#include <cstdlib>\n#include <stdio.h>\n#include <memory.h>\n\n#include \"common/Host.h\"\n#include <dlfcn.h>\n\n#include \"../libfex_malloc/Types.h\"\n\nextern \"C\" {\n// FEX allocation routines\nMallocPtr FEX_Malloc_Ptr = (MallocPtr)0x4142434445464748ULL;\nFreePtr FEX_Free_Ptr = (FreePtr)0x4142434445464748ULL;\nCallocPtr FEX_Calloc_Ptr = (CallocPtr)0x4142434445464748ULL;\nMemalignPtr FEX_Memalign_Ptr = (MemalignPtr)0x4142434445464748ULL;\nReallocPtr FEX_Realloc_Ptr = (ReallocPtr)0x4142434445464748ULL;\nVallocPtr FEX_Valloc_Ptr = (VallocPtr)0x4142434445464748ULL;\nPosixMemalignPtr FEX_PosixMemalign_Ptr = (PosixMemalignPtr)0x4142434445464748ULL;\nAlignedAllocPtr FEX_AlignedAlloc_Ptr = (AlignedAllocPtr)0x4142434445464748ULL;\nMallocUsablePtr FEX_MallocUsable_Ptr = (MallocUsablePtr)0x4142434445464748ULL;\n}\n"
  },
  {
    "path": "ThunkLibs/libfex_thunk_test/Guest.cpp",
    "content": "/*\n$info$\ntags: thunklibs|fex_thunk_test\n$end_info$\n*/\n\n#include \"common/Guest.h\"\n#include \"api.h\"\n\n#include \"thunkgen_guest_libfex_thunk_test.inl\"\n\nLOAD_LIB(libfex_thunk_test)\n"
  },
  {
    "path": "ThunkLibs/libfex_thunk_test/Host.cpp",
    "content": "/*\n$info$\ntags: thunklibs|fex_thunk_test\n$end_info$\n*/\n\n#include <dlfcn.h>\n\n#include <unordered_map>\n\n#include \"common/Host.h\"\n\n#include \"api.h\"\n\n#include \"thunkgen_host_libfex_thunk_test.inl\"\n\nstatic uint32_t fexfn_impl_libfex_thunk_test_QueryOffsetOf(guest_layout<ReorderingType*> data, int index) {\n  if (index == 0) {\n    return offsetof(guest_layout<ReorderingType>::type, a);\n  } else {\n    return offsetof(guest_layout<ReorderingType>::type, b);\n  }\n}\n\nvoid fex_custom_repack_entry(host_layout<CustomRepackedType>& to, const guest_layout<CustomRepackedType>& from) {\n  to.data.custom_repack_invoked = 1;\n}\n\nbool fex_custom_repack_exit(guest_layout<CustomRepackedType>& to, const host_layout<CustomRepackedType>& from) {\n  return false;\n}\n\ntemplate<StructType TypeIndex, typename Type>\nstatic const TestBaseStruct* convert(const TestBaseStruct* source) {\n  // Using malloc here since no easily available type information is available at the time of destruction.\n  auto guest_next = reinterpret_cast<guest_layout<Type>*>((void*)source);\n  auto child_mem = (char*)aligned_alloc(alignof(host_layout<Type>), sizeof(host_layout<Type>));\n  auto child = new (child_mem) host_layout<Type> {*guest_next};\n\n  fex_custom_repack_entry(*child, *reinterpret_cast<guest_layout<Type>*>((void*)(source)));\n\n  return (const TestBaseStruct*)child;\n}\n\ntemplate<StructType TypeIndex, typename Type>\nstatic void convert_to_guest(void* into, const TestBaseStruct* from) {\n  auto typed_into = (guest_layout<Type>*)into;\n  auto oldNext = typed_into->data.Next;\n  *typed_into = to_guest(to_host_layout(*(Type*)from));\n  typed_into->data.Next = oldNext;\n\n  fex_custom_repack_exit(*typed_into, to_host_layout(*(Type*)from));\n}\n\ntemplate<StructType TypeIndex, typename Type>\ninline constexpr std::pair<StructType, std::pair<const TestBaseStruct* (*)(const TestBaseStruct*), void (*)(void*, const TestBaseStruct*)>> converters = {\n  TypeIndex,\n  {convert<TypeIndex, Type>, convert_to_guest<TypeIndex, Type>}};\n\nstatic std::unordered_map<StructType, std::pair<const TestBaseStruct* (*)(const TestBaseStruct*), void (*)(void*, const TestBaseStruct*)>> next_handlers {\n  converters<StructType::Struct1, TestStruct1>,\n  converters<StructType::Struct2, TestStruct2>,\n};\n\nstatic void default_fex_custom_repack_entry(TestBaseStruct& into, const guest_layout<TestBaseStruct>* from) {\n  if (!from->data.Next.get_pointer()) {\n    into.Next = nullptr;\n    return;\n  }\n  auto typed_source = reinterpret_cast<const guest_layout<TestBaseStruct>*>(from->data.Next.get_pointer());\n\n  auto next_handler = next_handlers.at(StructType {typed_source->data.Type.data});\n\n  into.Next = (TestBaseStruct*)next_handler.first((const TestBaseStruct*)typed_source);\n}\n\nstatic void default_fex_custom_repack_reverse(guest_layout<TestBaseStruct>& into, const TestBaseStruct* from) {\n  auto NextHost = from->Next;\n  if (!NextHost) {\n    return;\n  }\n\n  auto next_handler = next_handlers.at(static_cast<StructType>(into.data.Next.get_pointer()->data.Type.data));\n  next_handler.second((void*)into.data.Next.get_pointer(), from->Next);\n\n  free((void*)NextHost);\n}\n\n#define CREATE_INFO_DEFAULT_CUSTOM_REPACK(name)                                                                                  \\\n  void fex_custom_repack_entry(host_layout<name>& into, const guest_layout<name>& from) {                                        \\\n    default_fex_custom_repack_entry(*(TestBaseStruct*)&into.data, reinterpret_cast<const guest_layout<TestBaseStruct>*>(&from)); \\\n  }                                                                                                                              \\\n                                                                                                                                 \\\n  bool fex_custom_repack_exit(guest_layout<name>& into, const host_layout<name>& from) {                                         \\\n    auto prev_next = into.data.Next;                                                                                             \\\n    default_fex_custom_repack_reverse(*reinterpret_cast<guest_layout<TestBaseStruct>*>(&into),                                   \\\n                                      &reinterpret_cast<const TestBaseStruct&>(from.data));                                      \\\n    into = to_guest(from);                                                                                                       \\\n    into.data.Next = prev_next;                                                                                                  \\\n    return true;                                                                                                                 \\\n  }\n\nCREATE_INFO_DEFAULT_CUSTOM_REPACK(TestStruct1)\nCREATE_INFO_DEFAULT_CUSTOM_REPACK(TestStruct2)\n\nvoid fex_custom_repack_entry(host_layout<TestBaseStruct>&, const guest_layout<TestBaseStruct>&) {\n  std::abort();\n}\n\nbool fex_custom_repack_exit(guest_layout<TestBaseStruct>&, const host_layout<TestBaseStruct>&) {\n  std::abort();\n  return false;\n}\n\nEXPORTS(libfex_thunk_test)\n"
  },
  {
    "path": "ThunkLibs/libfex_thunk_test/api.h",
    "content": "/**\n * This file defines interfaces of a dummy library used to test various\n * features of the thunk generator.\n */\n#pragma once\n\n#include <cstdint>\n#include <limits>\n\nextern \"C\" {\n\nuint32_t GetDoubledValue(uint32_t);\n\n\n/// Interfaces used to test opaque_type and assume_compatible_data_layout annotations\n\nstruct OpaqueType;\n\nOpaqueType* MakeOpaqueType(uint32_t data);\nuint32_t ReadOpaqueTypeData(OpaqueType*);\nvoid DestroyOpaqueType(OpaqueType*);\n\nunion UnionType {\n  uint32_t a;\n  int32_t b;\n  uint8_t c[4];\n};\n\nUnionType MakeUnionType(uint8_t a, uint8_t b, uint8_t c, uint8_t d);\nuint32_t GetUnionTypeA(UnionType*);\n\n\n/// Interfaces used to test automatic struct repacking\n\n// A simple struct with data layout that differs between guest and host.\n// The thunk generator should emit code that swaps the member data into\n// correct position.\nstruct ReorderingType {\n#if !defined(GUEST_THUNK_LIBRARY)\n  uint32_t a;\n  uint32_t b;\n#else\n  uint32_t b;\n  uint32_t a;\n#endif\n};\n\nReorderingType MakeReorderingType(uint32_t a, uint32_t b);\nuint32_t GetReorderingTypeMember(const ReorderingType*, int index);\nvoid ModifyReorderingTypeMembers(ReorderingType* data);\nuint32_t QueryOffsetOf(ReorderingType*, int index);\n\n// Uses assume_compatible_data_layout to skip repacking\nuint32_t GetReorderingTypeMemberWithoutRepacking(const ReorderingType*, int index);\n\n/// Interfaces used to test assisted struct repacking\n\n// We enable custom repacking on the \"data\" member, with repacking code that\n// sets the first bit of \"custom_repack_invoked\" to 1 on entry.\nstruct CustomRepackedType {\n  ReorderingType* data;\n  int custom_repack_invoked;\n};\n\n// Should return true if the custom repacker set \"custom_repack_invoked\" to true\nint RanCustomRepack(CustomRepackedType*);\n\n/// Interface used to check that function arguments with different integer size\n/// get forwarded correctly\n\n#if !defined(GUEST_THUNK_LIBRARY)\nenum DivType : uint8_t {};\n#else\nenum DivType : uint32_t {};\n#endif\nint FunctionWithDivergentSignature(DivType, DivType, DivType, DivType);\n\n\n/// Interfaces used to test Vulkan-like APIs\n\n// Equivalent of VkStructureType\nenum class StructType {\n  Struct1,\n  Struct2,\n};\n\n// Equivalent of VkBaseInStructure\nstruct TestBaseStruct {\n  TestBaseStruct* Next;\n  StructType Type;\n};\n\n// Equivalent of e.g. VkImageCreateInfo\nstruct TestStruct1 {\n  const void* Next;\n  StructType Type; // StructType::Struct1\n  uint8_t Data2;\n  uint8_t pad0[3];\n  int Data1;\n};\n\nstruct TestStruct2 {\n  const void* Next;\n  StructType Type; // StructType::Struct2\n  int Data1;\n};\n\nint ReadData1(TestStruct1*, int depth);\n}\n"
  },
  {
    "path": "ThunkLibs/libfex_thunk_test/lib.cpp",
    "content": "#include \"api.h\"\n\n#include <cstdio>\n#include <cstddef>\n\nextern \"C\" {\n\nuint32_t GetDoubledValue(uint32_t input) {\n  return 2 * input;\n}\n\nstruct OpaqueType {\n  uint32_t data;\n};\n\nOpaqueType* MakeOpaqueType(uint32_t data) {\n  return new OpaqueType {data};\n}\n\nuint32_t ReadOpaqueTypeData(OpaqueType* value) {\n  return value->data;\n}\n\nvoid DestroyOpaqueType(OpaqueType* value) {\n  delete value;\n}\n\nUnionType MakeUnionType(uint8_t a, uint8_t b, uint8_t c, uint8_t d) {\n  return UnionType {.c = {a, b, c, d}};\n}\n\nuint32_t GetUnionTypeA(UnionType* value) {\n  return value->a;\n}\n\nReorderingType MakeReorderingType(uint32_t a, uint32_t b) {\n  return ReorderingType {.a = a, .b = b};\n}\n\nuint32_t GetReorderingTypeMember(const ReorderingType* data, int index) {\n  if (index == 0) {\n    return data->a;\n  } else {\n    return data->b;\n  }\n}\n\nuint32_t GetReorderingTypeMemberWithoutRepacking(const ReorderingType* data, int index) {\n  return GetReorderingTypeMember(data, index);\n}\n\nvoid ModifyReorderingTypeMembers(ReorderingType* data) {\n  data->a += 1;\n  data->b += 2;\n}\n\nint RanCustomRepack(CustomRepackedType* data) {\n  return data->custom_repack_invoked;\n}\n\nint FunctionWithDivergentSignature(DivType a, DivType b, DivType c, DivType d) {\n  return ((uint8_t)a << 24) | ((uint8_t)b << 16) | ((uint8_t)c << 8) | (uint8_t)d;\n}\n\nint ReadData1(TestStruct1* data, int depth) {\n  auto* base = (TestBaseStruct*)data;\n  for (int i = 0; i != depth; ++i) {\n    if (!base) {\n      return -1;\n    }\n    base = base->Next;\n  }\n  if (!base) {\n    return -1;\n  }\n\n  switch (base->Type) {\n  case StructType::Struct1: return ((TestStruct1*)base)->Data1;\n\n  case StructType::Struct2: return ((TestStruct2*)base)->Data1;\n\n  default: return -2;\n  }\n}\n\n} // extern \"C\"\n"
  },
  {
    "path": "ThunkLibs/libfex_thunk_test/libfex_thunk_test_interface.cpp",
    "content": "#include <common/GeneratorInterface.h>\n\n#include \"api.h\"\n\ntemplate<auto>\nstruct fex_gen_config {};\n\ntemplate<typename>\nstruct fex_gen_type {};\n\ntemplate<auto, int, typename>\nstruct fex_gen_param {};\n\ntemplate<>\nstruct fex_gen_config<GetDoubledValue> {};\n\ntemplate<>\nstruct fex_gen_type<OpaqueType> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_config<MakeOpaqueType> {};\ntemplate<>\nstruct fex_gen_config<ReadOpaqueTypeData> {};\ntemplate<>\nstruct fex_gen_config<DestroyOpaqueType> {};\n\ntemplate<>\nstruct fex_gen_type<UnionType> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<MakeUnionType> {};\ntemplate<>\nstruct fex_gen_config<GetUnionTypeA> {};\n\ntemplate<>\nstruct fex_gen_config<MakeReorderingType> {};\ntemplate<>\nstruct fex_gen_config<GetReorderingTypeMember> {};\ntemplate<>\nstruct fex_gen_config<GetReorderingTypeMemberWithoutRepacking> {};\ntemplate<>\nstruct fex_gen_param<GetReorderingTypeMemberWithoutRepacking, 0, const ReorderingType*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<ModifyReorderingTypeMembers> {};\n\ntemplate<>\nstruct fex_gen_config<QueryOffsetOf> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<QueryOffsetOf, 0, ReorderingType*> : fexgen::ptr_passthrough {};\n\ntemplate<>\nstruct fex_gen_config<&CustomRepackedType::data> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<RanCustomRepack> {};\n\ntemplate<>\nstruct fex_gen_config<FunctionWithDivergentSignature> {};\n\ntemplate<>\nstruct fex_gen_config<&TestBaseStruct::Next> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&TestStruct1::Next> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&TestStruct2::Next> : fexgen::custom_repack {};\n\ntemplate<>\nstruct fex_gen_config<ReadData1> {};\n"
  },
  {
    "path": "ThunkLibs/libvulkan/Guest.cpp",
    "content": "/*\n$info$\ntags: thunklibs|Vulkan\n$end_info$\n*/\n\n#define VK_USE_64_BIT_PTR_DEFINES 0\n\n#define VK_USE_PLATFORM_XLIB_XRANDR_EXT\n#define VK_USE_PLATFORM_XLIB_KHR\n#define VK_USE_PLATFORM_XCB_KHR\n#define VK_USE_PLATFORM_WAYLAND_KHR\n#include <vulkan/vulkan.h>\n\n#include \"common/Guest.h\"\n\n#include <cstdio>\n#include <dlfcn.h>\n#include <functional>\n#include <string_view>\n#include <unordered_map>\n\n#include \"thunkgen_guest_libvulkan.inl\"\n\nextern \"C\" {\n\n// Maps Vulkan API function names to the address of a guest function which is\n// linked to the corresponding host function pointer\nconst std::unordered_map<std::string_view, uintptr_t /* guest function address */> HostPtrInvokers = std::invoke([]() {\n#define PAIR(name, unused) Ret[#name] = reinterpret_cast<uintptr_t>(GetCallerForHostFunction(name));\n  std::unordered_map<std::string_view, uintptr_t> Ret;\n  FOREACH_internal_SYMBOL(PAIR);\n  return Ret;\n#undef PAIR\n});\n\n// This variable controls the behavior of vkGetDevice/InstanceProcAddr for functions we don't know the signature of:\n// - if false (default), we return a nullptr (since the application might have a fallback code path)\n// - if true, we return a stub function that fatally errors upon being called\nconstexpr bool stub_unknown_functions = false;\n\n// Fatally erroring function with a thunk-like interface. This is used as a placeholder for unknown Vulkan functions\n[[noreturn]]\nstatic void FatalError(void* raw_args) {\n  auto called_function = reinterpret_cast<PackedArguments<void, uintptr_t>*>(raw_args)->a0;\n  fprintf(stderr, \"FATAL: Called unknown Vulkan function at address %p\\n\", reinterpret_cast<void*>(called_function));\n  __builtin_trap();\n}\n\nstatic PFN_vkVoidFunction MakeGuestCallable(const char* origin, PFN_vkVoidFunction func, const char* name) {\n  auto It = HostPtrInvokers.find(name);\n  if (It == HostPtrInvokers.end()) {\n    fprintf(stderr, \"%s: Unknown Vulkan function at address %p: %s\\n\", origin, func, name);\n    if (stub_unknown_functions) {\n      const auto StubHostPtrInvoker = CallHostFunction<FatalError, void>;\n      LinkAddressToFunction((uintptr_t)func, reinterpret_cast<uintptr_t>(StubHostPtrInvoker));\n      return func;\n    }\n    return nullptr;\n  }\n  fprintf(stderr, \"Linking address %p to host invoker %#zx\\n\", func, It->second);\n  LinkAddressToFunction((uintptr_t)func, It->second);\n  return func;\n}\n\nPFN_vkVoidFunction vkGetDeviceProcAddr(VkDevice a_0, const char* a_1) {\n  auto Ret = fexfn_pack_vkGetDeviceProcAddr(a_0, a_1);\n  if (!Ret) {\n    return nullptr;\n  }\n  return MakeGuestCallable(__FUNCTION__, Ret, a_1);\n}\n\nPFN_vkVoidFunction vkGetInstanceProcAddr(VkInstance a_0, const char* a_1) {\n  if (a_1 == std::string_view {\"vkGetDeviceProcAddr\"}) {\n    return (PFN_vkVoidFunction)vkGetDeviceProcAddr;\n  } else {\n    auto Ret = fexfn_pack_vkGetInstanceProcAddr(a_0, a_1);\n    if (!Ret) {\n      return nullptr;\n    }\n    return MakeGuestCallable(__FUNCTION__, Ret, a_1);\n  }\n}\n}\n\nvoid OnInit() {\n  // TODO: Load libX11 on-demand instead\n  void* libx11 = dlopen(\"libX11.so.6\", RTLD_LAZY);\n  fexfn_pack_Vulkan_SetGuestXSync((uintptr_t)dlsym(libx11, \"XSync\"), (uintptr_t)CallbackUnpack<decltype(XSync)>::Unpack);\n  fexfn_pack_Vulkan_SetGuestXGetVisualInfo((uintptr_t)dlsym(libx11, \"XGetVisualInfo\"), (uintptr_t)CallbackUnpack<decltype(XGetVisualInfo)>::Unpack);\n  fexfn_pack_Vulkan_SetGuestXDisplayString((uintptr_t)dlsym(libx11, \"XDisplayString\"), (uintptr_t)CallbackUnpack<decltype(XDisplayString)>::Unpack);\n}\n\nLOAD_LIB_INIT(libvulkan, OnInit)\n"
  },
  {
    "path": "ThunkLibs/libvulkan/Host.cpp",
    "content": "/*\n$info$\ntags: thunklibs|Vulkan\n$end_info$\n*/\n\n#define VK_USE_64_BIT_PTR_DEFINES 0\n\n#define VK_USE_PLATFORM_XLIB_XRANDR_EXT\n#define VK_USE_PLATFORM_XLIB_KHR\n#define VK_USE_PLATFORM_XCB_KHR\n#define VK_USE_PLATFORM_WAYLAND_KHR\n#include <vulkan/vulkan.h>\n\n#include \"common/Host.h\"\n\n#include <cassert>\n#include <cstring>\n#include <mutex>\n#include <span>\n#include <string_view>\n#include <unordered_map>\n#include <vector>\n\n#ifdef IS_32BIT_THUNK\n// Union type embedded in VkDescriptorGetInfoEXT\ntemplate<>\nstruct guest_layout<VkDescriptorDataEXT> {\n  char union_storage[8];\n};\n#endif\n\n#include \"thunkgen_host_libvulkan.inl\"\n\n#include <common/X11Manager.h>\n\nstatic bool SetupInstance {};\nstatic std::mutex SetupMutex {};\n\n#define LDR_PTR(fn) fexldr_ptr_libvulkan_##fn\n\nstatic void DoSetupWithInstance(VkInstance instance) {\n  std::unique_lock lk {SetupMutex};\n\n  // Needed since the Guest-endpoint calls without a function pointer\n  // TODO: Support use of multiple instances\n  (void*&)LDR_PTR(vkGetDeviceProcAddr) = (void*)LDR_PTR(vkGetInstanceProcAddr)(instance, \"vkGetDeviceProcAddr\");\n  if (LDR_PTR(vkGetDeviceProcAddr) == nullptr) {\n    std::abort();\n  }\n\n  // Query pointers for non-EXT functions customized below\n  (void*&)LDR_PTR(vkCreateDevice) = (void*)LDR_PTR(vkGetInstanceProcAddr)(instance, \"vkCreateDevice\");\n\n  // Only do this lookup once.\n  // NOTE: If vkGetInstanceProcAddr was called with a null instance, only a few function pointers will be filled with non-null values, so we do repeat the lookup in that case\n  if (instance) {\n    SetupInstance = true;\n  }\n}\n\n#define FEXFN_IMPL(fn) fexfn_impl_libvulkan_##fn\n\nstatic X11Manager x11_manager;\n\nstatic void fexfn_impl_libvulkan_Vulkan_SetGuestXGetVisualInfo(uintptr_t GuestTarget, uintptr_t GuestUnpacker) {\n  MakeHostTrampolineForGuestFunctionAt(GuestTarget, GuestUnpacker, &x11_manager.GuestXGetVisualInfo);\n}\n\nstatic void fexfn_impl_libvulkan_Vulkan_SetGuestXSync(uintptr_t GuestTarget, uintptr_t GuestUnpacker) {\n  MakeHostTrampolineForGuestFunctionAt(GuestTarget, GuestUnpacker, &x11_manager.GuestXSync);\n}\n\nstatic void fexfn_impl_libvulkan_Vulkan_SetGuestXDisplayString(uintptr_t GuestTarget, uintptr_t GuestUnpacker) {\n  MakeHostTrampolineForGuestFunctionAt(GuestTarget, GuestUnpacker, &x11_manager.GuestXDisplayString);\n}\n\nvoid fex_custom_repack_entry(host_layout<VkXcbSurfaceCreateInfoKHR>& to, const guest_layout<VkXcbSurfaceCreateInfoKHR>& from) {\n  // TODO: xcb_aux_sync?\n  to.data.connection = x11_manager.GuestToHostConnection(const_cast<xcb_connection_t*>(from.data.connection.force_get_host_pointer()));\n}\n\nbool fex_custom_repack_exit(guest_layout<VkXcbSurfaceCreateInfoKHR>&, const host_layout<VkXcbSurfaceCreateInfoKHR>&) {\n  // TODO: xcb_sync?\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkXlibSurfaceCreateInfoKHR>& to, const guest_layout<VkXlibSurfaceCreateInfoKHR>& from) {\n  to.data.dpy = x11_manager.GuestToHostDisplay(const_cast<Display*>(from.data.dpy.force_get_host_pointer()));\n}\n\nbool fex_custom_repack_exit(guest_layout<VkXlibSurfaceCreateInfoKHR>&, const host_layout<VkXlibSurfaceCreateInfoKHR>& from) {\n  x11_manager.HostXFlush(from.data.dpy);\n  return false;\n}\n\nstatic VkResult fexfn_impl_libvulkan_vkAcquireXlibDisplayEXT(VkPhysicalDevice a_0, guest_layout<Display*> a_1, VkDisplayKHR a_2) {\n  auto host_display = x11_manager.GuestToHostDisplay(a_1.force_get_host_pointer());\n  auto ret = fexldr_ptr_libvulkan_vkAcquireXlibDisplayEXT(a_0, host_display, a_2);\n  x11_manager.HostXFlush(host_display);\n  return ret;\n}\n\nstatic VkResult fexfn_impl_libvulkan_vkGetRandROutputDisplayEXT(VkPhysicalDevice a_0, guest_layout<Display*> a_1, RROutput a_2, VkDisplayKHR* a_3) {\n  auto host_display = x11_manager.GuestToHostDisplay(a_1.force_get_host_pointer());\n  auto ret = fexldr_ptr_libvulkan_vkGetRandROutputDisplayEXT(a_0, host_display, a_2, a_3);\n  x11_manager.HostXFlush(host_display);\n  return ret;\n}\n\nstatic VkBool32 fexfn_impl_libvulkan_vkGetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice a_0, uint32_t a_1,\n                                                                                  guest_layout<xcb_connection_t*> a_2, xcb_visualid_t a_3) {\n  auto host_connection = x11_manager.GuestToHostConnection(a_2.force_get_host_pointer());\n  return fexldr_ptr_libvulkan_vkGetPhysicalDeviceXcbPresentationSupportKHR(a_0, a_1, host_connection, a_3);\n}\n\nstatic VkBool32 fexfn_impl_libvulkan_vkGetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice a_0, uint32_t a_1,\n                                                                                   guest_layout<Display*> a_2, VisualID a_3) {\n  auto host_display = x11_manager.GuestToHostDisplay(a_2.force_get_host_pointer());\n  auto ret = fexldr_ptr_libvulkan_vkGetPhysicalDeviceXlibPresentationSupportKHR(a_0, a_1, host_display, a_3);\n  x11_manager.HostXFlush(host_display);\n  return ret;\n}\n\n// Functions with callbacks are overridden to ignore the guest-side callbacks\n\nstatic VkResult\nFEXFN_IMPL(vkCreateShaderModule)(VkDevice a_0, const VkShaderModuleCreateInfo* a_1, const VkAllocationCallbacks* a_2, VkShaderModule* a_3) {\n  (void*&)LDR_PTR(vkCreateShaderModule) = (void*)LDR_PTR(vkGetDeviceProcAddr)(a_0, \"vkCreateShaderModule\");\n  return LDR_PTR(vkCreateShaderModule)(a_0, a_1, nullptr, a_3);\n}\n\nstatic VkBool32\nDummyVkDebugReportCallback(VkDebugReportFlagsEXT, VkDebugReportObjectTypeEXT, uint64_t, size_t, int32_t, const char*, const char*, void*) {\n  return VK_FALSE;\n}\n\nstatic VkResult FEXFN_IMPL(vkCreateInstance)(const VkInstanceCreateInfo* a_0, const VkAllocationCallbacks* a_1, guest_layout<VkInstance*> a_2) {\n  const VkInstanceCreateInfo* vk_struct_base = a_0;\n  for (const VkBaseInStructure* vk_struct = reinterpret_cast<const VkBaseInStructure*>(vk_struct_base); vk_struct->pNext;\n       vk_struct = vk_struct->pNext) {\n    // Override guest callbacks used for VK_EXT_debug_report\n    if (reinterpret_cast<const VkBaseInStructure*>(vk_struct->pNext)->sType == VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT) {\n      // Overwrite the pNext pointer, ignoring its const-qualifier\n      const_cast<VkBaseInStructure*>(vk_struct)->pNext = vk_struct->pNext->pNext;\n\n      // If we copied over a nullptr for pNext then early exit\n      if (!vk_struct->pNext) {\n        break;\n      }\n    }\n  }\n\n  VkInstance out;\n  auto ret = LDR_PTR(vkCreateInstance)(vk_struct_base, nullptr, &out);\n  *a_2.get_pointer() = to_guest(to_host_layout(out));\n  return ret;\n}\n\nstatic VkResult FEXFN_IMPL(vkCreateDevice)(VkPhysicalDevice a_0, const VkDeviceCreateInfo* a_1, const VkAllocationCallbacks* a_2,\n                                           guest_layout<VkDevice*> a_3) {\n  VkDevice out;\n  auto ret = LDR_PTR(vkCreateDevice)(a_0, a_1, nullptr, &out);\n  *a_3.get_pointer() = to_guest(to_host_layout(out));\n\n  // Reload device-specific function pointers used in custom implementations.\n  // This is only done in advance for functions that don't take a VkDevice\n  // argument. Since this breaks multi-device scenarios, other functions reload\n  // the function pointer on-demand.\n  // NOTE: Running KHR-GLES31.core.compute_shader.simple-compute-shared_context with zink may trigger related issues\n  // TODO: Support multi-device scenarios everywhere\n#ifdef IS_32BIT_THUNK\n  fexldr_ptr_libvulkan_vkCmdSetVertexInputEXT = (PFN_vkCmdSetVertexInputEXT)fexldr_ptr_libvulkan_vkGetDeviceProcAddr(out, \"vkCmdSetVertexIn\"\n                                                                                                                          \"putEXT\");\n  fexldr_ptr_libvulkan_vkQueueSubmit = (PFN_vkQueueSubmit)fexldr_ptr_libvulkan_vkGetDeviceProcAddr(out, \"vkQueueSubmit\");\n#else\n  // No functions affected on 64-bit\n#endif\n\n  return ret;\n}\n\nstatic VkResult FEXFN_IMPL(vkAllocateMemory)(VkDevice a_0, const VkMemoryAllocateInfo* a_1, const VkAllocationCallbacks* a_2, VkDeviceMemory* a_3) {\n  (void*&)LDR_PTR(vkAllocateMemory) = (void*)LDR_PTR(vkGetDeviceProcAddr)(a_0, \"vkAllocateMemory\");\n  return LDR_PTR(vkAllocateMemory)(a_0, a_1, nullptr, a_3);\n}\n\nstatic void FEXFN_IMPL(vkFreeMemory)(VkDevice a_0, VkDeviceMemory a_1, const VkAllocationCallbacks* a_2) {\n  (void*&)LDR_PTR(vkFreeMemory) = (void*)LDR_PTR(vkGetDeviceProcAddr)(a_0, \"vkFreeMemory\");\n  LDR_PTR(vkFreeMemory)(a_0, a_1, nullptr);\n}\n\nstatic VkResult FEXFN_IMPL(vkCreateDebugReportCallbackEXT)(VkInstance a_0, guest_layout<const VkDebugReportCallbackCreateInfoEXT*> a_1,\n                                                           const VkAllocationCallbacks* a_2, VkDebugReportCallbackEXT* a_3) {\n  auto overridden_callback = host_layout<VkDebugReportCallbackCreateInfoEXT> {*a_1.get_pointer()}.data;\n  overridden_callback.pfnCallback = DummyVkDebugReportCallback;\n  (void*&)LDR_PTR(vkCreateDebugReportCallbackEXT) = (void*)LDR_PTR(vkGetInstanceProcAddr)(a_0, \"vkCreateDebugReportCallbackEXT\");\n  return LDR_PTR(vkCreateDebugReportCallbackEXT)(a_0, &overridden_callback, nullptr, a_3);\n}\n\nstatic void FEXFN_IMPL(vkDestroyDebugReportCallbackEXT)(VkInstance a_0, VkDebugReportCallbackEXT a_1, const VkAllocationCallbacks* a_2) {\n  (void*&)LDR_PTR(vkDestroyDebugReportCallbackEXT) = (void*)LDR_PTR(vkGetInstanceProcAddr)(a_0, \"vkDestroyDebugReportCallbackEXT\");\n  LDR_PTR(vkDestroyDebugReportCallbackEXT)(a_0, a_1, nullptr);\n}\n\nextern \"C\" VkBool32 DummyVkDebugUtilsMessengerCallback(VkDebugUtilsMessageSeverityFlagBitsEXT, VkDebugUtilsMessageTypeFlagsEXT,\n                                                       const VkDebugUtilsMessengerCallbackDataEXT*, void*) {\n  return VK_FALSE;\n}\n\nstatic VkResult FEXFN_IMPL(vkCreateDebugUtilsMessengerEXT)(VkInstance_T* a_0, guest_layout<const VkDebugUtilsMessengerCreateInfoEXT*> a_1,\n                                                           const VkAllocationCallbacks* a_2, VkDebugUtilsMessengerEXT* a_3) {\n  auto overridden_callback = host_layout<VkDebugUtilsMessengerCreateInfoEXT> {*a_1.get_pointer()}.data;\n  overridden_callback.pfnUserCallback = DummyVkDebugUtilsMessengerCallback;\n  (void*&)LDR_PTR(vkCreateDebugUtilsMessengerEXT) = (void*)LDR_PTR(vkGetInstanceProcAddr)(a_0, \"vkCreateDebugUtilsMessengerEXT\");\n  return LDR_PTR(vkCreateDebugUtilsMessengerEXT)(a_0, &overridden_callback, nullptr, a_3);\n}\n\n#ifdef IS_32BIT_THUNK\nVkResult fexfn_impl_libvulkan_vkEnumeratePhysicalDevices(VkInstance instance, uint32_t* count, guest_layout<VkPhysicalDevice*> devices) {\n  if (!devices.get_pointer()) {\n    return fexldr_ptr_libvulkan_vkEnumeratePhysicalDevices(instance, count, nullptr);\n  }\n\n  auto input_count = *count;\n  std::vector<VkPhysicalDevice> out(input_count);\n  auto ret = fexldr_ptr_libvulkan_vkEnumeratePhysicalDevices(instance, count, out.data());\n  for (size_t i = 0; i < std::min(input_count, *count); ++i) {\n    devices.get_pointer()[i] = to_guest(to_host_layout(out[i]));\n  }\n  return ret;\n}\n\nvoid fexfn_impl_libvulkan_vkGetDeviceQueue(VkDevice device, uint32_t family_index, uint32_t queue_index, guest_layout<VkQueue*> queue) {\n  VkQueue out;\n  (void*&)fexldr_ptr_libvulkan_vkGetDeviceQueue = (void*)LDR_PTR(vkGetDeviceProcAddr)(device, \"vkGetDeviceQueue\");\n  fexldr_ptr_libvulkan_vkGetDeviceQueue(device, family_index, queue_index, &out);\n  *queue.get_pointer() = to_guest(to_host_layout(out));\n}\n\nVkResult fexfn_impl_libvulkan_vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo* info,\n                                                       guest_layout<VkCommandBuffer*> buffers) {\n  std::vector<VkCommandBuffer> out(info->commandBufferCount);\n  (void*&)fexldr_ptr_libvulkan_vkAllocateCommandBuffers = (void*)LDR_PTR(vkGetDeviceProcAddr)(device, \"vkAllocateCommandBuffers\");\n  auto ret = fexldr_ptr_libvulkan_vkAllocateCommandBuffers(device, info, out.data());\n  if (ret == VK_SUCCESS) {\n    for (size_t i = 0; i < info->commandBufferCount; ++i) {\n      buffers.get_pointer()[i] = to_guest(to_host_layout(out[i]));\n    }\n  }\n  return ret;\n}\n\nVkResult fexfn_impl_libvulkan_vkMapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,\n                                          VkMemoryMapFlags flags, guest_layout<void**> data) {\n  host_layout<void*> host_data {};\n  void* mapped;\n  (void*&)fexldr_ptr_libvulkan_vkMapMemory = (void*)LDR_PTR(vkGetDeviceProcAddr)(device, \"vkMapMemory\");\n  auto ret = fexldr_ptr_libvulkan_vkMapMemory(device, memory, offset, size, flags, &mapped);\n  if (ret == VK_SUCCESS) {\n    host_data.data = mapped;\n    *data.get_pointer() = to_guest(host_data);\n  }\n  return ret;\n}\n\n// Allocates storage on the heap that must be de-allocated using delete[] or DeleteRepackedStructArray\ntemplate<bool NeedsRepack = true, typename T>\nstd::span<std::remove_cv_t<T>> RepackStructArray(uint32_t Count, const guest_layout<T*> GuestData) {\n  if (!GuestData.get_pointer() || Count == 0) {\n    return {};\n  }\n\n  auto HostData = new std::remove_cv_t<T>[Count];\n  for (size_t i = 0; i < Count; ++i) {\n    auto& GuestElement = (const guest_layout<std::remove_cv_t<T>>&)GuestData.get_pointer()[i];\n    auto Element = host_layout<std::remove_cv_t<T>> {GuestElement};\n    if constexpr (NeedsRepack) {\n      fex_apply_custom_repacking_entry(Element, GuestElement);\n    }\n    HostData[i] = Element.data;\n  }\n  return {HostData, Count};\n}\n\ntemplate<typename T>\nvoid DeleteRepackedStructArray(uint32_t Count, T* HostData, guest_layout<T*>& GuestData) {\n  for (uint32_t i = 0; i < Count; ++i) {\n    fex_apply_custom_repacking_exit(GuestData.get_pointer()[i], to_host_layout(HostData[i]));\n  }\n  delete[] HostData;\n}\n\nvoid fexfn_impl_libvulkan_vkCmdSetVertexInputEXT(\n  VkCommandBuffer Buffer, uint32_t BindingDescCount, guest_layout<const VkVertexInputBindingDescription2EXT*> GuestBindingDescs,\n  uint32_t AttributeDescCount, guest_layout<const VkVertexInputAttributeDescription2EXT*> GuestAttributeDescs) {\n\n  assert(GuestBindingDescs.get_pointer() && BindingDescCount > 0);\n  assert(GuestAttributeDescs.get_pointer() && AttributeDescCount > 0);\n\n  auto BindingDescs = RepackStructArray(BindingDescCount, GuestBindingDescs);\n  auto AttributeDescs = RepackStructArray(AttributeDescCount, GuestAttributeDescs);\n\n  fexldr_ptr_libvulkan_vkCmdSetVertexInputEXT(Buffer, BindingDescCount, BindingDescs.data(), AttributeDescCount, AttributeDescs.data());\n\n  delete[] AttributeDescs.data();\n  delete[] BindingDescs.data();\n}\n\nvoid fexfn_impl_libvulkan_vkUpdateDescriptorSets(VkDevice device, unsigned int descriptorWriteCount,\n                                                 guest_layout<const VkWriteDescriptorSet*> pDescriptorWrites, unsigned int descriptorCopyCount,\n                                                 guest_layout<const VkCopyDescriptorSet*> pDescriptorCopies) {\n\n  auto HostDescriptorWrites = RepackStructArray(descriptorWriteCount, pDescriptorWrites);\n  auto HostDescriptorCopies = RepackStructArray(descriptorCopyCount, pDescriptorCopies);\n\n  (void*&)fexldr_ptr_libvulkan_vkUpdateDescriptorSets = (void*)LDR_PTR(vkGetDeviceProcAddr)(device, \"vkUpdateDescriptorSets\");\n  fexldr_ptr_libvulkan_vkUpdateDescriptorSets(device, descriptorWriteCount, HostDescriptorWrites.data(), descriptorCopyCount,\n                                              HostDescriptorCopies.data());\n\n  delete[] HostDescriptorCopies.data();\n  delete[] HostDescriptorWrites.data();\n}\n\nVkResult fexfn_impl_libvulkan_vkQueueSubmit(VkQueue queue, uint32_t submit_count, guest_layout<const VkSubmitInfo*> submit_infos, VkFence fence) {\n\n  auto HostSubmitInfos = RepackStructArray(submit_count, submit_infos);\n  auto ret = fexldr_ptr_libvulkan_vkQueueSubmit(queue, submit_count, HostSubmitInfos.data(), fence);\n  delete[] HostSubmitInfos.data();\n  return ret;\n}\n\nvoid fexfn_impl_libvulkan_vkFreeCommandBuffers(VkDevice device, VkCommandPool pool, uint32_t num_buffers,\n                                               guest_layout<const VkCommandBuffer*> buffers) {\n\n  auto HostBuffers = RepackStructArray<false>(num_buffers, buffers);\n  (void*&)fexldr_ptr_libvulkan_vkFreeCommandBuffers = (void*)LDR_PTR(vkGetDeviceProcAddr)(device, \"vkFreeCommandBuffers\");\n  fexldr_ptr_libvulkan_vkFreeCommandBuffers(device, pool, num_buffers, HostBuffers.data());\n  delete[] HostBuffers.data();\n}\n\nVkResult fexfn_impl_libvulkan_vkGetPipelineCacheData(VkDevice device, VkPipelineCache cache, guest_layout<uint32_t*> guest_data_size, void* data) {\n  size_t data_size = guest_data_size.get_pointer()->data;\n  (void*&)fexldr_ptr_libvulkan_vkGetPipelineCacheData = (void*)LDR_PTR(vkGetDeviceProcAddr)(device, \"vkGetPipelineCacheData\");\n  auto ret = fexldr_ptr_libvulkan_vkGetPipelineCacheData(device, cache, &data_size, data);\n  *guest_data_size.get_pointer() = data_size;\n  return ret;\n}\n\n#endif\n\nstatic PFN_vkVoidFunction LookupCustomVulkanFunction(const char* a_1) {\n  using namespace std::string_view_literals;\n\n  if (a_1 == \"vkCreateShaderModule\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkCreateShaderModule;\n  } else if (a_1 == \"vkCreateInstance\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkCreateInstance;\n  } else if (a_1 == \"vkCreateDevice\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkCreateDevice;\n  } else if (a_1 == \"vkAllocateMemory\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkAllocateMemory;\n  } else if (a_1 == \"vkFreeMemory\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkFreeMemory;\n  } else if (a_1 == \"vkAcquireXlibDisplayEXT\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkAcquireXlibDisplayEXT;\n  } else if (a_1 == \"vkGetRandROutputDisplayEXT\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkGetRandROutputDisplayEXT;\n  } else if (a_1 == \"vkGetPhysicalDeviceXcbPresentationSupportKHR\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkGetPhysicalDeviceXcbPresentationSupportKHR;\n  } else if (a_1 == \"vkGetPhysicalDeviceXlibPresentationSupportKHR\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkGetPhysicalDeviceXlibPresentationSupportKHR;\n#ifdef IS_32BIT_THUNK\n  } else if (a_1 == \"vkAllocateCommandBuffers\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkAllocateCommandBuffers;\n  } else if (a_1 == \"vkEnumeratePhysicalDevices\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkEnumeratePhysicalDevices;\n  } else if (a_1 == \"vkFreeCommandBuffers\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkFreeCommandBuffers;\n  } else if (a_1 == \"vkGetDeviceQueue\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkGetDeviceQueue;\n  } else if (a_1 == \"vkGetPipelineCacheData\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkGetPipelineCacheData;\n  } else if (a_1 == \"vkMapMemory\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkMapMemory;\n  } else if (a_1 == \"vkQueueSubmit\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkQueueSubmit;\n  } else if (a_1 == \"vkCmdSetVertexInputEXT\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkCmdSetVertexInputEXT;\n  } else if (a_1 == \"vkUpdateDescriptorSets\"sv) {\n    return (PFN_vkVoidFunction)fexfn_impl_libvulkan_vkUpdateDescriptorSets;\n#endif\n  }\n  return nullptr;\n}\n\nstatic PFN_vkVoidFunction FEXFN_IMPL(vkGetDeviceProcAddr)(VkDevice a_0, const char* a_1) {\n  // Just return the host facing function pointer\n  // The guest will handle mapping if this exists\n\n  // Check for functions with custom implementations first\n  if (auto ptr = LookupCustomVulkanFunction(a_1)) {\n    return ptr;\n  }\n\n  return LDR_PTR(vkGetDeviceProcAddr)(a_0, a_1);\n}\n\nstatic PFN_vkVoidFunction FEXFN_IMPL(vkGetInstanceProcAddr)(VkInstance a_0, const char* a_1) {\n  // Just return the host facing function pointer\n  // The guest will handle mapping if it exists\n\n  if (!SetupInstance && a_0) {\n    DoSetupWithInstance(a_0);\n  }\n\n  // Check for functions with custom implementations first\n  if (auto ptr = LookupCustomVulkanFunction(a_1)) {\n    // If this function belongs to an instance extension, requery its address.\n    // This ensures fexldr_ptr_* is valid if the application creates a minimal\n    // VkInstance with no extensions before creating its actual instance.\n    using namespace std::string_view_literals;\n    if (a_1 == \"vkGetRandROutputDisplayEXT\"sv && !LDR_PTR(vkGetRandROutputDisplayEXT)) {\n      (void*&)LDR_PTR(vkGetRandROutputDisplayEXT) = (void*)LDR_PTR(vkGetInstanceProcAddr)(a_0, \"vkGetRandROutputDisplayEXT\");\n    }\n    if (a_1 == \"vkAcquireXlibDisplayEXT\"sv && !LDR_PTR(vkAcquireXlibDisplayEXT)) {\n      (void*&)LDR_PTR(vkAcquireXlibDisplayEXT) = (void*)LDR_PTR(vkGetInstanceProcAddr)(a_0, \"vkAcquireXlibDisplayEXT\");\n    }\n    const char* XcbPresent = \"vkGetPhysicalDeviceXcbPresentationSupportKHR\";\n    if (a_1 == std::string_view {XcbPresent} && !LDR_PTR(vkGetPhysicalDeviceXcbPresentationSupportKHR)) {\n      (void*&)LDR_PTR(vkGetPhysicalDeviceXcbPresentationSupportKHR) = (void*)LDR_PTR(vkGetInstanceProcAddr)(a_0, XcbPresent);\n    }\n    const char* XlibPresent = \"vkGetPhysicalDeviceXlibPresentationSupportKHR\";\n    if (a_1 == std::string_view {XlibPresent} && !LDR_PTR(vkGetPhysicalDeviceXlibPresentationSupportKHR)) {\n      (void*&)LDR_PTR(vkGetPhysicalDeviceXlibPresentationSupportKHR) = (void*)LDR_PTR(vkGetInstanceProcAddr)(a_0, XlibPresent);\n    }\n\n    return ptr;\n  }\n\n  return LDR_PTR(vkGetInstanceProcAddr)(a_0, a_1);\n}\n\n#ifdef IS_32BIT_THUNK\ntemplate<VkStructureType TypeIndex, typename Type>\nstatic VkBaseOutStructure* convert(const guest_layout<VkBaseOutStructure>* source) {\n  // Using malloc here since no easily available type information is available at the time of destruction.\n  auto typed_source = reinterpret_cast<const guest_layout<Type>*>(source);\n  auto child_mem = (char*)aligned_alloc(alignof(host_layout<Type>), sizeof(host_layout<Type>));\n  auto child = new (child_mem) host_layout<Type> {*typed_source};\n\n  fex_custom_repack_entry(*child, *typed_source);\n\n  return reinterpret_cast<VkBaseOutStructure*>(&child->data);\n}\n\ntemplate<VkStructureType TypeIndex, typename Type>\nstatic void convert_to_guest(void* into, const VkBaseOutStructure* from) {\n  auto typed_into = reinterpret_cast<guest_layout<Type>*>(into);\n  auto oldNext = typed_into->data.pNext; // TODO: This assumes Vulkan never modifies pNext internally\n  *typed_into = to_guest(to_host_layout(*(Type*)from));\n  typed_into->data.pNext = oldNext;\n\n  fex_custom_repack_exit(*typed_into, to_host_layout(*(Type*)from));\n}\n\ntemplate<VkStructureType TypeIndex, typename Type>\ninline constexpr std::pair<VkStructureType, std::pair<VkBaseOutStructure* (*)(const guest_layout<VkBaseOutStructure>*), void (*)(void*, const VkBaseOutStructure*)>>\n  converters = {TypeIndex, {convert<TypeIndex, Type>, convert_to_guest<TypeIndex, Type>}};\n\n// NOTE: Not all Vulkan structures with pNext members are listed here. This is because excluding structs exclusively used as top-level entries is useful to detect repacking bugs.\nstatic std::unordered_map<VkStructureType, std::pair<VkBaseOutStructure* (*)(const guest_layout<VkBaseOutStructure>*), void (*)(void*, const VkBaseOutStructure*)>> next_handlers {\n  converters<VkStructureType::VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV, VkAccelerationStructureMotionInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_AMIGO_PROFILING_SUBMIT_INFO_SEC, VkAmigoProfilingSubmitInfoSEC>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT, VkAttachmentDescriptionStencilLayout>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT, VkAttachmentReferenceStencilLayout>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD, VkAttachmentSampleCountInfoAMD>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO, VkBindBufferMemoryDeviceGroupInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO, VkBindImageMemoryDeviceGroupInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR, VkBindImageMemorySwapchainInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO, VkBindImagePlaneMemoryInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT, VkBufferDeviceAddressCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO, VkBufferOpaqueCaptureAddressCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR, VkBufferUsageFlags2CreateInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT, VkCommandBufferInheritanceConditionalRenderingInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO, VkCommandBufferInheritanceRenderingInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM, VkCommandBufferInheritanceRenderPassTransformInfoQCOM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV, VkCommandBufferInheritanceViewportScissorInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM, VkCopyCommandTransformInfoQCOM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, VkDebugReportCallbackCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, VkDebugUtilsMessengerCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, VkDebugUtilsObjectNameInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV, VkDedicatedAllocationBufferCreateInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV, VkDedicatedAllocationImageCreateInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV, VkDedicatedAllocationMemoryAllocateInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEPTH_BIAS_REPRESENTATION_INFO_EXT, VkDepthBiasRepresentationInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_PUSH_DESCRIPTOR_BUFFER_HANDLE_EXT, VkDescriptorBufferBindingPushDescriptorBufferHandleEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO, VkDescriptorPoolInlineUniformBlockCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO, VkDescriptorSetLayoutBindingFlagsCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO, VkDescriptorSetVariableDescriptorCountAllocateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT, VkDescriptorSetVariableDescriptorCountLayoutSupport>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEVICE_ADDRESS_BINDING_CALLBACK_DATA_EXT, VkDeviceAddressBindingCallbackDataEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV, VkDeviceDiagnosticsConfigCreateInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO, VkDeviceGroupCommandBufferBeginInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR, VkDeviceGroupPresentInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO, VkDeviceGroupRenderPassBeginInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO, VkDeviceGroupSubmitInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR, VkDeviceGroupSwapchainCreateInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD, VkDeviceMemoryOverallocationCreateInfoAMD>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO, VkDevicePrivateDataCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR, VkDeviceQueueGlobalPriorityCreateInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD, VkDisplayNativeHdrSurfaceCapabilitiesAMD>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR, VkDisplayPresentInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO, VkExportFenceCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO, VkExportMemoryAllocateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV, VkExportMemoryAllocateInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO, VkExportSemaphoreCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES, VkExternalImageFormatProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_EXT, VkExternalMemoryAcquireUnmodifiedEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO, VkExternalMemoryBufferCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO, VkExternalMemoryImageCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV, VkExternalMemoryImageCreateInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT, VkFilterCubicImageViewImageFormatPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3, VkFormatProperties3>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_LIBRARY_CREATE_INFO_EXT, VkGraphicsPipelineLibraryCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY_EXT, VkHostImageCopyDevicePerformanceQueryEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_CONTROL_EXT, VkImageCompressionControlEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_PROPERTIES_EXT, VkImageCompressionPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT, VkImageDrmFormatModifierListCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO, VkImageFormatListCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO, VkImagePlaneMemoryRequirementsInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO, VkImageStencilUsageCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR, VkImageSwapchainCreateInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT, VkImageViewASTCDecodeModeEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT, VkImageViewMinLodCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_IMAGE_VIEW_SAMPLE_WEIGHT_CREATE_INFO_QCOM, VkImageViewSampleWeightCreateInfoQCOM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_IMAGE_VIEW_SLICED_CREATE_INFO_EXT, VkImageViewSlicedCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, VkImageViewUsageCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR, VkImportMemoryFdInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO, VkMemoryAllocateFlagsInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_MEMORY_BARRIER_2, VkMemoryBarrier2>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, VkMemoryDedicatedAllocateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS, VkMemoryDedicatedRequirements>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO, VkMemoryOpaqueCaptureAddressAllocateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT, VkMemoryPriorityAllocateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT, VkMultisampledRenderToSingleSampledInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX, VkMultiviewPerViewAttributesInfoNVX>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_RENDER_AREAS_RENDER_PASS_BEGIN_INFO_QCOM, VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_INFO_NV, VkOpticalFlowImageFormatInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR, VkPerformanceQuerySubmitInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, VkPhysicalDevice16BitStorageFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT, VkPhysicalDevice4444FormatsFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, VkPhysicalDevice8BitStorageFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR, VkPhysicalDeviceAccelerationStructureFeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR, VkPhysicalDeviceAccelerationStructurePropertiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT, VkPhysicalDeviceAddressBindingReportFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC, VkPhysicalDeviceAmigoProfilingFeaturesSEC>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, VkPhysicalDeviceASTCDecodeFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT, VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT, VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT, VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT, VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT, VkPhysicalDeviceBorderColorSwizzleFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, VkPhysicalDeviceBufferDeviceAddressFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI, VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_PROPERTIES_HUAWEI, VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD, VkPhysicalDeviceCoherentMemoryFeaturesAMD>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT, VkPhysicalDeviceColorWriteEnableFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV, VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT, VkPhysicalDeviceConditionalRenderingFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT, VkPhysicalDeviceConservativeRasterizationPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR, VkPhysicalDeviceCooperativeMatrixFeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV, VkPhysicalDeviceCooperativeMatrixFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR, VkPhysicalDeviceCooperativeMatrixPropertiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV, VkPhysicalDeviceCooperativeMatrixPropertiesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV, VkPhysicalDeviceCopyMemoryIndirectFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_PROPERTIES_NV, VkPhysicalDeviceCopyMemoryIndirectPropertiesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV, VkPhysicalDeviceCornerSampledImageFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV, VkPhysicalDeviceCoverageReductionModeFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, VkPhysicalDeviceCustomBorderColorFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT, VkPhysicalDeviceCustomBorderColorPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV, VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT, VkPhysicalDeviceDepthBiasControlFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT, VkPhysicalDeviceDepthClampZeroOneFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT, VkPhysicalDeviceDepthClipControlFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT, VkPhysicalDeviceDepthClipEnableFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES, VkPhysicalDeviceDepthStencilResolveProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_DENSITY_MAP_PROPERTIES_EXT, VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT, VkPhysicalDeviceDescriptorBufferFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT, VkPhysicalDeviceDescriptorBufferPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES, VkPhysicalDeviceDescriptorIndexingFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES, VkPhysicalDeviceDescriptorIndexingProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE, VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_COMPUTE_FEATURES_NV, VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV, VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV, VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT, VkPhysicalDeviceDeviceMemoryReportFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV, VkPhysicalDeviceDiagnosticsConfigFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT, VkPhysicalDeviceDiscardRectanglePropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES, VkPhysicalDeviceDriverProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT, VkPhysicalDeviceDrmPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES, VkPhysicalDeviceDynamicRenderingFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT, VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV, VkPhysicalDeviceExclusiveScissorFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, VkPhysicalDeviceExtendedDynamicState3FeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_PROPERTIES_EXT, VkPhysicalDeviceExtendedDynamicState3PropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO, VkPhysicalDeviceExternalImageFormatInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT, VkPhysicalDeviceExternalMemoryHostPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV, VkPhysicalDeviceExternalMemoryRDMAFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT, VkPhysicalDeviceFaultFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, VkPhysicalDeviceFeatures2>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, VkPhysicalDeviceFloatControlsProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT, VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT, VkPhysicalDeviceFragmentDensityMap2PropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT, VkPhysicalDeviceFragmentDensityMapFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM, VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_QCOM, VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT, VkPhysicalDeviceFragmentDensityMapPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR, VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_PROPERTIES_KHR, VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT, VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV, VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV, VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, VkPhysicalDeviceFragmentShadingRateFeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR, VkPhysicalDeviceFragmentShadingRatePropertiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR, VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT, VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT, VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT, VkPhysicalDeviceHostImageCopyFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT, VkPhysicalDeviceHostImageCopyPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES, VkPhysicalDeviceHostQueryResetFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES, VkPhysicalDeviceIDProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT, VkPhysicalDeviceImage2DViewOf3DFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT, VkPhysicalDeviceImageCompressionControlFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT, VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT, VkPhysicalDeviceImageDrmFormatModifierInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES, VkPhysicalDeviceImagelessFramebufferFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM, VkPhysicalDeviceImageProcessingFeaturesQCOM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_PROPERTIES_QCOM, VkPhysicalDeviceImageProcessingPropertiesQCOM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES, VkPhysicalDeviceImageRobustnessFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT, VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT, VkPhysicalDeviceImageViewImageFormatInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT, VkPhysicalDeviceImageViewMinLodFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, VkPhysicalDeviceIndexTypeUint8FeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV, VkPhysicalDeviceInheritedViewportScissorFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES, VkPhysicalDeviceInlineUniformBlockFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES, VkPhysicalDeviceInlineUniformBlockProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI, VkPhysicalDeviceInvocationMaskFeaturesHUAWEI>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT, VkPhysicalDeviceLegacyDitheringFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV, VkPhysicalDeviceLinearColorAttachmentFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, VkPhysicalDeviceLineRasterizationFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT, VkPhysicalDeviceLineRasterizationPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, VkPhysicalDeviceMaintenance3Properties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES, VkPhysicalDeviceMaintenance4Features>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES, VkPhysicalDeviceMaintenance4Properties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR, VkPhysicalDeviceMaintenance5FeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR, VkPhysicalDeviceMaintenance5PropertiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT, VkPhysicalDeviceMemoryBudgetPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV, VkPhysicalDeviceMemoryDecompressionFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_NV, VkPhysicalDeviceMemoryDecompressionPropertiesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT, VkPhysicalDeviceMemoryPriorityFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT, VkPhysicalDeviceMeshShaderFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV, VkPhysicalDeviceMeshShaderFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_EXT, VkPhysicalDeviceMeshShaderPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV, VkPhysicalDeviceMeshShaderPropertiesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT, VkPhysicalDeviceMultiDrawFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT, VkPhysicalDeviceMultiDrawPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT, VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, VkPhysicalDeviceMultiviewFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_RENDER_AREAS_FEATURES_QCOM, VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM, VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, VkPhysicalDeviceMultiviewProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT, VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT, VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT, VkPhysicalDeviceOpacityMicromapFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_PROPERTIES_EXT, VkPhysicalDeviceOpacityMicromapPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV, VkPhysicalDeviceOpticalFlowFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV, VkPhysicalDeviceOpticalFlowPropertiesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT, VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT, VkPhysicalDevicePCIBusInfoPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR, VkPhysicalDevicePerformanceQueryFeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR, VkPhysicalDevicePerformanceQueryPropertiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES, VkPhysicalDevicePipelineCreationCacheControlFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR, VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT, VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT, VkPhysicalDevicePipelinePropertiesFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT, VkPhysicalDevicePipelineProtectedAccessFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT, VkPhysicalDevicePipelineRobustnessFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES_EXT, VkPhysicalDevicePipelineRobustnessPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES, VkPhysicalDevicePointClippingProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV, VkPhysicalDevicePresentBarrierFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR, VkPhysicalDevicePresentIdFeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR, VkPhysicalDevicePresentWaitFeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES, VkPhysicalDevicePrivateDataFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, VkPhysicalDeviceProtectedMemoryFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES, VkPhysicalDeviceProtectedMemoryProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, VkPhysicalDeviceProvokingVertexFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT, VkPhysicalDeviceProvokingVertexPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR, VkPhysicalDevicePushDescriptorPropertiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT, VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR, VkPhysicalDeviceRayQueryFeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV, VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV, VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR, VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV, VkPhysicalDeviceRayTracingMotionBlurFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, VkPhysicalDeviceRayTracingPipelineFeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR, VkPhysicalDeviceRayTracingPipelinePropertiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR, VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV, VkPhysicalDeviceRayTracingPropertiesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV, VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT, VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, VkPhysicalDeviceRobustness2FeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT, VkPhysicalDeviceRobustness2PropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT, VkPhysicalDeviceSampleLocationsPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES, VkPhysicalDeviceSamplerFilterMinmaxProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, VkPhysicalDeviceSamplerYcbcrConversionFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES, VkPhysicalDeviceScalarBlockLayoutFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES, VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT, VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES, VkPhysicalDeviceShaderAtomicInt64Features>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR, VkPhysicalDeviceShaderClockFeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM, VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_PROPERTIES_ARM, VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD, VkPhysicalDeviceShaderCoreProperties2AMD>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD, VkPhysicalDeviceShaderCorePropertiesAMD>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_ARM, VkPhysicalDeviceShaderCorePropertiesARM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES, VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, VkPhysicalDeviceShaderDrawParametersFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD, VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, VkPhysicalDeviceShaderFloat16Int8Features>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT, VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV, VkPhysicalDeviceShaderImageFootprintFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES, VkPhysicalDeviceShaderIntegerDotProductFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES, VkPhysicalDeviceShaderIntegerDotProductProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL, VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT, VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT, VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT, VkPhysicalDeviceShaderObjectFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_PROPERTIES_EXT, VkPhysicalDeviceShaderObjectPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV, VkPhysicalDeviceShaderSMBuiltinsFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV, VkPhysicalDeviceShaderSMBuiltinsPropertiesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR, VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES, VkPhysicalDeviceShaderTerminateInvocationFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT, VkPhysicalDeviceShaderTileImageFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_PROPERTIES_EXT, VkPhysicalDeviceShaderTileImagePropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV, VkPhysicalDeviceShadingRateImageFeaturesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV, VkPhysicalDeviceShadingRateImagePropertiesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, VkPhysicalDeviceSubgroupProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES, VkPhysicalDeviceSubgroupSizeControlFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES, VkPhysicalDeviceSubgroupSizeControlProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT, VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI, VkPhysicalDeviceSubpassShadingFeaturesHUAWEI>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI, VkPhysicalDeviceSubpassShadingPropertiesHUAWEI>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT, VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES, VkPhysicalDeviceSynchronization2Features>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES, VkPhysicalDeviceTexelBufferAlignmentProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES, VkPhysicalDeviceTextureCompressionASTCHDRFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM, VkPhysicalDeviceTilePropertiesFeaturesQCOM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, VkPhysicalDeviceTimelineSemaphoreFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES, VkPhysicalDeviceTimelineSemaphoreProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, VkPhysicalDeviceTransformFeedbackFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT, VkPhysicalDeviceTransformFeedbackPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES, VkPhysicalDeviceUniformBufferStandardLayoutFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, VkPhysicalDeviceVariablePointersFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT, VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, VkPhysicalDeviceVulkan11Features>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, VkPhysicalDeviceVulkan11Properties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, VkPhysicalDeviceVulkan12Features>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, VkPhysicalDeviceVulkan12Properties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, VkPhysicalDeviceVulkan13Features>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, VkPhysicalDeviceVulkan13Properties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES, VkPhysicalDeviceVulkanMemoryModelFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR, VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT, VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT, VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES, VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT, VkPipelineColorBlendAdvancedStateCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT, VkPipelineColorWriteCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD, VkPipelineCompilerControlCreateInfoAMD>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV, VkPipelineCoverageModulationStateCreateInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV, VkPipelineCoverageReductionStateCreateInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV, VkPipelineCoverageToColorStateCreateInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR, VkPipelineCreateFlags2CreateInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT, VkPipelineDiscardRectangleStateCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV, VkPipelineFragmentShadingRateEnumStateCreateInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR, VkPipelineFragmentShadingRateStateCreateInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR, VkPipelineLibraryCreateInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT, VkPipelineRasterizationConservativeStateCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT, VkPipelineRasterizationDepthClipStateCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT, VkPipelineRasterizationLineStateCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT, VkPipelineRasterizationProvokingVertexStateCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD, VkPipelineRasterizationStateRasterizationOrderAMD>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT, VkPipelineRasterizationStateStreamCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO, VkPipelineRenderingCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV, VkPipelineRepresentativeFragmentTestStateCreateInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO_EXT, VkPipelineRobustnessCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT, VkPipelineSampleLocationsStateCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_MODULE_IDENTIFIER_CREATE_INFO_EXT, VkPipelineShaderStageModuleIdentifierCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO, VkPipelineShaderStageRequiredSubgroupSizeCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO, VkPipelineTessellationDomainOriginStateCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT, VkPipelineVertexInputDivisorStateCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT, VkPipelineViewportDepthClipControlCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV, VkPipelineViewportExclusiveScissorStateCreateInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV, VkPipelineViewportSwizzleStateCreateInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV, VkPipelineViewportWScalingStateCreateInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PRESENT_ID_KHR, VkPresentIdKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO, VkProtectedSubmitInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR, VkQueryPoolPerformanceCreateInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL, VkQueryPoolPerformanceQueryCreateInfoINTEL>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV, VkQueueFamilyCheckpointProperties2NV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV, VkQueueFamilyCheckpointPropertiesNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR, VkQueueFamilyGlobalPriorityPropertiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR, VkQueueFamilyQueryResultStatusPropertiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR, VkQueueFamilyVideoPropertiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT, VkRenderingFragmentDensityMapAttachmentInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR, VkRenderingFragmentShadingRateAttachmentInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO, VkRenderPassAttachmentBeginInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT, VkRenderPassCreationControlEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT, VkRenderPassCreationFeedbackCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT, VkRenderPassFragmentDensityMapCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO, VkRenderPassInputAttachmentAspectCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, VkRenderPassMultiviewCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT, VkRenderPassSubpassFeedbackCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM, VkRenderPassTransformBeginInfoQCOM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT, VkSampleLocationsInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT, VkSamplerBorderColorComponentMappingCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT, VkSamplerCustomBorderColorCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO, VkSamplerReductionModeCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES, VkSamplerYcbcrConversionImageFormatProperties>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO, VkSamplerYcbcrConversionInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO, VkSemaphoreTypeCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, VkShaderModuleCreateInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT, VkShaderModuleValidationCacheCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR, VkSharedPresentSurfaceCapabilitiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SUBPASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_QCOM, VkSubpassFragmentDensityMapOffsetEndInfoQCOM>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SUBPASS_RESOLVE_PERFORMANCE_QUERY_EXT, VkSubpassResolvePerformanceQueryEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI, VkSubpassShadingPipelineCreateInfoHUAWEI>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SUBRESOURCE_HOST_MEMCPY_SIZE_EXT, VkSubresourceHostMemcpySizeEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_PRESENT_BARRIER_NV, VkSurfaceCapabilitiesPresentBarrierNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT, VkSurfacePresentModeCompatibilityEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT, VkSurfacePresentModeEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT, VkSurfacePresentScalingCapabilitiesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR, VkSurfaceProtectedCapabilitiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT, VkSwapchainCounterCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD, VkSwapchainDisplayNativeHdrCreateInfoAMD>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_BARRIER_CREATE_INFO_NV, VkSwapchainPresentBarrierCreateInfoNV>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT, VkSwapchainPresentFenceInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT, VkSwapchainPresentModeInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT, VkSwapchainPresentModesCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT, VkSwapchainPresentScalingCreateInfoEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD, VkTextureLODGatherFormatPropertiesAMD>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, VkTimelineSemaphoreSubmitInfo>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT, VkValidationFeaturesEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT, VkValidationFlagsEXT>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR, VkVideoDecodeCapabilitiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR, VkVideoDecodeH264CapabilitiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR, VkVideoDecodeH264DpbSlotInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR, VkVideoDecodeH264PictureInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR, VkVideoDecodeH264ProfileInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR, VkVideoDecodeH265CapabilitiesKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR, VkVideoDecodeH265DpbSlotInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR, VkVideoDecodeH265PictureInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR, VkVideoDecodeH265ProfileInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_VIDEO_DECODE_USAGE_INFO_KHR, VkVideoDecodeUsageInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR, VkVideoProfileInfoKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR, VkWriteDescriptorSetAccelerationStructureKHR>,\n  converters<VkStructureType::VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV, VkWriteDescriptorSetAccelerationStructureNV>,\n};\n\nstatic void default_fex_custom_repack_entry(VkBaseOutStructure& into, const guest_layout<VkBaseOutStructure>* from) {\n  if (!from->data.pNext.get_pointer()) {\n    into.pNext = nullptr;\n    return;\n  }\n  auto typed_source = reinterpret_cast<const guest_layout<VkBaseOutStructure>*>(from->data.pNext.get_pointer());\n\n  auto next_handler = next_handlers.find(static_cast<VkStructureType>(typed_source->data.sType.data));\n  if (next_handler == next_handlers.end()) {\n    fprintf(stderr, \"ERROR: Unrecognized VkStructureType %u referenced by pNext\\n\", typed_source->data.sType.data);\n    std::abort();\n  }\n\n  into.pNext = next_handler->second.first(typed_source);\n}\n\ntemplate<typename T>\nvoid default_fex_custom_repack_entry(host_layout<T>& into, const guest_layout<T>& from) {\n  default_fex_custom_repack_entry(*(VkBaseOutStructure*)&into.data, reinterpret_cast<const guest_layout<VkBaseOutStructure>*>(&from));\n}\n\nstatic void default_fex_custom_repack_reverse(guest_layout<VkBaseOutStructure>& into, const VkBaseOutStructure* from) {\n  auto pNextHost = from->pNext;\n  if (!pNextHost) {\n    return;\n  }\n\n  auto next_handler = next_handlers.find(static_cast<VkStructureType>(into.data.pNext.get_pointer()->data.sType.data));\n  if (next_handler == next_handlers.end()) {\n    fprintf(stderr, \"ERROR: Unrecognized VkStructureType %u referenced by pNext when converting to guest\\n\", from->sType);\n    std::abort();\n  }\n  next_handler->second.second((void*)into.data.pNext.get_pointer(), from->pNext);\n\n  free(pNextHost);\n}\n\n// Default repacking functions that only traverses and repacks the pNext chain.\n// If other members need to be repacked, use VULKAN_NONDEFAULT_CUSTOM_REPACK instead\n#define VULKAN_DEFAULT_CUSTOM_REPACK(name)                                                             \\\n  void fex_custom_repack_entry(host_layout<name>& into, const guest_layout<name>& from) {              \\\n    default_fex_custom_repack_entry(reinterpret_cast<VkBaseOutStructure&>(into.data),                  \\\n                                    &reinterpret_cast<const guest_layout<VkBaseOutStructure>&>(from)); \\\n  }                                                                                                    \\\n                                                                                                       \\\n  bool fex_custom_repack_exit(guest_layout<name>& into, const host_layout<name>& from) {               \\\n    auto prev_next = into.data.pNext;                                                                  \\\n    default_fex_custom_repack_reverse(*reinterpret_cast<guest_layout<VkBaseOutStructure>*>(&into),     \\\n                                      &reinterpret_cast<const VkBaseOutStructure&>(from.data));        \\\n    into = to_guest(from);                                                                             \\\n    into.data.pNext = prev_next;                                                                       \\\n    return true;                                                                                       \\\n  }\n\n// Intentionally left empty. This macro doesn't automate anything, but it\n// helps ensure we don't forget any Vulkan types in the list. The actual\n// repacking functions are defined manually later\n#define VULKAN_NONDEFAULT_CUSTOM_REPACK(name)\n\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureBuildGeometryInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureBuildSizesInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureCaptureDescriptorDataInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureCreateInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureDeviceAddressInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureGeometryAabbsDataKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureGeometryInstancesDataKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureGeometryKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureGeometryMotionTrianglesDataNV)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureGeometryTrianglesDataKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureMemoryRequirementsInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureMotionInfoNV)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureTrianglesOpacityMicromapEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAccelerationStructureVersionInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAcquireNextImageInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAcquireProfilingLockInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAmigoProfilingSubmitInfoSEC)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkAntiLagDataAMD)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAntiLagPresentationInfoAMD)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkApplicationInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAttachmentDescription2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAttachmentDescriptionStencilLayout)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAttachmentFeedbackLoopInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAttachmentReference2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAttachmentReferenceStencilLayout)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkAttachmentSampleCountInfoAMD)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBeginCustomResolveInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBindAccelerationStructureMemoryInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBindBufferMemoryDeviceGroupInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBindBufferMemoryInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBindDataGraphPipelineSessionMemoryInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBindDescriptorBufferEmbeddedSamplersInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBindDescriptorSetsInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBindImageMemoryDeviceGroupInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBindImageMemoryInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBindImageMemorySwapchainInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBindImagePlaneMemoryInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBindMemoryStatus)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkBindSparseInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBindTensorMemoryInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBindVideoSessionMemoryInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBlitImageCubicWeightsInfoQCOM)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkBlitImageInfo2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBufferCaptureDescriptorDataInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBufferCopy2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBufferCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBufferDeviceAddressCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBufferDeviceAddressInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBufferImageCopy2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBufferMemoryBarrier)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBufferMemoryBarrier2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBufferMemoryRequirementsInfo2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBufferOpaqueCaptureAddressCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBufferUsageFlags2CreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBufferViewCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkBuildPartitionedAccelerationStructureInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCalibratedTimestampInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkCheckpointData2NV)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkCheckpointDataNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkClusterAccelerationStructureClustersBottomLevelInputNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkClusterAccelerationStructureMoveObjectsInputNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkClusterAccelerationStructureTriangleClusterInputNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCommandBufferAllocateInfo)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkCommandBufferBeginInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCommandBufferInheritanceConditionalRenderingInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCommandBufferInheritanceInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCommandBufferInheritanceRenderingInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCommandBufferInheritanceRenderPassTransformInfoQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCommandBufferInheritanceViewportScissorInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCommandBufferSubmitInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCommandPoolCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkComputeOccupancyPriorityParametersNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkComputePipelineCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkComputePipelineIndirectBufferInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkConditionalRenderingBeginInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCooperativeMatrixFlexibleDimensionsPropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCooperativeMatrixPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCooperativeMatrixPropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCooperativeVectorPropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCopyAccelerationStructureInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkCopyAccelerationStructureToMemoryInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkCopyBufferInfo2)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkCopyBufferToImageInfo2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCopyCommandTransformInfoQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCopyDescriptorSet)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkCopyImageInfo2)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkCopyImageToBufferInfo2)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkCopyImageToImageInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkCopyImageToMemoryInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCopyMemoryIndirectInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkCopyMemoryToAccelerationStructureInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCopyMemoryToImageIndirectInfoKHR)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkCopyMemoryToImageInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkCopyMemoryToMicromapInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCopyMicromapInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkCopyMicromapToMemoryInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkCopyTensorInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCuFunctionCreateInfoNVX)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkCuLaunchInfoNVX)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkCuModuleCreateInfoNVX)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCuModuleTexturingModeCreateInfoNVX)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkCustomResolveCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphPipelineBuiltinModelCreateInfoQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphPipelineCompilerControlCreateInfoARM)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphPipelineConstantARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphPipelineConstantTensorSemiStructuredSparsityInfoARM)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphPipelineCreateInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphPipelineDispatchInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphPipelineIdentifierCreateInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphPipelineInfoARM)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphPipelinePropertyQueryResultARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphPipelineResourceInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphPipelineSessionBindPointRequirementARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphPipelineSessionBindPointRequirementsInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphPipelineSessionCreateInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphPipelineSessionMemoryRequirementsInfoARM)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphPipelineShaderModuleCreateInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDataGraphProcessingEngineCreateInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDebugMarkerMarkerInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDebugMarkerObjectNameInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDebugMarkerObjectTagInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDebugReportCallbackCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDebugUtilsLabelEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDebugUtilsMessengerCallbackDataEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDebugUtilsMessengerCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDebugUtilsObjectNameInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDebugUtilsObjectTagInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDecompressMemoryInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDedicatedAllocationBufferCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDedicatedAllocationImageCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDedicatedAllocationMemoryAllocateInfoNV)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkDependencyInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDepthBiasInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDepthBiasRepresentationInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDescriptorAddressInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDescriptorBufferBindingInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDescriptorBufferBindingPushDescriptorBufferHandleEXT)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkDescriptorGetInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDescriptorGetTensorInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDescriptorPoolCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDescriptorPoolInlineUniformBlockCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDescriptorSetAllocateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDescriptorSetBindingReferenceVALVE)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDescriptorSetLayoutBindingFlagsCreateInfo)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkDescriptorSetLayoutCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDescriptorSetLayoutHostMappingInfoVALVE)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDescriptorSetLayoutSupport)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDescriptorSetVariableDescriptorCountAllocateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDescriptorSetVariableDescriptorCountLayoutSupport)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkDescriptorUpdateTemplateCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceAddressBindingCallbackDataEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceBufferMemoryRequirements)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkDeviceCreateInfo)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceDeviceMemoryReportCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceDiagnosticsConfigCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceEventInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceFaultCountsEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceFaultInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceGroupBindSparseInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceGroupCommandBufferBeginInfo)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceGroupDeviceCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceGroupPresentCapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceGroupPresentInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceGroupRenderPassBeginInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceGroupSubmitInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceGroupSwapchainCreateInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceImageMemoryRequirements)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceImageSubresourceInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceMemoryOpaqueCaptureAddressInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceMemoryOverallocationCreateInfoAMD)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceMemoryReportCallbackDataEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDevicePipelineBinaryInternalCacheControlKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDevicePrivateDataCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceQueueCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceQueueGlobalPriorityCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceQueueInfo2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceQueueShaderCoreControlCreateInfoARM)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDeviceTensorMemoryRequirementsARM)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDirectDriverLoadingInfoLUNARG)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDirectDriverLoadingListLUNARG)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDispatchTileInfoQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDisplayEventInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDisplayModeCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDisplayModeProperties2KHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDisplayModeStereoPropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDisplayNativeHdrSurfaceCapabilitiesAMD)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDisplayPlaneCapabilities2KHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDisplayPlaneInfo2KHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDisplayPlaneProperties2KHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDisplayPowerInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDisplayPresentInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDisplayProperties2KHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDisplaySurfaceCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkDisplaySurfaceStereoCreateInfoNV)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDrmFormatModifierPropertiesList2EXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkDrmFormatModifierPropertiesListEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkEventCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExportFenceCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExportMemoryAllocateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExportMemoryAllocateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExportSemaphoreCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExternalBufferProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExternalComputeQueueCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExternalComputeQueueDataParamsNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExternalComputeQueueDeviceCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExternalFenceProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExternalImageFormatProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExternalMemoryAcquireUnmodifiedEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExternalMemoryBufferCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExternalMemoryImageCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExternalMemoryImageCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExternalMemoryTensorCreateInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExternalSemaphoreProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkExternalTensorPropertiesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkFenceCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkFenceGetFdInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkFilterCubicImageViewImageFormatPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkFormatProperties2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkFormatProperties3)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkFragmentShadingRateAttachmentInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkFrameBoundaryEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkFrameBoundaryTensorsARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkFramebufferAttachmentImageInfo)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkFramebufferAttachmentsCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkFramebufferCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkFramebufferMixedSamplesCombinationNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkGeneratedCommandsInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkGeneratedCommandsInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkGeneratedCommandsMemoryRequirementsInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkGeneratedCommandsMemoryRequirementsInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkGeneratedCommandsPipelineInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkGeneratedCommandsShaderInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkGeometryAABBNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkGeometryNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkGeometryTrianglesNV)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkGetLatencyMarkerInfoNV)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkGraphicsPipelineCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkGraphicsPipelineLibraryCreateInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkGraphicsPipelineShaderGroupsCreateInfoNV)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkGraphicsShaderGroupCreateInfoNV)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkHdrVividDynamicMetadataHUAWEI)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkHeadlessSurfaceCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkHostImageCopyDevicePerformanceQuery)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkHostImageLayoutTransitionInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageAlignmentControlCreateInfoMESA)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageBlit2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageCaptureDescriptorDataInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageCompressionControlEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageCompressionPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageCopy2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageCreateInfo)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkImageDrmFormatModifierExplicitCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageDrmFormatModifierListCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageDrmFormatModifierPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageFormatListCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageFormatProperties2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageMemoryBarrier)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageMemoryBarrier2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageMemoryRequirementsInfo2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImagePlaneMemoryRequirementsInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageResolve2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageSparseMemoryRequirementsInfo2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageStencilUsageCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageSubresource2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageSwapchainCreateInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkImageToMemoryCopyEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageViewAddressPropertiesNVX)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageViewASTCDecodeModeEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageViewCaptureDescriptorDataInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageViewCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageViewHandleInfoNVX)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageViewMinLodCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageViewSampleWeightCreateInfoQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageViewSlicedCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImageViewUsageCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImportFenceFdInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImportMemoryFdInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkImportMemoryHostPointerInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkImportSemaphoreFdInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkIndirectCommandsLayoutCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkIndirectCommandsLayoutTokenNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkIndirectExecutionSetPipelineInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkIndirectExecutionSetShaderInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkIndirectExecutionSetShaderLayoutInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkInitializePerformanceApiInfoINTEL)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkInstanceCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkLatencySleepInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkLatencySleepModeInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkLatencySubmissionPresentIdNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkLatencySurfaceCapabilitiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkLatencyTimingsFrameReportNV)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkLayerSettingsCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMappedMemoryRange)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryAllocateFlagsInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryAllocateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryBarrier)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryBarrier2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryBarrierAccessFlags3KHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryDedicatedAllocateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryDedicatedAllocateInfoTensorARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryDedicatedRequirements)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryFdPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryGetFdInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryGetRemoteAddressInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryHostPointerPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryMapInfo)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryMapPlacedInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryOpaqueCaptureAddressAllocateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryPriorityAllocateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryRequirements2)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkMemoryToImageCopy)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMemoryUnmapInfo)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkMicromapBuildInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMicromapBuildSizesInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMicromapCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMicromapVersionInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMultisampledRenderToSingleSampledInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMultisamplePropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMultiviewPerViewAttributesInfoNVX)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkMutableDescriptorTypeCreateInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkOpaqueCaptureDescriptorDataCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkOpticalFlowExecuteInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkOpticalFlowImageFormatInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkOpticalFlowImageFormatPropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkOpticalFlowSessionCreateInfoNV)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkOpticalFlowSessionCreatePrivateDataInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkOutOfBandQueueTypeInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPartitionedAccelerationStructureFlagsNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPartitionedAccelerationStructureInstancesInputNV)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPastPresentationTimingEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPastPresentationTimingInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPastPresentationTimingPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPerformanceConfigurationAcquireInfoINTEL)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPerformanceCounterARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPerformanceCounterDescriptionARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPerformanceCounterDescriptionKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPerformanceCounterKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPerformanceMarkerInfoINTEL)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPerformanceOverrideInfoINTEL)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPerformanceQuerySubmitInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPerformanceStreamMarkerInfoINTEL)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPerTileBeginInfoQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPerTileEndInfoQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevice16BitStorageFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevice4444FormatsFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevice8BitStorageFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceAccelerationStructureFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceAccelerationStructurePropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceAddressBindingReportFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceAmigoProfilingFeaturesSEC)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceAntiLagFeaturesAMD)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceASTCDecodeFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceBorderColorSwizzleFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceBufferDeviceAddressFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceBufferDeviceAddressFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceClusterAccelerationStructureFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceClusterAccelerationStructurePropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCoherentMemoryFeaturesAMD)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceColorWriteEnableFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCommandBufferInheritanceFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceComputeOccupancyPriorityFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceConditionalRenderingFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceConservativeRasterizationPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCooperativeMatrix2FeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCooperativeMatrix2PropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCooperativeMatrixFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCooperativeMatrixFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCooperativeMatrixPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCooperativeMatrixPropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCooperativeVectorFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCooperativeVectorPropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCopyMemoryIndirectFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCopyMemoryIndirectPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCornerSampledImageFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCoverageReductionModeFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCubicClampFeaturesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCubicWeightsFeaturesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCustomBorderColorFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCustomBorderColorPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceCustomResolveFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDataGraphFeaturesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDataGraphModelFeaturesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDepthBiasControlFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDepthClampControlFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDepthClampZeroOneFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDepthClipControlFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDepthClipEnableFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDepthStencilResolveProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDescriptorBufferFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDescriptorBufferPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDescriptorBufferTensorFeaturesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDescriptorBufferTensorPropertiesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDescriptorIndexingFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDescriptorIndexingProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDeviceMemoryReportFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDiagnosticsConfigFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDiscardRectanglePropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDriverProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDrmPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDynamicRenderingFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDynamicRenderingLocalReadFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceExclusiveScissorFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceExtendedDynamicState2FeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceExtendedDynamicState3PropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceExtendedDynamicStateFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceExternalBufferInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceExternalComputeQueuePropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceExternalFenceInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceExternalImageFormatInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceExternalMemoryHostPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceExternalMemoryRDMAFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceExternalSemaphoreInfo)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceExternalTensorInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFaultFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFeatures2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFloatControlsProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFormatPackFeaturesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentDensityMap2FeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentDensityMap2PropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentDensityMapFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentDensityMapLayeredPropertiesVALVE)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentDensityMapOffsetPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentDensityMapPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentShadingRateFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentShadingRateKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFragmentShadingRatePropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceFrameBoundaryFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceGlobalPriorityQueryFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceGroupProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceHdrVividFeaturesHUAWEI)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceHostImageCopyFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceHostImageCopyProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceHostQueryResetFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceIDProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImage2DViewOf3DFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImageAlignmentControlFeaturesMESA)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImageAlignmentControlPropertiesMESA)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImageCompressionControlFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImageDrmFormatModifierInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImageFormatInfo2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImagelessFramebufferFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImageProcessing2FeaturesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImageProcessing2PropertiesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImageProcessingFeaturesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImageProcessingPropertiesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImageRobustnessFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImageViewImageFormatInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceImageViewMinLodFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceIndexTypeUint8Features)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceInheritedViewportScissorFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceInlineUniformBlockFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceInlineUniformBlockProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceInvocationMaskFeaturesHUAWEI)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceLayeredApiPropertiesKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceLayeredApiPropertiesListKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceLayeredApiVulkanPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceLayeredDriverPropertiesMSFT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceLegacyDitheringFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceLinearColorAttachmentFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceLineRasterizationFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceLineRasterizationProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMaintenance10FeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMaintenance10PropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMaintenance3Properties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMaintenance4Features)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMaintenance4Properties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMaintenance5Features)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMaintenance5Properties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMaintenance6Features)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMaintenance6Properties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMaintenance7FeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMaintenance7PropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMaintenance8FeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMaintenance9FeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMaintenance9PropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMapMemoryPlacedFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMapMemoryPlacedPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMemoryBudgetPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMemoryDecompressionFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMemoryDecompressionPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMemoryPriorityFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMemoryProperties2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMeshShaderFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMeshShaderFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMeshShaderPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMeshShaderPropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMultiDrawFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMultiDrawPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMultiviewFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMultiviewProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceNestedCommandBufferFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceNestedCommandBufferPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceOpacityMicromapFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceOpacityMicromapPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceOpticalFlowFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceOpticalFlowPropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePCIBusInfoPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePerformanceCountersByRegionFeaturesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePerformanceCountersByRegionPropertiesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePerformanceQueryFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePerformanceQueryPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePerStageDescriptorSetFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePipelineBinaryFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePipelineBinaryPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePipelineCreationCacheControlFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePipelineOpacityMicromapFeaturesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePipelinePropertiesFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePipelineProtectedAccessFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePipelineRobustnessFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePipelineRobustnessProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePointClippingProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePresentBarrierFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePresentId2FeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePresentIdFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePresentMeteringFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePresentTimingFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePresentWait2FeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePresentWaitFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePrivateDataFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceProperties2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceProtectedMemoryFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceProtectedMemoryProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceProvokingVertexFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceProvokingVertexPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDevicePushDescriptorProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceQueueFamilyDataGraphProcessingEngineInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRawAccessChainsFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRayQueryFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRayTracingMotionBlurFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRayTracingPipelineFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRayTracingPipelinePropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRayTracingPropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRayTracingValidationFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRenderPassStripedFeaturesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRenderPassStripedPropertiesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRobustness2FeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceRobustness2PropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSampleLocationsPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSamplerFilterMinmaxProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSamplerYcbcrConversionFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceScalarBlockLayoutFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSchedulingControlsFeaturesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSchedulingControlsPropertiesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShader64BitIndexingFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderAtomicInt64Features)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderBfloat16FeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderClockFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderCoreProperties2AMD)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderCorePropertiesAMD)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderCorePropertiesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderDrawParametersFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderExpectAssumeFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderFloat16Int8Features)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderFloat8FeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderFloatControls2Features)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderFmaFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderImageFootprintFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderIntegerDotProductFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderIntegerDotProductProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderLongVectorFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderLongVectorPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderObjectFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderObjectPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderQuadControlFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderSMBuiltinsFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderSMBuiltinsPropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderSubgroupRotateFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderTerminateInvocationFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderTileImageFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderTileImagePropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShaderUntypedPointersFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShadingRateImageFeaturesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceShadingRateImagePropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSparseImageFormatInfo2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSubgroupProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSubgroupSizeControlFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSubgroupSizeControlProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSubpassShadingFeaturesHUAWEI)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSubpassShadingPropertiesHUAWEI)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSurfaceInfo2KHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceSynchronization2Features)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceTensorFeaturesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceTensorPropertiesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceTexelBufferAlignmentProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceTextureCompressionASTC3DFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceTextureCompressionASTCHDRFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceTileMemoryHeapFeaturesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceTileMemoryHeapPropertiesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceTilePropertiesFeaturesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceTileShadingFeaturesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceTileShadingPropertiesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceTimelineSemaphoreFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceTimelineSemaphoreProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceToolProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceTransformFeedbackFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceTransformFeedbackPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceUniformBufferStandardLayoutFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVariablePointersFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVertexAttributeDivisorFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVertexAttributeDivisorProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVideoDecodeVP9FeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVideoEncodeAV1FeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVideoFormatInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVideoMaintenance1FeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVideoMaintenance2FeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVulkan11Features)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVulkan11Properties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVulkan12Features)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVulkan12Properties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVulkan13Features)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVulkan13Properties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVulkan14Features)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVulkan14Properties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceVulkanMemoryModelFeatures)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceYcbcrDegammaFeaturesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceYcbcrImageArraysFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineBinaryCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineBinaryDataInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineBinaryHandlesInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineBinaryInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineBinaryKeyKHR)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkPipelineCacheCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineColorBlendAdvancedStateCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineColorBlendStateCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineColorWriteCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineCompilerControlCreateInfoAMD)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineCoverageModulationStateCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineCoverageReductionStateCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineCoverageToColorStateCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineCreateFlags2CreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineCreateInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineCreationFeedbackCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineDepthStencilStateCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineDiscardRectangleStateCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineDynamicStateCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineExecutableInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineExecutableInternalRepresentationKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineExecutablePropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineExecutableStatisticKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineFragmentDensityMapLayeredCreateInfoVALVE)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineFragmentShadingRateEnumStateCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineFragmentShadingRateStateCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineIndirectDeviceAddressInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineInputAssemblyStateCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineLayoutCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineLibraryCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineMultisampleStateCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelinePropertiesIdentifierEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineRasterizationConservativeStateCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineRasterizationDepthClipStateCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineRasterizationLineStateCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineRasterizationProvokingVertexStateCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineRasterizationStateCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineRasterizationStateRasterizationOrderAMD)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineRasterizationStateStreamCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineRenderingCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineRepresentativeFragmentTestStateCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineRobustnessCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineSampleLocationsStateCreateInfoEXT)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkPipelineShaderStageCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineShaderStageModuleIdentifierCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineShaderStageRequiredSubgroupSizeCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineTessellationDomainOriginStateCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineTessellationStateCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineVertexInputDivisorStateCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineVertexInputStateCreateInfo)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineViewportCoarseSampleOrderStateCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineViewportDepthClampControlCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineViewportDepthClipControlCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineViewportExclusiveScissorStateCreateInfoNV)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineViewportShadingRateImageStateCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineViewportStateCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineViewportSwizzleStateCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPipelineViewportWScalingStateCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPresentId2KHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPresentIdKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPresentInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPresentRegionsKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPresentTimesInfoGOOGLE)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPresentTimingInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPresentTimingsInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPresentTimingSurfaceCapabilitiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPresentWait2InfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkPrivateDataSlotCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkProtectedSubmitInfo)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPushConstantsInfo)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPushDescriptorSetInfo)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkPushDescriptorSetWithTemplateInfo)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkQueryLowLatencySupportNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkQueryPoolCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkQueryPoolPerformanceCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkQueryPoolPerformanceQueryCreateInfoINTEL)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkQueryPoolVideoEncodeFeedbackCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkQueueFamilyCheckpointProperties2NV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkQueueFamilyCheckpointPropertiesNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkQueueFamilyDataGraphProcessingEnginePropertiesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkQueueFamilyDataGraphPropertiesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkQueueFamilyGlobalPriorityProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkQueueFamilyOwnershipTransferPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkQueueFamilyProperties2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkQueueFamilyQueryResultStatusPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkQueueFamilyVideoPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRayTracingPipelineClusterAccelerationStructureCreateInfoNV)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkRayTracingPipelineCreateInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkRayTracingPipelineCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRayTracingPipelineInterfaceCreateInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkRayTracingShaderGroupCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRayTracingShaderGroupCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkReleaseCapturedPipelineDataInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkReleaseSwapchainImagesInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderingAreaInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderingAttachmentFlagsInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderingAttachmentInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderingAttachmentLocationInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderingEndInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderingFragmentDensityMapAttachmentInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderingFragmentShadingRateAttachmentInfoKHR)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkRenderingInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderingInputAttachmentIndexInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderPassAttachmentBeginInfo)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkRenderPassBeginInfo)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkRenderPassCreateInfo)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkRenderPassCreateInfo2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderPassCreationControlEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderPassCreationFeedbackCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderPassFragmentDensityMapCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderPassFragmentDensityMapOffsetEndInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderPassInputAttachmentAspectCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderPassMultiviewCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderPassPerformanceCountersByRegionBeginInfoARM)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkRenderPassSampleLocationsBeginInfoEXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkRenderPassStripeBeginInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderPassStripeInfoARM)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkRenderPassStripeSubmitInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderPassSubpassFeedbackCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderPassTileShadingCreateInfoQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkRenderPassTransformBeginInfoQCOM)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkResolveImageInfo2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkResolveImageModeInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSampleLocationsInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSamplerBlockMatchWindowCreateInfoQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSamplerBorderColorComponentMappingCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSamplerCaptureDescriptorDataInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSamplerCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSamplerCubicWeightsCreateInfoQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSamplerCustomBorderColorCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSamplerReductionModeCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSamplerYcbcrConversionCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSamplerYcbcrConversionImageFormatProperties)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSamplerYcbcrConversionInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSemaphoreCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSemaphoreGetFdInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSemaphoreSignalInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSemaphoreSubmitInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSemaphoreTypeCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSemaphoreWaitInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSetDescriptorBufferOffsetsInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSetLatencyMarkerInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSetPresentConfigNV)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkShaderCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkShaderModuleCreateInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkShaderModuleIdentifierEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkShaderModuleValidationCacheCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSharedPresentSurfaceCapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSparseImageFormatProperties2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSparseImageMemoryRequirements2)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkSubmitInfo)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkSubmitInfo2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSubpassBeginInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSubpassDependency2)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkSubpassDescription2)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkSubpassDescriptionDepthStencilResolve)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSubpassEndInfo)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSubpassResolvePerformanceQueryEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSubpassShadingPipelineCreateInfoHUAWEI)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSubresourceHostMemcpySize)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSubresourceLayout2)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSurfaceCapabilities2EXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSurfaceCapabilities2KHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSurfaceCapabilitiesPresentBarrierNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSurfaceCapabilitiesPresentId2KHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSurfaceCapabilitiesPresentWait2KHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSurfaceFormat2KHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSurfacePresentModeCompatibilityKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSurfacePresentModeKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSurfacePresentScalingCapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSurfaceProtectedCapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSwapchainCalibratedTimestampInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSwapchainCounterCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSwapchainCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSwapchainDisplayNativeHdrCreateInfoAMD)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSwapchainLatencyCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSwapchainPresentBarrierCreateInfoNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSwapchainPresentFenceInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSwapchainPresentModeInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSwapchainPresentModesCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSwapchainPresentScalingCreateInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkSwapchainTimeDomainPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkSwapchainTimingPropertiesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkTensorCaptureDescriptorDataInfoARM)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkTensorCopyARM)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkTensorCreateInfoARM)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkTensorDependencyInfoARM)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkTensorDescriptionARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkTensorFormatPropertiesARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkTensorMemoryBarrierARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkTensorMemoryRequirementsInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkTensorViewCaptureDescriptorDataInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkTensorViewCreateInfoARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkTextureLODGatherFormatPropertiesAMD)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkTileMemoryBindInfoQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkTileMemoryRequirementsQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkTileMemorySizeInfoQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkTilePropertiesQCOM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkTimelineSemaphoreSubmitInfo)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkValidationCacheCreateInfoEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkValidationFeaturesEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkValidationFlagsEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVertexInputAttributeDescription2EXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVertexInputBindingDescription2EXT)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoBeginCodingInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoCapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoCodingControlInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeAV1CapabilitiesKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeAV1DpbSlotInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeAV1InlineSessionParametersInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeAV1ProfileInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeAV1SessionParametersCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeCapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeH264CapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeH264DpbSlotInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeH264PictureInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeH264ProfileInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeH264SessionParametersAddInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeH264SessionParametersCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeH265CapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeH265DpbSlotInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeH265PictureInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeH265ProfileInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeH265SessionParametersAddInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeH265SessionParametersCreateInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeUsageInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeVP9CapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoDecodeVP9ProfileInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeAV1CapabilitiesKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeAV1DpbSlotInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeAV1GopRemainingFrameInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeAV1ProfileInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeAV1QualityLevelPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeAV1QuantizationMapCapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeAV1RateControlInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeAV1RateControlLayerInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeAV1SessionCreateInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeAV1SessionParametersCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeCapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH264CapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH264DpbSlotInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH264GopRemainingFrameInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH264ProfileInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH264QualityLevelPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH264QuantizationMapCapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH264RateControlInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH264RateControlLayerInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH264SessionCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH264SessionParametersFeedbackInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH264SessionParametersGetInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH265CapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH265DpbSlotInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH265GopRemainingFrameInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH265ProfileInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH265QualityLevelPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH265QuantizationMapCapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH265RateControlInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH265RateControlLayerInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH265SessionCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH265SessionParametersFeedbackInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeH265SessionParametersGetInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeIntraRefreshCapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeIntraRefreshInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeProfileRgbConversionInfoVALVE)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeQualityLevelInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeQualityLevelPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeQuantizationMapCapabilitiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeQuantizationMapInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeRateControlInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeRateControlLayerInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeRgbConversionCapabilitiesVALVE)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeSessionIntraRefreshCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeSessionParametersFeedbackInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeSessionParametersGetInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeSessionRgbConversionCreateInfoVALVE)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEncodeUsageInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoEndCodingInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoFormatAV1QuantizationMapPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoFormatH265QuantizationMapPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoFormatPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoFormatQuantizationMapPropertiesKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoInlineQueryInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoPictureResourceInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoProfileInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoProfileListInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoReferenceIntraRefreshInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoReferenceSlotInfoKHR)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkVideoSessionCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoSessionMemoryRequirementsKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoSessionParametersCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkVideoSessionParametersUpdateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkWaylandSurfaceCreateInfoKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkWriteDescriptorSet) // TODO: This should be non-default instead\nVULKAN_DEFAULT_CUSTOM_REPACK(VkWriteDescriptorSetAccelerationStructureKHR)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkWriteDescriptorSetAccelerationStructureNV)\n// VULKAN_DEFAULT_CUSTOM_REPACK(VkWriteDescriptorSetInlineUniformBlock)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkWriteDescriptorSetPartitionedAccelerationStructureNV)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkWriteDescriptorSetTensorARM)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkWriteIndirectExecutionSetPipelineEXT)\nVULKAN_DEFAULT_CUSTOM_REPACK(VkWriteIndirectExecutionSetShaderEXT)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkXcbSurfaceCreateInfoKHR)\nVULKAN_NONDEFAULT_CUSTOM_REPACK(VkXlibSurfaceCreateInfoKHR)\n\n\nvoid fex_custom_repack_entry(host_layout<VkInstanceCreateInfo>& into, const guest_layout<VkInstanceCreateInfo>& from) {\n  default_fex_custom_repack_entry(into, from);\n\n  auto HostApplicationInfo = new host_layout<VkApplicationInfo> {*from.data.pApplicationInfo.get_pointer()};\n  fex_apply_custom_repacking_entry(*HostApplicationInfo, *from.data.pApplicationInfo.get_pointer());\n\n  into.data.pApplicationInfo = &HostApplicationInfo->data;\n\n  auto extension_count = from.data.enabledExtensionCount.data;\n  into.data.ppEnabledExtensionNames = RepackStructArray<false>(extension_count, from.data.ppEnabledExtensionNames).data();\n\n  auto layer_count = from.data.enabledLayerCount.data;\n  into.data.ppEnabledLayerNames = RepackStructArray<false>(layer_count, from.data.ppEnabledLayerNames).data();\n}\n\nbool fex_custom_repack_exit(guest_layout<VkInstanceCreateInfo>& into, const host_layout<VkInstanceCreateInfo>& from) {\n  delete from.data.pApplicationInfo;\n  delete[] from.data.ppEnabledExtensionNames;\n  delete[] from.data.ppEnabledLayerNames;\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkMemoryToImageCopyEXT>& into, const guest_layout<VkMemoryToImageCopyEXT>& from) {\n  default_fex_custom_repack_entry(into, from);\n  into.data.pHostPointer = from.data.pHostPointer.get_pointer();\n}\n\nbool fex_custom_repack_exit(guest_layout<VkMemoryToImageCopyEXT>& into, const host_layout<VkMemoryToImageCopyEXT>& from) {\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkDeviceCreateInfo>& into, const guest_layout<VkDeviceCreateInfo>& from) {\n  default_fex_custom_repack_entry(into, from);\n\n  auto HostQueueCreateInfo = new host_layout<VkDeviceQueueCreateInfo> {*from.data.pQueueCreateInfos.get_pointer()};\n  fex_apply_custom_repacking_entry(*HostQueueCreateInfo, *from.data.pQueueCreateInfos.get_pointer());\n  into.data.pQueueCreateInfos = &HostQueueCreateInfo->data;\n\n  auto layer_count = from.data.enabledExtensionCount.data;\n  fprintf(stderr, \"  Repacking %d ppEnabledLayerNames\\n\", layer_count);\n  into.data.ppEnabledLayerNames = RepackStructArray<false>(layer_count, from.data.ppEnabledLayerNames).data();\n\n  auto extension_count = from.data.enabledExtensionCount.data;\n  fprintf(stderr, \"  Repacking %d ppEnabledExtensionNames\\n\", extension_count);\n  into.data.ppEnabledExtensionNames = RepackStructArray<false>(extension_count, from.data.ppEnabledExtensionNames).data();\n}\n\nbool fex_custom_repack_exit(guest_layout<VkDeviceCreateInfo>& into, const host_layout<VkDeviceCreateInfo>& from) {\n  delete from.data.pQueueCreateInfos;\n  delete[] from.data.ppEnabledExtensionNames;\n  delete[] from.data.ppEnabledLayerNames;\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkDescriptorSetLayoutCreateInfo>& into, const guest_layout<VkDescriptorSetLayoutCreateInfo>& from) {\n  default_fex_custom_repack_entry(into, from);\n  into.data.pBindings = RepackStructArray(from.data.bindingCount.data, from.data.pBindings).data();\n}\n\nbool fex_custom_repack_exit(guest_layout<VkDescriptorSetLayoutCreateInfo>& into, const host_layout<VkDescriptorSetLayoutCreateInfo>& from) {\n  delete[] from.data.pBindings;\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkRenderPassCreateInfo>& into, const guest_layout<VkRenderPassCreateInfo>& from) {\n  default_fex_custom_repack_entry(into, from);\n  into.data.pSubpasses = RepackStructArray(from.data.subpassCount.data, from.data.pSubpasses).data();\n}\n\nbool fex_custom_repack_exit(guest_layout<VkRenderPassCreateInfo>& into, const host_layout<VkRenderPassCreateInfo>& from) {\n  delete[] from.data.pSubpasses;\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkRenderPassCreateInfo2>& into, const guest_layout<VkRenderPassCreateInfo2>& from) {\n  default_fex_custom_repack_entry(into, from);\n  into.data.pAttachments = RepackStructArray(from.data.attachmentCount.data, from.data.pAttachments).data();\n  into.data.pSubpasses = RepackStructArray(from.data.subpassCount.data, from.data.pSubpasses).data();\n  into.data.pDependencies = RepackStructArray(from.data.dependencyCount.data, from.data.pDependencies).data();\n}\n\nbool fex_custom_repack_exit(guest_layout<VkRenderPassCreateInfo2>& into, const host_layout<VkRenderPassCreateInfo2>& from) {\n  DeleteRepackedStructArray(from.data.attachmentCount, from.data.pAttachments, into.data.pAttachments);\n  DeleteRepackedStructArray(from.data.subpassCount, from.data.pSubpasses, into.data.pSubpasses);\n  DeleteRepackedStructArray(from.data.dependencyCount, from.data.pDependencies, into.data.pDependencies);\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkSubpassDescription2>& into, const guest_layout<VkSubpassDescription2>& from) {\n  default_fex_custom_repack_entry(into, from);\n  into.data.pInputAttachments = RepackStructArray(from.data.inputAttachmentCount.data, from.data.pInputAttachments).data();\n  into.data.pColorAttachments = RepackStructArray(from.data.colorAttachmentCount.data, from.data.pColorAttachments).data();\n  into.data.pResolveAttachments = RepackStructArray(from.data.colorAttachmentCount.data, from.data.pResolveAttachments).data();\n\n  if (from.data.pDepthStencilAttachment.data == 0) {\n    into.data.pDepthStencilAttachment = nullptr;\n  } else {\n    into.data.pDepthStencilAttachment = new VkAttachmentReference2;\n    auto in_data = host_layout<VkAttachmentReference2> {*from.data.pDepthStencilAttachment.get_pointer()};\n    fex_apply_custom_repacking_entry(in_data, *from.data.pDepthStencilAttachment.get_pointer());\n    memcpy((void*)into.data.pDepthStencilAttachment, &in_data.data, sizeof(VkAttachmentReference2));\n  }\n}\n\nbool fex_custom_repack_exit(guest_layout<VkSubpassDescription2>& into, const host_layout<VkSubpassDescription2>& from) {\n  DeleteRepackedStructArray(from.data.inputAttachmentCount, from.data.pInputAttachments, into.data.pInputAttachments);\n  DeleteRepackedStructArray(from.data.colorAttachmentCount, from.data.pColorAttachments, into.data.pColorAttachments);\n  DeleteRepackedStructArray(from.data.colorAttachmentCount, from.data.pResolveAttachments, into.data.pResolveAttachments);\n  if (from.data.pDepthStencilAttachment) {\n    fex_apply_custom_repacking_exit(*into.data.pDepthStencilAttachment.get_pointer(), to_host_layout(*from.data.pDepthStencilAttachment));\n    delete from.data.pDepthStencilAttachment;\n  }\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkRenderingInfo>& into, const guest_layout<VkRenderingInfo>& from) {\n  default_fex_custom_repack_entry(into, from);\n\n  into.data.pColorAttachments = RepackStructArray(from.data.colorAttachmentCount.data, from.data.pColorAttachments).data();\n\n  if (from.data.pDepthAttachment.get_pointer() == nullptr) {\n    into.data.pDepthAttachment = nullptr;\n  } else {\n    into.data.pDepthAttachment = new VkRenderingAttachmentInfo;\n    auto in_data = host_layout<VkRenderingAttachmentInfo> {*from.data.pDepthAttachment.get_pointer()};\n    fex_apply_custom_repacking_entry(in_data, *from.data.pDepthAttachment.get_pointer());\n    memcpy((void*)into.data.pDepthAttachment, &in_data.data, sizeof(VkRenderingAttachmentInfo));\n  }\n\n  if (from.data.pStencilAttachment.get_pointer() == nullptr) {\n    into.data.pStencilAttachment = nullptr;\n  } else {\n    into.data.pStencilAttachment = new VkRenderingAttachmentInfo;\n    auto in_data = host_layout<VkRenderingAttachmentInfo> {*from.data.pStencilAttachment.get_pointer()};\n    fex_apply_custom_repacking_entry(in_data, *from.data.pStencilAttachment.get_pointer());\n    memcpy((void*)into.data.pStencilAttachment, &in_data.data, sizeof(VkRenderingAttachmentInfo));\n  }\n}\n\nbool fex_custom_repack_exit(guest_layout<VkRenderingInfo>& into, const host_layout<VkRenderingInfo>& from) {\n  DeleteRepackedStructArray(from.data.colorAttachmentCount, from.data.pColorAttachments, into.data.pColorAttachments);\n  if (from.data.pDepthAttachment) {\n    fex_apply_custom_repacking_exit(*into.data.pDepthAttachment.get_pointer(), to_host_layout(*from.data.pDepthAttachment));\n    delete from.data.pDepthAttachment;\n  }\n  if (from.data.pStencilAttachment) {\n    fex_apply_custom_repacking_exit(*into.data.pStencilAttachment.get_pointer(), to_host_layout(*from.data.pStencilAttachment));\n    delete from.data.pStencilAttachment;\n  }\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkDescriptorGetInfoEXT>& into, const guest_layout<VkDescriptorGetInfoEXT>& from) {\n  default_fex_custom_repack_entry(into, from);\n\n  switch (into.data.type) {\n  case VK_DESCRIPTOR_TYPE_SAMPLER:\n  case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:\n  case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:\n  case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:\n  case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: {\n    // VkSampler* or VkDescriptorImageInfo*. Handle by zero-extending\n    guest_layout<VkSampler*> guest_data;\n    memcpy(&guest_data, from.data.data.union_storage, sizeof(guest_data));\n    into.data.data.pSampler = host_layout<VkSampler*> {guest_data}.data;\n    break;\n  }\n\n  case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:\n  case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:\n  case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:\n  case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: {\n    // VkDescriptorAddressInfoEXT*. Repacking required\n    guest_layout<VkDescriptorAddressInfoEXT*> guest_ptr;\n    memcpy(&guest_ptr, from.data.data.union_storage, sizeof(guest_ptr));\n    auto child_mem = (char*)aligned_alloc(alignof(host_layout<VkDescriptorAddressInfoEXT>), sizeof(host_layout<VkDescriptorAddressInfoEXT>));\n    auto child = new (child_mem) host_layout<VkDescriptorAddressInfoEXT> {*guest_ptr.get_pointer()};\n\n    default_fex_custom_repack_entry(*child, *guest_ptr.get_pointer());\n    into.data.data.pUniformBuffer = &child->data;\n    break;\n  }\n\n  case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:\n  case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV: {\n    // Copy unmodified\n    static_assert(sizeof(guest_layout<VkDeviceAddress>) == sizeof(uint64_t));\n    memcpy(&into.data.data.accelerationStructure, &from.data.data, sizeof(uint64_t));\n  }\n\n  case VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM:\n  case VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM:\n  case VK_DESCRIPTOR_TYPE_MUTABLE_EXT:\n  case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:\n  case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:\n  case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK:\n  default: fprintf(stderr, \"ERROR: Invalid descriptor type used in VkDescriptorGetInfoEXT\"); std::abort();\n  }\n}\n\nbool fex_custom_repack_exit(guest_layout<VkDescriptorGetInfoEXT>& into, const host_layout<VkDescriptorGetInfoEXT>& from) {\n  switch (from.data.type) {\n  case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:\n  case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:\n  case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:\n  case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:\n    // Delete storage allocated on entry\n    free((void*)from.data.data.pUniformBuffer);\n\n  default:\n    // Nothing to do for the rest\n    break;\n  }\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkCopyMemoryToImageInfoEXT>& into, const guest_layout<VkCopyMemoryToImageInfoEXT>& from) {\n  default_fex_custom_repack_entry(into, from);\n  into.data.pRegions = RepackStructArray(from.data.regionCount.data, from.data.pRegions).data();\n}\n\nbool fex_custom_repack_exit(guest_layout<VkCopyMemoryToImageInfoEXT>& into, const host_layout<VkCopyMemoryToImageInfoEXT>& from) {\n  DeleteRepackedStructArray(from.data.regionCount, from.data.pRegions, into.data.pRegions);\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkDependencyInfo>& into, const guest_layout<VkDependencyInfo>& from) {\n  default_fex_custom_repack_entry(into, from);\n  into.data.pMemoryBarriers = RepackStructArray(from.data.memoryBarrierCount.data, from.data.pMemoryBarriers).data();\n  into.data.pImageMemoryBarriers = RepackStructArray(from.data.imageMemoryBarrierCount.data, from.data.pImageMemoryBarriers).data();\n  into.data.pBufferMemoryBarriers = RepackStructArray(from.data.bufferMemoryBarrierCount.data, from.data.pBufferMemoryBarriers).data();\n}\n\nbool fex_custom_repack_exit(guest_layout<VkDependencyInfo>& into, const host_layout<VkDependencyInfo>& from) {\n  DeleteRepackedStructArray(from.data.memoryBarrierCount, from.data.pMemoryBarriers, into.data.pMemoryBarriers);\n  DeleteRepackedStructArray(from.data.imageMemoryBarrierCount, from.data.pImageMemoryBarriers, into.data.pImageMemoryBarriers);\n  DeleteRepackedStructArray(from.data.bufferMemoryBarrierCount, from.data.pBufferMemoryBarriers, into.data.pBufferMemoryBarriers);\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkDescriptorUpdateTemplateCreateInfo>& into,\n                             const guest_layout<VkDescriptorUpdateTemplateCreateInfo>& from) {\n  default_fex_custom_repack_entry(into, from);\n  into.data.pDescriptorUpdateEntries = RepackStructArray(from.data.descriptorUpdateEntryCount.data, from.data.pDescriptorUpdateEntries).data();\n}\n\nbool fex_custom_repack_exit(guest_layout<VkDescriptorUpdateTemplateCreateInfo>& into, const host_layout<VkDescriptorUpdateTemplateCreateInfo>& from) {\n  DeleteRepackedStructArray(from.data.descriptorUpdateEntryCount, from.data.pDescriptorUpdateEntries, into.data.pDescriptorUpdateEntries);\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkPipelineShaderStageCreateInfo>& into, const guest_layout<VkPipelineShaderStageCreateInfo>& from) {\n  default_fex_custom_repack_entry(into, from);\n  if (from.data.pSpecializationInfo.get_pointer()) {\n    fprintf(stderr, \"ERROR: Cannot repack non-null VkPipelineShaderStageCreateInfo::pSpecializationInfo yet\");\n    std::abort();\n  }\n}\n\nbool fex_custom_repack_exit(guest_layout<VkPipelineShaderStageCreateInfo>& into, const host_layout<VkPipelineShaderStageCreateInfo>& from) {\n  // TODO\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkGraphicsPipelineCreateInfo>& into, const guest_layout<VkGraphicsPipelineCreateInfo>& from) {\n  default_fex_custom_repack_entry(into, from);\n  into.data.pStages = RepackStructArray(from.data.stageCount.data, from.data.pStages).data();\n\n  if (!from.data.pVertexInputState.get_pointer()) {\n    into.data.pVertexInputState = nullptr;\n  } else {\n    into.data.pVertexInputState = &(new host_layout<VkPipelineVertexInputStateCreateInfo> {*from.data.pVertexInputState.get_pointer()})->data;\n  }\n\n  if (!from.data.pInputAssemblyState.get_pointer()) {\n    into.data.pInputAssemblyState = nullptr;\n  } else {\n    into.data.pInputAssemblyState =\n      &(new host_layout<VkPipelineInputAssemblyStateCreateInfo> {*from.data.pInputAssemblyState.get_pointer()})->data;\n  }\n\n  if (!from.data.pTessellationState.get_pointer()) {\n    into.data.pTessellationState = nullptr;\n  } else {\n    into.data.pTessellationState = &(new host_layout<VkPipelineTessellationStateCreateInfo> {*from.data.pTessellationState.get_pointer()})->data;\n  }\n\n  if (!from.data.pViewportState.get_pointer()) {\n    into.data.pViewportState = nullptr;\n  } else {\n    into.data.pViewportState = &(new host_layout<VkPipelineViewportStateCreateInfo> {*from.data.pViewportState.get_pointer()})->data;\n  }\n\n  if (!from.data.pRasterizationState.get_pointer()) {\n    into.data.pRasterizationState = nullptr;\n  } else {\n    into.data.pRasterizationState =\n      &(new host_layout<VkPipelineRasterizationStateCreateInfo> {*from.data.pRasterizationState.get_pointer()})->data;\n  }\n\n  if (!from.data.pMultisampleState.get_pointer()) {\n    into.data.pMultisampleState = nullptr;\n  } else {\n    into.data.pMultisampleState = &(new host_layout<VkPipelineMultisampleStateCreateInfo> {*from.data.pMultisampleState.get_pointer()})->data;\n  }\n\n  if (!from.data.pDepthStencilState.get_pointer()) {\n    into.data.pDepthStencilState = nullptr;\n  } else {\n    into.data.pDepthStencilState = &(new host_layout<VkPipelineDepthStencilStateCreateInfo> {*from.data.pDepthStencilState.get_pointer()})->data;\n  }\n\n  if (!from.data.pColorBlendState.get_pointer()) {\n    into.data.pColorBlendState = nullptr;\n  } else {\n    into.data.pColorBlendState = &(new host_layout<VkPipelineColorBlendStateCreateInfo> {*from.data.pColorBlendState.get_pointer()})->data;\n  }\n\n  if (!from.data.pDynamicState.get_pointer()) {\n    into.data.pDynamicState = nullptr;\n  } else {\n    into.data.pDynamicState = &(new host_layout<VkPipelineDynamicStateCreateInfo> {*from.data.pDynamicState.get_pointer()})->data;\n  }\n}\n\nbool fex_custom_repack_exit(guest_layout<VkGraphicsPipelineCreateInfo>& into, const host_layout<VkGraphicsPipelineCreateInfo>& from) {\n  delete[] from.data.pStages;\n  delete from.data.pVertexInputState;\n  delete from.data.pInputAssemblyState;\n  delete from.data.pTessellationState;\n  delete from.data.pViewportState;\n  delete from.data.pRasterizationState;\n  delete from.data.pMultisampleState;\n  delete from.data.pDepthStencilState;\n  delete from.data.pColorBlendState;\n  delete from.data.pDynamicState;\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkSubmitInfo>& into, const guest_layout<VkSubmitInfo>& from) {\n  default_fex_custom_repack_entry(into, from);\n  into.data.pCommandBuffers = RepackStructArray<false>(from.data.commandBufferCount.data, from.data.pCommandBuffers).data();\n}\n\nbool fex_custom_repack_exit(guest_layout<VkSubmitInfo>& into, const host_layout<VkSubmitInfo>& from) {\n  delete[] from.data.pCommandBuffers;\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkCommandBufferBeginInfo>& into, const guest_layout<VkCommandBufferBeginInfo>& from) {\n  default_fex_custom_repack_entry(into, from);\n\n  if (!from.data.pInheritanceInfo.get_pointer() || !from.data.pInheritanceInfo.data) {\n    into.data.pInheritanceInfo = nullptr;\n    return;\n  }\n  into.data.pInheritanceInfo = new VkCommandBufferInheritanceInfo;\n  auto src = host_layout<VkCommandBufferInheritanceInfo> {*from.data.pInheritanceInfo.get_pointer()}.data;\n  static_assert(sizeof(src) == sizeof(*into.data.pInheritanceInfo));\n  memcpy((void*)into.data.pInheritanceInfo, &src, sizeof(src));\n}\n\nbool fex_custom_repack_exit(guest_layout<VkCommandBufferBeginInfo>& into, const host_layout<VkCommandBufferBeginInfo>& from) {\n  delete from.data.pInheritanceInfo;\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkPipelineCacheCreateInfo>& into, const guest_layout<VkPipelineCacheCreateInfo>& from) {\n  default_fex_custom_repack_entry(into, from);\n\n  // Same underlying layout, so there's nothing to do\n  into.data.pInitialData = from.data.pInitialData.get_pointer();\n}\n\nbool fex_custom_repack_exit(guest_layout<VkPipelineCacheCreateInfo>& into, const host_layout<VkPipelineCacheCreateInfo>& from) {\n  // Nothing to do\n  return false;\n}\n\nvoid fex_custom_repack_entry(host_layout<VkRenderPassBeginInfo>& into, const guest_layout<VkRenderPassBeginInfo>& from) {\n  default_fex_custom_repack_entry(into, from);\n\n  // Same underlying layout, so there's nothing to do\n  into.data.pClearValues = reinterpret_cast<const VkClearValue*>(from.data.pClearValues.get_pointer());\n}\n\nbool fex_custom_repack_exit(guest_layout<VkRenderPassBeginInfo>& into, const host_layout<VkRenderPassBeginInfo>& from) {\n  // Nothing to do\n  return false;\n}\n#endif\n\nEXPORTS(libvulkan)\n"
  },
  {
    "path": "ThunkLibs/libvulkan/libvulkan_interface.cpp",
    "content": "#include <common/GeneratorInterface.h>\n\n#include <type_traits>\n\ntemplate<auto>\nstruct fex_gen_config {\n  unsigned version = 1;\n};\n\n// Some of Vulkan's handle types are so-called \"non-dispatchable handles\".\n// On 64-bit, these are defined as dedicated types by default, which makes\n// annotating these handle types unnecessarily complicated. Instead, setting\n// the following define will make the Vulkan headers alias all handle types\n// to uint64_t.\n#define VK_USE_64_BIT_PTR_DEFINES 0\n\n#define VK_USE_PLATFORM_XLIB_XRANDR_EXT\n#define VK_USE_PLATFORM_XLIB_KHR\n#define VK_USE_PLATFORM_XCB_KHR\n#define VK_USE_PLATFORM_WAYLAND_KHR\n#include <vulkan/vulkan.h>\n\ntemplate<>\nstruct fex_gen_config<vkGetDeviceProcAddr> : fexgen::custom_host_impl, fexgen::custom_guest_entrypoint, fexgen::returns_guest_pointer {};\ntemplate<>\nstruct fex_gen_config<vkGetInstanceProcAddr> : fexgen::custom_host_impl, fexgen::custom_guest_entrypoint, fexgen::returns_guest_pointer {};\n\ntemplate<typename>\nstruct fex_gen_type {};\n\n// internal use\nvoid Vulkan_SetGuestXSync(uintptr_t, uintptr_t);\nvoid Vulkan_SetGuestXGetVisualInfo(uintptr_t, uintptr_t);\nvoid Vulkan_SetGuestXDisplayString(uintptr_t, uintptr_t);\ntemplate<>\nstruct fex_gen_config<Vulkan_SetGuestXSync> : fexgen::custom_guest_entrypoint, fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_config<Vulkan_SetGuestXGetVisualInfo> : fexgen::custom_guest_entrypoint, fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_config<Vulkan_SetGuestXDisplayString> : fexgen::custom_guest_entrypoint, fexgen::custom_host_impl {};\n\n// So-called \"dispatchable\" handles are represented as opaque pointers.\n// In addition to marking them as such, API functions that create these objects\n// need special care since they wrap these handles in another pointer, which\n// the thunk generator can't automatically handle.\n//\n// So-called \"non-dispatchable\" handles don't need this extra treatment, since\n// they are uint64_t IDs on both 32-bit and 64-bit systems.\ntemplate<>\nstruct fex_gen_type<VkCommandBuffer_T> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<VkDevice_T> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<VkInstance_T> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<VkPhysicalDevice_T> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<VkQueue_T> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<VkExternalComputeQueueNV_T> : fexgen::opaque_type {};\n\n// Mark union types with compatible layout as such\n// TODO: These may still have different alignment requirements!\ntemplate<>\nstruct fex_gen_type<VkClearValue> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_type<VkClearColorValue> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_type<VkPipelineExecutableStatisticValueKHR> : fexgen::assume_compatible_data_layout {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_type<VkAccelerationStructureGeometryDataKHR> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_type<VkDescriptorDataEXT> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_type<VkDeviceOrHostAddressKHR> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_type<VkDeviceOrHostAddressConstKHR> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_type<VkPerformanceValueDataINTEL> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_type<VkIndirectExecutionSetInfoEXT> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_type<VkIndirectCommandsTokenDataEXT> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_type<VkClusterAccelerationStructureOpInputNV> : fexgen::assume_compatible_data_layout {};\n#endif\n\n// Explicitly register types that are only ever referenced through nested pointers\ntemplate<>\nstruct fex_gen_type<VkAccelerationStructureBuildRangeInfoKHR> {};\ntemplate<>\nstruct fex_gen_type<VkDescriptorSetLayoutBinding> {};\ntemplate<>\nstruct fex_gen_type<VkDescriptorUpdateTemplateEntry> {};\ntemplate<>\nstruct fex_gen_type<VkSubpassDescription> {};\n\n// Structures that contain function pointers\n// TODO: Use custom repacking for these instead\ntemplate<>\nstruct fex_gen_type<VkDebugReportCallbackCreateInfoEXT> : fexgen::emit_layout_wrappers {};\ntemplate<>\nstruct fex_gen_type<VkDebugUtilsMessengerCreateInfoEXT> : fexgen::emit_layout_wrappers {};\n\n#ifdef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_type<VkBaseOutStructure> : fexgen::emit_layout_wrappers {};\n\n// Register structs with an extension point (pNext). Any other members that need customization are listed below.\n// Generated using\n// for i in `grep VK_STRUCTURE_TYPE vk.xml -B1 | grep category=\\\"struct\\\" | cut -d'\"' -f 4 | sort`\n// do\n//   grep $i vulkan_{core,wayland,xcb,xlib,xlib_xrandr}.h >& /dev/null && echo $i\n// done | awk '{ print \"template<> struct fex_gen_config<&\"$1\"::pNext> : fexgen::custom_repack {};\" }'\n// template<>\n// struct fex_gen_config<&VkAccelerationStructureBuildGeometryInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAccelerationStructureBuildSizesInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAccelerationStructureCaptureDescriptorDataInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAccelerationStructureCreateInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkAccelerationStructureCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAccelerationStructureDeviceAddressInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkAccelerationStructureGeometryAabbsDataKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkAccelerationStructureGeometryInstancesDataKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkAccelerationStructureGeometryKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkAccelerationStructureGeometryMotionTrianglesDataNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkAccelerationStructureGeometryTrianglesDataKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkAccelerationStructureInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAccelerationStructureMemoryRequirementsInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAccelerationStructureMotionInfoNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkAccelerationStructureTrianglesOpacityMicromapEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAccelerationStructureVersionInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAcquireNextImageInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAcquireProfilingLockInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAmigoProfilingSubmitInfoSEC::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkAntiLagDataAMD::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAntiLagPresentationInfoAMD::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkApplicationInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAttachmentDescription2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAttachmentDescriptionStencilLayout::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAttachmentFeedbackLoopInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAttachmentReference2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAttachmentReferenceStencilLayout::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkAttachmentSampleCountInfoAMD::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBeginCustomResolveInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBindAccelerationStructureMemoryInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBindBufferMemoryDeviceGroupInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBindBufferMemoryInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBindDataGraphPipelineSessionMemoryInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBindDescriptorBufferEmbeddedSamplersInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBindDescriptorSetsInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBindImageMemoryDeviceGroupInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBindImageMemoryInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBindImageMemorySwapchainInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBindImagePlaneMemoryInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBindMemoryStatus::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkBindSparseInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBindTensorMemoryInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBindVideoSessionMemoryInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBlitImageCubicWeightsInfoQCOM::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkBlitImageInfo2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBufferCaptureDescriptorDataInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBufferCopy2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBufferCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBufferDeviceAddressCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBufferDeviceAddressInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBufferImageCopy2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBufferMemoryBarrier::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBufferMemoryBarrier2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBufferMemoryRequirementsInfo2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBufferOpaqueCaptureAddressCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBufferUsageFlags2CreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBufferViewCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkBuildPartitionedAccelerationStructureInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCalibratedTimestampInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkCheckpointData2NV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkCheckpointDataNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkClusterAccelerationStructureClustersBottomLevelInputNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkClusterAccelerationStructureCommandsInfoNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkClusterAccelerationStructureInputInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkClusterAccelerationStructureMoveObjectsInputNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkClusterAccelerationStructureTriangleClusterInputNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCommandBufferAllocateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCommandBufferBeginInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCommandBufferInheritanceConditionalRenderingInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCommandBufferInheritanceInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCommandBufferInheritanceRenderingInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCommandBufferInheritanceRenderPassTransformInfoQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCommandBufferInheritanceViewportScissorInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCommandBufferSubmitInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCommandPoolCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkComputeOccupancyPriorityParametersNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkComputePipelineCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkComputePipelineIndirectBufferInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkConditionalRenderingBeginInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkConvertCooperativeVectorMatrixInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCooperativeMatrixFlexibleDimensionsPropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCooperativeMatrixPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCooperativeMatrixPropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCooperativeVectorPropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCopyAccelerationStructureInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkCopyAccelerationStructureToMemoryInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkCopyBufferInfo2::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkCopyBufferToImageInfo2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCopyCommandTransformInfoQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCopyDescriptorSet::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkCopyImageInfo2::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkCopyImageToBufferInfo2::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkCopyImageToImageInfo::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkCopyImageToMemoryInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCopyMemoryIndirectInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkCopyMemoryToAccelerationStructureInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCopyMemoryToImageIndirectInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCopyMemoryToImageInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCopyMemoryToImageInfo::pRegions> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkCopyMemoryToMicromapInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCopyMicromapInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkCopyMicromapToMemoryInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkCopyTensorInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCuFunctionCreateInfoNVX::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkCuLaunchInfoNVX::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkCuModuleCreateInfoNVX::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCuModuleTexturingModeCreateInfoNVX::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkCustomResolveCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDataGraphPipelineBuiltinModelCreateInfoQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDataGraphPipelineCompilerControlCreateInfoARM::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDataGraphPipelineConstantARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDataGraphPipelineConstantTensorSemiStructuredSparsityInfoARM::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDataGraphPipelineCreateInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDataGraphPipelineDispatchInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDataGraphPipelineIdentifierCreateInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDataGraphPipelineInfoARM::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDataGraphPipelinePropertyQueryResultARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDataGraphPipelineResourceInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDataGraphPipelineSessionBindPointRequirementARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDataGraphPipelineSessionBindPointRequirementsInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDataGraphPipelineSessionCreateInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDataGraphPipelineSessionMemoryRequirementsInfoARM::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDataGraphPipelineShaderModuleCreateInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDataGraphProcessingEngineCreateInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDebugMarkerMarkerInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDebugMarkerObjectNameInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDebugMarkerObjectTagInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDebugReportCallbackCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDebugUtilsLabelEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDebugUtilsMessengerCallbackDataEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDebugUtilsMessengerCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDebugUtilsObjectNameInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDebugUtilsObjectTagInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDecompressMemoryInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDedicatedAllocationBufferCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDedicatedAllocationImageCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDedicatedAllocationMemoryAllocateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDependencyInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDepthBiasInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDepthBiasRepresentationInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorAddressInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorBufferBindingInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorBufferBindingPushDescriptorBufferHandleEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorGetInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorGetTensorInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorPoolCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorPoolInlineUniformBlockCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorSetAllocateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorSetBindingReferenceVALVE::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorSetLayoutBindingFlagsCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorSetLayoutCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorSetLayoutHostMappingInfoVALVE::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorSetLayoutSupport::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorSetVariableDescriptorCountAllocateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorSetVariableDescriptorCountLayoutSupport::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDescriptorUpdateTemplateCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceAddressBindingCallbackDataEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDeviceBufferMemoryRequirements::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceCreateInfo::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDeviceDeviceMemoryReportCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceDiagnosticsConfigCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceEventInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceFaultCountsEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDeviceFaultInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDeviceGroupBindSparseInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceGroupCommandBufferBeginInfo::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDeviceGroupDeviceCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceGroupPresentCapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceGroupPresentInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceGroupRenderPassBeginInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceGroupSubmitInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceGroupSwapchainCreateInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDeviceImageMemoryRequirements::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDeviceImageSubresourceInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceMemoryOpaqueCaptureAddressInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceMemoryOverallocationCreateInfoAMD::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceMemoryReportCallbackDataEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDevicePipelineBinaryInternalCacheControlKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDevicePrivateDataCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceQueueCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceQueueGlobalPriorityCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceQueueInfo2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceQueueShaderCoreControlCreateInfoARM::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDeviceTensorMemoryRequirementsARM::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDirectDriverLoadingInfoLUNARG::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDirectDriverLoadingListLUNARG::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDispatchTileInfoQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDisplayEventInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDisplayModeCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDisplayModeProperties2KHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDisplayModeStereoPropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDisplayNativeHdrSurfaceCapabilitiesAMD::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDisplayPlaneCapabilities2KHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDisplayPlaneInfo2KHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDisplayPlaneProperties2KHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDisplayPowerInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDisplayPresentInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDisplayProperties2KHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDisplaySurfaceCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDisplaySurfaceStereoCreateInfoNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDrmFormatModifierPropertiesList2EXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkDrmFormatModifierPropertiesListEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkEventCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExportFenceCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExportMemoryAllocateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExportMemoryAllocateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExportSemaphoreCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExternalBufferProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExternalComputeQueueCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExternalComputeQueueDataParamsNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExternalComputeQueueDeviceCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExternalFenceProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExternalImageFormatProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExternalMemoryAcquireUnmodifiedEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExternalMemoryBufferCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExternalMemoryImageCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExternalMemoryImageCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExternalMemoryTensorCreateInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExternalSemaphoreProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkExternalTensorPropertiesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkFenceCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkFenceGetFdInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkFilterCubicImageViewImageFormatPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkFormatProperties2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkFormatProperties3::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkFragmentShadingRateAttachmentInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkFrameBoundaryEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkFrameBoundaryTensorsARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkFramebufferAttachmentImageInfo::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkFramebufferAttachmentsCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkFramebufferCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkFramebufferMixedSamplesCombinationNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGeneratedCommandsInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkGeneratedCommandsInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGeneratedCommandsMemoryRequirementsInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGeneratedCommandsMemoryRequirementsInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGeneratedCommandsPipelineInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGeneratedCommandsShaderInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGeometryAABBNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGeometryNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGeometryTrianglesNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkGetLatencyMarkerInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGraphicsPipelineCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGraphicsPipelineLibraryCreateInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkGraphicsPipelineShaderGroupsCreateInfoNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkGraphicsShaderGroupCreateInfoNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkHdrVividDynamicMetadataHUAWEI::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkHeadlessSurfaceCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkHostImageCopyDevicePerformanceQuery::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkHostImageLayoutTransitionInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageAlignmentControlCreateInfoMESA::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageBlit2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageCaptureDescriptorDataInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageCompressionControlEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageCompressionPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageCopy2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageCreateInfo::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkImageDrmFormatModifierExplicitCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageDrmFormatModifierListCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageDrmFormatModifierPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageFormatListCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageFormatProperties2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageMemoryBarrier::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageMemoryBarrier2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageMemoryRequirementsInfo2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImagePlaneMemoryRequirementsInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageResolve2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageSparseMemoryRequirementsInfo2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageStencilUsageCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageSubresource2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageSwapchainCreateInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkImageToMemoryCopy::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageViewAddressPropertiesNVX::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageViewASTCDecodeModeEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageViewCaptureDescriptorDataInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageViewCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageViewHandleInfoNVX::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageViewMinLodCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageViewSampleWeightCreateInfoQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageViewSlicedCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImageViewUsageCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImportFenceFdInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImportMemoryFdInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkImportMemoryHostPointerInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkImportSemaphoreFdInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkIndirectCommandsLayoutCreateInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkIndirectCommandsLayoutCreateInfoNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkIndirectCommandsLayoutTokenEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkIndirectCommandsLayoutTokenNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkIndirectExecutionSetCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkIndirectExecutionSetPipelineInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkIndirectExecutionSetShaderInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkIndirectExecutionSetShaderLayoutInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkInitializePerformanceApiInfoINTEL::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkInstanceCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkLatencySleepInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkLatencySleepModeInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkLatencySubmissionPresentIdNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkLatencySurfaceCapabilitiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkLatencyTimingsFrameReportNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkLayerSettingsCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMappedMemoryRange::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryAllocateFlagsInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryAllocateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryBarrier::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryBarrier2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryBarrierAccessFlags3KHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryDedicatedAllocateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryDedicatedAllocateInfoTensorARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryDedicatedRequirements::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryFdPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryGetFdInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryGetRemoteAddressInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryHostPointerPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryMapInfo::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkMemoryMapPlacedInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryOpaqueCaptureAddressAllocateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryPriorityAllocateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryRequirements2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryToImageCopy::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryToImageCopy::pHostPointer> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMemoryUnmapInfo::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkMicromapBuildInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMicromapBuildSizesInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMicromapCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMicromapVersionInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMultisampledRenderToSingleSampledInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMultisamplePropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMultiviewPerViewAttributesInfoNVX::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkMutableDescriptorTypeCreateInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkOpaqueCaptureDescriptorDataCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkOpticalFlowExecuteInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkOpticalFlowImageFormatInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkOpticalFlowImageFormatPropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkOpticalFlowSessionCreateInfoNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkOpticalFlowSessionCreatePrivateDataInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkOutOfBandQueueTypeInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPartitionedAccelerationStructureFlagsNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPartitionedAccelerationStructureInstancesInputNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPastPresentationTimingEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPastPresentationTimingInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPastPresentationTimingPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPerformanceConfigurationAcquireInfoINTEL::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPerformanceCounterARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPerformanceCounterDescriptionARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPerformanceCounterDescriptionKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPerformanceCounterKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPerformanceMarkerInfoINTEL::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPerformanceOverrideInfoINTEL::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPerformanceQuerySubmitInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPerformanceStreamMarkerInfoINTEL::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPerTileBeginInfoQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPerTileEndInfoQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevice16BitStorageFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevice4444FormatsFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevice8BitStorageFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceAccelerationStructureFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceAccelerationStructurePropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceAddressBindingReportFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceAmigoProfilingFeaturesSEC::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceAntiLagFeaturesAMD::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceASTCDecodeFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceBorderColorSwizzleFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceBufferDeviceAddressFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceClusterAccelerationStructureFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceClusterAccelerationStructurePropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCoherentMemoryFeaturesAMD::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceColorWriteEnableFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCommandBufferInheritanceFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceComputeOccupancyPriorityFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceConditionalRenderingFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCooperativeMatrix2FeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCooperativeMatrix2PropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCooperativeMatrixFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCooperativeMatrixFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCooperativeMatrixPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCooperativeMatrixPropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCooperativeVectorFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCooperativeVectorPropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCopyMemoryIndirectFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCopyMemoryIndirectPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCornerSampledImageFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCoverageReductionModeFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCubicClampFeaturesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCubicWeightsFeaturesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCustomBorderColorFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCustomBorderColorPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceCustomResolveFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDataGraphFeaturesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDataGraphModelFeaturesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDepthBiasControlFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDepthClampControlFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDepthClampZeroOneFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDepthClipControlFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDepthClipEnableFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDepthStencilResolveProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDescriptorBufferFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDescriptorBufferPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDescriptorBufferTensorFeaturesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDescriptorBufferTensorPropertiesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDescriptorIndexingFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDescriptorIndexingProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDeviceMemoryReportFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDiagnosticsConfigFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDiscardRectanglePropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDriverProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDrmPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDynamicRenderingFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDynamicRenderingLocalReadFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceExclusiveScissorFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceExtendedDynamicState2FeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceExtendedDynamicState3PropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceExtendedDynamicStateFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceExternalBufferInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceExternalComputeQueuePropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceExternalFenceInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceExternalImageFormatInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceExternalMemoryHostPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceExternalMemoryRDMAFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceExternalSemaphoreInfo::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPhysicalDeviceExternalTensorInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFaultFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFeatures2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFloatControlsProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFormatPackFeaturesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentDensityMap2FeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentDensityMapFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentDensityMapLayeredPropertiesVALVE::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentDensityMapOffsetPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentDensityMapPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentShadingRateFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentShadingRateKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFragmentShadingRatePropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceFrameBoundaryFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceGlobalPriorityQueryFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPhysicalDeviceGroupProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceHdrVividFeaturesHUAWEI::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceHostImageCopyFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceHostImageCopyProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceHostQueryResetFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceIDProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImage2DViewOf3DFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImageAlignmentControlFeaturesMESA::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImageAlignmentControlPropertiesMESA::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImageCompressionControlFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImageDrmFormatModifierInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImageFormatInfo2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImagelessFramebufferFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImageProcessing2FeaturesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImageProcessing2PropertiesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImageProcessingFeaturesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImageProcessingPropertiesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImageRobustnessFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImageViewImageFormatInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceImageViewMinLodFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceIndexTypeUint8Features::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceInheritedViewportScissorFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceInlineUniformBlockFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceInlineUniformBlockProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceInvocationMaskFeaturesHUAWEI::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceLayeredApiPropertiesKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPhysicalDeviceLayeredApiPropertiesListKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceLayeredApiVulkanPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceLayeredDriverPropertiesMSFT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceLegacyDitheringFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceLinearColorAttachmentFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceLineRasterizationFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceLineRasterizationProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMaintenance10FeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMaintenance10PropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMaintenance3Properties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMaintenance4Features::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMaintenance4Properties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMaintenance5Features::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMaintenance5Properties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMaintenance6Features::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMaintenance6Properties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMaintenance7FeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMaintenance7PropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMaintenance8FeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMaintenance9FeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMaintenance9PropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMapMemoryPlacedFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMapMemoryPlacedPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMemoryBudgetPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMemoryDecompressionFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMemoryDecompressionPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMemoryPriorityFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMemoryProperties2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMeshShaderFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMeshShaderFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMeshShaderPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMeshShaderPropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMultiDrawFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMultiDrawPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMultiviewFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMultiviewProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceNestedCommandBufferFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceNestedCommandBufferPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceOpacityMicromapFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceOpacityMicromapPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceOpticalFlowFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceOpticalFlowPropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePCIBusInfoPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePerformanceCountersByRegionFeaturesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePerformanceCountersByRegionPropertiesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePerformanceQueryFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePerformanceQueryPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePerStageDescriptorSetFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePipelineBinaryFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePipelineBinaryPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePipelineCreationCacheControlFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePipelineOpacityMicromapFeaturesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePipelinePropertiesFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePipelineProtectedAccessFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePipelineRobustnessFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePipelineRobustnessProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePointClippingProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePresentBarrierFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePresentId2FeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePresentIdFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePresentMeteringFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePresentTimingFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePresentWait2FeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePresentWaitFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePrivateDataFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceProperties2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceProtectedMemoryFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceProtectedMemoryProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceProvokingVertexFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceProvokingVertexPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDevicePushDescriptorProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceQueueFamilyDataGraphProcessingEngineInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRawAccessChainsFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRayQueryFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRayTracingMotionBlurFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRayTracingPropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRayTracingValidationFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRenderPassStripedFeaturesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRenderPassStripedPropertiesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRobustness2FeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceRobustness2PropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSampleLocationsPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSamplerFilterMinmaxProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSamplerYcbcrConversionFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceScalarBlockLayoutFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSchedulingControlsFeaturesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSchedulingControlsPropertiesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShader64BitIndexingFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderAtomicInt64Features::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderBfloat16FeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderClockFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderCoreProperties2AMD::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderCorePropertiesAMD::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderCorePropertiesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderDrawParametersFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderExpectAssumeFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderFloat16Int8Features::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderFloat8FeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderFloatControls2Features::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderFmaFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderImageFootprintFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderIntegerDotProductFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderIntegerDotProductProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderLongVectorFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderLongVectorPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderObjectFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderObjectPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderQuadControlFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderSMBuiltinsFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderSMBuiltinsPropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderSubgroupRotateFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderTerminateInvocationFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderTileImageFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderTileImagePropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShaderUntypedPointersFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShadingRateImageFeaturesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceShadingRateImagePropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSparseImageFormatInfo2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSubgroupProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSubgroupSizeControlFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSubgroupSizeControlProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSubpassShadingFeaturesHUAWEI::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSubpassShadingPropertiesHUAWEI::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSurfaceInfo2KHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceSynchronization2Features::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceTensorFeaturesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceTensorPropertiesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceTexelBufferAlignmentProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceTextureCompressionASTC3DFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceTextureCompressionASTCHDRFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceTileMemoryHeapFeaturesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceTileMemoryHeapPropertiesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceTilePropertiesFeaturesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceTileShadingFeaturesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceTileShadingPropertiesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceTimelineSemaphoreFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceTimelineSemaphoreProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceToolProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceTransformFeedbackFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceTransformFeedbackPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceUniformBufferStandardLayoutFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVariablePointersFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVertexAttributeDivisorFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVertexAttributeDivisorProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVideoDecodeVP9FeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVideoEncodeAV1FeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVideoFormatInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVideoMaintenance1FeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVideoMaintenance2FeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVulkan11Features::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVulkan11Properties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVulkan12Features::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVulkan12Properties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVulkan13Features::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVulkan13Properties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVulkan14Features::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVulkan14Properties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceVulkanMemoryModelFeatures::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceYcbcrDegammaFeaturesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceYcbcrImageArraysFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPipelineBinaryCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineBinaryDataInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPipelineBinaryHandlesInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineBinaryInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineBinaryKeyKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineCacheCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineColorBlendAdvancedStateCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineColorBlendStateCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineColorWriteCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineCompilerControlCreateInfoAMD::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineCoverageModulationStateCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineCoverageReductionStateCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineCoverageToColorStateCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineCreateFlags2CreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineCreateInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPipelineCreationFeedbackCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineDepthStencilStateCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineDiscardRectangleStateCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineDynamicStateCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineExecutableInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPipelineExecutableInternalRepresentationKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineExecutablePropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineExecutableStatisticKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineFragmentDensityMapLayeredCreateInfoVALVE::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineFragmentShadingRateStateCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineIndirectDeviceAddressInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineInputAssemblyStateCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineLayoutCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineLibraryCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineMultisampleStateCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelinePropertiesIdentifierEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineRasterizationConservativeStateCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineRasterizationDepthClipStateCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineRasterizationLineStateCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineRasterizationProvokingVertexStateCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineRasterizationStateCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineRasterizationStateRasterizationOrderAMD::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineRasterizationStateStreamCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineRenderingCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineRepresentativeFragmentTestStateCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineRobustnessCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineSampleLocationsStateCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineShaderStageCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineShaderStageModuleIdentifierCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineShaderStageRequiredSubgroupSizeCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineTessellationDomainOriginStateCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineTessellationStateCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineVertexInputDivisorStateCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineVertexInputStateCreateInfo::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPipelineViewportCoarseSampleOrderStateCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineViewportDepthClampControlCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineViewportDepthClipControlCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineViewportExclusiveScissorStateCreateInfoNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPipelineViewportShadingRateImageStateCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineViewportStateCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineViewportSwizzleStateCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPipelineViewportWScalingStateCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPresentId2KHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPresentIdKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPresentInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPresentRegionsKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPresentTimesInfoGOOGLE::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPresentTimingInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPresentTimingsInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPresentTimingSurfaceCapabilitiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPresentWait2InfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkPrivateDataSlotCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkProtectedSubmitInfo::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPushConstantsInfo::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPushDescriptorSetInfo::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkPushDescriptorSetWithTemplateInfo::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkQueryLowLatencySupportNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkQueryPoolCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkQueryPoolPerformanceCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkQueryPoolPerformanceQueryCreateInfoINTEL::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkQueryPoolVideoEncodeFeedbackCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkQueueFamilyCheckpointProperties2NV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkQueueFamilyCheckpointPropertiesNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkQueueFamilyDataGraphProcessingEnginePropertiesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkQueueFamilyDataGraphPropertiesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkQueueFamilyGlobalPriorityProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkQueueFamilyOwnershipTransferPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkQueueFamilyProperties2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkQueueFamilyQueryResultStatusPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkQueueFamilyVideoPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRayTracingPipelineClusterAccelerationStructureCreateInfoNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkRayTracingPipelineCreateInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkRayTracingPipelineCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRayTracingPipelineInterfaceCreateInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkRayTracingShaderGroupCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRayTracingShaderGroupCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkReleaseCapturedPipelineDataInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkReleaseSwapchainImagesInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderingAreaInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderingAttachmentFlagsInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderingAttachmentInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderingAttachmentLocationInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderingEndInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderingFragmentDensityMapAttachmentInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderingFragmentShadingRateAttachmentInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderingInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderingInputAttachmentIndexInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassAttachmentBeginInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassBeginInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassCreateInfo2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassCreationControlEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassCreationFeedbackCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassFragmentDensityMapCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassFragmentDensityMapOffsetEndInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassInputAttachmentAspectCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassMultiviewCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassPerformanceCountersByRegionBeginInfoARM::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkRenderPassSampleLocationsBeginInfoEXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkRenderPassStripeBeginInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassStripeInfoARM::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkRenderPassStripeSubmitInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassSubpassFeedbackCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassTileShadingCreateInfoQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassTransformBeginInfoQCOM::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkResolveImageInfo2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkResolveImageModeInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSampleLocationsInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSamplerBlockMatchWindowCreateInfoQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSamplerBorderColorComponentMappingCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSamplerCaptureDescriptorDataInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSamplerCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSamplerCubicWeightsCreateInfoQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSamplerCustomBorderColorCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSamplerReductionModeCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSamplerYcbcrConversionCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSamplerYcbcrConversionImageFormatProperties::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSamplerYcbcrConversionInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSemaphoreCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSemaphoreGetFdInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSemaphoreSignalInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSemaphoreSubmitInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSemaphoreTypeCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSemaphoreWaitInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSetDescriptorBufferOffsetsInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSetLatencyMarkerInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSetPresentConfigNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkShaderCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkShaderModuleCreateInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkShaderModuleIdentifierEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkShaderModuleValidationCacheCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSharedPresentSurfaceCapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSparseImageFormatProperties2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSparseImageMemoryRequirements2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSubmitInfo::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkSubmitInfo2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSubpassBeginInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSubpassDependency2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSubpassDescription2::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkSubpassDescriptionDepthStencilResolve::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSubpassEndInfo::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSubpassResolvePerformanceQueryEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSubpassShadingPipelineCreateInfoHUAWEI::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSubresourceHostMemcpySize::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSubresourceLayout2::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSurfaceCapabilities2EXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSurfaceCapabilities2KHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSurfaceCapabilitiesPresentBarrierNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSurfaceCapabilitiesPresentId2KHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSurfaceCapabilitiesPresentWait2KHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSurfaceFormat2KHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSurfacePresentModeCompatibilityKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSurfacePresentModeKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSurfacePresentScalingCapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSurfaceProtectedCapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSwapchainCalibratedTimestampInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSwapchainCounterCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSwapchainCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSwapchainDisplayNativeHdrCreateInfoAMD::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSwapchainLatencyCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSwapchainPresentBarrierCreateInfoNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSwapchainPresentFenceInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSwapchainPresentModeInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSwapchainPresentModesCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSwapchainPresentScalingCreateInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkSwapchainTimeDomainPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSwapchainTimingPropertiesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkTensorCaptureDescriptorDataInfoARM::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkTensorCopyARM::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkTensorCreateInfoARM::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkTensorDependencyInfoARM::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkTensorDescriptionARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkTensorFormatPropertiesARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkTensorMemoryBarrierARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkTensorMemoryRequirementsInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkTensorViewCaptureDescriptorDataInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkTensorViewCreateInfoARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkTextureLODGatherFormatPropertiesAMD::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkTileMemoryBindInfoQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkTileMemoryRequirementsQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkTileMemorySizeInfoQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkTilePropertiesQCOM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkTimelineSemaphoreSubmitInfo::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkValidationCacheCreateInfoEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkValidationFeaturesEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkValidationFlagsEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVertexInputAttributeDescription2EXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVertexInputBindingDescription2EXT::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoBeginCodingInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoCapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoCodingControlInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoDecodeAV1CapabilitiesKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoDecodeAV1DpbSlotInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoDecodeAV1InlineSessionParametersInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoDecodeAV1PictureInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoDecodeAV1ProfileInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoDecodeAV1SessionParametersCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoDecodeCapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoDecodeH264CapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoDecodeH264DpbSlotInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoDecodeH264InlineSessionParametersInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoDecodeH264PictureInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoDecodeH264ProfileInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoDecodeH264SessionParametersAddInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoDecodeH264SessionParametersCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoDecodeH265CapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoDecodeH265DpbSlotInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoDecodeH265InlineSessionParametersInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoDecodeH265PictureInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoDecodeH265ProfileInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoDecodeH265SessionParametersAddInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoDecodeH265SessionParametersCreateInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoDecodeInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoDecodeUsageInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoDecodeVP9CapabilitiesKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoDecodeVP9PictureInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoDecodeVP9ProfileInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeAV1CapabilitiesKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoEncodeAV1DpbSlotInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeAV1GopRemainingFrameInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoEncodeAV1PictureInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeAV1ProfileInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeAV1QualityLevelPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeAV1QuantizationMapCapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeAV1RateControlInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeAV1RateControlLayerInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeAV1SessionCreateInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoEncodeAV1SessionParametersCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeCapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH264CapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH264DpbSlotInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH264GopRemainingFrameInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoEncodeH264NaluSliceInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoEncodeH264PictureInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH264ProfileInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH264QualityLevelPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH264QuantizationMapCapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH264RateControlInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH264RateControlLayerInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH264SessionCreateInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoEncodeH264SessionParametersAddInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoEncodeH264SessionParametersCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH264SessionParametersFeedbackInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH264SessionParametersGetInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH265CapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH265DpbSlotInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH265GopRemainingFrameInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoEncodeH265NaluSliceSegmentInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoEncodeH265PictureInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH265ProfileInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH265QualityLevelPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH265QuantizationMapCapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH265RateControlInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH265RateControlLayerInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH265SessionCreateInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoEncodeH265SessionParametersAddInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoEncodeH265SessionParametersCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH265SessionParametersFeedbackInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeH265SessionParametersGetInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoEncodeInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeIntraRefreshCapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeIntraRefreshInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeProfileRgbConversionInfoVALVE::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeQualityLevelInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeQualityLevelPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeQuantizationMapCapabilitiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeQuantizationMapInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoEncodeRateControlInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeRateControlLayerInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeRgbConversionCapabilitiesVALVE::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeSessionIntraRefreshCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeSessionParametersFeedbackInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeSessionParametersGetInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeSessionRgbConversionCreateInfoVALVE::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEncodeUsageInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoEndCodingInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoFormatAV1QuantizationMapPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoFormatH265QuantizationMapPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoFormatPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoFormatQuantizationMapPropertiesKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoInlineQueryInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoPictureResourceInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoProfileInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoProfileListInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoReferenceIntraRefreshInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoReferenceSlotInfoKHR::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkVideoSessionCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoSessionMemoryRequirementsKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoSessionParametersCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkVideoSessionParametersUpdateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkWaylandSurfaceCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkWriteDescriptorSet::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkWriteDescriptorSetAccelerationStructureKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkWriteDescriptorSetAccelerationStructureNV::pNext> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkWriteDescriptorSetInlineUniformBlock::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkWriteDescriptorSetPartitionedAccelerationStructureNV::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkWriteDescriptorSetTensorARM::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkWriteIndirectExecutionSetPipelineEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkWriteIndirectExecutionSetShaderEXT::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkXcbSurfaceCreateInfoKHR::pNext> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkXlibSurfaceCreateInfoKHR::pNext> : fexgen::custom_repack {};\n\n\ntemplate<>\nstruct fex_gen_config<&VkCommandBufferBeginInfo::pInheritanceInfo> : fexgen::custom_repack {};\n\ntemplate<>\nstruct fex_gen_config<&VkDeviceCreateInfo::pQueueCreateInfos> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceCreateInfo::ppEnabledLayerNames> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDeviceCreateInfo::ppEnabledExtensionNames> : fexgen::custom_repack {};\n\ntemplate<>\nstruct fex_gen_config<&VkDependencyInfo::pMemoryBarriers> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDependencyInfo::pBufferMemoryBarriers> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkDependencyInfo::pImageMemoryBarriers> : fexgen::custom_repack {};\n\ntemplate<>\nstruct fex_gen_config<&VkDescriptorGetInfoEXT::data> : fexgen::custom_repack {};\n\ntemplate<>\nstruct fex_gen_config<&VkDescriptorSetLayoutCreateInfo::pBindings> : fexgen::custom_repack {};\n\ntemplate<>\nstruct fex_gen_config<&VkDescriptorUpdateTemplateCreateInfo::pDescriptorUpdateEntries> : fexgen::custom_repack {};\n\ntemplate<>\nstruct fex_gen_config<&VkGraphicsPipelineCreateInfo::pStages> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGraphicsPipelineCreateInfo::pVertexInputState> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGraphicsPipelineCreateInfo::pInputAssemblyState> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGraphicsPipelineCreateInfo::pTessellationState> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGraphicsPipelineCreateInfo::pViewportState> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGraphicsPipelineCreateInfo::pRasterizationState> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGraphicsPipelineCreateInfo::pMultisampleState> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGraphicsPipelineCreateInfo::pDepthStencilState> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGraphicsPipelineCreateInfo::pColorBlendState> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkGraphicsPipelineCreateInfo::pDynamicState> : fexgen::custom_repack {};\n\ntemplate<>\nstruct fex_gen_config<&VkInstanceCreateInfo::pApplicationInfo> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkInstanceCreateInfo::ppEnabledLayerNames> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkInstanceCreateInfo::ppEnabledExtensionNames> : fexgen::custom_repack {};\n\ntemplate<>\nstruct fex_gen_config<&VkRenderPassCreateInfo::pSubpasses> : fexgen::custom_repack {};\n// NOTE: pDependencies and pAttachments point to ABI-compatible data\n\ntemplate<>\nstruct fex_gen_config<&VkRenderPassCreateInfo2::pAttachments> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassCreateInfo2::pSubpasses> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderPassCreateInfo2::pDependencies> : fexgen::custom_repack {};\n\ntemplate<>\nstruct fex_gen_config<&VkPipelineShaderStageCreateInfo::pSpecializationInfo> : fexgen::custom_repack {};\n// template<>\n// struct fex_gen_config<&VkSpecializationInfo::pMapEntries> : fexgen::custom_repack {};\n\n// TODO: Support annotating as assume_compatible_data_layout instead\ntemplate<>\nstruct fex_gen_config<&VkPipelineCacheCreateInfo::pInitialData> : fexgen::custom_repack {};\n\n// Command buffers are dispatchable handles, so on 32-bit they need to be repacked\ntemplate<>\nstruct fex_gen_config<&VkSubmitInfo::pCommandBuffers> : fexgen::custom_repack {};\n\ntemplate<>\nstruct fex_gen_config<&VkRenderingInfo::pColorAttachments> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderingInfo::pDepthAttachment> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkRenderingInfo::pStencilAttachment> : fexgen::custom_repack {};\n\n// TODO: Support annotating as assume_compatible_data_layout instead\ntemplate<>\nstruct fex_gen_config<&VkRenderPassBeginInfo::pClearValues> : fexgen::custom_repack {};\n\ntemplate<>\nstruct fex_gen_config<&VkSubpassDescription2::pInputAttachments> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSubpassDescription2::pColorAttachments> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSubpassDescription2::pResolveAttachments> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkSubpassDescription2::pDepthStencilAttachment> : fexgen::custom_repack {};\n\n// These types have incompatible data layout but we use their layout wrappers elsewhere\ntemplate<>\nstruct fex_gen_type<VkWriteDescriptorSet> : fexgen::emit_layout_wrappers {};\n#else\n// The pNext member of this is a pointer to another VkBaseOutStructure, so data layout compatibility can't be inferred automatically\ntemplate<>\nstruct fex_gen_type<VkBaseOutStructure> : fexgen::assume_compatible_data_layout {};\n#endif\n\n\n// TODO: Should not be opaque, but it's usually NULL anyway. Supporting the contained function pointers will need more work.\ntemplate<>\nstruct fex_gen_type<VkAllocationCallbacks> : fexgen::opaque_type {};\n\n// X11 interop\ntemplate<>\nstruct fex_gen_config<&VkXcbSurfaceCreateInfoKHR::connection> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&VkXlibSurfaceCreateInfoKHR::dpy> : fexgen::custom_repack {};\n\n// Wayland interop\ntemplate<>\nstruct fex_gen_type<wl_display> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<wl_surface> : fexgen::opaque_type {};\n\nnamespace internal {\n\n// Function, parameter index, parameter type [optional]\ntemplate<auto, int, typename = void>\nstruct fex_gen_param {};\n\ntemplate<auto>\nstruct fex_gen_config : fexgen::generate_guest_symtable, fexgen::indirect_guest_calls {};\n\ntemplate<>\nstruct fex_gen_config<vkCreateInstance> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkCreateInstance, 2, VkInstance*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<vkDestroyInstance> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkEnumeratePhysicalDevices> {};\n#else\ntemplate<>\nstruct fex_gen_config<vkEnumeratePhysicalDevices> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkEnumeratePhysicalDevices, 2, VkPhysicalDevice*> : fexgen::ptr_passthrough {};\n#endif\n\n\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceFeatures> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceFormatProperties> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceImageFormatProperties> {};\n// TODO: Output parameter must repack on exit!\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceProperties> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceQueueFamilyProperties> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceMemoryProperties> {};\ntemplate<>\nstruct fex_gen_config<vkCreateDevice> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkCreateDevice, 3, VkDevice*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<vkDestroyDevice> {};\ntemplate<>\nstruct fex_gen_config<vkEnumerateInstanceExtensionProperties> {};\ntemplate<>\nstruct fex_gen_config<vkEnumerateDeviceExtensionProperties> {};\ntemplate<>\nstruct fex_gen_config<vkEnumerateInstanceLayerProperties> {};\ntemplate<>\nstruct fex_gen_config<vkEnumerateDeviceLayerProperties> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkGetDeviceQueue> {};\n#else\ntemplate<>\nstruct fex_gen_config<vkGetDeviceQueue> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkGetDeviceQueue, 3, VkQueue*> : fexgen::ptr_passthrough {};\n#endif\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkQueueSubmit> {};\n#else\n// Needs array repacking for multiple submit infos\ntemplate<>\nstruct fex_gen_config<vkQueueSubmit> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkQueueSubmit, 2, const VkSubmitInfo*> : fexgen::ptr_passthrough {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkQueueWaitIdle> {};\ntemplate<>\nstruct fex_gen_config<vkDeviceWaitIdle> {};\ntemplate<>\nstruct fex_gen_config<vkAllocateMemory> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_config<vkFreeMemory> : fexgen::custom_host_impl {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkMapMemory> {};\n#else\ntemplate<>\nstruct fex_gen_config<vkMapMemory> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkMapMemory, 5, void**> : fexgen::ptr_passthrough {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkUnmapMemory> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkFlushMappedMemoryRanges> {};\ntemplate<>\nstruct fex_gen_config<vkInvalidateMappedMemoryRanges> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceMemoryCommitment> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkBindBufferMemory> {};\ntemplate<>\nstruct fex_gen_config<vkBindImageMemory> {};\ntemplate<>\nstruct fex_gen_config<vkGetBufferMemoryRequirements> {};\ntemplate<>\nstruct fex_gen_config<vkGetImageMemoryRequirements> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkGetImageSparseMemoryRequirements> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceSparseImageFormatProperties> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkQueueBindSparse> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCreateFence> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyFence> {};\ntemplate<>\nstruct fex_gen_config<vkResetFences> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkGetFenceStatus> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkWaitForFences> {};\ntemplate<>\nstruct fex_gen_config<vkCreateSemaphore> {};\ntemplate<>\nstruct fex_gen_config<vkDestroySemaphore> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCreateQueryPool> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyQueryPool> {};\ntemplate<>\nstruct fex_gen_config<vkGetQueryPoolResults> {};\ntemplate<>\nstruct fex_gen_param<vkGetQueryPoolResults, 5, void*> : fexgen::assume_compatible_data_layout {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCreateBuffer> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyBuffer> {};\ntemplate<>\nstruct fex_gen_config<vkCreateImage> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyImage> {};\ntemplate<>\nstruct fex_gen_config<vkGetImageSubresourceLayout> {};\ntemplate<>\nstruct fex_gen_config<vkCreateImageView> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyImageView> {};\ntemplate<>\nstruct fex_gen_config<vkCreateCommandPool> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyCommandPool> {};\ntemplate<>\nstruct fex_gen_config<vkResetCommandPool> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkAllocateCommandBuffers> {};\n#else\ntemplate<>\nstruct fex_gen_config<vkAllocateCommandBuffers> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkAllocateCommandBuffers, 2, VkCommandBuffer*> : fexgen::ptr_passthrough {};\n#endif\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkFreeCommandBuffers> {};\n#else\ntemplate<>\nstruct fex_gen_config<vkFreeCommandBuffers> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkFreeCommandBuffers, 3, const VkCommandBuffer*> : fexgen::ptr_passthrough {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkBeginCommandBuffer> {};\ntemplate<>\nstruct fex_gen_config<vkEndCommandBuffer> {};\ntemplate<>\nstruct fex_gen_config<vkResetCommandBuffer> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdCopyBuffer> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyImage> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdCopyBufferToImage> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdCopyImageToBuffer> {};\ntemplate<>\nstruct fex_gen_config<vkCmdUpdateBuffer> {};\ntemplate<>\nstruct fex_gen_param<vkCmdUpdateBuffer, 4, const void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<vkCmdFillBuffer> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdPipelineBarrier> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdBeginQuery> {};\ntemplate<>\nstruct fex_gen_config<vkCmdEndQuery> {};\ntemplate<>\nstruct fex_gen_config<vkCmdResetQueryPool> {};\ntemplate<>\nstruct fex_gen_config<vkCmdWriteTimestamp> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyQueryPoolResults> {};\ntemplate<>\nstruct fex_gen_config<vkCmdExecuteCommands> {};\ntemplate<>\nstruct fex_gen_config<vkCreateEvent> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyEvent> {};\ntemplate<>\nstruct fex_gen_config<vkGetEventStatus> {};\ntemplate<>\nstruct fex_gen_config<vkSetEvent> {};\ntemplate<>\nstruct fex_gen_config<vkResetEvent> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCreateBufferView> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyBufferView> {};\ntemplate<>\nstruct fex_gen_config<vkCreateShaderModule> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_config<vkDestroyShaderModule> {};\ntemplate<>\nstruct fex_gen_config<vkCreatePipelineCache> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyPipelineCache> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkGetPipelineCacheData> {};\n#else\ntemplate<>\nstruct fex_gen_config<vkGetPipelineCacheData> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkGetPipelineCacheData, 2, size_t*> : fexgen::ptr_passthrough {};\n#endif\ntemplate<>\nstruct fex_gen_param<vkGetPipelineCacheData, 3, void*> : fexgen::assume_compatible_data_layout {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkMergePipelineCaches> {};\ntemplate<>\nstruct fex_gen_config<vkCreateComputePipelines> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkDestroyPipeline> {};\ntemplate<>\nstruct fex_gen_config<vkCreatePipelineLayout> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyPipelineLayout> {};\ntemplate<>\nstruct fex_gen_config<vkCreateSampler> {};\ntemplate<>\nstruct fex_gen_config<vkDestroySampler> {};\ntemplate<>\nstruct fex_gen_config<vkCreateDescriptorSetLayout> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyDescriptorSetLayout> {};\ntemplate<>\nstruct fex_gen_config<vkCreateDescriptorPool> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyDescriptorPool> {};\ntemplate<>\nstruct fex_gen_config<vkResetDescriptorPool> {};\ntemplate<>\nstruct fex_gen_config<vkAllocateDescriptorSets> {};\ntemplate<>\nstruct fex_gen_config<vkFreeDescriptorSets> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkUpdateDescriptorSets> {};\n#else\ntemplate<>\nstruct fex_gen_config<vkUpdateDescriptorSets> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkUpdateDescriptorSets, 2, const VkWriteDescriptorSet*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_param<vkUpdateDescriptorSets, 4, const VkCopyDescriptorSet*> : fexgen::ptr_passthrough {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdBindPipeline> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBindDescriptorSets> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdClearColorImage> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDispatch> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDispatchIndirect> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetEvent> {};\ntemplate<>\nstruct fex_gen_config<vkCmdResetEvent> {};\ntemplate<>\nstruct fex_gen_config<vkCmdWaitEvents> {};\ntemplate<>\nstruct fex_gen_config<vkCmdPushConstants> {};\ntemplate<>\nstruct fex_gen_param<vkCmdPushConstants, 5, const void*> : fexgen::assume_compatible_data_layout {};\n#endif\n\n// TODO: Should be custom_host_impl since there may be more than one VkGraphicsPipelineCreateInfo and more than one output pipeline\ntemplate<>\nstruct fex_gen_config<vkCreateGraphicsPipelines> {};\ntemplate<>\nstruct fex_gen_config<vkCreateFramebuffer> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyFramebuffer> {};\ntemplate<>\nstruct fex_gen_config<vkCreateRenderPass> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyRenderPass> {};\ntemplate<>\nstruct fex_gen_config<vkGetRenderAreaGranularity> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetViewport> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetScissor> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetLineWidth> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthBias> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetBlendConstants> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthBounds> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetStencilCompareMask> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetStencilWriteMask> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetStencilReference> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBindIndexBuffer> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBindVertexBuffers> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDraw> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdDrawIndexed> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawIndirect> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawIndexedIndirect> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBlitImage> {};\ntemplate<>\nstruct fex_gen_config<vkCmdClearDepthStencilImage> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdClearAttachments> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdResolveImage> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdBeginRenderPass> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdNextSubpass> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdEndRenderPass> {};\ntemplate<>\nstruct fex_gen_config<vkEnumerateInstanceVersion> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkBindBufferMemory2> {};\ntemplate<>\nstruct fex_gen_config<vkBindImageMemory2> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceGroupPeerMemoryFeatures> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDeviceMask> {};\ntemplate<>\nstruct fex_gen_config<vkEnumeratePhysicalDeviceGroups> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkGetImageMemoryRequirements2> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkGetBufferMemoryRequirements2> {};\ntemplate<>\nstruct fex_gen_config<vkGetImageSparseMemoryRequirements2> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceFeatures2> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceProperties2> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceFormatProperties2> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceImageFormatProperties2> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceQueueFamilyProperties2> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceMemoryProperties2> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceSparseImageFormatProperties2> {};\ntemplate<>\nstruct fex_gen_config<vkTrimCommandPool> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceQueue2> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceExternalBufferProperties> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceExternalFenceProperties> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceExternalSemaphoreProperties> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDispatchBase> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCreateDescriptorUpdateTemplate> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyDescriptorUpdateTemplate> {};\ntemplate<>\nstruct fex_gen_config<vkUpdateDescriptorSetWithTemplate> {};\ntemplate<>\nstruct fex_gen_param<vkUpdateDescriptorSetWithTemplate, 3, const void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<vkGetDescriptorSetLayoutSupport> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCreateSamplerYcbcrConversion> {};\ntemplate<>\nstruct fex_gen_config<vkDestroySamplerYcbcrConversion> {};\ntemplate<>\nstruct fex_gen_config<vkResetQueryPool> {};\ntemplate<>\nstruct fex_gen_config<vkGetSemaphoreCounterValue> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkWaitSemaphores> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkSignalSemaphore> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkGetBufferDeviceAddress> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkGetBufferOpaqueCaptureAddress> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceMemoryOpaqueCaptureAddress> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawIndirectCount> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawIndexedIndirectCount> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCreateRenderPass2> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdBeginRenderPass2> {};\ntemplate<>\nstruct fex_gen_config<vkCmdNextSubpass2> {};\ntemplate<>\nstruct fex_gen_config<vkCmdEndRenderPass2> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceToolProperties> {};\ntemplate<>\nstruct fex_gen_config<vkCreatePrivateDataSlot> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyPrivateDataSlot> {};\ntemplate<>\nstruct fex_gen_config<vkSetPrivateData> {};\ntemplate<>\nstruct fex_gen_config<vkGetPrivateData> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdPipelineBarrier2> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdWriteTimestamp2> {};\ntemplate<>\nstruct fex_gen_config<vkQueueSubmit2> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyBuffer2> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyImage2> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyBufferToImage2> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyImageToBuffer2> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceBufferMemoryRequirements> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceImageMemoryRequirements> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceImageSparseMemoryRequirements> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetEvent2> {};\ntemplate<>\nstruct fex_gen_config<vkCmdResetEvent2> {};\ntemplate<>\nstruct fex_gen_config<vkCmdWaitEvents2> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBlitImage2> {};\ntemplate<>\nstruct fex_gen_config<vkCmdResolveImage2> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdBeginRendering> {};\ntemplate<>\nstruct fex_gen_config<vkCmdEndRendering> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetCullMode> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetFrontFace> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetPrimitiveTopology> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetViewportWithCount> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetScissorWithCount> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBindVertexBuffers2> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthTestEnable> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthWriteEnable> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthCompareOp> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthBoundsTestEnable> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetStencilTestEnable> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetStencilOp> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetRasterizerDiscardEnable> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthBiasEnable> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetPrimitiveRestartEnable> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkMapMemory2> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkUnmapMemory2> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkGetDeviceImageSubresourceLayout> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkGetImageSubresourceLayout2> {};\ntemplate<>\nstruct fex_gen_config<vkCopyMemoryToImage> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCopyImageToMemory> {};\ntemplate<>\nstruct fex_gen_config<vkCopyImageToImage> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkTransitionImageLayout> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdPushDescriptorSet> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdPushDescriptorSetWithTemplate> {};\ntemplate<>\nstruct fex_gen_param<vkCmdPushDescriptorSetWithTemplate, 4, const void*> : fexgen::assume_compatible_data_layout {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdBindDescriptorSets2> {};\ntemplate<>\nstruct fex_gen_config<vkCmdPushConstants2> {};\ntemplate<>\nstruct fex_gen_config<vkCmdPushDescriptorSet2> {};\ntemplate<>\nstruct fex_gen_config<vkCmdPushDescriptorSetWithTemplate2> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdSetLineStipple> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBindIndexBuffer2> {};\ntemplate<>\nstruct fex_gen_config<vkGetRenderingAreaGranularity> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdSetRenderingAttachmentLocations> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetRenderingInputAttachmentIndices> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkDestroySurfaceKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceSurfaceSupportKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceSurfaceCapabilitiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceSurfaceFormatsKHR> {}; // TODO: Need to figure out how *not* to repack the last parameter on input...\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceSurfacePresentModesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCreateSwapchainKHR> {};\ntemplate<>\nstruct fex_gen_config<vkDestroySwapchainKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetSwapchainImagesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkAcquireNextImageKHR> {};\ntemplate<>\nstruct fex_gen_config<vkQueuePresentKHR> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkGetDeviceGroupPresentCapabilitiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceGroupSurfacePresentModesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDevicePresentRectanglesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkAcquireNextImage2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceDisplayPropertiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceDisplayPlanePropertiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDisplayPlaneSupportedDisplaysKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDisplayModePropertiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCreateDisplayModeKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDisplayPlaneCapabilitiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCreateDisplayPlaneSurfaceKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCreateSharedSwapchainsKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceVideoCapabilitiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceVideoFormatPropertiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCreateVideoSessionKHR> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyVideoSessionKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetVideoSessionMemoryRequirementsKHR> {};\ntemplate<>\nstruct fex_gen_config<vkBindVideoSessionMemoryKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCreateVideoSessionParametersKHR> {};\ntemplate<>\nstruct fex_gen_config<vkUpdateVideoSessionParametersKHR> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyVideoSessionParametersKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBeginVideoCodingKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdEndVideoCodingKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdControlVideoCodingKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDecodeVideoKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBeginRenderingKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdEndRenderingKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceFeatures2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceProperties2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceFormatProperties2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceImageFormatProperties2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceQueueFamilyProperties2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceMemoryProperties2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceSparseImageFormatProperties2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceGroupPeerMemoryFeaturesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDeviceMaskKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDispatchBaseKHR> {};\ntemplate<>\nstruct fex_gen_config<vkTrimCommandPoolKHR> {};\ntemplate<>\nstruct fex_gen_config<vkEnumeratePhysicalDeviceGroupsKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceExternalBufferPropertiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetMemoryFdKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetMemoryFdPropertiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceExternalSemaphorePropertiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkImportSemaphoreFdKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetSemaphoreFdKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdPushDescriptorSetKHR> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdPushDescriptorSetWithTemplateKHR> {};\ntemplate<>\nstruct fex_gen_param<vkCmdPushDescriptorSetWithTemplateKHR, 4, const void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<vkCreateDescriptorUpdateTemplateKHR> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyDescriptorUpdateTemplateKHR> {};\ntemplate<>\nstruct fex_gen_config<vkUpdateDescriptorSetWithTemplateKHR> {};\ntemplate<>\nstruct fex_gen_param<vkUpdateDescriptorSetWithTemplateKHR, 3, const void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<vkCreateRenderPass2KHR> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdBeginRenderPass2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdNextSubpass2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdEndRenderPass2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetSwapchainStatusKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceExternalFencePropertiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkImportFenceFdKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetFenceFdKHR> {};\ntemplate<>\nstruct fex_gen_config<vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkAcquireProfilingLockKHR> {};\ntemplate<>\nstruct fex_gen_config<vkReleaseProfilingLockKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceSurfaceCapabilities2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceSurfaceFormats2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceDisplayProperties2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceDisplayPlaneProperties2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDisplayModeProperties2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDisplayPlaneCapabilities2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetImageMemoryRequirements2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetBufferMemoryRequirements2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetImageSparseMemoryRequirements2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCreateSamplerYcbcrConversionKHR> {};\ntemplate<>\nstruct fex_gen_config<vkDestroySamplerYcbcrConversionKHR> {};\ntemplate<>\nstruct fex_gen_config<vkBindBufferMemory2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkBindImageMemory2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDescriptorSetLayoutSupportKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawIndirectCountKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawIndexedIndirectCountKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetSemaphoreCounterValueKHR> {};\ntemplate<>\nstruct fex_gen_config<vkWaitSemaphoresKHR> {};\ntemplate<>\nstruct fex_gen_config<vkSignalSemaphoreKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceFragmentShadingRatesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetFragmentShadingRateKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetRenderingAttachmentLocationsKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetRenderingInputAttachmentIndicesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkWaitForPresentKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetBufferDeviceAddressKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetBufferOpaqueCaptureAddressKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceMemoryOpaqueCaptureAddressKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCreateDeferredOperationKHR> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyDeferredOperationKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeferredOperationMaxConcurrencyKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeferredOperationResultKHR> {};\ntemplate<>\nstruct fex_gen_config<vkDeferredOperationJoinKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPipelineExecutablePropertiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPipelineExecutableStatisticsKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPipelineExecutableInternalRepresentationsKHR> {};\ntemplate<>\nstruct fex_gen_config<vkMapMemory2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkUnmapMemory2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetEncodedVideoSessionParametersKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdEncodeVideoKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetEvent2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdResetEvent2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdWaitEvents2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdPipelineBarrier2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdWriteTimestamp2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkQueueSubmit2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyBuffer2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyImage2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyBufferToImage2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyImageToBuffer2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBlitImage2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdResolveImage2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdTraceRaysIndirect2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceBufferMemoryRequirementsKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceImageMemoryRequirementsKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceImageSparseMemoryRequirementsKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBindIndexBuffer2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetRenderingAreaGranularityKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceImageSubresourceLayoutKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetImageSubresourceLayout2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkWaitForPresent2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCreatePipelineBinariesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyPipelineBinaryKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPipelineKeyKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPipelineBinaryDataKHR> {};\ntemplate<>\nstruct fex_gen_config<vkReleaseCapturedPipelineDataKHR> {};\ntemplate<>\nstruct fex_gen_config<vkReleaseSwapchainImagesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetLineStippleKHR> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceCalibrateableTimeDomainsKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetCalibratedTimestampsKHR> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdBindDescriptorSets2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdPushConstants2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdPushDescriptorSet2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdPushDescriptorSetWithTemplate2KHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDescriptorBufferOffsets2EXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBindDescriptorBufferEmbeddedSamplers2EXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyMemoryIndirectKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyMemoryToImageIndirectKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdEndRendering2KHR> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCreateDebugReportCallbackEXT> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkCreateDebugReportCallbackEXT, 1, const VkDebugReportCallbackCreateInfoEXT*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<vkDestroyDebugReportCallbackEXT> : fexgen::custom_host_impl {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkDebugReportMessageEXT> {};\ntemplate<>\nstruct fex_gen_config<vkDebugMarkerSetObjectTagEXT> {};\ntemplate<>\nstruct fex_gen_config<vkDebugMarkerSetObjectNameEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDebugMarkerBeginEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDebugMarkerEndEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDebugMarkerInsertEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBindTransformFeedbackBuffersEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBeginTransformFeedbackEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdEndTransformFeedbackEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBeginQueryIndexedEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdEndQueryIndexedEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawIndirectByteCountEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCreateCuModuleNVX> {};\ntemplate<>\nstruct fex_gen_config<vkCreateCuFunctionNVX> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyCuModuleNVX> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyCuFunctionNVX> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCuLaunchKernelNVX> {};\ntemplate<>\nstruct fex_gen_config<vkGetImageViewHandleNVX> {};\ntemplate<>\nstruct fex_gen_config<vkGetImageViewHandle64NVX> {};\ntemplate<>\nstruct fex_gen_config<vkGetImageViewAddressNVX> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawIndirectCountAMD> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawIndexedIndirectCountAMD> {};\ntemplate<>\nstruct fex_gen_config<vkGetShaderInfoAMD> {};\ntemplate<>\nstruct fex_gen_param<vkGetShaderInfoAMD, 5, void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceExternalImageFormatPropertiesNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBeginConditionalRenderingEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdEndConditionalRenderingEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetViewportWScalingNV> {};\ntemplate<>\nstruct fex_gen_config<vkReleaseDisplayEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceSurfaceCapabilities2EXT> {};\ntemplate<>\nstruct fex_gen_config<vkDisplayPowerControlEXT> {};\ntemplate<>\nstruct fex_gen_config<vkRegisterDeviceEventEXT> {};\ntemplate<>\nstruct fex_gen_config<vkRegisterDisplayEventEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetSwapchainCounterEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetRefreshCycleDurationGOOGLE> {};\ntemplate<>\nstruct fex_gen_config<vkGetPastPresentationTimingGOOGLE> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDiscardRectangleEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDiscardRectangleEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDiscardRectangleModeEXT> {};\ntemplate<>\nstruct fex_gen_config<vkSetHdrMetadataEXT> {};\ntemplate<>\nstruct fex_gen_config<vkSetDebugUtilsObjectNameEXT> {};\ntemplate<>\nstruct fex_gen_config<vkSetDebugUtilsObjectTagEXT> {};\ntemplate<>\nstruct fex_gen_config<vkQueueBeginDebugUtilsLabelEXT> {};\ntemplate<>\nstruct fex_gen_config<vkQueueEndDebugUtilsLabelEXT> {};\ntemplate<>\nstruct fex_gen_config<vkQueueInsertDebugUtilsLabelEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBeginDebugUtilsLabelEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdEndDebugUtilsLabelEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdInsertDebugUtilsLabelEXT> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCreateDebugUtilsMessengerEXT> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkCreateDebugUtilsMessengerEXT, 1, const VkDebugUtilsMessengerCreateInfoEXT*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<vkDestroyDebugUtilsMessengerEXT> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkSubmitDebugUtilsMessageEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetSampleLocationsEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceMultisamplePropertiesEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetImageDrmFormatModifierPropertiesEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCreateValidationCacheEXT> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyValidationCacheEXT> {};\ntemplate<>\nstruct fex_gen_config<vkMergeValidationCachesEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetValidationCacheDataEXT> {};\ntemplate<>\nstruct fex_gen_param<vkGetValidationCacheDataEXT, 3, void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<vkCmdBindShadingRateImageNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetViewportShadingRatePaletteNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetCoarseSampleOrderNV> {};\ntemplate<>\nstruct fex_gen_config<vkCreateAccelerationStructureNV> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyAccelerationStructureNV> {};\ntemplate<>\nstruct fex_gen_config<vkGetAccelerationStructureMemoryRequirementsNV> {};\ntemplate<>\nstruct fex_gen_config<vkBindAccelerationStructureMemoryNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBuildAccelerationStructureNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyAccelerationStructureNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdTraceRaysNV> {};\ntemplate<>\nstruct fex_gen_config<vkCreateRayTracingPipelinesNV> {};\ntemplate<>\nstruct fex_gen_config<vkGetRayTracingShaderGroupHandlesKHR> {};\ntemplate<>\nstruct fex_gen_param<vkGetRayTracingShaderGroupHandlesKHR, 5, void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<vkGetRayTracingShaderGroupHandlesNV> {};\ntemplate<>\nstruct fex_gen_param<vkGetRayTracingShaderGroupHandlesNV, 5, void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<vkGetAccelerationStructureHandleNV> {};\ntemplate<>\nstruct fex_gen_param<vkGetAccelerationStructureHandleNV, 3, void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<vkCmdWriteAccelerationStructuresPropertiesNV> {};\ntemplate<>\nstruct fex_gen_config<vkCompileDeferredNV> {};\ntemplate<>\nstruct fex_gen_config<vkGetMemoryHostPointerPropertiesEXT> {};\ntemplate<>\nstruct fex_gen_param<vkGetMemoryHostPointerPropertiesEXT, 2, const void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<vkCmdWriteBufferMarkerAMD> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdWriteBufferMarker2AMD> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceCalibrateableTimeDomainsEXT> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkGetCalibratedTimestampsEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawMeshTasksNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawMeshTasksIndirectNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawMeshTasksIndirectCountNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetExclusiveScissorEnableNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetExclusiveScissorNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetCheckpointNV> {};\ntemplate<>\nstruct fex_gen_param<vkCmdSetCheckpointNV, 1, const void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<vkGetQueueCheckpointDataNV> {};\ntemplate<>\nstruct fex_gen_config<vkGetQueueCheckpointData2NV> {};\ntemplate<>\nstruct fex_gen_config<vkSetSwapchainPresentTimingQueueSizeEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetSwapchainTimingPropertiesEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetSwapchainTimeDomainPropertiesEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetPastPresentationTimingEXT> {};\ntemplate<>\nstruct fex_gen_config<vkInitializePerformanceApiINTEL> {};\ntemplate<>\nstruct fex_gen_config<vkUninitializePerformanceApiINTEL> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetPerformanceMarkerINTEL> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetPerformanceStreamMarkerINTEL> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetPerformanceOverrideINTEL> {};\ntemplate<>\nstruct fex_gen_config<vkAcquirePerformanceConfigurationINTEL> {};\ntemplate<>\nstruct fex_gen_config<vkReleasePerformanceConfigurationINTEL> {};\ntemplate<>\nstruct fex_gen_config<vkQueueSetPerformanceConfigurationINTEL> {};\ntemplate<>\nstruct fex_gen_config<vkGetPerformanceParameterINTEL> {};\ntemplate<>\nstruct fex_gen_config<vkSetLocalDimmingAMD> {};\ntemplate<>\nstruct fex_gen_config<vkGetBufferDeviceAddressEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceToolPropertiesEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceCooperativeMatrixPropertiesNV> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV> {};\ntemplate<>\nstruct fex_gen_config<vkCreateHeadlessSurfaceEXT> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdSetLineStippleEXT> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkResetQueryPoolEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetCullModeEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetFrontFaceEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetPrimitiveTopologyEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetViewportWithCountEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetScissorWithCountEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBindVertexBuffers2EXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthTestEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthWriteEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthCompareOpEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthBoundsTestEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetStencilTestEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetStencilOpEXT> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCopyMemoryToImageEXT> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCopyImageToMemoryEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCopyImageToImageEXT> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkTransitionImageLayoutEXT> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkGetImageSubresourceLayout2EXT> {};\ntemplate<>\nstruct fex_gen_config<vkReleaseSwapchainImagesEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetGeneratedCommandsMemoryRequirementsNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdPreprocessGeneratedCommandsNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdExecuteGeneratedCommandsNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBindPipelineShaderGroupNV> {};\ntemplate<>\nstruct fex_gen_config<vkCreateIndirectCommandsLayoutNV> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyIndirectCommandsLayoutNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthBias2EXT> {};\ntemplate<>\nstruct fex_gen_config<vkAcquireDrmDisplayEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetDrmDisplayEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCreatePrivateDataSlotEXT> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyPrivateDataSlotEXT> {};\ntemplate<>\nstruct fex_gen_config<vkSetPrivateDataEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetPrivateDataEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDispatchTileQCOM> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBeginPerTileExecutionQCOM> {};\ntemplate<>\nstruct fex_gen_config<vkCmdEndPerTileExecutionQCOM> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkGetDescriptorSetLayoutSizeEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetDescriptorSetLayoutBindingOffsetEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetDescriptorEXT> {};\ntemplate<>\nstruct fex_gen_param<vkGetDescriptorEXT, 3, void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<vkCmdBindDescriptorBuffersEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDescriptorBufferOffsetsEXT> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdBindDescriptorBufferEmbeddedSamplersEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetBufferOpaqueCaptureDescriptorDataEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetImageOpaqueCaptureDescriptorDataEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetImageViewOpaqueCaptureDescriptorDataEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetSamplerOpaqueCaptureDescriptorDataEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetFragmentShadingRateEnumNV> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceFaultInfoEXT> {};\n#endif\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdSetVertexInputEXT> {};\n#else\ntemplate<>\nstruct fex_gen_config<vkCmdSetVertexInputEXT> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkCmdSetVertexInputEXT, 2, const VkVertexInputBindingDescription2EXT*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_param<vkCmdSetVertexInputEXT, 4, const VkVertexInputAttributeDescription2EXT*> : fexgen::ptr_passthrough {};\n#endif\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSubpassShadingHUAWEI> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBindInvocationMaskHUAWEI> {};\n#ifndef IS_32BIT_THUNK\n// VkRemoteAddressNV* expands to void**, so it needs custom repacking on on 32-bit\ntemplate<>\nstruct fex_gen_config<vkGetMemoryRemoteAddressNV> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkGetPipelinePropertiesEXT> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdSetPatchControlPointsEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetRasterizerDiscardEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthBiasEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetLogicOpEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetPrimitiveRestartEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetColorWriteEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawMultiEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawMultiIndexedEXT> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCreateMicromapEXT> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyMicromapEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBuildMicromapsEXT> {};\ntemplate<>\nstruct fex_gen_config<vkBuildMicromapsEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCopyMicromapEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCopyMicromapToMemoryEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCopyMemoryToMicromapEXT> {};\ntemplate<>\nstruct fex_gen_config<vkWriteMicromapsPropertiesEXT> {};\ntemplate<>\nstruct fex_gen_param<vkWriteMicromapsPropertiesEXT, 5, void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyMicromapEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyMicromapToMemoryEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyMemoryToMicromapEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdWriteMicromapsPropertiesEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceMicromapCompatibilityEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetMicromapBuildSizesEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawClusterHUAWEI> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawClusterIndirectHUAWEI> {};\ntemplate<>\nstruct fex_gen_config<vkSetDeviceMemoryPriorityEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetDescriptorSetLayoutHostMappingInfoVALVE> {};\ntemplate<>\nstruct fex_gen_config<vkGetDescriptorSetHostMappingVALVE> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyMemoryIndirectNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyMemoryToImageIndirectNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDecompressMemoryNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDecompressMemoryIndirectCountNV> {};\ntemplate<>\nstruct fex_gen_config<vkGetPipelineIndirectMemoryRequirementsNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdUpdatePipelineIndirectBufferNV> {};\ntemplate<>\nstruct fex_gen_config<vkGetPipelineIndirectDeviceAddressNV> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthClampEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetPolygonModeEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetRasterizationSamplesEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetSampleMaskEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetAlphaToCoverageEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetAlphaToOneEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetLogicOpEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetColorBlendEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetColorBlendEquationEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetColorWriteMaskEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetTessellationDomainOriginEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetRasterizationStreamEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetConservativeRasterizationModeEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetExtraPrimitiveOverestimationSizeEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthClipEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetSampleLocationsEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetColorBlendAdvancedEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetProvokingVertexModeEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetLineRasterizationModeEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetLineStippleEnableEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthClipNegativeOneToOneEXT> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdSetViewportWScalingEnableNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetViewportSwizzleNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetCoverageToColorEnableNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetCoverageToColorLocationNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetCoverageModulationModeNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetCoverageModulationTableEnableNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetCoverageModulationTableNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetShadingRateImageEnableNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetRepresentativeFragmentTestEnableNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetCoverageReductionModeNV> {};\ntemplate<>\nstruct fex_gen_config<vkCreateTensorARM> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkDestroyTensorARM> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCreateTensorViewARM> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkDestroyTensorViewARM> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkGetTensorMemoryRequirementsARM> {};\ntemplate<>\nstruct fex_gen_config<vkBindTensorMemoryARM> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceTensorMemoryRequirementsARM> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyTensorARM> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceExternalTensorPropertiesARM> {};\ntemplate<>\nstruct fex_gen_config<vkGetTensorOpaqueCaptureDescriptorDataARM> {};\ntemplate<>\nstruct fex_gen_config<vkGetTensorViewOpaqueCaptureDescriptorDataARM> {};\ntemplate<>\nstruct fex_gen_config<vkGetShaderModuleIdentifierEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetShaderModuleCreateInfoIdentifierEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceOpticalFlowImageFormatsNV> {};\ntemplate<>\nstruct fex_gen_config<vkCreateOpticalFlowSessionNV> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyOpticalFlowSessionNV> {};\ntemplate<>\nstruct fex_gen_config<vkBindOpticalFlowSessionImageNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdOpticalFlowExecuteNV> {};\ntemplate<>\nstruct fex_gen_config<vkAntiLagUpdateAMD> {};\ntemplate<>\nstruct fex_gen_config<vkCreateShadersEXT> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyShaderEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetShaderBinaryDataEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBindShadersEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetDepthClampRangeEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetFramebufferTilePropertiesQCOM> {};\ntemplate<>\nstruct fex_gen_config<vkGetDynamicRenderingTilePropertiesQCOM> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceCooperativeVectorPropertiesNV> {};\ntemplate<>\nstruct fex_gen_config<vkConvertCooperativeVectorMatrixNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdConvertCooperativeVectorMatrixNV> {};\ntemplate<>\nstruct fex_gen_config<vkSetLatencySleepModeNV> {};\ntemplate<>\nstruct fex_gen_config<vkLatencySleepNV> {};\ntemplate<>\nstruct fex_gen_config<vkSetLatencyMarkerNV> {};\ntemplate<>\nstruct fex_gen_config<vkGetLatencyTimingsNV> {};\ntemplate<>\nstruct fex_gen_config<vkQueueNotifyOutOfBandNV> {};\ntemplate<>\nstruct fex_gen_config<vkCreateDataGraphPipelinesARM> {};\ntemplate<>\nstruct fex_gen_config<vkCreateDataGraphPipelineSessionARM> {};\ntemplate<>\nstruct fex_gen_config<vkGetDataGraphPipelineSessionBindPointRequirementsARM> {};\ntemplate<>\nstruct fex_gen_config<vkGetDataGraphPipelineSessionMemoryRequirementsARM> {};\ntemplate<>\nstruct fex_gen_config<vkBindDataGraphPipelineSessionMemoryARM> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkDestroyDataGraphPipelineSessionARM> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdDispatchDataGraphARM> {};\ntemplate<>\nstruct fex_gen_config<vkGetDataGraphPipelineAvailablePropertiesARM> {};\ntemplate<>\nstruct fex_gen_config<vkGetDataGraphPipelinePropertiesARM> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceQueueFamilyDataGraphPropertiesARM> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceQueueFamilyDataGraphProcessingEnginePropertiesARM> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdSetAttachmentFeedbackLoopEnableEXT> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCmdBindTileMemoryQCOM> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDecompressMemoryEXT> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkCmdDecompressMemoryIndirectCountEXT> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkCreateExternalComputeQueueNV> {};\n#endif\ntemplate<>\nstruct fex_gen_config<vkDestroyExternalComputeQueueNV> {};\n#ifndef IS_32BIT_THUNK\ntemplate<>\nstruct fex_gen_config<vkGetExternalComputeQueueDataNV> {};\ntemplate<>\nstruct fex_gen_config<vkGetClusterAccelerationStructureBuildSizesNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBuildClusterAccelerationStructureIndirectNV> {};\ntemplate<>\nstruct fex_gen_config<vkGetPartitionedAccelerationStructuresBuildSizesNV> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBuildPartitionedAccelerationStructuresNV> {};\ntemplate<>\nstruct fex_gen_config<vkGetGeneratedCommandsMemoryRequirementsEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdPreprocessGeneratedCommandsEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdExecuteGeneratedCommandsEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCreateIndirectCommandsLayoutEXT> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyIndirectCommandsLayoutEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCreateIndirectExecutionSetEXT> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyIndirectExecutionSetEXT> {};\ntemplate<>\nstruct fex_gen_config<vkUpdateIndirectExecutionSetPipelineEXT> {};\ntemplate<>\nstruct fex_gen_config<vkUpdateIndirectExecutionSetShaderEXT> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV> {};\ntemplate<>\nstruct fex_gen_config<vkEnumeratePhysicalDeviceQueueFamilyPerformanceCountersByRegionARM> {};\ntemplate<>\nstruct fex_gen_config<vkCmdEndRendering2EXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBeginCustomResolveEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetComputeOccupancyPriorityNV> {};\ntemplate<>\nstruct fex_gen_config<vkCreateAccelerationStructureKHR> {};\ntemplate<>\nstruct fex_gen_config<vkDestroyAccelerationStructureKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBuildAccelerationStructuresKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdBuildAccelerationStructuresIndirectKHR> {};\ntemplate<>\nstruct fex_gen_config<vkBuildAccelerationStructuresKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCopyAccelerationStructureKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCopyAccelerationStructureToMemoryKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCopyMemoryToAccelerationStructureKHR> {};\ntemplate<>\nstruct fex_gen_config<vkWriteAccelerationStructuresPropertiesKHR> {};\ntemplate<>\nstruct fex_gen_param<vkWriteAccelerationStructuresPropertiesKHR, 5, void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyAccelerationStructureKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyAccelerationStructureToMemoryKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdCopyMemoryToAccelerationStructureKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetAccelerationStructureDeviceAddressKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdWriteAccelerationStructuresPropertiesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetDeviceAccelerationStructureCompatibilityKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetAccelerationStructureBuildSizesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdTraceRaysKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCreateRayTracingPipelinesKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetRayTracingCaptureReplayShaderGroupHandlesKHR> {};\ntemplate<>\nstruct fex_gen_param<vkGetRayTracingCaptureReplayShaderGroupHandlesKHR, 5, void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<vkCmdTraceRaysIndirectKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetRayTracingShaderGroupStackSizeKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdSetRayTracingPipelineStackSizeKHR> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawMeshTasksEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawMeshTasksIndirectEXT> {};\ntemplate<>\nstruct fex_gen_config<vkCmdDrawMeshTasksIndirectCountEXT> {};\n#endif\n\n// vulkan_xlib_xrandr.h\ntemplate<>\nstruct fex_gen_config<vkAcquireXlibDisplayEXT> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkAcquireXlibDisplayEXT, 1, Display*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<vkGetRandROutputDisplayEXT> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkGetRandROutputDisplayEXT, 1, Display*> : fexgen::ptr_passthrough {};\n\n// vulkan_wayland.h\ntemplate<>\nstruct fex_gen_config<vkCreateWaylandSurfaceKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceWaylandPresentationSupportKHR> {};\n\n// vulkan_xcb.h\ntemplate<>\nstruct fex_gen_config<vkCreateXcbSurfaceKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceXcbPresentationSupportKHR> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkGetPhysicalDeviceXcbPresentationSupportKHR, 2, xcb_connection_t*> : fexgen::ptr_passthrough {};\n\n// vulkan_xlib.h\ntemplate<>\nstruct fex_gen_config<vkCreateXlibSurfaceKHR> {};\ntemplate<>\nstruct fex_gen_config<vkGetPhysicalDeviceXlibPresentationSupportKHR> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<vkGetPhysicalDeviceXlibPresentationSupportKHR, 2, Display*> : fexgen::ptr_passthrough {};\n\n} // namespace internal\n"
  },
  {
    "path": "ThunkLibs/libwayland-client/Guest.cpp",
    "content": "/*\n$info$\ntags: thunklibs|wayland-client\n$end_info$\n*/\n\n#include <wayland-util.h>\n#include <wayland-client.h>\n\n// These must be re-declared with an initializer here, since they don't get exported otherwise\n// NOTE: The initializers for these must be fetched from the host Wayland library, however\n//       we can't control how these symbols are loaded since they are global const objects.\n//       LD puts them in the application rodata section and ignores any nontrivial library-provided\n//       initializers. There is a workaround to enable late initialization anyway in OnInit.\n// NOTE: We only need to do this for interfaces exported by libwayland-client itself. Interfaces\n//       defined by external libraries work fine.\nextern \"C\" const wl_interface wl_output_interface {};\nextern \"C\" const wl_interface wl_shm_pool_interface {};\nextern \"C\" const wl_interface wl_pointer_interface {};\nextern \"C\" const wl_interface wl_compositor_interface {};\nextern \"C\" const wl_interface wl_shm_interface {};\nextern \"C\" const wl_interface wl_registry_interface {};\nextern \"C\" const wl_interface wl_buffer_interface {};\nextern \"C\" const wl_interface wl_seat_interface {};\nextern \"C\" const wl_interface wl_surface_interface {};\nextern \"C\" const wl_interface wl_keyboard_interface {};\nextern \"C\" const wl_interface wl_callback_interface {};\nextern \"C\" const wl_interface wl_display_interface {};\nextern \"C\" const wl_interface wl_data_offer_interface {};\nextern \"C\" const wl_interface wl_data_source_interface {};\nextern \"C\" const wl_interface wl_data_device_interface {};\nextern \"C\" const wl_interface wl_data_device_manager_interface {};\nextern \"C\" const wl_interface wl_shell_interface {};\nextern \"C\" const wl_interface wl_shell_surface_interface {};\nextern \"C\" const wl_interface wl_touch_interface {};\nextern \"C\" const wl_interface wl_region_interface {};\nextern \"C\" const wl_interface wl_subcompositor_interface {};\nextern \"C\" const wl_interface wl_subsurface_interface {};\n\n#include <algorithm>\n#include <array>\n#include <charconv>\n#include <cstdio>\n#include <cstdarg>\n#include <cstring>\n#include <string>\n\n#include \"common/Guest.h\"\n\n#include \"thunkgen_guest_libwayland-client.inl\"\n\n// See wayland-util.h for documentation on protocol message signatures\ntemplate<char>\nstruct ArgType;\ntemplate<>\nstruct ArgType<'s'> {\n  using type = const char*;\n};\ntemplate<>\nstruct ArgType<'u'> {\n  using type = uint32_t;\n};\ntemplate<>\nstruct ArgType<'i'> {\n  using type = int32_t;\n};\ntemplate<>\nstruct ArgType<'o'> {\n  using type = wl_proxy*;\n};\ntemplate<>\nstruct ArgType<'n'> {\n  using type = wl_proxy*;\n};\ntemplate<>\nstruct ArgType<'a'> {\n  using type = wl_array*;\n};\ntemplate<>\nstruct ArgType<'f'> {\n  using type = wl_fixed_t;\n};\ntemplate<>\nstruct ArgType<'h'> {\n  using type = int32_t;\n}; // fd?\n\ntemplate<char... Signature>\nstatic uint64_t WaylandAllocateHostTrampolineForGuestListener(void (*callback)()) {\n  using cb = void(void*, wl_proxy*, typename ArgType<Signature>::type...);\n  return (uint64_t)(uintptr_t)(void*)AllocateHostTrampolineForGuestFunction((cb*)callback);\n}\n\n#define WL_CLOSURE_MAX_ARGS 20\n\nextern \"C\" int wl_proxy_add_listener(wl_proxy* proxy, void (**callback)(void), void* data) {\n  // Replace guest-provided callback table with host-callable function pointers\n  // NOTE: A reference to this table is stored in the wl_proxy, so the data\n  //       must remain valid until the proxy is destroyed (or another listener\n  //       is added)\n  delete[] (uint64_t*)wl_proxy_get_listener(proxy); // Delete previous substitute, if any\n  auto host_callbacks = new uint64_t[WL_CLOSURE_MAX_ARGS];\n\n  for (int i = 0; i < fex_wl_get_interface_event_count(proxy); ++i) {\n    char event_signature[16];\n    fex_wl_get_interface_event_signature(proxy, i, event_signature);\n    auto signature2 = std::string_view {event_signature};\n\n    // A leading number indicates the minimum protocol version\n    uint32_t since_version = 0;\n    auto [ptr, res] = std::from_chars(signature2.begin(), signature2.end(), since_version, 10);\n    auto signature = std::string {signature2.substr(ptr - signature2.begin())};\n\n    // ? just indicates that the argument may be null, so it doesn't change the signature\n    signature.erase(std::remove(signature.begin(), signature.end(), '?'), signature.end());\n\n    if (signature == \"\") {\n      // E.g. xdg_toplevel::close\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<>(callback[i]);\n    } else if (signature == \"a\") {\n      // E.g. xdg_toplevel::wm_capabilities\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'a'>(callback[i]);\n    } else if (signature == \"f\") {\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'f'>(callback[i]);\n    } else if (signature == \"hu\") {\n      // E.g. zwp_linux_dmabuf_feedback_v1::format_table\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'h', 'u'>(callback[i]);\n    } else if (signature == \"i\") {\n      // E.g. wl_output_listener::scale\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'i'>(callback[i]);\n    } else if (signature == \"if\") {\n      // E.g. wl_touch_listener::orientation\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'i', 'f'>(callback[i]);\n    } else if (signature == \"iff\") {\n      // E.g. wl_touch_listener::shape\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'i', 'f', 'f'>(callback[i]);\n    } else if (signature == \"ii\") {\n      // E.g. xdg_toplevel::configure_bounds\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'i', 'i'>(callback[i]);\n    } else if (signature == \"iu\") {\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'i', 'u'>(callback[i]);\n    } else if (signature == \"iia\") {\n      // E.g. xdg_toplevel::configure\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'i', 'i', 'a'>(callback[i]);\n    } else if (signature == \"iiii\") {\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'i', 'i', 'i', 'i'>(callback[i]);\n    } else if (signature == \"iiiiissi\") {\n      // E.g. wl_output_listener::geometry\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'i', 'i', 'i', 'i', 'i', 's', 's', 'i'>(callback[i]);\n    } else if (signature == \"n\") {\n      // E.g. wl_data_device_listener::data_offer\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'n'>(callback[i]);\n    } else if (signature == \"o\") {\n      // E.g. wl_data_device_listener::selection\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'o'>(callback[i]);\n    } else if (signature == \"u\") {\n      // E.g. wl_registry::global_remove\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u'>(callback[i]);\n    } else if (signature == \"uff\") {\n      // E.g. wl_pointer_listener::motion\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'f', 'f'>(callback[i]);\n    } else if (signature == \"uffff\") {\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'f', 'f', 'f', 'f'>(callback[i]);\n    } else if (signature == \"uhu\") {\n      // E.g. wl_keyboard_listener::keymap\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'h', 'u'>(callback[i]);\n    } else if (signature == \"ui\") {\n      // E.g. wl_pointer_listener::axis_discrete\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'i'>(callback[i]);\n    } else if (signature == \"uiff\") {\n      // E.g. wl_touch_listener::motion\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'i', 'f', 'f'>(callback[i]);\n    } else if (signature == \"uiii\") {\n      // E.g. wl_output_listener::mode\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'i', 'i', 'i'>(callback[i]);\n    } else if (signature == \"uiiii\") {\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'i', 'i', 'i', 'i'>(callback[i]);\n    } else if (signature == \"uo\") {\n      // E.g. wl_pointer_listener::leave\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'o'>(callback[i]);\n    } else if (signature == \"uoa\") {\n      // E.g. wl_keyboard_listener::enter\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'o', 'a'>(callback[i]);\n    } else if (signature == \"uoff\") {\n      // E.g. wl_pointer_listener::enter\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'o', 'f', 'f'>(callback[i]);\n    } else if (signature == \"uoffo\") {\n      // E.g. wl_data_device_listener::enter\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'o', 'f', 'f', 'o'>(callback[i]);\n    } else if (signature == \"uoo\") {\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'o', 'o'>(callback[i]);\n    } else if (signature == \"us\") {\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 's'>(callback[i]);\n    } else if (signature == \"uss\") {\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 's', 's'>(callback[i]);\n    } else if (signature == \"usu\") {\n      // E.g. wl_registry::global\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 's', 'u'>(callback[i]);\n    } else if (signature == \"uu\") {\n      // E.g. wl_pointer_listener::axis_stop\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'u'>(callback[i]);\n    } else if (signature == \"uuf\") {\n      // E.g. wl_pointer_listener::axis\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'u', 'f'>(callback[i]);\n    } else if (signature == \"uui\") {\n      // E.g. wl_touch_listener::up\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'u', 'i'>(callback[i]);\n    } else if (signature == \"uuoiff\") {\n      // E.g. wl_touch_listener::down\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'u', 'o', 'i', 'f', 'f'>(callback[i]);\n    } else if (signature == \"uuou\") {\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'u', 'o', 'u'>(callback[i]);\n    } else if (signature == \"uuu\") {\n      // E.g. zwp_linux_dmabuf_v1::modifier\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'u', 'u'>(callback[i]);\n    } else if (signature == \"uuuu\") {\n      // E.g. wl_pointer_listener::button\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'u', 'u', 'u'>(callback[i]);\n    } else if (signature == \"uuuuu\") {\n      // E.g. wl_keyboard_listener::modifiers\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'u', 'u', 'u', 'u', 'u'>(callback[i]);\n    } else if (signature == \"s\") {\n      // E.g. wl_seat::name\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'s'>(callback[i]);\n    } else if (signature == \"ss\") {\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'s', 's'>(callback[i]);\n    } else if (signature == \"sii\") {\n      // E.g. zwp_text_input_v3::preedit_string\n      host_callbacks[i] = WaylandAllocateHostTrampolineForGuestListener<'s', 'i', 'i'>(callback[i]);\n    } else {\n      fprintf(stderr, \"TODO: Unknown wayland event signature descriptor %s\\n\", signature.data());\n      std::abort();\n    }\n  }\n\n  return fexfn_pack_wl_proxy_add_listener(proxy, (void (**)())host_callbacks, data);\n}\n\nextern \"C\" void wl_proxy_destroy(wl_proxy* proxy) {\n  // Delete substitute callback table (if any), then the proxy itself\n  delete[] (uint64_t*)wl_proxy_get_listener(proxy);\n  fexfn_pack_wl_proxy_destroy(proxy);\n}\n\n// Adapted from the Wayland sources\nstatic const char* get_next_argument_type(const char* signature, char& type) {\n  for (; *signature; ++signature) {\n    switch (*signature) {\n    case 'i':\n    case 'u':\n    case 'f':\n    case 's':\n    case 'o':\n    case 'n':\n    case 'a':\n    case 'h': type = *signature; return signature + 1;\n\n    default: continue;\n    }\n  }\n  type = 0;\n  return signature;\n}\n\nstatic void wl_argument_from_va_list(const char* signature, wl_argument* args, int count, va_list ap) {\n\n  auto sig_iter = signature;\n  for (int i = 0; i < count; i++) {\n    char arg_type;\n    sig_iter = get_next_argument_type(sig_iter, arg_type);\n\n    switch (arg_type) {\n    case 'i': args[i].i = va_arg(ap, int32_t); break;\n    case 'u': args[i].u = va_arg(ap, uint32_t); break;\n    case 'f': args[i].f = va_arg(ap, wl_fixed_t); break;\n    case 's': args[i].s = va_arg(ap, const char*); break;\n    case 'o': args[i].o = va_arg(ap, struct wl_object*); break;\n    case 'n': args[i].o = va_arg(ap, struct wl_object*); break;\n    case 'a': args[i].a = va_arg(ap, struct wl_array*); break;\n    case 'h': args[i].h = va_arg(ap, int32_t); break;\n    case '\\0': return;\n    }\n  }\n}\n\nextern \"C\" void wl_proxy_marshal(wl_proxy* proxy, uint32_t opcode, ...) {\n  wl_argument args[WL_CLOSURE_MAX_ARGS];\n  va_list ap;\n\n  va_start(ap, opcode);\n  // This is equivalent to reading proxy->interface->methods[opcode].signature on 64-bit.\n  // On 32-bit, the data layout differs between host and guest however, so we let the host extract the data.\n  char signature[64];\n  fex_wl_get_method_signature(proxy, opcode, signature);\n  wl_argument_from_va_list(signature, args, WL_CLOSURE_MAX_ARGS, ap);\n  va_end(ap);\n\n  wl_proxy_marshal_array(proxy, opcode, args);\n}\n\nextern \"C\" wl_proxy* wl_proxy_marshal_constructor(wl_proxy* proxy, uint32_t opcode, const wl_interface* interface, ...) {\n  wl_argument args[WL_CLOSURE_MAX_ARGS];\n  va_list ap;\n\n  va_start(ap, interface);\n  // This is equivalent to reading ((wl_proxy_private*)proxy)->interface->methods[opcode].signature on 64-bit.\n  // On 32-bit, the data layout differs between host and guest however, so we let the host extract the data.\n  char signature[64];\n  fex_wl_get_method_signature(proxy, opcode, signature);\n  wl_argument_from_va_list(signature, args, WL_CLOSURE_MAX_ARGS, ap);\n  va_end(ap);\n\n  return wl_proxy_marshal_array_constructor(proxy, opcode, args, interface);\n}\n\nextern \"C\" wl_proxy* wl_proxy_marshal_constructor_versioned(wl_proxy* proxy, uint32_t opcode, const wl_interface* interface, uint32_t version, ...) {\n  wl_argument args[WL_CLOSURE_MAX_ARGS];\n  va_list ap;\n\n  va_start(ap, version);\n  // This is equivalent to reading ((wl_proxy_private*)proxy)->interface->methods[opcode].signature on 64-bit.\n  // On 32-bit, the data layout differs between host and guest however, so we let the host extract the data.\n  char signature[64];\n  fex_wl_get_method_signature(proxy, opcode, signature);\n  wl_argument_from_va_list(signature, args, WL_CLOSURE_MAX_ARGS, ap);\n  va_end(ap);\n\n  return wl_proxy_marshal_array_constructor_versioned(proxy, opcode, args, interface, version);\n}\n\nextern \"C\" wl_proxy* wl_proxy_marshal_flags(wl_proxy* proxy, uint32_t opcode, const wl_interface* interface, uint32_t version, uint32_t flags, ...) {\n  wl_argument args[WL_CLOSURE_MAX_ARGS];\n  va_list ap;\n\n  va_start(ap, flags);\n  // This is equivalent to reading proxy->interface->methods[opcode].signature on 64-bit.\n  // On 32-bit, the data layout differs between host and guest however, so we let the host extract the data.\n  char signature[64];\n  fex_wl_get_method_signature(proxy, opcode, signature);\n  wl_argument_from_va_list(signature, args, WL_CLOSURE_MAX_ARGS, ap);\n  va_end(ap);\n\n  // wl_proxy_marshal_array_flags is only available starting from Wayland 1.19.91\n#if WAYLAND_VERSION_MAJOR * 10000 + WAYLAND_VERSION_MINOR * 100 + WAYLAND_VERSION_MICRO >= 11991\n  return wl_proxy_marshal_array_flags(proxy, opcode, interface, version, flags, args);\n#else\n  fprintf(stderr, \"Host Wayland version is too old to support FEX thunking\\n\");\n  __builtin_trap();\n#endif\n}\n\nextern \"C\" void wl_log_set_handler_client(wl_log_func_t handler) {\n  // Ignore\n}\n\n\nvoid OnInit() {\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_output_interface), \"wl_output_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_shm_pool_interface), \"wl_shm_pool_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_pointer_interface), \"wl_pointer_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_compositor_interface), \"wl_compositor_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_shm_interface), \"wl_shm_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_registry_interface), \"wl_registry_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_buffer_interface), \"wl_buffer_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_seat_interface), \"wl_seat_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_surface_interface), \"wl_surface_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_keyboard_interface), \"wl_keyboard_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_callback_interface), \"wl_callback_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_display_interface), \"wl_display_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_data_offer_interface), \"wl_data_offer_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_data_source_interface), \"wl_data_source_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_data_device_interface), \"wl_data_device_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_data_device_manager_interface), \"wl_data_device_manager_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_shell_interface), \"wl_shell_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_shell_surface_interface), \"wl_shell_surface_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_touch_interface), \"wl_touch_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_region_interface), \"wl_region_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_subcompositor_interface), \"wl_subcompositor_interface\");\n  fex_wl_exchange_interface_pointer(const_cast<wl_interface*>(&wl_subsurface_interface), \"wl_subsurface_interface\");\n}\n\n// Would insert spaces around -\n// clang-format off\nLOAD_LIB_INIT(libwayland-client, OnInit)\n"
  },
  {
    "path": "ThunkLibs/libwayland-client/Host.cpp",
    "content": "/*\n$info$\ntags: thunklibs|wayland-client\n$end_info$\n*/\n\n#include <string_view>\n#include <unordered_map>\n#include <wayland-client.h>\n\n#include <stdio.h>\n\n#include \"common/Host.h\"\n#include <dlfcn.h>\n\n#include <sys/mman.h>\n\n#include <algorithm>\n#include <array>\n#include <charconv>\n#include <cstring>\n#include <map>\n#include <span>\n#include <string>\n\n#include <ranges>\n\ntemplate<>\nstruct guest_layout<wl_argument> {\n#ifdef IS_32BIT_THUNK\n  using type = uint32_t;\n#else\n  using type = wl_argument;\n#endif\n  type data;\n\n  guest_layout& operator=(const wl_argument from) {\n#ifdef IS_32BIT_THUNK\n    data = from.u;\n#else\n    data = from;\n#endif\n    return *this;\n  }\n};\n\n#include \"thunkgen_host_libwayland-client.inl\"\n\n// Maps guest interface to host_interfaces\nstatic std::unordered_map<guest_layout<const wl_interface>*, wl_interface*> guest_to_host_interface;\n\nstatic wl_interface* get_proxy_interface(wl_proxy* proxy) {\n  // wl_proxy is a private struct, but its first member is the wl_interface pointer\n  return *reinterpret_cast<wl_interface**>(proxy);\n}\n\nstatic void assert_is_valid_host_interface(const wl_interface* interface) {\n  // The 32-bit data layout of wl_interface differs from the 64-bit one due to\n  // its pointer members. Our repacking code takes care of these differences.\n  //\n  // To ensure this indeed functions properly, a simple consistency check is\n  // applied here: If any of the message counts are absurdly high, it means\n  // data from pointer members leaked into other members.\n\n  if ((uint32_t)interface->method_count >= 0x1000 || (uint32_t)interface->event_count >= 0x1000) {\n    fprintf(stderr, \"ERROR: Expected %p to be a host wl_interface, but it's not\\n\", interface);\n    std::abort();\n  }\n}\n\n#ifdef IS_32BIT_THUNK\nstatic void assert_is_valid_guest_interface(guest_layout<const wl_interface*> guest_interface) {\n  // Consistency check for expected data layout.\n  // See assert_is_valid_host_interface for details\n\n  const wl_interface* as_host_interface = (const wl_interface*)guest_interface.force_get_host_pointer();\n  if ((uint32_t)as_host_interface->method_count < 0x1000 && (uint32_t)as_host_interface->event_count < 0x1000) {\n    fprintf(stderr, \"ERROR: Expected %p to be a guest wl_interface, but it's not\\n\", guest_interface.force_get_host_pointer());\n    std::abort();\n  }\n}\n\nstatic void repack_guest_wl_interface_to_host(guest_layout<const wl_interface*> guest_interface_ptr, wl_interface* host_interface) {\n  auto& guest_interface = *guest_interface_ptr.get_pointer();\n  static_assert(sizeof(guest_interface) == 24);\n\n  *host_interface = host_layout<wl_interface> {guest_interface}.data;\n  fex_apply_custom_repacking_entry(reinterpret_cast<host_layout<wl_interface>&>(*host_interface), guest_interface);\n}\n\n// Maps guest interface pointers to host pointers\nstatic const wl_interface* lookup_wl_interface(guest_layout<const wl_interface*> interface) {\n  // Used e.g. for wl_shm_pool_destroy\n  if (interface.force_get_host_pointer() == nullptr) {\n    return nullptr;\n  }\n\n  auto [host_interface_it, inserted] = guest_to_host_interface.emplace(interface.get_pointer(), nullptr);\n  if (!inserted) {\n    assert_is_valid_host_interface(host_interface_it->second);\n    return host_interface_it->second;\n  }\n\n  assert_is_valid_guest_interface(interface);\n\n  fprintf(stderr, \"Unknown wayland interface %p, adding to registry\\n\", interface.get_pointer());\n\n  host_interface_it->second = new wl_interface;\n  wl_interface* host_interface = host_interface_it->second;\n  repack_guest_wl_interface_to_host(interface, host_interface);\n  return host_interface_it->second;\n}\n\nvoid fex_custom_repack_entry(host_layout<wl_interface>& into, const guest_layout<wl_interface>& from) {\n  // NOTE: These arrays are complements to global symbols in the guest, so we\n  //       never explicitly free this memory\n  auto& host_interface = into.data;\n  into.data.methods = new wl_message[into.data.method_count];\n  into.data.events = new wl_message[into.data.event_count];\n\n  memset((void*)host_interface.methods, 0, sizeof(wl_message) * host_interface.method_count);\n  for (int i = 0; i < host_interface.method_count; ++i) {\n    const auto& guest_method {from.data.methods.get_pointer()[i]};\n    host_layout<wl_message> host_method {guest_method};\n    fex_apply_custom_repacking_entry(host_method, guest_method);\n    memcpy((void*)&host_interface.methods[i], &host_method, sizeof(host_method));\n  }\n\n  memset((void*)host_interface.events, 0, sizeof(wl_message) * host_interface.event_count);\n  for (int i = 0; i < host_interface.event_count; ++i) {\n    const auto& guest_event {from.data.events.get_pointer()[i]};\n    host_layout<wl_message> host_event {guest_event};\n    fex_apply_custom_repacking_entry(host_event, guest_event);\n    memcpy((void*)&host_interface.events[i], &host_event, sizeof(host_event));\n  }\n}\n\nbool fex_custom_repack_exit(guest_layout<wl_interface>&, const host_layout<wl_interface>&) {\n  fprintf(stderr, \"Should not be called: %s\\n\", __PRETTY_FUNCTION__);\n  std::abort();\n}\nvoid fex_custom_repack_entry(host_layout<wl_message>& into, const guest_layout<wl_message>& from) {\n  auto& host_method = into.data;\n  auto num_types = std::ranges::count_if(std::string_view {host_method.signature}, isalpha);\n  if (num_types) {\n    host_method.types = new const wl_interface*[num_types];\n    for (int type = 0; type < num_types; ++type) {\n      auto guest_interface_addr = from.data.types.get_pointer()[type];\n      host_method.types[type] = guest_interface_addr.force_get_host_pointer() ? lookup_wl_interface(guest_interface_addr) : nullptr;\n    }\n  }\n}\nbool fex_custom_repack_exit(guest_layout<wl_message>&, const host_layout<wl_message>&) {\n  fprintf(stderr, \"Should not be called: %s\\n\", __PRETTY_FUNCTION__);\n  std::abort();\n}\n#else\nconst wl_interface* lookup_wl_interface(guest_layout<const wl_interface*> interface) {\n  return interface.force_get_host_pointer();\n}\n#endif\n\nstatic wl_proxy* fexfn_impl_libwayland_client_wl_proxy_create(wl_proxy* proxy, guest_layout<const wl_interface*> guest_interface_raw) {\n  auto host_interface = lookup_wl_interface(guest_interface_raw);\n  return fexldr_ptr_libwayland_client_wl_proxy_create(proxy, host_interface);\n}\n\n#define WL_CLOSURE_MAX_ARGS 20\nstatic auto fex_wl_remap_argument_list(guest_layout<wl_argument*> args, const wl_message& message) {\n#ifndef IS_32BIT_THUNK\n  // Cast to host layout and return as std::span\n  wl_argument* host_args = host_layout<wl_argument*> {args}.data;\n  return std::span<wl_argument, WL_CLOSURE_MAX_ARGS> {host_args, WL_CLOSURE_MAX_ARGS};\n#else\n  // Return a new array of elements zero-extended to 64-bit\n  std::array<wl_argument, WL_CLOSURE_MAX_ARGS> host_args;\n  int arg_count = std::ranges::count_if(std::string_view {message.signature}, isalpha);\n  for (int i = 0; i < arg_count; ++i) {\n    // NOTE: wl_argument can store a pointer argument, so for 32-bit guests\n    //       we need to make sure the upper 32-bits are explicitly zeroed\n    std::memset(&host_args[i], 0, sizeof(host_args[i]));\n    std::memcpy(&host_args[i], &args.get_pointer()[i], sizeof(args.get_pointer()[i]));\n  }\n  return host_args;\n#endif\n}\n\nextern \"C\" void fexfn_impl_libwayland_client_wl_proxy_marshal_array(wl_proxy* proxy, uint32_t opcode, guest_layout<wl_argument*> args) {\n  auto host_args = fex_wl_remap_argument_list(args, get_proxy_interface(proxy)->methods[opcode]);\n  fexldr_ptr_libwayland_client_wl_proxy_marshal_array(proxy, opcode, host_args.data());\n}\n\nstatic wl_proxy* fex_wl_proxy_marshal_array(wl_proxy* proxy, uint32_t opcode, guest_layout<wl_argument*> args,\n                                            guest_layout<const wl_interface*> guest_interface,\n                                            bool constructor, // Call the _constructor variant of the native wayland function\n                                            std::optional<uint32_t> version, std::optional<uint32_t> flags) {\n  auto interface = lookup_wl_interface(guest_interface);\n\n  assert_is_valid_host_interface(get_proxy_interface(proxy));\n\n  auto host_args = fex_wl_remap_argument_list(args, get_proxy_interface(proxy)->methods[opcode]);\n\n  if (false) {\n  } else if (!constructor && !version && !flags) {\n    return nullptr;\n  } else if (!constructor && version && flags) {\n    // wl_proxy_marshal_array_flags is only available starting from Wayland 1.19.91\n#if WAYLAND_VERSION_MAJOR * 10000 + WAYLAND_VERSION_MINOR * 100 + WAYLAND_VERSION_MICRO >= 11991\n    return fexldr_ptr_libwayland_client_wl_proxy_marshal_array_flags(proxy, opcode, interface, version.value(), flags.value(), host_args.data());\n#else\n    fprintf(stderr, \"Host Wayland version is too old to support FEX thunking\\n\");\n    __builtin_trap();\n#endif\n  } else if (constructor && version && !flags) {\n    return fexldr_ptr_libwayland_client_wl_proxy_marshal_array_constructor_versioned(proxy, opcode, host_args.data(), interface, version.value());\n  } else if (constructor && !version && !flags) {\n    return fexldr_ptr_libwayland_client_wl_proxy_marshal_array_constructor(proxy, opcode, host_args.data(), interface);\n  } else {\n    fprintf(stderr, \"Invalid configuration\\n\");\n    __builtin_trap();\n  }\n}\n\nextern \"C\" wl_proxy* fexfn_impl_libwayland_client_wl_proxy_marshal_array_constructor_versioned(\n  wl_proxy* proxy, uint32_t opcode, guest_layout<wl_argument*> args, guest_layout<const wl_interface*> interface, uint32_t version) {\n  return fex_wl_proxy_marshal_array(proxy, opcode, args, interface, true, version, std::nullopt);\n}\n\nextern \"C\" wl_proxy* fexfn_impl_libwayland_client_wl_proxy_marshal_array_constructor(\n  wl_proxy* proxy, uint32_t opcode, guest_layout<wl_argument*> args, guest_layout<const wl_interface*> interface) {\n  return fex_wl_proxy_marshal_array(proxy, opcode, args, interface, true, std::nullopt, std::nullopt);\n}\n\nextern \"C\" wl_proxy* fexfn_impl_libwayland_client_wl_proxy_marshal_array_flags(wl_proxy* proxy, uint32_t opcode,\n                                                                               guest_layout<const wl_interface*> interface, uint32_t version,\n                                                                               uint32_t flags, guest_layout<wl_argument*> args) {\n  return fex_wl_proxy_marshal_array(proxy, opcode, args, interface, false, version, flags);\n}\n\n// Variant of CallbackUnpack::CallGuestPtr that relocates a wl_array parameter\n// for 32-bit guests. Relocating this parameter is required since it may\n// reference inaccessible memory regions (presumably due to pointing to data\n// on the host stack).\n#ifndef IS_32BIT_THUNK\ntemplate<typename Result, typename... Args>\nconst auto CallGuestPtrWithWaylandArray = CallbackUnpack<Result(Args..., wl_array*)>::CallGuestPtr;\n#else\ntemplate<typename Result, typename... Args>\nstatic auto CallGuestPtrWithWaylandArray(Args... args, wl_array* array) -> Result {\n  GuestcallInfo* guestcall;\n  LOAD_INTERNAL_GUESTPTR_VIA_CUSTOM_ABI(guestcall);\n\n  using PackedArgumentsType = PackedArguments<Result, guest_layout<Args>..., guest_layout<wl_array*>>;\n\n  GuestStackBumpAllocator GuestStack;\n\n  auto* guest_array = GuestStack.New<guest_layout<wl_array>>(to_guest(to_host_layout(*array)));\n  guest_layout<wl_array*> guest_array_ptr = {.data = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(guest_array))};\n\n  auto& packed_args = *GuestStack.New<PackedArgumentsType>(to_guest(to_host_layout(args))..., guest_array_ptr);\n\n  guestcall->CallCallback(guestcall->GuestUnpacker, guestcall->GuestTarget, &packed_args);\n\n  if constexpr (!std::is_void_v<Result>) {\n    return packed_args.rv;\n  }\n}\n#endif\n\n// See wayland-util.h for documentation on protocol message signatures\ntemplate<char>\nstruct ArgType;\ntemplate<>\nstruct ArgType<'s'> {\n  using type = const char*;\n};\ntemplate<>\nstruct ArgType<'u'> {\n  using type = uint32_t;\n};\ntemplate<>\nstruct ArgType<'i'> {\n  using type = int32_t;\n};\ntemplate<>\nstruct ArgType<'o'> {\n  using type = wl_proxy*;\n};\ntemplate<>\nstruct ArgType<'n'> {\n  using type = wl_proxy*;\n};\ntemplate<>\nstruct ArgType<'a'> {\n  using type = wl_array*;\n};\ntemplate<>\nstruct ArgType<'f'> {\n  using type = wl_fixed_t;\n};\ntemplate<>\nstruct ArgType<'h'> {\n  using type = int32_t;\n}; // fd?\n\ntemplate<char... Signature>\nstatic void WaylandFinalizeHostTrampolineForGuestListener(void (*callback)()) {\n  using cb = void(void*, wl_proxy*, typename ArgType<Signature>::type...);\n  FinalizeHostTrampolineForGuestFunction((cb*)callback);\n}\n\nextern \"C\" int\nfexfn_impl_libwayland_client_wl_proxy_add_listener(struct wl_proxy* proxy, guest_layout<void (**)(void)> callback_table_raw, void* data) {\n  auto interface = get_proxy_interface(proxy);\n\n  assert_is_valid_host_interface(interface);\n\n  auto callback_table = callback_table_raw.force_get_host_pointer();\n\n  for (int i = 0; i < interface->event_count; ++i) {\n    auto signature_view = std::string_view {interface->events[i].signature};\n\n    // A leading number indicates the minimum protocol version\n    uint32_t since_version = 0;\n    auto [ptr, res] = std::from_chars(signature_view.begin(), signature_view.end(), since_version, 10);\n    auto signature = std::string {signature_view.substr(ptr - signature_view.begin())};\n\n    // ? just indicates that the argument may be null, so it doesn't change the signature\n    signature.erase(std::remove(signature.begin(), signature.end(), '?'), signature.end());\n\n    auto callback = callback_table[i];\n\n    if (signature == \"\") {\n      // E.g. xdg_toplevel::close\n      WaylandFinalizeHostTrampolineForGuestListener<>(callback);\n    } else if (signature == \"a\") {\n      // E.g. xdg_toplevel::wm_capabilities\n      FEX::HLE::FinalizeHostTrampolineForGuestFunction((FEX::HLE::HostToGuestTrampolinePtr*)callback,\n                                                       (void*)CallGuestPtrWithWaylandArray<void, void*, wl_proxy*>);\n    } else if (signature == \"f\") {\n      WaylandFinalizeHostTrampolineForGuestListener<'f'>(callback);\n    } else if (signature == \"hu\") {\n      // E.g. zwp_linux_dmabuf_feedback_v1::format_table\n      WaylandFinalizeHostTrampolineForGuestListener<'h', 'u'>(callback);\n    } else if (signature == \"i\") {\n      // E.g. wl_output_listener::scale\n      WaylandFinalizeHostTrampolineForGuestListener<'i'>(callback);\n    } else if (signature == \"if\") {\n      // E.g. wl_touch_listener::orientation\n      WaylandFinalizeHostTrampolineForGuestListener<'i', 'f'>(callback);\n    } else if (signature == \"iff\") {\n      // E.g. wl_touch_listener::shape\n      WaylandFinalizeHostTrampolineForGuestListener<'i', 'f', 'f'>(callback);\n    } else if (signature == \"ii\") {\n      // E.g. xdg_toplevel::configure_bounds\n      WaylandFinalizeHostTrampolineForGuestListener<'i', 'i'>(callback);\n    } else if (signature == \"iu\") {\n      WaylandFinalizeHostTrampolineForGuestListener<'i', 'u'>(callback);\n    } else if (signature == \"iia\") {\n      // E.g. xdg_toplevel::configure\n      FEX::HLE::FinalizeHostTrampolineForGuestFunction((FEX::HLE::HostToGuestTrampolinePtr*)callback,\n                                                       (void*)CallGuestPtrWithWaylandArray<void, void*, wl_proxy*, int32_t, int32_t>);\n    } else if (signature == \"iiii\") {\n      WaylandFinalizeHostTrampolineForGuestListener<'i', 'i', 'i', 'i'>(callback);\n    } else if (signature == \"iiiiissi\") {\n      // E.g. wl_output_listener::geometry\n      WaylandFinalizeHostTrampolineForGuestListener<'i', 'i', 'i', 'i', 'i', 's', 's', 'i'>(callback);\n    } else if (signature == \"n\") {\n      // E.g. wl_data_device_listener::data_offer\n      WaylandFinalizeHostTrampolineForGuestListener<'n'>(callback);\n    } else if (signature == \"o\") {\n      // E.g. wl_data_device_listener::selection\n      WaylandFinalizeHostTrampolineForGuestListener<'o'>(callback);\n    } else if (signature == \"u\") {\n      // E.g. wl_registry::global_remove\n      WaylandFinalizeHostTrampolineForGuestListener<'u'>(callback);\n    } else if (signature == \"uff\") {\n      // E.g. wl_pointer_listener::motion\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'f', 'f'>(callback);\n    } else if (signature == \"uffff\") {\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'f', 'f', 'f', 'f'>(callback);\n    } else if (signature == \"uhu\") {\n      // E.g. wl_keyboard_listener::keymap\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'h', 'u'>(callback);\n    } else if (signature == \"ui\") {\n      // E.g. wl_pointer_listener::axis_discrete\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'i'>(callback);\n    } else if (signature == \"uiff\") {\n      // E.g. wl_touch_listener::motion\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'i', 'f', 'f'>(callback);\n    } else if (signature == \"uiii\") {\n      // E.g. wl_output_listener::mode\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'i', 'i', 'i'>(callback);\n    } else if (signature == \"uiiii\") {\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'i', 'i', 'i', 'i'>(callback);\n    } else if (signature == \"uo\") {\n      // E.g. wl_pointer_listener::leave\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'o'>(callback);\n    } else if (signature == \"uoa\") {\n      // E.g. wl_keyboard_listener::enter\n      FEX::HLE::FinalizeHostTrampolineForGuestFunction((FEX::HLE::HostToGuestTrampolinePtr*)callback,\n                                                       (void*)CallGuestPtrWithWaylandArray<void, void*, wl_proxy*, uint32_t, wl_surface*>);\n    } else if (signature == \"uoff\") {\n      // E.g. wl_pointer_listener::enter\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'o', 'f', 'f'>(callback);\n    } else if (signature == \"uoffo\") {\n      // E.g. wl_data_device_listener::enter\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'o', 'f', 'f', 'o'>(callback);\n    } else if (signature == \"uoo\") {\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'o', 'o'>(callback);\n    } else if (signature == \"us\") {\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 's'>(callback);\n    } else if (signature == \"uss\") {\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 's', 's'>(callback);\n    } else if (signature == \"usu\") {\n      // E.g. wl_registry::global\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 's', 'u'>(callback);\n    } else if (signature == \"uu\") {\n      // E.g. wl_pointer_listener::axis_stop\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'u'>(callback);\n    } else if (signature == \"uuf\") {\n      // E.g. wl_pointer_listener::axis\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'u', 'f'>(callback);\n    } else if (signature == \"uui\") {\n      // E.g. wl_touch_listener::up\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'u', 'i'>(callback);\n    } else if (signature == \"uuoiff\") {\n      // E.g. wl_touch_listener::down\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'u', 'o', 'i', 'f', 'f'>(callback);\n    } else if (signature == \"uuou\") {\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'u', 'o', 'u'>(callback);\n    } else if (signature == \"uuu\") {\n      // E.g. zwp_linux_dmabuf_v1::modifier\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'u', 'u'>(callback);\n    } else if (signature == \"uuuu\") {\n      // E.g. wl_pointer_listener::button\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'u', 'u', 'u'>(callback);\n    } else if (signature == \"uuuuu\") {\n      // E.g. wl_keyboard_listener::modifiers\n      WaylandFinalizeHostTrampolineForGuestListener<'u', 'u', 'u', 'u', 'u'>(callback);\n    } else if (signature == \"s\") {\n      // E.g. wl_seat::name\n      WaylandFinalizeHostTrampolineForGuestListener<'s'>(callback);\n    } else if (signature == \"sii\") {\n      // E.g. zwp_text_input_v3::preedit_string\n      WaylandFinalizeHostTrampolineForGuestListener<'s', 'i', 'i'>(callback);\n    } else if (signature == \"ss\") {\n      WaylandFinalizeHostTrampolineForGuestListener<'s', 's'>(callback);\n    } else {\n      fprintf(stderr, \"TODO: Unknown wayland event signature descriptor %s\\n\", signature.data());\n      std::abort();\n    }\n  }\n\n  // Pass the original function pointer table to the host wayland library. This ensures the table is valid until the listener is unregistered.\n  return fexldr_ptr_libwayland_client_wl_proxy_add_listener(proxy, callback_table, data);\n}\n\nvoid fexfn_impl_libwayland_client_fex_wl_exchange_interface_pointer(guest_layout<wl_interface*> guest_interface_raw, const char* name) {\n  auto& guest_interface = *guest_interface_raw.get_pointer();\n  auto& host_interface = guest_to_host_interface[reinterpret_cast<guest_layout<const wl_interface>*>(&guest_interface)];\n  host_interface = reinterpret_cast<wl_interface*>(dlsym(fexldr_ptr_libwayland_client_so, name));\n  if (!host_interface) {\n    fprintf(stderr, \"Could not find host interface corresponding to %p (%s)\\n\", &guest_interface, name);\n    std::abort();\n  }\n\n  // Wayland-client declares interface pointers as `const`, which makes LD put\n  // them into the rodata section of the application itself instead of the\n  // library. To copy the host information to them on startup, we must\n  // temporarily disable write-protection on this data hence.\n  // NOTE: This may span page boundaries, so up to 2 pages may need to be changed\n  const auto source_addr = reinterpret_cast<uintptr_t>(guest_interface_raw.force_get_host_pointer());\n  const auto page_begin = source_addr & ~uintptr_t {0xfff};\n  const auto remap_size = ((source_addr & 0xfff) + sizeof(*guest_interface_raw.force_get_host_pointer()) > 0x1000) ? 0x2000 : 0x1000;\n  if (0 != mprotect((void*)page_begin, remap_size, PROT_READ | PROT_WRITE)) {\n    fprintf(stderr, \"ERROR: %s\\n\", strerror(errno));\n    std::abort();\n  }\n\n#ifndef IS_32BIT_THUNK\n  memcpy(&guest_interface, host_interface, sizeof(wl_interface));\n#else\n  guest_interface = to_guest(to_host_layout(*host_interface));\n\n  // NOTE: These arrays are complements to global symbols in the guest, so we\n  //       never explicitly free this memory\n  guest_interface.data.methods.data = (uintptr_t)new guest_layout<wl_message>[host_interface->method_count];\n  for (int i = 0; i < host_interface->method_count; ++i) {\n    guest_interface.data.methods.get_pointer()[i] = to_guest(to_host_layout(host_interface->methods[i]));\n    guest_interface.data.methods.get_pointer()[i].data.types = to_guest(to_host_layout(host_interface->methods[i].types));\n  }\n\n  guest_interface.data.events.data = (uintptr_t)new guest_layout<wl_message>[host_interface->event_count];\n  for (int i = 0; i < host_interface->event_count; ++i) {\n    guest_interface.data.events.get_pointer()[i] = to_guest(to_host_layout(host_interface->events[i]));\n    guest_interface.data.events.get_pointer()[i].data.types = to_guest(to_host_layout(host_interface->events[i].types));\n  }\n#endif\n\n  // TODO: Disabled until we ensure the interface data is indeed stored in rodata\n  //  mprotect((void*)page_begin, remap_size, PROT_READ);\n}\n\nvoid fexfn_impl_libwayland_client_fex_wl_get_method_signature(wl_proxy* proxy, uint32_t opcode, char* out) {\n  strcpy(out, get_proxy_interface(proxy)->methods[opcode].signature);\n}\n\nint fexfn_impl_libwayland_client_fex_wl_get_interface_event_count(wl_proxy* proxy) {\n  return get_proxy_interface(proxy)->event_count;\n}\n\nvoid fexfn_impl_libwayland_client_fex_wl_get_interface_event_name(wl_proxy* proxy, int i, char* out) {\n  strcpy(out, get_proxy_interface(proxy)->events[i].name);\n}\n\nvoid fexfn_impl_libwayland_client_fex_wl_get_interface_event_signature(wl_proxy* proxy, int i, char* out) {\n  strcpy(out, get_proxy_interface(proxy)->events[i].signature);\n}\n\nEXPORTS(libwayland_client)\n"
  },
  {
    "path": "ThunkLibs/libwayland-client/libwayland-client_interface.cpp",
    "content": "#include <common/GeneratorInterface.h>\n\n#include <wayland-client.h>\n\ntemplate<auto>\nstruct fex_gen_config {\n  unsigned version = 0;\n};\n\ntemplate<typename>\nstruct fex_gen_type {};\n\n// Function, parameter index, parameter type [optional]\ntemplate<auto, int, typename = void>\nstruct fex_gen_param {};\n\ntemplate<>\nstruct fex_gen_type<wl_display> : fexgen::opaque_type {};\ntemplate<>\nstruct fex_gen_type<wl_proxy> : fexgen::opaque_type {};\n\ntemplate<>\nstruct fex_gen_type<wl_event_queue> : fexgen::opaque_type {};\n\n// Passed over Wayland's wire protocol for some functions\ntemplate<>\nstruct fex_gen_type<wl_array> : fexgen::emit_layout_wrappers {};\n\n#ifdef IS_32BIT_THUNK\n// wl_interface and wl_message reference each other through pointers\ntemplate<>\nstruct fex_gen_type<wl_interface> : fexgen::emit_layout_wrappers {};\ntemplate<>\nstruct fex_gen_config<&wl_interface::methods> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_config<&wl_interface::events> : fexgen::custom_repack {};\ntemplate<>\nstruct fex_gen_type<wl_message> : fexgen::emit_layout_wrappers {};\ntemplate<>\nstruct fex_gen_config<&wl_message::types> : fexgen::custom_repack {};\n#else\ntemplate<>\nstruct fex_gen_type<wl_interface> : fexgen::assume_compatible_data_layout {};\n#endif\n\ntemplate<>\nstruct fex_gen_config<wl_proxy_destroy> : fexgen::custom_guest_entrypoint {};\n\ntemplate<>\nstruct fex_gen_config<wl_display_connect> {};\ntemplate<>\nstruct fex_gen_config<wl_display_flush> {};\ntemplate<>\nstruct fex_gen_config<wl_display_cancel_read> {};\ntemplate<>\nstruct fex_gen_config<wl_display_create_queue> {};\ntemplate<>\nstruct fex_gen_config<wl_display_disconnect> {};\ntemplate<>\nstruct fex_gen_config<wl_display_dispatch> {};\ntemplate<>\nstruct fex_gen_config<wl_display_dispatch_pending> {};\ntemplate<>\nstruct fex_gen_config<wl_display_dispatch_queue> {};\ntemplate<>\nstruct fex_gen_config<wl_display_dispatch_queue_pending> {};\ntemplate<>\nstruct fex_gen_config<wl_display_get_error> {};\ntemplate<>\nstruct fex_gen_config<wl_display_prepare_read> {};\ntemplate<>\nstruct fex_gen_config<wl_display_prepare_read_queue> {};\ntemplate<>\nstruct fex_gen_config<wl_display_read_events> {};\ntemplate<>\nstruct fex_gen_config<wl_display_roundtrip> {};\ntemplate<>\nstruct fex_gen_config<wl_display_roundtrip_queue> {};\ntemplate<>\nstruct fex_gen_config<wl_display_connect_to_fd> {};\ntemplate<>\nstruct fex_gen_config<wl_display_get_fd> {};\n\ntemplate<>\nstruct fex_gen_config<wl_event_queue_destroy> {};\n\ntemplate<>\nstruct fex_gen_config<wl_proxy_add_listener> : fexgen::custom_host_impl, fexgen::custom_guest_entrypoint {};\n// Callback table\ntemplate<>\nstruct fex_gen_param<wl_proxy_add_listener, 1, void (**)()> : fexgen::ptr_passthrough {};\n// User-provided data pointer (not used in caller-provided callback)\ntemplate<>\nstruct fex_gen_param<wl_proxy_add_listener, 2, void*> : fexgen::assume_compatible_data_layout {};\ntemplate<>\nstruct fex_gen_config<wl_proxy_create> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<wl_proxy_create, 1, const wl_interface*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<wl_proxy_create_wrapper> {};\ntemplate<>\nstruct fex_gen_config<wl_proxy_get_class> {};\ntemplate<>\nstruct fex_gen_config<wl_proxy_get_id> {};\ntemplate<>\nstruct fex_gen_config<wl_proxy_get_listener> {};\ntemplate<>\nstruct fex_gen_config<wl_proxy_get_tag> {};\ntemplate<>\nstruct fex_gen_config<wl_proxy_get_user_data> {};\ntemplate<>\nstruct fex_gen_config<wl_proxy_get_version> {};\ntemplate<>\nstruct fex_gen_config<wl_proxy_set_queue> {};\ntemplate<>\nstruct fex_gen_config<wl_proxy_set_tag> {};\n// TODO: This has a void* parameter. Why does 32-bit accept this without annotations?\ntemplate<>\nstruct fex_gen_config<wl_proxy_set_user_data> {};\ntemplate<>\nstruct fex_gen_config<wl_proxy_wrapper_destroy> {};\n\ntemplate<>\nstruct fex_gen_config<wl_proxy_marshal_array> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<wl_proxy_marshal_array, 2, wl_argument*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<wl_proxy_marshal_array_constructor> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<wl_proxy_marshal_array_constructor, 2, wl_argument*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_param<wl_proxy_marshal_array_constructor, 3, const wl_interface*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_config<wl_proxy_marshal_array_constructor_versioned> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<wl_proxy_marshal_array_constructor_versioned, 2, wl_argument*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_param<wl_proxy_marshal_array_constructor_versioned, 3, const wl_interface*> : fexgen::ptr_passthrough {};\n// wl_proxy_marshal_array_flags is only available starting from Wayland 1.19.91\n#if WAYLAND_VERSION_MAJOR * 10000 + WAYLAND_VERSION_MINOR * 100 + WAYLAND_VERSION_MICRO >= 11991\ntemplate<>\nstruct fex_gen_config<wl_proxy_marshal_array_flags> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<wl_proxy_marshal_array_flags, 2, const wl_interface*> : fexgen::ptr_passthrough {};\ntemplate<>\nstruct fex_gen_param<wl_proxy_marshal_array_flags, 5, wl_argument*> : fexgen::ptr_passthrough {};\n#endif\n\n// Guest notifies host about its interface. Host returns its corresponding interface pointer\nvoid fex_wl_exchange_interface_pointer(wl_interface*, const char* name);\ntemplate<>\nstruct fex_gen_config<fex_wl_exchange_interface_pointer> : fexgen::custom_host_impl {};\ntemplate<>\nstruct fex_gen_param<fex_wl_exchange_interface_pointer, 0, wl_interface*> : fexgen::ptr_passthrough {};\n\n// This is equivalent to reading proxy->interface->methods[opcode].signature on 64-bit.\n// On 32-bit, the data layout differs between host and guest however, so we let the host extract the data.\nvoid fex_wl_get_method_signature(wl_proxy*, uint32_t opcode, char*);\ntemplate<>\nstruct fex_gen_config<fex_wl_get_method_signature> : fexgen::custom_host_impl {};\nint fex_wl_get_interface_event_count(wl_proxy*);\ntemplate<>\nstruct fex_gen_config<fex_wl_get_interface_event_count> : fexgen::custom_host_impl {};\nvoid fex_wl_get_interface_event_name(wl_proxy*, int, char*);\ntemplate<>\nstruct fex_gen_config<fex_wl_get_interface_event_name> : fexgen::custom_host_impl {};\nvoid fex_wl_get_interface_event_signature(wl_proxy*, int, char*);\ntemplate<>\nstruct fex_gen_config<fex_wl_get_interface_event_signature> : fexgen::custom_host_impl {};\n"
  },
  {
    "path": "ThunkLibs/libxshmfence/Guest.cpp",
    "content": "/*\n$info$\ntags: thunklibs|xshmfence\n$end_info$\n*/\n\nextern \"C\" {\n#include <X11/xshmfence.h>\n}\n\n#include <stdio.h>\n#include <cstring>\n#include <map>\n#include <string>\n\n#include \"common/Guest.h\"\n#include <stdarg.h>\n\n#include \"thunkgen_guest_libxshmfence.inl\"\n\nLOAD_LIB(libxshmfence)\n"
  },
  {
    "path": "ThunkLibs/libxshmfence/Host.cpp",
    "content": "/*\n$info$\ntags: thunklibs|xshmfence\n$end_info$\n*/\n\n#include <stdio.h>\n\n#include <X11/xshmfence.h>\n\n#include \"common/Host.h\"\n#include <dlfcn.h>\n\n#include \"thunkgen_host_libxshmfence.inl\"\n\nEXPORTS(libxshmfence)\n"
  },
  {
    "path": "ThunkLibs/libxshmfence/libxshmfence_interface.cpp",
    "content": "#include <common/GeneratorInterface.h>\n\nextern \"C\" {\n#include <X11/xshmfence.h>\n}\n\ntemplate<auto>\nstruct fex_gen_config {\n  unsigned version = 1;\n};\n\ntemplate<typename>\nstruct fex_gen_type {};\n\ntemplate<>\nstruct fex_gen_type<xshmfence> : fexgen::opaque_type {};\n\ntemplate<>\nstruct fex_gen_config<xshmfence_trigger> {};\ntemplate<>\nstruct fex_gen_config<xshmfence_await> {};\ntemplate<>\nstruct fex_gen_config<xshmfence_query> {};\ntemplate<>\nstruct fex_gen_config<xshmfence_reset> {};\ntemplate<>\nstruct fex_gen_config<xshmfence_alloc_shm> {};\ntemplate<>\nstruct fex_gen_config<xshmfence_map_shm> {};\ntemplate<>\nstruct fex_gen_config<xshmfence_unmap_shm> {};\n"
  },
  {
    "path": "docs/CPUID.md",
    "content": "# FEXCore custom CPUID functions\n\n## 4000_0000h - Hypervisor information function\n* Follows VMWare and Microsoft's hypervisor information proposal\n* https://lwn.net/Articles/301888/\n* https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/tlfs/feature-discovery\n\n* EAX - The maximum input value for the hypervisor CPUID information\n  * 4000_0001h\n* EBX - Hypervisor vendor ID signature\n  * 'FEXI' - 4958_4546h\n* ECX - Hypervisor vendor ID signature\n  * 'FEXI' - 4958_4546h\n* EDX - Hypervisor vendor ID signature\n  * 'EMU\\0' - 0055_4d45h\n\n* memcpy ebx:ecx:edx in to a 12 byte string to get 'FEXIFEXIEMU\\0' for determining running under FEX\n\n## 4000_0001h - Hypervisor config function\n\n### Sub-Leaf 0: ECX == 0\n* EAX:\n  * Bits EAX[3:0] - Host architecture\n    * 0 - Unknown architecture\n    * 1 - x86_64\n    * 2 - AArch64\n    * 3-15: **Reserved**\n  * Bits EAX[15:4] - **Reserved**\n  * Bits EAX[31:16] - Maximum subleaf input value for CPUID function 4000_0001h\n* EBX - **Reserved** - Read as zero\n* ECX - **Reserved** - Read as zero\n* EDX - **Reserved** - Read as zero\n\n### Sub-leaf 1: ECX == 1\n* FEX version string signature. First 16-bytes\n* memcpy eax:ebx:ecx:edx in to the first 16-bytes of a string.\n\n### Sub-leaf 2: ECX == 2\n* FEX version string signature. Second 16-bytes\n* memcpy eax:ebx:ecx:edx in to the second 16-bytes of a string.\n\n### Sub-Leaf 0000_0003 - FFFF_FFFF: **Reserved**\n\n## 4000_0002h - 4000_000Fh\n* **Reserved range**\n* Returns zero until implemented\n\n## 4000_0010h - 4FFF_FFFFh\n* **Undefined**\n* FEX-Emu will return zero until implemented\n"
  },
  {
    "path": "docs/DeferredSignals.md",
    "content": "# Deferred signals and why FEX needs them\n\nFEX-Emu has locations in its code which are effectively \"uninterruptible\". In the sense that if the guest application receives a signal during an\n\"uninterruptible\" code section, then FEX is likely to hang or crash in spurious and terrible ways.\n\n## Example\nWhen FEX is in the process of emitting code, it often needs to acquire mutexes to safeguard operations like memory allocations or reading guest state.\nThis puts FEX in a vulnerable state: If a signal is received in the middle of this, FEX may need to initiate compilation of new code. In this case a\nmutex could already be held, so attempting to acquire it again would trigger a deadlock.\n\n## How do we solve this?\n\n### Classical signal masking\nOne solution to this problem is to mask **all** signals going in to an uninterruptible section and then unmask when leaving. This is the classical\napproach that is viable if performance isn't a significant concern. A major problem is that it requires two system calls per \"uninterruptible\" code\nsection, which adds overhead that may exceed the runtime of the section itself.\n\n### Cooperative signal deferring\nA new solution is to defer asynchronous signals caught inside an uninterruptible section and handle them at the end of that section.\n\nAt the basic level, we increment a reference counter going in to the \"uninterruptible\" section, and then decrement the reference counter once we leave.\nThis way when the signal handler receives a signal, it can check that thread's reference counter, store the `siginfo_t` to an array/stack object, and\nreturn to the same code segment to be handled later.\n\nBy making this check as cheap as possible, overhead is minimized for the general case that no signal occurs during \"uninterruptible\" sections. FEX\nachieves this by maintaining two memory regions for tracking deferred signals **per thread**.\n\n#### 1st memory region\n\nThis region is FEX's InternalThreadState object, which is always resident for each guest thread and usually inside a register inside the JIT.\nInside this object is where the reference counter for \"uninterruptible\" code segments lives. It is specifically a reference counter since these\ncode segments may nest inside each other and we can only interrupt with a signal if the counter is zero.\n\nThis reference counter is thread local and won't be read by any other threads, so it can be a non-atomic increment and decrement.\nMeaning it is usually three instructions (on ARM64) to increment and decrement.\n\n```cpp\nNonAtomicRefCounter<uint64_t> DeferredSignalRefCount;\n```\n\n#### 2nd memory region\n\nThis memory region is a single page of memory that is allocated per thread. Its purpose is to trigger a SIGSEGV when FEX leaves an \"uninterruptible\"\nsection if a signal has been deferred. FEX's signal handler will check if the faulting address is in this special page and subsequently starts the\ndeferred signal mechanisms.\n\n```cpp\nNonAtomicRefCounter<uint64_t> *InterruptFaultPage;\n```\n\n#### Example ARM64 JIT code for uninterruptible region\n```asm\n  ; Increment the reference counter.\n  ldr x0, [x28, #(offsetof(CPUState, DeferredSignalRefCount))]\n  add x0, x0, #1\n  str x0, [x28, #(offsetof(CPUState, DeferredSignalRefCount))]\n\n  ; Do the uninterruptible code section here.\n  <...>\n\n  ; Now decrement the reference counter.\n  ldr x0, [x28, #(offsetof(CPUState, DeferredSignalRefCount))]\n  sub x0, x0, #1\n  str x0, [x28, #(offsetof(CPUState, DeferredSignalRefCount))]\n\n  ; Just store zero. (1 cycle plus no dependencies on a register. Super fast!)\n  ; Will store fine with no deferred signal, or SIGSEGV if there was one!\n  strb wxr, [x28, #(offsetof(CPUState, InterruptFaultPage))]\n```\n\n### Deferred signal handling\nIn the case that FEX has received a signal, FEX's signal handler will first check to see if that thread's reference counter is zero or not.\n\n#### Reference counter is zero\nThis is the easy case, just handle the signal as normal.\n\n#### Reference counter is not zero\nThe signal handler now knows that FEX is in an uninterruptible code section. We check the signal to see if it is a synchronous signal or not.\n- If the signal is synchronous then we need to handle it as normal, because this is a hardware signal that we can't defer.\n- If it is an async signal (from tgkill, sigqueue, or something else) then we will start the deferring process.\n\nThe deferring process starts with storing the kernel `siginfo_t` to a thread local array so we can restore it later.\nWe then modify the permissions on the thread local `InterruptFaultPage` to be `PROT_NONE`.\nWe then immediately return from the signal handler so that FEX can resume its \"uninterruptible\" code section without breaking anything.\nOnce the \"uninterruptible\" code section finishes, FEX will intentionally trigger a SIGSEGV by storing to the page.\n\nOnce FEX-Emu is in its SIGSEGV handler, it will determine that it is handling a deferred signal. This will pull the previously saved `siginfo_t` and\nstart processing the signal.\n\nOnce a guest signal handler has finished what it was working on, it will call `rt_sigreturn` or `sigreturn` which triggers FEX's SIGILL signal\nhandler.\n\nInside of this SIGILL signal handler FEX will restore the state of FEX /back/ to where the deferred signal handler started (The str xzr, [x0]).\nThen, FEX will check if any further deferred signals need to be handled.\n- Checks if the reference counter is zero or not\n   - If further asynchronous signals have been triggered that need handling, mprotect the fault page to `PROT_NONE`\n      - This trampolining is repeated once per asynchronous signal queued during processing.\n      - This will cause further signal handling immediately once the JIT returns to its original location (where it'll cause a SIGSEGV again).\n\nOnce FEX gets back to the page store, it will trampoline back to the SIGSEGV handler if it has more signals to handle.\n\n## Disadvantages of cooperative signal deferring\n- How do we handle the guest doing a longjmp out of a signal frame and still receiving signals?\n   - FEX relies on guest signal handlers returning via `sigreturn` to handle stacked deferred signals, so a longjmp would interfere with this\n   -  Do we need to store guest stack as well to see if it has reset its own stack frame?\n   - moon-buggy does this as an example\n   - We currently just leak stack for every guest signal handler that long jumps out of the signal frame.\n      - Long term this would exhaust our stack and then crash.\n      - Test with a second guest thread where our host will only have an 8MB stack instead of the 128MB primary stack.\n      - See issue #2487\n- Deeply recursive signal deferring sections can have excessive SIGSEGV faults.\n   - In the case of ARM64 it will do a SIGSEGV at the end of each deferred signal section if a signal is queued.\n   - This can result in a bunch of trampolining.\n   - Just make sure to not do excessive nesting of deferred signal sections.\n   - Typically not a problem since deferred signals aren't common.\n\n## Expectations and considerations\n### What happens with a race condition with the refcounter?\nThere are two edges to this problem. The incrementing edge and the decrementing edge that must be considered.\n\n#### Incrementing edge\nThis is the most problematic edge. This takes three instructions (one on x86) to increment the ref counter. If a signal is received between the load\nand store then this theoretically could result in a tear on the refcounter. In actual practice this is a real tear but doesn't cause any problems.\n\nThe reasoning for this is that FEX isn't in the \"uninterruptible\" section until that reference counter has been stored, so FEX will handle the signals\nimmediately at that point, return to this code location, and then increment the counter. In particular, once returning to the code location the\nrefcounter will be the original value loaded. So even though it is a tear, it's one that doesn't cause issues since it is all thread local.\n\n#### Decrementing edge\nThis edge is far less problematic to understand compared to the incrementing edge. Signals will get deferred entirely until the store instruction (If\nstoring zero), so FEX will always return to the code region and finish the decrement.\n\nIf FEX receives a signal after the decrement store has completed but /before/ the page faulting store has occurred, then FEX will start processing the\nsignal immediately. At which point the fault page will have either RW or NONE permission. FEX will then likely hit another \"uninterruptible\" code\nsection which will complete the store to the fault page.\n - RW permission if it hadn't received another signal in the uninterruptible section\n - NONE permission if it did receive a signal previously\n\nRW permission has no problems, it will continue as normal.\n\nNONE will get captured by the fault handler, the fault handler will determine that there was no deferred signals, and set the fault page back to RW\npermissions and continue execution safely.\n\n## Execution examples\n### No signal\nThis is a simple example because nothing happens.\n\n- **Enter Deferred region - 3 instructions**\n- Compiling JIT Code\n- **Exit deferred region - 5 instructions**\n\n### Signal outside of region\nThis is simple because the JIT just handles it.\n\n- In JIT code\n- Signal received\n- Guest Signal handler called\n- JIT jumps to guest signal handler\n- Hopefully guest calls rt_sigreturn instead of long jumping out.\n\n### Synchronous signal in JIT\nDeferred signals don't affect anything here because only asynchronous signals get affected.\n\n- In JIT code\n- JIT code causes a synchronous signal (SIGSEGV or other)\n- Guest Signal Handler called\n- JIT jumps to guest signal handler\n- Hopefully guest calls rt_sigreturn instead of long jumping out.\n\n### Asynchronous signal in code emitter\nThis is the first interesting example since deferred signals affects it.\n\n- **Enter Deferred region - 3 instructions**\n- Compiling JIT Code\n- Asynchronous Signal received\n  - Host signal handler determines the thread is in a deferred signal section.\n  - Signal information is stored in a queue\n  - mprotect signal page to NONE.\n  - Signal handler returns without giving the signal to the guest\n- Compiling JIT Code continues.\n- **Exit deferred region - 5 instructions**\n- Deferred region section causes SIGSEGV\n  - Host signal handler determines deferred region is done, Still has signal in queue.\n  - Pull signal information off of queue\n- JIT jumps to guest signal handler\n- Hopefully guest calls rt_sigreturn instead of long jumping out.\n- Host PC is back at deferred signal section.\n- Deferred region section causes SIGSEGV #2\n  - Host signal handler determines deferred region is done, No signals in the queue.\n  - mprotect signal page to RW.\n  - Continue execution.\n- **Exit deferred region continues**\n\n### Recursive regions with signal in code emitter.\nThis one mostly matches the previous example except the behaviour of deferred signal regions leaving.\n\nIn this case, if the thread-local refcount is still >0 on `<Exit deferred region>` then there are two behaviours.\n- On ARM64, it will receive a SIGSEGV but the signal handler will increment PC by one instruction and continue execution\n   - Expectation is that signals are significantly less common than `<Exit deferred region>` so the cost of SIGSEGV+PC increment is faster.\n- On x86-64, the region exit checks the refcount before doing the fault access.\n   - This adds more instructions so is slower on average.\n\nThis has the expectation that recursive deferred regions both aren't very deep (usually only nested a couple times), and that signals are rare.\nThis way there aren't many SIGSEGV checks generated and the signal is finally only handled when reaching the top-most deferred region exit routine.\n\n- **Enter Deferred region - 3 instructions**\n- Compiling JIT Code\n     - Enter Deferred region - 3 instructions\n     - Memory allocation\n     - Async signal received logic from above\n     - Exit deferred region - 5 instructions\n     - Exit deferred region causes SIGSEGV\n     - TLS refcount is still 1\n     - PC is incremented by one instruction, signal still unhandled.\n- **Exit deferred region - 5 instructions**\n- Exit deferred region causes SIGSEGV\n- **Regular deferred region handling from above called**\n\n### Multiple signals in signal-deferring region\nThis is slightly different from the previous iterations since multiple signals in the stack result in odd behaviour.\n\n- **Enter Deferred region - 3 instructions**\n- Compiling JIT Code\n- Asynchronous Signal received\n    - Signal queued logic\n- Asynchronous Signal received\n    - Signal queued logic\n- **Exit deferred region - 5 instructions**\n- Exit deferred region causes SIGSEGV\n- **Regular deferred region handling from above called**\n- Guest calls rt_sigreturn\n  - rt_sigreturn handler checks for number of queued signals\n  - mprotect signal page to NONE because signals is > 0\n  - JIT is back to **Exit deferred region**\n  - Exit deferred region causes SIGSEGV again.\n  - Regular handler loop occurs\n"
  },
  {
    "path": "docs/ProgrammingConcerns.md",
    "content": "# Memory allocation routines\n## What is the problem?\nFEX-Emu needs to allocate memory differently than regular applications. This problem happens because FEX runs both 32-bit and 64-bit guest\napplications in the same address space as FEX itself. When running 32-bit applications, FEX reserves up all memory above 4GB in order to correctly\nemulate the 32-bit address space. We then use that reserved space for FEX allocations, so we don't interrupt application's own allocations.\n\n### Why not just replace the system allocator?\nWe could control the placement of FEX's internal allocations by overriding the system\nallocator. However, 32-bit thunks (and their corresponding native host libraries) still\nneed to allocate memory in the lower 4 GB of memory so that they produce\nguest-accessible pointers. Since overriding the system allocator is a global operation,\nselectively overriding it like this is not possible.\n\nSince we found no way to resolve this conflict, we had to resort to the alternative of avoiding use of the system allocator for FEX's internal\nallocations entirely (where possible).\n\n## Sub-projects and applications that need to follow this.\n- FEXCore\n- FEXInterpreter\n\n## Sub-projects that explicitly cannot follow this\n- Thunks\n\n## APIs which allocate memory that FEX needs to avoid\nMost C++ APIs allow you to replace their allocators, but some don't and we need to avoid those APIs. If FEX uses them then the 32-bit application\nrunning might run out of memory. This isn't an all encompassing list and we will add to it as our CI captures more problems.\n\n### `get_nprocs_conf`\nUse `FEX::CPUInfo::CalculateNumberOfCPUs` instead.\n\n### `getcwd`\nDon't use getcwd with a nullptr buffer. It will allocate memory behind our back and return a pointer that needs a free.\n\n### `strerror`\nThis allocates and frees memory based on locale! Even with C local it'll attempt to free(0).\nFEX-Emu should avoid using this function and instead just return the number.\nIf necessary FEX will provide its own routine for getting this string back.\n\n### `std::make_unique`\nUse `fextl::make_unique` instead.\n\n### `std::unique_ptr`\nUse `fextl::unique_ptr` instead.\n\n### `std::filesystem`\nThis namespace is /highly/ likely to allocate memory behind our back.\nFEX should avoid using this API as much as possible.\n\n#### std::filesystem::path\n#### std::filesystem::path::is_relative\nUse `FHU::Filesystem::IsRelative` instead.\n\n#### std::filesystem::absolute\nAlways allocates memory.\nUse `realpath` instead.\n\n#### std::filesystem::exists\nCreates a std::filesystem::path when passing in to it.\nUse `FHU::Filesystem::Exists` instead.\n\n#### std::filesystem::canonical\nAlways allocates memory.\nUse `realpath` instead.\n\n#### std::filesystem::path::lexically_normal\nUse `FHU::Filesystem::LexicallyNormal` instead.\n\n#### std::filesystem::create_directory\n#### std::filesystem::create_directories\nCreates a std::filesystem::path when passing in to it.\nUse `FHU::Filesystem::CreateDirectory` and `FHU::Filesystem::CreateDirectories` instead.\n\n#### std::filesystem::path::parent_path\nUse `FHU::Filesystem::ParentPath` instead.\n\n#### std::filesystem::path::filename\nUse `FHU::Filesystem::GetFilename` instead.\n\n#### std::filesystem::copy_file\nUse `FHU::Filesystem::CopyFile` instead.\n\n#### std::filesystem::temp_directory_path\nSee `GetTempFolder()` in `FEXServerClient.cpp` (split/move to `FHU::Filesystem` if needed by other users).\n\n### Any `FILE`-based API\n`FILE` always allocates memory and must be avoided.\nUse a combination of raw FDs and fextl::string APIs instead.\n\n#### Includes but not limited to:\n* `<fstream>` -> `std::fstream`\n* `<cstdio>` -> `std::fwrite`\n\n### `std::string`\nUse `fextl::string` instead.\n\n#### std::to_string\nUse `fextl::fmt::format` instead.\n\n### `std::stol`\n### `std::stoul`\n### `std::stoll`\n### `std::stoull`\nThese all consume a `std::string` as their first argument. Use the equivalent functions that don't use `std::string`\n- `std::strtol`\n- `std::strtoul`\n- `std::strtoll`\n- `std::strtoull`\n\n### `fmt::`\n### `fmt::format`\nUse `fextl::fmt::` instead\n\n### `getpwuid` and `getpwuid_r`\nAllocates memory for parsing passwd and other files. One would assume `getpwuid_r` would use the buffer passed in, but nope glibc nss_database_get\nallocates memory.\n\n### APIs that FEX doesn't have a replacement for\nDon't use any of these APIs in FEXLoader/FEXInterpreter. Shoutout to\n[this](https://stackoverflow.com/questions/43056338/standard-library-facilities-which-allocate-but-dont-use-an-allocator) StackOverflow post for this\nhuge list.\n\n#### `std::any`\n#### `std::function` and lambdas\nOne must take additional considerations when using these to ensure that they don't allocate memory. These don't have any way to replace which\nallocator is used for these objects. Additionally there is no way up-front to know if these will allocate memory or if the compiler will use\nsmall-function optimizations to avoid allocations. The only real way to check this is to enable the glibc faulting compile option.\n- Lambdas without anything in the capture list will never allocate memory.\n- One pointer in the capture list is likely to hit small-function optimizations and not allocate memory.\n   - This isn't guaranteed.\n- Passing the `std::function` as an argument is unlikely to optimize away their memory allocations.\n\n#### `std::valarray`\n#### `std::filebuf`\n#### `std::inplace_merge`\n#### `<stdexcept>`\n#### `std::boyer_moore_searcher`\n#### `std::filesystem::path`\n#### `std::filesystem::directory_iterator`\n#### `std::regex`\n#### `std::thread`\n#### `std::async`\n#### `std::packaged_task`\n#### `std::promise`\n#### `<iostream>`\n#### Remember this is not an all-encompassing list! We may find APIs that still allocate memory and need to be avoided!\n\n### Regular memory allocation routines.\nDon't use these directly as they will the glibc allocator.\n\n#### mmap\nUse `FEXCore::Allocator::mmap`\n\n#### munmap\nUse `FEXCore::Allocator::munmap`\n\n#### malloc\nUse `FEXCore::Allocator::malloc`\n\n#### calloc\nUse `FEXCore::Allocator::calloc`\n\n#### memalign \nUse `FEXCore::Allocator::memalign`\n\n#### valloc\nUse `FEXCore::Allocator::valloc`\n\n#### posix_memalign\nUse `FEXCore::Allocator::posix_memalign`\n\n#### realloc\nUse `FEXCore::Allocator::realloc`\n\n#### free\nUse `FEXCore::Allocator::free`\n\n#### aligned_alloc\nUse `FEXCore::Allocator::aligned_alloc`\n\n#### __libc_malloc\n#### __libc_calloc\n#### __libc_memalign\n#### __libc_valloc\n#### __posix_memalign\n#### __malloc_usable_size\n!! DO NOT USE !!\n\n## How does FEX ensure that this paradigm doesn't break?\nFEX has the cmake option `ENABLE_GLIBC_ALLOCATOR_HOOK_FAULT` to hook in to glibc's allocator and fault if anything is allocating through it.\nThis can't be used with thunks for thunk testing as those actually use the glibc allocator.\nCI will run FEX's test suite with extra verification to ensure FEX makes no allocations are made through glibc. Thunking must be disabled for this\nrun, since thunks are by design the only place where glibc allocation still happen.\n"
  },
  {
    "path": "docs/Readme_CN.md",
    "content": "[English](https://github.com/FEX-Emu/FEX/blob/main/Readme.md)\n# FEX —— 快速的x86模拟器前端\nFEX和qemu-user以及box86类似，允许你在AArch64的host端运行x86和x86-64二进制程序。\nFEX原生支持rootfs（作为guest程序的运行环境），所以无需使用chroot。同时支持thunklibs将guest程序所用到的库转发到host，例如：libGL。\nFEX为guest程序提供Linux 5.0的接口（系统调用），同时支持AArch64和x86-64做为host。\nFEX处于重度开发阶段，所以会有很多改善。\n\n\n## 快速指引\n### Ubuntu 20.04, 21.04, 21.10, 22.04\n在终端执行以下命令添加PPA去安装FEX。\n\n`curl --silent https://raw.githubusercontent.com/FEX-Emu/FEX/main/Scripts/InstallFEX.py --output /tmp/InstallFEX.py && python3 /tmp/InstallFEX.py && rm /tmp/InstallFEX.py`\n\n这条命令将会引导你通过PPA安装FEX，然后下载FEX所需的RootFS。\n\nUbuntu下的PPA 随FEX月度发布更新。\n\n### 其他系统\n参考[这里](https://wiki.fex-emu.com/index.php/QuickStartGuide)\n\n## 开始\nFEX在ARMv8.0，ARMv8.1+和x86-64(支持AVX或更新处理器)硬件上进行过编译和运行测试。\n不支持ARMv7以及老旧的x86处理器。\n同时需要确保操作系统为Linux。FEX在Ubuntu 20.04，20.10和21.04以及Arch Linux上测试过。\n在AArch64 host端，用户需要准备x86-64 RootFS[创建RootFS](#RootFS-Generation)。\n\n### 源码导览\n详见[源码大纲](SourceOutline.md)。\n\n### 编译依赖\n* cmake (version 3.14 minimum)\n* ninja-build\n* clang (version 10 minimum for C++20)\n* libglfw3-dev (For GUI)\n* libsdl2-dev (For GUI)\n* libepoxy-dev (For GUI)\n* g++-x86-64-linux-gnu (For building thunks)\n* nasm (only if building tests)\n\n### 编译FEX\n安装完依赖后，通过以下命令进行编译。\n```Shell\ngit clone https://github.com/FEX-Emu/FEX.git\ncd FEX\ngit submodule update --init\nmkdir Build\ncd Build\nCC=clang CXX=clang++ cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DENABLE_LTO=True -DBUILD_TESTING=False -G Ninja ..\nninja\n```\n\n### 安装\n```Shell\nsudo ninja install\n```\n\n### 关于AArch64 Hosts\n在AArch64使用binfmt_misc（执行下述命令）可以支持32位和64位x86程序直接运行。如果已经安装了box86 binfmt_misc配置，在FEX达到可用状态前我并不建议安装FEX进行替代。请确保install命令在下述命令前执行，不然binfmt_misc将依旧使用旧版本的FEX，即使FEX已经更新。\n```Shell\nsudo ninja binfmt_misc_32\nsudo ninja binfmt_misc_64\n```\n\n### 更多信息\n更多关于FEX和平台相关的设置信息请参考以下维基页面：\nhttps://wiki.fex-emu.com/index.php/Development:Setting_up_FEX\n\n### 创建RootFS\nAArch64 host端需要一个rootfs去运行guest程序。参考以下维基页面从头开始创建一个rootfs\nhttps://wiki.fex-emu.com/index.php/Development:Setting_up_RootFS\n"
  },
  {
    "path": "docs/ReleaseProcess.md",
    "content": "# FEX tagged version (release) process\nA FEX tagged version happens near the start of each month.\n\nThe tagged versioning is `FEX-<YYMM>` with the month being the current month.\n\nIf a tagged version was being done on `Sun, 02 Jan 2022` then the FEX version would be FEX-2201\n\nThere are multiple locations that need to be updated during a release\n* Github tagged release\n* Github releases page\n* fex-emu.com blog post\n* https://launchpad.net/~fex-emu/+archive/ubuntu/fex Ubuntu PPA\n* @FEX_Emu twitter account\n\n* Optional: Update the rootfs images\n\n## Github Steps\n* Check out the commit that will be the branch\n\n  $ git checkout upstream/main\n\n* Make local main branch be the selected commit\n\n  $ git branch -D main\n  $ git checkout -b main\n\n* Run the release script\n\n  $ Scripts/generate_release.sh\n\n* Push the branches upstream\n  * This requires administrative push rights\n  * Both the tag and the main branch needs to be committed\n\n  $ git push upstream $CURRENT\n  $ git push upstream main\n\n## Launchpad PPA steps\nFollow the steps in: https://github.com/FEX-Emu/FEX-ppa/blob/main/README.md\n* Requires PPA GPG key signing access\n* Wait the 20-30 minutes for Ubuntu PPA to build and publish the binaries\n\n## Github releases page Steps\n* Requires administrative rights\n* Go to https://github.com/FEX-Emu/FEX/releases\n* Click Draft a new release\n* Copy and paste the tagged changelog in to the draft release markdown\n  * This was generated from the generate_release.sh script\n* Clean the markdown to a desired level of combining and ordering\n  * Fairly trivial cleanups, it's more just a developer focused changelog\n* Click publish release\n\n## fex-emu.com blog post steps\n* clone https://github.com/FEX-Emu/fex-emu.com\n* Copy the previous post from the _posts/ folder to a new markdown file\n  * Ensure correct date format in filename\n* Copy github release pages markdown in to this\n* Easy to forget areas:\n  * Title text section\n  * See Release notes top section, links to github release tag\n  * See detailed changelog at the bottom, linking to github raw revision comparison\n* Short blurb in the top paragraph if desired\n* push new md file to the repo. Either in direct push or PR\n* Jekyll will automatically regenerate the website with a github action\n* Verify that the post shows up on the site at fex-emu.com\n\n## @FEX_Emu twitter account steps\n* Requires @FEX_Emu twitter account access\n* Create a tweet with some small blurb/sizzle text about some relevant changes in this tagged version\n* Link to the fex-emu.com blog post about the change\n\n## RootFS image updating\n* This doesn't typically need to be done on a monthly basis\n* This lives in https://github.com/FEX-Emu/RootFS\n\n* Follow the Build_Data file's information for how to generate an image using `build_image.py`\n  * This gives a squashfs image for the rootfs\n* Use FEXRootFSFetcher <image.sqsh> to generate the xxhash for the image\n* Update `https://rootfs.fex-emu.com/file/fex-rootfs/RootFS_links.json` with the new rootfs image and hash\n  * This currently lives in a private FEX-Emu backblaze bucket with cloudflare servicing it.\n  * Never publicly give the direct backblaze link to the file. Will cause BW costs to skyrocket\n  * Always pass through cloudflare\n\n* Upload new image to Backblaze using the b2 upload tool\n  * b2 upload-file <bucketname> <image.sqsh> <Image folder name>/<image.sqsh>\n\n* Upload the new RootFS_links.json\n  * Lives in the root of the bucket\n  * b2 upload-file <bucketname> RootFS_links.json RootFS_links.json\n\n* Once uploaded it should propagate immediately\n* Might be worth thinking about the coherency problem of updating the hash versus image independently if overwriting an image\n  * Need to be careful about it to not break anyone in the process of downloading an image\n"
  },
  {
    "path": "docs/SourceOutline.md",
    "content": "# FEX-2603\n\n## FEXCore\nSee [FEXCore/Readme.md](../FEXCore/Readme.md) for more details\n\n### Glossary\n\n- Splatter: a code generator backend that concatenates configurable macros instead of doing isel\n- IR: Intermediate Representation, our high-level opcode representation, loosely modeling arm64\n- SSA: Single Static Assignment, a form of representing IR in memory\n- Basic Block: A block of instructions with no control flow, terminated by control flow\n- Fragment: A Collection of basic blocks, possibly an entire guest function or a subset of it\n\n\n### backend\nIR to host code generation\n\n#### arm64\n- [ALUOps.cpp](../FEXCore/Source/Interface/Core/JIT/ALUOps.cpp)\n- [Arm64Relocations.cpp](../FEXCore/Source/Interface/Core/JIT/Arm64Relocations.cpp): relocation logic of the arm64 splatter backend\n- [AtomicOps.cpp](../FEXCore/Source/Interface/Core/JIT/AtomicOps.cpp)\n- [BranchOps.cpp](../FEXCore/Source/Interface/Core/JIT/BranchOps.cpp)\n- [ConversionOps.cpp](../FEXCore/Source/Interface/Core/JIT/ConversionOps.cpp)\n- [EncryptionOps.cpp](../FEXCore/Source/Interface/Core/JIT/EncryptionOps.cpp)\n- [JIT.cpp](../FEXCore/Source/Interface/Core/JIT/JIT.cpp): Main glue logic of the arm64 splatter backend\n- [JITClass.h](../FEXCore/Source/Interface/Core/JIT/JITClass.h)\n- [MemoryOps.cpp](../FEXCore/Source/Interface/Core/JIT/MemoryOps.cpp)\n- [MiscOps.cpp](../FEXCore/Source/Interface/Core/JIT/MiscOps.cpp)\n- [MoveOps.cpp](../FEXCore/Source/Interface/Core/JIT/MoveOps.cpp)\n- [VectorOps.cpp](../FEXCore/Source/Interface/Core/JIT/VectorOps.cpp)\n\n#### shared\n- [CPUBackend.h](../FEXCore/Source/Interface/Core/CPUBackend.h)\n\n\n\n### frontend\n\n#### x86-meta-blocks\n- [Frontend.cpp](../FEXCore/Source/Interface/Core/Frontend.cpp): Extracts instruction & block meta info, frontend multiblock logic\n\n#### x86-tables\n- [BaseTables.cpp](../FEXCore/Source/Interface/Core/X86Tables/BaseTables.cpp)\n- [DDDTables.cpp](../FEXCore/Source/Interface/Core/X86Tables/DDDTables.cpp)\n- [H0F38Tables.cpp](../FEXCore/Source/Interface/Core/X86Tables/H0F38Tables.cpp)\n- [H0F3ATables.cpp](../FEXCore/Source/Interface/Core/X86Tables/H0F3ATables.cpp)\n- [PrimaryGroupTables.cpp](../FEXCore/Source/Interface/Core/X86Tables/PrimaryGroupTables.cpp)\n- [SecondaryGroupTables.cpp](../FEXCore/Source/Interface/Core/X86Tables/SecondaryGroupTables.cpp)\n- [SecondaryModRMTables.cpp](../FEXCore/Source/Interface/Core/X86Tables/SecondaryModRMTables.cpp)\n- [SecondaryTables.cpp](../FEXCore/Source/Interface/Core/X86Tables/SecondaryTables.cpp)\n- [VEXTables.cpp](../FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp)\n- [X86Tables.h](../FEXCore/Source/Interface/Core/X86Tables/X86Tables.h)\n- [X87Tables.cpp](../FEXCore/Source/Interface/Core/X86Tables/X87Tables.cpp)\n\n#### x86-to-ir\n- [AVX_128.cpp](../FEXCore/Source/Interface/Core/OpcodeDispatcher/AVX_128.cpp): Handles x86/64 AVX instructions to 128-bit IR\n- [Crypto.cpp](../FEXCore/Source/Interface/Core/OpcodeDispatcher/Crypto.cpp): Handles x86/64 Crypto instructions to IR\n- [Flags.cpp](../FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp): Handles x86/64 flag generation\n- [Vector.cpp](../FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp): Handles x86/64 Vector instructions to IR\n- [X87.cpp](../FEXCore/Source/Interface/Core/OpcodeDispatcher/X87.cpp): Handles x86/64 x87 to IR\n- [X87F64.cpp](../FEXCore/Source/Interface/Core/OpcodeDispatcher/X87F64.cpp): Handles x86/64 x87 to IR\n- [OpcodeDispatcher.cpp](../FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp): Handles x86/64 ops to IR, no-pf opt, local-flags opt\n\n\n\n### glue\nLogic that binds various parts together\n\n#### block-database\n- [LookupCache.cpp](../FEXCore/Source/Interface/Core/LookupCache.cpp): Stores information about blocks, and provides C++ implementations to lookup the blocks\n\n#### driver\nEmulation mainloop related glue logic\n- [Core.cpp](../FEXCore/Source/Interface/Core/Core.cpp): Glues Frontend, OpDispatcher and IR Opts & Compilation, LookupCache, Dispatcher and provides the Execution loop entrypoint\n\n#### log-manager\n- [LogManager.cpp](../FEXCore/Source/Utils/LogManager.cpp)\n\n#### thunks\n- [Thunks.h](../FEXCore/include/FEXCore/Core/Thunks.h)\n\n\n\n### ir\n\n#### debug\n- [IRDumperPass.cpp](../FEXCore/Source/Interface/IR/Passes/IRDumperPass.cpp): Prints IR\n\n#### dumper\nIR -> Text\n- [IRDumper.cpp](../FEXCore/Source/Interface/IR/IRDumper.cpp)\n\n#### emitter\nC++ Functions to generate IR. See IR.json for spec.\n- [IREmitter.cpp](../FEXCore/Source/Interface/IR/IREmitter.cpp)\n\n#### opts\nIR to IR Optimization\n- [PassManager.cpp](../FEXCore/Source/Interface/IR/PassManager.cpp): Defines which passes are run, and runs them\n- [PassManager.h](../FEXCore/Source/Interface/IR/PassManager.h)\n- [IRValidation.cpp](../FEXCore/Source/Interface/IR/Passes/IRValidation.cpp): Sanity checking pass\n- [RedundantFlagCalculationElimination.cpp](../FEXCore/Source/Interface/IR/Passes/RedundantFlagCalculationElimination.cpp)\n- [RegisterAllocationPass.cpp](../FEXCore/Source/Interface/IR/Passes/RegisterAllocationPass.cpp)\n- [RegisterAllocationPass.h](../FEXCore/Source/Interface/IR/Passes/RegisterAllocationPass.h)\n\n\n\n### opcodes\n\n#### cpuid\n- [CPUID.cpp](../FEXCore/Source/Interface/Core/CPUID.cpp): Handles presented capability bits for guest cpu\n\n#### dispatcher-implementations\n- [AVX_128.cpp](../FEXCore/Source/Interface/Core/OpcodeDispatcher/AVX_128.cpp): Handles x86/64 AVX instructions to 128-bit IR\n- [Crypto.cpp](../FEXCore/Source/Interface/Core/OpcodeDispatcher/Crypto.cpp): Handles x86/64 Crypto instructions to IR\n- [Flags.cpp](../FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp): Handles x86/64 flag generation\n- [Vector.cpp](../FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp): Handles x86/64 Vector instructions to IR\n- [X87.cpp](../FEXCore/Source/Interface/Core/OpcodeDispatcher/X87.cpp): Handles x86/64 x87 to IR\n- [X87F64.cpp](../FEXCore/Source/Interface/Core/OpcodeDispatcher/X87F64.cpp): Handles x86/64 x87 to IR\n- [OpcodeDispatcher.cpp](../FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp): Handles x86/64 ops to IR, no-pf opt, local-flags opt\n\n## ThunkLibs\nSee [ThunkLibs/README.md](../ThunkLibs/README.md) for more details\n\n### thunklibs\nThese are generated + glue logic 1:1 thunks unless noted otherwise\n\n#### EGL\n- [libEGL_Guest.cpp](../ThunkLibs/libEGL/libEGL_Guest.cpp): Depends on glXGetProcAddress thunk\n- [libEGL_Host.cpp](../ThunkLibs/libEGL/libEGL_Host.cpp)\n\n#### GL\n- [libGL_Guest.cpp](../ThunkLibs/libGL/libGL_Guest.cpp): Handles glXGetProcAddress\n- [libGL_Host.cpp](../ThunkLibs/libGL/libGL_Host.cpp): Uses glXGetProcAddress instead of dlsym\n\n#### SDL2\n- [libSDL2_Guest.cpp](../ThunkLibs/libSDL2/libSDL2_Guest.cpp): Handles sdlglproc, dload, stubs a few log fns\n- [libSDL2_Host.cpp](../ThunkLibs/libSDL2/libSDL2_Host.cpp)\n\n#### VDSO\n- [libVDSO_Guest.cpp](../ThunkLibs/libVDSO/libVDSO_Guest.cpp): Linux VDSO thunking\n\n#### Vulkan\n- [Guest.cpp](../ThunkLibs/libvulkan/Guest.cpp)\n- [Host.cpp](../ThunkLibs/libvulkan/Host.cpp)\n\n#### asound\n- [libasound_Guest.cpp](../ThunkLibs/libasound/libasound_Guest.cpp)\n- [libasound_Host.cpp](../ThunkLibs/libasound/libasound_Host.cpp)\n\n#### drm\n- [Guest.cpp](../ThunkLibs/libdrm/Guest.cpp)\n- [Host.cpp](../ThunkLibs/libdrm/Host.cpp)\n\n#### fex_malloc\n- [Guest.cpp](../ThunkLibs/libfex_malloc/Guest.cpp): Handles allocations between guest and host thunks\n- [Host.cpp](../ThunkLibs/libfex_malloc/Host.cpp): Handles allocations between guest and host thunks\n\n#### fex_malloc_loader\n- [Guest.cpp](../ThunkLibs/libfex_malloc_loader/Guest.cpp): Delays malloc symbol replacement until it is safe to run constructors\n\n#### fex_malloc_symbols\n- [Host.cpp](../ThunkLibs/libfex_malloc_symbols/Host.cpp): Allows FEX to export allocation symbols\n\n#### fex_thunk_test\n- [Guest.cpp](../ThunkLibs/libfex_thunk_test/Guest.cpp)\n- [Host.cpp](../ThunkLibs/libfex_thunk_test/Host.cpp)\n\n#### wayland-client\n- [Guest.cpp](../ThunkLibs/libwayland-client/Guest.cpp)\n- [Host.cpp](../ThunkLibs/libwayland-client/Host.cpp)\n\n#### xshmfence\n- [Guest.cpp](../ThunkLibs/libxshmfence/Guest.cpp)\n- [Host.cpp](../ThunkLibs/libxshmfence/Host.cpp)\n\n## Source/Tests\n\n## unittests\nSee [unittests/Readme.md](../unittests/Readme.md) for more details\n\n"
  },
  {
    "path": "docs/allocator_usage.md",
    "content": "# Dual allocator usage\nFEX-Emu uses two different heap allocators at once, each for different purposes:\n- rpmalloc: The primary heap allocator (to keep FEX's internal allocations out of the 32-bit address space used by guest applications)\n- jemalloc_glibc: The second heap allocator (to add allocation introspection features used by thunks)\n\n## rpmalloc - primary heap allocator\nThis allocator overrides `mmap` and `munmap` by forwarding them to FEXCore's internal VMA region allocator.\n\nAll of FEXCore's `fextl::` namespaced objects allocate memory with this method.\n\n### FEXCore internal VMA region allocator\nWhen running a 32-bit guest application, the VMA region allocator allocates from memory *above* the 4GB of virtual address space reserved for the\n32-bit application.\n\nThis ensures that all of FEX's allocations stay out of the lower 32-bit 4GB VA space, since games would quickly run out of virtual address space\notherwise.\n\nWhen running a 64-bit guest application, this VMA region allocator is disabled and passes through to mmap and munmap in the host kernel.\n\n## jemalloc_glibc - secondary heap allocator\nThis heap allocator replaces the host glibc's allocator using weak symbol overriding. It adds introspection features used for thunking, but has no\nfunctional differences otherwise: All memory is allocated in the 4GB of 32-bit address space. The FEXCore VMA region allocator is explicitly **not**\ninvolved hence.\n\nAll native shared libraries use this allocator including the host-side of thunks.\n\nInternally, all allocations that go through this heap allocator use the kernel mmap and munmap interface.\n\n### Thunks\nThunks may allocate memory either through the guest-side (on the guest glibc heap) or the host-side (on the `jemalloc_glibc` heap). To properly free\nthis memory, FEX must be able to determine which heap allocator it belongs to.\n\n`glibc` provides no public interface to do this, but FEX's `jemalloc` fork does. The `is_known_allocation` function is used by FEXCore to query\nwhether a given pointer originated from the `jemalloc_glibc` allocator. This enables FEXCore to determine the appropriate heap for freeing the\npointer.\n"
  },
  {
    "path": "unittests/32Bit_ASM/CMakeLists.txt",
    "content": "enable_language(ASM_NASM)\nif(NOT CMAKE_ASM_NASM_COMPILER_LOADED)\n  error(\"Failed to find NASM compatible assembler!\")\nendif()\n\n# Careful. Globbing can't see changes to the contents of files\n# Need to do a fresh clean to see changes\nfile(GLOB_RECURSE ASM_SOURCES CONFIGURE_DEPENDS *.asm)\n\nset(ASM_DEPENDS \"\")\n\nexecute_process(COMMAND \"python3\" \"${CMAKE_SOURCE_DIR}/Scripts/ClassifyCPU.py\"\n  OUTPUT_STRIP_TRAILING_WHITESPACE\n  OUTPUT_VARIABLE CPU_CLASS)\n\nforeach(ASM_SRC ${ASM_SOURCES})\n  file(RELATIVE_PATH REL_ASM ${CMAKE_SOURCE_DIR} ${ASM_SRC})\n  file(RELATIVE_PATH REL_TEST_ASM ${CMAKE_CURRENT_SOURCE_DIR} ${ASM_SRC})\n  get_filename_component(ASM_NAME ${ASM_SRC} NAME)\n  get_filename_component(ASM_DIR \"${REL_ASM}\" DIRECTORY)\n  set(OUTPUT_ASM_FOLDER \"${CMAKE_BINARY_DIR}/${ASM_DIR}\")\n\n  # Generate build directory\n  file(MAKE_DIRECTORY \"${OUTPUT_ASM_FOLDER}\")\n\n  # Generate a temporary file\n  set(ASM_TMP \"${ASM_NAME}_TMP.asm\")\n  set(TMP_FILE \"${OUTPUT_ASM_FOLDER}/${ASM_TMP}\")\n\n  add_custom_command(OUTPUT ${TMP_FILE}\n    DEPENDS \"${ASM_SRC}\"\n    COMMAND \"cp\" ARGS \"${ASM_SRC}\" \"${TMP_FILE}\"\n    COMMAND \"sed\" ARGS \"-i\" \"-e\" \"\\'1s;^;BITS 32\\\\norg 10000h\\\\nmov eax, 0x17\\\\nmov ds, ax\\\\nmov es, ax\\\\n;\\'\" \"-e\" \"\\'\\$\\$a\\\\ret\\\\n\\'\" \"${TMP_FILE}\")\n\n  set(OUTPUT_NAME \"${OUTPUT_ASM_FOLDER}/${ASM_NAME}.bin\")\n  set(OUTPUT_CONFIG_NAME \"${OUTPUT_ASM_FOLDER}/${ASM_NAME}.config.bin\")\n\n  add_custom_command(OUTPUT ${OUTPUT_NAME}\n    DEPENDS \"${TMP_FILE}\"\n    COMMAND \"nasm\" ARGS \"${TMP_FILE}\" \"-o\" \"${OUTPUT_NAME}\")\n\n  add_custom_command(OUTPUT ${OUTPUT_CONFIG_NAME}\n    DEPENDS \"${ASM_SRC}\"\n    DEPENDS \"${CMAKE_SOURCE_DIR}/Scripts/json_asm_config_parse.py\"\n    DEPENDS \"${CMAKE_SOURCE_DIR}/Scripts/json_config_parse.py\"\n    COMMAND \"python3\" ARGS \"${CMAKE_SOURCE_DIR}/Scripts/json_asm_config_parse.py\" \"${ASM_SRC}\" \"${OUTPUT_CONFIG_NAME}\")\n\n  list(APPEND ASM_DEPENDS \"${OUTPUT_NAME};${OUTPUT_CONFIG_NAME}\")\n\n  set(TEST_ARGS)\n  if (ARCHITECTURE_arm64 OR ENABLE_VIXL_SIMULATOR)\n    list(APPEND TEST_ARGS\n      \"FEX_SILENTLOG=0 FEX_DUMPGPRS=1 FEX_MAXINST=1 FEX_MULTIBLOCK=0 FEX_TSOENABLED=0\"   \"jit_1\"     \"jit\"\n      \"FEX_SILENTLOG=0 FEX_DUMPGPRS=1 FEX_MAXINST=500 FEX_MULTIBLOCK=0 FEX_TSOENABLED=0\" \"jit_500\"   \"jit\"\n      \"FEX_SILENTLOG=0 FEX_DUMPGPRS=1 FEX_MAXINST=500 FEX_MULTIBLOCK=1 FEX_TSOENABLED=0\" \"jit_500_m\" \"jit\")\n  endif()\n\n  if (ENABLE_VIXL_SIMULATOR)\n    set(CPU_CLASS Simulator)\n  elseif (ARCHITECTURE_x86_64)\n    list(APPEND TEST_ARGS \"FEX_SILENTLOG=0 FEX_DUMPGPRS=1\" \"host\" \"host\")\n  endif()\n\n  if (NOT MINGW)\n    set(LAUNCH_PROGRAM \"${CMAKE_BINARY_DIR}/Bin/TestHarnessRunner\")\n  else()\n    set(LAUNCH_PROGRAM \"wine\" \"${CMAKE_BINARY_DIR}/Bin/TestHarnessRunner.exe\")\n  endif()\n\n  list(LENGTH TEST_ARGS ARG_COUNT)\n  math(EXPR ARG_COUNT \"${ARG_COUNT}-1\")\n  foreach(Index RANGE 0 ${ARG_COUNT} 3)\n    math(EXPR TEST_NAME_INDEX \"${Index}+1\")\n    math(EXPR TEST_TYPE_INDEX \"${Index}+2\")\n\n    list(GET TEST_ARGS ${Index} FEX_ARGS)\n    list(GET TEST_ARGS ${TEST_NAME_INDEX} TEST_DESC)\n    list(GET TEST_ARGS ${TEST_TYPE_INDEX} TEST_TYPE)\n\n    set(TEST_NAME \"${TEST_DESC}/Test_32Bit_${REL_TEST_ASM}\")\n    string(REPLACE \" \" \";\" FEX_ARGS_LIST ${FEX_ARGS})\n    add_test(NAME ${TEST_NAME}\n      COMMAND \"python3\" \"${CMAKE_SOURCE_DIR}/Scripts/testharness_runner.py\"\n      \"${CMAKE_SOURCE_DIR}/unittests/32Bit_ASM/Known_Failures\"\n      \"${CMAKE_SOURCE_DIR}/unittests/32Bit_ASM/Known_Failures_${TEST_TYPE}\"\n      \"${CMAKE_SOURCE_DIR}/unittests/32Bit_ASM/Disabled_Tests\"\n      \"${CMAKE_SOURCE_DIR}/unittests/32Bit_ASM/Disabled_Tests_${TEST_TYPE}\"\n      \"${CMAKE_SOURCE_DIR}/unittests/32Bit_ASM/Disabled_Tests_${CPU_CLASS}\"\n      \"Test_32Bit_${REL_TEST_ASM}\"\n      \"${TEST_NAME}\"\n      ${LAUNCH_PROGRAM}\n      \"${OUTPUT_NAME}\" \"${OUTPUT_CONFIG_NAME}\")\n    # This will cause the ASM tests to fail if it can't find the TestHarness or ASMN files\n    # Prety crap way to work around the fact that tests can't have a build dependency in a different directory\n    # Just make sure to independently run `make all` then `make test`\n    set_property(TEST ${TEST_NAME} APPEND PROPERTY DEPENDS \"${CMAKE_BINARY_DIR}/Bin/TestHarnessRunner\")\n    set_property(TEST ${TEST_NAME} APPEND PROPERTY DEPENDS \"${OUTPUT_NAME}\")\n    set_property(TEST ${TEST_NAME} APPEND PROPERTY DEPENDS \"${OUTPUT_CONFIG_NAME}\")\n    set_property(TEST ${TEST_NAME} APPEND PROPERTY SKIP_RETURN_CODE 125)\n    set_property(TEST ${TEST_NAME} APPEND PROPERTY ENVIRONMENT ${FEX_ARGS_LIST})\n    if (MINGW)\n      # Ensure the DOS region can be allocated.\n      set_property(TEST ${TEST_NAME} APPEND PROPERTY ENVIRONMENT \"WINEPRELOADRESERVE=10000-110000\")\n    endif()\n  endforeach()\n\nendforeach()\n\nadd_custom_target(32bit_asm_files ALL\n  DEPENDS \"${ASM_DEPENDS}\")\n\nadd_custom_target(32bit_asm_tests\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  DEPENDS 32bit_asm_files\n  DEPENDS \"${CMAKE_BINARY_DIR}/Bin/TestHarnessRunner\"\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"302\" ${TEST_JOB_FLAG} \"-R\" \"\\.*32Bit\\.*.asm$$\")\n"
  },
  {
    "path": "unittests/32Bit_ASM/Disabled_Tests",
    "content": "# Relies on undefined behaviour\nTest_32Bit_X87/D9_F9.asm\n\nTest_32Bit_X87/D9_F2.asm\n\n# Relies on rounding correctness\nTest_32Bit_X87/D9_F8.asm\n"
  },
  {
    "path": "unittests/32Bit_ASM/Disabled_Tests_Simulator",
    "content": "# Simulator can't handle `mrs x0, nzcv`\nTest_32Bit_SecondaryModRM/Reg_7_1.asm\n"
  },
  {
    "path": "unittests/32Bit_ASM/Disabled_Tests_host",
    "content": "# 32-bit segment pushing and popping causes the runner to break\n# We aren't 100% matching behaviour\nTest_32Bit_Primary/Pop_Segments.asm\n\n# Hecks with GS, FS, and ES\n# Causing the signal handler delegate to break\nTest_32Bit_Primary/Primary_8C.asm\nTest_32Bit_Primary/Primary_8C_2.asm\n\n# Hecks with CS\n# Causing our host runner a bit of pain\nTest_32Bit_Primary/Primary_CF.asm\n\n# Zen+ CI doesn't support UMIP so it returns \"real\" values\nTest_32Bit_Secondary/07_XX_00.asm\n"
  },
  {
    "path": "unittests/32Bit_ASM/FEX_bugs/GOT_calculation.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x10013\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Preamble (32Bit_ASM/CMakeLists.txt) sets ES and changes expectation.\n; Originally 0x10011, now 0x10013.\n\nmov esp, 0xe0000010\n\n; This is a common pattern in 32-bit PIE code.\n; 32-bit GOT calculation needs to do a call+pop to do get the EIP.\n; LEA doesn't work because it there is no EIP relative ops like on x86-64.\n\ncall target\ntarget:\npop eax\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/FEX_bugs/IMUL_garbagedata.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x000000007dbf2800\",\n    \"RDX\": \"0x0000000000000000\",\n    \"RBX\": \"0x000000000000004f\",\n    \"RCX\": \"0x000000000000004f\",\n    \"RBP\": \"0x0000000000009e4f\",\n    \"RSI\": \"0x0000000000009e4f\",\n    \"RSP\": \"0x000000000000004f\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; FEX had a bug where smaller than 64-bit imul could leave garbage data in the upper 32-bits of the 32-bit result.\n; This would cause subsequent instructions after the imul to receive garbage bits.\n; In particular this would feed in to address calculation in DXVK with \"Dungeon Defenders\" doing address calculation.\n; The address calculation did something similar to:\n;   xor edx, edx\n;   mov eax, 0x7dbf2800\n;   imul ebx, ebx, 0xaaaaaaab\n;   div ebx\n; Divide expected 0x4f but received 0xffffffb1'0000'004f\n\n; Dividend\nxor edx, edx\nmov eax, 0x7dbf2800\n\n; Multiply starting value\nmov ebx, 0xED\n\njmp .test\n\n.test:\n\n; imul 1-src\nmov edi, 0xaaaaaaab\nimul di, bx\nmov esp, 0xaaaaaaab\nimul esp, ebx\n\n; imul 2-src 8-bit check\nimul bp, bx, 0xab\nimul esi, ebx, 0xab\n\n; imul 2-src 16-bit check\nimul cx, bx, 0xaaab\nimul ebx, ebx, 0xaaaaaaab\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/FEX_bugs/InlineSyscall.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; FEX 32-bit inline syscalls hit an assert in uxtw\n; Just use an inline syscall and throw it zero data to catch the assert\nmov eax, 355 ; getrandom, is an inline syscall\nmov ebx, 0\nmov ecx, 0\nmov edx, 0\nint 0x80\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/FEX_bugs/InvertedCarrySet.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; FEX had a bug where inverting CF to match the ABI when flushing the register cache didn't mark CF as possibly being set.\n; This caused accesses relying on that flag to be set correctly to return wrong values.\n\nmov esp, 0xe0000020\nmov al, 3\nmov cl, 2\nmov ecx, 1\nmov eax, 1\n\nand al, cl ; Zeros CF, non-inverted\npush ecx ; Triggers a register cache flush\ninc eax ; Tries to preserve CF, but would encounter the bug and set it instead\njnb succ\nmov eax, 0\nhlt\nsucc:\nmov eax, 1\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/FEX_bugs/LoopAddressSizeCheck.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000000000001\",\n    \"RBX\": \"0x0000000000010001\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; FEX-Emu had a bug where a16 loop instructions weren't treating the input RCX register as 16-bit.\n; Effectively always treating it as 32-bit.\n; Little test that operates at 16-bit and 32-bit sizes to ensure it is correctly handled.\nmov eax, 0\nmov ebx, 0\nmov ecx, 0x0001_0001\n\n.test:\ninc eax\na16 loop .test\n\nmov ecx, 0x0001_0001\n.test2:\ninc ebx\na32 loop .test2\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/FEX_bugs/SignExtendBug.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344\",\n    \"RBX\": \"0x41424344\",\n    \"RCX\": \"0x51525354\"\n  },\n  \"MemoryRegions\": {\n    \"0x00fd0000\": \"4096\",\n    \"0xf0000000\": \"4096\"\n  },\n  \"MemoryData\": {\n    \"0xf0000000\": \"0x41424344\",\n    \"0x00fd0000\": \"0x51525354\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Ensures that zero extension of addresses are adhered to.\nlea eax, [0xf000_0000]\nmov eax, [ds:eax]\n\n; Ensures that zext occurs correctly with two registers that have the sign bit set.\nmov ebx, 0xffff_ffff\nmov ecx, 0xf000_0001\n\n; Break the block so it can't optimize through.\njmp .test\n.test:\nmov ebx, [ebx+ecx]\n\n; Ensures that zext occurs correctly with SIB indexing with second argument not having sign bit set but \"index\" having sign bit.\n; Originally saw in Metal Gear Rising Revengeance with a `jmp dword [ecx*4+0xfdbf10]` instruction.\n; With ecx = 0xfffffff4 = -12. This is them loading a switch table's branches just before the switch base.\nmov ecx, -12\n\n; Break the block so it can't optimize through.\njmp .test2\n.test2:\n\nmov ecx, [ecx*4+0x00fd_0030]\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/FEX_bugs/SubAddrBug.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xdeadbeef\"\n  },\n  \"MemoryRegions\": {\n    \"0x10000000\": \"4096\"\n  },\n  \"MemoryData\": {\n    \"0x10000000\": \"0xdeadbeef\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nsection .text\n\nlea eax, [0x10000040]\nmov eax, [eax-0x40]\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/FEX_bugs/TelemetryFlags.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000000011000\",\n    \"RCX\": \"0x0000000051529654\",\n    \"RDX\": \"0x0000000061626303\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; FEX-Emu had a bug with its `TelemetrySetValue` IR operation where it would corrupt host flags at an inopportune time.\n; The IR operation does `cmp+cset`, but even with `ImplicitFlagClobber` set, this happened at a invalid time for flag handling.\n; To test this:\n;  - btr -> Sets CF\n;  - adc with `ss:` -> Adds to register with carry, but `ss:` causes `TelemetrySetValue`.\n;  - Host flags are corrupted after the `TelemetrySetValue`, before the `adc` was able to operate.\n\nmov ecx, 0x51525354\nmov edx, 0x61626303\n\nlea eax, [.data]\nlea esp, [.data_flags]\npopf\n\nand word [eax], dx\nbtr cx, dx\nadc cx, ss:[eax]\n\nhlt\n\nalign 4096\n\n.data:\ndd 0x41424344\n\n.data_flags:\ndd 0xfeff\n"
  },
  {
    "path": "unittests/32Bit_ASM/FEX_bugs/VEXW_Bug.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000000000004\",\n    \"RBX\": \"0x0000000000000004\",\n    \"RCX\": \"0x0000000000000006\",\n    \"RDX\": \"0x0000000000000006\",\n    \"XMM0\": [\"0x402f800000000000\", \"0x400c000000000000\"],\n    \"XMM1\": [\"0x402f800000000000\", \"0x4035400000000000\"],\n    \"XMM2\": [\"0x0000000045464748\", \"0\"],\n    \"XMM3\": [\"0x4142434445464748\", \"0\"],\n    \"XMM4\": [\"0x0000000041424344\", \"0\"],\n    \"XMM5\": [\"0x0000000045464748\", \"0x5152535455565758\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; FEX-Emu had a bug where 32-bit applications that relied on VEX.W would incorrectly handle widening behaviour.\n; AVX instructions that use VEX.W wouldn't scale their element sizes correctly.\n; Checks all instructions (skipping a few duplicates in the same class) that react to VEX.W.\n\nvmovaps xmm0, [rel .data_xmm0]\nvmovaps xmm1, [rel .data_xmm1]\nvmovaps xmm2, [rel .data_xmm2]\n\n; Affects all scalar FMA.\nvfmadd132sd xmm0, xmm2, xmm1\n\n; Affects all packed FMA.\nvmovaps xmm1, [rel .data_xmm0]\nvmovaps xmm2, [rel .data_xmm1]\nvmovaps xmm3, [rel .data_xmm2]\nvfmadd132pd xmm1, xmm3, xmm2\n\nvmovaps xmm2, [rel .data_xmm0]\n; Affects vcvttsd2si as well.\nvcvtsd2si eax, xmm2\n; This actually works on 32-bit, behaves like a 32-bit operation. Don't question it.\ndb 0xc4, 0xe1, 0xfb, 0x2d, 0xda; vcvtsd2si rbx, xmm2\n\nvmovaps xmm2, [rel .data_6]\n; Affects vcvttss2si as well.\nvcvtss2si ecx, xmm2\n; This actually works on 32-bit, behaves like a 32-bit operation. Don't question it.\ndb 0xc4, 0xe1, 0xfa, 0x2d, 0xd2  ; vcvtss2si rdx, xmm2\n\nvmovaps xmm2, [rel .data_test]\nvmovd dword [rel .data_temp], xmm2\nvmovaps xmm2, [rel .data_temp]\n\nvmovaps xmm3, [rel .data_test]\nvmovq qword [rel .data_temp], xmm3\nvmovaps xmm3, [rel .data_temp]\n\nvpxor xmm7, xmm7, xmm7\nvmovaps [rel .data_temp], xmm7\n\n; vpextrq qword explicitly SIGILLs on 32-bit\nvmovaps xmm4, [rel .data_test]\nvpextrd dword [rel .data_temp], xmm4, 1\nvmovaps xmm4, [rel .data_temp]\n\nvmovaps [rel .data_temp], xmm7\n\n; vpinsrq qword explicitly SIGILLs on 32-bit\nvmovaps xmm5, [rel .data_test]\nvpinsrd xmm5, dword [rel .data_temp + 8], 1\n\nhlt\n\nalign 4096\n.data_xmm0:\ndq 0x400c000000000000, 0x400c000000000000\n.data_xmm1:\ndq 0x400c000000000000, 0x4012000000000000\n.data_xmm2:\ndq 0x400c000000000000, 0x4016000000000000\n\n.data_test:\ndq 0x4142434445464748, 0x5152535455565758\n\n.data_6:\ndd 6.0, 6.0, 6.0, 6.0\n\n.data_temp:\ndq 0, 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/FEX_bugs/adc.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x00000000fffffffe\",\n    \"RBX\": \"0x0000000000000001\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; FEX had a bug where ADD or SUB with carry was generating results with garbage in the upper 32-bits.\n\nmov eax, -1\nmov ebx, -1\nmov edx, -1\n\nclc\nadc eax, edx\nadc eax, edx\nadc eax, edx\n\nclc\nsbb ebx, edx\nsbb ebx, edx\nsbb ebx, edx\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/FEX_bugs/rep_lods_bug.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x52\",\n    \"RBX\": \"0x202\",\n    \"RCX\": \"0\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; FEX had a bug that only manifests in 32-bit mode around pushing and popping flags around rep lobs{b,w,d,q}\n; This manifested as a corrupt CF and ZF flag even though rep lodsb isn't supposed to affect flags.\n; Test this by first storing zero to eflags, doing the operation and then loading it back.\nmov esi, 0xe000_0000\nmov esp, 0xe000_0800\n\nmov eax, 0x41424344\nmov [esi], eax\n\nmov eax, 0x51525354\nmov [esi + 4], eax\n\nmov eax, 0\nmov ecx, 7\n\n; Push zero and then load back in to eflags.\npush dword 0\npopfd\n\n; Do a rep lodsb, whichever size, doesn't matter.\nrep lodsb\n\n; Push flags and then load back in to ebx\npushfd\npop dword ebx\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/FEX_bugs/x87_unordered_cmp_fix_32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xcafecafe\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; IsNan() couldn't detect negative NaNs (sign bit set in exponent field).\n; This caused __builtin_isunordered() to return wrong values.\n\nmov esp, 0xe000_1000\n\n; Test 1: __builtin_isunordered(1.0, 2.0) should return 0\n; Pattern: fucomip + setp + test for 0\nfld1\nlea edx, [two]\nfld tword [edx]\nfucomip st1\nsetp al\nmovzx eax, al\ntest eax, eax\njnz test_failed         ; If not 0, test failed (should be ordered)\n\n; Test 2: __builtin_isunordered(1.0, NaN) should return 1  \nfld1\nlea edx, [qnan]\nfld tword [edx]\nfucomip st1\nsetp al\nmovzx eax, al\ntest eax, eax\njz test_failed          ; If 0, test failed (should be unordered)\n\n; Test 3: __builtin_isunordered(NaN, 1.0) should return 1\nlea edx, [qnan]\nfld tword [edx]\nfld1\nfucomip st1\nsetp al\nmovzx eax, al\ntest eax, eax\njz test_failed          ; If 0, test failed (should be unordered)\n\n; Test 4: __builtin_isunordered(2.0, 2.0) should return 0 (equal case)\nlea edx, [two]\nfld tword [edx]\nlea edx, [two]\nfld tword [edx]\nfucomip st1\nsetp al\nmovzx eax, al\ntest eax, eax\njnz test_failed         ; If not 0, test failed (should be ordered)\n\n; All tests passed\nmov eax, 0xcafecafe\nhlt\n\ntest_failed:\n; Test failed \nmov eax, 0xdeadbeef\nhlt\n\nalign 8\ntwo:\n  dt 2.0\n\nalign 8  \nqnan:\n  dq 0xC000000000000000  ; Quiet NaN with only quiet bit set (no bottom 62 bits) - this breaks IsNan\n  dw 0x7FFF              ; Standard NaN exponent (0x7FFF)"
  },
  {
    "path": "unittests/32Bit_ASM/Known_Failures",
    "content": "Test_32Bit_X87/D9_F8.asm\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Loops.asm",
    "content": "%ifdef CONFIG\n{\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov ecx, 0x10\n.loop:\ndec ecx\ntest ecx, ecx\njnz .loop\n.end:\n\nmov ecx, 0x10\n.loop2:\ndec ecx\ntest ecx, ecx\njz .end2\njmp .loop2\n\n.end2:\nhlt"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Pop_Segments.asm",
    "content": "\n%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RSP\": \"0xE0000040\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov esp, 0xe0000040\nmov eax, 0\n\npush eax\npush eax\npush eax\npush eax\npush eax\n\npush ax\npush ax\npush ax\npush ax\npush ax\n\n; Only pops the segments\n; Doesn't check for a correct segment value\n; Just ensures we are popping the correct amount of data\npop ss\npop ds\npop es\npop fs\npop gs\n\no16 pop ss\no16 pop ds\no16 pop es\no16 pop fs\no16 pop gs\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424315\",\n    \"RBX\": \"0x51525425\",\n    \"RCX\": \"0x61626435\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov esp, 0xe0000000\n\nmov eax, 0x41424344\nmov [esp + 4 * 0], eax\nmov eax , 0x51525354\nmov [esp + 4 * 1], eax\nmov eax, 0x61626364\nmov [esp + 4 * 2], eax\n\nmov eax, 0xD1\nadd byte  [esp + 4 * 0], al\nadd word  [esp + 4 * 1], ax\nadd dword [esp + 4 * 2], eax\n\nmov eax, [esp + 4 * 0]\nmov ebx, [esp + 4 * 1]\nmov ecx, [esp + 4 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_00_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xB5\",\n    \"RBX\": \"0x53D5\",\n    \"RCX\": \"0x616263F5\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov esp, 0xe0000000\n\nmov eax, 0x41424344\nmov [esp + 4 * 0], eax\nmov eax , 0x51525354\nmov [esp + 4 * 1], eax\nmov eax, 0x61626364\nmov [esp + 4 * 2], eax\n\nmov eax, 0x71\nmov ebx, 0x81\nmov ecx, 0x91\n\nadd al,  byte  [esp + 4 * 0]\nadd bx,  word  [esp + 4 * 1]\nadd ecx, dword [esp + 4 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_00_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x81\",\n    \"RBX\": \"0x8081\",\n    \"RCX\": \"0x80808081\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov eax, 0x01\nadd al, 0x80\n\nmov ebx, 0x01\nadd bx, 0x8080\n\nmov ecx, 0x01\nadd ecx, 0x80808080\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_27.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x12345637\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov eax, 0x1234561f\ndaa\ndaa\ndaa\ndaa\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_2F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x12345607\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov eax, 0x1234561f\ndas\ndas\ndas\ndas\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_37.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x12345a07\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov eax, 0x1234561f\naaa\naaa\naaa\naaa\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_3F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x12345107\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov eax, 0x1234561f\naas\naas\naas\naas\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_60.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x6\",\n    \"RCX\": \"0x5\",\n    \"RDX\": \"0x4\",\n    \"RSP\": \"0xE0000020\",\n    \"RBX\": \"0x3\",\n    \"RBP\": \"0x2\",\n    \"RSI\": \"0x1\",\n    \"RDI\": \"0x0\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov esp, 0xe0000020\n\nmov eax, 0\nmov ecx, 1\nmov edx, 2\nmov ebx, 3\nmov ebp, 4\nmov esi, 5\nmov edi, 6\n\npushad\n\n; Invert the order\n\nmov eax, [esp + 4 * 0]\nmov ecx, [esp + 4 * 1]\nmov edx, [esp + 4 * 2]\n; sp here\nmov ebx, [esp + 4 * 4]\nmov ebp, [esp + 4 * 5]\nmov esi, [esp + 4 * 6]\nmov edi, [esp + 4 * 7]\n\n; Load sp last\nmov esp, [esp + 4 * 3]\n\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_60_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x6\",\n    \"RCX\": \"0x5\",\n    \"RDX\": \"0x4\",\n    \"RSP\": \"0xE0000020\",\n    \"RBX\": \"0x3\",\n    \"RBP\": \"0x2\",\n    \"RSI\": \"0x1\",\n    \"RDI\": \"0x0\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov esp, 0xe0000020\n\nmov eax, 0\nmov ecx, 1\nmov edx, 2\nmov ebx, 3\nmov ebp, 4\nmov esi, 5\nmov edi, 6\n\n; operand-size override prefix\n; Nasm complains if o16 is used\n; `warning: invalid operand size prefix o16, must be o32`\ndb 0x66\npusha\n\n; Invert the order\nmov ax, [esp + 2 * 0]\nmov cx, [esp + 2 * 1]\nmov dx, [esp + 2 * 2]\n; sp here\nmov bx, [esp + 2 * 4]\nmov bp, [esp + 2 * 5]\nmov si, [esp + 2 * 6]\nmov di, [esp + 2 * 7]\n\n; Load sp last\nmov sp, [esp + 2 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_61.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x6\",\n    \"RCX\": \"0x5\",\n    \"RDX\": \"0x4\",\n    \"RSP\": \"0xE0000020\",\n    \"RBX\": \"0x3\",\n    \"RBP\": \"0x2\",\n    \"RSI\": \"0x1\",\n    \"RDI\": \"0x0\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov esp, 0xe0000020\n\npush dword 0x6\npush dword 0x5\npush dword 0x4\npush dword 0x3\npush dword 0x41424344 ; Skipped\npush dword 0x2\npush dword 0x1\npush dword 0x0\n\npopad\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_61_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFF0006\",\n    \"RCX\": \"0x5\",\n    \"RDX\": \"0x4\",\n    \"RSP\": \"0xE0000020\",\n    \"RBX\": \"0x3\",\n    \"RBP\": \"0x2\",\n    \"RSI\": \"0x1\",\n    \"RDI\": \"0x0\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov esp, 0xe0000020\n\nmov eax, 0xFF0000\nmov ecx, 0xFF\nmov edx, 0xFF\nmov ebx, 0xFF\nmov ebp, 0xFF\nmov esi, 0xFF\nmov edi, 0xFF\n\npush word 0x6\npush word 0x5\npush word 0x4\npush word 0x3\npush word 0x4142 ; Skipped\npush word 0x2\npush word 0x1\npush word 0x0\n\n; operand-size override prefix\n; Nasm complains if o16 is used\n; `warning: invalid operand size prefix o16, must be o32`\ndb 0x66\npopa\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_8C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFF0033\",\n    \"RBX\": \"0xFFFF0033\",\n    \"RCX\": \"0xFFFF0033\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov eax, 0x33\nmov gs, ax\nmov fs, ax\nmov es, ax\n\nmov eax, 0xFFFFFFFF\nmov ebp, 0xe0000000\n\n; Store 32bits of data\nmov dword [ebp + 0], eax\nmov dword [ebp + 4], eax\nmov dword [ebp + 8], eax\n\n; Ensure that the segment store only writes 16-bits\nmov word [ebp + 0], gs\nmov word [ebp + 4], fs\nmov word [ebp + 8], es\n\nmov eax, 0\nmov ebx, 0\nmov ecx, 0\nmov eax, dword [ebp + 0]\nmov ebx, dword [ebp + 4]\nmov ecx, dword [ebp + 8]\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_8C_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFF0033\",\n    \"RBX\": \"0x33\",\n    \"RCX\": \"0x33\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov eax, 0x33\nmov gs, ax\nmov fs, ax\nmov es, ax\n\nmov eax, 0xFFFFFFFF\nmov ebx, 0xFFFFFFFF\nmov ecx, 0xFFFFFFFF\n\n; 16-bit insert\nmov ax, gs\n; 32-bit zext\nmov ebx, fs\nmov ecx, es\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_8D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4000\",\n    \"RBX\": \"0x4000\",\n    \"RCX\": \"0x8000\",\n    \"RDX\": \"0x9000\",\n    \"RSI\": \"0x7FC0\",\n    \"RSP\": \"0xFFFF7FC0\",\n    \"RBP\": \"0x1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov eax, 0\nmov ebx, 0\nmov esp, -1\n\n; Specific encoded `lea ax, [0x4000]`\n; Operand size override and address size override\n; Nasm doesn't seem to emit this at all\ndb 0x67, 0x66, 0x8d, 0x06, 0x00, 0x40\n\nlea bx, [0xC000]\nlea si, [0x4001]\n\nmov ebp, 0\n; Try to LEA past the 16bits\nlea ebp, [bx + si]\n\nlea bx, [0x4000]\nlea si, [0x4000]\n\n; Address size override and Operand size overrides\nlea cx, [bx + si]\nlea dx, [bx + si + 0x1000]\nlea sp, [bx + si - 64]\n\n; Address size override without operand size override\nlea esi, [bx + si - 64]\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_A0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"0xFFFF0042\",\n    \"RDX\": \"0x42\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\nmov eax, 0x42\nmov [edx], eax\n\nmov eax, -1\n; mov eax, [0xe0000000]\ndb 0xA1\ndd 0xe0000000\nmov edx, eax\n\nmov eax, -1\n; mov ax, [0xe0000000]\ndb 0x66\ndb 0xA1\ndd 0xe0000000\nmov ecx, eax\n\n; We can't actually test this one since we can't allocate memory in the lower 16bits\n;mov eax, -1\n;; mov ax, [0xe00]\n;db 0x67\n;db 0x66\n;db 0xA1\n;dw 0xe00\n;mov ebx, eax\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_A2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"0x43\",\n    \"RDX\": \"0x42\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov eax, 0x42\n; mov [0xe0000000], eax\ndb 0xA3\ndd 0xe0000000\n\nmov edx, 0xe0000000\nmov edx, [edx]\n\nmov eax, 0xFFFF0043\n; mov [0xe0000000], ax\ndb 0x66\ndb 0xA3\ndd 0xe0000000\n\nmov ecx, 0xe0000000\nmov ecx, [ecx]\n\n; We can't actually test this one since we can't allocate memory in the lower 16bits\n;mov eax, 0xFFFF0044\n;; mov [0xe000], ax\n;db 0x57\n;db 0x66\n;db 0xA3\n;dw 0xe000\n;\n;mov ebx, 0xe000\n;mov ebx, [ebx]\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_A6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x8300\",\n    \"RDI\": \"0xE0000009\",\n    \"RSI\": \"0xE0000001\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n\nmov eax, 0x47\nmov [edx + 8 * 0], eax\nmov eax, 0x61\nmov [edx + 8 * 1], eax\n\nlea edi, [edx + 8 * 1]\nlea esi, [edx + 8 * 0]\n\ncld\ncmpsb\n; cmp = 0x47 - 0x61 = 0xE6\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\n\nmov eax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_A6_REP.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0200\",\n    \"RCX\": \"0x5\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000005\",\n    \"RSI\": \"0xE0000015\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n%macro copy 3\n  ; Dest, Src, Size\n  mov edi, %1\n  mov esi, %2\n  mov ecx, %3\n\n  mov eax, 0x17\n  mov es, eax\n  mov ds, eax\n\n  cld\n  rep movsb\n%endmacro\n\nmov edx, 0xe0000000\n\nlea ebx, [edx + 8 * 0]\nlea ebp, .StringOne\ncopy ebx, ebp, 11\n\nlea ebx, [edx + 8 * 2]\nlea ebp, .StringTwo\ncopy ebx, ebp, 14\n\nlea edi, [edx + 8 * 0]\nlea esi, [edx + 8 * 2]\n\ncld\nmov ecx, 10\nrepe cmpsb\nmov eax, 0\nlahf\n\nmov edx, 0\nsete dl\n\nhlt\n\n.StringOne: db \"TestString\\0\"\n.StringTwo: db \"TestUnmatched\\0\"\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_A6_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4600\",\n    \"RCX\": \"0x3\",\n    \"RDX\": \"0x1\",\n    \"RDI\": \"0xE0000007\",\n    \"RSI\": \"0xE0000017\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n%macro copy 3\n  ; Dest, Src, Size\n  mov edi, %1\n  mov esi, %2\n  mov ecx, %3\n\n  mov eax, 0x17\n  mov es, eax\n  mov ds, eax\n\n  cld\n  rep movsb\n%endmacro\n\nmov edx, 0xe0000000\n\nlea ebx, [edx + 8 * 0]\nlea ebp, .StringOne\ncopy ebx, ebp, 11\n\nlea ebx, [edx + 8 * 2]\nlea ebp, .StringTwo\ncopy ebx, ebp, 11\n\nlea edi, [edx + 8 * 0]\nlea esi, [edx + 8 * 2]\n\ncld\nmov ecx, 10\nrepne cmpsb\nmov eax, 0\nlahf\n\nmov edx, 0\nsete dl\n\nhlt\n\n.StringOne: db \"StringTest\\0\"\n.StringTwo: db \"UnmatcTest\\0\"\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_A6_REPNE_Equal.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4600\",\n    \"RCX\": \"0x0\",\n    \"RDX\": \"0x1\",\n    \"RDI\": \"0xE000000A\",\n    \"RSI\": \"0xE000001A\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n%macro copy 3\n  ; Dest, Src, Size\n  mov edi, %1\n  mov esi, %2\n  mov ecx, %3\n\n  mov eax, 0x17\n  mov es, eax\n  mov ds, eax\n\n  cld\n  repne movsb\n%endmacro\n\nmov edx, 0xe0000000\n\nlea ebx, [edx + 8 * 0]\nlea ebp, .StringOne\ncopy ebx, ebp, 11\n\nlea ebx, [edx + 8 * 2]\nlea ebp, .StringTwo\ncopy ebx, ebp, 11\n\nlea edi, [edx + 8 * 0]\nlea esi, [edx + 8 * 2]\n\ncld\nmov ecx, 10\nrepe cmpsb\nmov eax, 0\nlahf\n\nmov edx, 0\nsete dl\n\nhlt\n\n.StringOne: db \"TestString\\0\"\n.StringTwo: db \"TestString\\0\"\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_A6_REP_Equal.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4600\",\n    \"RCX\": \"0x0\",\n    \"RDX\": \"0x1\",\n    \"RDI\": \"0xE000000A\",\n    \"RSI\": \"0xE000001A\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n%macro copy 3\n  ; Dest, Src, Size\n  mov edi, %1\n  mov esi, %2\n  mov ecx, %3\n\n  mov eax, 0x17\n  mov es, eax\n  mov ds, eax\n\n  cld\n  rep movsb\n%endmacro\n\nmov edx, 0xe0000000\n\nlea ebx, [edx + 8 * 0]\nlea ebp, .StringOne\ncopy ebx, ebp, 11\n\nlea ebx, [edx + 8 * 2]\nlea ebp, .StringTwo\ncopy ebx, ebp, 11\n\nlea edi, [edx + 8 * 0]\nlea esi, [edx + 8 * 2]\n\ncld\nmov ecx, 10\nrepe cmpsb\nmov eax, 0\nlahf\n\nmov edx, 0\nsete dl\n\nhlt\n\n.StringOne: db \"TestString\\0\"\n.StringTwo: db \"TestString\\0\"\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_A6_REP_Smaller.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0600\",\n    \"RCX\": \"0x5\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000005\",\n    \"RSI\": \"0xE0000015\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n%macro copy 3\n  ; Dest, Src, Size\n  mov edi, %1\n  mov esi, %2\n  mov ecx, %3\n\n  mov eax, 0x17\n  mov es, eax\n  mov ds, eax\n\n  cld\n  rep movsb\n%endmacro\n\nmov edx, 0xe0000000\n\nlea ebx, [edx + 8 * 0]\nlea ebp, .StringOne\ncopy ebx, ebp, 11\n\nlea ebx, [edx + 8 * 2]\nlea ebp, .StringTwo\ncopy ebx, ebp, 14\n\nlea edi, [edx + 8 * 0]\nlea esi, [edx + 8 * 2]\n\ncld\nmov ecx, 10\nrepe cmpsb\nmov eax, 0\nlahf\n\nmov edx, 0\nsete dl\n\nhlt\n\n.StringOne: db \"TestString\\0\"\n.StringTwo: db \"Test\\0\"\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_A6_REP_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x8300\",\n    \"RCX\": \"0x9\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE000000C\",\n    \"RSI\": \"0xE000001C\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n%macro copy 3\n  ; Dest, Src, Size\n  mov edi, %1\n  mov esi, %2\n  mov ecx, %3\n\n  mov eax, 0x17\n  mov es, eax\n  mov ds, eax\n\n  cld\n  rep movsb\n%endmacro\n\nmov edx, 0xe0000000\n\nlea ebx, [edx + 8 * 0]\nlea ebp, .StringOne\ncopy ebx, ebp, 14\n\nlea ebx, [edx + 8 * 2]\nlea ebp, .StringTwo\ncopy ebx, ebp, 14\n\nlea edi, [edx + 8 * 0 + 13]\nlea esi, [edx + 8 * 2 + 13]\n\nstd\nmov ecx, 10\nrepe cmpsb\nmov eax, 0\nlahf\n\nmov edx, 0\nsete dl\n\nhlt\n\n.StringOne: db \"\\0\\0\\0\\0TestString\"\n.StringTwo: db \"\\0TestUnmatched\"\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_A6_REP_down_Equal.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4600\",\n    \"RCX\": \"0x0\",\n    \"RDX\": \"0x1\",\n    \"RDI\": \"0xDFFFFFFF\",\n    \"RSI\": \"0xE000000F\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n%macro copy 3\n  ; Dest, Src, Size\n  mov edi, %1\n  mov esi, %2\n  mov ecx, %3\n\n  mov eax, 0x17\n  mov es, eax\n  mov ds, eax\n\n  cld\n  rep movsb\n%endmacro\n\nmov edx, 0xe0000000\n\nlea ebx, [edx + 8 * 0]\nlea ebp, .StringOne\ncopy ebx, ebp, 11\n\nlea ebx, [edx + 8 * 2]\nlea ebp, .StringTwo\ncopy ebx, ebp, 11\n\nlea edi, [edx + 8 * 0 + 10]\nlea esi, [edx + 8 * 2 + 10]\n\nstd\nmov ecx, 11\nrepe cmpsb\nmov eax, 0\nlahf\n\nmov edx, 0\nsete dl\n\nhlt\n\n.StringOne: db \"\\0TestString\"\n.StringTwo: db \"\\0TestString\"\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_A6_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1200\",\n    \"RDI\": \"0xE0000007\",\n    \"RSI\": \"0xDFFFFFFF\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n\nmov eax, 0x61\nmov [edx + 8 * 0], eax\nmov eax, 0x47\nmov [edx + 8 * 1], eax\n\nlea edi, [edx + 8 * 1]\nlea esi, [edx + 8 * 0]\n\nstd\ncmpsb\n; cmp = 0x47 - 0x61 = 0xE6\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\n\nmov eax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_A7_dword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1600\",\n    \"RDI\": \"0xE000000C\",\n    \"RSI\": \"0xE0000004\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n\nmov eax, 0x61626364\nmov [edx + 8 * 0], eax\nmov eax, 0x55565758\nmov [edx + 8 * 1], eax\n\nlea edi, [edx + 8 * 1]\nlea esi, [edx + 8 * 0]\n\ncld\ncmpsd\n; cmp = 0x55565758 - 0x61626364 = 0xF3F3F3F4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\nmov eax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_A7_dword_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1600\",\n    \"RDI\": \"0xE0000004\",\n    \"RSI\": \"0xDFFFFFFC\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n\nmov eax, 0x61626364\nmov [edx + 8 * 0], eax\nmov eax, 0x55565758\nmov [edx + 8 * 1], eax\n\nlea edi, [edx + 8 * 1]\nlea esi, [edx + 8 * 0]\n\nstd\ncmpsd\n; cmp = 0x55565758 - 0x61626364 = 0xF3F3F3F4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\nmov eax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_A7_word.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1200\",\n    \"RDI\": \"0xE000000A\",\n    \"RSI\": \"0xE0000002\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n\nmov eax, 0x6162\nmov [edx + 8 * 0], eax\nmov eax, 0x4546\nmov [edx + 8 * 1], eax\n\nlea edi, [edx + 8 * 1]\nlea esi, [edx + 8 * 0]\n\ncld\ncmpsw\n; cmp = 0x4546 - 0x6162 = 0xE3E4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000111\n; OF: LAHF doesn't load - 0\n\nmov eax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_A7_word_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1200\",\n    \"RDI\": \"0xE0000006\",\n    \"RSI\": \"0xDFFFFFFE\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n\nmov eax, 0x6162\nmov [edx + 8 * 0], eax\nmov eax, 0x4546\nmov [edx + 8 * 1], eax\n\nlea edi, [edx + 8 * 1]\nlea esi, [edx + 8 * 0]\n\nstd\ncmpsw\n; cmp = 0x4546 - 0x6162 = 0xE3E4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000111\n; OF: LAHF doesn't load - 0\n\nmov eax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_AE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1200\",\n    \"RDI\": \"0xE0000001\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n\nmov eax, 0x45464748\nmov [edx + 8 * 0], eax\nmov eax, 0x41424344\nmov [edx + 8 * 0 + 4], eax\nmov eax, 0x55565758\nmov [edx + 8 * 1], eax\nmov eax, 0x51525354\nmov [edx + 8 * 1 + 4], eax\nmov eax, 0x0\nmov [edx + 8 * 2], eax\n\nlea edi, [edx + 8 * 0]\n\ncld\nmov eax, 0x61\nscasb\n; cmp = 0x61 - 0x48 = 0x19\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00010000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00010010\n; OF: LAHF doesn't load - 0\n\nmov eax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_AE_REP.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"5\",\n    \"RDI\": \"0xE0000003\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n\nmov eax, 0x45466161\nmov [edx + 8 * 0], eax\nmov eax, 0x41424344\nmov [edx + 8 * 0 + 4], eax\nmov eax, 0x55565758\nmov [edx + 8 * 1], eax\nmov eax, 0x51525354\nmov [edx + 8 * 1 + 4], eax\nmov eax, 0x0\nmov [edx + 8 * 2], eax\n\nlea edi, [edx + 8 * 0]\n\ncld\nmov eax, 0x61\nmov ecx, 8\ncmp eax, 0x61\n\nrep scasb\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_AE_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"1\",\n    \"RDI\": \"0xE0000007\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n\nmov eax, 0x45464748\nmov [edx + 8 * 0], eax\nmov eax, 0x41614344\nmov [edx + 8 * 0 + 4], eax\nmov eax, 0x55565758\nmov [edx + 8 * 1], eax\nmov eax, 0x51525354\nmov [edx + 8 * 1 + 4], eax\nmov eax, 0x0\nmov [edx + 8 * 2], eax\n\nlea edi, [edx + 8 * 0]\n\ncld\nmov eax, 0x61\nmov ecx, 8\ncmp eax, 0\n\nrepne scasb\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_AE_REPNE_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"5\",\n    \"RDI\": \"0xE000000D\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n\nmov eax, 0x45464748\nmov [edx + 8 * 0], eax\nmov eax, 0x41424344\nmov [edx + 8 * 0 + 4], eax\nmov eax, 0x55565758\nmov [edx + 8 * 1], eax\nmov eax, 0x51615354\nmov [edx + 8 * 1 + 4], eax\nmov eax, 0x0\nmov [edx + 8 * 2], eax\n\nlea edi, [edx + 8 * 2]\n\nstd\nmov eax, 0x61\nmov ecx, 8\ncmp eax, 0\n\nrepne scasb\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_AE_REP_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"7\",\n    \"RDI\": \"0xE000000F\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n\nmov eax, 0x45466161\nmov [edx + 8 * 0], eax\nmov eax, 0x41424344\nmov [edx + 8 * 0 + 4], eax\nmov eax, 0x55565758\nmov [edx + 8 * 1], eax\nmov eax, 0x51525354\nmov [edx + 8 * 1 + 4], eax\nmov eax, 0x0\nmov [edx + 8 * 2], eax\n\nlea edi, [edx + 8 * 2]\n\nstd\nmov eax, 0x61\nmov ecx, 8\ncmp eax, 0x61\n\nrep scasb\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_AF_REP_dword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"6\",\n    \"RDI\": \"0xE0000008\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n\nmov eax, 0x61626364\nmov [edx + 8 * 0], eax\nmov eax, 0x41424344\nmov [edx + 8 * 0 + 4], eax\nmov eax, 0x55565758\nmov [edx + 8 * 1], eax\nmov eax, 0x51525354\nmov [edx + 8 * 1 + 4], eax\nmov eax, 0x0\nmov [edx + 8 * 2], eax\n\nlea edi, [edx + 8 * 0]\n\ncld\nmov eax, 0x61626364\nmov ecx, 8\ncmp eax, 0x61626364\n\nrep scasd\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_AF_REP_word.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"6\",\n    \"RDI\": \"0xE0000004\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n\nmov eax, 0x45466162\nmov [edx + 8 * 0], eax\nmov eax, 0x41424344\nmov [edx + 8 * 0 + 4], eax\nmov eax, 0x55565758\nmov [edx + 8 * 1], eax\nmov eax, 0x51525354\nmov [edx + 8 * 1 + 4], eax\nmov eax, 0x0\nmov [edx + 8 * 2], eax\n\nlea edi, [edx + 8 * 0]\n\ncld\nmov eax, 0x6162\nmov ecx, 8\ncmp eax, 0x6162\n\nrep scasw\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_C9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBP\": \"0x41424344\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov esp, 0xe0000020\nmov ebp, 0x41424344\n\n; Act like an ENTER frame without using ENTER\npush ebp\nmov ebp, esp\ncall .target\njmp .end\n\n.target:\nmov eax, 1\nleave\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_CE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Clear OF just incase\ntest eax, eax\n\n; Just ensure it executes safely\ninto\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_CF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RSP\": \"0xe0000010\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov esp, 0xe0000010\n\nlea ebx, [rel .end]\n\nmov eax, 0x202\npush eax ; RFLAGS\nmov eax, 0x33\npush eax ; CS\npush ebx ; RIP\n\nmov eax, -1\niretd\n\n; Super fail\nmov eax, 2\nhlt\n\n.end_fail:\nmov eax, 0\nhlt\n\n.end:\nmov eax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_D4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x2\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov eax, 0x1234\naam\naam 0xc\naam 0x1f\naam 0xff\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_D5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xe8\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov eax, 0x1234\naad\naad 0x3\naad 0x1f\naad 0xae\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_D6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000041D7FF00\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n\nmov eax, 0x41424344\nmov [edx + 8 * 0], eax\nmov eax, 0x51525354\n\n; Set resulting al to zero\nclc\nsalc\nmov [edx + 8 * 0 + 0], al\n\n; Set resulting al to 0xFF\nstc\nsalc\nlahf\nmov [edx + 8 * 0 + 1], al\n\n; Ensure that salc doesn't set flags\nmov eax, -1\nsahf\nsalc\nlahf\nmov [edx + 8 * 0 + 2], ah\n\nmov eax, [edx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_E3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"0x10000\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov ecx, 0x10\n\n.loop:\ndec ecx\njecxz .end\njmp .loop\n.end:\n\nmov ecx, 0x1FFFF\n\n.loop2:\ndec cx\njcxz .end2\njmp .loop2\n.end2:\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_E8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Tests for 32-bit signed displacement wrapping\n; Testing for underflow specifically\n; Will crash or hit the code we emit to memory\n\n; We map ten pages to 0xe000'0000\n; Generate a mov eax + hlt over there first\n; 0xb8'44'43'42'41: mov eax, 0x41424344\n; 0xf4: hlt\n\nmov ebx, 0xe0000000\nmov al, 0xb8\nmov byte [ebx], al\nmov eax, 0x41424344\nmov dword [ebx + 1], eax\nmov al, 0xf4\nmov byte [ebx + 5], al\n\n; Do a jump dance to stop multiblock from trying to optimize\n; Otherwise it will JIT code from 0xe000'0000 before written\nlea ebx, [rel next]\njmp ebx\nnext:\n\n; Move temp to eax to overwrite\nmov eax, 0\n\n; Setup esp\nmov esp, 0xe0001000\n\n; This is dependent on where it is in the code!\ncall -0x20000000\n\n; Definitely wrong if we hit here\nmov eax, -1\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_E8_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Tests for 32-bit signed displacement wrapping\n; Testing for overflow specifically\n; Will crash or hit the code we emit to memory\n\n; We map ten pages to 0xe000'0000\n; Generate a call 0x11000 over there\n; 0xe8'fb'0f'01'20 : call 0x11000\n; 0xf4: hlt - Just in case\n\nmov ebx, 0xe0000000\nmov al, 0xe8\nmov byte [ebx], al\nmov eax, 0x20010ffb\nmov dword [ebx + 1], eax\nmov al, 0xf4\nmov byte [ebx + 5], al\n\n; Do a jump dance to stop multiblock from trying to optimize\n; Otherwise it will JIT code from 0xe000'0000 before written\nlea ebx, [rel next]\njmp ebx\nnext:\n\n; Move temp to eax to overwrite\nmov eax, 0\n\n; Setup esp\nmov esp, 0xe0001000\n\n; This is dependent on where it is in the code!\ncall -0x20000000\n\n; Definitely wrong if we hit here\nmov eax, -1\nhlt\n\n; This is where the JIT code will land\nalign 0x1000\n\nmov eax, 0x41424344\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_E9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Tests for 32-bit signed displacement wrapping\n; Testing for underflow specifically\n; Will crash or hit the code we emit to memory\n\n; We map ten pages to 0xe000'0000\n; Generate a mov eax + hlt over there first\n; 0xb8'44'43'42'41: mov eax, 0x41424344\n; 0xf4: hlt\n\nmov ebx, 0xe0000000\nmov al, 0xb8\nmov byte [ebx], al\nmov eax, 0x41424344\nmov dword [ebx + 1], eax\nmov al, 0xf4\nmov byte [ebx + 5], al\n\n; Do a jump dance to stop multiblock from trying to optimize\n; Otherwise it will JIT code from 0xe000'0000 before written\nlea ebx, [rel next]\njmp ebx\nnext:\n\n; Move temp to eax to overwrite\nmov eax, 0\n\n; This is dependent on where it is in the code!\njmp -0x20000000\n\n; Definitely wrong if we hit here\nmov eax, -1\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Primary_E9_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Tests for 32-bit signed displacement wrapping\n; Testing for overflow specifically\n; Will crash or hit the code we emit to memory\n\n; We map ten pages to 0xe000'0000\n; Generate a jmp 0x11000 over there\n; 0xe9'fb'0f'01'20 : jmp 0x11000\n; 0xf4: hlt - Just in case\n\nmov ebx, 0xe0000000\nmov al, 0xe9\nmov byte [ebx], al\nmov eax, 0x20010ffb\nmov dword [ebx + 1], eax\nmov al, 0xf4\nmov byte [ebx + 5], al\n\n; Do a jump dance to stop multiblock from trying to optimize\n; Otherwise it will JIT code from 0xe000'0000 before written\nlea ebx, [rel next]\njmp ebx\nnext:\n\n; Move temp to eax to overwrite\nmov eax, 0\n\n; This is dependent on where it is in the code!\njmp -0x20000000\n\n; Definitely wrong if we hit here\nmov eax, -1\nhlt\n\n\n; This is where the JIT code will land\nalign 0x1000\n\nmov eax, 0x41424344\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Primary/Push_Segments.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RSP\": \"0xE000001C\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov esp, 0xe0000040\n\n; Only push the segments\n; Doesn't check for a correct segment value\n; Just ensures we are pushing the correct amount of data\npush cs\npush ss\npush ds\npush es\npush fs\npush gs\n\no16 push cs\no16 push ss\no16 push ds\no16 push es\no16 push fs\no16 push gs\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/PrimaryGroup/3_F6_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RDI\": \"0x00000000000003fc\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n%macro ofcfmerge 0\n  ; Get CF\n  setc al\n  ; Get OF\n  seto bl\n  and eax, 1\n  and ebx, 1\n\n  ; Merge in to results\n  shl edi, 1\n  or edi, eax\n\n  ; Merge in to results\n  shl edi, 1\n  or edi, ebx\n%endmacro\n\nmov edi, 0\n\n; Max Negative\nmov al, 0x80\nmov bl, 0x80\n\nimul bl\n\nofcfmerge\n\n; Max Positive\nmov al, 0x79\nmov bl, 0x79\n\nimul bl\n\nofcfmerge\n\n; Max Positive and Max Negative\nmov al, 0x79\nmov bl, 0x80\n\nimul bl\n\nofcfmerge\n\n; Max Positive and Max Negative\nmov al, 0x80\nmov bl, 0x79\n\nimul bl\n\nofcfmerge\n\n; No Overflow\n\nmov al, 0x1\nmov bl, 0x1\n\nimul bl\n\nofcfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/PrimaryGroup/5_FF_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edi, 0xe0000000\nlea esp, [edi + 8 * 4]\n\nmov eax, 0x41424344\nmov [edi + 8 * 0], eax\nmov eax, 0x51525354\nmov [edi + 8 * 1], eax\n\nlea ebx, [rel .call_tgt]\nmov [edi + 8 * 2], ebx\n\nmov eax, 0\ncall dword [edi + 8 * 2]\njmp .end\n\n.call_tgt:\nmov eax, [edi + 8 * 0]\nret\n\n; Couple things that could catch failure\nmov eax, 0\njmp .end\nmov eax, 0\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/PrimaryGroup/5_FF_02_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edi, 0xe0000000\nlea esp, [edi + 8 * 4]\n\nmov eax, 0x41424344\nmov [edi + 8 * 0], eax\nmov eax, 0x51525354\nmov [edi + 8 * 1], eax\n\nmov eax, 0\ndb 0xFF\ndb 0x15\ndd .jmp_data\njmp .end\n\n.call_tgt:\nmov eax, [edi + 8 * 0]\nret\n\n; Couple things that could catch failure\nmov eax, 0\njmp .end\nmov eax, 0\n\n.end:\nhlt\n\n.jmp_data:\ndd .call_tgt\n"
  },
  {
    "path": "unittests/32Bit_ASM/PrimaryGroup/5_FF_02_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344\"\n  },\n  \"MemoryRegions\": {\n    \"0x80000000\": \"4096\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edi, 0xe0000000\nlea esp, [edi + 8 * 4]\n\n; Before we do anything, copy the code to an address that can be zexted\nmov eax, dword [.inst_data]\nmov [0x80000000], eax\nmov eax, dword [.inst_data2]\nmov [0x80000004], eax\n\nmov eax, 0x41424344\nmov [edi + 8 * 0], eax\nmov eax, 0x51525354\nmov [edi + 8 * 1], eax\n\nmov eax, 0\ndb 0xFF\ndb 0x15\ndd 0x80000004\nhlt\n\n.inst_data:\n; mov eax, dword [edi]\n; retn\ndb `\\x8B\\x07\\xC3`\ndb 0\n.inst_data2:\ndd 0x80000000\n"
  },
  {
    "path": "unittests/32Bit_ASM/Secondary/07_XX_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RBX\": \"0x00000000FFFE0000\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nsgdt [rel data]\n\nmovzx eax, word [rel data]\nmov ebx, dword [rel data + 2]\nhlt\n\nalign 4096\ndata:\n; Limit\ndw 0\n; Base\ndd 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/Secondary/07_XX_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000080050033\",\n    \"RBX\": \"0x0000000041420033\",\n    \"RCX\": \"0x0000000041420033\",\n    \"RDX\": \"0x0000000041420033\",\n    \"RDI\": \"0x0000000080050033\",\n    \"RSP\": \"0x0000000080050033\",\n    \"RBP\": \"0x0000000041420033\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov eax, 0x41424344\nmov ebx, 0x41424344\nmov ecx, 0x41424344\nmov edx, 0x41424344\nmov esi, 0xe000_0000\nmov [esi], edx\n\nmov edi, 0x41424344\nmov esp, 0x41424344\nmov ebp, 0x41424344\n\nsmsw eax\nsmsw bx\n\nsmsw [esi]\nmov ecx, [esi]\n\no16 smsw dx\nrepe smsw edi\nrepne smsw esp\n\no16 smsw bp\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/Secondary/15_XX_0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x11111111\",\n    \"RBX\": \"0x22222222\",\n    \"RCX\": \"0x33333333\",\n    \"RDX\": \"0x44444444\",\n    \"RSI\": \"0x55555555\",\n    \"RDI\": \"0x66666666\",\n    \"MM0\": \"0x1112131415161718\",\n    \"MM1\": \"0x2122232425262728\",\n    \"MM2\": \"0x3132333435363738\",\n    \"MM3\": \"0x4142434445464748\",\n    \"MM4\": \"0x5152535455565758\",\n    \"MM5\": \"0x6162636465666768\",\n    \"MM6\": \"0x7172737475767778\",\n    \"MM7\": \"0x8182838485868788\",\n    \"XMM0\":  [\"0x1112131415161718\", \"0x0\"],\n    \"XMM1\":  [\"0x2122232425262728\", \"0x0\"],\n    \"XMM2\":  [\"0x3132333435363738\", \"0x0\"],\n    \"XMM3\":  [\"0x4142434445464748\", \"0x0\"],\n    \"XMM4\":  [\"0x5152535455565758\", \"0x0\"],\n    \"XMM5\":  [\"0x6162636465666768\", \"0x0\"],\n    \"XMM6\":  [\"0x7172737475767778\", \"0x0\"],\n    \"XMM7\":  [\"0x8182838485868788\", \"0x0\"]\n  },\n  \"Mode\": \"32BIT\"\n\n}\n%endif\n\nmov esp, 0xe0000000\nmov ebp, 0xe0000500\n\n; Set up MMX state\nmov eax, 0x11121314\nmov ecx, 0x15161718\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovq mm0, qword [ebp]\n\nmov eax, 0x21222324\nmov ecx, 0x25262728\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovq mm1, qword [ebp]\n\nmov eax, 0x31323334\nmov ecx, 0x35363738\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovq mm2, qword [ebp]\n\nmov eax, 0x41424344\nmov ecx, 0x45464748\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovq mm3, qword [ebp]\n\nmov eax, 0x51525354\nmov ecx, 0x55565758\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovq mm4, qword [ebp]\n\nmov eax, 0x61626364\nmov ecx, 0x65666768\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovq mm5, qword [ebp]\n\nmov eax, 0x71727374\nmov ecx, 0x75767778\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovq mm6, qword [ebp]\n\nmov eax, 0x81828384\nmov ecx, 0x85868788\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovq mm7, qword [ebp]\n\n; Setup XMM state\nmov eax, 0x11121314\nmov ecx, 0x15161718\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovsd xmm0, [ebp]\n\nmov eax, 0x21222324\nmov ecx, 0x25262728\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovsd xmm1, [ebp]\n\nmov eax, 0x31323334\nmov ecx, 0x35363738\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovsd xmm2, [ebp]\n\nmov eax, 0x41424344\nmov ecx, 0x45464748\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovsd xmm3, [ebp]\n\nmov eax, 0x51525354\nmov ecx, 0x55565758\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovsd xmm4, [ebp]\n\nmov eax, 0x61626364\nmov ecx, 0x65666768\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovsd xmm5, [ebp]\n\nmov eax, 0x71727374\nmov ecx, 0x75767778\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovsd xmm6, [ebp]\n\nmov eax, 0x81828384\nmov ecx, 0x85868788\nmov dword [ebp + 4], eax\nmov dword [ebp + 0], ecx\nmovsd xmm7, [ebp]\n\n; Corrupt state and see what it stores\nmov eax, 0x41424344\n\n; Overwrite header\nmov dword [esp + 0], eax\n; Overwrite the mm state\nmov eax, -1\nmov dword [esp + 32 + 4 * 0], eax\nmov dword [esp + 32 + 4 * 1], eax\nmov dword [esp + 32 + 4 * 2], eax\nmov dword [esp + 32 + 4 * 3], eax\nmov dword [esp + 32 + 4 * 4], eax\nmov dword [esp + 32 + 4 * 5], eax\nmov dword [esp + 32 + 4 * 6], eax\nmov dword [esp + 32 + 4 * 7], eax\nmov dword [esp + 32 + 4 * 8], eax\nmov dword [esp + 32 + 4 * 9], eax\nmov dword [esp + 32 + 4 * 10], eax\nmov dword [esp + 32 + 4 * 11], eax\nmov dword [esp + 32 + 4 * 12], eax\nmov dword [esp + 32 + 4 * 13], eax\nmov dword [esp + 32 + 4 * 14], eax\nmov dword [esp + 32 + 4 * 15], eax\n\n; Overwrite the xmm state\nmov dword [esp + 160 + 4 * 0], eax\nmov dword [esp + 160 + 4 * 1], eax\nmov dword [esp + 160 + 4 * 2], eax\nmov dword [esp + 160 + 4 * 3], eax\nmov dword [esp + 160 + 4 * 4], eax\nmov dword [esp + 160 + 4 * 5], eax\nmov dword [esp + 160 + 4 * 6], eax\nmov dword [esp + 160 + 4 * 7], eax\nmov dword [esp + 160 + 4 * 8], eax\nmov dword [esp + 160 + 4 * 9], eax\nmov dword [esp + 160 + 4 * 10], eax\nmov dword [esp + 160 + 4 * 11], eax\nmov dword [esp + 160 + 4 * 12], eax\nmov dword [esp + 160 + 4 * 13], eax\nmov dword [esp + 160 + 4 * 14], eax\nmov dword [esp + 160 + 4 * 15], eax\nmov dword [esp + 160 + 4 * 16], eax\nmov dword [esp + 160 + 4 * 17], eax\nmov dword [esp + 160 + 4 * 18], eax\nmov dword [esp + 160 + 4 * 19], eax\nmov dword [esp + 160 + 4 * 20], eax\nmov dword [esp + 160 + 4 * 21], eax\nmov dword [esp + 160 + 4 * 22], eax\nmov dword [esp + 160 + 4 * 23], eax\nmov dword [esp + 160 + 4 * 24], eax\nmov dword [esp + 160 + 4 * 25], eax\nmov dword [esp + 160 + 4 * 26], eax\nmov dword [esp + 160 + 4 * 27], eax\nmov dword [esp + 160 + 4 * 28], eax\nmov dword [esp + 160 + 4 * 29], eax\nmov dword [esp + 160 + 4 * 30], eax\nmov dword [esp + 160 + 4 * 31], eax\nmov dword [esp + 160 + 4 * 32], eax\nmov dword [esp + 160 + 4 * 33], eax\nmov dword [esp + 160 + 4 * 34], eax\nmov dword [esp + 160 + 4 * 35], eax\nmov dword [esp + 160 + 4 * 36], eax\nmov dword [esp + 160 + 4 * 37], eax\nmov dword [esp + 160 + 4 * 38], eax\nmov dword [esp + 160 + 4 * 39], eax\nmov dword [esp + 160 + 4 * 40], eax\nmov dword [esp + 160 + 4 * 41], eax\nmov dword [esp + 160 + 4 * 42], eax\nmov dword [esp + 160 + 4 * 43], eax\nmov dword [esp + 160 + 4 * 44], eax\nmov dword [esp + 160 + 4 * 45], eax\nmov dword [esp + 160 + 4 * 46], eax\nmov dword [esp + 160 + 4 * 47], eax\nmov dword [esp + 160 + 4 * 48], eax\nmov dword [esp + 160 + 4 * 49], eax\nmov dword [esp + 160 + 4 * 50], eax\nmov dword [esp + 160 + 4 * 51], eax\nmov dword [esp + 160 + 4 * 52], eax\nmov dword [esp + 160 + 4 * 53], eax\nmov dword [esp + 160 + 4 * 54], eax\nmov dword [esp + 160 + 4 * 55], eax\nmov dword [esp + 160 + 4 * 56], eax\nmov dword [esp + 160 + 4 * 57], eax\nmov dword [esp + 160 + 4 * 58], eax\nmov dword [esp + 160 + 4 * 59], eax\nmov dword [esp + 160 + 4 * 60], eax\nmov dword [esp + 160 + 4 * 61], eax\nmov dword [esp + 160 + 4 * 62], eax\nmov dword [esp + 160 + 4 * 63], eax\n\n; Overwrite the three reserved 16byte elements\nmov dword [esp + 416 + 4 * 0], eax\nmov dword [esp + 416 + 4 * 1], eax\nmov dword [esp + 416 + 4 * 2], eax\nmov dword [esp + 416 + 4 * 3], eax\nmov dword [esp + 416 + 4 * 4], eax\nmov dword [esp + 416 + 4 * 5], eax\nmov dword [esp + 416 + 4 * 6], eax\nmov dword [esp + 416 + 4 * 7], eax\nmov dword [esp + 416 + 4 * 8], eax\nmov dword [esp + 416 + 4 * 9], eax\nmov dword [esp + 416 + 4 * 10], eax\nmov dword [esp + 416 + 4 * 11], eax\n\n; Overwrite the three 16byte \"available\" slots\nmov eax, 0x11111111\nmov dword [esp + 464 + 4 * 0], eax\nmov dword [esp + 464 + 4 * 1], eax\nmov eax, 0x22222222\nmov dword [esp + 464 + 4 * 2], eax\nmov dword [esp + 464 + 4 * 3], eax\nmov eax, 0x33333333\nmov dword [esp + 464 + 4 * 4], eax\nmov dword [esp + 464 + 4 * 5], eax\nmov eax, 0x44444444\nmov dword [esp + 464 + 4 * 6], eax\nmov dword [esp + 464 + 4 * 7], eax\nmov eax, 0x55555555\nmov dword [esp + 464 + 4 * 8], eax\nmov dword [esp + 464 + 4 * 9], eax\nmov eax, 0x66666666\nmov dword [esp + 464 + 4 * 10], eax\nmov dword [esp + 464 + 4 * 11], eax\n; Now save our state\nfxsave [esp]\n\n; Corrupt MMX And XMM state\nmov eax, -1\nmov dword [ebp + 0], eax\nmov dword [ebp + 4], eax\nmov dword [ebp + 8], eax\nmov dword [ebp + 12], eax\n\nmovq mm0, qword [ebp]\nmovq mm1, qword [ebp]\nmovq mm2, qword [ebp]\nmovq mm3, qword [ebp]\nmovq mm4, qword [ebp]\nmovq mm5, qword [ebp]\nmovq mm6, qword [ebp]\nmovq mm7, qword [ebp]\n\n; Setup XMM state\nmovaps xmm0, [ebp]\nmovaps xmm1, [ebp]\nmovaps xmm2, [ebp]\nmovaps xmm3, [ebp]\nmovaps xmm4, [ebp]\nmovaps xmm5, [ebp]\nmovaps xmm6, [ebp]\nmovaps xmm7, [ebp]\n; Now reload the state we just saved\nfxrstor [esp]\n\n; Load the three 16bytes of \"available\" slots to make sure it wasn't overwritten\n; Can't view full range here\n; Reserved can be overwritten regardless\nmov eax, dword [esp + 464 + 4 * 0]\nmov ebx, dword [esp + 464 + 4 * 2]\nmov ecx, dword [esp + 464 + 4 * 4]\nmov edx, dword [esp + 464 + 4 * 6]\nmov esi, dword [esp + 464 + 4 * 8]\nmov edi, dword [esp + 464 + 4 * 10]\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/SecondaryModRM/Reg_7_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"Mode\": \"32BIT\",\n  \"HostFeatures\": [\"Linux\"]\n}\n%endif\n\n; We can't really check the results of this\nrdtscp\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/SecondaryModRM/Reg_7_4_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x0\",\n    \"RCX\": \"0x000000000a121a20\",\n    \"RDX\": \"0x000000000b131b20\"\n  },\n  \"Mode\": \"32BIT\",\n  \"HostFeatures\": [\"CLZERO\"]\n}\n%endif\n\n; Starting address to store to\nmov eax, 0xe8000000\n\n; Set up the cachelines with garbage\n\n; Cacheline 0\nmov ebx, 0x41424344\nmov [eax + 8 * 0], ebx\nmov [eax + 8 * 1], ebx\nmov [eax + 8 * 2], ebx\nmov [eax + 8 * 3], ebx\nmov [eax + 8 * 4], ebx\nmov [eax + 8 * 5], ebx\nmov [eax + 8 * 6], ebx\nmov [eax + 8 * 7], ebx\n\n; Cacheline 1\nmov ebx, 0x55565758\nmov [eax + 8 * 8], ebx\nmov [eax + 8 * 9], ebx\nmov [eax + 8 * 10], ebx\nmov [eax + 8 * 11], ebx ; clzero here\nmov [eax + 8 * 12], ebx\nmov [eax + 8 * 13], ebx\nmov [eax + 8 * 14], ebx\nmov [eax + 8 * 15], ebx\n\n; Cacheline 2\nmov ebx, 0x61626364\nmov [eax + 8 * 16], ebx\nmov [eax + 8 * 17], ebx\nmov [eax + 8 * 18], ebx\nmov [eax + 8 * 19], ebx\nmov [eax + 8 * 20], ebx\nmov [eax + 8 * 21], ebx\nmov [eax + 8 * 22], ebx\nmov [eax + 8 * 23], ebx\n\n; Set RAX to the middle of cacheline 1 to ensure alignment\nlea eax, [eax + 8 * 11]\n\nclzero\n\n; Set eax back to the start\nmov eax, 0xe8000000\n\nmov ebx, 0\nmov ecx, 0\nmov edx, 0\n\n; Cacheline 0 should be unmodified\nadd ecx, [eax + 8 * 0]\nadd ecx, [eax + 8 * 1]\nadd ecx, [eax + 8 * 2]\nadd ecx, [eax + 8 * 3]\nadd ecx, [eax + 8 * 4]\nadd ecx, [eax + 8 * 5]\nadd ecx, [eax + 8 * 6]\nadd ecx, [eax + 8 * 7]\n\n; Cacheline 1 Should be zero\nadd ebx, [eax + 8 * 8]\nadd ebx, [eax + 8 * 9]\nadd ebx, [eax + 8 * 10]\nadd ebx, [eax + 8 * 11]\nadd ebx, [eax + 8 * 12]\nadd ebx, [eax + 8 * 13]\nadd ebx, [eax + 8 * 14]\nadd ebx, [eax + 8 * 15]\n\n; Cacheline 2 should be unmodified\nadd edx, [eax + 8 * 16]\nadd edx, [eax + 8 * 17]\nadd edx, [eax + 8 * 18]\nadd edx, [eax + 8 * 19]\nadd edx, [eax + 8 * 20]\nadd edx, [eax + 8 * 21]\nadd edx, [eax + 8 * 22]\nadd edx, [eax + 8 * 23]\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/TwoByte/0F_82.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Tests for 32-bit signed displacement wrapping\n; Testing for underflow specifically\n; Will crash or hit the code we emit to memory\n\n; We map ten pages to 0xe000'0000\n; Generate a mov eax + hlt over there first\n; 0xb8'44'43'42'41: mov eax, 0x41424344\n; 0xf4: hlt\n\nmov ebx, 0xe0000000\nmov al, 0xb8\nmov byte [ebx], al\nmov eax, 0x41424344\nmov dword [ebx + 1], eax\nmov al, 0xf4\nmov byte [ebx + 5], al\n\n; Do a jump dance to stop multiblock from trying to optimize\n; Otherwise it will JIT code from 0xe000'0000 before written\nlea ebx, [rel next]\njmp ebx\nnext:\n\n; Move temp to eax to overwrite\nmov eax, 0\n\n; Clear the lower flags so the branch gets taken\nsahf\n\n; This is dependent on where it is in the code!\njnb -0x20000000\n\n; Definitely wrong if we hit here\nmov eax, -1\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/TwoByte/0F_82_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Tests for 32-bit signed displacement wrapping\n; Testing for overflow specifically\n; Will crash or hit the code we emit to memory\n\n; We map ten pages to 0xe000'0000\n; Generate a call 0x11000 over there\n; 0x0f'83'fa'0f'01'20 : jnb 0x11000\n; 0xf4: hlt - Just in case\n\nmov ebx, 0xe0000000\nmov ax, 0x830f\nmov word [ebx], ax\nmov eax, 0x20010ffa\nmov dword [ebx + 2], eax\nmov al, 0xf4\nmov byte [ebx + 6], al\n\n; Do a jump dance to stop multiblock from trying to optimize\n; Otherwise it will JIT code from 0xe000'0000 before written\nlea ebx, [rel next]\njmp ebx\nnext:\n\n; Move temp to eax to overwrite\nmov eax, 0\n\n; Clear the lower flags so the branch gets taken\nsahf\n\n; This is dependent on where it is in the code!\njnb -0x20000000\n\n; Definitely wrong if we hit here\nmov eax, -1\nhlt\n\n; This is where the JIT code will land\nalign 0x1000\n\nmov eax, 0x41424344\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qpd_128bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm7, [xmm0 * 1 + eax + 1], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qpd_128bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 1\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 1\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 1\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 1\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm7, [xmm0 * 2 + eax + 2], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qpd_128bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 2\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 2\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 2\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 2\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm7, [xmm0 * 4 + eax + 4], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qpd_128bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 3\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 3\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 3\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 3\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm7, [xmm0 * 8 + eax + 8], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qpd_256bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm7, [ymm0 * 1 + eax + 1], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qpd_256bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 1\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 1\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 1\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 1\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm7, [ymm0 * 2 + eax + 2], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qpd_256bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 2\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 2\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 2\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 2\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm7, [ymm0 * 4 + eax + 4], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qpd_256bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 3\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 3\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 3\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 3\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm7, [ymm0 * 8 + eax + 8], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qps_128bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm7, [xmm0 * 1 + eax + 1], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qps_128bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 1\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 1\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 1\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 1\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm7, [xmm0 * 2 + eax + 2], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qps_128bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 2\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 2\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 2\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 2\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm7, [xmm0 * 4 + eax + 4], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qps_128bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 3\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 3\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 3\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 3\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm7, [xmm0 * 8 + eax + 8], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qps_256bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm7, [ymm0 * 1 + eax + 1], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qps_256bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 1\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 1\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 1\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 1\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm7, [ymm0 * 2 + eax + 2], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qps_256bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 2\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 2\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 2\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 2\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm7, [ymm0 * 4 + eax + 4], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vgather_qps_256bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 3\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 3\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 3\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 3\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm7, [ymm0 * 8 + eax + 8], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qd_128bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm7, [xmm0 * 1 + eax + 1], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qd_128bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 1\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 1\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 1\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 1\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm7, [xmm0 * 2 + eax + 2], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qd_128bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 2\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 2\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 2\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 2\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm7, [xmm0 * 4 + eax + 4], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qd_128bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 3\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 3\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 3\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 3\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm7, [xmm0 * 8 + eax + 8], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qd_256bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm7, [ymm0 * 1 + eax + 1], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qd_256bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 1\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 1\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 1\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 1\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm7, [ymm0 * 2 + eax + 2], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qd_256bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 2\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 2\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 2\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 2\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm7, [ymm0 * 4 + eax + 4], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qd_256bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 3\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 3\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 3\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 3\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm7, [ymm0 * 8 + eax + 8], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qq_128bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm7, [xmm0 * 1 + eax + 1], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qq_128bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 1\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 1\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 1\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 1\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm7, [xmm0 * 2 + eax + 2], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qq_128bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 2\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 2\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 2\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 2\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm7, [xmm0 * 4 + eax + 4], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qq_128bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 3\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 3\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 3\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 3\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm7, [xmm0 * 8 + eax + 8], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qq_256bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm7, [ymm0 * 1 + eax + 1], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qq_256bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 1\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 1\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 1\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 1\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm7, [ymm0 * 2 + eax + 2], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qq_256bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 2\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 2\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 2\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 2\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm7, [ymm0 * 4 + eax + 4], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/VEX/vpgather_qq_256bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"Mode\": \"32BIT\",\n  \"Env\": { \"FEX_HOSTFEATURES\" : \"enableavx\" },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea eax, [rel .data_mid]\n\nmov ebx, -1\nsub ebx, eax\nsar ebx, 3\nmov [rel .index_overflow + 0 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 8\nsar ebx, 3\nmov [rel .index_overflow + 1 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nsub ebx, 16\nsar ebx, 3\nmov [rel .index_overflow + 2 * 8], ebx\n\nmov ebx, -1\nsub ebx, eax\nadd bx, 16\nsar ebx, 3\nmov [rel .index_overflow + 3 * 8], ebx\n\n; Calculate new base which offsets from the overflow\nlea eax, [rel .data_mid]\nshl eax, 1\n\nvmovapd ymm7, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm7, [ymm0 * 8 + eax + 8], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D8_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0xc000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld qword [edx + 8 * 0]\nfadd dword [edx + 8 * 1]\nhlt\n\n.data:\ndq 0x3ff0000000000000\ndq 0x40000000\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D8_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld qword [edx + 8 * 0]\nfmul dword [edx + 8 * 1]\nhlt\n\n.data:\ndq 0x3ff0000000000000\ndq 0x40000000\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D8_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0xBFFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld qword [edx + 8 * 0]\nfsub dword [edx + 8 * 1]\nhlt\n\n.data:\ndq 0x3ff0000000000000\ndq 0x40000000\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D8_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld qword [edx + 8 * 0]\nfsubr dword [edx + 8 * 1]\nhlt\n\n.data:\ndq 0x3ff0000000000000\ndq 0x40000000\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D8_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFE\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld qword [edx + 8 * 0]\nfdiv dword [edx + 8 * 1]\nhlt\n\n.data:\ndq 0x3ff0000000000000\ndq 0x40000000\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D8_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld qword [edx + 8 * 0]\nfdivr dword [edx + 8 * 1]\nhlt\n\n.data:\ndq 0x3ff0000000000000\ndq 0x40000000\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D8_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0xC000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld qword [edx + 8 * 0]\nfld qword [edx + 8 * 1]\n\n; fadd st(0), st(i)\nfadd st0, st1\n\nhlt\n\n.data:\ndq 0x3ff0000000000000\ndq 0x4000000000000000\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D8_C8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4001\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld qword [edx + 8 * 0]\nfmul st0, st0\nhlt\n\n.data:\ndq 0x4000000000000000\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D8_E0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0xBFFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld qword [edx + 8 * 0]\nfld qword [edx + 8 * 1]\nfsub st0, st1\nhlt\n\n.data:\ndq 0x4000000000000000\ndq 0x3ff0000000000000\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D8_E8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld qword [edx + 8 * 0]\nfld qword [edx + 8 * 1]\nfsubr st0, st1\nhlt\n\n.data:\ndq 0x4000000000000000\ndq 0x3ff0000000000000\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D8_F0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld qword [edx + 8 * 0]\nfdiv st0, st0\nhlt\n\n.data:\ndq 0x4000000000000000\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D8_F0_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Tests that a division by zero does not set the IE flag\nfinit\nfldz\nfld1\nfdiv st0, st1\n\nfnstsw ax\nand eax, 1\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D8_F8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFE\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld qword [edx + 8 * 0]\nfld qword [edx + 8 * 1]\n\nfdivr st0, st1\nhlt\n\n.data:\ndq 0x4000000000000000\ndq 0x4010000000000000\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x3fff\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld dword [edx + 8 * 0]\nhlt\n\n.data:\ndq 0x3f800000\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3F800000\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3fff\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld dword [edx + 8 * 0]\nfst dword [edx + 8 * 1]\n\nmov eax, [edx + 8 * 1]\n\nhlt\n\nalign 4096\n.data:\ndq 0x3f800000\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3F800000\",\n    \"MM7\": [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld dword [edx + 8 * 0]\nfstp dword [edx + 8 * 2]\nfld dword [edx + 8 * 1]\n\nmov eax, [edx + 8 * 2]\n\nhlt\n\nalign 4096\n.data:\ndq 0x3f800000\ndq 0x40000000\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n; Just to ensure execution\nfldcw [edx]\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3fff\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld dword [edx + 8 * 0]\no16 fstenv [edx + 8 * 3]\nfld dword [edx + 8 * 2]\no16 fldenv [edx + 8 * 3]\n\n; This will overwrite the previous load\n; This is since the control word is stored and reloaded\nfld dword [edx + 8 * 1]\n\n; 14 bytes for 16bit\n; 2 Bytes : FCW\n; 2 Bytes : FSW\n; 2 bytes : FTW\n; 2 bytes : Instruction offset\n; 2 bytes : Instruction CS selector\n; 2 bytes : Data offset\n; 2 bytes : Data selector\n\n; 28 bytes for 32bit\n; 4 bytes : FCW\n; 4 bytes : FSW\n; 4 bytes : FTW\n; 4 bytes : Instruction pointer\n; 2 bytes : instruction pointer selector\n; 2 bytes : Opcode\n; 4 bytes : data pointer offset\n; 4 bytes : data pointer selector\n\nhlt\n\nalign 4096\n.data:\ndq 0x3f800000\ndq 0x40000000\ndq 0x40800000\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_06_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3fff\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld dword [edx + 8 * 0]\no32 fstenv [edx + 8 * 3]\nfld dword [edx + 8 * 2]\no32 fldenv [edx + 8 * 3]\n\n; This will overwrite the previous load\n; This is since the control word is stored and reloaded\nfld dword [edx + 8 * 1]\n\n; 14 bytes for 16bit\n; 2 Bytes : FCW\n; 2 Bytes : FSW\n; 2 bytes : FTW\n; 2 bytes : Instruction offset\n; 2 bytes : Instruction CS selector\n; 2 bytes : Data offset\n; 2 bytes : Data selector\n\n; 28 bytes for 32bit\n; 4 bytes : FCW\n; 4 bytes : FSW\n; 4 bytes : FTW\n; 4 bytes : Instruction pointer\n; 2 bytes : instruction pointer selector\n; 2 bytes : Opcode\n; 4 bytes : data pointer offset\n; 4 bytes : data pointer selector\n\nhlt\n\nalign 4096\n.data:\ndq 0x3f800000\ndq 0x40000000\ndq 0x40800000\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x37F\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\nfnstcw [edx]\nmov eax, 0\nmov ax, [edx]\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\n\nfld st0\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_C8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld dword [edx + 8 * 0]\nfld dword [edx + 8 * 1]\n\nfxch\n\nhlt\n\n.data:\ndq 0x3f800000\ndq 0x40000000\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_D0.asm",
    "content": "%ifdef CONFIG\n{\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Just to ensure execution\nfnop\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_E0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0xC000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\nfchs\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\nfchs\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt -1.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_E1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\nfabs\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\nfabs\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt -1.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_E8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfld1\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_E9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0xD49A784BCD1B8AFE\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfldl2t\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_EA.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0xB8AA3B295C17F0BC\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfldl2e\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_EB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0xC90FDAA22168C235\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfldpi\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_EC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0x9A209A84FBCFF799\", \"0x3FFD\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfldlg2\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_ED.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0xB17217F7D1CF79AC\", \"0x3FFE\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfldln2\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_EE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0\", \"0\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfldz\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_F0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x0000000000000000\", \"0x0000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\nf2xm1\n\nhlt\n\nalign 8\ndata:\n  dt 0.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_F1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4002\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nfyl2x\nfld1\n\nhlt\n\nalign 8\ndata:\n  dt 16.0\n  dq 0\n\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_F2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0xC75922E5F71D2DC6\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nfptan\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_F3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0xC90FDAA22168C235\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\n\nfpatan\nfld1\n\nhlt\n\nalign 8\ndata:\n  dt 7.0\n  dq 0\ndata2:\n  dt 0.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_F4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0xF000000000000000\", \"0xBFFF\"],\n    \"MM7\":  [\"0xC000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nfxtract\n\nhlt\n\nalign 8\ndata:\n  dt -15.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_F5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0xE666666666666668\", \"0xBFFE\"],\n    \"MM7\":  [\"0xC000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\n\nfprem1\n\nhlt\n\nalign 8\ndata:\n  dt 3.0\n  dq 0\ndata2:\n  dt 5.1\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_F6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"7\",\n    \"RBX\":  \"0\",\n    \"MM0\":  \"0x3ff00000\",\n    \"MM1\":  \"0x40700000\",\n    \"MM2\":  \"0x40600000\",\n    \"MM3\":  \"0x40500000\",\n    \"MM4\":  \"0x40400000\",\n    \"MM5\":  \"0x40300000\",\n    \"MM6\":  \"0x40200000\",\n    \"MM7\":  \"0x40000000\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Set the stack with different values.\n; Then do fincstp and store the stack values into MMX registers through memory\n; such that MM0 has the value of ST0 and so on.\n\nmov eax, 0x3ff00000 ; 1.0\nmov [rel temp], eax\nfld dword [rel temp]\n\nmov eax, 0x40000000 ; 2.0\nmov [rel temp], eax\nfld dword [rel temp]\n\nmov eax, 0x40200000 ; 4.0\nmov [rel temp], eax\nfld dword [rel temp]\n\nmov eax, 0x40300000\nmov [rel temp], eax\nfld dword [rel temp]\n\nmov eax, 0x40400000\nmov [rel temp], eax\nfld dword [rel temp]\n\nmov eax, 0x40500000\nmov [rel temp], eax\nfld dword [rel temp]\n\nmov eax, 0x40600000\nmov [rel temp], eax\nfld dword [rel temp]\n\nmov eax, 0x40700000\nmov [rel temp], eax\nfld dword [rel temp]\n\n; Store top in ebx\nxor eax, eax\nxor ebx, ebx\nfnstsw ax\nshr ax, 11\nand ax, 7\nmov bx, ax\n\n; Move the value of stop\n; ST0 is currently 0x4070000000000000\nfdecstp\n\n; Store top in RAX\nxor eax, eax\nfnstsw ax\nshr ax, 11\nand ax, 7\n\n; Now ST0 is 0x3ff0000000000000\nfstp dword [rel stack + 8 * 0]\nfstp dword [rel stack + 8 * 1]\nfstp dword [rel stack + 8 * 2]\nfstp dword [rel stack + 8 * 3]\nfstp dword [rel stack + 8 * 4]\nfstp dword [rel stack + 8 * 5]\nfstp dword [rel stack + 8 * 6]\nfstp dword [rel stack + 8 * 7]\n\nmovq mm0, [rel stack + 8 * 0]\nmovq mm1, [rel stack + 8 * 1]\nmovq mm2, [rel stack + 8 * 2]\nmovq mm3, [rel stack + 8 * 3]\nmovq mm4, [rel stack + 8 * 4]\nmovq mm5, [rel stack + 8 * 5]\nmovq mm6, [rel stack + 8 * 6]\nmovq mm7, [rel stack + 8 * 7]\n\nhlt\n\nalign 4096\ntemp: dq 0\nstack: times 8 dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_F7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"1\",\n    \"RBX\":  \"0\",\n    \"MM0\":  \"0x40600000\",\n    \"MM1\":  \"0x40500000\",\n    \"MM2\":  \"0x40400000\",\n    \"MM3\":  \"0x40300000\",\n    \"MM4\":  \"0x40200000\",\n    \"MM5\":  \"0x40000000\",\n    \"MM6\":  \"0x3ff00000\",\n    \"MM7\":  \"0x40700000\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Set the stack with different values.\n; Then do fincstp and store the stack values into MMX registers through memory\n; such that MM0 has the value of ST0 and so on.\n\nmov eax, 0x3ff00000 ; 1.0\nmov [rel temp], eax\nfld dword [rel temp]\n\nmov eax, 0x40000000 ; 2.0\nmov [rel temp], eax\nfld dword [rel temp]\n\nmov eax, 0x40200000 ; 4.0\nmov [rel temp], eax\nfld dword [rel temp]\n\nmov eax, 0x40300000\nmov [rel temp], eax\nfld dword [rel temp]\n\nmov eax, 0x40400000\nmov [rel temp], eax\nfld dword [rel temp]\n\nmov eax, 0x40500000\nmov [rel temp], eax\nfld dword [rel temp]\n\nmov eax, 0x40600000\nmov [rel temp], eax\nfld dword [rel temp]\n\nmov eax, 0x40700000\nmov [rel temp], eax\nfld dword [rel temp]\n\n; Store top in RBX\nxor eax, eax\nfnstsw ax\nshr ax, 11\nand ax, 7\nmov bx, ax\n\n; Move the value of stop\n; ST0 is currently 0x4070000000000000\nfincstp\n\n; Store top in eax\nxor eax, eax\nfnstsw ax\nshr ax, 11\nand ax, 7\n\n; Now ST0 is 0x4060000000000000\nfstp dword [rel stack + 8 * 0]\nfstp dword [rel stack + 8 * 1]\nfstp dword [rel stack + 8 * 2]\nfstp dword [rel stack + 8 * 3]\nfstp dword [rel stack + 8 * 4]\nfstp dword [rel stack + 8 * 5]\nfstp dword [rel stack + 8 * 6]\nfstp dword [rel stack + 8 * 7]\n\nmovq mm0, [rel stack + 8 * 0]\nmovq mm1, [rel stack + 8 * 1]\nmovq mm2, [rel stack + 8 * 2]\nmovq mm3, [rel stack + 8 * 3]\nmovq mm4, [rel stack + 8 * 4]\nmovq mm5, [rel stack + 8 * 5]\nmovq mm6, [rel stack + 8 * 6]\nmovq mm7, [rel stack + 8 * 7]\n\nhlt\n\nalign 4096\ntemp: dq 0\nstack: times 8 dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_F8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8666666666666666\", \"0x4000\"],\n    \"MM7\":  [\"0xC000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\n\nfprem\n\nhlt\n\nalign 8\ndata:\n  dt 3.0\n  dq 0\ndata2:\n  dt 5.1\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_F9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4002\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\n\nfyl2xp1\nfld1\n\nhlt\n\nalign 8\ndata:\n  dt 15.0\n  dq 0\n\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_FA.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4001\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nfsqrt\n\nhlt\n\nalign 8\ndata:\n  dt 16.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_FB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8A51407DA8345C92\", \"0x3FFE\"],\n    \"MM7\":  [\"0xD76AA47848677021\", \"0x3FFE\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nfsincos\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_FC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0x8000000000000000\", \"0x3fff\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nmov edx, 0xe0000000\n\nmov eax, 0x3f834241 ; 1.02546\nmov [edx + 8 * 0], eax\n\nfld dword [edx + 8 * 0]\n\nfrndint\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_FD.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4006\"],\n    \"MM7\":  [\"0xB000000000000000\", \"0x4001\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nfscale\n\nhlt\n\nalign 8\ndata:\n  dt 4.0\n  dq 0\n\ndata2:\n  dt 5.5\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_FE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0xD76AA47848677021\", \"0x3FFE\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nfsin\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/D9_FF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0xD51132BA9B902522\", \"0xBFFD\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nfcos\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DA_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xc000000000000000\", \"0x4000\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xbfff\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld qword [edx + 8 * 0]\nfiadd dword [edx + 8 * 1]\n\nfstp tword [rel data2]\n\nmovups xmm0, [rel data2]\n\n; Test negative\nlea edx, [rel .data_neg]\n\nfld qword [edx + 8 * 0]\nfiadd dword [edx + 8 * 1]\n\nfstp tword [rel data2]\n\nmovups xmm1, [rel data2]\n\nhlt\n\nalign 4096\n.data:\ndq 0x3ff0000000000000\ndq 2\n\n.data_neg:\ndq 0x3ff0000000000000\ndq -2\n\ndata2:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DA_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xC000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld qword [edx + 8 * 0]\nfimul dword [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm0, [rel data2]\n\n; Test negative\nlea edx, [rel .data_neg]\n\nfld qword [edx + 8 * 0]\nfimul dword [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm1, [rel data2]\n\nhlt\n\nalign 4096\n.data:\ndq 0x3ff0000000000000\ndq 2\n\n.data_neg:\ndq 0x3ff0000000000000\ndq -2\n\ndata2:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DA_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0xBFFF\"],\n    \"XMM1\":  [\"0xC000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld qword [edx + 8 * 0]\nfisub dword [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm0, [rel data2]\n\n; Test negative\nlea edx, [rel .data_neg]\n\nfld qword [edx + 8 * 0]\nfisub dword [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm1, [rel data2]\n\nhlt\n\nalign 4096\n.data:\ndq 0x3ff0000000000000\ndq 2\n\n.data_neg:\ndq 0x3ff0000000000000\ndq -2\n\ndata2:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DA_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"XMM1\":  [\"0xC000000000000000\", \"0xC000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld qword [edx + 8 * 0]\nfisubr dword [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm0, [rel data2]\n\n; Test negative\nlea edx, [rel .data_neg]\n\nfld qword [edx + 8 * 0]\nfisubr dword [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm1, [rel data2]\n\nhlt\n\nalign 4096\n.data:\ndq 0x3ff0000000000000\ndq 2\n\n.data_neg:\ndq 0x3ff0000000000000\ndq -2\n\ndata2:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DA_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x3FFE\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xBFFE\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld qword [edx + 8 * 0]\nfidiv dword [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm0, [rel data2]\n\n; Test negative\nlea edx, [rel .data_neg]\n\nfld qword [edx + 8 * 0]\nfidiv dword [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm1, [rel data2]\n\nhlt\n\nalign 4096\n.data:\ndq 0x3ff0000000000000\ndq 2\n\n.data_neg:\ndq 0x3ff0000000000000\ndq -2\n\ndata2:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DA_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xC000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld qword [edx + 8 * 0]\nfidivr dword [edx + 8 * 1]\n\nfstp tword [rel data2]\nmovups xmm0, [rel data2]\n\n; Test negative\nlea edx, [rel .data_neg]\n\nfld qword [edx + 8 * 0]\nfidivr dword [edx + 8 * 1]\n\nfstp tword [rel data2]\nmovups xmm1, [rel data2]\n\nhlt\n\nalign 4096\n.data:\ndq 0x3ff0000000000000\ndq 2\n\n.data_neg:\ndq 0x3ff0000000000000\ndq -2\n\ndata2:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DA_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM6\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfld1\nfldz\n\nmov eax, 2\ncmp eax, 1\n\nfcmovb st0, st1\n\nfldz\ncmp eax, 3\nfcmovb st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DA_C8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfld1\nfldz\n\nmov eax, 1\ncmp eax, 1\n\nfcmove st0, st1\n\nfldz\ncmp eax, 0\nfcmove st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DA_D0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfld1\nfldz\n\nmov eax, 2\ncmp eax, 2\n\nfcmovbe st0, st1\n\nfldz\ncmp eax, 0\nfcmovbe st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DA_D8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM6\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfld1\nfldz\n\nmov eax, 0x0\ncmp eax, -1\n\nfcmovu st0, st1\n\nfldz\ncmp eax, 1\nfcmovu st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DB_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0x8000000000000000\", \"0x4009\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfild dword [edx + 8 * 0]\n\nhlt\n\n.data:\ndq 1024\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DB_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld dword [edx + 8 * 0]\n\nfisttp dword [edx + 8 * 1]\n\nfld1\n\nmov eax, [edx + 8 * 1]\n\nhlt\n\nalign 4096\n.data:\ndq 0x44800000\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DB_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"MM6\": [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4009\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld dword [edx + 8 * 0]\n\nfist dword [edx + 8 * 1]\n\nfld1\n\nmov eax, [edx + 8 * 1]\n\nhlt\n\nalign 4096\n.data:\ndq 0x44800000\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DB_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\nfld dword [edx + 8 * 0]\n\nfistp dword [edx + 8 * 1]\n\nfld1\n\nmov eax, [edx + 8 * 1]\n\nhlt\n\nalign 4096\n.data:\ndq 0x44800000\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DB_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\n\nfld tword [edx + 8 * 0]\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DB_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel data]\nfld tword [edx + 8 * 0]\n\nlea edx, [rel data2]\nfstp tword [edx + 8 * 0]\nfld tword [edx + 8 * 0]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 0.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DB_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfld1\nfldz\n\nmov eax, 2\ncmp eax, 1\n\nfcmovnb st0, st1\n\nfldz\ncmp eax, 3\nfcmovnb st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DB_C8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM6\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfld1\nfldz\n\nmov eax, 1\ncmp eax, 1\n\nfcmovne st0, st1\n\nfldz\ncmp eax, 0\nfcmovne st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DB_D0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM6\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfld1\nfldz\n\nmov eax, 2\ncmp eax, 2\n\nfcmovnbe st0, st1\n\nfldz\ncmp eax, 0\nfcmovnbe st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DB_D8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfld1\nfldz\n\nmov eax, 0x0\ncmp eax, -1\n\nfcmovnu st0, st1\n\nfldz\ncmp eax, 1\nfcmovnu st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DB_E2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RBX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfinit ; IOC is 0\nfldz\nfldz\nfdiv st0, st1 ; IOC is 1\n\nfnstsw ax\nand eax, 1\nmov ebx, eax ; save IOC to RBX\n\n; Clear\nfnclex\n\nfnstsw ax\nand eax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DB_E3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x037F\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nfninit\n\n; Ensures that fnstcw after fninit sets the correct value\nfnstcw [rel control]\nmov ax, word [rel control]\n\nhlt\n\nalign 4096\ncontrol:\ntimes 2 db 0 ; Reserve space for the FPU control word\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DB_E3_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Tests that fninit clears the status word (which includes the IE flag)\nfninit\nfldz\nfldz\nfdiv ; sets IE flag\n\nfninit\nfnstsw ax\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DC_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0xC000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfadd qword [edx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dq 2.0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DC_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfmul qword [edx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dq 2.0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DC_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0xBFFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfsub qword [edx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dq 2.0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DC_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfsubr qword [edx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dq 2.0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DC_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFE\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfdiv qword [edx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dq 2.0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DC_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4001\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfdivr qword [edx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dq 8.0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DC_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x8000000000000000\", \"0x4001\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0xA000000000000000\", \"0x4001\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld qword [edx + 8 * 0]\nfld qword [edx + 8 * 1]\nfld qword [edx + 8 * 2]\n\n; fadd st(i), st(0)\nfadd st2, st0\n\nhlt\n.data:\ndq 0x3ff0000000000000 ; 1.0\ndq 0x4000000000000000 ; 2.0\ndq 0x4010000000000000 ; 4.0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DC_C8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4002\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\n\nfmul st1, st0\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DC_E0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\n\nfsubr st1, st0\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DC_E8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0xBFFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\n\nfsub st1, st0\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DC_F0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFE\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\n\nfdivr st1, st0\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DC_F8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4001\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\n\nfdiv st1, st0\n\nhlt\n\nalign 8\ndata:\n  dt 8.0\n  dq 0\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DD_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld qword [edx + 8 * 0]\nhlt\n\n.data:\ndq 0x4000000000000000 ; 2.0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DD_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x2\",\n    \"RBX\": \"0x0\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel data]\nfld tword [edx + 8 * 0]\n\nlea edx, [rel data3]\nfisttp qword [edx + 8 * 0]\n\nmov eax, [edx + 4 * 0]\nmov ebx, [edx + 4 * 1]\n\nlea edx, [rel data2]\nfld tword [edx + 8 * 0]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dq 0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DD_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x00000000\",\n    \"RBX\": \"0x40000000\",\n    \"MM6\": [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel data]\nfld tword [edx + 8 * 0]\n\nlea edx, [rel data3]\nfst qword [edx + 8 * 0]\n\nmov eax, [edx + 4 * 0]\nmov ebx, [edx + 4 * 1]\n\nlea edx, [rel data2]\nfld tword [edx + 8 * 0]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dq 0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DD_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x00000000\",\n    \"RBX\": \"0x40000000\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel data]\nfld tword [edx + 8 * 0]\n\nlea edx, [rel data3]\nfstp qword [edx + 8 * 0]\n\nmov eax, [edx + 4 * 0]\nmov ebx, [edx + 4 * 1]\n\nlea edx, [rel data2]\nfld tword [edx + 8 * 0]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dq 0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DD_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xc90fdaa22168c235\", \"0x4000\"],\n    \"XMM1\": [\"0x8000000000000000\", \"0x4005\"],\n    \"XMM2\": [\"0x8000000000000000\", \"0x4004\"],\n    \"XMM3\": [\"0x8000000000000000\", \"0x4003\"],\n    \"XMM4\": [\"0x8000000000000000\", \"0x4002\"],\n    \"XMM5\": [\"0x8000000000000000\", \"0x4001\"],\n    \"XMM6\": [\"0x8000000000000000\", \"0x4000\"],\n    \"XMM7\": [\"0x0000000000000000\", \"0x0000\"],\n    \"MM0\":  [\"0xc90fdaa22168c235\", \"0x4000\"],\n    \"MM1\":  [\"0x8000000000000000\", \"0x4005\"],\n    \"MM2\":  [\"0x8000000000000000\", \"0x4004\"],\n    \"MM3\":  [\"0x8000000000000000\", \"0x4003\"],\n    \"MM4\":  [\"0x8000000000000000\", \"0x4002\"],\n    \"MM5\":  [\"0x8000000000000000\", \"0x4001\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x0000000000000000\", \"0x0000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfldz\nfild word [edx + 2 * 1]\nfild word [edx + 2 * 2]\nfild word [edx + 2 * 3]\nfild word [edx + 2 * 4]\nfild word [edx + 2 * 5]\nfild word [edx + 2 * 6]\nfldpi\n\no32 fnsave [edx]\n\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\n\no32 frstor [edx]\n\nmovups xmm0, [edx + (0x1C + 10 * 0)]\nmovups xmm1, [edx + (0x1C + 10 * 1)]\nmovups xmm2, [edx + (0x1C + 10 * 2)]\nmovups xmm3, [edx + (0x1C + 10 * 3)]\nmovups xmm4, [edx + (0x1C + 10 * 4)]\nmovups xmm5, [edx + (0x1C + 10 * 5)]\nmovups xmm6, [edx + (0x1C + 10 * 6)]\nmovups xmm7, [edx + (0x1C + 10 * 7)]\n\npslldq xmm0, 6\npsrldq xmm0, 6\n\npslldq xmm1, 6\npsrldq xmm1, 6\n\npslldq xmm2, 6\npsrldq xmm2, 6\n\npslldq xmm3, 6\npsrldq xmm3, 6\n\npslldq xmm4, 6\npsrldq xmm4, 6\n\npslldq xmm5, 6\npsrldq xmm5, 6\n\npslldq xmm6, 6\npsrldq xmm6, 6\n\npslldq xmm7, 6\npsrldq xmm7, 6\n\nhlt\n\nalign 4096\n.data:\ndw 0\ndw 2\ndw 4\ndw 8\ndw 16\ndw 32\ndw 64\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DD_04_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xc90fdaa22168c235\", \"0x4000\"],\n    \"XMM1\": [\"0x8000000000000000\", \"0x4005\"],\n    \"XMM2\": [\"0x8000000000000000\", \"0x4004\"],\n    \"XMM3\": [\"0x8000000000000000\", \"0x4003\"],\n    \"XMM4\": [\"0x8000000000000000\", \"0x4002\"],\n    \"XMM5\": [\"0x8000000000000000\", \"0x4001\"],\n    \"XMM6\": [\"0x8000000000000000\", \"0x4000\"],\n    \"XMM7\": [\"0x0000000000000000\", \"0x0000\"],\n    \"MM0\":  [\"0xc90fdaa22168c235\", \"0x4000\"],\n    \"MM1\":  [\"0x8000000000000000\", \"0x4005\"],\n    \"MM2\":  [\"0x8000000000000000\", \"0x4004\"],\n    \"MM3\":  [\"0x8000000000000000\", \"0x4003\"],\n    \"MM4\":  [\"0x8000000000000000\", \"0x4002\"],\n    \"MM5\":  [\"0x8000000000000000\", \"0x4001\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x0000000000000000\", \"0x0000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfldz\nfild word [edx + 2 * 1]\nfild word [edx + 2 * 2]\nfild word [edx + 2 * 3]\nfild word [edx + 2 * 4]\nfild word [edx + 2 * 5]\nfild word [edx + 2 * 6]\nfldpi\n\no16 fnsave [edx]\n\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\n\no16 frstor [edx]\n\nmovups xmm0, [edx + (0xE + 10 * 0)]\nmovups xmm1, [edx + (0xE + 10 * 1)]\nmovups xmm2, [edx + (0xE + 10 * 2)]\nmovups xmm3, [edx + (0xE + 10 * 3)]\nmovups xmm4, [edx + (0xE + 10 * 4)]\nmovups xmm5, [edx + (0xE + 10 * 5)]\nmovups xmm6, [edx + (0xE + 10 * 6)]\nmovups xmm7, [edx + (0xE + 10 * 7)]\n\npslldq xmm0, 6\npsrldq xmm0, 6\n\npslldq xmm1, 6\npsrldq xmm1, 6\n\npslldq xmm2, 6\npsrldq xmm2, 6\n\npslldq xmm3, 6\npsrldq xmm3, 6\n\npslldq xmm4, 6\npsrldq xmm4, 6\n\npslldq xmm5, 6\npsrldq xmm5, 6\n\npslldq xmm6, 6\npsrldq xmm6, 6\n\npslldq xmm7, 6\npsrldq xmm7, 6\n\nhlt\n\nalign 4096\n.data:\ndw 0\ndw 2\ndw 4\ndw 8\ndw 16\ndw 32\ndw 64\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DD_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFF3800\",\n    \"RBX\": \"0xFFFF0000\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nmov eax, -1\nmov ebx, -1\nfnstsw [edx + 8 * 1]\n\nfld dword [edx + 8 * 0]\nfnstsw [edx + 8 * 2]\nmov ax, word [edx + 8 * 2]\nmov bx, word [edx + 8 * 1]\n\nhlt\n\nalign 4096\n.data:\ndq 0x3f800000\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DD_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Just to ensure execution\nffree st0\nffree st1\nffree st2\nffree st3\nffree st4\nffree st5\nffree st6\nffree st7\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DD_D0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\nfst st1\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DD_D8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\nfstp st1\n\nlea edx, [data3]\nfld tword [edx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DE_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xc000000000000000\", \"0x4000\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xbfff\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld qword [edx + 8 * 0]\nfiadd word [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm0, [rel data2]\n\n; Test negative\nlea edx, [rel .data_neg]\n\nfld qword [edx + 8 * 0]\nfiadd word [edx + 8 * 1]\n\nfstp tword [rel data2]\n\nmovups xmm1, [rel data2]\n\nhlt\n\nalign 4096\n.data:\ndq 0x3ff0000000000000\ndq 2\n\n.data_neg:\ndq 0x3ff0000000000000\ndq -2\n\ndata2:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DE_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xC000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld qword [edx + 8 * 0]\nfimul word [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm0, [rel data2]\n\n; Test negative\nlea edx, [rel .data_neg]\n\nfld qword [edx + 8 * 0]\nfimul word [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm1, [rel data2]\n\nhlt\n\nalign 4096\n.data:\ndq 0x3ff0000000000000\ndq 2\n\n.data_neg:\ndq 0x3ff0000000000000\ndq -2\n\ndata2:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DE_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0xBFFF\"],\n    \"XMM1\":  [\"0xc000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld qword [edx + 8 * 0]\nfisub word [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm0, [rel data2]\n\n; Test negative\nlea edx, [rel .data_neg]\n\nfld qword [edx + 8 * 0]\nfisub word [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm1, [rel data2]\n\nhlt\n\nalign 4096\n.data:\ndq 0x3ff0000000000000\ndq 2\n\n.data_neg:\ndq 0x3ff0000000000000\ndq -2\n\ndata2:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DE_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"XMM1\":  [\"0xC000000000000000\", \"0xC000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld qword [edx + 8 * 0]\nfisubr word [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm0, [rel data2]\n\n; Test negative\nlea edx, [rel .data_neg]\n\nfld qword [edx + 8 * 0]\nfisubr word [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm1, [rel data2]\n\nhlt\n\nalign 4096\n.data:\ndq 0x3ff0000000000000\ndq 2\n\n.data_neg:\ndq 0x3ff0000000000000\ndq -2\n\ndata2:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DE_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x3FFE\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xBFFE\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld qword [edx + 8 * 0]\nfidiv word [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm0, [rel data2]\n\n; Test negative\nlea edx, [rel .data_neg]\n\nfld qword [edx + 8 * 0]\nfidiv word [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm1, [rel data2]\n\nhlt\n\nalign 4096\n.data:\ndq 0x3ff0000000000000\ndq 2\n\n.data_neg:\ndq 0x3ff0000000000000\ndq -2\n\ndata2:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DE_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xC000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld qword [edx + 8 * 0]\nfidivr word [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm0, [rel data2]\n\n; Test negative\nlea edx, [rel .data_neg]\n\nfld qword [edx + 8 * 0]\nfidivr word [edx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm1, [rel data2]\n\nhlt\n\nalign 4096\n.data:\ndq 0x3ff0000000000000\ndq 2\n\n.data_neg:\ndq 0x3ff0000000000000\ndq -2\n\ndata2:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DE_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0xC000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\nfaddp st1, st0\n\nlea edx, [data3]\nfld tword [edx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DE_C8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4002\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\nfmulp st1, st0\n\nlea edx, [data3]\nfld tword [edx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DE_E0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\nfsubrp st1, st0\n\nlea edx, [data3]\nfld tword [edx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DE_E8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0x8000000000000000\", \"0xC000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\nfsubp st1, st0\n\nlea edx, [data3]\nfld tword [edx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DE_F0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\nfdivrp st1, st0\n\nlea edx, [data3]\nfld tword [edx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DE_F8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFE\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [data]\nfld tword [edx + 8 * 0]\n\nlea edx, [data2]\nfld tword [edx + 8 * 0]\n\n; fdivp 2.0, 4.0\n; == st1 = 2.0 / 4.0\nfdivp st1, st0\n\nlea edx, [data3]\nfld tword [edx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DF_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0x8000000000000000\", \"0x4009\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfild word [edx + 8 * 0]\n\nhlt\n\n.data:\ndq 1024\ndq -1\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DF_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x2\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel data]\nfld tword [edx + 8 * 0]\n\nlea edx, [rel data3]\nfisttp word [edx + 8 * 0]\n\nmov ax, word [edx + 8 * 0]\n\nlea edx, [rel data2]\nfld tword [edx + 8 * 0]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dq -1\n  dq -1\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DF_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"MM6\": [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4009\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld dword [edx + 8 * 0]\n\nfist word [edx + 8 * 1]\n\nfld1\n\nmov eax, 0\nmov ax, word [edx + 8 * 1]\n\nhlt\n\nalign 4096\n.data:\ndq 0x44800000\ndq -1\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DF_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld dword [edx + 8 * 0]\n\nfistp word [edx + 8 * 1]\n\nfld1\n\nmov eax, 0\nmov ax, word [edx + 8 * 1]\n\nhlt\n\nalign 4096\n.data:\ndq 0x44800000\ndq -1\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DF_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0x8000000000000000\", \"0x4009\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfild qword [edx + 8 * 0]\n\nhlt\n.data:\ndq 1024\n\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DF_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"RBX\": \"0x0\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [rel .data]\n\nfld dword [edx + 8 * 0]\n\nfistp qword [edx + 8 * 1]\n\nfld1\n\nmov eax, dword [edx + 4 * 2]\nmov ebx, dword [edx + 4 * 3]\n\nhlt\n\nalign 4096\n.data:\ndq 0x44800000\ndq -1\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DF_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nfld qword [edx + 8 * 0]\nfld qword [edx + 8 * 1]\n\n; Undocumented x87 instruction\n; Sets the tag register to empty for the stack register\n; Then pops the stack\nffreep st0\nfld qword [edx + 8 * 2] ; Overwrites previous value\n\nhlt\n\n.data:\ndq 0x3ff0000000000000 ; 1.0\ndq 0x4000000000000000 ; 2.0\ndq 0x4010000000000000 ; 4.0\n\n\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/DF_E0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFF3800\",\n    \"RBX\": \"0xFFFF0000\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nlea edx, [.data]\n\nmov eax, -1\nmov ebx, -1\nfnstsw ax\nmov bx, ax\n\nfld dword [edx + 8 * 0]\nfnstsw ax\n\nhlt\n\n.data:\ndq 0x3f800000 ; 1.0\n\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/FST_AddrModes.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3f800000\",\n    \"RBX\": \"0x3f800000\",\n    \"RCX\": \"0x3f800000\",\n    \"RBP\": \"0x3f800000\",\n    \"RDI\": \"0x3f800000\",\n    \"RSP\": \"0x3f800000\"\n  },\n  \"MemoryRegions\": {\n    \"0xf0000000\": \"4096\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Setup\nfld1\nlea edx, [rel base]\nmov esi, 0x64\n\n; Test fst\nfst dword [edx]\nfst dword [edx + 0xa]\nfst dword [edx + esi]\nfst dword [edx + esi * 4]\nfst dword [edx + esi + 0xa]\nfst dword [edx + esi * 4 + 0xa]\n\n; Result check\nmov eax, dword [edx]\nmov ebx, dword [edx + 0xa]\nmov ecx, dword [edx + esi]\nmov ebp, dword [edx + esi * 4]\nmov edi, dword [edx + esi + 0xa]\nmov esp, dword [edx + esi * 4 + 0xa]\n\nhlt\n\nalign 4096\nsection .bss\nbase resb 4096\n\nsection .text\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/RoundingNeg.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xfffefffe\",\n    \"RBX\": \"0xffffffff\",\n    \"RCX\": \"0xfffffffe\",\n    \"RDX\": \"0xffffffff\",\n    \"RSI\": \"0xfffefffe\",\n    \"RDI\": \"0xffffffff\"\n  },\n  \"MemoryRegions\": {\n    \"0xf0000000\": \"4096\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Rounding tests to ensure rounding modes are actually working\n;;; Negative tests\n;; Mid-point\nfinit\nfld dword [rel nmidpoint]\n\n; Default rounding is 00 - round to nearest\nfist word [rel tmp]\nmov di, word [rel tmp]\nmov eax, edi\nshl eax, 16\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx edi, word [rel tmp]\nand edi, 0xf3ff\nor edi, 0x0400\nmov word [rel tmp], di\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov di, word [rel tmp]\nor eax, edi\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx edi, word [rel tmp]\nand edi, 0xf3ff\nor edi, 0x0800\nmov word [rel tmp], di\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov di, word [rel tmp]\nmov ebx, edi\nshl ebx, 16\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx edi, word [rel tmp]\nand edi, 0xf3ff\nor edi, 0x0c00\nmov word [rel tmp], di\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nmov di, word [rel tmp]\nor ebx, edi\n\n;; Slightly above midpoint\nfinit\nfld dword [rel nsamidpoint]\n\n; Default rounding is 00 - round to nearest\nfist dword [rel tmp]\nmov di, word [rel tmp]\nmov ecx, edi\nshl ecx, 16\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx edi, word [rel tmp]\nand edi, 0xf3ff\nor edi, 0x0400\nmov word [rel tmp], di\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov di, word [rel tmp]\nor ecx, edi\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx edi, word [rel tmp]\nand edi, 0xf3ff\nor edi, 0x0800\nmov word [rel tmp], di\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov di, word [rel tmp]\nor edx, edi\nshl edx, 16\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx edi, word [rel tmp]\nand edi, 0xf3ff\nor edi, 0x0c00\nmov word [rel tmp], di\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nmov di, word [rel tmp]\nor edx, edi\n\n;; Slightly below midpoint\nfinit\nfld dword [rel nsbmidpoint]\n\n; Default rounding is 00 - round to nearest\nfist dword [rel tmp]\nmov si, word [rel tmp]\nshl esi, 16\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx edi, word [rel tmp]\nand edi, 0xf3ff\nor edi, 0x0400\nmov word [rel tmp], di\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov di, word [rel tmp]\nor esi, edi\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx ebp, word [rel tmp]\nand ebp, 0xf3ff\nor ebp, 0x0800\nmov word [rel tmp], bp\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov di, word [rel tmp]\nor edi, ebp\nshl edi, 16\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx ebp, word [rel tmp]\nand ebp, 0xf3ff\nor ebp, 0x0c00\nmov word [rel tmp], bp\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nmov bp, word [rel tmp]\nor edi, ebp\n\nhlt\n\nalign 4096\nnmidpoint:\n  dd -1.5\nnsamidpoint:\n  dd -1.49999\nnsbmidpoint:\n  dd -1.50001\n\nalign 4\ntmp:\ndd 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/RoundingPos.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x21212121\",\n    \"RCX\": \"0x1121\"\n  },\n  \"MemoryRegions\": {\n    \"0xf0000000\": \"4096\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Rounding tests to ensure rounding modes are actually working\n;; Mid-point\nfinit\nfld dword [rel midpoint]\n\n; Default rounding is 00 - round to nearest\nfist dword [rel tmp]\nmov ebx, dword [rel tmp]\nshl ebx, 4\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx eax, word [rel tmp]\nand eax, 0xf3ff\nor eax, 0x0400\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor ebx, dword [rel tmp]\nshl ebx, 4\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx eax, word [rel tmp]\nand eax, 0xf3ff\nor eax, 0x0800\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor ebx, dword [rel tmp]\nshl ebx, 4\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx eax, word [rel tmp]\nand eax, 0xf3ff\nor eax, 0x0c00\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nor ebx, dword [rel tmp]\nshl ebx, 4\n\n;; Slightly above midpoint\nfinit\nfld dword [rel samidpoint]\n\n; Default rounding is 00 - round to nearest\nfist dword [rel tmp]\nor ebx, dword [rel tmp]\nshl ebx, 4\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx eax, word [rel tmp]\nand eax, 0xf3ff\nor eax, 0x0400\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor ebx, dword [rel tmp]\nshl ebx, 4\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx eax, word [rel tmp]\nand eax, 0xf3ff\nor eax, 0x0800\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor ebx, dword [rel tmp]\nshl ebx, 4\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx eax, word [rel tmp]\nand eax, 0xf3ff\nor eax, 0x0c00\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nor ebx, dword [rel tmp]\n\n;; Slightly below midpoint\nfinit\nfld dword [rel sbmidpoint]\n\n; Default rounding is 00 - round to nearest\nfist dword [rel tmp]\nmov ecx, dword [rel tmp]\nshl ecx, 4\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx eax, word [rel tmp]\nand eax, 0xf3ff\nor eax, 0x0400\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor ecx, dword [rel tmp]\nshl ecx, 4\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx eax, word [rel tmp]\nand eax, 0xf3ff\nor eax, 0x0800\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor ecx, dword [rel tmp]\nshl ecx, 4\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx eax, word [rel tmp]\nand eax, 0xf3ff\nor eax, 0x0c00\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nor ecx, dword [rel tmp]\n\nhlt\n\nalign 4096\nmidpoint:\n  dd 1.5\nsamidpoint:\n  dd 1.50001\nsbmidpoint:\n  dd 1.49999\n\nalign 4\ntmp:\ndd 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_div_zero.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test 0.0 / 0.0 = Invalid Operation (should set bit 0 of status word)\nfldz\nfldz\nfdiv\n\nfstsw ax\nand eax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_fcos_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\nsection .rodata\n    ; Define the 80-bit (10-byte) constant for positive infinity.\n    positive_infinity: dt __Infinity__\n\nsection .text\nglobal _start\n_start:\n\nfinit            ; Initialize the FPU\nfld tword [rel positive_infinity]  ; Load the constant directly\nfcos\n\nfstsw ax\nand eax, 1\n\nhlt\n\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_fist_nan.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test FIST with NaN input = Invalid Operation (should set bit 0 of status word)\n; Create NaN by computing 0.0 / 0.0\nfldz\nfldz\nfdiv\n\n; Try to convert NaN to integer - this should set Invalid Operation\nlea ebx, [.data]\nfist dword [ebx]\n\nfstsw ax\nand eax, 1\n\nhlt\n\nalign 4096\n.data:\n  dd 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_fist_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test FIST with value too large for 32-bit integer = Invalid Operation\n; Load a large floating point value that exceeds INT32_MAX\nlea edx, [.large_value]\nfld tword [edx]\n\n; Try to convert to 32-bit integer - should set Invalid Operation\nlea ebx, [.data]\nfist dword [ebx]\n\nfstsw ax\nand eax, 1\n\nhlt\n\nalign 4096\n.large_value:\n  dt 1e20\n.data:\n  dd 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_fist_overflow_16bit.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test FIST with 16-bit overflow = Invalid Operation (should set bit 0 of status word)\n; Create a large number that will overflow int16\n\n; Load 2^30 (larger than int16 range: max int16 = 32767, 2^30 = 1073741824)\nfinit\nfild dword [.thirty]\nfld1\nfscale\n\n; Try to convert to int16 - this should overflow and be invalid\nfistp word [.dummy]\n\nfstsw ax\nand eax, 1\n\nhlt\n\nalign 4096\n.thirty: dd 30\n.dummy: dw 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_fist_overflow_32bit.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test FIST with 32-bit overflow = Invalid Operation (should set bit 0 of status word)\n; Create a large number that will overflow int32\n\n; Load 2^40 (larger than int32 range: max int32 = 2147483647, 2^40 = 1099511627776)\nfinit\nfild dword [.forty]\nfld1\nfscale\n\n; Try to convert to int32 - this should overflow and be invalid\nfistp dword [.dummy]\n\nfstsw ax\nand eax, 1\n\nhlt\n\nalign 4096\n.forty: dd 40\n.dummy: dd 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_fist_overflow_64bit.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test FIST with 64-bit overflow = Invalid Operation (should set bit 0 of status word)\n; Create a very large number that will overflow int64\n\n; Load 2^75 (larger than int64 range)\nfinit\nfild dword [.seventyfive]\nfld1\nfscale\n\n; Try to convert to int64 - this should overflow and be invalid\nfistp qword [.dummy]\n\nfstsw ax\nand eax, 1\n\nhlt\n\nalign 4096\n.seventyfive: dd 75\n.dummy: dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_fprem_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test FPREM with simple operands first\nfinit\n\n; Load simple operands: fprem(0, 1) should be valid and return 0\nfldz\nfld1\n\n; Do FPREM: ST(0) = fprem(ST(0), ST(1)) = fprem(1.0, 0.0)\n; fprem(1.0, 0.0) should set Invalid Operation because divisor is zero\nfprem\n\nfstsw ax\nand eax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_fptan_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test fptan(+infinity) in 32-bit mode = Invalid Operation (should set bit 0 of status word)\n; Load positive infinity: exponent all 1s, mantissa 0x8000000000000000\nmov eax, 0x00000000\nmov [rel .pos_inf], eax\nmov eax, 0x80000000\nmov [rel .pos_inf + 4], eax\nmov ax, 0x7FFF\nmov [rel .pos_inf + 8], ax\n\nfld tword [rel .pos_inf]\nfptan\n\nfstsw ax\nand eax, 1\n\nhlt\n\nalign 4096\n.pos_inf:\ndq 0\ndw 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_fsin_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test fsin(+infinity) in 32-bit mode = Invalid Operation (should set bit 0 of status word)\n; Load positive infinity: exponent all 1s, mantissa 0x8000000000000000\nmov eax, 0x00000000\nmov [rel .pos_inf], eax\nmov eax, 0x80000000\nmov [rel .pos_inf + 4], eax\nmov ax, 0x7FFF\nmov [rel .pos_inf + 8], ax\n\nfld tword [rel .pos_inf]\nfsin\n\nfstsw ax\nand eax, 1\n\nhlt\n\nalign 4096\n.pos_inf:\ndq 0\ndw 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_fsincos_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test fsincos(+infinity) in 32-bit mode = Invalid Operation (should set bit 0 of status word)\n; Load positive infinity: exponent all 1s, mantissa 0x8000000000000000\nmov eax, 0x00000000\nmov [rel .pos_inf], eax\nmov eax, 0x80000000\nmov [rel .pos_inf + 4], eax\nmov ax, 0x7FFF\nmov [rel .pos_inf + 8], ax\n\nfld tword [rel .pos_inf]\nfsincos\n\nfstsw ax\nand eax, 1\n\nhlt\n\nalign 4096\n.pos_inf:\ndq 0\ndw 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_infinity_fsub_memory.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test ∞ - ∞ using FSUB with memory operand = Invalid Operation (should set bit 0 of status word) - 32bit mode\n\n; Setup memory with +infinity (0x7FF0000000000000 for double precision +infinity)\n; In 32-bit mode, we need to store the double in two parts\nmov dword [rel .data], 0x00000000    ; Low 32 bits\nmov dword [rel .data+4], 0x7FF00000  ; High 32 bits\n\n; Create +infinity by dividing 1.0 by 0.0\nfld1\nfldz\nfdiv\n\n; Subtract ∞ - ∞ using memory operand - this should be invalid\nfsub qword [rel .data]\n\nfstsw ax\nand eax, 1\n\nhlt\n\nsection .data\nalign 4096\n.data: dq 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_infinity_fsubr_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test ∞ - ∞ using FSUBR = Invalid Operation (should set bit 0 of status word) - 32bit mode\nfld1\nfldz\nfdiv ; st0 = +∞\n\n; duplicate +infinity\nfld st0\n\n; Reverse subtract ∞ - ∞ using FSUBR - this should be invalid\nfsubr\n\nfstsw ax\nand eax, 1\n\nhlt"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_infinity_mul_zero.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test ∞ × 0 = Invalid Operation (should set bit 0 of status word)\nfld1\nfldz\nfdiv ; st0 = +∞\n\n; Load 0.0 and multiply with infinity\nfldz\nfmul\n\nfstsw ax\nand eax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_infinity_ops.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test ∞ - ∞ = Invalid Operation (should set bit 0 of status word)\nfld1\nfldz\nfdiv ; st0 = +∞\n\n; Duplicate +infinity on stack\nfld st0\n\n; Subtract: +∞ - +∞ -> Invalid Operation\nfsub\n\nfstsw ax\nand eax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_infinity_sub_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test ∞ - ∞ = Invalid Operation (should set bit 0 of status word) - 32bit mode\nfld1\nfldz\nfdiv ; st0 = +∞\n\n; Duplicate +infinity on stack\nfld st0\n\n; Subtract +∞ - ∞ - this should be invalid\nfsub\n\nfstsw ax\nand eax, 1\n\nhlt"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_neg_infinity_sub_neg_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test (-∞) - (-∞) = Invalid Operation (should set bit 0 of status word) - 32bit mode\n; Create -infinity by dividing -1.0 by 0.0\nfld1\nfchs\nfldz\nfdiv\n\n; duplicate -infinity on stack\nfld st0\n\n; Subtract (-∞) - (-∞) - this should be invalid\nfsub\n\nfstsw ax\nand eax, 1\n\nhlt"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_reduced_precision.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test Invalid Operation with reduced precision (64-bit)\n; Set precision control to 64-bit (PC = 10b)\nfnstcw [rel .saved_cw]\nmov ax, [rel .saved_cw]\nand ax, 0xFCFF\nor ax, 0x0200\nmov [rel .new_cw], ax\nfldcw [rel .new_cw]\n\n; Perform invalid operation: 0.0 / 0.0\nfldz\nfldz\nfdiv\n\nfstsw ax\nand eax, 1\n\n; Restore original control word\nfldcw [rel .saved_cw]\n\nhlt\n\nalign 4096\n.saved_cw:  dw 0\n.new_cw:    dw 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_simple_test.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test with a simple 0/0 that we know works\nfldz\nfldz\nfdiv\n\nfstsw ax\nand eax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/invalid_sqrt_negative.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test sqrt(-1.0) = Invalid Operation (should set bit 0 of status word)\nfld1\nfchs\nfsqrt\n\nfstsw ax\nand eax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/valid_fist_16bit.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RBX\": \"12346\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test FIST with valid 16-bit conversion\n; Load a value that fits in int16 range\n\nfinit\nfld qword [rel .value]\n\n; Convert to int16 - this should work without overflow\nfistp word [rel .result]\n\nfstsw ax\nand eax, 1\n\n; Load the result to verify conversion worked\nmovzx ebx, word [rel .result]\n\nhlt\n\nalign 4096\n.value: dq 12345.75\n.result: dw 0\n"
  },
  {
    "path": "unittests/32Bit_ASM/X87/valid_operation.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Test a valid operation that should NOT set Invalid Operation bit\nfld1\nfld1\nfadd\n\nfstsw ax\nand eax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/32Bit_ASM/arpl.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFF_0003\",\n    \"RBX\": \"0xFFFF_0003\",\n    \"RCX\": \"0\",\n    \"RDX\": \"0x000000000000119c\",\n    \"RSI\": \"0x0000000000000297\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n%macro setonz 1\n  setz cl\n  mov [rel .data + (%1 * 2)], cl\n%endmacro\n\nmov edx, 0\nmov ecx, 0\nmov esp, 0xe000_1000\n\n; Setup some flags\nmov edi, 0\n\n; Rest of the code after this sub only touches eflags.z\nsub edi, 1\n\n%assign i 0\n%assign offset 0\n%rep 4\n  %assign j 0\n  %rep 4\n    mov ebx, 0xFFFF_0000 + i\n    mov eax, 0xFFFF_0000 + j\n    ; ZF = dst.RPL < src.RPL\n    ; if (ZF) dst.RPL = src.RPL\n    arpl ax, bx\n    setonz offset\n    %assign j j+1\n    %assign offset offset+1\n  %endrep\n  %assign i i+1\n%endrep\n\n; Load flag state\n; Ensures that ONLY ZF changed.\npushfd\nmov esi, [esp]\n\n; Calculate data\n%assign j 0\n%rep 16\n  mov cl, [rel .data + (j * 2)]\n  or edx, ecx\n  shl edx, 1\n%assign j j+1\n%endrep\n\nhlt\n\n.full_flags:\ndd 0x4CD7\n\nalign 4096\n.data:\ndw 16 dup (0)\n"
  },
  {
    "path": "unittests/32Bit_ASM/arpl_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFF_01FD\",\n    \"RBX\": \"0xFFFF_0201\",\n    \"RCX\": \"0xFFFF_03FE\",\n    \"RDX\": \"0xFFFF_04FF\",\n    \"RSI\": \"0xFFFF_0501\",\n    \"RDI\": \"0xFFFF_06FC\"\n  },\n  \"Mode\": \"32BIT\"\n}\n%endif\n\n; Tests if ARPL copies or leaves alone the correct registers.\nmov eax, 0xFFFF_01FC\nmov ebx, 0xFFFF_0201\nmov ecx, 0xFFFF_03FE\nmov edx, 0xFFFF_04FF\nmov esi, 0xFFFF_0501\nmov edi, 0xFFFF_06FC\n\n; Modified dst < src\narpl ax, bx\n\n; Unmodified dst = src\narpl bx, si\n\n; Unmodified dst > src\narpl cx, si\n\nhlt\n"
  },
  {
    "path": "unittests/APITests/Allocator.cpp",
    "content": "#include <catch2/catch_all.hpp>\n#include <FEXCore/Utils/Allocator.h>\n\nnamespace {\n\nusing FEXCore::Allocator::MemoryRegion;\n\nstruct Fixture {\n  Fixture() {\n    fd = mkstemp(filename);\n    if (fd == -1) {\n      std::abort();\n    }\n  }\n\n  ~Fixture() {\n    close(fd);\n    remove(filename);\n  }\n\n  fextl::vector<FEXCore::Allocator::MemoryRegion> CollectMemoryGaps(std::string_view Input, uintptr_t Begin, uintptr_t End) {\n    // Reload input, or just create all possible inputs as file and then select the fd instead\n    lseek(fd, 0, SEEK_SET);\n    write(fd, Input.data(), Input.size());\n    lseek(fd, 0, SEEK_SET);\n    return FEXCore::Allocator::CollectMemoryGaps(Begin, End, fd);\n  }\n\n  char filename[64] = P_tmpdir \"/alloctestXXXXXX\";\n  int fd;\n};\n\nMemoryRegion FromTo(uintptr_t Start, uintptr_t End) {\n  return MemoryRegion {reinterpret_cast<void*>(Start), End - Start};\n}\n\n} // anonymous namespace\n\nnamespace FEXCore::Allocator {\nbool operator==(const MemoryRegion& a, const MemoryRegion& b) {\n  return a.Ptr == b.Ptr && a.Size == b.Size;\n}\n\ninline std::ostream& operator<<(std::ostream& os, MemoryRegion region) {\n  os << std::hex << region.Ptr << \"-\" << reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(region.Ptr) + region.Size);\n  return os;\n}\n\ninline std::ostream& operator<<(std::ostream& os, fextl::vector<MemoryRegion> regions) {\n  os << \"{\";\n  bool first = true;\n  for (auto& region : regions) {\n    if (!first) {\n      os << \", \";\n    }\n    first = false;\n    os << region;\n  }\n  os << \"}\";\n  return os;\n}\n} // namespace FEXCore::Allocator\n\nTEST_CASE_METHOD(Fixture, \"Trivial\") {\n  // Single entry covering exactly 2 pages of memory\n  const char SingletonMappings[] = \"000000100000-000000102000 r--p 00000000 00:00 0                          placeholder\\n\";\n\n  auto Begin = GENERATE(0, 0xff000, 0x100000, 0x101000, 0x102000);\n  auto End = GENERATE(0xff000, 0x100000, 0x101000, 0x102000, 0x103000);\n  if (Begin >= End) {\n    return;\n  }\n\n  auto Mappings = CollectMemoryGaps(SingletonMappings, Begin, End);\n  INFO(\"CollectMemoryGaps 0x\" << std::hex << Begin << \"-0x\" << End);\n\n  if (Begin < 0x100000 && End == 0x103000) {\n    CHECK_THAT(Mappings, Catch::Matchers::Equals(fextl::vector<MemoryRegion> {FromTo(Begin, 0x100000), FromTo(0x102000, 0x103000)}));\n  } else if (Begin < 0x100000 && End < 0x100000) {\n    CHECK_THAT(Mappings, Catch::Matchers::Equals(fextl::vector<MemoryRegion> {FromTo(Begin, End)}));\n  } else if (Begin < 0x100000 && End <= 0x102000) {\n    CHECK_THAT(Mappings, Catch::Matchers::Equals(fextl::vector<MemoryRegion> {FromTo(Begin, 0x100000)}));\n  } else if (End != 0x103000) {\n    CHECK_THAT(Mappings, Catch::Matchers::Equals(fextl::vector<MemoryRegion> {}));\n  } else {\n    // Begin >= 0x100000 and End == 0x103000\n    CHECK_THAT(Mappings, Catch::Matchers::Equals(fextl::vector<MemoryRegion> {FromTo(0x102000, End)}));\n  }\n}\n\nTEST_CASE_METHOD(Fixture, \"RealWorld\") {\n  const char RealWorldMappings[] = \"aaaaaaaa0000-aaaaaadba000 r--p 00000000 00:00 0                          placeholder\\n\"\n                                   \"aaaaaadc9000-aaaaab77a000 r-xp 00000000 00:00 0                          placeholder\\n\"\n                                   \"aaaaab789000-aaaaab7b7000 r--p 00000000 00:00 0                          placeholder\\n\"\n                                   \"aaaaab7c6000-aaaaab894000 rw-p 00000000 00:00 0                          placeholder\\n\"\n                                   \"aaaaab894000-aaaaabcc9000 rw-p 00000000 00:00 0                          placeholder\\n\"\n                                   \"aaaaabcc9000-aaaaabcca000 ---p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff6a00000-fffff7a00000 rw-p 00000000 00:00 0\\n\"\n                                   \"fffff7af0000-fffff7c78000 r-xp 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7c78000-fffff7c87000 ---p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7c87000-fffff7c8b000 r--p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7c8b000-fffff7c8d000 rw-p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7c8d000-fffff7c99000 rw-p 00000000 00:00 0\\n\"\n                                   \"fffff7ca0000-fffff7cb4000 r-xp 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7cb4000-fffff7cc3000 ---p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7cc3000-fffff7cc4000 r--p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7cc4000-fffff7cc5000 rw-p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7cd0000-fffff7d56000 r-xp 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7d56000-fffff7d65000 ---p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7d65000-fffff7d66000 r--p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7d66000-fffff7d67000 rw-p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7d70000-fffff7f7a000 r-xp 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7f7a000-fffff7f89000 ---p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7f89000-fffff7f94000 r--p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7f94000-fffff7f97000 rw-p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7f97000-fffff7f9a000 rw-p 00000000 00:00 0\\n\"\n                                   \"fffff7fc2000-fffff7fed000 r-xp 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7fef000-fffff7ff9000 rw-p 00000000 00:00 0\\n\"\n                                   \"fffff7ff9000-fffff7ffb000 r--p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7ffb000-fffff7ffc000 r-xp 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7ffc000-fffff7ffe000 r--p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffff7ffe000-fffff8000000 rw-p 00000000 00:00 0                          placeholder\\n\"\n                                   \"fffffffd2000-1000000000000 rw-p 00000000 00:00 0                         [stack]\\n\";\n\n  using namespace Catch::Generators;\n  uintptr_t Begin = GENERATE(take(30, random<uintptr_t>(0, 0xffffffffffffffff / 0x1000))) * 0x1000;\n  uintptr_t End = GENERATE(take(30, random<uintptr_t>(0, 0xffffffffffffffff / 0x1000))) * 0x1000;\n  if (Begin >= End) {\n    return;\n  }\n\n  auto Mappings = CollectMemoryGaps(RealWorldMappings, Begin, End);\n  INFO(\"CollectMemoryGaps 0x\" << std::hex << Begin << \"-0x\" << End);\n\n  fextl::vector<MemoryRegion> ref {\n    FromTo(0x0, 0xaaaaaaaa0000),\n    FromTo(0xaaaaaadba000, 0xaaaaaadc9000),\n    FromTo(0xaaaaab77a000, 0xaaaaab789000),\n    FromTo(0xaaaaab7b7000, 0xaaaaab7c6000),\n    FromTo(0xaaaaabcca000, 0xfffff6a00000),\n    FromTo(0xfffff7a00000, 0xfffff7af0000),\n    FromTo(0xfffff7c99000, 0xfffff7ca0000),\n    FromTo(0xfffff7cc5000, 0xfffff7cd0000),\n    FromTo(0xfffff7d67000, 0xfffff7d70000),\n    FromTo(0xfffff7f9a000, 0xfffff7fc2000),\n    FromTo(0xfffff7fed000, 0xfffff7fef000),\n    FromTo(0xfffff8000000, 0xfffffffd2000),\n    FromTo(0x1000000000000, 0xffffffffffffffff),\n  };\n\n  for (auto it = ref.begin(); it != ref.end();) {\n    if (reinterpret_cast<uintptr_t>(it->Ptr) + it->Size <= Begin) {\n      it = ref.erase(it);\n    } else if (reinterpret_cast<uintptr_t>(it->Ptr) >= End) {\n      it = ref.erase(it);\n    } else {\n      ++it;\n    }\n  }\n\n  if (!ref.empty()) {\n    ref.front().Size -= std::max(Begin, reinterpret_cast<uintptr_t>(ref.front().Ptr)) - reinterpret_cast<uintptr_t>(ref.front().Ptr);\n    ref.front().Ptr = std::max(reinterpret_cast<void*>(Begin), ref.front().Ptr);\n    ref.back().Size = End - reinterpret_cast<uintptr_t>(ref.back().Ptr);\n  }\n\n  CHECK_THAT(Mappings, Catch::Matchers::Equals(ref));\n}\n"
  },
  {
    "path": "unittests/APITests/ArgumentParser.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <FEXHeaderUtils/StringArgumentParser.h>\n\nTEST_CASE(\"Basic\") {\n  const auto ArgString = \"Test a b c\";\n  auto Args = FHU::ParseArgumentsFromString(ArgString);\n  REQUIRE(Args.size() == 4);\n  CHECK(Args.at(0) == \"Test\");\n  CHECK(Args.at(1) == \"a\");\n  CHECK(Args.at(2) == \"b\");\n  CHECK(Args.at(3) == \"c\");\n}\n\nTEST_CASE(\"Basic - Empty\") {\n  const auto ArgString = \"\";\n  auto Args = FHU::ParseArgumentsFromString(ArgString);\n  REQUIRE(Args.size() == 0);\n}\n\nTEST_CASE(\"Basic - Empty spaces\") {\n  const auto ArgString = \"                       \";\n  auto Args = FHU::ParseArgumentsFromString(ArgString);\n  REQUIRE(Args.size() == 0);\n}\n\nTEST_CASE(\"Basic - Space at start\") {\n  const auto ArgString = \"      Test a b c\";\n  auto Args = FHU::ParseArgumentsFromString(ArgString);\n  REQUIRE(Args.size() == 4);\n  CHECK(Args.at(0) == \"Test\");\n  CHECK(Args.at(1) == \"a\");\n  CHECK(Args.at(2) == \"b\");\n  CHECK(Args.at(3) == \"c\");\n}\n\nTEST_CASE(\"Basic - Bonus spaces between args\") {\n  const auto ArgString = \"Test       a      b      c\";\n  auto Args = FHU::ParseArgumentsFromString(ArgString);\n  REQUIRE(Args.size() == 4);\n  CHECK(Args.at(0) == \"Test\");\n  CHECK(Args.at(1) == \"a\");\n  CHECK(Args.at(2) == \"b\");\n  CHECK(Args.at(3) == \"c\");\n}\n\nTEST_CASE(\"Basic - non printable\") {\n  const auto ArgString = \"Test a b \\x01c\";\n  auto Args = FHU::ParseArgumentsFromString(ArgString);\n  REQUIRE(Args.size() == 4);\n  CHECK(Args.at(0) == \"Test\");\n  CHECK(Args.at(1) == \"a\");\n  CHECK(Args.at(2) == \"b\");\n  CHECK(Args.at(3) == \"\\x01c\");\n}\n\nTEST_CASE(\"Basic - Emoji\") {\n  const auto ArgString = \"Test a b 🐸\";\n  auto Args = FHU::ParseArgumentsFromString(ArgString);\n  REQUIRE(Args.size() == 4);\n  CHECK(Args.at(0) == \"Test\");\n  CHECK(Args.at(1) == \"a\");\n  CHECK(Args.at(2) == \"b\");\n  CHECK(Args.at(3) == \"🐸\");\n}\n\nTEST_CASE(\"Basic - space at the end\") {\n  const auto ArgString = \"Test a b 🐸        \";\n  auto Args = FHU::ParseArgumentsFromString(ArgString);\n  REQUIRE(Args.size() == 4);\n  CHECK(Args.at(0) == \"Test\");\n  CHECK(Args.at(1) == \"a\");\n  CHECK(Args.at(2) == \"b\");\n  CHECK(Args.at(3) == \"🐸\");\n}\n"
  },
  {
    "path": "unittests/APITests/CMakeLists.txt",
    "content": "set(TESTS\n  Allocator\n  ArgumentParser\n  ExtendedVolatileMetadata\n  fextl_function\n  FileMappingBaseAddress\n  Filesystem\n  InterruptableConditionVariable\n  StringUtils)\n\nlist(APPEND LIBS Common FEXCore JemallocLibs)\n\nforeach(API_TEST ${TESTS})\n  add_executable(${API_TEST} ${API_TEST}.cpp)\n  target_link_libraries(${API_TEST} PRIVATE ${LIBS} Catch2::Catch2WithMain)\n\n  catch_discover_tests(${API_TEST}\n    TEST_SUFFIX \".${API_TEST}.APITest\")\nendforeach()\n\nadd_custom_target(api_tests\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"302\" ${TEST_JOB_FLAG} \"-R\" \"\\.*.APITest\")\n\nforeach(API_TEST ${TESTS})\n  add_dependencies(api_tests ${API_TEST})\nendforeach()\n"
  },
  {
    "path": "unittests/APITests/ExtendedVolatileMetadata.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <catch2/catch_all.hpp>\n#include \"Common/VolatileMetadata.h\"\n\nTEST_CASE(\"Basic - Empty\") {\n  const auto String = \"\";\n  const auto Result = FEX::VolatileMetadata::ParseExtendedVolatileMetadata(String);\n  REQUIRE(Result.empty());\n}\n\nTEST_CASE(\"Basic - Empty - modules\") {\n  const auto String = \":::::\";\n  const auto Result = FEX::VolatileMetadata::ParseExtendedVolatileMetadata(String);\n  REQUIRE(Result.empty());\n}\n\nTEST_CASE(\"Basic - Single\") {\n  const auto String = \"hl2_linux\";\n  const auto Result = FEX::VolatileMetadata::ParseExtendedVolatileMetadata(String);\n  REQUIRE(Result.size() == 1);\n\n  REQUIRE(Result.contains(\"hl2_linux\"));\n  CHECK(Result.at(\"hl2_linux\").ModuleTSODisabled == true);\n  CHECK(Result.at(\"hl2_linux\").VolatileInstructions.empty());\n  CHECK(Result.at(\"hl2_linux\").VolatileValidRanges.Empty());\n}\n\nTEST_CASE(\"Basic - Multiple\") {\n  const auto String = \"hl2_linux:DeckJob\";\n  const auto Result = FEX::VolatileMetadata::ParseExtendedVolatileMetadata(String);\n  REQUIRE(Result.size() == 2);\n\n  REQUIRE(Result.contains(\"hl2_linux\"));\n  CHECK(Result.at(\"hl2_linux\").ModuleTSODisabled == true);\n  CHECK(Result.at(\"hl2_linux\").VolatileInstructions.empty());\n  CHECK(Result.at(\"hl2_linux\").VolatileValidRanges.Empty());\n\n  REQUIRE(Result.contains(\"DeckJob\"));\n  CHECK(Result.at(\"DeckJob\").ModuleTSODisabled == true);\n  CHECK(Result.at(\"DeckJob\").VolatileInstructions.empty());\n  CHECK(Result.at(\"DeckJob\").VolatileValidRanges.Empty());\n}\n\nTEST_CASE(\"Basic - Single plus empty\") {\n  const auto String = \"hl2_linux:::::\";\n  const auto Result = FEX::VolatileMetadata::ParseExtendedVolatileMetadata(String);\n  REQUIRE(Result.size() == 1);\n  REQUIRE(Result.contains(\"hl2_linux\"));\n  CHECK(Result.at(\"hl2_linux\").ModuleTSODisabled == true);\n  CHECK(Result.at(\"hl2_linux\").VolatileInstructions.empty());\n  CHECK(Result.at(\"hl2_linux\").VolatileValidRanges.Empty());\n}\n\nstatic inline bool ContainsRange(std::pair<uint64_t, uint64_t> Range, const std::vector<std::pair<uint64_t, uint64_t>>& ValidRanges) {\n  return std::ranges::find(ValidRanges, Range) != ValidRanges.end();\n}\n\nTEST_CASE(\"Basic - Single - offset\") {\n  const auto String = \"hl2_linux;0x0-0x1000\";\n  const auto Result = FEX::VolatileMetadata::ParseExtendedVolatileMetadata(String);\n  REQUIRE(Result.size() == 1);\n\n  REQUIRE(Result.contains(\"hl2_linux\"));\n  CHECK(Result.at(\"hl2_linux\").ModuleTSODisabled == false);\n  CHECK(Result.at(\"hl2_linux\").VolatileInstructions.empty());\n  CHECK(Result.at(\"hl2_linux\").VolatileValidRanges.Empty() == false);\n\n  const std::vector<std::pair<uint64_t, uint64_t>> ValidRanges = {\n    {0, 0x1000},\n  };\n\n  for (auto it : Result.at(\"hl2_linux\").VolatileValidRanges) {\n    CHECK(ContainsRange(std::make_pair(it.Offset, it.End), ValidRanges));\n  }\n}\n\nTEST_CASE(\"Basic - Single - offset x2\") {\n  const auto String = \"hl2_linux;0x0-0x1000,0x2000-0x3000\";\n  const auto Result = FEX::VolatileMetadata::ParseExtendedVolatileMetadata(String);\n  REQUIRE(Result.size() == 1);\n  REQUIRE(Result.contains(\"hl2_linux\"));\n  CHECK(Result.at(\"hl2_linux\").ModuleTSODisabled == false);\n  CHECK(Result.at(\"hl2_linux\").VolatileInstructions.empty());\n  CHECK(Result.at(\"hl2_linux\").VolatileValidRanges.Empty() == false);\n\n  const std::vector<std::pair<uint64_t, uint64_t>> ValidRanges = {\n    {0, 0x1000},\n    {0x2000, 0x3000},\n  };\n\n  for (auto it : Result.at(\"hl2_linux\").VolatileValidRanges) {\n    CHECK(ContainsRange(std::make_pair(it.Offset, it.End), ValidRanges));\n  }\n}\n\nTEST_CASE(\"Basic - Single - offset plus instruction\") {\n  const auto String = \"hl2_linux;0x0-0x1000;0x1,0x2,0x3\";\n  const auto Result = FEX::VolatileMetadata::ParseExtendedVolatileMetadata(String);\n  REQUIRE(Result.size() == 1);\n  REQUIRE(Result.contains(\"hl2_linux\"));\n  CHECK(Result.at(\"hl2_linux\").ModuleTSODisabled == false);\n  CHECK(Result.at(\"hl2_linux\").VolatileInstructions.empty() == false);\n  CHECK(Result.at(\"hl2_linux\").VolatileValidRanges.Empty() == false);\n\n  const std::vector<std::pair<uint64_t, uint64_t>> ValidRanges = {\n    {0, 0x1000},\n  };\n\n  const std::vector<uint64_t> ValidInsts = {\n    1,\n    2,\n    3,\n  };\n\n  for (auto it : Result.at(\"hl2_linux\").VolatileValidRanges) {\n    CHECK(ContainsRange(std::make_pair(it.Offset, it.End), ValidRanges));\n  }\n\n  for (auto it : Result.at(\"hl2_linux\").VolatileInstructions) {\n    CHECK_THAT(ValidInsts, Catch::Matchers::Contains(it));\n  }\n}\n\nTEST_CASE(\"Basic - Double - offset\") {\n  const auto String = \"hl2_linux;0x0-0x1000:DeckJob;0x2000-0x3000\";\n  const auto Result = FEX::VolatileMetadata::ParseExtendedVolatileMetadata(String);\n  REQUIRE(Result.size() == 2);\n\n  {\n    REQUIRE(Result.contains(\"hl2_linux\"));\n    CHECK(Result.at(\"hl2_linux\").ModuleTSODisabled == false);\n    CHECK(Result.at(\"hl2_linux\").VolatileInstructions.empty());\n    CHECK(Result.at(\"hl2_linux\").VolatileValidRanges.Empty() == false);\n\n    const std::vector<std::pair<uint64_t, uint64_t>> ValidRanges = {\n      {0, 0x1000},\n    };\n\n    for (auto it : Result.at(\"hl2_linux\").VolatileValidRanges) {\n      CHECK(ContainsRange(std::make_pair(it.Offset, it.End), ValidRanges));\n    }\n  }\n\n  {\n    REQUIRE(Result.contains(\"DeckJob\"));\n    CHECK(Result.at(\"DeckJob\").ModuleTSODisabled == false);\n    CHECK(Result.at(\"DeckJob\").VolatileInstructions.empty());\n    CHECK(Result.at(\"DeckJob\").VolatileValidRanges.Empty() == false);\n\n    const std::vector<std::pair<uint64_t, uint64_t>> ValidRanges = {\n      {0x2000, 0x3000},\n    };\n\n    for (auto it : Result.at(\"DeckJob\").VolatileValidRanges) {\n      CHECK(ContainsRange(std::make_pair(it.Offset, it.End), ValidRanges));\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/APITests/FileMappingBaseAddress.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <catch2/catch_all.hpp>\n#include <Common/FileMappingBaseAddress.h>\n\n#include <FEXCore/fextl/vector.h>\n\nnamespace {\n\nstruct Mapping {\n  uint64_t Addr;\n  uint64_t Size;\n  uint64_t FileOffset;\n  int Flags; // PF_*\n};\n\n} // anonymous namespace\n\nTEST_CASE(\"libm\") {\n  uint64_t BaseAddr = 0x123400000;\n\n  fextl::vector<Elf64_Phdr> Headers = {\n    {.p_type = PT_LOAD, .p_offset = 0x00000, .p_vaddr = 0x00000, .p_paddr = 0x00000, .p_filesz = 0x7bdd5, .p_memsz = 0x7bdd5},\n    {.p_type = PT_LOAD, .p_offset = 0x7c000, .p_vaddr = 0x7c000, .p_paddr = 0x7c000, .p_filesz = 0x6f3a8, .p_memsz = 0x6f3a8},\n    {.p_type = PT_LOAD, .p_offset = 0xebbd0, .p_vaddr = 0xecbd0, .p_paddr = 0xecbd0, .p_filesz = 0x434, .p_memsz = 0x440},\n  };\n\n  fextl::vector<Mapping> Mappings = {\n    {.Addr = BaseAddr, .Size = 0x7c000, .FileOffset = 0x00000},\n    {.Addr = BaseAddr + 0x7c000, .Size = 0x70000, .FileOffset = 0x7c000},\n    {.Addr = BaseAddr + 0xec000, .Size = 0x2000, .FileOffset = 0xeb000},\n  };\n\n  for (auto& Mapping : Mappings) {\n    INFO(\"Mapping to 0x\" << std::hex << Mapping.Addr << \"-0x\" << Mapping.Addr + Mapping.Size << \" from file offset 0x\" << Mapping.FileOffset);\n    auto DeducedBase = FEXCore::InferMappingBaseAddress(Headers, Mapping.Addr, Mapping.Size, Mapping.FileOffset, Mapping.Flags);\n    CHECK(DeducedBase == fextl::vector<uint64_t> {BaseAddr});\n  }\n}\n\n// E.g. libX11-xcb\nTEST_CASE(\"Access flags are checked\") {\n  uint64_t BaseAddr = 0x123400000;\n\n  fextl::vector<Elf64_Phdr> Headers = {\n    {.p_type = PT_LOAD, .p_flags = PF_R | PF_X, .p_offset = 0x0000, .p_vaddr = 0x0000, .p_paddr = 0x0000, .p_filesz = 0x00040d, .p_memsz = 0x00040d},\n    {.p_type = PT_LOAD, .p_flags = PF_R, .p_offset = 0x1000, .p_vaddr = 0x1000, .p_paddr = 0x1000, .p_filesz = 0x00036c, .p_memsz = 0x00036c},\n    {.p_type = PT_LOAD, .p_flags = PF_W, .p_offset = 0x1dc8, .p_vaddr = 0x2dc8, .p_paddr = 0x2dc8, .p_filesz = 0x000238, .p_memsz = 0x000240},\n  };\n\n  fextl::vector<Mapping> Mappings = {\n    {.Addr = BaseAddr + 0x1000, .Size = 0x1000, .FileOffset = 0x1000, .Flags = PF_R},\n    {.Addr = BaseAddr + 0x2000, .Size = 0x1000, .FileOffset = 0x1000, .Flags = PF_W},\n  };\n\n  for (auto& Mapping : Mappings) {\n    INFO(\"Mapping to 0x\" << std::hex << Mapping.Addr << \"-0x\" << Mapping.Addr + Mapping.Size << \" from file offset 0x\" << Mapping.FileOffset);\n    auto DeducedBase = FEXCore::InferMappingBaseAddress(Headers, Mapping.Addr, Mapping.Size, Mapping.FileOffset, Mapping.Flags);\n    CHECK(DeducedBase == fextl::vector<uint64_t> {BaseAddr});\n  }\n}\n\n// Program headers that don't generate memory mappings can't be used to infer base addresses\nTEST_CASE(\"Non-mapping program headers are ignored\") {\n  uint64_t BaseAddr = 0x123400000;\n\n  fextl::vector<Elf64_Phdr> Headers = {\n    {.p_type = PT_LOAD, .p_offset = 0x00000, .p_vaddr = 0x0000, .p_paddr = 0x00000, .p_filesz = 0x1000, .p_memsz = 0x1000},\n    {.p_type = PT_INTERP, .p_offset = 0x10000, .p_vaddr = 0xa000, .p_paddr = 0xa0000, .p_filesz = 0x1000, .p_memsz = 0x1000},\n    {.p_type = PT_LOAD, .p_offset = 0x10000, .p_vaddr = 0x1000, .p_paddr = 0x10000, .p_filesz = 0x1000, .p_memsz = 0x1000},\n  };\n\n  fextl::vector<Mapping> Mappings = {\n    {.Addr = BaseAddr + 0x1000, .Size = 0x1000, .FileOffset = 0x10000},\n  };\n\n  for (auto& Mapping : Mappings) {\n    INFO(\"Mapping to 0x\" << std::hex << Mapping.Addr << \"-0x\" << Mapping.Addr + Mapping.Size << \" from file offset 0x\" << Mapping.FileOffset);\n    auto DeducedBase = FEXCore::InferMappingBaseAddress(Headers, Mapping.Addr, Mapping.Size, Mapping.FileOffset, Mapping.Flags);\n    CHECK(DeducedBase == fextl::vector<uint64_t> {BaseAddr});\n  }\n}\n\n// Some binaries have (e.g. glxtest) end up with two RW mappings at the end that trigger two mmap parameters that only differ in their\n// virtual address. In such cases, multiple base addresses could be valid\nTEST_CASE(\"Duplicate data page\") {\n  uint64_t BaseAddr = 0x123400000;\n\n  fextl::vector<Elf64_Phdr> Headers = {\n    {.p_type = PT_LOAD, .p_flags = PF_R, .p_offset = 0x00000, .p_vaddr = 0x0000, .p_paddr = 0x00000, .p_filesz = 0x1000, .p_memsz = 0x1000},\n    {.p_type = PT_LOAD, .p_flags = PF_R | PF_X, .p_offset = 0x3910, .p_vaddr = 0x4910, .p_paddr = 0x4910, .p_filesz = 0x29d0, .p_memsz = 0x29d0},\n    {.p_type = PT_LOAD, .p_flags = PF_R | PF_W, .p_offset = 0x62e0, .p_vaddr = 0x82e0, .p_paddr = 0x82e0, .p_filesz = 0x6e0, .p_memsz = 0xd20},\n    {.p_type = PT_LOAD, .p_flags = PF_R | PF_W, .p_offset = 0x69c0, .p_vaddr = 0x99c0, .p_paddr = 0x99c0, .p_filesz = 0x018, .p_memsz = 0x068},\n  };\n\n  fextl::vector<Mapping> Mappings = {\n    {.Addr = BaseAddr, .Size = 0x4000, .FileOffset = 0x0000, .Flags = PF_R},\n    {.Addr = BaseAddr + 0x4000, .Size = 0x4000, .FileOffset = 0x3000, .Flags = PF_R | PF_X},\n    {.Addr = BaseAddr + 0x8000, .Size = 0x1000, .FileOffset = 0x6000, .Flags = PF_R | PF_W},\n    {.Addr = BaseAddr + 0x9000, .Size = 0x1000, .FileOffset = 0x6000, .Flags = PF_R | PF_W},\n  };\n\n  for (auto& Mapping : Mappings) {\n    INFO(\"Mapping to 0x\" << std::hex << Mapping.Addr << \"-0x\" << Mapping.Addr + Mapping.Size << \" from file offset 0x\" << Mapping.FileOffset);\n    auto DeducedBase = FEXCore::InferMappingBaseAddress(Headers, Mapping.Addr, Mapping.Size, Mapping.FileOffset, Mapping.Flags);\n    if (Mapping.Addr < BaseAddr + 0x8000) {\n      CHECK(DeducedBase == fextl::vector<uint64_t> {BaseAddr});\n    } else {\n      CHECK(DeducedBase == fextl::vector<uint64_t> {Mapping.Addr - 0x8000, Mapping.Addr - 0x9000});\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/APITests/Filesystem.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n#include <catch2/generators/catch_generators.hpp>\n#include <filesystem>\n#include <FEXHeaderUtils/Filesystem.h>\n\nTEST_CASE(\"LexicallyNormal\") {\n  auto Path = GENERATE(\"\", \"/\", \"/./\", \"//.\", \"//./\", \"//.//\",\n\n                       \".\", \"..\", \".//\", \"../../\", \"././\", \"./../\", \"./../\", \"./.././.././.\", \"./.././.././..\",\n\n                       \"./foo1/../\", \"foo4/.///bar/../\", \"foo5/././\",\n\n                       \"foo6/\", \"foo7/test\", \"foo8/test/\", \"foo9/./../test/\",\n\n                       \"/../..\", \"...\", \"/...\", \"foo10/...\", \"/..\", \"/foo11/../../bar\");\n\n  REQUIRE(std::string_view(FHU::Filesystem::LexicallyNormal(Path)) == std::string_view(std::filesystem::path(Path).lexically_normal().string()));\n}\n\nTEST_CASE(\"LexicallyNormalDifferences\", \"[!shouldfail]\") {\n  auto Path = GENERATE(\"\",\n                       // std::fs here keeps the `/` after `foo2/`\n                       // FEX algorithm doesn't keep behaviour here.\n                       \"foo2/./bar/..\",  // std::fs -> \"foo2/\"\n                       \"foo2/.///bar/..\" // std::fs -> \"foo3/\"\n  );\n\n  REQUIRE(std::string_view(FHU::Filesystem::LexicallyNormal(Path)) == std::string_view(std::filesystem::path(Path).lexically_normal().string()));\n}\n\nTEST_CASE(\"ParentPath\") {\n  auto Path = GENERATE(\"\", \"/\", \"/./\", \"//.\", \"//./\", \"//.//\",\n\n                       \".\", \"..\", \".//\", \"../../\", \"././\", \"./../\", \"./../\", \"./.././.././.\", \"./.././.././..\",\n\n                       \"./foo/../\", \"foo/./bar/..\", \"foo/.///bar/..\", \"foo/.///bar/../\",\n                       \"foo/././\"\n                       \"...\",\n                       \"/...\", \"foo/...\", \"/..\", \"/foo/../../bar\");\n\n  REQUIRE(std::string_view(FHU::Filesystem::ParentPath(Path)) == std::string_view(std::filesystem::path(Path).parent_path().string()));\n}\n"
  },
  {
    "path": "unittests/APITests/InterruptableConditionVariable.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n#include <chrono>\n#include <csetjmp>\n#include <FEXCore/Utils/InterruptableConditionVariable.h>\n#include <FEXHeaderUtils/Syscalls.h>\n\n#include <thread>\n#include <signal.h>\n\n// Test that ensures the Reentrant mutex will timeout without signaling\nTEST_CASE(\"SimpleWait\") {\n  auto Dur = std::chrono::seconds(1);\n  FEXCore::InterruptableConditionVariable Mutex {};\n\n  auto Now = std::chrono::high_resolution_clock::now();\n  bool Signaled = Mutex.WaitFor(Dur);\n  auto End = std::chrono::high_resolution_clock::now();\n\n  // We weren't signaled\n  REQUIRE(Signaled == false);\n\n  // We waited at least the full duration\n  REQUIRE((End - Now) >= Dur);\n}\n\nvoid WaitThread(FEXCore::InterruptableConditionVariable* Mutex, bool* Signaled) {\n  auto Dur = std::chrono::seconds(5);\n  *Signaled = Mutex->WaitFor(Dur);\n}\n\n// Test that ensure the Reentrant mutex will signal without timing out\nTEST_CASE(\"SignaledWait\") {\n  bool Signaled {};\n  FEXCore::InterruptableConditionVariable Mutex {};\n\n  std::thread t(WaitThread, &Mutex, &Signaled);\n\n  auto Now = std::chrono::high_resolution_clock::now();\n  Mutex.NotifyAll();\n  auto End = std::chrono::high_resolution_clock::now();\n\n  t.join();\n\n  auto Dur = std::chrono::seconds(5);\n  // Expected to signal\n  REQUIRE(Signaled);\n  // Ensure we didn't timeout\n  REQUIRE((End - Now) < Dur);\n}\n\nstatic jmp_buf LongJump {};\nstatic int32_t NumberOfJumps {};\nFEXCore::InterruptableConditionVariable WaitMutex {};\n\nvoid SignalHandler(int Signal) {\n  ++NumberOfJumps;\n  longjmp(LongJump, 1);\n}\n\nvoid WaitThreadLongJump(FEXCore::InterruptableConditionVariable* Mutex, FEXCore::InterruptableConditionVariable* ThreadReadyMutex,\n                        bool* Signaled, int32_t* TID) {\n\n  // Store the TID\n  *TID = FHU::Syscalls::gettid();\n\n  // Setup a long jump signal handler\n  struct sigaction sa {};\n  sa.sa_flags = SA_RESTART | SA_NODEFER;\n  sigemptyset(&sa.sa_mask);\n  sa.sa_handler = SignalHandler;\n  sigaction(SIGUSR1, &sa, nullptr);\n\n  // long jump here\n  int Value = setjmp(LongJump);\n\n  if (Value == 0) {\n    // Only notify that we are ready once\n    ThreadReadyMutex->NotifyAll();\n  }\n\n  // Notify the loop that we are ready for signaling again\n  WaitMutex.NotifyAll();\n\n  // Time out after two seconds\n  auto Dur = std::chrono::seconds(2);\n  *Signaled = Mutex->WaitFor(Dur);\n}\n\n// Test that ensures the Reentrant mutex survives over a long jump\n// Without signaling the mutex\nTEST_CASE(\"SignaledWaitLongJumpNoSignal\") {\n  int32_t TID {};\n  bool Signaled {};\n  FEXCore::InterruptableConditionVariable Mutex {};\n  FEXCore::InterruptableConditionVariable ThreadReadyMutex {};\n\n  NumberOfJumps = 0;\n  std::thread t(WaitThreadLongJump, &Mutex, &ThreadReadyMutex, &Signaled, &TID);\n\n  // Wait for our thread to become ready\n  ThreadReadyMutex.Wait();\n\n  int32_t NumberOfJumpsToDo = 5;\n  for (int32_t i = 0; i < NumberOfJumpsToDo; ++i) {\n    // Wait for the thread to signal that it is ready to receive signal\n    WaitMutex.WaitFor(std::chrono::milliseconds(500));\n    // Send the signal to the thread\n    FHU::Syscalls::tgkill(::getpid(), TID, SIGUSR1);\n  }\n\n  // Wait for thread join\n  t.join();\n\n  // We never signaled, so we should never receive signal\n  REQUIRE(Signaled == false);\n  // Ensure we long jumped the correct number of times\n  REQUIRE(NumberOfJumps == NumberOfJumpsToDo);\n}\n\n// Test that ensures the Reentrant mutex survives over a long jump\n// With signaling the mutex\nTEST_CASE(\"SignaledWaitLongJumpSignal\") {\n  int32_t TID {};\n  bool Signaled {};\n  FEXCore::InterruptableConditionVariable Mutex {};\n  FEXCore::InterruptableConditionVariable ThreadReadyMutex {};\n\n  NumberOfJumps = 0;\n  std::thread t(WaitThreadLongJump, &Mutex, &ThreadReadyMutex, &Signaled, &TID);\n\n  // Wait for our thread to become ready\n  ThreadReadyMutex.Wait();\n\n  int32_t NumberOfJumpsToDo = 5;\n  for (int32_t i = 0; i < NumberOfJumpsToDo; ++i) {\n    // Wait for the thread to signal that it is ready to receive signal\n    WaitMutex.WaitFor(std::chrono::milliseconds(500));\n\n    // Send the signal to the thread\n    FHU::Syscalls::tgkill(::getpid(), TID, SIGUSR1);\n  }\n\n  // Notify the thread's mutex now\n  Mutex.NotifyAll();\n\n  // Wait for thread join\n  t.join();\n\n  // We signaled so we should have received it now\n  REQUIRE(Signaled);\n  // Ensure we long jumped the correct number of times\n  REQUIRE(NumberOfJumps == NumberOfJumpsToDo);\n}\n"
  },
  {
    "path": "unittests/APITests/StringUtils.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n#include <FEXCore/Utils/StringUtils.h>\n\nusing namespace FEXCore::StringUtils;\n\nTEST_CASE(\"ltrim\") {\n  CHECK(LeftTrim(\"\") == \"\");\n  CHECK(LeftTrim(\"FEXInterpreter\") == \"FEXInterpreter\");\n\n  CHECK(LeftTrim(\"FEXInterpreter\\n\") == \"FEXInterpreter\\n\");\n  CHECK(LeftTrim(\"FEXInterpreter\\r\") == \"FEXInterpreter\\r\");\n  CHECK(LeftTrim(\"FEXInterpreter\\f\") == \"FEXInterpreter\\f\");\n  CHECK(LeftTrim(\"FEXInterpreter\\t\") == \"FEXInterpreter\\t\");\n  CHECK(LeftTrim(\"FEXInterpreter\\v\") == \"FEXInterpreter\\v\");\n  CHECK(LeftTrim(\"FEXInterpreter \") == \"FEXInterpreter \");\n\n  CHECK(LeftTrim(\"\\nFEXInterpreter\") == \"FEXInterpreter\");\n  CHECK(LeftTrim(\"\\rFEXInterpreter\") == \"FEXInterpreter\");\n  CHECK(LeftTrim(\"\\fFEXInterpreter\") == \"FEXInterpreter\");\n  CHECK(LeftTrim(\"\\tFEXInterpreter\") == \"FEXInterpreter\");\n  CHECK(LeftTrim(\"\\vFEXInterpreter\") == \"FEXInterpreter\");\n  CHECK(LeftTrim(\" FEXInterpreter\") == \"FEXInterpreter\");\n\n  CHECK(LeftTrim(\"\\nFEXInterpreter\\n\") == \"FEXInterpreter\\n\");\n  CHECK(LeftTrim(\"\\rFEXInterpreter\\r\") == \"FEXInterpreter\\r\");\n  CHECK(LeftTrim(\"\\fFEXInterpreter\\f\") == \"FEXInterpreter\\f\");\n  CHECK(LeftTrim(\"\\tFEXInterpreter\\t\") == \"FEXInterpreter\\t\");\n  CHECK(LeftTrim(\"\\vFEXInterpreter\\v\") == \"FEXInterpreter\\v\");\n  CHECK(LeftTrim(\" FEXInterpreter \") == \"FEXInterpreter \");\n}\n\nTEST_CASE(\"rtrim\") {\n  CHECK(RightTrim(\"\") == \"\");\n  CHECK(RightTrim(\"FEXInterpreter\") == \"FEXInterpreter\");\n\n  CHECK(RightTrim(\"FEXInterpreter\\n\") == \"FEXInterpreter\");\n  CHECK(RightTrim(\"FEXInterpreter\\r\") == \"FEXInterpreter\");\n  CHECK(RightTrim(\"FEXInterpreter\\f\") == \"FEXInterpreter\");\n  CHECK(RightTrim(\"FEXInterpreter\\t\") == \"FEXInterpreter\");\n  CHECK(RightTrim(\"FEXInterpreter\\v\") == \"FEXInterpreter\");\n  CHECK(RightTrim(\"FEXInterpreter \") == \"FEXInterpreter\");\n\n  CHECK(RightTrim(\"\\nFEXInterpreter\") == \"\\nFEXInterpreter\");\n  CHECK(RightTrim(\"\\rFEXInterpreter\") == \"\\rFEXInterpreter\");\n  CHECK(RightTrim(\"\\fFEXInterpreter\") == \"\\fFEXInterpreter\");\n  CHECK(RightTrim(\"\\tFEXInterpreter\") == \"\\tFEXInterpreter\");\n  CHECK(RightTrim(\"\\vFEXInterpreter\") == \"\\vFEXInterpreter\");\n  CHECK(RightTrim(\" FEXInterpreter\") == \" FEXInterpreter\");\n\n  CHECK(RightTrim(\"\\nFEXInterpreter\\n\") == \"\\nFEXInterpreter\");\n  CHECK(RightTrim(\"\\rFEXInterpreter\\r\") == \"\\rFEXInterpreter\");\n  CHECK(RightTrim(\"\\fFEXInterpreter\\f\") == \"\\fFEXInterpreter\");\n  CHECK(RightTrim(\"\\tFEXInterpreter\\t\") == \"\\tFEXInterpreter\");\n  CHECK(RightTrim(\"\\vFEXInterpreter\\v\") == \"\\vFEXInterpreter\");\n  CHECK(RightTrim(\" FEXInterpreter \") == \" FEXInterpreter\");\n}\n\nTEST_CASE(\"trim\") {\n  CHECK(Trim(\"\") == \"\");\n  CHECK(Trim(\"FEXInterpreter\") == \"FEXInterpreter\");\n\n  CHECK(Trim(\"FEXInterpreter\\n\") == \"FEXInterpreter\");\n  CHECK(Trim(\"FEXInterpreter\\r\") == \"FEXInterpreter\");\n  CHECK(Trim(\"FEXInterpreter\\f\") == \"FEXInterpreter\");\n  CHECK(Trim(\"FEXInterpreter\\t\") == \"FEXInterpreter\");\n  CHECK(Trim(\"FEXInterpreter\\v\") == \"FEXInterpreter\");\n  CHECK(Trim(\"FEXInterpreter \") == \"FEXInterpreter\");\n\n  CHECK(Trim(\"\\nFEXInterpreter\") == \"FEXInterpreter\");\n  CHECK(Trim(\"\\rFEXInterpreter\") == \"FEXInterpreter\");\n  CHECK(Trim(\"\\fFEXInterpreter\") == \"FEXInterpreter\");\n  CHECK(Trim(\"\\tFEXInterpreter\") == \"FEXInterpreter\");\n  CHECK(Trim(\"\\vFEXInterpreter\") == \"FEXInterpreter\");\n  CHECK(Trim(\" FEXInterpreter\") == \"FEXInterpreter\");\n\n  CHECK(Trim(\"\\nFEXInterpreter\\n\") == \"FEXInterpreter\");\n  CHECK(Trim(\"\\rFEXInterpreter\\r\") == \"FEXInterpreter\");\n  CHECK(Trim(\"\\fFEXInterpreter\\f\") == \"FEXInterpreter\");\n  CHECK(Trim(\"\\tFEXInterpreter\\t\") == \"FEXInterpreter\");\n  CHECK(Trim(\"\\vFEXInterpreter\\v\") == \"FEXInterpreter\");\n  CHECK(Trim(\" FEXInterpreter \") == \"FEXInterpreter\");\n}\n\nTEST_CASE(\"InPlaceReplace\") {\n  auto ReplaceAll = [](fextl::string Str, auto Token, auto New) {\n    ReplaceAllInPlace(Str, Token, New);\n    return Str;\n  };\n  CHECK(ReplaceAll(\"\", \"@\", \"#\") == \"\");\n  // Replace with shorter.\n  CHECK(ReplaceAll(\"@Test@\", \"@Test@\", \"Yes\") == \"Yes\");\n  CHECK(ReplaceAll(\"@Test@@Test@\", \"@Test@\", \"Yes\") == \"YesYes\");\n\n  // Replace with longer.\n  CHECK(ReplaceAll(\"@Test@\", \"@Test@\", \"ThisOne\") == \"ThisOne\");\n  CHECK(ReplaceAll(\"@Test@@Test@\", \"@Test@\", \"ThisOne\") == \"ThisOneThisOne\");\n\n  // Replace token with more tokens.\n  CHECK(ReplaceAll(\"@@@\", \"@\", \"@@\") == \"@@@@@@\");\n\n  // Remove tokens.\n  CHECK(ReplaceAll(\"@@@\", \"@\", \"\") == \"\");\n}\n"
  },
  {
    "path": "unittests/APITests/fextl_function.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <catch2/catch_all.hpp>\n#include <FEXCore/Utils/Allocator.h>\n#include <FEXCore/fextl/functional.h>\n\nusing FEXCore::Allocator::MemoryRegion;\n\nstatic int ExampleFunction(int arg1, int arg2) {\n  return arg1 * arg2;\n}\n\nstruct TrivialExampleFunctionObject {\n  int operator()() {\n    return 1;\n  }\n  int operator()(int a) {\n    return a * 2;\n  }\n  int operator()(auto a, auto b) {\n    return a * b;\n  }\n\n  int Multiply(int a, int b) {\n    return a * b;\n  }\n};\n\nstruct BigExampleFunctionObject : TrivialExampleFunctionObject {\n  char state[256];\n};\n\nstatic int AllocCount = 0;\nstatic int DeallocCount = 0;\nstatic bool PrerunSucceeded = false;\n\nstatic void* TestAlloc(size_t Alignment, size_t Size) {\n  ++AllocCount;\n  return ::FEXCore::Allocator::aligned_alloc(Alignment, Size);\n}\n\nstatic void TestDealloc(void* Ptr) {\n  if (Ptr) {\n    ++DeallocCount;\n  }\n  ::FEXCore::Allocator::aligned_free(Ptr);\n}\n\ntemplate<typename F>\nusing function = fextl::move_only_function<F, TestAlloc, TestDealloc>;\n\n// Check allowed move/copy operations\nstatic_assert(!std::is_copy_constructible_v<function<void()>>);\nstatic_assert(std::is_move_constructible_v<function<void()>>);\nstatic_assert(!std::is_copy_assignable_v<function<void()>>);\nstatic_assert(std::is_move_assignable_v<function<void()>>);\n\nTEST_CASE(\"FextlFunction\") {\n  // Catch2 itself is not custom allocator aware, so the test failure reporter\n  // itself will trigger allocation detection, which aborts execution before\n  // the report is printed to console. To avoid this, each test is ran twice:\n  // * once without allocator hooks (to verify checked properties)\n  // * once with allocator hooks (to verify no spurious allocations are made)\n  //\n  // To ensure the second run is skipped on failure, REQUIRE must be used\n  // instead of CHECK.\n  bool EnableAllocatorHooks = GENERATE(false, true);\n  std::unique_ptr<FEXCore::Allocator::GLIBCScopedFault> GLIBFaultScope;\n  if (EnableAllocatorHooks) {\n#ifdef GLIBC_ALLOCATOR_FAULT\n    if (!PrerunSucceeded) {\n      printf(\"Warning: Test pre-run failed; skipping allocator hooks run\\n\");\n      return;\n    }\n\n    GLIBFaultScope = std::make_unique<FEXCore::Allocator::GLIBCScopedFault>();\n#else\n    printf(\"Warning: Allocator hooks aren't enabled, skipping test run\\n\");\n    return;\n#endif\n  }\n\n  REQUIRE(function<int(int, int)> {ExampleFunction}(5, 6) != 32);\n\n  // Function objects\n  {\n    REQUIRE(function<int()> {TrivialExampleFunctionObject {}}() == 1);\n    REQUIRE(function<int(int)> {TrivialExampleFunctionObject {}}(10) == 20);\n    REQUIRE(function<int(int, int)> {TrivialExampleFunctionObject {}}(10, 4) == 40);\n    TrivialExampleFunctionObject obj;\n    REQUIRE(function<int(TrivialExampleFunctionObject*, int, int)> {&TrivialExampleFunctionObject::Multiply}(&obj, 10, 5) == 50);\n    REQUIRE(AllocCount == 0);\n    REQUIRE(DeallocCount == 0);\n  }\n\n  {\n    REQUIRE(function<int()> {BigExampleFunctionObject {}}() == 1);\n    REQUIRE(AllocCount == 1);\n    REQUIRE(DeallocCount == 1);\n    REQUIRE(function<int(int)> {BigExampleFunctionObject {}}(10) == 20);\n    REQUIRE(AllocCount == 2);\n    REQUIRE(DeallocCount == 2);\n    REQUIRE(function<int(int, int)> {BigExampleFunctionObject {}}(10, 4) == 40);\n    REQUIRE(AllocCount == 3);\n    REQUIRE(DeallocCount == 3);\n    BigExampleFunctionObject obj;\n    REQUIRE(function<int(BigExampleFunctionObject*, int, int)> {&BigExampleFunctionObject::Multiply}(&obj, 10, 5) == 50);\n    REQUIRE(AllocCount == 3);\n    REQUIRE(DeallocCount == 3);\n    AllocCount = 0;\n    DeallocCount = 0;\n  }\n\n  // Non-capturing lambda expressions\n  {\n    REQUIRE(function<int()> {[]() {\n              return 5;\n            }}() == 5);\n    REQUIRE(AllocCount == 0);\n    REQUIRE(DeallocCount == 0);\n  }\n\n  {\n    REQUIRE(function<int(int)> {[](int arg) {\n              return 2 * arg;\n            }}(5) == 10);\n    REQUIRE(AllocCount == 0);\n    REQUIRE(DeallocCount == 0);\n  }\n\n  {\n    // Polymorphic lambdas work without allocation, too\n    REQUIRE(function<int(int)> {[](auto arg, auto...) {\n              return 2 * arg;\n            }}(5) == 10);\n    REQUIRE(AllocCount == 0);\n    REQUIRE(DeallocCount == 0);\n  }\n\n  // Test small capture lists\n  {\n    std::array<char, 2> DataBlock;\n    auto small_lambda = [DataBlock]() {\n      (void)DataBlock;\n      return 5;\n    };\n    static_assert(std::is_copy_constructible_v<decltype(small_lambda)>);\n    if (std::is_nothrow_constructible_v<std::function<int()>, decltype(small_lambda)>) {\n      REQUIRE(function<int()> {small_lambda}() == 5);\n      REQUIRE(AllocCount == 0);\n      REQUIRE(DeallocCount == 0);\n    } else {\n      printf(\"Warning: Skipping small-capture lambda test since std::function doesn't optimize it\\n\");\n    }\n  }\n\n  // Test large capture lists\n  {\n    std::array<char, 256> data_block;\n    {\n      REQUIRE(function<int()> {[data_block]() {\n                (void)data_block;\n                return 5;\n              }}() == 5);\n      REQUIRE(AllocCount == 1);\n      REQUIRE(DeallocCount == 1);\n      AllocCount = 0;\n      DeallocCount = 0;\n    }\n\n    // Move construction\n    {\n      {\n        function<int()> func {[data_block]() {\n          (void)data_block;\n          return 5;\n        }};\n        REQUIRE(AllocCount == 1);\n        REQUIRE(DeallocCount == 0);\n        REQUIRE(function<int()> {std::move(func)}() == 5);\n        REQUIRE(!func);\n        REQUIRE(AllocCount == 1);\n        REQUIRE(DeallocCount == 1);\n        // Scope end triggers destruction of moved-from func\n      }\n      REQUIRE(AllocCount == 1);\n      REQUIRE(DeallocCount == 1);\n      AllocCount = 0;\n      DeallocCount = 0;\n    }\n\n    // Move assignment\n    {\n      {\n        function<int()> func {[data_block]() {\n          (void)data_block;\n          return 5;\n        }};\n        function<int()> func2;\n        REQUIRE(AllocCount == 1);\n        REQUIRE(DeallocCount == 0);\n        REQUIRE((func2 = std::move(func))() == 5);\n        REQUIRE(!func);\n        REQUIRE(AllocCount == 1);\n        REQUIRE(DeallocCount == 0);\n        // Scope end triggers destruction of func2 and moved-from func\n      }\n      REQUIRE(AllocCount == 1);\n      REQUIRE(DeallocCount == 1);\n      AllocCount = 0;\n      DeallocCount = 0;\n    }\n  }\n\n  // Destructors\n  {\n    int StructDtorCount = 0;\n    {\n      std::array<char, 200> data;\n      struct StructWithDestructor {\n        int& StructDtorCount;\n\n        // fextl::function is an arbitrary choice here.\n        // We just need any move-only, nullable, non-allocating member type.\n        function<void()> Member = []() {\n        };\n\n        StructWithDestructor(int& StructDtorCount)\n          : StructDtorCount(StructDtorCount) {}\n        StructWithDestructor(StructWithDestructor&& other) = default;\n        ~StructWithDestructor() {\n          if (Member) {\n            ++StructDtorCount;\n          }\n        }\n\n        void operator()() {};\n      };\n\n      function<int()> func {[obj = StructWithDestructor {StructDtorCount}, data]() {\n        (void)data;\n        return 5;\n      }};\n      REQUIRE(AllocCount == 1);\n      REQUIRE(DeallocCount == 0);\n      REQUIRE(StructDtorCount == 0);\n      REQUIRE(func() == 5);\n      REQUIRE(StructDtorCount == 0);\n      func = nullptr;\n      REQUIRE(AllocCount == 1);\n      REQUIRE(DeallocCount == 1);\n      REQUIRE(StructDtorCount == 1);\n      // Scope end triggers destruction of func2 and moved-from func\n    }\n    REQUIRE(StructDtorCount == 1);\n    REQUIRE(AllocCount == 1);\n    REQUIRE(DeallocCount == 1);\n    AllocCount = 0;\n    DeallocCount = 0;\n  }\n\n  PrerunSucceeded = true;\n}\n"
  },
  {
    "path": "unittests/ASM/3DNow/0C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\":  \"0x3f800000bf800000\",\n    \"MM1\":  \"0x43000000c3000000\",\n    \"MM2\":  \"0xc700000046fffe00\",\n    \"MM3\":  \"0x0\" \n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\npi2fw mm0, [rel data1]\npi2fw mm1, [rel data2]\npi2fw mm2, [rel data3]\npi2fw mm3, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndw -1\ndw 0xFF\ndw 1\ndw 0xFF\n\ndata2:\ndw -128\ndw 0xFFFF\ndw 128\ndw 0xFFFF\n\ndata3:\ndw 0x7FFF\ndw 0x4242\ndw 0x8000\ndw 0x5252\n\ndata4:\ndw 0x0\ndw 0x1\ndw 0x0\ndw 0x2\n"
  },
  {
    "path": "unittests/ASM/3DNow/0D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\":  \"0x3f800000bf800000\",\n    \"MM1\":  \"0x43000000c3000000\",\n    \"MM2\":  \"0xbf8000003f800000\",\n    \"MM3\":  \"0x0\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\npi2fd mm0, [rel data1]\npi2fd mm1, [rel data2]\npi2fd mm2, [rel data3]\npi2fd mm3, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd -1\ndd 1\n\ndata2:\ndd -128\ndd 128\n\ndata3:\ndd 1\ndd -1\n\ndata4:\ndd 0x0\ndd 0x0\n"
  },
  {
    "path": "unittests/ASM/3DNow/0E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFF\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\n; Load all x87 registers\nfinit\nfldz\nfldz\nfldz\nfldz\nfldz\nfldz\nfldz\n\n; femms sets all the tag bits to 0b11\nfemms\n\nmov rdx, 0xe0000000\no32 fstenv [rdx]\n\nmov eax, 0\nmov ax, word [rdx + 8] ; Offset 8 in the structure has FTW\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/3DNow/1C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x00000001FFFFFFFF\",\n    \"MM1\": \"0x00000080FFFFFF80\",\n    \"MM2\": \"0xFFFF800000007FFF\",\n    \"MM3\": \"0x0\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\npi2fw mm0, [rel data1]\npi2fw mm1, [rel data2]\npi2fw mm2, [rel data3]\npi2fw mm3, [rel data4]\n\npf2iw mm0, mm0\npf2iw mm1, mm1\npf2iw mm2, mm2\npf2iw mm3, mm3\n\nhlt\n\nalign 8\ndata1:\ndw -1\ndw 0xFF\ndw 1\ndw 0xFF\n\ndata2:\ndw -128\ndw 0xFFFF\ndw 128\ndw 0xFFFF\n\ndata3:\ndw 0x7FFF\ndw 0x4242\ndw 0x8000\ndw 0x5252\n\ndata4:\ndw 0x0\ndw 0x1\ndw 0x0\ndw 0x2\n"
  },
  {
    "path": "unittests/ASM/3DNow/1D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\":  \"0x00000001FFFFFFFF\",\n    \"MM1\":  \"0x00000080FFFFFF80\",\n    \"MM2\":  \"0xFFFFFFFF00000001\",\n    \"MM3\":  \"0x0\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\npi2fd mm0, [rel data1]\npi2fd mm1, [rel data2]\npi2fd mm2, [rel data3]\npi2fd mm3, [rel data4]\n\npf2id mm0, mm0\npf2id mm1, mm1\npf2id mm2, mm2\npf2id mm3, mm3\n\nhlt\n\nalign 8\ndata1:\ndd -1\ndd 1\n\ndata2:\ndd -128\ndd 128\n\ndata3:\ndd 1\ndd -1\n\ndata4:\ndd 0x0\ndd 0x0\n"
  },
  {
    "path": "unittests/ASM/3DNow/86.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"1\",\n    \"MM3\": \"0xff8000007f800000\"\n  },\n  \"HostFeatures\": [\"3DNOW\", \"EMMI\"]\n}\n%endif\n\n%include \"checkprecision.mac\"\n\nsection .text\nglobal _start\n\n_start:\npfrcpv mm0, [rel data1]\npfrcpv mm1, [rel data2]\npfrcpv mm2, [rel data3]\npfrcpv mm3, [rel data4]\n\n; All calculated\n; Now we extract all the values into memory to call check_relerr.\nmovd edx, mm0\nmov [rel result11], edx\n\npsrlq mm0, 32\nmovd edx, mm0\nmov [rel result12], edx\n\nmovd edx, mm1\nmov [rel result21], edx\n\npsrlq mm1, 32\nmovd edx, mm1\nmov [rel result22], edx\n\nmovd edx, mm2\nmov [rel result31], edx\n\npsrlq mm2, 32\nmovd edx, mm2\nmov [rel result32], edx\n\ncheck_relerr rel eresult11, rel result11, rel tolerance\nmov ebx, eax\ncheck_relerr rel eresult12, rel result12, rel tolerance\nand ebx, eax\ncheck_relerr rel eresult21, rel result21, rel tolerance\nand ebx, eax\ncheck_relerr rel eresult22, rel result22, rel tolerance\nand ebx, eax\ncheck_relerr rel eresult31, rel result31, rel tolerance\nand ebx, eax\ncheck_relerr rel eresult32, rel result32, rel tolerance\nand ebx, eax\n\nhlt\n\nalign 4096\nresult11: dd 0\nresult12: dd 0\nresult21: dd 0\nresult22: dd 0\nresult31: dd 0\nresult32: dd 0\n\nalign 8\ndata1:\ndd -1.0\ndd 1.0\n\ndata2:\ndd -128.0\ndd 128.0\n\ndata3:\ndd 1.0\ndd -1.0\n\ndata4:\ndd 0.0\ndd -0.0\n\neresult11:\ndd -1.0\neresult12:\ndd 1.0\neresult21:\ndd 0xbc000000 ; -1/128\neresult22:\ndd 0x3c000000 ; 1/128\neresult31:\ndd 1.0\neresult32:\ndd -1.0\n\ntolerance:\ndd 0x38800000 ; 2^-14 - 14bit accuracy\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/3DNow/87.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"1\"\n  },\n  \"HostFeatures\": [\"3DNOW\", \"EMMI\"]\n}\n%endif\n\n%include \"checkprecision.mac\"\n\npfrsqrtv mm0, [rel data1]\npfrsqrtv mm1, [rel data2]\npfrsqrtv mm2, [rel data3]\n\n; All calculated\n; Now we extract all the values into memory to call check_relerr.\nmovd edx, mm0\nmov [rel result11], edx\n\npsrlq mm0, 32\nmovd edx, mm0\nmov [rel result12], edx\n\nmovd edx, mm1\nmov [rel result21], edx\n\npsrlq mm1, 32\nmovd edx, mm1\nmov [rel result22], edx\n\nmovd edx, mm2\nmov [rel result31], edx\n\npsrlq mm2, 32\nmovd edx, mm2\nmov [rel result32], edx\n\ncheck_relerr rel eresult11, rel result11, rel tolerance\nmov ebx, eax\ncheck_relerr rel eresult12, rel result12, rel tolerance\nand ebx, eax\ncheck_relerr rel eresult21, rel result21, rel tolerance\nand ebx, eax\ncheck_relerr rel eresult22, rel result22, rel tolerance\nand ebx, eax\ncheck_relerr rel eresult31, rel result31, rel tolerance\nand ebx, eax\ncheck_relerr rel eresult32, rel result32, rel tolerance\nand ebx, eax\n\nhlt\n\nalign 4096\nresult11: dd 0\nresult12: dd 0\nresult21: dd 0\nresult22: dd 0\nresult31: dd 0\nresult32: dd 0\n\nalign 32\ndata1:\ndd 1.0\ndd 16.0\n\ndata2:\ndd 4.0\ndd 25.0\n\ndata3:\ndd 9.0\ndd 1.0\n\neresult11:\ndd 0x3f800000 ; 1.0\neresult12:\ndd 0x3e800000 ; 1/4 = 0.25\neresult21:\ndd 0x3f000000 ; 1/2 = 0.5\neresult22:\ndd 0x3e4ccccd ; 1/5 = 0.2\neresult31:\ndd 0x3eaaaaab ; 1/3 = 0.(3)\neresult32:\ndd 0x3f800000 ; 1.0\n\ntolerance:\ndd 0x38000000 ; 2^-15 - accurate to 15bits\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/3DNow/8A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x44000000c0000000\",\n    \"MM1\": \"0x44800000c3800000\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nmovq mm0, [rel data1]\nmovq mm1, [rel data2]\n\npfnacc mm0, [rel data3]\npfnacc mm1, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd -1.0\ndd 1.0\n\ndata2:\ndd -128.0\ndd 128.0\n\ndata3:\ndd 256.0\ndd -256.0\n\ndata4:\ndd 512.0\ndd -512.0\n"
  },
  {
    "path": "unittests/ASM/3DNow/8E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x00000000c0000000\",\n    \"MM1\": \"0x00000000c3800000\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nmovq mm0, [rel data1]\nmovq mm1, [rel data2]\n\npfpnacc mm0, [rel data3]\npfpnacc mm1, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd -1.0\ndd 1.0\n\ndata2:\ndd -128.0\ndd 128.0\n\ndata3:\ndd 256.0\ndd -256.0\n\ndata4:\ndd 512.0\ndd -512.0\n"
  },
  {
    "path": "unittests/ASM/3DNow/90.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0\",\n    \"MM1\": \"0xFFFFFFFF00000000\",\n    \"MM2\": \"0xFFFFFFFFFFFFFFFF\",\n    \"MM3\": \"0x00000000FFFFFFFF\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nmovq mm0, [rel data5]\nmovq mm1, [rel data6]\nmovq mm2, [rel data7]\nmovq mm3, [rel data8]\n\n; False, False\n; 0.0 >= 1.0\n; 0.0 >= 1.0\npfcmpge mm0, [rel data1]\n; False, True\n; 0.0 >= 1.0\n; 1.0 >= 1.0\npfcmpge mm1, [rel data2]\n; True, True\n; -1.0 >= -1.0\n; 0.0 >= 0.0\npfcmpge mm2, [rel data3]\n\n; True, False\n; 1.0 >= 0.0\n; 0.0 >= 1.0\npfcmpge mm3, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd 1.0\ndd 1.0\n\ndata2:\ndd 1.0\ndd 1.0\n\ndata3:\ndd -1.0\ndd 0.0\n\ndata4:\ndd 0.0\ndd 1.0\n\ndata5:\ndd 0.0\ndd 0.0\n\ndata6:\ndd 0.0\ndd 1.0\n\ndata7:\ndd -1.0\ndd 0.0\n\ndata8:\ndd 1.0\ndd 0.0\n"
  },
  {
    "path": "unittests/ASM/3DNow/94.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0\",\n    \"MM1\": \"0x3f80000000000000\",\n    \"MM2\": \"0x00000000bf800000\",\n    \"MM3\": \"0x0\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nmovq mm0, [rel data5]\nmovq mm1, [rel data6]\nmovq mm2, [rel data7]\nmovq mm3, [rel data8]\n\npfmin mm0, [rel data1]\npfmin mm1, [rel data2]\npfmin mm2, [rel data3]\npfmin mm3, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd 1.0\ndd 1.0\n\ndata2:\ndd 1.0\ndd 1.0\n\ndata3:\ndd -1.0\ndd 0.0\n\ndata4:\ndd 0.0\ndd 1.0\n\ndata5:\ndd 0.0\ndd 0.0\n\ndata6:\ndd 0.0\ndd 1.0\n\ndata7:\ndd -1.0\ndd 0.0\n\ndata8:\ndd 1.0\ndd 0.0\n"
  },
  {
    "path": "unittests/ASM/3DNow/96.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"1\",\n    \"RDX\": \"1\",\n    \"MM0\":  \"0x7f8000007f800000\",\n    \"MM1\":  \"0xff800000ff800000\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\n%include \"checkprecision.mac\"\n\n; For each operation:\n; * We check precision (except when checking exact values), for 0.0 and -0.0.\n; * Check that top and bottom of register has the same value.\n\nsection .text\nglobal _start\n\n_start:\npfrcp mm0, [rel data1]\n\n; Precision\nmovd [rel result], mm0\ncheck_relerr rel eresult1, rel result, rel tolerance\nmovzx rdx, al\n; Duplicate top/bottom\nmovq mm1, mm0\npsrlq mm1, 32\npcmpeqd mm0, mm1\nmovd eax, mm0\nand al, 1\nmovzx rcx, al\n\npfrcp mm0, [rel data2]\n\n; Precision\nmovd [rel result], mm0\ncheck_relerr rel eresult2, rel result, rel tolerance\nand rdx, rax\n; Duplicate top/bottom\nmovq mm1, mm0\npsrlq mm1, 32\npcmpeqd mm0, mm1\nmovd eax, mm0\nand al, 1\nand rcx, rax\n\npfrcp mm0, [rel data3]\n\n; Precision\nmovd [rel result], mm0\ncheck_relerr rel eresult3, rel result, rel tolerance\nand rdx, rax\n; Duplicate top/bottom\nmovq mm1, mm0\npsrlq mm1, 32\npcmpeqd mm0, mm1\nmovd eax, mm0\nand al, 1\nand rcx, rax\n\n; ; Expecting exact results for +inf and -inf\npfrcp mm0, [rel data4]\npfrcp mm1, [rel data5]\n\nhlt\n\nalign 4096\nresult: dd 0\n\nalign 8\ndata1:\ndd -1.0\ndd 1.0\n\neresult1:\ndd -1.0\n\ndata2:\ndd -128.0\ndd 128.0\n\neresult2:\ndd 0xbc000000\n\ndata3:\ndd 1.0\ndd -1.0\n\neresult3:\ndd 1.0\n\ndata4:\ndd 0.0\ndd 1.0\n\ndata5:\ndd -0.0\ndd 1.0\n\ntolerance:\ndd 0x38800000 ; 2^-14 - 14bit accuracy\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/3DNow/97.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"1\",\n    \"RBX\":  \"1\",\n    \"RCX\":  \"1\",\n    \"RDX\":  \"1\",\n    \"MM4\":  \"0x7f8000007f800000\",\n    \"MM5\":  \"0xff800000ff800000\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\n%include \"checkprecision.mac\"\n\nsection .text\nglobal _start\n\n; From the isa manual, one thing to consider is that\n; \"Negative operands are treated as positive operands for purposes of\n; reciprocal square-root computation, with the sign of the result the\n; same as the sign of the source operand.\"\n\n_start:\npfrsqrt mm0, [rel data1]\nmovd [rel result1], mm0\ncheck_relerr rel eresult1, rel result1, rel tolerance\nmovzx rdx, al\n\npfrsqrt mm1, [rel data2]\nmovd [rel result2], mm1\ncheck_relerr rel eresult2, rel result2, rel tolerance\nmovzx rcx, al\n\npfrsqrt mm2, [rel data3]\nmovd [rel result3], mm2\ncheck_relerr rel eresult3, rel result3, rel tolerance\nmovzx rbx, al\n\npfrsqrt mm3, [rel data4] ; pfrsqrt(-1.0) == -1.0\nmovd [rel result4], mm3\ncheck_relerr rel eresult4, rel result4, rel tolerance\nmovzx rax, al\n\n; Expecting exact results\npfrsqrt mm4, [rel data5] ; pfrsqrt(0.0) == inf\npfrsqrt mm5, [rel data6] ; pfrsqrt(-0.0) == -inf\nhlt\n\nalign 4096\nresult1: times 32 db 0\nresult2: times 32 db 0\nresult3: times 32 db 0\nresult4: times 32 db 0\n\nalign 32\ndata1:\ndd 1.0\ndd 16.0\n\neresult1: ; expected\ndd 1.0\n\ndata2:\ndd 4.0\ndd 25.0\n\neresult2: ; expected\ndd 0.5\n\ndata3:\ndd 9.0\ndd 1.0\n\neresult3: ; expected\ndd 0x3eaaaaab ; 1/3\n\ndata4:\ndd -1.0\ndd -16.0\n\neresult4: ; expected\ndd -1.0\n\ndata5:\ndd 0.0\ndd -9.0\n\ndata6:\ndd -0.0\ndd -9.0\n\ntolerance:\ndd 0x38000000 ; 2^-15 - accurate to 15bits\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/3DNow/9A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x43808000c3808000\",\n    \"MM1\": \"0x44200000c4200000\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nmovq mm0, [rel data1]\nmovq mm1, [rel data2]\n\npfsub mm0, [rel data3]\npfsub mm1, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd -1.0\ndd 1.0\n\ndata2:\ndd -128.0\ndd 128.0\n\ndata3:\ndd 256.0\ndd -256.0\n\ndata4:\ndd 512.0\ndd -512.0\n"
  },
  {
    "path": "unittests/ASM/3DNow/9E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xc37f0000437f0000\",\n    \"MM1\": \"0xc3c0000043c00000\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nmovq mm0, [rel data1]\nmovq mm1, [rel data2]\n\npfadd mm0, [rel data3]\npfadd mm1, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd -1.0\ndd 1.0\n\ndata2:\ndd -128.0\ndd 128.0\n\ndata3:\ndd 256.0\ndd -256.0\n\ndata4:\ndd 512.0\ndd -512.0\n"
  },
  {
    "path": "unittests/ASM/3DNow/A0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0\",\n    \"MM1\": \"0xFFFFFFFF00000000\", \n    \"MM2\": \"0xFFFFFFFFFFFFFFFF\",\n    \"MM3\": \"0x00000000FFFFFFFF\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nmovq mm0, [rel data5]\nmovq mm1, [rel data6]\nmovq mm2, [rel data7]\nmovq mm3, [rel data8]\n\n; False, False\n; 0.0 > 1.0\n; 0.0 > 1.0\npfcmpgt mm0, [rel data1]\n\n; False, True\n; 0.0 > 1.0\n; 2.0 > 1.0\npfcmpgt mm1, [rel data2]\n\n; True, True\n; -1.0 > -2.0\n; 0.0 > -1.0\n\npfcmpgt mm2, [rel data3]\n\n; True, False\n; 1.0 > 0.0\n; 0.0 > 1.0\npfcmpgt mm3, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd 1.0\ndd 1.0\n\ndata2:\ndd 1.0\ndd 1.0\n\ndata3:\ndd -2.0\ndd -1.0\n\ndata4:\ndd 0.0\ndd 1.0\n\ndata5:\ndd 0.0\ndd 0.0\n\ndata6:\ndd 0.0\ndd 2.0\n\ndata7:\ndd -1.0\ndd 0.0\n\ndata8:\ndd 1.0\ndd 0.0\n"
  },
  {
    "path": "unittests/ASM/3DNow/A4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x3f8000003f800000\",\n    \"MM1\": \"0x3f8000003f800000\",\n    \"MM2\": \"0x00000000bf800000\",\n    \"MM3\": \"0x3f8000003f800000\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nmovq mm0, [rel data5]\nmovq mm1, [rel data6]\nmovq mm2, [rel data7]\nmovq mm3, [rel data8]\n\npfmax mm0, [rel data1]\npfmax mm1, [rel data2]\npfmax mm2, [rel data3]\npfmax mm3, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd 1.0\ndd 1.0\n\ndata2:\ndd 1.0\ndd 1.0\n\ndata3:\ndd -1.0\ndd 0.0\n\ndata4:\ndd 0.0\ndd 1.0\n\ndata5:\ndd 0.0\ndd 0.0\n\ndata6:\ndd 0.0\ndd 1.0\n\ndata7:\ndd -1.0\ndd 0.0\n\ndata8:\ndd 1.0\ndd 0.0\n"
  },
  {
    "path": "unittests/ASM/3DNow/A6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x9192939481828384\",\n    \"MM1\": \"0xB1B2B3B4A1A2A3A4\"\n  },\n  \"HostFeatures\": [\"3DNOW\", \"EMMI\"]\n}\n%endif\n\nmovq mm0, [rel data1]\nmovq mm1, [rel data2]\n\n; Legitimate to implement as a move if the rsqrt or recip instruction does the full calculation\npfrcpit1 mm0, [rel data3]\npfrcpit1 mm1, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd 0x41424344\ndd 0x51525354\n\ndata2:\ndd 0x61626364\ndd 0x71727374\n\ndata3:\ndd 0x81828384\ndd 0x91929394\n\ndata4:\ndd 0xA1A2A3A4\ndd 0xB1B2B3B4\n"
  },
  {
    "path": "unittests/ASM/3DNow/A7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\":  \"0x9192939481828384\",\n    \"MM1\":  \"0xB1B2B3B4A1A2A3A4\"\n  },\n  \"HostFeatures\": [\"3DNOW\", \"EMMI\"]\n}\n%endif\n\nmovq mm0, [rel data1]\nmovq mm1, [rel data2]\n\n; Legitimate to implement as a move if the rsqrt or recip instruction does the full calculation\npfrsqit1 mm0, [rel data3]\npfrsqit1 mm1, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd 0x41424344\ndd 0x51525354\n\ndata2:\ndd 0x61626364\ndd 0x71727374\n\ndata3:\ndd 0x81828384\ndd 0x91929394\n\ndata4:\ndd 0xA1A2A3A4\ndd 0xB1B2B3B4\n"
  },
  {
    "path": "unittests/ASM/3DNow/AA.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xc380800043808000\",\n    \"MM1\": \"0xc420000044200000\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nmovq mm0, [rel data1]\nmovq mm1, [rel data2]\n\npfsubr mm0, [rel data3]\npfsubr mm1, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd -1.0\ndd 1.0\n\ndata2:\ndd -128.0\ndd 128.0\n\ndata3:\ndd 256.0\ndd -256.0\n\ndata4:\ndd 512.0\ndd -512.0\n"
  },
  {
    "path": "unittests/ASM/3DNow/AE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0\",\n    \"MM1\": \"0x0\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nmovq mm0, [rel data1]\nmovq mm1, [rel data2]\n\npfacc mm0, [rel data3]\npfacc mm1, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd -1.0\ndd 1.0\n\ndata2:\ndd -128.0\ndd 128.0\n\ndata3:\ndd 256.0\ndd -256.0\n\ndata4:\ndd 512.0\ndd -512.0\n"
  },
  {
    "path": "unittests/ASM/3DNow/B0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0\",\n    \"MM1\": \"0xFFFFFFFF00000000\",\n    \"MM2\": \"0xFFFFFFFFFFFFFFFF\",\n    \"MM3\": \"0x00000000FFFFFFFF\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nmovq mm0, [rel data5]\nmovq mm1, [rel data6]\nmovq mm2, [rel data7]\nmovq mm3, [rel data8]\n\n; False, False\n; 0.0 == 1.0\n; 0.0 == 1.0\npfcmpeq mm0, [rel data1]\n\n; False, True\n; 0.0 == 1.0\n; 1.0 == 1.0\npfcmpeq mm1, [rel data2]\n\n; True, True\n; -2.0 == -2.0\n; -1.0 == -1.0\n\npfcmpeq mm2, [rel data3]\n\n; True, False\n; 0.0 == 0.0\n; 0.0 == 1.0\npfcmpeq mm3, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd 1.0\ndd 1.0\n\ndata2:\ndd 1.0\ndd 1.0\n\ndata3:\ndd -2.0\ndd -1.0\n\ndata4:\ndd 0.0\ndd 1.0\n\ndata5:\ndd 0.0\ndd 0.0\n\ndata6:\ndd 0.0\ndd 1.0\n\ndata7:\ndd -2.0\ndd -1.0\n\ndata8:\ndd 0.0\ndd 0.0\n"
  },
  {
    "path": "unittests/ASM/3DNow/B4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xc3800000c3800000\",\n    \"MM1\": \"0xc7800000c7800000\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nmovq mm0, [rel data1]\nmovq mm1, [rel data2]\n\npfmul mm0, [rel data3]\npfmul mm1, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd -1.0\ndd 1.0\n\ndata2:\ndd -128.0\ndd 128.0\n\ndata3:\ndd 256.0\ndd -256.0\n\ndata4:\ndd 512.0\ndd -512.0\n"
  },
  {
    "path": "unittests/ASM/3DNow/B6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x9192939481828384\",\n    \"MM1\": \"0xB1B2B3B4A1A2A3A4\"\n  },\n  \"HostFeatures\": [\"3DNOW\", \"EMMI\"]\n}\n%endif\n\nmovq mm0, [rel data1]\nmovq mm1, [rel data2]\n\n; Legitimate to implement as a move if the rsqrt or recip instruction does the full calculation\npfrcpit2 mm0, [rel data3]\npfrcpit2 mm1, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd 0x41424344\ndd 0x51525354\n\ndata2:\ndd 0x61626364\ndd 0x71727374\n\ndata3:\ndd 0x81828384\ndd 0x91929394\n\ndata4:\ndd 0xA1A2A3A4\ndd 0xB1B2B3B4\n"
  },
  {
    "path": "unittests/ASM/3DNow/B7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0\",\n    \"MM1\": \"0x0\",\n    \"MM2\": \"0x3fff000100000001\",\n    \"MM3\": \"0x0000000200000004\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nmovq mm0, [rel data5]\nmovq mm1, [rel data6]\nmovq mm2, [rel data7]\nmovq mm3, [rel data8]\n\n; nasm doesn't support emitting this instruction\n; pmulhrw mm0, [rel data1]\ndb 0x0f, 0x0f, 0x05, 0x1c, 0x00, 0x00, 0x00, 0xB7\n; pmulhrw mm1, [rel data2]\ndb 0x0f, 0x0f, 0x0d, 0x1c, 0x00, 0x00, 0x00, 0xB7\n; pmulhrw mm2, [rel data3]\ndb 0x0f, 0x0f, 0x15, 0x1c, 0x00, 0x00, 0x00, 0xB7\n; pmulhrw mm3, [rel data4]\ndb 0x0f, 0x0f, 0x1d, 0x1c, 0x00, 0x00, 0x00, 0xB7\n\nhlt\n\nalign 8\ndata1:\n  dw 0x0\n  dw 0x0\n  dw 0x0\n  dw 0x0\n\ndata2:\n  dw 0x1\n  dw 0x1\n  dw 0x1\n  dw 0x1\n\ndata3:\n  dw 0x2\n  dw 0x2\n  dw 0x2\n  dw 0x7FFF\n\ndata4:\ndw 0x10\ndw 0x4\ndw 0x8\ndw 0x8\n\ndata5:\n  dw 0x0\n  dw 0x0\n  dw 0x0\n  dw 0x0\n\ndata6:\n  dw 0x1\n  dw 0x1\n  dw 0x1\n  dw 0x1\n\ndata7:\ndw 0x7FFF\ndw 0x2\ndw 0x7FFF\ndw 0x7FFF\n\ndata8:\ndw 0x3E80\ndw 0x4\ndw 0x3E80\ndw 0x4\n"
  },
  {
    "path": "unittests/ASM/3DNow/BB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\":  \"0x8182838491929394\",\n    \"MM1\":  \"0xA1A2A3A4B1B2B3B4\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nmovq mm0, [rel data1]\nmovq mm1, [rel data2]\n\n; Legitimate to implement as a move if the rsqrt or recip instruction does the full calculation\npswapd mm0, [rel data3]\npswapd mm1, [rel data4]\n\nhlt\n\nalign 8\ndata1:\ndd 0x41424344\ndd 0x51525354\n\ndata2:\ndd 0x61626364\ndd 0x71727374\n\ndata3:\ndd 0x81828384\ndd 0x91929394\n\ndata4:\ndd 0xA1A2A3A4\ndd 0xB1B2B3B4\n"
  },
  {
    "path": "unittests/ASM/3DNow/BF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x2179b0697d5378c4\",\n    \"MM1\": \"0x1ed68638699d35ca\",\n    \"MM2\": \"0x165c42291f28194c\",\n    \"MM3\": \"0x2179b0697d5378c4\",\n    \"MM4\": \"0x1ed68638699d35ca\",\n    \"MM5\": \"0x165c42291f28194c\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x2bb883523d4f3197\nmov [rdx + 8 * 0], rax\nmov rax, 0x1246c77764260189\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x163add80bc57bef1\nmov [rdx + 8 * 2], rax\nmov rax, 0x64d615e5b405a306\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x11f4881d94eb39fc\nmov [rdx + 8 * 4], rax\nmov rax, 0xa9162248f2d0a23a\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 6], rax\nmov rax, 0x0\nmov [rdx + 8 * 7], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 0]\nmovq mm3, [rdx + 8 * 0]\nmovq mm4, [rdx + 8 * 0]\nmovq mm5, [rdx + 8 * 0]\nmovq mm6, [rdx + 8 * 2]\nmovq mm7, [rdx + 8 * 4]\n\npavgusb mm0, mm6\npavgusb mm1, mm7\n\nmovq mm7, [rdx + 8 * 6]\npavgusb mm2, mm7\n\npavgusb mm3, [rdx + 8 * 2]\npavgusb mm4, [rdx + 8 * 4]\npavgusb mm5, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Atomics/adc_atomic16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4242434446464848\",\n    \"RBX\": \"0x4242434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4242434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 1 byte offset within 4byte boundary\nlock adc word [r15 + 8 * 0 + 1], ax\n\n; Test 3 byte offset across 4byte boundary\nlock adc word [r15 + 8 * 0 + 3], ax\n\n; Test 7 byte offset across 8byte boundary\nlock adc word [r15 + 8 * 0 + 7], ax\n\n; Test 15 byte offset across 16byte boundary\nlock adc word [r15 + 8 * 0 + 15], ax\n\n; Test 63 byte offset across cacheline boundary\nlock adc word [r15 + 8 * 0 + 63], ax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Atomics/adc_atomic32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4242434446464748\",\n    \"RBX\": \"0x4242434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4242434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 3 byte offset across 4byte boundary\nlock adc dword [r15 + 8 * 0 + 3], eax\n\n; Test 7 byte offset across 8byte boundary\nlock adc dword [r15 + 8 * 0 + 7], eax\n\n; Test 15 byte offset across 16byte boundary\nlock adc dword [r15 + 8 * 0 + 15], eax\n\n; Test 63 byte offset across cacheline boundary\nlock adc dword [r15 + 8 * 0 + 63], eax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Atomics/adc_atomic64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4242434445464748\",\n    \"RBX\": \"0x4242434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4242434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 7 byte offset across 8byte boundary\nlock adc qword [r15 + 8 * 0 + 7], rax\n\n; Test 15 byte offset across 16byte boundary\nlock adc qword [r15 + 8 * 0 + 15], rax\n\n; Test 63 byte offset across cacheline boundary\nlock adc qword [r15 + 8 * 0 + 63], rax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Atomics/neg_atomic16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xbf4243bbbbb9b948\",\n    \"RBX\": \"0xbf424344454647b7\",\n    \"RCX\": \"0x41424344454647b7\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0xbf42434445464748\",\n    \"RDI\": \"0x41424344454647b7\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\n; Test 1 byte offset within 4byte boundary\nlock neg word [r15 + 8 * 0 + 1]\n\n; Test 3 byte offset across 4byte boundary\nlock neg word [r15 + 8 * 0 + 3]\n\n; Test 7 byte offset across 8byte boundary\nlock neg word [r15 + 8 * 0 + 7]\n\n; Test 15 byte offset across 16byte boundary\nlock neg word [r15 + 8 * 0 + 15]\n\n; Test 63 byte offset across cacheline boundary\nlock neg word [r15 + 8 * 0 + 63]\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Atomics/neg_atomic32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xbfbdbcbbbb464748\",\n    \"RBX\": \"0xbf42434445b9b8b7\",\n    \"RCX\": \"0x4142434445b9b8b7\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0xbf42434445464748\",\n    \"RDI\": \"0x4142434445b9b8b7\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\n; Test 3 byte offset across 4byte boundary\nlock neg dword [r15 + 8 * 0 + 3]\n\n; Test 7 byte offset across 8byte boundary\nlock neg dword [r15 + 8 * 0 + 7]\n\n; Test 15 byte offset across 16byte boundary\nlock neg dword [r15 + 8 * 0 + 15]\n\n; Test 63 byte offset across cacheline boundary\nlock neg dword [r15 + 8 * 0 + 63]\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Atomics/neg_atomic64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xbf42434445464748\",\n    \"RBX\": \"0xbfbdbcbbbab9b8b7\",\n    \"RCX\": \"0x41bdbcbbbab9b8b7\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0xbf42434445464748\",\n    \"RDI\": \"0x41bdbcbbbab9b8b7\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\n; Test 7 byte offset across 8byte boundary\nlock neg qword [r15 + 8 * 0 + 7]\n\n; Test 15 byte offset across 16byte boundary\nlock neg qword [r15 + 8 * 0 + 15]\n\n; Test 63 byte offset across cacheline boundary\nlock neg qword [r15 + 8 * 0 + 63]\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Atomics/not_atomic16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xbe4243bbbab9b848\",\n    \"RBX\": \"0xbe424344454647b7\",\n    \"RCX\": \"0x41424344454647b7\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0xbe42434445464748\",\n    \"RDI\": \"0x41424344454647b7\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\n; Test 1 byte offset within 4byte boundary\nlock not word [r15 + 8 * 0 + 1]\n\n; Test 3 byte offset across 4byte boundary\nlock not word [r15 + 8 * 0 + 3]\n\n; Test 7 byte offset across 8byte boundary\nlock not word [r15 + 8 * 0 + 7]\n\n; Test 15 byte offset across 16byte boundary\nlock not word [r15 + 8 * 0 + 15]\n\n; Test 63 byte offset across cacheline boundary\nlock not word [r15 + 8 * 0 + 63]\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Atomics/not_atomic32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xbebdbcbbba464748\",\n    \"RBX\": \"0xbe42434445b9b8b7\",\n    \"RCX\": \"0x4142434445b9b8b7\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0xbe42434445464748\",\n    \"RDI\": \"0x4142434445b9b8b7\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\n; Test 3 byte offset across 4byte boundary\nlock not dword [r15 + 8 * 0 + 3]\n\n; Test 7 byte offset across 8byte boundary\nlock not dword [r15 + 8 * 0 + 7]\n\n; Test 15 byte offset across 16byte boundary\nlock not dword [r15 + 8 * 0 + 15]\n\n; Test 63 byte offset across cacheline boundary\nlock not dword [r15 + 8 * 0 + 63]\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Atomics/not_atomic64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xbe42434445464748\",\n    \"RBX\": \"0xbebdbcbbbab9b8b7\",\n    \"RCX\": \"0x41bdbcbbbab9b8b7\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0xbe42434445464748\",\n    \"RDI\": \"0x41bdbcbbbab9b8b7\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\n; Test 7 byte offset across 8byte boundary\nlock not qword [r15 + 8 * 0 + 7]\n\n; Test 15 byte offset across 16byte boundary\nlock not qword [r15 + 8 * 0 + 15]\n\n; Test 63 byte offset across cacheline boundary\nlock not qword [r15 + 8 * 0 + 63]\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Atomics/sbb_atomic16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4042434444464648\",\n    \"RBX\": \"0x4042434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4042434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 1 byte offset within 4byte boundary\nlock sbb word [r15 + 8 * 0 + 1], ax\n\n; Test 3 byte offset across 4byte boundary\nlock sbb word [r15 + 8 * 0 + 3], ax\n\n; Test 7 byte offset across 8byte boundary\nlock sbb word [r15 + 8 * 0 + 7], ax\n\n; Test 15 byte offset across 16byte boundary\nlock sbb word [r15 + 8 * 0 + 15], ax\n\n; Test 63 byte offset across cacheline boundary\nlock sbb word [r15 + 8 * 0 + 63], ax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Atomics/sbb_atomic32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4042434444464748\",\n    \"RBX\": \"0x4042434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4042434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 3 byte offset across 4byte boundary\nlock sbb dword [r15 + 8 * 0 + 3], eax\n\n; Test 7 byte offset across 8byte boundary\nlock sbb dword [r15 + 8 * 0 + 7], eax\n\n; Test 15 byte offset across 16byte boundary\nlock sbb dword [r15 + 8 * 0 + 15], eax\n\n; Test 63 byte offset across cacheline boundary\nlock sbb dword [r15 + 8 * 0 + 63], eax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Atomics/sbb_atomic64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4042434445464748\",\n    \"RBX\": \"0x4042434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4042434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 7 byte offset across 8byte boundary\nlock sbb qword [r15 + 8 * 0 + 7], rax\n\n; Test 15 byte offset across 16byte boundary\nlock sbb qword [r15 + 8 * 0 + 15], rax\n\n; Test 63 byte offset across cacheline boundary\nlock sbb qword [r15 + 8 * 0 + 63], rax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/CALL.asm",
    "content": "%ifdef CONFIG\n{\n  \"Ignore\": [],\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"RBX\": \"2\"\n  }\n}\n%endif\n\njmp label\nlabel:\n\nmov rsp, 0xe8000000\n\n; Test direct literal call\ncall function\n\n; Move the absolute address of function2 in to rbx and call it\nlea rbx, [rel function2]\ncall rbx\n\nhlt\n\nfunction:\nmov rax, 1\nret\n\nfunction2:\nmov rbx, 2\nret\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/CMakeLists.txt",
    "content": "enable_language(ASM_NASM)\nif(NOT CMAKE_ASM_NASM_COMPILER_LOADED)\n  error(\"Failed to find NASM compatible assembler!\")\nendif()\n\n# Careful. Globbing can't see changes to the contents of files\n# Need to do a fresh clean to see changes\nfile(GLOB_RECURSE ASM_SOURCES CONFIGURE_DEPENDS *.asm)\n\nset(ASM_DEPENDS \"\")\n\nexecute_process(COMMAND \"python3\" \"${CMAKE_SOURCE_DIR}/Scripts/ClassifyCPU.py\"\n  OUTPUT_STRIP_TRAILING_WHITESPACE\n  OUTPUT_VARIABLE CPU_CLASS)\n\nforeach(ASM_SRC ${ASM_SOURCES})\n  file(RELATIVE_PATH REL_ASM ${CMAKE_SOURCE_DIR} ${ASM_SRC})\n  file(RELATIVE_PATH REL_TEST_ASM ${CMAKE_CURRENT_SOURCE_DIR} ${ASM_SRC})\n  get_filename_component(ASM_NAME ${ASM_SRC} NAME)\n  get_filename_component(ASM_DIR \"${REL_ASM}\" DIRECTORY)\n  set(OUTPUT_ASM_FOLDER \"${CMAKE_BINARY_DIR}/${ASM_DIR}\")\n\n  # Generate build directory\n  file(MAKE_DIRECTORY \"${OUTPUT_ASM_FOLDER}\")\n\n  # Generate a temporary file\n  set(ASM_TMP \"${ASM_NAME}_TMP.asm\")\n  set(TMP_FILE \"${OUTPUT_ASM_FOLDER}/${ASM_TMP}\")\n\n  add_custom_command(OUTPUT ${TMP_FILE}\n    DEPENDS \"${ASM_SRC}\"\n    COMMAND \"cp\" ARGS \"${ASM_SRC}\" \"${TMP_FILE}\"\n    COMMAND \"sed\" ARGS \"-i\" \"-e\" \"\\'1s;^;BITS 64\\\\n;\\'\" \"-e\" \"\\'\\$\\$a\\\\ret\\\\n\\'\" \"${TMP_FILE}\")\n\n  set(OUTPUT_NAME \"${OUTPUT_ASM_FOLDER}/${ASM_NAME}.bin\")\n  set(OUTPUT_CONFIG_NAME \"${OUTPUT_ASM_FOLDER}/${ASM_NAME}.config.bin\")\n\n  add_custom_command(OUTPUT ${OUTPUT_NAME}\n    DEPENDS \"${TMP_FILE}\"\n    COMMAND \"nasm\" ARGS \"-i\" \"${CMAKE_SOURCE_DIR}/unittests/ASM/Includes/\" \"${TMP_FILE}\" \"-o\" \"${OUTPUT_NAME}\")\n\n  add_custom_command(OUTPUT ${OUTPUT_CONFIG_NAME}\n    DEPENDS \"${ASM_SRC}\"\n    DEPENDS \"${CMAKE_SOURCE_DIR}/Scripts/json_asm_config_parse.py\"\n    DEPENDS \"${CMAKE_SOURCE_DIR}/Scripts/json_config_parse.py\"\n    COMMAND \"python3\" ARGS \"${CMAKE_SOURCE_DIR}/Scripts/json_asm_config_parse.py\" \"${ASM_SRC}\" \"${OUTPUT_CONFIG_NAME}\")\n\n  list(APPEND ASM_DEPENDS \"${OUTPUT_NAME};${OUTPUT_CONFIG_NAME}\")\n\n  # Format is \"<Test Arguments>\" \"<Test Name>\" \"<Test Type>\"\n\n  set(TEST_ARGS)\n  if (ARCHITECTURE_arm64 OR ENABLE_VIXL_SIMULATOR)\n    list(APPEND TEST_ARGS\n      \"FEX_SILENTLOG=0 FEX_DUMPGPRS=1 FEX_MAXINST=1 FEX_MULTIBLOCK=0 FEX_TSOENABLED=0\"   \"jit_1\"     \"jit\"\n      \"FEX_SILENTLOG=0 FEX_DUMPGPRS=1 FEX_MAXINST=500 FEX_MULTIBLOCK=0 FEX_TSOENABLED=0\" \"jit_500\"   \"jit\"\n      \"FEX_SILENTLOG=0 FEX_DUMPGPRS=1 FEX_MAXINST=500 FEX_MULTIBLOCK=1 FEX_TSOENABLED=0\" \"jit_500_m\" \"jit\")\n  endif()\n\n  if (ENABLE_VIXL_SIMULATOR)\n    set(CPU_CLASS Simulator)\n  elseif (ARCHITECTURE_x86_64)\n    list(APPEND TEST_ARGS \"FEX_SILENTLOG=0 FEX_DUMPGPRS=1\" \"host\" \"host\")\n  endif()\n\n  if (NOT MINGW)\n    set(LAUNCH_PROGRAM \"${CMAKE_BINARY_DIR}/Bin/TestHarnessRunner\")\n  else()\n    set(LAUNCH_PROGRAM \"wine\" \"${CMAKE_BINARY_DIR}/Bin/TestHarnessRunner.exe\")\n  endif()\n\n  list(LENGTH TEST_ARGS ARG_COUNT)\n  math(EXPR ARG_COUNT \"${ARG_COUNT}-1\")\n  foreach(Index RANGE 0 ${ARG_COUNT} 3)\n    math(EXPR TEST_NAME_INDEX \"${Index}+1\")\n    math(EXPR TEST_TYPE_INDEX \"${Index}+2\")\n\n    list(GET TEST_ARGS ${Index} FEX_ARGS)\n    list(GET TEST_ARGS ${TEST_NAME_INDEX} TEST_DESC)\n    list(GET TEST_ARGS ${TEST_TYPE_INDEX} TEST_TYPE)\n\n    set(TEST_NAME \"${TEST_DESC}/Test_64Bit_${REL_TEST_ASM}\")\n    string(REPLACE \" \" \";\" FEX_ARGS_LIST ${FEX_ARGS})\n\n    if (TEST_NAME MATCHES \"SelfModifyingCode\")\n      list(APPEND FEX_ARGS_LIST \"FEX_SMCCHECKS=full\")\n    endif()\n\n    add_test(NAME ${TEST_NAME}\n      COMMAND \"python3\" \"${CMAKE_SOURCE_DIR}/Scripts/testharness_runner.py\"\n      \"${CMAKE_SOURCE_DIR}/unittests/ASM/Known_Failures\"\n      \"${CMAKE_SOURCE_DIR}/unittests/ASM/Known_Failures_${TEST_TYPE}\"\n      \"${CMAKE_SOURCE_DIR}/unittests/ASM/Disabled_Tests\"\n      \"${CMAKE_SOURCE_DIR}/unittests/ASM/Disabled_Tests_${TEST_TYPE}\"\n      \"${CMAKE_SOURCE_DIR}/unittests/ASM/Disabled_Tests_${CPU_CLASS}\"\n      \"Test_${REL_TEST_ASM}\"\n      \"${TEST_NAME}\"\n      ${LAUNCH_PROGRAM}\n      \"${OUTPUT_NAME}\" \"${OUTPUT_CONFIG_NAME}\")\n    # This will cause the ASM tests to fail if it can't find the TestHarness or ASMN files\n    # Prety crap way to work around the fact that tests can't have a build dependency in a different directory\n    # Just make sure to independently run `make all` then `make test`\n    set_property(TEST ${TEST_NAME} APPEND PROPERTY DEPENDS \"${CMAKE_BINARY_DIR}/Bin/TestHarnessRunner\")\n    set_property(TEST ${TEST_NAME} APPEND PROPERTY DEPENDS \"${OUTPUT_NAME}\")\n    set_property(TEST ${TEST_NAME} APPEND PROPERTY DEPENDS \"${OUTPUT_CONFIG_NAME}\")\n    set_property(TEST ${TEST_NAME} APPEND PROPERTY SKIP_RETURN_CODE 125)\n    set_property(TEST ${TEST_NAME} APPEND PROPERTY ENVIRONMENT ${FEX_ARGS_LIST})\n    if (MINGW)\n      # Ensure the DOS region can be allocated.\n      set_property(TEST ${TEST_NAME} APPEND PROPERTY ENVIRONMENT \"WINEPRELOADRESERVE=10000-110000\")\n    endif()\n  endforeach()\n\nendforeach()\n\nadd_custom_target(asm_files ALL DEPENDS \"${ASM_DEPENDS}\")\n\nadd_custom_target(64bit_asm_tests\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  DEPENDS asm_files\n  DEPENDS \"${CMAKE_BINARY_DIR}/Bin/TestHarnessRunner\"\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"302\" ${TEST_JOB_FLAG} \"-R\" \"\\.*64Bit\\.*.asm$$\")\n\nadd_custom_target(asm_tests\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  DEPENDS asm_files\n  DEPENDS 32bit_asm_files\n  DEPENDS \"${CMAKE_BINARY_DIR}/Bin/TestHarnessRunner\"\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"302\" ${TEST_JOB_FLAG} \"-R\" \"\\.*.asm$$\")\n"
  },
  {
    "path": "unittests/ASM/ConstProp/ConstPooling.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RAX\": \"0xf\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; generate a lot of re-used constants\nmov dword[rdx], 0x0\nmov dword[rdx], 0x1\nmov dword[rdx], 0x2\nmov dword[rdx], 0x3\nmov dword[rdx], 0x4\nmov dword[rdx], 0x5\nmov dword[rdx], 0x6\nmov dword[rdx], 0x7\nmov dword[rdx], 0x8\nmov dword[rdx], 0x9\nmov dword[rdx], 0xa\nmov dword[rdx], 0xb\nmov dword[rdx], 0xc\nmov dword[rdx], 0xd\nmov dword[rdx], 0xe\nmov dword[rdx], 0xf\nmov dword[rdx], 0x0\nmov dword[rdx], 0x1\nmov dword[rdx], 0x2\nmov dword[rdx], 0x3\nmov dword[rdx], 0x4\nmov dword[rdx], 0x5\nmov dword[rdx], 0x6\nmov dword[rdx], 0x7\nmov dword[rdx], 0x8\nmov dword[rdx], 0x9\nmov dword[rdx], 0xa\nmov dword[rdx], 0xb\nmov dword[rdx], 0xc\nmov dword[rdx], 0xd\nmov dword[rdx], 0xe\nmov dword[rdx], 0xf\nmov dword[rdx], 0x0\nmov dword[rdx], 0x1\nmov dword[rdx], 0x2\nmov dword[rdx], 0x3\nmov dword[rdx], 0x4\nmov dword[rdx], 0x5\nmov dword[rdx], 0x6\nmov dword[rdx], 0x7\nmov dword[rdx], 0x8\nmov dword[rdx], 0x9\nmov dword[rdx], 0xa\nmov dword[rdx], 0xb\nmov dword[rdx], 0xc\nmov dword[rdx], 0xd\nmov dword[rdx], 0xe\nmov dword[rdx], 0xf\nmov dword[rdx], 0x0\nmov dword[rdx], 0x1\nmov dword[rdx], 0x2\nmov dword[rdx], 0x3\nmov dword[rdx], 0x4\nmov dword[rdx], 0x5\nmov dword[rdx], 0x6\nmov dword[rdx], 0x7\nmov dword[rdx], 0x8\nmov dword[rdx], 0x9\nmov dword[rdx], 0xa\nmov dword[rdx], 0xb\nmov dword[rdx], 0xc\nmov dword[rdx], 0xd\nmov dword[rdx], 0xe\nmov dword[rdx], 0xf\n\nmov eax, dword[rdx]\n\nhlt"
  },
  {
    "path": "unittests/ASM/DAZTest.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AFP\", \"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x0108000040e00000\", \"0xd1d2d3d4d5d6d7d8\", \"0\", \"0\"],\n    \"XMM1\": [\"0x00cfffff40e00000\", \"0xd1d2d3d4d5d6d7d8\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovaps ymm1, [rel .data_three]\nvmovaps ymm2, [rel .data_four]\n\n; Do an add without DAZ\nvaddps xmm0, xmm1, xmm2\n\n; Set DAZ\nstmxcsr [rel .data_mxcsr]\nor dword [rel .data_mxcsr], (1 << 6)\nldmxcsr [rel .data_mxcsr]\n\n; Do an add with DAZ\nvaddps xmm1, xmm1, xmm2\n\nhlt\nalign 4096\n\n.data_three:\ndd 3.0, 0x00cfffff\ndq 0xa1a2a3a4a5a6a7a8, 0xb1b2b3b4b5b6b7b8, 0xc1c2c3c4c5c6c7c8\n\n.data_four:\ndd 4.0, 0x00400000\ndq 0xd1d2d3d4d5d6d7d8, 0xe1e2e3e4e5e6e7e8, 0xf1f2f3f4f5f6f7f8\n\n.data_mxcsr:\ndd 0\n"
  },
  {
    "path": "unittests/ASM/Disabled_Tests",
    "content": "# Can't test this in a real environment\nTest_Primary/Primary_E8.asm\nTest_Primary/Primary_E9.asm\n\n# Relies on undefined behaviour\nTest_X87/D9_F9.asm\nTest_X87/D9_F2.asm\n\n# Relies on rounding correctness\nTest_X87/D9_F8.asm\n\n# This is basically a benchmark.\nFEX_bugs/XeSS_quadratic.asm\n"
  },
  {
    "path": "unittests/ASM/Disabled_Tests_ARMv8.0",
    "content": "# Nothing here yet\n"
  },
  {
    "path": "unittests/ASM/Disabled_Tests_ARMv8.2",
    "content": "# Nothing here yet\n"
  },
  {
    "path": "unittests/ASM/Disabled_Tests_ARMv8.4",
    "content": "# Nothing here yet\n"
  },
  {
    "path": "unittests/ASM/Disabled_Tests_Simulator",
    "content": "# AES and vpclmul unsupported in 256-bit SVE currently\nTest_VEX/vaesdec.asm\nTest_VEX/vaesdeclast.asm\nTest_VEX/vaesdec256.asm\nTest_VEX/vaesdeclast256.asm\nTest_VEX/vaesenc256.asm\nTest_VEX/vaesenclast256.asm\nTest_VEX/vpclmulqdq_256.asm\n\n# Simulator can't handle self-modifying code\nTest_SelfModifyingCode/Delinking.asm\nTest_SelfModifyingCode/DifferentBlock.asm\nTest_SelfModifyingCode/SameBlock.asm\n\n# Simulator can't do wfe\nTest_Primary/Pause.asm\n\n# Simulator can't handle `mrs x0, nzcv`\nTest_SecondaryModRM/Reg_7_1.asm\n\n# Simulator can't handle unaligned accesses\nTest_Primary/Primary_01_Atomic16.asm\nTest_Primary/Primary_01_Atomic32.asm\nTest_Primary/Primary_01_Atomic64.asm\nTest_Primary/Primary_09_Atomic16.asm\nTest_Primary/Primary_09_Atomic32.asm\nTest_Primary/Primary_09_Atomic64.asm\nTest_Primary/Primary_23_Atomic16.asm\nTest_Primary/Primary_23_Atomic32.asm\nTest_Primary/Primary_23_Atomic64.asm\nTest_Primary/Primary_29_Atomic16.asm\nTest_Primary/Primary_29_Atomic32.asm\nTest_Primary/Primary_29_Atomic64.asm\nTest_Primary/Primary_31_Atomic16.asm\nTest_Primary/Primary_31_Atomic32.asm\nTest_Primary/Primary_31_Atomic64.asm\nTest_Primary/Primary_87_Atomic16.asm\nTest_Primary/Primary_87_Atomic32.asm\nTest_Primary/Primary_87_Atomic64.asm\nTest_Primary/Primary_FF_0_Atomic16.asm\nTest_Primary/Primary_FF_0_Atomic32.asm\nTest_Primary/Primary_FF_0_Atomic64.asm\nTest_Primary/Primary_FF_1_Atomic16.asm\nTest_Primary/Primary_FF_1_Atomic32.asm\nTest_Primary/Primary_FF_1_Atomic64.asm\nTest_Atomics/adc_atomic16.asm\nTest_Atomics/adc_atomic32.asm\nTest_Atomics/adc_atomic64.asm\nTest_Atomics/sbb_atomic16.asm\nTest_Atomics/sbb_atomic32.asm\nTest_Atomics/sbb_atomic64.asm\nTest_Atomics/neg_atomic16.asm\nTest_Atomics/neg_atomic32.asm\nTest_Atomics/neg_atomic64.asm\nTest_Atomics/not_atomic16.asm\nTest_Atomics/not_atomic32.asm\nTest_Atomics/not_atomic64.asm\n\nTest_PrimaryGroup/3_F7_02_2.asm\nTest_PrimaryGroup/3_F7_02_3.asm\nTest_PrimaryGroup/3_F7_03_2.asm\n\nTest_TwoByte/0F_B0_3.asm\nTest_TwoByte/0F_B0_4.asm\nTest_TwoByte/0F_B0_5.asm\nTest_TwoByte/0F_B0_6.asm\nTest_TwoByte/0F_B0_7.asm\nTest_TwoByte/0F_C0_Atomic16.asm\nTest_TwoByte/0F_C0_Atomic32.asm\nTest_TwoByte/0F_C0_Atomic64.asm\n\nTest_Secondary/09_XX_01_8.asm\nTest_Secondary/09_XX_01_9.asm\nTest_Secondary/09_XX_01_12.asm\nTest_Secondary/09_XX_01_13.asm\nTest_Secondary/09_XX_01_15.asm\nTest_Secondary/09_XX_01_18.asm\nTest_Secondary/09_XX_01_19.asm\n\n# Simulator doesn't handle rounding mode changes\nTest_Secondary/15_XX_2.asm\nTest_X87_F64/FLDCW_F64.asm\nTest_H0F3A/66_08.asm\nTest_H0F3A/66_09.asm\nTest_H0F3A/66_0A.asm\nTest_H0F3A/66_0B.asm\nTest_OpSize/66_5B.asm\nTest_VEX/vcvtpd2dq_inexact.asm\nTest_VEX/vcvtps2dq_inexact.asm\nTest_VEX/vldmxcsr.asm\nTest_VEX/vroundpd.asm\nTest_VEX/vroundps.asm\nTest_VEX/vroundsd.asm\nTest_VEX/vroundss.asm\nTest_VEX/vcvtps2ph_rtne.asm\nTest_VEX/vcvtps2ph_rd.asm\nTest_VEX/vcvtps2ph_ru.asm\nTest_VEX/vcvtps2ph_trunc.asm\nTest_VEX/vcvtps2ph_rtne_mxcsr.asm\nTest_VEX/vcvtps2ph_rd_mxcsr.asm\nTest_VEX/vcvtps2ph_ru_mxcsr.asm\nTest_VEX/vcvtps2ph_trunc_mxcsr.asm\nTest_X87_F64/Rounding_F64.asm\n\n# Simulator doesn't support cycle counter reading\nTest_TwoByte/0F_31.asm\n\n# Simulator doesn't support executing a syscall\nTest_Secondary/09_F3_07.asm\n\n# Vixl sim at 256-bit vector width access too much memory with some AVX instructions\nTest_modrm_oob/VEX.asm\n\n# Vixl simulator with 256-bit vector width doesn't always do correct data retention for 128-bit non-AVX operations.\nTest_SSE4a/extrq_imm.asm\nTest_SSE4a/insertq_imm.asm\nTest_SSE4a/extrq_variable.asm\nTest_SSE4a/insertq_variable.asm\n\n# Simulator can't handle long jump through signal handler\nTest_FEX_bugs/CodeBufferOverflow.asm\n"
  },
  {
    "path": "unittests/ASM/Disabled_Tests_host",
    "content": "# Uses thunks\nTest_TwoByte/0F_3F.asm\n\n# Not guaranteed to work in 64bit mode\nTest_Primary/Primary_8C.asm\nTest_Primary/Primary_8C_2.asm\n\n# Zen+ CI doesn't support UMIP so it returns \"real\" values\nTest_Secondary/07_XX_00.asm\n\n# We don't emulate all of the MXCSR bits\nTest_VEX/vldmxcsr.asm\n\n# 3DNow!\nTest_modrm_oob/DDD.asm\n"
  },
  {
    "path": "unittests/ASM/Disabled_Tests_x64",
    "content": "# Nothing here yet\n"
  },
  {
    "path": "unittests/ASM/Displacement_Encoding.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x5152535455565758\",\n    \"RCX\": \"0x5152535455565758\"\n  },\n\n  \"MemoryRegions\": {\n    \"0x7FFFF000\": \"4096\"\n  },\n\n  \"MemoryData\": {\n    \"0x7FFFF000\": \"48 47 46 45 44 43 42 41\"\n  }\n}\n%endif\n\n; Tests to ensure that 64-bit displacement encoding works correctly without being RIP relative.\n; x86-64 has two displacement encodings, one is RIP relative, one is 32-bit (signed) displacement only.\n; modrm.mod = 0b00 && modrm.rm = 0b101: Means no SIB, but address mode is RIP + disp32.\n; modrm.mod = 0b00 && modrm.rm = 0b100: Means SIB, but address mode is disp32.\n;  - if SIB.base = 0b101 && SIB.index = 0b100. Which means no registers for base and index.\n; Test disp32 by mapping a page at the limit of 2GB and read data from it. Also store and load.\n; If we were accidentally using RIP relative, then it would be 2GB + <low test base address>, which won't be mapped.\n\n; Test disp32 load.\nmov rax, [abs 0x7FFF_F000]\n\nmov rbx, 0x5152535455565758\n\n; LEA with disp32.\nlea rcx, [abs 0x7FFF_FFF8]\n\n; Test store with disp32 store.\nmov [abs 0x7FFF_FFF8], rbx\n\n; Load back with the LEA to ensure it's correct.\nmov rcx, [rcx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/32bit_syscall.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\"\n  }\n}\n%endif\n\n; 32-bit:\n; 265 = clock_gettime\n; 64-bit\n; 265 = linkat\n\n; rax = syscall on both 32-bit and 64-bit\nmov rax, 265\n\n; rdi/rbx = first argument on 64-bit and 32-bit respectively\nmov rdi, 0\nmov rbx, 0\n\n; rsi/rcx = second argument on 64-bit and 32-bit respectively\nlea rsi, [rel .data]\nlea rcx, [rel .data]\n\n; Do a 32-bit syscall\n; On a real linux kernel this will execute clock_gettime\n; Under FEX without 32-bit syscall support this might try to execute linkat and return -ENOENT.\nint 0x80\nhlt\n\n.data:\ndq 0, 0, 0, 0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/3DNow_ModRMSIBDecode.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\":  \"0x3f800000bf800000\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\n; FEX-Emu had a bug with 3DNow! ModRM decoding when the source was SIB encoded.\n; This would result in a crash in the frontend instruction decoding.\n; Generate a 3DNow! instruction that uses SIB encoding to ensure this code path is tested.\nlea rax, [rel data1]\nmov rbx, 0\npi2fw mm0, [rbx * 8 + rax + 0]\n\nhlt\n\nalign 8\ndata1:\ndw -1\ndw 0xFF\ndw 1\ndw 0xFF\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/BEXTR_flags.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RCX\": \"0x5a\"\n  },\n  \"HostFeatures\": [\"BMI1\"]\n}\n%endif\n\nmov rcx, 0x8f635a775ad3b9b4\nmov esi, 0x3018\nbextr ecx, ecx, esi\ncmp rcx, 0x5a\njne .bad\n\n.good:\nmov rax, 0\nhlt\n\n.bad:\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/BLSI_flags.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RDX\": \"0xcafe\"\n  },\n  \"HostFeatures\": [\"BMI1\"]\n}\n%endif\n\n; Source 0 sets ZF\nmov rax, 0\nblsi rax, rax\n\njs fexi_fexi_im_so_broken\njnz fexi_fexi_im_so_broken\njc fexi_fexi_im_so_broken\njo fexi_fexi_im_so_broken\n\n; Source 1 sets CF\nmov rax, 1\nblsi rax, rax\n\njs fexi_fexi_im_so_broken\njz fexi_fexi_im_so_broken\njnc fexi_fexi_im_so_broken\njo fexi_fexi_im_so_broken\n\n; Source all-1's sets CF\nmov rax, 0xffffffffffffffff\nblsi rax, rax\n\njs fexi_fexi_im_so_broken\njz fexi_fexi_im_so_broken\njnc fexi_fexi_im_so_broken\njo fexi_fexi_im_so_broken\n\n; Source 1<<63 sets CF and SF\nmov rax, 0x8000000000000000\nblsi rax, rax\n\njns fexi_fexi_im_so_broken\njz fexi_fexi_im_so_broken\njnc fexi_fexi_im_so_broken\njo fexi_fexi_im_so_broken\n\n; Make sure we're correctly clearing the overflow flag\nmov rbx, 5\nmov al, 0x7F\ninc al\njno fexi_fexi_im_so_broken\nblsi rax, rax\njo fexi_fexi_im_so_broken\n\n; Happy ending\nmov rdx, 0xcafe\nhlt\n\nfexi_fexi_im_so_broken:\nmov rdx, 0xdead\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/BLSMSK_flags.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RDX\": \"0xcafe\",\n      \"RBX\": \"5\"\n  },\n  \"HostFeatures\": [\"BMI1\"]\n}\n%endif\n\n; Result in all-1's due to underflow so SF/CF set\nmov rbx, 1\nmov rax, 0\nblsmsk rax, rax\n\njns fexi_fexi_im_so_broken\njz fexi_fexi_im_so_broken\njnc fexi_fexi_im_so_broken\njo fexi_fexi_im_so_broken\n\n; Result in 1, so all flags clear\nmov rbx, 2\nmov rax, 11\nblsmsk rax, rax\n\njs fexi_fexi_im_so_broken\njz fexi_fexi_im_so_broken\njc fexi_fexi_im_so_broken\njo fexi_fexi_im_so_broken\n\n; Result in all-1's without carry, so SF set\nmov rbx, 3\nmov rax, 0x8000000000000000\nblsmsk rax, rax\n\njns fexi_fexi_im_so_broken\njz fexi_fexi_im_so_broken\njc fexi_fexi_im_so_broken\njo fexi_fexi_im_so_broken\n\n; Make sure we're correctly clearing the zero flag\nmov rbx, 4\nmov rax, 0\nadd rax, rax\njnz fexi_fexi_im_so_broken\nblsmsk rax, rax\njz fexi_fexi_im_so_broken\n\n; Make sure we're correctly clearing the overflow flag\nmov rbx, 5\nmov al, 0x7F\ninc al\njno fexi_fexi_im_so_broken\nblsmsk rax, rax\njo fexi_fexi_im_so_broken\n\n; Happy ending\nmov rdx, 0xcafe\nhlt\n\nfexi_fexi_im_so_broken:\nmov rdx, 0xdead\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/BLSR_flags.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RDX\": \"0xcafe\"\n  },\n  \"HostFeatures\": [\"BMI1\"]\n}\n%endif\n\n; Source 0 sets CF and ZF\nmov rax, 0\nblsr rax, rax\n\njs fexi_fexi_im_so_broken\njnz fexi_fexi_im_so_broken\njnc fexi_fexi_im_so_broken\njo fexi_fexi_im_so_broken\n\n; Source 1 sets ZF\nmov rax, 1\nblsr rax, rax\n\njs fexi_fexi_im_so_broken\njnz fexi_fexi_im_so_broken\njc fexi_fexi_im_so_broken\njo fexi_fexi_im_so_broken\n\n; Source 3 sets nothing\nmov rax, 3\nblsr rax, rax\n\njs fexi_fexi_im_so_broken\njz fexi_fexi_im_so_broken\njc fexi_fexi_im_so_broken\njo fexi_fexi_im_so_broken\n\n; Source all-1's sets SF\nmov rax, 0xffffffffffffffff\nblsr rax, rax\n\njns fexi_fexi_im_so_broken\njz fexi_fexi_im_so_broken\njc fexi_fexi_im_so_broken\njo fexi_fexi_im_so_broken\n\n; Make sure we're correctly clearing the overflow flag\nmov rbx, 5\nmov al, 0x7F\ninc al\njno fexi_fexi_im_so_broken\nblsr rax, rax\njo fexi_fexi_im_so_broken\n\n; Happy ending\nmov rdx, 0xcafe\nhlt\n\nfexi_fexi_im_so_broken:\nmov rdx, 0xdead\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/BT_flags.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xcafe\"\n  }\n}\n%endif\n\nmov ebx, 137\nmov rdx, 0xe0000000\n\n%macro case 1\n  ; set zero flag\n  xor eax, eax\n\n  ; zero flag should still be set after bt\n  %1 ebx, 1\n  jnz .bad\n  %1 dword [rdx], ebx\n  jnz .bad\n\n  ; now clear the zero flag\n  add eax, 1\n\n  ; zero flag should still be clear after bt\n  %1 eax, 1\n  jz .bad\n  %1 dword [rdx], ebx\n  jz .bad\n%endmacro\n\n; Repeat for each bitwise op\ncase bt\ncase btc\ncase bts\ncase btr\n\n.good:\nmov rax, 0xcafe\nhlt\n\n.bad:\nmov rax, 0xdeadbeef\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/BZHI_Sign.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFF4\",\n    \"RCX\": \"0x0\",\n    \"RDX\": \"0x1337\"\n  },\n  \"HostFeatures\": [\"BMI2\"]\n}\n%endif\n\n; FEX had a bug where bzhi would fail to update SF. Test that bzhi correctly\n; sets ZF/SF correctly based on the result.\n\nmov rcx, 4\nmov rbx, -12\n\n; Result is 0x4\nbzhi rax, rbx, rcx\nmov rdx, 0xdead1\njz .fail\nmov rdx, 0xdead2\njs .fail\n\n; Result is -12\nmov rcx, 64\nbzhi rdx, rbx, rcx\nmov rdx, 0xdead3\njz .fail\nmov rdx, 0xdead4\njns .fail\n\n; Result is 0x00\nmov rdx, 0\nbzhi rcx, rbx, rdx\nmov rdx, 0xdead5\njnz .fail\nmov rdx, 0xdead6\njs .fail\n\nmov rdx, 0x1337\nhlt\n\n.fail:\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/BitConditionCheck.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Env\": { \"FEX_MAXINST\" : \"41010\", \"FEX_MULTIBLOCK\": \"1\", \"FEX_TSOENABLED\": \"0\" }\n}\n%endif\n\n; FEX-Emu had a bug where it tried to encode too large of a tbz/tbnz offset.\n\n%macro TooConditionalBitBranch 0\n  ; Stresses ARM64's tbz/tbnz branch target of +-32KB.\n  jmp %%top\n  %%top:\n\n  lea rax, [rel data]\n  mov rbx, 1\n  %rep 2000\n    add qword [rel data], rbx\n  %endrep\n  lea rax, [rel %%top]\n  jpe %%top\n%endmacro\n\nmov rax, 0\ncmp rax, 0\nmov rcx, 0\n\njz long_jump\n\nTooConditionalBitBranch\n\nlong_jump:\nmov rax, 1\nhlt\n\ndata:\ndq 0, 0, 0, 0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/Blake3.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\nvblendps ymm3, ymm12, ymm9, 0xcc\nvperm2f128 ymm12, ymm1, ymm2, 0x20\nvmovups [rel .data_result + 0], ymm12\nvunpckhps ymm14, ymm4, ymm5\nvblendps ymm4, ymm8, ymm0, 0xcc\nvunpckhps ymm15, ymm6, ymm7\nvperm2f128 ymm7, ymm3, ymm4, 0x20\nvmovups [rel .data_result + 32], ymm7\nvshufps ymm5, ymm10, ymm13, 0x4e\nvblendps ymm6, ymm5, ymm13, 0xcc\nvshufps ymm13, ymm14, ymm15, 0x4e\nvblendps ymm10, ymm10, ymm5, 0xcc\nvblendps ymm14, ymm14, ymm13, 0xcc\nvperm2f128 ymm8, ymm10, ymm14, 0x20\nvmovups [rel .data_result + (32 * 2)], ymm8\nvblendps ymm15, ymm13, ymm15, 0xcc\nvperm2f128 ymm13, ymm6, ymm15, 0x20\nvmovups [rel .data_result + (32 * 3)], ymm13\nvperm2f128 ymm9, ymm1, ymm2, 0x31\nvperm2f128 ymm11, ymm3, ymm4, 0x31\nvmovups [rel .data_result + (32 * 4)], ymm9\nvperm2f128 ymm14, ymm10, ymm14, 0x31\nvperm2f128 ymm15, ymm6, ymm15, 0x31\nvmovups [rel .data_result + (32 * 5)], ymm11\nvmovups [rel .data_result + (32 * 6)], ymm14\nvmovups [rel .data_result + (32 * 7)], ymm15\nvmovdqa ymm0, [rel .data_stack + (32 * 0)]\nvpaddd  ymm1, ymm0, [rel .data_stack + (32 * 1)]\nvmovdqa [rel .data_stack + (32 * 1)], ymm1\nvpxor   ymm0, ymm0, [rel .data]\nvpxor   ymm2, ymm1, [rel .data + 32]\n\nhlt\n\nalign 4096\n.data:\ndq 0, 0, 0, 0, 0, 0\ndq 0, 0, 0, 0, 0, 0\n\n.data_stack:\ndq 0, 0, 0, 0\ndq 0, 0, 0, 0\n\n.data_result:\ndq 0, 0, 0, 0\ndq 0, 0, 0, 0\ndq 0, 0, 0, 0\ndq 0, 0, 0, 0\ndq 0, 0, 0, 0\ndq 0, 0, 0, 0\ndq 0, 0, 0, 0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/BranchConditionCheck.asm",
    "content": "\n%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Env\": { \"FEX_MAXINST\" : \"41010\", \"FEX_MULTIBLOCK\": \"1\", \"FEX_TSOENABLED\": \"0\" }\n}\n%endif\n\n; FEX-Emu had a bug where it tried encoding too large of a conditional branch offset.\n\n%macro TooLargeConditionalBranch 0\n  ; Stresses ARM64's b.cc/cbz/cbnz branch target of +-1MB.\n  jmp %%top\n  %%top:\n\n  lea rax, [rel data]\n  mov rbx, 1\n  %rep 37500\n    add qword [rel data], rbx\n  %endrep\n  lea rax, [rel %%top]\n  jnz %%top\n%endmacro\n\nmov rax, 0\ncmp rax, 0\nmov rcx, 0\n\njz long_jump\n\nTooLargeConditionalBranch\n\nlong_jump:\nmov rax, 1\nhlt\n\ndata:\ndq 0, 0, 0, 0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/CodeBufferOverflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"Env\": { \"FEX_MAXINST\" : \"41010\", \"FEX_MULTIBLOCK\": \"1\", \"FEX_TSOENABLED\": \"0\" }\n}\n%endif\n\n; FEX had a bug where its JIT heuristic wouldn't catch all cases, and allocations would overflow and crash.\n\n%macro OverflowBuffer 0\n  %rep 256\n  ; This instruction is absolutely abysmal under FEX.\n  ; Easily stresses our heuristic for block sizes\n  rep movsq\n  %endrep\n%endmacro\n\nmov rax, 0\ncmp rax, 0\nmov rcx, 0\nmov rdi, 1\nmov rsi, 2\n\njz long_jump\n\nOverflowBuffer\n\nlong_jump:\nmov rax, 1\nhlt\n\ndata:\ndq 0, 0, 0, 0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/Divide32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x80000001\",\n    \"RDX\": \"0x1\"\n  }\n}\n%endif\n\n; FEX had a bug where we failed to ignore garbage upper bits of a 32-bit divisor\n; with div. This test does a division with garbage in the upper bits where the\n; result would differ if they were not ignored.\n\n; 0x100000003 / 0x2 = 0x80000001 remainder 1\nmov edx, 1\nmov eax, 3\nmov rcx, 0xdeadbeef00000002\ndiv ecx\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/H0F3AREXBug.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AES\", \"SHA\", \"SSE4.2\", \"SSE4.1\", \"PCLMUL\", \"SSSE3\"]\n}\n%endif\n\n; FEX-Emu had a bug in decoding the H0F3A instruction table.\n; It would accidentally require REX.W to not be set on the suite of instructions that ignore the flag.\n; This just executes all instructions from H0F3A that ignore the REX.W flag, to ensure it decodes.\n\no64 palignr mm0, mm1, 0\no64 roundps xmm0, xmm1, 0\no64 roundpd xmm0, xmm1, 0\no64 roundss xmm0, xmm1, 0\no64 roundsd xmm0, xmm1, 0\no64 blendps xmm0, xmm1, 0\no64 blendpd xmm0, xmm1, 0\no64 palignr xmm0, xmm1, 0\no64 pextrb eax, xmm0, 0\no64 pextrw eax, xmm0, 0\no64 extractps eax, xmm0, 0\no64 extractps eax, xmm0, 0\no64 pinsrb xmm0, eax, 0\no64 insertps xmm0, xmm1, 0\no64 dpps xmm0, xmm1, 0\no64 dppd xmm0, xmm1, 0\no64 mpsadbw xmm0, xmm1, 0\no64 pclmulqdq xmm0, xmm1, 0\no64 pcmpestrm xmm0, xmm1, 0\no64 pcmpestri xmm0, xmm1, 0\no64 pcmpistrm xmm0, xmm1, 0\no64 pcmpistri xmm0, xmm1, 0\no64 sha1rnds4 xmm0, xmm1, 0\no64 aeskeygenassist xmm0, xmm1, 0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/IMUL_garbagedata_negative.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x0000000000003fff\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nlahf\nshr rax, 8\nand rax, 1\n\n; Merge in to results\nshl r15, 1\nor r15, rax\n\n%endmacro\n\n; FEX had a bug where imul flag calculation was incorrect.\n; CF and OF are set due to overflow.\n\nmov r15, 0\nmov rax, 0\n\n; Multiply starting value\nmov ebx, 0x6D\n\n; imul 1-src\nmov ebx, 0xaaaaaaab\nmov ecx, 0x6D\nimul cx, bx\ncfmerge\n\nmov ebx, 0xaaaaaaab\nmov ecx, 0x6D\nimul ecx, ebx\ncfmerge\n\nmov rbx, 0xaaaaaaaa_aaaaaaab\nmov rcx, 0x6D\nimul rcx, rbx\ncfmerge\n\n; imul 2-src 8-bit check\nmov ebx, 0xaaaaaaab\nimul cx, bx, 0x6D\ncfmerge\n\nmov ebx, 0xaaaaaaab\nimul ecx, ebx, 0x6D\ncfmerge\n\nmov rbx, 0xaaaaaaaa_aaaaaaab\nimul ecx, ebx, 0x6D\ncfmerge\n\n; imul 2-src 16-bit, 32-bit, 64-bit check\nmov rbx, 0xaaaaaaaa_aaaaaaab\nimul cx, bx, 0x600D\ncfmerge\n\nmov rbx, 0xaaaaaaaa_aaaaaaab\nimul ecx, ebx, 0x600D0000\ncfmerge\n\n\nmov rbx, 0xaaaaaaaa_aaaaaaab\nimul rcx, rbx, 0x600D0000\ncfmerge\n\nmov rbx, 0x0aaaaaaa_aaaaaaab\nimul rcx, rbx, -0x600D0000\ncfmerge\n\n\n; IMUL implicit dest\nmov rax, 0x0aaaaaaa_aaaaaaab\nmov ecx, 0x6D\nimul cl\ncfmerge\n\nmov rax, 0x0aaaaaaa_aaaaaaab\nmov ecx, 0x600D\nimul cx\ncfmerge\n\nmov rax, 0x0aaaaaaa_aaaaaaab\nmov ecx, 0x600D0000\nimul ecx\ncfmerge\n\nmov rax, 0x0aaaaaaa_aaaaaaab\nmov rcx, 0x600D0000_00000000\nimul rcx\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/InitialPFFlag.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x202\"\n  }\n}\n%endif\n\nmov rsp, 0xe0000010\n\npushfq\npop rax\n\n; Mask out only the flags we care about (ignore undefined bits)\n; Keep: CF(0), PF(2), AF(4), ZF(6), SF(7), IF(9), DF(10), OF(11), reserved(1)\nand rax, 0xED7\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/LargeRotatesForSmallSizes.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x4142434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4142434445464714\",\n    \"RDI\": \"0x414243444546478a\",\n    \"RBP\": \"0x4142434445464704\",\n    \"RSP\": \"0x414243444546478a\",\n    \"R8\":  \"0x4142434445461d22\",\n    \"R9\":  \"0x41424344454651d2\",\n    \"R10\": \"0x4142434445461d20\",\n    \"R11\": \"0x41424344454651d2\",\n    \"R12\": \"0x4142434445463a45\",\n    \"R13\": \"0x41424344454608e9\",\n    \"R14\": \"0x4142434445463a41\",\n    \"R15\": \"0x41424344454608e9\"\n  }\n}\n%endif\n\n; FEX-Emu had a bug where 8-bit and 16-bit rotates with carry generated incorrect results when the rotate amount was larger than the data size.\n; This is well defined in x86 semantics.\n\nmov cl, 0x9\nstc\njmp .test\n.test:\n; 8-bit: Test 1-bit past data size, plus carry\nrcr byte [rel .data + (0 * 8)], cl\nrcl byte [rel .data + (1 * 8)], cl\n\nmov cl, 0x9\nclc\njmp .test2\n.test2:\n; 8-bit: Test 1-bit past data size, no carry\nrcr byte [rel .data + (2 * 8)], cl\nrcl byte [rel .data + (3 * 8)], cl\n\nmov cl, 0x1f\nstc\njmp .test3\n.test3:\n; 8-bit: Test maximum 32-bit rotate, plus carry\nrcr byte [rel .data + (4 * 8)], cl\nrcl byte [rel .data + (5 * 8)], cl\n\nmov cl, 0x1f\nclc\njmp .test4\n.test4:\n; 8-bit: Test maximum 32-bit rotate, plus carry\nrcr byte [rel .data + (6 * 8)], cl\nrcl byte [rel .data + (7 * 8)], cl\n\nmov cl, 0xF\nstc\njmp .test5\n.test5:\n; 16-bit: Test 1-bit past data size, plus carry\nrcr word [rel .data + (8 * 8)], cl\nrcl word [rel .data + (9 * 8)], cl\n\nmov cl, 0xF\nclc\njmp .test6\n.test6:\n; 16-bit: Test 1-bit past data size, no carry\nrcr word [rel .data + (10 * 8)], cl\nrcl word [rel .data + (11 * 8)], cl\n\nmov cl, 0x1f\nstc\njmp .test7\n.test7:\n; 16-bit: Test maximum 32-bit rotate, plus carry\nrcr word [rel .data + (12 * 8)], cl\nrcl word [rel .data + (13 * 8)], cl\n\nmov cl, 0x1f\nclc\njmp .test8\n.test8:\n; 16-bit: Test maximum 32-bit rotate, plus carry\nrcr word [rel .data + (14 * 8)], cl\nrcl word [rel .data + (15 * 8)], cl\n\njmp .end\n.end:\n\n; Load all the results in order\nmov rax, [rel .data + (0 * 8)]\nmov rbx, [rel .data + (1 * 8)]\nmov rcx, [rel .data + (2 * 8)]\nmov rdx, [rel .data + (3 * 8)]\nmov rsi, [rel .data + (4 * 8)]\nmov rdi, [rel .data + (5 * 8)]\nmov rbp, [rel .data + (6 * 8)]\nmov rsp, [rel .data + (7 * 8)]\nmov r8,  [rel .data + (8 * 8)]\nmov r9,  [rel .data + (9 * 8)]\nmov r10, [rel .data + (10 * 8)]\nmov r11, [rel .data + (11 * 8)]\nmov r12, [rel .data + (12 * 8)]\nmov r13, [rel .data + (13 * 8)]\nmov r14, [rel .data + (14 * 8)]\nmov r15, [rel .data + (15 * 8)]\n\nhlt\n\nalign 4096\n.data:\ntimes 16 dq 0x4142434445464748\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/LargeRotatesForSmallSizes_More.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344454647a4\",\n    \"RBX\": \"0x4142434445464790\",\n    \"RCX\": \"0x4142434445464724\",\n    \"RDX\": \"0x4142434445464790\",\n    \"RSI\": \"0x4142434445468e90\",\n    \"RDI\": \"0x414243444546a3a4\",\n    \"RBP\": \"0x41424344454623a4\",\n    \"RSP\": \"0x4142434445468e90\",\n    \"R8\":  \"0x4142434445464729\",\n    \"R9\":  \"0x4142434445464741\",\n    \"R10\": \"0x4142434445464729\",\n    \"R11\": \"0x4142434445464741\",\n    \"R12\": \"0x4142434445464729\",\n    \"R13\": \"0x4142434445464741\",\n    \"R14\": \"0x4142434445464729\",\n    \"R15\": \"0x4142434445464741\"\n  }\n}\n%endif\n\n; FEX-Emu had a bug where 8-bit and 16-bit rotates with carry generated incorrect results when the rotate amount was larger than the data size.\n; These are additional tests to capture more edge cases in the implementation.\n; This is well defined in x86 semantics.\n\nmov rax, 0x4142434445464748\nmov rbx, 0x4142434445464748\nmov rdx, 0x4142434445464748\nmov rdi, 0x4142434445464748\nmov rsi, 0x4142434445464748\nmov rbp, 0x4142434445464748\nmov rsp, 0x4142434445464748\nmov r8, 0x4142434445464748\nmov r9, 0x4142434445464748\nmov r10, 0x4142434445464748\nmov r11, 0x4142434445464748\nmov r12, 0x4142434445464748\nmov r13, 0x4142434445464748\nmov r14, 0x4142434445464748\nmov r15, 0x4142434445464748\n\nmov rcx, 0x515253545556571E\njmp .test\n.test:\n; 8-bit cl, carry\nstc\nrcr r8b, cl\nrcl r9b, cl\n\n; 8-bit cl, no-carry\nstc\nrcr r10b, cl\nrcl r11b, cl\n\n; 16-bit cl, carry\nstc\nrcr r12b, cl\nrcl r13b, cl\n\n; 16-bit cl, no-carry\nstc\nrcr r14b, cl\nrcl r15b, cl\n\n; Fix RCX since we used it\nmov rcx, 0x4142434445464748\n\n; 8-bit const, carry\nstc\nrcr al, 0x21\nrcl bl, 0x21\n\n; 8-bit const, no-carry\nclc\nrcr cl, 0x21\nrcl dl, 0x21\n\n; 16-bit const, carry\nstc\nrcr di, 0x21\nrcl si, 0x21\n\n; 16-bit const, no-carry\nclc\nrcr bp, 0x21\nrcl sp, 0x21\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/LoadAtBoundary_LowerPrecision.asm",
    "content": "%ifdef CONFIG\n{\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n; FEX-Emu had a bug where x87 loadstores at a page boundary with reduced precision enabled would loadstore 128-bits.\n\nfinit ; enters x87 state\n\nmov rax, 0x100000000\nmov rbx, 0x4142434445464748\nmov rcx, 0x5152535455565758\nmov rdx, (0x100000000 + 0x1000 - 16)\n\nmov [rdx], rbx\nmov [rdx + 8], rcx\n\nmov rdx, 0x100000000 + 0x1000\n\n; Do an 80-bit load at the edge of a page.\n; Ensuring tword loads don't extend past the end of a page.\nfld tword [rdx - 10]\n\n; Do an 80-bit BCD load at the edge of a page.\nfbld [rdx - 10]\n\n; Do a BCD store\nfbstp [rdx - 10]\n\n; Regular 80-bit store\nfstp tword [rdx - 10]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/LongSignedDivide.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xfa4fa4fa4fa50e8f\",\n    \"RDX\": \"0x000000000000001c\"\n  }\n}\n%endif\n; FEX-Emu had a bug where a 128-bit divide with a large unsigned number with a negative number would result in incorrect data.\n; This only manifested itself when the sign bit differed between upper and lower halves of the dividend.\n\nmov rax, 0xfffffffffffc70f9\nmov rdx, 0x0000000000000000\nmov rbx, 0xffffffffffffffd3\n\njmp .test\n.test:\nidiv rbx\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/LoopAddressSizeCheck.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000000010001\",\n    \"RBX\": \"0x0000000000000001\"\n  }\n}\n%endif\n\n; FEX-Emu had a bug in the 32-bit implementation of LOOP where it didn't handle 16-bit RCX correctly.\n; For test coverage on the 64-bit side, ensure that both 64-bit and 32-bit operation works correctly.\nmov rax, 0\nmov rbx, 0\nmov rcx, 0x0001_0001\n\n.test:\ninc rax\na64 loop .test\n\nmov rcx, 0x1_0000_0001\n.test2:\ninc rbx\na32 loop .test2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/MinMaxNaN.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": \"0x00000000\",\n      \"RBX\": \"0x00000000\",\n      \"RCX\": \"0x00000000\",\n      \"RSI\": \"0x00000000\"\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n%macro single_case 4\n  ; Load sources\n  mov eax, %2\n  mov ebx, %3\n  movd xmm0, eax\n  movd xmm1, ebx\n\n  ; Calculate scalar min/max\n  %1ss xmm0, xmm1\n\n  ; Check result\n  movd ecx, xmm0\n  cmp ecx, %4\n  jne fexi_fexi_im_so_broken\n  mov ecx, 0\n\n  ; Now try the SSE vector\n  %1ps xmm0, xmm1\n  movd ecx, xmm0\n  cmp ecx, %4\n  jne fexi_fexi_im_so_broken\n  mov ecx, 0\n\n  ; And the AVX-128 version\n  v%1ps xmm2, xmm0, xmm1\n  movd ecx, xmm2\n  cmp ecx, %4\n  jne fexi_fexi_im_so_broken\n  mov ecx, 0\n\n  ; And the AVX-256 version\n  v%1ps ymm2, ymm0, ymm1\n  movd ecx, xmm2\n  cmp ecx, %4\n  jne fexi_fexi_im_so_broken\n\n%endmacro\n\n%macro case_d 4\n  ; Load sources\n  mov rax, %2\n  mov rbx, %3\n  movq xmm0, rax\n  movq xmm1, rbx\n\n  ; Calculate scalar min/max\n  %1sd xmm0, xmm1\n\n  ; Check result\n  movq rcx, xmm0\n  mov rdx, %4\n  cmp rcx, rdx\n  jne fexi_fexi_im_so_broken\n  mov rcx, 0\n\n  ; Now try the SSE vector\n  %1pd xmm0, xmm1\n  movq rcx, xmm0\n  mov rdx, %4\n  cmp rcx, rdx\n  jne fexi_fexi_im_so_broken\n  mov rcx, 0\n\n  ; And the AVX-128 version\n  v%1pd xmm2, xmm0, xmm1\n  movq rcx, xmm2\n  mov rdx, %4\n  cmp rcx, rdx\n  jne fexi_fexi_im_so_broken\n  mov rcx, 0\n\n  ; And the AVX-256 version\n  v%1pd ymm2, ymm0, ymm1\n  movq rcx, xmm2\n  mov rdx, %4\n  cmp rcx, rdx\n  jne fexi_fexi_im_so_broken\n%endmacro\n\n%macro min_s 3\n  single_case min, %1, %2, %3\n%endmacro\n\n%macro max_s 3\n  single_case max, %1, %2, %3\n%endmacro\n\n%macro min_d 3\n  case_d min, %1, %2, %3\n%endmacro\n\n%macro max_d 3\n  case_d max, %1, %2, %3\n%endmacro\n\nzero_s equ 0x00000000\nnegzero_s equ 0x80000000\nqnan_s equ 0x7fc00000\nsnan_s equ 0x7f800001\n\nzero_d equ 0x0000_0000_0000_0000\nnegzero_d equ 0x8000_0000_0000_0000\nqnan_d equ 0x7ff8_0000_0000_0000\nsnan_d equ 0x7ff0_0000_0000_0001\n\n%macro cases 1\n  ; Basic identities\n  min%1 zero%1,    zero%1,    zero%1\n  max%1 zero%1,    zero%1,    zero%1\n  min%1 negzero%1, negzero%1, negzero%1\n  max%1 negzero%1, negzero%1, negzero%1\n  min%1 qnan%1,    qnan%1,    qnan%1\n  max%1 qnan%1,    qnan%1,    qnan%1\n\n  ; \"If the values being compared are both 0.0s (of either sign), the value in\n  ; the second source operand is returned\"\n  min%1 zero%1,    negzero%1, negzero%1\n  max%1 zero%1,    negzero%1, negzero%1\n  min%1 negzero%1, zero%1,    zero%1\n  max%1 negzero%1, zero%1,    zero%1\n\n  ; \"If only one value is a NaN (SNaN or QNaN) for this instruction, the second\n  ; source operand, either a NaN or a valid floating-point value, is written to\n  ; the result\"\n  min%1 zero%1,    qnan%1,    qnan%1\n  min%1 negzero%1, qnan%1,    qnan%1\n  min%1 qnan%1,    zero%1,    zero%1\n  min%1 qnan%1,    negzero%1, negzero%1\n\n  max%1 zero%1,    qnan%1,    qnan%1\n  max%1 negzero%1, qnan%1,    qnan%1\n  max%1 qnan%1,    zero%1,    zero%1\n  max%1 qnan%1,    negzero%1, negzero%1\n\n  min%1 zero%1,    snan%1,    snan%1\n  min%1 negzero%1, snan%1,    snan%1\n  min%1 snan%1,    zero%1,    zero%1\n  min%1 snan%1,    negzero%1, negzero%1\n\n  max%1 zero%1,    snan%1,    snan%1\n  max%1 negzero%1, snan%1,    snan%1\n  max%1 snan%1,    zero%1,    zero%1\n  max%1 snan%1,    negzero%1, negzero%1\n\n  ; \"If a value in the second operand is an SNaN, that SNaN is returned\n  ; unchanged to the destination (that is, a QNaN version of the SNaN is not\n  ; returned).\"\n  min%1 qnan%1, snan%1, snan%1\n  min%1 snan%1, snan%1, snan%1\n%endmacro\n\nsingle_cases:\n  cases _s\n\ncases_double:\n  cases _d\n\nsuccess:\n  mov rax, 0\n  mov rbx, 0\n  mov rcx, 0\n  mov rsi, 0\n  hlt\n\nfexi_fexi_im_so_broken:\n  ; Leave rax/rbx/rcx as-is for inspection\n  mov rsi, 0xdeadbeef\n  hlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/MoveMerging.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xaaaa\",\n    \"RBX\": \"0xaaaa\",\n    \"RSI\": \"0xbbbb\"\n  }\n}\n%endif\n\n; FEX had a bug with mov+xchg back-to-back due to failing to account for a copy\n; inserted during RA. This resulted in a hang starting the game Hades due to the\n; mov+xchg code sequence found within Wine's x64 build of ucrtbase.dll.\n\nmov rax, 0xaaaa\nmov rbx, 0xbbbb\nmov rsi, 0xcccc\n\n; step 1\nmov    rsi,rax\n; rax = 0xaaaa\n; rbx = 0xbbbb\n; rsi = 0xaaaa\n\n; step 2\nxchg   rbx,rsi\n; rax = 0xaaaa\n; rbx = 0xaaaa\n; rsi = 0xbbbb\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/NegativeCallAddressSizeOverride.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; FEX had a bug with relative call instructions.\n; It was incorrectly truncating the immediate displacement based on address size override AND operand size override.\n; Address size override doesn't actually change immediate representation on the call instruction.\n\nmov rsp, 0xe000_1000\nmov rax, 0\n\njmp .after\n.test:\nmov rax, 1\nhlt\n\n.after:\na32 call .test\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/OptSizeConfusion.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x000000000f0f0f0f\",\n    \"RBX\": \"0x000000000f0f0f0f\",\n    \"RCX\": \"0x000000000f0f0f0f\",\n    \"RDX\": \"0x00000000ffffffff\",\n    \"R9\": \"0x000000000f0f0f0f\"\n  }\n}\n%endif\n\n; FEX had several bugs in its constprop pass where 32->64 bit truncation behaviour wasn't accounted for leading\n; to incorrectly inserting instead.\n\nmov rax, 0x0f0f0f0f0f0f0f0f\nmov rbx, 0x0f0f0f0f0f0f0f0f\nmov rcx, 0x0f0f0f0f0f0f0f0f\nmov rdx, 1\nmov r9, 0x0f0f0f0f0f0f0f0f\nxor eax, 0\nand ebx, ebx\nshr ecx, 0\nneg edx\nshl r9d, 0\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/PSRLDQBuf.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; FEX-Emu had a bug with vpsrldq where if the shift was >= 16 bytes then the top half of the ymm register wasn't modified.\n; Adds a simple test to ensure this continues working.\nvmovups ymm0, [rel .data]\nvpsrldq ymm0, ymm0, 16\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748, 0x5152535455565758, 0x6162636465666768, 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/Push.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xe0000010\",\n    \"RSP\": \"0xe0000008\"\n  }\n}\n%endif\n\n; FEX had a bug where a `push rsp` would generate an Arm64 instruction with undefined behaviour.\n; `push rsp` -> `str x8, [x8, #-8]!`\n; This instruction has constrained undefined behaviour.\n; On Cortex it stores the original value.\n; On Apple Silicon it raises a SIGILL.\n; It can also store undefined data or have undefined behaviour.\n; Test to ensure we don't generate undefined behaviour.\nmov rsp, 0xe0000010\npush rsp\n\nmov rax, [rsp]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/REX/0F_38.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x424446484a4c4e50\",\n    \"RCX\": \"0x00000000d2af0486\",\n    \"R8\": \"0\"\n  }\n}\n%endif\n\nmov rax, 0x4142434445464748\nmov rcx, 0x4142434445464748\n\nmov r8, 0\n\nlea rbx, [rel .data]\njmp .test\n.test:\n\n; adcx rax, [rbx]\n; Real encoding: 0x66, 0x48, 0x0f, 0x38, 0xf6, 0x03\n; Add a dummy REX prefix that enables everything. Really mess up FEX's cumulative usage.\ndb 0x4f, 0x66, 0x48, 0x0f, 0x38, 0xf6, 0x03\n\n; crc32 ecx, dword [rbx]\n; Real encoding: 0xf2, 0x0f, 0x38, 0xf1, 0x0b\n; Add a dummy rex encoding with the widening bit set.\n; If FEX parsed this incorrectly, then it converts the crc in to a 64-bit version.\ndb 0x48, 0xf2, 0x0f, 0x38, 0xf1, 0x0b\n\nhlt\n\nalign 16\n.data:\ndq 0x0102030405060708\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/REX/0F_3A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000055565758\",\n    \"RCX\": \"0x5152535455565758\",\n    \"R8\": \"0\"\n  }\n}\n%endif\n\nmov rax, 0x4142434445464748\nmov rcx, 0x4142434445464748\nmov r8, 0\nmovups xmm0, [rel .data]\njmp .test\n.test:\n\n; pextrd eax, xmm0, 0\n; Real encoding: 0x66, 0x0f, 0x3a, 0x16, 0xc0, 0x00\n; Add a NOP REX encoding. Would convert `eax` to `rax` if decoded incorrectly.\ndb 0x4f, 0x66, 0x0f, 0x3a, 0x16, 0xc0, 0x00\n; pextrq rcx, xmm0, 0\n; Real encoding: 0x66, 0x48, 0x0f, 0x3a, 0x16, 0xc1, 0x00\n; Add a NOP REX encoding, should do nothing. Might convert rcx to ecx if only first REX decoded.\ndb 0x47, 0x66, 0x48, 0x0f, 0x3a, 0x16, 0xc1, 0x00\nhlt\n\nalign 16\n.data:\ndq 0x5152535455565758, 0x6162636465666768\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/REX/DDDNow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0506070801020304\",\n    \"MM0\": \"0x0506070801020304\"\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nfemms\nmov rax, 0x4142434445464748\n\nmov r8, 0\n\nlea rbx, [rel .data]\njmp .test\n.test:\n\n; pswapd mm0, [rbx]\n; Real encoding: 0x0f, 0x0f, 0x03, 0xbb\n; Add a NOP REX encoding between a volatile REX and the 3DNow! instruction.\n; FEX accidentally being cumulative will cause rbx to convert to r8.\ndb 0x41, 0x40, 0x0f, 0x0f, 0x03, 0xbb\n\nmovd rax, mm0\nhlt\n\nalign 16\n.data:\ndq 0x0102030405060708\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/REX/Primary.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464e50\",\n    \"RCX\": \"0x000000004a4c4e50\",\n    \"R8\": \"0x4142434445464748\",\n    \"R9\": \"0x4142434445464748\"\n  }\n}\n%endif\n\n; FEX-Emu had a bug where REX was not correctly ignored if it was placed at the wrong location.\n; \"Wrong\" means it wasn't encoded just before the opcode byte.\n; This can be done for multiple reasons, either padding or anti-emulation.\nmov rax, 0x4142434445464748\nmov rcx, 0x4142434445464748\nmov r8, 0x4142434445464748\nmov r9, 0x4142434445464748\n\nlea rbx, [rel .data]\njmp .test\n.test:\n\n; add r8w, [rbx]\n; Real encoding: 0x66, 0x44, 0x03, 0x03\n; Swap operand-size override and REX. Converts r8 to rax, and stays a 16-bit operation.\ndb 0x44, 0x66, 0x03, 0x03\n\n; add r9, [rbx]\n; Real encoding: 0x4c, 0x03, 0x0b\n; Add extraneous segment-overide between REX prefix and op, changes r9 to rcx, and 64-bit to 32-bit.\ndb 0x4c, 0x2e, 0x03, 0x0b\nhlt\n\nalign 16\n.data:\ndq 0x0102030405060708\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/REX/Primary_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x424446484a4c4e50\",\n    \"RCX\": \"0x4142434445464748\",\n    \"R8\": \"0x4142434445464748\",\n    \"R9\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov rax, 0x4142434445464748\nmov rcx, 0x4142434445464748\nmov r8, 0x4142434445464748\nmov r9, 0x4142434445464748\n\nlea rbx, [rel .data]\njmp .test\n.test:\n\n; add rax, [rbx]\n; Real encoding: 0x44, 0x03, 0x03\n; Add additional false REX as padding that would convert `rax` to `r8`.\n; FEX treated REX prefixes as cumulative at one point.\ndb 0x44, 0x48, 0x03, 0x03\n\nhlt\n\nalign 16\n.data:\ndq 0x0102030405060708\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/REX/TwoByte.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x828486888a8c8e90\",\n    \"RBX\": \"0x000000008a8c8e90\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0000000045464748\",\n    \"R8\": \"1\",\n    \"R9\": \"1\"\n  }\n}\n%endif\n\nmov rax, 0x4142434445464748\nmov rbx, 0x4142434445464748\nmov rcx, 0x4142434445464748\nmov rdx, 0x4142434445464748\nmov r8, 1\nmov r9, 1\njmp .test\n.test:\n\n; xadd rax, rcx\n; Real encoding: 0x48, 0x0f, 0xc1, 0xc8\n; For cumulative decode errors, add a REX with all bits set. Will convert rax to r8, and rcx to r9.\ndb 0x4f, 0x48, 0x0f, 0xc1, 0xc8\n\n; xadd ebx, edx\n; Real encoding: 0x0f, 0xc1, 0xd3\n; Add a nop-prefix pad between the opcode and full REX.\ndb 0x4f, 0x2e, 0x0f, 0xc1, 0xd3\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/RegCacheMMX.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x5152535455565758\", \"0\"]\n  }\n}\n%endif\n\nfninit\n; Load all test values\nfld tword [rel .test_value]\nfld tword [rel .test_value]\nfld tword [rel .test_value]\nfld tword [rel .test_value]\nfld tword [rel .test_value]\nfld tword [rel .test_value]\nfld tword [rel .test_value]\nfld tword [rel .test_value]\n\n; Setup for MMX usage\nemms\n\n; Load XMM value\nmovups xmm0, [rel .test_xmm_value]\n\n; Load MMX value\nmovq mm0, [rel .test_mmx_value]\n\njmp .test\n.test:\n; Move MMX register in to XMM\n; Should set the upper 64-bits of xmm0 to zero\nmovq2dq xmm0, mm0\n\nhlt\nalign 32\n\n.test_value:\ndq 0x4142434445464748\ndw 0x7fff\n\n.test_mmx_value:\ndq 0x5152535455565758\n\n.test_xmm_value:\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/SBCSmall.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x8000abcd8000fffe\",\n    \"RBX\": \"0x0000abcc00000001\",\n    \"RCX\": \"0x0000000000000293\"\n  }\n}\n%endif\n\n; FEX had a bug setting carry with 8/16-bit SBB\nmov rax, 0x8000abcd80000000\nmov rbx, 0x0000abcc00000001\n\nmov rsp, 0xe000_1000\n\n; Start with carry set\nstc\n\njmp .test\n.test:\n\nsbb ax, bx\n\npushfq\npop rcx\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/SHRD_OF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000000008601\"\n  }\n}\n%endif\n\n; FEX had a bug where OF for SHRD wasn't getting calculated correctly.\n; OF with SHRD set if the sign bit has changed.\n; FEX /previously/ calculated it like regular SHR, where it contained the original MSB.\n\nmov edi, 0x35b292fc\nmov ebp, 0x37d434ad\nshrd edi, ebp, 1\n\nmov rax, 0\n\nlahf\n; Load OF\nseto al\n\n; Mask out AF, SHRD leaves it undefined\nand rax, 0xEFFF\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/SIBScaleTranspose.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x5152535455565758\",\n    \"RBX\": \"0x5152535455565758\",\n    \"RCX\": \"0x5152535455565758\",\n    \"RDX\": \"0x5152535455565758\",\n    \"RDI\": \"0x5152535455565758\",\n\n    \"XMM0\": [\"0x5152535455565758\", \"0x0\"],\n    \"XMM1\": [\"0x5152535455565758\", \"0x0\"],\n    \"XMM2\": [\"0x5152535455565758\", \"0x0\"],\n    \"XMM3\": [\"0x5152535455565758\", \"0x0\"],\n    \"XMM4\": [\"0x5152535455565758\", \"0x0\"],\n\n    \"MM0\": \"0x5152535455565758\",\n    \"MM1\": \"0x5152535455565758\",\n    \"MM2\": \"0x5152535455565758\",\n    \"MM3\": \"0x5152535455565758\",\n    \"MM4\": \"0x5152535455565758\"\n  },\n  \"MemoryRegions\": {\n    \"0x00000000a0000000\": \"4096\",\n    \"0x0000000110000000\": \"4096\"\n  },\n  \"MemoryData\": {\n    \"0x00000000a0000000\": \"0x4142434445464748\",\n    \"0x0000000110000000\": \"0x5152535455565758\"\n  }\n}\n%endif\n\n; FEX had a bug in its const-prop pass where x86 SIB scale would accidentally transpose the register that was scaling with the base.\n; This test explicitly tests SIB in a way that a transpose would load data from the wrong address.\n; Basic layout is [r14 + (r15 * 8)]\n\n; r14 will be the base\nmov r14, 0x1000_0000\n; r15 will be the index\nmov r15, 0x2000_0000\n\n; Correct transpose will be at 0x0000000110000000\n; Incorrect transpose will be at 0x00000000a0000000\n\n; Break the block\njmp .test\n.test:\n\n; Basic GPR SIB test\nmov rax, [r14 + (r15 * 8)]\n\n; Basic Vector SIB test\nmovq xmm0, [r14 + (r15 * 8)]\n\n; Basic MMX SIB test\nmovq mm0, [r14 + (r15 * 8)]\n\n; Break the block now\njmp .test2\n.test2:\n\n; FEX GPR/XMM LoadMem const prop might only happen with disjoint add + mul so check this\n; Need to be able to const-prop the multiply\nimul r13, r15, 8\n\n; Test base + offset transposed both ways, for all three types\nmov rbx, [r14 + r13]\nmov rcx, [r13 + r14]\n\nmovq xmm1, [r14 + r13]\nmovq xmm2, [r13 + r14]\n\nmovq mm1, [r14 + r13]\nmovq mm2, [r13 + r14]\n\n; Break the block now\njmp .test3\n.test3:\n\n; FEX GPR/XMM LoadMem const prop might only happen with disjoint add + lshl so check this\n; Need to be able to const-prop the lshl\nmov r13, r15\nshl r13, 3\n\n; Test base + offset transposed both ways, for all three types\nmov rdx, [r14 + r13]\nmov rdi, [r13 + r14]\n\nmovq xmm3, [r14 + r13]\nmovq xmm4, [r13 + r14]\n\nmovq mm3, [r14 + r13]\nmovq mm4, [r13 + r14]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/SegmentAddressOverride.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RSP\": \"0x6\",\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x2\",\n    \"RCX\": \"0x3\",\n    \"RDX\": \"0x4\",\n    \"R8\": \"0x5\",\n    \"RBP\": \"0x0\",\n    \"R9\": \"0x1\",\n    \"R10\": \"0x2\",\n    \"R11\": \"0x3\",\n    \"R12\": \"0x4\",\n    \"R13\": \"0x5\"\n  },\n  \"MemoryRegions\": {\n    \"0x500000000\": \"0x100000000\"\n  },\n  \"HostFeatures\": [\"FSGSBASE\"]\n}\n%endif\n\n; FEX had a bug that caused the truncation from the address-size flag to be applied after adding the segment base, even\n; though the flag is only supposed to apply to the offset itself.\nrdfsbase r14\nmov rdx, 0x500000008\nmov qword [rdx - 8], 0x0\nmov qword [rdx], 0x1\nmov qword [rdx + 8], 0x2\nmov qword [rdx + 0x10], 0x3\nmov qword [rdx + 0x18], 0x4\nmov qword [rdx + 0x20], 0x5\nwrfsbase rdx\nmov rdx, 0x5FFFFFFF8\nmov qword [rdx], 0x6\n\nmov r8, 0x500000010\nmov r9, 0x10\na32 mov rsp, qword [fs:-16]\na32 mov rax, qword [fs:0]\na32 mov rbx, qword [fs:8]\na32 mov rcx, qword [fs:r8d]\na32 mov rdx, qword [fs:r8d + 8]\na32 mov r8, qword [fs:r8d + r9d]\n\nmov r15, 0x10\nmov rbp, qword [fs:-8]\nmov r9, qword [fs:0]\nmov r10, qword [fs:8]\nmov r11, qword [fs:r15]\nmov r12, qword [fs:r15 + 8]\nmov r13, qword [fs:r15 + r15]\n\nwrfsbase r14\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/SelfPop.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"123\",\n    \"RBX\": \"456\",\n    \"RCX\": \"123\"\n  }\n}\n%endif\n\n; FEX had a bug merging pops to the same register\n\n; Push some stuff\nmov rsp, 0xe0000010\nmov rax, 123\nmov rbx, 456\npush rax\npush rbx\n\n; Pop into the same register\npop rcx\npop rcx\n\n; rcx now equals rax\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/ShiftConstantBug.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x500000020\"\n  }\n}\n%endif\n\n; FEX had a bug in its `TestNZ` opcode where it would try to load a constant in to the tst instruction\n; If the constant didn't fit in a logical encoding it would generate invalid instructions and also crash.\n; This snippet of code was found in libGLX.so.0.0.0 when trying to load steamwebhelper.\nmov     eax, 0x28000001\nshl     rax, 0x5\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/ShiftPF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x6\",\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; FEX had a bug where variable shifts modified PF but RCLSE ignored this,\n; causing RCLSE to invalidly propagate earlier PF results.\n\n; First set PF to odd\nmov rcx, 0\nadd rcx, 1\n\n; Now do a variable shift that will set PF to even\nmov rbx, 3\nmov cl, 1\nshl rbx, cl\n\n; Save the PF. This should be 1 = even\nsetp al\n\n; Trash NZCV. This means we'll optimize to calculate PF but not NZCV, which lets\n; more constant prop happen needed to materialize the bug. This instruction is\n; otherwise a no-op, but without it we pass by chance.\nadd rdx, rdx\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/ShiftZeroFlagsUpdate.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000082345679\",\n    \"R12\": \"0x0000000000000202\",\n    \"R13\": \"0x0000000000000202\",\n    \"R14\": \"0x0000000000000202\",\n    \"R15\": \"0x0000000000000202\"\n  }\n}\n%endif\n\n; FEX-Emu has a bug where a shift by zero was updating flags.\n; x86 shift by zero must not update flags.\nmov rsp, 0xe000_1000\nmov rax, 0x8234fdb482345679\nmov rcx, 0x51525354555657E0\nmov rbx, 0\nmov rdx, 0\npush rbx\npopfq\n\njmp .test\n.test:\n\n; Ensure that a 32-bit shift of zero doesn't update flags.\nshl eax, cl\npushfq\npop r15\n\n; Set up the next test.\nmov rdx, 0\npushfq\njmp .test2\n.test2:\n\nsar eax, cl\npushfq\npop r14\n\n; Set up the next test.\nmov rdx, 0\npushfq\njmp .test3\n.test3:\n\nshl eax, 0xE0\npushfq\npop r13\n\n\n; Set up the next test.\nmov rdx, 0\npushfq\njmp .test4\n.test4:\n\nsar eax, 0xE0\npushfq\npop r12\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/SmallShiftFlags.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R8\":  \"0x246\",\n    \"R9\":  \"0x246\",\n    \"R10\": \"0x246\",\n    \"R11\": \"0x246\",\n    \"R12\": \"0x246\",\n    \"R13\": \"0x246\",\n    \"R14\": \"0x246\",\n    \"R15\": \"0x246\"\n  }\n}\n%endif\n\n; FEX-Emu had a bug where 8-bit and 16-bit shifts with large offsets would calculate flags incorrectly.\nmov rsp, 0xe000_1000\nmov rax, 0x8234fdb482345679\n\n; Large shift that is larger than the element size but smaller than mask limit of 0x1F\nmov rcx, 0x5152535455565714\njmp .test\n.test:\n\n; Ensure that 16-bit shift updates flags correctly.\nshl ax, cl\npushfq\npop r15\n; Clear OF and AF since those are undefined\nand r15, ~((1 << 11) | (1 << 4))\n\n; Set up the next test.\nmov rax, 0x8234fdb482345679\njmp .test2\n.test2:\n\nsar ax, cl\npushfq\npop r14\n; Clear OF and AF since those are undefined\nand r14, ~((1 << 11) | (1 << 4))\n\n; Set up the next test.\nmov rax, 0x8234fdb482345679\njmp .test3\n.test3:\n\nshl ax, 0x14\npushfq\npop r13\n; Clear OF and AF since those are undefined\nand r13, ~((1 << 11) | (1 << 4))\n\n; Set up the next test.\nmov rax, 0x8234fdb482345679\njmp .test4\n.test4:\n\nsar ax, 0x14\npushfq\npop r12\n; Clear OF and AF since those are undefined\nand r12, ~((1 << 11) | (1 << 4))\n\n; Set up the next test.\nmov rax, 0x8234fdb482345679\njmp .test5\n.test5:\n\n; Ensure that 8-bit shift updates flags correctly.\nshl al, cl\npushfq\npop r11\n; Clear OF and AF since those are undefined\nand r11, ~((1 << 11) | (1 << 4))\n\n; Set up the next test.\nmov rax, 0x8234fdb482345679\njmp .test6\n.test6:\n\nsar al, cl\npushfq\npop r10\n; Clear OF and AF since those are undefined\nand r10, ~((1 << 11) | (1 << 4))\n\n; Set up the next test.\nmov rax, 0x8234fdb482345679\njmp .test7\n.test7:\nshl al, 0x14\npushfq\npop r9\n; Clear OF and AF since those are undefined\nand r9, ~((1 << 11) | (1 << 4))\n\n; Set up the next test.\nmov rax, 0x8234fdb482345679\njmp .test8\n.test8:\n\nsar al, 0x14\npushfq\npop r8\n; Clear OF and AF since those are undefined\nand r8, ~((1 << 11) | (1 << 4))\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/Test_CmpSelect_Merge.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000aaaaafaaa\"\n  }\n}\n%endif\n\n%macro intcompare 3\n  ; instruction, value1, value2\n  mov rcx, %2\n  mov rdx, %3\n  cmp rcx, rdx\n  %1 bl\n  shl rax, 1\n  or rax, rbx\n%endmacro\n\n; This test specifically tests the Select and compare merging that occurs in OpcodeDispatcher\n; The easiest way to test this is to do the comparison op and then SETcc with the flags that we want to ensure is working\n\n; RAX will be our result\nmov rax, 0\n; RBX will be our temp for setcc\nmov rbx, 0\n\n; Test integer ops\n; RCX and RDX for comparison values\nmov rcx, 0\nmov rdx, 0\n\n; Test EQ - true\nintcompare sete, 0, 0\n\n; Test EQ - false\nintcompare sete, 0, 1\n\n; Test NEQ - true\nintcompare setne, 0, 1\n\n; Test NEQ - false\nintcompare setne, 0, 0\n\n; Test SGE - true\nintcompare setge, 0, 0\n\n; Test SGE - false\nintcompare setge, 0, 1\n\n; Test SGE with sign difference - true\nintcompare setge, 1, -1\n\n; Test SGE with sign difference - false\nintcompare setge, -1, 1\n\n; Test SLT - true\nintcompare setl, 0, 1\n\n; Test SLT - false\nintcompare setl, 0, 0\n\n; Test SLT with sign difference - true\nintcompare setl, -1, 1\n\n; Test SLT with sign difference - false\nintcompare setl, 1, -1\n\n; Test SGT - true\nintcompare setg, 1, 0\n\n; Test SGT - false\nintcompare setg, 0, 0\n\n; Test SGT with sign difference - true\nintcompare setg, 1, -1\n\n; Test SGT with sign difference - false\nintcompare setg, -1, 1\n\n; Test SLE - true\nintcompare setle, 0, 0\n\n; Test SLE - false\nintcompare setle, 1, 0\n\n; Test SLE with sign difference - true\nintcompare setle, -1, 1\n\n; Test SLE with sign difference - false\nintcompare setle, 1, -1\n\n; Test UGE - true\nintcompare setae, 0, 0\n\n; Test UGE - false\nintcompare setae, 1, 0\n\n; Test UGE with *sign* difference - true\nintcompare setae, -1, 1\n\n; Test UGE with *sign* difference - false\nintcompare setb, 1, -1\n\n; Test ULT - true\nintcompare setb, 0, 1\n\n; Test ULT - false\nintcompare setb, 1, 0\n\n; Test ULT with *sign* difference - true\nintcompare setb, 1, -1\n\n; Test ULT with *sign* difference - false\nintcompare setb, -1, 1\n\n; Test UGT - true\nintcompare seta, 1, 0\n\n; Test UGT - false\nintcompare seta, 0, 1\n\n; Test UGT with *sign* difference - true\nintcompare seta, -1, 1\n\n; Test UGT with *sign* difference - false\nintcompare seta, 1, -1\n\n; Test ULE - true\nintcompare setbe, 0, 0\n\n; Test ULE - false\nintcompare setbe, 1, 0\n\n; Test ULE with *sign* difference - true\nintcompare setbe, 1, -1\n\n; Test ULE with *sign* difference - false\nintcompare setbe, -1, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/Test_CmpSelect_Merge_Float.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x000000000cbe0708\"\n  }\n}\n%endif\n\n%macro floatcompare 3\n  ; instruction, value1, value2\n  movsd xmm0, %2\n  movsd xmm1, %3\n  ucomisd xmm0, xmm1\n\n  %1 bl\n  shl rax, 1\n  or rax, rbx\n%endmacro\n\n; This test specifically tests the Select and compare merging that occurs in OpcodeDispatcher\n; The easiest way to test this is to do the comparison op and then SETcc with the flags that we want to ensure is working\n\n; RAX will be our result\nmov rax, 0\n; RBX will be our temp for setcc\nmov rbx, 0\n\n; Float comparisons\n; xmm0 and xmm1 will be our comparison values\n\n; FLU (CF == 1), SETNE\n; FLEU (CF == 1 || ZF == 1), SETBE\n; FU (PF == 1), SETP\n; FNU (PF == 0), SETNP\n; FGE (CF == 0), SETAE\n; FGT (CF == 0 && ZF == 0), SETA\n\n; Test FLU - true\nfloatcompare setne, [rel .float_0], [rel .float_1]\n\n; Test FLU - false\nfloatcompare setne, [rel .float_0], [rel .float_1]\n\n; Test FLU (unordered) - true\nfloatcompare setne, [rel .float_0], [rel .float_qnan]\n\n; Test FLU (unordered) - true\nfloatcompare setne, [rel .float_qnan], [rel .float_1]\n\n; Test FLEU - true\nfloatcompare setbe, [rel .float_0], [rel .float_0]\n\n; Test FLEU - false\nfloatcompare setbe, [rel .float_1], [rel .float_0]\n\n; Test FLEU (unordered) - true\nfloatcompare setbe, [rel .float_0], [rel .float_qnan]\n\n; Test FLEU (unordered) - true\nfloatcompare setbe, [rel .float_qnan], [rel .float_1]\n\n; Test FU - true\nfloatcompare setp, [rel .float_0], [rel .float_qnan]\n\n; Test FU - true\nfloatcompare setp, [rel .float_qnan], [rel .float_0]\n\n; Test FU - true\nfloatcompare setp, [rel .float_qnan], [rel .float_qnan]\n\n; Test FU - false\nfloatcompare setp, [rel .float_1], [rel .float_0]\n\n; Test FU - false\nfloatcompare setp, [rel .float_0], [rel .float_1]\n\n; Test FU - false\nfloatcompare setp, [rel .float_0], [rel .float_0]\n\n; Test FNU - false\nfloatcompare setnp, [rel .float_0], [rel .float_qnan]\n\n; Test FNU - false\nfloatcompare setnp, [rel .float_qnan], [rel .float_0]\n\n; Test FNU - false\nfloatcompare setnp, [rel .float_qnan], [rel .float_qnan]\n\n; Test FNU - true\nfloatcompare setnp, [rel .float_1], [rel .float_0]\n\n; Test FNU - true\nfloatcompare setnp, [rel .float_0], [rel .float_1]\n\n; Test FNU - true\nfloatcompare setnp, [rel .float_0], [rel .float_0]\n\n; Test FGE - true\nfloatcompare seta, [rel .float_0], [rel .float_0]\n\n; Test FGE - false\nfloatcompare seta, [rel .float_0], [rel .float_1]\n\n; Test FGE (unordered) - false\nfloatcompare seta, [rel .float_0], [rel .float_qnan]\n\n; Test FGE (unordered) - false\nfloatcompare seta, [rel .float_qnan], [rel .float_1]\n\n; Test FGT - true\nfloatcompare seta, [rel .float_1], [rel .float_0]\n\n; Test FGT - false\nfloatcompare seta, [rel .float_0], [rel .float_1]\n\n; Test FGT (unordered) - false\nfloatcompare seta, [rel .float_0], [rel .float_qnan]\n\n; Test FGT (unordered) - false\nfloatcompare seta, [rel .float_qnan], [rel .float_1]\n\nhlt\n\nalign 8\n.float_1:\ndq 1.0\n.float_0:\ndq 0.0\n.float_qnan:\ndq 0x7ff8000000000000\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/Test_CmpSelect_Merge_Float_branch.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x000000000cbe0708\"\n  }\n}\n%endif\n\n%macro floatcompare 3\n  ; instruction, value1, value2\n  movsd xmm0, %2\n  movsd xmm1, %3\n\n  shl rax, 1\n  ucomisd xmm0, xmm1\n\n  ; Conditional branch\n  %1 %%true\n\n  %%fallthrough:\n    ; False fallthrough path\n    mov rbx, 0\n    jmp %%combine\n\n  %%true:\n    ; True path\n    mov rbx, 1\n\n  %%combine:\n    ; Combine\n    or rax, rbx\n%endmacro\n\n; This test specifically tests the Select and compare merging that occurs in OpcodeDispatcher\n; The easiest way to test this is to do the comparison op and then SETcc with the flags that we want to ensure is working\n\n; RAX will be our result\nmov rax, 0\n; RBX will be our temp for setcc\nmov rbx, 0\n\n; Float comparisons\n; xmm0 and xmm1 will be our comparison values\n\n; FLU (CF == 1), SETNE\n; FLEU (CF == 1 || ZF == 1), SETBE\n; FU (PF == 1), SETP\n; FNU (PF == 0), SETNP\n; FGE (CF == 0), SETAE\n; FGT (CF == 0 && ZF == 0), SETA\n\n; Test FLU - true\nfloatcompare jne, [rel .float_0], [rel .float_1]\n\n; Test FLU - false\nfloatcompare jne, [rel .float_0], [rel .float_1]\n\n; Test FLU (unordered) - true\nfloatcompare jne, [rel .float_0], [rel .float_qnan]\n\n; Test FLU (unordered) - true\nfloatcompare jne, [rel .float_qnan], [rel .float_1]\n\n; Test FLEU - true\nfloatcompare jbe, [rel .float_0], [rel .float_0]\n\n; Test FLEU - false\nfloatcompare jbe, [rel .float_1], [rel .float_0]\n\n; Test FLEU (unordered) - true\nfloatcompare jbe, [rel .float_0], [rel .float_qnan]\n\n; Test FLEU (unordered) - true\nfloatcompare jbe, [rel .float_qnan], [rel .float_1]\n\n; Test FU - true\nfloatcompare jp, [rel .float_0], [rel .float_qnan]\n\n; Test FU - true\nfloatcompare jp, [rel .float_qnan], [rel .float_0]\n\n; Test FU - true\nfloatcompare jp, [rel .float_qnan], [rel .float_qnan]\n\n; Test FU - false\nfloatcompare jp, [rel .float_1], [rel .float_0]\n\n; Test FU - false\nfloatcompare jp, [rel .float_0], [rel .float_1]\n\n; Test FU - false\nfloatcompare jp, [rel .float_0], [rel .float_0]\n\n; Test FNU - false\nfloatcompare jnp, [rel .float_0], [rel .float_qnan]\n\n; Test FNU - false\nfloatcompare jnp, [rel .float_qnan], [rel .float_0]\n\n; Test FNU - false\nfloatcompare jnp, [rel .float_qnan], [rel .float_qnan]\n\n; Test FNU - true\nfloatcompare jnp, [rel .float_1], [rel .float_0]\n\n; Test FNU - true\nfloatcompare jnp, [rel .float_0], [rel .float_1]\n\n; Test FNU - true\nfloatcompare jnp, [rel .float_0], [rel .float_0]\n\n; Test FGE - true\nfloatcompare ja, [rel .float_0], [rel .float_0]\n\n; Test FGE - false\nfloatcompare ja, [rel .float_0], [rel .float_1]\n\n; Test FGE (unordered) - false\nfloatcompare ja, [rel .float_0], [rel .float_qnan]\n\n; Test FGE (unordered) - false\nfloatcompare ja, [rel .float_qnan], [rel .float_1]\n\n; Test FGT - true\nfloatcompare ja, [rel .float_1], [rel .float_0]\n\n; Test FGT - false\nfloatcompare ja, [rel .float_0], [rel .float_1]\n\n; Test FGT (unordered) - false\nfloatcompare ja, [rel .float_0], [rel .float_qnan]\n\n; Test FGT (unordered) - false\nfloatcompare ja, [rel .float_qnan], [rel .float_1]\n\nhlt\n\nalign 8\n.float_1:\ndq 1.0\n.float_0:\ndq 0.0\n.float_qnan:\ndq 0x7ff8000000000000\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/Test_CmpSelect_Merge_branch.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000aaaaafaaa\"\n  }\n}\n%endif\n\n%macro intcompare 3\n  ; instruction, value1, value2\n  mov rcx, %2\n  mov rdx, %3\n  shl rax, 1\n  cmp rcx, rdx\n\n  ; Conditional branch\n  %1 %%true\n\n  %%fallthrough:\n    ; False fallthrough path\n    mov rbx, 0\n    jmp %%combine\n\n  %%true:\n    ; True path\n    mov rbx, 1\n\n  %%combine:\n    ; Combine\n    or rax, rbx\n%endmacro\n\n; This test specifically tests the Select and compare merging that occurs in OpcodeDispatcher\n; The easiest way to test this is to do the comparison op and then SETcc with the flags that we want to ensure is working\n\n; RAX will be our result\nmov rax, 0\n; RBX will be our temp for setcc\nmov rbx, 0\n\n; Test integer ops\n; RCX and RDX for comparison values\nmov rcx, 0\nmov rdx, 0\n\n; Test EQ - true\nintcompare je, 0, 0\n\n; Test EQ - false\nintcompare je, 0, 1\n\n; Test NEQ - true\nintcompare jne, 0, 1\n\n; Test NEQ - false\nintcompare jne, 0, 0\n\n; Test SGE - true\nintcompare jge, 0, 0\n\n; Test SGE - false\nintcompare jge, 0, 1\n\n; Test SGE with sign difference - true\nintcompare jge, 1, -1\n\n; Test SGE with sign difference - false\nintcompare jge, -1, 1\n\n; Test SLT - true\nintcompare jl, 0, 1\n\n; Test SLT - false\nintcompare jl, 0, 0\n\n; Test SLT with sign difference - true\nintcompare jl, -1, 1\n\n; Test SLT with sign difference - false\nintcompare jl, 1, -1\n\n; Test SGT - true\nintcompare jg, 1, 0\n\n; Test SGT - false\nintcompare jg, 0, 0\n\n; Test SGT with sign difference - true\nintcompare jg, 1, -1\n\n; Test SGT with sign difference - false\nintcompare jg, -1, 1\n\n; Test SLE - true\nintcompare jle, 0, 0\n\n; Test SLE - false\nintcompare jle, 1, 0\n\n; Test SLE with sign difference - true\nintcompare jle, -1, 1\n\n; Test SLE with sign difference - false\nintcompare jle, 1, -1\n\n; Test UGE - true\nintcompare jae, 0, 0\n\n; Test UGE - false\nintcompare jae, 1, 0\n\n; Test UGE with *sign* difference - true\nintcompare jae, -1, 1\n\n; Test UGE with *sign* difference - false\nintcompare jb, 1, -1\n\n; Test ULT - true\nintcompare jb, 0, 1\n\n; Test ULT - false\nintcompare jb, 1, 0\n\n; Test ULT with *sign* difference - true\nintcompare jb, 1, -1\n\n; Test ULT with *sign* difference - false\nintcompare jb, -1, 1\n\n; Test UGT - true\nintcompare ja, 1, 0\n\n; Test UGT - false\nintcompare ja, 0, 1\n\n; Test UGT with *sign* difference - true\nintcompare ja, -1, 1\n\n; Test UGT with *sign* difference - false\nintcompare ja, 1, -1\n\n; Test ULE - true\nintcompare jbe, 0, 0\n\n; Test ULE - false\nintcompare jbe, 1, 0\n\n; Test ULE with *sign* difference - true\nintcompare jbe, 1, -1\n\n; Test ULE with *sign* difference - false\nintcompare jbe, -1, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/Test_JP.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000cafecafe\"\n  }\n}\n%endif\n\n; This test checks for proper behaviour of the parity flag. Older FEX versions\n; would accidentally turn JP into a zero/nonzero check of the result.\n\n; rax = 0x20, odd parity\nmov rax, 0x10\nmov rbx, 0x10\nadd rax, rbx\njpe fexi_fexi_im_so_broken\n\n; rax = 0x32, odd parity\nmov rax, 0x10\nmov rbx, 0x22\nxor rax, rbx\njpe fexi_fexi_im_so_broken\n\n; rax = 0x41, even parity\nmov rax, 0x40\nmov rbx, 0x01\nor rax, rbx\njpo fexi_fexi_im_so_broken\n\n; rax = 0x43, even parity\nmov rax, 0x43\nmov rbx, 0xfe\nand rax, rbx\njpo fexi_fexi_im_so_broken\n\n; success code\nmov rax, 0xcafecafe\nhlt\n\n; failure, rax != 0xcafecafe\nfexi_fexi_im_so_broken:\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/Test_PF_Zero_Shift.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000cafecafe\"\n  }\n}\n%endif\n\n; This test checks that PF is not modified with zero shifts\n\n; First, some smoke tests: nonzero shifts should set PF as expected\n; 0b111_1111_1000 has odd parity\nmov eax, 0xff\nmov cl, 0x3\nshl eax, cl\njpe fexi_fexi_im_so_broken\n\n; 0b11_1111_1100 has even parity\nmov eax, 0xff\nmov cl, 0x2\nshl eax, cl\njpo fexi_fexi_im_so_broken\n\n; At this point, parity is even\n; So now test that PF is preserved across zero shifts, regardless of output parity.\n\nmov cl, 0\nmov eax, 0x0f\nshl eax, cl\njpo fexi_fexi_im_so_broken\n\nmov eax, 0x0e\nshl eax, cl\njpo fexi_fexi_im_so_broken\n\nmov eax, 0x1f\nshr eax, cl\njpo fexi_fexi_im_so_broken\n\nmov eax, 0x1e\nshr eax, cl\njpo fexi_fexi_im_so_broken\n\nmov eax, 0x2f\nsal eax, cl\njpo fexi_fexi_im_so_broken\n\nmov eax, 0x2e\nsal eax, cl\njpo fexi_fexi_im_so_broken\n\nmov eax, 0x3f\nsar eax, cl\njpo fexi_fexi_im_so_broken\n\nmov eax, 0x3e\nsar eax, cl\njpo fexi_fexi_im_so_broken\n\n; success code\nmov rax, 0xcafecafe\nhlt\n\n; failure, rax != 0xcafecafe\nfexi_fexi_im_so_broken:\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/TrickyRA.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n  }\n}\n%endif\n\n; This test is reduced from a game that hit a register allocation bug. The test\n; has a high register pressure across a `rep movsb` (_Memcpy), and since _Memcpy\n; is modelled as writing a GPRPair, this induces live range splitting at the\n; time of writing. FEX had a bug where live range splitting was unsound in\n; certain circumstances.\n\nmov rsp, 0xe000_1000\nlea rbp, [rel .data_mid]\nlea rdi, [rel .data_dst]\nlea rsi, [rel .data_src]\nmov rcx, 11\n\n; Store where it is expected\nmov [rbp-0x9e8], rcx\nmov rcx, rdi\n\njmp .test\n.test:\nmov     rax, qword [rbp-0x9f0]\nmov     rdx, qword [rbp-0x9e8]\nmov     rdi, rcx\nmov     rcx, rdx\npopfq\nrep movsb ; Uses RDI and RSI\npushfq\nmov     qword [rbp-0x9f0], rax\nmov     qword [rbp-0x9e8], rdx\n\nhlt\n\nalign 4096\n.data:\ntimes 4096 db 0\n.data_mid:\ntimes 4096 db 0\n\n.data_dst:\ntimes 16 db 0\n\n.data_src:\ntimes 16 db 0\n\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/UnalignedLoadStoreSIGBUS.asm",
    "content": "%ifdef CONFIG\n{\n  \"Env\": {\n    \"FEX_TSOENABLED\": \"1\",\n    \"FEX_TSOAUTOMIGATRION\": \"0\"\n  }\n}\n%endif\n\n; FEX-Emu had a bug where SIGBUS handling of unaligned loadstores using FEAT_LRCPC would accidentally try using the FEAT_LSE atomic memory operation\n; handlers. It wouldn't find the handler for FEAT_LRCPC instructions (because it was only supposed to handle FEAT_LSE instructions) and fault out.\n; This happens because FEAT_LRCPC and FEAT_LSE instructions partially share an instruction encoding and FEX forgot to check for FEAT_LRCPC first\n; before using the FEAT_LSE handler.\nmov r15, 0xe000_0000\n\n; Atomic unaligned load across 16-byte and 64-byte granule\nmov rax, qword [r15 + 15]\nmov rbx, qword [r15 + 63]\n\n; Atomic unaligned store across 16-byte and 64-byte granule\nmov qword [r15 + 15], rbx\nmov qword [r15 + 63], rcx\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/VectorLoadCrash.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM5\":  [\"0x0000000000000048\", \"0x0000000000000047\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\n\n; FEX-Emu had a bug where a vector load that was using SIB addressing would overflow to larger than what ARM could encode.\n; Test that here.\n; Original bug came from the Darwinia Linux binary from function `HUF_readDTableX1_wksp`\n\nmov rbx, 0\nlea r15, [rel .data - 0x3d4]\n\n; Break the block\njmp .test\n.test:\n\npmovzxbq xmm5, word [rbx+r15+0x3d4]\n\nhlt\n\n.data:\ndq 0x4142434445464748, 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/VectorShift_zero.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x4054c664c2f837b5\",\n    \"MM1\": \"0x40516053e2d6238e\",\n    \"MM2\": \"0x4044836d86ec17ec\",\n    \"MM3\": \"0x402a1e1c58255b03\",\n    \"MM4\": \"0x401568e0c9d9d346\",\n    \"MM5\": \"0x4035fe425aee6320\",\n    \"MM6\": \"0x402359003eea209b\",\n    \"MM7\": \"0x40154b7d41743e96\",\n    \"XMM0\":  [\"0x4054c664c2f837b5\", \"0x40516053e2d6238e\"],\n    \"XMM1\":  [\"0x4044836d86ec17ec\", \"0x402a1e1c58255b03\"],\n    \"XMM2\":  [\"0x401568e0c9d9d346\", \"0x4035fe425aee6320\"],\n    \"XMM3\":  [\"0x402359003eea209b\", \"0x40154b7d41743e96\"],\n    \"XMM4\":  [\"0x403d075a31a4bdba\", \"0x4050a018bd66277c\"],\n    \"XMM5\":  [\"0x40334ec17ebaf102\", \"0x4056d7404ea4a8c1\"],\n    \"XMM6\":  [\"0x404439b5c7cd898b\", \"0x40497b136a400fbb\"],\n    \"XMM7\":  [\"0x4040528bc169c23b\", \"0x4037f9ca18bd6627\"],\n    \"XMM8\":  [\"0x4056a929888f861a\", \"0x403839b866e43aa8\"],\n    \"XMM9\":  [\"0x4058bc1f212d7732\", \"0x4056cde5c91d14e4\"]\n  }\n}\n%endif\n\n; FEX had a bug where immediate encoded shifts by zero would generate bad code on AArch64.\n\nlea rdx, [rel .data]\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\nmovq mm2, [rdx + 8 * 2]\nmovq mm3, [rdx + 8 * 3]\nmovq mm4, [rdx + 8 * 4]\nmovq mm5, [rdx + 8 * 5]\nmovq mm6, [rdx + 8 * 6]\nmovq mm7, [rdx + 8 * 7]\n\nmovapd xmm0, [rdx + 16 * 0]\nmovapd xmm1, [rdx + 16 * 1]\nmovapd xmm2, [rdx + 16 * 2]\nmovapd xmm3, [rdx + 16 * 3]\nmovapd xmm4, [rdx + 16 * 4]\nmovapd xmm5, [rdx + 16 * 5]\nmovapd xmm6, [rdx + 16 * 6]\nmovapd xmm7, [rdx + 16 * 7]\nmovapd xmm8, [rdx + 16 * 8]\nmovapd xmm9, [rdx + 16 * 9]\n\n; Test MMX first\npsllw mm0, 0\npslld mm1, 0\npsllq mm2, 0\npsraw mm3, 0\npsrad mm4, 0\npsrlw mm5, 0\npsrld mm6, 0\npsrlq mm7, 0\n\n; Now test XMM\npsllw xmm0, 0\npslld xmm1, 0\npsllq xmm2, 0\npslldq xmm3, 0\npsraw xmm4, 0\npsrad xmm5, 0\npsrlw xmm6, 0\npsrld xmm7, 0\npsrlq xmm8, 0\npslldq xmm9, 0\n\nhlt\nalign 16\n; 512bytes of random data\n.data:\ndq 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/VectorShift_zero_256.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x4047dcfb00bcbe62\", \"0x40382c8de2ac3223\", \"0x4040da5269595fee\", \"0x40582da24894c448\"],\n    \"XMM1\":  [\"0x404c46843808850a\", \"0x4051ce8f32378ab1\", \"0x404eec764adff823\", \"0x40562f8c7e28240b\"],\n    \"XMM2\":  [\"0x404a7427525460aa\", \"0x4013860029f16b12\", \"0x405221d82fd75e20\", \"0x4008292a30553261\"],\n    \"XMM3\":  [\"0x402ed06f69446738\", \"0x404cc57c6fbd273d\", \"0x402338eb463497b7\", \"0x404bc581adea8976\"],\n    \"XMM4\":  [\"0x40536d2fec56d5d0\", \"0x403436e2435696e6\", \"0x40239c779a6b50b1\", \"0x4044a59e30014f8b\"],\n    \"XMM5\":  [\"0x40560c58793dd97f\", \"0x404295b6c3760bf6\", \"0x4048c3549f94855e\", \"0x40248b61bb05faec\"],\n    \"XMM6\":  [\"0x405811ea0ba1f4b2\", \"0x401a9443d46b26c0\", \"0x403996f73c0c1fc9\", \"0x4057c071b4784231\"],\n    \"XMM7\":  [\"0x4047ec6b7aa25d8d\", \"0x4055031782d38477\", \"0x405681e5c91d14e4\", \"0x4050740cf1800a7c\"],\n    \"XMM10\": [\"0x40560c58793dd97f\", \"0x404295b6c3760bf6\", \"0x4048c3549f94855e\", \"0x40248b61bb05faec\"],\n    \"XMM11\": [\"0x40536d2fec56d5d0\", \"0x403436e2435696e6\", \"0x40239c779a6b50b1\", \"0x4044a59e30014f8b\"],\n    \"XMM12\": [\"0x402ed06f69446738\", \"0x404cc57c6fbd273d\", \"0x402338eb463497b7\", \"0x404bc581adea8976\"],\n    \"XMM13\": [\"0x404a7427525460aa\", \"0x4013860029f16b12\", \"0x405221d82fd75e20\", \"0x4008292a30553261\"],\n    \"XMM14\": [\"0x404c46843808850a\", \"0x4051ce8f32378ab1\", \"0x404eec764adff823\", \"0x40562f8c7e28240b\"],\n    \"XMM15\": [\"0x4047dcfb00bcbe62\", \"0x40382c8de2ac3223\", \"0x4040da5269595fee\", \"0x40582da24894c448\"]\n  }\n}\n%endif\n\n; FEX had a bug where immediate encoded shifts by zero would generate bad code on AArch64.\n\nlea rdx, [rel .data]\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\nvmovapd ymm5, [rdx + 32 * 5]\nvmovapd ymm6, [rdx + 32 * 6]\nvmovapd ymm7, [rdx + 32 * 7]\nvmovapd ymm8, [rdx + 32 * 8]\nvmovapd ymm9, [rdx + 32 * 9]\nvmovapd ymm10, [rdx + 32 * 10]\nvmovapd ymm11, [rdx + 32 * 11]\nvmovapd ymm12, [rdx + 32 * 12]\nvmovapd ymm13, [rdx + 32 * 13]\nvmovapd ymm14, [rdx + 32 * 14]\nvmovapd ymm15, [rdx + 32 * 15]\n\nvpsllw ymm0, ymm15, 0\nvpslld ymm1, ymm14, 0\nvpsllq ymm2, ymm13, 0\nvpslldq ymm3, ymm12, 0\nvpsraw ymm4, ymm11, 0\nvpsrad ymm5, ymm10, 0\nvpsrlw ymm6, ymm9, 0\nvpsrld ymm7, ymm8, 0\nvpsrlq ymm8, ymm7, 0\nvpslldq ymm9, ymm6, 0\n\nhlt\nalign 16\n; 512bytes of random data\n.data:\ndq 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/VectorShift_zero_avx_128.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x4047dcfb00bcbe62\", \"0x40382c8de2ac3223\", \"0\", \"0\"],\n    \"XMM1\":  [\"0x404c46843808850a\", \"0x4051ce8f32378ab1\", \"0\", \"0\"],\n    \"XMM2\":  [\"0x404a7427525460aa\", \"0x4013860029f16b12\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x402ed06f69446738\", \"0x404cc57c6fbd273d\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x40536d2fec56d5d0\", \"0x403436e2435696e6\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x40560c58793dd97f\", \"0x404295b6c3760bf6\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x405811ea0ba1f4b2\", \"0x401a9443d46b26c0\", \"0\", \"0\"],\n    \"XMM7\":  [\"0x4047ec6b7aa25d8d\", \"0x4055031782d38477\", \"0\", \"0\"],\n    \"XMM10\": [\"0x40560c58793dd97f\", \"0x404295b6c3760bf6\", \"0x4048c3549f94855e\", \"0x40248b61bb05faec\"],\n    \"XMM11\": [\"0x40536d2fec56d5d0\", \"0x403436e2435696e6\", \"0x40239c779a6b50b1\", \"0x4044a59e30014f8b\"],\n    \"XMM12\": [\"0x402ed06f69446738\", \"0x404cc57c6fbd273d\", \"0x402338eb463497b7\", \"0x404bc581adea8976\"],\n    \"XMM13\": [\"0x404a7427525460aa\", \"0x4013860029f16b12\", \"0x405221d82fd75e20\", \"0x4008292a30553261\"],\n    \"XMM14\": [\"0x404c46843808850a\", \"0x4051ce8f32378ab1\", \"0x404eec764adff823\", \"0x40562f8c7e28240b\"],\n    \"XMM15\": [\"0x4047dcfb00bcbe62\", \"0x40382c8de2ac3223\", \"0x4040da5269595fee\", \"0x40582da24894c448\"]\n  }\n}\n%endif\n\n; FEX had a bug where immediate encoded shifts by zero would generate bad code on AArch64.\n\nlea rdx, [rel .data]\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\nvmovapd ymm5, [rdx + 32 * 5]\nvmovapd ymm6, [rdx + 32 * 6]\nvmovapd ymm7, [rdx + 32 * 7]\nvmovapd ymm8, [rdx + 32 * 8]\nvmovapd ymm9, [rdx + 32 * 9]\nvmovapd ymm10, [rdx + 32 * 10]\nvmovapd ymm11, [rdx + 32 * 11]\nvmovapd ymm12, [rdx + 32 * 12]\nvmovapd ymm13, [rdx + 32 * 13]\nvmovapd ymm14, [rdx + 32 * 14]\nvmovapd ymm15, [rdx + 32 * 15]\n\nvpsllw xmm0, xmm15, 0\nvpslld xmm1, xmm14, 0\nvpsllq xmm2, xmm13, 0\nvpslldq xmm3, xmm12, 0\nvpsraw xmm4, xmm11, 0\nvpsrad xmm5, xmm10, 0\nvpsrlw xmm6, xmm9, 0\nvpsrld xmm7, xmm8, 0\nvpsrlq xmm8, xmm7, 0\nvpslldq xmm9, xmm6, 0\n\nhlt\nalign 16\n; 512bytes of random data\n.data:\ndq 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/X87MMXNZCV.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {},\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n; FEX had a bug where a mmx->x87 switch would flush the saved NZCV value used for ftst, causing a crash in RA\n\nmovq mm0, mm1 ; enters mmx state\nftst ; enters x87 state\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/XeSS_quadratic.asm",
    "content": "%ifdef CONFIG\n{\n  \"MemoryRegions\": {\n    \"0x200000000\": \"0x20000\"\n  }\n}\n%endif\n\n; FEX has had various bugs throughout the years leading to accidental\n; superlinear time, for example with constant pooling and register allocation.\n; This test mimics the massive block found in XeSS. If this test has\n; excessive runtime, something in broken in FEXCore.\n\nmov rsp, 0x200000000\n%assign i 0\n%rep 0x10000\nmov byte [rsp + (0x10000 + i)], (0x01 + (i << 2)) & 0xFF\n%assign i i+1\n%endrep\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/adcx_size.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x000000007ee544ac\",\n    \"RBX\": \"0x0fb22768a2cf00bb\",\n    \"RCX\": \"0x00000000e19be77f\",\n    \"RDX\": \"0x06726399b9f09d2f\",\n    \"RSI\": \"0xe544b42838dd404d\",\n    \"RDI\": \"0x6d78590ca1418bd1\",\n    \"RSP\": \"0x20bfe50ddcfce881\",\n    \"RBP\": \"0x56c870e2dcbf6522\"\n  },\n  \"HostFeatures\": [\"ADX\"]\n}\n%endif\n\nmov rax, 0x6B11A609DC1643F1\nmov rbx, 0x0FB22768A2CF00BB\nmov rcx, 0x48E1BB8327AB4A4F\nmov rdx, 0x06726399B9F09D2F\nmov rsi, 0x77CC5B1B979BB47C\nmov rdi, 0x6D78590CA1418BD1\nmov rsp, 0xC9F7742B003D835E\nmov rbp, 0x56C870E2DCBF6522\n\n; 32-bit clc\nclc\nadcx eax, ebx\n\n; 32-bit stc\nstc\nadcx ecx, edx\n\n; 64-bit clc\nclc\nadcx rsi, rdi\n\n; 64-bit stc\nstc\nadcx rsp, rbp\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/add_sub_carry.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xaeadacac9a9a41e5\",\n    \"RBX\": \"0x6162636520238df8\"\n  }\n}\n%endif\n\n; FEX had a bug with smaller than 32-bit operations corrupting sbb and adc results.\n; A small test that tests both sbb and adc to ensure it returns data correctly.\n; This was noticed in Final Fantasy 7 (steamid 39140) having broken rendering on the title screen.\nmov rax, 0x4142434445464748\nmov rbx, 0x5152535455565758\nmov rcx, 0x6162636465666768\n\nclc\nsbb al, bl\nsbb ax, bx\nsbb eax, ebx\nsbb rax, rbx\n\nclc\nadc bl, cl\nadc bx, cx\nadc ebx, ecx\nadc rbx, rcx\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/add_sub_carry_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xedededee26260e6c\",\n    \"RBX\": \"0x121212129498c16d\"\n  }\n}\n%endif\n\n; FEX had a bug with smaller than 32-bit operations corrupting sbb and adc results.\n; A small test that tests both sbb and adc to ensure it returns data correctly.\n; This was noticed in Final Fantasy 7 (steamid 39140) having broken rendering on the title screen.\nmov rax, 0x4142434445464748\nmov rbx, 0x5152535455565758\nmov rcx, 0x6162636465666768\n\nclc\nsbb al, bl\nsbb ax, bx\nsbb eax, ebx\nsbb rax, rbx\n\n%assign i 0\n%rep 256\nsbb al, [rel .data1 + i]\n%assign i i+1\n%endrep\n\n%assign i 0\n%rep 256\nsbb ax, [rel .data2 + i]\n%assign i i+1\n%endrep\n\n%assign i 0\n%rep 256\nsbb eax, [rel .data4 + i]\n%assign i i+1\n%endrep\n\n\n%assign i 0\n%rep 256\nsbb rax, [rel .data8 + i]\n%assign i i+1\n%endrep\n\nstc\n%assign i 0\n%rep 256\nsbb al, [rel .data1 + i]\n%assign i i+1\n%endrep\n\n%assign i 0\n%rep 256\nsbb ax, [rel .data2 + i]\n%assign i i+1\n%endrep\n\n%assign i 0\n%rep 256\nsbb eax, [rel .data4 + i]\n%assign i i+1\n%endrep\n\n\n%assign i 0\n%rep 256\nsbb rax, [rel .data8 + i]\n%assign i i+1\n%endrep\n\n\n\n\nclc\nadc bl, cl\nadc bx, cx\nadc ebx, ecx\nadc rbx, rcx\n\n\n%assign i 0\n%rep 256\nadc bl, [rel .data1 + i]\n%assign i i+1\n%endrep\n\n%assign i 0\n%rep 256\nadc bx, [rel .data2 + i]\n%assign i i+1\n%endrep\n\n%assign i 0\n%rep 256\nadc ebx, [rel .data4 + i]\n%assign i i+1\n%endrep\n\n\n%assign i 0\n%rep 256\nadc rbx, [rel .data8 + i]\n%assign i i+1\n%endrep\n\n\nstc\n%assign i 0\n%rep 256\nadc bl, [rel .data1 + i]\n%assign i i+1\n%endrep\n\n%assign i 0\n%rep 256\nadc bx, [rel .data2 + i]\n%assign i i+1\n%endrep\n\n%assign i 0\n%rep 256\nadc ebx, [rel .data4 + i]\n%assign i i+1\n%endrep\n\n\n%assign i 0\n%rep 256\nadc rbx, [rel .data8 + i]\n%assign i i+1\n%endrep\n\n\n\n\nhlt\n\n.data1:\n%assign i 0\n%rep 256\ndb i\n%assign i i+1\n%endrep\n\n.data2:\n%assign i 0\n%rep 256\ndw i\n%assign i i+1\n%endrep\n\n.data4:\n%assign i 0\n%rep 256\ndd i\n%assign i i+1\n%endrep\n\n.data8:\n%assign i 0\n%rep 256\ndq i\n%assign i i+1\n%endrep\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/cmpxchg.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344fbca7654\",\n    \"RBX\": \"0x00000000fbca7654\",\n    \"RCX\": \"0x61626364fbca7654\"\n  }\n}\n%endif\n\n; FEX-Emu had a but where it was failing to follow zero-extend semantics on\n; the destination register when cmpxchg was a success as a 32-bit operation.\n; A simple test that does a 32-bit compare exchange with success as 32-bit.\nmov rax, [rel .data + (8 * 0)]\nmov rbx, [rel .data + (8 * 0)]\nmov rcx, [rel .data + (8 * 1)]\n\ncmpxchg ebx, ecx\nhlt\n\n.data:\ndq 0x41424344_fbca7654\ndq 0x61626364_fbca7654\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/fnsave_fnrstor_size.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x4142434445464748\",\n    \"RCX\": \"0x5152535455565758\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  }\n}\n%endif\n\n; FEX-Emu implements an optimization for fnsave and frstor of overlapping 16-byte read and writes for the x87 registers.\n; This test ensures that these instructions don't exceed the storage limits imposed by the instruction details.\n; Ensuring that changes like from https://github.com/FEX-Emu/FEX/pull/4107 would get picked up by unit tests.\n\n; Calculate address to the end of the memory region.\nmov rax, 0x1_0000_0000 + 4096\n\n; Save at the end of the page to ensure it doesn't fault.\nfnsave [rax - 108]\n\n; Do an frstor at the end of the page to ensure it doesn't fault.\nfrstor [rax - 108]\n\n; Save at the end of the page to ensure it doesn't fault.\no16 fnsave [rax - 94]\n\n; Do an frstor at the end of the page to ensure it doesn't fault.\no16 frstor [rax - 94]\n\n; Store data at the end.\nmov rbx, 0x4142434445464748\nmov [rax - 8], rbx\n\n; Save just before the end of the data we stored.\n; Ensures we don't accidentally overwrite data.\nfnsave [rax - 116]\n\n; Load back the register to ensure it still contains the correct data\nmov rbx, [rax - 8]\n\n; Store data at the end.\nmov rcx, 0x5152535455565758\nmov [rax - 8], rcx\n\n; Save just before the end of the data we stored.\n; Ensures we don't accidentally overwrite data.\no16 fnsave [rax - 102]\n\n; Load back the register to ensure it still contains the correct data\nmov rcx, [rax - 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/fxrstor_bug.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x782366128a6789f2\", \"0xf881\"],\n    \"XMM1\": [\"0xa56724426b4c72f1\", \"0xd415\"],\n    \"XMM2\": [\"0xb76472a37404b890\", \"0x10ad\"],\n    \"XMM3\": [\"0xb9533de8ad0967d2\", \"0xb615\"],\n    \"XMM4\": [\"0x30ae762c30b556de\", \"0x9af3\"],\n    \"XMM5\": [\"0xe86b2b5774313a97\", \"0x1f6d\"],\n    \"XMM6\": [\"0x48510f254d2fa47f\", \"0x4886\"],\n    \"XMM7\": [\"0\", \"0\"]\n  }\n}\n%endif\n\n; FEX had a bug where fxrstor wasn't restoring x87 registers in the correct order.\n; This test also relies on fxsave saving in the correct order.\n\n; Init x87\nfninit\n\n; Load registers with zero\ntimes 8 fldz\n\n; Empty them\ntimes 8 ffreep\n\n; Load seven of them with random data\nfld tword [rel .random_data + (0 * 10)]\nfld tword [rel .random_data + (1 * 10)]\nfld tword [rel .random_data + (2 * 10)]\nfld tword [rel .random_data + (3 * 10)]\nfld tword [rel .random_data + (4 * 10)]\nfld tword [rel .random_data + (5 * 10)]\nfld tword [rel .random_data + (6 * 10)]\n\n; Save the data\nfxsave [rel .save_data]\n\n; Load the x87 register data in to vectors for testing.\nmovups xmm0, [rel .save_data + 0x20 + (0 * 16)]\nmovups xmm1, [rel .save_data + 0x20 + (1 * 16)]\nmovups xmm2, [rel .save_data + 0x20 + (2 * 16)]\nmovups xmm3, [rel .save_data + 0x20 + (3 * 16)]\nmovups xmm4, [rel .save_data + 0x20 + (4 * 16)]\nmovups xmm5, [rel .save_data + 0x20 + (5 * 16)]\nmovups xmm6, [rel .save_data + 0x20 + (6 * 16)]\nmovups xmm7, [rel .save_data + 0x20 + (7 * 16)]\npand xmm0, [rel .x87_mask]\npand xmm1, [rel .x87_mask]\npand xmm2, [rel .x87_mask]\npand xmm3, [rel .x87_mask]\npand xmm4, [rel .x87_mask]\npand xmm5, [rel .x87_mask]\npand xmm6, [rel .x87_mask]\npand xmm7, [rel .x87_mask]\n\nhlt\n\nalign 4096\n.save_data:\ntimes 64 dq 0\n\n.x87_mask:\ndq 0xffff_ffff_ffff_ffff, 0xffff\n\nalign 16\n; 256bytes of random data\n.random_data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/fxsave_bug.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x782366128a6789f2\", \"0xf881\"],\n    \"XMM1\": [\"0xa56724426b4c72f1\", \"0xd415\"],\n    \"XMM2\": [\"0xb76472a37404b890\", \"0x10ad\"],\n    \"XMM3\": [\"0xb9533de8ad0967d2\", \"0xb615\"],\n    \"XMM4\": [\"0x30ae762c30b556de\", \"0x9af3\"],\n    \"XMM5\": [\"0xe86b2b5774313a97\", \"0x1f6d\"],\n    \"XMM6\": [\"0x48510f254d2fa47f\", \"0x4886\"],\n    \"XMM7\": [\"0\", \"0\"]\n  }\n}\n%endif\n\n; FEX had a bug where fxsave wasn't storing x87 registers in the correct order.\n\n; Init x87\nfninit\n\n; Load registers with zero\ntimes 8 fldz\n\n; Empty them\ntimes 8 ffreep\n\n; Load seven of them with random data\nfld tword [rel .random_data + (0 * 10)]\nfld tword [rel .random_data + (1 * 10)]\nfld tword [rel .random_data + (2 * 10)]\nfld tword [rel .random_data + (3 * 10)]\nfld tword [rel .random_data + (4 * 10)]\nfld tword [rel .random_data + (5 * 10)]\nfld tword [rel .random_data + (6 * 10)]\n\n; Save the data\nfxsave [rel .save_data]\n\n; Load the x87 register data in to vectors for testing.\nmovups xmm0, [rel .save_data + 0x20 + (0 * 16)]\nmovups xmm1, [rel .save_data + 0x20 + (1 * 16)]\nmovups xmm2, [rel .save_data + 0x20 + (2 * 16)]\nmovups xmm3, [rel .save_data + 0x20 + (3 * 16)]\nmovups xmm4, [rel .save_data + 0x20 + (4 * 16)]\nmovups xmm5, [rel .save_data + 0x20 + (5 * 16)]\nmovups xmm6, [rel .save_data + 0x20 + (6 * 16)]\nmovups xmm7, [rel .save_data + 0x20 + (7 * 16)]\npand xmm0, [rel .x87_mask]\npand xmm1, [rel .x87_mask]\npand xmm2, [rel .x87_mask]\npand xmm3, [rel .x87_mask]\npand xmm4, [rel .x87_mask]\npand xmm5, [rel .x87_mask]\npand xmm6, [rel .x87_mask]\npand xmm7, [rel .x87_mask]\n\nhlt\n\nalign 4096\n.save_data:\ntimes 64 dq 0\n\n.x87_mask:\ndq 0xffff_ffff_ffff_ffff, 0xffff\n\nalign 16\n; 256bytes of random data\n.random_data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/issue5084_crossblock_const.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0\"\n  }\n}\n%endif\n\n; Regression test for issue 5084\n; This test was mostly reverse engineered from the IR in 5084.\n; Failed with '-n 500 -m' with the error message:\n; %51: Arg[0] references invalid %24\n\nmov rax, 0\nmov rbx, 0xe0000000\nmov rcx, 1\n\ntest rcx, rcx\njnz .late_target\n\n.fallthrough:\nfld1\nfstp tword [rbx + 0x1234]\nmov rax, 0\nhlt\n\n.late_target:\nfld1\nfstp tword [rbx + 0x1234]\nmov rax, 0\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/mmx_x87_register_conflating.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4b497b9e152430ec\", \"0x019f45087baf8cb8\"],\n    \"XMM1\": [\"0x089f12645cb5e036\", \"0x5a6af6f5102c523c\"],\n    \"XMM2\": [\"0x4c619a6f28bed383\", \"0x6892c52557512e58\"],\n    \"XMM3\": [\"0x8ee99e09628ebdc3\", \"0xa7688af8254ea454\"],\n    \"XMM4\": [\"0x805080d92966f25a\", \"0x31f967965d3a07cb\"],\n    \"XMM5\": [\"0x2828cb0ce87848be\", \"0xc3291045169390b4\"],\n    \"XMM6\": [\"0x755ae99230a898c3\", \"0x3d209d2dd4bad59f\"],\n    \"XMM7\": [\"0x3a670269bb42b2f8\", \"0x05173dbeda9e86ab\"],\n    \"XMM8\": [\"0x275bf419e2f3b099\", \"0x276d21a284ab2912\"]\n  },\n  \"HostFeatures\": [\"XSAVE\"]\n}\n%endif\n\n; FEX-Emu had a bug where we were conflating x87 registers as mmx registers and vice-versa depending on caching behaviour.\n; This unittest semi-aggressively mixes x87 and mmx with xsave/xrstor that would have failed with FEX's caching.\n\nfninit ; Initialize x87\n\n; Load all x87 registers\nfld tword [rel .random_data + (0 * 10)]\nfld tword [rel .random_data + (1 * 10)]\nfld tword [rel .random_data + (2 * 10)]\nfld tword [rel .random_data + (3 * 10)]\nfld tword [rel .random_data + (4 * 10)]\nfld tword [rel .random_data + (5 * 10)]\nfld tword [rel .random_data + (6 * 10)]\nfld tword [rel .random_data + (7 * 10)]\n\n; Save the data based on bits in EDX:EAX\n; Just save everything\nmov edx, -1\nmov eax, -1\nxsave64 [rel .xsave_data]\n\n; Load all MMX registers (Data just past what x87 loaded.\nmovq mm0, [rel .random_data + (8 * 10) + (0 * 8)]\nmovq mm1, [rel .random_data + (8 * 10) + (1 * 8)]\nmovq mm2, [rel .random_data + (8 * 10) + (2 * 8)]\nmovq mm3, [rel .random_data + (8 * 10) + (3 * 8)]\nmovq mm4, [rel .random_data + (8 * 10) + (4 * 8)]\nmovq mm5, [rel .random_data + (8 * 10) + (5 * 8)]\nmovq mm6, [rel .random_data + (8 * 10) + (6 * 8)]\nmovq mm7, [rel .random_data + (8 * 10) + (7 * 8)]\n\n; Do some operation on the MMX registers\npxor mm0, mm1\npxor mm1, mm2\npxor mm2, mm3\npxor mm3, mm4\npxor mm4, mm5\npxor mm5, mm6\npxor mm6, mm7\npxor mm7, mm0\n\n; Store MMX registers\nmovq [rel .temp_result + (0 * 8)], mm0\nmovq [rel .temp_result + (1 * 8)], mm1\nmovq [rel .temp_result + (2 * 8)], mm2\nmovq [rel .temp_result + (3 * 8)], mm3\nmovq [rel .temp_result + (4 * 8)], mm4\nmovq [rel .temp_result + (5 * 8)], mm5\nmovq [rel .temp_result + (6 * 8)], mm6\nmovq [rel .temp_result + (7 * 8)], mm7\n\n; Clear MMX state\nemms\n\n; Load all x87 registers with new data\n; This ensures the top 16-bits of every x87 word is different.\nfld tword [rel .random_data + (8 * 10)]\nfld tword [rel .random_data + (9 * 10)]\nfld tword [rel .random_data + (10 * 10)]\nfld tword [rel .random_data + (11 * 10)]\nfld tword [rel .random_data + (12 * 10)]\nfld tword [rel .random_data + (13 * 10)]\nfld tword [rel .random_data + (14 * 10)]\nfld tword [rel .random_data + (15 * 10)]\n\n; Reload context, including original x87 state\nmov edx, -1\nmov eax, -1\nxrstor64 [rel .xsave_data]\n\n; Save the x87 registers.\nfstp tword [rel .temp_x87_result + (0 * 10)]\nfstp tword [rel .temp_x87_result + (1 * 10)]\nfstp tword [rel .temp_x87_result + (2 * 10)]\nfstp tword [rel .temp_x87_result + (3 * 10)]\nfstp tword [rel .temp_x87_result + (4 * 10)]\nfstp tword [rel .temp_x87_result + (5 * 10)]\nfstp tword [rel .temp_x87_result + (6 * 10)]\nfstp tword [rel .temp_x87_result + (7 * 10)]\n\n; Load the results in to XMM registers\n; First load the MMX registers\nmovups xmm0, [rel .temp_result + (0 * 16)]\nmovups xmm1, [rel .temp_result + (1 * 16)]\nmovups xmm2, [rel .temp_result + (2 * 16)]\nmovups xmm3, [rel .temp_result + (3 * 16)]\n\n; Now load the 80 bytes of x87 registers\nmovups xmm4, [rel .temp_x87_result + (0 * 16)]\nmovups xmm5, [rel .temp_x87_result + (1 * 16)]\nmovups xmm6, [rel .temp_x87_result + (2 * 16)]\nmovups xmm7, [rel .temp_x87_result + (3 * 16)]\nmovups xmm8, [rel .temp_x87_result + (4 * 16)]\n\nhlt\n\nalign 4096\n\n.temp_x87_result:\ntimes (16 * 8) db 0\n\n.temp_result:\ntimes (8 * 8) db 0\n\n; 4096 bytes of random data.\n.random_data:\ndb 0x5b, 0x27, 0x12, 0x29, 0xab, 0x84, 0xa2, 0x21, 0x6d, 0x27, 0xbe, 0x3d, 0x17, 0x05, 0x99, 0xb0\ndb 0xf3, 0xe2, 0x19, 0xf4, 0x42, 0xbb, 0x69, 0x02, 0x67, 0x3a, 0xab, 0x86, 0x9e, 0xda, 0x9f, 0xd5\ndb 0xba, 0xd4, 0x2d, 0x9d, 0x20, 0x3d, 0xf8, 0xb2, 0x29, 0xc3, 0xc3, 0x98, 0xa8, 0x30, 0x92, 0xe9\ndb 0x5a, 0x75, 0x0c, 0xcb, 0x28, 0x28, 0xb4, 0x90, 0x93, 0x16, 0x45, 0x10, 0x3a, 0x5d, 0x96, 0x67\ndb 0xf9, 0x31, 0xbe, 0x48, 0x78, 0xe8, 0x5a, 0xf2, 0x66, 0x29, 0xd9, 0x80, 0x50, 0x80, 0xcb, 0x07\ndb 0xfe, 0xda, 0x19, 0x0f, 0x22, 0xea, 0x18, 0x5e, 0x12, 0xea, 0x3d, 0x1a, 0xbc, 0x91, 0x51, 0x15\ndb 0xaa, 0x66, 0x92, 0x61, 0xb4, 0xd4, 0xce, 0x14, 0x9c, 0x86, 0x27, 0x3d, 0xd0, 0xc6, 0x51, 0x1c\ndb 0xa0, 0xd4, 0x0b, 0x2d, 0x25, 0x30, 0x3b, 0x46, 0x23, 0x07, 0xb5, 0x05, 0x4a, 0xaa, 0x5a, 0x0a\ndb 0x7b, 0x29, 0xe4, 0x52, 0x6f, 0x6f, 0xc8, 0x62, 0xb8, 0x94, 0x6a, 0x30, 0x66, 0xf1, 0x21, 0xec\ndb 0xd1, 0xf2, 0x68, 0xda, 0xb7, 0x7f, 0x5a, 0x26, 0x38, 0x46, 0x48, 0xda, 0x5d, 0x64, 0x8d, 0x3d\ndb 0x2f, 0xf6, 0xc3, 0x63, 0xb8, 0x09, 0x3a, 0xd0, 0x5b, 0xeb, 0x67, 0xd0, 0xaa, 0x63, 0x71, 0x19\ndb 0x7e, 0x4e, 0x33, 0xe2, 0x15, 0xba, 0x87, 0xa7, 0x7b, 0x25, 0xe4, 0xbb, 0xb5, 0x26, 0x9a, 0xf1\ndb 0xdd, 0x5a, 0x63, 0xd7, 0x16, 0xc0, 0xc3, 0xc8, 0x1b, 0xad, 0x00, 0x52, 0x63, 0x55, 0xc7, 0xe0\ndb 0xd9, 0xe9, 0xf4, 0x4c, 0x53, 0xfb, 0x73, 0x57, 0xdc, 0xad, 0x0c, 0xca, 0x73, 0x44, 0x6b, 0xf3\ndb 0xb7, 0x83, 0x3b, 0xfe, 0xf0, 0x15, 0xbf, 0xe5, 0x15, 0xca, 0xdf, 0x35, 0xeb, 0xe7, 0xe3, 0xa2\ndb 0xbd, 0x20, 0xad, 0xff, 0x1b, 0x67, 0x0a, 0x9f, 0x60, 0x60, 0xff, 0xa7, 0xc9, 0x19, 0xde, 0xb3\ndb 0x67, 0xf1, 0x4b, 0x77, 0x7f, 0x0b, 0xb1, 0x29, 0xee, 0xcb, 0xd6, 0x5d, 0x0d, 0xb9, 0x54, 0x49\ndb 0x10, 0xe3, 0xbd, 0x8a, 0xa0, 0x69, 0xa3, 0x07, 0xbe, 0x8e, 0xea, 0xc6, 0x75, 0x27, 0x66, 0xae\ndb 0x3c, 0xde, 0xc6, 0x13, 0x1b, 0x50, 0x37, 0x56, 0x7c, 0x01, 0xab, 0x8b, 0x46, 0xdc, 0x80, 0xed\ndb 0xdf, 0x12, 0x6f, 0x64, 0xdf, 0xe6, 0xf9, 0xbf, 0x15, 0x95, 0xd9, 0x80, 0x19, 0x8c, 0x96, 0x33\ndb 0x89, 0xbe, 0x25, 0x33, 0x34, 0x82, 0x92, 0x96, 0x05, 0x52, 0xa2, 0xcf, 0x5b, 0x3d, 0xfc, 0xd8\ndb 0x43, 0x89, 0x2e, 0x16, 0x6d, 0xbd, 0x84, 0x97, 0x77, 0xb5, 0xd6, 0x2b, 0x6b, 0xb1, 0xc6, 0x38\ndb 0x0a, 0xfe, 0xe1, 0xc9, 0x31, 0x32, 0x7f, 0xd5, 0xc1, 0x03, 0x4a, 0xb2, 0x86, 0x4d, 0x8d, 0x77\ndb 0xd6, 0x62, 0x52, 0x75, 0xed, 0x27, 0x21, 0xe8, 0x69, 0x6f, 0x6a, 0x5b, 0x59, 0x4d, 0xd2, 0x6c\ndb 0x2a, 0x97, 0x09, 0x03, 0xc5, 0x29, 0x0d, 0xe1, 0x31, 0x2e, 0x62, 0x21, 0x0e, 0xc2, 0x00, 0x7c\ndb 0xa2, 0x4c, 0x19, 0x63, 0x24, 0xfc, 0x9b, 0x38, 0x11, 0xbf, 0x20, 0x53, 0x53, 0xac, 0x3f, 0xdb\ndb 0xfd, 0x2b, 0x39, 0x3c, 0x39, 0x6b, 0xb4, 0x52, 0x1f, 0xf8, 0x8f, 0x3b, 0x47, 0x2b, 0x86, 0xcf\ndb 0xd2, 0x38, 0xe9, 0x08, 0x73, 0x09, 0x32, 0x5f, 0x6c, 0x3a, 0xdb, 0xfc, 0x1d, 0x91, 0xa4, 0x26\ndb 0xa3, 0x0c, 0xbc, 0x94, 0xf5, 0xbd, 0x29, 0xcf, 0x72, 0x3d, 0xee, 0x48, 0x06, 0x77, 0x63, 0x70\ndb 0x47, 0xc9, 0x87, 0x21, 0xb1, 0x9a, 0xdd, 0x5f, 0x71, 0x08, 0xe3, 0x3b, 0xf6, 0x07, 0x9f, 0x2f\ndb 0x20, 0xa3, 0x02, 0xc8, 0x4d, 0xc8, 0x18, 0xfa, 0x69, 0x32, 0x60, 0x97, 0x2d, 0x2f, 0x26, 0x84\ndb 0x3d, 0x7a, 0xf6, 0x2f, 0xb1, 0xc9, 0xd2, 0xcd, 0x6e, 0x24, 0x18, 0xa8, 0x0d, 0xb0, 0xe2, 0x41\ndb 0x1e, 0xdf, 0xc7, 0xee, 0xcd, 0x21, 0x5b, 0xc3, 0x26, 0x26, 0xb3, 0xb4, 0x33, 0x58, 0x79, 0xb5\ndb 0xc3, 0x24, 0x7c, 0xe3, 0xd7, 0x78, 0x33, 0x22, 0xd5, 0x20, 0x21, 0x86, 0xcf, 0xca, 0x44, 0xba\ndb 0xd8, 0x05, 0x84, 0x37, 0x69, 0x48, 0xb0, 0xe0, 0x7a, 0xe6, 0x74, 0x53, 0x1e, 0xd0, 0x0c, 0x3c\ndb 0x33, 0x83, 0x15, 0x43, 0x16, 0x0e, 0x93, 0x39, 0x55, 0x2e, 0x55, 0x1c, 0x09, 0xbd, 0x7a, 0xc3\ndb 0x80, 0x77, 0x4e, 0xd9, 0xf3, 0xa5, 0xee, 0x94, 0xbf, 0x8e, 0xd0, 0xec, 0x39, 0x33, 0x31, 0x8d\ndb 0x74, 0x94, 0xd2, 0x24, 0x22, 0x4a, 0xde, 0x51, 0x99, 0xc5, 0x68, 0xf2, 0x2e, 0xd3, 0x8d, 0xc5\ndb 0x32, 0x31, 0x26, 0xe7, 0x87, 0x47, 0x5f, 0xbc, 0x32, 0x80, 0x43, 0x83, 0x34, 0x36, 0xa1, 0x72\ndb 0x6b, 0x38, 0x10, 0x93, 0xa7, 0xa3, 0x92, 0xb7, 0x3c, 0x61, 0x1c, 0x4e, 0x0b, 0x86, 0x43, 0xa9\ndb 0x64, 0xf1, 0xf8, 0xd7, 0xd3, 0xf4, 0xd0, 0xe2, 0x17, 0xd4, 0xbb, 0xe9, 0x2c, 0xc8, 0x76, 0xc5\ndb 0x87, 0x7f, 0x81, 0x55, 0xbe, 0x87, 0x0e, 0x6b, 0xf6, 0x4f, 0x44, 0x37, 0x92, 0x32, 0x7f, 0x30\ndb 0xa6, 0x66, 0x09, 0x01, 0x7a, 0x6e, 0xb3, 0x3b, 0x7d, 0x8f, 0x32, 0x0e, 0x3c, 0xdc, 0xba, 0x2e\ndb 0xf8, 0xec, 0xde, 0xd9, 0xb1, 0xf0, 0x3e, 0xbd, 0x20, 0x4d, 0x01, 0x5a, 0xf4, 0xda, 0x99, 0x23\ndb 0x81, 0x01, 0x5f, 0x50, 0xce, 0xa8, 0xb9, 0xb1, 0x59, 0xe5, 0xde, 0x47, 0x5b, 0xba, 0x94, 0xd3\ndb 0x21, 0x7c, 0x49, 0xeb, 0xb5, 0x14, 0xe5, 0x56, 0x93, 0x06, 0x3b, 0xd2, 0x3a, 0x11, 0xca, 0x7a\ndb 0x14, 0x48, 0x54, 0xc7, 0x9f, 0x03, 0x40, 0x2c, 0x0b, 0x42, 0x8e, 0xac, 0xac, 0x08, 0x04, 0x8e\ndb 0xb3, 0x15, 0xe5, 0x06, 0xa6, 0x5b, 0xf0, 0x57, 0x08, 0xfa, 0x0f, 0x00, 0x7e, 0x4a, 0x16, 0xa8\ndb 0xb0, 0x4d, 0x07, 0x1b, 0xbc, 0x3d, 0xd0, 0x86, 0x15, 0xcd, 0x7c, 0xb2, 0xcc, 0x37, 0x6d, 0x15\ndb 0x8b, 0xd1, 0xe6, 0x3e, 0xfb, 0x6e, 0xe4, 0xea, 0xd9, 0x1f, 0x69, 0x2a, 0xbc, 0xda, 0xd9, 0x78\ndb 0xee, 0xcb, 0xb6, 0xff, 0x53, 0xfd, 0xd2, 0xb9, 0x18, 0x1f, 0xdf, 0x0e, 0x69, 0xfe, 0x36, 0xb0\ndb 0x77, 0x28, 0x66, 0xe2, 0xf0, 0x80, 0x4c, 0x11, 0x11, 0xba, 0xb7, 0xfd, 0x67, 0x4f, 0x05, 0xed\ndb 0x0c, 0xcc, 0x3e, 0x4d, 0xd9, 0xbc, 0x52, 0xe3, 0xec, 0xd9, 0x74, 0x29, 0x30, 0xf2, 0x66, 0xd6\ndb 0xfb, 0xc3, 0x5c, 0xc1, 0xd8, 0xef, 0x86, 0x08, 0x22, 0xb1, 0x6d, 0xfd, 0xee, 0xc7, 0x12, 0x25\ndb 0xda, 0xee, 0xd6, 0x28, 0x3b, 0x1d, 0xa7, 0x29, 0xdf, 0x45, 0x3a, 0xa4, 0x36, 0xe0, 0xa4, 0xda\ndb 0xb1, 0x2c, 0x8a, 0xa5, 0x5c, 0x8c, 0x70, 0xd8, 0xcd, 0x0f, 0xb5, 0x63, 0xd3, 0xaf, 0x59, 0x2b\ndb 0x7d, 0x86, 0x4a, 0xc4, 0xcc, 0x72, 0x9e, 0x89, 0xf4, 0x38, 0x89, 0x81, 0x64, 0x6f, 0xa5, 0xac\ndb 0x13, 0x59, 0xc4, 0x0f, 0xfb, 0xcc, 0x4c, 0x1d, 0x67, 0x5a, 0xbf, 0x19, 0xfc, 0x06, 0x71, 0xbd\ndb 0x7f, 0xb6, 0xb1, 0x95, 0xd3, 0x7b, 0x4c, 0x40, 0x91, 0xa9, 0x26, 0xdd, 0x28, 0x69, 0x90, 0xf6\ndb 0x5d, 0x16, 0x9f, 0xa9, 0x75, 0x5e, 0xad, 0x8f, 0xc8, 0x0b, 0x57, 0x48, 0xf2, 0x74, 0x77, 0x22\ndb 0x5d, 0xed, 0xc2, 0x79, 0x27, 0x46, 0x0c, 0x9e, 0x6f, 0x9a, 0x9a, 0xdc, 0xe0, 0x3d, 0x24, 0xc9\ndb 0xce, 0xf3, 0x34, 0x66, 0x45, 0x07, 0x0b, 0x83, 0x8c, 0xb7, 0xd9, 0x1e, 0xac, 0xc6, 0xf7, 0xef\ndb 0xe7, 0xd1, 0xbc, 0xa3, 0x21, 0x85, 0x3d, 0x25, 0x90, 0x24, 0x48, 0xb1, 0x00, 0xb0, 0xd2, 0xa6\ndb 0xd8, 0x4e, 0x46, 0x7c, 0xc4, 0x79, 0x40, 0x95, 0x81, 0xb4, 0xb9, 0xa8, 0x70, 0xf0, 0x12, 0xd6\ndb 0xdc, 0xb2, 0x7c, 0x0f, 0x47, 0xad, 0x7d, 0x46, 0x78, 0x18, 0x6e, 0xdd, 0x5f, 0xe5, 0xd7, 0x63\ndb 0x11, 0xf0, 0x5b, 0xa0, 0x48, 0x15, 0xe2, 0x55, 0xc6, 0x7f, 0xf4, 0x2e, 0x0e, 0x49, 0x39, 0x65\ndb 0x3e, 0x69, 0xc1, 0x27, 0x39, 0xb3, 0x10, 0x1b, 0xf2, 0x35, 0x88, 0x0c, 0x1b, 0xac, 0x4a, 0x15\ndb 0x31, 0x81, 0x63, 0xe5, 0x3d, 0x56, 0x6f, 0x34, 0x06, 0x5b, 0x1d, 0xa0, 0xea, 0x0c, 0x92, 0x6a\ndb 0x22, 0x2b, 0x2d, 0xbb, 0xaf, 0xc5, 0x6d, 0x44, 0x1b, 0xb0, 0x69, 0x06, 0x27, 0x54, 0xa5, 0x7f\ndb 0x07, 0xd4, 0xdc, 0xe5, 0x5c, 0x78, 0x9e, 0xf7, 0x4a, 0x47, 0x9b, 0x21, 0xf6, 0x87, 0x89, 0xad\ndb 0xec, 0xe4, 0xd6, 0x83, 0xd3, 0x7b, 0x34, 0x00, 0x0b, 0x75, 0xba, 0x4c, 0x0f, 0x46, 0xd2, 0x0c\ndb 0x58, 0x1b, 0x0f, 0x19, 0xb5, 0xf5, 0xba, 0x8f, 0xbd, 0x17, 0x51, 0xaf, 0xa6, 0x1a, 0x97, 0x8c\ndb 0x44, 0x30, 0x7c, 0x73, 0x50, 0xca, 0x05, 0xe8, 0x3e, 0x19, 0x4a, 0x5a, 0x6b, 0x4d, 0x01, 0x05\ndb 0xea, 0x1b, 0x70, 0xb6, 0xe6, 0x39, 0x5d, 0x99, 0x3b, 0xae, 0xed, 0x7c, 0xa6, 0xc7, 0x29, 0x6f\ndb 0xeb, 0x0a, 0xba, 0x03, 0xd3, 0xba, 0x62, 0x21, 0xa0, 0xb7, 0xb5, 0xbf, 0x40, 0xb8, 0x4e, 0xc3\ndb 0x89, 0xa0, 0xa9, 0xe8, 0xc8, 0x2b, 0xfd, 0x23, 0x32, 0x53, 0xe5, 0x35, 0xc1, 0x23, 0x97, 0xc1\ndb 0x87, 0x10, 0x41, 0x21, 0xb3, 0xf6, 0x53, 0xcf, 0x28, 0x47, 0x9c, 0x69, 0x42, 0xcf, 0x0e, 0x11\ndb 0x69, 0x7f, 0xc6, 0xdf, 0xc3, 0xbf, 0x04, 0x7f, 0x3a, 0xc6, 0xa1, 0x3d, 0xc6, 0x5b, 0x56, 0x8b\ndb 0x52, 0x23, 0x41, 0xd7, 0x35, 0x7f, 0x86, 0xd2, 0x59, 0xcf, 0xae, 0x28, 0xa3, 0xa2, 0x23, 0x4b\ndb 0x78, 0x78, 0x94, 0x3f, 0x2f, 0xf0, 0xb8, 0x94, 0xa2, 0x62, 0xb9, 0x83, 0xc7, 0x5f, 0x64, 0x45\ndb 0x54, 0xaf, 0x43, 0x93, 0x7f, 0xa1, 0xe8, 0x71, 0x38, 0xc8, 0x21, 0xf4, 0xa6, 0xab, 0x2b, 0xd3\ndb 0x44, 0xa2, 0x74, 0x94, 0x99, 0x3f, 0x56, 0xbc, 0x0a, 0x12, 0xe7, 0x6e, 0x1b, 0x7f, 0x98, 0xad\ndb 0x28, 0xa6, 0xc8, 0x87, 0x7a, 0x88, 0xcb, 0xcf, 0x9f, 0x95, 0xa7, 0xf1, 0x66, 0xfe, 0x43, 0x3d\ndb 0x71, 0x5b, 0x3a, 0xb7, 0xe4, 0xa8, 0x6f, 0x46, 0xa1, 0xaa, 0x66, 0xd2, 0x9e, 0x84, 0xfd, 0x42\ndb 0x98, 0x17, 0x3e, 0xde, 0xaa, 0x18, 0xc9, 0x9c, 0x53, 0x88, 0x2b, 0x92, 0xce, 0x00, 0x8b, 0xb4\ndb 0x15, 0x7a, 0x39, 0xb7, 0x57, 0xf9, 0xf2, 0x17, 0x0a, 0x8c, 0x05, 0x7b, 0x3f, 0x2a, 0xb0, 0xb7\ndb 0x8a, 0xbb, 0x9a, 0x0d, 0xe4, 0x0d, 0x6a, 0xbd, 0x8a, 0xe9, 0xbd, 0xca, 0xb2, 0x6a, 0xbe, 0x76\ndb 0x2c, 0xbe, 0x45, 0x3f, 0x22, 0x03, 0xb1, 0xab, 0x2d, 0xe0, 0x70, 0x52, 0xe5, 0x27, 0x8e, 0xbc\ndb 0xa9, 0x8d, 0x13, 0xf4, 0xe5, 0xd7, 0xeb, 0x4e, 0x30, 0x3f, 0x76, 0x3b, 0x64, 0xad, 0x57, 0x53\ndb 0x91, 0x89, 0xf4, 0x9a, 0xd1, 0x38, 0x3d, 0x58, 0xdc, 0x83, 0x65, 0x4a, 0x36, 0x30, 0x73, 0x92\ndb 0x8c, 0x2f, 0x7d, 0x1e, 0x15, 0x3c, 0xca, 0x54, 0x6f, 0x17, 0xbd, 0xba, 0x97, 0x7e, 0x28, 0x11\ndb 0x8e, 0x96, 0x9f, 0x46, 0x84, 0x69, 0xe3, 0xc2, 0x8e, 0x1e, 0xea, 0x6b, 0x17, 0xa7, 0xf8, 0x17\ndb 0xc3, 0xd9, 0x9c, 0x53, 0x79, 0x95, 0x32, 0xf6, 0x78, 0xcd, 0x5d, 0x2f, 0x30, 0x06, 0xe8, 0x9f\ndb 0x5e, 0xb2, 0x4e, 0x56, 0xf5, 0x31, 0xc3, 0x41, 0xae, 0x4b, 0x0a, 0xbd, 0xdc, 0xce, 0xea, 0xfa\ndb 0x27, 0x09, 0x4e, 0xd1, 0x24, 0x14, 0x33, 0x8b, 0x21, 0x48, 0x99, 0x92, 0x07, 0xa4, 0x1a, 0x87\ndb 0x34, 0x15, 0xa6, 0x12, 0x92, 0x3f, 0xf0, 0x3e, 0x18, 0x3c, 0x65, 0x3a, 0x8b, 0x17, 0x9b, 0xf2\ndb 0xd9, 0x93, 0xa0, 0x19, 0x2b, 0x73, 0x59, 0x29, 0x6f, 0xb7, 0x75, 0x4b, 0x42, 0x24, 0x43, 0xa4\ndb 0x20, 0xd8, 0x59, 0x8d, 0x9f, 0xd6, 0x64, 0xa1, 0xeb, 0xe3, 0x65, 0x82, 0x69, 0x74, 0x1a, 0x2b\ndb 0x8d, 0x9a, 0x59, 0x5d, 0x47, 0x75, 0x63, 0xcd, 0xe4, 0x14, 0x48, 0x5f, 0x67, 0x00, 0x12, 0x3c\ndb 0x58, 0x27, 0x5e, 0x83, 0xde, 0xd8, 0x97, 0xd9, 0x09, 0xd9, 0x06, 0x64, 0x96, 0x67, 0xb4, 0x4f\ndb 0xb9, 0x58, 0x87, 0xc9, 0xb1, 0xdd, 0x64, 0x8f, 0x4e, 0x8f, 0xa9, 0xfa, 0x40, 0xe6, 0x8f, 0xaa\ndb 0x22, 0x26, 0x16, 0x15, 0x6a, 0xa3, 0x88, 0xae, 0xa2, 0xbc, 0xa3, 0xa3, 0x56, 0xa1, 0x74, 0x6c\ndb 0xa2, 0xd0, 0x47, 0x4b, 0x98, 0x0a, 0xea, 0xdd, 0xe8, 0x9c, 0xe1, 0x37, 0x44, 0x1a, 0xc0, 0xc7\ndb 0x83, 0x07, 0x42, 0xca, 0x98, 0x36, 0xd7, 0x43, 0x18, 0x51, 0x32, 0xf6, 0x99, 0x61, 0x73, 0x79\ndb 0x51, 0xc4, 0xe9, 0x5b, 0x9e, 0xa8, 0xb4, 0x28, 0x49, 0xbb, 0x44, 0x90, 0xe2, 0xf7, 0x7e, 0x61\ndb 0x27, 0xbb, 0x85, 0x58, 0xd0, 0xdc, 0x94, 0x53, 0x02, 0x50, 0xfe, 0xc7, 0x37, 0xa2, 0x20, 0x1b\ndb 0x57, 0x00, 0x9b, 0x7c, 0xa4, 0x6c, 0xa6, 0xb1, 0xae, 0xd0, 0x03, 0x67, 0x2b, 0x82, 0xd9, 0x99\ndb 0x76, 0xd0, 0xc7, 0x7d, 0x2d, 0xbd, 0x39, 0x28, 0xcf, 0xe1, 0x13, 0xce, 0x1c, 0xe6, 0x4c, 0xa7\ndb 0x7a, 0x8c, 0x4f, 0xa6, 0x30, 0x77, 0x6b, 0x78, 0x39, 0x6e, 0x10, 0xd1, 0x9c, 0x9a, 0xda, 0x2d\ndb 0xc9, 0xef, 0xd7, 0xb1, 0xb8, 0xdf, 0x21, 0xce, 0x96, 0x53, 0xaa, 0xa6, 0x76, 0x52, 0x56, 0x0e\ndb 0xe6, 0x7f, 0xed, 0x88, 0x15, 0x2a, 0xc1, 0xfe, 0xb3, 0x35, 0x54, 0x09, 0x9b, 0x5d, 0x21, 0x62\ndb 0xc8, 0x6f, 0x2c, 0x6e, 0x56, 0xc8, 0xd9, 0x40, 0x67, 0xeb, 0x26, 0xf5, 0xcb, 0x18, 0xb1, 0x89\ndb 0xfe, 0x58, 0x1a, 0xff, 0x41, 0xb5, 0xd6, 0xe5, 0xb3, 0x82, 0x29, 0x82, 0xee, 0xbb, 0xb2, 0x5a\ndb 0x71, 0xf2, 0xca, 0xf1, 0x2f, 0xa7, 0x4d, 0xb1, 0x5c, 0xbc, 0xc3, 0x1a, 0xb4, 0x20, 0x6a, 0x7e\ndb 0xb9, 0x5e, 0xcb, 0x9b, 0xf3, 0x1c, 0x2b, 0x16, 0xab, 0x15, 0x8d, 0xb5, 0x81, 0xf3, 0xbb, 0xc1\ndb 0x8e, 0x2c, 0xd6, 0xd1, 0xa8, 0x23, 0x3c, 0x98, 0x3f, 0x4e, 0xff, 0x97, 0x77, 0xd1, 0xbd, 0xda\ndb 0xff, 0x9c, 0x55, 0x01, 0x1c, 0x4b, 0x4b, 0x1a, 0xa9, 0x3d, 0xe9, 0xbd, 0x3c, 0x5b, 0xfd, 0x65\ndb 0x34, 0x9c, 0x78, 0x8c, 0x83, 0x46, 0x72, 0xed, 0x66, 0xee, 0x00, 0xac, 0xca, 0x09, 0xaa, 0x3a\ndb 0x2c, 0xc1, 0x7e, 0xde, 0x44, 0xbd, 0xe3, 0x5a, 0x11, 0x41, 0xc7, 0xc8, 0x65, 0x7a, 0xc7, 0xbb\ndb 0x44, 0xad, 0x97, 0x17, 0xe8, 0x9f, 0x29, 0x2b, 0x78, 0x6d, 0x96, 0xb6, 0x9c, 0x3a, 0x6a, 0xc2\ndb 0xab, 0x9a, 0x16, 0x6f, 0x05, 0x78, 0x0d, 0x83, 0xa5, 0x46, 0x8c, 0xd7, 0x57, 0x1e, 0x80, 0x2f\ndb 0x7e, 0x81, 0x68, 0xa4, 0xc4, 0x3d, 0x6c, 0xae, 0x6b, 0x98, 0xb9, 0xe4, 0xb4, 0xfb, 0xf4, 0x19\ndb 0xf9, 0xcd, 0xbb, 0xd0, 0xbc, 0x22, 0xdd, 0x2c, 0xbe, 0x11, 0x01, 0xc2, 0x53, 0xdd, 0xa3, 0x3a\ndb 0xbf, 0x5f, 0x2a, 0x94, 0x8b, 0x58, 0x6e, 0xe3, 0x4e, 0x1b, 0x0d, 0x30, 0x1b, 0x1c, 0x6c, 0x24\ndb 0x0e, 0xd9, 0x1c, 0xe1, 0x4d, 0x42, 0x48, 0xa0, 0x07, 0xb1, 0xe8, 0x10, 0xa1, 0x51, 0x6a, 0x82\ndb 0x2e, 0x99, 0xb3, 0xbf, 0xe3, 0xff, 0x3c, 0x77, 0xf4, 0x0c, 0x1f, 0x22, 0x53, 0xd0, 0x99, 0x60\ndb 0x5d, 0x65, 0x80, 0xb9, 0xa3, 0xb7, 0x25, 0x6d, 0xa6, 0x4f, 0xb5, 0x72, 0xaa, 0x4d, 0x0d, 0x49\ndb 0x4c, 0x34, 0xc5, 0xf4, 0x1b, 0x5c, 0x3f, 0x6c, 0xbb, 0x86, 0xba, 0xc5, 0x32, 0xee, 0x23, 0x95\ndb 0xe5, 0x42, 0x66, 0x92, 0x89, 0x5e, 0xf4, 0xd4, 0x2d, 0x04, 0xf2, 0xbc, 0xd7, 0xc8, 0xc9, 0xd7\ndb 0xe3, 0xdb, 0x4e, 0x4b, 0xda, 0x37, 0x1f, 0xfa, 0x9c, 0xaf, 0x4b, 0x1e, 0xab, 0x64, 0x2a, 0x59\ndb 0x24, 0x0f, 0xb4, 0xaf, 0xd6, 0x32, 0x30, 0xcd, 0x7c, 0xf3, 0x0f, 0xa9, 0xac, 0x3f, 0x55, 0xa2\ndb 0x92, 0x21, 0x58, 0x4e, 0x99, 0xbc, 0x9f, 0xfd, 0x16, 0x7c, 0x4e, 0x5b, 0xb4, 0xc7, 0x5f, 0x8d\ndb 0x0e, 0x26, 0x72, 0x17, 0x02, 0x7d, 0x12, 0xa0, 0xc5, 0xc1, 0x66, 0xd3, 0x19, 0x49, 0x42, 0xfb\ndb 0x18, 0xd7, 0x18, 0x79, 0xd3, 0x32, 0xfc, 0x4a, 0xab, 0x82, 0x72, 0x0a, 0x90, 0xb7, 0xbc, 0x00\ndb 0x16, 0x99, 0xd3, 0x9a, 0x76, 0xc6, 0x44, 0x92, 0x9b, 0x2b, 0x6a, 0x35, 0xca, 0x4e, 0x2e, 0x9c\ndb 0x7f, 0xcb, 0xd3, 0x65, 0x1c, 0xa6, 0x95, 0x2c, 0x3d, 0xe4, 0xd3, 0xe6, 0xe7, 0xe0, 0xde, 0x1e\ndb 0x54, 0xb3, 0x09, 0x3e, 0x34, 0x35, 0x68, 0x53, 0x01, 0x02, 0xf1, 0x4c, 0x89, 0x19, 0xe3, 0xc6\ndb 0x4a, 0x51, 0x49, 0xf5, 0x5f, 0x3e, 0xcd, 0xae, 0x6e, 0xeb, 0x90, 0x1a, 0x53, 0x93, 0x0b, 0xe8\ndb 0xc2, 0x6e, 0xee, 0xf3, 0x38, 0x5d, 0xb8, 0xaf, 0x58, 0x4b, 0xe0, 0xfd, 0x07, 0xcf, 0x15, 0x89\ndb 0x2b, 0x01, 0x35, 0xbb, 0xa0, 0x2f, 0x7e, 0xd3, 0x34, 0x7b, 0x1f, 0x81, 0x12, 0x7f, 0xb0, 0xff\ndb 0xe7, 0xa0, 0xf2, 0xc4, 0x86, 0x98, 0x45, 0xe2, 0xa1, 0x1e, 0x4c, 0xc0, 0x23, 0x05, 0x49, 0x0b\ndb 0x0d, 0xc3, 0x1e, 0x30, 0x20, 0xc6, 0x34, 0xb7, 0xe1, 0x09, 0x84, 0xd5, 0x2a, 0x40, 0x75, 0x9b\ndb 0x46, 0xbb, 0xa5, 0xfe, 0xbd, 0x7d, 0x39, 0xe4, 0x7b, 0x38, 0xdc, 0x9c, 0xaf, 0xc8, 0x12, 0xf4\ndb 0x78, 0xb8, 0x51, 0x4a, 0x21, 0xfe, 0xf9, 0x77, 0xf6, 0xb5, 0xad, 0x69, 0xc9, 0x4d, 0xbf, 0x67\ndb 0xfc, 0x5d, 0x80, 0x7c, 0x76, 0x2c, 0xe5, 0xf2, 0xd7, 0x7f, 0xce, 0xb5, 0x1c, 0x09, 0xa5, 0xc3\ndb 0x98, 0x18, 0x2d, 0x18, 0xfb, 0x61, 0x13, 0xea, 0xbc, 0x87, 0x3a, 0x3f, 0xb4, 0xaf, 0x3c, 0x3b\ndb 0x3b, 0xb6, 0xd2, 0xc7, 0x5c, 0x2c, 0xe1, 0x11, 0xb3, 0x9d, 0xf1, 0x52, 0xba, 0xb5, 0xf0, 0x69\ndb 0xcd, 0xd2, 0x93, 0x9e, 0x80, 0x45, 0x78, 0x17, 0x6d, 0x52, 0x51, 0xad, 0xed, 0x6d, 0x9e, 0x15\ndb 0xca, 0xb1, 0xfe, 0x22, 0x7b, 0x87, 0xb8, 0x40, 0x06, 0x2d, 0xb0, 0xbb, 0x05, 0x7c, 0x52, 0xd2\ndb 0xcd, 0xc8, 0x9c, 0xea, 0xd3, 0x4c, 0xb5, 0x06, 0xb4, 0x70, 0xad, 0x09, 0xa5, 0xb8, 0x66, 0xba\ndb 0x31, 0x0d, 0xe0, 0xe2, 0xcf, 0x62, 0x9f, 0x6d, 0x6d, 0x1a, 0x47, 0x21, 0xd5, 0x33, 0x6b, 0xd7\ndb 0x75, 0xff, 0x98, 0x6c, 0xb2, 0x78, 0x6d, 0x45, 0x50, 0xeb, 0xfb, 0xea, 0xb7, 0x2a, 0x27, 0x02\ndb 0xc4, 0x03, 0xde, 0x56, 0x23, 0x26, 0x10, 0x21, 0x57, 0x9c, 0x3b, 0x4c, 0x79, 0x2c, 0x3e, 0xfe\ndb 0xc8, 0x16, 0xe4, 0xd6, 0x60, 0xb8, 0x46, 0xe3, 0x4b, 0x7e, 0x3d, 0xb3, 0x83, 0x19, 0x54, 0x65\ndb 0x51, 0x7a, 0x81, 0xdd, 0x07, 0x33, 0x92, 0x08, 0x64, 0x0b, 0xc2, 0x06, 0x5c, 0x07, 0x81, 0x40\ndb 0x1b, 0xb4, 0x5a, 0x47, 0x2b, 0xdc, 0x96, 0x98, 0x4c, 0x65, 0xad, 0x8e, 0x8e, 0x77, 0xbe, 0x99\ndb 0x60, 0x4c, 0xb5, 0x6b, 0xed, 0xb7, 0x52, 0x5d, 0x99, 0x2e, 0x93, 0x40, 0xfe, 0x45, 0x83, 0x28\ndb 0x9b, 0x8b, 0x7f, 0x77, 0x2b, 0xdc, 0x61, 0xbe, 0x62, 0x28, 0xe8, 0x23, 0x3f, 0xdb, 0x1d, 0x6d\ndb 0x3b, 0xe8, 0x90, 0x05, 0x12, 0xf2, 0xb4, 0xf0, 0x1b, 0xbb, 0x2f, 0x4b, 0x9e, 0x9f, 0x0e, 0x4e\ndb 0x9e, 0x6a, 0x38, 0x7e, 0x97, 0x13, 0x90, 0x57, 0xb9, 0x49, 0x52, 0xb7, 0x4f, 0xd3, 0xc1, 0x39\ndb 0x95, 0x20, 0xd4, 0x83, 0x48, 0x0e, 0x7a, 0x9d, 0x89, 0x9d, 0xf4, 0xec, 0xe7, 0xcc, 0xde, 0x0a\ndb 0xac, 0xc5, 0xb0, 0x4d, 0xc5, 0x25, 0x74, 0x62, 0x66, 0x51, 0x4f, 0xeb, 0x4e, 0x9d, 0x3d, 0x04\ndb 0x27, 0xec, 0xfe, 0x8d, 0x03, 0x20, 0x38, 0x30, 0x5d, 0xf3, 0xf0, 0x97, 0xbb, 0xa9, 0xd1, 0xea\ndb 0x73, 0x73, 0x40, 0x2c, 0x0b, 0xa7, 0xc9, 0x8d, 0xac, 0x75, 0xc4, 0x46, 0x7c, 0xc2, 0x9a, 0x26\ndb 0x07, 0xae, 0x02, 0x27, 0x42, 0xa8, 0x90, 0xb6, 0x9b, 0x98, 0xec, 0x2e, 0xf6, 0xf6, 0x17, 0xda\ndb 0x9f, 0xfb, 0x54, 0xea, 0xae, 0x96, 0xfe, 0xd6, 0x35, 0x4f, 0x07, 0x9f, 0xf4, 0x57, 0x36, 0xfe\ndb 0xb1, 0x43, 0xee, 0xe3, 0x21, 0x00, 0x43, 0x12, 0xf2, 0xff, 0xa5, 0x37, 0x65, 0x01, 0xf0, 0xb4\ndb 0xe8, 0x68, 0xa3, 0xff, 0x31, 0x5f, 0x3f, 0x56, 0xa5, 0xd2, 0xcc, 0xab, 0xa4, 0x90, 0xf9, 0x98\ndb 0x0b, 0xdc, 0x0d, 0x20, 0x3c, 0x33, 0xda, 0xf1, 0x54, 0xd5, 0x6d, 0xc4, 0xa9, 0xc4, 0x54, 0x29\ndb 0x56, 0x69, 0x96, 0x98, 0x74, 0x13, 0x72, 0x1f, 0x95, 0xe9, 0xe2, 0xab, 0x60, 0x74, 0x91, 0x96\ndb 0xdf, 0xa4, 0xd6, 0x62, 0x3c, 0x35, 0x7e, 0xc4, 0x21, 0x16, 0xa3, 0x32, 0xac, 0x20, 0x52, 0xd4\ndb 0xbb, 0xc2, 0xa5, 0x97, 0x86, 0x4a, 0x55, 0xf4, 0x09, 0xf2, 0x0e, 0xd6, 0x1a, 0xfa, 0x00, 0x67\ndb 0x45, 0x57, 0xb3, 0xaa, 0xe5, 0x7c, 0x17, 0x8d, 0xde, 0x75, 0xd7, 0x49, 0x6e, 0xb0, 0xb2, 0xa0\ndb 0x58, 0xd8, 0x01, 0xf0, 0x22, 0x9c, 0xe4, 0xeb, 0x71, 0x5f, 0x4d, 0x38, 0xf2, 0x7e, 0xee, 0xba\ndb 0xf9, 0x39, 0xff, 0x42, 0x91, 0x00, 0x63, 0x5c, 0x86, 0x02, 0x81, 0x51, 0x10, 0xfb, 0xcf, 0x2a\ndb 0xcf, 0x16, 0xd9, 0x8f, 0x3a, 0xbb, 0x29, 0xcb, 0xe2, 0xc9, 0xd9, 0xe2, 0xd9, 0x05, 0x1b, 0x46\ndb 0x08, 0x2c, 0x6d, 0x5b, 0x1a, 0x7d, 0x5b, 0xca, 0x5b, 0xae, 0x18, 0x48, 0x15, 0x3b, 0x85, 0xd1\ndb 0x29, 0xcf, 0xaf, 0xa5, 0x68, 0xe9, 0x8d, 0x9e, 0x0b, 0xe1, 0x55, 0x54, 0x68, 0x28, 0x9b, 0x4c\ndb 0x94, 0x30, 0x3a, 0xc0, 0xaa, 0xf8, 0xeb, 0x7b, 0x58, 0x53, 0x5f, 0x25, 0x2e, 0xbf, 0x72, 0x26\ndb 0xd8, 0x9c, 0xa9, 0xfe, 0x30, 0xe0, 0x68, 0x25, 0xba, 0x71, 0x1a, 0x82, 0xbb, 0xee, 0x03, 0xc9\ndb 0x4b, 0x0a, 0x22, 0xda, 0x93, 0xa0, 0x72, 0x49, 0x72, 0x3a, 0x8f, 0xbe, 0x39, 0x04, 0x7c, 0x06\ndb 0xa1, 0x50, 0xa1, 0x94, 0xb4, 0x66, 0x91, 0xee, 0x76, 0xa4, 0xbe, 0x21, 0x33, 0xbe, 0xa9, 0x68\ndb 0xe6, 0x03, 0xdd, 0x25, 0x3b, 0x78, 0xe3, 0x5a, 0x0c, 0xcf, 0x2b, 0xa2, 0x03, 0x63, 0x8d, 0xd7\ndb 0xc4, 0xf0, 0x6e, 0xea, 0xe1, 0x76, 0x93, 0x38, 0x7b, 0x85, 0xef, 0xff, 0xce, 0xb0, 0xe1, 0xe3\ndb 0x86, 0x3d, 0xb6, 0xae, 0xee, 0xf7, 0x92, 0x8a, 0x1b, 0x29, 0x00, 0x9b, 0x85, 0xaf, 0xa2, 0x5e\ndb 0x90, 0xd9, 0xdc, 0xca, 0xde, 0xde, 0xab, 0xfe, 0x05, 0x61, 0x3c, 0xb6, 0x2f, 0x40, 0x59, 0x1f\ndb 0x73, 0x80, 0x52, 0xf6, 0x6f, 0x28, 0x30, 0x4b, 0xf2, 0x88, 0x9e, 0x63, 0x84, 0x1b, 0xd2, 0xf4\ndb 0x67, 0x3b, 0xaf, 0x48, 0x27, 0xfd, 0x7e, 0x30, 0x6e, 0xb8, 0x81, 0xbf, 0xe5, 0x4c, 0x19, 0x16\ndb 0x24, 0xd0, 0x8e, 0x3a, 0xc9, 0xcd, 0xc8, 0x6f, 0x2e, 0x99, 0xda, 0xb8, 0x7c, 0xd9, 0xbb, 0x2c\ndb 0xe3, 0xdf, 0xd0, 0x96, 0xe2, 0xcc, 0x99, 0x5b, 0x1d, 0xff, 0x81, 0x74, 0x84, 0x0b, 0x9d, 0x09\ndb 0x3e, 0x1b, 0x0c, 0x42, 0x3d, 0x96, 0x15, 0x44, 0xed, 0x97, 0x9a, 0x99, 0x68, 0x02, 0x2c, 0x79\ndb 0x8f, 0xcc, 0xff, 0x83, 0x5e, 0x6e, 0x97, 0x00, 0x50, 0x83, 0xc2, 0x29, 0x2b, 0x27, 0xe6, 0x4f\ndb 0x18, 0xb0, 0x45, 0xa9, 0xf8, 0x30, 0x35, 0x7f, 0x20, 0xdd, 0xd7, 0x07, 0x32, 0x55, 0x95, 0x4a\ndb 0xf3, 0xf5, 0x35, 0x5b, 0xac, 0xef, 0xfa, 0xbb, 0x54, 0xba, 0x4d, 0x79, 0x66, 0xce, 0x38, 0x5e\ndb 0x23, 0xd7, 0x1b, 0x03, 0x37, 0x74, 0xa7, 0xe0, 0xb1, 0x2c, 0xe5, 0xa4, 0x00, 0x36, 0x9a, 0xe9\ndb 0x36, 0xd4, 0x3e, 0x35, 0x37, 0xb2, 0xc1, 0x71, 0x90, 0x80, 0x3b, 0xd8, 0x6b, 0x7e, 0x79, 0x0a\ndb 0x7d, 0xe3, 0x3d, 0xc8, 0xd3, 0xb3, 0x56, 0xb6, 0xef, 0x73, 0x3d, 0x24, 0x07, 0x0e, 0xeb, 0x8e\ndb 0x9b, 0x25, 0xaf, 0x3b, 0xa3, 0x92, 0xf5, 0x19, 0x16, 0xba, 0x1f, 0x6f, 0x92, 0x4b, 0x3f, 0x3c\ndb 0xc8, 0xac, 0xdd, 0x70, 0xc6, 0x3b, 0x45, 0x0b, 0xa5, 0xe0, 0x8f, 0xa4, 0xd6, 0x56, 0xd8, 0xb9\ndb 0xc1, 0x1a, 0x53, 0x76, 0x37, 0x60, 0xc9, 0xf4, 0xc8, 0x0a, 0x17, 0x6d, 0x1d, 0xb8, 0x8e, 0xec\ndb 0xa8, 0x9c, 0x71, 0x08, 0x1f, 0x45, 0x96, 0xc8, 0xed, 0x1e, 0x47, 0x09, 0xbb, 0xe6, 0xee, 0x36\ndb 0x8e, 0x87, 0xc6, 0xeb, 0xe5, 0x88, 0xd8, 0xab, 0x98, 0x41, 0x4f, 0x2a, 0x49, 0x15, 0x68, 0xf6\ndb 0x51, 0xaf, 0xc7, 0x74, 0x7c, 0xaa, 0x26, 0x1a, 0x2f, 0xe6, 0x96, 0x86, 0x7c, 0x00, 0xa4, 0x57\ndb 0x90, 0x1f, 0x83, 0x02, 0x0c, 0xb2, 0xec, 0x27, 0x7f, 0xbc, 0x78, 0x11, 0x64, 0xbe, 0x34, 0x25\ndb 0xbd, 0xf8, 0x56, 0x00, 0x5f, 0xdd, 0x85, 0x95, 0x23, 0xad, 0xe9, 0x26, 0x1e, 0xd3, 0xfc, 0x22\ndb 0xe6, 0x35, 0x07, 0xbc, 0xf6, 0x88, 0x19, 0x61, 0x2e, 0xd5, 0x0d, 0xc0, 0x98, 0x79, 0x59, 0x0a\ndb 0x33, 0x44, 0xa8, 0x70, 0xd8, 0xda, 0x45, 0x72, 0xdb, 0x83, 0xf7, 0xbe, 0xbb, 0x93, 0xc9, 0xaa\ndb 0xf5, 0xfb, 0xdc, 0x0a, 0x55, 0x54, 0xd1, 0xae, 0x9e, 0x14, 0x38, 0x24, 0x06, 0x6e, 0x4d, 0x17\ndb 0xaa, 0xb1, 0xe4, 0x55, 0x9b, 0x7c, 0xc2, 0xe7, 0xb6, 0x82, 0x1b, 0x5d, 0x21, 0x20, 0xfc, 0x34\ndb 0x51, 0xf7, 0xfd, 0x20, 0x17, 0x4b, 0xd1, 0x9f, 0xc7, 0x2a, 0x57, 0x62, 0x4a, 0x60, 0x3f, 0xfa\ndb 0x70, 0x75, 0x1a, 0x3e, 0x9d, 0xbd, 0x6c, 0xe3, 0x60, 0xc3, 0xd3, 0xa6, 0x3b, 0x73, 0xa5, 0x4f\ndb 0x06, 0x79, 0xf4, 0x6e, 0x3a, 0xae, 0xa4, 0x98, 0x86, 0xb9, 0x1b, 0x8b, 0x66, 0xd9, 0x96, 0xdb\ndb 0xa5, 0x47, 0xd3, 0xa8, 0x05, 0x3c, 0x50, 0x57, 0x8a, 0x8f, 0xe0, 0x7f, 0xaf, 0x75, 0x30, 0x44\ndb 0x01, 0xce, 0x17, 0xb8, 0x89, 0xd4, 0x12, 0xaa, 0xe5, 0x2e, 0xe2, 0x75, 0x70, 0x06, 0x02, 0x5c\ndb 0xbd, 0x85, 0xaa, 0x75, 0x02, 0x98, 0xe0, 0x0f, 0xe9, 0x94, 0x43, 0x84, 0x8c, 0xca, 0xc1, 0x53\ndb 0x2f, 0x5c, 0x9a, 0x04, 0x9c, 0x2c, 0x50, 0xc7, 0x6d, 0x13, 0x70, 0x8f, 0x7d, 0xa5, 0x09, 0xc0\ndb 0x2b, 0x75, 0x55, 0x57, 0xc0, 0x51, 0xad, 0x86, 0x18, 0xc5, 0x9a, 0x9f, 0x1d, 0x99, 0x3e, 0xbd\ndb 0x38, 0x24, 0x33, 0xd6, 0x04, 0x98, 0xde, 0x19, 0xcc, 0xb3, 0x72, 0x53, 0x6b, 0xbb, 0x38, 0x03\ndb 0xdc, 0x86, 0xe3, 0x1b, 0x12, 0x04, 0x86, 0x92, 0x3d, 0x3f, 0xf4, 0x4d, 0x73, 0x8a, 0xe7, 0x67\ndb 0x68, 0xae, 0x63, 0x13, 0x7b, 0x48, 0x90, 0xce, 0x35, 0xfb, 0xf3, 0x46, 0x17, 0xb3, 0xcd, 0x2f\ndb 0xeb, 0xb5, 0x7a, 0x11, 0xa9, 0xe1, 0xa6, 0xab, 0x0c, 0x9e, 0x9f, 0xd1, 0x08, 0xae, 0xc1, 0x68\ndb 0xd2, 0xfc, 0x41, 0x36, 0xa8, 0xf4, 0x97, 0xbf, 0x86, 0x61, 0x90, 0x51, 0x02, 0x2e, 0x9a, 0x64\ndb 0x4e, 0xfb, 0xd1, 0xe5, 0x73, 0x24, 0x07, 0xb5, 0x70, 0xa1, 0xa2, 0xb7, 0xcb, 0x0c, 0xbc, 0x1a\ndb 0x4a, 0x55, 0x9e, 0x3f, 0x3b, 0xdb, 0x33, 0x4c, 0x01, 0x63, 0x1f, 0xbe, 0xae, 0x05, 0x3e, 0x45\ndb 0x9e, 0xcf, 0x2e, 0x5f, 0x3b, 0x83, 0x8a, 0xc7, 0xd7, 0x39, 0x3b, 0xfc, 0x54, 0xf0, 0x10, 0x42\ndb 0x9d, 0x5e, 0x12, 0xc2, 0xb8, 0x8c, 0x4e, 0x26, 0xd7, 0xa0, 0xa1, 0x7a, 0xc0, 0x27, 0x72, 0x52\ndb 0xdb, 0xc5, 0xed, 0xe1, 0x86, 0x19, 0x0a, 0xff, 0x43, 0x3d, 0x1c, 0x12, 0xb2, 0xbe, 0x5c, 0x12\ndb 0x4b, 0xbf, 0xff, 0x20, 0xe3, 0xde, 0x4a, 0x74, 0x89, 0x67, 0x42, 0xc3, 0xaf, 0xe3, 0x8a, 0x8a\ndb 0x57, 0x88, 0xdf, 0xbe, 0x1a, 0x0c, 0x58, 0xa1, 0xfe, 0x21, 0x57, 0x97, 0xf6, 0xef, 0xba, 0x34\ndb 0x54, 0x60, 0x00, 0x71, 0x09, 0x4a, 0x5b, 0x89, 0x61, 0x4a, 0x67, 0x19, 0x34, 0x44, 0x83, 0x21\ndb 0x3d, 0xeb, 0x67, 0xff, 0xf7, 0x68, 0xbb, 0x29, 0xa0, 0x74, 0x5e, 0xad, 0x78, 0xb4, 0x11, 0xc5\ndb 0x5e, 0x0e, 0xc0, 0xd4, 0xe7, 0x50, 0x40, 0xa1, 0xb5, 0x98, 0xdb, 0x75, 0x1f, 0xa5, 0xbc, 0x1b\ndb 0xeb, 0x13, 0x18, 0x0e, 0x92, 0x54, 0x17, 0x2d, 0x5b, 0xf8, 0x09, 0x50, 0x27, 0x49, 0xf5, 0x01\ndb 0xb9, 0x51, 0xd1, 0x85, 0x34, 0x67, 0xd8, 0xb9, 0x5f, 0x01, 0x7b, 0xfc, 0xe7, 0x1e, 0xc8, 0xfc\ndb 0x2f, 0xda, 0x81, 0xfd, 0x76, 0x69, 0x5b, 0x47, 0x98, 0x1b, 0x9b, 0xee, 0x9b, 0x18, 0x8e, 0x30\ndb 0x85, 0x9d, 0x45, 0xde, 0xa8, 0x9b, 0x4e, 0x57, 0x26, 0x90, 0x0b, 0x9a, 0xe0, 0xf7, 0xfa, 0x08\ndb 0x1d, 0xe3, 0xca, 0xb8, 0xaa, 0xda, 0x4e, 0xe3, 0xb6, 0x33, 0x05, 0x9a, 0x75, 0x70, 0x18, 0x86\ndb 0x60, 0x31, 0xc1, 0x05, 0x56, 0x02, 0x30, 0xbd, 0xff, 0x3b, 0xa9, 0xca, 0xe4, 0x84, 0xe6, 0x96\ndb 0x47, 0xcf, 0x8b, 0xa8, 0xd4, 0x63, 0x8f, 0x8f, 0x55, 0x4a, 0xbc, 0x4c, 0x3c, 0x61, 0x96, 0x38\ndb 0xcc, 0x10, 0x7e, 0x4e, 0x5c, 0x97, 0xd3, 0x54, 0x22, 0xde, 0xfb, 0x03, 0x81, 0x4e, 0x6d, 0x76\ndb 0xb5, 0xab, 0x8f, 0xba, 0xf5, 0xf0, 0x1a, 0xf9, 0x69, 0x64, 0x30, 0xb3, 0x19, 0x30, 0x54, 0x97\ndb 0x14, 0x66, 0x5c, 0xcf, 0x48, 0x0f, 0x74, 0xf3, 0xbe, 0x16, 0x10, 0x6c, 0xb4, 0x93, 0x86, 0xd1\ndb 0x21, 0xd0, 0x6a, 0x12, 0x35, 0x03, 0x45, 0x99, 0xaa, 0xe1, 0x0a, 0xd9, 0x58, 0x83, 0x2f, 0x97\ndb 0xcb, 0x0d, 0x81, 0x4b, 0x82, 0x01, 0x6f, 0xd6, 0x20, 0xee, 0xf3, 0xbf, 0xdc, 0x3d, 0x67, 0x6c\ndb 0xa5, 0x7c, 0x6d, 0x21, 0x09, 0x99, 0x2e, 0x0a, 0x98, 0x7c, 0x50, 0x56, 0x19, 0x54, 0xcc, 0x79\ndb 0xe1, 0x84, 0x18, 0x86, 0xf8, 0x5a, 0x1b, 0xf7, 0x1f, 0x38, 0xe0, 0x3a, 0xb9, 0x50, 0xc1, 0xf1\ndb 0xbe, 0x66, 0x89, 0xe2, 0x68, 0x4a, 0x11, 0x0b, 0xfb, 0x84, 0x02, 0x38, 0x31, 0xf4, 0xda, 0x50\ndb 0xb6, 0x5f, 0x27, 0x62, 0xc7, 0x5a, 0x0f, 0x99, 0xb7, 0x7e, 0x4a, 0x49, 0xe9, 0x67, 0xe0, 0xa5\ndb 0x0d, 0x08, 0x95, 0xf0, 0xe4, 0x3b, 0x62, 0x30, 0x2b, 0x89, 0x21, 0xdd, 0x52, 0x99, 0x12, 0x16\ndb 0x83, 0x94, 0x6a, 0x38, 0x1f, 0x8d, 0x81, 0xbf, 0x1f, 0xf9, 0xe0, 0x9c, 0x80, 0xcc, 0x7c, 0xfe\ndb 0x33, 0x35, 0x27, 0x26, 0xca, 0xcc, 0x1f, 0x43, 0xcd, 0xb0, 0x74, 0x0e, 0xff, 0x1c, 0x86, 0x43\ndb 0xab, 0x44, 0xbc, 0x31, 0xff, 0xa4, 0x54, 0x95, 0xd4, 0x79, 0x9e, 0xc0, 0xed, 0x87, 0x1c, 0x2e\ndb 0x50, 0x47, 0xad, 0xc0, 0x2f, 0x5e, 0x8c, 0x15, 0xfb, 0x86, 0x2c, 0xa5, 0x61, 0x2a, 0x60, 0x12\ndb 0xbc, 0x1f, 0x84, 0xe9, 0x75, 0x55, 0x7e, 0x2c, 0x11, 0xd0, 0xfc, 0x66, 0x89, 0x86, 0x2f, 0x26\ndb 0x43, 0x1e, 0xa6, 0x6c, 0xa6, 0x40, 0xa9, 0x37, 0x65, 0x99, 0x72, 0xe1, 0x1a, 0xdc, 0x23, 0x53\ndb 0x09, 0x8e, 0xa1, 0xd6, 0xda, 0xd9, 0x95, 0xaf, 0x58, 0xe0, 0x2a, 0x4a, 0xd3, 0xbd, 0xbd, 0x86\n\nalign 64\n.xsave_data:\ntimes 4096 db 0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/mov_address_size_override.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RDX\": \"0x5152535455565758\",\n    \"R8\": \"0x5152535455565758\"\n  }\n}\n%endif\n; FEX-Emu had a bug where address size override was overriding destination and source sizes on operations not affecting memory.\n; This showed up as a bug in OpenSSL where GCC was padding move instructions with the address size prefix, knowing that it wouldn't do anything.\n; FEX interpreted this address size prefix as making the destination 32-bit resulting in zero-extending the 64-bit source.\n; Ensure this doesn't happen again.\nmov rdx, 0x414243444546748\nmov r8, 0x5152535455565758\njmp .test\n.test:\n\n; Add a couple address size prefixes\ndb 0x67, 0x67\nmov rdx, r8\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/non_fatal_syscall.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\"\n  }\n}\n%endif\n\n; FEX-Emu had a bug where an `int 0x80` instruction that never gets executed would cause the emulator to assert.\n; This was due to multiblock's static analysis finding a 32-bit syscall in some code down a branch that would never execute.\n; Ensure this doesn't take down the emulator by doing something similar.\nmov rax, 0\ncmp rax, 0\n\nje .end\n\nmov rax, 1\nint 0x80\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/nzcv_implicit_clobber.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"XMM0\": [\"0\", \"0\"]\n  }\n}\n%endif\n\n; FEX has a bug with NZCV host flag usage that IR operations that implicitly clobber flags might not save emulated eflags correctly in all instances.\n; This tests one particular instance of `ImplicitFlagClobber`.\nmovaps xmm0, [rel .data]\n\n; Calculate ZF up-front\nmov eax, 1\nadd eax, eax\n\n; This jump is necessary to break visibility.\njmp .begin\n.begin:\n\n; minss turns in to VFMinScalarInsert which implicitly clobbers Arm64 flags.\n; Potentially any instruction that uses an IR operation that uses `ImplicitFlagClobber` would break.\nminss   xmm0, xmm0\n\n; Ensure the flags calculated by the `add eax, eax` are consumed.\n; ZF should be unset from `add 1, 1`.\n; If minss clobbers Arm64 host flags then the `fcmp` that Arm64 uses will overwrite nzcv, thus setting the ZF flag.\n; This is since `fcmp #0, #0` will set nzcv to `0110`.\njnz .next\nmov eax, 1\nhlt\n\n.next:\nmov eax, 0\nhlt\n\nalign 16\n.data:\ndd 0, 0, 0, 0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/nzcv_rmw.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xcafe\"\n  }\n}\n%endif\n\n; FEX had a bug where an NZCV RMW would fail to calculate previously deferred\n; flags, resulting in garbage flag values\n\n; First zero NZCV and break visibility\nmov rax, 0\nadd rax, 1\njz fexi_fexi_im_so_broken\n\njmp .begin\n.begin:\n\n; NZCV is zero. Set it to something nonzero with a deferred flag operation.\nmov rax, 0\npopcnt rax, rax\n\n; Now do a variable shift that preserves flags. This would clear ZF if not for\n; the condition on the shift flags.\nmov rbx, 100\nmov cl, 0\nsar rbx, cl\n\n; ZF should still be set.\njnz fexi_fexi_im_so_broken\n\nmov rax, 0xcafe\nhlt\n\nfexi_fexi_im_so_broken:\nmov rax, 0xdead\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/nzcv_spill_enderlilies.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"XMM0\": [\"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"SHA\"]\n}\n%endif\n\n; FEX-Emu has a bug around NZCV flags getting spilled and filled.\n; The bug comes down to NZCV actually being 32-bit but our IR incorrectly assumed that all flags were 8-bit.\n; Once a spill situation happened, it would only store and reload the lower 8-bits of the NZCV flag which wasn't correct.\n; This caused this code to infinite loop and read past memory and crash.\n\n; Code found from Ender Lilies in their `sha1_block_data_order` function which is significantly longer than this snippit.\nlea rsi, [rel .data_vecs]\nmov rax, 1\n\n; Break visibility\njmp loop_top\nloop_top:\n\n; Decrement counter.\ndec     rax\n\n; Load rsi + 0x40 in to rbx\nlea     rbx, [rsi+0x40]\n\n; Move rbx in to rsi, incrementing the pointer by 64-bytes if rax isn't zero.\ncmovne  rsi, rbx\n\n; Do a sha1rnds4, which uses enough temporaries to spill NZCV which picks up a crash.\nsha1rnds4 xmm0, xmm0, 0x0\n\n; This memory access will crash once we loop too many times.\nmovdqu  xmm0, [rsi]\n\n; Jump back to the top\njne     loop_top\n\nhlt\n\n.data_vecs:\ndq 0, 0, 0, 0\ndq 0, 0, 0, 0\ndq 0, 0, 0, 0\ndq 0, 0, 0, 0\ndq 0, 0, 0, 0\ndq 0, 0, 0, 0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/overlapping_memcpy_bug.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x00000000b752f1a6\",\n    \"RBX\": \"0x0000000065a37fd3\",\n    \"RCX\": \"0x00000000fafc3a00\",\n    \"RDX\": \"0x0000000087421ee2\"\n  },\n  \"MemoryRegions\": {\n    \"0xf0000000\": \"4096\"\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\n; FEX-Emu had a bug where movs based copies with overlapping regions results in incorrect results.\n; Since this is dealing with a large amount of data for testing purposes, CRC the results to ensure they were copied correctly.\n; See https://github.com/FEX-Emu/FEX/issues/3498 for more information.\n\n; Volatile rcx, rdi, rsi\n%macro do_rep_movs_op 4\n  cld\n  mov rsi, %4\n  mov rdi, %3\n  mov rcx, %2\n\n  jmp %%1\n  %%1:\n\n  rep %1\n%endmacro\n\n; Returns a crc32 of the memory region passed in.\n; Volatile: rax, rbx, rcx\n; Return in rax.\n%macro do_crc 2\n  jmp %%1\n  %%1:\n\n  cld\n  mov rax, 0\n  mov rbx, %1\n  mov rcx, %2\n  sub rcx, rbx\n  %%2:\n    crc32 eax, byte [rbx]\n    inc rbx\n    loop %%2\n%endmacro\n\n; Fully overlapping copy\nlea rsi, [rel .random_data]\ndo_rep_movs_op movsq, (4096 / 8), 0xf000_0000, rsi\ndo_rep_movs_op movsq, (4096 / 8) - 1, 0xf000_0000, 0xf000_0000\ndo_crc         0xf000_0000, 0xf000_1000\nmov dword [rel .results + (4 * 0)], eax\n\n; Source partial overlaps the destination, 8-byte\nlea rsi, [rel .random_data]\ndo_rep_movs_op movsq, (4096 / 8), 0xf000_0000, rsi\ndo_rep_movs_op movsq, (4096 / 8) - 1, 0xf000_0008, 0xf000_0000\ndo_crc         0xf000_0000, 0xf000_1000\nmov dword [rel .results + (4 * 1)], eax\n\n; Source partial overlaps the destination, 4-byte\nlea rsi, [rel .random_data]\ndo_rep_movs_op movsd, (4096 / 4), 0xf000_0000, rsi\ndo_rep_movs_op movsd, (4096 / 4) - 1, 0xf000_0004, 0xf000_0000\ndo_crc         0xf000_0000, 0xf000_1000\nmov dword [rel .results + (4 * 2)], eax\n\n; Destination partial overlaps the source, 8-byte\nlea rsi, [rel .random_data]\ndo_rep_movs_op movsq, (4096 / 8), 0xf000_0000, rsi\ndo_rep_movs_op movsq, (4096 / 8) - 1, 0xf000_0000, 0xf000_0008\ndo_crc         0xf000_0000, 0xf000_1000\nmov dword [rel .results + (4 * 3)], eax\n\n; Reload the results from memory.\nmov eax, dword [rel .results + (4 * 0)]\nmov ebx, dword [rel .results + (4 * 1)]\nmov ecx, dword [rel .results + (4 * 2)]\nmov edx, dword [rel .results + (4 * 3)]\n\nhlt\n\nalign 4096\n.results:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n; 4096 bytes of random data.\n.random_data:\ndb 0x5b, 0x27, 0x12, 0x29, 0xab, 0x84, 0xa2, 0x21, 0x6d, 0x27, 0xbe, 0x3d, 0x17, 0x05, 0x99, 0xb0\ndb 0xf3, 0xe2, 0x19, 0xf4, 0x42, 0xbb, 0x69, 0x02, 0x67, 0x3a, 0xab, 0x86, 0x9e, 0xda, 0x9f, 0xd5\ndb 0xba, 0xd4, 0x2d, 0x9d, 0x20, 0x3d, 0xf8, 0xb2, 0x29, 0xc3, 0xc3, 0x98, 0xa8, 0x30, 0x92, 0xe9\ndb 0x5a, 0x75, 0x0c, 0xcb, 0x28, 0x28, 0xb4, 0x90, 0x93, 0x16, 0x45, 0x10, 0x3a, 0x5d, 0x96, 0x67\ndb 0xf9, 0x31, 0xbe, 0x48, 0x78, 0xe8, 0x5a, 0xf2, 0x66, 0x29, 0xd9, 0x80, 0x50, 0x80, 0xcb, 0x07\ndb 0xfe, 0xda, 0x19, 0x0f, 0x22, 0xea, 0x18, 0x5e, 0x12, 0xea, 0x3d, 0x1a, 0xbc, 0x91, 0x51, 0x15\ndb 0xaa, 0x66, 0x92, 0x61, 0xb4, 0xd4, 0xce, 0x14, 0x9c, 0x86, 0x27, 0x3d, 0xd0, 0xc6, 0x51, 0x1c\ndb 0xa0, 0xd4, 0x0b, 0x2d, 0x25, 0x30, 0x3b, 0x46, 0x23, 0x07, 0xb5, 0x05, 0x4a, 0xaa, 0x5a, 0x0a\ndb 0x7b, 0x29, 0xe4, 0x52, 0x6f, 0x6f, 0xc8, 0x62, 0xb8, 0x94, 0x6a, 0x30, 0x66, 0xf1, 0x21, 0xec\ndb 0xd1, 0xf2, 0x68, 0xda, 0xb7, 0x7f, 0x5a, 0x26, 0x38, 0x46, 0x48, 0xda, 0x5d, 0x64, 0x8d, 0x3d\ndb 0x2f, 0xf6, 0xc3, 0x63, 0xb8, 0x09, 0x3a, 0xd0, 0x5b, 0xeb, 0x67, 0xd0, 0xaa, 0x63, 0x71, 0x19\ndb 0x7e, 0x4e, 0x33, 0xe2, 0x15, 0xba, 0x87, 0xa7, 0x7b, 0x25, 0xe4, 0xbb, 0xb5, 0x26, 0x9a, 0xf1\ndb 0xdd, 0x5a, 0x63, 0xd7, 0x16, 0xc0, 0xc3, 0xc8, 0x1b, 0xad, 0x00, 0x52, 0x63, 0x55, 0xc7, 0xe0\ndb 0xd9, 0xe9, 0xf4, 0x4c, 0x53, 0xfb, 0x73, 0x57, 0xdc, 0xad, 0x0c, 0xca, 0x73, 0x44, 0x6b, 0xf3\ndb 0xb7, 0x83, 0x3b, 0xfe, 0xf0, 0x15, 0xbf, 0xe5, 0x15, 0xca, 0xdf, 0x35, 0xeb, 0xe7, 0xe3, 0xa2\ndb 0xbd, 0x20, 0xad, 0xff, 0x1b, 0x67, 0x0a, 0x9f, 0x60, 0x60, 0xff, 0xa7, 0xc9, 0x19, 0xde, 0xb3\ndb 0x67, 0xf1, 0x4b, 0x77, 0x7f, 0x0b, 0xb1, 0x29, 0xee, 0xcb, 0xd6, 0x5d, 0x0d, 0xb9, 0x54, 0x49\ndb 0x10, 0xe3, 0xbd, 0x8a, 0xa0, 0x69, 0xa3, 0x07, 0xbe, 0x8e, 0xea, 0xc6, 0x75, 0x27, 0x66, 0xae\ndb 0x3c, 0xde, 0xc6, 0x13, 0x1b, 0x50, 0x37, 0x56, 0x7c, 0x01, 0xab, 0x8b, 0x46, 0xdc, 0x80, 0xed\ndb 0xdf, 0x12, 0x6f, 0x64, 0xdf, 0xe6, 0xf9, 0xbf, 0x15, 0x95, 0xd9, 0x80, 0x19, 0x8c, 0x96, 0x33\ndb 0x89, 0xbe, 0x25, 0x33, 0x34, 0x82, 0x92, 0x96, 0x05, 0x52, 0xa2, 0xcf, 0x5b, 0x3d, 0xfc, 0xd8\ndb 0x43, 0x89, 0x2e, 0x16, 0x6d, 0xbd, 0x84, 0x97, 0x77, 0xb5, 0xd6, 0x2b, 0x6b, 0xb1, 0xc6, 0x38\ndb 0x0a, 0xfe, 0xe1, 0xc9, 0x31, 0x32, 0x7f, 0xd5, 0xc1, 0x03, 0x4a, 0xb2, 0x86, 0x4d, 0x8d, 0x77\ndb 0xd6, 0x62, 0x52, 0x75, 0xed, 0x27, 0x21, 0xe8, 0x69, 0x6f, 0x6a, 0x5b, 0x59, 0x4d, 0xd2, 0x6c\ndb 0x2a, 0x97, 0x09, 0x03, 0xc5, 0x29, 0x0d, 0xe1, 0x31, 0x2e, 0x62, 0x21, 0x0e, 0xc2, 0x00, 0x7c\ndb 0xa2, 0x4c, 0x19, 0x63, 0x24, 0xfc, 0x9b, 0x38, 0x11, 0xbf, 0x20, 0x53, 0x53, 0xac, 0x3f, 0xdb\ndb 0xfd, 0x2b, 0x39, 0x3c, 0x39, 0x6b, 0xb4, 0x52, 0x1f, 0xf8, 0x8f, 0x3b, 0x47, 0x2b, 0x86, 0xcf\ndb 0xd2, 0x38, 0xe9, 0x08, 0x73, 0x09, 0x32, 0x5f, 0x6c, 0x3a, 0xdb, 0xfc, 0x1d, 0x91, 0xa4, 0x26\ndb 0xa3, 0x0c, 0xbc, 0x94, 0xf5, 0xbd, 0x29, 0xcf, 0x72, 0x3d, 0xee, 0x48, 0x06, 0x77, 0x63, 0x70\ndb 0x47, 0xc9, 0x87, 0x21, 0xb1, 0x9a, 0xdd, 0x5f, 0x71, 0x08, 0xe3, 0x3b, 0xf6, 0x07, 0x9f, 0x2f\ndb 0x20, 0xa3, 0x02, 0xc8, 0x4d, 0xc8, 0x18, 0xfa, 0x69, 0x32, 0x60, 0x97, 0x2d, 0x2f, 0x26, 0x84\ndb 0x3d, 0x7a, 0xf6, 0x2f, 0xb1, 0xc9, 0xd2, 0xcd, 0x6e, 0x24, 0x18, 0xa8, 0x0d, 0xb0, 0xe2, 0x41\ndb 0x1e, 0xdf, 0xc7, 0xee, 0xcd, 0x21, 0x5b, 0xc3, 0x26, 0x26, 0xb3, 0xb4, 0x33, 0x58, 0x79, 0xb5\ndb 0xc3, 0x24, 0x7c, 0xe3, 0xd7, 0x78, 0x33, 0x22, 0xd5, 0x20, 0x21, 0x86, 0xcf, 0xca, 0x44, 0xba\ndb 0xd8, 0x05, 0x84, 0x37, 0x69, 0x48, 0xb0, 0xe0, 0x7a, 0xe6, 0x74, 0x53, 0x1e, 0xd0, 0x0c, 0x3c\ndb 0x33, 0x83, 0x15, 0x43, 0x16, 0x0e, 0x93, 0x39, 0x55, 0x2e, 0x55, 0x1c, 0x09, 0xbd, 0x7a, 0xc3\ndb 0x80, 0x77, 0x4e, 0xd9, 0xf3, 0xa5, 0xee, 0x94, 0xbf, 0x8e, 0xd0, 0xec, 0x39, 0x33, 0x31, 0x8d\ndb 0x74, 0x94, 0xd2, 0x24, 0x22, 0x4a, 0xde, 0x51, 0x99, 0xc5, 0x68, 0xf2, 0x2e, 0xd3, 0x8d, 0xc5\ndb 0x32, 0x31, 0x26, 0xe7, 0x87, 0x47, 0x5f, 0xbc, 0x32, 0x80, 0x43, 0x83, 0x34, 0x36, 0xa1, 0x72\ndb 0x6b, 0x38, 0x10, 0x93, 0xa7, 0xa3, 0x92, 0xb7, 0x3c, 0x61, 0x1c, 0x4e, 0x0b, 0x86, 0x43, 0xa9\ndb 0x64, 0xf1, 0xf8, 0xd7, 0xd3, 0xf4, 0xd0, 0xe2, 0x17, 0xd4, 0xbb, 0xe9, 0x2c, 0xc8, 0x76, 0xc5\ndb 0x87, 0x7f, 0x81, 0x55, 0xbe, 0x87, 0x0e, 0x6b, 0xf6, 0x4f, 0x44, 0x37, 0x92, 0x32, 0x7f, 0x30\ndb 0xa6, 0x66, 0x09, 0x01, 0x7a, 0x6e, 0xb3, 0x3b, 0x7d, 0x8f, 0x32, 0x0e, 0x3c, 0xdc, 0xba, 0x2e\ndb 0xf8, 0xec, 0xde, 0xd9, 0xb1, 0xf0, 0x3e, 0xbd, 0x20, 0x4d, 0x01, 0x5a, 0xf4, 0xda, 0x99, 0x23\ndb 0x81, 0x01, 0x5f, 0x50, 0xce, 0xa8, 0xb9, 0xb1, 0x59, 0xe5, 0xde, 0x47, 0x5b, 0xba, 0x94, 0xd3\ndb 0x21, 0x7c, 0x49, 0xeb, 0xb5, 0x14, 0xe5, 0x56, 0x93, 0x06, 0x3b, 0xd2, 0x3a, 0x11, 0xca, 0x7a\ndb 0x14, 0x48, 0x54, 0xc7, 0x9f, 0x03, 0x40, 0x2c, 0x0b, 0x42, 0x8e, 0xac, 0xac, 0x08, 0x04, 0x8e\ndb 0xb3, 0x15, 0xe5, 0x06, 0xa6, 0x5b, 0xf0, 0x57, 0x08, 0xfa, 0x0f, 0x00, 0x7e, 0x4a, 0x16, 0xa8\ndb 0xb0, 0x4d, 0x07, 0x1b, 0xbc, 0x3d, 0xd0, 0x86, 0x15, 0xcd, 0x7c, 0xb2, 0xcc, 0x37, 0x6d, 0x15\ndb 0x8b, 0xd1, 0xe6, 0x3e, 0xfb, 0x6e, 0xe4, 0xea, 0xd9, 0x1f, 0x69, 0x2a, 0xbc, 0xda, 0xd9, 0x78\ndb 0xee, 0xcb, 0xb6, 0xff, 0x53, 0xfd, 0xd2, 0xb9, 0x18, 0x1f, 0xdf, 0x0e, 0x69, 0xfe, 0x36, 0xb0\ndb 0x77, 0x28, 0x66, 0xe2, 0xf0, 0x80, 0x4c, 0x11, 0x11, 0xba, 0xb7, 0xfd, 0x67, 0x4f, 0x05, 0xed\ndb 0x0c, 0xcc, 0x3e, 0x4d, 0xd9, 0xbc, 0x52, 0xe3, 0xec, 0xd9, 0x74, 0x29, 0x30, 0xf2, 0x66, 0xd6\ndb 0xfb, 0xc3, 0x5c, 0xc1, 0xd8, 0xef, 0x86, 0x08, 0x22, 0xb1, 0x6d, 0xfd, 0xee, 0xc7, 0x12, 0x25\ndb 0xda, 0xee, 0xd6, 0x28, 0x3b, 0x1d, 0xa7, 0x29, 0xdf, 0x45, 0x3a, 0xa4, 0x36, 0xe0, 0xa4, 0xda\ndb 0xb1, 0x2c, 0x8a, 0xa5, 0x5c, 0x8c, 0x70, 0xd8, 0xcd, 0x0f, 0xb5, 0x63, 0xd3, 0xaf, 0x59, 0x2b\ndb 0x7d, 0x86, 0x4a, 0xc4, 0xcc, 0x72, 0x9e, 0x89, 0xf4, 0x38, 0x89, 0x81, 0x64, 0x6f, 0xa5, 0xac\ndb 0x13, 0x59, 0xc4, 0x0f, 0xfb, 0xcc, 0x4c, 0x1d, 0x67, 0x5a, 0xbf, 0x19, 0xfc, 0x06, 0x71, 0xbd\ndb 0x7f, 0xb6, 0xb1, 0x95, 0xd3, 0x7b, 0x4c, 0x40, 0x91, 0xa9, 0x26, 0xdd, 0x28, 0x69, 0x90, 0xf6\ndb 0x5d, 0x16, 0x9f, 0xa9, 0x75, 0x5e, 0xad, 0x8f, 0xc8, 0x0b, 0x57, 0x48, 0xf2, 0x74, 0x77, 0x22\ndb 0x5d, 0xed, 0xc2, 0x79, 0x27, 0x46, 0x0c, 0x9e, 0x6f, 0x9a, 0x9a, 0xdc, 0xe0, 0x3d, 0x24, 0xc9\ndb 0xce, 0xf3, 0x34, 0x66, 0x45, 0x07, 0x0b, 0x83, 0x8c, 0xb7, 0xd9, 0x1e, 0xac, 0xc6, 0xf7, 0xef\ndb 0xe7, 0xd1, 0xbc, 0xa3, 0x21, 0x85, 0x3d, 0x25, 0x90, 0x24, 0x48, 0xb1, 0x00, 0xb0, 0xd2, 0xa6\ndb 0xd8, 0x4e, 0x46, 0x7c, 0xc4, 0x79, 0x40, 0x95, 0x81, 0xb4, 0xb9, 0xa8, 0x70, 0xf0, 0x12, 0xd6\ndb 0xdc, 0xb2, 0x7c, 0x0f, 0x47, 0xad, 0x7d, 0x46, 0x78, 0x18, 0x6e, 0xdd, 0x5f, 0xe5, 0xd7, 0x63\ndb 0x11, 0xf0, 0x5b, 0xa0, 0x48, 0x15, 0xe2, 0x55, 0xc6, 0x7f, 0xf4, 0x2e, 0x0e, 0x49, 0x39, 0x65\ndb 0x3e, 0x69, 0xc1, 0x27, 0x39, 0xb3, 0x10, 0x1b, 0xf2, 0x35, 0x88, 0x0c, 0x1b, 0xac, 0x4a, 0x15\ndb 0x31, 0x81, 0x63, 0xe5, 0x3d, 0x56, 0x6f, 0x34, 0x06, 0x5b, 0x1d, 0xa0, 0xea, 0x0c, 0x92, 0x6a\ndb 0x22, 0x2b, 0x2d, 0xbb, 0xaf, 0xc5, 0x6d, 0x44, 0x1b, 0xb0, 0x69, 0x06, 0x27, 0x54, 0xa5, 0x7f\ndb 0x07, 0xd4, 0xdc, 0xe5, 0x5c, 0x78, 0x9e, 0xf7, 0x4a, 0x47, 0x9b, 0x21, 0xf6, 0x87, 0x89, 0xad\ndb 0xec, 0xe4, 0xd6, 0x83, 0xd3, 0x7b, 0x34, 0x00, 0x0b, 0x75, 0xba, 0x4c, 0x0f, 0x46, 0xd2, 0x0c\ndb 0x58, 0x1b, 0x0f, 0x19, 0xb5, 0xf5, 0xba, 0x8f, 0xbd, 0x17, 0x51, 0xaf, 0xa6, 0x1a, 0x97, 0x8c\ndb 0x44, 0x30, 0x7c, 0x73, 0x50, 0xca, 0x05, 0xe8, 0x3e, 0x19, 0x4a, 0x5a, 0x6b, 0x4d, 0x01, 0x05\ndb 0xea, 0x1b, 0x70, 0xb6, 0xe6, 0x39, 0x5d, 0x99, 0x3b, 0xae, 0xed, 0x7c, 0xa6, 0xc7, 0x29, 0x6f\ndb 0xeb, 0x0a, 0xba, 0x03, 0xd3, 0xba, 0x62, 0x21, 0xa0, 0xb7, 0xb5, 0xbf, 0x40, 0xb8, 0x4e, 0xc3\ndb 0x89, 0xa0, 0xa9, 0xe8, 0xc8, 0x2b, 0xfd, 0x23, 0x32, 0x53, 0xe5, 0x35, 0xc1, 0x23, 0x97, 0xc1\ndb 0x87, 0x10, 0x41, 0x21, 0xb3, 0xf6, 0x53, 0xcf, 0x28, 0x47, 0x9c, 0x69, 0x42, 0xcf, 0x0e, 0x11\ndb 0x69, 0x7f, 0xc6, 0xdf, 0xc3, 0xbf, 0x04, 0x7f, 0x3a, 0xc6, 0xa1, 0x3d, 0xc6, 0x5b, 0x56, 0x8b\ndb 0x52, 0x23, 0x41, 0xd7, 0x35, 0x7f, 0x86, 0xd2, 0x59, 0xcf, 0xae, 0x28, 0xa3, 0xa2, 0x23, 0x4b\ndb 0x78, 0x78, 0x94, 0x3f, 0x2f, 0xf0, 0xb8, 0x94, 0xa2, 0x62, 0xb9, 0x83, 0xc7, 0x5f, 0x64, 0x45\ndb 0x54, 0xaf, 0x43, 0x93, 0x7f, 0xa1, 0xe8, 0x71, 0x38, 0xc8, 0x21, 0xf4, 0xa6, 0xab, 0x2b, 0xd3\ndb 0x44, 0xa2, 0x74, 0x94, 0x99, 0x3f, 0x56, 0xbc, 0x0a, 0x12, 0xe7, 0x6e, 0x1b, 0x7f, 0x98, 0xad\ndb 0x28, 0xa6, 0xc8, 0x87, 0x7a, 0x88, 0xcb, 0xcf, 0x9f, 0x95, 0xa7, 0xf1, 0x66, 0xfe, 0x43, 0x3d\ndb 0x71, 0x5b, 0x3a, 0xb7, 0xe4, 0xa8, 0x6f, 0x46, 0xa1, 0xaa, 0x66, 0xd2, 0x9e, 0x84, 0xfd, 0x42\ndb 0x98, 0x17, 0x3e, 0xde, 0xaa, 0x18, 0xc9, 0x9c, 0x53, 0x88, 0x2b, 0x92, 0xce, 0x00, 0x8b, 0xb4\ndb 0x15, 0x7a, 0x39, 0xb7, 0x57, 0xf9, 0xf2, 0x17, 0x0a, 0x8c, 0x05, 0x7b, 0x3f, 0x2a, 0xb0, 0xb7\ndb 0x8a, 0xbb, 0x9a, 0x0d, 0xe4, 0x0d, 0x6a, 0xbd, 0x8a, 0xe9, 0xbd, 0xca, 0xb2, 0x6a, 0xbe, 0x76\ndb 0x2c, 0xbe, 0x45, 0x3f, 0x22, 0x03, 0xb1, 0xab, 0x2d, 0xe0, 0x70, 0x52, 0xe5, 0x27, 0x8e, 0xbc\ndb 0xa9, 0x8d, 0x13, 0xf4, 0xe5, 0xd7, 0xeb, 0x4e, 0x30, 0x3f, 0x76, 0x3b, 0x64, 0xad, 0x57, 0x53\ndb 0x91, 0x89, 0xf4, 0x9a, 0xd1, 0x38, 0x3d, 0x58, 0xdc, 0x83, 0x65, 0x4a, 0x36, 0x30, 0x73, 0x92\ndb 0x8c, 0x2f, 0x7d, 0x1e, 0x15, 0x3c, 0xca, 0x54, 0x6f, 0x17, 0xbd, 0xba, 0x97, 0x7e, 0x28, 0x11\ndb 0x8e, 0x96, 0x9f, 0x46, 0x84, 0x69, 0xe3, 0xc2, 0x8e, 0x1e, 0xea, 0x6b, 0x17, 0xa7, 0xf8, 0x17\ndb 0xc3, 0xd9, 0x9c, 0x53, 0x79, 0x95, 0x32, 0xf6, 0x78, 0xcd, 0x5d, 0x2f, 0x30, 0x06, 0xe8, 0x9f\ndb 0x5e, 0xb2, 0x4e, 0x56, 0xf5, 0x31, 0xc3, 0x41, 0xae, 0x4b, 0x0a, 0xbd, 0xdc, 0xce, 0xea, 0xfa\ndb 0x27, 0x09, 0x4e, 0xd1, 0x24, 0x14, 0x33, 0x8b, 0x21, 0x48, 0x99, 0x92, 0x07, 0xa4, 0x1a, 0x87\ndb 0x34, 0x15, 0xa6, 0x12, 0x92, 0x3f, 0xf0, 0x3e, 0x18, 0x3c, 0x65, 0x3a, 0x8b, 0x17, 0x9b, 0xf2\ndb 0xd9, 0x93, 0xa0, 0x19, 0x2b, 0x73, 0x59, 0x29, 0x6f, 0xb7, 0x75, 0x4b, 0x42, 0x24, 0x43, 0xa4\ndb 0x20, 0xd8, 0x59, 0x8d, 0x9f, 0xd6, 0x64, 0xa1, 0xeb, 0xe3, 0x65, 0x82, 0x69, 0x74, 0x1a, 0x2b\ndb 0x8d, 0x9a, 0x59, 0x5d, 0x47, 0x75, 0x63, 0xcd, 0xe4, 0x14, 0x48, 0x5f, 0x67, 0x00, 0x12, 0x3c\ndb 0x58, 0x27, 0x5e, 0x83, 0xde, 0xd8, 0x97, 0xd9, 0x09, 0xd9, 0x06, 0x64, 0x96, 0x67, 0xb4, 0x4f\ndb 0xb9, 0x58, 0x87, 0xc9, 0xb1, 0xdd, 0x64, 0x8f, 0x4e, 0x8f, 0xa9, 0xfa, 0x40, 0xe6, 0x8f, 0xaa\ndb 0x22, 0x26, 0x16, 0x15, 0x6a, 0xa3, 0x88, 0xae, 0xa2, 0xbc, 0xa3, 0xa3, 0x56, 0xa1, 0x74, 0x6c\ndb 0xa2, 0xd0, 0x47, 0x4b, 0x98, 0x0a, 0xea, 0xdd, 0xe8, 0x9c, 0xe1, 0x37, 0x44, 0x1a, 0xc0, 0xc7\ndb 0x83, 0x07, 0x42, 0xca, 0x98, 0x36, 0xd7, 0x43, 0x18, 0x51, 0x32, 0xf6, 0x99, 0x61, 0x73, 0x79\ndb 0x51, 0xc4, 0xe9, 0x5b, 0x9e, 0xa8, 0xb4, 0x28, 0x49, 0xbb, 0x44, 0x90, 0xe2, 0xf7, 0x7e, 0x61\ndb 0x27, 0xbb, 0x85, 0x58, 0xd0, 0xdc, 0x94, 0x53, 0x02, 0x50, 0xfe, 0xc7, 0x37, 0xa2, 0x20, 0x1b\ndb 0x57, 0x00, 0x9b, 0x7c, 0xa4, 0x6c, 0xa6, 0xb1, 0xae, 0xd0, 0x03, 0x67, 0x2b, 0x82, 0xd9, 0x99\ndb 0x76, 0xd0, 0xc7, 0x7d, 0x2d, 0xbd, 0x39, 0x28, 0xcf, 0xe1, 0x13, 0xce, 0x1c, 0xe6, 0x4c, 0xa7\ndb 0x7a, 0x8c, 0x4f, 0xa6, 0x30, 0x77, 0x6b, 0x78, 0x39, 0x6e, 0x10, 0xd1, 0x9c, 0x9a, 0xda, 0x2d\ndb 0xc9, 0xef, 0xd7, 0xb1, 0xb8, 0xdf, 0x21, 0xce, 0x96, 0x53, 0xaa, 0xa6, 0x76, 0x52, 0x56, 0x0e\ndb 0xe6, 0x7f, 0xed, 0x88, 0x15, 0x2a, 0xc1, 0xfe, 0xb3, 0x35, 0x54, 0x09, 0x9b, 0x5d, 0x21, 0x62\ndb 0xc8, 0x6f, 0x2c, 0x6e, 0x56, 0xc8, 0xd9, 0x40, 0x67, 0xeb, 0x26, 0xf5, 0xcb, 0x18, 0xb1, 0x89\ndb 0xfe, 0x58, 0x1a, 0xff, 0x41, 0xb5, 0xd6, 0xe5, 0xb3, 0x82, 0x29, 0x82, 0xee, 0xbb, 0xb2, 0x5a\ndb 0x71, 0xf2, 0xca, 0xf1, 0x2f, 0xa7, 0x4d, 0xb1, 0x5c, 0xbc, 0xc3, 0x1a, 0xb4, 0x20, 0x6a, 0x7e\ndb 0xb9, 0x5e, 0xcb, 0x9b, 0xf3, 0x1c, 0x2b, 0x16, 0xab, 0x15, 0x8d, 0xb5, 0x81, 0xf3, 0xbb, 0xc1\ndb 0x8e, 0x2c, 0xd6, 0xd1, 0xa8, 0x23, 0x3c, 0x98, 0x3f, 0x4e, 0xff, 0x97, 0x77, 0xd1, 0xbd, 0xda\ndb 0xff, 0x9c, 0x55, 0x01, 0x1c, 0x4b, 0x4b, 0x1a, 0xa9, 0x3d, 0xe9, 0xbd, 0x3c, 0x5b, 0xfd, 0x65\ndb 0x34, 0x9c, 0x78, 0x8c, 0x83, 0x46, 0x72, 0xed, 0x66, 0xee, 0x00, 0xac, 0xca, 0x09, 0xaa, 0x3a\ndb 0x2c, 0xc1, 0x7e, 0xde, 0x44, 0xbd, 0xe3, 0x5a, 0x11, 0x41, 0xc7, 0xc8, 0x65, 0x7a, 0xc7, 0xbb\ndb 0x44, 0xad, 0x97, 0x17, 0xe8, 0x9f, 0x29, 0x2b, 0x78, 0x6d, 0x96, 0xb6, 0x9c, 0x3a, 0x6a, 0xc2\ndb 0xab, 0x9a, 0x16, 0x6f, 0x05, 0x78, 0x0d, 0x83, 0xa5, 0x46, 0x8c, 0xd7, 0x57, 0x1e, 0x80, 0x2f\ndb 0x7e, 0x81, 0x68, 0xa4, 0xc4, 0x3d, 0x6c, 0xae, 0x6b, 0x98, 0xb9, 0xe4, 0xb4, 0xfb, 0xf4, 0x19\ndb 0xf9, 0xcd, 0xbb, 0xd0, 0xbc, 0x22, 0xdd, 0x2c, 0xbe, 0x11, 0x01, 0xc2, 0x53, 0xdd, 0xa3, 0x3a\ndb 0xbf, 0x5f, 0x2a, 0x94, 0x8b, 0x58, 0x6e, 0xe3, 0x4e, 0x1b, 0x0d, 0x30, 0x1b, 0x1c, 0x6c, 0x24\ndb 0x0e, 0xd9, 0x1c, 0xe1, 0x4d, 0x42, 0x48, 0xa0, 0x07, 0xb1, 0xe8, 0x10, 0xa1, 0x51, 0x6a, 0x82\ndb 0x2e, 0x99, 0xb3, 0xbf, 0xe3, 0xff, 0x3c, 0x77, 0xf4, 0x0c, 0x1f, 0x22, 0x53, 0xd0, 0x99, 0x60\ndb 0x5d, 0x65, 0x80, 0xb9, 0xa3, 0xb7, 0x25, 0x6d, 0xa6, 0x4f, 0xb5, 0x72, 0xaa, 0x4d, 0x0d, 0x49\ndb 0x4c, 0x34, 0xc5, 0xf4, 0x1b, 0x5c, 0x3f, 0x6c, 0xbb, 0x86, 0xba, 0xc5, 0x32, 0xee, 0x23, 0x95\ndb 0xe5, 0x42, 0x66, 0x92, 0x89, 0x5e, 0xf4, 0xd4, 0x2d, 0x04, 0xf2, 0xbc, 0xd7, 0xc8, 0xc9, 0xd7\ndb 0xe3, 0xdb, 0x4e, 0x4b, 0xda, 0x37, 0x1f, 0xfa, 0x9c, 0xaf, 0x4b, 0x1e, 0xab, 0x64, 0x2a, 0x59\ndb 0x24, 0x0f, 0xb4, 0xaf, 0xd6, 0x32, 0x30, 0xcd, 0x7c, 0xf3, 0x0f, 0xa9, 0xac, 0x3f, 0x55, 0xa2\ndb 0x92, 0x21, 0x58, 0x4e, 0x99, 0xbc, 0x9f, 0xfd, 0x16, 0x7c, 0x4e, 0x5b, 0xb4, 0xc7, 0x5f, 0x8d\ndb 0x0e, 0x26, 0x72, 0x17, 0x02, 0x7d, 0x12, 0xa0, 0xc5, 0xc1, 0x66, 0xd3, 0x19, 0x49, 0x42, 0xfb\ndb 0x18, 0xd7, 0x18, 0x79, 0xd3, 0x32, 0xfc, 0x4a, 0xab, 0x82, 0x72, 0x0a, 0x90, 0xb7, 0xbc, 0x00\ndb 0x16, 0x99, 0xd3, 0x9a, 0x76, 0xc6, 0x44, 0x92, 0x9b, 0x2b, 0x6a, 0x35, 0xca, 0x4e, 0x2e, 0x9c\ndb 0x7f, 0xcb, 0xd3, 0x65, 0x1c, 0xa6, 0x95, 0x2c, 0x3d, 0xe4, 0xd3, 0xe6, 0xe7, 0xe0, 0xde, 0x1e\ndb 0x54, 0xb3, 0x09, 0x3e, 0x34, 0x35, 0x68, 0x53, 0x01, 0x02, 0xf1, 0x4c, 0x89, 0x19, 0xe3, 0xc6\ndb 0x4a, 0x51, 0x49, 0xf5, 0x5f, 0x3e, 0xcd, 0xae, 0x6e, 0xeb, 0x90, 0x1a, 0x53, 0x93, 0x0b, 0xe8\ndb 0xc2, 0x6e, 0xee, 0xf3, 0x38, 0x5d, 0xb8, 0xaf, 0x58, 0x4b, 0xe0, 0xfd, 0x07, 0xcf, 0x15, 0x89\ndb 0x2b, 0x01, 0x35, 0xbb, 0xa0, 0x2f, 0x7e, 0xd3, 0x34, 0x7b, 0x1f, 0x81, 0x12, 0x7f, 0xb0, 0xff\ndb 0xe7, 0xa0, 0xf2, 0xc4, 0x86, 0x98, 0x45, 0xe2, 0xa1, 0x1e, 0x4c, 0xc0, 0x23, 0x05, 0x49, 0x0b\ndb 0x0d, 0xc3, 0x1e, 0x30, 0x20, 0xc6, 0x34, 0xb7, 0xe1, 0x09, 0x84, 0xd5, 0x2a, 0x40, 0x75, 0x9b\ndb 0x46, 0xbb, 0xa5, 0xfe, 0xbd, 0x7d, 0x39, 0xe4, 0x7b, 0x38, 0xdc, 0x9c, 0xaf, 0xc8, 0x12, 0xf4\ndb 0x78, 0xb8, 0x51, 0x4a, 0x21, 0xfe, 0xf9, 0x77, 0xf6, 0xb5, 0xad, 0x69, 0xc9, 0x4d, 0xbf, 0x67\ndb 0xfc, 0x5d, 0x80, 0x7c, 0x76, 0x2c, 0xe5, 0xf2, 0xd7, 0x7f, 0xce, 0xb5, 0x1c, 0x09, 0xa5, 0xc3\ndb 0x98, 0x18, 0x2d, 0x18, 0xfb, 0x61, 0x13, 0xea, 0xbc, 0x87, 0x3a, 0x3f, 0xb4, 0xaf, 0x3c, 0x3b\ndb 0x3b, 0xb6, 0xd2, 0xc7, 0x5c, 0x2c, 0xe1, 0x11, 0xb3, 0x9d, 0xf1, 0x52, 0xba, 0xb5, 0xf0, 0x69\ndb 0xcd, 0xd2, 0x93, 0x9e, 0x80, 0x45, 0x78, 0x17, 0x6d, 0x52, 0x51, 0xad, 0xed, 0x6d, 0x9e, 0x15\ndb 0xca, 0xb1, 0xfe, 0x22, 0x7b, 0x87, 0xb8, 0x40, 0x06, 0x2d, 0xb0, 0xbb, 0x05, 0x7c, 0x52, 0xd2\ndb 0xcd, 0xc8, 0x9c, 0xea, 0xd3, 0x4c, 0xb5, 0x06, 0xb4, 0x70, 0xad, 0x09, 0xa5, 0xb8, 0x66, 0xba\ndb 0x31, 0x0d, 0xe0, 0xe2, 0xcf, 0x62, 0x9f, 0x6d, 0x6d, 0x1a, 0x47, 0x21, 0xd5, 0x33, 0x6b, 0xd7\ndb 0x75, 0xff, 0x98, 0x6c, 0xb2, 0x78, 0x6d, 0x45, 0x50, 0xeb, 0xfb, 0xea, 0xb7, 0x2a, 0x27, 0x02\ndb 0xc4, 0x03, 0xde, 0x56, 0x23, 0x26, 0x10, 0x21, 0x57, 0x9c, 0x3b, 0x4c, 0x79, 0x2c, 0x3e, 0xfe\ndb 0xc8, 0x16, 0xe4, 0xd6, 0x60, 0xb8, 0x46, 0xe3, 0x4b, 0x7e, 0x3d, 0xb3, 0x83, 0x19, 0x54, 0x65\ndb 0x51, 0x7a, 0x81, 0xdd, 0x07, 0x33, 0x92, 0x08, 0x64, 0x0b, 0xc2, 0x06, 0x5c, 0x07, 0x81, 0x40\ndb 0x1b, 0xb4, 0x5a, 0x47, 0x2b, 0xdc, 0x96, 0x98, 0x4c, 0x65, 0xad, 0x8e, 0x8e, 0x77, 0xbe, 0x99\ndb 0x60, 0x4c, 0xb5, 0x6b, 0xed, 0xb7, 0x52, 0x5d, 0x99, 0x2e, 0x93, 0x40, 0xfe, 0x45, 0x83, 0x28\ndb 0x9b, 0x8b, 0x7f, 0x77, 0x2b, 0xdc, 0x61, 0xbe, 0x62, 0x28, 0xe8, 0x23, 0x3f, 0xdb, 0x1d, 0x6d\ndb 0x3b, 0xe8, 0x90, 0x05, 0x12, 0xf2, 0xb4, 0xf0, 0x1b, 0xbb, 0x2f, 0x4b, 0x9e, 0x9f, 0x0e, 0x4e\ndb 0x9e, 0x6a, 0x38, 0x7e, 0x97, 0x13, 0x90, 0x57, 0xb9, 0x49, 0x52, 0xb7, 0x4f, 0xd3, 0xc1, 0x39\ndb 0x95, 0x20, 0xd4, 0x83, 0x48, 0x0e, 0x7a, 0x9d, 0x89, 0x9d, 0xf4, 0xec, 0xe7, 0xcc, 0xde, 0x0a\ndb 0xac, 0xc5, 0xb0, 0x4d, 0xc5, 0x25, 0x74, 0x62, 0x66, 0x51, 0x4f, 0xeb, 0x4e, 0x9d, 0x3d, 0x04\ndb 0x27, 0xec, 0xfe, 0x8d, 0x03, 0x20, 0x38, 0x30, 0x5d, 0xf3, 0xf0, 0x97, 0xbb, 0xa9, 0xd1, 0xea\ndb 0x73, 0x73, 0x40, 0x2c, 0x0b, 0xa7, 0xc9, 0x8d, 0xac, 0x75, 0xc4, 0x46, 0x7c, 0xc2, 0x9a, 0x26\ndb 0x07, 0xae, 0x02, 0x27, 0x42, 0xa8, 0x90, 0xb6, 0x9b, 0x98, 0xec, 0x2e, 0xf6, 0xf6, 0x17, 0xda\ndb 0x9f, 0xfb, 0x54, 0xea, 0xae, 0x96, 0xfe, 0xd6, 0x35, 0x4f, 0x07, 0x9f, 0xf4, 0x57, 0x36, 0xfe\ndb 0xb1, 0x43, 0xee, 0xe3, 0x21, 0x00, 0x43, 0x12, 0xf2, 0xff, 0xa5, 0x37, 0x65, 0x01, 0xf0, 0xb4\ndb 0xe8, 0x68, 0xa3, 0xff, 0x31, 0x5f, 0x3f, 0x56, 0xa5, 0xd2, 0xcc, 0xab, 0xa4, 0x90, 0xf9, 0x98\ndb 0x0b, 0xdc, 0x0d, 0x20, 0x3c, 0x33, 0xda, 0xf1, 0x54, 0xd5, 0x6d, 0xc4, 0xa9, 0xc4, 0x54, 0x29\ndb 0x56, 0x69, 0x96, 0x98, 0x74, 0x13, 0x72, 0x1f, 0x95, 0xe9, 0xe2, 0xab, 0x60, 0x74, 0x91, 0x96\ndb 0xdf, 0xa4, 0xd6, 0x62, 0x3c, 0x35, 0x7e, 0xc4, 0x21, 0x16, 0xa3, 0x32, 0xac, 0x20, 0x52, 0xd4\ndb 0xbb, 0xc2, 0xa5, 0x97, 0x86, 0x4a, 0x55, 0xf4, 0x09, 0xf2, 0x0e, 0xd6, 0x1a, 0xfa, 0x00, 0x67\ndb 0x45, 0x57, 0xb3, 0xaa, 0xe5, 0x7c, 0x17, 0x8d, 0xde, 0x75, 0xd7, 0x49, 0x6e, 0xb0, 0xb2, 0xa0\ndb 0x58, 0xd8, 0x01, 0xf0, 0x22, 0x9c, 0xe4, 0xeb, 0x71, 0x5f, 0x4d, 0x38, 0xf2, 0x7e, 0xee, 0xba\ndb 0xf9, 0x39, 0xff, 0x42, 0x91, 0x00, 0x63, 0x5c, 0x86, 0x02, 0x81, 0x51, 0x10, 0xfb, 0xcf, 0x2a\ndb 0xcf, 0x16, 0xd9, 0x8f, 0x3a, 0xbb, 0x29, 0xcb, 0xe2, 0xc9, 0xd9, 0xe2, 0xd9, 0x05, 0x1b, 0x46\ndb 0x08, 0x2c, 0x6d, 0x5b, 0x1a, 0x7d, 0x5b, 0xca, 0x5b, 0xae, 0x18, 0x48, 0x15, 0x3b, 0x85, 0xd1\ndb 0x29, 0xcf, 0xaf, 0xa5, 0x68, 0xe9, 0x8d, 0x9e, 0x0b, 0xe1, 0x55, 0x54, 0x68, 0x28, 0x9b, 0x4c\ndb 0x94, 0x30, 0x3a, 0xc0, 0xaa, 0xf8, 0xeb, 0x7b, 0x58, 0x53, 0x5f, 0x25, 0x2e, 0xbf, 0x72, 0x26\ndb 0xd8, 0x9c, 0xa9, 0xfe, 0x30, 0xe0, 0x68, 0x25, 0xba, 0x71, 0x1a, 0x82, 0xbb, 0xee, 0x03, 0xc9\ndb 0x4b, 0x0a, 0x22, 0xda, 0x93, 0xa0, 0x72, 0x49, 0x72, 0x3a, 0x8f, 0xbe, 0x39, 0x04, 0x7c, 0x06\ndb 0xa1, 0x50, 0xa1, 0x94, 0xb4, 0x66, 0x91, 0xee, 0x76, 0xa4, 0xbe, 0x21, 0x33, 0xbe, 0xa9, 0x68\ndb 0xe6, 0x03, 0xdd, 0x25, 0x3b, 0x78, 0xe3, 0x5a, 0x0c, 0xcf, 0x2b, 0xa2, 0x03, 0x63, 0x8d, 0xd7\ndb 0xc4, 0xf0, 0x6e, 0xea, 0xe1, 0x76, 0x93, 0x38, 0x7b, 0x85, 0xef, 0xff, 0xce, 0xb0, 0xe1, 0xe3\ndb 0x86, 0x3d, 0xb6, 0xae, 0xee, 0xf7, 0x92, 0x8a, 0x1b, 0x29, 0x00, 0x9b, 0x85, 0xaf, 0xa2, 0x5e\ndb 0x90, 0xd9, 0xdc, 0xca, 0xde, 0xde, 0xab, 0xfe, 0x05, 0x61, 0x3c, 0xb6, 0x2f, 0x40, 0x59, 0x1f\ndb 0x73, 0x80, 0x52, 0xf6, 0x6f, 0x28, 0x30, 0x4b, 0xf2, 0x88, 0x9e, 0x63, 0x84, 0x1b, 0xd2, 0xf4\ndb 0x67, 0x3b, 0xaf, 0x48, 0x27, 0xfd, 0x7e, 0x30, 0x6e, 0xb8, 0x81, 0xbf, 0xe5, 0x4c, 0x19, 0x16\ndb 0x24, 0xd0, 0x8e, 0x3a, 0xc9, 0xcd, 0xc8, 0x6f, 0x2e, 0x99, 0xda, 0xb8, 0x7c, 0xd9, 0xbb, 0x2c\ndb 0xe3, 0xdf, 0xd0, 0x96, 0xe2, 0xcc, 0x99, 0x5b, 0x1d, 0xff, 0x81, 0x74, 0x84, 0x0b, 0x9d, 0x09\ndb 0x3e, 0x1b, 0x0c, 0x42, 0x3d, 0x96, 0x15, 0x44, 0xed, 0x97, 0x9a, 0x99, 0x68, 0x02, 0x2c, 0x79\ndb 0x8f, 0xcc, 0xff, 0x83, 0x5e, 0x6e, 0x97, 0x00, 0x50, 0x83, 0xc2, 0x29, 0x2b, 0x27, 0xe6, 0x4f\ndb 0x18, 0xb0, 0x45, 0xa9, 0xf8, 0x30, 0x35, 0x7f, 0x20, 0xdd, 0xd7, 0x07, 0x32, 0x55, 0x95, 0x4a\ndb 0xf3, 0xf5, 0x35, 0x5b, 0xac, 0xef, 0xfa, 0xbb, 0x54, 0xba, 0x4d, 0x79, 0x66, 0xce, 0x38, 0x5e\ndb 0x23, 0xd7, 0x1b, 0x03, 0x37, 0x74, 0xa7, 0xe0, 0xb1, 0x2c, 0xe5, 0xa4, 0x00, 0x36, 0x9a, 0xe9\ndb 0x36, 0xd4, 0x3e, 0x35, 0x37, 0xb2, 0xc1, 0x71, 0x90, 0x80, 0x3b, 0xd8, 0x6b, 0x7e, 0x79, 0x0a\ndb 0x7d, 0xe3, 0x3d, 0xc8, 0xd3, 0xb3, 0x56, 0xb6, 0xef, 0x73, 0x3d, 0x24, 0x07, 0x0e, 0xeb, 0x8e\ndb 0x9b, 0x25, 0xaf, 0x3b, 0xa3, 0x92, 0xf5, 0x19, 0x16, 0xba, 0x1f, 0x6f, 0x92, 0x4b, 0x3f, 0x3c\ndb 0xc8, 0xac, 0xdd, 0x70, 0xc6, 0x3b, 0x45, 0x0b, 0xa5, 0xe0, 0x8f, 0xa4, 0xd6, 0x56, 0xd8, 0xb9\ndb 0xc1, 0x1a, 0x53, 0x76, 0x37, 0x60, 0xc9, 0xf4, 0xc8, 0x0a, 0x17, 0x6d, 0x1d, 0xb8, 0x8e, 0xec\ndb 0xa8, 0x9c, 0x71, 0x08, 0x1f, 0x45, 0x96, 0xc8, 0xed, 0x1e, 0x47, 0x09, 0xbb, 0xe6, 0xee, 0x36\ndb 0x8e, 0x87, 0xc6, 0xeb, 0xe5, 0x88, 0xd8, 0xab, 0x98, 0x41, 0x4f, 0x2a, 0x49, 0x15, 0x68, 0xf6\ndb 0x51, 0xaf, 0xc7, 0x74, 0x7c, 0xaa, 0x26, 0x1a, 0x2f, 0xe6, 0x96, 0x86, 0x7c, 0x00, 0xa4, 0x57\ndb 0x90, 0x1f, 0x83, 0x02, 0x0c, 0xb2, 0xec, 0x27, 0x7f, 0xbc, 0x78, 0x11, 0x64, 0xbe, 0x34, 0x25\ndb 0xbd, 0xf8, 0x56, 0x00, 0x5f, 0xdd, 0x85, 0x95, 0x23, 0xad, 0xe9, 0x26, 0x1e, 0xd3, 0xfc, 0x22\ndb 0xe6, 0x35, 0x07, 0xbc, 0xf6, 0x88, 0x19, 0x61, 0x2e, 0xd5, 0x0d, 0xc0, 0x98, 0x79, 0x59, 0x0a\ndb 0x33, 0x44, 0xa8, 0x70, 0xd8, 0xda, 0x45, 0x72, 0xdb, 0x83, 0xf7, 0xbe, 0xbb, 0x93, 0xc9, 0xaa\ndb 0xf5, 0xfb, 0xdc, 0x0a, 0x55, 0x54, 0xd1, 0xae, 0x9e, 0x14, 0x38, 0x24, 0x06, 0x6e, 0x4d, 0x17\ndb 0xaa, 0xb1, 0xe4, 0x55, 0x9b, 0x7c, 0xc2, 0xe7, 0xb6, 0x82, 0x1b, 0x5d, 0x21, 0x20, 0xfc, 0x34\ndb 0x51, 0xf7, 0xfd, 0x20, 0x17, 0x4b, 0xd1, 0x9f, 0xc7, 0x2a, 0x57, 0x62, 0x4a, 0x60, 0x3f, 0xfa\ndb 0x70, 0x75, 0x1a, 0x3e, 0x9d, 0xbd, 0x6c, 0xe3, 0x60, 0xc3, 0xd3, 0xa6, 0x3b, 0x73, 0xa5, 0x4f\ndb 0x06, 0x79, 0xf4, 0x6e, 0x3a, 0xae, 0xa4, 0x98, 0x86, 0xb9, 0x1b, 0x8b, 0x66, 0xd9, 0x96, 0xdb\ndb 0xa5, 0x47, 0xd3, 0xa8, 0x05, 0x3c, 0x50, 0x57, 0x8a, 0x8f, 0xe0, 0x7f, 0xaf, 0x75, 0x30, 0x44\ndb 0x01, 0xce, 0x17, 0xb8, 0x89, 0xd4, 0x12, 0xaa, 0xe5, 0x2e, 0xe2, 0x75, 0x70, 0x06, 0x02, 0x5c\ndb 0xbd, 0x85, 0xaa, 0x75, 0x02, 0x98, 0xe0, 0x0f, 0xe9, 0x94, 0x43, 0x84, 0x8c, 0xca, 0xc1, 0x53\ndb 0x2f, 0x5c, 0x9a, 0x04, 0x9c, 0x2c, 0x50, 0xc7, 0x6d, 0x13, 0x70, 0x8f, 0x7d, 0xa5, 0x09, 0xc0\ndb 0x2b, 0x75, 0x55, 0x57, 0xc0, 0x51, 0xad, 0x86, 0x18, 0xc5, 0x9a, 0x9f, 0x1d, 0x99, 0x3e, 0xbd\ndb 0x38, 0x24, 0x33, 0xd6, 0x04, 0x98, 0xde, 0x19, 0xcc, 0xb3, 0x72, 0x53, 0x6b, 0xbb, 0x38, 0x03\ndb 0xdc, 0x86, 0xe3, 0x1b, 0x12, 0x04, 0x86, 0x92, 0x3d, 0x3f, 0xf4, 0x4d, 0x73, 0x8a, 0xe7, 0x67\ndb 0x68, 0xae, 0x63, 0x13, 0x7b, 0x48, 0x90, 0xce, 0x35, 0xfb, 0xf3, 0x46, 0x17, 0xb3, 0xcd, 0x2f\ndb 0xeb, 0xb5, 0x7a, 0x11, 0xa9, 0xe1, 0xa6, 0xab, 0x0c, 0x9e, 0x9f, 0xd1, 0x08, 0xae, 0xc1, 0x68\ndb 0xd2, 0xfc, 0x41, 0x36, 0xa8, 0xf4, 0x97, 0xbf, 0x86, 0x61, 0x90, 0x51, 0x02, 0x2e, 0x9a, 0x64\ndb 0x4e, 0xfb, 0xd1, 0xe5, 0x73, 0x24, 0x07, 0xb5, 0x70, 0xa1, 0xa2, 0xb7, 0xcb, 0x0c, 0xbc, 0x1a\ndb 0x4a, 0x55, 0x9e, 0x3f, 0x3b, 0xdb, 0x33, 0x4c, 0x01, 0x63, 0x1f, 0xbe, 0xae, 0x05, 0x3e, 0x45\ndb 0x9e, 0xcf, 0x2e, 0x5f, 0x3b, 0x83, 0x8a, 0xc7, 0xd7, 0x39, 0x3b, 0xfc, 0x54, 0xf0, 0x10, 0x42\ndb 0x9d, 0x5e, 0x12, 0xc2, 0xb8, 0x8c, 0x4e, 0x26, 0xd7, 0xa0, 0xa1, 0x7a, 0xc0, 0x27, 0x72, 0x52\ndb 0xdb, 0xc5, 0xed, 0xe1, 0x86, 0x19, 0x0a, 0xff, 0x43, 0x3d, 0x1c, 0x12, 0xb2, 0xbe, 0x5c, 0x12\ndb 0x4b, 0xbf, 0xff, 0x20, 0xe3, 0xde, 0x4a, 0x74, 0x89, 0x67, 0x42, 0xc3, 0xaf, 0xe3, 0x8a, 0x8a\ndb 0x57, 0x88, 0xdf, 0xbe, 0x1a, 0x0c, 0x58, 0xa1, 0xfe, 0x21, 0x57, 0x97, 0xf6, 0xef, 0xba, 0x34\ndb 0x54, 0x60, 0x00, 0x71, 0x09, 0x4a, 0x5b, 0x89, 0x61, 0x4a, 0x67, 0x19, 0x34, 0x44, 0x83, 0x21\ndb 0x3d, 0xeb, 0x67, 0xff, 0xf7, 0x68, 0xbb, 0x29, 0xa0, 0x74, 0x5e, 0xad, 0x78, 0xb4, 0x11, 0xc5\ndb 0x5e, 0x0e, 0xc0, 0xd4, 0xe7, 0x50, 0x40, 0xa1, 0xb5, 0x98, 0xdb, 0x75, 0x1f, 0xa5, 0xbc, 0x1b\ndb 0xeb, 0x13, 0x18, 0x0e, 0x92, 0x54, 0x17, 0x2d, 0x5b, 0xf8, 0x09, 0x50, 0x27, 0x49, 0xf5, 0x01\ndb 0xb9, 0x51, 0xd1, 0x85, 0x34, 0x67, 0xd8, 0xb9, 0x5f, 0x01, 0x7b, 0xfc, 0xe7, 0x1e, 0xc8, 0xfc\ndb 0x2f, 0xda, 0x81, 0xfd, 0x76, 0x69, 0x5b, 0x47, 0x98, 0x1b, 0x9b, 0xee, 0x9b, 0x18, 0x8e, 0x30\ndb 0x85, 0x9d, 0x45, 0xde, 0xa8, 0x9b, 0x4e, 0x57, 0x26, 0x90, 0x0b, 0x9a, 0xe0, 0xf7, 0xfa, 0x08\ndb 0x1d, 0xe3, 0xca, 0xb8, 0xaa, 0xda, 0x4e, 0xe3, 0xb6, 0x33, 0x05, 0x9a, 0x75, 0x70, 0x18, 0x86\ndb 0x60, 0x31, 0xc1, 0x05, 0x56, 0x02, 0x30, 0xbd, 0xff, 0x3b, 0xa9, 0xca, 0xe4, 0x84, 0xe6, 0x96\ndb 0x47, 0xcf, 0x8b, 0xa8, 0xd4, 0x63, 0x8f, 0x8f, 0x55, 0x4a, 0xbc, 0x4c, 0x3c, 0x61, 0x96, 0x38\ndb 0xcc, 0x10, 0x7e, 0x4e, 0x5c, 0x97, 0xd3, 0x54, 0x22, 0xde, 0xfb, 0x03, 0x81, 0x4e, 0x6d, 0x76\ndb 0xb5, 0xab, 0x8f, 0xba, 0xf5, 0xf0, 0x1a, 0xf9, 0x69, 0x64, 0x30, 0xb3, 0x19, 0x30, 0x54, 0x97\ndb 0x14, 0x66, 0x5c, 0xcf, 0x48, 0x0f, 0x74, 0xf3, 0xbe, 0x16, 0x10, 0x6c, 0xb4, 0x93, 0x86, 0xd1\ndb 0x21, 0xd0, 0x6a, 0x12, 0x35, 0x03, 0x45, 0x99, 0xaa, 0xe1, 0x0a, 0xd9, 0x58, 0x83, 0x2f, 0x97\ndb 0xcb, 0x0d, 0x81, 0x4b, 0x82, 0x01, 0x6f, 0xd6, 0x20, 0xee, 0xf3, 0xbf, 0xdc, 0x3d, 0x67, 0x6c\ndb 0xa5, 0x7c, 0x6d, 0x21, 0x09, 0x99, 0x2e, 0x0a, 0x98, 0x7c, 0x50, 0x56, 0x19, 0x54, 0xcc, 0x79\ndb 0xe1, 0x84, 0x18, 0x86, 0xf8, 0x5a, 0x1b, 0xf7, 0x1f, 0x38, 0xe0, 0x3a, 0xb9, 0x50, 0xc1, 0xf1\ndb 0xbe, 0x66, 0x89, 0xe2, 0x68, 0x4a, 0x11, 0x0b, 0xfb, 0x84, 0x02, 0x38, 0x31, 0xf4, 0xda, 0x50\ndb 0xb6, 0x5f, 0x27, 0x62, 0xc7, 0x5a, 0x0f, 0x99, 0xb7, 0x7e, 0x4a, 0x49, 0xe9, 0x67, 0xe0, 0xa5\ndb 0x0d, 0x08, 0x95, 0xf0, 0xe4, 0x3b, 0x62, 0x30, 0x2b, 0x89, 0x21, 0xdd, 0x52, 0x99, 0x12, 0x16\ndb 0x83, 0x94, 0x6a, 0x38, 0x1f, 0x8d, 0x81, 0xbf, 0x1f, 0xf9, 0xe0, 0x9c, 0x80, 0xcc, 0x7c, 0xfe\ndb 0x33, 0x35, 0x27, 0x26, 0xca, 0xcc, 0x1f, 0x43, 0xcd, 0xb0, 0x74, 0x0e, 0xff, 0x1c, 0x86, 0x43\ndb 0xab, 0x44, 0xbc, 0x31, 0xff, 0xa4, 0x54, 0x95, 0xd4, 0x79, 0x9e, 0xc0, 0xed, 0x87, 0x1c, 0x2e\ndb 0x50, 0x47, 0xad, 0xc0, 0x2f, 0x5e, 0x8c, 0x15, 0xfb, 0x86, 0x2c, 0xa5, 0x61, 0x2a, 0x60, 0x12\ndb 0xbc, 0x1f, 0x84, 0xe9, 0x75, 0x55, 0x7e, 0x2c, 0x11, 0xd0, 0xfc, 0x66, 0x89, 0x86, 0x2f, 0x26\ndb 0x43, 0x1e, 0xa6, 0x6c, 0xa6, 0x40, 0xa9, 0x37, 0x65, 0x99, 0x72, 0xe1, 0x1a, 0xdc, 0x23, 0x53\ndb 0x09, 0x8e, 0xa1, 0xd6, 0xda, 0xd9, 0x95, 0xaf, 0x58, 0xe0, 0x2a, 0x4a, 0xd3, 0xbd, 0xbd, 0x86\n\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/pcmpestri_garbage_rcx.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": [\"15\"],\n      \"RCX\": [\"5\"],\n      \"RDX\": [\"16\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Tests a bug that FEX had with pcmpestri where the returned index would leave data in the upper 32-bits of rcx.\n; This instruction writes a 32-bit result to rcx with zero extend to 64-bit.\n; Test this by writing data in to rcx before the instruction and ensuring it is erased after the fact.\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Unsigned byte character check (lsb, positive polarity)\nmov rax, 15 ; Exclude 'l'\nmov rdx, 16\nmov rcx, 0x4142434445464748\n\npcmpestri xmm2, xmm3, 0b00000000\nhlt\n\nalign 32\n.data:\ndq 0x6463626144434241 ; \"ABCDabcd\"\ndq 0x6C6B6A694C4B4A49 ; \"IJKLijkl\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x4120492065726548 ; \"Here I A\"\ndq 0x6C4C612759202C6D ; \"m, Y'aLl\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/repeat_on_incdec.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0\",\n    \"RCX\": \"8\",\n    \"RDX\": \"0\",\n    \"RSP\": \"0\"\n  }\n}\n%endif\n\n; FEX-Emu had a bug where it thought repeat worked on increment and decrement instructions.\n; While the prefix can be encoded on the instructions, it is ignored by the hardware implementation.\n; This checks to ensure that inc/dec ignore the repeat prefix, and that rcx isn't ever changed from it.\n\nmov rsp, 0\nmov rcx, 8\nlea rax, [rel .test]\n\nrep inc rsp\nrep inc byte [rax]\n\nrep dec rsp\nrep dec byte [rax]\n\nmov rbx, [rel .test]\nmov rdx, [rel .test + 8]\n\nhlt\n\nalign 4096\n.test:\ndb 0, 0, 0, 0, 0, 0, 0, 0\ndb 0, 0, 0, 0, 0, 0, 0, 0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/repeat_stringops_crash.asm",
    "content": "%ifdef CONFIG\n{\n  \"MemoryRegions\": {\n    \"0xf0000000\": \"4096\",\n    \"0xf1000000\": \"4096\"\n  }\n}\n%endif\n\n; FEX-Emu had a bug where a backwards repeating string operation would read past the end of a mapped page.\n; This was encountered in https://github.com/FEX-Emu/FEX/pull/3478.\n; To ensure we don't read past a page with `rep stos` and `rep movs`, map two disparate pages and copy the entire page.\n; If FEX tries reading past the ends of either then it will fault.\n%macro do_rep_op 2\n  jmp %%1\n  %%1:\n\n  cld\n  mov rax, r13\n  mov rdi, r14\n  mov rsi, r15\n  mov rcx, (4096 / %2)\n  rep %1\n%endmacro\n\n%macro do_backward_rep_op 2\n  jmp %%1\n  %%1:\n\n  std\n  mov rax, r13\n  mov rdi, r14\n  mov rsi, r15\n  add rdi, (4096 - %2)\n  add rsi, (4096 - %2)\n  mov rcx, (4096 / %2)\n  rep %1\n%endmacro\n\nmov r15, 0xf000_0000\nmov r14, 0xf100_0000\nmov r13, 0x41424344454647\n\ndo_rep_op stosb, 1\ndo_rep_op stosw, 2\ndo_rep_op stosd, 4\ndo_rep_op stosq, 8\n\ndo_backward_rep_op stosb, 1\ndo_backward_rep_op stosw, 2\ndo_backward_rep_op stosd, 4\ndo_backward_rep_op stosq, 8\n\ndo_rep_op movsb, 1\ndo_rep_op movsw, 2\ndo_rep_op movsd, 4\ndo_rep_op movsq, 8\n\ndo_backward_rep_op movsb, 1\ndo_backward_rep_op movsw, 2\ndo_backward_rep_op movsd, 4\ndo_backward_rep_op movsq, 8\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/rex_b_mmx.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\n; FEX had a bug where the REX.B prefix would cause out of bounds MMX register access, when real HW ignores its presence\n\ndb 0x41 ; REX.B\npsignd mm4, mm0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/rotate_zero_extend_with_zero.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000045464748\",\n    \"RBX\": \"0x0000000055565758\",\n    \"RSI\": \"0x0000000065666768\",\n    \"RDX\": \"0x0000000075767778\",\n    \"RDI\": \"0x0000000085868788\",\n    \"RSP\": \"0x0000000095969798\",\n    \"RBP\": \"0x0000000015161718\",\n    \"R8\":  \"0x0000000025262728\",\n    \"R9\":  \"0x3132333435363738\",\n    \"R10\": \"0x0000000035363738\"\n  },\n  \"HostFeatures\": [\"BMI2\"]\n}\n%endif\n\n; FEX-Emu had a bug where it forgot to zero extend 32-bit rotate operations even if the rotate value masked to zero.\n; Do both immediate encoded rotates and CL encoded rotates to ensure it gets zero extended correctly.\n; Tests:\n; - rotate left\n; - rotate right\n; - rotate with carry left\n; - rotate with carry right\n; - BMI2 rotate right without affecting flags\n\nmov rax, 0x4142434445464748\nmov rbx, 0x5152535455565758\nmov rsi, 0x6162636465666768\nmov rdx, 0x7172737475767778\n\nmov rdi, 0x8182838485868788\nmov rsp, 0x9192939495969798\nmov rbp, 0x1112131415161718\nmov r8,  0x2122232425262728\nmov r9,  0x3132333435363738\nmov r10, 0xA1A2A3A4A5A6A7A8\n\n; Rotate count that when masked by 32-bit operating size it becomes zero!\nmov rcx, 0x41424344454647E0\n\njmp .test\n.test:\n\n; Test that 32-bit rotates that mask to zero don't zero the upper bits\nrol eax, cl\nror ebx, cl\n\n; Test with imm encoded as well\nrol esi, 0xE0\nror edx, 0xE0\n\n; Test rotate with carries as well\nrcl edi, cl\nrcr esp, cl\n\nrcl ebp, 0xE0\nrcr r8d, 0xE0\n\n; Test RORX as well\nrorx r10d, r9d, 0xE0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/sbbNZCVBug.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RBX\": \"1\",\n    \"R8\":  \"1\",\n    \"R9\":  \"0\",\n    \"R10\": \"0\",\n    \"R11\": \"1\",\n    \"R12\": \"1\",\n    \"R13\": \"1\",\n    \"R14\": \"0x00000000ffffffff\",\n    \"R15\": \"0\"\n  }\n}\n%endif\n\n; FEX had a bug in pr #3153 which encountered a destination register overwrite in sbbNZCV.\n; This was due to the destination register for that IR operation aliases the first source register.\n; Once it tried modifying NZCV flags directly in the destination, it managed to clobber the source register.\n; Code is based around part of a GCC adx-addcarryx32-2 assembly output snippet.\n; Needs memory accesses to ensure const-prop and RA aligns correctly.\nmov rdx, 0\n\n; These need to be loaded through memory so const-prop doesn't save it\n; Load the values\nmov     edx, dword [rel .current_x]\nmov     eax, dword [rel .current_y]\nmovzx   ecx, byte [rel .current_stored_cf]\n\n; Do the operation\nadd     cl, 0xff ; Clear carry based on stored_cf. Can't use clc here. (0)\nmov r8d, edx ; Store incoming current_x\nmov r9d, eax ; Store incoming current_y\nsetb r10b ; Store incoming CF\n\nsbb     eax, edx\n; Get Carry result\nsetb    dl\n\nsetb r11b ; Store outgoing CF\n\n; Store sbb result and carry\nmov     dword [rel .current_x], eax ; (0xFFFF_FFFF)\nmov     byte [rel .current_stored_cf], dl ; (0x1)\n\n; Second operation\n; Load current_y and CF(will be 1)\nmov     eax, 0\nmovzx   edx, byte [rel .current_stored_cf]\n\nmovzx   r12, byte [rel .current_stored_cf] ; Store incoming CF\n\nadd     dl, 0xff ; Set carry based on stored_cf. Can't use stc here. (1)\n; Do the operation\n\nmov r15d, eax ; Store EAX prior to SBB\nmov r14d, dword [rel .current_x] ; Store curent_x\nsetb r13b ; Store incoming CF\n\nsbb     eax, dword [rel .current_x]\nsetb    dl  ; Set if CF=1\n\n; sbb results in eax now\n; Move carry result to ebx\n; r15 = EAX prior to second sbb\n; r14 = CurrentX prior to second sbb (-1)\n; r13 = Incoming CF prior to second sbb (calculated from setb)\n; r12 = Incoming CF prior to second sbb (calculated from memory)\n; r11 = Outgoing CF from first sbb (calculated from setb)\n; r10 = Incoming CF for first sbb (calculated from setb)\n; r9 = store incoming current_y to first sbb\n; r8 = store incoming current_x to first sbb\n\nmovzx ebx, dl\n\nhlt\n\nalign 4096\n.current_x:\ndq 1\n\n.current_y:\ndq 0\n\n.current_stored_cf:\ndq 0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/smallvectorload_regreg.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000000000078\", \"0x0000000000000077\"],\n    \"XMM1\": [\"0x0000000000000078\", \"0x0000000000000077\"],\n    \"XMM2\": [\"0x0000000000000078\", \"0x0000000000000077\"],\n    \"XMM3\": [\"0x0000000000000078\", \"0x7800000000000077\"],\n    \"XMM4\": [\"0x0000000000000078\", \"0\"],\n    \"XMM5\": [\"0x0000000000000078\", \"0\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\n; FEX-Emu had a bug with vector loadstore instructions where 16-bit and 8-bit vector loadstores with reg+reg source would assert in the code emitter.\n; This affected both vector loads and stores. SSE 8-bit and 16-bit are quite uncommon so this isn't encountered frequently.\n; Tests a few different instructions that access 16-bit and 8-bit with loads and stores.\nlea rax, [rel .data]\nlea rbx, [rel .data_temp]\nmov rcx, 0\njmp .test\n.test:\n\n; 16-bit loads\npmovzxbq xmm0, [rax + rcx]\npmovzxbq xmm1, [rax + rcx*2]\npmovzxbq xmm2, [rax + rcx*4]\npmovzxbq xmm3, [rax + rcx*8]\n\n; 8-bit load\npinsrb xmm3, [rax + rcx], 1111b\n\n; 8-bit store\npextrb [rbx + rcx], xmm0, 0\n\n; Load the result back\nmovaps xmm4, [rbx + rcx]\n\n; 16-bit store\npextrb [rbx + rcx], xmm0, 0\n\n; Load the result back\nmovaps xmm5, [rbx + rcx]\n\nhlt\n\nalign 4096\n.data:\ndq 0x7172737475767778\ndq 0x4142434445464748\n\n.data_temp:\ndq 0,0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/tls_vector_element.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x4142434445464748\",\n    \"RCX\": \"0x0000000000000056\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x0000000000004748\",\n    \"RDI\": \"0x4142434445464748\",\n    \"RSP\": \"0x0000000045464748\",\n    \"RBP\": \"0x6162636465666768\",\n    \"R8\": \"0x4142434445464748\",\n    \"R9\": \"0x4142434445464748\",\n    \"R10\": \"0x0000000000000056\",\n    \"R11\": \"0x4142434445464748\",\n    \"R12\": \"0x4142434445464748\",\n    \"R13\": \"0x0000000000004748\",\n    \"R14\": \"0x0000000045464748\",\n    \"R15\": \"0x6162636465666768\",\n    \"XMM0\": [\"0x5152535455565758\", \"0x4142434445464748\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x6162636465666768\"],\n    \"XMM2\": [\"0x5152535455564858\", \"0x6162636465666768\"],\n    \"XMM3\": [\"0x5152535455565758\", \"0x4142434445464748\"],\n    \"XMM4\": [\"0x4142434445464748\", \"0x6162636465666768\"],\n    \"XMM5\": [\"0x4546474855565758\", \"0x6162636465666768\"],\n    \"XMM6\": [\"0x5152535455565758\", \"0x4142434445464748\"],\n    \"XMM7\": [\"0x5152535447485758\", \"0x6162636465666768\"],\n    \"XMM8\": [\"0x5152535455565758\", \"0x4142434445464748\"],\n    \"XMM9\": [\"0x4142434445464748\", \"0x4142434445464748\"],\n    \"XMM10\": [\"0x5152535455564858\", \"0x6162636465666768\"],\n    \"XMM11\": [\"0x5152535455565758\", \"0x4142434445464748\"],\n    \"XMM12\": [\"0x4142434445464748\", \"0x4142434445464748\"],\n    \"XMM13\": [\"0x4546474855565758\", \"0x6162636465666768\"],\n    \"XMM14\": [\"0x5152535455565758\", \"0x4142434445464748\"],\n    \"XMM15\": [\"0x5152535447485758\", \"0x6162636465666768\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; FEX-Emu had a bug where TLS vector element loadstores weren't correctly prefixing the segment on the address.\n; This caused a crash in the game Halls of Torment (steamid 2218750) where it had some TLS vector data loaded with movhps.\n; This tests all the vector element loadstores that FEX had missed.\n\n; Setup TLS segment\nmov rax, 0xe000_0000\nwrgsbase rax\n\nmovups xmm0, [rel .data_setup]\nmovups xmm1, [rel .data_setup]\nmovups xmm2, [rel .data_setup]\nmovups xmm3, [rel .data_setup]\nmovups xmm4, [rel .data_setup]\nmovups xmm5, [rel .data_setup]\nmovups xmm6, [rel .data_setup]\nmovups xmm7, [rel .data_setup]\nmovups xmm8, [rel .data_setup]\nmovups xmm9, [rel .data_setup]\nmovups xmm10, [rel .data_setup]\nmovups xmm11, [rel .data_setup]\nmovups xmm12, [rel .data_setup]\nmovups xmm13, [rel .data_setup]\nmovups xmm14, [rel .data_setup]\nmovups xmm15, [rel .data_setup]\n\nmov rax, [rel .data]\nmov [gs:0], rax\n\njmp .test\n.test:\n\n; SSE loads\nmovhps xmm0, [gs:0]\nmovlps xmm1, [gs:0]\npinsrb xmm2, [gs:0], 1\nmovhpd xmm3, [gs:0]\nmovlpd xmm4, [gs:0]\npinsrd xmm5, [gs:0], 1\npinsrq xmm6, [gs:0], 1\npinsrw xmm7, [gs:0], 1\n\n; AVX loads\nvmovhps xmm8, xmm0, [gs:0]\nvmovlps xmm9, xmm0, [gs:0]\nvpinsrb xmm10, [gs:0], 1\nvmovhpd xmm11, xmm0, [gs:0]\nvmovlpd xmm12, xmm0, [gs:0]\nvpinsrd xmm13, [gs:0], 1\nvpinsrq xmm14, [gs:0], 1\nvpinsrw xmm15, [gs:0], 1\n\n; SSE stores\nmovhps [gs:(0 * 8)], xmm0\nmovlps [gs:(1 * 8)], xmm1\npextrb [gs:(2 * 8)], xmm2, 2\nmovhpd [gs:(3 * 8)], xmm3\nmovlpd [gs:(4 * 8)], xmm4\npextrw [gs:(5 * 8)], xmm5, 2\npextrd [gs:(6 * 8)], xmm6, 2\npextrq [gs:(7 * 8)], xmm7, 1\n\n; AVX stores\nvmovhps [gs:(8 * 8)], xmm0\nvmovlps [gs:(9 * 8)], xmm1\nvpextrb [gs:(10 * 8)], xmm2, 2\nvmovhpd [gs:(11 * 8)], xmm3\nvmovlpd [gs:(12 * 8)], xmm4\nvpextrw [gs:(13 * 8)], xmm5, 2\nvpextrd [gs:(14 * 8)], xmm6, 2\nvpextrq [gs:(15 * 8)], xmm7, 1\n\n; Load the results back in to GPRs\nmov rax, [gs:(0 * 8)]\nmov rbx, [gs:(1 * 8)]\nmov rcx, [gs:(2 * 8)]\nmov rdx, [gs:(3 * 8)]\nmov rdi, [gs:(4 * 8)]\nmov rsi, [gs:(5 * 8)]\nmov rsp, [gs:(6 * 8)]\nmov rbp, [gs:(7 * 8)]\nmov r8, [gs:(8 * 8)]\nmov r9, [gs:(9 * 8)]\nmov r10, [gs:(10 * 8)]\nmov r11, [gs:(11 * 8)]\nmov r12, [gs:(12 * 8)]\nmov r13, [gs:(13 * 8)]\nmov r14, [gs:(14 * 8)]\nmov r15, [gs:(15 * 8)]\n\nhlt\n\n.data:\ndq 0x4142434445464748\n\n.data_setup:\ndq 0x5152535455565758, 0x6162636465666768\n\n.data_result:\ndq 0, 0, 0, 0, 0, 0, 0, 0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/vcvtdq2ps_incorrect_size.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; FEX-Emu had a bug in the vcvtdq2ps and vcvtdq2pd instruction where it was incorrectly generating a 256-bit IR operation.\n; Due to a quirk of the IR operation handling, this instruction was actually handled \"correctly\" as a 128-bit operation.\n; The problem occured once there was enough live registers to cause spilling, and the register spiller tries to spill the full result.\n; The full result in this case was described as a 256-bit operation when it was supposed to be only a 128-bit operation.\n; This was found in `Aperture Desk Job` in `libphonon.so` in function `own_ipps_sLn_L9LAynn`.\njmp .test\n\n.test:\nvmovups ymm4,  [rel data_7ffde364df00]\nvmovups ymm5,  [rel data_7ffde364df00]\nvmovups ymm6,  [rel data_7ffde364df00]\nvmovups ymm7,  [rel data_7ffde364df00]\nvmovups ymm8,  [rel data_7ffde364df00]\nvmovups ymm9,  [rel data_7ffde364df00]\nvmovups ymm10,  [rel data_7ffde364df00]\nvmovups ymm11,  [rel data_7ffde364df00]\n\nvpsubd  ymm12, ymm0, ymm4\nvpsubd  ymm13, ymm1, ymm4\nvcvtdq2ps ymm2, ymm2\nvcvtdq2ps ymm14, ymm14\nvmovmskps ecx, ymm15\nhlt\n\nalign 32\ndata_7ffde364df00:\ndq 0, 0, 0, 0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/vgather_xmm4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; FEX had a bug where VSIB indexing wasn't allow xmm4/ymm4 to be encoded inside of the VSIB due to legacy SIB behaviour\n; This ensures that VSIB with xmm4 is allowed to work.\n; 128-bit\n; 1x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\n\n; Zero mask\nvmovaps xmm4, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherdps xmm15, [xmm4 * 1 + rax], xmm1\n\nhlt\n\nalign 32\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/vmov_size_test.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0\", \"0\", \"0\"],\n    \"XMM1\":  [\"0x4142434445464748\", \"0\", \"0x7172737475767778\", \"0x8182838485868788\"],\n    \"XMM2\":  [\"0x0000000041424344\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x0000000041424344\", \"0\", \"0x7172737475767778\", \"0x8182838485868788\"]\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  }\n}\n%endif\n\n; FEX-Emu had a bug where vmovq was loading 128-bits worth of data instead of 64-bits.\n; This ensures that {v,}mov{d,q} all load the correct amount of data through a test that will fault if it loads too much.\n\n; Address at the last eight bytes\nmov rax, 0x100000000 + 4096-8\n\n; Address at the last 4 bytes\nmov rbx, 0x100000000 + 4096-4\n\nmov rcx, 0x4142434445464748\n\n; Store data using GPR\nmov [rax], rcx\n\n; Setup vector with data\nvmovaps ymm0, [rel .data]\nvmovaps ymm1, [rel .data]\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data]\n\n; 64-bit tests\n\n; Load with vmovq to ensure we don't try loading too much data\nvmovq xmm0, qword [rax]\n\n; Also test SSE2 version\nmovq xmm1, qword [rax]\n\n; Also test MOVQ stores\nvmovq qword [rax], xmm0\n\n; Also test SSE2 version\nmovq qword [rax], xmm1\n\n; 32-bit tests\n; Load with vmovq to ensure we don't try loading too much data\nvmovd xmm2, dword [rbx]\n\n; Also test SSE2 version\nmovd xmm3, dword [rbx]\n\n; Also test MOVD stores\nvmovd dword [rbx], xmm2\n\n; Also test SSE2 version\nmovd dword [rbx], xmm3\n\nhlt\n\nalign 32\n.data:\ndq 0x5152535455565758, 0x6162636465666768\ndq 0x7172737475767778, 0x8182838485868788\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/vroundscalar_sve256.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x818283843f800000\", \"0x9192939495969798\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\n; FEX-Emu had a bug in its 256-bit SVE implementation of AVX where scalar round with insert wasn't inserting correctly.\n; This tests to ensure that the sources are merged correctly.\nvmovaps ymm0, [rel .data_trash]\nvmovaps ymm1, [rel .data_trash + 32]\n\nvroundss xmm0, xmm1, [rel .data], 00000010b ; +inf\n\nhlt\n\nalign 4096\n.data:\ndd 0.5, -0.5, 1.5, -1.5\ndd 0.5, -0.5, 1.5, -1.5\n\n.data_trash:\ndq 0x4142434445464748, 0x5152535455565758\ndq 0x6162636465666768, 0x7172737475767778\ndq 0x8182838485868788, 0x9192939495969798\ndq 0xA1A2A3A4A5A6A7A8, 0xB1B2B3B4B5B6B7B8\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/x87DecrementStackBug.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4000000000000000\", \"0\"]\n  }\n}\n%endif\n\n; FEX-Emu contains a bug. It's the buggiest bug that ever bugged. Something about conflicting results between fxch and fincstp.\nfld tword [rel .data1]\nfld tword [rel .data2]\nfld tword [rel .data3]\nfld tword [rel .data4]\nfld tword [rel .data5]\nfld tword [rel .data6]\nfld tword [rel .data7]\nfld tword [rel .data8]\n\njmp .test\n\n.test:\nfxch st0, st1\nfdecstp\n\njmp .end\n.end:\n\nfstp qword [rel .data_result]\nmovups xmm0, [rel .data_result]\n\nhlt\n\nalign 4096\n.data1:\ndt 2.0\ndq 0\n\n.data2:\ndt 4.0\ndq 0\n\n.data3:\ndt 8.0\ndq 0\n\n.data4:\ndt 16.0\ndq 0\n\n.data5:\ndt 32.0\ndq 0\n\n.data6:\ndt 64.0\ndq 0\n\n.data7:\ndt 128.0\ndq 0\n\n.data8:\ndt 256.0\ndq 0\n\n.data_result:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/x87IncrementStackBug.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4010000000000000\", \"0\"]\n  }\n}\n%endif\n\n; FEX-Emu contains a bug. It's the buggiest bug that ever bugged. Something about conflicting results between fxch and fincstp.\nfld tword [rel .data1]\nfld tword [rel .data2]\n\n; ST(0) contains 4.0\n; ST(1) contains 2.0\n\njmp .test\n\n.test:\nfxch st0, st1\n; ST(0) now contains 2.0\n; ST(1) now contains 4.0\n\nfincstp\n; ST(0) now contains 4.0\n; ST(7) now contains 2.0\n\njmp .end\n.end:\n\nfstp qword [rel .data_result]\nmovups xmm0, [rel .data_result]\n\nhlt\n\nalign 4096\n; This or zero are incorrect results\n.data1:\ndt 2.0\ndq 0\n\n; Correct result\n.data2:\ndt 4.0\ndq 0\n\n.data_result:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/x87_fprem.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41582d3bc0000000\",\n    \"RBX\": \"0x41582d3bc0000000\",\n    \"RCX\": \"0xc1582d3bc0000000\",\n    \"RDX\": \"0xc1582d3bc0000000\",\n    \"RDI\": \"0x42d2f6b36dfc3bc0\",\n    \"RSI\": \"0x42d2f6b36dfc3bc0\",\n    \"RBP\": \"0xc2d2f6b36dfc3bc0\",\n    \"RSP\": \"0xc2d2f6b36dfc3bc0\"\n  }\n}\n%endif\n\n; FEX-Emu had a bug in the fprem implementation where it was behaving like fprem1\n; Do a handful of large fprem operations to ensure it works correctly.\n\n; 64-bit float memory locations\n; doremainder <result>, <src1>, <src2>\n%macro doremainder 3\n  ; Load big number and divisor\n  fld qword %3\n  fld qword %2\n\n  ; For large remainders, x86 fprem computes partial remainders and needs to run multiple times.\n  %%again:\n    ; Get the remainder\n    fprem\n    ; Check if we need to run again\n    fnstsw ax\n    test ah, 0x4\n    jne %%again\n\n  ; Pop one value\n  fstp st1\n\n  ; Store the result\n  fstp qword %1\n%endmacro\n\n; Do a handful of remainder checks with different sign combinations.\ndoremainder [rel .data_result + (8 * 0)], [rel .data_big], [rel .data_divisor]\ndoremainder [rel .data_result + (8 * 1)], [rel .data_big], [rel .data_divisor_negative]\ndoremainder [rel .data_result + (8 * 2)], [rel .data_big_negative], [rel .data_divisor]\ndoremainder [rel .data_result + (8 * 3)], [rel .data_big_negative], [rel .data_divisor_negative]\n\n; Test infinities as well\ndoremainder [rel .data_result + (8 * 4)], [rel .data_big], [rel .data_inf]\ndoremainder [rel .data_result + (8 * 5)], [rel .data_big], [rel .data_inf_negative]\ndoremainder [rel .data_result + (8 * 6)], [rel .data_big_negative], [rel .data_inf]\ndoremainder [rel .data_result + (8 * 7)], [rel .data_big_negative], [rel .data_inf_negative]\n\n; Load the results in to registers\nmov rax, qword [rel .data_result + (8 * 0)]\nmov rbx, qword [rel .data_result + (8 * 1)]\nmov rcx, qword [rel .data_result + (8 * 2)]\nmov rdx, qword [rel .data_result + (8 * 3)]\nmov rdi, qword [rel .data_result + (8 * 4)]\nmov rsi, qword [rel .data_result + (8 * 5)]\nmov rbp, qword [rel .data_result + (8 * 6)]\nmov rsp, qword [rel .data_result + (8 * 7)]\n\nhlt\n\nalign 4096\n.data_big:\ndq 83403126337775.0\n\n.data_big_negative:\ndq -83403126337775.0\n\n.data_divisor:\ndq 10000000.0\n\n.data_divisor_negative:\ndq -10000000.0\n\n%define Inf __?Infinity?__\n.data_inf:\ndq Inf\n\n.data_inf_negative:\ndq -Inf\n\n.data_result:\ndq 0, 0, 0, 0, 0, 0, 0, 0\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/x87_integer_indefinite.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x8000\",\n    \"RBX\": \"0x8000\",\n    \"RCX\": \"0x80000000\",\n    \"RDX\": \"0x80000000\",\n    \"RSI\": \"0x8000000000000000\",\n    \"RDI\": \"0x8000000000000000\"\n  }\n}\n%endif\n\n; FEX-Emu had a bug where x87 float to integer conversions weren't converting to the correct \"integer indefinite\" value for 16-bit conversions.\n; Test 16-bit, 32-bit, and 64-bit to ensure correct \"integer indefinite\" results for all.\n; The definition for \"integer indefinite\" is the smallest negative integer that can be represented.\n; This is regardless of the input value being positive or negative.\nfninit\n\n; 16-bit\nfld qword [rel .double_larger_than_int16]\nfistp word [rel .data_res_pos_16]\n\nfld qword [rel .double_smaller_than_int16]\nfistp word [rel .data_res_neg_16]\n\n; 32-bit\nfld qword [rel .double_larger_than_int32]\nfistp dword [rel .data_res_pos_32]\n\nfld qword [rel .double_smaller_than_int32]\nfistp dword [rel .data_res_neg_32]\n\n; 64-bit\nfld qword [rel .double_larger_than_int64]\nfistp qword [rel .data_res_pos_64]\n\nfld qword [rel .double_smaller_than_int64]\nfistp qword [rel .data_res_neg_64]\n\n; Load the results\nmovzx rax, word [rel .data_res_pos_16]\nmovzx rbx, word [rel .data_res_neg_16]\n\nmov ecx, dword [rel .data_res_pos_32]\nmov edx, dword [rel .data_res_neg_32]\n\nmov rsi, qword [rel .data_res_pos_64]\nmov rdi, qword [rel .data_res_neg_64]\n\nhlt\n\nalign 4096\n; One-integer larger than what int16_t can hold\n.double_larger_than_int16:\ndq 32768.0\n; One-integer smaller than what int16_t can hold\n.double_smaller_than_int16:\ndq -32769.0\n\n; One-integer larger than what int32_t can hold\n.double_larger_than_int32:\ndq 2147483648.0\n; One-integer smaller than what int32_t can hold\n.double_smaller_than_int32:\ndq -2147483649.0\n\n; One-integer larger than what int64_t can hold\n.double_larger_than_int64:\ndq 9223372036854775808.0\n; One-integer smaller than what int64_t can hold\n.double_smaller_than_int64:\ndq -9223372036854775809.0\n\n.data_res_pos_16:\ndw -1\n.data_res_neg_16:\ndw -1\n\n.data_res_pos_32:\ndd -1\n.data_res_neg_32:\ndd -1\n\n.data_res_pos_64:\ndq -1\n.data_res_neg_64:\ndq -1\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/x87_unordered_cmp_fix.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000cafecafe\"\n  }\n}\n%endif\n\n; IsNan() couldn't detect negative NaNs (sign bit set in exponent field).\n; This caused __builtin_isunordered() to return wrong values.\n\nmov rsp, 0xe000_1000\n\n; Test 1: __builtin_isunordered(1.0, 2.0) should return 0\n; Pattern: fucomip + setp + test for 0\nfld1\nlea rdx, [rel two]\nfld tword [rdx]\nfucomip st1\nsetp al\nmovzx eax, al\ntest eax, eax\njnz test_failed         ; If not 0, test failed (should be ordered)\n\n; Test 2: __builtin_isunordered(1.0, NaN) should return 1  \nfld1\nlea rdx, [rel qnan]\nfld tword [rdx]\nfucomip st1\nsetp al\nmovzx eax, al\ntest eax, eax\njz test_failed          ; If 0, test failed (should be unordered)\n\n; Test 3: __builtin_isunordered(NaN, 1.0) should return 1\nlea rdx, [rel qnan]\nfld tword [rdx]\nfld1\nfucomip st1\nsetp al\nmovzx eax, al\ntest eax, eax\njz test_failed          ; If 0, test failed (should be unordered)\n\n; Test 4: __builtin_isunordered(2.0, 2.0) should return 0 (equal case)\nlea rdx, [rel two]\nfld tword [rdx]\nlea rdx, [rel two]  \nfld tword [rdx]\nfucomip st1\nsetp al\nmovzx eax, al\ntest eax, eax\njnz test_failed         ; If not 0, test failed (should be ordered)\n\n; All tests passed\nmov rax, 0xcafecafe\nhlt\n\ntest_failed:\n; Test failed \nmov rax, 0xdeadbeef\nhlt\n\nalign 8\ntwo:\n  dt 2.0\n\nalign 8  \nqnan:\n  dq 0xC000000000000000  ; Quiet NaN with only quiet bit set (no bottom 62 bits) - this breaks IsNan\n  dw 0x7FFF              ; Standard NaN exponent (0x7FFF)"
  },
  {
    "path": "unittests/ASM/FEX_bugs/xor_flags.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000000004600\"\n  }\n}\n%endif\n\n; FEX had a bug where an optimization for canonical zeroing of a register would fail to set flags correctly.\n; This broke `Metal Gear Rising: Revengeance`. The title screen geometry was broken.\n\nmov rax, 0\nmov rbx, 0\nsahf\nxor rbx, rbx\nlahf\nhlt\n"
  },
  {
    "path": "unittests/ASM/FEX_bugs/zero-ah.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"0x0\"\n  }\n}\n%endif\n\n; FEX had a bug where `mov ah, 0` and `xor ah, ah` would zero the wrong register\n; subpart.\n\nmov al, 127\nmov ah, 234\nmov ah, 0\n\ncmp al, 127\njne fexi_fexi_im_so_broken\ncmp ah, 0\njne fexi_fexi_im_so_broken\n\nmov al, 127\nmov ah, 234\nxor ah, ah\n\ncmp al, 127\njne fexi_fexi_im_so_broken\ncmp ah, 0\njne fexi_fexi_im_so_broken\n\nmov ecx, 0\nhlt\n\nfexi_fexi_im_so_broken:\nmov ecx, 0xdeadbeef\nhlt\n"
  },
  {
    "path": "unittests/ASM/Flags/Shift.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R12\": \"0x55\",\n    \"R13\": \"0x890\",\n    \"R14\": \"0x55\"\n  }\n}\n%endif\n\nmov rsi, 0xe0000080\nmov rsp, 0xe0001000\n\n; Zero shift amount\nxor ecx, ecx\n\n; Zero all flags\nxor eax, eax\npush rax\npopfq\n\nmov r8b, 255\nmov r10b, 127\nmov r11b, 1\n\n\nadd r8b, r11b ; Sets CF, ZF, PF, AF, zeroes OF, SF\n; Shift by zero, flags should be unaffected\n; This tests that we didn't optimize away the flag calculations of the add\nshl rax, cl\n\n; Ensure we can't predict the next block\nlea rdi, [rel .next]\nmov [rsi - 8], rdi\njmp [rsi - 8]\n\n.next:\npushfq\npop r12\n\n; Mask with flags we care about\nand r12, 0x8d5\n\nadd r10b, r11b ; Sets OF, SF, AF, zeroes ZF, CF, PF\nshr rax, cl\n\nlea rdi, [rel .next2]\nmov [rsi - 8], rdi\njmp [rsi - 8]\n\n.next2:\npushfq\npop r13\nand r13, 0x8d5\n\nmov r8b, 255\nadd r8b, r11b ; Sets CF, ZF, PF, AF, zeroes OF, SF\nsar rax, cl\n\nlea rdi, [rel .next3]\nmov [rsi - 8], rdi\njmp [rsi - 8]\n\n.next3:\npushfq\npop r14\nand r14, 0x8d5\n\nhlt"
  },
  {
    "path": "unittests/ASM/GameTests/EnderLiliesFlash.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x408000003f800000\", \"0\"],\n    \"XMM1\": [\"0x400000003f800000\", \"0x4080000040400000\"]\n  }\n}\n%endif\n\n; This bug was encountered in Ender Lilies, when an enemy attacked the player character there was a chance for a black screen flash.\n; This was due to a bug in FEX's `ZextAndMaskingElimination` pass which tries to remove useless vmov IR operations.\n; It incorrectly removed vmov IR operations that were explicitly zero extending vectors.\n; This vmov IR operation was generated by the movq instruction because the upper bits must be zero.\n; When vmov was removed, it would no longer zero the upper 64-bits, which left data in the register.\n; This results in a bad calculation.\nmovaps  xmm1, [rel .data_1]\nmovq    xmm0, xmm1\nmulps   xmm0, [rel .data_1]\n\nhlt\n\nalign 16\n.data_1:\ndd 1.0, 2.0, 3.0, 4.0\n"
  },
  {
    "path": "unittests/ASM/H0F38/0_F0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x4142434445465857\",\n    \"R14\": \"0x0000000058575655\",\n    \"R13\": \"0x5857565554535251\"\n  },\n  \"HostFeatures\": [\"MOVBE\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov r15, [rdx + 8 * 0]\nmov r14, [rdx + 8 * 0]\nmov r13, [rdx + 8 * 0]\n\nmovbe r15w, word [rdx + 8 * 1]\nmovbe r14d, dword [rdx + 8 * 1]\nmovbe r13,  qword [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/0_F1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x4142434445465857\",\n    \"R14\": \"0x4142434458575655\",\n    \"R13\": \"0x5857565554535251\"\n  },\n  \"HostFeatures\": [\"MOVBE\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 0], rax\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov r15, [rdx + 8 * 0]\nmov r14, [rdx + 8 * 0]\nmov r13, [rdx + 8 * 0]\n\nmovbe word [rdx + 8 * 1], r15w\nmovbe dword [rdx + 8 * 2], r14d\nmovbe qword [rdx + 8 * 3], r13\n\nmov r15, [rdx + 8 * 1]\nmov r14, [rdx + 8 * 2]\nmov r13, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4848484848484848\", \"0x4848484848484848\"],\n    \"XMM1\": [\"0x0\", \"0x0\"],\n    \"XMM2\": [\"0x0\", \"0x0\"],\n    \"XMM3\": [\"0x4847464544434241\", \"0x5857565554535251\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov rax, -1\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x8080808080808080\nmov [rdx + 8 * 6], rax\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x0001020304050607\nmov [rdx + 8 * 8], rax\nmov rax, 0x08090A0B0C0D0E0F\nmov [rdx + 8 * 9], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 0]\nmovaps xmm2, [rdx + 8 * 0]\nmovaps xmm3, [rdx + 8 * 0]\n\npshufb xmm0, [rdx + 8 * 2]\npshufb xmm1, [rdx + 8 * 4]\npshufb xmm2, [rdx + 8 * 6]\npshufb xmm3, [rdx + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_00_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x5858585858585858\", \"0x5858585858585858\"],\n    \"XMM1\": [\"0x0\", \"0x0\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 0]\n\nlea rdx, [rel .data]\n\npshufb xmm0, [rdx + 8 * 0]\npshufb xmm1, [rdx + 8 * 2]\n\nhlt\n\nalign 8\n.data:\n; Test bits with trash data in reserved bits to ensure it is ignored\n; Select single element\ndq 0x7878787878787878\ndq 0x7878787878787878\n; Clear element\ndq 0xF0F0F0F0F0F0F0F0\ndq 0xF0F0F0F0F0F0F0F0\n\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xA4A6ACAE84868C8E\", \"0xE4E6ECEEC4C6CCCE\"],\n    \"XMM1\": [\"0xE4E6ECEEC4C6CCCE\", \"0xA4A6ACAE84868C8E\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 2]\n\nphaddw xmm0, [rdx + 8 * 2]\nphaddw xmm1, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xA6A8AAAC86888A8C\", \"0xE6E8EAECC6C8CACC\"],\n    \"XMM1\": [\"0xE6E8EAECC6C8CACC\", \"0xA6A8AAAC86888A8C\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 2]\n\nphaddd xmm0, [rdx + 8 * 2]\nphaddd xmm1, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x7FFF7FFF7FFF7FFF\", \"0x800080007FFF7FFF\"],\n    \"XMM1\": [\"0x800080007FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\"],\n    \"XMM2\": [\"0x71836D874331472D\", \"0x800080007FFF7FFF\"],\n    \"XMM3\": [\"0x800080007FFF7FFF\", \"0x71836D874331472D\"],\n    \"XMM4\": [\"0x7FFF7FFF7FFF7FFF\", \"0x71836D874331472D\"],\n    \"XMM5\": [\"0x800080007FFF7FFF\", \"0x800080007FFF7FFF\"],\n    \"XMM6\": [\"0x71836D874331472D\", \"0x800080007FFF7FFF\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x7F7F7F7F7F7F7F7F\nmov [rdx + 8 * 2], rax\nmov rax, 0x8080808080808080\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x2119221823172416\nmov [rdx + 8 * 4], rax\nmov rax, 0x3941384237433644\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x7F7F7F7F7F7F7F7F\nmov [rdx + 8 * 6], rax\nmov rax, 0x8080808080808080\nmov [rdx + 8 * 7], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 2]\nmovaps xmm2, [rdx + 8 * 4]\nmovaps xmm3, [rdx + 8 * 6]\nmovaps xmm4, [rdx + 8 * 0]\nmovaps xmm5, [rdx + 8 * 2]\nmovaps xmm6, [rdx + 8 * 4]\n\nphaddsw xmm0, [rdx + 8 * 2]\nphaddsw xmm1, [rdx + 8 * 0]\n\nphaddsw xmm2, [rdx + 8 * 2]\nphaddsw xmm3, [rdx + 8 * 4]\n\nphaddsw xmm4, [rdx + 8 * 4]\nphaddsw xmm5, [rdx + 8 * 6]\n\nphaddsw xmm6, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0\", \"0x0\"],\n    \"XMM1\": [\"0xFE02FE02FE02FE02\", \"0xFE02FE02FE02FE02\"],\n    \"XMM2\": [\"0x7E027E027E027E02\", \"0x7E027E027E027E02\"],\n    \"XMM3\": [\"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\"],\n    \"XMM4\": [\"0x057306BC07B808B8\", \"0xBC53BC0EBAE5BA2E\"],\n    \"XMM5\": [\"0xA473A5BCA6B8A7B8\", \"0x0553070E07E5092E\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\n\nmov rax, -1\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x7F7F7F7F7F7F7F7F\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x8141824383448445\nmov [rdx + 8 * 6], rax\nmov rax, 0x21F223F323F424F5\nmov [rdx + 8 * 7], rax\n\nmov rax, 0xE251E352E453E554\nmov [rdx + 8 * 8], rax\nmov rax, 0x71A972A873A774A6\nmov [rdx + 8 * 9], rax\n\n; Zero\nmovaps xmm0, [rdx + 8 * 0]\npmaddubsw xmm0, [rdx + 8 * 0]\n\n; -1\nmovaps xmm1, [rdx + 8 * 2]\npmaddubsw xmm1, [rdx + 8 * 2]\n\n; 127\nmovaps xmm2, [rdx + 8 * 4]\npmaddubsw xmm2, [rdx + 8 * 4]\n\n; 255 and 127\nmovaps xmm3, [rdx + 8 * 2]\npmaddubsw xmm3, [rdx + 8 * 4]\n\n; Mixture\nmovaps xmm4, [rdx + 8 * 6]\npmaddubsw xmm4, [rdx + 8 * 8]\n\nmovaps xmm5, [rdx + 8 * 8]\npmaddubsw xmm5, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xF202F20212021202\", \"0x0202020202020202\"],\n    \"XMM1\": [\"0x0202020202020202\", \"0xF202F20212021202\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x5142634475468748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152435435562758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6172637465766778\nmov [rdx + 8 * 2], rax\nmov rax, 0x7162736475667768\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 2]\n\nphsubw xmm0, [rdx + 8 * 2]\nphsubw xmm1, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xE403E40424042404\", \"0x0404040404040404\"],\n    \"XMM1\": [\"0x0404040404040404\", \"0xE403E40424042404\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x5142634475468748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152435435562758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6172637465766778\nmov [rdx + 8 * 2], rax\nmov rax, 0x7162736475667768\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 2]\n\nphsubd xmm0, [rdx + 8 * 2]\nphsubd xmm1, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0202020202020202\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x0000000000000000\", \"0x0202020202020202\"],\n    \"XMM2\": [\"0xFF01FF0100FF00FF\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x0000000000000000\", \"0xFF01FF0100FF00FF\"],\n    \"XMM4\": [\"0x0202020202020202\", \"0xFF01FF0100FF00FF\"],\n    \"XMM5\": [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0xFF01FF0100FF00FF\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x800080007FFF7FFF\", \"0x800080007FFF7FFF\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x7F7F7F7F7F7F7F7F\nmov [rdx + 8 * 2], rax\nmov rax, 0x8080808080808080\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x2119221823172416\nmov [rdx + 8 * 4], rax\nmov rax, 0x3941384237433644\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x7F7F7F7F7F7F7F7F\nmov [rdx + 8 * 6], rax\nmov rax, 0x8080808080808080\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x00007FFF00007FFF\nmov [rdx + 8 * 8], rax\nmov rax, 0x7FFFFFFF7FFFFFFF\nmov [rdx + 8 * 9], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 2]\nmovaps xmm2, [rdx + 8 * 4]\nmovaps xmm3, [rdx + 8 * 6]\nmovaps xmm4, [rdx + 8 * 0]\nmovaps xmm5, [rdx + 8 * 2]\nmovaps xmm6, [rdx + 8 * 4]\n\nmovaps xmm7, [rdx + 8 * 8]\n\nphsubsw xmm0, [rdx + 8 * 2]\nphsubsw xmm1, [rdx + 8 * 0]\n\nphsubsw xmm2, [rdx + 8 * 2]\nphsubsw xmm3, [rdx + 8 * 4]\n\nphsubsw xmm4, [rdx + 8 * 4]\nphsubsw xmm5, [rdx + 8 * 6]\n\nphsubsw xmm6, [rdx + 8 * 6]\n\nphsubsw xmm7, [rdx + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_08.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0\", \"0x0\"],\n    \"XMM1\": [\"0xFEFEFEFEFEFEFEFE\", \"0xFDFDFDFDFDFDFDFD\"],\n    \"XMM2\": [\"0x0202020202020202\", \"0x0303030303030303\"],\n    \"XMM3\": [\"0xFEFEFEFE00000000\", \"0x03030303FD000300\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0101010101010101\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, 0xFFFFFFFF00000000\nmov [rdx + 8 * 6], rax\nmov rax, 0x01010101FF000100\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x0202020202020202\nmov [rdx + 8 * 8], rax\nmov rax, 0x0303030303030303\nmov [rdx + 8 * 9], rax\n\nmovaps xmm0, [rdx + 8 * 8]\nmovaps xmm1, [rdx + 8 * 8]\nmovaps xmm2, [rdx + 8 * 8]\nmovaps xmm3, [rdx + 8 * 8]\n\n; Test with full zero\npsignb xmm0, [rdx + 8 * 0]\n\n; Test with full negative\npsignb xmm1, [rdx + 8 * 2]\n\n; Test with full positive\npsignb xmm2, [rdx + 8 * 4]\n\n; Test a mix\npsignb xmm3, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_09.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0\", \"0x0\"],\n    \"XMM1\": [\"0xFDFEFDFEFDFEFDFE\", \"0xFCFDFCFDFCFDFCFD\"],\n    \"XMM2\": [\"0x0202020202020202\", \"0x0303030303030303\"],\n    \"XMM3\": [\"0xFDFEFDFE00000000\", \"0x03030303FCFD0000\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0001000100010001\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, 0xFFFFFFFF00000000\nmov [rdx + 8 * 6], rax\nmov rax, 0x00010001FFFF0000\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x0202020202020202\nmov [rdx + 8 * 8], rax\nmov rax, 0x0303030303030303\nmov [rdx + 8 * 9], rax\n\nmovaps xmm0, [rdx + 8 * 8]\nmovaps xmm1, [rdx + 8 * 8]\nmovaps xmm2, [rdx + 8 * 8]\nmovaps xmm3, [rdx + 8 * 8]\n\n; Test with full zero\npsignw xmm0, [rdx + 8 * 0]\n\n; Test with full negative\npsignw xmm1, [rdx + 8 * 2]\n\n; Test with full positive\npsignw xmm2, [rdx + 8 * 4]\n\n; Test a mix\npsignw xmm3, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_0A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0\", \"0x0\"],\n    \"XMM1\": [\"0xFDFDFDFEFDFDFDFE\", \"0xFCFCFCFDFCFCFCFD\"],\n    \"XMM2\": [\"0x0202020202020202\", \"0x0303030303030303\"],\n    \"XMM3\": [\"0xFDFDFDFE00000000\", \"0x03030303FCFCFCFD\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0000000100000001\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, 0xFFFFFFFF00000000\nmov [rdx + 8 * 6], rax\nmov rax, 0x00000001FFFFFFFF\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x0202020202020202\nmov [rdx + 8 * 8], rax\nmov rax, 0x0303030303030303\nmov [rdx + 8 * 9], rax\n\nmovaps xmm0, [rdx + 8 * 8]\nmovaps xmm1, [rdx + 8 * 8]\nmovaps xmm2, [rdx + 8 * 8]\nmovaps xmm3, [rdx + 8 * 8]\n\n; Test with full zero\npsignd xmm0, [rdx + 8 * 0]\n\n; Test with full negative\npsignd xmm1, [rdx + 8 * 2]\n\n; Test with full positive\npsignd xmm2, [rdx + 8 * 4]\n\n; Test a mix\npsignd xmm3, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_0B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x31A6343B36E09E7A\", \"0x48134B294E4F5186\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445468748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\n\npmulhrsw xmm0, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_10.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\": [\"0x48510f254d2f5b7f\", \"0x2b5774313ad348ea\"],\n    \"XMM2\": [\"0x30a9567b1f6d776b\", \"0x673d5d0730c6762c\"],\n    \"XMM3\": [\"0x41159b533d5b4c09\", \"0xca64724c74043978\"],\n    \"XMM4\": [\"0x24426b4c72f2101c\", \"0x656780205f15c767\"],\n    \"XMM5\": [\"0x4f1694df78236612\", \"0x19826b033d3c78c0\"],\n    \"XMM6\": [\"0x00f9589268e0127f\", \"0x1e7d27031e881972\"],\n    \"XMM7\": [\"0x1c4c4322f8f65504\", \"0x07f565f98b1bb7bc\"],\n    \"XMM8\": [\"0x10c41f28710f2147\", \"0x09925e327f5e2938\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\nlea rdi, [rel .mask]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\n\n; pblend uses xmm0 implicitly\nmovaps xmm0, [rdx + 16 * 0]\npblendvb xmm1, [rdx + 16 * 8]\nmovaps xmm0, [rdx + 16 * 1]\npblendvb xmm2, [rdx + 16 * 9]\nmovaps xmm0, [rdx + 16 * 2]\npblendvb xmm3, [rdx + 16 * 10]\nmovaps xmm0, [rdx + 16 * 3]\npblendvb xmm4, [rdx + 16 * 11]\nmovaps xmm0, [rdx + 16 * 4]\npblendvb xmm5, [rdx + 16 * 12]\nmovaps xmm0, [rdx + 16 * 5]\npblendvb xmm6, [rdx + 16 * 13]\nmovaps xmm0, [rdx + 16 * 6]\npblendvb xmm7, [rdx + 16 * 14]\nmovaps xmm0, [rdx + 16 * 7]\npblendvb xmm8, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n.mask:\ndb 0xb5, 0xdb, 0xca, 0x08, 0x0a, 0xae, 0x17, 0xb6, 0x54, 0x0d, 0xd3, 0xa1, 0x1d, 0x28, 0x25, 0xd3\ndb 0x02, 0xf5, 0xce, 0x94, 0x2e, 0x56, 0x01, 0xf4, 0xae, 0x81, 0xbe, 0x50, 0x70, 0x45, 0x83, 0x18\ndb 0x33, 0x46, 0x60, 0x4e, 0x29, 0xe4, 0x49, 0xae, 0xc2, 0x0e, 0x70, 0xcd, 0x2a, 0x6f, 0xb8, 0x9d\ndb 0x47, 0x1e, 0x8e, 0x94, 0x81, 0xaa, 0x12, 0xe4, 0x8e, 0x77, 0x48, 0x34, 0x63, 0x8f, 0x4c, 0x57\ndb 0x34, 0xf9, 0x5b, 0x37, 0x76, 0x9f, 0xff, 0x8c, 0x6b, 0xf2, 0x6e, 0xd0, 0x15, 0x61, 0x4e, 0x0f\ndb 0xe2, 0xa7, 0xd0, 0x73, 0x7f, 0xf0, 0xae, 0xe7, 0x48, 0x32, 0x2a, 0x56, 0xc3, 0x29, 0x12, 0x4f\ndb 0x7d, 0x5b, 0x37, 0xc2, 0x83, 0x74, 0xd2, 0xf9, 0xcc, 0x98, 0x0a, 0x3c, 0x3c, 0x38, 0xd9, 0x4d\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_14.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\": [\"0x48510f254d2fa47f\", \"0x2b5774313a974886\"],\n    \"XMM2\": [\"0x30b556de1f6de86b\", \"0x67d29af330ae762c\"],\n    \"XMM3\": [\"0x41029b7f3de8ad09\", \"0xca79a24c7404b890\"],\n    \"XMM4\": [\"0x24426b4c72f110ad\", \"0x65f580205ffdc710\"],\n    \"XMM5\": [\"0x4f1694df78236612\", \"0x19a26b823d3ca2a9\"],\n    \"XMM6\": [\"0x00f658ab689712b0\", \"0x1ea627241ed21972\"],\n    \"XMM7\": [\"0x1c864322f8f69004\", \"0x07f565f98b8db7bc\"],\n    \"XMM8\": [\"0x10c41fa1710f2147\", \"0x099224327fb5ac38\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\nlea rdi, [rel .mask]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\n\n; pblend uses xmm0 implicitly\nmovaps xmm0, [rdx + 16 * 0]\nblendvps xmm1, [rdx + 16 * 8]\nmovaps xmm0, [rdx + 16 * 1]\nblendvps xmm2, [rdx + 16 * 9]\nmovaps xmm0, [rdx + 16 * 2]\nblendvps xmm3, [rdx + 16 * 10]\nmovaps xmm0, [rdx + 16 * 3]\nblendvps xmm4, [rdx + 16 * 11]\nmovaps xmm0, [rdx + 16 * 4]\nblendvps xmm5, [rdx + 16 * 12]\nmovaps xmm0, [rdx + 16 * 5]\nblendvps xmm6, [rdx + 16 * 13]\nmovaps xmm0, [rdx + 16 * 6]\nblendvps xmm7, [rdx + 16 * 14]\nmovaps xmm0, [rdx + 16 * 7]\nblendvps xmm8, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n.mask:\ndb 0xb5, 0xdb, 0xca, 0x08, 0x0a, 0xae, 0x17, 0xb6, 0x54, 0x0d, 0xd3, 0xa1, 0x1d, 0x28, 0x25, 0xd3\ndb 0x02, 0xf5, 0xce, 0x94, 0x2e, 0x56, 0x01, 0xf4, 0xae, 0x81, 0xbe, 0x50, 0x70, 0x45, 0x83, 0x18\ndb 0x33, 0x46, 0x60, 0x4e, 0x29, 0xe4, 0x49, 0xae, 0xc2, 0x0e, 0x70, 0xcd, 0x2a, 0x6f, 0xb8, 0x9d\ndb 0x47, 0x1e, 0x8e, 0x94, 0x81, 0xaa, 0x12, 0xe4, 0x8e, 0x77, 0x48, 0x34, 0x63, 0x8f, 0x4c, 0x57\ndb 0x34, 0xf9, 0x5b, 0x37, 0x76, 0x9f, 0xff, 0x8c, 0x6b, 0xf2, 0x6e, 0xd0, 0x15, 0x61, 0x4e, 0x0f\ndb 0xe2, 0xa7, 0xd0, 0x73, 0x7f, 0xf0, 0xae, 0xe7, 0x48, 0x32, 0x2a, 0x56, 0xc3, 0x29, 0x12, 0x4f\ndb 0x7d, 0x5b, 0x37, 0xc2, 0x83, 0x74, 0xd2, 0xf9, 0xcc, 0x98, 0x0a, 0x3c, 0x3c, 0x38, 0xd9, 0x4d\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_15.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\": [\"0x48510f254d2fa47f\", \"0x2b5774313a974886\"],\n    \"XMM2\": [\"0x30b556de1f6de86b\", \"0x67d29af330ae762c\"],\n    \"XMM3\": [\"0x41029b7f255b4cf4\", \"0xca79a24c3e9e3978\"],\n    \"XMM4\": [\"0x24426b4c72f110ad\", \"0x65f580205ffdc710\"],\n    \"XMM5\": [\"0x4f1694dfa8fb773c\", \"0x19a26b823d3ca2a9\"],\n    \"XMM6\": [\"0x00f658ab689712b0\", \"0x1ea62724c8883dfa\"],\n    \"XMM7\": [\"0x1c86432298df55c8\", \"0x07f565f98b8db7bc\"],\n    \"XMM8\": [\"0x10c41fa17837c17f\", \"0x099224327e5e296c\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\nlea rdi, [rel .mask]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\n\n; pblend uses xmm0 implicitly\nmovaps xmm0, [rdx + 16 * 0]\nblendvpd xmm1, [rdx + 16 * 8]\nmovaps xmm0, [rdx + 16 * 1]\nblendvpd xmm2, [rdx + 16 * 9]\nmovaps xmm0, [rdx + 16 * 2]\nblendvpd xmm3, [rdx + 16 * 10]\nmovaps xmm0, [rdx + 16 * 3]\nblendvpd xmm4, [rdx + 16 * 11]\nmovaps xmm0, [rdx + 16 * 4]\nblendvpd xmm5, [rdx + 16 * 12]\nmovaps xmm0, [rdx + 16 * 5]\nblendvpd xmm6, [rdx + 16 * 13]\nmovaps xmm0, [rdx + 16 * 6]\nblendvpd xmm7, [rdx + 16 * 14]\nmovaps xmm0, [rdx + 16 * 7]\nblendvpd xmm8, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n.mask:\ndb 0xb5, 0xdb, 0xca, 0x08, 0x0a, 0xae, 0x17, 0xb6, 0x54, 0x0d, 0xd3, 0xa1, 0x1d, 0x28, 0x25, 0xd3\ndb 0x02, 0xf5, 0xce, 0x94, 0x2e, 0x56, 0x01, 0xf4, 0xae, 0x81, 0xbe, 0x50, 0x70, 0x45, 0x83, 0x18\ndb 0x33, 0x46, 0x60, 0x4e, 0x29, 0xe4, 0x49, 0xae, 0xc2, 0x0e, 0x70, 0xcd, 0x2a, 0x6f, 0xb8, 0x9d\ndb 0x47, 0x1e, 0x8e, 0x94, 0x81, 0xaa, 0x12, 0xe4, 0x8e, 0x77, 0x48, 0x34, 0x63, 0x8f, 0x4c, 0x57\ndb 0x34, 0xf9, 0x5b, 0x37, 0x76, 0x9f, 0xff, 0x8c, 0x6b, 0xf2, 0x6e, 0xd0, 0x15, 0x61, 0x4e, 0x0f\ndb 0xe2, 0xa7, 0xd0, 0x73, 0x7f, 0xf0, 0xae, 0xe7, 0x48, 0x32, 0x2a, 0x56, 0xc3, 0x29, 0x12, 0x4f\ndb 0x7d, 0x5b, 0x37, 0xc2, 0x83, 0x74, 0xd2, 0xf9, 0xcc, 0x98, 0x0a, 0x3c, 0x3c, 0x38, 0xd9, 0x4d\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_17.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\":  \"0x000000000003a759\",\n    \"XMM1\": [\"0\", \"0\"],\n    \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM3\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0\", \"0\"],\n    \"XMM5\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM6\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM7\": [\"0\", \"0\"],\n    \"XMM8\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM9\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\n; Uses AX and BX and stores result in r15\n; CF:ZF\n%macro zfcfmerge 0\n  lahf\n\n  ; Shift CF to zero\n  shr ax, 8\n\n  ; Move to a temp\n  mov bx, ax\n  and rbx, 1\n\n  shl r15, 1\n  or r15, rbx\n\n  shl r15, 1\n\n  ; Move to a temp\n  mov bx, ax\n\n  ; Extract ZF\n  shr bx, 6\n  and rbx, 1\n\n  ; Insert ZF\n  or r15, rbx\n%endmacro\n\nlea rdx, [rel .data]\n\nmov rax, 0\nmov rbx, 0\nmov r15, 0\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 0]\nmovaps xmm5, [rdx + 16 * 1]\nmovaps xmm6, [rdx + 16 * 2]\nmovaps xmm7, [rdx + 16 * 0]\nmovaps xmm8, [rdx + 16 * 1]\nmovaps xmm9, [rdx + 16 * 2]\n\n\nptest xmm1, [rdx + 16 * 3]\nzfcfmerge\nptest xmm2, [rdx + 16 * 4]\nzfcfmerge\nptest xmm3, [rdx + 16 * 5]\nzfcfmerge\nptest xmm4, [rdx + 16 * 6]\nzfcfmerge\nptest xmm5, [rdx + 16 * 7]\nzfcfmerge\nptest xmm6, [rdx + 16 * 8]\nzfcfmerge\nptest xmm7, [rdx + 16 * 9]\nzfcfmerge\nptest xmm8, [rdx + 16 * 10]\nzfcfmerge\nptest xmm9, [rdx + 16 * 11]\nzfcfmerge\n\nhlt\n\nalign 16\n.data:\ndq 0, 0\ndq 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF\ndq 0x4142434445464748, 0x5152535455565758\n\n; Match\ndq 0, 0\ndq 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF\ndq 0x4142434445464748, 0x5152535455565758\n\n; Match on not\ndq 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF\ndq 0, 0\ndq 0xBEBDBCBBBAB9B8B7, 0xAEADACABAAA9A8A7\n\n; No match on either case\ndq 1, 1\ndq 2, 2\ndq 3, 3\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_17_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFF43FF\",\n    \"RBX\": \"0\"\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\n; Set EFLAGS to known value with sahf\nmov rax, -1\nsahf\n\nmovups xmm0, [rel .data]\n; Tests a bug that FEX had where ptest would not set OF, SF, AF, PF to zero\nptest xmm0, xmm0\n\n; Now load back\n; ZF = 1\n; CF = 1\n; OF, SF, AF, PF should be zero\nlahf\n\n; lahf doesn't get OF, get it with seto\nmov rbx, 0\nseto bl\n\nhlt\n\n.data:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_1C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0\", \"0x0\"],\n    \"XMM1\": [\"0x0101010101010101\", \"0x0101010101010101\"],\n    \"XMM2\": [\"0x0101010101010101\", \"0x0101010101010101\"],\n    \"XMM3\": [\"0x0100010001010100\", \"0x0100010001010100\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0101010101010101\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, 0xFF000100FF01FF00\nmov [rdx + 8 * 6], rax\nmov [rdx + 8 * 7], rax\n\n; Test with full zero\npabsb xmm0, [rdx + 8 * 0]\n\n; Test with full negative\npabsb xmm1, [rdx + 8 * 2]\n\n; Test with full positive\npabsb xmm2, [rdx + 8 * 4]\n\n; Test a mix\npabsb xmm3, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_1D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0\", \"0x0\"],\n    \"XMM1\": [\"0x0001000100010001\", \"0x0001000100010001\"],\n    \"XMM2\": [\"0x0001000100010001\", \"0x0001000100010001\"],\n    \"XMM3\": [\"0x0001000100000000\", \"0x0001000100010000\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0001000100010001\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, 0xFFFFFFFF00000000\nmov [rdx + 8 * 6], rax\nmov rax, 0x00010001FFFF0000\nmov [rdx + 8 * 7], rax\n\n; Test with full zero\npabsw xmm0, [rdx + 8 * 0]\n\n; Test with full negative\npabsw xmm1, [rdx + 8 * 2]\n\n; Test with full positive\npabsw xmm2, [rdx + 8 * 4]\n\n; Test a mix\npabsw xmm3, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_1E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0\", \"0x0\"],\n    \"XMM1\": [\"0x0000000100000001\", \"0x0000000100000001\"],\n    \"XMM2\": [\"0x0000000100000001\", \"0x0000000100000001\"],\n    \"XMM3\": [\"0x0000000100000000\", \"0x0000000100000001\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0000000100000001\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, 0xFFFFFFFF00000000\nmov [rdx + 8 * 6], rax\nmov rax, 0x00000001FFFFFFFF\nmov [rdx + 8 * 7], rax\n\n; Test with full zero\npabsd xmm0, [rdx + 8 * 0]\n\n; Test with full negative\npabsd xmm1, [rdx + 8 * 2]\n\n; Test with full positive\npabsd xmm2, [rdx + 8 * 4]\n\n; Test a mix\npabsd xmm3, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_20.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xff85ff86ff87ff88\", \"0x0041004200430044\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434485868788\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Fill register with trash\nmovapd xmm0, [rdx + 8 * 2]\n\n; Now do the move\npmovsxbw xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_21.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xffffff87ffffff88\", \"0xffffff85ffffff86\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434485868788\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Fill register with trash\nmovapd xmm0, [rdx + 8 * 2]\n\n; Now do the move\npmovsxbd xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_22.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xffffffffffffff88\", \"0xffffffffffffff87\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434485868788\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Fill register with trash\nmovapd xmm0, [rdx + 8 * 2]\n\n; Now do the move\npmovsxbq xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_23.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xffff8586ffff8788\", \"0x0000414200004344\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434485868788\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Fill register with trash\nmovapd xmm0, [rdx + 8 * 2]\n\n; Now do the move\npmovsxwd xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_24.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xffffffffffff8788\", \"0xffffffffffff8586\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434485868788\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Fill register with trash\nmovapd xmm0, [rdx + 8 * 2]\n\n; Now do the move\npmovsxwq xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_25.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xffffffff85868788\", \"0x0000000041424344\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434485868788\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Fill register with trash\nmovapd xmm0, [rdx + 8 * 2]\n\n; Now do the move\npmovsxdq xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_28.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\": [\"0xee65166050ac19a0\", \"0xfe1eb34a32b1a0b2\"],\n    \"XMM2\": [\"0x28a18cdd2d20fb20\", \"0x1d6fa69c44caed04\"],\n    \"XMM3\": [\"0xf514cf89a88edcde\", \"0x01e3dc4237becfcf\"],\n    \"XMM4\": [\"0x0004b0350897f35a\", \"0x03cd750e809c18d0\"],\n    \"XMM5\": [\"0x066a5fa4ad5148c8\", \"0x00bca2da387e55a2\"],\n    \"XMM6\": [\"0x1e0f03011112ed90\", \"0x18c90f3ec0d58440\"],\n    \"XMM7\": [\"0xee94b334b2358df2\", \"0x1b82409d7ae7fa28\"],\n    \"XMM8\": [\"0xed12f34e8fb5e098\", \"0xd83d0ba0ff8632db\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\n\npmuldq xmm1, [rdx + 16 * 8]\npmuldq xmm2, [rdx + 16 * 9]\npmuldq xmm3, [rdx + 16 * 10]\npmuldq xmm4, [rdx + 16 * 11]\npmuldq xmm5, [rdx + 16 * 12]\npmuldq xmm6, [rdx + 16 * 13]\npmuldq xmm7, [rdx + 16 * 14]\npmuldq xmm8, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\ndb 0x6e, 0x35, 0xa8, 0x54, 0xd7, 0xab, 0x8b, 0x6c, 0x77, 0x5f, 0x92, 0xca, 0x25, 0xa6, 0x7e, 0x27\ndb 0xc7, 0xcd, 0x73, 0xec, 0x95, 0xd6, 0x6f, 0x6a, 0xbb, 0xae, 0xf2, 0xbb, 0x27, 0xb9, 0xa1, 0xdd\ndb 0x73, 0x4d, 0xd1, 0xc7, 0xd5, 0x2c, 0x31, 0x88, 0xfe, 0xe7, 0xdb, 0xfd, 0x1e, 0x1e, 0x09, 0x7f\ndb 0x14, 0xfa, 0x4e, 0x95, 0xef, 0xe6, 0x9a, 0xf2, 0xa0, 0x42, 0x62, 0x9a, 0xa4, 0xa8, 0x73, 0x82\ndb 0x0e, 0x0f, 0x16, 0x82, 0x38, 0x07, 0x12, 0x32, 0x07, 0x35, 0x92, 0xc1, 0x63, 0x07, 0x78, 0xb3\ndb 0xcb, 0x46, 0x19, 0x57, 0x2b, 0x37, 0x2a, 0x46, 0x1f, 0x04, 0x0e, 0x79, 0x3d, 0xcd, 0x8d, 0xa3\ndb 0x2b, 0xf3, 0x86, 0x2f, 0xab, 0xba, 0x57, 0x30, 0x2e, 0xd6, 0x2c, 0xf0, 0x46, 0x4f, 0x3f, 0xef\ndb 0xef, 0xd1, 0xbb, 0x85, 0x34, 0x4b, 0x3c, 0xde, 0x9e, 0x48, 0xa3, 0xb9, 0x8d, 0x71, 0xe3, 0x9d\ndb 0x09, 0x72, 0xfb, 0xde, 0x8a, 0x32, 0x50, 0x9d, 0x69, 0x98, 0xf1, 0xf6, 0x52, 0xeb, 0xf7, 0xee\ndb 0xd6, 0x99, 0xc2, 0xff, 0x30, 0x1c, 0x02, 0xce, 0x70, 0x05, 0xb2, 0xf1, 0x56, 0x9c, 0x0e, 0xa6\ndb 0x18, 0x62, 0xc4, 0xe2, 0x86, 0x38, 0x76, 0x30, 0x2f, 0xa1, 0xe4, 0xa7, 0x0e, 0x5d, 0x53, 0xeb\ndb 0x14, 0x45, 0xe0, 0xb7, 0xe1, 0xe8, 0x02, 0x68, 0x1a, 0xfe, 0x8e, 0xc1, 0x8f, 0xf2, 0xeb, 0x46\ndb 0x7f, 0x5d, 0x6a, 0x23, 0x46, 0x97, 0x2e, 0x03, 0x98, 0x12, 0x32, 0x8f, 0x54, 0x76, 0x59, 0xac\ndb 0xc8, 0x76, 0x5f, 0xc8, 0x71, 0x0c, 0xd3, 0xb6, 0xc5, 0x19, 0xea, 0xab, 0xa6, 0x2c, 0x1d, 0x88\n\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_29.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0xffffffffffffffff\", \"0xffffffffffffffff\"],\n    \"XMM2\":  [\"0xffffffffffffffff\", \"0xffffffffffffffff\"],\n    \"XMM3\":  [\"0xffffffffffffffff\", \"0xffffffffffffffff\"],\n    \"XMM4\":  [\"0xffffffffffffffff\", \"0xffffffffffffffff\"],\n    \"XMM5\":  [\"0x0\", \"0x0\"],\n    \"XMM6\":  [\"0x0\", \"0x0\"],\n    \"XMM7\":  [\"0x0\", \"0x0\"],\n    \"XMM8\":  [\"0xffffffffffffffff\", \"0xffffffffffffffff\"],\n    \"XMM9\":  [\"0x0\", \"0xffffffffffffffff\"],\n    \"XMM10\": [\"0xffffffffffffffff\", \"0x0\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\nmovaps xmm9, [rdx + 16 * 0]\nmovaps xmm10, [rdx + 16 * 0]\n\npcmpeqq xmm1, [rdx + 16 * 8]\npcmpeqq xmm2, [rdx + 16 * 9]\npcmpeqq xmm3, [rdx + 16 * 10]\npcmpeqq xmm4, [rdx + 16 * 11]\npcmpeqq xmm5, [rdx + 16 * 12]\npcmpeqq xmm6, [rdx + 16 * 13]\npcmpeqq xmm7, [rdx + 16 * 14]\npcmpeqq xmm8, [rdx + 16 * 15]\npcmpeqq xmm9, [rdx + 16 * 16]\npcmpeqq xmm10, [rdx + 16 * 17]\n\nhlt\n\nalign 16\n.data:\ndq 0.0, 0.0\ndq 0.0, 1.0\ndq 1.0, 0.0\ndq 1.0, 1.0\ndq 0.0, 0.0\ndq 0.0, 1.0\ndq 1.0, 0.0\ndq 1.0, 1.0\n\ndq 0.0, 0.0\ndq 0.0, 1.0\ndq 1.0, 0.0\ndq 1.0, 1.0\ndq 1.0, 1.0\ndq 1.0, 0.0\ndq 0.0, 1.0\ndq 1.0, 1.0\ndq 1.0, 0.0\ndq 0.0, 1.0\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_2A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmovntdqa xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_2B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xffffffffffffffff\", \"0x00000000ffff0000\"],\n    \"XMM1\": [\"0xffffffffffffffff\", \"0x12348000ffff0000\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov eax, 0\nmov [rdx + 8 * 2 + 0], eax\nmov eax, 0x7FFFFFFF\nmov [rdx + 8 * 2 + 4], eax\nmov eax, 0x80000000\nmov [rdx + 8 * 3 + 0], eax\nmov eax, 0xFFFFFFFF\nmov [rdx + 8 * 3 + 4], eax\n\n; Values that actually fit in to 16bit unsigned\nmov eax, 0\nmov [rdx + 8 * 4 + 0], eax\nmov eax, 0xFFFF\nmov [rdx + 8 * 4 + 4], eax\nmov eax, 0x8000\nmov [rdx + 8 * 5 + 0], eax\nmov eax, 0x1234\nmov [rdx + 8 * 5 + 4], eax\n\n; Setup source\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\n\n; Pack it\npackusdw xmm0, [rdx + 8 * 2]\npackusdw xmm1, [rdx + 8 * 4]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_30.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0085008600870088\", \"0x0041004200430044\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434485868788\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Fill register with trash\nmovapd xmm0, [rdx + 8 * 2]\n\n; Now do the move\npmovzxbw xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_31.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000008700000088\", \"0x0000008500000086\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434485868788\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Fill register with trash\nmovapd xmm0, [rdx + 8 * 2]\n\n; Now do the move\npmovzxbd xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000000000088\", \"0x0000000000000087\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434485868788\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Fill register with trash\nmovapd xmm0, [rdx + 8 * 2]\n\n; Now do the move\npmovzxbq xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_33.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000858600008788\", \"0x0000414200004344\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434485868788\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Fill register with trash\nmovapd xmm0, [rdx + 8 * 2]\n\n; Now do the move\npmovzxwd xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_34.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000000008788\", \"0x0000000000008586\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434485868788\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Fill register with trash\nmovapd xmm0, [rdx + 8 * 2]\n\n; Now do the move\npmovzxwq xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_35.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000085868788\", \"0x0000000041424344\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434485868788\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Fill register with trash\nmovapd xmm0, [rdx + 8 * 2]\n\n; Now do the move\npmovzxdq xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_37.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM1\":  [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM4\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM6\":  [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM9\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\nmovaps xmm0, [rel .data0]\nmovaps xmm1, [rel .data1]\nmovaps xmm2, [rel .data2]\nmovaps xmm3, [rel .data3]\nmovaps xmm4, [rel .data4]\n\nmovaps xmm5, [rel .data0]\nmovaps xmm6, [rel .data1]\nmovaps xmm7, [rel .data2]\nmovaps xmm8, [rel .data3]\nmovaps xmm9, [rel .data4]\n\npcmpgtq xmm0, [rel .data4]\npcmpgtq xmm1, [rel .data3]\npcmpgtq xmm2, [rel .data2]\npcmpgtq xmm3, [rel .data1]\npcmpgtq xmm4, [rel .data0]\n\npcmpgtq xmm5, [rel .data1]\npcmpgtq xmm6, [rel .data2]\npcmpgtq xmm7, [rel .data3]\npcmpgtq xmm8, [rel .data4]\npcmpgtq xmm9, [rel .data0]\n\nhlt\n\nalign 16\n.data0:\ndq 0\ndq 0\n\n.data1:\ndq -1\ndq -1\n\n.data2:\ndq 1\ndq 1\n\n.data3:\ndq -1\ndq 1\n\n.data4:\ndq 1\ndq -1\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_38.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434445464748\", \"0x5152535455565758\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npminsb xmm0, xmm2\npminsb xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_39.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434445464748\", \"0x5152535455565758\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npminsd xmm0, xmm2\npminsd xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_3A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434445464748\", \"0x5152535455565758\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npminuw xmm0, xmm2\npminuw xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_3B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434445464748\", \"0x5152535455565758\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npminud xmm0, xmm2\npminud xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_3C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\":  [\"0x6162636465666768\", \"0x7172737475767778\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npmaxsb xmm0, xmm2\npmaxsb xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_3D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\":  [\"0x6162636465666768\", \"0x7172737475767778\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npmaxsd xmm0, xmm2\npmaxsd xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_3E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\":  [\"0x6162636465666768\", \"0x7172737475767778\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npmaxuw xmm0, xmm2\npmaxuw xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_3F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\":  [\"0x6162636465666768\", \"0x7172737475767778\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npmaxud xmm0, xmm2\npmaxud xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_40.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\": [\"0x7a84d3fa541ef1be\", \"0x5f0d7667e4d8e24a\"],\n    \"XMM2\": [\"0x44683c4ce9ac9780\", \"0x9da95e9a6f25ef94\"],\n    \"XMM3\": [\"0x4bc94ea0ccb0a64c\", \"0x3cf36ee04f371510\"],\n    \"XMM4\": [\"0x1ac415407b8ba3db\", \"0x92cdc300dab0773c\"],\n    \"XMM5\": [\"0x6796b1563f8d578c\", \"0x4c64f16199291fe4\"],\n    \"XMM6\": [\"0x01a14ef664207dc6\", \"0x1d3220da400e1027\"],\n    \"XMM7\": [\"0x75ddba582c3dd348\", \"0xa5141c506d8c60d7\"],\n    \"XMM8\": [\"0x7873ff38fb240e0d\", \"0x6c154f1adb67cd17\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\n\npmulld xmm1, [rdx + 16 * 8]\npmulld xmm2, [rdx + 16 * 9]\npmulld xmm3, [rdx + 16 * 10]\npmulld xmm4, [rdx + 16 * 11]\npmulld xmm5, [rdx + 16 * 12]\npmulld xmm6, [rdx + 16 * 13]\npmulld xmm7, [rdx + 16 * 14]\npmulld xmm8, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndd 655.9708,532.2244,108.0451,512.4019,754.227,586.0859,127.7574,114.8167,764.4266,226.6145,337.864,320.3296,296.5247,480.0057,28.4267,565.9418,265.8255,536.4473,754.3489,460.681,818.7269,43.7204,464.592,847.9381,306.0592,702.7584,887.6473,551.5908,620.9001,520.9829,232.9532,510.3388,204.8474,225.626,564.973,790.5175,836.1953,844.5266,633.5626,501.7409,393.2616,674.4415,244.3265,971.1598,770.8029,746.1836,255.9902,567.7578,187.7175,924.181,466.4362,169.8267,651.7481,462.4206,396.6924,355.8538,6.148,523.1443,989.7004,713.6646,497.5427,657.6965,651.0534,778.5236\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_41.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000000000001\", \"0x0\"],\n    \"XMM1\":  [\"0x0000000000030001\", \"0x0\"],\n    \"XMM2\":  [\"0x0000000000070001\", \"0x0\"],\n    \"XMM3\":  [\"0x0000000000010001\", \"0x0\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; Pos 0\nmov rax, 0x0004000300020001\nmov [rdx + 8 * 0], rax\nmov rax, 0x0008000700060005\nmov [rdx + 8 * 1], rax\n\n; Pos 3\nmov rax, 0x0001000300020004\nmov [rdx + 8 * 2], rax\nmov rax, 0x0008000700060005\nmov [rdx + 8 * 3], rax\n\n; Pos 7\nmov rax, 0x0008000300020004\nmov [rdx + 8 * 4], rax\nmov rax, 0x0001000700060005\nmov [rdx + 8 * 5], rax\n\n; Pos 7 & 3 & 2\n; Should return lowest position\nmov rax, 0x0008000100010004\nmov [rdx + 8 * 6], rax\nmov rax, 0x0001000700060005\nmov [rdx + 8 * 7], rax\n\nphminposuw xmm0, [rdx + 8 * 0]\nphminposuw xmm1, [rdx + 8 * 2]\nphminposuw xmm2, [rdx + 8 * 4]\nphminposuw xmm3, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_DB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0xffffffffffffffff\", \"0xffffffffffffffff\"],\n    \"XMM2\": [\"0x0b0d090e0b0d090e\", \"0x0b0d090e0b0d090e\"],\n    \"XMM3\": [\"0xffffffff00000000\", \"0x0b0d090effffffff\"],\n    \"XMM4\": [\"0x0202020202020202\", \"0x0303030303030303\"]\n  },\n  \"HostFeatures\": [\"AES\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0000000100000001\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, 0xFFFFFFFF00000000\nmov [rdx + 8 * 6], rax\nmov rax, 0x00000001FFFFFFFF\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x0202020202020202\nmov [rdx + 8 * 8], rax\nmov rax, 0x0303030303030303\nmov [rdx + 8 * 9], rax\n\naesimc xmm0, [rdx + 8 * 0]\naesimc xmm1, [rdx + 8 * 2]\naesimc xmm2, [rdx + 8 * 4]\naesimc xmm3, [rdx + 8 * 6]\naesimc xmm4, [rdx + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_DC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x77637B6F637B6F77\", \"0x7B6F77636F77637B\"],\n    \"XMM1\": [\"0x889C84909C849088\", \"0x8490889C90889C84\"],\n    \"XMM2\": [\"0x77637B6E637B6F76\", \"0x7B6F77626F77637A\"],\n    \"XMM3\": [\"0x889C8490637B6F77\", \"0x7B6F776290889C84\"]\n  },\n  \"HostFeatures\": [\"AES\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0000000100000001\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, 0xFFFFFFFF00000000\nmov [rdx + 8 * 6], rax\nmov rax, 0x00000001FFFFFFFF\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x0202020202020202\nmov [rdx + 8 * 8], rax\nmov rax, 0x0303030303030303\nmov [rdx + 8 * 9], rax\n\nmovaps xmm0, [rdx + 8 * 8]\nmovaps xmm1, [rdx + 8 * 8]\nmovaps xmm2, [rdx + 8 * 8]\nmovaps xmm3, [rdx + 8 * 8]\n\naesenc xmm0, [rdx + 8 * 0]\n\naesenc xmm1, [rdx + 8 * 2]\n\naesenc xmm2, [rdx + 8 * 4]\n\naesenc xmm3, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_DD.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x777B7B777B7B7777\", \"0x7B77777B77777B7B\"],\n    \"XMM1\": [\"0x8884848884848888\", \"0x8488888488888484\"],\n    \"XMM2\": [\"0x777B7B767B7B7776\", \"0x7B77777A77777B7A\"],\n    \"XMM3\": [\"0x888484887B7B7777\", \"0x7B77777A88888484\"]\n  },\n  \"HostFeatures\": [\"AES\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0000000100000001\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, 0xFFFFFFFF00000000\nmov [rdx + 8 * 6], rax\nmov rax, 0x00000001FFFFFFFF\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x0202020202020202\nmov [rdx + 8 * 8], rax\nmov rax, 0x0303030303030303\nmov [rdx + 8 * 9], rax\n\nmovaps xmm0, [rdx + 8 * 8]\nmovaps xmm1, [rdx + 8 * 8]\nmovaps xmm2, [rdx + 8 * 8]\nmovaps xmm3, [rdx + 8 * 8]\n\naesenclast xmm0, [rdx + 8 * 0]\n\naesenclast xmm1, [rdx + 8 * 2]\n\naesenclast xmm2, [rdx + 8 * 4]\n\naesenclast xmm3, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_DE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x7A1FC5A0A07A1FC5\", \"0xC5A07A1F1FC5A07A\"],\n    \"XMM1\": [\"0x85E03A5F5F85E03A\", \"0x3A5F85E0E03A5F85\"],\n    \"XMM2\": [\"0x7A1FC5A1A07A1FC4\", \"0xC5A07A1E1FC5A07B\"],\n    \"XMM3\": [\"0x85E03A5FA07A1FC5\", \"0xC5A07A1EE03A5F85\"]\n  },\n  \"HostFeatures\": [\"AES\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0000000100000001\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, 0xFFFFFFFF00000000\nmov [rdx + 8 * 6], rax\nmov rax, 0x00000001FFFFFFFF\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x0202020202020202\nmov [rdx + 8 * 8], rax\nmov rax, 0x0303030303030303\nmov [rdx + 8 * 9], rax\n\nmovaps xmm0, [rdx + 8 * 8]\nmovaps xmm1, [rdx + 8 * 8]\nmovaps xmm2, [rdx + 8 * 8]\nmovaps xmm3, [rdx + 8 * 8]\n\naesdec xmm0, [rdx + 8 * 0]\n\naesdec xmm1, [rdx + 8 * 2]\n\naesdec xmm2, [rdx + 8 * 4]\n\naesdec xmm3, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_DF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xD5D56A6A6AD5D56A\", \"0x6A6AD5D5D56A6AD5\"],\n    \"XMM1\": [\"0x2A2A9595952A2A95\", \"0x95952A2A2A95952A\"],\n    \"XMM2\": [\"0xD5D56A6B6AD5D56B\", \"0x6A6AD5D4D56A6AD4\"],\n    \"XMM3\": [\"0x2A2A95956AD5D56A\", \"0x6A6AD5D42A95952A\"]\n  },\n  \"HostFeatures\": [\"AES\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0000000100000001\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, 0xFFFFFFFF00000000\nmov [rdx + 8 * 6], rax\nmov rax, 0x00000001FFFFFFFF\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x0202020202020202\nmov [rdx + 8 * 8], rax\nmov rax, 0x0303030303030303\nmov [rdx + 8 * 9], rax\n\nmovaps xmm0, [rdx + 8 * 8]\nmovaps xmm1, [rdx + 8 * 8]\nmovaps xmm2, [rdx + 8 * 8]\nmovaps xmm3, [rdx + 8 * 8]\n\naesdeclast xmm0, [rdx + 8 * 0]\n\naesdeclast xmm1, [rdx + 8 * 2]\n\naesdeclast xmm2, [rdx + 8 * 4]\n\naesdeclast xmm3, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_F0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x00000000E330A81A\",\n    \"RBX\": \"0x00000000BE2DA0A5\",\n    \"RCX\": \"0x00000000ADBE9F64\"\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; This is a clone of the F2_F0 crc32 test with manually coded crc32 with prefix 66 instead of F2\nmov rax, 0\nmov rbx, 0\nmov rcx, 0\nmov rdx, 0\nlea rsi, [rel .data]\n\n; crc32 rax, byte [rel .data]\ndb 0xf2\ndb 0x66\ndb 0x48, 0x0f, 0x38, 0xf0, 0x05\ndd 0x0000002A\n\n; crc32 ebx, byte [rel .data + 1]\ndb 0xf2\ndb 0x66\ndb 0x0f, 0x38, 0xf0, 0x1d,\ndd 0x00000021\n\n.again:\ncmp rdx, 256\nje .done\n; crc32 rcx, byte [rsi + rdx]\ndb 0xf2\ndb 0x66\ndb 0x48, 0x0f, 0x38, 0xf0, 0x0c, 0x16\n\nadd rdx, 1\njmp .again\n.done:\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\ndb 0x6e, 0x35, 0xa8, 0x54, 0xd7, 0xab, 0x8b, 0x6c, 0x77, 0x5f, 0x92, 0xca, 0x25, 0xa6, 0x7e, 0x27\ndb 0xc7, 0xcd, 0x73, 0xec, 0x95, 0xd6, 0x6f, 0x6a, 0xbb, 0xae, 0xf2, 0xbb, 0x27, 0xb9, 0xa1, 0xdd\ndb 0x73, 0x4d, 0xd1, 0xc7, 0xd5, 0x2c, 0x31, 0x88, 0xfe, 0xe7, 0xdb, 0xfd, 0x1e, 0x1e, 0x09, 0x7f\ndb 0x14, 0xfa, 0x4e, 0x95, 0xef, 0xe6, 0x9a, 0xf2, 0xa0, 0x42, 0x62, 0x9a, 0xa4, 0xa8, 0x73, 0x82\ndb 0x0e, 0x0f, 0x16, 0x82, 0x38, 0x07, 0x12, 0x32, 0x07, 0x35, 0x92, 0xc1, 0x63, 0x07, 0x78, 0xb3\ndb 0xcb, 0x46, 0x19, 0x57, 0x2b, 0x37, 0x2a, 0x46, 0x1f, 0x04, 0x0e, 0x79, 0x3d, 0xcd, 0x8d, 0xa3\ndb 0x2b, 0xf3, 0x86, 0x2f, 0xab, 0xba, 0x57, 0x30, 0x2e, 0xd6, 0x2c, 0xf0, 0x46, 0x4f, 0x3f, 0xef\ndb 0xef, 0xd1, 0xbb, 0x85, 0x34, 0x4b, 0x3c, 0xde, 0x9e, 0x48, 0xa3, 0xb9, 0x8d, 0x71, 0xe3, 0x9d\ndb 0x09, 0x72, 0xfb, 0xde, 0x8a, 0x32, 0x50, 0x9d, 0x69, 0x98, 0xf1, 0xf6, 0x52, 0xeb, 0xf7, 0xee\ndb 0xd6, 0x99, 0xc2, 0xff, 0x30, 0x1c, 0x02, 0xce, 0x70, 0x05, 0xb2, 0xf1, 0x56, 0x9c, 0x0e, 0xa6\ndb 0x18, 0x62, 0xc4, 0xe2, 0x86, 0x38, 0x76, 0x30, 0x2f, 0xa1, 0xe4, 0xa7, 0x0e, 0x5d, 0x53, 0xeb\ndb 0x14, 0x45, 0xe0, 0xb7, 0xe1, 0xe8, 0x02, 0x68, 0x1a, 0xfe, 0x8e, 0xc1, 0x8f, 0xf2, 0xeb, 0x46\ndb 0x7f, 0x5d, 0x6a, 0x23, 0x46, 0x97, 0x2e, 0x03, 0x98, 0x12, 0x32, 0x8f, 0x54, 0x76, 0x59, 0xac\ndb 0xc8, 0x76, 0x5f, 0xc8, 0x71, 0x0c, 0xd3, 0xb6, 0xc5, 0x19, 0xea, 0xab, 0xa6, 0x2c, 0x1d, 0x88\n\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_F0_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x00000000E330A81A\",\n    \"RBX\": \"0x00000000BE2DA0A5\",\n    \"RCX\": \"0x00000000ADBE9F64\"\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; This is a clone of the F2_F0 crc32 test with manually coded crc32 with prefix 66 instead of F2\nmov rax, 0\nmov rbx, 0\nmov rcx, 0\nmov rdx, 0\nlea rsi, [rel .data]\n\n; crc32 rax, byte [rel .data]\ndb 0x66\ndb 0xf2\ndb 0x48, 0x0f, 0x38, 0xf0, 0x05\ndd 0x0000002A\n\n; crc32 ebx, byte [rel .data + 1]\ndb 0x66\ndb 0xf2\ndb 0x0f, 0x38, 0xf0, 0x1d,\ndd 0x00000021\n\n.again:\ncmp rdx, 256\nje .done\n; crc32 rcx, byte [rsi + rdx]\ndb 0x66\ndb 0xf2\ndb 0x48, 0x0f, 0x38, 0xf0, 0x0c, 0x16\n\nadd rdx, 1\njmp .again\n.done:\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\ndb 0x6e, 0x35, 0xa8, 0x54, 0xd7, 0xab, 0x8b, 0x6c, 0x77, 0x5f, 0x92, 0xca, 0x25, 0xa6, 0x7e, 0x27\ndb 0xc7, 0xcd, 0x73, 0xec, 0x95, 0xd6, 0x6f, 0x6a, 0xbb, 0xae, 0xf2, 0xbb, 0x27, 0xb9, 0xa1, 0xdd\ndb 0x73, 0x4d, 0xd1, 0xc7, 0xd5, 0x2c, 0x31, 0x88, 0xfe, 0xe7, 0xdb, 0xfd, 0x1e, 0x1e, 0x09, 0x7f\ndb 0x14, 0xfa, 0x4e, 0x95, 0xef, 0xe6, 0x9a, 0xf2, 0xa0, 0x42, 0x62, 0x9a, 0xa4, 0xa8, 0x73, 0x82\ndb 0x0e, 0x0f, 0x16, 0x82, 0x38, 0x07, 0x12, 0x32, 0x07, 0x35, 0x92, 0xc1, 0x63, 0x07, 0x78, 0xb3\ndb 0xcb, 0x46, 0x19, 0x57, 0x2b, 0x37, 0x2a, 0x46, 0x1f, 0x04, 0x0e, 0x79, 0x3d, 0xcd, 0x8d, 0xa3\ndb 0x2b, 0xf3, 0x86, 0x2f, 0xab, 0xba, 0x57, 0x30, 0x2e, 0xd6, 0x2c, 0xf0, 0x46, 0x4f, 0x3f, 0xef\ndb 0xef, 0xd1, 0xbb, 0x85, 0x34, 0x4b, 0x3c, 0xde, 0x9e, 0x48, 0xa3, 0xb9, 0x8d, 0x71, 0xe3, 0x9d\ndb 0x09, 0x72, 0xfb, 0xde, 0x8a, 0x32, 0x50, 0x9d, 0x69, 0x98, 0xf1, 0xf6, 0x52, 0xeb, 0xf7, 0xee\ndb 0xd6, 0x99, 0xc2, 0xff, 0x30, 0x1c, 0x02, 0xce, 0x70, 0x05, 0xb2, 0xf1, 0x56, 0x9c, 0x0e, 0xa6\ndb 0x18, 0x62, 0xc4, 0xe2, 0x86, 0x38, 0x76, 0x30, 0x2f, 0xa1, 0xe4, 0xa7, 0x0e, 0x5d, 0x53, 0xeb\ndb 0x14, 0x45, 0xe0, 0xb7, 0xe1, 0xe8, 0x02, 0x68, 0x1a, 0xfe, 0x8e, 0xc1, 0x8f, 0xf2, 0xeb, 0x46\ndb 0x7f, 0x5d, 0x6a, 0x23, 0x46, 0x97, 0x2e, 0x03, 0x98, 0x12, 0x32, 0x8f, 0x54, 0x76, 0x59, 0xac\ndb 0xc8, 0x76, 0x5f, 0xc8, 0x71, 0x0c, 0xd3, 0xb6, 0xc5, 0x19, 0xea, 0xab, 0xa6, 0x2c, 0x1d, 0x88\n\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_F1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x00000000C5727F5A\",\n    \"RBX\": \"0x00000000FAC690D7\",\n    \"RCX\": \"0x000000002AAF1F77\",\n    \"RDX\": \"0x00000000ADBE9F64\",\n    \"RSI\": \"0x00000000ADBE9F64\",\n    \"RDI\": \"0x00000000ADBE9F64\"\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; This is a clone of the F2_F1 crc32 test with manually coded crc32 with prefix 66 instead of F2\n; This can't user operand size override on 32-bit instructions for testing since it WILL override to 16-bit\nmov rax, 0\nmov rbx, 0\nmov rcx, 0\n\nmov rdx, 0\nmov rsi, 0\nmov rdi, 0\n\nmov rbp, 0\nlea rsp, [rel .data]\n\n; crc32 eax, word [rel .data]\ndb 0x66 ; Operand size override\ndb 0xf2 ; Prefix\ndb 0x0f, 0x38, 0xf1, 0x05\ndd 0x0000006c\n\n; crc32 ebx, dword [rel .data + 2]\ndb 0xf2 ; Prefix\ndb 0x0f, 0x38, 0xf1, 0x1d,\ndd 0x00000065\n\n; crc32 rcx, qword [rel .data + 8]\ndb 0x66 ; Operand size override\ndb 0xf2 ; Prefix\ndb 0x48, 0x0f, 0x38, 0xf1, 0x0d,\ndd 0x00000060\n\nmov rbp, 0\n.again16:\ncmp rbp, 128\nje .done16\n; crc32 edx, word [rsp + rbp * 2]\ndb 0x66 ; Operand size override\ndb 0xf2 ; Prefix\ndb 0x0f, 0x38, 0xf1, 0x14, 0x6c\n\nadd rbp, 1\njmp .again16\n.done16:\n\nmov rbp, 0\n.again32:\ncmp rbp, 64\nje .done32\n; crc32 esi, dword [rsp + rbp * 4]\ndb 0xf2 ; Prefix\ndb 0x0f, 0x38, 0xf1, 0x34, 0xac\n\nadd rbp, 1\njmp .again32\n.done32:\n\nmov rbp, 0\n.again64:\ncmp rbp, 32\nje .done64\n; crc32 rdi, qword [rsp + rbp * 8]\ndb 0x66 ; Operand size override\ndb 0xf2 ; Prefix\ndb 0x48, 0x0f, 0x38, 0xf1, 0x3c, 0xec\n\nadd rbp, 1\njmp .again64\n.done64:\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\ndb 0x6e, 0x35, 0xa8, 0x54, 0xd7, 0xab, 0x8b, 0x6c, 0x77, 0x5f, 0x92, 0xca, 0x25, 0xa6, 0x7e, 0x27\ndb 0xc7, 0xcd, 0x73, 0xec, 0x95, 0xd6, 0x6f, 0x6a, 0xbb, 0xae, 0xf2, 0xbb, 0x27, 0xb9, 0xa1, 0xdd\ndb 0x73, 0x4d, 0xd1, 0xc7, 0xd5, 0x2c, 0x31, 0x88, 0xfe, 0xe7, 0xdb, 0xfd, 0x1e, 0x1e, 0x09, 0x7f\ndb 0x14, 0xfa, 0x4e, 0x95, 0xef, 0xe6, 0x9a, 0xf2, 0xa0, 0x42, 0x62, 0x9a, 0xa4, 0xa8, 0x73, 0x82\ndb 0x0e, 0x0f, 0x16, 0x82, 0x38, 0x07, 0x12, 0x32, 0x07, 0x35, 0x92, 0xc1, 0x63, 0x07, 0x78, 0xb3\ndb 0xcb, 0x46, 0x19, 0x57, 0x2b, 0x37, 0x2a, 0x46, 0x1f, 0x04, 0x0e, 0x79, 0x3d, 0xcd, 0x8d, 0xa3\ndb 0x2b, 0xf3, 0x86, 0x2f, 0xab, 0xba, 0x57, 0x30, 0x2e, 0xd6, 0x2c, 0xf0, 0x46, 0x4f, 0x3f, 0xef\ndb 0xef, 0xd1, 0xbb, 0x85, 0x34, 0x4b, 0x3c, 0xde, 0x9e, 0x48, 0xa3, 0xb9, 0x8d, 0x71, 0xe3, 0x9d\ndb 0x09, 0x72, 0xfb, 0xde, 0x8a, 0x32, 0x50, 0x9d, 0x69, 0x98, 0xf1, 0xf6, 0x52, 0xeb, 0xf7, 0xee\ndb 0xd6, 0x99, 0xc2, 0xff, 0x30, 0x1c, 0x02, 0xce, 0x70, 0x05, 0xb2, 0xf1, 0x56, 0x9c, 0x0e, 0xa6\ndb 0x18, 0x62, 0xc4, 0xe2, 0x86, 0x38, 0x76, 0x30, 0x2f, 0xa1, 0xe4, 0xa7, 0x0e, 0x5d, 0x53, 0xeb\ndb 0x14, 0x45, 0xe0, 0xb7, 0xe1, 0xe8, 0x02, 0x68, 0x1a, 0xfe, 0x8e, 0xc1, 0x8f, 0xf2, 0xeb, 0x46\ndb 0x7f, 0x5d, 0x6a, 0x23, 0x46, 0x97, 0x2e, 0x03, 0x98, 0x12, 0x32, 0x8f, 0x54, 0x76, 0x59, 0xac\ndb 0xc8, 0x76, 0x5f, 0xc8, 0x71, 0x0c, 0xd3, 0xb6, 0xc5, 0x19, 0xea, 0xab, 0xa6, 0x2c, 0x1d, 0x88\n\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_F1_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x00000000C5727F5A\",\n    \"RBX\": \"0x00000000FAC690D7\",\n    \"RCX\": \"0x000000002AAF1F77\",\n    \"RDX\": \"0x00000000ADBE9F64\",\n    \"RSI\": \"0x00000000ADBE9F64\",\n    \"RDI\": \"0x00000000ADBE9F64\"\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; This is a clone of the F2_F1 crc32 test with manually coded crc32 with prefix 66 instead of F2\n; This can't user operand size override on 32-bit instructions for testing since it WILL override to 16-bit\nmov rax, 0\nmov rbx, 0\nmov rcx, 0\n\nmov rdx, 0\nmov rsi, 0\nmov rdi, 0\n\nmov rbp, 0\nlea rsp, [rel .data]\n\n; crc32 eax, word [rel .data]\ndb 0xf2 ; Prefix\ndb 0x66 ; Operand size override\ndb 0x0f, 0x38, 0xf1, 0x05\ndd 0x0000006c\n\n; crc32 ebx, dword [rel .data + 2]\ndb 0xf2 ; Prefix\ndb 0x0f, 0x38, 0xf1, 0x1d,\ndd 0x00000065\n\n; crc32 rcx, qword [rel .data + 8]\ndb 0xf2 ; Prefix\ndb 0x66 ; Operand size override\ndb 0x48, 0x0f, 0x38, 0xf1, 0x0d,\ndd 0x00000060\n\nmov rbp, 0\n.again16:\ncmp rbp, 128\nje .done16\n; crc32 edx, word [rsp + rbp * 2]\ndb 0xf2 ; Prefix\ndb 0x66 ; Operand size override\ndb 0x0f, 0x38, 0xf1, 0x14, 0x6c\n\nadd rbp, 1\njmp .again16\n.done16:\n\nmov rbp, 0\n.again32:\ncmp rbp, 64\nje .done32\n; crc32 esi, dword [rsp + rbp * 4]\ndb 0xf2 ; Prefix\ndb 0x0f, 0x38, 0xf1, 0x34, 0xac\n\nadd rbp, 1\njmp .again32\n.done32:\n\nmov rbp, 0\n.again64:\ncmp rbp, 32\nje .done64\n; crc32 rdi, qword [rsp + rbp * 8]\ndb 0xf2 ; Prefix\ndb 0x66 ; Operand size override\ndb 0x48, 0x0f, 0x38, 0xf1, 0x3c, 0xec\n\nadd rbp, 1\njmp .again64\n.done64:\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\ndb 0x6e, 0x35, 0xa8, 0x54, 0xd7, 0xab, 0x8b, 0x6c, 0x77, 0x5f, 0x92, 0xca, 0x25, 0xa6, 0x7e, 0x27\ndb 0xc7, 0xcd, 0x73, 0xec, 0x95, 0xd6, 0x6f, 0x6a, 0xbb, 0xae, 0xf2, 0xbb, 0x27, 0xb9, 0xa1, 0xdd\ndb 0x73, 0x4d, 0xd1, 0xc7, 0xd5, 0x2c, 0x31, 0x88, 0xfe, 0xe7, 0xdb, 0xfd, 0x1e, 0x1e, 0x09, 0x7f\ndb 0x14, 0xfa, 0x4e, 0x95, 0xef, 0xe6, 0x9a, 0xf2, 0xa0, 0x42, 0x62, 0x9a, 0xa4, 0xa8, 0x73, 0x82\ndb 0x0e, 0x0f, 0x16, 0x82, 0x38, 0x07, 0x12, 0x32, 0x07, 0x35, 0x92, 0xc1, 0x63, 0x07, 0x78, 0xb3\ndb 0xcb, 0x46, 0x19, 0x57, 0x2b, 0x37, 0x2a, 0x46, 0x1f, 0x04, 0x0e, 0x79, 0x3d, 0xcd, 0x8d, 0xa3\ndb 0x2b, 0xf3, 0x86, 0x2f, 0xab, 0xba, 0x57, 0x30, 0x2e, 0xd6, 0x2c, 0xf0, 0x46, 0x4f, 0x3f, 0xef\ndb 0xef, 0xd1, 0xbb, 0x85, 0x34, 0x4b, 0x3c, 0xde, 0x9e, 0x48, 0xa3, 0xb9, 0x8d, 0x71, 0xe3, 0x9d\ndb 0x09, 0x72, 0xfb, 0xde, 0x8a, 0x32, 0x50, 0x9d, 0x69, 0x98, 0xf1, 0xf6, 0x52, 0xeb, 0xf7, 0xee\ndb 0xd6, 0x99, 0xc2, 0xff, 0x30, 0x1c, 0x02, 0xce, 0x70, 0x05, 0xb2, 0xf1, 0x56, 0x9c, 0x0e, 0xa6\ndb 0x18, 0x62, 0xc4, 0xe2, 0x86, 0x38, 0x76, 0x30, 0x2f, 0xa1, 0xe4, 0xa7, 0x0e, 0x5d, 0x53, 0xeb\ndb 0x14, 0x45, 0xe0, 0xb7, 0xe1, 0xe8, 0x02, 0x68, 0x1a, 0xfe, 0x8e, 0xc1, 0x8f, 0xf2, 0xeb, 0x46\ndb 0x7f, 0x5d, 0x6a, 0x23, 0x46, 0x97, 0x2e, 0x03, 0x98, 0x12, 0x32, 0x8f, 0x54, 0x76, 0x59, 0xac\ndb 0xc8, 0x76, 0x5f, 0xc8, 0x71, 0x0c, 0xd3, 0xb6, 0xc5, 0x19, 0xea, 0xab, 0xa6, 0x2c, 0x1d, 0x88\n\n"
  },
  {
    "path": "unittests/ASM/H0F38/66_F1_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x000000005c3bc5b0\",\n    \"RBX\": \"0x000000001dd5b1e5\",\n    \"RCX\": \"0x0000000015d1c92d\"\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\nmov rax, 0x41424344454647\nmov rbx, 0x51525354555657\nmov rcx, 0x61626364656667\n\nmov rdx, 0x71727374757677\n\n; crc32 rax, rbx\ndb 0x66 ; Override, Should be ignored\ndb 0xf2 ; Prefix\ndb 0x48 ; REX.W\ndb 0x0f, 0x38, 0xf1, 0xc3\n\n; crc32 rbx, rcx\ndb 0xf2 ; Prefix\ndb 0x66 ; Override, Should be ignored\ndb 0x48 ; REX.W\ndb 0x0f, 0x38, 0xf1, 0xd9\n\n; crc32 rcx, rdx\ndb 0x66 ; Override, Should be ignored\ndb 0xf2 ; Prefix\ndb 0x66 ; Override, Should be ignored\ndb 0x48 ; REX.W\ndb 0x0f, 0x38, 0xf1, 0xca\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/F2_F0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x00000000E330A81A\",\n    \"RBX\": \"0x00000000BE2DA0A5\",\n    \"RCX\": \"0x00000000ADBE9F64\"\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\nmov rax, 0\nmov rbx, 0\nmov rcx, 0\nmov rdx, 0\nlea rsi, [rel .data]\n\ncrc32 rax, byte [rel .data]\ncrc32 ebx, byte [rel .data + 1]\n\n.again:\ncmp rdx, 256\nje .done\ncrc32 rcx, byte [rsi + rdx]\nadd rdx, 1\njmp .again\n.done:\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\ndb 0x6e, 0x35, 0xa8, 0x54, 0xd7, 0xab, 0x8b, 0x6c, 0x77, 0x5f, 0x92, 0xca, 0x25, 0xa6, 0x7e, 0x27\ndb 0xc7, 0xcd, 0x73, 0xec, 0x95, 0xd6, 0x6f, 0x6a, 0xbb, 0xae, 0xf2, 0xbb, 0x27, 0xb9, 0xa1, 0xdd\ndb 0x73, 0x4d, 0xd1, 0xc7, 0xd5, 0x2c, 0x31, 0x88, 0xfe, 0xe7, 0xdb, 0xfd, 0x1e, 0x1e, 0x09, 0x7f\ndb 0x14, 0xfa, 0x4e, 0x95, 0xef, 0xe6, 0x9a, 0xf2, 0xa0, 0x42, 0x62, 0x9a, 0xa4, 0xa8, 0x73, 0x82\ndb 0x0e, 0x0f, 0x16, 0x82, 0x38, 0x07, 0x12, 0x32, 0x07, 0x35, 0x92, 0xc1, 0x63, 0x07, 0x78, 0xb3\ndb 0xcb, 0x46, 0x19, 0x57, 0x2b, 0x37, 0x2a, 0x46, 0x1f, 0x04, 0x0e, 0x79, 0x3d, 0xcd, 0x8d, 0xa3\ndb 0x2b, 0xf3, 0x86, 0x2f, 0xab, 0xba, 0x57, 0x30, 0x2e, 0xd6, 0x2c, 0xf0, 0x46, 0x4f, 0x3f, 0xef\ndb 0xef, 0xd1, 0xbb, 0x85, 0x34, 0x4b, 0x3c, 0xde, 0x9e, 0x48, 0xa3, 0xb9, 0x8d, 0x71, 0xe3, 0x9d\ndb 0x09, 0x72, 0xfb, 0xde, 0x8a, 0x32, 0x50, 0x9d, 0x69, 0x98, 0xf1, 0xf6, 0x52, 0xeb, 0xf7, 0xee\ndb 0xd6, 0x99, 0xc2, 0xff, 0x30, 0x1c, 0x02, 0xce, 0x70, 0x05, 0xb2, 0xf1, 0x56, 0x9c, 0x0e, 0xa6\ndb 0x18, 0x62, 0xc4, 0xe2, 0x86, 0x38, 0x76, 0x30, 0x2f, 0xa1, 0xe4, 0xa7, 0x0e, 0x5d, 0x53, 0xeb\ndb 0x14, 0x45, 0xe0, 0xb7, 0xe1, 0xe8, 0x02, 0x68, 0x1a, 0xfe, 0x8e, 0xc1, 0x8f, 0xf2, 0xeb, 0x46\ndb 0x7f, 0x5d, 0x6a, 0x23, 0x46, 0x97, 0x2e, 0x03, 0x98, 0x12, 0x32, 0x8f, 0x54, 0x76, 0x59, 0xac\ndb 0xc8, 0x76, 0x5f, 0xc8, 0x71, 0x0c, 0xd3, 0xb6, 0xc5, 0x19, 0xea, 0xab, 0xa6, 0x2c, 0x1d, 0x88\n\n"
  },
  {
    "path": "unittests/ASM/H0F38/F2_F1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x00000000C5727F5A\",\n    \"RBX\": \"0x00000000FAC690D7\",\n    \"RCX\": \"0x000000002AAF1F77\",\n    \"RDX\": \"0x00000000ADBE9F64\",\n    \"RSI\": \"0x00000000ADBE9F64\",\n    \"RDI\": \"0x00000000ADBE9F64\"\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\nmov rax, 0\nmov rbx, 0\nmov rcx, 0\n\nmov rdx, 0\nmov rsi, 0\nmov rdi, 0\n\nmov rbp, 0\nlea rsp, [rel .data]\n\ncrc32 eax, word [rel .data]\ncrc32 ebx, dword [rel .data + 2]\ncrc32 rcx, qword [rel .data + 8]\n\nmov rbp, 0\n.again16:\ncmp rbp, 128\nje .done16\ncrc32 edx, word [rsp + rbp * 2]\nadd rbp, 1\njmp .again16\n.done16:\n\n\nmov rbp, 0\n.again32:\ncmp rbp, 64\nje .done32\ncrc32 esi, dword [rsp + rbp * 4]\nadd rbp, 1\njmp .again32\n.done32:\n\nmov rbp, 0\n.again64:\ncmp rbp, 32\nje .done64\ncrc32 rdi, qword [rsp + rbp * 8]\nadd rbp, 1\njmp .again64\n.done64:\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\ndb 0x6e, 0x35, 0xa8, 0x54, 0xd7, 0xab, 0x8b, 0x6c, 0x77, 0x5f, 0x92, 0xca, 0x25, 0xa6, 0x7e, 0x27\ndb 0xc7, 0xcd, 0x73, 0xec, 0x95, 0xd6, 0x6f, 0x6a, 0xbb, 0xae, 0xf2, 0xbb, 0x27, 0xb9, 0xa1, 0xdd\ndb 0x73, 0x4d, 0xd1, 0xc7, 0xd5, 0x2c, 0x31, 0x88, 0xfe, 0xe7, 0xdb, 0xfd, 0x1e, 0x1e, 0x09, 0x7f\ndb 0x14, 0xfa, 0x4e, 0x95, 0xef, 0xe6, 0x9a, 0xf2, 0xa0, 0x42, 0x62, 0x9a, 0xa4, 0xa8, 0x73, 0x82\ndb 0x0e, 0x0f, 0x16, 0x82, 0x38, 0x07, 0x12, 0x32, 0x07, 0x35, 0x92, 0xc1, 0x63, 0x07, 0x78, 0xb3\ndb 0xcb, 0x46, 0x19, 0x57, 0x2b, 0x37, 0x2a, 0x46, 0x1f, 0x04, 0x0e, 0x79, 0x3d, 0xcd, 0x8d, 0xa3\ndb 0x2b, 0xf3, 0x86, 0x2f, 0xab, 0xba, 0x57, 0x30, 0x2e, 0xd6, 0x2c, 0xf0, 0x46, 0x4f, 0x3f, 0xef\ndb 0xef, 0xd1, 0xbb, 0x85, 0x34, 0x4b, 0x3c, 0xde, 0x9e, 0x48, 0xa3, 0xb9, 0x8d, 0x71, 0xe3, 0x9d\ndb 0x09, 0x72, 0xfb, 0xde, 0x8a, 0x32, 0x50, 0x9d, 0x69, 0x98, 0xf1, 0xf6, 0x52, 0xeb, 0xf7, 0xee\ndb 0xd6, 0x99, 0xc2, 0xff, 0x30, 0x1c, 0x02, 0xce, 0x70, 0x05, 0xb2, 0xf1, 0x56, 0x9c, 0x0e, 0xa6\ndb 0x18, 0x62, 0xc4, 0xe2, 0x86, 0x38, 0x76, 0x30, 0x2f, 0xa1, 0xe4, 0xa7, 0x0e, 0x5d, 0x53, 0xeb\ndb 0x14, 0x45, 0xe0, 0xb7, 0xe1, 0xe8, 0x02, 0x68, 0x1a, 0xfe, 0x8e, 0xc1, 0x8f, 0xf2, 0xeb, 0x46\ndb 0x7f, 0x5d, 0x6a, 0x23, 0x46, 0x97, 0x2e, 0x03, 0x98, 0x12, 0x32, 0x8f, 0x54, 0x76, 0x59, 0xac\ndb 0xc8, 0x76, 0x5f, 0xc8, 0x71, 0x0c, 0xd3, 0xb6, 0xc5, 0x19, 0xea, 0xab, 0xa6, 0x2c, 0x1d, 0x88\n\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x4848484848484848\",\n    \"MM1\": \"0x0\",\n    \"MM2\": \"0x0\",\n    \"MM3\": \"0x4847464544434241\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x0\nmov [rdx + 8 * 1], rax\nmov rax, -1\nmov [rdx + 8 * 2], rax\nmov rax, 0x8080808080808080\nmov [rdx + 8 * 3], rax\nmov rax, 0x0001020304050607\nmov [rdx + 8 * 4], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 0]\nmovq mm3, [rdx + 8 * 0]\n\npshufb mm0, [rdx + 8 * 1]\npshufb mm1, [rdx + 8 * 2]\npshufb mm2, [rdx + 8 * 3]\npshufb mm3, [rdx + 8 * 4]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_00_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x4444444444444444\",\n    \"MM1\": \"0x0\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\n\npshufb mm0, [rdx + 8 * 1]\npshufb mm1, [rdx + 8 * 2]\n\nhlt\n\nalign 8\n.data:\n; Incoming vector\ndq 0x4142434445464748\n; Test bits with trash data in reserved bits to ensure it is ignored\n; Select single element\ndq 0x7C7C7C7C7C7C7C7C\n; Clear element\ndq 0xF8F8F8F8F8F8F8F8\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xA4A6ACAE84868C8E\",\n    \"MM1\": \"0x84868C8EA4A6ACAE\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\n\nphaddw mm0, [rdx + 8 * 1]\nphaddw mm1, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xA6A8AAAC86888A8C\",\n    \"MM1\": \"0x86888A8CA6A8AAAC\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\n\nphaddd mm0, [rdx + 8 * 1]\nphaddd mm1, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x7FFF7FFF7FFF7FFF\",\n    \"MM1\": \"0x7FFF7FFF7FFF7FFF\",\n    \"MM2\": \"0x7FFF7FFF7FFF7FFF\",\n    \"MM3\": \"0x8000800080008000\",\n    \"MM4\": \"0x800080007FFF7FFF\",\n    \"MM5\": \"0x7FFF7FFF80008000\",\n    \"MM6\": \"0x71836D874331472D\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x7F7F7F7F7F7F7F7F\nmov [rdx + 8 * 2], rax\nmov rax, 0x8080808080808080\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x2119221823172416\nmov [rdx + 8 * 4], rax\nmov rax, 0x3941384237433644\nmov [rdx + 8 * 5], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\nmovq mm2, [rdx + 8 * 2]\nmovq mm3, [rdx + 8 * 3]\nmovq mm4, [rdx + 8 * 2]\nmovq mm5, [rdx + 8 * 3]\nmovq mm6, [rdx + 8 * 4]\n\nphaddsw mm0, [rdx + 8 * 1]\nphaddsw mm1, [rdx + 8 * 0]\n\nphaddsw mm2, [rdx + 8 * 2]\nphaddsw mm3, [rdx + 8 * 3]\n\nphaddsw mm4, [rdx + 8 * 3]\nphaddsw mm5, [rdx + 8 * 2]\n\nphaddsw mm6, [rdx + 8 * 5]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0\",\n    \"MM1\": \"0xFE02FE02FE02FE02\",\n    \"MM2\": \"0x7E027E027E027E02\",\n    \"MM3\": \"0x7FFF7FFF7FFF7FFF\",\n    \"MM4\": \"0x0D130E5F0EB90F99\",\n    \"MM5\": \"0x2D132E5F2FB93099\",\n    \"MM6\": \"0x483B48E649914A3C\",\n    \"MM7\": \"0x283B28E629912A3C\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0\nmov [rdx + 8 * 0], rax\n\nmov rax, -1\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x7F7F7F7F7F7F7F7F\nmov [rdx + 8 * 2], rax\n\nmov rax, 0x8141824383448445\nmov [rdx + 8 * 6], rax\nmov rax, 0x21F223F323F424F5\nmov [rdx + 8 * 7], rax\n\nmov rax, 0xE251E352E453E554\nmov [rdx + 8 * 8], rax\nmov rax, 0x71A972A873A774A6\nmov [rdx + 8 * 9], rax\n\n; Zero\nmovq mm0, [rdx + 8 * 0]\npmaddubsw mm0, [rdx + 8 * 0]\n\n; -1\nmovq mm1, [rdx + 8 * 1]\npmaddubsw mm1, [rdx + 8 * 1]\n\n; 127\nmovq mm2, [rdx + 8 * 2]\npmaddubsw mm2, [rdx + 8 * 2]\n\n; 255 and 127\nmovq mm3, [rdx + 8 * 1]\npmaddubsw mm3, [rdx + 8 * 2]\n\n; Mixture\nmovq mm4, [rdx + 8 * 6]\npmaddubsw mm4, [rdx + 8 * 7]\n\nmovq mm5, [rdx + 8 * 7]\npmaddubsw mm5, [rdx + 8 * 6]\n\nmovq mm6, [rdx + 8 * 8]\npmaddubsw mm6, [rdx + 8 * 9]\n\nmovq mm7, [rdx + 8 * 9]\npmaddubsw mm7, [rdx + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0202020202020202\",\n    \"MM1\": \"0x0202020202020202\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\n\nphsubw mm0, [rdx + 8 * 1]\nphsubw mm1, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0404040404040404\",\n    \"MM1\": \"0x0404040404040404\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\n\nphsubd mm0, [rdx + 8 * 1]\nphsubd mm1, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0202020202020202\",\n    \"MM1\": \"0x0202020202020202\",\n    \"MM2\": \"0x0\",\n    \"MM3\": \"0x0\",\n    \"MM4\": \"0x0\",\n    \"MM5\": \"0x0\",\n    \"MM6\": \"0xFF01FF0100FF00FF\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x7F7F7F7F7F7F7F7F\nmov [rdx + 8 * 2], rax\nmov rax, 0x8080808080808080\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x2119221823172416\nmov [rdx + 8 * 4], rax\nmov rax, 0x3941384237433644\nmov [rdx + 8 * 5], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\nmovq mm2, [rdx + 8 * 2]\nmovq mm3, [rdx + 8 * 3]\nmovq mm4, [rdx + 8 * 2]\nmovq mm5, [rdx + 8 * 3]\nmovq mm6, [rdx + 8 * 4]\n\nphsubsw mm0, [rdx + 8 * 1]\nphsubsw mm1, [rdx + 8 * 0]\n\nphsubsw mm2, [rdx + 8 * 2]\nphsubsw mm3, [rdx + 8 * 3]\n\nphsubsw mm4, [rdx + 8 * 3]\nphsubsw mm5, [rdx + 8 * 2]\n\nphsubsw mm6, [rdx + 8 * 5]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_08.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM4\": \"0x0\",\n    \"MM5\": \"0xFEFEFEFEFEFEFEFE\",\n    \"MM6\": \"0x0202020202020202\",\n    \"MM7\": \"0xFE000200FE02FE00\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 1], rax\nmov rax, 0x0101010101010101\nmov [rdx + 8 * 2], rax\nmov rax, 0x0202020202020202\nmov [rdx + 8 * 3], rax\nmov rax, 0xFF000100FF01FF00\nmov [rdx + 8 * 4], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\nmovq mm2, [rdx + 8 * 2]\nmovq mm3, [rdx + 8 * 4]\n\nmovq mm4, [rdx + 8 * 3]\nmovq mm5, [rdx + 8 * 3]\nmovq mm6, [rdx + 8 * 3]\nmovq mm7, [rdx + 8 * 3]\n\n; Test with full zero\npsignb mm4, mm0\n\n; Test with full negative\npsignb mm5, mm1\n\n; Test with full positive\npsignb mm6, mm2\n\n; Test a mix\npsignb mm7, mm3\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_09.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM4\": \"0x0\",\n    \"MM5\": \"0xFBFEFBFEFBFEFBFE\",\n    \"MM6\": \"0x0402040204020402\",\n    \"MM7\": \"0xFBFE04020000FBFE\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 1], rax\nmov rax, 0x0001000100010001\nmov [rdx + 8 * 2], rax\nmov rax, 0x0402040204020402\nmov [rdx + 8 * 3], rax\nmov rax, 0xFFFF00010000FFFF\nmov [rdx + 8 * 4], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\nmovq mm2, [rdx + 8 * 2]\nmovq mm3, [rdx + 8 * 4]\n\nmovq mm4, [rdx + 8 * 3]\nmovq mm5, [rdx + 8 * 3]\nmovq mm6, [rdx + 8 * 3]\nmovq mm7, [rdx + 8 * 3]\n\n; Test with full zero\npsignw mm4, mm0\n\n; Test with full negative\npsignw mm5, mm1\n\n; Test with full positive\npsignw mm6, mm2\n\n; Test a mix\npsignw mm7, mm3\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_0A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM4\": \"0x0\",\n    \"MM5\": \"0xFAFBFCFEFDFCFBFB\",\n    \"MM6\": \"0x0504030202030405\",\n    \"MM7\": \"0xFAFBFCFE00000000\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 1], rax\nmov rax, 0x0000000100000001\nmov [rdx + 8 * 2], rax\nmov rax, 0x0504030202030405\nmov [rdx + 8 * 3], rax\nmov rax, 0xFFFFFFFF00000000\nmov [rdx + 8 * 4], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\nmovq mm2, [rdx + 8 * 2]\nmovq mm3, [rdx + 8 * 4]\n\nmovq mm4, [rdx + 8 * 3]\nmovq mm5, [rdx + 8 * 3]\nmovq mm6, [rdx + 8 * 3]\nmovq mm7, [rdx + 8 * 3]\n\n; Test with full zero\npsignd mm4, mm0\n\n; Test with full negative\npsignd mm5, mm1\n\n; Test with full positive\npsignd mm6, mm2\n\n; Test a mix\npsignd mm7, mm3\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_0B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x00830087008B008F\",\n    \"MM1\": \"0x0100FF0000FF0100\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x8001800280038004\nmov [rdx + 8 * 1], rax\nmov rax, 0x0101010101010101\nmov [rdx + 8 * 2], rax\nmov rax, 0xFF000100FF01FF00\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\n\npmulhrsw mm0, [rdx + 8 * 2]\n\npmulhrsw mm1, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_1C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0\",\n    \"MM1\": \"0x0101010101010101\",\n    \"MM2\": \"0x0101010101010101\",\n    \"MM3\": \"0x0100010001010100\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 1], rax\nmov rax, 0x0101010101010101\nmov [rdx + 8 * 2], rax\nmov rax, 0xFF000100FF01FF00\nmov [rdx + 8 * 3], rax\n\n; Test with full zero\npabsb mm0, [rdx + 8 * 0]\n\n; Test with full negative\npabsb mm1, [rdx + 8 * 1]\n\n; Test with full positive\npabsb mm2, [rdx + 8 * 2]\n\n; Test a mix\npabsb mm3, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_1D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0\",\n    \"MM1\": \"0x0001000100010001\",\n    \"MM2\": \"0x0001000100010001\",\n    \"MM3\": \"0x0001000100000001\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 1], rax\nmov rax, 0x0001000100010001\nmov [rdx + 8 * 2], rax\nmov rax, 0xFFFF00010000FFFF\nmov [rdx + 8 * 3], rax\n\n; Test with full zero\npabsw mm0, [rdx + 8 * 0]\n\n; Test with full negative\npabsw mm1, [rdx + 8 * 1]\n\n; Test with full positive\npabsw mm2, [rdx + 8 * 2]\n\n; Test a mix\npabsw mm3, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/XX_1E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0\",\n    \"MM1\": \"0x0000000100000001\",\n    \"MM2\": \"0x0000000100000001\",\n    \"MM3\": \"0x0000000100000000\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 1], rax\nmov rax, 0x0000000100000001\nmov [rdx + 8 * 2], rax\nmov rax, 0xFFFFFFFF00000000\nmov [rdx + 8 * 3], rax\n\n; Test with full zero\npabsd mm0, [rdx + 8 * 0]\n\n; Test with full negative\npabsd mm1, [rdx + 8 * 1]\n\n; Test with full positive\npabsd mm2, [rdx + 8 * 2]\n\n; Test a mix\npabsd mm3, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/adcx.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": \"2\",\n      \"RBX\": \"3\",\n      \"RCX\": \"1\",\n      \"RDX\": \"2\",\n      \"RSI\": \"1\",\n      \"RDI\": \"3\"\n  },\n  \"HostFeatures\": [\"ADX\"]\n}\n%endif\n\n; Test with no carry\nmov rax, 1\nclc\nadcx rax, rax\n\n; Test with carry\nmov rcx, 1\nmov rbx, 1\nstc\nadcx rbx, rcx\n\n; 32-bit registers\n\n; Test with no carry\nmov edx, 1\nclc\nadcx edx, edx\n\n; Test with carry\nmov esi, 1\nmov edi, 1\nstc\nadcx edi, esi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/adox.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": \"0\",\n      \"RBX\": \"1\",\n      \"RCX\": \"0xFFFFFFFFFFFFFFFF\",\n      \"RDX\": \"0\",\n      \"RSI\": \"0xFFFFFFFF\",\n      \"RDI\": \"1\"\n  },\n  \"HostFeatures\": [\"ADX\"]\n}\n%endif\n\n; Test with no overflow\nmov rax, -1\nmov rbx, 1\nadox rax, rbx\n\n; Test with overflow (flag set from previous adox)\nmov rbx, 1\nmov rcx, -1\nadox rbx, rcx\n\n; Clear OF for 32-bit tests.\ntest al, al\n\n; 32-bit registers\n\n; Test with no overflow\nmov edx, -1\nmov esi, 1\nadox edx, esi\n\n; Test with overflow (flag set from previous adox)\nmov edi, 1\nmov esi, -1\nadox edi, esi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F38/sha1msg1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM1\": [\"0x5790A6E435CD1A3E\", \"0x3CEC3979BF41FAEF\"],\n      \"XMM2\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\"]\n  },\n  \"HostFeatures\": [\"SHA\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\n\nsha1msg1 xmm1, xmm2\n\nhlt\n\nalign 16\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\n"
  },
  {
    "path": "unittests/ASM/H0F38/sha1msg2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM1\": [\"0x1B0233CC7FCDBB45\", \"0x1ECD2142EC058BF8\"],\n      \"XMM2\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\"]\n  },\n  \"HostFeatures\": [\"SHA\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\n\nsha1msg2 xmm1, xmm2\n\nhlt\n\nalign 16\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\n"
  },
  {
    "path": "unittests/ASM/H0F38/sha1nexte.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM1\": [\"0x6868C3F3AAED56E0\", \"0xD7DD078194E6E6DE\"],\n      \"XMM2\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\"]\n  },\n  \"HostFeatures\": [\"SHA\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\n\n; XMM1 is expected to contain the same value as XMM2\n; but with the top 32-bit word set to an equivalent\n; of XMM2[127:96] + (XMM1[127:96] ROL 30)\n\nsha1nexte xmm1, xmm2\n\nhlt\n\nalign 16\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\n"
  },
  {
    "path": "unittests/ASM/H0F38/sha256msg1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM1\": [\"0x43DEA25DAB8EF585\", \"0x1D30D1491042EED2\"],\n      \"XMM2\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\"]\n  },\n  \"HostFeatures\": [\"SHA\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\n\nsha256msg1 xmm1, xmm2\n\nhlt\n\nalign 16\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\n"
  },
  {
    "path": "unittests/ASM/H0F38/sha256msg2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM1\": [\"0x915D686150BD9E36\", \"0xB499245E9B33D33D\"],\n      \"XMM2\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\"]\n  },\n  \"HostFeatures\": [\"SHA\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\n\nsha256msg2 xmm1, xmm2\n\nhlt\n\nalign 16\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\n"
  },
  {
    "path": "unittests/ASM/H0F38/sha256rnds2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM1\": [\"0x97D4574EE323773D\", \"0xA934C32F562D8E88\"],\n      \"XMM2\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\"]\n  },\n  \"HostFeatures\": [\"SHA\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm0, [rdx + 16 * 2]\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\n\nsha256rnds2 xmm1, xmm2\n\nhlt\n\nalign 16\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\ndb 0xc7, 0xcd, 0x73, 0xec, 0x95, 0xd6, 0x6f, 0x6a, 0xbb, 0xae, 0xf2, 0xbb, 0x27, 0xb9, 0xa1, 0xdd\n"
  },
  {
    "path": "unittests/ASM/H0F3A/0_66_0F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x7861626364656667\", \"0x4871727374757677\"],\n    \"XMM2\": [\"0x7861626364656667\", \"0x4871727374757677\"],\n    \"XMM3\": [\"0x5354555657584142\", \"0x0000000000005152\"],\n    \"XMM4\": [\"0x0\", \"0x0\"],\n    \"XMM5\": [\"0x6162636465666768\", \"0x7172737475767778\"]\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 16]\n\npalignr xmm0, xmm1, 1\n\nmovapd xmm2, [rdx]\nmovapd xmm3, [rdx + 16]\n\ndb 0x48 ; Glues Rex.W to the start of the instruction\npalignr xmm2, xmm3, 1\n\nmovapd xmm3, [rdx]\nmovapd xmm4, [rdx + 16]\n\npalignr xmm3, xmm4, 22\n\nmovapd xmm4, [rdx]\nmovapd xmm5, [rdx + 16]\n\npalignr xmm4, xmm5, 32\n\nmovapd xmm5, [rdx]\nmovapd xmm6, [rdx + 16]\n\npalignr xmm5, xmm6, 0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F3A/0_66_21.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434465666768\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434461626364\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x7576777845464748\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4142434445464748\", \"0x5152535471727374\"],\n    \"XMM4\":  [\"0x4142434445464748\", \"0x7576777855565758\"],\n    \"XMM5\":  [\"0x4142434445464748\", \"0x5152535475767778\"],\n    \"XMM6\":  [\"0x7576777845464748\", \"0x5152535455565758\"],\n    \"XMM7\":  [\"0x4142434475767778\", \"0x5152535455565758\"],\n    \"XMM8\":  [\"0x0000000065666768\", \"0x5152535455565758\"],\n    \"XMM9\":  [\"0x0000000061626364\", \"0x5152535455565758\"],\n    \"XMM10\": [\"0x0000000000000000\", \"0x0000000000000000\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx]\nmovapd xmm3, [rdx]\nmovapd xmm4, [rdx]\nmovapd xmm5, [rdx]\nmovapd xmm6, [rdx]\nmovapd xmm7, [rdx]\nmovapd xmm8, [rdx]\nmovapd xmm9, [rdx]\nmovapd xmm10, [rdx]\nmovapd xmm15, [rdx + 8 * 2]\n\n; Simple move Reg<-Reg\ninsertps xmm0, xmm15, ((0b00 << 6) | (0b00 << 4) | (0b0000))\ninsertps xmm1, xmm15, ((0b01 << 6) | (0b00 << 4) | (0b0000))\ninsertps xmm2, xmm15, ((0b10 << 6) | (0b01 << 4) | (0b0000))\ninsertps xmm3, xmm15, ((0b11 << 6) | (0b10 << 4) | (0b0000))\n\n; Simple move Reg<-Mem\ninsertps xmm4, [rdx + 8 * 3], ((0b00 << 6) | (0b11 << 4) | (0b0000))\ninsertps xmm5, [rdx + 8 * 3], ((0b01 << 6) | (0b10 << 4) | (0b0000))\ninsertps xmm6, [rdx + 8 * 3], ((0b10 << 6) | (0b01 << 4) | (0b0000))\ninsertps xmm7, [rdx + 8 * 3], ((0b11 << 6) | (0b00 << 4) | (0b0000))\n\n; Simple move Reg<-Reg with mask\ninsertps xmm8, xmm15, ((0b00 << 6) | (0b00 << 4) | (0b0010))\ninsertps xmm9, xmm15, ((0b01 << 6) | (0b00 << 4) | (0b0010))\n\n; Full ZMask\ninsertps xmm10, xmm15, ((0b00 << 6) | (0b00 << 4) | (0b1111))\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F3A/0_66_DF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x6363636363636363\", \"0x6363636363636363\"],\n    \"XMM1\": [\"0x1616161616161616\", \"0x1616161616161616\"],\n    \"XMM2\": [\"0x7c6363636363637c\", \"0x7c6363636363637c\"],\n    \"XMM3\": [\"0x1616161616161616\", \"0x7c6363636363637c\"],\n    \"XMM4\": [\"0x6363636263636363\", \"0x6363636263636363\"],\n    \"XMM5\": [\"0x1616161416161616\", \"0x1616161416161616\"],\n    \"XMM6\": [\"0x7c6363606363637c\", \"0x7c6363606363637c\"],\n    \"XMM7\": [\"0x1616161216161616\", \"0x7c6363676363637c\"],\n    \"XMM8\": [\"0x6363636663636363\", \"0x6363636663636363\"],\n    \"XMM9\": [\"0x1616161016161616\", \"0x1616161016161616\"],\n    \"XMM10\": [\"0x7c6363646363637c\", \"0x7c6363646363637c\"],\n    \"XMM11\": [\"0x1616161e16161616\", \"0x7c63636b6363637c\"],\n    \"XMM12\": [\"0x6363636a63636363\", \"0x6363636a63636363\"],\n    \"XMM13\": [\"0x1616161c16161616\", \"0x1616161c16161616\"],\n    \"XMM14\": [\"0x7c6363686363637c\", \"0x7c6363686363637c\"],\n    \"XMM15\": [\"0x1616161a16161616\", \"0x7c63636f6363637c\"]\n  },\n  \"HostFeatures\": [\"AES\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0000000100000001\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, 0xFFFFFFFF00000000\nmov [rdx + 8 * 6], rax\nmov rax, 0x00000001FFFFFFFF\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x0202020202020202\nmov [rdx + 8 * 8], rax\nmov rax, 0x0303030303030303\nmov [rdx + 8 * 9], rax\n\naeskeygenassist xmm0, [rdx + 8 * 0], 0\naeskeygenassist xmm1, [rdx + 8 * 2], 0\naeskeygenassist xmm2, [rdx + 8 * 4], 0\naeskeygenassist xmm3, [rdx + 8 * 6], 0\n\naeskeygenassist xmm4, [rdx + 8 * 0], 1\naeskeygenassist xmm5, [rdx + 8 * 2], 2\naeskeygenassist xmm6, [rdx + 8 * 4], 3\naeskeygenassist xmm7, [rdx + 8 * 6], 4\n\naeskeygenassist xmm8, [rdx + 8 * 0], 5\naeskeygenassist xmm9, [rdx + 8 * 2], 6\naeskeygenassist xmm10, [rdx + 8 * 4], 7\naeskeygenassist xmm11, [rdx + 8 * 6], 8\n\naeskeygenassist xmm12, [rdx + 8 * 0], 9\naeskeygenassist xmm13, [rdx + 8 * 2], 10\naeskeygenassist xmm14, [rdx + 8 * 4], 11\naeskeygenassist xmm15, [rdx + 8 * 6], 12\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F3A/0_XX_0F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x4851525354555657\",\n    \"MM2\": \"0x0061626364656667\",\n    \"MM3\": \"0x0\",\n    \"MM4\": \"0x5152535455565758\"\n  },\n  \"HostFeatures\": [\"SSSE3\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\nmovq mm1, [rdx + 8 * 1]\n\npalignr mm0, mm1, 1\n\nmovq mm2, [rdx + 8 * 2]\nmovq mm3, [rdx + 8 * 3]\n\npalignr mm2, mm3, 9\n\nmovq mm3, [rdx + 8 * 2]\nmovq mm4, [rdx + 8 * 3]\n\npalignr mm3, mm4, 16\n\nmovq mm4, [rdx + 8]\nmovq mm5, [rdx + 8 * 1]\n\npalignr mm4, mm5, 0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_08.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x8000000000000000\", \"0xc000000040000000\"],\n    \"XMM1\": [\"0xbf80000000000000\", \"0xc00000003f800000\"],\n    \"XMM2\": [\"0x800000003f800000\", \"0xbf80000040000000\"],\n    \"XMM3\": [\"0x8000000000000000\", \"0xbf8000003f800000\"],\n    \"XMM4\": [\"0x8000000000000000\", \"0xc000000040000000\"],\n    \"XMM5\": [\"0xbf80000000000000\", \"0xc00000003f800000\"],\n    \"XMM6\": [\"0x800000003f800000\", \"0xbf80000040000000\"],\n    \"XMM7\": [\"0x8000000000000000\", \"0xbf8000003f800000\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nroundps xmm0, [rdx + 8 * 0], 00000000b ; Nearest\nroundps xmm1, [rdx + 8 * 0], 00000001b ; -inf\nroundps xmm2, [rdx + 8 * 0], 00000010b ; +inf\nroundps xmm3, [rdx + 8 * 0], 00000011b ; truncate\n\n; MXCSR\n; Set to nearest\nmov eax, 0x1F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundps xmm4, [rdx + 8 * 0], 00000100b\n\n; Set to -inf\nmov eax, 0x3F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundps xmm5, [rdx + 8 * 0], 00000100b\n\n; Set to +inf\nmov eax, 0x5F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundps xmm6, [rdx + 8 * 0], 00000100b\n\n; Set to truncate\nmov eax, 0x7F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundps xmm7, [rdx + 8 * 0], 00000100b\n\nhlt\n\nalign 4096\n.data:\ndd 0.5, -0.5, 1.5, -1.5\ndq 0, 0\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_09.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000000000000\", \"0x8000000000000000\"],\n    \"XMM1\": [\"0x0000000000000000\", \"0xbff0000000000000\"],\n    \"XMM2\": [\"0x3ff0000000000000\", \"0x8000000000000000\"],\n    \"XMM3\": [\"0x0000000000000000\", \"0x8000000000000000\"],\n    \"XMM4\": [\"0x0000000000000000\", \"0x8000000000000000\"],\n    \"XMM5\": [\"0x0000000000000000\", \"0xbff0000000000000\"],\n    \"XMM6\": [\"0x3ff0000000000000\", \"0x8000000000000000\"],\n    \"XMM7\": [\"0x0000000000000000\", \"0x8000000000000000\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nroundpd xmm0, [rdx + 8 * 0], 00000000b ; Nearest\nroundpd xmm1, [rdx + 8 * 0], 00000001b ; -inf\nroundpd xmm2, [rdx + 8 * 0], 00000010b ; +inf\nroundpd xmm3, [rdx + 8 * 0], 00000011b ; truncate\n\n; MXCSR\n; Set to nearest\nmov eax, 0x1F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundpd xmm4, [rdx + 8 * 0], 00000100b\n\n; Set to -inf\nmov eax, 0x3F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundpd xmm5, [rdx + 8 * 0], 00000100b\n\n; Set to +inf\nmov eax, 0x5F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundpd xmm6, [rdx + 8 * 0], 00000100b\n\n; Set to truncate\nmov eax, 0x7F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundpd xmm7, [rdx + 8 * 0], 00000100b\n\nhlt\n\nalign 4096\n.data:\ndq 0.5, -0.5\ndq 0, 0\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_0A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xbf00000000000000\", \"0xbfc000003fc00000\"],\n    \"XMM1\": [\"0xbf00000000000000\", \"0xbfc000003fc00000\"],\n    \"XMM2\": [\"0xbf0000003f800000\", \"0xbfc000003fc00000\"],\n    \"XMM3\": [\"0xbf00000000000000\", \"0xbfc000003fc00000\"],\n    \"XMM4\": [\"0xbf00000000000000\", \"0xbfc000003fc00000\"],\n    \"XMM5\": [\"0xbf00000000000000\", \"0xbfc000003fc00000\"],\n    \"XMM6\": [\"0xbf0000003f800000\", \"0xbfc000003fc00000\"],\n    \"XMM7\": [\"0xbf00000000000000\", \"0xbfc000003fc00000\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 0]\nmovaps xmm2, [rdx + 8 * 0]\nmovaps xmm3, [rdx + 8 * 0]\nmovaps xmm4, [rdx + 8 * 0]\nmovaps xmm5, [rdx + 8 * 0]\nmovaps xmm6, [rdx + 8 * 0]\nmovaps xmm7, [rdx + 8 * 0]\n\nroundss xmm0, [rdx + 8 * 0], 00000000b ; Nearest\nroundss xmm1, [rdx + 8 * 0], 00000001b ; -inf\nroundss xmm2, [rdx + 8 * 0], 00000010b ; +inf\nroundss xmm3, [rdx + 8 * 0], 00000011b ; truncate\n\n; MXCSR\n; Set to nearest\nmov eax, 0x1F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundss xmm4, [rdx + 8 * 0], 00000100b\n\n; Set to -inf\nmov eax, 0x3F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundss xmm5, [rdx + 8 * 0], 00000100b\n\n; Set to +inf\nmov eax, 0x5F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundss xmm6, [rdx + 8 * 0], 00000100b\n\n; Set to truncate\nmov eax, 0x7F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundss xmm7, [rdx + 8 * 0], 00000100b\n\nhlt\n\nalign 4096\n.data:\ndd 0.5, -0.5, 1.5, -1.5\ndq 0, 0\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_0B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000000000000\", \"0xbfe0000000000000\"],\n    \"XMM1\": [\"0x0000000000000000\", \"0xbfe0000000000000\"],\n    \"XMM2\": [\"0x3ff0000000000000\", \"0xbfe0000000000000\"],\n    \"XMM3\": [\"0x0000000000000000\", \"0xbfe0000000000000\"],\n    \"XMM4\": [\"0x0000000000000000\", \"0xbfe0000000000000\"],\n    \"XMM5\": [\"0x0000000000000000\", \"0xbfe0000000000000\"],\n    \"XMM6\": [\"0x3ff0000000000000\", \"0xbfe0000000000000\"],\n    \"XMM7\": [\"0x0000000000000000\", \"0xbfe0000000000000\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 0]\nmovaps xmm2, [rdx + 8 * 0]\nmovaps xmm3, [rdx + 8 * 0]\nmovaps xmm4, [rdx + 8 * 0]\nmovaps xmm5, [rdx + 8 * 0]\nmovaps xmm6, [rdx + 8 * 0]\nmovaps xmm7, [rdx + 8 * 0]\n\nroundsd xmm0, [rdx + 8 * 0], 00000000b ; Nearest\nroundsd xmm1, [rdx + 8 * 0], 00000001b ; -inf\nroundsd xmm2, [rdx + 8 * 0], 00000010b ; +inf\nroundsd xmm3, [rdx + 8 * 0], 00000011b ; truncate\n\n; MXCSR\n; Set to nearest\nmov eax, 0x1F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundsd xmm4, [rdx + 8 * 0], 00000100b\n\n; Set to -inf\nmov eax, 0x3F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundsd xmm5, [rdx + 8 * 0], 00000100b\n\n; Set to +inf\nmov eax, 0x5F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundsd xmm6, [rdx + 8 * 0], 00000100b\n\n; Set to truncate\nmov eax, 0x7F80\nmov [rdx + 8 * 2], eax\nldmxcsr [rdx + 8 * 2]\n\nroundsd xmm7, [rdx + 8 * 0], 00000100b\n\nhlt\n\nalign 4096\n.data:\ndq 0.5, -0.5\ndq 0, 0\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_0C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4054c664c2f837b5\", \"0x40516053e2d6238e\"],\n    \"XMM1\":  [\"0x4044836d7aa25d8d\", \"0x402a1e1c58255b03\"],\n    \"XMM2\":  [\"0x4047ec6bc9d9d346\", \"0x4035fe425aee6320\"],\n    \"XMM3\":  [\"0x4047ec6b7aa25d8d\", \"0x40154b7d41743e96\"],\n    \"XMM4\":  [\"0x403d075a31a4bdba\", \"0x4050a01882d38477\"],\n    \"XMM5\":  [\"0x40334ec17aa25d8d\", \"0x4056d74082d38477\"],\n    \"XMM6\":  [\"0x4047ec6bc7cd898b\", \"0x40497b1382d38477\"],\n    \"XMM7\":  [\"0x4047ec6b7aa25d8d\", \"0x4037f9ca82d38477\"],\n    \"XMM8\":  [\"0x4056a929888f861a\", \"0x4055031766e43aa8\"],\n    \"XMM9\":  [\"0x4058bc1f7aa25d8d\", \"0x40550317c91d14e4\"],\n    \"XMM10\": [\"0x4047ec6ba10e0221\", \"0x4055031700bcbe62\"],\n    \"XMM11\": [\"0x4047ec6b7aa25d8d\", \"0x405503170ed3d85a\"],\n    \"XMM12\": [\"0x40419d2253111f0c\", \"0x4055031782d38477\"],\n    \"XMM13\": [\"0x40177e287aa25d8d\", \"0x4055031782d38477\"],\n    \"XMM14\": [\"0x4047ec6b9f16b11c\", \"0x4055031782d38477\"],\n    \"XMM15\": [\"0x4047ec6b7aa25d8d\", \"0x4055031782d38477\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm0,  [rdx + 16 * 0]\nmovaps xmm1,  [rdx + 16 * 1]\nmovaps xmm2,  [rdx + 16 * 2]\nmovaps xmm3,  [rdx + 16 * 3]\nmovaps xmm4,  [rdx + 16 * 4]\nmovaps xmm5,  [rdx + 16 * 5]\nmovaps xmm6,  [rdx + 16 * 6]\nmovaps xmm7,  [rdx + 16 * 7]\nmovaps xmm8,  [rdx + 16 * 8]\nmovaps xmm9,  [rdx + 16 * 9]\nmovaps xmm10, [rdx + 16 * 10]\nmovaps xmm11, [rdx + 16 * 11]\nmovaps xmm12, [rdx + 16 * 12]\nmovaps xmm13, [rdx + 16 * 13]\nmovaps xmm14, [rdx + 16 * 14]\nmovaps xmm15, [rdx + 16 * 15]\n\nblendps xmm0,  [rdx + 16 * 16], 0000b\nblendps xmm1,  [rdx + 16 * 16], 0001b\nblendps xmm2,  [rdx + 16 * 16], 0010b\nblendps xmm3,  [rdx + 16 * 16], 0011b\nblendps xmm4,  [rdx + 16 * 16], 0100b\nblendps xmm5,  [rdx + 16 * 16], 0101b\nblendps xmm6,  [rdx + 16 * 16], 0110b\nblendps xmm7,  [rdx + 16 * 16], 0111b\nblendps xmm8,  [rdx + 16 * 16], 1000b\nblendps xmm9,  [rdx + 16 * 16], 1001b\nblendps xmm10, [rdx + 16 * 16], 1010b\nblendps xmm11, [rdx + 16 * 16], 1011b\nblendps xmm12, [rdx + 16 * 16], 1100b\nblendps xmm13, [rdx + 16 * 16], 1101b\nblendps xmm14, [rdx + 16 * 16], 1110b\nblendps xmm15, [rdx + 16 * 16], 1111b\n\nhlt\n\nalign 16\n; 512bytes of random data\n.data:\ndq 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_0D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\": [\"0x48510f254d2fa47f\", \"0x2b5774313a974886\"],\n    \"XMM2\": [\"0x58a9fc7b38c17718\", \"0x67d29af330ae762c\"],\n    \"XMM3\": [\"0xb615b9533de8ad09\", \"0xca79a24c3e9e3978\"],\n    \"XMM4\": [\"0x57fa6daf9af2e91c\", \"0x65f580205ffdc710\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\n\nblendpd xmm1, [rdx + 16 * 8],  00b\nblendpd xmm2, [rdx + 16 * 9],  01b\nblendpd xmm3, [rdx + 16 * 10], 10b\nblendpd xmm4, [rdx + 16 * 11], 11b\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_0E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x00000000c3768da8\",\n    \"XMM1\": [\"0x48510f254d2fa47f\", \"0x2b5774313a974886\"],\n    \"XMM2\": [\"0x30b556de1f6d7718\", \"0x67d29af330ae762c\"],\n    \"XMM3\": [\"0xb615b953255b4cf4\", \"0xb76472a37404b890\"],\n    \"XMM4\": [\"0x24426daf9af2e91c\", \"0x8a6789f2d415a567\"],\n    \"XMM5\": [\"0x4f1694dfa8fb773c\", \"0x19a26b823d3ca2a9\"],\n    \"XMM6\": [\"0x2ef9bb9202e0077f\", \"0xc97d9d031ed23dfa\"],\n    \"XMM7\": [\"0x944c0a76f8f69004\", \"0xb29bfeda8b8db7bc\"],\n    \"XMM8\": [\"0x10c41fa17837c17f\", \"0x099224327e5e296c\"],\n    \"XMM9\": [\"0x48510f254d2fa47f\", \"0x2b5774313a974886\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\n\npblendw xmm1, [rdx + 16 * 8],  00000000b\npblendw xmm2, [rdx + 16 * 9],  00000001b\npblendw xmm3, [rdx + 16 * 10], 00000011b\npblendw xmm4, [rdx + 16 * 11], 00000111b\npblendw xmm5, [rdx + 16 * 12], 00001111b\npblendw xmm6, [rdx + 16 * 13], 00011111b\npblendw xmm7, [rdx + 16 * 14], 00111111b\npblendw xmm8, [rdx + 16 * 15], 11111111b\n\n; We can't test all 256 swizzles so loop and crc the results.\n; Just loops over the 256-bytes of data, swizzling across all values for the swizzle.\nmov rax, 0\n%assign swizzle 0\n%rep 256\n\nmovaps xmm9, [rdx + ((16 * swizzle) % 256)]\npblendw xmm9, [rdx + ((16 * swizzle + 16) % 256)], swizzle\nmovaps [rel .data_temp], xmm9\ncrc32 rax, qword [rel .data_temp]\ncrc32 rax, qword [rel .data_temp + 8]\n\n%assign swizzle swizzle+1\n%endrep\n\nhlt\n\nalign 4096\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n\n.data_temp:\ndq 0, 0\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_14.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x000000000000007f\",\n    \"RBX\": \"0x0000000000000067\",\n    \"RCX\": \"0x0000888658818ae8\"\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\nmov rsi, 0xe0000000\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\n\nmov rax, 0\nmov [rsi + 8 * 0], rax\n\npextrb rax, xmm1, 0\npextrb rbx, xmm2, 0xFF\npextrb [rsi + 8 * 0 + 0], xmm3, 2\npextrb [rsi + 8 * 0 + 1], xmm4, 0xFF\npextrb [rsi + 8 * 0 + 2], xmm5, 4\npextrb [rsi + 8 * 0 + 3], xmm6, 5\npextrb [rsi + 8 * 0 + 4], xmm7, 6\npextrb [rsi + 8 * 0 + 5], xmm8, 7\nmov rcx, [rsi + 8 * 0]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_14_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RSP\": \"0x48\",\n    \"RBP\": \"0x47\",\n    \"RSI\": \"0x46\",\n    \"RDI\": \"0x45\"\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel data]\n\nmovaps xmm0, [rel data]\n\n; Special testing for storing in to registers rsp, rbp, rsi, rdi\n; These registers are in the 'high' modrm.reg encoding which can\n; mean ah/ch/dh/bh or rsp/rbp/rsi/rdi depending on instruction\n\nmov rsp, -1\nmov rbp, -1\nmov rsi, -1\nmov rdi, -1\n\npextrb rsp, xmm0, 0\npextrb rbp, xmm0, 1\npextrb rsi, xmm0, 2\npextrb rdi, xmm0, 3\n\nhlt\n\nalign 16\ndata:\ndq 0x4142434445464748\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_15.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x000000000000a47f\",\n    \"RBX\": \"0x00000000000067d2\",\n    \"RCX\": \"0x1ed2a2a98a67b953\"\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\nmov rsi, 0xe0000000\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\n\nmov rax, 0\nmov [rsi + 8 * 0], rax\n\n; Nasm only encodes pextrw instructions that have register as their destination with sse2\n; hand code these following instructions\n; pextrw eax, xmm1, 0\n; pextrw ebx, xmm2, 0xFF\ndb 0x66, 0x0f, 0x3a, 0x15, 0xc8, 0x00\ndb 0x66, 0x0f, 0x3a, 0x15, 0xd3, 0xFF\n\npextrw [rsi + 8 * 0 + 0], xmm3, 2\npextrw [rsi + 8 * 0 + 2], xmm4, 0xFF\npextrw [rsi + 8 * 0 + 4], xmm5, 4\npextrw [rsi + 8 * 0 + 6], xmm6, 5\nmov rcx, [rsi + 8 * 0]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x000000004d2fa47f\",\n    \"RBX\": \"0x0000000067d29af3\",\n    \"RCX\": \"0x8a6789f27404b890\",\n    \"RDX\": \"0x00f658ab78236612\"\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\nmov rsi, 0xe0000000\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\n\nmov rax, 0\nmov [rsi + 8 * 0], rax\n\npextrd eax, xmm1, 0\npextrd ebx, xmm2, 0xFF\npextrd [rsi + 8 * 0 + 0], xmm3, 2\npextrd [rsi + 8 * 0 + 4], xmm4, 0xFF\npextrd [rsi + 8 * 1 + 0], xmm5, 4\npextrd [rsi + 8 * 1 + 4], xmm6, 5\nmov rcx, [rsi + 8 * 0]\nmov rdx, [rsi + 8 * 1]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_16_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x48510f254d2fa47f\",\n    \"RBX\": \"0x67d29af330ae762c\",\n    \"RCX\": \"0xb615b9533de8ad09\",\n    \"RDX\": \"0x8a6789f2d415a567\",\n    \"RDI\": \"0x8996f88178236612\",\n    \"RSP\": \"0xc97d9d031ed21972\"\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\nmov rsi, 0xe0000000\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\n\nmov rax, 0\nmov [rsi + 8 * 0], rax\n\npextrq rax, xmm1, 0\npextrq rbx, xmm2, 0xFF\npextrq [rsi + 8 * 0], xmm3, 2\npextrq [rsi + 8 * 1], xmm4, 0xFF\npextrq [rsi + 8 * 2], xmm5, 4\npextrq [rsi + 8 * 3], xmm6, 5\nmov rcx, [rsi + 8 * 0]\nmov rdx, [rsi + 8 * 1]\nmov rdi, [rsi + 8 * 2]\nmov rsp, [rsi + 8 * 3]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_17.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x000000004d2fa47f\",\n    \"RBX\": \"0x0000000067d29af3\",\n    \"RCX\": \"0x8a6789f27404b890\",\n    \"RDX\": \"0x00f658ab78236612\"\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\nmov rsi, 0xe0000000\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\n\nmov rax, 0\nmov [rsi + 8 * 0], rax\n\nextractps eax, xmm1, 0\nextractps ebx, xmm2, 0xFF\nextractps [rsi + 8 * 0 + 0], xmm3, 2\nextractps [rsi + 8 * 0 + 4], xmm4, 0xFF\nextractps [rsi + 8 * 1 + 0], xmm5, 4\nextractps [rsi + 8 * 1 + 4], xmm6, 5\nmov rcx, [rsi + 8 * 0]\nmov rdx, [rsi + 8 * 1]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_20.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\": [\"0x48510f254d2fa47f\", \"0x2b5774313a974886\"],\n    \"XMM2\": [\"0x006b6b6b6b6b6b6b\", \"0x6b00000000000000\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\nmov rsi, 0xe0000000\n\nmov rax, 0\nmov [rsi + 8 * 0], rax\nmov [rsi + 8 * 1], rax\n\nmovaps xmm1, [rsi + 16 * 0]\nmovaps xmm2, [rsi + 16 * 0]\nmovaps xmm3, [rsi + 16 * 0]\nmovaps xmm4, [rsi + 16 * 0]\nmovaps xmm5, [rsi + 16 * 0]\nmovaps xmm6, [rsi + 16 * 0]\nmovaps xmm7, [rsi + 16 * 0]\nmovaps xmm8, [rsi + 16 * 0]\n\npinsrb xmm1, [rdx + 8 * 0 + 0], 0x00\npinsrb xmm1, [rdx + 8 * 0 + 1], 0x01\npinsrb xmm1, [rdx + 8 * 0 + 2], 0x02\npinsrb xmm1, [rdx + 8 * 0 + 3], 0x03\npinsrb xmm1, [rdx + 8 * 0 + 4], 0x04\npinsrb xmm1, [rdx + 8 * 0 + 5], 0x05\npinsrb xmm1, [rdx + 8 * 0 + 6], 0x06\npinsrb xmm1, [rdx + 8 * 0 + 7], 0x07\npinsrb xmm1, [rdx + 8 * 1 + 0], 0x08\npinsrb xmm1, [rdx + 8 * 1 + 1], 0x09\npinsrb xmm1, [rdx + 8 * 1 + 2], 0x0A\npinsrb xmm1, [rdx + 8 * 1 + 3], 0x0B\npinsrb xmm1, [rdx + 8 * 1 + 4], 0x0C\npinsrb xmm1, [rdx + 8 * 1 + 5], 0x0D\npinsrb xmm1, [rdx + 8 * 1 + 6], 0x0E\npinsrb xmm1, [rdx + 8 * 1 + 7], 0x0F\npinsrb xmm2, [rdx + 8 * 2 + 0], 0xFF\nmov rax, [rdx + 8 * 2 + 0]\n\npinsrb xmm2, eax, 0x00\npinsrb xmm2, eax, 0x01\npinsrb xmm2, eax, 0x02\npinsrb xmm2, eax, 0x03\npinsrb xmm2, eax, 0x04\npinsrb xmm2, eax, 0x05\npinsrb xmm2, eax, 0x06\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_20_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xFFFFFFFFFFFF42FF\", \"0xFFFFFFFFFFFFFFFF\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rsi, 0xe0000000\n\nmov rax, -1\nmov [rsi + 8 * 0], rax\nmov [rsi + 8 * 1], rax\n\nmovaps xmm0, [rsi + 16 * 0]\n\nmov rcx, 0\nmov edi, 0x42\n; This tests a frontend decoder bug in FEX\n; FEX thought this was ch\npinsrb xmm0, edi, 0x01\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_22.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\": [\"0x48510f254d2fa47f\", \"0x2b5774314d2fa47f\"],\n    \"XMM2\": [\"0x0000000000000000\", \"0x1f6de86b00000000\"],\n    \"XMM3\": [\"0x1f6de86b1f6de86b\", \"0x1f6de86b1f6de86b\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\nmov rsi, 0xe0000000\n\nmov rax, 0\nmov [rsi + 8 * 0], rax\nmov [rsi + 8 * 1], rax\n\nmovaps xmm1, [rsi + 16 * 0]\nmovaps xmm2, [rsi + 16 * 0]\nmovaps xmm3, [rsi + 16 * 0]\nmovaps xmm4, [rsi + 16 * 0]\nmovaps xmm5, [rsi + 16 * 0]\nmovaps xmm6, [rsi + 16 * 0]\nmovaps xmm7, [rsi + 16 * 0]\nmovaps xmm8, [rsi + 16 * 0]\n\npinsrd xmm1, [rdx + 8 * 0 + 0], 0x00\npinsrd xmm1, [rdx + 8 * 0 + 4], 0x01\npinsrd xmm1, [rdx + 8 * 0 + 0], 0x02\npinsrd xmm1, [rdx + 8 * 1 + 4], 0x03\npinsrd xmm2, [rdx + 8 * 2 + 0], 0xFF\nmov rax, [rdx + 8 * 2 + 0]\n\npinsrd xmm3, eax, 0x00\npinsrd xmm3, eax, 0x01\npinsrd xmm3, eax, 0x02\npinsrd xmm3, eax, 0x03\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_22_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\": [\"0x48510f254d2fa47f\", \"0x2b5774313a974886\"],\n    \"XMM2\": [\"0x0000000000000000\", \"0xb615b9533de8ad09\"],\n    \"XMM3\": [\"0x30b556de1f6de86b\", \"0x30b556de1f6de86b\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\nmov rsi, 0xe0000000\n\nmov rax, 0\nmov [rsi + 8 * 0], rax\nmov [rsi + 8 * 1], rax\n\nmovaps xmm1, [rsi + 16 * 0]\nmovaps xmm2, [rsi + 16 * 0]\nmovaps xmm3, [rsi + 16 * 0]\nmovaps xmm4, [rsi + 16 * 0]\nmovaps xmm5, [rsi + 16 * 0]\nmovaps xmm6, [rsi + 16 * 0]\nmovaps xmm7, [rsi + 16 * 0]\nmovaps xmm8, [rsi + 16 * 0]\n\npinsrq xmm1, [rdx + 8 * 0], 0x00\npinsrq xmm1, [rdx + 8 * 1], 0x01\npinsrq xmm2, [rdx + 8 * 4], 0xFF\nmov rax, [rdx + 8 * 2 + 0]\n\npinsrq xmm3, rax, 0x00\npinsrq xmm3, rax, 0x01\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_22_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3f800000\",\n    \"XMM0\": [\"0x4142434400000000\", \"0x5152535455565758\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nsection .text\nglobal _start\n\n_start:\nxor esi, esi\n\nmovapd xmm0, [rel arg1]\n\npextrd [rel val], xmm0, 0\npinsrd xmm0, esi, 0\n\nmov eax, [rel val]\nhlt\n\nalign 4096\nval: dd 0\n\nalign 128\narg1:\ndq 0x414243443f800000\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_40.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\": [\"0x492feb2e492feb2e\", \"0x492feb2e492feb2e\"],\n    \"XMM2\": [\"0x499a5226499a5226\", \"0x499a5226499a5226\"],\n    \"XMM3\": [\"0x494ecfa4494ecfa4\", \"0x494ecfa4494ecfa4\"],\n    \"XMM4\": [\"0x495f7816495f7816\", \"0x495f7816495f7816\"],\n    \"XMM5\": [\"0x496e3962496e3962\", \"0x496e3962496e3962\"],\n    \"XMM6\": [\"0\", \"0\"],\n    \"XMM7\": [\"0\", \"0\"],\n    \"XMM8\": [\"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\n\ndpps xmm1, [rdx + 16 * 8],  11111111b\ndpps xmm2, [rdx + 16 * 9],  11111111b\ndpps xmm3, [rdx + 16 * 10], 11111111b\ndpps xmm4, [rdx + 16 * 11], 11111111b\ndpps xmm5, [rdx + 16 * 12], 11111111b\ndpps xmm6, [rdx + 16 * 13], 00000000b\ndpps xmm7, [rdx + 16 * 14], 11110000b\ndpps xmm8, [rdx + 16 * 15], 00001111b\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndd 655.9708,532.2244,108.0451,512.4019,754.227,586.0859,127.7574,114.8167,764.4266,226.6145,337.864,320.3296,296.5247,480.0057,28.4267,565.9418,265.8255,536.4473,754.3489,460.681,818.7269,43.7204,464.592,847.9381,306.0592,702.7584,887.6473,551.5908,620.9001,520.9829,232.9532,510.3388,204.8474,225.626,564.973,790.5175,836.1953,844.5266,633.5626,501.7409,393.2616,674.4415,244.3265,971.1598,770.8029,746.1836,255.9902,567.7578,187.7175,924.181,466.4362,169.8267,651.7481,462.4206,396.6924,355.8538,6.148,523.1443,989.7004,713.6646,497.5427,657.6965,651.0534,778.5236\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_40_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0\", \"0\"],\n    \"XMM1\": [\"0x00000000c197f874\", \"0\"],\n    \"XMM2\": [\"0xff80000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x7a147e317a147e31\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x0000000000000000\", \"0x000000006cd0f887\"],\n    \"XMM5\": [\"0x000000007f800000\", \"0x000000007f800000\"],\n    \"XMM6\": [\"0xff80000000000000\", \"0x00000000ff800000\"],\n    \"XMM7\": [\"0xfc944256fc944256\", \"0x00000000fc944256\"],\n    \"XMM8\": [\"0x0000000000000000\", \"0xc3ac072e00000000\"],\n    \"XMM9\": [\"0x000000005c5c09a3\", \"0x5c5c09a300000000\"],\n    \"XMM10\": [\"0xdc34227c00000000\", \"0xdc34227c00000000\"],\n    \"XMM11\": [\"0xda1627d2da1627d2\", \"0xda1627d200000000\"],\n    \"XMM12\": [\"0x0000000000000000\", \"0x7f8000007f800000\"],\n    \"XMM13\": [\"0x000000005f30e9d3\", \"0x5f30e9d35f30e9d3\"],\n    \"XMM14\": [\"0xda3f264a00000000\", \"0xda3f264ada3f264a\"],\n    \"XMM15\": [\"0x7f8000007f800000\", \"0x7f8000007f800000\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmovaps xmm0,  [rel .data + 16 * 0]\nmovaps xmm1,  [rel .data + 16 * 1]\nmovaps xmm2,  [rel .data + 16 * 2]\nmovaps xmm3,  [rel .data + 16 * 3]\nmovaps xmm4,  [rel .data + 16 * 4]\nmovaps xmm5,  [rel .data + 16 * 5]\nmovaps xmm6,  [rel .data + 16 * 6]\nmovaps xmm7,  [rel .data + 16 * 7]\nmovaps xmm8,  [rel .data + 16 * 8]\nmovaps xmm9,  [rel .data + 16 * 9]\nmovaps xmm10, [rel .data + 16 * 10]\nmovaps xmm11, [rel .data + 16 * 11]\nmovaps xmm12, [rel .data + 16 * 12]\nmovaps xmm13, [rel .data + 16 * 13]\nmovaps xmm14, [rel .data + 16 * 14]\nmovaps xmm15, [rel .data + 16 * 15]\n\n; Full source mask but different broadcast tests\ndpps xmm0,  [rel .data + 16 * 16], 1111_0000b\ndpps xmm1,  [rel .data + 16 * 16], 1111_0001b\ndpps xmm2,  [rel .data + 16 * 16], 1111_0010b\ndpps xmm3,  [rel .data + 16 * 16], 1111_0011b\ndpps xmm4,  [rel .data + 16 * 16], 1111_0100b\ndpps xmm5,  [rel .data + 16 * 16], 1111_0101b\ndpps xmm6,  [rel .data + 16 * 16], 1111_0110b\ndpps xmm7,  [rel .data + 16 * 16], 1111_0111b\ndpps xmm8,  [rel .data + 16 * 16], 1111_1000b\ndpps xmm9,  [rel .data + 16 * 16], 1111_1001b\ndpps xmm10, [rel .data + 16 * 16], 1111_1010b\ndpps xmm11, [rel .data + 16 * 16], 1111_1011b\ndpps xmm12, [rel .data + 16 * 16], 1111_1100b\ndpps xmm13, [rel .data + 16 * 16], 1111_1101b\ndpps xmm14, [rel .data + 16 * 16], 1111_1110b\ndpps xmm15, [rel .data + 16 * 16], 1111_1111b\n\nhlt\nalign 16\n; 512bytes of random data\n.data:\ndq 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_41.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\": [\"0x41278c496c911a6e\", \"0x41278c496c911a6e\"],\n    \"XMM2\": [\"0x41235ccc64afb361\", \"0x41235ccc64afb361\"],\n    \"XMM3\": [\"0x412bace273945dc5\", \"0x412bace273945dc5\"],\n    \"XMM4\": [\"0x412cf22ef582fd76\", \"0x412cf22ef582fd76\"],\n    \"XMM5\": [\"0x4121c80e40f3bc7b\", \"0x4121c80e40f3bc7b\"],\n    \"XMM6\": [\"0\", \"0\"],\n    \"XMM7\": [\"0\", \"0\"],\n    \"XMM8\": [\"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\n\ndppd xmm1, [rdx + 16 * 8],  11111111b\ndppd xmm2, [rdx + 16 * 9],  11111111b\ndppd xmm3, [rdx + 16 * 10], 11111111b\ndppd xmm4, [rdx + 16 * 11], 11111111b\ndppd xmm5, [rdx + 16 * 12], 11111111b\ndppd xmm6, [rdx + 16 * 13], 00000000b\ndppd xmm7, [rdx + 16 * 14], 11110000b\ndppd xmm8, [rdx + 16 * 15], 00001111b\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndq 470.4127,683.87,711.3545,511.5631,996.8793,548.682,588.9345,832.5925,210.6613,792.6059,298.4494,154.4895,818.4,881.6027,705.3087,687.478,737.0665,621.31,755.3097,189.9614,552.4284,649.1206,798.252,574.5732,593.7565,577.3129,383.3844,443.3476,414.3571,615.1567,94.898,438.3107\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_41_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0\", \"0\"],\n    \"XMM1\": [\"0x40a7e92935462e9e\", \"0\"],\n    \"XMM2\": [\"0\", \"0x40a0712d6903205c\"],\n    \"XMM3\": [\"0x408c728276ca7656\", \"0x408c728276ca7656\"],\n    \"XMM4\": [\"0\", \"0\"],\n    \"XMM5\": [\"0x40c0cd5f41a95ce2\", \"0\"],\n    \"XMM6\": [\"0\", \"0x40b84aaf198a4022\"],\n    \"XMM7\": [\"0x40abf229b504629d\", \"0x40abf229b504629d\"],\n    \"XMM8\": [\"0\", \"0\"],\n    \"XMM9\": [\"0x40c8384d475e602a\", \"0\"],\n    \"XMM10\": [\"0\", \"0x40c8d105fa49a70e\"],\n    \"XMM11\": [\"0x40c248e5ffd69239\", \"0x40c248e5ffd69239\"],\n    \"XMM12\": [\"0\", \"0\"],\n    \"XMM13\": [\"0x40beb622c0fe35c7\", \"0\"],\n    \"XMM14\": [\"0\", \"0x40b74171bb41b9ba\"],\n    \"XMM15\": [\"0x40ac8195a7735fbe\", \"0x40ac8195a7735fbe\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmovaps xmm0,  [rel .data + 16 * 0]\nmovaps xmm1,  [rel .data + 16 * 1]\nmovaps xmm2,  [rel .data + 16 * 2]\nmovaps xmm3,  [rel .data + 16 * 3]\nmovaps xmm4,  [rel .data + 16 * 4]\nmovaps xmm5,  [rel .data + 16 * 5]\nmovaps xmm6,  [rel .data + 16 * 6]\nmovaps xmm7,  [rel .data + 16 * 7]\nmovaps xmm8,  [rel .data + 16 * 8]\nmovaps xmm9,  [rel .data + 16 * 9]\nmovaps xmm10, [rel .data + 16 * 10]\nmovaps xmm11, [rel .data + 16 * 11]\nmovaps xmm12, [rel .data + 16 * 12]\nmovaps xmm13, [rel .data + 16 * 13]\nmovaps xmm14, [rel .data + 16 * 14]\nmovaps xmm15, [rel .data + 16 * 15]\n\n; Full source mask but different broadcast tests\ndppd xmm0,  [rel .data + 16 * 16], 1111_0000b\ndppd xmm1,  [rel .data + 16 * 16], 1111_0001b\ndppd xmm2,  [rel .data + 16 * 16], 1111_0010b\ndppd xmm3,  [rel .data + 16 * 16], 1111_0011b\ndppd xmm4,  [rel .data + 16 * 16], 1111_0100b\ndppd xmm5,  [rel .data + 16 * 16], 1111_0101b\ndppd xmm6,  [rel .data + 16 * 16], 1111_0110b\ndppd xmm7,  [rel .data + 16 * 16], 1111_0111b\ndppd xmm8,  [rel .data + 16 * 16], 1111_1000b\ndppd xmm9,  [rel .data + 16 * 16], 1111_1001b\ndppd xmm10, [rel .data + 16 * 16], 1111_1010b\ndppd xmm11, [rel .data + 16 * 16], 1111_1011b\ndppd xmm12, [rel .data + 16 * 16], 1111_1100b\ndppd xmm13, [rel .data + 16 * 16], 1111_1101b\ndppd xmm14, [rel .data + 16 * 16], 1111_1110b\ndppd xmm15, [rel .data + 16 * 16], 1111_1111b\n\nhlt\nalign 16\n; 512bytes of random data\n.data:\ndq 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/H0F3A/66_42.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\": [\"0x01d700f201dd018b\", \"0x021b012d00ec015b\"],\n    \"XMM2\": [\"0x021b01ea0147019c\", \"0x017900fb00d801d9\"],\n    \"XMM3\": [\"0x010500e801000153\", \"0x011a015f01530171\"],\n    \"XMM4\": [\"0x019c0124018f014d\", \"0x011f0100011e0116\"],\n    \"XMM5\": [\"0x0136007e009d01e0\", \"0x02a802c80245019d\"],\n    \"XMM6\": [\"0x009f0115017b0132\", \"0x013c01af01f90179\"],\n    \"XMM7\": [\"0x0077012b011900e8\", \"0x00bc016e019e0146\"],\n    \"XMM8\": [\"0x0100011c010300d5\", \"0x00f3014a016700cd\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\n\nmpsadbw xmm1, [rdx + 16 * 8], 000b\nmpsadbw xmm2, [rdx + 16 * 9], 001b\nmpsadbw xmm3, [rdx + 16 * 10], 010b\nmpsadbw xmm4, [rdx + 16 * 11], 011b\nmpsadbw xmm5, [rdx + 16 * 12], 100b\nmpsadbw xmm6, [rdx + 16 * 13], 101b\nmpsadbw xmm7, [rdx + 16 * 14], 110b\nmpsadbw xmm8, [rdx + 16 * 15], 111b\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\ndb 0x6e, 0x35, 0xa8, 0x54, 0xd7, 0xab, 0x8b, 0x6c, 0x77, 0x5f, 0x92, 0xca, 0x25, 0xa6, 0x7e, 0x27\ndb 0xc7, 0xcd, 0x73, 0xec, 0x95, 0xd6, 0x6f, 0x6a, 0xbb, 0xae, 0xf2, 0xbb, 0x27, 0xb9, 0xa1, 0xdd\ndb 0x73, 0x4d, 0xd1, 0xc7, 0xd5, 0x2c, 0x31, 0x88, 0xfe, 0xe7, 0xdb, 0xfd, 0x1e, 0x1e, 0x09, 0x7f\ndb 0x14, 0xfa, 0x4e, 0x95, 0xef, 0xe6, 0x9a, 0xf2, 0xa0, 0x42, 0x62, 0x9a, 0xa4, 0xa8, 0x73, 0x82\ndb 0x0e, 0x0f, 0x16, 0x82, 0x38, 0x07, 0x12, 0x32, 0x07, 0x35, 0x92, 0xc1, 0x63, 0x07, 0x78, 0xb3\ndb 0xcb, 0x46, 0x19, 0x57, 0x2b, 0x37, 0x2a, 0x46, 0x1f, 0x04, 0x0e, 0x79, 0x3d, 0xcd, 0x8d, 0xa3\ndb 0x2b, 0xf3, 0x86, 0x2f, 0xab, 0xba, 0x57, 0x30, 0x2e, 0xd6, 0x2c, 0xf0, 0x46, 0x4f, 0x3f, 0xef\ndb 0xef, 0xd1, 0xbb, 0x85, 0x34, 0x4b, 0x3c, 0xde, 0x9e, 0x48, 0xa3, 0xb9, 0x8d, 0x71, 0xe3, 0x9d\ndb 0x09, 0x72, 0xfb, 0xde, 0x8a, 0x32, 0x50, 0x9d, 0x69, 0x98, 0xf1, 0xf6, 0x52, 0xeb, 0xf7, 0xee\ndb 0xd6, 0x99, 0xc2, 0xff, 0x30, 0x1c, 0x02, 0xce, 0x70, 0x05, 0xb2, 0xf1, 0x56, 0x9c, 0x0e, 0xa6\ndb 0x18, 0x62, 0xc4, 0xe2, 0x86, 0x38, 0x76, 0x30, 0x2f, 0xa1, 0xe4, 0xa7, 0x0e, 0x5d, 0x53, 0xeb\ndb 0x14, 0x45, 0xe0, 0xb7, 0xe1, 0xe8, 0x02, 0x68, 0x1a, 0xfe, 0x8e, 0xc1, 0x8f, 0xf2, 0xeb, 0x46\ndb 0x7f, 0x5d, 0x6a, 0x23, 0x46, 0x97, 0x2e, 0x03, 0x98, 0x12, 0x32, 0x8f, 0x54, 0x76, 0x59, 0xac\ndb 0xc8, 0x76, 0x5f, 0xc8, 0x71, 0x0c, 0xd3, 0xb6, 0xc5, 0x19, 0xea, 0xab, 0xa6, 0x2c, 0x1d, 0x88\n\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pclmulqdq.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM1\": [\"0x1E2017C5BEE29400\", \"0x38358E40CC367C7A\"],\n      \"XMM2\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\"],\n      \"XMM3\": [\"0xE208147952DE57A0\", \"0x317D360F86C80DC9\"],\n      \"XMM4\": [\"0xBBA54C87DA872B40\", \"0x6495428B7641EBE6\"],\n      \"XMM5\": [\"0x170B5A1B5CDD42EA\", \"0x719F094BB2358CA1\"]\n  },\n  \"HostFeatures\": [\"PCLMUL\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\n; With imm = 0b00000000\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\npclmulqdq xmm1, xmm2, 0\n\n; With imm = 0b00000001\nmovaps xmm3, [rdx + 16 * 0]\npclmulqdq xmm3, xmm2, 1\n\n; With imm = 0b00010000\nmovaps xmm4, [rdx + 16 * 0]\npclmulqdq xmm4, xmm2, 16\n\n; With imm = 0b00010001\nmovaps xmm5, [rdx + 16 * 0]\npclmulqdq xmm5, xmm2, 17\n\nhlt\n\nalign 16\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpestri_equal_any.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": [\"15\"],\n      \"RDX\": [\"16\"],\n      \"XMM0\": [\"0x04070F000F000E05\", \"0x0000000000040404\"],\n      \"XMM1\": [\"0x0121313131311111\", \"0x0000000000010101\"],\n      \"XMM2\": [\"0x306F8A9E672C65E5\", \"0x000030443057697D\"],\n      \"XMM3\": [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to pcmpestri\n;\n%macro CompareAndStore 2\n  pcmpestri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Unsigned byte character check (lsb, positive polarity)\nmov rax, 15 ; Exclude 'l'\nmov rdx, 16\nCompareAndStore 0, 0b00000000\n\n; Unsigned byte character check (msb, positive polarity)\nCompareAndStore 1, 0b01000000\n\n; Unsigned byte character check (lsb, negative polarity)\nCompareAndStore 2, 0b00010000\n\n; Unsigned byte character check (msb, negative polarity)\nCompareAndStore 3, 0b01010000\n\n; Unsigned byte character check (lsb, negative masked)\nCompareAndStore 4, 0b00110000\n\n; Unsigned byte character check (msb, negative masked)\nCompareAndStore 5, 0b01110000\n\n; --- 16-bit unsigned word tests ---\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\n; Unsigned word character check (msb, positive polarity)\nCompareAndStore 6, 0b01000001\n\n; Unsigned word character check (lsb, negative polarity)\nCompareAndStore 7, 0b00010001\n\n; Unsigned word character check (msb, negative polarity)\nCompareAndStore 8, 0b01010001\n\n; Unsigned word character check (lsb, negative masked)\nCompareAndStore 9, 0b00110001\n\n; Unsigned word character check (msb, negative masked)\nCompareAndStore 10, 0b01110001\n\n; Load all our stored indices and flags for result comparing\nmovaps xmm0, [rel .indices]\nmovaps xmm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6463626144434241 ; \"ABCDabcd\"\ndq 0x6C6B6A694C4B4A49 ; \"IJKLijkl\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x4120492065726548 ; \"Here I A\"\ndq 0x6C4C612759202C6D ; \"m, Y'aLl\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpestri_equal_each.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": [\"4\"],\n      \"RDX\": [\"3\"],\n      \"XMM0\": [\"0x0F000B060B060F00\", \"0x040407000F060706\"],\n      \"XMM1\": [\"0x3939010101012121\", \"0x0101212119191919\"],\n      \"XMM2\": [\"0x306F8A9E672C65E5\", \"0x000030443057697D\"],\n      \"XMM3\": [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\"],\n      \"XMM4\": [\"0x0704030307000404\", \"0x0000000000000000\"],\n      \"XMM5\": [\"0x1919191939390101\", \"0x0000000000000000\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to pcmpestri\n;\n%macro CompareAndStore 2\n  pcmpestri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Full length unsigned byte string check (lsb, positive polarity)\nmov rax, 16\nmov rdx, 16\nCompareAndStore 0, 0b00001000\n\n; Full length unsigned byte string check (msb, positive polarity)\nCompareAndStore 1, 0b01001000\n\n; Full length unsigned byte string check (lsb, negative polarity)\nCompareAndStore 2, 0b00011000\n\n; Full length unsigned byte string check (msb, negative polarity)\nCompareAndStore 3, 0b01011000\n\n; Full length unsigned byte string check (lsb, negative masked)\nCompareAndStore 4, 0b00111000\n\n; Full length unsigned byte string check (msb, negative masked)\nCompareAndStore 5, 0b01111000\n\n; Non-full length unsigned byte string check (lsb, positive polarity)\nmov rax, 8\nmov rdx, 7\nCompareAndStore 6, 0b00001000\n\n; Non-full length unsigned byte string check (msb, positive polarity)\nCompareAndStore 7, 0b01001000\n\n; Non-full length unsigned byte string check (lsb, negative polarity)\nCompareAndStore 8, 0b00011000\n\n; Non-full length unsigned byte string check (msb, negative polarity)\nCompareAndStore 9, 0b01011000\n\n; Non-full length unsigned byte string check (lsb, negative masked)\nCompareAndStore 10, 0b00111000\n\n; Non-full length unsigned byte string check (msb, negative masked)\nCompareAndStore 11, 0b01111000\n\n; --- 16-bit unsigned word tests ---\n\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\n; Full length unsigned word string check (lsb, positive polarity)\nmov rax, 8\nmov rdx, 8\nCompareAndStore 12, 0b00001001\n\n; Full length unsigned word string check (msb, positive polarity)\nCompareAndStore 13, 0b01001001\n\n; Full length unsigned word string check (lsb, negative polarity)\nCompareAndStore 14, 0b00011001\n\n; Full length unsigned word string check (msb, negative polarity)\nCompareAndStore 15, 0b01011001\n\n; Full length unsigned word string check (lsb, negative masked)\nCompareAndStore 16, 0b00111001\n\n; Full length unsigned word string check (msb, negative masked)\nCompareAndStore 17, 0b01111001\n\n; Non-full length unsigned word string check (lsb, positive polarity)\nmov rax, 4\nmov rdx, 3\nCompareAndStore 18, 0b00001001\n\n; Non-full length unsigned word string check (msb, positive polarity)\nCompareAndStore 19, 0b01001001\n\n; Non-full length unsigned word string check (lsb, negative polarity)\nCompareAndStore 20, 0b00011001\n\n; Non-full length unsigned word string check (msb, negative polarity)\nCompareAndStore 21, 0b01011001\n\n; Non-full length unsigned word string check (lsb, negative masked)\nCompareAndStore 22, 0b00111001\n\n; Non-full length unsigned word string check (msb, negative masked)\nCompareAndStore 23, 0b01111001\n\n; Load all our stored indices and flags for result comparing\nmovaps xmm0, [rel .indices]\nmovaps xmm4, [rel .indices + 16]\nmovaps xmm1, [rel .flags]\nmovaps xmm5, [rel .flags + 16]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6C6C6548 ; \"Hello Pe\"\ndq 0x21212121656C706F ; \"ople!!!!\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x21212121216C6C61 ; \"all!!!!!\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpestri_equal_ordered.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": [\"2\"],\n      \"RDX\": [\"16\"],\n      \"XMM0\": [\"0x05050F000F000902\", \"0x0000000007000700\"],\n      \"XMM1\": [\"0x1111313131311111\", \"0x0000000031313131\"],\n      \"XMM2\": [\"0x306F8A9E30443057\", \"0x000030443057697D\"],\n      \"XMM3\": [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to pcmpestri\n;\n%macro CompareAndStore 2\n  pcmpestri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Unsigned byte string check (lsb, positive polarity)\nmov rax, 2\nmov rdx, 16\nCompareAndStore 0, 0b00001100\n\n; Unsigned byte string check (msb, positive polarity)\nCompareAndStore 1, 0b01001100\n\n; Unsigned byte string check (lsb, negative polarity)\nCompareAndStore 2, 0b00011100\n\n; Unsigned byte string check (msb, negative polarity)\nCompareAndStore 3, 0b01011100\n\n; Unsigned byte string check (lsb, negative masked)\nCompareAndStore 4, 0b00111100\n\n; Unsigned byte string check (msb, negative masked)\nCompareAndStore 5, 0b01111100\n\n; --- 16-bit unsigned word tests ---\n; Intentionally don't reset RDX to 8 here to test upper bounds clamping.\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\nCompareAndStore 6, 0b00001101\n\n; Unsigned word string check (msb, positive polarity)\nCompareAndStore 7, 0b01001101\n\n; Unsigned word string check (lsb, negative polarity)\nCompareAndStore 8, 0b00011101\n\n; Unsigned word string check (msb, negative polarity)\nCompareAndStore 9, 0b01011101\n\n; Unsigned word string check (lsb, negative masked)\nCompareAndStore 10, 0b00111101\n\n; Unsigned word string check (msb, negative masked)\nCompareAndStore 11, 0b01111101\n\n; Load all our stored indices and flags for result comparing\nmovaps xmm0, [rel .indices]\nmovaps xmm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6FFF6C6C ; \"ll\" with junk following it\ndq 0x21212121656C706F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x21212121216C6C61 ; \"all!!!!!\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E30443057 ; \"しい\" followed by junk\ndq 0x000030443057697D\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpestri_ranges.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": [\"4\"],\n      \"RDX\": [\"16\"],\n      \"XMM0\": [\"0x00060F000F000D01\", \"0x0000000000070007\"],\n      \"XMM1\": [\"0x3111313131311111\", \"0x0000000000313131\"],\n      \"XMM2\": [\"0x005A0041007A0061\", \"0x55AACCBBFF223344\"],\n      \"XMM3\": [\"0x006500200027003F\", \"0x00210065004F0065\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to pcmpestri\n;\n%macro CompareAndStore 2\n  pcmpestri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Range unsigned byte check (lsb, positive polarity)\nmov rax, 4\nmov rdx, 16\nCompareAndStore 0, 0b00000100\n\n; Range unsigned byte check (msb, positive polarity)\nCompareAndStore 1, 0b01000100\n\n; Range unsigned byte check (lsb, negative polarity)\nCompareAndStore 2, 0b00010100\n\n; Range unsigned byte check (msb, negative polarity)\nCompareAndStore 3, 0b01010100\n\n; Range unsigned byte check (lsb, negative masked)\nCompareAndStore 4, 0b00110100\n\n; Range unsigned byte check (msb, negative masked)\nCompareAndStore 5, 0b01110100\n\n; --- 16-bit unsigned word tests ---\n; Intentionally don't reset RDX to 8 here to test upper bounds clamping.\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\n; Range unsigned word check (msb, positive polarity)\nCompareAndStore 6, 0b01000101\n\n; Range unsigned word check (lsb, negative polarity)\nCompareAndStore 7, 0b00010101\n\n; Range unsigned word check (msb, negative polarity)\nCompareAndStore 8, 0b01010101\n\n; Range unsigned word check (lsb, negative masked)\nCompareAndStore 9, 0b00110101\n\n; Range unsigned word check (msb, negative masked)\nCompareAndStore 10, 0b01110101\n\n; Load all our stored indices and flags for result comparing\nmovaps xmm0, [rel .indices]\nmovaps xmm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x998877665A417A61 ; \"azAZ\" (followed by junk)\ndq 0x55AACCBBFF223344\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x726548206D27493F ; \"?I'm Her\"\ndq 0x21216E65704F2065 ; \"e Open!!\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\n.data16:\ndq 0x005A0041007A0061 ; \"azAZ\"\ndq 0x55AACCBBFF223344\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x006500200027003F ; \"?' e\"\ndq 0x00210065004F0065 ; \"eOen!\"\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpestrm_equal_any.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\":   [\"15\"],\n      \"RDX\":   [\"16\"],\n      \"XMM1\":  [\"0x0121313131311111\", \"0x0000000000010101\"],\n      \"XMM2\":  [\"0x306F8A9E672C65E5\", \"0x000030443057697D\"],\n      \"XMM3\":  [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\"],\n      \"XMM4\":  [\"0x00000000000060A0\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0xFF00FF0000000000\", \"0x00FFFF0000000000\"],\n      \"XMM6\":  [\"0x0000000000009F5F\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0x00FF00FFFFFFFFFF\", \"0xFF0000FFFFFFFFFF\"],\n      \"XMM8\":  [\"0x0000000000009F5F\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0x00FF00FFFFFFFFFF\", \"0xFF0000FFFFFFFFFF\"],\n      \"XMM10\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFF0000\"],\n      \"XMM11\": [\"0x0000000000000010\", \"0x0000000000000000\"],\n      \"XMM12\": [\"0x0000000000000000\", \"0x000000000000FFFF\"],\n      \"XMM13\": [\"0x0000000000000010\", \"0x0000000000000000\"],\n      \"XMM14\": [\"0x0000000000000000\", \"0x000000000000FFFF\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a specified vector in the third argument\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to pcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  pcmpestrm xmm2, xmm3, %2\n  movaps xmm%3, xmm0\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Unsigned byte character check (bits, positive polarity)\nmov rax, 15 ; Exclude 'l'\nmov rdx, 16\nCompareAndStore 0, 0b00000000, 4\n\n; Unsigned byte character check (mask, positive polarity)\nCompareAndStore 1, 0b01000000, 5\n\n; Unsigned byte character check (bits, negative polarity)\nCompareAndStore 2, 0b00010000, 6\n\n; Unsigned byte character check (mask, negative polarity)\nCompareAndStore 3, 0b01010000, 7\n\n; Unsigned byte character check (bits, negative masked)\nCompareAndStore 4, 0b00110000, 8\n\n; Unsigned byte character check (mask, negative masked)\nCompareAndStore 5, 0b01110000, 9\n\n; --- 16-bit unsigned word tests ---\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\n; Unsigned word character check (mask, positive polarity)\nCompareAndStore 6, 0b01000001, 10\n\n; Unsigned word character check (bits, negative polarity)\nCompareAndStore 7, 0b00010001, 11\n\n; Unsigned word character check (mask, negative polarity)\nCompareAndStore 8, 0b01010001, 12\n\n; Unsigned word character check (bits, negative masked)\nCompareAndStore 9, 0b00110001, 13\n\n; Unsigned word character check (mask, negative masked)\nCompareAndStore 10, 0b01110001, 14\n\n; Load all our stored flags for result comparing\nmovaps xmm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6463626144434241 ; \"ABCDabcd\"\ndq 0x6C6B6A694C4B4A49 ; \"IJKLijkl\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x4120492065726548 ; \"Here I A\"\ndq 0x6C4C612759202C6D ; \"m, Y'aLl\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpestrm_equal_each.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\":   [\"8\"],\n      \"RDX\":   [\"8\"],\n      \"XMM1\":  [\"0x2121010101012121\", \"0x0000000001010101\"],\n      \"XMM2\":  [\"0x306F8A9E672C65E5\", \"0x000030443057697D\"],\n      \"XMM3\":  [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\"],\n      \"XMM4\":  [\"0x000000000000F43F\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0x0000FFFFFFFFFFFF\", \"0xFFFFFFFF00FF0000\"],\n      \"XMM6\":  [\"0x0000000000000BC0\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0xFFFF000000000000\", \"0x00000000FF00FFFF\"],\n      \"XMM8\":  [\"0x0000000000000BC0\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0xFFFF000000000000\", \"0x00000000FF00FFFF\"],\n      \"XMM10\": [\"0x00000000000000EF\", \"0x0000000000000000\"],\n      \"XMM11\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFF0000\"],\n      \"XMM12\": [\"0x0000000000000010\", \"0x0000000000000000\"],\n      \"XMM13\": [\"0x0000000000000000\", \"0x000000000000FFFF\"],\n      \"XMM14\": [\"0x0000000000000010\", \"0x0000000000000000\"],\n      \"XMM15\": [\"0x0000000000000000\", \"0x000000000000FFFF\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a specified vector in the third argument\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to pcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  pcmpestrm xmm2, xmm3, %2\n  movaps xmm%3, xmm0\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Full length unsigned byte string check (bits, positive polarity)\nmov rax, 16\nmov rdx, 16\nCompareAndStore 0, 0b00001000, 4\n\n; Full length unsigned byte string check (mask, positive polarity)\nCompareAndStore 1, 0b01001000, 5\n\n; Full length unsigned byte string check (bits, negative polarity)\nCompareAndStore 2, 0b00011000, 6\n\n; Full length unsigned byte string check (mask, negative polarity)\nCompareAndStore 3, 0b01011000, 7\n\n; Full length unsigned byte string check (bits, negative masked)\nCompareAndStore 4, 0b00111000, 8\n\n; Full length unsigned byte string check (mask, negative masked)\nCompareAndStore 5, 0b01111000, 9\n\n; --- 16-bit unsigned word tests ---\n\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\n; Full length unsigned word string check (bits, positive polarity)\nmov rax, 8\nmov rdx, 8\nCompareAndStore 6, 0b00001001, 10\n\n; Full length unsigned word string check (mask, positive polarity)\nCompareAndStore 7, 0b01001001, 11\n\n; Full length unsigned word string check (bits, negative polarity)\nCompareAndStore 8, 0b00011001, 12\n\n; Full length unsigned word string check (mask, negative polarity)\nCompareAndStore 9, 0b01011001, 13\n\n; Full length unsigned word string check (bits, negative masked)\nCompareAndStore 10, 0b00111001, 14\n\n; Full length unsigned word string check (mask, negative masked)\nCompareAndStore 11, 0b01111001, 15\n\n; Load all our stored flags for result comparing\nmovaps xmm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6C6C6548 ; \"Hello Pe\"\ndq 0x21212121656C706F ; \"ople!!!!\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x21212121216C6C61 ; \"all!!!!!\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpestrm_equal_ordered.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\":   [\"2\"],\n      \"RDX\":   [\"16\"],\n      \"XMM1\":  [\"0x1111313131311111\", \"0x0000000031313131\"],\n      \"XMM2\":  [\"0x306F8A9E30443057\", \"0x000030443057697D\"],\n      \"XMM3\":  [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\"],\n      \"XMM4\":  [\"0x0000000000000204\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0x0000000000FF0000\", \"0x000000000000FF00\"],\n      \"XMM6\":  [\"0x000000000000FDFB\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0xFFFFFFFFFF00FFFF\", \"0xFFFFFFFFFFFF00FF\"],\n      \"XMM8\":  [\"0x000000000000FDFB\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0xFFFFFFFFFF00FFFF\", \"0xFFFFFFFFFFFF00FF\"],\n      \"XMM10\": [\"0x0000000000000020\", \"0x0000000000000000\"],\n      \"XMM11\": [\"0x0000000000000000\", \"0x00000000FFFF0000\"],\n      \"XMM12\": [\"0x00000000000000DF\", \"0x0000000000000000\"],\n      \"XMM13\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFF0000FFFF\"],\n      \"XMM14\": [\"0x00000000000000DF\", \"0x0000000000000000\"],\n      \"XMM15\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFF0000FFFF\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a specified vector in the third argument\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to pcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  pcmpestrm xmm2, xmm3, %2\n  movaps xmm%3, xmm0\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Unsigned byte string check (bits, positive polarity)\nmov rax, 2\nmov rdx, 16\nCompareAndStore 0, 0b00001100, 4\n\n; Unsigned byte string check (mask, positive polarity)\nCompareAndStore 1, 0b01001100, 5\n\n; Unsigned byte string check (bits, negative polarity)\nCompareAndStore 2, 0b00011100, 6\n\n; Unsigned byte string check (mask, negative polarity)\nCompareAndStore 3, 0b01011100, 7\n\n; Unsigned byte string check (bits, negative masked)\nCompareAndStore 4, 0b00111100, 8\n\n; Unsigned byte string check (mask, negative masked)\nCompareAndStore 5, 0b01111100, 9\n\n; --- 16-bit unsigned word tests ---\n; Intentionally don't reset RDX to 8 here to test upper bounds clamping.\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\nCompareAndStore 6, 0b00001101, 10\n\n; Unsigned word string check (mask, positive polarity)\nCompareAndStore 7, 0b01001101, 11\n\n; Unsigned word string check (bits, negative polarity)\nCompareAndStore 8, 0b00011101, 12\n\n; Unsigned word string check (mask, negative polarity)\nCompareAndStore 9, 0b01011101, 13\n\n; Unsigned word string check (bits, negative masked)\nCompareAndStore 10, 0b00111101, 14\n\n; Unsigned word string check (mask, negative masked)\nCompareAndStore 11, 0b01111101, 15\n\n; Load all our stored flags for result comparing\nmovaps xmm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6FFF6C6C ; \"ll\" with junk following it\ndq 0x21212121656C706F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x21212121216C6C61 ; \"all!!!!!\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E30443057 ; \"しい\" followed by junk\ndq 0x000030443057697D\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpestrm_ranges.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\":   [\"4\"],\n      \"RDX\":   [\"16\"],\n      \"XMM1\":  [\"0x3111313131311111\", \"0x0000000000313131\"],\n      \"XMM2\":  [\"0x005A0041007A0061\", \"0x55AACCBBFF223344\"],\n      \"XMM3\":  [\"0x006500200027003F\", \"0x00210065004F0065\"],\n      \"XMM4\":  [\"0x0000000000003DEA\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0xFFFFFF00FF00FF00\", \"0x0000FFFFFFFF00FF\"],\n      \"XMM6\":  [\"0x000000000000C215\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0x000000FF00FF00FF\", \"0xFFFF00000000FF00\"],\n      \"XMM8\":  [\"0x000000000000C215\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0x000000FF00FF00FF\", \"0xFFFF00000000FF00\"],\n      \"XMM10\": [\"0xFFFF000000000000\", \"0x0000FFFFFFFFFFFF\"],\n      \"XMM11\": [\"0x0000000000000087\", \"0x0000000000000000\"],\n      \"XMM12\": [\"0x0000FFFFFFFFFFFF\", \"0xFFFF000000000000\"],\n      \"XMM13\": [\"0x0000000000000087\", \"0x0000000000000000\"],\n      \"XMM14\": [\"0x0000FFFFFFFFFFFF\", \"0xFFFF000000000000\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a specified vector in the third argument\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to pcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  pcmpestrm xmm2, xmm3, %2\n  movaps xmm%3, xmm0\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Range unsigned byte check (bits, positive polarity)\nmov rax, 4\nmov rdx, 16\nCompareAndStore 0, 0b00000100, 4\n\n; Range unsigned byte check (mask, positive polarity)\nCompareAndStore 1, 0b01000100, 5\n\n; Range unsigned byte check (bits, negative polarity)\nCompareAndStore 2, 0b00010100, 6\n\n; Range unsigned byte check (mask, negative polarity)\nCompareAndStore 3, 0b01010100, 7\n\n; Range unsigned byte check (bits, negative masked)\nCompareAndStore 4, 0b00110100, 8\n\n; Range unsigned byte check (mask, negative masked)\nCompareAndStore 5, 0b01110100, 9\n\n; --- 16-bit unsigned word tests ---\n; Intentionally don't reset RDX to 8 here to test upper bounds clamping.\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\n; Range unsigned word check (mask, positive polarity)\nCompareAndStore 6, 0b01000101, 10\n\n; Range unsigned word check (bits, negative polarity)\nCompareAndStore 7, 0b00010101, 11\n\n; Range unsigned word check (mask, negative polarity)\nCompareAndStore 8, 0b01010101, 12\n\n; Range unsigned word check (bits, negative masked)\nCompareAndStore 9, 0b00110101, 13\n\n; Range unsigned word check (mask, negative masked)\nCompareAndStore 10, 0b01110101, 14\n\n; Load all our stored flags for result comparing\nmovaps xmm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x998877665A417A61 ; \"azAZ\" (followed by junk)\ndq 0x55AACCBBFF223344\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x726548206D27493F ; \"?I'm Her\"\ndq 0x21216E65704F2065 ; \"e Open!!\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\n.data16:\ndq 0x005A0041007A0061 ; \"azAZ\"\ndq 0x55AACCBBFF223344\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x006500200027003F ; \"?' e\"\ndq 0x00210065004F0065 ; \"eOen!\"\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpistri_equal_any.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM0\": [\"0x04060F000F000D07\", \"0x0000000000040407\"],\n      \"XMM1\": [\"0x1939313131311111\", \"0x0000000000191919\"],\n      \"XMM2\": [\"0x306F8A9E672C65E5\", \"0x000030443057697D\"],\n      \"XMM3\": [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to pcmpistri\n;\n%macro CompareAndStore 2\n  pcmpistri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Unsigned byte character check (lsb, positive polarity)\nCompareAndStore 0, 0b00000000\n\n; Unsigned byte character check (msb, positive polarity)\nCompareAndStore 1, 0b01000000\n\n; Unsigned byte character check (lsb, negative polarity)\nCompareAndStore 2, 0b00010000\n\n; Unsigned byte character check (msb, negative polarity)\nCompareAndStore 3, 0b01010000\n\n; Unsigned byte character check (lsb, negative masked)\nCompareAndStore 4, 0b00110000\n\n; Unsigned byte character check (msb, negative masked)\nCompareAndStore 5, 0b01110000\n\n; --- 16-bit unsigned word tests ---\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\n; Unsigned word character check (msb, positive polarity)\nCompareAndStore 6, 0b01000001\n\n; Unsigned word character check (lsb, negative polarity)\nCompareAndStore 7, 0b00010001\n\n; Unsigned word character check (msb, negative polarity)\nCompareAndStore 8, 0b01010001\n\n; Unsigned word character check (lsb, negative masked)\nCompareAndStore 9, 0b00110001\n\n; Unsigned word character check (msb, negative masked)\nCompareAndStore 10, 0b01110001\n\n; Load all our stored indices and flags for result comparing\nmovaps xmm0, [rel .indices]\nmovaps xmm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6463626144434241 ; \"ABCDabcd\"\ndq 0x6C6B6A694C4B4A00 ; \"\\0JKLijkl\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x4120492065726548 ; \"Here I A\"\ndq 0x6C4C612759202C6D ; \"m, Y'aLl\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpistri_equal_each.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM0\": [\"0x07000F060E060F00\", \"0x0000000007040404\"],\n      \"XMM1\": [\"0x3939191919193939\", \"0x0000000019191919\"],\n      \"XMM2\": [\"0x306F8A9E672C65E5\", \"0x000030443057697D\"],\n      \"XMM3\": [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to pcmpistri\n;\n%macro CompareAndStore 2\n  pcmpistri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Unsigned byte string check (lsb, positive polarity)\nCompareAndStore 0, 0b00001000\n\n; Unsigned byte string check (msb, positive polarity)\nCompareAndStore 1, 0b01001000\n\n; Unsigned byte string check (lsb, negative polarity)\nCompareAndStore 2, 0b00011000\n\n; Unsigned byte string check (msb, negative polarity)\nCompareAndStore 3, 0b01011000\n\n; Unsigned byte string check (lsb, negative masked)\nCompareAndStore 4, 0b00111000\n\n; Unsigned byte string check (msb, negative masked)\nCompareAndStore 5, 0b01111000\n\n; --- 16-bit unsigned word tests ---\n\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\n; Unsigned word string check (lsb, positive polarity)\nCompareAndStore 6, 0b00001001\n\n; Unsigned word string check (msb, positive polarity)\nCompareAndStore 7, 0b01001001\n\n; Unsigned word string check (lsb, negative polarity)\nCompareAndStore 8, 0b00011001\n\n; Unsigned word string check (msb, negative polarity)\nCompareAndStore 9, 0b01011001\n\n; Unsigned word string check (lsb, negative masked)\nCompareAndStore 10, 0b00111001\n\n; Unsigned word string check (msb, negative masked)\nCompareAndStore 11, 0b01111001\n\n; Load all our stored indices and flags for result comparing\nmovaps xmm0, [rel .indices]\nmovaps xmm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6C6C6548 ; \"Hello Pe\"\ndq 0x00002121656C706F ; \"ople!!\\0\\0\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x00212121216C6C61 ; \"all!!!!\\0\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpistri_equal_ordered.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM0\": [\"0x05050F000F000902\", \"0x0000000006000700\"],\n      \"XMM1\": [\"0x1919313131311111\", \"0x0000000039393939\"],\n      \"XMM2\": [\"0x306F000030443057\", \"0x000030443057697D\"],\n      \"XMM3\": [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to pcmpistri\n;\n%macro CompareAndStore 2\n  pcmpistri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Unsigned byte string check (lsb, positive polarity)\nCompareAndStore 0, 0b00001100\n\n; Unsigned byte string check (msb, positive polarity)\nCompareAndStore 1, 0b01001100\n\n; Unsigned byte string check (lsb, negative polarity)\nCompareAndStore 2, 0b00011100\n\n; Unsigned byte string check (msb, negative polarity)\nCompareAndStore 3, 0b01011100\n\n; Unsigned byte string check (lsb, negative masked)\nCompareAndStore 4, 0b00111100\n\n; Unsigned byte string check (msb, negative masked)\nCompareAndStore 5, 0b01111100\n\n; --- 16-bit unsigned word tests ---\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\nCompareAndStore 6, 0b00001101\n\n; Unsigned word string check (msb, positive polarity)\nCompareAndStore 7, 0b01001101\n\n; Unsigned word string check (lsb, negative polarity)\nCompareAndStore 8, 0b00011101\n\n; Unsigned word string check (msb, negative polarity)\nCompareAndStore 9, 0b01011101\n\n; Unsigned word string check (lsb, negative masked)\nCompareAndStore 10, 0b00111101\n\n; Unsigned word string check (msb, negative masked)\nCompareAndStore 11, 0b01111101\n\n; Load all our stored indices and flags for result comparing\nmovaps xmm0, [rel .indices]\nmovaps xmm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6F006C6C ; \"ll\" with junk following it\ndq 0x21212121656C706F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x21212121216C6C61 ; \"all!!!!!\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F000030443057 ; \"しい\" followed by junk\ndq 0x000030443057697D\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpistri_ranges.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM0\": [\"0x00060F000F000D01\", \"0x0000001010070007\"],\n      \"XMM1\": [\"0x3111313131311111\", \"0x0000001818313131\"],\n      \"XMM2\": [\"0x005A0041007A0061\", \"0x55AACCBBFF220000\"],\n      \"XMM3\": [\"0x0065002000270000\", \"0x00210065004F0065\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to pcmpistri\n;\n%macro CompareAndStore 2\n  pcmpistri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Range unsigned byte check (lsb, positive polarity)\nCompareAndStore 0, 0b00000100\n\n; Range unsigned byte check (msb, positive polarity)\nCompareAndStore 1, 0b01000100\n\n; Range unsigned byte check (lsb, negative polarity)\nCompareAndStore 2, 0b00010100\n\n; Range unsigned byte check (msb, negative polarity)\nCompareAndStore 3, 0b01010100\n\n; Range unsigned byte check (lsb, negative masked)\nCompareAndStore 4, 0b00110100\n\n; Range unsigned byte check (msb, negative masked)\nCompareAndStore 5, 0b01110100\n\n; --- 16-bit unsigned word tests ---\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\n; Range unsigned word check (msb, positive polarity)\nCompareAndStore 6, 0b01000101\n\n; Range unsigned word check (lsb, negative polarity)\nCompareAndStore 7, 0b00010101\n\n; Range unsigned word check (msb, negative polarity)\nCompareAndStore 8, 0b01010101\n\n; Range unsigned word check (lsb, negative masked)\nCompareAndStore 9, 0b00110101\n\n; Range unsigned word check (msb, negative masked)\nCompareAndStore 10, 0b01110101\n\n; --- Edge case test (string begins with null character) ---\nmovaps xmm2, [rel .data_null]\nmovaps xmm3, [rel .data_null + 32]\n\n; Range signed byte check (msb)\nCompareAndStore 11, 0b01000110\n\n; Range signed byte check (lsb)\nCompareAndStore 12, 0b01000110\n\n; Load all our stored indices and flags for result comparing\nmovaps xmm0, [rel .indices]\nmovaps xmm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x998877005A417A61 ; \"azAZ\" (followed by junk)\ndq 0x55AACCBBFF223344\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x726548206D27493F ; \"?I'm Her\"\ndq 0x21216E65704F2065 ; \"e Open!!\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\n.data16:\ndq 0x005A0041007A0061 ; \"azAZ\"\ndq 0x55AACCBBFF220000\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x006500200027003F ; \"?' e\"\ndq 0x00210065004F0065 ; \"eOen!\"\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.data_null:\ndq 0x005A0041007A0061 ; \"azAZ\"\ndq 0x55AACCBBFF220000\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x0065002000270000 ; \"\\0' e\"\ndq 0x00210065004F0065 ; \"eOen!\"\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpistrm_equal_any.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM1\":  [\"0x1939313131311111\", \"0x0000000000191919\"],\n      \"XMM2\":  [\"0x306F8A9E672C65E5\", \"0x000030443057697D\"],\n      \"XMM3\":  [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\"],\n      \"XMM4\":  [\"0x0000000000002080\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0xFF00000000000000\", \"0x0000FF0000000000\"],\n      \"XMM6\":  [\"0x000000000000DF7F\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0x00FFFFFFFFFFFFFF\", \"0xFFFF00FFFFFFFFFF\"],\n      \"XMM8\":  [\"0x000000000000DF7F\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0x00FFFFFFFFFFFFFF\", \"0xFFFF00FFFFFFFFFF\"],\n      \"XMM10\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000FFFFFFFF0000\"],\n      \"XMM11\": [\"0x0000000000000090\", \"0x0000000000000000\"],\n      \"XMM12\": [\"0x0000000000000000\", \"0xFFFF00000000FFFF\"],\n      \"XMM13\": [\"0x0000000000000010\", \"0x0000000000000000\"],\n      \"XMM14\": [\"0x0000000000000000\", \"0x000000000000FFFF\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to pcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  pcmpistrm xmm2, xmm3, %2\n  movaps xmm%3, xmm0\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Unsigned byte character check (bits, positive polarity)\nCompareAndStore 0, 0b00000000, 4\n\n; Unsigned byte character check (mask, positive polarity)\nCompareAndStore 1, 0b01000000, 5\n\n; Unsigned byte character check (bits, negative polarity)\nCompareAndStore 2, 0b00010000, 6\n\n; Unsigned byte character check (mask, negative polarity)\nCompareAndStore 3, 0b01010000, 7\n\n; Unsigned byte character check (bits, negative masked)\nCompareAndStore 4, 0b00110000, 8\n\n; Unsigned byte character check (mask, negative masked)\nCompareAndStore 5, 0b01110000, 9\n\n; --- 16-bit unsigned word tests ---\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\n; Unsigned word character check (mask, positive polarity)\nCompareAndStore 6, 0b01000001, 10\n\n; Unsigned word character check (bits, negative polarity)\nCompareAndStore 7, 0b00010001, 11\n\n; Unsigned word character check (mask, negative polarity)\nCompareAndStore 8, 0b01010001, 12\n\n; Unsigned word character check (bits, negative masked)\nCompareAndStore 9, 0b00110001, 13\n\n; Unsigned word character check (mask, negative masked)\nCompareAndStore 10, 0b01110001, 14\n\n; Load all our stored flags for result comparing\nmovaps xmm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6463626144434241 ; \"ABCDabcd\"\ndq 0x6C6B6A694C4B4A00 ; \"\\0JKLijkl\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x4120492065726548 ; \"Here I A\"\ndq 0x6C4C612759202C6D ; \"m, Y'aLl\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpistrm_equal_each.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM1\":  [\"0x3939191919193939\", \"0x0000000019191919\"],\n      \"XMM2\":  [\"0x306F8A9E672C65E5\", \"0x000030443057697D\"],\n      \"XMM3\":  [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\"],\n      \"XMM4\":  [\"0x000000000000B43F\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0x0000FFFFFFFFFFFF\", \"0xFF00FFFF00FF0000\"],\n      \"XMM6\":  [\"0x0000000000004BC0\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0xFFFF000000000000\", \"0x00FF0000FF00FFFF\"],\n      \"XMM8\":  [\"0x000000000000CBC0\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0xFFFF000000000000\", \"0xFFFF0000FF00FFFF\"],\n      \"XMM10\": [\"0x00000000000000EF\", \"0x0000000000000000\"],\n      \"XMM11\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFF0000\"],\n      \"XMM12\": [\"0x0000000000000010\", \"0x0000000000000000\"],\n      \"XMM13\": [\"0x0000000000000000\", \"0x000000000000FFFF\"],\n      \"XMM14\": [\"0x0000000000000090\", \"0x0000000000000000\"],\n      \"XMM15\": [\"0x0000000000000000\", \"0xFFFF00000000FFFF\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to pcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  pcmpistrm xmm2, xmm3, %2\n  movaps xmm%3, xmm0\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Unsigned byte string check (bits, positive polarity)\nCompareAndStore 0, 0b00001000, 4\n\n; Unsigned byte string check (mask, positive polarity)\nCompareAndStore 1, 0b01001000, 5\n\n; Unsigned byte string check (bits, negative polarity)\nCompareAndStore 2, 0b00011000, 6\n\n; Unsigned byte string check (mask, negative polarity)\nCompareAndStore 3, 0b01011000, 7\n\n; Unsigned byte string check (bits, negative masked)\nCompareAndStore 4, 0b00111000, 8\n\n; Unsigned byte string check (mask, negative masked)\nCompareAndStore 5, 0b01111000, 9\n\n; --- 16-bit unsigned word tests ---\n\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\n; Unsigned word string check (bits, positive polarity)\nCompareAndStore 6, 0b00001001, 10\n\n; Unsigned word string check (mask, positive polarity)\nCompareAndStore 7, 0b01001001, 11\n\n; Unsigned word string check (bits, negative polarity)\nCompareAndStore 8, 0b00011001, 12\n\n; Unsigned word string check (mask, negative polarity)\nCompareAndStore 9, 0b01011001, 13\n\n; Unsigned word string check (bits, negative masked)\nCompareAndStore 10, 0b00111001, 14\n\n; Unsigned word string check (mask, negative masked)\nCompareAndStore 11, 0b01111001, 15\n\n; Load all our stored flags for result comparing\nmovaps xmm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6C6C6548 ; \"Hello Pe\"\ndq 0x00002121656C706F ; \"ople!!\\0\\0\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x00212121216C6C61 ; \"all!!!!\\0\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpistrm_equal_ordered.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM1\":  [\"0x1919313131311111\", \"0x0000000039393939\"],\n      \"XMM2\":  [\"0x306F000030443057\", \"0x000030443057697D\"],\n      \"XMM3\":  [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\"],\n      \"XMM4\":  [\"0x0000000000000204\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0x0000000000FF0000\", \"0x000000000000FF00\"],\n      \"XMM6\":  [\"0x000000000000FDFB\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0xFFFFFFFFFF00FFFF\", \"0xFFFFFFFFFFFF00FF\"],\n      \"XMM8\":  [\"0x000000000000FDFB\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0xFFFFFFFFFF00FFFF\", \"0xFFFFFFFFFFFF00FF\"],\n      \"XMM10\": [\"0x0000000000000020\", \"0x0000000000000000\"],\n      \"XMM11\": [\"0x0000000000000000\", \"0x00000000FFFF0000\"],\n      \"XMM12\": [\"0x00000000000000DF\", \"0x0000000000000000\"],\n      \"XMM13\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFF0000FFFF\"],\n      \"XMM14\": [\"0x000000000000005F\", \"0x0000000000000000\"],\n      \"XMM15\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000FFFF0000FFFF\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to pcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  pcmpistrm xmm2, xmm3, %2\n  movaps xmm%3, xmm0\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Unsigned byte string check (bits, positive polarity)\nCompareAndStore 0, 0b00001100, 4\n\n; Unsigned byte string check (mask, positive polarity)\nCompareAndStore 1, 0b01001100, 5\n\n; Unsigned byte string check (bits, negative polarity)\nCompareAndStore 2, 0b00011100, 6\n\n; Unsigned byte string check (mask, negative polarity)\nCompareAndStore 3, 0b01011100, 7\n\n; Unsigned byte string check (bits, negative masked)\nCompareAndStore 4, 0b00111100, 8\n\n; Unsigned byte string check (mask, negative masked)\nCompareAndStore 5, 0b01111100, 9\n\n; --- 16-bit unsigned word tests ---\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\nCompareAndStore 6, 0b00001101, 10\n\n; Unsigned word string check (mask, positive polarity)\nCompareAndStore 7, 0b01001101, 11\n\n; Unsigned word string check (bits, negative polarity)\nCompareAndStore 8, 0b00011101, 12\n\n; Unsigned word string check (mask, negative polarity)\nCompareAndStore 9, 0b01011101, 13\n\n; Unsigned word string check (bits, negative masked)\nCompareAndStore 10, 0b00111101, 14\n\n; Unsigned word string check (mask, negative masked)\nCompareAndStore 11, 0b01111101, 15\n\n; Load all our stored flags for result comparing\nmovaps xmm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6F006C6C ; \"ll\" with junk following it\ndq 0x21212121656C706F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x21212121216C6C61 ; \"all!!!!!\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F000030443057 ; \"しい\" followed by junk\ndq 0x000030443057697D\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/pcmpistrm_ranges.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM1\":  [\"0x3111313131311111\", \"0x0000000000313131\"],\n      \"XMM2\":  [\"0x005A0041007A0061\", \"0x55AACCBBFF220000\"],\n      \"XMM3\":  [\"0x006500200027003F\", \"0x00210065004F0065\"],\n      \"XMM4\":  [\"0x0000000000003DEA\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0xFFFFFF00FF00FF00\", \"0x0000FFFFFFFF00FF\"],\n      \"XMM6\":  [\"0x000000000000C215\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0x000000FF00FF00FF\", \"0xFFFF00000000FF00\"],\n      \"XMM8\":  [\"0x000000000000C215\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0x000000FF00FF00FF\", \"0xFFFF00000000FF00\"],\n      \"XMM10\": [\"0xFFFF000000000000\", \"0x0000FFFFFFFFFFFF\"],\n      \"XMM11\": [\"0x0000000000000087\", \"0x0000000000000000\"],\n      \"XMM12\": [\"0x0000FFFFFFFFFFFF\", \"0xFFFF000000000000\"],\n      \"XMM13\": [\"0x0000000000000087\", \"0x0000000000000000\"],\n      \"XMM14\": [\"0x0000FFFFFFFFFFFF\", \"0xFFFF000000000000\"]\n  },\n  \"HostFeatures\": [\"SSE4.2\"]\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to pcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  pcmpistrm xmm2, xmm3, %2\n  movaps xmm%3, xmm0\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nmovaps xmm2, [rel .data]\nmovaps xmm3, [rel .data + 32]\n\n; Range unsigned byte check (bits, positive polarity)\nCompareAndStore 0, 0b00000100, 4\n\n; Range unsigned byte check (mask, positive polarity)\nCompareAndStore 1, 0b01000100, 5\n\n; Range unsigned byte check (bits, negative polarity)\nCompareAndStore 2, 0b00010100, 6\n\n; Range unsigned byte check (mask, negative polarity)\nCompareAndStore 3, 0b01010100, 7\n\n; Range unsigned byte check (bits, negative masked)\nCompareAndStore 4, 0b00110100, 8\n\n; Range unsigned byte check (mask, negative masked)\nCompareAndStore 5, 0b01110100, 9\n\n; --- 16-bit unsigned word tests ---\nmovaps xmm2, [rel .data16]\nmovaps xmm3, [rel .data16 + 32]\n\n; Range unsigned word check (mask, positive polarity)\nCompareAndStore 6, 0b01000101, 10\n\n; Range unsigned word check (bits, negative polarity)\nCompareAndStore 7, 0b00010101, 11\n\n; Range unsigned word check (mask, negative polarity)\nCompareAndStore 8, 0b01010101, 12\n\n; Range unsigned word check (bits, negative masked)\nCompareAndStore 9, 0b00110101, 13\n\n; Range unsigned word check (mask, negative masked)\nCompareAndStore 10, 0b01110101, 14\n\n; Load all our stored flags for result comparing\nmovaps xmm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x998877005A417A61 ; \"azAZ\" (followed by junk)\ndq 0x55AACCBBFF223344\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x726548206D27493F ; \"?I'm Her\"\ndq 0x21216E65704F2065 ; \"e Open!!\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\n.data16:\ndq 0x005A0041007A0061 ; \"azAZ\"\ndq 0x55AACCBBFF220000\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x006500200027003F ; \"?' e\"\ndq 0x00210065004F0065 ; \"eOen!\"\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/H0F3A/sha1rnds4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"XMM1\": [\"0xA5E1EC3918BE0C95\", \"0xA3F7BF0143303AFB\"],\n      \"XMM2\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\"],\n      \"XMM3\": [\"0xA8B3BD15FA04D6D7\", \"0xDE761956A1F750B1\"],\n      \"XMM4\": [\"0xCFBBDFA4E5E4712D\", \"0x76AD0D46447127D3\"],\n      \"XMM5\": [\"0x9BDCA44510E70C65\", \"0x4474BFAA2B70A524\"]\n  },\n  \"HostFeatures\": [\"SHA\"]\n}\n%endif\n\nlea rdx, [rel .data]\n\n; We use XMM2 as the hypothetical E state\n; This should not change across multiple invocations\n; of SHA1RNDS4\nmovaps xmm2, [rdx + 16 * 1]\n\n; With imm = 0\nmovaps xmm1, [rdx + 16 * 0]\nsha1rnds4 xmm1, xmm2, 0\n\n; With imm = 1\nmovaps xmm3, [rdx + 16 * 0]\nsha1rnds4 xmm3, xmm2, 1\n\n; With imm = 2\nmovaps xmm4, [rdx + 16 * 0]\nsha1rnds4 xmm4, xmm2, 2\n\n; With imm = 3\nmovaps xmm5, [rdx + 16 * 0]\nsha1rnds4 xmm5, xmm2, 3\n\nhlt\n\nalign 16\n.data:\ndb 0xe0, 0xfc, 0x2b, 0xa1, 0x06, 0x4f, 0x6c, 0xa7, 0x0f, 0x06, 0x6a, 0x1e, 0x7f, 0x76, 0x80, 0x9b\ndb 0xe0, 0x56, 0xed, 0xaa, 0xf3, 0xc3, 0x68, 0x68, 0xde, 0xe6, 0xe6, 0x94, 0xe2, 0xe9, 0xfc, 0xf0\n"
  },
  {
    "path": "unittests/ASM/Includes/checkprecision.mac",
    "content": "%ifndef CHECK_PRECISION_INC\n%define CHECK_PRECISION_INC\n\n; CheckPrecision.inc - NASM include file containing macro to check precision\n; of single floating-point number.\n\n;; Clobbers xmm12, xmm13, xmm14, xmm15\n;; Returns result in al.\n;; Arguments are in memory locations.\n%macro check_relerr 3; %1=REF %2=X %3=TOLERANCE\n        movss   xmm12, dword [ %1 ] ; xmm12 has REF\n        movss   xmm13, dword [ %2 ] ; xmm13 has X\n        movss   xmm15, dword [rel abs_mask_float] ; xmm15 has the abs float mask\n        movaps  xmm14, xmm12 ; xmm14 has REF\n        subss   xmm14, xmm13 ; xmm14 = REF - X\n        andps   xmm12, xmm15 ; xmm12 = abs(REF)\n        mulss   xmm12, dword [ %3 ] ; xmm12 = abs(REF) * tolerance\n        movaps  xmm13, xmm14 ; xmm13 = REF - X\n        andps   xmm13, xmm15 ; xmm13 = abs(REF - X)\n\n        xor     eax, eax ; clears eax\n        comiss  xmm12, xmm13 ; compares xmm12 and xmm13\n        setnb   al ; stores xmm12 >= xmm13, i.e. abs(REF) * tolerance >= abs(REF - X)\n%endmacro\n\n;; Double-precision variant.\n;; Clobbers xmm12, xmm13, xmm14, xmm15\n;; Returns result in al.\n;; Arguments are in memory locations.\n%macro check_relerr_d 3; %1=REF %2=X %3=TOLERANCE\n        movsd   xmm12, qword [ %1 ] ; xmm12 has REF\n        movsd   xmm13, qword [ %2 ] ; xmm13 has X\n        movsd   xmm15, qword [rel abs_mask_double] ; xmm15 has the abs double mask\n        movapd  xmm14, xmm12 ; xmm14 has REF\n        subsd   xmm14, xmm13 ; xmm14 = REF - X\n        andpd   xmm12, xmm15 ; xmm12 = abs(REF)\n        mulsd   xmm12, qword [ %3 ] ; xmm12 = abs(REF) * tolerance\n        movapd  xmm13, xmm14 ; xmm13 = REF - X\n        andpd   xmm13, xmm15 ; xmm13 = abs(REF - X)\n\n        xor     eax, eax ; clears eax\n        comisd  xmm12, xmm13 ; compares xmm12 and xmm13\n        setnb   al ; stores xmm12 >= xmm13, i.e. abs(REF) * tolerance >= abs(REF - X)\n%endmacro\n\n%macro define_check_data_constants 0\nabs_mask_float:\n  dd 0x7fffffff   ; Bitmask to get absolute value of a float (single precision)\nabs_mask_double:\n  dq 0x7fffffffffffffff ; Bitmask to get absolute value of a double\n%endmacro\n%endif"
  },
  {
    "path": "unittests/ASM/Includes/modrm_oob_macros.mac",
    "content": "%macro w2 2\n; Ensures that the load doesn't read past the end.\n%1 [r15 - %2]\n\n; Ensures the load doesn't read before the start.\n%1 [r14]\n%endmacro\n\n%macro r2 2\n; Ensures that the load doesn't read past the end.\n%1 [r15 - %2]\n\n; Ensures the load doesn't read before the start.\n%1 [r14]\n%endmacro\n\n%macro w3 3\n; Ensures that the load doesn't read past the end.\n%1 [r15 - %2], %3\n\n; Ensures the load doesn't read before the start.\n%1 [r14], %3\n%endmacro\n\n%macro w3_size 3\n; Ensures that the load doesn't read past the end.\n%1 %3 [r15 - %2]\n\n; Ensures the load doesn't read before the start.\n%1 %3 [r14]\n%endmacro\n\n%macro r3 3\n; Ensures that the load doesn't read past the end.\n%1 %3, [r15 - %2]\n\n; Ensures the load doesn't read before the start.\n%1 %3, [r14]\n%endmacro\n\n%macro rw3 3\nr3 %1, %2, %3\nw3 %1, %2, %3\n%endmacro\n\n%macro w4 4\n; Ensures that the load doesn't read past the end.\n%1 [r15 - %2], %3, %4\n\n; Ensures the load doesn't read before the start.\n%1 [r14], %3, %4\n%endmacro\n\n%macro w4_size 4\n; Ensures that the load doesn't read past the end.\n%1 %3 [r15 - %2], %4\n\n; Ensures the load doesn't read before the start.\n%1 %3 [r14], %4\n%endmacro\n\n%macro r4 4\n; Ensures that the load doesn't read past the end.\n%1 %3, [r15 - %2], %4\n\n; Ensures the load doesn't read before the start.\n%1 %3, [r14], %4\n%endmacro\n\n%macro r4_size 4\n; Ensures that the load doesn't read past the end.\n%1 %4, %3 [r15 - %2]\n\n; Ensures the load doesn't read before the start.\n%1 %4, %3 [r14]\n%endmacro\n\n%macro rw4 4\nr4 %1, %2, %3, %4\nw4 %1, %2, %3, %3\n%endmacro\n\n%macro r4_fma 4\n; Ensures that the load doesn't read past the end.\n%1 %3, %4, [r15 - %2]\n\n; Ensures the load doesn't read before the start.\n%1 %3, %4, [r14]\n%endmacro\n\n%macro r5_fma_sized 5\n; Ensures that the load doesn't read past the end.\n%1 %4, %5, %3 [r15 - %2]\n\n; Ensures the load doesn't read before the start.\n%1 %4, %5, %3 [r14]\n%endmacro\n\n%macro w5_size 5\n; Ensures that the load doesn't read past the end.\n%1 %3 [r15 - %2], %4, %5\n\n; Ensures the load doesn't read before the start.\n%1 %3 [r14], %4, %5\n%endmacro\n\n%macro r5_size 5\n; Ensures that the load doesn't read past the end.\n%1 %4, %3 [r15 - %2], %5\n\n; Ensures the load doesn't read before the start.\n%1 %4, %3 [r14], %5\n%endmacro\n\n"
  },
  {
    "path": "unittests/ASM/Includes/x87cw.mac",
    "content": "%ifndef X87_CW_INC\n%define X87_CW_INC\n\n; Sets x87 precision and rounding modes\n; Uses the stack and clobbers rax\n; Args: precision constant, rounding constant\n%macro set_cw_precision_rounding 2\n  sub rsp, 2\n  fnstcw [rsp]\n  movzx eax, word [rsp]\n\n  ; Precision\n  and eax, ~(3 << 8)\n  or eax, %1 << 8\n\n  ; Rounding\n  and eax, ~(3 << 10)\n  or eax, %2 << 10\n\n  mov [rsp], ax\n  fldcw [rsp]\n  add rsp, 2\n%endmacro\n\nx87_prec_32 equ 00b\nx87_prec_64 equ 10b\nx87_prec_80 equ 11b\n\nx87_round_nearest equ 00b\nx87_round_down equ 01b\nx87_round_up equ 10b\nx87_round_towards_zero equ 11b\n\n%endif\n"
  },
  {
    "path": "unittests/ASM/Includes/xsave_macros.mac",
    "content": ";\n; Various macros used to set up data for the XSAVE tests\n;\n; Define IS_AVX before including this file to enable the\n; use of AVX instructions to handle the upper lanes.\n;\n\n%ifndef XSAVE_MACROS_INC\n%define XSAVE_MACROS_INC\n\n; Initializes the MMX registers to various values using a label to a memory region\n%macro set_up_mmx_state 1\n  movq mm0, [rel %1 + 32 * 0]\n  movq mm1, [rel %1 + 32 * 1]\n  movq mm2, [rel %1 + 32 * 2]\n  movq mm3, [rel %1 + 32 * 3]\n  movq mm4, [rel %1 + 32 * 4]\n  movq mm5, [rel %1 + 32 * 5]\n  movq mm6, [rel %1 + 32 * 6]\n  movq mm7, [rel %1 + 32 * 7]\n%endmacro\n\n; Sets up the XMM registers using a given label to a memory region.\n%macro set_up_xmm_state 1\n  %macro move_to_xmm 2\n    %ifdef IS_AVX\n      vmovaps ymm%1, [rel %2 + 32 * %1]\n    %else\n      movaps xmm%1,  [rel %2 + 32 * %1]\n    %endif\n  %endmacro\n\n  move_to_xmm 0,  %1\n  move_to_xmm 1,  %1\n  move_to_xmm 2,  %1\n  move_to_xmm 3,  %1\n  move_to_xmm 4,  %1\n  move_to_xmm 5,  %1\n  move_to_xmm 6,  %1\n  move_to_xmm 7,  %1\n  move_to_xmm 8,  %1\n  move_to_xmm 9,  %1\n  move_to_xmm 10, %1\n  move_to_xmm 11, %1\n  move_to_xmm 12, %1\n  move_to_xmm 13, %1\n  move_to_xmm 14, %1\n  move_to_xmm 15, %1\n\n  %undef move_to_xmm\n%endmacro\n\n; Overwrites the available slots within the legacy FXSAVE region\n;\n; overwrite_xsave_area .xsave_area\n;\n; Clobbers RAX\n;\n%macro overwrite_fxsave_slots 0\n  ; Overwrite the three 16byte \"available\" slots\n  mov rax, 0x1111111111111111\n  mov qword [rsp + 464 + 8 * 0], rax\n  mov rax, 0x2222222222222222\n  mov qword [rsp + 464 + 8 * 1], rax\n  mov rax, 0x3333333333333333\n  mov qword [rsp + 464 + 8 * 2], rax\n  mov rax, 0x4444444444444444\n  mov qword [rsp + 464 + 8 * 3], rax\n  mov rax, 0x5555555555555555\n  mov qword [rsp + 464 + 8 * 4], rax\n  mov rax, 0x6666666666666666\n  mov qword [rsp + 464 + 8 * 5], rax\n%endmacro\n\n; Overwrites all MM and XMM registers with -1\n;\n; Typically used right before an XRSTOR to verify\n; data is restored properly\n;\n; Clobbers RAX\n;\n%macro corrupt_mmx_and_xmm_registers 0\n  ; Corrupt MMX And XMM state\n  mov rax, -1\n  movq mm0, rax\n  movq mm1, rax\n  movq mm2, rax\n  movq mm3, rax\n  movq mm4, rax\n  movq mm5, rax\n  movq mm6, rax\n  movq mm7, rax\n\n  ; Setup XMM state\n  movq xmm0, rax\n  movq xmm1, rax\n  movq xmm2, rax\n  movq xmm3, rax\n  movq xmm4, rax\n  movq xmm5, rax\n  movq xmm6, rax\n  movq xmm7, rax\n  movq xmm8, rax\n  movq xmm9, rax\n  movq xmm10, rax\n  movq xmm11, rax\n  movq xmm12, rax\n  movq xmm13, rax\n  movq xmm14, rax\n  movq xmm15, rax\n%endmacro\n\n; At the end of the legacy FXSAVE area, there's three 16-byte regions\n; available for general purpose use. We re-load these to ensure values\n; that we put in here via overwrite_xsave_area aren't clobbered.\n;\n; Clobbers: RAX, RBX, RCX, RDX, RSI, RDI\n;\n%macro load_fxsave_slots 0\n  ; Load the three 16 bytes of \"available\" slots to make sure it wasn't overwritten\n  ; Reserved can be overwritten regardless\n  mov rax, qword [rsp + 464 + 8 * 0]\n  mov rbx, qword [rsp + 464 + 8 * 1]\n  mov rcx, qword [rsp + 464 + 8 * 2]\n  mov rdx, qword [rsp + 464 + 8 * 3]\n  mov rsi, qword [rsp + 464 + 8 * 4]\n  mov rdi, qword [rsp + 464 + 8 * 5]\n%endmacro\n\n; Defines a region of test data to use\n%macro define_xmm_data_section 0\nalign 32\n.xmm_data:\n  dq 0x1112131415161718\n  dq 0xABFDEC3402932039\n  dq 0xA1A2A3A4A5A6A7AA\n  dq 0xABFD392482039840\n\n  dq 0x2122232425262728\n  dq 0xDEFCA93847392992\n  dq 0x4142434445464748\n  dq 0x3987432929293847\n\n  dq 0x3132333435363738\n  dq 0xEADC3284ADCE9339\n  dq 0x6162636465666768\n  dq 0xACDEFACDEFACDEFA\n\n  dq 0x4142434445464748\n  dq 0x3987432929293847\n  dq 0x3132333435363738\n  dq 0xEADC3284ADCE9339\n\n  dq 0x5152535455565758\n  dq 0x3764583402983799\n  dq 0x7172737475767778\n  dq 0x3459238471238023\n\n  dq 0x6162636465666768\n  dq 0xACDEFACDEFACDEFA\n  dq 0xA1AAA3A4A5A6A7A8\n  dq 0x3784769228479192\n\n  dq 0x7172737475767778\n  dq 0x3459238471238023\n  dq 0x6162636465666768\n  dq 0xACDEFACDEFACDEFA\n\n  dq 0x8182838485868788\n  dq 0x9347239480289299\n  dq 0x6162636465666768\n  dq 0xACDEFACDEFACDEFA\n\n  dq 0xCCC2C3C4C5C6C7C8\n  dq 0x3949232903428479\n  dq 0xD1D2D3D4DDD6D7D8\n  dq 0x3674823989ADEF73\n\n  dq 0xA1AAA3A4A5A6A7A8\n  dq 0x3784769228479192\n  dq 0xB1B2B3B4B5B6BBB8\n  dq 0xADEADE3894353499\n\n  dq 0xF1F2FFF4F5F6F7F8\n  dq 0x758734629799389A\n  dq 0xD1D2D3D4DDD6D7D8\n  dq 0x3674823989ADEF73\n\n  dq 0xE1E2E3EEE5E6E7E8\n  dq 0x3756438328472389\n  dq 0xB1B2B3B4B5B6BBB8\n  dq 0xADEADE3894353499\n\n  dq 0xD1D2D3D4DDD6D7D8\n  dq 0x3674823989ADEF73\n  dq 0xA1AAA3A4A5A6A7A8\n  dq 0x3784769228479192\n\n  dq 0xC1C2C3C4C5CCC7C8\n  dq 0xABCDEF3894335820\n  dq 0x6162636465666768\n  dq 0xACDEFACDEFACDEFA\n\n  dq 0xB1B2B3B4B5B6BBB8\n  dq 0xADEADE3894353499\n  dq 0xE1E2E3EEE5E6E7E8\n  dq 0x3756438328472389\n\n  dq 0xA1A2A3A4A5A6A7AA\n  dq 0xABFD392482039840\n  dq 0xB1B2B3B4B5B6BBB8\n  dq 0xADEADE3894353499\n%endmacro\n\n%endif\n"
  },
  {
    "path": "unittests/ASM/JMP.asm",
    "content": "%ifdef CONFIG\n{\n  \"Ignore\": [],\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"RBX\": \"2\",\n    \"RCX\": \"3\",\n    \"RDX\": \"4\"\n  }\n}\n%endif\n\njmp label\nlabel:\n\nmov rsp, 0xe8000000\n\njmp function\nfunc_return:\n\nlea rbx, [rel function2]\njmp rbx\nfunc2_return:\n\ncmp rcx, rcx\nje function3\nfunc3_return:\n\nmov rdx, 4\njne function4\nfunc4_return:\n\nhlt\n\nfunction:\nmov rax, 1\njmp func_return\n\nfunction2:\nmov rbx, 2\njmp func2_return\n\nfunction3:\nmov rcx, 3\njmp func3_return\n\nfunction4:\nmov rdx, 0xDEADBEEF\njmp func4_return\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/Known_Failures",
    "content": "Test_X87/D9_F8.asm\n"
  },
  {
    "path": "unittests/ASM/Known_Failures_host",
    "content": "Test_X87/FXAM_Simple.asm\n## Tag bits not completely modelled\nTest_X87/X87MMXInteraction.asm"
  },
  {
    "path": "unittests/ASM/Known_Failures_jit",
    "content": "Test_FEX_bugs/32bit_syscall.asm\n"
  },
  {
    "path": "unittests/ASM/MOVHPD.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RAX\": \"0xDEADBEEFBAD0DAD1\",\n    \"RCX\": \"0xDEADBEEFBAD0DAD1\",\n    \"XMM0\": [\"0\", \"0xDEADBEEFBAD0DAD1\"]\n  }\n}\n%endif\n\n; Data we want to store\nmov rax, 0xDEADBEEFBAD0DAD1\n\n; Starting address to store to\nmov rdi, 0xe8000000\n\npxor xmm0, xmm0\npxor xmm1, xmm1\n\nmov [rdi], rax\n\nmovhpd xmm0, [rdi]\nmovhpd [rdi + 8], xmm0\n\nxor rcx, rcx\nmov rcx, [rdi + 8]\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/MemoryData.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xddccbbaa\"\n  },\n  \"MemoryRegions\": {\n    \"0x10000000\": \"4096\"\n  },\n  \"MemoryData\": {\n    \"0x10000000\": \"AA BB CC DD\"\n  }\n}\n%endif\n\n; Simple test to prove that config loader's MemoryData is working\n\nmov rax, [abs 0x10000000]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Multiblock/ReachableInvalidCode.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RAX\": \"0x20\"\n  }\n}\n%endif\n\nmov rax, 0\ncmp rax, 0\n\njz finish\n\n; multiblock should gracefully handle these invalid ops\ndb 0xf, 0x3B ; invalid opcode here\n\nfinish:\nmov rax, 32\n\nhlt"
  },
  {
    "path": "unittests/ASM/OpSize/15_BYTE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n  }\n}\n%endif\n\ndb 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_10.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmovupd xmm0, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_11.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovupd xmm1, [rdx + 8 * 2]\nmovupd [rdx + 8 * 0], xmm1\nmovupd xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_12.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x6162636465666768\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\n; Preload\nmovupd xmm0, [rdx]\n\n; Lower 64bits\nmovlpd xmm0, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_13.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x0\",\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\n; Preload\nmovupd xmm0, [rdx]\n\n; Lower 64bits\nmovlpd [rdx + 8 * 2], xmm0\n\nmov rax, [rdx + 8 * 2]\nmov rbx, [rdx + 8 * 3] ;Ensure this wasn't overwritten\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_14.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x6162636465666768\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Preload\nmovupd xmm0, [rdx]\nmovupd xmm1, [rdx + 8 * 2]\n\nunpcklpd xmm0, xmm1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_15.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x5152535455565758\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Preload\nmovupd xmm0, [rdx]\nmovupd xmm1, [rdx + 8 * 2]\n\nunpckhpd xmm0, xmm1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x6162636465666768\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovapd xmm0, [rdx]\nmovhpd xmm0, [rdx + 16]\n\nhlt\n\nalign 16\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_17.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x5152535455565758\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovapd xmm0, [rdx]\nmovhpd [rdx + 16], xmm0\nmovapd xmm1, [rdx + 16]\n\nhlt\n\nalign 4096\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_28.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, xmm0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_29.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x5152535455565758\",\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd [rdx + 8 * 2], xmm0\nmovapd xmm1, xmm0\n\nmov rax, [rdx + 8 * 2]\nmov rbx, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_2A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x3ff0000000000000\", \"0x0\"],\n    \"XMM1\": [\"0xc000000000000000\", \"0xbff0000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000000000001\nmov [rdx + 8 * 0], rax\nmov rax, 0xFFFFFFFFFFFFFFFE\nmov [rdx + 8 * 1], rax\n\nmovq mm0, [rdx]\ncvtpi2pd xmm0, mm0\ncvtpi2pd xmm1, [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_2B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovntpd [rdx + 8 * 2], xmm0\nmovaps xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_2C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\":  \"0x0000000200000001\",\n    \"MM1\":  \"0xFFFFFFFEFFFFFFFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xbff0000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0xc000000000000000\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmovq mm0, [rdx + 8 * 4]\nmovq mm1, [rdx + 8 * 4]\n\nmovapd xmm2, [rdx + 8 * 0]\n\ncvttpd2pi mm0, xmm2\ncvttpd2pi mm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_2D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\":  \"0x0000000200000001\",\n    \"MM1\":  \"0xFFFFFFFEFFFFFFFF\",\n    \"MM2\":  \"0x8000000080000000\",\n    \"MM3\":  \"0x8000000080000000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; Set up MXCSR to truncate\nmov eax, 0x7F80\nmov [rdx + 8 * 0], eax\nldmxcsr [rdx + 8 * 0]\n\nmov rax, 0x3ff0000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xbff0000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0xc000000000000000\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x7ff0000000000000\nmov [rdx + 8 * 6], rax\nmov rax, 0xfff0000000000000\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x7ff8000000000000\nmov [rdx + 8 * 8], rax\nmov rax, 0x7fefffffffffffff\nmov [rdx + 8 * 9], rax\n\nmovq mm0, [rdx + 8 * 4]\nmovq mm1, [rdx + 8 * 4]\n\nmovapd xmm2, [rdx + 8 * 0]\n\ncvtpd2pi mm0, xmm2\ncvtpd2pi mm1, [rdx + 8 * 2]\ncvtpd2pi mm2, [rdx + 8 * 6]\ncvtpd2pi mm3, [rdx + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_2E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4700\",\n    \"RBX\": \"0x0300\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4010000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x4010000000000000\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x7ff8000000000000\nmov [rdx + 8 * 4], rax\nmov rax, 0x4010000000000000\nmov [rdx + 8 * 5], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nucomisd xmm0, [rdx + 8 * 2] ; 1.0 <comp> 4.0\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000 <- 0\n; ================\n;         00000011\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nmov rbx, rax\n\nucomisd xmm0, [rdx + 8 * 4] ; 1.0 <comp> NaN\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 01000000\n; 7: SF - 00000000 <- 0\n; ================\n;         01000111\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_2F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4700\",\n    \"RBX\": \"0x0300\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4010000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x4010000000000000\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x7ff8000000000000\nmov [rdx + 8 * 4], rax\nmov rax, 0x4010000000000000\nmov [rdx + 8 * 5], rax\n\nmovaps xmm0, [rdx + 8 * 0]\ncomisd xmm0, [rdx + 8 * 2] ; 1.0 <comp> 4.0\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000 <- 0\n; ================\n;         00000111\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nmov rbx, rax\n\ncomisd xmm0, [rdx + 8 * 4] ; 1.0 <comp> NaN\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 01000000\n; 7: SF - 00000000 <- 0\n; ================\n;         01000111\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_50.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x2\",\n    \"RDI\": \"0x0\",\n    \"XMM0\": [\"0x0\", \"0x8000000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0\nmov [rdx + 8 * 0], rax\nmov rax, 0x8000000000000000\nmov [rdx + 8 * 1], rax\n\nmovapd xmm0, [rdx]\nmovmskpd rax, xmm0\n\nmovapd xmm1, [rel .data]\nmovmskpd rdi, xmm1\n\nhlt\n\nalign 16\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_51.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x3ff0000000000000\", \"0x3ff0000000000000\"],\n    \"XMM1\":  [\"0x4000000000000000\", \"0x4000000000000000\"],\n    \"XMM2\":  [\"0x4008000000000000\", \"0x4008000000000000\"],\n    \"XMM3\":  [\"0x4010000000000000\", \"0x4010000000000000\"],\n    \"XMM4\":  [\"0x3ff0000000000000\", \"0x3ff0000000000000\"],\n    \"XMM5\":  [\"0x4000000000000000\", \"0x4000000000000000\"],\n    \"XMM6\":  [\"0x4008000000000000\", \"0x4008000000000000\"],\n    \"XMM7\":  [\"0x4010000000000000\", \"0x4010000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3FF0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x3FF0000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4010000000000000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x4010000000000000\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4022000000000000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x4022000000000000\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4030000000000000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x4030000000000000\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x4039000000000000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x4039000000000000\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\nsqrtpd xmm0, xmm0\nsqrtpd xmm1, xmm1\nsqrtpd xmm2, xmm2\nsqrtpd xmm3, xmm3\n\nsqrtpd xmm4, [rdx + 8 * 0]\nsqrtpd xmm5, [rdx + 8 * 2]\nsqrtpd xmm6, [rdx + 8 * 4]\nsqrtpd xmm7, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_54.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x1010101010101010\", \"0x0\"],\n    \"XMM1\": [\"0x1010101010101010\", \"0x0\"],\n    \"XMM2\": [\"0x1010101010101010\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 0], rax\nmov rax, 0x0\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1010101010101010\nmov [rdx + 8 * 2], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nandpd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\nandpd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_55.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM1\": [\"0x0\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM2\": [\"0x1010101010101010\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 0], rax\nmov rax, 0x0\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1010101010101010\nmov [rdx + 8 * 2], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nandnpd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\nandnpd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_56.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x1111111111111111\", \"0x2222222222222222\"],\n    \"XMM1\": [\"0x1111111111111111\", \"0x2222222222222222\"],\n    \"XMM2\": [\"0x0101010101010101\", \"0x0202020202020202\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x1010101010101010\nmov [rdx + 8 * 0], rax\nmov rax, 0x2020202020202020\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0101010101010101\nmov [rdx + 8 * 2], rax\nmov rax, 0x0202020202020202\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\norpd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\norpd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_57.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x2424242424242424\", \"0x2424242424242424\"],\n    \"XMM1\": [\"0x2424242424242424\", \"0x2424242424242424\"],\n    \"XMM2\": [\"0x1818181818181818\", \"0x1818181818181818\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3C3C3C3C3C3C3C3C\nmov [rdx + 8 * 0], rax\nmov rax, 0x3C3C3C3C3C3C3C3C\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1818181818181818\nmov [rdx + 8 * 2], rax\nmov rax, 0x1818181818181818\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nxorpd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\nxorpd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_58.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4008000000000000\", \"0x4008000000000000\"],\n    \"XMM1\": [\"0x4008000000000000\", \"0x4008000000000000\"],\n    \"XMM2\": [\"0x4000000000000000\", \"0x4000000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3FF0000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x3FF0000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\naddpd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\naddpd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_59.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4018000000000000\", \"0x4018000000000000\"],\n    \"XMM1\": [\"0x4018000000000000\", \"0x4018000000000000\"],\n    \"XMM2\": [\"0x4000000000000000\", \"0x4000000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4008000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x4008000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmulpd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\nmulpd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_5A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x404000003F800000\", \"0x0\"],\n    \"XMM1\": [\"0x3FF0000000000000\", \"0x4008000000000000\"],\n    \"XMM2\": [\"0xff8000007f800000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x7f8000007fc00000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3FF0000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x4008000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 2], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x7ff0000000000000\nmov [rdx + 8 * 4], rax\nmov rax, 0xfff0000000000000\nmov [rdx + 8 * 5], rax\nmov rax, 0x7ff8000000000000\nmov [rdx + 8 * 6], rax\nmov rax, 0x7fefffffffffffff\nmov [rdx + 8 * 7], rax\n\nmovapd xmm0, [rdx + 8 * 2]\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\n\ncvtpd2ps xmm0, xmm1\ncvtpd2ps xmm2, xmm2\ncvtpd2ps xmm3, xmm3\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_5A_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x428b029f42a63326\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x4150f0e342241b6c\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x41aff21340ab4706\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x40aa5bea411ac802\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x428500c641e83ad2\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x42b6ba02419a760c\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x424bd89b4221cdae\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x41bfce514202945e\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x41c1cdc342b5494c\", \"0x0000000000000000\"],\n    \"XMM9\": [\"0x42b66f2e42c5e0f9\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x42c6f7d842b59a55\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x4294cbf84281f1e5\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x41cad360420ce913\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x42b4662d40bbf141\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x42501e3a42042015\", \"0x0000000000000000\"],\n    \"XMM15\": [\"0x4122ce1242698acb\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\nmovapd xmm0, [rdx + 16 * 0]\nmovapd xmm1, [rdx + 16 * 1]\nmovapd xmm2, [rdx + 16 * 2]\nmovapd xmm3, [rdx + 16 * 3]\nmovapd xmm4, [rdx + 16 * 4]\nmovapd xmm5, [rdx + 16 * 5]\nmovapd xmm6, [rdx + 16 * 6]\nmovapd xmm7, [rdx + 16 * 7]\nmovapd xmm8, [rdx + 16 * 8]\nmovapd xmm9, [rdx + 16 * 9]\nmovapd xmm10, [rdx + 16 * 10]\nmovapd xmm11, [rdx + 16 * 11]\nmovapd xmm12, [rdx + 16 * 12]\nmovapd xmm13, [rdx + 16 * 13]\nmovapd xmm14, [rdx + 16 * 14]\nmovapd xmm15, [rdx + 16 * 15]\n\n\ncvtpd2ps xmm0, [rdx + 16 * 0]\ncvtpd2ps xmm1, [rdx + 16 * 1]\ncvtpd2ps xmm2, [rdx + 16 * 2]\ncvtpd2ps xmm3, [rdx + 16 * 3]\ncvtpd2ps xmm4, [rdx + 16 * 4]\ncvtpd2ps xmm5, [rdx + 16 * 5]\ncvtpd2ps xmm6, [rdx + 16 * 6]\ncvtpd2ps xmm7, [rdx + 16 * 7]\ncvtpd2ps xmm8, [rdx + 16 * 8]\ncvtpd2ps xmm9, [rdx + 16 * 9]\ncvtpd2ps xmm10, [rdx + 16 * 10]\ncvtpd2ps xmm11, [rdx + 16 * 11]\ncvtpd2ps xmm12, [rdx + 16 * 12]\ncvtpd2ps xmm13, [rdx + 16 * 13]\ncvtpd2ps xmm14, [rdx + 16 * 14]\ncvtpd2ps xmm15, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 512bytes of random data\n.data:\ndq 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_5B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000100000001\", \"0x0000000200000002\"],\n    \"XMM1\":  [\"0x0000000400000004\", \"0x0000000800000008\"],\n    \"XMM2\":  [\"0x8000000000000000\", \"0x8000000080000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3fc000003f800000 ; [1.5, 1.0]\nmov [rdx + 8 * 0], rax\nmov rax, 0x4039999a40000000 ; [2.9, 2.0]\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4083333340800000 ; [4.1, 4.0]\nmov [rdx + 8 * 2], rax\nmov rax, 0x4108000041000000 ; [8.5, 8.0]\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x7fc000007f800000\nmov [rdx + 8 * 6], rax\nmov rax, 0xff800000ff7fffee\nmov [rdx + 8 * 7], rax\n\n; Set up MXCSR to truncate\nmov eax, 0x7F80\nmov [rdx + 8 * 6], eax\nldmxcsr [rdx + 8 * 6]\n\nmovapd xmm0, [rdx + 8 * 4]\nmovapd xmm1, [rdx + 8 * 4]\n\nmovapd xmm2, [rdx + 8 * 0]\n\ncvtps2dq xmm0, xmm2\ncvtps2dq xmm1, [rdx + 8 * 2]\ncvtps2dq xmm2, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_5B_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000004600000053\", \"0x0000000d00000029\"],\n    \"XMM1\":  [\"0x0000001600000005\", \"0x000000050000000a\"],\n    \"XMM2\":  [\"0x000000430000001d\", \"0x0000005b00000013\"],\n    \"XMM3\":  [\"0x0000003300000028\", \"0x0000001800000021\"],\n    \"XMM4\":  [\"0x000000180000005b\", \"0x0000005b00000063\"],\n    \"XMM5\":  [\"0x000000630000005b\", \"0x0000004a00000041\"],\n    \"XMM6\":  [\"0x0000001900000023\", \"0x0000005a00000006\"],\n    \"XMM7\":  [\"0x0000003400000021\", \"0x0000000a0000003a\"],\n    \"XMM8\":  [\"0x0000005400000030\", \"0x000000420000005a\"],\n    \"XMM9\":  [\"0x0000000700000060\", \"0x0000005f0000001a\"],\n    \"XMM10\": [\"0x0000002500000058\", \"0x0000000a00000032\"],\n    \"XMM11\": [\"0x000000140000004e\", \"0x000000290000000a\"],\n    \"XMM12\": [\"0x0000003a0000000f\", \"0x000000380000000a\"],\n    \"XMM13\": [\"0x0000000500000035\", \"0x0000000300000049\"],\n    \"XMM14\": [\"0x0000004700000039\", \"0x000000590000003e\"],\n    \"XMM15\": [\"0x0000001800000030\", \"0x0000006100000022\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\ncvtps2dq xmm0, [rdx + 16 * 0]\ncvtps2dq xmm1, [rdx + 16 * 1]\ncvtps2dq xmm2, [rdx + 16 * 2]\ncvtps2dq xmm3, [rdx + 16 * 3]\ncvtps2dq xmm4, [rdx + 16 * 4]\ncvtps2dq xmm5, [rdx + 16 * 5]\ncvtps2dq xmm6, [rdx + 16 * 6]\ncvtps2dq xmm7, [rdx + 16 * 7]\ncvtps2dq xmm8, [rdx + 16 * 8]\ncvtps2dq xmm9, [rdx + 16 * 9]\ncvtps2dq xmm10, [rdx + 16 * 10]\ncvtps2dq xmm11, [rdx + 16 * 11]\ncvtps2dq xmm12, [rdx + 16 * 12]\ncvtps2dq xmm13, [rdx + 16 * 13]\ncvtps2dq xmm14, [rdx + 16 * 14]\ncvtps2dq xmm15, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndd 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_5C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x3FF0000000000000\", \"0x3FF0000000000000\"],\n    \"XMM1\": [\"0x3FF0000000000000\", \"0x3FF0000000000000\"],\n    \"XMM2\": [\"0x4000000000000000\", \"0x4000000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4008000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x4008000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nsubpd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\nsubpd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_5D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x3FF0000000000000\", \"0x4000000000000000\"],\n    \"XMM1\": [\"0x3FF0000000000000\", \"0x4000000000000000\"],\n    \"XMM2\": [\"0x3FF0000000000000\", \"0x4008000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4008000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x3FF0000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x4008000000000000\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nminpd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\nminpd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_5E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x3FE0000000000000\", \"0x3FE0000000000000\"],\n    \"XMM1\": [\"0x3FE0000000000000\", \"0x3FE0000000000000\"],\n    \"XMM2\": [\"0x4000000000000000\", \"0x4000000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3FF0000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x3FF0000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\ndivpd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\ndivpd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_5F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4008000000000000\", \"0x4000000000000000\"],\n    \"XMM1\": [\"0x4008000000000000\", \"0x4000000000000000\"],\n    \"XMM2\": [\"0x3FF0000000000000\", \"0x4000000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4008000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x3FF0000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x3FF0000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmaxpd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\nmaxpd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_60.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x6545664667476848\", \"0x6141624263436444\"],\n    \"XMM1\": [\"0x6545664667476848\", \"0x6141624263436444\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npunpcklbw xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npunpcklbw xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_61.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x6566454667684748\", \"0x6162414263644344\"],\n    \"XMM1\": [\"0x6566454667684748\", \"0x6162414263644344\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npunpcklwd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npunpcklwd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_62.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x6566676845464748\", \"0x6162636441424344\"],\n    \"XMM1\": [\"0x6566676845464748\", \"0x6162636441424344\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npunpckldq xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npunpckldq xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_63.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x00807F4100807F41\", \"0x00FF7F4100FF7F41\"],\n    \"XMM1\": [\"0x00807F4100807F41\", \"0x00FF7F4100FF7F41\"],\n    \"XMM2\": [\"0x0000FFFF007F0041\", \"0x0000FFFF007F0041\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; 16bit signed -> 8bit signed (saturated)\n; input > 0x7F(SCHAR_MAX, 127) = 0x7F(SCHAR_MAX, 127)\n; input < 0x80(-127) = 0x80\n\nmov rax, 0x00008000007F0041\nmov [rdx + 8 * 0], rax\nmov rax, 0x00008000007F0041\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0000FFFF007F0041\nmov [rdx + 8 * 2], rax\nmov rax, 0x0000FFFF007F0041\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npacksswb xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npacksswb xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0\"],\n    \"XMM1\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 0], rax\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npcmpgtb xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npcmpgtb xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_65.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0\"],\n    \"XMM1\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 0], rax\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npcmpgtw xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npcmpgtw xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_66.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0\"],\n    \"XMM1\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 0], rax\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npcmpgtd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npcmpgtd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_67.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x00007F4100007F41\", \"0x00007F4100007F41\"],\n    \"XMM1\": [\"0x00007F4100007F41\", \"0x00007F4100007F41\"],\n    \"XMM2\": [\"0x0000FFFF007F0041\", \"0x0000FFFF007F0041\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; 16bit signed -> 8bit unsigned (saturated)\n; input > 0x7F(SCHAR_MAX, 127) = 0xFF(UCHAR_MAX, 255)\n; input < 0x00(Negative) = 0x0\n\nmov rax, 0x0000FFFF007F0041\nmov [rdx + 8 * 0], rax\nmov rax, 0x0000FFFF007F0041\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0000FFFF007F0041\nmov [rdx + 8 * 2], rax\nmov rax, 0x0000FFFF007F0041\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npackuswb xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npackuswb xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_68.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x7555765677577858\", \"0x7151725273537454\"],\n    \"XMM1\": [\"0x7555765677577858\", \"0x7151725273537454\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npunpckhbw xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npunpckhbw xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_69.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x7576555677785758\", \"0x7172515273745354\"],\n    \"XMM1\": [\"0x7576555677785758\", \"0x7172515273745354\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npunpckhwd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npunpckhwd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_6A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x7576777855565758\", \"0x7172737451525354\"],\n    \"XMM1\": [\"0x7576777855565758\", \"0x7172737451525354\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npunpckhdq xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npunpckhdq xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_6B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x00000040FFFF8000\", \"0x00000040FFFF8000\"],\n    \"XMM1\": [\"0x00000040FFFF8000\", \"0x00000040FFFF8000\"],\n    \"XMM2\": [\"0xFFFFFFFF80000000\", \"0x0000000000000040\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; 32bit signed -> 16bit signed (saturated)\n; input > 0x7FFF(SHRT_MAX, 32767) = 0x7FFF(SHRT_MAX, 32767)\n; input < 0x8000(-32767) = 0x8000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x0000000000000040\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x0000000000000040\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npackssdw xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npackssdw xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_6C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x6162636465666768\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x6162636465666768\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npunpcklqdq xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npunpcklqdq xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_6D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x5152535455565758\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x5152535455565758\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npunpckhqdq xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npunpckhqdq xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_6E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x45464748\", \"0x0\"],\n    \"XMM1\": [\"0x5152535455565758\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmovaps xmm2, [rdx + 8 * 2]\nmovaps xmm3, [rdx + 8 * 2]\n\nmovd xmm0, dword [rdx + 8 * 0]\n; AMD's Architecture programmer's manual claims this mnemonic is still movd, but compilers only accept movq\nmovq xmm1, qword [rdx + 8 * 1]\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_6F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovdqa xmm0, [rdx + 8 * 0]\n\nmovapd xmm2, [rdx + 8 * 2]\n\nmovdqa xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_70.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0x4546474845464748\", \"0x4546474845464748\"],\n    \"XMM3\": [\"0x5152535451525354\", \"0x5152535451525354\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 8 * 2]\npshufd xmm2, xmm0, 0x0\npshufd xmm3, xmm0, 0xFF\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_74.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x00000000000000FF\", \"0x00000000000000FF\"],\n    \"XMM1\": [\"0x00000000000000FF\", \"0x00000000000000FF\"],\n    \"XMM2\": [\"0x6162636465666778\", \"0x5152535455565748\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 0], rax\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666778\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565748\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npcmpeqb xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npcmpeqb xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_75.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x000000000000FFFF\", \"0x000000000000FFFF\"],\n    \"XMM1\": [\"0x000000000000FFFF\", \"0x000000000000FFFF\"],\n    \"XMM2\": [\"0x6162636465667778\", \"0x5152535455564748\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 0], rax\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465667778\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455564748\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npcmpeqw xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npcmpeqw xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_76.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x00000000FFFFFFFF\", \"0x00000000FFFFFFFF\"],\n    \"XMM1\": [\"0x00000000FFFFFFFF\", \"0x00000000FFFFFFFF\"],\n    \"XMM2\": [\"0x61626364FFFFFFFF\", \"0x51525354FFFFFFFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x71727374FFFFFFFF\nmov [rdx + 8 * 0], rax\nmov rax, 0x41424344FFFFFFFF\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x61626364FFFFFFFF\nmov [rdx + 8 * 2], rax\nmov rax, 0x51525354FFFFFFFF\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npcmpeqd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npcmpeqd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_7C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4008000000000000\", \"0x4028000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4010000000000000 ; 4\nmov [rdx + 8 * 2], rax\nmov rax, 0x4020000000000000 ; 8\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 8 * 2]\n\nhaddpd xmm0, xmm1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_7D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x3ff0000000000000\", \"0x4010000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x3ff0000000000000; 1.0\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4020000000000000 ; 8\nmov [rdx + 8 * 2], rax\nmov rax, 0x4010000000000000 ; 4\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 8 * 2]\n\nhsubpd xmm0, xmm1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_7E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x65666768\",\n    \"RBX\": \"0x6162636465666768\",\n    \"RCX\": \"0x75767778\",\n    \"RSI\": \"0x7172737475767778\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmovups xmm2, [rdx + 8 * 2]\nmovups xmm3, [rdx + 8 * 3]\n\nmovd dword [rdx + 8 * 4], xmm2\n; AMD's Architecture programmer's manual claims this mnemonic is still movd, but compilers only accept movq\nmovq qword [rdx + 8 * 5], xmm2\n\nmov rax, [rdx + 8 * 4]\nmov rbx, [rdx + 8 * 5]\n\nmovd ecx, xmm3\nmovq rsi, xmm3\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_7F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0\nmov [rdx + 8 * 2], rax\nmov rax, 0\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovdqa [rdx + 8 * 2], xmm0\nmovapd xmm1, [rdx + 8 * 2]\n\nmovdqa xmm2, xmm0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_C2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0\"],\n    \"XMM1\": [\"0x0\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM3\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM4\": [\"0x0\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM5\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0\"],\n    \"XMM6\": [\"0x0\", \"0x0\"],\n    \"XMM7\": [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM9\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x3ff0000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x4008000000000000\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\nmovapd xmm5, [rdx + 8 * 0]\nmovapd xmm6, [rdx + 8 * 0]\nmovapd xmm7, [rdx + 8 * 0]\nmovapd xmm8, [rdx + 8 * 2]\n\ncmppd xmm0, xmm8, 0x00 ; EQ\ncmppd xmm1, xmm8, 0x01 ; LT\ncmppd xmm2, xmm8, 0x02 ; LTE\ncmppd xmm4, xmm8, 0x04 ; NEQ\ncmppd xmm5, xmm8, 0x05 ; NLT\ncmppd xmm6, xmm8, 0x06 ; NLTE\n\n; Unordered and Ordered tests need to be special cased\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x7FF8000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x7FF8000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 3], rax\n\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm7, [rdx + 8 * 0]\nmovapd xmm8, [rdx + 8 * 2]\n\n; Unordered will return true when either input is nan\n; [0.0, nan] unord [nan, 0.0] = [1, 1]\ncmppd xmm3, xmm8, 0x03 ; Unordered\n\n; Ordered will return true when both inputs are NOT nan\n; [0.0, nan] ord [nan, 0.0] = [0, 0]\ncmppd xmm7, xmm8, 0x07 ; Ordered\n\nmov rax, 0x7FF8000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 1], rax\n\nmovapd xmm8, [rdx + 8 * 0]\nmovapd xmm9, [rdx + 8 * 0]\n\n; Ordered will return true when both inputs are NOT nan\n; [nan, 0.0] ord [nan, 0.0] = [0, 1]\ncmppd xmm8, xmm9, 0x07 ; Ordered\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x7FF8000000000000\nmov [rdx + 8 * 1], rax\n\nmovapd xmm9, [rdx + 8 * 0]\nmovapd xmm10, [rdx + 8 * 0]\n\n; Ordered will return true when both inputs are NOT nan\n; [0.0, nan] ord [0.0, nan] = [1, 0]\ncmppd xmm9, xmm10, 0x07 ; Ordered\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_C4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445467778\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434477784748\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4142777845464748\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x7778434445464748\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x4142434445464748\", \"0x5152535455567778\"],\n    \"XMM5\":  [\"0x4142434445464748\", \"0x5152535477785758\"],\n    \"XMM6\":  [\"0x4142434445464748\", \"0x5152777855565758\"],\n    \"XMM7\":  [\"0x4142434445464748\", \"0x7778535455565758\"],\n    \"XMM8\":  [\"0x4142434445467778\", \"0x5152535455565758\"],\n    \"XMM9\":  [\"0x4142434477784748\", \"0x5152535455565758\"],\n    \"XMM10\": [\"0x4142777845464748\", \"0x5152535455565758\"],\n    \"XMM11\": [\"0x7778434445464748\", \"0x5152535455565758\"],\n    \"XMM12\": [\"0x4142434445464748\", \"0x5152535455567778\"],\n    \"XMM13\": [\"0x4142434445464748\", \"0x5152535477785758\"],\n    \"XMM14\": [\"0x4142434445464748\", \"0x5152777855565758\"],\n    \"XMM15\": [\"0x4142434445464748\", \"0x7778535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 2], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\nmovapd xmm5, [rdx + 8 * 0]\nmovapd xmm6, [rdx + 8 * 0]\nmovapd xmm7, [rdx + 8 * 0]\n\nmovapd xmm8, [rdx + 8 * 0]\nmovapd xmm9, [rdx + 8 * 0]\nmovapd xmm10, [rdx + 8 * 0]\nmovapd xmm11, [rdx + 8 * 0]\nmovapd xmm12, [rdx + 8 * 0]\nmovapd xmm13, [rdx + 8 * 0]\nmovapd xmm14, [rdx + 8 * 0]\nmovapd xmm15, [rdx + 8 * 0]\n\npinsrw xmm0, rax, 0\npinsrw xmm1, rax, 1\npinsrw xmm2, rax, 2\npinsrw xmm3, rax, 3\npinsrw xmm4, rax, 4\npinsrw xmm5, rax, 5\npinsrw xmm6, rax, 6\npinsrw xmm7, rax, 7\n\npinsrw xmm8, [rdx + 8 * 2], 0\npinsrw xmm9, [rdx + 8 * 2], 1\npinsrw xmm10, [rdx + 8 * 2], 2\npinsrw xmm11, [rdx + 8 * 2], 3\npinsrw xmm12, [rdx + 8 * 2], 4\npinsrw xmm13, [rdx + 8 * 2], 5\npinsrw xmm14, [rdx + 8 * 2], 6\npinsrw xmm15, [rdx + 8 * 2], 7\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_C4_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445467778\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434477784748\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4142777845464748\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x7778434445464748\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x4142434445464748\", \"0x5152535455567778\"],\n    \"XMM5\":  [\"0x4142434445464748\", \"0x5152535477785758\"],\n    \"XMM6\":  [\"0x4142434445464748\", \"0x5152777855565758\"],\n    \"XMM7\":  [\"0x4142434445464748\", \"0x7778535455565758\"],\n    \"XMM8\":  [\"0x4142434445467778\", \"0x5152535455565758\"],\n    \"XMM9\":  [\"0x4142434477784748\", \"0x5152535455565758\"],\n    \"XMM10\": [\"0x4142777845464748\", \"0x5152535455565758\"],\n    \"XMM11\": [\"0x7778434445464748\", \"0x5152535455565758\"],\n    \"XMM12\": [\"0x4142434445464748\", \"0x5152535455567778\"],\n    \"XMM13\": [\"0x4142434445464748\", \"0x5152535477785758\"],\n    \"XMM14\": [\"0x4142434445464748\", \"0x5152777855565758\"],\n    \"XMM15\": [\"0x4142434445464748\", \"0x7778535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 2], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\nmovapd xmm5, [rdx + 8 * 0]\nmovapd xmm6, [rdx + 8 * 0]\nmovapd xmm7, [rdx + 8 * 0]\n\nmovapd xmm8, [rdx + 8 * 0]\nmovapd xmm9, [rdx + 8 * 0]\nmovapd xmm10, [rdx + 8 * 0]\nmovapd xmm11, [rdx + 8 * 0]\nmovapd xmm12, [rdx + 8 * 0]\nmovapd xmm13, [rdx + 8 * 0]\nmovapd xmm14, [rdx + 8 * 0]\nmovapd xmm15, [rdx + 8 * 0]\n\npinsrw xmm0, rax, 0\npinsrw xmm1, rax, 1\npinsrw xmm2, rax, 2\npinsrw xmm3, rax, 3\npinsrw xmm4, rax, 4\npinsrw xmm5, rax, 5\npinsrw xmm6, rax, 6\npinsrw xmm7, rax, 7\n\npinsrw xmm8, rax, 8\npinsrw xmm9, rax, 9\npinsrw xmm10, rax, 10\npinsrw xmm11, rax, 11\npinsrw xmm12, rax, 12\npinsrw xmm13, rax, 13\npinsrw xmm14, rax, 14\npinsrw xmm15, rax, 15\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_C5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4748\",\n    \"RBX\": \"0x4546\",\n    \"RCX\": \"0x4344\",\n    \"RDX\": \"0x4142\",\n    \"RBP\": \"0x5758\",\n    \"RSI\": \"0x5556\",\n    \"RDI\": \"0x5354\",\n    \"RSP\": \"0x5152\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmovapd xmm0, [rdx + 8 * 0]\n\nmov rax, -1\nmov rbx, -1\nmov rcx, -1\nmov rdx, -1\nmov rbp, -1\nmov rsi, -1\nmov rdi, -1\nmov rsp, -1\n\npextrw rax, xmm0, 0\npextrw rbx, xmm0, 1\npextrw rcx, xmm0, 2\npextrw rdx, xmm0, 3\npextrw rbp, xmm0, 4\npextrw rsi, xmm0, 5\npextrw rdi, xmm0, 6\npextrw rsp, xmm0, 7\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_C5_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4748\",\n    \"RBX\": \"0x4546\",\n    \"RCX\": \"0x4344\",\n    \"RDX\": \"0x4142\",\n    \"RBP\": \"0x5758\",\n    \"RSI\": \"0x5556\",\n    \"RDI\": \"0x5354\",\n    \"RSP\": \"0x5152\",\n    \"R8\":  \"0x4748\",\n    \"R9\":  \"0x4546\",\n    \"R10\": \"0x4344\",\n    \"R11\": \"0x4142\",\n    \"R12\": \"0x5758\",\n    \"R13\": \"0x5556\",\n    \"R14\": \"0x5354\",\n    \"R15\": \"0x5152\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmovapd xmm0, [rdx + 8 * 0]\n\nmov rax, -1\nmov rbx, -1\nmov rcx, -1\nmov rdx, -1\nmov rbp, -1\nmov rsi, -1\nmov rdi, -1\nmov rsp, -1\n\npextrw rax, xmm0, 0\npextrw rbx, xmm0, 1\npextrw rcx, xmm0, 2\npextrw rdx, xmm0, 3\npextrw rbp, xmm0, 4\npextrw rsi, xmm0, 5\npextrw rdi, xmm0, 6\npextrw rsp, xmm0, 7\npextrw r8, xmm0, 8\npextrw r9, xmm0, 9\npextrw r10, xmm0, 10\npextrw r11, xmm0, 11\npextrw r12, xmm0, 12\npextrw r13, xmm0, 13\npextrw r14, xmm0, 14\npextrw r15, xmm0, 15\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_C6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0x6162636465666768\"],\n    \"XMM1\":  [\"0x5152535455565758\", \"0x6162636465666768\"],\n    \"XMM2\":  [\"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM3\":  [\"0x5152535455565758\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 2]\n\nshufpd xmm0, xmm4, 0\nshufpd xmm1, xmm4, 1\nshufpd xmm2, xmm4, 2\nshufpd xmm3, xmm4, 3\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_D0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xbff0000000000000\", \"0x4008000000000000\"],\n    \"XMM1\": [\"0xbff0000000000000\", \"0x4008000000000000\"],\n    \"XMM2\": [\"0x3ff0000000000000\", \"0x4008000000000000\"],\n    \"XMM3\": [\"0x3ff0000000000000\", \"0x4008000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3FF0000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x3FF0000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 4], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x3FF0000000000000\nmov [rdx + 8 * 6], rax\nmov rax, 0x3FF0000000000000\nmov [rdx + 8 * 7], rax\n\nmovapd xmm0, [rdx]\naddsubpd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\naddsubpd xmm1, xmm2\n\nmovapd xmm2, [rdx + 8 * 4]\naddsubpd xmm2, [rdx + 8 * 6]\n\nmovapd xmm3, [rdx + 8 * 4]\nmovapd xmm4, [rdx + 8 * 6]\naddsubpd xmm3, xmm4\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_D1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\"],\n    \"XMM1\": [\"0x0041004300450047\", \"0x0051005300550057\"],\n    \"XMM2\": [\"0x0\", \"0x0\"],\n    \"XMM3\": [\"0x0\", \"0x0\"],\n    \"XMM4\": [\"0x0\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1\nmov [rdx + 8 * 2], rax\nmov rax, 0x0\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8\nmov [rdx + 8 * 4], rax\nmov rax, 0x0\nmov [rdx + 8 * 5], rax\n\n; Will Zero\nmov rax, 0x10\nmov [rdx + 8 * 6], rax\nmov rax, 0x0\nmov [rdx + 8 * 7], rax\n\n; Will Zero\nmov rax, 0x20\nmov [rdx + 8 * 8], rax\nmov rax, 0x0\nmov [rdx + 8 * 9], rax\n\n; Will Zero\nmov rax, 0x40\nmov [rdx + 8 * 10], rax\nmov rax, 0x0\nmov [rdx + 8 * 11], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\n\npsrlw xmm0, [rdx + 8 * 2]\npsrlw xmm1, [rdx + 8 * 4]\npsrlw xmm2, [rdx + 8 * 6]\npsrlw xmm3, [rdx + 8 * 8]\npsrlw xmm4, [rdx + 8 * 10]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_D2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\"],\n    \"XMM1\": [\"0x0041424300454647\", \"0x0051525300555657\"],\n    \"XMM2\": [\"0x0000414200004546\", \"0x0000515200005556\"],\n    \"XMM3\": [\"0x0\", \"0x0\"],\n    \"XMM4\": [\"0x0\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1\nmov [rdx + 8 * 2], rax\nmov rax, 0x0\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8\nmov [rdx + 8 * 4], rax\nmov rax, 0x0\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x10\nmov [rdx + 8 * 6], rax\nmov rax, 0x0\nmov [rdx + 8 * 7], rax\n\n; Will Zero\nmov rax, 0x20\nmov [rdx + 8 * 8], rax\nmov rax, 0x0\nmov [rdx + 8 * 9], rax\n\n; Will Zero\nmov rax, 0x40\nmov [rdx + 8 * 10], rax\nmov rax, 0x0\nmov [rdx + 8 * 11], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\n\npsrld xmm0, [rdx + 8 * 2]\npsrld xmm1, [rdx + 8 * 4]\npsrld xmm2, [rdx + 8 * 6]\npsrld xmm3, [rdx + 8 * 8]\npsrld xmm4, [rdx + 8 * 10]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_D3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\"],\n    \"XMM1\": [\"0x0041424344454647\", \"0x0051525354555657\"],\n    \"XMM2\": [\"0x0000414243444546\", \"0x0000515253545556\"],\n    \"XMM3\": [\"0x0000000041424344\", \"0x0000000051525354\"],\n    \"XMM4\": [\"0x0\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1\nmov [rdx + 8 * 2], rax\nmov rax, 0x0\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8\nmov [rdx + 8 * 4], rax\nmov rax, 0x0\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x10\nmov [rdx + 8 * 6], rax\nmov rax, 0x0\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x20\nmov [rdx + 8 * 8], rax\nmov rax, 0x0\nmov [rdx + 8 * 9], rax\n\n; Will Zero\nmov rax, 0x40\nmov [rdx + 8 * 10], rax\nmov rax, 0x0\nmov [rdx + 8 * 11], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\n\npsrlq xmm0, [rdx + 8 * 2]\npsrlq xmm1, [rdx + 8 * 4]\npsrlq xmm2, [rdx + 8 * 6]\npsrlq xmm3, [rdx + 8 * 8]\npsrlq xmm4, [rdx + 8 * 10]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_D4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"],\n    \"XMM1\":  [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npaddq xmm0, xmm2\npaddq xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_D5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xFD44929037E4ED40\", \"0x68847E10A3A4D940\"],\n    \"XMM1\":  [\"0xFD44929037E4ED40\", \"0x68847E10A3A4D940\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npmullw xmm0, xmm2\npmullw xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_D6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0x0\"],\n    \"XMM1\":  [\"0x4142434445464748\", \"0x0\"],\n    \"XMM2\":  [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmovapd xmm2, [rdx + 8 * 0]\n\n; movq xmm0, xmm2\ndb 0x66, 0x0f, 0xd6, 11_010_000b\nmovq [rdx + 8 * 2], xmm2\nmovapd xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_D7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0\",\n    \"RBX\": \"0x0\",\n    \"RCX\": \"0xFFFF\",\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x0\", \"0x0\"],\n    \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\n\npmovmskb eax, xmm0\npmovmskb ebx, xmm1\npmovmskb ecx, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_D8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x2020202000000000\", \"0x0\"],\n    \"XMM1\":  [\"0x2020202000000000\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162636445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 0]\nmovaps xmm2, [rdx + 8 * 2]\n\npsubusb xmm0, xmm2\npsubusb xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_D9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x2020202000000000\", \"0x0\"],\n    \"XMM1\":  [\"0x2020202000000000\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162636445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 0]\nmovaps xmm2, [rdx + 8 * 2]\n\npsubusw xmm0, xmm2\npsubusw xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_DA.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npminub xmm0, xmm2\npminub xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_DB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x1010101010101010\", \"0x0\"],\n    \"XMM1\": [\"0x1010101010101010\", \"0x0\"],\n    \"XMM2\": [\"0x1010101010101010\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 0], rax\nmov rax, 0x0\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1010101010101010\nmov [rdx + 8 * 2], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npand xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npand xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_DC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"],\n    \"XMM1\":  [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 0]\nmovaps xmm2, [rdx + 8 * 2]\n\npaddusb xmm0, xmm2\npaddusb xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_DD.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"],\n    \"XMM1\":  [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 0]\nmovaps xmm2, [rdx + 8 * 2]\n\npaddusw xmm0, xmm2\npaddusw xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_DE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\":  [\"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npmaxub xmm0, xmm2\npmaxub xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_DF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM1\": [\"0x0\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM2\": [\"0x1010101010101010\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 0], rax\nmov rax, 0x0\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1010101010101010\nmov [rdx + 8 * 2], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npandn xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npandn xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_E0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x2179b0697d5378c4\", \"0x3b8e6eae8c165248\"],\n    \"XMM1\":  [\"0x1ed68638699d35ca\", \"0x5e2e7560ab7b5262\"],\n    \"XMM2\":  [\"0x165c42291f28194c\", \"0x0923643c32130145\"],\n    \"XMM3\":  [\"0x2179b0697d5378c4\", \"0x3b8e6eae8c165248\"],\n    \"XMM4\":  [\"0x1ed68638699d35ca\", \"0x5e2e7560ab7b5262\"],\n    \"XMM5\":  [\"0x165c42291f28194c\", \"0x0923643c32130145\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x2bb883523d4f3197\nmov [rdx + 8 * 0], rax\nmov rax, 0x1246c77764260189\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x163add80bc57bef1\nmov [rdx + 8 * 2], rax\nmov rax, 0x64d615e5b405a306\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x11f4881d94eb39fc\nmov [rdx + 8 * 4], rax\nmov rax, 0xa9162248f2d0a23a\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 6], rax\nmov rax, 0x0\nmov [rdx + 8 * 7], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\nmovapd xmm5, [rdx + 8 * 0]\n\nmovapd xmm6, [rdx + 8 * 2]\nmovapd xmm7, [rdx + 8 * 4]\nmovapd xmm8, [rdx + 8 * 6]\n\npavgb xmm0, xmm6\npavgb xmm1, xmm7\npavgb xmm2, xmm8\n\npavgb xmm3, [rdx + 8 * 2]\npavgb xmm4, [rdx + 8 * 4]\npavgb xmm5, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_E1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM1\":  [\"0x0041004300450047\", \"0x0071007300750077\"],\n    \"XMM2\":  [\"0x0\", \"0x0\"],\n    \"XMM3\":  [\"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM4\":  [\"0x0041004300450047\", \"0x0071007300750077\"],\n    \"XMM5\":  [\"0x0\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x10\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\nmovapd xmm5, [rdx + 8 * 0]\n\nmovapd xmm6, [rdx + 8 * 2]\nmovapd xmm7, [rdx + 8 * 4]\nmovapd xmm8, [rdx + 8 * 6]\n\npsraw xmm0, xmm6\npsraw xmm1, xmm7\npsraw xmm2, xmm8\n\npsraw xmm3, [rdx + 8 * 2]\npsraw xmm4, [rdx + 8 * 4]\npsraw xmm5, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_E2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM1\":  [\"0x0000414200004546\", \"0x0000717200007576\"],\n    \"XMM2\":  [\"0x0\", \"0x0\"],\n    \"XMM3\":  [\"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM4\":  [\"0x0000414200004546\", \"0x0000717200007576\"],\n    \"XMM5\":  [\"0x0\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x10\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x20\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\nmovapd xmm5, [rdx + 8 * 0]\n\nmovapd xmm6, [rdx + 8 * 2]\nmovapd xmm7, [rdx + 8 * 4]\nmovapd xmm8, [rdx + 8 * 6]\n\npsrad xmm0, xmm6\npsrad xmm1, xmm7\npsrad xmm2, xmm8\n\npsrad xmm3, [rdx + 8 * 2]\npsrad xmm4, [rdx + 8 * 4]\npsrad xmm5, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_E3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x20f9b0697cd37844\", \"0x3b8e6eae8c165248\"],\n    \"XMM1\":  [\"0x1ed685b8691d35ca\", \"0x5dae74e0ab7b51e2\"],\n    \"XMM2\":  [\"0x15dc41a91ea818cc\", \"0x092363bc321300c5\"],\n    \"XMM3\":  [\"0x20f9b0697cd37844\", \"0x3b8e6eae8c165248\"],\n    \"XMM4\":  [\"0x1ed685b8691d35ca\", \"0x5dae74e0ab7b51e2\"],\n    \"XMM5\":  [\"0x15dc41a91ea818cc\", \"0x092363bc321300c5\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x2bb883523d4f3197\nmov [rdx + 8 * 0], rax\nmov rax, 0x1246c77764260189\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x163add80bc57bef1\nmov [rdx + 8 * 2], rax\nmov rax, 0x64d615e5b405a306\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x11f4881d94eb39fc\nmov [rdx + 8 * 4], rax\nmov rax, 0xa9162248f2d0a23a\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 6], rax\nmov rax, 0x0\nmov [rdx + 8 * 7], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\nmovapd xmm5, [rdx + 8 * 0]\n\nmovapd xmm6, [rdx + 8 * 2]\nmovapd xmm7, [rdx + 8 * 4]\nmovapd xmm8, [rdx + 8 * 6]\n\npavgw xmm0, xmm6\npavgw xmm1, xmm7\npavgw xmm2, xmm8\n\npavgw xmm3, [rdx + 8 * 2]\npavgw xmm4, [rdx + 8 * 4]\npavgw xmm5, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_E4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x18D21A1D1B701CCA\", \"0x24092594272728C2\"],\n    \"XMM1\":  [\"0x18D21A1D1B701CCA\", \"0x24092594272728C2\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npmulhuw xmm0, xmm2\npmulhuw xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_E5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x18D21A1D1B70CF3C\", \"0x24092594272728C2\"],\n    \"XMM1\":  [\"0x18D21A1D1B70CF3C\", \"0x24092594272728C2\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445468748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npmulhw xmm0, xmm2\npmulhw xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_E6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000200000001\", \"0x0\"],\n    \"XMM1\":  [\"0xFFFFFFFEFFFFFFFF\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xbff0000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0xc000000000000000\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmovapd xmm0, [rdx + 8 * 4]\nmovapd xmm1, [rdx + 8 * 4]\n\nmovapd xmm2, [rdx + 8 * 0]\n\ncvttpd2dq xmm0, xmm2\ncvttpd2dq xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_E6_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000004500000053\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x0000000d00000029\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x0000001500000005\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x0000000500000009\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x000000420000001d\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x0000005b00000013\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x0000003200000028\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x0000001700000020\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x000000180000005a\", \"0x0000000000000000\"],\n    \"XMM9\": [\"0x0000005b00000062\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x000000630000005a\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x0000004a00000040\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x0000001900000023\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x0000005a00000005\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0000003400000021\", \"0x0000000000000000\"],\n    \"XMM15\": [\"0x0000000a0000003a\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\nmovapd xmm0, [rdx + 16 * 0]\nmovapd xmm1, [rdx + 16 * 1]\nmovapd xmm2, [rdx + 16 * 2]\nmovapd xmm3, [rdx + 16 * 3]\nmovapd xmm4, [rdx + 16 * 4]\nmovapd xmm5, [rdx + 16 * 5]\nmovapd xmm6, [rdx + 16 * 6]\nmovapd xmm7, [rdx + 16 * 7]\nmovapd xmm8, [rdx + 16 * 8]\nmovapd xmm9, [rdx + 16 * 9]\nmovapd xmm10, [rdx + 16 * 10]\nmovapd xmm11, [rdx + 16 * 11]\nmovapd xmm12, [rdx + 16 * 12]\nmovapd xmm13, [rdx + 16 * 13]\nmovapd xmm14, [rdx + 16 * 14]\nmovapd xmm15, [rdx + 16 * 15]\n\n\ncvttpd2dq xmm0, [rdx + 16 * 0]\ncvttpd2dq xmm1, [rdx + 16 * 1]\ncvttpd2dq xmm2, [rdx + 16 * 2]\ncvttpd2dq xmm3, [rdx + 16 * 3]\ncvttpd2dq xmm4, [rdx + 16 * 4]\ncvttpd2dq xmm5, [rdx + 16 * 5]\ncvttpd2dq xmm6, [rdx + 16 * 6]\ncvttpd2dq xmm7, [rdx + 16 * 7]\ncvttpd2dq xmm8, [rdx + 16 * 8]\ncvttpd2dq xmm9, [rdx + 16 * 9]\ncvttpd2dq xmm10, [rdx + 16 * 10]\ncvttpd2dq xmm11, [rdx + 16 * 11]\ncvttpd2dq xmm12, [rdx + 16 * 12]\ncvttpd2dq xmm13, [rdx + 16 * 13]\ncvttpd2dq xmm14, [rdx + 16 * 14]\ncvttpd2dq xmm15, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 512bytes of random data\n.data:\ndq 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_E7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 2]\nmovntdq [rdx + 8 * 4], xmm1\nmovaps xmm0, [rdx + 8 * 4]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_E8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xE0E0E0E0E0E0E0E0\", \"0xE0E0E0E0E0E0E0E0\"],\n    \"XMM1\":  [\"0xE0E0E0E0E0E0E0E0\", \"0xE0E0E0E0E0E0E0E0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 0]\nmovaps xmm2, [rdx + 8 * 2]\n\npsubsb xmm0, xmm2\npsubsb xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_E9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xDFE0DFE0DFE0DFE0\", \"0xDFE0DFE0DFE0DFE0\"],\n    \"XMM1\":  [\"0xDFE0DFE0DFE0DFE0\", \"0xDFE0DFE0DFE0DFE0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 0]\nmovaps xmm2, [rdx + 8 * 2]\n\npsubsw xmm0, xmm2\npsubsw xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_EA.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npminsw xmm0, xmm2\npminsw xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_EB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x1111111111111111\", \"0x2222222222222222\"],\n    \"XMM1\": [\"0x1111111111111111\", \"0x2222222222222222\"],\n    \"XMM2\": [\"0x0101010101010101\", \"0x0202020202020202\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x1010101010101010\nmov [rdx + 8 * 0], rax\nmov rax, 0x2020202020202020\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0101010101010101\nmov [rdx + 8 * 2], rax\nmov rax, 0x0202020202020202\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npor xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npor xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_EC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x7F7F7F7F7F7F7F7F\", \"0x7F7F7F7F7F7F7F7F\"],\n    \"XMM1\":  [\"0x7F7F7F7F7F7F7F7F\", \"0x7F7F7F7F7F7F7F7F\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npaddsb xmm0, xmm2\npaddsb xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_ED.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\"],\n    \"XMM1\":  [\"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npaddsw xmm0, xmm2\npaddsw xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_EE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\":  [\"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npmaxsw xmm0, xmm2\npmaxsw xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_EF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x2424242424242424\", \"0x2424242424242424\"],\n    \"XMM1\": [\"0x2424242424242424\", \"0x2424242424242424\"],\n    \"XMM2\": [\"0x1818181818181818\", \"0x1818181818181818\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3C3C3C3C3C3C3C3C\nmov [rdx + 8 * 0], rax\nmov rax, 0x3C3C3C3C3C3C3C3C\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1818181818181818\nmov [rdx + 8 * 2], rax\nmov rax, 0x1818181818181818\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npxor xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npxor xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_F1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x828486888A8C8E90\", \"0xE2E4E6E8EAECEEF0\"],\n    \"XMM1\":  [\"0x4200440046004800\", \"0x7200740076007800\"],\n    \"XMM2\":  [\"0x0\", \"0x0\"],\n    \"XMM3\":  [\"0x0\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x10\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x20\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 0]\nmovaps xmm2, [rdx + 8 * 0]\nmovaps xmm3, [rdx + 8 * 0]\n\npsllw xmm0, [rdx + 8 * 2]\npsllw xmm1, [rdx + 8 * 4]\npsllw xmm2, [rdx + 8 * 6]\npsllw xmm3, [rdx + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_F2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM1\":  [\"0x4344000047480000\", \"0x7374000077780000\"],\n    \"XMM2\":  [\"0x0\", \"0x0\"],\n    \"XMM3\":  [\"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM4\":  [\"0x4344000047480000\", \"0x7374000077780000\"],\n    \"XMM5\":  [\"0x0\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x10\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x20\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\nmovapd xmm5, [rdx + 8 * 0]\n\nmovapd xmm6, [rdx + 8 * 2]\nmovapd xmm7, [rdx + 8 * 4]\nmovapd xmm8, [rdx + 8 * 6]\n\npslld xmm0, xmm6\npslld xmm1, xmm7\npslld xmm2, xmm8\n\npslld xmm3, [rdx + 8 * 2]\npslld xmm4, [rdx + 8 * 4]\npslld xmm5, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_F3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM1\":  [\"0x4546474800000000\", \"0x7576777800000000\"],\n    \"XMM2\":  [\"0x0\", \"0x0\"],\n    \"XMM3\":  [\"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM4\":  [\"0x4546474800000000\", \"0x7576777800000000\"],\n    \"XMM5\":  [\"0x0\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x20\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x40\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\nmovapd xmm5, [rdx + 8 * 0]\n\nmovapd xmm6, [rdx + 8 * 2]\nmovapd xmm7, [rdx + 8 * 4]\nmovapd xmm8, [rdx + 8 * 6]\n\npsllq xmm0, xmm6\npsllq xmm1, xmm7\npsllq xmm2, xmm8\n\npsllq xmm3, [rdx + 8 * 2]\npsllq xmm4, [rdx + 8 * 4]\npsllq xmm5, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_F4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x000000000003FFFC\", \"0x000000000000FFFE\"],\n    \"XMM1\": [\"0x000000000003FFFC\", \"0x000000000000FFFE\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x414243440000FFFF\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535400007FFF\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636400000004\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737400000002\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npmuludq xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npmuludq xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_F5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x32F08FD4383B2524\", \"0x499DE6944FEA7CE4\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov eax, dword [rdx + 8 * 0]\nmov rbx, qword [rdx + 8 * 1]\n\nmovaps xmm0, [rdx + 8 * 0]\n\npmaddwd xmm0, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_F6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x100\", \"0x100\"],\n    \"XMM1\": [\"0xC5\", \"0x88\"],\n    \"XMM2\": [\"0x66\", \"0x5A\"],\n    \"XMM3\": [\"0x6B\", \"0x68\"],\n    \"XMM4\": [\"0x60\", \"0x68\"],\n    \"XMM5\": [\"0x65\", \"0x65\"],\n    \"XMM6\": [\"0x33\", \"0x57\"],\n    \"XMM7\": [\"0x38\", \"0x5C\"],\n    \"XMM8\": [\"0x3B\", \"0x6D\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 2]\n\npsadbw xmm0, [rdx + 8 * 0]\n\nlea rdx, [rel .data]\n\nmovaps xmm1, [rdx + 16 * 0]\nmovaps xmm2, [rdx + 16 * 1]\nmovaps xmm3, [rdx + 16 * 2]\nmovaps xmm4, [rdx + 16 * 3]\nmovaps xmm5, [rdx + 16 * 4]\nmovaps xmm6, [rdx + 16 * 5]\nmovaps xmm7, [rdx + 16 * 6]\nmovaps xmm8, [rdx + 16 * 7]\n\npsadbw xmm1, [rdx + 16 * 8]\npsadbw xmm2, [rdx + 16 * 9]\npsadbw xmm3, [rdx + 16 * 10]\npsadbw xmm4, [rdx + 16 * 11]\npsadbw xmm5, [rdx + 16 * 12]\npsadbw xmm6, [rdx + 16 * 13]\npsadbw xmm7, [rdx + 16 * 14]\npsadbw xmm8, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb '\\xe0\\xfc\\x2b\\xa1\\x06\\x4f\\x6c\\xa7\\x0f\\x06\\x6a\\x1e\\x7f\\x76\\x80\\x9b'\ndb '\\xe0\\x56\\xed\\xaa\\xf3\\xc3\\x68\\x68\\xde\\xe6\\xe6\\x94\\xe2\\xe9\\xfc\\xf0'\ndb '\\x6e\\x35\\xa8\\x54\\xd7\\xab\\x8b\\x6c\\x77\\x5f\\x92\\xca\\x25\\xa6\\x7e\\x27'\ndb '\\xc7\\xcd\\x73\\xec\\x95\\xd6\\x6f\\x6a\\xbb\\xae\\xf2\\xbb\\x27\\xb9\\xa1\\xdd'\ndb '\\x73\\x4d\\xd1\\xc7\\xd5\\x2c\\x31\\x88\\xfe\\xe7\\xdb\\xfd\\x1e\\x1e\\x09\\x7f'\ndb '\\x14\\xfa\\x4e\\x95\\xef\\xe6\\x9a\\xf2\\xa0\\x42\\x62\\x9a\\xa4\\xa8\\x73\\x82'\ndb '\\x0e\\x0f\\x16\\x82\\x38\\x07\\x12\\x32\\x07\\x35\\x92\\xc1\\x63\\x07\\x78\\xb3'\ndb '\\xcb\\x46\\x19\\x57\\x2b\\x37\\x2a\\x46\\x1f\\x04\\x0e\\x79\\x3d\\xcd\\x8d\\xa3'\ndb '\\x2b\\xf3\\x86\\x2f\\xab\\xba\\x57\\x30\\x2e\\xd6\\x2c\\xf0\\x46\\x4f\\x3f\\xef'\ndb '\\xef\\xd1\\xbb\\x85\\x34\\x4b\\x3c\\xde\\x9e\\x48\\xa3\\xb9\\x8d\\x71\\xe3\\x9d'\ndb '\\x09\\x72\\xfb\\xde\\x8a\\x32\\x50\\x9d\\x69\\x98\\xf1\\xf6\\x52\\xeb\\xf7\\xee'\ndb '\\xd6\\x99\\xc2\\xff\\x30\\x1c\\x02\\xce\\x70\\x05\\xb2\\xf1\\x56\\x9c\\x0e\\xa6'\ndb '\\x18\\x62\\xc4\\xe2\\x86\\x38\\x76\\x30\\x2f\\xa1\\xe4\\xa7\\x0e\\x5d\\x53\\xeb'\ndb '\\x14\\x45\\xe0\\xb7\\xe1\\xe8\\x02\\x68\\x1a\\xfe\\x8e\\xc1\\x8f\\xf2\\xeb\\x46'\ndb '\\x7f\\x5d\\x6a\\x23\\x46\\x97\\x2e\\x03\\x98\\x12\\x32\\x8f\\x54\\x76\\x59\\xac'\ndb '\\xc8\\x76\\x5f\\xc8\\x71\\x0c\\xd3\\xb6\\xc5\\x19\\xea\\xab\\xa6\\x2c\\x1d\\x88'\n\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_F7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x5152535455565758\",\n    \"RCX\": \"0x41424344FFFFFFFF\",\n    \"RSP\": \"0x51525354FFFFFFFF\",\n    \"RSI\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RDI\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x8080808080808080\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8080808000000000\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, 0\nmov [rdx + 8 * 6], rax\nmov [rdx + 8 * 7], rax\n\nmov rax, -1\nmov [rdx + 8 * 8], rax\nmov [rdx + 8 * 9], rax\n\nmov [rdx + 8 * 10], rax\nmov [rdx + 8 * 11], rax\n\nmov [rdx + 8 * 12], rax\nmov [rdx + 8 * 13], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 2]\nmovaps xmm2, [rdx + 8 * 4]\nmovaps xmm3, [rdx + 8 * 6]\n\nlea rdi, [rdx + 8 * 8]\nmaskmovdqu xmm0, xmm1\n\nlea rdi, [rdx + 8 * 10]\nmaskmovdqu xmm0, xmm2\n\nlea rdi, [rdx + 8 * 12]\nmaskmovdqu xmm0, xmm3\n\nmov rax, qword [rdx + 8 * 8]\nmov rbx, qword [rdx + 8 * 9]\n\nmov rcx, qword [rdx + 8 * 10]\nmov rsp, qword [rdx + 8 * 11]\n\nmov rsi, qword [rdx + 8 * 12]\nmov rdi, qword [rdx + 8 * 13]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_F8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x2020202020202020\", \"0x2020202020202020\"],\n    \"XMM1\": [\"0x2020202020202020\", \"0x2020202020202020\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npsubb xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npsubb xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_F9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x2020202020202020\", \"0x2020202020202020\"],\n    \"XMM1\": [\"0x2020202020202020\", \"0x2020202020202020\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npsubw xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npsubw xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_FA.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x2020202020202020\", \"0x2020202020202020\"],\n    \"XMM1\": [\"0x2020202020202020\", \"0x2020202020202020\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npsubd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npsubd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_FB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x2020202020202020\", \"0x2020202020202020\"],\n    \"XMM1\": [\"0x2020202020202020\", \"0x2020202020202020\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npsubq xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\npsubq xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_FC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"],\n    \"XMM1\":  [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npaddb xmm0, xmm2\npaddb xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_FD.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"],\n    \"XMM1\":  [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npaddw xmm0, xmm2\npaddw xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/OpSize/66_FE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"],\n    \"XMM1\":  [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\npaddd xmm0, xmm2\npaddd xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Pause.asm",
    "content": "%ifdef CONFIG\n{\n}\n%endif\n\n; Set rcx to an absurd number just incase something terrible occurs since pause = `rep nop`\nmov rcx, -1\n\n; Just ensure execution.\npause\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0xD9\",\n    \"RCX\": \"0x67E9\",\n    \"RDX\": \"0x656667F9\",\n    \"RBP\": \"0x6162636465666809\",\n    \"RDI\": \"0x81\",\n    \"RSP\": \"0x8081\",\n    \"R8\":  \"0x80808081\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x4142441546174719\",\n    \"R11\": \"0x5152535455565829\",\n    \"R12\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0xD1\nadd byte  [r15 + 8 * 0 + 0], al\nadd word  [r15 + 8 * 0 + 2], ax\nadd dword [r15 + 8 * 0 + 4], eax\nadd qword [r15 + 8 * 1 + 0], rax\n\nmov rbx, 0x71\nmov rcx, 0x81\nmov rdx, 0x91\nmov rbp, 0xA1\n\nadd bl,  byte  [r15 + 8 * 2]\nadd cx,  word  [r15 + 8 * 2]\nadd edx, dword [r15 + 8 * 2]\nadd rbp, qword [r15 + 8 * 2]\n\nmov rax, 0x01\nadd al, 0x80\nmov rdi, rax\n\nmov rax, 0x01\nadd ax, 0x8080\nmov rsp, rax\n\nmov rax, 0x01\nadd eax, 0x80808080\nmov r8, rax\n\nmov rax, 0x01\nadd rax, -1\nmov r9, rax\n\nmov r10, [r15 + 8 * 0]\nmov r11, [r15 + 8 * 1]\nmov r12, [r15 + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_01_Atomic16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4242434446464848\",\n    \"RBX\": \"0x4242434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4242434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 1 byte offset within 4byte boundary\nlock add word [r15 + 8 * 0 + 1], ax\n\n; Test 3 byte offset across 4byte boundary\nlock add word [r15 + 8 * 0 + 3], ax\n\n; Test 7 byte offset across 8byte boundary\nlock add word [r15 + 8 * 0 + 7], ax\n\n; Test 15 byte offset across 16byte boundary\nlock add word [r15 + 8 * 0 + 15], ax\n\n; Test 63 byte offset across cacheline boundary\nlock add word [r15 + 8 * 0 + 63], ax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_01_Atomic32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4242434446464748\",\n    \"RBX\": \"0x4242434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4242434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 3 byte offset across 4byte boundary\nlock add dword [r15 + 8 * 0 + 3], eax\n\n; Test 7 byte offset across 8byte boundary\nlock add dword [r15 + 8 * 0 + 7], eax\n\n; Test 15 byte offset across 16byte boundary\nlock add dword [r15 + 8 * 0 + 15], eax\n\n; Test 63 byte offset across cacheline boundary\nlock add dword [r15 + 8 * 0 + 63], eax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_01_Atomic64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4242434445464748\",\n    \"RBX\": \"0x4242434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4242434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 7 byte offset across 8byte boundary\nlock add qword [r15 + 8 * 0 + 7], rax\n\n; Test 15 byte offset across 16byte boundary\nlock add qword [r15 + 8 * 0 + 15], rax\n\n; Test 63 byte offset across cacheline boundary\nlock add qword [r15 + 8 * 0 + 63], rax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_08.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x79\",\n    \"RCX\": \"0x67E9\",\n    \"RDX\": \"0x656667F9\",\n    \"RBP\": \"0x61626364656667E9\",\n    \"RDI\": \"0x81\",\n    \"RSP\": \"0x8081\",\n    \"R8\":  \"0x80808081\",\n    \"R9\":  \"0xFFFFFFFFFFFFFFFF\",\n    \"R10\": \"0x414243D545D747D9\",\n    \"R11\": \"0x51525354555657D9\",\n    \"R12\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0xD1\nor byte  [r15 + 8 * 0 + 0], al\nor word  [r15 + 8 * 0 + 2], ax\nor dword [r15 + 8 * 0 + 4], eax\nor qword [r15 + 8 * 1 + 0], rax\n\nmov rbx, 0x71\nmov rcx, 0x81\nmov rdx, 0x91\nmov rbp, 0xA1\n\nor bl,  byte  [r15 + 8 * 2]\nor cx,  word  [r15 + 8 * 2]\nor edx, dword [r15 + 8 * 2]\nor rbp, qword [r15 + 8 * 2]\n\nmov rax, 0x01\nor al, 0x80\nmov rdi, rax\n\nmov rax, 0x01\nor ax, 0x8080\nmov rsp, rax\n\nmov rax, 0x01\nor eax, 0x80808080\nmov r8, rax\n\nmov rax, 0x01\nor rax, -1\nmov r9, rax\n\nmov r10, [r15 + 8 * 0]\nmov r11, [r15 + 8 * 1]\nmov r12, [r15 + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_09_Atomic16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x4142434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4142434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 1 byte offset within 4byte boundary\nlock or word [r15 + 8 * 0 + 1], ax\n\n; Test 3 byte offset across 4byte boundary\nlock or word [r15 + 8 * 0 + 3], ax\n\n; Test 7 byte offset across 8byte boundary\nlock or word [r15 + 8 * 0 + 7], ax\n\n; Test 15 byte offset across 16byte boundary\nlock or word [r15 + 8 * 0 + 15], ax\n\n; Test 63 byte offset across cacheline boundary\nlock or word [r15 + 8 * 0 + 63], ax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_09_Atomic32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x4142434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4142434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 3 byte offset across 4byte boundary\nlock or dword [r15 + 8 * 0 + 3], eax\n\n; Test 7 byte offset across 8byte boundary\nlock or dword [r15 + 8 * 0 + 7], eax\n\n; Test 15 byte offset across 16byte boundary\nlock or dword [r15 + 8 * 0 + 15], eax\n\n; Test 63 byte offset across cacheline boundary\nlock or dword [r15 + 8 * 0 + 63], eax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_09_Atomic64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x4142434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4142434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 7 byte offset across 8byte boundary\nlock or qword [r15 + 8 * 0 + 7], rax\n\n; Test 15 byte offset across 16byte boundary\nlock or qword [r15 + 8 * 0 + 15], rax\n\n; Test 63 byte offset across cacheline boundary\nlock or qword [r15 + 8 * 0 + 63], rax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_10.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0xD9\",\n    \"RCX\": \"0x67E9\",\n    \"RDX\": \"0x656667F9\",\n    \"RBP\": \"0x6162636465666809\",\n    \"RDI\": \"0x81\",\n    \"RSP\": \"0x8081\",\n    \"R8\":  \"0x80808081\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x4142441546174719\",\n    \"R11\": \"0x5152535455565829\",\n    \"R12\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0xD1\nclc\nadc byte  [r15 + 8 * 0 + 0], al\nclc\nadc word  [r15 + 8 * 0 + 2], ax\nclc\nadc dword [r15 + 8 * 0 + 4], eax\nclc\nadc qword [r15 + 8 * 1 + 0], rax\n\nmov rbx, 0x71\nmov rcx, 0x81\nmov rdx, 0x91\nmov rbp, 0xA1\n\nclc\nadc bl,  byte  [r15 + 8 * 2]\nclc\nadc cx,  word  [r15 + 8 * 2]\nclc\nadc edx, dword [r15 + 8 * 2]\nclc\nadc rbp, qword [r15 + 8 * 2]\n\nmov rax, 0x01\nclc\nadc al, 0x80\nmov rdi, rax\n\nmov rax, 0x01\nclc\nadc ax, 0x8080\nmov rsp, rax\n\nmov rax, 0x01\nclc\nadc eax, 0x80808080\nmov r8, rax\n\nmov rax, 0x01\nclc\nadc rax, -1\nmov r9, rax\n\nmov r10, [r15 + 8 * 0]\nmov r11, [r15 + 8 * 1]\nmov r12, [r15 + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_10_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0xDA\",\n    \"RCX\": \"0x67EA\",\n    \"RDX\": \"0x656667FA\",\n    \"RBP\": \"0x616263646566680A\",\n    \"RDI\": \"0x82\",\n    \"RSP\": \"0x8082\",\n    \"R8\":  \"0x80808082\",\n    \"R9\":  \"0x1\",\n    \"R10\": \"0x414244164618471A\",\n    \"R11\": \"0x515253545556582A\",\n    \"R12\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0xD1\nstc\nadc byte  [r15 + 8 * 0 + 0], al\nstc\nadc word  [r15 + 8 * 0 + 2], ax\nstc\nadc dword [r15 + 8 * 0 + 4], eax\nstc\nadc qword [r15 + 8 * 1 + 0], rax\n\nmov rbx, 0x71\nmov rcx, 0x81\nmov rdx, 0x91\nmov rbp, 0xA1\n\nstc\nadc bl,  byte  [r15 + 8 * 2]\nstc\nadc cx,  word  [r15 + 8 * 2]\nstc\nadc edx, dword [r15 + 8 * 2]\nstc\nadc rbp, qword [r15 + 8 * 2]\n\nmov rax, 0x01\nstc\nadc al, 0x80\nmov rdi, rax\n\nmov rax, 0x01\nstc\nadc ax, 0x8080\nmov rsp, rax\n\nmov rax, 0x01\nstc\nadc eax, 0x80808080\nmov r8, rax\n\nmov rax, 0x01\nstc\nadc rax, -1\nmov r9, rax\n\nmov r10, [r15 + 8 * 0]\nmov r11, [r15 + 8 * 1]\nmov r12, [r15 + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_10_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0xD9\",\n    \"RCX\": \"0x67E9\",\n    \"RDX\": \"0x656667F9\",\n    \"RBP\": \"0x6162636465666809\",\n    \"RDI\": \"0x81\",\n    \"RSP\": \"0x8081\",\n    \"R8\":  \"0x80808081\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x4142441546174719\",\n    \"R11\": \"0x5152535455565829\",\n    \"R12\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0xD1\nclc\nlock adc byte  [r15 + 8 * 0 + 0], al\nclc\nlock adc word  [r15 + 8 * 0 + 2], ax\nclc\nlock adc dword [r15 + 8 * 0 + 4], eax\nclc\nlock adc qword [r15 + 8 * 1 + 0], rax\n\nmov rbx, 0x71\nmov rcx, 0x81\nmov rdx, 0x91\nmov rbp, 0xA1\n\nclc\nadc bl,  byte  [r15 + 8 * 2]\nclc\nadc cx,  word  [r15 + 8 * 2]\nclc\nadc edx, dword [r15 + 8 * 2]\nclc\nadc rbp, qword [r15 + 8 * 2]\n\nmov rax, 0x01\nclc\nadc al, 0x80\nmov rdi, rax\n\nmov rax, 0x01\nclc\nadc ax, 0x8080\nmov rsp, rax\n\nmov rax, 0x01\nclc\nadc eax, 0x80808080\nmov r8, rax\n\nmov rax, 0x01\nclc\nadc rax, -1\nmov r9, rax\n\nmov r10, [r15 + 8 * 0]\nmov r11, [r15 + 8 * 1]\nmov r12, [r15 + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_10_4.asm",
    "content": "\n%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0xDA\",\n    \"RCX\": \"0x67EA\",\n    \"RDX\": \"0x656667FA\",\n    \"RBP\": \"0x616263646566680A\",\n    \"RDI\": \"0x82\",\n    \"RSP\": \"0x8082\",\n    \"R8\":  \"0x80808082\",\n    \"R9\":  \"0x1\",\n    \"R10\": \"0x414244164618471A\",\n    \"R11\": \"0x515253545556582A\",\n    \"R12\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0xD1\nstc\nlock adc byte  [r15 + 8 * 0 + 0], al\nstc\nlock adc word  [r15 + 8 * 0 + 2], ax\nstc\nlock adc dword [r15 + 8 * 0 + 4], eax\nstc\nlock adc qword [r15 + 8 * 1 + 0], rax\n\nmov rbx, 0x71\nmov rcx, 0x81\nmov rdx, 0x91\nmov rbp, 0xA1\n\nstc\nadc bl,  byte  [r15 + 8 * 2]\nstc\nadc cx,  word  [r15 + 8 * 2]\nstc\nadc edx, dword [r15 + 8 * 2]\nstc\nadc rbp, qword [r15 + 8 * 2]\n\nmov rax, 0x01\nstc\nadc al, 0x80\nmov rdi, rax\n\nmov rax, 0x01\nstc\nadc ax, 0x8080\nmov rsp, rax\n\nmov rax, 0x01\nstc\nadc eax, 0x80808080\nmov r8, rax\n\nmov rax, 0x01\nstc\nadc rax, -1\nmov r9, rax\n\nmov r10, [r15 + 8 * 0]\nmov r11, [r15 + 8 * 1]\nmov r12, [r15 + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_18.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x09\",\n    \"RCX\": \"0x9919\",\n    \"RDX\": \"0x9A999929\",\n    \"RBP\": \"0x9E9D9C9B9A999939\",\n    \"RDI\": \"0x81\",\n    \"RSP\": \"0x7F81\",\n    \"R8\":  \"0x7F7F7F81\",\n    \"R9\":  \"0x02\",\n    \"R10\": \"0x4142427344754777\",\n    \"R11\": \"0x5152535455565687\",\n    \"R12\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0xD1\nclc\nsbb byte  [r15 + 8 * 0 + 0], al\nclc\nsbb word  [r15 + 8 * 0 + 2], ax\nclc\nsbb dword [r15 + 8 * 0 + 4], eax\nclc\nsbb qword [r15 + 8 * 1 + 0], rax\n\nmov rbx, 0x71\nmov rcx, 0x81\nmov rdx, 0x91\nmov rbp, 0xA1\n\nclc\nsbb bl,  byte  [r15 + 8 * 2]\nclc\nsbb cx,  word  [r15 + 8 * 2]\nclc\nsbb edx, dword [r15 + 8 * 2]\nclc\nsbb rbp, qword [r15 + 8 * 2]\n\nmov rax, 0x01\nclc\nsbb al, 0x80\nmov rdi, rax\n\nmov rax, 0x01\nclc\nsbb ax, 0x8080\nmov rsp, rax\n\nmov rax, 0x01\nclc\nsbb eax, 0x80808080\nmov r8, rax\n\nmov rax, 0x01\nclc\nsbb rax, -1\nmov r9, rax\n\nmov r10, [r15 + 8 * 0]\nmov r11, [r15 + 8 * 1]\nmov r12, [r15 + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_18_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x08\",\n    \"RCX\": \"0x9918\",\n    \"RDX\": \"0x9A999928\",\n    \"RBP\": \"0x9E9D9C9B9A999938\",\n    \"RDI\": \"0x80\",\n    \"RSP\": \"0x7F80\",\n    \"R8\":  \"0x7F7F7F80\",\n    \"R9\":  \"0x01\",\n    \"R10\": \"0x4142427244744776\",\n    \"R11\": \"0x5152535455565686\",\n    \"R12\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0xD1\nstc\nsbb byte  [r15 + 8 * 0 + 0], al\nstc\nsbb word  [r15 + 8 * 0 + 2], ax\nstc\nsbb dword [r15 + 8 * 0 + 4], eax\nstc\nsbb qword [r15 + 8 * 1 + 0], rax\n\nmov rbx, 0x71\nmov rcx, 0x81\nmov rdx, 0x91\nmov rbp, 0xA1\n\nstc\nsbb bl,  byte  [r15 + 8 * 2]\nstc\nsbb cx,  word  [r15 + 8 * 2]\nstc\nsbb edx, dword [r15 + 8 * 2]\nstc\nsbb rbp, qword [r15 + 8 * 2]\n\nmov rax, 0x01\nstc\nsbb al, 0x80\nmov rdi, rax\n\nmov rax, 0x01\nstc\nsbb ax, 0x8080\nmov rsp, rax\n\nmov rax, 0x01\nstc\nsbb eax, 0x80808080\nmov r8, rax\n\nmov rax, 0x01\nstc\nsbb rax, -1\nmov r9, rax\n\nmov r10, [r15 + 8 * 0]\nmov r11, [r15 + 8 * 1]\nmov r12, [r15 + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_18_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x09\",\n    \"RCX\": \"0x9919\",\n    \"RDX\": \"0x9A999929\",\n    \"RBP\": \"0x9E9D9C9B9A999939\",\n    \"RDI\": \"0x81\",\n    \"RSP\": \"0x7F81\",\n    \"R8\":  \"0x7F7F7F81\",\n    \"R9\":  \"0x02\",\n    \"R10\": \"0x4142427344754777\",\n    \"R11\": \"0x5152535455565687\",\n    \"R12\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0xD1\nclc\nlock sbb byte  [r15 + 8 * 0 + 0], al\nclc\nlock sbb word  [r15 + 8 * 0 + 2], ax\nclc\nlock sbb dword [r15 + 8 * 0 + 4], eax\nclc\nlock sbb qword [r15 + 8 * 1 + 0], rax\n\nmov rbx, 0x71\nmov rcx, 0x81\nmov rdx, 0x91\nmov rbp, 0xA1\n\nclc\nsbb bl,  byte  [r15 + 8 * 2]\nclc\nsbb cx,  word  [r15 + 8 * 2]\nclc\nsbb edx, dword [r15 + 8 * 2]\nclc\nsbb rbp, qword [r15 + 8 * 2]\n\nmov rax, 0x01\nclc\nsbb al, 0x80\nmov rdi, rax\n\nmov rax, 0x01\nclc\nsbb ax, 0x8080\nmov rsp, rax\n\nmov rax, 0x01\nclc\nsbb eax, 0x80808080\nmov r8, rax\n\nmov rax, 0x01\nclc\nsbb rax, -1\nmov r9, rax\n\nmov r10, [r15 + 8 * 0]\nmov r11, [r15 + 8 * 1]\nmov r12, [r15 + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_18_4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x08\",\n    \"RCX\": \"0x9918\",\n    \"RDX\": \"0x9A999928\",\n    \"RBP\": \"0x9E9D9C9B9A999938\",\n    \"RDI\": \"0x80\",\n    \"RSP\": \"0x7F80\",\n    \"R8\":  \"0x7F7F7F80\",\n    \"R9\":  \"0x01\",\n    \"R10\": \"0x4142427244744776\",\n    \"R11\": \"0x5152535455565686\",\n    \"R12\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0xD1\nstc\nlock sbb byte  [r15 + 8 * 0 + 0], al\nstc\nlock sbb word  [r15 + 8 * 0 + 2], ax\nstc\nlock sbb dword [r15 + 8 * 0 + 4], eax\nstc\nlock sbb qword [r15 + 8 * 1 + 0], rax\n\nmov rbx, 0x71\nmov rcx, 0x81\nmov rdx, 0x91\nmov rbp, 0xA1\n\nstc\nsbb bl,  byte  [r15 + 8 * 2]\nstc\nsbb cx,  word  [r15 + 8 * 2]\nstc\nsbb edx, dword [r15 + 8 * 2]\nstc\nsbb rbp, qword [r15 + 8 * 2]\n\nmov rax, 0x01\nstc\nsbb al, 0x80\nmov rdi, rax\n\nmov rax, 0x01\nstc\nsbb ax, 0x8080\nmov rsp, rax\n\nmov rax, 0x01\nstc\nsbb eax, 0x80808080\nmov r8, rax\n\nmov rax, 0x01\nstc\nsbb rax, -1\nmov r9, rax\n\nmov r10, [r15 + 8 * 0]\nmov r11, [r15 + 8 * 1]\nmov r12, [r15 + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_20.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x60\",\n    \"RCX\": \"0x00\",\n    \"RDX\": \"0x00\",\n    \"RBP\": \"0x20\",\n    \"RDI\": \"0x00\",\n    \"RSP\": \"0x00\",\n    \"R8\":  \"0x00\",\n    \"R9\":  \"0x01\",\n    \"R10\": \"0x0000004000404740\",\n    \"R11\": \"0x50\",\n    \"R12\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0xD1\nand byte  [r15 + 8 * 0 + 0], al\nand word  [r15 + 8 * 0 + 2], ax\nand dword [r15 + 8 * 0 + 4], eax\nand qword [r15 + 8 * 1 + 0], rax\n\nmov rbx, 0x71\nmov rcx, 0x81\nmov rdx, 0x91\nmov rbp, 0xA1\n\nand bl,  byte  [r15 + 8 * 2]\nand cx,  word  [r15 + 8 * 2]\nand edx, dword [r15 + 8 * 2]\nand rbp, qword [r15 + 8 * 2]\n\nmov rax, 0x01\nand al, 0x80\nmov rdi, rax\n\nmov rax, 0x01\nand ax, 0x8080\nmov rsp, rax\n\nmov rax, 0x01\nand eax, 0x80808080\nmov r8, rax\n\nmov rax, 0x01\nand rax, -1\nmov r9, rax\n\nmov r10, [r15 + 8 * 0]\nmov r11, [r15 + 8 * 1]\nmov r12, [r15 + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_23_Atomic16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0142430001000148\",\n    \"RBX\": \"0x0142434445464700\",\n    \"RCX\": \"0x4142434445464700\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x0142434445464748\",\n    \"RDI\": \"0x4142434445464700\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 1 byte offset within 4byte boundary\nlock and word [r15 + 8 * 0 + 1], ax\n\n; Test 3 byte offset across 4byte boundary\nlock and word [r15 + 8 * 0 + 3], ax\n\n; Test 7 byte offset across 8byte boundary\nlock and word [r15 + 8 * 0 + 7], ax\n\n; Test 15 byte offset across 16byte boundary\nlock and word [r15 + 8 * 0 + 15], ax\n\n; Test 63 byte offset across cacheline boundary\nlock and word [r15 + 8 * 0 + 63], ax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_23_Atomic32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0100000001464748\",\n    \"RBX\": \"0x0142434445000000\",\n    \"RCX\": \"0x4142434445000000\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x0142434445464748\",\n    \"RDI\": \"0x4142434445000000\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 3 byte offset across 4byte boundary\nlock and dword [r15 + 8 * 0 + 3], eax\n\n; Test 7 byte offset across 8byte boundary\nlock and dword [r15 + 8 * 0 + 7], eax\n\n; Test 15 byte offset across 16byte boundary\nlock and dword [r15 + 8 * 0 + 15], eax\n\n; Test 63 byte offset across cacheline boundary\nlock and dword [r15 + 8 * 0 + 63], eax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_23_Atomic64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0142434445464748\",\n    \"RBX\": \"0x0100000000000000\",\n    \"RCX\": \"0x4100000000000000\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x0142434445464748\",\n    \"RDI\": \"0x4100000000000000\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 7 byte offset across 8byte boundary\nlock and qword [r15 + 8 * 0 + 7], rax\n\n; Test 15 byte offset across 16byte boundary\nlock and qword [r15 + 8 * 0 + 15], rax\n\n; Test 63 byte offset across cacheline boundary\nlock and qword [r15 + 8 * 0 + 63], rax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_28.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x09\",\n    \"RCX\": \"0x9919\",\n    \"RDX\": \"0x9A999929\",\n    \"RBP\": \"0x9E9D9C9B9A999939\",\n    \"RDI\": \"0x81\",\n    \"RSP\": \"0x7F81\",\n    \"R8\":  \"0x7F7F7F81\",\n    \"R9\":  \"0x02\",\n    \"R10\": \"0x4142427344754777\",\n    \"R11\": \"0x5152535455565687\",\n    \"R12\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0xD1\nsub byte  [r15 + 8 * 0 + 0], al\nsub word  [r15 + 8 * 0 + 2], ax\nsub dword [r15 + 8 * 0 + 4], eax\nsub qword [r15 + 8 * 1 + 0], rax\n\nmov rbx, 0x71\nmov rcx, 0x81\nmov rdx, 0x91\nmov rbp, 0xA1\n\nsub bl,  byte  [r15 + 8 * 2]\nsub cx,  word  [r15 + 8 * 2]\nsub edx, dword [r15 + 8 * 2]\nsub rbp, qword [r15 + 8 * 2]\n\nmov rax, 0x01\nsub al, 0x80\nmov rdi, rax\n\nmov rax, 0x01\nsub ax, 0x8080\nmov rsp, rax\n\nmov rax, 0x01\nsub eax, 0x80808080\nmov r8, rax\n\nmov rax, 0x01\nsub rax, -1\nmov r9, rax\n\nmov r10, [r15 + 8 * 0]\nmov r11, [r15 + 8 * 1]\nmov r12, [r15 + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_29_Atomic16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4042434444464648\",\n    \"RBX\": \"0x4042434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4042434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 1 byte offset within 4byte boundary\nlock sub word [r15 + 8 * 0 + 1], ax\n\n; Test 3 byte offset across 4byte boundary\nlock sub word [r15 + 8 * 0 + 3], ax\n\n; Test 7 byte offset across 8byte boundary\nlock sub word [r15 + 8 * 0 + 7], ax\n\n; Test 15 byte offset across 16byte boundary\nlock sub word [r15 + 8 * 0 + 15], ax\n\n; Test 63 byte offset across cacheline boundary\nlock sub word [r15 + 8 * 0 + 63], ax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_29_Atomic32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4042434444464748\",\n    \"RBX\": \"0x4042434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4042434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 3 byte offset across 4byte boundary\nlock sub dword [r15 + 8 * 0 + 3], eax\n\n; Test 7 byte offset across 8byte boundary\nlock sub dword [r15 + 8 * 0 + 7], eax\n\n; Test 15 byte offset across 16byte boundary\nlock sub dword [r15 + 8 * 0 + 15], eax\n\n; Test 63 byte offset across cacheline boundary\nlock sub dword [r15 + 8 * 0 + 63], eax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_29_Atomic64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4042434445464748\",\n    \"RBX\": \"0x4042434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4042434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 7 byte offset across 8byte boundary\nlock sub qword [r15 + 8 * 0 + 7], rax\n\n; Test 15 byte offset across 16byte boundary\nlock sub qword [r15 + 8 * 0 + 15], rax\n\n; Test 63 byte offset across cacheline boundary\nlock sub qword [r15 + 8 * 0 + 63], rax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_30.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x19\",\n    \"RCX\": \"0x67E9\",\n    \"RDX\": \"0x656667F9\",\n    \"RBP\": \"0x61626364656667C9\",\n    \"RDI\": \"0x81\",\n    \"RSP\": \"0x8081\",\n    \"R8\":  \"0x80808081\",\n    \"R9\":  \"0xFFFFFFFFFFFFFFFE\",\n    \"R10\": \"0x4142439545974799\",\n    \"R11\": \"0x5152535455565789\",\n    \"R12\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0xD1\nxor byte  [r15 + 8 * 0 + 0], al\nxor word  [r15 + 8 * 0 + 2], ax\nxor dword [r15 + 8 * 0 + 4], eax\nxor qword [r15 + 8 * 1 + 0], rax\n\nmov rbx, 0x71\nmov rcx, 0x81\nmov rdx, 0x91\nmov rbp, 0xA1\n\nxor bl,  byte  [r15 + 8 * 2]\nxor cx,  word  [r15 + 8 * 2]\nxor edx, dword [r15 + 8 * 2]\nxor rbp, qword [r15 + 8 * 2]\n\nmov rax, 0x01\nxor al, 0x80\nmov rdi, rax\n\nmov rax, 0x01\nxor ax, 0x8080\nmov rsp, rax\n\nmov rax, 0x01\nxor eax, 0x80808080\nmov r8, rax\n\nmov rax, 0x01\nxor rax, -1\nmov r9, rax\n\nmov r10, [r15 + 8 * 0]\nmov r11, [r15 + 8 * 1]\nmov r12, [r15 + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_31_Atomic16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4042434444464648\",\n    \"RBX\": \"0x4042434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4042434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 1 byte offset within 4byte boundary\nlock xor word [r15 + 8 * 0 + 1], ax\n\n; Test 3 byte offset across 4byte boundary\nlock xor word [r15 + 8 * 0 + 3], ax\n\n; Test 7 byte offset across 8byte boundary\nlock xor word [r15 + 8 * 0 + 7], ax\n\n; Test 15 byte offset across 16byte boundary\nlock xor word [r15 + 8 * 0 + 15], ax\n\n; Test 63 byte offset across cacheline boundary\nlock xor word [r15 + 8 * 0 + 63], ax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_31_Atomic32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4042434444464748\",\n    \"RBX\": \"0x4042434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4042434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 3 byte offset across 4byte boundary\nlock xor dword [r15 + 8 * 0 + 3], eax\n\n; Test 7 byte offset across 8byte boundary\nlock xor dword [r15 + 8 * 0 + 7], eax\n\n; Test 15 byte offset across 16byte boundary\nlock xor dword [r15 + 8 * 0 + 15], eax\n\n; Test 63 byte offset across cacheline boundary\nlock xor dword [r15 + 8 * 0 + 63], eax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_31_Atomic64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4042434445464748\",\n    \"RBX\": \"0x4042434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4042434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 7 byte offset across 8byte boundary\nlock xor qword [r15 + 8 * 0 + 7], rax\n\n; Test 15 byte offset across 16byte boundary\nlock xor qword [r15 + 8 * 0 + 15], rax\n\n; Test 63 byte offset across cacheline boundary\nlock xor qword [r15 + 8 * 0 + 63], rax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_38.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445468348\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x61\ncmp byte [rdx + 8 * 0 + 1], al\n; cmp = 0x47 - 0x61 = 0xE6\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\nmov rax, [rdx + 8 * 0]\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_39.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x8700\",\n    \"RBX\": \"0x8300\",\n    \"RCX\": \"0x0200\",\n    \"RSI\": \"0x0300\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 3], rax\n\nmov rax, -256\ncmp qword [rdx + 8 * 3 + 0], rax\n; cmp = 0x6162636465666768 - -256(0xFFFFFFFFFFFF00) = 0x6162636465666512\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000011\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\nmov rsi, rax\n\nmov rax, 0x61626364\ncmp qword [rdx + 8 * 2 + 0], rax\n; cmp = 0x6162636465666768- 0x61626364 = 0x6162636404040404\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000010\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\nmov rcx, rax\n\nmov rax, 0x61626364\ncmp dword [rdx + 8 * 1 + 0], eax\n; cmp = 0x55565758 - 0x61626364 = 0xF3F3F3F4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\nmov rbx, rax\n\nmov rax, 0x6162\ncmp word [rdx + 8 * 0 + 2], ax\n; cmp = 0x4546 - 0x6162 = 0xE3E4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000111\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_3A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445468348\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445466148\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x47\ncmp al, byte [rdx + 8 * 0 + 1]\n; cmp = 0x47 - 0x61 = 0xE6\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\nmov rax, [rdx + 8 * 0]\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_3B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x8700\",\n    \"RBX\": \"0x8300\",\n    \"RCX\": \"0x0200\",\n    \"RSI\": \"0x0300\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x61620000\nmov [rdx + 8 * 0], rax\nmov rax, 0x61626364\nmov [rdx + 8 * 1], rax\nmov rax, 0x61626364\nmov [rdx + 8 * 2], rax\nmov rax, -256\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x6162636465666768\ncmp rax, qword [rdx + 8 * 3 + 0]\n; cmp = 0x6162636465666768 - -256(0xFFFFFFFFFFFF00) = 0x6162636465666512\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000011\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\nmov rsi, rax\n\nmov rax, 0x6162636465666768\ncmp rax, qword [rdx + 8 * 2 + 0]\n; cmp = 0x6162636465666768 - 0x61626364 = 0x6162636404040404\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000010\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\nmov rcx, rax\n\nmov rax, 0x5152535455565758\ncmp eax, dword [rdx + 8 * 1 + 0]\n; cmp = 0x55565758 - 0x61626364 = 0xF3F3F3F4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\nmov rbx, rax\n\nmov rax, 0x0000414243444546\ncmp ax, word [rdx + 8 * 0 + 2]\n; cmp = 0x4546 - 0x6162 = 0xE3E4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000111\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_3C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445468348\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0041424344454647\ncmp al, 0x61\n; cmp = 0x47 - 0x61 = 0xE6\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\nmov rax, [rdx + 8 * 0]\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_3D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x8700\",\n    \"RBX\": \"0x8300\",\n    \"RCX\": \"0x0200\",\n    \"RSI\": \"0x0300\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x6162636465666768\ncmp rax, -256\n; cmp = 0x6162636465666768 - -256(0xFFFFFFFFFFFF00) = 0x6162636465666512\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000011\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\nmov rsi, rax\n\nmov rax, 0x6162636465666768\ncmp rax, 0x61626364\n; cmp = 0x6162636465666768- 0x61626364 = 0x6162636404040404\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000010\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\nmov rcx, rax\n\nmov rax, 0x5152535455565758\ncmp eax, 0x61626364\n; cmp = 0x55565758 - 0x61626364 = 0xF3F3F3F4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\nmov rbx, rax\n\nmov rax, 0x0000414243444546\ncmp ax, 0x6162\n; cmp = 0x4546 - 0x6162 = 0xE3E4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000111\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_50.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x2\",\n    \"RCX\": \"0x3\",\n    \"RDX\": \"0x4\",\n    \"RBP\": \"0x5\",\n    \"RSI\": \"0x6\",\n    \"RDI\": \"0x7\",\n    \"R15\": \"0x8\"\n  }\n}\n%endif\n\nmov rsp, 0xe0000080\n\nmov rax, 1\nmov rbx, 2\nmov rcx, 3\nmov rdx, 4\nmov rbp, 5\nmov rsi, 6\nmov rdi, 7\nmov r15, 8\n\npush r15 ; Sub for rsp\npush rdi\npush rsi\npush rbp\npush rdx\npush rcx\npush rbx\npush rax\n\nmov rax, 0\nmov rbx, 0\nmov rcx, 0\nmov rdx, 0\nmov rbp, 0\nmov rsi, 0\nmov rdi, 0\nmov r15, 0\n\npop rax\npop rbx\npop rcx\npop rdx\npop rbp\npop rsi\npop rdi\npop r15\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_50_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x2\",\n    \"RCX\": \"0x3\",\n    \"RDX\": \"0x4\",\n    \"RBP\": \"0x5\",\n    \"RSI\": \"0x6\",\n    \"RDI\": \"0x7\",\n    \"R15\": \"0x8\"\n  }\n}\n%endif\n\nmov rsp, 0xe0000080\n\nmov rax, 1\nmov rbx, 2\nmov rcx, 3\nmov rdx, 4\nmov rbp, 5\nmov rsi, 6\nmov rdi, 7\nmov r15, 8\n\npush r15w ; Sub for rsp\npush di\npush si\npush bp\npush dx\npush cx\npush bx\npush ax\n\nmov rax, 0\nmov rbx, 0\nmov rcx, 0\nmov rdx, 0\nmov rbp, 0\nmov rsi, 0\nmov rdi, 0\nmov r15, 0\n\npop ax\npop bx\npop cx\npop dx\npop bp\npop si\npop di\npop r15w\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_63.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFF81828384\",\n    \"RBX\": \"0x0000000071727374\"\n  }\n}\n%endif\n\nmov rax, 0x81828384\nmov rbx, 0x71727374\nmovsxd rax, eax\nmovsxd rbx, ebx\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_63_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xffffffff81828384\",\n    \"RBX\": \"0xffffffff81828384\",\n    \"RCX\": \"0x0000000081828384\",\n    \"RDX\": \"0x4142434445468384\"\n  }\n}\n%endif\n\nmov rax, 0x4142434445464748\nmov rbx, 0x4142434445464748\nmov rcx, 0x4142434445464748\nmov rdx, 0x4142434445464748\nmov rsp, 0x6666666681828384\n\n; Default: 0x48, 0x63, 0xc4\nmovsxd rax, esp\n; Default with o16 prefix: 0x66, 0x48, 0x63, 0xc4\n; operand-size override prefix\n; Nasm complains if o16 is used\n; `warning: invalid operand size prefix o16, must be o64`\ndb 0x66\nmovsxd rbx, esp\n; No-rex widening prefix\ndb 0x63, 0xcc ; movsxd ecx, esp\n; o16 prefix with no-rex widening\ndb 0x66, 0x63, 0xd4 ; movsxd dx, sp\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_68.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFBEBDBCBB\",\n    \"RBX\": \"0x51526162\",\n    \"RSP\": \"0xE0000014\"\n  }\n}\n%endif\n\nmov rsp, 0xe0000020\n\npush qword -0x41424345\npush word 0x5152\npush word 0x6162\n\nmov rdx, 0xe0000020\nmov rax, [rdx - 8]\nmov ebx, [rdx - 12]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_69.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xB800\",\n    \"RBX\": \"0xA9A8A800\",\n    \"RSI\": \"0x9D9C9B9A99989800\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0x0\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\n\nimul ax, word [r15 + 8 * 0 + 0], -256\nmov word [r15 + 8 * 3 + 0], ax\n\nimul eax, dword [r15 + 8 * 1 + 0], -256\nmov dword [r15 + 8 * 4 + 0], eax\n\nimul rax, qword [r15 + 8 * 2 + 0], -256\nmov rsi, rax\n\nmov rax, [r15 + 8 * 3]\nmov rbx, [r15 + 8 * 4]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_6A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFFFF81\",\n    \"RSP\": \"0xE0000018\"\n  }\n}\n%endif\n\nmov rsp, 0xe0000020\n\npush -127\nmov rdx, 0xe0000020\nmov rax, [rdx - 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_6A_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x000000000000FF81\",\n    \"RSP\": \"0xE0000018\"\n  }\n}\n%endif\n\nmov rsp, 0xe0000020\n\npush word 0\npush word 0\npush word 0\npush word -127\n\nmov rdx, 0xe0000020\nmov rax, [rdx - 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_6B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x5C00\",\n    \"RBX\": \"0x54D45400\",\n    \"RSI\": \"0x4ECE4DCD4CCC4C00\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0x0\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\n\nimul ax, word [r15 + 8 * 0 + 0], -128\nmov word [r15 + 8 * 3 + 0], ax\n\nimul eax, dword [r15 + 8 * 1 + 0], -128\nmov dword [r15 + 8 * 4 + 0], eax\n\nimul rax, qword [r15 + 8 * 2 + 0], -128\nmov rsi, rax\n\nmov rax, [r15 + 8 * 3]\nmov rbx, [r15 + 8 * 4]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_84.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0600\"\n  }\n}\n%endif\n\nmov rax, 0x4142434445464847\nmov rbx, 0x61\ntest al, bl\n\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_84_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\nmov dword [rdx], 0xFFFFFF00\n\nmov     r11d, dword[rdx]\ntest    r11b, r11b\njnz     notzero\n\nmov rax, 0x0\nhlt\n\nnotzero:\nmov rax, 0x1\nhlt"
  },
  {
    "path": "unittests/ASM/Primary/Primary_85.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0200\",\n    \"RBX\": \"0x0600\",\n    \"RCX\": \"0x0600\"\n  }\n}\n%endif\n\nmov rax, 0x6162636465666768\nmov rdx, 0x71727374\ntest rax, rdx\n; test = 0x6162636465666768 & 0x71727374 = 0x61626360\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- Undefined\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000110\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nmov rcx, rax\nand rcx, 0xffffffffffffefff\n\nmov rax, 0x5152535455565758\nmov rdx, 0x71727374\ntest eax, edx\n; test = 0x55565758 & 0x71727374 = 0x51525350\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- Undefined\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000110\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nmov rbx, rax\nand rbx, 0xffffffffffffefff\n\nmov rax, 0x4142434445464748\nmov rdx, 0x7172\ntest ax, dx\n; test = 0x4748 & 0x7172 = 0x4140\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- Undefined\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000010\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nand rax, 0xffffffffffffefff\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_86.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFFFF48\",\n    \"RBX\": \"0x41424344454647FF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, -1\nxchg byte [rdx + 8 * 0], al\nmov rbx, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_87.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFF4748\",\n    \"RBX\": \"0x414243444546FFFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, -1\nxchg word [rdx + 8 * 0], ax\nmov rbx, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_87_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000045464748\",\n    \"RBX\": \"0x41424344FFFFFFFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, -1\nxchg dword [rdx + 8 * 0], eax\nmov rbx, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_87_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, -1\nxchg qword [rdx + 8 * 0], rax\nmov rbx, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_87_Atomic16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0142430001000148\",\n    \"RBX\": \"0x0142434445464700\",\n    \"RCX\": \"0x4142434445464700\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x0142434445464748\",\n    \"RDI\": \"0x4142434445464700\",\n    \"R14\": \"0x0000000000004647\",\n    \"R13\": \"0x0000000000004445\",\n    \"R12\": \"0x0000000000004841\",\n    \"R11\": \"0x0000000000004841\",\n    \"R10\": \"0x0000000000004841\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\n; Test 1 byte offset within 4byte boundary\nmov rax, 1\nxchg word [r15 + 8 * 0 + 1], ax\nmov r14, rax\n\n; Test 3 byte offset across 4byte boundary\nmov rax, 1\nxchg word [r15 + 8 * 0 + 3], ax\nmov r13, rax\n\n; Test 7 byte offset across 8byte boundary\nmov rax, 1\nxchg word [r15 + 8 * 0 + 7], ax\nmov r12, rax\n\n; Test 15 byte offset across 16byte boundary\nmov rax, 1\nxchg word [r15 + 8 * 0 + 15], ax\nmov r11, rax\n\n; Test 63 byte offset across cacheline boundary\nmov rax, 1\nxchg word [r15 + 8 * 0 + 63], ax\nmov r10, rax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_87_Atomic32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0100000001464748\",\n    \"RBX\": \"0x0142434445000000\",\n    \"RCX\": \"0x4142434445000000\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x0142434445464748\",\n    \"RDI\": \"0x4142434445000000\",\n    \"R13\": \"0x0000000042434445\",\n    \"R12\": \"0x0000000046474841\",\n    \"R11\": \"0x0000000046474841\",\n    \"R10\": \"0x0000000046474841\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\n; Test 3 byte offset across 4byte boundary\nmov rax, 1\nxchg dword [r15 + 8 * 0 + 3], eax\nmov r13, rax\n\n; Test 7 byte offset across 8byte boundary\nmov rax, 1\nxchg dword [r15 + 8 * 0 + 7], eax\nmov r12, rax\n\n; Test 15 byte offset across 16byte boundary\nmov rax, 1\nxchg dword [r15 + 8 * 0 + 15], eax\nmov r11, rax\n\n; Test 63 byte offset across cacheline boundary\nmov rax, 1\nxchg dword [r15 + 8 * 0 + 63], eax\nmov r10, rax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_87_Atomic64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0142434445464748\",\n    \"RBX\": \"0x0100000000000000\",\n    \"RCX\": \"0x4100000000000000\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x0142434445464748\",\n    \"RDI\": \"0x4100000000000000\",\n    \"R13\": \"0x4243444546474841\",\n    \"R12\": \"0x4243444546474841\",\n    \"R11\": \"0x4243444546474841\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\n; Test 7 byte offset across 8byte boundary\nmov rax, 1\nxchg qword [r15 + 8 * 0 + 7], rax\nmov r13, rax\n\n; Test 15 byte offset across 16byte boundary\nmov rax, 1\nxchg qword [r15 + 8 * 0 + 15], rax\nmov r12, rax\n\n; Test 63 byte offset across cacheline boundary\nmov rax, 1\nxchg qword [r15 + 8 * 0 + 63], rax\nmov r11, rax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_8C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142\",\n    \"RBX\": \"0x4143\",\n    \"RCX\": \"0x4144\"\n  }\n}\n%endif\n; This relies on some behaviour that isn't guaranteed in 64bit mode\n\n; Technically this can result in an invalid selector which can cause faults\n; We currently don't do any selector validation to enforce this\nmov rax, 0x4142\n\nmov es, ax\n\ninc rax\nmov ss, ax\n\ninc rax\nmov ds, ax\n\n; Can't test FS/GS here\n; Behaviour is ill-defined and needs to be worked through\n\nmov rax, 0\nmov rbx, 0\nmov rcx, 0\n\nmov ax, es\nmov bx, ss\nmov cx, ds\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_8C_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142\",\n    \"RBX\": \"0x4143\",\n    \"RCX\": \"0x4144\"\n  }\n}\n%endif\n; This relies on some behaviour that isn't guaranteed in 64bit mode\n\n; Technically this can result in an invalid selector which can cause faults\n; We currently don't do any selector validation to enforce this\nmov rax, 0x4142\n\ndb 0x44 ; REX.R\nmov es, ax\n\ninc rax\n\ndb 0x44 ; REX.R\nmov ss, ax\n\ninc rax\n\ndb 0x44 ; REX.R\nmov ds, ax\n\n; Can't test FS/GS here\n; Behaviour is ill-defined and needs to be worked through\n\nmov rax, 0\nmov rbx, 0\nmov rcx, 0\n\ndb 0x44 ; REX.R\nmov ax, es\n\ndb 0x44 ; REX.R\nmov bx, ss\n\ndb 0x44 ; REX.R\nmov cx, ds\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_8D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x4142434445464748\",\n    \"R14\": \"0x929496989A9C9EA0\",\n    \"R13\": \"0x0000000045464748\",\n    \"R12\": \"0x000000009A9C9EA0\",\n    \"R11\": \"0x828486888A8C8E90\",\n    \"R10\": \"0x565B60656A6F7478\",\n    \"R9\":  \"0x41424344454647A9\",\n    \"R8\":  \"0x92949698FBFF0204\",\n    \"RSI\": \"0xFFFFFFFFFFFF0204\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov rdx, 0x5152535455565758\n\n; SIB gives us `scale * index + base + offset`\n; scale = constant {1, 2, 4, 8}\n; Index = <Reg>\n; Base = <Reg>\n; Offset = Constant {imm8, imm32}\nlea r15, [rax]\nlea r14, [rax + rdx]\n\nlea r13d, [eax]\nlea r12d, [eax + edx]\n\nlea r11, [2 * rax]\nlea r10, [4 * rax + rdx]\n\nlea r9, [rax + 0x61]\nlea r8, [rax + rdx + 0x61626364]\n\nmov rsi, -1\nlea si, [rax + rdx + 0x61626364]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_8D_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x00000000FFFFFFFF\",\n    \"RBX\": \"0x00000000FFFFFFFF\",\n    \"RCX\": \"0x414243444546FFFF\",\n    \"RDX\": \"0x414243444546FFFF\",\n    \"RDI\": \"0x0000000000000001\",\n    \"RSI\": \"0x0000000000000001\",\n    \"RBP\": \"0x0\",\n    \"RSP\": \"0x0\"\n  }\n}\n%endif\n\nmov rax, -1\nmov rbx, -1\n\nlea rax, [ebx]\n\nmov rbx, -1\nmov rcx, -1\n\nlea ebx, [ecx]\n\nmov rcx, 0x4142434445464748\nmov rdx, -1\n\nlea cx, [edx]\n\nmov rdx, 0x4142434445464748\nmov rdi, -1\n\nlea dx, [rdi]\n\nmov rdi, 0x4142434445464748\nmov rsi, 0xFFFFFFFF00000000\nmov rbp, 1\n\nlea rdi, [esi + ebp]\n\nmov rsi, 0x4142434445464748\nmov rbp, 0xFFFFFFFF00000000\nmov rsp, 1\n\nlea esi, [rbp + rsp]\n\nmov rbp, 0x4142434445464748\nmov rsp, 0xFFFFFFFF00000000\nmov r9,  0x0000000200000000\n\nlea ebp, [esp + r9d]\n\nmov rsp, 0x4142434445464748\nmov r9,  0xFFFFFFFF00000000\nmov r10, 0x0000000200000000\n\nlea rsp, [r10d + r9d]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_90.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x42424242\",\n    \"RBX\": \"0x42424242\",\n    \"RCX\": \"0x00000000FFFFFFFF\",\n    \"RDX\": \"0x42424242\",\n    \"RBP\": \"0x00000000FFFFFFFF\",\n    \"RSI\": \"0x42424242\",\n    \"RDI\": \"0x00000000FFFFFFFF\",\n    \"RSP\": \"0x42424242\",\n    \"R8\":  \"0x00000000FFFFFFFF\",\n    \"R9\":  \"0x42424242\",\n    \"R10\": \"0x00000000FFFFFFFF\",\n    \"R11\": \"0x42424242\",\n    \"R12\": \"0x00000000FFFFFFFF\",\n    \"R13\": \"0x42424242\",\n    \"R14\": \"0x00000000FFFFFFFF\",\n    \"R15\": \"0x42424242\"\n  }\n}\n%endif\n\n%macro swap32 2\nmov %1, -1\nmov eax, 0x42424242\nxchg %1, eax\n\nmov dword [r15 + 16 * %2 + 0], eax\nmov dword [r15 + 16 * %2 + 8], %1\n\n%endmacro\n\nmov r15, 0xe0000000\nmov rax, 0\n\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\nmov [r15 + 8 * 10], rax\nmov [r15 + 8 * 11], rax\nmov [r15 + 8 * 12], rax\nmov [r15 + 8 * 13], rax\nmov [r15 + 8 * 14], rax\nmov [r15 + 8 * 15], rax\n\nswap32 eax, 0\nswap32 ebx, 1\nswap32 ecx, 2\nswap32 edx, 3\nswap32 ebp, 4\nswap32 esi, 5\nswap32 edi, 6\nswap32 esp, 7\nswap32 r8d, 8\n\nmov rax, [r15 + 16 * 0 + 0]\nmov rbx, [r15 + 16 * 0 + 8]\nmov rcx, [r15 + 16 * 1 + 0]\nmov rdx, [r15 + 16 * 1 + 8]\nmov rbp, [r15 + 16 * 2 + 0]\nmov rsi, [r15 + 16 * 2 + 8]\nmov rdi, [r15 + 16 * 3 + 0]\nmov rsp, [r15 + 16 * 3 + 8]\nmov r8,  [r15 + 16 * 4 + 0]\nmov r9,  [r15 + 16 * 4 + 8]\nmov r10, [r15 + 16 * 5 + 0]\nmov r11, [r15 + 16 * 5 + 8]\nmov r12, [r15 + 16 * 6 + 0]\nmov r13, [r15 + 16 * 6 + 8]\nmov r14, [r15 + 16 * 7 + 0]\nmov r15, [r15 + 16 * 7 + 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_90_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x00000000FFFFFFFF\",\n    \"RBX\": \"0x42424242\",\n    \"RCX\": \"0x00000000FFFFFFFF\",\n    \"RDX\": \"0x42424242\",\n    \"RBP\": \"0x00000000FFFFFFFF\",\n    \"RSI\": \"0x42424242\",\n    \"RDI\": \"0x00000000FFFFFFFF\",\n    \"RSP\": \"0x42424242\",\n    \"R8\":  \"0x00000000FFFFFFFF\",\n    \"R9\":  \"0x42424242\",\n    \"R10\": \"0x00000000FFFFFFFF\",\n    \"R11\": \"0x42424242\",\n    \"R12\": \"0x00000000FFFFFFFF\",\n    \"R13\": \"0x42424242\",\n    \"R14\": \"0x00000000FFFFFFFF\",\n    \"R15\": \"0x42424242\"\n  }\n}\n%endif\n\n%macro swap32 2\nmov %1, -1\nmov eax, 0x42424242\nxchg %1, eax\n\nmov dword [r15 + 16 * %2 + 0], eax\nmov dword [r15 + 16 * %2 + 8], %1\n\n%endmacro\n\nmov r15, 0xe0000000\nmov rax, 0\n\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\nmov [r15 + 8 * 10], rax\nmov [r15 + 8 * 11], rax\nmov [r15 + 8 * 12], rax\nmov [r15 + 8 * 13], rax\nmov [r15 + 8 * 14], rax\nmov [r15 + 8 * 15], rax\n\nswap32 r9d, 0\nswap32 r10d, 1\nswap32 r11d, 2\nswap32 r12d, 3\nswap32 r13d, 4\nswap32 r14d, 5\nswap32 r14d, 6\nswap32 esp, 7\n\nmov rax, [r15 + 16 * 0 + 0]\nmov rbx, [r15 + 16 * 0 + 8]\nmov rcx, [r15 + 16 * 1 + 0]\nmov rdx, [r15 + 16 * 1 + 8]\nmov rbp, [r15 + 16 * 2 + 0]\nmov rsi, [r15 + 16 * 2 + 8]\nmov rdi, [r15 + 16 * 3 + 0]\nmov rsp, [r15 + 16 * 3 + 8]\nmov r8,  [r15 + 16 * 4 + 0]\nmov r9,  [r15 + 16 * 4 + 8]\nmov r10, [r15 + 16 * 5 + 0]\nmov r11, [r15 + 16 * 5 + 8]\nmov r12, [r15 + 16 * 6 + 0]\nmov r13, [r15 + 16 * 6 + 8]\nmov r14, [r15 + 16 * 7 + 0]\nmov r15, [r15 + 16 * 7 + 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_90_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4242424242424242\",\n    \"RBX\": \"0x4242424242424242\",\n    \"RCX\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RDX\": \"0x4242424242424242\",\n    \"RBP\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RSI\": \"0x4242424242424242\",\n    \"RDI\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RSP\": \"0x4242424242424242\",\n    \"R8\":  \"0xFFFFFFFFFFFFFFFF\",\n    \"R9\":  \"0x4242424242424242\",\n    \"R10\": \"0xFFFFFFFFFFFFFFFF\",\n    \"R11\": \"0x4242424242424242\",\n    \"R12\": \"0xFFFFFFFFFFFFFFFF\",\n    \"R13\": \"0x4242424242424242\",\n    \"R14\": \"0xFFFFFFFFFFFFFFFF\",\n    \"R15\": \"0x4242424242424242\"\n  }\n}\n%endif\n\n%macro swap64 2\nmov %1, -1\nmov rax, 0x4242424242424242\nxchg %1, rax\n\nmov qword [r15 + 16 * %2 + 0], rax\nmov qword [r15 + 16 * %2 + 8], %1\n\n%endmacro\n\nmov r15, 0xe0000000\nmov rax, 0\n\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\nmov [r15 + 8 * 10], rax\nmov [r15 + 8 * 11], rax\nmov [r15 + 8 * 12], rax\nmov [r15 + 8 * 13], rax\nmov [r15 + 8 * 14], rax\nmov [r15 + 8 * 15], rax\n\nswap64 rax, 0\nswap64 rbx, 1\nswap64 rcx, 2\nswap64 rdx, 3\nswap64 rbp, 4\nswap64 rsi, 5\nswap64 rdi, 6\nswap64 rsp, 7\nswap64 r8, 8\n\nmov rax, [r15 + 16 * 0 + 0]\nmov rbx, [r15 + 16 * 0 + 8]\nmov rcx, [r15 + 16 * 1 + 0]\nmov rdx, [r15 + 16 * 1 + 8]\nmov rbp, [r15 + 16 * 2 + 0]\nmov rsi, [r15 + 16 * 2 + 8]\nmov rdi, [r15 + 16 * 3 + 0]\nmov rsp, [r15 + 16 * 3 + 8]\nmov r8,  [r15 + 16 * 4 + 0]\nmov r9,  [r15 + 16 * 4 + 8]\nmov r10, [r15 + 16 * 5 + 0]\nmov r11, [r15 + 16 * 5 + 8]\nmov r12, [r15 + 16 * 6 + 0]\nmov r13, [r15 + 16 * 6 + 8]\nmov r14, [r15 + 16 * 7 + 0]\nmov r15, [r15 + 16 * 7 + 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_90_4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RBX\": \"0x4242424242424242\",\n    \"RCX\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RDX\": \"0x4242424242424242\",\n    \"RBP\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RSI\": \"0x4242424242424242\",\n    \"RDI\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RSP\": \"0x4242424242424242\",\n    \"R8\":  \"0xFFFFFFFFFFFFFFFF\",\n    \"R9\":  \"0x4242424242424242\",\n    \"R10\": \"0xFFFFFFFFFFFFFFFF\",\n    \"R11\": \"0x4242424242424242\",\n    \"R12\": \"0xFFFFFFFFFFFFFFFF\",\n    \"R13\": \"0x4242424242424242\",\n    \"R14\": \"0xFFFFFFFFFFFFFFFF\",\n    \"R15\": \"0x4242424242424242\"\n  }\n}\n%endif\n\n%macro swap64 2\nmov %1, -1\nmov rax, 0x4242424242424242\nxchg %1, rax\n\nmov qword [r15 + 16 * %2 + 0], rax\nmov qword [r15 + 16 * %2 + 8], %1\n\n%endmacro\n\nmov r15, 0xe0000000\nmov rax, 0\n\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\nmov [r15 + 8 * 10], rax\nmov [r15 + 8 * 11], rax\nmov [r15 + 8 * 12], rax\nmov [r15 + 8 * 13], rax\nmov [r15 + 8 * 14], rax\nmov [r15 + 8 * 15], rax\n\nswap64 r9, 0\nswap64 r10, 1\nswap64 r11, 2\nswap64 r12, 3\nswap64 r13, 4\nswap64 r14, 5\nswap64 r14, 6\nswap64 rsp, 7\n\nmov rax, [r15 + 16 * 0 + 0]\nmov rbx, [r15 + 16 * 0 + 8]\nmov rcx, [r15 + 16 * 1 + 0]\nmov rdx, [r15 + 16 * 1 + 8]\nmov rbp, [r15 + 16 * 2 + 0]\nmov rsi, [r15 + 16 * 2 + 8]\nmov rdi, [r15 + 16 * 3 + 0]\nmov rsp, [r15 + 16 * 3 + 8]\nmov r8,  [r15 + 16 * 4 + 0]\nmov r9,  [r15 + 16 * 4 + 8]\nmov r10, [r15 + 16 * 5 + 0]\nmov r11, [r15 + 16 * 5 + 8]\nmov r12, [r15 + 16 * 6 + 0]\nmov r13, [r15 + 16 * 6 + 8]\nmov r14, [r15 + 16 * 7 + 0]\nmov r15, [r15 + 16 * 7 + 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_98.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFFFFF0\"\n  }\n}\n%endif\n\nmov al, 0xF0\ncbw\ncwde\ncdqe\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_98_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R10\": \"0xFFFFFFFF80000001\",\n    \"R11\": \"0x00000000FFFF8001\",\n    \"R12\": \"0x414243444546FF81\",\n    \"R13\": \"0x0000000000000001\",\n    \"R14\": \"0x0000000000000001\",\n    \"R15\": \"0x4142434445460001\"\n  }\n}\n%endif\n\n; Positive 8bit\nmov rax, 0x4142434445464701\ncbw\nmov r15, rax\n\n; Positive 16bit\nmov rax, 0x4142434445460001\ncwde\nmov r14, rax\n\n; Positive 32bit\nmov rax, 0x4142434400000001\ncdqe\nmov r13, rax\n\n; Negative 8bit\nmov rax, 0x4142434445464781\ncbw\nmov r12, rax\n\n; Negative 16bit\nmov rax, 0x4142434445468001\ncwde\nmov r11, rax\n\n; Negative 32bit\nmov rax, 0x4142434480000001\ncdqe\nmov r10, rax\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_99.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFFFFF0\",\n    \"RDX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov rax, 0\nmov rdx, 0\n\nmov ax, 0xFFF0\ncwd\n\nshl edx, 16\nor eax, edx\ncdq\n\nshl rdx, 32\nor rax, rdx\ncqo\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_99_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBP\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RSI\": \"0xFFFFFFFFFFFFFFFF\",\n\n    \"RDI\": \"0xFFFFFFFF\",\n    \"RSP\": \"0xFFFFFFFF\",\n\n    \"R8\": \"0xFFFF\",\n    \"R9\": \"0xFFFF\",\n\n    \"R10\": \"0x01\",\n    \"R11\": \"0x0\",\n\n    \"R12\": \"0x01\",\n    \"R13\": \"0x0\",\n\n    \"R14\": \"0x01\",\n    \"R15\": \"0xFFFFFFFFFFFF0000\"\n  }\n}\n%endif\n\n; Positive 16bit\nmov rax, 1\nmov rdx, -1\ncwd\n\nmov r14, rax\nmov r15, rdx\n\n; Positive 32bit\n\nmov rax, 1\nmov rdx, -1\ncdq\n\nmov r12, rax\nmov r13, rdx\n\n; Positive 64bit\n\nmov rax, 1\nmov rdx, -1\ncqo\n\nmov r10, rax\nmov r11, rdx\n\n; Negative 16bit\nmov rax, 0xFFFF\nmov rdx, 0\ncwd\n\nmov r8, rax\nmov r9, rdx\n\n; Negative 32bit\nmov rax, 0xFFFFFFFF\nmov rdx, 0\ncdq\n\nmov rdi, rax\nmov rsp, rdx\n\n; Negative 64bit\nmov rax, -1\nmov rdx, 0\ncqo\n\nmov rbp, rax\nmov rsi, rdx\n\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_9B.asm",
    "content": "%ifdef CONFIG\n{\n}\n%endif\n\n; Just to ensure this executes\nfwait\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_9C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x202\",\n    \"RBX\": \"0x202\"\n  }\n}\n%endif\n\nmov rsp, 0xe0000010\n\n; Setup to default state\nmov rax, 0\npush rax\npopfq\n\n; These pushes will end up being the default rflags initialization value\npushfq\n\n; nasm doesn't encode 16bit pushf\n; put the prefix before the instruction manually\ndb 0x66\npushfq\n\nmov rax, 0x0\nmov rbx, 0x0\n\nmov ax, word [rsp]\nmov rbx, qword [rsp + 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_9D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x202\",\n    \"RBX\": \"0x202\"\n  }\n}\n%endif\n\nmov rax, 0x0\nmov rbx, 0x0\nmov rsp, 0xe0000010\n\n; Setup to default state\nmov rax, 0\npush rax\npopfq\n\n; These pushes will end up being the default rflags initialization value\npushfq\n\ncmp rax, 1\npopfq\npushfq\n\nmov rax, qword [rsp]\n\n; These pushes will end up being the default rflags initialization value\ndb 0x66\npushfq\n\ncmp rax, 1\ndb 0x66\npopfq\ndb 0x66\npushfq\n\nmov bx, word [rsp]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_9E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFFD7FF\"\n  }\n}\n%endif\n\n; Set EFLAGS to known value with sahf\nmov rax, -1\nsahf\n\n; Now load back\nmov rax, -1\nlahf\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00010000\n; 5:  0 - 00000000\n; 6: ZF - 01000000\n; 7: SF - 10000000\n; ================\n;         11010111\n; OF: LAHF doesn't load - 0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RDX\": \"0x41\",\n    \"RAX\": \"0x42\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000008\nmov rax, 0x41\nmov [rdx], rax\n\nmov rdx, 0xe0000000\nmov rax, 0x42\nmov [rdx], rax\n\nmov rax, -1\n; mov rax, [0xe0000008]\ndb 0x48\ndb 0xA1\ndq 0x00000000e0000008\nmov rdx, rax\n\nmov rax, -1\n; mov eax, [0xe0000000]\ndb 0x67\ndb 0xA1\ndd 0xe0000000\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41\",\n    \"RDX\": \"0x42\"\n  }\n}\n%endif\n\nmov rax, 0x41\n; mov [0xe0000008], rax\ndb 0x48\ndb 0xA3\ndq 0x00000000e0000008\n\nmov rax, 0x42\n; mov [0xe0000000], eax\ndb 0x67\ndb 0xA3\ndd 0xe0000000\n\nmov rdx, 0xe0000008\nmov rax, [rdx]\n\nmov rdx, 0xe0000000\nmov edx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmovsb ; rdi <- rsi\nmovsb\nmovsb\nmovsb\n\nmovsb\nmovsb\nmovsb\nmovsb\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A4_REP.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A4_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A4_REPNE_Down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE000000F\",\n    \"RSI\": \"0xDFFFFFFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2 + 7]\nlea rsi, [rdx + 8 * 0 + 7]\n\nstd\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A4_REPNE_many.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrepne movsb ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A4_REP_Down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE000000F\",\n    \"RSI\": \"0xDFFFFFFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2 + 7]\nlea rsi, [rdx + 8 * 0 + 7]\n\nstd\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A4_REP_Down_Overlapping.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x5152535455565758\",\n    \"RDX\": \"0x5858585858585858\",\n    \"RDI\": \"0xDFFFFFFF\",\n    \"RSI\": \"0xE0000000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8], rax\n\n; Deliberately overlapping source and destination\nlea rdi, [rdx + 7]\nlea rsi, [rdx + 8]\n\nstd\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nmov rdx, [rdx]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A4_REP_Overlapping.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x5152535455565758\",\n    \"RDX\": \"0x5152535455565748\",\n    \"RDI\": \"0xE0000009\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8], rax\n\n; Deliberately overlapping source and destination\nlea rdi, [rdx + 1]\nlea rsi, [rdx]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nmov rdx, [rdx + 8]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A4_REP_many.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 8\nrep movsb ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmovsw ; rdi <- rsi\nmovsw\n\nmovsw\nmovsw\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A5_REP.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 4\nrep movsw ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A5_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 4\nrepne movsw ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A5_REPNE_Down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE000000E\",\n    \"RSI\": \"0xDFFFFFFE\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2 + 6]\nlea rsi, [rdx + 8 * 0 + 6]\n\nstd\nmov rcx, 4\nrepne movsw ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A5_REP_Down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE000000E\",\n    \"RSI\": \"0xDFFFFFFE\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2 + 6]\nlea rsi, [rdx + 8 * 0 + 6]\n\nstd\nmov rcx, 4\nrep movsw ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A5_dword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmovsd ; rdi <- rsi\nmovsd\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A5_dword_REP.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 2\nrep movsd ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A5_dword_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 2\nrepne movsd ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A5_dword_REPNE_Down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE000000C\",\n    \"RSI\": \"0xDFFFFFFC\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2 + 4]\nlea rsi, [rdx + 8 * 0 + 4]\n\nstd\nmov rcx, 2\nrepne movsd ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A5_dword_REP_Down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE000000C\",\n    \"RSI\": \"0xDFFFFFFC\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2 + 4]\nlea rsi, [rdx + 8 * 0 + 4]\n\nstd\nmov rcx, 2\nrep movsd ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A5_qword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x5152535455565758\",\n    \"RCX\": \"0x0\",\n    \"RDI\": \"0xE0000020\",\n    \"RSI\": \"0xE0000010\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\nmov [rdx + 8 * 4], rax\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmovsq ; rdi <- rsi\nmovsq\n\nmov rax, [rdx + 8 * 2]\nmov rbx, [rdx + 8 * 3]\nmov rcx, [rdx + 8 * 4]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A5_qword_REP.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x5152535455565758\",\n    \"RCX\": \"0x0\",\n    \"RDI\": \"0xE0000020\",\n    \"RSI\": \"0xE0000010\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\nmov [rdx + 8 * 4], rax\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 2\nrep movsq ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rbx, [rdx + 8 * 3]\nmov rcx, [rdx + 8 * 4]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A5_qword_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x5152535455565758\",\n    \"RCX\": \"0x0\",\n    \"RDI\": \"0xE0000020\",\n    \"RSI\": \"0xE0000010\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\nmov [rdx + 8 * 4], rax\n\nlea rdi, [rdx + 8 * 2]\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rcx, 2\nrepne movsq ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rbx, [rdx + 8 * 3]\nmov rcx, [rdx + 8 * 4]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A5_qword_REPNE_Down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x5152535455565758\",\n    \"RCX\": \"0x0\",\n    \"RDI\": \"0xE0000008\",\n    \"RSI\": \"0xDFFFFFF8\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\nmov [rdx + 8 * 4], rax\n\nlea rdi, [rdx + 8 * 3]\nlea rsi, [rdx + 8 * 1]\n\nstd\nmov rcx, 2\nrepne movsq ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rbx, [rdx + 8 * 3]\nmov rcx, [rdx + 8 * 4]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A5_qword_REP_Down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x5152535455565758\",\n    \"RCX\": \"0x0\",\n    \"RDI\": \"0xE0000008\",\n    \"RSI\": \"0xDFFFFFF8\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\nmov [rdx + 8 * 4], rax\n\nlea rdi, [rdx + 8 * 3]\nlea rsi, [rdx + 8 * 1]\n\nstd\nmov rcx, 2\nrep movsq ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rbx, [rdx + 8 * 3]\nmov rcx, [rdx + 8 * 4]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x8300\",\n    \"RDI\": \"0xE0000009\",\n    \"RSI\": \"0xE0000001\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x47\nmov [rdx + 8 * 0], rax\nmov rax, 0x61\nmov [rdx + 8 * 1], rax\n\nlea rdi, [rdx + 8 * 1]\nlea rsi, [rdx + 8 * 0]\n\ncld\ncmpsb ; rdi cmp rsi\n; cmp = 0x47 - 0x61 = 0xE6\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A6_REP.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0200\",\n    \"RCX\": \"0x5\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000005\",\n    \"RSI\": \"0xE0000015\"\n  }\n}\n%endif\n\n%macro copy 3\n  ; Dest, Src, Size\n  mov rdi, %1\n  mov rsi, %2\n  mov rcx, %3\n\n  cld\n  rep movsb\n%endmacro\n\nmov rdx, 0xe0000000\n\nlea r15, [rdx + 8 * 0]\nlea r14, [rel .StringOne]\ncopy r15, r14, 11\n\nlea r15, [rdx + 8 * 2]\nlea r14, [rel .StringTwo]\ncopy r15, r14, 14\n\nlea rdi, [rdx + 8 * 0]\nlea rsi, [rdx + 8 * 2]\n\ncld\nmov rcx, 10 ; Lower String length\nrepe cmpsb ; rdi cmp rsi\nmov rax, 0\nlahf\n\nmov rdx, 0\nsete dl\n\nhlt\n\n.StringOne: db \"TestString\\0\"\n.StringTwo: db \"TestUnmatched\\0\"\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A6_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4600\",\n    \"RCX\": \"0x3\",\n    \"RDX\": \"0x1\",\n    \"RDI\": \"0xE0000007\",\n    \"RSI\": \"0xE0000017\"\n  }\n}\n%endif\n\n%macro copy 3\n  ; Dest, Src, Size\n  mov rdi, %1\n  mov rsi, %2\n  mov rcx, %3\n\n  cld\n  rep movsb\n%endmacro\n\nmov rdx, 0xe0000000\n\nlea r15, [rdx + 8 * 0]\nlea r14, [rel .StringOne]\ncopy r15, r14, 11\n\nlea r15, [rdx + 8 * 2]\nlea r14, [rel .StringTwo]\ncopy r15, r14, 11\n\nlea rdi, [rdx + 8 * 0]\nlea rsi, [rdx + 8 * 2]\n\ncld\nmov rcx, 10 ; Lower String length\nrepne cmpsb ; rdi cmp rsi\nmov rax, 0\nlahf\n\nmov rdx, 0\nsete dl\n\nhlt\n\n.StringOne: db \"StringTest\\0\"\n.StringTwo: db \"UnmatcTest\\0\"\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A6_REPNE_Equal.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4600\",\n    \"RCX\": \"0x0\",\n    \"RDX\": \"0x1\",\n    \"RDI\": \"0xE000000A\",\n    \"RSI\": \"0xE000001A\"\n  }\n}\n%endif\n\n%macro copy 3\n  ; Dest, Src, Size\n  mov rdi, %1\n  mov rsi, %2\n  mov rcx, %3\n\n  cld\n  repne movsb\n%endmacro\n\nmov rdx, 0xe0000000\n\nlea r15, [rdx + 8 * 0]\nlea r14, [rel .StringOne]\ncopy r15, r14, 11\n\nlea r15, [rdx + 8 * 2]\nlea r14, [rel .StringTwo]\ncopy r15, r14, 11\n\nlea rdi, [rdx + 8 * 0]\nlea rsi, [rdx + 8 * 2]\n\ncld\nmov rcx, 10 ; Lower String length\nrepe cmpsb ; rdi cmp rsi\nmov rax, 0\nlahf\n\nmov rdx, 0\nsete dl\n\nhlt\n\n.StringOne: db \"TestString\\0\"\n.StringTwo: db \"TestString\\0\"\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A6_REP_Equal.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4600\",\n    \"RCX\": \"0x0\",\n    \"RDX\": \"0x1\",\n    \"RDI\": \"0xE000000A\",\n    \"RSI\": \"0xE000001A\"\n  }\n}\n%endif\n\n%macro copy 3\n  ; Dest, Src, Size\n  mov rdi, %1\n  mov rsi, %2\n  mov rcx, %3\n\n  cld\n  rep movsb\n%endmacro\n\nmov rdx, 0xe0000000\n\nlea r15, [rdx + 8 * 0]\nlea r14, [rel .StringOne]\ncopy r15, r14, 11\n\nlea r15, [rdx + 8 * 2]\nlea r14, [rel .StringTwo]\ncopy r15, r14, 11\n\nlea rdi, [rdx + 8 * 0]\nlea rsi, [rdx + 8 * 2]\n\ncld\nmov rcx, 10 ; Lower String length\nrepe cmpsb ; rdi cmp rsi\nmov rax, 0\nlahf\n\nmov rdx, 0\nsete dl\n\nhlt\n\n.StringOne: db \"TestString\\0\"\n.StringTwo: db \"TestString\\0\"\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A6_REP_Smaller.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0600\",\n    \"RCX\": \"0x5\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000005\",\n    \"RSI\": \"0xE0000015\"\n  }\n}\n%endif\n\n%macro copy 3\n  ; Dest, Src, Size\n  mov rdi, %1\n  mov rsi, %2\n  mov rcx, %3\n\n  cld\n  rep movsb\n%endmacro\n\nmov rdx, 0xe0000000\n\nlea r15, [rdx + 8 * 0]\nlea r14, [rel .StringOne]\ncopy r15, r14, 11\n\nlea r15, [rdx + 8 * 2]\nlea r14, [rel .StringTwo]\ncopy r15, r14, 14\n\nlea rdi, [rdx + 8 * 0]\nlea rsi, [rdx + 8 * 2]\n\ncld\nmov rcx, 10 ; Lower String length\nrepe cmpsb ; rdi cmp rsi\nmov rax, 0\nlahf\n\nmov rdx, 0\nsete dl\n\nhlt\n\n.StringOne: db \"TestString\\0\"\n.StringTwo: db \"Test\\0\"\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A6_REP_addrmod.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RSI\": \"0x0000000010000104\",\n    \"RDI\": \"0x0000000010000204\",\n    \"RCX\": \"0x0000000000000000\"\n  },\n  \"MemoryRegions\": {\n    \"0x10000000\": \"4096\"\n  }\n}\n%endif\n\n; Checks REP CMPS operation with 0x67 prefix.\n; This test ensures that 32-bit address size override works correctly with REP prefix in 64-bit mode\n\n; Source data at 0x10000100\nmov rsi, 0x10000100\nmov dword [rsi], 0x41424344      ; 'ABCD'\n\n; Destination data at 0x10000200\nmov rdi, 0x10000200\nmov dword [rdi], 0x41424344      ; same as source\n\n; Set initial RSI/RDI values with high bits set\n; Low 32 bits (ESI/EDI) must point to valid memory\nmov rsi, 0x5152535410000100\nmov rdi, 0x6162636410000200\n\n; Set RCX to number of bytes to compare\nmov rcx, 4\n\n; This should make the instruction use ESI/EDI (32-bit) instead of RSI/RDI (64-bit)\n; Per x86-64 architecture, writing to 32-bit registers zeros the upper 32 bits\ndb 0x67\nrep cmpsb\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A6_REP_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x8300\",\n    \"RCX\": \"0x9\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE000000C\",\n    \"RSI\": \"0xE000001C\"\n  }\n}\n%endif\n\n%macro copy 3\n  ; Dest, Src, Size\n  mov rdi, %1\n  mov rsi, %2\n  mov rcx, %3\n\n  cld\n  rep movsb\n%endmacro\n\nmov rdx, 0xe0000000\n\nlea r15, [rdx + 8 * 0]\nlea r14, [rel .StringOne]\ncopy r15, r14, 14\n\nlea r15, [rdx + 8 * 2]\nlea r14, [rel .StringTwo]\ncopy r15, r14, 14\n\nlea rdi, [rdx + 8 * 0 + 13]\nlea rsi, [rdx + 8 * 2 + 13]\n\nstd\nmov rcx, 10 ; Lower String length\nrepe cmpsb ; rdi cmp rsi\nmov rax, 0\nlahf\n\nmov rdx, 0\nsete dl\n\nhlt\n\n.StringOne: db \"\\0\\0\\0\\0TestString\"\n.StringTwo: db \"\\0TestUnmatched\"\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A6_REP_down_Equal.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4600\",\n    \"RCX\": \"0x0\",\n    \"RDX\": \"0x1\",\n    \"RDI\": \"0xDFFFFFFF\",\n    \"RSI\": \"0xE000000F\"\n  }\n}\n%endif\n\n%macro copy 3\n  ; Dest, Src, Size\n  mov rdi, %1\n  mov rsi, %2\n  mov rcx, %3\n\n  cld\n  rep movsb\n%endmacro\n\nmov rdx, 0xe0000000\n\nlea r15, [rdx + 8 * 0]\nlea r14, [rel .StringOne]\ncopy r15, r14, 11\n\nlea r15, [rdx + 8 * 2]\nlea r14, [rel .StringTwo]\ncopy r15, r14, 11\n\nlea rdi, [rdx + 8 * 0 + 10]\nlea rsi, [rdx + 8 * 2 + 10]\n\nstd\nmov rcx, 11 ; Lower String length\nrepe cmpsb ; rdi cmp rsi\nmov rax, 0\nlahf\n\nmov rdx, 0\nsete dl\n\nhlt\n\n.StringOne: db \"\\0TestString\"\n.StringTwo: db \"\\0TestString\"\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A6_addrmod.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RSI\": \"0x0000000010000101\",\n    \"RDI\": \"0x0000000010000201\"\n  },\n  \"MemoryRegions\": {\n    \"0x10000000\": \"4096\"\n  }\n}\n%endif\n\n; Check CMPS* operations with 0x67 prefix.\n; This test ensures that 32-bit address size override works correctly in 64-bit mode\n\n; Set up source data at 0x10000100\nmov rsi, 0x10000100\nmov byte [rsi], 0x41      ; 'A'\n\n; Set up destination data at 0x10000200\nmov rdi, 0x10000200\nmov byte [rdi], 0x41      ; same as source\n\n; Set initial RSI/RDI values with high bits set\n; Low 32 bits (ESI/EDI) must point to valid memory\nmov rsi, 0x5152535410000100\nmov rdi, 0x6162636410000200\n\n; This should make the instruction use ESI/EDI (32-bit) instead of RSI/RDI (64-bit)\n; Per x86-64 architecture, writing to 32-bit registers zeros the upper 32 bits\ndb 0x67\ncmpsb\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A6_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1200\",\n    \"RDI\": \"0xE0000007\",\n    \"RSI\": \"0xDFFFFFFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x61\nmov [rdx + 8 * 0], rax\nmov rax, 0x47\nmov [rdx + 8 * 1], rax\n\nlea rdi, [rdx + 8 * 1]\nlea rsi, [rdx + 8 * 0]\n\nstd\ncmpsb ; rdi cmp rsi\n; cmp = 0x47 - 0x61 = 0xE6\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A7_dword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1600\",\n    \"RDI\": \"0xE000000C\",\n    \"RSI\": \"0xE0000004\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x61626364\nmov [rdx + 8 * 0], rax\nmov rax, 0x55565758\nmov [rdx + 8 * 1], rax\n\nlea rdi, [rdx + 8 * 1]\nlea rsi, [rdx + 8 * 0]\n\ncld\ncmpsd ; rdi cmp rsi\n; cmp = 0x55565758 - 0x61626364 = 0xF3F3F3F4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A7_dword_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1600\",\n    \"RDI\": \"0xE0000004\",\n    \"RSI\": \"0xDFFFFFFC\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x61626364\nmov [rdx + 8 * 0], rax\nmov rax, 0x55565758\nmov [rdx + 8 * 1], rax\n\nlea rdi, [rdx + 8 * 1]\nlea rsi, [rdx + 8 * 0]\n\nstd\ncmpsd ; rdi cmp rsi\n; cmp = 0x55565758 - 0x61626364 = 0xF3F3F3F4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A7_qword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x9700\",\n    \"RDI\": \"0xE0000010\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000061626364\nmov [rdx + 8 * 0], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 1], rax\n\nlea rdi, [rdx + 8 * 1]\nlea rsi, [rdx + 8 * 0]\n\ncld\ncmpsq ; rdi cmp rsi\n; cmp = 0x6162636465666768- 0x61626364 = 0x6162636404040404\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000010\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A7_qword_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x9700\",\n    \"RDI\": \"0xE0000000\",\n    \"RSI\": \"0xDFFFFFF8\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000061626364\nmov [rdx + 8 * 0], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 1], rax\n\nlea rdi, [rdx + 8 * 1]\nlea rsi, [rdx + 8 * 0]\n\nstd\ncmpsq ; rdi cmp rsi\n; cmp = 0x6162636465666768- 0x61626364 = 0x6162636404040404\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000010\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A7_word.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1200\",\n    \"RDI\": \"0xE000000A\",\n    \"RSI\": \"0xE0000002\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162\nmov [rdx + 8 * 0], rax\nmov rax, 0x4546\nmov [rdx + 8 * 1], rax\n\nlea rdi, [rdx + 8 * 1]\nlea rsi, [rdx + 8 * 0]\n\ncld\ncmpsw ; rdi cmp rsi\n; cmp = 0x4546 - 0x6162 = 0xE3E4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000111\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A7_word_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1200\",\n    \"RDI\": \"0xE0000006\",\n    \"RSI\": \"0xDFFFFFFE\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162\nmov [rdx + 8 * 0], rax\nmov rax, 0x4546\nmov [rdx + 8 * 1], rax\n\nlea rdi, [rdx + 8 * 1]\nlea rsi, [rdx + 8 * 0]\n\nstd\ncmpsw ; rdi cmp rsi\n; cmp = 0x4546 - 0x6162 = 0xE3E4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000111\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0600\"\n  }\n}\n%endif\n\nmov rax, 0x4142434445464847\ntest al, 0x61\n\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_A9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0200\",\n    \"RBX\": \"0x0600\",\n    \"RCX\": \"0x0600\"\n  }\n}\n%endif\n\nmov rax, 0x6162636465666768\ntest rax, 0x71727374\n; test = 0x6162636465666768 & 0x71727374 = 0x61626360\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- Undefined\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000110\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nmov rcx, rax\nand rcx, 0xffffffffffffefff\n\nmov rax, 0x5152535455565758\ntest eax, 0x71727374\n; test = 0x55565758 & 0x71727374 = 0x51525350\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- Undefined\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000110\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nmov rbx, rax\nand rbx, 0xffffffffffffefff\n\nmov rax, 0x4142434445464748\ntest ax, 0x7172\n; test = 0x4748 & 0x7172 = 0x4140\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- Undefined\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000010\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nand rax, 0xffffffffffffefff\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AA.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF2F2F2F2F2F2F2F2\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\n\ncld\nmov rax, 0xF2\nstosb ; rdi <- al\nstosb\nstosb\nstosb\n\nstosb\nstosb\nstosb\nstosb\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AA_REP.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF2F2F2F2F2F2F2F2\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\n\ncld\nmov rcx, 8\nmov rax, 0xF2\nrep stosb ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AA_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF2F2F2F2F2F2F2F2\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\n\ncld\nmov rcx, 8\nmov rax, 0xF2\nrepne stosb ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AA_REPNE_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF2F2F2F2F2F2F2F2\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE000000F\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2 + 7]\n\nstd\nmov rcx, 8\nmov rax, 0xF2\nrepne stosb ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AA_REP_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF2F2F2F2F2F2F2F2\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE000000F\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2 + 7]\n\nstd\nmov rcx, 8\nmov rax, 0xF2\nrep stosb ; rdi <- rsi\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AB_dword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF1F2F3F4F1F2F3F4\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\n\ncld\nmov rax, 0xF1F2F3F4\nstosd ; rdi <- eax\nstosd\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AB_dword_REP.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF1F2F3F4F1F2F3F4\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\n\ncld\nmov rax, 0xF1F2F3F4\nmov rcx, 2\nrep stosd ; rdi <- eax\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AB_dword_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF1F2F3F4F1F2F3F4\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\n\ncld\nmov rax, 0xF1F2F3F4\nmov rcx, 2\nrepne stosd ; rdi <- eax\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AB_dword_REPNE_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF1F2F3F4F1F2F3F4\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE000000C\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2 + 4]\n\nstd\nmov rax, 0xF1F2F3F4\nmov rcx, 2\nrepne stosd ; rdi <- eax\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AB_dword_REP_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF1F2F3F4F1F2F3F4\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE000000C\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2 + 4]\n\nstd\nmov rax, 0xF1F2F3F4\nmov rcx, 2\nrep stosd ; rdi <- eax\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AB_qword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF1F2F3F4F5F6F7F8\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\n\ncld\nmov rax, 0xF1F2F3F4F5F6F7F8\nstosq ; rdi <- rax\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AB_qword_REP.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF1F2F3F4F5F6F7F8\",\n    \"RDX\": \"0xF1F2F3F4F5F6F7F8\",\n    \"RSI\": \"0x0\",\n    \"RDI\": \"0xE0000020\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\nmov [rdx + 8 * 4], rax\n\nlea rdi, [rdx + 8 * 2]\n\ncld\nmov rax, 0xF1F2F3F4F5F6F7F8\nmov rcx, 2\nrep stosq ; rdi <- rax\n\nmov rax, [rdx + 8 * 2]\nmov rsi, [rdx + 8 * 4]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AB_qword_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF1F2F3F4F5F6F7F8\",\n    \"RDX\": \"0xF1F2F3F4F5F6F7F8\",\n    \"RSI\": \"0x0\",\n    \"RDI\": \"0xE0000020\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\nmov [rdx + 8 * 4], rax\n\nlea rdi, [rdx + 8 * 2]\n\ncld\nmov rax, 0xF1F2F3F4F5F6F7F8\nmov rcx, 2\nrepne stosq ; rdi <- rax\n\nmov rax, [rdx + 8 * 2]\nmov rsi, [rdx + 8 * 4]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AB_qword_REPNE_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF1F2F3F4F5F6F7F8\",\n    \"RDX\": \"0xF1F2F3F4F5F6F7F8\",\n    \"RSI\": \"0x0\",\n    \"RDI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\nmov [rdx + 8 * 4], rax\n\nlea rdi, [rdx + 8 * 3]\n\nstd\nmov rax, 0xF1F2F3F4F5F6F7F8\nmov rcx, 2\nrepne stosq ; rdi <- rax\n\nmov rax, [rdx + 8 * 2]\nmov rsi, [rdx + 8 * 4]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AB_qword_REP_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF1F2F3F4F5F6F7F8\",\n    \"RDX\": \"0xF1F2F3F4F5F6F7F8\",\n    \"RSI\": \"0x0\",\n    \"RDI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\nmov [rdx + 8 * 4], rax\n\nlea rdi, [rdx + 8 * 3]\n\nstd\nmov rax, 0xF1F2F3F4F5F6F7F8\nmov rcx, 2\nrep stosq ; rdi <- rax\n\nmov rax, [rdx + 8 * 2]\nmov rsi, [rdx + 8 * 4]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AB_word.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF1F2F1F2F1F2F1F2\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\n\ncld\nmov rax, 0xF1F2\nstosw ; rdi <- ax\nstosw\nstosw\nstosw\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AB_word_REP.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF1F2F1F2F1F2F1F2\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\n\ncld\nmov rcx, 0x4\nmov rax, 0xF1F2\nrep stosw ; rdi <- ax\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AB_word_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF1F2F1F2F1F2F1F2\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE0000018\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2]\n\ncld\nmov rcx, 0x4\nmov rax, 0xF1F2\nrepne stosw ; rdi <- ax\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AB_word_REPNE_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF1F2F1F2F1F2F1F2\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE000000E\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2 + 6]\n\nstd\nmov rcx, 0x4\nmov rax, 0xF1F2\nrepne stosw ; rdi <- ax\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AB_word_REP_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xF1F2F1F2F1F2F1F2\",\n    \"RDX\": \"0x0\",\n    \"RDI\": \"0xE000000E\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rdi, [rdx + 8 * 2 + 6]\n\nstd\nmov rcx, 0x4\nmov rax, 0xF1F2\nrep stosw ; rdi <- ax\n\nmov rax, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rax, 0xFF\nlodsb\nlodsb\nlodsb\nlodsb\n\nlodsb\nlodsb\nlodsb\nlodsb\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AC_REP.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rax, 0xFF\nmov rcx, 8\nrep lodsb\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AC_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rax, 0xFF\nmov rcx, 8\nrepne lodsb\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AC_REPNE_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x57\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rsi, [rdx + 8 * 2]\n\nstd\nmov rax, 0xFF\nmov rcx, 8\nrepne lodsb\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AC_REP_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x57\",\n    \"RSI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rsi, [rdx + 8 * 2]\n\nstd\nmov rax, 0xFF\nmov rcx, 8\nrep lodsb\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AD_REPNE_dword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x71727374\",\n    \"RSI\": \"0xE0000020\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\n\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rax, 0xFF\nmov rcx, 8\nrepne lodsd\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AD_REPNE_dword_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344\",\n    \"RSI\": \"0xE0000000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\n\nlea rsi, [rdx + 8 * 4]\n\nstd\nmov rax, 0xFF\nmov rcx, 8\nrepne lodsd\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AD_REPNE_qword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xB1B2B3B4B5B6B7B8\",\n    \"RSI\": \"0xE0000040\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\nmov rax, 0x8182838485868788\nmov [rdx + 8 * 4], rax\nmov rax, 0x9192939495969798\nmov [rdx + 8 * 5], rax\nmov rax, 0xA1A2A3A4A5A6A7A8\nmov [rdx + 8 * 6], rax\nmov rax, 0xB1B2B3B4B5B6B7B8\nmov [rdx + 8 * 7], rax\nmov rax, 0x0\nmov [rdx + 8 * 8], rax\n\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rax, 0xFF\nmov rcx, 8\nrepne lodsq\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AD_REPNE_qword_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x5152535455565758\",\n    \"RSI\": \"0xE0000000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\nmov rax, 0x8182838485868788\nmov [rdx + 8 * 4], rax\nmov rax, 0x9192939495969798\nmov [rdx + 8 * 5], rax\nmov rax, 0xA1A2A3A4A5A6A7A8\nmov [rdx + 8 * 6], rax\nmov rax, 0xB1B2B3B4B5B6B7B8\nmov [rdx + 8 * 7], rax\nmov rax, 0x0\nmov [rdx + 8 * 8], rax\n\nlea rsi, [rdx + 8 * 8]\n\nstd\nmov rax, 0xFF\nmov rcx, 8\nrepne lodsq\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AD_REPNE_word.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x5152\",\n    \"RSI\": \"0xE0000010\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rax, 0xFF\nmov rcx, 8\nrepne lodsw\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AD_REPNE_word_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4546\",\n    \"RSI\": \"0xE0000000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rsi, [rdx + 8 * 2]\n\nstd\nmov rax, 0xFF\nmov rcx, 8\nrepne lodsw\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AD_REP_dword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x71727374\",\n    \"RSI\": \"0xE0000020\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\n\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rax, 0xFF\nmov rcx, 8\nrep lodsd\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AD_REP_dword_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344\",\n    \"RSI\": \"0xE0000000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\n\nlea rsi, [rdx + 8 * 4]\n\nstd\nmov rax, 0xFF\nmov rcx, 8\nrep lodsd\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AD_REP_qword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xB1B2B3B4B5B6B7B8\",\n    \"RSI\": \"0xE0000040\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\nmov rax, 0x8182838485868788\nmov [rdx + 8 * 4], rax\nmov rax, 0x9192939495969798\nmov [rdx + 8 * 5], rax\nmov rax, 0xA1A2A3A4A5A6A7A8\nmov [rdx + 8 * 6], rax\nmov rax, 0xB1B2B3B4B5B6B7B8\nmov [rdx + 8 * 7], rax\nmov rax, 0x0\nmov [rdx + 8 * 8], rax\n\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rax, 0xFF\nmov rcx, 8\nrep lodsq\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AD_REP_qword_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x5152535455565758\",\n    \"RSI\": \"0xE0000000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\nmov rax, 0x8182838485868788\nmov [rdx + 8 * 4], rax\nmov rax, 0x9192939495969798\nmov [rdx + 8 * 5], rax\nmov rax, 0xA1A2A3A4A5A6A7A8\nmov [rdx + 8 * 6], rax\nmov rax, 0xB1B2B3B4B5B6B7B8\nmov [rdx + 8 * 7], rax\nmov rax, 0x0\nmov [rdx + 8 * 8], rax\n\nlea rsi, [rdx + 8 * 8]\n\nstd\nmov rax, 0xFF\nmov rcx, 8\nrep lodsq\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AD_REP_word.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x5152\",\n    \"RSI\": \"0xE0000010\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rax, 0xFF\nmov rcx, 8\nrep lodsw\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AD_REP_word_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4546\",\n    \"RSI\": \"0xE0000000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rsi, [rdx + 8 * 2]\n\nstd\nmov rax, 0xFF\nmov rcx, 8\nrep lodsw\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AD_dword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x71727374\",\n    \"RSI\": \"0xE0000020\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\n\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rax, 0xFF\nlodsd\nlodsd\nlodsd\nlodsd\n\nlodsd\nlodsd\nlodsd\nlodsd\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AD_qword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xB1B2B3B4B5B6B7B8\",\n    \"RSI\": \"0xE0000040\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\nmov rax, 0x8182838485868788\nmov [rdx + 8 * 4], rax\nmov rax, 0x9192939495969798\nmov [rdx + 8 * 5], rax\nmov rax, 0xA1A2A3A4A5A6A7A8\nmov [rdx + 8 * 6], rax\nmov rax, 0xB1B2B3B4B5B6B7B8\nmov [rdx + 8 * 7], rax\nmov rax, 0x0\nmov [rdx + 8 * 8], rax\n\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rax, 0xFF\nlodsq\nlodsq\nlodsq\nlodsq\n\nlodsq\nlodsq\nlodsq\nlodsq\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AD_word.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x5152\",\n    \"RSI\": \"0xE0000010\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nlea rsi, [rdx + 8 * 0]\n\ncld\nmov rax, 0xFF\nlodsw\nlodsw\nlodsw\nlodsw\n\nlodsw\nlodsw\nlodsw\nlodsw\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1200\",\n    \"RDI\": \"0xE0000001\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\n\nlea rdi, [rdx + 8 * 0]\n\ncld\nmov rax, 0x61\nscasb\n; cmp = 0x61 - 0x48 = 0x19\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00010000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00010010\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AE_REP.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"5\",\n    \"RDI\": \"0xE0000003\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445466161\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\n\nlea rdi, [rdx + 8 * 0]\n\ncld\nmov rax, 0x61\nmov rcx, 8\ncmp rax, 0x61\n\nrep scasb\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AE_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"1\",\n    \"RDI\": \"0xE0000007\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4161434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\n\nlea rdi, [rdx + 8 * 0]\n\ncld\nmov rax, 0x61\nmov rcx, 8\ncmp rax, 0\n\nrepne scasb\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AE_REPNE_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"5\",\n    \"RDI\": \"0xE000000D\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5161535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\n\nlea rdi, [rdx + 8 * 2]\n\nstd\nmov rax, 0x61\nmov rcx, 8\ncmp rax, 0\n\nrepne scasb\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AE_REP_down.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"7\",\n    \"RDI\": \"0xE000000F\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445466161\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\n\nlea rdi, [rdx + 8 * 2]\n\nstd\nmov rax, 0x61\nmov rcx, 8\ncmp rax, 0x61\n\nrep scasb\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AE_addrmod.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RDI\": \"0x0000000010000101\"\n  },\n  \"MemoryRegions\": {\n    \"0x10000000\": \"4096\"\n  }\n}\n%endif\n\n; Checks SCAS* operations with 0x67 prefix.\n; This test ensures that 32-bit address size override works correctly in 64-bit mode\n\n; Set up destination data at address 0x10000100\nmov rdi, 0x10000100\nmov byte [rdi], 0x41      ; 'A'\n\n; Set initial RDI value with high bits set\n; Low 32 bits (EDI) = 0x10000100, high 32 bits = 0x61626364\nmov rdi, 0x6162636410000100\n\n; Set AL to match the byte we're scanning for\nmov al, 0x41\n\n; This should make the instruction use EDI (32-bit) instead of RDI (64-bit)\n; Per x86-64 architecture, writing to 32-bit registers zeros the upper 32 bits\ndb 0x67\nscasb\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AF_REP_dword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"6\",\n    \"RDI\": \"0xE0000008\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434461626364\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\n\nlea rdi, [rdx + 8 * 0]\n\ncld\nmov rax, 0x61626364\nmov rcx, 8\ncmp rax, 0x61626364\n\nrep scasd\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AF_REP_qword.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"6\",\n    \"RDI\": \"0xE0000010\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\n\nlea rdi, [rdx + 8 * 0]\n\ncld\nmov rax, 0x6162636465666768\nmov rbx, 0x6162636465666768\nmov rcx, 8\ncmp rax, rbx\n\nrep scasq\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_AF_REP_word.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"6\",\n    \"RDI\": \"0xE0000004\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445466162\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\n\nlea rdi, [rdx + 8 * 0]\n\ncld\nmov rax, 0x6162\nmov rcx, 8\ncmp rax, 0x6162\n\nrep scasw\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_B0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFFFF41\",\n    \"RBX\": \"0xFFFFFFFFFFFFFF41\",\n    \"RCX\": \"0xFFFFFFFFFFFFFF41\",\n    \"RDX\": \"0xFFFFFFFFFFFFFF41\",\n    \"RBP\": \"0xFFFFFFFFFFFFFF41\",\n    \"RSI\": \"0xFFFFFFFFFFFFFF41\",\n    \"RDI\": \"0xFFFFFFFFFFFFFF41\",\n    \"RSP\": \"0xFFFFFFFFFFFFFF41\",\n    \"R8\":  \"0xFFFFFFFFFFFFFF41\",\n    \"R9\":  \"0xFFFFFFFFFFFFFF41\",\n    \"R10\": \"0xFFFFFFFFFFFFFF41\",\n    \"R11\": \"0xFFFFFFFFFFFFFF41\",\n    \"R12\": \"0xFFFFFFFFFFFFFF41\",\n    \"R13\": \"0xFFFFFFFFFFFFFF41\",\n    \"R14\": \"0xFFFFFFFFFFFFFF41\",\n    \"R15\": \"0xFFFFFFFFFFFFFF41\"\n  }\n}\n%endif\n\nmov rax, -1\nmov rbx, -1\nmov rcx, -1\nmov rdx, -1\nmov rbp, -1\nmov rsi, -1\nmov rdi, -1\nmov rsp, -1\nmov r8, -1\nmov r9, -1\nmov r10, -1\nmov r11, -1\nmov r12, -1\nmov r13, -1\nmov r14, -1\nmov r15, -1\n\n\nmov al, 0x41\nmov bl, 0x41\nmov cl, 0x41\nmov dl, 0x41\nmov bpl, 0x41\nmov sil, 0x41\nmov dil, 0x41\nmov spl, 0x41\nmov r8b, 0x41\nmov r9b, 0x41\nmov r10b, 0x41\nmov r11b, 0x41\nmov r12b, 0x41\nmov r13b, 0x41\nmov r14b, 0x41\nmov r15b, 0x41\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_B8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFF4241\",\n    \"RBX\": \"0xFFFFFFFFFFFF4241\",\n    \"RCX\": \"0xFFFFFFFFFFFF4241\",\n    \"RDX\": \"0xFFFFFFFFFFFF4241\",\n    \"RBP\": \"0xFFFFFFFFFFFF4241\",\n    \"RSI\": \"0xFFFFFFFFFFFF4241\",\n    \"RDI\": \"0xFFFFFFFFFFFF4241\",\n    \"RSP\": \"0xFFFFFFFFFFFF4241\",\n    \"R8\":  \"0xFFFFFFFFFFFF4241\",\n    \"R9\":  \"0xFFFFFFFFFFFF4241\",\n    \"R10\": \"0xFFFFFFFFFFFF4241\",\n    \"R11\": \"0xFFFFFFFFFFFF4241\",\n    \"R12\": \"0xFFFFFFFFFFFF4241\",\n    \"R13\": \"0xFFFFFFFFFFFF4241\",\n    \"R14\": \"0xFFFFFFFFFFFF4241\",\n    \"R15\": \"0xFFFFFFFFFFFF4241\"\n  }\n}\n%endif\n\nmov rax, -1\nmov rbx, -1\nmov rcx, -1\nmov rdx, -1\nmov rbp, -1\nmov rsi, -1\nmov rdi, -1\nmov rsp, -1\nmov r8, -1\nmov r9, -1\nmov r10, -1\nmov r11, -1\nmov r12, -1\nmov r13, -1\nmov r14, -1\nmov r15, -1\n\n\nmov ax, 0x4241\nmov bx, 0x4241\nmov cx, 0x4241\nmov dx, 0x4241\nmov bp, 0x4241\nmov si, 0x4241\nmov di, 0x4241\nmov sp, 0x4241\nmov r8w, 0x4241\nmov r9w, 0x4241\nmov r10w, 0x4241\nmov r11w, 0x4241\nmov r12w, 0x4241\nmov r13w, 0x4241\nmov r14w, 0x4241\nmov r15w, 0x4241\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_B8_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000044434241\",\n    \"RBX\": \"0x0000000044434241\",\n    \"RCX\": \"0x0000000044434241\",\n    \"RDX\": \"0x0000000044434241\",\n    \"RBP\": \"0x0000000044434241\",\n    \"RSI\": \"0x0000000044434241\",\n    \"RDI\": \"0x0000000044434241\",\n    \"RSP\": \"0x0000000044434241\",\n    \"R8\":  \"0x0000000044434241\",\n    \"R9\":  \"0x0000000044434241\",\n    \"R10\": \"0x0000000044434241\",\n    \"R11\": \"0x0000000044434241\",\n    \"R12\": \"0x0000000044434241\",\n    \"R13\": \"0x0000000044434241\",\n    \"R14\": \"0x0000000044434241\",\n    \"R15\": \"0x0000000044434241\"\n  }\n}\n%endif\n\nmov rax, -1\nmov rbx, -1\nmov rcx, -1\nmov rdx, -1\nmov rbp, -1\nmov rsi, -1\nmov rdi, -1\nmov rsp, -1\nmov r8, -1\nmov r9, -1\nmov r10, -1\nmov r11, -1\nmov r12, -1\nmov r13, -1\nmov r14, -1\nmov r15, -1\n\nmov eax, 0x44434241\nmov ebx, 0x44434241\nmov ecx, 0x44434241\nmov edx, 0x44434241\nmov ebp, 0x44434241\nmov esi, 0x44434241\nmov edi, 0x44434241\nmov esp, 0x44434241\nmov r8d, 0x44434241\nmov r9d, 0x44434241\nmov r10d, 0x44434241\nmov r11d, 0x44434241\nmov r12d, 0x44434241\nmov r13d, 0x44434241\nmov r14d, 0x44434241\nmov r15d, 0x44434241\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_B8_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4847464544434241\",\n    \"RBX\": \"0x4847464544434241\",\n    \"RCX\": \"0x4847464544434241\",\n    \"RDX\": \"0x4847464544434241\",\n    \"RBP\": \"0x4847464544434241\",\n    \"RSI\": \"0x4847464544434241\",\n    \"RDI\": \"0x4847464544434241\",\n    \"RSP\": \"0x4847464544434241\",\n    \"R8\":  \"0x4847464544434241\",\n    \"R9\":  \"0x4847464544434241\",\n    \"R10\": \"0x4847464544434241\",\n    \"R11\": \"0x4847464544434241\",\n    \"R12\": \"0x4847464544434241\",\n    \"R13\": \"0x4847464544434241\",\n    \"R14\": \"0x4847464544434241\",\n    \"R15\": \"0x4847464544434241\"\n  }\n}\n%endif\n\nmov rax, -1\nmov rbx, -1\nmov rcx, -1\nmov rdx, -1\nmov rbp, -1\nmov rsi, -1\nmov rdi, -1\nmov rsp, -1\nmov r8, -1\nmov r9, -1\nmov r10, -1\nmov r11, -1\nmov r12, -1\nmov r13, -1\nmov r14, -1\nmov r15, -1\n\nmov rax, 0x4847464544434241\nmov rbx, 0x4847464544434241\nmov rcx, 0x4847464544434241\nmov rdx, 0x4847464544434241\nmov rbp, 0x4847464544434241\nmov rsi, 0x4847464544434241\nmov rdi, 0x4847464544434241\nmov rsp, 0x4847464544434241\nmov r8, 0x4847464544434241\nmov r9, 0x4847464544434241\nmov r10, 0x4847464544434241\nmov r11, 0x4847464544434241\nmov r12, 0x4847464544434241\nmov r13, 0x4847464544434241\nmov r14, 0x4847464544434241\nmov r15, 0x4847464544434241\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_C2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RSP\": \"0xE000FF20\"\n  }\n}\n%endif\n\nmov rsp, 0xe0000020\nlea rax, [rel .end]\npush rax\n\nmov rax, 1\nret 0xFF00\nmov rax, 0\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_C3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RSP\": \"0xE0000020\"\n  }\n}\n%endif\n\nmov rsp, 0xe0000020\nlea rax, [rel .end]\npush rax\n\nmov rax, 1\nret\nmov rax, 0\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_C8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RSP\": \"0xE0000FE8\",\n    \"RBP\": \"0xE0000FF8\"\n  }\n}\n%endif\n\nmov rsp, 0xe0001000\nmov rbp, 0xe0001000\n\nenter 0x10, 0\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_C8_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RSP\": \"0xE0000FD8\",\n    \"RBP\": \"0xE0000FF8\"\n  }\n}\n%endif\n\nmov rsp, 0xe0001000\nmov rbp, 0xe0002000\nmov rax, 0x4142434445464748\nmov qword [rbp - 8], rax\n\nenter 0x10, 2\nmov rax, qword [rsp + 0x18]\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_C8_o16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RSP\": \"0xE0000FEE\",\n    \"RBP\": \"0xE0000FFE\"\n  }\n}\n%endif\n\nmov rsp, 0xe0001000\nmov rbp, 0xe0001000\n\n; operand-size override prefix\n; Nasm complains if o16 is used\n; `warning: invalid operand size prefix o16, must be o64`\ndb 0x66\nenter 0x10, 0\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_C9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBP\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov rsp, 0xe0000020\nmov rbp, 0x4142434445464748\n\n; Act like an ENTER frame without using ENTER\npush rbp\nmov rbp, rsp\ncall .target\njmp .end\n\n.target:\nmov rax, 1\nleave\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_C9_o16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBP\": \"0xe0004748\",\n    \"RSP\": \"0xe0000020\"\n  }\n}\n%endif\n\nmov rsp, 0xe0000020\nmov rbp, 0x4142434445464748\n\n; Act like an ENTER frame without using ENTER\nsub rsp, 2\nmov [rsp], bp\nmov rbp, rsp\ncall .target\njmp .end\n\n.target:\nmov rax, 1\n\n; operand-size override prefix\n; Nasm complains if o16 is used\n; `warning: invalid operand size prefix o16, must be o64`\ndb 0x66\nleave\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_CF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RSP\": \"0xe0000030\"\n  }\n}\n%endif\n\nmov esp, 0xe0000030\n\nlea rbx, [rel .end]\nmov rcx, 0x33\nmov rdx, rsp\n\nmov eax, 0x2b\npush rax ; SS\npush rdx ; RSP\nmov eax, 0x202\npush rax ; RFLAGS\npush rcx ; CS\npush rbx ; RIP\n\nmov eax, -1\niretq\n\n; Super fail\nmov eax, 2\nhlt\n\n.end_fail:\nmov eax, 0\nhlt\n\n.end:\nmov eax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_D7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xFFFFFFFFFFFFFF47\",\n    \"R14\": \"0xFFFFFFFFFFFFFF57\",\n    \"R13\": \"0xFFFFFFFFFFFFFF67\"\n  }\n}\n%endif\n\n; Save FS/GS\nrdfsbase rax\nmov [rel .data_backup], rax\nrdgsbase rax\nmov [rel .data_backup + 8], rax\n\nmov rbx, 0xe0000000\nlea r9, [rbx + 8 * 1]\nwrfsbase r9\nlea r9, [rbx + 8 * 2]\nwrgsbase r9\n\nmov rcx, 0x4142434445464748\nmov [rbx + 8 * 0], rcx\nmov rcx, 0x5152535455565758\nmov [rbx + 8 * 1], rcx\nmov rcx, 0x6162636465666768\nmov [rbx + 8 * 2], rcx\n\n; Base\nmov rax, 0xFFFFFFFFFFFFFF01\nxlatb\nmov r15, rax\n\n; FS\nmov rax, 0xFFFFFFFFFFFFFF01\nmov rbx, 0\nfs xlat\nmov r14, rax\n\n; GS\nmov rax, 0xFFFFFFFFFFFFFF01\nmov rbx, 0\ngs xlat\nmov r13, rax\n\n; Restore FS/GS\nmov rax, [rel .data_backup]\nwrfsbase rax\nmov rax, [rel .data_backup + 8]\nwrgsbase rax\n\nhlt\n\nalign 4096\n.data_backup:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_E0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0F\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rbx, 0xFFFFFFFFFFFFFF00\nmov [r15 + 8 * 0], rbx\nmov rbx, -1\nmov [r15 + 8 * 1], rbx\n\nmov rax, 0\nmov rcx, 0x10\ncmp byte [r15 + rcx - 1], 0xFF\n\njmp .head\n\n.top:\n\nadd rax, 1\ncmp byte [r15 + rcx - 1], 0xFF\n\n.head:\n\nloope .top\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_E1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0F\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rbx, 0xFFFFFFFFFFFFFF00\nmov [r15 + 8 * 0], rbx\nmov rbx, -1\nmov [r15 + 8 * 1], rbx\n\nmov rax, 0\nmov rcx, 0x10\ncmp byte [r15 + rcx - 1], 0\n\njmp .head\n\n.top:\n\nadd rax, 1\ncmp byte [r15 + rcx - 1], 0\n\n.head:\n\nloopne .top\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_E2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x10\"\n  }\n}\n%endif\n\nmov rax, 0\nmov rcx, 0x11\n\njmp .head\n\n.top:\n\nadd rax, 1\n\n.head:\n\nloop .top\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_E3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x10\",\n    \"RBX\": \"0x10\"\n  }\n}\n%endif\n\nmov rax, 0\nmov rcx, 0x10\n\njmp .head\n\n.top:\n\nadd rax, 1\nsub rcx, 1\n\n.head:\n\njrcxz .next\njmp .top\n.next:\n\n; Second test\nmov rbx, 0\nmov rcx, 0xFFFFFFFF00000010\njmp .head2\n\n.top2:\nadd rbx, 1\nsub rcx, 1\n\n.head2:\njecxz .next2\njmp .top2\n\n.next2:\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_E8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x1\"\n  }\n}\n%endif\n\nmov rsp, 0xe0000020\nmov rax, 0\nmov rbx, 0\n\n; NASM doesn't have a way to explicitly encode a 16bit or 32bit relative call\n; Manually encode\ndb 0x66 ; 16bit\ndb 0xE8 ; CALL\ndb 0x02 ; +0x0002 (Just past the next JUMP instruction\ndb 0x00\n\njmp .end1\n\n.target1:\nmov rax, 1\nret\n\n.end1:\n\n; NASM doesn't have a way to explicitly encode a 16bit or 32bit relative call\n; Manually encode\ndb 0xE8 ; CALL\ndb 0x02 ; +0x00000002 (Just past the next JUMP instruction\ndb 0x00\ndb 0x00\ndb 0x00\n\njmp .end2\n\n.target2:\nmov rbx, 1\nret\n\n.end2:\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_E9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x1\"\n  }\n}\n%endif\n\nmov rsp, 0xe0000020\nmov rax, 0\nmov rbx, 0\n\n; NASM doesn't have a way to explicitly encode a 16bit or 32bit relative jump\n; Manually encode\ndb 0x66 ; 16bit\ndb 0xE9 ; JMP\ndb 0x02 ; +0x0002 (Just past the next JUMP instruction\ndb 0x00\n\n.back1:\njmp .end1\n\n.target1:\nmov rax, 1\njmp .back1\n\n.end1:\n\n; NASM doesn't have a way to explicitly encode a 16bit or 32bit relative jump\n; Manually encode\ndb 0xE9 ; JMP\ndb 0x02 ; +0x00000002 (Just past the next JUMP instruction\ndb 0x00\ndb 0x00\ndb 0x00\n\n.back2:\njmp .end2\n\n.target2:\nmov rbx, 1\njmp .back2\n\n.end2:\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_EB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\"\n  }\n}\n%endif\n\nmov rsp, 0xe0000020\nmov rax, 0\n\n; NASM doesn't have a way to explicitly encode a 16bit or 32bit relative jump\n; Manually encode\ndb 0xEB ; JUMP\ndb 0x02 ; +0x02 (Just past the next JUMP instruction\n\n.back:\njmp .end\n\n.target:\nmov rax, 1\njmp .back\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_F5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\"\n  }\n}\n%endif\n\n; Set CF to known value\nclc\n\ncmc\n\n; Get CF\nsbb rax, rax\nand rax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_F8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0\"\n  }\n}\n%endif\n\nclc\n\n; Get CF\nsbb rax, rax\nand rax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_F9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\"\n  }\n}\n%endif\n\nstc\n\n; Get CF\nsbb rax, rax\nand rax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_FC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RDI\": \"0xE0000001\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nlea rdi, [rdx + 8 * 0]\n\nmov al, 0x0\ncld\nscasb\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_FD.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RDI\": \"0xE0000007\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nlea rdi, [rdx + 8 * 1]\n\nmov al, 0x0\nstd\nscasb\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_FF_0_Atomic16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4242434446464848\",\n    \"RBX\": \"0x4242434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4242434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\n; Test 1 byte offset within 4byte boundary\nlock inc word [r15 + 8 * 0 + 1]\n\n; Test 3 byte offset across 4byte boundary\nlock inc word [r15 + 8 * 0 + 3]\n\n; Test 7 byte offset across 8byte boundary\nlock inc word [r15 + 8 * 0 + 7]\n\n; Test 15 byte offset across 16byte boundary\nlock inc word [r15 + 8 * 0 + 15]\n\n; Test 63 byte offset across cacheline boundary\nlock inc word [r15 + 8 * 0 + 63]\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_FF_0_Atomic32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4242434446464748\",\n    \"RBX\": \"0x4242434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4242434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 3 byte offset across 4byte boundary\nlock inc dword [r15 + 8 * 0 + 3]\n\n; Test 7 byte offset across 8byte boundary\nlock inc dword [r15 + 8 * 0 + 7]\n\n; Test 15 byte offset across 16byte boundary\nlock inc dword [r15 + 8 * 0 + 15]\n\n; Test 63 byte offset across cacheline boundary\nlock inc dword [r15 + 8 * 0 + 63]\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_FF_0_Atomic64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4242434445464748\",\n    \"RBX\": \"0x4242434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4242434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 7 byte offset across 8byte boundary\nlock inc qword [r15 + 8 * 0 + 7]\n\n; Test 15 byte offset across 16byte boundary\nlock inc qword [r15 + 8 * 0 + 15]\n\n; Test 63 byte offset across cacheline boundary\nlock inc qword [r15 + 8 * 0 + 63]\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_FF_1_Atomic16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4042434444464648\",\n    \"RBX\": \"0x4042434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4042434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 1 byte offset within 4byte boundary\nlock dec word [r15 + 8 * 0 + 1]\n\n; Test 3 byte offset across 4byte boundary\nlock dec word [r15 + 8 * 0 + 3]\n\n; Test 7 byte offset across 8byte boundary\nlock dec word [r15 + 8 * 0 + 7]\n\n; Test 15 byte offset across 16byte boundary\nlock dec word [r15 + 8 * 0 + 15]\n\n; Test 63 byte offset across cacheline boundary\nlock dec word [r15 + 8 * 0 + 63]\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_FF_1_Atomic32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4042434444464748\",\n    \"RBX\": \"0x4042434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4042434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 3 byte offset across 4byte boundary\nlock dec dword [r15 + 8 * 0 + 3]\n\n; Test 7 byte offset across 8byte boundary\nlock dec dword [r15 + 8 * 0 + 7]\n\n; Test 15 byte offset across 16byte boundary\nlock dec dword [r15 + 8 * 0 + 15]\n\n; Test 63 byte offset across cacheline boundary\nlock dec dword [r15 + 8 * 0 + 63]\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/Primary_FF_1_Atomic64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4042434445464748\",\n    \"RBX\": \"0x4042434445464748\",\n    \"RCX\": \"0x4142434445464748\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x4042434445464748\",\n    \"RDI\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 7 byte offset across 8byte boundary\nlock dec qword [r15 + 8 * 0 + 7]\n\n; Test 15 byte offset across 16byte boundary\nlock dec qword [r15 + 8 * 0 + 15]\n\n; Test 63 byte offset across cacheline boundary\nlock dec qword [r15 + 8 * 0 + 63]\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/ROL_Flags.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x0000000001060004\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nlahf\nshr rax, 8\nand rax, 1\n\n; Merge in to results\nshl r15, 1\nor r15, rax\n\n%endmacro\n\nstc\ncfmerge\n\n; 8-bit\n; Shift 1 past size - Bit Set\nmov rbx, 0x800\nrol bl, 9\ncfmerge\n\n; Shift 1 past size - Bit unset\nmov rbx, 0x000\nrol bl, 9\ncfmerge\n\n; Shift size - Bit Set\nmov rbx, 0x80\nrol bl, 8\ncfmerge\n\n; Shift size - Bit unset\nmov rbx, 0x8000\nrol bl, 8\ncfmerge\n\n; 8-bit - wrapped\n; Shift 1 past size - Bit Set\nmov rbx, 0x01\nrol bl, 9\ncfmerge\n\n; Shift 1 past size - Bit unset\nmov rbx, 0xFFF2\nrol bl, 9\ncfmerge\n\n; Shift size - Bit Set\nmov rbx, 0xFF\nrol bl, 8\ncfmerge\n\n; Shift size - Bit unset\nmov rbx, 0xFF00\nrol bl, 8\ncfmerge\n\n\n; 16-bit\n; Shift 1 past size - Bit Set\nmov rbx, 0x80000\nrol bx, 17\ncfmerge\n\n; Shift 1 past size - Bit unset\nmov rbx, 0x00000\nrol bx, 17\ncfmerge\n\n; Shift size - Bit Set\nmov rbx, 0x8000\nrol bx, 16\ncfmerge\n\n; Shift size - Bit unset\nmov rbx, 0x80000\nrol bx, 16\ncfmerge\n\n; 32-bit\n; Shift 1 past size - Bit Set\nmov rbx, 0x800000000\nrol ebx, 33\ncfmerge\n\n; Shift 1 past size - Bit unset\nmov rbx, 0x000000000\nrol ebx, 33\ncfmerge\n\n; Shift size - Bit Set\nmov rbx, 0x80000000\nrol ebx, 32\ncfmerge\n\n; Shift size - Bit unset\nmov rbx, 0x800000000\nrol ebx, 32\ncfmerge\n\n; 32-bit - Wrapping\n; Shift 1 past size - Bit Set\nmov rbx, 0x02\nrol ebx, 33\ncfmerge\n\n; Shift 1 past size - Bit unset\nmov rbx, 0x01\nrol ebx, 33\ncfmerge\n\n; Shift size - Bit Set\nmov rbx, 0x1\nrol ebx, 32\ncfmerge\n\n; Shift size - Bit unset\nmov rbx, 0x02\nrol ebx, 32\ncfmerge\n\n; 64-bit\n; Shift 1 past size - Bit Set\nmov rbx, 0x02\nrol rbx, 65\ncfmerge\n\n; Shift 1 past size - Bit unset\nmov rbx, 0x8000000000000000\nrol rbx, 65\ncfmerge\n\n; Shift size - Bit Set\nmov rbx, 0x1\nrol rbx, 64\ncfmerge\n\n; Shift size - Bit unset\nmov rbx, 0x02\nrol rbx, 64\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/ROL_OF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x00000000000000aa\"\n  }\n}\n%endif\n\n%macro clearof 0\nmov r12, 0\nror r12, 1\n%endmacro\n\n%macro ofmerge 0\nmov r14, 0\nmov r13, 1\ncmovo r14, r13\n\nor r15, r14\nshl r15, 1\n%endmacro\n\nmov r15, 0\nmov r14, 1\n\n; 1 bit rotate\n; rol OF = XOR of LSB and MSB after rotate\nclearof\nmov rax, 0\nmov rcx, 1\nrol rax, cl\nofmerge\n\nclearof\nmov rax, 0x8000000000000000\nmov rcx, 1\nrol rax, cl\nofmerge\n\nclearof\nmov rax, 0xC000000000000000\nmov rcx, 1\nrol rax, cl\nofmerge\n\nclearof\nmov rax, 0x4000000000000000\nmov rcx, 1\nrol rax, cl\nofmerge\n\nclearof\nmov rax, 0\nrol rax, 1\nofmerge\n\nclearof\nmov rax, 0x8000000000000000\nrol rax, 1\nofmerge\n\nclearof\nmov rax, 0xC000000000000000\nrol rax, 1\nofmerge\n\nclearof\nmov rax, 0x4000000000000000\nrol rax, 1\nofmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/ROR_Flags.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x00000000012a2040\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nlahf\nshr rax, 8\nand rax, 1\n\n; Merge in to results\nshl r15, 1\nor r15, rax\n\n%endmacro\n\nstc\ncfmerge\n\n; 8-bit\n; Shift 1 past size - Bit Set\nmov rbx, 0x800\nror bl, 9\ncfmerge\n\n; Shift 1 past size - Bit unset\nmov rbx, 0x000\nror bl, 9\ncfmerge\n\n; Shift size - Bit Set\nmov rbx, 0x80\nror bl, 8\ncfmerge\n\n; Shift size - Bit unset\nmov rbx, 0x8000\nror bl, 8\ncfmerge\n\n; 8-bit - wrapped\n; Shift 1 past size - Bit Set\nmov rbx, 0x01\nror bl, 9\ncfmerge\n\n; Shift 1 past size - Bit unset\nmov rbx, 0xFFF2\nror bl, 9\ncfmerge\n\n; Shift size - Bit Set\nmov rbx, 0xFF\nror bl, 8\ncfmerge\n\n; Shift size - Bit unset\nmov rbx, 0xFF00\nror bl, 8\ncfmerge\n\n\n; 16-bit\n; Shift 1 past size - Bit Set\nmov rbx, 0x80000\nror bx, 17\ncfmerge\n\n; Shift 1 past size - Bit unset\nmov rbx, 0x00000\nror bx, 17\ncfmerge\n\n; Shift size - Bit Set\nmov rbx, 0x8000\nror bx, 16\ncfmerge\n\n; Shift size - Bit unset\nmov rbx, 0x80000\nror bx, 16\ncfmerge\n\n; 32-bit\n; Shift 1 past size - Bit Set\nmov rbx, 0x800000000\nror ebx, 33\ncfmerge\n\n; Shift 1 past size - Bit unset\nmov rbx, 0x000000000\nror ebx, 33\ncfmerge\n\n; Shift size - Bit Set\nmov rbx, 0x80000000\nror ebx, 32\ncfmerge\n\n; Shift size - Bit unset\nmov rbx, 0x800000000\nror ebx, 32\ncfmerge\n\n; 32-bit - Wrapping\n; Shift 1 past size - Bit Set\nmov rbx, 0x02\nror ebx, 33\ncfmerge\n\n; Shift 1 past size - Bit unset\nmov rbx, 0x01\nror ebx, 33\ncfmerge\n\n; Shift size - Bit Set\nmov rbx, 0x1\nror ebx, 32\ncfmerge\n\n; Shift size - Bit unset\nmov rbx, 0x02\nror ebx, 32\ncfmerge\n\n; 64-bit\n; Shift 1 past size - Bit Set\nmov rbx, 0x02\nror rbx, 65\ncfmerge\n\n; Shift 1 past size - Bit unset\nmov rbx, 0x8000000000000000\nror rbx, 65\ncfmerge\n\n; Shift size - Bit Set\nmov rbx, 0x1\nror rbx, 64\ncfmerge\n\n; Shift size - Bit unset\nmov rbx, 0x02\nror rbx, 64\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/ROR_OF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x00000000000000cc\"\n  }\n}\n%endif\n\n%macro clearof 0\nmov r12, 0\nror r12, 1\n%endmacro\n\n%macro ofmerge 0\nmov r14, 0\nmov r13, 1\ncmovo r14, r13\n\nor r15, r14\nshl r15, 1\n%endmacro\n\nmov r15, 0\nmov r14, 1\n\n; 1 bit rotate\n; ror OF = XOR or two most significant bits of result\nclearof\nmov rax, 0\nmov rcx, 1\nror rax, cl\nofmerge\n\nclearof\nmov rax, 1\nmov rcx, 1\nror rax, cl\nofmerge\n\nclearof\nmov rax, 0x8000000000000000\nmov rcx, 1\nror rax, cl\nofmerge\n\nclearof\nmov rax, 0x8000000000000001\nmov rcx, 1\nror rax, cl\nofmerge\n\nclearof\nmov rax, 0\nror rax, 1\nofmerge\n\nclearof\nmov rax, 1\nror rax, 1\nofmerge\n\nclearof\nmov rax, 0x8000000000000000\nror rax, 1\nofmerge\n\nclearof\nmov rax, 0x8000000000000001\nror rax, 1\nofmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/SHL.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R14\": \"0xffffffffffffffff\",\n    \"R13\": \"0xfffffffffffffffe\",\n    \"R12\": \"0xfffffffffffffffc\",\n    \"R11\": \"0xfffffffffffffff8\",\n    \"R10\": \"0xfffffffffffffff0\",\n    \"R9\": \"0xffffffffffffffe0\",\n    \"R8\": \"0xffffffffffffffc0\",\n    \"RBP\": \"0xffffffffffffff80\",\n    \"RSP\": \"0xffffffffffffff00\",\n    \"RDI\": \"0xffffffffffffff00\",\n    \"RSI\": \"0xffffffffffffff00\"\n  }\n}\n%endif\n\nmov r14, -1\nmov r13, -1\nmov r12, -1\nmov r11, -1\nmov r10, -1\nmov r9, -1\nmov r8, -1\nmov rbp, -1\nmov rsp, -1\nmov rdi, -1\nmov rsi, -1\n\nshl r14b, 0\nshl r13b, 1\nshl r12b, 2\nshl r11b, 3\nshl r10b, 4\nshl r9b, 5\nshl r8b, 6\nshl bpl, 7\nshl spl, 8\nshl dil, 9\nshl sil, 10\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Primary/SHR.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R14\": \"0xffffffffffffffff\",\n    \"R13\": \"0xffffffffffffff7f\",\n    \"R12\": \"0xffffffffffffff3f\",\n    \"R11\": \"0xffffffffffffff1f\",\n    \"R10\": \"0xffffffffffffff0f\",\n    \"R9\": \"0xffffffffffffff07\",\n    \"R8\": \"0xffffffffffffff03\",\n    \"RBP\": \"0xffffffffffffff01\",\n    \"RSP\": \"0xffffffffffffff00\",\n    \"RDI\": \"0xffffffffffffff00\",\n    \"RSI\": \"0xffffffffffffff00\"\n  }\n}\n%endif\n\nmov r14, -1\nmov r13, -1\nmov r12, -1\nmov r11, -1\nmov r10, -1\nmov r9, -1\nmov r8, -1\nmov rbp, -1\nmov rsp, -1\nmov rdi, -1\nmov rsi, -1\n\nshr r14b, 0\nshr r13b, 1\nshr r12b, 2\nshr r11b, 3\nshr r10b, 4\nshr r9b, 5\nshr r8b, 6\nshr bpl, 7\nshr spl, 8\nshr dil, 9\nshr sil, 10\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_80_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546A848\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nadd byte [rdx + 8 * 0 + 1], 0x61\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_80_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445466748\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nor byte [rdx + 8 * 0 + 1], 0x61\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_80_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445A8A848\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nclc\nadc byte [rdx + 8 * 0 + 1], 0x61\n\nstc\nadc byte [rdx + 8 * 0 + 2], 0x61\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_80_02_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445A8A848\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nclc\nlock adc byte [rdx + 8 * 0 + 1], 0x61\n\nstc\nlock adc byte [rdx + 8 * 0 + 2], 0x61\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_80_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445E4E648\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nclc\nsbb byte [rdx + 8 * 0 + 1], 0x61\n\nstc\nsbb byte [rdx + 8 * 0 + 2], 0x61\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_80_03_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445E4E648\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nclc\nlock sbb byte [rdx + 8 * 0 + 1], 0x61\n\nstc\nlock sbb byte [rdx + 8 * 0 + 2], 0x61\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_80_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464148\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nand byte [rdx + 8 * 0 + 1], 0x61\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_80_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546E648\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nsub byte [rdx + 8 * 0 + 1], 0x61\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_80_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445462648\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nxor byte [rdx + 8 * 0 + 1], 0x61\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_80_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445468348\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\ncmp byte [rdx + 8 * 0 + 1], 0x61\n; cmp = 0x47 - 0x61 = 0xE6\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\nmov rax, [rdx + 8 * 0]\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_81_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344A6A84748\",\n    \"RBX\": \"0x51525354B6B8BABC\",\n    \"RCX\": \"0x61626364C6C8CACC\",\n    \"RDX\": \"0x6162636465666668\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 3], rax\n\nadd  word [rdx + 8 * 0 + 2], 0x6162\nadd dword [rdx + 8 * 1 + 0], 0x61626364\nadd qword [rdx + 8 * 2 + 0], 0x61626364\n\nadd qword [rdx + 8 * 3 + 0], -256\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_81_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434465664748\",\n    \"RBX\": \"0x515253547576777C\",\n    \"RCX\": \"0x616263646566676C\",\n    \"RDX\": \"0xFFFFFFFFFFFFFF68\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 3], rax\n\nor  word [rdx + 8 * 0 + 2], 0x6162\nor dword [rdx + 8 * 1 + 0], 0x61626364\nor qword [rdx + 8 * 2 + 0], 0x61626364\n\nor qword [rdx + 8 * 3 + 0], -256\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\n\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_81_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142A4A7A6A84748\",\n    \"RBX\": \"0x51525354181B1E21\",\n    \"RCX\": \"0x61626365282B2E31\",\n    \"RDX\": \"0x6162636465666569\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 3], rax\n\nclc\nadc word [rdx + 8 * 0 + 2], 0x6162\nclc\nadc dword [rdx + 8 * 1 + 0], 0x61626364\nclc\nadc qword [rdx + 8 * 2 + 0], 0x61626364\nclc\nadc qword [rdx + 8 * 3 + 0], -256\n\nstc\nadc word [rdx + 8 * 0 + 4], 0x6162\nstc\nadc dword [rdx + 8 * 1 + 0], 0x61626364\nstc\nadc qword [rdx + 8 * 2 + 0], 0x61626364\nstc\nadc qword [rdx + 8 * 3 + 0], -256\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_81_02_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142A4A7A6A84748\",\n    \"RBX\": \"0x51525354181B1E21\",\n    \"RCX\": \"0x61626365282B2E31\",\n    \"RDX\": \"0x6162636465666569\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 3], rax\n\nclc\nlock adc word [rdx + 8 * 0 + 2], 0x6162\nclc\nlock adc dword [rdx + 8 * 1 + 0], 0x61626364\nclc\nlock adc qword [rdx + 8 * 2 + 0], 0x61626364\nclc\nlock adc qword [rdx + 8 * 3 + 0], -256\n\nstc\nlock adc word [rdx + 8 * 0 + 4], 0x6162\nstc\nlock adc dword [rdx + 8 * 1 + 0], 0x61626364\nstc\nlock adc qword [rdx + 8 * 2 + 0], 0x61626364\nstc\nlock adc qword [rdx + 8 * 3 + 0], -256\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_81_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142E1E1E3E44748\",\n    \"RBX\": \"0x515253549291908F\",\n    \"RCX\": \"0x61626363A2A1A09F\",\n    \"RDX\": \"0x6162636465666967\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 3], rax\n\nclc\nsbb  word [rdx + 8 * 0 + 2], 0x6162\nclc\nsbb dword [rdx + 8 * 1 + 0], 0x61626364\nclc\nsbb qword [rdx + 8 * 2 + 0], 0x61626364\nclc\nsbb qword [rdx + 8 * 3 + 0], -256\n\nstc\nsbb  word [rdx + 8 * 0 + 4], 0x6162\nstc\nsbb dword [rdx + 8 * 1 + 0], 0x61626364\nstc\nsbb qword [rdx + 8 * 2 + 0], 0x61626364\nstc\nsbb qword [rdx + 8 * 3 + 0], -256\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_81_03_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142E1E1E3E44748\",\n    \"RBX\": \"0x515253549291908F\",\n    \"RCX\": \"0x61626363A2A1A09F\",\n    \"RDX\": \"0x6162636465666967\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 3], rax\n\nclc\nlock sbb  word [rdx + 8 * 0 + 2], 0x6162\nclc\nlock sbb dword [rdx + 8 * 1 + 0], 0x61626364\nclc\nlock sbb qword [rdx + 8 * 2 + 0], 0x61626364\nclc\nlock sbb qword [rdx + 8 * 3 + 0], -256\n\nstc\nlock sbb  word [rdx + 8 * 0 + 4], 0x6162\nstc\nlock sbb dword [rdx + 8 * 1 + 0], 0x61626364\nstc\nlock sbb qword [rdx + 8 * 2 + 0], 0x61626364\nstc\nlock sbb qword [rdx + 8 * 3 + 0], -256\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_81_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434441424748\",\n    \"RBX\": \"0x5152535441424340\",\n    \"RCX\": \"0x0000000061626360\",\n    \"RDX\": \"0x6162636465666700\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 3], rax\n\nand  word [rdx + 8 * 0 + 2], 0x6162\nand dword [rdx + 8 * 1 + 0], 0x61626364\nand qword [rdx + 8 * 2 + 0], 0x61626364\nand qword [rdx + 8 * 3 + 0], -256\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\n\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_81_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344E3E44748\",\n    \"RBX\": \"0x51525354F3F3F3F4\",\n    \"RCX\": \"0x6162636404040404\",\n    \"RDX\": \"0x6162636465666868\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 3], rax\n\nsub  word [rdx + 8 * 0 + 2], 0x6162\nsub dword [rdx + 8 * 1 + 0], 0x61626364\nsub qword [rdx + 8 * 2 + 0], 0x61626364\nsub qword [rdx + 8 * 3 + 0], -256\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_81_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434424244748\",\n    \"RBX\": \"0x515253543434343C\",\n    \"RCX\": \"0x616263640404040C\",\n    \"RDX\": \"0x9E9D9C9B9A999868\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 3], rax\n\nxor  word [rdx + 8 * 0 + 2], 0x6162\nxor dword [rdx + 8 * 1 + 0], 0x61626364\nxor qword [rdx + 8 * 2 + 0], 0x61626364\nxor qword [rdx + 8 * 3 + 0], -256\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_81_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x8700\",\n    \"RBX\": \"0x8300\",\n    \"RCX\": \"0x0200\",\n    \"RSI\": \"0x0300\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 3], rax\n\ncmp qword [rdx + 8 * 3 + 0], -256\n; cmp = 0x6162636465666768 - -256(0xFFFFFFFFFFFF00) = 0x6162636465666512\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000011\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\nmov rsi, rax\n\ncmp qword [rdx + 8 * 2 + 0], 0x61626364\n; cmp = 0x6162636465666768- 0x61626364 = 0x6162636404040404\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000010\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\nmov rcx, rax\n\ncmp dword [rdx + 8 * 1 + 0], 0x61626364\n; cmp = 0x55565758 - 0x61626364 = 0xF3F3F3F4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\nmov rbx, rax\n\ncmp word [rdx + 8 * 0 + 2], 0x6162\n; cmp = 0x4546 - 0x6162 = 0xE3E4\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000111\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_83_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464729\",\n    \"RBX\": \"0x5152535455565739\",\n    \"RCX\": \"0x6162636465666749\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nadd  word [rdx + 8 * 0 + 0], -31\nadd dword [rdx + 8 * 1 + 0], -31\nadd qword [rdx + 8 * 2 + 0], -31\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_83_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546FFE9\",\n    \"RBX\": \"0x51525354FFFFFFF9\",\n    \"RCX\": \"0xFFFFFFFFFFFFFFE9\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nor  word [rdx + 8 * 0 + 0], -31\nor dword [rdx + 8 * 1 + 0], -31\nor qword [rdx + 8 * 2 + 0], -31\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_83_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142432645274748\",\n    \"RBX\": \"0x515253545556571B\",\n    \"RCX\": \"0x616263646566672B\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nclc\nadc word [rdx + 8 * 0 + 2], -31\nclc\nadc dword [rdx + 8 * 1 + 0], -31\nclc\nadc qword [rdx + 8 * 2 + 0], -31\n\nstc\nadc word [rdx + 8 * 0 + 4], -31\nstc\nadc dword [rdx + 8 * 1 + 0], -31\nstc\nadc qword [rdx + 8 * 2 + 0], -31\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_83_02_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142432645274748\",\n    \"RBX\": \"0x515253545556571B\",\n    \"RCX\": \"0x616263646566672B\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nclc\nlock adc word [rdx + 8 * 0 + 2], -31\nclc\nlock adc dword [rdx + 8 * 1 + 0], -31\nclc\nlock adc qword [rdx + 8 * 2 + 0], -31\n\nstc\nlock adc word [rdx + 8 * 0 + 4], -31\nstc\nlock adc dword [rdx + 8 * 1 + 0], -31\nstc\nlock adc qword [rdx + 8 * 2 + 0], -31\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_83_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142436245654748\",\n    \"RBX\": \"0x5152535455565795\",\n    \"RCX\": \"0x61626364656667A5\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nclc\nsbb word [rdx + 8 * 0 + 2], -31\nclc\nsbb dword [rdx + 8 * 1 + 0], -31\nclc\nsbb qword [rdx + 8 * 2 + 0], -31\n\nstc\nsbb word [rdx + 8 * 0 + 4], -31\nstc\nsbb dword [rdx + 8 * 1 + 0], -31\nstc\nsbb qword [rdx + 8 * 2 + 0], -31\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_83_03_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142436245654748\",\n    \"RBX\": \"0x5152535455565795\",\n    \"RCX\": \"0x61626364656667A5\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nclc\nlock sbb word [rdx + 8 * 0 + 2], -31\nclc\nlock sbb dword [rdx + 8 * 1 + 0], -31\nclc\nlock sbb qword [rdx + 8 * 2 + 0], -31\n\nstc\nlock sbb word [rdx + 8 * 0 + 4], -31\nstc\nlock sbb dword [rdx + 8 * 1 + 0], -31\nstc\nlock sbb qword [rdx + 8 * 2 + 0], -31\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_83_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464740\",\n    \"RBX\": \"0x5152535455565740\",\n    \"RCX\": \"0x6162636465666760\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nand  word [rdx + 8 * 0 + 0], -31\nand dword [rdx + 8 * 1 + 0], -31\nand qword [rdx + 8 * 2 + 0], -31\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_83_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464767\",\n    \"RBX\": \"0x5152535455565777\",\n    \"RCX\": \"0x6162636465666787\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nsub  word [rdx + 8 * 0 + 0], -31\nsub dword [rdx + 8 * 1 + 0], -31\nsub qword [rdx + 8 * 2 + 0], -31\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_83_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546B8A9\",\n    \"RBX\": \"0x51525354AAA9A8B9\",\n    \"RCX\": \"0x9E9D9C9B9A999889\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nxor  word [rdx + 8 * 0 + 0], -31\nxor dword [rdx + 8 * 1 + 0], -31\nxor qword [rdx + 8 * 2 + 0], -31\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/1_83_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0700\",\n    \"RBX\": \"0x0700\",\n    \"RCX\": \"0x0700\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\ncmp qword [rdx + 8 * 2 + 0], -31\n; cmp = 0x6162636465666768 - -31 = 0x6162636465666787\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000111\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\nmov rcx, rax\n\ncmp dword [rdx + 8 * 1 + 0], -31\n; cmp = 0x55565758 - -31 = 0x55565777\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000111\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\nmov rbx, rax\n\ncmp word [rdx + 8 * 0 + 2], -31\n; cmp = 0x4546 - -31 = 0x4577\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000111\n; OF: LAHF doesn't load - 0\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C0_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445468E48\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nrol byte [rdx + 8 * 0 + 1], 0x61\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C0_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546A348\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nror byte [rdx + 8 * 0 + 1], 0x61\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C0_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x06\",\n    \"RCX\": \"0x04\",\n    \"RDX\": \"0x02\",\n    \"RSI\": \"0x00\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x01\nmov rcx, 0x01\nmov rdx, 0x40\nmov rsi, 0x40\n\nstc\nrcl bl, 2\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcl cl, 2\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcl dl, 2\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcl sil, 2\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C0_02_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x0006\",\n    \"RCX\": \"0x0004\",\n    \"RDX\": \"0x0002\",\n    \"RSI\": \"0x0000\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x0001\nmov rcx, 0x0001\nmov rdx, 0x4000\nmov rsi, 0x4000\n\nstc\nrcl bx, 2\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcl cx, 2\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcl dx, 2\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcl si, 2\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C0_02_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x00000006\",\n    \"RCX\": \"0x00000004\",\n    \"RDX\": \"0x00000002\",\n    \"RSI\": \"0x00000000\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x00000001\nmov rcx, 0x00000001\nmov rdx, 0x40000000\nmov rsi, 0x40000000\n\nstc\nrcl ebx, 2\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcl ecx, 2\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcl edx, 2\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcl esi, 2\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C0_02_4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x0000000000000006\",\n    \"RCX\": \"0x0000000000000004\",\n    \"RDX\": \"0x0000000000000002\",\n    \"RSI\": \"0x0000000000000000\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x0000000000000001\nmov rcx, 0x0000000000000001\nmov rdx, 0x4000000000000000\nmov rsi, 0x4000000000000000\n\nstc\nrcl rbx, 2\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcl rcx, 2\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcl rdx, 2\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcl rsi, 2\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C0_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x40\",\n    \"RCX\": \"0x00\",\n    \"RDX\": \"0x60\",\n    \"RSI\": \"0x20\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x1\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x02\nmov rcx, 0x02\nmov rdx, 0x80\nmov rsi, 0x80\n\nstc\nrcr bl, 2\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcr cl, 2\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcr dl, 2\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcr sil, 2\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C0_03_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x4000\",\n    \"RCX\": \"0x0000\",\n    \"RDX\": \"0x6000\",\n    \"RSI\": \"0x2000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x1\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x0002\nmov rcx, 0x0002\nmov rdx, 0x8000\nmov rsi, 0x8000\n\nstc\nrcr bx, 2\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcr cx, 2\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcr dx, 2\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcr si, 2\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C0_03_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x40000000\",\n    \"RCX\": \"0x00000000\",\n    \"RDX\": \"0x60000000\",\n    \"RSI\": \"0x20000000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x1\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x00000002\nmov rcx, 0x00000002\nmov rdx, 0x80000000\nmov rsi, 0x80000000\n\nstc\nrcr ebx, 2\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcr ecx, 2\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcr edx, 2\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcr esi, 2\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C0_03_4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x4000000000000000\",\n    \"RCX\": \"0x0000000000000000\",\n    \"RDX\": \"0x6000000000000000\",\n    \"RSI\": \"0x2000000000000000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x1\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x0000000000000002\nmov rcx, 0x0000000000000002\nmov rdx, 0x8000000000000000\nmov rsi, 0x8000000000000000\n\nstc\nrcr rbx, 2\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcr rcx, 2\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcr rdx, 2\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcr rsi, 2\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C0_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445468E48\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nshl byte [rdx + 8 * 0 + 1], 0x61\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C0_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445462348\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nshr byte [rdx + 8 * 0 + 1], 0x61\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C0_07.asm",
    "content": "\n%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445462348\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nsar byte [rdx + 8 * 0 + 1], 0x61\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C0_07_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x8300\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFE\"\n  }\n}\n%endif\n\n\nmov rax, 0\nmov rbx, 0xA142434445464748\nsar rbx, 62\nlahf\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000011\n\n; Mask out AF since it is undefined\nand rax, ~0x1000\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C1_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434415194748\",\n    \"RBX\": \"0x5152535455595D61\",\n    \"RCX\": \"0x95999da185898d91\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nrol  word [rdx + 8 * 0 + 2], 0x62\nrol dword [rdx + 8 * 1 + 0], 0x62\nrol qword [rdx + 8 * 2 + 0], 0x62\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C1_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434491514748\",\n    \"RBX\": \"0x51525354155595D6\",\n    \"RCX\": \"0x195999da185898d9\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nror  word [rdx + 8 * 0 + 2], 0x62\nror dword [rdx + 8 * 1 + 0], 0x62\nror qword [rdx + 8 * 2 + 0], 0x62\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C1_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434415184748\",\n    \"RBX\": \"0x5152535455595D60\",\n    \"RCX\": \"0x95999da000000000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nshl  word [rdx + 8 * 0 + 2], 0x62\nshl dword [rdx + 8 * 1 + 0], 0x62\nshl qword [rdx + 8 * 2 + 0], 0x62\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C1_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434411514748\",\n    \"RBX\": \"0x51525354155595D6\",\n    \"RCX\": \"0x00000000185898D9\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nshr  word [rdx + 8 * 0 + 2], 0x62\nshr dword [rdx + 8 * 1 + 0], 0x62\nshr qword [rdx + 8 * 2 + 0], 0x62\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C1_05_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0300\",\n    \"RBX\": \"0x2\"\n  }\n}\n%endif\n\n\nmov rax, 0\nmov rbx, 0xA142434445464748\nshr rbx, 62\nlahf\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000011\n\n; Mask out AF since it is undefined\nand rax, ~0x1000\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_C1_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434411514748\",\n    \"RBX\": \"0x51525354155595D6\",\n    \"RCX\": \"0x00000000185898D9\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nsar  word [rdx + 8 * 0 + 2], 0x62\nsar dword [rdx + 8 * 1 + 0], 0x62\nsar qword [rdx + 8 * 2 + 0], 0x62\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D0_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445468E48\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nrol byte [rdx + 8 * 0 + 1], 1\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D0_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546A348\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nror byte [rdx + 8 * 0 + 1], 1\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D0_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x03\",\n    \"RCX\": \"0x02\",\n    \"RDX\": \"0x81\",\n    \"RSI\": \"0x00\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x01\nmov rcx, 0x01\nmov rdx, 0x40\nmov rsi, 0x80\n\nstc\nrcl bl, 1\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcl cl, 1\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcl dl, 1\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcl sil, 1\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D0_02_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x03\",\n    \"RCX\": \"0x02\",\n    \"RDX\": \"0x81\",\n    \"RSI\": \"0x00\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x01\nmov rcx, 0x01\nmov rdx, 0x40\nmov rsi, 0x80\nmov r15, 1\n\nstc\nrcl bl, 1\nmov r8, 0\ncmovo r8, r15 ; We only care about OF here\n\nclc\nrcl cl, 1\nmov r9, 0\ncmovo r9, r15 ; We only care about OF here\n\nstc\nrcl dl, 1\nmov r10, 0\ncmovo r10, r15 ; We only care about OF here\n\nclc\nrcl sil, 1\nmov r11, 0\ncmovo r11, r15 ; We only care about OF here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D0_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x80\",\n    \"RCX\": \"0x00\",\n    \"RDX\": \"0xC0\",\n    \"RSI\": \"0x40\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x1\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x01\nmov rcx, 0x01\nmov rdx, 0x80\nmov rsi, 0x80\n\nstc\nrcr bl, 1\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcr cl, 1\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcr dl, 1\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcr sil, 1\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D0_03_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x80\",\n    \"RCX\": \"0x00\",\n    \"RDX\": \"0xC0\",\n    \"RSI\": \"0x40\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x01\nmov rcx, 0x01\nmov rdx, 0x80\nmov rsi, 0x80\nmov r15, 1\n\nstc\nrcr bl, 1\nmov r8, 0\ncmovo r8, r15 ; We only care about OF here\n\nclc\nrcr cl, 1\nmov r9, 0\ncmovo r9, r15 ; We only care about OF here\n\nstc\nrcr dl, 1\nmov r10, 0\ncmovo r10, r15 ; We only care about OF here\n\nclc\nrcr sil, 1\nmov r11, 0\ncmovo r11, r15 ; We only care about OF here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D0_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445468E48\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nshl byte [rdx + 8 * 0 + 1], 1\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D0_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445462348\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nshr byte [rdx + 8 * 0 + 1], 1\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D0_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445462348\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nsar byte [rdx + 8 * 0 + 1], 1\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243448A8C4748\",\n    \"RBX\": \"0x51525354AAACAEB0\",\n    \"RCX\": \"0xC2C4C6C8CACCCED0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nrol  word [rdx + 8 * 0 + 2], 1\nrol dword [rdx + 8 * 1 + 0], 1\nrol qword [rdx + 8 * 2 + 0], 1\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434422A34748\",\n    \"RBX\": \"0x515253542AAB2BAC\",\n    \"RCX\": \"0x30B131B232B333B4\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nror  word [rdx + 8 * 0 + 2], 1\nror dword [rdx + 8 * 1 + 0], 1\nror qword [rdx + 8 * 2 + 0], 1\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x0003\",\n    \"RCX\": \"0x0002\",\n    \"RDX\": \"0x0001\",\n    \"RSI\": \"0x0000\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x0001\nmov rcx, 0x0001\nmov rdx, 0x8000\nmov rsi, 0x8000\n\nstc\nrcl bx, 1\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcl cx, 1\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcl dx, 1\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcl si, 1\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_02_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x00000003\",\n    \"RCX\": \"0x00000002\",\n    \"RDX\": \"0x00000001\",\n    \"RSI\": \"0x00000000\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x00000001\nmov rcx, 0x00000001\nmov rdx, 0x80000000\nmov rsi, 0x80000000\n\nstc\nrcl ebx, 1\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcl ecx, 1\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcl edx, 1\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcl esi, 1\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_02_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x0000000000000003\",\n    \"RCX\": \"0x0000000000000002\",\n    \"RDX\": \"0x0000000000000001\",\n    \"RSI\": \"0x0000000000000000\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x0000000000000001\nmov rcx, 0x0000000000000001\nmov rdx, 0x8000000000000000\nmov rsi, 0x8000000000000000\n\nstc\nrcl rbx, 1\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcl rcx, 1\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcl rdx, 1\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcl rsi, 1\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_02_4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x0003\",\n    \"RCX\": \"0x0002\",\n    \"RDX\": \"0x0001\",\n    \"RSI\": \"0x0000\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x0001\nmov rcx, 0x0001\nmov rdx, 0x8000\nmov rsi, 0x8000\nmov r15, 1\n\nstc\nrcl bx, 1\nmov r8, 0\ncmovo r8, r15 ; We only care about OF here\n\nclc\nrcl cx, 1\nmov r9, 0\ncmovo r9, r15 ; We only care about OF here\n\nstc\nrcl dx, 1\nmov r10, 0\ncmovo r10, r15 ; We only care about OF here\n\nclc\nrcl si, 1\nmov r11, 0\ncmovo r11, r15 ; We only care about OF here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_02_5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x00000003\",\n    \"RCX\": \"0x00000002\",\n    \"RDX\": \"0x00000001\",\n    \"RSI\": \"0x00000000\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x00000001\nmov rcx, 0x00000001\nmov rdx, 0x80000000\nmov rsi, 0x80000000\nmov r15, 1\n\nstc\nrcl ebx, 1\nmov r8, 0\ncmovo r8, r15 ; We only care about OF here\n\nclc\nrcl ecx, 1\nmov r9, 0\ncmovo r9, r15 ; We only care about OF here\n\nstc\nrcl edx, 1\nmov r10, 0\ncmovo r10, r15 ; We only care about OF here\n\nclc\nrcl esi, 1\nmov r11, 0\ncmovo r11, r15 ; We only care about OF here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_02_6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x0000000000000003\",\n    \"RCX\": \"0x0000000000000002\",\n    \"RDX\": \"0x0000000000000001\",\n    \"RSI\": \"0x0000000000000000\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x0000000000000001\nmov rcx, 0x0000000000000001\nmov rdx, 0x8000000000000000\nmov rsi, 0x8000000000000000\nmov r15, 1\n\nstc\nrcl rbx, 1\nmov r8, 0\ncmovo r8, r15 ; We only care about OF here\n\nclc\nrcl rcx, 1\nmov r9, 0\ncmovo r9, r15 ; We only care about OF here\n\nstc\nrcl rdx, 1\nmov r10, 0\ncmovo r10, r15 ; We only care about OF here\n\nclc\nrcl rsi, 1\nmov r11, 0\ncmovo r11, r15 ; We only care about OF here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x8000\",\n    \"RCX\": \"0x0000\",\n    \"RDX\": \"0xC000\",\n    \"RSI\": \"0x4000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x1\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x0001\nmov rcx, 0x0001\nmov rdx, 0x8000\nmov rsi, 0x8000\n\nstc\nrcr bx, 1\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcr cx, 1\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcr dx, 1\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcr si, 1\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_03_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x80000000\",\n    \"RCX\": \"0x00000000\",\n    \"RDX\": \"0xC0000000\",\n    \"RSI\": \"0x40000000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x1\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x00000001\nmov rcx, 0x00000001\nmov rdx, 0x80000000\nmov rsi, 0x80000000\n\nstc\nrcr ebx, 1\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcr ecx, 1\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcr edx, 1\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcr esi, 1\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_03_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x8000000000000000\",\n    \"RCX\": \"0x0000000000000000\",\n    \"RDX\": \"0xC000000000000000\",\n    \"RSI\": \"0x4000000000000000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x1\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x0000000000000001\nmov rcx, 0x0000000000000001\nmov rdx, 0x8000000000000000\nmov rsi, 0x8000000000000000\n\nstc\nrcr rbx, 1\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcr rcx, 1\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcr rdx, 1\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcr rsi, 1\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_03_4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x8000\",\n    \"RCX\": \"0x0000\",\n    \"RDX\": \"0xC000\",\n    \"RSI\": \"0x4000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x0001\nmov rcx, 0x0001\nmov rdx, 0x8000\nmov rsi, 0x8000\nmov r15, 1\n\nstc\nrcr bx, 1\nmov r8, 0\ncmovo r8, r15 ; We only care about OF here\n\nclc\nrcr cx, 1\nmov r9, 0\ncmovo r9, r15 ; We only care about OF here\n\nstc\nrcr dx, 1\nmov r10, 0\ncmovo r10, r15 ; We only care about OF here\n\nclc\nrcr si, 1\nmov r11, 0\ncmovo r11, r15 ; We only care about OF here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_03_5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x80000000\",\n    \"RCX\": \"0x00000000\",\n    \"RDX\": \"0xC0000000\",\n    \"RSI\": \"0x40000000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x00000001\nmov rcx, 0x00000001\nmov rdx, 0x80000000\nmov rsi, 0x80000000\nmov r15, 1\n\nstc\nrcr ebx, 1\nmov r8, 0\ncmovo r8, r15 ; We only care about OF here\n\nclc\nrcr ecx, 1\nmov r9, 0\ncmovo r9, r15 ; We only care about OF here\n\nstc\nrcr edx, 1\nmov r10, 0\ncmovo r10, r15 ; We only care about OF here\n\nclc\nrcr esi, 1\nmov r11, 0\ncmovo r11, r15 ; We only care about OF here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_03_6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x8000000000000000\",\n    \"RCX\": \"0x0000000000000000\",\n    \"RDX\": \"0xC000000000000000\",\n    \"RSI\": \"0x4000000000000000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x0000000000000001\nmov rcx, 0x0000000000000001\nmov rdx, 0x8000000000000000\nmov rsi, 0x8000000000000000\nmov r15, 1\n\nstc\nrcr rbx, 1\nmov r8, 0\ncmovo r8, r15 ; We only care about OF here\n\nclc\nrcr rcx, 1\nmov r9, 0\ncmovo r9, r15 ; We only care about OF here\n\nstc\nrcr rdx, 1\nmov r10, 0\ncmovo r10, r15 ; We only care about OF here\n\nclc\nrcr rsi, 1\nmov r11, 0\ncmovo r11, r15 ; We only care about OF here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243448A8C4748\",\n    \"RBX\": \"0x51525354AAACAEB0\",\n    \"RCX\": \"0xC2C4C6C8CACCCED0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nshl  word [rdx + 8 * 0 + 2], 1\nshl dword [rdx + 8 * 1 + 0], 1\nshl qword [rdx + 8 * 2 + 0], 1\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434422A34748\",\n    \"RBX\": \"0x515253542AAB2BAC\",\n    \"RCX\": \"0x30B131B232B333B4\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nshr  word [rdx + 8 * 0 + 2], 1\nshr dword [rdx + 8 * 1 + 0], 1\nshr qword [rdx + 8 * 2 + 0], 1\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434422A34748\",\n    \"RBX\": \"0x515253542AAB2BAC\",\n    \"RCX\": \"0x30B131B232B333B4\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nsar  word [rdx + 8 * 0 + 2], 1\nsar dword [rdx + 8 * 1 + 0], 1\nsar qword [rdx + 8 * 2 + 0], 1\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D1_07_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414141414141FFFF\",\n    \"RBX\": \"0x00000000FFFFFFFF\",\n    \"RDX\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RSI\": \"0x42424242424242FF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4141414141418000\nmov rbx, 0x80000000\nmov rdx, 0x8000000000000000\nmov rsi, 0x4242424242424280\n\nmov cl, 7\nsar sil, cl\n\nmov cl, 15\nsar ax, cl\n\nmov cl, 31\nsar ebx, cl\n\nmov cl, 63\nsar rdx, cl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D2_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x06\",\n    \"RDI\": \"0x04\",\n    \"RDX\": \"0x02\",\n    \"RSI\": \"0x00\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x01\nmov rdi, 0x01\nmov rdx, 0x40\nmov rsi, 0x40\nmov rcx, 2\n\nstc\nrcl bl, cl\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcl dil, cl\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcl dl, cl\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcl sil, cl\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D2_02_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x03\",\n    \"RDI\": \"0x02\",\n    \"RDX\": \"0x01\",\n    \"RSI\": \"0x00\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x01\nmov rdi, 0x01\nmov rdx, 0x80\nmov rsi, 0x80\nmov rcx, 1\nmov r15, 1\n\nstc\nrcl bl, cl\nmov r8, 0\ncmovo r8, r15 ; We only care about OF here\n\nclc\nrcl dil, cl\nmov r9, 0\ncmovo r9, r15 ; We only care about OF here\n\nstc\nrcl dl, cl\nmov r10, 0\ncmovo r10, r15 ; We only care about OF here\n\nclc\nrcl sil, cl\nmov r11, 0\ncmovo r11, r15 ; We only care about OF here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D2_02_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x81\",\n    \"RDI\": \"0x01\",\n    \"RDX\": \"0xC0\",\n    \"RSI\": \"0x40\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x02\nmov rdi, 0x02\nmov rdx, 0x80\nmov rsi, 0x80\nmov rcx, 8 ; Tests wrapping around features\n\nstc\nrcl bl, cl\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcl dil, cl\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcl dl, cl\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcl sil, cl\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D2_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x40\",\n    \"RDI\": \"0x00\",\n    \"RDX\": \"0x60\",\n    \"RSI\": \"0x20\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x1\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x02\nmov rdi, 0x02\nmov rdx, 0x80\nmov rsi, 0x80\nmov rcx, 2\n\nstc\nrcr bl, cl\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcr dil, cl\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcr dl, cl\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcr sil, cl\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D2_03_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x80\",\n    \"RDI\": \"0x00\",\n    \"RDX\": \"0xC0\",\n    \"RSI\": \"0x40\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x01\nmov rdi, 0x01\nmov rdx, 0x80\nmov rsi, 0x80\nmov r15, 1\nmov rcx, 1\n\nstc\nrcr bl, cl\nmov r8, 0\ncmovo r8, r15 ; We only care about OF here\n\nclc\nrcr dil, cl\nmov r9, 0\ncmovo r9, r15 ; We only care about OF here\n\nstc\nrcr dl, cl\nmov r10, 0\ncmovo r10, r15 ; We only care about OF here\n\nclc\nrcr sil, cl\nmov r11, 0\ncmovo r11, r15 ; We only care about OF here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D2_03_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x05\",\n    \"RDI\": \"0x04\",\n    \"RDX\": \"0x01\",\n    \"RSI\": \"0x00\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x02\nmov rdi, 0x02\nmov rdx, 0x80\nmov rsi, 0x80\nmov rcx, 8 ; Tests wrapping around features\n\nstc\nrcr bl, cl\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcr dil, cl\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcr dl, cl\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcr sil, cl\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434415194748\",\n    \"RBX\": \"0x5152535455595D61\",\n    \"RCX\": \"0x95999DA185898D91\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nmov cl, 0x62\nrol  word [rdx + 8 * 0 + 2], cl\nrol dword [rdx + 8 * 1 + 0], cl\nrol qword [rdx + 8 * 2 + 0], cl\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_00_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R14\": \"1\",\n    \"R13\": \"1\",\n    \"R12\": \"1\",\n    \"R11\": \"1\",\n    \"R10\": \"0\",\n    \"R9\": \"0\",\n    \"R8\": \"0\",\n    \"RSP\": \"0\"\n  }\n}\n%endif\n\nmov r15, 1\n\n; Should all set carry\n;8bit\nmov rax, 0x01\n\nmov cl, 8\nrol al, cl\n\nmov r14, 0\ncmovc r14, r15\n\n; 16bit\nmov rax, 0x0001\n\nmov cl, 16\nrol ax, cl\n\nmov r13, 0\ncmovc r13, r15\n\n; 32bit\nmov rax, 0x00000002\n\nmov cl, 31\nrol eax, cl\n\nmov r12, 0\ncmovc r12, r15\n\n; 64bit\nmov rax, 0x0000000000000002\n\nmov cl, 63\nrol rax, cl\n\nmov r11, 0\ncmovc r11, r15\n\n; Shouldn't set carry\n\n;8bit\nclc\nmov rax, 0x01\n\nmov cl, 0\nrol al, cl\n\nmov r10, 0\ncmovc r10, r15\n\n; 16bit\nclc\nmov rax, 0x0001\n\nmov cl, 0\nrol ax, cl\n\nmov r9, 0\ncmovc r9, r15\n\n; 32bit\nclc\nmov rax, 0x00000001\n\nmov cl, 0\nrol eax, cl\n\nmov r8, 0\ncmovc r8, r15\n\n; 64bit\nclc\nmov rax, 0x0000000000000001\n\nmov cl, 0\nrol rax, cl\n\nmov rsp, 0\ncmovc rsp, r15\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_00_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R14\": \"1\",\n    \"R13\": \"1\",\n    \"R12\": \"1\",\n    \"R11\": \"1\",\n    \"R10\": \"0\",\n    \"R9\": \"0\",\n    \"R8\": \"0\",\n    \"RSP\": \"0\"\n  }\n}\n%endif\n\nmov r15, 1\n\n; Should all set OF\n;8bit\nmov rax, 0x40\n\nmov cl, 1\nrol al, cl\n\nmov r14, 0\ncmovo r14, r15\n\n; 16bit\nmov rax, 0x4000\n\nmov cl, 1\nrol ax, cl\n\nmov r13, 0\ncmovo r13, r15\n\n; 32bit\nmov rax, 0x40000000\n\nmov cl, 1\nrol eax, cl\n\nmov r12, 0\ncmovo r12, r15\n\n; 64bit\nmov rax, 0x4000000000000000\n\nmov cl, 1\nrol rax, cl\n\nmov r11, 0\ncmovo r11, r15\n\n; Let's clear OF really quick\nmov rax, 0\nrol rax, 1\n\n; Shouldn't set OF\n\n;8bit\nclc\nmov rax, 0x80\n\nmov cl, 0\nrol al, cl\n\nmov r10, 0\ncmovo r10, r15\n\n; 16bit\nclc\nmov rax, 0x8000\n\nmov cl, 0\nrol ax, cl\n\nmov r9, 0\ncmovo r9, r15\n\n; 32bit\nclc\nmov rax, 0x80000000\n\nmov cl, 0\nrol eax, cl\n\nmov r8, 0\ncmovo r8, r15\n\n; 64bit\nclc\nmov rax, 0x8000000000000000\n\nmov cl, 0\nrol rax, cl\n\nmov rsp, 0\ncmovo rsp, r15\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434491514748\",\n    \"RBX\": \"0x51525354155595D6\",\n    \"RCX\": \"0x195999DA185898D9\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nmov cl, 0x62\nror  word [rdx + 8 * 0 + 2], cl\nror dword [rdx + 8 * 1 + 0], cl\nror qword [rdx + 8 * 2 + 0], cl\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_01_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R14\": \"1\",\n    \"R13\": \"1\",\n    \"R12\": \"1\",\n    \"R11\": \"1\",\n    \"R10\": \"0\",\n    \"R9\": \"0\",\n    \"R8\": \"0\",\n    \"RSP\": \"0\"\n  }\n}\n%endif\n\nmov r15, 1\n\n; Should all set carry\n;8bit\nmov rax, 0x80\n\nmov cl, 8\nror al, cl\n\nmov r14, 0\ncmovc r14, r15\n\n; 16bit\nmov rax, 0x8000\n\nmov cl, 16\nror ax, cl\n\nmov r13, 0\ncmovc r13, r15\n\n; 32bit\nmov rax, 0x40000000\n\nmov cl, 31\nror eax, cl\n\nmov r12, 0\ncmovc r12, r15\n\n; 64bit\nmov rax, 0x4000000000000000\n\nmov cl, 63\nror rax, cl\n\nmov r11, 0\ncmovc r11, r15\n\n; Shouldn't set carry\n\n;8bit\nclc\nmov rax, 0x80\n\nmov cl, 0\nror al, cl\n\nmov r10, 0\ncmovc r10, r15\n\n; 16bit\nclc\nmov rax, 0x8000\n\nmov cl, 0\nror ax, cl\n\nmov r9, 0\ncmovc r9, r15\n\n; 32bit\nclc\nmov rax, 0x80000000\n\nmov cl, 0\nror eax, cl\n\nmov r8, 0\ncmovc r8, r15\n\n; 64bit\nclc\nmov rax, 0x8000000000000000\n\nmov cl, 0\nror rax, cl\n\nmov rsp, 0\ncmovc rsp, r15\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_01_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R14\": \"1\",\n    \"R13\": \"1\",\n    \"R12\": \"1\",\n    \"R11\": \"1\",\n    \"R10\": \"0\",\n    \"R9\": \"0\",\n    \"R8\": \"0\",\n    \"RSP\": \"0\"\n  }\n}\n%endif\n\nmov r15, 1\n\n; Should all set OF\n;8bit\nmov rax, 0x41\n\nmov cl, 1\nror al, cl\n\nmov r14, 0\ncmovo r14, r15\n\n; 16bit\nmov rax, 0x4001\n\nmov cl, 1\nror ax, cl\n\nmov r13, 0\ncmovo r13, r15\n\n; 32bit\nmov rax, 0x40000001\n\nmov cl, 1\nror eax, cl\n\nmov r12, 0\ncmovo r12, r15\n\n; 64bit\nmov rax, 0x4000000000000001\n\nmov cl, 1\nror rax, cl\n\nmov r11, 0\ncmovo r11, r15\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\n; Shouldn't set OF\n\n;8bit\nclc\nmov rax, 0x80\n\nmov cl, 0\nror al, cl\n\nmov r10, 0\ncmovo r10, r15\n\n; 16bit\nclc\nmov rax, 0x8000\n\nmov cl, 0\nror ax, cl\n\nmov r9, 0\ncmovo r9, r15\n\n; 32bit\nclc\nmov rax, 0x80000000\n\nmov cl, 0\nror eax, cl\n\nmov r8, 0\ncmovo r8, r15\n\n; 64bit\nclc\nmov rax, 0x8000000000000000\n\nmov cl, 0\nror rax, cl\n\nmov rsp, 0\ncmovo rsp, r15\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x0006\",\n    \"RDI\": \"0x0004\",\n    \"RDX\": \"0x0002\",\n    \"RSI\": \"0x0000\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x0001\nmov rdi, 0x0001\nmov rdx, 0x4000\nmov rsi, 0x4000\nmov rcx, 2\n\nstc\nrcl bx, cl\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcl di, cl\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcl dx, cl\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcl si, cl\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_02_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x00000006\",\n    \"RDI\": \"0x00000004\",\n    \"RDX\": \"0x00000002\",\n    \"RSI\": \"0x00000000\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x00000001\nmov rdi, 0x00000001\nmov rdx, 0x40000000\nmov rsi, 0x40000000\nmov rcx, 2\n\nstc\nrcl ebx, cl\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcl edi, cl\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcl edx, cl\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcl esi, cl\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_02_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x0000000000000006\",\n    \"RDI\": \"0x0000000000000004\",\n    \"RDX\": \"0x0000000000000002\",\n    \"RSI\": \"0x0000000000000000\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x0000000000000001\nmov rdi, 0x0000000000000001\nmov rdx, 0x4000000000000000\nmov rsi, 0x4000000000000000\nmov rcx, 2\n\nstc\nrcl rbx, cl\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcl rdi, cl\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcl rdx, cl\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcl rsi, cl\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_02_4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x00000006\",\n    \"RDI\": \"0x00000004\",\n    \"RDX\": \"0x00000002\",\n    \"RSI\": \"0x00000000\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x00000001\nmov rdi, 0x00000001\nmov rdx, 0x40000000\nmov rsi, 0x40000000\nmov rcx, 34 ; Test wraparound\n\nstc\nrcl ebx, cl\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcl edi, cl\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcl edx, cl\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcl esi, cl\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_02_5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x00000001\",\n    \"RDI\": \"0x00000001\",\n    \"RDX\": \"0x40000000\",\n    \"RSI\": \"0x40000000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x00000001\nmov rdi, 0x00000001\nmov rdx, 0x40000000\nmov rsi, 0x40000000\nmov rcx, 32 ; Test wraparound with zero shift\n\nstc\nrcl ebx, cl\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcl edi, cl\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcl edx, cl\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcl esi, cl\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x4000\",\n    \"RDI\": \"0x0000\",\n    \"RDX\": \"0x6000\",\n    \"RSI\": \"0x2000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x1\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x0002\nmov rdi, 0x0002\nmov rdx, 0x8000\nmov rsi, 0x8000\nmov rcx, 2\n\nstc\nrcr bx, cl\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcr di, cl\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcr dx, cl\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcr si, cl\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_03_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x40000000\",\n    \"RDI\": \"0x00000000\",\n    \"RDX\": \"0x60000000\",\n    \"RSI\": \"0x20000000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x1\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x00000002\nmov rdi, 0x00000002\nmov rdx, 0x80000000\nmov rsi, 0x80000000\nmov rcx, 2\n\nstc\nrcr ebx, cl\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcr edi, cl\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcr edx, cl\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcr esi, cl\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_03_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x4000000000000000\",\n    \"RDI\": \"0x0000000000000000\",\n    \"RDX\": \"0x6000000000000000\",\n    \"RSI\": \"0x2000000000000000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x1\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x0000000000000002\nmov rdi, 0x0000000000000002\nmov rdx, 0x8000000000000000\nmov rsi, 0x8000000000000000\nmov rcx, 2\n\nstc\nrcr rbx, cl\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcr rdi, cl\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcr rdx, cl\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcr rsi, cl\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_03_4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x8000\",\n    \"RDI\": \"0x0000\",\n    \"RDX\": \"0xC000\",\n    \"RSI\": \"0x4000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x0001\nmov rdi, 0x0001\nmov rdx, 0x8000\nmov rsi, 0x8000\nmov r15, 1\nmov rcx, 1\n\nstc\nrcr bx, cl\nmov r8, 0\ncmovo r8, r15 ; We only care about OF here\n\nclc\nrcr di, cl\nmov r9, 0\ncmovo r9, r15 ; We only care about OF here\n\nstc\nrcr dx, cl\nmov r10, 0\ncmovo r10, r15 ; We only care about OF here\n\nclc\nrcr si, cl\nmov r11, 0\ncmovo r11, r15 ; We only care about OF here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_03_5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x80000000\",\n    \"RDI\": \"0x00000000\",\n    \"RDX\": \"0xC0000000\",\n    \"RSI\": \"0x40000000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x00000001\nmov rdi, 0x00000001\nmov rdx, 0x80000000\nmov rsi, 0x80000000\nmov r15, 1\nmov rcx, 1\n\nstc\nrcr ebx, cl\nmov r8, 0\ncmovo r8, r15 ; We only care about OF here\n\nclc\nrcr edi, cl\nmov r9, 0\ncmovo r9, r15 ; We only care about OF here\n\nstc\nrcr edx, cl\nmov r10, 0\ncmovo r10, r15 ; We only care about OF here\n\nclc\nrcr esi, cl\nmov r11, 0\ncmovo r11, r15 ; We only care about OF here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_03_6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x8000000000000000\",\n    \"RDI\": \"0x0000000000000000\",\n    \"RDX\": \"0xC000000000000000\",\n    \"RSI\": \"0x4000000000000000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x1\"\n  }\n}\n%endif\n\nmov rbx, 0x0000000000000001\nmov rdi, 0x0000000000000001\nmov rdx, 0x8000000000000000\nmov rsi, 0x8000000000000000\nmov r15, 1\nmov rcx, 1\n\nstc\nrcr rbx, cl\nmov r8, 0\ncmovo r8, r15 ; We only care about OF here\n\nclc\nrcr rdi, cl\nmov r9, 0\ncmovo r9, r15 ; We only care about OF here\n\nstc\nrcr rdx, cl\nmov r10, 0\ncmovo r10, r15 ; We only care about OF here\n\nclc\nrcr rsi, cl\nmov r11, 0\ncmovo r11, r15 ; We only care about OF here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_03_7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x40000000\",\n    \"RDI\": \"0x00000000\",\n    \"RDX\": \"0x60000000\",\n    \"RSI\": \"0x20000000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x1\",\n    \"R10\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x00000002\nmov rdi, 0x00000002\nmov rdx, 0x80000000\nmov rsi, 0x80000000\nmov rcx, 34 ; Test wraparound\n\nstc\nrcr ebx, cl\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcr edi, cl\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcr edx, cl\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcr esi, cl\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_03_8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x00000002\",\n    \"RDI\": \"0x00000002\",\n    \"RDX\": \"0x80000000\",\n    \"RSI\": \"0x80000000\",\n    \"R8\":  \"0x1\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0x1\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov rbx, 0x00000002\nmov rdi, 0x00000002\nmov rdx, 0x80000000\nmov rsi, 0x80000000\nmov rcx, 32 ; Test wraparound with zero shift\n\nstc\nrcr ebx, cl\nlahf\nmov r8w, ax\nshr r8, 8\nand r8, 1 ; We only care about carry flag here\n\nclc\nrcr edi, cl\nlahf\nmov r9w, ax\nshr r9, 8\nand r9, 1 ; We only care about carry flag here\n\nstc\nrcr edx, cl\nlahf\nmov r10w, ax\nshr r10, 8\nand r10, 1 ; We only care about carry flag here\n\nclc\nrcr esi, cl\nlahf\nmov r11w, ax\nshr r11, 8\nand r11, 1 ; We only care about carry flag here\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434415184748\",\n    \"RBX\": \"0x5152535455595D60\",\n    \"RCX\": \"0x95999DA000000000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nmov cl, 0x62\nshl  word [rdx + 8 * 0 + 2], cl\nshl dword [rdx + 8 * 1 + 0], cl\nshl qword [rdx + 8 * 2 + 0], cl\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434411514748\",\n    \"RBX\": \"0x51525354155595D6\",\n    \"RCX\": \"0x00000000185898D9\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nmov cl, 0x62\nshr  word [rdx + 8 * 0 + 2], cl\nshr dword [rdx + 8 * 1 + 0], cl\nshr qword [rdx + 8 * 2 + 0], cl\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434411514748\",\n    \"RBX\": \"0x51525354155595D6\",\n    \"RCX\": \"0x00000000185898D9\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nmov cl, 0x62\nsar  word [rdx + 8 * 0 + 2], cl\nsar dword [rdx + 8 * 1 + 0], cl\nsar qword [rdx + 8 * 2 + 0], cl\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/2_D3_07_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3335785C36350000\",\n    \"RBX\": \"0x3465785C33350000\",\n    \"RCX\": \"0x6663785C34650332\",\n    \"RDX\": \"0x3234785C66630F0B\",\n    \"RDI\": \"0x3234785C32340000\",\n    \"RSI\": \"0x3035785C32340000\",\n    \"RSP\": \"0x3564785C30350000\",\n    \"R8\":  \"0x6532785C35640785\",\n    \"R9\":  \"0x6435785C65320000\",\n    \"R10\": \"0x3262785C64350000\",\n    \"R11\": \"0x6638785C32621E17\",\n    \"R12\": \"0x3831785C66380000\",\n    \"R13\": \"0x3434785C38310000\",\n    \"R14\": \"0x6632785C34340000\",\n    \"R15\": \"0x3162785C66320000\"\n  }\n}\n%endif\n\nlea r15, [rel .data]\n\nmov rax, [r15 + 0]\nmov cl, [r15 + 2]\nsar ax, cl\n\nmov rbx, [r15 + 4]\nmov cl, [r15 + 6]\nsar bx, cl\n\nmov rcx, [r15 + 8]\nmov cl, [r15 + 10]\nsar cx, cl\n\nmov rdx, [r15 + 12]\nmov cl, [r15 + 14]\nsar dx, cl\n\nmov rdi, [r15 + 16]\nmov cl, [r15 + 18]\nsar di, cl\n\nmov rsi, [r15 + 20]\nmov cl, [r15 + 22]\nsar si, cl\n\nmov rsp, [r15 + 24]\nmov cl, [r15 + 26]\nsar sp, cl\n\nmov r8, [r15 + 28]\nmov cl, [r15 + 30]\nsar r8w, cl\n\nmov r9, [r15 + 32]\nmov cl, [r15 + 34]\nsar r9w, cl\n\nmov r10, [r15 + 36]\nmov cl, [r15 + 38]\nsar r10w, cl\n\nmov r11, [r15 + 40]\nmov cl, [r15 + 42]\nsar r11w, cl\n\nmov r12, [r15 + 44]\nmov cl, [r15 + 46]\nsar r12w, cl\n\nmov r13, [r15 + 48]\nmov cl, [r15 + 50]\nsar r13w, cl\n\nmov r14, [r15 + 52]\nmov cl, [r15 + 54]\nsar r14w, cl\n\nmov cl, [r15 + 58]\nmov r15, [r15 + 56]\nsar r15w, cl\n\nhlt\n\n.data:\ndb '\\x56\\x53\\xe4\\xcf\\x42\\x42\\x50\\xd5\\x2e\\x5d\\xb2\\x8f\\x18\\x44\\x2f\\xb1'\ndb '\\xad\\x88\\x64\\x7e\\x20\\x99\\xb4\\xf8\\xa4\\x34\\xc7\\x65\\xd7\\x01\\x19\\xc3'\ndb '\\x8c\\xce\\x28\\x7c\\x64\\x65\\x50\\x65\\xb7\\xda\\xaf\\x08\\xc0\\x1f\\x31\\xbf'\ndb '\\x7f\\xeb\\xf0\\x0b\\xf0\\x46\\x4e\\x72\\x2c\\xf8\\xb4\\x4b\\xa9\\x8d\\xc9\\x33'\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F6_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0600\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\ntest byte [rdx + 8 * 0 + 1], 0x61\n; test = 0x47 & 0x61 = 0x41\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- Undefined\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000110\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F6_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546B848\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nnot byte [rdx + 8 * 0 + 1]\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F6_02_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546B848\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nlock not byte [rdx + 8 * 0 + 1]\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F6_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546B948\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nneg byte [rdx + 8 * 0 + 1]\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F6_03_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xb8aff1dbb3d15c81\",\n    \"RBX\": \"0xd5a98ccfc669b87a\",\n    \"RCX\": \"0x30b556de1f6de86b\"\n  }\n}\n%endif\n\nlea r15, [rel .data]\n\nlock neg byte [r15 + 0]\nlock neg byte [r15 + 1]\nlock neg byte [r15 + 2]\nlock neg byte [r15 + 3]\nlock neg byte [r15 + 4]\nlock neg byte [r15 + 5]\nlock neg byte [r15 + 6]\nlock neg byte [r15 + 7]\nlock neg byte [r15 + 8]\nlock neg byte [r15 + 9]\nlock neg byte [r15 + 10]\nlock neg byte [r15 + 11]\nlock neg byte [r15 + 12]\nlock neg byte [r15 + 13]\nlock neg byte [r15 + 14]\nlock neg byte [r15 + 15]\n\nmov rax, [r15 + 8 * 0]\nmov rbx, [r15 + 8 * 1]\nmov rcx, [r15 + 8 * 2]\n\nhlt\n\nalign 4096\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F6_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546008E\",\n    \"RBX\": \"0xFFFFFFFFFFFF0004\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov al, 2\nmul byte [rdx + 8 * 0 + 1]\nmov word [rdx + 8 * 0], ax\n\n; Ensure this inserts in to AX\nmov rax, 0xFFFFFFFFFFFFFF02\nmov rbx, 0xFFFFFFFFFFFFFF02\nmul bl\nmov rbx, rax\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F6_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546FF72\",\n    \"RBX\": \"0xFFFFFFFFFFFF0001\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov al, -2\nimul byte [rdx + 8 * 0 + 1]\nmov word [rdx + 8 * 0], ax\n\n; Ensure upper bits aren't cleared\nmov rax, 0xFFFFFFFFFFFFFF01\nmov rbx, 1\nimul bl\nmov rbx, rax\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F6_05_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RDI\": \"0x00000000000003fc\"\n  }\n}\n%endif\n\n%macro ofcfmerge 0\n  ; Get CF\n  setc al\n  ; Get OF\n  seto bl\n  and eax, 1\n  and ebx, 1\n\n  ; Merge in to results\n  shl edi, 1\n  or edi, eax\n\n  ; Merge in to results\n  shl edi, 1\n  or edi, ebx\n%endmacro\n\nmov edi, 0\n\n; Max Negative\nmov al, 0x80\nmov bl, 0x80\n\nimul bl\n\nofcfmerge\n\n; Max Positive\nmov al, 0x7F\nmov bl, 0x7F\n\nimul bl\n\nofcfmerge\n\n; Max Positive and Max Negative\nmov al, 0x7F\nmov bl, 0x80\n\nimul bl\n\nofcfmerge\n\n; Max Positive and Max Negative\nmov al, 0x80\nmov bl, 0x7F\n\nimul bl\n\nofcfmerge\n\n; No Overflow\n\nmov al, 0x1\nmov bl, 0x1\n\nimul bl\n\nofcfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F6_05_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RDI\": \"0x00000000000003fc\"\n  }\n}\n%endif\n\n%macro ofcfmerge 0\n  ; Get CF\n  setc al\n  ; Get OF\n  seto bl\n  and eax, 1\n  and ebx, 1\n\n  ; Merge in to results\n  shl edi, 1\n  or edi, eax\n\n  ; Merge in to results\n  shl edi, 1\n  or edi, ebx\n%endmacro\n\nmov edi, 0\n\n; Max Negative\nmov ax, 0x8000\nmov bx, 0x8000\n\nimul bx\n\nofcfmerge\n\n; Max Positive\nmov ax, 0x7FFF\nmov bx, 0x7FFF\n\nimul bx\n\nofcfmerge\n\n; Max Positive and Max Negative\nmov ax, 0x7FFF\nmov bx, 0x8000\n\nimul bx\n\nofcfmerge\n\n; Max Positive and Max Negative\nmov ax, 0x8000\nmov bx, 0x7FFF\n\nimul bx\n\nofcfmerge\n\n; No Overflow\n\nmov ax, 0x1\nmov bx, 0x1\n\nimul bx\n\nofcfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F6_05_4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RDI\": \"0x00000000000003fc\"\n  }\n}\n%endif\n\n%macro ofcfmerge 0\n  ; Get CF\n  setc al\n  ; Get OF\n  seto bl\n  and eax, 1\n  and ebx, 1\n\n  ; Merge in to results\n  shl edi, 1\n  or edi, eax\n\n  ; Merge in to results\n  shl edi, 1\n  or edi, ebx\n%endmacro\n\nmov edi, 0\n\n; Max Negative\nmov eax, 0x80000000\nmov ebx, 0x80000000\n\nimul ebx\n\nofcfmerge\n\n; Max Positive\nmov eax, 0x7FFFFFFF\nmov ebx, 0x7FFFFFFF\n\nimul ebx\n\nofcfmerge\n\n; Max Positive and Max Negative\nmov eax, 0x7FFFFFFF\nmov ebx, 0x80000000\n\nimul ebx\n\nofcfmerge\n\n; Max Positive and Max Negative\nmov eax, 0x80000000\nmov ebx, 0x7FFFFFFF\n\nimul ebx\n\nofcfmerge\n\n; No Overflow\n\nmov eax, 0x1\nmov ebx, 0x1\n\nimul ebx\n\nofcfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F6_05_5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RDI\": \"0x00000000000003fc\"\n  }\n}\n%endif\n\n%macro ofcfmerge 0\n  ; Get CF\n  setc al\n  ; Get OF\n  seto bl\n  and eax, 1\n  and ebx, 1\n\n  ; Merge in to results\n  shl edi, 1\n  or edi, eax\n\n  ; Merge in to results\n  shl edi, 1\n  or edi, ebx\n%endmacro\n\nmov edi, 0\n\n; Max Negative\nmov rax, 0x8000000000000000\nmov rbx, 0x8000000000000000\n\nimul rbx\n\nofcfmerge\n\n; Max Positive\nmov rax, 0x7FFFFFFFFFFFFFFF\nmov rbx, 0x7FFFFFFFFFFFFFFF\n\nimul rbx\n\nofcfmerge\n\n; Max Positive and Max Negative\nmov rax, 0x7FFFFFFFFFFFFFFF\nmov rbx, 0x8000000000000000\n\nimul rbx\n\nofcfmerge\n\n; Max Positive and Max Negative\nmov rax, 0x8000000000000000\nmov rbx, 0x7FFFFFFFFFFFFFFF\n\nimul rbx\n\nofcfmerge\n\n; No Overflow\n\nmov rax, 0x1\nmov rbx, 0x1\n\nimul rbx\n\nofcfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F6_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445460202\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov ax, 0x8E\ndiv byte [rdx + 8 * 0 + 2]\nmov word [rdx + 8 * 0], ax\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F6_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445fe00DD\",\n    \"RBX\": \"0x515253545556D8FF\",\n    \"RCX\": \"0x6162636465660010\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445FE4748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x61626364656667F8\nmov [rdx + 8 * 2], rax\n\n; Positive / Negative\nmov ax, 0x46\nidiv byte [rdx + 8 * 0 + 2]\nmov word [rdx + 8 * 0], ax\n\n; Negative / Positive\nmov ax, -128\nidiv byte [rdx + 8 * 1]\nmov word [rdx + 8 * 1], ax\n\n; Negative / Negative\nmov ax, -128\nidiv byte [rdx + 8 * 2]\nmov word [rdx + 8 * 2], ax\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F6_07_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0021\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x8\nmov [rdx + 8 * 0], rax\n\n; Test that 8bit divide divides a 16bit dividend\nmov ax, 0x0108\nidiv byte [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F7_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0200\",\n    \"RBX\": \"0x0600\",\n    \"RCX\": \"0x0600\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\ntest qword [rdx + 8 * 2], 0x71727374\n; test = 0x6162636465666768 & 0x71727374 = 0x61626360\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- Undefined\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000110\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nmov rcx, rax\nand rcx, 0xffffffffffffefff\n\ntest dword [rdx + 8 * 1], 0x71727374\n; test = 0x55565758 & 0x71727374 = 0x51525350\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- Undefined\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000110\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nmov rbx, rax\nand rbx, 0xffffffffffffefff\n\ntest word [rdx + 8 * 0], 0x7172\n; test = 0x4748 & 0x7172 = 0x4140\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- Undefined\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000\n; ================\n;         00000010\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nand rax, 0xffffffffffffefff\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F7_00_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x8600\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF00000000\nmov [rdx + 8 * 0], rax\n\ntest qword [rdx + 8 * 0], -1\n; test = 0x4748 & 0x7172 = 0x4140\n; 0: CF - 00000000\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- Undefined\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 10000000\n; ================\n;         10000110\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F7_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546B8B7\",\n    \"RBX\": \"0x51525354AAA9A8A7\",\n    \"RCX\": \"0x9E9D9C9B9A999897\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nnot  word [rdx + 8 * 0 + 0]\nnot dword [rdx + 8 * 1 + 0]\nnot qword [rdx + 8 * 2 + 0]\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F7_02_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546B8B7\",\n    \"RBX\": \"0x51525354AAA9A8A7\",\n    \"RCX\": \"0x9E9D9C9B9A999897\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nlock not  word [rdx + 8 * 0 + 0]\nlock not dword [rdx + 8 * 1 + 0]\nlock not qword [rdx + 8 * 2 + 0]\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F7_02_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x48ae0fda4d2fa480\",\n    \"RBX\": \"0x2b5774313a974886\",\n    \"RCX\": \"0x304a56211f6de894\"\n  }\n}\n%endif\n\nlea r15, [rel .data]\n\n; Unaligned words\nlock not  word [r15 + 0]\nlock not  word [r15 + 1]\nlock not  word [r15 + 2]\nlock not  word [r15 + 3]\nlock not  word [r15 + 4]\nlock not  word [r15 + 5]\nlock not  word [r15 + 6]\nlock not  word [r15 + 7]\nlock not  word [r15 + 8]\nlock not  word [r15 + 9]\nlock not  word [r15 + 10]\nlock not  word [r15 + 11]\nlock not  word [r15 + 12]\nlock not  word [r15 + 13]\nlock not  word [r15 + 14]\nlock not  word [r15 + 15]\n\n; Unaligned dwords\nlock not dword [r15 + 0]\nlock not dword [r15 + 1]\nlock not dword [r15 + 2]\nlock not dword [r15 + 3]\nlock not dword [r15 + 4]\nlock not dword [r15 + 5]\nlock not dword [r15 + 6]\nlock not dword [r15 + 7]\nlock not dword [r15 + 8]\nlock not dword [r15 + 9]\nlock not dword [r15 + 10]\nlock not dword [r15 + 11]\nlock not dword [r15 + 12]\nlock not dword [r15 + 13]\nlock not dword [r15 + 14]\nlock not dword [r15 + 15]\n\n; Unaligned qwords\nlock not qword [r15 + 0]\nlock not qword [r15 + 1]\nlock not qword [r15 + 2]\nlock not qword [r15 + 3]\nlock not qword [r15 + 4]\nlock not qword [r15 + 5]\nlock not qword [r15 + 6]\nlock not qword [r15 + 7]\nlock not qword [r15 + 8]\nlock not qword [r15 + 9]\nlock not qword [r15 + 10]\nlock not qword [r15 + 11]\nlock not qword [r15 + 12]\nlock not qword [r15 + 13]\nlock not qword [r15 + 14]\nlock not qword [r15 + 15]\n\nmov rax, [r15 + 8 * 0]\nmov rbx, [r15 + 8 * 1]\nmov rcx, [r15 + 8 * 2]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F7_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546B8B8\",\n    \"RBX\": \"0x51525354AAA9A8A8\",\n    \"RCX\": \"0x9E9D9C9B9A999898\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nneg  word [rdx + 8 * 0 + 0]\nneg dword [rdx + 8 * 1 + 0]\nneg qword [rdx + 8 * 2 + 0]\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F7_03_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4bad12d95030a781\",\n    \"RBX\": \"0x2e5a77343d9a4b89\",\n    \"RCX\": \"0x304a56211f6de894\"\n  }\n}\n%endif\n\nlea r15, [rel .data]\n\n; Unaligned words\nlock neg  word [r15 + 0]\nlock neg  word [r15 + 1]\nlock neg  word [r15 + 2]\nlock neg  word [r15 + 3]\nlock neg  word [r15 + 4]\nlock neg  word [r15 + 5]\nlock neg  word [r15 + 6]\nlock neg  word [r15 + 7]\nlock neg  word [r15 + 8]\nlock neg  word [r15 + 9]\nlock neg  word [r15 + 10]\nlock neg  word [r15 + 11]\nlock neg  word [r15 + 12]\nlock neg  word [r15 + 13]\nlock neg  word [r15 + 14]\nlock neg  word [r15 + 15]\n\n; Unaligned dwords\nlock neg dword [r15 + 0]\nlock neg dword [r15 + 1]\nlock neg dword [r15 + 2]\nlock neg dword [r15 + 3]\nlock neg dword [r15 + 4]\nlock neg dword [r15 + 5]\nlock neg dword [r15 + 6]\nlock neg dword [r15 + 7]\nlock neg dword [r15 + 8]\nlock neg dword [r15 + 9]\nlock neg dword [r15 + 10]\nlock neg dword [r15 + 11]\nlock neg dword [r15 + 12]\nlock neg dword [r15 + 13]\nlock neg dword [r15 + 14]\nlock neg dword [r15 + 15]\n\n; Unaligned qwords\nlock neg qword [r15 + 0]\nlock neg qword [r15 + 1]\nlock neg qword [r15 + 2]\nlock neg qword [r15 + 3]\nlock neg qword [r15 + 4]\nlock neg qword [r15 + 5]\nlock neg qword [r15 + 6]\nlock neg qword [r15 + 7]\nlock neg qword [r15 + 8]\nlock neg qword [r15 + 9]\nlock neg qword [r15 + 10]\nlock neg qword [r15 + 11]\nlock neg qword [r15 + 12]\nlock neg qword [r15 + 13]\nlock neg qword [r15 + 14]\nlock neg qword [r15 + 15]\n\nmov rax, [r15 + 8 * 0]\nmov rbx, [r15 + 8 * 1]\nmov rcx, [r15 + 8 * 2]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F7_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243441F968610\",\n    \"RBX\": \"0x25D1437D318C1BE0\",\n    \"RCX\": \"0xFFFFFFFFFFFF0004\",\n    \"RDX\": \"0x0000000000000004\",\n    \"RSI\": \"0xFC1B5FC85401D0C0\",\n    \"RSP\": \"0x2B27F79B13618682\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov ax, 0x7172\nmul word [r15 + 8 * 0 + 0]\nmov word [r15 + 8 * 0 + 0], ax\nmov word [r15 + 8 * 0 + 2], dx\n\nmov eax, 0x71727374\nmul dword [r15 + 8 * 1 + 0]\nmov dword [r15 + 8 * 1 + 0], eax\nmov dword [r15 + 8 * 1 + 4], edx\n\nmov rax, 0x7172737475767778\nmul qword [r15 + 8 * 2 + 0]\nmov rsi, rax\nmov rsp, rdx\n\n; Ensure zext handling is correct\n; 16bit\nmov rax, 0xFFFFFFFFFFFF0002\nmov rbx, 0xFFFFFFFFFFFF0002\nmul bx\nmov rcx, rax\n\n; 32bit\nmov rax, 0xFFFFFFFF00000002\nmov rbx, 0xFFFFFFFF00000002\nmul ebx\nmov rdx, rax\n\nmov rax, [r15 + 8 * 0]\nmov rbx, [r15 + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F7_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x41424344FFDC5C00\",\n    \"RBX\": \"0xFFFFFFD554D45400\",\n    \"RCX\": \"0xFFFFFFFFFFFF0002\",\n    \"RDX\": \"0x0000000000000002\",\n    \"RSI\": \"0x4ECE4DCD4CCC4C00\",\n    \"RSP\": \"0xFFFFFFFFFFFFFFCF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov ax, -128\nimul word [r15 + 8 * 0 + 0]\nmov word [r15 + 8 * 0 + 0], ax\nmov word [r15 + 8 * 0 + 2], dx\n\nmov eax, -128\nimul dword [r15 + 8 * 1 + 0]\nmov dword [r15 + 8 * 1 + 0], eax\nmov dword [r15 + 8 * 1 + 4], edx\n\nmov rax, -128\nimul qword [r15 + 8 * 2 + 0]\nmov rsi, rax\nmov rsp, rdx\n\n; Ensure correct zext mechanics\n\n; 16bit - inserts\nmov rax, 0xFFFFFFFFFFFF0001\nmov rbx, 2\nimul bl\nmov rcx, rax\n\n; 32bit - Zexts to 64bit\nmov rax, 0xFFFFFFFF00000001\nmov rbx, 2\nimul ebx\nmov rdx, rax\n\nmov rax, [r15 + 8 * 0]\nmov rbx, [r15 + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F7_05_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0\"\n  }\n}\n%endif\n\n; Uses CX and BX and stores result in r15\n; OF:CF\n%macro ofcfmerge 0\n  lahf\n\n  ; Load OF\n  mov rbx, 0\n  seto bl\n\n  shl r15, 1\n  or r15, rbx\n  shl r15, 1\n\n  ; Insert CF\n  shr ax, 8\n  and rax, 1\n  or r15, rax\n%endmacro\n\nmov r8, 0xe0000000\nmov r15, 0\n\nmov rax, -1\nmov [r8 + 8 * 0], rax\nmov rax, -2\nmov [r8 + 8 * 1], rax\nmov rax, -3\nmov [r8 + 8 * 2], rax\n\nmov rax, 1\nmov [r8 + 8 * 3], rax\nmov rax, 2\nmov [r8 + 8 * 4], rax\nmov rax, 3\nmov [r8 + 8 * 5], rax\n\n; Negative * Negative\nmov ax, -128\ncwd\nimul word [r8 + 8 * 0 + 0]\nofcfmerge\n\nmov eax, -128\ncdq\nimul dword [r8 + 8 * 1 + 0]\nofcfmerge\n\nmov rax, -128\ncqo\nimul qword [r8 + 8 * 2 + 0]\nofcfmerge\n\n; Negative * Positive\nmov ax, -128\ncwd\nimul word [r8 + 8 * 3 + 0]\nofcfmerge\n\nmov eax, -128\ncdq\nimul dword [r8 + 8 * 4 + 0]\nofcfmerge\n\nmov rax, -128\ncqo\nimul qword [r8 + 8 * 5 + 0]\nofcfmerge\n\n; Positive * Positive\nmov ax, 128\ncwd\nimul word [r8 + 8 * 3 + 0]\nofcfmerge\n\nmov eax, 128\ncdq\nimul dword [r8 + 8 * 4 + 0]\nofcfmerge\n\nmov rax, 128\ncqo\nimul qword [r8 + 8 * 5 + 0]\nofcfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F7_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243442A2A0001\",\n    \"RBX\": \"0x1C1C1C1C00000001\",\n    \"RSI\": \"0x0000000000000001\",\n    \"RSP\": \"0x1010101010101010\",\n    \"R11\": \"0x8000000000000000\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov ax, 0x7172\ncwd\ndiv word [r15 + 8 * 0 + 0]\nmov word [r15 + 8 * 0 + 0], ax\nmov word [r15 + 8 * 0 + 2], dx\n\nmov eax, 0x71727374\ncdq\ndiv dword [r15 + 8 * 1 + 0]\nmov dword [r15 + 8 * 1 + 0], eax\nmov dword [r15 + 8 * 1 + 4], edx\n\nmov rax, 0x7172737475767778\ncqo\ndiv qword [r15 + 8 * 2 + 0]\nmov rsi, rax\nmov rsp, rdx\n\n; 128bit divide where we actually care about the upper bits containing real data\nmov rax, 0x0\nmov rdx, 0x1\nmov rcx, 2\ndiv rcx\nmov r11, rax\n\nmov rax, [r15 + 8 * 0]\nmov rbx, [r15 + 8 * 1]\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F7_06_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x80000000\",\n    \"RDX\": \"0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov eax, 0x2\nmov [r15 + 8 * 0], eax\n\nmov rax, 0xFFFFFFFF00000000\nmov rdx, 0xFFFFFFFF00000001\n\ndiv dword [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F7_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243442A2A0001\",\n    \"RBX\": \"0x1C1C1C1C00000001\",\n    \"RCX\": \"0x0000000000000001\",\n    \"RDX\": \"0x1010101010101010\",\n    \"RSI\": \"0x41424344FF800000\",\n    \"RDI\": \"0xFFFFFF8000000000\",\n    \"RBP\": \"0x0000000000000000\",\n    \"RSP\": \"0xFFFFFFFFFFFFFF80\",\n    \"R8\":  \"0xFFFFFFFF00000004\",\n    \"R9\":  \"0x0000000000000002\",\n    \"R10\": \"0x0000000000000001\",\n    \"R11\": \"0x0000000000000000\",\n    \"R12\": \"0x4000000000000000\",\n    \"R13\": \"0x0000000000000000\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\n; Positive\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\nmov rax, 0\nmov [r15 + 8 * 3], rax\n\n; Positive\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 5], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 6], rax\nmov rax, 0\nmov [r15 + 8 * 7], rax\n\n; Negative\nmov rax, -32\nmov [r15 + 8 * 8], rax\nmov rax, -64\nmov [r15 + 8 * 9], rax\nmov rax, -128\nmov [r15 + 8 * 10], rax\nmov rax, 0\nmov [r15 + 8 * 11], rax\n\n; Positive / Positive\nmov ax, 0x7172\ncwd\nidiv word [r15 + 8 * 0 + 0]\nmov word [r15 + 8 * 0 + 0], ax\nmov word [r15 + 8 * 0 + 2], dx\n\nmov eax, 0x71727374\ncdq\nidiv dword [r15 + 8 * 1 + 0]\nmov dword [r15 + 8 * 1 + 0], eax\nmov dword [r15 + 8 * 1 + 4], edx\n\nmov rax, 0x7172737475767778\ncqo\nidiv qword [r15 + 8 * 2 + 0]\nmov qword [r15 + 8 * 2 + 0], rax\nmov qword [r15 + 8 * 3 + 0], rdx\n\n; Negative / Positive\nmov ax, -128\ncwd\nidiv word [r15 + 8 * 4 + 0]\nmov word [r15 + 8 * 4 + 0], ax\nmov word [r15 + 8 * 4 + 2], dx\n\nmov eax, -128\ncdq\nidiv dword [r15 + 8 * 5 + 0]\nmov dword [r15 + 8 * 5 + 0], eax\nmov dword [r15 + 8 * 5 + 4], edx\n\nmov rax, -128\ncqo\nidiv qword [r15 + 8 * 6 + 0]\nmov qword [r15 + 8 * 6 + 0], rax\nmov qword [r15 + 8 * 7 + 0], rdx\n\n; Negative / Negative\nmov ax, -128\ncwd\nidiv word [r15 + 8 * 8 + 0]\nmov word [r15 + 8 * 8 + 0], ax\nmov word [r15 + 8 * 8 + 2], dx\n\nmov eax, -128\ncdq\nidiv dword [r15 + 8 * 9 + 0]\nmov dword [r15 + 8 * 9 + 0], eax\nmov dword [r15 + 8 * 9 + 4], edx\n\nmov rax, -128\ncqo\nidiv qword [r15 + 8 * 10 + 0]\nmov qword [r15 + 8 * 10 + 0], rax\nmov qword [r15 + 8 * 11 + 0], rdx\n\n; 128bit divide where we actually care about the upper bits containing real data\nmov rax, 0x0\nmov rdx, 0x1\nmov rcx, 4\nidiv rcx\nmov qword [r15 + 8 * 12 + 0], rax\nmov qword [r15 + 8 * 13 + 0], rdx\n\n; Positive / Positive results\nmov rax, [r15 + 8 * 0]\nmov rbx, [r15 + 8 * 1]\nmov rcx, [r15 + 8 * 2]\nmov rdx, [r15 + 8 * 3]\n\n; Negative / Positive results\nmov rsi, [r15 + 8 * 4]\nmov rdi, [r15 + 8 * 5]\nmov rbp, [r15 + 8 * 6]\nmov rsp, [r15 + 8 * 7]\n\n; Negative / Negative results\nmov r8, [r15 + 8 * 8]\nmov r9, [r15 + 8 * 9]\nmov r10, [r15 + 8 * 10]\nmov r11, [r15 + 8 * 11]\n\n; 128bit results\nmov r12, [r15 + 8 * 12]\nmov r13, [r15 + 8 * 13]\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/3_F7_07_2.asm",
    "content": "\n%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x40000000\",\n    \"RDX\": \"0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov eax, 0x4\nmov [r15 + 8 * 0], eax\n\nmov rax, 0xFFFFFFFF00000000\nmov rdx, 0xFFFFFFFF00000001\n\nidiv dword [r15 + 8 * 0]\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/4_FE_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464749\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\n\ninc byte [rdx + 8 * 0 + 0]\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/4_FE_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464747\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\n\ndec byte [rdx + 8 * 0 + 0]\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/5_FF_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464749\",\n    \"RBX\": \"0x5152535455565759\",\n    \"RCX\": \"0x6162636465666769\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\ninc  word [r15 + 8 * 0 + 0]\ninc dword [r15 + 8 * 1 + 0]\ninc qword [r15 + 8 * 2 + 0]\n\nmov rax, [r15 + 8 * 0]\nmov rbx, [r15 + 8 * 1]\nmov rcx, [r15 + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/5_FF_00_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R14\": \"0x0\",\n    \"R13\": \"0x0\",\n    \"R12\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\n\n; Ensures that all the flag setting matches correctly\ninc  word [r15 + 8 * 0 + 0]\nmov rax, 0\nmov r14, 0\nlahf\nmov r14, rax\n\nlock inc  word [r15 + 8 * 1 + 0]\nmov rax, 0\nlahf\nxor r14, rax\n\ninc dword [r15 + 8 * 2 + 0]\nmov rax, 0\nmov r13, 0\nlahf\nmov r13, rax\n\nlock inc dword [r15 + 8 * 3 + 0]\nmov rax, 0\nlahf\nxor r13, rax\n\ninc qword [r15 + 8 * 4 + 0]\nmov rax, 0\nmov r12, 0\nlahf\nmov r12, rax\n\nlock inc qword [r15 + 8 * 5 + 0]\nmov rax, 0\nlahf\nxor r12, rax\n\ninc byte [r15 + 8 * 4 + 0]\nmov rax, 0\nmov r11, 0\nlahf\nmov r11, rax\n\nlock inc byte [r15 + 8 * 5 + 0]\nmov rax, 0\nlahf\nxor r11, rax\n\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/5_FF_00_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xffffffffffffff00\",\n    \"RBX\": \"0xffffffffffff0000\",\n    \"RCX\": \"0xffffffff00000000\",\n    \"RDX\": \"0x0000000000000000\",\n    \"R8\" : \"0x0000000000005400\",\n    \"R9\" : \"0x0000000000005400\",\n    \"R10\": \"0x0000000000005400\",\n    \"R11\": \"0x0000000000005400\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0xffffffffffffffff\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\n\nxor rax, rax\n\n; Insure that inc overflow works and sets correct flags\ninc  byte [r15 + 8 * 0 + 0]\nlahf\nmov r8, rax\n\ninc  word [r15 + 8 * 1 + 0]\nlahf\nmov r9, rax\n\ninc dword [r15 + 8 * 2 + 0]\nlahf\nmov r10, rax\n\ninc qword [r15 + 8 * 3 + 0]\nlahf\nmov r11, rax\n\n\nmov rax, [r15 + 8 * 0]\nmov rbx, [r15 + 8 * 1]\nmov rcx, [r15 + 8 * 2]\nmov rdx, [r15 + 8 * 3]\n\n\n; Mask flags we don't care about\nand r8, 0xd400\nand r9, 0xd400\nand r10, 0xd400\nand r11, 0xd400\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/5_FF_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464747\",\n    \"RBX\": \"0x5152535455565757\",\n    \"RCX\": \"0x6162636465666767\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\ndec  word [r15 + 8 * 0 + 0]\ndec dword [r15 + 8 * 1 + 0]\ndec qword [r15 + 8 * 2 + 0]\n\nmov rax, [r15 + 8 * 0]\nmov rbx, [r15 + 8 * 1]\nmov rcx, [r15 + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/5_FF_01_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R14\": \"0x0\",\n    \"R13\": \"0x0\",\n    \"R12\": \"0x0\",\n    \"R11\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\n\n; Ensures that all the flag setting matches correctly\ndec  word [r15 + 8 * 0 + 0]\nmov rax, 0\nmov r14, 0\nlahf\nmov r14, rax\n\nlock dec  word [r15 + 8 * 1 + 0]\nmov rax, 0\nlahf\nxor r14, rax\n\ndec dword [r15 + 8 * 2 + 0]\nmov rax, 0\nmov r13, 0\nlahf\nmov r13, rax\n\nlock dec dword [r15 + 8 * 3 + 0]\nmov rax, 0\nlahf\nxor r13, rax\n\ndec qword [r15 + 8 * 4 + 0]\nmov rax, 0\nmov r12, 0\nlahf\nmov r12, rax\n\nlock dec qword [r15 + 8 * 5 + 0]\nmov rax, 0\nlahf\nxor r12, rax\n\ndec byte [r15 + 8 * 4 + 0]\nmov rax, 0\nmov r11, 0\nlahf\nmov r11, rax\n\nlock dec byte [r15 + 8 * 5 + 0]\nmov rax, 0\nlahf\nxor r11, rax\n\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/5_FF_01_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x00000000000000ff\",\n    \"RBX\": \"0x000000000000ffff\",\n    \"RCX\": \"0x00000000ffffffff\",\n    \"RDX\": \"0xffffffffffffffff\",\n    \"R8\" : \"0x0000000000009400\",\n    \"R9\" : \"0x0000000000009400\",\n    \"R10\": \"0x0000000000009400\",\n    \"R11\": \"0x0000000000009400\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0000000000000000\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\n\nxor rax, rax\n\n; Insure that dec underflow works and sets correct flags\ndec  byte [r15 + 8 * 0 + 0]\nlahf\nmov r8, rax\n\ndec  word [r15 + 8 * 1 + 0]\nlahf\nmov r9, rax\n\ndec dword [r15 + 8 * 2 + 0]\nlahf\nmov r10, rax\n\ndec qword [r15 + 8 * 3 + 0]\nlahf\nmov r11, rax\n\n\nmov rax, [r15 + 8 * 0]\nmov rbx, [r15 + 8 * 1]\nmov rcx, [r15 + 8 * 2]\nmov rdx, [r15 + 8 * 3]\n\n\n; Mask flags we don't care about\nand r8, 0xd400\nand r9, 0xd400\nand r10, 0xd400\nand r11, 0xd400\n\nhlt"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/5_FF_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\nlea rsp, [r15 + 8 * 4]\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\n\nlea rbx, [rel .call_tgt]\nmov [r15 + 8 * 2], rbx\n\nmov rax, 0\ncall qword [r15 + 8 * 2]\njmp .end\n\n.call_tgt:\nmov rax, [r15 + 8 * 0]\nret\n\n; Couple things that could catch failure\nmov rax, 0\njmp .end\nmov rax, 0\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/5_FF_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\nlea rsp, [r15 + 8 * 4]\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\n\nlea rbx, [rel .call_tgt]\nmov [r15 + 8 * 2], rbx\n\nmov rax, 0\njmp qword [r15 + 8 * 2]\njmp .end\n\n.call_tgt:\nmov rax, [r15 + 8 * 0]\njmp .end\n\n; Couple things that could catch failure\nmov rax, 0\njmp .end\nmov rax, 0\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/5_FF_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\nmov rsp, 0xe000_1000\nmov ax, cs\nlea edi, [rel .success]\n\nsub rsp, 16\nmov [rsp], edi\nmov [rsp+4], cs\n\nmov rax, 0\njmp far [rsp]\n\nhlt\n\n.success:\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/5_FF_05_03_o32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"RBX\": \"0xe0000fe8\",\n    \"RSP\": \"0xe0000ff0\"\n  }\n}\n%endif\n\nmov rsp, 0xe000_1000\nmov ax, cs\nlea edi, [rel .success]\n\nsub rsp, 16\nmov [rsp], edi\nmov [rsp+4], cs\n\nmov rax, 0\ncall far dword [esp]\n\nhlt\n\n.success:\nmov rax, 1\nmov rbx, rsp\no32 retf\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/5_FF_05_03_o32_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"RBX\": \"0xe0000fe8\",\n    \"RSP\": \"0xe0002224\"\n  }\n}\n%endif\n\nmov rsp, 0xe000_1000\nmov ax, cs\nlea edi, [rel .success]\n\nsub rsp, 16\nmov [rsp], edi\nmov [rsp+4], cs\n\nmov rax, 0\ncall far dword [esp]\n\nhlt\n\n.success:\nmov rax, 1\nmov rbx, rsp\no32 retf 0x1234\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/5_FF_05_03_o64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"RBX\": \"0xe0000fe0\",\n    \"RSP\": \"0xe0000ff0\"\n  }\n}\n%endif\n\nmov rsp, 0xe000_1000\nmov ax, cs\nlea edi, [rel .success]\n\nsub rsp, 16\nmov [rsp], edi\nmov [rsp+4], cs\n\nmov rax, 0\no64 call far [rsp]\n\nhlt\n\n.success:\nmov rax, 1\nmov rbx, rsp\no64 retf\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/5_FF_05_03_o64_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"RBX\": \"0xe0000fe0\",\n    \"RSP\": \"0xe00090f0\"\n  }\n}\n%endif\n\nmov rsp, 0xe000_1000\nmov ax, cs\nlea edi, [rel .success]\n\nsub rsp, 16\nmov [rsp], edi\nmov [rsp+4], cs\n\nmov rax, 0\no64 call far [rsp]\n\nhlt\n\n.success:\nmov rax, 1\nmov rbx, rsp\no64 retf 0x8100\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/5_FF_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x5758000000006768\",\n    \"RCX\": \"0xE0000016\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\nlea rsp, [r15 + 8 * 4]\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6768\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\n\n; Encoding doesn't exist in x86-64\n; push dword [r15 + 8 * 1 + 0]\npush qword [r15 + 8 * 0 + 0]\npush  word [r15 + 8 * 1 + 0]\n\nmov rax, [r15 + 8 * 3]\nmov rbx, [r15 + 8 * 2]\nmov rcx, rsp\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/6_C6_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464761\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\n\nmov byte [rdx + 8 * 0 + 0], 0x61\n\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/PrimaryGroup/6_C7_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445466162\",\n    \"RBX\": \"0x5152535461626364\",\n    \"RCX\": \"0x0000000061626364\",\n    \"RDX\": \"0xFFFFFFFFFFFFFF80\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov  word [rdx + 8 * 0 + 0], 0x6162\nmov dword [rdx + 8 * 1 + 0], 0x61626364\nmov qword [rdx + 8 * 2 + 0], 0x61626364\nmov qword [rdx + 8 * 3 + 0], -128\n\nmov rax, [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\nmov rdx, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_10.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434465666768\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x0000000065666768\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445432748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162633265666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\n; Moves 32bits to lower bits\n; Doesn't effect upper bits\nmovss xmm0, xmm2\n\n; Moves 32bits to the lower bits\n; Zeroes the upper bits\nmovss xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_10_1.asm",
    "content": "\n%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000042a63326\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x0000000040ab4706\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x0000000041e83ad2\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x000000004221cdae\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x0000000042b5494c\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x0000000042b59a55\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x00000000420ce913\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x0000000042042015\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x00000000423f635c\", \"0x0000000000000000\"],\n    \"XMM9\": [\"0x0000000042c08f50\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x0000000042b062c4\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x00000000429b697f\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x000000004176837b\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x000000004253a13b\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0000000042623422\", \"0x0000000000000000\"],\n    \"XMM15\": [\"0x00000000423ee7d8\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\nmovapd xmm0, [rdx + 16 * 0]\nmovapd xmm1, [rdx + 16 * 1]\nmovapd xmm2, [rdx + 16 * 2]\nmovapd xmm3, [rdx + 16 * 3]\nmovapd xmm4, [rdx + 16 * 4]\nmovapd xmm5, [rdx + 16 * 5]\nmovapd xmm6, [rdx + 16 * 6]\nmovapd xmm7, [rdx + 16 * 7]\nmovapd xmm8, [rdx + 16 * 8]\nmovapd xmm9, [rdx + 16 * 9]\nmovapd xmm10, [rdx + 16 * 10]\nmovapd xmm11, [rdx + 16 * 11]\nmovapd xmm12, [rdx + 16 * 12]\nmovapd xmm13, [rdx + 16 * 13]\nmovapd xmm14, [rdx + 16 * 14]\nmovapd xmm15, [rdx + 16 * 15]\n\nmovss xmm0, [rdx + 16 * 0]\nmovss xmm1, [rdx + 16 * 1]\nmovss xmm2, [rdx + 16 * 2]\nmovss xmm3, [rdx + 16 * 3]\nmovss xmm4, [rdx + 16 * 4]\nmovss xmm5, [rdx + 16 * 5]\nmovss xmm6, [rdx + 16 * 6]\nmovss xmm7, [rdx + 16 * 7]\nmovss xmm8, [rdx + 16 * 8]\nmovss xmm9, [rdx + 16 * 9]\nmovss xmm10, [rdx + 16 * 10]\nmovss xmm11, [rdx + 16 * 11]\nmovss xmm12, [rdx + 16 * 12]\nmovss xmm13, [rdx + 16 * 13]\nmovss xmm14, [rdx + 16 * 14]\nmovss xmm15, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 512bytes of random data\n.data:\ndd 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n\n\n"
  },
  {
    "path": "unittests/ASM/REP/F3_11.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000045464748\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x0\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\n\n; Moves lower 32bits to memory\nmovss [rdx + 8 * 2], xmm0\n\n; Ensure 128bits weren't written\nmovapd xmm0, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_11_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000042a63326\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x0000000040ab4706\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x0000000041e83ad2\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x000000004221cdae\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x0000000042b5494c\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x0000000042b59a55\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x00000000420ce913\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x0000000042042015\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x00000000423f635c\", \"0x0000000000000000\"],\n    \"XMM9\": [\"0x0000000042c08f50\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x0000000042b062c4\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x00000000429b697f\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x000000004176837b\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x000000004253a13b\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0000000042623422\", \"0x0000000000000000\"],\n    \"XMM15\": [\"0x00000000423ee7d8\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\nmovapd xmm0, [rdx + 16 * 0]\nmovapd xmm1, [rdx + 16 * 1]\nmovapd xmm2, [rdx + 16 * 2]\nmovapd xmm3, [rdx + 16 * 3]\nmovapd xmm4, [rdx + 16 * 4]\nmovapd xmm5, [rdx + 16 * 5]\nmovapd xmm6, [rdx + 16 * 6]\nmovapd xmm7, [rdx + 16 * 7]\nmovapd xmm8, [rdx + 16 * 8]\nmovapd xmm9, [rdx + 16 * 9]\nmovapd xmm10, [rdx + 16 * 10]\nmovapd xmm11, [rdx + 16 * 11]\nmovapd xmm12, [rdx + 16 * 12]\nmovapd xmm13, [rdx + 16 * 13]\nmovapd xmm14, [rdx + 16 * 14]\nmovapd xmm15, [rdx + 16 * 15]\n\nmov rdx, 0xe0000000\nmov rax, 0\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\nmov [rdx + 8 * 6], rax\nmov [rdx + 8 * 7], rax\nmov [rdx + 8 * 8], rax\nmov [rdx + 8 * 9], rax\nmov [rdx + 8 * 10], rax\nmov [rdx + 8 * 11], rax\nmov [rdx + 8 * 12], rax\nmov [rdx + 8 * 13], rax\nmov [rdx + 8 * 14], rax\nmov [rdx + 8 * 15], rax\nmov [rdx + 8 * 16], rax\nmov [rdx + 8 * 17], rax\nmov [rdx + 8 * 18], rax\nmov [rdx + 8 * 19], rax\nmov [rdx + 8 * 20], rax\nmov [rdx + 8 * 21], rax\nmov [rdx + 8 * 22], rax\nmov [rdx + 8 * 23], rax\nmov [rdx + 8 * 24], rax\nmov [rdx + 8 * 25], rax\nmov [rdx + 8 * 26], rax\nmov [rdx + 8 * 27], rax\nmov [rdx + 8 * 28], rax\nmov [rdx + 8 * 29], rax\nmov [rdx + 8 * 30], rax\n\nmovss [rdx + 16 * 0], xmm0\nmovss [rdx + 16 * 1], xmm1\nmovss [rdx + 16 * 2], xmm2\nmovss [rdx + 16 * 3], xmm3\nmovss [rdx + 16 * 4], xmm4\nmovss [rdx + 16 * 5], xmm5\nmovss [rdx + 16 * 6], xmm6\nmovss [rdx + 16 * 7], xmm7\nmovss [rdx + 16 * 8], xmm8\nmovss [rdx + 16 * 9], xmm9\nmovss [rdx + 16 * 10], xmm10\nmovss [rdx + 16 * 11], xmm11\nmovss [rdx + 16 * 12], xmm12\nmovss [rdx + 16 * 13], xmm13\nmovss [rdx + 16 * 14], xmm14\nmovss [rdx + 16 * 15], xmm15\n\nlea rdx, [rel .data]\nmovapd xmm0, [rdx + 16 * 0]\nmovapd xmm1, [rdx + 16 * 1]\nmovapd xmm2, [rdx + 16 * 2]\nmovapd xmm3, [rdx + 16 * 3]\nmovapd xmm4, [rdx + 16 * 4]\nmovapd xmm5, [rdx + 16 * 5]\nmovapd xmm6, [rdx + 16 * 6]\nmovapd xmm7, [rdx + 16 * 7]\nmovapd xmm8, [rdx + 16 * 8]\nmovapd xmm9, [rdx + 16 * 9]\nmovapd xmm10, [rdx + 16 * 10]\nmovapd xmm11, [rdx + 16 * 11]\nmovapd xmm12, [rdx + 16 * 12]\nmovapd xmm13, [rdx + 16 * 13]\nmovapd xmm14, [rdx + 16 * 14]\nmovapd xmm15, [rdx + 16 * 15]\n\nmov rdx, 0xe0000000\n\nmovapd xmm0, [rdx + 16 * 0]\nmovapd xmm1, [rdx + 16 * 1]\nmovapd xmm2, [rdx + 16 * 2]\nmovapd xmm3, [rdx + 16 * 3]\nmovapd xmm4, [rdx + 16 * 4]\nmovapd xmm5, [rdx + 16 * 5]\nmovapd xmm6, [rdx + 16 * 6]\nmovapd xmm7, [rdx + 16 * 7]\nmovapd xmm8, [rdx + 16 * 8]\nmovapd xmm9, [rdx + 16 * 9]\nmovapd xmm10, [rdx + 16 * 10]\nmovapd xmm11, [rdx + 16 * 11]\nmovapd xmm12, [rdx + 16 * 12]\nmovapd xmm13, [rdx + 16 * 13]\nmovapd xmm14, [rdx + 16 * 14]\nmovapd xmm15, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 512bytes of random data\n.data:\ndd 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n\n\n"
  },
  {
    "path": "unittests/ASM/REP/F3_12.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4546474845464748\", \"0x5556575855565758\"],\n    \"XMM1\":  [\"0x4546474845464748\", \"0x5556575855565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162633265666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm0, [rdx + 8 * 2]\nmovapd xmm1, [rdx + 8 * 2]\n\nmovsldup xmm0, xmm2\nmovsldup xmm1, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434441424344\", \"0x5152535451525354\"],\n    \"XMM1\":  [\"0x4142434441424344\", \"0x5152535451525354\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162633265666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm0, [rdx + 8 * 2]\nmovapd xmm1, [rdx + 8 * 2]\n\nmovshdup xmm0, xmm2\nmovshdup xmm1, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_2A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x414243443f800000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434440000000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4142434440400000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4142434440800000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x41424344C0800000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x41424344C0800000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1\nmov [rdx + 8 * 2], rax\nmov rax, 0x2\nmov [rdx + 8 * 3], rax\nmov rax, 0x3\nmov [rdx + 8 * 4], rax\nmov rax, 0x4\nmov [rdx + 8 * 5], rax\n\n; Stick something in the top 32bits to ensure correctness\nmov rax, 0x7fc00000FFFFFFFC\nmov [rdx + 8 * 6], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\nmovapd xmm5, [rdx + 8 * 0]\n\nmov rax, [rdx + 8 * 2]\nmov rbx, [rdx + 8 * 3]\n\ncvtsi2ss xmm0, rax\ncvtsi2ss xmm1, ebx\n\ncvtsi2ss xmm2, dword [rdx + 8 * 4]\ncvtsi2ss xmm3, qword [rdx + 8 * 5]\n\nmov rbx, [rdx + 8 * 6]\n\ncvtsi2ss xmm4, ebx\ncvtsi2ss xmm5, dword [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_2A_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4054c664ce741f21\", \"0x40516053e2d6238e\"],\n    \"XMM1\": [\"0x4044836dcef227d0\", \"0x402a1e1c58255b03\"],\n    \"XMM2\": [\"0x401568e0ce5898b3\", \"0x4035fe425aee6320\"],\n    \"XMM3\": [\"0x402359004e7ba882\", \"0x40154b7d41743e96\"],\n    \"XMM4\": [\"0x403d075a4e4692f7\", \"0x4050a018bd66277c\"],\n    \"XMM5\": [\"0x40334ec14efd75e2\", \"0x4056d7404ea4a8c1\"],\n    \"XMM6\": [\"0x404439b5ce60c9da\", \"0x40497b136a400fbb\"],\n    \"XMM7\": [\"0x4040528bce7a58f7\", \"0x4037f9ca18bd6627\"],\n    \"XMM8\": [\"0x4056a9295e80ad52\", \"0x403839b866e43aa8\"],\n    \"XMM9\": [\"0x4058bc1f5e80b178\", \"0x4056cde5c91d14e4\"],\n    \"XMM10\": [\"0x4056b34a5e80ad67\", \"0x4058defb00bcbe62\"],\n    \"XMM11\": [\"0x40503e3c5e80a07c\", \"0x4052997f0ed3d85a\"],\n    \"XMM12\": [\"0x40419d225e80833a\", \"0x40395a6bf8769ec3\"],\n    \"XMM13\": [\"0x40177e285e802efc\", \"0x40568cc5974e65bf\"],\n    \"XMM14\": [\"0x404084025e808108\", \"0x404a03c74fb549f9\"],\n    \"XMM15\": [\"0x404d31595e809a63\", \"0x402459c23b7952d2\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\nmovapd xmm0, [rdx + 16 * 0]\nmovapd xmm1, [rdx + 16 * 1]\nmovapd xmm2, [rdx + 16 * 2]\nmovapd xmm3, [rdx + 16 * 3]\nmovapd xmm4, [rdx + 16 * 4]\nmovapd xmm5, [rdx + 16 * 5]\nmovapd xmm6, [rdx + 16 * 6]\nmovapd xmm7, [rdx + 16 * 7]\nmovapd xmm8, [rdx + 16 * 8]\nmovapd xmm9, [rdx + 16 * 9]\nmovapd xmm10, [rdx + 16 * 10]\nmovapd xmm11, [rdx + 16 * 11]\nmovapd xmm12, [rdx + 16 * 12]\nmovapd xmm13, [rdx + 16 * 13]\nmovapd xmm14, [rdx + 16 * 14]\nmovapd xmm15, [rdx + 16 * 15]\n\n\ncvtsi2ss xmm0, dword [rdx + 16 * 0]\ncvtsi2ss xmm1, dword [rdx + 16 * 1]\ncvtsi2ss xmm2, dword [rdx + 16 * 2]\ncvtsi2ss xmm3, dword [rdx + 16 * 3]\ncvtsi2ss xmm4, dword [rdx + 16 * 4]\ncvtsi2ss xmm5, dword [rdx + 16 * 5]\ncvtsi2ss xmm6, dword [rdx + 16 * 6]\ncvtsi2ss xmm7, dword [rdx + 16 * 7]\ncvtsi2ss xmm8,  qword [rdx + 16 * 8]\ncvtsi2ss xmm9,  qword [rdx + 16 * 9]\ncvtsi2ss xmm10, qword [rdx + 16 * 10]\ncvtsi2ss xmm11, qword [rdx + 16 * 11]\ncvtsi2ss xmm12, qword [rdx + 16 * 12]\ncvtsi2ss xmm13, qword [rdx + 16 * 13]\ncvtsi2ss xmm14, qword [rdx + 16 * 14]\ncvtsi2ss xmm15, qword [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 512bytes of random data\n.data:\ndq 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n.data2:\ndd 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n\n"
  },
  {
    "path": "unittests/ASM/REP/F3_2A_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x414243444F800000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmovapd xmm0, [rdx + 8 * 0]\n\n; Ensures that a large \"negative\" 32bit value converts correctly in cvtsi2ss when treated as a 64bit value\n; Upper bits being zero\nmov rax, 0xFFFFFFFF\ncvtsi2ss xmm0, rax\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_2B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x0000000045464748\", \"0x0\"]\n  },\n  \"HostFeatures\": [\"SSE4A\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovntss [rdx + 8 * 2], xmm0\nmovaps xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_2C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x2\",\n    \"RCX\": \"0x3\",\n    \"RDX\": \"0x4\",\n    \"RBP\": \"0xFFFFFFFE\",\n    \"RSI\": \"0xFFFFFFFFFFFFFFFC\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x414243443f800000\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\n\nmov rax, 0x4142434440000000\nmov [r15 + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 3], rax\n\nmov rax, 0x4142434440400000\nmov [r15 + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 5], rax\n\nmov rax, 0x4142434440800000\nmov [r15 + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 7], rax\n\nmov rax, 0x41424344C0000000\nmov [r15 + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 9], rax\n\nmov rax, 0x41424344C0800000\nmov [r15 + 8 * 10], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 11], rax\n\nmovapd xmm0, [r15 + 8 * 0]\nmovapd xmm1, [r15 + 8 * 2]\n\nmov rax, -1\nmov rbx, -1\nmov rcx, -1\nmov rdx, -1\nmov rbp, -1\nmov rsi, -1\n\ncvttss2si eax, xmm0\ncvttss2si rbx, xmm1\n\ncvttss2si ebp, [r15 + 8 * 8]\ncvttss2si rsi, [r15 + 8 * 10]\n\ncvttss2si ecx, [r15 + 8 * 4]\ncvttss2si rdx, [r15 + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_2D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RCX\": \"0xFFFFFFFE\",\n    \"RDX\": \"0xFFFFFFFFFFFFFFFC\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x414243443f800000\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\n\nmov rax, 0x41424344bf800000\nmov [r15 + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 3], rax\n\nmov rax, 0x41424344C0000000\nmov [r15 + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 5], rax\n\nmov rax, 0x41424344C0800000\nmov [r15 + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 7], rax\n\nmovapd xmm0, [r15 + 8 * 0]\nmovapd xmm1, [r15 + 8 * 2]\n\nmov rax, -1\nmov rbx, -1\nmov rcx, -1\nmov rdx, -1\n\ncvtss2si eax, xmm0\ncvtss2si rbx, xmm1\n\ncvtss2si ecx, [r15 + 8 * 4]\ncvtss2si rdx, [r15 + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_51.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x414243443f800000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434440000000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4142434440400000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4142434440800000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x414243443f800000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x4142434440000000\", \"0x5152535455565758\"],\n    \"XMM6\":  [\"0x4142434440400000\", \"0x5152535455565758\"],\n    \"XMM7\":  [\"0x4142434440800000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x414243443f800000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434440800000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4142434441100000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4142434441800000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x4142434441c80000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\nsqrtss xmm0, xmm0\nsqrtss xmm1, xmm1\nsqrtss xmm2, xmm2\nsqrtss xmm3, xmm3\n\nsqrtss xmm4, [rdx + 8 * 0]\nsqrtss xmm5, [rdx + 8 * 2]\nsqrtss xmm6, [rdx + 8 * 4]\nsqrtss xmm7, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_52.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"RBX\": \"1\",\n    \"RCX\": \"1\",\n    \"RDX\": \"1\",\n    \"XMM0\":  [\"0x4142434400000000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434400000000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4142434400000000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4142434400000000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x4142434400000000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x4142434400000000\", \"0x5152535455565758\"],\n    \"XMM6\":  [\"0x4142434400000000\", \"0x5152535455565758\"],\n    \"XMM7\":  [\"0x4142434400000000\", \"0x5152535455565758\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\n\nsection .text\nglobal _start\n\n_start:\nmovapd xmm0, [rel arg1]\nmovapd xmm1, [rel arg2]\nmovapd xmm2, [rel arg3]\nmovapd xmm3, [rel arg4]\nmovapd xmm4, [rel arg5]\nmovapd xmm5, [rel arg5]\nmovapd xmm6, [rel arg5]\nmovapd xmm7, [rel arg5]\n\nrsqrtss xmm0, xmm0\nrsqrtss xmm1, xmm1\nrsqrtss xmm2, xmm2\nrsqrtss xmm3, xmm3\n\nrsqrtss xmm4, [rel arg1]\nrsqrtss xmm5, [rel arg2]\nrsqrtss xmm6, [rel arg3]\nrsqrtss xmm7, [rel arg4]\n\n\n; Check precision of the results\n; while ensuring we didn't destroy the rest of the register.\n%include \"checkprecision.mac\"\n\n;; We will be storing the low 32bits to memory, then zeroing them.\n;; We'll then check precision using checkprecision.mac.\n; Zero rsi:\nxor esi, esi\n\npextrd [rel result1], xmm0, 0\npinsrd xmm0, esi, 0\ncheck_relerr rel eresult1, rel result1, rel tolerance\nmov rbx, rax\n\npextrd [rel result2], xmm1, 0\npinsrd xmm1, esi, 0\ncheck_relerr rel eresult2, rel result2, rel tolerance\nmov rcx, rax\n\npextrd [rel result3], xmm2, 0\npinsrd xmm2, esi, 0\ncheck_relerr rel eresult3, rel result3, rel tolerance\nmov rdx, rax\n\npextrd [rel result4], xmm3, 0\npinsrd xmm3, esi, 0\ncheck_relerr rel eresult4, rel result4, rel tolerance\n\n; no need to test the other results which are the same,\n; we can just zero them.\npinsrd xmm4, esi, 0\npinsrd xmm5, esi, 0\npinsrd xmm6, esi, 0\npinsrd xmm7, esi, 0\nhlt\n\nalign 4096\nresult1 dd 0\nresult2 dd 0\nresult3 dd 0\nresult4 dd 0\n\nalign 16\n\narg1:\ndq 0x414243443f800000 ; 1.0\ndq 0x5152535455565758\n\narg2:\ndq 0x4142434440800000 ; 4.0\ndq 0x5152535455565758\n\narg3:\ndq 0x4142434441100000 ; 9.0\ndq 0x5152535455565758\n\narg4:\ndq 0x4142434441800000 ; 16.0\ndq 0x5152535455565758\n\narg5:\ndq 0x4142434441c80000 ; 25.0\ndq 0x5152535455565758\n\neresult1:\ndd 0x3f800000 ; 1.0\n\neresult2:\ndd 0x3f000000 ; 0.5\n\neresult3:\ndd 0x3eaaaaab ; 1/3 = 0.(3)\n\neresult4:\ndd 0x3e800000 ; 0.25\n\ntolerance:\ndd 0x39c00000\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/REP/F3_52_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"XMM0\":  [\"0x414243447f800000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x41424344ff800000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4142434400000000\", \"0x5152535455565758\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nsection .text\nglobal _start\n\n_start:\nmovapd xmm0, [rel arg1]\nmovapd xmm1, [rel arg2]\nmovapd xmm2, [rel arg3]\n\nrsqrtss xmm0, xmm0\nrsqrtss xmm1, xmm1\nrsqrtss xmm2, xmm2\n\n; The last comparison returns nan so we need to check the \n; result manually\nucomiss xmm2, xmm2\nsetp al ; sets al to 1 if xmm2 is nan\nxor esi, esi\npinsrd xmm2, esi, 0 ; inserts 0 in place of nan to test other bits\nhlt\n\nsection .data\nalign 32\narg1:\ndq 0x4142434400000000 ; 0.0, result is inf\ndq 0x5152535455565758\n\narg2:\ndq 0x4142434480000000 ; -0.0, result is -inf\ndq 0x5152535455565758\n\narg3:\ndq 0x41424344c0800000 ; -4.0, result is nan\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/REP/F3_53.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"RBX\": \"1\",\n    \"XMM0\":  [\"0x3f80000000000000\", \"0x3f8000003f800000\"],\n    \"XMM1\":  [\"0x4080000000000000\", \"0x4080000040800000\"],\n    \"XMM2\":  [\"0xdeadbeef7f800000\", \"0xbadc0ffebadc0ffe\"]\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\n; Check precision of the results\n; while ensuring we didn't destroy the rest of the register.\n%include \"checkprecision.mac\"\n\nsection .text\nglobal _start\n\n_start:\nmovapd xmm0, [rel arg1]\nmovapd xmm1, [rel arg2]\nmovapd xmm2, [rel arg3]\n\nrcpss xmm0, xmm0\nrcpss xmm1, [rel arg2]\nrcpss xmm2, xmm2\n\nxor esi, esi\n\npextrd [rel result1], xmm0, 0\npinsrd xmm0, esi, 0\ncheck_relerr rel eresult1, rel result1, rel tolerance\nmov rbx, rax\n\npextrd [rel result2], xmm1, 0\npinsrd xmm1, esi, 0\ncheck_relerr rel eresult2, rel result2, rel tolerance\n\nhlt\n\nalign 4096\nresult1 dd 0\nresult2 dd 0\n\nalign 16\n\narg1:\ndq 0x3f8000003f800000 ; 1.0\ndq 0x3f8000003f800000\n\narg2:\ndq 0x4080000040800000 ; 4.0\ndq 0x4080000040800000\n\narg3:\ndq 0xdeadbeef00000000 ; 0.0\ndq 0xbadc0ffebadc0ffe\n\neresult1:\ndd 0x3f800000 ; 1.0\n\neresult2:\ndd 0x3e800000 ; 0.5\n\ntolerance:\ndd 0x39c00000\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/REP/F3_58.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434440a00000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434440800000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4142434441c80000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4142434441800000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x4142434441d00000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x4142434441e80000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x414243443f800000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434440800000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4142434441100000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4142434441800000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x4142434441c80000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\naddss xmm0, xmm1\naddss xmm2, xmm3\n\naddss xmm4, [rdx + 8 * 0]\naddss xmm5, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_59.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434440800000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434440800000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4142434443100000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4142434441800000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x4142434441c80000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x4142434442c80000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x414243443f800000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434440800000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4142434441100000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4142434441800000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x4142434441c80000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\nmulss xmm0, xmm1 ; 1.0 <op> 4.0\nmulss xmm2, xmm3 ; 9.0 <op> 16.0\n\nmulss xmm4, [rdx + 8 * 0] ; 25.0 <op> 1.0\nmulss xmm5, [rdx + 8 * 2] ; 25.0 <op> 4.0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_5A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4010000000000000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434440800000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4030000000000000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4142434441800000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x3FF0000000000000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x4010000000000000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\nmov rax, 0x414243443f800000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434440800000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4142434441100000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4142434441800000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x4142434441c80000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\ncvtss2sd xmm0, xmm1 ; 1.0 <op> 4.0\ncvtss2sd xmm2, xmm3 ; 9.0 <op> 16.0\n\ncvtss2sd xmm4, [rdx + 8 * 0] ; 25.0 <op> 1.0\ncvtss2sd xmm5, [rdx + 8 * 2] ; 25.0 <op> 4.0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_5A_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4054c664c0000000\", \"0x4150f0e342241b6c\"],\n    \"XMM1\": [\"0x401568e0c0000000\", \"0x40aa5bea411ac802\"],\n    \"XMM2\": [\"0x403d075a40000000\", \"0x42b6ba02419a760c\"],\n    \"XMM3\": [\"0x404439b5c0000000\", \"0x41bfce514202945e\"],\n    \"XMM4\": [\"0x4056a92980000000\", \"0x42b66f2e42c5e0f9\"],\n    \"XMM5\": [\"0x4056b34aa0000000\", \"0x4294cbf84281f1e5\"],\n    \"XMM6\": [\"0x40419d2260000000\", \"0x42b4662d40bbf141\"],\n    \"XMM7\": [\"0x40408402a0000000\", \"0x4122ce1242698acb\"],\n    \"XMM8\": [\"0x4047ec6b80000000\", \"0x4283a06842b40f2e\"],\n    \"XMM9\": [\"0x405811ea00000000\", \"0x42be038e41ccb7ba\"],\n    \"XMM10\": [\"0x40560c5880000000\", \"0x41245b0e42461aa5\"],\n    \"XMM11\": [\"0x40536d2fe0000000\", \"0x42252cf2411ce3bd\"],\n    \"XMM12\": [\"0x402ed06f60000000\", \"0x425e2c0d4119c75a\"],\n    \"XMM13\": [\"0x404a742760000000\", \"0x4041495242910ec1\"],\n    \"XMM14\": [\"0x404c468440000000\", \"0x42b17c64427763b2\"],\n    \"XMM15\": [\"0x4047dcfb00000000\", \"0x42c16d124206d293\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\nmovapd xmm0, [rdx + 16 * 0]\nmovapd xmm1, [rdx + 16 * 1]\nmovapd xmm2, [rdx + 16 * 2]\nmovapd xmm3, [rdx + 16 * 3]\nmovapd xmm4, [rdx + 16 * 4]\nmovapd xmm5, [rdx + 16 * 5]\nmovapd xmm6, [rdx + 16 * 6]\nmovapd xmm7, [rdx + 16 * 7]\nmovapd xmm8, [rdx + 16 * 8]\nmovapd xmm9, [rdx + 16 * 9]\nmovapd xmm10, [rdx + 16 * 10]\nmovapd xmm11, [rdx + 16 * 11]\nmovapd xmm12, [rdx + 16 * 12]\nmovapd xmm13, [rdx + 16 * 13]\nmovapd xmm14, [rdx + 16 * 14]\nmovapd xmm15, [rdx + 16 * 15]\n\n\ncvtss2sd xmm0, [rdx + 16 * 0]\ncvtss2sd xmm1, [rdx + 16 * 1]\ncvtss2sd xmm2, [rdx + 16 * 2]\ncvtss2sd xmm3, [rdx + 16 * 3]\ncvtss2sd xmm4, [rdx + 16 * 4]\ncvtss2sd xmm5, [rdx + 16 * 5]\ncvtss2sd xmm6, [rdx + 16 * 6]\ncvtss2sd xmm7, [rdx + 16 * 7]\ncvtss2sd xmm8, [rdx + 16 * 8]\ncvtss2sd xmm9, [rdx + 16 * 9]\ncvtss2sd xmm10, [rdx + 16 * 10]\ncvtss2sd xmm11, [rdx + 16 * 11]\ncvtss2sd xmm12, [rdx + 16 * 12]\ncvtss2sd xmm13, [rdx + 16 * 13]\ncvtss2sd xmm14, [rdx + 16 * 14]\ncvtss2sd xmm15, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 512bytes of random data\n.data:\ndd 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n\n"
  },
  {
    "path": "unittests/ASM/REP/F3_5B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000100000001\", \"0x0000000200000002\"],\n    \"XMM1\":  [\"0x0000000400000004\", \"0x0000000800000008\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3fc000003f800000 ; [1.5, 1.0]\nmov [rdx + 8 * 0], rax\nmov rax, 0x4039999a40000000 ; [2.9, 2.0]\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4083333340800000 ; [4.1, 4.0]\nmov [rdx + 8 * 2], rax\nmov rax, 0x4108000041000000 ; [8.5, 8.0]\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmovapd xmm0, [rdx + 8 * 4]\nmovapd xmm1, [rdx + 8 * 4]\n\nmovapd xmm2, [rdx + 8 * 0]\n\ncvttps2dq xmm0, xmm2\ncvttps2dq xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_5B_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000004500000053\", \"0x0000000d00000029\"],\n    \"XMM1\":  [\"0x0000001500000005\", \"0x0000000500000009\"],\n    \"XMM2\":  [\"0x000000420000001d\", \"0x0000005b00000013\"],\n    \"XMM3\":  [\"0x0000003200000028\", \"0x0000001700000020\"],\n    \"XMM4\":  [\"0x000000180000005a\", \"0x0000005b00000062\"],\n    \"XMM5\":  [\"0x000000630000005a\", \"0x0000004a00000040\"],\n    \"XMM6\":  [\"0x0000001900000023\", \"0x0000005a00000005\"],\n    \"XMM7\":  [\"0x0000003400000021\", \"0x0000000a0000003a\"],\n    \"XMM8\":  [\"0x000000540000002f\", \"0x000000410000005a\"],\n    \"XMM9\":  [\"0x0000000600000060\", \"0x0000005f00000019\"],\n    \"XMM10\": [\"0x0000002500000058\", \"0x0000000a00000031\"],\n    \"XMM11\": [\"0x000000140000004d\", \"0x0000002900000009\"],\n    \"XMM12\": [\"0x000000390000000f\", \"0x0000003700000009\"],\n    \"XMM13\": [\"0x0000000400000034\", \"0x0000000300000048\"],\n    \"XMM14\": [\"0x0000004700000038\", \"0x000000580000003d\"],\n    \"XMM15\": [\"0x000000180000002f\", \"0x0000006000000021\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\ncvttps2dq xmm0, [rdx + 16 * 0]\ncvttps2dq xmm1, [rdx + 16 * 1]\ncvttps2dq xmm2, [rdx + 16 * 2]\ncvttps2dq xmm3, [rdx + 16 * 3]\ncvttps2dq xmm4, [rdx + 16 * 4]\ncvttps2dq xmm5, [rdx + 16 * 5]\ncvttps2dq xmm6, [rdx + 16 * 6]\ncvttps2dq xmm7, [rdx + 16 * 7]\ncvttps2dq xmm8, [rdx + 16 * 8]\ncvttps2dq xmm9, [rdx + 16 * 9]\ncvttps2dq xmm10, [rdx + 16 * 10]\ncvttps2dq xmm11, [rdx + 16 * 11]\ncvttps2dq xmm12, [rdx + 16 * 12]\ncvttps2dq xmm13, [rdx + 16 * 13]\ncvttps2dq xmm14, [rdx + 16 * 14]\ncvttps2dq xmm15, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndd 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/REP/F3_5C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x41424344c0400000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434440800000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x41424344c0e00000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4142434441800000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x4142434441c00000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x4142434441a80000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x414243443f800000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434440800000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4142434441100000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4142434441800000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x4142434441c80000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\nsubss xmm0, xmm1 ; 1.0 <op> 4.0\nsubss xmm2, xmm3 ; 9.0 <op> 16.0\n\nsubss xmm4, [rdx + 8 * 0] ; 25.0 <op> 1.0\nsubss xmm5, [rdx + 8 * 2] ; 25.0 <op> 4.0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_5D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x515253543f800000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x5152535440800000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x5152535441100000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x5152535441800000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x515253543f800000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x5152535440800000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x515253543f800000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x5152535440800000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x5152535441100000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x5152535441800000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x5152535441c80000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\nminss xmm0, xmm1 ; 1.0 <op> 4.0\nminss xmm2, xmm3 ; 9.0 <op> 16.0\n\nminss xmm4, [rdx + 8 * 0] ; 25.0 <op> 1.0\nminss xmm5, [rdx + 8 * 2] ; 25.0 <op> 4.0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_5E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x414243443e800000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4142434440800000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x414243443f100000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4142434441800000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x4142434441c80000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x4142434440c80000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x414243443f800000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434440800000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4142434441100000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4142434441800000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x4142434441c80000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\ndivss xmm0, xmm1 ; 1.0 <op> 4.0\ndivss xmm2, xmm3 ; 9.0 <op> 16.0\n\ndivss xmm4, [rdx + 8 * 0] ; 25.0 <op> 1.0\ndivss xmm5, [rdx + 8 * 2] ; 25.0 <op> 4.0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_5F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x5152535440800000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x5152535440800000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x5152535441800000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x5152535441800000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x5152535441c80000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x5152535441c80000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x515253543f800000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x5152535440800000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x5152535441100000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x5152535441800000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x5152535441c80000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\nmaxss xmm0, xmm1 ; 1.0 <op> 4.0\nmaxss xmm2, xmm3 ; 9.0 <op> 16.0\n\nmaxss xmm4, [rdx + 8 * 0] ; 25.0 <op> 1.0\nmaxss xmm5, [rdx + 8 * 2] ; 25.0 <op> 4.0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_6F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x5152535455565758\", \"0x6162636465666768\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nmovdqu xmm0, [rdx + 8 * 0]\nmovdqu xmm1, [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_70.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5758575857585758\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x7172717271727172\"],\n    \"XMM3\": [\"0x4142434445464748\", \"0x5556555657585758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\npshufhw xmm1, xmm0, 0x0\npshufhw xmm2, [rdx + 8 * 2], 0xFF\n\n; Top bit different from low bits\npshufhw xmm3, [rdx], 80\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_7E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x6162636465666768\", \"0x0\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm2, [rdx + 8 * 2]\n\nmovq xmm0, xmm2\nmovq xmm1, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_7F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x5152535455565758\", \"0x6162636465666768\"],\n    \"XMM2\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM3\": [\"0x0\", \"0x0\"],\n    \"XMM4\": [\"0x5152535455565758\", \"0x6162636465666768\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nmov rax, 0\nmov [rdx + 8 * 3], rax\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\nmov [rdx + 8 * 6], rax\nmov [rdx + 8 * 7], rax\n\nmovdqu xmm0, [rdx + 8 * 0]\nmovdqu xmm1, [rdx + 8 * 1]\n\nmovdqu [rdx + 8 * 3], xmm0\n\nmovdqu xmm2, [rdx + 8 * 3]\n; Ensure it didn't write past where it should\nmovdqu xmm3, [rdx + 8 * 5]\n\nmovdqu xmm4, xmm1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_B8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x6\",\n    \"RBX\": \"0x10\",\n    \"RCX\": \"0x1D\",\n    \"RDX\": \"0x0\",\n    \"RSI\": \"0x20\",\n    \"R14\": \"0x10\",\n    \"R13\": \"0x40\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nmov rax, 0\nmov [rdx + 8 * 3], rax\n\npopcnt ax, word [rdx + 8 * 0]\npopcnt ebx, dword [rdx + 8 * 1]\npopcnt rcx, qword [rdx + 8 * 2]\n\nmov r15, 0\npopcnt rdx, r15\n\nmov r15, 0xFFFFFFFFFFFFFFFF\npopcnt esi, r15d\npopcnt r14w, r15w\npopcnt r13, r15\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_BC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3\",\n    \"RBX\": \"0x3\",\n    \"RCX\": \"0x3\",\n    \"RDX\": \"0x40\",\n    \"RSI\": \"0x0\",\n    \"R14\": \"0x0\",\n    \"R13\": \"0x0\",\n    \"R12\": \"0x20\",\n    \"R11\": \"0x10\"\n  },\n  \"HostFeatures\": [\"BMI1\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nmov rax, 0\nmov [rdx + 8 * 3], rax\n\ntzcnt ax, word [rdx + 8 * 0]\ntzcnt ebx, dword [rdx + 8 * 1]\ntzcnt rcx, qword [rdx + 8 * 2]\n\nmov r15, 0\nmov r12, 0\nmov r11, 0\ntzcnt rdx, r15\ntzcnt r12d, r15d\ntzcnt r11w, r15w\n\nmov r15, 0xFFFFFFFFFFFFFFFF\ntzcnt esi, r15d\ntzcnt r14w, r15w\ntzcnt r13, r15\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_BD.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RCX\": \"0x10\",\n    \"RDX\": \"0x20\",\n    \"RSI\": \"0x40\",\n    \"RDI\": \"0\",\n    \"RBP\": \"0\",\n    \"RSP\": \"0\",\n    \"R8\":  \"0x8\",\n    \"R9\":  \"0x10\",\n    \"R10\": \"0x20\",\n    \"R15\": \"0x2A540\"\n  }\n}\n%endif\n\n; Uses AX and BX and stores result in r15\n; CF:ZF\n%macro zfcfmerge 0\n  lahf\n\n  ; Shift CF to zero\n  shr ax, 8\n\n  ; Move to a temp\n  mov bx, ax\n  and rbx, 1\n\n  shl r15, 1\n  or r15, rbx\n\n  shl r15, 1\n\n  ; Move to a temp\n  mov bx, ax\n\n  ; Extract ZF\n  shr bx, 6\n  and rbx, 1\n\n  ; Insert ZF\n  or r15, rbx\n%endmacro\n\nmov rax, 0x80000001\ncpuid\n\nshr ecx, 5\nand ecx, 1\ncmp ecx, 1\nje .continue\n\n; We don't support the instruction. Leave\nmov rax, 0xDEADBEEF41414141\nhlt\n\n.continue:\n\nmov rax, 0\nmov rbx, 0\nmov r15, 0\n\n; Test zeroes\nmov rcx, 0\nlzcnt cx, cx\nzfcfmerge\n\nmov rdx, 0\nlzcnt edx, edx\nzfcfmerge\n\nmov rsi, 0\nlzcnt rsi, rsi\nzfcfmerge\n\n; Test highest bit set to 1\nmov rdi, 0x8000\nlzcnt di, di\nzfcfmerge\n\nmov rbp, 0x80000000\nlzcnt ebp, ebp\nzfcfmerge\n\nmov rsp, 0x8000000000000000\nlzcnt rsp, rsp\nzfcfmerge\n\n; Test bit in the middle of the range\nmov r8, 0x0080\nlzcnt r8w, r8w\nzfcfmerge\n\nmov r9, 0x00008000\nlzcnt r9d, r9d\nzfcfmerge\n\nmov r10, 0x00000080000000\nlzcnt r10, r10\nzfcfmerge\n\nmov rax, 0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_BD_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x40\",\n    \"RBX\": \"0x07\",\n    \"RCX\": \"0x0F\",\n    \"RDX\": \"0x17\",\n    \"RSI\": \"0x1F\",\n    \"RDI\": \"0x27\",\n    \"RBP\": \"0x2F\",\n    \"RSP\": \"0x37\",\n    \"R8\":  \"0x3F\",\n    \"R9\":  \"0x00\",\n    \"R10\": \"0x08\",\n    \"R11\": \"0x10\",\n    \"R12\": \"0x18\",\n    \"R13\": \"0x20\",\n    \"R14\": \"0x28\",\n    \"R15\": \"0x38\"\n  }\n}\n%endif\n\nlea r15, [rel .data]\n\n; We only care about results here\nlzcnt rax, qword [r15 + 8 * 0]\nlzcnt rbx, qword [r15 + 8 * 1]\nlzcnt rcx, qword [r15 + 8 * 2]\nlzcnt rdx, qword [r15 + 8 * 3]\nlzcnt rsi, qword [r15 + 8 * 4]\nlzcnt rdi, qword [r15 + 8 * 5]\nlzcnt rbp, qword [r15 + 8 * 6]\nlzcnt rsp, qword [r15 + 8 * 7]\nlzcnt r8,  qword [r15 + 8 * 8]\nlzcnt r9,  qword [r15 + 8 * 9]\nlzcnt r10, qword [r15 + 8 * 10]\nlzcnt r11, qword [r15 + 8 * 11]\nlzcnt r12, qword [r15 + 8 * 12]\nlzcnt r13, qword [r15 + 8 * 13]\nlzcnt r14, qword [r15 + 8 * 14]\nlzcnt r15, qword [r15 + 8 * 15]\n\nhlt\n\n.data:\ndq 0x0000000000000000\ndq 0x01FFFFFFFFFFFFFF\ndq 0x0001FFFFFFFFFFFF\ndq 0x000001FFFFFFFFFF\ndq 0x00000001FFFFFFFF\ndq 0x0000000001FFFFFF\ndq 0x000000000001FFFF\ndq 0x00000000000001FF\ndq 0x0000000000000001\ndq 0x8000000000000000\ndq 0x0080000000000000\ndq 0x0000800000000000\ndq 0x0000008000000000\ndq 0x0000000080000000\ndq 0x0000000000800000\n"
  },
  {
    "path": "unittests/ASM/REP/F3_BD_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x20\",\n    \"RBX\": \"0x07\",\n    \"RCX\": \"0x0F\",\n    \"RDX\": \"0x17\",\n    \"RSI\": \"0x1F\",\n    \"RDI\": \"0x00\",\n    \"RBP\": \"0x08\",\n    \"RSP\": \"0x10\",\n    \"R8\":  \"0x1F\",\n    \"R9\":  \"0x00\",\n    \"R10\": \"0x06\",\n    \"R11\": \"0x0E\",\n    \"R12\": \"0x16\",\n    \"R13\": \"0x1E\",\n    \"R14\": \"0x1D\",\n    \"R15\": \"0x18\"\n  }\n}\n%endif\n\nlea r15, [rel .data]\n\n; We only care about results here\nlzcnt eax,  dword [r15 + 4 * 0]\nlzcnt ebx,  dword [r15 + 4 * 1]\nlzcnt ecx,  dword [r15 + 4 * 2]\nlzcnt edx,  dword [r15 + 4 * 3]\nlzcnt esi,  dword [r15 + 4 * 4]\nlzcnt edi,  dword [r15 + 4 * 5]\nlzcnt ebp,  dword [r15 + 4 * 6]\nlzcnt esp,  dword [r15 + 4 * 7]\nlzcnt r8d,  dword [r15 + 4 * 4]\nlzcnt r9d,  dword [r15 + 4 * 9]\nlzcnt r10d, dword [r15 + 4 * 10]\nlzcnt r11d, dword [r15 + 4 * 11]\nlzcnt r12d, dword [r15 + 4 * 12]\nlzcnt r13d, dword [r15 + 4 * 13]\nlzcnt r14d, dword [r15 + 4 * 14]\nlzcnt r15d, dword [r15 + 4 * 15]\n\nhlt\n\n.data:\ndd 0x00000000\ndd 0x01FFFFFF\ndd 0x0001FFFF\ndd 0x000001FF\ndd 0x00000001\ndd 0x80000000\ndd 0x00800000\ndd 0x00008000\ndd 0x00000080\ndd 0xFFFFFFFF\ndd 0x02000000\ndd 0x00020000\ndd 0x00000200\ndd 0x00000002\ndd 0x00000004\n"
  },
  {
    "path": "unittests/ASM/REP/F3_BD_4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFF0010\",\n    \"RBX\": \"0xFFFFFFFFFFFF0003\",\n    \"RCX\": \"0xFFFFFFFFFFFF0007\",\n    \"RDX\": \"0xFFFFFFFFFFFF000B\",\n    \"RSI\": \"0xFFFFFFFFFFFF000F\",\n    \"RDI\": \"0xFFFFFFFFFFFF0000\",\n    \"RBP\": \"0xFFFFFFFFFFFF0004\",\n    \"RSP\": \"0xFFFFFFFFFFFF0008\",\n    \"R8\":  \"0xFFFFFFFFFFFF000F\",\n    \"R9\":  \"0xFFFFFFFFFFFF0000\",\n    \"R10\": \"0xFFFFFFFFFFFF0002\",\n    \"R11\": \"0xFFFFFFFFFFFF0006\",\n    \"R12\": \"0xFFFFFFFFFFFF000A\",\n    \"R13\": \"0xFFFFFFFFFFFF000E\",\n    \"R14\": \"0xFFFFFFFFFFFF000D\",\n    \"R15\": \"0x0000000000000008\"\n  }\n}\n%endif\n\nlea r15, [rel .data]\n\nmov rax, -1\nmov rbx, -1\nmov rcx, -1\nmov rdx, -1\nmov rsi, -1\nmov rdi, -1\nmov rbp, -1\nmov rsp, -1\nmov r8,  -1\nmov r9,  -1\nmov r10, -1\nmov r11, -1\nmov r12, -1\nmov r13, -1\nmov r14, -1\n\n; We only care about results here\nlzcnt ax,  word [r15 + 2 * 0]\nlzcnt bx,  word [r15 + 2 * 1]\nlzcnt cx,  word [r15 + 2 * 2]\nlzcnt dx,  word [r15 + 2 * 3]\nlzcnt si,  word [r15 + 2 * 4]\nlzcnt di,  word [r15 + 2 * 5]\nlzcnt bp,  word [r15 + 2 * 6]\nlzcnt sp,  word [r15 + 2 * 7]\nlzcnt r8w,  word [r15 + 2 * 4]\nlzcnt r9w,  word [r15 + 2 * 9]\nlzcnt r10w, word [r15 + 2 * 10]\nlzcnt r11w, word [r15 + 2 * 11]\nlzcnt r12w, word [r15 + 2 * 12]\nlzcnt r13w, word [r15 + 2 * 13]\nlzcnt r14w, word [r15 + 2 * 14]\nlzcnt r15w, word [r15 + 2 * 15]\nmovzx r15d, r15w\n\nhlt\n\n.data:\ndw 0x0000\ndw 0x1FFF\ndw 0x01FF\ndw 0x001F\ndw 0x0001\ndw 0x8000\ndw 0x0800\ndw 0x0080\ndw 0x0008\ndw 0xFFFF\ndw 0x2000\ndw 0x0200\ndw 0x0020\ndw 0x0002\ndw 0x0004\n"
  },
  {
    "path": "unittests/ASM/REP/F3_C2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x51525354FFFFFFFF\", \"0x5152535440000000\"],\n    \"XMM1\": [\"0x5152535400000000\", \"0x5152535440000000\"],\n    \"XMM2\": [\"0x51525354FFFFFFFF\", \"0x5152535440000000\"],\n    \"XMM3\": [\"0x0000000000000000\", \"0x7FC000007FC00000\"],\n    \"XMM4\": [\"0x5152535400000000\", \"0x5152535440000000\"],\n    \"XMM5\": [\"0x51525354FFFFFFFF\", \"0x5152535440000000\"],\n    \"XMM6\": [\"0x5152535400000000\", \"0x5152535440000000\"],\n    \"XMM7\": [\"0x00000000FFFFFFFF\", \"0x7FC000007FC00000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x515253543f800000\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535440000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x515253543f800000\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535440800000\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\nmovapd xmm5, [rdx + 8 * 0]\nmovapd xmm6, [rdx + 8 * 0]\nmovapd xmm7, [rdx + 8 * 0]\nmovapd xmm8, [rdx + 8 * 2]\n\ncmpss xmm0, xmm8, 0x00 ; EQ\ncmpss xmm1, xmm8, 0x01 ; LT\ncmpss xmm2, xmm8, 0x02 ; LTE\ncmpss xmm4, xmm8, 0x04 ; NEQ\ncmpss xmm5, xmm8, 0x05 ; NLT\ncmpss xmm6, xmm8, 0x06 ; NLTE\n\n; Unordered and Ordered tests need to be special cased\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x7FC000007FC00000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x7FC0000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x7FC0000000000000\nmov [rdx + 8 * 3], rax\n\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm7, [rdx + 8 * 0]\nmovapd xmm8, [rdx + 8 * 2]\n\n; Unordered will return true when either input is nan\n; [0.0, 0.0, nan, nan] unord [0.0, nan, 0.0, nan] = [0, 1, 1, 1]\ncmpss xmm3, xmm8, 0x03 ; Unordered\n\n; Ordered will return true when both inputs are NOT nan\n; [0.0, 0.0, nan, nan] ord [0.0, nan, 0.0, nan] = [1, 0, 0, 0]\ncmpss xmm7, xmm8, 0x07 ; Ordered\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_D6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\":  \"0x4142434445464748\",\n    \"XMM0\": [\"0x4142434445464748\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmovaps xmm0, [rdx + 8 * 2]\nmovq mm0, [rdx + 8 * 0]\n\nmovq2dq xmm0, mm0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_E6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x3ff0000000000000\", \"0x4000000000000000\"],\n    \"XMM1\":  [\"0x4008000000000000\", \"0x4010000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0000000200000001\nmov [rdx + 8 * 2], rax\nmov rax, 0x0000000400000003\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\n\nmovapd xmm2, [rdx + 8 * 2]\n\ncvtdq2pd xmm0, xmm2\ncvtdq2pd xmm1, [rdx + 8 * 3]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REP/F3_E6_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x41613f7980000000\", \"0x41d532ec06000000\"],\n    \"XMM1\": [\"0x41c15e6655800000\", \"0x41df24b752400000\"],\n    \"XMM2\": [\"0x41d0020642c00000\", \"0x41cf9b68e1800000\"],\n    \"XMM3\": [\"0x41b0aa9a73000000\", \"0x41ba54fc2c000000\"],\n    \"XMM4\": [\"0x41df36c61d000000\", \"0x41dc152c8e400000\"],\n    \"XMM5\": [\"0x41dc3dd2aa800000\", \"0x41d8ed57a9000000\"],\n    \"XMM6\": [\"0x41c9c74343800000\", \"0x41cca045d7000000\"],\n    \"XMM7\": [\"0x418c574f38000000\", \"0x41dbde8cbb000000\"],\n    \"XMM8\": [\"0x4199041730000000\", \"0x41c1ce3b68800000\"],\n    \"XMM9\": [\"0x41d240f8cf800000\", \"0x41b4884abf000000\"],\n    \"XMM10\": [\"0x41c2ec3ac2800000\", \"0x41cc816bf5800000\"],\n    \"XMM11\": [\"0x41d8b7ed0bc00000\", \"0x41d0c65964800000\"],\n    \"XMM12\": [\"0x41bd59e453000000\", \"0x41d8e0dce1400000\"],\n    \"XMM13\": [\"0x41b90c1b65000000\", \"0x41d6b8ee29c00000\"],\n    \"XMM14\": [\"0x41d004d281c00000\", \"0x41d8ad9d4f800000\"],\n    \"XMM15\": [\"0x41a20f72c8000000\", \"0x41d60e777cc00000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\ncvtdq2pd xmm0, [rdx + 16 * 0]\ncvtdq2pd xmm1, [rdx + 16 * 1]\ncvtdq2pd xmm2, [rdx + 16 * 2]\ncvtdq2pd xmm3, [rdx + 16 * 3]\ncvtdq2pd xmm4, [rdx + 16 * 4]\ncvtdq2pd xmm5, [rdx + 16 * 5]\ncvtdq2pd xmm6, [rdx + 16 * 6]\ncvtdq2pd xmm7, [rdx + 16 * 7]\ncvtdq2pd xmm8, [rdx + 16 * 8]\ncvtdq2pd xmm9, [rdx + 16 * 9]\ncvtdq2pd xmm10, [rdx + 16 * 10]\ncvtdq2pd xmm11, [rdx + 16 * 11]\ncvtdq2pd xmm12, [rdx + 16 * 12]\ncvtdq2pd xmm13, [rdx + 16 * 13]\ncvtdq2pd xmm14, [rdx + 16 * 14]\ncvtdq2pd xmm15, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndd 9042892,1422635032,1006326826,1527218293,582798507,2089999689,1417097080,1928248003,1074272523,1060557251,216792327,1674803041,279616115,441777196,715038375,407518795,2094733428,1884598841,447734476,947524986,1895254698,1672830628,673098253,1045402773,864978567,960531374,339530893,196139005,59435495,1870279404,383715765,1032584027,104924620,597456593,1212863084,1007986729,1224991550,344476351,1986036506,1085590199,634942853,956487659,142947491,462458211,1658827823,1125737874,344797902,1512619469,492430419,1669559173,534412544,145721129,420223845,1524873383,1920822367,709486397,1075005959,1656124734,1364988886,1391946848,151501156,1480187379,1752943752,112425311\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_10.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x6162636465666768\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\n\n; Moves 64bits to lower bits\n; Doesn't effect upper 64bits\nmovsd xmm0, xmm2\n\n; Moves 64bits to the lower bits\n; Zeroes the upper 64bits\nmovsd xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_11.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x0\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\n\n; Moves lower 64bits to memory\nmovsd [rdx + 8 * 2], xmm0\n\n; Ensure 128bits weren't written\nmovapd xmm0, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_12.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x6162636465666768\", \"0x6162636465666768\"],\n    \"XMM1\":  [\"0x6162636465666768\", \"0x6162636465666768\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 2]\n\nmovddup xmm0, xmm2\nmovddup xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_2A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x3ff0000000000000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4000000000000000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4008000000000000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4010000000000000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1\nmov [rdx + 8 * 2], rax\nmov rax, 0x2\nmov [rdx + 8 * 3], rax\nmov rax, 0x3\nmov [rdx + 8 * 4], rax\nmov rax, 0x4\nmov [rdx + 8 * 5], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\n\nmov rax, [rdx + 8 * 2]\nmov rbx, [rdx + 8 * 3]\n\ncvtsi2sd xmm0, rax\ncvtsi2sd xmm1, ebx\n\ncvtsi2sd xmm2, dword [rdx + 8 * 4]\ncvtsi2sd xmm3, qword [rdx + 8 * 5]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_2A_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xc1ce83e425800000\", \"0x40516053e2d6238e\"],\n    \"XMM1\": [\"0xc1de44fa05000000\", \"0x402a1e1c58255b03\"],\n    \"XMM2\": [\"0xc1cb13165d000000\", \"0x4035fe425aee6320\"],\n    \"XMM3\": [\"0x41cf75104d800000\", \"0x40154b7d41743e96\"],\n    \"XMM4\": [\"0x41c8d25edd000000\", \"0x4050a018bd66277c\"],\n    \"XMM5\": [\"0x41dfaebc40800000\", \"0x4056d7404ea4a8c1\"],\n    \"XMM6\": [\"0xc1cc193b3a800000\", \"0x40497b136a400fbb\"],\n    \"XMM7\": [\"0xc1cf4b1ee2800000\", \"0x4037f9ca18bd6627\"],\n    \"XMM8\": [\"0x43d015aa4a6223e2\", \"0x403839b866e43aa8\"],\n    \"XMM9\": [\"0x43d0162f07c84b5e\", \"0x4056cde5c91d14e4\"],\n    \"XMM10\": [\"0x43d015acd2a84381\", \"0x4058defb00bcbe62\"],\n    \"XMM11\": [\"0x43d0140f8f27bb30\", \"0x4052997f0ed3d85a\"],\n    \"XMM12\": [\"0x43d010674894c448\", \"0x40395a6bf8769ec3\"],\n    \"XMM13\": [\"0x43d005df8a0902de\", \"0x40568cc5974e65bf\"],\n    \"XMM14\": [\"0x43d0102100a7c5ac\", \"0x404a03c74fb549f9\"],\n    \"XMM15\": [\"0x43d0134c5657fb6a\", \"0x402459c23b7952d2\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\nmovapd xmm0, [rdx + 16 * 0]\nmovapd xmm1, [rdx + 16 * 1]\nmovapd xmm2, [rdx + 16 * 2]\nmovapd xmm3, [rdx + 16 * 3]\nmovapd xmm4, [rdx + 16 * 4]\nmovapd xmm5, [rdx + 16 * 5]\nmovapd xmm6, [rdx + 16 * 6]\nmovapd xmm7, [rdx + 16 * 7]\nmovapd xmm8, [rdx + 16 * 8]\nmovapd xmm9, [rdx + 16 * 9]\nmovapd xmm10, [rdx + 16 * 10]\nmovapd xmm11, [rdx + 16 * 11]\nmovapd xmm12, [rdx + 16 * 12]\nmovapd xmm13, [rdx + 16 * 13]\nmovapd xmm14, [rdx + 16 * 14]\nmovapd xmm15, [rdx + 16 * 15]\n\n\ncvtsi2sd xmm0, dword [rdx + 16 * 0]\ncvtsi2sd xmm1, dword [rdx + 16 * 1]\ncvtsi2sd xmm2, dword [rdx + 16 * 2]\ncvtsi2sd xmm3, dword [rdx + 16 * 3]\ncvtsi2sd xmm4, dword [rdx + 16 * 4]\ncvtsi2sd xmm5, dword [rdx + 16 * 5]\ncvtsi2sd xmm6, dword [rdx + 16 * 6]\ncvtsi2sd xmm7, dword [rdx + 16 * 7]\ncvtsi2sd xmm8,  qword [rdx + 16 * 8]\ncvtsi2sd xmm9,  qword [rdx + 16 * 9]\ncvtsi2sd xmm10, qword [rdx + 16 * 10]\ncvtsi2sd xmm11, qword [rdx + 16 * 11]\ncvtsi2sd xmm12, qword [rdx + 16 * 12]\ncvtsi2sd xmm13, qword [rdx + 16 * 13]\ncvtsi2sd xmm14, qword [rdx + 16 * 14]\ncvtsi2sd xmm15, qword [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 512bytes of random data\n.data:\ndq 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n.data2:\ndd 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_2B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x0\"]\n  },\n  \"HostFeatures\": [\"SSE4A\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovntsd [rdx + 8 * 2], xmm0\nmovaps xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_2C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x2\",\n    \"RCX\": \"0x3\",\n    \"RDX\": \"0x4\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3FF0000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4008000000000000\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4010000000000000\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\n\ncvttsd2si eax, xmm0\ncvttsd2si rbx, xmm1\n\ncvttsd2si ecx, [rdx + 8 * 4]\ncvttsd2si rdx, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_2D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x2\",\n    \"RCX\": \"0x3\",\n    \"RDX\": \"0x4\",\n    \"R9\": \"0x8000000000000000\",\n    \"R10\": \"0x8000000000000000\",\n    \"R11\": \"0x8000000000000000\",\n    \"R12\": \"0x8000000000000000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3FF0000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4008000000000000\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4010000000000000\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x7ff0000000000000\nmov [rdx + 8 * 8], rax\nmov rax, 0xfff0000000000000\nmov [rdx + 8 * 9], rax\nmov rax, 0x7ff8000000000000\nmov [rdx + 8 * 10], rax\nmov rax, 0x7fefffffffffffff\nmov [rdx + 8 * 11], rax\n\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\n\ncvtsd2si eax, xmm0\ncvtsd2si rbx, xmm1\n\ncvtsd2si ecx, [rdx + 8 * 4]\ncvtsd2si r9, [rdx + 8 * 8]\ncvtsd2si r10, [rdx + 8 * 9]\ncvtsd2si r11, [rdx + 8 * 10]\ncvtsd2si r12, [rdx + 8 * 11]\ncvtsd2si rdx, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_2D_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000000000053\",\n    \"RBX\": \"0x0000000000000029\",\n    \"RCX\": \"0x0000000000000005\",\n    \"RDX\": \"0x0000000000000009\",\n    \"RSI\": \"0x000000000000001d\",\n    \"RSP\": \"0x0000000000000028\",\n    \"RBP\": \"0x0000000000000020\",\n    \"R8\": \"0x000000000000005a\",\n    \"R9\": \"0x0000000000000062\",\n    \"R10\": \"0x000000000000005a\",\n    \"R11\": \"0x0000000000000040\",\n    \"R12\": \"0x0000000000000023\",\n    \"R13\": \"0x0000000000000005\",\n    \"R14\": \"0x0000000000000021\",\n    \"R15\": \"0x000000000000003a\"\n  }\n}\n%endif\n\nlea r15, [rel .data]\n\nmovapd xmm0, [r15 + 16 * 0]\nmovapd xmm1, [r15 + 16 * 1]\nmovapd xmm2, [r15 + 16 * 2]\nmovapd xmm3, [r15 + 16 * 3]\nmovapd xmm4, [r15 + 16 * 4]\nmovapd xmm5, [r15 + 16 * 5]\nmovapd xmm6, [r15 + 16 * 6]\nmovapd xmm7, [r15 + 16 * 7]\nmovapd xmm8, [r15 + 16 * 8]\nmovapd xmm9, [r15 + 16 * 9]\nmovapd xmm10, [r15 + 16 * 10]\nmovapd xmm11, [r15 + 16 * 11]\nmovapd xmm12, [r15 + 16 * 12]\nmovapd xmm13, [r15 + 16 * 13]\nmovapd xmm14, [r15 + 16 * 14]\nmovapd xmm15, [r15 + 16 * 15]\n\ncvttsd2si eax, xmm0\ncvttsd2si ebx, xmm1\ncvttsd2si ecx, xmm2\ncvttsd2si edx, xmm3\ncvttsd2si esi, xmm4\ncvttsd2si edi, xmm5\ncvttsd2si esp, xmm6\ncvttsd2si ebp, xmm7\ncvttsd2si r8, xmm8\ncvttsd2si r9, xmm9\ncvttsd2si r10, xmm10\ncvttsd2si r11, xmm11\ncvttsd2si r12, xmm12\ncvttsd2si r13, xmm13\ncvttsd2si r14, xmm14\ncvttsd2si r15, xmm15\n\nhlt\n\nalign 16\n; 512bytes of random data\n.data:\ndq 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_51.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x3ff0000000000000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4000000000000000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4008000000000000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4010000000000000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x3ff0000000000000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x4000000000000000\", \"0x5152535455565758\"],\n    \"XMM6\":  [\"0x4008000000000000\", \"0x5152535455565758\"],\n    \"XMM7\":  [\"0x4010000000000000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3FF0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4010000000000000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4022000000000000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4030000000000000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x4039000000000000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\nsqrtsd xmm0, xmm0\nsqrtsd xmm1, xmm1\nsqrtsd xmm2, xmm2\nsqrtsd xmm3, xmm3\n\nsqrtsd xmm4, [rdx + 8 * 0]\nsqrtsd xmm5, [rdx + 8 * 2]\nsqrtsd xmm6, [rdx + 8 * 4]\nsqrtsd xmm7, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_58.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4014000000000000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4010000000000000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4039000000000000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4030000000000000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x403a000000000000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x403d000000000000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3FF0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4010000000000000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4022000000000000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4030000000000000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x4039000000000000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\naddsd xmm0, xmm1\naddsd xmm2, xmm3\n\naddsd xmm4, [rdx + 8 * 0]\naddsd xmm5, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_59.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4010000000000000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4010000000000000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4062000000000000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4030000000000000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x4039000000000000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x4059000000000000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3FF0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4010000000000000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4022000000000000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4030000000000000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x4039000000000000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\nmulsd xmm0, xmm1 ; 1.0 <op> 4.0\nmulsd xmm2, xmm3 ; 9.0 <op> 16.0\n\nmulsd xmm4, [rdx + 8 * 0] ; 25.0 <op> 1.0\nmulsd xmm5, [rdx + 8 * 2] ; 25.0 <op> 4.0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_5A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x3FF0000040800000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4010000000000000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4022000041800000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4030000000000000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x403900003f800000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x4039000040800000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3FF0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4010000000000000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4022000000000000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4030000000000000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x4039000000000000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\ncvtsd2ss xmm0, xmm1 ; 1.0 <op> 4.0\ncvtsd2ss xmm2, xmm3 ; 9.0 <op> 16.0\n\ncvtsd2ss xmm4, [rdx + 8 * 0] ; 25.0 <op> 1.0\ncvtsd2ss xmm5, [rdx + 8 * 2] ; 25.0 <op> 4.0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_5A_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4054c66442a63326\", \"0x40516053e2d6238e\"],\n    \"XMM1\": [\"0x4044836d42241b6c\", \"0x402a1e1c58255b03\"],\n    \"XMM2\": [\"0x401568e040ab4706\", \"0x4035fe425aee6320\"],\n    \"XMM3\": [\"0x40235900411ac802\", \"0x40154b7d41743e96\"],\n    \"XMM4\": [\"0x403d075a41e83ad2\", \"0x4050a018bd66277c\"],\n    \"XMM5\": [\"0x40334ec1419a760c\", \"0x4056d7404ea4a8c1\"],\n    \"XMM6\": [\"0x404439b54221cdae\", \"0x40497b136a400fbb\"],\n    \"XMM7\": [\"0x4040528b4202945e\", \"0x4037f9ca18bd6627\"],\n    \"XMM8\": [\"0x4056a92942b5494c\", \"0x403839b866e43aa8\"],\n    \"XMM9\": [\"0x4058bc1f42c5e0f9\", \"0x4056cde5c91d14e4\"],\n    \"XMM10\": [\"0x4056b34a42b59a55\", \"0x4058defb00bcbe62\"],\n    \"XMM11\": [\"0x40503e3c4281f1e5\", \"0x4052997f0ed3d85a\"],\n    \"XMM12\": [\"0x40419d22420ce913\", \"0x40395a6bf8769ec3\"],\n    \"XMM13\": [\"0x40177e2840bbf141\", \"0x40568cc5974e65bf\"],\n    \"XMM14\": [\"0x4040840242042015\", \"0x404a03c74fb549f9\"],\n    \"XMM15\": [\"0x404d315942698acb\", \"0x402459c23b7952d2\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\nmovapd xmm0, [rdx + 16 * 0]\nmovapd xmm1, [rdx + 16 * 1]\nmovapd xmm2, [rdx + 16 * 2]\nmovapd xmm3, [rdx + 16 * 3]\nmovapd xmm4, [rdx + 16 * 4]\nmovapd xmm5, [rdx + 16 * 5]\nmovapd xmm6, [rdx + 16 * 6]\nmovapd xmm7, [rdx + 16 * 7]\nmovapd xmm8, [rdx + 16 * 8]\nmovapd xmm9, [rdx + 16 * 9]\nmovapd xmm10, [rdx + 16 * 10]\nmovapd xmm11, [rdx + 16 * 11]\nmovapd xmm12, [rdx + 16 * 12]\nmovapd xmm13, [rdx + 16 * 13]\nmovapd xmm14, [rdx + 16 * 14]\nmovapd xmm15, [rdx + 16 * 15]\n\n\ncvtsd2ss xmm0, [rdx + 16 * 0]\ncvtsd2ss xmm1, [rdx + 16 * 1]\ncvtsd2ss xmm2, [rdx + 16 * 2]\ncvtsd2ss xmm3, [rdx + 16 * 3]\ncvtsd2ss xmm4, [rdx + 16 * 4]\ncvtsd2ss xmm5, [rdx + 16 * 5]\ncvtsd2ss xmm6, [rdx + 16 * 6]\ncvtsd2ss xmm7, [rdx + 16 * 7]\ncvtsd2ss xmm8, [rdx + 16 * 8]\ncvtsd2ss xmm9, [rdx + 16 * 9]\ncvtsd2ss xmm10, [rdx + 16 * 10]\ncvtsd2ss xmm11, [rdx + 16 * 11]\ncvtsd2ss xmm12, [rdx + 16 * 12]\ncvtsd2ss xmm13, [rdx + 16 * 13]\ncvtsd2ss xmm14, [rdx + 16 * 14]\ncvtsd2ss xmm15, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 512bytes of random data\n.data:\ndq 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_5C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xc008000000000000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4010000000000000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0xc01c000000000000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4030000000000000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x4038000000000000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x4035000000000000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3FF0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4010000000000000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4022000000000000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4030000000000000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x4039000000000000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\nsubsd xmm0, xmm1 ; 1.0 <op> 4.0\nsubsd xmm2, xmm3 ; 9.0 <op> 16.0\n\nsubsd xmm4, [rdx + 8 * 0] ; 25.0 <op> 1.0\nsubsd xmm5, [rdx + 8 * 2] ; 25.0 <op> 4.0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_5D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x3FF0000000000000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4010000000000000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4022000000000000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4030000000000000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x3FF0000000000000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x4010000000000000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3FF0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4010000000000000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4022000000000000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4030000000000000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x4039000000000000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\nminsd xmm0, xmm1 ; 1.0 <op> 4.0\nminsd xmm2, xmm3 ; 9.0 <op> 16.0\n\nminsd xmm4, [rdx + 8 * 0] ; 25.0 <op> 1.0\nminsd xmm5, [rdx + 8 * 2] ; 25.0 <op> 4.0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_5E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x3fd0000000000000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4010000000000000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x3fe2000000000000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4030000000000000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x4039000000000000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x4019000000000000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3FF0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4010000000000000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4022000000000000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4030000000000000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x4039000000000000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\ndivsd xmm0, xmm1 ; 1.0 <op> 4.0\ndivsd xmm2, xmm3 ; 9.0 <op> 16.0\n\ndivsd xmm4, [rdx + 8 * 0] ; 25.0 <op> 1.0\ndivsd xmm5, [rdx + 8 * 2] ; 25.0 <op> 4.0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_5F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4010000000000000\", \"0x5152535455565758\"],\n    \"XMM1\":  [\"0x4010000000000000\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4030000000000000\", \"0x5152535455565758\"],\n    \"XMM3\":  [\"0x4030000000000000\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x4039000000000000\", \"0x5152535455565758\"],\n    \"XMM5\":  [\"0x4039000000000000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3FF0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4010000000000000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4022000000000000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4030000000000000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x4039000000000000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\nmaxsd xmm0, xmm1 ; 1.0 <op> 4.0\nmaxsd xmm2, xmm3 ; 9.0 <op> 16.0\n\nmaxsd xmm4, [rdx + 8 * 0] ; 25.0 <op> 1.0\nmaxsd xmm5, [rdx + 8 * 2] ; 25.0 <op> 4.0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_70.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0x4748474847484748\", \"0x5152535455565758\"],\n    \"XMM3\": [\"0x6162616261626162\", \"0x7172737475767778\"],\n    \"XMM4\": [\"0x4546454647484748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 8 * 2]\npshuflw xmm2, xmm0, 0x0\npshuflw xmm3, xmm1, 0xFF\n\n; Top bit different from low bits\npshuflw xmm4, [rdx], 80\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_7C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4140000040400000\", \"0x4340000042400000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3f80000040000000 ; 1.0, 2.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x4080000041000000 ; 4.0, 8.0\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4180000042000000 ; 16.0, 32.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x4280000043000000 ; 64.0, 128.0\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 8 * 2]\n\nhaddps xmm0, xmm1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_7D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xc0800000bf800000\", \"0xc2800000c1800000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x400000003f800000 ; 2.0, 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x4100000040800000 ; 8.0, 4.0\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4200000041800000 ; 32.0, 16.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x4300000042800000 ; 128.0, 64.0\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 8 * 2]\n\nhsubps xmm0, xmm1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_C2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xFFFFFFFFFFFFFFFF\", \"0x4000000000000000\"],\n    \"XMM1\": [\"0x0\", \"0x4000000000000000\"],\n    \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0x4000000000000000\"],\n    \"XMM3\": [\"0xFFFFFFFFFFFFFFFF\", \"0x7FF8000000000000\"],\n    \"XMM4\": [\"0x0\", \"0x4000000000000000\"],\n    \"XMM5\": [\"0xFFFFFFFFFFFFFFFF\", \"0x4000000000000000\"],\n    \"XMM6\": [\"0x0\", \"0x4000000000000000\"],\n    \"XMM7\": [\"0x0000000000000000\", \"0x7FF8000000000000\"],\n    \"XMM8\": [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\": [\"0xFFFFFFFFFFFFFFFF\", \"0x7FF8000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x3ff0000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x4008000000000000\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\nmovapd xmm5, [rdx + 8 * 0]\nmovapd xmm6, [rdx + 8 * 0]\nmovapd xmm7, [rdx + 8 * 0]\nmovapd xmm8, [rdx + 8 * 2]\n\ncmpsd xmm0, xmm8, 0x00 ; EQ\ncmpsd xmm1, xmm8, 0x01 ; LT\ncmpsd xmm2, xmm8, 0x02 ; LTE\ncmpsd xmm4, xmm8, 0x04 ; NEQ\ncmpsd xmm5, xmm8, 0x05 ; NLT\ncmpsd xmm6, xmm8, 0x06 ; NLTE\n\n; Unordered and Ordered tests need to be special cased\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x7FF8000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x7FF8000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 3], rax\n\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm7, [rdx + 8 * 0]\nmovapd xmm8, [rdx + 8 * 2]\n\n; Unordered will return true when either input is nan\n; [0.0, nan] unord [nan, 0.0] = [1, 1]\ncmpsd xmm3, xmm8, 0x03 ; Unordered\n\n; Ordered will return true when both inputs are NOT nan\n; [0.0, nan] ord [nan, 0.0] = [0, 0]\ncmpsd xmm7, xmm8, 0x07 ; Ordered\n\nmov rax, 0x7FF8000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 1], rax\n\nmovapd xmm8, [rdx + 8 * 0]\nmovapd xmm9, [rdx + 8 * 0]\n\n; Ordered will return true when both inputs are NOT nan\n; [nan, 0.0] ord [nan, 0.0] = [0, 1]\ncmpsd xmm8, xmm9, 0x07 ; Ordered\n\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x7FF8000000000000\nmov [rdx + 8 * 1], rax\n\nmovapd xmm9, [rdx + 8 * 0]\nmovapd xmm10, [rdx + 8 * 0]\n\n; Ordered will return true when both inputs are NOT nan\n; [0.0, nan] ord [0.0, nan] = [1, 0]\ncmpsd xmm9, xmm10, 0x07 ; Ordered\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_D0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x41200000c0000000\", \"0x41200000c0c00000\"],\n    \"XMM1\": [\"0x41200000c0000000\", \"0x41200000c0c00000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4080000040400000 ; 4, 3\nmov [rdx + 8 * 0], rax\nmov rax, 0x400000003f800000 ; 2, 1\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x40c0000040a00000 ; 6, 5\nmov [rdx + 8 * 2], rax\nmov rax, 0x4100000040e00000 ; 8, 7\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\naddsubps xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\naddsubps xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_D6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\":  \"0x4142434445464748\",\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovq mm0, [rdx + 8 * 2]\n\nmovdq2q mm0, xmm0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_E6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000200000001\", \"0x0\"],\n    \"XMM1\":  [\"0xFFFFFFFEFFFFFFFF\", \"0x0\"],\n    \"XMM2\":  [\"0x8000000080000000\", \"0x0\"],\n    \"XMM3\":  [\"0x8000000080000000\", \"0x0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000000000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xbff0000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0xc000000000000000\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x7ff0000000000000\nmov [rdx + 8 * 6], rax\nmov rax, 0xfff0000000000000\nmov [rdx + 8 * 7], rax\n \nmov rax, 0x7ff8000000000000\nmov [rdx + 8 * 8], rax\nmov rax, 0x7fefffffffffffff\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 4]\nmovapd xmm1, [rdx + 8 * 4]\n\nmovapd xmm2, [rdx + 8 * 0]\n\ncvtpd2dq xmm0, xmm2\ncvtpd2dq xmm1, [rdx + 8 * 2]\ncvtpd2dq xmm2, [rdx + 8 * 6]\ncvtpd2dq xmm3, [rdx + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_E6_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000004600000053\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x0000000d00000029\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x0000001600000005\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x000000050000000a\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x000000430000001d\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x0000005b00000013\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x0000003300000028\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x0000001800000021\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x000000180000005b\", \"0x0000000000000000\"],\n    \"XMM9\": [\"0x0000005b00000063\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x000000630000005b\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x0000004a00000041\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x0000001900000023\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x0000005a00000006\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0000003400000021\", \"0x0000000000000000\"],\n    \"XMM15\": [\"0x0000000a0000003a\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\nmovapd xmm0, [rel .random_data + 16 * 0]\nmovapd xmm1, [rel .random_data + 16 * 1]\nmovapd xmm2, [rel .random_data + 16 * 2]\nmovapd xmm3, [rel .random_data + 16 * 3]\nmovapd xmm4, [rel .random_data + 16 * 4]\nmovapd xmm5, [rel .random_data + 16 * 5]\nmovapd xmm6, [rel .random_data + 16 * 6]\nmovapd xmm7, [rel .random_data + 16 * 7]\nmovapd xmm8, [rel .random_data + 16 * 8]\nmovapd xmm9, [rel .random_data + 16 * 9]\nmovapd xmm10, [rel .random_data + 16 * 10]\nmovapd xmm11, [rel .random_data + 16 * 11]\nmovapd xmm12, [rel .random_data + 16 * 12]\nmovapd xmm13, [rel .random_data + 16 * 13]\nmovapd xmm14, [rel .random_data + 16 * 14]\nmovapd xmm15, [rel .random_data + 16 * 15]\n\ncvtpd2dq xmm0, [rdx + 16 * 0]\ncvtpd2dq xmm1, [rdx + 16 * 1]\ncvtpd2dq xmm2, [rdx + 16 * 2]\ncvtpd2dq xmm3, [rdx + 16 * 3]\ncvtpd2dq xmm4, [rdx + 16 * 4]\ncvtpd2dq xmm5, [rdx + 16 * 5]\ncvtpd2dq xmm6, [rdx + 16 * 6]\ncvtpd2dq xmm7, [rdx + 16 * 7]\ncvtpd2dq xmm8, [rdx + 16 * 8]\ncvtpd2dq xmm9, [rdx + 16 * 9]\ncvtpd2dq xmm10, [rdx + 16 * 10]\ncvtpd2dq xmm11, [rdx + 16 * 11]\ncvtpd2dq xmm12, [rdx + 16 * 12]\ncvtpd2dq xmm13, [rdx + 16 * 13]\ncvtpd2dq xmm14, [rdx + 16 * 14]\ncvtpd2dq xmm15, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 512bytes of random data\n.data:\ndq 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n\n\n; 4096 bytes of random data.\n.random_data:\ndb 0x5b, 0x27, 0x12, 0x29, 0xab, 0x84, 0xa2, 0x21, 0x6d, 0x27, 0xbe, 0x3d, 0x17, 0x05, 0x99, 0xb0\ndb 0xf3, 0xe2, 0x19, 0xf4, 0x42, 0xbb, 0x69, 0x02, 0x67, 0x3a, 0xab, 0x86, 0x9e, 0xda, 0x9f, 0xd5\ndb 0xba, 0xd4, 0x2d, 0x9d, 0x20, 0x3d, 0xf8, 0xb2, 0x29, 0xc3, 0xc3, 0x98, 0xa8, 0x30, 0x92, 0xe9\ndb 0x5a, 0x75, 0x0c, 0xcb, 0x28, 0x28, 0xb4, 0x90, 0x93, 0x16, 0x45, 0x10, 0x3a, 0x5d, 0x96, 0x67\ndb 0xf9, 0x31, 0xbe, 0x48, 0x78, 0xe8, 0x5a, 0xf2, 0x66, 0x29, 0xd9, 0x80, 0x50, 0x80, 0xcb, 0x07\ndb 0xfe, 0xda, 0x19, 0x0f, 0x22, 0xea, 0x18, 0x5e, 0x12, 0xea, 0x3d, 0x1a, 0xbc, 0x91, 0x51, 0x15\ndb 0xaa, 0x66, 0x92, 0x61, 0xb4, 0xd4, 0xce, 0x14, 0x9c, 0x86, 0x27, 0x3d, 0xd0, 0xc6, 0x51, 0x1c\ndb 0xa0, 0xd4, 0x0b, 0x2d, 0x25, 0x30, 0x3b, 0x46, 0x23, 0x07, 0xb5, 0x05, 0x4a, 0xaa, 0x5a, 0x0a\ndb 0x7b, 0x29, 0xe4, 0x52, 0x6f, 0x6f, 0xc8, 0x62, 0xb8, 0x94, 0x6a, 0x30, 0x66, 0xf1, 0x21, 0xec\ndb 0xd1, 0xf2, 0x68, 0xda, 0xb7, 0x7f, 0x5a, 0x26, 0x38, 0x46, 0x48, 0xda, 0x5d, 0x64, 0x8d, 0x3d\ndb 0x2f, 0xf6, 0xc3, 0x63, 0xb8, 0x09, 0x3a, 0xd0, 0x5b, 0xeb, 0x67, 0xd0, 0xaa, 0x63, 0x71, 0x19\ndb 0x7e, 0x4e, 0x33, 0xe2, 0x15, 0xba, 0x87, 0xa7, 0x7b, 0x25, 0xe4, 0xbb, 0xb5, 0x26, 0x9a, 0xf1\ndb 0xdd, 0x5a, 0x63, 0xd7, 0x16, 0xc0, 0xc3, 0xc8, 0x1b, 0xad, 0x00, 0x52, 0x63, 0x55, 0xc7, 0xe0\ndb 0xd9, 0xe9, 0xf4, 0x4c, 0x53, 0xfb, 0x73, 0x57, 0xdc, 0xad, 0x0c, 0xca, 0x73, 0x44, 0x6b, 0xf3\ndb 0xb7, 0x83, 0x3b, 0xfe, 0xf0, 0x15, 0xbf, 0xe5, 0x15, 0xca, 0xdf, 0x35, 0xeb, 0xe7, 0xe3, 0xa2\ndb 0xbd, 0x20, 0xad, 0xff, 0x1b, 0x67, 0x0a, 0x9f, 0x60, 0x60, 0xff, 0xa7, 0xc9, 0x19, 0xde, 0xb3\ndb 0x67, 0xf1, 0x4b, 0x77, 0x7f, 0x0b, 0xb1, 0x29, 0xee, 0xcb, 0xd6, 0x5d, 0x0d, 0xb9, 0x54, 0x49\ndb 0x10, 0xe3, 0xbd, 0x8a, 0xa0, 0x69, 0xa3, 0x07, 0xbe, 0x8e, 0xea, 0xc6, 0x75, 0x27, 0x66, 0xae\ndb 0x3c, 0xde, 0xc6, 0x13, 0x1b, 0x50, 0x37, 0x56, 0x7c, 0x01, 0xab, 0x8b, 0x46, 0xdc, 0x80, 0xed\ndb 0xdf, 0x12, 0x6f, 0x64, 0xdf, 0xe6, 0xf9, 0xbf, 0x15, 0x95, 0xd9, 0x80, 0x19, 0x8c, 0x96, 0x33\ndb 0x89, 0xbe, 0x25, 0x33, 0x34, 0x82, 0x92, 0x96, 0x05, 0x52, 0xa2, 0xcf, 0x5b, 0x3d, 0xfc, 0xd8\ndb 0x43, 0x89, 0x2e, 0x16, 0x6d, 0xbd, 0x84, 0x97, 0x77, 0xb5, 0xd6, 0x2b, 0x6b, 0xb1, 0xc6, 0x38\ndb 0x0a, 0xfe, 0xe1, 0xc9, 0x31, 0x32, 0x7f, 0xd5, 0xc1, 0x03, 0x4a, 0xb2, 0x86, 0x4d, 0x8d, 0x77\ndb 0xd6, 0x62, 0x52, 0x75, 0xed, 0x27, 0x21, 0xe8, 0x69, 0x6f, 0x6a, 0x5b, 0x59, 0x4d, 0xd2, 0x6c\ndb 0x2a, 0x97, 0x09, 0x03, 0xc5, 0x29, 0x0d, 0xe1, 0x31, 0x2e, 0x62, 0x21, 0x0e, 0xc2, 0x00, 0x7c\ndb 0xa2, 0x4c, 0x19, 0x63, 0x24, 0xfc, 0x9b, 0x38, 0x11, 0xbf, 0x20, 0x53, 0x53, 0xac, 0x3f, 0xdb\ndb 0xfd, 0x2b, 0x39, 0x3c, 0x39, 0x6b, 0xb4, 0x52, 0x1f, 0xf8, 0x8f, 0x3b, 0x47, 0x2b, 0x86, 0xcf\ndb 0xd2, 0x38, 0xe9, 0x08, 0x73, 0x09, 0x32, 0x5f, 0x6c, 0x3a, 0xdb, 0xfc, 0x1d, 0x91, 0xa4, 0x26\ndb 0xa3, 0x0c, 0xbc, 0x94, 0xf5, 0xbd, 0x29, 0xcf, 0x72, 0x3d, 0xee, 0x48, 0x06, 0x77, 0x63, 0x70\ndb 0x47, 0xc9, 0x87, 0x21, 0xb1, 0x9a, 0xdd, 0x5f, 0x71, 0x08, 0xe3, 0x3b, 0xf6, 0x07, 0x9f, 0x2f\ndb 0x20, 0xa3, 0x02, 0xc8, 0x4d, 0xc8, 0x18, 0xfa, 0x69, 0x32, 0x60, 0x97, 0x2d, 0x2f, 0x26, 0x84\ndb 0x3d, 0x7a, 0xf6, 0x2f, 0xb1, 0xc9, 0xd2, 0xcd, 0x6e, 0x24, 0x18, 0xa8, 0x0d, 0xb0, 0xe2, 0x41\ndb 0x1e, 0xdf, 0xc7, 0xee, 0xcd, 0x21, 0x5b, 0xc3, 0x26, 0x26, 0xb3, 0xb4, 0x33, 0x58, 0x79, 0xb5\ndb 0xc3, 0x24, 0x7c, 0xe3, 0xd7, 0x78, 0x33, 0x22, 0xd5, 0x20, 0x21, 0x86, 0xcf, 0xca, 0x44, 0xba\ndb 0xd8, 0x05, 0x84, 0x37, 0x69, 0x48, 0xb0, 0xe0, 0x7a, 0xe6, 0x74, 0x53, 0x1e, 0xd0, 0x0c, 0x3c\ndb 0x33, 0x83, 0x15, 0x43, 0x16, 0x0e, 0x93, 0x39, 0x55, 0x2e, 0x55, 0x1c, 0x09, 0xbd, 0x7a, 0xc3\ndb 0x80, 0x77, 0x4e, 0xd9, 0xf3, 0xa5, 0xee, 0x94, 0xbf, 0x8e, 0xd0, 0xec, 0x39, 0x33, 0x31, 0x8d\ndb 0x74, 0x94, 0xd2, 0x24, 0x22, 0x4a, 0xde, 0x51, 0x99, 0xc5, 0x68, 0xf2, 0x2e, 0xd3, 0x8d, 0xc5\ndb 0x32, 0x31, 0x26, 0xe7, 0x87, 0x47, 0x5f, 0xbc, 0x32, 0x80, 0x43, 0x83, 0x34, 0x36, 0xa1, 0x72\ndb 0x6b, 0x38, 0x10, 0x93, 0xa7, 0xa3, 0x92, 0xb7, 0x3c, 0x61, 0x1c, 0x4e, 0x0b, 0x86, 0x43, 0xa9\ndb 0x64, 0xf1, 0xf8, 0xd7, 0xd3, 0xf4, 0xd0, 0xe2, 0x17, 0xd4, 0xbb, 0xe9, 0x2c, 0xc8, 0x76, 0xc5\ndb 0x87, 0x7f, 0x81, 0x55, 0xbe, 0x87, 0x0e, 0x6b, 0xf6, 0x4f, 0x44, 0x37, 0x92, 0x32, 0x7f, 0x30\ndb 0xa6, 0x66, 0x09, 0x01, 0x7a, 0x6e, 0xb3, 0x3b, 0x7d, 0x8f, 0x32, 0x0e, 0x3c, 0xdc, 0xba, 0x2e\ndb 0xf8, 0xec, 0xde, 0xd9, 0xb1, 0xf0, 0x3e, 0xbd, 0x20, 0x4d, 0x01, 0x5a, 0xf4, 0xda, 0x99, 0x23\ndb 0x81, 0x01, 0x5f, 0x50, 0xce, 0xa8, 0xb9, 0xb1, 0x59, 0xe5, 0xde, 0x47, 0x5b, 0xba, 0x94, 0xd3\ndb 0x21, 0x7c, 0x49, 0xeb, 0xb5, 0x14, 0xe5, 0x56, 0x93, 0x06, 0x3b, 0xd2, 0x3a, 0x11, 0xca, 0x7a\ndb 0x14, 0x48, 0x54, 0xc7, 0x9f, 0x03, 0x40, 0x2c, 0x0b, 0x42, 0x8e, 0xac, 0xac, 0x08, 0x04, 0x8e\ndb 0xb3, 0x15, 0xe5, 0x06, 0xa6, 0x5b, 0xf0, 0x57, 0x08, 0xfa, 0x0f, 0x00, 0x7e, 0x4a, 0x16, 0xa8\ndb 0xb0, 0x4d, 0x07, 0x1b, 0xbc, 0x3d, 0xd0, 0x86, 0x15, 0xcd, 0x7c, 0xb2, 0xcc, 0x37, 0x6d, 0x15\ndb 0x8b, 0xd1, 0xe6, 0x3e, 0xfb, 0x6e, 0xe4, 0xea, 0xd9, 0x1f, 0x69, 0x2a, 0xbc, 0xda, 0xd9, 0x78\ndb 0xee, 0xcb, 0xb6, 0xff, 0x53, 0xfd, 0xd2, 0xb9, 0x18, 0x1f, 0xdf, 0x0e, 0x69, 0xfe, 0x36, 0xb0\ndb 0x77, 0x28, 0x66, 0xe2, 0xf0, 0x80, 0x4c, 0x11, 0x11, 0xba, 0xb7, 0xfd, 0x67, 0x4f, 0x05, 0xed\ndb 0x0c, 0xcc, 0x3e, 0x4d, 0xd9, 0xbc, 0x52, 0xe3, 0xec, 0xd9, 0x74, 0x29, 0x30, 0xf2, 0x66, 0xd6\ndb 0xfb, 0xc3, 0x5c, 0xc1, 0xd8, 0xef, 0x86, 0x08, 0x22, 0xb1, 0x6d, 0xfd, 0xee, 0xc7, 0x12, 0x25\ndb 0xda, 0xee, 0xd6, 0x28, 0x3b, 0x1d, 0xa7, 0x29, 0xdf, 0x45, 0x3a, 0xa4, 0x36, 0xe0, 0xa4, 0xda\ndb 0xb1, 0x2c, 0x8a, 0xa5, 0x5c, 0x8c, 0x70, 0xd8, 0xcd, 0x0f, 0xb5, 0x63, 0xd3, 0xaf, 0x59, 0x2b\ndb 0x7d, 0x86, 0x4a, 0xc4, 0xcc, 0x72, 0x9e, 0x89, 0xf4, 0x38, 0x89, 0x81, 0x64, 0x6f, 0xa5, 0xac\ndb 0x13, 0x59, 0xc4, 0x0f, 0xfb, 0xcc, 0x4c, 0x1d, 0x67, 0x5a, 0xbf, 0x19, 0xfc, 0x06, 0x71, 0xbd\ndb 0x7f, 0xb6, 0xb1, 0x95, 0xd3, 0x7b, 0x4c, 0x40, 0x91, 0xa9, 0x26, 0xdd, 0x28, 0x69, 0x90, 0xf6\ndb 0x5d, 0x16, 0x9f, 0xa9, 0x75, 0x5e, 0xad, 0x8f, 0xc8, 0x0b, 0x57, 0x48, 0xf2, 0x74, 0x77, 0x22\ndb 0x5d, 0xed, 0xc2, 0x79, 0x27, 0x46, 0x0c, 0x9e, 0x6f, 0x9a, 0x9a, 0xdc, 0xe0, 0x3d, 0x24, 0xc9\ndb 0xce, 0xf3, 0x34, 0x66, 0x45, 0x07, 0x0b, 0x83, 0x8c, 0xb7, 0xd9, 0x1e, 0xac, 0xc6, 0xf7, 0xef\ndb 0xe7, 0xd1, 0xbc, 0xa3, 0x21, 0x85, 0x3d, 0x25, 0x90, 0x24, 0x48, 0xb1, 0x00, 0xb0, 0xd2, 0xa6\ndb 0xd8, 0x4e, 0x46, 0x7c, 0xc4, 0x79, 0x40, 0x95, 0x81, 0xb4, 0xb9, 0xa8, 0x70, 0xf0, 0x12, 0xd6\ndb 0xdc, 0xb2, 0x7c, 0x0f, 0x47, 0xad, 0x7d, 0x46, 0x78, 0x18, 0x6e, 0xdd, 0x5f, 0xe5, 0xd7, 0x63\ndb 0x11, 0xf0, 0x5b, 0xa0, 0x48, 0x15, 0xe2, 0x55, 0xc6, 0x7f, 0xf4, 0x2e, 0x0e, 0x49, 0x39, 0x65\ndb 0x3e, 0x69, 0xc1, 0x27, 0x39, 0xb3, 0x10, 0x1b, 0xf2, 0x35, 0x88, 0x0c, 0x1b, 0xac, 0x4a, 0x15\ndb 0x31, 0x81, 0x63, 0xe5, 0x3d, 0x56, 0x6f, 0x34, 0x06, 0x5b, 0x1d, 0xa0, 0xea, 0x0c, 0x92, 0x6a\ndb 0x22, 0x2b, 0x2d, 0xbb, 0xaf, 0xc5, 0x6d, 0x44, 0x1b, 0xb0, 0x69, 0x06, 0x27, 0x54, 0xa5, 0x7f\ndb 0x07, 0xd4, 0xdc, 0xe5, 0x5c, 0x78, 0x9e, 0xf7, 0x4a, 0x47, 0x9b, 0x21, 0xf6, 0x87, 0x89, 0xad\ndb 0xec, 0xe4, 0xd6, 0x83, 0xd3, 0x7b, 0x34, 0x00, 0x0b, 0x75, 0xba, 0x4c, 0x0f, 0x46, 0xd2, 0x0c\ndb 0x58, 0x1b, 0x0f, 0x19, 0xb5, 0xf5, 0xba, 0x8f, 0xbd, 0x17, 0x51, 0xaf, 0xa6, 0x1a, 0x97, 0x8c\ndb 0x44, 0x30, 0x7c, 0x73, 0x50, 0xca, 0x05, 0xe8, 0x3e, 0x19, 0x4a, 0x5a, 0x6b, 0x4d, 0x01, 0x05\ndb 0xea, 0x1b, 0x70, 0xb6, 0xe6, 0x39, 0x5d, 0x99, 0x3b, 0xae, 0xed, 0x7c, 0xa6, 0xc7, 0x29, 0x6f\ndb 0xeb, 0x0a, 0xba, 0x03, 0xd3, 0xba, 0x62, 0x21, 0xa0, 0xb7, 0xb5, 0xbf, 0x40, 0xb8, 0x4e, 0xc3\ndb 0x89, 0xa0, 0xa9, 0xe8, 0xc8, 0x2b, 0xfd, 0x23, 0x32, 0x53, 0xe5, 0x35, 0xc1, 0x23, 0x97, 0xc1\ndb 0x87, 0x10, 0x41, 0x21, 0xb3, 0xf6, 0x53, 0xcf, 0x28, 0x47, 0x9c, 0x69, 0x42, 0xcf, 0x0e, 0x11\ndb 0x69, 0x7f, 0xc6, 0xdf, 0xc3, 0xbf, 0x04, 0x7f, 0x3a, 0xc6, 0xa1, 0x3d, 0xc6, 0x5b, 0x56, 0x8b\ndb 0x52, 0x23, 0x41, 0xd7, 0x35, 0x7f, 0x86, 0xd2, 0x59, 0xcf, 0xae, 0x28, 0xa3, 0xa2, 0x23, 0x4b\ndb 0x78, 0x78, 0x94, 0x3f, 0x2f, 0xf0, 0xb8, 0x94, 0xa2, 0x62, 0xb9, 0x83, 0xc7, 0x5f, 0x64, 0x45\ndb 0x54, 0xaf, 0x43, 0x93, 0x7f, 0xa1, 0xe8, 0x71, 0x38, 0xc8, 0x21, 0xf4, 0xa6, 0xab, 0x2b, 0xd3\ndb 0x44, 0xa2, 0x74, 0x94, 0x99, 0x3f, 0x56, 0xbc, 0x0a, 0x12, 0xe7, 0x6e, 0x1b, 0x7f, 0x98, 0xad\ndb 0x28, 0xa6, 0xc8, 0x87, 0x7a, 0x88, 0xcb, 0xcf, 0x9f, 0x95, 0xa7, 0xf1, 0x66, 0xfe, 0x43, 0x3d\ndb 0x71, 0x5b, 0x3a, 0xb7, 0xe4, 0xa8, 0x6f, 0x46, 0xa1, 0xaa, 0x66, 0xd2, 0x9e, 0x84, 0xfd, 0x42\ndb 0x98, 0x17, 0x3e, 0xde, 0xaa, 0x18, 0xc9, 0x9c, 0x53, 0x88, 0x2b, 0x92, 0xce, 0x00, 0x8b, 0xb4\ndb 0x15, 0x7a, 0x39, 0xb7, 0x57, 0xf9, 0xf2, 0x17, 0x0a, 0x8c, 0x05, 0x7b, 0x3f, 0x2a, 0xb0, 0xb7\ndb 0x8a, 0xbb, 0x9a, 0x0d, 0xe4, 0x0d, 0x6a, 0xbd, 0x8a, 0xe9, 0xbd, 0xca, 0xb2, 0x6a, 0xbe, 0x76\ndb 0x2c, 0xbe, 0x45, 0x3f, 0x22, 0x03, 0xb1, 0xab, 0x2d, 0xe0, 0x70, 0x52, 0xe5, 0x27, 0x8e, 0xbc\ndb 0xa9, 0x8d, 0x13, 0xf4, 0xe5, 0xd7, 0xeb, 0x4e, 0x30, 0x3f, 0x76, 0x3b, 0x64, 0xad, 0x57, 0x53\ndb 0x91, 0x89, 0xf4, 0x9a, 0xd1, 0x38, 0x3d, 0x58, 0xdc, 0x83, 0x65, 0x4a, 0x36, 0x30, 0x73, 0x92\ndb 0x8c, 0x2f, 0x7d, 0x1e, 0x15, 0x3c, 0xca, 0x54, 0x6f, 0x17, 0xbd, 0xba, 0x97, 0x7e, 0x28, 0x11\ndb 0x8e, 0x96, 0x9f, 0x46, 0x84, 0x69, 0xe3, 0xc2, 0x8e, 0x1e, 0xea, 0x6b, 0x17, 0xa7, 0xf8, 0x17\ndb 0xc3, 0xd9, 0x9c, 0x53, 0x79, 0x95, 0x32, 0xf6, 0x78, 0xcd, 0x5d, 0x2f, 0x30, 0x06, 0xe8, 0x9f\ndb 0x5e, 0xb2, 0x4e, 0x56, 0xf5, 0x31, 0xc3, 0x41, 0xae, 0x4b, 0x0a, 0xbd, 0xdc, 0xce, 0xea, 0xfa\ndb 0x27, 0x09, 0x4e, 0xd1, 0x24, 0x14, 0x33, 0x8b, 0x21, 0x48, 0x99, 0x92, 0x07, 0xa4, 0x1a, 0x87\ndb 0x34, 0x15, 0xa6, 0x12, 0x92, 0x3f, 0xf0, 0x3e, 0x18, 0x3c, 0x65, 0x3a, 0x8b, 0x17, 0x9b, 0xf2\ndb 0xd9, 0x93, 0xa0, 0x19, 0x2b, 0x73, 0x59, 0x29, 0x6f, 0xb7, 0x75, 0x4b, 0x42, 0x24, 0x43, 0xa4\ndb 0x20, 0xd8, 0x59, 0x8d, 0x9f, 0xd6, 0x64, 0xa1, 0xeb, 0xe3, 0x65, 0x82, 0x69, 0x74, 0x1a, 0x2b\ndb 0x8d, 0x9a, 0x59, 0x5d, 0x47, 0x75, 0x63, 0xcd, 0xe4, 0x14, 0x48, 0x5f, 0x67, 0x00, 0x12, 0x3c\ndb 0x58, 0x27, 0x5e, 0x83, 0xde, 0xd8, 0x97, 0xd9, 0x09, 0xd9, 0x06, 0x64, 0x96, 0x67, 0xb4, 0x4f\ndb 0xb9, 0x58, 0x87, 0xc9, 0xb1, 0xdd, 0x64, 0x8f, 0x4e, 0x8f, 0xa9, 0xfa, 0x40, 0xe6, 0x8f, 0xaa\ndb 0x22, 0x26, 0x16, 0x15, 0x6a, 0xa3, 0x88, 0xae, 0xa2, 0xbc, 0xa3, 0xa3, 0x56, 0xa1, 0x74, 0x6c\ndb 0xa2, 0xd0, 0x47, 0x4b, 0x98, 0x0a, 0xea, 0xdd, 0xe8, 0x9c, 0xe1, 0x37, 0x44, 0x1a, 0xc0, 0xc7\ndb 0x83, 0x07, 0x42, 0xca, 0x98, 0x36, 0xd7, 0x43, 0x18, 0x51, 0x32, 0xf6, 0x99, 0x61, 0x73, 0x79\ndb 0x51, 0xc4, 0xe9, 0x5b, 0x9e, 0xa8, 0xb4, 0x28, 0x49, 0xbb, 0x44, 0x90, 0xe2, 0xf7, 0x7e, 0x61\ndb 0x27, 0xbb, 0x85, 0x58, 0xd0, 0xdc, 0x94, 0x53, 0x02, 0x50, 0xfe, 0xc7, 0x37, 0xa2, 0x20, 0x1b\ndb 0x57, 0x00, 0x9b, 0x7c, 0xa4, 0x6c, 0xa6, 0xb1, 0xae, 0xd0, 0x03, 0x67, 0x2b, 0x82, 0xd9, 0x99\ndb 0x76, 0xd0, 0xc7, 0x7d, 0x2d, 0xbd, 0x39, 0x28, 0xcf, 0xe1, 0x13, 0xce, 0x1c, 0xe6, 0x4c, 0xa7\ndb 0x7a, 0x8c, 0x4f, 0xa6, 0x30, 0x77, 0x6b, 0x78, 0x39, 0x6e, 0x10, 0xd1, 0x9c, 0x9a, 0xda, 0x2d\ndb 0xc9, 0xef, 0xd7, 0xb1, 0xb8, 0xdf, 0x21, 0xce, 0x96, 0x53, 0xaa, 0xa6, 0x76, 0x52, 0x56, 0x0e\ndb 0xe6, 0x7f, 0xed, 0x88, 0x15, 0x2a, 0xc1, 0xfe, 0xb3, 0x35, 0x54, 0x09, 0x9b, 0x5d, 0x21, 0x62\ndb 0xc8, 0x6f, 0x2c, 0x6e, 0x56, 0xc8, 0xd9, 0x40, 0x67, 0xeb, 0x26, 0xf5, 0xcb, 0x18, 0xb1, 0x89\ndb 0xfe, 0x58, 0x1a, 0xff, 0x41, 0xb5, 0xd6, 0xe5, 0xb3, 0x82, 0x29, 0x82, 0xee, 0xbb, 0xb2, 0x5a\ndb 0x71, 0xf2, 0xca, 0xf1, 0x2f, 0xa7, 0x4d, 0xb1, 0x5c, 0xbc, 0xc3, 0x1a, 0xb4, 0x20, 0x6a, 0x7e\ndb 0xb9, 0x5e, 0xcb, 0x9b, 0xf3, 0x1c, 0x2b, 0x16, 0xab, 0x15, 0x8d, 0xb5, 0x81, 0xf3, 0xbb, 0xc1\ndb 0x8e, 0x2c, 0xd6, 0xd1, 0xa8, 0x23, 0x3c, 0x98, 0x3f, 0x4e, 0xff, 0x97, 0x77, 0xd1, 0xbd, 0xda\ndb 0xff, 0x9c, 0x55, 0x01, 0x1c, 0x4b, 0x4b, 0x1a, 0xa9, 0x3d, 0xe9, 0xbd, 0x3c, 0x5b, 0xfd, 0x65\ndb 0x34, 0x9c, 0x78, 0x8c, 0x83, 0x46, 0x72, 0xed, 0x66, 0xee, 0x00, 0xac, 0xca, 0x09, 0xaa, 0x3a\ndb 0x2c, 0xc1, 0x7e, 0xde, 0x44, 0xbd, 0xe3, 0x5a, 0x11, 0x41, 0xc7, 0xc8, 0x65, 0x7a, 0xc7, 0xbb\ndb 0x44, 0xad, 0x97, 0x17, 0xe8, 0x9f, 0x29, 0x2b, 0x78, 0x6d, 0x96, 0xb6, 0x9c, 0x3a, 0x6a, 0xc2\ndb 0xab, 0x9a, 0x16, 0x6f, 0x05, 0x78, 0x0d, 0x83, 0xa5, 0x46, 0x8c, 0xd7, 0x57, 0x1e, 0x80, 0x2f\ndb 0x7e, 0x81, 0x68, 0xa4, 0xc4, 0x3d, 0x6c, 0xae, 0x6b, 0x98, 0xb9, 0xe4, 0xb4, 0xfb, 0xf4, 0x19\ndb 0xf9, 0xcd, 0xbb, 0xd0, 0xbc, 0x22, 0xdd, 0x2c, 0xbe, 0x11, 0x01, 0xc2, 0x53, 0xdd, 0xa3, 0x3a\ndb 0xbf, 0x5f, 0x2a, 0x94, 0x8b, 0x58, 0x6e, 0xe3, 0x4e, 0x1b, 0x0d, 0x30, 0x1b, 0x1c, 0x6c, 0x24\ndb 0x0e, 0xd9, 0x1c, 0xe1, 0x4d, 0x42, 0x48, 0xa0, 0x07, 0xb1, 0xe8, 0x10, 0xa1, 0x51, 0x6a, 0x82\ndb 0x2e, 0x99, 0xb3, 0xbf, 0xe3, 0xff, 0x3c, 0x77, 0xf4, 0x0c, 0x1f, 0x22, 0x53, 0xd0, 0x99, 0x60\ndb 0x5d, 0x65, 0x80, 0xb9, 0xa3, 0xb7, 0x25, 0x6d, 0xa6, 0x4f, 0xb5, 0x72, 0xaa, 0x4d, 0x0d, 0x49\ndb 0x4c, 0x34, 0xc5, 0xf4, 0x1b, 0x5c, 0x3f, 0x6c, 0xbb, 0x86, 0xba, 0xc5, 0x32, 0xee, 0x23, 0x95\ndb 0xe5, 0x42, 0x66, 0x92, 0x89, 0x5e, 0xf4, 0xd4, 0x2d, 0x04, 0xf2, 0xbc, 0xd7, 0xc8, 0xc9, 0xd7\ndb 0xe3, 0xdb, 0x4e, 0x4b, 0xda, 0x37, 0x1f, 0xfa, 0x9c, 0xaf, 0x4b, 0x1e, 0xab, 0x64, 0x2a, 0x59\ndb 0x24, 0x0f, 0xb4, 0xaf, 0xd6, 0x32, 0x30, 0xcd, 0x7c, 0xf3, 0x0f, 0xa9, 0xac, 0x3f, 0x55, 0xa2\ndb 0x92, 0x21, 0x58, 0x4e, 0x99, 0xbc, 0x9f, 0xfd, 0x16, 0x7c, 0x4e, 0x5b, 0xb4, 0xc7, 0x5f, 0x8d\ndb 0x0e, 0x26, 0x72, 0x17, 0x02, 0x7d, 0x12, 0xa0, 0xc5, 0xc1, 0x66, 0xd3, 0x19, 0x49, 0x42, 0xfb\ndb 0x18, 0xd7, 0x18, 0x79, 0xd3, 0x32, 0xfc, 0x4a, 0xab, 0x82, 0x72, 0x0a, 0x90, 0xb7, 0xbc, 0x00\ndb 0x16, 0x99, 0xd3, 0x9a, 0x76, 0xc6, 0x44, 0x92, 0x9b, 0x2b, 0x6a, 0x35, 0xca, 0x4e, 0x2e, 0x9c\ndb 0x7f, 0xcb, 0xd3, 0x65, 0x1c, 0xa6, 0x95, 0x2c, 0x3d, 0xe4, 0xd3, 0xe6, 0xe7, 0xe0, 0xde, 0x1e\ndb 0x54, 0xb3, 0x09, 0x3e, 0x34, 0x35, 0x68, 0x53, 0x01, 0x02, 0xf1, 0x4c, 0x89, 0x19, 0xe3, 0xc6\ndb 0x4a, 0x51, 0x49, 0xf5, 0x5f, 0x3e, 0xcd, 0xae, 0x6e, 0xeb, 0x90, 0x1a, 0x53, 0x93, 0x0b, 0xe8\ndb 0xc2, 0x6e, 0xee, 0xf3, 0x38, 0x5d, 0xb8, 0xaf, 0x58, 0x4b, 0xe0, 0xfd, 0x07, 0xcf, 0x15, 0x89\ndb 0x2b, 0x01, 0x35, 0xbb, 0xa0, 0x2f, 0x7e, 0xd3, 0x34, 0x7b, 0x1f, 0x81, 0x12, 0x7f, 0xb0, 0xff\ndb 0xe7, 0xa0, 0xf2, 0xc4, 0x86, 0x98, 0x45, 0xe2, 0xa1, 0x1e, 0x4c, 0xc0, 0x23, 0x05, 0x49, 0x0b\ndb 0x0d, 0xc3, 0x1e, 0x30, 0x20, 0xc6, 0x34, 0xb7, 0xe1, 0x09, 0x84, 0xd5, 0x2a, 0x40, 0x75, 0x9b\ndb 0x46, 0xbb, 0xa5, 0xfe, 0xbd, 0x7d, 0x39, 0xe4, 0x7b, 0x38, 0xdc, 0x9c, 0xaf, 0xc8, 0x12, 0xf4\ndb 0x78, 0xb8, 0x51, 0x4a, 0x21, 0xfe, 0xf9, 0x77, 0xf6, 0xb5, 0xad, 0x69, 0xc9, 0x4d, 0xbf, 0x67\ndb 0xfc, 0x5d, 0x80, 0x7c, 0x76, 0x2c, 0xe5, 0xf2, 0xd7, 0x7f, 0xce, 0xb5, 0x1c, 0x09, 0xa5, 0xc3\ndb 0x98, 0x18, 0x2d, 0x18, 0xfb, 0x61, 0x13, 0xea, 0xbc, 0x87, 0x3a, 0x3f, 0xb4, 0xaf, 0x3c, 0x3b\ndb 0x3b, 0xb6, 0xd2, 0xc7, 0x5c, 0x2c, 0xe1, 0x11, 0xb3, 0x9d, 0xf1, 0x52, 0xba, 0xb5, 0xf0, 0x69\ndb 0xcd, 0xd2, 0x93, 0x9e, 0x80, 0x45, 0x78, 0x17, 0x6d, 0x52, 0x51, 0xad, 0xed, 0x6d, 0x9e, 0x15\ndb 0xca, 0xb1, 0xfe, 0x22, 0x7b, 0x87, 0xb8, 0x40, 0x06, 0x2d, 0xb0, 0xbb, 0x05, 0x7c, 0x52, 0xd2\ndb 0xcd, 0xc8, 0x9c, 0xea, 0xd3, 0x4c, 0xb5, 0x06, 0xb4, 0x70, 0xad, 0x09, 0xa5, 0xb8, 0x66, 0xba\ndb 0x31, 0x0d, 0xe0, 0xe2, 0xcf, 0x62, 0x9f, 0x6d, 0x6d, 0x1a, 0x47, 0x21, 0xd5, 0x33, 0x6b, 0xd7\ndb 0x75, 0xff, 0x98, 0x6c, 0xb2, 0x78, 0x6d, 0x45, 0x50, 0xeb, 0xfb, 0xea, 0xb7, 0x2a, 0x27, 0x02\ndb 0xc4, 0x03, 0xde, 0x56, 0x23, 0x26, 0x10, 0x21, 0x57, 0x9c, 0x3b, 0x4c, 0x79, 0x2c, 0x3e, 0xfe\ndb 0xc8, 0x16, 0xe4, 0xd6, 0x60, 0xb8, 0x46, 0xe3, 0x4b, 0x7e, 0x3d, 0xb3, 0x83, 0x19, 0x54, 0x65\ndb 0x51, 0x7a, 0x81, 0xdd, 0x07, 0x33, 0x92, 0x08, 0x64, 0x0b, 0xc2, 0x06, 0x5c, 0x07, 0x81, 0x40\ndb 0x1b, 0xb4, 0x5a, 0x47, 0x2b, 0xdc, 0x96, 0x98, 0x4c, 0x65, 0xad, 0x8e, 0x8e, 0x77, 0xbe, 0x99\ndb 0x60, 0x4c, 0xb5, 0x6b, 0xed, 0xb7, 0x52, 0x5d, 0x99, 0x2e, 0x93, 0x40, 0xfe, 0x45, 0x83, 0x28\ndb 0x9b, 0x8b, 0x7f, 0x77, 0x2b, 0xdc, 0x61, 0xbe, 0x62, 0x28, 0xe8, 0x23, 0x3f, 0xdb, 0x1d, 0x6d\ndb 0x3b, 0xe8, 0x90, 0x05, 0x12, 0xf2, 0xb4, 0xf0, 0x1b, 0xbb, 0x2f, 0x4b, 0x9e, 0x9f, 0x0e, 0x4e\ndb 0x9e, 0x6a, 0x38, 0x7e, 0x97, 0x13, 0x90, 0x57, 0xb9, 0x49, 0x52, 0xb7, 0x4f, 0xd3, 0xc1, 0x39\ndb 0x95, 0x20, 0xd4, 0x83, 0x48, 0x0e, 0x7a, 0x9d, 0x89, 0x9d, 0xf4, 0xec, 0xe7, 0xcc, 0xde, 0x0a\ndb 0xac, 0xc5, 0xb0, 0x4d, 0xc5, 0x25, 0x74, 0x62, 0x66, 0x51, 0x4f, 0xeb, 0x4e, 0x9d, 0x3d, 0x04\ndb 0x27, 0xec, 0xfe, 0x8d, 0x03, 0x20, 0x38, 0x30, 0x5d, 0xf3, 0xf0, 0x97, 0xbb, 0xa9, 0xd1, 0xea\ndb 0x73, 0x73, 0x40, 0x2c, 0x0b, 0xa7, 0xc9, 0x8d, 0xac, 0x75, 0xc4, 0x46, 0x7c, 0xc2, 0x9a, 0x26\ndb 0x07, 0xae, 0x02, 0x27, 0x42, 0xa8, 0x90, 0xb6, 0x9b, 0x98, 0xec, 0x2e, 0xf6, 0xf6, 0x17, 0xda\ndb 0x9f, 0xfb, 0x54, 0xea, 0xae, 0x96, 0xfe, 0xd6, 0x35, 0x4f, 0x07, 0x9f, 0xf4, 0x57, 0x36, 0xfe\ndb 0xb1, 0x43, 0xee, 0xe3, 0x21, 0x00, 0x43, 0x12, 0xf2, 0xff, 0xa5, 0x37, 0x65, 0x01, 0xf0, 0xb4\ndb 0xe8, 0x68, 0xa3, 0xff, 0x31, 0x5f, 0x3f, 0x56, 0xa5, 0xd2, 0xcc, 0xab, 0xa4, 0x90, 0xf9, 0x98\ndb 0x0b, 0xdc, 0x0d, 0x20, 0x3c, 0x33, 0xda, 0xf1, 0x54, 0xd5, 0x6d, 0xc4, 0xa9, 0xc4, 0x54, 0x29\ndb 0x56, 0x69, 0x96, 0x98, 0x74, 0x13, 0x72, 0x1f, 0x95, 0xe9, 0xe2, 0xab, 0x60, 0x74, 0x91, 0x96\ndb 0xdf, 0xa4, 0xd6, 0x62, 0x3c, 0x35, 0x7e, 0xc4, 0x21, 0x16, 0xa3, 0x32, 0xac, 0x20, 0x52, 0xd4\ndb 0xbb, 0xc2, 0xa5, 0x97, 0x86, 0x4a, 0x55, 0xf4, 0x09, 0xf2, 0x0e, 0xd6, 0x1a, 0xfa, 0x00, 0x67\ndb 0x45, 0x57, 0xb3, 0xaa, 0xe5, 0x7c, 0x17, 0x8d, 0xde, 0x75, 0xd7, 0x49, 0x6e, 0xb0, 0xb2, 0xa0\ndb 0x58, 0xd8, 0x01, 0xf0, 0x22, 0x9c, 0xe4, 0xeb, 0x71, 0x5f, 0x4d, 0x38, 0xf2, 0x7e, 0xee, 0xba\ndb 0xf9, 0x39, 0xff, 0x42, 0x91, 0x00, 0x63, 0x5c, 0x86, 0x02, 0x81, 0x51, 0x10, 0xfb, 0xcf, 0x2a\ndb 0xcf, 0x16, 0xd9, 0x8f, 0x3a, 0xbb, 0x29, 0xcb, 0xe2, 0xc9, 0xd9, 0xe2, 0xd9, 0x05, 0x1b, 0x46\ndb 0x08, 0x2c, 0x6d, 0x5b, 0x1a, 0x7d, 0x5b, 0xca, 0x5b, 0xae, 0x18, 0x48, 0x15, 0x3b, 0x85, 0xd1\ndb 0x29, 0xcf, 0xaf, 0xa5, 0x68, 0xe9, 0x8d, 0x9e, 0x0b, 0xe1, 0x55, 0x54, 0x68, 0x28, 0x9b, 0x4c\ndb 0x94, 0x30, 0x3a, 0xc0, 0xaa, 0xf8, 0xeb, 0x7b, 0x58, 0x53, 0x5f, 0x25, 0x2e, 0xbf, 0x72, 0x26\ndb 0xd8, 0x9c, 0xa9, 0xfe, 0x30, 0xe0, 0x68, 0x25, 0xba, 0x71, 0x1a, 0x82, 0xbb, 0xee, 0x03, 0xc9\ndb 0x4b, 0x0a, 0x22, 0xda, 0x93, 0xa0, 0x72, 0x49, 0x72, 0x3a, 0x8f, 0xbe, 0x39, 0x04, 0x7c, 0x06\ndb 0xa1, 0x50, 0xa1, 0x94, 0xb4, 0x66, 0x91, 0xee, 0x76, 0xa4, 0xbe, 0x21, 0x33, 0xbe, 0xa9, 0x68\ndb 0xe6, 0x03, 0xdd, 0x25, 0x3b, 0x78, 0xe3, 0x5a, 0x0c, 0xcf, 0x2b, 0xa2, 0x03, 0x63, 0x8d, 0xd7\ndb 0xc4, 0xf0, 0x6e, 0xea, 0xe1, 0x76, 0x93, 0x38, 0x7b, 0x85, 0xef, 0xff, 0xce, 0xb0, 0xe1, 0xe3\ndb 0x86, 0x3d, 0xb6, 0xae, 0xee, 0xf7, 0x92, 0x8a, 0x1b, 0x29, 0x00, 0x9b, 0x85, 0xaf, 0xa2, 0x5e\ndb 0x90, 0xd9, 0xdc, 0xca, 0xde, 0xde, 0xab, 0xfe, 0x05, 0x61, 0x3c, 0xb6, 0x2f, 0x40, 0x59, 0x1f\ndb 0x73, 0x80, 0x52, 0xf6, 0x6f, 0x28, 0x30, 0x4b, 0xf2, 0x88, 0x9e, 0x63, 0x84, 0x1b, 0xd2, 0xf4\ndb 0x67, 0x3b, 0xaf, 0x48, 0x27, 0xfd, 0x7e, 0x30, 0x6e, 0xb8, 0x81, 0xbf, 0xe5, 0x4c, 0x19, 0x16\ndb 0x24, 0xd0, 0x8e, 0x3a, 0xc9, 0xcd, 0xc8, 0x6f, 0x2e, 0x99, 0xda, 0xb8, 0x7c, 0xd9, 0xbb, 0x2c\ndb 0xe3, 0xdf, 0xd0, 0x96, 0xe2, 0xcc, 0x99, 0x5b, 0x1d, 0xff, 0x81, 0x74, 0x84, 0x0b, 0x9d, 0x09\ndb 0x3e, 0x1b, 0x0c, 0x42, 0x3d, 0x96, 0x15, 0x44, 0xed, 0x97, 0x9a, 0x99, 0x68, 0x02, 0x2c, 0x79\ndb 0x8f, 0xcc, 0xff, 0x83, 0x5e, 0x6e, 0x97, 0x00, 0x50, 0x83, 0xc2, 0x29, 0x2b, 0x27, 0xe6, 0x4f\ndb 0x18, 0xb0, 0x45, 0xa9, 0xf8, 0x30, 0x35, 0x7f, 0x20, 0xdd, 0xd7, 0x07, 0x32, 0x55, 0x95, 0x4a\ndb 0xf3, 0xf5, 0x35, 0x5b, 0xac, 0xef, 0xfa, 0xbb, 0x54, 0xba, 0x4d, 0x79, 0x66, 0xce, 0x38, 0x5e\ndb 0x23, 0xd7, 0x1b, 0x03, 0x37, 0x74, 0xa7, 0xe0, 0xb1, 0x2c, 0xe5, 0xa4, 0x00, 0x36, 0x9a, 0xe9\ndb 0x36, 0xd4, 0x3e, 0x35, 0x37, 0xb2, 0xc1, 0x71, 0x90, 0x80, 0x3b, 0xd8, 0x6b, 0x7e, 0x79, 0x0a\ndb 0x7d, 0xe3, 0x3d, 0xc8, 0xd3, 0xb3, 0x56, 0xb6, 0xef, 0x73, 0x3d, 0x24, 0x07, 0x0e, 0xeb, 0x8e\ndb 0x9b, 0x25, 0xaf, 0x3b, 0xa3, 0x92, 0xf5, 0x19, 0x16, 0xba, 0x1f, 0x6f, 0x92, 0x4b, 0x3f, 0x3c\ndb 0xc8, 0xac, 0xdd, 0x70, 0xc6, 0x3b, 0x45, 0x0b, 0xa5, 0xe0, 0x8f, 0xa4, 0xd6, 0x56, 0xd8, 0xb9\ndb 0xc1, 0x1a, 0x53, 0x76, 0x37, 0x60, 0xc9, 0xf4, 0xc8, 0x0a, 0x17, 0x6d, 0x1d, 0xb8, 0x8e, 0xec\ndb 0xa8, 0x9c, 0x71, 0x08, 0x1f, 0x45, 0x96, 0xc8, 0xed, 0x1e, 0x47, 0x09, 0xbb, 0xe6, 0xee, 0x36\ndb 0x8e, 0x87, 0xc6, 0xeb, 0xe5, 0x88, 0xd8, 0xab, 0x98, 0x41, 0x4f, 0x2a, 0x49, 0x15, 0x68, 0xf6\ndb 0x51, 0xaf, 0xc7, 0x74, 0x7c, 0xaa, 0x26, 0x1a, 0x2f, 0xe6, 0x96, 0x86, 0x7c, 0x00, 0xa4, 0x57\ndb 0x90, 0x1f, 0x83, 0x02, 0x0c, 0xb2, 0xec, 0x27, 0x7f, 0xbc, 0x78, 0x11, 0x64, 0xbe, 0x34, 0x25\ndb 0xbd, 0xf8, 0x56, 0x00, 0x5f, 0xdd, 0x85, 0x95, 0x23, 0xad, 0xe9, 0x26, 0x1e, 0xd3, 0xfc, 0x22\ndb 0xe6, 0x35, 0x07, 0xbc, 0xf6, 0x88, 0x19, 0x61, 0x2e, 0xd5, 0x0d, 0xc0, 0x98, 0x79, 0x59, 0x0a\ndb 0x33, 0x44, 0xa8, 0x70, 0xd8, 0xda, 0x45, 0x72, 0xdb, 0x83, 0xf7, 0xbe, 0xbb, 0x93, 0xc9, 0xaa\ndb 0xf5, 0xfb, 0xdc, 0x0a, 0x55, 0x54, 0xd1, 0xae, 0x9e, 0x14, 0x38, 0x24, 0x06, 0x6e, 0x4d, 0x17\ndb 0xaa, 0xb1, 0xe4, 0x55, 0x9b, 0x7c, 0xc2, 0xe7, 0xb6, 0x82, 0x1b, 0x5d, 0x21, 0x20, 0xfc, 0x34\ndb 0x51, 0xf7, 0xfd, 0x20, 0x17, 0x4b, 0xd1, 0x9f, 0xc7, 0x2a, 0x57, 0x62, 0x4a, 0x60, 0x3f, 0xfa\ndb 0x70, 0x75, 0x1a, 0x3e, 0x9d, 0xbd, 0x6c, 0xe3, 0x60, 0xc3, 0xd3, 0xa6, 0x3b, 0x73, 0xa5, 0x4f\ndb 0x06, 0x79, 0xf4, 0x6e, 0x3a, 0xae, 0xa4, 0x98, 0x86, 0xb9, 0x1b, 0x8b, 0x66, 0xd9, 0x96, 0xdb\ndb 0xa5, 0x47, 0xd3, 0xa8, 0x05, 0x3c, 0x50, 0x57, 0x8a, 0x8f, 0xe0, 0x7f, 0xaf, 0x75, 0x30, 0x44\ndb 0x01, 0xce, 0x17, 0xb8, 0x89, 0xd4, 0x12, 0xaa, 0xe5, 0x2e, 0xe2, 0x75, 0x70, 0x06, 0x02, 0x5c\ndb 0xbd, 0x85, 0xaa, 0x75, 0x02, 0x98, 0xe0, 0x0f, 0xe9, 0x94, 0x43, 0x84, 0x8c, 0xca, 0xc1, 0x53\ndb 0x2f, 0x5c, 0x9a, 0x04, 0x9c, 0x2c, 0x50, 0xc7, 0x6d, 0x13, 0x70, 0x8f, 0x7d, 0xa5, 0x09, 0xc0\ndb 0x2b, 0x75, 0x55, 0x57, 0xc0, 0x51, 0xad, 0x86, 0x18, 0xc5, 0x9a, 0x9f, 0x1d, 0x99, 0x3e, 0xbd\ndb 0x38, 0x24, 0x33, 0xd6, 0x04, 0x98, 0xde, 0x19, 0xcc, 0xb3, 0x72, 0x53, 0x6b, 0xbb, 0x38, 0x03\ndb 0xdc, 0x86, 0xe3, 0x1b, 0x12, 0x04, 0x86, 0x92, 0x3d, 0x3f, 0xf4, 0x4d, 0x73, 0x8a, 0xe7, 0x67\ndb 0x68, 0xae, 0x63, 0x13, 0x7b, 0x48, 0x90, 0xce, 0x35, 0xfb, 0xf3, 0x46, 0x17, 0xb3, 0xcd, 0x2f\ndb 0xeb, 0xb5, 0x7a, 0x11, 0xa9, 0xe1, 0xa6, 0xab, 0x0c, 0x9e, 0x9f, 0xd1, 0x08, 0xae, 0xc1, 0x68\ndb 0xd2, 0xfc, 0x41, 0x36, 0xa8, 0xf4, 0x97, 0xbf, 0x86, 0x61, 0x90, 0x51, 0x02, 0x2e, 0x9a, 0x64\ndb 0x4e, 0xfb, 0xd1, 0xe5, 0x73, 0x24, 0x07, 0xb5, 0x70, 0xa1, 0xa2, 0xb7, 0xcb, 0x0c, 0xbc, 0x1a\ndb 0x4a, 0x55, 0x9e, 0x3f, 0x3b, 0xdb, 0x33, 0x4c, 0x01, 0x63, 0x1f, 0xbe, 0xae, 0x05, 0x3e, 0x45\ndb 0x9e, 0xcf, 0x2e, 0x5f, 0x3b, 0x83, 0x8a, 0xc7, 0xd7, 0x39, 0x3b, 0xfc, 0x54, 0xf0, 0x10, 0x42\ndb 0x9d, 0x5e, 0x12, 0xc2, 0xb8, 0x8c, 0x4e, 0x26, 0xd7, 0xa0, 0xa1, 0x7a, 0xc0, 0x27, 0x72, 0x52\ndb 0xdb, 0xc5, 0xed, 0xe1, 0x86, 0x19, 0x0a, 0xff, 0x43, 0x3d, 0x1c, 0x12, 0xb2, 0xbe, 0x5c, 0x12\ndb 0x4b, 0xbf, 0xff, 0x20, 0xe3, 0xde, 0x4a, 0x74, 0x89, 0x67, 0x42, 0xc3, 0xaf, 0xe3, 0x8a, 0x8a\ndb 0x57, 0x88, 0xdf, 0xbe, 0x1a, 0x0c, 0x58, 0xa1, 0xfe, 0x21, 0x57, 0x97, 0xf6, 0xef, 0xba, 0x34\ndb 0x54, 0x60, 0x00, 0x71, 0x09, 0x4a, 0x5b, 0x89, 0x61, 0x4a, 0x67, 0x19, 0x34, 0x44, 0x83, 0x21\ndb 0x3d, 0xeb, 0x67, 0xff, 0xf7, 0x68, 0xbb, 0x29, 0xa0, 0x74, 0x5e, 0xad, 0x78, 0xb4, 0x11, 0xc5\ndb 0x5e, 0x0e, 0xc0, 0xd4, 0xe7, 0x50, 0x40, 0xa1, 0xb5, 0x98, 0xdb, 0x75, 0x1f, 0xa5, 0xbc, 0x1b\ndb 0xeb, 0x13, 0x18, 0x0e, 0x92, 0x54, 0x17, 0x2d, 0x5b, 0xf8, 0x09, 0x50, 0x27, 0x49, 0xf5, 0x01\ndb 0xb9, 0x51, 0xd1, 0x85, 0x34, 0x67, 0xd8, 0xb9, 0x5f, 0x01, 0x7b, 0xfc, 0xe7, 0x1e, 0xc8, 0xfc\ndb 0x2f, 0xda, 0x81, 0xfd, 0x76, 0x69, 0x5b, 0x47, 0x98, 0x1b, 0x9b, 0xee, 0x9b, 0x18, 0x8e, 0x30\ndb 0x85, 0x9d, 0x45, 0xde, 0xa8, 0x9b, 0x4e, 0x57, 0x26, 0x90, 0x0b, 0x9a, 0xe0, 0xf7, 0xfa, 0x08\ndb 0x1d, 0xe3, 0xca, 0xb8, 0xaa, 0xda, 0x4e, 0xe3, 0xb6, 0x33, 0x05, 0x9a, 0x75, 0x70, 0x18, 0x86\ndb 0x60, 0x31, 0xc1, 0x05, 0x56, 0x02, 0x30, 0xbd, 0xff, 0x3b, 0xa9, 0xca, 0xe4, 0x84, 0xe6, 0x96\ndb 0x47, 0xcf, 0x8b, 0xa8, 0xd4, 0x63, 0x8f, 0x8f, 0x55, 0x4a, 0xbc, 0x4c, 0x3c, 0x61, 0x96, 0x38\ndb 0xcc, 0x10, 0x7e, 0x4e, 0x5c, 0x97, 0xd3, 0x54, 0x22, 0xde, 0xfb, 0x03, 0x81, 0x4e, 0x6d, 0x76\ndb 0xb5, 0xab, 0x8f, 0xba, 0xf5, 0xf0, 0x1a, 0xf9, 0x69, 0x64, 0x30, 0xb3, 0x19, 0x30, 0x54, 0x97\ndb 0x14, 0x66, 0x5c, 0xcf, 0x48, 0x0f, 0x74, 0xf3, 0xbe, 0x16, 0x10, 0x6c, 0xb4, 0x93, 0x86, 0xd1\ndb 0x21, 0xd0, 0x6a, 0x12, 0x35, 0x03, 0x45, 0x99, 0xaa, 0xe1, 0x0a, 0xd9, 0x58, 0x83, 0x2f, 0x97\ndb 0xcb, 0x0d, 0x81, 0x4b, 0x82, 0x01, 0x6f, 0xd6, 0x20, 0xee, 0xf3, 0xbf, 0xdc, 0x3d, 0x67, 0x6c\ndb 0xa5, 0x7c, 0x6d, 0x21, 0x09, 0x99, 0x2e, 0x0a, 0x98, 0x7c, 0x50, 0x56, 0x19, 0x54, 0xcc, 0x79\ndb 0xe1, 0x84, 0x18, 0x86, 0xf8, 0x5a, 0x1b, 0xf7, 0x1f, 0x38, 0xe0, 0x3a, 0xb9, 0x50, 0xc1, 0xf1\ndb 0xbe, 0x66, 0x89, 0xe2, 0x68, 0x4a, 0x11, 0x0b, 0xfb, 0x84, 0x02, 0x38, 0x31, 0xf4, 0xda, 0x50\ndb 0xb6, 0x5f, 0x27, 0x62, 0xc7, 0x5a, 0x0f, 0x99, 0xb7, 0x7e, 0x4a, 0x49, 0xe9, 0x67, 0xe0, 0xa5\ndb 0x0d, 0x08, 0x95, 0xf0, 0xe4, 0x3b, 0x62, 0x30, 0x2b, 0x89, 0x21, 0xdd, 0x52, 0x99, 0x12, 0x16\ndb 0x83, 0x94, 0x6a, 0x38, 0x1f, 0x8d, 0x81, 0xbf, 0x1f, 0xf9, 0xe0, 0x9c, 0x80, 0xcc, 0x7c, 0xfe\ndb 0x33, 0x35, 0x27, 0x26, 0xca, 0xcc, 0x1f, 0x43, 0xcd, 0xb0, 0x74, 0x0e, 0xff, 0x1c, 0x86, 0x43\ndb 0xab, 0x44, 0xbc, 0x31, 0xff, 0xa4, 0x54, 0x95, 0xd4, 0x79, 0x9e, 0xc0, 0xed, 0x87, 0x1c, 0x2e\ndb 0x50, 0x47, 0xad, 0xc0, 0x2f, 0x5e, 0x8c, 0x15, 0xfb, 0x86, 0x2c, 0xa5, 0x61, 0x2a, 0x60, 0x12\ndb 0xbc, 0x1f, 0x84, 0xe9, 0x75, 0x55, 0x7e, 0x2c, 0x11, 0xd0, 0xfc, 0x66, 0x89, 0x86, 0x2f, 0x26\ndb 0x43, 0x1e, 0xa6, 0x6c, 0xa6, 0x40, 0xa9, 0x37, 0x65, 0x99, 0x72, 0xe1, 0x1a, 0xdc, 0x23, 0x53\ndb 0x09, 0x8e, 0xa1, 0xd6, 0xda, 0xd9, 0x95, 0xaf, 0x58, 0xe0, 0x2a, 0x4a, 0xd3, 0xbd, 0xbd, 0x86\n"
  },
  {
    "path": "unittests/ASM/REPNE/F2_F0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x5152535455565758\", \"0x6162636465666768\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\n\nlddqu xmm0, [rdx + 8 * 0]\nlddqu xmm1, [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/SSE4a/extrq_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x48510f254d2fa47f\", \"0\", \"0x30b556de1f6de86b\", \"0x67d29af330ae762c\"],\n    \"XMM1\": [\"0\", \"0\", \"0xb615b9533de8ad09\", \"0xb76472a37404b890\"],\n    \"XMM2\": [\"0x3615b9533de8ad09\", \"0\", \"0x24426b4c72f110ad\", \"0x8a6789f2d415a567\"],\n    \"XMM3\": [\"0\", \"0\", \"0x8996f88178236612\", \"0x19a26b823d3ca2a9\"],\n    \"XMM4\": [\"0x00000001132df102\", \"0\", \"0x00f658ab689712b0\", \"0xc97d9d031ed21972\"],\n    \"XMM5\": [\"0x0000000001ecb156\", \"0\", \"0x1c86432298df55c8\", \"0xb29bfeda891be9cc\"],\n    \"XMM6\": [\"0x00000000432298df\", \"0\", \"0x88b0bd28710f2147\", \"0xc4e95e887fb5ac38\"],\n    \"XMM7\": [\"0x0000b0bd28710f21\", \"0\", \"0xa7df8c2ad03e5be4\", \"0x6c70d1eec2d395ea\"]\n  }\n}\n%endif\n\n; Random data\nvmovups ymm0, [rel .random_data + (0 * 16)]\nvmovups ymm1, [rel .random_data + (1 * 16)]\nvmovups ymm2, [rel .random_data + (2 * 16)]\nvmovups ymm3, [rel .random_data + (3 * 16)]\nvmovups ymm4, [rel .random_data + (4 * 16)]\nvmovups ymm5, [rel .random_data + (5 * 16)]\nvmovups ymm6, [rel .random_data + (6 * 16)]\nvmovups ymm7, [rel .random_data + (7 * 16)]\n\n; imm extrq\n; The upper 64-bits of the xmm are \"undefined.\" Zen will zero.\n; Additionally if width and length is > 64 then the results are undefined.\n; - Behaviour is actually shift then mask so FEX matches \"undefined\" behaviour here.\nextrq xmm0, 0, 0\nextrq xmm1, 0, 63\nextrq xmm2, 63, 0\nextrq xmm3, 63, 63\nextrq xmm4, 0, 31\nextrq xmm5, 31, 31\nextrq xmm6, 31, 16\nextrq xmm7, 48, 8\n\nhlt\n\nalign 16\n; 256bytes of random data\n.random_data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/SSE4a/extrq_variable.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x48510f254d2fa47f\", \"0\", \"0x30b556de1f6de86b\", \"0x67d29af330ae762c\"],\n    \"XMM1\": [\"0\", \"0\", \"0xb615b9533de8ad09\", \"0xb76472a37404b890\"],\n    \"XMM2\": [\"0x3615b9533de8ad09\", \"0\", \"0x24426b4c72f110ad\", \"0x8a6789f2d415a567\"],\n    \"XMM3\": [\"0\", \"0\", \"0x8996f88178236612\", \"0x19a26b823d3ca2a9\"],\n    \"XMM4\": [\"0x00000001132df102\", \"0\", \"0x00f658ab689712b0\", \"0xc97d9d031ed21972\"],\n    \"XMM5\": [\"0x0000000001ecb156\", \"0\", \"0x1c86432298df55c8\", \"0xb29bfeda891be9cc\"],\n    \"XMM6\": [\"0x00000000432298df\", \"0\", \"0x88b0bd28710f2147\", \"0xc4e95e887fb5ac38\"],\n    \"XMM7\": [\"0x0000b0bd28710f21\", \"0\", \"0xa7df8c2ad03e5be4\", \"0x6c70d1eec2d395ea\"]\n  }\n}\n%endif\n\n; Random data\nvmovups ymm0, [rel .random_data + (0 * 16)]\nvmovups ymm1, [rel .random_data + (1 * 16)]\nvmovups ymm2, [rel .random_data + (2 * 16)]\nvmovups ymm3, [rel .random_data + (3 * 16)]\nvmovups ymm4, [rel .random_data + (4 * 16)]\nvmovups ymm5, [rel .random_data + (5 * 16)]\nvmovups ymm6, [rel .random_data + (6 * 16)]\nvmovups ymm7, [rel .random_data + (7 * 16)]\n\n; Load selections\nvmovups ymm8, [rel .data_selection + (0 * 16)]\nvmovups ymm9, [rel .data_selection + (1 * 16)]\nvmovups ymm10, [rel .data_selection + (2 * 16)]\nvmovups ymm11, [rel .data_selection + (3 * 16)]\nvmovups ymm12, [rel .data_selection + (4 * 16)]\nvmovups ymm13, [rel .data_selection + (5 * 16)]\nvmovups ymm14, [rel .data_selection + (6 * 16)]\nvmovups ymm15, [rel .data_selection + (7 * 16)]\n\n; variable extrq\n; The upper 64-bits of the xmm are \"undefined.\" Zen will zero.\n; Additionally if width and length is > 64 then the results are undefined.\n; - Behaviour is actually shift then mask so FEX matches \"undefined\" behaviour here.\nextrq xmm0, xmm8\nextrq xmm1, xmm9\nextrq xmm2, xmm10\nextrq xmm3, xmm11\nextrq xmm4, xmm12\nextrq xmm5, xmm13\nextrq xmm6, xmm14\nextrq xmm7, xmm15\n\nhlt\n\nalign 16\n; 256bytes of random data\n.random_data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n\n%macro d 2\ndq (%1 | (%2 << 8)), 0\n%endmacro\nalign 16\n.data_selection:\n; BitMask, Shift\nd 0, 0\nd 0, 63\nd 63, 0\nd 63, 63\nd 0, 31\nd 31, 31\nd 31, 16\nd 48, 8\n"
  },
  {
    "path": "unittests/ASM/SSE4a/insertq_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xa7df8c2ad03e5be4\", \"0\", \"0x30b556de1f6de86b\", \"0x67d29af330ae762c\"],\n    \"XMM1\": [\"0x30b556de1f6de86b\", \"0\", \"0xb615b9533de8ad09\", \"0xb76472a37404b890\"],\n    \"XMM2\": [\"0xc1029b7f255b4cf4\", \"0\", \"0x24426b4c72f110ad\", \"0x8a6789f2d415a567\"],\n    \"XMM3\": [\"0x24426b4c72f110ad\", \"0\", \"0x8996f88178236612\", \"0x19a26b823d3ca2a9\"],\n    \"XMM4\": [\"0xd47dbb9e78236612\", \"0\", \"0x00f658ab689712b0\", \"0xc97d9d031ed21972\"],\n    \"XMM5\": [\"0x017003bfe89712b0\", \"0\", \"0x1c86432298df55c8\", \"0xb29bfeda891be9cc\"],\n    \"XMM6\": [\"0x1c8678f6900455c8\", \"0\", \"0x88b0bd28710f2147\", \"0xc4e95e887fb5ac38\"],\n    \"XMM7\": [\"0x881fa17837c17f47\", \"0\", \"0xa7df8c2ad03e5be4\", \"0x6c70d1eec2d395ea\"]\n  }\n}\n%endif\n\n; Random data\nvmovups ymm0, [rel .random_data + (0 * 16)]\nvmovups ymm1, [rel .random_data + (1 * 16)]\nvmovups ymm2, [rel .random_data + (2 * 16)]\nvmovups ymm3, [rel .random_data + (3 * 16)]\nvmovups ymm4, [rel .random_data + (4 * 16)]\nvmovups ymm5, [rel .random_data + (5 * 16)]\nvmovups ymm6, [rel .random_data + (6 * 16)]\nvmovups ymm7, [rel .random_data + (7 * 16)]\nvmovups ymm8, [rel .random_data + (8 * 16)]\nvmovups ymm9, [rel .random_data + (9 * 16)]\nvmovups ymm10, [rel .random_data + (10 * 16)]\nvmovups ymm11, [rel .random_data + (11 * 16)]\nvmovups ymm12, [rel .random_data + (12 * 16)]\nvmovups ymm13, [rel .random_data + (13 * 16)]\nvmovups ymm14, [rel .random_data + (14 * 16)]\nvmovups ymm15, [rel .random_data + (15 * 16)]\n\n; imm insertq\n; The upper 64-bits of the xmm are \"undefined.\" Zen will zero.\n; Additionally if width and length is > 64 then the results are undefined.\n; - Behaviour is actually shift then mask so FEX matches \"undefined\" behaviour here.\ninsertq xmm0, xmm8, 0, 0\ninsertq xmm1, xmm9, 0, 63\ninsertq xmm2, xmm10, 63, 0\ninsertq xmm3, xmm11, 63, 63\ninsertq xmm4, xmm12, 0, 31\ninsertq xmm5, xmm13, 31, 31\ninsertq xmm6, xmm14, 31, 16\ninsertq xmm7, xmm15, 48, 8\n\nhlt\n\nalign 16\n; 256bytes of random data\n.random_data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/SSE4a/insertq_variable.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0\", \"0x30b556de1f6de86b\", \"0x67d29af330ae762c\"],\n    \"XMM1\": [\"0x30b556de1f6de86b\", \"0\", \"0xb615b9533de8ad09\", \"0xb76472a37404b890\"],\n    \"XMM2\": [\"0xe162636465666768\", \"0\", \"0x24426b4c72f110ad\", \"0x8a6789f2d415a567\"],\n    \"XMM3\": [\"0x24426b4c72f110ad\", \"0\", \"0x8996f88178236612\", \"0x19a26b823d3ca2a9\"],\n    \"XMM4\": [\"0x42c343c478236612\", \"0\", \"0x00f658ab689712b0\", \"0xc97d9d031ed21972\"],\n    \"XMM5\": [\"0x0acb4bcc689712b0\", \"0\", \"0x1c86432298df55c8\", \"0xb29bfeda891be9cc\"],\n    \"XMM6\": [\"0x1c8625a6a7a855c8\", \"0\", \"0x88b0bd28710f2147\", \"0xc4e95e887fb5ac38\"],\n    \"XMM7\": [\"0x88b3b4b5b6b7b847\", \"0\", \"0xa7df8c2ad03e5be4\", \"0x6c70d1eec2d395ea\"]\n  }\n}\n%endif\n\n; Random data\nvmovups ymm0, [rel .random_data + (0 * 16)]\nvmovups ymm1, [rel .random_data + (1 * 16)]\nvmovups ymm2, [rel .random_data + (2 * 16)]\nvmovups ymm3, [rel .random_data + (3 * 16)]\nvmovups ymm4, [rel .random_data + (4 * 16)]\nvmovups ymm5, [rel .random_data + (5 * 16)]\nvmovups ymm6, [rel .random_data + (6 * 16)]\nvmovups ymm7, [rel .random_data + (7 * 16)]\n\n; Load selections\nvmovups ymm8, [rel .data_selection + (0 * 16)]\nvmovups ymm9, [rel .data_selection + (1 * 16)]\nvmovups ymm10, [rel .data_selection + (2 * 16)]\nvmovups ymm11, [rel .data_selection + (3 * 16)]\nvmovups ymm12, [rel .data_selection + (4 * 16)]\nvmovups ymm13, [rel .data_selection + (5 * 16)]\nvmovups ymm14, [rel .data_selection + (6 * 16)]\nvmovups ymm15, [rel .data_selection + (7 * 16)]\n\n\n; variable insertq\n; The upper 64-bits of the xmm are \"undefined.\" Zen will zero.\n; Additionally if width and length is > 64 then the results are undefined.\n; - Behaviour is actually shift then mask so FEX matches \"undefined\" behaviour here.\ninsertq xmm0, xmm8\ninsertq xmm1, xmm9\ninsertq xmm2, xmm10\ninsertq xmm3, xmm11\ninsertq xmm4, xmm12\ninsertq xmm5, xmm13\ninsertq xmm6, xmm14\ninsertq xmm7, xmm15\n\nhlt\n\nalign 16\n; 256bytes of random data\n.random_data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n\n%macro d 3\ndq %3, (%1 | (%2 << 8))\n%endmacro\nalign 16\n.data_selection:\n; BitMask, Shift, Data\nd 0, 0, 0x4142434445464748\nd 0, 63, 0x5152535455565758\nd 63, 0, 0x6162636465666768\nd 63, 63, 0x7172737475767778\nd 0, 31, 0x8182838485868788\nd 31, 31, 0x9192939495969798\nd 31, 16, 0xA1A2A3A4A5A6A7A8\nd 48, 8, 0xB1B2B3B4B5B6B7B8\n"
  },
  {
    "path": "unittests/ASM/STOS.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RDI\": \"0xE8000020\",\n    \"R11\": \"0xDAD10\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  }\n}\n%endif\n\n; Data we want to store\nmov rax, 0xDEADBEEFBAD0DAD1\n\n; Starting address to store to\nmov rdi, 0xe8000000\n\n; How many elements we want to store\nmov rcx, 0x10\n\n; Direction to increment (Increment when cleared)\ncld\n\n; Store bytes\nrep stosw\n\nmov r11, 0\nmov r10, 0xe8000000\n\nmovzx r12, word [r10 + 0]\nadd r11, r12\nmovzx r12, word [r10 + 2]\nadd r11, r12\nmovzx r12, word [r10 + 4]\nadd r11, r12\nmovzx r12, word [r10 + 6]\nadd r11, r12\nmovzx r12, word [r10 + 8]\nadd r11, r12\nmovzx r12, word [r10 + 10]\nadd r11, r12\nmovzx r12, word [r10 + 12]\nadd r11, r12\nmovzx r12, word [r10 + 14]\nadd r11, r12\nmovzx r12, word [r10 + 16]\nadd r11, r12\nmovzx r12, word [r10 + 18]\nadd r11, r12\nmovzx r12, word [r10 + 20]\nadd r11, r12\nmovzx r12, word [r10 + 22]\nadd r11, r12\nmovzx r12, word [r10 + 24]\nadd r11, r12\nmovzx r12, word [r10 + 26]\nadd r11, r12\nmovzx r12, word [r10 + 28]\nadd r11, r12\nmovzx r12, word [r10 + 30]\nadd r11, r12\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/STOSQ.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RCX\": \"0\",\n    \"RDI\": \"0xE8000100\",\n    \"R11\": \"0\"\n  },\n\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  }\n}\n%endif\n\n; Starting address to store to\nmov rdi, 0xe8000000\n\n; How many elements we want to store\n; Additional just in case STOS continues past for some reason\nmov rcx, 0x100\n\n; Data we want to store\nmov rax, 0xDEADBEEFBAD0DAD1\n\n; Direction to increment (Increment when cleared)\ncld\n\n; First fill the area with garbage without using STOS\nmov rdx, 0\nloop_header:\n  mov [rdi + rdx * 8], rax\n  add rdx, 1\n  cmp rdx, rcx\n  jne loop_header\n\n; Now use STOS to fill the data with zero\n\nmov rax, 0x0\nmov rcx, 0x20\nrep stosq\n\n; Now read the data back and ensure it is zero\n\nmov r14, 0xe8000000\nmov r13, 0x20\nmov r12, 0\nmov r11, 0\nloop_header2:\n  add r11, [r14 + r12 * 8]\n  add r12, 1\n  cmp r12, r13\n  jne loop_header2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/STOSQ2.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RAX\": \"0xDEADBEEFBAD0DAD1\"\n  },\n\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  }\n}\n%endif\n\n; Starting address to store to\nmov rdi, 0xe8000000\n; Store value\nmov rax, 0xDEADBEEFBAD0DAD1\nmov [rdi], rax\n\n; Set counter to zero\nmov ecx, 0\n; Set store value to zero\nmov rax, 0\n\nrep STOSQ\n\n; Reload what we just stored\n; Ensure that STOSQ didn't write\nmov rdi, 0xe8000000\nmov rax, [rdi]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/STOSQ2_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RAX\": \"0xDEADBEEFBAD0DAD1\"\n  },\n\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  }\n}\n%endif\n\n; Starting address to store to\nmov rdi, 0xe8000000\n; Store value\nmov rax, 0xDEADBEEFBAD0DAD1\nmov [rdi], rax\n\n; Set counter to zero\nmov ecx, 0\n; Set store value to zero\nmov rax, 0\n\nrepne STOSQ\n\n; Reload what we just stored\n; Ensure that STOSQ didn't write\nmov rdi, 0xe8000000\nmov rax, [rdi]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/STOSQ_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RCX\": \"0\",\n    \"RDI\": \"0xE8000100\",\n    \"R11\": \"0\"\n  },\n\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  }\n}\n%endif\n\n; Starting address to store to\nmov rdi, 0xe8000000\n\n; How many elements we want to store\n; Additional just in case STOS continues past for some reason\nmov rcx, 0x100\n\n; Data we want to store\nmov rax, 0xDEADBEEFBAD0DAD1\n\n; Direction to increment (Increment when cleared)\ncld\n\n; First fill the area with garbage without using STOS\nmov rdx, 0\nloop_header:\n  mov [rdi + rdx * 8], rax\n  add rdx, 1\n  cmp rdx, rcx\n  jne loop_header\n\n; Now use STOS to fill the data with zero\n\nmov rax, 0x0\nmov rcx, 0x20\nrepne stosq\n\n; Now read the data back and ensure it is zero\n\nmov r14, 0xe8000000\nmov r13, 0x20\nmov r12, 0\nmov r11, 0\nloop_header2:\n  add r11, [r14 + r12 * 8]\n  add r12, 1\n  cmp r12, r13\n  jne loop_header2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/STOS_REPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RDI\": \"0xE8000020\",\n    \"R11\": \"0xDAD10\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  }\n}\n%endif\n\n; Data we want to store\nmov rax, 0xDEADBEEFBAD0DAD1\n\n; Starting address to store to\nmov rdi, 0xe8000000\n\n; How many elements we want to store\nmov rcx, 0x10\n\n; Direction to increment (Increment when cleared)\ncld\n\n; Store bytes\nrepne stosw\n\nmov r11, 0\nmov r10, 0xe8000000\n\nmovzx r12, word [r10 + 0]\nadd r11, r12\nmovzx r12, word [r10 + 2]\nadd r11, r12\nmovzx r12, word [r10 + 4]\nadd r11, r12\nmovzx r12, word [r10 + 6]\nadd r11, r12\nmovzx r12, word [r10 + 8]\nadd r11, r12\nmovzx r12, word [r10 + 10]\nadd r11, r12\nmovzx r12, word [r10 + 12]\nadd r11, r12\nmovzx r12, word [r10 + 14]\nadd r11, r12\nmovzx r12, word [r10 + 16]\nadd r11, r12\nmovzx r12, word [r10 + 18]\nadd r11, r12\nmovzx r12, word [r10 + 20]\nadd r11, r12\nmovzx r12, word [r10 + 22]\nadd r11, r12\nmovzx r12, word [r10 + 24]\nadd r11, r12\nmovzx r12, word [r10 + 26]\nadd r11, r12\nmovzx r12, word [r10 + 28]\nadd r11, r12\nmovzx r12, word [r10 + 30]\nadd r11, r12\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/07_XX_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RBX\": \"0xFFFFFFFFFFFE0000\"\n  }\n}\n%endif\n\nsgdt [rel data]\n\nmovzx rax, word [rel data]\nmov rbx, qword [rel data + 2]\nhlt\n\nalign 4096\ndata:\n; Limit\ndw 0\n; Base\ndq 0\n"
  },
  {
    "path": "unittests/ASM/Secondary/07_XX_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000080050033\",\n    \"RBX\": \"0x4142434480050033\",\n    \"RCX\": \"0x4142434445460033\",\n    \"RDX\": \"0x4142434445460033\",\n    \"RDI\": \"0x0000000080050033\",\n    \"RSP\": \"0x0000000080050033\",\n    \"RBP\": \"0x0000000080050033\",\n    \"R8\":  \"0x4142434445460033\",\n    \"R9\":  \"0x4142434445460033\",\n    \"R10\": \"0x4142434445460033\"\n  }\n}\n%endif\n\nmov rax, 0x4142434445464748\nmov rbx, 0x4142434445464748\nmov rcx, 0x4142434445464748\nmov rdx, 0x4142434445464748\nmov rsi, 0xe000_0000\nmov [rsi], rdx\n\nmov rdi, 0x4142434445464748\nmov rsp, 0x4142434445464748\nmov rbp, 0x4142434445464748\nmov r8, 0x4142434445464748\nmov r9, 0x4142434445464748\nmov r10, 0x4142434445464748\n\nsmsw rax\nsmsw ebx\nsmsw cx\n\nsmsw [rsi]\nmov rdx, [rsi]\n\n; operand-size override prefix\n; Nasm complains if o16 is used\n; `warning: invalid operand size prefix o16, must be o64`\ndb 0x66\nsmsw rdi\nrepe smsw rsp\nrepne smsw rbp\n\ndb 0x66\nsmsw r8w\nrepe smsw r9w\nrepne smsw r10w\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_66_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x3\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\nbt word [rdx], 1\ncfmerge\n\nmov r13, 32\nbt dword [rdx], r13d\ncfmerge\n\n; Ensures correct modulo on value\nbt qword [rdx], 64 * 2 + 63\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_66_04_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x4\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000002\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\nmovzx r12, word [rdx]\nbt r12w, 1\ncfmerge\n\nmov r13, 32\nmov r12d, dword [rdx]\n\nbt r12d, r13d\ncfmerge\n\nmov r12, qword [rdx]\nbt r12, 64 * 3\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_F2_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x3\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\ndb 0xF2 ; Prefix with F2. Shouldn't change behaviour\nbt word [rdx], 1\ncfmerge\n\nmov r13, 32\ndb 0xF2 ; Prefix with F2. Shouldn't change behaviour\nbt dword [rdx], r13d\ncfmerge\n\ndb 0xF2 ; Prefix with F2. Shouldn't change behaviour\nbt qword [rdx], 64 * 2 + 63\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_F2_04_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x4\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000002\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\nmovzx r12, word [rdx]\ndb 0xF2 ; Prefix with F2. Shouldn't change behaviour\nbt r12w, 1\ncfmerge\n\nmov r13, 32\nmov r12d, dword [rdx]\ndb 0xF2 ; Prefix with F2. Shouldn't change behaviour\nbt r12d, r13d\ncfmerge\n\nmov r12, qword [rdx]\ndb 0xF2 ; Prefix with F2. Shouldn't change behaviour\nbt r12, 64 * 3\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_F2_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_F3_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x3\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\ndb 0xF3 ; Prefix with F3. Shouldn't change behaviour\nbt word [rdx], 1\ncfmerge\n\nmov r13, 32\ndb 0xF3 ; Prefix with F3. Shouldn't change behaviour\nbt dword [rdx], r13d\ncfmerge\n\ndb 0xF3 ; Prefix with F3. Shouldn't change behaviour\nbt qword [rdx], 64 * 2 + 63\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_F3_04_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x4\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000002\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\nmovzx r12, word [rdx]\ndb 0xF3 ; Prefix with F3. Shouldn't change behaviour\nbt r12w, 1\ncfmerge\n\nmov r13, 32\nmov r12d, dword [rdx]\ndb 0xF3 ; Prefix with F3. Shouldn't change behaviour\nbt r12d, r13d\ncfmerge\n\nmov r12, qword [rdx]\ndb 0xF3 ; Prefix with F3. Shouldn't change behaviour\nbt r12, 64 * 3\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x3\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\nbt word [rdx], 1\ncfmerge\n\nmov r13, 32\nbt dword [rdx], r13d\ncfmerge\n\nbt qword [rdx], 64 * 2 + 63\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_04_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x4\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000002\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\nmovzx r12, word [rdx]\nbt r12w, 1\ncfmerge\n\nmov r13, 32\nmov r12d, dword [rdx]\nbt r12d, r13d\ncfmerge\n\nmov r12, qword [rdx]\nbt r12, 64 * 3\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_04_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x1\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000100000000\nmov [rdx + 8 * 0], rax\n\nxor r15, r15 ; Will contain our results\n\nbt qword [rdx], 32\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x1F\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nbts word [rdx], 1\ncfmerge\n\n; Ensure it is set\nbt word [rdx], 1\ncfmerge\n\nmov r13, 32\nbts dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nbts qword [rdx], 64 * 2 + 63\ncfmerge\n\nbt qword [rdx], 64 * 2 + 63\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_05_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x35\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000002\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\nmovzx r12, word [rdx]\n\n; Test and set\nbts r12w, 1\ncfmerge\n\n; Ensure it is set\nbt r12w, 1\ncfmerge\n\nmov r13, 32\nmov r12d, dword [rdx]\n\nbts r12d, r13d\ncfmerge\n\nbt r12d, r13d\ncfmerge\n\nmov r12, qword [rdx]\nbts r12, 64 * 3\ncfmerge\n\nbt r12, 64 * 3\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_05_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x3\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000100000000\nmov [rdx + 8 * 0], rax\n\nxor r15, r15 ; Will contain our results\n\nbts qword [rdx], 32\ncfmerge\n\nbt qword [rdx], 32\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_05_3_Atomic.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x3\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000100000000\nmov [rdx + 8 * 0], rax\n\nxor r15, r15 ; Will contain our results\n\nlock bts qword [rdx], 32\ncfmerge\n\nbt qword [rdx], 32\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_05_Atomic.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x1F\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nlock bts word [rdx], 1\ncfmerge\n\n; Ensure it is set\nbt word [rdx], 1\ncfmerge\n\nmov r13, 32\nlock bts dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nlock bts qword [rdx], 64 * 2 + 63\ncfmerge\n\nbt qword [rdx], 64 * 2 + 63\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xA\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nbtr word [rdx], 1\ncfmerge\n\n; Ensure it is set\nbt word [rdx], 1\ncfmerge\n\nmov r13, 32\nbtr dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nbtr qword [rdx], 64 * 2 + 63\ncfmerge\n\nbt qword [rdx], 64 * 2 + 63\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_06_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x20\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000002\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\nmovzx r12, word [rdx]\n\n; Test and set\nbtr r12w, 1\ncfmerge\n\n; Ensure it is set\nbt r12w, 1\ncfmerge\n\nmov r13, 32\nmov r12d, dword [rdx]\n\nbtr r12d, r13d\ncfmerge\n\nbt r12d, r13d\ncfmerge\n\nmov r12, qword [rdx]\nbtr r12, 64 * 3\ncfmerge\n\nbt r12, 64 * 3\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_06_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x2\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000100000000\nmov [rdx + 8 * 0], rax\n\nxor r15, r15 ; Will contain our results\n\nbtr qword [rdx], 32\ncfmerge\n\nbt qword [rdx], 32\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_06_3_Atomic.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x2\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000100000000\nmov [rdx + 8 * 0], rax\n\nxor r15, r15 ; Will contain our results\n\nlock btr qword [rdx], 32\ncfmerge\n\nbt qword [rdx], 32\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_06_Atomic.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xA\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nlock btr word [rdx], 1\ncfmerge\n\n; Ensure it is set\nbt word [rdx], 1\ncfmerge\n\nmov r13, 32\nlock btr dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nlock btr qword [rdx], 64 * 2 + 63\ncfmerge\n\nbt qword [rdx], 64 * 2 + 63\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x1A\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nbtc word [rdx], 1\ncfmerge\n\n; Ensure it is set\nbt word [rdx], 1\ncfmerge\n\nmov r13, 32\nbtc dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nbtc qword [rdx], 64 * 2 + 63\ncfmerge\n\nbt qword [rdx], 64 * 2 + 63\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_07_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x25\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000002\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\nmovzx r12, word [rdx]\n\n; Test and set\nbtc r12w, 1\ncfmerge\n\n; Ensure it is set\nbt r12w, 1\ncfmerge\n\nmov r13, 32\nmov r12d, dword [rdx]\n\nbtc r12d, r13d\ncfmerge\n\nbt r12d, r13d\ncfmerge\n\nmov r12, qword [rdx]\nbtc r12, 64 * 3\ncfmerge\n\nbt r12, 64 * 3\ncfmerge\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_07_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x2\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000100000000\nmov [rdx + 8 * 0], rax\n\nxor r15, r15 ; Will contain our results\n\nbtc qword [rdx], 32\ncfmerge\n\nbt qword [rdx], 32\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_07_3_Atomic.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x2\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000100000000\nmov [rdx + 8 * 0], rax\n\nxor r15, r15 ; Will contain our results\n\nlock btc qword [rdx], 32\ncfmerge\n\nbt qword [rdx], 32\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/08_XX_07_Atomic.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x1A\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nlock btc word [rdx], 1\ncfmerge\n\n; Ensure it is set\nbt word [rdx], 1\ncfmerge\n\nmov r13, 32\nlock btc dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nlock btc qword [rdx], 64 * 2 + 63\ncfmerge\n\nbt qword [rdx], 64 * 2 + 63\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_F3_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"HostFeatures\": [\"RDPID\"]\n}\n%endif\n\nmov rax, 0\nmov rbx, 0x4142434445464748\nmov rcx, 0x4142434445464748\nrdpid ebx\n\ncmp rbx, rcx\nsetne al\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x80000000\",\n    \"RDX\": \"0xFFFFFFFF\",\n    \"RBX\": \"0x41424344\",\n    \"RCX\": \"0x51525354\",\n    \"R13\": \"0x5152535441424344\",\n    \"R14\": \"0x1\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [r15 + 8 * 0], rax\n\nmov r14, 0\n; Expected\nmov eax, 0x80000000\nmov edx, 0xFFFFFFFF\n\n; Desired\nmov ebx, 0x41424344\nmov ecx, 0x51525354\n\ncmpxchg8b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; edx and eax will now contain the memory's data\n\n; Check memory location to ensure it contains what we want\nmov r13, [r15 + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_10.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x80000000\",\n    \"RDX\": \"0xFFFFFFFF\",\n    \"RBX\": \"0x0000000080000000\",\n    \"RCX\": \"0x00000000ffffffff\",\n    \"R13\": \"0xffffffff80000000\",\n    \"R14\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [r15 + 8 * 0], rax\n\nmov r14, 0\n; Expected\nmov eax, 0x41424344\nmov edx, 0x51525354\n\n; Desired\nmov ebx, 0x80000000\nmov ecx, 0xFFFFFFFF\n\n; Memory is already Desired and NOT expected\n; Finds bug in CAS on AArch64\n\ncmpxchg8b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; edx and eax will now contain the memory's data\n\n; Check memory location to ensure it contains what we want\nmov r13, [r15 + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_11.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000080000000\",\n    \"RDX\": \"0x00000000ffffffff\",\n    \"RBX\": \"0x4141414180000000\",\n    \"RCX\": \"0x41414141ffffffff\",\n    \"R13\": \"0xffffffff80000000\",\n    \"R14\": \"0x0\"\n  }\n}\n%endif\n\n; Within 16 byte region but unaligned\nmov r15, 0xe0000007\n\nmov rax, 0xFFFFFFFF80000000\nmov [r15 + 8 * 0], rax\n\nmov r14, 0\n; Expected\nmov rax, 0xFFFFFFFF41424344\nmov rdx, 0xFFFFFFFF51525354\n\n; Desired\nmov rbx, 0x4141414180000000\nmov rcx, 0x41414141FFFFFFFF\n\n; Memory is already Desired and NOT expected\n; Finds bug in CAS on AArch64\n\ncmpxchg8b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; Memory will now be set to the register data\n; EDX:EAX will be the original data\n\n; Check memory location to ensure it contains what we want\nmov r13, [r15 + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_12.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000080000000\",\n    \"RDX\": \"0x00000000ffffffff\",\n    \"RBX\": \"0x4141414180000000\",\n    \"RCX\": \"0x41414141ffffffff\",\n    \"R13\": \"0xffffffff80000000\",\n    \"R14\": \"0x0\"\n  }\n}\n%endif\n\n; Spans 16byte boundary and unaligned\nmov r15, 0xe0000009\n\nmov rax, 0xFFFFFFFF80000000\nmov [r15 + 8 * 0], rax\n\nmov r14, 0\n; Expected\nmov rax, 0xFFFFFFFF41424344\nmov rdx, 0xFFFFFFFF51525354\n\n; Desired\nmov rbx, 0x4141414180000000\nmov rcx, 0x41414141FFFFFFFF\n\n; Memory is already Desired and NOT expected\n; Finds bug in CAS on AArch64\n\ncmpxchg8b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; Memory will now be set to the register data\n; EDX:EAX will be the original data\n\n; Check memory location to ensure it contains what we want\nmov r13, [r15 + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_13.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000080000000\",\n    \"RDX\": \"0x00000000ffffffff\",\n    \"RBX\": \"0x4141414180000000\",\n    \"RCX\": \"0x41414141ffffffff\",\n    \"R13\": \"0xffffffff80000000\",\n    \"R14\": \"0x0\"\n  }\n}\n%endif\n\n; Spans 64byte boundary and unaligned\nmov r15, 0xe000003F\n\nmov rax, 0xFFFFFFFF80000000\nmov [r15 + 8 * 0], rax\n\nmov r14, 0\n; Expected\nmov rax, 0xFFFFFFFF41424344\nmov rdx, 0xFFFFFFFF51525354\n\n; Desired\nmov rbx, 0x4141414180000000\nmov rcx, 0x41414141FFFFFFFF\n\n; Memory is already Desired and NOT expected\n; Finds bug in CAS on AArch64\n\ncmpxchg8b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; Memory will now be set to the register data\n; EDX:EAX will be the original data\n\n; Check memory location to ensure it contains what we want\nmov r13, [r15 + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_14.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x5152535455565758\",\n    \"RBX\": \"0x6162636465666768\",\n    \"R15\": \"0x7172737475767778\",\n    \"R12\": \"0x4142434445464748\",\n    \"R13\": \"0x5152535455565758\",\n    \"R14\": \"0x0\"\n  }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rcx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rcx + 8 * 1], rax\n\nmov r14, 0\n; Expected\nmov rax, 0x41424344FFFFFFFF\nmov rdx, 0x5152535455565758\n\n; Desired\nmov rbx, 0x6162636465666768\nmov r15, 0x7172737475767778\n\n; Prefix 66h, ensures it still operates at 16b\ndb 0x66\ncmpxchg16b [rcx]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; rdx and rax will now contain the memory's data\n\n; Check memory location to ensure it contains what we want\nmov r12, [rcx + 8 * 0]\nmov r13, [rcx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_15.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4141414180000000\",\n    \"RDX\": \"0x41414141FFFFFFFF\",\n    \"RBX\": \"0xFFFFFFFF41424344\",\n    \"RCX\": \"0xFFFFFFFF51525354\",\n    \"R13\": \"0x5152535441424344\",\n    \"R14\": \"0x1\"\n  }\n}\n%endif\n\n; Spans 64byte boundary and unaligned\nmov r15, 0xe000003F\n\nmov rax, 0xFFFFFFFF80000000\nmov [r15 + 8 * 0], rax\n\nmov r14, 0\n; Expected\nmov rax, 0x4141414180000000\nmov rdx, 0x41414141FFFFFFFF\n\n; Desired\nmov rbx, 0xFFFFFFFF41424344\nmov rcx, 0xFFFFFFFF51525354\n\n; Prefix 66h, ensures it still operates at 8b\ndb 0x66\ncmpxchg8b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; Memory will now be set to the register data\n; EDX:EAX will be the original data\n\n; Check memory location to ensure it contains what we want\nmov r13, [r15 + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x5152535455565758\",\n    \"RBX\": \"0x6162636465666768\",\n    \"R15\": \"0x7172737475767778\",\n    \"R12\": \"0x4142434445464748\",\n    \"R13\": \"0x5152535455565758\",\n    \"R14\": \"0x0\"\n  }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rcx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rcx + 8 * 1], rax\n\nmov r14, 0\n; Expected\nmov rax, 0x41424344FFFFFFFF\nmov rdx, 0x5152535455565758\n\n; Desired\nmov rbx, 0x6162636465666768\nmov r15, 0x7172737475767778\n\n; Prefix F2h, ensures it still operates at 16b\ndb 0xF2\ncmpxchg16b [rcx]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; rdx and rax will now contain the memory's data\n\n; Check memory location to ensure it contains what we want\nmov r12, [rcx + 8 * 0]\nmov r13, [rcx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_17.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x5152535455565758\",\n    \"RBX\": \"0x6162636465666768\",\n    \"R15\": \"0x7172737475767778\",\n    \"R12\": \"0x4142434445464748\",\n    \"R13\": \"0x5152535455565758\",\n    \"R14\": \"0x0\"\n  }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rcx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rcx + 8 * 1], rax\n\nmov r14, 0\n; Expected\nmov rax, 0x41424344FFFFFFFF\nmov rdx, 0x5152535455565758\n\n; Desired\nmov rbx, 0x6162636465666768\nmov r15, 0x7172737475767778\n\n; Prefix F3h, ensures it still operates at 16b\ndb 0xF3\ncmpxchg16b [rcx]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; rdx and rax will now contain the memory's data\n\n; Check memory location to ensure it contains what we want\nmov r12, [rcx + 8 * 0]\nmov r13, [rcx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_18.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4141414180000000\",\n    \"RDX\": \"0x41414141FFFFFFFF\",\n    \"RBX\": \"0xFFFFFFFF41424344\",\n    \"RCX\": \"0xFFFFFFFF51525354\",\n    \"R13\": \"0x5152535441424344\",\n    \"R14\": \"0x1\"\n  }\n}\n%endif\n\n; Spans 64byte boundary and unaligned\nmov r15, 0xe000003F\n\nmov rax, 0xFFFFFFFF80000000\nmov [r15 + 8 * 0], rax\n\nmov r14, 0\n; Expected\nmov rax, 0x4141414180000000\nmov rdx, 0x41414141FFFFFFFF\n\n; Desired\nmov rbx, 0xFFFFFFFF41424344\nmov rcx, 0xFFFFFFFF51525354\n\n; Prefix F2h, ensures it still operates at 8b\ndb 0xF2\ncmpxchg8b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; Memory will now be set to the register data\n; EDX:EAX will be the original data\n\n; Check memory location to ensure it contains what we want\nmov r13, [r15 + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_19.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4141414180000000\",\n    \"RDX\": \"0x41414141FFFFFFFF\",\n    \"RBX\": \"0xFFFFFFFF41424344\",\n    \"RCX\": \"0xFFFFFFFF51525354\",\n    \"R13\": \"0x5152535441424344\",\n    \"R14\": \"0x1\"\n  }\n}\n%endif\n\n; Spans 64byte boundary and unaligned\nmov r15, 0xe000003F\n\nmov rax, 0xFFFFFFFF80000000\nmov [r15 + 8 * 0], rax\n\nmov r14, 0\n; Expected\nmov rax, 0x4141414180000000\nmov rdx, 0x41414141FFFFFFFF\n\n; Desired\nmov rbx, 0xFFFFFFFF41424344\nmov rcx, 0xFFFFFFFF51525354\n\n; Prefix F3h, ensures it still operates at 8b\ndb 0xF3\ncmpxchg8b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; Memory will now be set to the register data\n; EDX:EAX will be the original data\n\n; Check memory location to ensure it contains what we want\nmov r13, [r15 + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x80000000\",\n    \"RDX\": \"0xFFFFFFFF\",\n    \"RBX\": \"0x41424344\",\n    \"RCX\": \"0x51525354\",\n    \"R13\": \"0xFFFFFFFF80000000\",\n    \"R14\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [r15 + 8 * 0], rax\n\nmov r14, 0\n; Expected\nmov eax, 0xFFFFFFFF\nmov edx, 0xFFFFFFFF\n\n; Desired\nmov ebx, 0x41424344\nmov ecx, 0x51525354\n\ncmpxchg8b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; edx and eax will now contain the memory's data\n\n; Check memory location to ensure it contains what we want\nmov r13, [r15 + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x5152535455565758\",\n    \"RBX\": \"0x6162636465666768\",\n    \"RCX\": \"0x7172737475767778\",\n    \"R12\": \"0x6162636465666768\",\n    \"R13\": \"0x7172737475767778\",\n    \"R14\": \"0x1\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\n\nmov r14, 0\n; Expected\nmov rax, 0x4142434445464748\nmov rdx, 0x5152535455565758\n\n; Desired\nmov rbx, 0x6162636465666768\nmov rcx, 0x7172737475767778\n\ncmpxchg16b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; rdx and rax will now contain the memory's data\n\n; Check memory location to ensure it contains what we want\nmov r12, [r15 + 8 * 0]\nmov r13, [r15 + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RDX\": \"0x5152535455565758\",\n    \"RBX\": \"0x6162636465666768\",\n    \"RCX\": \"0x7172737475767778\",\n    \"R12\": \"0x4142434445464748\",\n    \"R13\": \"0x5152535455565758\",\n    \"R14\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\n\nmov r14, 0\n; Expected\nmov rax, 0x41424344FFFFFFFF\nmov rdx, 0x5152535455565758\n\n; Desired\nmov rbx, 0x6162636465666768\nmov rcx, 0x7172737475767778\n\ncmpxchg16b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; rdx and rax will now contain the memory's data\n\n; Check memory location to ensure it contains what we want\nmov r12, [r15 + 8 * 0]\nmov r13, [r15 + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x80000000\",\n    \"RDX\": \"0xFFFFFFFF\",\n    \"RBX\": \"0xFFFFFFFF41424344\",\n    \"RCX\": \"0xFFFFFFFF51525354\",\n    \"R13\": \"0xFFFFFFFF80000000\",\n    \"R14\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [r15 + 8 * 0], rax\n\nmov r14, 0\n; Expected\nmov rax, 0x41414141FFFFFFFF\nmov rdx, 0x41414141FFFFFFFF\n\n; Desired\nmov rbx, 0xFFFFFFFF41424344\nmov rcx, 0xFFFFFFFF51525354\n\ncmpxchg8b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; edx and eax will now contain the memory's data\n; It will zext to the full 64bit of the register\n\n; Check memory location to ensure it contains what we want\nmov r13, [r15 + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4141414180000000\",\n    \"RDX\": \"0x41414141FFFFFFFF\",\n    \"RBX\": \"0xFFFFFFFF41424344\",\n    \"RCX\": \"0xFFFFFFFF51525354\",\n    \"R13\": \"0x5152535441424344\",\n    \"R14\": \"0x1\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [r15 + 8 * 0], rax\n\nmov r14, 0\n; Expected\nmov rax, 0x4141414180000000\nmov rdx, 0x41414141FFFFFFFF\n\n; Desired\nmov rbx, 0xFFFFFFFF41424344\nmov rcx, 0xFFFFFFFF51525354\n\ncmpxchg8b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; Memory will now be set to the register data\n; EDX:EAX will be the original data\n\n; Check memory location to ensure it contains what we want\nmov r13, [r15 + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4141414180000000\",\n    \"RDX\": \"0x41414141FFFFFFFF\",\n    \"RBX\": \"0xFFFFFFFF41424344\",\n    \"RCX\": \"0xFFFFFFFF51525354\",\n    \"R13\": \"0x5152535441424344\",\n    \"R14\": \"0x1\"\n  }\n}\n%endif\n\n; Within 16 byte region but unaligned\nmov r15, 0xe0000007\n\nmov rax, 0xFFFFFFFF80000000\nmov [r15 + 8 * 0], rax\n\nmov r14, 0\n; Expected\nmov rax, 0x4141414180000000\nmov rdx, 0x41414141FFFFFFFF\n\n; Desired\nmov rbx, 0xFFFFFFFF41424344\nmov rcx, 0xFFFFFFFF51525354\n\ncmpxchg8b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; Memory will now be set to the register data\n; EDX:EAX will be the original data\n\n; Check memory location to ensure it contains what we want\nmov r13, [r15 + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4141414180000000\",\n    \"RDX\": \"0x41414141FFFFFFFF\",\n    \"RBX\": \"0xFFFFFFFF41424344\",\n    \"RCX\": \"0xFFFFFFFF51525354\",\n    \"R13\": \"0x5152535441424344\",\n    \"R14\": \"0x1\"\n  }\n}\n%endif\n\n; Spans 16byte boundary and unaligned\nmov r15, 0xe0000009\n\nmov rax, 0xFFFFFFFF80000000\nmov [r15 + 8 * 0], rax\n\nmov r14, 0\n; Expected\nmov rax, 0x4141414180000000\nmov rdx, 0x41414141FFFFFFFF\n\n; Desired\nmov rbx, 0xFFFFFFFF41424344\nmov rcx, 0xFFFFFFFF51525354\n\ncmpxchg8b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; Memory will now be set to the register data\n; EDX:EAX will be the original data\n\n; Check memory location to ensure it contains what we want\nmov r13, [r15 + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_01_9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4141414180000000\",\n    \"RDX\": \"0x41414141FFFFFFFF\",\n    \"RBX\": \"0xFFFFFFFF41424344\",\n    \"RCX\": \"0xFFFFFFFF51525354\",\n    \"R13\": \"0x5152535441424344\",\n    \"R14\": \"0x1\"\n  }\n}\n%endif\n\n; Spans 64byte boundary and unaligned\nmov r15, 0xe000003F\n\nmov rax, 0xFFFFFFFF80000000\nmov [r15 + 8 * 0], rax\n\nmov r14, 0\n; Expected\nmov rax, 0x4141414180000000\nmov rdx, 0x41414141FFFFFFFF\n\n; Desired\nmov rbx, 0xFFFFFFFF41424344\nmov rcx, 0xFFFFFFFF51525354\n\ncmpxchg8b [r15]\n\n; Set r14 to 1 if if the memory location was expected\nsetz r14b\n\n; Memory will now be set to the register data\n; EDX:EAX will be the original data\n\n; Check memory location to ensure it contains what we want\nmov r13, [r15 + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445460000\",\n    \"RBX\": \"0x0\",\n    \"RDX\": \"1\",\n    \"R9\": \"1\",\n    \"R10\": \"1\"\n  },\n  \"HostFeatures\": [\"RAND\"]\n}\n%endif\n\nmov rax, 0x4142434445464748\nmov rbx, 0x4142434445464748\nmov rcx, 0x4142434445464748\n\n; 16-bit should insert\ntest_16bit:\nrdrand ax\njnc test_16bit\n\n; Mask out RNG\nmov r11, 0xFFFFFFFFFFFF0000\nand rax, r11\n\nmov r8, 0x4142434445460000\ncmp rax, r8\n\nmov rdx, 0\nsete dl\n\n; 32-bit and 64-bit should zext\ntest_32bit:\nrdrand ebx\njnc test_32bit\n\n; Mask out RNG\nmov r11, 0xFFFFFFFF00000000\nand rbx, r11\n\nmov r8, 0x4142434400000000\ncmp r11, r8\n\nmov r9, 0\nsetne r9b\n\ntest_64bit:\nrdrand rcx\njnc test_32bit\n\nmov r8, 0x0\ncmp rcx, r8\n\nmov r10, 0\nsetne r10b\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/09_XX_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445460000\",\n    \"RBX\": \"0x0\",\n    \"RDX\": \"1\",\n    \"R9\": \"1\",\n    \"R10\": \"1\"\n  },\n  \"HostFeatures\": [\"RAND\"]\n}\n%endif\n\nmov rax, 0x4142434445464748\nmov rbx, 0x4142434445464748\nmov rcx, 0x4142434445464748\n\n; 16-bit should insert\ntest_16bit:\nrdseed ax\njnc test_16bit\n\n; Mask out RNG\nmov r11, 0xFFFFFFFFFFFF0000\nand rax, r11\n\nmov r8, 0x4142434445460000\ncmp rax, r8\n\nmov rdx, 0\nsete dl\n\n; 32-bit and 64-bit should zext\ntest_32bit:\nrdseed ebx\njnc test_32bit\n\n; Mask out RNG\nmov r11, 0xFFFFFFFF00000000\nand rbx, r11\n\nmov r8, 0x4142434400000000\ncmp r11, r8\n\nmov r9, 0\nsetne r9b\n\ntest_64bit:\nrdseed rcx\njnc test_64bit\n\nmov r8, 0x0\ncmp rcx, r8\n\nmov r10, 0\nsetne r10b\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/12_66_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x0041004300450047\", \"0x0051005300550057\"],\n    \"XMM3\": [\"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 16]\nmovapd xmm2, [rdx]\nmovapd xmm3, [rdx + 16]\n\npsrlw xmm0, 32\npsrlw xmm1, 16\npsrlw xmm2, 8\npsrlw xmm3, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/12_66_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x0041004300450047\", \"0x0051005300550057\"],\n    \"XMM3\": [\"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\"],\n    \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8000800080008000\nmov [rdx + 8 * 4], rax\nmov rax, 0x7000700070007000\nmov [rdx + 8 * 5], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 16]\nmovapd xmm2, [rdx]\nmovapd xmm3, [rdx + 16]\nmovapd xmm4, [rdx + 32]\n\npsraw xmm0, 32\npsraw xmm1, 16\npsraw xmm2, 8\npsraw xmm3, 1\npsraw xmm4, 16\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/12_66_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x4200440046004800\", \"0x5200540056005800\"],\n    \"XMM3\": [\"0xC2C4C6C8CACCCED0\", \"0xE2E4E6E8EAECEEF0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 16]\nmovapd xmm2, [rdx]\nmovapd xmm3, [rdx + 16]\n\npsllw xmm0, 32\npsllw xmm1, 16\npsllw xmm2, 8\npsllw xmm3, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/13_66_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x0000616200006566\", \"0x0000717200007576\"],\n    \"XMM2\": [\"0x0041424300454647\", \"0x0051525300555657\"],\n    \"XMM3\": [\"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 16]\nmovapd xmm2, [rdx]\nmovapd xmm3, [rdx + 16]\n\npsrld xmm0, 32\npsrld xmm1, 16\npsrld xmm2, 8\npsrld xmm3, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/13_66_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x0000616200006566\", \"0x0000717200007576\"],\n    \"XMM2\": [\"0x0041424300454647\", \"0x0051525300555657\"],\n    \"XMM3\": [\"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\"],\n    \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8000800080008000\nmov [rdx + 8 * 4], rax\nmov rax, 0x7000700070007000\nmov [rdx + 8 * 5], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 16]\nmovapd xmm2, [rdx]\nmovapd xmm3, [rdx + 16]\nmovapd xmm4, [rdx + 32]\n\npsrad xmm0, 32\npsrad xmm1, 16\npsrad xmm2, 8\npsrad xmm3, 1\npsrad xmm4, 32\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/13_66_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x6364000067680000\", \"0x7374000077780000\"],\n    \"XMM2\": [\"0x4243440046474800\", \"0x5253540056575800\"],\n    \"XMM3\": [\"0xC2C4C6C8CACCCED0\", \"0xE2E4E6E8EAECEEF0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 16]\nmovapd xmm2, [rdx]\nmovapd xmm3, [rdx + 16]\n\npslld xmm0, 32\npslld xmm1, 16\npslld xmm2, 8\npslld xmm3, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/14_66_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000041424344\", \"0x0000000051525354\"],\n    \"XMM1\": [\"0x0000616263646566\", \"0x0000717273747576\"],\n    \"XMM2\": [\"0x0041424344454647\", \"0x0051525354555657\"],\n    \"XMM3\": [\"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 16]\nmovapd xmm2, [rdx]\nmovapd xmm3, [rdx + 16]\n\npsrlq xmm0, 32\npsrlq xmm1, 16\npsrlq xmm2, 8\npsrlq xmm3, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/14_66_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4546474800000000\", \"0x5556575800000000\"],\n    \"XMM1\": [\"0x6364656667680000\", \"0x7374757677780000\"],\n    \"XMM2\": [\"0x4243444546474800\", \"0x5253545556575800\"],\n    \"XMM3\": [\"0xC2C4C6C8CACCCED0\", \"0xE2E4E6E8EAECEEF0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 16]\nmovapd xmm2, [rdx]\nmovapd xmm3, [rdx + 16]\n\npsllq xmm0, 32\npsllq xmm1, 16\npsllq xmm2, 8\npsllq xmm3, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/14_66_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x0000000000000000\", \"0x6162636465666768\"],\n    \"XMM2\": [\"0x4546474800000000\", \"0x5556575841424344\"],\n    \"XMM3\": [\"0x6263646566676800\", \"0x7273747576777861\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmovapd xmm1, [rdx + 16]\nmovapd xmm2, [rdx]\nmovapd xmm3, [rdx + 16]\n\npslldq xmm0, 16\npslldq xmm1, 8\npslldq xmm2, 4\npslldq xmm3, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/14_XX_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": [\"0x0000000041424344\"],\n    \"MM1\": [\"0x0000515253545556\"],\n    \"MM2\": [\"0x0061626364656667\"],\n    \"MM3\": [\"0x38B939BA3ABB3BBC\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\nmovq mm1, [rdx + 8]\nmovq mm2, [rdx + 16]\nmovq mm3, [rdx + 24]\n\npsrlq mm0, 32\npsrlq mm1, 16\npsrlq mm2, 8\npsrlq mm3, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/15_F3_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000434445464748\",\n    \"RBX\": \"0x0000000045464748\",\n    \"RCX\": \"0x0000434445464748\"\n  }\n}\n%endif\n\n; Save FS\nrdfsbase rax\nmov [rel .data_backup], rax\n\nmov rax, 0x0000434445464748\nmov rbx, -1\nmov rcx, -1\n\nwrfsbase rax\nrdfsbase ebx ; 32bit\nrdfsbase rcx ; 64bit\n\n; Restore FS\nmov rdx, [rel .data_backup]\nwrfsbase rdx\n\nhlt\n\nalign 4096\n.data_backup:\ndq 0\n"
  },
  {
    "path": "unittests/ASM/Secondary/15_F3_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000434445464748\",\n    \"RBX\": \"0x0000000045464748\",\n    \"RCX\": \"0x0000434445464748\"\n  }\n}\n%endif\n\nmov rax, 0x0000434445464748\nmov rbx, -1\nmov rcx, -1\n\nwrgsbase rax\nrdgsbase ebx ; 32bit\nrdgsbase rcx ; 64bit\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/15_F3_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\"\n  }\n}\n%endif\n\n; Save FS\nrdfsbase rax\nmov [rel .data_backup], rax\n\nmov rdx, 0xe0000000\nwrfsbase rdx\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\n\nmov rax, -1\nmov rax, qword [fs:0]\n\n; Restore FS\nmov rbx, [rel .data_backup]\nwrfsbase rbx\n\nhlt\n\nalign 4096\n.data_backup:\ndq 0\n"
  },
  {
    "path": "unittests/ASM/Secondary/15_F3_02_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000434445464748\",\n    \"RBX\": \"0x00000000FFFFFFFF\"\n  }\n}\n%endif\n\n; Save FS\nrdfsbase rax\nmov [rel .data_backup], rax\n\nmov rax, 0x0000434445464748\nmov rbx, -1\n\n; Ensure that wrfsbase of 32-bit will zero extend\nwrfsbase rax\nwrfsbase ebx\nrdfsbase rbx ; 64bit\n\n; Restore FS\nmov rcx, [rel .data_backup]\nwrfsbase rcx\n\nhlt\n\nalign 4096\n.data_backup:\ndq 0\n"
  },
  {
    "path": "unittests/ASM/Secondary/15_F3_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\nwrgsbase rdx\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\n\nmov rax, -1\nmov rax, qword [gs:0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/15_F3_03_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000434445464748\",\n    \"RBX\": \"0x00000000FFFFFFFF\"\n  }\n}\n%endif\n\nmov rax, 0x0000434445464748\nmov rbx, -1\n\n; Ensure that wrfsbase of 32-bit will zero extend\nwrgsbase rax\nwrgsbase ebx\nrdgsbase rbx ; 64bit\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/15_XX_0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1111111111111111\",\n    \"RBX\": \"0x2222222222222222\",\n    \"RCX\": \"0x3333333333333333\",\n    \"RDX\": \"0x4444444444444444\",\n    \"RSI\": \"0x5555555555555555\",\n    \"RDI\": \"0x6666666666666666\",\n    \"MM0\": \"0x1112131415161718\",\n    \"MM1\": \"0x2122232425262728\",\n    \"MM2\": \"0x3132333435363738\",\n    \"MM3\": \"0x4142434445464748\",\n    \"MM4\": \"0x5152535455565758\",\n    \"MM5\": \"0x6162636465666768\",\n    \"MM6\": \"0x7172737475767778\",\n    \"MM7\": \"0x8182838485868788\",\n    \"XMM0\":  [\"0x1112131415161718\", \"0x0\"],\n    \"XMM1\":  [\"0x2122232425262728\", \"0x0\"],\n    \"XMM2\":  [\"0x3132333435363738\", \"0x0\"],\n    \"XMM3\":  [\"0x4142434445464748\", \"0x0\"],\n    \"XMM4\":  [\"0x5152535455565758\", \"0x0\"],\n    \"XMM5\":  [\"0x6162636465666768\", \"0x0\"],\n    \"XMM6\":  [\"0x7172737475767778\", \"0x0\"],\n    \"XMM7\":  [\"0x8182838485868788\", \"0x0\"],\n    \"XMM8\":  [\"0xccc2c3c4c5c6c7c8\", \"0x0\"],\n    \"XMM9\":  [\"0xa1aaa3a4a5a6a7a8\", \"0x0\"],\n    \"XMM10\": [\"0xf1f2fff4f5f6f7f8\", \"0x0\"],\n    \"XMM11\": [\"0xe1e2e3eee5e6e7e8\", \"0x0\"],\n    \"XMM12\": [\"0xd1d2d3d4ddd6d7d8\", \"0x0\"],\n    \"XMM13\": [\"0xc1c2c3c4c5ccc7c8\", \"0x0\"],\n    \"XMM14\": [\"0xb1b2b3b4b5b6bbb8\", \"0x0\"],\n    \"XMM15\": [\"0xa1a2a3a4a5a6a7aa\", \"0x0\"]\n  }\n}\n%endif\n\nmov rsp, 0xe0000000\n\n; Set up MMX state\nmov rax, 0x1112131415161718\nmovd mm0, rax\nmov rax, 0x2122232425262728\nmovd mm1, rax\nmov rax, 0x3132333435363738\nmovd mm2, rax\nmov rax, 0x4142434445464748\nmovd mm3, rax\nmov rax, 0x5152535455565758\nmovd mm4, rax\nmov rax, 0x6162636465666768\nmovd mm5, rax\nmov rax, 0x7172737475767778\nmovd mm6, rax\nmov rax, 0x8182838485868788\nmovd mm7, rax\n\n; Setup XMM state\nmov rax, 0x1112131415161718\nmovq xmm0, rax\nmov rax, 0x2122232425262728\nmovq xmm1, rax\nmov rax, 0x3132333435363738\nmovq xmm2, rax\nmov rax, 0x4142434445464748\nmovq xmm3, rax\nmov rax, 0x5152535455565758\nmovq xmm4, rax\nmov rax, 0x6162636465666768\nmovq xmm5, rax\nmov rax, 0x7172737475767778\nmovq xmm6, rax\nmov rax, 0x8182838485868788\nmovq xmm7, rax\nmov rax, 0xccc2c3c4c5c6c7c8\nmovq xmm8, rax\nmov rax, 0xa1aaa3a4a5a6a7a8\nmovq xmm9, rax\nmov rax, 0xf1f2fff4f5f6f7f8\nmovq xmm10, rax\nmov rax, 0xe1e2e3eee5e6e7e8\nmovq xmm11, rax\nmov rax, 0xd1d2d3d4ddd6d7d8\nmovq xmm12, rax\nmov rax, 0xc1c2c3c4c5ccc7c8\nmovq xmm13, rax\nmov rax, 0xb1b2b3b4b5b6bbb8\nmovq xmm14, rax\nmov rax, 0xa1a2a3a4a5a6a7aa\nmovq xmm15, rax\n\n; Corrupt state and see what it stores\nmov eax, 0x41424344\n\n; Overwrite header\nmov dword [rsp + 0], eax\n; Overwrite the mm state\nmov rax, -1\nmov qword [rsp + 32 + 8 * 0], rax\nmov qword [rsp + 32 + 8 * 1], rax\nmov qword [rsp + 32 + 8 * 2], rax\nmov qword [rsp + 32 + 8 * 3], rax\nmov qword [rsp + 32 + 8 * 4], rax\nmov qword [rsp + 32 + 8 * 5], rax\nmov qword [rsp + 32 + 8 * 6], rax\nmov qword [rsp + 32 + 8 * 7], rax\n\n; Overwrite the xmm state\nmov qword [rsp + 160 + 8 * 0], rax\nmov qword [rsp + 160 + 8 * 1], rax\nmov qword [rsp + 160 + 8 * 2], rax\nmov qword [rsp + 160 + 8 * 3], rax\nmov qword [rsp + 160 + 8 * 4], rax\nmov qword [rsp + 160 + 8 * 5], rax\nmov qword [rsp + 160 + 8 * 6], rax\nmov qword [rsp + 160 + 8 * 7], rax\nmov qword [rsp + 160 + 8 * 8], rax\nmov qword [rsp + 160 + 8 * 9], rax\nmov qword [rsp + 160 + 8 * 10], rax\nmov qword [rsp + 160 + 8 * 11], rax\nmov qword [rsp + 160 + 8 * 12], rax\nmov qword [rsp + 160 + 8 * 13], rax\nmov qword [rsp + 160 + 8 * 14], rax\nmov qword [rsp + 160 + 8 * 15], rax\nmov qword [rsp + 160 + 8 * 16], rax\nmov qword [rsp + 160 + 8 * 17], rax\nmov qword [rsp + 160 + 8 * 18], rax\nmov qword [rsp + 160 + 8 * 19], rax\nmov qword [rsp + 160 + 8 * 20], rax\nmov qword [rsp + 160 + 8 * 21], rax\nmov qword [rsp + 160 + 8 * 22], rax\nmov qword [rsp + 160 + 8 * 23], rax\nmov qword [rsp + 160 + 8 * 24], rax\nmov qword [rsp + 160 + 8 * 25], rax\nmov qword [rsp + 160 + 8 * 26], rax\nmov qword [rsp + 160 + 8 * 27], rax\nmov qword [rsp + 160 + 8 * 28], rax\nmov qword [rsp + 160 + 8 * 29], rax\nmov qword [rsp + 160 + 8 * 30], rax\nmov qword [rsp + 160 + 8 * 31], rax\n\n; Overwrite the three reserved 16byte elements\nmov qword [rsp + 416 + 8 * 0], rax\nmov qword [rsp + 416 + 8 * 1], rax\nmov qword [rsp + 416 + 8 * 2], rax\nmov qword [rsp + 416 + 8 * 3], rax\nmov qword [rsp + 416 + 8 * 4], rax\nmov qword [rsp + 416 + 8 * 5], rax\n\n; Overwrite the three 16byte \"available\" slots\nmov rax, 0x1111111111111111\nmov qword [rsp + 464 + 8 * 0], rax\nmov rax, 0x2222222222222222\nmov qword [rsp + 464 + 8 * 1], rax\nmov rax, 0x3333333333333333\nmov qword [rsp + 464 + 8 * 2], rax\nmov rax, 0x4444444444444444\nmov qword [rsp + 464 + 8 * 3], rax\nmov rax, 0x5555555555555555\nmov qword [rsp + 464 + 8 * 4], rax\nmov rax, 0x6666666666666666\nmov qword [rsp + 464 + 8 * 5], rax\n\n; Now save our state\nfxsave [rsp]\n\n; Corrupt MMX And XMM state\nmov rax, -1\nmovd mm0, rax\nmovd mm1, rax\nmovd mm2, rax\nmovd mm3, rax\nmovd mm4, rax\nmovd mm5, rax\nmovd mm6, rax\nmovd mm7, rax\n\n; Setup XMM state\nmovq xmm0, rax\nmovq xmm1, rax\nmovq xmm2, rax\nmovq xmm3, rax\nmovq xmm4, rax\nmovq xmm5, rax\nmovq xmm6, rax\nmovq xmm7, rax\nmovq xmm8, rax\nmovq xmm9, rax\nmovq xmm10, rax\nmovq xmm11, rax\nmovq xmm12, rax\nmovq xmm13, rax\nmovq xmm14, rax\nmovq xmm15, rax\n\n; Now reload the state we just saved\nfxrstor [rsp]\n\n; Load the three 16bytes of \"available\" slots to make sure it wasn't overwritten\n; Reserved can be overwritten regardless\nmov rax, qword [rsp + 464 + 8 * 0]\nmov rbx, qword [rsp + 464 + 8 * 1]\nmov rcx, qword [rsp + 464 + 8 * 2]\nmov rdx, qword [rsp + 464 + 8 * 3]\nmov rsi, qword [rsp + 464 + 8 * 4]\nmov rdi, qword [rsp + 464 + 8 * 5]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/15_XX_5.asm",
    "content": "%ifdef CONFIG\n{\n}\n%endif\n\n; Just to ensure execution\nlfence\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/15_XX_6.asm",
    "content": "%ifdef CONFIG\n{\n}\n%endif\n\n; Just to ensure execution\nmfence\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/15_XX_7.asm",
    "content": "%ifdef CONFIG\n{\n}\n%endif\n\n; Just to ensure execution\nsfence\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/15_XX_7_2.asm",
    "content": "%ifdef CONFIG\n{\n}\n%endif\n\nmov rdx, 0xe0000000\nclflush [rdx]\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/CLFLUSHOPT.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"HostFeatures\": [\"CLFLOPT\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n; Just ensures the code is executed.\nclflushopt [rdx]\n\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/CLWB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"HostFeatures\": [\"CLWB\"]\n}\n%endif\n\nmov rdx, 0xe0000000\n; Just ensures the code is executed.\nclwb [rdx]\n\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/Prefetch.asm",
    "content": "%ifdef CONFIG\n{\n}\n%endif\n\n; Arg 1 = type\n; Arg 2 = Reg\n%macro prefetch 2\n  prefetch%1 [%2]\n%endmacro\n\n; Arg1 = prefix\n; Arg2 = Reg\n%macro prefetch_pre 2\n  db %1\n  prefetch nta, %2\n  db %1\n  prefetch t0, %2\n  db %1\n  prefetch t1, %2\n  db %1\n  prefetch t2, %2\n%endmacro\n\n; Arg 1 = modrm encoding\n; Always uses rax\n%macro prefetch_res 1\n  db 0x0F\n  db 0x18\n  db %1\n%endmacro\n\n; Arg 1 = prefix\n; Arg 2 = modrm encoding\n%macro prefetch_res_pre 2\n  db %1\n  prefetch_res %2\n%endmacro\n\n; Arg 1 = modrm encoding\n; Always uses rax\n%macro prefetch_resw 1\n  db 0x0F\n  db 0x0D\n  db %1\n%endmacro\n\n; Arg 1 = prefix\n; Arg 2 = modrm encoding\n%macro prefetch_resw_pre 2\n  db %1\n  prefetch_resw %2\n%endmacro\n\nmov rax, 0xe0000000\n\nprefetch nta, rax\nprefetch t0, rax\nprefetch t1, rax\nprefetch t2, rax\n\nprefetch_pre 0x66, rax\nprefetch_pre 0x66, rax\nprefetch_pre 0x66, rax\nprefetch_pre 0x66, rax\n\nprefetch_pre 0xF2, rax\nprefetch_pre 0xF2, rax\nprefetch_pre 0xF2, rax\nprefetch_pre 0xF2, rax\n\nprefetch_pre 0xF3, rax\nprefetch_pre 0xF3, rax\nprefetch_pre 0xF3, rax\nprefetch_pre 0xF3, rax\n\nprefetch_res (0 << 3)\nprefetch_res (1 << 3)\nprefetch_res (2 << 3)\nprefetch_res (3 << 3)\nprefetch_res (4 << 3)\nprefetch_res (5 << 3)\nprefetch_res (6 << 3)\nprefetch_res (7 << 3)\n\nprefetch_res_pre 0x66, (0 << 3)\nprefetch_res_pre 0x66, (1 << 3)\nprefetch_res_pre 0x66, (2 << 3)\nprefetch_res_pre 0x66, (3 << 3)\nprefetch_res_pre 0x66, (4 << 3)\nprefetch_res_pre 0x66, (5 << 3)\nprefetch_res_pre 0x66, (6 << 3)\nprefetch_res_pre 0x66, (7 << 3)\n\nprefetch_res_pre 0xF2, (0 << 3)\nprefetch_res_pre 0xF2, (1 << 3)\nprefetch_res_pre 0xF2, (2 << 3)\nprefetch_res_pre 0xF2, (3 << 3)\nprefetch_res_pre 0xF2, (4 << 3)\nprefetch_res_pre 0xF2, (5 << 3)\nprefetch_res_pre 0xF2, (6 << 3)\nprefetch_res_pre 0xF2, (7 << 3)\n\nprefetch_res_pre 0xF3, (0 << 3)\nprefetch_res_pre 0xF3, (1 << 3)\nprefetch_res_pre 0xF3, (2 << 3)\nprefetch_res_pre 0xF3, (3 << 3)\nprefetch_res_pre 0xF3, (4 << 3)\nprefetch_res_pre 0xF3, (5 << 3)\nprefetch_res_pre 0xF3, (6 << 3)\nprefetch_res_pre 0xF3, (7 << 3)\n\n\nprefetch_resw (0 << 3)\nprefetch_resw (1 << 3)\nprefetch_resw (2 << 3)\nprefetch_resw (3 << 3)\nprefetch_resw (4 << 3)\nprefetch_resw (5 << 3)\nprefetch_resw (6 << 3)\nprefetch_resw (7 << 3)\n\nprefetch_resw_pre 0x66, (0 << 3)\nprefetch_resw_pre 0x66, (1 << 3)\nprefetch_resw_pre 0x66, (2 << 3)\nprefetch_resw_pre 0x66, (3 << 3)\nprefetch_resw_pre 0x66, (4 << 3)\nprefetch_resw_pre 0x66, (5 << 3)\nprefetch_resw_pre 0x66, (6 << 3)\nprefetch_resw_pre 0x66, (7 << 3)\n\nprefetch_resw_pre 0xF2, (0 << 3)\nprefetch_resw_pre 0xF2, (1 << 3)\nprefetch_resw_pre 0xF2, (2 << 3)\nprefetch_resw_pre 0xF2, (3 << 3)\nprefetch_resw_pre 0xF2, (4 << 3)\nprefetch_resw_pre 0xF2, (5 << 3)\nprefetch_resw_pre 0xF2, (6 << 3)\nprefetch_resw_pre 0xF2, (7 << 3)\n\nprefetch_resw_pre 0xF3, (0 << 3)\nprefetch_resw_pre 0xF3, (1 << 3)\nprefetch_resw_pre 0xF3, (2 << 3)\nprefetch_resw_pre 0xF3, (3 << 3)\nprefetch_resw_pre 0xF3, (4 << 3)\nprefetch_resw_pre 0xF3, (5 << 3)\nprefetch_resw_pre 0xF3, (6 << 3)\nprefetch_resw_pre 0xF3, (7 << 3)\n\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/Secondary/shufps_optimization.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x4054c664c2f837b5\", \"0x4044836d86ec17ec\"],\n    \"XMM1\":  [\"0x402a1e1c58255b03\", \"0x4035fe425aee6320\"],\n    \"XMM2\":  [\"0x401568e0c9d9d346\", \"0x40154b7d41743e96\"],\n    \"XMM3\":  [\"0x40154b7d41743e96\", \"0x403d075a31a4bdba\"],\n    \"XMM4\":  [\"0xbd66277c31a4bdba\", \"0x4ea4a8c17ebaf102\"],\n    \"XMM5\":  [\"0x4056d74040334ec1\", \"0x40497b13404439b5\"],\n    \"XMM6\":  [\"0x404439b5404439b5\", \"0x4037f9ca18bd6627\"],\n    \"XMM7\":  [\"0x4037f9ca4037f9ca\", \"0x403839b866e43aa8\"],\n    \"XMM8\":  [\"0x403839b8403839b8\", \"0x4058bc1f212d7732\"],\n    \"XMM9\":  [\"0x4058bc1f212d7732\", \"0xa10e0221a10e0221\"],\n    \"XMM10\": [\"0x4058defb00bcbe62\", \"0x9eecbfb19eecbfb1\"],\n    \"XMM11\": [\"0x40503e3c4052997f\", \"0x40395a6bf8769ec3\"],\n    \"XMM12\": [\"0x40419d2240395a6b\", \"0x40177e28240b7803\"],\n    \"XMM13\": [\"0x240b780340177e28\", \"0x404a03c74fb549f9\"],\n    \"XMM14\": [\"0x9f16b11c40408402\", \"0x404d31595feda661\"],\n    \"XMM15\": [\"0x5feda6615feda661\", \"0x7aa25d8d7aa25d8d\"]\n  }\n}\n%endif\n\nmovaps xmm0, [rel .data + 16 * 0]\nmovaps xmm1, [rel .data + 16 * 1]\n\nmovaps xmm2, [rel .data + 16 * 2]\nmovaps xmm3, [rel .data + 16 * 3]\n\nmovaps xmm4, [rel .data + 16 * 4]\nmovaps xmm5, [rel .data + 16 * 5]\n\nmovaps xmm6, [rel .data + 16 * 6]\nmovaps xmm7, [rel .data + 16 * 7]\n\nmovaps xmm8, [rel .data + 16 * 8]\nmovaps xmm9, [rel .data + 16 * 9]\n\nmovaps xmm10, [rel .data + 16 * 10]\nmovaps xmm11, [rel .data + 16 * 11]\n\nmovaps xmm12, [rel .data + 16 * 12]\nmovaps xmm13, [rel .data + 16 * 13]\n\nmovaps xmm14, [rel .data + 16 * 14]\nmovaps xmm15, [rel .data + 16 * 15]\n\nshufps xmm0, xmm1, 01000100b\nshufps xmm1, xmm2, 11101110b\nshufps xmm2, xmm3, 11100100b\nshufps xmm3, xmm4, 01001110b\nshufps xmm4, xmm5, 10001000b\nshufps xmm5, xmm6, 11011101b\nshufps xmm6, xmm7, 11100101b\nshufps xmm7, xmm8, 11101111b\nshufps xmm8, xmm9, 01001111b\nshufps xmm9, xmm10, 00000100b\nshufps xmm10, xmm11, 00001110b\nshufps xmm11, xmm12, 11100111b\nshufps xmm12, xmm13, 01000111b\nshufps xmm13, xmm14, 11100001b\nshufps xmm14, xmm15, 01000001b\nshufps xmm15, [rel .data + 16 * 16], 0\n\nhlt\n\nalign 16\n; 512bytes of random data\n.data:\ndq 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/Secondary/shufps_optimization_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xc2f837b5c2f837b5\", \"0x7aa25d8d7aa25d8d\"],\n    \"XMM1\":  [\"0x4044836d86ec17ec\", \"0x4054c664c2f837b5\"],\n    \"XMM2\":  [\"0x4035fe425aee6320\", \"0x4054c664c2f837b5\"],\n    \"XMM3\":  [\"0x402359003eea209b\", \"0x4054c664c2f837b5\"],\n    \"XMM4\":  [\"0x4050a018bd66277c\", \"0x402359003eea209b\"],\n    \"XMM5\":  [\"0x4ea4a8c17ebaf102\", \"0x3eea209bbd66277c\"],\n    \"XMM6\":  [\"0x40497b13404439b5\", \"0x3eea209b4ea4a8c1\"],\n    \"XMM7\":  [\"0x4040528b4040528b\", \"0x3eea209b4ea4a8c1\"],\n    \"XMM8\":  [\"0x403839b8403839b8\", \"0x3eea209b4ea4a8c1\"],\n    \"XMM9\":  [\"0x4056cde54056cde5\", \"0x403839b8403839b8\"],\n    \"XMM10\": [\"0x4056b34aa10e0221\", \"0x4056cde54056cde5\"],\n    \"XMM11\": [\"0x4052997f0ed3d85a\", \"0xa10e0221a10e0221\"],\n    \"XMM12\": [\"0x40419d2240395a6b\", \"0xa10e0221a10e0221\"],\n    \"XMM13\": [\"0x40177e2840568cc5\", \"0x40419d2240395a6b\"],\n    \"XMM14\": [\"0x9f16b11c40408402\", \"0x40419d2240395a6b\"],\n    \"XMM15\": [\"0x5feda661404d3159\", \"0x9f16b11c40408402\"]\n  }\n}\n%endif\n\nmovaps xmm0, [rel .data + 16 * 0]\nmovaps xmm1, [rel .data + 16 * 1]\n\nmovaps xmm2, [rel .data + 16 * 2]\nmovaps xmm3, [rel .data + 16 * 3]\n\nmovaps xmm4, [rel .data + 16 * 4]\nmovaps xmm5, [rel .data + 16 * 5]\n\nmovaps xmm6, [rel .data + 16 * 6]\nmovaps xmm7, [rel .data + 16 * 7]\n\nmovaps xmm8, [rel .data + 16 * 8]\nmovaps xmm9, [rel .data + 16 * 9]\n\nmovaps xmm10, [rel .data + 16 * 10]\nmovaps xmm11, [rel .data + 16 * 11]\n\nmovaps xmm12, [rel .data + 16 * 12]\nmovaps xmm13, [rel .data + 16 * 13]\n\nmovaps xmm14, [rel .data + 16 * 14]\nmovaps xmm15, [rel .data + 16 * 15]\n\n; Test inverted sources from shufps_optimization.asm\nshufps xmm1, xmm0, 01000100b\nshufps xmm0, [rel .data + 16 * 16], 0\nshufps xmm2, xmm1, 11101110b\nshufps xmm3, xmm2, 11100100b\nshufps xmm4, xmm3, 01001110b\nshufps xmm5, xmm4, 10001000b\nshufps xmm6, xmm5, 11011101b\nshufps xmm7, xmm6, 11100101b\nshufps xmm8, xmm7, 11101111b\nshufps xmm9, xmm8, 01001111b\nshufps xmm10, xmm9, 00000100b\nshufps xmm11, xmm10, 00001110b\nshufps xmm12, xmm11, 11100111b\nshufps xmm13, xmm12, 01000111b\nshufps xmm14, xmm13, 11100001b\nshufps xmm15, xmm14, 01000001b\n\nhlt\n\nalign 16\n; 512bytes of random data\n.data:\ndq 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/Secondary/xsave/xsave.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1111111111111111\",\n    \"RBX\": \"0x2222222222222222\",\n    \"RCX\": \"0x3333333333333333\",\n    \"RDX\": \"0x4444444444444444\",\n    \"RSI\": \"0x5555555555555555\",\n    \"RDI\": \"0x6666666666666666\",\n    \"MM0\": \"0x1112131415161718\",\n    \"MM1\": \"0x2122232425262728\",\n    \"MM2\": \"0x3132333435363738\",\n    \"MM3\": \"0x4142434445464748\",\n    \"MM4\": \"0x5152535455565758\",\n    \"MM5\": \"0x6162636465666768\",\n    \"MM6\": \"0x7172737475767778\",\n    \"MM7\": \"0x8182838485868788\",\n    \"XMM0\":  [\"0x1112131415161718\", \"0xABFDEC3402932039\"],\n    \"XMM1\":  [\"0x2122232425262728\", \"0xDEFCA93847392992\"],\n    \"XMM2\":  [\"0x3132333435363738\", \"0xEADC3284ADCE9339\"],\n    \"XMM3\":  [\"0x4142434445464748\", \"0x3987432929293847\"],\n    \"XMM4\":  [\"0x5152535455565758\", \"0x3764583402983799\"],\n    \"XMM5\":  [\"0x6162636465666768\", \"0xACDEFACDEFACDEFA\"],\n    \"XMM6\":  [\"0x7172737475767778\", \"0x3459238471238023\"],\n    \"XMM7\":  [\"0x8182838485868788\", \"0x9347239480289299\"],\n    \"XMM8\":  [\"0xCCC2C3C4C5C6C7C8\", \"0x3949232903428479\"],\n    \"XMM9\":  [\"0xA1AAA3A4A5A6A7A8\", \"0x3784769228479192\"],\n    \"XMM10\": [\"0xF1F2FFF4F5F6F7F8\", \"0x758734629799389A\"],\n    \"XMM11\": [\"0xE1E2E3EEE5E6E7E8\", \"0x3756438328472389\"],\n    \"XMM12\": [\"0xD1D2D3D4DDD6D7D8\", \"0x3674823989ADEF73\"],\n    \"XMM13\": [\"0xC1C2C3C4C5CCC7C8\", \"0xABCDEF3894335820\"],\n    \"XMM14\": [\"0xB1B2B3B4B5B6BBB8\", \"0xADEADE3894353499\"],\n    \"XMM15\": [\"0xA1A2A3A4A5A6A7AA\", \"0xABFD392482039840\"]\n  },\n  \"HostFeatures\": [\"XSAVE\"]\n}\n%endif\n\n%include \"xsave_macros.mac\"\n\nmov rsp, 0xE0000000\n\n; Set up MMX and XMM state\nset_up_mmx_state .xmm_data\nset_up_xmm_state .xmm_data\n\noverwrite_fxsave_slots\n\n; Now save our state (X87 and SSE only)\nmov eax, 0b011\nxsave [rsp]\n\n; Corrupt MMX And XMM state\ncorrupt_mmx_and_xmm_registers\n\n; Now reload the state we just saved\nxrstor [rsp]\n\n; Load the three 16bytes of \"available\" slots to make sure it wasn't overwritten\n; Reserved can be overwritten regardless\nload_fxsave_slots\n\nhlt\n\n; Give ourselves a region of 1000 bytes set to 0xFF\nalign 64\n.xsave_data:\n  times 1000 db 0xFF\n\ndefine_xmm_data_section\n"
  },
  {
    "path": "unittests/ASM/Secondary/xsave/xsave_avx.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x1111111111111111\",\n    \"RBX\": \"0x2222222222222222\",\n    \"RCX\": \"0x3333333333333333\",\n    \"RDX\": \"0x4444444444444444\",\n    \"RSI\": \"0x5555555555555555\",\n    \"RDI\": \"0x6666666666666666\",\n    \"MM0\": \"0x1112131415161718\",\n    \"MM1\": \"0x2122232425262728\",\n    \"MM2\": \"0x3132333435363738\",\n    \"MM3\": \"0x4142434445464748\",\n    \"MM4\": \"0x5152535455565758\",\n    \"MM5\": \"0x6162636465666768\",\n    \"MM6\": \"0x7172737475767778\",\n    \"MM7\": \"0x8182838485868788\",\n    \"XMM0\":  [\"0x1112131415161718\", \"0xABFDEC3402932039\", \"0xA1A2A3A4A5A6A7AA\", \"0xABFD392482039840\"],\n    \"XMM1\":  [\"0x2122232425262728\", \"0xDEFCA93847392992\", \"0x4142434445464748\", \"0x3987432929293847\"],\n    \"XMM2\":  [\"0x3132333435363738\", \"0xEADC3284ADCE9339\", \"0x6162636465666768\", \"0xACDEFACDEFACDEFA\"],\n    \"XMM3\":  [\"0x4142434445464748\", \"0x3987432929293847\", \"0x3132333435363738\", \"0xEADC3284ADCE9339\"],\n    \"XMM4\":  [\"0x5152535455565758\", \"0x3764583402983799\", \"0x7172737475767778\", \"0x3459238471238023\"],\n    \"XMM5\":  [\"0x6162636465666768\", \"0xACDEFACDEFACDEFA\", \"0xA1AAA3A4A5A6A7A8\", \"0x3784769228479192\"],\n    \"XMM6\":  [\"0x7172737475767778\", \"0x3459238471238023\", \"0x6162636465666768\", \"0xACDEFACDEFACDEFA\"],\n    \"XMM7\":  [\"0x8182838485868788\", \"0x9347239480289299\", \"0x6162636465666768\", \"0xACDEFACDEFACDEFA\"],\n    \"XMM8\":  [\"0xCCC2C3C4C5C6C7C8\", \"0x3949232903428479\", \"0xD1D2D3D4DDD6D7D8\", \"0x3674823989ADEF73\"],\n    \"XMM9\":  [\"0xA1AAA3A4A5A6A7A8\", \"0x3784769228479192\", \"0xB1B2B3B4B5B6BBB8\", \"0xADEADE3894353499\"],\n    \"XMM10\": [\"0xF1F2FFF4F5F6F7F8\", \"0x758734629799389A\", \"0xD1D2D3D4DDD6D7D8\", \"0x3674823989ADEF73\"],\n    \"XMM11\": [\"0xE1E2E3EEE5E6E7E8\", \"0x3756438328472389\", \"0xB1B2B3B4B5B6BBB8\", \"0xADEADE3894353499\"],\n    \"XMM12\": [\"0xD1D2D3D4DDD6D7D8\", \"0x3674823989ADEF73\", \"0xA1AAA3A4A5A6A7A8\", \"0x3784769228479192\"],\n    \"XMM13\": [\"0xC1C2C3C4C5CCC7C8\", \"0xABCDEF3894335820\", \"0x6162636465666768\", \"0xACDEFACDEFACDEFA\"],\n    \"XMM14\": [\"0xB1B2B3B4B5B6BBB8\", \"0xADEADE3894353499\", \"0xE1E2E3EEE5E6E7E8\", \"0x3756438328472389\"],\n    \"XMM15\": [\"0xA1A2A3A4A5A6A7AA\", \"0xABFD392482039840\", \"0xB1B2B3B4B5B6BBB8\", \"0xADEADE3894353499\"]\n  }\n}\n%endif\n\n%define IS_AVX\n%include \"xsave_macros.mac\"\n\nmov rsp, 0xE0000000\n\n; Set up MMX and XMM state\nset_up_mmx_state .xmm_data\nset_up_xmm_state .xmm_data\n\noverwrite_fxsave_slots\n\n; Now save our state (X87, SSE, and AVX only)\nmov eax, 0b111\nxsave [rsp]\n\n; Corrupt MMX And XMM state\ncorrupt_mmx_and_xmm_registers\n\n; Now reload the state we just saved\nxrstor [rsp]\n\n; Load the three 16bytes of \"available\" slots to make sure it wasn't overwritten\n; Reserved can be overwritten regardless\nload_fxsave_slots\n\nhlt\n\n; Give ourselves a region of 1000 bytes set to 0xFF\nalign 64\n.xsave_data:\n  times 1000 db 0xFF\n\ndefine_xmm_data_section\n"
  },
  {
    "path": "unittests/ASM/Secondary/xsave/xsave_avx_x87.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x1111111111111111\",\n    \"RBX\": \"0x2222222222222222\",\n    \"RCX\": \"0x3333333333333333\",\n    \"RDX\": \"0x4444444444444444\",\n    \"RSI\": \"0x5555555555555555\",\n    \"RDI\": \"0x6666666666666666\",\n    \"MM0\": \"0x1112131415161718\",\n    \"MM1\": \"0x2122232425262728\",\n    \"MM2\": \"0x3132333435363738\",\n    \"MM3\": \"0x4142434445464748\",\n    \"MM4\": \"0x5152535455565758\",\n    \"MM5\": \"0x6162636465666768\",\n    \"MM6\": \"0x7172737475767778\",\n    \"MM7\": \"0x8182838485868788\",\n    \"XMM0\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0xA1A2A3A4A5A6A7AA\", \"0xABFD392482039840\"],\n    \"XMM1\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x4142434445464748\", \"0x3987432929293847\"],\n    \"XMM2\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x6162636465666768\", \"0xACDEFACDEFACDEFA\"],\n    \"XMM3\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x3132333435363738\", \"0xEADC3284ADCE9339\"],\n    \"XMM4\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x7172737475767778\", \"0x3459238471238023\"],\n    \"XMM5\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0xA1AAA3A4A5A6A7A8\", \"0x3784769228479192\"],\n    \"XMM6\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x6162636465666768\", \"0xACDEFACDEFACDEFA\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x6162636465666768\", \"0xACDEFACDEFACDEFA\"],\n    \"XMM8\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0xD1D2D3D4DDD6D7D8\", \"0x3674823989ADEF73\"],\n    \"XMM9\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0xB1B2B3B4B5B6BBB8\", \"0xADEADE3894353499\"],\n    \"XMM10\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0xD1D2D3D4DDD6D7D8\", \"0x3674823989ADEF73\"],\n    \"XMM11\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0xB1B2B3B4B5B6BBB8\", \"0xADEADE3894353499\"],\n    \"XMM12\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0xA1AAA3A4A5A6A7A8\", \"0x3784769228479192\"],\n    \"XMM13\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x6162636465666768\", \"0xACDEFACDEFACDEFA\"],\n    \"XMM14\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0xE1E2E3EEE5E6E7E8\", \"0x3756438328472389\"],\n    \"XMM15\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0xB1B2B3B4B5B6BBB8\", \"0xADEADE3894353499\"]\n  }\n}\n%endif\n\n%define IS_AVX\n%include \"xsave_macros.mac\"\n\nmov rsp, 0xE0000000\n\n; Set up MMX and XMM state\nset_up_mmx_state .xmm_data\nset_up_xmm_state .xmm_data\n\noverwrite_fxsave_slots\n\n; Now save our state (X87 and AVX only)\nmov eax, 0b101\nxsave [rsp]\n\n; Corrupt MMX And XMM state\ncorrupt_mmx_and_xmm_registers\n\n; Now reload the state we just saved\nxrstor [rsp]\n\n; Load the three 16bytes of \"available\" slots to make sure it wasn't overwritten\n; Reserved can be overwritten regardless\nload_fxsave_slots\n\nhlt\n\n; Give ourselves a region of 1000 bytes set to 0xFF\nalign 64\n.xsave_data:\n  times 1000 db 0xFF\n\ndefine_xmm_data_section\n"
  },
  {
    "path": "unittests/ASM/Secondary/xsave/xsave_sse.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1111111111111111\",\n    \"RBX\": \"0x2222222222222222\",\n    \"RCX\": \"0x3333333333333333\",\n    \"RDX\": \"0x4444444444444444\",\n    \"RSI\": \"0x5555555555555555\",\n    \"RDI\": \"0x6666666666666666\",\n    \"MM0\": \"0\",\n    \"MM1\": \"0\",\n    \"MM2\": \"0\",\n    \"MM3\": \"0\",\n    \"MM4\": \"0\",\n    \"MM5\": \"0\",\n    \"MM6\": \"0\",\n    \"MM7\": \"0\",\n    \"XMM0\":  [\"0x1112131415161718\", \"0xABFDEC3402932039\"],\n    \"XMM1\":  [\"0x2122232425262728\", \"0xDEFCA93847392992\"],\n    \"XMM2\":  [\"0x3132333435363738\", \"0xEADC3284ADCE9339\"],\n    \"XMM3\":  [\"0x4142434445464748\", \"0x3987432929293847\"],\n    \"XMM4\":  [\"0x5152535455565758\", \"0x3764583402983799\"],\n    \"XMM5\":  [\"0x6162636465666768\", \"0xACDEFACDEFACDEFA\"],\n    \"XMM6\":  [\"0x7172737475767778\", \"0x3459238471238023\"],\n    \"XMM7\":  [\"0x8182838485868788\", \"0x9347239480289299\"],\n    \"XMM8\":  [\"0xCCC2C3C4C5C6C7C8\", \"0x3949232903428479\"],\n    \"XMM9\":  [\"0xA1AAA3A4A5A6A7A8\", \"0x3784769228479192\"],\n    \"XMM10\": [\"0xF1F2FFF4F5F6F7F8\", \"0x758734629799389A\"],\n    \"XMM11\": [\"0xE1E2E3EEE5E6E7E8\", \"0x3756438328472389\"],\n    \"XMM12\": [\"0xD1D2D3D4DDD6D7D8\", \"0x3674823989ADEF73\"],\n    \"XMM13\": [\"0xC1C2C3C4C5CCC7C8\", \"0xABCDEF3894335820\"],\n    \"XMM14\": [\"0xB1B2B3B4B5B6BBB8\", \"0xADEADE3894353499\"],\n    \"XMM15\": [\"0xA1A2A3A4A5A6A7AA\", \"0xABFD392482039840\"]\n  },\n  \"HostFeatures\": [\"XSAVE\"]\n}\n%endif\n\n%include \"xsave_macros.mac\"\n\nmov rsp, 0xE0000000\n\n; Set up MMX and XMM state\nset_up_mmx_state .xmm_data\nset_up_xmm_state .xmm_data\n\noverwrite_fxsave_slots\n\n; Now save our state (SSE only)\nmov eax, 0b010\nxsave [rsp]\n\n; Corrupt MMX And XMM state\ncorrupt_mmx_and_xmm_registers\n\n; Now reload the state we just saved\nxrstor [rsp]\n\n; Load the three 16bytes of \"available\" slots to make sure it wasn't overwritten\n; Reserved can be overwritten regardless\nload_fxsave_slots\n\nhlt\n\n; Give ourselves a region of 1000 bytes set to 0xFF\nalign 64\n.xsave_data:\n  times 1000 db 0xFF\n\ndefine_xmm_data_section\n"
  },
  {
    "path": "unittests/ASM/Secondary/xsave/xsave_x87.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1111111111111111\",\n    \"RBX\": \"0x2222222222222222\",\n    \"RCX\": \"0x3333333333333333\",\n    \"RDX\": \"0x4444444444444444\",\n    \"RSI\": \"0x5555555555555555\",\n    \"RDI\": \"0x6666666666666666\",\n    \"MM0\": \"0x1112131415161718\",\n    \"MM1\": \"0x2122232425262728\",\n    \"MM2\": \"0x3132333435363738\",\n    \"MM3\": \"0x4142434445464748\",\n    \"MM4\": \"0x5152535455565758\",\n    \"MM5\": \"0x6162636465666768\",\n    \"MM6\": \"0x7172737475767778\",\n    \"MM7\": \"0x8182838485868788\",\n    \"XMM0\":  [\"0\", \"0\"],\n    \"XMM1\":  [\"0\", \"0\"],\n    \"XMM2\":  [\"0\", \"0\"],\n    \"XMM3\":  [\"0\", \"0\"],\n    \"XMM4\":  [\"0\", \"0\"],\n    \"XMM5\":  [\"0\", \"0\"],\n    \"XMM6\":  [\"0\", \"0\"],\n    \"XMM7\":  [\"0\", \"0\"],\n    \"XMM8\":  [\"0\", \"0\"],\n    \"XMM9\":  [\"0\", \"0\"],\n    \"XMM10\": [\"0\", \"0\"],\n    \"XMM11\": [\"0\", \"0\"],\n    \"XMM12\": [\"0\", \"0\"],\n    \"XMM13\": [\"0\", \"0\"],\n    \"XMM14\": [\"0\", \"0\"],\n    \"XMM15\": [\"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"XSAVE\"]\n}\n%endif\n\n%include \"xsave_macros.mac\"\n\nmov rsp, 0xE0000000\n\n; Set up MMX and XMM state\nset_up_mmx_state .xmm_data\nset_up_xmm_state .xmm_data\n\noverwrite_fxsave_slots\n\n; Now save our state (X87 only)\nmov eax, 0b001\nxsave [rsp]\n\n; Corrupt MMX And XMM state\ncorrupt_mmx_and_xmm_registers\n\n; Now reload the state we just saved\nxrstor [rsp]\n\n; Load the three 16bytes of \"available\" slots to make sure it wasn't overwritten\n; Reserved can be overwritten regardless\nload_fxsave_slots\n\nhlt\n\n; Give ourselves a region of 1000 bytes set to 0xFF\nalign 64\n.xsave_data:\n  times 1000 db 0xFF\n\ndefine_xmm_data_section\n"
  },
  {
    "path": "unittests/ASM/SecondaryModRM/Reg_2_0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3\",\n    \"RDX\": \"0x0\"\n  },\n  \"HostFeatures\": [\"XSAVE\"]\n}\n%endif\n\nmov ecx, 0\nxgetbv\n\n; Mask only the lower two bits to get host and FEX runners to match.\n; This way we can test that we're getting data back.\n; Bit 0 and 1 refer to X87 and SSE respectively.\nand eax, 0x3\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/SecondaryModRM/Reg_7_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"Linux\"]\n}\n%endif\n\n; We can't really check the results of this\n; Just ensure we execute it\nrdtscp\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/SecondaryModRM/Reg_7_4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x0\"\n  },\n  \"HostFeatures\": [\"CLZERO\"]\n}\n%endif\n\n; Starting address to store to\nmov rax, 0xe8000000\n\n; Set up the cacheline with garbage\nmov rbx, 0x4142434445464748\nmov [rax + 8 * 0], rbx\nmov [rax + 8 * 1], rbx\nmov [rax + 8 * 2], rbx\nmov [rax + 8 * 3], rbx\nmov [rax + 8 * 4], rbx\nmov [rax + 8 * 5], rbx\nmov [rax + 8 * 6], rbx\nmov [rax + 8 * 7], rbx\n\nclzero\n\nmov rbx, 0\n\nadd rbx, [rax + 8 * 0]\nadd rbx, [rax + 8 * 1]\nadd rbx, [rax + 8 * 2]\nadd rbx, [rax + 8 * 3]\nadd rbx, [rax + 8 * 4]\nadd rbx, [rax + 8 * 5]\nadd rbx, [rax + 8 * 6]\nadd rbx, [rax + 8 * 7]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/SecondaryModRM/Reg_7_4_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x0\",\n    \"RCX\": \"0x000000020A121A20\",\n    \"RDX\": \"0x0A121A2000000000\"\n  },\n  \"HostFeatures\": [\"CLZERO\"]\n}\n%endif\n\n; Starting address to store to\nmov rax, 0xe8000000\n\n; Set up the cachelines with garbage\n\n; Cacheline 0\nmov rbx, 0x0000000041424344\nmov [rax + 8 * 0], rbx\nmov [rax + 8 * 1], rbx\nmov [rax + 8 * 2], rbx\nmov [rax + 8 * 3], rbx\nmov [rax + 8 * 4], rbx\nmov [rax + 8 * 5], rbx\nmov [rax + 8 * 6], rbx\nmov [rax + 8 * 7], rbx\n\n; Cacheline 1\nmov rbx, 0x5152535455565758\nmov [rax + 8 * 8], rbx\nmov [rax + 8 * 9], rbx\nmov [rax + 8 * 10], rbx\nmov [rax + 8 * 11], rbx ; clzero here\nmov [rax + 8 * 12], rbx\nmov [rax + 8 * 13], rbx\nmov [rax + 8 * 14], rbx\nmov [rax + 8 * 15], rbx\n\n; Cacheline 2\nmov rbx, 0x4142434400000000\nmov [rax + 8 * 16], rbx\nmov [rax + 8 * 17], rbx\nmov [rax + 8 * 18], rbx\nmov [rax + 8 * 19], rbx\nmov [rax + 8 * 20], rbx\nmov [rax + 8 * 21], rbx\nmov [rax + 8 * 22], rbx\nmov [rax + 8 * 23], rbx\n\n; Set RAX to the middle of cacheline 1 to ensure alignment\nlea rax, [rax + 8 * 11]\n\nclzero\n\n; Set rax back to the start\nmov rax, 0xe8000000\n\nmov rbx, 0\nmov rcx, 0\nmov rdx, 0\n\n; Cacheline 0 should be unmodified\nadd rcx, [rax + 8 * 0]\nadd rcx, [rax + 8 * 1]\nadd rcx, [rax + 8 * 2]\nadd rcx, [rax + 8 * 3]\nadd rcx, [rax + 8 * 4]\nadd rcx, [rax + 8 * 5]\nadd rcx, [rax + 8 * 6]\nadd rcx, [rax + 8 * 7]\n\n; Cacheline 1 Should be zero\nadd rbx, [rax + 8 * 8]\nadd rbx, [rax + 8 * 9]\nadd rbx, [rax + 8 * 10]\nadd rbx, [rax + 8 * 11]\nadd rbx, [rax + 8 * 12]\nadd rbx, [rax + 8 * 13]\nadd rbx, [rax + 8 * 14]\nadd rbx, [rax + 8 * 15]\n\n; Cacheline 2 should be unmodified\nadd rdx, [rax + 8 * 16]\nadd rdx, [rax + 8 * 17]\nadd rdx, [rax + 8 * 18]\nadd rdx, [rax + 8 * 19]\nadd rdx, [rax + 8 * 20]\nadd rdx, [rax + 8 * 21]\nadd rdx, [rax + 8 * 22]\nadd rdx, [rax + 8 * 23]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/SelfModifyingCode/Delinking.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RAX\": \"0x20\"\n  }\n}\n%endif\n\nmov rcx, 2\nmov rbx, 1\njmp main\n\npatched_op:\ndb 0x48, 0xc7, 0xc0, 0xff, 0xff, 0xff, 0xff\ndec rcx\njmp main\n\nmain:\n\n; warm up the cache\ncmp rcx, 0\njg patched_op\n\n; should the text exit?\ncmp rbx, 0\nje end\n\n; patch mov rax, -1 to nops\nmov byte [rel patched_op + 0], 0x90\nmov byte [rel patched_op + 1], 0x90\nmov byte [rel patched_op + 2], 0x90\nmov byte [rel patched_op + 3], 0x90\nmov byte [rel patched_op + 4], 0x90\nmov byte [rel patched_op + 5], 0x90\nmov byte [rel patched_op + 6], 0x90\n\nmov rax, 32\nmov rcx, 2\nmov rbx, 0\njmp main\n\nend:\nhlt"
  },
  {
    "path": "unittests/ASM/SelfModifyingCode/DifferentBlock.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RAX\": \"0x20\"\n  }\n}\n%endif\n\nmov rsp, 0xe000_1000\n\njmp main\n\npatched_op:\nmov rax,-1\nret\n\nmain:\n\n; warm up the cache\ncall patched_op\n\nmov byte [rel patched_op], 0xC3\n\nmov rax, 32\ncall patched_op\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/SelfModifyingCode/SameBlock.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RAX\": \"0x20\"\n  }\n}\n%endif\n\n\nmov rax, 32\n\n; patch mov rax,... to nops\nmov byte [rel patched_op + 0], 0x90\nmov byte [rel patched_op + 1], 0x90\nmov byte [rel patched_op + 2], 0x90\nmov byte [rel patched_op + 3], 0x90\nmov byte [rel patched_op + 4], 0x90\nmov byte [rel patched_op + 5], 0x90\nmov byte [rel patched_op + 6], 0x90\nmov byte [rel patched_op + 7], 0x90\nmov byte [rel patched_op + 8], 0x90\nmov byte [rel patched_op + 9], 0x90\n\npatched_op:\nmov rax,0xFABCFABCFABC0123 ; 10 bytes long\n\nhlt"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0\nmov [rdx + 8 * 0], rax\n\nmov rax, 201 ; Time\nsyscall\ncmp rax, 0\nsetne [rdx + 8 * 0]\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_0E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n  },\n  \"HostFeatures\": [\"3DNOW\"]\n}\n%endif\n\nfemms ; Just ensure it runs\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_10.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmovups xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_10_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x54cbb0180089fbcc\", \"0x5b0780753bfb542a\"],\n    \"XMM1\":  [\"0x2a54cbb0180089fb\", \"0xab5b0780753bfb54\"],\n    \"XMM2\":  [\"0x542a54cbb0180089\", \"0xccab5b0780753bfb\"],\n    \"XMM3\":  [\"0xfb542a54cbb01800\", \"0xbcccab5b0780753b\"],\n    \"XMM4\":  [\"0x3bfb542a54cbb018\", \"0x22bcccab5b078075\"],\n    \"XMM5\":  [\"0x753bfb542a54cbb0\", \"0x4922bcccab5b0780\"],\n    \"XMM6\":  [\"0x80753bfb542a54cb\", \"0xdd4922bcccab5b07\"],\n    \"XMM7\":  [\"0x0780753bfb542a54\", \"0x92dd4922bcccab5b\"],\n    \"XMM8\":  [\"0x5b0780753bfb542a\", \"0x7c92dd4922bcccab\"],\n    \"XMM9\":  [\"0xab5b0780753bfb54\", \"0x787c92dd4922bccc\"],\n    \"XMM10\": [\"0xccab5b0780753bfb\", \"0x2f787c92dd4922bc\"],\n    \"XMM11\": [\"0xbcccab5b0780753b\", \"0x772f787c92dd4922\"],\n    \"XMM12\": [\"0x22bcccab5b078075\", \"0x54772f787c92dd49\"],\n    \"XMM13\": [\"0x4922bcccab5b0780\", \"0xc354772f787c92dd\"],\n    \"XMM14\": [\"0xdd4922bcccab5b07\", \"0xbac354772f787c92\"],\n    \"XMM15\": [\"0x92dd4922bcccab5b\", \"0xeebac354772f787c\"]\n  }\n}\n%endif\n\nlea r15, [rel .data]\n\n; Testing unaligned 128bit loads\nmovups xmm0, [r15 + 0]\nmovups xmm1, [r15 + 1]\nmovups xmm2, [r15 + 2]\nmovups xmm3, [r15 + 3]\nmovups xmm4, [r15 + 4]\nmovups xmm5, [r15 + 5]\nmovups xmm6, [r15 + 6]\nmovups xmm7, [r15 + 7]\nmovups xmm8, [r15 + 8]\nmovups xmm9, [r15 + 9]\nmovups xmm10, [r15 + 10]\nmovups xmm11, [r15 + 11]\nmovups xmm12, [r15 + 12]\nmovups xmm13, [r15 + 13]\nmovups xmm14, [r15 + 14]\nmovups xmm15, [r15 + 15]\n\nhlt\n\n; 256bytes of random data\nalign 16\n.data:\ndd 9042892,1422635032,1006326826,1527218293,582798507,2089999689,1417097080,1928248003,1074272523,1060557251,216792327,1674803041,279616115,441777196,715038375,407518795,2094733428,1884598841,447734476,947524986,1895254698,1672830628,673098253,1045402773,864978567,960531374,339530893,196139005,59435495,1870279404,383715765,1032584027,104924620,597456593,1212863084,1007986729,1224991550,344476351,1986036506,1085590199,634942853,956487659,142947491,462458211,1658827823,1125737874,344797902,1512619469,492430419,1669559173,534412544,145721129,420223845,1524873383,1920822367,709486397,1075005959,1656124734,1364988886,1391946848,151501156,1480187379,1752943752,112425311\nalign 16\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_11.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovups [rdx + 8 * 2], xmm0\nmovaps xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_12.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x7172737475767778\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 2]\nmovhlps xmm0, xmm1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_13.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovlps [rdx + 8 * 2], xmm0\nmovaps xmm0, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_13_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x6162636465666768\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovlps xmm0, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_14.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x6566676845464748\", \"0x6162636441424344\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nunpcklps xmm0, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_15.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x7576777855565758\", \"0x7172737451525354\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nunpckhps xmm0, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x6162636465666768\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nmovaps xmm0, [rdx]\nmovaps xmm1, [rdx + 16]\n\nmovlhps xmm0, xmm1\n\nhlt\n\nalign 16\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_17.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x6162636465666768\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Into register\nmovaps xmm0, [rdx]\nmovhps xmm0, [rdx + 16]\n\n; Into memory (should only store upper half of xmm into 64-bit region of memory)\nmovhps [rdx + 32], xmm0\nmovaps xmm1, [rdx + 32]\n\nhlt\n\nalign 4096\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_19.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\n%macro nop_enc 1\ndb 0x0F\ndb %1\ndb 0x02\n\ndb 0x66\ndb 0x0F\ndb %1\ndb 0x02\n\ndb 0x48\ndb 0x0F\ndb %1\ndb 0x02\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nnop word [rdx + 8 * 0]\nnop dword [rdx + 8 * 0]\nnop qword [rdx + 8 * 0]\n\n; These nops can't be encoded via regular means\nnop_enc 0x19\nnop_enc 0x1A\nnop_enc 0x1B\nnop_enc 0x1C\nnop_enc 0x1D\nnop_enc 0x1E\n\n; Just ensure they didn't do anything to this memory location\nmovaps xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_28.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_29.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps [rdx + 8 * 2], xmm0\nmovaps xmm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_2A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\":  \"0x0000000100000002\",\n    \"XMM0\": [\"0x3f80000040000000\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0000000100000002\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovaps xmm0, [rdx + 8 * 2]\n\ncvtpi2ps xmm0, mm0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_2B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovntps [rdx + 8 * 2], xmm0\nmovaps xmm1, [rdx + 8 * 2]\n\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_2C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\":  \"0x0000000100000002\",\n    \"XMM0\": [\"0x3f80000040000000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3f80000040000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 2]\nmovaps xmm0, [rdx + 8 * 0]\n\ncvttps2pi mm0, xmm0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_2D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\":  \"0x0000000100000002\",\n    \"XMM0\": [\"0x3f80000040000000\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3f80000040000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 2]\nmovaps xmm0, [rdx + 8 * 0]\n\ncvtps2pi mm0, xmm0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_2E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4700\",\n    \"RBX\": \"0x0300\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x515253543f800000\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535440000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x5152535440800000\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535440800000\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x515253547FC00000\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535440800000\nmov [rdx + 8 * 5], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nucomiss xmm0, [rdx + 8 * 2]\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000 <- 0\n; ================\n;         00000011\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nmov rbx, rax\n\nucomiss xmm0, [rdx + 8 * 4]\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 01000000\n; 7: SF - 00000000 <- 0\n; ================\n;         01000111\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_2F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4700\",\n    \"RBX\": \"0x0300\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x515253543f800000\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535440000000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x5152535440800000\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535440800000\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x515253547FC00000\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535440800000\nmov [rdx + 8 * 5], rax\n\nmovaps xmm0, [rdx + 8 * 0]\ncomiss xmm0, [rdx + 8 * 2]\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000 <- 0\n; ================\n;         00000011\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nmov rbx, rax\n\ncomiss xmm0, [rdx + 8 * 4]\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 01000000\n; 7: SF - 00000000 <- 0\n; ================\n;         01000111\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_31.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\n\nrdtsc\nshl rdx, 32\nor rax, rdx\ncmp rax, 0\nsetne [r15 + 8 * 0]\nmov rax, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_40.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x80000000\nmov r11, 0x1\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovo  rax, [r15 + 8 * 1]\ncmovno rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_41.asm",
    "content": "\n%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovno rax, [r15 + 8 * 1]\ncmovo  rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_42.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovc  rax, [r15 + 8 * 1]\ncmovnc rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_43.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovnc rax, [r15 + 8 * 1]\ncmovc  rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_44.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovz  rax, [r15 + 8 * 1]\ncmovnz rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_45.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovnz rax, [r15 + 8 * 1]\ncmovz  rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_46.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovbe  rax, [r15 + 8 * 1]\ncmovnbe rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_47.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovnbe rax, [r15 + 8 * 1]\ncmovbe  rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_48.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovs  rax, [r15 + 8 * 1]\ncmovns rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_49.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovns rax, [r15 + 8 * 1]\ncmovs  rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_4A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x4\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovp  rax, [r15 + 8 * 1]\ncmovnp rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_4B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x3\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovnp rax, [r15 + 8 * 1]\ncmovp  rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_4C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovl  rax, [r15 + 8 * 1]\ncmovnl rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_4D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovnl rax, [r15 + 8 * 1]\ncmovl  rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_4E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovle  rax, [r15 + 8 * 1]\ncmovnle rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_4F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x0\nmov [r15 + 8 * 0], rax\nmov rax, 0x1\nmov [r15 + 8 * 1], rax\nmov rax, 0x2\nmov [r15 + 8 * 2], rax\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, -1\nmov rbx, -1\ncmovnle rax, [r15 + 8 * 1]\ncmovle  rbx, [r15 + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_50.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0\",\n    \"RBX\": \"0x3\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x8000000080000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x7000000070000000\nmov [rdx + 8 * 3], rax\n\nmovaps xmm0, [rdx + 8 * 0]\nmovaps xmm1, [rdx + 8 * 2]\nmovmskps rax, xmm0\nmovmskps rbx, xmm1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_51.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x3f8000003f800000\", \"0x3f8000003f800000\"],\n    \"XMM1\":  [\"0x4000000040000000\", \"0x4000000040000000\"],\n    \"XMM2\":  [\"0x4040000040400000\", \"0x4040000040400000\"],\n    \"XMM3\":  [\"0x4080000040800000\", \"0x4080000040800000\"],\n    \"XMM4\":  [\"0x3f8000003f800000\", \"0x3f8000003f800000\"],\n    \"XMM5\":  [\"0x4000000040000000\", \"0x4000000040000000\"],\n    \"XMM6\":  [\"0x4040000040400000\", \"0x4040000040400000\"],\n    \"XMM7\":  [\"0x4080000040800000\", \"0x4080000040800000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3f8000003f800000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x3f8000003f800000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4080000040800000 ; 4.0\nmov [rdx + 8 * 2], rax\nmov rax, 0x4080000040800000\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x4110000041100000 ; 9.0\nmov [rdx + 8 * 4], rax\nmov rax, 0x4110000041100000\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x4180000041800000 ; 16.0\nmov [rdx + 8 * 6], rax\nmov rax, 0x4180000041800000\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x41c8000041c80000 ; 25.0\nmov [rdx + 8 * 8], rax\nmov rax, 0x41c8000041c80000\nmov [rdx + 8 * 9], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 2]\nmovapd xmm2, [rdx + 8 * 4]\nmovapd xmm3, [rdx + 8 * 6]\nmovapd xmm4, [rdx + 8 * 8]\nmovapd xmm5, [rdx + 8 * 8]\nmovapd xmm6, [rdx + 8 * 8]\nmovapd xmm7, [rdx + 8 * 8]\n\nsqrtps xmm0, xmm0\nsqrtps xmm1, xmm1\nsqrtps xmm2, xmm2\nsqrtps xmm3, xmm3\n\nsqrtps xmm4, [rdx + 8 * 0]\nsqrtps xmm5, [rdx + 8 * 2]\nsqrtps xmm6, [rdx + 8 * 4]\nsqrtps xmm7, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_52.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R8\": \"1\",\n    \"R9\": \"1\"\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\n%include \"checkprecision.mac\"\n\n; clobbers xmm15\n; returns the comparison result in rax\n%macro same_pdwords 1 ; receives the xmms register\n    movd eax, %1\n    movd xmm15, eax\n    pshufd xmm15, xmm15, 0 ; has the lower 32bits of %1 accross all lanes \n    pcmpeqd xmm15, %1 ; has equalty mask on all lanes\n    movmskps eax, xmm15 ; gets sign bit of each lane into eax\n    cmp eax, 0b1111\n    sete al\n    movzx rax, al\n%endmacro\n\nsection .text\nglobal _start\n\n_start:\n\n;; This test checks that the rsqrtps returns results within the 1.5*2^-12 relative error\n;; margin and that the results are packed as a vector of 4 32bits. Because we pass in\n;; the same argument accross the vector we expect the same result accross the vector\n;; and we check that with macro same_pdwords\n\nmovapd xmm0, [rel arg1]\nmovapd xmm1, [rel arg2]\nmovapd xmm2, [rel arg3]\nmovapd xmm3, [rel arg4]\nmovapd xmm4, [rel arg5]\nmovapd xmm5, [rel arg5]\nmovapd xmm6, [rel arg5]\nmovapd xmm7, [rel arg5]\n\nrsqrtps xmm0, xmm0\nrsqrtps xmm1, xmm1\nrsqrtps xmm2, xmm2\nrsqrtps xmm3, xmm3\n\nrsqrtps xmm4, [rel arg1]\nrsqrtps xmm5, [rel arg2]\nrsqrtps xmm6, [rel arg3]\nrsqrtps xmm7, [rel arg4]\n\nsame_pdwords xmm0\nmov r8, rax\nsame_pdwords xmm1\nand r8, rax\nsame_pdwords xmm2\nand r8, rax\nsame_pdwords xmm3\nand r8, rax\nsame_pdwords xmm4\nand r8, rax\nsame_pdwords xmm5\nand r8, rax\nsame_pdwords xmm6\nand r8, rax\nsame_pdwords xmm7\nand r8, rax\n\npextrd [rel result1], xmm0, 0\npinsrd xmm0, esi, 0\ncheck_relerr rel eresult1, rel result1, rel tolerance\nmov r9, rax\n\npextrd [rel result2], xmm1, 0\npinsrd xmm1, esi, 0\ncheck_relerr rel eresult2, rel result2, rel tolerance\nand r9, rax\n\npextrd [rel result3], xmm2, 0\npinsrd xmm2, esi, 0\ncheck_relerr rel eresult3, rel result3, rel tolerance\nand r9, rax\n\npextrd [rel result4], xmm3, 0\npinsrd xmm3, esi, 0\ncheck_relerr rel eresult4, rel result4, rel tolerance\nand r9, rax\n\nhlt\n\nalign 4096\nresult1: dd 0\nresult2: dd 0\nresult3: dd 0\nresult4: dd 0\n\nalign 64\n\narg1: \ndq 0x3f8000003f800000 ; 1.0\ndq 0x3f8000003f800000\n\narg2: \ndq 0x4080000040800000 ; 4.0\ndq 0x4080000040800000\n\narg3:\ndq 0x4110000041100000 ; 9.0\ndq 0x4110000041100000\n\narg4: \ndq 0x4180000041800000 ; 16.0\ndq 0x4180000041800000\n\narg5:\ndq 0x41c8000041c80000 ; 25.0\ndq 0x41c8000041c80000\n\nalign 32\neresult1:\ndd 0x3f800000 ; 1.0\neresult2:\ndd 0x3f000000 ; 0.5 \neresult3:\ndd 0x3eaaaaab ; 1/3 = 0.(3)\neresult4:\ndd 0x3e800000 ; 0.25\n\ntolerance:\ndd 0x39c00000\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_53.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R8\": \"1\",\n    \"R9\": \"1\"\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\n%include \"checkprecision.mac\"\n\n; clobbers xmm15\n; returns the comparison result in rax\n%macro same_pdwords 1 ; receives the xmms register\n    movd eax, %1\n    movd xmm15, eax\n    pshufd xmm15, xmm15, 0 ; has the lower 32bits of %1 accross all lanes\n    pcmpeqd xmm15, %1 ; has equalty mask on all lanes\n    movmskps eax, xmm15 ; gets sign bit of each lane into eax\n    cmp eax, 0b1111\n    sete al\n    movzx rax, al\n%endmacro\n\nsection .text\nglobal _start\n\n_start:\n\nmovapd xmm0, [rel arg1]\n\nrcpps xmm0, xmm0\nrcpps xmm1, [rel arg2]\n\nsame_pdwords xmm0\nmov r8, rax\nsame_pdwords xmm1\nand r8, rax\n\npextrd [rel result1], xmm0, 0\npinsrd xmm0, esi, 0\ncheck_relerr rel eresult1, rel result1, rel tolerance\nmov r9, rax\n\npextrd [rel result2], xmm1, 0\npinsrd xmm1, esi, 0\ncheck_relerr rel eresult2, rel result2, rel tolerance\nand r9, rax\n\nhlt\n\nalign 4096\nresult1: dd 0\nresult2: dd 0\n\nalign 64\n\narg1:\ndq 0x3f8000003f800000 ; 1.0\ndq 0x3f8000003f800000\n\narg2:\ndq 0x4080000040800000 ; 4.0\ndq 0x4080000040800000\n\n\nalign 32\neresult1:\ndd 0x3f800000 ; 1.0\neresult2:\ndd 0x3e800000 ; 0.25\n\ntolerance:\ndd 0x39c00000\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_54.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x1010101010101010\", \"0x0\"],\n    \"XMM1\": [\"0x1010101010101010\", \"0x0\"],\n    \"XMM2\": [\"0x1010101010101010\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 0], rax\nmov rax, 0x0\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1010101010101010\nmov [rdx + 8 * 2], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nandps xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\nandps xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_55.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM1\": [\"0x0\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM2\": [\"0x1010101010101010\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 0], rax\nmov rax, 0x0\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1010101010101010\nmov [rdx + 8 * 2], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nandnps xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\nandnps xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_56.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x1111111111111111\", \"0x2222222222222222\"],\n    \"XMM1\": [\"0x1111111111111111\", \"0x2222222222222222\"],\n    \"XMM2\": [\"0x0101010101010101\", \"0x0202020202020202\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x1010101010101010\nmov [rdx + 8 * 0], rax\nmov rax, 0x2020202020202020\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0101010101010101\nmov [rdx + 8 * 2], rax\nmov rax, 0x0202020202020202\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\norps xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\norps xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_57.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x2424242424242424\", \"0x2424242424242424\"],\n    \"XMM1\": [\"0x2424242424242424\", \"0x2424242424242424\"],\n    \"XMM2\": [\"0x1818181818181818\", \"0x1818181818181818\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3C3C3C3C3C3C3C3C\nmov [rdx + 8 * 0], rax\nmov rax, 0x3C3C3C3C3C3C3C3C\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1818181818181818\nmov [rdx + 8 * 2], rax\nmov rax, 0x1818181818181818\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nxorps xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\nxorps xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_58.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4100000040c00000\", \"0x4140000041200000\"],\n    \"XMM1\": [\"0x4100000040c00000\", \"0x4140000041200000\"],\n    \"XMM2\": [\"0x40c0000040a00000\", \"0x4100000040e00000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x400000003f800000 ; 2, 1\nmov [rdx + 8 * 0], rax\nmov rax, 0x4080000040400000 ; 4, 3\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x40c0000040a00000 ; 6, 5\nmov [rdx + 8 * 2], rax\nmov rax, 0x4100000040e00000 ; 8, 7\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\naddps xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\naddps xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_59.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4140000040a00000\", \"0x4200000041a80000\"],\n    \"XMM1\": [\"0x4140000040a00000\", \"0x4200000041a80000\"],\n    \"XMM2\": [\"0x40c0000040a00000\", \"0x4100000040e00000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x400000003f800000 ; 2, 1\nmov [rdx + 8 * 0], rax\nmov rax, 0x4080000040400000 ; 4, 3\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x40c0000040a00000 ; 6, 5\nmov [rdx + 8 * 2], rax\nmov rax, 0x4100000040e00000 ; 8, 7\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmulps xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\nmulps xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_5A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4014000000000000\", \"0x4018000000000000\"],\n    \"XMM1\": [\"0x4014000000000000\", \"0x4018000000000000\"],\n    \"XMM2\": [\"0x40c0000040a00000\", \"0x4100000040e00000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x400000003f800000 ; 2, 1\nmov [rdx + 8 * 0], rax\nmov rax, 0x4080000040400000 ; 4, 3\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x40c0000040a00000 ; 6, 5\nmov [rdx + 8 * 2], rax\nmov rax, 0x4100000040e00000 ; 8, 7\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\ncvtps2pd xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\ncvtps2pd xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_5A_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x0000004600000053\", \"0x0000000d00000029\"],\n    \"XMM1\": [\"0x0000001600000005\", \"0x000000050000000a\"],\n    \"XMM2\": [\"0x000000430000001d\", \"0x0000005b00000013\"],\n    \"XMM3\": [\"0x0000003300000028\", \"0x0000001800000021\"],\n    \"XMM4\": [\"0x000000180000005b\", \"0x0000005b00000063\"],\n    \"XMM5\": [\"0x000000630000005b\", \"0x0000004a00000041\"],\n    \"XMM6\": [\"0x0000001900000023\", \"0x0000005a00000006\"],\n    \"XMM7\": [\"0x0000003400000021\", \"0x0000000a0000003a\"],\n    \"XMM8\": [\"0x0000005400000030\", \"0x000000420000005a\"],\n    \"XMM9\": [\"0x0000000700000060\", \"0x0000005f0000001a\"],\n    \"XMM10\": [\"0x0000002500000058\", \"0x0000000a00000032\"],\n    \"XMM11\": [\"0x000000140000004e\", \"0x000000290000000a\"],\n    \"XMM12\": [\"0x0000003a0000000f\", \"0x000000380000000a\"],\n    \"XMM13\": [\"0x0000000500000035\", \"0x0000000300000049\"],\n    \"XMM14\": [\"0x0000004700000039\", \"0x000000590000003e\"],\n    \"XMM15\": [\"0x0000001800000030\", \"0x0000006100000022\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\ncvtps2dq xmm0, [rdx + 16 * 0]\ncvtps2dq xmm1, [rdx + 16 * 1]\ncvtps2dq xmm2, [rdx + 16 * 2]\ncvtps2dq xmm3, [rdx + 16 * 3]\ncvtps2dq xmm4, [rdx + 16 * 4]\ncvtps2dq xmm5, [rdx + 16 * 5]\ncvtps2dq xmm6, [rdx + 16 * 6]\ncvtps2dq xmm7, [rdx + 16 * 7]\ncvtps2dq xmm8, [rdx + 16 * 8]\ncvtps2dq xmm9, [rdx + 16 * 9]\ncvtps2dq xmm10, [rdx + 16 * 10]\ncvtps2dq xmm11, [rdx + 16 * 11]\ncvtps2dq xmm12, [rdx + 16 * 12]\ncvtps2dq xmm13, [rdx + 16 * 13]\ncvtps2dq xmm14, [rdx + 16 * 14]\ncvtps2dq xmm15, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndd 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_5B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xbf8000003f800000\", \"0x437f000000000000\"],\n    \"XMM1\": [\"0xbf8000003f800000\", \"0x437f000000000000\"],\n    \"XMM2\": [\"0xFFFFFFFF00000001\", \"0x000000FF00000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x400000003f800000 ; 2, 1\nmov [rdx + 8 * 0], rax\nmov rax, 0x4080000040400000 ; 4, 3\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFF00000001 ; -1, 1\nmov [rdx + 8 * 2], rax\nmov rax, 0x000000FF00000000 ; 255, 0\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\ncvtdq2ps xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\ncvtdq2ps xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_5B_1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x4ea997604b09fbcc\", \"0x4eb60f014e6fed51\"],\n    \"XMM1\": [\"0x4ef925bb4e0af333\", \"0x4ee5dd764ea8ee5f\"],\n    \"XMM2\": [\"0x4e7cdb474e801032\", \"0x4ec7a6ef4d4ebfd0\"],\n    \"XMM3\": [\"0x4dd2a7e14d8554d4\", \"0x4dc251f24e2a7a7b\"],\n    \"XMM4\": [\"0x4ee0a9644ef9b631\", \"0x4e61e8564dd57f16\"],\n    \"XMM5\": [\"0x4ec76abd4ee1ee95\", \"0x4e793e524e207aa8\"],\n    \"XMM6\": [\"0x4e65022f4e4e3a1a\", \"0x4d3b0d804da1e6a4\"],\n    \"XMM7\": [\"0x4edef4664c62ba7a\", \"0x4e762fed4db6f84e\"],\n    \"XMM8\": [\"0x4e0e71db4cc820ba\", \"0x4e7052a14e9095a5\"],\n    \"XMM9\": [\"0x4da442564e9207c6\", \"0x4e8169954eecc106\"],\n    \"XMM10\": [\"0x4e640b604e1761d6\", \"0x4ddc846b4d08534a\"],\n    \"XMM11\": [\"0x4e8632cb4ec5bf68\", \"0x4eb4517c4da46996\"],\n    \"XMM12\": [\"0x4ec706e74deacf23\", \"0x4d0af8734dfed3e8\"],\n    \"XMM13\": [\"0x4eb5c7714dc860db\", \"0x4e29279d4ee4fad9\"],\n    \"XMM14\": [\"0x4ec56cea4e802694\", \"0x4ea5eed94ea2b828\"],\n    \"XMM15\": [\"0x4eb073bc4d107b96\", \"0x4cd66f2c4ed0f799\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\ncvtdq2ps xmm0, [rdx + 16 * 0]\ncvtdq2ps xmm1, [rdx + 16 * 1]\ncvtdq2ps xmm2, [rdx + 16 * 2]\ncvtdq2ps xmm3, [rdx + 16 * 3]\ncvtdq2ps xmm4, [rdx + 16 * 4]\ncvtdq2ps xmm5, [rdx + 16 * 5]\ncvtdq2ps xmm6, [rdx + 16 * 6]\ncvtdq2ps xmm7, [rdx + 16 * 7]\ncvtdq2ps xmm8, [rdx + 16 * 8]\ncvtdq2ps xmm9, [rdx + 16 * 9]\ncvtdq2ps xmm10, [rdx + 16 * 10]\ncvtdq2ps xmm11, [rdx + 16 * 11]\ncvtdq2ps xmm12, [rdx + 16 * 12]\ncvtdq2ps xmm13, [rdx + 16 * 13]\ncvtdq2ps xmm14, [rdx + 16 * 14]\ncvtdq2ps xmm15, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndd 9042892,1422635032,1006326826,1527218293,582798507,2089999689,1417097080,1928248003,1074272523,1060557251,216792327,1674803041,279616115,441777196,715038375,407518795,2094733428,1884598841,447734476,947524986,1895254698,1672830628,673098253,1045402773,864978567,960531374,339530893,196139005,59435495,1870279404,383715765,1032584027,104924620,597456593,1212863084,1007986729,1224991550,344476351,1986036506,1085590199,634942853,956487659,142947491,462458211,1658827823,1125737874,344797902,1512619469,492430419,1669559173,534412544,145721129,420223845,1524873383,1920822367,709486397,1075005959,1656124734,1364988886,1391946848,151501156,1480187379,1752943752,112425311\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_5C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xc0800000c0800000\", \"0xc0800000c0800000\"],\n    \"XMM1\": [\"0xc0800000c0800000\", \"0xc0800000c0800000\"],\n    \"XMM2\": [\"0x40c0000040a00000\", \"0x4100000040e00000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x400000003f800000 ; 2, 1\nmov [rdx + 8 * 0], rax\nmov rax, 0x4080000040400000 ; 4, 3\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x40c0000040a00000 ; 6, 5\nmov [rdx + 8 * 2], rax\nmov rax, 0x4100000040e00000 ; 8, 7\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nsubps xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\nsubps xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_5D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x400000003f800000\", \"0x4080000040400000\"],\n    \"XMM1\": [\"0x400000003f800000\", \"0x4080000040400000\"],\n    \"XMM2\": [\"0x40c0000040a00000\", \"0x4100000040e00000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x400000003f800000 ; 2, 1\nmov [rdx + 8 * 0], rax\nmov rax, 0x4080000040400000 ; 4, 3\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x40c0000040a00000 ; 6, 5\nmov [rdx + 8 * 2], rax\nmov rax, 0x4100000040e00000 ; 8, 7\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nminps xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\nminps xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_5E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x3eaaaaab3e4ccccd\", \"0x3f0000003edb6db7\"],\n    \"XMM1\": [\"0x3eaaaaab3e4ccccd\", \"0x3f0000003edb6db7\"],\n    \"XMM2\": [\"0x40c0000040a00000\", \"0x4100000040e00000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x400000003f800000 ; 2, 1\nmov [rdx + 8 * 0], rax\nmov rax, 0x4080000040400000 ; 4, 3\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x40c0000040a00000 ; 6, 5\nmov [rdx + 8 * 2], rax\nmov rax, 0x4100000040e00000 ; 8, 7\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\ndivps xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\ndivps xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_5F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0x40c0000040a00000\", \"0x4100000040e00000\"],\n    \"XMM1\": [\"0x40c0000040a00000\", \"0x4100000040e00000\"],\n    \"XMM2\": [\"0x40c0000040a00000\", \"0x4100000040e00000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x400000003f800000 ; 2, 1\nmov [rdx + 8 * 0], rax\nmov rax, 0x4080000040400000 ; 4, 3\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x40c0000040a00000 ; 6, 5\nmov [rdx + 8 * 2], rax\nmov rax, 0x4100000040e00000 ; 8, 7\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx]\nmaxps xmm0, [rdx + 8 * 2]\n\nmovapd xmm1, [rdx]\nmovapd xmm2, [rdx + 8 * 2]\nmaxps xmm1, xmm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_60.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x6545664667476848\",\n    \"MM1\": \"0x6545664667476848\",\n    \"MM2\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npunpcklbw mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npunpcklbw mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_61.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x6566454667684748\",\n    \"MM1\": \"0x6566454667684748\",\n    \"MM2\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npunpcklwd mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npunpcklwd mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_62.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x6566676845464748\",\n    \"MM1\": \"0x6566676845464748\",\n    \"MM2\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npunpckldq mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npunpckldq mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_63.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x00FF7F4100807F41\",\n    \"MM1\": \"0x00FF7F4100807F41\",\n    \"MM2\": \"0x0000FFFF007F0041\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; 16bit signed -> 8bit signed (saturated)\n; input > 0x7F(SCHAR_MAX, 127) = 0x7F(SCHAR_MAX, 127)\n; input < 0x80(-127) = 0x80\n\nmov rax, 0x00008000007F0041\nmov [rdx + 8 * 0], rax\nmov rax, 0x00008000007F0041\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0000FFFF007F0041\nmov [rdx + 8 * 2], rax\nmov rax, 0x0000FFFF007F0041\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npacksswb mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npacksswb mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xFFFFFFFFFFFFFFFF\",\n    \"MM1\": \"0xFFFFFFFFFFFFFFFF\",\n    \"MM2\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 0], rax\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npcmpgtb mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npcmpgtb mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_65.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xFFFFFFFFFFFFFFFF\",\n    \"MM1\": \"0xFFFFFFFFFFFFFFFF\",\n    \"MM2\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 0], rax\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npcmpgtw mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npcmpgtw mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_66.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xFFFFFFFFFFFFFFFF\",\n    \"MM1\": \"0xFFFFFFFFFFFFFFFF\",\n    \"MM2\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 0], rax\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npcmpgtd mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npcmpgtd mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_67.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x00007F4100007F41\",\n    \"MM1\": \"0x00007F4100007F41\",\n    \"MM2\": \"0x0000FFFF007F0041\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; 16bit signed -> 8bit unsigned (saturated)\n; input > 0x7F(SCHAR_MAX, 127) = 0xFF(UCHAR_MAX, 255)\n; input < 0x00(Negative) = 0x0\n\nmov rax, 0x0000FFFF007F0041\nmov [rdx + 8 * 0], rax\nmov rax, 0x0000FFFF007F0041\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0000FFFF007F0041\nmov [rdx + 8 * 2], rax\nmov rax, 0x0000FFFF007F0041\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npackuswb mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npackuswb mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_68.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x6141624263436444\",\n    \"MM1\": \"0x6141624263436444\",\n    \"MM2\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npunpckhbw mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npunpckhbw mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_69.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x6162414263644344\",\n    \"MM1\": \"0x6162414263644344\",\n    \"MM2\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npunpckhwd mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npunpckhwd mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_6A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x6162636441424344\",\n    \"MM1\": \"0x6162636441424344\",\n    \"MM2\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npunpckhdq mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npunpckhdq mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_6B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xFFFF8000FFFF8000\",\n    \"MM1\": \"0xFFFF8000FFFF8000\",\n    \"MM2\": \"0xFFFFFFFF80000000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; 32bit signed -> 16bit signed (saturated)\n; input > 0x7FFF(SHRT_MAX, 32767) = 0x7FFF(SHRT_MAX, 32767)\n; input < 0x8000(-32767) = 0x8000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x0000000000000040\nmov [rdx + 8 * 1], rax\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x0000000000000040\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npackssdw mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npackssdw mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_6E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0000000045464748\",\n    \"MM1\": \"0x5152535455565758\",\n    \"MM2\": \"0x0000000045464748\",\n    \"MM3\": \"0x5152535455565758\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov rax, qword [rdx + 8 * 0]\nmov rbx, qword [rdx + 8 * 1]\n\nmovd mm0, eax\nmovq mm1, rbx\n\nmovd mm2, dword [rdx + 8 * 0]\nmovq mm3, qword [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_6E_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0000000045464748\",\n    \"MM1\": \"0x5152535455565758\"\n  }\n}\n%endif\n\nmov rax, 0x4142434445464748\nmov rbx, 0x5152535455565758\n\nmovd mm0, eax\nmovq mm1, rbx\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_6F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x4142434445464748\",\n    \"MM1\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\nmovq mm1, mm0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_70.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x4142434445464748\",\n    \"MM1\": \"0x6162636465666768\",\n    \"MM2\": \"0x4748474847484748\",\n    \"MM3\": \"0x6162616261626162\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\nmovq mm1, [rdx + 8 * 2]\npshufw mm2, mm0, 0x0\npshufw mm3, mm1, 0xFF\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_74.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x00000000000000FF\",\n    \"MM1\": \"0x00000000000000FF\",\n    \"MM2\": \"0x6162636465666778\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 0], rax\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666778\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565748\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npcmpeqb mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npcmpeqb mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_75.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x000000000000FFFF\",\n    \"MM1\": \"0x000000000000FFFF\",\n    \"MM2\": \"0x6162636465667778\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 0], rax\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465667778\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455564748\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npcmpeqw mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npcmpeqw mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_76.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x00000000FFFFFFFF\",\n    \"MM1\": \"0x00000000FFFFFFFF\",\n    \"MM2\": \"0x61626364FFFFFFFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x71727374FFFFFFFF\nmov [rdx + 8 * 0], rax\nmov rax, 0x41424344FFFFFFFF\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x61626364FFFFFFFF\nmov [rdx + 8 * 2], rax\nmov rax, 0x51525354FFFFFFFF\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npcmpeqd mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npcmpeqd mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_77.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n  }\n}\n%endif\n\nemms ; Just ensure it runs\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_7E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000045464748\",\n    \"RBX\": \"0x5152535455565758\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov eax, dword [rdx + 8 * 0]\nmov rbx, qword [rdx + 8 * 1]\n\nmovd mm0, eax\nmovq mm1, rbx\n\nmov rax, 0\nmov rbx, 0\n\nmovd eax, mm0\nmovq rbx, mm1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_7F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x4142434445464748\",\n    \"MM1\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\nmovq [rdx + 8 * 4], mm0\nmovq mm1, [rdx + 8 * 4]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_80.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x80000000\nmov r11, 0x1\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njo .tgt_1\njno .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_81.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njno .tgt_1\njo .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_82.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njc .tgt_1\njnc .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_83.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njnc .tgt_1\njc .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_84.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njz .tgt_1\njnz .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_85.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njnz .tgt_1\njz .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_86.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njbe .tgt_1\njnbe .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_87.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njnbe .tgt_1\njbe .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_88.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njs .tgt_1\njns .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_89.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njns .tgt_1\njs .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_8A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x4\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njp .tgt_1\njnp .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_8B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x3\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njnp .tgt_1\njp .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_8B_16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x000000000000fbcc\",\n    \"RBX\": \"0x00000000000089fb\",\n    \"RCX\": \"0x0000000000000089\",\n    \"RDX\": \"0x0000000000001800\",\n    \"RSI\": \"0x000000000000b018\",\n    \"RDI\": \"0x000000000000cbb0\",\n    \"RBP\": \"0x00000000000054cb\",\n    \"RSP\": \"0x0000000000002a54\",\n    \"R8\":  \"0x000000000000b018\",\n    \"R9\":  \"0x000000000000fb54\",\n    \"R10\": \"0x0000000000003bfb\",\n    \"R11\": \"0x000000000000753b\",\n    \"R12\": \"0x0000000000008075\",\n    \"R13\": \"0x0000000000000780\",\n    \"R14\": \"0x0000000000005b07\",\n    \"R15\": \"0x000000000001ab5b\"\n  }\n}\n%endif\n\nlea r15, [rel .data]\n\nmov eax,  0\nmov ebx,  0\nmov ecx,  0\nmov edx,  0\nmov esi,  0\nmov edi,  0\nmov ebp,  0\nmov esp,  0\nmov r8d,  0\nmov r9d,  0\nmov r10d, 0\nmov r11d, 0\nmov r12d, 0\nmov r13d, 0\nmov r14d, 0\n\n; We only care about results here\nmov ax,  word [r15 + 0]\nmov bx,  word [r15 + 1]\nmov cx,  word [r15 + 2]\nmov dx,  word [r15 + 3]\nmov si,  word [r15 + 4]\nmov di,  word [r15 + 5]\nmov bp,  word [r15 + 6]\nmov sp,  word [r15 + 7]\nmov r8w,  word [r15 + 4]\nmov r9w,  word [r15 + 9]\nmov r10w, word [r15 + 10]\nmov r11w, word [r15 + 11]\nmov r12w, word [r15 + 12]\nmov r13w, word [r15 + 13]\nmov r14w, word [r15 + 14]\nmov r15w, word [r15 + 15]\n\nhlt\n\n; 256bytes of random data\nalign 16\n.data:\ndd 9042892,1422635032,1006326826,1527218293,582798507,2089999689,1417097080,1928248003,1074272523,1060557251,216792327,1674803041,279616115,441777196,715038375,407518795,2094733428,1884598841,447734476,947524986,1895254698,1672830628,673098253,1045402773,864978567,960531374,339530893,196139005,59435495,1870279404,383715765,1032584027,104924620,597456593,1212863084,1007986729,1224991550,344476351,1986036506,1085590199,634942853,956487659,142947491,462458211,1658827823,1125737874,344797902,1512619469,492430419,1669559173,534412544,145721129,420223845,1524873383,1920822367,709486397,1075005959,1656124734,1364988886,1391946848,151501156,1480187379,1752943752,112425311\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_8B_32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x000000000089fbcc\",\n    \"RBX\": \"0x00000000180089fb\",\n    \"RCX\": \"0x00000000b0180089\",\n    \"RDX\": \"0x00000000cbb01800\",\n    \"RSI\": \"0x0000000054cbb018\",\n    \"RDI\": \"0x000000002a54cbb0\",\n    \"RBP\": \"0x00000000542a54cb\",\n    \"RSP\": \"0x00000000fb542a54\",\n    \"R8\":  \"0x0000000054cbb018\",\n    \"R9\":  \"0x00000000753bfb54\",\n    \"R10\": \"0x0000000080753bfb\",\n    \"R11\": \"0x000000000780753b\",\n    \"R12\": \"0x000000005b078075\",\n    \"R13\": \"0x00000000ab5b0780\",\n    \"R14\": \"0x00000000ccab5b07\",\n    \"R15\": \"0x00000000bcccab5b\"\n  }\n}\n%endif\n\nlea r15, [rel .data]\n\n; We only care about results here\nmov eax,  dword [r15 + 0]\nmov ebx,  dword [r15 + 1]\nmov ecx,  dword [r15 + 2]\nmov edx,  dword [r15 + 3]\nmov esi,  dword [r15 + 4]\nmov edi,  dword [r15 + 5]\nmov ebp,  dword [r15 + 6]\nmov esp,  dword [r15 + 7]\nmov r8d,  dword [r15 + 4]\nmov r9d,  dword [r15 + 9]\nmov r10d, dword [r15 + 10]\nmov r11d, dword [r15 + 11]\nmov r12d, dword [r15 + 12]\nmov r13d, dword [r15 + 13]\nmov r14d, dword [r15 + 14]\nmov r15d, dword [r15 + 15]\n\nhlt\n\n\n; 256bytes of random data\nalign 16\n.data:\ndd 9042892,1422635032,1006326826,1527218293,582798507,2089999689,1417097080,1928248003,1074272523,1060557251,216792327,1674803041,279616115,441777196,715038375,407518795,2094733428,1884598841,447734476,947524986,1895254698,1672830628,673098253,1045402773,864978567,960531374,339530893,196139005,59435495,1870279404,383715765,1032584027,104924620,597456593,1212863084,1007986729,1224991550,344476351,1986036506,1085590199,634942853,956487659,142947491,462458211,1658827823,1125737874,344797902,1512619469,492430419,1669559173,534412544,145721129,420223845,1524873383,1920822367,709486397,1075005959,1656124734,1364988886,1391946848,151501156,1480187379,1752943752,112425311\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_8B_64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x54cbb0180089fbcc\",\n    \"RBX\": \"0x2a54cbb0180089fb\",\n    \"RCX\": \"0x542a54cbb0180089\",\n    \"RDX\": \"0xfb542a54cbb01800\",\n    \"RSI\": \"0x3bfb542a54cbb018\",\n    \"RDI\": \"0x753bfb542a54cbb0\",\n    \"RBP\": \"0x80753bfb542a54cb\",\n    \"RSP\": \"0x0780753bfb542a54\",\n    \"R8\":  \"0x3bfb542a54cbb018\",\n    \"R9\":  \"0xab5b0780753bfb54\",\n    \"R10\": \"0xccab5b0780753bfb\",\n    \"R11\": \"0xbcccab5b0780753b\",\n    \"R12\": \"0x22bcccab5b078075\",\n    \"R13\": \"0x4922bcccab5b0780\",\n    \"R14\": \"0xdd4922bcccab5b07\",\n    \"R15\": \"0x92dd4922bcccab5b\"\n  }\n}\n%endif\n\nlea r15, [rel .data]\n\nmov eax,  0\nmov ebx,  0\nmov ecx,  0\nmov edx,  0\nmov esi,  0\nmov edi,  0\nmov ebp,  0\nmov esp,  0\nmov r8d,  0\nmov r9d,  0\nmov r10d, 0\nmov r11d, 0\nmov r12d, 0\nmov r13d, 0\nmov r14d, 0\n\n; We only care about results here\nmov rax, qword [r15 + 0]\nmov rbx, qword [r15 + 1]\nmov rcx, qword [r15 + 2]\nmov rdx, qword [r15 + 3]\nmov rsi, qword [r15 + 4]\nmov rdi, qword [r15 + 5]\nmov rbp, qword [r15 + 6]\nmov rsp, qword [r15 + 7]\nmov r8,  qword [r15 + 4]\nmov r9,  qword [r15 + 9]\nmov r10, qword [r15 + 10]\nmov r11, qword [r15 + 11]\nmov r12, qword [r15 + 12]\nmov r13, qword [r15 + 13]\nmov r14, qword [r15 + 14]\nmov r15, qword [r15 + 15]\n\nhlt\n\n; 256bytes of random data\nalign 16\n.data:\ndd 9042892,1422635032,1006326826,1527218293,582798507,2089999689,1417097080,1928248003,1074272523,1060557251,216792327,1674803041,279616115,441777196,715038375,407518795,2094733428,1884598841,447734476,947524986,1895254698,1672830628,673098253,1045402773,864978567,960531374,339530893,196139005,59435495,1870279404,383715765,1032584027,104924620,597456593,1212863084,1007986729,1224991550,344476351,1986036506,1085590199,634942853,956487659,142947491,462458211,1658827823,1125737874,344797902,1512619469,492430419,1669559173,534412544,145721129,420223845,1524873383,1920822367,709486397,1075005959,1656124734,1364988886,1391946848,151501156,1480187379,1752943752,112425311\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_8C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njl .tgt_1\njnl .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_8D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njnl .tgt_1\njl .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_8E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njle .tgt_1\njnle .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_8F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\n\njnle .tgt_1\njle .tgt_2\njmp .end\n\n.tgt_1:\nmov rax, 1\njmp .end\n\n.tgt_2:\nmov rbx, 1\njmp .end\n\n.end:\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_90.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x80000000\nmov r11, 0x1\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nseto al\nsetno bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_91.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nsetno al\nseto  bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_92.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nsetc  al\nsetnc bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_93.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nsetnc al\nsetc  bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_94.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nsetz  al\nsetnz bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_95.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nsetnz al\nsetz  bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_96.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nsetbe  al\nsetnbe bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_97.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nsetnbe al\nsetbe  bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_98.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nsets  al\nsetns bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_99.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nsetns al\nsets  bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_9A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x4\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nsetp al\nsetnp  bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_9B.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x3\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nsetnp al\nsetp  bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_9C.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nsetl  al\nsetnl bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_9D.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nsetnl al\nsetl  bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_9E.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x1\nmov r11, 0x0\nmov r12, 0x2\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nsetle  al\nsetnle bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_9F.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\",\n    \"RBX\": \"0x0\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov r10, 0x2\nmov r11, 0x0\nmov r12, 0x1\n\ncmp r10d, r12d\n\nmov rax, 0\nmov rbx, 0\nsetnle al\nsetle  bl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_A2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x1\"\n  }\n}\n%endif\n\n; CPUID function zero\nmov rax, 0\n\ncpuid\n\n; CPUID function zero always returns >0 in EAX\ncmp eax, 0\nmov rax, 0\nsetnz al\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_A3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x3\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\nmov r13, 1\nbt word [rdx], r13w\ncfmerge\n\nmov r13, 32\nbt dword [rdx], r13d\ncfmerge\n\nmov r13, 64 * 3\nbt qword [rdx], r13\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_A3_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x3\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nlea rdx, [rdx + 8 * 3 + 4]\n\nxor r15, r15 ; Will contain our results\n\nmov r13, -1\nbt word [rdx], r13w\ncfmerge\n\nmov r13, -32\nbt dword [rdx], r13d\ncfmerge\n\nmov r13, -64 * 3\nbt qword [rdx], r13\ncfmerge\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_A4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434457584857\",\n    \"RBX\": \"0x6162636467687576\",\n    \"RCX\": \"0x8788919291929394\",\n    \"RDX\": \"0xA7A8919293949596\",\n    \"RSI\": \"0xB1B2B3B4B5B6B7B8\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8182838485868788\nmov [rdx + 8 * 4], rax\nmov rax, 0x9192939495969798\nmov [rdx + 8 * 5], rax\nmov rax, 0xA1A2A3A4A5A6A7A8\nmov [rdx + 8 * 6], rax\nmov rax, 0xB1B2B3B4B5B6B7B8\nmov [rdx + 8 * 7], rax\n\nmov rax, [rdx + 8 * 1]\nshld word [rdx + 8 * 0 + 0], ax, 8\nshld word [rdx + 8 * 0 + 2], ax, 16\nshld word [rdx + 8 * 0 + 4], ax, 32\n\nmov rax, [rdx + 8 * 3]\nshld dword [rdx + 8 * 2 + 0], eax, 16\nshld dword [rdx + 8 * 2 + 4], eax, 32\n\nmov rax, [rdx + 8 * 5]\nshld qword [rdx + 8 * 4 + 0], rax, 16\nshld qword [rdx + 8 * 4 + 0], rax, 32\nshld qword [rdx + 8 * 6 + 0], rax, 48\nshld qword [rdx + 8 * 7 + 0], rax, 64\n\nmov rax, qword [rdx + 8 * 0]\nmov rbx, qword [rdx + 8 * 2]\nmov rcx, qword [rdx + 8 * 4]\nmov rsi, qword [rdx + 8 * 7]\nmov rdx, qword [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_A4_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xFFFFFFFFFFFFFFFF\",\n    \"R14\": \"0x4141414141410000\",\n    \"R13\": \"0\",\n    \"R12\": \"0\",\n    \"R11\": \"0x00000000FFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, -1\nmov r14, 0x4141414141410000\nmov r13, 0\nmov r12, 0\nmov r11, -1\n\nshld r14w, r15w, 0\nshld r13d, r15d, 0\nshld r12, r15, 0\nshld r11d, r15d, 0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_A5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434457584857\",\n    \"RBX\": \"0x6162636467687576\",\n    \"RCX\": \"0x8788919291929394\",\n    \"RDX\": \"0xA7A8919293949596\",\n    \"RSI\": \"0xB1B2B3B4B5B6B7B8\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8182838485868788\nmov [rdx + 8 * 4], rax\nmov rax, 0x9192939495969798\nmov [rdx + 8 * 5], rax\nmov rax, 0xA1A2A3A4A5A6A7A8\nmov [rdx + 8 * 6], rax\nmov rax, 0xB1B2B3B4B5B6B7B8\nmov [rdx + 8 * 7], rax\n\nmov rax, [rdx + 8 * 1]\nmov cl, 8\nshld word [rdx + 8 * 0 + 0], ax, cl\nmov cl, 16\nshld word [rdx + 8 * 0 + 2], ax, cl\nmov cl, 32\nshld word [rdx + 8 * 0 + 4], ax, cl\n\nmov rax, [rdx + 8 * 3]\nmov cl, 16\nshld dword [rdx + 8 * 2 + 0], eax, cl\nmov cl, 32\nshld dword [rdx + 8 * 2 + 4], eax, cl\n\nmov rax, [rdx + 8 * 5]\nmov cl, 16\nshld qword [rdx + 8 * 4 + 0], rax, cl\nmov cl, 32\nshld qword [rdx + 8 * 4 + 0], rax, cl\nmov cl, 48\nshld qword [rdx + 8 * 6 + 0], rax, cl\nmov cl, 64\nshld qword [rdx + 8 * 7 + 0], rax, cl\n\nmov rax, qword [rdx + 8 * 0]\nmov rbx, qword [rdx + 8 * 2]\nmov rcx, qword [rdx + 8 * 4]\nmov rsi, qword [rdx + 8 * 7]\nmov rdx, qword [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_A5_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xFFFFFFFFFFFFFFFF\",\n    \"R14\": \"0x4141414141410000\",\n    \"R13\": \"0\",\n    \"R12\": \"0\",\n    \"R11\": \"0x00000000FFFFFFFF\"\n  }\n}\n%endif\n\nmov cl, 0\nmov r15, -1\nmov r14, 0x4141414141410000\nmov r13, 0\nmov r12, 0\nmov r11, -1\n\nshld r14w, r15w, cl\nshld r13d, r15d, cl\nshld r12, r15, cl\nshld r11d, r15d, cl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_A5_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xFFFFFFFFFFFFFFFF\",\n    \"R14\": \"0x4141414141410000\",\n    \"R13\": \"0\",\n    \"R12\": \"0\",\n    \"R11\": \"0\"\n  }\n}\n%endif\n\nmov cl, 0\nmov r15, -1\nmov r14, 0x4141414141410000\nmov r13, 0\nmov r12, 0\nmov r11, 0\n\n; Get the incoming flags\nmov rax, 0\nlahf\nmov r11, rax\n\nshld r14w, r15w, cl\nshld r13d, r15d, cl\nshld r12, r15, cl\n\n; Get the outgoing flags\n; None should have changed\nmov rax, 0\nlahf\nxor r11, rax\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_A5_4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"r10\": \"1\",\n    \"RBX\": \"1\",\n    \"RDX\": \"1\",\n    \"RSI\": \"1\",\n    \"RBP\": \"1\",\n    \"RSP\": \"0\",\n    \"R8\":  \"0\",\n    \"r9\":  \"0\"\n  }\n}\n%endif\n\nmov cl, 1\nmov r15, -1\nmov r14, 0xFFFFFFFFFFFF4000\nmov r13, 0xFFFFFFFF40000000\nmov r12, 0x4000000000000000\n\nmov r10, 0\nmov rbx, 0\nmov rdx, 0\n\nmov rsi, 0\nmov rdi, 0\nmov rbp, 0\n\nmov rsp, 0\nmov r8, 0\nmov r9, 0\n\nmov r11, 1\n\n; Sign from 0->1  should set OF\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshld r14w, r15w, cl\ncmovo r10, r11\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshld r13d, r15d, cl\ncmovo rbx, r11\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshld r12, r15, cl\ncmovo rdx, r11\n\n; Sign from 1->0 should set OF\nmov r15, -1\nmov r14, 0xFFFFFFFFFFFF8000\nmov r13, 0xFFFFFFFF80000000\nmov r12, 0x8000000000000000\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshld r14w, r15w, cl\ncmovo rsi, r11\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshld r13d, r15d, cl\ncmovo rdi, r11\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshld r12, r15, cl\ncmovo rbp, r11\n\n; Sign from 0->0 should NOT set OF\nmov r15, -1\nmov r14, 0xFFFFFFFFFFFF0000\nmov r13, 0xFFFFFFFF00000000\nmov r12, 0x0000000000000000\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshld r14w, r15w, cl\ncmovo rsp, r11\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshld r13d, r15d, cl\ncmovo r8, r11\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshld r12, r15, cl\ncmovo r9, r11\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_A5_5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"RBX\": \"1\",\n    \"RDX\": \"1\"\n  }\n}\n%endif\n\nmov cl, 2\nmov r15, -1\nmov r14, 0x4141414141414000\nmov r13, 0xFFFFFFFF40000000\nmov r12, 0x4000000000000000\n\nmov rax, 0\nmov rbx, 0\nmov rdx, 0\nmov rsi, 1\n\nshld r14w, r15w, cl\ncmovc rax, rsi\nshld r13d, r15d, cl\ncmovc rbx, rsi\nshld r12, r15, cl\ncmovc rdx, rsi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_A5_6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"RBX\": \"1\",\n    \"RDX\": \"1\"\n  }\n}\n%endif\n\nmov cl, 2\nmov r15, 0\nmov r14, 0x4141414141414000\nmov r13, 0xFFFFFFFF40000000\nmov r12, 0x4000000000000000\n\nmov rax, 0\nmov rbx, 0\nmov rdx, 0\nmov rsi, 1\n\nshld r14w, r15w, cl\ncmovz rax, rsi\nshld r13d, r15d, cl\ncmovz rbx, rsi\nshld r12, r15, cl\ncmovz rdx, rsi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_A5_7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"RBX\": \"1\",\n    \"RDX\": \"1\"\n  }\n}\n%endif\n\nmov cl, 2\nmov r15, 0\nmov r14, 0x4141414141412000\nmov r13, 0xFFFFFFFF20000000\nmov r12, 0x2000000000000000\n\nmov rax, 0\nmov rbx, 0\nmov rdx, 0\nmov rsi, 1\n\nshld r14w, r15w, cl\ncmovs rax, rsi\nshld r13d, r15d, cl\ncmovs rbx, rsi\nshld r12, r15, cl\ncmovs rdx, rsi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_AB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x1F\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nmov r13, 1\nbts word [rdx], r13w\ncfmerge\n\n; Ensure it is set\nmov r13, 1\nbt word [rdx], r13w\ncfmerge\n\nmov r13, 32\nbts dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nmov r13, 64 * 3\nbts qword [rdx], r13\ncfmerge\n\nmov r13, 64 * 3\nbt qword [rdx], r13\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_AB_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x1F\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nlea rdx, [rdx + 8 * 3 + 4]\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nmov r13, -1\nbts word [rdx], r13w\ncfmerge\n\n; Ensure it is set\nmov r13, -1\nbt word [rdx], r13w\ncfmerge\n\nmov r13, -32\nbts dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nmov r13, -64 * 3\nbts qword [rdx], r13\ncfmerge\n\nmov r13, -64 * 3\nbt qword [rdx], r13\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_AB_2_Atomic.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x1F\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nlea rdx, [rdx + 8 * 3 + 4]\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nmov r13, -1\nlock bts word [rdx], r13w\ncfmerge\n\n; Ensure it is set\nmov r13, -1\nbt word [rdx], r13w\ncfmerge\n\nmov r13, -32\nlock bts dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nmov r13, -64 * 3\nlock bts qword [rdx], r13\ncfmerge\n\nmov r13, -64 * 3\nbt qword [rdx], r13\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_AB_Atomic.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x1F\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nmov r13, 1\nlock bts word [rdx], r13w\ncfmerge\n\n; Ensure it is set\nmov r13, 1\nbt word [rdx], r13w\ncfmerge\n\nmov r13, 32\nlock bts dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nmov r13, 64 * 3\nlock bts qword [rdx], r13\ncfmerge\n\nmov r13, 64 * 3\nbt qword [rdx], r13\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_AC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434457585847\",\n    \"RBX\": \"0x6162636477786566\",\n    \"RCX\": \"0x9596979897988182\",\n    \"RDX\": \"0x939495969798A1A2\",\n    \"RSI\": \"0xB1B2B3B4B5B6B7B8\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8182838485868788\nmov [rdx + 8 * 4], rax\nmov rax, 0x9192939495969798\nmov [rdx + 8 * 5], rax\nmov rax, 0xA1A2A3A4A5A6A7A8\nmov [rdx + 8 * 6], rax\nmov rax, 0xB1B2B3B4B5B6B7B8\nmov [rdx + 8 * 7], rax\n\nmov rax, [rdx + 8 * 1]\nshrd word [rdx + 8 * 0 + 0], ax, 8\nshrd word [rdx + 8 * 0 + 2], ax, 16\nshrd word [rdx + 8 * 0 + 4], ax, 32\n\nmov rax, [rdx + 8 * 3]\nshrd dword [rdx + 8 * 2 + 0], eax, 16\nshrd dword [rdx + 8 * 2 + 4], eax, 32\n\nmov rax, [rdx + 8 * 5]\nshrd qword [rdx + 8 * 4 + 0], rax, 16\nshrd qword [rdx + 8 * 4 + 0], rax, 32\nshrd qword [rdx + 8 * 6 + 0], rax, 48\nshrd qword [rdx + 8 * 7 + 0], rax, 64\n\nmov rax, qword [rdx + 8 * 0]\nmov rbx, qword [rdx + 8 * 2]\nmov rcx, qword [rdx + 8 * 4]\nmov rsi, qword [rdx + 8 * 7]\nmov rdx, qword [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_AC_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xFFFFFFFFFFFFFFFF\",\n    \"R14\": \"0x4141414141410000\",\n    \"R13\": \"0\",\n    \"R12\": \"0\",\n    \"R11\": \"0x00000000FFFFFFFF\"\n  }\n}\n%endif\n\nmov r15, -1\nmov r14, 0x4141414141410000\nmov r13, 0\nmov r12, 0\nmov r11, -1\n\nshrd r14w, r15w, 0\nshrd r13d, r15d, 0\nshrd r12, r15, 0\nshrd r11d, r15d, 0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_AD.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434457585847\",\n    \"RBX\": \"0x6162636477786566\",\n    \"RCX\": \"0x9596979897988182\",\n    \"RDX\": \"0x939495969798A1A2\",\n    \"RSI\": \"0xB1B2B3B4B5B6B7B8\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8182838485868788\nmov [rdx + 8 * 4], rax\nmov rax, 0x9192939495969798\nmov [rdx + 8 * 5], rax\nmov rax, 0xA1A2A3A4A5A6A7A8\nmov [rdx + 8 * 6], rax\nmov rax, 0xB1B2B3B4B5B6B7B8\nmov [rdx + 8 * 7], rax\n\nmov rax, [rdx + 8 * 1]\nmov cl, 8\nshrd word [rdx + 8 * 0 + 0], ax, cl\nmov cl, 16\nshrd word [rdx + 8 * 0 + 2], ax, cl\nmov cl, 32\nshrd word [rdx + 8 * 0 + 4], ax, cl\n\nmov rax, [rdx + 8 * 3]\nmov cl, 16\nshrd dword [rdx + 8 * 2 + 0], eax, cl\nmov cl, 32\nshrd dword [rdx + 8 * 2 + 4], eax, cl\n\nmov rax, [rdx + 8 * 5]\nmov cl, 16\nshrd qword [rdx + 8 * 4 + 0], rax, cl\nmov cl, 32\nshrd qword [rdx + 8 * 4 + 0], rax, cl\nmov cl, 48\nshrd qword [rdx + 8 * 6 + 0], rax, cl\nmov cl, 64\nshrd qword [rdx + 8 * 7 + 0], rax, cl\n\nmov rax, qword [rdx + 8 * 0]\nmov rbx, qword [rdx + 8 * 2]\nmov rcx, qword [rdx + 8 * 4]\nmov rsi, qword [rdx + 8 * 7]\nmov rdx, qword [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_AD_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xFFFFFFFFFFFFFFFF\",\n    \"R14\": \"0x4141414141410000\",\n    \"R13\": \"0\",\n    \"R12\": \"0\",\n    \"R11\": \"0x00000000FFFFFFFF\"\n  }\n}\n%endif\n\nmov cl, 0\nmov r15, -1\nmov r14, 0x4141414141410000\nmov r13, 0\nmov r12, 0\nmov r11, -1\n\nshrd r14w, r15w, cl\nshrd r13d, r15d, cl\nshrd r12, r15, cl\nshrd r11d, r15d, cl\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_AD_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xFFFFFFFFFFFFFFFF\",\n    \"R14\": \"0x4141414141410000\",\n    \"R13\": \"0\",\n    \"R12\": \"0\",\n    \"R11\": \"0\"\n  }\n}\n%endif\n\nmov cl, 0\nmov r15, -1\nmov r14, 0x4141414141410000\nmov r13, 0\nmov r12, 0\nmov r11, 0\n\n; Get the incoming flags\nmov rax, 0\nlahf\nmov r11, rax\n\nshrd r14w, r15w, cl\nshrd r13d, r15d, cl\nshrd r12, r15, cl\n\n; Get the outgoing flags\n; None should have changed\nmov rax, 0\nlahf\nxor r11, rax\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_AD_4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"r10\": \"1\",\n    \"RBX\": \"1\",\n    \"RDX\": \"1\",\n    \"RSI\": \"1\",\n    \"RBP\": \"1\",\n    \"RSP\": \"0\",\n    \"R8\":  \"0\",\n    \"r9\":  \"0\"\n  }\n}\n%endif\n\nmov cl, 1\nmov r15, -1\nmov r14, 0xFFFFFFFFFFFF0000\nmov r13, 0xFFFFFFFF00000000\nmov r12, 0\n\nmov r10, 0\nmov rbx, 0\nmov rdx, 0\n\nmov rsi, 0\nmov rdi, 0\nmov rbp, 0\n\nmov rsp, 0\nmov r8, 0\nmov r9, 0\n\nmov r11, 1\n\n; Sign from 0->1  should set OF\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshrd r14w, r15w, cl\ncmovo r10, r11\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshrd r13d, r15d, cl\ncmovo rbx, r11\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshrd r12, r15, cl\ncmovo rdx, r11\n\n; Sign from 1->0 should set OF\nmov r15, 0\nmov r14, 0xFFFFFFFFFFFF8000\nmov r13, 0xFFFFFFFF80000000\nmov r12, 0x8000000000000000\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshrd r14w, r15w, cl\ncmovo rsi, r11\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshrd r13d, r15d, cl\ncmovo rdi, r11\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshrd r12, r15, cl\ncmovo rbp, r11\n\n; Sign from 0->0 should NOT set OF\nmov r15, 0xFFFFFFFFFFFFFFFE\nmov r14, 0xFFFFFFFFFFFF0000\nmov r13, 0xFFFFFFFF00000000\nmov r12, 0x0000000000000000\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshrd r14w, r15w, cl\ncmovo rsp, r11\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshrd r13d, r15d, cl\ncmovo r8, r11\n\n; Let's clear OF really quick\nmov rax, 0\nror rax, 1\n\nshrd r12, r15, cl\ncmovo r9, r11\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_AD_5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"RBX\": \"1\",\n    \"RDX\": \"1\"\n  }\n}\n%endif\n\nmov cl, 2\nmov r15, -1\nmov r14, 0x4141414141410002\nmov r13, 0xFFFFFFFF00000002\nmov r12, 0x0000000000000002\n\nmov rax, 0\nmov rbx, 0\nmov rdx, 0\nmov rsi, 1\n\nshrd r14w, r15w, cl\ncmovc rax, rsi\nshrd r13d, r15d, cl\ncmovc rbx, rsi\nshrd r12, r15, cl\ncmovc rdx, rsi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_AD_6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"RBX\": \"1\",\n    \"RDX\": \"1\"\n  }\n}\n%endif\n\nmov cl, 2\nmov r15, 0\nmov r14, 0x4141414141410002\nmov r13, 0xFFFFFFFF00000002\nmov r12, 0x0000000000000002\n\nmov rax, 0\nmov rbx, 0\nmov rdx, 0\nmov rsi, 1\n\nshrd r14w, r15w, cl\ncmovz rax, rsi\nshrd r13d, r15d, cl\ncmovz rbx, rsi\nshrd r12, r15, cl\ncmovz rdx, rsi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_AD_7.asm",
    "content": "\n%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"RBX\": \"1\",\n    \"RDX\": \"1\"\n  }\n}\n%endif\n\nmov cl, 2\nmov r15, 0xFFFFFFFFFFFFFFF2\nmov r14, 0x4141414141410000\nmov r13, 0xFFFFFFFF00000000\nmov r12, 0x0000000000000000\n\nmov rax, 0\nmov rbx, 0\nmov rdx, 0\nmov rsi, 1\n\nshrd r14w, r15w, cl\ncmovs rax, rsi\nshrd r13d, r15d, cl\ncmovs rbx, rsi\nshrd r12, r15, cl\ncmovs rdx, rsi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_AF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x5C00\",\n    \"RBX\": \"0x54D45400\",\n    \"RSI\": \"0x4ECE4DCD4CCC4C00\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r15 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r15 + 8 * 2], rax\n\nmov rax, 0x0\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\n\nmov ax, -128\nimul ax, word [r15 + 8 * 0 + 0]\nmov word [r15 + 8 * 3 + 0], ax\n\nmov eax, -128\nimul eax, dword [r15 + 8 * 1 + 0]\nmov dword [r15 + 8 * 4 + 0], eax\n\nmov rax, -128\nimul rax, qword [r15 + 8 * 2 + 0]\nmov rsi, rax\n\nmov rax, [r15 + 8 * 3]\nmov rbx, [r15 + 8 * 4]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_AF_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x000f000000c00030\"\n  }\n}\n%endif\n\n; Uses CX and BX and stores result in r15\n; OF:CF\n%macro ofcfmerge 0\n  lahf\n\n  ; Load OF\n  mov rbx, 0\n  seto bl\n\n  shl r15, 1\n  or r15, rbx\n  shl r15, 1\n\n  ; Insert CF\n  shr ax, 8\n  and rax, 1\n  or r15, rax\n%endmacro\n\nmov r8, 0xe0000000\nmov r15, 0\n\n; Negative * Negative\nmov eax, 0x00008000\nmov ebx, 0x00008000\nimul ax, bx\nofcfmerge\n\nmov eax, 0x80000000\nmov ebx, 0x80000000\nimul eax, ebx\nofcfmerge\n\n; Positive * Positive\nmov rax, 128\nmov rbx, 32\nimul ax, bx\nofcfmerge\n\nmov rax, 128\nmov rbx, 32\nimul eax, ebx\nofcfmerge\n\nmov rax, 128\nmov rbx, 32\nimul rax, rbx\nofcfmerge\n\n; Negative * Positive\nmov rax, -128\nmov rbx, 32\nimul ax, bx\nofcfmerge\n\nmov rax, -128\nmov rbx, 32\nimul eax, ebx\nofcfmerge\n\nmov rax, -128\nmov rbx, 32\nimul rax, rbx\nofcfmerge\n\n; Positive * Negative\nmov rax, 128\nmov rbx, -32\nimul ax, bx\nofcfmerge\n\nmov rax, 128\nmov rbx, -32\nimul eax, ebx\nofcfmerge\n\nmov rax, 128\nmov rbx, -32\nimul rax, rbx\nofcfmerge\n\n; Negative * Negative\nmov rax, -128\nmov rbx, -32\nimul ax, bx\nofcfmerge\n\nmov rax, -128\nmov rbx, -32\nimul eax, ebx\nofcfmerge\n\nmov rax, -128\nmov rbx, -32\nimul rax, rbx\nofcfmerge\n\n; Positive * Positive Overflow\nmov rax, 128\nmov rbx, 256\nimul ax, bx\nofcfmerge\n\nmov rax, 128\nmov rbx, 256\nimul eax, ebx\nofcfmerge\n\nmov rax, 128\nmov rbx, 256\nimul rax, rbx\nofcfmerge\n\n; Negative * Positive Overflow\nmov rax, -128\nmov rbx, 256\nimul ax, bx\nofcfmerge\n\nmov rax, -128\nmov rbx, 256\nimul eax, ebx\nofcfmerge\n\nmov rax, -128\nmov rbx, 256\nimul rax, rbx\nofcfmerge\n\n; Positive * Negative Overflow\nmov rax, 128\nmov rbx, -256\nimul ax, bx\nofcfmerge\n\n\n; XXX: Claiming this is an overflow\nmov rax, 128\nmov rbx, -256\nimul eax, ebx\nofcfmerge\n\nmov rax, 128\nmov rbx, -256\nimul rax, rbx\nofcfmerge\n\n; Negative * Negative Overflow\nmov rax, -128\nmov rbx, -256\nimul ax, bx\nofcfmerge\n\nmov rax, -128\nmov rbx, -256\nimul eax, ebx\nofcfmerge\n\nmov rax, -128\nmov rbx, -256\nimul rax, rbx\nofcfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546FF48\",\n    \"RBX\": \"0x51525354FFFF5758\",\n    \"RCX\": \"0xFFFFFFFF65666768\",\n    \"RDX\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RBP\": \"0x4748\",\n    \"RSI\": \"0x55565758\",\n    \"RDI\": \"0x6162636465666768\",\n    \"RSP\": \"0x7172737475767778\",\n    \"R8\": \"0x7172737475767778\"\n  }\n}\n%endif\n\nmov r10, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r10 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r10 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r10 + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [r10 + 8 * 3], rax\n\nmov rax, 0\nmov [r10 + 8 * 4], rax\nmov [r10 + 8 * 5], rax\nmov [r10 + 8 * 6], rax\nmov [r10 + 8 * 7], rax\nmov [r10 + 8 * 8], rax\n\n; False\nmov rax, 0\nmov rcx, 0xFF\ncmpxchg [r10 + 8 * 0 + 0], cl\nmov [r10 + 8 * 4 + 0], al\n\n; True\nmov rax, 0x47\nmov rcx, 0xFF\ncmpxchg [r10 + 8 * 0 + 1], cl\nmov [r10 + 8 * 4 + 1], al\n\n; False\nmov rax, 0\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 1 + 0], cx\nmov [r10 + 8 * 5 + 0], ax\n\n; True\nmov rax, 0x5556\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 1 + 2], cx\nmov [r10 + 8 * 5 + 2], ax\n\n; False\nmov rax, 0\nmov rcx, 0xFFFFFFFF\ncmpxchg [r10 + 8 * 2 + 0], ecx\nmov [r10 + 8 * 6 + 0], eax\n\n; True\nmov rax, 0x61626364\nmov rcx, 0xFFFFFFFF\ncmpxchg [r10 + 8 * 2 + 4], ecx\nmov [r10 + 8 * 6 + 4], eax\n\n; False\nmov rax, 0\nmov rcx, 0xFFFFFFFFFFFFFFFF\ncmpxchg [r10 + 8 * 3 + 0], rcx\nmov [r10 + 8 * 7 + 0], rax\n\n; True\nmov rax, 0x7172737475767778\nmov rcx, 0xFFFFFFFFFFFFFFFF\ncmpxchg [r10 + 8 * 3 + 0], rcx\nmov [r10 + 8 * 8], rax\n\nmov rax, [r10 + 8 * 0]\nmov rbx, [r10 + 8 * 1]\nmov rcx, [r10 + 8 * 2]\nmov rdx, [r10 + 8 * 3]\nmov rbp, [r10 + 8 * 4]\nmov rsi, [r10 + 8 * 5]\nmov rdi, [r10 + 8 * 6]\nmov rsp, [r10 + 8 * 7]\nmov r8, [r10 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B0_10.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xffffffffffff9748\",\n    \"R14\": \"0xffffffffffff4648\",\n    \"R13\": \"0xffffffffffff8748\",\n    \"R12\": \"0xffffffffffff4648\",\n    \"R11\": \"0x0000000045468748\",\n    \"R10\": \"0xffffffff45464648\",\n    \"R9\":  \"0x4142434445468648\",\n    \"R8\":  \"0x4142434445464648\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; 8bit\nmov rcx, 0x4142434445466148\n\n; Not a match\nmov rax, 0xFFFFFFFFFFFFFF47\nmov rbx, 0\ncmpxchg cl, bl\nlahf\nmov r15, rax\n\n; Match\nmov rax, 0xFFFFFFFFFFFFFF48\nmov rbx, 0\ncmpxchg cl, bl\nlahf\nmov r14, rax\n\n; 16bit\nmov rcx, 0x4142434445466148\n\n; Not a match\nmov rax, 0xFFFFFFFFFFFF4748\nmov rbx, 0\ncmpxchg cx, bx\nlahf\nmov r13, rax\n\n; Match\nmov rax, 0xFFFFFFFFFFFF6148\nmov rbx, 0\ncmpxchg cx, bx\nlahf\nmov r12, rax\n\n; 32bit\nmov rcx, 0x4142434445466148\n\n; Not a match\nmov rax, 0xFFFFFFFF45464748\nmov rbx, 0\ncmpxchg ecx, ebx\nlahf\nmov r11, rax\n\n; Match\nmov rax, 0xFFFFFFFF45466148\nmov rbx, 0\ncmpxchg ecx, ebx\nlahf\nmov r10, rax\n\n; 64bit\nmov rcx, 0x4142434445466148\n\n; Not a match\nmov rax, 0xFFFFFFFF45464748\nmov rbx, 0\ncmpxchg rcx, rbx\nlahf\nmov r9, rax\n\n; Match\nmov rax, 0x4142434445466148\nmov rbx, 0\ncmpxchg rcx, rbx\nlahf\nmov r8, rax\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B0_11.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x4142434445466148\",\n    \"R14\": \"0x4142434445466100\",\n    \"R13\": \"0x4142434445466148\",\n    \"R12\": \"0x4142434445460000\",\n    \"R11\": \"0x4142434445466148\",\n    \"R10\": \"0x0000000000000000\",\n    \"R9\":  \"0x4142434445466148\",\n    \"R8\":  \"0x0000000000000000\"\n  }\n}\n%endif\n\n; 8bit\nmov rcx, 0x4142434445466148\n\n; Not a match\nmov rax, 0xFFFFFFFFFFFFFF47\nmov rbx, 0\ncmpxchg cl, bl\nmov r15, rcx\n\n; Match\nmov rax, 0xFFFFFFFFFFFFFF48\nmov rbx, 0\ncmpxchg cl, bl\nmov r14, rcx\n\n; 16bit\nmov rcx, 0x4142434445466148\n\n; Not a match\nmov rax, 0xFFFFFFFFFFFF4748\nmov rbx, 0\ncmpxchg cx, bx\nmov r13, rcx\n\n; Match\nmov rax, 0xFFFFFFFFFFFF6148\nmov rbx, 0\ncmpxchg cx, bx\nmov r12, rcx\n\n; 32bit\nmov rcx, 0x4142434445466148\n\n; Not a match\nmov rax, 0xFFFFFFFF45464748\nmov rbx, 0\ncmpxchg ecx, ebx\nmov r11, rcx\n\n; Match\nmov rax, 0xFFFFFFFF45466148\nmov rbx, 0\ncmpxchg ecx, ebx\nmov r10, rcx\n\n; 64bit\nmov rcx, 0x4142434445466148\n\n; Not a match\nmov rax, 0xFFFFFFFF45464748\nmov rbx, 0\ncmpxchg rcx, rbx\nmov r9, rcx\n\n; Match\nmov rax, 0x4142434445466148\nmov rbx, 0\ncmpxchg rcx, rbx\nmov r8, rcx\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B0_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000055565758\",\n    \"RBX\": \"0x5152535455565758\",\n    \"RCX\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov r10, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov rbx, 0x5152535455565758\nmov rcx, 0x6162636465666768\ncmpxchg ebx, ecx\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B0_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546FF48\",\n    \"RBX\": \"0x51525354FFFF5758\",\n    \"RCX\": \"0xFFFFFFFF65666768\",\n    \"RDX\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RBP\": \"0x4748\",\n    \"RSI\": \"0x55565758\",\n    \"RDI\": \"0x6162636465666768\",\n    \"RSP\": \"0x7172737475767778\",\n    \"R8\": \"0x7172737475767778\"\n  }\n}\n%endif\n\n; Offset everything by 1 byte\n; Everything stays within 16byte boundary but unaligned\nmov r10, 0xe0000001\n\nmov rax, 0x4142434445464748\nmov [r10 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r10 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r10 + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [r10 + 8 * 3], rax\n\nmov rax, 0\nmov [r10 + 8 * 4], rax\nmov [r10 + 8 * 5], rax\nmov [r10 + 8 * 6], rax\nmov [r10 + 8 * 7], rax\nmov [r10 + 8 * 8], rax\n\n; False\nmov rax, 0\nmov rcx, 0xFF\ncmpxchg [r10 + 8 * 0 + 0], cl\nmov [r10 + 8 * 4 + 0], al\n\n; True\nmov rax, 0x47\nmov rcx, 0xFF\ncmpxchg [r10 + 8 * 0 + 1], cl\nmov [r10 + 8 * 4 + 1], al\n\n; False\nmov rax, 0\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 1 + 0], cx\nmov [r10 + 8 * 5 + 0], ax\n\n; True\nmov rax, 0x5556\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 1 + 2], cx\nmov [r10 + 8 * 5 + 2], ax\n\n; False\nmov rax, 0\nmov rcx, 0xFFFFFFFF\ncmpxchg [r10 + 8 * 2 + 0], ecx\nmov [r10 + 8 * 6 + 0], eax\n\n; True\nmov rax, 0x61626364\nmov rcx, 0xFFFFFFFF\ncmpxchg [r10 + 8 * 2 + 4], ecx ; Wrong\nmov [r10 + 8 * 6 + 4], eax\n\n; False\nmov rax, 0\nmov rcx, 0xFFFFFFFFFFFFFFFF\ncmpxchg [r10 + 8 * 3 + 0], rcx\nmov [r10 + 8 * 7 + 0], rax\n\n; True\nmov rax, 0x7172737475767778\nmov rcx, 0xFFFFFFFFFFFFFFFF\ncmpxchg [r10 + 8 * 3 + 0], rcx\nmov [r10 + 8 * 8], rax\n\nmov rax, [r10 + 8 * 0]\nmov rbx, [r10 + 8 * 1]\nmov rcx, [r10 + 8 * 2]\nmov rdx, [r10 + 8 * 3]\nmov rbp, [r10 + 8 * 4]\nmov rsi, [r10 + 8 * 5]\nmov rdi, [r10 + 8 * 6]\nmov rsp, [r10 + 8 * 7]\nmov r8, [r10 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B0_4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243444546FF48\",\n    \"RBX\": \"0x51525354FFFF5758\",\n    \"RCX\": \"0xFFFFFFFF65666768\",\n    \"RDX\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RBP\": \"0x4748\",\n    \"RSI\": \"0x55565758\",\n    \"RDI\": \"0x6162636465666768\",\n    \"RSP\": \"0x7172737475767778\",\n    \"R8\": \"0x7172737475767778\"\n  }\n}\n%endif\n\n; Offset everything by 15 bytes\nmov r10, 0xe000000f\n\nmov rax, 0x4142434445464748\nmov [r10 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r10 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r10 + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [r10 + 8 * 3], rax\n\nmov rax, 0\nmov [r10 + 8 * 4], rax\nmov [r10 + 8 * 5], rax\nmov [r10 + 8 * 6], rax\nmov [r10 + 8 * 7], rax\nmov [r10 + 8 * 8], rax\n\n; False\nmov rax, 0\nmov rcx, 0xFF\ncmpxchg [r10 + 8 * 0 + 0], cl\nmov [r10 + 8 * 4 + 0], al\n\n; True\nmov rax, 0x47\nmov rcx, 0xFF\ncmpxchg [r10 + 8 * 0 + 1], cl\nmov [r10 + 8 * 4 + 1], al\n\n; False\nmov rax, 0\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 1 + 0], cx\nmov [r10 + 8 * 5 + 0], ax\n\n; True\nmov rax, 0x5556\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 1 + 2], cx\nmov [r10 + 8 * 5 + 2], ax\n\n; False\nmov rax, 0\nmov rcx, 0xFFFFFFFF\ncmpxchg [r10 + 8 * 2 + 0], ecx\nmov [r10 + 8 * 6 + 0], eax\n\n; True\nmov rax, 0x61626364\nmov rcx, 0xFFFFFFFF\ncmpxchg [r10 + 8 * 2 + 4], ecx\nmov [r10 + 8 * 6 + 4], eax\n\n; False\nmov rax, 0\nmov rcx, 0xFFFFFFFFFFFFFFFF\ncmpxchg [r10 + 8 * 3 + 0], rcx\nmov [r10 + 8 * 7 + 0], rax\n\n; True\nmov rax, 0x7172737475767778\nmov rcx, 0xFFFFFFFFFFFFFFFF\ncmpxchg [r10 + 8 * 3 + 0], rcx\nmov [r10 + 8 * 8], rax\n\nmov rax, [r10 + 8 * 0]\nmov rbx, [r10 + 8 * 1]\nmov rcx, [r10 + 8 * 2]\nmov rdx, [r10 + 8 * 3]\nmov rbp, [r10 + 8 * 4]\n\nmov rsi, [r10 + 8 * 5]\nmov rdi, [r10 + 8 * 6]\n\nmov rsp, [r10 + 8 * 7]\nmov r8, [r10 + 8 * 8]\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B0_5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x5152535455FFFF58\",\n    \"RCX\": \"0x616263FFFF666768\",\n    \"RDX\": \"0xFF72737475767778\",\n    \"RBP\": \"0x81828384858687FF\",\n    \"RSI\": \"0xB1B2B3B4B5B6B7B8\",\n    \"RDI\": \"0xC1C2C3C4C5C6C7C8\",\n    \"RSP\": \"0xFF42434445464748\",\n    \"R8\":  \"0x51525354555657FF\",\n    \"R9\":  \"0x6465646556574647\",\n    \"R11\": \"0x0000000000005841\",\n    \"R12\": \"0xC8B1A89188718871\"\n  }\n}\n%endif\n\nmov r10, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r10 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r10 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r10 + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [r10 + 8 * 3], rax\nmov rax, 0x8182838485868788\nmov [r10 + 8 * 4], rax\nmov rax, 0x9192939495969798\nmov [r10 + 8 * 5], rax\nmov rax, 0xA1A2A3A4A5A6A7A8\nmov [r10 + 8 * 6], rax\nmov rax, 0xB1B2B3B4B5B6B7B8\nmov [r10 + 8 * 7], rax\nmov rax, 0xC1C2C3C4C5C6C7C8\nmov [r10 + 8 * 8], rax\n\nmov rax, 0\nmov [r10 + 8 * 9], rax\nmov [r10 + 8 * 10], rax\nmov [r10 + 8 * 11], rax\nmov [r10 + 8 * 12], rax\nmov [r10 + 8 * 13], rax\n\nmov rax, 0x4142434445464748\nmov [r10 + 8 * 15], rax\nmov rax, 0x5152535455565758\nmov [r10 + 8 * 16], rax\n\n; 16bit unaligned edges test\n; Offsets   | Test                                |\n; =============================================================\n; 1         | Misaligned inside 32bit region      | 32bit CAS\n; 3         | Misaligned through to 64bit region  | 64bit CAS\n; 7         | Misaligned through to 128bit region | 128bit CAS\n; 15        | Misaligned through to 256bit region | Dual 8bit/64bit CAS *CAN TEAR*\n; 63        | Misaligned across 64byte cachelines | Dual 8bit/64bit CAS *CAN TEAR*\n\n; Offset 1\n; False\nmov rax, 0\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 0 + 1], cx\nmov [r10 + 8 * 9 + 0], ax\n\n; True\nmov rax, 0x5657\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 1 + 1], cx\nmov [r10 + 8 * 9 + 2], ax\n\n; Offset 3\n; False\nmov rax, 0\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 2 + 3], cx\nmov [r10 + 8 * 9 + 4], ax\n\n; True\nmov rax, 0x6465\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 2 + 3], cx\nmov [r10 + 8 * 9 + 6], ax\n\n; Offset 7\n; False\nmov rax, 0\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 3 + 7], cx\nmov [r10 + 8 * 10 + 0], ax\n\n; True\nmov rax, 0x8871\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 3 + 7], cx\nmov [r10 + 8 * 10 + 2], ax\n\n; Offset 15\n; False\nmov rax, 0\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 4 + 15], cx\nmov [r10 + 8 * 10 + 4], ax\n\n; True\nmov rax, 0x8871\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 4 + 15], cx\nmov [r10 + 8 * 10 + 6], ax\n\n; Offset 63\n; False\nmov rax, 0\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 7 + 7], cx\nmov [r10 + 8 * 10 + 6], ax\n\n; True\nmov rax, 0x5841\nmov rcx, 0xFFFF\ncmpxchg [r10 + 8 * 15 + 7], cx\nmov [r10 + 8 * 11 + 0], ax\n\nmov rax, [r10 + 8 * 0]\nmov rbx, [r10 + 8 * 1]\nmov rcx, [r10 + 8 * 2]\nmov rdx, [r10 + 8 * 3]\nmov rbp, [r10 + 8 * 4]\n\nmov rsi, [r10 + 8 * 7]\nmov rdi, [r10 + 8 * 8]\n\nmov rsp, [r10 + 8 * 15]\nmov r8, [r10 + 8 * 16]\n\nmov r9, [r10 + 8 * 9]\nmov r12, [r10 + 8 * 10]\nmov r11, [r10 + 8 * 11]\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B0_6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x414243ffffffff48\",\n    \"RBX\": \"0x5152535455565758\",\n    \"RCX\": \"0xffffff6465666768\",\n    \"RDX\": \"0x71727374757677ff\",\n    \"RBP\": \"0xffffff8485868788\",\n    \"RSI\": \"0xffffffb4b5b6b7b8\",\n    \"RDI\": \"0xc1c2c3c4c5c6c7ff\",\n    \"RSP\": \"0x4445464744454647\",\n    \"R8\":  \"0x7861626378616263\",\n    \"R9\":  \"0x9881828398818283\",\n    \"R10\": \"0xc8b1b2b3c8b1b2b3\"\n  }\n}\n%endif\n\nmov r10, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r10 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r10 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r10 + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [r10 + 8 * 3], rax\nmov rax, 0x8182838485868788\nmov [r10 + 8 * 4], rax\nmov rax, 0x9192939495969798\nmov [r10 + 8 * 5], rax\nmov rax, 0xA1A2A3A4A5A6A7A8\nmov [r10 + 8 * 6], rax\nmov rax, 0xB1B2B3B4B5B6B7B8\nmov [r10 + 8 * 7], rax\nmov rax, 0xC1C2C3C4C5C6C7C8\nmov [r10 + 8 * 8], rax\n\nmov rax, 0\nmov [r10 + 8 * 9], rax\nmov [r10 + 8 * 10], rax\nmov [r10 + 8 * 11], rax\nmov [r10 + 8 * 12], rax\nmov [r10 + 8 * 13], rax\n\nmov rax, 0x4142434445464748\nmov [r10 + 8 * 15], rax\nmov rax, 0x5152535455565758\nmov [r10 + 8 * 16], rax\n\n; 32bit unaligned edges test\n; Offsets       | Test                                |\n; =============================================================\n; 1,2,3         | Misaligned through to 64bit region  | 64bit CAS\n; 5,6,7,9,10,11 | Misaligned through to 128bit region | 128bit CAS\n; 13,14,15      | Misaligned through to 256bit region | Dual 32bit/64bit CAS *CAN TEAR*\n; 61,62,63      | Misaligned across 64byte cachelines | Dual 32bit/64bit CAS *CAN TEAR*\n\n; Offset 1\n; False\nmov rax, 0\nmov rcx, 0xFFFFFFFF\ncmpxchg [r10 + 8 * 0 + 1], ecx\nmov [r10 + 8 * 9 + 0], eax\n\n; True\nmov rax, 0x44454647\nmov rcx, 0xFFFFFFFF\ncmpxchg [r10 + 8 * 0 + 1], ecx\nmov [r10 + 8 * 9 + 4], eax\n\n; Offset 5\n; False\nmov rax, 0\nmov rcx, 0xFFFFFFFF\ncmpxchg [r10 + 8 * 2 + 5], ecx\nmov [r10 + 8 * 10 + 0], eax\n\n; True\nmov rax, 0x78616263\nmov rcx, 0xFFFFFFFF\ncmpxchg [r10 + 8 * 2 + 5], ecx\nmov [r10 + 8 * 10 + 4], eax\n\n; Offset 13\n; False\nmov rax, 0\nmov rcx, 0xFFFFFFFF\ncmpxchg [r10 + 8 * 4 + 5], ecx\nmov [r10 + 8 * 11 + 0], eax\n\n; True\nmov rax, 0x98818283\nmov rcx, 0xFFFFFFFF\ncmpxchg [r10 + 8 * 4 + 5], ecx\nmov [r10 + 8 * 11 + 4], eax\n\n; Offset 61\n; False\nmov rax, 0\nmov rcx, 0xFFFFFFFF\ncmpxchg [r10 + 8 * 7 + 5], ecx\nmov [r10 + 8 * 12 + 0], eax\n\n; Wrong\n; True\nmov rax, 0xC8B1B2B3\nmov rcx, 0xFFFFFFFF\ncmpxchg [r10 + 8 * 7 + 5], ecx\nmov [r10 + 8 * 12 + 4], eax\n\nmov rax, [r10 + 8 * 0]\nmov rbx, [r10 + 8 * 1]\nmov rcx, [r10 + 8 * 2]\nmov rdx, [r10 + 8 * 3]\nmov rbp, [r10 + 8 * 4]\nmov rsi, [r10 + 8 * 7]\nmov rdi, [r10 + 8 * 8]\nmov rsp, [r10 + 8 * 9]\n\nmov r8, [r10 + 8 * 10]\nmov r9, [r10 + 8 * 11]\nmov r10, [r10 + 8 * 12]\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B0_7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xffffffffffffff48\",\n    \"RBX\": \"0xffffffffffffffff\",\n    \"RCX\": \"0x61626364656667ff\",\n    \"RDI\": \"0xffffffffffffffb8\",\n    \"RSP\": \"0xc1c2c3c4c5c6c7ff\",\n    \"R8\":  \"0x6851525354555657\",\n    \"R9\":  \"0xc8b1b2b3b4b5b6b7\",\n    \"R10\": \"0xc8b1b2b3b4b5b6b7\"\n  }\n}\n%endif\n\nmov r10, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r10 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r10 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r10 + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [r10 + 8 * 3], rax\nmov rax, 0x8182838485868788\nmov [r10 + 8 * 4], rax\nmov rax, 0x9192939495969798\nmov [r10 + 8 * 5], rax\nmov rax, 0xA1A2A3A4A5A6A7A8\nmov [r10 + 8 * 6], rax\nmov rax, 0xB1B2B3B4B5B6B7B8\nmov [r10 + 8 * 7], rax\nmov rax, 0xC1C2C3C4C5C6C7C8\nmov [r10 + 8 * 8], rax\n\nmov rax, 0\nmov [r10 + 8 * 9], rax\nmov [r10 + 8 * 10], rax\nmov [r10 + 8 * 11], rax\nmov [r10 + 8 * 12], rax\nmov [r10 + 8 * 13], rax\n\nmov rax, 0x4142434445464748\nmov [r10 + 8 * 15], rax\nmov rax, 0x5152535455565758\nmov [r10 + 8 * 16], rax\n\n; 64bit unaligned edges test\n; Offsets       | Test                                |\n; =============================================================\n; [1,7]           | Misaligned through to 128bit region | 128bit CAS\n; [9,15], [57,63] | Misaligned through to 256bit region | Dual 64bit CAS\n\n; Offset 1\n; False\nmov rax, 0\nmov rcx, 0xFFFFFFFFFFFFFFFF\ncmpxchg [r10 + 8 * 0 + 1], rcx\nmov [r10 + 8 * 9 + 0], rax\n\n; True\nmov rax, 0x5841424344454647\nmov rcx, 0xFFFFFFFFFFFFFFFF\ncmpxchg [r10 + 8 * 0 + 1], rcx\nmov [r10 + 8 * 10], rax\n\n; Offset 9\n; False\nmov rax, 0\nmov rcx, 0xFFFFFFFFFFFFFFFF\ncmpxchg [r10 + 8 * 1 + 1], rcx\nmov [r10 + 8 * 9 + 0], rax\n\n; True\nmov rax, 0x6851525354555657\nmov rcx, 0xFFFFFFFFFFFFFFFF\ncmpxchg [r10 + 8 * 1 + 1], rcx\nmov [r10 + 8 * 10], rax\n\n; Offset 57\n; False\nmov rax, 0\nmov rcx, 0xFFFFFFFFFFFFFFFF\ncmpxchg [r10 + 8 * 7 + 1], rcx\nmov [r10 + 8 * 11 + 0], rax\n\n; True\nmov rax, 0xC8B1B2B3B4B5B6B7\nmov rcx, 0xFFFFFFFFFFFFFFFF\ncmpxchg [r10 + 8 * 7 + 1], rcx\nmov [r10 + 8 * 12], rax\n\nmov rax, [r10 + 8 * 0]\nmov rbx, [r10 + 8 * 1]\nmov rcx, [r10 + 8 * 2]\nmov rdi, [r10 + 8 * 7]\nmov rsp, [r10 + 8 * 8]\n\nmov r8, [r10 + 8 * 10]\nmov r9, [r10 + 8 * 11]\nmov r10, [r10 + 8 * 12]\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B0_8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x4142434445469748\",\n    \"R14\": \"0x4142434445464600\",\n    \"R13\": \"0x4142434445468748\",\n    \"R12\": \"0x4142434445464600\",\n    \"R11\": \"0x4142434445468748\",\n    \"R10\": \"0x4142434400004600\",\n    \"R9\":  \"0x4142434445468748\",\n    \"R8\":  \"0x0000000000004600\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; 8bit\nmov rax, 0x4142434445466148\nmov [rdx + 8 * 0], rax\n\n; Not a match\nmov rax, 0x47\nmov rbx, 0\ncmpxchg byte [rdx + 8 * 0], bl\nmov rax, [rdx + 8 * 0]\nlahf\nmov r15, rax\n\n; Match\nmov rax, 0x48\nmov rbx, 0\ncmpxchg byte [rdx + 8 * 0], bl\nmov rax, [rdx + 8 * 0]\nlahf\nmov r14, rax\n\n; 16bit\nmov rax, 0x4142434445466148\nmov [rdx + 8 * 0], rax\n\n; Not a match\nmov rax, 0x4748\nmov rbx, 0\ncmpxchg word [rdx + 8 * 0], bx\nmov rax, [rdx + 8 * 0]\nlahf\nmov r13, rax\n\n; Match\nmov rax, 0x6148\nmov rbx, 0\ncmpxchg word [rdx + 8 * 0], bx\nmov rax, [rdx + 8 * 0]\nlahf\nmov r12, rax\n\n; 32bit\nmov rax, 0x4142434445466148\nmov [rdx + 8 * 0], rax\n\n; Not a match\nmov rax, 0x45464748\nmov rbx, 0\ncmpxchg dword [rdx + 8 * 0], ebx\nmov rax, [rdx + 8 * 0]\nlahf\nmov r11, rax\n\n; Match\nmov rax, 0x45466148\nmov rbx, 0\ncmpxchg dword [rdx + 8 * 0], ebx\nmov rax, [rdx + 8 * 0]\nlahf\nmov r10, rax\n\n; 64bit\nmov rax, 0x4142434445466148\nmov [rdx + 8 * 0], rax\n\n; Not a match\nmov rax, 0x45464748\nmov rbx, 0\ncmpxchg qword [rdx + 8 * 0], rbx\nmov rax, [rdx + 8 * 0]\nlahf\nmov r9, rax\n\n; Match\nmov rax, 0x4142434445466148\nmov rbx, 0\ncmpxchg qword [rdx + 8 * 0], rbx\nmov rax, [rdx + 8 * 0]\nlahf\nmov r8, rax\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B0_9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xffffffffffff9748\",\n    \"R14\": \"0xffffffffffff4648\",\n    \"R13\": \"0xffffffffffff8748\",\n    \"R12\": \"0xffffffffffff4648\",\n    \"R11\": \"0x0000000045468748\",\n    \"R10\": \"0xffffffff45464648\",\n    \"R9\":  \"0x4142434445468648\",\n    \"R8\":  \"0x4142434445464648\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; 8bit\nmov rax, 0x4142434445466148\nmov [rdx + 8 * 0], rax\n\n; Not a match\nmov rax, 0xFFFFFFFFFFFFFF47\nmov rbx, 0\ncmpxchg byte [rdx + 8 * 0], bl\nlahf\nmov r15, rax\n\n; Match\nmov rax, 0xFFFFFFFFFFFFFF48\nmov rbx, 0\ncmpxchg byte [rdx + 8 * 0], bl\nlahf\nmov r14, rax\n\n; 16bit\nmov rax, 0x4142434445466148\nmov [rdx + 8 * 0], rax\n\n; Not a match\nmov rax, 0xFFFFFFFFFFFF4748\nmov rbx, 0\ncmpxchg word [rdx + 8 * 0], bx\nlahf\nmov r13, rax\n\n; Match\nmov rax, 0xFFFFFFFFFFFF6148\nmov rbx, 0\ncmpxchg word [rdx + 8 * 0], bx\nlahf\nmov r12, rax\n\n; 32bit\nmov rax, 0x4142434445466148\nmov [rdx + 8 * 0], rax\n\n; Not a match\nmov rax, 0xFFFFFFFF45464748\nmov rbx, 0\ncmpxchg dword [rdx + 8 * 0], ebx\nlahf\nmov r11, rax\n\n; Match\nmov rax, 0xFFFFFFFF45466148\nmov rbx, 0\ncmpxchg dword [rdx + 8 * 0], ebx\nlahf\nmov r10, rax\n\n; 64bit\nmov rax, 0x4142434445466148\nmov [rdx + 8 * 0], rax\n\n; Not a match\nmov rax, 0xFFFFFFFF45464748\nmov rbx, 0\ncmpxchg qword [rdx + 8 * 0], rbx\nlahf\nmov r9, rax\n\n; Match\nmov rax, 0x4142434445466148\nmov rbx, 0\ncmpxchg qword [rdx + 8 * 0], rbx\nlahf\nmov r8, rax\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xA\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nmov r13, 1\nbtr word [rdx], r13w\ncfmerge\n\n; Ensure it is set\nmov r13, 1\nbt word [rdx], r13w\ncfmerge\n\nmov r13, 32\nbtr dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nmov r13, 64 * 3\nbtr qword [rdx], r13\ncfmerge\n\nmov r13, 64 * 3\nbt qword [rdx], r13\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B3_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xA\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nlea rdx, [rdx + 8 * 3 + 4]\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nmov r13, -1\nbtr word [rdx], r13w\ncfmerge\n\n; Ensure it is set\nmov r13, -1\nbt word [rdx], r13w\ncfmerge\n\nmov r13, -32\nbtr dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nmov r13, -64 * 3\nbtr qword [rdx], r13\ncfmerge\n\nmov r13, -64 * 3\nbt qword [rdx], r13\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B3_2_Atomic.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xA\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nlea rdx, [rdx + 8 * 3 + 4]\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nmov r13, -1\nlock btr word [rdx], r13w\ncfmerge\n\n; Ensure it is set\nmov r13, -1\nbt word [rdx], r13w\ncfmerge\n\nmov r13, -32\nlock btr dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nmov r13, -64 * 3\nlock btr qword [rdx], r13\ncfmerge\n\nmov r13, -64 * 3\nbt qword [rdx], r13\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B3_Atomic.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xA\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nmov r13, 1\nlock btr word [rdx], r13w\ncfmerge\n\n; Ensure it is set\nmov r13, 1\nbt word [rdx], r13w\ncfmerge\n\nmov r13, 32\nlock btr dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nmov r13, 64 * 3\nlock btr qword [rdx], r13\ncfmerge\n\nmov r13, 64 * 3\nbt qword [rdx], r13\ncfmerge\n\nhlt\n\n\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x41424344454600FF\",\n    \"R14\": \"0x00000000000000FF\",\n    \"R13\": \"0x00000000000000FF\",\n    \"R12\": \"0x41424344454600FF\",\n    \"R11\": \"0x00000000000000FF\",\n    \"R10\": \"0x00000000000000FF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 0], rax\n\nmov r15, 0x4142434445464748\nmov r14, 0x4142434445464748\nmov r13, 0x4142434445464748\nmov r12, 0x4142434445464748\nmov r11, 0x4142434445464748\nmov r10, 0x4142434445464748\n\nmovzx r15w, byte [rdx + 8 * 0]\nmovzx r14d, byte [rdx + 8 * 0]\nmovzx r13,  byte [rdx + 8 * 0]\n\nmovzx r12w, al\nmovzx r11d, al\nmovzx r10,  al\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_B7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R14\": \"0x000000000000FFFF\",\n    \"R13\": \"0x000000000000FFFF\",\n    \"R12\": \"0x000000000000FFFF\",\n    \"R11\": \"0x000000000000FFFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 0], rax\n\nmov r14, 0x4142434445464748\nmov r13, 0x4142434445464748\nmov r12, 0x4142434445464748\nmov r11, 0x4142434445464748\n\nmovzx r14d, word [rdx + 8 * 0]\nmovzx r13,  word [rdx + 8 * 0]\n\nmovzx r12d, ax\nmovzx r11,  ax\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_BB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x1A\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nmov r13, 1\nbtc word [rdx], r13w\ncfmerge\n\n; Ensure it is set\nmov r13, 1\nbt word [rdx], r13w\ncfmerge\n\nmov r13, 32\nbtc dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nmov r13, 64 * 3\nbtc qword [rdx], r13\ncfmerge\n\nmov r13, 64 * 3\nbt qword [rdx], r13\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_BB_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x1A\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nlea rdx, [rdx + 8 * 3 + 4]\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nmov r13, -1\nbtc word [rdx], r13w\ncfmerge\n\n; Ensure it is set\nmov r13, -1\nbt word [rdx], r13w\ncfmerge\n\nmov r13, -32\nbtc dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nmov r13, -64 * 3\nbtc qword [rdx], r13\ncfmerge\n\nmov r13, -64 * 3\nbt qword [rdx], r13\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_BB_2_Atomic.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x1A\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nlea rdx, [rdx + 8 * 3 + 4]\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nmov r13, -1\nlock btc word [rdx], r13w\ncfmerge\n\n; Ensure it is set\nmov r13, -1\nbt word [rdx], r13w\ncfmerge\n\nmov r13, -32\nlock btc dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nmov r13, -64 * 3\nlock btc qword [rdx], r13\ncfmerge\n\nmov r13, -64 * 3\nbt qword [rdx], r13\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_BB_Atomic.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x1A\"\n  }\n}\n%endif\n\n%macro cfmerge 0\n\n; Get CF\nsbb r14, r14\nand r14, 1\n\n; Merge in to results\nshl r15, 1\nor r15, r14\n\n%endmacro\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFF80000000\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov rax, 0x01\nmov [rdx + 8 * 3], eax\nmov rax, 0x0\nmov [rdx + 8 * 3 + 4], eax\n\nxor r15, r15 ; Will contain our results\n\n; Test and set\nmov r13, 1\nlock btc word [rdx], r13w\ncfmerge\n\n; Ensure it is set\nmov r13, 1\nbt word [rdx], r13w\ncfmerge\n\nmov r13, 32\nlock btc dword [rdx], r13d\ncfmerge\n\nbt dword [rdx], r13d\ncfmerge\n\nmov r13, 64 * 3\nlock btc qword [rdx], r13\ncfmerge\n\nmov r13, 64 * 3\nbt qword [rdx], r13\ncfmerge\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_BC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xFFFFFFFFFFFF0000\",\n    \"R14\": \"0x0\",\n    \"R13\": \"0x0\",\n    \"R12\": \"0xFFFFFFFFFFFF0004\",\n    \"R11\": \"0x04\",\n    \"R10\": \"0x04\",\n    \"R9\":  \"0xFFFFFFFFFFFFFFFF\",\n    \"R8\":  \"0xFFFFFFFFFFFFFFFF\",\n    \"RSI\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 0], rax\nmov rax, 0x1010101010101010\nmov [rdx + 8 * 1], rax\nmov rax, 0\nmov [rdx + 8 * 2], rax\n\nmov r15, -1\nmov r14, -1\nmov r13, -1\nmov r12, -1\nmov r11, -1\nmov r10, -1\nmov r9,  -1\nmov r8,  -1\nmov rsi, -1\n\nbsf r15w, word  [rdx + 8 * 0]\nbsf r14d, dword [rdx + 8 * 0]\nbsf r13,  qword [rdx + 8 * 0]\n\nbsf r12w, word  [rdx + 8 * 1]\nbsf r11d, dword [rdx + 8 * 1]\nbsf r10,  qword [rdx + 8 * 1]\n\nbsf r9w, word  [rdx + 8 * 2]\nbsf r8d, dword [rdx + 8 * 2]\nbsf rsi, qword [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_BD.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0xFFFFFFFFFFFF000F\",\n    \"R14\": \"0x1F\",\n    \"R13\": \"0x3F\",\n    \"R12\": \"0xFFFFFFFFFFFF000C\",\n    \"R11\": \"0x1C\",\n    \"R10\": \"0x3C\",\n    \"R9\":  \"0xFFFFFFFFFFFFFFFF\",\n    \"R8\":  \"0xFFFFFFFFFFFFFFFF\",\n    \"RSI\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 0], rax\nmov rax, 0x1010101010101010\nmov [rdx + 8 * 1], rax\nmov rax, 0\nmov [rdx + 8 * 2], rax\n\nmov r15, -1\nmov r14, -1\nmov r13, -1\nmov r12, -1\nmov r11, -1\nmov r10, -1\nmov r9,  -1\nmov r8,  -1\nmov rsi, -1\n\nbsr r15w, word  [rdx + 8 * 0]\nbsr r14d, dword [rdx + 8 * 0]\nbsr r13,  qword [rdx + 8 * 0]\n\nbsr r12w, word  [rdx + 8 * 1]\nbsr r11d, dword [rdx + 8 * 1]\nbsr r10,  qword [rdx + 8 * 1]\n\nbsr r9w, word  [rdx + 8 * 2]\nbsr r8d, dword [rdx + 8 * 2]\nbsr rsi, qword [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_BE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x414243444546FFFF\",\n    \"R14\": \"0x00000000FFFFFFFF\",\n    \"R13\": \"0xFFFFFFFFFFFFFFFF\",\n    \"R12\": \"0x414243444546FFFF\",\n    \"R11\": \"0x00000000FFFFFFFF\",\n    \"R10\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 0], rax\n\nmov r15, 0x4142434445464748\nmov r14, 0x4142434445464748\nmov r13, 0x4142434445464748\nmov r12, 0x4142434445464748\nmov r11, 0x4142434445464748\nmov r10, 0x4142434445464748\n\nmovsx r15w, byte [rdx + 8 * 0]\nmovsx r14d, byte [rdx + 8 * 0]\nmovsx r13,  byte [rdx + 8 * 0]\n\nmovsx r12w, al\nmovsx r11d, al\nmovsx r10,  al\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_BF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R14\": \"0x00000000FFFFFFFF\",\n    \"R13\": \"0xFFFFFFFFFFFFFFFF\",\n    \"R12\": \"0x00000000FFFFFFFF\",\n    \"R11\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 0], rax\n\nmov r14, 0x4142434445464748\nmov r13, 0x4142434445464748\nmov r12, 0x4142434445464748\nmov r11, 0x4142434445464748\n\nmovsx r14d, word [rdx + 8 * 0]\nmovsx r13,  word [rdx + 8 * 0]\n\nmovsx r12d, ax\nmovsx r11,  ax\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464749\",\n    \"RBX\": \"0x5152535455565759\",\n    \"RCX\": \"0x6162636465666769\",\n    \"RDX\": \"0x7172737475767779\",\n    \"R15\": \"0x49\",\n    \"R14\": \"0x5759\",\n    \"R13\": \"0x65666769\",\n    \"R12\": \"0x7172737475767779\"\n  }\n}\n%endif\n\nmov r10, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r10 + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [r10 + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [r10 + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [r10 + 8 * 3], rax\n\nmov rax, 0x01\nxadd  byte [r10 + 8 * 0], al\nmov rax, 0x01\nxadd  word [r10 + 8 * 1], ax\nmov rax, 0x01\nxadd dword [r10 + 8 * 2], eax\nmov rax, 0x01\nxadd qword [r10 + 8 * 3], rax\n\nmov rax, [r10 + 8 * 0]\nmov rbx, [r10 + 8 * 1]\nmov rcx, [r10 + 8 * 2]\nmov rdx, [r10 + 8 * 3]\n\nmov r15, 0x00\nxadd  byte [r10 + 8 * 0], r15b\nmov r14, 0x00\nxadd word [r10 + 8 * 1], r14w\nmov r13, 0x00\nxadd dword [r10 + 8 * 2], r13d\nmov r12, 0x00\nxadd qword [r10 + 8 * 3], r12\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_C0_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x02\",\n    \"RBX\": \"0x02\",\n    \"RCX\": \"0x02\",\n    \"RDX\": \"0x02\"\n  }\n}\n%endif\n\nmov rax, 0x01\nmov rbx, 0x01\nmov rcx, 0x01\nmov rdx, 0x01\n\nxadd al, al\nxadd bx, bx\nxadd ecx, ecx\nxadd rdx, rdx\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_C0_Atomic16.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x8642438a8c464848\",\n    \"RBX\": \"0x824243444546478c\",\n    \"RCX\": \"0x4142434445464790\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x8242434445464748\",\n    \"RDI\": \"0x4142434445464790\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 1 byte offset within 4byte boundary\nlock xadd word [r15 + 8 * 0 + 1], ax\n\n; Test 3 byte offset across 4byte boundary\nlock xadd word [r15 + 8 * 0 + 3], ax\n\n; Test 7 byte offset across 8byte boundary\nlock xadd word [r15 + 8 * 0 + 7], ax\n\n; Test 15 byte offset across 16byte boundary\nlock xadd word [r15 + 8 * 0 + 15], ax\n\n; Test 63 byte offset across cacheline boundary\nlock xadd word [r15 + 8 * 0 + 63], ax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_C0_Atomic32.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x8642434446464748\",\n    \"RBX\": \"0x8242434445888a8c\",\n    \"RCX\": \"0x41424344458c8e90\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x8242434445464748\",\n    \"RDI\": \"0x41424344458c8e90\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 3 byte offset across 4byte boundary\nlock xadd dword [r15 + 8 * 0 + 3], eax\n\n; Test 7 byte offset across 8byte boundary\nlock xadd dword [r15 + 8 * 0 + 7], eax\n\n; Test 15 byte offset across 16byte boundary\nlock xadd dword [r15 + 8 * 0 + 15], eax\n\n; Test 63 byte offset across cacheline boundary\nlock xadd dword [r15 + 8 * 0 + 63], eax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_C0_Atomic64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4242434445464748\",\n    \"RBX\": \"0x8242434445464748\",\n    \"RCX\": \"0x418486888a8c8e90\",\n    \"RDX\": \"0x4142434445464748\",\n    \"RSI\": \"0x8242434445464748\",\n    \"RDI\": \"0x418486888a8c8e90\"\n  }\n}\n%endif\n\nmov r15, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [r15 + 8 * 0], rax\nmov [r15 + 8 * 1], rax\nmov [r15 + 8 * 2], rax\nmov [r15 + 8 * 3], rax\nmov [r15 + 8 * 4], rax\nmov [r15 + 8 * 5], rax\nmov [r15 + 8 * 6], rax\nmov [r15 + 8 * 7], rax\nmov [r15 + 8 * 8], rax\nmov [r15 + 8 * 9], rax\n\nmov rax, 1\n\n; Test 7 byte offset across 8byte boundary\nlock xadd qword [r15 + 8 * 0 + 7], rax\n\n; Test 15 byte offset across 16byte boundary\nlock xadd qword [r15 + 8 * 0 + 15], rax\n\n; Test 63 byte offset across cacheline boundary\nlock xadd qword [r15 + 8 * 0 + 63], rax\n\nmov rax, qword [r15 + 8 * 0]\nmov rbx, qword [r15 + 8 * 1]\nmov rcx, qword [r15 + 8 * 2]\nmov rdx, qword [r15 + 8 * 3]\nmov rsi, qword [r15 + 8 * 7]\nmov rdi, qword [r15 + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_C2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0\"],\n    \"XMM1\": [\"0x0\", \"0xFFFFFFFF00000000\"],\n    \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFF00000000\"],\n    \"XMM3\": [\"0xFFFFFFFF00000000\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM4\": [\"0x0\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM5\": [\"0xFFFFFFFFFFFFFFFF\", \"0x00000000FFFFFFFF\"],\n    \"XMM6\": [\"0x0000000000000000\", \"0x00000000FFFFFFFF\"],\n    \"XMM7\": [\"0x00000000FFFFFFFF\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3f80000040000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000040800000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x3f80000040000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x40a000003f800000\nmov [rdx + 8 * 3], rax\n\nmovapd xmm0, [rdx + 8 * 0]\nmovapd xmm1, [rdx + 8 * 0]\nmovapd xmm2, [rdx + 8 * 0]\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm4, [rdx + 8 * 0]\nmovapd xmm5, [rdx + 8 * 0]\nmovapd xmm6, [rdx + 8 * 0]\nmovapd xmm7, [rdx + 8 * 0]\nmovapd xmm8, [rdx + 8 * 2]\n\ncmpps xmm0, xmm8, 0x00 ; EQ\ncmpps xmm1, xmm8, 0x01 ; LT\ncmpps xmm2, xmm8, 0x02 ; LTE\ncmpps xmm4, xmm8, 0x04 ; NEQ\ncmpps xmm5, xmm8, 0x05 ; NLT\ncmpps xmm6, xmm8, 0x06 ; NLTE\n\n; Unordered and Ordered tests need to be special cased\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 0], rax\nmov rax, 0x7FC000007FC00000\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x7FC0000000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0x7FC0000000000000\nmov [rdx + 8 * 3], rax\n\nmovapd xmm3, [rdx + 8 * 0]\nmovapd xmm7, [rdx + 8 * 0]\nmovapd xmm8, [rdx + 8 * 2]\n\n; Unordered will return true when either input is nan\n; [0.0, 0.0, nan, nan] unord [0.0, nan, 0.0, nan] = [0, 1, 1, 1]\ncmpps xmm3, xmm8, 0x03 ; Unordered\n\n; Ordered will return true when both inputs are NOT nan\n; [0.0, 0.0, nan, nan] ord [0.0, nan, 0.0, nan] = [1, 0, 0, 0]\ncmpps xmm7, xmm8, 0x07 ; Ordered\n\nhlt\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_C3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x4142434445464748\",\n    \"RCX\": \"0x0000000045464748\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x0\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\n\nmov rax, [rdx + 8 * 0]\nmovnti [rdx + 8 * 1], rax\nmovnti [rdx + 8 * 2], eax\n\nmov rbx, [rdx + 8 * 1]\nmov rcx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_C4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x4142434445467778\",\n    \"MM1\": \"0x4142434477784748\",\n    \"MM2\": \"0x4142777845464748\",\n    \"MM3\": \"0x7778434445464748\",\n    \"MM4\": \"0x4142434445467778\",\n    \"MM5\": \"0x4142434477784748\",\n    \"MM6\": \"0x4142777845464748\",\n    \"MM7\": \"0x7778434445464748\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 2], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 0]\nmovq mm3, [rdx + 8 * 0]\nmovq mm4, [rdx + 8 * 0]\nmovq mm5, [rdx + 8 * 0]\nmovq mm6, [rdx + 8 * 0]\nmovq mm7, [rdx + 8 * 0]\n\npinsrw mm0, eax, 0\npinsrw mm1, eax, 1\npinsrw mm2, eax, 2\npinsrw mm3, eax, 3\n\npinsrw mm4, [rdx + 8 * 2], 0\npinsrw mm5, [rdx + 8 * 2], 1\npinsrw mm6, [rdx + 8 * 2], 2\npinsrw mm7, [rdx + 8 * 2], 3\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_C4_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x4142434445467778\",\n    \"MM1\": \"0x4142434477784748\",\n    \"MM2\": \"0x4142777845464748\",\n    \"MM3\": \"0x7778434445464748\",\n    \"MM4\": \"0x4142434445467778\",\n    \"MM5\": \"0x4142434477784748\",\n    \"MM6\": \"0x4142777845464748\",\n    \"MM7\": \"0x7778434445464748\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x7172737475767778\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 0]\nmovq mm3, [rdx + 8 * 0]\nmovq mm4, [rdx + 8 * 0]\nmovq mm5, [rdx + 8 * 0]\nmovq mm6, [rdx + 8 * 0]\nmovq mm7, [rdx + 8 * 0]\n\npinsrw mm0, eax, 0\npinsrw mm1, eax, 1\npinsrw mm2, eax, 2\npinsrw mm3, eax, 3\npinsrw mm4, eax, 4\npinsrw mm5, eax, 5\npinsrw mm6, eax, 6\npinsrw mm7, eax, 7\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_C5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4748\",\n    \"RBX\": \"0x4546\",\n    \"RCX\": \"0x4344\",\n    \"RDX\": \"0x4142\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmovq mm0, [rdx + 8 * 0]\n\nmov rax, -1\nmov rbx, -1\nmov rcx, -1\nmov rdx, -1\n\npextrw eax, mm0, 0\npextrw ebx, mm0, 1\npextrw ecx, mm0, 2\npextrw edx, mm0, 3\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_C5_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4748\",\n    \"RBX\": \"0x4546\",\n    \"RCX\": \"0x4344\",\n    \"RDX\": \"0x4142\",\n    \"RSI\": \"0x4748\",\n    \"RDI\": \"0x4546\",\n    \"RBP\": \"0x4344\",\n    \"RSP\": \"0x4142\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmovq mm0, [rdx + 8 * 0]\n\nmov rax, -1\nmov rbx, -1\nmov rcx, -1\nmov rdx, -1\n\npextrw eax, mm0, 0\npextrw ebx, mm0, 1\npextrw ecx, mm0, 2\npextrw edx, mm0, 3\npextrw esi, mm0, 4\npextrw edi, mm0, 5\npextrw ebp, mm0, 6\npextrw esp, mm0, 7\n\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_C6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R15\": \"0x0000000008070605\",\n    \"R14\": \"0x00000000F8F7F6F5\",\n    \"R13\": \"0x00000000E8E7E6E5\",\n    \"R12\": \"0x00000000D8D7D6D5\",\n    \"R11\": \"0x00000000C8C7C6C5\",\n    \"R10\": \"0x00000000B8B7B6B5\",\n    \"R9\":  \"0x00000000A8A7A6A5\",\n    \"R8\":  \"0x0000000098979695\",\n    \"RSP\": \"0x8887868584838281\",\n    \"RDI\": \"0x7877767574737271\",\n    \"RSI\": \"0x6867666564636261\",\n    \"RBP\": \"0x5857565554535251\",\n    \"RDX\": \"0x4847464544434241\",\n    \"RCX\": \"0x3837363534333231\",\n    \"RBX\": \"0x2827262524232221\",\n    \"RAX\": \"0x1817161514131211\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x1112131415161718\nmov rbx, 0x2122232425262728\nmov rcx, 0x3132333435363738\nmov rdx, 0x4142434445464748\nmov rbp, 0x5152535455565758\nmov rsi, 0x6162636465666768\nmov rdi, 0x7172737475767778\nmov rsp, 0x8182838485868788\nmov  r8, 0x9192939495969798\nmov  r9, 0xA1A2A3A4A5A6A7A8\nmov r10, 0xB1B2B3B4B5B6B7B8\nmov r11, 0xC1C2C3C4C5C6C7C8\nmov r12, 0xD1D2D3D4D5D6D7D8\nmov r13, 0xE1E2E3E4E5E6E7E8\nmov r14, 0xF1F2F3F4F5F6F7F8\nmov r15, 0x0102030405060708\n\nbswap rax\nbswap rbx\nbswap rcx\nbswap rdx\nbswap rbp\nbswap rsi\nbswap rdi\nbswap rsp\n\nbswap r8d\nbswap r9d\nbswap r10d\nbswap r11d\nbswap r12d\nbswap r13d\nbswap r14d\nbswap r15d\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_D1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x20A121A222A323A4\",\n    \"MM1\": \"0x0041004300450047\",\n    \"MM2\": \"0x0\",\n    \"MM3\": \"0x0\",\n    \"MM4\": \"0x0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1\nmov [rdx + 8 * 2], rax\nmov rax, 0x0\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8\nmov [rdx + 8 * 4], rax\nmov rax, 0x0\nmov [rdx + 8 * 5], rax\n\n; Will Zero\nmov rax, 0x10\nmov [rdx + 8 * 6], rax\nmov rax, 0x0\nmov [rdx + 8 * 7], rax\n\n; Will Zero\nmov rax, 0x20\nmov [rdx + 8 * 8], rax\nmov rax, 0x0\nmov [rdx + 8 * 9], rax\n\n; Will Zero\nmov rax, 0x40\nmov [rdx + 8 * 10], rax\nmov rax, 0x0\nmov [rdx + 8 * 11], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 0]\nmovq mm3, [rdx + 8 * 0]\nmovq mm4, [rdx + 8 * 0]\n\npsrlw mm0, [rdx + 8 * 2]\npsrlw mm1, [rdx + 8 * 4]\npsrlw mm2, [rdx + 8 * 6]\npsrlw mm3, [rdx + 8 * 8]\npsrlw mm4, [rdx + 8 * 10]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_D2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x20A121A222A323A4\",\n    \"MM1\": \"0x0041424300454647\",\n    \"MM2\": \"0x0000414200004546\",\n    \"MM3\": \"0x0\",\n    \"MM4\": \"0x0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1\nmov [rdx + 8 * 2], rax\nmov rax, 0x0\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8\nmov [rdx + 8 * 4], rax\nmov rax, 0x0\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x10\nmov [rdx + 8 * 6], rax\nmov rax, 0x0\nmov [rdx + 8 * 7], rax\n\n; Will Zero\nmov rax, 0x20\nmov [rdx + 8 * 8], rax\nmov rax, 0x0\nmov [rdx + 8 * 9], rax\n\n; Will Zero\nmov rax, 0x40\nmov [rdx + 8 * 10], rax\nmov rax, 0x0\nmov [rdx + 8 * 11], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 0]\nmovq mm3, [rdx + 8 * 0]\nmovq mm4, [rdx + 8 * 0]\n\npsrld mm0, [rdx + 8 * 2]\npsrld mm1, [rdx + 8 * 4]\npsrld mm2, [rdx + 8 * 6]\npsrld mm3, [rdx + 8 * 8]\npsrld mm4, [rdx + 8 * 10]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_D3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x20A121A222A323A4\",\n    \"MM1\": \"0x0041424344454647\",\n    \"MM2\": \"0x0000414243444546\",\n    \"MM3\": \"0x0000000041424344\",\n    \"MM4\": \"0x0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1\nmov [rdx + 8 * 2], rax\nmov rax, 0x0\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8\nmov [rdx + 8 * 4], rax\nmov rax, 0x0\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x10\nmov [rdx + 8 * 6], rax\nmov rax, 0x0\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x20\nmov [rdx + 8 * 8], rax\nmov rax, 0x0\nmov [rdx + 8 * 9], rax\n\n; Will Zero\nmov rax, 0x40\nmov [rdx + 8 * 10], rax\nmov rax, 0x0\nmov [rdx + 8 * 11], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 0]\nmovq mm3, [rdx + 8 * 0]\nmovq mm4, [rdx + 8 * 0]\n\npsrlq mm0, [rdx + 8 * 2]\npsrlq mm1, [rdx + 8 * 4]\npsrlq mm2, [rdx + 8 * 6]\npsrlq mm3, [rdx + 8 * 8]\npsrlq mm4, [rdx + 8 * 10]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_D4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xa2a4a6a8aaacaeb0\",\n    \"MM1\": \"0xa2a4a6a8aaacaeb0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npaddq mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npaddq mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_D5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xFD44929037E4ED40\",\n    \"MM1\": \"0xFD44929037E4ED40\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 2]\n\npmullw mm0, mm2\npmullw mm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_D7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFF\",\n    \"RBX\": \"0x00\",\n    \"RCX\": \"0x00\",\n    \"RDX\": \"0xF0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x8080808080808080\nmov [rdx + 8 * 0], rax\nmov rax, 0x0000000000000000\nmov [rdx + 8 * 1], rax\nmov rax, 0x7070707070707070\nmov [rdx + 8 * 2], rax\nmov rax, 0x8080808000000000\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\nmovq mm2, [rdx + 8 * 2]\nmovq mm3, [rdx + 8 * 3]\n\nmov rax, -1\nmov rbx, -1\nmov rcx, -1\nmov rdx, -1\n\npmovmskb eax, mm0\npmovmskb ebx, mm1\npmovmskb ecx, mm2\npmovmskb edx, mm3\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_D8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x2020202000000000\",\n    \"MM1\": \"0x2020202000000000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162636445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 2]\n\npsubusb mm0, mm2\npsubusb mm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_D9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x2020202000000000\",\n    \"MM1\": \"0x2020202000000000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162636445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 2]\n\npsubusw mm0, mm2\npsubusw mm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_DA.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x4142434445464748\",\n    \"MM1\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\npminub mm0, mm1\npminub mm1, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_DB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x1010101010101010\",\n    \"MM1\": \"0x1010101010101010\",\n    \"MM2\": \"0x1010101010101010\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 0], rax\nmov rax, 0x0\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1010101010101010\nmov [rdx + 8 * 2], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npand mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npand mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_DC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xA2A4A6A8AAACAEB0\",\n    \"MM1\": \"0xA2A4A6A8AAACAEB0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 2]\n\npaddusb mm0, mm2\npaddusb mm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_DD.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xA2A4A6A8AAACAEB0\",\n    \"MM1\": \"0xA2A4A6A8AAACAEB0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 2]\n\npaddusw mm0, mm2\npaddusw mm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_DE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x5152535455565758\",\n    \"MM1\": \"0x5152535455565758\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\npmaxub mm0, mm1\npmaxub mm1, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_DF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0\",\n    \"MM1\": \"0x0\",\n    \"MM2\": \"0x1010101010101010\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 0], rax\nmov rax, 0x0\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1010101010101010\nmov [rdx + 8 * 2], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npandn mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npandn mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_E0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x2179b0697d5378c4\",\n    \"MM1\": \"0x1ed68638699d35ca\",\n    \"MM2\": \"0x165c42291f28194c\",\n    \"MM3\": \"0x2179b0697d5378c4\",\n    \"MM4\": \"0x1ed68638699d35ca\",\n    \"MM5\": \"0x165c42291f28194c\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x2bb883523d4f3197\nmov [rdx + 8 * 0], rax\nmov rax, 0x1246c77764260189\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x163add80bc57bef1\nmov [rdx + 8 * 2], rax\nmov rax, 0x64d615e5b405a306\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x11f4881d94eb39fc\nmov [rdx + 8 * 4], rax\nmov rax, 0xa9162248f2d0a23a\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 6], rax\nmov rax, 0x0\nmov [rdx + 8 * 7], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 0]\nmovq mm3, [rdx + 8 * 0]\nmovq mm4, [rdx + 8 * 0]\nmovq mm5, [rdx + 8 * 0]\nmovq mm6, [rdx + 8 * 2]\nmovq mm7, [rdx + 8 * 4]\n\npavgb mm0, mm6\npavgb mm1, mm7\n\nmovq mm7, [rdx + 8 * 6]\npavgb mm2, mm7\n\npavgb mm3, [rdx + 8 * 2]\npavgb mm4, [rdx + 8 * 4]\npavgb mm5, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_E1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x4142434445464748\",\n    \"MM1\": \"0x0041004300450047\",\n    \"MM2\": \"0x0\",\n    \"MM3\": \"0x4142434445464748\",\n    \"MM4\": \"0x0041004300450047\",\n    \"MM5\": \"0x0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x10\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 0]\nmovq mm3, [rdx + 8 * 0]\nmovq mm4, [rdx + 8 * 0]\nmovq mm5, [rdx + 8 * 0]\nmovq mm6, [rdx + 8 * 2]\nmovq mm7, [rdx + 8 * 4]\n\npsraw mm0, mm6\npsraw mm1, mm7\n\nmovq mm7, [rdx + 8 * 6]\npsraw mm2, mm7\n\npsraw mm3, [rdx + 8 * 2]\npsraw mm4, [rdx + 8 * 4]\npsraw mm5, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_E2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x4142434445464748\",\n    \"MM1\": \"0x0000414200004546\",\n    \"MM2\": \"0x0\",\n    \"MM3\": \"0x4142434445464748\",\n    \"MM4\": \"0x0000414200004546\",\n    \"MM5\": \"0x0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x10\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x20\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 0]\nmovq mm3, [rdx + 8 * 0]\nmovq mm4, [rdx + 8 * 0]\nmovq mm5, [rdx + 8 * 0]\n\nmovq mm6, [rdx + 8 * 2]\nmovq mm7, [rdx + 8 * 4]\n\npsrad mm0, mm6\npsrad mm1, mm7\n\nmovq mm7, [rdx + 8 * 6]\npsrad mm2, mm7\n\npsrad mm3, [rdx + 8 * 2]\npsrad mm4, [rdx + 8 * 4]\npsrad mm5, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_E3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x20f9b0697cd37844\",\n    \"MM1\": \"0x1ed685b8691d35ca\",\n    \"MM2\": \"0x15dc41a91ea818cc\",\n    \"MM3\": \"0x20f9b0697cd37844\",\n    \"MM4\": \"0x1ed685b8691d35ca\",\n    \"MM5\": \"0x15dc41a91ea818cc\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x2bb883523d4f3197\nmov [rdx + 8 * 0], rax\nmov rax, 0x1246c77764260189\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x163add80bc57bef1\nmov [rdx + 8 * 2], rax\nmov rax, 0x64d615e5b405a306\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x11f4881d94eb39fc\nmov [rdx + 8 * 4], rax\nmov rax, 0xa9162248f2d0a23a\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 6], rax\nmov rax, 0x0\nmov [rdx + 8 * 7], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 0]\nmovq mm3, [rdx + 8 * 0]\nmovq mm4, [rdx + 8 * 0]\nmovq mm5, [rdx + 8 * 0]\nmovq mm6, [rdx + 8 * 2]\nmovq mm7, [rdx + 8 * 4]\n\npavgw mm0, mm6\npavgw mm1, mm7\n\nmovq mm7, [rdx + 8 * 6]\npavgw mm2, mm7\n\npavgw mm3, [rdx + 8 * 2]\npavgw mm4, [rdx + 8 * 4]\npavgw mm5, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_E4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x14BA15E517171851\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov eax, dword [rdx + 8 * 0]\nmov rbx, qword [rdx + 8 * 1]\n\nmovq mm0, [rdx + 8 * 0]\n\npmulhuw mm0, [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_E5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xD7D1D77A17171851\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x8182838445464748 ; -32382, -31868, 17734, 18248\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758 ; 20818, 21332, 21846, 22360\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov eax, dword [rdx + 8 * 0]\nmov rbx, qword [rdx + 8 * 1]\n\nmovq mm0, [rdx + 8 * 0]\n\npmulhw mm0, [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_E7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x4142434445464748\",\n    \"MM1\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x0\nmov [rdx + 8 * 1], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\n\nmovntq [rdx + 8 * 1], mm0\nmovq mm1, [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_E8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xE0E0E0E0E0E0E0E0\",\n    \"MM1\": \"0xE0E0E0E0E0E0E0E0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 2]\n\npsubsb mm0, mm2\npsubsb mm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_E9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xDFE0DFE0DFE0DFE0\",\n    \"MM1\": \"0xDFE0DFE0DFE0DFE0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 2]\n\npsubsw mm0, mm2\npsubsw mm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_EA.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x4142434445464748\",\n    \"MM1\": \"0x4142434445464748\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 2]\n\npminsw mm0, mm2\npminsw mm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_EB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x1111111111111111\",\n    \"MM1\": \"0x1111111111111111\",\n    \"MM2\": \"0x0101010101010101\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x1010101010101010\nmov [rdx + 8 * 0], rax\nmov rax, 0x2020202020202020\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0101010101010101\nmov [rdx + 8 * 2], rax\nmov rax, 0x0202020202020202\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npor mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npor mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_EC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x7F7F7F7F7F7F7F7F\",\n    \"MM1\": \"0x7F7F7F7F7F7F7F7F\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 2]\n\npaddsb mm0, mm2\npaddsb mm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_ED.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x7FFF7FFF7FFF7FFF\",\n    \"MM1\": \"0x7FFF7FFF7FFF7FFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 2]\n\npaddsw mm0, mm2\npaddsw mm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_EE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x6162636465666768\",\n    \"MM1\": \"0x6162636465666768\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 2]\n\npmaxsw mm0, mm2\npmaxsw mm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_EF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x2424242424242424\",\n    \"MM1\": \"0x2424242424242424\",\n    \"MM2\": \"0x1818181818181818\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3C3C3C3C3C3C3C3C\nmov [rdx + 8 * 0], rax\nmov rax, 0x3C3C3C3C3C3C3C3C\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1818181818181818\nmov [rdx + 8 * 2], rax\nmov rax, 0x1818181818181818\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npxor mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npxor mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_F1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x828486888A8C8E90\",\n    \"MM1\": \"0x4200440046004800\",\n    \"MM2\": \"0x0\",\n    \"MM3\": \"0x0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x1\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x8\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x10\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmov rax, 0x20\nmov [rdx + 8 * 8], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 9], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 0]\nmovq mm3, [rdx + 8 * 0]\n\npsllw mm0, [rdx + 8 * 2]\npsllw mm1, [rdx + 8 * 4]\npsllw mm2, [rdx + 8 * 6]\npsllw mm3, [rdx + 8 * 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_F2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x4142434445464748\",\n    \"MM1\": \"0x4344000047480000\",\n    \"MM2\": \"0x0\",\n    \"MM3\": \"0x4142434445464748\",\n    \"MM4\": \"0x4344000047480000\",\n    \"MM5\": \"0x0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x10\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x20\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 0]\nmovq mm3, [rdx + 8 * 0]\nmovq mm4, [rdx + 8 * 0]\nmovq mm5, [rdx + 8 * 0]\n\nmovq mm6, [rdx + 8 * 2]\nmovq mm7, [rdx + 8 * 4]\n\npslld mm0, mm6\npslld mm1, mm7\n\nmovq mm7, [rdx + 8 * 6]\npslld mm2, mm7\n\npslld mm3, [rdx + 8 * 2]\npslld mm4, [rdx + 8 * 4]\npslld mm5, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_F3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\":  \"0x4142434445464748\",\n    \"MM1\":  \"0x4546474800000000\",\n    \"MM2\":  \"0x0\",\n    \"MM3\":  \"0x4142434445464748\",\n    \"MM4\":  \"0x4546474800000000\",\n    \"MM5\":  \"0x0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x20\nmov [rdx + 8 * 4], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 5], rax\n\nmov rax, 0x40\nmov [rdx + 8 * 6], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 7], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 0]\nmovq mm3, [rdx + 8 * 0]\nmovq mm4, [rdx + 8 * 0]\nmovq mm5, [rdx + 8 * 0]\n\nmovq mm6, [rdx + 8 * 2]\nmovq mm7, [rdx + 8 * 4]\n\npsllq mm0, mm6\npsllq mm1, mm7\nmovq mm7, [rdx + 8 * 6]\npsllq mm2, mm7\n\npsllq mm3, [rdx + 8 * 2]\npsllq mm4, [rdx + 8 * 4]\npsllq mm5, [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_F4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x000000000003FFFC\",\n    \"MM1\": \"0x000000000003FFFC\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x414243440000FFFF\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535400007FFF\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636400000004\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737400000002\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npmuludq mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npmuludq mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_F5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x2A9FE7742F697C44\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\n\nmov eax, dword [rdx + 8 * 0]\nmov rbx, qword [rdx + 8 * 1]\n\nmovq mm0, [rdx + 8 * 0]\n\npmaddwd mm0, [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_F6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x0000000000000080\",\n    \"MM1\": \"0x0000000000000083\",\n    \"MM2\": \"0x0000000000000134\",\n    \"MM3\": \"0x0000000000000156\",\n    \"MM4\": \"0x0000000000000140\",\n    \"MM5\": \"0x000000000000013F\",\n    \"MM6\": \"0x000000000000008F\",\n    \"MM7\": \"0x00000000000000D1\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x912277A763B4EB8C\nmov [rdx + 8 * 2], rax\nmov rax, 0x589490D442F54AFD\nmov [rdx + 8 * 3], rax\nmov rax, 0xB5E43417A3F6706C\nmov [rdx + 8 * 4], rax\nmov rax, 0xB4F4B827515F5BFA\nmov [rdx + 8 * 5], rax\nmov rax, 0x52D0EF1BCB906B6A\nmov [rdx + 8 * 6], rax\nmov rax, 0x1D0FDF5D05D39C64\nmov [rdx + 8 * 7], rax\nmov rax, 0xAEFEDEA21EF08810\nmov [rdx + 8 * 8], rax\nmov rax, 0xF7D80319B125BDE5\n\nmovq mm0, [rdx + 8 * 1]\nmovq mm1, [rdx + 8 * 2]\nmovq mm2, [rdx + 8 * 3]\nmovq mm3, [rdx + 8 * 4]\nmovq mm4, [rdx + 8 * 5]\nmovq mm5, [rdx + 8 * 6]\nmovq mm6, [rdx + 8 * 7]\nmovq mm7, [rdx + 8 * 8]\n\npsadbw mm0, [rdx + 8 * 0]\n\nlea rdx, [rel .data]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 1]\nmovq mm3, [rdx + 8 * 2]\nmovq mm4, [rdx + 8 * 3]\nmovq mm5, [rdx + 8 * 4]\nmovq mm6, [rdx + 8 * 5]\nmovq mm7, [rdx + 8 * 6]\n\npsadbw mm1, [rdx + 8 * 7]\npsadbw mm2, [rdx + 8 * 8]\npsadbw mm3, [rdx + 8 * 9]\npsadbw mm4, [rdx + 8 * 10]\npsadbw mm5, [rdx + 8 * 11]\npsadbw mm6, [rdx + 8 * 12]\npsadbw mm7, [rdx + 8 * 13]\nhlt\n\n.data:\n; 128bytes of random numbers\ndb 'ba\\xa7\\x5e\\xc8\\x0f\\x90\\x25\\xf1\\xf8\\x49\\xbd\\xab\\x4d\\x2b\\xa1\\xc4'\ndb 'e4\\x69\\xe3\\x2a\\x80\\x8d\\xd6\\x0b\\xb2\\x6d\\xea\\xae\\x2e\\x23\\xc2\\x2c'\ndb 'f9\\xc6\\xee\\x06\\x53\\x96\\x00\\xae\\x8d\\x06\\xdc\\xe1\\x11\\x06\\x0c\\x40'\ndb 'a5\\x61\\x83\\x7c\\x13\\x25\\x43\\xea\\xa7\\x08\\x52\\xc4\\x0f\\x91\\x2c\\x2c'\ndb '5a\\xe7\\xcf\\xf6\\xe3\\x6b\\x9e\\x9e\\xd8\\x85\\xf7\\xfd\\x4a\\x17\\xb4\\xc9'\ndb '16\\x07\\x13\\x8c\\x83\\x89\\xc3\\x5e\\x46\\x63\\x1a\\x31\\xb9\\x2c\\x72\\x18'\ndb '23\\xa2\\xf0\\x4d\\x22\\x2a\\xe4\\x86\\x84\\x1a\\xae\\xfc\\x65\\x49\\x17\\x8e'\ndb 'c8\\xb0\\xe3\\x6c\\xb3\\xce\\xa1\\x2f\\xce\\x5f\\xae\\x06\\xac\\x28\\x7d\\xb5'\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_F6_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x00000000000007F8\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x0\nmov [rdx + 8 * 0], rax\nmov rax, -1\nmov [rdx + 8 * 1], rax\n\nmovq mm0, [rdx + 8 * 0]\n\npsadbw mm0, [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_F7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x41424344FFFFFFFF\",\n    \"RCX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x8080808080808080\nmov [rdx + 8 * 1], rax\nmov rax, 0x8080808000000000\nmov [rdx + 8 * 2], rax\nmov rax, 0\nmov [rdx + 8 * 3], rax\nmov rax, -1\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\nmov [rdx + 8 * 6], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 1]\nmovq mm2, [rdx + 8 * 2]\nmovq mm3, [rdx + 8 * 3]\n\nlea rdi, [rdx + 8 * 4]\nmaskmovq mm0, mm1\n\nlea rdi, [rdx + 8 * 5]\nmaskmovq mm0, mm2\n\nlea rdi, [rdx + 8 * 6]\nmaskmovq mm0, mm3\n\nmov rax, qword [rdx + 8 * 4]\nmov rbx, qword [rdx + 8 * 5]\nmov rcx, qword [rdx + 8 * 6]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_F8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x2020202020202020\",\n    \"MM1\": \"0x2020202020202020\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npsubb mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npsubb mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_F9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x2020202020202020\",\n    \"MM1\": \"0x2020202020202020\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npsubw mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npsubw mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_FA.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x2020202020202020\",\n    \"MM1\": \"0x2020202020202020\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npsubd mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npsubd mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_FB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0x2020202020202020\",\n    \"MM1\": \"0x2020202020202020\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 0], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 2], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx]\npsubq mm0, [rdx + 8 * 2]\n\nmovq mm1, [rdx]\nmovq mm2, [rdx + 8 * 2]\npsubq mm1, mm2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_FC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xA2A4A6A8AAACAEB0\",\n    \"MM1\": \"0xA2A4A6A8AAACAEB0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 2]\n\npaddb mm0, mm2\npaddb mm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_FD.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xA2A4A6A8AAACAEB0\",\n    \"MM1\": \"0xA2A4A6A8AAACAEB0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 2]\n\npaddw mm0, mm2\npaddw mm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/TwoByte/0F_FE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM0\": \"0xA2A4A6A8AAACAEB0\",\n    \"MM1\": \"0xA2A4A6A8AAACAEB0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmovq mm0, [rdx + 8 * 0]\nmovq mm1, [rdx + 8 * 0]\nmovq mm2, [rdx + 8 * 2]\n\npaddd mm0, mm2\npaddd mm1, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/andn.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": \"0xFFFFFFFFFFFFFFFF\",\n      \"RBX\": \"0\",\n      \"RCX\": \"0xFFFFFFFF\",\n      \"RDX\": \"0\"\n  },\n  \"HostFeatures\": [\"BMI1\"]\n}\n%endif\n\nmov rax, 0\nmov rbx, -1\nandn rax, rax, rbx\nandn rbx, rbx, rax\n\nmov rcx, 0\nmov rdx, -1\nandn ecx, ecx, edx\nandn edx, edx, ecx\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/bextr.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RBX\": \"0\",\n      \"RDX\": \"0xFF\",\n      \"RSI\": \"0\",\n      \"R8\" : \"0xDEADBEEFDEADBEEF\",\n      \"R9\" : \"0xDEADBEEF\",\n      \"R14\": \"0x7F\",\n      \"R15\": \"0x838\"\n  },\n  \"HostFeatures\": [\"BMI1\"]\n}\n%endif\n\n; General extraction\nmov r14, 0x7FFFFFFFFFFFFFFF\nmov r15, 0x838              ; Start at bit 56 and extract 8 bits\nbextr r14, r14, r15         ; This results in 0x7F being placed into RAX\n\n; Extraction with 0 bits should clear the destination\nmov rbx, -1\nmov rcx, 0\nbextr rbx, rbx, rcx\n\n; Extraction with 'SrcSize' bits should get the unchanged register\nmov r8, 0xDEADBEEFDEADBEEF\nmov r9, 16384              ; Start at 0 extract 64 bits\nbextr r8, r8, r9           ; r8 should stay the same\n\n; Same tests as above but with 32-bit registers\n\n; General extraction\nmov rdx, 0x7FFFFFFFFFFFFFFF\nmov rsi, 0x818              ; Start at bit 24 and extract 8 bits\nbextr edx, edx, esi         ; This results in 0xFF being placed into EDX\n\n; Extraction with 0 bits should clear RSI to 0\nmov rsi, -1\nmov rdi, 0\nbextr esi, esi, edi\n\n; Extraction with 'SrcSize' bits should get the unchanged register\nmov r9, 0xDEADBEEFDEADBEEF\nmov r10, 8192               ; Start at 0 extract 32 bits\nbextr r9d, r9d, r10d        ; r9 should become 0xDEADBEEF (and r9d stays the same)\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/blsi.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": \"1\",\n      \"RBX\": \"0xFF00000000000000\",\n      \"RCX\": \"0x0100000000000000\",\n      \"RDX\": \"1\",\n      \"RSI\": \"0xFF000000\",\n      \"RDI\": \"0x01000000\"\n  },\n  \"HostFeatures\": [\"BMI1\"]\n}\n%endif\n\n; Trivial test, this should result in 1.\nmov rax, 11\nblsi rax, rax\n\n; Results in the lowest set bit (bit 56) being extracted\nmov rbx, 0xFF00000000000000\nmov rcx, 0\nblsi rcx, rbx\n\n; Same tests but with 32-bit registers\n\n; Trivial test, this should result in 1.\nmov edx, 11\nblsi edx, edx\n\n; Results in the lowest set bit (bit 24) being extracted\nmov rsi, 0xFF000000\nmov rdi, 0\nblsi edi, esi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/blsmsk.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": \"1\",\n      \"RBX\": \"0xFF00000000000000\",\n      \"RCX\": \"0x01FFFFFFFFFFFFFF\",\n      \"RDX\": \"1\",\n      \"RSI\": \"0xFF000000\",\n      \"RDI\": \"0x01FFFFFF\"\n  },\n  \"HostFeatures\": [\"BMI1\"]\n}\n%endif\n\n; Trivial test, this should result in 1.\nmov rax, 11\nblsmsk rax, rax\n\n; Results in 0x01FFFFFFFFFFFFFF being placed into RCX\nmov rbx, 0xFF00000000000000\nblsmsk rcx, rbx\n\n; Same tests but with 32-bit registers\n\n; Trivial test, this should result in 1.\nmov edx, 11\nblsmsk edx, edx\n\n; Results in 0x01FFFFFF being placed in EDI\nmov rsi, 0xFF000000\nblsmsk edi, esi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/blsr.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": \"10\",\n      \"RBX\": \"0xFF00000000000000\",\n      \"RCX\": \"0xFE00000000000000\",\n      \"RDX\": \"10\",\n      \"RSI\": \"0xFF000000\",\n      \"RDI\": \"0xFE000000\"\n  },\n  \"HostFeatures\": [\"BMI1\"]\n}\n%endif\n\n; Trivial test, this should result in 10.\nmov rax, 11\nblsr rax, rax\n\n; Results in 0xFE00000000000000 being placed into RCX\nmov rbx, 0xFF00000000000000\nblsr rcx, rbx\n\n; Same tests but with 32-bit registers\n\n; Trivial test, this should result in 10.\nmov edx, 11\nblsr edx, edx\n\n; Results in 0xFE000000 being placed in EDI\nmov rsi, 0xFF000000\nblsr edi, esi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/bzhi.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": \"0xFFFFFFFFFFFFFFFF\",\n      \"RBX\": \"64\",\n      \"RCX\": \"0x00000000000003FF\",\n      \"RDX\": \"10\",\n      \"RSI\": \"0x00000000FFFFFFFF\",\n      \"RDI\": \"32\",\n      \"RBP\": \"0x00000000000003FF\",\n      \"RSP\": \"10\"\n  },\n  \"HostFeatures\": [\"BMI2\"]\n}\n%endif\n\n; Should not alter the source value\nmov rax, -1\nmov rbx, 64\nbzhi rax, rax, rbx\n\n; General operation\nmov rcx, -1\nmov rdx, 10\nbzhi rcx, rcx, rdx\n\n; 32-bit tests\n\n; Should not alter the source value\nmov esi, -1\nmov edi, 32\nbzhi esi, esi, edi\n\n; General operation\nmov ebp, -1\nmov esp, 10\nbzhi ebp, ebp, esp\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fmadd_pd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xc01c000000000000\", \"0xc035800000000000\", \"0xc073000000000000\", \"0xc083f00000000000\"],\n    \"XMM1\": [\"0x4045c00000000000\", \"0x4063400000000000\", \"0xc0b7cf8000000000\", \"0xc0d2b66000000000\"],\n    \"XMM2\": [\"0x4040800000000000\", \"0x4053b00000000000\", \"0xc0959e0000000000\", \"0xc0b5448000000000\"],\n    \"XMM3\": [\"0xc01c000000000000\", \"0xc035800000000000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x4045c00000000000\", \"0x4063400000000000\", \"0\", \"0\"],\n    \"XMM5\": [\"0x4040800000000000\", \"0x4053b00000000000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvmovups ymm3, [rel .data]\nvmovups ymm4, [rel .data2]\nvmovups ymm5, [rel .data3]\n\nvfmadd231pd ymm0, ymm1, ymm2\nvfmadd213pd ymm1, ymm0, ymm2\nvfmadd132pd ymm2, ymm1, ymm0\n\nvfmadd231pd xmm3, xmm4, xmm5\nvfmadd213pd xmm4, xmm3, xmm5\nvfmadd132pd xmm5, xmm4, xmm3\n\nhlt\n\nalign 32\n.data:\ndq 2.0, 3.0\ndq 6.0, 7.0\n\n.data2:\ndq -6.0, -7.0\ndq 20.0, 30.0\n\n.data3:\ndq 1.5, 3.5\ndq -15.5, -21.5\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fmadd_ps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xc1ac0000c0e00000\", \"0x4294999942400000\", \"0xc41f8000c3980000\", \"0x44bd4000446d0000\"],\n    \"XMM1\": [\"0x431a0000422e0000\", \"0xc4291999c3c2c000\", \"0xc695b300c5be7c00\", \"0x4793e90d47143780\"],\n    \"XMM2\": [\"0x429d800042040000\", \"0xc49c1051c4236000\", \"0xc5aa2400c4acf000\", \"0x47eceac0476b3d80\"],\n    \"XMM3\": [\"0xc1ac0000c0e00000\", \"0x4294999942400000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x431a0000422e0000\", \"0xc4291999c3c2c000\", \"0\", \"0\"],\n    \"XMM5\": [\"0x429d800042040000\", \"0xc49c1051c4236000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvmovups ymm3, [rel .data]\nvmovups ymm4, [rel .data2]\nvmovups ymm5, [rel .data3]\n\nvfmadd231ps ymm0, ymm1, ymm2\nvfmadd213ps ymm1, ymm0, ymm2\nvfmadd132ps ymm2, ymm1, ymm0\n\nvfmadd231ps xmm3, xmm4, xmm5\nvfmadd213ps xmm4, xmm3, xmm5\nvfmadd132ps xmm5, xmm4, xmm3\n\nhlt\n\nalign 32\n.data:\ndd 2.0, 3.0, 4.0, 5.0\ndd 6.0, 7.0, 8.0, 9.0\n\n.data2:\ndd -6.0, -7.0, -8.0, -9.0\ndd 20.0, 30.0, 40.0, 50.0\n\n.data3:\ndd 1.5, 3.5, -5.5, -7.7\ndd -15.5, -21.5, 23.5, 30.1\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fmadd_sd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xc01c000000000000\", \"0x4008000000000000\", \"0\", \"0\"],\n    \"XMM1\": [\"0x4045c00000000000\", \"0xc01c000000000000\", \"0\", \"0\"],\n    \"XMM2\": [\"0x4040800000000000\", \"0x400c000000000000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvfmadd231sd xmm0, xmm1, xmm2\nvfmadd213sd xmm1, xmm0, xmm2\nvfmadd132sd xmm2, xmm1, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 2.0, 3.0\ndq 6.0, 7.0\n\n.data2:\ndq -6.0, -7.0\ndq 20.0, 30.0\n\n.data3:\ndq 1.5, 3.5\ndq -15.5, -21.5\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fmadd_ss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x40400000c0e00000\", \"0x40a0000040800000\", \"0\", \"0\"],\n    \"XMM1\": [\"0xc0e00000422e0000\", \"0xc1100000c1000000\", \"0\", \"0\"],\n    \"XMM2\": [\"0x4060000042040000\", \"0xc0f66666c0b00000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvfmadd231ss xmm0, xmm1, xmm2\nvfmadd213ss xmm1, xmm0, xmm2\nvfmadd132ss xmm2, xmm1, xmm0\n\nhlt\n\nalign 32\n.data:\ndd 2.0, 3.0, 4.0, 5.0\ndd 6.0, 7.0, 8.0, 9.0\n\n.data2:\ndd -6.0, -7.0, -8.0, -9.0\ndd 20.0, 30.0, 40.0, 50.0\n\n.data3:\ndd 1.5, 3.5, -5.5, -7.7\ndd -15.5, -21.5, 23.5, 30.1\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fmaddsub_pd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xc026000000000000\", \"0xc035800000000000\", \"0xc073c00000000000\", \"0xc083f00000000000\"],\n    \"XMM1\": [\"0x4050200000000000\", \"0x4063400000000000\", \"0xc0b8a08000000000\", \"0xc0d2b66000000000\"],\n    \"XMM2\": [\"0xc054400000000000\", \"0x4053b00000000000\", \"0x40c5e14000000000\", \"0xc0b5448000000000\"],\n    \"XMM3\": [\"0xc026000000000000\", \"0xc035800000000000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x4050200000000000\", \"0x4063400000000000\", \"0\", \"0\"],\n    \"XMM5\": [\"0xc054400000000000\", \"0x4053b00000000000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvmovups ymm3, [rel .data]\nvmovups ymm4, [rel .data2]\nvmovups ymm5, [rel .data3]\n\nvfmaddsub231pd ymm0, ymm1, ymm2\nvfmaddsub213pd ymm1, ymm0, ymm2\nvfmaddsub132pd ymm2, ymm1, ymm0\n\nvfmaddsub231pd xmm3, xmm4, xmm5\nvfmaddsub213pd xmm4, xmm3, xmm5\nvfmaddsub132pd xmm5, xmm4, xmm3\n\nhlt\n\nalign 32\n.data:\ndq 2.0, 3.0\ndq 6.0, 7.0\n\n.data2:\ndq -6.0, -7.0\ndq 20.0, 30.0\n\n.data3:\ndq 1.5, 3.5\ndq -15.5, -21.5\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fmaddsub_ps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xc1ac0000c1300000\", \"0x4294999942200000\", \"0xc41f8000c39e0000\", \"0x44bd400044690000\"],\n    \"XMM1\": [\"0x431a000042810000\", \"0xc4291999c39d4000\", \"0xc695b300c5c50400\", \"0x4793e90d47118880\"],\n    \"XMM2\": [\"0x429d8000c2a20000\", \"0xc49c105142bd0000\", \"0xc5aa2400462f0a00\", \"0x47eceac0c66fea00\"],\n    \"XMM3\": [\"0xc1ac0000c1300000\", \"0x4294999942200000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x431a000042810000\", \"0xc4291999c39d4000\", \"0\", \"0\"],\n    \"XMM5\": [\"0x429d8000c2a20000\", \"0xc49c105142bd0000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvmovups ymm3, [rel .data]\nvmovups ymm4, [rel .data2]\nvmovups ymm5, [rel .data3]\n\nvfmaddsub231ps ymm0, ymm1, ymm2\nvfmaddsub213ps ymm1, ymm0, ymm2\nvfmaddsub132ps ymm2, ymm1, ymm0\n\nvfmaddsub231ps xmm3, xmm4, xmm5\nvfmaddsub213ps xmm4, xmm3, xmm5\nvfmaddsub132ps xmm5, xmm4, xmm3\n\nhlt\n\nalign 32\n.data:\ndd 2.0, 3.0, 4.0, 5.0\ndd 6.0, 7.0, 8.0, 9.0\n\n.data2:\ndd -6.0, -7.0, -8.0, -9.0\ndd 20.0, 30.0, 40.0, 50.0\n\n.data3:\ndd 1.5, 3.5, -5.5, -7.7\ndd -15.5, -21.5, 23.5, 30.1\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fmsub_pd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xc150000900802300\", \"0xc3ac00013450041a\", \"0x40e00000c0c00000\", \"0xc1f0000041a00000\"],\n    \"XMM1\": [\"0x42400009c1008f71\", \"0xc5ac0001a728090b\", \"0x4150000100800300\", \"0x43ac00013450031a\"],\n    \"XMM2\": [\"0xc2401009ca40cfb8\", \"0x45ad8801c298f9b9\", \"0xc150000100800300\", \"0xc3ac00013450031a\"],\n    \"XMM3\": [\"0xc150000900802300\", \"0xc3ac00013450041a\", \"0\", \"0\"],\n    \"XMM4\": [\"0x42400009c1008f71\", \"0xc5ac0001a728090b\", \"0\", \"0\"],\n    \"XMM5\": [\"0xc2401009ca40cfb8\", \"0x45ad8801c298f9b9\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvmovups ymm3, [rel .data]\nvmovups ymm4, [rel .data2]\nvmovups ymm5, [rel .data3]\n\nvfmsub231pd ymm0, ymm1, ymm2\nvfmsub213pd ymm1, ymm0, ymm2\nvfmsub132pd ymm2, ymm1, ymm0\n\nvfmsub231pd xmm3, xmm4, xmm5\nvfmsub213pd xmm4, xmm3, xmm5\nvfmsub132pd xmm5, xmm4, xmm3\n\nhlt\n\nalign 32\n.data:\ndd 2.0, 3.0\ndd 6.0, 7.0\n\n.data2:\ndd -6.0, -7.0\ndd 20.0, 30.0\n\n.data3:\ndd 1.5, 3.5\ndd -15.5, -21.5\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fmsub_ps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xc1dc0000c1300000\", \"0x4280999942200000\", \"0xc4230000c39e0000\", \"0x44bb000044690000\"],\n    \"XMM1\": [\"0x433d000042810000\", \"0xc40ebfffc39d4000\", \"0xc698a500c5c50400\", \"0x479208f347118880\"],\n    \"XMM2\": [\"0xc38ea000c2a20000\", \"0x4297c7ac42bd0000\", \"0x47031480462f0a00\", \"0xc6e85899c66fea00\"],\n    \"XMM3\": [\"0xc1dc0000c1300000\", \"0x4280999942200000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x433d000042810000\", \"0xc40ebfffc39d4000\", \"0\", \"0\"],\n    \"XMM5\": [\"0xc38ea000c2a20000\", \"0x4297c7ac42bd0000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvmovups ymm3, [rel .data]\nvmovups ymm4, [rel .data2]\nvmovups ymm5, [rel .data3]\n\nvfmsub231ps ymm0, ymm1, ymm2\nvfmsub213ps ymm1, ymm0, ymm2\nvfmsub132ps ymm2, ymm1, ymm0\n\nvfmsub231ps xmm3, xmm4, xmm5\nvfmsub213ps xmm4, xmm3, xmm5\nvfmsub132ps xmm5, xmm4, xmm3\n\nhlt\n\nalign 32\n.data:\ndd 2.0, 3.0, 4.0, 5.0\ndd 6.0, 7.0, 8.0, 9.0\n\n.data2:\ndd -6.0, -7.0, -8.0, -9.0\ndd 20.0, 30.0, 40.0, 50.0\n\n.data3:\ndd 1.5, 3.5, -5.5, -7.7\ndd -15.5, -21.5, 23.5, 30.1\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fmsub_sd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xc026000000000000\", \"0x4008000000000000\", \"0\", \"0\"],\n    \"XMM1\": [\"0x4050200000000000\", \"0xc01c000000000000\", \"0\", \"0\"],\n    \"XMM2\": [\"0xc054400000000000\", \"0x400c000000000000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvfmsub231sd xmm0, xmm1, xmm2\nvfmsub213sd xmm1, xmm0, xmm2\nvfmsub132sd xmm2, xmm1, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 2.0, 3.0\ndq 6.0, 7.0\n\n.data2:\ndq -6.0, -7.0\ndq 20.0, 30.0\n\n.data3:\ndq 1.5, 3.5\ndq -15.5, -21.5\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fmsub_ss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x40400000c1300000\", \"0x40a0000040800000\", \"0\", \"0\"],\n    \"XMM1\": [\"0xc0e0000042810000\", \"0xc1100000c1000000\", \"0\", \"0\"],\n    \"XMM2\": [\"0x40600000c2a20000\", \"0xc0f66666c0b00000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvfmsub231ss xmm0, xmm1, xmm2\nvfmsub213ss xmm1, xmm0, xmm2\nvfmsub132ss xmm2, xmm1, xmm0\n\nhlt\n\nalign 32\n.data:\ndd 2.0, 3.0, 4.0, 5.0\ndd 6.0, 7.0, 8.0, 9.0\n\n.data2:\ndd -6.0, -7.0, -8.0, -9.0\ndd 20.0, 30.0, 40.0, 50.0\n\n.data3:\ndd 1.5, 3.5, -5.5, -7.7\ndd -15.5, -21.5, 23.5, 30.1\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fmsubadd_pd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xc01c000000000000\", \"0xc03b800000000000\", \"0xc073000000000000\", \"0xc084600000000000\"],\n    \"XMM1\": [\"0x4045c00000000000\", \"0x4067a00000000000\", \"0xc0b7cf8000000000\", \"0xc0d314a000000000\"],\n    \"XMM2\": [\"0x4040800000000000\", \"0xc071d40000000000\", \"0xc0959e0000000000\", \"0x40e0629000000000\"],\n    \"XMM3\": [\"0xc01c000000000000\", \"0xc03b800000000000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x4045c00000000000\", \"0x4067a00000000000\", \"0\", \"0\"],\n    \"XMM5\": [\"0x4040800000000000\", \"0xc071d40000000000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvmovups ymm3, [rel .data]\nvmovups ymm4, [rel .data2]\nvmovups ymm5, [rel .data3]\n\nvfmsubadd231pd ymm0, ymm1, ymm2\nvfmsubadd213pd ymm1, ymm0, ymm2\nvfmsubadd132pd ymm2, ymm1, ymm0\n\nvfmsubadd231pd xmm3, xmm4, xmm5\nvfmsubadd213pd xmm4, xmm3, xmm5\nvfmsubadd132pd xmm5, xmm4, xmm3\n\nhlt\n\nalign 32\n.data:\ndq 2.0, 3.0\ndq 6.0, 7.0\n\n.data2:\ndq -6.0, -7.0\ndq 20.0, 30.0\n\n.data3:\ndq 1.5, 3.5\ndq -15.5, -21.5\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fmsubadd_ps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xc1dc0000c0e00000\", \"0x4280999942400000\", \"0xc4230000c3980000\", \"0x44bb0000446d0000\"],\n    \"XMM1\": [\"0x433d0000422e0000\", \"0xc40ebfffc3c2c000\", \"0xc698a500c5be7c00\", \"0x479208f347143780\"],\n    \"XMM2\": [\"0xc38ea00042040000\", \"0x4297c7acc4236000\", \"0x47031480c4acf000\", \"0xc6e85899476b3d80\"],\n    \"XMM3\": [\"0xc1dc0000c0e00000\", \"0x4280999942400000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x433d0000422e0000\", \"0xc40ebfffc3c2c000\", \"0\", \"0\"],\n    \"XMM5\": [\"0xc38ea00042040000\", \"0x4297c7acc4236000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvmovups ymm3, [rel .data]\nvmovups ymm4, [rel .data2]\nvmovups ymm5, [rel .data3]\n\nvfmsubadd231ps ymm0, ymm1, ymm2\nvfmsubadd213ps ymm1, ymm0, ymm2\nvfmsubadd132ps ymm2, ymm1, ymm0\n\nvfmsubadd231ps xmm3, xmm4, xmm5\nvfmsubadd213ps xmm4, xmm3, xmm5\nvfmsubadd132ps xmm5, xmm4, xmm3\n\nhlt\n\nalign 32\n.data:\ndd 2.0, 3.0, 4.0, 5.0\ndd 6.0, 7.0, 8.0, 9.0\n\n.data2:\ndd -6.0, -7.0, -8.0, -9.0\ndd 20.0, 30.0, 40.0, 50.0\n\n.data3:\ndd 1.5, 3.5, -5.5, -7.7\ndd -15.5, -21.5, 23.5, 30.1\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fnmadd_pd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4150000900802300\", \"0x43ac00013450041a\", \"0xc0e00000c0c00000\", \"0x41f0000041a00000\"],\n    \"XMM1\": [\"0x42400009c1808f73\", \"0xc5ac0001a728090b\", \"0x4150000100800300\", \"0x43ac00013450031a\"],\n    \"XMM2\": [\"0x423fe01370809e58\", \"0xc5aa78018bb7185d\", \"0x4150000100800300\", \"0x43ac00013450031a\"],\n    \"XMM3\": [\"0x4150000900802300\", \"0x43ac00013450041a\", \"0\", \"0\"],\n    \"XMM4\": [\"0x42400009c1808f73\", \"0xc5ac0001a728090b\", \"0\", \"0\"],\n    \"XMM5\": [\"0x423fe01370809e58\", \"0xc5aa78018bb7185d\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvmovups ymm3, [rel .data]\nvmovups ymm4, [rel .data2]\nvmovups ymm5, [rel .data3]\n\nvfnmadd231pd ymm0, ymm1, ymm2\nvfnmadd213pd ymm1, ymm0, ymm2\nvfnmadd132pd ymm2, ymm1, ymm0\n\nvfnmadd231pd xmm3, xmm4, xmm5\nvfnmadd213pd xmm4, xmm3, xmm5\nvfnmadd132pd xmm5, xmm4, xmm3\n\nhlt\n\nalign 32\n.data:\ndd 2.0, 3.0\ndd 6.0, 7.0\n\n.data2:\ndd -6.0, -7.0\ndd 20.0, 30.0\n\n.data3:\ndd 1.5, 3.5\ndd -15.5, -21.5\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fnmadd_ps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x41dc000041300000\", \"0xc2809999c2200000\", \"0x44230000439e0000\", \"0xc4bb0000c4690000\"],\n    \"XMM1\": [\"0x4344000042870000\", \"0xc4129999c3a2c000\", \"0xc698fb00c5c5fc00\", \"0x4792270d4711b780\"],\n    \"XMM2\": [\"0x42c78000424c0000\", \"0xc4873051c4086000\", \"0xc5addc00c4b3b000\", \"0x47ea19da47674580\"],\n    \"XMM3\": [\"0x41dc000041300000\", \"0xc2809999c2200000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x4344000042870000\", \"0xc4129999c3a2c000\", \"0\", \"0\"],\n    \"XMM5\": [\"0x42c78000424c0000\", \"0xc4873051c4086000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvmovups ymm3, [rel .data]\nvmovups ymm4, [rel .data2]\nvmovups ymm5, [rel .data3]\n\nvfnmadd231ps ymm0, ymm1, ymm2\nvfnmadd213ps ymm1, ymm0, ymm2\nvfnmadd132ps ymm2, ymm1, ymm0\n\nvfnmadd231ps xmm3, xmm4, xmm5\nvfnmadd213ps xmm4, xmm3, xmm5\nvfnmadd132ps xmm5, xmm4, xmm3\n\nhlt\n\nalign 32\n.data:\ndd 2.0, 3.0, 4.0, 5.0\ndd 6.0, 7.0, 8.0, 9.0\n\n.data2:\ndd -6.0, -7.0, -8.0, -9.0\ndd 20.0, 30.0, 40.0, 50.0\n\n.data3:\ndd 1.5, 3.5, -5.5, -7.7\ndd -15.5, -21.5, 23.5, 30.1\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fnmadd_sd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4026000000000000\", \"0x4008000000000000\", \"0\", \"0\"],\n    \"XMM1\": [\"0x4050e00000000000\", \"0xc01c000000000000\", \"0\", \"0\"],\n    \"XMM2\": [\"0x4049800000000000\", \"0x400c000000000000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvfnmadd231sd xmm0, xmm1, xmm2\nvfnmadd213sd xmm1, xmm0, xmm2\nvfnmadd132sd xmm2, xmm1, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 2.0, 3.0\ndq 6.0, 7.0\n\n.data2:\ndq -6.0, -7.0\ndq 20.0, 30.0\n\n.data3:\ndq 1.5, 3.5\ndq -15.5, -21.5\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fnmadd_ss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4040000041300000\", \"0x40a0000040800000\", \"0\", \"0\"],\n    \"XMM1\": [\"0xc0e0000042870000\", \"0xc1100000c1000000\", \"0\", \"0\"],\n    \"XMM2\": [\"0x40600000424c0000\", \"0xc0f66666c0b00000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvfnmadd231ss xmm0, xmm1, xmm2\nvfnmadd213ss xmm1, xmm0, xmm2\nvfnmadd132ss xmm2, xmm1, xmm0\n\nhlt\n\nalign 32\n.data:\ndd 2.0, 3.0, 4.0, 5.0\ndd 6.0, 7.0, 8.0, 9.0\n\n.data2:\ndd -6.0, -7.0, -8.0, -9.0\ndd 20.0, 30.0, 40.0, 50.0\n\n.data3:\ndd 1.5, 3.5, -5.5, -7.7\ndd -15.5, -21.5, 23.5, 30.1\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fnmsub_pd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x414ffff200ffc600\", \"0x43ac00013450021a\", \"0x40e00000c0c00000\", \"0xc1f0000041a00000\"],\n    \"XMM1\": [\"0x423ffff381ff1d62\", \"0xc5ac0001a728070b\", \"0xc150000100800300\", \"0xc3ac00013450031a\"],\n    \"XMM2\": [\"0xc2400ff9ba3fce78\", \"0x45ad8801c298f79d\", \"0x4150000100800300\", \"0x43ac00013450031a\"],\n    \"XMM3\": [\"0x414ffff200ffc600\", \"0x43ac00013450021a\", \"0\", \"0\"],\n    \"XMM4\": [\"0x423ffff381ff1d62\", \"0xc5ac0001a728070b\", \"0\", \"0\"],\n    \"XMM5\": [\"0xc2400ff9ba3fce78\", \"0x45ad8801c298f79d\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvmovups ymm3, [rel .data]\nvmovups ymm4, [rel .data2]\nvmovups ymm5, [rel .data3]\n\nvfnmsub231pd ymm0, ymm1, ymm2\nvfnmsub213pd ymm1, ymm0, ymm2\nvfnmsub132pd ymm2, ymm1, ymm0\n\nvfnmsub231pd xmm3, xmm4, xmm5\nvfnmsub213pd xmm4, xmm3, xmm5\nvfnmsub132pd xmm5, xmm4, xmm3\n\nhlt\n\nalign 32\n.data:\ndd 2.0, 3.0\ndd 6.0, 7.0\n\n.data2:\ndd -6.0, -7.0\ndd 20.0, 30.0\n\n.data3:\ndd 1.5, 3.5\ndd -15.5, -21.5\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fnmsub_ps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x41ac000040e00000\", \"0xc2949999c2400000\", \"0x441f800043980000\", \"0xc4bd4000c46d0000\"],\n    \"XMM1\": [\"0x4313000042220000\", \"0xc4253fffc3bd4000\", \"0xc6955d00c5bd8400\", \"0x4793caf347140880\"],\n    \"XMM2\": [\"0xc35e4000c24c0000\", \"0x42b1c7ad42e50000\", \"0x4700438046286200\", \"0xc6eb24ffc6740a00\"],\n    \"XMM3\": [\"0x41ac000040e00000\", \"0xc2949999c2400000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x4313000042220000\", \"0xc4253fffc3bd4000\", \"0\", \"0\"],\n    \"XMM5\": [\"0xc35e4000c24c0000\", \"0x42b1c7ad42e50000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvmovups ymm3, [rel .data]\nvmovups ymm4, [rel .data2]\nvmovups ymm5, [rel .data3]\n\nvfnmsub231ps ymm0, ymm1, ymm2\nvfnmsub213ps ymm1, ymm0, ymm2\nvfnmsub132ps ymm2, ymm1, ymm0\n\nvfnmsub231ps xmm3, xmm4, xmm5\nvfnmsub213ps xmm4, xmm3, xmm5\nvfnmsub132ps xmm5, xmm4, xmm3\n\nhlt\n\nalign 32\n.data:\ndd 2.0, 3.0, 4.0, 5.0\ndd 6.0, 7.0, 8.0, 9.0\n\n.data2:\ndd -6.0, -7.0, -8.0, -9.0\ndd 20.0, 30.0, 40.0, 50.0\n\n.data3:\ndd 1.5, 3.5, -5.5, -7.7\ndd -15.5, -21.5, 23.5, 30.1\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fnmsub_sd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x401c000000000000\", \"0x4008000000000000\", \"0\", \"0\"],\n    \"XMM1\": [\"0x4044400000000000\", \"0xc01c000000000000\", \"0\", \"0\"],\n    \"XMM2\": [\"0xc049800000000000\", \"0x400c000000000000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvfnmsub231sd xmm0, xmm1, xmm2\nvfnmsub213sd xmm1, xmm0, xmm2\nvfnmsub132sd xmm2, xmm1, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 2.0, 3.0\ndq 6.0, 7.0\n\n.data2:\ndq -6.0, -7.0\ndq 20.0, 30.0\n\n.data3:\ndq 1.5, 3.5\ndq -15.5, -21.5\n"
  },
  {
    "path": "unittests/ASM/VEX/fma_fnmsub_ss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4040000040e00000\", \"0x40a0000040800000\", \"0\", \"0\"],\n    \"XMM1\": [\"0xc0e0000042220000\", \"0xc1100000c1000000\", \"0\", \"0\"],\n    \"XMM2\": [\"0x40600000c24c0000\", \"0xc0f66666c0b00000\", \"0\", \"0\"]\n  }\n}\n%endif\n\nvmovups ymm0, [rel .data]\nvmovups ymm1, [rel .data2]\nvmovups ymm2, [rel .data3]\n\nvfnmsub231ss xmm0, xmm1, xmm2\nvfnmsub213ss xmm1, xmm0, xmm2\nvfnmsub132ss xmm2, xmm1, xmm0\n\nhlt\n\nalign 32\n.data:\ndd 2.0, 3.0, 4.0, 5.0\ndd 6.0, 7.0, 8.0, 9.0\n\n.data2:\ndd -6.0, -7.0, -8.0, -9.0\ndd 20.0, 30.0, 40.0, 50.0\n\n.data3:\ndd 1.5, 3.5, -5.5, -7.7\ndd -15.5, -21.5, 23.5, 30.1\n"
  },
  {
    "path": "unittests/ASM/VEX/full_vpermq_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x00000000063afe2e\"\n  }\n}\n%endif\n\nmov rax, 0\n\n%assign i 0\n%rep 256\n\n; vpermq all the immediate encodings\nvpermq ymm0, [rel .random_data + ((i * 32) % 4096)], i\nvmovaps [rel .data_result + (i * 32)], ymm0\n\n; CRC32 (by 64) the results\ncrc32 rax, qword [rel .data_result + (i * 32) + 0]\ncrc32 rax, qword [rel .data_result + (i * 32) + 8]\ncrc32 rax, qword [rel .data_result + (i * 32) + 16]\ncrc32 rax, qword [rel .data_result + (i * 32) + 24]\n%assign i i+1\n%endrep\n\nhlt\n\nalign 32\n.data_result:\ntimes 256 dq 0, 0, 0, 0\n\nalign 32\n; 8192-bytes of random data\n.random_data:\ndb 0x18, 0xd6, 0xfe, 0x97, 0x75, 0x8c, 0x1a, 0x61, 0xc5, 0xc0, 0x7e, 0x3f, 0x46, 0xf9, 0xb0, 0xa3\ndb 0x16, 0xb2, 0x1c, 0x7b, 0x04, 0xa7, 0x7e, 0xbe, 0x04, 0xdc, 0xc6, 0x65, 0x43, 0x5e, 0xa4, 0x8e\ndb 0x40, 0xc5, 0x4f, 0x2f, 0xf2, 0x62, 0x6d, 0x1b, 0x41, 0xb6, 0x9c, 0xa4, 0xbf, 0x1a, 0x57, 0x1e\ndb 0x83, 0x53, 0x8a, 0x92, 0xbc, 0x67, 0xe8, 0xe8, 0xc3, 0xb9, 0xbc, 0xab, 0x38, 0xa0, 0x8e, 0x5d\ndb 0xcc, 0x2d, 0xa9, 0xd8, 0x74, 0xee, 0x8f, 0x57, 0x62, 0x9b, 0x0f, 0xf8, 0x76, 0x2a, 0x4d, 0x22\ndb 0x2f, 0xaf, 0x0b, 0x13, 0xbf, 0xa5, 0x87, 0xc1, 0x0f, 0xfd, 0x0b, 0x69, 0xbc, 0x58, 0x06, 0xa3\ndb 0xc4, 0x4f, 0x33, 0xf7, 0x53, 0xc8, 0xe6, 0x6b, 0xa5, 0x96, 0x33, 0x37, 0x89, 0xc1, 0x33, 0x4e\ndb 0xfb, 0x54, 0xbb, 0xd1, 0xcf, 0xa7, 0xe4, 0x77, 0x72, 0x3f, 0x68, 0xd1, 0x7b, 0xc7, 0x4f, 0x99\ndb 0xd8, 0xdd, 0xf3, 0x85, 0x10, 0x88, 0x0c, 0x1a, 0x80, 0x86, 0xd9, 0xce, 0x9d, 0x88, 0xc7, 0x2e\ndb 0x2b, 0xcb, 0x34, 0x17, 0xd6, 0x85, 0x1b, 0xa3, 0x8e, 0xc2, 0xbb, 0x74, 0x2c, 0xf2, 0x61, 0x09\ndb 0xaa, 0x7b, 0x1e, 0x5c, 0x15, 0xb6, 0x47, 0x08, 0xbb, 0x5d, 0x5b, 0x1b, 0x4c, 0xb9, 0xd1, 0x9c\ndb 0x49, 0xc3, 0x57, 0x93, 0x84, 0x43, 0x97, 0x65, 0x97, 0x5d, 0xb8, 0x4f, 0xe5, 0x69, 0x7e, 0x6e\ndb 0xc4, 0xee, 0xd3, 0x62, 0xcc, 0xf7, 0xd1, 0xd7, 0x88, 0xfe, 0x9b, 0xaa, 0x31, 0x10, 0x6c, 0x9b\ndb 0x37, 0x4a, 0x8e, 0x01, 0xbb, 0xe1, 0x02, 0xc0, 0x9a, 0xa4, 0x45, 0x7c, 0xb4, 0xc0, 0x5e, 0xda\ndb 0xf2, 0x15, 0x3b, 0xe5, 0x95, 0x65, 0xe3, 0xf2, 0xb0, 0x84, 0x6b, 0xb8, 0xf9, 0x11, 0xdd, 0xd4\ndb 0xed, 0x1d, 0xbf, 0xbd, 0xb9, 0x98, 0xe8, 0xab, 0x08, 0x21, 0xe1, 0x76, 0xcd, 0x31, 0x59, 0x35\ndb 0x16, 0x95, 0x15, 0xb9, 0x00, 0x2c, 0xb1, 0xf9, 0x7b, 0x4d, 0xaf, 0x80, 0x92, 0xa9, 0x31, 0x91\ndb 0xfe, 0xaa, 0x8e, 0xe4, 0x45, 0x28, 0x48, 0x40, 0x5c, 0xf7, 0xa9, 0x3f, 0x5a, 0x87, 0x51, 0x30\ndb 0x7b, 0x55, 0xfa, 0x8c, 0xec, 0xcc, 0x32, 0xd5, 0x8c, 0x5b, 0xa7, 0x1c, 0xc2, 0xee, 0x5f, 0xdb\ndb 0x3a, 0x5c, 0xdb, 0x3d, 0x8f, 0x17, 0x0c, 0xae, 0x70, 0x35, 0x3a, 0xdd, 0x07, 0xa1, 0x21, 0x53\ndb 0xa6, 0x4a, 0xa3, 0xd7, 0x65, 0x3f, 0x32, 0xcb, 0x48, 0x4e, 0x2e, 0x12, 0x47, 0x9e, 0x59, 0x8e\ndb 0xa6, 0x85, 0x04, 0x06, 0x60, 0xcc, 0xc3, 0x54, 0x91, 0x64, 0x14, 0x05, 0xad, 0xe8, 0x2d, 0x77\ndb 0x5b, 0x5d, 0xca, 0x6b, 0x8c, 0x3a, 0x89, 0x71, 0x30, 0xcd, 0xa0, 0x8e, 0x79, 0xf8, 0xa3, 0xdb\ndb 0x5c, 0x7b, 0x52, 0xcb, 0x6a, 0xb1, 0x32, 0x31, 0xbe, 0x1f, 0x1a, 0xb8, 0xb8, 0x5f, 0xc4, 0x12\ndb 0x0c, 0xd6, 0x9e, 0x0c, 0xef, 0xca, 0x5e, 0x71, 0x57, 0x9e, 0x70, 0x91, 0x38, 0x43, 0x5b, 0xd7\ndb 0x18, 0x83, 0xe2, 0x68, 0x38, 0x29, 0xd7, 0x55, 0x8b, 0x61, 0xfd, 0x6a, 0x81, 0xbf, 0x7c, 0xf1\ndb 0xc4, 0xcb, 0x4a, 0x45, 0xe5, 0x7f, 0xfe, 0x02, 0x09, 0x9d, 0x6e, 0xbe, 0x45, 0xc3, 0x2a, 0xf3\ndb 0xe4, 0x64, 0xcc, 0xe8, 0x70, 0x34, 0x96, 0x73, 0x63, 0xad, 0x3f, 0x02, 0x4b, 0xfd, 0xc4, 0x4f\ndb 0x40, 0x00, 0x29, 0x45, 0x50, 0x54, 0xb2, 0x9b, 0xe5, 0xa5, 0x88, 0xf2, 0xa0, 0xe1, 0x17, 0xe7\ndb 0xe6, 0xea, 0x20, 0x5b, 0x03, 0xa1, 0xdc, 0x1a, 0x73, 0x26, 0x90, 0x0f, 0x3e, 0x00, 0x05, 0x21\ndb 0x62, 0x3e, 0x9c, 0xe9, 0xb7, 0xc2, 0x63, 0x22, 0xc4, 0xd1, 0x13, 0x45, 0x43, 0x02, 0x99, 0x76\ndb 0x72, 0x4a, 0x86, 0xf9, 0xd3, 0x88, 0x96, 0xbd, 0xf1, 0xba, 0xd0, 0xa6, 0x35, 0x9c, 0x8e, 0xa1\ndb 0x46, 0x52, 0xd3, 0x64, 0xa7, 0x48, 0xba, 0xab, 0x2c, 0x45, 0xb1, 0x38, 0x95, 0xf0, 0xe9, 0xde\ndb 0x1e, 0x51, 0x16, 0x58, 0xa8, 0x27, 0x93, 0x6d, 0x26, 0x57, 0xb5, 0x26, 0xae, 0xd9, 0x74, 0xd7\ndb 0x00, 0x02, 0xd9, 0x91, 0xc2, 0xe1, 0xdb, 0xf4, 0x3f, 0xaa, 0x4e, 0x59, 0x35, 0xf1, 0x9b, 0xf9\ndb 0x13, 0x30, 0xb5, 0xc5, 0x7c, 0x4c, 0x8f, 0x00, 0x28, 0x5e, 0xc1, 0x52, 0xd8, 0x19, 0x0c, 0x0e\ndb 0x18, 0x4c, 0x92, 0x74, 0x6e, 0xae, 0xae, 0x42, 0x35, 0xfb, 0xe5, 0xc0, 0xf9, 0x08, 0xe2, 0x41\ndb 0xe6, 0x00, 0x90, 0x83, 0x73, 0xaa, 0x62, 0x80, 0x68, 0x3f, 0x53, 0x46, 0x74, 0x36, 0x43, 0x4c\ndb 0xd4, 0x62, 0x40, 0xcc, 0x46, 0x2d, 0x67, 0xa5, 0x06, 0x39, 0x7b, 0xaa, 0x64, 0xcd, 0xf4, 0x2a\ndb 0xf7, 0xd2, 0x0d, 0xcc, 0xb9, 0x7d, 0xb6, 0x73, 0x30, 0xe2, 0x3e, 0x92, 0xbe, 0x09, 0xf5, 0x41\ndb 0x93, 0xe4, 0x99, 0x96, 0x05, 0xb1, 0x74, 0xeb, 0x35, 0xcb, 0xd4, 0xac, 0xa9, 0x49, 0x34, 0x09\ndb 0x24, 0x7e, 0xea, 0xad, 0xcf, 0x14, 0xdd, 0xea, 0xe1, 0xf8, 0x77, 0x0d, 0x97, 0x6f, 0xfd, 0x49\ndb 0x8c, 0x3b, 0xec, 0x5e, 0xbc, 0x3f, 0xbd, 0xdb, 0xaf, 0xff, 0x31, 0xdd, 0xeb, 0xe7, 0xe7, 0x38\ndb 0x59, 0x2e, 0x1f, 0xf8, 0x00, 0x7f, 0xa6, 0x9c, 0x3e, 0x17, 0x35, 0x3a, 0xbe, 0x7d, 0xe5, 0x18\ndb 0x06, 0xc6, 0x9e, 0x08, 0xf9, 0x4b, 0xba, 0xde, 0xa2, 0x82, 0x76, 0x26, 0xb1, 0xe6, 0xdc, 0xcd\ndb 0xd8, 0x15, 0x21, 0x5a, 0x00, 0x05, 0x40, 0x30, 0x47, 0xc5, 0x17, 0x83, 0xa1, 0x36, 0xcf, 0x6d\ndb 0x7a, 0xe3, 0x52, 0xc3, 0x0b, 0x8b, 0x78, 0x6c, 0x68, 0xd9, 0xa7, 0x52, 0xdc, 0x09, 0x43, 0x00\ndb 0x5c, 0x2b, 0x63, 0x6b, 0x76, 0x12, 0x69, 0x9f, 0x2b, 0x71, 0x4f, 0x78, 0x64, 0x24, 0x34, 0x4c\ndb 0x5b, 0x79, 0xac, 0xcc, 0x83, 0xf5, 0x05, 0x86, 0x8b, 0xcc, 0xa9, 0xf0, 0x1c, 0x67, 0xf6, 0x4c\ndb 0xda, 0x7f, 0xaf, 0x11, 0xd4, 0x6f, 0x37, 0x5e, 0xf3, 0x90, 0x62, 0xfe, 0xb2, 0x2c, 0x42, 0xef\ndb 0x92, 0x86, 0x58, 0x26, 0x80, 0xdb, 0x87, 0xe3, 0x18, 0xb2, 0x3b, 0x9b, 0xf2, 0x27, 0x00, 0x0a\ndb 0x87, 0x29, 0x2c, 0xe4, 0xc0, 0xba, 0x50, 0x6e, 0x1a, 0xd1, 0x27, 0xb2, 0xd0, 0xcf, 0x3d, 0x2d\ndb 0x3e, 0x74, 0xce, 0x0f, 0x1c, 0x13, 0x16, 0xc8, 0x7d, 0xc6, 0xcf, 0x23, 0x9d, 0xde, 0xca, 0x99\ndb 0x8d, 0x5d, 0x1c, 0xe7, 0x49, 0xbf, 0x30, 0x9c, 0xd7, 0xda, 0x78, 0xfe, 0x92, 0x4d, 0x56, 0x5f\ndb 0xc6, 0xd7, 0xdd, 0xa2, 0x94, 0x6b, 0xc1, 0x71, 0xd1, 0xb7, 0x3c, 0x7c, 0xb9, 0x05, 0xa8, 0x58\ndb 0x6e, 0x13, 0x3c, 0x12, 0xe2, 0xeb, 0x1f, 0xce, 0x41, 0x96, 0xda, 0xf8, 0xbe, 0x40, 0x2b, 0xaf\ndb 0x56, 0x9f, 0xae, 0x34, 0x1c, 0x69, 0xcd, 0x7b, 0x7c, 0x90, 0x36, 0x43, 0x00, 0xa1, 0x57, 0xc6\ndb 0xc6, 0x99, 0xc2, 0x44, 0x73, 0xe5, 0x65, 0x30, 0x3d, 0xfe, 0x7b, 0xf3, 0x70, 0xc5, 0x3c, 0x47\ndb 0xce, 0xbc, 0xe9, 0xa7, 0x99, 0xac, 0x14, 0x0a, 0x76, 0x92, 0xa8, 0xb2, 0x59, 0xbb, 0x59, 0xb6\ndb 0x2b, 0x6c, 0x30, 0x88, 0xca, 0x71, 0x45, 0xe3, 0x15, 0xaf, 0x85, 0xd3, 0xe7, 0x9c, 0xf1, 0xb2\ndb 0xb6, 0xe1, 0xdb, 0x70, 0x80, 0xe5, 0x36, 0xd9, 0xfe, 0x93, 0x58, 0x22, 0x45, 0x9b, 0x27, 0x98\ndb 0xbd, 0x6a, 0x8e, 0x6f, 0xfd, 0xa7, 0xb4, 0x7b, 0xa4, 0xb3, 0xc5, 0x64, 0x2c, 0x74, 0x27, 0x16\ndb 0x95, 0x6e, 0x1f, 0x9e, 0x33, 0x00, 0x09, 0x42, 0x70, 0xcd, 0x43, 0xf4, 0x8e, 0x93, 0xb5, 0xe1\ndb 0x89, 0xfd, 0x4c, 0x6f, 0xce, 0x0c, 0xde, 0xe7, 0xc7, 0xa4, 0x13, 0x41, 0xe4, 0x46, 0xf8, 0x68\ndb 0xc4, 0xce, 0x09, 0xd3, 0x28, 0xd9, 0xaf, 0x5e, 0x5b, 0x2f, 0xe6, 0xcb, 0xd1, 0xcc, 0x5d, 0x3c\ndb 0x4b, 0x01, 0x94, 0x0d, 0xbb, 0x7d, 0x64, 0x80, 0xcd, 0x8f, 0xea, 0xc5, 0x41, 0x7b, 0xc5, 0x40\ndb 0x92, 0xd0, 0xcb, 0xad, 0x66, 0x2c, 0x21, 0x2d, 0x95, 0xb7, 0x14, 0x4f, 0x21, 0xf4, 0xaa, 0xfe\ndb 0x60, 0xd4, 0x1f, 0x32, 0x37, 0xcc, 0xc5, 0x38, 0x85, 0x77, 0x29, 0xfd, 0x1c, 0x10, 0x9d, 0x84\ndb 0x19, 0xe4, 0xed, 0x64, 0xdc, 0xd5, 0xd4, 0x8f, 0x30, 0xf4, 0xbe, 0xc6, 0xfc, 0xfe, 0x60, 0x5c\ndb 0xba, 0x6a, 0x5f, 0x18, 0x4a, 0xa0, 0xec, 0xa8, 0xec, 0x80, 0xe2, 0x76, 0x1b, 0x61, 0x96, 0xfb\ndb 0xef, 0x62, 0xe3, 0x60, 0xf5, 0x87, 0xdb, 0x4d, 0x8f, 0x4e, 0xd2, 0xf9, 0x0b, 0x81, 0x03, 0x8b\ndb 0x56, 0xdc, 0x02, 0xe5, 0x7b, 0xa7, 0xba, 0x8a, 0xac, 0x6c, 0xd3, 0xd0, 0x49, 0xea, 0xc0, 0xdb\ndb 0x23, 0xba, 0xa6, 0x9f, 0x9c, 0x10, 0x8c, 0x82, 0x07, 0x12, 0x14, 0xf1, 0x6b, 0x8d, 0xe5, 0x71\ndb 0x9e, 0x58, 0x95, 0xa3, 0x1e, 0xe8, 0x34, 0x9a, 0x7d, 0x7a, 0xf4, 0x10, 0xd5, 0xb2, 0x23, 0xbe\ndb 0x28, 0x60, 0x07, 0xd0, 0xce, 0x65, 0x3a, 0x79, 0x66, 0x40, 0xc8, 0xb2, 0xb9, 0x0b, 0x16, 0x63\ndb 0x43, 0x02, 0x64, 0x27, 0xda, 0x87, 0x4f, 0xbe, 0x45, 0xe4, 0xf5, 0x51, 0xfa, 0xc6, 0x59, 0x9d\ndb 0x11, 0xfd, 0x72, 0xf1, 0x3f, 0x86, 0x91, 0x8f, 0xbe, 0x6a, 0x9a, 0x2b, 0x09, 0xe4, 0x67, 0xec\ndb 0x29, 0x43, 0x2c, 0xac, 0x34, 0xe2, 0xdc, 0x90, 0x11, 0x80, 0x13, 0x1c, 0xeb, 0x7b, 0xd6, 0xd9\ndb 0x7a, 0xd2, 0x57, 0xdf, 0xf2, 0x95, 0x47, 0x21, 0xb2, 0xd7, 0x48, 0x89, 0x9c, 0x91, 0xe6, 0x8d\ndb 0xd5, 0xd6, 0xc0, 0xf1, 0x65, 0xad, 0x40, 0x09, 0x9b, 0x3b, 0xc8, 0x5d, 0xe0, 0xd7, 0x23, 0x5c\ndb 0xbf, 0x13, 0x84, 0xe4, 0x91, 0xa7, 0xd6, 0x14, 0x96, 0x58, 0xa1, 0x9d, 0xef, 0xcf, 0xf6, 0x03\ndb 0x5b, 0x38, 0x9d, 0x45, 0xb1, 0x93, 0x86, 0x11, 0x67, 0x82, 0xb3, 0x26, 0x21, 0xb0, 0xb7, 0xc1\ndb 0x85, 0x63, 0xe5, 0x4a, 0x40, 0x3f, 0x93, 0x8e, 0xe5, 0xb5, 0x62, 0xf7, 0x33, 0x10, 0xb9, 0x4e\ndb 0x65, 0x05, 0x88, 0x4f, 0x95, 0x7d, 0x45, 0xdc, 0x8c, 0xc5, 0x3f, 0x6a, 0xf4, 0x01, 0x46, 0x68\ndb 0x0d, 0xd4, 0x89, 0x9e, 0xc1, 0xf5, 0x81, 0x06, 0x7a, 0x55, 0x7b, 0x52, 0xdd, 0x1f, 0x67, 0xf6\ndb 0x36, 0xed, 0xf1, 0xc5, 0xde, 0x3a, 0xb4, 0x66, 0x9a, 0x15, 0x9f, 0xa1, 0xf5, 0x8a, 0xc0, 0x44\ndb 0xe1, 0xc2, 0x0a, 0x6b, 0x17, 0xe2, 0xf8, 0x1b, 0x2c, 0x57, 0x30, 0xf1, 0xc0, 0xdd, 0xad, 0x98\ndb 0x7c, 0x99, 0x25, 0x50, 0x99, 0x43, 0xc7, 0xec, 0x55, 0xac, 0x05, 0xa4, 0x5d, 0xb9, 0x91, 0x96\ndb 0x43, 0x9b, 0x6b, 0x03, 0xb5, 0x09, 0xf8, 0xaa, 0xf7, 0x7f, 0xc7, 0xec, 0x9c, 0xfd, 0x6a, 0xdf\ndb 0x30, 0xd1, 0x38, 0xf1, 0x5b, 0x6b, 0xd0, 0x19, 0x8e, 0xba, 0x49, 0x74, 0xd3, 0x10, 0x87, 0x6c\ndb 0x9c, 0x9f, 0xfd, 0x46, 0xab, 0x84, 0x96, 0x12, 0x5c, 0xa1, 0xc2, 0x1a, 0x33, 0xc0, 0x23, 0xbd\ndb 0x01, 0xdf, 0xd4, 0x85, 0x69, 0x62, 0xbc, 0x3f, 0x2c, 0xe5, 0xfc, 0x66, 0x14, 0x13, 0xd2, 0xd5\ndb 0x12, 0x96, 0xdc, 0x3b, 0x14, 0x79, 0x96, 0x9f, 0x07, 0x5a, 0xc1, 0x65, 0xe1, 0xc8, 0x57, 0x7d\ndb 0x35, 0xa2, 0xcc, 0xaa, 0x94, 0xda, 0xb0, 0x4d, 0xe2, 0x5e, 0x4c, 0x39, 0x0d, 0x8e, 0xb6, 0x2f\ndb 0xe6, 0xcd, 0x58, 0xb2, 0x86, 0xf4, 0x1f, 0xf6, 0xb0, 0xd8, 0xf4, 0x42, 0x31, 0x4b, 0x6a, 0x5e\ndb 0x2d, 0x2f, 0xdb, 0x9c, 0xc5, 0x5a, 0x45, 0xd1, 0x17, 0x1a, 0xc7, 0xc5, 0xa0, 0x51, 0xbc, 0xe6\ndb 0xa9, 0xab, 0xc6, 0x3b, 0x3b, 0xf6, 0xce, 0xb5, 0x3b, 0xdc, 0x95, 0x10, 0x20, 0x1d, 0x1e, 0x64\ndb 0xa7, 0xe4, 0x1e, 0x86, 0x7a, 0xb1, 0x90, 0x12, 0x1d, 0x21, 0x43, 0x87, 0xbf, 0x19, 0x22, 0x02\ndb 0x3a, 0xbf, 0xa6, 0x0d, 0x91, 0x2f, 0x66, 0xc9, 0xd5, 0x87, 0xfc, 0xe7, 0xb6, 0x56, 0xf8, 0xc3\ndb 0x9e, 0x5e, 0x2f, 0xfd, 0xae, 0x3f, 0x01, 0x3b, 0x98, 0x7d, 0x6a, 0x3c, 0xd8, 0xb1, 0xf2, 0xec\ndb 0xa6, 0x54, 0x2a, 0xac, 0xc5, 0xdd, 0x4c, 0x8b, 0x4f, 0x7a, 0x95, 0x00, 0xe0, 0x9a, 0x35, 0x10\ndb 0xa8, 0xf5, 0xc7, 0xf6, 0x2c, 0xf2, 0x16, 0x2e, 0xa8, 0xb6, 0xad, 0x01, 0xba, 0x14, 0x63, 0xdd\ndb 0x5c, 0x02, 0xd8, 0xb3, 0x3d, 0x2c, 0x5b, 0x51, 0xd2, 0xb3, 0x20, 0x14, 0xbd, 0x6e, 0xee, 0x23\ndb 0x33, 0xd8, 0xd1, 0x8f, 0x02, 0x5b, 0xf4, 0xd0, 0x03, 0x55, 0x81, 0x50, 0x71, 0x47, 0xaa, 0x55\ndb 0x9c, 0x02, 0xb4, 0x07, 0x76, 0xb9, 0x3e, 0x6b, 0x59, 0x7c, 0xee, 0x46, 0xb4, 0x17, 0xe5, 0x01\ndb 0xf3, 0x0a, 0xdc, 0x74, 0xbd, 0x65, 0xee, 0x37, 0x10, 0x58, 0xbf, 0xa4, 0xd2, 0x7e, 0xb5, 0x6c\ndb 0x1e, 0xcd, 0xb8, 0x02, 0x65, 0x27, 0x72, 0x05, 0xe0, 0x40, 0x29, 0x61, 0xfc, 0x46, 0x13, 0x81\ndb 0x1d, 0xdf, 0x9a, 0x47, 0x20, 0x2a, 0x52, 0x1e, 0x30, 0x77, 0x74, 0x45, 0x30, 0x63, 0xb4, 0xb9\ndb 0x14, 0xb0, 0x2c, 0x0f, 0xea, 0x93, 0xda, 0xe1, 0xd7, 0xda, 0xf4, 0xb6, 0x71, 0x91, 0x53, 0x36\ndb 0xef, 0x57, 0xf7, 0xbc, 0xa4, 0x39, 0x3f, 0x42, 0x79, 0xb5, 0xb1, 0xc4, 0x53, 0x2c, 0xfc, 0xe1\ndb 0xe6, 0x47, 0xcb, 0x5d, 0x32, 0xb8, 0xc9, 0x62, 0x0b, 0x5e, 0xb8, 0xe5, 0x35, 0xf8, 0xd5, 0x45\ndb 0xa6, 0x80, 0x18, 0x59, 0x16, 0x32, 0x04, 0xe2, 0xe6, 0x0c, 0x4b, 0xbf, 0x38, 0x6a, 0x6d, 0xd8\ndb 0x96, 0x2c, 0xab, 0xc4, 0xc5, 0xc3, 0x65, 0x22, 0x76, 0x4f, 0x8c, 0xf0, 0x47, 0x90, 0x99, 0xb0\ndb 0xfc, 0xaa, 0xd0, 0x07, 0x39, 0x38, 0xd8, 0xd5, 0x53, 0x28, 0xf8, 0xac, 0xf5, 0x64, 0x1a, 0x46\ndb 0xd3, 0xff, 0x76, 0xb4, 0xcb, 0x56, 0xd5, 0xac, 0x05, 0x48, 0xc5, 0xbb, 0xe8, 0x2c, 0x6d, 0xd6\ndb 0x29, 0xf2, 0xe0, 0x01, 0x8c, 0xa3, 0x70, 0x5c, 0x76, 0x52, 0x16, 0x6a, 0x2f, 0x5a, 0x1c, 0x43\ndb 0x62, 0x1a, 0x17, 0xd7, 0x29, 0x8f, 0x99, 0xb7, 0xf9, 0xe3, 0x69, 0xe6, 0x61, 0x6a, 0x01, 0xa3\ndb 0xf2, 0xbe, 0xca, 0xb3, 0xfe, 0x53, 0x03, 0xd1, 0xdf, 0x4c, 0xd6, 0xa3, 0xcf, 0x59, 0xf5, 0xab\ndb 0xa1, 0x3d, 0x14, 0x84, 0x0e, 0xe2, 0x2b, 0x9a, 0x90, 0x48, 0xb3, 0x30, 0x6a, 0xaa, 0x8c, 0xe7\ndb 0x36, 0x58, 0xc3, 0x81, 0xf7, 0x3e, 0x27, 0x4b, 0x83, 0xd8, 0x5a, 0x6e, 0x49, 0x14, 0x12, 0x41\ndb 0xd3, 0x43, 0xa7, 0xa7, 0x0b, 0x38, 0x3b, 0x14, 0xf5, 0xe5, 0xd9, 0x27, 0x57, 0x34, 0x13, 0xcf\ndb 0xc1, 0x7f, 0xa5, 0x81, 0x29, 0xb0, 0x5f, 0x03, 0x87, 0x74, 0x1a, 0xad, 0x5a, 0xbc, 0xdf, 0xfb\ndb 0xac, 0x85, 0xdb, 0x62, 0x3b, 0x52, 0x61, 0xef, 0xb1, 0x71, 0xeb, 0x10, 0x8e, 0x54, 0xf1, 0xe1\ndb 0x66, 0xe7, 0x90, 0xd3, 0x88, 0xc1, 0x78, 0x2c, 0x11, 0xbb, 0xe7, 0xd0, 0x33, 0x45, 0xdb, 0x57\ndb 0x34, 0x26, 0xbf, 0x9b, 0x44, 0x95, 0x90, 0xe2, 0xca, 0x6b, 0x0f, 0xc2, 0xa9, 0x0a, 0x93, 0x6c\ndb 0x29, 0x65, 0xa1, 0x1e, 0xb4, 0x2b, 0xf3, 0xe7, 0x00, 0x9e, 0x47, 0xd7, 0x6a, 0x61, 0x5a, 0x68\ndb 0xe0, 0x45, 0x5d, 0xf6, 0x2f, 0x6f, 0x94, 0x2a, 0xfa, 0x35, 0x74, 0xcc, 0x39, 0x6a, 0x2b, 0xa7\ndb 0x33, 0xfd, 0xe5, 0xc1, 0x83, 0xbc, 0x2e, 0xa1, 0xa1, 0xc3, 0x44, 0xaa, 0x72, 0x07, 0x8c, 0xa2\ndb 0x90, 0xdc, 0x96, 0xde, 0xfc, 0x79, 0xb2, 0x3d, 0x70, 0xdd, 0xbe, 0xd8, 0x43, 0x86, 0xd0, 0xee\ndb 0x12, 0x2f, 0x60, 0xa1, 0xa8, 0x88, 0x0e, 0xdb, 0x21, 0xca, 0x6c, 0xab, 0xd0, 0xc6, 0xa2, 0x77\ndb 0xb2, 0x97, 0x37, 0x62, 0x32, 0xf5, 0x70, 0x47, 0x1d, 0x22, 0x08, 0x23, 0x9c, 0x4d, 0xd0, 0x7b\ndb 0x65, 0x46, 0x3d, 0x1d, 0x35, 0xef, 0xf7, 0xb3, 0x13, 0x54, 0xb8, 0xf4, 0x37, 0x26, 0x77, 0x84\ndb 0x9c, 0xa2, 0x7e, 0x26, 0x2a, 0x0e, 0xbd, 0x39, 0x9f, 0x0f, 0x3b, 0xcb, 0xdf, 0x5a, 0xa8, 0xc0\ndb 0x50, 0xff, 0x91, 0xd1, 0x81, 0xe0, 0xee, 0x83, 0x07, 0x32, 0x5d, 0xab, 0x31, 0x4c, 0xfe, 0x21\ndb 0x5f, 0x3b, 0xaa, 0x46, 0xdd, 0xf2, 0x9f, 0x5a, 0x57, 0x34, 0x54, 0x86, 0x3e, 0x1e, 0xda, 0xbe\ndb 0x78, 0xcb, 0x08, 0xda, 0xc9, 0x76, 0x28, 0x1f, 0xfe, 0x6f, 0x05, 0xd5, 0x7d, 0x4e, 0xbb, 0xf6\ndb 0x2d, 0x11, 0x2f, 0x9d, 0x4c, 0x05, 0xe6, 0xc5, 0xdc, 0xcd, 0x95, 0x7d, 0x31, 0xc5, 0xb9, 0x0e\ndb 0xdf, 0x83, 0x30, 0x8b, 0xba, 0xfd, 0xf5, 0xaa, 0x5c, 0xe0, 0x3e, 0xa6, 0xdd, 0x51, 0xf2, 0xb2\ndb 0xcb, 0x3e, 0x67, 0x8d, 0x59, 0x62, 0x6d, 0x58, 0x92, 0xbe, 0x95, 0xb7, 0x9f, 0x0c, 0x49, 0x3f\ndb 0xaf, 0x3c, 0x45, 0x76, 0xf6, 0xeb, 0x9b, 0x42, 0x01, 0x2e, 0xd4, 0x8a, 0x9f, 0x92, 0xca, 0xdb\ndb 0xd3, 0x55, 0x5e, 0x92, 0x01, 0x85, 0x63, 0xa2, 0x61, 0x62, 0x30, 0x64, 0xa2, 0xb2, 0x9e, 0x11\ndb 0xb9, 0xb1, 0x4d, 0x4b, 0x90, 0x1c, 0xea, 0xd2, 0xd1, 0x3d, 0x11, 0xe1, 0xe1, 0x66, 0xb9, 0x2f\ndb 0x5f, 0x3c, 0x0a, 0x9a, 0xba, 0x6b, 0x0f, 0x47, 0x54, 0x5d, 0xfc, 0x11, 0x2f, 0x42, 0xdf, 0x7f\ndb 0x22, 0x60, 0x18, 0x75, 0x05, 0x1d, 0x25, 0x23, 0x75, 0x8d, 0x77, 0x89, 0x03, 0xb7, 0x74, 0x1a\ndb 0xff, 0xaa, 0x2b, 0xb0, 0x5d, 0x9a, 0xa6, 0x3f, 0xd0, 0x6b, 0xe6, 0x28, 0xae, 0xf9, 0xe6, 0x5a\ndb 0xbb, 0x3d, 0x0a, 0x94, 0x5f, 0x9b, 0x96, 0x3b, 0xfb, 0x38, 0x8f, 0x93, 0x6f, 0xf2, 0x1e, 0x5c\ndb 0xc5, 0x8b, 0x44, 0xf7, 0x26, 0xc6, 0x3e, 0xf6, 0x60, 0xbf, 0x54, 0xb4, 0x21, 0xfb, 0xae, 0x80\ndb 0xdb, 0x1a, 0xd7, 0xa1, 0xb9, 0x1b, 0xc7, 0x8d, 0xb4, 0x11, 0x3e, 0x2b, 0x19, 0xb3, 0xfb, 0xb0\ndb 0xb3, 0xe0, 0xc7, 0x35, 0x34, 0x80, 0xf0, 0xee, 0xf5, 0x46, 0x66, 0x93, 0x36, 0xd7, 0x0f, 0x44\ndb 0xb3, 0xe0, 0x15, 0x6a, 0xc7, 0xb1, 0x1e, 0xc4, 0x68, 0x73, 0xe5, 0x43, 0x2e, 0xa6, 0x26, 0xdf\ndb 0xe3, 0x35, 0x8f, 0xa5, 0x96, 0x52, 0xb8, 0x38, 0xfc, 0x01, 0x76, 0x92, 0xb7, 0x89, 0x09, 0x0a\ndb 0x88, 0x89, 0x20, 0x7f, 0x0f, 0x84, 0xb6, 0x44, 0x22, 0xa8, 0x27, 0xbf, 0x97, 0x65, 0x3e, 0xa9\ndb 0x92, 0x64, 0x42, 0xfb, 0xa8, 0xd7, 0xf3, 0x26, 0x28, 0x2c, 0xb6, 0x59, 0x66, 0x80, 0xe7, 0x49\ndb 0x1c, 0x12, 0x4e, 0x46, 0xfe, 0xf6, 0x3f, 0xdb, 0x79, 0x30, 0x6a, 0x99, 0xf3, 0x8a, 0x9e, 0x26\ndb 0x4f, 0x62, 0x65, 0xde, 0x9b, 0xb9, 0x03, 0x1c, 0x1e, 0xcf, 0x5c, 0x14, 0x63, 0x3e, 0xa4, 0x18\ndb 0x99, 0x79, 0x38, 0xbc, 0x96, 0x78, 0xd9, 0xd1, 0x51, 0x0e, 0xe5, 0xb0, 0x6e, 0xaf, 0xa2, 0xd0\ndb 0x60, 0x4e, 0x71, 0xc9, 0xeb, 0x8a, 0x86, 0xb6, 0x8a, 0x71, 0x66, 0x54, 0x99, 0xd1, 0x52, 0x48\ndb 0x53, 0x0a, 0x0a, 0xce, 0x84, 0x7a, 0xb8, 0xff, 0x5b, 0x44, 0x4c, 0x21, 0x7a, 0x47, 0xe3, 0xc9\ndb 0xb5, 0x0d, 0xdb, 0xe7, 0x1b, 0x7a, 0xf9, 0xde, 0x22, 0xb4, 0xf1, 0x64, 0x64, 0x55, 0x79, 0x3b\ndb 0x84, 0xc1, 0xdb, 0xd9, 0x1a, 0x57, 0x4f, 0x6d, 0x37, 0x4c, 0xe5, 0x36, 0x63, 0xff, 0x0c, 0x2b\ndb 0x11, 0xa1, 0x12, 0x46, 0x2f, 0x11, 0x70, 0x63, 0x7a, 0x5b, 0x5d, 0xd0, 0x55, 0x40, 0xab, 0xf8\ndb 0xd5, 0x99, 0xfe, 0x79, 0xfa, 0x4e, 0x35, 0xe2, 0xd7, 0x0f, 0x4d, 0x0e, 0xf9, 0xc1, 0x40, 0x63\ndb 0x19, 0x5e, 0xb9, 0x2f, 0x65, 0x4d, 0xee, 0x02, 0x1b, 0xcf, 0x5f, 0x2a, 0xb8, 0x5e, 0x2b, 0xdb\ndb 0x2e, 0x18, 0xaf, 0xc4, 0x49, 0xee, 0xef, 0x36, 0x42, 0xe8, 0xbc, 0x21, 0x0b, 0x07, 0xdb, 0x70\ndb 0x0e, 0xc2, 0xfa, 0x6e, 0x39, 0x2c, 0xf6, 0xbc, 0xde, 0x87, 0x69, 0x92, 0x45, 0x80, 0x35, 0x14\ndb 0xba, 0xb2, 0x08, 0x69, 0x26, 0xec, 0x78, 0x17, 0x1c, 0x57, 0x86, 0x8c, 0xe3, 0x58, 0x85, 0x09\ndb 0x26, 0xb5, 0xd6, 0x8c, 0x9d, 0x61, 0x04, 0x87, 0x00, 0x1b, 0x32, 0x81, 0x46, 0xa8, 0x43, 0x98\ndb 0xdd, 0x36, 0xa0, 0xff, 0x9f, 0x13, 0x1b, 0x9e, 0x7a, 0x20, 0x4f, 0xa8, 0x0e, 0xd3, 0xdb, 0x31\ndb 0x1d, 0x07, 0x6a, 0x7e, 0x10, 0xc1, 0x59, 0x0b, 0x96, 0xf7, 0x98, 0x0c, 0x8f, 0xb7, 0x87, 0x10\ndb 0x91, 0xe7, 0xf0, 0xa3, 0x98, 0x28, 0xce, 0xfd, 0x52, 0xa5, 0xdd, 0xe2, 0xf7, 0xbe, 0x7a, 0x73\ndb 0xeb, 0x9a, 0xac, 0x7f, 0x53, 0xe9, 0x89, 0xb9, 0x96, 0xba, 0x32, 0x4b, 0x2d, 0xe2, 0x13, 0x00\ndb 0xed, 0xac, 0x6d, 0x97, 0x62, 0xa0, 0x9b, 0x3a, 0x36, 0x8f, 0x54, 0xf6, 0x0d, 0x46, 0x10, 0xca\ndb 0x12, 0xb9, 0x81, 0x21, 0x47, 0xf5, 0x20, 0x41, 0xf1, 0x29, 0x91, 0x59, 0xe8, 0x3a, 0x76, 0xb2\ndb 0xf2, 0x3c, 0xad, 0xba, 0x76, 0xa3, 0x93, 0x84, 0x8c, 0xdb, 0x5f, 0xe0, 0x45, 0x25, 0xcc, 0xc8\ndb 0x4f, 0x6a, 0x46, 0xa0, 0x1e, 0xa7, 0xd4, 0x88, 0xa5, 0xed, 0x50, 0xde, 0x01, 0xe1, 0xde, 0xe0\ndb 0x00, 0xa9, 0x07, 0x02, 0x2e, 0xcf, 0xb6, 0x1a, 0x31, 0x43, 0x40, 0xc2, 0x35, 0x17, 0x66, 0x4d\ndb 0x95, 0xaf, 0x26, 0x9b, 0x18, 0x19, 0xa9, 0x30, 0xb6, 0x7b, 0xb0, 0xb1, 0x26, 0x29, 0x47, 0x45\ndb 0xd5, 0x2a, 0xa1, 0xac, 0x82, 0x50, 0x74, 0x44, 0x8c, 0x9e, 0xc3, 0x1f, 0x19, 0x26, 0xc5, 0x67\ndb 0x69, 0xe2, 0x0e, 0xfd, 0x9e, 0xa2, 0x4f, 0x50, 0xed, 0x9f, 0x94, 0x89, 0x9a, 0x73, 0x54, 0xec\ndb 0x77, 0x22, 0x53, 0xa2, 0xce, 0xa4, 0xf4, 0x6e, 0x7c, 0x6e, 0xda, 0xeb, 0xaf, 0x6f, 0xc9, 0x11\ndb 0xa9, 0x7d, 0x2a, 0xbb, 0x00, 0x22, 0x99, 0x10, 0xf7, 0x67, 0x4f, 0x2f, 0x2f, 0xfc, 0x79, 0xb6\ndb 0x83, 0x78, 0x19, 0xe3, 0x44, 0xdb, 0x66, 0xbf, 0xe8, 0xab, 0x32, 0xa5, 0x57, 0x85, 0x8c, 0xae\ndb 0xae, 0x9d, 0x8b, 0xbb, 0x6e, 0xde, 0xab, 0x6c, 0x64, 0xac, 0xca, 0xd0, 0x4b, 0x1c, 0x1c, 0x30\ndb 0x9e, 0x88, 0x60, 0x75, 0x0c, 0x42, 0x84, 0x41, 0x76, 0xcd, 0x82, 0xef, 0x80, 0x79, 0x0f, 0xeb\ndb 0xa3, 0xb8, 0xad, 0x1d, 0x45, 0x4b, 0x0e, 0xd9, 0x07, 0x48, 0x7d, 0x82, 0xd8, 0xf7, 0xcc, 0x2f\ndb 0x7a, 0x0e, 0xb1, 0x82, 0x95, 0x6e, 0x74, 0x78, 0xe8, 0x0c, 0xb5, 0x12, 0x26, 0x72, 0x55, 0x8b\ndb 0x0e, 0x29, 0x86, 0xd3, 0xce, 0x88, 0xa6, 0x29, 0xe7, 0x18, 0x9b, 0xbc, 0x13, 0x90, 0x89, 0xf6\ndb 0xa5, 0x20, 0x70, 0x3b, 0xbd, 0x25, 0x9c, 0x47, 0xb8, 0x9a, 0xd7, 0x72, 0xb5, 0x55, 0xe5, 0x92\ndb 0x98, 0x89, 0x0f, 0x12, 0xe1, 0xe1, 0x0c, 0x2c, 0x7c, 0xca, 0x27, 0x6e, 0x9b, 0x13, 0x9d, 0xc0\ndb 0x51, 0xa5, 0x10, 0x31, 0xda, 0xe5, 0x40, 0x7c, 0x3a, 0x67, 0x14, 0xa5, 0x92, 0x99, 0xa0, 0xf2\ndb 0xa6, 0xba, 0x61, 0xa9, 0x28, 0x2d, 0x10, 0xa8, 0x23, 0x09, 0x26, 0x18, 0x13, 0x6a, 0x87, 0x40\ndb 0x0b, 0x6c, 0xd3, 0x62, 0x55, 0xdd, 0xa4, 0x7e, 0x2a, 0x70, 0x22, 0xa0, 0x3c, 0x51, 0xcb, 0x98\ndb 0x26, 0xcf, 0xad, 0xf8, 0xc3, 0x9e, 0xb1, 0x7a, 0xc0, 0xd5, 0xd4, 0xaf, 0xea, 0x8a, 0xfb, 0x03\ndb 0x1f, 0xae, 0x8c, 0x9b, 0xa3, 0xd2, 0x20, 0xe2, 0xdf, 0xb3, 0xea, 0x97, 0xe9, 0xce, 0x3a, 0xa1\ndb 0xed, 0xa3, 0x97, 0xd5, 0xe2, 0xa6, 0x47, 0x9d, 0x50, 0x9e, 0xac, 0xdf, 0xd1, 0xbe, 0x32, 0x7b\ndb 0xd6, 0xaf, 0xe3, 0x9f, 0x4d, 0xbc, 0x58, 0x30, 0x33, 0xd8, 0xcd, 0xd8, 0x5b, 0xfa, 0x5c, 0xdd\ndb 0x5f, 0x0e, 0x79, 0x1f, 0x1d, 0x0b, 0xd9, 0x9c, 0xb8, 0x78, 0x27, 0x89, 0x39, 0x48, 0xf9, 0x45\ndb 0xe4, 0xa5, 0x8a, 0x2f, 0xc5, 0xf8, 0xe5, 0xef, 0xef, 0x89, 0x9d, 0x24, 0x2a, 0xf4, 0x7e, 0x60\ndb 0x38, 0xe1, 0x25, 0x67, 0x87, 0x68, 0x8b, 0x25, 0xfe, 0xb2, 0x20, 0x02, 0x14, 0x04, 0xb6, 0xba\ndb 0xf7, 0x9c, 0xe8, 0x01, 0x07, 0x8e, 0x0f, 0x21, 0x4c, 0xaf, 0x81, 0xcd, 0x17, 0xb2, 0xae, 0x6c\ndb 0xbb, 0xfb, 0xb9, 0x8f, 0x8b, 0xc8, 0x07, 0x36, 0x26, 0x0c, 0x40, 0x6f, 0xa9, 0x1e, 0x69, 0x2a\ndb 0x5a, 0xde, 0x40, 0xb4, 0x00, 0xfa, 0x0f, 0x2e, 0xd9, 0xc4, 0xc9, 0xc7, 0x72, 0xbb, 0xed, 0x26\ndb 0x0a, 0xf4, 0x81, 0xf7, 0xc6, 0xc6, 0x69, 0xd7, 0xd0, 0x63, 0x97, 0xed, 0x70, 0x2a, 0xa3, 0x30\ndb 0x48, 0x69, 0x0a, 0xf3, 0xae, 0x0f, 0x92, 0x08, 0x2a, 0xce, 0x55, 0x4e, 0xf2, 0x4b, 0x3e, 0xc8\ndb 0x98, 0x15, 0x0a, 0x94, 0x21, 0xe9, 0xff, 0xca, 0x45, 0x82, 0x49, 0x08, 0x47, 0xaa, 0x0a, 0xc2\ndb 0x75, 0x6a, 0xca, 0x28, 0xa1, 0x0a, 0x5a, 0x24, 0xb3, 0xb3, 0x3c, 0xd9, 0xd6, 0xb2, 0x30, 0x75\ndb 0xc4, 0x6e, 0x85, 0x58, 0x92, 0x44, 0x0c, 0x80, 0xd9, 0x17, 0x94, 0xcb, 0x22, 0x4a, 0xd9, 0x34\ndb 0xe4, 0x15, 0x0b, 0xf1, 0xbb, 0x33, 0x8c, 0x77, 0x04, 0x0e, 0x90, 0x48, 0x37, 0x76, 0x79, 0x2c\ndb 0x92, 0xcd, 0xba, 0xa4, 0x74, 0x42, 0x9f, 0x09, 0x7d, 0xa8, 0xc2, 0xd4, 0x36, 0xe3, 0xf3, 0x14\ndb 0x30, 0xcf, 0xef, 0x5c, 0x41, 0x12, 0x4d, 0xb2, 0x4d, 0xa5, 0xad, 0xf7, 0xe8, 0xba, 0xf9, 0xb6\ndb 0xd3, 0x03, 0xe3, 0xb5, 0x11, 0x45, 0x43, 0x64, 0x31, 0xff, 0x32, 0xc3, 0xe0, 0xe4, 0x17, 0xe2\ndb 0xf3, 0xaf, 0x90, 0xce, 0x12, 0xe9, 0x33, 0x90, 0x80, 0xc8, 0x5d, 0x3e, 0x5c, 0xc0, 0x33, 0x7f\ndb 0x04, 0x3a, 0x2e, 0xaf, 0x76, 0x70, 0x76, 0x0e, 0x41, 0x81, 0xf2, 0xde, 0x48, 0xc8, 0x65, 0x45\ndb 0xbe, 0x02, 0x12, 0xa9, 0x0c, 0xf9, 0x5e, 0xfc, 0xfe, 0xaa, 0xc1, 0x1a, 0x22, 0x76, 0x19, 0xd5\ndb 0x76, 0xf4, 0xe6, 0xdd, 0xb3, 0xa1, 0xc9, 0x64, 0x5b, 0x80, 0xd2, 0x54, 0x2c, 0xf6, 0x1b, 0xa7\ndb 0x2e, 0xa1, 0x7b, 0xdb, 0x6f, 0xea, 0xd7, 0x8e, 0x13, 0x27, 0x1a, 0xbd, 0x4a, 0x09, 0x47, 0xf3\ndb 0xa0, 0x56, 0x13, 0x95, 0x83, 0x12, 0xe8, 0x9a, 0x7c, 0xf2, 0x84, 0xbb, 0x09, 0xed, 0x91, 0x06\ndb 0xbc, 0x38, 0xf6, 0xfd, 0xda, 0xbd, 0x93, 0xff, 0xe3, 0x8d, 0xb2, 0x0f, 0xe9, 0x2c, 0x9d, 0x51\ndb 0xba, 0x08, 0xdc, 0x01, 0x9a, 0x15, 0x34, 0x7e, 0x1f, 0x3a, 0x79, 0xcc, 0x89, 0xfe, 0x9a, 0x73\ndb 0xd1, 0x45, 0x1d, 0x72, 0xf8, 0xd9, 0x88, 0x6d, 0x3c, 0xf6, 0xb8, 0x09, 0xdf, 0x4f, 0x6e, 0x63\ndb 0x5d, 0x4d, 0xa9, 0x22, 0xcf, 0x8a, 0x66, 0xb0, 0xb1, 0x82, 0x69, 0x83, 0xd6, 0x1b, 0x4a, 0x69\ndb 0xad, 0x1b, 0x31, 0x18, 0x1a, 0xc8, 0x7e, 0x90, 0x55, 0x37, 0x69, 0x59, 0x1c, 0x72, 0xe3, 0x91\ndb 0x41, 0x32, 0xcc, 0xad, 0xf0, 0xa7, 0x2c, 0xfc, 0xed, 0x0f, 0x68, 0x7c, 0x3a, 0x41, 0x8f, 0x82\ndb 0xb6, 0xe4, 0x7f, 0xe9, 0xb5, 0xcf, 0x19, 0xbf, 0xae, 0xce, 0x1c, 0x87, 0xd3, 0x76, 0x31, 0xf7\ndb 0xc5, 0x29, 0x0d, 0x75, 0x34, 0x36, 0xdc, 0x4a, 0x4d, 0x7f, 0x0e, 0xce, 0x50, 0x95, 0x62, 0x80\ndb 0xc6, 0x19, 0xd9, 0x2f, 0xa3, 0x0b, 0x16, 0xe8, 0xf6, 0xa3, 0x30, 0xbf, 0xdb, 0x41, 0x04, 0x05\ndb 0xb7, 0x10, 0x3d, 0xef, 0x15, 0x78, 0x82, 0xe1, 0xfa, 0x46, 0xe2, 0xd7, 0xb2, 0x4d, 0x0d, 0x9c\ndb 0x3a, 0x1e, 0xda, 0x32, 0xb2, 0x5d, 0x1a, 0x31, 0x84, 0x13, 0x74, 0xb7, 0x5b, 0x4b, 0xdf, 0x83\ndb 0xd9, 0x91, 0x53, 0xc1, 0xad, 0xa1, 0x19, 0x13, 0xb0, 0x3f, 0x97, 0xd6, 0x1b, 0xed, 0x5e, 0x29\ndb 0x87, 0xf8, 0xf4, 0x1f, 0xd6, 0x99, 0x9b, 0x14, 0xf6, 0xe9, 0x9a, 0x96, 0x19, 0x9d, 0xa0, 0xa2\ndb 0x63, 0xe1, 0x10, 0x2d, 0xa3, 0xdc, 0x65, 0x0a, 0x52, 0x40, 0x61, 0x8f, 0xd5, 0x45, 0x5c, 0x37\ndb 0x7e, 0xf6, 0x11, 0xb6, 0xd6, 0xf0, 0x92, 0x35, 0xb9, 0x2e, 0xa0, 0x36, 0x3c, 0x63, 0x88, 0x77\ndb 0xba, 0xb6, 0xc5, 0x8f, 0xef, 0x77, 0x2d, 0xc7, 0x06, 0xae, 0xf4, 0xd2, 0xd3, 0xa3, 0xce, 0x0d\ndb 0xce, 0x37, 0x5c, 0x3d, 0x10, 0x13, 0xf4, 0x2b, 0x94, 0x23, 0x54, 0x93, 0xe7, 0xd4, 0x07, 0x6c\ndb 0x81, 0x5e, 0xb6, 0xdd, 0x96, 0x3d, 0x47, 0x7a, 0xe8, 0xe5, 0xa8, 0x67, 0xed, 0x09, 0x1a, 0xcc\ndb 0xcb, 0x68, 0xad, 0xa7, 0x9e, 0xff, 0x69, 0x54, 0x5d, 0x17, 0x67, 0x50, 0x7c, 0x8f, 0x86, 0xbe\ndb 0xc5, 0x45, 0x09, 0x63, 0xc0, 0x3b, 0x3d, 0xcd, 0xb5, 0x66, 0x75, 0x45, 0x18, 0x1b, 0x83, 0xb2\ndb 0xb5, 0x70, 0x2c, 0xef, 0x09, 0x9d, 0x47, 0x7a, 0xb9, 0xe7, 0xd5, 0x04, 0x10, 0x96, 0x0b, 0x6b\ndb 0xd1, 0x71, 0xcc, 0x8d, 0x73, 0x90, 0x36, 0x92, 0x1f, 0x5b, 0x6b, 0xdf, 0x2d, 0x2c, 0x98, 0xd7\ndb 0x5d, 0x55, 0xfd, 0x4e, 0xad, 0x9b, 0x0b, 0xba, 0x0b, 0x68, 0xc4, 0xe0, 0xe8, 0x66, 0xe7, 0x91\ndb 0xcf, 0x0d, 0xe3, 0xc8, 0x1e, 0xde, 0x82, 0xff, 0x02, 0x43, 0xf4, 0xd3, 0x25, 0x53, 0x0b, 0x03\ndb 0x22, 0x76, 0x6a, 0xff, 0xcf, 0x1f, 0xd6, 0x4d, 0x21, 0x45, 0x11, 0xd3, 0x0b, 0x9c, 0x87, 0x68\ndb 0x98, 0xb8, 0x82, 0x4e, 0x6e, 0xc5, 0x4d, 0x8a, 0x7a, 0x9f, 0x19, 0x8a, 0xa1, 0xf7, 0xed, 0x79\ndb 0x56, 0xd6, 0x1b, 0x75, 0xba, 0xf2, 0x8a, 0x1d, 0x83, 0xe1, 0x6a, 0x08, 0x46, 0x0d, 0x4d, 0xb4\ndb 0xa1, 0xb8, 0x40, 0x24, 0x71, 0xe4, 0xd4, 0xb0, 0x4c, 0x32, 0x49, 0xec, 0x5a, 0x03, 0x95, 0x13\ndb 0xef, 0xbb, 0x5f, 0xee, 0x1d, 0x95, 0xb1, 0x60, 0xd2, 0xd7, 0x6b, 0x06, 0x8e, 0xf1, 0x96, 0x35\ndb 0xe0, 0x02, 0x4e, 0x50, 0xb2, 0x7e, 0xaa, 0x6b, 0xe7, 0xf8, 0xd0, 0xd2, 0x3e, 0x96, 0xde, 0x77\ndb 0xf0, 0xa8, 0xdd, 0x44, 0x00, 0x4b, 0xc1, 0x56, 0xd2, 0xe5, 0x9a, 0x1d, 0xa7, 0x8f, 0x08, 0x3e\ndb 0x1b, 0x14, 0xc9, 0x9e, 0x46, 0x7e, 0xf0, 0x51, 0x3c, 0x8c, 0x80, 0x21, 0xc6, 0x96, 0xc1, 0x9a\ndb 0xda, 0x41, 0xa5, 0xc8, 0xc8, 0x18, 0x63, 0x43, 0x20, 0xaf, 0x69, 0x28, 0xa5, 0x38, 0x13, 0xe0\ndb 0xf4, 0x2e, 0xdc, 0xed, 0x4a, 0x0c, 0x70, 0xc7, 0xcf, 0x45, 0x62, 0x6d, 0x9c, 0x17, 0x8d, 0xb0\ndb 0x59, 0xc7, 0x2c, 0xff, 0x4d, 0xa7, 0x5d, 0xbb, 0xfd, 0xa2, 0xcb, 0xe0, 0x08, 0x3d, 0x78, 0x35\ndb 0x53, 0x88, 0x7e, 0xe5, 0xf1, 0x4a, 0x5a, 0xb7, 0xfc, 0xbb, 0xf0, 0x25, 0x5c, 0x32, 0x56, 0x4a\ndb 0xc8, 0x0b, 0xd2, 0x74, 0x14, 0xe3, 0x8b, 0xc0, 0x1f, 0x78, 0x1a, 0x74, 0xb8, 0x17, 0x09, 0x7c\ndb 0x74, 0x5e, 0x3a, 0xa9, 0x04, 0x64, 0x7d, 0x89, 0x81, 0x8a, 0x97, 0xac, 0x61, 0x41, 0xbd, 0x20\ndb 0x51, 0x55, 0x12, 0x95, 0xc3, 0x57, 0xcd, 0x9a, 0x07, 0x66, 0x19, 0xce, 0x9e, 0xed, 0x77, 0x34\ndb 0xb2, 0x77, 0xd8, 0x3a, 0xbc, 0x59, 0xf1, 0x86, 0x99, 0x2f, 0x19, 0x51, 0x0f, 0xda, 0x59, 0x82\ndb 0x0a, 0xaa, 0x2e, 0xaa, 0x04, 0x00, 0x8d, 0xe4, 0xe2, 0x53, 0xdf, 0x5c, 0x6e, 0xfb, 0x72, 0x22\ndb 0x23, 0x6f, 0xe2, 0x4c, 0x74, 0x30, 0xc6, 0x62, 0x5c, 0x85, 0x61, 0x44, 0xf4, 0x9d, 0x07, 0x56\ndb 0x0c, 0x90, 0xb2, 0x35, 0x8a, 0xcd, 0x02, 0x54, 0x5a, 0x51, 0x40, 0xfa, 0xad, 0x19, 0x5c, 0xdc\ndb 0xf5, 0xe2, 0xb6, 0x10, 0x58, 0x10, 0x60, 0x1d, 0x04, 0xbd, 0x7c, 0x47, 0xaf, 0x28, 0x3d, 0x68\ndb 0x80, 0x06, 0xee, 0x4e, 0xbd, 0x90, 0x53, 0x90, 0x3f, 0x7e, 0xed, 0x99, 0x6f, 0x4f, 0xc3, 0xce\ndb 0x64, 0xa7, 0x9e, 0x5e, 0x85, 0xb3, 0x2f, 0x30, 0x2c, 0xc5, 0xa2, 0x5f, 0xa7, 0x6e, 0xb8, 0x4e\ndb 0x50, 0xb2, 0x06, 0x3e, 0xaf, 0x9d, 0x2c, 0x25, 0x29, 0x06, 0x4e, 0xd6, 0x4d, 0x58, 0x28, 0xe1\ndb 0x57, 0x45, 0xf0, 0x0c, 0x09, 0xcf, 0x24, 0x13, 0x83, 0x39, 0xc4, 0xf8, 0x17, 0x26, 0xdc, 0xba\ndb 0x19, 0x55, 0x83, 0xe9, 0xad, 0xad, 0x51, 0xbe, 0xc4, 0x36, 0x8e, 0xaf, 0x5b, 0x40, 0x4a, 0xfd\ndb 0x26, 0xfc, 0x42, 0x74, 0xe0, 0xfd, 0x9f, 0x9b, 0xda, 0x31, 0x78, 0x1a, 0x4e, 0x2e, 0xfc, 0x67\ndb 0x2e, 0x96, 0x54, 0xfe, 0xdd, 0xfe, 0x28, 0x1a, 0x0f, 0xf6, 0x59, 0x9a, 0x76, 0x92, 0xdd, 0x1e\ndb 0xd2, 0xb7, 0x28, 0xeb, 0x49, 0x72, 0xef, 0x2a, 0xc5, 0xb3, 0x2f, 0x0f, 0xcd, 0xe1, 0xa2, 0x47\ndb 0xc0, 0x6d, 0x31, 0x77, 0x45, 0xd7, 0x2c, 0x97, 0x83, 0x8d, 0x2a, 0x52, 0x58, 0xc1, 0x2b, 0x36\ndb 0x06, 0xff, 0x02, 0x0f, 0xba, 0xac, 0x98, 0x29, 0xda, 0x20, 0xf1, 0x2f, 0x45, 0x66, 0xa9, 0xe4\ndb 0x59, 0x01, 0xa4, 0x11, 0x2d, 0x2e, 0xf8, 0xd4, 0x7d, 0x00, 0x8f, 0xf4, 0xea, 0xfe, 0x4c, 0x12\ndb 0xd5, 0x12, 0x30, 0x8b, 0xcc, 0xb2, 0x1f, 0x23, 0xd2, 0x63, 0x71, 0x49, 0xb4, 0x76, 0x58, 0xec\ndb 0x90, 0x09, 0xd5, 0x46, 0x8b, 0xfe, 0x15, 0x97, 0x3d, 0x7e, 0x3f, 0x5f, 0x36, 0xa2, 0x79, 0xc2\ndb 0x15, 0xcd, 0x24, 0x8d, 0x06, 0x75, 0x3c, 0x79, 0x82, 0xe7, 0x0c, 0x2e, 0x76, 0x3a, 0xcf, 0xbe\ndb 0xaf, 0xd9, 0x2a, 0x5f, 0xf2, 0x61, 0x22, 0xd5, 0xe3, 0x24, 0xe1, 0xfe, 0x12, 0x3d, 0x03, 0x70\ndb 0x71, 0xe3, 0x49, 0xe9, 0x10, 0x73, 0x0d, 0x89, 0x5c, 0x53, 0x7c, 0xd2, 0xb4, 0x71, 0xf6, 0x16\ndb 0x93, 0x67, 0x06, 0x60, 0x13, 0x72, 0xcd, 0x00, 0xe5, 0x50, 0x4c, 0x01, 0xcf, 0x6b, 0x98, 0x6c\ndb 0xe0, 0xcd, 0x5a, 0xfb, 0x33, 0x3e, 0x52, 0x77, 0xf2, 0x34, 0xdd, 0xb2, 0x94, 0xbb, 0xb5, 0x13\ndb 0x3f, 0xfd, 0xea, 0x2e, 0xda, 0x8c, 0x02, 0xbb, 0xab, 0x50, 0xd7, 0xfc, 0x26, 0x3e, 0xda, 0x3b\ndb 0xab, 0x9a, 0xea, 0x6b, 0xb1, 0x64, 0xb8, 0x1a, 0x19, 0x8d, 0x31, 0xed, 0x9b, 0x92, 0xe1, 0x75\ndb 0x8a, 0xb9, 0x17, 0xb5, 0xe5, 0x29, 0x48, 0xe5, 0xbf, 0x80, 0x94, 0xc6, 0x1e, 0xcf, 0x5a, 0xd7\ndb 0x47, 0x6e, 0xc5, 0xe8, 0x12, 0x99, 0x48, 0x07, 0xe8, 0x9c, 0xde, 0x0b, 0x59, 0xc0, 0x0f, 0x06\ndb 0x75, 0x41, 0x61, 0x94, 0x28, 0x5f, 0x87, 0x56, 0xa4, 0x3f, 0x18, 0xf7, 0x93, 0xe0, 0xc9, 0x03\ndb 0x03, 0x6e, 0x44, 0x16, 0x70, 0xbc, 0x38, 0x7d, 0x4d, 0x17, 0x75, 0x65, 0x5d, 0x9c, 0x79, 0xc7\ndb 0x29, 0x56, 0x52, 0x4a, 0xfe, 0xef, 0x09, 0x65, 0x9a, 0xc3, 0x78, 0x8d, 0x89, 0xc2, 0x3f, 0x43\ndb 0x1d, 0xd6, 0x54, 0x59, 0xe4, 0x6f, 0xaf, 0x08, 0x90, 0xff, 0x20, 0xae, 0x87, 0x68, 0x7b, 0x4a\ndb 0x62, 0xd2, 0x93, 0x57, 0x08, 0xec, 0xbd, 0x5b, 0xde, 0xa0, 0x76, 0x01, 0x6a, 0x27, 0x2e, 0xc9\ndb 0xf1, 0x99, 0x7a, 0xa5, 0x08, 0x31, 0x85, 0x68, 0x35, 0x94, 0xe4, 0x56, 0x0b, 0x52, 0xdc, 0x5b\ndb 0x9c, 0x2f, 0xe8, 0x54, 0xb3, 0xee, 0x9d, 0x0e, 0x75, 0xb5, 0x5c, 0xcb, 0xb9, 0x7b, 0x88, 0xf8\ndb 0x0e, 0x56, 0x11, 0x6f, 0xb4, 0xa5, 0x4f, 0xf3, 0x01, 0xc6, 0xe7, 0xc6, 0xbf, 0x89, 0x88, 0x02\ndb 0xeb, 0xce, 0x57, 0xe3, 0x59, 0xf0, 0x12, 0xdf, 0x57, 0x4e, 0xb0, 0xba, 0x67, 0x70, 0x94, 0x1e\ndb 0xa3, 0xd3, 0x60, 0x21, 0xf8, 0xa6, 0xc9, 0xe7, 0x3e, 0x12, 0x93, 0x58, 0x8b, 0xd7, 0x0e, 0x94\ndb 0x6f, 0xcd, 0x8b, 0x09, 0x6d, 0xaa, 0x5b, 0xb2, 0x2c, 0x9f, 0x6f, 0x85, 0x93, 0xf1, 0xc9, 0xd0\ndb 0xd2, 0x04, 0xd1, 0x80, 0xe0, 0x11, 0x09, 0x0f, 0x7b, 0x88, 0xfe, 0x05, 0x9a, 0x53, 0x36, 0xac\ndb 0xd9, 0xb8, 0x45, 0x81, 0x51, 0x99, 0xeb, 0x8d, 0xf2, 0x4d, 0x30, 0x70, 0x62, 0xf4, 0xf9, 0x2f\ndb 0xf7, 0x52, 0xa1, 0xb2, 0xec, 0xa4, 0xbe, 0x1c, 0xd0, 0xfb, 0x1c, 0xe4, 0x3a, 0xbe, 0x5d, 0xee\ndb 0x60, 0xdb, 0x4a, 0x70, 0xec, 0x31, 0xc7, 0x89, 0x16, 0x95, 0x94, 0xde, 0x8c, 0x58, 0x3e, 0xad\ndb 0x58, 0x46, 0x9c, 0x68, 0x2a, 0x2d, 0x43, 0x37, 0x5c, 0xec, 0xf4, 0x03, 0x65, 0xf5, 0x3e, 0xa2\ndb 0x7d, 0xe0, 0x4d, 0x39, 0x34, 0x7f, 0xe2, 0xdb, 0x90, 0x66, 0xdc, 0xca, 0x2e, 0xf8, 0x3d, 0xd8\ndb 0x97, 0x55, 0x60, 0x76, 0xc9, 0x53, 0x71, 0xe2, 0xa3, 0xe1, 0x5d, 0x5f, 0x4c, 0xfe, 0x03, 0x2b\ndb 0x15, 0xd7, 0x2d, 0x5b, 0x56, 0xa0, 0xb5, 0x78, 0x44, 0x98, 0x1f, 0x52, 0xe1, 0x49, 0x13, 0x48\ndb 0xed, 0x83, 0xa1, 0xfb, 0x23, 0xd0, 0x73, 0x34, 0x5e, 0x1d, 0x2f, 0xa0, 0xc5, 0x1b, 0xd0, 0xe3\ndb 0x12, 0x28, 0x52, 0x00, 0xe6, 0x7c, 0x6d, 0x6e, 0x87, 0xe2, 0x42, 0x97, 0x1f, 0x5b, 0x2b, 0x93\ndb 0xba, 0x75, 0xe2, 0x8b, 0x3f, 0x62, 0x5b, 0xb5, 0x36, 0x76, 0x05, 0x1d, 0x2d, 0x7d, 0x29, 0x88\ndb 0x2d, 0x6a, 0xe7, 0xec, 0x3b, 0x8c, 0x88, 0x70, 0xb7, 0xf2, 0xbb, 0x61, 0xdb, 0xa2, 0x1a, 0x28\ndb 0xb0, 0x17, 0xdf, 0x18, 0xcc, 0x2a, 0x02, 0xdd, 0xd2, 0x4a, 0x10, 0x2c, 0x9d, 0x65, 0x58, 0x46\ndb 0x1b, 0xa0, 0xf7, 0x57, 0x7f, 0x76, 0x36, 0xd2, 0xb6, 0xc1, 0xb5, 0x93, 0x6a, 0xbf, 0x97, 0x22\ndb 0x9f, 0xe2, 0xe9, 0xdb, 0x25, 0xc3, 0x04, 0xf0, 0xed, 0x54, 0xc7, 0xc6, 0xab, 0x30, 0x36, 0xb8\ndb 0x3a, 0x24, 0xab, 0x10, 0x0c, 0x26, 0x45, 0xb6, 0xd9, 0xf3, 0x19, 0x6b, 0x65, 0xfd, 0x1d, 0x6d\ndb 0x52, 0x73, 0x14, 0x9d, 0x22, 0x1f, 0xb1, 0x8c, 0x3e, 0x43, 0xbb, 0xf1, 0xca, 0x0f, 0x84, 0x81\ndb 0xb5, 0xc5, 0xe3, 0xf6, 0xcd, 0xe0, 0x2c, 0xf6, 0x9e, 0x21, 0xaa, 0xc8, 0x18, 0x85, 0x17, 0x78\ndb 0x60, 0xb5, 0xeb, 0x9f, 0x2e, 0x5b, 0xbe, 0xe9, 0x87, 0x37, 0xa0, 0x9c, 0x51, 0x8a, 0xf4, 0x1a\ndb 0x17, 0xfd, 0x9d, 0xf0, 0x81, 0x34, 0x55, 0x74, 0x4b, 0x49, 0x86, 0x7b, 0xd1, 0x00, 0x21, 0x92\ndb 0x69, 0xdf, 0x80, 0x8b, 0xa4, 0xf0, 0x50, 0x24, 0xbf, 0x2e, 0x1f, 0x7e, 0x4f, 0x2a, 0x79, 0x65\ndb 0x09, 0xc5, 0x6a, 0x4c, 0x87, 0x3d, 0x4d, 0xe7, 0xcd, 0x6a, 0xdd, 0x1d, 0x89, 0xde, 0x0f, 0xe3\ndb 0xaa, 0xf4, 0x99, 0xf0, 0x17, 0x54, 0x2d, 0x81, 0x97, 0x5a, 0x4f, 0xae, 0x77, 0x2f, 0x2a, 0x93\ndb 0x68, 0xe8, 0x0a, 0xbc, 0xcf, 0x48, 0xe2, 0x40, 0xe2, 0x55, 0xdd, 0x5c, 0xa5, 0x50, 0x63, 0xea\ndb 0xb2, 0x53, 0xea, 0x8a, 0x51, 0xbe, 0x93, 0xa7, 0x02, 0xa5, 0x50, 0x18, 0x7c, 0x0e, 0x40, 0x27\ndb 0x9e, 0x5c, 0x68, 0x17, 0x37, 0xe7, 0x83, 0x8c, 0xc4, 0x31, 0x5a, 0xd1, 0x6e, 0xe4, 0xac, 0xd7\ndb 0x05, 0x34, 0x2b, 0xdb, 0xe6, 0x75, 0xed, 0xd0, 0xa5, 0x18, 0xe5, 0x7e, 0x78, 0x7e, 0x28, 0xfb\ndb 0x9c, 0x58, 0x5d, 0x92, 0x9f, 0xfb, 0xa1, 0x86, 0x6e, 0x96, 0x55, 0x60, 0xee, 0xf8, 0x98, 0x39\ndb 0x18, 0xa1, 0x60, 0x58, 0xc7, 0xf4, 0xf7, 0x5b, 0x30, 0x76, 0x65, 0xa4, 0x9c, 0x75, 0x79, 0x37\ndb 0x3a, 0xb3, 0x40, 0xde, 0xff, 0xb2, 0x8d, 0x50, 0xd6, 0x05, 0xc2, 0x22, 0x5f, 0xa9, 0x2e, 0xd9\ndb 0xc3, 0x5c, 0xe5, 0xae, 0xcd, 0xad, 0x73, 0xba, 0xdb, 0x04, 0xe9, 0x1f, 0xeb, 0x6f, 0xd4, 0x02\ndb 0x3c, 0xfb, 0x68, 0x52, 0x25, 0xd8, 0xb9, 0xba, 0xf3, 0x56, 0x0c, 0x4b, 0xda, 0x00, 0xb1, 0x7d\ndb 0xd7, 0x4a, 0x04, 0x5e, 0x5f, 0x2f, 0x49, 0x7f, 0xe3, 0x30, 0x18, 0xa2, 0x44, 0x3a, 0x56, 0x80\ndb 0x2d, 0xdd, 0x77, 0x4d, 0x48, 0x1d, 0x8b, 0x3a, 0x52, 0xf5, 0x63, 0x51, 0xb1, 0xe0, 0xe3, 0x7c\ndb 0xd2, 0x3d, 0x50, 0xce, 0xbd, 0xf3, 0x8e, 0xfd, 0xe3, 0x0a, 0x3c, 0x6d, 0x85, 0x4a, 0xd2, 0xa8\ndb 0xe7, 0x7a, 0xac, 0x50, 0x9c, 0xc7, 0x9f, 0x91, 0x5d, 0xc5, 0x66, 0x86, 0x00, 0x31, 0x72, 0x87\ndb 0x39, 0x22, 0xd0, 0x3a, 0xc7, 0xe3, 0x91, 0x9f, 0x02, 0x55, 0xa2, 0x0c, 0xb2, 0xca, 0x11, 0xec\ndb 0xb5, 0x22, 0xab, 0x55, 0x8e, 0x05, 0x43, 0xe3, 0xfe, 0xb3, 0xef, 0x1b, 0xfb, 0x8f, 0x79, 0x11\ndb 0xb3, 0x2a, 0x01, 0x13, 0xaf, 0xa7, 0x7a, 0xcd, 0x85, 0xc9, 0xc0, 0x37, 0x7b, 0x8f, 0x6e, 0xef\ndb 0x15, 0xe9, 0x7f, 0xf5, 0xf7, 0xee, 0x82, 0xa2, 0x91, 0xc4, 0xa1, 0x33, 0x28, 0xef, 0xf9, 0x47\ndb 0x31, 0xef, 0x1e, 0xf1, 0x25, 0x3d, 0x9b, 0x84, 0x7a, 0x75, 0x03, 0xb0, 0xbd, 0x96, 0xe5, 0xb2\ndb 0x12, 0x52, 0x6c, 0x10, 0x1c, 0x1b, 0x8e, 0xe2, 0xd5, 0x08, 0x99, 0x3f, 0x1d, 0x57, 0x12, 0x00\ndb 0x90, 0xf5, 0x21, 0x76, 0x3e, 0x51, 0xd9, 0x19, 0xb2, 0x41, 0x88, 0x47, 0xc3, 0x95, 0xfb, 0xe0\ndb 0x38, 0x87, 0xff, 0x52, 0xb4, 0x9d, 0xf2, 0xdf, 0x53, 0x2d, 0x4f, 0x55, 0x4b, 0x4d, 0xa3, 0x0d\ndb 0x45, 0x9f, 0xd7, 0x33, 0xd8, 0x11, 0xd9, 0x45, 0xd9, 0x13, 0x3a, 0xe5, 0xe6, 0xda, 0x5b, 0xc6\ndb 0xd4, 0xcb, 0x19, 0x63, 0xb0, 0x5d, 0x2e, 0x37, 0x97, 0x0b, 0x64, 0x09, 0x45, 0xd3, 0x78, 0x2d\ndb 0xbc, 0xc0, 0x79, 0x0d, 0xf5, 0x51, 0x9b, 0xeb, 0x9c, 0x28, 0xce, 0x14, 0x32, 0x70, 0xae, 0x14\ndb 0xa1, 0xd5, 0x4f, 0x9d, 0xbc, 0x79, 0x45, 0x2d, 0x89, 0x63, 0x4b, 0x27, 0x37, 0x94, 0x7f, 0xdb\ndb 0x2f, 0x39, 0xb8, 0x73, 0xaf, 0x3b, 0x4e, 0x97, 0x2f, 0xce, 0x83, 0x04, 0xb8, 0xa3, 0xb7, 0x38\ndb 0xe9, 0x08, 0x75, 0x35, 0x42, 0x1c, 0xe8, 0xc4, 0xff, 0xca, 0x13, 0xf9, 0x69, 0x53, 0x32, 0x83\ndb 0x29, 0xe6, 0x17, 0xe7, 0xf3, 0x01, 0xbf, 0xc0, 0xf1, 0xdf, 0x8b, 0x2d, 0x29, 0x5d, 0x68, 0xfb\ndb 0x18, 0x77, 0x2d, 0x98, 0x29, 0xa3, 0x44, 0x79, 0x47, 0xbe, 0xb9, 0xca, 0x18, 0x29, 0x16, 0xd9\ndb 0x41, 0x49, 0x55, 0x82, 0xf2, 0xc0, 0x42, 0x13, 0x68, 0x72, 0x75, 0x5f, 0xe4, 0x97, 0xae, 0x6d\ndb 0x90, 0xc0, 0x57, 0x05, 0x9e, 0x54, 0xa5, 0x1e, 0x4b, 0x6e, 0x46, 0x9d, 0x31, 0xce, 0x0a, 0xde\ndb 0xed, 0x71, 0x7b, 0x42, 0xa6, 0xf3, 0x6c, 0xc8, 0x21, 0x4a, 0x4f, 0x40, 0x67, 0x90, 0x2c, 0x92\ndb 0xb6, 0x7a, 0xdc, 0x9b, 0x0c, 0xb8, 0x38, 0x80, 0xf6, 0x77, 0x29, 0xe3, 0x59, 0xbc, 0xfa, 0xe2\ndb 0xdf, 0x95, 0x5c, 0xec, 0x7c, 0xac, 0x81, 0x5f, 0xd3, 0xcc, 0x50, 0x43, 0xad, 0xb0, 0x6c, 0xb3\ndb 0x9a, 0x4c, 0x37, 0x6c, 0x18, 0xf1, 0xa3, 0x71, 0x57, 0x39, 0x09, 0xf7, 0xe0, 0xdc, 0x93, 0xe2\ndb 0xba, 0xd6, 0x2a, 0x81, 0x67, 0x59, 0x36, 0x8e, 0xf1, 0x4b, 0xd5, 0xa6, 0x57, 0x84, 0x63, 0x1a\ndb 0xea, 0x2f, 0x2f, 0xd8, 0x9b, 0x64, 0x15, 0x6e, 0x32, 0x40, 0xe0, 0x98, 0x11, 0x5f, 0xc2, 0x47\ndb 0xa9, 0x08, 0x84, 0x0c, 0xa3, 0xea, 0xe6, 0x4b, 0xcc, 0x08, 0x27, 0x22, 0x9b, 0xf7, 0xb7, 0x6e\ndb 0xfb, 0x86, 0x04, 0x04, 0x26, 0x8d, 0x47, 0x04, 0xf5, 0x48, 0x1c, 0xac, 0xaa, 0x73, 0x46, 0x06\ndb 0x33, 0xcf, 0xd4, 0xb2, 0xc0, 0x90, 0x5a, 0xc6, 0x0e, 0xe0, 0x3d, 0xd1, 0xf4, 0x9a, 0x7b, 0xaa\ndb 0xdc, 0x00, 0x62, 0xec, 0xae, 0x0b, 0x59, 0xdf, 0x46, 0x8c, 0x37, 0x48, 0xdf, 0xb9, 0x51, 0xef\ndb 0x03, 0x3f, 0x14, 0x06, 0xe9, 0xa9, 0x04, 0x5e, 0x05, 0x42, 0x5c, 0x3c, 0x56, 0xe7, 0xdb, 0xeb\ndb 0x96, 0x19, 0xa5, 0x0d, 0xa9, 0xc5, 0xa6, 0x1e, 0x68, 0x43, 0x1d, 0x09, 0x5e, 0x95, 0x48, 0xaa\ndb 0x73, 0xe2, 0x6a, 0x65, 0x34, 0xef, 0xf8, 0x2d, 0x3a, 0xe6, 0x0e, 0x56, 0xcb, 0x9a, 0x7d, 0x31\ndb 0xf0, 0xa8, 0x73, 0xfc, 0x69, 0x22, 0xab, 0xbc, 0xcf, 0xe1, 0x05, 0xa4, 0xe8, 0x14, 0x4e, 0x96\ndb 0xe1, 0x0c, 0xa1, 0x8d, 0x94, 0x18, 0xa1, 0xa3, 0x71, 0x1f, 0x1f, 0xd2, 0x92, 0x9c, 0xa3, 0x49\ndb 0xc1, 0xa0, 0x2b, 0xd3, 0x48, 0x5c, 0x59, 0xd5, 0x19, 0xbb, 0xcf, 0x07, 0x68, 0x5e, 0xca, 0x33\ndb 0xb7, 0x42, 0x04, 0x28, 0x78, 0x3a, 0x5c, 0x12, 0xc6, 0x67, 0x0e, 0x98, 0x30, 0xdb, 0x7f, 0x5a\ndb 0x4e, 0xc3, 0xd6, 0x3a, 0xec, 0x4a, 0x53, 0x9e, 0x2b, 0x92, 0xe9, 0x5b, 0xef, 0x01, 0x73, 0x1b\ndb 0x8f, 0x20, 0x91, 0xdb, 0x01, 0x7e, 0x97, 0xff, 0x98, 0xc2, 0x44, 0xa7, 0x35, 0xe6, 0xc0, 0x41\ndb 0x55, 0x6c, 0xaf, 0x24, 0xd2, 0xac, 0x2f, 0x2b, 0x62, 0xa2, 0xc8, 0x64, 0xf7, 0x0a, 0xf4, 0x94\ndb 0x3e, 0x29, 0x11, 0xd0, 0x08, 0xac, 0x40, 0xab, 0x14, 0x36, 0xe8, 0xd6, 0x9a, 0xe9, 0xd2, 0xe2\ndb 0x1b, 0xa8, 0x80, 0x67, 0x45, 0x24, 0xe0, 0x7c, 0xaa, 0xc4, 0x17, 0x0b, 0xbe, 0xbc, 0x7f, 0x17\ndb 0x44, 0xf7, 0x7a, 0x3a, 0x62, 0x92, 0xfc, 0x66, 0x08, 0x17, 0x60, 0xc8, 0x57, 0x42, 0x8f, 0x4f\ndb 0xa3, 0x2d, 0xe0, 0x42, 0x22, 0xab, 0x70, 0x65, 0x8f, 0xad, 0xc8, 0x8a, 0x1d, 0xbc, 0x66, 0xc2\ndb 0xd4, 0xb0, 0x47, 0x58, 0xb8, 0xe2, 0xd8, 0x40, 0x25, 0x05, 0x65, 0x07, 0xfc, 0x31, 0x4b, 0xaf\ndb 0xba, 0x0a, 0x92, 0x1e, 0xd7, 0xd9, 0x7a, 0x25, 0x39, 0xda, 0x7a, 0xa5, 0x31, 0x77, 0xce, 0x17\ndb 0x56, 0x12, 0x5d, 0xcf, 0x56, 0x06, 0xeb, 0x76, 0x3a, 0x8b, 0xcb, 0x3b, 0xc1, 0x7b, 0x0b, 0x20\ndb 0xf7, 0x03, 0xf0, 0xe1, 0xca, 0x77, 0x35, 0x69, 0x84, 0x78, 0x0a, 0x94, 0x09, 0xcd, 0x5f, 0x49\ndb 0x77, 0x8a, 0xc1, 0xbc, 0x95, 0x38, 0x61, 0x37, 0x37, 0x9a, 0x3d, 0xb4, 0xe2, 0x1a, 0x80, 0x42\ndb 0xd2, 0x85, 0x59, 0xba, 0xc8, 0xd8, 0x0f, 0x30, 0x3f, 0xdd, 0xef, 0xbe, 0x80, 0xe5, 0x95, 0xc4\ndb 0x54, 0xb8, 0x8f, 0xc6, 0x60, 0x2c, 0x85, 0xf4, 0xc3, 0x33, 0x63, 0x8e, 0x50, 0x23, 0x4b, 0xee\ndb 0x13, 0x87, 0xd6, 0xd4, 0xba, 0xb9, 0xcf, 0x05, 0xaf, 0x6a, 0x27, 0x73, 0x56, 0x30, 0xd6, 0x83\ndb 0x9e, 0x0b, 0x47, 0x12, 0x4f, 0x5c, 0x34, 0xb6, 0x66, 0xc0, 0xd9, 0x90, 0xb2, 0xa6, 0x54, 0xbf\ndb 0x42, 0x5d, 0xf0, 0x02, 0x9f, 0x6b, 0x73, 0x90, 0xa9, 0x1f, 0x9f, 0xae, 0x83, 0x12, 0xfa, 0x82\ndb 0x5b, 0x43, 0xcd, 0xfb, 0xf9, 0x4b, 0xb8, 0x10, 0x4b, 0x8c, 0x33, 0xcb, 0xff, 0x75, 0x04, 0xd6\ndb 0x85, 0x0c, 0x43, 0x9b, 0x17, 0x9b, 0x36, 0x8a, 0xb7, 0x56, 0x1c, 0xe0, 0x7f, 0xed, 0x69, 0xda\ndb 0x86, 0x5f, 0x79, 0x41, 0xa3, 0x3e, 0x39, 0x4e, 0xad, 0x95, 0x60, 0x8e, 0x6a, 0x12, 0x9f, 0xa5\ndb 0xbf, 0xd4, 0x2a, 0x9c, 0x48, 0x93, 0xeb, 0x11, 0x92, 0x68, 0xc8, 0xef, 0xa6, 0xbc, 0xf6, 0x84\ndb 0xc2, 0xfd, 0x48, 0xbf, 0xbb, 0x80, 0x1f, 0x8f, 0xf0, 0xf5, 0xe3, 0x8d, 0xfb, 0x87, 0xe4, 0x6a\ndb 0x51, 0x13, 0x03, 0x15, 0x7d, 0x30, 0xb8, 0xad, 0x9f, 0x1f, 0x15, 0xf2, 0x40, 0xef, 0x21, 0xcc\ndb 0x71, 0xe5, 0x80, 0x5d, 0xc8, 0x33, 0xe3, 0xe1, 0x09, 0x7a, 0x66, 0xdd, 0xe2, 0x1d, 0xac, 0xa7\ndb 0xb4, 0xa7, 0x8e, 0x92, 0x49, 0xbf, 0x60, 0x2d, 0xa3, 0xa8, 0x1a, 0x21, 0x34, 0xcc, 0x29, 0x12\ndb 0x78, 0x89, 0xc3, 0x52, 0xe8, 0xbc, 0xba, 0x54, 0xbd, 0x19, 0x2e, 0xad, 0xd4, 0x48, 0x4d, 0x2f\ndb 0x1f, 0xe7, 0x98, 0xd9, 0x6d, 0xbb, 0x85, 0x48, 0x79, 0x81, 0xf2, 0x3d, 0x03, 0xf7, 0x16, 0x7b\ndb 0xf5, 0x72, 0x5a, 0xf6, 0x56, 0x4d, 0x03, 0x2b, 0x6d, 0xa1, 0xb1, 0x02, 0xa4, 0xf0, 0x43, 0x4b\ndb 0xbe, 0xec, 0x74, 0xe9, 0x43, 0x0c, 0xd4, 0xeb, 0x06, 0x49, 0x66, 0x27, 0x4b, 0xb9, 0xe8, 0xb3\ndb 0xaa, 0x60, 0xf8, 0x9b, 0x4f, 0x88, 0x66, 0xfe, 0x7d, 0xc0, 0x21, 0x22, 0x74, 0xcf, 0xe3, 0xf8\ndb 0xf4, 0xe3, 0x6d, 0x6c, 0xf9, 0x21, 0xc2, 0x86, 0x89, 0x63, 0x5b, 0x27, 0x71, 0x04, 0x03, 0x40\ndb 0xa9, 0xe6, 0xa3, 0x2f, 0x65, 0xb6, 0x5a, 0xdc, 0xdd, 0x4d, 0x92, 0xe1, 0x86, 0xf5, 0xc5, 0xc0\ndb 0x05, 0x3c, 0x5b, 0x35, 0xd4, 0x8c, 0x61, 0xed, 0xc7, 0x53, 0x63, 0x4e, 0x6a, 0xfe, 0x6f, 0x52\ndb 0x96, 0x50, 0x43, 0x99, 0x24, 0x14, 0xeb, 0xb6, 0x58, 0xce, 0xd9, 0xe0, 0x21, 0x64, 0x9c, 0xe4\ndb 0x05, 0x48, 0xf8, 0xeb, 0x12, 0x03, 0x54, 0x19, 0xf3, 0x17, 0x6c, 0x3b, 0x91, 0x02, 0xe4, 0xfc\ndb 0xb9, 0x24, 0xa6, 0xc1, 0xc9, 0x5e, 0x31, 0xdb, 0x03, 0x52, 0x91, 0xc8, 0x67, 0xaa, 0xe8, 0x1b\ndb 0x51, 0x83, 0xf6, 0x6d, 0xf9, 0xad, 0x45, 0x2e, 0x24, 0x9d, 0x1d, 0x80, 0xd5, 0xc0, 0xbf, 0xd5\ndb 0xca, 0x78, 0x3e, 0x53, 0x86, 0x97, 0xa9, 0xc5, 0xf8, 0x22, 0x41, 0x1a, 0x1b, 0x20, 0x53, 0xc5\ndb 0xc8, 0x4b, 0xff, 0x56, 0xb8, 0xfb, 0x61, 0x84, 0x83, 0xca, 0xac, 0x68, 0xcd, 0x56, 0x47, 0xa6\ndb 0x0d, 0x43, 0xfc, 0xbb, 0xaa, 0x60, 0xf1, 0xc4, 0xde, 0xc0, 0xe0, 0xa2, 0x88, 0x59, 0x68, 0x53\ndb 0x69, 0xba, 0x67, 0x21, 0x54, 0x18, 0x98, 0x51, 0x09, 0x35, 0xdd, 0x3c, 0xec, 0x35, 0x2f, 0xf0\ndb 0x6e, 0xcf, 0xba, 0x21, 0x04, 0x0a, 0xb4, 0x91, 0xdf, 0xf8, 0xb5, 0x9f, 0xb8, 0xc4, 0x97, 0xf8\ndb 0x4f, 0x10, 0xca, 0x5b, 0x4a, 0x43, 0x9e, 0x45, 0x0e, 0x51, 0x3f, 0x43, 0x96, 0x40, 0xb8, 0x70\ndb 0x66, 0xcb, 0xa1, 0x70, 0x5f, 0x4f, 0x9e, 0xb0, 0x2f, 0x03, 0x6f, 0x42, 0xcd, 0xf6, 0x3c, 0x90\ndb 0x2f, 0x9b, 0x83, 0x01, 0x41, 0x13, 0xa8, 0xf8, 0xbc, 0x19, 0x5c, 0x10, 0x09, 0xb9, 0xd4, 0x5d\ndb 0x0c, 0xa3, 0x51, 0xb0, 0x1a, 0xfd, 0x18, 0xbb, 0x67, 0x40, 0x4f, 0xc4, 0xab, 0x41, 0x8e, 0xbf\ndb 0x74, 0x0d, 0xa2, 0xa0, 0xf2, 0x48, 0x94, 0x5e, 0xa6, 0x63, 0xe4, 0xb3, 0x77, 0x2b, 0x79, 0x90\ndb 0xfe, 0x95, 0x1d, 0x92, 0x3a, 0x23, 0x8b, 0xf2, 0xa9, 0x87, 0x31, 0x9a, 0x06, 0x81, 0xb1, 0x6f\ndb 0xa6, 0x1e, 0x21, 0xb6, 0x1e, 0x0d, 0x9a, 0xf8, 0x3d, 0x38, 0x9d, 0xcc, 0x0c, 0x49, 0x83, 0x7a\ndb 0xd5, 0x7e, 0x5a, 0x98, 0xd7, 0xbe, 0x07, 0xf9, 0x79, 0x5e, 0x46, 0x89, 0x8e, 0xc9, 0xdf, 0x27\ndb 0xf9, 0xa4, 0xc6, 0x5f, 0x08, 0x45, 0x04, 0x2b, 0x62, 0xf5, 0x8e, 0x54, 0x57, 0xd0, 0xcd, 0xf4\ndb 0x51, 0x9e, 0x9a, 0xc8, 0x82, 0x65, 0x45, 0x8e, 0x49, 0xba, 0x28, 0x55, 0x3e, 0x58, 0xac, 0xf0\ndb 0xfb, 0xf2, 0xbd, 0x77, 0x9e, 0xc0, 0xb4, 0xf6, 0x9e, 0x52, 0x87, 0x5e, 0xc9, 0x41, 0x26, 0x01\ndb 0x64, 0x1f, 0x54, 0x53, 0x25, 0xb8, 0x2d, 0x91, 0xc9, 0x68, 0x30, 0xa0, 0x92, 0x37, 0x03, 0xac\ndb 0x36, 0xdc, 0x43, 0xb8, 0x2b, 0x29, 0x39, 0x8b, 0xfe, 0xda, 0xb6, 0xee, 0x3c, 0x7d, 0x4a, 0xc3\ndb 0x3e, 0xad, 0x45, 0xf4, 0xab, 0x67, 0xe3, 0x2b, 0xf5, 0xc4, 0xcf, 0x2f, 0xe3, 0xbd, 0x2e, 0x1c\ndb 0xac, 0xca, 0x37, 0xe3, 0x65, 0x9e, 0x6b, 0xc9, 0x94, 0x4f, 0x6d, 0x93, 0x0f, 0x0a, 0xc7, 0x19\ndb 0x69, 0xb3, 0x16, 0xe6, 0x70, 0xe7, 0xd0, 0xb1, 0xa9, 0x20, 0xae, 0x1d, 0xf3, 0x9c, 0xde, 0x5a\ndb 0xb2, 0x97, 0xdc, 0xd2, 0xc5, 0x91, 0x5f, 0x29, 0x2a, 0x47, 0x9b, 0x8a, 0x08, 0xd1, 0x5d, 0xf8\ndb 0x25, 0xf5, 0x36, 0x75, 0x69, 0x78, 0x8f, 0x78, 0xc5, 0x81, 0x97, 0x1a, 0x3f, 0x31, 0xc9, 0x70\ndb 0x3c, 0xe2, 0x04, 0x43, 0x41, 0xbd, 0x09, 0x10, 0x74, 0x95, 0x52, 0x53, 0x15, 0x15, 0xe0, 0xe9\ndb 0x3a, 0x4d, 0x11, 0x43, 0x90, 0xfc, 0x05, 0x0b, 0xd2, 0xbf, 0x3b, 0x14, 0xe5, 0x7e, 0x40, 0xa7\ndb 0x58, 0x4e, 0x2d, 0x6e, 0xa8, 0xc8, 0x73, 0xd0, 0x15, 0xa9, 0x8b, 0x28, 0x5d, 0xe0, 0x73, 0xac\ndb 0x8a, 0xdb, 0x28, 0xea, 0xdc, 0x97, 0xae, 0x75, 0x5b, 0xd5, 0x15, 0xe3, 0x7a, 0xc3, 0x39, 0x22\ndb 0x6c, 0x30, 0x43, 0x6a, 0xf8, 0x53, 0x1d, 0xd7, 0xee, 0x37, 0xd9, 0xe7, 0x56, 0x8c, 0x72, 0x8a\ndb 0xf1, 0x7d, 0xc9, 0x55, 0x57, 0x8d, 0x9e, 0xa5, 0xef, 0xa0, 0x72, 0xef, 0x3a, 0x28, 0x83, 0x56\ndb 0x2a, 0xd4, 0xa3, 0x40, 0x6c, 0x41, 0xe2, 0xaf, 0x20, 0xc6, 0xae, 0x52, 0x69, 0x1c, 0x14, 0xe7\ndb 0x9e, 0x61, 0xb0, 0x18, 0x7d, 0x37, 0xee, 0x74, 0xec, 0x4f, 0x6e, 0x7a, 0x37, 0xaa, 0x72, 0xbb\ndb 0x66, 0x92, 0x9c, 0x04, 0x01, 0x7d, 0x5d, 0xd3, 0xae, 0xc0, 0x5a, 0x62, 0x29, 0xd4, 0x27, 0x64\ndb 0xce, 0x99, 0x2c, 0x0d, 0xfc, 0x27, 0xfc, 0x39, 0x5c, 0xfe, 0xe4, 0x64, 0x0e, 0x6d, 0x09, 0x39\ndb 0x42, 0xf4, 0x6b, 0xa0, 0x6e, 0x65, 0xc8, 0xc5, 0xed, 0xa4, 0x25, 0xbd, 0x63, 0x87, 0x43, 0xd5\ndb 0x4a, 0xbb, 0x85, 0x52, 0x6b, 0x13, 0x25, 0xc9, 0x8e, 0xb3, 0xb2, 0xa7, 0xfd, 0x96, 0x86, 0xe7\ndb 0xbb, 0x75, 0x41, 0x24, 0x11, 0xf7, 0xf7, 0xd4, 0xf3, 0x97, 0xb3, 0x19, 0x49, 0x32, 0xc1, 0xd4\ndb 0xfd, 0xd9, 0x93, 0x9d, 0x80, 0x4b, 0xd1, 0xb8, 0x9c, 0x1b, 0xc7, 0xf9, 0x48, 0x47, 0x68, 0x84\ndb 0xbe, 0x74, 0xff, 0xef, 0xb5, 0x00, 0x6f, 0x04, 0xa0, 0x91, 0x1f, 0xae, 0x59, 0x06, 0x81, 0xd4\ndb 0x46, 0xe5, 0x4e, 0xd6, 0xf6, 0x69, 0x67, 0x26, 0x58, 0x86, 0x54, 0x8b, 0x0e, 0x2b, 0x07, 0x51\ndb 0xe5, 0x52, 0x47, 0x23, 0x50, 0xb1, 0x7c, 0x5b, 0xf0, 0xbc, 0x87, 0x9d, 0x30, 0xff, 0x27, 0xd8\ndb 0x86, 0xce, 0x9a, 0x13, 0x99, 0x0e, 0xa7, 0x2d, 0xa0, 0x86, 0xae, 0xc8, 0x46, 0x4d, 0x6a, 0xc9\ndb 0x4d, 0xab, 0x5f, 0x6d, 0xb2, 0xae, 0xdf, 0x1a, 0x0e, 0xa9, 0x10, 0x37, 0xe9, 0xf7, 0xef, 0x29\ndb 0xea, 0xe1, 0x39, 0xaf, 0xbc, 0xb1, 0xd0, 0x4f, 0x33, 0x69, 0xe7, 0x79, 0xdf, 0xfb, 0x58, 0x51\ndb 0x95, 0x3e, 0xc1, 0x5b, 0x53, 0x49, 0xbf, 0x85, 0xf5, 0xde, 0x32, 0x3b, 0xf0, 0x25, 0x46, 0x2d\ndb 0xb4, 0x49, 0xbf, 0x63, 0x93, 0x9c, 0xac, 0x32, 0xfb, 0xc2, 0x03, 0x5e, 0x45, 0x77, 0x41, 0xf9\ndb 0x38, 0x1e, 0x3c, 0xa0, 0xf6, 0x02, 0x08, 0xe8, 0x19, 0xf4, 0x13, 0xb3, 0x96, 0x15, 0xe8, 0x46\ndb 0xe7, 0x50, 0x5c, 0x8b, 0x79, 0x5c, 0x36, 0x72, 0x2f, 0x77, 0x0a, 0x68, 0x7a, 0x2f, 0x06, 0x01\ndb 0x29, 0x1c, 0xd3, 0x76, 0xf2, 0x32, 0x8e, 0xea, 0x55, 0x47, 0xd9, 0xe0, 0xc6, 0x1d, 0x87, 0xdb\ndb 0x9e, 0xd7, 0xe8, 0xb2, 0x18, 0x60, 0x08, 0x88, 0xc4, 0xdf, 0x7d, 0x0b, 0xfd, 0xfc, 0xb2, 0xeb\ndb 0x17, 0xcd, 0xf0, 0x79, 0xe1, 0xc1, 0x6e, 0x74, 0xc2, 0x64, 0x17, 0xa5, 0x8b, 0xca, 0x20, 0x95\ndb 0x3d, 0xc7, 0xe5, 0x30, 0x3d, 0x32, 0x80, 0xd5, 0x32, 0x74, 0x30, 0xf1, 0x09, 0x56, 0x79, 0x22\ndb 0x07, 0x48, 0x03, 0x55, 0x3c, 0x19, 0xec, 0x88, 0xa2, 0xe6, 0xa2, 0x98, 0x13, 0x7b, 0x14, 0x3f\ndb 0xa6, 0x8f, 0xef, 0xbc, 0xfc, 0x4e, 0x6e, 0x25, 0x7e, 0xcc, 0x54, 0x5f, 0x9f, 0x16, 0xe5, 0xb5\ndb 0x24, 0xcc, 0xe8, 0xde, 0xfb, 0x36, 0xad, 0xbe, 0x00, 0x34, 0x32, 0x6c, 0x78, 0xcf, 0xc7, 0x2a\ndb 0xb0, 0xef, 0x07, 0x67, 0x73, 0x59, 0x4b, 0xc4, 0x58, 0x47, 0xbf, 0x19, 0x0f, 0x5f, 0x87, 0xbf\ndb 0x14, 0x2c, 0xa1, 0xc7, 0xa1, 0x48, 0xe2, 0x3a, 0x48, 0x1b, 0x2c, 0x0f, 0x52, 0xe0, 0x43, 0x9a\ndb 0x32, 0x10, 0x0a, 0xdb, 0x27, 0x30, 0x01, 0x55, 0x89, 0x1c, 0x5e, 0xc3, 0x10, 0xf2, 0x48, 0x78\ndb 0xd7, 0xf7, 0xba, 0xa4, 0x67, 0xda, 0xb4, 0x16, 0x99, 0x44, 0x41, 0x26, 0x85, 0xb6, 0x45, 0xec\ndb 0x0a, 0x26, 0xf4, 0xfc, 0x3b, 0x6a, 0x55, 0x1d, 0x62, 0xc9, 0xa4, 0x3b, 0x20, 0x54, 0x7c, 0x3e\ndb 0xb6, 0xd3, 0x88, 0xe5, 0x54, 0xb5, 0xeb, 0xd1, 0x30, 0xb9, 0x98, 0xda, 0x4d, 0x2c, 0x81, 0xf3\ndb 0x4b, 0x54, 0x3a, 0x24, 0x59, 0x4f, 0x13, 0x58, 0x7f, 0xa0, 0x5b, 0x1f, 0xd6, 0x0a, 0x7a, 0xb5\ndb 0x36, 0x6b, 0x2f, 0xaa, 0x53, 0xda, 0xe6, 0xa8, 0x61, 0x83, 0x16, 0x3c, 0xa6, 0x81, 0x78, 0xd2\ndb 0x77, 0x0a, 0x30, 0x76, 0x0e, 0x56, 0x6a, 0x66, 0xa6, 0x5c, 0x91, 0xc8, 0xec, 0xa2, 0x99, 0xa0\ndb 0x67, 0x5b, 0x21, 0x37, 0x38, 0x01, 0x27, 0x27, 0x8b, 0x1c, 0xd0, 0xe4, 0x91, 0x43, 0xe0, 0xcb\ndb 0xe5, 0x4b, 0xa0, 0xe7, 0x1c, 0x3f, 0x33, 0x3f, 0xb4, 0x42, 0xb0, 0x64, 0x34, 0xde, 0x8d, 0x35\ndb 0x2e, 0x59, 0x21, 0xab, 0xa6, 0x71, 0xc9, 0x3a, 0x65, 0x83, 0xa6, 0x0c, 0xb0, 0x36, 0xa0, 0xe2\ndb 0xb0, 0xb9, 0x8b, 0x5c, 0x2e, 0x3b, 0xa1, 0x03, 0x96, 0x6e, 0x63, 0x9c, 0x2a, 0x02, 0xbd, 0x2b\ndb 0x21, 0xf9, 0xee, 0x75, 0xab, 0xf4, 0x3c, 0xf4, 0x64, 0xb1, 0xbb, 0x97, 0x10, 0x3a, 0x02, 0x60\ndb 0x3e, 0x93, 0x97, 0xfd, 0xb4, 0xcb, 0x2f, 0x31, 0x80, 0x7f, 0x74, 0x23, 0x35, 0x6d, 0x4a, 0x83\ndb 0xa6, 0x70, 0x7b, 0x27, 0xf7, 0xfa, 0x97, 0xe9, 0x54, 0x4d, 0xfe, 0xfd, 0x7c, 0xe8, 0x91, 0x03\ndb 0x6b, 0x61, 0xc4, 0x8c, 0xa2, 0x41, 0x23, 0x52, 0xc3, 0x9b, 0x5d, 0xb6, 0xb5, 0x1b, 0x9f, 0x3b\ndb 0x48, 0x09, 0x59, 0xec, 0x3c, 0x23, 0xfd, 0x9e, 0xa8, 0x76, 0x73, 0x92, 0xab, 0x28, 0x6a, 0x57\ndb 0xe4, 0x88, 0x25, 0x2b, 0x6d, 0xbf, 0xf8, 0xc2, 0xe6, 0xdb, 0x48, 0x58, 0x0a, 0x06, 0xae, 0xd0\ndb 0x78, 0x25, 0x61, 0xd5, 0xcd, 0x60, 0xf9, 0xf1, 0xaf, 0xb3, 0xb8, 0x86, 0x2f, 0x00, 0x4b, 0xe1\ndb 0xe6, 0xbd, 0x46, 0xdb, 0x91, 0x76, 0xea, 0x22, 0xb5, 0x85, 0x32, 0x3a, 0x41, 0x6a, 0xfb, 0x86\ndb 0x45, 0xc9, 0x3e, 0xb1, 0xcb, 0x1d, 0xee, 0x8e, 0x58, 0xcf, 0x24, 0x6b, 0xb1, 0xc5, 0xe0, 0xda\ndb 0x30, 0xc9, 0xa9, 0x36, 0x5b, 0xeb, 0xc1, 0x93, 0x32, 0x60, 0x15, 0x0a, 0x41, 0xa0, 0x64, 0x0c\ndb 0x30, 0x89, 0x6e, 0xda, 0xab, 0x7e, 0x49, 0x44, 0xbc, 0xb4, 0x92, 0x0c, 0x29, 0xee, 0xd5, 0x03\ndb 0xe0, 0xd7, 0x96, 0xcf, 0x00, 0xf8, 0xaf, 0x89, 0xf2, 0xe0, 0x3a, 0x23, 0x45, 0x1a, 0x73, 0x4d\ndb 0x3f, 0x59, 0x50, 0xe5, 0x98, 0x2a, 0x78, 0x0f, 0x07, 0x31, 0xd2, 0x89, 0x69, 0xa2, 0xe9, 0x8d\ndb 0xe4, 0xab, 0x41, 0x8b, 0xe9, 0x83, 0x5e, 0xbc, 0xf9, 0x81, 0xbf, 0xe8, 0x24, 0xa4, 0x9d, 0x0a\ndb 0xd0, 0x7c, 0x3b, 0x40, 0x69, 0x93, 0x26, 0x42, 0x23, 0xb1, 0x38, 0xfa, 0x22, 0x25, 0x15, 0xb5\ndb 0x17, 0xb8, 0xa0, 0xc3, 0xb0, 0x80, 0x98, 0x04, 0x85, 0x91, 0x2b, 0xa8, 0x79, 0x34, 0xf9, 0x74\ndb 0x9e, 0x49, 0xad, 0xcf, 0xca, 0xf6, 0x06, 0xd3, 0xdf, 0x27, 0xb6, 0xd8, 0x19, 0x14, 0x84, 0xee\ndb 0xe6, 0x9c, 0x7c, 0x41, 0x07, 0xbd, 0x26, 0x7b, 0x3c, 0x81, 0x20, 0x8f, 0x1d, 0x50, 0x2d, 0xdd\ndb 0x31, 0xb9, 0x5a, 0x4c, 0xc0, 0x89, 0x68, 0x79, 0xb4, 0x9e, 0xe6, 0x57, 0x44, 0xee, 0x32, 0xbb\ndb 0x69, 0xf7, 0x35, 0xbc, 0xcf, 0x96, 0xa7, 0xe0, 0xb4, 0x38, 0xce, 0xde, 0xb9, 0xf6, 0xfe, 0x5a\ndb 0xb9, 0xe7, 0x3c, 0x01, 0xf2, 0xbd, 0xa8, 0x26, 0xf6, 0x29, 0x0b, 0xe6, 0xd7, 0xe7, 0xa5, 0x62\ndb 0xb0, 0x0c, 0x9b, 0x01, 0x4f, 0x18, 0x9e, 0x40, 0x28, 0x2a, 0xbb, 0x21, 0xe6, 0x8d, 0x93, 0x22\ndb 0xbd, 0x01, 0xfc, 0x78, 0x93, 0x29, 0x55, 0x8f, 0x17, 0xe8, 0x09, 0x07, 0xf8, 0x30, 0x20, 0x68\ndb 0xf2, 0x95, 0xc1, 0x50, 0xad, 0x12, 0x35, 0x46, 0x52, 0x65, 0xaa, 0xb7, 0x35, 0x50, 0x22, 0x91\ndb 0x36, 0x74, 0x86, 0xab, 0x4b, 0xe8, 0xfd, 0x42, 0x76, 0x41, 0x4a, 0xb4, 0x2c, 0x59, 0x36, 0xc9\ndb 0xd6, 0xdb, 0x7e, 0xa1, 0x60, 0xcf, 0x13, 0x62, 0x0c, 0x93, 0xdd, 0x3e, 0xfc, 0x3e, 0x36, 0xfc\ndb 0xfd, 0x7e, 0x48, 0x69, 0x0f, 0x6a, 0xdf, 0x3c, 0xc0, 0x35, 0xcf, 0x81, 0x4b, 0x79, 0x15, 0x2d\ndb 0xda, 0x5a, 0x7f, 0xef, 0xe1, 0x13, 0x75, 0xef, 0xad, 0x80, 0xf7, 0x4e, 0xa1, 0xfd, 0x5d, 0xf8\ndb 0x67, 0xc4, 0x4a, 0xe5, 0x9f, 0x28, 0xe8, 0x82, 0xe5, 0xae, 0xac, 0xef, 0xb9, 0x4b, 0xca, 0x44\ndb 0x9b, 0xdc, 0xf2, 0xd2, 0x57, 0xa6, 0x9c, 0x5e, 0xbb, 0xd5, 0x4e, 0x31, 0xa8, 0xfa, 0x32, 0x26\ndb 0x4d, 0x46, 0x0d, 0xcb, 0xcf, 0x9e, 0x1a, 0xa3, 0x50, 0x69, 0x06, 0x34, 0xd8, 0xf9, 0x5d, 0xaf\ndb 0x4f, 0xc5, 0x2b, 0xe0, 0x8b, 0x81, 0x76, 0xc5, 0xce, 0x74, 0x4b, 0xba, 0x02, 0xba, 0xd4, 0x8b\ndb 0x91, 0xc5, 0x54, 0x28, 0x41, 0x77, 0x5f, 0xaa, 0x83, 0x14, 0xba, 0xf7, 0x8c, 0x51, 0xe2, 0xea\ndb 0xcf, 0x71, 0x40, 0x2f, 0x07, 0x82, 0xed, 0x81, 0x8c, 0x4f, 0xd3, 0x28, 0xce, 0x5c, 0x16, 0x72\ndb 0x4f, 0xcc, 0xe8, 0x49, 0x04, 0xae, 0x11, 0xe4, 0xbb, 0x18, 0x6d, 0xc4, 0xb3, 0x30, 0x20, 0xf7\ndb 0x0c, 0xe8, 0x50, 0x68, 0x37, 0xe9, 0x48, 0x76, 0x8b, 0x33, 0xea, 0xbb, 0x0d, 0x52, 0xbb, 0xab\ndb 0x6a, 0x62, 0xf4, 0x06, 0xbe, 0x5d, 0x7e, 0x89, 0xfb, 0xca, 0x75, 0xe6, 0xf7, 0x27, 0x59, 0x7c\ndb 0x91, 0x1a, 0xa3, 0xbb, 0x5a, 0x72, 0xd4, 0x3c, 0x19, 0xa8, 0x00, 0x74, 0x12, 0x24, 0x1c, 0x49\ndb 0xd9, 0x87, 0xd2, 0xc2, 0x98, 0x63, 0x7a, 0x0e, 0x5c, 0x39, 0x6b, 0x44, 0x29, 0xee, 0xef, 0x18\ndb 0xd1, 0xab, 0x15, 0xe0, 0x79, 0x50, 0x2a, 0x21, 0xc2, 0x67, 0x21, 0xab, 0x3c, 0x54, 0xc6, 0xf4\ndb 0xc6, 0x67, 0x96, 0x38, 0x37, 0xb6, 0xd2, 0x1b, 0xf0, 0xf6, 0xf8, 0x03, 0x60, 0x1c, 0xd8, 0x28\ndb 0xb2, 0x47, 0x53, 0x97, 0xf3, 0x1e, 0xd0, 0xcd, 0xd8, 0x30, 0xad, 0x24, 0xe7, 0xd9, 0x38, 0x97\ndb 0xb4, 0xc3, 0x1b, 0xb3, 0xea, 0x28, 0x40, 0x99, 0x29, 0x3e, 0x8f, 0x30, 0xb2, 0x55, 0xca, 0x7b\n"
  },
  {
    "path": "unittests/ASM/VEX/mulx.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": \"0xFFFFFFFFFFFFFFFE\",\n      \"RBX\": \"4\",\n      \"RCX\": \"4\",\n      \"RDX\": \"0xFFFFFFFE\",\n      \"RSI\": \"1\",\n      \"RDI\": \"1\"\n  },\n  \"HostFeatures\": [\"BMI2\"]\n}\n%endif\n\n; Test low\nmov rbx, 2\nmov rdx, 2\nmulx rax, rbx, rbx\n\n; Test high\nmov rcx, -1\nmov rdx, -1\nmulx rax, rdi, rcx\n\n; 32-bit\n\n; Test low\nmov ecx, 2\nmov edx, 2\nmulx edx, ecx, ecx\n\n; Test high\nmov esi, -1\nmov edx, -1\nmulx edx, esi, esi \n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/pdep.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": \"0x00012567\",\n      \"RBX\": \"0xFF00FFF0\",\n      \"RCX\": \"0x12005670\",\n      \"RDX\": \"0x0801256708012567\",\n      \"RSI\": \"0xFF00FF00FF00FF00\",\n      \"RDI\": \"0x0800010025006700\"\n  },\n  \"HostFeatures\": [\"BMI2\"]\n}\n%endif\n\n; 32-bit\nmov eax, 0x00012567\nmov ebx, 0xFF00FFF0\npdep ecx, eax, ebx\n\n; 64-bit\nmov rdx, 0x0801256708012567\nmov rsi, 0xFF00FF00FF00FF00\npdep rdi, rdx, rsi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/pext.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": \"0x12345678\",\n      \"RBX\": \"0xFF00FFF0\",\n      \"RCX\": \"0x00012567\",\n      \"RDX\": \"0x1234567812345678\",\n      \"RSI\": \"0xFF00FF00FF00FF00\",\n      \"RDI\": \"0x12561256\",\n      \"R8\":  \"0x1234567812345678\",\n      \"R10\": \"0x12345678\",\n      \"R11\": \"0x12345678\",\n      \"R12\": \"0x00005678\"\n  },\n  \"HostFeatures\": [\"BMI2\"]\n}\n%endif\n\n; 32-bit\nmov eax, 0x12345678\nmov ebx, 0xFF00FFF0\npext ecx, eax, ebx\n\n; 32-bit full mask\nmov r10d,  0x12345678\nmov r9d, 0xFFFFFFFF\npext r10d, r10d, r9d\n\n; 32-bit half mask\nmov r12d, 0x12345678\nmov r9d, 0x0000FFFF\npext r12d, r12d, r9d\n\n; 64-bit\nmov rdx, 0x1234567812345678\nmov rsi, 0xFF00FF00FF00FF00\npext rdi, rdx, rsi\n\n; 64-bit full mask\nmov r8, 0x1234567812345678\nmov r9, 0xFFFFFFFFFFFFFFFF\npext r8, r8, r9\n\n; 64-bit half mask\nmov r11, 0x1234567812345678\nmov r9,  0x00000000FFFFFFFF\npext r11, r11, r9\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/rorx.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": \"0x8000000000000000\",\n      \"RBX\": \"0xFF\",\n      \"RCX\": \"0xF00000000000000F\",\n      \"RDX\": \"0x80000000\",\n      \"RSI\": \"0xFF\",\n      \"RDI\": \"0xF000000F\",\n      \"R8\":  \"0\",\n      \"R9\": \"0x0000000045464748\",\n      \"R10\": \"0x0000000022a323a4\"\n\n  },\n  \"HostFeatures\": [\"BMI2\"]\n}\n%endif\n\n; Trivial test\nmov rax, 1\nrorx rax, rax, 1\n\n; More than one bit\nmov rbx, 0xFF\nrorx rcx, rbx, 4\n\n; Test that we mask the rotation amount above the operand size (should leave rcx's value alone).\nrorx rcx, rcx, 64\n\n; 32-bit\n\n; Trivial test\nmov edx, 1\nrorx edx, edx, 1\n\n; More than one bit\nmov esi, 0xFF\nrorx edi, esi, 4,\n\n; Test that we mask the rotation amount above the operand size (should leave edi's value alone).\nrorx edi, edi, 32\n\n; Zero-extending behavior\nmov r8, 0xFFFFFFFF00000000\nrorx r8d, r8d, 0\n\nmov r9, 0x4142434445464748\nrorx r9d, r9d, 0xE0\n\nmov r10, 0x4142434445464748\nrorx r10d, r10d, 0xE1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/sarx.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": \"0xF800000000000000\",\n      \"RBX\": \"4\",\n      \"RCX\": \"0xFFFFFFFFFFFFFFFF\",\n      \"RDX\": \"127\",\n      \"RSI\": \"63\",\n      \"RDI\": \"0x00000000FFFFFFFF\"\n  },\n  \"HostFeatures\": [\"BMI2\"]\n}\n%endif\n\n; Trivial right shift\nmov rax, 0x8000000000000000\nmov rbx, 4\nsarx rax, rax, rbx\n\n; This is really a shift by 63. This just ensures we properly\n; mask the shift value according to the ISA manual.\nmov rcx, 0x8000000000000000\nmov rdx, 127\nsarx rcx, rcx, rdx\n\n; This is really a shift by 31. This just ensures we properly\n; mask the shift value according to the ISA manual.\nmov edi, 0x80000000\nmov esi, 63\nsarx edi, edi, esi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/shlx.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": \"0x10\",\n      \"RBX\": \"4\",\n      \"RCX\": \"0x8000000000000000\",\n      \"RDX\": \"127\",\n      \"RSI\": \"63\",\n      \"RDI\": \"0x80000000\"\n  },\n  \"HostFeatures\": [\"BMI2\"]\n}\n%endif\n\n; Trivial left shift\nmov rax, 1\nmov rbx, 4\nshlx rax, rax, rbx\n\n; This is really a shift by 63. This just ensures we properly\n; mask the shift value according to the ISA manual.\nmov rcx, 1\nmov rdx, 127\nshlx rcx, rcx, rdx\n\n; This is really a shift by 31. This just ensures we properly\n; mask the shift value according to the ISA manual.\nmov edi, 1\nmov esi, 63\nshlx edi, edi, esi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/shrx.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n      \"RAX\": \"0x0800000000000000\",\n      \"RBX\": \"4\",\n      \"RCX\": \"1\",\n      \"RDX\": \"127\",\n      \"RSI\": \"63\",\n      \"RDI\": \"1\"\n  },\n  \"HostFeatures\": [\"BMI2\"]\n}\n%endif\n\n; Trivial right shift\nmov rax, 0x8000000000000000\nmov rbx, 4\nshrx rax, rax, rbx\n\n; This is really a shift by 63. This just ensures we properly\n; mask the shift value according to the ISA manual.\nmov rcx, 0x8000000000000000\nmov rdx, 127\nshrx rcx, rcx, rdx\n\n; This is really a shift by 31. This just ensures we properly\n; mask the shift value according to the ISA manual.\nmov edi, 0x80000000\nmov esi, 63\nshrx edi, edi, esi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/vaddpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x3FF0000000000000\", \"0x4000000000000000\", \"0x4008000000000000\", \"0x4010000000000000\"],\n    \"XMM1\": [\"0x4014000000000000\", \"0x4018000000000000\", \"0x401C000000000000\", \"0x4020000000000000\"],\n    \"XMM2\": [\"0x4018000000000000\", \"0x4020000000000000\", \"0x4024000000000000\", \"0x4028000000000000\"],\n    \"XMM3\": [\"0x4018000000000000\", \"0x4020000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4018000000000000\", \"0x4020000000000000\", \"0x4024000000000000\", \"0x4028000000000000\"],\n    \"XMM5\": [\"0x4018000000000000\", \"0x4020000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Registers\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\nvaddpd ymm2, ymm0, ymm1\nvaddpd xmm3, xmm0, xmm1\n\n; Memory operand\nvaddpd ymm4, ymm0, [rdx + 32]\nvaddpd xmm5, xmm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000 ; 1.0\ndq 0x4000000000000000 ; 2.0\ndq 0x4008000000000000 ; 3.0\ndq 0x4010000000000000 ; 4.0\n\ndq 0x4014000000000000 ; 5.0\ndq 0x4018000000000000 ; 6.0\ndq 0x401C000000000000 ; 7.0\ndq 0x4020000000000000 ; 8.0\n"
  },
  {
    "path": "unittests/ASM/VEX/vaddps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x400000003F800000\", \"0x4080000040400000\", \"0x40C0000040A00000\", \"0x4100000040E00000\"],\n    \"XMM1\": [\"0x4100000040E00000\", \"0x40C0000040A00000\", \"0x4080000040400000\", \"0x400000003F800000\"],\n    \"XMM2\": [\"0x4120000041000000\", \"0x4120000041000000\", \"0x4120000041000000\", \"0x4120000041000000\"],\n    \"XMM3\": [\"0x4120000041000000\", \"0x4120000041000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4120000041000000\", \"0x4120000041000000\", \"0x4120000041000000\", \"0x4120000041000000\"],\n    \"XMM5\": [\"0x4120000041000000\", \"0x4120000041000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Registers\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\nvaddps ymm2, ymm0, ymm1\nvaddps xmm3, xmm0, xmm1\n\n; Memory operand\nvaddps ymm4, ymm0, [rdx + 32]\nvaddps xmm5, xmm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x400000003F800000 ; 2.0, 1.0\ndq 0x4080000040400000 ; 4.0, 3.0\ndq 0x40C0000040A00000 ; 6.0, 5.0\ndq 0x4100000040E00000 ; 8.0, 7.0\n\ndq 0x4100000040E00000 ; 8.0, 7.0\ndq 0x40C0000040A00000 ; 6.0, 5.0\ndq 0x4080000040400000 ; 4.0, 3.0\ndq 0x400000003F800000 ; 2.0, 1.0\n"
  },
  {
    "path": "unittests/ASM/VEX/vaddsd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x4014000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x4010000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM2\":  [\"0x4039000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x4030000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM4\":  [\"0x403A000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x403D000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x4039000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM7\":  [\"0x404B000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\nvmovapd ymm5, [rdx + 32 * 4]\n\n; Register only\nvaddsd xmm0, xmm0, xmm1\nvaddsd xmm2, xmm2, xmm3\n\n; Memory operand\nvaddsd xmm4, xmm4, [rdx + 32 * 0]\nvaddsd xmm5, xmm5, [rdx + 32 * 1]\n\n; Merging different src into destination\nvpxor xmm7, xmm7, xmm7\nvmovapd ymm6, [rdx + 32 * 4]\nvaddsd xmm7, xmm5, xmm6\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000 ; 1.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4010000000000000 ; 4.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4022000000000000 ; 9.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4030000000000000 ; 16.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4039000000000000 ; 25.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vaddss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434440A00000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x4142434440800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x4142434441C80000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434441800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x4142434441D00000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4142434441800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM6\": [\"0x4142434441C80000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM7\": [\"0x4142434442240000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\n\n; Register only\nvaddss xmm0, xmm0, xmm1\nvaddss xmm2, xmm2, xmm3\n\n; Memory operand\nvaddss xmm4, xmm4, [rdx + 32 * 0]\nvaddss xmm5, xmm5, [rdx + 32 * 1]\n\n; Merging different src into destination\nvpxor xmm7, xmm7, xmm7\nvmovapd ymm5, [rdx + 32 * 3]\nvmovapd ymm6, [rdx + 32 * 4]\nvaddss xmm7, xmm5, xmm6\n\nhlt\n\nalign 32\n.data:\ndq 0x414243443F800000 ; 1.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434440800000 ; 4.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441100000 ; 9.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441800000 ; 16.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441C80000 ; 25.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vaddsubpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\" : [\"0xBFF0000000000000\", \"0x4008000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\" : [\"0xBFF0000000000000\", \"0x4008000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\" : [\"0x3FF0000000000000\", \"0x4008000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\" : [\"0x3FF0000000000000\", \"0x4008000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\" : [\"0xBFF0000000000000\", \"0x4008000000000000\", \"0xBFF0000000000000\", \"0x4008000000000000\"],\n    \"XMM7\" : [\"0xBFF0000000000000\", \"0x4008000000000000\", \"0xBFF0000000000000\", \"0x4008000000000000\"],\n    \"XMM8\" : [\"0x3FF0000000000000\", \"0x4008000000000000\", \"0x3FF0000000000000\", \"0x4008000000000000\"],\n    \"XMM9\" : [\"0x3FF0000000000000\", \"0x4008000000000000\", \"0x3FF0000000000000\", \"0x4008000000000000\"],\n    \"XMM10\": [\"0xBFF0000000000000\", \"0x4008000000000000\", \"0xBFF0000000000000\", \"0x4008000000000000\"],\n    \"XMM11\": [\"0xBFF0000000000000\", \"0x4008000000000000\", \"0xBFF0000000000000\", \"0x4008000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvaddsubpd xmm2, xmm0, [rdx + 32]\nvaddsubpd xmm3, xmm0, xmm1\n\nvaddsubpd xmm4, xmm1, [rdx]\nvaddsubpd xmm5, xmm1, xmm0\n\nvaddsubpd ymm6, ymm0, [rdx + 32]\nvaddsubpd ymm7, ymm0, ymm1\n\nvaddsubpd ymm8, ymm1, [rdx]\nvaddsubpd ymm9, ymm1, ymm0\n\n; Aliasing source/destination vectors\nvmovapd ymm10, [rdx]\nvaddsubpd ymm10, ymm10, ymm1\n\nvmovapd ymm11, [rdx + 32]\nvaddsubpd ymm11, ymm0, ymm11\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000\ndq 0x3FF0000000000000\ndq 0x3FF0000000000000\ndq 0x3FF0000000000000\n\ndq 0x4000000000000000\ndq 0x4000000000000000\ndq 0x4000000000000000\ndq 0x4000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vaddsubps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x41200000C0000000\", \"0x41200000C0C00000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x41200000C0000000\", \"0x41200000C0C00000\", \"0x41200000C0000000\", \"0x41200000C0C00000\"],\n    \"XMM4\": [\"0x41200000C0000000\", \"0x41200000C0C00000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x41200000C0000000\", \"0x41200000C0C00000\", \"0x41200000C0000000\", \"0x41200000C0C00000\"],\n    \"XMM6\": [\"0x41200000C0000000\", \"0x41200000C0C00000\", \"0x41200000C0000000\", \"0x41200000C0C00000\"],\n    \"XMM7\": [\"0x41200000C0000000\", \"0x41200000C0C00000\", \"0x41200000C0000000\", \"0x41200000C0C00000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvaddsubps xmm2, xmm0, [rdx + 32]\nvaddsubps ymm3, ymm0, [rdx + 32]\n\nvaddsubps xmm4, xmm0, xmm1\nvaddsubps ymm5, ymm0, ymm1\n\n; Aliasing source/destination vectors\nvmovapd ymm6, [rdx]\nvaddsubps ymm6, ymm6, ymm1\n\nvmovapd ymm7, [rdx + 32]\nvaddsubps ymm7, ymm0, ymm7\n\nhlt\n\nalign 32\n.data:\ndq 0x4080000040400000 ; 4, 3\ndq 0x400000003f800000 ; 2, 1\ndq 0x4080000040400000 ; 4, 3\ndq 0x400000003f800000 ; 2, 1\n\ndq 0x40C0000040A00000 ; 6, 5\ndq 0x4100000040E00000 ; 8, 7\ndq 0x40C0000040A00000 ; 6, 5\ndq 0x4100000040E00000 ; 8, 7\n"
  },
  {
    "path": "unittests/ASM/VEX/vaesdec.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\": [\"0x7A1FC5A0A07A1FC5\", \"0xC5A07A1F1FC5A07A\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x85E03A5F5F85E03A\", \"0x3A5F85E0E03A5F85\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x7A1FC5A1A07A1FC4\", \"0xC5A07A1E1FC5A07B\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x85E03A5FA07A1FC5\", \"0xC5A07A1EE03A5F85\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 4]\n\nvaesdec xmm1, xmm0, [rdx + 32 * 0]\nvaesdec xmm2, xmm0, [rdx + 32 * 1]\nvaesdec xmm3, xmm0, [rdx + 32 * 2]\nvaesdec xmm4, xmm0, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\n\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\n\ndq 0x0202020202020202\ndq 0x0303030303030303\ndq 0x0202020202020202\ndq 0x0303030303030303\n"
  },
  {
    "path": "unittests/ASM/VEX/vaesdec256.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AES256\"],\n  \"RegData\": {\n    \"XMM1\": [\"0x7A1FC5A0A07A1FC5\", \"0xC5A07A1F1FC5A07A\", \"0x7a1fc5a0a07a1fc5\", \"0xc5a07a1f1fc5a07a\"],\n    \"XMM2\": [\"0x85E03A5F5F85E03A\", \"0x3A5F85E0E03A5F85\", \"0x85e03a5f5f85e03a\", \"0x3a5f85e0e03a5f85\"],\n    \"XMM3\": [\"0x7A1FC5A1A07A1FC4\", \"0xC5A07A1E1FC5A07B\", \"0x7a1fc5a1a07a1fc4\", \"0xc5a07a1e1fc5a07b\"],\n    \"XMM4\": [\"0x85E03A5FA07A1FC5\", \"0xC5A07A1EE03A5F85\", \"0x85e03a5fa07a1fc5\", \"0xc5a07a1ee03a5f85\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 4]\n\nvaesdec ymm1, ymm0, [rdx + 32 * 0]\nvaesdec ymm2, ymm0, [rdx + 32 * 1]\nvaesdec ymm3, ymm0, [rdx + 32 * 2]\nvaesdec ymm4, ymm0, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\n\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\n\ndq 0x0202020202020202\ndq 0x0303030303030303\ndq 0x0202020202020202\ndq 0x0303030303030303\n"
  },
  {
    "path": "unittests/ASM/VEX/vaesdeclast.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\": [\"0xD5D56A6A6AD5D56A\", \"0x6A6AD5D5D56A6AD5\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x2A2A9595952A2A95\", \"0x95952A2A2A95952A\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0xD5D56A6B6AD5D56B\", \"0x6A6AD5D4D56A6AD4\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x2A2A95956AD5D56A\", \"0x6A6AD5D42A95952A\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 4]\n\nvaesdeclast xmm1, xmm0, [rdx + 32 * 0]\nvaesdeclast xmm2, xmm0, [rdx + 32 * 1]\nvaesdeclast xmm3, xmm0, [rdx + 32 * 2]\nvaesdeclast xmm4, xmm0, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\n\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\n\ndq 0x0202020202020202\ndq 0x0303030303030303\ndq 0x0202020202020202\ndq 0x0303030303030303\n"
  },
  {
    "path": "unittests/ASM/VEX/vaesdeclast256.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AES256\"],\n  \"RegData\": {\n    \"XMM1\": [\"0xD5D56A6A6AD5D56A\", \"0x6A6AD5D5D56A6AD5\", \"0xd5d56a6a6ad5d56a\", \"0x6a6ad5d5d56a6ad5\"],\n    \"XMM2\": [\"0x2A2A9595952A2A95\", \"0x95952A2A2A95952A\", \"0x2a2a9595952a2a95\", \"0x95952a2a2a95952a\"],\n    \"XMM3\": [\"0xD5D56A6B6AD5D56B\", \"0x6A6AD5D4D56A6AD4\", \"0xd5d56a6b6ad5d56b\", \"0x6a6ad5d4d56a6ad4\"],\n    \"XMM4\": [\"0x2A2A95956AD5D56A\", \"0x6A6AD5D42A95952A\", \"0x2a2a95956ad5d56a\", \"0x6a6ad5d42a95952a\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 4]\n\nvaesdeclast ymm1, ymm0, [rdx + 32 * 0]\nvaesdeclast ymm2, ymm0, [rdx + 32 * 1]\nvaesdeclast ymm3, ymm0, [rdx + 32 * 2]\nvaesdeclast ymm4, ymm0, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\n\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\n\ndq 0x0202020202020202\ndq 0x0303030303030303\ndq 0x0202020202020202\ndq 0x0303030303030303\n"
  },
  {
    "path": "unittests/ASM/VEX/vaesenc.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\": [\"0x77637B6F637B6F77\", \"0x7B6F77636F77637B\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x889C84909C849088\", \"0x8490889C90889C84\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x77637B6E637B6F76\", \"0x7B6F77626F77637A\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x889C8490637B6F77\", \"0x7B6F776290889C84\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 4]\n\nvaesenc xmm1, xmm0, [rdx + 32 * 0]\nvaesenc xmm2, xmm0, [rdx + 32 * 1]\nvaesenc xmm3, xmm0, [rdx + 32 * 2]\nvaesenc xmm4, xmm0, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\n\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\n\ndq 0x0202020202020202\ndq 0x0303030303030303\ndq 0x0202020202020202\ndq 0x0303030303030303\n"
  },
  {
    "path": "unittests/ASM/VEX/vaesenc256.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AES256\"],\n  \"RegData\": {\n    \"XMM1\": [\"0x77637B6F637B6F77\", \"0x7B6F77636F77637B\", \"0x77637b6f637b6f77\", \"0x7b6f77636f77637b\"],\n    \"XMM2\": [\"0x889C84909C849088\", \"0x8490889C90889C84\", \"0x889c84909c849088\", \"0x8490889c90889c84\"],\n    \"XMM3\": [\"0x77637B6E637B6F76\", \"0x7B6F77626F77637A\", \"0x77637b6e637b6f76\", \"0x7b6f77626f77637a\"],\n    \"XMM4\": [\"0x889C8490637B6F77\", \"0x7B6F776290889C84\", \"0x889c8490637b6f77\", \"0x7b6f776290889c84\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 4]\n\nvaesenc ymm1, ymm0, [rdx + 32 * 0]\nvaesenc ymm2, ymm0, [rdx + 32 * 1]\nvaesenc ymm3, ymm0, [rdx + 32 * 2]\nvaesenc ymm4, ymm0, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\n\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\n\ndq 0x0202020202020202\ndq 0x0303030303030303\ndq 0x0202020202020202\ndq 0x0303030303030303\n"
  },
  {
    "path": "unittests/ASM/VEX/vaesenclast.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\": [\"0x777B7B777B7B7777\", \"0x7B77777B77777B7B\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x8884848884848888\", \"0x8488888488888484\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x777B7B767B7B7776\", \"0x7B77777A77777B7A\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x888484887B7B7777\", \"0x7B77777A88888484\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 4]\n\nvaesenclast xmm1, xmm0, [rdx + 32 * 0]\nvaesenclast xmm2, xmm0, [rdx + 32 * 1]\nvaesenclast xmm3, xmm0, [rdx + 32 * 2]\nvaesenclast xmm4, xmm0, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\n\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\n\ndq 0x0202020202020202\ndq 0x0303030303030303\ndq 0x0202020202020202\ndq 0x0303030303030303\n"
  },
  {
    "path": "unittests/ASM/VEX/vaesenclast256.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AES256\"],\n  \"RegData\": {\n    \"XMM1\": [\"0x777B7B777B7B7777\", \"0x7B77777B77777B7B\", \"0x777b7b777b7b7777\", \"0x7b77777b77777b7b\"],\n    \"XMM2\": [\"0x8884848884848888\", \"0x8488888488888484\", \"0x8884848884848888\", \"0x8488888488888484\"],\n    \"XMM3\": [\"0x777B7B767B7B7776\", \"0x7B77777A77777B7A\", \"0x777b7b767b7b7776\", \"0x7b77777a77777b7a\"],\n    \"XMM4\": [\"0x888484887B7B7777\", \"0x7B77777A88888484\", \"0x888484887b7b7777\", \"0x7b77777a88888484\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 4]\n\nvaesenclast ymm1, ymm0, [rdx + 32 * 0]\nvaesenclast ymm2, ymm0, [rdx + 32 * 1]\nvaesenclast ymm3, ymm0, [rdx + 32 * 2]\nvaesenclast ymm4, ymm0, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\n\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\n\ndq 0x0202020202020202\ndq 0x0303030303030303\ndq 0x0202020202020202\ndq 0x0303030303030303\n"
  },
  {
    "path": "unittests/ASM/VEX/vaesimc.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x0B0D090E0B0D090E\", \"0x0B0D090E0B0D090E\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0xFFFFFFFF00000000\", \"0x0B0D090EFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x0202020202020202\", \"0x0303030303030303\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x0B0D090E0B0D090E\", \"0x0B0D090E0B0D090E\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0xFFFFFFFF00000000\", \"0x0B0D090EFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0202020202020202\", \"0x0303030303030303\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvaesimc xmm0, [rdx + 32 * 0]\nvaesimc xmm1, [rdx + 32 * 1]\nvaesimc xmm2, [rdx + 32 * 2]\nvaesimc xmm3, [rdx + 32 * 3]\nvaesimc xmm4, [rdx + 32 * 4]\n\nvmovapd ymm5, [rdx + 32 * 0]\nvmovapd ymm6, [rdx + 32 * 1]\nvmovapd ymm7, [rdx + 32 * 2]\nvmovapd ymm8, [rdx + 32 * 3]\nvmovapd ymm9, [rdx + 32 * 4]\n\nvaesimc xmm10, xmm5\nvaesimc xmm11, xmm6\nvaesimc xmm12, xmm7\nvaesimc xmm13, xmm8\nvaesimc xmm14, xmm9\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\n\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\n\ndq 0x0202020202020202\ndq 0x0303030303030303\ndq 0x0202020202020202\ndq 0x0303030303030303\n"
  },
  {
    "path": "unittests/ASM/VEX/vaeskeygenassist.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x6363636363636363\", \"0x6363636363636363\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x1616161616161616\", \"0x1616161616161616\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x7C6363636363637C\", \"0x7C6363636363637C\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x1616161616161616\", \"0x7C6363636363637C\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x6363636263636363\", \"0x6363636263636363\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x1616161416161616\", \"0x1616161416161616\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x7C6363606363637C\", \"0x7C6363606363637C\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x1616161216161616\", \"0x7C6363676363637C\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x6363636663636363\", \"0x6363636663636363\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x1616161016161616\", \"0x1616161016161616\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x7C6363646363637C\", \"0x7C6363646363637C\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x1616161E16161616\", \"0x7C63636B6363637C\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x6363636A63636363\", \"0x6363636A63636363\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x1616161C16161616\", \"0x1616161C16161616\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x7C6363686363637C\", \"0x7C6363686363637C\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM15\": [\"0x1616161A16161616\", \"0x7C63636F6363637C\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvaeskeygenassist xmm0, [rdx + 16 * 0], 0\nvaeskeygenassist xmm1, [rdx + 16 * 1], 0\nvaeskeygenassist xmm2, [rdx + 16 * 2], 0\nvaeskeygenassist xmm3, [rdx + 16 * 3], 0\n\nvaeskeygenassist xmm4, [rdx + 16 * 0], 1\nvaeskeygenassist xmm5, [rdx + 16 * 1], 2\nvaeskeygenassist xmm6, [rdx + 16 * 2], 3\nvaeskeygenassist xmm7, [rdx + 16 * 3], 4\n\nvaeskeygenassist xmm8,  [rdx + 16 * 0], 5\nvaeskeygenassist xmm9,  [rdx + 16 * 1], 6\nvaeskeygenassist xmm10, [rdx + 16 * 2], 7\nvaeskeygenassist xmm11, [rdx + 16 * 3], 8\n\nvaeskeygenassist xmm12, [rdx + 16 * 0], 9\nvaeskeygenassist xmm13, [rdx + 16 * 1], 10\nvaeskeygenassist xmm14, [rdx + 16 * 2], 11\nvaeskeygenassist xmm15, [rdx + 16 * 3], 12\n\nhlt\n\nalign 16\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0000000100000001\ndq 0x0000000100000001\n\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\n\ndq 0x0202020202020202\ndq 0x0303030303030303\n"
  },
  {
    "path": "unittests/ASM/VEX/vandnpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0xCCCCCCCC75767778\", \"0x61626364DDDDDDDD\", \"0xEEEEEEEE55565758\", \"0x41424344FFFFFFFF\"],\n    \"XMM2\": [\"0x8C8C8C8830303030\", \"0x2020202088898885\", \"0x8E8C8C8A10101010\", \"0x000000008A898887\"],\n    \"XMM3\": [\"0x8C8C8C8830303030\", \"0x2020202088898885\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x8C8C8C8830303030\", \"0x2020202088898885\", \"0x8E8C8C8A10101010\", \"0x000000008A898887\"],\n    \"XMM5\": [\"0x8C8C8C8830303030\", \"0x2020202088898885\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data1]\nlea rbx, [rel .data2]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rbx]\n\n; Register only\nvandnpd ymm2, ymm0, ymm1\nvandnpd xmm3, xmm0, xmm1\n\n; With memory operand\nvandnpd ymm4, ymm0, [rbx]\nvandnpd xmm5, xmm0, [rbx]\n\nhlt\n\nalign 32\n.data1:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0xCCCCCCCC75767778\ndq 0x61626364DDDDDDDD\ndq 0xEEEEEEEE55565758\ndq 0x41424344FFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vandnps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0xCCCCCCCC75767778\", \"0x61626364DDDDDDDD\", \"0xEEEEEEEE55565758\", \"0x41424344FFFFFFFF\"],\n    \"XMM2\": [\"0x8C8C8C8830303030\", \"0x2020202088898885\", \"0x8E8C8C8A10101010\", \"0x000000008A898887\"],\n    \"XMM3\": [\"0x8C8C8C8830303030\", \"0x2020202088898885\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x8C8C8C8830303030\", \"0x2020202088898885\", \"0x8E8C8C8A10101010\", \"0x000000008A898887\"],\n    \"XMM5\": [\"0x8C8C8C8830303030\", \"0x2020202088898885\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data1]\nlea rbx, [rel .data2]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rbx]\n\n; Register only\nvandnps ymm2, ymm0, ymm1\nvandnps xmm3, xmm0, xmm1\n\n; With memory operand\nvandnps ymm4, ymm0, [rbx]\nvandnps xmm5, xmm0, [rbx]\n\nhlt\n\nalign 32\n.data1:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0xCCCCCCCC75767778\ndq 0x61626364DDDDDDDD\ndq 0xEEEEEEEE55565758\ndq 0x41424344FFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vandpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0xCCCCCCCC75767778\", \"0x61626364DDDDDDDD\", \"0xEEEEEEEE55565758\", \"0x41424344FFFFFFFF\"],\n    \"XMM2\": [\"0x4040404445464748\", \"0x4142434455545558\", \"0x6062626445464748\", \"0x4142434475767778\"],\n    \"XMM3\": [\"0x4040404445464748\", \"0x4142434455545558\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4040404445464748\", \"0x4142434455545558\", \"0x6062626445464748\", \"0x4142434475767778\"],\n    \"XMM5\": [\"0x4040404445464748\", \"0x4142434455545558\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data1]\nlea rbx, [rel .data2]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rbx]\n\n; Register only\nvandpd ymm2, ymm0, ymm1\nvandpd xmm3, xmm0, xmm1\n\n; With memory operand\nvandpd ymm4, ymm0, [rbx]\nvandpd xmm5, xmm0, [rbx]\n\nhlt\n\nalign 32\n.data1:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0xCCCCCCCC75767778\ndq 0x61626364DDDDDDDD\ndq 0xEEEEEEEE55565758\ndq 0x41424344FFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vandps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0xCCCCCCCC75767778\", \"0x61626364DDDDDDDD\", \"0xEEEEEEEE55565758\", \"0x41424344FFFFFFFF\"],\n    \"XMM2\": [\"0x4040404445464748\", \"0x4142434455545558\", \"0x6062626445464748\", \"0x4142434475767778\"],\n    \"XMM3\": [\"0x4040404445464748\", \"0x4142434455545558\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4040404445464748\", \"0x4142434455545558\", \"0x6062626445464748\", \"0x4142434475767778\"],\n    \"XMM5\": [\"0x4040404445464748\", \"0x4142434455545558\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data1]\nlea rbx, [rel .data2]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rbx]\n\n; Register only\nvandps ymm2, ymm0, ymm1\nvandps xmm3, xmm0, xmm1\n\n; With memory operand\nvandps ymm4, ymm0, [rbx]\nvandps xmm5, xmm0, [rbx]\n\nhlt\n\nalign 32\n.data1:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0xCCCCCCCC75767778\ndq 0x61626364DDDDDDDD\ndq 0xEEEEEEEE55565758\ndq 0x41424344FFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vblendpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0xAAAAAAAAAAAAAAAA\", \"0xCCCCCCCCCCCCCCCC\", \"0xEEEEEEEEEEEEEEEE\", \"0x9999999999999999\"],\n    \"XMM3\": [\"0x1111111111111111\", \"0x3333333333333333\", \"0x5555555555555555\", \"0x7777777777777777\"],\n    \"XMM4\": [\"0xAAAAAAAAAAAAAAAA\", \"0xCCCCCCCCCCCCCCCC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x1111111111111111\", \"0x3333333333333333\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0xAAAAAAAAAAAAAAAA\", \"0x3333333333333333\", \"0xEEEEEEEEEEEEEEEE\", \"0x7777777777777777\"],\n    \"XMM7\": [\"0x1111111111111111\", \"0xCCCCCCCCCCCCCCCC\", \"0x5555555555555555\", \"0x9999999999999999\"],\n    \"XMM8\": [\"0xAAAAAAAAAAAAAAAA\", \"0x3333333333333333\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\": [\"0x1111111111111111\", \"0xCCCCCCCCCCCCCCCC\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Selecting all of one input vector\nvblendpd ymm2, ymm0, ymm1, 0    ; All of ymm0\nvblendpd ymm3, ymm0, ymm1, 0xFF ; All of ymm1\n\nvblendpd xmm4, xmm0, xmm1, 0    ; All of xmm0\nvblendpd xmm5, xmm0, xmm1, 0xFF ; All of xmm1\n\n; Alternating source vectors\nvblendpd ymm6, ymm0, ymm1, 0b10101010\nvblendpd ymm7, ymm0, ymm1, 0b01010101\n\nvblendpd xmm8, xmm0, xmm1, 0b10101010\nvblendpd xmm9, xmm0, xmm1, 0b01010101\n\nhlt\n\nalign 32\n.data:\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xEEEEEEEEEEEEEEEE\ndq 0x9999999999999999\n\ndq 0x1111111111111111\ndq 0x3333333333333333\ndq 0x5555555555555555\ndq 0x7777777777777777\n"
  },
  {
    "path": "unittests/ASM/VEX/vblendps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0xAAAAAAAABBBBBBBB\", \"0xCCCCCCCCDDDDDDDD\", \"0xEEEEEEEEFFFFFFFF\", \"0x9999999988888888\"],\n    \"XMM3\": [\"0x1111111122222222\", \"0x3333333344444444\", \"0x5555555566666666\", \"0x7777777788888888\"],\n    \"XMM4\": [\"0xAAAAAAAABBBBBBBB\", \"0xCCCCCCCCDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x1111111122222222\", \"0x3333333344444444\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x11111111BBBBBBBB\", \"0x33333333DDDDDDDD\", \"0x55555555FFFFFFFF\", \"0x7777777788888888\"],\n    \"XMM7\": [\"0xAAAAAAAA22222222\", \"0xCCCCCCCC44444444\", \"0xEEEEEEEE66666666\", \"0x9999999988888888\"],\n    \"XMM8\": [\"0x11111111BBBBBBBB\", \"0x33333333DDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\": [\"0xAAAAAAAA22222222\", \"0xCCCCCCCC44444444\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x1111111122222222\", \"0xccccccccdddddddd\", \"0xeeeeeeeeffffffff\", \"0x9999999988888888\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Selecting all of one input vector\nvblendps ymm2, ymm0, ymm1, 0    ; All of ymm0\nvblendps ymm3, ymm0, ymm1, 0xFF ; All of ymm1\n\nvblendps xmm4, xmm0, xmm1, 0    ; All of xmm0\nvblendps xmm5, xmm0, xmm1, 0xFF ; All of xmm1\n\n; Alternating source vectors\nvblendps ymm6, ymm0, ymm1, 0b10101010\nvblendps ymm7, ymm0, ymm1, 0b01010101\n\nvblendps xmm8, xmm0, xmm1, 0b10101010\nvblendps xmm9, xmm0, xmm1, 0b01010101\n\n; Different sources between upper and lower selectors\nvblendps ymm10, ymm0, ymm1, 0x3\n\nhlt\n\nalign 32\n.data:\ndq 0xAAAAAAAABBBBBBBB\ndq 0xCCCCCCCCDDDDDDDD\ndq 0xEEEEEEEEFFFFFFFF\ndq 0x9999999988888888\n\ndq 0x1111111122222222\ndq 0x3333333344444444\ndq 0x5555555566666666\ndq 0x7777777788888888\n"
  },
  {
    "path": "unittests/ASM/VEX/vblendvpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM3\":  [\"0x1111111111111111\", \"0x3333333333333333\", \"0x5555555555555555\", \"0x7777777777777777\"],\n    \"XMM4\":  [\"0x1111111111111111\", \"0x3333333333333333\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0xAAAAAAAAAAAAAAAA\", \"0xCCCCCCCCCCCCCCCC\", \"0xEEEEEEEEEEEEEEEE\", \"0x9999999999999999\"],\n    \"XMM6\":  [\"0xAAAAAAAAAAAAAAAA\", \"0xCCCCCCCCCCCCCCCC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x1111111111111111\", \"0xCCCCCCCCCCCCCCCC\", \"0x5555555555555555\", \"0x9999999999999999\"],\n    \"XMM8\":  [\"0x1111111111111111\", \"0xCCCCCCCCCCCCCCCC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0xAAAAAAAAAAAAAAAA\", \"0x3333333333333333\", \"0xEEEEEEEEEEEEEEEE\", \"0x7777777777777777\"],\n    \"XMM10\": [\"0xAAAAAAAAAAAAAAAA\", \"0x3333333333333333\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x1111111111111111\", \"0x3333333333333333\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\nvmovaps ymm2, [rel .mask_all]\n\n; Select all ymm1\nvblendvpd ymm3, ymm0, ymm1, ymm2\nvblendvpd xmm4, xmm0, xmm1, xmm2\n\n; Select all ymm0\nvmovaps ymm2, [rel .mask_none]\nvblendvpd ymm5, ymm0, ymm1, ymm2\nvblendvpd xmm6, xmm0, xmm1, xmm2\n\n; Interleaved selection from ymm1 and ymm0\nvmovaps ymm2, [rel .mask_interleave1]\nvblendvpd ymm7, ymm0, ymm1, ymm2\nvblendvpd xmm8, xmm0, xmm1, xmm2\n\n; Interleaved selection from ymm0 and ymm1\nvmovaps ymm2, [rel .mask_interleave2]\nvblendvpd ymm9,  ymm0, ymm1, ymm2\nvblendvpd xmm10, xmm0, xmm1, xmm2\n\n; Select all ymm0, with data in upper-bits\nvmovaps ymm11, [rel .data_bad]\nvmovaps ymm2, [rel .mask_all]\nvblendvpd xmm11, xmm0, xmm1, xmm2\n\nhlt\n\nalign 32\n.data:\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xEEEEEEEEEEEEEEEE\ndq 0x9999999999999999\n\ndq 0x1111111111111111\ndq 0x3333333333333333\ndq 0x5555555555555555\ndq 0x7777777777777777\n\n.mask_all:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.mask_none:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.mask_interleave1:\ndq 0x8000000000000000\ndq 0x0000000000000000\ndq 0x8000000000000000\ndq 0x0000000000000000\n\n.mask_interleave2:\ndq 0x0000000000000000\ndq 0x8000000000000000\ndq 0x0000000000000000\ndq 0x8000000000000000\n\n.data_bad:\ndq 0x3132333435363738\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\n"
  },
  {
    "path": "unittests/ASM/VEX/vblendvps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM3\":  [\"0x1111111122222222\", \"0x3333333344444444\", \"0x5555555566666666\", \"0x7777777788888888\"],\n    \"XMM4\":  [\"0x1111111122222222\", \"0x3333333344444444\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0xAAAAAAAABBBBBBBB\", \"0xCCCCCCCCDDDDDDDD\", \"0xEEEEEEEEFFFFFFFF\", \"0x9999999988888888\"],\n    \"XMM6\":  [\"0xAAAAAAAABBBBBBBB\", \"0xCCCCCCCCDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0xAAAAAAAA22222222\", \"0xCCCCCCCC44444444\", \"0xEEEEEEEE66666666\", \"0x9999999988888888\"],\n    \"XMM8\":  [\"0xAAAAAAAA22222222\", \"0xCCCCCCCC44444444\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x11111111BBBBBBBB\", \"0x33333333DDDDDDDD\", \"0x55555555FFFFFFFF\", \"0x7777777788888888\"],\n    \"XMM10\": [\"0x11111111BBBBBBBB\", \"0x33333333DDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x1111111122222222\", \"0x3333333344444444\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\nvmovaps ymm2, [rel .mask_all]\n\n; Select all ymm1\nvblendvps ymm3, ymm0, ymm1, ymm2\nvblendvps xmm4, xmm0, xmm1, xmm2\n\n; Select all ymm0\nvmovaps ymm2, [rel .mask_none]\nvblendvps ymm5, ymm0, ymm1, ymm2\nvblendvps xmm6, xmm0, xmm1, xmm2\n\n; Interleaved selection from ymm1 and ymm0\nvmovaps ymm2, [rel .mask_interleave1]\nvblendvps ymm7, ymm0, ymm1, ymm2\nvblendvps xmm8, xmm0, xmm1, xmm2\n\n; Interleaved selection from ymm0 and ymm1\nvmovaps ymm2, [rel .mask_interleave2]\nvblendvps ymm9,  ymm0, ymm1, ymm2\nvblendvps xmm10, xmm0, xmm1, xmm2\n\n; Select all ymm0, with data in upper-bits\nvmovaps ymm11, [rel .data_bad]\nvmovaps ymm2, [rel .mask_all]\nvblendvps xmm11, xmm0, xmm1, xmm2\n\nhlt\n\nalign 32\n.data:\ndq 0xAAAAAAAABBBBBBBB\ndq 0xCCCCCCCCDDDDDDDD\ndq 0xEEEEEEEEFFFFFFFF\ndq 0x9999999988888888\n\ndq 0x1111111122222222\ndq 0x3333333344444444\ndq 0x5555555566666666\ndq 0x7777777788888888\n\n.mask_all:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.mask_none:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.mask_interleave1:\ndq 0x0000000080000000\ndq 0x0000000080000000\ndq 0x0000000080000000\ndq 0x0000000080000000\n\n.mask_interleave2:\ndq 0x8000000000000000\ndq 0x8000000000000000\ndq 0x8000000000000000\ndq 0x8000000000000000\n\n.data_bad:\ndq 0x3132333435363738\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\n"
  },
  {
    "path": "unittests/ASM/VEX/vbroadcastf128.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvbroadcastf128 ymm0, [rdx]\n\nhlt\n\nalign 32\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n"
  },
  {
    "path": "unittests/ASM/VEX/vbroadcasti128.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvbroadcasti128 ymm0, [rdx]\n\nhlt\n\nalign 32\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n"
  },
  {
    "path": "unittests/ASM/VEX/vbroadcastsd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM1\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\", \"0xDDDDDDDDDDDDDDDD\", \"0xCCCCCCCCCCCCCCCC\"],\n      \"XMM2\": [\"0xA76C4F06A12BFCE0\", \"0xA76C4F06A12BFCE0\", \"0xA76C4F06A12BFCE0\", \"0xA76C4F06A12BFCE0\"],\n      \"XMM3\": [\"0x6868C3F3AAED56E0\", \"0x6868C3F3AAED56E0\", \"0x6868C3F3AAED56E0\", \"0x6868C3F3AAED56E0\"],\n      \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM5\": [\"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 0]\nvmovaps ymm1, [rdx + 32 * 1]\n\n; Register broadcasting\nvbroadcastsd ymm2, xmm0\nvbroadcastsd ymm3, xmm1\n\n; Memory broadcasting\nvbroadcastsd ymm4, [rdx + 16]\nvbroadcastsd ymm5, [rdx + 24]\n\nhlt\n\nalign 32\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x6868C3F3AAED56E0\ndq 0xF0FCE9E294E6E6DE\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vbroadcastss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM1\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\", \"0xDDDDDDDDDDDDDDDD\", \"0xCCCCCCCCCCCCCCCC\"],\n      \"XMM2\": [\"0xA12BFCE0A12BFCE0\", \"0xA12BFCE0A12BFCE0\", \"0xA12BFCE0A12BFCE0\", \"0xA12BFCE0A12BFCE0\"],\n      \"XMM3\": [\"0xAAED56E0AAED56E0\", \"0xAAED56E0AAED56E0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM5\": [\"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 0]\nvmovaps ymm1, [rdx + 32 * 1]\n\n; Register broadcasting\nvbroadcastss ymm2, xmm0\nvbroadcastss xmm3, xmm1\n\n; Memory broadcasting\nvbroadcastss ymm4, [rdx + 16]\nvbroadcastss xmm5, [rdx + 24]\n\nhlt\n\nalign 32\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x6868C3F3AAED56E0\ndq 0xF0FCE9E294E6E6DE\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vcmppd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\nvcmppd xmm2, xmm0, xmm1, 0x00 ; EQ\nvcmppd xmm3, xmm0, xmm1, 0x01 ; LT\nvcmppd xmm4, xmm0, xmm1, 0x02 ; LTE\nvcmppd xmm5, xmm0, xmm1, 0x04 ; NEQ\nvcmppd xmm6, xmm0, xmm1, 0x05 ; NLT\nvcmppd xmm7, xmm0, xmm1, 0x06 ; NLTE\n\n; Unordered and Ordered tests need to be special cased\nvmovapd ymm8, [rdx + 32 * 2]\nvmovapd ymm9, [rdx + 32 * 3]\n\n; Unordered will return true when either input is nan\n; [0.0, nan] unord [nan, 0.0] = [1, 1]\nvcmppd xmm10, xmm8, xmm9, 0x03 ; Unordered\n\n; Ordered will return true when both inputs are NOT nan\n; [0.0, nan] ord [nan, 0.0] = [0, 0]\nvcmppd xmm11, xmm8, xmm9, 0x07 ; Ordered\n\n; Ordered will return true when both inputs are NOT nan\n; [nan, 0.0] ord [nan, 0.0] = [0, 1]\nvcmppd xmm12, xmm9, xmm9, 0x07 ; Ordered\n\n; Ordered will return true when both inputs are NOT nan\n; [0.0, nan] ord [0.0, nan] = [1, 0]\nvcmppd xmm13, xmm8, xmm8, 0x07 ; Ordered\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000\ndq 0x4000000000000000\ndq 0x3FF0000000000000\ndq 0x4000000000000000\n\ndq 0x3FF0000000000000\ndq 0x4008000000000000\ndq 0x3FF0000000000000\ndq 0x4008000000000000\n\ndq 0x0000000000000000\ndq 0x7FF8000000000000\ndq 0x0000000000000000\ndq 0x7FF8000000000000\n\ndq 0x7FF8000000000000\ndq 0x0000000000000000\ndq 0x7FF8000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vcmppd_256.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM4\":  [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM5\":  [\"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM6\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM11\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM13\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\nvcmppd ymm2, ymm0, ymm1, 0x00 ; EQ\nvcmppd ymm3, ymm0, ymm1, 0x01 ; LT\nvcmppd ymm4, ymm0, ymm1, 0x02 ; LTE\nvcmppd ymm5, ymm0, ymm1, 0x04 ; NEQ\nvcmppd ymm6, ymm0, ymm1, 0x05 ; NLT\nvcmppd ymm7, ymm0, ymm1, 0x06 ; NLTE\n\n; Unordered and Ordered tests need to be special cased\nvmovapd ymm8, [rdx + 32 * 2]\nvmovapd ymm9, [rdx + 32 * 3]\n\n; Unordered will return true when either input is nan\n; [0.0, nan] unord [nan, 0.0] = [1, 1]\nvcmppd ymm10, ymm8, ymm9, 0x03 ; Unordered\n\n; Ordered will return true when both inputs are NOT nan\n; [0.0, nan] ord [nan, 0.0] = [0, 0]\nvcmppd ymm11, ymm8, ymm9, 0x07 ; Ordered\n\n; Ordered will return true when both inputs are NOT nan\n; [nan, 0.0] ord [nan, 0.0] = [0, 1]\nvcmppd ymm12, ymm9, ymm9, 0x07 ; Ordered\n\n; Ordered will return true when both inputs are NOT nan\n; [0.0, nan] ord [0.0, nan] = [1, 0]\nvcmppd ymm13, ymm8, ymm8, 0x07 ; Ordered\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000\ndq 0x4000000000000000\ndq 0x3FF0000000000000\ndq 0x4000000000000000\n\ndq 0x3FF0000000000000\ndq 0x4008000000000000\ndq 0x3FF0000000000000\ndq 0x4008000000000000\n\ndq 0x0000000000000000\ndq 0x7FF8000000000000\ndq 0x0000000000000000\ndq 0x7FF8000000000000\n\ndq 0x7FF8000000000000\ndq 0x0000000000000000\ndq 0x7FF8000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vcmppd_full.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RCX\": \"448\"\n  }\n}\n%endif\n\n%define true 1\n%define false 0\n\n%define EQ_OQ 0\n%define LT_OS 1\n%define LE_OS 2\n%define UNORD_Q 3\n%define NEQ_UQ 4\n%define NLT_US 5\n%define NLE_US 6\n%define ORD_Q 7\n%define EQ_UQ 8\n%define NGE_US 9\n%define NGT_US 10\n%define FALSE_OQ 11\n%define NEQ_OQ 12\n%define GE_OS 13\n%define GT_OS 14\n%define TRUE_UQ 15\n%define EQ_OS 16\n%define LT_OQ 17\n%define LE_OQ 18\n%define UNORD_S 19\n%define NEQ_US 20\n%define NLT_UQ 21\n%define NLE_UQ 22\n%define ORD_S 23\n%define EQ_US 24\n%define NGE_UQ 25\n%define NGT_UQ 26\n%define FALSE_OS 27\n%define NEQ_OS 28\n%define GE_OQ 29\n%define GT_OQ 30\n%define TRUE_US 31\n\n; Arguments: src1, src2, predicate, true/false\n%macro Compare 4\n    vcmppd result, %1, %2, %3\n    ; Construct expected result\n    vmovdqa temp, [rel .false + 32 * %4]\n    ; Compare if result and expected are equal\n    vxorpd ymm6, ymm7, ymm8\n    vptest ymm6, ymm6\n    jnz .fail\n    ; Increment counter of tests passed\n    add ecx, 1\n%endmacro\n\nlea rax, [rel .data]\nxor ecx, ecx\n\nvmovdqa ymm0, [rax + 32 * 0] ; -4.0\nvmovdqa ymm1, [rax + 32 * 1] ; -0.0\nvmovdqa ymm2, [rax + 32 * 2] ; 0.0\nvmovdqa ymm3, [rax + 32 * 3] ; 4.0\nvmovdqa ymm4, [rel .nan]     ; NaN\n\n%macro CompareAll 5\n    %define xmm_neg_four %1\n    %define xmm_neg_zero %2\n    %define xmm_zero %3\n    %define xmm_four %4\n    %define xmm_nan %5\n\n    Compare xmm_four, xmm_four, EQ_OQ, true\n    Compare xmm_neg_four, xmm_four, EQ_OQ, false\n    Compare xmm_zero, xmm_neg_zero, EQ_OQ, true\n    Compare xmm_zero, xmm_zero, EQ_OQ, true\n    Compare xmm_four, xmm_nan, EQ_OQ, false\n    Compare xmm_nan, xmm_four, EQ_OQ, false\n    Compare xmm_nan, xmm_nan, EQ_OQ, false\n\n    Compare xmm_four, xmm_neg_four, LT_OS, false\n    Compare xmm_neg_four, xmm_four, LT_OS, true\n    Compare xmm_zero, xmm_neg_zero, LT_OS, false\n    Compare xmm_neg_zero, xmm_zero, LT_OS, false\n    Compare xmm_nan, xmm_four, LT_OS, false\n    Compare xmm_four, xmm_nan, LT_OS, false\n    Compare xmm_nan, xmm_nan, LT_OS, false\n\n    Compare xmm_four, xmm_neg_four, LE_OS, false\n    Compare xmm_neg_four, xmm_four, LE_OS, true\n    Compare xmm_zero, xmm_neg_zero, LE_OS, true\n    Compare xmm_neg_zero, xmm_zero, LE_OS, true\n    Compare xmm_nan, xmm_four, LE_OS, false\n    Compare xmm_four, xmm_nan, LE_OS, false\n    Compare xmm_nan, xmm_nan, LE_OS, false\n\n    Compare xmm_four, xmm_neg_four, UNORD_Q, false\n    Compare xmm_neg_four, xmm_four, UNORD_Q, false\n    Compare xmm_zero, xmm_neg_zero, UNORD_Q, false\n    Compare xmm_neg_zero, xmm_zero, UNORD_Q, false\n    Compare xmm_nan, xmm_four, UNORD_Q, true\n    Compare xmm_four, xmm_nan, UNORD_Q, true\n    Compare xmm_nan, xmm_nan, UNORD_Q, true\n\n    Compare xmm_four, xmm_four, NEQ_UQ, false\n    Compare xmm_four, xmm_neg_four, NEQ_UQ, true\n    Compare xmm_zero, xmm_neg_zero, NEQ_UQ, false\n    Compare xmm_zero, xmm_zero, NEQ_UQ, false\n    Compare xmm_four, xmm_nan, NEQ_UQ, true\n    Compare xmm_nan, xmm_four, NEQ_UQ, true\n    Compare xmm_nan, xmm_nan, NEQ_UQ, true\n\n    Compare xmm_four, xmm_neg_four, NLT_US, true\n    Compare xmm_neg_four, xmm_four, NLT_US, false\n    Compare xmm_zero, xmm_neg_zero, NLT_US, true\n    Compare xmm_neg_zero, xmm_zero, NLT_US, true\n    Compare xmm_nan, xmm_four, NLT_US, true\n    Compare xmm_four, xmm_nan, NLT_US, true\n    Compare xmm_nan, xmm_nan, NLT_US, true\n\n    Compare xmm_four, xmm_neg_four, NLE_US, true\n    Compare xmm_neg_four, xmm_four, NLE_US, false\n    Compare xmm_zero, xmm_neg_zero, NLE_US, false\n    Compare xmm_neg_zero, xmm_zero, NLE_US, false\n    Compare xmm_nan, xmm_four, NLE_US, true\n    Compare xmm_four, xmm_nan, NLE_US, true\n    Compare xmm_nan, xmm_nan, NLE_US, true\n\n    Compare xmm_four, xmm_neg_four, ORD_Q, true\n    Compare xmm_neg_four, xmm_four, ORD_Q, true\n    Compare xmm_zero, xmm_neg_zero, ORD_Q, true\n    Compare xmm_neg_zero, xmm_zero, ORD_Q, true\n    Compare xmm_nan, xmm_four, ORD_Q, false\n    Compare xmm_four, xmm_nan, ORD_Q, false\n    Compare xmm_nan, xmm_nan, ORD_Q, false\n\n    Compare xmm_four, xmm_neg_four, EQ_UQ, false\n    Compare xmm_four, xmm_four, EQ_UQ, true\n    Compare xmm_zero, xmm_neg_zero, EQ_UQ, true\n    Compare xmm_zero, xmm_zero, EQ_UQ, true\n    Compare xmm_four, xmm_nan, EQ_UQ, true\n    Compare xmm_nan, xmm_four, EQ_UQ, true\n    Compare xmm_nan, xmm_nan, EQ_UQ, true\n\n    Compare xmm_four, xmm_neg_four, NGE_US, false\n    Compare xmm_neg_four, xmm_four, NGE_US, true\n    Compare xmm_zero, xmm_neg_zero, NGE_US, false\n    Compare xmm_neg_zero, xmm_zero, NGE_US, false\n    Compare xmm_nan, xmm_four, NGE_US, true\n    Compare xmm_four, xmm_nan, NGE_US, true\n    Compare xmm_nan, xmm_nan, NGE_US, true\n\n    Compare xmm_four, xmm_neg_four, NGT_US, false\n    Compare xmm_neg_four, xmm_four, NGT_US, true\n    Compare xmm_zero, xmm_neg_zero, NGT_US, true\n    Compare xmm_neg_zero, xmm_zero, NGT_US, true\n    Compare xmm_nan, xmm_four, NGT_US, true\n    Compare xmm_four, xmm_nan, NGT_US, true\n    Compare xmm_nan, xmm_nan, NGT_US, true\n\n    Compare xmm_four, xmm_neg_four, FALSE_OQ, false\n    Compare xmm_neg_four, xmm_four, FALSE_OQ, false\n    Compare xmm_zero, xmm_neg_zero, FALSE_OQ, false\n    Compare xmm_neg_zero, xmm_zero, FALSE_OQ, false\n    Compare xmm_nan, xmm_four, FALSE_OQ, false\n    Compare xmm_four, xmm_nan, FALSE_OQ, false\n    Compare xmm_nan, xmm_nan, FALSE_OQ, false\n\n    Compare xmm_four, xmm_neg_four, NEQ_OQ, true\n    Compare xmm_four, xmm_four, NEQ_OQ, false\n    Compare xmm_zero, xmm_neg_zero, NEQ_OQ, false\n    Compare xmm_zero, xmm_zero, NEQ_OQ, false\n    Compare xmm_four, xmm_nan, NEQ_OQ, false\n    Compare xmm_nan, xmm_four, NEQ_OQ, false\n    Compare xmm_nan, xmm_nan, NEQ_OQ, false\n\n    Compare xmm_four, xmm_neg_four, GE_OS, true\n    Compare xmm_neg_four, xmm_four, GE_OS, false\n    Compare xmm_zero, xmm_neg_zero, GE_OS, true\n    Compare xmm_neg_zero, xmm_zero, GE_OS, true\n    Compare xmm_nan, xmm_four, GE_OS, false\n    Compare xmm_four, xmm_nan, GE_OS, false\n    Compare xmm_nan, xmm_nan, GE_OS, false\n\n    Compare xmm_four, xmm_neg_four, GT_OS, true\n    Compare xmm_neg_four, xmm_four, GT_OS, false\n    Compare xmm_zero, xmm_neg_zero, GT_OS, false\n    Compare xmm_neg_zero, xmm_zero, GT_OS, false\n    Compare xmm_nan, xmm_four, GT_OS, false\n    Compare xmm_four, xmm_nan, GT_OS, false\n    Compare xmm_nan, xmm_nan, GT_OS, false\n\n    Compare xmm_four, xmm_neg_four, TRUE_UQ, true\n    Compare xmm_neg_four, xmm_four, TRUE_UQ, true\n    Compare xmm_zero, xmm_neg_zero, TRUE_UQ, true\n    Compare xmm_neg_zero, xmm_zero, TRUE_UQ, true\n    Compare xmm_nan, xmm_four, TRUE_UQ, true\n    Compare xmm_four, xmm_nan, TRUE_UQ, true\n    Compare xmm_nan, xmm_nan, TRUE_UQ, true\n\n    Compare xmm_four, xmm_neg_four, EQ_OS, false\n    Compare xmm_neg_four, xmm_four, EQ_OS, false\n    Compare xmm_zero, xmm_neg_zero, EQ_OS, true\n    Compare xmm_neg_zero, xmm_zero, EQ_OS, true\n    Compare xmm_nan, xmm_four, EQ_OS, false\n    Compare xmm_four, xmm_nan, EQ_OS, false\n    Compare xmm_nan, xmm_nan, EQ_OS, false\n\n    Compare xmm_four, xmm_neg_four, LT_OQ, false\n    Compare xmm_neg_four, xmm_four, LT_OQ, true\n    Compare xmm_zero, xmm_neg_zero, LT_OQ, false\n    Compare xmm_neg_zero, xmm_zero, LT_OQ, false\n    Compare xmm_nan, xmm_four, LT_OQ, false\n    Compare xmm_four, xmm_nan, LT_OQ, false\n    Compare xmm_nan, xmm_nan, LT_OQ, false\n\n    Compare xmm_four, xmm_neg_four, LE_OQ, false\n    Compare xmm_neg_four, xmm_four, LE_OQ, true\n    Compare xmm_zero, xmm_neg_zero, LE_OQ, true\n    Compare xmm_neg_zero, xmm_zero, LE_OQ, true\n    Compare xmm_nan, xmm_four, LE_OQ, false\n    Compare xmm_four, xmm_nan, LE_OQ, false\n    Compare xmm_nan, xmm_nan, LE_OQ, false\n\n    Compare xmm_four, xmm_neg_four, UNORD_S, false\n    Compare xmm_neg_four, xmm_four, UNORD_S, false\n    Compare xmm_zero, xmm_neg_zero, UNORD_S, false\n    Compare xmm_neg_zero, xmm_zero, UNORD_S, false\n    Compare xmm_nan, xmm_four, UNORD_S, true\n    Compare xmm_four, xmm_nan, UNORD_S, true\n    Compare xmm_nan, xmm_nan, UNORD_S, true\n\n    Compare xmm_four, xmm_neg_four, NEQ_US, true\n    Compare xmm_neg_four, xmm_four, NEQ_US, true\n    Compare xmm_zero, xmm_neg_zero, NEQ_US, false\n    Compare xmm_neg_zero, xmm_zero, NEQ_US, false\n    Compare xmm_nan, xmm_four, NEQ_US, true\n    Compare xmm_four, xmm_nan, NEQ_US, true\n    Compare xmm_nan, xmm_nan, NEQ_US, true\n\n    Compare xmm_four, xmm_neg_four, NLT_UQ, true\n    Compare xmm_neg_four, xmm_four, NLT_UQ, false\n    Compare xmm_zero, xmm_neg_zero, NLT_UQ, true\n    Compare xmm_neg_zero, xmm_zero, NLT_UQ, true\n    Compare xmm_nan, xmm_four, NLT_UQ, true\n    Compare xmm_four, xmm_nan, NLT_UQ, true\n    Compare xmm_nan, xmm_nan, NLT_UQ, true\n\n    Compare xmm_four, xmm_neg_four, NLE_UQ, true\n    Compare xmm_neg_four, xmm_four, NLE_UQ, false\n    Compare xmm_zero, xmm_neg_zero, NLE_UQ, false\n    Compare xmm_neg_zero, xmm_zero, NLE_UQ, false\n    Compare xmm_nan, xmm_four, NLE_UQ, true\n    Compare xmm_four, xmm_nan, NLE_UQ, true\n    Compare xmm_nan, xmm_nan, NLE_UQ, true\n\n    Compare xmm_four, xmm_neg_four, ORD_S, true\n    Compare xmm_neg_four, xmm_four, ORD_S, true\n    Compare xmm_zero, xmm_neg_zero, ORD_S, true\n    Compare xmm_neg_zero, xmm_zero, ORD_S, true\n    Compare xmm_nan, xmm_four, ORD_S, false\n    Compare xmm_four, xmm_nan, ORD_S, false\n    Compare xmm_nan, xmm_nan, ORD_S, false\n\n    Compare xmm_four, xmm_neg_four, EQ_US, false\n    Compare xmm_four, xmm_four, EQ_US, true\n    Compare xmm_zero, xmm_neg_zero, EQ_US, true\n    Compare xmm_zero, xmm_zero, EQ_US, true\n    Compare xmm_four, xmm_nan, EQ_US, true\n    Compare xmm_nan, xmm_four, EQ_US, true\n    Compare xmm_nan, xmm_nan, EQ_US, true\n\n    Compare xmm_four, xmm_neg_four, NGE_UQ, false\n    Compare xmm_neg_four, xmm_four, NGE_UQ, true\n    Compare xmm_zero, xmm_neg_zero, NGE_UQ, false\n    Compare xmm_neg_zero, xmm_zero, NGE_UQ, false\n    Compare xmm_nan, xmm_four, NGE_UQ, true\n    Compare xmm_four, xmm_nan, NGE_UQ, true\n    Compare xmm_nan, xmm_nan, NGE_UQ, true\n\n    Compare xmm_four, xmm_neg_four, NGT_UQ, false\n    Compare xmm_neg_four, xmm_four, NGT_UQ, true\n    Compare xmm_zero, xmm_neg_zero, NGT_UQ, true\n    Compare xmm_neg_zero, xmm_zero, NGT_UQ, true\n    Compare xmm_nan, xmm_four, NGT_UQ, true\n    Compare xmm_four, xmm_nan, NGT_UQ, true\n    Compare xmm_nan, xmm_nan, NGT_UQ, true\n\n    Compare xmm_four, xmm_neg_four, FALSE_OS, false\n    Compare xmm_neg_four, xmm_four, FALSE_OS, false\n    Compare xmm_zero, xmm_neg_zero, FALSE_OS, false\n    Compare xmm_neg_zero, xmm_zero, FALSE_OS, false\n    Compare xmm_nan, xmm_four, FALSE_OS, false\n    Compare xmm_four, xmm_nan, FALSE_OS, false\n    Compare xmm_nan, xmm_nan, FALSE_OS, false\n\n    Compare xmm_four, xmm_neg_four, NEQ_OS, true\n    Compare xmm_four, xmm_four, NEQ_OS, false\n    Compare xmm_zero, xmm_neg_zero, NEQ_OS, false\n    Compare xmm_zero, xmm_zero, NEQ_OS, false\n    Compare xmm_four, xmm_nan, NEQ_OS, false\n    Compare xmm_nan, xmm_four, NEQ_OS, false\n    Compare xmm_nan, xmm_nan, NEQ_OS, false\n\n    Compare xmm_four, xmm_neg_four, GE_OQ, true\n    Compare xmm_neg_four, xmm_four, GE_OQ, false\n    Compare xmm_zero, xmm_neg_zero, GE_OQ, true\n    Compare xmm_neg_zero, xmm_zero, GE_OQ, true\n    Compare xmm_nan, xmm_four, GE_OQ, false\n    Compare xmm_four, xmm_nan, GE_OQ, false\n    Compare xmm_nan, xmm_nan, GE_OQ, false\n\n    Compare xmm_four, xmm_neg_four, GT_OQ, true\n    Compare xmm_neg_four, xmm_four, GT_OQ, false\n    Compare xmm_zero, xmm_neg_zero, GT_OQ, false\n    Compare xmm_neg_zero, xmm_zero, GT_OQ, false\n    Compare xmm_nan, xmm_four, GT_OQ, false\n    Compare xmm_four, xmm_nan, GT_OQ, false\n    Compare xmm_nan, xmm_nan, GT_OQ, false\n\n    Compare xmm_four, xmm_neg_four, TRUE_US, true\n    Compare xmm_neg_four, xmm_four, TRUE_US, true\n    Compare xmm_zero, xmm_neg_zero, TRUE_US, true\n    Compare xmm_neg_zero, xmm_zero, TRUE_US, true\n    Compare xmm_nan, xmm_four, TRUE_US, true\n    Compare xmm_four, xmm_nan, TRUE_US, true\n    Compare xmm_nan, xmm_nan, TRUE_US, true\n%endmacro\n\n%define temp xmm8\n%define result xmm7\nCompareAll xmm0, xmm1, xmm2, xmm3, xmm4\n%define temp ymm8\n%define result ymm7\nCompareAll ymm0, ymm1, ymm2, ymm3, ymm4\n\n; If ecx is not correct we can use the counter to determine which test failed\n.fail:\nhlt\n\nalign 32\n.data:\ndq -4.0, -4.0, -4.0, -4.0\n\ndq -0.0, -0.0, -0.0, -0.0\n\ndq 0.0, 0.0, 0.0, 0.0\n\ndq 4.0, 4.0, 4.0, 4.0\n\n.nan:\ndq 0x7FF8000000000000\ndq 0x7FF8000000000000\ndq 0x7FF8000000000000\ndq 0x7FF8000000000000\n\n.false:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.true:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF"
  },
  {
    "path": "unittests/ASM/VEX/vcmpps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000000000000\", \"0xFFFFFFFF00000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFF00000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x00000000FFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0x00000000FFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0xFFFFFFFF00000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x00000000FFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\nvcmpps xmm2, xmm0, xmm1, 0x00 ; EQ\nvcmpps xmm3, xmm0, xmm1, 0x01 ; LT\nvcmpps xmm4, xmm0, xmm1, 0x02 ; LTE\nvcmpps xmm5, xmm0, xmm1, 0x04 ; NEQ\nvcmpps xmm6, xmm0, xmm1, 0x05 ; NLT\nvcmpps xmm7, xmm0, xmm1, 0x06 ; NLTE\n\n; Unordered and Ordered tests need to be special cased\nvmovapd ymm8, [rdx + 32 * 2]\nvmovapd ymm9, [rdx + 32 * 3]\n\n; Unordered will return true when either input is nan\n; [0.0, 0.0, nan, nan] unord [0.0, nan, 0.0, nan] = [0, 1, 1, 1]\nvcmpps xmm10, xmm8, xmm9, 0x03 ; Unordered\n\n; Ordered will return true when both inputs are NOT nan\n; [0.0, 0.0, nan, nan] ord [0.0, nan, 0.0, nan] = [1, 0, 0, 0]\nvcmpps xmm11, xmm8, xmm9, 0x07 ; Ordered\n\nhlt\n\nalign 32\n.data:\ndq 0x3F80000040000000\ndq 0x4000000040800000\ndq 0x3F80000040000000\ndq 0x4000000040800000\n\ndq 0x3F80000040000000\ndq 0x40A000003F800000\ndq 0x3F80000040000000\ndq 0x40A000003F800000\n\ndq 0x0000000000000000\ndq 0x7FC000007FC00000\ndq 0x0000000000000000\ndq 0x7FC000007FC00000\n\ndq 0x7FC0000000000000\ndq 0x7FC0000000000000\ndq 0x7FC0000000000000\ndq 0x7FC0000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vcmpps_256.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000000000000\", \"0xFFFFFFFF00000000\", \"0x0000000000000000\", \"0xFFFFFFFF00000000\"],\n    \"XMM4\":  [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFF00000000\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFF00000000\"],\n    \"XMM5\":  [\"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM6\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x00000000FFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0x00000000FFFFFFFF\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0x00000000FFFFFFFF\", \"0x0000000000000000\", \"0x00000000FFFFFFFF\"],\n    \"XMM10\": [\"0xFFFFFFFF00000000\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFF00000000\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM11\": [\"0x00000000FFFFFFFF\", \"0x0000000000000000\", \"0x00000000FFFFFFFF\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\nvcmpps ymm2, ymm0, ymm1, 0x00 ; EQ\nvcmpps ymm3, ymm0, ymm1, 0x01 ; LT\nvcmpps ymm4, ymm0, ymm1, 0x02 ; LTE\nvcmpps ymm5, ymm0, ymm1, 0x04 ; NEQ\nvcmpps ymm6, ymm0, ymm1, 0x05 ; NLT\nvcmpps ymm7, ymm0, ymm1, 0x06 ; NLTE\n\n; Unordered and Ordered tests need to be special cased\nvmovapd ymm8, [rdx + 32 * 2]\nvmovapd ymm9, [rdx + 32 * 3]\n\n; Unordered will return true when either input is nan\n; [0.0, 0.0, nan, nan] unord [0.0, nan, 0.0, nan] = [0, 1, 1, 1]\nvcmpps ymm10, ymm8, ymm9, 0x03 ; Unordered\n\n; Ordered will return true when both inputs are NOT nan\n; [0.0, 0.0, nan, nan] ord [0.0, nan, 0.0, nan] = [1, 0, 0, 0]\nvcmpps ymm11, ymm8, ymm9, 0x07 ; Ordered\n\nhlt\n\nalign 32\n.data:\ndq 0x3F80000040000000\ndq 0x4000000040800000\ndq 0x3F80000040000000\ndq 0x4000000040800000\n\ndq 0x3F80000040000000\ndq 0x40A000003F800000\ndq 0x3F80000040000000\ndq 0x40A000003F800000\n\ndq 0x0000000000000000\ndq 0x7FC000007FC00000\ndq 0x0000000000000000\ndq 0x7FC000007FC00000\n\ndq 0x7FC0000000000000\ndq 0x7FC0000000000000\ndq 0x7FC0000000000000\ndq 0x7FC0000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vcmpps_full.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RCX\": \"448\"\n  }\n}\n%endif\n\n%define true 1\n%define false 0\n\n%define EQ_OQ 0\n%define LT_OS 1\n%define LE_OS 2\n%define UNORD_Q 3\n%define NEQ_UQ 4\n%define NLT_US 5\n%define NLE_US 6\n%define ORD_Q 7\n%define EQ_UQ 8\n%define NGE_US 9\n%define NGT_US 10\n%define FALSE_OQ 11\n%define NEQ_OQ 12\n%define GE_OS 13\n%define GT_OS 14\n%define TRUE_UQ 15\n%define EQ_OS 16\n%define LT_OQ 17\n%define LE_OQ 18\n%define UNORD_S 19\n%define NEQ_US 20\n%define NLT_UQ 21\n%define NLE_UQ 22\n%define ORD_S 23\n%define EQ_US 24\n%define NGE_UQ 25\n%define NGT_UQ 26\n%define FALSE_OS 27\n%define NEQ_OS 28\n%define GE_OQ 29\n%define GT_OQ 30\n%define TRUE_US 31\n\n; Arguments: src1, src2, predicate, true/false\n%macro Compare 4\n    vcmpps result, %1, %2, %3\n    ; Construct expected result\n    vmovdqa temp, [rel .false + 32 * %4]\n    ; Compare if result and expected are equal\n    vxorps ymm6, ymm7, ymm8\n    vptest ymm6, ymm6\n    jnz .fail\n    ; Increment counter of tests passed\n    add ecx, 1\n%endmacro\n\nlea rax, [rel .data]\nxor ecx, ecx\n\nvmovdqa ymm0, [rax + 32 * 0] ; -4.0\nvmovdqa ymm1, [rax + 32 * 1] ; -0.0\nvmovdqa ymm2, [rax + 32 * 2] ; 0.0\nvmovdqa ymm3, [rax + 32 * 3] ; 4.0\nvmovdqa ymm4, [rel .nan]     ; NaN\n\n%macro CompareAll 5\n    %define xmm_neg_four %1\n    %define xmm_neg_zero %2\n    %define xmm_zero %3\n    %define xmm_four %4\n    %define xmm_nan %5\n\n    Compare xmm_four, xmm_four, EQ_OQ, true\n    Compare xmm_neg_four, xmm_four, EQ_OQ, false\n    Compare xmm_zero, xmm_neg_zero, EQ_OQ, true\n    Compare xmm_zero, xmm_zero, EQ_OQ, true\n    Compare xmm_four, xmm_nan, EQ_OQ, false\n    Compare xmm_nan, xmm_four, EQ_OQ, false\n    Compare xmm_nan, xmm_nan, EQ_OQ, false\n\n    Compare xmm_four, xmm_neg_four, LT_OS, false\n    Compare xmm_neg_four, xmm_four, LT_OS, true\n    Compare xmm_zero, xmm_neg_zero, LT_OS, false\n    Compare xmm_neg_zero, xmm_zero, LT_OS, false\n    Compare xmm_nan, xmm_four, LT_OS, false\n    Compare xmm_four, xmm_nan, LT_OS, false\n    Compare xmm_nan, xmm_nan, LT_OS, false\n\n    Compare xmm_four, xmm_neg_four, LE_OS, false\n    Compare xmm_neg_four, xmm_four, LE_OS, true\n    Compare xmm_zero, xmm_neg_zero, LE_OS, true\n    Compare xmm_neg_zero, xmm_zero, LE_OS, true\n    Compare xmm_nan, xmm_four, LE_OS, false\n    Compare xmm_four, xmm_nan, LE_OS, false\n    Compare xmm_nan, xmm_nan, LE_OS, false\n\n    Compare xmm_four, xmm_neg_four, UNORD_Q, false\n    Compare xmm_neg_four, xmm_four, UNORD_Q, false\n    Compare xmm_zero, xmm_neg_zero, UNORD_Q, false\n    Compare xmm_neg_zero, xmm_zero, UNORD_Q, false\n    Compare xmm_nan, xmm_four, UNORD_Q, true\n    Compare xmm_four, xmm_nan, UNORD_Q, true\n    Compare xmm_nan, xmm_nan, UNORD_Q, true\n\n    Compare xmm_four, xmm_four, NEQ_UQ, false\n    Compare xmm_four, xmm_neg_four, NEQ_UQ, true\n    Compare xmm_zero, xmm_neg_zero, NEQ_UQ, false\n    Compare xmm_zero, xmm_zero, NEQ_UQ, false\n    Compare xmm_four, xmm_nan, NEQ_UQ, true\n    Compare xmm_nan, xmm_four, NEQ_UQ, true\n    Compare xmm_nan, xmm_nan, NEQ_UQ, true\n\n    Compare xmm_four, xmm_neg_four, NLT_US, true\n    Compare xmm_neg_four, xmm_four, NLT_US, false\n    Compare xmm_zero, xmm_neg_zero, NLT_US, true\n    Compare xmm_neg_zero, xmm_zero, NLT_US, true\n    Compare xmm_nan, xmm_four, NLT_US, true\n    Compare xmm_four, xmm_nan, NLT_US, true\n    Compare xmm_nan, xmm_nan, NLT_US, true\n\n    Compare xmm_four, xmm_neg_four, NLE_US, true\n    Compare xmm_neg_four, xmm_four, NLE_US, false\n    Compare xmm_zero, xmm_neg_zero, NLE_US, false\n    Compare xmm_neg_zero, xmm_zero, NLE_US, false\n    Compare xmm_nan, xmm_four, NLE_US, true\n    Compare xmm_four, xmm_nan, NLE_US, true\n    Compare xmm_nan, xmm_nan, NLE_US, true\n\n    Compare xmm_four, xmm_neg_four, ORD_Q, true\n    Compare xmm_neg_four, xmm_four, ORD_Q, true\n    Compare xmm_zero, xmm_neg_zero, ORD_Q, true\n    Compare xmm_neg_zero, xmm_zero, ORD_Q, true\n    Compare xmm_nan, xmm_four, ORD_Q, false\n    Compare xmm_four, xmm_nan, ORD_Q, false\n    Compare xmm_nan, xmm_nan, ORD_Q, false\n\n    Compare xmm_four, xmm_neg_four, EQ_UQ, false\n    Compare xmm_four, xmm_four, EQ_UQ, true\n    Compare xmm_zero, xmm_neg_zero, EQ_UQ, true\n    Compare xmm_zero, xmm_zero, EQ_UQ, true\n    Compare xmm_four, xmm_nan, EQ_UQ, true\n    Compare xmm_nan, xmm_four, EQ_UQ, true\n    Compare xmm_nan, xmm_nan, EQ_UQ, true\n\n    Compare xmm_four, xmm_neg_four, NGE_US, false\n    Compare xmm_neg_four, xmm_four, NGE_US, true\n    Compare xmm_zero, xmm_neg_zero, NGE_US, false\n    Compare xmm_neg_zero, xmm_zero, NGE_US, false\n    Compare xmm_nan, xmm_four, NGE_US, true\n    Compare xmm_four, xmm_nan, NGE_US, true\n    Compare xmm_nan, xmm_nan, NGE_US, true\n\n    Compare xmm_four, xmm_neg_four, NGT_US, false\n    Compare xmm_neg_four, xmm_four, NGT_US, true\n    Compare xmm_zero, xmm_neg_zero, NGT_US, true\n    Compare xmm_neg_zero, xmm_zero, NGT_US, true\n    Compare xmm_nan, xmm_four, NGT_US, true\n    Compare xmm_four, xmm_nan, NGT_US, true\n    Compare xmm_nan, xmm_nan, NGT_US, true\n\n    Compare xmm_four, xmm_neg_four, FALSE_OQ, false\n    Compare xmm_neg_four, xmm_four, FALSE_OQ, false\n    Compare xmm_zero, xmm_neg_zero, FALSE_OQ, false\n    Compare xmm_neg_zero, xmm_zero, FALSE_OQ, false\n    Compare xmm_nan, xmm_four, FALSE_OQ, false\n    Compare xmm_four, xmm_nan, FALSE_OQ, false\n    Compare xmm_nan, xmm_nan, FALSE_OQ, false\n\n    Compare xmm_four, xmm_neg_four, NEQ_OQ, true\n    Compare xmm_four, xmm_four, NEQ_OQ, false\n    Compare xmm_zero, xmm_neg_zero, NEQ_OQ, false\n    Compare xmm_zero, xmm_zero, NEQ_OQ, false\n    Compare xmm_four, xmm_nan, NEQ_OQ, false\n    Compare xmm_nan, xmm_four, NEQ_OQ, false\n    Compare xmm_nan, xmm_nan, NEQ_OQ, false\n\n    Compare xmm_four, xmm_neg_four, GE_OS, true\n    Compare xmm_neg_four, xmm_four, GE_OS, false\n    Compare xmm_zero, xmm_neg_zero, GE_OS, true\n    Compare xmm_neg_zero, xmm_zero, GE_OS, true\n    Compare xmm_nan, xmm_four, GE_OS, false\n    Compare xmm_four, xmm_nan, GE_OS, false\n    Compare xmm_nan, xmm_nan, GE_OS, false\n\n    Compare xmm_four, xmm_neg_four, GT_OS, true\n    Compare xmm_neg_four, xmm_four, GT_OS, false\n    Compare xmm_zero, xmm_neg_zero, GT_OS, false\n    Compare xmm_neg_zero, xmm_zero, GT_OS, false\n    Compare xmm_nan, xmm_four, GT_OS, false\n    Compare xmm_four, xmm_nan, GT_OS, false\n    Compare xmm_nan, xmm_nan, GT_OS, false\n\n    Compare xmm_four, xmm_neg_four, TRUE_UQ, true\n    Compare xmm_neg_four, xmm_four, TRUE_UQ, true\n    Compare xmm_zero, xmm_neg_zero, TRUE_UQ, true\n    Compare xmm_neg_zero, xmm_zero, TRUE_UQ, true\n    Compare xmm_nan, xmm_four, TRUE_UQ, true\n    Compare xmm_four, xmm_nan, TRUE_UQ, true\n    Compare xmm_nan, xmm_nan, TRUE_UQ, true\n\n    Compare xmm_four, xmm_neg_four, EQ_OS, false\n    Compare xmm_neg_four, xmm_four, EQ_OS, false\n    Compare xmm_zero, xmm_neg_zero, EQ_OS, true\n    Compare xmm_neg_zero, xmm_zero, EQ_OS, true\n    Compare xmm_nan, xmm_four, EQ_OS, false\n    Compare xmm_four, xmm_nan, EQ_OS, false\n    Compare xmm_nan, xmm_nan, EQ_OS, false\n\n    Compare xmm_four, xmm_neg_four, LT_OQ, false\n    Compare xmm_neg_four, xmm_four, LT_OQ, true\n    Compare xmm_zero, xmm_neg_zero, LT_OQ, false\n    Compare xmm_neg_zero, xmm_zero, LT_OQ, false\n    Compare xmm_nan, xmm_four, LT_OQ, false\n    Compare xmm_four, xmm_nan, LT_OQ, false\n    Compare xmm_nan, xmm_nan, LT_OQ, false\n\n    Compare xmm_four, xmm_neg_four, LE_OQ, false\n    Compare xmm_neg_four, xmm_four, LE_OQ, true\n    Compare xmm_zero, xmm_neg_zero, LE_OQ, true\n    Compare xmm_neg_zero, xmm_zero, LE_OQ, true\n    Compare xmm_nan, xmm_four, LE_OQ, false\n    Compare xmm_four, xmm_nan, LE_OQ, false\n    Compare xmm_nan, xmm_nan, LE_OQ, false\n\n    Compare xmm_four, xmm_neg_four, UNORD_S, false\n    Compare xmm_neg_four, xmm_four, UNORD_S, false\n    Compare xmm_zero, xmm_neg_zero, UNORD_S, false\n    Compare xmm_neg_zero, xmm_zero, UNORD_S, false\n    Compare xmm_nan, xmm_four, UNORD_S, true\n    Compare xmm_four, xmm_nan, UNORD_S, true\n    Compare xmm_nan, xmm_nan, UNORD_S, true\n\n    Compare xmm_four, xmm_neg_four, NEQ_US, true\n    Compare xmm_neg_four, xmm_four, NEQ_US, true\n    Compare xmm_zero, xmm_neg_zero, NEQ_US, false\n    Compare xmm_neg_zero, xmm_zero, NEQ_US, false\n    Compare xmm_nan, xmm_four, NEQ_US, true\n    Compare xmm_four, xmm_nan, NEQ_US, true\n    Compare xmm_nan, xmm_nan, NEQ_US, true\n\n    Compare xmm_four, xmm_neg_four, NLT_UQ, true\n    Compare xmm_neg_four, xmm_four, NLT_UQ, false\n    Compare xmm_zero, xmm_neg_zero, NLT_UQ, true\n    Compare xmm_neg_zero, xmm_zero, NLT_UQ, true\n    Compare xmm_nan, xmm_four, NLT_UQ, true\n    Compare xmm_four, xmm_nan, NLT_UQ, true\n    Compare xmm_nan, xmm_nan, NLT_UQ, true\n\n    Compare xmm_four, xmm_neg_four, NLE_UQ, true\n    Compare xmm_neg_four, xmm_four, NLE_UQ, false\n    Compare xmm_zero, xmm_neg_zero, NLE_UQ, false\n    Compare xmm_neg_zero, xmm_zero, NLE_UQ, false\n    Compare xmm_nan, xmm_four, NLE_UQ, true\n    Compare xmm_four, xmm_nan, NLE_UQ, true\n    Compare xmm_nan, xmm_nan, NLE_UQ, true\n\n    Compare xmm_four, xmm_neg_four, ORD_S, true\n    Compare xmm_neg_four, xmm_four, ORD_S, true\n    Compare xmm_zero, xmm_neg_zero, ORD_S, true\n    Compare xmm_neg_zero, xmm_zero, ORD_S, true\n    Compare xmm_nan, xmm_four, ORD_S, false\n    Compare xmm_four, xmm_nan, ORD_S, false\n    Compare xmm_nan, xmm_nan, ORD_S, false\n\n    Compare xmm_four, xmm_neg_four, EQ_US, false\n    Compare xmm_four, xmm_four, EQ_US, true\n    Compare xmm_zero, xmm_neg_zero, EQ_US, true\n    Compare xmm_zero, xmm_zero, EQ_US, true\n    Compare xmm_four, xmm_nan, EQ_US, true\n    Compare xmm_nan, xmm_four, EQ_US, true\n    Compare xmm_nan, xmm_nan, EQ_US, true\n\n    Compare xmm_four, xmm_neg_four, NGE_UQ, false\n    Compare xmm_neg_four, xmm_four, NGE_UQ, true\n    Compare xmm_zero, xmm_neg_zero, NGE_UQ, false\n    Compare xmm_neg_zero, xmm_zero, NGE_UQ, false\n    Compare xmm_nan, xmm_four, NGE_UQ, true\n    Compare xmm_four, xmm_nan, NGE_UQ, true\n    Compare xmm_nan, xmm_nan, NGE_UQ, true\n\n    Compare xmm_four, xmm_neg_four, NGT_UQ, false\n    Compare xmm_neg_four, xmm_four, NGT_UQ, true\n    Compare xmm_zero, xmm_neg_zero, NGT_UQ, true\n    Compare xmm_neg_zero, xmm_zero, NGT_UQ, true\n    Compare xmm_nan, xmm_four, NGT_UQ, true\n    Compare xmm_four, xmm_nan, NGT_UQ, true\n    Compare xmm_nan, xmm_nan, NGT_UQ, true\n\n    Compare xmm_four, xmm_neg_four, FALSE_OS, false\n    Compare xmm_neg_four, xmm_four, FALSE_OS, false\n    Compare xmm_zero, xmm_neg_zero, FALSE_OS, false\n    Compare xmm_neg_zero, xmm_zero, FALSE_OS, false\n    Compare xmm_nan, xmm_four, FALSE_OS, false\n    Compare xmm_four, xmm_nan, FALSE_OS, false\n    Compare xmm_nan, xmm_nan, FALSE_OS, false\n\n    Compare xmm_four, xmm_neg_four, NEQ_OS, true\n    Compare xmm_four, xmm_four, NEQ_OS, false\n    Compare xmm_zero, xmm_neg_zero, NEQ_OS, false\n    Compare xmm_zero, xmm_zero, NEQ_OS, false\n    Compare xmm_four, xmm_nan, NEQ_OS, false\n    Compare xmm_nan, xmm_four, NEQ_OS, false\n    Compare xmm_nan, xmm_nan, NEQ_OS, false\n\n    Compare xmm_four, xmm_neg_four, GE_OQ, true\n    Compare xmm_neg_four, xmm_four, GE_OQ, false\n    Compare xmm_zero, xmm_neg_zero, GE_OQ, true\n    Compare xmm_neg_zero, xmm_zero, GE_OQ, true\n    Compare xmm_nan, xmm_four, GE_OQ, false\n    Compare xmm_four, xmm_nan, GE_OQ, false\n    Compare xmm_nan, xmm_nan, GE_OQ, false\n\n    Compare xmm_four, xmm_neg_four, GT_OQ, true\n    Compare xmm_neg_four, xmm_four, GT_OQ, false\n    Compare xmm_zero, xmm_neg_zero, GT_OQ, false\n    Compare xmm_neg_zero, xmm_zero, GT_OQ, false\n    Compare xmm_nan, xmm_four, GT_OQ, false\n    Compare xmm_four, xmm_nan, GT_OQ, false\n    Compare xmm_nan, xmm_nan, GT_OQ, false\n\n    Compare xmm_four, xmm_neg_four, TRUE_US, true\n    Compare xmm_neg_four, xmm_four, TRUE_US, true\n    Compare xmm_zero, xmm_neg_zero, TRUE_US, true\n    Compare xmm_neg_zero, xmm_zero, TRUE_US, true\n    Compare xmm_nan, xmm_four, TRUE_US, true\n    Compare xmm_four, xmm_nan, TRUE_US, true\n    Compare xmm_nan, xmm_nan, TRUE_US, true\n%endmacro\n\n%define temp xmm8\n%define result xmm7\nCompareAll xmm0, xmm1, xmm2, xmm3, xmm4\n%define temp ymm8\n%define result ymm7\nCompareAll ymm0, ymm1, ymm2, ymm3, ymm4\n\n; If ecx is not correct we can use the counter to determine which test failed\n.fail:\nhlt\n\nalign 32\n.data:\ndd -4.0, -4.0, -4.0, -4.0\ndd -4.0, -4.0, -4.0, -4.0\n\ndd -0.0, -0.0, -0.0, -0.0\ndd -0.0, -0.0, -0.0, -0.0\n\ndd 0.0, 0.0, 0.0, 0.0\ndd 0.0, 0.0, 0.0, 0.0\n\ndd 4.0, 4.0, 4.0, 4.0\ndd 4.0, 4.0, 4.0, 4.0\n\n.nan:\ndq 0x7FC000007FC00000\ndq 0x7FC000007FC00000\ndq 0x7FC000007FC00000\ndq 0x7FC000007FC00000\n\n.false:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.true:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF"
  },
  {
    "path": "unittests/ASM/VEX/vcmpsd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x4000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000000000000\", \"0x4000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x4000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000000000000000\", \"0x4000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x4000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0x4000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0xFFFFFFFFFFFFFFFF\", \"0x7FF8000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x0000000000000000\", \"0x7FF8000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0xFFFFFFFFFFFFFFFF\", \"0x7FF8000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\nvcmpsd xmm2, xmm0, xmm1, 0x00 ; EQ\nvcmpsd xmm3, xmm0, xmm1, 0x01 ; LT\nvcmpsd xmm4, xmm0, xmm1, 0x02 ; LTE\nvcmpsd xmm5, xmm0, xmm1, 0x04 ; NEQ\nvcmpsd xmm6, xmm0, xmm1, 0x05 ; NLT\nvcmpsd xmm7, xmm0, xmm1, 0x06 ; NLTE\n\n; Unordered and Ordered tests need to be special cased\nvmovapd ymm8, [rdx + 32 * 2]\nvmovapd ymm9, [rdx + 32 * 3]\n\n; Unordered will return true when either input is nan\n; [0.0, nan] unord [nan, 0.0] = [1, 1]\nvcmpsd xmm10, xmm8, xmm9, 0x03 ; Unordered\n\n; Ordered will return true when both inputs are NOT nan\n; [0.0, nan] ord [nan, 0.0] = [0, 0]\nvcmpsd xmm11, xmm8, xmm9, 0x07 ; Ordered\n\n; Ordered will return true when both inputs are NOT nan\n; [nan, 0.0] ord [nan, 0.0] = [0, 1]\nvcmpsd xmm12, xmm9, xmm8, 0x07 ; Ordered\n\n; Ordered will return true when both inputs are NOT nan\n; [0.0, nan] ord [0.0, nan] = [1, 0]\nvcmpsd xmm13, xmm8, xmm8, 0x07 ; Ordered\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000\ndq 0x4000000000000000\ndq 0x3FF0000000000000\ndq 0x4000000000000000\n\ndq 0x3FF0000000000000\ndq 0x4008000000000000\ndq 0x3FF0000000000000\ndq 0x4008000000000000\n\ndq 0x0000000000000000\ndq 0x7FF8000000000000\ndq 0x0000000000000000\ndq 0x7FF8000000000000\n\ndq 0x7FF8000000000000\ndq 0x0000000000000000\ndq 0x7FF8000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vcmpsd_full.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RCX\": \"224\"\n  }\n}\n%endif\n\n%define true 1\n%define false 0\n\n%define EQ_OQ 0\n%define LT_OS 1\n%define LE_OS 2\n%define UNORD_Q 3\n%define NEQ_UQ 4\n%define NLT_US 5\n%define NLE_US 6\n%define ORD_Q 7\n%define EQ_UQ 8\n%define NGE_US 9\n%define NGT_US 10\n%define FALSE_OQ 11\n%define NEQ_OQ 12\n%define GE_OS 13\n%define GT_OS 14\n%define TRUE_UQ 15\n%define EQ_OS 16\n%define LT_OQ 17\n%define LE_OQ 18\n%define UNORD_S 19\n%define NEQ_US 20\n%define NLT_UQ 21\n%define NLE_UQ 22\n%define ORD_S 23\n%define EQ_US 24\n%define NGE_UQ 25\n%define NGT_UQ 26\n%define FALSE_OS 27\n%define NEQ_OS 28\n%define GE_OQ 29\n%define GT_OQ 30\n%define TRUE_US 31\n\n; Arguments: src1, src2, predicate, true/false\n%macro Compare 4\n    vcmpsd xmm7, %1, %2, %3\n    ; Construct expected result\n    ; Move truthy/falsey value to the first element based on %4\n    ; and [127:64] from src1\n    vmovdqa xmm8, [rel .false + 32 * %4]\n    vmovsd xmm5, %1, xmm8\n    ; Compare if result and expected are equal\n    vxorpd ymm6, ymm7, ymm5\n    vptest ymm6, ymm6\n    jnz .fail\n    ; Increment counter of tests passed\n    add ecx, 1\n%endmacro\n\nlea rax, [rel .data]\nxor ecx, ecx\n\nvmovdqa ymm0, [rax + 32 * 0] ; -4.0\nvmovdqa ymm1, [rax + 32 * 1] ; -0.0\nvmovdqa ymm2, [rax + 32 * 2] ; 0.0\nvmovdqa ymm3, [rax + 32 * 3] ; 4.0\nvmovdqa ymm4, [rel .nan]     ; NaN\n\n%define xmm_neg_four xmm0\n%define xmm_neg_zero xmm1\n%define xmm_zero xmm2\n%define xmm_four xmm3\n%define xmm_nan xmm4\n\nCompare xmm_four, xmm_four, EQ_OQ, true\nCompare xmm_neg_four, xmm_four, EQ_OQ, false\nCompare xmm_zero, xmm_neg_zero, EQ_OQ, true\nCompare xmm_zero, xmm_zero, EQ_OQ, true\nCompare xmm_four, xmm_nan, EQ_OQ, false\nCompare xmm_nan, xmm_four, EQ_OQ, false\nCompare xmm_nan, xmm_nan, EQ_OQ, false\n\nCompare xmm_four, xmm_neg_four, LT_OS, false\nCompare xmm_neg_four, xmm_four, LT_OS, true\nCompare xmm_zero, xmm_neg_zero, LT_OS, false\nCompare xmm_neg_zero, xmm_zero, LT_OS, false\nCompare xmm_nan, xmm_four, LT_OS, false\nCompare xmm_four, xmm_nan, LT_OS, false\nCompare xmm_nan, xmm_nan, LT_OS, false\n\nCompare xmm_four, xmm_neg_four, LE_OS, false\nCompare xmm_neg_four, xmm_four, LE_OS, true\nCompare xmm_zero, xmm_neg_zero, LE_OS, true\nCompare xmm_neg_zero, xmm_zero, LE_OS, true\nCompare xmm_nan, xmm_four, LE_OS, false\nCompare xmm_four, xmm_nan, LE_OS, false\nCompare xmm_nan, xmm_nan, LE_OS, false\n\nCompare xmm_four, xmm_neg_four, UNORD_Q, false\nCompare xmm_neg_four, xmm_four, UNORD_Q, false\nCompare xmm_zero, xmm_neg_zero, UNORD_Q, false\nCompare xmm_neg_zero, xmm_zero, UNORD_Q, false\nCompare xmm_nan, xmm_four, UNORD_Q, true\nCompare xmm_four, xmm_nan, UNORD_Q, true\nCompare xmm_nan, xmm_nan, UNORD_Q, true\n\nCompare xmm_four, xmm_four, NEQ_UQ, false\nCompare xmm_four, xmm_neg_four, NEQ_UQ, true\nCompare xmm_zero, xmm_neg_zero, NEQ_UQ, false\nCompare xmm_zero, xmm_zero, NEQ_UQ, false\nCompare xmm_four, xmm_nan, NEQ_UQ, true\nCompare xmm_nan, xmm_four, NEQ_UQ, true\nCompare xmm_nan, xmm_nan, NEQ_UQ, true\n\nCompare xmm_four, xmm_neg_four, NLT_US, true\nCompare xmm_neg_four, xmm_four, NLT_US, false\nCompare xmm_zero, xmm_neg_zero, NLT_US, true\nCompare xmm_neg_zero, xmm_zero, NLT_US, true\nCompare xmm_nan, xmm_four, NLT_US, true\nCompare xmm_four, xmm_nan, NLT_US, true\nCompare xmm_nan, xmm_nan, NLT_US, true\n\nCompare xmm_four, xmm_neg_four, NLE_US, true\nCompare xmm_neg_four, xmm_four, NLE_US, false\nCompare xmm_zero, xmm_neg_zero, NLE_US, false\nCompare xmm_neg_zero, xmm_zero, NLE_US, false\nCompare xmm_nan, xmm_four, NLE_US, true\nCompare xmm_four, xmm_nan, NLE_US, true\nCompare xmm_nan, xmm_nan, NLE_US, true\n\nCompare xmm_four, xmm_neg_four, ORD_Q, true\nCompare xmm_neg_four, xmm_four, ORD_Q, true\nCompare xmm_zero, xmm_neg_zero, ORD_Q, true\nCompare xmm_neg_zero, xmm_zero, ORD_Q, true\nCompare xmm_nan, xmm_four, ORD_Q, false\nCompare xmm_four, xmm_nan, ORD_Q, false\nCompare xmm_nan, xmm_nan, ORD_Q, false\n\nCompare xmm_four, xmm_neg_four, EQ_UQ, false\nCompare xmm_four, xmm_four, EQ_UQ, true\nCompare xmm_zero, xmm_neg_zero, EQ_UQ, true\nCompare xmm_zero, xmm_zero, EQ_UQ, true\nCompare xmm_four, xmm_nan, EQ_UQ, true\nCompare xmm_nan, xmm_four, EQ_UQ, true\nCompare xmm_nan, xmm_nan, EQ_UQ, true\n\nCompare xmm_four, xmm_neg_four, NGE_US, false\nCompare xmm_neg_four, xmm_four, NGE_US, true\nCompare xmm_zero, xmm_neg_zero, NGE_US, false\nCompare xmm_neg_zero, xmm_zero, NGE_US, false\nCompare xmm_nan, xmm_four, NGE_US, true\nCompare xmm_four, xmm_nan, NGE_US, true\nCompare xmm_nan, xmm_nan, NGE_US, true\n\nCompare xmm_four, xmm_neg_four, NGT_US, false\nCompare xmm_neg_four, xmm_four, NGT_US, true\nCompare xmm_zero, xmm_neg_zero, NGT_US, true\nCompare xmm_neg_zero, xmm_zero, NGT_US, true\nCompare xmm_nan, xmm_four, NGT_US, true\nCompare xmm_four, xmm_nan, NGT_US, true\nCompare xmm_nan, xmm_nan, NGT_US, true\n\nCompare xmm_four, xmm_neg_four, FALSE_OQ, false\nCompare xmm_neg_four, xmm_four, FALSE_OQ, false\nCompare xmm_zero, xmm_neg_zero, FALSE_OQ, false\nCompare xmm_neg_zero, xmm_zero, FALSE_OQ, false\nCompare xmm_nan, xmm_four, FALSE_OQ, false\nCompare xmm_four, xmm_nan, FALSE_OQ, false\nCompare xmm_nan, xmm_nan, FALSE_OQ, false\n\nCompare xmm_four, xmm_neg_four, NEQ_OQ, true\nCompare xmm_four, xmm_four, NEQ_OQ, false\nCompare xmm_zero, xmm_neg_zero, NEQ_OQ, false\nCompare xmm_zero, xmm_zero, NEQ_OQ, false\nCompare xmm_four, xmm_nan, NEQ_OQ, false\nCompare xmm_nan, xmm_four, NEQ_OQ, false\nCompare xmm_nan, xmm_nan, NEQ_OQ, false\n\nCompare xmm_four, xmm_neg_four, GE_OS, true\nCompare xmm_neg_four, xmm_four, GE_OS, false\nCompare xmm_zero, xmm_neg_zero, GE_OS, true\nCompare xmm_neg_zero, xmm_zero, GE_OS, true\nCompare xmm_nan, xmm_four, GE_OS, false\nCompare xmm_four, xmm_nan, GE_OS, false\nCompare xmm_nan, xmm_nan, GE_OS, false\n\nCompare xmm_four, xmm_neg_four, GT_OS, true\nCompare xmm_neg_four, xmm_four, GT_OS, false\nCompare xmm_zero, xmm_neg_zero, GT_OS, false\nCompare xmm_neg_zero, xmm_zero, GT_OS, false\nCompare xmm_nan, xmm_four, GT_OS, false\nCompare xmm_four, xmm_nan, GT_OS, false\nCompare xmm_nan, xmm_nan, GT_OS, false\n\nCompare xmm_four, xmm_neg_four, TRUE_UQ, true\nCompare xmm_neg_four, xmm_four, TRUE_UQ, true\nCompare xmm_zero, xmm_neg_zero, TRUE_UQ, true\nCompare xmm_neg_zero, xmm_zero, TRUE_UQ, true\nCompare xmm_nan, xmm_four, TRUE_UQ, true\nCompare xmm_four, xmm_nan, TRUE_UQ, true\nCompare xmm_nan, xmm_nan, TRUE_UQ, true\n\nCompare xmm_four, xmm_neg_four, EQ_OS, false\nCompare xmm_neg_four, xmm_four, EQ_OS, false\nCompare xmm_zero, xmm_neg_zero, EQ_OS, true\nCompare xmm_neg_zero, xmm_zero, EQ_OS, true\nCompare xmm_nan, xmm_four, EQ_OS, false\nCompare xmm_four, xmm_nan, EQ_OS, false\nCompare xmm_nan, xmm_nan, EQ_OS, false\n\nCompare xmm_four, xmm_neg_four, LT_OQ, false\nCompare xmm_neg_four, xmm_four, LT_OQ, true\nCompare xmm_zero, xmm_neg_zero, LT_OQ, false\nCompare xmm_neg_zero, xmm_zero, LT_OQ, false\nCompare xmm_nan, xmm_four, LT_OQ, false\nCompare xmm_four, xmm_nan, LT_OQ, false\nCompare xmm_nan, xmm_nan, LT_OQ, false\n\nCompare xmm_four, xmm_neg_four, LE_OQ, false\nCompare xmm_neg_four, xmm_four, LE_OQ, true\nCompare xmm_zero, xmm_neg_zero, LE_OQ, true\nCompare xmm_neg_zero, xmm_zero, LE_OQ, true\nCompare xmm_nan, xmm_four, LE_OQ, false\nCompare xmm_four, xmm_nan, LE_OQ, false\nCompare xmm_nan, xmm_nan, LE_OQ, false\n\nCompare xmm_four, xmm_neg_four, UNORD_S, false\nCompare xmm_neg_four, xmm_four, UNORD_S, false\nCompare xmm_zero, xmm_neg_zero, UNORD_S, false\nCompare xmm_neg_zero, xmm_zero, UNORD_S, false\nCompare xmm_nan, xmm_four, UNORD_S, true\nCompare xmm_four, xmm_nan, UNORD_S, true\nCompare xmm_nan, xmm_nan, UNORD_S, true\n\nCompare xmm_four, xmm_neg_four, NEQ_US, true\nCompare xmm_neg_four, xmm_four, NEQ_US, true\nCompare xmm_zero, xmm_neg_zero, NEQ_US, false\nCompare xmm_neg_zero, xmm_zero, NEQ_US, false\nCompare xmm_nan, xmm_four, NEQ_US, true\nCompare xmm_four, xmm_nan, NEQ_US, true\nCompare xmm_nan, xmm_nan, NEQ_US, true\n\nCompare xmm_four, xmm_neg_four, NLT_UQ, true\nCompare xmm_neg_four, xmm_four, NLT_UQ, false\nCompare xmm_zero, xmm_neg_zero, NLT_UQ, true\nCompare xmm_neg_zero, xmm_zero, NLT_UQ, true\nCompare xmm_nan, xmm_four, NLT_UQ, true\nCompare xmm_four, xmm_nan, NLT_UQ, true\nCompare xmm_nan, xmm_nan, NLT_UQ, true\n\nCompare xmm_four, xmm_neg_four, NLE_UQ, true\nCompare xmm_neg_four, xmm_four, NLE_UQ, false\nCompare xmm_zero, xmm_neg_zero, NLE_UQ, false\nCompare xmm_neg_zero, xmm_zero, NLE_UQ, false\nCompare xmm_nan, xmm_four, NLE_UQ, true\nCompare xmm_four, xmm_nan, NLE_UQ, true\nCompare xmm_nan, xmm_nan, NLE_UQ, true\n\nCompare xmm_four, xmm_neg_four, ORD_S, true\nCompare xmm_neg_four, xmm_four, ORD_S, true\nCompare xmm_zero, xmm_neg_zero, ORD_S, true\nCompare xmm_neg_zero, xmm_zero, ORD_S, true\nCompare xmm_nan, xmm_four, ORD_S, false\nCompare xmm_four, xmm_nan, ORD_S, false\nCompare xmm_nan, xmm_nan, ORD_S, false\n\nCompare xmm_four, xmm_neg_four, EQ_US, false\nCompare xmm_four, xmm_four, EQ_US, true\nCompare xmm_zero, xmm_neg_zero, EQ_US, true\nCompare xmm_zero, xmm_zero, EQ_US, true\nCompare xmm_four, xmm_nan, EQ_US, true\nCompare xmm_nan, xmm_four, EQ_US, true\nCompare xmm_nan, xmm_nan, EQ_US, true\n\nCompare xmm_four, xmm_neg_four, NGE_UQ, false\nCompare xmm_neg_four, xmm_four, NGE_UQ, true\nCompare xmm_zero, xmm_neg_zero, NGE_UQ, false\nCompare xmm_neg_zero, xmm_zero, NGE_UQ, false\nCompare xmm_nan, xmm_four, NGE_UQ, true\nCompare xmm_four, xmm_nan, NGE_UQ, true\nCompare xmm_nan, xmm_nan, NGE_UQ, true\n\nCompare xmm_four, xmm_neg_four, NGT_UQ, false\nCompare xmm_neg_four, xmm_four, NGT_UQ, true\nCompare xmm_zero, xmm_neg_zero, NGT_UQ, true\nCompare xmm_neg_zero, xmm_zero, NGT_UQ, true\nCompare xmm_nan, xmm_four, NGT_UQ, true\nCompare xmm_four, xmm_nan, NGT_UQ, true\nCompare xmm_nan, xmm_nan, NGT_UQ, true\n\nCompare xmm_four, xmm_neg_four, FALSE_OS, false\nCompare xmm_neg_four, xmm_four, FALSE_OS, false\nCompare xmm_zero, xmm_neg_zero, FALSE_OS, false\nCompare xmm_neg_zero, xmm_zero, FALSE_OS, false\nCompare xmm_nan, xmm_four, FALSE_OS, false\nCompare xmm_four, xmm_nan, FALSE_OS, false\nCompare xmm_nan, xmm_nan, FALSE_OS, false\n\nCompare xmm_four, xmm_neg_four, NEQ_OS, true\nCompare xmm_four, xmm_four, NEQ_OS, false\nCompare xmm_zero, xmm_neg_zero, NEQ_OS, false\nCompare xmm_zero, xmm_zero, NEQ_OS, false\nCompare xmm_four, xmm_nan, NEQ_OS, false\nCompare xmm_nan, xmm_four, NEQ_OS, false\nCompare xmm_nan, xmm_nan, NEQ_OS, false\n\nCompare xmm_four, xmm_neg_four, GE_OQ, true\nCompare xmm_neg_four, xmm_four, GE_OQ, false\nCompare xmm_zero, xmm_neg_zero, GE_OQ, true\nCompare xmm_neg_zero, xmm_zero, GE_OQ, true\nCompare xmm_nan, xmm_four, GE_OQ, false\nCompare xmm_four, xmm_nan, GE_OQ, false\nCompare xmm_nan, xmm_nan, GE_OQ, false\n\nCompare xmm_four, xmm_neg_four, GT_OQ, true\nCompare xmm_neg_four, xmm_four, GT_OQ, false\nCompare xmm_zero, xmm_neg_zero, GT_OQ, false\nCompare xmm_neg_zero, xmm_zero, GT_OQ, false\nCompare xmm_nan, xmm_four, GT_OQ, false\nCompare xmm_four, xmm_nan, GT_OQ, false\nCompare xmm_nan, xmm_nan, GT_OQ, false\n\nCompare xmm_four, xmm_neg_four, TRUE_US, true\nCompare xmm_neg_four, xmm_four, TRUE_US, true\nCompare xmm_zero, xmm_neg_zero, TRUE_US, true\nCompare xmm_neg_zero, xmm_zero, TRUE_US, true\nCompare xmm_nan, xmm_four, TRUE_US, true\nCompare xmm_four, xmm_nan, TRUE_US, true\nCompare xmm_nan, xmm_nan, TRUE_US, true\n\n; If ecx is not correct we can use the counter to determine which test failed\n.fail:\nhlt\n\nalign 32\n.data:\ndq -4.0\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\n\ndq -0.0\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\n\ndq 0.0\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\n\ndq 4.0\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\n\n.nan:\ndq 0x7FF8000000000000\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\n\n.false:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.true:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000"
  },
  {
    "path": "unittests/ASM/VEX/vcmpss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0x51525354FFFFFFFF\", \"0x5152535440000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x5152535400000000\", \"0x5152535440000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x51525354FFFFFFFF\", \"0x5152535440000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x5152535400000000\", \"0x5152535440000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x51525354FFFFFFFF\", \"0x5152535440000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x5152535400000000\", \"0x5152535440000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x0000000000000000\", \"0x7FC000007FC00000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x00000000FFFFFFFF\", \"0x7FC000007FC00000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\nvcmpss xmm2, xmm0, xmm1, 0x00 ; EQ\nvcmpss xmm3, xmm0, xmm1, 0x01 ; LT\nvcmpss xmm4, xmm0, xmm1, 0x02 ; LTE\nvcmpss xmm5, xmm0, xmm1, 0x04 ; NEQ\nvcmpss xmm6, xmm0, xmm1, 0x05 ; NLT\nvcmpss xmm7, xmm0, xmm1, 0x06 ; NLTE\n\n; Unordered and Ordered tests need to be special cased\nvmovapd ymm8, [rdx + 32 * 2]\nvmovapd ymm9, [rdx + 32 * 3]\n\n; Unordered will return true when either input is nan\n; [0.0, 0.0, nan, nan] unord [0.0, nan, 0.0, nan] = [0, 1, 1, 1]\nvcmpss xmm10, xmm8, xmm9, 0x03 ; Unordered\n\n; Ordered will return true when both inputs are NOT nan\n; [0.0, 0.0, nan, nan] ord [0.0, nan, 0.0, nan] = [1, 0, 0, 0]\nvcmpss xmm11, xmm8, xmm9, 0x07 ; Ordered\n\nhlt\n\nalign 32\n.data:\ndq 0x515253543F800000\ndq 0x5152535440000000\ndq 0x515253543F800000\ndq 0x5152535440000000\n\ndq 0x515253543F800000\ndq 0x5152535440800000\ndq 0x515253543F800000\ndq 0x5152535440800000\n\ndq 0x0000000000000000\ndq 0x7FC000007FC00000\ndq 0x0000000000000000\ndq 0x7FC000007FC00000\n\ndq 0x7FC0000000000000\ndq 0x7FC0000000000000\ndq 0x7FC0000000000000\ndq 0x7FC0000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vcmpss_full.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RCX\": \"224\"\n  }\n}\n%endif\n\n%define true 1\n%define false 0\n\n%define EQ_OQ 0\n%define LT_OS 1\n%define LE_OS 2\n%define UNORD_Q 3\n%define NEQ_UQ 4\n%define NLT_US 5\n%define NLE_US 6\n%define ORD_Q 7\n%define EQ_UQ 8\n%define NGE_US 9\n%define NGT_US 10\n%define FALSE_OQ 11\n%define NEQ_OQ 12\n%define GE_OS 13\n%define GT_OS 14\n%define TRUE_UQ 15\n%define EQ_OS 16\n%define LT_OQ 17\n%define LE_OQ 18\n%define UNORD_S 19\n%define NEQ_US 20\n%define NLT_UQ 21\n%define NLE_UQ 22\n%define ORD_S 23\n%define EQ_US 24\n%define NGE_UQ 25\n%define NGT_UQ 26\n%define FALSE_OS 27\n%define NEQ_OS 28\n%define GE_OQ 29\n%define GT_OQ 30\n%define TRUE_US 31\n\n; Arguments: src1, src2, predicate, true/false\n%macro Compare 4\n    vcmpss xmm7, %1, %2, %3\n    ; Construct expected result\n    ; Move truthy/falsey value to the first element based on %4\n    ; and [127:32] from src1\n    vmovdqa xmm8, [rel .false + 32 * %4]\n    vmovss xmm5, %1, xmm8\n    ; Compare if result and expected are equal\n    vxorps ymm6, ymm7, ymm5\n    vptest ymm6, ymm6\n    jnz .fail\n    ; Increment counter of tests passed\n    add ecx, 1\n%endmacro\n\nlea rax, [rel .data]\nxor ecx, ecx\n\nvmovdqa ymm0, [rax + 32 * 0] ; -4.0\nvmovdqa ymm1, [rax + 32 * 1] ; -0.0\nvmovdqa ymm2, [rax + 32 * 2] ; 0.0\nvmovdqa ymm3, [rax + 32 * 3] ; 4.0\nvmovdqa ymm4, [rel .nan]     ; NaN\n\n%define xmm_neg_four xmm0\n%define xmm_neg_zero xmm1\n%define xmm_zero xmm2\n%define xmm_four xmm3\n%define xmm_nan xmm4\n\nCompare xmm_four, xmm_four, EQ_OQ, true\nCompare xmm_neg_four, xmm_four, EQ_OQ, false\nCompare xmm_zero, xmm_neg_zero, EQ_OQ, true\nCompare xmm_zero, xmm_zero, EQ_OQ, true\nCompare xmm_four, xmm_nan, EQ_OQ, false\nCompare xmm_nan, xmm_four, EQ_OQ, false\nCompare xmm_nan, xmm_nan, EQ_OQ, false\n\nCompare xmm_four, xmm_neg_four, LT_OS, false\nCompare xmm_neg_four, xmm_four, LT_OS, true\nCompare xmm_zero, xmm_neg_zero, LT_OS, false\nCompare xmm_neg_zero, xmm_zero, LT_OS, false\nCompare xmm_nan, xmm_four, LT_OS, false\nCompare xmm_four, xmm_nan, LT_OS, false\nCompare xmm_nan, xmm_nan, LT_OS, false\n\nCompare xmm_four, xmm_neg_four, LE_OS, false\nCompare xmm_neg_four, xmm_four, LE_OS, true\nCompare xmm_zero, xmm_neg_zero, LE_OS, true\nCompare xmm_neg_zero, xmm_zero, LE_OS, true\nCompare xmm_nan, xmm_four, LE_OS, false\nCompare xmm_four, xmm_nan, LE_OS, false\nCompare xmm_nan, xmm_nan, LE_OS, false\n\nCompare xmm_four, xmm_neg_four, UNORD_Q, false\nCompare xmm_neg_four, xmm_four, UNORD_Q, false\nCompare xmm_zero, xmm_neg_zero, UNORD_Q, false\nCompare xmm_neg_zero, xmm_zero, UNORD_Q, false\nCompare xmm_nan, xmm_four, UNORD_Q, true\nCompare xmm_four, xmm_nan, UNORD_Q, true\nCompare xmm_nan, xmm_nan, UNORD_Q, true\n\nCompare xmm_four, xmm_four, NEQ_UQ, false\nCompare xmm_four, xmm_neg_four, NEQ_UQ, true\nCompare xmm_zero, xmm_neg_zero, NEQ_UQ, false\nCompare xmm_zero, xmm_zero, NEQ_UQ, false\nCompare xmm_four, xmm_nan, NEQ_UQ, true\nCompare xmm_nan, xmm_four, NEQ_UQ, true\nCompare xmm_nan, xmm_nan, NEQ_UQ, true\n\nCompare xmm_four, xmm_neg_four, NLT_US, true\nCompare xmm_neg_four, xmm_four, NLT_US, false\nCompare xmm_zero, xmm_neg_zero, NLT_US, true\nCompare xmm_neg_zero, xmm_zero, NLT_US, true\nCompare xmm_nan, xmm_four, NLT_US, true\nCompare xmm_four, xmm_nan, NLT_US, true\nCompare xmm_nan, xmm_nan, NLT_US, true\n\nCompare xmm_four, xmm_neg_four, NLE_US, true\nCompare xmm_neg_four, xmm_four, NLE_US, false\nCompare xmm_zero, xmm_neg_zero, NLE_US, false\nCompare xmm_neg_zero, xmm_zero, NLE_US, false\nCompare xmm_nan, xmm_four, NLE_US, true\nCompare xmm_four, xmm_nan, NLE_US, true\nCompare xmm_nan, xmm_nan, NLE_US, true\n\nCompare xmm_four, xmm_neg_four, ORD_Q, true\nCompare xmm_neg_four, xmm_four, ORD_Q, true\nCompare xmm_zero, xmm_neg_zero, ORD_Q, true\nCompare xmm_neg_zero, xmm_zero, ORD_Q, true\nCompare xmm_nan, xmm_four, ORD_Q, false\nCompare xmm_four, xmm_nan, ORD_Q, false\nCompare xmm_nan, xmm_nan, ORD_Q, false\n\nCompare xmm_four, xmm_neg_four, EQ_UQ, false\nCompare xmm_four, xmm_four, EQ_UQ, true\nCompare xmm_zero, xmm_neg_zero, EQ_UQ, true\nCompare xmm_zero, xmm_zero, EQ_UQ, true\nCompare xmm_four, xmm_nan, EQ_UQ, true\nCompare xmm_nan, xmm_four, EQ_UQ, true\nCompare xmm_nan, xmm_nan, EQ_UQ, true\n\nCompare xmm_four, xmm_neg_four, NGE_US, false\nCompare xmm_neg_four, xmm_four, NGE_US, true\nCompare xmm_zero, xmm_neg_zero, NGE_US, false\nCompare xmm_neg_zero, xmm_zero, NGE_US, false\nCompare xmm_nan, xmm_four, NGE_US, true\nCompare xmm_four, xmm_nan, NGE_US, true\nCompare xmm_nan, xmm_nan, NGE_US, true\n\nCompare xmm_four, xmm_neg_four, NGT_US, false\nCompare xmm_neg_four, xmm_four, NGT_US, true\nCompare xmm_zero, xmm_neg_zero, NGT_US, true\nCompare xmm_neg_zero, xmm_zero, NGT_US, true\nCompare xmm_nan, xmm_four, NGT_US, true\nCompare xmm_four, xmm_nan, NGT_US, true\nCompare xmm_nan, xmm_nan, NGT_US, true\n\nCompare xmm_four, xmm_neg_four, FALSE_OQ, false\nCompare xmm_neg_four, xmm_four, FALSE_OQ, false\nCompare xmm_zero, xmm_neg_zero, FALSE_OQ, false\nCompare xmm_neg_zero, xmm_zero, FALSE_OQ, false\nCompare xmm_nan, xmm_four, FALSE_OQ, false\nCompare xmm_four, xmm_nan, FALSE_OQ, false\nCompare xmm_nan, xmm_nan, FALSE_OQ, false\n\nCompare xmm_four, xmm_neg_four, NEQ_OQ, true\nCompare xmm_four, xmm_four, NEQ_OQ, false\nCompare xmm_zero, xmm_neg_zero, NEQ_OQ, false\nCompare xmm_zero, xmm_zero, NEQ_OQ, false\nCompare xmm_four, xmm_nan, NEQ_OQ, false\nCompare xmm_nan, xmm_four, NEQ_OQ, false\nCompare xmm_nan, xmm_nan, NEQ_OQ, false\n\nCompare xmm_four, xmm_neg_four, GE_OS, true\nCompare xmm_neg_four, xmm_four, GE_OS, false\nCompare xmm_zero, xmm_neg_zero, GE_OS, true\nCompare xmm_neg_zero, xmm_zero, GE_OS, true\nCompare xmm_nan, xmm_four, GE_OS, false\nCompare xmm_four, xmm_nan, GE_OS, false\nCompare xmm_nan, xmm_nan, GE_OS, false\n\nCompare xmm_four, xmm_neg_four, GT_OS, true\nCompare xmm_neg_four, xmm_four, GT_OS, false\nCompare xmm_zero, xmm_neg_zero, GT_OS, false\nCompare xmm_neg_zero, xmm_zero, GT_OS, false\nCompare xmm_nan, xmm_four, GT_OS, false\nCompare xmm_four, xmm_nan, GT_OS, false\nCompare xmm_nan, xmm_nan, GT_OS, false\n\nCompare xmm_four, xmm_neg_four, TRUE_UQ, true\nCompare xmm_neg_four, xmm_four, TRUE_UQ, true\nCompare xmm_zero, xmm_neg_zero, TRUE_UQ, true\nCompare xmm_neg_zero, xmm_zero, TRUE_UQ, true\nCompare xmm_nan, xmm_four, TRUE_UQ, true\nCompare xmm_four, xmm_nan, TRUE_UQ, true\nCompare xmm_nan, xmm_nan, TRUE_UQ, true\n\nCompare xmm_four, xmm_neg_four, EQ_OS, false\nCompare xmm_neg_four, xmm_four, EQ_OS, false\nCompare xmm_zero, xmm_neg_zero, EQ_OS, true\nCompare xmm_neg_zero, xmm_zero, EQ_OS, true\nCompare xmm_nan, xmm_four, EQ_OS, false\nCompare xmm_four, xmm_nan, EQ_OS, false\nCompare xmm_nan, xmm_nan, EQ_OS, false\n\nCompare xmm_four, xmm_neg_four, LT_OQ, false\nCompare xmm_neg_four, xmm_four, LT_OQ, true\nCompare xmm_zero, xmm_neg_zero, LT_OQ, false\nCompare xmm_neg_zero, xmm_zero, LT_OQ, false\nCompare xmm_nan, xmm_four, LT_OQ, false\nCompare xmm_four, xmm_nan, LT_OQ, false\nCompare xmm_nan, xmm_nan, LT_OQ, false\n\nCompare xmm_four, xmm_neg_four, LE_OQ, false\nCompare xmm_neg_four, xmm_four, LE_OQ, true\nCompare xmm_zero, xmm_neg_zero, LE_OQ, true\nCompare xmm_neg_zero, xmm_zero, LE_OQ, true\nCompare xmm_nan, xmm_four, LE_OQ, false\nCompare xmm_four, xmm_nan, LE_OQ, false\nCompare xmm_nan, xmm_nan, LE_OQ, false\n\nCompare xmm_four, xmm_neg_four, UNORD_S, false\nCompare xmm_neg_four, xmm_four, UNORD_S, false\nCompare xmm_zero, xmm_neg_zero, UNORD_S, false\nCompare xmm_neg_zero, xmm_zero, UNORD_S, false\nCompare xmm_nan, xmm_four, UNORD_S, true\nCompare xmm_four, xmm_nan, UNORD_S, true\nCompare xmm_nan, xmm_nan, UNORD_S, true\n\nCompare xmm_four, xmm_neg_four, NEQ_US, true\nCompare xmm_neg_four, xmm_four, NEQ_US, true\nCompare xmm_zero, xmm_neg_zero, NEQ_US, false\nCompare xmm_neg_zero, xmm_zero, NEQ_US, false\nCompare xmm_nan, xmm_four, NEQ_US, true\nCompare xmm_four, xmm_nan, NEQ_US, true\nCompare xmm_nan, xmm_nan, NEQ_US, true\n\nCompare xmm_four, xmm_neg_four, NLT_UQ, true\nCompare xmm_neg_four, xmm_four, NLT_UQ, false\nCompare xmm_zero, xmm_neg_zero, NLT_UQ, true\nCompare xmm_neg_zero, xmm_zero, NLT_UQ, true\nCompare xmm_nan, xmm_four, NLT_UQ, true\nCompare xmm_four, xmm_nan, NLT_UQ, true\nCompare xmm_nan, xmm_nan, NLT_UQ, true\n\nCompare xmm_four, xmm_neg_four, NLE_UQ, true\nCompare xmm_neg_four, xmm_four, NLE_UQ, false\nCompare xmm_zero, xmm_neg_zero, NLE_UQ, false\nCompare xmm_neg_zero, xmm_zero, NLE_UQ, false\nCompare xmm_nan, xmm_four, NLE_UQ, true\nCompare xmm_four, xmm_nan, NLE_UQ, true\nCompare xmm_nan, xmm_nan, NLE_UQ, true\n\nCompare xmm_four, xmm_neg_four, ORD_S, true\nCompare xmm_neg_four, xmm_four, ORD_S, true\nCompare xmm_zero, xmm_neg_zero, ORD_S, true\nCompare xmm_neg_zero, xmm_zero, ORD_S, true\nCompare xmm_nan, xmm_four, ORD_S, false\nCompare xmm_four, xmm_nan, ORD_S, false\nCompare xmm_nan, xmm_nan, ORD_S, false\n\nCompare xmm_four, xmm_neg_four, EQ_US, false\nCompare xmm_four, xmm_four, EQ_US, true\nCompare xmm_zero, xmm_neg_zero, EQ_US, true\nCompare xmm_zero, xmm_zero, EQ_US, true\nCompare xmm_four, xmm_nan, EQ_US, true\nCompare xmm_nan, xmm_four, EQ_US, true\nCompare xmm_nan, xmm_nan, EQ_US, true\n\nCompare xmm_four, xmm_neg_four, NGE_UQ, false\nCompare xmm_neg_four, xmm_four, NGE_UQ, true\nCompare xmm_zero, xmm_neg_zero, NGE_UQ, false\nCompare xmm_neg_zero, xmm_zero, NGE_UQ, false\nCompare xmm_nan, xmm_four, NGE_UQ, true\nCompare xmm_four, xmm_nan, NGE_UQ, true\nCompare xmm_nan, xmm_nan, NGE_UQ, true\n\nCompare xmm_four, xmm_neg_four, NGT_UQ, false\nCompare xmm_neg_four, xmm_four, NGT_UQ, true\nCompare xmm_zero, xmm_neg_zero, NGT_UQ, true\nCompare xmm_neg_zero, xmm_zero, NGT_UQ, true\nCompare xmm_nan, xmm_four, NGT_UQ, true\nCompare xmm_four, xmm_nan, NGT_UQ, true\nCompare xmm_nan, xmm_nan, NGT_UQ, true\n\nCompare xmm_four, xmm_neg_four, FALSE_OS, false\nCompare xmm_neg_four, xmm_four, FALSE_OS, false\nCompare xmm_zero, xmm_neg_zero, FALSE_OS, false\nCompare xmm_neg_zero, xmm_zero, FALSE_OS, false\nCompare xmm_nan, xmm_four, FALSE_OS, false\nCompare xmm_four, xmm_nan, FALSE_OS, false\nCompare xmm_nan, xmm_nan, FALSE_OS, false\n\nCompare xmm_four, xmm_neg_four, NEQ_OS, true\nCompare xmm_four, xmm_four, NEQ_OS, false\nCompare xmm_zero, xmm_neg_zero, NEQ_OS, false\nCompare xmm_zero, xmm_zero, NEQ_OS, false\nCompare xmm_four, xmm_nan, NEQ_OS, false\nCompare xmm_nan, xmm_four, NEQ_OS, false\nCompare xmm_nan, xmm_nan, NEQ_OS, false\n\nCompare xmm_four, xmm_neg_four, GE_OQ, true\nCompare xmm_neg_four, xmm_four, GE_OQ, false\nCompare xmm_zero, xmm_neg_zero, GE_OQ, true\nCompare xmm_neg_zero, xmm_zero, GE_OQ, true\nCompare xmm_nan, xmm_four, GE_OQ, false\nCompare xmm_four, xmm_nan, GE_OQ, false\nCompare xmm_nan, xmm_nan, GE_OQ, false\n\nCompare xmm_four, xmm_neg_four, GT_OQ, true\nCompare xmm_neg_four, xmm_four, GT_OQ, false\nCompare xmm_zero, xmm_neg_zero, GT_OQ, false\nCompare xmm_neg_zero, xmm_zero, GT_OQ, false\nCompare xmm_nan, xmm_four, GT_OQ, false\nCompare xmm_four, xmm_nan, GT_OQ, false\nCompare xmm_nan, xmm_nan, GT_OQ, false\n\nCompare xmm_four, xmm_neg_four, TRUE_US, true\nCompare xmm_neg_four, xmm_four, TRUE_US, true\nCompare xmm_zero, xmm_neg_zero, TRUE_US, true\nCompare xmm_neg_zero, xmm_zero, TRUE_US, true\nCompare xmm_nan, xmm_four, TRUE_US, true\nCompare xmm_four, xmm_nan, TRUE_US, true\nCompare xmm_nan, xmm_nan, TRUE_US, true\n\n; If ecx is not correct we can use the counter to determine which test failed\n.fail:\nhlt\n\nalign 32\n.data:\ndd -4.0\ndd 0xCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\n\ndd -0.0\ndd 0xCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\n\ndd 0.0\ndd 0xCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\n\ndd 4.0\ndd 0xCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\n\n.nan:\ndq 0xCCCCCCCC7FC00000\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xCCCCCCCCCCCCCCCC\n\n.false:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.true:\ndq 0x00000000FFFFFFFF\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000"
  },
  {
    "path": "unittests/ASM/VEX/vcomisd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x4700\",\n    \"RBX\": \"0x0300\"\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps xmm0, [rdx + 16 * 0]\nvcomisd xmm0, [rdx + 16 * 1] ; 1.0 <comp> 4.0\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000 <- 0\n; ================\n;         00000111\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nmov rbx, rax\n\nvcomisd xmm0, [rdx + 16 * 2] ; 1.0 <comp> NaN\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 01000000\n; 7: SF - 00000000 <- 0\n; ================\n;         01000111\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n\nalign 16\n.data:\ndq 0x3FF0000000000000\ndq 0x4000000000000000\n\ndq 0x4010000000000000\ndq 0x4010000000000000\n\ndq 0x7FF8000000000000\ndq 0x4010000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vcomiss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x4700\",\n    \"RBX\": \"0x0300\"\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps xmm0, [rdx + 16 * 0]\nvcomiss xmm0, [rdx + 16 * 1]\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000 <- 0\n; ================\n;         00000011\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nmov rbx, rax\n\nvcomiss xmm0, [rdx + 16 * 2]\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 01000000\n; 7: SF - 00000000 <- 0\n; ================\n;         01000111\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n\nalign 16\n.data:\ndq 0x515253543F800000\ndq 0x5152535440000000\n\ndq 0x5152535440800000\ndq 0x5152535440800000\n\ndq 0x515253547FC00000\ndq 0x5152535440800000\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtdq2pd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x3FF0000000000000\", \"0x4000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x4008000000000000\", \"0x4010000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x3FF0000000000000\", \"0x4000000000000000\", \"0x4008000000000000\", \"0x4010000000000000\"],\n    \"XMM3\":  [\"0x4008000000000000\", \"0x4010000000000000\", \"0x3FF0000000000000\", \"0x4000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm2, [rdx + 32]\n\nvcvtdq2pd xmm0, xmm2\nvcvtdq2pd xmm1, [rdx + 40]\n\nvcvtdq2pd ymm2, xmm2\nvcvtdq2pd ymm3, [rdx + 40]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x0000000200000001\ndq 0x0000000400000003\ndq 0x0000000200000001\ndq 0x0000000400000003\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtdq2ps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xBF8000003F800000\", \"0x437F000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0xBF8000003F800000\", \"0x437F000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0xBF8000003F800000\", \"0x437F000000000000\", \"0xBF8000003F800000\", \"0x437F000000000000\"],\n    \"XMM4\": [\"0xBF8000003F800000\", \"0x437F000000000000\", \"0xBF8000003F800000\", \"0x437F000000000000\"],\n    \"XMM6\": [\"0x4E8000004E7E0000\", \"0x4E8100004E808000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x4E8000004E7E0000\", \"0x4E8100004E808000\", \"0x4E8000004E7E0000\", \"0x4E8100004E808000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm1, [rdx + 32]\nvmovapd ymm5, [rdx]\n\nvcvtdq2ps xmm2, [rdx + 32]\nvcvtdq2ps ymm3, [rdx + 32]\nvcvtdq2ps xmm6, [rdx]\nvcvtdq2ps ymm7, [rdx]\n\nvcvtdq2ps xmm0, xmm1\nvcvtdq2ps ymm4, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x400000003F800000 ; 2, 1\ndq 0x4080000040400000 ; 4, 3\ndq 0x400000003F800000 ; 2, 1\ndq 0x4080000040400000 ; 4, 3\n\ndq 0xFFFFFFFF00000001 ; -1, 1\ndq 0x000000FF00000000 ; 255, 0\ndq 0xFFFFFFFF00000001 ; -1, 1\ndq 0x000000FF00000000 ; 255, 0\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtpd2dq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000004600000053\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x0000000D00000029\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x0000001600000005\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x000000050000000A\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x000000430000001D\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000005B00000013\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x0000003300000028\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000001800000021\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x000000180000005B\", \"0x000000180000005B\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x0000005B00000063\", \"0x0000005B00000063\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x000000630000005B\", \"0x000000630000005B\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x0000004A00000041\", \"0x0000004A00000041\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x0000001900000023\", \"0x0000001900000023\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x0000005A00000006\", \"0x0000005A00000006\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0000003400000021\", \"0x0000003400000021\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM15\": [\"0x0000000A0000003A\", \"0x0000000A0000003A\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Preload registers with garbage\nvmovaps ymm0,  [rel .random_data + (0 * 32)]\nvmovaps ymm1,  [rel .random_data + (1 * 32)]\nvmovaps ymm2,  [rel .random_data + (2 * 32)]\nvmovaps ymm3,  [rel .random_data + (3 * 32)]\nvmovaps ymm4,  [rel .random_data + (4 * 32)]\nvmovaps ymm5,  [rel .random_data + (5 * 32)]\nvmovaps ymm6,  [rel .random_data + (6 * 32)]\nvmovaps ymm7,  [rel .random_data + (7 * 32)]\nvmovaps ymm8,  [rel .random_data + (8 * 32)]\nvmovaps ymm9,  [rel .random_data + (9 * 32)]\nvmovaps ymm10, [rel .random_data + (10 * 32)]\nvmovaps ymm11, [rel .random_data + (11 * 32)]\nvmovaps ymm12, [rel .random_data + (12 * 32)]\nvmovaps ymm13, [rel .random_data + (13 * 32)]\nvmovaps ymm14, [rel .random_data + (14 * 32)]\nvmovaps ymm15, [rel .random_data + (15 * 32)]\n\nvcvtpd2dq xmm0,  oword [rdx + 32 * 0]\nvcvtpd2dq xmm1,  oword [rdx + 32 * 1]\nvcvtpd2dq xmm2,  oword [rdx + 32 * 2]\nvcvtpd2dq xmm3,  oword [rdx + 32 * 3]\nvcvtpd2dq xmm4,  oword [rdx + 32 * 4]\nvcvtpd2dq xmm5,  oword [rdx + 32 * 5]\nvcvtpd2dq xmm6,  oword [rdx + 32 * 6]\nvcvtpd2dq xmm7,  oword [rdx + 32 * 7]\nvcvtpd2dq xmm8,  yword [rdx + 32 * 8]\nvcvtpd2dq xmm9,  yword [rdx + 32 * 9]\nvcvtpd2dq xmm10, yword [rdx + 32 * 10]\nvcvtpd2dq xmm11, yword [rdx + 32 * 11]\nvcvtpd2dq xmm12, yword [rdx + 32 * 12]\nvcvtpd2dq xmm13, yword [rdx + 32 * 13]\nvcvtpd2dq xmm14, yword [rdx + 32 * 14]\nvcvtpd2dq xmm15, yword [rdx + 32 * 15]\n\nhlt\n\nalign 32\n.data:\ndq 83.0999 , 69.50512\ndq 83.0999 , 69.50512\n\ndq 41.02678, 13.05881\ndq 41.02678, 13.05881\n\ndq 5.35242 , 21.9932\ndq 5.35242 , 21.9932\n\ndq 9.67383 , 5.32372\ndq 9.67383 , 5.32372\n\ndq 29.02872, 66.50151\ndq 29.02872, 66.50151\n\ndq 19.30764, 91.3633\ndq 19.30764, 91.3633\n\ndq 40.45086, 50.96153\ndq 40.45086, 50.96153\n\ndq 32.64489, 23.97574\ndq 32.64489, 23.97574\n\ndq 90.64316, 24.22547\ndq 90.64316, 24.22547\n\ndq 98.9394 , 91.21715\ndq 98.9394 , 91.21715\n\ndq 90.80143, 99.48407\ndq 90.80143, 99.48407\n\ndq 64.97245, 74.39838\ndq 64.97245, 74.39838\n\ndq 35.22761, 25.35321\ndq 35.22761, 25.35321\n\ndq 5.8732  , 90.19956\ndq 5.8732  , 90.19956\n\ndq 33.03133, 52.02952\ndq 33.03133, 52.02952\n\ndq 58.38554, 10.17531\ndq 58.38554, 10.17531\n\ndq 47.84703, 84.04831\ndq 47.84703, 84.04831\n\ndq 90.02965, 65.81329\ndq 90.02965, 65.81329\n\ndq 96.27991, 6.64479\ndq 96.27991, 6.64479\n\ndq 25.58971, 95.00694\ndq 25.58971, 95.00694\n\ndq 88.1929 , 37.16964\ndq 88.1929 , 37.16964\n\ndq 49.52602, 10.27223\ndq 49.52602, 10.27223\n\ndq 77.70605, 20.21439\ndq 77.70605, 20.21439\n\ndq 9.8056  , 41.29389\ndq 9.8056  , 41.29389\n\ndq 15.4071 , 57.54286\ndq 15.4071 , 57.54286\n\ndq 9.61117 , 55.54302\ndq 9.61117 , 55.54302\n\ndq 52.90745, 4.88086\ndq 52.90745, 4.88086\n\ndq 72.52882, 3.0201\ndq 72.52882, 3.0201\n\ndq 56.55091, 71.22749\ndq 56.55091, 71.22749\n\ndq 61.84736, 88.74295\ndq 61.84736, 88.74295\n\ndq 47.72641, 24.17404\ndq 47.72641, 24.17404\n\ndq 33.70564, 96.71303\ndq 33.70564, 96.71303\n\n; 4096 bytes of random data.\n.random_data:\ndb 0x5b, 0x27, 0x12, 0x29, 0xab, 0x84, 0xa2, 0x21, 0x6d, 0x27, 0xbe, 0x3d, 0x17, 0x05, 0x99, 0xb0\ndb 0xf3, 0xe2, 0x19, 0xf4, 0x42, 0xbb, 0x69, 0x02, 0x67, 0x3a, 0xab, 0x86, 0x9e, 0xda, 0x9f, 0xd5\ndb 0xba, 0xd4, 0x2d, 0x9d, 0x20, 0x3d, 0xf8, 0xb2, 0x29, 0xc3, 0xc3, 0x98, 0xa8, 0x30, 0x92, 0xe9\ndb 0x5a, 0x75, 0x0c, 0xcb, 0x28, 0x28, 0xb4, 0x90, 0x93, 0x16, 0x45, 0x10, 0x3a, 0x5d, 0x96, 0x67\ndb 0xf9, 0x31, 0xbe, 0x48, 0x78, 0xe8, 0x5a, 0xf2, 0x66, 0x29, 0xd9, 0x80, 0x50, 0x80, 0xcb, 0x07\ndb 0xfe, 0xda, 0x19, 0x0f, 0x22, 0xea, 0x18, 0x5e, 0x12, 0xea, 0x3d, 0x1a, 0xbc, 0x91, 0x51, 0x15\ndb 0xaa, 0x66, 0x92, 0x61, 0xb4, 0xd4, 0xce, 0x14, 0x9c, 0x86, 0x27, 0x3d, 0xd0, 0xc6, 0x51, 0x1c\ndb 0xa0, 0xd4, 0x0b, 0x2d, 0x25, 0x30, 0x3b, 0x46, 0x23, 0x07, 0xb5, 0x05, 0x4a, 0xaa, 0x5a, 0x0a\ndb 0x7b, 0x29, 0xe4, 0x52, 0x6f, 0x6f, 0xc8, 0x62, 0xb8, 0x94, 0x6a, 0x30, 0x66, 0xf1, 0x21, 0xec\ndb 0xd1, 0xf2, 0x68, 0xda, 0xb7, 0x7f, 0x5a, 0x26, 0x38, 0x46, 0x48, 0xda, 0x5d, 0x64, 0x8d, 0x3d\ndb 0x2f, 0xf6, 0xc3, 0x63, 0xb8, 0x09, 0x3a, 0xd0, 0x5b, 0xeb, 0x67, 0xd0, 0xaa, 0x63, 0x71, 0x19\ndb 0x7e, 0x4e, 0x33, 0xe2, 0x15, 0xba, 0x87, 0xa7, 0x7b, 0x25, 0xe4, 0xbb, 0xb5, 0x26, 0x9a, 0xf1\ndb 0xdd, 0x5a, 0x63, 0xd7, 0x16, 0xc0, 0xc3, 0xc8, 0x1b, 0xad, 0x00, 0x52, 0x63, 0x55, 0xc7, 0xe0\ndb 0xd9, 0xe9, 0xf4, 0x4c, 0x53, 0xfb, 0x73, 0x57, 0xdc, 0xad, 0x0c, 0xca, 0x73, 0x44, 0x6b, 0xf3\ndb 0xb7, 0x83, 0x3b, 0xfe, 0xf0, 0x15, 0xbf, 0xe5, 0x15, 0xca, 0xdf, 0x35, 0xeb, 0xe7, 0xe3, 0xa2\ndb 0xbd, 0x20, 0xad, 0xff, 0x1b, 0x67, 0x0a, 0x9f, 0x60, 0x60, 0xff, 0xa7, 0xc9, 0x19, 0xde, 0xb3\ndb 0x67, 0xf1, 0x4b, 0x77, 0x7f, 0x0b, 0xb1, 0x29, 0xee, 0xcb, 0xd6, 0x5d, 0x0d, 0xb9, 0x54, 0x49\ndb 0x10, 0xe3, 0xbd, 0x8a, 0xa0, 0x69, 0xa3, 0x07, 0xbe, 0x8e, 0xea, 0xc6, 0x75, 0x27, 0x66, 0xae\ndb 0x3c, 0xde, 0xc6, 0x13, 0x1b, 0x50, 0x37, 0x56, 0x7c, 0x01, 0xab, 0x8b, 0x46, 0xdc, 0x80, 0xed\ndb 0xdf, 0x12, 0x6f, 0x64, 0xdf, 0xe6, 0xf9, 0xbf, 0x15, 0x95, 0xd9, 0x80, 0x19, 0x8c, 0x96, 0x33\ndb 0x89, 0xbe, 0x25, 0x33, 0x34, 0x82, 0x92, 0x96, 0x05, 0x52, 0xa2, 0xcf, 0x5b, 0x3d, 0xfc, 0xd8\ndb 0x43, 0x89, 0x2e, 0x16, 0x6d, 0xbd, 0x84, 0x97, 0x77, 0xb5, 0xd6, 0x2b, 0x6b, 0xb1, 0xc6, 0x38\ndb 0x0a, 0xfe, 0xe1, 0xc9, 0x31, 0x32, 0x7f, 0xd5, 0xc1, 0x03, 0x4a, 0xb2, 0x86, 0x4d, 0x8d, 0x77\ndb 0xd6, 0x62, 0x52, 0x75, 0xed, 0x27, 0x21, 0xe8, 0x69, 0x6f, 0x6a, 0x5b, 0x59, 0x4d, 0xd2, 0x6c\ndb 0x2a, 0x97, 0x09, 0x03, 0xc5, 0x29, 0x0d, 0xe1, 0x31, 0x2e, 0x62, 0x21, 0x0e, 0xc2, 0x00, 0x7c\ndb 0xa2, 0x4c, 0x19, 0x63, 0x24, 0xfc, 0x9b, 0x38, 0x11, 0xbf, 0x20, 0x53, 0x53, 0xac, 0x3f, 0xdb\ndb 0xfd, 0x2b, 0x39, 0x3c, 0x39, 0x6b, 0xb4, 0x52, 0x1f, 0xf8, 0x8f, 0x3b, 0x47, 0x2b, 0x86, 0xcf\ndb 0xd2, 0x38, 0xe9, 0x08, 0x73, 0x09, 0x32, 0x5f, 0x6c, 0x3a, 0xdb, 0xfc, 0x1d, 0x91, 0xa4, 0x26\ndb 0xa3, 0x0c, 0xbc, 0x94, 0xf5, 0xbd, 0x29, 0xcf, 0x72, 0x3d, 0xee, 0x48, 0x06, 0x77, 0x63, 0x70\ndb 0x47, 0xc9, 0x87, 0x21, 0xb1, 0x9a, 0xdd, 0x5f, 0x71, 0x08, 0xe3, 0x3b, 0xf6, 0x07, 0x9f, 0x2f\ndb 0x20, 0xa3, 0x02, 0xc8, 0x4d, 0xc8, 0x18, 0xfa, 0x69, 0x32, 0x60, 0x97, 0x2d, 0x2f, 0x26, 0x84\ndb 0x3d, 0x7a, 0xf6, 0x2f, 0xb1, 0xc9, 0xd2, 0xcd, 0x6e, 0x24, 0x18, 0xa8, 0x0d, 0xb0, 0xe2, 0x41\ndb 0x1e, 0xdf, 0xc7, 0xee, 0xcd, 0x21, 0x5b, 0xc3, 0x26, 0x26, 0xb3, 0xb4, 0x33, 0x58, 0x79, 0xb5\ndb 0xc3, 0x24, 0x7c, 0xe3, 0xd7, 0x78, 0x33, 0x22, 0xd5, 0x20, 0x21, 0x86, 0xcf, 0xca, 0x44, 0xba\ndb 0xd8, 0x05, 0x84, 0x37, 0x69, 0x48, 0xb0, 0xe0, 0x7a, 0xe6, 0x74, 0x53, 0x1e, 0xd0, 0x0c, 0x3c\ndb 0x33, 0x83, 0x15, 0x43, 0x16, 0x0e, 0x93, 0x39, 0x55, 0x2e, 0x55, 0x1c, 0x09, 0xbd, 0x7a, 0xc3\ndb 0x80, 0x77, 0x4e, 0xd9, 0xf3, 0xa5, 0xee, 0x94, 0xbf, 0x8e, 0xd0, 0xec, 0x39, 0x33, 0x31, 0x8d\ndb 0x74, 0x94, 0xd2, 0x24, 0x22, 0x4a, 0xde, 0x51, 0x99, 0xc5, 0x68, 0xf2, 0x2e, 0xd3, 0x8d, 0xc5\ndb 0x32, 0x31, 0x26, 0xe7, 0x87, 0x47, 0x5f, 0xbc, 0x32, 0x80, 0x43, 0x83, 0x34, 0x36, 0xa1, 0x72\ndb 0x6b, 0x38, 0x10, 0x93, 0xa7, 0xa3, 0x92, 0xb7, 0x3c, 0x61, 0x1c, 0x4e, 0x0b, 0x86, 0x43, 0xa9\ndb 0x64, 0xf1, 0xf8, 0xd7, 0xd3, 0xf4, 0xd0, 0xe2, 0x17, 0xd4, 0xbb, 0xe9, 0x2c, 0xc8, 0x76, 0xc5\ndb 0x87, 0x7f, 0x81, 0x55, 0xbe, 0x87, 0x0e, 0x6b, 0xf6, 0x4f, 0x44, 0x37, 0x92, 0x32, 0x7f, 0x30\ndb 0xa6, 0x66, 0x09, 0x01, 0x7a, 0x6e, 0xb3, 0x3b, 0x7d, 0x8f, 0x32, 0x0e, 0x3c, 0xdc, 0xba, 0x2e\ndb 0xf8, 0xec, 0xde, 0xd9, 0xb1, 0xf0, 0x3e, 0xbd, 0x20, 0x4d, 0x01, 0x5a, 0xf4, 0xda, 0x99, 0x23\ndb 0x81, 0x01, 0x5f, 0x50, 0xce, 0xa8, 0xb9, 0xb1, 0x59, 0xe5, 0xde, 0x47, 0x5b, 0xba, 0x94, 0xd3\ndb 0x21, 0x7c, 0x49, 0xeb, 0xb5, 0x14, 0xe5, 0x56, 0x93, 0x06, 0x3b, 0xd2, 0x3a, 0x11, 0xca, 0x7a\ndb 0x14, 0x48, 0x54, 0xc7, 0x9f, 0x03, 0x40, 0x2c, 0x0b, 0x42, 0x8e, 0xac, 0xac, 0x08, 0x04, 0x8e\ndb 0xb3, 0x15, 0xe5, 0x06, 0xa6, 0x5b, 0xf0, 0x57, 0x08, 0xfa, 0x0f, 0x00, 0x7e, 0x4a, 0x16, 0xa8\ndb 0xb0, 0x4d, 0x07, 0x1b, 0xbc, 0x3d, 0xd0, 0x86, 0x15, 0xcd, 0x7c, 0xb2, 0xcc, 0x37, 0x6d, 0x15\ndb 0x8b, 0xd1, 0xe6, 0x3e, 0xfb, 0x6e, 0xe4, 0xea, 0xd9, 0x1f, 0x69, 0x2a, 0xbc, 0xda, 0xd9, 0x78\ndb 0xee, 0xcb, 0xb6, 0xff, 0x53, 0xfd, 0xd2, 0xb9, 0x18, 0x1f, 0xdf, 0x0e, 0x69, 0xfe, 0x36, 0xb0\ndb 0x77, 0x28, 0x66, 0xe2, 0xf0, 0x80, 0x4c, 0x11, 0x11, 0xba, 0xb7, 0xfd, 0x67, 0x4f, 0x05, 0xed\ndb 0x0c, 0xcc, 0x3e, 0x4d, 0xd9, 0xbc, 0x52, 0xe3, 0xec, 0xd9, 0x74, 0x29, 0x30, 0xf2, 0x66, 0xd6\ndb 0xfb, 0xc3, 0x5c, 0xc1, 0xd8, 0xef, 0x86, 0x08, 0x22, 0xb1, 0x6d, 0xfd, 0xee, 0xc7, 0x12, 0x25\ndb 0xda, 0xee, 0xd6, 0x28, 0x3b, 0x1d, 0xa7, 0x29, 0xdf, 0x45, 0x3a, 0xa4, 0x36, 0xe0, 0xa4, 0xda\ndb 0xb1, 0x2c, 0x8a, 0xa5, 0x5c, 0x8c, 0x70, 0xd8, 0xcd, 0x0f, 0xb5, 0x63, 0xd3, 0xaf, 0x59, 0x2b\ndb 0x7d, 0x86, 0x4a, 0xc4, 0xcc, 0x72, 0x9e, 0x89, 0xf4, 0x38, 0x89, 0x81, 0x64, 0x6f, 0xa5, 0xac\ndb 0x13, 0x59, 0xc4, 0x0f, 0xfb, 0xcc, 0x4c, 0x1d, 0x67, 0x5a, 0xbf, 0x19, 0xfc, 0x06, 0x71, 0xbd\ndb 0x7f, 0xb6, 0xb1, 0x95, 0xd3, 0x7b, 0x4c, 0x40, 0x91, 0xa9, 0x26, 0xdd, 0x28, 0x69, 0x90, 0xf6\ndb 0x5d, 0x16, 0x9f, 0xa9, 0x75, 0x5e, 0xad, 0x8f, 0xc8, 0x0b, 0x57, 0x48, 0xf2, 0x74, 0x77, 0x22\ndb 0x5d, 0xed, 0xc2, 0x79, 0x27, 0x46, 0x0c, 0x9e, 0x6f, 0x9a, 0x9a, 0xdc, 0xe0, 0x3d, 0x24, 0xc9\ndb 0xce, 0xf3, 0x34, 0x66, 0x45, 0x07, 0x0b, 0x83, 0x8c, 0xb7, 0xd9, 0x1e, 0xac, 0xc6, 0xf7, 0xef\ndb 0xe7, 0xd1, 0xbc, 0xa3, 0x21, 0x85, 0x3d, 0x25, 0x90, 0x24, 0x48, 0xb1, 0x00, 0xb0, 0xd2, 0xa6\ndb 0xd8, 0x4e, 0x46, 0x7c, 0xc4, 0x79, 0x40, 0x95, 0x81, 0xb4, 0xb9, 0xa8, 0x70, 0xf0, 0x12, 0xd6\ndb 0xdc, 0xb2, 0x7c, 0x0f, 0x47, 0xad, 0x7d, 0x46, 0x78, 0x18, 0x6e, 0xdd, 0x5f, 0xe5, 0xd7, 0x63\ndb 0x11, 0xf0, 0x5b, 0xa0, 0x48, 0x15, 0xe2, 0x55, 0xc6, 0x7f, 0xf4, 0x2e, 0x0e, 0x49, 0x39, 0x65\ndb 0x3e, 0x69, 0xc1, 0x27, 0x39, 0xb3, 0x10, 0x1b, 0xf2, 0x35, 0x88, 0x0c, 0x1b, 0xac, 0x4a, 0x15\ndb 0x31, 0x81, 0x63, 0xe5, 0x3d, 0x56, 0x6f, 0x34, 0x06, 0x5b, 0x1d, 0xa0, 0xea, 0x0c, 0x92, 0x6a\ndb 0x22, 0x2b, 0x2d, 0xbb, 0xaf, 0xc5, 0x6d, 0x44, 0x1b, 0xb0, 0x69, 0x06, 0x27, 0x54, 0xa5, 0x7f\ndb 0x07, 0xd4, 0xdc, 0xe5, 0x5c, 0x78, 0x9e, 0xf7, 0x4a, 0x47, 0x9b, 0x21, 0xf6, 0x87, 0x89, 0xad\ndb 0xec, 0xe4, 0xd6, 0x83, 0xd3, 0x7b, 0x34, 0x00, 0x0b, 0x75, 0xba, 0x4c, 0x0f, 0x46, 0xd2, 0x0c\ndb 0x58, 0x1b, 0x0f, 0x19, 0xb5, 0xf5, 0xba, 0x8f, 0xbd, 0x17, 0x51, 0xaf, 0xa6, 0x1a, 0x97, 0x8c\ndb 0x44, 0x30, 0x7c, 0x73, 0x50, 0xca, 0x05, 0xe8, 0x3e, 0x19, 0x4a, 0x5a, 0x6b, 0x4d, 0x01, 0x05\ndb 0xea, 0x1b, 0x70, 0xb6, 0xe6, 0x39, 0x5d, 0x99, 0x3b, 0xae, 0xed, 0x7c, 0xa6, 0xc7, 0x29, 0x6f\ndb 0xeb, 0x0a, 0xba, 0x03, 0xd3, 0xba, 0x62, 0x21, 0xa0, 0xb7, 0xb5, 0xbf, 0x40, 0xb8, 0x4e, 0xc3\ndb 0x89, 0xa0, 0xa9, 0xe8, 0xc8, 0x2b, 0xfd, 0x23, 0x32, 0x53, 0xe5, 0x35, 0xc1, 0x23, 0x97, 0xc1\ndb 0x87, 0x10, 0x41, 0x21, 0xb3, 0xf6, 0x53, 0xcf, 0x28, 0x47, 0x9c, 0x69, 0x42, 0xcf, 0x0e, 0x11\ndb 0x69, 0x7f, 0xc6, 0xdf, 0xc3, 0xbf, 0x04, 0x7f, 0x3a, 0xc6, 0xa1, 0x3d, 0xc6, 0x5b, 0x56, 0x8b\ndb 0x52, 0x23, 0x41, 0xd7, 0x35, 0x7f, 0x86, 0xd2, 0x59, 0xcf, 0xae, 0x28, 0xa3, 0xa2, 0x23, 0x4b\ndb 0x78, 0x78, 0x94, 0x3f, 0x2f, 0xf0, 0xb8, 0x94, 0xa2, 0x62, 0xb9, 0x83, 0xc7, 0x5f, 0x64, 0x45\ndb 0x54, 0xaf, 0x43, 0x93, 0x7f, 0xa1, 0xe8, 0x71, 0x38, 0xc8, 0x21, 0xf4, 0xa6, 0xab, 0x2b, 0xd3\ndb 0x44, 0xa2, 0x74, 0x94, 0x99, 0x3f, 0x56, 0xbc, 0x0a, 0x12, 0xe7, 0x6e, 0x1b, 0x7f, 0x98, 0xad\ndb 0x28, 0xa6, 0xc8, 0x87, 0x7a, 0x88, 0xcb, 0xcf, 0x9f, 0x95, 0xa7, 0xf1, 0x66, 0xfe, 0x43, 0x3d\ndb 0x71, 0x5b, 0x3a, 0xb7, 0xe4, 0xa8, 0x6f, 0x46, 0xa1, 0xaa, 0x66, 0xd2, 0x9e, 0x84, 0xfd, 0x42\ndb 0x98, 0x17, 0x3e, 0xde, 0xaa, 0x18, 0xc9, 0x9c, 0x53, 0x88, 0x2b, 0x92, 0xce, 0x00, 0x8b, 0xb4\ndb 0x15, 0x7a, 0x39, 0xb7, 0x57, 0xf9, 0xf2, 0x17, 0x0a, 0x8c, 0x05, 0x7b, 0x3f, 0x2a, 0xb0, 0xb7\ndb 0x8a, 0xbb, 0x9a, 0x0d, 0xe4, 0x0d, 0x6a, 0xbd, 0x8a, 0xe9, 0xbd, 0xca, 0xb2, 0x6a, 0xbe, 0x76\ndb 0x2c, 0xbe, 0x45, 0x3f, 0x22, 0x03, 0xb1, 0xab, 0x2d, 0xe0, 0x70, 0x52, 0xe5, 0x27, 0x8e, 0xbc\ndb 0xa9, 0x8d, 0x13, 0xf4, 0xe5, 0xd7, 0xeb, 0x4e, 0x30, 0x3f, 0x76, 0x3b, 0x64, 0xad, 0x57, 0x53\ndb 0x91, 0x89, 0xf4, 0x9a, 0xd1, 0x38, 0x3d, 0x58, 0xdc, 0x83, 0x65, 0x4a, 0x36, 0x30, 0x73, 0x92\ndb 0x8c, 0x2f, 0x7d, 0x1e, 0x15, 0x3c, 0xca, 0x54, 0x6f, 0x17, 0xbd, 0xba, 0x97, 0x7e, 0x28, 0x11\ndb 0x8e, 0x96, 0x9f, 0x46, 0x84, 0x69, 0xe3, 0xc2, 0x8e, 0x1e, 0xea, 0x6b, 0x17, 0xa7, 0xf8, 0x17\ndb 0xc3, 0xd9, 0x9c, 0x53, 0x79, 0x95, 0x32, 0xf6, 0x78, 0xcd, 0x5d, 0x2f, 0x30, 0x06, 0xe8, 0x9f\ndb 0x5e, 0xb2, 0x4e, 0x56, 0xf5, 0x31, 0xc3, 0x41, 0xae, 0x4b, 0x0a, 0xbd, 0xdc, 0xce, 0xea, 0xfa\ndb 0x27, 0x09, 0x4e, 0xd1, 0x24, 0x14, 0x33, 0x8b, 0x21, 0x48, 0x99, 0x92, 0x07, 0xa4, 0x1a, 0x87\ndb 0x34, 0x15, 0xa6, 0x12, 0x92, 0x3f, 0xf0, 0x3e, 0x18, 0x3c, 0x65, 0x3a, 0x8b, 0x17, 0x9b, 0xf2\ndb 0xd9, 0x93, 0xa0, 0x19, 0x2b, 0x73, 0x59, 0x29, 0x6f, 0xb7, 0x75, 0x4b, 0x42, 0x24, 0x43, 0xa4\ndb 0x20, 0xd8, 0x59, 0x8d, 0x9f, 0xd6, 0x64, 0xa1, 0xeb, 0xe3, 0x65, 0x82, 0x69, 0x74, 0x1a, 0x2b\ndb 0x8d, 0x9a, 0x59, 0x5d, 0x47, 0x75, 0x63, 0xcd, 0xe4, 0x14, 0x48, 0x5f, 0x67, 0x00, 0x12, 0x3c\ndb 0x58, 0x27, 0x5e, 0x83, 0xde, 0xd8, 0x97, 0xd9, 0x09, 0xd9, 0x06, 0x64, 0x96, 0x67, 0xb4, 0x4f\ndb 0xb9, 0x58, 0x87, 0xc9, 0xb1, 0xdd, 0x64, 0x8f, 0x4e, 0x8f, 0xa9, 0xfa, 0x40, 0xe6, 0x8f, 0xaa\ndb 0x22, 0x26, 0x16, 0x15, 0x6a, 0xa3, 0x88, 0xae, 0xa2, 0xbc, 0xa3, 0xa3, 0x56, 0xa1, 0x74, 0x6c\ndb 0xa2, 0xd0, 0x47, 0x4b, 0x98, 0x0a, 0xea, 0xdd, 0xe8, 0x9c, 0xe1, 0x37, 0x44, 0x1a, 0xc0, 0xc7\ndb 0x83, 0x07, 0x42, 0xca, 0x98, 0x36, 0xd7, 0x43, 0x18, 0x51, 0x32, 0xf6, 0x99, 0x61, 0x73, 0x79\ndb 0x51, 0xc4, 0xe9, 0x5b, 0x9e, 0xa8, 0xb4, 0x28, 0x49, 0xbb, 0x44, 0x90, 0xe2, 0xf7, 0x7e, 0x61\ndb 0x27, 0xbb, 0x85, 0x58, 0xd0, 0xdc, 0x94, 0x53, 0x02, 0x50, 0xfe, 0xc7, 0x37, 0xa2, 0x20, 0x1b\ndb 0x57, 0x00, 0x9b, 0x7c, 0xa4, 0x6c, 0xa6, 0xb1, 0xae, 0xd0, 0x03, 0x67, 0x2b, 0x82, 0xd9, 0x99\ndb 0x76, 0xd0, 0xc7, 0x7d, 0x2d, 0xbd, 0x39, 0x28, 0xcf, 0xe1, 0x13, 0xce, 0x1c, 0xe6, 0x4c, 0xa7\ndb 0x7a, 0x8c, 0x4f, 0xa6, 0x30, 0x77, 0x6b, 0x78, 0x39, 0x6e, 0x10, 0xd1, 0x9c, 0x9a, 0xda, 0x2d\ndb 0xc9, 0xef, 0xd7, 0xb1, 0xb8, 0xdf, 0x21, 0xce, 0x96, 0x53, 0xaa, 0xa6, 0x76, 0x52, 0x56, 0x0e\ndb 0xe6, 0x7f, 0xed, 0x88, 0x15, 0x2a, 0xc1, 0xfe, 0xb3, 0x35, 0x54, 0x09, 0x9b, 0x5d, 0x21, 0x62\ndb 0xc8, 0x6f, 0x2c, 0x6e, 0x56, 0xc8, 0xd9, 0x40, 0x67, 0xeb, 0x26, 0xf5, 0xcb, 0x18, 0xb1, 0x89\ndb 0xfe, 0x58, 0x1a, 0xff, 0x41, 0xb5, 0xd6, 0xe5, 0xb3, 0x82, 0x29, 0x82, 0xee, 0xbb, 0xb2, 0x5a\ndb 0x71, 0xf2, 0xca, 0xf1, 0x2f, 0xa7, 0x4d, 0xb1, 0x5c, 0xbc, 0xc3, 0x1a, 0xb4, 0x20, 0x6a, 0x7e\ndb 0xb9, 0x5e, 0xcb, 0x9b, 0xf3, 0x1c, 0x2b, 0x16, 0xab, 0x15, 0x8d, 0xb5, 0x81, 0xf3, 0xbb, 0xc1\ndb 0x8e, 0x2c, 0xd6, 0xd1, 0xa8, 0x23, 0x3c, 0x98, 0x3f, 0x4e, 0xff, 0x97, 0x77, 0xd1, 0xbd, 0xda\ndb 0xff, 0x9c, 0x55, 0x01, 0x1c, 0x4b, 0x4b, 0x1a, 0xa9, 0x3d, 0xe9, 0xbd, 0x3c, 0x5b, 0xfd, 0x65\ndb 0x34, 0x9c, 0x78, 0x8c, 0x83, 0x46, 0x72, 0xed, 0x66, 0xee, 0x00, 0xac, 0xca, 0x09, 0xaa, 0x3a\ndb 0x2c, 0xc1, 0x7e, 0xde, 0x44, 0xbd, 0xe3, 0x5a, 0x11, 0x41, 0xc7, 0xc8, 0x65, 0x7a, 0xc7, 0xbb\ndb 0x44, 0xad, 0x97, 0x17, 0xe8, 0x9f, 0x29, 0x2b, 0x78, 0x6d, 0x96, 0xb6, 0x9c, 0x3a, 0x6a, 0xc2\ndb 0xab, 0x9a, 0x16, 0x6f, 0x05, 0x78, 0x0d, 0x83, 0xa5, 0x46, 0x8c, 0xd7, 0x57, 0x1e, 0x80, 0x2f\ndb 0x7e, 0x81, 0x68, 0xa4, 0xc4, 0x3d, 0x6c, 0xae, 0x6b, 0x98, 0xb9, 0xe4, 0xb4, 0xfb, 0xf4, 0x19\ndb 0xf9, 0xcd, 0xbb, 0xd0, 0xbc, 0x22, 0xdd, 0x2c, 0xbe, 0x11, 0x01, 0xc2, 0x53, 0xdd, 0xa3, 0x3a\ndb 0xbf, 0x5f, 0x2a, 0x94, 0x8b, 0x58, 0x6e, 0xe3, 0x4e, 0x1b, 0x0d, 0x30, 0x1b, 0x1c, 0x6c, 0x24\ndb 0x0e, 0xd9, 0x1c, 0xe1, 0x4d, 0x42, 0x48, 0xa0, 0x07, 0xb1, 0xe8, 0x10, 0xa1, 0x51, 0x6a, 0x82\ndb 0x2e, 0x99, 0xb3, 0xbf, 0xe3, 0xff, 0x3c, 0x77, 0xf4, 0x0c, 0x1f, 0x22, 0x53, 0xd0, 0x99, 0x60\ndb 0x5d, 0x65, 0x80, 0xb9, 0xa3, 0xb7, 0x25, 0x6d, 0xa6, 0x4f, 0xb5, 0x72, 0xaa, 0x4d, 0x0d, 0x49\ndb 0x4c, 0x34, 0xc5, 0xf4, 0x1b, 0x5c, 0x3f, 0x6c, 0xbb, 0x86, 0xba, 0xc5, 0x32, 0xee, 0x23, 0x95\ndb 0xe5, 0x42, 0x66, 0x92, 0x89, 0x5e, 0xf4, 0xd4, 0x2d, 0x04, 0xf2, 0xbc, 0xd7, 0xc8, 0xc9, 0xd7\ndb 0xe3, 0xdb, 0x4e, 0x4b, 0xda, 0x37, 0x1f, 0xfa, 0x9c, 0xaf, 0x4b, 0x1e, 0xab, 0x64, 0x2a, 0x59\ndb 0x24, 0x0f, 0xb4, 0xaf, 0xd6, 0x32, 0x30, 0xcd, 0x7c, 0xf3, 0x0f, 0xa9, 0xac, 0x3f, 0x55, 0xa2\ndb 0x92, 0x21, 0x58, 0x4e, 0x99, 0xbc, 0x9f, 0xfd, 0x16, 0x7c, 0x4e, 0x5b, 0xb4, 0xc7, 0x5f, 0x8d\ndb 0x0e, 0x26, 0x72, 0x17, 0x02, 0x7d, 0x12, 0xa0, 0xc5, 0xc1, 0x66, 0xd3, 0x19, 0x49, 0x42, 0xfb\ndb 0x18, 0xd7, 0x18, 0x79, 0xd3, 0x32, 0xfc, 0x4a, 0xab, 0x82, 0x72, 0x0a, 0x90, 0xb7, 0xbc, 0x00\ndb 0x16, 0x99, 0xd3, 0x9a, 0x76, 0xc6, 0x44, 0x92, 0x9b, 0x2b, 0x6a, 0x35, 0xca, 0x4e, 0x2e, 0x9c\ndb 0x7f, 0xcb, 0xd3, 0x65, 0x1c, 0xa6, 0x95, 0x2c, 0x3d, 0xe4, 0xd3, 0xe6, 0xe7, 0xe0, 0xde, 0x1e\ndb 0x54, 0xb3, 0x09, 0x3e, 0x34, 0x35, 0x68, 0x53, 0x01, 0x02, 0xf1, 0x4c, 0x89, 0x19, 0xe3, 0xc6\ndb 0x4a, 0x51, 0x49, 0xf5, 0x5f, 0x3e, 0xcd, 0xae, 0x6e, 0xeb, 0x90, 0x1a, 0x53, 0x93, 0x0b, 0xe8\ndb 0xc2, 0x6e, 0xee, 0xf3, 0x38, 0x5d, 0xb8, 0xaf, 0x58, 0x4b, 0xe0, 0xfd, 0x07, 0xcf, 0x15, 0x89\ndb 0x2b, 0x01, 0x35, 0xbb, 0xa0, 0x2f, 0x7e, 0xd3, 0x34, 0x7b, 0x1f, 0x81, 0x12, 0x7f, 0xb0, 0xff\ndb 0xe7, 0xa0, 0xf2, 0xc4, 0x86, 0x98, 0x45, 0xe2, 0xa1, 0x1e, 0x4c, 0xc0, 0x23, 0x05, 0x49, 0x0b\ndb 0x0d, 0xc3, 0x1e, 0x30, 0x20, 0xc6, 0x34, 0xb7, 0xe1, 0x09, 0x84, 0xd5, 0x2a, 0x40, 0x75, 0x9b\ndb 0x46, 0xbb, 0xa5, 0xfe, 0xbd, 0x7d, 0x39, 0xe4, 0x7b, 0x38, 0xdc, 0x9c, 0xaf, 0xc8, 0x12, 0xf4\ndb 0x78, 0xb8, 0x51, 0x4a, 0x21, 0xfe, 0xf9, 0x77, 0xf6, 0xb5, 0xad, 0x69, 0xc9, 0x4d, 0xbf, 0x67\ndb 0xfc, 0x5d, 0x80, 0x7c, 0x76, 0x2c, 0xe5, 0xf2, 0xd7, 0x7f, 0xce, 0xb5, 0x1c, 0x09, 0xa5, 0xc3\ndb 0x98, 0x18, 0x2d, 0x18, 0xfb, 0x61, 0x13, 0xea, 0xbc, 0x87, 0x3a, 0x3f, 0xb4, 0xaf, 0x3c, 0x3b\ndb 0x3b, 0xb6, 0xd2, 0xc7, 0x5c, 0x2c, 0xe1, 0x11, 0xb3, 0x9d, 0xf1, 0x52, 0xba, 0xb5, 0xf0, 0x69\ndb 0xcd, 0xd2, 0x93, 0x9e, 0x80, 0x45, 0x78, 0x17, 0x6d, 0x52, 0x51, 0xad, 0xed, 0x6d, 0x9e, 0x15\ndb 0xca, 0xb1, 0xfe, 0x22, 0x7b, 0x87, 0xb8, 0x40, 0x06, 0x2d, 0xb0, 0xbb, 0x05, 0x7c, 0x52, 0xd2\ndb 0xcd, 0xc8, 0x9c, 0xea, 0xd3, 0x4c, 0xb5, 0x06, 0xb4, 0x70, 0xad, 0x09, 0xa5, 0xb8, 0x66, 0xba\ndb 0x31, 0x0d, 0xe0, 0xe2, 0xcf, 0x62, 0x9f, 0x6d, 0x6d, 0x1a, 0x47, 0x21, 0xd5, 0x33, 0x6b, 0xd7\ndb 0x75, 0xff, 0x98, 0x6c, 0xb2, 0x78, 0x6d, 0x45, 0x50, 0xeb, 0xfb, 0xea, 0xb7, 0x2a, 0x27, 0x02\ndb 0xc4, 0x03, 0xde, 0x56, 0x23, 0x26, 0x10, 0x21, 0x57, 0x9c, 0x3b, 0x4c, 0x79, 0x2c, 0x3e, 0xfe\ndb 0xc8, 0x16, 0xe4, 0xd6, 0x60, 0xb8, 0x46, 0xe3, 0x4b, 0x7e, 0x3d, 0xb3, 0x83, 0x19, 0x54, 0x65\ndb 0x51, 0x7a, 0x81, 0xdd, 0x07, 0x33, 0x92, 0x08, 0x64, 0x0b, 0xc2, 0x06, 0x5c, 0x07, 0x81, 0x40\ndb 0x1b, 0xb4, 0x5a, 0x47, 0x2b, 0xdc, 0x96, 0x98, 0x4c, 0x65, 0xad, 0x8e, 0x8e, 0x77, 0xbe, 0x99\ndb 0x60, 0x4c, 0xb5, 0x6b, 0xed, 0xb7, 0x52, 0x5d, 0x99, 0x2e, 0x93, 0x40, 0xfe, 0x45, 0x83, 0x28\ndb 0x9b, 0x8b, 0x7f, 0x77, 0x2b, 0xdc, 0x61, 0xbe, 0x62, 0x28, 0xe8, 0x23, 0x3f, 0xdb, 0x1d, 0x6d\ndb 0x3b, 0xe8, 0x90, 0x05, 0x12, 0xf2, 0xb4, 0xf0, 0x1b, 0xbb, 0x2f, 0x4b, 0x9e, 0x9f, 0x0e, 0x4e\ndb 0x9e, 0x6a, 0x38, 0x7e, 0x97, 0x13, 0x90, 0x57, 0xb9, 0x49, 0x52, 0xb7, 0x4f, 0xd3, 0xc1, 0x39\ndb 0x95, 0x20, 0xd4, 0x83, 0x48, 0x0e, 0x7a, 0x9d, 0x89, 0x9d, 0xf4, 0xec, 0xe7, 0xcc, 0xde, 0x0a\ndb 0xac, 0xc5, 0xb0, 0x4d, 0xc5, 0x25, 0x74, 0x62, 0x66, 0x51, 0x4f, 0xeb, 0x4e, 0x9d, 0x3d, 0x04\ndb 0x27, 0xec, 0xfe, 0x8d, 0x03, 0x20, 0x38, 0x30, 0x5d, 0xf3, 0xf0, 0x97, 0xbb, 0xa9, 0xd1, 0xea\ndb 0x73, 0x73, 0x40, 0x2c, 0x0b, 0xa7, 0xc9, 0x8d, 0xac, 0x75, 0xc4, 0x46, 0x7c, 0xc2, 0x9a, 0x26\ndb 0x07, 0xae, 0x02, 0x27, 0x42, 0xa8, 0x90, 0xb6, 0x9b, 0x98, 0xec, 0x2e, 0xf6, 0xf6, 0x17, 0xda\ndb 0x9f, 0xfb, 0x54, 0xea, 0xae, 0x96, 0xfe, 0xd6, 0x35, 0x4f, 0x07, 0x9f, 0xf4, 0x57, 0x36, 0xfe\ndb 0xb1, 0x43, 0xee, 0xe3, 0x21, 0x00, 0x43, 0x12, 0xf2, 0xff, 0xa5, 0x37, 0x65, 0x01, 0xf0, 0xb4\ndb 0xe8, 0x68, 0xa3, 0xff, 0x31, 0x5f, 0x3f, 0x56, 0xa5, 0xd2, 0xcc, 0xab, 0xa4, 0x90, 0xf9, 0x98\ndb 0x0b, 0xdc, 0x0d, 0x20, 0x3c, 0x33, 0xda, 0xf1, 0x54, 0xd5, 0x6d, 0xc4, 0xa9, 0xc4, 0x54, 0x29\ndb 0x56, 0x69, 0x96, 0x98, 0x74, 0x13, 0x72, 0x1f, 0x95, 0xe9, 0xe2, 0xab, 0x60, 0x74, 0x91, 0x96\ndb 0xdf, 0xa4, 0xd6, 0x62, 0x3c, 0x35, 0x7e, 0xc4, 0x21, 0x16, 0xa3, 0x32, 0xac, 0x20, 0x52, 0xd4\ndb 0xbb, 0xc2, 0xa5, 0x97, 0x86, 0x4a, 0x55, 0xf4, 0x09, 0xf2, 0x0e, 0xd6, 0x1a, 0xfa, 0x00, 0x67\ndb 0x45, 0x57, 0xb3, 0xaa, 0xe5, 0x7c, 0x17, 0x8d, 0xde, 0x75, 0xd7, 0x49, 0x6e, 0xb0, 0xb2, 0xa0\ndb 0x58, 0xd8, 0x01, 0xf0, 0x22, 0x9c, 0xe4, 0xeb, 0x71, 0x5f, 0x4d, 0x38, 0xf2, 0x7e, 0xee, 0xba\ndb 0xf9, 0x39, 0xff, 0x42, 0x91, 0x00, 0x63, 0x5c, 0x86, 0x02, 0x81, 0x51, 0x10, 0xfb, 0xcf, 0x2a\ndb 0xcf, 0x16, 0xd9, 0x8f, 0x3a, 0xbb, 0x29, 0xcb, 0xe2, 0xc9, 0xd9, 0xe2, 0xd9, 0x05, 0x1b, 0x46\ndb 0x08, 0x2c, 0x6d, 0x5b, 0x1a, 0x7d, 0x5b, 0xca, 0x5b, 0xae, 0x18, 0x48, 0x15, 0x3b, 0x85, 0xd1\ndb 0x29, 0xcf, 0xaf, 0xa5, 0x68, 0xe9, 0x8d, 0x9e, 0x0b, 0xe1, 0x55, 0x54, 0x68, 0x28, 0x9b, 0x4c\ndb 0x94, 0x30, 0x3a, 0xc0, 0xaa, 0xf8, 0xeb, 0x7b, 0x58, 0x53, 0x5f, 0x25, 0x2e, 0xbf, 0x72, 0x26\ndb 0xd8, 0x9c, 0xa9, 0xfe, 0x30, 0xe0, 0x68, 0x25, 0xba, 0x71, 0x1a, 0x82, 0xbb, 0xee, 0x03, 0xc9\ndb 0x4b, 0x0a, 0x22, 0xda, 0x93, 0xa0, 0x72, 0x49, 0x72, 0x3a, 0x8f, 0xbe, 0x39, 0x04, 0x7c, 0x06\ndb 0xa1, 0x50, 0xa1, 0x94, 0xb4, 0x66, 0x91, 0xee, 0x76, 0xa4, 0xbe, 0x21, 0x33, 0xbe, 0xa9, 0x68\ndb 0xe6, 0x03, 0xdd, 0x25, 0x3b, 0x78, 0xe3, 0x5a, 0x0c, 0xcf, 0x2b, 0xa2, 0x03, 0x63, 0x8d, 0xd7\ndb 0xc4, 0xf0, 0x6e, 0xea, 0xe1, 0x76, 0x93, 0x38, 0x7b, 0x85, 0xef, 0xff, 0xce, 0xb0, 0xe1, 0xe3\ndb 0x86, 0x3d, 0xb6, 0xae, 0xee, 0xf7, 0x92, 0x8a, 0x1b, 0x29, 0x00, 0x9b, 0x85, 0xaf, 0xa2, 0x5e\ndb 0x90, 0xd9, 0xdc, 0xca, 0xde, 0xde, 0xab, 0xfe, 0x05, 0x61, 0x3c, 0xb6, 0x2f, 0x40, 0x59, 0x1f\ndb 0x73, 0x80, 0x52, 0xf6, 0x6f, 0x28, 0x30, 0x4b, 0xf2, 0x88, 0x9e, 0x63, 0x84, 0x1b, 0xd2, 0xf4\ndb 0x67, 0x3b, 0xaf, 0x48, 0x27, 0xfd, 0x7e, 0x30, 0x6e, 0xb8, 0x81, 0xbf, 0xe5, 0x4c, 0x19, 0x16\ndb 0x24, 0xd0, 0x8e, 0x3a, 0xc9, 0xcd, 0xc8, 0x6f, 0x2e, 0x99, 0xda, 0xb8, 0x7c, 0xd9, 0xbb, 0x2c\ndb 0xe3, 0xdf, 0xd0, 0x96, 0xe2, 0xcc, 0x99, 0x5b, 0x1d, 0xff, 0x81, 0x74, 0x84, 0x0b, 0x9d, 0x09\ndb 0x3e, 0x1b, 0x0c, 0x42, 0x3d, 0x96, 0x15, 0x44, 0xed, 0x97, 0x9a, 0x99, 0x68, 0x02, 0x2c, 0x79\ndb 0x8f, 0xcc, 0xff, 0x83, 0x5e, 0x6e, 0x97, 0x00, 0x50, 0x83, 0xc2, 0x29, 0x2b, 0x27, 0xe6, 0x4f\ndb 0x18, 0xb0, 0x45, 0xa9, 0xf8, 0x30, 0x35, 0x7f, 0x20, 0xdd, 0xd7, 0x07, 0x32, 0x55, 0x95, 0x4a\ndb 0xf3, 0xf5, 0x35, 0x5b, 0xac, 0xef, 0xfa, 0xbb, 0x54, 0xba, 0x4d, 0x79, 0x66, 0xce, 0x38, 0x5e\ndb 0x23, 0xd7, 0x1b, 0x03, 0x37, 0x74, 0xa7, 0xe0, 0xb1, 0x2c, 0xe5, 0xa4, 0x00, 0x36, 0x9a, 0xe9\ndb 0x36, 0xd4, 0x3e, 0x35, 0x37, 0xb2, 0xc1, 0x71, 0x90, 0x80, 0x3b, 0xd8, 0x6b, 0x7e, 0x79, 0x0a\ndb 0x7d, 0xe3, 0x3d, 0xc8, 0xd3, 0xb3, 0x56, 0xb6, 0xef, 0x73, 0x3d, 0x24, 0x07, 0x0e, 0xeb, 0x8e\ndb 0x9b, 0x25, 0xaf, 0x3b, 0xa3, 0x92, 0xf5, 0x19, 0x16, 0xba, 0x1f, 0x6f, 0x92, 0x4b, 0x3f, 0x3c\ndb 0xc8, 0xac, 0xdd, 0x70, 0xc6, 0x3b, 0x45, 0x0b, 0xa5, 0xe0, 0x8f, 0xa4, 0xd6, 0x56, 0xd8, 0xb9\ndb 0xc1, 0x1a, 0x53, 0x76, 0x37, 0x60, 0xc9, 0xf4, 0xc8, 0x0a, 0x17, 0x6d, 0x1d, 0xb8, 0x8e, 0xec\ndb 0xa8, 0x9c, 0x71, 0x08, 0x1f, 0x45, 0x96, 0xc8, 0xed, 0x1e, 0x47, 0x09, 0xbb, 0xe6, 0xee, 0x36\ndb 0x8e, 0x87, 0xc6, 0xeb, 0xe5, 0x88, 0xd8, 0xab, 0x98, 0x41, 0x4f, 0x2a, 0x49, 0x15, 0x68, 0xf6\ndb 0x51, 0xaf, 0xc7, 0x74, 0x7c, 0xaa, 0x26, 0x1a, 0x2f, 0xe6, 0x96, 0x86, 0x7c, 0x00, 0xa4, 0x57\ndb 0x90, 0x1f, 0x83, 0x02, 0x0c, 0xb2, 0xec, 0x27, 0x7f, 0xbc, 0x78, 0x11, 0x64, 0xbe, 0x34, 0x25\ndb 0xbd, 0xf8, 0x56, 0x00, 0x5f, 0xdd, 0x85, 0x95, 0x23, 0xad, 0xe9, 0x26, 0x1e, 0xd3, 0xfc, 0x22\ndb 0xe6, 0x35, 0x07, 0xbc, 0xf6, 0x88, 0x19, 0x61, 0x2e, 0xd5, 0x0d, 0xc0, 0x98, 0x79, 0x59, 0x0a\ndb 0x33, 0x44, 0xa8, 0x70, 0xd8, 0xda, 0x45, 0x72, 0xdb, 0x83, 0xf7, 0xbe, 0xbb, 0x93, 0xc9, 0xaa\ndb 0xf5, 0xfb, 0xdc, 0x0a, 0x55, 0x54, 0xd1, 0xae, 0x9e, 0x14, 0x38, 0x24, 0x06, 0x6e, 0x4d, 0x17\ndb 0xaa, 0xb1, 0xe4, 0x55, 0x9b, 0x7c, 0xc2, 0xe7, 0xb6, 0x82, 0x1b, 0x5d, 0x21, 0x20, 0xfc, 0x34\ndb 0x51, 0xf7, 0xfd, 0x20, 0x17, 0x4b, 0xd1, 0x9f, 0xc7, 0x2a, 0x57, 0x62, 0x4a, 0x60, 0x3f, 0xfa\ndb 0x70, 0x75, 0x1a, 0x3e, 0x9d, 0xbd, 0x6c, 0xe3, 0x60, 0xc3, 0xd3, 0xa6, 0x3b, 0x73, 0xa5, 0x4f\ndb 0x06, 0x79, 0xf4, 0x6e, 0x3a, 0xae, 0xa4, 0x98, 0x86, 0xb9, 0x1b, 0x8b, 0x66, 0xd9, 0x96, 0xdb\ndb 0xa5, 0x47, 0xd3, 0xa8, 0x05, 0x3c, 0x50, 0x57, 0x8a, 0x8f, 0xe0, 0x7f, 0xaf, 0x75, 0x30, 0x44\ndb 0x01, 0xce, 0x17, 0xb8, 0x89, 0xd4, 0x12, 0xaa, 0xe5, 0x2e, 0xe2, 0x75, 0x70, 0x06, 0x02, 0x5c\ndb 0xbd, 0x85, 0xaa, 0x75, 0x02, 0x98, 0xe0, 0x0f, 0xe9, 0x94, 0x43, 0x84, 0x8c, 0xca, 0xc1, 0x53\ndb 0x2f, 0x5c, 0x9a, 0x04, 0x9c, 0x2c, 0x50, 0xc7, 0x6d, 0x13, 0x70, 0x8f, 0x7d, 0xa5, 0x09, 0xc0\ndb 0x2b, 0x75, 0x55, 0x57, 0xc0, 0x51, 0xad, 0x86, 0x18, 0xc5, 0x9a, 0x9f, 0x1d, 0x99, 0x3e, 0xbd\ndb 0x38, 0x24, 0x33, 0xd6, 0x04, 0x98, 0xde, 0x19, 0xcc, 0xb3, 0x72, 0x53, 0x6b, 0xbb, 0x38, 0x03\ndb 0xdc, 0x86, 0xe3, 0x1b, 0x12, 0x04, 0x86, 0x92, 0x3d, 0x3f, 0xf4, 0x4d, 0x73, 0x8a, 0xe7, 0x67\ndb 0x68, 0xae, 0x63, 0x13, 0x7b, 0x48, 0x90, 0xce, 0x35, 0xfb, 0xf3, 0x46, 0x17, 0xb3, 0xcd, 0x2f\ndb 0xeb, 0xb5, 0x7a, 0x11, 0xa9, 0xe1, 0xa6, 0xab, 0x0c, 0x9e, 0x9f, 0xd1, 0x08, 0xae, 0xc1, 0x68\ndb 0xd2, 0xfc, 0x41, 0x36, 0xa8, 0xf4, 0x97, 0xbf, 0x86, 0x61, 0x90, 0x51, 0x02, 0x2e, 0x9a, 0x64\ndb 0x4e, 0xfb, 0xd1, 0xe5, 0x73, 0x24, 0x07, 0xb5, 0x70, 0xa1, 0xa2, 0xb7, 0xcb, 0x0c, 0xbc, 0x1a\ndb 0x4a, 0x55, 0x9e, 0x3f, 0x3b, 0xdb, 0x33, 0x4c, 0x01, 0x63, 0x1f, 0xbe, 0xae, 0x05, 0x3e, 0x45\ndb 0x9e, 0xcf, 0x2e, 0x5f, 0x3b, 0x83, 0x8a, 0xc7, 0xd7, 0x39, 0x3b, 0xfc, 0x54, 0xf0, 0x10, 0x42\ndb 0x9d, 0x5e, 0x12, 0xc2, 0xb8, 0x8c, 0x4e, 0x26, 0xd7, 0xa0, 0xa1, 0x7a, 0xc0, 0x27, 0x72, 0x52\ndb 0xdb, 0xc5, 0xed, 0xe1, 0x86, 0x19, 0x0a, 0xff, 0x43, 0x3d, 0x1c, 0x12, 0xb2, 0xbe, 0x5c, 0x12\ndb 0x4b, 0xbf, 0xff, 0x20, 0xe3, 0xde, 0x4a, 0x74, 0x89, 0x67, 0x42, 0xc3, 0xaf, 0xe3, 0x8a, 0x8a\ndb 0x57, 0x88, 0xdf, 0xbe, 0x1a, 0x0c, 0x58, 0xa1, 0xfe, 0x21, 0x57, 0x97, 0xf6, 0xef, 0xba, 0x34\ndb 0x54, 0x60, 0x00, 0x71, 0x09, 0x4a, 0x5b, 0x89, 0x61, 0x4a, 0x67, 0x19, 0x34, 0x44, 0x83, 0x21\ndb 0x3d, 0xeb, 0x67, 0xff, 0xf7, 0x68, 0xbb, 0x29, 0xa0, 0x74, 0x5e, 0xad, 0x78, 0xb4, 0x11, 0xc5\ndb 0x5e, 0x0e, 0xc0, 0xd4, 0xe7, 0x50, 0x40, 0xa1, 0xb5, 0x98, 0xdb, 0x75, 0x1f, 0xa5, 0xbc, 0x1b\ndb 0xeb, 0x13, 0x18, 0x0e, 0x92, 0x54, 0x17, 0x2d, 0x5b, 0xf8, 0x09, 0x50, 0x27, 0x49, 0xf5, 0x01\ndb 0xb9, 0x51, 0xd1, 0x85, 0x34, 0x67, 0xd8, 0xb9, 0x5f, 0x01, 0x7b, 0xfc, 0xe7, 0x1e, 0xc8, 0xfc\ndb 0x2f, 0xda, 0x81, 0xfd, 0x76, 0x69, 0x5b, 0x47, 0x98, 0x1b, 0x9b, 0xee, 0x9b, 0x18, 0x8e, 0x30\ndb 0x85, 0x9d, 0x45, 0xde, 0xa8, 0x9b, 0x4e, 0x57, 0x26, 0x90, 0x0b, 0x9a, 0xe0, 0xf7, 0xfa, 0x08\ndb 0x1d, 0xe3, 0xca, 0xb8, 0xaa, 0xda, 0x4e, 0xe3, 0xb6, 0x33, 0x05, 0x9a, 0x75, 0x70, 0x18, 0x86\ndb 0x60, 0x31, 0xc1, 0x05, 0x56, 0x02, 0x30, 0xbd, 0xff, 0x3b, 0xa9, 0xca, 0xe4, 0x84, 0xe6, 0x96\ndb 0x47, 0xcf, 0x8b, 0xa8, 0xd4, 0x63, 0x8f, 0x8f, 0x55, 0x4a, 0xbc, 0x4c, 0x3c, 0x61, 0x96, 0x38\ndb 0xcc, 0x10, 0x7e, 0x4e, 0x5c, 0x97, 0xd3, 0x54, 0x22, 0xde, 0xfb, 0x03, 0x81, 0x4e, 0x6d, 0x76\ndb 0xb5, 0xab, 0x8f, 0xba, 0xf5, 0xf0, 0x1a, 0xf9, 0x69, 0x64, 0x30, 0xb3, 0x19, 0x30, 0x54, 0x97\ndb 0x14, 0x66, 0x5c, 0xcf, 0x48, 0x0f, 0x74, 0xf3, 0xbe, 0x16, 0x10, 0x6c, 0xb4, 0x93, 0x86, 0xd1\ndb 0x21, 0xd0, 0x6a, 0x12, 0x35, 0x03, 0x45, 0x99, 0xaa, 0xe1, 0x0a, 0xd9, 0x58, 0x83, 0x2f, 0x97\ndb 0xcb, 0x0d, 0x81, 0x4b, 0x82, 0x01, 0x6f, 0xd6, 0x20, 0xee, 0xf3, 0xbf, 0xdc, 0x3d, 0x67, 0x6c\ndb 0xa5, 0x7c, 0x6d, 0x21, 0x09, 0x99, 0x2e, 0x0a, 0x98, 0x7c, 0x50, 0x56, 0x19, 0x54, 0xcc, 0x79\ndb 0xe1, 0x84, 0x18, 0x86, 0xf8, 0x5a, 0x1b, 0xf7, 0x1f, 0x38, 0xe0, 0x3a, 0xb9, 0x50, 0xc1, 0xf1\ndb 0xbe, 0x66, 0x89, 0xe2, 0x68, 0x4a, 0x11, 0x0b, 0xfb, 0x84, 0x02, 0x38, 0x31, 0xf4, 0xda, 0x50\ndb 0xb6, 0x5f, 0x27, 0x62, 0xc7, 0x5a, 0x0f, 0x99, 0xb7, 0x7e, 0x4a, 0x49, 0xe9, 0x67, 0xe0, 0xa5\ndb 0x0d, 0x08, 0x95, 0xf0, 0xe4, 0x3b, 0x62, 0x30, 0x2b, 0x89, 0x21, 0xdd, 0x52, 0x99, 0x12, 0x16\ndb 0x83, 0x94, 0x6a, 0x38, 0x1f, 0x8d, 0x81, 0xbf, 0x1f, 0xf9, 0xe0, 0x9c, 0x80, 0xcc, 0x7c, 0xfe\ndb 0x33, 0x35, 0x27, 0x26, 0xca, 0xcc, 0x1f, 0x43, 0xcd, 0xb0, 0x74, 0x0e, 0xff, 0x1c, 0x86, 0x43\ndb 0xab, 0x44, 0xbc, 0x31, 0xff, 0xa4, 0x54, 0x95, 0xd4, 0x79, 0x9e, 0xc0, 0xed, 0x87, 0x1c, 0x2e\ndb 0x50, 0x47, 0xad, 0xc0, 0x2f, 0x5e, 0x8c, 0x15, 0xfb, 0x86, 0x2c, 0xa5, 0x61, 0x2a, 0x60, 0x12\ndb 0xbc, 0x1f, 0x84, 0xe9, 0x75, 0x55, 0x7e, 0x2c, 0x11, 0xd0, 0xfc, 0x66, 0x89, 0x86, 0x2f, 0x26\ndb 0x43, 0x1e, 0xa6, 0x6c, 0xa6, 0x40, 0xa9, 0x37, 0x65, 0x99, 0x72, 0xe1, 0x1a, 0xdc, 0x23, 0x53\ndb 0x09, 0x8e, 0xa1, 0xd6, 0xda, 0xd9, 0x95, 0xaf, 0x58, 0xe0, 0x2a, 0x4a, 0xd3, 0xbd, 0xbd, 0x86\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtpd2dq_inexact.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000200000001\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0xFFFFFFFEFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000200000001\", \"0x0000000200000001\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0xFFFFFFFEFFFFFFFF\", \"0xFFFFFFFEFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x8000000080000000\", \"0x8000000080000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 2]\nvmovapd ymm1, [rdx + 32 * 2]\nvmovapd ymm2, [rdx]\n\nvcvtpd2dq xmm0, xmm2\nvcvtpd2dq xmm1, oword [rdx + 32 * 1]\n\nvcvtpd2dq xmm3, ymm2\nvcvtpd2dq xmm4, yword [rdx + 32 * 1]\n\nvcvtpd2dq xmm5, yword [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000\ndq 0x4000000000000000\ndq 0x3FF0000000000000\ndq 0x4000000000000000\n\ndq 0xBFF0000000000000\ndq 0xC000000000000000\ndq 0xBFF0000000000000\ndq 0xC000000000000000\n\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x7ff0000000000000\ndq 0xfff0000000000000\ndq 0x7ff8000000000000\ndq 0x7fefffffffffffff\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtpd2ps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x4054C664C2F837B5\", \"0x40516053E2D6238E\", \"0x4044836D86EC17EC\", \"0x402A1E1C58255B03\"],\n    \"XMM1\":  [\"0x401568E0C9D9D346\", \"0x4035FE425AEE6320\", \"0x402359003EEA209B\", \"0x40154B7D41743E96\"],\n    \"XMM2\":  [\"0x403D075A31A4BDBA\", \"0x4050A018BD66277C\", \"0x40334EC17EBAF102\", \"0x4056D7404EA4A8C1\"],\n    \"XMM7\":  [\"0x428B029F42A63326\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x41AFF21340AB4706\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x428500C641E83AD2\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x4214ADB642B062C4\", \"0x41245B0E42461AA5\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x41A1B712429B697F\", \"0x42252CF2411CE3BD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x42662BE34176837B\", \"0x425E2C0D4119C75A\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x409C30014253A13B\", \"0x4041495242910EC1\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0xff8000007f800000\", \"0x7f8000007fc00000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\n\nvcvtpd2ps xmm7,  xmm0\nvcvtpd2ps xmm8,  xmm1\nvcvtpd2ps xmm9,  xmm2\nvcvtpd2ps xmm10, yword [rdx + 32 * 10]\nvcvtpd2ps xmm11, yword [rdx + 32 * 11]\nvcvtpd2ps xmm12, yword [rdx + 32 * 12]\nvcvtpd2ps xmm13, yword [rdx + 32 * 13]\nvcvtpd2ps xmm14, yword [rdx + 32 * 14]\n\nhlt\n\nalign 32\n.data:\ndq 83.0999, 69.50512\ndq 41.02678, 13.05881\n\ndq 5.35242, 21.9932\ndq 9.67383, 5.32372\n\ndq 29.02872, 66.50151\ndq 19.30764, 91.3633\n\ndq 40.45086, 50.96153\ndq 32.64489, 23.97574\n\ndq 90.64316, 24.22547\ndq 98.9394, 91.21715\n\ndq 90.80143, 99.48407\ndq 64.97245, 74.39838\n\ndq 35.22761, 25.35321\ndq 5.8732, 90.19956\n\ndq 33.03133, 52.02952\ndq 58.38554, 10.17531\n\ndq 47.84703, 84.04831\ndq 90.02965, 65.81329\n\ndq 96.27991, 6.64479\ndq 25.58971, 95.00694\n\ndq 88.1929, 37.16964\ndq 49.52602, 10.27223\n\ndq 77.70605, 20.21439\ndq 9.8056, 41.29389\n\ndq 15.4071, 57.54286\ndq 9.61117, 55.54302\n\ndq 52.90745, 4.88086\ndq 72.52882, 3.0201\n\ndq 0x7ff0000000000000, 0xfff0000000000000\ndq 0x7ff8000000000000, 0x7fefffffffffffff\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtph2ps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xFC007C00BC003C00\", \"0x42487E0003FF0001\", \"0\", \"0\"],\n    \"XMM1\": [\"0x800000007BFFFBFF\", \"0x42A53DC534D136F3\", \"0\", \"0\"],\n    \"XMM2\": [\"0xBF8000003F800000\", \"0xFF8000007F800000\", \"0\", \"0\"],\n    \"XMM3\": [\"0x477FE000C77FE000\", \"0x8000000000000000\", \"0\", \"0\"],\n    \"XMM4\": [\"0xBF8000003F800000\", \"0xFF8000007F800000\", \"0\", \"0\"],\n    \"XMM5\": [\"0x387FC00033800000\", \"0x404900007FC00000\", \"0\", \"0\"],\n    \"XMM6\": [\"0xFC007C00BC003C00\", \"0x42487E0003FF0001\", \"0x800000007BFFFBFF\", \"0x42A53DC534D136F3\"],\n    \"XMM7\": [\"0xBF8000003F800000\", \"0xFF8000007F800000\", \"0x387FC00033800000\", \"0x404900007FC00000\"],\n    \"XMM8\": [\"0xBF8000003F800000\", \"0xFF8000007F800000\", \"0x387FC00033800000\", \"0x404900007FC00000\"],\n    \"XMM9\": [\"0x477FE000C77FE000\", \"0x8000000000000000\", \"0x3E9A20003EDE6000\", \"0x4054A0003FB8A000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; 128-bit\n\nvmovapd xmm0, [rdx]\nvmovapd xmm1, [rdx + 16]\n\n; 128-bit register\nvcvtph2ps xmm2, xmm0\nvcvtph2ps xmm3, xmm1\n\n; 128-bit memory\nvcvtph2ps xmm4, [rdx]\nvcvtph2ps xmm5, [rdx + 8]\n\n; 256-bit\n\nvmovapd ymm6, [rdx]\n\n; 256-bit register\nvcvtph2ps ymm7, xmm6\n\n; 256-bit memory\nvcvtph2ps ymm8, [rdx]\nvcvtph2ps ymm9, [rdx + 16]\n\nhlt\n\nalign 32\n.data:\ndw 0x3C00 ; 1.0\ndw 0xBC00 ; -1.0\ndw 0x7C00 ; +inf\ndw 0xFC00 ; -inf\n\ndw 0x0001 ; min positive subnormal\ndw 0x03FF ; max subnormal\ndw 0x7E00 ; NaN\ndw 0x4248 ; pi\n\ndw 0xFBFF ; min finite value\ndw 0x7BFF ; max finite value\ndw 0x0000 ; +0.0\ndw 0x8000 ; -0.0\n\ndw 0x36F3 ; log_10(e)\ndw 0x34D1 ; log_10(2)\ndw 0x3DC5 ; log_2(e)\ndw 0x42A5 ; log_2(10)\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtps2dq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000004600000053\", \"0x0000000D00000029\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x0000001600000005\", \"0x000000050000000A\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x000000430000001D\", \"0x0000005B00000013\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000003300000028\", \"0x0000001800000021\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x000000180000005B\", \"0x0000005B00000063\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x000000630000005B\", \"0x0000004A00000041\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x0000001900000023\", \"0x0000005A00000006\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000003400000021\", \"0x0000000A0000003A\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x0000005400000030\", \"0x000000420000005A\", \"0x0000005400000030\", \"0x000000420000005A\"],\n    \"XMM9\":  [\"0x0000000700000060\", \"0x0000005F0000001A\", \"0x0000000700000060\", \"0x0000005F0000001A\"],\n    \"XMM10\": [\"0x0000002500000058\", \"0x0000000A00000032\", \"0x0000002500000058\", \"0x0000000A00000032\"],\n    \"XMM11\": [\"0x000000140000004E\", \"0x000000290000000A\", \"0x000000140000004E\", \"0x000000290000000A\"],\n    \"XMM12\": [\"0x0000003A0000000F\", \"0x000000380000000A\", \"0x0000003A0000000F\", \"0x000000380000000A\"],\n    \"XMM13\": [\"0x0000000500000035\", \"0x0000000300000049\", \"0x0000000500000035\", \"0x0000000300000049\"],\n    \"XMM14\": [\"0x0000004700000039\", \"0x000000590000003E\", \"0x0000004700000039\", \"0x000000590000003E\"],\n    \"XMM15\": [\"0x0000001800000030\", \"0x0000006100000022\", \"0x0000001800000030\", \"0x0000006100000022\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvcvtps2dq xmm0,  [rdx + 32 * 0]\nvcvtps2dq xmm1,  [rdx + 32 * 1]\nvcvtps2dq xmm2,  [rdx + 32 * 2]\nvcvtps2dq xmm3,  [rdx + 32 * 3]\nvcvtps2dq xmm4,  [rdx + 32 * 4]\nvcvtps2dq xmm5,  [rdx + 32 * 5]\nvcvtps2dq xmm6,  [rdx + 32 * 6]\nvcvtps2dq xmm7,  [rdx + 32 * 7]\n\nvcvtps2dq ymm8,  [rdx + 32 * 8]\nvcvtps2dq ymm9,  [rdx + 32 * 9]\nvcvtps2dq ymm10, [rdx + 32 * 10]\nvcvtps2dq ymm11, [rdx + 32 * 11]\nvcvtps2dq ymm12, [rdx + 32 * 12]\nvcvtps2dq ymm13, [rdx + 32 * 13]\nvcvtps2dq ymm14, [rdx + 32 * 14]\nvcvtps2dq ymm15, [rdx + 32 * 15]\n\nhlt\n\nalign 32\n.data:\ndd 83.0999 , 69.50512, 41.02678, 13.05881\ndd 83.0999 , 69.50512, 41.02678, 13.05881\n\ndd 5.35242 , 21.9932 , 9.67383 , 5.32372\ndd 5.35242 , 21.9932 , 9.67383 , 5.32372\n\ndd 29.02872, 66.50151, 19.30764, 91.3633\ndd 29.02872, 66.50151, 19.30764, 91.3633\n\ndd 40.45086, 50.96153, 32.64489, 23.97574\ndd 40.45086, 50.96153, 32.64489, 23.97574\n\ndd 90.64316, 24.22547, 98.9394 , 91.21715\ndd 90.64316, 24.22547, 98.9394 , 91.21715\n\ndd 90.80143, 99.48407, 64.97245, 74.39838\ndd 90.80143, 99.48407, 64.97245, 74.39838\n\ndd 35.22761, 25.35321, 5.8732  , 90.19956\ndd 35.22761, 25.35321, 5.8732  , 90.19956\n\ndd 33.03133, 52.02952, 58.38554, 10.17531\ndd 33.03133, 52.02952, 58.38554, 10.17531\n\ndd 47.84703, 84.04831, 90.02965, 65.81329\ndd 47.84703, 84.04831, 90.02965, 65.81329\n\ndd 96.27991, 6.64479 , 25.58971, 95.00694\ndd 96.27991, 6.64479 , 25.58971, 95.00694\n\ndd 88.1929 , 37.16964, 49.52602, 10.27223\ndd 88.1929 , 37.16964, 49.52602, 10.27223\n\ndd 77.70605, 20.21439, 9.8056  , 41.29389\ndd 77.70605, 20.21439, 9.8056  , 41.29389\n\ndd 15.4071 , 57.54286, 9.61117 , 55.54302\ndd 15.4071 , 57.54286, 9.61117 , 55.54302\n\ndd 52.90745, 4.88086 , 72.52882, 3.0201\ndd 52.90745, 4.88086 , 72.52882, 3.0201\n\ndd 56.55091, 71.22749, 61.84736, 88.74295\ndd 56.55091, 71.22749, 61.84736, 88.74295\n\ndd 47.72641, 24.17404, 33.70564, 96.71303\ndd 47.72641, 24.17404, 33.70564, 96.71303\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtps2dq_inexact.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000100000001\", \"0x0000000200000002\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x0000000400000004\", \"0x0000000800000008\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000100000001\", \"0x0000000200000002\", \"0x0000000100000001\", \"0x0000000200000002\"],\n    \"XMM4\":  [\"0x0000000400000004\", \"0x0000000800000008\", \"0x0000000400000004\", \"0x0000000800000008\"],\n    \"XMM5\":  [\"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Set up MXCSR to truncate\nvldmxcsr [rel .mxcsr]\n\nvmovapd ymm0, [rdx + 32 * 2]\nvmovapd ymm1, [rdx + 32 * 2]\nvmovapd ymm2, [rdx]\n\nvcvtps2dq xmm0, xmm2\nvcvtps2dq xmm1, [rdx + 32 * 1]\n\nvcvtps2dq ymm3, ymm2\nvcvtps2dq ymm4, [rdx + 32 * 1]\nvcvtps2dq ymm5, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x3FC000003F800000 ; [1.5, 1.0]\ndq 0x4039999A40000000 ; [2.9, 2.0]\ndq 0x3FC000003F800000 ; [1.5, 1.0]\ndq 0x4039999A40000000 ; [2.9, 2.0]\n\ndq 0x4083333340800000 ; [4.1, 4.0]\ndq 0x4108000041000000 ; [8.5, 8.0]\ndq 0x4083333340800000 ; [4.1, 4.0]\ndq 0x4108000041000000 ; [8.5, 8.0]\n\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x7fc000007f800000\ndq 0xff800000ff7fffee\ndq 0x7bc097cefbc097ce\ndq 0x0000000080000000\n\n.mxcsr:\ndq 0x0000000000007F80\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtps2pd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x428B029F42A63326\", \"0x4150F0E342241B6C\", \"0x409C30014253A13B\", \"0x4041495242910EC1\"],\n    \"XMM1\":  [\"0x41AFF21340AB4706\", \"0x40AA5BEA411AC802\", \"0x42662BE34176837B\", \"0x425E2C0D4119C75A\"],\n    \"XMM2\":  [\"0x428500C641E83AD2\", \"0x42B6BA02419A760C\", \"0x41A1B712429B697F\", \"0x42252CF2411CE3BD\"],\n    \"XMM7\":  [\"0x4054C664C0000000\", \"0x40516053E0000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x401568E0C0000000\", \"0x4035FE4260000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x403D075A40000000\", \"0x4050A018C0000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x40560C5880000000\", \"0x404295B6C0000000\", \"0x4048C354A0000000\", \"0x40248B61C0000000\"],\n    \"XMM11\": [\"0x40536D2FE0000000\", \"0x403436E240000000\", \"0x40239C77A0000000\", \"0x4044A59E40000000\"],\n    \"XMM12\": [\"0x402ED06F60000000\", \"0x404CC57C60000000\", \"0x402338EB40000000\", \"0x404BC581A0000000\"],\n    \"XMM13\": [\"0x404A742760000000\", \"0x4013860020000000\", \"0x405221D820000000\", \"0x4008292A40000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\n\nvcvtps2pd xmm7,  xmm0\nvcvtps2pd xmm8,  xmm1\nvcvtps2pd xmm9,  xmm2\nvcvtps2pd ymm10, [rdx + 32 * 10]\nvcvtps2pd ymm11, [rdx + 32 * 11]\nvcvtps2pd ymm12, [rdx + 32 * 12]\nvcvtps2pd ymm13, [rdx + 32 * 13]\n\nhlt\n\nalign 32\n.data:\ndd 83.0999, 69.50512, 41.02678, 13.05881\ndd 52.90745, 4.88086, 72.52882, 3.0201\n\ndd 5.35242, 21.9932, 9.67383, 5.32372\ndd 15.4071, 57.54286, 9.61117, 55.54302\n\ndd 29.02872, 66.50151, 19.30764, 91.3633\ndd 77.70605, 20.21439, 9.8056, 41.29389\n\ndd 40.45086, 50.96153, 32.64489, 23.97574\ndd 88.1929, 37.16964, 49.52602, 10.27223\n\ndd 90.64316, 24.22547, 98.9394, 91.21715\ndd 96.27991, 6.64479, 25.58971, 95.00694\n\ndd 90.80143, 99.48407, 64.97245, 74.39838\ndd 47.84703, 84.04831, 90.02965, 65.81329\n\ndd 35.22761, 25.35321, 5.8732, 90.19956\ndd 33.03133, 52.02952, 58.38554, 10.17531\n\ndd 33.03133, 52.02952, 58.38554, 10.17531\ndd 83.0999, 69.50512, 41.02678, 13.05881\n\ndd 47.84703, 84.04831, 90.02965, 65.81329\ndd 5.35242, 21.9932, 9.67383, 5.32372\n\ndd 96.27991, 6.64479, 25.58971, 95.00694\ndd 29.02872, 66.50151, 19.30764, 91.3633\n\ndd 88.1929, 37.16964, 49.52602, 10.27223\ndd 40.45086, 50.96153, 32.64489, 23.97574\n\ndd 77.70605, 20.21439, 9.8056, 41.29389\ndd 90.64316, 24.22547, 98.9394, 91.21715\n\ndd 15.4071, 57.54286, 9.61117, 55.54302\ndd 90.80143, 99.48407, 64.97245, 74.39838\n\ndd 52.90745, 4.88086, 72.52882, 3.0201\ndd 35.22761, 25.35321, 5.8732, 90.19956\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtps2ph_rd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0\", \"0\"],\n    \"XMM1\": [\"0x7F80000040600000\", \"0x00000001FF800000\", \"0\", \"0\"],\n    \"XMM2\": [\"0x7E007BFF00003C00\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM3\": [\"0x0000FC007C004300\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x7E007BFF00003C00\", \"0x0000FC007C004300\", \"0\", \"0\"],\n    \"XMM5\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0x7F80000040600000\", \"0x00000001FF800000\"],\n    \"XMM6\": [\"0x7E007BFF00003C00\", \"0x0000FC007C004300\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7E007BFF00003C00\", \"0x0000FC007C004300\", \"0\", \"0\"]\n  }\n}\n%endif\n\n; Round Down\n\nlea rdx, [rel .data]\n\n; 128-bit\n\nvmovapd xmm0, [rdx]\nvmovapd xmm1, [rdx + 16]\n\n; 128-bit register\n\nvcvtps2ph xmm2, xmm0, 1\nvcvtps2ph xmm3, xmm1, 1\n\n; 128-bit memory\nvcvtps2ph [rel .memarea + 0], xmm0, 1\nvcvtps2ph [rel .memarea + 8], xmm1, 1\nvmovapd xmm4, [rel .memarea]\n\n; 256-bit\n\nvmovapd ymm5, [rdx]\n\n; 256-bit register\n\nvcvtps2ph xmm6, ymm5, 1\n\n; 256-bit memory\n\nvcvtps2ph [rel .memarea + 16], ymm5, 1\nvmovapd xmm7, [rel .memarea + 16]\n\nhlt\n\nalign 4096\n.data:\ndd 0x3F800000, 0x00800000, 0x7F7FFFFF, 0x7FC00000 ; 1.0, FLT_MIN, FLT_MAX, QNaN\ndd 0x40600000, 0x7F800000, 0xFF800000, 0x00000001 ; 3.5, +inf, -inf, FLT_TRUE_MIN\n\n; A quaint little area for testing the store variant of VCVTPS2PH\n.memarea: times 16 dq 0\n\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtps2ph_rd_mxcsr.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0\", \"0\"],\n    \"XMM1\": [\"0x7F80000040600000\", \"0x00000001FF800000\", \"0\", \"0\"],\n    \"XMM2\": [\"0x7E007BFF00003C00\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM3\": [\"0x0000FC007C004300\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x7E007BFF00003C00\", \"0x0000FC007C004300\", \"0\", \"0\"],\n    \"XMM5\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0x7F80000040600000\", \"0x00000001FF800000\"],\n    \"XMM6\": [\"0x7E007BFF00003C00\", \"0x0000FC007C004300\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7E007BFF00003C00\", \"0x0000FC007C004300\", \"0\", \"0\"]\n  }\n}\n%endif\n\n; Set up MXCSR to Round Down\nvldmxcsr [rel .mxcsr]\n\nlea rdx, [rel .data]\n\n; 128-bit\n\nvmovapd xmm0, [rdx]\nvmovapd xmm1, [rdx + 16]\n\n; 128-bit register\n\nvcvtps2ph xmm2, xmm0, 100b\nvcvtps2ph xmm3, xmm1, 100b\n\n; 128-bit memory\nvcvtps2ph [rel .memarea + 0], xmm0, 100b\nvcvtps2ph [rel .memarea + 8], xmm1, 100b\nvmovapd xmm4, [rel .memarea]\n\n; 256-bit\n\nvmovapd ymm5, [rdx]\n\n; 256-bit register\n\nvcvtps2ph xmm6, ymm5, 100b\n\n; 256-bit memory\n\nvcvtps2ph [rel .memarea + 16], ymm5, 100b\nvmovapd xmm7, [rel .memarea + 16]\n\nhlt\n\nalign 4096\n.data:\ndd 0x3F800000, 0x00800000, 0x7F7FFFFF, 0x7FC00000 ; 1.0, FLT_MIN, FLT_MAX, QNaN\ndd 0x40600000, 0x7F800000, 0xFF800000, 0x00000001 ; 3.5, +inf, -inf, FLT_TRUE_MIN\n\n; A quaint little area for testing the store variant of VCVTPS2PH\n.memarea: times 16 dq 0\n\n.mxcsr:\ndq 0x0000000000003F80\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtps2ph_rtne.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0\", \"0\"],\n    \"XMM1\": [\"0x7F80000040600000\", \"0x00000001FF800000\", \"0\", \"0\"],\n    \"XMM2\": [\"0x7E007C0000003C00\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM3\": [\"0x0000FC007C004300\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x7E007C0000003C00\", \"0x0000FC007C004300\", \"0\", \"0\"],\n    \"XMM5\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0x7F80000040600000\", \"0x00000001FF800000\"],\n    \"XMM6\": [\"0x7E007C0000003C00\", \"0x0000FC007C004300\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7E007C0000003C00\", \"0x0000FC007C004300\", \"0\", \"0\"],\n    \"XMM8\": [\"0x4800440040003c00\", \"0xc800c400c000bc00\", \"0x4142434445464748\", \"0x4142434445464748\"]\n  }\n}\n%endif\n\n; Round to Nearest Even\n\nlea rdx, [rel .data]\n\n; 128-bit\n\nvmovapd xmm0, [rdx]\nvmovapd xmm1, [rdx + 16]\n\n; 128-bit register\n\nvcvtps2ph xmm2, xmm0, 0\nvcvtps2ph xmm3, xmm1, 0\n\n; 128-bit memory\nvcvtps2ph [rel .memarea + 0], xmm0, 0\nvcvtps2ph [rel .memarea + 8], xmm1, 0\nvmovapd xmm4, [rel .memarea]\n\n; 256-bit\n\nvmovapd ymm5, [rdx]\n\n; 256-bit register\n\nvcvtps2ph xmm6, ymm5, 0\n\n; 256-bit memory\n\nvcvtps2ph [rel .memarea + 16], ymm5, 0\nvmovapd xmm7, [rel .memarea + 16]\n\n; GCC test failure\nvmovaps ymm8, [rel .data_in]\nvcvtps2ph [rel .data_bad], ymm8, 0\nvmovaps ymm8, [rel .data_bad]\n\nhlt\n\nalign 4096\n.data:\ndd 0x3F800000, 0x00800000, 0x7F7FFFFF, 0x7FC00000 ; 1.0, FLT_MIN, FLT_MAX, QNaN\ndd 0x40600000, 0x7F800000, 0xFF800000, 0x00000001 ; 3.5, +inf, -inf, FLT_TRUE_MIN\n\n; A quaint little area for testing the store variant of VCVTPS2PH\n.memarea: times 16 dq 0\n\nalign 32\n.data_in:\ndd 1.0, 2.0, 4.0, 8.0, -1.0, -2.0, -4.0, -8.0\n\n.data_bad:\ndq 0x4142434445464748\ndq 0x4142434445464748\ndq 0x4142434445464748\ndq 0x4142434445464748\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtps2ph_rtne_mxcsr.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0\", \"0\"],\n    \"XMM1\": [\"0x7F80000040600000\", \"0x00000001FF800000\", \"0\", \"0\"],\n    \"XMM2\": [\"0x7E007C0000003C00\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM3\": [\"0x0000FC007C004300\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x7E007C0000003C00\", \"0x0000FC007C004300\", \"0\", \"0\"],\n    \"XMM5\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0x7F80000040600000\", \"0x00000001FF800000\"],\n    \"XMM6\": [\"0x7E007C0000003C00\", \"0x0000FC007C004300\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7E007C0000003C00\", \"0x0000FC007C004300\", \"0\", \"0\"]\n  }\n}\n%endif\n\n; Set up MXCSR to Round to Nearest Even\nvldmxcsr [rel .mxcsr]\n\nlea rdx, [rel .data]\n\n; 128-bit\n\nvmovapd xmm0, [rdx]\nvmovapd xmm1, [rdx + 16]\n\n; 128-bit register\n\nvcvtps2ph xmm2, xmm0, 100b\nvcvtps2ph xmm3, xmm1, 100b\n\n; 128-bit memory\nvcvtps2ph [rel .memarea + 0], xmm0, 100b\nvcvtps2ph [rel .memarea + 8], xmm1, 100b\nvmovapd xmm4, [rel .memarea]\n\n; 256-bit\n\nvmovapd ymm5, [rdx]\n\n; 256-bit register\n\nvcvtps2ph xmm6, ymm5, 100b\n\n; 256-bit memory\n\nvcvtps2ph [rel .memarea + 16], ymm5, 100b\nvmovapd xmm7, [rel .memarea + 16]\n\nhlt\n\nalign 4096\n.data:\ndd 0x3F800000, 0x00800000, 0x7F7FFFFF, 0x7FC00000 ; 1.0, FLT_MIN, FLT_MAX, QNaN\ndd 0x40600000, 0x7F800000, 0xFF800000, 0x00000001 ; 3.5, +inf, -inf, FLT_TRUE_MIN\n\n; A quaint little area for testing the store variant of VCVTPS2PH\n.memarea: times 16 dq 0\n\n.mxcsr:\ndq 0x0000000000001F80\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtps2ph_ru.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0\", \"0\"],\n    \"XMM1\": [\"0x7F80000040600000\", \"0x00000001FF800000\", \"0\", \"0\"],\n    \"XMM2\": [\"0x7E007C0000013C00\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM3\": [\"0x0001FC007C004300\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x7E007C0000013C00\", \"0x0001FC007C004300\", \"0\", \"0\"],\n    \"XMM5\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0x7F80000040600000\", \"0x00000001FF800000\"],\n    \"XMM6\": [\"0x7E007C0000013C00\", \"0x0001FC007C004300\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7E007C0000013C00\", \"0x0001FC007C004300\", \"0\", \"0\"]\n  }\n}\n%endif\n\n; Round Up\n\nlea rdx, [rel .data]\n\n; 128-bit\n\nvmovapd xmm0, [rdx]\nvmovapd xmm1, [rdx + 16]\n\n; 128-bit register\n\nvcvtps2ph xmm2, xmm0, 2\nvcvtps2ph xmm3, xmm1, 2\n\n; 128-bit memory\nvcvtps2ph [rel .memarea + 0], xmm0, 2\nvcvtps2ph [rel .memarea + 8], xmm1, 2\nvmovapd xmm4, [rel .memarea]\n\n; 256-bit\n\nvmovapd ymm5, [rdx]\n\n; 256-bit register\n\nvcvtps2ph xmm6, ymm5, 2\n\n; 256-bit memory\n\nvcvtps2ph [rel .memarea + 16], ymm5, 2\nvmovapd xmm7, [rel .memarea + 16]\n\nhlt\n\nalign 4096\n.data:\ndd 0x3F800000, 0x00800000, 0x7F7FFFFF, 0x7FC00000 ; 1.0, FLT_MIN, FLT_MAX, QNaN\ndd 0x40600000, 0x7F800000, 0xFF800000, 0x00000001 ; 3.5, +inf, -inf, FLT_TRUE_MIN\n\n; A quaint little area for testing the store variant of VCVTPS2PH\n.memarea: times 16 dq 0\n\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtps2ph_ru_mxcsr.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0\", \"0\"],\n    \"XMM1\": [\"0x7F80000040600000\", \"0x00000001FF800000\", \"0\", \"0\"],\n    \"XMM2\": [\"0x7E007C0000013C00\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM3\": [\"0x0001FC007C004300\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x7E007C0000013C00\", \"0x0001FC007C004300\", \"0\", \"0\"],\n    \"XMM5\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0x7F80000040600000\", \"0x00000001FF800000\"],\n    \"XMM6\": [\"0x7E007C0000013C00\", \"0x0001FC007C004300\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7E007C0000013C00\", \"0x0001FC007C004300\", \"0\", \"0\"]\n  }\n}\n%endif\n\n; Set up MXCSR to Round Up\nvldmxcsr [rel .mxcsr]\n\nlea rdx, [rel .data]\n\n; 128-bit\n\nvmovapd xmm0, [rdx]\nvmovapd xmm1, [rdx + 16]\n\n; 128-bit register\n\nvcvtps2ph xmm2, xmm0, 100b\nvcvtps2ph xmm3, xmm1, 100b\n\n; 128-bit memory\nvcvtps2ph [rel .memarea + 0], xmm0, 100b\nvcvtps2ph [rel .memarea + 8], xmm1, 100b\nvmovapd xmm4, [rel .memarea]\n\n; 256-bit\n\nvmovapd ymm5, [rdx]\n\n; 256-bit register\n\nvcvtps2ph xmm6, ymm5, 100b\n\n; 256-bit memory\n\nvcvtps2ph [rel .memarea + 16], ymm5, 100b\nvmovapd xmm7, [rel .memarea + 16]\n\nhlt\n\nalign 4096\n.data:\ndd 0x3F800000, 0x00800000, 0x7F7FFFFF, 0x7FC00000 ; 1.0, FLT_MIN, FLT_MAX, QNaN\ndd 0x40600000, 0x7F800000, 0xFF800000, 0x00000001 ; 3.5, +inf, -inf, FLT_TRUE_MIN\n\n; A quaint little area for testing the store variant of VCVTPS2PH\n.memarea: times 16 dq 0\n\n.mxcsr:\ndq 0x0000000000005F80\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtps2ph_trunc.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0\", \"0\"],\n    \"XMM1\": [\"0x7F80000040600000\", \"0x00000001FF800000\", \"0\", \"0\"],\n    \"XMM2\": [\"0x7E007BFF00003C00\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM3\": [\"0x0000FC007C004300\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x7E007BFF00003C00\", \"0x0000FC007C004300\", \"0\", \"0\"],\n    \"XMM5\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0x7F80000040600000\", \"0x00000001FF800000\"],\n    \"XMM6\": [\"0x7E007BFF00003C00\", \"0x0000FC007C004300\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7E007BFF00003C00\", \"0x0000FC007C004300\", \"0\", \"0\"]\n  }\n}\n%endif\n\n; Truncate\n\nlea rdx, [rel .data]\n\n; 128-bit\n\nvmovapd xmm0, [rdx]\nvmovapd xmm1, [rdx + 16]\n\n; 128-bit register\n\nvcvtps2ph xmm2, xmm0, 3\nvcvtps2ph xmm3, xmm1, 3\n\n; 128-bit memory\nvcvtps2ph [rel .memarea + 0], xmm0, 3\nvcvtps2ph [rel .memarea + 8], xmm1, 3\nvmovapd xmm4, [rel .memarea]\n\n; 256-bit\n\nvmovapd ymm5, [rdx]\n\n; 256-bit register\n\nvcvtps2ph xmm6, ymm5, 3\n\n; 256-bit memory\n\nvcvtps2ph [rel .memarea + 16], ymm5, 3\nvmovapd xmm7, [rel .memarea + 16]\n\nhlt\n\nalign 4096\n.data:\ndd 0x3F800000, 0x00800000, 0x7F7FFFFF, 0x7FC00000 ; 1.0, FLT_MIN, FLT_MAX, QNaN\ndd 0x40600000, 0x7F800000, 0xFF800000, 0x00000001 ; 3.5, +inf, -inf, FLT_TRUE_MIN\n\n; A quaint little area for testing the store variant of VCVTPS2PH\n.memarea: times 16 dq 0\n\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtps2ph_trunc_mxcsr.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0\", \"0\"],\n    \"XMM1\": [\"0x7F80000040600000\", \"0x00000001FF800000\", \"0\", \"0\"],\n    \"XMM2\": [\"0x7E007BFF00003C00\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM3\": [\"0x0000FC007C004300\", \"0x0000000000000000\", \"0\", \"0\"],\n    \"XMM4\": [\"0x7E007BFF00003C00\", \"0x0000FC007C004300\", \"0\", \"0\"],\n    \"XMM5\": [\"0x008000003F800000\", \"0x7FC000007F7FFFFF\", \"0x7F80000040600000\", \"0x00000001FF800000\"],\n    \"XMM6\": [\"0x7E007BFF00003C00\", \"0x0000FC007C004300\", \"0\", \"0\"],\n    \"XMM7\": [\"0x7E007BFF00003C00\", \"0x0000FC007C004300\", \"0\", \"0\"]\n  }\n}\n%endif\n\n; Set up MXCSR to truncate\nvldmxcsr [rel .mxcsr]\n\nlea rdx, [rel .data]\n\n; 128-bit\n\nvmovapd xmm0, [rdx]\nvmovapd xmm1, [rdx + 16]\n\n; 128-bit register\n\nvcvtps2ph xmm2, xmm0, 100b\nvcvtps2ph xmm3, xmm1, 100b\n\n; 128-bit memory\nvcvtps2ph [rel .memarea + 0], xmm0, 100b\nvcvtps2ph [rel .memarea + 8], xmm1, 100b\nvmovapd xmm4, [rel .memarea]\n\n; 256-bit\n\nvmovapd ymm5, [rdx]\n\n; 256-bit register\n\nvcvtps2ph xmm6, ymm5, 100b\n\n; 256-bit memory\n\nvcvtps2ph [rel .memarea + 16], ymm5, 100b\nvmovapd xmm7, [rel .memarea + 16]\n\nhlt\n\nalign 4096\n.data:\ndd 0x3F800000, 0x00800000, 0x7F7FFFFF, 0x7FC00000 ; 1.0, FLT_MIN, FLT_MAX, QNaN\ndd 0x40600000, 0x7F800000, 0xFF800000, 0x00000001 ; 3.5, +inf, -inf, FLT_TRUE_MIN\n\n; A quaint little area for testing the store variant of VCVTPS2PH\n.memarea: times 16 dq 0\n\n.mxcsr:\ndq 0x0000000000007F80\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtsd2si.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x0000000000000001\",\n    \"RBX\": \"0x0000000000000002\",\n    \"RCX\": \"0x0000000000000003\",\n    \"RDX\": \"0x0000000000000004\",\n    \"RSI\": \"0x00000000ffffffff\",\n    \"RDI\": \"0xfffffffffffffffe\",\n    \"RSP\": \"0x00000000fffffffd\",\n    \"RBP\": \"0xfffffffffffffffc\"\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd xmm0, [rdx + 8 * 0]\nvmovapd xmm1, [rdx + 8 * 2]\n\nvcvtsd2si eax, xmm0\nvcvtsd2si rbx, xmm1\n\nvcvtsd2si ecx, [rdx + 8 * 4]\nvcvtsd2si rdx, [rdx + 8 * 6]\n\nvcvtsd2si esi, [rel .data + 8 * 8]\nvcvtsd2si rdi, [rel .data + 8 * 10]\nvcvtsd2si esp, [rel .data + 8 * 12]\nvcvtsd2si rbp, [rel .data + 8 * 14]\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000\ndq 0x5152535455565758\n\ndq 0x4000000000000000\ndq 0x5152535455565758\n\ndq 0x4008000000000000\ndq 0x5152535455565758\n\ndq 0x4010000000000000\ndq 0x5152535455565758\n\ndq 0xBFF0000000000000\ndq 0x5152535455565758\n\ndq 0xC000000000000000\ndq 0x5152535455565758\n\ndq 0xC008000000000000\ndq 0x5152535455565758\n\ndq 0xC010000000000000\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtsd2ss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x4054C664C2F837B5\", \"0x40516053E2D6238E\", \"0x4044836D86EC17EC\", \"0x402A1E1C58255B03\"],\n    \"XMM1\":  [\"0x401568E0C9D9D346\", \"0x4035FE425AEE6320\", \"0x402359003EEA209B\", \"0x40154B7D41743E96\"],\n    \"XMM2\":  [\"0x403D075A31A4BDBA\", \"0x4050A018BD66277C\", \"0x40334EC17EBAF102\", \"0x4056D7404EA4A8C1\"],\n    \"XMM3\":  [\"0x404439B5C7CD898B\", \"0x40497B136A400FBB\", \"0x4040528BC169C23B\", \"0x4037F9CA18BD6627\"],\n    \"XMM4\":  [\"0x4056A929888F861A\", \"0x403839B866E43AA8\", \"0x4058BC1F212D7732\", \"0x4056CDE5C91D14E4\"],\n    \"XMM5\":  [\"0x4056B34AA10E0221\", \"0x4058DEFB00BCBE62\", \"0x40503E3C9EECBFB1\", \"0x4052997F0ED3D85A\"],\n    \"XMM6\":  [\"0x40419D2253111F0C\", \"0x40395A6BF8769EC3\", \"0x40177E28240B7803\", \"0x40568CC5974E65BF\"],\n    \"XMM7\":  [\"0x4054C66442042015\", \"0x40516053E2D6238E\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x401568E0423F635C\", \"0x4035FE425AEE6320\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x403D075A42C08F50\", \"0x4050A018BD66277C\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x404439B542B062C4\", \"0x40497B136A400FBB\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x4056A929429B697F\", \"0x403839B866E43AA8\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x4056B34A4176837B\", \"0x4058DEFB00BCBE62\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x40419D224253A13B\", \"0x40395A6BF8769EC3\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\nvmovapd ymm5, [rdx + 32 * 5]\nvmovapd ymm6, [rdx + 32 * 6]\n\nvcvtsd2ss xmm7,  xmm0, [rdx + 32 * 7]\nvcvtsd2ss xmm8,  xmm1, [rdx + 32 * 8]\nvcvtsd2ss xmm9,  xmm2, [rdx + 32 * 9]\nvcvtsd2ss xmm10, xmm3, [rdx + 32 * 10]\nvcvtsd2ss xmm11, xmm4, [rdx + 32 * 11]\nvcvtsd2ss xmm12, xmm5, [rdx + 32 * 12]\nvcvtsd2ss xmm13, xmm6, [rdx + 32 * 13]\n\nhlt\n\nalign 32\n.data:\ndq 83.0999, 69.50512\ndq 41.02678, 13.05881\n\ndq 5.35242, 21.9932\ndq 9.67383, 5.32372\n\ndq 29.02872, 66.50151\ndq 19.30764, 91.3633\n\ndq 40.45086, 50.96153\ndq 32.64489, 23.97574\n\ndq 90.64316, 24.22547\ndq 98.9394, 91.21715\n\ndq 90.80143, 99.48407\ndq 64.97245, 74.39838\n\ndq 35.22761, 25.35321\ndq 5.8732, 90.19956\n\ndq 33.03133, 52.02952\ndq 58.38554, 10.17531\n\ndq 47.84703, 84.04831\ndq 90.02965, 65.81329\n\ndq 96.27991, 6.64479\ndq 25.58971, 95.00694\n\ndq 88.1929, 37.16964\ndq 49.52602, 10.27223\n\ndq 77.70605, 20.21439\ndq 9.8056, 41.29389\n\ndq 15.4071, 57.54286\ndq 9.61117, 55.54302\n\ndq 52.90745, 4.88086\ndq 72.52882, 3.0201\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtsi2sd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x3FF0000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x4000000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4008000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4010000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\nmov rax, [rdx + 32]\nmov rbx, [rdx + 40]\n\nvcvtsi2sd xmm1, xmm0, rax\nvcvtsi2sd xmm2, xmm0, ebx\n\nvcvtsi2sd xmm3, xmm0, dword [rdx + 48]\nvcvtsi2sd xmm4, xmm0, qword [rdx + 56]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\ndq 0x0000000000000001\ndq 0x0000000000000002\ndq 0x0000000000000003\ndq 0x0000000000000004\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtsi2ss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM6\":  [\"0x414243443F800000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x4142434440000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x4142434440400000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x4142434440800000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x41424344C0800000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x41424344C0800000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd xmm0, [rdx]\n\nmov rax, [rdx + 32]\nmov rbx, [rdx + 40]\n\nvcvtsi2ss xmm6, xmm0, rax\nvcvtsi2ss xmm7, xmm0, ebx\n\nvcvtsi2ss xmm8, xmm0, dword [rdx + 48]\nvcvtsi2ss xmm9, xmm0, qword [rdx + 56]\n\nmov rbx, [rdx + 64]\n\nvcvtsi2ss xmm10, xmm0, ebx\nvcvtsi2ss xmm11, xmm0, dword [rdx + 64]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\ndq 0x0000000000000001\ndq 0x0000000000000002\ndq 0x0000000000000003\ndq 0x0000000000000004\ndq 0x7FC00000FFFFFFFC ; Stick something in the top 32bits to ensure correctness\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtss2sd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x428B029F42A63326\", \"0x4150F0E342241B6C\", \"0x409C30014253A13B\", \"0x4041495242910EC1\"],\n    \"XMM1\":  [\"0x41AFF21340AB4706\", \"0x40AA5BEA411AC802\", \"0x42662BE34176837B\", \"0x425E2C0D4119C75A\"],\n    \"XMM2\":  [\"0x428500C641E83AD2\", \"0x42B6BA02419A760C\", \"0x41A1B712429B697F\", \"0x42252CF2411CE3BD\"],\n    \"XMM3\":  [\"0x424BD89B4221CDAE\", \"0x41BFCE514202945E\", \"0x4214ADB642B062C4\", \"0x41245B0E42461AA5\"],\n    \"XMM4\":  [\"0x41C1CDC342B5494C\", \"0x42B66F2E42C5E0F9\", \"0x40D4A21F42C08F50\", \"0x42BE038E41CCB7BA\"],\n    \"XMM5\":  [\"0x42C6F7D842B59A55\", \"0x4294CBF84281F1E5\", \"0x42A818BC423F635C\", \"0x4283A06842B40F2E\"],\n    \"XMM6\":  [\"0x41CAD360420CE913\", \"0x42B4662D40BBF141\", \"0x42501E3A42042015\", \"0x4122CE1242698ACB\"],\n    \"XMM7\":  [\"0x40408402A0000000\", \"0x4150F0E342241B6C\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x4047EC6B80000000\", \"0x40AA5BEA411AC802\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x405811EA00000000\", \"0x42B6BA02419A760C\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x40560C5880000000\", \"0x41BFCE514202945E\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x40536D2FE0000000\", \"0x42B66F2E42C5E0F9\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x402ED06F60000000\", \"0x4294CBF84281F1E5\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x404A742760000000\", \"0x42B4662D40BBF141\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\nvmovapd ymm5, [rdx + 32 * 5]\nvmovapd ymm6, [rdx + 32 * 6]\n\n\nvcvtss2sd xmm7,  xmm0, [rdx + 32 * 7]\nvcvtss2sd xmm8,  xmm1, [rdx + 32 * 8]\nvcvtss2sd xmm9,  xmm2, [rdx + 32 * 9]\nvcvtss2sd xmm10, xmm3, [rdx + 32 * 10]\nvcvtss2sd xmm11, xmm4, [rdx + 32 * 11]\nvcvtss2sd xmm12, xmm5, [rdx + 32 * 12]\nvcvtss2sd xmm13, xmm6, [rdx + 32 * 13]\n\nhlt\n\nalign 32\n.data:\ndd 83.0999, 69.50512, 41.02678, 13.05881\ndd 52.90745, 4.88086, 72.52882, 3.0201\n\ndd 5.35242, 21.9932, 9.67383, 5.32372\ndd 15.4071, 57.54286, 9.61117, 55.54302\n\ndd 29.02872, 66.50151, 19.30764, 91.3633\ndd 77.70605, 20.21439, 9.8056, 41.29389\n\ndd 40.45086, 50.96153, 32.64489, 23.97574\ndd 88.1929, 37.16964, 49.52602, 10.27223\n\ndd 90.64316, 24.22547, 98.9394, 91.21715\ndd 96.27991, 6.64479, 25.58971, 95.00694\n\ndd 90.80143, 99.48407, 64.97245, 74.39838\ndd 47.84703, 84.04831, 90.02965, 65.81329\n\ndd 35.22761, 25.35321, 5.8732, 90.19956\ndd 33.03133, 52.02952, 58.38554, 10.17531\n\ndd 33.03133, 52.02952, 58.38554, 10.17531\ndd 83.0999, 69.50512, 41.02678, 13.05881\n\ndd 47.84703, 84.04831, 90.02965, 65.81329\ndd 5.35242, 21.9932, 9.67383, 5.32372\n\ndd 96.27991, 6.64479, 25.58971, 95.00694\ndd 29.02872, 66.50151, 19.30764, 91.3633\n\ndd 88.1929, 37.16964, 49.52602, 10.27223\ndd 40.45086, 50.96153, 32.64489, 23.97574\n\ndd 77.70605, 20.21439, 9.8056, 41.29389\ndd 90.64316, 24.22547, 98.9394, 91.21715\n\ndd 15.4071, 57.54286, 9.61117, 55.54302\ndd 90.80143, 99.48407, 64.97245, 74.39838\n\ndd 52.90745, 4.88086, 72.52882, 3.0201\ndd 35.22761, 25.35321, 5.8732, 90.19956\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvtss2si.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x0000000000000001\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RCX\": \"0x00000000FFFFFFFE\",\n    \"RDX\": \"0xFFFFFFFFFFFFFFFC\"\n  }\n}\n%endif\n\nlea r15, [rel .data]\n\nvmovapd xmm0, [r15 + 8 * 0]\nvmovapd xmm1, [r15 + 8 * 2]\n\nmov rax, -1\nmov rbx, -1\nmov rcx, -1\nmov rdx, -1\n\nvcvtss2si eax, xmm0\nvcvtss2si rbx, xmm1\n\nvcvtss2si ecx, [r15 + 8 * 4]\nvcvtss2si rdx, [r15 + 8 * 6]\n\nhlt\n\nalign 32\n.data:\ndq 0x414243443F800000\ndq 0x5152535455565758\n\ndq 0x41424344BF800000\ndq 0x5152535455565758\n\ndq 0x41424344C0000000\ndq 0x5152535455565758\n\ndq 0x41424344C0800000\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvttpd2dq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000004500000053\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x0000000D00000029\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x0000001500000005\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000500000009\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x000000420000001D\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000005B00000013\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x0000003200000028\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000001700000020\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x000000180000005A\", \"0x000000180000005A\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x0000005B00000062\", \"0x0000005B00000062\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x000000630000005A\", \"0x000000630000005A\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x0000004A00000040\", \"0x0000004A00000040\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x0000001900000023\", \"0x0000001900000023\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x0000005A00000005\", \"0x0000005A00000005\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0000003400000021\", \"0x0000003400000021\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM15\": [\"0x0000000A0000003A\", \"0x0000000A0000003A\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Preload registers with garbage\nvmovaps ymm0,  [rel .random_data + (0 * 32)]\nvmovaps ymm1,  [rel .random_data + (1 * 32)]\nvmovaps ymm2,  [rel .random_data + (2 * 32)]\nvmovaps ymm3,  [rel .random_data + (3 * 32)]\nvmovaps ymm4,  [rel .random_data + (4 * 32)]\nvmovaps ymm5,  [rel .random_data + (5 * 32)]\nvmovaps ymm6,  [rel .random_data + (6 * 32)]\nvmovaps ymm7,  [rel .random_data + (7 * 32)]\nvmovaps ymm8,  [rel .random_data + (8 * 32)]\nvmovaps ymm9,  [rel .random_data + (9 * 32)]\nvmovaps ymm10, [rel .random_data + (10 * 32)]\nvmovaps ymm11, [rel .random_data + (11 * 32)]\nvmovaps ymm12, [rel .random_data + (12 * 32)]\nvmovaps ymm13, [rel .random_data + (13 * 32)]\nvmovaps ymm14, [rel .random_data + (14 * 32)]\nvmovaps ymm15, [rel .random_data + (15 * 32)]\n\nvcvttpd2dq xmm0,  oword [rdx + 32 * 0]\nvcvttpd2dq xmm1,  oword [rdx + 32 * 1]\nvcvttpd2dq xmm2,  oword [rdx + 32 * 2]\nvcvttpd2dq xmm3,  oword [rdx + 32 * 3]\nvcvttpd2dq xmm4,  oword [rdx + 32 * 4]\nvcvttpd2dq xmm5,  oword [rdx + 32 * 5]\nvcvttpd2dq xmm6,  oword [rdx + 32 * 6]\nvcvttpd2dq xmm7,  oword [rdx + 32 * 7]\nvcvttpd2dq xmm8,  yword [rdx + 32 * 8]\nvcvttpd2dq xmm9,  yword [rdx + 32 * 9]\nvcvttpd2dq xmm10, yword [rdx + 32 * 10]\nvcvttpd2dq xmm11, yword [rdx + 32 * 11]\nvcvttpd2dq xmm12, yword [rdx + 32 * 12]\nvcvttpd2dq xmm13, yword [rdx + 32 * 13]\nvcvttpd2dq xmm14, yword [rdx + 32 * 14]\nvcvttpd2dq xmm15, yword [rdx + 32 * 15]\n\nhlt\n\nalign 32\n.data:\ndq 83.0999 , 69.50512\ndq 83.0999 , 69.50512\n\ndq 41.02678, 13.05881\ndq 41.02678, 13.05881\n\ndq 5.35242 , 21.9932\ndq 5.35242 , 21.9932\n\ndq 9.67383 , 5.32372\ndq 9.67383 , 5.32372\n\ndq 29.02872, 66.50151\ndq 29.02872, 66.50151\n\ndq 19.30764, 91.3633\ndq 19.30764, 91.3633\n\ndq 40.45086, 50.96153\ndq 40.45086, 50.96153\n\ndq 32.64489, 23.97574\ndq 32.64489, 23.97574\n\ndq 90.64316, 24.22547\ndq 90.64316, 24.22547\n\ndq 98.9394 , 91.21715\ndq 98.9394 , 91.21715\n\ndq 90.80143, 99.48407\ndq 90.80143, 99.48407\n\ndq 64.97245, 74.39838\ndq 64.97245, 74.39838\n\ndq 35.22761, 25.35321\ndq 35.22761, 25.35321\n\ndq 5.8732  , 90.19956\ndq 5.8732  , 90.19956\n\ndq 33.03133, 52.02952\ndq 33.03133, 52.02952\n\ndq 58.38554, 10.17531\ndq 58.38554, 10.17531\n\ndq 47.84703, 84.04831\ndq 47.84703, 84.04831\n\ndq 90.02965, 65.81329\ndq 90.02965, 65.81329\n\ndq 96.27991, 6.64479\ndq 96.27991, 6.64479\n\ndq 25.58971, 95.00694\ndq 25.58971, 95.00694\n\ndq 88.1929 , 37.16964\ndq 88.1929 , 37.16964\n\ndq 49.52602, 10.27223\ndq 49.52602, 10.27223\n\ndq 77.70605, 20.21439\ndq 77.70605, 20.21439\n\ndq 9.8056  , 41.29389\ndq 9.8056  , 41.29389\n\ndq 15.4071 , 57.54286\ndq 15.4071 , 57.54286\n\ndq 9.61117 , 55.54302\ndq 9.61117 , 55.54302\n\ndq 52.90745, 4.88086\ndq 52.90745, 4.88086\n\ndq 72.52882, 3.0201\ndq 72.52882, 3.0201\n\ndq 56.55091, 71.22749\ndq 56.55091, 71.22749\n\ndq 61.84736, 88.74295\ndq 61.84736, 88.74295\n\ndq 47.72641, 24.17404\ndq 47.72641, 24.17404\n\ndq 33.70564, 96.71303\ndq 33.70564, 96.71303\n\n; 4096 bytes of random data.\n.random_data:\ndb 0x5b, 0x27, 0x12, 0x29, 0xab, 0x84, 0xa2, 0x21, 0x6d, 0x27, 0xbe, 0x3d, 0x17, 0x05, 0x99, 0xb0\ndb 0xf3, 0xe2, 0x19, 0xf4, 0x42, 0xbb, 0x69, 0x02, 0x67, 0x3a, 0xab, 0x86, 0x9e, 0xda, 0x9f, 0xd5\ndb 0xba, 0xd4, 0x2d, 0x9d, 0x20, 0x3d, 0xf8, 0xb2, 0x29, 0xc3, 0xc3, 0x98, 0xa8, 0x30, 0x92, 0xe9\ndb 0x5a, 0x75, 0x0c, 0xcb, 0x28, 0x28, 0xb4, 0x90, 0x93, 0x16, 0x45, 0x10, 0x3a, 0x5d, 0x96, 0x67\ndb 0xf9, 0x31, 0xbe, 0x48, 0x78, 0xe8, 0x5a, 0xf2, 0x66, 0x29, 0xd9, 0x80, 0x50, 0x80, 0xcb, 0x07\ndb 0xfe, 0xda, 0x19, 0x0f, 0x22, 0xea, 0x18, 0x5e, 0x12, 0xea, 0x3d, 0x1a, 0xbc, 0x91, 0x51, 0x15\ndb 0xaa, 0x66, 0x92, 0x61, 0xb4, 0xd4, 0xce, 0x14, 0x9c, 0x86, 0x27, 0x3d, 0xd0, 0xc6, 0x51, 0x1c\ndb 0xa0, 0xd4, 0x0b, 0x2d, 0x25, 0x30, 0x3b, 0x46, 0x23, 0x07, 0xb5, 0x05, 0x4a, 0xaa, 0x5a, 0x0a\ndb 0x7b, 0x29, 0xe4, 0x52, 0x6f, 0x6f, 0xc8, 0x62, 0xb8, 0x94, 0x6a, 0x30, 0x66, 0xf1, 0x21, 0xec\ndb 0xd1, 0xf2, 0x68, 0xda, 0xb7, 0x7f, 0x5a, 0x26, 0x38, 0x46, 0x48, 0xda, 0x5d, 0x64, 0x8d, 0x3d\ndb 0x2f, 0xf6, 0xc3, 0x63, 0xb8, 0x09, 0x3a, 0xd0, 0x5b, 0xeb, 0x67, 0xd0, 0xaa, 0x63, 0x71, 0x19\ndb 0x7e, 0x4e, 0x33, 0xe2, 0x15, 0xba, 0x87, 0xa7, 0x7b, 0x25, 0xe4, 0xbb, 0xb5, 0x26, 0x9a, 0xf1\ndb 0xdd, 0x5a, 0x63, 0xd7, 0x16, 0xc0, 0xc3, 0xc8, 0x1b, 0xad, 0x00, 0x52, 0x63, 0x55, 0xc7, 0xe0\ndb 0xd9, 0xe9, 0xf4, 0x4c, 0x53, 0xfb, 0x73, 0x57, 0xdc, 0xad, 0x0c, 0xca, 0x73, 0x44, 0x6b, 0xf3\ndb 0xb7, 0x83, 0x3b, 0xfe, 0xf0, 0x15, 0xbf, 0xe5, 0x15, 0xca, 0xdf, 0x35, 0xeb, 0xe7, 0xe3, 0xa2\ndb 0xbd, 0x20, 0xad, 0xff, 0x1b, 0x67, 0x0a, 0x9f, 0x60, 0x60, 0xff, 0xa7, 0xc9, 0x19, 0xde, 0xb3\ndb 0x67, 0xf1, 0x4b, 0x77, 0x7f, 0x0b, 0xb1, 0x29, 0xee, 0xcb, 0xd6, 0x5d, 0x0d, 0xb9, 0x54, 0x49\ndb 0x10, 0xe3, 0xbd, 0x8a, 0xa0, 0x69, 0xa3, 0x07, 0xbe, 0x8e, 0xea, 0xc6, 0x75, 0x27, 0x66, 0xae\ndb 0x3c, 0xde, 0xc6, 0x13, 0x1b, 0x50, 0x37, 0x56, 0x7c, 0x01, 0xab, 0x8b, 0x46, 0xdc, 0x80, 0xed\ndb 0xdf, 0x12, 0x6f, 0x64, 0xdf, 0xe6, 0xf9, 0xbf, 0x15, 0x95, 0xd9, 0x80, 0x19, 0x8c, 0x96, 0x33\ndb 0x89, 0xbe, 0x25, 0x33, 0x34, 0x82, 0x92, 0x96, 0x05, 0x52, 0xa2, 0xcf, 0x5b, 0x3d, 0xfc, 0xd8\ndb 0x43, 0x89, 0x2e, 0x16, 0x6d, 0xbd, 0x84, 0x97, 0x77, 0xb5, 0xd6, 0x2b, 0x6b, 0xb1, 0xc6, 0x38\ndb 0x0a, 0xfe, 0xe1, 0xc9, 0x31, 0x32, 0x7f, 0xd5, 0xc1, 0x03, 0x4a, 0xb2, 0x86, 0x4d, 0x8d, 0x77\ndb 0xd6, 0x62, 0x52, 0x75, 0xed, 0x27, 0x21, 0xe8, 0x69, 0x6f, 0x6a, 0x5b, 0x59, 0x4d, 0xd2, 0x6c\ndb 0x2a, 0x97, 0x09, 0x03, 0xc5, 0x29, 0x0d, 0xe1, 0x31, 0x2e, 0x62, 0x21, 0x0e, 0xc2, 0x00, 0x7c\ndb 0xa2, 0x4c, 0x19, 0x63, 0x24, 0xfc, 0x9b, 0x38, 0x11, 0xbf, 0x20, 0x53, 0x53, 0xac, 0x3f, 0xdb\ndb 0xfd, 0x2b, 0x39, 0x3c, 0x39, 0x6b, 0xb4, 0x52, 0x1f, 0xf8, 0x8f, 0x3b, 0x47, 0x2b, 0x86, 0xcf\ndb 0xd2, 0x38, 0xe9, 0x08, 0x73, 0x09, 0x32, 0x5f, 0x6c, 0x3a, 0xdb, 0xfc, 0x1d, 0x91, 0xa4, 0x26\ndb 0xa3, 0x0c, 0xbc, 0x94, 0xf5, 0xbd, 0x29, 0xcf, 0x72, 0x3d, 0xee, 0x48, 0x06, 0x77, 0x63, 0x70\ndb 0x47, 0xc9, 0x87, 0x21, 0xb1, 0x9a, 0xdd, 0x5f, 0x71, 0x08, 0xe3, 0x3b, 0xf6, 0x07, 0x9f, 0x2f\ndb 0x20, 0xa3, 0x02, 0xc8, 0x4d, 0xc8, 0x18, 0xfa, 0x69, 0x32, 0x60, 0x97, 0x2d, 0x2f, 0x26, 0x84\ndb 0x3d, 0x7a, 0xf6, 0x2f, 0xb1, 0xc9, 0xd2, 0xcd, 0x6e, 0x24, 0x18, 0xa8, 0x0d, 0xb0, 0xe2, 0x41\ndb 0x1e, 0xdf, 0xc7, 0xee, 0xcd, 0x21, 0x5b, 0xc3, 0x26, 0x26, 0xb3, 0xb4, 0x33, 0x58, 0x79, 0xb5\ndb 0xc3, 0x24, 0x7c, 0xe3, 0xd7, 0x78, 0x33, 0x22, 0xd5, 0x20, 0x21, 0x86, 0xcf, 0xca, 0x44, 0xba\ndb 0xd8, 0x05, 0x84, 0x37, 0x69, 0x48, 0xb0, 0xe0, 0x7a, 0xe6, 0x74, 0x53, 0x1e, 0xd0, 0x0c, 0x3c\ndb 0x33, 0x83, 0x15, 0x43, 0x16, 0x0e, 0x93, 0x39, 0x55, 0x2e, 0x55, 0x1c, 0x09, 0xbd, 0x7a, 0xc3\ndb 0x80, 0x77, 0x4e, 0xd9, 0xf3, 0xa5, 0xee, 0x94, 0xbf, 0x8e, 0xd0, 0xec, 0x39, 0x33, 0x31, 0x8d\ndb 0x74, 0x94, 0xd2, 0x24, 0x22, 0x4a, 0xde, 0x51, 0x99, 0xc5, 0x68, 0xf2, 0x2e, 0xd3, 0x8d, 0xc5\ndb 0x32, 0x31, 0x26, 0xe7, 0x87, 0x47, 0x5f, 0xbc, 0x32, 0x80, 0x43, 0x83, 0x34, 0x36, 0xa1, 0x72\ndb 0x6b, 0x38, 0x10, 0x93, 0xa7, 0xa3, 0x92, 0xb7, 0x3c, 0x61, 0x1c, 0x4e, 0x0b, 0x86, 0x43, 0xa9\ndb 0x64, 0xf1, 0xf8, 0xd7, 0xd3, 0xf4, 0xd0, 0xe2, 0x17, 0xd4, 0xbb, 0xe9, 0x2c, 0xc8, 0x76, 0xc5\ndb 0x87, 0x7f, 0x81, 0x55, 0xbe, 0x87, 0x0e, 0x6b, 0xf6, 0x4f, 0x44, 0x37, 0x92, 0x32, 0x7f, 0x30\ndb 0xa6, 0x66, 0x09, 0x01, 0x7a, 0x6e, 0xb3, 0x3b, 0x7d, 0x8f, 0x32, 0x0e, 0x3c, 0xdc, 0xba, 0x2e\ndb 0xf8, 0xec, 0xde, 0xd9, 0xb1, 0xf0, 0x3e, 0xbd, 0x20, 0x4d, 0x01, 0x5a, 0xf4, 0xda, 0x99, 0x23\ndb 0x81, 0x01, 0x5f, 0x50, 0xce, 0xa8, 0xb9, 0xb1, 0x59, 0xe5, 0xde, 0x47, 0x5b, 0xba, 0x94, 0xd3\ndb 0x21, 0x7c, 0x49, 0xeb, 0xb5, 0x14, 0xe5, 0x56, 0x93, 0x06, 0x3b, 0xd2, 0x3a, 0x11, 0xca, 0x7a\ndb 0x14, 0x48, 0x54, 0xc7, 0x9f, 0x03, 0x40, 0x2c, 0x0b, 0x42, 0x8e, 0xac, 0xac, 0x08, 0x04, 0x8e\ndb 0xb3, 0x15, 0xe5, 0x06, 0xa6, 0x5b, 0xf0, 0x57, 0x08, 0xfa, 0x0f, 0x00, 0x7e, 0x4a, 0x16, 0xa8\ndb 0xb0, 0x4d, 0x07, 0x1b, 0xbc, 0x3d, 0xd0, 0x86, 0x15, 0xcd, 0x7c, 0xb2, 0xcc, 0x37, 0x6d, 0x15\ndb 0x8b, 0xd1, 0xe6, 0x3e, 0xfb, 0x6e, 0xe4, 0xea, 0xd9, 0x1f, 0x69, 0x2a, 0xbc, 0xda, 0xd9, 0x78\ndb 0xee, 0xcb, 0xb6, 0xff, 0x53, 0xfd, 0xd2, 0xb9, 0x18, 0x1f, 0xdf, 0x0e, 0x69, 0xfe, 0x36, 0xb0\ndb 0x77, 0x28, 0x66, 0xe2, 0xf0, 0x80, 0x4c, 0x11, 0x11, 0xba, 0xb7, 0xfd, 0x67, 0x4f, 0x05, 0xed\ndb 0x0c, 0xcc, 0x3e, 0x4d, 0xd9, 0xbc, 0x52, 0xe3, 0xec, 0xd9, 0x74, 0x29, 0x30, 0xf2, 0x66, 0xd6\ndb 0xfb, 0xc3, 0x5c, 0xc1, 0xd8, 0xef, 0x86, 0x08, 0x22, 0xb1, 0x6d, 0xfd, 0xee, 0xc7, 0x12, 0x25\ndb 0xda, 0xee, 0xd6, 0x28, 0x3b, 0x1d, 0xa7, 0x29, 0xdf, 0x45, 0x3a, 0xa4, 0x36, 0xe0, 0xa4, 0xda\ndb 0xb1, 0x2c, 0x8a, 0xa5, 0x5c, 0x8c, 0x70, 0xd8, 0xcd, 0x0f, 0xb5, 0x63, 0xd3, 0xaf, 0x59, 0x2b\ndb 0x7d, 0x86, 0x4a, 0xc4, 0xcc, 0x72, 0x9e, 0x89, 0xf4, 0x38, 0x89, 0x81, 0x64, 0x6f, 0xa5, 0xac\ndb 0x13, 0x59, 0xc4, 0x0f, 0xfb, 0xcc, 0x4c, 0x1d, 0x67, 0x5a, 0xbf, 0x19, 0xfc, 0x06, 0x71, 0xbd\ndb 0x7f, 0xb6, 0xb1, 0x95, 0xd3, 0x7b, 0x4c, 0x40, 0x91, 0xa9, 0x26, 0xdd, 0x28, 0x69, 0x90, 0xf6\ndb 0x5d, 0x16, 0x9f, 0xa9, 0x75, 0x5e, 0xad, 0x8f, 0xc8, 0x0b, 0x57, 0x48, 0xf2, 0x74, 0x77, 0x22\ndb 0x5d, 0xed, 0xc2, 0x79, 0x27, 0x46, 0x0c, 0x9e, 0x6f, 0x9a, 0x9a, 0xdc, 0xe0, 0x3d, 0x24, 0xc9\ndb 0xce, 0xf3, 0x34, 0x66, 0x45, 0x07, 0x0b, 0x83, 0x8c, 0xb7, 0xd9, 0x1e, 0xac, 0xc6, 0xf7, 0xef\ndb 0xe7, 0xd1, 0xbc, 0xa3, 0x21, 0x85, 0x3d, 0x25, 0x90, 0x24, 0x48, 0xb1, 0x00, 0xb0, 0xd2, 0xa6\ndb 0xd8, 0x4e, 0x46, 0x7c, 0xc4, 0x79, 0x40, 0x95, 0x81, 0xb4, 0xb9, 0xa8, 0x70, 0xf0, 0x12, 0xd6\ndb 0xdc, 0xb2, 0x7c, 0x0f, 0x47, 0xad, 0x7d, 0x46, 0x78, 0x18, 0x6e, 0xdd, 0x5f, 0xe5, 0xd7, 0x63\ndb 0x11, 0xf0, 0x5b, 0xa0, 0x48, 0x15, 0xe2, 0x55, 0xc6, 0x7f, 0xf4, 0x2e, 0x0e, 0x49, 0x39, 0x65\ndb 0x3e, 0x69, 0xc1, 0x27, 0x39, 0xb3, 0x10, 0x1b, 0xf2, 0x35, 0x88, 0x0c, 0x1b, 0xac, 0x4a, 0x15\ndb 0x31, 0x81, 0x63, 0xe5, 0x3d, 0x56, 0x6f, 0x34, 0x06, 0x5b, 0x1d, 0xa0, 0xea, 0x0c, 0x92, 0x6a\ndb 0x22, 0x2b, 0x2d, 0xbb, 0xaf, 0xc5, 0x6d, 0x44, 0x1b, 0xb0, 0x69, 0x06, 0x27, 0x54, 0xa5, 0x7f\ndb 0x07, 0xd4, 0xdc, 0xe5, 0x5c, 0x78, 0x9e, 0xf7, 0x4a, 0x47, 0x9b, 0x21, 0xf6, 0x87, 0x89, 0xad\ndb 0xec, 0xe4, 0xd6, 0x83, 0xd3, 0x7b, 0x34, 0x00, 0x0b, 0x75, 0xba, 0x4c, 0x0f, 0x46, 0xd2, 0x0c\ndb 0x58, 0x1b, 0x0f, 0x19, 0xb5, 0xf5, 0xba, 0x8f, 0xbd, 0x17, 0x51, 0xaf, 0xa6, 0x1a, 0x97, 0x8c\ndb 0x44, 0x30, 0x7c, 0x73, 0x50, 0xca, 0x05, 0xe8, 0x3e, 0x19, 0x4a, 0x5a, 0x6b, 0x4d, 0x01, 0x05\ndb 0xea, 0x1b, 0x70, 0xb6, 0xe6, 0x39, 0x5d, 0x99, 0x3b, 0xae, 0xed, 0x7c, 0xa6, 0xc7, 0x29, 0x6f\ndb 0xeb, 0x0a, 0xba, 0x03, 0xd3, 0xba, 0x62, 0x21, 0xa0, 0xb7, 0xb5, 0xbf, 0x40, 0xb8, 0x4e, 0xc3\ndb 0x89, 0xa0, 0xa9, 0xe8, 0xc8, 0x2b, 0xfd, 0x23, 0x32, 0x53, 0xe5, 0x35, 0xc1, 0x23, 0x97, 0xc1\ndb 0x87, 0x10, 0x41, 0x21, 0xb3, 0xf6, 0x53, 0xcf, 0x28, 0x47, 0x9c, 0x69, 0x42, 0xcf, 0x0e, 0x11\ndb 0x69, 0x7f, 0xc6, 0xdf, 0xc3, 0xbf, 0x04, 0x7f, 0x3a, 0xc6, 0xa1, 0x3d, 0xc6, 0x5b, 0x56, 0x8b\ndb 0x52, 0x23, 0x41, 0xd7, 0x35, 0x7f, 0x86, 0xd2, 0x59, 0xcf, 0xae, 0x28, 0xa3, 0xa2, 0x23, 0x4b\ndb 0x78, 0x78, 0x94, 0x3f, 0x2f, 0xf0, 0xb8, 0x94, 0xa2, 0x62, 0xb9, 0x83, 0xc7, 0x5f, 0x64, 0x45\ndb 0x54, 0xaf, 0x43, 0x93, 0x7f, 0xa1, 0xe8, 0x71, 0x38, 0xc8, 0x21, 0xf4, 0xa6, 0xab, 0x2b, 0xd3\ndb 0x44, 0xa2, 0x74, 0x94, 0x99, 0x3f, 0x56, 0xbc, 0x0a, 0x12, 0xe7, 0x6e, 0x1b, 0x7f, 0x98, 0xad\ndb 0x28, 0xa6, 0xc8, 0x87, 0x7a, 0x88, 0xcb, 0xcf, 0x9f, 0x95, 0xa7, 0xf1, 0x66, 0xfe, 0x43, 0x3d\ndb 0x71, 0x5b, 0x3a, 0xb7, 0xe4, 0xa8, 0x6f, 0x46, 0xa1, 0xaa, 0x66, 0xd2, 0x9e, 0x84, 0xfd, 0x42\ndb 0x98, 0x17, 0x3e, 0xde, 0xaa, 0x18, 0xc9, 0x9c, 0x53, 0x88, 0x2b, 0x92, 0xce, 0x00, 0x8b, 0xb4\ndb 0x15, 0x7a, 0x39, 0xb7, 0x57, 0xf9, 0xf2, 0x17, 0x0a, 0x8c, 0x05, 0x7b, 0x3f, 0x2a, 0xb0, 0xb7\ndb 0x8a, 0xbb, 0x9a, 0x0d, 0xe4, 0x0d, 0x6a, 0xbd, 0x8a, 0xe9, 0xbd, 0xca, 0xb2, 0x6a, 0xbe, 0x76\ndb 0x2c, 0xbe, 0x45, 0x3f, 0x22, 0x03, 0xb1, 0xab, 0x2d, 0xe0, 0x70, 0x52, 0xe5, 0x27, 0x8e, 0xbc\ndb 0xa9, 0x8d, 0x13, 0xf4, 0xe5, 0xd7, 0xeb, 0x4e, 0x30, 0x3f, 0x76, 0x3b, 0x64, 0xad, 0x57, 0x53\ndb 0x91, 0x89, 0xf4, 0x9a, 0xd1, 0x38, 0x3d, 0x58, 0xdc, 0x83, 0x65, 0x4a, 0x36, 0x30, 0x73, 0x92\ndb 0x8c, 0x2f, 0x7d, 0x1e, 0x15, 0x3c, 0xca, 0x54, 0x6f, 0x17, 0xbd, 0xba, 0x97, 0x7e, 0x28, 0x11\ndb 0x8e, 0x96, 0x9f, 0x46, 0x84, 0x69, 0xe3, 0xc2, 0x8e, 0x1e, 0xea, 0x6b, 0x17, 0xa7, 0xf8, 0x17\ndb 0xc3, 0xd9, 0x9c, 0x53, 0x79, 0x95, 0x32, 0xf6, 0x78, 0xcd, 0x5d, 0x2f, 0x30, 0x06, 0xe8, 0x9f\ndb 0x5e, 0xb2, 0x4e, 0x56, 0xf5, 0x31, 0xc3, 0x41, 0xae, 0x4b, 0x0a, 0xbd, 0xdc, 0xce, 0xea, 0xfa\ndb 0x27, 0x09, 0x4e, 0xd1, 0x24, 0x14, 0x33, 0x8b, 0x21, 0x48, 0x99, 0x92, 0x07, 0xa4, 0x1a, 0x87\ndb 0x34, 0x15, 0xa6, 0x12, 0x92, 0x3f, 0xf0, 0x3e, 0x18, 0x3c, 0x65, 0x3a, 0x8b, 0x17, 0x9b, 0xf2\ndb 0xd9, 0x93, 0xa0, 0x19, 0x2b, 0x73, 0x59, 0x29, 0x6f, 0xb7, 0x75, 0x4b, 0x42, 0x24, 0x43, 0xa4\ndb 0x20, 0xd8, 0x59, 0x8d, 0x9f, 0xd6, 0x64, 0xa1, 0xeb, 0xe3, 0x65, 0x82, 0x69, 0x74, 0x1a, 0x2b\ndb 0x8d, 0x9a, 0x59, 0x5d, 0x47, 0x75, 0x63, 0xcd, 0xe4, 0x14, 0x48, 0x5f, 0x67, 0x00, 0x12, 0x3c\ndb 0x58, 0x27, 0x5e, 0x83, 0xde, 0xd8, 0x97, 0xd9, 0x09, 0xd9, 0x06, 0x64, 0x96, 0x67, 0xb4, 0x4f\ndb 0xb9, 0x58, 0x87, 0xc9, 0xb1, 0xdd, 0x64, 0x8f, 0x4e, 0x8f, 0xa9, 0xfa, 0x40, 0xe6, 0x8f, 0xaa\ndb 0x22, 0x26, 0x16, 0x15, 0x6a, 0xa3, 0x88, 0xae, 0xa2, 0xbc, 0xa3, 0xa3, 0x56, 0xa1, 0x74, 0x6c\ndb 0xa2, 0xd0, 0x47, 0x4b, 0x98, 0x0a, 0xea, 0xdd, 0xe8, 0x9c, 0xe1, 0x37, 0x44, 0x1a, 0xc0, 0xc7\ndb 0x83, 0x07, 0x42, 0xca, 0x98, 0x36, 0xd7, 0x43, 0x18, 0x51, 0x32, 0xf6, 0x99, 0x61, 0x73, 0x79\ndb 0x51, 0xc4, 0xe9, 0x5b, 0x9e, 0xa8, 0xb4, 0x28, 0x49, 0xbb, 0x44, 0x90, 0xe2, 0xf7, 0x7e, 0x61\ndb 0x27, 0xbb, 0x85, 0x58, 0xd0, 0xdc, 0x94, 0x53, 0x02, 0x50, 0xfe, 0xc7, 0x37, 0xa2, 0x20, 0x1b\ndb 0x57, 0x00, 0x9b, 0x7c, 0xa4, 0x6c, 0xa6, 0xb1, 0xae, 0xd0, 0x03, 0x67, 0x2b, 0x82, 0xd9, 0x99\ndb 0x76, 0xd0, 0xc7, 0x7d, 0x2d, 0xbd, 0x39, 0x28, 0xcf, 0xe1, 0x13, 0xce, 0x1c, 0xe6, 0x4c, 0xa7\ndb 0x7a, 0x8c, 0x4f, 0xa6, 0x30, 0x77, 0x6b, 0x78, 0x39, 0x6e, 0x10, 0xd1, 0x9c, 0x9a, 0xda, 0x2d\ndb 0xc9, 0xef, 0xd7, 0xb1, 0xb8, 0xdf, 0x21, 0xce, 0x96, 0x53, 0xaa, 0xa6, 0x76, 0x52, 0x56, 0x0e\ndb 0xe6, 0x7f, 0xed, 0x88, 0x15, 0x2a, 0xc1, 0xfe, 0xb3, 0x35, 0x54, 0x09, 0x9b, 0x5d, 0x21, 0x62\ndb 0xc8, 0x6f, 0x2c, 0x6e, 0x56, 0xc8, 0xd9, 0x40, 0x67, 0xeb, 0x26, 0xf5, 0xcb, 0x18, 0xb1, 0x89\ndb 0xfe, 0x58, 0x1a, 0xff, 0x41, 0xb5, 0xd6, 0xe5, 0xb3, 0x82, 0x29, 0x82, 0xee, 0xbb, 0xb2, 0x5a\ndb 0x71, 0xf2, 0xca, 0xf1, 0x2f, 0xa7, 0x4d, 0xb1, 0x5c, 0xbc, 0xc3, 0x1a, 0xb4, 0x20, 0x6a, 0x7e\ndb 0xb9, 0x5e, 0xcb, 0x9b, 0xf3, 0x1c, 0x2b, 0x16, 0xab, 0x15, 0x8d, 0xb5, 0x81, 0xf3, 0xbb, 0xc1\ndb 0x8e, 0x2c, 0xd6, 0xd1, 0xa8, 0x23, 0x3c, 0x98, 0x3f, 0x4e, 0xff, 0x97, 0x77, 0xd1, 0xbd, 0xda\ndb 0xff, 0x9c, 0x55, 0x01, 0x1c, 0x4b, 0x4b, 0x1a, 0xa9, 0x3d, 0xe9, 0xbd, 0x3c, 0x5b, 0xfd, 0x65\ndb 0x34, 0x9c, 0x78, 0x8c, 0x83, 0x46, 0x72, 0xed, 0x66, 0xee, 0x00, 0xac, 0xca, 0x09, 0xaa, 0x3a\ndb 0x2c, 0xc1, 0x7e, 0xde, 0x44, 0xbd, 0xe3, 0x5a, 0x11, 0x41, 0xc7, 0xc8, 0x65, 0x7a, 0xc7, 0xbb\ndb 0x44, 0xad, 0x97, 0x17, 0xe8, 0x9f, 0x29, 0x2b, 0x78, 0x6d, 0x96, 0xb6, 0x9c, 0x3a, 0x6a, 0xc2\ndb 0xab, 0x9a, 0x16, 0x6f, 0x05, 0x78, 0x0d, 0x83, 0xa5, 0x46, 0x8c, 0xd7, 0x57, 0x1e, 0x80, 0x2f\ndb 0x7e, 0x81, 0x68, 0xa4, 0xc4, 0x3d, 0x6c, 0xae, 0x6b, 0x98, 0xb9, 0xe4, 0xb4, 0xfb, 0xf4, 0x19\ndb 0xf9, 0xcd, 0xbb, 0xd0, 0xbc, 0x22, 0xdd, 0x2c, 0xbe, 0x11, 0x01, 0xc2, 0x53, 0xdd, 0xa3, 0x3a\ndb 0xbf, 0x5f, 0x2a, 0x94, 0x8b, 0x58, 0x6e, 0xe3, 0x4e, 0x1b, 0x0d, 0x30, 0x1b, 0x1c, 0x6c, 0x24\ndb 0x0e, 0xd9, 0x1c, 0xe1, 0x4d, 0x42, 0x48, 0xa0, 0x07, 0xb1, 0xe8, 0x10, 0xa1, 0x51, 0x6a, 0x82\ndb 0x2e, 0x99, 0xb3, 0xbf, 0xe3, 0xff, 0x3c, 0x77, 0xf4, 0x0c, 0x1f, 0x22, 0x53, 0xd0, 0x99, 0x60\ndb 0x5d, 0x65, 0x80, 0xb9, 0xa3, 0xb7, 0x25, 0x6d, 0xa6, 0x4f, 0xb5, 0x72, 0xaa, 0x4d, 0x0d, 0x49\ndb 0x4c, 0x34, 0xc5, 0xf4, 0x1b, 0x5c, 0x3f, 0x6c, 0xbb, 0x86, 0xba, 0xc5, 0x32, 0xee, 0x23, 0x95\ndb 0xe5, 0x42, 0x66, 0x92, 0x89, 0x5e, 0xf4, 0xd4, 0x2d, 0x04, 0xf2, 0xbc, 0xd7, 0xc8, 0xc9, 0xd7\ndb 0xe3, 0xdb, 0x4e, 0x4b, 0xda, 0x37, 0x1f, 0xfa, 0x9c, 0xaf, 0x4b, 0x1e, 0xab, 0x64, 0x2a, 0x59\ndb 0x24, 0x0f, 0xb4, 0xaf, 0xd6, 0x32, 0x30, 0xcd, 0x7c, 0xf3, 0x0f, 0xa9, 0xac, 0x3f, 0x55, 0xa2\ndb 0x92, 0x21, 0x58, 0x4e, 0x99, 0xbc, 0x9f, 0xfd, 0x16, 0x7c, 0x4e, 0x5b, 0xb4, 0xc7, 0x5f, 0x8d\ndb 0x0e, 0x26, 0x72, 0x17, 0x02, 0x7d, 0x12, 0xa0, 0xc5, 0xc1, 0x66, 0xd3, 0x19, 0x49, 0x42, 0xfb\ndb 0x18, 0xd7, 0x18, 0x79, 0xd3, 0x32, 0xfc, 0x4a, 0xab, 0x82, 0x72, 0x0a, 0x90, 0xb7, 0xbc, 0x00\ndb 0x16, 0x99, 0xd3, 0x9a, 0x76, 0xc6, 0x44, 0x92, 0x9b, 0x2b, 0x6a, 0x35, 0xca, 0x4e, 0x2e, 0x9c\ndb 0x7f, 0xcb, 0xd3, 0x65, 0x1c, 0xa6, 0x95, 0x2c, 0x3d, 0xe4, 0xd3, 0xe6, 0xe7, 0xe0, 0xde, 0x1e\ndb 0x54, 0xb3, 0x09, 0x3e, 0x34, 0x35, 0x68, 0x53, 0x01, 0x02, 0xf1, 0x4c, 0x89, 0x19, 0xe3, 0xc6\ndb 0x4a, 0x51, 0x49, 0xf5, 0x5f, 0x3e, 0xcd, 0xae, 0x6e, 0xeb, 0x90, 0x1a, 0x53, 0x93, 0x0b, 0xe8\ndb 0xc2, 0x6e, 0xee, 0xf3, 0x38, 0x5d, 0xb8, 0xaf, 0x58, 0x4b, 0xe0, 0xfd, 0x07, 0xcf, 0x15, 0x89\ndb 0x2b, 0x01, 0x35, 0xbb, 0xa0, 0x2f, 0x7e, 0xd3, 0x34, 0x7b, 0x1f, 0x81, 0x12, 0x7f, 0xb0, 0xff\ndb 0xe7, 0xa0, 0xf2, 0xc4, 0x86, 0x98, 0x45, 0xe2, 0xa1, 0x1e, 0x4c, 0xc0, 0x23, 0x05, 0x49, 0x0b\ndb 0x0d, 0xc3, 0x1e, 0x30, 0x20, 0xc6, 0x34, 0xb7, 0xe1, 0x09, 0x84, 0xd5, 0x2a, 0x40, 0x75, 0x9b\ndb 0x46, 0xbb, 0xa5, 0xfe, 0xbd, 0x7d, 0x39, 0xe4, 0x7b, 0x38, 0xdc, 0x9c, 0xaf, 0xc8, 0x12, 0xf4\ndb 0x78, 0xb8, 0x51, 0x4a, 0x21, 0xfe, 0xf9, 0x77, 0xf6, 0xb5, 0xad, 0x69, 0xc9, 0x4d, 0xbf, 0x67\ndb 0xfc, 0x5d, 0x80, 0x7c, 0x76, 0x2c, 0xe5, 0xf2, 0xd7, 0x7f, 0xce, 0xb5, 0x1c, 0x09, 0xa5, 0xc3\ndb 0x98, 0x18, 0x2d, 0x18, 0xfb, 0x61, 0x13, 0xea, 0xbc, 0x87, 0x3a, 0x3f, 0xb4, 0xaf, 0x3c, 0x3b\ndb 0x3b, 0xb6, 0xd2, 0xc7, 0x5c, 0x2c, 0xe1, 0x11, 0xb3, 0x9d, 0xf1, 0x52, 0xba, 0xb5, 0xf0, 0x69\ndb 0xcd, 0xd2, 0x93, 0x9e, 0x80, 0x45, 0x78, 0x17, 0x6d, 0x52, 0x51, 0xad, 0xed, 0x6d, 0x9e, 0x15\ndb 0xca, 0xb1, 0xfe, 0x22, 0x7b, 0x87, 0xb8, 0x40, 0x06, 0x2d, 0xb0, 0xbb, 0x05, 0x7c, 0x52, 0xd2\ndb 0xcd, 0xc8, 0x9c, 0xea, 0xd3, 0x4c, 0xb5, 0x06, 0xb4, 0x70, 0xad, 0x09, 0xa5, 0xb8, 0x66, 0xba\ndb 0x31, 0x0d, 0xe0, 0xe2, 0xcf, 0x62, 0x9f, 0x6d, 0x6d, 0x1a, 0x47, 0x21, 0xd5, 0x33, 0x6b, 0xd7\ndb 0x75, 0xff, 0x98, 0x6c, 0xb2, 0x78, 0x6d, 0x45, 0x50, 0xeb, 0xfb, 0xea, 0xb7, 0x2a, 0x27, 0x02\ndb 0xc4, 0x03, 0xde, 0x56, 0x23, 0x26, 0x10, 0x21, 0x57, 0x9c, 0x3b, 0x4c, 0x79, 0x2c, 0x3e, 0xfe\ndb 0xc8, 0x16, 0xe4, 0xd6, 0x60, 0xb8, 0x46, 0xe3, 0x4b, 0x7e, 0x3d, 0xb3, 0x83, 0x19, 0x54, 0x65\ndb 0x51, 0x7a, 0x81, 0xdd, 0x07, 0x33, 0x92, 0x08, 0x64, 0x0b, 0xc2, 0x06, 0x5c, 0x07, 0x81, 0x40\ndb 0x1b, 0xb4, 0x5a, 0x47, 0x2b, 0xdc, 0x96, 0x98, 0x4c, 0x65, 0xad, 0x8e, 0x8e, 0x77, 0xbe, 0x99\ndb 0x60, 0x4c, 0xb5, 0x6b, 0xed, 0xb7, 0x52, 0x5d, 0x99, 0x2e, 0x93, 0x40, 0xfe, 0x45, 0x83, 0x28\ndb 0x9b, 0x8b, 0x7f, 0x77, 0x2b, 0xdc, 0x61, 0xbe, 0x62, 0x28, 0xe8, 0x23, 0x3f, 0xdb, 0x1d, 0x6d\ndb 0x3b, 0xe8, 0x90, 0x05, 0x12, 0xf2, 0xb4, 0xf0, 0x1b, 0xbb, 0x2f, 0x4b, 0x9e, 0x9f, 0x0e, 0x4e\ndb 0x9e, 0x6a, 0x38, 0x7e, 0x97, 0x13, 0x90, 0x57, 0xb9, 0x49, 0x52, 0xb7, 0x4f, 0xd3, 0xc1, 0x39\ndb 0x95, 0x20, 0xd4, 0x83, 0x48, 0x0e, 0x7a, 0x9d, 0x89, 0x9d, 0xf4, 0xec, 0xe7, 0xcc, 0xde, 0x0a\ndb 0xac, 0xc5, 0xb0, 0x4d, 0xc5, 0x25, 0x74, 0x62, 0x66, 0x51, 0x4f, 0xeb, 0x4e, 0x9d, 0x3d, 0x04\ndb 0x27, 0xec, 0xfe, 0x8d, 0x03, 0x20, 0x38, 0x30, 0x5d, 0xf3, 0xf0, 0x97, 0xbb, 0xa9, 0xd1, 0xea\ndb 0x73, 0x73, 0x40, 0x2c, 0x0b, 0xa7, 0xc9, 0x8d, 0xac, 0x75, 0xc4, 0x46, 0x7c, 0xc2, 0x9a, 0x26\ndb 0x07, 0xae, 0x02, 0x27, 0x42, 0xa8, 0x90, 0xb6, 0x9b, 0x98, 0xec, 0x2e, 0xf6, 0xf6, 0x17, 0xda\ndb 0x9f, 0xfb, 0x54, 0xea, 0xae, 0x96, 0xfe, 0xd6, 0x35, 0x4f, 0x07, 0x9f, 0xf4, 0x57, 0x36, 0xfe\ndb 0xb1, 0x43, 0xee, 0xe3, 0x21, 0x00, 0x43, 0x12, 0xf2, 0xff, 0xa5, 0x37, 0x65, 0x01, 0xf0, 0xb4\ndb 0xe8, 0x68, 0xa3, 0xff, 0x31, 0x5f, 0x3f, 0x56, 0xa5, 0xd2, 0xcc, 0xab, 0xa4, 0x90, 0xf9, 0x98\ndb 0x0b, 0xdc, 0x0d, 0x20, 0x3c, 0x33, 0xda, 0xf1, 0x54, 0xd5, 0x6d, 0xc4, 0xa9, 0xc4, 0x54, 0x29\ndb 0x56, 0x69, 0x96, 0x98, 0x74, 0x13, 0x72, 0x1f, 0x95, 0xe9, 0xe2, 0xab, 0x60, 0x74, 0x91, 0x96\ndb 0xdf, 0xa4, 0xd6, 0x62, 0x3c, 0x35, 0x7e, 0xc4, 0x21, 0x16, 0xa3, 0x32, 0xac, 0x20, 0x52, 0xd4\ndb 0xbb, 0xc2, 0xa5, 0x97, 0x86, 0x4a, 0x55, 0xf4, 0x09, 0xf2, 0x0e, 0xd6, 0x1a, 0xfa, 0x00, 0x67\ndb 0x45, 0x57, 0xb3, 0xaa, 0xe5, 0x7c, 0x17, 0x8d, 0xde, 0x75, 0xd7, 0x49, 0x6e, 0xb0, 0xb2, 0xa0\ndb 0x58, 0xd8, 0x01, 0xf0, 0x22, 0x9c, 0xe4, 0xeb, 0x71, 0x5f, 0x4d, 0x38, 0xf2, 0x7e, 0xee, 0xba\ndb 0xf9, 0x39, 0xff, 0x42, 0x91, 0x00, 0x63, 0x5c, 0x86, 0x02, 0x81, 0x51, 0x10, 0xfb, 0xcf, 0x2a\ndb 0xcf, 0x16, 0xd9, 0x8f, 0x3a, 0xbb, 0x29, 0xcb, 0xe2, 0xc9, 0xd9, 0xe2, 0xd9, 0x05, 0x1b, 0x46\ndb 0x08, 0x2c, 0x6d, 0x5b, 0x1a, 0x7d, 0x5b, 0xca, 0x5b, 0xae, 0x18, 0x48, 0x15, 0x3b, 0x85, 0xd1\ndb 0x29, 0xcf, 0xaf, 0xa5, 0x68, 0xe9, 0x8d, 0x9e, 0x0b, 0xe1, 0x55, 0x54, 0x68, 0x28, 0x9b, 0x4c\ndb 0x94, 0x30, 0x3a, 0xc0, 0xaa, 0xf8, 0xeb, 0x7b, 0x58, 0x53, 0x5f, 0x25, 0x2e, 0xbf, 0x72, 0x26\ndb 0xd8, 0x9c, 0xa9, 0xfe, 0x30, 0xe0, 0x68, 0x25, 0xba, 0x71, 0x1a, 0x82, 0xbb, 0xee, 0x03, 0xc9\ndb 0x4b, 0x0a, 0x22, 0xda, 0x93, 0xa0, 0x72, 0x49, 0x72, 0x3a, 0x8f, 0xbe, 0x39, 0x04, 0x7c, 0x06\ndb 0xa1, 0x50, 0xa1, 0x94, 0xb4, 0x66, 0x91, 0xee, 0x76, 0xa4, 0xbe, 0x21, 0x33, 0xbe, 0xa9, 0x68\ndb 0xe6, 0x03, 0xdd, 0x25, 0x3b, 0x78, 0xe3, 0x5a, 0x0c, 0xcf, 0x2b, 0xa2, 0x03, 0x63, 0x8d, 0xd7\ndb 0xc4, 0xf0, 0x6e, 0xea, 0xe1, 0x76, 0x93, 0x38, 0x7b, 0x85, 0xef, 0xff, 0xce, 0xb0, 0xe1, 0xe3\ndb 0x86, 0x3d, 0xb6, 0xae, 0xee, 0xf7, 0x92, 0x8a, 0x1b, 0x29, 0x00, 0x9b, 0x85, 0xaf, 0xa2, 0x5e\ndb 0x90, 0xd9, 0xdc, 0xca, 0xde, 0xde, 0xab, 0xfe, 0x05, 0x61, 0x3c, 0xb6, 0x2f, 0x40, 0x59, 0x1f\ndb 0x73, 0x80, 0x52, 0xf6, 0x6f, 0x28, 0x30, 0x4b, 0xf2, 0x88, 0x9e, 0x63, 0x84, 0x1b, 0xd2, 0xf4\ndb 0x67, 0x3b, 0xaf, 0x48, 0x27, 0xfd, 0x7e, 0x30, 0x6e, 0xb8, 0x81, 0xbf, 0xe5, 0x4c, 0x19, 0x16\ndb 0x24, 0xd0, 0x8e, 0x3a, 0xc9, 0xcd, 0xc8, 0x6f, 0x2e, 0x99, 0xda, 0xb8, 0x7c, 0xd9, 0xbb, 0x2c\ndb 0xe3, 0xdf, 0xd0, 0x96, 0xe2, 0xcc, 0x99, 0x5b, 0x1d, 0xff, 0x81, 0x74, 0x84, 0x0b, 0x9d, 0x09\ndb 0x3e, 0x1b, 0x0c, 0x42, 0x3d, 0x96, 0x15, 0x44, 0xed, 0x97, 0x9a, 0x99, 0x68, 0x02, 0x2c, 0x79\ndb 0x8f, 0xcc, 0xff, 0x83, 0x5e, 0x6e, 0x97, 0x00, 0x50, 0x83, 0xc2, 0x29, 0x2b, 0x27, 0xe6, 0x4f\ndb 0x18, 0xb0, 0x45, 0xa9, 0xf8, 0x30, 0x35, 0x7f, 0x20, 0xdd, 0xd7, 0x07, 0x32, 0x55, 0x95, 0x4a\ndb 0xf3, 0xf5, 0x35, 0x5b, 0xac, 0xef, 0xfa, 0xbb, 0x54, 0xba, 0x4d, 0x79, 0x66, 0xce, 0x38, 0x5e\ndb 0x23, 0xd7, 0x1b, 0x03, 0x37, 0x74, 0xa7, 0xe0, 0xb1, 0x2c, 0xe5, 0xa4, 0x00, 0x36, 0x9a, 0xe9\ndb 0x36, 0xd4, 0x3e, 0x35, 0x37, 0xb2, 0xc1, 0x71, 0x90, 0x80, 0x3b, 0xd8, 0x6b, 0x7e, 0x79, 0x0a\ndb 0x7d, 0xe3, 0x3d, 0xc8, 0xd3, 0xb3, 0x56, 0xb6, 0xef, 0x73, 0x3d, 0x24, 0x07, 0x0e, 0xeb, 0x8e\ndb 0x9b, 0x25, 0xaf, 0x3b, 0xa3, 0x92, 0xf5, 0x19, 0x16, 0xba, 0x1f, 0x6f, 0x92, 0x4b, 0x3f, 0x3c\ndb 0xc8, 0xac, 0xdd, 0x70, 0xc6, 0x3b, 0x45, 0x0b, 0xa5, 0xe0, 0x8f, 0xa4, 0xd6, 0x56, 0xd8, 0xb9\ndb 0xc1, 0x1a, 0x53, 0x76, 0x37, 0x60, 0xc9, 0xf4, 0xc8, 0x0a, 0x17, 0x6d, 0x1d, 0xb8, 0x8e, 0xec\ndb 0xa8, 0x9c, 0x71, 0x08, 0x1f, 0x45, 0x96, 0xc8, 0xed, 0x1e, 0x47, 0x09, 0xbb, 0xe6, 0xee, 0x36\ndb 0x8e, 0x87, 0xc6, 0xeb, 0xe5, 0x88, 0xd8, 0xab, 0x98, 0x41, 0x4f, 0x2a, 0x49, 0x15, 0x68, 0xf6\ndb 0x51, 0xaf, 0xc7, 0x74, 0x7c, 0xaa, 0x26, 0x1a, 0x2f, 0xe6, 0x96, 0x86, 0x7c, 0x00, 0xa4, 0x57\ndb 0x90, 0x1f, 0x83, 0x02, 0x0c, 0xb2, 0xec, 0x27, 0x7f, 0xbc, 0x78, 0x11, 0x64, 0xbe, 0x34, 0x25\ndb 0xbd, 0xf8, 0x56, 0x00, 0x5f, 0xdd, 0x85, 0x95, 0x23, 0xad, 0xe9, 0x26, 0x1e, 0xd3, 0xfc, 0x22\ndb 0xe6, 0x35, 0x07, 0xbc, 0xf6, 0x88, 0x19, 0x61, 0x2e, 0xd5, 0x0d, 0xc0, 0x98, 0x79, 0x59, 0x0a\ndb 0x33, 0x44, 0xa8, 0x70, 0xd8, 0xda, 0x45, 0x72, 0xdb, 0x83, 0xf7, 0xbe, 0xbb, 0x93, 0xc9, 0xaa\ndb 0xf5, 0xfb, 0xdc, 0x0a, 0x55, 0x54, 0xd1, 0xae, 0x9e, 0x14, 0x38, 0x24, 0x06, 0x6e, 0x4d, 0x17\ndb 0xaa, 0xb1, 0xe4, 0x55, 0x9b, 0x7c, 0xc2, 0xe7, 0xb6, 0x82, 0x1b, 0x5d, 0x21, 0x20, 0xfc, 0x34\ndb 0x51, 0xf7, 0xfd, 0x20, 0x17, 0x4b, 0xd1, 0x9f, 0xc7, 0x2a, 0x57, 0x62, 0x4a, 0x60, 0x3f, 0xfa\ndb 0x70, 0x75, 0x1a, 0x3e, 0x9d, 0xbd, 0x6c, 0xe3, 0x60, 0xc3, 0xd3, 0xa6, 0x3b, 0x73, 0xa5, 0x4f\ndb 0x06, 0x79, 0xf4, 0x6e, 0x3a, 0xae, 0xa4, 0x98, 0x86, 0xb9, 0x1b, 0x8b, 0x66, 0xd9, 0x96, 0xdb\ndb 0xa5, 0x47, 0xd3, 0xa8, 0x05, 0x3c, 0x50, 0x57, 0x8a, 0x8f, 0xe0, 0x7f, 0xaf, 0x75, 0x30, 0x44\ndb 0x01, 0xce, 0x17, 0xb8, 0x89, 0xd4, 0x12, 0xaa, 0xe5, 0x2e, 0xe2, 0x75, 0x70, 0x06, 0x02, 0x5c\ndb 0xbd, 0x85, 0xaa, 0x75, 0x02, 0x98, 0xe0, 0x0f, 0xe9, 0x94, 0x43, 0x84, 0x8c, 0xca, 0xc1, 0x53\ndb 0x2f, 0x5c, 0x9a, 0x04, 0x9c, 0x2c, 0x50, 0xc7, 0x6d, 0x13, 0x70, 0x8f, 0x7d, 0xa5, 0x09, 0xc0\ndb 0x2b, 0x75, 0x55, 0x57, 0xc0, 0x51, 0xad, 0x86, 0x18, 0xc5, 0x9a, 0x9f, 0x1d, 0x99, 0x3e, 0xbd\ndb 0x38, 0x24, 0x33, 0xd6, 0x04, 0x98, 0xde, 0x19, 0xcc, 0xb3, 0x72, 0x53, 0x6b, 0xbb, 0x38, 0x03\ndb 0xdc, 0x86, 0xe3, 0x1b, 0x12, 0x04, 0x86, 0x92, 0x3d, 0x3f, 0xf4, 0x4d, 0x73, 0x8a, 0xe7, 0x67\ndb 0x68, 0xae, 0x63, 0x13, 0x7b, 0x48, 0x90, 0xce, 0x35, 0xfb, 0xf3, 0x46, 0x17, 0xb3, 0xcd, 0x2f\ndb 0xeb, 0xb5, 0x7a, 0x11, 0xa9, 0xe1, 0xa6, 0xab, 0x0c, 0x9e, 0x9f, 0xd1, 0x08, 0xae, 0xc1, 0x68\ndb 0xd2, 0xfc, 0x41, 0x36, 0xa8, 0xf4, 0x97, 0xbf, 0x86, 0x61, 0x90, 0x51, 0x02, 0x2e, 0x9a, 0x64\ndb 0x4e, 0xfb, 0xd1, 0xe5, 0x73, 0x24, 0x07, 0xb5, 0x70, 0xa1, 0xa2, 0xb7, 0xcb, 0x0c, 0xbc, 0x1a\ndb 0x4a, 0x55, 0x9e, 0x3f, 0x3b, 0xdb, 0x33, 0x4c, 0x01, 0x63, 0x1f, 0xbe, 0xae, 0x05, 0x3e, 0x45\ndb 0x9e, 0xcf, 0x2e, 0x5f, 0x3b, 0x83, 0x8a, 0xc7, 0xd7, 0x39, 0x3b, 0xfc, 0x54, 0xf0, 0x10, 0x42\ndb 0x9d, 0x5e, 0x12, 0xc2, 0xb8, 0x8c, 0x4e, 0x26, 0xd7, 0xa0, 0xa1, 0x7a, 0xc0, 0x27, 0x72, 0x52\ndb 0xdb, 0xc5, 0xed, 0xe1, 0x86, 0x19, 0x0a, 0xff, 0x43, 0x3d, 0x1c, 0x12, 0xb2, 0xbe, 0x5c, 0x12\ndb 0x4b, 0xbf, 0xff, 0x20, 0xe3, 0xde, 0x4a, 0x74, 0x89, 0x67, 0x42, 0xc3, 0xaf, 0xe3, 0x8a, 0x8a\ndb 0x57, 0x88, 0xdf, 0xbe, 0x1a, 0x0c, 0x58, 0xa1, 0xfe, 0x21, 0x57, 0x97, 0xf6, 0xef, 0xba, 0x34\ndb 0x54, 0x60, 0x00, 0x71, 0x09, 0x4a, 0x5b, 0x89, 0x61, 0x4a, 0x67, 0x19, 0x34, 0x44, 0x83, 0x21\ndb 0x3d, 0xeb, 0x67, 0xff, 0xf7, 0x68, 0xbb, 0x29, 0xa0, 0x74, 0x5e, 0xad, 0x78, 0xb4, 0x11, 0xc5\ndb 0x5e, 0x0e, 0xc0, 0xd4, 0xe7, 0x50, 0x40, 0xa1, 0xb5, 0x98, 0xdb, 0x75, 0x1f, 0xa5, 0xbc, 0x1b\ndb 0xeb, 0x13, 0x18, 0x0e, 0x92, 0x54, 0x17, 0x2d, 0x5b, 0xf8, 0x09, 0x50, 0x27, 0x49, 0xf5, 0x01\ndb 0xb9, 0x51, 0xd1, 0x85, 0x34, 0x67, 0xd8, 0xb9, 0x5f, 0x01, 0x7b, 0xfc, 0xe7, 0x1e, 0xc8, 0xfc\ndb 0x2f, 0xda, 0x81, 0xfd, 0x76, 0x69, 0x5b, 0x47, 0x98, 0x1b, 0x9b, 0xee, 0x9b, 0x18, 0x8e, 0x30\ndb 0x85, 0x9d, 0x45, 0xde, 0xa8, 0x9b, 0x4e, 0x57, 0x26, 0x90, 0x0b, 0x9a, 0xe0, 0xf7, 0xfa, 0x08\ndb 0x1d, 0xe3, 0xca, 0xb8, 0xaa, 0xda, 0x4e, 0xe3, 0xb6, 0x33, 0x05, 0x9a, 0x75, 0x70, 0x18, 0x86\ndb 0x60, 0x31, 0xc1, 0x05, 0x56, 0x02, 0x30, 0xbd, 0xff, 0x3b, 0xa9, 0xca, 0xe4, 0x84, 0xe6, 0x96\ndb 0x47, 0xcf, 0x8b, 0xa8, 0xd4, 0x63, 0x8f, 0x8f, 0x55, 0x4a, 0xbc, 0x4c, 0x3c, 0x61, 0x96, 0x38\ndb 0xcc, 0x10, 0x7e, 0x4e, 0x5c, 0x97, 0xd3, 0x54, 0x22, 0xde, 0xfb, 0x03, 0x81, 0x4e, 0x6d, 0x76\ndb 0xb5, 0xab, 0x8f, 0xba, 0xf5, 0xf0, 0x1a, 0xf9, 0x69, 0x64, 0x30, 0xb3, 0x19, 0x30, 0x54, 0x97\ndb 0x14, 0x66, 0x5c, 0xcf, 0x48, 0x0f, 0x74, 0xf3, 0xbe, 0x16, 0x10, 0x6c, 0xb4, 0x93, 0x86, 0xd1\ndb 0x21, 0xd0, 0x6a, 0x12, 0x35, 0x03, 0x45, 0x99, 0xaa, 0xe1, 0x0a, 0xd9, 0x58, 0x83, 0x2f, 0x97\ndb 0xcb, 0x0d, 0x81, 0x4b, 0x82, 0x01, 0x6f, 0xd6, 0x20, 0xee, 0xf3, 0xbf, 0xdc, 0x3d, 0x67, 0x6c\ndb 0xa5, 0x7c, 0x6d, 0x21, 0x09, 0x99, 0x2e, 0x0a, 0x98, 0x7c, 0x50, 0x56, 0x19, 0x54, 0xcc, 0x79\ndb 0xe1, 0x84, 0x18, 0x86, 0xf8, 0x5a, 0x1b, 0xf7, 0x1f, 0x38, 0xe0, 0x3a, 0xb9, 0x50, 0xc1, 0xf1\ndb 0xbe, 0x66, 0x89, 0xe2, 0x68, 0x4a, 0x11, 0x0b, 0xfb, 0x84, 0x02, 0x38, 0x31, 0xf4, 0xda, 0x50\ndb 0xb6, 0x5f, 0x27, 0x62, 0xc7, 0x5a, 0x0f, 0x99, 0xb7, 0x7e, 0x4a, 0x49, 0xe9, 0x67, 0xe0, 0xa5\ndb 0x0d, 0x08, 0x95, 0xf0, 0xe4, 0x3b, 0x62, 0x30, 0x2b, 0x89, 0x21, 0xdd, 0x52, 0x99, 0x12, 0x16\ndb 0x83, 0x94, 0x6a, 0x38, 0x1f, 0x8d, 0x81, 0xbf, 0x1f, 0xf9, 0xe0, 0x9c, 0x80, 0xcc, 0x7c, 0xfe\ndb 0x33, 0x35, 0x27, 0x26, 0xca, 0xcc, 0x1f, 0x43, 0xcd, 0xb0, 0x74, 0x0e, 0xff, 0x1c, 0x86, 0x43\ndb 0xab, 0x44, 0xbc, 0x31, 0xff, 0xa4, 0x54, 0x95, 0xd4, 0x79, 0x9e, 0xc0, 0xed, 0x87, 0x1c, 0x2e\ndb 0x50, 0x47, 0xad, 0xc0, 0x2f, 0x5e, 0x8c, 0x15, 0xfb, 0x86, 0x2c, 0xa5, 0x61, 0x2a, 0x60, 0x12\ndb 0xbc, 0x1f, 0x84, 0xe9, 0x75, 0x55, 0x7e, 0x2c, 0x11, 0xd0, 0xfc, 0x66, 0x89, 0x86, 0x2f, 0x26\ndb 0x43, 0x1e, 0xa6, 0x6c, 0xa6, 0x40, 0xa9, 0x37, 0x65, 0x99, 0x72, 0xe1, 0x1a, 0xdc, 0x23, 0x53\ndb 0x09, 0x8e, 0xa1, 0xd6, 0xda, 0xd9, 0x95, 0xaf, 0x58, 0xe0, 0x2a, 0x4a, 0xd3, 0xbd, 0xbd, 0x86\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvttps2dq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000004500000053\", \"0x0000000D00000029\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x0000001500000005\", \"0x0000000500000009\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x000000420000001D\", \"0x0000005B00000013\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000003200000028\", \"0x0000001700000020\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x000000180000005A\", \"0x0000005B00000062\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x000000630000005A\", \"0x0000004A00000040\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x0000001900000023\", \"0x0000005A00000005\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000003400000021\", \"0x0000000A0000003A\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x000000540000002F\", \"0x000000410000005A\", \"0x000000540000002F\", \"0x000000410000005A\"],\n    \"XMM9\":  [\"0x0000000600000060\", \"0x0000005F00000019\", \"0x0000000600000060\", \"0x0000005F00000019\"],\n    \"XMM10\": [\"0x0000002500000058\", \"0x0000000A00000031\", \"0x0000002500000058\", \"0x0000000A00000031\"],\n    \"XMM11\": [\"0x000000140000004D\", \"0x0000002900000009\", \"0x000000140000004D\", \"0x0000002900000009\"],\n    \"XMM12\": [\"0x000000390000000F\", \"0x0000003700000009\", \"0x000000390000000F\", \"0x0000003700000009\"],\n    \"XMM13\": [\"0x0000000400000034\", \"0x0000000300000048\", \"0x0000000400000034\", \"0x0000000300000048\"],\n    \"XMM14\": [\"0x0000004700000038\", \"0x000000580000003D\", \"0x0000004700000038\", \"0x000000580000003D\"],\n    \"XMM15\": [\"0x000000180000002F\", \"0x0000006000000021\", \"0x000000180000002F\", \"0x0000006000000021\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvcvttps2dq xmm0,  [rdx + 32 * 0]\nvcvttps2dq xmm1,  [rdx + 32 * 1]\nvcvttps2dq xmm2,  [rdx + 32 * 2]\nvcvttps2dq xmm3,  [rdx + 32 * 3]\nvcvttps2dq xmm4,  [rdx + 32 * 4]\nvcvttps2dq xmm5,  [rdx + 32 * 5]\nvcvttps2dq xmm6,  [rdx + 32 * 6]\nvcvttps2dq xmm7,  [rdx + 32 * 7]\nvcvttps2dq ymm8,  [rdx + 32 * 8]\nvcvttps2dq ymm9,  [rdx + 32 * 9]\nvcvttps2dq ymm10, [rdx + 32 * 10]\nvcvttps2dq ymm11, [rdx + 32 * 11]\nvcvttps2dq ymm12, [rdx + 32 * 12]\nvcvttps2dq ymm13, [rdx + 32 * 13]\nvcvttps2dq ymm14, [rdx + 32 * 14]\nvcvttps2dq ymm15, [rdx + 32 * 15]\n\nhlt\n\nalign 32\n.data:\ndd 83.0999 , 69.50512, 41.02678, 13.05881\ndd 83.0999 , 69.50512, 41.02678, 13.05881\n\ndd 5.35242 , 21.9932 , 9.67383 , 5.32372\ndd 5.35242 , 21.9932 , 9.67383 , 5.32372\n\ndd 29.02872, 66.50151, 19.30764, 91.3633\ndd 29.02872, 66.50151, 19.30764, 91.3633\n\ndd 40.45086, 50.96153, 32.64489, 23.97574\ndd 40.45086, 50.96153, 32.64489, 23.97574\n\ndd 90.64316, 24.22547, 98.9394 , 91.21715\ndd 90.64316, 24.22547, 98.9394 , 91.21715\n\ndd 90.80143, 99.48407, 64.97245, 74.39838\ndd 90.80143, 99.48407, 64.97245, 74.39838\n\ndd 35.22761, 25.35321, 5.8732  , 90.19956\ndd 35.22761, 25.35321, 5.8732  , 90.19956\n\ndd 33.03133, 52.02952, 58.38554, 10.17531\ndd 33.03133, 52.02952, 58.38554, 10.17531\n\ndd 47.84703, 84.04831, 90.02965, 65.81329\ndd 47.84703, 84.04831, 90.02965, 65.81329\n\ndd 96.27991, 6.64479 , 25.58971, 95.00694\ndd 96.27991, 6.64479 , 25.58971, 95.00694\n\ndd 88.1929 , 37.16964, 49.52602, 10.27223\ndd 88.1929 , 37.16964, 49.52602, 10.27223\n\ndd 77.70605, 20.21439, 9.8056  , 41.29389\ndd 77.70605, 20.21439, 9.8056  , 41.29389\n\ndd 15.4071 , 57.54286, 9.61117 , 55.54302\ndd 15.4071 , 57.54286, 9.61117 , 55.54302\n\ndd 52.90745, 4.88086 , 72.52882, 3.0201\ndd 52.90745, 4.88086 , 72.52882, 3.0201\n\ndd 56.55091, 71.22749, 61.84736, 88.74295\ndd 56.55091, 71.22749, 61.84736, 88.74295\n\ndd 47.72641, 24.17404, 33.70564, 96.71303\ndd 47.72641, 24.17404, 33.70564, 96.71303\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvttsd2si.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x0000000000000001\",\n    \"RBX\": \"0x0000000000000002\",\n    \"RCX\": \"0x0000000000000003\",\n    \"RDX\": \"0x0000000000000004\"\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd xmm0, [rdx + 8 * 0]\nvmovapd xmm1, [rdx + 8 * 2]\n\nvcvttsd2si eax, xmm0\nvcvttsd2si rbx, xmm1\n\nvcvttsd2si ecx, [rdx + 8 * 4]\nvcvttsd2si rdx, [rdx + 8 * 6]\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000\ndq 0x5152535455565758\n\ndq 0x4000000000000000\ndq 0x5152535455565758\n\ndq 0x4008000000000000\ndq 0x5152535455565758\n\ndq 0x4010000000000000\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vcvttss2si.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x0000000000000001\",\n    \"RBX\": \"0x0000000000000002\",\n    \"RCX\": \"0x0000000000000003\",\n    \"RDX\": \"0x0000000000000004\",\n    \"RBP\": \"0x00000000FFFFFFFE\",\n    \"RSI\": \"0xFFFFFFFFFFFFFFFC\"\n  }\n}\n%endif\n\nlea r15, [rel .data]\n\nvmovapd xmm0, [r15 + 8 * 0]\nvmovapd xmm1, [r15 + 8 * 2]\n\nmov rax, -1\nmov rbx, -1\nmov rcx, -1\nmov rdx, -1\nmov rbp, -1\nmov rsi, -1\n\nvcvttss2si eax, xmm0\nvcvttss2si rbx, xmm1\n\nvcvttss2si ebp, [r15 + 8 * 8]\nvcvttss2si rsi, [r15 + 8 * 10]\n\nvcvttss2si ecx, [r15 + 8 * 4]\nvcvttss2si rdx, [r15 + 8 * 6]\n\nhlt\n\nalign 32\n.data:\ndq 0x414243443F800000\ndq 0x5152535455565758\n\ndq 0x4142434440000000\ndq 0x5152535455565758\n\ndq 0x4142434440400000\ndq 0x5152535455565758\n\ndq 0x4142434440800000\ndq 0x5152535455565758\n\ndq 0x41424344C0000000\ndq 0x5152535455565758\n\ndq 0x41424344C0800000\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vdivpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\"],\n    \"XMM1\": [\"0x4000000000000000\", \"0x4000000000000000\", \"0x4000000000000000\", \"0x4000000000000000\"],\n    \"XMM2\": [\"0x3FE0000000000000\", \"0x3FE0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x3FE0000000000000\", \"0x3FE0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x3FE0000000000000\", \"0x3FE0000000000000\", \"0x3FE0000000000000\", \"0x3FE0000000000000\"],\n    \"XMM5\": [\"0x4000000000000000\", \"0x4000000000000000\", \"0x4000000000000000\", \"0x4000000000000000\"],\n    \"XMM6\": [\"0x3FE0000000000000\", \"0x3FE0000000000000\", \"0x3FE0000000000000\", \"0x3FE0000000000000\"],\n    \"XMM7\": [\"0x4000000000000000\", \"0x4000000000000000\", \"0x4000000000000000\", \"0x4000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Memory operand\nvdivpd xmm2, xmm0, [rdx + 32]\nvdivpd ymm4, ymm0, [rdx + 32]\n\n; Register only\nvdivpd xmm3, xmm0, xmm1\nvdivpd ymm5, ymm1, ymm0\n\n; Some tests for aliasing destination and source vectors\nvmovapd ymm6, ymm0\nvdivpd ymm6, ymm6, ymm1\n\nvmovapd ymm7, ymm0\nvdivpd ymm7, ymm1, ymm7\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000\ndq 0x3FF0000000000000\ndq 0x3FF0000000000000\ndq 0x3FF0000000000000\n\ndq 0x4000000000000000\ndq 0x4000000000000000\ndq 0x4000000000000000\ndq 0x4000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vdivps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x400000003F800000\", \"0x4080000040400000\", \"0x400000003F800000\", \"0x4080000040400000\"],\n    \"XMM1\": [\"0x40C0000040A00000\", \"0x4100000040E00000\", \"0x40C0000040A00000\", \"0x4100000040E00000\"],\n    \"XMM2\": [\"0x3EAAAAAB3E4CCCCD\", \"0x3F0000003EDB6DB7\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x3EAAAAAB3E4CCCCD\", \"0x3F0000003EDB6DB7\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x3EAAAAAB3E4CCCCD\", \"0x3F0000003EDB6DB7\", \"0x3EAAAAAB3E4CCCCD\", \"0x3F0000003EDB6DB7\"],\n    \"XMM5\": [\"0x4040000040A00000\", \"0x4000000040155555\", \"0x4040000040A00000\", \"0x4000000040155555\"],\n    \"XMM6\": [\"0x3EAAAAAB3E4CCCCD\", \"0x3F0000003EDB6DB7\", \"0x3EAAAAAB3E4CCCCD\", \"0x3F0000003EDB6DB7\"],\n    \"XMM7\": [\"0x4040000040A00000\", \"0x4000000040155555\", \"0x4040000040A00000\", \"0x4000000040155555\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Memory operand\nvdivps xmm2, xmm0, [rdx + 32]\nvdivps ymm4, ymm0, [rdx + 32]\n\n; Register only\nvdivps xmm3, xmm0, xmm1\nvdivps ymm5, ymm1, ymm0\n\n; Some tests for aliasing destination and source vectors\nvmovapd ymm6, ymm0\nvdivps ymm6, ymm6, ymm1\n\nvmovapd ymm7, ymm0\nvdivps ymm7, ymm1, ymm7\n\nhlt\n\nalign 32\n.data:\ndq 0x400000003F800000 ; 2, 1\ndq 0x4080000040400000 ; 4, 3\ndq 0x400000003F800000 ; 2, 1\ndq 0x4080000040400000 ; 4, 3\n\ndq 0x40C0000040A00000 ; 6, 5\ndq 0x4100000040E00000 ; 8, 7\ndq 0x40C0000040A00000 ; 6, 5\ndq 0x4100000040E00000 ; 8, 7\n"
  },
  {
    "path": "unittests/ASM/VEX/vdivsd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x3FD0000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x4010000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x3FE2000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4030000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x4039000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4019000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x3FE47AE147AE147B\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x4030000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM9\": [\"0x4039000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\n\n; Register only\nvdivsd xmm0, xmm0, xmm1\nvdivsd xmm2, xmm2, xmm3\n\n; Memory operand\nvdivsd xmm5, xmm4, [rdx + 32 * 1]\nvdivsd xmm4, xmm4, [rdx + 32 * 0]\n\n; Merging different src into destination\nvpxor xmm7, xmm7, xmm7\nvmovapd ymm8, [rdx + 32 * 3]\nvmovapd ymm9, [rdx + 32 * 4]\nvdivsd xmm7, xmm8, xmm9\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000 ; 1.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4010000000000000 ; 4.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4022000000000000 ; 9.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4030000000000000 ; 16.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4039000000000000 ; 25.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vdivss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x414243443E800000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x4142434440800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x414243443F100000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434441800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x4142434441C80000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4142434440C80000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x414243443F23D70A\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x4142434441800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM9\": [\"0x4142434441C80000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\n\n; Register only\nvdivss xmm0, xmm0, xmm1\nvdivss xmm2, xmm2, xmm3\n\n; Memory operand\nvdivss xmm5, xmm4, [rdx + 32 * 1]\nvdivss xmm4, xmm4, [rdx + 32 * 0]\n\n; Merging different src into destination\nvpxor xmm7, xmm7, xmm7\nvmovapd ymm8, [rdx + 32 * 3]\nvmovapd ymm9, [rdx + 32 * 4]\nvdivss xmm7, xmm8, xmm9\n\nhlt\n\nalign 32\n.data:\ndq 0x414243443F800000 ; 1.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434440800000 ; 4.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441100000 ; 9.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441800000 ; 16.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441C80000 ; 25.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vdppd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM8\":  [\"0x41278C496C911A6E\", \"0x41278C496C911A6E\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x41235CCC64AFB361\", \"0x41235CCC64AFB361\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x412BACE273945DC5\", \"0x412BACE273945DC5\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x412CF22EF582FD76\", \"0x412CF22EF582FD76\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x4121C80E40F3BC7B\", \"0x4121C80E40F3BC7B\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM15\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps xmm0, [rdx + 16 * 0]\nvmovaps xmm1, [rdx + 16 * 1]\nvmovaps xmm2, [rdx + 16 * 2]\nvmovaps xmm3, [rdx + 16 * 3]\nvmovaps xmm4, [rdx + 16 * 4]\nvmovaps xmm5, [rdx + 16 * 5]\nvmovaps xmm6, [rdx + 16 * 6]\nvmovaps xmm7, [rdx + 16 * 7]\n\nvdppd xmm8,  xmm0, [rdx + 16 * 8],  11111111b\nvdppd xmm9,  xmm1, [rdx + 16 * 9],  11111111b\nvdppd xmm10, xmm2, [rdx + 16 * 10], 11111111b\nvdppd xmm11, xmm3, [rdx + 16 * 11], 11111111b\nvdppd xmm12, xmm4, [rdx + 16 * 12], 11111111b\nvdppd xmm13, xmm5, [rdx + 16 * 13], 00000000b\nvdppd xmm14, xmm6, [rdx + 16 * 14], 11110000b\nvdppd xmm15, xmm7, [rdx + 16 * 15], 00001111b\n\nhlt\n\nalign 32\n.data:\ndq 470.4127, 683.87\ndq 711.3545, 511.5631\ndq 996.8793, 548.682\ndq 588.9345, 832.5925\ndq 210.6613, 792.6059\ndq 298.4494, 154.4895\ndq 818.4   , 881.6027\ndq 705.3087, 687.478\ndq 737.0665, 621.31\ndq 755.3097, 189.9614\ndq 552.4284, 649.1206\ndq 798.252 , 574.5732\ndq 593.7565, 577.3129\ndq 383.3844, 443.3476\ndq 414.3571, 615.1567\ndq 94.898  , 438.3107\n"
  },
  {
    "path": "unittests/ASM/VEX/vdpps_128.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM8\":  [\"0x492FEB2E492FEB2E\", \"0x492FEB2E492FEB2E\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x499A5226499A5226\", \"0x499A5226499A5226\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x494ECFA4494ECFA4\", \"0x494ECFA4494ECFA4\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x495F7816495F7816\", \"0x495F7816495F7816\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x496E3962496E3962\", \"0x496E3962496E3962\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM15\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps xmm0, [rdx + 16 * 0]\nvmovaps xmm1, [rdx + 16 * 1]\nvmovaps xmm2, [rdx + 16 * 2]\nvmovaps xmm3, [rdx + 16 * 3]\nvmovaps xmm4, [rdx + 16 * 4]\nvmovaps xmm5, [rdx + 16 * 5]\nvmovaps xmm6, [rdx + 16 * 6]\nvmovaps xmm7, [rdx + 16 * 7]\n\nvdpps xmm8,  xmm0, [rdx + 16 * 8],  11111111b\nvdpps xmm9,  xmm1, [rdx + 16 * 9],  11111111b\nvdpps xmm10, xmm2, [rdx + 16 * 10], 11111111b\nvdpps xmm11, xmm3, [rdx + 16 * 11], 11111111b\nvdpps xmm12, xmm4, [rdx + 16 * 12], 11111111b\nvdpps xmm13, xmm5, [rdx + 16 * 13], 00000000b\nvdpps xmm14, xmm6, [rdx + 16 * 14], 11110000b\nvdpps xmm15, xmm7, [rdx + 16 * 15], 00001111b\n\nhlt\n\nalign 32\n.data:\ndd 655.9708, 532.2244, 108.0451, 512.4019\ndd 754.227 , 586.0859, 127.7574, 114.8167\ndd 764.4266, 226.6145, 337.864 , 320.3296\ndd 296.5247, 480.0057, 28.4267 , 565.9418\ndd 265.8255, 536.4473, 754.3489, 460.681\ndd 818.7269, 43.7204 , 464.592 , 847.9381\ndd 306.0592, 702.7584, 887.6473, 551.5908\ndd 620.9001, 520.9829, 232.9532, 510.3388\ndd 204.8474, 225.626 , 564.973 , 790.5175\ndd 836.1953, 844.5266, 633.5626, 501.7409\ndd 393.2616, 674.4415, 244.3265, 971.1598\ndd 770.8029, 746.1836, 255.9902, 567.7578\ndd 187.7175, 924.181 , 466.4362, 169.8267\ndd 651.7481, 462.4206, 396.6924, 355.8538\ndd 6.148   , 523.1443, 989.7004, 713.6646\ndd 497.5427, 657.6965, 651.0534, 778.5236\n"
  },
  {
    "path": "unittests/ASM/VEX/vdpps_256.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM8\":  [\"0x492FEB2E492FEB2E\", \"0x492FEB2E492FEB2E\", \"0x492FEB2E492FEB2E\", \"0x492FEB2E492FEB2E\"],\n    \"XMM9\":  [\"0x499A5226499A5226\", \"0x499A5226499A5226\", \"0x499A5226499A5226\", \"0x499A5226499A5226\"],\n    \"XMM10\": [\"0x494ECFA4494ECFA4\", \"0x494ECFA4494ECFA4\", \"0x494ECFA4494ECFA4\", \"0x494ECFA4494ECFA4\"],\n    \"XMM11\": [\"0x495F7816495F7816\", \"0x495F7816495F7816\", \"0x495F7816495F7816\", \"0x495F7816495F7816\"],\n    \"XMM12\": [\"0x496E3962496E3962\", \"0x496E3962496E3962\", \"0x496E3962496E3962\", \"0x496E3962496E3962\"],\n    \"XMM13\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM15\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 0]\nvmovaps ymm1, [rdx + 32 * 1]\nvmovaps ymm2, [rdx + 32 * 2]\nvmovaps ymm3, [rdx + 32 * 3]\nvmovaps ymm4, [rdx + 32 * 4]\nvmovaps ymm5, [rdx + 32 * 5]\nvmovaps ymm6, [rdx + 32 * 6]\nvmovaps ymm7, [rdx + 32 * 7]\n\nvdpps ymm8,  ymm0, [rdx + 32 * 8],  11111111b\nvdpps ymm9,  ymm1, [rdx + 32 * 9],  11111111b\nvdpps ymm10, ymm2, [rdx + 32 * 10], 11111111b\nvdpps ymm11, ymm3, [rdx + 32 * 11], 11111111b\nvdpps ymm12, ymm4, [rdx + 32 * 12], 11111111b\nvdpps ymm13, ymm5, [rdx + 32 * 13], 00000000b\nvdpps ymm14, ymm6, [rdx + 32 * 14], 11110000b\nvdpps ymm15, ymm7, [rdx + 32 * 15], 00001111b\n\nhlt\n\nalign 32\n.data:\ndd 655.9708, 532.2244, 108.0451, 512.4019\ndd 655.9708, 532.2244, 108.0451, 512.4019\n\ndd 754.227 , 586.0859, 127.7574, 114.8167\ndd 754.227 , 586.0859, 127.7574, 114.8167\n\ndd 764.4266, 226.6145, 337.864 , 320.3296\ndd 764.4266, 226.6145, 337.864 , 320.3296\n\ndd 296.5247, 480.0057, 28.4267 , 565.9418\ndd 296.5247, 480.0057, 28.4267 , 565.9418\n\ndd 265.8255, 536.4473, 754.3489, 460.681\ndd 265.8255, 536.4473, 754.3489, 460.681\n\ndd 818.7269, 43.7204 , 464.592 , 847.9381\ndd 818.7269, 43.7204 , 464.592 , 847.9381\n\ndd 306.0592, 702.7584, 887.6473, 551.5908\ndd 306.0592, 702.7584, 887.6473, 551.5908\n\ndd 620.9001, 520.9829, 232.9532, 510.3388\ndd 620.9001, 520.9829, 232.9532, 510.3388\n\ndd 204.8474, 225.626 , 564.973 , 790.5175\ndd 204.8474, 225.626 , 564.973 , 790.5175\n\ndd 836.1953, 844.5266, 633.5626, 501.7409\ndd 836.1953, 844.5266, 633.5626, 501.7409\n\ndd 393.2616, 674.4415, 244.3265, 971.1598\ndd 393.2616, 674.4415, 244.3265, 971.1598\n\ndd 770.8029, 746.1836, 255.9902, 567.7578\ndd 770.8029, 746.1836, 255.9902, 567.7578\n\ndd 187.7175, 924.181 , 466.4362, 169.8267\ndd 187.7175, 924.181 , 466.4362, 169.8267\n\ndd 651.7481, 462.4206, 396.6924, 355.8538\ndd 651.7481, 462.4206, 396.6924, 355.8538\n\ndd 6.148   , 523.1443, 989.7004, 713.6646\ndd 6.148   , 523.1443, 989.7004, 713.6646\n\ndd 497.5427, 657.6965, 651.0534, 778.5236\ndd 497.5427, 657.6965, 651.0534, 778.5236\n"
  },
  {
    "path": "unittests/ASM/VEX/vextractf128.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0xAAAAAAAABBBBBBBB\", \"0xCCCCCCCCDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0xEEEEEEEEFFFFFFFF\", \"0x9999999988888888\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x1111111122222222\", \"0x3333333344444444\", \"0xAAAABBBBCCCCDDDD\", \"0xEEEEFFFF99998888\"],\n    \"XMM15\": [\"0x5555555566666666\", \"0x7777777788888888\", \"0x4444333322221111\", \"0x8888777766665555\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Load junk and overwrite register\nvmovapd ymm2, [rdx + 32]\nvmovapd ymm3, [rdx + 32]\nvextractf128 xmm2, ymm0, 0\nvextractf128 xmm3, ymm0, 1\n\n; Store into memory\nvextractf128 [rel .scratch1], ymm1, 0\nvextractf128 [rel .scratch2], ymm1, 1\nvmovapd ymm14, [rel .scratch1]\nvmovapd ymm15, [rel .scratch2]\n\nhlt\n\nalign 4096\n.data:\ndq 0xAAAAAAAABBBBBBBB\ndq 0xCCCCCCCCDDDDDDDD\ndq 0xEEEEEEEEFFFFFFFF\ndq 0x9999999988888888\n\ndq 0x1111111122222222\ndq 0x3333333344444444\ndq 0x5555555566666666\ndq 0x7777777788888888\n\n.scratch1:\ndq 0x8888777766665555\ndq 0x4444333322221111\ndq 0xAAAABBBBCCCCDDDD\ndq 0xEEEEFFFF99998888\n\n.scratch2:\ndq 0xEEEEFFFF99998888\ndq 0xAAAABBBBCCCCDDDD\ndq 0x4444333322221111\ndq 0x8888777766665555\n"
  },
  {
    "path": "unittests/ASM/VEX/vextracti128.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0xAAAAAAAABBBBBBBB\", \"0xCCCCCCCCDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0xEEEEEEEEFFFFFFFF\", \"0x9999999988888888\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x1111111122222222\", \"0x3333333344444444\", \"0xAAAABBBBCCCCDDDD\", \"0xEEEEFFFF99998888\"],\n    \"XMM15\": [\"0x5555555566666666\", \"0x7777777788888888\", \"0x4444333322221111\", \"0x8888777766665555\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Load junk and overwrite register\nvmovapd ymm2, [rdx + 32]\nvmovapd ymm3, [rdx + 32]\nvextracti128 xmm2, ymm0, 0\nvextracti128 xmm3, ymm0, 1\n\n; Store into memory\nvextracti128 [rel .scratch1], ymm1, 0\nvextracti128 [rel .scratch2], ymm1, 1\nvmovapd ymm14, [rel .scratch1]\nvmovapd ymm15, [rel .scratch2]\n\nhlt\n\nalign 4096\n.data:\ndq 0xAAAAAAAABBBBBBBB\ndq 0xCCCCCCCCDDDDDDDD\ndq 0xEEEEEEEEFFFFFFFF\ndq 0x9999999988888888\n\ndq 0x1111111122222222\ndq 0x3333333344444444\ndq 0x5555555566666666\ndq 0x7777777788888888\n\n.scratch1:\ndq 0x8888777766665555\ndq 0x4444333322221111\ndq 0xAAAABBBBCCCCDDDD\ndq 0xEEEEFFFF99998888\n\n.scratch2:\ndq 0xEEEEFFFF99998888\ndq 0xAAAABBBBCCCCDDDD\ndq 0x4444333322221111\ndq 0x8888777766665555\n"
  },
  {
    "path": "unittests/ASM/VEX/vextractps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x000000004d2fa47f\",\n    \"RBX\": \"0x0000000067d29af3\",\n    \"RCX\": \"0x8a6789f27404b890\",\n    \"RDX\": \"0x00f658ab78236612\"\n  }\n}\n%endif\n\nlea rdx, [rel .data]\nmov rsi, 0xe0000000\n\nvmovaps xmm1, [rdx + 16 * 0]\nvmovaps xmm2, [rdx + 16 * 1]\nvmovaps xmm3, [rdx + 16 * 2]\nvmovaps xmm4, [rdx + 16 * 3]\nvmovaps xmm5, [rdx + 16 * 4]\nvmovaps xmm6, [rdx + 16 * 5]\nvmovaps xmm7, [rdx + 16 * 6]\nvmovaps xmm8, [rdx + 16 * 7]\n\nmov rax, 0\nmov [rsi + 8 * 0], rax\n\nvextractps eax, xmm1, 0\nvextractps ebx, xmm2, 0xFF\nvextractps [rsi + 8 * 0 + 0], xmm3, 2\nvextractps [rsi + 8 * 0 + 4], xmm4, 0xFF\nvextractps [rsi + 8 * 1 + 0], xmm5, 4\nvextractps [rsi + 8 * 1 + 4], xmm6, 5\nmov rcx, [rsi + 8 * 0]\nmov rdx, [rsi + 8 * 1]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dpd_128bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xe273f1177f80d2ec\", \"0xd7e273f1177f80d2\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x341ce2bf6334292d\", \"0x1ce2bf6334292db6\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xe273f1177f80d2ec\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0x341ce2bf6334292d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvgatherdpd xmm15, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvgatherdpd xmm14, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvgatherdpd xmm13, [xmm0 * 1 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvgatherdpd xmm12, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvgatherdpd xmm11, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvgatherdpd xmm10, [xmm0 * 1 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvgatherdpd xmm9, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvgatherdpd xmm8, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvgatherdpd xmm7, [xmm0 * 1 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm6, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm5, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm4, [xmm0 * 1 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm3, [xmm0 * 1 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -992, -512, -256, -128, 128, 256, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dpd_128bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x002fd22652633359\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x7be65e82db698176\", \"0xd2ec7be65e82db69\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xea2f8a34fff5e934\", \"0x8a34fff5e9341ce2\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0x7be65e82db698176\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xea2f8a34fff5e934\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvgatherdpd xmm15, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvgatherdpd xmm14, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvgatherdpd xmm13, [xmm0 * 2 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvgatherdpd xmm12, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvgatherdpd xmm11, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvgatherdpd xmm10, [xmm0 * 2 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvgatherdpd xmm9, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvgatherdpd xmm8, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvgatherdpd xmm7, [xmm0 * 2 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm6, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm5, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm4, [xmm0 * 2 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm3, [xmm0 * 2 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -504, -256, -128, -64, 64, 128, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dpd_128bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x3087464d8aa16a60\", \"0x97ba9a8e3087464d\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x9712ffc5b8c6d8a6\", \"0xb8c6d8a6df6efe3b\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0x3087464d8aa16a60\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0x9712ffc5b8c6d8a6\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvgatherdpd xmm15, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvgatherdpd xmm14, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvgatherdpd xmm13, [xmm0 * 4 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvgatherdpd xmm12, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvgatherdpd xmm11, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvgatherdpd xmm10, [xmm0 * 4 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvgatherdpd xmm9, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvgatherdpd xmm8, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvgatherdpd xmm7, [xmm0 * 4 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm6, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm5, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm4, [xmm0 * 4 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm3, [xmm0 * 4 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -248, -128, -64, -32, 32, 64, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dpd_128bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2b43dbebde37bc4f\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xb57f2163f1a6aed4\", \"0x07ed4949d2f4229d\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x8b27e4deab3fd329\", \"0xbf8b198471089de2\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xb57f2163f1a6aed4\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0x8b27e4deab3fd329\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvgatherdpd xmm15, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvgatherdpd xmm14, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvgatherdpd xmm13, [xmm0 * 8 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvgatherdpd xmm12, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvgatherdpd xmm11, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvgatherdpd xmm10, [xmm0 * 8 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvgatherdpd xmm9, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvgatherdpd xmm8, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvgatherdpd xmm7, [xmm0 * 8 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm6, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm5, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm4, [xmm0 * 8 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvgatherdpd xmm3, [xmm0 * 8 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -120, -64, -32, -16, 16, 32, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dpd_256bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0xead2e747388e768d\", \"0x88bd62c1a2ff64bc\"],\n    \"XMM4\":  [\"0xe273f1177f80d2ec\", \"0xd7e273f1177f80d2\", \"0xa9d7e273f1177f80\", \"0x35a9d7e273f1177f\"],\n    \"XMM5\":  [\"0x341ce2bf6334292d\", \"0x1ce2bf6334292db6\", \"0xe2bf6334292db6b8\", \"0xbf6334292db6b85f\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0xe273f1177f80d2ec\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0x341ce2bf6334292d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x35a9d7e273f1177f\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xbf6334292db6b85f\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvgatherdpd ymm15, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvgatherdpd ymm14, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvgatherdpd ymm13, [xmm0 * 1 + rax], ymm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvgatherdpd ymm12, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvgatherdpd ymm11, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvgatherdpd ymm10, [xmm0 * 1 + rax], ymm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvgatherdpd ymm9, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvgatherdpd ymm8, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvgatherdpd ymm7, [xmm0 * 1 + rax], ymm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm6, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm5, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm4, [xmm0 * 1 + rax], ymm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm3, [xmm0 * 1 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -992, -512, -256, -128, 128, 256, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dpd_256bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x002fd22652633359\", \"0x6778ae2a2522e0af\", \"0xead2e747388e768d\", \"0x88bd62c1a2ff64bc\"],\n    \"XMM4\":  [\"0x7be65e82db698176\", \"0xd2ec7be65e82db69\", \"0x7f80d2ec7be65e82\", \"0xf1177f80d2ec7be6\"],\n    \"XMM5\":  [\"0xea2f8a34fff5e934\", \"0x8a34fff5e9341ce2\", \"0xfff5e9341ce2bf63\", \"0xe9341ce2bf633429\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0x7be65e82db698176\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0xea2f8a34fff5e934\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xf1177f80d2ec7be6\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xe9341ce2bf633429\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvgatherdpd ymm15, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvgatherdpd ymm14, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvgatherdpd ymm13, [xmm0 * 2 + rax], ymm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvgatherdpd ymm12, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvgatherdpd ymm11, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvgatherdpd ymm10, [xmm0 * 2 + rax], ymm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvgatherdpd ymm9, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvgatherdpd ymm8, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvgatherdpd ymm7, [xmm0 * 2 + rax], ymm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm6, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm5, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm4, [xmm0 * 2 + rax], ymm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm3, [xmm0 * 2 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -504, -256, -128, -64, 64, 128, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dpd_256bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0xead2e747388e768d\", \"0x88bd62c1a2ff64bc\"],\n    \"XMM4\":  [\"0x3087464d8aa16a60\", \"0x97ba9a8e3087464d\", \"0x33b7153e97ba9a8e\", \"0xdb69817633b7153e\"],\n    \"XMM5\":  [\"0x9712ffc5b8c6d8a6\", \"0xb8c6d8a6df6efe3b\", \"0xdf6efe3b3fd4ea2f\", \"0x3fd4ea2f8a34fff5\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0x3087464d8aa16a60\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0x9712ffc5b8c6d8a6\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xdb69817633b7153e\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x3fd4ea2f8a34fff5\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvgatherdpd ymm15, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvgatherdpd ymm14, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvgatherdpd ymm13, [xmm0 * 4 + rax], ymm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvgatherdpd ymm12, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvgatherdpd ymm11, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvgatherdpd ymm10, [xmm0 * 4 + rax], ymm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvgatherdpd ymm9, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvgatherdpd ymm8, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvgatherdpd ymm7, [xmm0 * 4 + rax], ymm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm6, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm5, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm4, [xmm0 * 4 + rax], ymm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm3, [xmm0 * 4 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -248, -128, -64, -32, 32, 64, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dpd_256bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2b43dbebde37bc4f\", \"0x6778ae2a2522e0af\", \"0xead2e747388e768d\", \"0x88bd62c1a2ff64bc\"],\n    \"XMM4\":  [\"0xb57f2163f1a6aed4\", \"0x07ed4949d2f4229d\", \"0x4735be742ef911b1\", \"0x1fe6464d0b85efdc\"],\n    \"XMM5\":  [\"0x8b27e4deab3fd329\", \"0xbf8b198471089de2\", \"0x225165965d4e120a\", \"0xa886da539712ffc5\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0xb57f2163f1a6aed4\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0x8b27e4deab3fd329\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x1fe6464d0b85efdc\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xa886da539712ffc5\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvgatherdpd ymm15, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvgatherdpd ymm14, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvgatherdpd ymm13, [xmm0 * 8 + rax], ymm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvgatherdpd ymm12, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvgatherdpd ymm11, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvgatherdpd ymm10, [xmm0 * 8 + rax], ymm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvgatherdpd ymm9, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvgatherdpd ymm8, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvgatherdpd ymm7, [xmm0 * 8 + rax], ymm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm6, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm5, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm4, [xmm0 * 8 + rax], ymm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvgatherdpd ymm3, [xmm0 * 8 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -120, -64, -32, -16, 16, 32, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dps_128bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0xa2ff64bc388e768d\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x177f80d27f80d2ec\", \"0x73f1177ff1177f80\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x34292db66334292d\", \"0x2db6b85f292db6b8\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda2567f80d2ec\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda2566334292d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherdps xmm15, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherdps xmm14, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherdps xmm13, [xmm0 * 1 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherdps xmm12, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherdps xmm11, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherdps xmm10, [xmm0 * 1 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherdps xmm9, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherdps xmm8, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherdps xmm7, [xmm0 * 1 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm6, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm5, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm4, [xmm0 * 1 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm3, [xmm0 * 1 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -992, -512, -256, -128, 128, 256, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dps_128bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af52633359\", \"0xa2ff64bc388e768d\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x5e82db69db698176\", \"0xd2ec7be67be65e82\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xe9341ce2fff5e934\", \"0xbf6334291ce2bf63\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda256db698176\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256fff5e934\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherdps xmm15, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherdps xmm14, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherdps xmm13, [xmm0 * 2 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherdps xmm12, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherdps xmm11, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherdps xmm10, [xmm0 * 2 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherdps xmm9, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherdps xmm8, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherdps xmm7, [xmm0 * 2 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm6, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm5, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm4, [xmm0 * 2 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm3, [xmm0 * 2 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -504, -256, -128, -64, 64, 128, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dps_128bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0xa2ff64bc388e768d\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x3087464d8aa16a60\", \"0x33b7153e97ba9a8e\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xdf6efe3bb8c6d8a6\", \"0x8a34fff53fd4ea2f\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda2568aa16a60\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256b8c6d8a6\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherdps xmm15, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherdps xmm14, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherdps xmm13, [xmm0 * 4 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherdps xmm12, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherdps xmm11, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherdps xmm10, [xmm0 * 4 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherdps xmm9, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherdps xmm8, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherdps xmm7, [xmm0 * 4 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm6, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm5, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm4, [xmm0 * 4 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm3, [xmm0 * 4 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -248, -128, -64, -32, 32, 64, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dps_128bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0afde37bc4f\", \"0xa2ff64bc388e768d\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xd2f4229df1a6aed4\", \"0x0b85efdc2ef911b1\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x71089de2ab3fd329\", \"0x9712ffc55d4e120a\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda256f1a6aed4\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256ab3fd329\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherdps xmm15, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherdps xmm14, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherdps xmm13, [xmm0 * 8 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherdps xmm12, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherdps xmm11, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherdps xmm10, [xmm0 * 8 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherdps xmm9, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherdps xmm8, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherdps xmm7, [xmm0 * 8 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm6, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm5, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm4, [xmm0 * 8 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherdps xmm3, [xmm0 * 8 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -120, -64, -32, -16, 16, 32, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dps_256bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0xa2ff64bc388e768d\", \"0x13a833a3666d909d\", \"0xf6300511c21448dd\"],\n    \"XMM4\":  [\"0x177f80d27f80d2ec\", \"0x73f1177ff1177f80\", \"0xd7e273f1e273f117\", \"0x35a9d7e2a9d7e273\"],\n    \"XMM5\":  [\"0x34292db66334292d\", \"0x2db6b85f292db6b8\", \"0xb85f6135b6b85f61\", \"0x6135a9d75f6135a9\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\"],\n    \"XMM7\":  [\"0xf1cda2567f80d2ec\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0xf1cda2566334292d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x35a9d7e2f7b7368a\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000000]\nvgatherdps ymm15, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000000]\nvgatherdps ymm14, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000000]\nvgatherdps ymm13, [ymm0 * 1 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000001]\nvgatherdps ymm12, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000001]\nvgatherdps ymm11, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000001]\nvgatherdps ymm10, [ymm0 * 1 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_10000000]\nvgatherdps ymm9, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_10000000]\nvgatherdps ymm8, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_10000000]\nvgatherdps ymm7, [ymm0 * 1 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm6, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm5, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm4, [ymm0 * 1 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm3, [ymm0 * 1 + rax], ymm1\n\n; xmm1 will be zero after this.\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -992, -512, -256, -128, 128, 256, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dps_256bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n\n    \"XMM3\":  [\"0x2522e0af52633359\", \"0xa2ff64bc388e768d\", \"0x13a833a3666d909d\", \"0x59f4e95cc21448dd\"],\n    \"XMM4\":  [\"0x5e82db69db698176\", \"0xd2ec7be67be65e82\", \"0xf1177f807f80d2ec\", \"0xa9d7e273e273f117\"],\n    \"XMM5\":  [\"0xe9341ce2fff5e934\", \"0xbf6334291ce2bf63\", \"0x2db6b85f34292db6\", \"0x6135a9d7b85f6135\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\"],\n    \"XMM7\":  [\"0xf1cda256db698176\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0xf1cda256fff5e934\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xa9d7e273f7b7368a\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000000]\nvgatherdps ymm15, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000000]\nvgatherdps ymm14, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000000]\nvgatherdps ymm13, [ymm0 * 2 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000001]\nvgatherdps ymm12, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000001]\nvgatherdps ymm11, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000001]\nvgatherdps ymm10, [ymm0 * 2 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_10000000]\nvgatherdps ymm9, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_10000000]\nvgatherdps ymm8, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_10000000]\nvgatherdps ymm7, [ymm0 * 2 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm6, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm5, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm4, [ymm0 * 2 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm3, [ymm0 * 2 + rax], ymm1\n\n; xmm1 will be zero after this.\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -504, -256, -128, -64, 64, 128, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dps_256bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0xa2ff64bc388e768d\", \"0x13a833a3666d909d\", \"0xf6300511c21448dd\"],\n    \"XMM4\":  [\"0x3087464d8aa16a60\", \"0x33b7153e97ba9a8e\", \"0x7be65e82db698176\", \"0xe273f1177f80d2ec\"],\n    \"XMM5\":  [\"0xdf6efe3bb8c6d8a6\", \"0x8a34fff53fd4ea2f\", \"0xbf633429e9341ce2\", \"0x6135a9d72db6b85f\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\"],\n    \"XMM7\":  [\"0xf1cda2568aa16a60\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0xf1cda256b8c6d8a6\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xe273f117f7b7368a\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000000]\nvgatherdps ymm15, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000000]\nvgatherdps ymm14, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000000]\nvgatherdps ymm13, [ymm0 * 4 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000001]\nvgatherdps ymm12, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000001]\nvgatherdps ymm11, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000001]\nvgatherdps ymm10, [ymm0 * 4 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_10000000]\nvgatherdps ymm9, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_10000000]\nvgatherdps ymm8, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_10000000]\nvgatherdps ymm7, [ymm0 * 4 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm6, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm5, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm4, [ymm0 * 4 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm3, [ymm0 * 4 + rax], ymm1\n\n; xmm1 will be zero after this.\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -248, -128, -64, -32, 32, 64, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_dps_256bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0afde37bc4f\", \"0xa2ff64bc388e768d\", \"0x13a833a3666d909d\", \"0xabf96d9bc21448dd\"],\n    \"XMM4\":  [\"0xd2f4229df1a6aed4\", \"0x0b85efdc2ef911b1\", \"0x97ba9a8e8aa16a60\", \"0x7f80d2ecdb698176\"],\n    \"XMM5\":  [\"0x71089de2ab3fd329\", \"0x9712ffc55d4e120a\", \"0x8a34fff5df6efe3b\", \"0x6135a9d7bf633429\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\"],\n    \"XMM7\":  [\"0xf1cda256f1a6aed4\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0xf1cda256ab3fd329\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x7f80d2ecf7b7368a\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000000]\nvgatherdps ymm15, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000000]\nvgatherdps ymm14, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000000]\nvgatherdps ymm13, [ymm0 * 8 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000001]\nvgatherdps ymm12, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000001]\nvgatherdps ymm11, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000001]\nvgatherdps ymm10, [ymm0 * 8 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_10000000]\nvgatherdps ymm9, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_10000000]\nvgatherdps ymm8, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_10000000]\nvgatherdps ymm7, [ymm0 * 8 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm6, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm5, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm4, [ymm0 * 8 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_11111111]\nvgatherdps ymm3, [ymm0 * 8 + rax], ymm1\n\n; xmm1 will be zero after this.\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -120, -64, -32, -16, 16, 32, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_128bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x6135a9d7e273f117\", \"0x5f6135a9d7e273f1\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x6334292db6b85f61\", \"0x34292db6b85f6135\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0x6135a9d7e273f117\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0x6334292db6b85f61\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvgatherqpd xmm15, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvgatherqpd xmm14, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvgatherqpd xmm13, [xmm0 * 1 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvgatherqpd xmm12, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvgatherqpd xmm11, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvgatherqpd xmm10, [xmm0 * 1 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvgatherqpd xmm9, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvgatherqpd xmm8, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvgatherqpd xmm7, [xmm0 * 1 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm6, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm5, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm4, [xmm0 * 1 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm3, [xmm0 * 1 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -992, -512, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_128bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm15, [xmm0 * 1 + rax + 1], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_128bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x002fd22652633359\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xe273f1177f80d2ec\", \"0xa9d7e273f1177f80\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x1ce2bf6334292db6\", \"0xbf6334292db6b85f\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xe273f1177f80d2ec\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0x1ce2bf6334292db6\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvgatherqpd xmm15, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvgatherqpd xmm14, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvgatherqpd xmm13, [xmm0 * 2 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvgatherqpd xmm12, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvgatherqpd xmm11, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvgatherqpd xmm10, [xmm0 * 2 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvgatherqpd xmm9, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvgatherqpd xmm8, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvgatherqpd xmm7, [xmm0 * 2 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm6, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm5, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm4, [xmm0 * 2 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm3, [xmm0 * 2 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -504, -256, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_128bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 1\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 1\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 1\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 1\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm15, [xmm0 * 2 + rax + 2], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_128bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x7be65e82db698176\", \"0x7f80d2ec7be65e82\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x8a34fff5e9341ce2\", \"0xe9341ce2bf633429\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0x7be65e82db698176\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0x8a34fff5e9341ce2\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvgatherqpd xmm15, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvgatherqpd xmm14, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvgatherqpd xmm13, [xmm0 * 4 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvgatherqpd xmm12, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvgatherqpd xmm11, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvgatherqpd xmm10, [xmm0 * 4 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvgatherqpd xmm9, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvgatherqpd xmm8, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvgatherqpd xmm7, [xmm0 * 4 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm6, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm5, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm4, [xmm0 * 4 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm3, [xmm0 * 4 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -248, -128, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_128bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 2\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 2\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 2\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 2\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm15, [xmm0 * 4 + rax + 4], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_128bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2b43dbebde37bc4f\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x3087464d8aa16a60\", \"0x33b7153e97ba9a8e\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xb8c6d8a6df6efe3b\", \"0x3fd4ea2f8a34fff5\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0x3087464d8aa16a60\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xb8c6d8a6df6efe3b\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvgatherqpd xmm15, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvgatherqpd xmm14, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvgatherqpd xmm13, [xmm0 * 8 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvgatherqpd xmm12, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvgatherqpd xmm11, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvgatherqpd xmm10, [xmm0 * 8 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvgatherqpd xmm9, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvgatherqpd xmm8, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvgatherqpd xmm7, [xmm0 * 8 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm6, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm5, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm4, [xmm0 * 8 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm3, [xmm0 * 8 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -120, -64, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_128bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 3\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 3\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 3\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 3\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvgatherqpd xmm15, [xmm0 * 8 + rax + 8], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_256bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0x71e5d85fc21448dd\", \"0x464061a9f6300511\"],\n    \"XMM4\":  [\"0x6135a9d7e273f117\", \"0x5f6135a9d7e273f1\", \"0xb85f6135a9d7e273\", \"0xb6b85f6135a9d7e2\"],\n    \"XMM5\":  [\"0x6334292db6b85f61\", \"0x34292db6b85f6135\", \"0x292db6b85f6135a9\", \"0x2db6b85f6135a9d7\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0x6135a9d7e273f117\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0x6334292db6b85f61\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xb6b85f6135a9d7e2\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvgatherqpd ymm15, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvgatherqpd ymm14, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvgatherqpd ymm13, [ymm0 * 1 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvgatherqpd ymm12, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvgatherqpd ymm11, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvgatherqpd ymm10, [ymm0 * 1 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvgatherqpd ymm9, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvgatherqpd ymm8, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvgatherqpd ymm7, [ymm0 * 1 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm6, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm5, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm4, [ymm0 * 1 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm3, [ymm0 * 1 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -992, -512, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_256bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm15, [ymm0 * 1 + rax + 1], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_256bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x002fd22652633359\", \"0x6778ae2a2522e0af\", \"0x71e5d85fc21448dd\", \"0x98f0351d59f4e95c\"],\n    \"XMM4\":  [\"0xe273f1177f80d2ec\", \"0xa9d7e273f1177f80\", \"0x6135a9d7e273f117\", \"0xb85f6135a9d7e273\"],\n    \"XMM5\":  [\"0x1ce2bf6334292db6\", \"0xbf6334292db6b85f\", \"0x34292db6b85f6135\", \"0x2db6b85f6135a9d7\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0xe273f1177f80d2ec\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0x1ce2bf6334292db6\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xb85f6135a9d7e273\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvgatherqpd ymm15, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvgatherqpd ymm14, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvgatherqpd ymm13, [ymm0 * 2 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvgatherqpd ymm12, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvgatherqpd ymm11, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvgatherqpd ymm10, [ymm0 * 2 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvgatherqpd ymm9, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvgatherqpd ymm8, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvgatherqpd ymm7, [ymm0 * 2 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm6, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm5, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm4, [ymm0 * 2 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm3, [ymm0 * 2 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -504, -256, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_256bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 1\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 1\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 1\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 1\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm15, [ymm0 * 2 + rax + 2], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_256bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0x71e5d85fc21448dd\", \"0x464061a9f6300511\"],\n    \"XMM4\":  [\"0x7be65e82db698176\", \"0x7f80d2ec7be65e82\", \"0xe273f1177f80d2ec\", \"0x6135a9d7e273f117\"],\n    \"XMM5\":  [\"0x8a34fff5e9341ce2\", \"0xe9341ce2bf633429\", \"0xbf6334292db6b85f\", \"0x2db6b85f6135a9d7\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0x7be65e82db698176\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0x8a34fff5e9341ce2\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7e273f117\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvgatherqpd ymm15, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvgatherqpd ymm14, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvgatherqpd ymm13, [ymm0 * 4 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvgatherqpd ymm12, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvgatherqpd ymm11, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvgatherqpd ymm10, [ymm0 * 4 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvgatherqpd ymm9, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvgatherqpd ymm8, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvgatherqpd ymm7, [ymm0 * 4 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm6, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm5, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm4, [ymm0 * 4 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm3, [ymm0 * 4 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -248, -128, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_256bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 2\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 2\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 2\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 2\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm15, [ymm0 * 4 + rax + 4], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_256bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2b43dbebde37bc4f\", \"0x6778ae2a2522e0af\", \"0x71e5d85fc21448dd\", \"0x59fc3ca8abf96d9b\"],\n    \"XMM4\":  [\"0x3087464d8aa16a60\", \"0x33b7153e97ba9a8e\", \"0x7be65e82db698176\", \"0xe273f1177f80d2ec\"],\n    \"XMM5\":  [\"0xb8c6d8a6df6efe3b\", \"0x3fd4ea2f8a34fff5\", \"0xe9341ce2bf633429\", \"0x2db6b85f6135a9d7\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0x3087464d8aa16a60\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0xb8c6d8a6df6efe3b\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xe273f1177f80d2ec\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvgatherqpd ymm15, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvgatherqpd ymm14, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvgatherqpd ymm13, [ymm0 * 8 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvgatherqpd ymm12, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvgatherqpd ymm11, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvgatherqpd ymm10, [ymm0 * 8 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvgatherqpd ymm9, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvgatherqpd ymm8, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvgatherqpd ymm7, [ymm0 * 8 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm6, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm5, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm4, [ymm0 * 8 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm3, [ymm0 * 8 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -120, -64, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qpd_256bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 3\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 3\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 3\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 3\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvgatherqpd ymm15, [ymm0 * 8 + rax + 8], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_128bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xd7e273f1e273f117\", \"0\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xb85f6135b6b85f61\", \"0\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda256e273f117\", \"0\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256b6b85f61\", \"0\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm15, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm14, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm13, [xmm0 * 1 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm12, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm11, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm10, [xmm0 * 1 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm9, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm8, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm7, [xmm0 * 1 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm6, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm5, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm4, [xmm0 * 1 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm3, [xmm0 * 1 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -992, -512, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_128bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm15, [xmm0 * 1 + rax + 1], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_128bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af52633359\", \"0\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xf1177f807f80d2ec\", \"0\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x2db6b85f34292db6\", \"0\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda2567f80d2ec\", \"0\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda25634292db6\", \"0\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm15, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm14, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm13, [xmm0 * 2 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm12, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm11, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm10, [xmm0 * 2 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm9, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm8, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm7, [xmm0 * 2 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm6, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm5, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm4, [xmm0 * 2 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm3, [xmm0 * 2 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -504, -256, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_128bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 1\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 1\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 1\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 1\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm15, [xmm0 * 2 + rax + 2], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_128bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x7be65e82db698176\", \"0\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xbf633429e9341ce2\", \"0\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda256db698176\", \"0\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256e9341ce2\", \"0\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm15, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm14, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm13, [xmm0 * 4 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm12, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm11, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm10, [xmm0 * 4 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm9, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm8, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm7, [xmm0 * 4 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm6, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm5, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm4, [xmm0 * 4 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm3, [xmm0 * 4 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -248, -128, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_128bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 2\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 2\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 2\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 2\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm15, [xmm0 * 4 + rax + 4], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_128bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0afde37bc4f\", \"0\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x97ba9a8e8aa16a60\", \"0\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x8a34fff5df6efe3b\", \"0\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda2568aa16a60\", \"0\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256df6efe3b\", \"0\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm15, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm14, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm13, [xmm0 * 8 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm12, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm11, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm10, [xmm0 * 8 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm9, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm8, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm7, [xmm0 * 8 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm6, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm5, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm4, [xmm0 * 8 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm3, [xmm0 * 8 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -120, -64, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_128bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 3\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 3\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 3\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 3\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm15, [xmm0 * 8 + rax + 8], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_256bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0xf6300511c21448dd\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xd7e273f1e273f117\", \"0x35a9d7e2a9d7e273\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xb85f6135b6b85f61\", \"0x6135a9d75f6135a9\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda256e273f117\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256b6b85f61\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm15, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm14, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm13, [ymm0 * 1 + rax], xmm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm12, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm11, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm10, [ymm0 * 1 + rax], xmm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm9, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm8, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm7, [ymm0 * 1 + rax], xmm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm6, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm5, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm4, [ymm0 * 1 + rax], xmm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm3, [ymm0 * 1 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -992, -512, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_256bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm15, [ymm0 * 1 + rax + 1], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_256bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af52633359\", \"0x59f4e95cc21448dd\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xf1177f807f80d2ec\", \"0xa9d7e273e273f117\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x2db6b85f34292db6\", \"0x6135a9d7b85f6135\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda2567f80d2ec\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda25634292db6\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm15, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm14, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm13, [ymm0 * 2 + rax], xmm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm12, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm11, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm10, [ymm0 * 2 + rax], xmm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm9, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm8, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm7, [ymm0 * 2 + rax], xmm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm6, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm5, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm4, [ymm0 * 2 + rax], xmm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm3, [ymm0 * 2 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -504, -256, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_256bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 1\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 1\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 1\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 1\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm15, [ymm0 * 2 + rax + 2], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_256bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0xf6300511c21448dd\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x7be65e82db698176\", \"0xe273f1177f80d2ec\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xbf633429e9341ce2\", \"0x6135a9d72db6b85f\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda256db698176\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256e9341ce2\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm15, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm14, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm13, [ymm0 * 4 + rax], xmm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm12, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm11, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm10, [ymm0 * 4 + rax], xmm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm9, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm8, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm7, [ymm0 * 4 + rax], xmm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm6, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm5, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm4, [ymm0 * 4 + rax], xmm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm3, [ymm0 * 4 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -248, -128, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_256bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 2\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 2\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 2\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 2\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm15, [ymm0 * 4 + rax + 4], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_256bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0afde37bc4f\", \"0xabf96d9bc21448dd\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x97ba9a8e8aa16a60\", \"0x7f80d2ecdb698176\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x8a34fff5df6efe3b\", \"0x6135a9d7bf633429\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda2568aa16a60\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256df6efe3b\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm15, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm14, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvgatherqps xmm13, [ymm0 * 8 + rax], xmm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm12, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm11, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvgatherqps xmm10, [ymm0 * 8 + rax], xmm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm9, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm8, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvgatherqps xmm7, [ymm0 * 8 + rax], xmm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm6, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm5, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm4, [ymm0 * 8 + rax], xmm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm3, [ymm0 * 8 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -120, -64, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vgather_qps_256bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 3\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 3\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 3\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 3\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvgatherqps xmm15, [ymm0 * 8 + rax + 8], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vhaddpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x3FF0000000000000\", \"0x4000000000000000\", \"0x3FF0000000000000\", \"0x4000000000000000\"],\n    \"XMM1\": [\"0x4010000000000000\", \"0x4020000000000000\", \"0x4010000000000000\", \"0x4020000000000000\"],\n    \"XMM2\": [\"0x4008000000000000\", \"0x4028000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4008000000000000\", \"0x4028000000000000\", \"0x4008000000000000\", \"0x4028000000000000\"],\n    \"XMM4\": [\"0x4008000000000000\", \"0x4028000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4008000000000000\", \"0x4028000000000000\", \"0x4008000000000000\", \"0x4028000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvhaddpd xmm2, xmm0, xmm1\nvhaddpd ymm3, ymm0, ymm1\n\nvhaddpd xmm4, xmm0, [rdx + 32]\nvhaddpd ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000 ; 1.0\ndq 0x4000000000000000 ; 2.0\ndq 0x3FF0000000000000 ; 1.0\ndq 0x4000000000000000 ; 2.0\n\ndq 0x4010000000000000 ; 4.0\ndq 0x4020000000000000 ; 8.0\ndq 0x4010000000000000 ; 4.0\ndq 0x4020000000000000 ; 8.0\n"
  },
  {
    "path": "unittests/ASM/VEX/vhaddps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x3F80000040000000\", \"0x4080000041000000\", \"0x3F80000040000000\", \"0x4080000041000000\"],\n    \"XMM1\": [\"0x4180000042000000\", \"0x4280000043000000\", \"0x4180000042000000\", \"0x4280000043000000\"],\n    \"XMM2\": [\"0x4140000040400000\", \"0x4340000042400000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4140000040400000\", \"0x4340000042400000\", \"0x4140000040400000\", \"0x4340000042400000\"],\n    \"XMM4\": [\"0x4140000040400000\", \"0x4340000042400000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4140000040400000\", \"0x4340000042400000\", \"0x4140000040400000\", \"0x4340000042400000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvhaddps xmm2, xmm0, xmm1\nvhaddps ymm3, ymm0, ymm1\n\nvhaddps xmm4, xmm0, [rdx + 32]\nvhaddps ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x3F80000040000000 ; 1.0, 2.0\ndq 0x4080000041000000 ; 4.0, 8.0\ndq 0x3F80000040000000 ; 1.0, 2.0\ndq 0x4080000041000000 ; 4.0, 8.0\n\ndq 0x4180000042000000 ; 16.0, 32.0\ndq 0x4280000043000000 ; 64.0, 128.0\ndq 0x4180000042000000 ; 16.0, 32.0\ndq 0x4280000043000000 ; 64.0, 128.0\n"
  },
  {
    "path": "unittests/ASM/VEX/vhsubpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x3FF0000000000000\", \"0x4010000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x3FF0000000000000\", \"0x4010000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x3FF0000000000000\", \"0x4010000000000000\", \"0xC08F600000000000\", \"0xC05D000000000000\"],\n    \"XMM5\": [\"0x3FF0000000000000\", \"0x4010000000000000\", \"0xC08F600000000000\", \"0xC05D000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvhsubpd xmm2, xmm0, xmm1\nvhsubpd xmm3, xmm0, [rdx + 32]\n\nvhsubpd ymm4, ymm0, ymm1\nvhsubpd ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4000000000000000 ; 2.0\ndq 0x3FF0000000000000 ; 1.0\ndq 0x4034000000000000 ; 20.0\ndq 0x4090000000000000 ; 1024.0\n\ndq 0x4020000000000000 ; 8.0\ndq 0x4010000000000000 ; 4.0\ndq 0x4028000000000000 ; 12.0\ndq 0x4060000000000000 ; 128.0\n"
  },
  {
    "path": "unittests/ASM/VEX/vhsubps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x447B00003F800000\", \"0xC53FF000C1880000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x447B00003F800000\", \"0xC53FF000C1880000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x447B00003F800000\", \"0xC53FF000C1880000\", \"0xC2540000C2A80000\", \"0x43BF800000000000\"],\n    \"XMM5\": [\"0x447B00003F800000\", \"0xC53FF000C1880000\", \"0xC2540000C2A80000\", \"0x43BF800000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvhsubps xmm2, xmm0, xmm1\nvhsubps xmm3, xmm0, [rdx + 32]\n\nvhsubps ymm4, ymm0, ymm1\nvhsubps ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x3F80000040000000 ; 1.0  , 2.0\ndq 0x41A0000044800000 ; 20.0 , 1024.0\ndq 0x42F0000042100000 ; 120.0, 36.0\ndq 0x429C000041C80000 ; 78.0 , 25.0\n\ndq 0x42A4000042820000 ; 82.0  , 65.0\ndq 0x457FF00044800000 ; 4095.0, 1024.0\ndq 0xC1A00000C1A00000 ; -20   , -20\ndq 0xC2FE000043800000 ; -127.0, 256.0\n"
  },
  {
    "path": "unittests/ASM/VEX/vinsertf128.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM1\": [\"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\", \"0xCCCCCCCCCCCCCCCC\", \"0x9999999999999999\"],\n    \"XMM2\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\"],\n    \"XMM3\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\"],\n    \"XMM4\": [\"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\", \"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM5\": [\"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\", \"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM6\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\"],\n    \"XMM7\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\"],\n    \"XMM8\": [\"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\", \"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM9\": [\"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\", \"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Insert into upper lane\nvinsertf128 ymm2, ymm0, xmm1, 1\nvinsertf128 ymm3, ymm0, [rdx + 32], 1\n\n; Insert into lower lane\nvinsertf128 ymm4, ymm0, xmm1, 0\nvinsertf128 ymm5, ymm0, [rdx + 32], 0\n\n; Insert into upper lane - With garbage\nvinsertf128 ymm6, ymm0, xmm1, 0xFF\nvinsertf128 ymm7, ymm0, [rdx + 32], 0xFF\n\n; Insert into lower lane - With garbage\nvinsertf128 ymm8, ymm0, xmm1, 0xFE\nvinsertf128 ymm9, ymm0, [rdx + 32], 0xFE\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000\ndq 0xEEEEEEEEEEEEEEEE\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xAAAAAAAAAAAAAAAA\n\ndq 0xBBBBBBBBBBBBBBBB\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\ndq 0x9999999999999999\n"
  },
  {
    "path": "unittests/ASM/VEX/vinserti128.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM1\": [\"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\", \"0xCCCCCCCCCCCCCCCC\", \"0x9999999999999999\"],\n    \"XMM2\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\"],\n    \"XMM3\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\"],\n    \"XMM4\": [\"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\", \"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM5\": [\"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\", \"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM6\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\"],\n    \"XMM7\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\"],\n    \"XMM8\": [\"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\", \"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM9\": [\"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\", \"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Insert into upper lane\nvinserti128 ymm2, ymm0, xmm1, 1\nvinserti128 ymm3, ymm0, [rdx + 32], 1\n\n; Insert into lower lane\nvinserti128 ymm4, ymm0, xmm1, 0\nvinserti128 ymm5, ymm0, [rdx + 32], 0\n\n; Insert into upper lane - With garbage\nvinserti128 ymm6, ymm0, xmm1, 0xFF\nvinserti128 ymm7, ymm0, [rdx + 32], 0xFF\n\n; Insert into lower lane - With garbage\nvinserti128 ymm8, ymm0, xmm1, 0xFE\nvinserti128 ymm9, ymm0, [rdx + 32], 0xFE\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000\ndq 0xEEEEEEEEEEEEEEEE\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xAAAAAAAAAAAAAAAA\n\ndq 0xBBBBBBBBBBBBBBBB\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\ndq 0x9999999999999999\n"
  },
  {
    "path": "unittests/ASM/VEX/vinsertps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0x4142434465666768\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x4142434461626364\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x7576777845464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x4142434445464748\", \"0x5152535471727374\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x4142434445464748\", \"0x7576777855565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x4142434445464748\", \"0x5152535475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x7576777845464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x4142434475767778\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x0000000065666768\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x0000000061626364\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd xmm0, [rdx]\nvmovapd xmm1, [rdx + 16]\n\n; Simple move Reg<-Reg\nvinsertps xmm2, xmm0, xmm1, ((0b00 << 6) | (0b00 << 4) | (0b0000))\nvinsertps xmm3, xmm0, xmm1, ((0b01 << 6) | (0b00 << 4) | (0b0000))\nvinsertps xmm4, xmm0, xmm1, ((0b10 << 6) | (0b01 << 4) | (0b0000))\nvinsertps xmm5, xmm0, xmm1, ((0b11 << 6) | (0b10 << 4) | (0b0000))\n\n; Simple move Reg<-Mem\nvinsertps xmm6, xmm0, [rdx + 8 * 3], ((0b00 << 6) | (0b11 << 4) | (0b0000))\nvinsertps xmm7, xmm0, [rdx + 8 * 3], ((0b01 << 6) | (0b10 << 4) | (0b0000))\nvinsertps xmm8, xmm0, [rdx + 8 * 3], ((0b10 << 6) | (0b01 << 4) | (0b0000))\nvinsertps xmm9, xmm0, [rdx + 8 * 3], ((0b11 << 6) | (0b00 << 4) | (0b0000))\n\n; Simple move Reg<-Reg with mask\nvinsertps xmm10, xmm0, xmm1, ((0b00 << 6) | (0b00 << 4) | (0b0010))\nvinsertps xmm11, xmm0, xmm1, ((0b01 << 6) | (0b00 << 4) | (0b0010))\n\n; Full ZMask\nvinsertps xmm12, xmm0, xmm1, ((0b00 << 6) | (0b00 << 4) | (0b1111))\n\n; Full ZMask, with garbage in the upper bits\nvmovapd ymm13, [rel .data_bad]\nvinsertps xmm13, xmm0, xmm1, ((0b00 << 6) | (0b00 << 4) | (0b1111))\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data_bad:\ndq 0x1111111122222222\ndq 0x3333333344444444\ndq 0x5555555566666666\ndq 0x7777777788888888\n"
  },
  {
    "path": "unittests/ASM/VEX/vlddqu.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvlddqu xmm0, [rdx + 16 * 1]\nvlddqu ymm1, [rdx + 32 * 0]\n\nhlt\n\nalign 16\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vldmxcsr.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0xFFC0\"\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Currently we only implement setting the rounding mode and FTZ bit,\n; so load junk into all the bits and check if we set the mode\n;\n; Result should be the default MXCSR (0x1F80) with the rounding\n; mode bits (bits 13 and 14) and FTZ bit (bit 15) all set.\n;\n; Essentially just a small test to ensure we are indeed setting and saving\n; the bits that we do emulate.\n\nvldmxcsr [rdx]\nvstmxcsr [rdx]\nmov rax, [rdx]\n\nhlt\n\nalign 4\n.data:\ndq 0x000000000000FFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vmaskmovdqu.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0x5152535455565758\",\n    \"RCX\": \"0x41424344FFFFFFFF\",\n    \"RSP\": \"0x51525354FFFFFFFF\",\n    \"RSI\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RDI\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps xmm0, [rdx + 16 * 0]\nvmovaps xmm1, [rdx + 16 * 1]\nvmovaps xmm2, [rdx + 16 * 2]\nvmovaps xmm3, [rdx + 16 * 3]\n\nlea rdi, [rdx + 16 * 4]\nvmaskmovdqu xmm0, xmm1\n\nlea rdi, [rdx + 16 * 5]\nvmaskmovdqu xmm0, xmm2\n\nlea rdi, [rdx + 16 * 6]\nvmaskmovdqu xmm0, xmm3\n\nmov rax, qword [rdx + 8 * 8]\nmov rbx, qword [rdx + 8 * 9]\n\nmov rcx, qword [rdx + 8 * 10]\nmov rsp, qword [rdx + 8 * 11]\n\nmov rsi, qword [rdx + 8 * 12]\nmov rdi, qword [rdx + 8 * 13]\n\nhlt\n\nalign 4096\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x8080808080808080\ndq 0x8080808080808080\n\ndq 0x8080808000000000\ndq 0x8080808000000000\n\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq -1\ndq -1\n\ndq -1\ndq -1\n\ndq -1\ndq -1\n"
  },
  {
    "path": "unittests/ASM/VEX/vmaskmovpd_load.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0x8868C3F30AED56E0\", \"0x10FCE9E284E6E6DE\", \"0x1DDDDDDD8DDDDDDD\", \"0x8CCCCCCC0CCCCCCC\"],\n      \"XMM1\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\"],\n      \"XMM3\": [\"0xA76C4F06A12BFCE0\", \"0x0000000000000000\", \"0x0000000000000000\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM4\": [\"0xA76C4F06A12BFCE0\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM7\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM8\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32]\nvmovaps ymm1, [rdx + 64]\nvmovaps ymm2, [rdx + 96]\n\nvmaskmovpd ymm3, ymm0, [rdx]\nvmaskmovpd xmm4, xmm0, [rdx]\n\nvmaskmovpd ymm5, ymm1, [rdx]\nvmaskmovpd xmm6, xmm1, [rdx]\n\nvmaskmovpd ymm7, ymm2, [rdx]\nvmaskmovpd xmm8, xmm2, [rdx]\n\nhlt\n\nalign 4096\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\n; Disastrously organized mask (sign mask [1, 0, 0, 1])\ndq 0x8868C3F30AED56E0\ndq 0x10FCE9E284E6E6DE\ndq 0x1DDDDDDD8DDDDDDD\ndq 0x8CCCCCCC0CCCCCCC\n\n; No masking at all. Should not touch memory at all.\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n; Select all elements\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vmaskmovpd_store.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0x8868C3F30AED56E0\", \"0x10FCE9E284E6E6DE\", \"0x1DDDDDDD8DDDDDDD\", \"0x8CCCCCCC0CCCCCCC\"],\n      \"XMM1\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\"],\n      \"XMM3\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM4\": [\"0xA76C4F06A12BFCE0\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM5\": [\"0xA76C4F06A12BFCE0\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM6\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM7\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM8\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM9\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32]\nvmovaps ymm1, [rdx + 64]\nvmovaps ymm2, [rdx + 96]\nvmovaps ymm3, [rdx]\n\nvmaskmovpd [rel .scratch1], ymm0, ymm3\nvmaskmovpd [rel .scratch2], xmm0, xmm3\n\nvmaskmovpd [rel .scratch3], ymm1, ymm3\nvmaskmovpd [rel .scratch4], xmm1, xmm3\n\nvmaskmovpd [rel .scratch5], ymm2, ymm3\nvmaskmovpd [rel .scratch6], xmm2, xmm3\n\n; Now reload to verify results\nvmovaps ymm4, [rel .scratch1]\nvmovaps ymm5, [rel .scratch2]\nvmovaps ymm6, [rel .scratch3]\nvmovaps ymm7, [rel .scratch4]\nvmovaps ymm8, [rel .scratch5]\nvmovaps ymm9, [rel .scratch6]\n\nhlt\n\nalign 4096\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xEEEEEEEEEEEEEEEE\n\n; Disastrously organized mask (sign mask [1, 0, 0, 1])\ndq 0x8868C3F30AED56E0\ndq 0x10FCE9E284E6E6DE\ndq 0x1DDDDDDD8DDDDDDD\ndq 0x8CCCCCCC0CCCCCCC\n\n; No masking at all. Should not touch memory at all.\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n; Select all elements\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\n\n.scratch1:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch2:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch3:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch4:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch5:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch6:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vmaskmovps_load.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0x0868C3F30AED56E0\", \"0x80FCE9E284E6E6DE\", \"0x8DDDDDDD8DDDDDDD\", \"0x0CCCCCCC0CCCCCCC\"],\n      \"XMM1\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\"],\n      \"XMM3\": [\"0x0000000000000000\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n      \"XMM4\": [\"0x0000000000000000\", \"0x9B80767F1E6A060F\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM7\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM8\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32]\nvmovaps ymm1, [rdx + 64]\nvmovaps ymm2, [rdx + 96]\n\nvmaskmovps ymm3, ymm0, [rdx]\nvmaskmovps xmm4, xmm0, [rdx]\n\nvmaskmovps ymm5, ymm1, [rdx]\nvmaskmovps xmm6, xmm1, [rdx]\n\nvmaskmovps ymm7, ymm2, [rdx]\nvmaskmovps xmm8, xmm2, [rdx]\n\nhlt\n\nalign 4096\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\n; Disastrously organized mask (sign mask [0, 0, 1, 1, 1, 1, 0, 0])\ndq 0x0868C3F30AED56E0\ndq 0x80FCE9E284E6E6DE\ndq 0x8DDDDDDD8DDDDDDD\ndq 0x0CCCCCCC0CCCCCCC\n\n; No masking at all. Should not touch memory at all.\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n; Select all elements\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vmaskmovps_store.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0x0868C3F30AED56E0\", \"0x80FCE9E284E6E6DE\", \"0x8DDDDDDD8DDDDDDD\", \"0x0CCCCCCC0CCCCCCC\"],\n      \"XMM1\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\"],\n      \"XMM3\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0x9B80767F1E6A060F\", \"0xDDDDDDDDDDDDDDDD\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM5\": [\"0xFFFFFFFFFFFFFFFF\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM6\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM7\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM8\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM9\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32]\nvmovaps ymm1, [rdx + 64]\nvmovaps ymm2, [rdx + 96]\nvmovaps ymm3, [rdx]\n\nvmaskmovps [rel .scratch1], ymm0, ymm3\nvmaskmovps [rel .scratch2], xmm0, xmm3\n\nvmaskmovps [rel .scratch3], ymm1, ymm3\nvmaskmovps [rel .scratch4], xmm1, xmm3\n\nvmaskmovps [rel .scratch5], ymm2, ymm3\nvmaskmovps [rel .scratch6], xmm2, xmm3\n\n; Now reload to verify results\nvmovaps ymm4, [rel .scratch1]\nvmovaps ymm5, [rel .scratch2]\nvmovaps ymm6, [rel .scratch3]\nvmovaps ymm7, [rel .scratch4]\nvmovaps ymm8, [rel .scratch5]\nvmovaps ymm9, [rel .scratch6]\n\nhlt\n\nalign 4096\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xEEEEEEEEEEEEEEEE\n\n; Disastrously organized mask (sign mask [0, 0, 1, 1, 1, 1, 0, 0])\ndq 0x0868C3F30AED56E0\ndq 0x80FCE9E284E6E6DE\ndq 0x8DDDDDDD8DDDDDDD\ndq 0x0CCCCCCC0CCCCCCC\n\n; No masking at all. Should not touch memory at all.\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n; Select all elements\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\n\n.scratch1:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch2:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch3:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch4:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch5:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch6:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vmaxpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4008000000000000\", \"0x4000000000000000\", \"0x4008000000000000\", \"0x4000000000000000\"],\n    \"XMM1\": [\"0x3FF0000000000000\", \"0x4008000000000000\", \"0x3FF0000000000000\", \"0x4008000000000000\"],\n    \"XMM2\": [\"0x4008000000000000\", \"0x4008000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4008000000000000\", \"0x4008000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4008000000000000\", \"0x4008000000000000\", \"0x4008000000000000\", \"0x4008000000000000\"],\n    \"XMM5\": [\"0x4008000000000000\", \"0x4008000000000000\", \"0x4008000000000000\", \"0x4008000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Memory operand\nvmaxpd xmm2, xmm0, [rdx + 32]\nvmaxpd ymm4, ymm0, [rdx + 32]\n\n; Register only\nvmaxpd xmm3, xmm0, xmm1\nvmaxpd ymm5, ymm1, ymm0\n\nhlt\n\nalign 32\n.data:\ndq 0x4008000000000000\ndq 0x4000000000000000\ndq 0x4008000000000000\ndq 0x4000000000000000\n\ndq 0x3FF0000000000000\ndq 0x4008000000000000\ndq 0x3FF0000000000000\ndq 0x4008000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vmaxps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x400000003F800000\", \"0x4080000040400000\", \"0x400000003F800000\", \"0x4080000040400000\"],\n    \"XMM1\": [\"0x40C0000040A00000\", \"0x4100000040E00000\", \"0x40C0000040A00000\", \"0x4100000040E00000\"],\n    \"XMM2\": [\"0x40C0000040A00000\", \"0x4100000040E00000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x40C0000040A00000\", \"0x4100000040E00000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x40C0000040A00000\", \"0x4100000040E00000\", \"0x40C0000040A00000\", \"0x4100000040E00000\"],\n    \"XMM5\": [\"0x40C0000040A00000\", \"0x4100000040E00000\", \"0x40C0000040A00000\", \"0x4100000040E00000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Memory operand\nvmaxps xmm2, xmm0, [rdx + 32]\nvmaxps ymm4, ymm0, [rdx + 32]\n\n; Register only\nvmaxps xmm3, xmm0, xmm1\nvmaxps ymm5, ymm1, ymm0\n\nhlt\n\nalign 32\n.data:\ndq 0x400000003F800000 ; 2, 1\ndq 0x4080000040400000 ; 4, 3\ndq 0x400000003F800000 ; 2, 1\ndq 0x4080000040400000 ; 4, 3\n\ndq 0x40C0000040A00000 ; 6, 5\ndq 0x4100000040E00000 ; 8, 7\ndq 0x40C0000040A00000 ; 6, 5\ndq 0x4100000040E00000 ; 8, 7\n"
  },
  {
    "path": "unittests/ASM/VEX/vmaxsd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4010000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x4010000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x4030000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4030000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x4039000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4039000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x4039000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x4030000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM9\": [\"0x4039000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\n\n; Register only\nvmaxsd xmm0, xmm0, xmm1\nvmaxsd xmm2, xmm2, xmm3\n\n; Memory operand\nvmaxsd xmm5, xmm4, [rdx + 32 * 1]\nvmaxsd xmm4, xmm4, [rdx + 32 * 0]\n\n; Merging different src into destination\nvpxor xmm7, xmm7, xmm7\nvmovapd ymm8, [rdx + 32 * 3]\nvmovapd ymm9, [rdx + 32 * 4]\nvmaxsd xmm7, xmm8, xmm9\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000 ; 1.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4010000000000000 ; 4.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4022000000000000 ; 9.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4030000000000000 ; 16.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4039000000000000 ; 25.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vmaxss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434440800000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x4142434440800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x4142434441800000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434441800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x4142434441C80000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4142434441C80000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x4142434441C80000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x4142434441800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM9\": [\"0x4142434441C80000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\n\n; Register only\nvmaxss xmm0, xmm0, xmm1\nvmaxss xmm2, xmm2, xmm3\n\n; Memory operand\nvmaxss xmm5, xmm4, [rdx + 32 * 1]\nvmaxss xmm4, xmm4, [rdx + 32 * 0]\n\n; Merging different src into destination\nvpxor xmm7, xmm7, xmm7\nvmovapd ymm8, [rdx + 32 * 3]\nvmovapd ymm9, [rdx + 32 * 4]\nvmaxss xmm7, xmm8, xmm9\n\nhlt\n\nalign 32\n.data:\ndq 0x414243443F800000 ; 1.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434440800000 ; 4.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441100000 ; 9.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441800000 ; 16.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441C80000 ; 25.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vminpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4008000000000000\", \"0x4000000000000000\", \"0x4008000000000000\", \"0x4000000000000000\"],\n    \"XMM1\": [\"0x3FF0000000000000\", \"0x4008000000000000\", \"0x3FF0000000000000\", \"0x4008000000000000\"],\n    \"XMM2\": [\"0x3FF0000000000000\", \"0x4000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x3FF0000000000000\", \"0x4000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x3FF0000000000000\", \"0x4000000000000000\", \"0x3FF0000000000000\", \"0x4000000000000000\"],\n    \"XMM5\": [\"0x3FF0000000000000\", \"0x4000000000000000\", \"0x3FF0000000000000\", \"0x4000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Memory operand\nvminpd xmm2, xmm0, [rdx + 32]\nvminpd ymm4, ymm0, [rdx + 32]\n\n; Register only\nvminpd xmm3, xmm0, xmm1\nvminpd ymm5, ymm1, ymm0\n\nhlt\n\nalign 32\n.data:\ndq 0x4008000000000000\ndq 0x4000000000000000\ndq 0x4008000000000000\ndq 0x4000000000000000\n\ndq 0x3FF0000000000000\ndq 0x4008000000000000\ndq 0x3FF0000000000000\ndq 0x4008000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vminps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x400000003F800000\", \"0x4080000040400000\", \"0x400000003F800000\", \"0x4080000040400000\"],\n    \"XMM1\": [\"0x40C0000040A00000\", \"0x4100000040E00000\", \"0x40C0000040A00000\", \"0x4100000040E00000\"],\n    \"XMM2\": [\"0x400000003F800000\", \"0x4080000040400000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x400000003F800000\", \"0x4080000040400000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x400000003F800000\", \"0x4080000040400000\", \"0x400000003F800000\", \"0x4080000040400000\"],\n    \"XMM5\": [\"0x400000003F800000\", \"0x4080000040400000\", \"0x400000003F800000\", \"0x4080000040400000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Memory operand\nvminps xmm2, xmm0, [rdx + 32]\nvminps ymm4, ymm0, [rdx + 32]\n\n; Register only\nvminps xmm3, xmm0, xmm1\nvminps ymm5, ymm1, ymm0\n\nhlt\n\nalign 32\n.data:\ndq 0x400000003F800000 ; 2, 1\ndq 0x4080000040400000 ; 4, 3\ndq 0x400000003F800000 ; 2, 1\ndq 0x4080000040400000 ; 4, 3\n\ndq 0x40C0000040A00000 ; 6, 5\ndq 0x4100000040E00000 ; 8, 7\ndq 0x40C0000040A00000 ; 6, 5\ndq 0x4100000040E00000 ; 8, 7\n"
  },
  {
    "path": "unittests/ASM/VEX/vminsd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x3FF0000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x4010000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x4022000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4030000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x3FF0000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4010000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x4030000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x4030000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM9\": [\"0x4039000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\n\n; Register only\nvminsd xmm0, xmm0, xmm1\nvminsd xmm2, xmm2, xmm3\n\n; Memory operand\nvminsd xmm5, xmm4, [rdx + 32 * 1]\nvminsd xmm4, xmm4, [rdx + 32 * 0]\n\n; Merging different src into destination\nvpxor xmm7, xmm7, xmm7\nvmovapd ymm8, [rdx + 32 * 3]\nvmovapd ymm9, [rdx + 32 * 4]\nvminsd xmm7, xmm8, xmm9\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000 ; 1.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4010000000000000 ; 4.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4022000000000000 ; 9.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4030000000000000 ; 16.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4039000000000000 ; 25.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vminss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x414243443F800000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x4142434440800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x4142434441100000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434441800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x414243443F800000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4142434440800000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x4142434441800000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x4142434441800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM9\": [\"0x4142434441C80000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\n\n; Register only\nvminss xmm0, xmm0, xmm1\nvminss xmm2, xmm2, xmm3\n\n; Memory operand\nvminss xmm5, xmm4, [rdx + 32 * 1]\nvminss xmm4, xmm4, [rdx + 32 * 0]\n\n; Merging different src into destination\nvpxor xmm7, xmm7, xmm7\nvmovapd ymm8, [rdx + 32 * 3]\nvmovapd ymm9, [rdx + 32 * 4]\nvminss xmm7, xmm8, xmm9\n\nhlt\n\nalign 32\n.data:\ndq 0x414243443F800000 ; 1.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434440800000 ; 4.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441100000 ; 9.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441800000 ; 16.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441C80000 ; 25.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovapd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM3\": [\"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Load inputs\nvmovapd ymm1, [rdx]\nvmovapd xmm2, [rdx]\nvmovapd ymm3, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovapd_mem.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x6162636465666768\",\n    \"RBX\": \"0x7172737475767778\",\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0xCCCCCCCCCCCCCCCC\nmov [rdx + 8 * 4], rax\nmov rax, 0xDDDDDDDDDDDDDDDD\nmov [rdx + 8 * 5], rax\nmov rax, 0xEEEEEEEEEEEEEEEE\nmov [rdx + 8 * 6], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 7], rax\n\n; Test truncation\nvmovapd ymm2, [rdx + 8 * 4]\nvmovapd xmm2, [rdx + 8 * 4]\n\n; Test memory overwrite\nvmovapd ymm0, [rdx]\nvmovapd [rdx + 8 * 4], ymm0\nvmovapd ymm1, ymm0\n\nmov rax, [rdx + 8 * 6]\nmov rbx, [rdx + 8 * 7]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovaps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM3\": [\"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Load inputs\nvmovaps ymm1, [rdx]\nvmovaps xmm2, [rdx]\nvmovaps ymm3, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovaps_mem.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x6162636465666768\",\n    \"RBX\": \"0x7172737475767778\",\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0xCCCCCCCCCCCCCCCC\nmov [rdx + 8 * 4], rax\nmov rax, 0xDDDDDDDDDDDDDDDD\nmov [rdx + 8 * 5], rax\nmov rax, 0xEEEEEEEEEEEEEEEE\nmov [rdx + 8 * 6], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 7], rax\n\n; Test truncation\nvmovaps ymm2, [rdx + 8 * 4]\nvmovaps xmm2, [rdx + 8 * 4]\n\n; Test memory overwrite\nvmovaps ymm0, [rdx]\nvmovaps [rdx + 8 * 4], ymm0\nvmovaps ymm1, ymm0\n\nmov rax, [rdx + 8 * 6]\nmov rbx, [rdx + 8 * 7]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovddup.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0xEEEEEEEEFFFFFFFF\", \"0xCCCCCCCCDDDDDDDD\", \"0xAAAAAAAABBBBBBBB\", \"0x0808080809090909\"],\n      \"XMM1\": [\"0xEEEEEEEEFFFFFFFF\", \"0xEEEEEEEEFFFFFFFF\", \"0xAAAAAAAABBBBBBBB\", \"0xAAAAAAAABBBBBBBB\"],\n      \"XMM2\": [\"0xEEEEEEEEFFFFFFFF\", \"0xEEEEEEEEFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM3\": [\"0xEEEEEEEEFFFFFFFF\", \"0xEEEEEEEEFFFFFFFF\", \"0xAAAAAAAABBBBBBBB\", \"0xAAAAAAAABBBBBBBB\"],\n      \"XMM4\": [\"0xEEEEEEEEFFFFFFFF\", \"0xEEEEEEEEFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\": [\"0xEEEEEEEEFFFFFFFF\", \"0xEEEEEEEEFFFFFFFF\", \"0xAAAAAAAABBBBBBBB\", \"0xAAAAAAAABBBBBBBB\"],\n      \"XMM6\": [\"0xCCCCCCCCDDDDDDDD\", \"0xCCCCCCCCDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n;; Register duplication\nvmovapd ymm0, [rdx]\nvmovddup ymm1, ymm0\n; 128-bit\nvmovddup xmm2, xmm0\n\n;; Same register\nvmovapd ymm3, ymm0\nvmovddup ymm3, ymm3\n; 128-bit\nvmovapd ymm4, ymm0\nvmovddup xmm4, xmm4\n\n;; From memory\nvmovddup ymm5, [rdx]\n; 128-bit\nvmovddup xmm6, [rdx + 8]\n\nhlt\n\nalign 32\n.data:\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xEE, 0xEE, 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC\ndb 0xBB, 0xBB, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovdqa.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM3\": [\"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\"],\n      \"XMM4\": [\"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM5\": [\"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM6\": [\"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Load inputs\nvmovdqa ymm1, [rdx]\nvmovdqa xmm2, [rdx]\nvmovdqa ymm3, [rdx + 32]\n\n; Test memory overwrite\nmov rax, 0xCCCCCCCCCCCCCCCC\nmov [rdx + 32], rax\nmov rax, 0xDDDDDDDDDDDDDDDD\nmov [rdx + 40], rax\nmov rax, 0xEEEEEEEEEEEEEEEE\nmov [rdx + 48], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 56], rax\n\nvmovdqa ymm4, [rdx + 32]\nvmovdqa [rdx], xmm4\nvmovapd ymm5, [rdx]\nvmovdqa [rdx], ymm4\nvmovapd ymm6, [rdx]\n\nhlt\n\nalign 4096\n.data:\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovdqu.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM3\": [\"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\"],\n      \"XMM4\": [\"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM5\": [\"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM6\": [\"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Load inputs\nvmovdqu ymm1, [rdx]\nvmovdqu xmm2, [rdx]\nvmovdqu ymm3, [rdx + 32]\n\n; Test memory overwrite\nmov rax, 0xCCCCCCCCCCCCCCCC\nmov [rdx + 32], rax\nmov rax, 0xDDDDDDDDDDDDDDDD\nmov [rdx + 40], rax\nmov rax, 0xEEEEEEEEEEEEEEEE\nmov [rdx + 48], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 56], rax\n\nvmovdqu ymm4, [rdx + 32]\nvmovdqu [rdx], xmm4\nvmovapd ymm5, [rdx]\nvmovdqu [rdx], ymm4\nvmovapd ymm6, [rdx]\n\nhlt\n\nalign 4096\n.data:\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovhlps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\": [\"0x4150f0e342241b6c\", \"0xdddddddddddddddd\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM3\": [\"0x4150f0e342241b6c\", \"0xdddddddddddddddd\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\": [\"0x428b029f42a63326\", \"0x4150f0e342241b6c\", \"0x41aff21340ab4706\", \"0x40aa5bea411ac802\"],\n      \"XMM6\": [\"0x428b029f42a63326\", \"0x4150f0e342241b6c\", \"0x41aff21340ab4706\", \"0x40aa5bea411ac802\"]\n  }\n}\n%endif\n\n; Load inputs\nvmovapd ymm1, [rel .data]\nvmovapd ymm2, [rel .data + 32]\nvmovapd ymm5, [rel .data_random]\nvmovapd ymm6, [rel .data_random]\n\nvmovhlps xmm1, xmm2, xmm5\nvmovhlps xmm3, xmm1, xmm5\n\nhlt\n\nalign 32\n.data:\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD\ndb 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\n\n.data_random:\ndd 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovhpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\": [\"0xCCCCCCCCCCCCCCCC\", \"0xEEEEEEEEEEEEEEEE\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM3\": [\"0xCCCCCCCCCCCCCCCC\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM4\": [\"0xDDDDDDDDDDDDDDDD\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n;; Register as DST tests\n; Load inputs\nvmovapd ymm1, [rdx]\nvmovapd ymm2, [rdx + 32]\n\nvmovhpd xmm1, xmm2, [rdx + 48]\nvmovhpd xmm3, xmm1, [rdx + 56]\n\n;; Store to memory test\n; Overwrite beginning of data, then yank it back into a vector\n; Nothing in memory should be modified except the first 64 bits.\nvmovhpd [rdx], xmm2\nvmovapd ymm4, [rdx]\n\nhlt\n\nalign 4096\n.data:\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD\ndb 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovhps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\": [\"0xCCCCCCCCCCCCCCCC\", \"0xEEEEEEEEEEEEEEEE\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM3\": [\"0xCCCCCCCCCCCCCCCC\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM4\": [\"0xDDDDDDDDDDDDDDDD\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n;; Register as DST tests\n; Load inputs\nvmovapd ymm1, [rdx]\nvmovapd ymm2, [rdx + 32]\n\nvmovhps xmm1, xmm2, [rdx + 48]\nvmovhps xmm3, xmm1, [rdx + 56]\n\n;; Store to memory test\n; Overwrite beginning of data, then yank it back into a vector\n; Nothing in memory should be modified except the first 64 bits.\nvmovhps [rdx], xmm2\nvmovapd ymm4, [rdx]\n\nhlt\n\nalign 4096\n.data:\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD\ndb 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovlhps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x43cc1ad6970b4549\", \"0xc4be43cc1ad6970b\", \"0\", \"0\"],\n    \"XMM1\": [\"0x43cc1ad6970b4549\", \"0xbd7eb46a1278f793\", \"0xef673dac6e4cbb7b\", \"0x5b3d85d342718be9\"],\n    \"XMM2\": [\"0xc4be43cc1ad6970b\", \"0x4549bd7eb46a1278\", \"0xf793ef673dac6e4c\", \"0xbb7b5b3d85d34271\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\nvmovapd ymm2, [rdx + 64]\n\nvmovlhps xmm0, xmm1, xmm2\n\nhlt\n\nalign 32\n.data:\ndq 0xfdecd28fab3fa4a5, 0x7d7ccd8836d09fc2, 0xccdbcfc31f3ff0f3, 0x108390defebac4be\ndq 0x43cc1ad6970b4549, 0xbd7eb46a1278f793, 0xef673dac6e4cbb7b, 0x5b3d85d342718be9\ndq 0xc4be43cc1ad6970b, 0x4549bd7eb46a1278, 0xf793ef673dac6e4c, 0xbb7b5b3d85d34271\ndq 0x000043cc1ad6970b, 0x4549bd7eb46a1278, 0xf793ef673dac6e4c, 0xbb7b5b3d85d34271\n\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovlpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\": [\"0xEEEEEEEEEEEEEEEE\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM3\": [\"0xFFFFFFFFFFFFFFFF\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM4\": [\"0xCCCCCCCCCCCCCCCC\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n;; Register as DST tests\n; Load inputs\nvmovapd ymm1, [rdx]\nvmovapd ymm2, [rdx + 32]\n\nvmovlpd xmm1, xmm2, [rdx + 48]\nvmovlpd xmm3, xmm1, [rdx + 56]\n\n;; Store to memory test\n; Overwrite beginning of data, then yank it back into a vector\n; Nothing in memory should be modified except the first 64 bits.\nvmovlpd [rdx], xmm2\nvmovapd ymm4, [rdx]\n\nhlt\n\nalign 4096\n.data:\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD\ndb 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovlps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\": [\"0xEEEEEEEEEEEEEEEE\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM3\": [\"0xFFFFFFFFFFFFFFFF\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM4\": [\"0xCCCCCCCCCCCCCCCC\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n;; Register as DST tests\n; Load inputs\nvmovapd ymm1, [rdx]\nvmovapd ymm2, [rdx + 32]\n\nvmovlps xmm1, xmm2, [rdx + 48]\nvmovlps xmm3, xmm1, [rdx + 56]\n\n;; Store to memory test\n; Overwrite beginning of data, then yank it back into a vector\n; Nothing in memory should be modified except the first 64 bits.\nvmovlps [rdx], xmm2\nvmovapd ymm4, [rdx]\n\nhlt\n\nalign 4096\n.data:\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD\ndb 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovmskpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x2\",\n    \"RBX\": \"0xA\",\n    \"RDI\": \"0x0\",\n    \"RSI\": \"0x0\"\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvmovmskpd rax, xmm0\nvmovmskpd rbx, ymm0\n\nvmovmskpd rdi, xmm1\nvmovmskpd rsi, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x8000000000000000\ndq 0x0000000000000000\ndq 0x8000000000000000\n\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovmskps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x00\",\n    \"RBX\": \"0x03\",\n    \"RDI\": \"0x00\",\n    \"RSI\": \"0x33\"\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvmovmskps rax, xmm0\nvmovmskps rbx, xmm1\n\nvmovmskps rdi, ymm0\nvmovmskps rsi, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x8000000080000000\ndq 0x7000000070000000\ndq 0x8000000080000000\ndq 0x7000000070000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovntdq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\nmov [rdx + 8 * 6], rax\nmov [rdx + 8 * 7], rax\n\nvmovaps xmm0, [rdx + 8 * 0]\nvmovaps xmm1, [rdx + 8 * 2]\nvmovaps ymm2, [rdx + 8 * 0]\n\nvmovntdq [rdx + 8 * 4], xmm1\nvmovaps xmm0, [rdx + 8 * 4]\n\nvmovntdq [rdx + 8 * 4], ymm2\nvmovaps ymm3, [rdx + 8 * 4]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovntdqa.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Load results with random data first.\nvmovaps ymm0, [rel .data_random]\nvmovaps ymm1, [rel .data_random]\n\nvmovntdqa xmm0, [rdx]\nvmovntdqa ymm1, [rdx]\n\nhlt\n\nalign 32\n.data_random:\ndd 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovntpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM4\": [\"0x428b029f42a63326\", \"0x4150f0e342241b6c\", \"0\", \"0\"],\n    \"XMM5\": [\"0x428b029f42a63326\", \"0x4150f0e342241b6c\", \"0x41aff21340ab4706\", \"0x40aa5bea411ac802\"],\n    \"XMM6\": [\"0x428b029f42a63326\", \"0x4150f0e342241b6c\", \"0x41aff21340ab4706\", \"0x40aa5bea411ac802\"],\n    \"XMM7\": [\"0x428b029f42a63326\", \"0x4150f0e342241b6c\", \"0\", \"0\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\nmov [rdx + 8 * 6], rax\nmov [rdx + 8 * 7], rax\n\nvmovaps xmm0, [rdx + 8 * 0]\nvmovaps xmm1, [rdx + 8 * 2]\nvmovaps ymm2, [rdx + 8 * 0]\n\nvmovntpd [rdx + 8 * 4], xmm1\nvmovaps xmm0, [rdx + 8 * 4]\n\nvmovntpd [rdx + 8 * 4], ymm2\nvmovaps ymm3, [rdx + 8 * 4]\n\nvmovaps ymm4, [rel .data_random]\nvmovaps ymm5, [rel .data_random]\nvmovaps ymm6, [rel .data_random]\nvmovaps ymm7, [rel .data_random]\n\nvmovntpd [rel .data_res1], xmm4\nvmovaps xmm4, [rel .data_res1]\n\nvmovntpd [rel .data_res2], xmm5\nvmovaps ymm5, [rel .data_res2]\n\nvmovntpd [rel .data_res3], ymm6\nvmovaps ymm6, [rel .data_res3]\n\nvmovntpd [rel .data_res4], ymm7\nvmovaps xmm7, [rel .data_res4]\n\nhlt\n\nalign 4096\n.data_random:\ndd 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n\nalign 32\n.data_res1:\ndd 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n\n.data_res2:\ndd 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n\n.data_res3:\ndd 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n\n.data_res4:\ndd 83.0999,69.50512,41.02678,13.05881,5.35242,21.9932,9.67383,5.32372,29.02872,66.50151,19.30764,91.3633,40.45086,50.96153,32.64489,23.97574,90.64316,24.22547,98.9394,91.21715,90.80143,99.48407,64.97245,74.39838,35.22761,25.35321,5.8732,90.19956,33.03133,52.02952,58.38554,10.17531,47.84703,84.04831,90.02965,65.81329,96.27991,6.64479,25.58971,95.00694,88.1929,37.16964,49.52602,10.27223,77.70605,20.21439,9.8056,41.29389,15.4071,57.54286,9.61117,55.54302,52.90745,4.88086,72.52882,3.0201,56.55091,71.22749,61.84736,88.74295,47.72641,24.17404,33.70564,96.71303\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovntps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0x0\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\nmov [rdx + 8 * 6], rax\nmov [rdx + 8 * 7], rax\n\nvmovaps xmm0, [rdx + 8 * 0]\nvmovaps xmm1, [rdx + 8 * 2]\nvmovaps ymm2, [rdx + 8 * 0]\n\nvmovntps [rdx + 8 * 4], xmm1\nvmovaps xmm0, [rdx + 8 * 4]\n\nvmovntps [rdx + 8 * 4], ymm2\nvmovaps ymm3, [rdx + 8 * 4]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Load from memory (fill with junk and ensure load zeroes out upper 64-bit lanes)\nvmovapd xmm0, [rdx]\nvmovq xmm0, [rdx]\n\n; Load and truncate same register\nvmovapd ymm1, [rdx]\nvmovq xmm1, xmm1\n\n; Store and reload\nvmovq [rdx + 8 * 2], xmm1\nvmovapd ymm2, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovq_vmovd_reg.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RBX\": \"0x4142434445464748\",\n    \"RCX\": \"0x0000000045464748\",\n    \"XMM0\": [\"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x0000000075767778\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x0000000045464748\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4142434465666768\", \"0x6162636465666768\", \"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\n\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\n; Load from GPR (64-bit)\nvmovapd xmm0, [rdx]\nvmovq xmm0, rax\n\n; Load from GPR (32-bit)\nvmovapd xmm1, [rdx]\nvmovd xmm1, eax\n\n; Load 32-bit value\nvmovapd xmm2, [rdx]\nvmovd xmm2, [edx]\n\n; Store into GPR\nvmovapd xmm3, [rdx]\nvmovq rbx, xmm3\nvmovd ecx, xmm3\n\n; Store into mem\nvmovapd xmm4, [rdx + 8 * 2]\nvmovd [rdx + 0], xmm4\nvmovq [rdx + 8], xmm4\nvmovapd ymm5, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovsd_from_mem.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32]\n\n; Move data into register\nvmovsd xmm0, [rdx]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovsd_to_mem.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445464748\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd xmm0, [rdx]\n\n; Moves lower 64bits to memory\nvmovsd [rdx + 16], xmm0\n\n; Ensure 128bits weren't written\nvmovapd xmm0, [rdx + 16]\n\nhlt\n\nalign 4096\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovsd_vectors.asm",
    "content": "\n%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0xAAAAAAAABBBBBBBB\", \"0xCCCCCCCCDDDDDDDD\", \"0xEEEEEEEEFFFFFFFF\", \"0x9999999988888888\"],\n    \"XMM1\":  [\"0x1111111122222222\", \"0x3333333344444444\", \"0x5555555566666666\", \"0x7777777788888888\"],\n    \"XMM2\":  [\"0x1111111122222222\", \"0xCCCCCCCCDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0xAAAAAAAABBBBBBBB\", \"0x3333333344444444\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0,  [rdx]\nvmovapd ymm1,  [rdx + 32]\n\nvmovsd xmm2, xmm0, xmm1\nvmovsd xmm3, xmm1, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 0xAAAAAAAABBBBBBBB\ndq 0xCCCCCCCCDDDDDDDD\ndq 0xEEEEEEEEFFFFFFFF\ndq 0x9999999988888888\n\ndq 0x1111111122222222\ndq 0x3333333344444444\ndq 0x5555555566666666\ndq 0x7777777788888888\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovshdup.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\": [\"0xEEEEEEEEEEEEEEEE\", \"0xCCCCCCCCCCCCCCCC\", \"0xAAAAAAAAAAAAAAAA\", \"0x0808080808080808\"],\n      \"XMM2\": [\"0xEEEEEEEEEEEEEEEE\", \"0xCCCCCCCCCCCCCCCC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM3\": [\"0xEEEEEEEEFFFFFFFF\", \"0xCCCCCCCCDDDDDDDD\", \"0xAAAAAAAABBBBBBBB\", \"0x0808080809090909\"],\n      \"XMM4\": [\"0xEEEEEEEEEEEEEEEE\", \"0xCCCCCCCCCCCCCCCC\", \"0xAAAAAAAAAAAAAAAA\", \"0x0808080808080808\"],\n      \"XMM5\": [\"0xEEEEEEEEEEEEEEEE\", \"0xCCCCCCCCCCCCCCCC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\": [\"0xEEEEEEEEEEEEEEEE\", \"0xCCCCCCCCCCCCCCCC\", \"0xAAAAAAAAAAAAAAAA\", \"0x0808080808080808\"],\n      \"XMM7\": [\"0xEEEEEEEEEEEEEEEE\", \"0xCCCCCCCCCCCCCCCC\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n;; Broadcast across self\nvmovaps ymm1, [rdx]\nvmovshdup ymm1, ymm1\n; 128-bit version\nvmovaps xmm2, [rdx]\nvmovshdup xmm2, xmm2\n\n;; Broadcast from different registers\nvmovaps ymm3, [rdx]\nvmovshdup ymm4, ymm3\n; 128-bit version\nvmovshdup xmm5, xmm3\n\n;; Broadcast from memory\nvmovshdup ymm6, [rdx]\n; 128-bit version\nvmovshdup xmm7, [rdx]\n\nhlt\n\nalign 32\n.data:\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xEE, 0xEE, 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC\ndb 0xBB, 0xBB, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovsldup.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\": [\"0xFFFFFFFFFFFFFFFF\", \"0xDDDDDDDDDDDDDDDD\", \"0xBBBBBBBBBBBBBBBB\", \"0x0909090909090909\"],\n      \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM3\": [\"0xEEEEEEEEFFFFFFFF\", \"0xCCCCCCCCDDDDDDDD\", \"0xAAAAAAAABBBBBBBB\", \"0x0808080809090909\"],\n      \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0xDDDDDDDDDDDDDDDD\", \"0xBBBBBBBBBBBBBBBB\", \"0x0909090909090909\"],\n      \"XMM5\": [\"0xFFFFFFFFFFFFFFFF\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\": [\"0xFFFFFFFFFFFFFFFF\", \"0xDDDDDDDDDDDDDDDD\", \"0xBBBBBBBBBBBBBBBB\", \"0x0909090909090909\"],\n      \"XMM7\": [\"0xFFFFFFFFFFFFFFFF\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n;; Broadcast across self\nvmovaps ymm1, [rdx]\nvmovsldup ymm1, ymm1\n; 128-bit version\nvmovaps xmm2, [rdx]\nvmovsldup xmm2, xmm2\n\n;; Broadcast from different registers\nvmovaps ymm3, [rdx]\nvmovsldup ymm4, ymm3\n; 128-bit version\nvmovsldup xmm5, xmm3\n\n;; Broadcast from memory\nvmovsldup ymm6, [rdx]\n; 128-bit version\nvmovsldup xmm7, [rdx]\n\nhlt\n\nalign 32\n.data:\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xEE, 0xEE, 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC\ndb 0xBB, 0xBB, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovss_from_mem.asm",
    "content": "\n%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000042A63326\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x0000000040AB4706\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x0000000041E83AD2\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x000000004221CDAE\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x0000000042B5494C\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000000042B59A55\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x00000000420CE913\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000000042042015\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x00000000423F635C\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x0000000042C08F50\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x0000000042B062C4\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x00000000429B697F\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x000000004176837B\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x000000004253A13B\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0000000042623422\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM15\": [\"0x00000000423EE7D8\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\nvmovapd xmm0,  [rdx + 16 * 0]\nvmovapd xmm1,  [rdx + 16 * 1]\nvmovapd xmm2,  [rdx + 16 * 2]\nvmovapd xmm3,  [rdx + 16 * 3]\nvmovapd xmm4,  [rdx + 16 * 4]\nvmovapd xmm5,  [rdx + 16 * 5]\nvmovapd xmm6,  [rdx + 16 * 6]\nvmovapd xmm7,  [rdx + 16 * 7]\nvmovapd xmm8,  [rdx + 16 * 8]\nvmovapd xmm9,  [rdx + 16 * 9]\nvmovapd xmm10, [rdx + 16 * 10]\nvmovapd xmm11, [rdx + 16 * 11]\nvmovapd xmm12, [rdx + 16 * 12]\nvmovapd xmm13, [rdx + 16 * 13]\nvmovapd xmm14, [rdx + 16 * 14]\nvmovapd xmm15, [rdx + 16 * 15]\n\nvmovss xmm0,  [rdx + 16 * 0]\nvmovss xmm1,  [rdx + 16 * 1]\nvmovss xmm2,  [rdx + 16 * 2]\nvmovss xmm3,  [rdx + 16 * 3]\nvmovss xmm4,  [rdx + 16 * 4]\nvmovss xmm5,  [rdx + 16 * 5]\nvmovss xmm6,  [rdx + 16 * 6]\nvmovss xmm7,  [rdx + 16 * 7]\nvmovss xmm8,  [rdx + 16 * 8]\nvmovss xmm9,  [rdx + 16 * 9]\nvmovss xmm10, [rdx + 16 * 10]\nvmovss xmm11, [rdx + 16 * 11]\nvmovss xmm12, [rdx + 16 * 12]\nvmovss xmm13, [rdx + 16 * 13]\nvmovss xmm14, [rdx + 16 * 14]\nvmovss xmm15, [rdx + 16 * 15]\n\nhlt\n\nalign 32\n; 512bytes of random data\n.data:\ndd 83.0999 , 69.50512, 41.02678, 13.05881\ndd 5.35242 , 21.9932 , 9.67383 , 5.32372\ndd 29.02872, 66.50151, 19.30764, 91.3633\ndd 40.45086, 50.96153, 32.64489, 23.97574\ndd 90.64316, 24.22547, 98.9394 , 91.21715\ndd 90.80143, 99.48407, 64.97245, 74.39838\ndd 35.22761, 25.35321, 5.8732  , 90.19956\ndd 33.03133, 52.02952, 58.38554, 10.17531\ndd 47.84703, 84.04831, 90.02965, 65.81329\ndd 96.27991, 6.64479 , 25.58971, 95.00694\ndd 88.1929 , 37.16964, 49.52602, 10.27223\ndd 77.70605, 20.21439, 9.8056  , 41.29389\ndd 15.4071 , 57.54286, 9.61117 , 55.54302\ndd 52.90745, 4.88086 , 72.52882, 3.0201\ndd 56.55091, 71.22749, 61.84736, 88.74295\ndd 47.72641, 24.17404, 33.70564, 96.71303\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovss_to_mem.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000042A63326\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x0000000040AB4706\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x0000000041E83AD2\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x000000004221CDAE\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x0000000042B5494C\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000000042B59A55\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x00000000420CE913\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000000042042015\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x00000000423F635C\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x0000000042C08F50\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x0000000042B062C4\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x00000000429B697F\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x000000004176837B\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x000000004253A13B\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0000000042623422\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM15\": [\"0x00000000423EE7D8\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd xmm0,  [rdx + 16 * 0]\nvmovapd xmm1,  [rdx + 16 * 1]\nvmovapd xmm2,  [rdx + 16 * 2]\nvmovapd xmm3,  [rdx + 16 * 3]\nvmovapd xmm4,  [rdx + 16 * 4]\nvmovapd xmm5,  [rdx + 16 * 5]\nvmovapd xmm6,  [rdx + 16 * 6]\nvmovapd xmm7,  [rdx + 16 * 7]\nvmovapd xmm8,  [rdx + 16 * 8]\nvmovapd xmm9,  [rdx + 16 * 9]\nvmovapd xmm10, [rdx + 16 * 10]\nvmovapd xmm11, [rdx + 16 * 11]\nvmovapd xmm12, [rdx + 16 * 12]\nvmovapd xmm13, [rdx + 16 * 13]\nvmovapd xmm14, [rdx + 16 * 14]\nvmovapd xmm15, [rdx + 16 * 15]\n\nmov rdx, 0xe0000000\nmov rax, 0\nmov [rdx + 8 * 0], rax\nmov [rdx + 8 * 1], rax\nmov [rdx + 8 * 2], rax\nmov [rdx + 8 * 3], rax\nmov [rdx + 8 * 4], rax\nmov [rdx + 8 * 5], rax\nmov [rdx + 8 * 6], rax\nmov [rdx + 8 * 7], rax\nmov [rdx + 8 * 8], rax\nmov [rdx + 8 * 9], rax\nmov [rdx + 8 * 10], rax\nmov [rdx + 8 * 11], rax\nmov [rdx + 8 * 12], rax\nmov [rdx + 8 * 13], rax\nmov [rdx + 8 * 14], rax\nmov [rdx + 8 * 15], rax\nmov [rdx + 8 * 16], rax\nmov [rdx + 8 * 17], rax\nmov [rdx + 8 * 18], rax\nmov [rdx + 8 * 19], rax\nmov [rdx + 8 * 20], rax\nmov [rdx + 8 * 21], rax\nmov [rdx + 8 * 22], rax\nmov [rdx + 8 * 23], rax\nmov [rdx + 8 * 24], rax\nmov [rdx + 8 * 25], rax\nmov [rdx + 8 * 26], rax\nmov [rdx + 8 * 27], rax\nmov [rdx + 8 * 28], rax\nmov [rdx + 8 * 29], rax\nmov [rdx + 8 * 30], rax\n\nvmovss [rdx + 16 * 0], xmm0\nvmovss [rdx + 16 * 1], xmm1\nvmovss [rdx + 16 * 2], xmm2\nvmovss [rdx + 16 * 3], xmm3\nvmovss [rdx + 16 * 4], xmm4\nvmovss [rdx + 16 * 5], xmm5\nvmovss [rdx + 16 * 6], xmm6\nvmovss [rdx + 16 * 7], xmm7\nvmovss [rdx + 16 * 8], xmm8\nvmovss [rdx + 16 * 9], xmm9\nvmovss [rdx + 16 * 10], xmm10\nvmovss [rdx + 16 * 11], xmm11\nvmovss [rdx + 16 * 12], xmm12\nvmovss [rdx + 16 * 13], xmm13\nvmovss [rdx + 16 * 14], xmm14\nvmovss [rdx + 16 * 15], xmm15\n\nlea rdx, [rel .data]\nvmovapd xmm0, [rdx + 16 * 0]\nvmovapd xmm1, [rdx + 16 * 1]\nvmovapd xmm2, [rdx + 16 * 2]\nvmovapd xmm3, [rdx + 16 * 3]\nvmovapd xmm4, [rdx + 16 * 4]\nvmovapd xmm5, [rdx + 16 * 5]\nvmovapd xmm6, [rdx + 16 * 6]\nvmovapd xmm7, [rdx + 16 * 7]\nvmovapd xmm8, [rdx + 16 * 8]\nvmovapd xmm9, [rdx + 16 * 9]\nvmovapd xmm10, [rdx + 16 * 10]\nvmovapd xmm11, [rdx + 16 * 11]\nvmovapd xmm12, [rdx + 16 * 12]\nvmovapd xmm13, [rdx + 16 * 13]\nvmovapd xmm14, [rdx + 16 * 14]\nvmovapd xmm15, [rdx + 16 * 15]\n\nmov rdx, 0xe0000000\n\nvmovapd xmm0, [rdx + 16 * 0]\nvmovapd xmm1, [rdx + 16 * 1]\nvmovapd xmm2, [rdx + 16 * 2]\nvmovapd xmm3, [rdx + 16 * 3]\nvmovapd xmm4, [rdx + 16 * 4]\nvmovapd xmm5, [rdx + 16 * 5]\nvmovapd xmm6, [rdx + 16 * 6]\nvmovapd xmm7, [rdx + 16 * 7]\nvmovapd xmm8, [rdx + 16 * 8]\nvmovapd xmm9, [rdx + 16 * 9]\nvmovapd xmm10, [rdx + 16 * 10]\nvmovapd xmm11, [rdx + 16 * 11]\nvmovapd xmm12, [rdx + 16 * 12]\nvmovapd xmm13, [rdx + 16 * 13]\nvmovapd xmm14, [rdx + 16 * 14]\nvmovapd xmm15, [rdx + 16 * 15]\n\nhlt\n\nalign 16\n; 512bytes of random data\n.data:\ndd 83.0999 , 69.50512, 41.02678, 13.05881\ndd 5.35242 , 21.9932 , 9.67383 , 5.32372\ndd 29.02872, 66.50151, 19.30764, 91.3633\ndd 40.45086, 50.96153, 32.64489, 23.97574\ndd 90.64316, 24.22547, 98.9394 , 91.21715\ndd 90.80143, 99.48407, 64.97245, 74.39838\ndd 35.22761, 25.35321, 5.8732  , 90.19956\ndd 33.03133, 52.02952, 58.38554, 10.17531\ndd 47.84703, 84.04831, 90.02965, 65.81329\ndd 96.27991, 6.64479 , 25.58971, 95.00694\ndd 88.1929 , 37.16964, 49.52602, 10.27223\ndd 77.70605, 20.21439, 9.8056  , 41.29389\ndd 15.4071 , 57.54286, 9.61117 , 55.54302\ndd 52.90745, 4.88086 , 72.52882, 3.0201\ndd 56.55091, 71.22749, 61.84736, 88.74295\ndd 47.72641, 24.17404, 33.70564, 96.71303\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovss_vectors.asm",
    "content": "\n%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0xAAAAAAAABBBBBBBB\", \"0xCCCCCCCCDDDDDDDD\", \"0xEEEEEEEEFFFFFFFF\", \"0x9999999988888888\"],\n    \"XMM1\":  [\"0x1111111122222222\", \"0x3333333344444444\", \"0x5555555566666666\", \"0x7777777788888888\"],\n    \"XMM2\":  [\"0xAAAAAAAA22222222\", \"0xCCCCCCCCDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x11111111BBBBBBBB\", \"0x3333333344444444\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0,  [rdx]\nvmovapd ymm1,  [rdx + 32]\n\nvmovss xmm2, xmm0, xmm1\nvmovss xmm3, xmm1, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 0xAAAAAAAABBBBBBBB\ndq 0xCCCCCCCCDDDDDDDD\ndq 0xEEEEEEEEFFFFFFFF\ndq 0x9999999988888888\n\ndq 0x1111111122222222\ndq 0x3333333344444444\ndq 0x5555555566666666\ndq 0x7777777788888888\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovupd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM3\": [\"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Load inputs\nvmovupd ymm1, [rdx]\nvmovupd xmm2, [rdx]\nvmovupd ymm3, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovupd_mem.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x6162636465666768\",\n    \"RBX\": \"0x7172737475767778\",\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0xCCCCCCCCCCCCCCCC\nmov [rdx + 8 * 4], rax\nmov rax, 0xDDDDDDDDDDDDDDDD\nmov [rdx + 8 * 5], rax\nmov rax, 0xEEEEEEEEEEEEEEEE\nmov [rdx + 8 * 6], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 7], rax\n\n; Test truncation\nvmovupd ymm2, [rdx + 8 * 4]\nvmovupd xmm2, [rdx + 8 * 4]\n\n; Test memory overwrite\nvmovupd ymm0, [rdx]\nvmovupd [rdx + 8 * 4], ymm0\nvmovupd ymm1, ymm0\n\nmov rax, [rdx + 8 * 6]\nmov rbx, [rdx + 8 * 7]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovups.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM3\": [\"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Load inputs\nvmovups ymm1, [rdx]\nvmovups xmm2, [rdx]\nvmovups ymm3, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC\ndb 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vmovups_mem.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x6162636465666768\",\n    \"RBX\": \"0x7172737475767778\",\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4142434445464748\nmov [rdx + 8 * 0], rax\nmov rax, 0x5152535455565758\nmov [rdx + 8 * 1], rax\nmov rax, 0x6162636465666768\nmov [rdx + 8 * 2], rax\nmov rax, 0x7172737475767778\nmov [rdx + 8 * 3], rax\n\nmov rax, 0xCCCCCCCCCCCCCCCC\nmov [rdx + 8 * 4], rax\nmov rax, 0xDDDDDDDDDDDDDDDD\nmov [rdx + 8 * 5], rax\nmov rax, 0xEEEEEEEEEEEEEEEE\nmov [rdx + 8 * 6], rax\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 8 * 7], rax\n\n; Test truncation\nvmovups ymm2, [rdx + 8 * 4]\nvmovups xmm2, [rdx + 8 * 4]\n\n; Test memory overwrite\nvmovups ymm0, [rdx]\nvmovups [rdx + 8 * 4], ymm0\nvmovups ymm1, ymm0\n\nmov rax, [rdx + 8 * 6]\nmov rbx, [rdx + 8 * 7]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/VEX/vmpsadbw_128.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x6C8BABD754A8356E\", \"0x277EA625CA925F77\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x6A6FD695EC73CDC7\", \"0xDDA1B927BBF2AEBB\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x88312CD5C7D14D73\", \"0x7F091E1EFDDBE7FE\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0xF29AE6EF954EFA14\", \"0x8273A8A49A6242A0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x3212073882160F0E\", \"0xB3780763C1923507\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x462A372B571946CB\", \"0xA38DCD3D790E041F\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x01D700F201DD018B\", \"0x021B012D00EC015B\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x021B01EA0147019C\", \"0x017900FB00D801D9\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x010500E801000153\", \"0x011A015F01530171\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x019C0124018F014D\", \"0x011F0100011E0116\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x0136007E009D01E0\", \"0x02A802C80245019D\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x009F0115017B0132\", \"0x013C01AF01F90179\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0077012B011900E8\", \"0x00BC016E019E0146\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM15\": [\"0x0100011C010300D5\", \"0x00F3014A016700CD\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps xmm0, [rdx + 16 * 0]\nvmovaps xmm1, [rdx + 16 * 1]\nvmovaps xmm2, [rdx + 16 * 2]\nvmovaps xmm3, [rdx + 16 * 3]\nvmovaps xmm4, [rdx + 16 * 4]\nvmovaps xmm5, [rdx + 16 * 5]\nvmovaps xmm6, [rdx + 16 * 6]\nvmovaps xmm7, [rdx + 16 * 7]\n\nvmpsadbw xmm8,  xmm0, [rdx + 16 * 8],  000b\nvmpsadbw xmm9,  xmm1, [rdx + 16 * 9],  001b\nvmpsadbw xmm10, xmm2, [rdx + 16 * 10], 010b\nvmpsadbw xmm11, xmm3, [rdx + 16 * 11], 011b\nvmpsadbw xmm12, xmm4, [rdx + 16 * 12], 100b\nvmpsadbw xmm13, xmm5, [rdx + 16 * 13], 101b\nvmpsadbw xmm14, xmm6, [rdx + 16 * 14], 110b\nvmpsadbw xmm15, xmm7, [rdx + 16 * 15], 111b\n\nhlt\n\nalign 32\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0x6868C3F3AAED56E0\ndq 0xF0FCE9E294E6E6DE\ndq 0x6C8BABD754A8356E\ndq 0x277EA625CA925F77\ndq 0x6A6FD695EC73CDC7\ndq 0xDDA1B927BBF2AEBB\ndq 0x88312CD5C7D14D73\ndq 0x7F091E1EFDDBE7FE\ndq 0xF29AE6EF954EFA14\ndq 0x8273A8A49A6242A0\ndq 0x3212073882160F0E\ndq 0xB3780763C1923507\ndq 0x462A372B571946CB\ndq 0xA38DCD3D790E041F\ndq 0x3057BAAB2F86F32B\ndq 0xEF3F4F46F02CD62E\ndq 0xDE3C4B3485BBD1EF\ndq 0x9DE3718DB9A3489E\ndq 0x9D50328ADEFB7209\ndq 0xEEF7EB52F6F19869\ndq 0xCE021C30FFC299D6\ndq 0xA60E9C56F1B20570\ndq 0x30763886E2C46218\ndq 0xEB535D0EA7E4A12F\ndq 0x6802E8E1B7E04514\ndq 0x46EBF28FC18EFE1A\ndq 0x032E9746236A5D7F\ndq 0xAC5976548F321298\ndq 0xB6D30C71C85F76C8\ndq 0x881D2CA6ABEA19C5\n\n"
  },
  {
    "path": "unittests/ASM/VEX/vmpsadbw_256.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0x0C7FCC33573D4A81\", \"0xB2B1594B0900051F\"],\n    \"XMM1\":  [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\", \"0x48CACFD5667F2042\", \"0xC3BF1B89A0DFEE04\"],\n    \"XMM2\":  [\"0x6C8BABD754A8356E\", \"0x277EA625CA925F77\", \"0x77D4FD3ED900079E\", \"0xA454D66F18BE061B\"],\n    \"XMM3\":  [\"0x6A6FD695EC73CDC7\", \"0xDDA1B927BBF2AEBB\", \"0x22E096464DD75EF1\", \"0xF8DD0BC501EC1573\"],\n    \"XMM4\":  [\"0x88312CD5C7D14D73\", \"0x7F091E1EFDDBE7FE\", \"0x8952DF26784EFD5F\", \"0x06BE3C607E0C7DC7\"],\n    \"XMM5\":  [\"0xF29AE6EF954EFA14\", \"0x8273A8A49A6242A0\", \"0x0DCA8E436C33CE72\", \"0xD237159B6EF41772\"],\n    \"XMM6\":  [\"0x3212073882160F0E\", \"0xB3780763C1923507\", \"0xE482F34CE3FE3EFC\", \"0xC3F2D5A8975969F8\"],\n    \"XMM7\":  [\"0x462A372B571946CB\", \"0xA38DCD3D790E041F\", \"0x879EF228FB9D8A41\", \"0xCA0E4DAE9D595C1A\"],\n    \"XMM8\":  [\"0x01D700F201DD018B\", \"0x021B012D00EC015B\", \"0x00AB018100EF0139\", \"0x015401BB020C0160\"],\n    \"XMM9\":  [\"0x021B01EA0147019C\", \"0x017900FB00D801D9\", \"0x014400CB01160185\", \"0x016D00CE01A1014C\"],\n    \"XMM10\": [\"0x010500E801000153\", \"0x011A015F01530171\", \"0x01AD00CD027F0105\", \"0x00F3018301A60197\"],\n    \"XMM11\": [\"0x019C0124018F014D\", \"0x011F0100011E0116\", \"0x01580145016B0106\", \"0x01E301CD013A0119\"],\n    \"XMM12\": [\"0x0136007E009D01E0\", \"0x02A802C80245019D\", \"0x0149015101AF016A\", \"0x010600E400E30120\"],\n    \"XMM13\": [\"0x009F0115017B0132\", \"0x013C01AF01F90179\", \"0x015601040159025A\", \"0x017D01B40202017D\"],\n    \"XMM14\": [\"0x0077012B011900E8\", \"0x00BC016E019E0146\", \"0x01D900F8011201BE\", \"0x00E5012000B60130\"],\n    \"XMM15\": [\"0x0100011C010300D5\", \"0x00F3014A016700CD\", \"0x011900A400F60156\", \"0x0063010A019B0185\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 0]\nvmovaps ymm1, [rdx + 32 * 1]\nvmovaps ymm2, [rdx + 32 * 2]\nvmovaps ymm3, [rdx + 32 * 3]\nvmovaps ymm4, [rdx + 32 * 4]\nvmovaps ymm5, [rdx + 32 * 5]\nvmovaps ymm6, [rdx + 32 * 6]\nvmovaps ymm7, [rdx + 32 * 7]\n\nvmpsadbw ymm8,  ymm0, [rdx + 32 * 8],  000000b\nvmpsadbw ymm9,  ymm1, [rdx + 32 * 9],  001001b\nvmpsadbw ymm10, ymm2, [rdx + 32 * 10], 010010b\nvmpsadbw ymm11, ymm3, [rdx + 32 * 11], 011011b\nvmpsadbw ymm12, ymm4, [rdx + 32 * 12], 100100b\nvmpsadbw ymm13, ymm5, [rdx + 32 * 13], 101101b\nvmpsadbw ymm14, ymm6, [rdx + 32 * 14], 110110b\nvmpsadbw ymm15, ymm7, [rdx + 32 * 15], 111111b\n\nhlt\n\nalign 32\n.data:\ndq 0xA76C4F06A12BFCE0, 0x9B80767F1E6A060F, 0x0C7FCC33573D4A81, 0xB2B1594B0900051F\ndq 0x6868C3F3AAED56E0, 0xF0FCE9E294E6E6DE, 0x48CACFD5667F2042, 0xC3BF1B89A0DFEE04\ndq 0x6C8BABD754A8356E, 0x277EA625CA925F77, 0x77D4FD3ED900079E, 0xA454D66F18BE061B\ndq 0x6A6FD695EC73CDC7, 0xDDA1B927BBF2AEBB, 0x22E096464DD75EF1, 0xF8DD0BC501EC1573\ndq 0x88312CD5C7D14D73, 0x7F091E1EFDDBE7FE, 0x8952DF26784EFD5F, 0x06BE3C607E0C7DC7\ndq 0xF29AE6EF954EFA14, 0x8273A8A49A6242A0, 0x0DCA8E436C33CE72, 0xD237159B6EF41772\ndq 0x3212073882160F0E, 0xB3780763C1923507, 0xE482F34CE3FE3EFC, 0xC3F2D5A8975969F8\ndq 0x462A372B571946CB, 0xA38DCD3D790E041F, 0x879EF228FB9D8A41, 0xCA0E4DAE9D595C1A\ndq 0x3057BAAB2F86F32B, 0xEF3F4F46F02CD62E, 0x94C77DFE4CE24002, 0xF21AA894D8B40A7B\ndq 0xDE3C4B3485BBD1EF, 0x9DE3718DB9A3489E, 0xEB916DE33FC4D6C4, 0xD0514FFFD3EFFCE5\ndq 0x9D50328ADEFB7209, 0xEEF7EB52F6F19869, 0xABC6D5DBC52734DA, 0xED34B0EAE12FB881\ndq 0xCE021C30FFC299D6, 0xA60E9C56F1B20570, 0xCF0CECBC8DF25E5E, 0xABE3B9B0215B088A\ndq 0x30763886E2C46218, 0xEB535D0EA7E4A12F, 0xAA418BA42D1E3354, 0x1701761E8F4456D0\ndq 0x6802E8E1B7E04514, 0x46EBF28FC18EFE1A, 0xC42510C384410A30, 0xB029D9C4A89A6C74\ndq 0x032E9746236A5D7F, 0xAC5976548F321298, 0xF537B9098166726E, 0x97C312089BF23896\ndq 0xB6D30C71C85F76C8, 0x881D2CA6ABEA19C5, 0xF3F32FC9BBDA1589, 0x2732CF8F4E17D917\n"
  },
  {
    "path": "unittests/ASM/VEX/vmulpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4008000000000000\", \"0x4008000000000000\", \"0x4008000000000000\", \"0x4008000000000000\"],\n    \"XMM1\": [\"0x4000000000000000\", \"0x4000000000000000\", \"0x4000000000000000\", \"0x4000000000000000\"],\n    \"XMM2\": [\"0x4018000000000000\", \"0x4018000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4018000000000000\", \"0x4018000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4018000000000000\", \"0x4018000000000000\", \"0x4018000000000000\", \"0x4018000000000000\"],\n    \"XMM5\": [\"0x4018000000000000\", \"0x4018000000000000\", \"0x4018000000000000\", \"0x4018000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Memory operand\nvmulpd xmm2, xmm0, [rdx + 32]\nvmulpd ymm4, ymm0, [rdx + 32]\n\n; Register only\nvmulpd xmm3, xmm0, xmm1\nvmulpd ymm5, ymm1, ymm0\n\nhlt\n\nalign 32\n.data:\ndq 0x4008000000000000\ndq 0x4008000000000000\ndq 0x4008000000000000\ndq 0x4008000000000000\n\ndq 0x4000000000000000\ndq 0x4000000000000000\ndq 0x4000000000000000\ndq 0x4000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vmulps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x400000003F800000\", \"0x4080000040400000\", \"0x400000003F800000\", \"0x4080000040400000\"],\n    \"XMM1\": [\"0x40C0000040A00000\", \"0x4100000040E00000\", \"0x40C0000040A00000\", \"0x4100000040E00000\"],\n    \"XMM2\": [\"0x4140000040A00000\", \"0x4200000041A80000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4140000040A00000\", \"0x4200000041A80000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4140000040A00000\", \"0x4200000041A80000\", \"0x4140000040A00000\", \"0x4200000041A80000\"],\n    \"XMM5\": [\"0x4140000040A00000\", \"0x4200000041A80000\", \"0x4140000040A00000\", \"0x4200000041A80000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Memory operand\nvmulps xmm2, xmm0, [rdx + 32]\nvmulps ymm4, ymm0, [rdx + 32]\n\n; Register only\nvmulps xmm3, xmm0, xmm1\nvmulps ymm5, ymm1, ymm0\n\nhlt\n\nalign 32\n.data:\ndq 0x400000003F800000 ; 2, 1\ndq 0x4080000040400000 ; 4, 3\ndq 0x400000003F800000 ; 2, 1\ndq 0x4080000040400000 ; 4, 3\n\ndq 0x40C0000040A00000 ; 6, 5\ndq 0x4100000040E00000 ; 8, 7\ndq 0x40C0000040A00000 ; 6, 5\ndq 0x4100000040E00000 ; 8, 7\n"
  },
  {
    "path": "unittests/ASM/VEX/vmulsd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4010000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x4010000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x4062000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4030000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x4039000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4059000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x4079000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x4030000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM9\": [\"0x4039000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\n\n; Register only\nvmulsd xmm0, xmm0, xmm1\nvmulsd xmm2, xmm2, xmm3\n\n; Memory operand\nvmulsd xmm5, xmm4, [rdx + 32 * 1]\nvmulsd xmm4, xmm4, [rdx + 32 * 0]\n\n; Merging different src into destination\nvpxor xmm7, xmm7, xmm7\nvmovapd ymm8, [rdx + 32 * 3]\nvmovapd ymm9, [rdx + 32 * 4]\nvmulsd xmm7, xmm8, xmm9\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000 ; 1.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4010000000000000 ; 4.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4022000000000000 ; 9.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4030000000000000 ; 16.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4039000000000000 ; 25.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vmulss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434440800000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x4142434440800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x4142434443100000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434441800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x4142434441C80000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4142434442C80000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x4142434443C80000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x4142434441800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM9\": [\"0x4142434441C80000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\n\n; Register only\nvmulss xmm0, xmm0, xmm1\nvmulss xmm2, xmm2, xmm3\n\n; Memory operand\nvmulss xmm5, xmm4, [rdx + 32 * 1]\nvmulss xmm4, xmm4, [rdx + 32 * 0]\n\n; Merging different src into destination\nvpxor xmm7, xmm7, xmm7\nvmovapd ymm8, [rdx + 32 * 3]\nvmovapd ymm9, [rdx + 32 * 4]\nvmulss xmm7, xmm8, xmm9\n\nhlt\n\nalign 32\n.data:\ndq 0x414243443F800000 ; 1.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434440800000 ; 4.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441100000 ; 9.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441800000 ; 16.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441C80000 ; 25.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vorpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0xCCCCCCCC75767778\", \"0x61626364DDDDDDDD\", \"0xEEEEEEEE55565758\", \"0x41424344FFFFFFFF\"],\n    \"XMM2\": [\"0xCDCECFCC75767778\", \"0x71727374DDDFDFDD\", \"0xEFEEEFEE75767778\", \"0x71727374FFFFFFFF\"],\n    \"XMM3\": [\"0xCDCECFCC75767778\", \"0x71727374DDDFDFDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xCDCECFCC75767778\", \"0x71727374DDDFDFDD\", \"0xEFEEEFEE75767778\", \"0x71727374FFFFFFFF\"],\n    \"XMM5\": [\"0xCDCECFCC75767778\", \"0x71727374DDDFDFDD\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data1]\nlea rbx, [rel .data2]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rbx]\n\n; Register only\nvorpd ymm2, ymm0, ymm1\nvorpd xmm3, xmm0, xmm1\n\n; With memory operand\nvorpd ymm4, ymm0, [rbx]\nvorpd xmm5, xmm0, [rbx]\n\nhlt\n\nalign 32\n.data1:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0xCCCCCCCC75767778\ndq 0x61626364DDDDDDDD\ndq 0xEEEEEEEE55565758\ndq 0x41424344FFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vorps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0xCCCCCCCC75767778\", \"0x61626364DDDDDDDD\", \"0xEEEEEEEE55565758\", \"0x41424344FFFFFFFF\"],\n    \"XMM2\": [\"0xCDCECFCC75767778\", \"0x71727374DDDFDFDD\", \"0xEFEEEFEE75767778\", \"0x71727374FFFFFFFF\"],\n    \"XMM3\": [\"0xCDCECFCC75767778\", \"0x71727374DDDFDFDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xCDCECFCC75767778\", \"0x71727374DDDFDFDD\", \"0xEFEEEFEE75767778\", \"0x71727374FFFFFFFF\"],\n    \"XMM5\": [\"0xCDCECFCC75767778\", \"0x71727374DDDFDFDD\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data1]\nlea rbx, [rel .data2]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rbx]\n\n; Register only\nvorps ymm2, ymm0, ymm1\nvorps xmm3, xmm0, xmm1\n\n; With memory operand\nvorps ymm4, ymm0, [rbx]\nvorps xmm5, xmm0, [rbx]\n\nhlt\n\nalign 32\n.data1:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0xCCCCCCCC75767778\ndq 0x61626364DDDDDDDD\ndq 0xEEEEEEEE55565758\ndq 0x41424344FFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vpabsb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM2\":  [\"0x0101010101010101\", \"0x0101010101010101\", \"0x0101010101010101\", \"0x0101010101010101\"],\n    \"XMM3\":  [\"0xFF000100FF01FF00\", \"0xFF000100FF01FF00\", \"0xFF000100FF01FF00\", \"0xFF000100FF01FF00\"],\n    \"XMM4\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0101010101010101\", \"0x0101010101010101\", \"0x0101010101010101\", \"0x0101010101010101\"],\n    \"XMM6\":  [\"0x0101010101010101\", \"0x0101010101010101\", \"0x0101010101010101\", \"0x0101010101010101\"],\n    \"XMM7\":  [\"0x0100010001010100\", \"0x0100010001010100\", \"0x0100010001010100\", \"0x0100010001010100\"],\n    \"XMM8\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x0101010101010101\", \"0x0101010101010101\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x0101010101010101\", \"0x0101010101010101\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x0100010001010100\", \"0x0100010001010100\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x0101010101010101\", \"0x0101010101010101\", \"0x0101010101010101\", \"0x0101010101010101\"],\n    \"XMM13\": [\"0x0101010101010101\", \"0x0101010101010101\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0101010101010101\", \"0x0101010101010101\", \"0x0101010101010101\", \"0x0101010101010101\"],\n    \"XMM15\": [\"0x0101010101010101\", \"0x0101010101010101\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovaps ymm1, [rdx + 32 * 1]\nvmovaps ymm2, [rdx + 32 * 2]\nvmovaps ymm3, [rdx + 32 * 3]\n\n; Test with full zero\nvpabsb ymm4, [rdx + 32 * 0]\nvpabsb xmm8, [rdx + 32 * 0]\n\n; Test with full negative\nvpabsb ymm5, [rdx + 32 * 1]\nvpabsb xmm9, [rdx + 32 * 1]\nvpabsb ymm12, ymm1\nvpabsb xmm13, xmm1\n\n; Test with full positive\nvpabsb ymm6, [rdx + 32 * 2]\nvpabsb xmm10, [rdx + 32 * 2]\nvpabsb ymm14, ymm2\nvpabsb xmm15, xmm2\n\n; Test a mix\nvpabsb ymm7, [rdx + 32 * 3]\nvpabsb xmm11, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0101010101010101\ndq 0x0101010101010101\ndq 0x0101010101010101\ndq 0x0101010101010101\n\ndq 0xFF000100FF01FF00\ndq 0xFF000100FF01FF00\ndq 0xFF000100FF01FF00\ndq 0xFF000100FF01FF00\n"
  },
  {
    "path": "unittests/ASM/VEX/vpabsd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM2\":  [\"0x0000000100000001\", \"0x0000000100000001\", \"0x0000000100000001\", \"0x0000000100000001\"],\n    \"XMM3\":  [\"0xFFFFFFFF00000000\", \"0x00000001FFFFFFFF\", \"0xFFFFFFFF00000000\", \"0x00000001FFFFFFFF\"],\n    \"XMM4\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000000100000001\", \"0x0000000100000001\", \"0x0000000100000001\", \"0x0000000100000001\"],\n    \"XMM6\":  [\"0x0000000100000001\", \"0x0000000100000001\", \"0x0000000100000001\", \"0x0000000100000001\"],\n    \"XMM7\":  [\"0x0000000100000000\", \"0x0000000100000001\", \"0x0000000100000000\", \"0x0000000100000001\"],\n    \"XMM8\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x0000000100000001\", \"0x0000000100000001\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x0000000100000001\", \"0x0000000100000001\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x0000000100000000\", \"0x0000000100000001\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x0000000100000001\", \"0x0000000100000001\", \"0x0000000100000001\", \"0x0000000100000001\"],\n    \"XMM13\": [\"0x0000000100000001\", \"0x0000000100000001\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0000000100000001\", \"0x0000000100000001\", \"0x0000000100000001\", \"0x0000000100000001\"],\n    \"XMM15\": [\"0x0000000100000001\", \"0x0000000100000001\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovaps ymm1, [rdx + 32 * 1]\nvmovaps ymm2, [rdx + 32 * 2]\nvmovaps ymm3, [rdx + 32 * 3]\n\n; Test with full zero\nvpabsd ymm4, [rdx + 32 * 0]\nvpabsd xmm8, [rdx + 32 * 0]\n\n; Test with full negative\nvpabsd ymm5, [rdx + 32 * 1]\nvpabsd xmm9, [rdx + 32 * 1]\nvpabsd ymm12, ymm1\nvpabsd xmm13, xmm1\n\n; Test with full positive\nvpabsd ymm6, [rdx + 32 * 2]\nvpabsd xmm10, [rdx + 32 * 2]\nvpabsd ymm14, ymm2\nvpabsd xmm15, xmm2\n\n; Test a mix\nvpabsd ymm7, [rdx + 32 * 3]\nvpabsd xmm11, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\n\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vpabsw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM2\":  [\"0x0001000100010001\", \"0x0001000100010001\", \"0x0001000100010001\", \"0x0001000100010001\"],\n    \"XMM3\":  [\"0xFFFFFFFF00000000\", \"0x00010001FFFF0000\", \"0xFFFFFFFF00000000\", \"0x00010001FFFF0000\"],\n    \"XMM4\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0001000100010001\", \"0x0001000100010001\", \"0x0001000100010001\", \"0x0001000100010001\"],\n    \"XMM6\":  [\"0x0001000100010001\", \"0x0001000100010001\", \"0x0001000100010001\", \"0x0001000100010001\"],\n    \"XMM7\":  [\"0x0001000100000000\", \"0x0001000100010000\", \"0x0001000100000000\", \"0x0001000100010000\"],\n    \"XMM8\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x0001000100010001\", \"0x0001000100010001\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x0001000100010001\", \"0x0001000100010001\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x0001000100000000\", \"0x0001000100010000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x0001000100010001\", \"0x0001000100010001\", \"0x0001000100010001\", \"0x0001000100010001\"],\n    \"XMM13\": [\"0x0001000100010001\", \"0x0001000100010001\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x0001000100010001\", \"0x0001000100010001\", \"0x0001000100010001\", \"0x0001000100010001\"],\n    \"XMM15\": [\"0x0001000100010001\", \"0x0001000100010001\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovaps ymm1, [rdx + 32 * 1]\nvmovaps ymm2, [rdx + 32 * 2]\nvmovaps ymm3, [rdx + 32 * 3]\n\n; Test with full zero\nvpabsw ymm4, [rdx + 32 * 0]\nvpabsw xmm8, [rdx + 32 * 0]\n\n; Test with full negative\nvpabsw ymm5, [rdx + 32 * 1]\nvpabsw xmm9, [rdx + 32 * 1]\nvpabsw ymm12, ymm1\nvpabsw xmm13, xmm1\n\n; Test with full positive\nvpabsw ymm6, [rdx + 32 * 2]\nvpabsw xmm10, [rdx + 32 * 2]\nvpabsw ymm14, ymm2\nvpabsw xmm15, xmm2\n\n; Test a mix\nvpabsw ymm7, [rdx + 32 * 3]\nvpabsw xmm11, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0001000100010001\ndq 0x0001000100010001\ndq 0x0001000100010001\ndq 0x0001000100010001\n\ndq 0xFFFFFFFF00000000\ndq 0x00010001FFFF0000\ndq 0xFFFFFFFF00000000\ndq 0x00010001FFFF0000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpackssdw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x00000040FFFF8000\", \"0xFFFF800000000040\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x00000040FFFF8000\", \"0xFFFF800000000040\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x00000040FFFF8000\", \"0xFFFF800000000040\", \"0x00000040FFFF8000\", \"0xFFFF800000000040\"],\n    \"XMM5\": [\"0x00000040FFFF8000\", \"0xFFFF800000000040\", \"0x00000040FFFF8000\", \"0xFFFF800000000040\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; 32bit signed -> 16bit signed (saturated)\n; input > 0x7FFF(SHRT_MAX, 32767) = 0x7FFF(SHRT_MAX, 32767)\n; input < 0x8000(-32767) = 0x8000\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpackssdw xmm2, xmm0, [rdx + 32]\nvpackssdw xmm3, xmm0, xmm1\n\nvpackssdw ymm4, ymm0, [rdx + 32]\nvpackssdw ymm5, ymm0, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0xFFFFFFFF80000000\ndq 0x0000000000000040\ndq 0xFFFFFFFF80000000\ndq 0x0000000000000040\n\ndq 0x0000000000000040\ndq 0xFFFFFFFF80000000\ndq 0x0000000000000040\ndq 0xFFFFFFFF80000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpacksswb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x00807F4100807F41\", \"0x00FF7F4100FF7F41\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x00807F4100807F41\", \"0x00FF7F4100FF7F41\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x00807F4100807F41\", \"0x00FF7F4100FF7F41\", \"0x00807F4100807F41\", \"0x00FF7F4100FF7F41\"],\n    \"XMM5\": [\"0x00807F4100807F41\", \"0x00FF7F4100FF7F41\", \"0x00807F4100807F41\", \"0x00FF7F4100FF7F41\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; 16bit signed -> 8bit signed (saturated)\n; input > 0x7F(SCHAR_MAX, 127) = 0x7F(SCHAR_MAX, 127)\n; input < 0x80(-127) = 0x80\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpacksswb xmm2, xmm0, [rdx + 32]\nvpacksswb xmm3, xmm0, xmm1\n\nvpacksswb ymm4, ymm0, [rdx + 32]\nvpacksswb ymm5, ymm0, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x00008000007F0041\ndq 0x00008000007F0041\ndq 0x00008000007F0041\ndq 0x00008000007F0041\n\ndq 0x0000FFFF007F0041\ndq 0x0000FFFF007F0041\ndq 0x0000FFFF007F0041\ndq 0x0000FFFF007F0041\n"
  },
  {
    "path": "unittests/ASM/VEX/vpackusdw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM3\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x00000000FFFF0000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x12348000FFFF0000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x00000000FFFF0000\", \"0xFFFFFFFFFFFFFFFF\", \"0x00000000FFFF0000\"],\n    \"XMM6\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x12348000FFFF0000\", \"0xFFFFFFFFFFFFFFFF\", \"0x12348000FFFF0000\"],\n    \"XMM7\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x00000000FFFF0000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x12348000FFFF0000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x00000000FFFF0000\", \"0xFFFFFFFFFFFFFFFF\", \"0x00000000FFFF0000\"],\n    \"XMM10\": [\"0xFFFFFFFFFFFFFFFF\", \"0x12348000FFFF0000\", \"0xFFFFFFFFFFFFFFFF\", \"0x12348000FFFF0000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\n\nvpackusdw xmm3, xmm0, [rdx + 32 * 1]\nvpackusdw xmm4, xmm0, [rdx + 32 * 2]\n\nvpackusdw ymm5, ymm0, [rdx + 32 * 1]\nvpackusdw ymm6, ymm0, [rdx + 32 * 2]\n\nvpackusdw xmm7, xmm0, xmm1\nvpackusdw xmm8, xmm0, xmm2\n\nvpackusdw ymm9, ymm0, ymm1\nvpackusdw ymm10, ymm0, ymm2\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x7FFFFFFF00000000\ndq 0xFFFFFFFF80000000\ndq 0x7FFFFFFF00000000\ndq 0xFFFFFFFF80000000\n\n; Values that actually fit in to 16bit unsigned\ndq 0x0000FFFF00000000\ndq 0x0000123400008000\ndq 0x0000FFFF00000000\ndq 0x0000123400008000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpackuswb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\": [\"0x00007F4100007F41\", \"0x00007F4100007F41\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x00007F4100007F41\", \"0x00007F4100007F41\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x00007F4100007F41\", \"0x00007F4100007F41\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x00007F4100007F41\", \"0x00007F4100007F41\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x00007F4100007F41\", \"0x00007F4100007F41\", \"0x7F4100007F410000\", \"0x7F4100007F410000\"],\n    \"XMM4\": [\"0x00007F4100007F41\", \"0x00007F4100007F41\", \"0x7F4100007F410000\", \"0x7F4100007F410000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; 16bit signed -> 8bit unsigned (saturated)\n; input > 0x7F(SCHAR_MAX, 127) = 0xFF(UCHAR_MAX, 255)\n; input < 0x00(Negative) = 0x0\n\nvmovapd ymm0, [rdx]\n\nvpackuswb xmm1, xmm0, [rdx]\nvpackuswb xmm2, xmm0, xmm0\n\nvpackuswb ymm3, ymm0, [rdx]\nvpackuswb ymm4, ymm0, ymm0\n\nhlt\n\nalign 32\n.data:\ndq 0x0000FFFF007F0041\ndq 0x0000FFFF007F0041\ndq 0x007F00410000FFFF\ndq 0x007F00410000FFFF"
  },
  {
    "path": "unittests/ASM/VEX/vpaddb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x0102030405060708\", \"0x1011121314151617\", \"0x0809AABBCCDDEEFF\", \"0x4041424344454647\"],\n    \"XMM1\": [\"0x090A0B0C0D0E0F10\", \"0xCCEEDDAABBFF0990\", \"0x2021222324252627\", \"0x0062636465666768\"],\n    \"XMM2\": [\"0x0A0C0E1012141618\", \"0xDCFFEFBDCF141FA7\", \"0x282ACCDEF0021426\", \"0x40A3A5A7A9ABADAF\"],\n    \"XMM3\": [\"0x0A0C0E1012141618\", \"0xDCFFEFBDCF141FA7\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x0A0C0E1012141618\", \"0xDCFFEFBDCF141FA7\", \"0x282ACCDEF0021426\", \"0x40A3A5A7A9ABADAF\"],\n    \"XMM5\": [\"0x0A0C0E1012141618\", \"0xDCFFEFBDCF141FA7\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Registers\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\nvpaddb ymm2, ymm0, ymm1\nvpaddb xmm3, xmm0, xmm1\n\n; Memory operand\nvpaddb ymm4, ymm0, [rdx + 32]\nvpaddb xmm5, xmm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x0102030405060708\ndq 0x1011121314151617\ndq 0x0809AABBCCDDEEFF\ndq 0x4041424344454647\n\ndq 0x090A0B0C0D0E0F10\ndq 0xCCEEDDAABBFF0990\ndq 0x2021222324252627\ndq 0x0062636465666768\n"
  },
  {
    "path": "unittests/ASM/VEX/vpaddd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xFFFFFFFFEEEEEEEE\", \"0x1011121314151617\", \"0x0809AABBCCDDEEFF\", \"0x4041424344454647\"],\n    \"XMM1\": [\"0x090A0B0C0D0E0F10\", \"0xCCEEDDAABBFF0990\", \"0x2021222324252627\", \"0x0062636465666768\"],\n    \"XMM2\": [\"0x090A0B0BFBFCFDFE\", \"0xDCFFEFBDD0141FA7\", \"0x282ACCDEF1031526\", \"0x40A3A5A7A9ABADAF\"],\n    \"XMM3\": [\"0x090A0B0BFBFCFDFE\", \"0xDCFFEFBDD0141FA7\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x090A0B0BFBFCFDFE\", \"0xDCFFEFBDD0141FA7\", \"0x282ACCDEF1031526\", \"0x40A3A5A7A9ABADAF\"],\n    \"XMM5\": [\"0x090A0B0BFBFCFDFE\", \"0xDCFFEFBDD0141FA7\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Registers\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\nvpaddd ymm2, ymm0, ymm1\nvpaddd xmm3, xmm0, xmm1\n\n; Memory operand\nvpaddd ymm4, ymm0, [rdx + 32]\nvpaddd xmm5, xmm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0xFFFFFFFFEEEEEEEE\ndq 0x1011121314151617\ndq 0x0809AABBCCDDEEFF\ndq 0x4041424344454647\n\ndq 0x090A0B0C0D0E0F10\ndq 0xCCEEDDAABBFF0990\ndq 0x2021222324252627\ndq 0x0062636465666768\n"
  },
  {
    "path": "unittests/ASM/VEX/vpaddq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xEEEEEEEECCCCCCCC\", \"0x7FFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0x4041424344454647\"],\n    \"XMM1\": [\"0xAAAAAAAAAAAAAAAA\", \"0xCCEEDDAABBFF0990\", \"0x2021222324252627\", \"0x5555555555555555\"],\n    \"XMM2\": [\"0x9999999977777776\", \"0x4CEEDDAABBFF098F\", \"0x2021222324252626\", \"0x95969798999A9B9C\"],\n    \"XMM3\": [\"0x9999999977777776\", \"0x4CEEDDAABBFF098F\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x9999999977777776\", \"0x4CEEDDAABBFF098F\", \"0x2021222324252626\", \"0x95969798999A9B9C\"],\n    \"XMM5\": [\"0x9999999977777776\", \"0x4CEEDDAABBFF098F\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Registers\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\nvpaddq ymm2, ymm0, ymm1\nvpaddq xmm3, xmm0, xmm1\n\n; Memory operand\nvpaddq ymm4, ymm0, [rdx + 32]\nvpaddq xmm5, xmm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0xEEEEEEEECCCCCCCC\ndq 0x7FFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0x4041424344454647\n\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xCCEEDDAABBFF0990\ndq 0x2021222324252627\ndq 0x5555555555555555\n"
  },
  {
    "path": "unittests/ASM/VEX/vpaddsb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0x7F7F7F7F7F7F7F7F\", \"0x7F7F7F7F7F7F7F7F\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x7F7F7F7F7F7F7F7F\", \"0x7F7F7F7F7F7F7F7F\", \"0x7F7F7F7F7F7F7F7F\", \"0x7F7F7F7F7F7F7F7F\"],\n    \"XMM4\": [\"0x7F7F7F7F7F7F7F7F\", \"0x7F7F7F7F7F7F7F7F\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x7F7F7F7F7F7F7F7F\", \"0x7F7F7F7F7F7F7F7F\", \"0x7F7F7F7F7F7F7F7F\", \"0x7F7F7F7F7F7F7F7F\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvpaddsb xmm2, xmm0, xmm1\nvpaddsb ymm3, ymm0, ymm1\n\nvpaddsb xmm4, xmm0, [rdx + 32]\nvpaddsb ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpaddsw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\"],\n    \"XMM4\": [\"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvpaddsw xmm2, xmm0, xmm1\nvpaddsw ymm3, ymm0, ymm1\n\nvpaddsw xmm4, xmm0, [rdx + 32]\nvpaddsw ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpaddusb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\", \"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"],\n    \"XMM4\": [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\", \"0xA2A4A6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvpaddusb xmm2, xmm0, xmm1\nvpaddusb ymm3, ymm0, ymm1\n\nvpaddusb xmm4, xmm0, [rdx + 32]\nvpaddusb ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpaddusw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xF142434445464748\", \"0x5152535455565758\", \"0xF142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0xFFFFA6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0xFFFFA6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\", \"0xFFFFA6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"],\n    \"XMM4\": [\"0xFFFFA6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0xFFFFA6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\", \"0xFFFFA6A8AAACAEB0\", \"0xC2C4C6C8CACCCED0\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvpaddusw xmm2, xmm0, xmm1\nvpaddusw ymm3, ymm0, ymm1\n\nvpaddusw xmm4, xmm0, [rdx + 32]\nvpaddusw ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0xF142434445464748\ndq 0x5152535455565758\ndq 0xF142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpaddw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x0102030405060708\", \"0x1011121314151617\", \"0x0809AABBCCDDEEFF\", \"0x4041424344454647\"],\n    \"XMM1\": [\"0x090A0B0C0D0E0F10\", \"0xCCEEDDAABBFF0990\", \"0x2021222324252627\", \"0x0062636465666768\"],\n    \"XMM2\": [\"0x0A0C0E1012141618\", \"0xDCFFEFBDD0141FA7\", \"0x282ACCDEF1021526\", \"0x40A3A5A7A9ABADAF\"],\n    \"XMM3\": [\"0x0A0C0E1012141618\", \"0xDCFFEFBDD0141FA7\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x0A0C0E1012141618\", \"0xDCFFEFBDD0141FA7\", \"0x282ACCDEF1021526\", \"0x40A3A5A7A9ABADAF\"],\n    \"XMM5\": [\"0x0A0C0E1012141618\", \"0xDCFFEFBDD0141FA7\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Registers\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\nvpaddw ymm2, ymm0, ymm1\nvpaddw xmm3, xmm0, xmm1\n\n; Memory operand\nvpaddw ymm4, ymm0, [rdx + 32]\nvpaddw xmm5, xmm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x0102030405060708\ndq 0x1011121314151617\ndq 0x0809AABBCCDDEEFF\ndq 0x4041424344454647\n\ndq 0x090A0B0C0D0E0F10\ndq 0xCCEEDDAABBFF0990\ndq 0x2021222324252627\ndq 0x0062636465666768\n"
  },
  {
    "path": "unittests/ASM/VEX/vpalignr.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM2\":  [\"0x7861626364656667\", \"0x4871727374757677\", \"0x9881828384858687\", \"0x1891929394959697\"],\n      \"XMM3\":  [\"0x5354555657584142\", \"0x0000000000005152\", \"0x2324252627281112\", \"0x0000000000002122\"],\n      \"XMM4\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0x7861626364656667\", \"0x4871727374757677\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\":  [\"0x5354555657584142\", \"0x0000000000005152\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM8\":  [\"0x7861626364656667\", \"0x4871727374757677\", \"0x9881828384858687\", \"0x1891929394959697\"],\n      \"XMM9\":  [\"0x5354555657584142\", \"0x0000000000005152\", \"0x2324252627281112\", \"0x0000000000002122\"],\n      \"XMM10\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM11\": [\"0x7861626364656667\", \"0x4871727374757677\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM12\": [\"0x5354555657584142\", \"0x0000000000005152\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM13\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM14\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM15\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x8182838485868788\", \"0x9192939495969798\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvpalignr ymm2, ymm0, ymm1, 1\nvpalignr ymm3, ymm0, ymm1, 22\nvpalignr ymm4, ymm0, ymm1, 32\n\nvpalignr xmm5, xmm0, xmm1, 1\nvpalignr xmm6, xmm0, xmm1, 22\nvpalignr xmm7, xmm0, xmm1, 32\n\nvpalignr ymm8,  ymm0, [rdx + 32], 1\nvpalignr ymm9,  ymm0, [rdx + 32], 22\nvpalignr ymm10, ymm0, [rdx + 32], 32\n\nvpalignr xmm11, xmm0, [rdx + 32], 1\nvpalignr xmm12, xmm0, [rdx + 32], 22\nvpalignr xmm13, xmm0, [rdx + 32], 32\n\nvpalignr xmm14, xmm0, [rdx + 32], 0\nvpalignr ymm15, ymm0, [rdx + 32], 0\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x1112131415161718\ndq 0x2122232425262728\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x8182838485868788\ndq 0x9192939495969798\n"
  },
  {
    "path": "unittests/ASM/VEX/vpand.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0xCCCCCCCC75767778\", \"0x61626364DDDDDDDD\", \"0xEEEEEEEE55565758\", \"0x41424344FFFFFFFF\"],\n    \"XMM2\": [\"0x4040404445464748\", \"0x4142434455545558\", \"0x6062626445464748\", \"0x4142434475767778\"],\n    \"XMM3\": [\"0x4040404445464748\", \"0x4142434455545558\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4040404445464748\", \"0x4142434455545558\", \"0x6062626445464748\", \"0x4142434475767778\"],\n    \"XMM5\": [\"0x4040404445464748\", \"0x4142434455545558\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data1]\nlea rbx, [rel .data2]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rbx]\n\n; Register only\nvpand ymm2, ymm0, ymm1\nvpand xmm3, xmm0, xmm1\n\n; With memory operand\nvpand ymm4, ymm0, [rbx]\nvpand xmm5, xmm0, [rbx]\n\nhlt\n\nalign 32\n.data1:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0xCCCCCCCC75767778\ndq 0x61626364DDDDDDDD\ndq 0xEEEEEEEE55565758\ndq 0x41424344FFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vpandn.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0xCCCCCCCC75767778\", \"0x61626364DDDDDDDD\", \"0xEEEEEEEE55565758\", \"0x41424344FFFFFFFF\"],\n    \"XMM2\": [\"0x8C8C8C8830303030\", \"0x2020202088898885\", \"0x8E8C8C8A10101010\", \"0x000000008A898887\"],\n    \"XMM3\": [\"0x8C8C8C8830303030\", \"0x2020202088898885\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x8C8C8C8830303030\", \"0x2020202088898885\", \"0x8E8C8C8A10101010\", \"0x000000008A898887\"],\n    \"XMM5\": [\"0x8C8C8C8830303030\", \"0x2020202088898885\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data1]\nlea rbx, [rel .data2]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rbx]\n\n; Register only\nvpandn ymm2, ymm0, ymm1\nvpandn xmm3, xmm0, xmm1\n\n; With memory operand\nvpandn ymm4, ymm0, [rbx]\nvpandn xmm5, xmm0, [rbx]\n\nhlt\n\nalign 32\n.data1:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0xCCCCCCCC75767778\ndq 0x61626364DDDDDDDD\ndq 0xEEEEEEEE55565758\ndq 0x41424344FFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vpavgb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x2179B0697D5378C4\", \"0x3B8E6EAE8C165248\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x1ED68638699D35CA\", \"0x5E2E7560AB7B5262\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x165C42291F28194C\", \"0x0923643C32130145\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x2179B0697D5378C4\", \"0x3B8E6EAE8C165248\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x1ED68638699D35CA\", \"0x5E2E7560AB7B5262\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x165C42291F28194C\", \"0x0923643C32130145\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x2179B0697D5378C4\", \"0x3B8E6EAE8C165248\", \"0x2179B0697D5378C4\", \"0x3B8E6EAE8C165248\"],\n    \"XMM11\": [\"0x1ED68638699D35CA\", \"0x5E2E7560AB7B5262\", \"0x1ED68638699D35CA\", \"0x5E2E7560AB7B5262\"],\n    \"XMM12\": [\"0x165C42291F28194C\", \"0x0923643C32130145\", \"0x165C42291F28194C\", \"0x0923643C32130145\"],\n    \"XMM13\": [\"0x2179B0697D5378C4\", \"0x3B8E6EAE8C165248\", \"0x2179B0697D5378C4\", \"0x3B8E6EAE8C165248\"],\n    \"XMM14\": [\"0x1ED68638699D35CA\", \"0x5E2E7560AB7B5262\", \"0x1ED68638699D35CA\", \"0x5E2E7560AB7B5262\"],\n    \"XMM15\": [\"0x165C42291F28194C\", \"0x0923643C32130145\", \"0x165C42291F28194C\", \"0x0923643C32130145\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm6, [rdx + 32 * 1]\nvmovapd ymm7, [rdx + 32 * 2]\nvmovapd ymm8, [rdx + 32 * 3]\nvmovapd ymm9, [rdx]\n\n; 128-bit register only\nvpavgb xmm0, xmm9, xmm6\nvpavgb xmm1, xmm9, xmm7\nvpavgb xmm2, xmm9, xmm8\n\n; 128-bit memory operand\nvpavgb xmm3, xmm9, [rdx + 32 * 1]\nvpavgb xmm4, xmm9, [rdx + 32 * 2]\nvpavgb xmm5, xmm9, [rdx + 32 * 3]\n\n; 256-bit register only\nvpavgb ymm10, ymm9, ymm6\nvpavgb ymm11, ymm9, ymm7\nvpavgb ymm12, ymm9, ymm8\n\n; 256-bit memory operand\nvpavgb ymm13, ymm9, [rdx + 32 * 1]\nvpavgb ymm14, ymm9, [rdx + 32 * 2]\nvpavgb ymm15, ymm9, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x2BB883523D4F3197\ndq 0x1246C77764260189\ndq 0x2BB883523D4F3197\ndq 0x1246C77764260189\n\ndq 0x163ADD80BC57BEF1\ndq 0x64D615E5B405A306\ndq 0x163ADD80BC57BEF1\ndq 0x64D615E5B405A306\n\ndq 0x11F4881D94EB39FC\ndq 0xA9162248F2D0A23A\ndq 0x11F4881D94EB39FC\ndq 0xA9162248F2D0A23A\n\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpavgb_aliasing.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM10\": [\"0x2179B0697D5378C4\", \"0x3B8E6EAE8C165248\", \"0x2179B0697D5378C4\", \"0x3B8E6EAE8C165248\"],\n    \"XMM11\": [\"0x1ED68638699D35CA\", \"0x5E2E7560AB7B5262\", \"0x1ED68638699D35CA\", \"0x5E2E7560AB7B5262\"]\n  }\n}\n%endif\n\n; Small test that ensures aliasing source/dest is handled properly.\n\nlea rdx, [rel .data]\n\nvmovapd ymm6, [rdx + 32]\nvmovapd ymm7, [rdx]\n\n; 256-bit register only\nvmovapd ymm10, ymm7\nvpavgb ymm10, ymm10, ymm6\n\nvmovapd ymm11, [rdx + 64]\nvpavgb ymm11, ymm7, ymm11\n\nhlt\n\nalign 32\n.data:\ndq 0x2BB883523D4F3197\ndq 0x1246C77764260189\ndq 0x2BB883523D4F3197\ndq 0x1246C77764260189\n\ndq 0x163ADD80BC57BEF1\ndq 0x64D615E5B405A306\ndq 0x163ADD80BC57BEF1\ndq 0x64D615E5B405A306\n\ndq 0x11F4881D94EB39FC\ndq 0xA9162248F2D0A23A\ndq 0x11F4881D94EB39FC\ndq 0xA9162248F2D0A23A\n"
  },
  {
    "path": "unittests/ASM/VEX/vpavgw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x20F9B0697CD37844\", \"0x3B8E6EAE8C165248\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x1ED685B8691D35CA\", \"0x5DAE74E0AB7B51E2\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x15DC41A91EA818CC\", \"0x092363BC321300C5\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x20F9B0697CD37844\", \"0x3B8E6EAE8C165248\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x1ED685B8691D35CA\", \"0x5DAE74E0AB7B51E2\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x15DC41A91EA818CC\", \"0x092363BC321300C5\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x20F9B0697CD37844\", \"0x3B8E6EAE8C165248\", \"0x20F9B0697CD37844\", \"0x3B8E6EAE8C165248\"],\n    \"XMM11\": [\"0x1ED685B8691D35CA\", \"0x5DAE74E0AB7B51E2\", \"0x1ED685B8691D35CA\", \"0x5DAE74E0AB7B51E2\"],\n    \"XMM12\": [\"0x15DC41A91EA818CC\", \"0x092363BC321300C5\", \"0x15DC41A91EA818CC\", \"0x092363BC321300C5\"],\n    \"XMM13\": [\"0x20F9B0697CD37844\", \"0x3B8E6EAE8C165248\", \"0x20F9B0697CD37844\", \"0x3B8E6EAE8C165248\"],\n    \"XMM14\": [\"0x1ED685B8691D35CA\", \"0x5DAE74E0AB7B51E2\", \"0x1ED685B8691D35CA\", \"0x5DAE74E0AB7B51E2\"],\n    \"XMM15\": [\"0x15DC41A91EA818CC\", \"0x092363BC321300C5\", \"0x15DC41A91EA818CC\", \"0x092363BC321300C5\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm6, [rdx + 32 * 1]\nvmovapd ymm7, [rdx + 32 * 2]\nvmovapd ymm8, [rdx + 32 * 3]\nvmovapd ymm9, [rdx]\n\n; 128-bit register only\nvpavgw xmm0, xmm9, xmm6\nvpavgw xmm1, xmm9, xmm7\nvpavgw xmm2, xmm9, xmm8\n\n; 128-bit memory operand\nvpavgw xmm3, xmm9, [rdx + 32 * 1]\nvpavgw xmm4, xmm9, [rdx + 32 * 2]\nvpavgw xmm5, xmm9, [rdx + 32 * 3]\n\n; 256-bit register only\nvpavgw ymm10, ymm9, ymm6\nvpavgw ymm11, ymm9, ymm7\nvpavgw ymm12, ymm9, ymm8\n\n; 256-bit memory operand\nvpavgw ymm13, ymm9, [rdx + 32 * 1]\nvpavgw ymm14, ymm9, [rdx + 32 * 2]\nvpavgw ymm15, ymm9, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x2BB883523D4F3197\ndq 0x1246C77764260189\ndq 0x2BB883523D4F3197\ndq 0x1246C77764260189\n\ndq 0x163ADD80BC57BEF1\ndq 0x64D615E5B405A306\ndq 0x163ADD80BC57BEF1\ndq 0x64D615E5B405A306\n\ndq 0x11F4881D94EB39FC\ndq 0xA9162248F2D0A23A\ndq 0x11F4881D94EB39FC\ndq 0xA9162248F2D0A23A\n\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpavgw_aliasing.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM10\": [\"0x20F9B0697CD37844\", \"0x3B8E6EAE8C165248\", \"0x20F9B0697CD37844\", \"0x3B8E6EAE8C165248\"],\n    \"XMM11\": [\"0x1ED685B8691D35CA\", \"0x5DAE74E0AB7B51E2\", \"0x1ED685B8691D35CA\", \"0x5DAE74E0AB7B51E2\"]\n  }\n}\n%endif\n\n; Small test that ensures aliasing source/dest is handled properly.\n\nlea rdx, [rel .data]\n\nvmovapd ymm6, [rdx + 32]\nvmovapd ymm7, [rdx]\n\n; 256-bit register only\nvmovapd ymm10, ymm7\nvpavgw ymm10, ymm10, ymm6\n\nvmovapd ymm11, [rdx + 64]\nvpavgw ymm11, ymm7, ymm11\n\nhlt\n\nalign 32\n.data:\ndq 0x2BB883523D4F3197\ndq 0x1246C77764260189\ndq 0x2BB883523D4F3197\ndq 0x1246C77764260189\n\ndq 0x163ADD80BC57BEF1\ndq 0x64D615E5B405A306\ndq 0x163ADD80BC57BEF1\ndq 0x64D615E5B405A306\n\ndq 0x11F4881D94EB39FC\ndq 0xA9162248F2D0A23A\ndq 0x11F4881D94EB39FC\ndq 0xA9162248F2D0A23A\n"
  },
  {
    "path": "unittests/ASM/VEX/vpblendd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0xAAAAAAAABBBBBBBB\", \"0xCCCCCCCCDDDDDDDD\", \"0xEEEEEEEEFFFFFFFF\", \"0x9999999988888888\"],\n    \"XMM3\": [\"0x1111111122222222\", \"0x3333333344444444\", \"0x5555555566666666\", \"0x7777777788888888\"],\n    \"XMM4\": [\"0xAAAAAAAABBBBBBBB\", \"0xCCCCCCCCDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x1111111122222222\", \"0x3333333344444444\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x11111111BBBBBBBB\", \"0x33333333DDDDDDDD\", \"0x55555555FFFFFFFF\", \"0x7777777788888888\"],\n    \"XMM7\": [\"0xAAAAAAAA22222222\", \"0xCCCCCCCC44444444\", \"0xEEEEEEEE66666666\", \"0x9999999988888888\"],\n    \"XMM8\": [\"0x11111111BBBBBBBB\", \"0x33333333DDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\": [\"0xAAAAAAAA22222222\", \"0xCCCCCCCC44444444\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Selecting all of one input vector\nvpblendd ymm2, ymm0, ymm1, 0    ; All of ymm0\nvpblendd ymm3, ymm0, ymm1, 0xFF ; All of ymm1\n\nvpblendd xmm4, xmm0, xmm1, 0    ; All of xmm0\nvpblendd xmm5, xmm0, xmm1, 0xFF ; All of xmm1\n\n; Alternating source vectors\nvpblendd ymm6, ymm0, ymm1, 0b10101010\nvpblendd ymm7, ymm0, ymm1, 0b01010101\n\nvpblendd xmm8, xmm0, xmm1, 0b10101010\nvpblendd xmm9, xmm0, xmm1, 0b01010101\n\nhlt\n\nalign 32\n.data:\ndq 0xAAAAAAAABBBBBBBB\ndq 0xCCCCCCCCDDDDDDDD\ndq 0xEEEEEEEEFFFFFFFF\ndq 0x9999999988888888\n\ndq 0x1111111122222222\ndq 0x3333333344444444\ndq 0x5555555566666666\ndq 0x7777777788888888\n"
  },
  {
    "path": "unittests/ASM/VEX/vpblendvb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM3\":  [\"0x1222324252627282\", \"0xAABBCCDDEEFF9900\", \"0x8070605040302010\", \"0x1020304050607080\"],\n    \"XMM4\":  [\"0x1222324252627282\", \"0xAABBCCDDEEFF9900\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0xAABBCCDDEEFF1122\", \"0x3344556677889900\", \"0x1020304050607080\", \"0x9585756555453525\"],\n    \"XMM6\":  [\"0xAABBCCDDEEFF1122\", \"0x3344556677889900\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0xAA22CC42EE621182\", \"0x33BB55DD77FF9900\", \"0x1070305050307010\", \"0x9520754055603580\"],\n    \"XMM8\":  [\"0xAA22CC42EE621182\", \"0x33BB55DD77FF9900\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x12BB32DD52FF7222\", \"0xAA44CC66EE889900\", \"0x8020604040602080\", \"0x1085306550457025\"],\n    \"XMM10\": [\"0x12BB32DD52FF7222\", \"0xAA44CC66EE889900\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x1222324252627282\", \"0xaabbccddeeff9900\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\nvmovaps ymm2, [rel .mask_all]\n\n; Select all ymm1\nvpblendvb ymm3, ymm0, ymm1, ymm2\nvpblendvb xmm4, xmm0, xmm1, xmm2\n\n; Select all ymm0\nvmovaps ymm2, [rel .mask_none]\nvpblendvb ymm5, ymm0, ymm1, ymm2\nvpblendvb xmm6, xmm0, xmm1, xmm2\n\n; Interleaved selection from ymm1 and ymm0\nvmovaps ymm2, [rel .mask_interleave1]\nvpblendvb ymm7, ymm0, ymm1, ymm2\nvpblendvb xmm8, xmm0, xmm1, xmm2\n\n; Interleaved selection from ymm0 and ymm1\nvmovaps ymm2, [rel .mask_interleave2]\nvpblendvb ymm9,  ymm0, ymm1, ymm2\nvpblendvb xmm10, xmm0, xmm1, xmm2\n\n; Select all ymm0, with data in upper-bits\nvmovaps ymm11, [rel .data_bad]\nvmovaps ymm2, [rel .mask_all]\nvpblendvb xmm11, xmm0, xmm1, xmm2\n\nhlt\n\nalign 32\n.data:\ndq 0xAABBCCDDEEFF1122\ndq 0x3344556677889900\ndq 0x1020304050607080\ndq 0x9585756555453525\n\ndq 0x1222324252627282\ndq 0xAABBCCDDEEFF9900\ndq 0x8070605040302010\ndq 0x1020304050607080\n\n.mask_all:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.mask_none:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.mask_interleave1:\ndq 0x0080008000800080\ndq 0x0080008000800080\ndq 0x0080008000800080\ndq 0x0080008000800080\n\n.mask_interleave2:\ndq 0x8000800080008000\ndq 0x8000800080008000\ndq 0x8000800080008000\ndq 0x8000800080008000\n\n.data_bad:\ndq 0x3132333435363738\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\n"
  },
  {
    "path": "unittests/ASM/VEX/vpblendw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0xAAAABBBBCCCCDDDD\", \"0xEEEEFFFF99998888\", \"0x7777666655554444\", \"0x222211110000AAAA\"],\n    \"XMM3\": [\"0x1111222233334444\", \"0x5555666677778888\", \"0x9999AAAABBBBCCCC\", \"0xDDDDEEEEFFFF1111\"],\n    \"XMM4\": [\"0xAAAABBBBCCCCDDDD\", \"0xEEEEFFFF99998888\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x1111222233334444\", \"0x5555666677778888\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x1111BBBB3333DDDD\", \"0x5555FFFF77778888\", \"0x99996666BBBB4444\", \"0xDDDD1111FFFFAAAA\"],\n    \"XMM7\": [\"0xAAAA2222CCCC4444\", \"0xEEEE666699998888\", \"0x7777AAAA5555CCCC\", \"0x2222EEEE00001111\"],\n    \"XMM8\": [\"0x1111BBBB3333DDDD\", \"0x5555FFFF77778888\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\": [\"0xAAAA2222CCCC4444\", \"0xEEEE666699998888\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Selecting all of one input vector\nvpblendw ymm2, ymm0, ymm1, 0    ; All of ymm0\nvpblendw ymm3, ymm0, ymm1, 0xFF ; All of ymm1\n\nvpblendw xmm4, xmm0, xmm1, 0    ; All of xmm0\nvpblendw xmm5, xmm0, xmm1, 0xFF ; All of xmm1\n\n; Alternating source vectors\nvpblendw ymm6, ymm0, ymm1, 0b10101010\nvpblendw ymm7, ymm0, ymm1, 0b01010101\n\nvpblendw xmm8, xmm0, xmm1, 0b10101010\nvpblendw xmm9, xmm0, xmm1, 0b01010101\n\nhlt\n\nalign 32\n.data:\ndq 0xAAAABBBBCCCCDDDD\ndq 0xEEEEFFFF99998888\ndq 0x7777666655554444\ndq 0x222211110000AAAA\n\ndq 0x1111222233334444\ndq 0x5555666677778888\ndq 0x9999AAAABBBBCCCC\ndq 0xDDDDEEEEFFFF1111\n"
  },
  {
    "path": "unittests/ASM/VEX/vpbroadcastb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM1\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\", \"0xDDDDDDDDDDDDDDDD\", \"0xCCCCCCCCCCCCCCCC\"],\n      \"XMM2\": [\"0xE0E0E0E0E0E0E0E0\", \"0xE0E0E0E0E0E0E0E0\", \"0xE0E0E0E0E0E0E0E0\", \"0xE0E0E0E0E0E0E0E0\"],\n      \"XMM3\": [\"0xE0E0E0E0E0E0E0E0\", \"0xE0E0E0E0E0E0E0E0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM5\": [\"0xDDDDDDDDDDDDDDDD\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 0]\nvmovaps ymm1, [rdx + 32 * 1]\n\n; Register broadcasting\nvpbroadcastb ymm2, xmm0\nvpbroadcastb xmm3, xmm1\n\n; Memory broadcasting\nvpbroadcastb ymm4, [rdx + 16]\nvpbroadcastb xmm5, [rdx + 48]\n\nhlt\n\nalign 32\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x6868C3F3AAED56E0\ndq 0xF0FCE9E294E6E6DE\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vpbroadcastd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM1\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\", \"0xDDDDDDDDDDDDDDDD\", \"0xCCCCCCCCCCCCCCCC\"],\n      \"XMM2\": [\"0xA12BFCE0A12BFCE0\", \"0xA12BFCE0A12BFCE0\", \"0xA12BFCE0A12BFCE0\", \"0xA12BFCE0A12BFCE0\"],\n      \"XMM3\": [\"0xAAED56E0AAED56E0\", \"0xAAED56E0AAED56E0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM5\": [\"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 0]\nvmovaps ymm1, [rdx + 32 * 1]\n\n; Register broadcasting\nvpbroadcastd ymm2, xmm0\nvpbroadcastd xmm3, xmm1\n\n; Memory broadcasting\nvpbroadcastd ymm4, [rdx + 16]\nvpbroadcastd xmm5, [rdx + 24]\n\nhlt\n\nalign 32\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x6868C3F3AAED56E0\ndq 0xF0FCE9E294E6E6DE\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vpbroadcastq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM1\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\", \"0xDDDDDDDDDDDDDDDD\", \"0xCCCCCCCCCCCCCCCC\"],\n      \"XMM2\": [\"0xA76C4F06A12BFCE0\", \"0xA76C4F06A12BFCE0\", \"0xA76C4F06A12BFCE0\", \"0xA76C4F06A12BFCE0\"],\n      \"XMM3\": [\"0x6868C3F3AAED56E0\", \"0x6868C3F3AAED56E0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM5\": [\"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 0]\nvmovaps ymm1, [rdx + 32 * 1]\n\n; Register broadcasting\nvpbroadcastq ymm2, xmm0\nvpbroadcastq xmm3, xmm1\n\n; Memory broadcasting\nvpbroadcastq ymm4, [rdx + 16]\nvpbroadcastq xmm5, [rdx + 24]\n\nhlt\n\nalign 32\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x6868C3F3AAED56E0\ndq 0xF0FCE9E294E6E6DE\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vpbroadcastw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM1\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\", \"0xDDDDDDDDDDDDDDDD\", \"0xCCCCCCCCCCCCCCCC\"],\n      \"XMM2\": [\"0xFCE0FCE0FCE0FCE0\", \"0xFCE0FCE0FCE0FCE0\", \"0xFCE0FCE0FCE0FCE0\", \"0xFCE0FCE0FCE0FCE0\"],\n      \"XMM3\": [\"0x56E056E056E056E0\", \"0x56E056E056E056E0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM5\": [\"0xDDDDDDDDDDDDDDDD\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 0]\nvmovaps ymm1, [rdx + 32 * 1]\n\n; Register broadcasting\nvpbroadcastw ymm2, xmm0\nvpbroadcastw xmm3, xmm1\n\n; Memory broadcasting\nvpbroadcastw ymm4, [rdx + 16]\nvpbroadcastw xmm5, [rdx + 48]\n\nhlt\n\nalign 32\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x6868C3F3AAED56E0\ndq 0xF0FCE9E294E6E6DE\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vpclmulqdq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM2\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\", \"0xDDDDDDDDDDDDDDDD\", \"0xCCCCCCCCCCCCCCCC\"],\n      \"XMM3\": [\"0x1E2017C5BEE29400\", \"0x38358E40CC367C7A\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM4\": [\"0xE208147952DE57A0\", \"0x317D360F86C80DC9\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\": [\"0xBBA54C87DA872B40\", \"0x6495428B7641EBE6\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\": [\"0x170B5A1B5CDD42EA\", \"0x719F094BB2358CA1\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Load inputs\nvmovaps ymm1, [rdx + 32 * 0]\nvmovaps ymm2, [rdx + 32 * 1]\n\n; Fill result vectors with junk (ensure proper lane clearing is performed)\nvmovaps ymm3, [rdx + 32 * 0]\nvmovaps ymm4, [rdx + 32 * 0]\nvmovaps ymm5, [rdx + 32 * 0]\nvmovaps ymm6, [rdx + 32 * 0]\n\n; With imm = 0b00000000\nvpclmulqdq xmm3, xmm1, xmm2, 0\n\n; With imm = 0b00000001\nvpclmulqdq xmm4, xmm1, xmm2, 1\n\n; With imm = 0b00010000\nvpclmulqdq xmm5, xmm1, xmm2, 16\n\n; With imm = 0b00010001\nvpclmulqdq xmm6, xmm1, xmm2, 17\n\nhlt\n\nalign 32\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\ndq 0x6868C3F3AAED56E0\ndq 0xF0FCE9E294E6E6DE\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vpclmulqdq_256.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM2\": [\"0x6868C3F3AAED56E0\", \"0xF0FCE9E294E6E6DE\", \"0xDDDDDDDDDDDDDDDD\", \"0xCCCCCCCCCCCCCCCC\"],\n      \"XMM3\": [\"0x1E2017C5BEE29400\", \"0x38358E40CC367C7A\", \"0x4b4b4b4b4b4b4b4b\", \"0x4b4b4b4b4b4b4b4b\"],\n      \"XMM4\": [\"0xE208147952DE57A0\", \"0x317D360F86C80DC9\", \"0x4646464646464646\", \"0x4646464646464646\"],\n      \"XMM5\": [\"0xBBA54C87DA872B40\", \"0x6495428B7641EBE6\", \"0x4444444444444444\", \"0x4444444444444444\"],\n      \"XMM6\": [\"0x170B5A1B5CDD42EA\", \"0x719F094BB2358CA1\", \"0x4848484848484848\", \"0x4848484848484848\"],\n      \"XMM7\": [\"0x1e2017c5bee29400\", \"0x38358e40cc367c7a\", \"0\", \"0\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\n; Load inputs\nvmovaps ymm1, [rdx + 32 * 0]\nvmovaps ymm2, [rdx + 32 * 1]\n\n; Fill result vectors with junk (ensure proper lane clearing is performed)\nvmovaps ymm3, [rdx + 32 * 0]\nvmovaps ymm4, [rdx + 32 * 0]\nvmovaps ymm5, [rdx + 32 * 0]\nvmovaps ymm6, [rdx + 32 * 0]\nvmovaps ymm7, [rdx + 32 * 0]\n\n; With imm = 0b00000000\nvpclmulqdq ymm3, ymm1, ymm2, 0\n\n; With imm = 0b00000001\nvpclmulqdq ymm4, ymm1, ymm2, 1\n\n; With imm = 0b00010000\nvpclmulqdq ymm5, ymm1, ymm2, 16\n\n; With imm = 0b00010001\nvpclmulqdq ymm6, ymm1, ymm2, 17\n\n; Test zero-extension\n; Also test a wacky immediate.\nvpclmulqdq xmm7, xmm1, xmm2, 11101110b\n\nhlt\n\nalign 32\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\ndq 0x6868C3F3AAED56E0\ndq 0xF0FCE9E294E6E6DE\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpeqb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\"],\n    \"XMM1\": [\"0x6162636465666778\", \"0x5152535455565748\", \"0x6162636465666778\", \"0x5152535455565748\"],\n    \"XMM2\": [\"0x00000000000000FF\", \"0x00000000000000FF\", \"0x00000000000000FF\", \"0x00000000000000FF\"],\n    \"XMM3\": [\"0x00000000000000FF\", \"0x00000000000000FF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x00000000000000FF\", \"0x00000000000000FF\", \"0x00000000000000FF\", \"0x00000000000000FF\"],\n    \"XMM5\": [\"0x00000000000000FF\", \"0x00000000000000FF\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\n; Register only\nvpcmpeqb ymm2, ymm0, ymm1\nvpcmpeqb xmm3, xmm0, xmm1\n\n; Memory operand\nvpcmpeqb ymm4, ymm0, [rdx + 32 * 1]\nvpcmpeqb xmm5, xmm0, [rdx + 32 * 1]\n\nhlt\n\nalign 4096\n.data:\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\n\ndq 0x6162636465666778\ndq 0x5152535455565748\ndq 0x6162636465666778\ndq 0x5152535455565748\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpeqd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x71727374FFFFFFFF\", \"0x41424344FFFFFFFF\", \"0x71727374FFFFFFFF\", \"0x41424344FFFFFFFF\"],\n    \"XMM1\": [\"0x61626364FFFFFFFF\", \"0x51525354FFFFFFFF\", \"0x61626364FFFFFFFF\", \"0x51525354FFFFFFFF\"],\n    \"XMM2\": [\"0x00000000FFFFFFFF\", \"0x00000000FFFFFFFF\", \"0x00000000FFFFFFFF\", \"0x00000000FFFFFFFF\"],\n    \"XMM3\": [\"0x00000000FFFFFFFF\", \"0x00000000FFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x00000000FFFFFFFF\", \"0x00000000FFFFFFFF\", \"0x00000000FFFFFFFF\", \"0x00000000FFFFFFFF\"],\n    \"XMM5\": [\"0x00000000FFFFFFFF\", \"0x00000000FFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\n; Register only\nvpcmpeqd ymm2, ymm0, ymm1\nvpcmpeqd xmm3, xmm0, xmm1\n\n; Memory operand\nvpcmpeqd ymm4, ymm0, [rdx + 32 * 1]\nvpcmpeqd xmm5, xmm0, [rdx + 32 * 1]\n\nhlt\n\nalign 4096\n.data:\ndq 0x71727374FFFFFFFF\ndq 0x41424344FFFFFFFF\ndq 0x71727374FFFFFFFF\ndq 0x41424344FFFFFFFF\n\ndq 0x61626364FFFFFFFF\ndq 0x51525354FFFFFFFF\ndq 0x61626364FFFFFFFF\ndq 0x51525354FFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpeqq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xFFFFFFFFFFFFFFFF\", \"0x41424344FFFFFFFF\", \"0x71727374FFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM1\": [\"0xFFFFFFFFFFFFFFFF\", \"0x51525354FFFFFFFF\", \"0x61626364FFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM3\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM5\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\n; Register only\nvpcmpeqq ymm2, ymm0, ymm1\nvpcmpeqq xmm3, xmm0, xmm1\n\n; Memory operand\nvpcmpeqq ymm4, ymm0, [rdx + 32 * 1]\nvpcmpeqq xmm5, xmm0, [rdx + 32 * 1]\n\nhlt\n\nalign 4096\n.data:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0x41424344FFFFFFFF\ndq 0x71727374FFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0x51525354FFFFFFFF\ndq 0x61626364FFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpeqw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\"],\n    \"XMM1\": [\"0x6162636465667778\", \"0x5152535455564748\", \"0x6162636465667778\", \"0x5152535455564748\"],\n    \"XMM2\": [\"0x000000000000FFFF\", \"0x000000000000FFFF\", \"0x000000000000FFFF\", \"0x000000000000FFFF\"],\n    \"XMM3\": [\"0x000000000000FFFF\", \"0x000000000000FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x000000000000FFFF\", \"0x000000000000FFFF\", \"0x000000000000FFFF\", \"0x000000000000FFFF\"],\n    \"XMM5\": [\"0x000000000000FFFF\", \"0x000000000000FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\n; Register only\nvpcmpeqw ymm2, ymm0, ymm1\nvpcmpeqw xmm3, xmm0, xmm1\n\n; Memory operand\nvpcmpeqw ymm4, ymm0, [rdx + 32 * 1]\nvpcmpeqw xmm5, xmm0, [rdx + 32 * 1]\n\nhlt\n\nalign 4096\n.data:\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\n\ndq 0x6162636465667778\ndq 0x5152535455564748\ndq 0x6162636465667778\ndq 0x5152535455564748\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpestri_equal_any.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"RAX\": [\"15\"],\n      \"RDX\": [\"16\"],\n      \"XMM0\": [\"0x04070F000F000E05\", \"0x0000000000040404\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM1\": [\"0x0121313131311111\", \"0x0000000000010101\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x306F8A9E672C65E5\", \"0x000030443057697D\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\": [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\", \"0x8888888888888888\", \"0x9999999999999999\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to vpcmpestri\n;\n%macro CompareAndStore 2\n  vpcmpestri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Unsigned byte character check (lsb, positive polarity)\nmov rax, 15 ; Exclude 'l'\nmov rdx, 16\nCompareAndStore 0, 0b00000000\n\n; Unsigned byte character check (msb, positive polarity)\nCompareAndStore 1, 0b01000000\n\n; Unsigned byte character check (lsb, negative polarity)\nCompareAndStore 2, 0b00010000\n\n; Unsigned byte character check (msb, negative polarity)\nCompareAndStore 3, 0b01010000\n\n; Unsigned byte character check (lsb, negative masked)\nCompareAndStore 4, 0b00110000\n\n; Unsigned byte character check (msb, negative masked)\nCompareAndStore 5, 0b01110000\n\n; --- 16-bit unsigned word tests ---\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\n; Unsigned word character check (msb, positive polarity)\nCompareAndStore 6, 0b01000001\n\n; Unsigned word character check (lsb, negative polarity)\nCompareAndStore 7, 0b00010001\n\n; Unsigned word character check (msb, negative polarity)\nCompareAndStore 8, 0b01010001\n\n; Unsigned word character check (lsb, negative masked)\nCompareAndStore 9, 0b00110001\n\n; Unsigned word character check (msb, negative masked)\nCompareAndStore 10, 0b01110001\n\n; Load all our stored indices and flags for result comparing\nvmovaps ymm0, [rel .indices]\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6463626144434241 ; \"ABCDabcd\"\ndq 0x6C6B6A694C4B4A49 ; \"IJKLijkl\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x4120492065726548 ; \"Here I A\"\ndq 0x6C4C612759202C6D ; \"m, Y'aLl\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpestri_equal_each.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"RAX\": [\"4\"],\n      \"RDX\": [\"3\"],\n      \"XMM0\": [\"0x0F000B060B060F00\", \"0x040407000F060706\", \"0x0704030307000404\", \"0x0000000000000000\"],\n      \"XMM1\": [\"0x3939010101012121\", \"0x0101212119191919\", \"0x1919191939390101\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x306F8A9E672C65E5\", \"0x000030443057697D\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\": [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\", \"0x8888888888888888\", \"0x9999999999999999\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to vpcmpestri\n;\n%macro CompareAndStore 2\n  vpcmpestri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Full length unsigned byte string check (lsb, positive polarity)\nmov rax, 16\nmov rdx, 16\nCompareAndStore 0, 0b00001000\n\n; Full length unsigned byte string check (msb, positive polarity)\nCompareAndStore 1, 0b01001000\n\n; Full length unsigned byte string check (lsb, negative polarity)\nCompareAndStore 2, 0b00011000\n\n; Full length unsigned byte string check (msb, negative polarity)\nCompareAndStore 3, 0b01011000\n\n; Full length unsigned byte string check (lsb, negative masked)\nCompareAndStore 4, 0b00111000\n\n; Full length unsigned byte string check (msb, negative masked)\nCompareAndStore 5, 0b01111000\n\n; Non-full length unsigned byte string check (lsb, positive polarity)\nmov rax, 8\nmov rdx, 7\nCompareAndStore 6, 0b00001000\n\n; Non-full length unsigned byte string check (msb, positive polarity)\nCompareAndStore 7, 0b01001000\n\n; Non-full length unsigned byte string check (lsb, negative polarity)\nCompareAndStore 8, 0b00011000\n\n; Non-full length unsigned byte string check (msb, negative polarity)\nCompareAndStore 9, 0b01011000\n\n; Non-full length unsigned byte string check (lsb, negative masked)\nCompareAndStore 10, 0b00111000\n\n; Non-full length unsigned byte string check (msb, negative masked)\nCompareAndStore 11, 0b01111000\n\n; --- 16-bit unsigned word tests ---\n\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\n; Full length unsigned word string check (lsb, positive polarity)\nmov rax, 8\nmov rdx, 8\nCompareAndStore 12, 0b00001001\n\n; Full length unsigned word string check (msb, positive polarity)\nCompareAndStore 13, 0b01001001\n\n; Full length unsigned word string check (lsb, negative polarity)\nCompareAndStore 14, 0b00011001\n\n; Full length unsigned word string check (msb, negative polarity)\nCompareAndStore 15, 0b01011001\n\n; Full length unsigned word string check (lsb, negative masked)\nCompareAndStore 16, 0b00111001\n\n; Full length unsigned word string check (msb, negative masked)\nCompareAndStore 17, 0b01111001\n\n; Non-full length unsigned word string check (lsb, positive polarity)\nmov rax, 4\nmov rdx, 3\nCompareAndStore 18, 0b00001001\n\n; Non-full length unsigned word string check (msb, positive polarity)\nCompareAndStore 19, 0b01001001\n\n; Non-full length unsigned word string check (lsb, negative polarity)\nCompareAndStore 20, 0b00011001\n\n; Non-full length unsigned word string check (msb, negative polarity)\nCompareAndStore 21, 0b01011001\n\n; Non-full length unsigned word string check (lsb, negative masked)\nCompareAndStore 22, 0b00111001\n\n; Non-full length unsigned word string check (msb, negative masked)\nCompareAndStore 23, 0b01111001\n\n; Load all our stored indices and flags for result comparing\nvmovaps ymm0, [rel .indices]\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6C6C6548 ; \"Hello Pe\"\ndq 0x21212121656C706F ; \"ople!!!!\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x21212121216C6C61 ; \"all!!!!!\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpestri_equal_ordered.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"RAX\": [\"2\"],\n      \"RDX\": [\"16\"],\n      \"XMM0\": [\"0x05050F000F000902\", \"0x0000000007000700\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM1\": [\"0x1111313131311111\", \"0x0000000031313131\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x306F8A9E30443057\", \"0x000030443057697D\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\": [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\", \"0x8888888888888888\", \"0x9999999999999999\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to vpcmpestri\n;\n%macro CompareAndStore 2\n  vpcmpestri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Unsigned byte string check (lsb, positive polarity)\nmov rax, 2\nmov rdx, 16\nCompareAndStore 0, 0b00001100\n\n; Unsigned byte string check (msb, positive polarity)\nCompareAndStore 1, 0b01001100\n\n; Unsigned byte string check (lsb, negative polarity)\nCompareAndStore 2, 0b00011100\n\n; Unsigned byte string check (msb, negative polarity)\nCompareAndStore 3, 0b01011100\n\n; Unsigned byte string check (lsb, negative masked)\nCompareAndStore 4, 0b00111100\n\n; Unsigned byte string check (msb, negative masked)\nCompareAndStore 5, 0b01111100\n\n; --- 16-bit unsigned word tests ---\n; Intentionally don't reset RDX to 8 here to test upper bounds clamping.\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\nCompareAndStore 6, 0b00001101\n\n; Unsigned word string check (msb, positive polarity)\nCompareAndStore 7, 0b01001101\n\n; Unsigned word string check (lsb, negative polarity)\nCompareAndStore 8, 0b00011101\n\n; Unsigned word string check (msb, negative polarity)\nCompareAndStore 9, 0b01011101\n\n; Unsigned word string check (lsb, negative masked)\nCompareAndStore 10, 0b00111101\n\n; Unsigned word string check (msb, negative masked)\nCompareAndStore 11, 0b01111101\n\n; Load all our stored indices and flags for result comparing\nvmovaps ymm0, [rel .indices]\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6FFF6C6C ; \"ll\" with junk following it\ndq 0x21212121656C706F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x21212121216C6C61 ; \"all!!!!!\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E30443057 ; \"しい\" followed by junk\ndq 0x000030443057697D\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpestri_ranges.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"RAX\": [\"4\"],\n      \"RDX\": [\"16\"],\n      \"XMM0\": [\"0x00060F000F000D01\", \"0x0000000000070007\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM1\": [\"0x3111313131311111\", \"0x0000000000313131\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x005A0041007A0061\", \"0x55AACCBBFF223344\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\": [\"0x006500200027003F\", \"0x00210065004F0065\", \"0x8888888888888888\", \"0x9999999999999999\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to vpcmpestri\n;\n%macro CompareAndStore 2\n  vpcmpestri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Range unsigned byte check (lsb, positive polarity)\nmov rax, 4\nmov rdx, 16\nCompareAndStore 0, 0b00000100\n\n; Range unsigned byte check (msb, positive polarity)\nCompareAndStore 1, 0b01000100\n\n; Range unsigned byte check (lsb, negative polarity)\nCompareAndStore 2, 0b00010100\n\n; Range unsigned byte check (msb, negative polarity)\nCompareAndStore 3, 0b01010100\n\n; Range unsigned byte check (lsb, negative masked)\nCompareAndStore 4, 0b00110100\n\n; Range unsigned byte check (msb, negative masked)\nCompareAndStore 5, 0b01110100\n\n; --- 16-bit unsigned word tests ---\n; Intentionally don't reset RDX to 8 here to test upper bounds clamping.\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\n; Range unsigned word check (msb, positive polarity)\nCompareAndStore 6, 0b01000101\n\n; Range unsigned word check (lsb, negative polarity)\nCompareAndStore 7, 0b00010101\n\n; Range unsigned word check (msb, negative polarity)\nCompareAndStore 8, 0b01010101\n\n; Range unsigned word check (lsb, negative masked)\nCompareAndStore 9, 0b00110101\n\n; Range unsigned word check (msb, negative masked)\nCompareAndStore 10, 0b01110101\n\n; Load all our stored indices and flags for result comparing\nvmovaps ymm0, [rel .indices]\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x998877665A417A61 ; \"azAZ\" (followed by junk)\ndq 0x55AACCBBFF223344\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x726548206D27493F ; \"?I'm Her\"\ndq 0x21216E65704F2065 ; \"e Open!!\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\n.data16:\ndq 0x005A0041007A0061 ; \"azAZ\"\ndq 0x55AACCBBFF223344\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x006500200027003F ; \"?' e\"\ndq 0x00210065004F0065 ; \"eOen!\"\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpestrm_equal_any.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"RAX\":   [\"15\"],\n      \"RDX\":   [\"16\"],\n      \"XMM1\":  [\"0x0121313131311111\", \"0x0000000000010101\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\":  [\"0x306F8A9E672C65E5\", \"0x000030443057697D\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\":  [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\", \"0x8888888888888888\", \"0x9999999999999999\"],\n      \"XMM4\":  [\"0x00000000000060A0\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0xFF00FF0000000000\", \"0x00FFFF0000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\":  [\"0x0000000000009F5F\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0x00FF00FFFFFFFFFF\", \"0xFF0000FFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM8\":  [\"0x0000000000009F5F\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0x00FF00FFFFFFFFFF\", \"0xFF0000FFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM10\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFF0000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM11\": [\"0x0000000000000010\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM12\": [\"0x0000000000000000\", \"0x000000000000FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM13\": [\"0x0000000000000010\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM14\": [\"0x0000000000000000\", \"0x000000000000FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a specified vector in the third argument\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to pcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  vpcmpestrm xmm2, xmm3, %2\n  vmovaps xmm%3, xmm0\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Unsigned byte character check (bits, positive polarity)\nmov rax, 15 ; Exclude 'l'\nmov rdx, 16\nCompareAndStore 0, 0b00000000, 4\n\n; Unsigned byte character check (mask, positive polarity)\nCompareAndStore 1, 0b01000000, 5\n\n; Unsigned byte character check (bits, negative polarity)\nCompareAndStore 2, 0b00010000, 6\n\n; Unsigned byte character check (mask, negative polarity)\nCompareAndStore 3, 0b01010000, 7\n\n; Unsigned byte character check (bits, negative masked)\nCompareAndStore 4, 0b00110000, 8\n\n; Unsigned byte character check (mask, negative masked)\nCompareAndStore 5, 0b01110000, 9\n\n; --- 16-bit unsigned word tests ---\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\n; Unsigned word character check (mask, positive polarity)\nCompareAndStore 6, 0b01000001, 10\n\n; Unsigned word character check (bits, negative polarity)\nCompareAndStore 7, 0b00010001, 11\n\n; Unsigned word character check (mask, negative polarity)\nCompareAndStore 8, 0b01010001, 12\n\n; Unsigned word character check (bits, negative masked)\nCompareAndStore 9, 0b00110001, 13\n\n; Unsigned word character check (mask, negative masked)\nCompareAndStore 10, 0b01110001, 14\n\n; Load all our stored flags for result comparing\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6463626144434241 ; \"ABCDabcd\"\ndq 0x6C6B6A694C4B4A49 ; \"IJKLijkl\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x4120492065726548 ; \"Here I A\"\ndq 0x6C4C612759202C6D ; \"m, Y'aLl\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpestrm_equal_each.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"RAX\":   [\"8\"],\n      \"RDX\":   [\"8\"],\n      \"XMM1\":  [\"0x2121010101012121\", \"0x0000000001010101\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\":  [\"0x306F8A9E672C65E5\", \"0x000030443057697D\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\":  [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\", \"0x8888888888888888\", \"0x9999999999999999\"],\n      \"XMM4\":  [\"0x000000000000F43F\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0x0000FFFFFFFFFFFF\", \"0xFFFFFFFF00FF0000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\":  [\"0x0000000000000BC0\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0xFFFF000000000000\", \"0x00000000FF00FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM8\":  [\"0x0000000000000BC0\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0xFFFF000000000000\", \"0x00000000FF00FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM10\": [\"0x00000000000000EF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM11\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFF0000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM12\": [\"0x0000000000000010\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM13\": [\"0x0000000000000000\", \"0x000000000000FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM14\": [\"0x0000000000000010\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM15\": [\"0x0000000000000000\", \"0x000000000000FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a specified vector in the third argument\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to pcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  vpcmpestrm xmm2, xmm3, %2\n  vmovaps xmm%3, xmm0\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Full length unsigned byte string check (bits, positive polarity)\nmov rax, 16\nmov rdx, 16\nCompareAndStore 0, 0b00001000, 4\n\n; Full length unsigned byte string check (mask, positive polarity)\nCompareAndStore 1, 0b01001000, 5\n\n; Full length unsigned byte string check (bits, negative polarity)\nCompareAndStore 2, 0b00011000, 6\n\n; Full length unsigned byte string check (mask, negative polarity)\nCompareAndStore 3, 0b01011000, 7\n\n; Full length unsigned byte string check (bits, negative masked)\nCompareAndStore 4, 0b00111000, 8\n\n; Full length unsigned byte string check (mask, negative masked)\nCompareAndStore 5, 0b01111000, 9\n\n; --- 16-bit unsigned word tests ---\n\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\n; Full length unsigned word string check (bits, positive polarity)\nmov rax, 8\nmov rdx, 8\nCompareAndStore 6, 0b00001001, 10\n\n; Full length unsigned word string check (mask, positive polarity)\nCompareAndStore 7, 0b01001001, 11\n\n; Full length unsigned word string check (bits, negative polarity)\nCompareAndStore 8, 0b00011001, 12\n\n; Full length unsigned word string check (mask, negative polarity)\nCompareAndStore 9, 0b01011001, 13\n\n; Full length unsigned word string check (bits, negative masked)\nCompareAndStore 10, 0b00111001, 14\n\n; Full length unsigned word string check (mask, negative masked)\nCompareAndStore 11, 0b01111001, 15\n\n; Load all our stored flags for result comparing\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6C6C6548 ; \"Hello Pe\"\ndq 0x21212121656C706F ; \"ople!!!!\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x21212121216C6C61 ; \"all!!!!!\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpestrm_equal_ordered.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"RAX\":   [\"2\"],\n      \"RDX\":   [\"16\"],\n      \"XMM1\":  [\"0x1111313131311111\", \"0x0000000031313131\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\":  [\"0x306F8A9E30443057\", \"0x000030443057697D\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\":  [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\", \"0x8888888888888888\", \"0x9999999999999999\"],\n      \"XMM4\":  [\"0x0000000000000204\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0x0000000000FF0000\", \"0x000000000000FF00\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\":  [\"0x000000000000FDFB\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0xFFFFFFFFFF00FFFF\", \"0xFFFFFFFFFFFF00FF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM8\":  [\"0x000000000000FDFB\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0xFFFFFFFFFF00FFFF\", \"0xFFFFFFFFFFFF00FF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM10\": [\"0x0000000000000020\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM11\": [\"0x0000000000000000\", \"0x00000000FFFF0000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM12\": [\"0x00000000000000DF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM13\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFF0000FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM14\": [\"0x00000000000000DF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM15\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFF0000FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a specified vector in the third argument\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to vpcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  vpcmpestrm xmm2, xmm3, %2\n  vmovaps xmm%3, xmm0\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Unsigned byte string check (bits, positive polarity)\nmov rax, 2\nmov rdx, 16\nCompareAndStore 0, 0b00001100, 4\n\n; Unsigned byte string check (mask, positive polarity)\nCompareAndStore 1, 0b01001100, 5\n\n; Unsigned byte string check (bits, negative polarity)\nCompareAndStore 2, 0b00011100, 6\n\n; Unsigned byte string check (mask, negative polarity)\nCompareAndStore 3, 0b01011100, 7\n\n; Unsigned byte string check (bits, negative masked)\nCompareAndStore 4, 0b00111100, 8\n\n; Unsigned byte string check (mask, negative masked)\nCompareAndStore 5, 0b01111100, 9\n\n; --- 16-bit unsigned word tests ---\n; Intentionally don't reset RDX to 8 here to test upper bounds clamping.\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\nCompareAndStore 6, 0b00001101, 10\n\n; Unsigned word string check (mask, positive polarity)\nCompareAndStore 7, 0b01001101, 11\n\n; Unsigned word string check (bits, negative polarity)\nCompareAndStore 8, 0b00011101, 12\n\n; Unsigned word string check (mask, negative polarity)\nCompareAndStore 9, 0b01011101, 13\n\n; Unsigned word string check (bits, negative masked)\nCompareAndStore 10, 0b00111101, 14\n\n; Unsigned word string check (mask, negative masked)\nCompareAndStore 11, 0b01111101, 15\n\n; Load all our stored flags for result comparing\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6FFF6C6C ; \"ll\" with junk following it\ndq 0x21212121656C706F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x21212121216C6C61 ; \"all!!!!!\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E30443057 ; \"しい\" followed by junk\ndq 0x000030443057697D\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpestrm_ranges.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"RAX\":   [\"4\"],\n      \"RDX\":   [\"16\"],\n      \"XMM1\":  [\"0x3111313131311111\", \"0x0000000000313131\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\":  [\"0x005A0041007A0061\", \"0x55AACCBBFF223344\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\":  [\"0x006500200027003F\", \"0x00210065004F0065\", \"0x8888888888888888\", \"0x9999999999999999\"],\n      \"XMM4\":  [\"0x0000000000003DEA\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0xFFFFFF00FF00FF00\", \"0x0000FFFFFFFF00FF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\":  [\"0x000000000000C215\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0x000000FF00FF00FF\", \"0xFFFF00000000FF00\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM8\":  [\"0x000000000000C215\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0x000000FF00FF00FF\", \"0xFFFF00000000FF00\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM10\": [\"0xFFFF000000000000\", \"0x0000FFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM11\": [\"0x0000000000000087\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM12\": [\"0x0000FFFFFFFFFFFF\", \"0xFFFF000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM13\": [\"0x0000000000000087\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM14\": [\"0x0000FFFFFFFFFFFF\", \"0xFFFF000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a specified vector in the third argument\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to pcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  vpcmpestrm xmm2, xmm3, %2\n  vmovaps xmm%3, xmm0\n\n  mov r15, rax\n  ArrangeAndStoreFLAGS %1\n  mov rax, r15\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Range unsigned byte check (bits, positive polarity)\nmov rax, 4\nmov rdx, 16\nCompareAndStore 0, 0b00000100, 4\n\n; Range unsigned byte check (mask, positive polarity)\nCompareAndStore 1, 0b01000100, 5\n\n; Range unsigned byte check (bits, negative polarity)\nCompareAndStore 2, 0b00010100, 6\n\n; Range unsigned byte check (mask, negative polarity)\nCompareAndStore 3, 0b01010100, 7\n\n; Range unsigned byte check (bits, negative masked)\nCompareAndStore 4, 0b00110100, 8\n\n; Range unsigned byte check (mask, negative masked)\nCompareAndStore 5, 0b01110100, 9\n\n; --- 16-bit unsigned word tests ---\n; Intentionally don't reset RDX to 8 here to test upper bounds clamping.\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\n; Range unsigned word check (mask, positive polarity)\nCompareAndStore 6, 0b01000101, 10\n\n; Range unsigned word check (bits, negative polarity)\nCompareAndStore 7, 0b00010101, 11\n\n; Range unsigned word check (mask, negative polarity)\nCompareAndStore 8, 0b01010101, 12\n\n; Range unsigned word check (bits, negative masked)\nCompareAndStore 9, 0b00110101, 13\n\n; Range unsigned word check (mask, negative masked)\nCompareAndStore 10, 0b01110101, 14\n\n; Load all our stored flags for result comparing\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x998877665A417A61 ; \"azAZ\" (followed by junk)\ndq 0x55AACCBBFF223344\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x726548206D27493F ; \"?I'm Her\"\ndq 0x21216E65704F2065 ; \"e Open!!\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\n.data16:\ndq 0x005A0041007A0061 ; \"azAZ\"\ndq 0x55AACCBBFF223344\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x006500200027003F ; \"?' e\"\ndq 0x00210065004F0065 ; \"eOen!\"\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpgtb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\n; Register only\nvpcmpgtb ymm2, ymm0, ymm1\nvpcmpgtb xmm3, xmm0, xmm1\n\n; Memory operand\nvpcmpgtb ymm4, ymm0, [rdx + 32 * 1]\nvpcmpgtb xmm5, xmm0, [rdx + 32 * 1]\n\nhlt\n\nalign 4096\n.data:\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\n\ndq 0x6162636465666768\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpgtd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\n; Register only\nvpcmpgtd ymm2, ymm0, ymm1\nvpcmpgtd xmm3, xmm0, xmm1\n\n; Memory operand\nvpcmpgtd ymm4, ymm0, [rdx + 32 * 1]\nvpcmpgtd xmm5, xmm0, [rdx + 32 * 1]\n\nhlt\n\nalign 4096\n.data:\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\n\ndq 0x6162636465666768\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpgtq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM2\":  [\"0x0000000000000001\", \"0x0000000000000001\", \"0x0000000000000001\", \"0x0000000000000001\"],\n    \"XMM3\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000001\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000001\"],\n    \"XMM4\":  [\"0x0000000000000001\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000001\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM5\":  [\"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM6\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM11\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nvmovaps ymm0, [rel .data0]\nvmovaps ymm1, [rel .data1]\nvmovaps ymm2, [rel .data2]\nvmovaps ymm3, [rel .data3]\nvmovaps ymm4, [rel .data4]\n\n; Register only\nvpcmpgtq ymm5, ymm0, [rel .data4]\nvpcmpgtq ymm6, ymm1, [rel .data3]\nvpcmpgtq ymm7, ymm2, [rel .data2]\nvpcmpgtq xmm8, xmm3, [rel .data1]\nvpcmpgtq xmm9, xmm4, [rel .data0]\n\n; Memory operand\nvpcmpgtq ymm10, ymm0, [rel .data1]\nvpcmpgtq ymm11, ymm1, [rel .data2]\nvpcmpgtq ymm12, ymm2, [rel .data3]\nvpcmpgtq xmm13, xmm3, [rel .data4]\nvpcmpgtq xmm14, xmm4, [rel .data0]\n\nhlt\n\nalign 4096\n.data0:\ndq 0\ndq 0\ndq 0\ndq 0\n\n.data1:\ndq -1\ndq -1\ndq -1\ndq -1\n\n.data2:\ndq 1\ndq 1\ndq 1\ndq 1\n\n.data3:\ndq -1\ndq 1\ndq -1\ndq 1\n\n.data4:\ndq 1\ndq -1\ndq 1\ndq -1\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpgtw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\n; Register only\nvpcmpgtw ymm2, ymm0, ymm1\nvpcmpgtw xmm3, xmm0, xmm1\n\n; Memory operand\nvpcmpgtw ymm4, ymm0, [rdx + 32 * 1]\nvpcmpgtw xmm5, xmm0, [rdx + 32 * 1]\n\nhlt\n\nalign 4096\n.data:\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\n\ndq 0x6162636465666768\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpistri_equal_any.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0x04060F000F000D07\", \"0x0000000000040407\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM1\": [\"0x1939313131311111\", \"0x0000000000191919\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x306F8A9E672C65E5\", \"0x000030443057697D\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\": [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\", \"0x8888888888888888\", \"0x9999999999999999\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to vpcmpistri\n;\n%macro CompareAndStore 2\n  vpcmpistri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Unsigned byte character check (lsb, positive polarity)\nCompareAndStore 0, 0b00000000\n\n; Unsigned byte character check (msb, positive polarity)\nCompareAndStore 1, 0b01000000\n\n; Unsigned byte character check (lsb, negative polarity)\nCompareAndStore 2, 0b00010000\n\n; Unsigned byte character check (msb, negative polarity)\nCompareAndStore 3, 0b01010000\n\n; Unsigned byte character check (lsb, negative masked)\nCompareAndStore 4, 0b00110000\n\n; Unsigned byte character check (msb, negative masked)\nCompareAndStore 5, 0b01110000\n\n; --- 16-bit unsigned word tests ---\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\n; Unsigned word character check (msb, positive polarity)\nCompareAndStore 6, 0b01000001\n\n; Unsigned word character check (lsb, negative polarity)\nCompareAndStore 7, 0b00010001\n\n; Unsigned word character check (msb, negative polarity)\nCompareAndStore 8, 0b01010001\n\n; Unsigned word character check (lsb, negative masked)\nCompareAndStore 9, 0b00110001\n\n; Unsigned word character check (msb, negative masked)\nCompareAndStore 10, 0b01110001\n\n; Load all our stored indices and flags for result comparing\nvmovaps ymm0, [rel .indices]\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6463626144434241 ; \"ABCDabcd\"\ndq 0x6C6B6A694C4B4A00 ; \"\\0JKLijkl\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x4120492065726548 ; \"Here I A\"\ndq 0x6C4C612759202C6D ; \"m, Y'aLl\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpistri_equal_each.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0x07000F060E060F00\", \"0x0000000007040404\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM1\": [\"0x3939191919193939\", \"0x0000000019191919\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x306F8A9E672C65E5\", \"0x000030443057697D\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\": [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\", \"0x8888888888888888\", \"0x9999999999999999\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to vpcmpistri\n;\n%macro CompareAndStore 2\n  vpcmpistri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Unsigned byte string check (lsb, positive polarity)\nCompareAndStore 0, 0b00001000\n\n; Unsigned byte string check (msb, positive polarity)\nCompareAndStore 1, 0b01001000\n\n; Unsigned byte string check (lsb, negative polarity)\nCompareAndStore 2, 0b00011000\n\n; Unsigned byte string check (msb, negative polarity)\nCompareAndStore 3, 0b01011000\n\n; Unsigned byte string check (lsb, negative masked)\nCompareAndStore 4, 0b00111000\n\n; Unsigned byte string check (msb, negative masked)\nCompareAndStore 5, 0b01111000\n\n; --- 16-bit unsigned word tests ---\n\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\n; Unsigned word string check (lsb, positive polarity)\nCompareAndStore 6, 0b00001001\n\n; Unsigned word string check (msb, positive polarity)\nCompareAndStore 7, 0b01001001\n\n; Unsigned word string check (lsb, negative polarity)\nCompareAndStore 8, 0b00011001\n\n; Unsigned word string check (msb, negative polarity)\nCompareAndStore 9, 0b01011001\n\n; Unsigned word string check (lsb, negative masked)\nCompareAndStore 10, 0b00111001\n\n; Unsigned word string check (msb, negative masked)\nCompareAndStore 11, 0b01111001\n\n; Load all our stored indices and flags for result comparing\nvmovaps ymm0, [rel .indices]\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6C6C6548 ; \"Hello Pe\"\ndq 0x00002121656C706F ; \"ople!!\\0\\0\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x00212121216C6C61 ; \"all!!!!\\0\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpistri_equal_ordered.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0x05050F000F000902\", \"0x0000000006000700\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM1\": [\"0x1919313131311111\", \"0x0000000039393939\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x306F000030443057\", \"0x000030443057697D\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\": [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\", \"0x8888888888888888\", \"0x9999999999999999\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to vpcmpistri\n;\n%macro CompareAndStore 2\n  vpcmpistri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Unsigned byte string check (lsb, positive polarity)\nCompareAndStore 0, 0b00001100\n\n; Unsigned byte string check (msb, positive polarity)\nCompareAndStore 1, 0b01001100\n\n; Unsigned byte string check (lsb, negative polarity)\nCompareAndStore 2, 0b00011100\n\n; Unsigned byte string check (msb, negative polarity)\nCompareAndStore 3, 0b01011100\n\n; Unsigned byte string check (lsb, negative masked)\nCompareAndStore 4, 0b00111100\n\n; Unsigned byte string check (msb, negative masked)\nCompareAndStore 5, 0b01111100\n\n; --- 16-bit unsigned word tests ---\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\nCompareAndStore 6, 0b00001101\n\n; Unsigned word string check (msb, positive polarity)\nCompareAndStore 7, 0b01001101\n\n; Unsigned word string check (lsb, negative polarity)\nCompareAndStore 8, 0b00011101\n\n; Unsigned word string check (msb, negative polarity)\nCompareAndStore 9, 0b01011101\n\n; Unsigned word string check (lsb, negative masked)\nCompareAndStore 10, 0b00111101\n\n; Unsigned word string check (msb, negative masked)\nCompareAndStore 11, 0b01111101\n\n; Load all our stored indices and flags for result comparing\nvmovaps ymm0, [rel .indices]\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6F006C6C ; \"ll\" with junk following it\ndq 0x21212121656C706F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x21212121216C6C61 ; \"all!!!!!\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F000030443057 ; \"しい\" followed by junk\ndq 0x000030443057697D\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpistri_ranges.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0x00060F000F000D01\", \"0x0000000000070007\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM1\": [\"0x3111313131311111\", \"0x0000000000313131\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x005A0041007A0061\", \"0x55AACCBBFF220000\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\": [\"0x006500200027003F\", \"0x00210065004F0065\", \"0x8888888888888888\", \"0x9999999999999999\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from RCX to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the byte offset to store the RCX result to.\n; The second parameter is the control values to pass to vpcmpistri\n;\n%macro CompareAndStore 2\n  vpcmpistri xmm2, xmm3, %2\n  mov [rel .indices + %1], cl\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Range unsigned byte check (lsb, positive polarity)\nCompareAndStore 0, 0b00000100\n\n; Range unsigned byte check (msb, positive polarity)\nCompareAndStore 1, 0b01000100\n\n; Range unsigned byte check (lsb, negative polarity)\nCompareAndStore 2, 0b00010100\n\n; Range unsigned byte check (msb, negative polarity)\nCompareAndStore 3, 0b01010100\n\n; Range unsigned byte check (lsb, negative masked)\nCompareAndStore 4, 0b00110100\n\n; Range unsigned byte check (msb, negative masked)\nCompareAndStore 5, 0b01110100\n\n; --- 16-bit unsigned word tests ---\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\n; Range unsigned word check (msb, positive polarity)\nCompareAndStore 6, 0b01000101\n\n; Range unsigned word check (lsb, negative polarity)\nCompareAndStore 7, 0b00010101\n\n; Range unsigned word check (msb, negative polarity)\nCompareAndStore 8, 0b01010101\n\n; Range unsigned word check (lsb, negative masked)\nCompareAndStore 9, 0b00110101\n\n; Range unsigned word check (msb, negative masked)\nCompareAndStore 10, 0b01110101\n\n; Load all our stored indices and flags for result comparing\nvmovaps ymm0, [rel .indices]\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x998877005A417A61 ; \"azAZ\" (followed by junk)\ndq 0x55AACCBBFF223344\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x726548206D27493F ; \"?I'm Her\"\ndq 0x21216E65704F2065 ; \"e Open!!\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\n.data16:\ndq 0x005A0041007A0061 ; \"azAZ\"\ndq 0x55AACCBBFF220000\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x006500200027003F ; \"?' e\"\ndq 0x00210065004F0065 ; \"eOen!\"\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.indices:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpistrm_equal_any.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\":  [\"0x1939313131311111\", \"0x0000000000191919\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\":  [\"0x306F8A9E672C65E5\", \"0x000030443057697D\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\":  [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\", \"0x8888888888888888\", \"0x9999999999999999\"],\n      \"XMM4\":  [\"0x0000000000002080\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0xFF00000000000000\", \"0x0000FF0000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\":  [\"0x000000000000DF7F\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0x00FFFFFFFFFFFFFF\", \"0xFFFF00FFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM8\":  [\"0x000000000000DF7F\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0x00FFFFFFFFFFFFFF\", \"0xFFFF00FFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM10\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000FFFFFFFF0000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM11\": [\"0x0000000000000090\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM12\": [\"0x0000000000000000\", \"0xFFFF00000000FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM13\": [\"0x0000000000000010\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM14\": [\"0x0000000000000000\", \"0x000000000000FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to vpcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  vpcmpistrm xmm2, xmm3, %2\n  vmovaps xmm%3, xmm0\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Unsigned byte character check (bits, positive polarity)\nCompareAndStore 0, 0b00000000, 4\n\n; Unsigned byte character check (mask, positive polarity)\nCompareAndStore 1, 0b01000000, 5\n\n; Unsigned byte character check (bits, negative polarity)\nCompareAndStore 2, 0b00010000, 6\n\n; Unsigned byte character check (mask, negative polarity)\nCompareAndStore 3, 0b01010000, 7\n\n; Unsigned byte character check (bits, negative masked)\nCompareAndStore 4, 0b00110000, 8\n\n; Unsigned byte character check (mask, negative masked)\nCompareAndStore 5, 0b01110000, 9\n\n; --- 16-bit unsigned word tests ---\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\n; Unsigned word character check (mask, positive polarity)\nCompareAndStore 6, 0b01000001, 10\n\n; Unsigned word character check (bits, negative polarity)\nCompareAndStore 7, 0b00010001, 11\n\n; Unsigned word character check (mask, negative polarity)\nCompareAndStore 8, 0b01010001, 12\n\n; Unsigned word character check (bits, negative masked)\nCompareAndStore 9, 0b00110001, 13\n\n; Unsigned word character check (mask, negative masked)\nCompareAndStore 10, 0b01110001, 14\n\n; Load all our stored flags for result comparing\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6463626144434241 ; \"ABCDabcd\"\ndq 0x6C6B6A694C4B4A00 ; \"\\0JKLijkl\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x4120492065726548 ; \"Here I A\"\ndq 0x6C4C612759202C6D ; \"m, Y'aLl\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpistrm_equal_each.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\":  [\"0x3939191919193939\", \"0x0000000019191919\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\":  [\"0x306F8A9E672C65E5\", \"0x000030443057697D\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\":  [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\", \"0x8888888888888888\", \"0x9999999999999999\"],\n      \"XMM4\":  [\"0x000000000000B43F\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0x0000FFFFFFFFFFFF\", \"0xFF00FFFF00FF0000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\":  [\"0x0000000000004BC0\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0xFFFF000000000000\", \"0x00FF0000FF00FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM8\":  [\"0x000000000000CBC0\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0xFFFF000000000000\", \"0xFFFF0000FF00FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM10\": [\"0x00000000000000EF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM11\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFF0000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM12\": [\"0x0000000000000010\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM13\": [\"0x0000000000000000\", \"0x000000000000FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM14\": [\"0x0000000000000090\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM15\": [\"0x0000000000000000\", \"0xFFFF00000000FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to vpcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  vpcmpistrm xmm2, xmm3, %2\n  vmovaps xmm%3, xmm0\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Unsigned byte string check (bits, positive polarity)\nCompareAndStore 0, 0b00001000, 4\n\n; Unsigned byte string check (mask, positive polarity)\nCompareAndStore 1, 0b01001000, 5\n\n; Unsigned byte string check (bits, negative polarity)\nCompareAndStore 2, 0b00011000, 6\n\n; Unsigned byte string check (mask, negative polarity)\nCompareAndStore 3, 0b01011000, 7\n\n; Unsigned byte string check (bits, negative masked)\nCompareAndStore 4, 0b00111000, 8\n\n; Unsigned byte string check (mask, negative masked)\nCompareAndStore 5, 0b01111000, 9\n\n; --- 16-bit unsigned word tests ---\n\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\n; Unsigned word string check (bits, positive polarity)\nCompareAndStore 6, 0b00001001, 10\n\n; Unsigned word string check (mask, positive polarity)\nCompareAndStore 7, 0b01001001, 11\n\n; Unsigned word string check (bits, negative polarity)\nCompareAndStore 8, 0b00011001, 12\n\n; Unsigned word string check (mask, negative polarity)\nCompareAndStore 9, 0b01011001, 13\n\n; Unsigned word string check (bits, negative masked)\nCompareAndStore 10, 0b00111001, 14\n\n; Unsigned word string check (mask, negative masked)\nCompareAndStore 11, 0b01111001, 15\n\n; Load all our stored flags for result comparing\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6C6C6548 ; \"Hello Pe\"\ndq 0x00002121656C706F ; \"ople!!\\0\\0\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x00212121216C6C61 ; \"all!!!!\\0\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x000030443057697D ; \"楽しい\\0\" (Japanese is fun)\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpistrm_equal_ordered.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\":  [\"0x1919313131311111\", \"0x0000000039393939\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\":  [\"0x306F000030443057\", \"0x000030443057697D\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\":  [\"0x306F8A9E672C65E5\", \"0x00003044305796E3\", \"0x8888888888888888\", \"0x9999999999999999\"],\n      \"XMM4\":  [\"0x0000000000000204\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0x0000000000FF0000\", \"0x000000000000FF00\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\":  [\"0x000000000000FDFB\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0xFFFFFFFFFF00FFFF\", \"0xFFFFFFFFFFFF00FF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM8\":  [\"0x000000000000FDFB\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0xFFFFFFFFFF00FFFF\", \"0xFFFFFFFFFFFF00FF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM10\": [\"0x0000000000000020\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM11\": [\"0x0000000000000000\", \"0x00000000FFFF0000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM12\": [\"0x00000000000000DF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM13\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFF0000FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM14\": [\"0x000000000000005F\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM15\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000FFFF0000FFFF\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to vpcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  vpcmpistrm xmm2, xmm3, %2\n  vmovaps xmm%3, xmm0\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Unsigned byte string check (bits, positive polarity)\nCompareAndStore 0, 0b00001100, 4\n\n; Unsigned byte string check (mask, positive polarity)\nCompareAndStore 1, 0b01001100, 5\n\n; Unsigned byte string check (bits, negative polarity)\nCompareAndStore 2, 0b00011100, 6\n\n; Unsigned byte string check (mask, negative polarity)\nCompareAndStore 3, 0b01011100, 7\n\n; Unsigned byte string check (bits, negative masked)\nCompareAndStore 4, 0b00111100, 8\n\n; Unsigned byte string check (mask, negative masked)\nCompareAndStore 5, 0b01111100, 9\n\n; --- 16-bit unsigned word tests ---\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\nCompareAndStore 6, 0b00001101, 10\n\n; Unsigned word string check (mask, positive polarity)\nCompareAndStore 7, 0b01001101, 11\n\n; Unsigned word string check (bits, negative polarity)\nCompareAndStore 8, 0b00011101, 12\n\n; Unsigned word string check (mask, negative polarity)\nCompareAndStore 9, 0b01011101, 13\n\n; Unsigned word string check (bits, negative masked)\nCompareAndStore 10, 0b00111101, 14\n\n; Unsigned word string check (mask, negative masked)\nCompareAndStore 11, 0b01111101, 15\n\n; Load all our stored flags for result comparing\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x6550206F6F006C6C ; \"ll\" with junk following it\ndq 0x21212121656C706F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x2759206F6C6C6548 ; \"Hello Y'\"\ndq 0x21212121216C6C61 ; \"all!!!!!\"\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\n\n.data16:\ndq 0x306F000030443057 ; \"しい\" followed by junk\ndq 0x000030443057697D\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x306F8A9E672C65E5 ; \"日本語は\"\ndq 0x00003044305796E3 ; \"難しい\\0\" (Japanese is hard)\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpcmpistrm_ranges.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM1\":  [\"0x3111313131311111\", \"0x0000000000313131\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\":  [\"0x005A0041007A0061\", \"0x55AACCBBFF220000\", \"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\"],\n      \"XMM3\":  [\"0x006500200027003F\", \"0x00210065004F0065\", \"0x8888888888888888\", \"0x9999999999999999\"],\n      \"XMM4\":  [\"0x0000000000003DEA\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\":  [\"0xFFFFFF00FF00FF00\", \"0x0000FFFFFFFF00FF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\":  [\"0x000000000000C215\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM7\":  [\"0x000000FF00FF00FF\", \"0xFFFF00000000FF00\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM8\":  [\"0x000000000000C215\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM9\":  [\"0x000000FF00FF00FF\", \"0xFFFF00000000FF00\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM10\": [\"0xFFFF000000000000\", \"0x0000FFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM11\": [\"0x0000000000000087\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM12\": [\"0x0000FFFFFFFFFFFF\", \"0xFFFF000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM13\": [\"0x0000000000000087\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM14\": [\"0x0000FFFFFFFFFFFF\", \"0xFFFF000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\n; Adjusts the result from LAHF and SETO so that we have a set of flags organized\n; like [OF, SF, ZF, AF, PF, CF] for storing into the .flags region\n; of memory.\n;\n; The first parameter is the byte offset to store the flag result\n; at in the .flags region of memory.\n;\n%macro ArrangeAndStoreFLAGS 1\n  lahf\n  seto bl\n  movzx bx, bl\n\n  shr ax, 8\n  shl bx, 5\n\n  mov di, ax\n  mov si, ax\n\n  ; Mask and shift\n  and di, 0b0000_0000_0000_0100 ; PF\n  and si, 0b0000_0000_0001_0000 ; AF\n  shr di, 1\n  shr si, 2\n\n  ; OR all of them together\n  or bx, di\n  or bx, si\n\n  ; Reclaim DI for getting ZF/SF and shift into place\n  mov di, ax\n  and di, 0b0000_0000_1100_0000 ; ZF and SF\n  shr di, 3\n\n  ; Finally mask and OR all of the bits together\n  and ax, 0b0000_0000_0000_0001 ; CF\n  or bx, ax\n  or bx, di\n\n  ; Store result to .flags memory\n  mov [rel .flags + %1], bl\n%endmacro\n\n; Performs the string comparison and moves the result from XMM0 to\n; a region of memory in the .indices section specified by a byte\n; offset.\n;\n; The first parameter is the location in memory result flags into.\n; The second parameter is the control values to pass to vpcmpistrm\n; The third parameter is the XMM number to store the result in XMM0 to.\n;\n%macro CompareAndStore 3\n  vpcmpistrm xmm2, xmm3, %2\n  vmovaps xmm%3, xmm0\n  ArrangeAndStoreFLAGS %1\n%endmacro\n\nvmovaps ymm2, [rel .data]\nvmovaps ymm3, [rel .data + 32]\n\n; Range unsigned byte check (bits, positive polarity)\nCompareAndStore 0, 0b00000100, 4\n\n; Range unsigned byte check (mask, positive polarity)\nCompareAndStore 1, 0b01000100, 5\n\n; Range unsigned byte check (bits, negative polarity)\nCompareAndStore 2, 0b00010100, 6\n\n; Range unsigned byte check (mask, negative polarity)\nCompareAndStore 3, 0b01010100, 7\n\n; Range unsigned byte check (bits, negative masked)\nCompareAndStore 4, 0b00110100, 8\n\n; Range unsigned byte check (mask, negative masked)\nCompareAndStore 5, 0b01110100, 9\n\n; --- 16-bit unsigned word tests ---\nvmovaps ymm2, [rel .data16]\nvmovaps ymm3, [rel .data16 + 32]\n\n; Range unsigned word check (mask, positive polarity)\nCompareAndStore 6, 0b01000101, 10\n\n; Range unsigned word check (bits, negative polarity)\nCompareAndStore 7, 0b00010101, 11\n\n; Range unsigned word check (mask, negative polarity)\nCompareAndStore 8, 0b01010101, 12\n\n; Range unsigned word check (bits, negative masked)\nCompareAndStore 9, 0b00110101, 13\n\n; Range unsigned word check (mask, negative masked)\nCompareAndStore 10, 0b01110101, 14\n\n; Load all our stored flags for result comparing\nvmovaps ymm1, [rel .flags]\n\nhlt\n\nalign 4096\n.data:\ndq 0x998877005A417A61 ; \"azAZ\" (followed by junk)\ndq 0x55AACCBBFF223344\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x726548206D27493F ; \"?I'm Her\"\ndq 0x21216E65704F2065 ; \"e Open!!\"\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\n.data16:\ndq 0x005A0041007A0061 ; \"azAZ\"\ndq 0x55AACCBBFF220000\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\n\ndq 0x006500200027003F ; \"?' e\"\ndq 0x00210065004F0065 ; \"eOen!\"\ndq 0x8888888888888888\ndq 0x9999999999999999\n\n.flags:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vperm2f128.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM1\": [\"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\", \"0xCCCCCCCCCCCCCCCC\", \"0x9999999999999999\"],\n    \"XMM2\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\"],\n    \"XMM3\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\"],\n    \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\", \"0xCCCCCCCCCCCCCCCC\", \"0x9999999999999999\"],\n    \"XMM5\": [\"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\", \"0xCCCCCCCCCCCCCCCC\", \"0x9999999999999999\"],\n    \"XMM6\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Permute first 128-bit element from each vector\nvperm2f128 ymm2, ymm0, ymm1, 0b00100000\nvperm2f128 ymm3, ymm0, [rdx + 32], 0b00100000\n\n; Permute top halves of both vectors\nvperm2f128 ymm4, ymm0, ymm1, 0b00110001\nvperm2f128 ymm5, ymm0, [rdx + 32], 0b00110001\n\n; Zero out entire vector\nvmovapd ymm6, ymm0;\nvperm2f128 ymm6, ymm0, ymm1, 0b10001000\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000\ndq 0xEEEEEEEEEEEEEEEE\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xAAAAAAAAAAAAAAAA\n\ndq 0xBBBBBBBBBBBBBBBB\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\ndq 0x9999999999999999\n"
  },
  {
    "path": "unittests/ASM/VEX/vperm2i128.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM1\": [\"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\", \"0xCCCCCCCCCCCCCCCC\", \"0x9999999999999999\"],\n    \"XMM2\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\"],\n    \"XMM3\": [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\"],\n    \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\", \"0xCCCCCCCCCCCCCCCC\", \"0x9999999999999999\"],\n    \"XMM5\": [\"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\", \"0xCCCCCCCCCCCCCCCC\", \"0x9999999999999999\"],\n    \"XMM6\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Permute first 128-bit element from each vector\nvperm2i128 ymm2, ymm0, ymm1, 0b00100000\nvperm2i128 ymm3, ymm0, [rdx + 32], 0b00100000\n\n; Permute top halves of both vectors\nvperm2i128 ymm4, ymm0, ymm1, 0b00110001\nvperm2i128 ymm5, ymm0, [rdx + 32], 0b00110001\n\n; Zero out entire vector\nvmovapd ymm6, ymm0;\nvperm2i128 ymm6, ymm0, ymm1, 0b10001000\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000\ndq 0xEEEEEEEEEEEEEEEE\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xAAAAAAAAAAAAAAAA\n\ndq 0xBBBBBBBBBBBBBBBB\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xCCCCCCCCCCCCCCCC\ndq 0x9999999999999999\n"
  },
  {
    "path": "unittests/ASM/VEX/vpermd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000600000007\", \"0x0000000400000005\", \"0x0000000200000003\", \"0x0000000000000001\"],\n    \"XMM1\": [\"0x0000000500000005\", \"0x0000000500000005\", \"0x0000000500000005\", \"0x0000000500000005\"],\n    \"XMM2\": [\"0xFFFFFFF0FFFFFFF1\", \"0xFFFFFFF2FFFFFFF3\", \"0xFFFFFFF4FFFFFFF5\", \"0xFFFFFFF6FFFFFFF7\"],\n    \"XMM3\": [\"0x8888888899999999\", \"0xAAAAAAAABBBBBBBB\", \"0xCCCCCCCCDDDDDDDD\", \"0xEEEEEEEEFFFFFFFF\"],\n    \"XMM4\": [\"0xBBBBBBBBBBBBBBBB\", \"0xBBBBBBBBBBBBBBBB\", \"0xBBBBBBBBBBBBBBBB\", \"0xBBBBBBBBBBBBBBBB\"],\n    \"XMM5\": [\"0xEEEEEEEEFFFFFFFF\", \"0xCCCCCCCCDDDDDDDD\", \"0xAAAAAAAABBBBBBBB\", \"0x8888888899999999\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rel .invert]\nvmovapd ymm1, [rel .select_elem_5]\nvmovapd ymm2, [rel .reverse_quadwords]\n\nvpermd ymm3, ymm0, [rel .data]\nvpermd ymm4, ymm1, [rel .data]\nvpermd ymm5, ymm2, [rel .data]\n\nhlt\n\nalign 32\n.data:\ndq 0xFFFFFFFFEEEEEEEE\ndq 0xDDDDDDDDCCCCCCCC\ndq 0xBBBBBBBBAAAAAAAA\ndq 0x9999999988888888\n\n.invert:\ndq 0x0000000600000007\ndq 0x0000000400000005\ndq 0x0000000200000003\ndq 0x0000000000000001\n\n.select_elem_5:\ndq 0x0000000500000005\ndq 0x0000000500000005\ndq 0x0000000500000005\ndq 0x0000000500000005\n\n; Upper bits filled with junk. Should have no impact on operation\n.reverse_quadwords:\ndq 0xFFFFFFF0FFFFFFF1\ndq 0xFFFFFFF2FFFFFFF3\ndq 0xFFFFFFF4FFFFFFF5\ndq 0xFFFFFFF6FFFFFFF7\n"
  },
  {
    "path": "unittests/ASM/VEX/vpermilpd_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\": [\"0xAAAAAAAAAAAAAAAA\", \"0xAAAAAAAAAAAAAAAA\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0xBBBBBBBBBBBBBBBB\", \"0xBBBBBBBBBBBBBBBB\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xBBBBBBBBBBBBBBBB\", \"0xAAAAAAAAAAAAAAAA\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0xAAAAAAAAAAAAAAAA\", \"0xAAAAAAAAAAAAAAAA\", \"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\"],\n    \"XMM6\": [\"0xBBBBBBBBBBBBBBBB\", \"0xBBBBBBBBBBBBBBBB\", \"0xDDDDDDDDDDDDDDDD\", \"0xDDDDDDDDDDDDDDDD\"],\n    \"XMM7\": [\"0xAAAAAAAAAAAAAAAA\", \"0xBBBBBBBBBBBBBBBB\", \"0xCCCCCCCCCCCCCCCC\", \"0xDDDDDDDDDDDDDDDD\"]\n\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\n\nvpermilpd xmm1, xmm0, 0000b\nvpermilpd xmm2, xmm0, 0011b\nvpermilpd xmm3, xmm0, 0010b\nvpermilpd xmm4, xmm0, 0001b\n\nvpermilpd ymm5, ymm0, 0000b\nvpermilpd ymm6, ymm0, 1111b\nvpermilpd ymm7, ymm0, 1010b\n\nhlt\n\nalign 32\n.data:\ndq 0xAAAAAAAAAAAAAAAA\ndq 0xBBBBBBBBBBBBBBBB\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xDDDDDDDDDDDDDDDD\n"
  },
  {
    "path": "unittests/ASM/VEX/vpermilpd_reg.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xFFFFFFFFFFFFFFFF\", \"0xCCCCCCCCCCCCCCCC\", \"0xAAAAAAAAAAAAAAAA\", \"0x9999999999999999\"],\n    \"XMM1\": [\"0xCCCCCCCCCCCCCCCC\", \"0xFFFFFFFFFFFFFFFF\", \"0x9999999999999999\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM2\": [\"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0x9999999999999999\", \"0x9999999999999999\"],\n    \"XMM3\": [\"0xCCCCCCCCCCCCCCCC\", \"0xFFFFFFFFFFFFFFFF\", \"0x9999999999999999\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM4\": [\"0xCCCCCCCCCCCCCCCC\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0xCCCCCCCCCCCCCCCC\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\nvpermilpd ymm1, ymm0, [rel .invert]\nvpermilpd ymm2, ymm0, [rel .select_elem_1]\nvpermilpd ymm3, ymm0, [rel .reverse_quadwords]\n\nvpermilpd xmm4, xmm0, [rel .invert]\nvpermilpd xmm5, xmm0, [rel .select_elem_1]\nvpermilpd xmm6, xmm0, [rel .reverse_quadwords]\n\nhlt\n\nalign 32\n.data:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xCCCCCCCCCCCCCCCC\ndq 0xAAAAAAAAAAAAAAAA\ndq 0x9999999999999999\n\n.invert:\ndq 0x0000000000000002\ndq 0x0000000000000000\ndq 0x0000000000000002\ndq 0x0000000000000000\n\n.select_elem_1:\ndq 0x0000000000000002\ndq 0x0000000000000002\ndq 0x0000000000000002\ndq 0x0000000000000002\n\n; Upper bits filled with junk. Should have no impact on operation\n.reverse_quadwords:\ndq 0xFFFFFFFFFFFFFFF2\ndq 0xFFFFFFFFFFFFFFF0\ndq 0xFFFFFFFFFFFFFFF2\ndq 0xFFFFFFFFFFFFFFF0\n"
  },
  {
    "path": "unittests/ASM/VEX/vpermilps_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\": [\"0xBBBBBBBBBBBBBBBB\", \"0xBBBBBBBBBBBBBBBB\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0xDDDDDDDDDDDDDDDD\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xBBBBBBBBBBBBBBBB\", \"0xBBBBBBBBBBBBBBBB\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM5\": [\"0xCCCCCCCCCCCCCCCC\", \"0xCCCCCCCCCCCCCCCC\", \"0x9999999999999999\", \"0x9999999999999999\"],\n    \"XMM6\": [\"0xDDDDDDDDDDDDDDDD\", \"0xDDDDDDDDDDDDDDDD\", \"0x8888888888888888\", \"0x8888888888888888\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\n\nvpermilps xmm1, xmm0, 00000000b\nvpermilps xmm2, xmm0, 11111111b\nvpermilps xmm3, xmm0, 10101010b\n\nvpermilps ymm4, ymm0, 00000000b\nvpermilps ymm5, ymm0, 11111111b\nvpermilps ymm6, ymm0, 10101010b\n\nhlt\n\nalign 32\n.data:\ndq 0xAAAAAAAABBBBBBBB\ndq 0xCCCCCCCCDDDDDDDD\ndq 0xEEEEEEEEFFFFFFFF\ndq 0x9999999988888888\n"
  },
  {
    "path": "unittests/ASM/VEX/vpermilps_reg.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xFFFFFFFFEEEEEEEE\", \"0xDDDDDDDDCCCCCCCC\", \"0xBBBBBBBBAAAAAAAA\", \"0x9999999988888888\"],\n    \"XMM1\": [\"0xCCCCCCCCDDDDDDDD\", \"0xEEEEEEEEFFFFFFFF\", \"0x8888888899999999\", \"0xAAAAAAAABBBBBBBB\"],\n    \"XMM2\": [\"0xDDDDDDDDDDDDDDDD\", \"0xDDDDDDDDDDDDDDDD\", \"0x9999999999999999\", \"0x9999999999999999\"],\n    \"XMM3\": [\"0xEEEEEEEEFFFFFFFF\", \"0xCCCCCCCCDDDDDDDD\", \"0xAAAAAAAABBBBBBBB\", \"0x8888888899999999\"],\n    \"XMM4\": [\"0xCCCCCCCCDDDDDDDD\", \"0xEEEEEEEEFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0xDDDDDDDDDDDDDDDD\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0xEEEEEEEEFFFFFFFF\", \"0xCCCCCCCCDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\nvpermilps ymm1, ymm0, [rel .invert]\nvpermilps ymm2, ymm0, [rel .select_elem_3]\nvpermilps ymm3, ymm0, [rel .reverse_quadwords]\n\nvpermilps xmm4, xmm0, [rel .invert]\nvpermilps xmm5, xmm0, [rel .select_elem_3]\nvpermilps xmm6, xmm0, [rel .reverse_quadwords]\n\nhlt\n\nalign 32\n.data:\ndq 0xFFFFFFFFEEEEEEEE\ndq 0xDDDDDDDDCCCCCCCC\ndq 0xBBBBBBBBAAAAAAAA\ndq 0x9999999988888888\n\n.invert:\ndq 0x0000000200000003\ndq 0x0000000000000001\ndq 0x0000000200000003\ndq 0x0000000000000001\n\n.select_elem_3:\ndq 0x0000000300000003\ndq 0x0000000300000003\ndq 0x0000000300000003\ndq 0x0000000300000003\n\n; Upper bits filled with junk. Should have no impact on operation\n.reverse_quadwords:\ndq 0xFFFFFFF0FFFFFFF1\ndq 0xFFFFFFF2FFFFFFF3\ndq 0xFFFFFFF0FFFFFFF1\ndq 0xFFFFFFF2FFFFFFF3\n"
  },
  {
    "path": "unittests/ASM/VEX/vpermpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM1\":  [\"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\"],\n    \"XMM2\":  [\"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\"],\n    \"XMM3\":  [\"0xAAAAAAAAAAAAAAAA\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\", \"0x3FF0000000000000\"],\n    \"XMM4\":  [\"0xAAAAAAAAAAAAAAAA\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\", \"0x3FF0000000000000\"],\n    \"XMM5\":  [\"0xAAAAAAAAAAAAAAAA\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\", \"0x3FF0000000000000\"],\n    \"XMM6\":  [\"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\"],\n    \"XMM7\":  [\"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\"],\n    \"XMM8\":  [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM9\":  [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM10\": [\"0xAAAAAAAAAAAAAAAA\", \"0xAAAAAAAAAAAAAAAA\", \"0xAAAAAAAAAAAAAAAA\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM11\": [\"0xAAAAAAAAAAAAAAAA\", \"0xAAAAAAAAAAAAAAAA\", \"0xAAAAAAAAAAAAAAAA\", \"0xAAAAAAAAAAAAAAAA\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\n; Permute first element across\nvpermpd ymm1, ymm0, 0b00000000\nvpermpd ymm2, [rdx], 0b00000000\n\n; Invert vector\nvpermpd ymm3, ymm0, 0b00011011\nvpermpd ymm4, [rdx], 0b00011011\n\n; Invert self\nvmovapd ymm5, ymm0\nvpermpd ymm5, ymm5, 0b00011011\n\n; Permute second element\nvpermq ymm6, ymm0, 0b01010101\nvpermq ymm7, [rdx], 0b01010101\n\n; Permute third element\nvpermq ymm8, ymm0, 0b10101010\nvpermq ymm9, [rdx], 0b10101010\n\n; Permute fourth element\nvpermq ymm10, ymm0, 0b11111111\nvpermq ymm11, [rdx], 0b11111111\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000\ndq 0xEEEEEEEEEEEEEEEE\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xAAAAAAAAAAAAAAAA\n"
  },
  {
    "path": "unittests/ASM/VEX/vpermps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000600000007\", \"0x0000000400000005\", \"0x0000000200000003\", \"0x0000000000000001\"],\n    \"XMM1\": [\"0x0000000500000005\", \"0x0000000500000005\", \"0x0000000500000005\", \"0x0000000500000005\"],\n    \"XMM2\": [\"0xFFFFFFF0FFFFFFF1\", \"0xFFFFFFF2FFFFFFF3\", \"0xFFFFFFF4FFFFFFF5\", \"0xFFFFFFF6FFFFFFF7\"],\n    \"XMM3\": [\"0x8888888899999999\", \"0xAAAAAAAABBBBBBBB\", \"0xCCCCCCCCDDDDDDDD\", \"0xEEEEEEEEFFFFFFFF\"],\n    \"XMM4\": [\"0xBBBBBBBBBBBBBBBB\", \"0xBBBBBBBBBBBBBBBB\", \"0xBBBBBBBBBBBBBBBB\", \"0xBBBBBBBBBBBBBBBB\"],\n    \"XMM5\": [\"0xEEEEEEEEFFFFFFFF\", \"0xCCCCCCCCDDDDDDDD\", \"0xAAAAAAAABBBBBBBB\", \"0x8888888899999999\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rel .invert]\nvmovapd ymm1, [rel .select_elem_5]\nvmovapd ymm2, [rel .reverse_quadwords]\n\nvpermps ymm3, ymm0, [rel .data]\nvpermps ymm4, ymm1, [rel .data]\nvpermps ymm5, ymm2, [rel .data]\n\nhlt\n\nalign 32\n.data:\ndq 0xFFFFFFFFEEEEEEEE\ndq 0xDDDDDDDDCCCCCCCC\ndq 0xBBBBBBBBAAAAAAAA\ndq 0x9999999988888888\n\n.invert:\ndq 0x0000000600000007\ndq 0x0000000400000005\ndq 0x0000000200000003\ndq 0x0000000000000001\n\n.select_elem_5:\ndq 0x0000000500000005\ndq 0x0000000500000005\ndq 0x0000000500000005\ndq 0x0000000500000005\n\n; Upper bits filled with junk. Should have no impact on operation\n.reverse_quadwords:\ndq 0xFFFFFFF0FFFFFFF1\ndq 0xFFFFFFF2FFFFFFF3\ndq 0xFFFFFFF4FFFFFFF5\ndq 0xFFFFFFF6FFFFFFF7\n"
  },
  {
    "path": "unittests/ASM/VEX/vpermq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x3FF0000000000000\", \"0xEEEEEEEEEEEEEEEE\", \"0xFFFFFFFFFFFFFFFF\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM1\":  [\"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\"],\n    \"XMM2\":  [\"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\"],\n    \"XMM3\":  [\"0xAAAAAAAAAAAAAAAA\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\", \"0x3FF0000000000000\"],\n    \"XMM4\":  [\"0xAAAAAAAAAAAAAAAA\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\", \"0x3FF0000000000000\"],\n    \"XMM5\":  [\"0xAAAAAAAAAAAAAAAA\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\", \"0x3FF0000000000000\"],\n    \"XMM6\":  [\"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\"],\n    \"XMM7\":  [\"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\", \"0xEEEEEEEEEEEEEEEE\"],\n    \"XMM8\":  [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM9\":  [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM10\": [\"0xAAAAAAAAAAAAAAAA\", \"0xAAAAAAAAAAAAAAAA\", \"0xAAAAAAAAAAAAAAAA\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM11\": [\"0xAAAAAAAAAAAAAAAA\", \"0xAAAAAAAAAAAAAAAA\", \"0xAAAAAAAAAAAAAAAA\", \"0xAAAAAAAAAAAAAAAA\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\n; Permute first element across\nvpermq ymm1, ymm0, 0b00000000\nvpermq ymm2, [rdx], 0b00000000\n\n; Invert vector\nvpermq ymm3, ymm0, 0b00011011\nvpermq ymm4, [rdx], 0b00011011\n\n; Invert self\nvmovapd ymm5, ymm0\nvpermq ymm5, ymm5, 0b00011011\n\n; Permute second element\nvpermq ymm6, ymm0, 0b01010101\nvpermq ymm7, [rdx], 0b01010101\n\n; Permute third element\nvpermq ymm8, ymm0, 0b10101010\nvpermq ymm9, [rdx], 0b10101010\n\n; Permute fourth element\nvpermq ymm10, ymm0, 0b11111111\nvpermq ymm11, [rdx], 0b11111111\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000\ndq 0xEEEEEEEEEEEEEEEE\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xAAAAAAAAAAAAAAAA\n"
  },
  {
    "path": "unittests/ASM/VEX/vpextrb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x000000000000007F\",\n    \"RBX\": \"0x0000000000000067\",\n    \"RCX\": \"0x0000888658818AE8\"\n  }\n}\n%endif\n\nlea rdx, [rel .data]\nmov rsi, 0xe0000000\n\nvmovaps xmm1, [rdx + 16 * 0]\nvmovaps xmm2, [rdx + 16 * 1]\nvmovaps xmm3, [rdx + 16 * 2]\nvmovaps xmm4, [rdx + 16 * 3]\nvmovaps xmm5, [rdx + 16 * 4]\nvmovaps xmm6, [rdx + 16 * 5]\nvmovaps xmm7, [rdx + 16 * 6]\nvmovaps xmm8, [rdx + 16 * 7]\n\nmov rax, 0\nmov [rsi + 8 * 0], rax\n\nvpextrb rax, xmm1, 0\nvpextrb rbx, xmm2, 0xFF\nvpextrb [rsi + 8 * 0 + 0], xmm3, 2\nvpextrb [rsi + 8 * 0 + 1], xmm4, 0xFF\nvpextrb [rsi + 8 * 0 + 2], xmm5, 4\nvpextrb [rsi + 8 * 0 + 3], xmm6, 5\nvpextrb [rsi + 8 * 0 + 4], xmm7, 6\nvpextrb [rsi + 8 * 0 + 5], xmm8, 7\nmov rcx, [rsi + 8 * 0]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/VEX/vpextrd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x000000004d2fa47f\",\n    \"RBX\": \"0x0000000067d29af3\",\n    \"RCX\": \"0x8a6789f27404b890\",\n    \"RDX\": \"0x00f658ab78236612\"\n  }\n}\n%endif\n\nlea rdx, [rel .data]\nmov rsi, 0xe0000000\n\nvmovaps xmm1, [rdx + 16 * 0]\nvmovaps xmm2, [rdx + 16 * 1]\nvmovaps xmm3, [rdx + 16 * 2]\nvmovaps xmm4, [rdx + 16 * 3]\nvmovaps xmm5, [rdx + 16 * 4]\nvmovaps xmm6, [rdx + 16 * 5]\nvmovaps xmm7, [rdx + 16 * 6]\nvmovaps xmm8, [rdx + 16 * 7]\n\nmov rax, 0\nmov [rsi + 8 * 0], rax\n\nmov rax, -1\n\nvpextrd eax, xmm1, 0\nvpextrd ebx, xmm2, 0xFF\nvpextrd [rsi + 8 * 0 + 0], xmm3, 2\nvpextrd [rsi + 8 * 0 + 4], xmm4, 0xFF\nvpextrd [rsi + 8 * 1 + 0], xmm5, 4\nvpextrd [rsi + 8 * 1 + 4], xmm6, 5\nmov rcx, [rsi + 8 * 0]\nmov rdx, [rsi + 8 * 1]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/VEX/vpextrq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x48510f254d2fa47f\",\n    \"RBX\": \"0x67d29af330ae762c\",\n    \"RCX\": \"0xb615b9533de8ad09\",\n    \"RDX\": \"0x8a6789f2d415a567\",\n    \"RDI\": \"0x8996f88178236612\",\n    \"RSP\": \"0xc97d9d031ed21972\"\n  }\n}\n%endif\n\nlea rdx, [rel .data]\nmov rsi, 0xe0000000\n\nvmovaps xmm1, [rdx + 16 * 0]\nvmovaps xmm2, [rdx + 16 * 1]\nvmovaps xmm3, [rdx + 16 * 2]\nvmovaps xmm4, [rdx + 16 * 3]\nvmovaps xmm5, [rdx + 16 * 4]\nvmovaps xmm6, [rdx + 16 * 5]\nvmovaps xmm7, [rdx + 16 * 6]\nvmovaps xmm8, [rdx + 16 * 7]\n\nmov rax, 0\nmov [rsi + 8 * 0], rax\n\nvpextrq rax, xmm1, 0\nvpextrq rbx, xmm2, 0xFF\nvpextrq [rsi + 8 * 0], xmm3, 2\nvpextrq [rsi + 8 * 1], xmm4, 0xFF\nvpextrq [rsi + 8 * 2], xmm5, 4\nvpextrq [rsi + 8 * 3], xmm6, 5\nmov rcx, [rsi + 8 * 0]\nmov rdx, [rsi + 8 * 1]\nmov rdi, [rsi + 8 * 2]\nmov rsp, [rsi + 8 * 3]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/VEX/vpextrw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x000000000000A47F\",\n    \"RBX\": \"0x00000000000067D2\",\n    \"RCX\": \"0x1ED2A2A98A67B953\"\n  }\n}\n%endif\n\nlea rdx, [rel .data]\nmov rsi, 0xe0000000\n\nvmovaps xmm1, [rdx + 16 * 0]\nvmovaps xmm2, [rdx + 16 * 1]\nvmovaps xmm3, [rdx + 16 * 2]\nvmovaps xmm4, [rdx + 16 * 3]\nvmovaps xmm5, [rdx + 16 * 4]\nvmovaps xmm6, [rdx + 16 * 5]\nvmovaps xmm7, [rdx + 16 * 6]\nvmovaps xmm8, [rdx + 16 * 7]\n\nmov rax, 0\nmov [rsi + 8 * 0], rax\n\nvpextrw eax, xmm1, 0\nvpextrw ebx, xmm2, 0xFF\n\nvpextrw [rsi + 8 * 0 + 0], xmm3, 2\nvpextrw [rsi + 8 * 0 + 2], xmm4, 0xFF\nvpextrw [rsi + 8 * 0 + 4], xmm5, 4\nvpextrw [rsi + 8 * 0 + 6], xmm6, 5\nmov rcx, [rsi + 8 * 0]\n\nhlt\n\nalign 16\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dd_128bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0xa2ff64bc388e768d\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x177f80d27f80d2ec\", \"0x73f1177ff1177f80\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x34292db66334292d\", \"0x2db6b85f292db6b8\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda2567f80d2ec\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda2566334292d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherdd xmm15, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherdd xmm14, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherdd xmm13, [xmm0 * 1 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherdd xmm12, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherdd xmm11, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherdd xmm10, [xmm0 * 1 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherdd xmm9, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherdd xmm8, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherdd xmm7, [xmm0 * 1 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm6, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm5, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm4, [xmm0 * 1 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm3, [xmm0 * 1 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -992, -512, -256, -128, 128, 256, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dd_128bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af52633359\", \"0xa2ff64bc388e768d\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x5e82db69db698176\", \"0xd2ec7be67be65e82\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xe9341ce2fff5e934\", \"0xbf6334291ce2bf63\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda256db698176\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256fff5e934\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherdd xmm15, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherdd xmm14, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherdd xmm13, [xmm0 * 2 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherdd xmm12, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherdd xmm11, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherdd xmm10, [xmm0 * 2 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherdd xmm9, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherdd xmm8, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherdd xmm7, [xmm0 * 2 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm6, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm5, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm4, [xmm0 * 2 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm3, [xmm0 * 2 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -504, -256, -128, -64, 64, 128, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dd_128bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0xa2ff64bc388e768d\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x3087464d8aa16a60\", \"0x33b7153e97ba9a8e\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xdf6efe3bb8c6d8a6\", \"0x8a34fff53fd4ea2f\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda2568aa16a60\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256b8c6d8a6\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherdd xmm15, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherdd xmm14, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherdd xmm13, [xmm0 * 4 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherdd xmm12, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherdd xmm11, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherdd xmm10, [xmm0 * 4 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherdd xmm9, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherdd xmm8, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherdd xmm7, [xmm0 * 4 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm6, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm5, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm4, [xmm0 * 4 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm3, [xmm0 * 4 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -248, -128, -64, -32, 32, 64, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dd_128bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0afde37bc4f\", \"0xa2ff64bc388e768d\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xd2f4229df1a6aed4\", \"0x0b85efdc2ef911b1\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x71089de2ab3fd329\", \"0x9712ffc55d4e120a\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda256f1a6aed4\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256ab3fd329\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherdd xmm15, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherdd xmm14, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherdd xmm13, [xmm0 * 8 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherdd xmm12, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherdd xmm11, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherdd xmm10, [xmm0 * 8 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherdd xmm9, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherdd xmm8, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherdd xmm7, [xmm0 * 8 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm6, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm5, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm4, [xmm0 * 8 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherdd xmm3, [xmm0 * 8 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -120, -64, -32, -16, 16, 32, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dd_256bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0xa2ff64bc388e768d\", \"0x13a833a3666d909d\", \"0xf6300511c21448dd\"],\n    \"XMM4\":  [\"0x177f80d27f80d2ec\", \"0x73f1177ff1177f80\", \"0xd7e273f1e273f117\", \"0x35a9d7e2a9d7e273\"],\n    \"XMM5\":  [\"0x34292db66334292d\", \"0x2db6b85f292db6b8\", \"0xb85f6135b6b85f61\", \"0x6135a9d75f6135a9\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\"],\n    \"XMM7\":  [\"0xf1cda2567f80d2ec\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0xf1cda2566334292d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x35a9d7e2f7b7368a\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000000]\nvpgatherdd ymm15, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000000]\nvpgatherdd ymm14, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000000]\nvpgatherdd ymm13, [ymm0 * 1 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000001]\nvpgatherdd ymm12, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000001]\nvpgatherdd ymm11, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000001]\nvpgatherdd ymm10, [ymm0 * 1 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_10000000]\nvpgatherdd ymm9, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_10000000]\nvpgatherdd ymm8, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_10000000]\nvpgatherdd ymm7, [ymm0 * 1 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm6, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm5, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm4, [ymm0 * 1 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm3, [ymm0 * 1 + rax], ymm1\n\n; xmm1 will be zero after this.\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -992, -512, -256, -128, 128, 256, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dd_256bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n\n    \"XMM3\":  [\"0x2522e0af52633359\", \"0xa2ff64bc388e768d\", \"0x13a833a3666d909d\", \"0x59f4e95cc21448dd\"],\n    \"XMM4\":  [\"0x5e82db69db698176\", \"0xd2ec7be67be65e82\", \"0xf1177f807f80d2ec\", \"0xa9d7e273e273f117\"],\n    \"XMM5\":  [\"0xe9341ce2fff5e934\", \"0xbf6334291ce2bf63\", \"0x2db6b85f34292db6\", \"0x6135a9d7b85f6135\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\"],\n    \"XMM7\":  [\"0xf1cda256db698176\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0xf1cda256fff5e934\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xa9d7e273f7b7368a\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000000]\nvpgatherdd ymm15, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000000]\nvpgatherdd ymm14, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000000]\nvpgatherdd ymm13, [ymm0 * 2 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000001]\nvpgatherdd ymm12, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000001]\nvpgatherdd ymm11, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000001]\nvpgatherdd ymm10, [ymm0 * 2 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_10000000]\nvpgatherdd ymm9, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_10000000]\nvpgatherdd ymm8, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_10000000]\nvpgatherdd ymm7, [ymm0 * 2 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm6, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm5, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm4, [ymm0 * 2 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm3, [ymm0 * 2 + rax], ymm1\n\n; xmm1 will be zero after this.\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -504, -256, -128, -64, 64, 128, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dd_256bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0xa2ff64bc388e768d\", \"0x13a833a3666d909d\", \"0xf6300511c21448dd\"],\n    \"XMM4\":  [\"0x3087464d8aa16a60\", \"0x33b7153e97ba9a8e\", \"0x7be65e82db698176\", \"0xe273f1177f80d2ec\"],\n    \"XMM5\":  [\"0xdf6efe3bb8c6d8a6\", \"0x8a34fff53fd4ea2f\", \"0xbf633429e9341ce2\", \"0x6135a9d72db6b85f\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\"],\n    \"XMM7\":  [\"0xf1cda2568aa16a60\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0xf1cda256b8c6d8a6\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xe273f117f7b7368a\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000000]\nvpgatherdd ymm15, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000000]\nvpgatherdd ymm14, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000000]\nvpgatherdd ymm13, [ymm0 * 4 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000001]\nvpgatherdd ymm12, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000001]\nvpgatherdd ymm11, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000001]\nvpgatherdd ymm10, [ymm0 * 4 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_10000000]\nvpgatherdd ymm9, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_10000000]\nvpgatherdd ymm8, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_10000000]\nvpgatherdd ymm7, [ymm0 * 4 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm6, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm5, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm4, [ymm0 * 4 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm3, [ymm0 * 4 + rax], ymm1\n\n; xmm1 will be zero after this.\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -248, -128, -64, -32, 32, 64, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dd_256bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0afde37bc4f\", \"0xa2ff64bc388e768d\", \"0x13a833a3666d909d\", \"0xabf96d9bc21448dd\"],\n    \"XMM4\":  [\"0xd2f4229df1a6aed4\", \"0x0b85efdc2ef911b1\", \"0x97ba9a8e8aa16a60\", \"0x7f80d2ecdb698176\"],\n    \"XMM5\":  [\"0x71089de2ab3fd329\", \"0x9712ffc55d4e120a\", \"0x8a34fff5df6efe3b\", \"0x6135a9d7bf633429\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\"],\n    \"XMM7\":  [\"0xf1cda256f1a6aed4\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0xf1cda256ab3fd329\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x7f80d2ecf7b7368a\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7f7b7368a\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000000]\nvpgatherdd ymm15, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000000]\nvpgatherdd ymm14, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000000]\nvpgatherdd ymm13, [ymm0 * 8 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_00000001]\nvpgatherdd ymm12, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_00000001]\nvpgatherdd ymm11, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_00000001]\nvpgatherdd ymm10, [ymm0 * 8 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_10000000]\nvpgatherdd ymm9, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_10000000]\nvpgatherdd ymm8, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_10000000]\nvpgatherdd ymm7, [ymm0 * 8 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm6, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm5, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm4, [ymm0 * 8 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_11111111]\nvpgatherdd ymm3, [ymm0 * 8 + rax], ymm1\n\n; xmm1 will be zero after this.\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -120, -64, -32, -16, 16, 32, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dq_128bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xe273f1177f80d2ec\", \"0xd7e273f1177f80d2\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x341ce2bf6334292d\", \"0x1ce2bf6334292db6\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xe273f1177f80d2ec\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0x341ce2bf6334292d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherdq xmm15, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherdq xmm14, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherdq xmm13, [xmm0 * 1 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherdq xmm12, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherdq xmm11, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherdq xmm10, [xmm0 * 1 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherdq xmm9, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherdq xmm8, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherdq xmm7, [xmm0 * 1 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm6, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm5, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm4, [xmm0 * 1 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm3, [xmm0 * 1 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -992, -512, -256, -128, 128, 256, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dq_128bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x002fd22652633359\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x7be65e82db698176\", \"0xd2ec7be65e82db69\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xea2f8a34fff5e934\", \"0x8a34fff5e9341ce2\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0x7be65e82db698176\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xea2f8a34fff5e934\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherdq xmm15, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherdq xmm14, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherdq xmm13, [xmm0 * 2 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherdq xmm12, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherdq xmm11, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherdq xmm10, [xmm0 * 2 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherdq xmm9, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherdq xmm8, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherdq xmm7, [xmm0 * 2 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm6, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm5, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm4, [xmm0 * 2 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm3, [xmm0 * 2 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -504, -256, -128, -64, 64, 128, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dq_128bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x3087464d8aa16a60\", \"0x97ba9a8e3087464d\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x9712ffc5b8c6d8a6\", \"0xb8c6d8a6df6efe3b\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0x3087464d8aa16a60\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0x9712ffc5b8c6d8a6\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherdq xmm15, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherdq xmm14, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherdq xmm13, [xmm0 * 4 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherdq xmm12, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherdq xmm11, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherdq xmm10, [xmm0 * 4 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherdq xmm9, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherdq xmm8, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherdq xmm7, [xmm0 * 4 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm6, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm5, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm4, [xmm0 * 4 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm3, [xmm0 * 4 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -248, -128, -64, -32, 32, 64, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dq_128bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2b43dbebde37bc4f\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xb57f2163f1a6aed4\", \"0x07ed4949d2f4229d\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x8b27e4deab3fd329\", \"0xbf8b198471089de2\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xb57f2163f1a6aed4\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0x8b27e4deab3fd329\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherdq xmm15, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherdq xmm14, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherdq xmm13, [xmm0 * 8 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherdq xmm12, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherdq xmm11, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherdq xmm10, [xmm0 * 8 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherdq xmm9, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherdq xmm8, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherdq xmm7, [xmm0 * 8 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm6, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm5, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm4, [xmm0 * 8 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherdq xmm3, [xmm0 * 8 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -120, -64, -32, -16, 16, 32, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dq_256bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0xead2e747388e768d\", \"0x88bd62c1a2ff64bc\"],\n    \"XMM4\":  [\"0xe273f1177f80d2ec\", \"0xd7e273f1177f80d2\", \"0xa9d7e273f1177f80\", \"0x35a9d7e273f1177f\"],\n    \"XMM5\":  [\"0x341ce2bf6334292d\", \"0x1ce2bf6334292db6\", \"0xe2bf6334292db6b8\", \"0xbf6334292db6b85f\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0xe273f1177f80d2ec\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0x341ce2bf6334292d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x35a9d7e273f1177f\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xbf6334292db6b85f\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherdq ymm15, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherdq ymm14, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherdq ymm13, [xmm0 * 1 + rax], ymm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherdq ymm12, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherdq ymm11, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherdq ymm10, [xmm0 * 1 + rax], ymm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherdq ymm9, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherdq ymm8, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherdq ymm7, [xmm0 * 1 + rax], ymm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm6, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm5, [xmm0 * 1 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm4, [xmm0 * 1 + rax], ymm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm3, [xmm0 * 1 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -992, -512, -256, -128, 128, 256, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dq_256bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x002fd22652633359\", \"0x6778ae2a2522e0af\", \"0xead2e747388e768d\", \"0x88bd62c1a2ff64bc\"],\n    \"XMM4\":  [\"0x7be65e82db698176\", \"0xd2ec7be65e82db69\", \"0x7f80d2ec7be65e82\", \"0xf1177f80d2ec7be6\"],\n    \"XMM5\":  [\"0xea2f8a34fff5e934\", \"0x8a34fff5e9341ce2\", \"0xfff5e9341ce2bf63\", \"0xe9341ce2bf633429\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0x7be65e82db698176\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0xea2f8a34fff5e934\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xf1177f80d2ec7be6\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xe9341ce2bf633429\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherdq ymm15, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherdq ymm14, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherdq ymm13, [xmm0 * 2 + rax], ymm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherdq ymm12, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherdq ymm11, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherdq ymm10, [xmm0 * 2 + rax], ymm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherdq ymm9, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherdq ymm8, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherdq ymm7, [xmm0 * 2 + rax], ymm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm6, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm5, [xmm0 * 2 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm4, [xmm0 * 2 + rax], ymm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm3, [xmm0 * 2 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -504, -256, -128, -64, 64, 128, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dq_256bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0xead2e747388e768d\", \"0x88bd62c1a2ff64bc\"],\n    \"XMM4\":  [\"0x3087464d8aa16a60\", \"0x97ba9a8e3087464d\", \"0x33b7153e97ba9a8e\", \"0xdb69817633b7153e\"],\n    \"XMM5\":  [\"0x9712ffc5b8c6d8a6\", \"0xb8c6d8a6df6efe3b\", \"0xdf6efe3b3fd4ea2f\", \"0x3fd4ea2f8a34fff5\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0x3087464d8aa16a60\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0x9712ffc5b8c6d8a6\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xdb69817633b7153e\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x3fd4ea2f8a34fff5\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherdq ymm15, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherdq ymm14, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherdq ymm13, [xmm0 * 4 + rax], ymm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherdq ymm12, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherdq ymm11, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherdq ymm10, [xmm0 * 4 + rax], ymm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherdq ymm9, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherdq ymm8, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherdq ymm7, [xmm0 * 4 + rax], ymm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm6, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm5, [xmm0 * 4 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm4, [xmm0 * 4 + rax], ymm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm3, [xmm0 * 4 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -248, -128, -64, -32, 32, 64, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_dq_256bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2b43dbebde37bc4f\", \"0x6778ae2a2522e0af\", \"0xead2e747388e768d\", \"0x88bd62c1a2ff64bc\"],\n    \"XMM4\":  [\"0xb57f2163f1a6aed4\", \"0x07ed4949d2f4229d\", \"0x4735be742ef911b1\", \"0x1fe6464d0b85efdc\"],\n    \"XMM5\":  [\"0x8b27e4deab3fd329\", \"0xbf8b198471089de2\", \"0x225165965d4e120a\", \"0xa886da539712ffc5\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0xb57f2163f1a6aed4\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0x8b27e4deab3fd329\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x1fe6464d0b85efdc\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xa886da539712ffc5\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 32-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherdq ymm15, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherdq ymm14, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherdq ymm13, [xmm0 * 8 + rax], ymm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherdq ymm12, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherdq ymm11, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherdq ymm10, [xmm0 * 8 + rax], ymm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherdq ymm9, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherdq ymm8, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherdq ymm7, [xmm0 * 8 + rax], ymm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm6, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm5, [xmm0 * 8 + rax], ymm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm4, [xmm0 * 8 + rax], ymm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherdq ymm3, [xmm0 * 8 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 32-bit integer.\n.index_d0:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.index_positive_increment:\ndd 7, 6, 5, 4, 3, 2, 1, 0\n\n.index_negative_decrement:\ndd -8, -7, -6, -5, -4, -3, -2, -1\n\n.index_full_range:\ndd -120, -64, -32, -16, 16, 32, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_128bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xd7e273f1e273f117\", \"0\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xb85f6135b6b85f61\", \"0\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda256e273f117\", \"0\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256b6b85f61\", \"0\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm15, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm14, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm13, [xmm0 * 1 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm12, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm11, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm10, [xmm0 * 1 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm9, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm8, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm7, [xmm0 * 1 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm6, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm5, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm4, [xmm0 * 1 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm3, [xmm0 * 1 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -992, -512, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_128bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm15, [xmm0 * 1 + rax + 1], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_128bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af52633359\", \"0\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xf1177f807f80d2ec\", \"0\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x2db6b85f34292db6\", \"0\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda2567f80d2ec\", \"0\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda25634292db6\", \"0\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm15, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm14, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm13, [xmm0 * 2 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm12, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm11, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm10, [xmm0 * 2 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm9, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm8, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm7, [xmm0 * 2 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm6, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm5, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm4, [xmm0 * 2 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm3, [xmm0 * 2 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -504, -256, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_128bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 1\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 1\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 1\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 1\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm15, [xmm0 * 2 + rax + 2], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_128bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x7be65e82db698176\", \"0\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xbf633429e9341ce2\", \"0\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda256db698176\", \"0\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256e9341ce2\", \"0\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm15, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm14, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm13, [xmm0 * 4 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm12, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm11, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm10, [xmm0 * 4 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm9, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm8, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm7, [xmm0 * 4 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm6, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm5, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm4, [xmm0 * 4 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm3, [xmm0 * 4 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -248, -128, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_128bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 2\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 2\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 2\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 2\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm15, [xmm0 * 4 + rax + 4], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_128bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0afde37bc4f\", \"0\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x97ba9a8e8aa16a60\", \"0\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x8a34fff5df6efe3b\", \"0\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda2568aa16a60\", \"0\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256df6efe3b\", \"0\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm15, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm14, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm13, [xmm0 * 8 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm12, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm11, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm10, [xmm0 * 8 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm9, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm8, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm7, [xmm0 * 8 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm6, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm5, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm4, [xmm0 * 8 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm3, [xmm0 * 8 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -120, -64, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_128bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 3\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 3\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 3\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 3\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm15, [xmm0 * 8 + rax + 8], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_256bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0xf6300511c21448dd\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xd7e273f1e273f117\", \"0x35a9d7e2a9d7e273\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xb85f6135b6b85f61\", \"0x6135a9d75f6135a9\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda256e273f117\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256b6b85f61\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm15, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm14, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm13, [ymm0 * 1 + rax], xmm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm12, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm11, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm10, [ymm0 * 1 + rax], xmm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm9, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm8, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm7, [ymm0 * 1 + rax], xmm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm6, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm5, [ymm0 * 1 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm4, [ymm0 * 1 + rax], xmm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm3, [ymm0 * 1 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -992, -512, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_256bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm15, [ymm0 * 1 + rax + 1], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_256bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af52633359\", \"0x59f4e95cc21448dd\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xf1177f807f80d2ec\", \"0xa9d7e273e273f117\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x2db6b85f34292db6\", \"0x6135a9d7b85f6135\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda2567f80d2ec\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda25634292db6\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm15, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm14, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm13, [ymm0 * 2 + rax], xmm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm12, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm11, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm10, [ymm0 * 2 + rax], xmm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm9, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm8, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm7, [ymm0 * 2 + rax], xmm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm6, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm5, [ymm0 * 2 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm4, [ymm0 * 2 + rax], xmm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm3, [ymm0 * 2 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -504, -256, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_256bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 1\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 1\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 1\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 1\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm15, [ymm0 * 2 + rax + 2], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_256bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0af6799bee3\", \"0xf6300511c21448dd\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x7be65e82db698176\", \"0xe273f1177f80d2ec\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xbf633429e9341ce2\", \"0x6135a9d72db6b85f\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda256db698176\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256e9341ce2\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm15, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm14, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm13, [ymm0 * 4 + rax], xmm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm12, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm11, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm10, [ymm0 * 4 + rax], xmm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm9, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm8, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm7, [ymm0 * 4 + rax], xmm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm6, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm5, [ymm0 * 4 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm4, [ymm0 * 4 + rax], xmm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm3, [ymm0 * 4 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -248, -128, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_256bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 2\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 2\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 2\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 2\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm15, [ymm0 * 4 + rax + 4], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_256bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2522e0afde37bc4f\", \"0xabf96d9bc21448dd\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x97ba9a8e8aa16a60\", \"0x7f80d2ecdb698176\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x8a34fff5df6efe3b\", \"0x6135a9d7bf633429\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x6135a9d76135a9d7\", \"0x6135a9d76135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xf1cda2568aa16a60\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xf1cda256df6efe3b\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0xf1cda2566135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm15, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm14, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000000]\nvpgatherqd xmm13, [ymm0 * 8 + rax], xmm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm12, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm11, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_00000001]\nvpgatherqd xmm10, [ymm0 * 8 + rax], xmm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm9, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm8, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_10000000]\nvpgatherqd xmm7, [ymm0 * 8 + rax], xmm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm6, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm5, [ymm0 * 8 + rax], xmm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm4, [ymm0 * 8 + rax], xmm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm3, [ymm0 * 8 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_00000000:\ndd 0, 0, 0, 0, 0, 0, 0, 0\n\n.mask_00000001:\ndd 0, 0, 0, 0, 0, 0, 0, 0x8000_0000\n\n.mask_10000000:\ndd 0x8000_0000, 0, 0, 0, 0, 0, 0, 0\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -120, -64, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qd_256bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x7f80d2ec6135a9d7\", \"0x8a34fff5db698176\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 3\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 3\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 3\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 3\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_11111111]\nvpgatherqd xmm15, [ymm0 * 8 + rax + 8], xmm1\n\nhlt\n\nalign 4096\n\n.mask_11111111:\ndd 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000, 0x8000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_128bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x6135a9d7e273f117\", \"0x5f6135a9d7e273f1\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x6334292db6b85f61\", \"0x34292db6b85f6135\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0x6135a9d7e273f117\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0x6334292db6b85f61\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherqq xmm15, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherqq xmm14, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherqq xmm13, [xmm0 * 1 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherqq xmm12, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherqq xmm11, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherqq xmm10, [xmm0 * 1 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherqq xmm9, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherqq xmm8, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherqq xmm7, [xmm0 * 1 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm6, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm5, [xmm0 * 1 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm4, [xmm0 * 1 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm3, [xmm0 * 1 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -992, -512, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_128bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm15, [xmm0 * 1 + rax + 1], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_128bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x002fd22652633359\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0xe273f1177f80d2ec\", \"0xa9d7e273f1177f80\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x1ce2bf6334292db6\", \"0xbf6334292db6b85f\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0xe273f1177f80d2ec\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0x1ce2bf6334292db6\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherqq xmm15, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherqq xmm14, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherqq xmm13, [xmm0 * 2 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherqq xmm12, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherqq xmm11, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherqq xmm10, [xmm0 * 2 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherqq xmm9, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherqq xmm8, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherqq xmm7, [xmm0 * 2 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm6, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm5, [xmm0 * 2 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm4, [xmm0 * 2 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm3, [xmm0 * 2 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -504, -256, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_128bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 1\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 1\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 1\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 1\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm15, [xmm0 * 2 + rax + 2], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_128bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x7be65e82db698176\", \"0x7f80d2ec7be65e82\", \"0\", \"0\"],\n    \"XMM5\":  [\"0x8a34fff5e9341ce2\", \"0xe9341ce2bf633429\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0x7be65e82db698176\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0x8a34fff5e9341ce2\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherqq xmm15, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherqq xmm14, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherqq xmm13, [xmm0 * 4 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherqq xmm12, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherqq xmm11, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherqq xmm10, [xmm0 * 4 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherqq xmm9, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherqq xmm8, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherqq xmm7, [xmm0 * 4 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm6, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm5, [xmm0 * 4 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm4, [xmm0 * 4 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm3, [xmm0 * 4 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -248, -128, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_128bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 2\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 2\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 2\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 2\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm15, [xmm0 * 4 + rax + 4], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_128bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2b43dbebde37bc4f\", \"0x6778ae2a2522e0af\", \"0\", \"0\"],\n    \"XMM4\":  [\"0x3087464d8aa16a60\", \"0x33b7153e97ba9a8e\", \"0\", \"0\"],\n    \"XMM5\":  [\"0xb8c6d8a6df6efe3b\", \"0x3fd4ea2f8a34fff5\", \"0\", \"0\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0\", \"0\"],\n    \"XMM7\":  [\"0x3087464d8aa16a60\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM8\":  [\"0xb8c6d8a6df6efe3b\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherqq xmm15, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherqq xmm14, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0000]\nvpgatherqq xmm13, [xmm0 * 8 + rax], xmm1\n\n; First element Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherqq xmm12, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherqq xmm11, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_0001]\nvpgatherqq xmm10, [xmm0 * 8 + rax], xmm1\n\n; Top element mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherqq xmm9, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherqq xmm8, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1000]\nvpgatherqq xmm7, [xmm0 * 8 + rax], xmm1\n\n; Full Mask\nvmovaps xmm0, [rel .index_d0]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm6, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_positive_increment]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm5, [xmm0 * 8 + rax], xmm1\n\nvmovaps xmm0, [rel .index_negative_decrement]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm4, [xmm0 * 8 + rax], xmm1\n\n; Full range, full mask\nvmovaps xmm0, [rel .index_full_range]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm3, [xmm0 * 8 + rax], xmm1\n\n; xmm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -120, -64, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_128bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0\", \"0\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 128-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 3\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 3\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 3\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 3\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps xmm0, [rel .index_overflow]\nvmovaps xmm1, [rel .mask_1111]\nvpgatherqq xmm15, [xmm0 * 8 + rax + 8], xmm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_256bit_1xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0x71e5d85fc21448dd\", \"0x464061a9f6300511\"],\n    \"XMM4\":  [\"0x6135a9d7e273f117\", \"0x5f6135a9d7e273f1\", \"0xb85f6135a9d7e273\", \"0xb6b85f6135a9d7e2\"],\n    \"XMM5\":  [\"0x6334292db6b85f61\", \"0x34292db6b85f6135\", \"0x292db6b85f6135a9\", \"0x2db6b85f6135a9d7\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0x6135a9d7e273f117\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0x6334292db6b85f61\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xb6b85f6135a9d7e2\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherqq ymm15, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherqq ymm14, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherqq ymm13, [ymm0 * 1 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherqq ymm12, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherqq ymm11, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherqq ymm10, [ymm0 * 1 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherqq ymm9, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherqq ymm8, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherqq ymm7, [ymm0 * 1 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm6, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm5, [ymm0 * 1 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm4, [ymm0 * 1 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm3, [ymm0 * 1 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -992, -512, 512, 992\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_256bit_1xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 1x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm15, [ymm0 * 1 + rax + 1], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_256bit_2xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x002fd22652633359\", \"0x6778ae2a2522e0af\", \"0x71e5d85fc21448dd\", \"0x98f0351d59f4e95c\"],\n    \"XMM4\":  [\"0xe273f1177f80d2ec\", \"0xa9d7e273f1177f80\", \"0x6135a9d7e273f117\", \"0xb85f6135a9d7e273\"],\n    \"XMM5\":  [\"0x1ce2bf6334292db6\", \"0xbf6334292db6b85f\", \"0x34292db6b85f6135\", \"0x2db6b85f6135a9d7\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0xe273f1177f80d2ec\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0x1ce2bf6334292db6\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xb85f6135a9d7e273\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherqq ymm15, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherqq ymm14, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherqq ymm13, [ymm0 * 2 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherqq ymm12, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherqq ymm11, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherqq ymm10, [ymm0 * 2 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherqq ymm9, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherqq ymm8, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherqq ymm7, [ymm0 * 2 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm6, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm5, [ymm0 * 2 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm4, [ymm0 * 2 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm3, [ymm0 * 2 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -504, -256, 256, 504\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_256bit_2xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 2x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 1\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 1\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 1\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 1\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm15, [ymm0 * 2 + rax + 2], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_256bit_4xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0xcb60805f6799bee3\", \"0x6778ae2a2522e0af\", \"0x71e5d85fc21448dd\", \"0x464061a9f6300511\"],\n    \"XMM4\":  [\"0x7be65e82db698176\", \"0x7f80d2ec7be65e82\", \"0xe273f1177f80d2ec\", \"0x6135a9d7e273f117\"],\n    \"XMM5\":  [\"0x8a34fff5e9341ce2\", \"0xe9341ce2bf633429\", \"0xbf6334292db6b85f\", \"0x2db6b85f6135a9d7\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0x7be65e82db698176\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0x8a34fff5e9341ce2\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x6135a9d7e273f117\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherqq ymm15, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherqq ymm14, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherqq ymm13, [ymm0 * 4 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherqq ymm12, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherqq ymm11, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherqq ymm10, [ymm0 * 4 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherqq ymm9, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherqq ymm8, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherqq ymm7, [ymm0 * 4 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm6, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm5, [ymm0 * 4 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm4, [ymm0 * 4 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm3, [ymm0 * 4 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -248, -128, 128, 248\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_256bit_4xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 4x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 2\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 2\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 2\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 2\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm15, [ymm0 * 4 + rax + 4], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_256bit_8xdisp.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\":  [\"0x2b43dbebde37bc4f\", \"0x6778ae2a2522e0af\", \"0x71e5d85fc21448dd\", \"0x59fc3ca8abf96d9b\"],\n    \"XMM4\":  [\"0x3087464d8aa16a60\", \"0x33b7153e97ba9a8e\", \"0x7be65e82db698176\", \"0xe273f1177f80d2ec\"],\n    \"XMM5\":  [\"0xb8c6d8a6df6efe3b\", \"0x3fd4ea2f8a34fff5\", \"0xe9341ce2bf633429\", \"0x2db6b85f6135a9d7\"],\n    \"XMM6\":  [\"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\", \"0x2db6b85f6135a9d7\"],\n    \"XMM7\":  [\"0x3087464d8aa16a60\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM8\":  [\"0xb8c6d8a6df6efe3b\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM9\":  [\"0x2db6b85f6135a9d7\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM10\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xe273f1177f80d2ec\"],\n    \"XMM11\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM12\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0x2db6b85f6135a9d7\"],\n    \"XMM13\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM14\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"],\n    \"XMM15\": [\"0xf1cda2562209301d\", \"0x0f350767409162b7\", \"0x002fd22652633359\", \"0xc0a14faff7b7368a\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 64-bit indexes\n\nlea rax, [rel .data_mid]\n\nvmovapd ymm15, [rel .data]\nvmovapd ymm14, [rel .data]\nvmovapd ymm13, [rel .data]\nvmovapd ymm12, [rel .data]\nvmovapd ymm11, [rel .data]\nvmovapd ymm10, [rel .data]\nvmovapd ymm9, [rel .data]\nvmovapd ymm8, [rel .data]\nvmovapd ymm7, [rel .data]\nvmovapd ymm6, [rel .data]\nvmovapd ymm5, [rel .data]\nvmovapd ymm4, [rel .data]\n\n; Zero mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherqq ymm15, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherqq ymm14, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0000]\nvpgatherqq ymm13, [ymm0 * 8 + rax], ymm1\n\n; First element Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherqq ymm12, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherqq ymm11, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_0001]\nvpgatherqq ymm10, [ymm0 * 8 + rax], ymm1\n\n; Top element mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherqq ymm9, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherqq ymm8, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1000]\nvpgatherqq ymm7, [ymm0 * 8 + rax], ymm1\n\n; Full Mask\nvmovaps ymm0, [rel .index_d0]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm6, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_positive_increment]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm5, [ymm0 * 8 + rax], ymm1\n\nvmovaps ymm0, [rel .index_negative_decrement]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm4, [ymm0 * 8 + rax], ymm1\n\n; Full range, full mask\nvmovaps ymm0, [rel .index_full_range]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm3, [ymm0 * 8 + rax], ymm1\n\n; ymm1 will be zero after this.\n\nhlt\n\nalign 4096\n\n; Masks only care about the sign bit.\n.mask_0000:\ndq 0, 0, 0, 0\n\n.mask_0001:\ndq 0, 0, 0, 0x8000_0000_0000_0000\n\n.mask_1000:\ndq 0x8000_0000_0000_0000, 0, 0, 0\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_d0:\ndq 0, 0, 0, 0\n\n.index_positive_increment:\ndq 3, 2, 1, 0\n\n.index_negative_decrement:\ndq -4, -3, -2, -1\n\n.index_full_range:\ndq -120, -64, 64, 120\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpgather_qq_256bit_8xdisp_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\":  [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0x2db6b85f6135a9d7\", \"0xe273f1177f80d2ec\", \"0x7be65e82db698176\", \"0x3fd4ea2f8a34fff5\"]\n  },\n  \"HostFeatures\": [\"AVX\"]\n}\n%endif\n\n; 256-bit\n; 8x displacement\n; 64-bit indexes\n\n; Calculate an address that heavily overflows\nlea rax, [rel .data_mid]\n\nmov rbx, -1\nsub rbx, rax\nsar rbx, 3\nmov [rel .index_overflow + 0 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 8\nsar rbx, 3\nmov [rel .index_overflow + 1 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nsub rbx, 16\nsar rbx, 3\nmov [rel .index_overflow + 2 * 8], rbx\n\nmov rbx, -1\nsub rbx, rax\nadd bx, 16\nsar rbx, 3\nmov [rel .index_overflow + 3 * 8], rbx\n\n; Calculate new base which offsets from the overflow\nlea rax, [rel .data_mid]\nshl rax, 1\n\nvmovapd ymm15, [rel .data]\n\nvmovaps ymm0, [rel .index_overflow]\nvmovaps ymm1, [rel .mask_1111]\nvpgatherqq ymm15, [ymm0 * 8 + rax + 8], ymm1\n\nhlt\n\nalign 4096\n\n.mask_1111:\ndq 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000\n\n; Indexing is a signed 64-bit integer.\n.index_overflow:\ndq 0, 0, 0, 0\n\n; Random data, 512-byte per line\n.data:\ndb 0x1d, 0x30, 0x09, 0x22, 0x56, 0xa2, 0xcd, 0xf1, 0xb7, 0x62, 0x91, 0x40, 0x67, 0x07, 0x35, 0x0f, 0x59, 0x33, 0x63, 0x52, 0x26, 0xd2, 0x2f, 0x00, 0x8a, 0x36, 0xb7, 0xf7, 0xaf, 0x4f, 0xa1, 0xc0, 0xe3, 0xbe, 0x99, 0x67, 0x5f, 0x80, 0x60, 0xcb, 0x43, 0xfa, 0x5b, 0x86, 0xb1, 0x11, 0xbc, 0xb3, 0x7b, 0x43, 0x5b, 0x45, 0x9e, 0x33, 0x89, 0xb5, 0x1b, 0xb9, 0x33, 0x4f, 0xdb, 0x5d, 0x93, 0xd6, 0x4f, 0xbc, 0x37, 0xde, 0xeb, 0xdb, 0x43, 0x2b, 0x05, 0x60, 0xb8, 0x98, 0x5c, 0xa3, 0xe3, 0x1b, 0x33, 0x03, 0x29, 0x4b, 0x12, 0x4c, 0x1e, 0xe6, 0x5e, 0x0e, 0x6c, 0xa1, 0xb9, 0x36, 0xfa, 0x6c, 0x7f, 0xc6, 0xa8, 0x38, 0x73, 0x2a, 0x0a, 0x25, 0x69, 0xa5, 0x97, 0x3f, 0x24, 0x00, 0x30, 0x4d, 0x27, 0xb3, 0x94, 0x48, 0xef, 0x47, 0x98, 0x71, 0x0d, 0x56, 0x76, 0xec, 0x41, 0x12, 0x9b, 0x7b, 0x9c, 0xf5, 0x85, 0x07, 0x2d, 0x6b, 0xc6, 0xc1, 0x2e, 0x72, 0x22, 0x5a, 0x43, 0xff, 0x1e, 0xec, 0x67, 0x2b, 0x31, 0x96, 0x14, 0x2c, 0xb1, 0x5f, 0x5d, 0x0c, 0xc9, 0xad, 0x15, 0x5f, 0xab, 0x66, 0x14, 0x1c, 0x72, 0xfa, 0x23, 0xef, 0x9f, 0x77, 0xf6, 0x50, 0xb0, 0x70, 0xb8, 0x3c, 0x85, 0x9e, 0x90, 0x69, 0x17, 0x25, 0xae, 0x6e, 0xe2, 0x16, 0x7d, 0x42, 0x38, 0xdf, 0x74, 0x72, 0x7b, 0x97, 0xa9, 0x9e, 0x40, 0x24, 0x85, 0xdc, 0x64, 0xfa, 0xb1, 0x8b, 0x95, 0xe6, 0xe4, 0x13, 0x72, 0xf1, 0x52, 0x2f, 0xa0, 0xd6, 0x52, 0xc0, 0x11, 0xa7, 0xfe, 0xd5, 0x3b, 0x56, 0xca, 0xbc, 0x01, 0xce, 0x3d, 0xd2, 0x30, 0x97, 0x1d, 0xdc, 0xeb, 0x9d, 0xa9, 0x3e, 0x09, 0xef, 0xee, 0x7f, 0x09, 0x7b, 0x82, 0x43, 0x15, 0x2e, 0xa4, 0x2e, 0x97, 0x21, 0x92, 0x7e, 0x69, 0x21, 0x25, 0xda, 0x46, 0x7c, 0x0c, 0xcd, 0x1d, 0xde, 0x42, 0x11, 0xa2, 0xef, 0xa2, 0xc8, 0x32, 0x9a, 0x82, 0xcf, 0x72, 0x7e, 0x22, 0xa6, 0x11, 0xfa, 0xec, 0x0b, 0x77, 0x99, 0x38, 0x03, 0xf6, 0x80, 0xba, 0xea, 0x75, 0x19, 0xb0, 0x48, 0x02, 0xb2, 0x6b, 0xc0, 0x8c, 0xfb, 0xfe, 0xaf, 0x94, 0x4f, 0x6f, 0xb4, 0xcb, 0x1c, 0x27, 0xf0, 0x41, 0xb6, 0x46, 0x41, 0x68, 0x3d, 0x05, 0x79, 0x6b, 0xcd, 0xb7, 0x20, 0xdc, 0x40, 0x81, 0x58, 0xcb, 0x33, 0xa3, 0xf3, 0x34, 0xdc, 0x63, 0x2d, 0xa5, 0xb5, 0xa1, 0xd1, 0xfd, 0x49, 0x5b, 0x46, 0x94, 0x01, 0xa8, 0xf2, 0xd8, 0x93, 0x2c, 0xbb, 0x57, 0xfe, 0x7c, 0x77, 0x3b, 0x19, 0x6f, 0x3c, 0xaa, 0x23, 0x5b, 0xc0, 0xe7, 0x00, 0x41, 0x97, 0x91, 0xe8, 0x00, 0x12, 0xdf, 0xf6, 0x5c, 0x2e, 0xc6, 0x8e, 0xc6, 0x77, 0x59, 0x78, 0x9b, 0xef, 0x63, 0xb0, 0xd7, 0xbb, 0xc4, 0x0b, 0x60, 0x65, 0x3f, 0xfe, 0xbf, 0x04, 0x3e, 0xae, 0xc2, 0xa5, 0x90, 0xe1, 0x2a, 0x56, 0x3f, 0x4c, 0x3f, 0x7a, 0x7d, 0xda, 0x81, 0x50, 0xea, 0x4c, 0xfe, 0xc3, 0xf8, 0x5c, 0x2b, 0x67, 0xb3, 0x9f, 0x8b, 0x95, 0xda, 0x6f, 0x5d, 0xdd, 0x82, 0x7f, 0x52, 0xa2, 0xcc, 0x57, 0xec, 0xc4, 0x14, 0xd2, 0x4f, 0x1b, 0xcb, 0xea, 0xaf, 0x0e, 0x0f, 0x53, 0xaa, 0x56, 0x63, 0xea, 0x36, 0xa6, 0x89, 0x1a, 0x66, 0xc0, 0x4e, 0xf4, 0x1e, 0x02, 0x43, 0xde, 0xde, 0xc8, 0x9e, 0x88, 0x6e, 0x32, 0xd4, 0xcb, 0x47, 0x24, 0x7c, 0x28, 0x38, 0xd4, 0x95, 0xb6, 0xa3, 0x91, 0x69, 0xc7, 0x8d, 0xfd, 0x15, 0xf5, 0xbf, 0xb1, 0x98, 0x8c, 0x57, 0x51, 0xbf, 0x83, 0x6a, 0x35, 0x10, 0x03, 0x50, 0xe5, 0xf7, 0xfa, 0xf8, 0xa5, 0xb0, 0xdb, 0xfb, 0x42, 0x93, 0xbb, 0x17, 0xf7, 0x36, 0xbe, 0x26, 0x66, 0x61, 0xe2\n\ndb 0xaf, 0xe0, 0x22, 0x25, 0x2a, 0xae, 0x78, 0x67, 0x8f, 0x7e, 0x9e, 0x59, 0xd7, 0xa3, 0x71, 0xcc, 0x43, 0x85, 0x09, 0xf9, 0x18, 0x52, 0x7b, 0x01, 0x73, 0xcb, 0x31, 0x18, 0x66, 0x79, 0x67, 0x10, 0x67, 0xd8, 0xdf, 0x43, 0xaf, 0x2d, 0x9a, 0x09, 0x9c, 0xd1, 0x37, 0x7e, 0xf5, 0x1c, 0x3c, 0x4f, 0x15, 0xe1, 0x6f, 0xfd, 0x13, 0x3d, 0x53, 0x81, 0xa9, 0x93, 0x5f, 0x92, 0x41, 0x48, 0xec, 0x87, 0x87, 0x1d, 0x0b, 0xaa, 0xaa, 0xd3, 0xc2, 0x98, 0x20, 0xce, 0x28, 0xaf, 0x9d, 0x84, 0x69, 0x4a, 0xfd, 0xc0, 0x9c, 0x2e, 0x50, 0x20, 0xb2, 0x00, 0xc1, 0x81, 0x2a, 0x32, 0x8e, 0x95, 0x20, 0xa7, 0xca, 0x39, 0x28, 0x12, 0x23, 0x0e, 0x43, 0xd3, 0x82, 0x76, 0x73, 0x3c, 0xbf, 0xa9, 0x98, 0xf6, 0x39, 0x6d, 0xd9, 0x15, 0x33, 0x1e, 0x07, 0x7c, 0x08, 0x12, 0x23, 0xbd, 0xd3, 0x34, 0x2d, 0x9a, 0x23, 0x21, 0x46, 0xf3, 0x9a, 0x04, 0x25, 0x62, 0xeb, 0x7e, 0x9a, 0xaa, 0xb6, 0x26, 0xaa, 0x85, 0x01, 0x3a, 0xd8, 0xfc, 0x57, 0x98, 0xb9, 0xe4, 0xc4, 0xe9, 0x11, 0x3e, 0x22, 0x95, 0x3b, 0x41, 0x2b, 0x02, 0x04, 0x6c, 0x75, 0xa5, 0xf2, 0xaa, 0x09, 0x9e, 0x6f, 0xab, 0x1d, 0x2a, 0x5c, 0xde, 0x21, 0xb1, 0x96, 0x2d, 0x86, 0x3f, 0xd0, 0x07, 0x18, 0x1f, 0x87, 0xc2, 0x8f, 0xdf, 0x6a, 0x57, 0x6d, 0x3f, 0x80, 0xc5, 0x08, 0x19, 0xa5, 0x09, 0x65, 0x3d, 0xdc, 0x9e, 0x80, 0x3c, 0x2a, 0x0e, 0x7a, 0x40, 0x04, 0x0b, 0xcc, 0x61, 0xdb, 0x73, 0xfc, 0xa5, 0x0a, 0x42, 0x18, 0xc1, 0xd5, 0xbd, 0x18, 0x78, 0xa1, 0xe4, 0xde, 0x44, 0xec, 0x79, 0xb0, 0x27, 0xaa, 0x45, 0x21, 0x57, 0x19, 0x75, 0x09, 0x5c, 0x58, 0xd5, 0xb9, 0x6f, 0x3b, 0x48, 0x59, 0x41, 0x3e, 0xfd, 0x17, 0x43, 0x27, 0xc3, 0x8d, 0x76, 0x8e, 0x38, 0x47, 0xe7, 0xd2, 0xea, 0x54, 0x73, 0x8a, 0x65, 0x4c, 0x49, 0x91, 0xaf, 0x29, 0x65, 0x0d, 0x81, 0xa4, 0x77, 0xd7, 0x32, 0xd0, 0x69, 0xd9, 0x6b, 0xa3, 0x9b, 0x24, 0xd6, 0x0a, 0xd2, 0x77, 0x38, 0x59, 0x0b, 0xc8, 0x5c, 0xc7, 0x0b, 0x1d, 0xd1, 0xfa, 0xa7, 0x45, 0x3c, 0xeb, 0x5c, 0x8e, 0x25, 0x35, 0x81, 0x6d, 0x6d, 0xfe, 0xb4, 0x63, 0x89, 0xe4, 0xf0, 0xa8, 0xda, 0xb7, 0xd4, 0xff, 0x5d, 0x28, 0x97, 0x11, 0xf9, 0x8d, 0xab, 0x29, 0xd5, 0xd3, 0x1c, 0x70, 0x20, 0x4c, 0x41, 0x16, 0x42, 0xfd, 0xfc, 0x62, 0x82, 0x40, 0x59, 0x34, 0x28, 0xd0, 0xd5, 0xfc, 0xac, 0x97, 0xb8, 0x82, 0x0e, 0x4b, 0xae, 0x51, 0x28, 0x1a, 0xf1, 0x87, 0xd3, 0x20, 0xa3, 0xe7, 0x74, 0x69, 0x3c, 0x54, 0x8d, 0xc5, 0x56, 0x1d, 0xcd, 0x75, 0xae, 0x88, 0x17, 0x30, 0xdf, 0x46, 0x4a, 0xbc, 0x64, 0xff, 0xa2, 0xc1, 0x62, 0xbd, 0x88, 0x7b, 0x3e, 0xa1, 0x0c, 0xa9, 0x13, 0x0e, 0xc1, 0xb4, 0x24, 0xe6, 0x96, 0x1b, 0x9c, 0x9b, 0xac, 0x44, 0x33, 0x5b, 0xda, 0xd5, 0x88, 0x4d, 0xfe, 0x81, 0x09, 0x07, 0x17, 0xcf, 0x14, 0x05, 0xaf, 0xf8, 0x72, 0x14, 0x49, 0x5f, 0x06, 0x62, 0xab, 0xe0, 0x42, 0x70, 0x12, 0x59, 0x41, 0x0f, 0x18, 0x83, 0x68, 0x6d, 0xc6, 0x3c, 0xea, 0xe0, 0x6d, 0xd4, 0xae, 0xa6, 0xf1, 0x63, 0x21, 0x7f, 0xb5, 0x9d, 0x22, 0xf4, 0xd2, 0x49, 0x49, 0xed, 0x07, 0xb1, 0x11, 0xf9, 0x2e, 0x74, 0xbe, 0x35, 0x47, 0xdc, 0xef, 0x85, 0x0b, 0x4d, 0x46, 0xe6, 0x1f, 0x60, 0x6a, 0xa1, 0x8a, 0x4d, 0x46, 0x87, 0x30, 0x8e, 0x9a, 0xba, 0x97, 0x3e, 0x15, 0xb7, 0x33, 0x76, 0x81, 0x69, 0xdb, 0x82, 0x5e, 0xe6, 0x7b, 0xec, 0xd2, 0x80, 0x7f, 0x17, 0xf1, 0x73, 0xe2\n\n.data_mid:\ndb 0xd7, 0xa9, 0x35, 0x61, 0x5f, 0xb8, 0xb6, 0x2d, 0x29, 0x34, 0x63, 0xbf, 0xe2, 0x1c, 0x34, 0xe9, 0xf5, 0xff, 0x34, 0x8a, 0x2f, 0xea, 0xd4, 0x3f, 0x3b, 0xfe, 0x6e, 0xdf, 0xa6, 0xd8, 0xc6, 0xb8, 0xc5, 0xff, 0x12, 0x97, 0x53, 0xda, 0x86, 0xa8, 0x0a, 0x12, 0x4e, 0x5d, 0x96, 0x65, 0x51, 0x22, 0xe2, 0x9d, 0x08, 0x71, 0x84, 0x19, 0x8b, 0xbf, 0x29, 0xd3, 0x3f, 0xab, 0xde, 0xe4, 0x27, 0x8b, 0x99, 0xcc, 0xb1, 0x7c, 0xa5, 0x71, 0x91, 0x9a, 0x0b, 0xad, 0x75, 0x86, 0xe3, 0x9c, 0x4e, 0x0c, 0x01, 0xb3, 0x12, 0x33, 0x90, 0x81, 0x7c, 0x71, 0x2c, 0x70, 0x61, 0xd5, 0x39, 0x0c, 0x45, 0xfc, 0x27, 0xaf, 0xbb, 0xd9, 0x26, 0x1b, 0x33, 0xb4, 0x0d, 0xf8, 0xd6, 0x2d, 0x09, 0xc7, 0x8c, 0xbf, 0x48, 0x53, 0x14, 0x94, 0x76, 0x25, 0xc7, 0x0c, 0x69, 0x49, 0x82, 0xb4, 0x2f, 0x48, 0x38, 0x44, 0x9d, 0x90, 0x6d, 0x66, 0x35, 0xe9, 0x3e, 0x2f, 0x2a, 0xb7, 0xe1, 0xb1, 0x2b, 0x99, 0x08, 0x6f, 0x5c, 0x6c, 0xdf, 0xdb, 0x10, 0xe2, 0xaa, 0x86, 0xe7, 0xf8, 0x9e, 0x62, 0xde, 0xa5, 0x81, 0x6b, 0x20, 0x47, 0xa9, 0x06, 0x49, 0xc0, 0x78, 0x8c, 0x70, 0x93, 0x7e, 0xda, 0xda, 0x5e, 0x3b, 0x23, 0xf9, 0xcc, 0x87, 0xdf, 0x48, 0x4f, 0xd6, 0x77, 0xce, 0x45, 0xe1, 0xdc, 0x0c, 0x7a, 0x0c, 0x50, 0x15, 0x63, 0x8c, 0x48, 0xd3, 0x8e, 0xfa, 0xcc, 0xac, 0x1a, 0x83, 0xde, 0xb1, 0x87, 0x2a, 0x58, 0x5c, 0xa5, 0x20, 0x3d, 0xaa, 0x1e, 0x5d, 0x71, 0xa6, 0x57, 0x75, 0x82, 0xb7, 0x33, 0x9e, 0x6b, 0xf3, 0x35, 0x02, 0x98, 0x03, 0xe1, 0x3b, 0xd2, 0x9f, 0x7a, 0x06, 0x85, 0xef, 0x7d, 0xd9, 0xf2, 0x0c, 0x9e, 0xce, 0xb9, 0xce, 0x13, 0x4a, 0x9e, 0x8a, 0x29, 0xe6, 0xe5, 0xe4, 0x39, 0xba, 0xfd, 0xa3, 0x33, 0xa8, 0x13, 0x9e, 0xa5, 0x11, 0x37, 0x69, 0xbc, 0xda, 0x11, 0x49, 0x2d, 0x4a, 0xef, 0x20, 0x8b, 0x7a, 0xb8, 0x9c, 0xc3, 0xaf, 0x26, 0x71, 0xd9, 0xa2, 0xf6, 0x0f, 0x85, 0x87, 0xa8, 0x6c, 0xf9, 0x99, 0xa2, 0xb2, 0x36, 0x2d, 0x78, 0x10, 0xe4, 0x33, 0x8d, 0xa4, 0x63, 0xea, 0x02, 0xb9, 0xac, 0x2f, 0x90, 0x39, 0x2d, 0x0e, 0x2e, 0xf5, 0x08, 0xa5, 0x5c, 0x8e, 0x71, 0x30, 0x0d, 0x1b, 0x84, 0x7a, 0xd7, 0xd4, 0xab, 0x81, 0x82, 0x18, 0x37, 0xf3, 0x28, 0x6f, 0x4e, 0x28, 0x71, 0xda, 0xc9, 0x99, 0x46, 0x14, 0x46, 0x77, 0x01, 0x16, 0x21, 0xae, 0x83, 0x93, 0x86, 0x7f, 0x5a, 0xee, 0xd5, 0xdf, 0x48, 0x5b, 0x15, 0xc8, 0x09, 0x30, 0x8f, 0x01, 0xcc, 0x95, 0x30, 0xd9, 0xf7, 0x72, 0x97, 0xfd, 0x9d, 0xec, 0x9f, 0xbf, 0x5c, 0xbf, 0x4f, 0xca, 0x33, 0xb4, 0xd2, 0xa2, 0xb9, 0x08, 0x9c, 0x40, 0x25, 0x3f, 0x86, 0xdc, 0x83, 0x70, 0x2f, 0xfb, 0x2a, 0xf8, 0x61, 0x1f, 0xa1, 0x1f, 0x36, 0x04, 0xe2, 0xef, 0x1c, 0xa4, 0xcd, 0x3c, 0x7f, 0xc5, 0x73, 0x9c, 0x2e, 0xeb, 0x03, 0x79, 0xd1, 0x02, 0xfc, 0x6f, 0xbd, 0x5a, 0x95, 0xb2, 0xf6, 0x25, 0x96, 0xe6, 0x80, 0x0a, 0xc5, 0xc7, 0xca, 0x8d, 0x31, 0xae, 0xf0, 0x49, 0xcf, 0x43, 0x06, 0x27, 0x7f, 0x25, 0xc7, 0x4c, 0xb7, 0xfc, 0x73, 0xd3, 0x04, 0xd3, 0xb9, 0x9f, 0x74, 0xed, 0x9e, 0x3c, 0xf0, 0xcf, 0x26, 0x2b, 0xd9, 0xcb, 0x78, 0x2a, 0xef, 0x72, 0xf7, 0xb6, 0x78, 0x30, 0x2d, 0x8c, 0x83, 0x73, 0x66, 0x74, 0x3d, 0x66, 0x0a, 0x74, 0x5a, 0x3f, 0x9f, 0x6e, 0x56, 0x68, 0x01, 0xc2, 0xca, 0x2b, 0xa1, 0x25, 0x36, 0x9c, 0x3b, 0xa4, 0x5e, 0x44, 0xf1, 0x18, 0x1d, 0xb6, 0x1a, 0x3a, 0xee, 0x8d, 0x67, 0x34, 0x9c\n\ndb 0xdd, 0x48, 0x14, 0xc2, 0x5f, 0xd8, 0xe5, 0x71, 0x22, 0xbf, 0xbc, 0x84, 0xda, 0xc1, 0xb1, 0x22, 0x55, 0xa4, 0x63, 0x41, 0x77, 0xac, 0x40, 0x2d, 0x44, 0x73, 0x8c, 0x14, 0xba, 0x5e, 0x63, 0x68, 0x65, 0x61, 0x6d, 0xec, 0xe2, 0x6d, 0x37, 0x22, 0x04, 0xeb, 0xc7, 0xd4, 0xc9, 0x62, 0x56, 0x13, 0x96, 0x29, 0x03, 0xf4, 0x55, 0xe2, 0x58, 0x7d, 0xda, 0x52, 0x2e, 0x94, 0x07, 0xe6, 0xef, 0xc0, 0xee, 0x9e, 0x0b, 0xf7, 0xcd, 0x13, 0x8b, 0x7d, 0xea, 0xdc, 0xf8, 0xf1, 0xcb, 0xad, 0x49, 0x97, 0xc9, 0x98, 0x0b, 0xcf, 0x84, 0x8e, 0x8e, 0xbb, 0x06, 0x2e, 0x54, 0xf5, 0xa7, 0xbd, 0x70, 0x7e, 0x38, 0x69, 0x8d, 0xb0, 0x01, 0x7b, 0x41, 0x80, 0x09, 0x44, 0xfd, 0x7e, 0x21, 0xb4, 0xbe, 0x6b, 0x4a, 0xb7, 0xca, 0x2d, 0x19, 0xfe, 0x6d, 0xd6, 0x11, 0x29, 0xbb, 0xb2, 0x16, 0xf1, 0xe7, 0x92, 0x71, 0xda, 0x7e, 0x68, 0x3a, 0xe0, 0xea, 0x89, 0x8d, 0xe0, 0x44, 0x48, 0x25, 0x92, 0x37, 0x54, 0x26, 0xf2, 0xab, 0xb3, 0x3b, 0xdb, 0xbb, 0x2b, 0x5c, 0xf5, 0xbc, 0xc7, 0x97, 0xdb, 0xc7, 0x49, 0x25, 0x7c, 0xc2, 0x80, 0x02, 0x69, 0xd4, 0xda, 0xda, 0xe1, 0x04, 0xf3, 0x19, 0xb8, 0xc9, 0xb2, 0xfb, 0x1e, 0x47, 0xa9, 0x0c, 0xa3, 0x48, 0xce, 0xc2, 0x9e, 0x3b, 0x28, 0x23, 0x5a, 0x20, 0x44, 0x77, 0x40, 0xe2, 0xd7, 0x20, 0xd5, 0x71, 0x6f, 0xd4, 0x3c, 0x68, 0x38, 0x9b, 0x89, 0x2e, 0x2d, 0xa8, 0x1f, 0x99, 0xb5, 0x8a, 0x66, 0x07, 0x59, 0x75, 0x9e, 0xf8, 0xd9, 0xbe, 0x85, 0x6a, 0x20, 0x92, 0x9d, 0xd2, 0x5e, 0x45, 0xc0, 0x60, 0xbe, 0x85, 0x0b, 0x84, 0x47, 0xf5, 0xa8, 0x43, 0x87, 0xf1, 0x21, 0x21, 0xb0, 0x3b, 0x04, 0x13, 0x16, 0x3e, 0xdf, 0xc3, 0xc6, 0x04, 0x73, 0xcd, 0x92, 0x76, 0xfb, 0xe7, 0x9c, 0xd3, 0x46, 0x11, 0x78, 0xca, 0x12, 0xd9, 0x4a, 0x35, 0xf1, 0x6e, 0x89, 0x8b, 0xe9, 0x7a, 0x04, 0xba, 0x18, 0x25, 0x7c, 0x9e, 0xe6, 0x4f, 0xc2, 0x56, 0x05, 0x72, 0xc3, 0x76, 0xee, 0x7d, 0x77, 0x19, 0x7a, 0x73, 0x2c, 0x81, 0xb8, 0xc7, 0xd9, 0x7f, 0x17, 0x5d, 0x30, 0xda, 0x77, 0x3c, 0x14, 0x88, 0xe8, 0xe4, 0xbf, 0xee, 0x21, 0x1c, 0x29, 0x4e, 0x58, 0xa8, 0x8a, 0x5c, 0xae, 0xa2, 0x1c, 0x7c, 0x25, 0x7c, 0x1c, 0x39, 0xa4, 0x28, 0x4b, 0x78, 0x52, 0xae, 0x2c, 0xbb, 0x5f, 0xbf, 0x51, 0x09, 0x20, 0x76, 0xb2, 0x7d, 0xb1, 0x63, 0x84, 0xc5, 0x49, 0x8a, 0x73, 0xdb, 0x76, 0x1d, 0x25, 0x31, 0xf2, 0x1e, 0x19, 0x38, 0xc8, 0x3b, 0x51, 0x3c, 0x13, 0x52, 0x84, 0xae, 0xc2, 0xe4, 0x8a, 0x57, 0x0d, 0xde, 0x8d, 0x18, 0x48, 0x9a, 0xbd, 0xbf, 0xf3, 0xea, 0x79, 0x17, 0x06, 0x96, 0x72, 0x08, 0x60, 0x95, 0xf9, 0x6f, 0x25, 0x0c, 0xb7, 0x9d, 0x98, 0x23, 0x01, 0xc8, 0x7a, 0xdb, 0x75, 0x63, 0x64, 0x14, 0x5e, 0x10, 0xf5, 0x16, 0x48, 0xbc, 0xc6, 0x7e, 0x24, 0xf3, 0xad, 0x57, 0x3f, 0x7d, 0x6c, 0xab, 0x18, 0x8c, 0x12, 0xc5, 0x0c, 0xd8, 0xb5, 0x1e, 0x43, 0x7c, 0x23, 0x17, 0x48, 0xba, 0x76, 0x3b, 0xd9, 0x2b, 0xae, 0x1b, 0xef, 0x58, 0xfa, 0x87, 0xad, 0x9b, 0x6d, 0xf9, 0xab, 0xa8, 0x3c, 0xfc, 0x59, 0x67, 0xa6, 0x2c, 0xc7, 0x75, 0xa4, 0x97, 0xca, 0x18, 0x18, 0x04, 0x2c, 0xb3, 0x0e, 0xa9, 0x69, 0x33, 0x67, 0xa2, 0xc6, 0xbc, 0x98, 0x48, 0x71, 0x11, 0x05, 0x30, 0xf6, 0xa9, 0x61, 0x40, 0x46, 0xf1, 0x41, 0x37, 0xd0, 0x6b, 0x7c, 0x1f, 0x03, 0x5c, 0xe9, 0xf4, 0x59, 0x1d, 0x35, 0xf0, 0x98, 0x42, 0x4a, 0x92, 0x2a, 0xc3, 0x9a, 0xb8, 0xa5\n"
  },
  {
    "path": "unittests/ASM/VEX/vphaddd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0xA6A8AAAC86888A8C\", \"0xE6E8EAECC6C8CACC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0xE6E8EAECC6C8CACC\", \"0xA6A8AAAC86888A8C\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xA6A8AAAC86888A8C\", \"0xE6E8EAECC6C8CACC\", \"0xA6A8AAAC86888A8C\", \"0xE6E8EAECC6C8CACC\"],\n    \"XMM5\": [\"0xE6E8EAECC6C8CACC\", \"0xA6A8AAAC86888A8C\", \"0xE6E8EAECC6C8CACC\", \"0xA6A8AAAC86888A8C\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\n; Memory Operands\nvphaddd xmm2, xmm0, [rdx + 32]\nvphaddd xmm3, xmm1, [rdx]\n\nvphaddd ymm4, ymm0, [rdx + 32]\nvphaddd ymm5, ymm1, [rdx]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vphaddsw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM4\":  [\"0x7FFF7FFF7FFF7FFF\", \"0x800080007FFF7FFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x800080007FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x71836D874331472D\", \"0x800080007FFF7FFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x800080007FFF7FFF\", \"0x71836D874331472D\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x7FFF7FFF7FFF7FFF\", \"0x71836D874331472D\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x800080007FFF7FFF\", \"0x800080007FFF7FFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x71836D874331472D\", \"0x800080007FFF7FFF\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps xmm0, [rdx]\nvmovaps xmm1, [rdx + 16]\nvmovaps xmm2, [rdx + 32]\nvmovaps xmm3, [rdx + 48]\n\nvphaddsw xmm4,  xmm0, [rdx + 16]\nvphaddsw xmm5,  xmm1, [rdx]\n\nvphaddsw xmm6,  xmm2, [rdx + 16]\nvphaddsw xmm7,  xmm3, [rdx + 32]\n\nvphaddsw xmm8,  xmm0, [rdx + 32]\nvphaddsw xmm9,  xmm1, [rdx + 48]\n\nvphaddsw xmm10, xmm2, [rdx + 48]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x7F7F7F7F7F7F7F7F\ndq 0x8080808080808080\n\ndq 0x2119221823172416\ndq 0x3941384237433644\n\ndq 0x7F7F7F7F7F7F7F7F\ndq 0x8080808080808080\n"
  },
  {
    "path": "unittests/ASM/VEX/vphaddsw_256.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM4\":  [\"0x7FFF7FFF7FFF7FFF\", \"0x800080007FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF80008000\"],\n    \"XMM5\":  [\"0x800080007FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF80008000\", \"0x7FFF7FFF7FFF7FFF\"],\n    \"XMM6\":  [\"0x71836D874331472D\", \"0x800080007FFF7FFF\", \"0x4331472D71836D87\", \"0x7FFF7FFF80008000\"],\n    \"XMM7\":  [\"0x800080007FFF7FFF\", \"0x71836D874331472D\", \"0x7FFF7FFF80008000\", \"0x4331472D71836D87\"],\n    \"XMM8\":  [\"0x7FFF7FFF7FFF7FFF\", \"0x71836D874331472D\", \"0x7FFF7FFF7FFF7FFF\", \"0x4331472D71836D87\"],\n    \"XMM9\":  [\"0x800080007FFF7FFF\", \"0x800080007FFF7FFF\", \"0x7FFF7FFF80008000\", \"0x7FFF7FFF80008000\"],\n    \"XMM10\": [\"0x71836D874331472D\", \"0x800080007FFF7FFF\", \"0x4331472D71836D87\", \"0x7FFF7FFF80008000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\nvmovaps ymm2, [rdx + 64]\nvmovaps ymm3, [rdx + 96]\n\nvphaddsw ymm4,  ymm0, [rdx + 32]\nvphaddsw ymm5,  ymm1, [rdx]\n\nvphaddsw ymm6,  ymm2, [rdx + 32]\nvphaddsw ymm7,  ymm3, [rdx + 64]\n\nvphaddsw ymm8,  ymm0, [rdx + 64]\nvphaddsw ymm9,  ymm1, [rdx + 96]\n\nvphaddsw ymm10, ymm2, [rdx + 96]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x4142434445464748\n\ndq 0x7F7F7F7F7F7F7F7F\ndq 0x8080808080808080\ndq 0x8080808080808080\ndq 0x7F7F7F7F7F7F7F7F\n\ndq 0x2119221823172416\ndq 0x3941384237433644\ndq 0x3941384237433644\ndq 0x2119221823172416\n\ndq 0x7F7F7F7F7F7F7F7F\ndq 0x8080808080808080\ndq 0x8080808080808080\ndq 0x7F7F7F7F7F7F7F7F\n"
  },
  {
    "path": "unittests/ASM/VEX/vphaddw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0xA4A6ACAE84868C8E\", \"0xE4E6ECEEC4C6CCCE\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0xE4E6ECEEC4C6CCCE\", \"0xA4A6ACAE84868C8E\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xA4A6ACAE84868C8E\", \"0xE4E6ECEEC4C6CCCE\", \"0xA4A6ACAE84868C8E\", \"0xE4E6ECEEC4C6CCCE\"],\n    \"XMM5\": [\"0xE4E6ECEEC4C6CCCE\", \"0xA4A6ACAE84868C8E\", \"0xE4E6ECEEC4C6CCCE\", \"0xA4A6ACAE84868C8E\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\n; Memory Operands\nvphaddw xmm2, xmm0, [rdx + 32]\nvphaddw xmm3, xmm1, [rdx]\n\nvphaddw ymm4, ymm0, [rdx + 32]\nvphaddw ymm5, ymm1, [rdx]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vphminposuw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000000000001\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x0000000000030001\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x0000000000070001\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000000010001\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvphminposuw xmm0, [rdx + 16 * 0]\nvphminposuw xmm1, [rdx + 16 * 1]\nvphminposuw xmm2, [rdx + 16 * 2]\nvphminposuw xmm3, [rdx + 16 * 3]\n\nhlt\n\nalign 16\n.data:\n\n; Pos 0\ndq 0x0004000300020001\ndq 0x0008000700060005\n\n; Pos 3\ndq 0x0001000300020004\ndq 0x0008000700060005\n\n; Pos 7\ndq 0x0008000300020004\ndq 0x0001000700060005\n\n; Pos 7 & 3 & 2\n; Should return lowest position\ndq 0x0008000100010004\ndq 0x0001000700060005\n"
  },
  {
    "path": "unittests/ASM/VEX/vphsubd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0xE403E40424042404\", \"0x0404040404040404\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x0404040404040404\", \"0xE403E40424042404\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xE403E40424042404\", \"0x0404040404040404\", \"0x1111111111111111\", \"0xEEEEEEEFEEEEEEEF\"],\n    \"XMM5\": [\"0x0404040404040404\", \"0xE403E40424042404\", \"0xEEEEEEEFEEEEEEEF\", \"0x1111111111111111\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvphsubd xmm2, xmm0, [rdx + 32]\nvphsubd xmm3, xmm1, [rdx]\n\nvphsubd ymm4, ymm0, [rdx + 32]\nvphsubd ymm5, ymm1, [rdx]\n\nhlt\n\nalign 32\n.data:\ndq 0x5142634475468748\ndq 0x5152435435562758\ndq 0xCCCCCCCCDDDDDDDD\ndq 0xEEEEEEEEFFFFFFFF\n\ndq 0x6172637465766778\ndq 0x7162736475667768\ndq 0x9999999988888888\ndq 0x7777777766666666\n"
  },
  {
    "path": "unittests/ASM/VEX/vphsubsw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM4\":  [\"0x0202020202020202\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000000000000000\", \"0x0202020202020202\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0xFF01FF0100FF00FF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0xFF01FF0100FF00FF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x0202020202020202\", \"0xFF01FF0100FF00FF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0xFF01FF0100FF00FF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x800080007FFF7FFF\", \"0x800080007FFF7FFF\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\nvmovaps ymm2, [rdx + 32 * 2]\nvmovaps ymm3, [rdx + 32 * 3]\n\nvphsubsw xmm4, xmm0, [rdx + 32]\nvphsubsw xmm5, xmm1, [rdx]\n\nvphsubsw xmm6, xmm2, [rdx + 32]\nvphsubsw xmm7, xmm1, [rdx + 32 * 2]\n\nvphsubsw xmm8, xmm0, [rdx + 32 * 2]\nvphsubsw xmm9, xmm1, [rdx + 32]\n\nvphsubsw xmm10, xmm2, [rdx + 32]\nvphsubsw xmm11, xmm3, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\ndq 0x7F7F7F7F7F7F7F7F\ndq 0x8080808080808080\ndq 0x8080808080808080\ndq 0x7F7F7F7F7F7F7F7F\n\ndq 0x2119221823172416\ndq 0x3941384237433644\ndq 0x4598654387293847\ndq 0x7620937492893892\n\ndq 0x00007FFF00007FFF\ndq 0x7FFFFFFF7FFFFFFF\ndq 0x7FFFFFFF7FFFFFFF\ndq 0x00007FFF00007FFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vphsubsw_256.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM4\":  [\"0x0202020202020202\", \"0x0000000000000000\", \"0x0202020202020202\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000000000000000\", \"0x0202020202020202\", \"0x0000000000000000\", \"0x0202020202020202\"],\n    \"XMM6\":  [\"0xFF01FF0100FF00FF\", \"0x0000000000000000\", \"0x80007FFF1FAB7FFF\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0xFF01FF0100FF00FF\", \"0x0000000000000000\", \"0x80007FFF1FAB7FFF\"],\n    \"XMM8\":  [\"0x0202020202020202\", \"0xFF01FF0100FF00FF\", \"0x0202020202020202\", \"0x80007FFF1FAB7FFF\"],\n    \"XMM9\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0xFF01FF0100FF00FF\", \"0x0000000000000000\", \"0x80007FFF1FAB7FFF\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x800080007FFF7FFF\", \"0x800080007FFF7FFF\", \"0x7FFF7FFF80008000\", \"0x7FFF7FFF80008000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\nvmovaps ymm2, [rdx + 32 * 2]\nvmovaps ymm3, [rdx + 32 * 3]\n\nvphsubsw ymm4, ymm0, [rdx + 32]\nvphsubsw ymm5, ymm1, [rdx]\n\nvphsubsw ymm6, ymm2, [rdx + 32]\nvphsubsw ymm7, ymm1, [rdx + 32 * 2]\n\nvphsubsw ymm8, ymm0, [rdx + 32 * 2]\nvphsubsw ymm9, ymm1, [rdx + 32]\n\nvphsubsw ymm10, ymm2, [rdx + 32]\nvphsubsw ymm11, ymm3, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\ndq 0x7F7F7F7F7F7F7F7F\ndq 0x8080808080808080\ndq 0x8080808080808080\ndq 0x7F7F7F7F7F7F7F7F\n\ndq 0x2119221823172416\ndq 0x3941384237433644\ndq 0x4598654387293847\ndq 0x7620937492893892\n\ndq 0x00007FFF00007FFF\ndq 0x7FFFFFFF7FFFFFFF\ndq 0x7FFFFFFF7FFFFFFF\ndq 0x00007FFF00007FFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vphsubw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0xF202F20212021202\", \"0x0202020202020202\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x0202020202020202\", \"0xF202F20212021202\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xF202F20212021202\", \"0x0202020202020202\", \"0x44457778CCCD1111\", \"0x11111111EEEFEEEF\"],\n    \"XMM5\": [\"0x0202020202020202\", \"0xF202F20212021202\", \"0x11111111EEEFEEEF\", \"0x44457778CCCD1111\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvphsubw xmm2, xmm0, [rdx + 32]\nvphsubw xmm3, xmm1, [rdx]\n\nvphsubw ymm4, ymm0, [rdx + 32]\nvphsubw ymm5, ymm1, [rdx]\n\nhlt\n\nalign 32\n.data:\ndq 0x5142634475468748\ndq 0x5152435435562758\ndq 0xFFFFCCCCEEEEFFFF\ndq 0xEEEE3333EEEE6666\n\ndq 0x6172637465766778\ndq 0x7162736475667768\ndq 0x9999888877776666\ndq 0x1111222233334444\n"
  },
  {
    "path": "unittests/ASM/VEX/vpinsrb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM3\": [\"0x48510F254D2FA47F\", \"0x2B5774313A974886\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x006B6B6B6B6B6B6B\", \"0x6B00000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvpxor xmm2, xmm2, xmm2\n\nvpinsrb xmm3, xmm1, [rdx + 8 * 0 + 0], 0x00\nvpinsrb xmm3, xmm3, [rdx + 8 * 0 + 1], 0x01\nvpinsrb xmm3, xmm3, [rdx + 8 * 0 + 2], 0x02\nvpinsrb xmm3, xmm3, [rdx + 8 * 0 + 3], 0x03\nvpinsrb xmm3, xmm3, [rdx + 8 * 0 + 4], 0x04\nvpinsrb xmm3, xmm3, [rdx + 8 * 0 + 5], 0x05\nvpinsrb xmm3, xmm3, [rdx + 8 * 0 + 6], 0x06\nvpinsrb xmm3, xmm3, [rdx + 8 * 0 + 7], 0x07\nvpinsrb xmm3, xmm3, [rdx + 8 * 1 + 0], 0x08\nvpinsrb xmm3, xmm3, [rdx + 8 * 1 + 1], 0x09\nvpinsrb xmm3, xmm3, [rdx + 8 * 1 + 2], 0x0A\nvpinsrb xmm3, xmm3, [rdx + 8 * 1 + 3], 0x0B\nvpinsrb xmm3, xmm3, [rdx + 8 * 1 + 4], 0x0C\nvpinsrb xmm3, xmm3, [rdx + 8 * 1 + 5], 0x0D\nvpinsrb xmm3, xmm3, [rdx + 8 * 1 + 6], 0x0E\nvpinsrb xmm3, xmm3, [rdx + 8 * 1 + 7], 0x0F\nvpinsrb xmm4, xmm2, [rdx + 8 * 2 + 0], 0xFF\nmov rax, [rdx + 16]\n\nvpinsrb xmm4, xmm4, eax, 0x00\nvpinsrb xmm4, xmm4, eax, 0x01\nvpinsrb xmm4, xmm4, eax, 0x02\nvpinsrb xmm4, xmm4, eax, 0x03\nvpinsrb xmm4, xmm4, eax, 0x04\nvpinsrb xmm4, xmm4, eax, 0x05\nvpinsrb xmm4, xmm4, eax, 0x06\n\nhlt\n\nalign 32\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/VEX/vpinsrd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\": [\"0xB615B9533DE8AD09\", \"0xB76472A37404B890\", \"0x24426B4C72F110AD\", \"0x8A6789F2D415A567\"],\n    \"XMM2\": [\"0x48510F254D2FA47F\", \"0x2B5774313A974886\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x3DE8AD093DE8AD09\", \"0x3DE8AD093DE8AD09\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x0000000000000000\", \"0x1F6DE86B00000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvpxor xmm4, xmm4, xmm4\nvmovaps ymm1, [rdx + 32]\n\nvpinsrd xmm2, xmm1, [rdx +  0], 0x00\nvpinsrd xmm2, xmm2, [rdx +  4], 0x01\nvpinsrd xmm2, xmm2, [rdx +  8], 0x02\nvpinsrd xmm2, xmm2, [rdx + 12], 0x03\nvpinsrd xmm4, xmm4, [rdx + 16], 0xFF\nmov rax, [rdx + 32]\n\nvpinsrd xmm3, xmm3, eax, 0x00\nvpinsrd xmm3, xmm3, eax, 0x01\nvpinsrd xmm3, xmm3, eax, 0x02\nvpinsrd xmm3, xmm3, eax, 0x03\n\nhlt\n\nalign 32\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/VEX/vpinsrq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\": [\"0x8996F88178236612\", \"0x19A26B823D3CA2A9\", \"0x00F658AB689712B0\", \"0xC97D9D031ED21972\"],\n    \"XMM2\": [\"0x0000000000000000\", \"0xB615B9533DE8AD09\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x8996F88178236612\", \"0x8996F88178236612\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x48510F254D2FA47F\", \"0x2B5774313A974886\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvpxor xmm2, xmm2, xmm2\nvmovaps ymm1, [rdx + 64]\n\nvpinsrq xmm4, xmm1, [rdx +  0], 0x00\nvpinsrq xmm4, xmm4, [rdx +  8], 0x01\nvpinsrq xmm2, xmm2, [rdx + 32], 0xFF\nmov rax, [rdx + 64]\n\nvpinsrq xmm3, xmm3, rax, 0x00\nvpinsrq xmm3, xmm3, rax, 0x01\n\nhlt\n\nalign 32\n; 256bytes of random data\n.data:\ndb 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b\ndb 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67\ndb 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7\ndb 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a\ndb 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19\ndb 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9\ndb 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2\ndb 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4\ndb 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c\ndb 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76\ndb 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca\ndb 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65\ndb 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10\ndb 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e\ndb 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07\ndb 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09\n"
  },
  {
    "path": "unittests/ASM/VEX/vpinsrw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x4142434445467778\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x4142434477784748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x4142777845464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x7778434445464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x4142434445464748\", \"0x5152535455567778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x4142434445464748\", \"0x5152535477785758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x4142434445464748\", \"0x5152777855565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x4142434445464748\", \"0x7778535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x4142434445467778\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x4142434477784748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x4142777845464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x7778434445464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x4142434445464748\", \"0x5152535455567778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x4142434445464748\", \"0x5152535477785758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM14\": [\"0x4142434445464748\", \"0x5152777855565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM15\": [\"0x4142434445464748\", \"0x7778535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nmov rax, 0x7172737475767778\n\nvmovapd ymm0, [rdx]\n\nvpinsrw xmm1, xmm0, eax, 1\nvpinsrw xmm2, xmm0, eax, 2\nvpinsrw xmm3, xmm0, eax, 3\nvpinsrw xmm4, xmm0, eax, 4\nvpinsrw xmm5, xmm0, eax, 5\nvpinsrw xmm6, xmm0, eax, 6\nvpinsrw xmm7, xmm0, eax, 7\n\nvpinsrw xmm8,  xmm0, [rdx + 32], 0\nvpinsrw xmm9,  xmm0, [rdx + 32], 1\nvpinsrw xmm10, xmm0, [rdx + 32], 2\nvpinsrw xmm11, xmm0, [rdx + 32], 3\nvpinsrw xmm12, xmm0, [rdx + 32], 4\nvpinsrw xmm13, xmm0, [rdx + 32], 5\nvpinsrw xmm14, xmm0, [rdx + 32], 6\nvpinsrw xmm15, xmm0, [rdx + 32], 7\n\nvpinsrw xmm0, xmm0, eax, 0\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmaddubsw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM5\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0xFE02FE02FE02FE02\", \"0xFE02FE02FE02FE02\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x7E027E027E027E02\", \"0x7E027E027E027E02\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x057306BC07B808B8\", \"0xBC53BC0EBAE5BA2E\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0xA473A5BCA6B8A7B8\", \"0x0553070E07E5092E\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps xmm0, [rdx]\nvmovaps xmm1, [rdx + 16]\nvmovaps xmm2, [rdx + 16 * 2]\nvmovaps xmm3, [rdx + 16 * 3]\nvmovaps xmm4, [rdx + 16 * 4]\n\n; Zero\nvpmaddubsw xmm5, xmm0, [rdx]\n\n; -1\nvpmaddubsw xmm6, xmm1, [rdx + 16]\n\n; 127\nvpmaddubsw xmm7, xmm2, [rdx + 16 * 2]\n\n; 255 and 127\nvpmaddubsw xmm8, xmm1, [rdx + 16 * 2]\n\n; Mixture\nvpmaddubsw xmm9,  xmm3, [rdx + 16 * 4]\nvpmaddubsw xmm10, xmm4, [rdx + 16 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq -1\ndq -1\n\ndq 0x7F7F7F7F7F7F7F7F\ndq 0x7F7F7F7F7F7F7F7F\n\ndq 0x8141824383448445\ndq 0x21F223F323F424F5\n\ndq 0xE251E352E453E554\ndq 0x71A972A873A774A6\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmaddubsw_256.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM5\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0xFE02FE02FE02FE02\", \"0xFE02FE02FE02FE02\", \"0xFE02FE02FE02FE02\", \"0xFE02FE02FE02FE02\"],\n    \"XMM7\":  [\"0x7E027E027E027E02\", \"0x7E027E027E027E02\", \"0x7E027E027E027E02\", \"0x7E027E027E027E02\"],\n    \"XMM8\":  [\"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\", \"0x7FFF7FFF7FFF7FFF\"],\n    \"XMM9\":  [\"0x057306BC07B808B8\", \"0xBC53BC0EBAE5BA2E\", \"0x282026EC08D41910\", \"0x33B92A54171B2224\"],\n    \"XMM10\": [\"0xA473A5BCA6B8A7B8\", \"0x0553070E07E5092E\", \"0xF02026EC0CD41910\", \"0xEBB92A54171BDF24\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\nvmovaps ymm2, [rdx + 32 * 2]\nvmovaps ymm3, [rdx + 32 * 3]\nvmovaps ymm4, [rdx + 32 * 4]\n\n; Zero\nvpmaddubsw ymm5, ymm0, [rdx]\n\n; -1\nvpmaddubsw ymm6, ymm1, [rdx + 32]\n\n; 127\nvpmaddubsw ymm7, ymm2, [rdx + 32 * 2]\n\n; 255 and 127\nvpmaddubsw ymm8, ymm1, [rdx + 32 * 2]\n\n; Mixture\nvpmaddubsw ymm9,  ymm3, [rdx + 32 * 4]\nvpmaddubsw ymm10, ymm4, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq -1\ndq -1\ndq -1\ndq -1\n\ndq 0x7F7F7F7F7F7F7F7F\ndq 0x7F7F7F7F7F7F7F7F\ndq 0x7F7F7F7F7F7F7F7F\ndq 0x7F7F7F7F7F7F7F7F\n\ndq 0x8141824383448445\ndq 0x21F223F323F424F5\ndq 0x3289435639045828\ndq 0x7380543834230480\n\ndq 0xE251E352E453E554\ndq 0x71A972A873A774A6\ndq 0x3438404230894802\ndq 0x2348337523752943\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmaddwd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x32F08FD4383B2524\", \"0x499DE6944FEA7CE4\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x32F08FD4383B2524\", \"0x499DE6944FEA7CE4\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x32F08FD4383B2524\", \"0x499DE6944FEA7CE4\", \"0x41FD357ADA74036A\", \"0xCCCC999AE38E1C72\"],\n    \"XMM5\": [\"0x32F08FD4383B2524\", \"0x499DE6944FEA7CE4\", \"0x41FD357ADA74036A\", \"0xCCCC999AE38E1C72\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvpmaddwd xmm2, xmm0, [rdx + 32]\nvpmaddwd xmm3, xmm0, xmm1\n\nvpmaddwd ymm4, ymm0, [rdx + 32]\nvpmaddwd ymm5, ymm0, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6666777788889999\ndq 0x5555444433332222\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x5555444433332222\ndq 0xAAAAAAAAAAAAAAAA\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmaskmovd_load.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0x0868C3F30AED56E0\", \"0x80FCE9E284E6E6DE\", \"0x8DDDDDDD8DDDDDDD\", \"0x0CCCCCCC0CCCCCCC\"],\n      \"XMM1\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\"],\n      \"XMM3\": [\"0x0000000000000000\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n      \"XMM4\": [\"0x0000000000000000\", \"0x9B80767F1E6A060F\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM7\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM8\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32]\nvmovaps ymm1, [rdx + 64]\nvmovaps ymm2, [rdx + 96]\n\nvpmaskmovd ymm3, ymm0, [rdx]\nvpmaskmovd xmm4, xmm0, [rdx]\n\nvpmaskmovd ymm5, ymm1, [rdx]\nvpmaskmovd xmm6, xmm1, [rdx]\n\nvpmaskmovd ymm7, ymm2, [rdx]\nvpmaskmovd xmm8, xmm2, [rdx]\n\nhlt\n\nalign 32\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\n; Disastrously organized mask (sign mask [0, 0, 1, 1, 1, 1, 0, 0])\ndq 0x0868C3F30AED56E0\ndq 0x80FCE9E284E6E6DE\ndq 0x8DDDDDDD8DDDDDDD\ndq 0x0CCCCCCC0CCCCCCC\n\n; No masking at all. Should not touch memory at all.\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n; Select all elements\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmaskmovd_store.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0x0868C3F30AED56E0\", \"0x80FCE9E284E6E6DE\", \"0x8DDDDDDD8DDDDDDD\", \"0x0CCCCCCC0CCCCCCC\"],\n      \"XMM1\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\"],\n      \"XMM3\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM4\": [\"0xFFFFFFFFFFFFFFFF\", \"0x9B80767F1E6A060F\", \"0xDDDDDDDDDDDDDDDD\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM5\": [\"0xFFFFFFFFFFFFFFFF\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM6\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM7\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM8\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM9\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32]\nvmovaps ymm1, [rdx + 64]\nvmovaps ymm2, [rdx + 96]\nvmovaps ymm3, [rdx]\n\nvpmaskmovd [rel .scratch1], ymm0, ymm3\nvpmaskmovd [rel .scratch2], xmm0, xmm3\n\nvpmaskmovd [rel .scratch3], ymm1, ymm3\nvpmaskmovd [rel .scratch4], xmm1, xmm3\n\nvpmaskmovd [rel .scratch5], ymm2, ymm3\nvpmaskmovd [rel .scratch6], xmm2, xmm3\n\n; Now reload to verify results\nvmovaps ymm4, [rel .scratch1]\nvmovaps ymm5, [rel .scratch2]\nvmovaps ymm6, [rel .scratch3]\nvmovaps ymm7, [rel .scratch4]\nvmovaps ymm8, [rel .scratch5]\nvmovaps ymm9, [rel .scratch6]\n\nhlt\n\nalign 4096\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xEEEEEEEEEEEEEEEE\n\n; Disastrously organized mask (sign mask [0, 0, 1, 1, 1, 1, 0, 0])\ndq 0x0868C3F30AED56E0\ndq 0x80FCE9E284E6E6DE\ndq 0x8DDDDDDD8DDDDDDD\ndq 0x0CCCCCCC0CCCCCCC\n\n; No masking at all. Should not touch memory at all.\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n; Select all elements\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\n\n.scratch1:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch2:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch3:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch4:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch5:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch6:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmaskmovq_load.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0x8868C3F30AED56E0\", \"0x10FCE9E284E6E6DE\", \"0x1DDDDDDD8DDDDDDD\", \"0x8CCCCCCC0CCCCCCC\"],\n      \"XMM1\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\"],\n      \"XMM3\": [\"0xA76C4F06A12BFCE0\", \"0x0000000000000000\", \"0x0000000000000000\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM4\": [\"0xA76C4F06A12BFCE0\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM5\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM6\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM7\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM8\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32]\nvmovaps ymm1, [rdx + 64]\nvmovaps ymm2, [rdx + 96]\n\nvpmaskmovq ymm3, ymm0, [rdx]\nvpmaskmovq xmm4, xmm0, [rdx]\n\nvpmaskmovq ymm5, ymm1, [rdx]\nvpmaskmovq xmm6, xmm1, [rdx]\n\nvpmaskmovq ymm7, ymm2, [rdx]\nvpmaskmovq xmm8, xmm2, [rdx]\n\nhlt\n\nalign 32\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\n; Disastrously organized mask (sign mask [1, 0, 0, 1])\ndq 0x8868C3F30AED56E0\ndq 0x10FCE9E284E6E6DE\ndq 0x1DDDDDDD8DDDDDDD\ndq 0x8CCCCCCC0CCCCCCC\n\n; No masking at all. Should not touch memory at all.\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n; Select all elements\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmaskmovq_store.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n      \"XMM0\": [\"0x8868C3F30AED56E0\", \"0x10FCE9E284E6E6DE\", \"0x1DDDDDDD8DDDDDDD\", \"0x8CCCCCCC0CCCCCCC\"],\n      \"XMM1\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n      \"XMM2\": [\"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\", \"0x8000000080000000\"],\n      \"XMM3\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM4\": [\"0xA76C4F06A12BFCE0\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM5\": [\"0xA76C4F06A12BFCE0\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM6\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM7\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n      \"XMM8\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEEEEEEEEEEEEE\"],\n      \"XMM9\": [\"0xA76C4F06A12BFCE0\", \"0x9B80767F1E6A060F\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32]\nvmovaps ymm1, [rdx + 64]\nvmovaps ymm2, [rdx + 96]\nvmovaps ymm3, [rdx]\n\nvpmaskmovq [rel .scratch1], ymm0, ymm3\nvpmaskmovq [rel .scratch2], xmm0, xmm3\n\nvpmaskmovq [rel .scratch3], ymm1, ymm3\nvpmaskmovq [rel .scratch4], xmm1, xmm3\n\nvpmaskmovq [rel .scratch5], ymm2, ymm3\nvpmaskmovq [rel .scratch6], xmm2, xmm3\n\n; Now reload to verify results\nvmovaps ymm4, [rel .scratch1]\nvmovaps ymm5, [rel .scratch2]\nvmovaps ymm6, [rel .scratch3]\nvmovaps ymm7, [rel .scratch4]\nvmovaps ymm8, [rel .scratch5]\nvmovaps ymm9, [rel .scratch6]\n\nhlt\n\nalign 4096\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xDDDDDDDDDDDDDDDD\ndq 0xEEEEEEEEEEEEEEEE\n\n; Disastrously organized mask (sign mask [1, 0, 0, 1])\ndq 0x8868C3F30AED56E0\ndq 0x10FCE9E284E6E6DE\ndq 0x1DDDDDDD8DDDDDDD\ndq 0x8CCCCCCC0CCCCCCC\n\n; No masking at all. Should not touch memory at all.\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\n; Select all elements\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\ndq 0x8000000080000000\n\n.scratch1:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch2:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch3:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch4:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch5:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\n.scratch6:\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmaxsb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x8062636465666768\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x4162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM4\": [\"0x4162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM6\": [\"0x4162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM7\": [\"0x4162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpmaxsb xmm2, xmm0, xmm1\nvpmaxsb ymm3, ymm0, ymm1\n\nvpmaxsb xmm4, xmm0, [rdx + 32]\nvpmaxsb ymm5, ymm0, [rdx + 32]\n\n; Some funky combinations for testing fast paths\n; Related to SVE sources aliasing the destination\nvmovapd ymm6, ymm0\nvpmaxsb ymm6, ymm6, ymm5\n\nvmovapd ymm7, ymm0\nvpmaxsb ymm7, ymm5, ymm7\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\n\ndq 0x8062636465666768\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmaxsd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x8000000065666768\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x4142434465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM4\": [\"0x4142434465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4142434465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM6\": [\"0x4142434465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM7\": [\"0x4142434465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpmaxsd xmm2, xmm0, xmm1\nvpmaxsd ymm3, ymm0, ymm1\n\nvpmaxsd xmm4, xmm0, [rdx + 32]\nvpmaxsd ymm5, ymm0, [rdx + 32]\n\n; Some funky combinations for testing fast paths\n; Related to SVE sources aliasing the destination\nvmovapd ymm6, ymm0\nvpmaxsd ymm6, ymm6, ymm5\n\nvmovapd ymm7, ymm0\nvpmaxsd ymm7, ymm5, ymm7\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\n\ndq 0x8000000065666768\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmaxsw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x8000636465666768\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x4142636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM4\": [\"0x4142636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4142636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM6\": [\"0x4142636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM7\": [\"0x4142636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpmaxsw xmm2, xmm0, xmm1\nvpmaxsw ymm3, ymm0, ymm1\n\nvpmaxsw xmm4, xmm0, [rdx + 32]\nvpmaxsw ymm5, ymm0, [rdx + 32]\n\n; Some funky combinations for testing fast paths\n; Related to SVE sources aliasing the destination\nvmovapd ymm6, ymm0\nvpmaxsw ymm6, ymm6, ymm5\n\nvmovapd ymm7, ymm0\nvpmaxsw ymm7, ymm5, ymm7\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\n\ndq 0x8000636465666768\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmaxub.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x8182838485868788\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x8182838485868788\"],\n    \"XMM4\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x8182838485868788\"],\n    \"XMM6\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x8182838485868788\"],\n    \"XMM7\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x8182838485868788\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpmaxub xmm2, xmm0, xmm1\nvpmaxub ymm3, ymm0, ymm1\n\nvpmaxub xmm4, xmm0, [rdx + 32]\nvpmaxub ymm5, ymm0, [rdx + 32]\n\n; Some funky combinations for testing fast paths\n; Related to SVE sources aliasing the destination\nvmovapd ymm6, ymm0\nvpmaxub ymm6, ymm6, ymm5\n\nvmovapd ymm7, ymm0\nvpmaxub ymm7, ymm5, ymm7\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x8182838485868788\n\ndq 0x6162636465666768\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmaxud.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x8172737485767778\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x8172737485767778\"],\n    \"XMM4\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x8172737485767778\"],\n    \"XMM6\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x8172737485767778\"],\n    \"XMM7\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x8172737485767778\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpmaxud xmm2, xmm0, xmm1\nvpmaxud ymm3, ymm0, ymm1\n\nvpmaxud xmm4, xmm0, [rdx + 32]\nvpmaxud ymm5, ymm0, [rdx + 32]\n\n; Some funky combinations for testing fast paths\n; Related to SVE sources aliasing the destination\nvmovapd ymm6, ymm0\nvpmaxud ymm6, ymm6, ymm5\n\nvmovapd ymm7, ymm0\nvpmaxud ymm7, ymm5, ymm7\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x8172737485767778\n\ndq 0x6162636465666768\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmaxuw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x8172837485768778\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x8172837485768778\"],\n    \"XMM4\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x8172837485768778\"],\n    \"XMM6\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x8172837485768778\"],\n    \"XMM7\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x8172837485768778\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpmaxuw xmm2, xmm0, xmm1\nvpmaxuw ymm3, ymm0, ymm1\n\nvpmaxuw xmm4, xmm0, [rdx + 32]\nvpmaxuw ymm5, ymm0, [rdx + 32]\n\n; Some funky combinations for testing fast paths\n; Related to SVE sources aliasing the destination\nvmovapd ymm6, ymm0\nvpmaxuw ymm6, ymm6, ymm5\n\nvmovapd ymm7, ymm0\nvpmaxuw ymm7, ymm5, ymm7\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x8172837485768778\n\ndq 0x6162636465666768\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpminsb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x8062636465666768\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x8042434445464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x8042434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x8042434445464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x8042434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM6\": [\"0x8042434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM7\": [\"0x8042434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpminsb xmm2, xmm0, xmm1\nvpminsb ymm3, ymm0, ymm1\n\nvpminsb xmm4, xmm0, [rdx + 32]\nvpminsb ymm5, ymm0, [rdx + 32]\n\n; Some funky combinations for testing fast paths\n; Related to SVE sources aliasing the destination\nvmovapd ymm6, ymm0\nvpminsb ymm6, ymm6, ymm5\n\nvmovapd ymm7, ymm0\nvpminsb ymm7, ymm5, ymm7\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\n\ndq 0x8062636465666768\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpminsd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x8000000065666768\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x8000000045464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x8000000045464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x8000000045464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x8000000045464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM6\": [\"0x8000000045464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM7\": [\"0x8000000045464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpminsd xmm2, xmm0, xmm1\nvpminsd ymm3, ymm0, ymm1\n\nvpminsd xmm4, xmm0, [rdx + 32]\nvpminsd ymm5, ymm0, [rdx + 32]\n\n; Some funky combinations for testing fast paths\n; Related to SVE sources aliasing the destination\nvmovapd ymm6, ymm0\nvpminsd ymm6, ymm6, ymm5\n\nvmovapd ymm7, ymm0\nvpminsd ymm7, ymm5, ymm7\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\n\ndq 0x8000000065666768\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpminsw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x8000636465666768\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x8000434445464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x8000434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x8000434445464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x8000434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM6\": [\"0x8000434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM7\": [\"0x8000434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpminsw xmm2, xmm0, xmm1\nvpminsw ymm3, ymm0, ymm1\n\nvpminsw xmm4, xmm0, [rdx + 32]\nvpminsw ymm5, ymm0, [rdx + 32]\n\n; Some funky combinations for testing fast paths\n; Related to SVE sources aliasing the destination\nvmovapd ymm6, ymm0\nvpminsw ymm6, ymm6, ymm5\n\nvmovapd ymm7, ymm0\nvpminsw ymm7, ymm5, ymm7\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\n\ndq 0x8000636465666768\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpminub.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM6\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM7\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpminub xmm2, xmm0, xmm1\nvpminub ymm3, ymm0, ymm1\n\nvpminub xmm4, xmm0, [rdx + 32]\nvpminub ymm5, ymm0, [rdx + 32]\n\n; Some funky combinations for testing fast paths\n; Related to SVE sources aliasing the destination\nvmovapd ymm6, ymm0\nvpminub ymm6, ymm6, ymm5\n\nvmovapd ymm7, ymm0\nvpminub ymm7, ymm5, ymm7\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\n\ndq 0x6162636465666768\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpminud.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM6\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM7\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpminud xmm2, xmm0, xmm1\nvpminud ymm3, ymm0, ymm1\n\nvpminud xmm4, xmm0, [rdx + 32]\nvpminud ymm5, ymm0, [rdx + 32]\n\n; Some funky combinations for testing fast paths\n; Related to SVE sources aliasing the destination\nvmovapd ymm6, ymm0\nvpminud ymm6, ymm6, ymm5\n\nvmovapd ymm7, ymm0\nvpminud ymm7, ymm5, ymm7\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\n\ndq 0x6162636465666768\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpminuw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM6\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM7\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpminuw xmm2, xmm0, xmm1\nvpminuw ymm3, ymm0, ymm1\n\nvpminuw xmm4, xmm0, [rdx + 32]\nvpminuw ymm5, ymm0, [rdx + 32]\n\n; Some funky combinations for testing fast paths\n; Related to SVE sources aliasing the destination\nvmovapd ymm6, ymm0\nvpminuw ymm6, ymm6, ymm5\n\nvmovapd ymm7, ymm0\nvpminuw ymm7, ymm5, ymm7\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\n\ndq 0x6162636465666768\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmovmskb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x0\",\n    \"RBX\": \"0x0\",\n    \"RCX\": \"0xFFFF\",\n    \"RSI\": \"0xF0F0\",\n    \"RDI\": \"0x55AA\",\n    \"R8\":  \"0x0\",\n    \"R9\":  \"0x0\",\n    \"R10\": \"0xFFFFFFFF\",\n    \"R11\": \"0xF0F0F0F0\",\n    \"R12\": \"0x55AA55AA\",\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM3\": [\"0x8080808000000000\", \"0x8080808000000000\", \"0x8080808000000000\", \"0x8080808000000000\"],\n    \"XMM4\": [\"0x8000800080008000\", \"0x0080008000800080\", \"0x8000800080008000\", \"0x0080008000800080\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\n\nvpmovmskb eax, xmm0\nvpmovmskb ebx, xmm1\nvpmovmskb ecx, xmm2\nvpmovmskb esi, xmm3\nvpmovmskb edi, xmm4\n\nvpmovmskb r8,  ymm0\nvpmovmskb r9,  ymm1\nvpmovmskb r10, ymm2\nvpmovmskb r11, ymm3\nvpmovmskb r12, ymm4\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x8080808000000000\ndq 0x8080808000000000\ndq 0x8080808000000000\ndq 0x8080808000000000\n\ndq 0x8000800080008000\ndq 0x0080008000800080\ndq 0x8000800080008000\ndq 0x0080008000800080\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmovsxbd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434485868788\", \"0x5152535455565758\", \"0x4142434485868788\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0xFFFFFF87FFFFFF88\", \"0xFFFFFF85FFFFFF86\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0xFFFFFF87FFFFFF88\", \"0xFFFFFF85FFFFFF86\", \"0x0000004300000044\", \"0x0000004100000042\"],\n    \"XMM3\": [\"0xFFFFFF87FFFFFF88\", \"0xFFFFFF85FFFFFF86\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xFFFFFF87FFFFFF88\", \"0xFFFFFF85FFFFFF86\", \"0x0000004300000044\", \"0x0000004100000042\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\n; Memory operands\nvpmovsxbd xmm1, [rdx]\nvpmovsxbd ymm2, [rdx]\n\n; Register only\nvpmovsxbd xmm3, xmm0\nvpmovsxbd ymm4, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434485868788\ndq 0x5152535455565758\ndq 0x4142434485868788\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmovsxbq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434485868788\", \"0x5152535455565758\", \"0x4142434485868788\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0xFFFFFFFFFFFFFF88\", \"0xFFFFFFFFFFFFFF87\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0xFFFFFFFFFFFFFF88\", \"0xFFFFFFFFFFFFFF87\", \"0xFFFFFFFFFFFFFF86\", \"0xFFFFFFFFFFFFFF85\"],\n    \"XMM3\": [\"0xFFFFFFFFFFFFFF88\", \"0xFFFFFFFFFFFFFF87\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xFFFFFFFFFFFFFF88\", \"0xFFFFFFFFFFFFFF87\", \"0xFFFFFFFFFFFFFF86\", \"0xFFFFFFFFFFFFFF85\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\n; Memory operands\nvpmovsxbq xmm1, [rdx]\nvpmovsxbq ymm2, [rdx]\n\n; Register only\nvpmovsxbq xmm3, xmm0\nvpmovsxbq ymm4, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434485868788\ndq 0x5152535455565758\ndq 0x4142434485868788\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmovsxbw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434485868788\", \"0x5152535455565758\", \"0x4142434485868788\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0xFF85FF86FF87FF88\", \"0x0041004200430044\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0xFF85FF86FF87FF88\", \"0x0041004200430044\", \"0x0055005600570058\", \"0x0051005200530054\"],\n    \"XMM3\": [\"0xFF85FF86FF87FF88\", \"0x0041004200430044\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xFF85FF86FF87FF88\", \"0x0041004200430044\", \"0x0055005600570058\", \"0x0051005200530054\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\n; Memory operands\nvpmovsxbw xmm1, [rdx]\nvpmovsxbw ymm2, [rdx]\n\n; Register only\nvpmovsxbw xmm3, xmm0\nvpmovsxbw ymm4, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434485868788\ndq 0x5152535455565758\ndq 0x4142434485868788\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmovsxdq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434485868788\", \"0x5152535455565758\", \"0x4142434485868788\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0xFFFFFFFF85868788\", \"0x0000000041424344\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0xFFFFFFFF85868788\", \"0x0000000041424344\", \"0x0000000055565758\", \"0x0000000051525354\"],\n    \"XMM3\": [\"0xFFFFFFFF85868788\", \"0x0000000041424344\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xFFFFFFFF85868788\", \"0x0000000041424344\", \"0x0000000055565758\", \"0x0000000051525354\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\n; Memory operands\nvpmovsxdq xmm1, [rdx]\nvpmovsxdq ymm2, [rdx]\n\n; Register only\nvpmovsxdq xmm3, xmm0\nvpmovsxdq ymm4, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434485868788\ndq 0x5152535455565758\ndq 0x4142434485868788\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmovsxwd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434485868788\", \"0x5152535455565758\", \"0x4142434485868788\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0xFFFF8586FFFF8788\", \"0x0000414200004344\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0xFFFF8586FFFF8788\", \"0x0000414200004344\", \"0x0000555600005758\", \"0x0000515200005354\"],\n    \"XMM3\": [\"0xFFFF8586FFFF8788\", \"0x0000414200004344\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xFFFF8586FFFF8788\", \"0x0000414200004344\", \"0x0000555600005758\", \"0x0000515200005354\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\n; Memory operands\nvpmovsxwd xmm1, [rdx]\nvpmovsxwd ymm2, [rdx]\n\n; Register only\nvpmovsxwd xmm3, xmm0\nvpmovsxwd ymm4, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434485868788\ndq 0x5152535455565758\ndq 0x4142434485868788\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmovsxwq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434485868788\", \"0x5152535455565758\", \"0x4142434485868788\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0xFFFFFFFFFFFF8788\", \"0xFFFFFFFFFFFF8586\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0xFFFFFFFFFFFF8788\", \"0xFFFFFFFFFFFF8586\", \"0x0000000000004344\", \"0x0000000000004142\"],\n    \"XMM3\": [\"0xFFFFFFFFFFFF8788\", \"0xFFFFFFFFFFFF8586\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xFFFFFFFFFFFF8788\", \"0xFFFFFFFFFFFF8586\", \"0x0000000000004344\", \"0x0000000000004142\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\n; Memory operands\nvpmovsxwq xmm1, [rdx]\nvpmovsxwq ymm2, [rdx]\n\n; Register only\nvpmovsxwq xmm3, xmm0\nvpmovsxwq ymm4, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434485868788\ndq 0x5152535455565758\ndq 0x4142434485868788\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmovzxbd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434485868788\", \"0x5152535455565758\", \"0x4142434485868788\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x0000008700000088\", \"0x0000008500000086\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x0000008700000088\", \"0x0000008500000086\", \"0x0000004300000044\", \"0x0000004100000042\"],\n    \"XMM3\": [\"0x0000008700000088\", \"0x0000008500000086\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x0000008700000088\", \"0x0000008500000086\", \"0x0000004300000044\", \"0x0000004100000042\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\n; Memory operands\nvpmovzxbd xmm1, [rdx]\nvpmovzxbd ymm2, [rdx]\n\n; Register only\nvpmovzxbd xmm3, xmm0\nvpmovzxbd ymm4, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434485868788\ndq 0x5152535455565758\ndq 0x4142434485868788\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmovzxbq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434485868788\", \"0x5152535455565758\", \"0x4142434485868788\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x0000000000000088\", \"0x0000000000000087\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x0000000000000088\", \"0x0000000000000087\", \"0x0000000000000086\", \"0x0000000000000085\"],\n    \"XMM3\": [\"0x0000000000000088\", \"0x0000000000000087\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x0000000000000088\", \"0x0000000000000087\", \"0x0000000000000086\", \"0x0000000000000085\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\n; Memory operands\nvpmovzxbq xmm1, [rdx]\nvpmovzxbq ymm2, [rdx]\n\n; Register only\nvpmovzxbq xmm3, xmm0\nvpmovzxbq ymm4, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434485868788\ndq 0x5152535455565758\ndq 0x4142434485868788\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmovzxbw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434485868788\", \"0x5152535455565758\", \"0x4142434485868788\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x0085008600870088\", \"0x0041004200430044\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x0085008600870088\", \"0x0041004200430044\", \"0x0055005600570058\", \"0x0051005200530054\"],\n    \"XMM3\": [\"0x0085008600870088\", \"0x0041004200430044\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x0085008600870088\", \"0x0041004200430044\", \"0x0055005600570058\", \"0x0051005200530054\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\n; Memory operands\nvpmovzxbw xmm1, [rdx]\nvpmovzxbw ymm2, [rdx]\n\n; Register only\nvpmovzxbw xmm3, xmm0\nvpmovzxbw ymm4, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434485868788\ndq 0x5152535455565758\ndq 0x4142434485868788\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmovzxdq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434485868788\", \"0x5152535455565758\", \"0x4142434485868788\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x0000000085868788\", \"0x0000000041424344\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x0000000085868788\", \"0x0000000041424344\", \"0x0000000055565758\", \"0x0000000051525354\"],\n    \"XMM3\": [\"0x0000000085868788\", \"0x0000000041424344\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x0000000085868788\", \"0x0000000041424344\", \"0x0000000055565758\", \"0x0000000051525354\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\n; Memory operands\nvpmovzxdq xmm1, [rdx]\nvpmovzxdq ymm2, [rdx]\n\n; Register only\nvpmovzxdq xmm3, xmm0\nvpmovzxdq ymm4, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434485868788\ndq 0x5152535455565758\ndq 0x4142434485868788\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmovzxwd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434485868788\", \"0x5152535455565758\", \"0x4142434485868788\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x0000858600008788\", \"0x0000414200004344\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x0000858600008788\", \"0x0000414200004344\", \"0x0000555600005758\", \"0x0000515200005354\"],\n    \"XMM3\": [\"0x0000858600008788\", \"0x0000414200004344\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x0000858600008788\", \"0x0000414200004344\", \"0x0000555600005758\", \"0x0000515200005354\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\n; Memory operands\nvpmovzxwd xmm1, [rdx]\nvpmovzxwd ymm2, [rdx]\n\n; Register only\nvpmovzxwd xmm3, xmm0\nvpmovzxwd ymm4, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434485868788\ndq 0x5152535455565758\ndq 0x4142434485868788\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmovzxwq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434485868788\", \"0x5152535455565758\", \"0x4142434485868788\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x0000000000008788\", \"0x0000000000008586\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x0000000000008788\", \"0x0000000000008586\", \"0x0000000000004344\", \"0x0000000000004142\"],\n    \"XMM3\": [\"0x0000000000008788\", \"0x0000000000008586\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x0000000000008788\", \"0x0000000000008586\", \"0x0000000000004344\", \"0x0000000000004142\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\n; Memory operands\nvpmovzxwq xmm1, [rdx]\nvpmovzxwq ymm2, [rdx]\n\n; Register only\nvpmovzxwq xmm3, xmm0\nvpmovzxwq ymm4, xmm0\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434485868788\ndq 0x5152535455565758\ndq 0x4142434485868788\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmuldq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\":  [\"0xEE65166050AC19A0\", \"0xFE1EB34A32B1A0B2\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x28A18CDD2D20FB20\", \"0x1D6FA69C44CAED04\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0xF514CF89A88EDCDE\", \"0x01E3DC4237BECFCF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x0004B0350897F35A\", \"0x03CD750E809C18D0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x066A5FA4AD5148C8\", \"0x00BCA2DA387E55A2\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x1E0F03011112ED90\", \"0x18C90F3EC0D58440\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0xEE94B334B2358DF2\", \"0x1B82409D7AE7FA28\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0xED12F34E8FB5E098\", \"0xD83D0BA0FF8632DB\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm1, [rdx + 32 * 0]\nvmovaps ymm2, [rdx + 32 * 1]\nvmovaps ymm3, [rdx + 32 * 2]\nvmovaps ymm4, [rdx + 32 * 3]\nvmovaps ymm5, [rdx + 32 * 4]\nvmovaps ymm6, [rdx + 32 * 5]\nvmovaps ymm7, [rdx + 32 * 6]\nvmovaps ymm8, [rdx + 32 * 7]\n\nvpmuldq xmm1, xmm1, [rdx + 32 * 8]\nvpmuldq xmm2, xmm2, [rdx + 32 * 9]\nvpmuldq xmm3, xmm3, [rdx + 32 * 10]\nvpmuldq xmm4, xmm4, [rdx + 32 * 11]\nvpmuldq xmm9, xmm5, [rdx + 32 * 12]\nvpmuldq xmm10, xmm6, [rdx + 32 * 13]\nvpmuldq xmm11, xmm7, [rdx + 32 * 14]\nvpmuldq xmm12, xmm8, [rdx + 32 * 15]\n\nhlt\n\nalign 32\n; 256bytes of random data\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\n\ndq 0x6868C3F3AAED56E0\ndq 0xF0FCE9E294E6E6DE\ndq 0x6868C3F3AAED56E0\ndq 0xF0FCE9E294E6E6DE\n\ndq 0x6C8BABD754A8356E\ndq 0x277EA625CA925F77\ndq 0x6C8BABD754A8356E\ndq 0x277EA625CA925F77\n\ndq 0x6A6FD695EC73CDC7\ndq 0xDDA1B927BBF2AEBB\ndq 0x6A6FD695EC73CDC7\ndq 0xDDA1B927BBF2AEBB\n\ndq 0x88312CD5C7D14D73\ndq 0x7F091E1EFDDBE7FE\ndq 0x88312CD5C7D14D73\ndq 0x7F091E1EFDDBE7FE\n\ndq 0xF29AE6EF954EFA14\ndq 0x8273A8A49A6242A0\ndq 0xF29AE6EF954EFA14\ndq 0x8273A8A49A6242A0\n\ndq 0x3212073882160F0E\ndq 0xB3780763C1923507\ndq 0x3212073882160F0E\ndq 0xB3780763C1923507\n\ndq 0x462A372B571946CB\ndq 0xA38DCD3D790E041F\ndq 0x462A372B571946CB\ndq 0xA38DCD3D790E041F\n\ndq 0x3057BAAB2F86F32B\ndq 0xEF3F4F46F02CD62E\ndq 0x3057BAAB2F86F32B\ndq 0xEF3F4F46F02CD62E\n\ndq 0xDE3C4B3485BBD1EF\ndq 0x9DE3718DB9A3489E\ndq 0xDE3C4B3485BBD1EF\ndq 0x9DE3718DB9A3489E\n\ndq 0x9D50328ADEFB7209\ndq 0xEEF7EB52F6F19869\ndq 0x9D50328ADEFB7209\ndq 0xEEF7EB52F6F19869\n\ndq 0xCE021C30FFC299D6\ndq 0xA60E9C56F1B20570\ndq 0xCE021C30FFC299D6\ndq 0xA60E9C56F1B20570\n\ndq 0x30763886E2C46218\ndq 0xEB535D0EA7E4A12F\ndq 0x30763886E2C46218\ndq 0xEB535D0EA7E4A12F\n\ndq 0x6802E8E1B7E04514\ndq 0x46EBF28FC18EFE1A\ndq 0x6802E8E1B7E04514\ndq 0x46EBF28FC18EFE1A\n\ndq 0x032E9746236A5D7F\ndq 0xAC5976548F321298\ndq 0x032E9746236A5D7F\ndq 0xAC5976548F321298\n\ndq 0xB6D30C71C85F76C8\ndq 0x881D2CA6ABEA19C5\ndq 0xB6D30C71C85F76C8\ndq 0x881D2CA6ABEA19C5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmuldq_256.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\":  [\"0xEE65166050AC19A0\", \"0xFE1EB34A32B1A0B2\", \"0xEE65166050AC19A0\", \"0xFE1EB34A32B1A0B2\"],\n    \"XMM2\":  [\"0x28A18CDD2D20FB20\", \"0x1D6FA69C44CAED04\", \"0x28A18CDD2D20FB20\", \"0x1D6FA69C44CAED04\"],\n    \"XMM3\":  [\"0xF514CF89A88EDCDE\", \"0x01E3DC4237BECFCF\", \"0xF514CF89A88EDCDE\", \"0x01E3DC4237BECFCF\"],\n    \"XMM4\":  [\"0x0004B0350897F35A\", \"0x03CD750E809C18D0\", \"0x0004B0350897F35A\", \"0x03CD750E809C18D0\"],\n    \"XMM9\":  [\"0x066A5FA4AD5148C8\", \"0x00BCA2DA387E55A2\", \"0x066A5FA4AD5148C8\", \"0x00BCA2DA387E55A2\"],\n    \"XMM10\": [\"0x1E0F03011112ED90\", \"0x18C90F3EC0D58440\", \"0x1E0F03011112ED90\", \"0x18C90F3EC0D58440\"],\n    \"XMM11\": [\"0xEE94B334B2358DF2\", \"0x1B82409D7AE7FA28\", \"0xEE94B334B2358DF2\", \"0x1B82409D7AE7FA28\"],\n    \"XMM12\": [\"0xED12F34E8FB5E098\", \"0xD83D0BA0FF8632DB\", \"0xED12F34E8FB5E098\", \"0xD83D0BA0FF8632DB\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm1, [rdx + 32 * 0]\nvmovaps ymm2, [rdx + 32 * 1]\nvmovaps ymm3, [rdx + 32 * 2]\nvmovaps ymm4, [rdx + 32 * 3]\nvmovaps ymm5, [rdx + 32 * 4]\nvmovaps ymm6, [rdx + 32 * 5]\nvmovaps ymm7, [rdx + 32 * 6]\nvmovaps ymm8, [rdx + 32 * 7]\n\nvpmuldq ymm1, ymm1, [rdx + 32 * 8]\nvpmuldq ymm2, ymm2, [rdx + 32 * 9]\nvpmuldq ymm3, ymm3, [rdx + 32 * 10]\nvpmuldq ymm4, ymm4, [rdx + 32 * 11]\nvpmuldq ymm9, ymm5, [rdx + 32 * 12]\nvpmuldq ymm10, ymm6, [rdx + 32 * 13]\nvpmuldq ymm11, ymm7, [rdx + 32 * 14]\nvpmuldq ymm12, ymm8, [rdx + 32 * 15]\n\nhlt\n\nalign 32\n; 256bytes of random data\n.data:\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\ndq 0xA76C4F06A12BFCE0\ndq 0x9B80767F1E6A060F\n\ndq 0x6868C3F3AAED56E0\ndq 0xF0FCE9E294E6E6DE\ndq 0x6868C3F3AAED56E0\ndq 0xF0FCE9E294E6E6DE\n\ndq 0x6C8BABD754A8356E\ndq 0x277EA625CA925F77\ndq 0x6C8BABD754A8356E\ndq 0x277EA625CA925F77\n\ndq 0x6A6FD695EC73CDC7\ndq 0xDDA1B927BBF2AEBB\ndq 0x6A6FD695EC73CDC7\ndq 0xDDA1B927BBF2AEBB\n\ndq 0x88312CD5C7D14D73\ndq 0x7F091E1EFDDBE7FE\ndq 0x88312CD5C7D14D73\ndq 0x7F091E1EFDDBE7FE\n\ndq 0xF29AE6EF954EFA14\ndq 0x8273A8A49A6242A0\ndq 0xF29AE6EF954EFA14\ndq 0x8273A8A49A6242A0\n\ndq 0x3212073882160F0E\ndq 0xB3780763C1923507\ndq 0x3212073882160F0E\ndq 0xB3780763C1923507\n\ndq 0x462A372B571946CB\ndq 0xA38DCD3D790E041F\ndq 0x462A372B571946CB\ndq 0xA38DCD3D790E041F\n\ndq 0x3057BAAB2F86F32B\ndq 0xEF3F4F46F02CD62E\ndq 0x3057BAAB2F86F32B\ndq 0xEF3F4F46F02CD62E\n\ndq 0xDE3C4B3485BBD1EF\ndq 0x9DE3718DB9A3489E\ndq 0xDE3C4B3485BBD1EF\ndq 0x9DE3718DB9A3489E\n\ndq 0x9D50328ADEFB7209\ndq 0xEEF7EB52F6F19869\ndq 0x9D50328ADEFB7209\ndq 0xEEF7EB52F6F19869\n\ndq 0xCE021C30FFC299D6\ndq 0xA60E9C56F1B20570\ndq 0xCE021C30FFC299D6\ndq 0xA60E9C56F1B20570\n\ndq 0x30763886E2C46218\ndq 0xEB535D0EA7E4A12F\ndq 0x30763886E2C46218\ndq 0xEB535D0EA7E4A12F\n\ndq 0x6802E8E1B7E04514\ndq 0x46EBF28FC18EFE1A\ndq 0x6802E8E1B7E04514\ndq 0x46EBF28FC18EFE1A\n\ndq 0x032E9746236A5D7F\ndq 0xAC5976548F321298\ndq 0x032E9746236A5D7F\ndq 0xAC5976548F321298\n\ndq 0xB6D30C71C85F76C8\ndq 0x881D2CA6ABEA19C5\ndq 0xB6D30C71C85F76C8\ndq 0x881D2CA6ABEA19C5\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmulhrsw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x31A6343B36E09E7A\", \"0x48134B294E4F5186\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x31A6343B36E09E7A\", \"0x48134B294E4F5186\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x31A6343B36E09E7A\", \"0x48134B294E4F5186\", \"0x31A6343B36E09E7A\", \"0x48134B294E4F5186\"],\n    \"XMM5\": [\"0x31A6343B36E09E7A\", \"0x48134B294E4F5186\", \"0x31A6343B36E09E7A\", \"0x48134B294E4F5186\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvpmulhrsw xmm2, xmm0, xmm1\nvpmulhrsw xmm3, xmm0, [rdx + 32]\n\nvpmulhrsw ymm4, ymm0, ymm1\nvpmulhrsw ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445468748\ndq 0x5152535455565758\ndq 0x4142434445468748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmulhuw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0x18D21A1D1B701CCA\", \"0x24092594272728C2\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x18D21A1D1B701CCA\", \"0x24092594272728C2\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x18D21A1D1B701CCA\", \"0x24092594272728C2\", \"0x18D21A1D1B701CCA\", \"0x24092594272728C2\"],\n    \"XMM5\":  [\"0x18D21A1D1B701CCA\", \"0x24092594272728C2\", \"0x18D21A1D1B701CCA\", \"0x24092594272728C2\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpmulhuw xmm2, xmm0, xmm1\nvpmulhuw xmm3, xmm0, [rdx + 32]\n\nvpmulhuw ymm4, ymm0, ymm1\nvpmulhuw ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmulhw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0x18D21A1D1B70CF3C\", \"0x24092594272728C2\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x18D21A1D1B70CF3C\", \"0x24092594272728C2\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x18D21A1D1B70CF3C\", \"0x24092594272728C2\", \"0x18D21A1D1B70CF3C\", \"0x24092594272728C2\"],\n    \"XMM5\":  [\"0x18D21A1D1B70CF3C\", \"0x24092594272728C2\", \"0x18D21A1D1B70CF3C\", \"0x24092594272728C2\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpmulhw xmm2, xmm0, xmm1\nvpmulhw xmm3, xmm0, [rdx + 32]\n\nvpmulhw ymm4, ymm0, ymm1\nvpmulhw ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445468748\ndq 0x5152535455565758\ndq 0x4142434445468748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmulld.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\":  [\"0x7A84D3FA541EF1BE\", \"0x5F0D7667E4D8E24A\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x44683C4CE9AC9780\", \"0x9DA95E9A6F25EF94\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x4BC94EA0CCB0A64C\", \"0x3CF36EE04F371510\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x1AC415407B8BA3DB\", \"0x92CDC300DAB0773C\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x6796B1563F8D578C\", \"0x4C64F16199291FE4\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x01A14EF664207DC6\", \"0x1D3220DA400E1027\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x75DDBA582C3DD348\", \"0xA5141C506D8C60D7\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x7873FF38FB240E0D\", \"0x6C154F1ADB67CD17\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x7A84D3FA541EF1BE\", \"0x5F0D7667E4D8E24A\", \"0x7A84D3FA541EF1BE\", \"0x5F0D7667E4D8E24A\"],\n    \"XMM10\": [\"0x44683C4CE9AC9780\", \"0x9DA95E9A6F25EF94\", \"0x44683C4CE9AC9780\", \"0x9DA95E9A6F25EF94\"],\n    \"XMM11\": [\"0x4BC94EA0CCB0A64C\", \"0x3CF36EE04F371510\", \"0x4BC94EA0CCB0A64C\", \"0x3CF36EE04F371510\"],\n    \"XMM12\": [\"0x1AC415407B8BA3DB\", \"0x92CDC300DAB0773C\", \"0x1AC415407B8BA3DB\", \"0x92CDC300DAB0773C\"],\n    \"XMM13\": [\"0x6796B1563F8D578C\", \"0x4C64F16199291FE4\", \"0x6796B1563F8D578C\", \"0x4C64F16199291FE4\"],\n    \"XMM14\": [\"0x01A14EF664207DC6\", \"0x1D3220DA400E1027\", \"0x01A14EF664207DC6\", \"0x1D3220DA400E1027\"],\n    \"XMM15\": [\"0x75DDBA582C3DD348\", \"0xA5141C506D8C60D7\", \"0x75DDBA582C3DD348\", \"0xA5141C506D8C60D7\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm1, [rdx + 32 * 0]\nvmovaps ymm2, [rdx + 32 * 1]\nvmovaps ymm3, [rdx + 32 * 2]\nvmovaps ymm4, [rdx + 32 * 3]\nvmovaps ymm5, [rdx + 32 * 4]\nvmovaps ymm6, [rdx + 32 * 5]\nvmovaps ymm7, [rdx + 32 * 6]\nvmovaps ymm8, [rdx + 32 * 7]\n\nvmovaps ymm9, [rdx + 32 * 0]\nvmovaps ymm10, [rdx + 32 * 1]\nvmovaps ymm11, [rdx + 32 * 2]\nvmovaps ymm12, [rdx + 32 * 3]\nvmovaps ymm13, [rdx + 32 * 4]\nvmovaps ymm14, [rdx + 32 * 5]\nvmovaps ymm15, [rdx + 32 * 6]\n\nvpmulld xmm1, xmm1, [rdx + 32 * 8]\nvpmulld xmm2, xmm2, [rdx + 32 * 9]\nvpmulld xmm3, xmm3, [rdx + 32 * 10]\nvpmulld xmm4, xmm4, [rdx + 32 * 11]\nvpmulld xmm5, xmm5, [rdx + 32 * 12]\nvpmulld xmm6, xmm6, [rdx + 32 * 13]\nvpmulld xmm7, xmm7, [rdx + 32 * 14]\nvpmulld xmm8, xmm8, [rdx + 32 * 15]\n\nvpmulld ymm9, ymm9, [rdx + 32 * 8]\nvpmulld ymm10, ymm10, [rdx + 32 * 9]\nvpmulld ymm11, ymm11, [rdx + 32 * 10]\nvpmulld ymm12, ymm12, [rdx + 32 * 11]\nvpmulld ymm13, ymm13, [rdx + 32 * 12]\nvpmulld ymm14, ymm14, [rdx + 32 * 13]\nvpmulld ymm15, ymm15, [rdx + 32 * 14]\n\nhlt\n\nalign 32\n.data:\ndd 655.9708, 532.2244, 108.0451, 512.4019\ndd 655.9708, 532.2244, 108.0451, 512.4019\n\ndd 754.227 , 586.0859, 127.7574, 114.8167\ndd 754.227 , 586.0859, 127.7574, 114.8167\n\ndd 764.4266, 226.6145, 337.864 , 320.3296\ndd 764.4266, 226.6145, 337.864 , 320.3296\n\ndd 296.5247, 480.0057, 28.4267 , 565.9418\ndd 296.5247, 480.0057, 28.4267 , 565.9418\n\ndd 265.8255, 536.4473, 754.3489, 460.681\ndd 265.8255, 536.4473, 754.3489, 460.681\n\ndd 818.7269, 43.7204 , 464.592 , 847.9381\ndd 818.7269, 43.7204 , 464.592 , 847.9381\n\ndd 306.0592, 702.7584, 887.6473, 551.5908\ndd 306.0592, 702.7584, 887.6473, 551.5908\n\ndd 620.9001, 520.9829, 232.9532, 510.3388\ndd 620.9001, 520.9829, 232.9532, 510.3388\n\ndd 204.8474, 225.626 , 564.973 , 790.5175\ndd 204.8474, 225.626 , 564.973 , 790.5175\n\ndd 836.1953, 844.5266, 633.5626, 501.7409\ndd 836.1953, 844.5266, 633.5626, 501.7409\n\ndd 393.2616, 674.4415, 244.3265, 971.1598\ndd 393.2616, 674.4415, 244.3265, 971.1598\n\ndd 770.8029, 746.1836, 255.9902, 567.7578\ndd 770.8029, 746.1836, 255.9902, 567.7578\n\ndd 187.7175, 924.181 , 466.4362, 169.8267\ndd 187.7175, 924.181 , 466.4362, 169.8267\n\ndd 651.7481, 462.4206, 396.6924, 355.8538\ndd 651.7481, 462.4206, 396.6924, 355.8538\n\ndd 6.148   , 523.1443, 989.7004, 713.6646\ndd 6.148   , 523.1443, 989.7004, 713.6646\n\ndd 497.5427, 657.6965, 651.0534, 778.5236\ndd 497.5427, 657.6965, 651.0534, 778.5236\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmullw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0xFD44929037E4ED40\", \"0x68847E10A3A4D940\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0xFD44929037E4ED40\", \"0x68847E10A3A4D940\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0xFD44929037E4ED40\", \"0x68847E10A3A4D940\", \"0xFD44929037E4ED40\", \"0x68847E10A3A4D940\"],\n    \"XMM5\":  [\"0xFD44929037E4ED40\", \"0x68847E10A3A4D940\", \"0xFD44929037E4ED40\", \"0x68847E10A3A4D940\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpmullw xmm2, xmm0, xmm1\nvpmullw xmm3, xmm0, [rdx + 32]\n\nvpmullw ymm4, ymm0, ymm1\nvpmullw ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpmuludq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x000000000003FFFC\", \"0x000000000000FFFE\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x000000000003FFFC\", \"0x000000000000FFFE\", \"0x000000000003FFFC\", \"0x000000000000FFFE\"],\n    \"XMM4\": [\"0x000000000003FFFC\", \"0x000000000000FFFE\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x000000000003FFFC\", \"0x000000000000FFFE\", \"0x000000000003FFFC\", \"0x000000000000FFFE\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpmuludq xmm2, xmm0, [rdx + 32]\nvpmuludq ymm3, ymm0, [rdx + 32]\n\nvpmuludq xmm4, xmm0, xmm1\nvpmuludq ymm5, ymm0, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x414243440000FFFF\ndq 0x5152535400007FFF\ndq 0x414243440000FFFF\ndq 0x5152535400007FFF\n\ndq 0x6162636400000004\ndq 0x7172737400000002\ndq 0x6162636400000004\ndq 0x7172737400000002\n"
  },
  {
    "path": "unittests/ASM/VEX/vpor.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0xCCCCCCCC75767778\", \"0x61626364DDDDDDDD\", \"0xEEEEEEEE55565758\", \"0x41424344FFFFFFFF\"],\n    \"XMM2\": [\"0xCDCECFCC75767778\", \"0x71727374DDDFDFDD\", \"0xEFEEEFEE75767778\", \"0x71727374FFFFFFFF\"],\n    \"XMM3\": [\"0xCDCECFCC75767778\", \"0x71727374DDDFDFDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xCDCECFCC75767778\", \"0x71727374DDDFDFDD\", \"0xEFEEEFEE75767778\", \"0x71727374FFFFFFFF\"],\n    \"XMM5\": [\"0xCDCECFCC75767778\", \"0x71727374DDDFDFDD\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data1]\nlea rbx, [rel .data2]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rbx]\n\n; Register only\nvpor ymm2, ymm0, ymm1\nvpor xmm3, xmm0, xmm1\n\n; With memory operand\nvpor ymm4, ymm0, [rbx]\nvpor xmm5, xmm0, [rbx]\n\nhlt\n\nalign 32\n.data1:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0xCCCCCCCC75767778\ndq 0x61626364DDDDDDDD\ndq 0xEEEEEEEE55565758\ndq 0x41424344FFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsadbw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x100\", \"0x100\", \"0x000\", \"0x000\"],\n    \"XMM8\":  [\"0x327\", \"0x2F4\", \"0x000\", \"0x000\"],\n    \"XMM9\":  [\"0x2BA\", \"0x27F\", \"0x000\", \"0x000\"],\n    \"XMM10\": [\"0x2B1\", \"0x284\", \"0x000\", \"0x000\"],\n    \"XMM11\": [\"0x295\", \"0x280\", \"0x000\", \"0x000\"],\n    \"XMM12\": [\"0x190\", \"0x279\", \"0x000\", \"0x000\"],\n    \"XMM13\": [\"0x29B\", \"0x2A8\", \"0x000\", \"0x000\"],\n    \"XMM14\": [\"0x25B\", \"0x1EA\", \"0x000\", \"0x000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .reg_data]\n\nvmovaps xmm0, [rdx + 8 * 2]\npsadbw xmm0, [rdx + 8 * 0]\n\nlea rdx, [rel .data]\n\nvmovaps xmm1, [rdx + 16 * 0]\nvmovaps xmm2, [rdx + 16 * 1]\nvmovaps xmm3, [rdx + 16 * 2]\nvmovaps xmm4, [rdx + 16 * 3]\nvmovaps xmm5, [rdx + 16 * 4]\nvmovaps xmm6, [rdx + 16 * 5]\nvmovaps xmm7, [rdx + 16 * 6]\n\nvpsadbw xmm8,  xmm1, [rdx + 16 * 8]\nvpsadbw xmm9,  xmm2, [rdx + 16 * 9]\nvpsadbw xmm10, xmm3, [rdx + 16 * 10]\nvpsadbw xmm11, xmm4, [rdx + 16 * 11]\nvpsadbw xmm12, xmm5, [rdx + 16 * 12]\nvpsadbw xmm13, xmm6, [rdx + 16 * 13]\nvpsadbw xmm14, xmm7, [rdx + 16 * 14]\n\nhlt\n\nalign 16\n\n.reg_data:\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data:\ndq 0xE0FC2BA1064F6CA7\ndq 0x0F066A1E7F76809B\n\ndq 0xE056EDAAF3C36868\ndq 0xDEE6E694E2E9FCF0\n\ndq 0x6E35A854D7AB8B6C\ndq 0x775F92CA25A67E27\n\ndq 0xC7CD73EC95D66F6A\ndq 0xBBAEF2BB27B9A1DD\n\ndq 0x734DD1C7D52C3188\ndq 0xFEE7DBFD1E1E097F\n\ndq 0x14FA4E95EFE69AF2\ndq 0xA042629AA4A87382\n\ndq 0x0E0F168238071232\ndq 0x073592C1630778B3\n\ndq 0xCB4619572B372A46\ndq 0x1F040E793DCD8DA3\n\ndq 0x2BF3862FABBA5730\ndq 0x2ED62CF0464F3FEF\n\ndq 0xEFD1BB85344B3CDE\ndq 0x9E48A3B98D71E39D\n\ndq 0x0972FBDE8A32509D\ndq 0x6998F1F652EBF7EE\n\ndq 0xD699C2FF301C02CE\ndq 0x7005B2F1569C0EA6\n\ndq 0x1862C4E286387630\ndq 0x2FA1E4A70E5D53EB\n\ndq 0x1445E0B7E1E80268\ndq 0x1AFE8EC18FF2EB46\n\ndq 0x7F5D6A2346972E03\ndq 0x9812328F547659AC\n\ndq 0xC8765FC8710CD3B6\ndq 0xC519EAABA62C1D88\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsadbw_256.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x100\", \"0x100\", \"0x080\", \"0x180\"],\n    \"XMM8\":  [\"0x327\", \"0x21D\", \"0x3CA\", \"0x2BA\"],\n    \"XMM9\":  [\"0x2BA\", \"0x3CA\", \"0x21D\", \"0x327\"],\n    \"XMM10\": [\"0x2B1\", \"0x279\", \"0x284\", \"0x1F8\"],\n    \"XMM11\": [\"0x295\", \"0x306\", \"0x280\", \"0x27B\"],\n    \"XMM12\": [\"0x245\", \"0x235\", \"0x279\", \"0x42E\"],\n    \"XMM13\": [\"0x29B\", \"0x139\", \"0x35B\", \"0x396\"],\n    \"XMM14\": [\"0x25B\", \"0x390\", \"0x1EA\", \"0x2F9\"]\n  }\n}\n%endif\n\nlea rdx, [rel .reg_data]\n\nvmovaps ymm0, [rdx + 32]\nvpsadbw ymm0, ymm0, [rdx]\n\nlea rdx, [rel .data]\n\nvmovaps ymm1, [rdx + 32 * 0]\nvmovaps ymm2, [rdx + 32 * 1]\nvmovaps ymm3, [rdx + 32 * 2]\nvmovaps ymm4, [rdx + 32 * 3]\nvmovaps ymm5, [rdx + 32 * 4]\nvmovaps ymm6, [rdx + 32 * 5]\nvmovaps ymm7, [rdx + 32 * 6]\n\nvpsadbw ymm8,  ymm1, [rdx + 32 * 8]\nvpsadbw ymm9,  ymm2, [rdx + 32 * 9]\nvpsadbw ymm10, ymm3, [rdx + 32 * 10]\nvpsadbw ymm11, ymm4, [rdx + 32 * 11]\nvpsadbw ymm12, ymm5, [rdx + 32 * 12]\nvpsadbw ymm13, ymm6, [rdx + 32 * 13]\nvpsadbw ymm14, ymm7, [rdx + 32 * 14]\n\nhlt\n\nalign 32\n\n.reg_data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x5152535455565758\ndq 0x4142434445464748\n\n.data:\ndq 0xE0FC2BA1064F6CA7\ndq 0x0F066A1E7F76809B\ndq 0xDEE6E694E2E9FCF0\ndq 0xE056EDAAF3C36868\n\ndq 0xE056EDAAF3C36868\ndq 0xDEE6E694E2E9FCF0\ndq 0x0F066A1E7F76809B\ndq 0xE0FC2BA1064F6CA7\n\ndq 0x6E35A854D7AB8B6C\ndq 0xC7CD73EC95D66F6A\ndq 0x775F92CA25A67E27\ndq 0xBBAEF2BB27B9A1DD\n\ndq 0xC7CD73EC95D66F6A\ndq 0x6E35A854D7AB8B6C\ndq 0xBBAEF2BB27B9A1DD\ndq 0x775F92CA25A67E27\n\ndq 0x734DD1C7D52C3188\ndq 0xA042629AA4A87382\ndq 0xFEE7DBFD1E1E097F\ndq 0x14FA4E95EFE69AF2\n\ndq 0x14FA4E95EFE69AF2\ndq 0xA042629AA4A87382\ndq 0x734DD1C7D52C3188\ndq 0xFEE7DBFD1E1E097F\n\ndq 0x0E0F168238071232\ndq 0xCB4619572B372A46\ndq 0x073592C1630778B3\ndq 0x1F040E793DCD8DA3\n\ndq 0xCB4619572B372A46\ndq 0x0E0F168238071232\ndq 0x1F040E793DCD8DA3\ndq 0x073592C1630778B3\n\ndq 0x2BF3862FABBA5730\ndq 0x9E48A3B98D71E39D\ndq 0x2ED62CF0464F3FEF\ndq 0xEFD1BB85344B3CDE\n\ndq 0xEFD1BB85344B3CDE\ndq 0x2ED62CF0464F3FEF\ndq 0x9E48A3B98D71E39D\ndq 0x2BF3862FABBA5730\n\ndq 0x0972FBDE8A32509D\ndq 0x7005B2F1569C0EA6\ndq 0x6998F1F652EBF7EE\ndq 0xD699C2FF301C02CE\n\ndq 0xD699C2FF301C02CE\ndq 0x6998F1F652EBF7EE\ndq 0x7005B2F1569C0EA6\ndq 0x0972FBDE8A32509D\n\ndq 0xC8765FC8710CD3B6\ndq 0x1862C4E286387630\ndq 0x2FA1E4A70E5D53EB\ndq 0xC519EAABA62C1D88\n\ndq 0x1445E0B7E1E80268\ndq 0x9812328F547659AC\ndq 0x1AFE8EC18FF2EB46\ndq 0x7F5D6A2346972E03\n\ndq 0x7F5D6A2346972E03\ndq 0x1445E0B7E1E80268\ndq 0x9812328F547659AC\ndq 0x1AFE8EC18FF2EB46\n\ndq 0x1445E0B7E1E80268\ndq 0xC8765FC8710CD3B6\ndq 0xC519EAABA62C1D88\ndq 0x1AFE8EC18FF2EB46\n"
  },
  {
    "path": "unittests/ASM/VEX/vpshufb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM5\":  [\"0x4848484848484848\", \"0x4848484848484848\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x4847464544434241\", \"0x5857565554535251\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x4848484848484848\", \"0x4848484848484848\", \"0x5858585858585858\", \"0x5858585858585858\"],\n    \"XMM10\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x4847464544434241\", \"0x5857565554535251\", \"0x5847464544434241\", \"0x4857565554535251\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32 * 1]\nvmovaps ymm2, [rdx + 32 * 2]\nvmovaps ymm3, [rdx + 32 * 3]\nvmovaps ymm4, [rdx + 32 * 4]\n\nvpshufb xmm5, xmm0, xmm1\nvpshufb xmm6, xmm0, xmm2\nvpshufb xmm7, xmm0, xmm3\nvpshufb xmm8, xmm0, xmm4\n\nvpshufb ymm9,  ymm0, ymm1\nvpshufb ymm10, ymm0, ymm2\nvpshufb ymm11, ymm0, ymm3\nvpshufb ymm12, ymm0, ymm4\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464758\ndq 0x5152535455565748\n\ndq 0\ndq 0\ndq 0\ndq 0\n\ndq -1\ndq -1\ndq -1\ndq -1\n\ndq 0x8080808080808080\ndq 0x8080808080808080\ndq 0x8080808080808080\ndq 0x8080808080808080\n\ndq 0x0001020304050607\ndq 0x08090A0B0C0D0E0F\ndq 0x0001020304050607\ndq 0x08090A0B0C0D0E0F\n"
  },
  {
    "path": "unittests/ASM/VEX/vpshufd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0xAAAABBBBCCCCDDDD\", \"0xEEEEFFFF11112222\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0xFFFFCCCCDDDDEEEE\", \"0xAAAABBBB88889999\"],\n    \"XMM2\": [\"0x4546474845464748\", \"0x4546474845464748\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x7172737471727374\", \"0x7172737471727374\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4546474845464748\", \"0x4546474845464748\", \"0xCCCCDDDDCCCCDDDD\", \"0xCCCCDDDDCCCCDDDD\"],\n    \"XMM5\": [\"0x7172737471727374\", \"0x7172737471727374\", \"0xAAAABBBBAAAABBBB\", \"0xAAAABBBBAAAABBBB\"],\n    \"XMM6\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0xAAAABBBBCCCCDDDD\", \"0xEEEEFFFF11112222\"],\n    \"XMM7\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x5556575845464748\", \"0x5556575845464748\", \"0x11112222CCCCDDDD\", \"0x11112222CCCCDDDD\"],\n    \"XMM9\": [\"0x7576777865666768\", \"0x7576777865666768\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpshufd xmm2, xmm0, 0x0\nvpshufd xmm3, xmm1, 0xFF\n\nvpshufd ymm4, ymm0, 0x0\nvpshufd ymm5, ymm1, 0xFF\n\n; Shouldn't modify vector (selector is [3, 2, 1, 0])\n; Which would effectively place elements in their\n; same location\nvpshufd ymm6, ymm0, 0b11100100\nvpshufd xmm7, xmm1, 0b11100100\n\n; [2, 0, 2, 0] shuffling\nvpshufd ymm8, ymm0, 0b10001000\nvpshufd xmm9, xmm1, 0b10001000\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xAAAABBBBCCCCDDDD\ndq 0xEEEEFFFF11112222\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0xFFFFCCCCDDDDEEEE\ndq 0xAAAABBBB88889999\n"
  },
  {
    "path": "unittests/ASM/VEX/vpshufhw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0xAAAABBBBCCCCDDDD\", \"0xEEEEFFFF11112222\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0xFFFFCCCCDDDDEEEE\", \"0xAAAABBBB88889999\"],\n    \"XMM2\": [\"0x4142434445464748\", \"0x5758575857585758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x6162636465666768\", \"0x7172717271727172\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4142434445464748\", \"0x5758575857585758\", \"0xAAAABBBBCCCCDDDD\", \"0x2222222222222222\"],\n    \"XMM5\": [\"0x6162636465666768\", \"0x7172717271727172\", \"0xFFFFCCCCDDDDEEEE\", \"0xAAAAAAAAAAAAAAAA\"],\n    \"XMM6\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0xAAAABBBBCCCCDDDD\", \"0xEEEEFFFF11112222\"],\n    \"XMM7\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x4142434445464748\", \"0x5354575853545758\", \"0xAAAABBBBCCCCDDDD\", \"0xFFFF2222FFFF2222\"],\n    \"XMM9\": [\"0x6162636465666768\", \"0x7374777873747778\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpshufhw xmm2, xmm0, 0x0\nvpshufhw xmm3, xmm1, 0xFF\n\nvpshufhw ymm4, ymm0, 0x0\nvpshufhw ymm5, ymm1, 0xFF\n\n; Shouldn't modify vector (selector is [3, 2, 1, 0])\n; Which would effectively place elements in their\n; same location\nvpshufhw ymm6, ymm0, 0b11100100\nvpshufhw xmm7, xmm1, 0b11100100\n\n; [2, 0, 2, 0] shuffling\nvpshufhw ymm8, ymm0, 0b10001000\nvpshufhw xmm9, xmm1, 0b10001000\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xAAAABBBBCCCCDDDD\ndq 0xEEEEFFFF11112222\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0xFFFFCCCCDDDDEEEE\ndq 0xAAAABBBB88889999\n"
  },
  {
    "path": "unittests/ASM/VEX/vpshuflw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0xAAAABBBBCCCCDDDD\", \"0xEEEEFFFF11112222\"],\n    \"XMM1\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0xFFFFCCCCDDDDEEEE\", \"0xAAAABBBB88889999\"],\n    \"XMM2\": [\"0x4748474847484748\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x6162616261626162\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4748474847484748\", \"0x5152535455565758\", \"0xDDDDDDDDDDDDDDDD\", \"0xEEEEFFFF11112222\"],\n    \"XMM5\": [\"0x6162616261626162\", \"0x7172737475767778\", \"0xFFFFFFFFFFFFFFFF\", \"0xAAAABBBB88889999\"],\n    \"XMM6\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0xAAAABBBBCCCCDDDD\", \"0xEEEEFFFF11112222\"],\n    \"XMM7\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x4344474843444748\", \"0x5152535455565758\", \"0xBBBBDDDDBBBBDDDD\", \"0xEEEEFFFF11112222\"],\n    \"XMM9\": [\"0x6364676863646768\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpshuflw xmm2, xmm0, 0x0\nvpshuflw xmm3, xmm1, 0xFF\n\nvpshuflw ymm4, ymm0, 0x0\nvpshuflw ymm5, ymm1, 0xFF\n\n; Shouldn't modify vector (selector is [3, 2, 1, 0])\n; Which would effectively place elements in their\n; same location\nvpshuflw ymm6, ymm0, 0b11100100\nvpshuflw xmm7, xmm1, 0b11100100\n\n; [2, 0, 2, 0] shuffling\nvpshuflw ymm8, ymm0, 0b10001000\nvpshuflw xmm9, xmm1, 0b10001000\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xAAAABBBBCCCCDDDD\ndq 0xEEEEFFFF11112222\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0xFFFFCCCCDDDDEEEE\ndq 0xAAAABBBB88889999\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsignb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x0202020202020202\", \"0x0303030303030303\", \"0x0202020202020202\", \"0x0303030303030303\"],\n    \"XMM1\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0xFEFEFEFEFEFEFEFE\", \"0xFDFDFDFDFDFDFDFD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x0202020202020202\", \"0x0303030303030303\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xFEFEFEFE00000000\", \"0x03030303FD000300\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0xFEFEFEFEFEFEFEFE\", \"0xFDFDFDFDFDFDFDFD\", \"0xFEFEFEFEFEFEFEFE\", \"0xFDFDFDFDFDFDFDFD\"],\n    \"XMM7\": [\"0x0202020202020202\", \"0x0303030303030303\", \"0x0202020202020202\", \"0x0303030303030303\"],\n    \"XMM8\": [\"0xFEFEFEFE00000000\", \"0x03030303FD000300\", \"0xFEFEFEFE00000000\", \"0x03030303FD000300\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 4]\n\n; Test with full zero\nvpsignb xmm1, xmm0, [rdx + 32 * 0]\nvpsignb ymm5, ymm0, [rdx + 32 * 0]\n\n; Test with full negative\nvpsignb xmm2, xmm0, [rdx + 32 * 1]\nvpsignb ymm6, ymm0, [rdx + 32 * 1]\n\n; Test with full positive\nvpsignb xmm3, xmm0, [rdx + 32 * 2]\nvpsignb ymm7, ymm0, [rdx + 32 * 2]\n\n; Test a mix\nvpsignb xmm4, xmm0, [rdx + 32 * 3]\nvpsignb ymm8, ymm0, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0101010101010101\ndq 0x0101010101010101\ndq 0x0101010101010101\ndq 0x0101010101010101\n\ndq 0xFFFFFFFF00000000\ndq 0x01010101FF000100\ndq 0xFFFFFFFF00000000\ndq 0x01010101FF000100\n\ndq 0x0202020202020202\ndq 0x0303030303030303\ndq 0x0202020202020202\ndq 0x0303030303030303\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsignd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x0202020202020202\", \"0x0303030303030303\", \"0x0202020202020202\", \"0x0303030303030303\"],\n    \"XMM1\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0xFDFDFDFEFDFDFDFE\", \"0xFCFCFCFDFCFCFCFD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x0202020202020202\", \"0x0303030303030303\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xFDFDFDFE00000000\", \"0x03030303FCFCFCFD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0xFDFDFDFEFDFDFDFE\", \"0xFCFCFCFDFCFCFCFD\", \"0xFDFDFDFEFDFDFDFE\", \"0xFCFCFCFDFCFCFCFD\"],\n    \"XMM7\": [\"0x0202020202020202\", \"0x0303030303030303\", \"0x0202020202020202\", \"0x0303030303030303\"],\n    \"XMM8\": [\"0xFDFDFDFE00000000\", \"0x03030303FCFCFCFD\", \"0xFDFDFDFE00000000\", \"0x03030303FCFCFCFD\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 4]\n\n; Test with full zero\nvpsignd xmm1, xmm0, [rdx + 32 * 0]\nvpsignd ymm5, ymm0, [rdx + 32 * 0]\n\n; Test with full negative\nvpsignd xmm2, xmm0, [rdx + 32 * 1]\nvpsignd ymm6, ymm0, [rdx + 32 * 1]\n\n; Test with full positive\nvpsignd xmm3, xmm0, [rdx + 32 * 2]\nvpsignd ymm7, ymm0, [rdx + 32 * 2]\n\n; Test a mix\nvpsignd xmm4, xmm0, [rdx + 32 * 3]\nvpsignd ymm8, ymm0, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\ndq 0x0000000100000001\n\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\ndq 0xFFFFFFFF00000000\ndq 0x00000001FFFFFFFF\n\ndq 0x0202020202020202\ndq 0x0303030303030303\ndq 0x0202020202020202\ndq 0x0303030303030303\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsignw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x0202020202020202\", \"0x0303030303030303\", \"0x0202020202020202\", \"0x0303030303030303\"],\n    \"XMM1\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0xFDFEFDFEFDFEFDFE\", \"0xFCFDFCFDFCFDFCFD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x0202020202020202\", \"0x0303030303030303\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xFDFEFDFE00000000\", \"0x03030303FCFD0000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0xFDFEFDFEFDFEFDFE\", \"0xFCFDFCFDFCFDFCFD\", \"0xFDFEFDFEFDFEFDFE\", \"0xFCFDFCFDFCFDFCFD\"],\n    \"XMM7\": [\"0x0202020202020202\", \"0x0303030303030303\", \"0x0202020202020202\", \"0x0303030303030303\"],\n    \"XMM8\": [\"0xFDFEFDFE00000000\", \"0x03030303FCFD0000\", \"0xFDFEFDFE00000000\", \"0x03030303FCFD0000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx + 32 * 4]\n\n; Test with full zero\nvpsignw xmm1, xmm0, [rdx + 32 * 0]\nvpsignw ymm5, ymm0, [rdx + 32 * 0]\n\n; Test with full negative\nvpsignw xmm2, xmm0, [rdx + 32 * 1]\nvpsignw ymm6, ymm0, [rdx + 32 * 1]\n\n; Test with full positive\nvpsignw xmm3, xmm0, [rdx + 32 * 2]\nvpsignw ymm7, ymm0, [rdx + 32 * 2]\n\n; Test a mix\nvpsignw xmm4, xmm0, [rdx + 32 * 3]\nvpsignw ymm8, ymm0, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xFFFFFFFFFFFFFFFF\n\ndq 0x0001000100010001\ndq 0x0001000100010001\ndq 0x0001000100010001\ndq 0x0001000100010001\n\ndq 0xFFFFFFFF00000000\ndq 0x00010001FFFF0000\ndq 0xFFFFFFFF00000000\ndq 0x00010001FFFF0000\n\ndq 0x0202020202020202\ndq 0x0303030303030303\ndq 0x0202020202020202\ndq 0x0303030303030303\n"
  },
  {
    "path": "unittests/ASM/VEX/vpslld.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM4\":  [\"0x4142434445464748\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x4344000047480000\", \"0x7374000077780000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x4142434445464748\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x4344000047480000\", \"0x7374000077780000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM11\": [\"0x4344000047480000\", \"0x7374000077780000\", \"0x4344000047480000\", \"0x7374000077780000\"],\n    \"XMM12\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM14\": [\"0x4344000047480000\", \"0x7374000077780000\", \"0x4344000047480000\", \"0x7374000077780000\"],\n    \"XMM15\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\n\nvpslld xmm4, xmm0, xmm1\nvpslld xmm5, xmm0, xmm2\nvpslld xmm6, xmm0, xmm3\n\nvpslld xmm7, xmm0, [rdx + 32 * 1]\nvpslld xmm8, xmm0, [rdx + 32 * 2]\nvpslld xmm9, xmm0, [rdx + 32 * 3]\n\nvpslld ymm10, ymm0, xmm1\nvpslld ymm11, ymm0, xmm2\nvpslld ymm12, ymm0, xmm3\n\nvpslld ymm13, ymm0, [rdx + 32 * 1]\nvpslld ymm14, ymm0, [rdx + 32 * 2]\nvpslld ymm15, ymm0, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\n\ndq 0x0000000000000000\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x0000000000000010\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x0000000000000020\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpslld_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x6364000067680000\", \"0x7374000077780000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4243440046474800\", \"0x5253540056575800\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0xC2C4C6C8CACCCED0\", \"0xE2E4E6E8EAECEEF0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x6364000067680000\", \"0x7374000077780000\", \"0x6364000067680000\", \"0x7374000077780000\"],\n    \"XMM8\": [\"0x4243440046474800\", \"0x5253540056575800\", \"0x4243440046474800\", \"0x5253540056575800\"],\n    \"XMM9\": [\"0xC2C4C6C8CACCCED0\", \"0xE2E4E6E8EAECEEF0\", \"0xC2C4C6C8CACCCED0\", \"0xE2E4E6E8EAECEEF0\"],\n    \"XMM10\": [\"0x848688008c8e9000\", \"0xa4a6a800acaeb000\", \"0xc4c6c800ccced000\", \"0xe4e6e800eceef000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\nvmovapd ymm10, [rel .data2]\n\nvpslld xmm2, xmm0, 32\nvpslld xmm3, xmm1, 16\nvpslld xmm4, xmm0, 8\nvpslld xmm5, xmm1, 1\n\nvpslld ymm6, ymm0, 32\nvpslld ymm7, ymm1, 16\nvpslld ymm8, ymm0, 8\nvpslld ymm9, ymm1, 1\n\nvpslld ymm10, ymm10, 0x9\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0x4142434445464748, 0x5152535455565758, 0x6162636465666768, 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpslldq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x0000000000000000\", \"0x6162636465666768\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4546474800000000\", \"0x5556575841424344\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x6263646566676800\", \"0x7273747576777861\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x0000000000000000\", \"0x6162636465666768\", \"0x0000000000000000\", \"0x6162636465666768\"],\n    \"XMM8\": [\"0x4546474800000000\", \"0x5556575841424344\", \"0x4546474800000000\", \"0x5556575841424344\"],\n    \"XMM9\": [\"0x6263646566676800\", \"0x7273747576777861\", \"0x6263646566676800\", \"0x7273747576777861\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpslldq xmm2, xmm0, 16\nvpslldq xmm3, xmm1, 8\nvpslldq xmm4, xmm0, 4\nvpslldq xmm5, xmm1, 1\n\nvpslldq ymm6, ymm0, 16\nvpslldq ymm7, ymm1, 8\nvpslldq ymm8, ymm0, 4\nvpslldq ymm9, ymm1, 1\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsllq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM4\":  [\"0x4142434445464748\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x4546474800000000\", \"0x7576777800000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x4142434445464748\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x4546474800000000\", \"0x7576777800000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM11\": [\"0x4546474800000000\", \"0x7576777800000000\", \"0x4546474800000000\", \"0x7576777800000000\"],\n    \"XMM12\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x4142434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM14\": [\"0x4546474800000000\", \"0x7576777800000000\", \"0x4546474800000000\", \"0x7576777800000000\"],\n    \"XMM15\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\n\nvpsllq xmm4, xmm0, xmm1\nvpsllq xmm5, xmm0, xmm2\nvpsllq xmm6, xmm0, xmm3\n\nvpsllq xmm7, xmm0, [rdx + 32 * 1]\nvpsllq xmm8, xmm0, [rdx + 32 * 2]\nvpsllq xmm9, xmm0, [rdx + 32 * 3]\n\nvpsllq ymm10, ymm0, xmm1\nvpsllq ymm11, ymm0, xmm2\nvpsllq ymm12, ymm0, xmm3\n\nvpsllq ymm13, ymm0, [rdx + 32 * 1]\nvpsllq ymm14, ymm0, [rdx + 32 * 2]\nvpsllq ymm15, ymm0, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\n\ndq 0x0000000000000000\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x0000000000000020\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x0000000000000040\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsllq_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x4546474800000000\", \"0x5556575800000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x6364656667680000\", \"0x7374757677780000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4243444546474800\", \"0x5253545556575800\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0xC2C4C6C8CACCCED0\", \"0xE2E4E6E8EAECEEF0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x4546474800000000\", \"0x5556575800000000\", \"0x4546474800000000\", \"0x5556575800000000\"],\n    \"XMM7\": [\"0x6364656667680000\", \"0x7374757677780000\", \"0x6364656667680000\", \"0x7374757677780000\"],\n    \"XMM8\": [\"0x4243444546474800\", \"0x5253545556575800\", \"0x4243444546474800\", \"0x5253545556575800\"],\n    \"XMM9\": [\"0xC2C4C6C8CACCCED0\", \"0xE2E4E6E8EAECEEF0\", \"0xC2C4C6C8CACCCED0\", \"0xE2E4E6E8EAECEEF0\"],\n    \"XMM10\": [\"0x8486888a8c8e9000\", \"0xa4a6a8aaacaeb000\", \"0xc4c6c8caccced000\", \"0xe4e6e8eaeceef000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\nvmovapd ymm10, [rel .data2]\n\nvpsllq xmm2, xmm0, 32\nvpsllq xmm3, xmm1, 16\nvpsllq xmm4, xmm0, 8\nvpsllq xmm5, xmm1, 1\n\nvpsllq ymm6, ymm0, 32\nvpsllq ymm7, ymm1, 16\nvpsllq ymm8, ymm0, 8\nvpsllq ymm9, ymm1, 1\n\nvpsllq ymm10, ymm10, 0x9\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0x4142434445464748, 0x5152535455565758, 0x6162636465666768, 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsllvd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0x00000000FFFFFF80\", \"0xFFC00000FFFFFC00\", \"0x0000000055555500\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x00000000FFFFFF80\", \"0xFFC00000FFFFFC00\", \"0x0000000055555500\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x00000000FFFFFF80\", \"0xFFC00000FFFFFC00\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x00000000FFFFFF80\", \"0xFFC00000FFFFFC00\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\nvpsllvd ymm2, ymm0, ymm1\nvpsllvd ymm3, ymm0, [rdx + 32]\n\nvpsllvd xmm4, xmm0, xmm1\nvpsllvd xmm5, xmm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x800000007FFFFFFF\ndq 0x0FFFFFFFFFFFFFFF\ndq 0x4000000055555555\ndq 0xFFFFFFFF7FFFFFFF\n\ndq 0x0000000800000007\ndq 0x000000160000000A\ndq 0x0000000400000008\ndq 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsllvq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0x0000000000000000\", \"0xFFFFFFFFFFFF0000\", \"0x0000005555555500\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000000000000\", \"0xFFFFFFFFFFFF0000\", \"0x0000005555555500\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x0000000000000000\", \"0xFFFFFFFFFFFF0000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000000000000000\", \"0xFFFFFFFFFFFF0000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\nvpsllvq ymm2, ymm0, ymm1\nvpsllvq ymm3, ymm0, [rdx + 32]\n\nvpsllvq xmm4, xmm0, xmm1\nvpsllvq xmm5, xmm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x800000007FFFFFFF\ndq 0x0FFFFFFFFFFFFFFF\ndq 0x4000000055555555\ndq 0xFFFFFFFF7FFFFFFF\n\ndq 0xFFFFFFFFFFFFFF10\ndq 0x0000000000000010\ndq 0x0000000000000008\ndq 0x0000000000000040\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsllw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\":  [\"0x828486888A8C8E90\", \"0xE2E4E6E8EAECEEF0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x4200440046004800\", \"0x7200740076007800\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x828486888A8C8E90\", \"0xE2E4E6E8EAECEEF0\", \"0x828486888A8C8E90\", \"0xE2E4E6E8EAECEEF0\"],\n    \"XMM6\":  [\"0x4200440046004800\", \"0x7200740076007800\", \"0x4200440046004800\", \"0x7200740076007800\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\n\nvpsllw xmm1, xmm0, [rdx + 32 * 1]\nvpsllw xmm2, xmm0, [rdx + 32 * 2]\nvpsllw xmm3, xmm0, [rdx + 32 * 3]\nvpsllw xmm4, xmm0, [rdx + 32 * 4]\n\nvpsllw ymm5, ymm0, [rdx + 32 * 1]\nvpsllw ymm6, ymm0, [rdx + 32 * 2]\nvpsllw ymm7, ymm0, [rdx + 32 * 3]\nvpsllw ymm8, ymm0, [rdx + 32 * 4]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\n\ndq 0x0000000000000001\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x0000000000000008\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x0000000000000010\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x0000000000000020\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsllw_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4200440046004800\", \"0x5200540056005800\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0xC2C4C6C8CACCCED0\", \"0xE2E4E6E8EAECEEF0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x4200440046004800\", \"0x5200540056005800\", \"0x4200440046004800\", \"0x5200540056005800\"],\n    \"XMM9\": [\"0xC2C4C6C8CACCCED0\", \"0xE2E4E6E8EAECEEF0\", \"0xC2C4C6C8CACCCED0\", \"0xE2E4E6E8EAECEEF0\"],\n    \"XMM10\": [\"0x840088008c009000\", \"0xa400a800ac00b000\", \"0xc400c800cc00d000\", \"0xe400e800ec00f000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\nvmovapd ymm10, [rel .data2]\n\nvpsllw xmm2, xmm0, 32\nvpsllw xmm3, xmm1, 16\nvpsllw xmm4, xmm0, 8\nvpsllw xmm5, xmm1, 1\n\nvpsllw ymm6, ymm0, 32\nvpsllw ymm7, ymm1, 16\nvpsllw ymm8, ymm0, 8\nvpsllw ymm9, ymm1, 1\n\nvpsllw ymm10, ymm10, 0x9\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0x4142434445464748, 0x5152535455565758, 0x6162636465666768, 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsrad.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM4\":  [\"0x8042434445464748\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0xFFFF804200004546\", \"0x0000717200007576\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0xFFFFFFFF00000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x8042434445464748\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0xFFFF804200004546\", \"0x0000717200007576\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0xFFFFFFFF00000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x8042434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM11\": [\"0xFFFF804200004546\", \"0x0000717200007576\", \"0x0000414200004546\", \"0x0000717200007576\"],\n    \"XMM12\": [\"0xFFFFFFFF00000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x8042434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM14\": [\"0xFFFF804200004546\", \"0x0000717200007576\", \"0x0000414200004546\", \"0x0000717200007576\"],\n    \"XMM15\": [\"0xFFFFFFFF00000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\n\nvpsrad xmm4, xmm0, xmm1\nvpsrad xmm5, xmm0, xmm2\nvpsrad xmm6, xmm0, xmm3\n\nvpsrad xmm7, xmm0, [rdx + 32 * 1]\nvpsrad xmm8, xmm0, [rdx + 32 * 2]\nvpsrad xmm9, xmm0, [rdx + 32 * 3]\n\nvpsrad ymm10, ymm0, xmm1\nvpsrad ymm11, ymm0, xmm2\nvpsrad ymm12, ymm0, xmm3\n\nvpsrad ymm13, ymm0, [rdx + 32 * 1]\nvpsrad ymm14, ymm0, [rdx + 32 * 2]\nvpsrad ymm15, ymm0, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x8042434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\n\ndq 0x0000000000000000\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x0000000000000010\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x0000000000000020\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsrad_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM3\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x0000616200006566\", \"0x0000717200007576\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0041424300454647\", \"0x0051525300555657\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x0000616200006566\", \"0x0000717200007576\", \"0x0000616200006566\", \"0x0000717200007576\"],\n    \"XMM10\": [\"0x0041424300454647\", \"0x0051525300555657\", \"0x0041424300454647\", \"0x0051525300555657\"],\n    \"XMM11\": [\"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\", \"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\"],\n    \"XMM12\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x0020a1210022a323\", \"0x0028a929002aab2b\", \"0x0030b1310032b333\", \"0x0038b939003abb3b\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm13, [rel .data2]\n\nvpsrad xmm3, xmm0, 32\nvpsrad xmm4, xmm1, 16\nvpsrad xmm5, xmm0, 8\nvpsrad xmm6, xmm1, 1\nvpsrad xmm7, xmm2, 32\n\nvpsrad ymm8, ymm0, 32\nvpsrad ymm9, ymm1, 16\nvpsrad ymm10, ymm0, 8\nvpsrad ymm11, ymm1, 1\nvpsrad ymm12, ymm2, 32\n\nvpsrad ymm13, ymm13, 0x9\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n\ndq 0x8000800080008000\ndq 0x7000700070007000\ndq 0x8000800080008000\ndq 0x7000700070007000\n\n.data2:\ndq 0x4142434445464748, 0x5152535455565758, 0x6162636465666768, 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsravd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0xFF80000000007FFF\", \"0x00000000FFFFFFFF\", \"0x0400000000555555\", \"0xFFFFFFFF00000000\"],\n    \"XMM3\":  [\"0xFF80000000007FFF\", \"0x00000000FFFFFFFF\", \"0x0400000000555555\", \"0xFFFFFFFF00000000\"],\n    \"XMM4\":  [\"0xFF80000000007FFF\", \"0x00000000FFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0xFF80000000007FFF\", \"0x00000000FFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\nvpsravd ymm2, ymm0, ymm1\nvpsravd ymm3, ymm0, [rdx + 32]\n\nvpsravd xmm4, xmm0, xmm1\nvpsravd xmm5, xmm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x800000007FFFFFFF\ndq 0x0FFFFFFFFFFFFFFF\ndq 0x4000000055555555\ndq 0xFFFFFFFF7FFFFFFF\n\ndq 0x0000000800000010\ndq 0x0000002000000020\ndq 0x0000000400000008\ndq 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsraw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM4\":  [\"0x8042434445464748\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0xFF80004300450047\", \"0x0071007300750077\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0xFFFF000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x8042434445464748\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0xFF80004300450047\", \"0x0071007300750077\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0xFFFF000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x8042434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM11\": [\"0xFF80004300450047\", \"0x0071007300750077\", \"0x0041004300450047\", \"0x0071007300750077\"],\n    \"XMM12\": [\"0xFFFF000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x8042434445464748\", \"0x7172737475767778\", \"0x4142434445464748\", \"0x7172737475767778\"],\n    \"XMM14\": [\"0xFF80004300450047\", \"0x0071007300750077\", \"0x0041004300450047\", \"0x0071007300750077\"],\n    \"XMM15\": [\"0xFFFF000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\n\nvpsraw xmm4, xmm0, xmm1\nvpsraw xmm5, xmm0, xmm2\nvpsraw xmm6, xmm0, xmm3\n\nvpsraw xmm7, xmm0, [rdx + 32 * 1]\nvpsraw xmm8, xmm0, [rdx + 32 * 2]\nvpsraw xmm9, xmm0, [rdx + 32 * 3]\n\nvpsraw ymm10, ymm0, xmm1\nvpsraw ymm11, ymm0, xmm2\nvpsraw ymm12, ymm0, xmm3\n\nvpsraw ymm13, ymm0, [rdx + 32 * 1]\nvpsraw ymm14, ymm0, [rdx + 32 * 2]\nvpsraw ymm15, ymm0, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x8042434445464748\ndq 0x7172737475767778\ndq 0x4142434445464748\ndq 0x7172737475767778\n\ndq 0x0000000000000000\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x0000000000000008\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x0000000000000010\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsraw_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM3\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0041004300450047\", \"0x0051005300550057\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x0041004300450047\", \"0x0051005300550057\", \"0x0041004300450047\", \"0x0051005300550057\"],\n    \"XMM11\": [\"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\", \"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\"],\n    \"XMM12\": [\"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\", \"0xFFFFFFFFFFFFFFFF\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x0020002100220023\", \"0x00280029002a002b\", \"0x0030003100320033\", \"0x00380039003a003b\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm13, [rel .data2]\n\nvpsraw xmm3, xmm0, 32\nvpsraw xmm4, xmm1, 16\nvpsraw xmm5, xmm0, 8\nvpsraw xmm6, xmm1, 1\nvpsraw xmm7, xmm2, 16\n\nvpsraw ymm8, ymm0, 32\nvpsraw ymm9, ymm1, 16\nvpsraw ymm10, ymm0, 8\nvpsraw ymm11, ymm1, 1\nvpsraw ymm12, ymm2, 16\nvpsraw ymm13, ymm13, 0x9\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n\ndq 0x8000800080008000\ndq 0x7000700070007000\ndq 0x8000800080008000\ndq 0x7000700070007000\n\n.data2:\ndq 0x4142434445464748, 0x5152535455565758, 0x6162636465666768, 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsrld.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\":  [\"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x0041424300454647\", \"0x0051525300555657\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000414200004546\", \"0x0000515200005556\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\", \"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\"],\n    \"XMM7\":  [\"0x0041424300454647\", \"0x0051525300555657\", \"0x0041424300454647\", \"0x0051525300555657\"],\n    \"XMM8\":  [\"0x0000414200004546\", \"0x0000515200005556\", \"0x0000414200004546\", \"0x0000515200005556\"],\n    \"XMM9\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\", \"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\nvpsrld xmm1, xmm0, [rdx + 32 * 1]\nvpsrld xmm2, xmm0, [rdx + 32 * 2]\nvpsrld xmm3, xmm0, [rdx + 32 * 3]\nvpsrld xmm4, xmm0, [rdx + 32 * 4]\nvpsrld xmm5, xmm0, [rdx + 32 * 5]\n\nvpsrld ymm6, ymm0, [rdx + 32 * 1]\nvpsrld ymm7, ymm0, [rdx + 32 * 2]\nvpsrld ymm8, ymm0, [rdx + 32 * 3]\nvpsrld ymm9, ymm0, [rdx + 32 * 4]\nvpsrld ymm10, ymm0, [rdx + 32 * 5]\n\nvmovapd ymm11, [rdx + 32]\n\nvpsrld xmm12, xmm0, xmm11\nvpsrld ymm13, ymm0, xmm11\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x0000000000000001\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0x0000000000000008\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0x0000000000000010\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0x0000000000000020\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0x0000000000000040\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsrld_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x0000616200006566\", \"0x0000717200007576\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x0041424300454647\", \"0x0051525300555657\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x0000616200006566\", \"0x0000717200007576\", \"0x0000616200006566\", \"0x0000717200007576\"],\n    \"XMM8\": [\"0x0041424300454647\", \"0x0051525300555657\", \"0x0041424300454647\", \"0x0051525300555657\"],\n    \"XMM9\": [\"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\", \"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\"],\n    \"XMM10\": [\"0x0020a1210022a323\", \"0x0028a929002aab2b\", \"0x0030b1310032b333\", \"0x0038b939003abb3b\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\nvmovapd ymm10, [rel .data2]\n\nvpsrld xmm2, xmm0, 32\nvpsrld xmm3, xmm1, 16\nvpsrld xmm4, xmm0, 8\nvpsrld xmm5, xmm1, 1\n\nvpsrld ymm6, ymm0, 32\nvpsrld ymm7, ymm1, 16\nvpsrld ymm8, ymm0, 8\nvpsrld ymm9, ymm1, 1\n\nvpsrld ymm10, ymm10, 0x9\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0x4142434445464748, 0x5152535455565758, 0x6162636465666768, 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsrldq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0x41DEADBEEFBAD0DA\", \"0x0041414141414141\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x41BEEFDEADFAD0CA\", \"0x0041414141414141\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x41DEADBEEFBAD0DA\", \"0x0041414141414141\", \"0x41DEADBEEFBAD0DA\", \"0x0041414141414141\"],\n    \"XMM5\":  [\"0x41BEEFDEADFAD0CA\", \"0x0041414141414141\", \"0x41DEADBEEFBAD0DA\", \"0x0041414141414141\"],\n    \"XMM6\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x4141414141414141\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x4141414141414141\", \"0x0000000000000000\", \"0x4141414141414141\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0xDEADBEEFBAD0DAD1\", \"0x4141414141414141\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0xBEEFDEADFAD0CAD1\", \"0x4141414141414141\", \"0xDEADBEEFBAD0DAD1\", \"0x4141414141414141\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvpsrldq xmm2, xmm0, 1\nvpsrldq xmm3, xmm1, 1\nvpsrldq ymm4, ymm0, 1\nvpsrldq ymm5, ymm1, 1\n\nvpsrldq xmm6, xmm0, 16\nvpsrldq ymm7, ymm1, 16\n\nvpsrldq xmm8, xmm0, 8\nvpsrldq ymm9, ymm1, 8\n\nvpsrldq xmm10, xmm0, 0\nvpsrldq ymm11, ymm1, 0\n\nhlt\n\nalign 32\n.data:\ndq 0xDEADBEEFBAD0DAD1\ndq 0x4141414141414141\ndq 0xDEADBEEFBAD0DAD1\ndq 0x4141414141414141\n\ndq 0xBEEFDEADFAD0CAD1\ndq 0x4141414141414141\ndq 0xDEADBEEFBAD0DAD1\ndq 0x4141414141414141\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsrlq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\":  [\"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x0041424344454647\", \"0x0051525354555657\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000414243444546\", \"0x0000515253545556\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x0000000041424344\", \"0x0000000051525354\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\", \"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\"],\n    \"XMM7\":  [\"0x0041424344454647\", \"0x0051525354555657\", \"0x0041424344454647\", \"0x0051525354555657\"],\n    \"XMM8\":  [\"0x0000414243444546\", \"0x0000515253545556\", \"0x0000414243444546\", \"0x0000515253545556\"],\n    \"XMM9\":  [\"0x0000000041424344\", \"0x0000000051525354\", \"0x0000000041424344\", \"0x0000000051525354\"],\n    \"XMM10\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\", \"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\nvpsrlq xmm1, xmm0, [rdx + 32 * 1]\nvpsrlq xmm2, xmm0, [rdx + 32 * 2]\nvpsrlq xmm3, xmm0, [rdx + 32 * 3]\nvpsrlq xmm4, xmm0, [rdx + 32 * 4]\nvpsrlq xmm5, xmm0, [rdx + 32 * 5]\n\nvpsrlq ymm6, ymm0, [rdx + 32 * 1]\nvpsrlq ymm7, ymm0, [rdx + 32 * 2]\nvpsrlq ymm8, ymm0, [rdx + 32 * 3]\nvpsrlq ymm9, ymm0, [rdx + 32 * 4]\nvpsrlq ymm10, ymm0, [rdx + 32 * 5]\n\nvmovapd ymm11, [rdx + 32]\n\nvpsrlw xmm12, xmm0, xmm11\nvpsrlw ymm13, ymm0, xmm11\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x0000000000000001\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0x0000000000000008\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0x0000000000000010\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0x0000000000000020\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0x0000000000000040\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsrlq_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000041424344\", \"0x0000000051525354\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x0000616263646566\", \"0x0000717273747576\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0041424344454647\", \"0x0051525354555657\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x0000000041424344\", \"0x0000000051525354\", \"0x0000000041424344\", \"0x0000000051525354\"],\n    \"XMM9\":  [\"0x0000616263646566\", \"0x0000717273747576\", \"0x0000616263646566\", \"0x0000717273747576\"],\n    \"XMM10\": [\"0x0041424344454647\", \"0x0051525354555657\", \"0x0041424344454647\", \"0x0051525354555657\"],\n    \"XMM11\": [\"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\", \"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\"],\n    \"XMM12\": [\"0x0020a121a222a323\", \"0x0028a929aa2aab2b\", \"0x0030b131b232b333\", \"0x0038b939ba3abb3b\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\nvmovapd ymm12, [rel .data2]\n\nvpsrlq xmm2, xmm0, 64\nvpsrlq xmm3, xmm0, 32\nvpsrlq xmm4, xmm1, 16\nvpsrlq xmm5, xmm0, 8\nvpsrlq xmm6, xmm1, 1\n\nvpsrlq ymm7, ymm0, 64\nvpsrlq ymm8, ymm0, 32\nvpsrlq ymm9, ymm1, 16\nvpsrlq ymm10, ymm0, 8\nvpsrlq ymm11, ymm1, 1\n\nvpsrlq ymm12, ymm12, 0x9\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0x4142434445464748, 0x5152535455565758, 0x6162636465666768, 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsrlvd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0x0080000000007FFF\", \"0x0000003F00000000\", \"0x0400000000555555\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0080000000007FFF\", \"0x0000003F00000000\", \"0x0400000000555555\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x0080000000007FFF\", \"0x0000003F00000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0080000000007FFF\", \"0x0000003F00000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\nvpsrlvd ymm2, ymm0, ymm1\nvpsrlvd ymm3, ymm0, [rdx + 32]\n\nvpsrlvd xmm4, xmm0, xmm1\nvpsrlvd xmm5, xmm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x800000007FFFFFFF\ndq 0x0FFFFFFFFFFFFFFF\ndq 0x4000000055555555\ndq 0xFFFFFFFF7FFFFFFF\n\ndq 0x0000000800000010\ndq 0x0000001600000020\ndq 0x0000000400000008\ndq 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsrlvq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0x0000000000000000\", \"0x00000FFFFFFFFFFF\", \"0x0040000000555555\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000000000000\", \"0x00000FFFFFFFFFFF\", \"0x0040000000555555\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x0000000000000000\", \"0x00000FFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000000000000000\", \"0x00000FFFFFFFFFFF\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\n\nvpsrlvq ymm2, ymm0, ymm1\nvpsrlvq ymm3, ymm0, [rdx + 32]\n\nvpsrlvq xmm4, xmm0, xmm1\nvpsrlvq xmm5, xmm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x800000007FFFFFFF\ndq 0x0FFFFFFFFFFFFFFF\ndq 0x4000000055555555\ndq 0xFFFFFFFF7FFFFFFF\n\ndq 0xFFFFFFFFFFFFFF10\ndq 0x0000000000000010\ndq 0x0000000000000008\ndq 0x0000000000000040\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsrlw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM1\":  [\"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x0041004300450047\", \"0x0051005300550057\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\", \"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\"],\n    \"XMM7\":  [\"0x0041004300450047\", \"0x0051005300550057\", \"0x0041004300450047\", \"0x0051005300550057\"],\n    \"XMM8\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM12\": [\"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM13\": [\"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\", \"0x20A121A222A323A4\", \"0x28A929AA2AAB2BAC\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\n\nvpsrlw xmm1, xmm0, [rdx + 32 * 1]\nvpsrlw xmm2, xmm0, [rdx + 32 * 2]\nvpsrlw xmm3, xmm0, [rdx + 32 * 3]\nvpsrlw xmm4, xmm0, [rdx + 32 * 4]\nvpsrlw xmm5, xmm0, [rdx + 32 * 5]\n\nvpsrlw ymm6, ymm0, [rdx + 32 * 1]\nvpsrlw ymm7, ymm0, [rdx + 32 * 2]\nvpsrlw ymm8, ymm0, [rdx + 32 * 3]\nvpsrlw ymm9, ymm0, [rdx + 32 * 4]\nvpsrlw ymm10, ymm0, [rdx + 32 * 5]\n\nvmovapd ymm11, [rdx + 32]\n\nvpsrlw xmm12, xmm0, xmm11\nvpsrlw ymm13, ymm0, xmm11\n\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x0000000000000001\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0x0000000000000008\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0x0000000000000010\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0x0000000000000020\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n\ndq 0x0000000000000040\ndq 0x0000000000000000\ndq 0x0000000000000000\ndq 0x0000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsrlw_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x0041004300450047\", \"0x0051005300550057\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x0041004300450047\", \"0x0051005300550057\", \"0x0041004300450047\", \"0x0051005300550057\"],\n    \"XMM9\": [\"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\", \"0x30B131B232B333B4\", \"0x38B939BA3ABB3BBC\"],\n    \"XMM10\": [\"0x0020002100220023\", \"0x00280029002a002b\", \"0x0030003100320033\", \"0x00380039003a003b\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\nvmovapd ymm10, [rel .data2]\n\nvpsrlw xmm2, xmm0, 32\nvpsrlw xmm3, xmm1, 16\nvpsrlw xmm4, xmm0, 8\nvpsrlw xmm5, xmm1, 1\n\nvpsrlw ymm6, ymm0, 32\nvpsrlw ymm7, ymm1, 16\nvpsrlw ymm8, ymm0, 8\nvpsrlw ymm9, ymm1, 1\n\nvpsrlw ymm10, ymm10, 0x9\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0x4142434445464748, 0x5152535455565758, 0x6162636465666768, 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsubb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x2020202020202020\", \"0x2020202020202020\"],\n    \"XMM4\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x2020202020202020\", \"0x2020202020202020\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Memory operand\nvpsubb xmm2, xmm0, [rdx + 32]\nvpsubb ymm3, ymm0, [rdx + 32]\n\n; Register only\nvpsubb xmm4, xmm0, xmm1\nvpsubb ymm5, ymm0, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsubd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0xFFFFFFFF65666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0xFFFFFFFF45464748\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x0000000020202020\", \"0x2020202020202020\"],\n    \"XMM4\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x0000000020202020\", \"0x2020202020202020\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Memory operand\nvpsubd xmm2, xmm0, [rdx + 32]\nvpsubd ymm3, ymm0, [rdx + 32]\n\n; Register only\nvpsubd xmm4, xmm0, xmm1\nvpsubd ymm5, ymm0, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0xFFFFFFFF65666768\ndq 0x7172737475767778\n\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xFFFFFFFF45464748\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsubq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0xFFFFFFFFFFFFFFFF\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0xFFFFFFFFFFFFFFFF\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x0000000000000000\", \"0x2020202020202020\"],\n    \"XMM4\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x0000000000000000\", \"0x2020202020202020\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Memory operand\nvpsubq xmm2, xmm0, [rdx + 32]\nvpsubq ymm3, ymm0, [rdx + 32]\n\n; Register only\nvpsubq xmm4, xmm0, xmm1\nvpsubq ymm5, ymm0, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0xFFFFFFFFFFFFFFFF\ndq 0x7172737475767778\n\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xFFFFFFFFFFFFFFFF\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsubsb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x8062636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0x7FE0E0E0E0E0E0E0\", \"0xE0E0E0E0E0E0E0E0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x7FE0E0E0E0E0E0E0\", \"0xE0E0E0E0E0E0E0E0\", \"0xE0E0E0E0E0E0E0E0\", \"0xE0E0E0E0E0E0E0E0\"],\n    \"XMM4\": [\"0x7FE0E0E0E0E0E0E0\", \"0xE0E0E0E0E0E0E0E0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x7FE0E0E0E0E0E0E0\", \"0xE0E0E0E0E0E0E0E0\", \"0xE0E0E0E0E0E0E0E0\", \"0xE0E0E0E0E0E0E0E0\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvpsubsb xmm2, xmm0, xmm1\nvpsubsb ymm3, ymm0, ymm1\n\nvpsubsb xmm4, xmm0, [rdx + 32]\nvpsubsb ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x8062636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsubsw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x8000636465666768\", \"0x7172737475767778\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0x7FFFDFE0DFE0DFE0\", \"0xDFE0DFE0DFE0DFE0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x7FFFDFE0DFE0DFE0\", \"0xDFE0DFE0DFE0DFE0\", \"0xDFE0DFE0DFE0DFE0\", \"0xDFE0DFE0DFE0DFE0\"],\n    \"XMM4\": [\"0x7FFFDFE0DFE0DFE0\", \"0xDFE0DFE0DFE0DFE0\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x7FFFDFE0DFE0DFE0\", \"0xDFE0DFE0DFE0DFE0\", \"0xDFE0DFE0DFE0DFE0\", \"0xDFE0DFE0DFE0DFE0\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvpsubsw xmm2, xmm0, xmm1\nvpsubsw ymm3, ymm0, ymm1\n\nvpsubsw xmm4, xmm0, [rdx + 32]\nvpsubsw ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x4142434445464748\ndq 0x5152535455565758\n\ndq 0x8000636465666768\ndq 0x7172737475767778\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsubusb.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x6162636445464748\", \"0x5152535455565758\", \"0x6162636445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x4142434465666768\", \"0x7172737475767778\", \"0x4142434465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0x2020202000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x2020202000000000\", \"0x0000000000000000\", \"0x2020202000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x2020202000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x2020202000000000\", \"0x0000000000000000\", \"0x2020202000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvpsubusb xmm2, xmm0, xmm1\nvpsubusb ymm3, ymm0, ymm1\n\nvpsubusb xmm4, xmm0, [rdx + 32]\nvpsubusb ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x6162636445464748\ndq 0x5152535455565758\ndq 0x6162636445464748\ndq 0x5152535455565758\n\ndq 0x4142434465666768\ndq 0x7172737475767778\ndq 0x4142434465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsubusw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x6162636445464748\", \"0x5152535455565758\", \"0x6162636445464748\", \"0x5152535455565758\"],\n    \"XMM1\": [\"0x4142434465666768\", \"0x7172737475767778\", \"0x4142434465666768\", \"0x7172737475767778\"],\n    \"XMM2\": [\"0x2020202000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x2020202000000000\", \"0x0000000000000000\", \"0x2020202000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x2020202000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x2020202000000000\", \"0x0000000000000000\", \"0x2020202000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvpsubusw xmm2, xmm0, xmm1\nvpsubusw ymm3, ymm0, ymm1\n\nvpsubusw xmm4, xmm0, [rdx + 32]\nvpsubusw ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x6162636445464748\ndq 0x5152535455565758\ndq 0x6162636445464748\ndq 0x5152535455565758\n\ndq 0x4142434465666768\ndq 0x7172737475767778\ndq 0x4142434465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vpsubw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x6162636465666768\", \"0x7172737475767778\", \"0xFFFF636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0xFFFF434445464748\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x0000202020202020\", \"0x2020202020202020\"],\n    \"XMM4\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x2020202020202020\", \"0x2020202020202020\", \"0x0000202020202020\", \"0x2020202020202020\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\n; Memory operand\nvpsubw xmm2, xmm0, [rdx + 32]\nvpsubw ymm3, ymm0, [rdx + 32]\n\n; Register only\nvpsubw xmm4, xmm0, xmm1\nvpsubw ymm5, ymm0, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0xFFFF636465666768\ndq 0x7172737475767778\n\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xFFFF434445464748\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vptest.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"R15\":  \"0x000000E9D67A759\",\n    \"XMM0\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM2\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\n; Uses AX and BX and stores result in r15\n; CF:ZF\n%macro zfcfmerge 0\n  lahf\n\n  ; Shift CF to zero\n  shr ax, 8\n\n  ; Move to a temp\n  mov bx, ax\n  and rbx, 1\n\n  shl r15, 1\n  or r15, rbx\n\n  shl r15, 1\n\n  ; Move to a temp\n  mov bx, ax\n\n  ; Extract ZF\n  shr bx, 6\n  and rbx, 1\n\n  ; Insert ZF\n  or r15, rbx\n%endmacro\n\n%macro tests 1\n  vptest %{1}0, [rdx + 32 * 3]\n  zfcfmerge\n  vptest %{1}1, [rdx + 32 * 4]\n  zfcfmerge\n  vptest %{1}2, [rdx + 32 * 5]\n  zfcfmerge\n  vptest %{1}0, [rdx + 32 * 6]\n  zfcfmerge\n  vptest %{1}1, [rdx + 32 * 7]\n  zfcfmerge\n  vptest %{1}2, [rdx + 32 * 8]\n  zfcfmerge\n  vptest %{1}0, [rdx + 32 * 9]\n  zfcfmerge\n  vptest %{1}1, [rdx + 32 * 10]\n  zfcfmerge\n  vptest %{1}2, [rdx + 32 * 11]\n  zfcfmerge\n%endmacro\n\nlea rdx, [rel .data]\n\nmov rax, 0\nmov rbx, 0\nmov r15, 0\n\nvmovaps ymm0, [rdx + 32 * 0]\nvmovaps ymm1, [rdx + 32 * 1]\nvmovaps ymm2, [rdx + 32 * 2]\n\ntests xmm\ntests ymm\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000\ndq 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF\ndq 0x4142434445464748, 0x5152535455565758, 0x4142434445464748, 0x5152535455565758\n\n; Match\ndq 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000\ndq 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF\ndq 0x4142434445464748, 0x5152535455565758, 0x4142434445464748, 0x5152535455565758\n\n; Match on not\ndq 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF\ndq 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000\ndq 0xBEBDBCBBBAB9B8B7, 0xAEADACABAAA9A8A7, 0xBEBDBCBBBAB9B8B7, 0xAEADACABAAA9A8A7\n\n; No match on either case\ndq 1, 1, 1, 1\ndq 2, 2, 2, 2\ndq 3, 3, 3, 3\n"
  },
  {
    "path": "unittests/ASM/VEX/vpunpckhbw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x7555765677577858\", \"0x7151725273537454\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x7555765677577858\", \"0x7151725273537454\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x7555765677577858\", \"0x7151725273537454\", \"0x1199119900880088\", \"0x33BB33BB22AA22AA\"],\n    \"XMM5\": [\"0x7555765677577858\", \"0x7151725273537454\", \"0x1199119900880088\", \"0x33BB33BB22AA22AA\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpunpckhbw xmm2, xmm0, xmm1\nvpunpckhbw xmm3, xmm0, [rdx + 32]\n\nvpunpckhbw ymm4, ymm0, ymm1\nvpunpckhbw ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xFFFFEEEEDDDDCCCC\ndq 0xBBBBAAAA99998888\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x7777666655554444\ndq 0x3333222211110000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpunpckhdq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x7576777855565758\", \"0x7172737451525354\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x7576777855565758\", \"0x7172737451525354\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x7576777855565758\", \"0x7172737451525354\", \"0x88888888CCCCCCCC\", \"0x99999999DDDDDDDD\"],\n    \"XMM5\": [\"0x7576777855565758\", \"0x7172737451525354\", \"0x88888888CCCCCCCC\", \"0x99999999DDDDDDDD\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpunpckhdq xmm2, xmm0, xmm1\nvpunpckhdq xmm3, xmm0, [rdx + 32]\n\nvpunpckhdq ymm4, ymm0, ymm1\nvpunpckhdq ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xFFFFFFFFEEEEEEEE\ndq 0xDDDDDDDDCCCCCCCC\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0xBBBBBBBBAAAAAAAA\ndq 0x9999999988888888\n"
  },
  {
    "path": "unittests/ASM/VEX/vpunpckhqdq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x5152535455565758\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x5152535455565758\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x5152535455565758\", \"0x7172737475767778\", \"0xEEEEEEEEEEEEEEEE\", \"0xCCCCCCCCCCCCCCCC\"],\n    \"XMM5\": [\"0x5152535455565758\", \"0x7172737475767778\", \"0xEEEEEEEEEEEEEEEE\", \"0xCCCCCCCCCCCCCCCC\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpunpckhqdq xmm2, xmm0, xmm1\nvpunpckhqdq xmm3, xmm0, [rdx + 32]\n\nvpunpckhqdq ymm4, ymm0, ymm1\nvpunpckhqdq ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0xBBBBBBBBBBBBBBBB\ndq 0xCCCCCCCCCCCCCCCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vpunpckhwd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x7576555677785758\", \"0x7172515273745354\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x7576555677785758\", \"0x7172515273745354\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x7576555677785758\", \"0x7172515273745354\", \"0x1111999900008888\", \"0x3333BBBB2222AAAA\"],\n    \"XMM5\": [\"0x7576555677785758\", \"0x7172515273745354\", \"0x1111999900008888\", \"0x3333BBBB2222AAAA\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpunpckhwd xmm2, xmm0, xmm1\nvpunpckhwd xmm3, xmm0, [rdx + 32]\n\nvpunpckhwd ymm4, ymm0, ymm1\nvpunpckhwd ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xFFFFEEEEDDDDCCCC\ndq 0xBBBBAAAA99998888\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x7777666655554444\ndq 0x3333222211110000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpunpcklbw.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x6545664667476848\", \"0x6141624263436444\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x6545664667476848\", \"0x6141624263436444\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x6545664667476848\", \"0x6141624263436444\", \"0x55DD55DD44CC44CC\", \"0x77FF77FF66EE66EE\"],\n    \"XMM5\": [\"0x6545664667476848\", \"0x6141624263436444\", \"0x55DD55DD44CC44CC\", \"0x77FF77FF66EE66EE\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpunpcklbw xmm2, xmm0, [rdx + 32]\nvpunpcklbw xmm3, xmm0, xmm1\n\nvpunpcklbw ymm4, ymm0, [rdx + 32]\nvpunpcklbw ymm5, ymm0, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xFFFFEEEEDDDDCCCC\ndq 0xBBBBAAAA99998888\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x7777666655554444\ndq 0x3333222211110000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpunpckldq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x6566676845464748\", \"0x6162636441424344\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x6566676845464748\", \"0x6162636441424344\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x6566676845464748\", \"0x6162636441424344\", \"0xAAAAAAAAEEEEEEEE\", \"0xBBBBBBBBFFFFFFFF\"],\n    \"XMM5\": [\"0x6566676845464748\", \"0x6162636441424344\", \"0xAAAAAAAAEEEEEEEE\", \"0xBBBBBBBBFFFFFFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpunpckldq xmm2, xmm0, [rdx + 32]\nvpunpckldq xmm3, xmm0, xmm1\n\nvpunpckldq ymm4, ymm0, [rdx + 32]\nvpunpckldq ymm5, ymm0, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xFFFFFFFFEEEEEEEE\ndq 0xDDDDDDDDCCCCCCCC\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0xBBBBBBBBAAAAAAAA\ndq 0x9999999988888888\n"
  },
  {
    "path": "unittests/ASM/VEX/vpunpcklqdq.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x4142434445464748\", \"0x6162636465666768\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434445464748\", \"0x6162636465666768\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4142434445464748\", \"0x6162636465666768\", \"0xFFFFFFFFFFFFFFFF\", \"0xBBBBBBBBBBBBBBBB\"],\n    \"XMM5\": [\"0x4142434445464748\", \"0x6162636465666768\", \"0xFFFFFFFFFFFFFFFF\", \"0xBBBBBBBBBBBBBBBB\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpunpcklqdq xmm2, xmm0, [rdx + 32]\nvpunpcklqdq xmm3, xmm0, xmm1\n\nvpunpcklqdq ymm4, ymm0, [rdx + 32]\nvpunpcklqdq ymm5, ymm0, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0xBBBBBBBBBBBBBBBB\ndq 0xCCCCCCCCCCCCCCCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vpunpcklwd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x6566454667684748\", \"0x6162414263644344\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x6566454667684748\", \"0x6162414263644344\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x6566454667684748\", \"0x6162414263644344\", \"0x5555DDDD4444CCCC\", \"0x7777FFFF6666EEEE\"],\n    \"XMM5\": [\"0x6566454667684748\", \"0x6162414263644344\", \"0x5555DDDD4444CCCC\", \"0x7777FFFF6666EEEE\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvpunpcklwd xmm2, xmm0, [rdx + 32]\nvpunpcklwd xmm3, xmm0, xmm1\n\nvpunpcklwd ymm4, ymm0, [rdx + 32]\nvpunpcklwd ymm5, ymm0, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xFFFFEEEEDDDDCCCC\ndq 0xBBBBAAAA99998888\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x7777666655554444\ndq 0x3333222211110000\n"
  },
  {
    "path": "unittests/ASM/VEX/vpxor.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0xCCCCCCCC75767778\", \"0x61626364DDDDDDDD\", \"0xEEEEEEEE55565758\", \"0x41424344FFFFFFFF\"],\n    \"XMM2\": [\"0x8D8E8F8830303030\", \"0x30303030888B8A85\", \"0x8F8C8D8A30303030\", \"0x303030308A898887\"],\n    \"XMM3\": [\"0x8D8E8F8830303030\", \"0x30303030888B8A85\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x8D8E8F8830303030\", \"0x30303030888B8A85\", \"0x8F8C8D8A30303030\", \"0x303030308A898887\"],\n    \"XMM5\": [\"0x8D8E8F8830303030\", \"0x30303030888B8A85\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data1]\nlea rbx, [rel .data2]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rbx]\n\n; Register only\nvpxor ymm2, ymm0, ymm1\nvpxor xmm3, xmm0, xmm1\n\n; With memory operand\nvpxor ymm4, ymm0, [rbx]\nvpxor xmm5, xmm0, [rbx]\n\nhlt\n\nalign 32\n.data1:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0xCCCCCCCC75767778\ndq 0x61626364DDDDDDDD\ndq 0xEEEEEEEE55565758\ndq 0x41424344FFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vrcpps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"R8\": \"1\",\n    \"R9\": \"1\"\n  }\n}\n%endif\n\n\nsection .text\nglobal _start\n\n%include \"checkprecision.mac\"\n\n; clobbers ymm15\n; returns the comparison result in rax\n%macro same_pdwords 1 ; receives the ymms register\n    vextractf128 xmm15, %1, 0\n    vmovd eax, xmm15\n    vmovd xmm15, eax\n    vbroadcastss ymm15, xmm15  ; broadcast lower 32bits across all 8 lanes\n    vpcmpeqd ymm15, ymm15, %1  ; equality mask on all lanes\n    vmovmskps eax, ymm15       ; gets sign bit of each lane into eax\n    cmp eax, 0b11111111        ; check all 8 lanes\n    sete al\n    movzx rax, al\n%endmacro\n\n; clobbers xmm15\n; returns the comparison result in rax\n%macro same_pdwords_x 1 ; receives the xmms register\n    movd eax, %1\n    movd xmm15, eax\n    pshufd xmm15, xmm15, 0 ; has the lower 32bits of %1 accross all lanes \n    pcmpeqd xmm15, %1 ; has equalty mask on all lanes\n    movmskps eax, xmm15 ; gets sign bit of each lane into eax\n    cmp eax, 0b1111\n    sete al\n    movzx rax, al\n%endmacro\n\n_start:\nvmovapd ymm0, [rel arg1]\nvmovapd ymm1, [rel arg2]\n\n; Register only\nvrcpps ymm2, ymm0\nvrcpps xmm3, xmm0\n\n; Memory operand\nvrcpps ymm4, [rel arg2]\nvrcpps xmm5, [rel arg2]\n\n; Check that each register is properly filled\nsame_pdwords ymm2\nmov r8, rax\n\nsame_pdwords_x xmm3\nand r8, rax\n\nsame_pdwords ymm4\nand r8, rax\n\nsame_pdwords_x xmm5\nand r8, rax\n\n; Result checks\nvpextrd [rel result], xmm2, 0\ncheck_relerr rel eresult1, rel result, rel tolerance\nmov r9, rax\n\nvpextrd [rel result], xmm3, 0\ncheck_relerr rel eresult1, rel result, rel tolerance\nand r9, rax\n\nvpextrd [rel result], xmm4, 0\ncheck_relerr rel eresult2, rel result, rel tolerance\nand r9, rax\n\nvpextrd [rel result], xmm5, 0\ncheck_relerr rel eresult2, rel result, rel tolerance\nand r9, rax\nhlt\n\nalign 4096\nresult: times 4 dq 0\n\nalign 32\narg1:\ndq 0x3F8000003F800000 ; 1.0\ndq 0x3F8000003F800000\ndq 0x3F8000003F800000\ndq 0x3F8000003F800000\n\narg2:\ndq 0x4080000040800000 ; 4.0\ndq 0x4080000040800000\ndq 0x4080000040800000\ndq 0x4080000040800000\n\neresult1:\ndd 0x3F800000 ; 1.0\n\neresult2:\ndd 0x3e800000 ; 0.25\n\ntolerance:\ndd 0x39c00000\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/VEX/vrcpss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"R9\": \"1\",\n    \"XMM0\": [\"0x3F8000003F800000\", \"0x3F8000003F800000\", \"0x3F8000003F800000\", \"0x3F8000003F800000\"],\n    \"XMM1\": [\"0x4080000040800000\", \"0x4080000040800000\", \"0x4080000040800000\", \"0x4080000040800000\"],\n    \"XMM2\": [\"0x4080000000000000\", \"0x4080000040800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x3F80000000000000\", \"0x3F8000003F800000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nsection .text\nglobal _start\n\n%include \"checkprecision.mac\"\n\n; This test checks that:\n; - the results of the reciprocal sqrt is within 1.5*2^-12 error margin.\n; - the top 128 bits of ymms registers are zero.\n; - bits [127:32] are correctly copied from the first argument to vrcpss.\n_start:\nvmovapd ymm0, [rel arg1]\nvmovapd ymm1, [rel arg2]\n\n; Register only\nvrcpss xmm2, xmm1, xmm0\n\n; Memory operand\nvrcpss xmm3, xmm0, [rel arg2]\n\n; Check precision\nvpextrd [rel result], xmm2, 0\ncheck_relerr rel eresult1, rel result, rel tolerance\nand r9, rax\n\nvpextrd [rel result], xmm3, 0\ncheck_relerr rel eresult2, rel result, rel tolerance\nmov r9, rax\n\n; Insert 0s in the bottom 32bits\nxor rax, rax\nvpinsrd xmm2, xmm2, eax, 0\nvpinsrd xmm3, xmm3, eax, 0\nhlt\n\nalign 4096\nresult: times 2 dq 0\n\nalign 32\narg1:\ndq 0x3F8000003F800000 ; 1.0\ndq 0x3F8000003F800000\ndq 0x3F8000003F800000\ndq 0x3F8000003F800000\n\narg2:\ndq 0x4080000040800000 ; 4.0\ndq 0x4080000040800000\ndq 0x4080000040800000\ndq 0x4080000040800000\n\neresult1:\ndd 0x3F800000 ; 1.0\n\neresult2:\ndd 0x3e800000 ; 0.25\n\ntolerance:\ndd 0x39c00000\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/VEX/vroundpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x0000000000000000\", \"0x8000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x0000000000000000\", \"0xBFF0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x3FF0000000000000\", \"0x8000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x0000000000000000\", \"0x8000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x0000000000000000\", \"0x8000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x0000000000000000\", \"0xBFF0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x3FF0000000000000\", \"0x8000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0x8000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x0000000000000000\", \"0x8000000000000000\", \"0x0000000000000000\", \"0x8000000000000000\"],\n    \"XMM9\":  [\"0x0000000000000000\", \"0xBFF0000000000000\", \"0x0000000000000000\", \"0xBFF0000000000000\"],\n    \"XMM10\": [\"0x3FF0000000000000\", \"0x8000000000000000\", \"0x3FF0000000000000\", \"0x8000000000000000\"],\n    \"XMM11\": [\"0x0000000000000000\", \"0x8000000000000000\", \"0x0000000000000000\", \"0x8000000000000000\"],\n    \"XMM12\": [\"0x0000000000000000\", \"0x8000000000000000\", \"0x0000000000000000\", \"0x8000000000000000\"],\n    \"XMM13\": [\"0x0000000000000000\", \"0xBFF0000000000000\", \"0x0000000000000000\", \"0xBFF0000000000000\"],\n    \"XMM14\": [\"0x3FF0000000000000\", \"0x8000000000000000\", \"0x3FF0000000000000\", \"0x8000000000000000\"],\n    \"XMM15\": [\"0x0000000000000000\", \"0x8000000000000000\", \"0x0000000000000000\", \"0x8000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvroundpd xmm0, [rdx], 00000000b ; Nearest\nvroundpd xmm1, [rdx], 00000001b ; -inf\nvroundpd xmm2, [rdx], 00000010b ; +inf\nvroundpd xmm3, [rdx], 00000011b ; truncate\n\nvroundpd ymm8,  [rdx], 00000000b ; Nearest\nvroundpd ymm9,  [rdx], 00000001b ; -inf\nvroundpd ymm10, [rdx], 00000010b ; +inf\nvroundpd ymm11, [rdx], 00000011b ; truncate\n\n; MXCSR\n; Set to nearest\nmov eax, 0x1F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundpd xmm4,  [rdx], 00000100b\nvroundpd ymm12, [rdx], 00000100b\n\n; Set to -inf\nmov eax, 0x3F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundpd xmm5,  [rdx], 00000100b\nvroundpd ymm13, [rdx], 00000100b\n\n; Set to +inf\nmov eax, 0x5F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundpd xmm6,  [rdx], 00000100b\nvroundpd ymm14, [rdx], 00000100b\n\n; Set to truncate\nmov eax, 0x7F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundpd xmm7,  [rdx], 00000100b\nvroundpd ymm15, [rdx], 00000100b\n\nhlt\n\nalign 4096\n.data:\ndq 0.5, -0.5\ndq 0.5, -0.5\n\n.mxcsr:\ndq 0, 0\n"
  },
  {
    "path": "unittests/ASM/VEX/vroundps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0xC000000040000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0xBF80000000000000\", \"0xC00000003F800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x800000003F800000\", \"0xBF80000040000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x8000000000000000\", \"0xBF8000003F800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x8000000000000000\", \"0xC000000040000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0xBF80000000000000\", \"0xC00000003F800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x800000003F800000\", \"0xBF80000040000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x8000000000000000\", \"0xBF8000003F800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x8000000000000000\", \"0xC000000040000000\", \"0x8000000000000000\", \"0xC000000040000000\"],\n    \"XMM9\":  [\"0xBF80000000000000\", \"0xC00000003F800000\", \"0xBF80000000000000\", \"0xC00000003F800000\"],\n    \"XMM10\": [\"0x800000003F800000\", \"0xBF80000040000000\", \"0x800000003F800000\", \"0xBF80000040000000\"],\n    \"XMM11\": [\"0x8000000000000000\", \"0xBF8000003F800000\", \"0x8000000000000000\", \"0xBF8000003F800000\"],\n    \"XMM12\": [\"0x8000000000000000\", \"0xC000000040000000\", \"0x8000000000000000\", \"0xC000000040000000\"],\n    \"XMM13\": [\"0xBF80000000000000\", \"0xC00000003F800000\", \"0xBF80000000000000\", \"0xC00000003F800000\"],\n    \"XMM14\": [\"0x800000003F800000\", \"0xBF80000040000000\", \"0x800000003F800000\", \"0xBF80000040000000\"],\n    \"XMM15\": [\"0x8000000000000000\", \"0xBF8000003F800000\", \"0x8000000000000000\", \"0xBF8000003F800000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvroundps xmm0, [rdx], 00000000b ; Nearest\nvroundps xmm1, [rdx], 00000001b ; -inf\nvroundps xmm2, [rdx], 00000010b ; +inf\nvroundps xmm3, [rdx], 00000011b ; truncate\n\nvroundps ymm8,  [rdx], 00000000b ; Nearest\nvroundps ymm9,  [rdx], 00000001b ; -inf\nvroundps ymm10, [rdx], 00000010b ; +inf\nvroundps ymm11, [rdx], 00000011b ; truncate\n\n; MXCSR\n; Set to nearest\nmov eax, 0x1F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundps xmm4,  [rdx], 00000100b\nvroundps ymm12, [rdx], 00000100b\n\n; Set to -inf\nmov eax, 0x3F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundps xmm5,  [rdx], 00000100b\nvroundps ymm13, [rdx], 00000100b\n\n; Set to +inf\nmov eax, 0x5F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundps xmm6,  [rdx], 00000100b\nvroundps ymm14, [rdx], 00000100b\n\n; Set to truncate\nmov eax, 0x7F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundps xmm7,  [rdx], 00000100b\nvroundps ymm15, [rdx], 00000100b\n\nhlt\n\nalign 4096\n.data:\ndd 0.5, -0.5, 1.5, -1.5\ndd 0.5, -0.5, 1.5, -1.5\n\n.mxcsr:\ndq 0, 0\n"
  },
  {
    "path": "unittests/ASM/VEX/vroundsd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x0000000000000000\", \"0xBFE0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x0000000000000000\", \"0xBFE0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0x3FF0000000000000\", \"0xBFE0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x0000000000000000\", \"0xBFE0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x0000000000000000\", \"0xBFE0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x0000000000000000\", \"0xBFE0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x3FF0000000000000\", \"0xBFE0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x0000000000000000\", \"0xBFE0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx]\nvmovaps ymm2, [rdx]\nvmovaps ymm3, [rdx]\nvmovaps ymm4, [rdx]\nvmovaps ymm5, [rdx]\nvmovaps ymm6, [rdx]\nvmovaps ymm7, [rdx]\n\nvroundsd xmm0, xmm0, [rdx], 00000000b ; Nearest\nvroundsd xmm1, xmm1, [rdx], 00000001b ; -inf\nvroundsd xmm2, xmm2, [rdx], 00000010b ; +inf\nvroundsd xmm3, xmm3, [rdx], 00000011b ; truncate\n\n; MXCSR\n; Set to nearest\nmov eax, 0x1F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundsd xmm4, xmm4, [rdx], 00000100b\n\n; Set to -inf\nmov eax, 0x3F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundsd xmm5, xmm5, [rdx], 00000100b\n\n; Set to +inf\nmov eax, 0x5F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundsd xmm6, xmm6, [rdx], 00000100b\n\n; Set to truncate\nmov eax, 0x7F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundsd xmm7, xmm7, [rdx], 00000100b\n\nhlt\n\nalign 4096\n.data:\ndq 0.5, -0.5\ndq 0.5, -0.5\n\n.mxcsr:\ndq 0, 0\n"
  },
  {
    "path": "unittests/ASM/VEX/vroundss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xBF00000000000000\", \"0xBFC000003FC00000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0xBF00000000000000\", \"0xBFC000003FC00000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\": [\"0xBF0000003F800000\", \"0xBFC000003FC00000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0xBF00000000000000\", \"0xBFC000003FC00000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xBF00000000000000\", \"0xBFC000003FC00000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0xBF00000000000000\", \"0xBFC000003FC00000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0xBF0000003F800000\", \"0xBFC000003FC00000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0xBF00000000000000\", \"0xBFC000003FC00000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx]\nvmovaps ymm2, [rdx]\nvmovaps ymm3, [rdx]\nvmovaps ymm4, [rdx]\nvmovaps ymm5, [rdx]\nvmovaps ymm6, [rdx]\nvmovaps ymm7, [rdx]\n\nvroundss xmm0, xmm0, [rdx], 00000000b ; Nearest\nvroundss xmm1, xmm1, [rdx], 00000001b ; -inf\nvroundss xmm2, xmm2, [rdx], 00000010b ; +inf\nvroundss xmm3, xmm3, [rdx], 00000011b ; truncate\n\n; MXCSR\n; Set to nearest\nmov eax, 0x1F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundss xmm4, xmm4, [rdx], 00000100b\n\n; Set to -inf\nmov eax, 0x3F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundss xmm5, xmm5, [rdx], 00000100b\n\n; Set to +inf\nmov eax, 0x5F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundss xmm6, xmm6, [rdx], 00000100b\n\n; Set to truncate\nmov eax, 0x7F80\nmov [rel .mxcsr], eax\nldmxcsr [rel .mxcsr]\n\nvroundss xmm7, xmm7, [rdx], 00000100b\n\nhlt\n\nalign 4096\n.data:\ndd 0.5, -0.5, 1.5, -1.5\ndd 0.5, -0.5, 1.5, -1.5\n\n.mxcsr:\ndq 0, 0\n"
  },
  {
    "path": "unittests/ASM/VEX/vrsqrtps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"R8\": \"1\",\n    \"R9\": \"1\"\n  }\n}\n%endif\n\nsection .text\nglobal _start\n\n%include \"checkprecision.mac\"\n\n; clobbers ymm15\n; returns the comparison result in rax\n%macro same_pdwords 1 ; receives the ymms register\n    vextractf128 xmm15, %1, 0\n    vmovd eax, xmm15\n    vmovd xmm15, eax\n    vbroadcastss ymm15, xmm15  ; broadcast lower 32bits across all 8 lanes\n    vpcmpeqd ymm15, ymm15, %1  ; equality mask on all lanes\n    vmovmskps eax, ymm15       ; gets sign bit of each lane into eax\n    cmp eax, 0b11111111        ; check all 8 lanes\n    sete al\n    movzx rax, al\n%endmacro\n\n; clobbers xmm15\n; returns the comparison result in rax\n%macro same_pdwords_x 1 ; receives the xmms register\n    movd eax, %1\n    movd xmm15, eax\n    pshufd xmm15, xmm15, 0 ; has the lower 32bits of %1 accross all lanes \n    pcmpeqd xmm15, %1 ; has equalty mask on all lanes\n    movmskps eax, xmm15 ; gets sign bit of each lane into eax\n    cmp eax, 0b1111\n    sete al\n    movzx rax, al\n%endmacro\n\n_start:\nvmovapd ymm0, [rel arg1]\nvmovapd ymm1, [rel arg2]\nvmovapd ymm2, [rel arg3]\nvmovapd ymm3, [rel arg4]\nvmovapd ymm4, [rel arg5]\nvmovapd ymm5, [rel arg5]\nvmovapd ymm6, [rel arg5]\nvmovapd ymm7, [rel arg5]\n\n; Register only\nvrsqrtps ymm0, ymm0\nvrsqrtps ymm1, ymm1\nvrsqrtps xmm2, xmm2\nvrsqrtps xmm3, xmm3\n\n; Memory operand\nvrsqrtps ymm4, [rel arg1]\nvrsqrtps ymm5, [rel arg2]\nvrsqrtps xmm6, [rel arg3]\nvrsqrtps xmm7, [rel arg4]\n\n; Check that each register is properly filled\nsame_pdwords ymm0\nmov r8, rax\n\nsame_pdwords ymm1\nand r8, rax\n\nsame_pdwords_x xmm2\nand r8, rax\n\nsame_pdwords_x xmm3\nand r8, rax\n\n; Result checks\nvpextrd [rel result1], xmm0, 0\ncheck_relerr rel eresult1, rel result1, rel tolerance\nmov r9, rax\n\nvpextrd [rel result2], xmm1, 0\ncheck_relerr rel eresult2, rel result2, rel tolerance\nand r9, rax\n\nvpextrd [rel result3], xmm2, 0\ncheck_relerr rel eresult3, rel result3, rel tolerance\nand r9, rax\n\nvpextrd [rel result4], xmm3, 0\ncheck_relerr rel eresult4, rel result4, rel tolerance\nand r9, rax\nhlt\n\nalign 4096\nresult1: times 4 dq 0\nresult2: times 4 dq 0\nresult3: times 4 dq 0\nresult4: times 4 dq 0\n\nalign 32\narg1:\ndq 0x3F8000003F800000 ; 1.0\ndq 0x3F8000003F800000\ndq 0x3F8000003F800000\ndq 0x3F8000003F800000\n\narg2:\ndq 0x4080000040800000 ; 4.0\ndq 0x4080000040800000\ndq 0x4080000040800000\ndq 0x4080000040800000\n\narg3:\ndq 0x4110000041100000 ; 9.0\ndq 0x4110000041100000\ndq 0x4110000041100000\ndq 0x4110000041100000\n\narg4:\ndq 0x4180000041800000 ; 16.0\ndq 0x4180000041800000\ndq 0x4180000041800000\ndq 0x4180000041800000\n\narg5:\ndq 0x41C8000041C80000 ; 25.0\ndq 0x41C8000041C80000\ndq 0x41C8000041C80000\ndq 0x41C8000041C80000\n\neresult1:\ndd 0x3F800000 ; 1.0\n\neresult2:\ndd 0x3f000000 ; 0.5\n\neresult3:\ndd 0x3eaaaaab ; 1/3 = 0.(3)\n\neresult4:\ndd 0x3e800000 ; 0.25\n\ntolerance:\ndd 0x39c00000\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/VEX/vrsqrtss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"R9\": \"1\",\n    \"XMM0\":  [\"0x4142434400000000\", \"0xEEEEEEEEEEEEEEEE\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x4142434400000000\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x4142434400000000\", \"0xCCCCCCCCCCCCCCCC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x4142434400000000\", \"0xBBBBBBBBBBBBBBBB\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x4142434400000000\", \"0xAAAAAAAAAAAAAAAA\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x4142434400000000\", \"0xAAAAAAAAAAAAAAAA\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x4142434400000000\", \"0xAAAAAAAAAAAAAAAA\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x4142434400000000\", \"0xAAAAAAAAAAAAAAAA\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x4142434400000000\", \"0xDDDDDDDDDDDDDDDD\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x4142434400000000\", \"0xCCCCCCCCCCCCCCCC\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x4142434400000000\", \"0xBBBBBBBBBBBBBBBB\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x4142434400000000\", \"0xAAAAAAAAAAAAAAAA\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nsection .text\nglobal _start\n\n%include \"checkprecision.mac\"\n\n; This test checks that:\n; - the results of the reciprocal sqrt is within 1.5*2^-12 error margin.\n; - the top 128 bits of ymms registers are zero.\n; - bits [127:32] are correctly copied from the first argument to vrsqrtss.\n\n_start:\nvmovapd ymm0, [rel arg1]\nvmovapd ymm1, [rel arg2]\nvmovapd ymm2, [rel arg3]\nvmovapd ymm3, [rel arg4]\nvmovapd ymm4, [rel arg5]\nvmovapd ymm5, [rel arg5]\nvmovapd ymm6, [rel arg5]\nvmovapd ymm7, [rel arg5]\n\n; Same register\nvrsqrtss xmm0, xmm0, xmm0\nvrsqrtss xmm1, xmm1, xmm1\nvrsqrtss xmm2, xmm2, xmm2\nvrsqrtss xmm3, xmm3, xmm3\n\n; Memory operand\nvrsqrtss xmm4, xmm4, [rel arg1]\nvrsqrtss xmm5, xmm5, [rel arg2]\nvrsqrtss xmm6, xmm6, [rel arg3]\nvrsqrtss xmm7, xmm7, [rel arg4]\n\n; Memory operand different source register\nvrsqrtss xmm8, xmm1, [rel arg1]\nvrsqrtss xmm9, xmm2, [rel arg2]\nvrsqrtss xmm10, xmm3, [rel arg3]\nvrsqrtss xmm11, xmm4, [rel arg4]\n\n; Check precision\nvpextrd [rel result1], xmm0, 0\ncheck_relerr rel eresult1, rel result1, rel tolerance\nmov r9, rax\n\nvpextrd [rel result2], xmm1, 0\ncheck_relerr rel eresult2, rel result2, rel tolerance\nand r9, rax\n\nvpextrd [rel result3], xmm2, 0\ncheck_relerr rel eresult3, rel result3, rel tolerance\nand r9, rax\n\nvpextrd [rel result4], xmm3, 0\ncheck_relerr rel eresult4, rel result4, rel tolerance\nand r9, rax\n\nvpextrd [rel result1], xmm8, 0\ncheck_relerr rel eresult1, rel result1, rel tolerance\nand r9, rax\n\nvpextrd [rel result2], xmm9, 0\ncheck_relerr rel eresult2, rel result2, rel tolerance\nand r9, rax\n\nvpextrd [rel result3], xmm10, 0\ncheck_relerr rel eresult3, rel result3, rel tolerance\nand r9, rax\n\nvpextrd [rel result4], xmm11, 0\ncheck_relerr rel eresult4, rel result4, rel tolerance\nand r9, rax\n\n; Insert 0s in the bottom 32bits.\nxor rax, rax\nvpinsrd xmm0, xmm0, eax, 0\nvpinsrd xmm1, xmm1, eax, 0\nvpinsrd xmm2, xmm2, eax, 0\nvpinsrd xmm3, xmm3, eax, 0\nvpinsrd xmm4, xmm4, eax, 0\nvpinsrd xmm5, xmm5, eax, 0\nvpinsrd xmm6, xmm6, eax, 0\nvpinsrd xmm7, xmm7, eax, 0\nvpinsrd xmm8, xmm8, eax, 0\nvpinsrd xmm9, xmm9, eax, 0\nvpinsrd xmm10, xmm10, eax, 0\nvpinsrd xmm11, xmm11, eax, 0\n\nhlt\n\nalign 4096\nresult1: times 2 dq 0\nresult2: times 2 dq 0\nresult3: times 2 dq 0\nresult4: times 2 dq 0\n\nalign 32\narg1:\ndq 0x414243443F800000 ; 1.0\ndq 0xEEEEEEEEEEEEEEEE\ndq 0x5152535455565758\ndq 0x5152535455565758\n\narg2:\ndq 0x4142434440800000 ; 4.0\ndq 0xDDDDDDDDDDDDDDDD\ndq 0x5152535455565758\ndq 0x5152535455565758\n\narg3:\ndq 0x4142434441100000 ; 9.0\ndq 0xCCCCCCCCCCCCCCCC\ndq 0x5152535455565758\ndq 0x5152535455565758\n\narg4:\ndq 0x4142434441800000 ; 16.0\ndq 0xBBBBBBBBBBBBBBBB\ndq 0x5152535455565758\ndq 0x5152535455565758\n\narg5:\ndq 0x4142434441C80000 ; 25.0\ndq 0xAAAAAAAAAAAAAAAA\ndq 0x5152535455565758\ndq 0x5152535455565758\n\neresult1:\ndd 0x3F800000 ; 1.0\n\neresult2:\ndd 0x3f000000 ; 0.5\n\neresult3:\ndd 0x3eaaaaab ; 1/3 = 0.(3)\n\neresult4:\ndd 0x3e800000 ; 0.25\n\ntolerance:\ndd 0x39c00000\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/VEX/vshufpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0x4142434445464748\", \"0x6162636465666768\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x5152535455565758\", \"0x6162636465666768\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x4142434445464748\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x5152535455565758\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x4142434445464748\", \"0x6162636465666768\", \"0x3132333435363738\", \"0x8182838485868788\"],\n    \"XMM7\":  [\"0x4142434445464748\", \"0x6162636465666768\", \"0x3132333435363738\", \"0x9192939495969798\"],\n    \"XMM8\":  [\"0x5152535455565758\", \"0x6162636465666768\", \"0x2122232425262728\", \"0x8182838485868788\"],\n    \"XMM9\":  [\"0x4142434445464748\", \"0x7172737475767778\", \"0x3132333435363738\", \"0x9192939495969798\"],\n    \"XMM10\": [\"0x4142434445464748\", \"0x6162636465666768\", \"0x2122232425262728\", \"0x9192939495969798\"],\n    \"XMM11\": [\"0x5152535455565758\", \"0x7172737475767778\", \"0x2122232425262728\", \"0x9192939495969798\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvshufpd xmm2, xmm0, xmm1, 0b00\nvshufpd xmm3, xmm0, xmm1, 0b01\nvshufpd xmm4, xmm0, xmm1, 0b10\nvshufpd xmm5, xmm0, xmm1, 0b11\n\nvshufpd ymm6,  ymm0, ymm1, 0b0000\nvshufpd ymm7,  ymm0, ymm1, 0b1000\nvshufpd ymm8,  ymm0, ymm1, 0b0101\nvshufpd ymm9,  ymm0, ymm1, 0b1010\nvshufpd ymm10, ymm0, ymm1, 0b1100\nvshufpd ymm11, ymm0, ymm1, 0b1111\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x3132333435363738\ndq 0x2122232425262728\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x8182838485868788\ndq 0x9192939495969798\n"
  },
  {
    "path": "unittests/ASM/VEX/vshufps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\":  [\"0x4546474845464748\", \"0x6566676865666768\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x5152535451525354\", \"0x7172737471727374\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x4546474851525354\", \"0x7576777871727374\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x4546474845464748\", \"0x6566676865666768\", \"0x3536373835363738\", \"0x8586878885868788\"],\n    \"XMM6\":  [\"0x5152535451525354\", \"0x7172737471727374\", \"0x2122232421222324\", \"0x9192939491929394\"],\n    \"XMM7\":  [\"0x4546474851525354\", \"0x7576777871727374\", \"0x3536373821222324\", \"0x9596979891929394\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvshufps xmm2, xmm0, xmm1, 0b00000000\nvshufps xmm3, xmm0, xmm1, 0b11111111\nvshufps xmm4, xmm0, xmm1, 0b10110011\n\nvshufps ymm5, ymm0, ymm1, 0b00000000\nvshufps ymm6, ymm0, ymm1, 0b11111111\nvshufps ymm7, ymm0, ymm1, 0b10110011\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x3132333435363738\ndq 0x2122232425262728\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0x8182838485868788\ndq 0x9192939495969798\n"
  },
  {
    "path": "unittests/ASM/VEX/vsqrtpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x4000000000000000\", \"0x4000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x4008000000000000\", \"0x4008000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x4010000000000000\", \"0x4010000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x4000000000000000\", \"0x4000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x4008000000000000\", \"0x4008000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x4010000000000000\", \"0x4010000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\"],\n    \"XMM9\":  [\"0x4000000000000000\", \"0x4000000000000000\", \"0x4000000000000000\", \"0x4000000000000000\"],\n    \"XMM10\": [\"0x4008000000000000\", \"0x4008000000000000\", \"0x4008000000000000\", \"0x4008000000000000\"],\n    \"XMM11\": [\"0x4010000000000000\", \"0x4010000000000000\", \"0x4010000000000000\", \"0x4010000000000000\"],\n    \"XMM12\": [\"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\"],\n    \"XMM13\": [\"0x4000000000000000\", \"0x4000000000000000\", \"0x4000000000000000\", \"0x4000000000000000\"],\n    \"XMM14\": [\"0x4008000000000000\", \"0x4008000000000000\", \"0x4008000000000000\", \"0x4008000000000000\"],\n    \"XMM15\": [\"0x4010000000000000\", \"0x4010000000000000\", \"0x4010000000000000\", \"0x4010000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\nvmovapd ymm5, [rdx + 32 * 4]\nvmovapd ymm6, [rdx + 32 * 4]\nvmovapd ymm7, [rdx + 32 * 4]\nvmovapd ymm8, [rdx + 32 * 0]\nvmovapd ymm9, [rdx + 32 * 1]\nvmovapd ymm10, [rdx + 32 * 2]\nvmovapd ymm11, [rdx + 32 * 3]\n\n; 128-bit registers\nvsqrtpd xmm0, xmm0\nvsqrtpd xmm1, xmm1\nvsqrtpd xmm2, xmm2\nvsqrtpd xmm3, xmm3\n\n; 256-bit registers\nvsqrtpd ymm8, ymm8\nvsqrtpd ymm9, ymm9\nvsqrtpd ymm10, ymm10\nvsqrtpd ymm11, ymm11\n\n; 128-bit memory operand\nvsqrtpd xmm4, [rdx + 32 * 0]\nvsqrtpd xmm5, [rdx + 32 * 1]\nvsqrtpd xmm6, [rdx + 32 * 2]\nvsqrtpd xmm7, [rdx + 32 * 3]\n\n; 256-bit memory operand\nvsqrtpd ymm12, [rdx + 32 * 0]\nvsqrtpd ymm13, [rdx + 32 * 1]\nvsqrtpd ymm14, [rdx + 32 * 2]\nvsqrtpd ymm15, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000 ; 1.0\ndq 0x3FF0000000000000\ndq 0x3FF0000000000000\ndq 0x3FF0000000000000\n\ndq 0x4010000000000000 ; 4.0\ndq 0x4010000000000000\ndq 0x4010000000000000\ndq 0x4010000000000000\n\ndq 0x4022000000000000 ; 9.0\ndq 0x4022000000000000\ndq 0x4022000000000000\ndq 0x4022000000000000\n\ndq 0x4030000000000000 ; 16.0\ndq 0x4030000000000000\ndq 0x4030000000000000\ndq 0x4030000000000000\n\ndq 0x4039000000000000 ; 25.0\ndq 0x4039000000000000\ndq 0x4039000000000000\ndq 0x4039000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vsqrtps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x3F8000003F800000\", \"0x3F8000003F800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x4000000040000000\", \"0x4000000040000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x4040000040400000\", \"0x4040000040400000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x4080000040800000\", \"0x4080000040800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x3F8000003F800000\", \"0x3F8000003F800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x4000000040000000\", \"0x4000000040000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x4040000040400000\", \"0x4040000040400000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x4080000040800000\", \"0x4080000040800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x3F8000003F800000\", \"0x3F8000003F800000\", \"0x3F8000003F800000\", \"0x3F8000003F800000\"],\n    \"XMM9\":  [\"0x4000000040000000\", \"0x4000000040000000\", \"0x4000000040000000\", \"0x4000000040000000\"],\n    \"XMM10\": [\"0x4040000040400000\", \"0x4040000040400000\", \"0x4040000040400000\", \"0x4040000040400000\"],\n    \"XMM11\": [\"0x4080000040800000\", \"0x4080000040800000\", \"0x4080000040800000\", \"0x4080000040800000\"],\n    \"XMM12\": [\"0x3F8000003F800000\", \"0x3F8000003F800000\", \"0x3F8000003F800000\", \"0x3F8000003F800000\"],\n    \"XMM13\": [\"0x4000000040000000\", \"0x4000000040000000\", \"0x4000000040000000\", \"0x4000000040000000\"],\n    \"XMM14\": [\"0x4040000040400000\", \"0x4040000040400000\", \"0x4040000040400000\", \"0x4040000040400000\"],\n    \"XMM15\": [\"0x4080000040800000\", \"0x4080000040800000\", \"0x4080000040800000\", \"0x4080000040800000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\nvmovapd ymm5, [rdx + 32 * 4]\nvmovapd ymm6, [rdx + 32 * 4]\nvmovapd ymm7, [rdx + 32 * 4]\nvmovapd ymm8, [rdx + 32 * 0]\nvmovapd ymm9, [rdx + 32 * 1]\nvmovapd ymm10, [rdx + 32 * 2]\nvmovapd ymm11, [rdx + 32 * 3]\n\n; 128-bit registers\nvsqrtps xmm0, xmm0\nvsqrtps xmm1, xmm1\nvsqrtps xmm2, xmm2\nvsqrtps xmm3, xmm3\n\n; 256-bit registers\nvsqrtps ymm8, ymm8\nvsqrtps ymm9, ymm9\nvsqrtps ymm10, ymm10\nvsqrtps ymm11, ymm11\n\n; 128-bit memory operand\nvsqrtps xmm4, [rdx + 32 * 0]\nvsqrtps xmm5, [rdx + 32 * 1]\nvsqrtps xmm6, [rdx + 32 * 2]\nvsqrtps xmm7, [rdx + 32 * 3]\n\n; 256-bit memory operand\nvsqrtps ymm12, [rdx + 32 * 0]\nvsqrtps ymm13, [rdx + 32 * 1]\nvsqrtps ymm14, [rdx + 32 * 2]\nvsqrtps ymm15, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x3F8000003F800000 ; 1.0\ndq 0x3F8000003F800000\ndq 0x3F8000003F800000\ndq 0x3F8000003F800000\n\ndq 0x4080000040800000 ; 4.0\ndq 0x4080000040800000\ndq 0x4080000040800000\ndq 0x4080000040800000\n\ndq 0x4110000041100000 ; 9.0\ndq 0x4110000041100000\ndq 0x4110000041100000\ndq 0x4110000041100000\n\ndq 0x4180000041800000 ; 16.0\ndq 0x4180000041800000\ndq 0x4180000041800000\ndq 0x4180000041800000\n\ndq 0x41C8000041C80000 ; 25.0\ndq 0x41C8000041C80000\ndq 0x41C8000041C80000\ndq 0x41C8000041C80000\n"
  },
  {
    "path": "unittests/ASM/VEX/vsqrtsd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x4000000000000000\", \"0x4010000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x4008000000000000\", \"0x4022000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x4010000000000000\", \"0x4030000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x3FF0000000000000\", \"0x4039000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x4000000000000000\", \"0x4010000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x4008000000000000\", \"0x4022000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x4010000000000000\", \"0x4030000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x3FF0000000000000\", \"0x4030000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x4000000000000000\", \"0x4039000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x4008000000000000\", \"0x4010000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x4010000000000000\", \"0x4022000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\nvmovapd ymm5, [rdx + 32 * 1]\nvmovapd ymm6, [rdx + 32 * 2]\nvmovapd ymm7, [rdx + 32 * 3]\n\n; Register only\nvsqrtsd xmm0, xmm0, xmm0\nvsqrtsd xmm1, xmm1, xmm1\nvsqrtsd xmm2, xmm2, xmm2\nvsqrtsd xmm3, xmm3, xmm3\n\n; Memory operand\nvsqrtsd xmm4, xmm4, [rdx + 32 * 0]\nvsqrtsd xmm5, xmm5, [rdx + 32 * 1]\nvsqrtsd xmm6, xmm6, [rdx + 32 * 2]\nvsqrtsd xmm7, xmm7, [rdx + 32 * 3]\n\n; Merge different source register\nvsqrtsd xmm8, xmm3, [rdx + 32 * 0]\nvsqrtsd xmm9, xmm4, [rdx + 32 * 1]\nvsqrtsd xmm10, xmm5, [rdx + 32 * 2]\nvsqrtsd xmm11, xmm6, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000 ; 1.0\ndq 0x3FF0000000000000\ndq 0x3FF0000000000000\ndq 0x3FF0000000000000\n\ndq 0x4010000000000000 ; 4.0\ndq 0x4010000000000000\ndq 0x4010000000000000\ndq 0x4010000000000000\n\ndq 0x4022000000000000 ; 9.0\ndq 0x4022000000000000\ndq 0x4022000000000000\ndq 0x4022000000000000\n\ndq 0x4030000000000000 ; 16.0\ndq 0x4030000000000000\ndq 0x4030000000000000\ndq 0x4030000000000000\n\ndq 0x4039000000000000 ; 25.0\ndq 0x4039000000000000\ndq 0x4039000000000000\ndq 0x4039000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vsqrtss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\":  [\"0x3F8000003F800000\", \"0x3F8000003F800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\":  [\"0x4080000040000000\", \"0x4080000040800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0x4110000040400000\", \"0x4110000041100000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\":  [\"0x4180000040800000\", \"0x4180000041800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\":  [\"0x41C800003F800000\", \"0x41C8000041C80000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\":  [\"0x4080000040000000\", \"0x4080000040800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x4110000040400000\", \"0x4110000041100000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\":  [\"0x4180000040800000\", \"0x4180000041800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\":  [\"0x418000003F800000\", \"0x4180000041800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM9\":  [\"0x41C8000040000000\", \"0x41C8000041C80000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\": [\"0x4080000040400000\", \"0x4080000040800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM11\": [\"0x4110000040800000\", \"0x4110000041100000\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\nvmovapd ymm5, [rdx + 32 * 1]\nvmovapd ymm6, [rdx + 32 * 2]\nvmovapd ymm7, [rdx + 32 * 3]\n\n; Register only\nvsqrtss xmm0, xmm0, xmm0\nvsqrtss xmm1, xmm1, xmm1\nvsqrtss xmm2, xmm2, xmm2\nvsqrtss xmm3, xmm3, xmm3\n\n; Memory operand\nvsqrtss xmm4, xmm4, [rdx + 32 * 0]\nvsqrtss xmm5, xmm5, [rdx + 32 * 1]\nvsqrtss xmm6, xmm6, [rdx + 32 * 2]\nvsqrtss xmm7, xmm7, [rdx + 32 * 3]\n\n; Merge different source register\nvsqrtss xmm8, xmm3, [rdx + 32 * 0]\nvsqrtss xmm9, xmm4, [rdx + 32 * 1]\nvsqrtss xmm10, xmm5, [rdx + 32 * 2]\nvsqrtss xmm11, xmm6, [rdx + 32 * 3]\n\nhlt\n\nalign 32\n.data:\ndq 0x3F8000003F800000 ; 1.0\ndq 0x3F8000003F800000\ndq 0x3F8000003F800000\ndq 0x3F8000003F800000\n\ndq 0x4080000040800000 ; 4.0\ndq 0x4080000040800000\ndq 0x4080000040800000\ndq 0x4080000040800000\n\ndq 0x4110000041100000 ; 9.0\ndq 0x4110000041100000\ndq 0x4110000041100000\ndq 0x4110000041100000\n\ndq 0x4180000041800000 ; 16.0\ndq 0x4180000041800000\ndq 0x4180000041800000\ndq 0x4180000041800000\n\ndq 0x41C8000041C80000 ; 25.0\ndq 0x41C8000041C80000\ndq 0x41C8000041C80000\ndq 0x41C8000041C80000\n"
  },
  {
    "path": "unittests/ASM/VEX/vsubpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4008000000000000\", \"0x4008000000000000\", \"0x4008000000000000\", \"0x4008000000000000\"],\n    \"XMM1\": [\"0x4000000000000000\", \"0x4000000000000000\", \"0x4000000000000000\", \"0x4000000000000000\"],\n    \"XMM3\": [\"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\"],\n    \"XMM5\": [\"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\", \"0x3FF0000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 0]\nvmovapd ymm1, [rdx + 32]\n\n; Register only\nvsubpd xmm3, xmm0, xmm1\nvsubpd ymm4, ymm0, ymm1\n\n; Memory operand\nvsubpd xmm5, xmm0, [rdx + 32]\nvsubpd ymm6, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4008000000000000\ndq 0x4008000000000000\ndq 0x4008000000000000\ndq 0x4008000000000000\n\ndq 0x4000000000000000\ndq 0x4000000000000000\ndq 0x4000000000000000\ndq 0x4000000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vsubps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x400000003F800000\", \"0x4080000040400000\", \"0x400000003F800000\", \"0x4080000040400000\"],\n    \"XMM1\": [\"0x40C0000040A00000\", \"0x4100000040E00000\", \"0x40C0000040A00000\", \"0x4100000040E00000\"],\n    \"XMM3\": [\"0xC0800000C0800000\", \"0xC0800000C0800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0xC0800000C0800000\", \"0xC0800000C0800000\", \"0xC0800000C0800000\", \"0xC0800000C0800000\"],\n    \"XMM5\": [\"0xC0800000C0800000\", \"0xC0800000C0800000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM6\": [\"0xC0800000C0800000\", \"0xC0800000C0800000\", \"0xC0800000C0800000\", \"0xC0800000C0800000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 0]\nvmovapd ymm1, [rdx + 32]\n\n; Register only\nvsubps xmm3, xmm0, xmm1\nvsubps ymm4, ymm0, ymm1\n\n; Memory operand\nvsubps xmm5, xmm0, [rdx + 32]\nvsubps ymm6, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x400000003F800000 ; 2, 1\ndq 0x4080000040400000 ; 4, 3\ndq 0x400000003F800000 ; 2, 1\ndq 0x4080000040400000 ; 4, 3\n\ndq 0x40C0000040A00000 ; 6, 5\ndq 0x4100000040E00000 ; 8, 7\ndq 0x40C0000040A00000 ; 6, 5\ndq 0x4100000040E00000 ; 8, 7\n"
  },
  {
    "path": "unittests/ASM/VEX/vsubsd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0xC008000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x4010000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0xC01C000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4030000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x4038000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4035000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0xC022000000000000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x4030000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM9\": [\"0x4039000000000000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\n\n; Register only\nvsubsd xmm0, xmm0, xmm1\nvsubsd xmm2, xmm2, xmm3\n\n; Memory operand\nvsubsd xmm5, xmm4, [rdx + 32 * 1]\nvsubsd xmm4, xmm4, [rdx + 32 * 0]\n\n; Merging different src into destination\nvpxor xmm7, xmm7, xmm7\nvmovapd ymm8, [rdx + 32 * 3]\nvmovapd ymm9, [rdx + 32 * 4]\nvsubsd xmm7, xmm8, xmm9\n\nhlt\n\nalign 32\n.data:\ndq 0x3FF0000000000000 ; 1.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4010000000000000 ; 4.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4022000000000000 ; 9.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4030000000000000 ; 16.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4039000000000000 ; 25.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vsubss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x41424344C0400000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0x4142434440800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM2\": [\"0x41424344C0e00000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434441800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM4\": [\"0x4142434441C00000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM5\": [\"0x4142434441A80000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM7\": [\"0x41424344C1100000\", \"0x5152535455565758\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM8\": [\"0x4142434441800000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"],\n    \"XMM9\": [\"0x4142434441C80000\", \"0x5152535455565758\", \"0x5152535455565758\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx + 32 * 0]\nvmovapd ymm1, [rdx + 32 * 1]\nvmovapd ymm2, [rdx + 32 * 2]\nvmovapd ymm3, [rdx + 32 * 3]\nvmovapd ymm4, [rdx + 32 * 4]\n\n; Register only\nvsubss xmm0, xmm0, xmm1\nvsubss xmm2, xmm2, xmm3\n\n; Memory operand\nvsubss xmm5, xmm4, [rdx + 32 * 1]\nvsubss xmm4, xmm4, [rdx + 32 * 0]\n\n; Merging different src into destination\nvpxor xmm7, xmm7, xmm7\nvmovapd ymm8, [rdx + 32 * 3]\nvmovapd ymm9, [rdx + 32 * 4]\nvsubss xmm7, xmm8, xmm9\n\nhlt\n\nalign 32\n.data:\ndq 0x414243443F800000 ; 1.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434440800000 ; 4.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441100000 ; 9.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441800000 ; 16.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n\ndq 0x4142434441C80000 ; 25.0\ndq 0x5152535455565758\ndq 0x5152535455565758\ndq 0x5152535455565758\n"
  },
  {
    "path": "unittests/ASM/VEX/vtestpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"R15\":  \"0x0000000EDDFFB77F\",\n    \"XMM0\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM2\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\n; Uses AX and BX and stores result in r15\n; CF:ZF\n%macro zfcfmerge 0\n  lahf\n\n  ; Shift CF to zero\n  shr ax, 8\n\n  ; Move to a temp\n  mov bx, ax\n  and rbx, 1\n\n  shl r15, 1\n  or r15, rbx\n\n  shl r15, 1\n\n  ; Move to a temp\n  mov bx, ax\n\n  ; Extract ZF\n  shr bx, 6\n  and rbx, 1\n\n  ; Insert ZF\n  or r15, rbx\n%endmacro\n\n%macro tests 1\n  vtestpd %{1}0, [rdx + 32 * 3]\n  zfcfmerge\n  vtestpd %{1}1, [rdx + 32 * 4]\n  zfcfmerge\n  vtestpd %{1}2, [rdx + 32 * 5]\n  zfcfmerge\n  vtestpd %{1}0, [rdx + 32 * 6]\n  zfcfmerge\n  vtestpd %{1}1, [rdx + 32 * 7]\n  zfcfmerge\n  vtestpd %{1}2, [rdx + 32 * 8]\n  zfcfmerge\n  vtestpd %{1}0, [rdx + 32 * 9]\n  zfcfmerge\n  vtestpd %{1}1, [rdx + 32 * 10]\n  zfcfmerge\n  vtestpd %{1}2, [rdx + 32 * 11]\n  zfcfmerge\n%endmacro\n\nlea rdx, [rel .data]\n\nmov rax, 0\nmov rbx, 0\nmov r15, 0\n\nvmovaps ymm0, [rdx + 32 * 0]\nvmovaps ymm1, [rdx + 32 * 1]\nvmovaps ymm2, [rdx + 32 * 2]\n\ntests xmm\ntests ymm\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000\ndq 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF\ndq 0x4142434445464748, 0x5152535455565758, 0x4142434445464748, 0x5152535455565758\n\n; Match\ndq 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000\ndq 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF\ndq 0x4142434445464748, 0x5152535455565758, 0x4142434445464748, 0x5152535455565758\n\n; Match on not\ndq 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF\ndq 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000\ndq 0xBEBDBCBBBAB9B8B7, 0xAEADACABAAA9A8A7, 0xBEBDBCBBBAB9B8B7, 0xAEADACABAAA9A8A7\n\n; No match on either case\ndq 1, 1, 1, 1\ndq 2, 2, 2, 2\ndq 3, 3, 3, 3\n"
  },
  {
    "path": "unittests/ASM/VEX/vtestps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"R15\":  \"0x000000000003B77F\",\n    \"R14\":  \"0x000000000003B77F\",\n    \"XMM0\": [\"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM1\": [\"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\", \"0xFFFFFFFFFFFFFFFF\"],\n    \"XMM2\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x4142434445464748\", \"0x5152535455565758\"]\n  }\n}\n%endif\n\n; Uses AX and BX and stores result in the passed in register\n; CF:ZF\n%macro zfcfmerge 1\n  lahf\n\n  ; Shift CF to zero\n  shr ax, 8\n\n  ; Move to a temp\n  mov bx, ax\n  and rbx, 1\n\n  shl %{1}, 1\n  or %{1}, rbx\n\n  shl %{1}, 1\n\n  ; Move to a temp\n  mov bx, ax\n\n  ; Extract ZF\n  shr bx, 6\n  and rbx, 1\n\n  ; Insert ZF\n  or %{1}, rbx\n%endmacro\n\n%macro tests 2\n  vtestps %{1}0, [rdx + 32 * 3]\n  zfcfmerge %{2}\n  vtestps %{1}1, [rdx + 32 * 4]\n  zfcfmerge %{2}\n  vtestps %{1}2, [rdx + 32 * 5]\n  zfcfmerge %{2}\n  vtestps %{1}0, [rdx + 32 * 6]\n  zfcfmerge %{2}\n  vtestps %{1}1, [rdx + 32 * 7]\n  zfcfmerge %{2}\n  vtestps %{1}2, [rdx + 32 * 8]\n  zfcfmerge %{2}\n  vtestps %{1}0, [rdx + 32 * 9]\n  zfcfmerge %{2}\n  vtestps %{1}1, [rdx + 32 * 10]\n  zfcfmerge %{2}\n  vtestps %{1}2, [rdx + 32 * 11]\n  zfcfmerge %{2}\n%endmacro\n\nlea rdx, [rel .data]\n\nmov rax, 0\nmov rbx, 0\nmov r15, 0\nmov r14, 0\n\nvmovaps ymm0, [rdx + 32 * 0]\nvmovaps ymm1, [rdx + 32 * 1]\nvmovaps ymm2, [rdx + 32 * 2]\n\n; Accumulate xmm results in r15\ntests xmm, r15\n; Accumulate ymm results in r14\ntests ymm, r14\n\nhlt\n\nalign 32\n.data:\ndq 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000\ndq 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF\ndq 0x4142434445464748, 0x5152535455565758, 0x4142434445464748, 0x5152535455565758\n\n; Match\ndq 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000\ndq 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF\ndq 0x4142434445464748, 0x5152535455565758, 0x4142434445464748, 0x5152535455565758\n\n; Match on not\ndq 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF\ndq 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000\ndq 0xBEBDBCBBBAB9B8B7, 0xAEADACABAAA9A8A7, 0xBEBDBCBBBAB9B8B7, 0xAEADACABAAA9A8A7\n\n; No match on either case\ndq 1, 1, 1, 1\ndq 2, 2, 2, 2\ndq 3, 3, 3, 3\n"
  },
  {
    "path": "unittests/ASM/VEX/vucomisd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x4700\",\n    \"RBX\": \"0x0300\"\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps xmm0, [rdx + 16 * 0]\nvucomisd xmm0, [rdx + 16 * 1] ; 1.0 <comp> 4.0\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000 <- 0\n; ================\n;         00000011\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nmov rbx, rax\n\nvucomisd xmm0, [rdx + 16 * 2] ; 1.0 <comp> NaN\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 01000000\n; 7: SF - 00000000 <- 0\n; ================\n;         01000111\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n\nalign 16\n.data:\ndq 0x3FF0000000000000\ndq 0x4000000000000000\n\ndq 0x4010000000000000\ndq 0x4010000000000000\n\ndq 0x7FF8000000000000\ndq 0x4010000000000000\n"
  },
  {
    "path": "unittests/ASM/VEX/vucomiss.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x4700\",\n    \"RBX\": \"0x0300\"\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps xmm0, [rdx + 16 * 0]\nvucomiss xmm0, [rdx + 16 * 1]\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000000\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 00000000\n; 7: SF - 00000000 <- 0\n; ================\n;         00000011\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\nmov rbx, rax\n\nvucomiss xmm0, [rdx + 16 * 2]\n; 0: CF - 00000001\n; 1:    - 00000010\n; 2: PF - 00000100\n; 3:  0 - 00000000\n; 4: AF - 00000000 <- 0\n; 5:  0 - 00000000\n; 6: ZF - 01000000\n; 7: SF - 00000000 <- 0\n; ================\n;         01000111\n; OF: LAHF doesn't load - 0\n\nmov rax, 0\nlahf\n\nhlt\n\nalign 16\n.data:\ndq 0x515253543F800000\ndq 0x5152535440000000\n\ndq 0x5152535440800000\ndq 0x5152535440800000\n\ndq 0x515253547FC00000\ndq 0x5152535440800000\n"
  },
  {
    "path": "unittests/ASM/VEX/vunpckhpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x5152535455565758\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x5152535455565758\", \"0x7172737475767778\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x5152535455565758\", \"0x7172737475767778\", \"0xEEEEEEEEEEEEEEEE\", \"0xCCCCCCCCCCCCCCCC\"],\n    \"XMM5\": [\"0x5152535455565758\", \"0x7172737475767778\", \"0xEEEEEEEEEEEEEEEE\", \"0xCCCCCCCCCCCCCCCC\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvunpckhpd xmm2, xmm0, xmm1\nvunpckhpd xmm3, xmm0, [rdx + 32]\n\nvunpckhpd ymm4, ymm0, ymm1\nvunpckhpd ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0xBBBBBBBBBBBBBBBB\ndq 0xCCCCCCCCCCCCCCCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vunpckhps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x7576777855565758\", \"0x7172737451525354\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x7576777855565758\", \"0x7172737451525354\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x7576777855565758\", \"0x7172737451525354\", \"0x88888888CCCCCCCC\", \"0x99999999DDDDDDDD\"],\n    \"XMM5\": [\"0x7576777855565758\", \"0x7172737451525354\", \"0x88888888CCCCCCCC\", \"0x99999999DDDDDDDD\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvunpckhps xmm2, xmm0, xmm1\nvunpckhps xmm3, xmm0, [rdx + 32]\n\nvunpckhps ymm4, ymm0, ymm1\nvunpckhps ymm5, ymm0, [rdx + 32]\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xFFFFFFFFEEEEEEEE\ndq 0xDDDDDDDDCCCCCCCC\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0xBBBBBBBBAAAAAAAA\ndq 0x9999999988888888\n"
  },
  {
    "path": "unittests/ASM/VEX/vunpcklpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x4142434445464748\", \"0x6162636465666768\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x4142434445464748\", \"0x6162636465666768\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x4142434445464748\", \"0x6162636465666768\", \"0xFFFFFFFFFFFFFFFF\", \"0xBBBBBBBBBBBBBBBB\"],\n    \"XMM5\": [\"0x4142434445464748\", \"0x6162636465666768\", \"0xFFFFFFFFFFFFFFFF\", \"0xBBBBBBBBBBBBBBBB\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx + 32]\n\nvunpcklpd xmm2, xmm0, [rdx + 32]\nvunpcklpd xmm3, xmm0, xmm1\n\nvunpcklpd ymm4, ymm0, [rdx + 32]\nvunpcklpd ymm5, ymm0, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xFFFFFFFFFFFFFFFF\ndq 0xEEEEEEEEEEEEEEEE\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0xBBBBBBBBBBBBBBBB\ndq 0xCCCCCCCCCCCCCCCC\n"
  },
  {
    "path": "unittests/ASM/VEX/vunpcklps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM2\": [\"0x6566676845464748\", \"0x6162636441424344\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM3\": [\"0x6566676845464748\", \"0x6162636441424344\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x6566676845464748\", \"0x6162636441424344\", \"0xAAAAAAAAEEEEEEEE\", \"0xBBBBBBBBFFFFFFFF\"],\n    \"XMM5\": [\"0x6566676845464748\", \"0x6162636441424344\", \"0xAAAAAAAAEEEEEEEE\", \"0xBBBBBBBBFFFFFFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovaps ymm0, [rdx]\nvmovaps ymm1, [rdx + 32]\n\nvunpcklps xmm2, xmm0, [rdx + 32]\nvunpcklps xmm3, xmm0, xmm1\n\nvunpcklps ymm4, ymm0, [rdx + 32]\nvunpcklps ymm5, ymm0, ymm1\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0xFFFFFFFFEEEEEEEE\ndq 0xDDDDDDDDCCCCCCCC\n\ndq 0x6162636465666768\ndq 0x7172737475767778\ndq 0xBBBBBBBBAAAAAAAA\ndq 0x9999999988888888\n"
  },
  {
    "path": "unittests/ASM/VEX/vxorpd.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0xCCCCCCCC75767778\", \"0x61626364DDDDDDDD\", \"0xEEEEEEEE55565758\", \"0x41424344FFFFFFFF\"],\n    \"XMM2\": [\"0x8D8E8F8830303030\", \"0x30303030888B8A85\", \"0x8F8C8D8A30303030\", \"0x303030308A898887\"],\n    \"XMM3\": [\"0x8D8E8F8830303030\", \"0x30303030888B8A85\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x8D8E8F8830303030\", \"0x30303030888B8A85\", \"0x8F8C8D8A30303030\", \"0x303030308A898887\"],\n    \"XMM5\": [\"0x8D8E8F8830303030\", \"0x30303030888B8A85\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data1]\nlea rbx, [rel .data2]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rbx]\n\n; Register only\nvxorpd ymm2, ymm0, ymm1\nvxorpd xmm3, xmm0, xmm1\n\n; With memory operand\nvxorpd ymm4, ymm0, [rbx]\nvxorpd xmm5, xmm0, [rbx]\n\nhlt\n\nalign 32\n.data1:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0xCCCCCCCC75767778\ndq 0x61626364DDDDDDDD\ndq 0xEEEEEEEE55565758\ndq 0x41424344FFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vxorps.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0x6162636465666768\", \"0x7172737475767778\"],\n    \"XMM1\": [\"0xCCCCCCCC75767778\", \"0x61626364DDDDDDDD\", \"0xEEEEEEEE55565758\", \"0x41424344FFFFFFFF\"],\n    \"XMM2\": [\"0x8D8E8F8830303030\", \"0x30303030888B8A85\", \"0x8F8C8D8A30303030\", \"0x303030308A898887\"],\n    \"XMM3\": [\"0x8D8E8F8830303030\", \"0x30303030888B8A85\", \"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM4\": [\"0x8D8E8F8830303030\", \"0x30303030888B8A85\", \"0x8F8C8D8A30303030\", \"0x303030308A898887\"],\n    \"XMM5\": [\"0x8D8E8F8830303030\", \"0x30303030888B8A85\", \"0x0000000000000000\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data1]\nlea rbx, [rel .data2]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rbx]\n\n; Register only\nvxorps ymm2, ymm0, ymm1\nvxorps xmm3, xmm0, xmm1\n\n; With memory operand\nvxorps ymm4, ymm0, [rbx]\nvxorps xmm5, xmm0, [rbx]\n\nhlt\n\nalign 32\n.data1:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n\n.data2:\ndq 0xCCCCCCCC75767778\ndq 0x61626364DDDDDDDD\ndq 0xEEEEEEEE55565758\ndq 0x41424344FFFFFFFF\n"
  },
  {
    "path": "unittests/ASM/VEX/vzeroall.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM1\": [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM2\": [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM3\": [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM4\": [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM5\": [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM6\": [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM7\": [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM8\": [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM9\": [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM10\": [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM11\": [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM12\": [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM13\": [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM14\": [\"0\", \"0\", \"0\", \"0\"],\n    \"XMM15\": [\"0\", \"0\", \"0\", \"0\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx]\nvmovapd ymm2, [rdx]\nvmovapd ymm3, [rdx]\nvmovapd ymm4, [rdx]\nvmovapd ymm5, [rdx]\nvmovapd ymm6, [rdx]\nvmovapd ymm7, [rdx]\nvmovapd ymm8, [rdx]\nvmovapd ymm9, [rdx]\nvmovapd ymm10, [rdx]\nvmovapd ymm11, [rdx]\nvmovapd ymm12, [rdx]\nvmovapd ymm13, [rdx]\nvmovapd ymm14, [rdx]\nvmovapd ymm15, [rdx]\n\nvzeroall\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/VEX/vzeroupper.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"XMM0\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"],\n    \"XMM1\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"],\n    \"XMM2\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"],\n    \"XMM3\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"],\n    \"XMM4\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"],\n    \"XMM5\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"],\n    \"XMM6\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"],\n    \"XMM7\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"],\n    \"XMM8\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"],\n    \"XMM9\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"],\n    \"XMM10\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"],\n    \"XMM11\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"],\n    \"XMM12\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"],\n    \"XMM13\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"],\n    \"XMM14\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"],\n    \"XMM15\": [\"0x4142434445464748\", \"0x5152535455565758\", \"0\", \"0\"]\n  }\n}\n%endif\n\nlea rdx, [rel .data]\n\nvmovapd ymm0, [rdx]\nvmovapd ymm1, [rdx]\nvmovapd ymm2, [rdx]\nvmovapd ymm3, [rdx]\nvmovapd ymm4, [rdx]\nvmovapd ymm5, [rdx]\nvmovapd ymm6, [rdx]\nvmovapd ymm7, [rdx]\nvmovapd ymm8, [rdx]\nvmovapd ymm9, [rdx]\nvmovapd ymm10, [rdx]\nvmovapd ymm11, [rdx]\nvmovapd ymm12, [rdx]\nvmovapd ymm13, [rdx]\nvmovapd ymm14, [rdx]\nvmovapd ymm15, [rdx]\n\nvzeroupper\n\nhlt\n\nalign 32\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\ndq 0x6162636465666768\ndq 0x7172737475767778\n"
  },
  {
    "path": "unittests/ASM/X87/D8_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0xc000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfadd dword [rdx + 8 * 1]\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D8_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfmul dword [rdx + 8 * 1]\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D8_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0xBFFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfsub dword [rdx + 8 * 1]\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D8_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfsubr dword [rdx + 8 * 1]\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D8_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFE\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfdiv dword [rdx + 8 * 1]\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D8_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfdivr dword [rdx + 8 * 1]\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D8_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0xC000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfld qword [rdx + 8 * 1]\n\n; fadd st(0), st(i)\nfadd st0, st1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D8_C8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4001\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 0], rax\n\nfld qword [rdx + 8 * 0]\nfmul st0, st0\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D8_D0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x1\"\n  }\n}\n%endif\n\nfinit\nfld1\nfldz\nfcom st1\n\nfnstsw ax\ncmp ah, 0x31\nje good\nmov rax, 0\nhlt\ngood:\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D8_D9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\n; Only tests pop behaviour\nfld1\nfldz\nfcomp\nfld1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D8_E0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0xBFFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfld qword [rdx + 8 * 1]\nfsub st0, st1\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D8_E8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfld qword [rdx + 8 * 1]\nfsubr st0, st1\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D8_F0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 0], rax\n\nfld qword [rdx + 8 * 0]\nfdiv st0, st0\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D8_F0_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0\"\n  }\n}\n%endif\n\n; Tests that a division by zero does not set the IE flag\nfinit\nfldz\nfld1\nfdiv st0, st1\n\nfnstsw ax\nand rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D8_F8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFE\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x4010000000000000 ; 4.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfld qword [rdx + 8 * 1]\n\nfdivr st0, st1\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x3fff\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld dword [rdx + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3F800000\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3fff\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\nmov eax, 0x0\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\nfst dword [rdx + 8 * 1]\n\nmov eax, [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3F800000\",\n    \"MM7\": [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\nmov eax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], eax\nmov eax, 0x0 ; 1.0\nmov [rdx + 8 * 2], eax\n\nfld dword [rdx + 8 * 0]\nfstp dword [rdx + 8 * 2]\nfld dword [rdx + 8 * 1]\n\nmov eax, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_05.asm",
    "content": "%ifdef CONFIG\n{\n}\n%endif\n\nmov rdx, 0xe0000000\n; Just to ensure execution\nfldcw [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3fff\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\nmov eax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], eax\nmov eax, 0x40800000 ; 4.0\nmov [rdx + 8 * 2], eax\n\nfld dword [rdx + 8 * 0]\no16 fstenv [rdx + 8 * 3]\nfld dword [rdx + 8 * 2]\no16 fldenv [rdx + 8 * 3]\n\n; This will overwrite the previous load\n; This is since the control word is stored and reloaded\nfld dword [rdx + 8 * 1]\n\n; 14 bytes for 16bit\n; 2 Bytes : FCW\n; 2 Bytes : FSW\n; 2 bytes : FTW\n; 2 bytes : Instruction offset\n; 2 bytes : Instruction CS selector\n; 2 bytes : Data offset\n; 2 bytes : Data selector\n\n; 28 bytes for 32bit\n; 4 bytes : FCW\n; 4 bytes : FSW\n; 4 bytes : FTW\n; 4 bytes : Instruction pointer\n; 2 bytes : instruction pointer selector\n; 2 bytes : Opcode\n; 4 bytes : data pointer offset\n; 4 bytes : data pointer selector\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_06_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3fff\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\nmov eax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], eax\nmov eax, 0x40800000 ; 4.0\nmov [rdx + 8 * 2], eax\n\nfld dword [rdx + 8 * 0]\no32 fstenv [rdx + 8 * 3]\nfld dword [rdx + 8 * 2]\no32 fldenv [rdx + 8 * 3]\n\n; This will overwrite the previous load\n; This is since the control word is stored and reloaded\nfld dword [rdx + 8 * 1]\n\n; 14 bytes for 16bit\n; 2 Bytes : FCW\n; 2 Bytes : FSW\n; 2 bytes : FTW\n; 2 bytes : Instruction offset\n; 2 bytes : Instruction CS selector\n; 2 bytes : Data offset\n; 2 bytes : Data selector\n\n; 28 bytes for 32bit\n; 4 bytes : FCW\n; 4 bytes : FSW\n; 4 bytes : FTW\n; 4 bytes : Instruction pointer\n; 2 bytes : instruction pointer selector\n; 2 bytes : Opcode\n; 4 bytes : data pointer offset\n; 4 bytes : data pointer selector\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x37F\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\nfnstcw [rdx]\nmov eax, 0\nmov ax, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfld st0\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_C8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\nmov eax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\nfld dword [rdx + 8 * 1]\n\nfxch\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_D0.asm",
    "content": "%ifdef CONFIG\n{\n}\n%endif\n\n; Just to ensure execution\nfnop\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_E0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0xC000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\nfchs\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfchs\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt -1.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_E1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\nfabs\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfabs\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt -1.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_E4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x100\",\n    \"RBX\": \"0x0\",\n    \"RCX\": \"0x4000\"\n  }\n}\n%endif\n\nfld dword [rel positive]\nftst\nfnstsw ax\nand rax, 0x4700\nmov rbx, rax\n\nfldz\nftst\nfnstsw ax\nand rax, 0x4700\nmov rcx, rax\n\nfld dword [rel negative]\nftst\nfnstsw ax\nand rax, 0x4700\n\nhlt\n\nalign 16\npositive: dd 3.14159\nnegative: dd -2.71828"
  },
  {
    "path": "unittests/ASM/X87/D9_E8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nfld1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_E9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0xD49A784BCD1B8AFE\", \"0x4000\"]\n  }\n}\n%endif\n\nfldl2t\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_EA.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0xB8AA3B295C17F0BC\", \"0x3FFF\"]\n  }\n}\n%endif\n\nfldl2e\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_EB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0xC90FDAA22168C235\", \"0x4000\"]\n  }\n}\n%endif\n\nfldpi\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_EC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0x9A209A84FBCFF799\", \"0x3FFD\"]\n  }\n}\n%endif\n\nfldlg2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_ED.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0xB17217F7D1CF79AC\", \"0x3FFE\"]\n  }\n}\n%endif\n\nfldln2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_EE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0\", \"0\"]\n  }\n}\n%endif\n\nfldz\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_F0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x0000000000000000\", \"0x0000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\nf2xm1\n\nhlt\n\nalign 8\ndata:\n  dt 0.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_F1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4002\"]\n  }\n}\n%endif\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfyl2x\nfld1\n\nhlt\n\nalign 8\ndata:\n  dt 16.0\n  dq 0\n\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_F2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0xC75922E5F71D2DC6\", \"0x3FFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfptan\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_F3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0xC90FDAA22168C235\", \"0x3FFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfpatan\nfld1\n\nhlt\n\nalign 8\ndata:\n  dt 7.0\n  dq 0\ndata2:\n  dt 0.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_F4.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0xF000000000000000\", \"0xBFFF\"],\n    \"MM7\":  [\"0xC000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfxtract\n\nhlt\n\nalign 8\ndata:\n  dt -15.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_F4_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0xFFFF\"],\n    \"MM6\":  [\"0x0000000000000000\", \"0x0000\"],    \n    \"MM5\":  [\"0x8000000000000000\", \"0xFFFF\"],\n    \"MM4\":  [\"0x0000000000000000\", \"0x8000\"]\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  }\n}\n%endif\n\nsection .data\n    nzer: dq -0.0\n\nsection .text\nglobal _start\n_start:\nfinit\nfldz\nfxtract ; MM7 is -inf, MM6 is 0.0\n\nlea rdx, [rel nzer]\nfld qword [rdx]\nfxtract ; MM5 is -inf, MM4 is -0.0\n\nhlt\n\n"
  },
  {
    "path": "unittests/ASM/X87/D9_F5.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0xE666666666666668\", \"0xBFFE\"],\n    \"MM7\":  [\"0xC000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfprem1\n\nhlt\n\nalign 4096\ndata:\n  dt 3.0\n  dq 0\ndata2:\n  dt 5.1\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_F5_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0xC000000000000000\", \"0xC000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4001\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfprem\n\nlea rdx, [rel result1]\nfstp tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfprem1\n\nlea rdx, [rel result2]\nfstp tword [rdx + 8 * 0]\n\nffreep st0\n\nlea rdx, [rel result1]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel result2]\nfld tword [rdx + 8 * 0]\n\n; MM6 contains result2 (fprem1)\n; MM7 contains result1 (fprem)\n\nhlt\n\nalign 4096\ndata:\n  dt 7.0\n  dq 0\ndata2:\n  dt 11.0\n  dq 0\n\nresult1:\n  dt 0.0\n  dq 0.0\nresult2:\n  dt 0.0\n  dq 0.0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_F5_3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0xC000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0xC001\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfprem\n\nlea rdx, [rel result1]\nfstp tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfprem1\n\nlea rdx, [rel result2]\nfstp tword [rdx + 8 * 0]\n\nffreep st0\n\nlea rdx, [rel result1]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel result2]\nfld tword [rdx + 8 * 0]\n\n; MM6 contains result2 (fprem1)\n; MM7 contains result1 (fprem)\n\nhlt\n\nalign 4096\ndata:\n  dt 7.0\n  dq 0\ndata2:\n  dt -11.0\n  dq 0\n\nresult1:\n  dt 0.0\n  dq 0.0\nresult2:\n  dt 0.0\n  dq 0.0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_F6.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"7\",\n    \"RBX\":  \"0\",\n    \"MM0\":  \"0x3ff0000000000000\",\n    \"MM1\":  \"0x4070000000000000\",\n    \"MM2\":  \"0x4060000000000000\",\n    \"MM3\":  \"0x4050000000000000\",\n    \"MM4\":  \"0x4040000000000000\",\n    \"MM5\":  \"0x4030000000000000\",\n    \"MM6\":  \"0x4020000000000000\",\n    \"MM7\":  \"0x4000000000000000\"\n  }\n}\n%endif\n\n; Set the stack with different values.\n; Then do fincstp and store the stack values into MMX registers through memory\n; such that MM0 has the value of ST0 and so on.\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4020000000000000 ; 4.0\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4030000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4040000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4050000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4060000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4070000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\n; Store top in RBX\nxor rax, rax\nxor rbx, rbx\nfnstsw ax\nshr ax, 11\nand ax, 7\nmov bx, ax\n\n; Move the value of stop\n; ST0 is currently 0x4070000000000000\nfdecstp\n\n; Store top in RAX\nxor rax, rax\nfnstsw ax\nshr ax, 11\nand ax, 7\n\n; Now ST0 is 0x3ff0000000000000\nfstp qword [rel stack + 8 * 0]\nfstp qword [rel stack + 8 * 1]\nfstp qword [rel stack + 8 * 2]\nfstp qword [rel stack + 8 * 3]\nfstp qword [rel stack + 8 * 4]\nfstp qword [rel stack + 8 * 5]\nfstp qword [rel stack + 8 * 6]\nfstp qword [rel stack + 8 * 7]\n\nmovq mm0, [rel stack + 8 * 0]\nmovq mm1, [rel stack + 8 * 1]\nmovq mm2, [rel stack + 8 * 2]\nmovq mm3, [rel stack + 8 * 3]\nmovq mm4, [rel stack + 8 * 4]\nmovq mm5, [rel stack + 8 * 5]\nmovq mm6, [rel stack + 8 * 6]\nmovq mm7, [rel stack + 8 * 7]\n\nhlt\n\nalign 4096\ntemp: dq 0\nstack: dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_F7.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"1\",\n    \"RBX\":  \"0\",\n    \"MM0\":  \"0x4060000000000000\",\n    \"MM1\":  \"0x4050000000000000\",\n    \"MM2\":  \"0x4040000000000000\",\n    \"MM3\":  \"0x4030000000000000\",\n    \"MM4\":  \"0x4020000000000000\",\n    \"MM5\":  \"0x4000000000000000\",\n    \"MM6\":  \"0x3ff0000000000000\",\n    \"MM7\":  \"0x4070000000000000\"\n  }\n}\n%endif\n\n; Set the stack with different values.\n; Then do fincstp and store the stack values into MMX registers through memory\n; such that MM0 has the value of ST0 and so on.\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4020000000000000 ; 4.0\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4030000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4040000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4050000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4060000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4070000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\n; Store top in RBX\nxor rax, rax\nfnstsw ax\nshr ax, 11\nand ax, 7\nmov bx, ax\n\n; Move the value of stop\n; ST0 is currently 0x4070000000000000\nfincstp\n\n; Store top in RAX\nxor rax, rax\nfnstsw ax\nshr ax, 11\nand ax, 7\n\n; Now ST0 is 0x4060000000000000\nfstp qword [rel stack + 8 * 0]\nfstp qword [rel stack + 8 * 1]\nfstp qword [rel stack + 8 * 2]\nfstp qword [rel stack + 8 * 3]\nfstp qword [rel stack + 8 * 4]\nfstp qword [rel stack + 8 * 5]\nfstp qword [rel stack + 8 * 6]\nfstp qword [rel stack + 8 * 7]\n\nmovq mm0, [rel stack + 8 * 0]\nmovq mm1, [rel stack + 8 * 1]\nmovq mm2, [rel stack + 8 * 2]\nmovq mm3, [rel stack + 8 * 3]\nmovq mm4, [rel stack + 8 * 4]\nmovq mm5, [rel stack + 8 * 5]\nmovq mm6, [rel stack + 8 * 6]\nmovq mm7, [rel stack + 8 * 7]\n\nhlt\n\nalign 4096\ntemp: dq 0\nstack: dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_F8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8666666666666666\", \"0x4000\"],\n    \"MM7\":  [\"0xC000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfprem\n\nhlt\n\nalign 8\ndata:\n  dt 3.0\n  dq 0\ndata2:\n  dt 5.1\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_F9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4002\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfyl2xp1\nfld1\n\nhlt\n\nalign 8\ndata:\n  dt 15.0\n  dq 0\n\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_FA.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4001\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfsqrt\n\nhlt\n\nalign 8\ndata:\n  dt 16.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_FB.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8A51407DA8345C92\", \"0x3FFE\"],\n    \"MM7\":  [\"0xD76AA47848677021\", \"0x3FFE\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfsincos\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_FC.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0x8000000000000000\", \"0x3fff\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f834241 ; 1.02546\nmov [rdx + 8 * 0], eax\n\nfld dword [rdx + 8 * 0]\n\nfrndint\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/D9_FD.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4006\"],\n    \"MM7\":  [\"0xB000000000000000\", \"0x4001\"]\n  }\n}\n%endif\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfscale\n\nhlt\n\nalign 8\ndata:\n  dt 4.0\n  dq 0\n\ndata2:\n  dt 5.5\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_FD_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0xD000000000000000\", \"0xC001\"]\n  }\n}\n%endif\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfscale\n\nhlt\n\nalign 8\ndata:\n  dt 64.0\n  dq 0\n\ndata2:\n  dt -6.5\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_FE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0xD76AA47848677021\", \"0x3FFE\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfsin\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/D9_FF.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0xD51132BA9B902522\", \"0xBFFD\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfcos\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DA_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xc000000000000000\", \"0x4000\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xbfff\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, 2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfiadd dword [rdx + 8 * 1]\n\nfstp tword [rel data]\n\nmovups xmm0, [rel data]\n\n; Test negative\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, -2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfiadd dword [rdx + 8 * 1]\n\nfstp tword [rel data]\n\nmovups xmm1, [rel data]\n\nhlt\n\nalign 4096\ndata:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DA_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xC000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, 2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfimul dword [rdx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm0, [rel data2]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, -2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfimul dword [rdx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm1, [rel data2]\n\nhlt\n\nalign 4096\ndata2:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DA_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RSI\":  \"0x18\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\nmov rsi, 0\n\n; Matching positive-positive\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, 1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp dword [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\n; Matching negative-negative\nmov rax, 0xbff0000000000000 ; -1.0\nmov [rdx + 8 * 0], rax\nmov eax, -1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp dword [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\n; Nonmatching negative-positive\nmov rax, 0xbff0000000000000 ; -1.0\nmov [rdx + 8 * 0], rax\nmov eax, 1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp dword [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\n; Nonmatching positive-negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, -1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp dword [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DA_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0xBFFF\"],\n    \"XMM1\":  [\"0xC000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, 2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfisub dword [rdx + 8 * 1]\nfstp tword [rel data]\nmovups xmm0, [rel data]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, -2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfisub dword [rdx + 8 * 1]\nfstp tword [rel data]\nmovups xmm1, [rel data]\n\nhlt\n\nalign 4096\ndata:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DA_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"XMM1\":  [\"0xC000000000000000\", \"0xC000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, 2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfisubr dword [rdx + 8 * 1]\nfstp tword [rel data]\nmovups xmm0, [rel data]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, -2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfisubr dword [rdx + 8 * 1]\nfstp tword [rel data]\nmovups xmm1, [rel data]\n\nhlt\n\nalign 4096\ndata:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DA_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x3FFE\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xBFFE\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, 2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfidiv dword [rdx + 8 * 1]\n\nfstp tword [rel data]\nmovups xmm0, [rel data]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, -2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfidiv dword [rdx + 8 * 1]\n\nfstp tword [rel data]\nmovups xmm1, [rel data]\n\nhlt\n\nalign 4096\ndata:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DA_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xC000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, 2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfidivr dword [rdx + 8 * 1]\nfstp tword [rel data]\nmovups xmm0, [rel data]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, -2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfidivr dword [rdx + 8 * 1]\nfstp tword [rel data]\nmovups xmm1, [rel data]\n\nhlt\n\nalign 4096\ndata:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DA_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM6\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 2\ncmp eax, 1\n\nfcmovb st0, st1\n\nfldz\ncmp eax, 3\nfcmovb st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DA_C8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 1\ncmp eax, 1\n\nfcmove st0, st1\n\nfldz\ncmp eax, 0\nfcmove st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DA_D0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 2\ncmp eax, 2\n\nfcmovbe st0, st1\n\nfldz\ncmp eax, 0\nfcmovbe st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DA_D8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM6\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 0x0\ncmp eax, -1\n\nfcmovu st0, st1\n\nfldz\ncmp eax, 1\nfcmovu st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DA_D9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\n; Only tests pop behaviour\nfld1\nfldz\nfldz\nfcompp\nfld1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DA_E9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\n; Only tests pop behaviour\nfld1\nfldz\nfldz\nfucompp\nfld1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DB_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0x8000000000000000\", \"0x4009\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 1024\nmov [rdx + 8 * 0], eax\n\nfild dword [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DB_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x44800000 ; 1024.0\nmov [rdx + 8 * 0], eax\nmov eax, 0\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\n\nfisttp dword [rdx + 8 * 1]\n\nfld1\n\nmov eax, [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DB_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"MM6\": [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4009\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x44800000 ; 1024.0\nmov [rdx + 8 * 0], eax\nmov eax, 0\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\n\nfist dword [rdx + 8 * 1]\n\nfld1\n\nmov eax, [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DB_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x44800000 ; 1024.0\nmov [rdx + 8 * 0], eax\nmov eax, 0\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\n\nfistp dword [rdx + 8 * 1]\n\nfld1\n\nmov eax, [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DB_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\n\nfld tword [rdx + 8 * 0]\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DB_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfstp tword [rdx + 8 * 0]\nfld tword [rdx + 8 * 0]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 0.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DB_07_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nlea rax, [rdx + 8 * 0]\nfstp tword [rax]\nfld tword [rdx + 8 * 0]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 0.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DB_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 2\ncmp eax, 1\n\nfcmovnb st0, st1\n\nfldz\ncmp eax, 3\nfcmovnb st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DB_C8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM6\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 1\ncmp eax, 1\n\nfcmovne st0, st1\n\nfldz\ncmp eax, 0\nfcmovne st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DB_D0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM6\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 2\ncmp eax, 2\n\nfcmovnbe st0, st1\n\nfldz\ncmp eax, 0\nfcmovnbe st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DB_D8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x0000000000000000\", \"0x0000\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 0x0\ncmp eax, -1\n\nfcmovnu st0, st1\n\nfldz\ncmp eax, 1\nfcmovnu st0, st2\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DB_E2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RBX\": \"1\"\n  }\n}\n%endif\n\nfinit ; IOC is 0\nfldz\nfldz\nfdiv st0, st1 ; IOC is 1\n\nfnstsw ax\nand rax, 1\nmov rbx, rax ; save IOC to RBX\n\n; Clear\nfnclex\n\nfnstsw ax\nand rax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DB_E3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x037F\"\n  }\n}\n%endif\n\nfninit\n\n; Ensures that fnstcw after fninit sets the correct value\nfnstcw [rel control]\nmov ax, word [rel control]\n\nhlt\n\nalign 4096\ncontrol: times 2 db 0 ; Reserve space for the FPU control word\n"
  },
  {
    "path": "unittests/ASM/X87/DB_E3_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\"\n  }\n}\n%endif\n\n; Tests that fninit clears the status word (which includes the IE flag)\nfninit\nfldz\nfldz\nfdiv ; sets IE flag\n\nfninit\nfnstsw ax\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DB_E8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x0\",\n    \"RCX\": \"0x1\",\n    \"RDI\": \"0x40\",\n    \"RSI\": \"0x45\",\n    \"RBP\": \"0x45\"\n  }\n}\n%endif\n\nmov rsp, 0xe000_1000\n\nlea rdx, [rel qnan]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel minus_one]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel two]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel one]\nfld tword [rdx + 8 * 0]\nfld tword [rdx + 8 * 0]\n\n; Mask for CF, PF, ZF flags\nmov rax, 0b1000101\n\n; Stack:\n; st(0) = 1.0\n; st(1) = 1.0\n; st(2) = 2.0\n; st(3) = -1.0\n; st(4) = QNaN\n\n; st(0) > st(i)\nfucomi st3\npushfq\npop rbx\nand rbx, rax\n\n; st(0) < st(i)\nfucomi st2\npushfq\npop rcx\nand rcx, rax\n\n; st(0) == st(i)\nfucomi st1\npushfq\npop rdi\nand rdi, rax\n\n; st(i) == NaN\nfucomi st4\npushfq\npop rsi\nand rsi, rax\n\nlea rdx, [rel qnan]\nfld tword [rdx + 8 * 0]\n\n; st(0) == NaN\nfucomi st1\npushfq\npop rbp\nand rbp, rax\n\nhlt\n\nalign 8\none:\n  dt 1.0\n\nalign 8\ntwo:\n  dt 2.0\n\nalign 8\nminus_one:\n  dt -1.0\n\nalign 8\nqnan:\n  dq 0xC000000000000001\n  dw 0x7FFF\n"
  },
  {
    "path": "unittests/ASM/X87/DB_F0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x0\",\n    \"RCX\": \"0x1\",\n    \"RDI\": \"0x40\"\n  }\n}\n%endif\n\nmov rsp, 0xe000_1000\n\nlea rdx, [rel minus_one]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel two]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel one]\nfld tword [rdx + 8 * 0]\nfld tword [rdx + 8 * 0]\n\n; Mask for CF, PF, ZF flags\nmov rax, 0b1000101\n\n; Stack:\n; st(0) = 1.0\n; st(1) = 1.0\n; st(2) = 2.0\n; st(3) = -1.0\n\n; st(0) > st(i)\nfcomi st3\npushfq\npop rbx\nand rbx, rax\n\n; st(0) < st(i)\nfcomi st2\npushfq\npop rcx\nand rcx, rax\n\n; st(0) == st(i)\nfcomi st1\npushfq\npop rdi\nand rdi, rax\n\nhlt\n\nalign 8\none:\n  dt 1.0\n\nalign 8\ntwo:\n  dt 2.0\n\nalign 8\nminus_one:\n  dt -1.0\n"
  },
  {
    "path": "unittests/ASM/X87/DC_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0xC000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfadd qword [rdx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dq 2.0\n"
  },
  {
    "path": "unittests/ASM/X87/DC_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfmul qword [rdx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dq 2.0\n"
  },
  {
    "path": "unittests/ASM/X87/DC_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0xBFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfsub qword [rdx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dq 2.0\n"
  },
  {
    "path": "unittests/ASM/X87/DC_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfsubr qword [rdx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dq 2.0\n"
  },
  {
    "path": "unittests/ASM/X87/DC_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFE\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfdiv qword [rdx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dq 2.0\n"
  },
  {
    "path": "unittests/ASM/X87/DC_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4001\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfdivr qword [rdx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dq 8.0\n"
  },
  {
    "path": "unittests/ASM/X87/DC_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM5\":  [\"0x8000000000000000\", \"0x4001\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0xA000000000000000\", \"0x4001\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 1], rax\nmov rax, 0x4010000000000000 ; 4.0\nmov [rdx + 8 * 2], rax\n\nfld qword [rdx + 8 * 0]\nfld qword [rdx + 8 * 1]\nfld qword [rdx + 8 * 2]\n\n; fadd st(i), st(0)\nfadd st2, st0\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DC_C8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4002\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfmul st1, st0\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DC_D0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x1\"\n  }\n}\n%endif\n\n; Tests undocumented fcom implementation at 0xdc, 0xd0+i\nfinit\nfld1\nfldz\n; fcom st1\ndb 0xdc, 0xd1\n\nfnstsw ax\ncmp ah, 0x31\nje good\nmov rax, 0\nhlt\ngood:\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DC_D9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\n; Only tests pop behaviour\n; Tests undocumented fcomp implementation at 0xdc, 0xd8+i\nfinit\nfld1\nfldz\n; fcomp\ndb 0xdc, 0xd9\nfld1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DC_E0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfsubr st1, st0\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DC_E8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0xBFFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfsub st1, st0\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DC_F0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFE\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfdivr st1, st0\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DC_F8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x4001\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfdiv st1, st0\n\nhlt\n\nalign 8\ndata:\n  dt 8.0\n  dq 0\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DD_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 0], rax\n\nfld qword [rdx + 8 * 0]\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DD_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x2\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data3]\nfisttp qword [rdx + 8 * 0]\n\nmov rax, [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dq 0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DD_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4000000000000000\",\n    \"MM6\": [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data3]\nfst qword [rdx + 8 * 0]\n\nmov rax, [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dq 0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DD_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4000000000000000\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data3]\nfstp qword [rdx + 8 * 0]\n\nmov rax, [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dq 0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DD_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xc90fdaa22168c235\", \"0x4000\"],\n    \"XMM1\": [\"0x8000000000000000\", \"0x4005\"],\n    \"XMM2\": [\"0x8000000000000000\", \"0x4004\"],\n    \"XMM3\": [\"0x8000000000000000\", \"0x4003\"],\n    \"XMM4\": [\"0x8000000000000000\", \"0x4002\"],\n    \"XMM5\": [\"0x8000000000000000\", \"0x4001\"],\n    \"XMM6\": [\"0x8000000000000000\", \"0x4000\"],\n    \"XMM7\": [\"0x0000000000000000\", \"0x0000\"],\n    \"MM0\":  [\"0xc90fdaa22168c235\", \"0x4000\"],\n    \"MM1\":  [\"0x8000000000000000\", \"0x4005\"],\n    \"MM2\":  [\"0x8000000000000000\", \"0x4004\"],\n    \"MM3\":  [\"0x8000000000000000\", \"0x4003\"],\n    \"MM4\":  [\"0x8000000000000000\", \"0x4002\"],\n    \"MM5\":  [\"0x8000000000000000\", \"0x4001\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x0000000000000000\", \"0x0000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 2\nmov [rdx + 2 * 1], rax\nmov rax, 4\nmov [rdx + 2 * 2], rax\nmov rax, 8\nmov [rdx + 2 * 3], rax\nmov rax, 16\nmov [rdx + 2 * 4], rax\nmov rax, 32\nmov [rdx + 2 * 5], rax\nmov rax, 64\nmov [rdx + 2 * 6], rax\n\nfldz\nfild word [rdx + 2 * 1]\nfild word [rdx + 2 * 2]\nfild word [rdx + 2 * 3]\nfild word [rdx + 2 * 4]\nfild word [rdx + 2 * 5]\nfild word [rdx + 2 * 6]\nfldpi\n\no32 fnsave [rdx]\n\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\n\no32 frstor [rdx]\n\nmovups xmm0, [rdx + (0x1C + 10 * 0)]\nmovups xmm1, [rdx + (0x1C + 10 * 1)]\nmovups xmm2, [rdx + (0x1C + 10 * 2)]\nmovups xmm3, [rdx + (0x1C + 10 * 3)]\nmovups xmm4, [rdx + (0x1C + 10 * 4)]\nmovups xmm5, [rdx + (0x1C + 10 * 5)]\nmovups xmm6, [rdx + (0x1C + 10 * 6)]\nmovups xmm7, [rdx + (0x1C + 10 * 7)]\n\npslldq xmm0, 6\npsrldq xmm0, 6\n\npslldq xmm1, 6\npsrldq xmm1, 6\n\npslldq xmm2, 6\npsrldq xmm2, 6\n\npslldq xmm3, 6\npsrldq xmm3, 6\n\npslldq xmm4, 6\npsrldq xmm4, 6\n\npslldq xmm5, 6\npsrldq xmm5, 6\n\npslldq xmm6, 6\npsrldq xmm6, 6\n\npslldq xmm7, 6\npsrldq xmm7, 6\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DD_04_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\": [\"0xc90fdaa22168c235\", \"0x4000\"],\n    \"XMM1\": [\"0x8000000000000000\", \"0x4005\"],\n    \"XMM2\": [\"0x8000000000000000\", \"0x4004\"],\n    \"XMM3\": [\"0x8000000000000000\", \"0x4003\"],\n    \"XMM4\": [\"0x8000000000000000\", \"0x4002\"],\n    \"XMM5\": [\"0x8000000000000000\", \"0x4001\"],\n    \"XMM6\": [\"0x8000000000000000\", \"0x4000\"],\n    \"XMM7\": [\"0x0000000000000000\", \"0x0000\"],\n    \"MM0\":  [\"0xc90fdaa22168c235\", \"0x4000\"],\n    \"MM1\":  [\"0x8000000000000000\", \"0x4005\"],\n    \"MM2\":  [\"0x8000000000000000\", \"0x4004\"],\n    \"MM3\":  [\"0x8000000000000000\", \"0x4003\"],\n    \"MM4\":  [\"0x8000000000000000\", \"0x4002\"],\n    \"MM5\":  [\"0x8000000000000000\", \"0x4001\"],\n    \"MM6\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"MM7\":  [\"0x0000000000000000\", \"0x0000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 2\nmov [rdx + 2 * 1], rax\nmov rax, 4\nmov [rdx + 2 * 2], rax\nmov rax, 8\nmov [rdx + 2 * 3], rax\nmov rax, 16\nmov [rdx + 2 * 4], rax\nmov rax, 32\nmov [rdx + 2 * 5], rax\nmov rax, 64\nmov [rdx + 2 * 6], rax\n\nfldz\nfild word [rdx + 2 * 1]\nfild word [rdx + 2 * 2]\nfild word [rdx + 2 * 3]\nfild word [rdx + 2 * 4]\nfild word [rdx + 2 * 5]\nfild word [rdx + 2 * 6]\nfldpi\n\no16 fnsave [rdx]\n\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\n\no16 frstor [rdx]\n\nmovups xmm0, [rdx + (0xE + 10 * 0)]\nmovups xmm1, [rdx + (0xE + 10 * 1)]\nmovups xmm2, [rdx + (0xE + 10 * 2)]\nmovups xmm3, [rdx + (0xE + 10 * 3)]\nmovups xmm4, [rdx + (0xE + 10 * 4)]\nmovups xmm5, [rdx + (0xE + 10 * 5)]\nmovups xmm6, [rdx + (0xE + 10 * 6)]\nmovups xmm7, [rdx + (0xE + 10 * 7)]\n\npslldq xmm0, 6\npsrldq xmm0, 6\n\npslldq xmm1, 6\npsrldq xmm1, 6\n\npslldq xmm2, 6\npsrldq xmm2, 6\n\npslldq xmm3, 6\npsrldq xmm3, 6\n\npslldq xmm4, 6\npsrldq xmm4, 6\n\npslldq xmm5, 6\npsrldq xmm5, 6\n\npslldq xmm6, 6\npsrldq xmm6, 6\n\npslldq xmm7, 6\npsrldq xmm7, 6\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DD_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFF3800\",\n    \"RBX\": \"0xFFFFFFFFFFFF0000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nmov rax, -1\nmov rbx, -1\nfnstsw [rdx + 8 * 1]\n\nfld dword [rdx + 8 * 0]\nfnstsw [rdx + 8 * 2]\nmov ax, word [rdx + 8 * 2]\nmov bx, word [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DD_C0.asm",
    "content": "%ifdef CONFIG\n{\n}\n%endif\n\n; Just to ensure execution\nffree st0\nffree st1\nffree st2\nffree st3\nffree st4\nffree st5\nffree st6\nffree st7\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DD_C8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\n; Tests undocumented fxch implementation at 0xdd, 0xc8+i\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\nmov eax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\nfld dword [rdx + 8 * 1]\n\ndb 0xdd, 0xc9\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DD_D0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfst st1\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DD_D0_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"MM0\": [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\nfst st1  ;; copies st0, i.e. 2.0 to st1\nfstp st0 ;; pop, st1 becomes st0\n\n;; ensure st0 has valid tag.\nfxam     ;; get if top is valid in C2\nfstsw ax ;; store work into ax\nshr ax, 10\nand ax, 1\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DD_D8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfstp st1\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n\n"
  },
  {
    "path": "unittests/ASM/X87/DD_E9.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\n; Only tests pop behaviour\nfld1\nfldz\nfucomp\nfld1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DE_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xc000000000000000\", \"0x4000\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xbfff\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, 2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfiadd word [rdx + 8 * 1]\n\nfstp tword [rel data]\n\nmovups xmm0, [rel data]\n\n; Test negative\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, -2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfiadd word [rdx + 8 * 1]\n\nfstp tword [rel data]\n\nmovups xmm1, [rel data]\n\nhlt\n\nalign 4096\ndata:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DE_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xC000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, 2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfimul word [rdx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm0, [rel data2]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, -2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfimul word [rdx + 8 * 1]\nfstp tword [rel data2]\nmovups xmm1, [rel data2]\n\nhlt\n\nalign 4096\ndata2:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DE_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RSI\":  \"0x18\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\nmov rsi, 0\n\n; Matching positive-positive\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, 1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp word [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\n; Matching negative-negative\nmov rax, 0xbff0000000000000 ; -1.0\nmov [rdx + 8 * 0], rax\nmov ax, -1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp word [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\n; Nonmatching negative-positive\nmov rax, 0xbff0000000000000 ; -1.0\nmov [rdx + 8 * 0], rax\nmov ax, 1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp word [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\n; Nonmatching positive-negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, -1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp word [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DE_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0xBFFF\"],\n    \"XMM1\":  [\"0xC000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, 2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfisub word [rdx + 8 * 1]\nfstp tword [rel data]\nmovups xmm0, [rel data]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, -2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfisub word [rdx + 8 * 1]\nfstp tword [rel data]\nmovups xmm1, [rel data]\n\nhlt\n\nalign 4096\ndata:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DE_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"XMM1\":  [\"0xC000000000000000\", \"0xC000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, 2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfisubr word [rdx + 8 * 1]\nfstp tword [rel data]\nmovups xmm0, [rel data]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, -2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfisubr word [rdx + 8 * 1]\nfstp tword [rel data]\nmovups xmm1, [rel data]\n\nhlt\n\nalign 4096\ndata:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DE_06.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x3FFE\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xBFFE\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, 2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfidiv word [rdx + 8 * 1]\nfstp tword [rel data]\nmovups xmm0, [rel data]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, -2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfidiv word [rdx + 8 * 1]\nfstp tword [rel data]\nmovups xmm1, [rel data]\n\nhlt\n\nalign 4096\ndata:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DE_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000000\", \"0x4000\"],\n    \"XMM1\":  [\"0x8000000000000000\", \"0xC000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, 2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfidivr word [rdx + 8 * 1]\nfstp tword [rel data]\nmovups xmm0, [rel data]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, -2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfidivr word [rdx + 8 * 1]\nfstp tword [rel data]\nmovups xmm1, [rel data]\n\nhlt\n\nalign 4096\ndata:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DE_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0xC000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfaddp st1, st0\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n\n"
  },
  {
    "path": "unittests/ASM/X87/DE_C8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4002\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfmulp st1, st0\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DE_D0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\n; Only tests pop behaviour\n; Tests undocumented fcomp implementation at 0xde, 0xd0+i\nfinit\nfld1\nfldz\n; fcomp\ndb 0xde, 0xd1\nfld1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DE_E0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfsubrp st1, st0\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DE_E8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0x8000000000000000\", \"0xC000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfsubp st1, st0\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DE_F0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfdivrp st1, st0\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DE_F8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFE\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\n; fdivp 2.0, 4.0\n; == st1 = 2.0 / 4.0\nfdivp st1, st0\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/DF_00.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0x8000000000000000\", \"0x4009\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 1024\nmov [rdx + 8 * 0], eax\nmov eax, -1\nmov [rdx + 8 * 0 + 2], eax\n\nfild word [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DF_01.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x2\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data3]\nfisttp word [rdx + 8 * 0]\n\nmov ax, word [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dq -1\n  dq -1\n"
  },
  {
    "path": "unittests/ASM/X87/DF_02.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"MM6\": [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4009\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x44800000 ; 1024.0\nmov [rdx + 8 * 0], eax\nmov eax, -1\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\n\nfist word [rdx + 8 * 1]\n\nfld1\n\nmov eax, 0\nmov ax, word [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DF_03.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x44800000 ; 1024.0\nmov [rdx + 8 * 0], eax\nmov eax, -1\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\n\nfistp word [rdx + 8 * 1]\n\nfld1\n\nmov eax, 0\nmov ax, word [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DF_04.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x0506070801020304\", \"0x0000000000000012\"],\n    \"XMM1\":  [\"0x6576879821324354\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0xB90984060D355548\", \"0x000000000000C03B\"],\n    \"XMM3\":  [\"0xA83732340C01F070\", \"0x000000000000C03B\"],\n    \"XMM4\":  [\"0xFFAA6DA43613FED0\", \"0x000000000000C03A\"],\n    \"XMM5\":  [\"0x0000000000000001\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x0000000000000001\", \"0x0000000000008000\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0x0000000000008000\"],\n    \"XMM8\":  [\"0x0000000000000000\", \"0x0000000000008000\"],\n    \"XMM9\":  [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\":  [\"0x0000000000000001\", \"0x0000000000008000\"],\n    \"XMM11\":  [\"0x0000000000000001\", \"0x0000000000000000\"]\n  }\n}\n%endif\n\nfbld [rel .data_0]\nfbstp [rel .res_data_0]\nmovups xmm0, [rel .res_data_0]\n\nfbld [rel .data_1]\nfbstp [rel .res_data_1]\nmovups xmm1, [rel .res_data_1]\n\n; Check encoding of invalid BCD\nfbld [rel .data_2]\nfstp tword [rel .res_data_2]\nmovups xmm2, [rel .res_data_2]\n\nfbld [rel .data_3]\nfstp tword [rel .res_data_3]\nmovups xmm3, [rel .res_data_3]\n\nfbld [rel .data_4]\nfstp tword [rel .res_data_4]\nmovups xmm4, [rel .res_data_4]\n\n; Some special values\nfld tword [rel .data_5]\nfbstp [rel .res_data_5]\nmovups xmm5, [rel .res_data_5]\n\nfld tword [rel .data_6]\nfbstp [rel .res_data_6]\nmovups xmm6, [rel .res_data_6]\n\nfld tword [rel .data_7]\nfbstp [rel .res_data_7]\nmovups xmm7, [rel .res_data_7]\n\n; Values that choose +- 0 or +-1 depending on rounding mode\n; -1 < F < -0\n; +0 < F < +1\nfld tword [rel .data_8]\nfbstp [rel .res_data_8]\nmovups xmm8, [rel .res_data_8]\n\nfld tword [rel .data_9]\nfbstp [rel .res_data_9]\nmovups xmm9, [rel .res_data_9]\n\n; Swap control word\nfnstcw [rel .cw]\nmov ax, [rel .cw]\nand ax, ~(3 << 10)\nor eax, 1 << 10 ; Round down\nmov [rel .cw], ax\nfldcw [rel .cw]\n\nfld tword [rel .data_10]\nfbstp [rel .res_data_10]\nmovups xmm10, [rel .res_data_10]\n\n; Swap control word\nfnstcw [rel .cw]\nmov ax, [rel .cw]\nand ax, ~(3 << 10)\nor eax, 2 << 10 ; Round up\nmov [rel .cw], ax\nfldcw [rel .cw]\n\nfld tword [rel .data_11]\nfbstp [rel .res_data_11]\nmovups xmm11, [rel .res_data_11]\n\n; Values that generate Invalicating floating point operation exception\n; -inf\n; +inf\n; Negative value too large for destination format\n; Positive value too large for destination format\n; NaN\n; On IA the indefinite BCD result is still stored to memory\n\n; XXX: We don't support IA on this\n\nhlt\n\nalign 4096\n.cw:\ndw 0\n\n.data_0:\ndd 0x01020304\ndd 0x05060708\ndd 0x09101112\ndd 0x13141516\n.data_1:\ndd 0x21324354\ndd 0x65768798\ndd 0x00000000\ndd 0x00000000\n.data_2:\ndd 0xFFFFFFFF\ndd 0xFFFFFFFF\ndd 0xFFFFFFFF\ndd 0xFFFFFFFF\n.data_3:\ndd 0xF0F0F0F0\ndd 0xF0F0F0F0\ndd 0xF0F0F0F0\ndd 0xF0F0F0F0\n.data_4:\ndd 0x0A0B0C0D\ndd 0x0E0FAAAB\ndd 0xACADAEAF\ndd 0xBABBBCBD\n.data_5:\ndt 1.0\n.data_6:\ndt -1.0\n.data_7:\ndt -0.0\n.data_8:\ndt -0.5\n.data_9:\ndt 0.5\n.data_10:\ndt -0.5\n.data_11:\ndt 0.5\n\n.res_data_0:\ndq 0\ndq 0\n.res_data_1:\ndq 0\ndq 0\n.res_data_2:\ndq 0\ndq 0\n.res_data_3:\ndq 0\ndq 0\n.res_data_4:\ndq 0\ndq 0\n.res_data_5:\ndq 0\ndq 0\n.res_data_6:\ndq 0\ndq 0\n.res_data_7:\ndq 0\ndq 0\n.res_data_8:\ndq 0\ndq 0\n.res_data_9:\ndq 0\ndq 0\n.res_data_10:\ndq 0\ndq 0\n.res_data_11:\ndq 0\ndq 0\n\n"
  },
  {
    "path": "unittests/ASM/X87/DF_05.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\": [\"0x8000000000000000\", \"0x4009\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 1024\nmov [rdx + 8 * 0], rax\n\nfild qword [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DF_07.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x44800000 ; 1024.0\nmov [rdx + 8 * 0], eax\nmov rax, -1\nmov [rdx + 8 * 1], rax\n\nfld dword [rdx + 8 * 0]\n\nfistp qword [rdx + 8 * 1]\n\nfld1\n\nmov rax, qword [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DF_C0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\":  [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\":  [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 1], rax\nmov rax, 0x4010000000000000 ; 4.0\nmov [rdx + 8 * 2], rax\n\nfld qword [rdx + 8 * 0]\nfld qword [rdx + 8 * 1]\n\n; Undocumented x87 instruction\n; Sets the tag register to empty for the stack register\n; Then pops the stack\nffreep st0\nfld qword [rdx + 8 * 2] ; Overwrites previous value\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DF_C8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x3FFF\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x4000\"]\n  }\n}\n%endif\n\n; Tests undocumented fxch implementation at 0xdf, 0xc8+i\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\nmov eax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\nfld dword [rdx + 8 * 1]\n\ndb 0xdf, 0xc9\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DF_D0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\n; Tests undocumented fstp implementation at 0xdf, 0xd0+i\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\ndb 0xdf, 0xd1\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n\n"
  },
  {
    "path": "unittests/ASM/X87/DF_D8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM6\": [\"0x8000000000000000\", \"0x4001\"],\n    \"MM7\": [\"0x8000000000000000\", \"0x3FFF\"]\n  }\n}\n%endif\n\n; Tests undocumented fstp implementation at 0xdf, 0xd8+i\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\ndb 0xdf, 0xd9\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n\n"
  },
  {
    "path": "unittests/ASM/X87/DF_E0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFF3800\",\n    \"RBX\": \"0xFFFFFFFFFFFF0000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nmov rax, -1\nmov rbx, -1\nfnstsw ax\nmov bx, ax\n\nfld dword [rdx + 8 * 0]\nfnstsw ax\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/DF_E8.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x0\",\n    \"RCX\": \"0x1\",\n    \"RDI\": \"0x40\",\n    \"RSI\": \"0x45\",\n    \"RBP\": \"0x45\"\n  }\n}\n%endif\n\nmov rsp, 0xe000_1000\n\nlea rdx, [rel one]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel two]\nfld tword [rdx + 8 * 0]\n\n; Mask for CF, PF, ZF flags\nmov rax, 0b1000101\n\n; st(0) > st(i)\nfucomip st1\npushfq\npop rbx\nand rbx, rax\n\nlea rdx, [rel minus_one]\nfld tword [rdx + 8 * 0]\n\n; st(0) < st(i)\nfucomip st1\npushfq\npop rcx\nand rcx, rax\n\nlea rdx, [rel one]\nfld tword [rdx + 8 * 0]\n\n; st(0) == st(i)\nfucomip st1\npushfq\npop rdi\nand rdi, rax\n\nlea rdx, [rel qnan]\nfld tword [rdx + 8 * 0]\n\n; st(0) == NaN\nfucomip st1\npushfq\npop rsi\nand rsi, rax\n\nlea rdx, [rel qnan]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel one]\nfld tword [rdx + 8 * 0]\n\n; st(i) == NaN\nfucomip st1\npushfq\npop rbp\nand rbp, rax\n\nhlt\n\nalign 8\none:\n  dt 1.0\n\nalign 8\ntwo:\n  dt 2.0\n\nalign 8\nminus_one:\n  dt -1.0\n\nalign 8\nqnan:\n  dq 0xC000000000000001\n  dw 0x7FFF\n"
  },
  {
    "path": "unittests/ASM/X87/DF_F0.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x0\",\n    \"RCX\": \"0x1\",\n    \"RDI\": \"0x40\"\n  }\n}\n%endif\n\nmov rsp, 0xe000_1000\n\nlea rdx, [rel one]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel two]\nfld tword [rdx + 8 * 0]\n\n; Mask for CF, PF, ZF flags\nmov rax, 0b1000101\n\n; st(0) > st(i)\nfcomip st1\npushfq\npop rbx\nand rbx, rax\n\nlea rdx, [rel minus_one]\nfld tword [rdx + 8 * 0]\n\n; st(0) < st(i)\nfcomip st1\npushfq\npop rcx\nand rcx, rax\n\nlea rdx, [rel one]\nfld tword [rdx + 8 * 0]\n\n; st(0) == st(i)\nfcomip st1\npushfq\npop rdi\nand rdi, rax\n\nhlt\n\nalign 8\none:\n  dt 1.0\n\nalign 8\ntwo:\n  dt 2.0\n\nalign 8\nminus_one:\n  dt -1.0\n"
  },
  {
    "path": "unittests/ASM/X87/FISTTP_16bit.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RBX\": \"1\"\n  }\n}\n%endif\n\n; Test FISTTP with 16-bit integer store\n; FISTTP always truncates toward zero, ignoring rounding control word\n\nfinit\nfld qword [rel .value]\n\n; Convert to int16 using truncation - 1.9 should become 1, not 2\nfisttp word [rel .result]\n\nfstsw ax\nand rax, 1\n\n; Load result to verify truncation worked\nmovzx rbx, word [rel .result]\n\nhlt\n\nalign 4096\n.value: dq 1.9\n.result: dw 0"
  },
  {
    "path": "unittests/ASM/X87/FISTTP_16bit_neg.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RBX\": \"0xFFFF\"\n  }\n}\n%endif\n\n; Test FISTTP with negative value - truncation toward zero\n; -1.9 should become -1 (0xFFFF in 16-bit two's complement), not -2\n\nfinit\nfld qword [rel .value]\n\nfisttp word [rel .result]\n\nfstsw ax\nand rax, 1\n\nmovzx rbx, word [rel .result]\n\nhlt\n\nalign 4096\n.value: dq -1.9\n.result: dw 0"
  },
  {
    "path": "unittests/ASM/X87/FISTTP_32bit.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RBX\": \"1\"\n  }\n}\n%endif\n\n; Test FISTTP with 32-bit integer store\n; FISTTP always truncates toward zero, ignoring rounding control word\n\nfinit\nfld qword [rel .value]\n\n; Convert to int32 using truncation - 1.9 should become 1, not 2\nfisttp dword [rel .result]\n\nfstsw ax\nand rax, 1\n\n; Load result to verify truncation worked\nmov ebx, dword [rel .result]\n\nhlt\n\nalign 4096\n.value: dq 1.9\n.result: dd 0"
  },
  {
    "path": "unittests/ASM/X87/FISTTP_32bit_neg.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RBX\": \"0xFFFFFFFF\"\n  }\n}\n%endif\n\n; Test FISTTP with negative value - truncation toward zero\n; -1.9 should become -1 (0xFFFFFFFF in 32-bit two's complement), not -2\n\nfinit\nfld qword [rel .value]\n\nfisttp dword [rel .result]\n\nfstsw ax\nand rax, 1\n\nmov ebx, dword [rel .result]\n\nhlt\n\nalign 4096\n.value: dq -1.9\n.result: dd 0"
  },
  {
    "path": "unittests/ASM/X87/FISTTP_64bit.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RBX\": \"1\"\n  }\n}\n%endif\n\n; Test FISTTP with 64-bit integer store\n; FISTTP always truncates toward zero, ignoring rounding control word\n\nfinit\nfld qword [rel .value]\n\n; Convert to int64 using truncation - 1.9 should become 1, not 2\nfisttp qword [rel .result]\n\nfstsw ax\nand rax, 1\n\n; Load result to verify truncation worked\nmov rbx, qword [rel .result]\n\nhlt\n\nalign 4096\n.value: dq 1.9\n.result: dq 0"
  },
  {
    "path": "unittests/ASM/X87/FISTTP_64bit_neg.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\"\n  }\n}\n%endif\n\n; Test FISTTP with negative value - truncation toward zero\n; -1.9 should become -1 (0xFFFFFFFFFFFFFFFF in 64-bit two's complement), not -2\n\nfinit\nfld qword [rel .value]\n\nfisttp qword [rel .result]\n\nfstsw ax\nand rax, 1\n\nmov rbx, qword [rel .result]\n\nhlt\n\nalign 4096\n.value: dq -1.9\n.result: dq 0"
  },
  {
    "path": "unittests/ASM/X87/FPREM1_Flags.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\"\n  }\n}\n%endif\n\nmov rbx, 0xe0000000\no32 fstenv [rbx]\nmov dword [rbx+4], 0xFFFFFFFF ; set status word to all one\no32 fldenv [rbx]\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfprem1\n\nxor rax, rax\nfstsw ax\nand rax, 0x400 ; C2 should be set to zero\n\nhlt\n\nalign 8\ndata:\n  dt 3.0\n  dq 0\ndata2:\n  dt 5.1\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/FPREM_Flags.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\"\n  }\n}\n%endif\n\nmov rbx, 0xe0000000\no32 fstenv [rbx]\nmov dword [rbx+4], 0xFFFFFFFF ; set status word to all one\no32 fldenv [rbx]\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfprem\n\nxor rax, rax\nfstsw ax\nand rax, 0x400 ; C2 should be set to zero\n\nhlt\n\nalign 8\ndata:\n  dt 3.0\n  dq 0\ndata2:\n  dt 5.1\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/FST_AddrModes.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3f800000\",\n    \"RBX\": \"0x3f800000\",\n    \"RCX\": \"0x3f800000\",\n    \"R8\": \"0x3f800000\",\n    \"R9\": \"0x3f800000\",\n    \"R10\": \"0x3f800000\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  }\n}\n%endif\n\n; Setup\nfld1\nlea rdx, [rel base]\nmov rsi, 0x64\n\n; Test fst\nfst dword [rdx]\nfst dword [rdx + 0xa]\nfst dword [rdx + rsi]\nfst dword [rdx + rsi * 4]\nfst dword [rdx + rsi + 0xa]\nfst dword [rdx + rsi * 4 + 0xa]\n\n; Result check\nmov eax, dword [rdx]\nmov ebx, dword [rdx + 0xa]\nmov ecx, dword [rdx + rsi]\nmov r8d, dword [rdx + rsi * 4]\nmov r9d, dword [rdx + rsi + 0xa]\nmov r10d, dword [rdx + rsi * 4 + 0xa]\n\nhlt\n\nalign 4096\nbase:\ntimes 4096 db 0\n"
  },
  {
    "path": "unittests/ASM/X87/FScale-Zero.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R8\": \"0\",\n    \"R9\": \"0\",\n    \"R10\": \"0\",\n    \"R11\": \"0\",\n    \"R12\": \"0\",\n    \"R13\": \"0x8000000000000000\"\n  }\n}\n%endif\n\n; scale by zero (st1 == 0)\nmov rax, 0\nmov qword [rel intstor], rax\nfinit\nfild qword [rel intstor]\nfldz\nfscale\nfst qword [rel intstor]\nmov r8, [rel intstor]\n\n; scale by zero (st1 == 1)\nmov rax, 1\nmov qword [rel intstor], rax\nfinit\nfild qword [rel intstor]\nfldz\nfscale\nfst qword [rel intstor]\nmov r9, [rel intstor]\n\n; scale by zero (st1 == 100)\nmov rax, 100\nmov qword [rel intstor], rax\nfinit\nfild qword [rel intstor]\nfldz\nfscale\nfst qword [rel intstor]\nmov r10, [rel intstor]\n\n; scale by zero (st1 == 1024)\nmov rax, 1024\nmov qword [rel intstor], rax\nfinit\nfild qword [rel intstor]\nfldz\nfscale\nfst qword [rel intstor]\nmov r11, [rel intstor]\n\n; scale by zero (st1 == 1048576)\nmov rax, 1048576\nmov qword [rel intstor], rax\nfinit\nfild qword [rel intstor]\nfldz\nfscale\nfst qword [rel intstor]\nmov r12, [rel intstor]\n\n; tests scaling negative zero\nmov rax, 1048576\nmov qword [rel intstor], rax\nfinit\nfild qword [rel intstor]\nfld qword [rel neg_zero]\nfscale\nfst qword [rel intstor]\nmov r13, [rel intstor]\n\nhlt\n\nalign 4096\nneg_zero: dq 0x8000000000000000   ; -0.0\n\nintstor: dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/FScaleFXtract.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R8\": \"1\"\n  }\n}\n%endif\n; ,\n;     \"R9\": \"1\",\n;     \"R10\": \"1\",\n;     \"R11\": \"1\",\n;     \"R12\": \"1\"\nsection .data\n    num0: dq 0.0\n    num1: dq 125.78\n    num2: dq 1023.12\n    num3: dq -23487.152\n    num4: dq -1230192.123\n\n;; Tests the FScale / FExtract inverse behaviour\nsection .text\n    global _start\n_start:\n    \n; num0 == 0.0\nfinit\nfld qword [rel num0]\nfld st0\nfxtract\nfscale\nfstp st1  ; at this point st0 and st1 should be the same\nfcom\nfnstsw ax\nand ax, 0x4500\ncmp ax, 0x4000\nsetz r8b\n\n; ; num1 == 125.78\n; finit\n; fld qword [rel num1]\n; fld st0\n; fxtract\n; fscale\n; fstp st1  ; at this point st0 and st1 should be the same\n; fcom\n; fnstsw ax\n; and ax, 0x4500\n; cmp ax, 0x4000\n; setz r9b\n\n; ; num2 == 1023.12\n; finit\n; fld qword [rel num2]\n; fld st0\n; fxtract\n; fscale\n; fstp st1  ; at this point st0 and st1 should be the same\n; fcom\n; fnstsw ax\n; and ax, 0x4500\n; cmp ax, 0x4000\n; setz r10b\n\n; ; num3 == -23487.152\n; finit\n; fld qword [rel num3]\n; fld st0\n; fxtract\n; fscale\n; fstp st1  ; at this point st0 and st1 should be the same\n; fcom\n; fnstsw ax\n; and ax, 0x4500\n; cmp ax, 0x4000\n; setz r11b\n\n; ; num4 == -1230192.123\n; finit\n; fld qword [rel num4]\n; fld st0\n; fxtract\n; fscale\n; fstp st1  ; at this point st0 and st1 should be the same\n; fcom\n; fnstsw ax\n; and ax, 0x4500\n; cmp ax, 0x4000\n; setz r12b\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/FXAM_Push.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"8\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; This behaviour was seen around Wine 32-bit libraries\n; Anything doing a call to a double application would spin\n; the x87 stack on to the stack looking for fxam to return empty\n; Empty in this case is that C0 and C3 is set while C2 is not\n\nfninit\n; Fill the x87 stack\nfldz\nfldz\nfldz\nfldz\nfldz\nfldz\nfldz\nfldz\n\nmov eax, 0\nmov ecx, 0\n\n.ExamineStack:\n; Examine st(0)\nfxam\nfwait\n; Get the results in to AX\nfnstsw ax\nand ax, 0x4500\n; Check for empty\ncmp ax, 0x4100\nje .Done\n\n; Now push the x87 stack value\n; We know it isn't empty\nfstp qword [rdx + rcx * 8]\nfwait\ninc ecx\njmp .ExamineStack\n\n.Done:\n\n; Save how many we stored\nmov eax, ecx\n\n; Now fill with \"Garbage\"\nfld1\nfld1\nfld1\nfld1\nfld1\nfld1\nfld1\nfld1\n\n.Reload:\n; Now reload the stack\ndec ecx\nfld qword [rdx + rcx * 8]\ncmp ecx, 0x0\njne .Reload;\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/FXAM_Push_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"0\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; This behaviour was seen around Wine 32-bit libraries\n; Anything doing a call to a double application would spin\n; the x87 stack on to the stack looking for fxam to return empty\n; Empty in this case is that C0 and C3 is set while C2 is not\n\nfninit\n; Empty stack to make sure we don't push anything\n\nmov eax, 0\nmov ecx, 0\n\n.ExamineStack:\n; Examine st(0)\nfxam\nfwait\n; Get the results in to AX\nfnstsw ax\nand ax, 0x4500\n; Check for empty\ncmp ax, 0x4100\nje .Done\n\n; Now push the x87 stack value\n; We know it isn't empty\nfstp qword [rdx + rcx * 8]\nfwait\ninc ecx\njmp .ExamineStack\n\n.Done:\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/FXAM_Push_Simple.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"8\"\n  }\n}\n%endif\n\nfninit\nfld1\nfld1\nfld1\nfld1\nfld1\nfld1\nfld1\nfld1\n\nmov ebx, 0\n\n.ExamineStack:\n; Examine st(0)\nfxam\nfwait\n; Get the results in to AX\nfnstsw ax\nand ax, 0x4500\n; Check for empty\ncmp ax, 0x4100\nje .Done\n\n; Now push the x87 stack value\n; We know it isn't empty\nfstp st0\nfwait\ninc ebx\njmp .ExamineStack\n.Done:\nmov eax, ebx\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/FXAM_Push_Simple_2.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"8\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; This behaviour was seen around Wine 32-bit libraries\n; Anything doing a call to a double application would spin\n; the x87 stack on to the stack looking for fxam to return empty\n; Empty in this case is that C0 and C3 is set while C2 is not\n\nfninit\n; Fill the x87 stack\nfldz\nfldz\nfldz\nfldz\nfldz\nfldz\nfldz\nfldz\n\nmov eax, 0\nmov ecx, 0\n\n.ExamineStack:\n; Examine st(0)\nfxam\nfwait\n; Get the results in to AX\nfnstsw ax\nand ax, 0x4500\n; Check for empty\ncmp ax, 0x4100\nje .Done\n\n; Now push the x87 stack value\n; We know it isn't empty\nfstp qword [rdx + rcx * 8]\nfwait\ninc ecx\njmp .ExamineStack\n\n.Done:\n; Save how many we stored\nmov eax, ecx\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/FXAM_Simple.asm",
    "content": ";; Simpler versions of FXAM_Push* tests.\n;; In hostrunner tests this will fail because we mentioned below there's no support\n;; for the zero flag. In hostrunner RCX should contain 0x4000 instead of 0x400.\n%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x6\",\n    \"RBX\": \"0x0400\",\n    \"RCX\": \"0x0400\",\n    \"RDX\": \"0x4100\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nfninit\n;; Before adding anything to the stack, lets examine it.\n;; The result should be empty.\nfxam\nfwait\n\nfnstsw ax \nand ax, 0x4500 ; should be 0x4100 for zero\nmov edx, eax\n\nfldz\nfxam \nfwait \n\nfnstsw ax\nand ax, 0x4500 ; should be 0x4000 for zero, but there's no support for it at the moment, so it'll return 0x0400 as it does for a normal number.\nmov ecx, eax\n\nfld1\nfxam\nfwait\n\nfnstsw ax\nmov ebx, eax\nand ebx, 0x4500 ; should be 0x0400 for normal\n\n;; Top should be 6\n;; right shift status word by 11 and and with 0x7.\nshr eax, 11\nand eax, 0x7\n\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/LoadAtBoundary.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"MM7\":  [\"0x5354555657584142\", \"0x0000000000005152\"],\n    \"MM6\":  [\"0xe94de5eae34fc1c0\", \"0x0000000000004039\"]\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  }\n}\n%endif\n\nfinit ; enters x87 state\n\nmov rax, 0x100000000\nmov rbx, 0x4142434445464748\nmov rcx, 0x5152535455565758\nmov rdx, (0x100000000 + 0x1000 - 16)\n\nmov [rdx], rbx\nmov [rdx + 8], rcx\n\nmov rdx, 0x100000000 + 0x1000\n\n; Do an 80-bit load at the edge of a page.\n; Ensuring tword loads don't extend past the end of a page.\nfld tword [rdx - 10]\n\n; Do an 80-bit BCD load at the edge of a page.\nfbld [rdx - 10]\n\n; Do a BCD store\nfbstp [rdx - 10]\n\n; Regular 80-bit store\nfstp tword [rdx - 10]\n\n; Loads again to get register state.\nfld tword [rdx - 10]\nfbld [rdx - 10]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/Memcopy.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3ff8000000000000\",\n    \"RBX\": \"0x3ff8000000000000\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  }\n}\n%endif\n\nmov rdx, 0x100000000\nmov rax, 0x3ff8000000000000 ; 1.5\nmov [rdx], rax\n\nfld qword [rdx]\nfstp qword [rdx + 8]\n\nmov rbx, [rdx + 8]\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/MemcopyWithCPUID.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x8000000000000000\",\n    \"RCX\": \"0x3fff\"\n  }\n}\n%endif\n\n; Related to #4274 - ensures that if cpuid clobbers the predicate register,\n; we reset the predicate cache.\nlea r8, [rel data]\nfld tword [r8]\n\nmov rax, 0x0\ncpuid ; Will this instruction clobber the predicate register?\n\nfstp tword [rel data2]\n\nmov rbx, [rel data2]\nmov rcx, [rel data2+8]\nhlt\n\nalign 4096\n\ndata:\n  dt 1.0\n\nalign 8\n\ndata2:\n  times 16 db 0\n"
  },
  {
    "path": "unittests/ASM/X87/Rounding.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x212121211121\",\n    \"RCX\": \"0xfffefffeffffffff\",\n    \"RDX\": \"0xfffffffeffffffff\",\n    \"RSI\": \"0xfffefffeffffffff\"\n  }\n}\n%endif\n\n; Rounding tests to ensure rounding modes are actually working\n\n;; Mid-point\nfinit\nfld qword [rel midpoint]\n\n; Default rounding is 00 - round to nearest\nfist dword [rel tmp]\nmov rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0400\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0800\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0c00\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n;; Slightly above midpoint\nfinit\nfld qword [rel samidpoint]\n\n; Default rounding is 00 - round to nearest\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0400\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0800\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0c00\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n;; Slightly below midpoint\nfinit\nfld qword [rel sbmidpoint]\n\n; Default rounding is 00 - round to nearest\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0400\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0800\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0c00\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nor rbx, qword [rel tmp]\n\n\n;;; Negative tests\n;; Mid-point\nfinit\nfld qword [rel nmidpoint]\n\n; Default rounding is 00 - round to nearest\nfist word [rel tmp]\nmov ax, word [rel tmp]\nor rcx, rax \nshl rcx, 16\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0400\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov ax, word [rel tmp]\nor rcx, rax\nshl rcx, 16\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0800\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov ax, word [rel tmp]\nor rcx, rax\nshl rcx, 16\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0c00\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nmov ax, word [rel tmp]\nor rcx, rax\n\n;; Slightly above midpoint\nfinit\nfld qword [rel nsamidpoint]\n\n; Default rounding is 00 - round to nearest\nfist dword [rel tmp]\nmov dx, word [rel tmp]\nshl rdx, 16\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0400\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov ax, word [rel tmp]\nor rdx, rax\nshl rdx, 16\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0800\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov ax, word [rel tmp]\nor rdx, rax\nshl rdx, 16\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0c00\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nmov ax, word [rel tmp]\nor rdx, rax\n\n;; Slightly below midpoint\nfinit\nfld qword [rel nsbmidpoint]\n\n; Default rounding is 00 - round to nearest\nfist dword [rel tmp]\nmov si, word [rel tmp]\nshl rsi, 16\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0400\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov ax, word [rel tmp]\nor rsi, rax\nshl rsi, 16\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0800\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov ax, word [rel tmp]\nor rsi, rax\nshl rsi, 16\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0c00\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nmov ax, word [rel tmp]\nor rsi, rax\n\nhlt\n\nalign 4096\nmidpoint:\n  dq 1.5\nsamidpoint:\n  dq 1.50001\nsbmidpoint:\n  dq 1.49999\nnmidpoint:\n  dq -1.5\nnsamidpoint:\n  dq -1.49999\nnsbmidpoint:\n  dq -1.50001\ntmp: dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/StoreAtBoundary.asm",
    "content": "%ifdef CONFIG\n{\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  }\n}\n%endif\n\nfinit ; enters x87 state\n\nmov rax, 0x100000000\nmov rbx, 0x4142434445464748\nmov rcx, 0x5152535455565758\nmov rdx, (0x100000000 + 0x1000 - 16)\n\nmov [rdx], rbx\nmov [rdx + 8], rcx\n\nmov rdx, 0x100000000 + 0x1000\n\n; Load the data in to an x87 register for storing.\nfld tword [rdx - 16]\nfld tword [rdx - 16]\n\n; Do an 80-bit store at the edge of a page.\n; Ensuring tword stores don't extend past the end of a page.\n; If storing past the end of the page, then an unhandled SIGSEGV will occur.\nfstp tword [rdx - 10]\n\n; Do an 80-bit bcd store at the edge of a page.\nfbstp [rdx - 10]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/X87MMXInteraction.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0\",\n    \"RBX\": \"0x0\",\n    \"RCX\": \"0x8000000000000000\",\n    \"RDX\": \"0x3FFF\",\n    \"R8\": \"0xc90fdaa22168c235\",\n    \"R9\": \"0x4000\",\n    \"R10\": \"0xc90fdaa22168c235\",\n    \"R11\": \"0xFFFF\"\n  }\n}\n%endif\n\n; Checks that after moving from X87 to MMX States, the\n; values are correct and that MMX register writes, puts the top 16 bits as\n; all 1s.\nfinit ; enters x87 state\n\nfldpi ; goes in mm7\nfld1  ; goes in mm6\n\nmovq mm5, mm7 ; enters mmx state, so 1 is now in st6 and pi in st7, while st5 has a broken pi.\no32 fnsave [rel x87env]\n\n; Top into eax\nmov eax, dword [rel x87env + 4]\nand eax, 0x3800\nshr eax, 11 ; top in eax\n\n; Tag into ebx\nmov bx, word [rel x87env + 8]\n\n; st6 is 1\nmov rcx, qword [rel x87env + 88]\nmov dx, word [rel x87env + 96]\n\n; st7 is pi\nmov r8, qword [rel x87env + 98]\nmov r9w, word [rel x87env + 106]\n\n; st5 is broken pi\nmov r10, qword [rel x87env + 78]\nmov r11w, word [rel x87env + 86]\n\nhlt\n\nalign 4096\nx87env: times 108 db 0\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_div_zero.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test 0.0 / 0.0 = Invalid Operation (should set bit 0 of status word)\nfldz\nfldz\nfdiv\n\nfstsw ax\nand rax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_fcos_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test fcos(+infinity) = Invalid Operation (should set bit 0 of status word)\n; Load positive infinity: exponent all 1s, mantissa 0x8000000000000000\nmov rax, 0x8000000000000000\nmov [rel .pos_inf], rax\nmov ax, 0x7FFF\nmov [rel .pos_inf + 8], ax\n\nfld tword [rel .pos_inf]\nfcos\n\nfstsw ax\nand rax, 1\n\nhlt\n\nalign 4096\n.pos_inf:\ndq 0\ndw 0\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_fist_nan.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test FIST with NaN input = Invalid Operation (should set bit 0 of status word)\n; Create NaN by computing 0.0 / 0.0\nfldz\nfldz\nfdiv\n\n; Try to convert NaN to integer - this should set Invalid Operation\nlea rbx, [rel data]\nfist dword [rbx]\n\nfstsw ax\nand rax, 1\n\nhlt\n\nalign 4096\ndata:\n  dd 0\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_fist_overflow.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test FIST with value too large for 32-bit integer = Invalid Operation\n; Load a large floating point value that exceeds INT32_MAX\nlea rdx, [rel large_value]\nfld tword [rdx]\n\n; Try to convert to 32-bit integer - should set Invalid Operation\nlea rbx, [rel data]\nfist dword [rbx]\n\nfstsw ax\nand rax, 1\n\nhlt\n\nalign 4096\nlarge_value:\n  dt 1e20\ndata:\n  dd 0\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_fist_overflow_16bit.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test FIST with 16-bit overflow = Invalid Operation (should set bit 0 of status word)\n; Create a large number that will overflow int16\n\n; Load 2^30 (larger than int16 range: max int16 = 32767, 2^30 = 1073741824)\nfinit\nfild dword [rel .thirty]\nfld1\nfscale\n\n; Try to convert to int16 - this should overflow and be invalid\nfistp word [rel .dummy]\n\nfstsw ax\nand rax, 1\n\nhlt\n\nalign 4096\n.thirty: dq 30\n.dummy: dw 0\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_fist_overflow_32bit.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test FIST with 32-bit overflow = Invalid Operation (should set bit 0 of status word)\n; Create a very large number that will overflow int32\n\n; Load 2^50 (larger than int32 range)\nfinit\nfild dword [rel .fifty]\nfld1\nfscale\n\n; Try to convert to int32 - this should overflow and be invalid\nfistp dword [rel .dummy]\n\nfstsw ax\nand rax, 1\n\nhlt\n\nalign 4096\n.fifty: dq 50\n.dummy: dd 0\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_fist_overflow_64bit.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test FIST with 64-bit overflow = Invalid Operation (should set bit 0 of status word)\n; Create a very large number that will overflow int64\n\n; Load 2^75 (larger than int64 range)\nfinit\nfild dword [rel .seventyfive]\nfld1\nfscale\n\n; Try to convert to int64 - this should overflow and be invalid\nfistp qword [rel .dummy]\n\nfstsw ax\nand rax, 1\n\nhlt\n\nalign 4096\n.seventyfive: dq 75\n.dummy: dq 0\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_fprem_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test FPREM with simple operands first\nfinit\n\n; Load simple operands: fprem(0, 1) should be valid and return 0\nfldz\nfld1\n\n; Do FPREM: ST(0) = fprem(ST(0), ST(1)) = fprem(1.0, 0.0)\n; fprem(1.0, 0.0) should set Invalid Operation because divisor is zero\nfprem\n\nfstsw ax\nand rax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_fptan_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test fptan(+infinity) = Invalid Operation (should set bit 0 of status word)\n; Load positive infinity: exponent all 1s, mantissa 0x8000000000000000\nmov rax, 0x8000000000000000\nmov [rel .pos_inf], rax\nmov ax, 0x7FFF\nmov [rel .pos_inf + 8], ax\n\nfld tword [rel .pos_inf]\nfptan\n\nfstsw ax\nand rax, 1\n\nhlt\n\nalign 4096\n.pos_inf:\ndq 0\ndw 0\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_fsin_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test fsin(+infinity) = Invalid Operation (should set bit 0 of status word)\n; Load positive infinity: exponent all 1s, mantissa 0x8000000000000000\nmov rax, 0x8000000000000000\nmov [rel .pos_inf], rax\nmov ax, 0x7FFF\nmov [rel .pos_inf + 8], ax\n\nfld tword [rel .pos_inf]\nfsin\n\nfstsw ax\nand rax, 1\n\nhlt\n\nalign 4096\n.pos_inf:\ndq 0\ndw 0\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_fsin_neg_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test fsin(-infinity) = Invalid Operation (should set bit 0 of status word)\n; Load negative infinity: exponent all 1s, mantissa 0x8000000000000000, sign bit set\nmov rax, 0x8000000000000000\nmov [rel .neg_inf], rax\nmov ax, 0xFFFF\nmov [rel .neg_inf + 8], ax\n\nfld tword [rel .neg_inf]\nfsin\n\nfstsw ax\nand rax, 1\n\nhlt\n\nalign 4096\n.neg_inf:\ndq 0\ndw 0\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_fsincos_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test fsincos(+infinity) = Invalid Operation (should set bit 0 of status word)\n; Load positive infinity: exponent all 1s, mantissa 0x8000000000000000\nmov rax, 0x8000000000000000\nmov [rel .pos_inf], rax\nmov ax, 0x7FFF\nmov [rel .pos_inf + 8], ax\n\nfld tword [rel .pos_inf]\nfsincos\n\nfstsw ax\nand rax, 1\n\nhlt\n\nalign 4096\n.pos_inf:\ndq 0\ndw 0\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_infinity_fsubr_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test ∞ - ∞ using FSUB\nfld1\nfldz\nfdiv ; st0 = +∞\n\n; duplicate +infinity\nfld st0\n\n; Reverse subtract ∞ - ∞ using FSUBR - this should be invalid\nfsubr\n\nfstsw ax\nand rax, 1\n\nhlt"
  },
  {
    "path": "unittests/ASM/X87/invalid_infinity_mul_zero.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test ∞ × 0 = Invalid Operation (should set bit 0 of status word)\nfld1\nfldz\nfdiv ; st0 = +∞\n\n; Load zero for multiplication\nfldz\n\n; Multiply infinity by zero - this should be invalid\nfmul\n\nfstsw ax\nand rax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_infinity_ops.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test ∞ - ∞ = Invalid Operation (should set bit 0 of status word)\nfld1\nfldz\nfdiv ; st0 = +∞\n\n; Duplicate infinity on stack\nfld st0\n\n; Create -infinity by changing sign\nfchs\n\n; Now compute +∞ + (-∞) which should be invalid\nfadd\n\nfstsw ax\nand rax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_infinity_sub_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test ∞ - ∞ = Invalid Operation (should set bit 0 of status word)\n; Create +infinity by dividing 1.0 by 0.0\nfld1\nfldz\nfdiv\n\n; Create +infinity by dividing 1.0 by 0.0 \nfld1\nfldz\nfdiv\n\n; Subtract +∞ - ∞ - this should be invalid\nfsub\n\nfstsw ax\nand rax, 1\n\nhlt"
  },
  {
    "path": "unittests/ASM/X87/invalid_neg_infinity_sub_neg_infinity.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test (-∞) - (-∞) = Invalid Operation (should set bit 0 of status word)\nfld1\nfchs\nfldz\nfdiv ; st0 = -∞\n\n; Duplicate -infinity on stack\nfld st0\n\n; Subtract (-∞) - (-∞) - this should be invalid\nfsub\n\nfstsw ax\nand rax, 1\n\nhlt"
  },
  {
    "path": "unittests/ASM/X87/invalid_reduced_precision.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test Invalid Operation with reduced precision (64-bit)\n; Set precision control to 64-bit (PC = 10b)\nfnstcw [rel saved_cw]\nmov ax, [rel saved_cw]\nand ax, 0xFCFF\nor ax, 0x0200\nmov [rel new_cw], ax\nfldcw [rel new_cw]\n\n; Perform invalid operation: 0.0 / 0.0\nfldz\nfldz\nfdiv\n\nfstsw ax\nand rax, 1\n\n; Restore original control word\nfldcw [rel saved_cw]\n\nhlt\n\nalign 4096\nsaved_cw:  dw 0\nnew_cw:    dw 0\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_simple_test.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test with a simple 0/0 that we know works\nfldz\nfldz\nfdiv\n\nfstsw ax\nand rax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/invalid_sqrt_negative.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  }\n}\n%endif\n\n; Test sqrt(-1.0) = Invalid Operation (should set bit 0 of status word)\nfld1\nfchs\nfsqrt\n\nfstsw ax\nand rax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_fabs.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM1\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM2\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM3\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM4\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM5\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM6\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM7\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM8\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM9\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM10\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM11\":  [\"0x8111111111111111\", \"0x3fff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8111_1111_1111_1111\ndw 0x3fff\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_fadd.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM1\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM2\":  [\"0x8111110000000000\", \"0x3fff\"],\n    \"XMM3\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM4\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM5\":  [\"0x8111110000000000\", \"0x3fff\"],\n    \"XMM6\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM7\":  [\"0x8111111111111800\", \"0x3fff\"],\n    \"XMM8\":  [\"0x8111120000000000\", \"0x3fff\"],\n    \"XMM9\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM10\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM11\":  [\"0x8111110000000000\", \"0x3fff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8111_1111_1111_1111\ndw 0x3fff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_fcos.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x86b5441382debef5\", \"0x3ffe\"],\n    \"XMM1\":  [\"0x86b5441382debef5\", \"0x3ffe\"],\n    \"XMM2\":  [\"0x86b5441382debef5\", \"0x3ffe\"],\n    \"XMM3\":  [\"0x86b5441382debef4\", \"0x3ffe\"],\n    \"XMM4\":  [\"0x86b5441382debef4\", \"0x3ffe\"],\n    \"XMM5\":  [\"0x86b5441382debef4\", \"0x3ffe\"],\n    \"XMM6\":  [\"0x86b5441382debef5\", \"0x3ffe\"],\n    \"XMM7\":  [\"0x86b5441382debef5\", \"0x3ffe\"],\n    \"XMM8\":  [\"0x86b5441382debef5\", \"0x3ffe\"],\n    \"XMM9\":  [\"0x86b5441382debef4\", \"0x3ffe\"],\n    \"XMM10\":  [\"0x86b5441382debef4\", \"0x3ffe\"],\n    \"XMM11\":  [\"0x86b5441382debef4\", \"0x3ffe\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8222_2222_2222_2222\ndw 0x3fff\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_fdiv.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM1\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM2\":  [\"0x8111110000000000\", \"0x3fff\"],\n    \"XMM3\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM4\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM5\":  [\"0x8111110000000000\", \"0x3fff\"],\n    \"XMM6\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM7\":  [\"0x8111111111111800\", \"0x3fff\"],\n    \"XMM8\":  [\"0x8111120000000000\", \"0x3fff\"],\n    \"XMM9\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM10\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM11\":  [\"0x8111110000000000\", \"0x3fff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8111_1111_1111_1111\ndw 0x3fff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_fdivr.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM1\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM2\":  [\"0x8111110000000000\", \"0x3fff\"],\n    \"XMM3\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM4\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM5\":  [\"0x8111110000000000\", \"0x3fff\"],\n    \"XMM6\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM7\":  [\"0x8111111111111800\", \"0x3fff\"],\n    \"XMM8\":  [\"0x8111120000000000\", \"0x3fff\"],\n    \"XMM9\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM10\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM11\":  [\"0x8111110000000000\", \"0x3fff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8111_1111_1111_1111\ndw 0x3fff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_fmul.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM1\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM2\":  [\"0x8111110000000000\", \"0x3fff\"],\n    \"XMM3\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM4\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM5\":  [\"0x8111110000000000\", \"0x3fff\"],\n    \"XMM6\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM7\":  [\"0x8111111111111800\", \"0x3fff\"],\n    \"XMM8\":  [\"0x8111120000000000\", \"0x3fff\"],\n    \"XMM9\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM10\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM11\":  [\"0x8111110000000000\", \"0x3fff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8111_1111_1111_1111\ndw 0x3fff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_fprem.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM1\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM2\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM3\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM4\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM5\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM6\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM7\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM8\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM9\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM10\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM11\":  [\"0x8888888888888880\", \"0x3ff9\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8222_2222_2222_2222\ndw 0x3fff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_fprem1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM1\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM2\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM3\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM4\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM5\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM6\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM7\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM8\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM9\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM10\":  [\"0x8888888888888880\", \"0x3ff9\"],\n    \"XMM11\":  [\"0x8888888888888880\", \"0x3ff9\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8222_2222_2222_2222\ndw 0x3fff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_fscale.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8222222222222222\", \"0x4000\"],\n    \"XMM1\":  [\"0x8222222222222222\", \"0x4000\"],\n    \"XMM2\":  [\"0x8222222222222222\", \"0x4000\"],\n    \"XMM3\":  [\"0x8222222222222222\", \"0x4000\"],\n    \"XMM4\":  [\"0x8222222222222222\", \"0x4000\"],\n    \"XMM5\":  [\"0x8222222222222222\", \"0x4000\"],\n    \"XMM6\":  [\"0x8222222222222222\", \"0x4000\"],\n    \"XMM7\":  [\"0x8222222222222222\", \"0x4000\"],\n    \"XMM8\":  [\"0x8222222222222222\", \"0x4000\"],\n    \"XMM9\":  [\"0x8222222222222222\", \"0x4000\"],\n    \"XMM10\":  [\"0x8222222222222222\", \"0x4000\"],\n    \"XMM11\":  [\"0x8222222222222222\", \"0x4000\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8222_2222_2222_2222\ndw 0x3fff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_fsin.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xd9b11c39ec002fd9\", \"0x3ffe\"],\n    \"XMM1\":  [\"0xd9b11c39ec002fd9\", \"0x3ffe\"],\n    \"XMM2\":  [\"0xd9b11c39ec002fd9\", \"0x3ffe\"],\n    \"XMM3\":  [\"0xd9b11c39ec002fd8\", \"0x3ffe\"],\n    \"XMM4\":  [\"0xd9b11c39ec002fd8\", \"0x3ffe\"],\n    \"XMM5\":  [\"0xd9b11c39ec002fd8\", \"0x3ffe\"],\n    \"XMM6\":  [\"0xd9b11c39ec002fd9\", \"0x3ffe\"],\n    \"XMM7\":  [\"0xd9b11c39ec002fd9\", \"0x3ffe\"],\n    \"XMM8\":  [\"0xd9b11c39ec002fd9\", \"0x3ffe\"],\n    \"XMM9\":  [\"0xd9b11c39ec002fd8\", \"0x3ffe\"],\n    \"XMM10\":  [\"0xd9b11c39ec002fd8\", \"0x3ffe\"],\n    \"XMM11\":  [\"0xd9b11c39ec002fd8\", \"0x3ffe\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8222_2222_2222_2222\ndw 0x3fff\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_fsqrt.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8000000000000001\", \"0x3fff\"],\n    \"XMM1\":  [\"0x8000000000000800\", \"0x3fff\"],\n    \"XMM2\":  [\"0x8000010000000000\", \"0x3fff\"],\n    \"XMM3\":  [\"0x8000000000000000\", \"0x3fff\"],\n    \"XMM4\":  [\"0x8000000000000000\", \"0x3fff\"],\n    \"XMM5\":  [\"0x8000000000000000\", \"0x3fff\"],\n    \"XMM6\":  [\"0x8000000000000001\", \"0x3fff\"],\n    \"XMM7\":  [\"0x8000000000000800\", \"0x3fff\"],\n    \"XMM8\":  [\"0x8000010000000000\", \"0x3fff\"],\n    \"XMM9\":  [\"0x8000000000000000\", \"0x3fff\"],\n    \"XMM10\":  [\"0x8000000000000000\", \"0x3fff\"],\n    \"XMM11\":  [\"0x8000000000000000\", \"0x3fff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_80bit]\nfsqrt\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_64bit]\nfsqrt\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_32bit]\nfsqrt\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_80bit]\nfsqrt\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_64bit]\nfsqrt\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_32bit]\nfsqrt\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_80bit]\nfsqrt\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_64bit]\nfsqrt\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_32bit]\nfsqrt\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_80bit]\nfsqrt\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_64bit]\nfsqrt\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_32bit]\nfsqrt\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_80bit:\ndq 0x8000_0000_0000_0002\ndw 0x3fff\n\n.source_64bit:\ndq 0x8000_0000_0000_1000\ndw 0x3fff\n\n.source_32bit:\ndq 0x8000_0200_0000_0000\ndw 0x3fff\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_fsub.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM1\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM2\":  [\"0x8111110000000000\", \"0x3fff\"],\n    \"XMM3\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM4\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM5\":  [\"0x8111110000000000\", \"0x3fff\"],\n    \"XMM6\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM7\":  [\"0x8111111111111800\", \"0x3fff\"],\n    \"XMM8\":  [\"0x8111120000000000\", \"0x3fff\"],\n    \"XMM9\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM10\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM11\":  [\"0x8111110000000000\", \"0x3fff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8111_1111_1111_1111\ndw 0x3fff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_fsubr.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM1\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM2\":  [\"0x8111110000000000\", \"0xbfff\"],\n    \"XMM3\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM4\":  [\"0x8111111111111800\", \"0xbfff\"],\n    \"XMM5\":  [\"0x8111120000000000\", \"0xbfff\"],\n    \"XMM6\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM7\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM8\":  [\"0x8111110000000000\", \"0xbfff\"],\n    \"XMM9\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM10\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM11\":  [\"0x8111110000000000\", \"0xbfff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8111_1111_1111_1111\ndw 0x3fff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_ftan.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xced9f672ba44b549\", \"0x3fff\"],\n    \"XMM1\":  [\"0xced9f672ba44b549\", \"0x3fff\"],\n    \"XMM2\":  [\"0xced9f672ba44b549\", \"0x3fff\"],\n    \"XMM3\":  [\"0xced9f672ba44b549\", \"0x3fff\"],\n    \"XMM4\":  [\"0xced9f672ba44b549\", \"0x3fff\"],\n    \"XMM5\":  [\"0xced9f672ba44b549\", \"0x3fff\"],\n    \"XMM6\":  [\"0xced9f672ba44b54a\", \"0x3fff\"],\n    \"XMM7\":  [\"0xced9f672ba44b54a\", \"0x3fff\"],\n    \"XMM8\":  [\"0xced9f672ba44b54a\", \"0x3fff\"],\n    \"XMM9\":  [\"0xced9f672ba44b549\", \"0x3fff\"],\n    \"XMM10\":  [\"0xced9f672ba44b549\", \"0x3fff\"],\n    \"XMM11\":  [\"0xced9f672ba44b549\", \"0x3fff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8222_2222_2222_2222\ndw 0x3fff\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_fyl2x.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xc333333333333333\", \"0x4001\"],\n    \"XMM1\":  [\"0xc333333333333333\", \"0x4001\"],\n    \"XMM2\":  [\"0xc333333333333333\", \"0x4001\"],\n    \"XMM3\":  [\"0xc333333333333333\", \"0x4001\"],\n    \"XMM4\":  [\"0xc333333333333333\", \"0x4001\"],\n    \"XMM5\":  [\"0xc333333333333333\", \"0x4001\"],\n    \"XMM6\":  [\"0xc333333333333333\", \"0x4001\"],\n    \"XMM7\":  [\"0xc333333333333333\", \"0x4001\"],\n    \"XMM8\":  [\"0xc333333333333333\", \"0x4001\"],\n    \"XMM9\":  [\"0xc333333333333333\", \"0x4001\"],\n    \"XMM10\":  [\"0xc333333333333333\", \"0x4001\"],\n    \"XMM11\":  [\"0xc333333333333333\", \"0x4001\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n.source_1:\ndq 64\n\n; Positive\n.source_2:\ndq 0x8222_2222_2222_2222\ndw 0x3fff\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_fyl2xp1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xc3ed7db72edb35da\", \"0x4001\"],\n    \"XMM1\":  [\"0xc3ed7db72edb35da\", \"0x4001\"],\n    \"XMM2\":  [\"0xc3ed7db72edb35da\", \"0x4001\"],\n    \"XMM3\":  [\"0xc3ed7db72edb35da\", \"0x4001\"],\n    \"XMM4\":  [\"0xc3ed7db72edb35da\", \"0x4001\"],\n    \"XMM5\":  [\"0xc3ed7db72edb35da\", \"0x4001\"],\n    \"XMM6\":  [\"0xc3ed7db72edb35db\", \"0x4001\"],\n    \"XMM7\":  [\"0xc3ed7db72edb35db\", \"0x4001\"],\n    \"XMM8\":  [\"0xc3ed7db72edb35db\", \"0x4001\"],\n    \"XMM9\":  [\"0xc3ed7db72edb35da\", \"0x4001\"],\n    \"XMM10\":  [\"0xc3ed7db72edb35da\", \"0x4001\"],\n    \"XMM11\":  [\"0xc3ed7db72edb35da\", \"0x4001\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n.source_1:\ndq 64\n\n; Positive\n.source_2:\ndq 0x8222_2222_2222_2222\ndw 0x3fff\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_neg_fabs.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM1\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM2\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM3\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM4\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM5\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM6\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM7\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM8\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM9\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM10\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM11\":  [\"0x8111111111111111\", \"0x3fff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfabs\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8111_1111_1111_1111\ndw 0xbfff\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_neg_fadd.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM1\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM2\":  [\"0x8111110000000000\", \"0xbfff\"],\n    \"XMM3\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM4\":  [\"0x8111111111111800\", \"0xbfff\"],\n    \"XMM5\":  [\"0x8111120000000000\", \"0xbfff\"],\n    \"XMM6\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM7\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM8\":  [\"0x8111110000000000\", \"0xbfff\"],\n    \"XMM9\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM10\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM11\":  [\"0x8111110000000000\", \"0xbfff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfaddp\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Negative\n.source_1:\ndq 0x8111_1111_1111_1111\ndw 0xbfff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_neg_fcos.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x86b5441382debef5\", \"0x3ffe\"],\n    \"XMM1\":  [\"0x86b5441382debef5\", \"0x3ffe\"],\n    \"XMM2\":  [\"0x86b5441382debef5\", \"0x3ffe\"],\n    \"XMM3\":  [\"0x86b5441382debef4\", \"0x3ffe\"],\n    \"XMM4\":  [\"0x86b5441382debef4\", \"0x3ffe\"],\n    \"XMM5\":  [\"0x86b5441382debef4\", \"0x3ffe\"],\n    \"XMM6\":  [\"0x86b5441382debef5\", \"0x3ffe\"],\n    \"XMM7\":  [\"0x86b5441382debef5\", \"0x3ffe\"],\n    \"XMM8\":  [\"0x86b5441382debef5\", \"0x3ffe\"],\n    \"XMM9\":  [\"0x86b5441382debef4\", \"0x3ffe\"],\n    \"XMM10\":  [\"0x86b5441382debef4\", \"0x3ffe\"],\n    \"XMM11\":  [\"0x86b5441382debef4\", \"0x3ffe\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfcos\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8222_2222_2222_2222\ndw 0xbfff\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_neg_fdiv.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM1\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM2\":  [\"0x8111110000000000\", \"0xbfff\"],\n    \"XMM3\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM4\":  [\"0x8111111111111800\", \"0xbfff\"],\n    \"XMM5\":  [\"0x8111120000000000\", \"0xbfff\"],\n    \"XMM6\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM7\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM8\":  [\"0x8111110000000000\", \"0xbfff\"],\n    \"XMM9\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM10\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM11\":  [\"0x8111110000000000\", \"0xbfff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfld1\nfdivp\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Negative\n.source_1:\ndq 0x8111_1111_1111_1111\ndw 0xbfff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_neg_fdivr.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM1\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM2\":  [\"0x8111110000000000\", \"0xbfff\"],\n    \"XMM3\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM4\":  [\"0x8111111111111800\", \"0xbfff\"],\n    \"XMM5\":  [\"0x8111120000000000\", \"0xbfff\"],\n    \"XMM6\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM7\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM8\":  [\"0x8111110000000000\", \"0xbfff\"],\n    \"XMM9\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM10\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM11\":  [\"0x8111110000000000\", \"0xbfff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfdivrp\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Negative\n.source_1:\ndq 0x8111_1111_1111_1111\ndw 0xbfff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_neg_fmul.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM1\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM2\":  [\"0x8111110000000000\", \"0xbfff\"],\n    \"XMM3\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM4\":  [\"0x8111111111111800\", \"0xbfff\"],\n    \"XMM5\":  [\"0x8111120000000000\", \"0xbfff\"],\n    \"XMM6\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM7\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM8\":  [\"0x8111110000000000\", \"0xbfff\"],\n    \"XMM9\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM10\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM11\":  [\"0x8111110000000000\", \"0xbfff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfld1\nfmulp\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Negative\n.source_1:\ndq 0x8111_1111_1111_1111\ndw 0xbfff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_neg_fprem.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM1\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM2\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM3\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM4\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM5\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM6\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM7\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM8\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM9\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM10\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM11\":  [\"0x8888888888888880\", \"0xbff9\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfprem\nfxch\nfstp st0\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8222_2222_2222_2222\ndw 0xbfff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_neg_fprem1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM1\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM2\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM3\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM4\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM5\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM6\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM7\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM8\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM9\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM10\":  [\"0x8888888888888880\", \"0xbff9\"],\n    \"XMM11\":  [\"0x8888888888888880\", \"0xbff9\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfprem1\nfxch\nfstp st0\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8222_2222_2222_2222\ndw 0xbfff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_neg_fscale.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8222222222222222\", \"0xc000\"],\n    \"XMM1\":  [\"0x8222222222222222\", \"0xc000\"],\n    \"XMM2\":  [\"0x8222222222222222\", \"0xc000\"],\n    \"XMM3\":  [\"0x8222222222222222\", \"0xc000\"],\n    \"XMM4\":  [\"0x8222222222222222\", \"0xc000\"],\n    \"XMM5\":  [\"0x8222222222222222\", \"0xc000\"],\n    \"XMM6\":  [\"0x8222222222222222\", \"0xc000\"],\n    \"XMM7\":  [\"0x8222222222222222\", \"0xc000\"],\n    \"XMM8\":  [\"0x8222222222222222\", \"0xc000\"],\n    \"XMM9\":  [\"0x8222222222222222\", \"0xc000\"],\n    \"XMM10\":  [\"0x8222222222222222\", \"0xc000\"],\n    \"XMM11\":  [\"0x8222222222222222\", \"0xc000\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld1\nfld tword [rel .source_1]\nfscale\nfxch\nfstp st0\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Negative\n.source_1:\ndq 0x8222_2222_2222_2222\ndw 0xbfff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_neg_fsin.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xd9b11c39ec002fd9\", \"0xbffe\"],\n    \"XMM1\":  [\"0xd9b11c39ec002fd9\", \"0xbffe\"],\n    \"XMM2\":  [\"0xd9b11c39ec002fd9\", \"0xbffe\"],\n    \"XMM3\":  [\"0xd9b11c39ec002fd9\", \"0xbffe\"],\n    \"XMM4\":  [\"0xd9b11c39ec002fd9\", \"0xbffe\"],\n    \"XMM5\":  [\"0xd9b11c39ec002fd9\", \"0xbffe\"],\n    \"XMM6\":  [\"0xd9b11c39ec002fd8\", \"0xbffe\"],\n    \"XMM7\":  [\"0xd9b11c39ec002fd8\", \"0xbffe\"],\n    \"XMM8\":  [\"0xd9b11c39ec002fd8\", \"0xbffe\"],\n    \"XMM9\":  [\"0xd9b11c39ec002fd8\", \"0xbffe\"],\n    \"XMM10\":  [\"0xd9b11c39ec002fd8\", \"0xbffe\"],\n    \"XMM11\":  [\"0xd9b11c39ec002fd8\", \"0xbffe\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfsin\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8222_2222_2222_2222\ndw 0xbfff\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_neg_fsub.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM1\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM2\":  [\"0x8111110000000000\", \"0xbfff\"],\n    \"XMM3\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM4\":  [\"0x8111111111111800\", \"0xbfff\"],\n    \"XMM5\":  [\"0x8111120000000000\", \"0xbfff\"],\n    \"XMM6\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM7\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM8\":  [\"0x8111110000000000\", \"0xbfff\"],\n    \"XMM9\":  [\"0x8111111111111111\", \"0xbfff\"],\n    \"XMM10\":  [\"0x8111111111111000\", \"0xbfff\"],\n    \"XMM11\":  [\"0x8111110000000000\", \"0xbfff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubp\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Negative\n.source_1:\ndq 0x8111_1111_1111_1111\ndw 0xbfff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_neg_fsubr.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM1\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM2\":  [\"0x8111110000000000\", \"0x3fff\"],\n    \"XMM3\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM4\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM5\":  [\"0x8111110000000000\", \"0x3fff\"],\n    \"XMM6\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM7\":  [\"0x8111111111111800\", \"0x3fff\"],\n    \"XMM8\":  [\"0x8111120000000000\", \"0x3fff\"],\n    \"XMM9\":  [\"0x8111111111111111\", \"0x3fff\"],\n    \"XMM10\":  [\"0x8111111111111000\", \"0x3fff\"],\n    \"XMM11\":  [\"0x8111110000000000\", \"0x3fff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfld tword [rel .source_zero]\nfsubrp\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Negative\n.source_1:\ndq 0x8111_1111_1111_1111\ndw 0xbfff\n\n.source_zero:\ndq 0x0\ndq 0x0\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_neg_ftan.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xced9f672ba44b549\", \"0xbfff\"],\n    \"XMM1\":  [\"0xced9f672ba44b549\", \"0xbfff\"],\n    \"XMM2\":  [\"0xced9f672ba44b549\", \"0xbfff\"],\n    \"XMM3\":  [\"0xced9f672ba44b54a\", \"0xbfff\"],\n    \"XMM4\":  [\"0xced9f672ba44b54a\", \"0xbfff\"],\n    \"XMM5\":  [\"0xced9f672ba44b54a\", \"0xbfff\"],\n    \"XMM6\":  [\"0xced9f672ba44b549\", \"0xbfff\"],\n    \"XMM7\":  [\"0xced9f672ba44b549\", \"0xbfff\"],\n    \"XMM8\":  [\"0xced9f672ba44b549\", \"0xbfff\"],\n    \"XMM9\":  [\"0xced9f672ba44b549\", \"0xbfff\"],\n    \"XMM10\":  [\"0xced9f672ba44b549\", \"0xbfff\"],\n    \"XMM11\":  [\"0xced9f672ba44b549\", \"0xbfff\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_1]\nfptan\nfstp st0\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n; Positive\n.source_1:\ndq 0x8222_2222_2222_2222\ndw 0xbfff\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_neg_fyl2x.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xc333333333333333\", \"0xc001\"],\n    \"XMM1\":  [\"0xc333333333333333\", \"0xc001\"],\n    \"XMM2\":  [\"0xc333333333333333\", \"0xc001\"],\n    \"XMM3\":  [\"0xc333333333333333\", \"0xc001\"],\n    \"XMM4\":  [\"0xc333333333333333\", \"0xc001\"],\n    \"XMM5\":  [\"0xc333333333333333\", \"0xc001\"],\n    \"XMM6\":  [\"0xc333333333333333\", \"0xc001\"],\n    \"XMM7\":  [\"0xc333333333333333\", \"0xc001\"],\n    \"XMM8\":  [\"0xc333333333333333\", \"0xc001\"],\n    \"XMM9\":  [\"0xc333333333333333\", \"0xc001\"],\n    \"XMM10\":  [\"0xc333333333333333\", \"0xc001\"],\n    \"XMM11\":  [\"0xc333333333333333\", \"0xc001\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2x\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n.source_1:\ndq 64\n\n; Negative\n.source_2:\ndq 0x8222_2222_2222_2222\ndw 0xbfff\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n\n"
  },
  {
    "path": "unittests/ASM/X87/precision_test_neg_fyl2xp1.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0xc3ed7db72edb35da\", \"0xc001\"],\n    \"XMM1\":  [\"0xc3ed7db72edb35da\", \"0xc001\"],\n    \"XMM2\":  [\"0xc3ed7db72edb35da\", \"0xc001\"],\n    \"XMM3\":  [\"0xc3ed7db72edb35db\", \"0xc001\"],\n    \"XMM4\":  [\"0xc3ed7db72edb35db\", \"0xc001\"],\n    \"XMM5\":  [\"0xc3ed7db72edb35db\", \"0xc001\"],\n    \"XMM6\":  [\"0xc3ed7db72edb35da\", \"0xc001\"],\n    \"XMM7\":  [\"0xc3ed7db72edb35da\", \"0xc001\"],\n    \"XMM8\":  [\"0xc3ed7db72edb35da\", \"0xc001\"],\n    \"XMM9\":  [\"0xc3ed7db72edb35da\", \"0xc001\"],\n    \"XMM10\":  [\"0xc3ed7db72edb35da\", \"0xc001\"],\n    \"XMM11\":  [\"0xc3ed7db72edb35da\", \"0xc001\"]\n  }\n}\n%endif\n\n%include \"x87cw.mac\"\n\nmov rsp, 0xe000_1000\n\nfinit ; enters x87 state\n\n; 80-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_80, x87_round_nearest\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_1]\n\n; 64-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_64, x87_round_nearest\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_2]\n\n; 32-bit mode, round-nearest\nset_cw_precision_rounding x87_prec_32, x87_round_nearest\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_3]\n\n; 80-bit mode, round-down\nset_cw_precision_rounding x87_prec_80, x87_round_down\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_4]\n\n; 64-bit mode, round-down\nset_cw_precision_rounding x87_prec_64, x87_round_down\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_5]\n\n; 32-bit mode, round-down\nset_cw_precision_rounding x87_prec_32, x87_round_down\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_6]\n\n; 80-bit mode, round-up\nset_cw_precision_rounding x87_prec_80, x87_round_up\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_7]\n\n; 64-bit mode, round-up\nset_cw_precision_rounding x87_prec_64, x87_round_up\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_8]\n\n; 32-bit mode, round-up\nset_cw_precision_rounding x87_prec_32, x87_round_up\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_9]\n\n; 80-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_80, x87_round_towards_zero\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_10]\n\n; 64-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_64, x87_round_towards_zero\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_11]\n\n; 32-bit mode, round-towards_zero\nset_cw_precision_rounding x87_prec_32, x87_round_towards_zero\nfld tword [rel .source_2]\nfild qword [rel .source_1]\nfyl2xp1\nfstp tword [rel .result_12]\n\n; Fetch results\nmovups xmm0, [rel .result_1]\nmovups xmm1, [rel .result_2]\nmovups xmm2, [rel .result_3]\nmovups xmm3, [rel .result_4]\nmovups xmm4, [rel .result_5]\nmovups xmm5, [rel .result_6]\nmovups xmm6, [rel .result_7]\nmovups xmm7, [rel .result_8]\nmovups xmm8, [rel .result_9]\nmovups xmm9, [rel .result_10]\nmovups xmm10, [rel .result_11]\nmovups xmm11, [rel .result_12]\n\nhlt\n\nalign 4096\n.source_1:\ndq 64\n\n; Negative\n.source_2:\ndq 0x8222_2222_2222_2222\ndw 0xbfff\n\n.result_1:\ndq 0\ndq 0\n\n.result_2:\ndq 0\ndq 0\n\n.result_3:\ndq 0\ndq 0\n\n.result_4:\ndq 0\ndq 0\n\n.result_5:\ndq 0\ndq 0\n\n.result_6:\ndq 0\ndq 0\n\n.result_7:\ndq 0\ndq 0\n\n.result_8:\ndq 0\ndq 0\n\n.result_9:\ndq 0\ndq 0\n\n.result_10:\ndq 0\ndq 0\n\n.result_11:\ndq 0\ndq 0\n\n.result_12:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/ASM/X87/valid_fist_16bit.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\",\n    \"RBX\": \"12346\"\n  }\n}\n%endif\n\n; Test FIST with valid 16-bit conversion\n; Load a value that fits in int16 range\n\nfinit\nfld qword [rel .value]\n\n; Convert to int16 - this should work without overflow\nfistp word [rel .result]\n\nfstsw ax\nand rax, 1\n\n; Load the result to verify conversion worked\nmovzx rbx, word [rel .result]\n\nhlt\n\nalign 4096\n.value: dq 12345.75\n.result: dw 0\n"
  },
  {
    "path": "unittests/ASM/X87/valid_operation.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0\"\n  }\n}\n%endif\n\n; Test valid operation should NOT set Invalid Operation bit\n; Clear any existing exception flags first\nfinit\n\n; Perform valid operations\nfld1\nfld1\nfadd\n\nfld1\nfdiv\n\nfld1\nfsqrt\n\nfstsw ax\nand rax, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D8_00_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x4008000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfadd dword [rdx + 8 * 1]\n\nfst qword [rdx + 8 * 2]\nmov rax, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D8_01_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x4000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfmul dword [rdx + 8 * 1]\n\nfst qword [rdx + 8 * 2]\nmov rax, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D8_04_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0xbff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfsub dword [rdx + 8 * 1]\n\nfst qword [rdx + 8 * 2]\nmov rax, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D8_05_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfsubr dword [rdx + 8 * 1]\n\nfst qword [rdx + 8 * 2]\nmov rax, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D8_06_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3fe0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfdiv dword [rdx + 8 * 1]\n\nfst qword [rdx + 8 * 2]\nmov rax, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D8_07_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfdivr dword [rdx + 8 * 1]\n\nfst qword [rdx + 8 * 2]\nmov rax, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D8_C0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4008000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfld qword [rdx + 8 * 1]\n\n; fadd st(0), st(i)\nfadd st0, st1\n\nfst qword [rdx + 8 * 2]\nmov rax, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D8_C8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x4010000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 0], rax\n\nfld qword [rdx + 8 * 0]\nfmul st0, st0\n\nfst qword [rdx + 8 * 2]\nmov rax, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D8_D9_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3ff0000000000000\",\n    \"RBX\":  \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n\nmov rdx, 0xe0000000\n\n; Only tests pop behaviour\nfld1\nfldz\nfcomp\nfld1\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D8_E0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xbff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfld qword [rdx + 8 * 1]\nfsub st0, st1\n\nfst qword [rdx]\nmov rax, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D8_E8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfld qword [rdx + 8 * 1]\nfsubr st0, st1\n\nfst qword [rdx]\nmov rax, [rdx]\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D8_F0_2_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n; Tests that a division by zero does not set the IE flag\nfinit\nfldz\nfld1\nfdiv st0, st1\n\nfnstsw ax\nand rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D8_F0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 0], rax\n\nfld qword [rdx + 8 * 0]\nfdiv st0, st0\n\nfst qword [rdx]\nmov rax, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D8_F8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3fe0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x4010000000000000 ; 4.0\nmov [rdx + 8 * 1], rax\n\nfld qword [rdx + 8 * 0]\nfld qword [rdx + 8 * 1]\n\nfdivr st0, st1\n\nfst qword [rdx]\nmov rax, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_00_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3f800000\"\n  },\n  \"X86ReducedPrecision\": \"1\"\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld dword [rdx + 8 * 0]\nfst dword [rdx]\n\nxor eax, eax\nmov eax, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_02_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3F800000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\nmov eax, 0x0\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\nfst dword [rdx + 8 * 1]\n\nmov eax, [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_03_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3F800000\",\n    \"RBX\": \"0x40000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\nmov eax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], eax\nmov eax, 0x0 ; 1.0\nmov [rdx + 8 * 2], eax\n\nfld dword [rdx + 8 * 0]\nfstp dword [rdx + 8 * 2]\nfld dword [rdx + 8 * 1]\n\nmov eax, [rdx + 8 * 2]\nfst dword [rdx + 8 * 2]\nmov ebx, [rdx + 8 * 2]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_05_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n; Just to ensure execution\nfldcw [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_06_2_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4000000000000000\",\n    \"RBX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\nmov eax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], eax\nmov eax, 0x40800000 ; 4.0\nmov [rdx + 8 * 2], eax\n\nfld dword [rdx + 8 * 0]\no32 fstenv [rdx + 8 * 3]\nfld dword [rdx + 8 * 2]\no32 fldenv [rdx + 8 * 3]\n\n; This will overwrite the previous load\n; This is since the control word is stored and reloaded\nfld dword [rdx + 8 * 1]\n\n; 14 bytes for 16bit\n; 2 Bytes : FCW\n; 2 Bytes : FSW\n; 2 bytes : FTW\n; 2 bytes : Instruction offset\n; 2 bytes : Instruction CS selector\n; 2 bytes : Data offset\n; 2 bytes : Data selector\n\n; 28 bytes for 32bit\n; 4 bytes : FCW\n; 4 bytes : FSW\n; 4 bytes : FTW\n; 4 bytes : Instruction pointer\n; 2 bytes : instruction pointer selector\n; 2 bytes : Opcode\n; 4 bytes : data pointer offset\n; 4 bytes : data pointer selector\n\nfstp qword [rdx + 8]\nmov rax, [rdx + 8]\nfst qword [rdx + 8]\nmov rbx, [rdx + 8]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_06_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4000000000000000\",\n    \"RBX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\nmov eax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], eax\nmov eax, 0x40800000 ; 4.0\nmov [rdx + 8 * 2], eax\n\nfld dword [rdx + 8 * 0]\no16 fstenv [rdx + 8 * 3]\nfld dword [rdx + 8 * 2]\no16 fldenv [rdx + 8 * 3]\n\n; This will overwrite the previous load\n; This is since the control word is stored and reloaded\nfld dword [rdx + 8 * 1]\n\n; 14 bytes for 16bit\n; 2 Bytes : FCW\n; 2 Bytes : FSW\n; 2 bytes : FTW\n; 2 bytes : Instruction offset\n; 2 bytes : Instruction CS selector\n; 2 bytes : Data offset\n; 2 bytes : Data selector\n\n; 28 bytes for 32bit\n; 4 bytes : FCW\n; 4 bytes : FSW\n; 4 bytes : FTW\n; 4 bytes : Instruction pointer\n; 2 bytes : instruction pointer selector\n; 2 bytes : Opcode\n; 4 bytes : data pointer offset\n; 4 bytes : data pointer selector\n\nfstp qword [rdx + 8]\nmov rax, [rdx + 8]\nfst qword [rdx + 8]\nmov rbx, [rdx + 8]\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_07_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x37F\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\nfnstcw [rdx]\nmov eax, 0\nmov ax, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_C0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x4000000000000000\",\n    \"RBX\":  \"0x4000000000000000\",\n    \"RCX\":  \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfld st0\n\n; dump stack to registers\nmov rdx, 0xe0000000\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\nfstp qword [rdx]\nmov rcx, [rdx]\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_C8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3ff0000000000000\",\n    \"RBX\":  \"0x4000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\nmov eax, 0x40000000 ; 2.0\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\nfld dword [rdx + 8 * 1]\n\nfxch\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_D0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n; Just to ensure execution\nfnop\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_E0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3ff0000000000000\",\n    \"RBX\":  \"0xc000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\nfchs\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfchs\n\nfstp qword [rcx]\nmov rax, [rcx]\n\nfst qword [rcx]\nmov rbx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt -1.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_E1_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3ff0000000000000\",\n    \"RBX\":  \"0x4000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\nfabs\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfabs\n\nfstp qword [rcx]\nmov rax, [rcx]\n\nfst qword [rcx]\nmov rbx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt -1.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_E4_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x100\",\n    \"RBX\": \"0x0\",\n    \"RCX\": \"0x4000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nfld dword [rel positive]\nftst\nfnstsw ax\nand rax, 0x4700\nmov rbx, rax\n\nfldz\nftst\nfnstsw ax\nand rax, 0x4700\nmov rcx, rax\n\nfld dword [rel negative]\nftst\nfnstsw ax\nand rax, 0x4700\n\nhlt\n\nalign 8\npositive: dd 3.14159\nnegative: dd -2.71828"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_E8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nfld1\n\nfst qword [rcx]\nmov rax, [rcx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_E9_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x40549a78\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nfldl2t\n\nfst dword [rcx] ; Can't compare 64-bit precision with host\nmov eax, [rcx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_EA_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3fb8aa3b\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nfldl2e\n\nfst dword [rcx] ; Can't compare 64-bit precision with host\nmov eax, [rcx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_EB_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x40490fdb\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nfldpi\n\nfst dword [rcx] ; Can't compare 64-bit precision with host\nmov eax, [rcx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_EC_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3e9a209b\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nfldlg2\n\nfst dword [rcx] ; Can't compare 64-bit precision with host\nmov eax, [rcx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_ED_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3f317218\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nfldln2\n\nfst dword [rcx] ; Can't compare 64-bit precision with host\nmov eax, [rcx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_EE_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": [\"0\"]\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nfldz\n\nfst qword [rcx]\nmov rax, [rcx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_F0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x0\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rbx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\nf2xm1\n\nfst qword [rbx]\nmov rax, [rbx]\n\nhlt\n\nalign 8\ndata:\n  dt 0.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_F1_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3ff0000000000000\",\n    \"RBX\":  \"0x4020000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfyl2x\nfld1\n\nfstp qword [rcx]\nmov rax, [rcx]\nfst qword [rcx]\nmov rbx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dt 16.0\n  dq 0\n\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_F2_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"1\",\n    \"RBX\":  \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n%include \"checkprecision.mac\"\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfptan\n\n; ST(0) = 1.0, ST(1) = tan(1.0)\nfstp qword [rcx]\nmov rbx, [rcx]\n\nfstp qword [rcx]\ncheck_relerr_d rel expected_tan, rcx, rel tolerance\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\nexpected_tan:\n  dq 0x3ff8eb245cbee3a5 ; tan(1.0)\ntolerance:\n  dq 0x3cb0000000000000 ; 2^-52, ~1 ULP relative error\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_F3_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3ff0000000000000\",\n    \"RBX\":  \"0x3ff921fb54442d18\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfpatan\nfld1\n\nfstp qword [rcx]\nmov rax, [rcx]\n\nfstp qword [rcx]\nmov rbx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dt 7.0\n  dq 0\ndata2:\n  dt 0.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_F4_02_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  [\"0xFFF0000000000000\"],\n    \"RBX\":  [\"0x0000000000000000\"],\n    \"RCX\":  [\"0xFFF0000000000000\"],\n    \"RDX\":  [\"0x8000000000000000\"]\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  }\n}\n%endif\n\n; Instead of checking MMX registers, \n; move results to general purpose registers and check them there\n; so that hostrunner tests work properly.\n\nfinit\nfldz\nfxtract\nfstp qword [rel sigz]\nfstp qword [rel expz]\n\nlea rdx, [rel nzer]\nfld qword [rdx]\nfxtract\nfstp qword [rel signz]\nfstp qword [rel expnz]\n\nmov rax, [rel expz]\nmov rbx, [rel sigz]\nmov rcx, [rel expnz]\nmov rdx, [rel signz]\n\nhlt\n\n\nalign 4096\nnzer: dq -0.0\nexpz: dq 0\nsigz: dq 0\nexpnz: dq 0\nsignz: dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_F4_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0xbffe000000000000\",\n    \"RBX\":  \"0x4008000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfxtract\n\nfstp qword [rcx]\nmov rax, [rcx]\nfst qword [rcx]\nmov rbx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dt -15.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_F5_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0xbf666666\",\n    \"RBX\":  \"0x40400000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfprem1\n\n; Store as single precision to get around precision issues\n\nfstp dword [rcx]\nmov eax, [rcx]\n\nfst dword [rcx]\nmov ebx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dt 3.0\n  dq 0\ndata2:\n  dt 5.1\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_F6_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"7\",\n    \"RBX\":  \"0\",\n    \"MM0\":  \"0x3ff0000000000000\",\n    \"MM1\":  \"0x4070000000000000\",\n    \"MM2\":  \"0x4060000000000000\",\n    \"MM3\":  \"0x4050000000000000\",\n    \"MM4\":  \"0x4040000000000000\",\n    \"MM5\":  \"0x4030000000000000\",\n    \"MM6\":  \"0x4020000000000000\",\n    \"MM7\":  \"0x4000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n; Set the stack with different values.\n; Then do fincstp and store the stack values into MMX registers through memory\n; such that MM0 has the value of ST0 and so on.\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4020000000000000 ; 4.0\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4030000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4040000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4050000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4060000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4070000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\n; Store top in RBX\nxor rax, rax\nxor rbx, rbx\nfnstsw ax\nshr ax, 11\nand ax, 7\nmov bx, ax\n\n; Move the value of stop\n; ST0 is currently 0x4070000000000000\nfdecstp\n\n; Store top in RAX\nxor rax, rax\nfnstsw ax\nshr ax, 11\nand ax, 7\n\n; Now ST0 is 0x3ff0000000000000\nfstp qword [rel stack + 8 * 0]\nfstp qword [rel stack + 8 * 1]\nfstp qword [rel stack + 8 * 2]\nfstp qword [rel stack + 8 * 3]\nfstp qword [rel stack + 8 * 4]\nfstp qword [rel stack + 8 * 5]\nfstp qword [rel stack + 8 * 6]\nfstp qword [rel stack + 8 * 7]\n\nmovq mm0, [rel stack + 8 * 0]\nmovq mm1, [rel stack + 8 * 1]\nmovq mm2, [rel stack + 8 * 2]\nmovq mm3, [rel stack + 8 * 3]\nmovq mm4, [rel stack + 8 * 4]\nmovq mm5, [rel stack + 8 * 5]\nmovq mm6, [rel stack + 8 * 6]\nmovq mm7, [rel stack + 8 * 7]\n\nhlt\n\nalign 4096\ntemp: dq 0\nstack: times 8 dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_F7_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"1\",\n    \"RBX\":  \"0\",\n    \"MM0\":  \"0x4060000000000000\",\n    \"MM1\":  \"0x4050000000000000\",\n    \"MM2\":  \"0x4040000000000000\",\n    \"MM3\":  \"0x4030000000000000\",\n    \"MM4\":  \"0x4020000000000000\",\n    \"MM5\":  \"0x4000000000000000\",\n    \"MM6\":  \"0x3ff0000000000000\",\n    \"MM7\":  \"0x4070000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n; Set the stack with different values.\n; Then do fincstp and store the stack values into MMX registers through memory\n; such that MM0 has the value of ST0 and so on.\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4020000000000000 ; 4.0\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4030000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4040000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4050000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4060000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\nmov rax, 0x4070000000000000\nmov [rel temp], rax\nfld qword [rel temp]\n\n; Store top in RBX\nxor rax, rax\nfnstsw ax\nshr ax, 11\nand ax, 7\nmov bx, ax\n\n; Move the value of stop\n; ST0 is currently 0x4070000000000000\nfincstp\n\n; Store top in RAX\nxor rax, rax\nfnstsw ax\nshr ax, 11\nand ax, 7\n\n; Now ST0 is 0x4060000000000000\nfstp qword [rel stack + 8 * 0]\nfstp qword [rel stack + 8 * 1]\nfstp qword [rel stack + 8 * 2]\nfstp qword [rel stack + 8 * 3]\nfstp qword [rel stack + 8 * 4]\nfstp qword [rel stack + 8 * 5]\nfstp qword [rel stack + 8 * 6]\nfstp qword [rel stack + 8 * 7]\n\nmovq mm0, [rel stack + 8 * 0]\nmovq mm1, [rel stack + 8 * 1]\nmovq mm2, [rel stack + 8 * 2]\nmovq mm3, [rel stack + 8 * 3]\nmovq mm4, [rel stack + 8 * 4]\nmovq mm5, [rel stack + 8 * 5]\nmovq mm6, [rel stack + 8 * 6]\nmovq mm7, [rel stack + 8 * 7]\n\nhlt\n\nalign 4096\ntemp: dq 0\nstack: times 8 dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_F8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x40066666\",\n    \"RBX\": \"0x40400000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfprem\n\nfstp dword [rdx + 8]\nmov eax, [rdx + 8]\nfst dword [rdx + 8]\nmov ebx, [rdx + 8]\n\nhlt\n\nalign 4096\ndata:\n  dt 3.0\n  dq 0\ndata2:\n  dt 5.1\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_F9_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3f800000\",\n    \"RBX\": \"0x41be320c\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfyl2xp1\nfld1\n\nmov rcx, 0xe0000000\nfstp dword [rcx]\nmov eax, [rcx]\nfstp dword [rcx]\nmov ebx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dt 15.0\n  dq 0\n\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_FA_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x4010000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rbx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfsqrt\n\nfst qword [rbx]\nmov rax, [rbx]\n\nhlt\n\nalign 8\ndata:\n  dt 16.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_FB_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"1\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n%include \"checkprecision.mac\"\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfsincos\n\n; st0 = cos, st1 = sin\nfstp qword [rcx]\ncheck_relerr_d rel expected_cos, rcx, rel tolerance\nmov r8, rax\n\nfstp qword [rcx]\ncheck_relerr_d rel expected_sin, rcx, rel tolerance\nand rax, r8\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\nexpected_cos:\n  dq 0x3fe14a280fb5068c ; cos(1.0)\nexpected_sin:\n  dq 0x3feaed548f090cee ; sin(1.0)\ntolerance:\n  dq 0x3cb0000000000000 ; 2^-52, ~1 ULP relative error\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_FC_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f834241 ; 1.02546\nmov [rdx + 8 * 0], eax\n\nfld dword [rdx + 8 * 0]\n\nfrndint\n\nfst qword [rdx]\nmov rax, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_FD_2_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3ff0000000000000\",\n    \"RBX\": \"0xc01a000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfscale\n\nmov rcx, 0xe0000000\nfstp qword [rcx]\nmov rax, [rcx]\nfstp qword [rcx]\nmov rbx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dt 64.0\n  dq 0\n\ndata2:\n  dt -6.5\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_FD_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x43000000\",\n    \"RBX\":  \"0x40b00000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfscale\n\n; Store as single precision to get around precision issues\n\nfstp dword [rcx]\nmov eax, [rcx]\n\nfst dword [rcx]\nmov ebx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dt 4.0\n  dq 0\n\ndata2:\n  dt 5.5\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_FE_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"1\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n%include \"checkprecision.mac\"\n\nmov rbx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfsin\n\nfst qword [rbx]\n\ncheck_relerr_d rel expected, rbx, rel tolerance\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\nexpected:\n  dq 0x3feaed548f090cee ; sin(1.0)\ntolerance:\n  dq 0x3cb0000000000000 ; 2^-52, ~1 ULP relative error\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/X87_F64/D9_FF_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0xbfdaa22657537205\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rbx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nfcos\n\nfst qword [rbx]\nmov rax, [rbx]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DA_01_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\":  \"0x4000000000000000\",\n    \"RSI\":  \"0xC000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, 2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfimul dword [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rcx, [rdx]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, -2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfimul dword [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rsi, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DA_02_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RSI\":  \"0x18\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\nmov rsi, 0\n\n; Matching positive-positive\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, 1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp dword [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\n; Matching negative-negative\nmov rax, 0xbff0000000000000 ; -1.0\nmov [rdx + 8 * 0], rax\nmov eax, -1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp dword [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\n; Nonmatching negative-positive\nmov rax, 0xbff0000000000000 ; -1.0\nmov [rdx + 8 * 0], rax\nmov eax, 1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp dword [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\n; Nonmatching positive-negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, -1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp dword [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DA_04_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\":  \"0xbff0000000000000\",\n    \"RSI\":  \"0x4008000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, 2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfisub dword [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rcx, [rdx]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, -2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfisub dword [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rsi, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DA_05_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\":  \"0x3ff0000000000000\",\n    \"RSI\":  \"0xc008000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, 2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfisubr dword [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rcx, [rdx]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, -2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfisubr dword [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rsi, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DA_06_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\":  \"0x3fe0000000000000\",\n    \"RSI\":  \"0xbfe0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, 2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfidiv dword [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rcx, [rdx]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, -2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfidiv dword [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rsi, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DA_07_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\":  \"0x4000000000000000\",\n    \"RSI\":  \"0xc000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, 2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfidivr dword [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rcx, [rdx]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov eax, -2\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nfidivr dword [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rsi, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DA_C0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3ff0000000000000\",\n    \"RBX\": \"0x0000000000000000\",\n    \"RCX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 2\ncmp eax, 1\n\nfcmovb st0, st1\n\nfldz\ncmp eax, 3\nfcmovb st0, st2\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\nfstp qword [rdx]\nmov rcx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DA_C8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000000000000\",\n    \"RBX\": \"0x3ff0000000000000\",\n    \"RCX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 1\ncmp eax, 1\n\nfcmove st0, st1\n\nfldz\ncmp eax, 0\nfcmove st0, st2\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\nfstp qword [rdx]\nmov rcx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DA_D0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000000000000\",\n    \"RBX\": \"0x3ff0000000000000\",\n    \"RCX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 2\ncmp eax, 2\n\nfcmovbe st0, st1\n\nfldz\ncmp eax, 0\nfcmovbe st0, st2\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\nfstp qword [rdx]\nmov rcx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DA_D8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3ff0000000000000\",\n    \"RBX\": \"0x0000000000000000\",\n    \"RCX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 0x0\ncmp eax, -1\n\nfcmovu st0, st1\n\nfldz\ncmp eax, 1\nfcmovu st0, st2\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\nfstp qword [rdx]\nmov rcx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DA_D9_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3ff0000000000000\",\n    \"RBX\":  \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; Only tests pop behaviour\nfld1\nfldz\nfldz\nfcompp\nfld1\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DA_E9_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3ff0000000000000\",\n    \"RBX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n; Only tests pop behaviour\nfld1\nfldz\nfldz\nfucompp\nfld1\n\nmov rdx, 0xe0000000\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DB_00_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4090000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 1024\nmov [rdx + 8 * 0], eax\n\nfild dword [rdx + 8 * 0]\n\nfstp qword [rdx]\nmov rax, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DB_01_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"RBX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x44800000 ; 1024.0\nmov [rdx + 8 * 0], eax\nmov eax, 0\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\n\nfisttp dword [rdx + 8 * 1]\n\nfld1\n\nmov eax, [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rbx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DB_02_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"RBX\": \"0x3ff0000000000000\", \n    \"RCX\": \"0x4090000000000000\"\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x44800000 ; 1024.0\nmov [rdx + 8 * 0], eax\nmov eax, 0\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\n\nfist dword [rdx + 8 * 1]\n\nfld1\n\nmov eax, [rdx + 8 * 1]\n\nfstp qword [rdx]\nmov rbx, [rdx]\n\nfst qword [rdx]\nmov rcx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DB_03_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"RBX\": [\"0x3ff0000000000000\"]\n  }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x44800000 ; 1024.0\nmov [rdx + 8 * 0], eax\nmov eax, 0\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\n\nfistp dword [rdx + 8 * 1]\n\nfld1\n\nmov eax, [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rbx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DB_05_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\n\nfld tword [rdx + 8 * 0]\n\nmov rdx, 0xe0000000\nfstp qword [rdx]\nmov rax, [rdx]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DB_07_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfstp tword [rdx + 8 * 0]\nfld tword [rdx + 8 * 0]\n\nmov rdx, 0xe0000000\nfstp qword [rdx]\nmov rax, [rdx]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 0.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DB_C0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000000000000\",\n    \"RBX\": \"0x3ff0000000000000\",\n    \"RCX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 2\ncmp eax, 1\n\nfcmovnb st0, st1\n\nfldz\ncmp eax, 3\nfcmovnb st0, st2\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\nfstp qword [rdx]\nmov rcx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DB_C8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3ff0000000000000\",\n    \"RBX\": \"0x0000000000000000\",\n    \"RCX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 1\ncmp eax, 1\n\nfcmovne st0, st1\n\nfldz\ncmp eax, 0\nfcmovne st0, st2\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\nfstp qword [rdx]\nmov rcx, [rdx]\n\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DB_D0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3ff0000000000000\",\n    \"RBX\": \"0x0000000000000000\",\n    \"RCX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 2\ncmp eax, 2\n\nfcmovnbe st0, st1\n\nfldz\ncmp eax, 0\nfcmovnbe st0, st2\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\nfstp qword [rdx]\nmov rcx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DB_D8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x0000000000000000\",\n    \"RBX\": \"0x3ff0000000000000\",\n    \"RCX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nfld1\nfldz\n\nmov eax, 0x0\ncmp eax, -1\n\nfcmovnu st0, st1\n\nfldz\ncmp eax, 1\nfcmovnu st0, st2\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\nfstp qword [rdx]\nmov rcx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DB_E3.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x037F\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nfninit\n\n; Ensures that fnstcw after fninit sets the correct value\nfnstcw [rel control]\nmov ax, word [rel control]\n\nhlt\n\nalign 4096\ncontrol:\ntimes 2 db 0 ; Reserve space for the FPU control word\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DC_00_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4008000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfadd qword [rdx + 8 * 0]\n\nmov rdx, 0xe0000000\nfstp qword [rdx]\nmov rax, [rdx]\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dq 2.0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DC_01_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfmul qword [rdx + 8 * 0]\n\nmov rdx, 0xe0000000\nfstp qword [rdx]\nmov rax, [rdx]\n\nhlt\n\nalign 4096\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dq 2.0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DC_04_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xbff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfsub qword [rdx + 8 * 0]\n\nmov rdx, 0xe0000000\nfstp qword [rdx]\nmov rax, [rdx]\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dq 2.0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DC_05_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfsubr qword [rdx + 8 * 0]\n\nmov rdx, 0xe0000000\nfstp qword [rdx]\nmov rax, [rdx]\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dq 2.0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DC_06_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3fe0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfdiv qword [rdx + 8 * 0]\n\nmov rdx, 0xe0000000\nfstp qword [rdx]\nmov rax, [rdx]\n\nhlt\n\nalign 8\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dq 2.0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DC_07_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x4010000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rbx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfdivr qword [rdx + 8 * 0]\n\nfst qword [rbx]\nmov rax, [rbx]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dq 8.0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DC_C0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4010000000000000\",\n    \"RBX\": \"0x4000000000000000\",\n    \"RCX\": \"0x4014000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 1], rax\nmov rax, 0x4010000000000000 ; 4.0\nmov [rdx + 8 * 2], rax\n\nfld qword [rdx + 8 * 0]\nfld qword [rdx + 8 * 1]\nfld qword [rdx + 8 * 2]\n\n; fadd st(i), st(0)\nfadd st2, st0\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\nfstp qword [rdx]\nmov rcx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DC_C8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4010000000000000\",\n    \"RBX\": \"0x4020000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfmul st1, st0\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DC_E0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4000000000000000\",\n    \"RBX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfsubr st1, st0\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\n\nhlt\n\nalign 4096\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DC_E8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4000000000000000\",\n    \"RBX\": \"0xbff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfsub st1, st0\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\n\n\nhlt\n\nalign 4096\ndata:\n  dt 1.0\n  dq 0\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DC_F0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3ff0000000000000\",\n    \"RBX\": \"0x3fe0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfdivr st1, st0\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DC_F8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4000000000000000\",\n    \"RBX\": \"0x4010000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfdiv st1, st0\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\n\nhlt\n\nalign 4096\ndata:\n  dt 8.0\n  dq 0\ndata2:\n  dt 2.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DD_00_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x4000000000000000 ; 2.0\nmov [rdx + 8 * 0], rax\n\nfld qword [rdx + 8 * 0]\n\nfstp qword [rdx]\nmov rax, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DD_01_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x2\",\n    \"RBX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data3]\nfisttp qword [rdx + 8 * 0]\n\nmov rax, [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfstp qword [rdx]\nmov rbx, [rdx]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dq 0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DD_02_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4000000000000000\",\n    \"RBX\": \"0x3ff0000000000000\",\n    \"RCX\": \"0x4000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data3]\nfst qword [rdx + 8 * 0]\n\nmov rax, [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfstp qword [rdx]\nmov rbx, [rdx]\nfstp qword [rdx]\nmov rcx, [rdx]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dq 0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DD_03_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4000000000000000\",\n    \"RBX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data3]\nfstp qword [rdx + 8 * 0]\n\nmov rax, [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfstp qword [rdx]\nmov rbx, [rdx]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dq 0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DD_04_2_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\": [\"0x8000000000000000\", \"0x4005\"],\n    \"XMM2\": [\"0x8000000000000000\", \"0x4004\"],\n    \"XMM3\": [\"0x8000000000000000\", \"0x4003\"],\n    \"XMM4\": [\"0x8000000000000000\", \"0x4002\"],\n    \"XMM5\": [\"0x8000000000000000\", \"0x4001\"],\n    \"XMM6\": [\"0x8000000000000000\", \"0x4000\"]\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n; We don't test XMM0 or the MM* registers due to precision\n\nmov rdx, 0xe0000000\n\nmov rax, 2\nmov [rdx + 2 * 1], rax\nmov rax, 4\nmov [rdx + 2 * 2], rax\nmov rax, 8\nmov [rdx + 2 * 3], rax\nmov rax, 16\nmov [rdx + 2 * 4], rax\nmov rax, 32\nmov [rdx + 2 * 5], rax\nmov rax, 64\nmov [rdx + 2 * 6], rax\n\nfldz\nfild word [rdx + 2 * 1]\nfild word [rdx + 2 * 2]\nfild word [rdx + 2 * 3]\nfild word [rdx + 2 * 4]\nfild word [rdx + 2 * 5]\nfild word [rdx + 2 * 6]\nfldpi\n\no16 fnsave [rdx]\n\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\n\no16 frstor [rdx]\n\nmovups xmm0, [rdx + (0xE + 10 * 0)]\nmovups xmm1, [rdx + (0xE + 10 * 1)]\nmovups xmm2, [rdx + (0xE + 10 * 2)]\nmovups xmm3, [rdx + (0xE + 10 * 3)]\nmovups xmm4, [rdx + (0xE + 10 * 4)]\nmovups xmm5, [rdx + (0xE + 10 * 5)]\nmovups xmm6, [rdx + (0xE + 10 * 6)]\nmovups xmm7, [rdx + (0xE + 10 * 7)]\n\npslldq xmm0, 6\npsrldq xmm0, 6\n\npslldq xmm1, 6\npsrldq xmm1, 6\n\npslldq xmm2, 6\npsrldq xmm2, 6\n\npslldq xmm3, 6\npsrldq xmm3, 6\n\npslldq xmm4, 6\npsrldq xmm4, 6\n\npslldq xmm5, 6\npsrldq xmm5, 6\n\npslldq xmm6, 6\npsrldq xmm6, 6\n\npslldq xmm7, 6\npsrldq xmm7, 6\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DD_04_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM1\": [\"0x8000000000000000\", \"0x4005\"],\n    \"XMM2\": [\"0x8000000000000000\", \"0x4004\"],\n    \"XMM3\": [\"0x8000000000000000\", \"0x4003\"],\n    \"XMM4\": [\"0x8000000000000000\", \"0x4002\"],\n    \"XMM5\": [\"0x8000000000000000\", \"0x4001\"],\n    \"XMM6\": [\"0x8000000000000000\", \"0x4000\"],\n    \"XMM7\": [\"0x0000000000000000\", \"0x0000\"]\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n; We don't test XMM0 or the MM* registers due to precision\n\nmov rdx, 0xe0000000\n\nmov rax, 2\nmov [rdx + 2 * 1], rax\nmov rax, 4\nmov [rdx + 2 * 2], rax\nmov rax, 8\nmov [rdx + 2 * 3], rax\nmov rax, 16\nmov [rdx + 2 * 4], rax\nmov rax, 32\nmov [rdx + 2 * 5], rax\nmov rax, 64\nmov [rdx + 2 * 6], rax\n\nfldz\nfild word [rdx + 2 * 1]\nfild word [rdx + 2 * 2]\nfild word [rdx + 2 * 3]\nfild word [rdx + 2 * 4]\nfild word [rdx + 2 * 5]\nfild word [rdx + 2 * 6]\nfldpi\n\no32 fnsave [rdx]\n\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\nfldpi\n\no32 frstor [rdx]\n\nmovups xmm0, [rdx + (0x1C + 10 * 0)]\nmovups xmm1, [rdx + (0x1C + 10 * 1)]\nmovups xmm2, [rdx + (0x1C + 10 * 2)]\nmovups xmm3, [rdx + (0x1C + 10 * 3)]\nmovups xmm4, [rdx + (0x1C + 10 * 4)]\nmovups xmm5, [rdx + (0x1C + 10 * 5)]\nmovups xmm6, [rdx + (0x1C + 10 * 6)]\nmovups xmm7, [rdx + (0x1C + 10 * 7)]\n\npslldq xmm0, 6\npsrldq xmm0, 6\n\npslldq xmm1, 6\npsrldq xmm1, 6\n\npslldq xmm2, 6\npsrldq xmm2, 6\n\npslldq xmm3, 6\npsrldq xmm3, 6\n\npslldq xmm4, 6\npsrldq xmm4, 6\n\npslldq xmm5, 6\npsrldq xmm5, 6\n\npslldq xmm6, 6\npsrldq xmm6, 6\n\npslldq xmm7, 6\npsrldq xmm7, 6\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DD_07_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFF3800\",\n    \"RBX\": \"0xFFFFFFFFFFFF0000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nmov rax, -1\nmov rbx, -1\nfnstsw [rdx + 8 * 1]\n\nfld dword [rdx + 8 * 0]\nfnstsw [rdx + 8 * 2]\nmov ax, word [rdx + 8 * 2]\nmov bx, word [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DD_C0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n; Just to ensure execution\nffree st0\nffree st1\nffree st2\nffree st3\nffree st4\nffree st5\nffree st6\nffree st7\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DD_D0_2_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\",\n    \"RBX\": \"0x4000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld qword [rdx]\nfst st1  ;; copies st0, i.e. 2.0 to st1\nfstp st0 ;; pop, st1 becomes st0\n\n;; ensure st0 has valid tag.\nfxam     ;; get if top is valid in C2\nfstsw ax ;; store work into ax\nshr ax, 10\nand ax, 1\n\n; store top in rbx\nfst qword [rdx]\nmov rbx, [rdx]\n\nhlt\n\nalign 4096\ndata:\n  dq 2.0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DD_D0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3ff0000000000000\",\n    \"RBX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfst st1\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DD_D8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4010000000000000\",\n    \"RBX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfstp st1\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DD_E9_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x3ff0000000000000\",\n    \"RBX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n; Only tests pop behaviour\nfld1\nfldz\nfucomp\nfld1\n\nmov rdx, 0xe0000000\nfstp qword [rdx]\nmov rax, [rdx]\nfstp qword [rdx]\nmov rbx, [rdx]\n\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DE_00_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\":  \"0x4008000000000000\",\n    \"RSI\":  \"0xbff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, 2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfiadd word [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rcx, [rdx]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, -2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfiadd word [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rsi, [rdx]\n\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DE_01_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\":  \"0x4000000000000000\",\n    \"RSI\":  \"0xC000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, 2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfimul word [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rcx, [rdx]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, -2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfimul word [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rsi, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DE_02_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RSI\":  \"0x18\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\nmov rsi, 0\n\n; Matching positive-positive\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, 1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp word [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\n; Matching negative-negative\nmov rax, 0xbff0000000000000 ; -1.0\nmov [rdx + 8 * 0], rax\nmov ax, -1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp word [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\n; Nonmatching negative-positive\nmov rax, 0xbff0000000000000 ; -1.0\nmov [rdx + 8 * 0], rax\nmov ax, 1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp word [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\n; Nonmatching positive-negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, -1\nmov [rdx + 8 * 1], eax\n\nfld qword [rdx + 8 * 0]\nficomp word [rdx + 8 * 1]\n\n; Get the status word\nmov rax, 0\nfstsw ax\n; Extract C3 to see if it was equal\nshr ax, 14\nand ax, 1\nor rsi, rax\nshl rsi, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DE_04_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\":  \"0xbff0000000000000\",\n    \"RSI\":  \"0x4008000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, 2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfisub word [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rcx, [rdx]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, -2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfisub word [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rsi, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DE_05_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\":  \"0x3ff0000000000000\",\n    \"RSI\":  \"0xc008000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, 2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfisubr word [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rcx, [rdx]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, -2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfisubr word [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rsi, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DE_06_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\":  \"0x3fe0000000000000\",\n    \"RSI\":  \"0xbfe0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, 2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfidiv word [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rcx, [rdx]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, -2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfidiv word [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rsi, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DE_07_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\":  \"0x4000000000000000\",\n    \"RSI\":  \"0xc000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, 2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfidivr word [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rcx, [rdx]\n\n; Test negative\nmov rax, 0x3ff0000000000000 ; 1.0\nmov [rdx + 8 * 0], rax\nmov ax, -2\nmov [rdx + 8 * 1], ax\n\nfld qword [rdx + 8 * 0]\nfidivr word [rdx + 8 * 1]\n\nfst qword [rdx]\nmov rsi, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DE_C0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x4010000000000000\",\n    \"RBX\":  \"0x4008000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfaddp st1, st0\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nfstp qword [rcx]\nmov rax, [rcx]\n\nfst qword [rcx]\nmov rbx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DE_C8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x4010000000000000\",\n    \"RBX\":  \"0x4020000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfmulp st1, st0\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nfstp qword [rcx]\nmov rax, [rcx]\n\nfst qword [rcx]\nmov rbx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DE_E0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x4010000000000000\",\n    \"RBX\":  \"0x4000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfsubrp st1, st0\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nfstp qword [rcx]\nmov rax, [rcx]\n\nfst qword [rcx]\nmov rbx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DE_E8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x4010000000000000\",\n    \"RBX\":  \"0xc000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfsubp st1, st0\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nfstp qword [rcx]\nmov rax, [rcx]\n\nfst qword [rcx]\nmov rbx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DE_F0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x4010000000000000\",\n    \"RBX\":  \"0x4000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\nfdivrp st1, st0\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nfstp qword [rcx]\nmov rax, [rcx]\n\nfst qword [rcx]\nmov rbx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DE_F8_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x4010000000000000\",\n    \"RBX\":  \"0x3fe0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\n; fdivp 2.0, 4.0\n; == st1 = 2.0 / 4.0\nfdivp st1, st0\n\nlea rdx, [rel data3]\nfld tword [rdx + 8 * 0]\n\nfstp qword [rcx]\nmov rax, [rcx]\n\nfst qword [rcx]\nmov rbx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 4.0\n  dq 0\ndata3:\n  dt 4.0\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DF_00_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4090000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 1024\nmov [rdx + 8 * 0], eax\nmov eax, -1\nmov [rdx + 8 * 0 + 2], eax\n\nfild word [rdx + 8 * 0]\nfst qword [rdx + 8 * 0]\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DF_01_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x2\",\n    \"RBX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data3]\nfisttp word [rdx + 8 * 0]\n\nmov ax, word [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfst qword [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 0]\n\nhlt\n\nalign 4096\ndata:\n  dt 2.0\n  dq 0\ndata2:\n  dt 1.0\n  dq 0\ndata3:\n  dq -1\n  dq -1\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DF_02_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\"\n  },\n  \"X87ReducedPrecision\" : \"1\"\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x44800000 ; 1024.0\nmov [rdx + 8 * 0], eax\nmov eax, -1\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\n\nfist word [rdx + 8 * 1]\n\nfld1\n\nmov eax, 0\nmov ax, word [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DF_03_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"RBX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x44800000 ; 1024.0\nmov [rdx + 8 * 0], eax\nmov eax, -1\nmov [rdx + 8 * 1], eax\n\nfld dword [rdx + 8 * 0]\n\nfistp word [rdx + 8 * 1]\n\nfld1\n\nmov eax, 0\nmov ax, word [rdx + 8 * 1]\n\nfst qword [rdx + 8 * 0]\nmov rbx, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DF_04_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"XMM0\":  [\"0x0506070801000000\", \"0x0000000000000012\"],\n    \"XMM1\":  [\"0x6576879821300000\", \"0x0000000000000000\"],\n    \"XMM2\":  [\"0xB90984060D300000\", \"0x000000000000C03B\"],\n    \"XMM3\":  [\"0xA83732340C000000\", \"0x000000000000C03B\"],\n    \"XMM4\":  [\"0xFFAA6DA436100000\", \"0x000000000000C03A\"],\n    \"XMM5\":  [\"0x0000000000000001\", \"0x0000000000000000\"],\n    \"XMM6\":  [\"0x0000000000000001\", \"0x0000000000008000\"],\n    \"XMM7\":  [\"0x0000000000000000\", \"0x0000000000008000\"],\n    \"XMM8\":  [\"0x0000000000000000\", \"0x0000000000008000\"],\n    \"XMM9\":  [\"0x0000000000000000\", \"0x0000000000000000\"],\n    \"XMM10\":  [\"0x0000000000000001\", \"0x0000000000008000\"],\n    \"XMM11\":  [\"0x0000000000000001\", \"0x0000000000000000\"]\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nfbld [rel .data_0]\nfbstp [rel .res_data_0]\nmovups xmm0, [rel .res_data_0]\nandps xmm0, [rel .precisionMask] ; Mask imprecise bits\n\nfbld [rel .data_1]\nfbstp [rel .res_data_1]\nmovups xmm1, [rel .res_data_1]\nandps xmm1, [rel .precisionMask] ; Mask imprecise bits\n\n; Check encoding of invalid BCD\nfbld [rel .data_2]\nfstp tword [rel .res_data_2]\nmovups xmm2, [rel .res_data_2]\nandps xmm2, [rel .precisionMask] ; Mask imprecise bits\n\nfbld [rel .data_3]\nfstp tword [rel .res_data_3]\nmovups xmm3, [rel .res_data_3]\nandps xmm3, [rel .precisionMask] ; Mask imprecise bits\n\nfbld [rel .data_4]\nfstp tword [rel .res_data_4]\nmovups xmm4, [rel .res_data_4]\nandps xmm4, [rel .precisionMask] ; Mask imprecise bits\n\n; Some special values\nfld tword [rel .data_5]\nfbstp [rel .res_data_5]\nmovups xmm5, [rel .res_data_5]\n\nfld tword [rel .data_6]\nfbstp [rel .res_data_6]\nmovups xmm6, [rel .res_data_6]\n\nfld tword [rel .data_7]\nfbstp [rel .res_data_7]\nmovups xmm7, [rel .res_data_7]\n\n; Values that choose +- 0 or +-1 depending on rounding mode\n; -1 < F < -0\n; +0 < F < +1\nfld tword [rel .data_8]\nfbstp [rel .res_data_8]\nmovups xmm8, [rel .res_data_8]\n\nfld tword [rel .data_9]\nfbstp [rel .res_data_9]\nmovups xmm9, [rel .res_data_9]\n\n; Swap control word\nfnstcw [rel .cw]\nmov ax, [rel .cw]\nand ax, ~(3 << 10)\nor eax, 1 << 10 ; Round down\nmov [rel .cw], ax\nfldcw [rel .cw]\n\nfld tword [rel .data_10]\nfbstp [rel .res_data_10]\nmovups xmm10, [rel .res_data_10]\n\n; Swap control word\nfnstcw [rel .cw]\nmov ax, [rel .cw]\nand ax, ~(3 << 10)\nor eax, 2 << 10 ; Round up\nmov [rel .cw], ax\nfldcw [rel .cw]\n\nfld tword [rel .data_11]\nfbstp [rel .res_data_11]\nmovups xmm11, [rel .res_data_11]\n\n; Values that generate Invalicating floating point operation exception\n; -inf\n; +inf\n; Negative value too large for destination format\n; Positive value too large for destination format\n; NaN\n; On IA the indefinite BCD result is still stored to memory\n\n; XXX: We don't support IA on this\n\nhlt\n\nalign 4096\n.precisionMask:\ndd 0xfff00000\ndd 0xffffffff\ndd 0xffffffff\ndd 0xffffffff\n\n\n.cw:\ndw 0\n\n.data_0:\ndd 0x01020304\ndd 0x05060708\ndd 0x09101112\ndd 0x13141516\n.data_1:\ndd 0x21324354\ndd 0x65768798\ndd 0x00000000\ndd 0x00000000\n.data_2:\ndd 0xFFFFFFFF\ndd 0xFFFFFFFF\ndd 0xFFFFFFFF\ndd 0xFFFFFFFF\n.data_3:\ndd 0xF0F0F0F0\ndd 0xF0F0F0F0\ndd 0xF0F0F0F0\ndd 0xF0F0F0F0\n.data_4:\ndd 0x0A0B0C0D\ndd 0x0E0FAAAB\ndd 0xACADAEAF\ndd 0xBABBBCBD\n.data_5:\ndt 1.0\n.data_6:\ndt -1.0\n.data_7:\ndt -0.0\n.data_8:\ndt -0.5\n.data_9:\ndt 0.5\n.data_10:\ndt -0.5\n.data_11:\ndt 0.5\n\n.res_data_0:\ndq 0\ndq 0\n.res_data_1:\ndq 0\ndq 0\n.res_data_2:\ndq 0\ndq 0\n.res_data_3:\ndq 0\ndq 0\n.res_data_4:\ndq 0\ndq 0\n.res_data_5:\ndq 0\ndq 0\n.res_data_6:\ndq 0\ndq 0\n.res_data_7:\ndq 0\ndq 0\n.res_data_8:\ndq 0\ndq 0\n.res_data_9:\ndq 0\ndq 0\n.res_data_10:\ndq 0\ndq 0\n.res_data_11:\ndq 0\ndq 0\n\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DF_05_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4090000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov rax, 1024\nmov [rdx + 8 * 0], rax\n\nfild qword [rdx + 8 * 0]\nfst qword [rdx + 8 * 0]\nmov rax, [rdx + 8 * 0]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DF_07_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x400\",\n    \"RBX\": \"0x3ff0000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x44800000 ; 1024.0\nmov [rdx + 8 * 0], eax\nmov rax, -1\nmov [rdx + 8 * 1], rax\n\nfld dword [rdx + 8 * 0]\n\nfistp qword [rdx + 8 * 1]\n\nfld1\n\nmov rax, qword [rdx + 8 * 1]\n\nfstp qword [rdx + 8 * 1]\n\nmov rbx, qword [rdx + 8 * 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/DF_E0_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFF3800\",\n    \"RBX\": \"0xFFFFFFFFFFFF0000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, 0x3f800000 ; 1.0\nmov [rdx + 8 * 0], eax\n\nmov rax, -1\nmov rbx, -1\nfnstsw ax\nmov bx, ax\n\nfld dword [rdx + 8 * 0]\nfnstsw ax\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/FCOM_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x0\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nfld1\nfldz\nfcomp\nfnstsw ax\ntest ah, 041h\njp good\nmov rax, 0\nhlt\ngood:\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/FILD_NEG_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0xC090000000000000\",\n    \"RBX\": \"0xC070000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\nmov eax, -1024\nmov [rdx + 8 * 0], eax\n\nfild dword [rdx + 8 * 0]\n\nfstp qword [rdx]\nmov rax, [rdx]\n\nxor rbx, rbx\nmov bx, -256\nmov [rdx + 8 * 0], bx\nfild word [rdx + 8 * 0]\n\nfstp qword [rdx]\nmov rbx, [rdx]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/FIST_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" },\n  \"RegData\": {\n    \"RAX\": \"0xffffffff\"\n  }\n}\n%endif\n\n; Test behaviour of overflow\n; and storing negative numbers\n; to 32-bit registers.\n\nlea rbp, [rel data]\nmov rdx, 0xe0000000\n\nfld qword [rbp]\nfistp dword [rdx]\nmov eax, [rdx]\n\nhlt\n\nalign 8\ndata:\n  dq 0xbff0000000000000\n"
  },
  {
    "path": "unittests/ASM/X87_F64/FLDCW_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" },\n  \"RegData\": {\n    \"RAX\": \"0x3\",\n    \"RBX\": \"0x2\"\n  }\n}\n%endif\n\nlea rbp, [rel data]\nmov rdx, 0xe0000000\nmov rcx, 0xe0004000\n\n; save fcw\nfnstcw [rdx]\n; set rounding to truncate\nmov eax, 0\nmov ax, [rdx]\nor ah, 0xc\nmov [rdx+8], ax\nfldcw [rdx+8]\n\nfld dword [rbp]\nfistp dword [rdx+16]\nmov ebx, [rdx+16]\n\n; restore fcw\nfldcw [rdx]\nfld dword [rbp]\nfistp dword[rdx+16]\nmov eax, [rdx+16]\n\nhlt\n\nalign 8\ndata:\n   dd 0x40266666 ; 2.6\n"
  },
  {
    "path": "unittests/ASM/X87_F64/FLD_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" },\n  \"RegData\": {\n    \"RAX\": \"0x40490fdb\",\n    \"RBX\": \"0x4008000000000000\"\n  }\n}\n%endif\n\nlea rbp, [rel data]\nmov rdx, 0xe0000000\n\nfld dword [rbp]\nfst dword [rdx]\n\nxor rax, rax\nmov eax, [rdx]\n\nfld qword [rbp + 4]\nfst qword [rdx]\n\nmov rbx, [rdx]\n\nhlt\n\nalign 8\ndata:\n  dd 0x40490fdb\n  dq 0x4008000000000000\n"
  },
  {
    "path": "unittests/ASM/X87_F64/FPREM1_Flags_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" },\n  \"RegData\": {\n    \"RAX\": \"0\"\n  }\n}\n%endif\n\nmov rbx, 0xe0000000\no32 fstenv [rbx]\nmov dword [rbx+4], 0xFFFFFFFF ; set status word to all one\no32 fldenv [rbx]\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfprem1\n\nxor rax, rax\nfstsw ax\nand rax, 0x400 ; C2 should be set to zero\n\nhlt\n\nalign 8\ndata:\n  dt 3.0\n  dq 0\ndata2:\n  dt 5.1\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/FPREM_Flags_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" },\n  \"RegData\": {\n    \"RAX\": \"0\"\n  }\n}\n%endif\n\nmov rbx, 0xe0000000\no32 fstenv [rbx]\nmov dword [rbx+4], 0xFFFFFFFF ; set status word to all one\no32 fldenv [rbx]\n\nlea rdx, [rel data]\nfld tword [rdx + 8 * 0]\n\nlea rdx, [rel data2]\nfld tword [rdx + 8 * 0]\n\nfprem\n\nxor rax, rax\nfstsw ax\nand rax, 0x400 ; C2 should be set to zero\n\nhlt\n\nalign 8\ndata:\n  dt 3.0\n  dq 0\ndata2:\n  dt 5.1\n  dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/FScale-Zero_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"R8\": \"0\",\n    \"R9\": \"0\",\n    \"R10\": \"0\",\n    \"R11\": \"0\",\n    \"R12\": \"0\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n; scale by zero (st1 == 0)\nmov rax, 0\nmov qword [rel intstor], rax\nfinit\nfild qword [rel intstor]\nfldz\nfscale\nfst qword [rel intstor]\nmov r8, [rel intstor]\n\n; scale by zero (st1 == 1)\nmov rax, 1\nmov qword [rel intstor], rax\nfinit\nfild qword [rel intstor]\nfldz\nfscale\nfst qword [rel intstor]\nmov r9, [rel intstor]\n\n; scale by zero (st1 == 100)\nmov rax, 100\nmov qword [rel intstor], rax\nfinit\nfild qword [rel intstor]\nfldz\nfscale\nfst qword [rel intstor]\nmov r10, [rel intstor]\n\n; scale by zero (st1 == 1024)\nmov rax, 1024\nmov qword [rel intstor], rax\nfinit\nfild qword [rel intstor]\nfldz\nfscale\nfst qword [rel intstor]\nmov r11, [rel intstor]\n\n; scale by zero (st1 == 1048576)\nmov rax, 1048576\nmov qword [rel intstor], rax\nfinit\nfild qword [rel intstor]\nfldz\nfscale\nfst qword [rel intstor]\nmov r12, [rel intstor]\n\n; tests scaling negative zero\nmov rax, 1048576\nmov qword [rel intstor], rax\nfinit\nfild qword [rel intstor]\nfld qword [rel neg_zero]\nfscale\nfst qword [rel intstor]\nmov r13, [rel intstor]\n\nhlt\n\nalign 4096\nneg_zero: dq 0x8000000000000000   ; -0.0\nintstor: dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/FScaleFXtract_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" },\n  \"RegData\": {\n    \"R8\": \"1\"\n  }\n}\n%endif\n    ; ,\n    ; \"R9\": \"1\",\n    ; \"R10\": \"1\",\n    ; \"R11\": \"1\",\n    ; \"R12\": \"1\"\nsection .data\n    num0: dq 0.0\n    num1: dq 125.78\n    num2: dq 1023.12\n    num3: dq -23487.152\n    num4: dq -1230192.123\n\n;; Tests the FScale / FXtract inverse behaviour\nsection .text\n    global _start\n_start:\n    \n; num0 == 0.0\nfinit\nfld qword [rel num0]\nfld st0\nfxtract\nfscale\nfstp st1  ; at this point st0 and st1 should be the same\nfcom\nfnstsw ax\nand ax, 0x4500\ncmp ax, 0x4000\nsetz r8b\n\n; ; num1 == 125.78\n; finit\n; fld qword [rel num1]\n; fld st0\n; fxtract\n; fscale\n; fstp st1  ; at this point st0 and st1 should be the same\n; fcom\n; fnstsw ax\n; and ax, 0x4500\n; cmp ax, 0x4000\n; setz r9b\n\n; ; num2 == 1023.12\n; finit\n; fld qword [rel num2]\n; fld st0\n; fxtract\n; fscale\n; fstp st1  ; at this point st0 and st1 should be the same\n; fcom\n; fnstsw ax\n; and ax, 0x4500\n; cmp ax, 0x4000\n; setz r10b\n\n; ; num3 == -23487.152\n; finit\n; fld qword [rel num3]\n; fld st0\n; fxtract\n; fscale\n; fstp st1  ; at this point st0 and st1 should be the same\n; fcom\n; fnstsw ax\n; and ax, 0x4500\n; cmp ax, 0x4000\n; setz r11b\n\n; ; num4 == -1230192.123\n; finit\n; fld qword [rel num4]\n; fld st0\n; fxtract\n; fscale\n; fstp st1  ; at this point st0 and st1 should be the same\n; fcom\n; fnstsw ax\n; and ax, 0x4500\n; cmp ax, 0x4000\n; setz r12b\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/FXAM_Push_2_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RCX\": \"0\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; This behaviour was seen around Wine 32-bit libraries\n; Anything doing a call to a double application would spin\n; the x87 stack on to the stack looking for fxam to return empty\n; Empty in this case is that C0 and C3 is set whiel C2 is not\n\nfninit\n; Empty stack to make sure we don't push anything\n\nmov eax, 0\nmov ecx, 0\n\n.ExamineStack:\n; Examine st(0)\nfxam\nfwait\n; Get the results in to AX\nfnstsw ax\nand ax, 0x4500\n; Check for empty\ncmp ax, 0x4100\nje .Done\n\n; Now push the x87 stack value\n; We know it isn't empty\nfstp qword [rdx + rcx * 8]\nfwait\ninc ecx\njmp .ExamineStack\n\n.Done:\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/FXAM_Push_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"8\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rdx, 0xe0000000\n\n; This behaviour was seen around Wine 32-bit libraries\n; Anything doing a call to a double application would spin\n; the x87 stack on to the stack looking for fxam to return empty\n; Empty in this case is that C0 and C3 is set whiel C2 is not\n\nfninit\n; Fill the x87 stack\nfldz\nfldz\nfldz\nfldz\nfldz\nfldz\nfldz\nfldz\n\nmov eax, 0\nmov ecx, 0\n\n.ExamineStack:\n; Examine st(0)\nfxam\nfwait\n; Get the results in to AX\nfnstsw ax\nand ax, 0x4500\n; Check for empty\ncmp ax, 0x4100\nje .Done\n\n; Now push the x87 stack value\n; We know it isn't empty\nfstp qword [rdx + rcx * 8]\nfwait\ninc ecx\njmp .ExamineStack\n\n.Done:\n\n; Save how many we stored\nmov eax, ecx\n\n; Now fill with \"Garbage\"\nfld1\nfld1\nfld1\nfld1\nfld1\nfld1\nfld1\nfld1\n\n.Reload:\n; Now reload the stack\ndec ecx\nfld qword [rdx + rcx * 8]\ncmp ecx, 0x0\njne .Reload;\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/X87_F64/Rounding_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RBX\": \"0x212121211121\",\n    \"RCX\": \"0xfffefffeffffffff\",\n    \"RDX\": \"0xfffffffeffffffff\",\n    \"RSI\": \"0xfffefffeffffffff\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n; Rounding tests to ensure rounding modes are actually working\n\n;; Mid-point\nfinit\nfld qword [rel midpoint]\n\n; Default rounding is 00 - round to nearest\nfist dword [rel tmp]\nmov rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0400\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0800\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0c00\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n;; Slightly above midpoint\nfinit\nfld qword [rel samidpoint]\n\n; Default rounding is 00 - round to nearest\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0400\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0800\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0c00\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n;; Slightly below midpoint\nfinit\nfld qword [rel sbmidpoint]\n\n; Default rounding is 00 - round to nearest\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0400\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0800\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nor rbx, qword [rel tmp]\nshl rbx, 4\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0c00\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nor rbx, qword [rel tmp]\n\n\n;;; Negative tests\n;; Mid-point\nfinit\nfld qword [rel nmidpoint]\n\n; Default rounding is 00 - round to nearest\nfist word [rel tmp]\nmov ax, word [rel tmp]\nor rcx, rax \nshl rcx, 16\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0400\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov ax, word [rel tmp]\nor rcx, rax\nshl rcx, 16\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0800\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov ax, word [rel tmp]\nor rcx, rax\nshl rcx, 16\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0c00\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nmov ax, word [rel tmp]\nor rcx, rax\n\n;; Slightly above midpoint\nfinit\nfld qword [rel nsamidpoint]\n\n; Default rounding is 00 - round to nearest\nfist dword [rel tmp]\nmov dx, word [rel tmp]\nshl rdx, 16\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0400\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov ax, word [rel tmp]\nor rdx, rax\nshl rdx, 16\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0800\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov ax, word [rel tmp]\nor rdx, rax\nshl rdx, 16\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0c00\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nmov ax, word [rel tmp]\nor rdx, rax\n\n;; Slightly below midpoint\nfinit\nfld qword [rel nsbmidpoint]\n\n; Default rounding is 00 - round to nearest\nfist dword [rel tmp]\nmov si, word [rel tmp]\nshl rsi, 16\n\n; Round down - 01\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0400\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov ax, word [rel tmp]\nor rsi, rax\nshl rsi, 16\n\n; Round up - 10\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0800\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfist dword [rel tmp]\nmov ax, word [rel tmp]\nor rsi, rax\nshl rsi, 16\n\n; Round toward zero - 11\nfstcw word [rel tmp]\nmovzx rax, word [rel tmp]\nand rax, 0xf3ff\nor rax, 0x0c00\nmov word [rel tmp], ax\nfldcw word [rel tmp]\n\nfistp dword [rel tmp]\nmov ax, word [rel tmp]\nor rsi, rax\n\nhlt\n\nalign 4096\nmidpoint:\n  dq 1.5\nsamidpoint:\n  dq 1.50001\nsbmidpoint:\n  dq 1.49999\nnmidpoint:\n  dq -1.5\nnsamidpoint:\n  dq -1.49999\nnsbmidpoint:\n  dq -1.50001\n\ntmp: dq 0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/fptan_neg_zero_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3ff0000000000000\",\n    \"RBX\":  \"0x8000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld qword [rdx]\n\nfptan\n\n; ST(0) = 1.0, ST(1) = tan(-0.0) = -0.0\nfstp qword [rcx]\nmov rax, [rcx]\n\nfstp qword [rcx]\nmov rbx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dq 0x8000000000000000 ; -0.0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/fptan_pos_zero_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x3ff0000000000000\",\n    \"RBX\":  \"0x0000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld qword [rdx]\n\nfptan\n\n; ST(0) = 1.0, ST(1) = tan(+0.0) = +0.0\nfstp qword [rcx]\nmov rax, [rcx]\n\nfstp qword [rcx]\nmov rbx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dq 0x0000000000000000 ; +0.0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/fsin_neg_zero_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x8000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld qword [rdx]\n\nfsin\n\nfstp qword [rcx]\nmov rax, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dq 0x8000000000000000 ; -0.0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/fsin_pos_zero_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"0x0000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld qword [rdx]\n\nfsin\n\nfstp qword [rcx]\nmov rax, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dq 0x0000000000000000 ; +0.0\n"
  },
  {
    "path": "unittests/ASM/X87_F64/fsincos_neg_zero_F64.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\":  \"1\",\n    \"RBX\":  \"0x8000000000000000\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\n%include \"checkprecision.mac\"\n\nmov rcx, 0xe0000000\n\nlea rdx, [rel data]\nfld qword [rdx]\n\nfsincos\n\n; ST(0) = cos(-0.0), ST(1) = sin(-0.0) = -0.0\nfstp qword [rcx]\ncheck_relerr_d rel expected_cos, rcx, rel tolerance\n\nfstp qword [rcx]\nmov rbx, [rcx]\n\nhlt\n\nalign 8\ndata:\n  dq 0x8000000000000000 ; -0.0\nexpected_cos:\n  dq 0x3ff0000000000000 ; 1.0\ntolerance:\n  dq 0x3cb0000000000000 ; 2^-52, ~1 ULP relative error\n\ndefine_check_data_constants\n"
  },
  {
    "path": "unittests/ASM/fadd.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"MM7\": [\"0xc90fdb0000000000\", \"0x4001\"]\n  }\n}\n%endif\n\n; calcuate pi + pi\nfld dword [rel pi]\nfld dword [rel pi]\nfaddp\n\nhlt\n\nalign 8\npi:     dd 0x40490fdb ; 3.14...\none:    dd 0x3f800000 ; 1.0\nptone:  dd 0x3dcccccd ; 0.1\n"
  },
  {
    "path": "unittests/ASM/fld.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"MM4\": [\"0xfffffffffffff800\", \"0xffff\"],\n    \"MM5\": [\"0xffffff0000000000\", \"0xffff\"],\n    \"MM6\": [\"0xaaaaaa0000000000\", \"0xbfd5\"],\n    \"MM7\": [\"0xc90fdb0000000000\", \"0x4000\"]\n  }\n}\n%endif\n\nlea rbp, [rel data]\n\n; 32bit FLDs\nfld dword [rbp]\nfld dword [rbp + 4]\nfld dword [rel allf] ; Currently fails due to lack of infinity handling\n\n; 64bit FLDs\nfld qword [rel allf] ; Currently fails due to lack of infinity handling\n\nhlt\n\nalign 8\ndata:\n        dd 0x40490fdb\n        dd 0xaaaaaaaa\nallf:   dq 0xffffffffffffffff\n        dw 0xffff"
  },
  {
    "path": "unittests/ASM/full_pshufd_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x00000000a1aaca0e\"\n  },\n  \"HostFeatures\": [\"SSE4.1\"]\n}\n%endif\n\nmov rax, 0\n\n%assign i 0\n%rep 256\n\n; pshufd all the immediate encodings\nmovaps xmm0, [rel .random_data + ((i * 16) % 4096)]\npshufd xmm0, xmm0, i\nmovaps [rel .data_result + (i * 16)], xmm0\n\n; CRC32 (by 64) the results\ncrc32 rax, qword [rel .data_result + (i * 16) + 0]\ncrc32 rax, qword [rel .data_result + (i * 16) + 8]\n%assign i i+1\n%endrep\n\nhlt\nalign 32\n\n.data_result:\ntimes 256 dq 0, 0\n\n; 4096 bytes of random data.\n.random_data:\ndb 0x5b, 0x27, 0x12, 0x29, 0xab, 0x84, 0xa2, 0x21, 0x6d, 0x27, 0xbe, 0x3d, 0x17, 0x05, 0x99, 0xb0\ndb 0xf3, 0xe2, 0x19, 0xf4, 0x42, 0xbb, 0x69, 0x02, 0x67, 0x3a, 0xab, 0x86, 0x9e, 0xda, 0x9f, 0xd5\ndb 0xba, 0xd4, 0x2d, 0x9d, 0x20, 0x3d, 0xf8, 0xb2, 0x29, 0xc3, 0xc3, 0x98, 0xa8, 0x30, 0x92, 0xe9\ndb 0x5a, 0x75, 0x0c, 0xcb, 0x28, 0x28, 0xb4, 0x90, 0x93, 0x16, 0x45, 0x10, 0x3a, 0x5d, 0x96, 0x67\ndb 0xf9, 0x31, 0xbe, 0x48, 0x78, 0xe8, 0x5a, 0xf2, 0x66, 0x29, 0xd9, 0x80, 0x50, 0x80, 0xcb, 0x07\ndb 0xfe, 0xda, 0x19, 0x0f, 0x22, 0xea, 0x18, 0x5e, 0x12, 0xea, 0x3d, 0x1a, 0xbc, 0x91, 0x51, 0x15\ndb 0xaa, 0x66, 0x92, 0x61, 0xb4, 0xd4, 0xce, 0x14, 0x9c, 0x86, 0x27, 0x3d, 0xd0, 0xc6, 0x51, 0x1c\ndb 0xa0, 0xd4, 0x0b, 0x2d, 0x25, 0x30, 0x3b, 0x46, 0x23, 0x07, 0xb5, 0x05, 0x4a, 0xaa, 0x5a, 0x0a\ndb 0x7b, 0x29, 0xe4, 0x52, 0x6f, 0x6f, 0xc8, 0x62, 0xb8, 0x94, 0x6a, 0x30, 0x66, 0xf1, 0x21, 0xec\ndb 0xd1, 0xf2, 0x68, 0xda, 0xb7, 0x7f, 0x5a, 0x26, 0x38, 0x46, 0x48, 0xda, 0x5d, 0x64, 0x8d, 0x3d\ndb 0x2f, 0xf6, 0xc3, 0x63, 0xb8, 0x09, 0x3a, 0xd0, 0x5b, 0xeb, 0x67, 0xd0, 0xaa, 0x63, 0x71, 0x19\ndb 0x7e, 0x4e, 0x33, 0xe2, 0x15, 0xba, 0x87, 0xa7, 0x7b, 0x25, 0xe4, 0xbb, 0xb5, 0x26, 0x9a, 0xf1\ndb 0xdd, 0x5a, 0x63, 0xd7, 0x16, 0xc0, 0xc3, 0xc8, 0x1b, 0xad, 0x00, 0x52, 0x63, 0x55, 0xc7, 0xe0\ndb 0xd9, 0xe9, 0xf4, 0x4c, 0x53, 0xfb, 0x73, 0x57, 0xdc, 0xad, 0x0c, 0xca, 0x73, 0x44, 0x6b, 0xf3\ndb 0xb7, 0x83, 0x3b, 0xfe, 0xf0, 0x15, 0xbf, 0xe5, 0x15, 0xca, 0xdf, 0x35, 0xeb, 0xe7, 0xe3, 0xa2\ndb 0xbd, 0x20, 0xad, 0xff, 0x1b, 0x67, 0x0a, 0x9f, 0x60, 0x60, 0xff, 0xa7, 0xc9, 0x19, 0xde, 0xb3\ndb 0x67, 0xf1, 0x4b, 0x77, 0x7f, 0x0b, 0xb1, 0x29, 0xee, 0xcb, 0xd6, 0x5d, 0x0d, 0xb9, 0x54, 0x49\ndb 0x10, 0xe3, 0xbd, 0x8a, 0xa0, 0x69, 0xa3, 0x07, 0xbe, 0x8e, 0xea, 0xc6, 0x75, 0x27, 0x66, 0xae\ndb 0x3c, 0xde, 0xc6, 0x13, 0x1b, 0x50, 0x37, 0x56, 0x7c, 0x01, 0xab, 0x8b, 0x46, 0xdc, 0x80, 0xed\ndb 0xdf, 0x12, 0x6f, 0x64, 0xdf, 0xe6, 0xf9, 0xbf, 0x15, 0x95, 0xd9, 0x80, 0x19, 0x8c, 0x96, 0x33\ndb 0x89, 0xbe, 0x25, 0x33, 0x34, 0x82, 0x92, 0x96, 0x05, 0x52, 0xa2, 0xcf, 0x5b, 0x3d, 0xfc, 0xd8\ndb 0x43, 0x89, 0x2e, 0x16, 0x6d, 0xbd, 0x84, 0x97, 0x77, 0xb5, 0xd6, 0x2b, 0x6b, 0xb1, 0xc6, 0x38\ndb 0x0a, 0xfe, 0xe1, 0xc9, 0x31, 0x32, 0x7f, 0xd5, 0xc1, 0x03, 0x4a, 0xb2, 0x86, 0x4d, 0x8d, 0x77\ndb 0xd6, 0x62, 0x52, 0x75, 0xed, 0x27, 0x21, 0xe8, 0x69, 0x6f, 0x6a, 0x5b, 0x59, 0x4d, 0xd2, 0x6c\ndb 0x2a, 0x97, 0x09, 0x03, 0xc5, 0x29, 0x0d, 0xe1, 0x31, 0x2e, 0x62, 0x21, 0x0e, 0xc2, 0x00, 0x7c\ndb 0xa2, 0x4c, 0x19, 0x63, 0x24, 0xfc, 0x9b, 0x38, 0x11, 0xbf, 0x20, 0x53, 0x53, 0xac, 0x3f, 0xdb\ndb 0xfd, 0x2b, 0x39, 0x3c, 0x39, 0x6b, 0xb4, 0x52, 0x1f, 0xf8, 0x8f, 0x3b, 0x47, 0x2b, 0x86, 0xcf\ndb 0xd2, 0x38, 0xe9, 0x08, 0x73, 0x09, 0x32, 0x5f, 0x6c, 0x3a, 0xdb, 0xfc, 0x1d, 0x91, 0xa4, 0x26\ndb 0xa3, 0x0c, 0xbc, 0x94, 0xf5, 0xbd, 0x29, 0xcf, 0x72, 0x3d, 0xee, 0x48, 0x06, 0x77, 0x63, 0x70\ndb 0x47, 0xc9, 0x87, 0x21, 0xb1, 0x9a, 0xdd, 0x5f, 0x71, 0x08, 0xe3, 0x3b, 0xf6, 0x07, 0x9f, 0x2f\ndb 0x20, 0xa3, 0x02, 0xc8, 0x4d, 0xc8, 0x18, 0xfa, 0x69, 0x32, 0x60, 0x97, 0x2d, 0x2f, 0x26, 0x84\ndb 0x3d, 0x7a, 0xf6, 0x2f, 0xb1, 0xc9, 0xd2, 0xcd, 0x6e, 0x24, 0x18, 0xa8, 0x0d, 0xb0, 0xe2, 0x41\ndb 0x1e, 0xdf, 0xc7, 0xee, 0xcd, 0x21, 0x5b, 0xc3, 0x26, 0x26, 0xb3, 0xb4, 0x33, 0x58, 0x79, 0xb5\ndb 0xc3, 0x24, 0x7c, 0xe3, 0xd7, 0x78, 0x33, 0x22, 0xd5, 0x20, 0x21, 0x86, 0xcf, 0xca, 0x44, 0xba\ndb 0xd8, 0x05, 0x84, 0x37, 0x69, 0x48, 0xb0, 0xe0, 0x7a, 0xe6, 0x74, 0x53, 0x1e, 0xd0, 0x0c, 0x3c\ndb 0x33, 0x83, 0x15, 0x43, 0x16, 0x0e, 0x93, 0x39, 0x55, 0x2e, 0x55, 0x1c, 0x09, 0xbd, 0x7a, 0xc3\ndb 0x80, 0x77, 0x4e, 0xd9, 0xf3, 0xa5, 0xee, 0x94, 0xbf, 0x8e, 0xd0, 0xec, 0x39, 0x33, 0x31, 0x8d\ndb 0x74, 0x94, 0xd2, 0x24, 0x22, 0x4a, 0xde, 0x51, 0x99, 0xc5, 0x68, 0xf2, 0x2e, 0xd3, 0x8d, 0xc5\ndb 0x32, 0x31, 0x26, 0xe7, 0x87, 0x47, 0x5f, 0xbc, 0x32, 0x80, 0x43, 0x83, 0x34, 0x36, 0xa1, 0x72\ndb 0x6b, 0x38, 0x10, 0x93, 0xa7, 0xa3, 0x92, 0xb7, 0x3c, 0x61, 0x1c, 0x4e, 0x0b, 0x86, 0x43, 0xa9\ndb 0x64, 0xf1, 0xf8, 0xd7, 0xd3, 0xf4, 0xd0, 0xe2, 0x17, 0xd4, 0xbb, 0xe9, 0x2c, 0xc8, 0x76, 0xc5\ndb 0x87, 0x7f, 0x81, 0x55, 0xbe, 0x87, 0x0e, 0x6b, 0xf6, 0x4f, 0x44, 0x37, 0x92, 0x32, 0x7f, 0x30\ndb 0xa6, 0x66, 0x09, 0x01, 0x7a, 0x6e, 0xb3, 0x3b, 0x7d, 0x8f, 0x32, 0x0e, 0x3c, 0xdc, 0xba, 0x2e\ndb 0xf8, 0xec, 0xde, 0xd9, 0xb1, 0xf0, 0x3e, 0xbd, 0x20, 0x4d, 0x01, 0x5a, 0xf4, 0xda, 0x99, 0x23\ndb 0x81, 0x01, 0x5f, 0x50, 0xce, 0xa8, 0xb9, 0xb1, 0x59, 0xe5, 0xde, 0x47, 0x5b, 0xba, 0x94, 0xd3\ndb 0x21, 0x7c, 0x49, 0xeb, 0xb5, 0x14, 0xe5, 0x56, 0x93, 0x06, 0x3b, 0xd2, 0x3a, 0x11, 0xca, 0x7a\ndb 0x14, 0x48, 0x54, 0xc7, 0x9f, 0x03, 0x40, 0x2c, 0x0b, 0x42, 0x8e, 0xac, 0xac, 0x08, 0x04, 0x8e\ndb 0xb3, 0x15, 0xe5, 0x06, 0xa6, 0x5b, 0xf0, 0x57, 0x08, 0xfa, 0x0f, 0x00, 0x7e, 0x4a, 0x16, 0xa8\ndb 0xb0, 0x4d, 0x07, 0x1b, 0xbc, 0x3d, 0xd0, 0x86, 0x15, 0xcd, 0x7c, 0xb2, 0xcc, 0x37, 0x6d, 0x15\ndb 0x8b, 0xd1, 0xe6, 0x3e, 0xfb, 0x6e, 0xe4, 0xea, 0xd9, 0x1f, 0x69, 0x2a, 0xbc, 0xda, 0xd9, 0x78\ndb 0xee, 0xcb, 0xb6, 0xff, 0x53, 0xfd, 0xd2, 0xb9, 0x18, 0x1f, 0xdf, 0x0e, 0x69, 0xfe, 0x36, 0xb0\ndb 0x77, 0x28, 0x66, 0xe2, 0xf0, 0x80, 0x4c, 0x11, 0x11, 0xba, 0xb7, 0xfd, 0x67, 0x4f, 0x05, 0xed\ndb 0x0c, 0xcc, 0x3e, 0x4d, 0xd9, 0xbc, 0x52, 0xe3, 0xec, 0xd9, 0x74, 0x29, 0x30, 0xf2, 0x66, 0xd6\ndb 0xfb, 0xc3, 0x5c, 0xc1, 0xd8, 0xef, 0x86, 0x08, 0x22, 0xb1, 0x6d, 0xfd, 0xee, 0xc7, 0x12, 0x25\ndb 0xda, 0xee, 0xd6, 0x28, 0x3b, 0x1d, 0xa7, 0x29, 0xdf, 0x45, 0x3a, 0xa4, 0x36, 0xe0, 0xa4, 0xda\ndb 0xb1, 0x2c, 0x8a, 0xa5, 0x5c, 0x8c, 0x70, 0xd8, 0xcd, 0x0f, 0xb5, 0x63, 0xd3, 0xaf, 0x59, 0x2b\ndb 0x7d, 0x86, 0x4a, 0xc4, 0xcc, 0x72, 0x9e, 0x89, 0xf4, 0x38, 0x89, 0x81, 0x64, 0x6f, 0xa5, 0xac\ndb 0x13, 0x59, 0xc4, 0x0f, 0xfb, 0xcc, 0x4c, 0x1d, 0x67, 0x5a, 0xbf, 0x19, 0xfc, 0x06, 0x71, 0xbd\ndb 0x7f, 0xb6, 0xb1, 0x95, 0xd3, 0x7b, 0x4c, 0x40, 0x91, 0xa9, 0x26, 0xdd, 0x28, 0x69, 0x90, 0xf6\ndb 0x5d, 0x16, 0x9f, 0xa9, 0x75, 0x5e, 0xad, 0x8f, 0xc8, 0x0b, 0x57, 0x48, 0xf2, 0x74, 0x77, 0x22\ndb 0x5d, 0xed, 0xc2, 0x79, 0x27, 0x46, 0x0c, 0x9e, 0x6f, 0x9a, 0x9a, 0xdc, 0xe0, 0x3d, 0x24, 0xc9\ndb 0xce, 0xf3, 0x34, 0x66, 0x45, 0x07, 0x0b, 0x83, 0x8c, 0xb7, 0xd9, 0x1e, 0xac, 0xc6, 0xf7, 0xef\ndb 0xe7, 0xd1, 0xbc, 0xa3, 0x21, 0x85, 0x3d, 0x25, 0x90, 0x24, 0x48, 0xb1, 0x00, 0xb0, 0xd2, 0xa6\ndb 0xd8, 0x4e, 0x46, 0x7c, 0xc4, 0x79, 0x40, 0x95, 0x81, 0xb4, 0xb9, 0xa8, 0x70, 0xf0, 0x12, 0xd6\ndb 0xdc, 0xb2, 0x7c, 0x0f, 0x47, 0xad, 0x7d, 0x46, 0x78, 0x18, 0x6e, 0xdd, 0x5f, 0xe5, 0xd7, 0x63\ndb 0x11, 0xf0, 0x5b, 0xa0, 0x48, 0x15, 0xe2, 0x55, 0xc6, 0x7f, 0xf4, 0x2e, 0x0e, 0x49, 0x39, 0x65\ndb 0x3e, 0x69, 0xc1, 0x27, 0x39, 0xb3, 0x10, 0x1b, 0xf2, 0x35, 0x88, 0x0c, 0x1b, 0xac, 0x4a, 0x15\ndb 0x31, 0x81, 0x63, 0xe5, 0x3d, 0x56, 0x6f, 0x34, 0x06, 0x5b, 0x1d, 0xa0, 0xea, 0x0c, 0x92, 0x6a\ndb 0x22, 0x2b, 0x2d, 0xbb, 0xaf, 0xc5, 0x6d, 0x44, 0x1b, 0xb0, 0x69, 0x06, 0x27, 0x54, 0xa5, 0x7f\ndb 0x07, 0xd4, 0xdc, 0xe5, 0x5c, 0x78, 0x9e, 0xf7, 0x4a, 0x47, 0x9b, 0x21, 0xf6, 0x87, 0x89, 0xad\ndb 0xec, 0xe4, 0xd6, 0x83, 0xd3, 0x7b, 0x34, 0x00, 0x0b, 0x75, 0xba, 0x4c, 0x0f, 0x46, 0xd2, 0x0c\ndb 0x58, 0x1b, 0x0f, 0x19, 0xb5, 0xf5, 0xba, 0x8f, 0xbd, 0x17, 0x51, 0xaf, 0xa6, 0x1a, 0x97, 0x8c\ndb 0x44, 0x30, 0x7c, 0x73, 0x50, 0xca, 0x05, 0xe8, 0x3e, 0x19, 0x4a, 0x5a, 0x6b, 0x4d, 0x01, 0x05\ndb 0xea, 0x1b, 0x70, 0xb6, 0xe6, 0x39, 0x5d, 0x99, 0x3b, 0xae, 0xed, 0x7c, 0xa6, 0xc7, 0x29, 0x6f\ndb 0xeb, 0x0a, 0xba, 0x03, 0xd3, 0xba, 0x62, 0x21, 0xa0, 0xb7, 0xb5, 0xbf, 0x40, 0xb8, 0x4e, 0xc3\ndb 0x89, 0xa0, 0xa9, 0xe8, 0xc8, 0x2b, 0xfd, 0x23, 0x32, 0x53, 0xe5, 0x35, 0xc1, 0x23, 0x97, 0xc1\ndb 0x87, 0x10, 0x41, 0x21, 0xb3, 0xf6, 0x53, 0xcf, 0x28, 0x47, 0x9c, 0x69, 0x42, 0xcf, 0x0e, 0x11\ndb 0x69, 0x7f, 0xc6, 0xdf, 0xc3, 0xbf, 0x04, 0x7f, 0x3a, 0xc6, 0xa1, 0x3d, 0xc6, 0x5b, 0x56, 0x8b\ndb 0x52, 0x23, 0x41, 0xd7, 0x35, 0x7f, 0x86, 0xd2, 0x59, 0xcf, 0xae, 0x28, 0xa3, 0xa2, 0x23, 0x4b\ndb 0x78, 0x78, 0x94, 0x3f, 0x2f, 0xf0, 0xb8, 0x94, 0xa2, 0x62, 0xb9, 0x83, 0xc7, 0x5f, 0x64, 0x45\ndb 0x54, 0xaf, 0x43, 0x93, 0x7f, 0xa1, 0xe8, 0x71, 0x38, 0xc8, 0x21, 0xf4, 0xa6, 0xab, 0x2b, 0xd3\ndb 0x44, 0xa2, 0x74, 0x94, 0x99, 0x3f, 0x56, 0xbc, 0x0a, 0x12, 0xe7, 0x6e, 0x1b, 0x7f, 0x98, 0xad\ndb 0x28, 0xa6, 0xc8, 0x87, 0x7a, 0x88, 0xcb, 0xcf, 0x9f, 0x95, 0xa7, 0xf1, 0x66, 0xfe, 0x43, 0x3d\ndb 0x71, 0x5b, 0x3a, 0xb7, 0xe4, 0xa8, 0x6f, 0x46, 0xa1, 0xaa, 0x66, 0xd2, 0x9e, 0x84, 0xfd, 0x42\ndb 0x98, 0x17, 0x3e, 0xde, 0xaa, 0x18, 0xc9, 0x9c, 0x53, 0x88, 0x2b, 0x92, 0xce, 0x00, 0x8b, 0xb4\ndb 0x15, 0x7a, 0x39, 0xb7, 0x57, 0xf9, 0xf2, 0x17, 0x0a, 0x8c, 0x05, 0x7b, 0x3f, 0x2a, 0xb0, 0xb7\ndb 0x8a, 0xbb, 0x9a, 0x0d, 0xe4, 0x0d, 0x6a, 0xbd, 0x8a, 0xe9, 0xbd, 0xca, 0xb2, 0x6a, 0xbe, 0x76\ndb 0x2c, 0xbe, 0x45, 0x3f, 0x22, 0x03, 0xb1, 0xab, 0x2d, 0xe0, 0x70, 0x52, 0xe5, 0x27, 0x8e, 0xbc\ndb 0xa9, 0x8d, 0x13, 0xf4, 0xe5, 0xd7, 0xeb, 0x4e, 0x30, 0x3f, 0x76, 0x3b, 0x64, 0xad, 0x57, 0x53\ndb 0x91, 0x89, 0xf4, 0x9a, 0xd1, 0x38, 0x3d, 0x58, 0xdc, 0x83, 0x65, 0x4a, 0x36, 0x30, 0x73, 0x92\ndb 0x8c, 0x2f, 0x7d, 0x1e, 0x15, 0x3c, 0xca, 0x54, 0x6f, 0x17, 0xbd, 0xba, 0x97, 0x7e, 0x28, 0x11\ndb 0x8e, 0x96, 0x9f, 0x46, 0x84, 0x69, 0xe3, 0xc2, 0x8e, 0x1e, 0xea, 0x6b, 0x17, 0xa7, 0xf8, 0x17\ndb 0xc3, 0xd9, 0x9c, 0x53, 0x79, 0x95, 0x32, 0xf6, 0x78, 0xcd, 0x5d, 0x2f, 0x30, 0x06, 0xe8, 0x9f\ndb 0x5e, 0xb2, 0x4e, 0x56, 0xf5, 0x31, 0xc3, 0x41, 0xae, 0x4b, 0x0a, 0xbd, 0xdc, 0xce, 0xea, 0xfa\ndb 0x27, 0x09, 0x4e, 0xd1, 0x24, 0x14, 0x33, 0x8b, 0x21, 0x48, 0x99, 0x92, 0x07, 0xa4, 0x1a, 0x87\ndb 0x34, 0x15, 0xa6, 0x12, 0x92, 0x3f, 0xf0, 0x3e, 0x18, 0x3c, 0x65, 0x3a, 0x8b, 0x17, 0x9b, 0xf2\ndb 0xd9, 0x93, 0xa0, 0x19, 0x2b, 0x73, 0x59, 0x29, 0x6f, 0xb7, 0x75, 0x4b, 0x42, 0x24, 0x43, 0xa4\ndb 0x20, 0xd8, 0x59, 0x8d, 0x9f, 0xd6, 0x64, 0xa1, 0xeb, 0xe3, 0x65, 0x82, 0x69, 0x74, 0x1a, 0x2b\ndb 0x8d, 0x9a, 0x59, 0x5d, 0x47, 0x75, 0x63, 0xcd, 0xe4, 0x14, 0x48, 0x5f, 0x67, 0x00, 0x12, 0x3c\ndb 0x58, 0x27, 0x5e, 0x83, 0xde, 0xd8, 0x97, 0xd9, 0x09, 0xd9, 0x06, 0x64, 0x96, 0x67, 0xb4, 0x4f\ndb 0xb9, 0x58, 0x87, 0xc9, 0xb1, 0xdd, 0x64, 0x8f, 0x4e, 0x8f, 0xa9, 0xfa, 0x40, 0xe6, 0x8f, 0xaa\ndb 0x22, 0x26, 0x16, 0x15, 0x6a, 0xa3, 0x88, 0xae, 0xa2, 0xbc, 0xa3, 0xa3, 0x56, 0xa1, 0x74, 0x6c\ndb 0xa2, 0xd0, 0x47, 0x4b, 0x98, 0x0a, 0xea, 0xdd, 0xe8, 0x9c, 0xe1, 0x37, 0x44, 0x1a, 0xc0, 0xc7\ndb 0x83, 0x07, 0x42, 0xca, 0x98, 0x36, 0xd7, 0x43, 0x18, 0x51, 0x32, 0xf6, 0x99, 0x61, 0x73, 0x79\ndb 0x51, 0xc4, 0xe9, 0x5b, 0x9e, 0xa8, 0xb4, 0x28, 0x49, 0xbb, 0x44, 0x90, 0xe2, 0xf7, 0x7e, 0x61\ndb 0x27, 0xbb, 0x85, 0x58, 0xd0, 0xdc, 0x94, 0x53, 0x02, 0x50, 0xfe, 0xc7, 0x37, 0xa2, 0x20, 0x1b\ndb 0x57, 0x00, 0x9b, 0x7c, 0xa4, 0x6c, 0xa6, 0xb1, 0xae, 0xd0, 0x03, 0x67, 0x2b, 0x82, 0xd9, 0x99\ndb 0x76, 0xd0, 0xc7, 0x7d, 0x2d, 0xbd, 0x39, 0x28, 0xcf, 0xe1, 0x13, 0xce, 0x1c, 0xe6, 0x4c, 0xa7\ndb 0x7a, 0x8c, 0x4f, 0xa6, 0x30, 0x77, 0x6b, 0x78, 0x39, 0x6e, 0x10, 0xd1, 0x9c, 0x9a, 0xda, 0x2d\ndb 0xc9, 0xef, 0xd7, 0xb1, 0xb8, 0xdf, 0x21, 0xce, 0x96, 0x53, 0xaa, 0xa6, 0x76, 0x52, 0x56, 0x0e\ndb 0xe6, 0x7f, 0xed, 0x88, 0x15, 0x2a, 0xc1, 0xfe, 0xb3, 0x35, 0x54, 0x09, 0x9b, 0x5d, 0x21, 0x62\ndb 0xc8, 0x6f, 0x2c, 0x6e, 0x56, 0xc8, 0xd9, 0x40, 0x67, 0xeb, 0x26, 0xf5, 0xcb, 0x18, 0xb1, 0x89\ndb 0xfe, 0x58, 0x1a, 0xff, 0x41, 0xb5, 0xd6, 0xe5, 0xb3, 0x82, 0x29, 0x82, 0xee, 0xbb, 0xb2, 0x5a\ndb 0x71, 0xf2, 0xca, 0xf1, 0x2f, 0xa7, 0x4d, 0xb1, 0x5c, 0xbc, 0xc3, 0x1a, 0xb4, 0x20, 0x6a, 0x7e\ndb 0xb9, 0x5e, 0xcb, 0x9b, 0xf3, 0x1c, 0x2b, 0x16, 0xab, 0x15, 0x8d, 0xb5, 0x81, 0xf3, 0xbb, 0xc1\ndb 0x8e, 0x2c, 0xd6, 0xd1, 0xa8, 0x23, 0x3c, 0x98, 0x3f, 0x4e, 0xff, 0x97, 0x77, 0xd1, 0xbd, 0xda\ndb 0xff, 0x9c, 0x55, 0x01, 0x1c, 0x4b, 0x4b, 0x1a, 0xa9, 0x3d, 0xe9, 0xbd, 0x3c, 0x5b, 0xfd, 0x65\ndb 0x34, 0x9c, 0x78, 0x8c, 0x83, 0x46, 0x72, 0xed, 0x66, 0xee, 0x00, 0xac, 0xca, 0x09, 0xaa, 0x3a\ndb 0x2c, 0xc1, 0x7e, 0xde, 0x44, 0xbd, 0xe3, 0x5a, 0x11, 0x41, 0xc7, 0xc8, 0x65, 0x7a, 0xc7, 0xbb\ndb 0x44, 0xad, 0x97, 0x17, 0xe8, 0x9f, 0x29, 0x2b, 0x78, 0x6d, 0x96, 0xb6, 0x9c, 0x3a, 0x6a, 0xc2\ndb 0xab, 0x9a, 0x16, 0x6f, 0x05, 0x78, 0x0d, 0x83, 0xa5, 0x46, 0x8c, 0xd7, 0x57, 0x1e, 0x80, 0x2f\ndb 0x7e, 0x81, 0x68, 0xa4, 0xc4, 0x3d, 0x6c, 0xae, 0x6b, 0x98, 0xb9, 0xe4, 0xb4, 0xfb, 0xf4, 0x19\ndb 0xf9, 0xcd, 0xbb, 0xd0, 0xbc, 0x22, 0xdd, 0x2c, 0xbe, 0x11, 0x01, 0xc2, 0x53, 0xdd, 0xa3, 0x3a\ndb 0xbf, 0x5f, 0x2a, 0x94, 0x8b, 0x58, 0x6e, 0xe3, 0x4e, 0x1b, 0x0d, 0x30, 0x1b, 0x1c, 0x6c, 0x24\ndb 0x0e, 0xd9, 0x1c, 0xe1, 0x4d, 0x42, 0x48, 0xa0, 0x07, 0xb1, 0xe8, 0x10, 0xa1, 0x51, 0x6a, 0x82\ndb 0x2e, 0x99, 0xb3, 0xbf, 0xe3, 0xff, 0x3c, 0x77, 0xf4, 0x0c, 0x1f, 0x22, 0x53, 0xd0, 0x99, 0x60\ndb 0x5d, 0x65, 0x80, 0xb9, 0xa3, 0xb7, 0x25, 0x6d, 0xa6, 0x4f, 0xb5, 0x72, 0xaa, 0x4d, 0x0d, 0x49\ndb 0x4c, 0x34, 0xc5, 0xf4, 0x1b, 0x5c, 0x3f, 0x6c, 0xbb, 0x86, 0xba, 0xc5, 0x32, 0xee, 0x23, 0x95\ndb 0xe5, 0x42, 0x66, 0x92, 0x89, 0x5e, 0xf4, 0xd4, 0x2d, 0x04, 0xf2, 0xbc, 0xd7, 0xc8, 0xc9, 0xd7\ndb 0xe3, 0xdb, 0x4e, 0x4b, 0xda, 0x37, 0x1f, 0xfa, 0x9c, 0xaf, 0x4b, 0x1e, 0xab, 0x64, 0x2a, 0x59\ndb 0x24, 0x0f, 0xb4, 0xaf, 0xd6, 0x32, 0x30, 0xcd, 0x7c, 0xf3, 0x0f, 0xa9, 0xac, 0x3f, 0x55, 0xa2\ndb 0x92, 0x21, 0x58, 0x4e, 0x99, 0xbc, 0x9f, 0xfd, 0x16, 0x7c, 0x4e, 0x5b, 0xb4, 0xc7, 0x5f, 0x8d\ndb 0x0e, 0x26, 0x72, 0x17, 0x02, 0x7d, 0x12, 0xa0, 0xc5, 0xc1, 0x66, 0xd3, 0x19, 0x49, 0x42, 0xfb\ndb 0x18, 0xd7, 0x18, 0x79, 0xd3, 0x32, 0xfc, 0x4a, 0xab, 0x82, 0x72, 0x0a, 0x90, 0xb7, 0xbc, 0x00\ndb 0x16, 0x99, 0xd3, 0x9a, 0x76, 0xc6, 0x44, 0x92, 0x9b, 0x2b, 0x6a, 0x35, 0xca, 0x4e, 0x2e, 0x9c\ndb 0x7f, 0xcb, 0xd3, 0x65, 0x1c, 0xa6, 0x95, 0x2c, 0x3d, 0xe4, 0xd3, 0xe6, 0xe7, 0xe0, 0xde, 0x1e\ndb 0x54, 0xb3, 0x09, 0x3e, 0x34, 0x35, 0x68, 0x53, 0x01, 0x02, 0xf1, 0x4c, 0x89, 0x19, 0xe3, 0xc6\ndb 0x4a, 0x51, 0x49, 0xf5, 0x5f, 0x3e, 0xcd, 0xae, 0x6e, 0xeb, 0x90, 0x1a, 0x53, 0x93, 0x0b, 0xe8\ndb 0xc2, 0x6e, 0xee, 0xf3, 0x38, 0x5d, 0xb8, 0xaf, 0x58, 0x4b, 0xe0, 0xfd, 0x07, 0xcf, 0x15, 0x89\ndb 0x2b, 0x01, 0x35, 0xbb, 0xa0, 0x2f, 0x7e, 0xd3, 0x34, 0x7b, 0x1f, 0x81, 0x12, 0x7f, 0xb0, 0xff\ndb 0xe7, 0xa0, 0xf2, 0xc4, 0x86, 0x98, 0x45, 0xe2, 0xa1, 0x1e, 0x4c, 0xc0, 0x23, 0x05, 0x49, 0x0b\ndb 0x0d, 0xc3, 0x1e, 0x30, 0x20, 0xc6, 0x34, 0xb7, 0xe1, 0x09, 0x84, 0xd5, 0x2a, 0x40, 0x75, 0x9b\ndb 0x46, 0xbb, 0xa5, 0xfe, 0xbd, 0x7d, 0x39, 0xe4, 0x7b, 0x38, 0xdc, 0x9c, 0xaf, 0xc8, 0x12, 0xf4\ndb 0x78, 0xb8, 0x51, 0x4a, 0x21, 0xfe, 0xf9, 0x77, 0xf6, 0xb5, 0xad, 0x69, 0xc9, 0x4d, 0xbf, 0x67\ndb 0xfc, 0x5d, 0x80, 0x7c, 0x76, 0x2c, 0xe5, 0xf2, 0xd7, 0x7f, 0xce, 0xb5, 0x1c, 0x09, 0xa5, 0xc3\ndb 0x98, 0x18, 0x2d, 0x18, 0xfb, 0x61, 0x13, 0xea, 0xbc, 0x87, 0x3a, 0x3f, 0xb4, 0xaf, 0x3c, 0x3b\ndb 0x3b, 0xb6, 0xd2, 0xc7, 0x5c, 0x2c, 0xe1, 0x11, 0xb3, 0x9d, 0xf1, 0x52, 0xba, 0xb5, 0xf0, 0x69\ndb 0xcd, 0xd2, 0x93, 0x9e, 0x80, 0x45, 0x78, 0x17, 0x6d, 0x52, 0x51, 0xad, 0xed, 0x6d, 0x9e, 0x15\ndb 0xca, 0xb1, 0xfe, 0x22, 0x7b, 0x87, 0xb8, 0x40, 0x06, 0x2d, 0xb0, 0xbb, 0x05, 0x7c, 0x52, 0xd2\ndb 0xcd, 0xc8, 0x9c, 0xea, 0xd3, 0x4c, 0xb5, 0x06, 0xb4, 0x70, 0xad, 0x09, 0xa5, 0xb8, 0x66, 0xba\ndb 0x31, 0x0d, 0xe0, 0xe2, 0xcf, 0x62, 0x9f, 0x6d, 0x6d, 0x1a, 0x47, 0x21, 0xd5, 0x33, 0x6b, 0xd7\ndb 0x75, 0xff, 0x98, 0x6c, 0xb2, 0x78, 0x6d, 0x45, 0x50, 0xeb, 0xfb, 0xea, 0xb7, 0x2a, 0x27, 0x02\ndb 0xc4, 0x03, 0xde, 0x56, 0x23, 0x26, 0x10, 0x21, 0x57, 0x9c, 0x3b, 0x4c, 0x79, 0x2c, 0x3e, 0xfe\ndb 0xc8, 0x16, 0xe4, 0xd6, 0x60, 0xb8, 0x46, 0xe3, 0x4b, 0x7e, 0x3d, 0xb3, 0x83, 0x19, 0x54, 0x65\ndb 0x51, 0x7a, 0x81, 0xdd, 0x07, 0x33, 0x92, 0x08, 0x64, 0x0b, 0xc2, 0x06, 0x5c, 0x07, 0x81, 0x40\ndb 0x1b, 0xb4, 0x5a, 0x47, 0x2b, 0xdc, 0x96, 0x98, 0x4c, 0x65, 0xad, 0x8e, 0x8e, 0x77, 0xbe, 0x99\ndb 0x60, 0x4c, 0xb5, 0x6b, 0xed, 0xb7, 0x52, 0x5d, 0x99, 0x2e, 0x93, 0x40, 0xfe, 0x45, 0x83, 0x28\ndb 0x9b, 0x8b, 0x7f, 0x77, 0x2b, 0xdc, 0x61, 0xbe, 0x62, 0x28, 0xe8, 0x23, 0x3f, 0xdb, 0x1d, 0x6d\ndb 0x3b, 0xe8, 0x90, 0x05, 0x12, 0xf2, 0xb4, 0xf0, 0x1b, 0xbb, 0x2f, 0x4b, 0x9e, 0x9f, 0x0e, 0x4e\ndb 0x9e, 0x6a, 0x38, 0x7e, 0x97, 0x13, 0x90, 0x57, 0xb9, 0x49, 0x52, 0xb7, 0x4f, 0xd3, 0xc1, 0x39\ndb 0x95, 0x20, 0xd4, 0x83, 0x48, 0x0e, 0x7a, 0x9d, 0x89, 0x9d, 0xf4, 0xec, 0xe7, 0xcc, 0xde, 0x0a\ndb 0xac, 0xc5, 0xb0, 0x4d, 0xc5, 0x25, 0x74, 0x62, 0x66, 0x51, 0x4f, 0xeb, 0x4e, 0x9d, 0x3d, 0x04\ndb 0x27, 0xec, 0xfe, 0x8d, 0x03, 0x20, 0x38, 0x30, 0x5d, 0xf3, 0xf0, 0x97, 0xbb, 0xa9, 0xd1, 0xea\ndb 0x73, 0x73, 0x40, 0x2c, 0x0b, 0xa7, 0xc9, 0x8d, 0xac, 0x75, 0xc4, 0x46, 0x7c, 0xc2, 0x9a, 0x26\ndb 0x07, 0xae, 0x02, 0x27, 0x42, 0xa8, 0x90, 0xb6, 0x9b, 0x98, 0xec, 0x2e, 0xf6, 0xf6, 0x17, 0xda\ndb 0x9f, 0xfb, 0x54, 0xea, 0xae, 0x96, 0xfe, 0xd6, 0x35, 0x4f, 0x07, 0x9f, 0xf4, 0x57, 0x36, 0xfe\ndb 0xb1, 0x43, 0xee, 0xe3, 0x21, 0x00, 0x43, 0x12, 0xf2, 0xff, 0xa5, 0x37, 0x65, 0x01, 0xf0, 0xb4\ndb 0xe8, 0x68, 0xa3, 0xff, 0x31, 0x5f, 0x3f, 0x56, 0xa5, 0xd2, 0xcc, 0xab, 0xa4, 0x90, 0xf9, 0x98\ndb 0x0b, 0xdc, 0x0d, 0x20, 0x3c, 0x33, 0xda, 0xf1, 0x54, 0xd5, 0x6d, 0xc4, 0xa9, 0xc4, 0x54, 0x29\ndb 0x56, 0x69, 0x96, 0x98, 0x74, 0x13, 0x72, 0x1f, 0x95, 0xe9, 0xe2, 0xab, 0x60, 0x74, 0x91, 0x96\ndb 0xdf, 0xa4, 0xd6, 0x62, 0x3c, 0x35, 0x7e, 0xc4, 0x21, 0x16, 0xa3, 0x32, 0xac, 0x20, 0x52, 0xd4\ndb 0xbb, 0xc2, 0xa5, 0x97, 0x86, 0x4a, 0x55, 0xf4, 0x09, 0xf2, 0x0e, 0xd6, 0x1a, 0xfa, 0x00, 0x67\ndb 0x45, 0x57, 0xb3, 0xaa, 0xe5, 0x7c, 0x17, 0x8d, 0xde, 0x75, 0xd7, 0x49, 0x6e, 0xb0, 0xb2, 0xa0\ndb 0x58, 0xd8, 0x01, 0xf0, 0x22, 0x9c, 0xe4, 0xeb, 0x71, 0x5f, 0x4d, 0x38, 0xf2, 0x7e, 0xee, 0xba\ndb 0xf9, 0x39, 0xff, 0x42, 0x91, 0x00, 0x63, 0x5c, 0x86, 0x02, 0x81, 0x51, 0x10, 0xfb, 0xcf, 0x2a\ndb 0xcf, 0x16, 0xd9, 0x8f, 0x3a, 0xbb, 0x29, 0xcb, 0xe2, 0xc9, 0xd9, 0xe2, 0xd9, 0x05, 0x1b, 0x46\ndb 0x08, 0x2c, 0x6d, 0x5b, 0x1a, 0x7d, 0x5b, 0xca, 0x5b, 0xae, 0x18, 0x48, 0x15, 0x3b, 0x85, 0xd1\ndb 0x29, 0xcf, 0xaf, 0xa5, 0x68, 0xe9, 0x8d, 0x9e, 0x0b, 0xe1, 0x55, 0x54, 0x68, 0x28, 0x9b, 0x4c\ndb 0x94, 0x30, 0x3a, 0xc0, 0xaa, 0xf8, 0xeb, 0x7b, 0x58, 0x53, 0x5f, 0x25, 0x2e, 0xbf, 0x72, 0x26\ndb 0xd8, 0x9c, 0xa9, 0xfe, 0x30, 0xe0, 0x68, 0x25, 0xba, 0x71, 0x1a, 0x82, 0xbb, 0xee, 0x03, 0xc9\ndb 0x4b, 0x0a, 0x22, 0xda, 0x93, 0xa0, 0x72, 0x49, 0x72, 0x3a, 0x8f, 0xbe, 0x39, 0x04, 0x7c, 0x06\ndb 0xa1, 0x50, 0xa1, 0x94, 0xb4, 0x66, 0x91, 0xee, 0x76, 0xa4, 0xbe, 0x21, 0x33, 0xbe, 0xa9, 0x68\ndb 0xe6, 0x03, 0xdd, 0x25, 0x3b, 0x78, 0xe3, 0x5a, 0x0c, 0xcf, 0x2b, 0xa2, 0x03, 0x63, 0x8d, 0xd7\ndb 0xc4, 0xf0, 0x6e, 0xea, 0xe1, 0x76, 0x93, 0x38, 0x7b, 0x85, 0xef, 0xff, 0xce, 0xb0, 0xe1, 0xe3\ndb 0x86, 0x3d, 0xb6, 0xae, 0xee, 0xf7, 0x92, 0x8a, 0x1b, 0x29, 0x00, 0x9b, 0x85, 0xaf, 0xa2, 0x5e\ndb 0x90, 0xd9, 0xdc, 0xca, 0xde, 0xde, 0xab, 0xfe, 0x05, 0x61, 0x3c, 0xb6, 0x2f, 0x40, 0x59, 0x1f\ndb 0x73, 0x80, 0x52, 0xf6, 0x6f, 0x28, 0x30, 0x4b, 0xf2, 0x88, 0x9e, 0x63, 0x84, 0x1b, 0xd2, 0xf4\ndb 0x67, 0x3b, 0xaf, 0x48, 0x27, 0xfd, 0x7e, 0x30, 0x6e, 0xb8, 0x81, 0xbf, 0xe5, 0x4c, 0x19, 0x16\ndb 0x24, 0xd0, 0x8e, 0x3a, 0xc9, 0xcd, 0xc8, 0x6f, 0x2e, 0x99, 0xda, 0xb8, 0x7c, 0xd9, 0xbb, 0x2c\ndb 0xe3, 0xdf, 0xd0, 0x96, 0xe2, 0xcc, 0x99, 0x5b, 0x1d, 0xff, 0x81, 0x74, 0x84, 0x0b, 0x9d, 0x09\ndb 0x3e, 0x1b, 0x0c, 0x42, 0x3d, 0x96, 0x15, 0x44, 0xed, 0x97, 0x9a, 0x99, 0x68, 0x02, 0x2c, 0x79\ndb 0x8f, 0xcc, 0xff, 0x83, 0x5e, 0x6e, 0x97, 0x00, 0x50, 0x83, 0xc2, 0x29, 0x2b, 0x27, 0xe6, 0x4f\ndb 0x18, 0xb0, 0x45, 0xa9, 0xf8, 0x30, 0x35, 0x7f, 0x20, 0xdd, 0xd7, 0x07, 0x32, 0x55, 0x95, 0x4a\ndb 0xf3, 0xf5, 0x35, 0x5b, 0xac, 0xef, 0xfa, 0xbb, 0x54, 0xba, 0x4d, 0x79, 0x66, 0xce, 0x38, 0x5e\ndb 0x23, 0xd7, 0x1b, 0x03, 0x37, 0x74, 0xa7, 0xe0, 0xb1, 0x2c, 0xe5, 0xa4, 0x00, 0x36, 0x9a, 0xe9\ndb 0x36, 0xd4, 0x3e, 0x35, 0x37, 0xb2, 0xc1, 0x71, 0x90, 0x80, 0x3b, 0xd8, 0x6b, 0x7e, 0x79, 0x0a\ndb 0x7d, 0xe3, 0x3d, 0xc8, 0xd3, 0xb3, 0x56, 0xb6, 0xef, 0x73, 0x3d, 0x24, 0x07, 0x0e, 0xeb, 0x8e\ndb 0x9b, 0x25, 0xaf, 0x3b, 0xa3, 0x92, 0xf5, 0x19, 0x16, 0xba, 0x1f, 0x6f, 0x92, 0x4b, 0x3f, 0x3c\ndb 0xc8, 0xac, 0xdd, 0x70, 0xc6, 0x3b, 0x45, 0x0b, 0xa5, 0xe0, 0x8f, 0xa4, 0xd6, 0x56, 0xd8, 0xb9\ndb 0xc1, 0x1a, 0x53, 0x76, 0x37, 0x60, 0xc9, 0xf4, 0xc8, 0x0a, 0x17, 0x6d, 0x1d, 0xb8, 0x8e, 0xec\ndb 0xa8, 0x9c, 0x71, 0x08, 0x1f, 0x45, 0x96, 0xc8, 0xed, 0x1e, 0x47, 0x09, 0xbb, 0xe6, 0xee, 0x36\ndb 0x8e, 0x87, 0xc6, 0xeb, 0xe5, 0x88, 0xd8, 0xab, 0x98, 0x41, 0x4f, 0x2a, 0x49, 0x15, 0x68, 0xf6\ndb 0x51, 0xaf, 0xc7, 0x74, 0x7c, 0xaa, 0x26, 0x1a, 0x2f, 0xe6, 0x96, 0x86, 0x7c, 0x00, 0xa4, 0x57\ndb 0x90, 0x1f, 0x83, 0x02, 0x0c, 0xb2, 0xec, 0x27, 0x7f, 0xbc, 0x78, 0x11, 0x64, 0xbe, 0x34, 0x25\ndb 0xbd, 0xf8, 0x56, 0x00, 0x5f, 0xdd, 0x85, 0x95, 0x23, 0xad, 0xe9, 0x26, 0x1e, 0xd3, 0xfc, 0x22\ndb 0xe6, 0x35, 0x07, 0xbc, 0xf6, 0x88, 0x19, 0x61, 0x2e, 0xd5, 0x0d, 0xc0, 0x98, 0x79, 0x59, 0x0a\ndb 0x33, 0x44, 0xa8, 0x70, 0xd8, 0xda, 0x45, 0x72, 0xdb, 0x83, 0xf7, 0xbe, 0xbb, 0x93, 0xc9, 0xaa\ndb 0xf5, 0xfb, 0xdc, 0x0a, 0x55, 0x54, 0xd1, 0xae, 0x9e, 0x14, 0x38, 0x24, 0x06, 0x6e, 0x4d, 0x17\ndb 0xaa, 0xb1, 0xe4, 0x55, 0x9b, 0x7c, 0xc2, 0xe7, 0xb6, 0x82, 0x1b, 0x5d, 0x21, 0x20, 0xfc, 0x34\ndb 0x51, 0xf7, 0xfd, 0x20, 0x17, 0x4b, 0xd1, 0x9f, 0xc7, 0x2a, 0x57, 0x62, 0x4a, 0x60, 0x3f, 0xfa\ndb 0x70, 0x75, 0x1a, 0x3e, 0x9d, 0xbd, 0x6c, 0xe3, 0x60, 0xc3, 0xd3, 0xa6, 0x3b, 0x73, 0xa5, 0x4f\ndb 0x06, 0x79, 0xf4, 0x6e, 0x3a, 0xae, 0xa4, 0x98, 0x86, 0xb9, 0x1b, 0x8b, 0x66, 0xd9, 0x96, 0xdb\ndb 0xa5, 0x47, 0xd3, 0xa8, 0x05, 0x3c, 0x50, 0x57, 0x8a, 0x8f, 0xe0, 0x7f, 0xaf, 0x75, 0x30, 0x44\ndb 0x01, 0xce, 0x17, 0xb8, 0x89, 0xd4, 0x12, 0xaa, 0xe5, 0x2e, 0xe2, 0x75, 0x70, 0x06, 0x02, 0x5c\ndb 0xbd, 0x85, 0xaa, 0x75, 0x02, 0x98, 0xe0, 0x0f, 0xe9, 0x94, 0x43, 0x84, 0x8c, 0xca, 0xc1, 0x53\ndb 0x2f, 0x5c, 0x9a, 0x04, 0x9c, 0x2c, 0x50, 0xc7, 0x6d, 0x13, 0x70, 0x8f, 0x7d, 0xa5, 0x09, 0xc0\ndb 0x2b, 0x75, 0x55, 0x57, 0xc0, 0x51, 0xad, 0x86, 0x18, 0xc5, 0x9a, 0x9f, 0x1d, 0x99, 0x3e, 0xbd\ndb 0x38, 0x24, 0x33, 0xd6, 0x04, 0x98, 0xde, 0x19, 0xcc, 0xb3, 0x72, 0x53, 0x6b, 0xbb, 0x38, 0x03\ndb 0xdc, 0x86, 0xe3, 0x1b, 0x12, 0x04, 0x86, 0x92, 0x3d, 0x3f, 0xf4, 0x4d, 0x73, 0x8a, 0xe7, 0x67\ndb 0x68, 0xae, 0x63, 0x13, 0x7b, 0x48, 0x90, 0xce, 0x35, 0xfb, 0xf3, 0x46, 0x17, 0xb3, 0xcd, 0x2f\ndb 0xeb, 0xb5, 0x7a, 0x11, 0xa9, 0xe1, 0xa6, 0xab, 0x0c, 0x9e, 0x9f, 0xd1, 0x08, 0xae, 0xc1, 0x68\ndb 0xd2, 0xfc, 0x41, 0x36, 0xa8, 0xf4, 0x97, 0xbf, 0x86, 0x61, 0x90, 0x51, 0x02, 0x2e, 0x9a, 0x64\ndb 0x4e, 0xfb, 0xd1, 0xe5, 0x73, 0x24, 0x07, 0xb5, 0x70, 0xa1, 0xa2, 0xb7, 0xcb, 0x0c, 0xbc, 0x1a\ndb 0x4a, 0x55, 0x9e, 0x3f, 0x3b, 0xdb, 0x33, 0x4c, 0x01, 0x63, 0x1f, 0xbe, 0xae, 0x05, 0x3e, 0x45\ndb 0x9e, 0xcf, 0x2e, 0x5f, 0x3b, 0x83, 0x8a, 0xc7, 0xd7, 0x39, 0x3b, 0xfc, 0x54, 0xf0, 0x10, 0x42\ndb 0x9d, 0x5e, 0x12, 0xc2, 0xb8, 0x8c, 0x4e, 0x26, 0xd7, 0xa0, 0xa1, 0x7a, 0xc0, 0x27, 0x72, 0x52\ndb 0xdb, 0xc5, 0xed, 0xe1, 0x86, 0x19, 0x0a, 0xff, 0x43, 0x3d, 0x1c, 0x12, 0xb2, 0xbe, 0x5c, 0x12\ndb 0x4b, 0xbf, 0xff, 0x20, 0xe3, 0xde, 0x4a, 0x74, 0x89, 0x67, 0x42, 0xc3, 0xaf, 0xe3, 0x8a, 0x8a\ndb 0x57, 0x88, 0xdf, 0xbe, 0x1a, 0x0c, 0x58, 0xa1, 0xfe, 0x21, 0x57, 0x97, 0xf6, 0xef, 0xba, 0x34\ndb 0x54, 0x60, 0x00, 0x71, 0x09, 0x4a, 0x5b, 0x89, 0x61, 0x4a, 0x67, 0x19, 0x34, 0x44, 0x83, 0x21\ndb 0x3d, 0xeb, 0x67, 0xff, 0xf7, 0x68, 0xbb, 0x29, 0xa0, 0x74, 0x5e, 0xad, 0x78, 0xb4, 0x11, 0xc5\ndb 0x5e, 0x0e, 0xc0, 0xd4, 0xe7, 0x50, 0x40, 0xa1, 0xb5, 0x98, 0xdb, 0x75, 0x1f, 0xa5, 0xbc, 0x1b\ndb 0xeb, 0x13, 0x18, 0x0e, 0x92, 0x54, 0x17, 0x2d, 0x5b, 0xf8, 0x09, 0x50, 0x27, 0x49, 0xf5, 0x01\ndb 0xb9, 0x51, 0xd1, 0x85, 0x34, 0x67, 0xd8, 0xb9, 0x5f, 0x01, 0x7b, 0xfc, 0xe7, 0x1e, 0xc8, 0xfc\ndb 0x2f, 0xda, 0x81, 0xfd, 0x76, 0x69, 0x5b, 0x47, 0x98, 0x1b, 0x9b, 0xee, 0x9b, 0x18, 0x8e, 0x30\ndb 0x85, 0x9d, 0x45, 0xde, 0xa8, 0x9b, 0x4e, 0x57, 0x26, 0x90, 0x0b, 0x9a, 0xe0, 0xf7, 0xfa, 0x08\ndb 0x1d, 0xe3, 0xca, 0xb8, 0xaa, 0xda, 0x4e, 0xe3, 0xb6, 0x33, 0x05, 0x9a, 0x75, 0x70, 0x18, 0x86\ndb 0x60, 0x31, 0xc1, 0x05, 0x56, 0x02, 0x30, 0xbd, 0xff, 0x3b, 0xa9, 0xca, 0xe4, 0x84, 0xe6, 0x96\ndb 0x47, 0xcf, 0x8b, 0xa8, 0xd4, 0x63, 0x8f, 0x8f, 0x55, 0x4a, 0xbc, 0x4c, 0x3c, 0x61, 0x96, 0x38\ndb 0xcc, 0x10, 0x7e, 0x4e, 0x5c, 0x97, 0xd3, 0x54, 0x22, 0xde, 0xfb, 0x03, 0x81, 0x4e, 0x6d, 0x76\ndb 0xb5, 0xab, 0x8f, 0xba, 0xf5, 0xf0, 0x1a, 0xf9, 0x69, 0x64, 0x30, 0xb3, 0x19, 0x30, 0x54, 0x97\ndb 0x14, 0x66, 0x5c, 0xcf, 0x48, 0x0f, 0x74, 0xf3, 0xbe, 0x16, 0x10, 0x6c, 0xb4, 0x93, 0x86, 0xd1\ndb 0x21, 0xd0, 0x6a, 0x12, 0x35, 0x03, 0x45, 0x99, 0xaa, 0xe1, 0x0a, 0xd9, 0x58, 0x83, 0x2f, 0x97\ndb 0xcb, 0x0d, 0x81, 0x4b, 0x82, 0x01, 0x6f, 0xd6, 0x20, 0xee, 0xf3, 0xbf, 0xdc, 0x3d, 0x67, 0x6c\ndb 0xa5, 0x7c, 0x6d, 0x21, 0x09, 0x99, 0x2e, 0x0a, 0x98, 0x7c, 0x50, 0x56, 0x19, 0x54, 0xcc, 0x79\ndb 0xe1, 0x84, 0x18, 0x86, 0xf8, 0x5a, 0x1b, 0xf7, 0x1f, 0x38, 0xe0, 0x3a, 0xb9, 0x50, 0xc1, 0xf1\ndb 0xbe, 0x66, 0x89, 0xe2, 0x68, 0x4a, 0x11, 0x0b, 0xfb, 0x84, 0x02, 0x38, 0x31, 0xf4, 0xda, 0x50\ndb 0xb6, 0x5f, 0x27, 0x62, 0xc7, 0x5a, 0x0f, 0x99, 0xb7, 0x7e, 0x4a, 0x49, 0xe9, 0x67, 0xe0, 0xa5\ndb 0x0d, 0x08, 0x95, 0xf0, 0xe4, 0x3b, 0x62, 0x30, 0x2b, 0x89, 0x21, 0xdd, 0x52, 0x99, 0x12, 0x16\ndb 0x83, 0x94, 0x6a, 0x38, 0x1f, 0x8d, 0x81, 0xbf, 0x1f, 0xf9, 0xe0, 0x9c, 0x80, 0xcc, 0x7c, 0xfe\ndb 0x33, 0x35, 0x27, 0x26, 0xca, 0xcc, 0x1f, 0x43, 0xcd, 0xb0, 0x74, 0x0e, 0xff, 0x1c, 0x86, 0x43\ndb 0xab, 0x44, 0xbc, 0x31, 0xff, 0xa4, 0x54, 0x95, 0xd4, 0x79, 0x9e, 0xc0, 0xed, 0x87, 0x1c, 0x2e\ndb 0x50, 0x47, 0xad, 0xc0, 0x2f, 0x5e, 0x8c, 0x15, 0xfb, 0x86, 0x2c, 0xa5, 0x61, 0x2a, 0x60, 0x12\ndb 0xbc, 0x1f, 0x84, 0xe9, 0x75, 0x55, 0x7e, 0x2c, 0x11, 0xd0, 0xfc, 0x66, 0x89, 0x86, 0x2f, 0x26\ndb 0x43, 0x1e, 0xa6, 0x6c, 0xa6, 0x40, 0xa9, 0x37, 0x65, 0x99, 0x72, 0xe1, 0x1a, 0xdc, 0x23, 0x53\ndb 0x09, 0x8e, 0xa1, 0xd6, 0xda, 0xd9, 0x95, 0xaf, 0x58, 0xe0, 0x2a, 0x4a, 0xd3, 0xbd, 0xbd, 0x86\n\n"
  },
  {
    "path": "unittests/ASM/full_vpblendw_imm.asm",
    "content": "%ifdef CONFIG\n{\n  \"HostFeatures\": [\"AVX\"],\n  \"RegData\": {\n    \"RAX\": \"0x00000000f7e7c074\"\n  }\n}\n%endif\n\nmov rax, 0\n\n%assign i 0\n%rep 256\n\n; vpblendw all the immediate encodings\nvmovaps ymm0, [rel .random_data + ((i * 32) % 4096)]\nvmovaps ymm1, [rel .random_data2 + ((i * 32) % 4096)]\nvmovaps ymm2, [rel .random_data3 + ((i * 32) % 4096)]\n\nvpblendw ymm0, ymm1, ymm2, i\nvmovaps [rel .data_result + (i * 32)], ymm0\n\n; CRC32 (by 64) the results\ncrc32 rax, qword [rel .data_result + (i * 32) + 0]\ncrc32 rax, qword [rel .data_result + (i * 32) + 8]\ncrc32 rax, qword [rel .data_result + (i * 32) + 16]\ncrc32 rax, qword [rel .data_result + (i * 32) + 24]\n%assign i i+1\n%endrep\n\nhlt\nalign 32\n\n.data_result:\ntimes 256 dq 0, 0, 0, 0\n\nalign 32\n; 8192 bytes of random data.\n.random_data:\ndb 0x5b, 0x27, 0x12, 0x29, 0xab, 0x84, 0xa2, 0x21, 0x6d, 0x27, 0xbe, 0x3d, 0x17, 0x05, 0x99, 0xb0\ndb 0xf3, 0xe2, 0x19, 0xf4, 0x42, 0xbb, 0x69, 0x02, 0x67, 0x3a, 0xab, 0x86, 0x9e, 0xda, 0x9f, 0xd5\ndb 0xba, 0xd4, 0x2d, 0x9d, 0x20, 0x3d, 0xf8, 0xb2, 0x29, 0xc3, 0xc3, 0x98, 0xa8, 0x30, 0x92, 0xe9\ndb 0x5a, 0x75, 0x0c, 0xcb, 0x28, 0x28, 0xb4, 0x90, 0x93, 0x16, 0x45, 0x10, 0x3a, 0x5d, 0x96, 0x67\ndb 0xf9, 0x31, 0xbe, 0x48, 0x78, 0xe8, 0x5a, 0xf2, 0x66, 0x29, 0xd9, 0x80, 0x50, 0x80, 0xcb, 0x07\ndb 0xfe, 0xda, 0x19, 0x0f, 0x22, 0xea, 0x18, 0x5e, 0x12, 0xea, 0x3d, 0x1a, 0xbc, 0x91, 0x51, 0x15\ndb 0xaa, 0x66, 0x92, 0x61, 0xb4, 0xd4, 0xce, 0x14, 0x9c, 0x86, 0x27, 0x3d, 0xd0, 0xc6, 0x51, 0x1c\ndb 0xa0, 0xd4, 0x0b, 0x2d, 0x25, 0x30, 0x3b, 0x46, 0x23, 0x07, 0xb5, 0x05, 0x4a, 0xaa, 0x5a, 0x0a\ndb 0x7b, 0x29, 0xe4, 0x52, 0x6f, 0x6f, 0xc8, 0x62, 0xb8, 0x94, 0x6a, 0x30, 0x66, 0xf1, 0x21, 0xec\ndb 0xd1, 0xf2, 0x68, 0xda, 0xb7, 0x7f, 0x5a, 0x26, 0x38, 0x46, 0x48, 0xda, 0x5d, 0x64, 0x8d, 0x3d\ndb 0x2f, 0xf6, 0xc3, 0x63, 0xb8, 0x09, 0x3a, 0xd0, 0x5b, 0xeb, 0x67, 0xd0, 0xaa, 0x63, 0x71, 0x19\ndb 0x7e, 0x4e, 0x33, 0xe2, 0x15, 0xba, 0x87, 0xa7, 0x7b, 0x25, 0xe4, 0xbb, 0xb5, 0x26, 0x9a, 0xf1\ndb 0xdd, 0x5a, 0x63, 0xd7, 0x16, 0xc0, 0xc3, 0xc8, 0x1b, 0xad, 0x00, 0x52, 0x63, 0x55, 0xc7, 0xe0\ndb 0xd9, 0xe9, 0xf4, 0x4c, 0x53, 0xfb, 0x73, 0x57, 0xdc, 0xad, 0x0c, 0xca, 0x73, 0x44, 0x6b, 0xf3\ndb 0xb7, 0x83, 0x3b, 0xfe, 0xf0, 0x15, 0xbf, 0xe5, 0x15, 0xca, 0xdf, 0x35, 0xeb, 0xe7, 0xe3, 0xa2\ndb 0xbd, 0x20, 0xad, 0xff, 0x1b, 0x67, 0x0a, 0x9f, 0x60, 0x60, 0xff, 0xa7, 0xc9, 0x19, 0xde, 0xb3\ndb 0x67, 0xf1, 0x4b, 0x77, 0x7f, 0x0b, 0xb1, 0x29, 0xee, 0xcb, 0xd6, 0x5d, 0x0d, 0xb9, 0x54, 0x49\ndb 0x10, 0xe3, 0xbd, 0x8a, 0xa0, 0x69, 0xa3, 0x07, 0xbe, 0x8e, 0xea, 0xc6, 0x75, 0x27, 0x66, 0xae\ndb 0x3c, 0xde, 0xc6, 0x13, 0x1b, 0x50, 0x37, 0x56, 0x7c, 0x01, 0xab, 0x8b, 0x46, 0xdc, 0x80, 0xed\ndb 0xdf, 0x12, 0x6f, 0x64, 0xdf, 0xe6, 0xf9, 0xbf, 0x15, 0x95, 0xd9, 0x80, 0x19, 0x8c, 0x96, 0x33\ndb 0x89, 0xbe, 0x25, 0x33, 0x34, 0x82, 0x92, 0x96, 0x05, 0x52, 0xa2, 0xcf, 0x5b, 0x3d, 0xfc, 0xd8\ndb 0x43, 0x89, 0x2e, 0x16, 0x6d, 0xbd, 0x84, 0x97, 0x77, 0xb5, 0xd6, 0x2b, 0x6b, 0xb1, 0xc6, 0x38\ndb 0x0a, 0xfe, 0xe1, 0xc9, 0x31, 0x32, 0x7f, 0xd5, 0xc1, 0x03, 0x4a, 0xb2, 0x86, 0x4d, 0x8d, 0x77\ndb 0xd6, 0x62, 0x52, 0x75, 0xed, 0x27, 0x21, 0xe8, 0x69, 0x6f, 0x6a, 0x5b, 0x59, 0x4d, 0xd2, 0x6c\ndb 0x2a, 0x97, 0x09, 0x03, 0xc5, 0x29, 0x0d, 0xe1, 0x31, 0x2e, 0x62, 0x21, 0x0e, 0xc2, 0x00, 0x7c\ndb 0xa2, 0x4c, 0x19, 0x63, 0x24, 0xfc, 0x9b, 0x38, 0x11, 0xbf, 0x20, 0x53, 0x53, 0xac, 0x3f, 0xdb\ndb 0xfd, 0x2b, 0x39, 0x3c, 0x39, 0x6b, 0xb4, 0x52, 0x1f, 0xf8, 0x8f, 0x3b, 0x47, 0x2b, 0x86, 0xcf\ndb 0xd2, 0x38, 0xe9, 0x08, 0x73, 0x09, 0x32, 0x5f, 0x6c, 0x3a, 0xdb, 0xfc, 0x1d, 0x91, 0xa4, 0x26\ndb 0xa3, 0x0c, 0xbc, 0x94, 0xf5, 0xbd, 0x29, 0xcf, 0x72, 0x3d, 0xee, 0x48, 0x06, 0x77, 0x63, 0x70\ndb 0x47, 0xc9, 0x87, 0x21, 0xb1, 0x9a, 0xdd, 0x5f, 0x71, 0x08, 0xe3, 0x3b, 0xf6, 0x07, 0x9f, 0x2f\ndb 0x20, 0xa3, 0x02, 0xc8, 0x4d, 0xc8, 0x18, 0xfa, 0x69, 0x32, 0x60, 0x97, 0x2d, 0x2f, 0x26, 0x84\ndb 0x3d, 0x7a, 0xf6, 0x2f, 0xb1, 0xc9, 0xd2, 0xcd, 0x6e, 0x24, 0x18, 0xa8, 0x0d, 0xb0, 0xe2, 0x41\ndb 0x1e, 0xdf, 0xc7, 0xee, 0xcd, 0x21, 0x5b, 0xc3, 0x26, 0x26, 0xb3, 0xb4, 0x33, 0x58, 0x79, 0xb5\ndb 0xc3, 0x24, 0x7c, 0xe3, 0xd7, 0x78, 0x33, 0x22, 0xd5, 0x20, 0x21, 0x86, 0xcf, 0xca, 0x44, 0xba\ndb 0xd8, 0x05, 0x84, 0x37, 0x69, 0x48, 0xb0, 0xe0, 0x7a, 0xe6, 0x74, 0x53, 0x1e, 0xd0, 0x0c, 0x3c\ndb 0x33, 0x83, 0x15, 0x43, 0x16, 0x0e, 0x93, 0x39, 0x55, 0x2e, 0x55, 0x1c, 0x09, 0xbd, 0x7a, 0xc3\ndb 0x80, 0x77, 0x4e, 0xd9, 0xf3, 0xa5, 0xee, 0x94, 0xbf, 0x8e, 0xd0, 0xec, 0x39, 0x33, 0x31, 0x8d\ndb 0x74, 0x94, 0xd2, 0x24, 0x22, 0x4a, 0xde, 0x51, 0x99, 0xc5, 0x68, 0xf2, 0x2e, 0xd3, 0x8d, 0xc5\ndb 0x32, 0x31, 0x26, 0xe7, 0x87, 0x47, 0x5f, 0xbc, 0x32, 0x80, 0x43, 0x83, 0x34, 0x36, 0xa1, 0x72\ndb 0x6b, 0x38, 0x10, 0x93, 0xa7, 0xa3, 0x92, 0xb7, 0x3c, 0x61, 0x1c, 0x4e, 0x0b, 0x86, 0x43, 0xa9\ndb 0x64, 0xf1, 0xf8, 0xd7, 0xd3, 0xf4, 0xd0, 0xe2, 0x17, 0xd4, 0xbb, 0xe9, 0x2c, 0xc8, 0x76, 0xc5\ndb 0x87, 0x7f, 0x81, 0x55, 0xbe, 0x87, 0x0e, 0x6b, 0xf6, 0x4f, 0x44, 0x37, 0x92, 0x32, 0x7f, 0x30\ndb 0xa6, 0x66, 0x09, 0x01, 0x7a, 0x6e, 0xb3, 0x3b, 0x7d, 0x8f, 0x32, 0x0e, 0x3c, 0xdc, 0xba, 0x2e\ndb 0xf8, 0xec, 0xde, 0xd9, 0xb1, 0xf0, 0x3e, 0xbd, 0x20, 0x4d, 0x01, 0x5a, 0xf4, 0xda, 0x99, 0x23\ndb 0x81, 0x01, 0x5f, 0x50, 0xce, 0xa8, 0xb9, 0xb1, 0x59, 0xe5, 0xde, 0x47, 0x5b, 0xba, 0x94, 0xd3\ndb 0x21, 0x7c, 0x49, 0xeb, 0xb5, 0x14, 0xe5, 0x56, 0x93, 0x06, 0x3b, 0xd2, 0x3a, 0x11, 0xca, 0x7a\ndb 0x14, 0x48, 0x54, 0xc7, 0x9f, 0x03, 0x40, 0x2c, 0x0b, 0x42, 0x8e, 0xac, 0xac, 0x08, 0x04, 0x8e\ndb 0xb3, 0x15, 0xe5, 0x06, 0xa6, 0x5b, 0xf0, 0x57, 0x08, 0xfa, 0x0f, 0x00, 0x7e, 0x4a, 0x16, 0xa8\ndb 0xb0, 0x4d, 0x07, 0x1b, 0xbc, 0x3d, 0xd0, 0x86, 0x15, 0xcd, 0x7c, 0xb2, 0xcc, 0x37, 0x6d, 0x15\ndb 0x8b, 0xd1, 0xe6, 0x3e, 0xfb, 0x6e, 0xe4, 0xea, 0xd9, 0x1f, 0x69, 0x2a, 0xbc, 0xda, 0xd9, 0x78\ndb 0xee, 0xcb, 0xb6, 0xff, 0x53, 0xfd, 0xd2, 0xb9, 0x18, 0x1f, 0xdf, 0x0e, 0x69, 0xfe, 0x36, 0xb0\ndb 0x77, 0x28, 0x66, 0xe2, 0xf0, 0x80, 0x4c, 0x11, 0x11, 0xba, 0xb7, 0xfd, 0x67, 0x4f, 0x05, 0xed\ndb 0x0c, 0xcc, 0x3e, 0x4d, 0xd9, 0xbc, 0x52, 0xe3, 0xec, 0xd9, 0x74, 0x29, 0x30, 0xf2, 0x66, 0xd6\ndb 0xfb, 0xc3, 0x5c, 0xc1, 0xd8, 0xef, 0x86, 0x08, 0x22, 0xb1, 0x6d, 0xfd, 0xee, 0xc7, 0x12, 0x25\ndb 0xda, 0xee, 0xd6, 0x28, 0x3b, 0x1d, 0xa7, 0x29, 0xdf, 0x45, 0x3a, 0xa4, 0x36, 0xe0, 0xa4, 0xda\ndb 0xb1, 0x2c, 0x8a, 0xa5, 0x5c, 0x8c, 0x70, 0xd8, 0xcd, 0x0f, 0xb5, 0x63, 0xd3, 0xaf, 0x59, 0x2b\ndb 0x7d, 0x86, 0x4a, 0xc4, 0xcc, 0x72, 0x9e, 0x89, 0xf4, 0x38, 0x89, 0x81, 0x64, 0x6f, 0xa5, 0xac\ndb 0x13, 0x59, 0xc4, 0x0f, 0xfb, 0xcc, 0x4c, 0x1d, 0x67, 0x5a, 0xbf, 0x19, 0xfc, 0x06, 0x71, 0xbd\ndb 0x7f, 0xb6, 0xb1, 0x95, 0xd3, 0x7b, 0x4c, 0x40, 0x91, 0xa9, 0x26, 0xdd, 0x28, 0x69, 0x90, 0xf6\ndb 0x5d, 0x16, 0x9f, 0xa9, 0x75, 0x5e, 0xad, 0x8f, 0xc8, 0x0b, 0x57, 0x48, 0xf2, 0x74, 0x77, 0x22\ndb 0x5d, 0xed, 0xc2, 0x79, 0x27, 0x46, 0x0c, 0x9e, 0x6f, 0x9a, 0x9a, 0xdc, 0xe0, 0x3d, 0x24, 0xc9\ndb 0xce, 0xf3, 0x34, 0x66, 0x45, 0x07, 0x0b, 0x83, 0x8c, 0xb7, 0xd9, 0x1e, 0xac, 0xc6, 0xf7, 0xef\ndb 0xe7, 0xd1, 0xbc, 0xa3, 0x21, 0x85, 0x3d, 0x25, 0x90, 0x24, 0x48, 0xb1, 0x00, 0xb0, 0xd2, 0xa6\ndb 0xd8, 0x4e, 0x46, 0x7c, 0xc4, 0x79, 0x40, 0x95, 0x81, 0xb4, 0xb9, 0xa8, 0x70, 0xf0, 0x12, 0xd6\ndb 0xdc, 0xb2, 0x7c, 0x0f, 0x47, 0xad, 0x7d, 0x46, 0x78, 0x18, 0x6e, 0xdd, 0x5f, 0xe5, 0xd7, 0x63\ndb 0x11, 0xf0, 0x5b, 0xa0, 0x48, 0x15, 0xe2, 0x55, 0xc6, 0x7f, 0xf4, 0x2e, 0x0e, 0x49, 0x39, 0x65\ndb 0x3e, 0x69, 0xc1, 0x27, 0x39, 0xb3, 0x10, 0x1b, 0xf2, 0x35, 0x88, 0x0c, 0x1b, 0xac, 0x4a, 0x15\ndb 0x31, 0x81, 0x63, 0xe5, 0x3d, 0x56, 0x6f, 0x34, 0x06, 0x5b, 0x1d, 0xa0, 0xea, 0x0c, 0x92, 0x6a\ndb 0x22, 0x2b, 0x2d, 0xbb, 0xaf, 0xc5, 0x6d, 0x44, 0x1b, 0xb0, 0x69, 0x06, 0x27, 0x54, 0xa5, 0x7f\ndb 0x07, 0xd4, 0xdc, 0xe5, 0x5c, 0x78, 0x9e, 0xf7, 0x4a, 0x47, 0x9b, 0x21, 0xf6, 0x87, 0x89, 0xad\ndb 0xec, 0xe4, 0xd6, 0x83, 0xd3, 0x7b, 0x34, 0x00, 0x0b, 0x75, 0xba, 0x4c, 0x0f, 0x46, 0xd2, 0x0c\ndb 0x58, 0x1b, 0x0f, 0x19, 0xb5, 0xf5, 0xba, 0x8f, 0xbd, 0x17, 0x51, 0xaf, 0xa6, 0x1a, 0x97, 0x8c\ndb 0x44, 0x30, 0x7c, 0x73, 0x50, 0xca, 0x05, 0xe8, 0x3e, 0x19, 0x4a, 0x5a, 0x6b, 0x4d, 0x01, 0x05\ndb 0xea, 0x1b, 0x70, 0xb6, 0xe6, 0x39, 0x5d, 0x99, 0x3b, 0xae, 0xed, 0x7c, 0xa6, 0xc7, 0x29, 0x6f\ndb 0xeb, 0x0a, 0xba, 0x03, 0xd3, 0xba, 0x62, 0x21, 0xa0, 0xb7, 0xb5, 0xbf, 0x40, 0xb8, 0x4e, 0xc3\ndb 0x89, 0xa0, 0xa9, 0xe8, 0xc8, 0x2b, 0xfd, 0x23, 0x32, 0x53, 0xe5, 0x35, 0xc1, 0x23, 0x97, 0xc1\ndb 0x87, 0x10, 0x41, 0x21, 0xb3, 0xf6, 0x53, 0xcf, 0x28, 0x47, 0x9c, 0x69, 0x42, 0xcf, 0x0e, 0x11\ndb 0x69, 0x7f, 0xc6, 0xdf, 0xc3, 0xbf, 0x04, 0x7f, 0x3a, 0xc6, 0xa1, 0x3d, 0xc6, 0x5b, 0x56, 0x8b\ndb 0x52, 0x23, 0x41, 0xd7, 0x35, 0x7f, 0x86, 0xd2, 0x59, 0xcf, 0xae, 0x28, 0xa3, 0xa2, 0x23, 0x4b\ndb 0x78, 0x78, 0x94, 0x3f, 0x2f, 0xf0, 0xb8, 0x94, 0xa2, 0x62, 0xb9, 0x83, 0xc7, 0x5f, 0x64, 0x45\ndb 0x54, 0xaf, 0x43, 0x93, 0x7f, 0xa1, 0xe8, 0x71, 0x38, 0xc8, 0x21, 0xf4, 0xa6, 0xab, 0x2b, 0xd3\ndb 0x44, 0xa2, 0x74, 0x94, 0x99, 0x3f, 0x56, 0xbc, 0x0a, 0x12, 0xe7, 0x6e, 0x1b, 0x7f, 0x98, 0xad\ndb 0x28, 0xa6, 0xc8, 0x87, 0x7a, 0x88, 0xcb, 0xcf, 0x9f, 0x95, 0xa7, 0xf1, 0x66, 0xfe, 0x43, 0x3d\ndb 0x71, 0x5b, 0x3a, 0xb7, 0xe4, 0xa8, 0x6f, 0x46, 0xa1, 0xaa, 0x66, 0xd2, 0x9e, 0x84, 0xfd, 0x42\ndb 0x98, 0x17, 0x3e, 0xde, 0xaa, 0x18, 0xc9, 0x9c, 0x53, 0x88, 0x2b, 0x92, 0xce, 0x00, 0x8b, 0xb4\ndb 0x15, 0x7a, 0x39, 0xb7, 0x57, 0xf9, 0xf2, 0x17, 0x0a, 0x8c, 0x05, 0x7b, 0x3f, 0x2a, 0xb0, 0xb7\ndb 0x8a, 0xbb, 0x9a, 0x0d, 0xe4, 0x0d, 0x6a, 0xbd, 0x8a, 0xe9, 0xbd, 0xca, 0xb2, 0x6a, 0xbe, 0x76\ndb 0x2c, 0xbe, 0x45, 0x3f, 0x22, 0x03, 0xb1, 0xab, 0x2d, 0xe0, 0x70, 0x52, 0xe5, 0x27, 0x8e, 0xbc\ndb 0xa9, 0x8d, 0x13, 0xf4, 0xe5, 0xd7, 0xeb, 0x4e, 0x30, 0x3f, 0x76, 0x3b, 0x64, 0xad, 0x57, 0x53\ndb 0x91, 0x89, 0xf4, 0x9a, 0xd1, 0x38, 0x3d, 0x58, 0xdc, 0x83, 0x65, 0x4a, 0x36, 0x30, 0x73, 0x92\ndb 0x8c, 0x2f, 0x7d, 0x1e, 0x15, 0x3c, 0xca, 0x54, 0x6f, 0x17, 0xbd, 0xba, 0x97, 0x7e, 0x28, 0x11\ndb 0x8e, 0x96, 0x9f, 0x46, 0x84, 0x69, 0xe3, 0xc2, 0x8e, 0x1e, 0xea, 0x6b, 0x17, 0xa7, 0xf8, 0x17\ndb 0xc3, 0xd9, 0x9c, 0x53, 0x79, 0x95, 0x32, 0xf6, 0x78, 0xcd, 0x5d, 0x2f, 0x30, 0x06, 0xe8, 0x9f\ndb 0x5e, 0xb2, 0x4e, 0x56, 0xf5, 0x31, 0xc3, 0x41, 0xae, 0x4b, 0x0a, 0xbd, 0xdc, 0xce, 0xea, 0xfa\ndb 0x27, 0x09, 0x4e, 0xd1, 0x24, 0x14, 0x33, 0x8b, 0x21, 0x48, 0x99, 0x92, 0x07, 0xa4, 0x1a, 0x87\ndb 0x34, 0x15, 0xa6, 0x12, 0x92, 0x3f, 0xf0, 0x3e, 0x18, 0x3c, 0x65, 0x3a, 0x8b, 0x17, 0x9b, 0xf2\ndb 0xd9, 0x93, 0xa0, 0x19, 0x2b, 0x73, 0x59, 0x29, 0x6f, 0xb7, 0x75, 0x4b, 0x42, 0x24, 0x43, 0xa4\ndb 0x20, 0xd8, 0x59, 0x8d, 0x9f, 0xd6, 0x64, 0xa1, 0xeb, 0xe3, 0x65, 0x82, 0x69, 0x74, 0x1a, 0x2b\ndb 0x8d, 0x9a, 0x59, 0x5d, 0x47, 0x75, 0x63, 0xcd, 0xe4, 0x14, 0x48, 0x5f, 0x67, 0x00, 0x12, 0x3c\ndb 0x58, 0x27, 0x5e, 0x83, 0xde, 0xd8, 0x97, 0xd9, 0x09, 0xd9, 0x06, 0x64, 0x96, 0x67, 0xb4, 0x4f\ndb 0xb9, 0x58, 0x87, 0xc9, 0xb1, 0xdd, 0x64, 0x8f, 0x4e, 0x8f, 0xa9, 0xfa, 0x40, 0xe6, 0x8f, 0xaa\ndb 0x22, 0x26, 0x16, 0x15, 0x6a, 0xa3, 0x88, 0xae, 0xa2, 0xbc, 0xa3, 0xa3, 0x56, 0xa1, 0x74, 0x6c\ndb 0xa2, 0xd0, 0x47, 0x4b, 0x98, 0x0a, 0xea, 0xdd, 0xe8, 0x9c, 0xe1, 0x37, 0x44, 0x1a, 0xc0, 0xc7\ndb 0x83, 0x07, 0x42, 0xca, 0x98, 0x36, 0xd7, 0x43, 0x18, 0x51, 0x32, 0xf6, 0x99, 0x61, 0x73, 0x79\ndb 0x51, 0xc4, 0xe9, 0x5b, 0x9e, 0xa8, 0xb4, 0x28, 0x49, 0xbb, 0x44, 0x90, 0xe2, 0xf7, 0x7e, 0x61\ndb 0x27, 0xbb, 0x85, 0x58, 0xd0, 0xdc, 0x94, 0x53, 0x02, 0x50, 0xfe, 0xc7, 0x37, 0xa2, 0x20, 0x1b\ndb 0x57, 0x00, 0x9b, 0x7c, 0xa4, 0x6c, 0xa6, 0xb1, 0xae, 0xd0, 0x03, 0x67, 0x2b, 0x82, 0xd9, 0x99\ndb 0x76, 0xd0, 0xc7, 0x7d, 0x2d, 0xbd, 0x39, 0x28, 0xcf, 0xe1, 0x13, 0xce, 0x1c, 0xe6, 0x4c, 0xa7\ndb 0x7a, 0x8c, 0x4f, 0xa6, 0x30, 0x77, 0x6b, 0x78, 0x39, 0x6e, 0x10, 0xd1, 0x9c, 0x9a, 0xda, 0x2d\ndb 0xc9, 0xef, 0xd7, 0xb1, 0xb8, 0xdf, 0x21, 0xce, 0x96, 0x53, 0xaa, 0xa6, 0x76, 0x52, 0x56, 0x0e\ndb 0xe6, 0x7f, 0xed, 0x88, 0x15, 0x2a, 0xc1, 0xfe, 0xb3, 0x35, 0x54, 0x09, 0x9b, 0x5d, 0x21, 0x62\ndb 0xc8, 0x6f, 0x2c, 0x6e, 0x56, 0xc8, 0xd9, 0x40, 0x67, 0xeb, 0x26, 0xf5, 0xcb, 0x18, 0xb1, 0x89\ndb 0xfe, 0x58, 0x1a, 0xff, 0x41, 0xb5, 0xd6, 0xe5, 0xb3, 0x82, 0x29, 0x82, 0xee, 0xbb, 0xb2, 0x5a\ndb 0x71, 0xf2, 0xca, 0xf1, 0x2f, 0xa7, 0x4d, 0xb1, 0x5c, 0xbc, 0xc3, 0x1a, 0xb4, 0x20, 0x6a, 0x7e\ndb 0xb9, 0x5e, 0xcb, 0x9b, 0xf3, 0x1c, 0x2b, 0x16, 0xab, 0x15, 0x8d, 0xb5, 0x81, 0xf3, 0xbb, 0xc1\ndb 0x8e, 0x2c, 0xd6, 0xd1, 0xa8, 0x23, 0x3c, 0x98, 0x3f, 0x4e, 0xff, 0x97, 0x77, 0xd1, 0xbd, 0xda\ndb 0xff, 0x9c, 0x55, 0x01, 0x1c, 0x4b, 0x4b, 0x1a, 0xa9, 0x3d, 0xe9, 0xbd, 0x3c, 0x5b, 0xfd, 0x65\ndb 0x34, 0x9c, 0x78, 0x8c, 0x83, 0x46, 0x72, 0xed, 0x66, 0xee, 0x00, 0xac, 0xca, 0x09, 0xaa, 0x3a\ndb 0x2c, 0xc1, 0x7e, 0xde, 0x44, 0xbd, 0xe3, 0x5a, 0x11, 0x41, 0xc7, 0xc8, 0x65, 0x7a, 0xc7, 0xbb\ndb 0x44, 0xad, 0x97, 0x17, 0xe8, 0x9f, 0x29, 0x2b, 0x78, 0x6d, 0x96, 0xb6, 0x9c, 0x3a, 0x6a, 0xc2\ndb 0xab, 0x9a, 0x16, 0x6f, 0x05, 0x78, 0x0d, 0x83, 0xa5, 0x46, 0x8c, 0xd7, 0x57, 0x1e, 0x80, 0x2f\ndb 0x7e, 0x81, 0x68, 0xa4, 0xc4, 0x3d, 0x6c, 0xae, 0x6b, 0x98, 0xb9, 0xe4, 0xb4, 0xfb, 0xf4, 0x19\ndb 0xf9, 0xcd, 0xbb, 0xd0, 0xbc, 0x22, 0xdd, 0x2c, 0xbe, 0x11, 0x01, 0xc2, 0x53, 0xdd, 0xa3, 0x3a\ndb 0xbf, 0x5f, 0x2a, 0x94, 0x8b, 0x58, 0x6e, 0xe3, 0x4e, 0x1b, 0x0d, 0x30, 0x1b, 0x1c, 0x6c, 0x24\ndb 0x0e, 0xd9, 0x1c, 0xe1, 0x4d, 0x42, 0x48, 0xa0, 0x07, 0xb1, 0xe8, 0x10, 0xa1, 0x51, 0x6a, 0x82\ndb 0x2e, 0x99, 0xb3, 0xbf, 0xe3, 0xff, 0x3c, 0x77, 0xf4, 0x0c, 0x1f, 0x22, 0x53, 0xd0, 0x99, 0x60\ndb 0x5d, 0x65, 0x80, 0xb9, 0xa3, 0xb7, 0x25, 0x6d, 0xa6, 0x4f, 0xb5, 0x72, 0xaa, 0x4d, 0x0d, 0x49\ndb 0x4c, 0x34, 0xc5, 0xf4, 0x1b, 0x5c, 0x3f, 0x6c, 0xbb, 0x86, 0xba, 0xc5, 0x32, 0xee, 0x23, 0x95\ndb 0xe5, 0x42, 0x66, 0x92, 0x89, 0x5e, 0xf4, 0xd4, 0x2d, 0x04, 0xf2, 0xbc, 0xd7, 0xc8, 0xc9, 0xd7\ndb 0xe3, 0xdb, 0x4e, 0x4b, 0xda, 0x37, 0x1f, 0xfa, 0x9c, 0xaf, 0x4b, 0x1e, 0xab, 0x64, 0x2a, 0x59\ndb 0x24, 0x0f, 0xb4, 0xaf, 0xd6, 0x32, 0x30, 0xcd, 0x7c, 0xf3, 0x0f, 0xa9, 0xac, 0x3f, 0x55, 0xa2\ndb 0x92, 0x21, 0x58, 0x4e, 0x99, 0xbc, 0x9f, 0xfd, 0x16, 0x7c, 0x4e, 0x5b, 0xb4, 0xc7, 0x5f, 0x8d\ndb 0x0e, 0x26, 0x72, 0x17, 0x02, 0x7d, 0x12, 0xa0, 0xc5, 0xc1, 0x66, 0xd3, 0x19, 0x49, 0x42, 0xfb\ndb 0x18, 0xd7, 0x18, 0x79, 0xd3, 0x32, 0xfc, 0x4a, 0xab, 0x82, 0x72, 0x0a, 0x90, 0xb7, 0xbc, 0x00\ndb 0x16, 0x99, 0xd3, 0x9a, 0x76, 0xc6, 0x44, 0x92, 0x9b, 0x2b, 0x6a, 0x35, 0xca, 0x4e, 0x2e, 0x9c\ndb 0x7f, 0xcb, 0xd3, 0x65, 0x1c, 0xa6, 0x95, 0x2c, 0x3d, 0xe4, 0xd3, 0xe6, 0xe7, 0xe0, 0xde, 0x1e\ndb 0x54, 0xb3, 0x09, 0x3e, 0x34, 0x35, 0x68, 0x53, 0x01, 0x02, 0xf1, 0x4c, 0x89, 0x19, 0xe3, 0xc6\ndb 0x4a, 0x51, 0x49, 0xf5, 0x5f, 0x3e, 0xcd, 0xae, 0x6e, 0xeb, 0x90, 0x1a, 0x53, 0x93, 0x0b, 0xe8\ndb 0xc2, 0x6e, 0xee, 0xf3, 0x38, 0x5d, 0xb8, 0xaf, 0x58, 0x4b, 0xe0, 0xfd, 0x07, 0xcf, 0x15, 0x89\ndb 0x2b, 0x01, 0x35, 0xbb, 0xa0, 0x2f, 0x7e, 0xd3, 0x34, 0x7b, 0x1f, 0x81, 0x12, 0x7f, 0xb0, 0xff\ndb 0xe7, 0xa0, 0xf2, 0xc4, 0x86, 0x98, 0x45, 0xe2, 0xa1, 0x1e, 0x4c, 0xc0, 0x23, 0x05, 0x49, 0x0b\ndb 0x0d, 0xc3, 0x1e, 0x30, 0x20, 0xc6, 0x34, 0xb7, 0xe1, 0x09, 0x84, 0xd5, 0x2a, 0x40, 0x75, 0x9b\ndb 0x46, 0xbb, 0xa5, 0xfe, 0xbd, 0x7d, 0x39, 0xe4, 0x7b, 0x38, 0xdc, 0x9c, 0xaf, 0xc8, 0x12, 0xf4\ndb 0x78, 0xb8, 0x51, 0x4a, 0x21, 0xfe, 0xf9, 0x77, 0xf6, 0xb5, 0xad, 0x69, 0xc9, 0x4d, 0xbf, 0x67\ndb 0xfc, 0x5d, 0x80, 0x7c, 0x76, 0x2c, 0xe5, 0xf2, 0xd7, 0x7f, 0xce, 0xb5, 0x1c, 0x09, 0xa5, 0xc3\ndb 0x98, 0x18, 0x2d, 0x18, 0xfb, 0x61, 0x13, 0xea, 0xbc, 0x87, 0x3a, 0x3f, 0xb4, 0xaf, 0x3c, 0x3b\ndb 0x3b, 0xb6, 0xd2, 0xc7, 0x5c, 0x2c, 0xe1, 0x11, 0xb3, 0x9d, 0xf1, 0x52, 0xba, 0xb5, 0xf0, 0x69\ndb 0xcd, 0xd2, 0x93, 0x9e, 0x80, 0x45, 0x78, 0x17, 0x6d, 0x52, 0x51, 0xad, 0xed, 0x6d, 0x9e, 0x15\ndb 0xca, 0xb1, 0xfe, 0x22, 0x7b, 0x87, 0xb8, 0x40, 0x06, 0x2d, 0xb0, 0xbb, 0x05, 0x7c, 0x52, 0xd2\ndb 0xcd, 0xc8, 0x9c, 0xea, 0xd3, 0x4c, 0xb5, 0x06, 0xb4, 0x70, 0xad, 0x09, 0xa5, 0xb8, 0x66, 0xba\ndb 0x31, 0x0d, 0xe0, 0xe2, 0xcf, 0x62, 0x9f, 0x6d, 0x6d, 0x1a, 0x47, 0x21, 0xd5, 0x33, 0x6b, 0xd7\ndb 0x75, 0xff, 0x98, 0x6c, 0xb2, 0x78, 0x6d, 0x45, 0x50, 0xeb, 0xfb, 0xea, 0xb7, 0x2a, 0x27, 0x02\ndb 0xc4, 0x03, 0xde, 0x56, 0x23, 0x26, 0x10, 0x21, 0x57, 0x9c, 0x3b, 0x4c, 0x79, 0x2c, 0x3e, 0xfe\ndb 0xc8, 0x16, 0xe4, 0xd6, 0x60, 0xb8, 0x46, 0xe3, 0x4b, 0x7e, 0x3d, 0xb3, 0x83, 0x19, 0x54, 0x65\ndb 0x51, 0x7a, 0x81, 0xdd, 0x07, 0x33, 0x92, 0x08, 0x64, 0x0b, 0xc2, 0x06, 0x5c, 0x07, 0x81, 0x40\ndb 0x1b, 0xb4, 0x5a, 0x47, 0x2b, 0xdc, 0x96, 0x98, 0x4c, 0x65, 0xad, 0x8e, 0x8e, 0x77, 0xbe, 0x99\ndb 0x60, 0x4c, 0xb5, 0x6b, 0xed, 0xb7, 0x52, 0x5d, 0x99, 0x2e, 0x93, 0x40, 0xfe, 0x45, 0x83, 0x28\ndb 0x9b, 0x8b, 0x7f, 0x77, 0x2b, 0xdc, 0x61, 0xbe, 0x62, 0x28, 0xe8, 0x23, 0x3f, 0xdb, 0x1d, 0x6d\ndb 0x3b, 0xe8, 0x90, 0x05, 0x12, 0xf2, 0xb4, 0xf0, 0x1b, 0xbb, 0x2f, 0x4b, 0x9e, 0x9f, 0x0e, 0x4e\ndb 0x9e, 0x6a, 0x38, 0x7e, 0x97, 0x13, 0x90, 0x57, 0xb9, 0x49, 0x52, 0xb7, 0x4f, 0xd3, 0xc1, 0x39\ndb 0x95, 0x20, 0xd4, 0x83, 0x48, 0x0e, 0x7a, 0x9d, 0x89, 0x9d, 0xf4, 0xec, 0xe7, 0xcc, 0xde, 0x0a\ndb 0xac, 0xc5, 0xb0, 0x4d, 0xc5, 0x25, 0x74, 0x62, 0x66, 0x51, 0x4f, 0xeb, 0x4e, 0x9d, 0x3d, 0x04\ndb 0x27, 0xec, 0xfe, 0x8d, 0x03, 0x20, 0x38, 0x30, 0x5d, 0xf3, 0xf0, 0x97, 0xbb, 0xa9, 0xd1, 0xea\ndb 0x73, 0x73, 0x40, 0x2c, 0x0b, 0xa7, 0xc9, 0x8d, 0xac, 0x75, 0xc4, 0x46, 0x7c, 0xc2, 0x9a, 0x26\ndb 0x07, 0xae, 0x02, 0x27, 0x42, 0xa8, 0x90, 0xb6, 0x9b, 0x98, 0xec, 0x2e, 0xf6, 0xf6, 0x17, 0xda\ndb 0x9f, 0xfb, 0x54, 0xea, 0xae, 0x96, 0xfe, 0xd6, 0x35, 0x4f, 0x07, 0x9f, 0xf4, 0x57, 0x36, 0xfe\ndb 0xb1, 0x43, 0xee, 0xe3, 0x21, 0x00, 0x43, 0x12, 0xf2, 0xff, 0xa5, 0x37, 0x65, 0x01, 0xf0, 0xb4\ndb 0xe8, 0x68, 0xa3, 0xff, 0x31, 0x5f, 0x3f, 0x56, 0xa5, 0xd2, 0xcc, 0xab, 0xa4, 0x90, 0xf9, 0x98\ndb 0x0b, 0xdc, 0x0d, 0x20, 0x3c, 0x33, 0xda, 0xf1, 0x54, 0xd5, 0x6d, 0xc4, 0xa9, 0xc4, 0x54, 0x29\ndb 0x56, 0x69, 0x96, 0x98, 0x74, 0x13, 0x72, 0x1f, 0x95, 0xe9, 0xe2, 0xab, 0x60, 0x74, 0x91, 0x96\ndb 0xdf, 0xa4, 0xd6, 0x62, 0x3c, 0x35, 0x7e, 0xc4, 0x21, 0x16, 0xa3, 0x32, 0xac, 0x20, 0x52, 0xd4\ndb 0xbb, 0xc2, 0xa5, 0x97, 0x86, 0x4a, 0x55, 0xf4, 0x09, 0xf2, 0x0e, 0xd6, 0x1a, 0xfa, 0x00, 0x67\ndb 0x45, 0x57, 0xb3, 0xaa, 0xe5, 0x7c, 0x17, 0x8d, 0xde, 0x75, 0xd7, 0x49, 0x6e, 0xb0, 0xb2, 0xa0\ndb 0x58, 0xd8, 0x01, 0xf0, 0x22, 0x9c, 0xe4, 0xeb, 0x71, 0x5f, 0x4d, 0x38, 0xf2, 0x7e, 0xee, 0xba\ndb 0xf9, 0x39, 0xff, 0x42, 0x91, 0x00, 0x63, 0x5c, 0x86, 0x02, 0x81, 0x51, 0x10, 0xfb, 0xcf, 0x2a\ndb 0xcf, 0x16, 0xd9, 0x8f, 0x3a, 0xbb, 0x29, 0xcb, 0xe2, 0xc9, 0xd9, 0xe2, 0xd9, 0x05, 0x1b, 0x46\ndb 0x08, 0x2c, 0x6d, 0x5b, 0x1a, 0x7d, 0x5b, 0xca, 0x5b, 0xae, 0x18, 0x48, 0x15, 0x3b, 0x85, 0xd1\ndb 0x29, 0xcf, 0xaf, 0xa5, 0x68, 0xe9, 0x8d, 0x9e, 0x0b, 0xe1, 0x55, 0x54, 0x68, 0x28, 0x9b, 0x4c\ndb 0x94, 0x30, 0x3a, 0xc0, 0xaa, 0xf8, 0xeb, 0x7b, 0x58, 0x53, 0x5f, 0x25, 0x2e, 0xbf, 0x72, 0x26\ndb 0xd8, 0x9c, 0xa9, 0xfe, 0x30, 0xe0, 0x68, 0x25, 0xba, 0x71, 0x1a, 0x82, 0xbb, 0xee, 0x03, 0xc9\ndb 0x4b, 0x0a, 0x22, 0xda, 0x93, 0xa0, 0x72, 0x49, 0x72, 0x3a, 0x8f, 0xbe, 0x39, 0x04, 0x7c, 0x06\ndb 0xa1, 0x50, 0xa1, 0x94, 0xb4, 0x66, 0x91, 0xee, 0x76, 0xa4, 0xbe, 0x21, 0x33, 0xbe, 0xa9, 0x68\ndb 0xe6, 0x03, 0xdd, 0x25, 0x3b, 0x78, 0xe3, 0x5a, 0x0c, 0xcf, 0x2b, 0xa2, 0x03, 0x63, 0x8d, 0xd7\ndb 0xc4, 0xf0, 0x6e, 0xea, 0xe1, 0x76, 0x93, 0x38, 0x7b, 0x85, 0xef, 0xff, 0xce, 0xb0, 0xe1, 0xe3\ndb 0x86, 0x3d, 0xb6, 0xae, 0xee, 0xf7, 0x92, 0x8a, 0x1b, 0x29, 0x00, 0x9b, 0x85, 0xaf, 0xa2, 0x5e\ndb 0x90, 0xd9, 0xdc, 0xca, 0xde, 0xde, 0xab, 0xfe, 0x05, 0x61, 0x3c, 0xb6, 0x2f, 0x40, 0x59, 0x1f\ndb 0x73, 0x80, 0x52, 0xf6, 0x6f, 0x28, 0x30, 0x4b, 0xf2, 0x88, 0x9e, 0x63, 0x84, 0x1b, 0xd2, 0xf4\ndb 0x67, 0x3b, 0xaf, 0x48, 0x27, 0xfd, 0x7e, 0x30, 0x6e, 0xb8, 0x81, 0xbf, 0xe5, 0x4c, 0x19, 0x16\ndb 0x24, 0xd0, 0x8e, 0x3a, 0xc9, 0xcd, 0xc8, 0x6f, 0x2e, 0x99, 0xda, 0xb8, 0x7c, 0xd9, 0xbb, 0x2c\ndb 0xe3, 0xdf, 0xd0, 0x96, 0xe2, 0xcc, 0x99, 0x5b, 0x1d, 0xff, 0x81, 0x74, 0x84, 0x0b, 0x9d, 0x09\ndb 0x3e, 0x1b, 0x0c, 0x42, 0x3d, 0x96, 0x15, 0x44, 0xed, 0x97, 0x9a, 0x99, 0x68, 0x02, 0x2c, 0x79\ndb 0x8f, 0xcc, 0xff, 0x83, 0x5e, 0x6e, 0x97, 0x00, 0x50, 0x83, 0xc2, 0x29, 0x2b, 0x27, 0xe6, 0x4f\ndb 0x18, 0xb0, 0x45, 0xa9, 0xf8, 0x30, 0x35, 0x7f, 0x20, 0xdd, 0xd7, 0x07, 0x32, 0x55, 0x95, 0x4a\ndb 0xf3, 0xf5, 0x35, 0x5b, 0xac, 0xef, 0xfa, 0xbb, 0x54, 0xba, 0x4d, 0x79, 0x66, 0xce, 0x38, 0x5e\ndb 0x23, 0xd7, 0x1b, 0x03, 0x37, 0x74, 0xa7, 0xe0, 0xb1, 0x2c, 0xe5, 0xa4, 0x00, 0x36, 0x9a, 0xe9\ndb 0x36, 0xd4, 0x3e, 0x35, 0x37, 0xb2, 0xc1, 0x71, 0x90, 0x80, 0x3b, 0xd8, 0x6b, 0x7e, 0x79, 0x0a\ndb 0x7d, 0xe3, 0x3d, 0xc8, 0xd3, 0xb3, 0x56, 0xb6, 0xef, 0x73, 0x3d, 0x24, 0x07, 0x0e, 0xeb, 0x8e\ndb 0x9b, 0x25, 0xaf, 0x3b, 0xa3, 0x92, 0xf5, 0x19, 0x16, 0xba, 0x1f, 0x6f, 0x92, 0x4b, 0x3f, 0x3c\ndb 0xc8, 0xac, 0xdd, 0x70, 0xc6, 0x3b, 0x45, 0x0b, 0xa5, 0xe0, 0x8f, 0xa4, 0xd6, 0x56, 0xd8, 0xb9\ndb 0xc1, 0x1a, 0x53, 0x76, 0x37, 0x60, 0xc9, 0xf4, 0xc8, 0x0a, 0x17, 0x6d, 0x1d, 0xb8, 0x8e, 0xec\ndb 0xa8, 0x9c, 0x71, 0x08, 0x1f, 0x45, 0x96, 0xc8, 0xed, 0x1e, 0x47, 0x09, 0xbb, 0xe6, 0xee, 0x36\ndb 0x8e, 0x87, 0xc6, 0xeb, 0xe5, 0x88, 0xd8, 0xab, 0x98, 0x41, 0x4f, 0x2a, 0x49, 0x15, 0x68, 0xf6\ndb 0x51, 0xaf, 0xc7, 0x74, 0x7c, 0xaa, 0x26, 0x1a, 0x2f, 0xe6, 0x96, 0x86, 0x7c, 0x00, 0xa4, 0x57\ndb 0x90, 0x1f, 0x83, 0x02, 0x0c, 0xb2, 0xec, 0x27, 0x7f, 0xbc, 0x78, 0x11, 0x64, 0xbe, 0x34, 0x25\ndb 0xbd, 0xf8, 0x56, 0x00, 0x5f, 0xdd, 0x85, 0x95, 0x23, 0xad, 0xe9, 0x26, 0x1e, 0xd3, 0xfc, 0x22\ndb 0xe6, 0x35, 0x07, 0xbc, 0xf6, 0x88, 0x19, 0x61, 0x2e, 0xd5, 0x0d, 0xc0, 0x98, 0x79, 0x59, 0x0a\ndb 0x33, 0x44, 0xa8, 0x70, 0xd8, 0xda, 0x45, 0x72, 0xdb, 0x83, 0xf7, 0xbe, 0xbb, 0x93, 0xc9, 0xaa\ndb 0xf5, 0xfb, 0xdc, 0x0a, 0x55, 0x54, 0xd1, 0xae, 0x9e, 0x14, 0x38, 0x24, 0x06, 0x6e, 0x4d, 0x17\ndb 0xaa, 0xb1, 0xe4, 0x55, 0x9b, 0x7c, 0xc2, 0xe7, 0xb6, 0x82, 0x1b, 0x5d, 0x21, 0x20, 0xfc, 0x34\ndb 0x51, 0xf7, 0xfd, 0x20, 0x17, 0x4b, 0xd1, 0x9f, 0xc7, 0x2a, 0x57, 0x62, 0x4a, 0x60, 0x3f, 0xfa\ndb 0x70, 0x75, 0x1a, 0x3e, 0x9d, 0xbd, 0x6c, 0xe3, 0x60, 0xc3, 0xd3, 0xa6, 0x3b, 0x73, 0xa5, 0x4f\ndb 0x06, 0x79, 0xf4, 0x6e, 0x3a, 0xae, 0xa4, 0x98, 0x86, 0xb9, 0x1b, 0x8b, 0x66, 0xd9, 0x96, 0xdb\ndb 0xa5, 0x47, 0xd3, 0xa8, 0x05, 0x3c, 0x50, 0x57, 0x8a, 0x8f, 0xe0, 0x7f, 0xaf, 0x75, 0x30, 0x44\ndb 0x01, 0xce, 0x17, 0xb8, 0x89, 0xd4, 0x12, 0xaa, 0xe5, 0x2e, 0xe2, 0x75, 0x70, 0x06, 0x02, 0x5c\ndb 0xbd, 0x85, 0xaa, 0x75, 0x02, 0x98, 0xe0, 0x0f, 0xe9, 0x94, 0x43, 0x84, 0x8c, 0xca, 0xc1, 0x53\ndb 0x2f, 0x5c, 0x9a, 0x04, 0x9c, 0x2c, 0x50, 0xc7, 0x6d, 0x13, 0x70, 0x8f, 0x7d, 0xa5, 0x09, 0xc0\ndb 0x2b, 0x75, 0x55, 0x57, 0xc0, 0x51, 0xad, 0x86, 0x18, 0xc5, 0x9a, 0x9f, 0x1d, 0x99, 0x3e, 0xbd\ndb 0x38, 0x24, 0x33, 0xd6, 0x04, 0x98, 0xde, 0x19, 0xcc, 0xb3, 0x72, 0x53, 0x6b, 0xbb, 0x38, 0x03\ndb 0xdc, 0x86, 0xe3, 0x1b, 0x12, 0x04, 0x86, 0x92, 0x3d, 0x3f, 0xf4, 0x4d, 0x73, 0x8a, 0xe7, 0x67\ndb 0x68, 0xae, 0x63, 0x13, 0x7b, 0x48, 0x90, 0xce, 0x35, 0xfb, 0xf3, 0x46, 0x17, 0xb3, 0xcd, 0x2f\ndb 0xeb, 0xb5, 0x7a, 0x11, 0xa9, 0xe1, 0xa6, 0xab, 0x0c, 0x9e, 0x9f, 0xd1, 0x08, 0xae, 0xc1, 0x68\ndb 0xd2, 0xfc, 0x41, 0x36, 0xa8, 0xf4, 0x97, 0xbf, 0x86, 0x61, 0x90, 0x51, 0x02, 0x2e, 0x9a, 0x64\ndb 0x4e, 0xfb, 0xd1, 0xe5, 0x73, 0x24, 0x07, 0xb5, 0x70, 0xa1, 0xa2, 0xb7, 0xcb, 0x0c, 0xbc, 0x1a\ndb 0x4a, 0x55, 0x9e, 0x3f, 0x3b, 0xdb, 0x33, 0x4c, 0x01, 0x63, 0x1f, 0xbe, 0xae, 0x05, 0x3e, 0x45\ndb 0x9e, 0xcf, 0x2e, 0x5f, 0x3b, 0x83, 0x8a, 0xc7, 0xd7, 0x39, 0x3b, 0xfc, 0x54, 0xf0, 0x10, 0x42\ndb 0x9d, 0x5e, 0x12, 0xc2, 0xb8, 0x8c, 0x4e, 0x26, 0xd7, 0xa0, 0xa1, 0x7a, 0xc0, 0x27, 0x72, 0x52\ndb 0xdb, 0xc5, 0xed, 0xe1, 0x86, 0x19, 0x0a, 0xff, 0x43, 0x3d, 0x1c, 0x12, 0xb2, 0xbe, 0x5c, 0x12\ndb 0x4b, 0xbf, 0xff, 0x20, 0xe3, 0xde, 0x4a, 0x74, 0x89, 0x67, 0x42, 0xc3, 0xaf, 0xe3, 0x8a, 0x8a\ndb 0x57, 0x88, 0xdf, 0xbe, 0x1a, 0x0c, 0x58, 0xa1, 0xfe, 0x21, 0x57, 0x97, 0xf6, 0xef, 0xba, 0x34\ndb 0x54, 0x60, 0x00, 0x71, 0x09, 0x4a, 0x5b, 0x89, 0x61, 0x4a, 0x67, 0x19, 0x34, 0x44, 0x83, 0x21\ndb 0x3d, 0xeb, 0x67, 0xff, 0xf7, 0x68, 0xbb, 0x29, 0xa0, 0x74, 0x5e, 0xad, 0x78, 0xb4, 0x11, 0xc5\ndb 0x5e, 0x0e, 0xc0, 0xd4, 0xe7, 0x50, 0x40, 0xa1, 0xb5, 0x98, 0xdb, 0x75, 0x1f, 0xa5, 0xbc, 0x1b\ndb 0xeb, 0x13, 0x18, 0x0e, 0x92, 0x54, 0x17, 0x2d, 0x5b, 0xf8, 0x09, 0x50, 0x27, 0x49, 0xf5, 0x01\ndb 0xb9, 0x51, 0xd1, 0x85, 0x34, 0x67, 0xd8, 0xb9, 0x5f, 0x01, 0x7b, 0xfc, 0xe7, 0x1e, 0xc8, 0xfc\ndb 0x2f, 0xda, 0x81, 0xfd, 0x76, 0x69, 0x5b, 0x47, 0x98, 0x1b, 0x9b, 0xee, 0x9b, 0x18, 0x8e, 0x30\ndb 0x85, 0x9d, 0x45, 0xde, 0xa8, 0x9b, 0x4e, 0x57, 0x26, 0x90, 0x0b, 0x9a, 0xe0, 0xf7, 0xfa, 0x08\ndb 0x1d, 0xe3, 0xca, 0xb8, 0xaa, 0xda, 0x4e, 0xe3, 0xb6, 0x33, 0x05, 0x9a, 0x75, 0x70, 0x18, 0x86\ndb 0x60, 0x31, 0xc1, 0x05, 0x56, 0x02, 0x30, 0xbd, 0xff, 0x3b, 0xa9, 0xca, 0xe4, 0x84, 0xe6, 0x96\ndb 0x47, 0xcf, 0x8b, 0xa8, 0xd4, 0x63, 0x8f, 0x8f, 0x55, 0x4a, 0xbc, 0x4c, 0x3c, 0x61, 0x96, 0x38\ndb 0xcc, 0x10, 0x7e, 0x4e, 0x5c, 0x97, 0xd3, 0x54, 0x22, 0xde, 0xfb, 0x03, 0x81, 0x4e, 0x6d, 0x76\ndb 0xb5, 0xab, 0x8f, 0xba, 0xf5, 0xf0, 0x1a, 0xf9, 0x69, 0x64, 0x30, 0xb3, 0x19, 0x30, 0x54, 0x97\ndb 0x14, 0x66, 0x5c, 0xcf, 0x48, 0x0f, 0x74, 0xf3, 0xbe, 0x16, 0x10, 0x6c, 0xb4, 0x93, 0x86, 0xd1\ndb 0x21, 0xd0, 0x6a, 0x12, 0x35, 0x03, 0x45, 0x99, 0xaa, 0xe1, 0x0a, 0xd9, 0x58, 0x83, 0x2f, 0x97\ndb 0xcb, 0x0d, 0x81, 0x4b, 0x82, 0x01, 0x6f, 0xd6, 0x20, 0xee, 0xf3, 0xbf, 0xdc, 0x3d, 0x67, 0x6c\ndb 0xa5, 0x7c, 0x6d, 0x21, 0x09, 0x99, 0x2e, 0x0a, 0x98, 0x7c, 0x50, 0x56, 0x19, 0x54, 0xcc, 0x79\ndb 0xe1, 0x84, 0x18, 0x86, 0xf8, 0x5a, 0x1b, 0xf7, 0x1f, 0x38, 0xe0, 0x3a, 0xb9, 0x50, 0xc1, 0xf1\ndb 0xbe, 0x66, 0x89, 0xe2, 0x68, 0x4a, 0x11, 0x0b, 0xfb, 0x84, 0x02, 0x38, 0x31, 0xf4, 0xda, 0x50\ndb 0xb6, 0x5f, 0x27, 0x62, 0xc7, 0x5a, 0x0f, 0x99, 0xb7, 0x7e, 0x4a, 0x49, 0xe9, 0x67, 0xe0, 0xa5\ndb 0x0d, 0x08, 0x95, 0xf0, 0xe4, 0x3b, 0x62, 0x30, 0x2b, 0x89, 0x21, 0xdd, 0x52, 0x99, 0x12, 0x16\ndb 0x83, 0x94, 0x6a, 0x38, 0x1f, 0x8d, 0x81, 0xbf, 0x1f, 0xf9, 0xe0, 0x9c, 0x80, 0xcc, 0x7c, 0xfe\ndb 0x33, 0x35, 0x27, 0x26, 0xca, 0xcc, 0x1f, 0x43, 0xcd, 0xb0, 0x74, 0x0e, 0xff, 0x1c, 0x86, 0x43\ndb 0xab, 0x44, 0xbc, 0x31, 0xff, 0xa4, 0x54, 0x95, 0xd4, 0x79, 0x9e, 0xc0, 0xed, 0x87, 0x1c, 0x2e\ndb 0x50, 0x47, 0xad, 0xc0, 0x2f, 0x5e, 0x8c, 0x15, 0xfb, 0x86, 0x2c, 0xa5, 0x61, 0x2a, 0x60, 0x12\ndb 0xbc, 0x1f, 0x84, 0xe9, 0x75, 0x55, 0x7e, 0x2c, 0x11, 0xd0, 0xfc, 0x66, 0x89, 0x86, 0x2f, 0x26\ndb 0x43, 0x1e, 0xa6, 0x6c, 0xa6, 0x40, 0xa9, 0x37, 0x65, 0x99, 0x72, 0xe1, 0x1a, 0xdc, 0x23, 0x53\ndb 0x09, 0x8e, 0xa1, 0xd6, 0xda, 0xd9, 0x95, 0xaf, 0x58, 0xe0, 0x2a, 0x4a, 0xd3, 0xbd, 0xbd, 0x86\n\ndb 0xcb, 0x6c, 0xc1, 0xc1, 0x6a, 0xd5, 0xbe, 0x87, 0x35, 0x87, 0xbc, 0x44, 0x4e, 0xf5, 0x91, 0xc1\ndb 0x2c, 0x5b, 0x4b, 0x4e, 0xbc, 0xe7, 0x7b, 0x43, 0xc1, 0x2d, 0xb5, 0xc2, 0x30, 0xcd, 0x07, 0xda\ndb 0x2d, 0xd8, 0x27, 0x1f, 0xcf, 0x4f, 0x94, 0xf8, 0x90, 0xd3, 0x77, 0xed, 0x44, 0xff, 0x39, 0x42\ndb 0x4d, 0xd1, 0x0a, 0x1e, 0xc0, 0xb2, 0xca, 0x28, 0xe2, 0xfe, 0xc9, 0x11, 0x88, 0xb6, 0xa3, 0xb4\ndb 0xf2, 0xd3, 0xc4, 0x9c, 0x74, 0x7a, 0x88, 0x45, 0xf5, 0xcd, 0x73, 0x93, 0x70, 0xeb, 0xc0, 0x4c\ndb 0x6e, 0xae, 0x2a, 0x60, 0x1b, 0x4b, 0x34, 0x06, 0xb3, 0x1a, 0x3b, 0x2b, 0xd8, 0x1e, 0xaa, 0x05\ndb 0x25, 0x38, 0x5e, 0x9a, 0x4b, 0x12, 0x6c, 0x6e, 0x14, 0xa9, 0xde, 0x61, 0x32, 0xf8, 0xf3, 0x03\ndb 0x33, 0x71, 0xf6, 0xd7, 0x50, 0xdd, 0x28, 0x04, 0xac, 0xaa, 0x18, 0xe0, 0x8d, 0xa9, 0x95, 0x9a\ndb 0xb2, 0x01, 0x57, 0x3d, 0xfe, 0xc0, 0x1d, 0xc3, 0x1b, 0x44, 0x21, 0xc4, 0xaa, 0xf9, 0x8b, 0x4b\ndb 0x9b, 0x63, 0xb9, 0xbb, 0x40, 0xc9, 0x0a, 0xb9, 0xad, 0x22, 0x2b, 0xb9, 0x00, 0xdd, 0x4f, 0x97\ndb 0x63, 0xe7, 0xf3, 0x30, 0x9c, 0x41, 0xde, 0xc6, 0xbe, 0xfe, 0x6b, 0x97, 0x2a, 0x40, 0x1e, 0x93\ndb 0x60, 0xb8, 0x55, 0x35, 0x76, 0xa5, 0x1a, 0x66, 0x43, 0x2f, 0x63, 0x93, 0x55, 0x76, 0xf6, 0x2a\ndb 0x12, 0x7a, 0x0a, 0x3e, 0xd2, 0x0e, 0x57, 0xb5, 0xc7, 0x0d, 0x23, 0xca, 0x9f, 0xfe, 0xbf, 0x5e\ndb 0xe6, 0x07, 0x9c, 0x68, 0x7e, 0x5e, 0x72, 0xc9, 0xc8, 0x24, 0x6b, 0x7c, 0x01, 0x8b, 0xd1, 0x97\ndb 0x33, 0xbc, 0xb1, 0xa0, 0x37, 0x1e, 0x47, 0xc0, 0x5f, 0x06, 0xeb, 0x43, 0x5b, 0x67, 0x94, 0xa6\ndb 0x74, 0x71, 0xe4, 0xc3, 0x2c, 0x4e, 0xc5, 0xad, 0x64, 0x39, 0xb9, 0x69, 0x6f, 0xbd, 0x21, 0x40\ndb 0x3b, 0xda, 0x20, 0x58, 0xb1, 0x45, 0xe9, 0xa8, 0x44, 0x93, 0xae, 0xc9, 0x31, 0x55, 0x5e, 0x8d\ndb 0x94, 0x18, 0x42, 0x86, 0x21, 0xc0, 0x11, 0x6c, 0x2f, 0x46, 0x84, 0xa7, 0x3c, 0xbe, 0x2b, 0x07\ndb 0xdb, 0x25, 0xc6, 0x1d, 0xfe, 0x53, 0x22, 0x5e, 0x09, 0x12, 0x0d, 0xfe, 0x6b, 0x50, 0x9e, 0x4b\ndb 0x9a, 0xde, 0x8f, 0xf5, 0x5d, 0xc4, 0x78, 0x3f, 0x62, 0xf2, 0xea, 0xed, 0x91, 0x6b, 0x5e, 0x21\ndb 0x35, 0x7e, 0x98, 0xd7, 0x5e, 0x98, 0xe2, 0x69, 0x19, 0x3d, 0x2b, 0xab, 0x81, 0x76, 0x28, 0xea\ndb 0x21, 0x26, 0xaf, 0x36, 0xa7, 0xc4, 0x65, 0x5e, 0x48, 0x61, 0xee, 0xaa, 0xd5, 0xe7, 0x7b, 0x7c\ndb 0x51, 0x6c, 0xe5, 0x5d, 0xe0, 0xb2, 0x65, 0x4c, 0x75, 0x08, 0x1f, 0xa6, 0x5a, 0x42, 0xf0, 0xa1\ndb 0x3d, 0xba, 0xf7, 0x65, 0x44, 0x77, 0x5c, 0xfc, 0x71, 0x30, 0xed, 0xdb, 0x8a, 0x08, 0x5d, 0xec\ndb 0xc8, 0x91, 0x55, 0xba, 0xe1, 0xad, 0x37, 0x07, 0x97, 0x73, 0x02, 0xe4, 0xa8, 0xf5, 0x84, 0xf4\ndb 0x0f, 0x32, 0x0e, 0x72, 0xa7, 0x66, 0x9f, 0x8a, 0xc2, 0xdf, 0x11, 0x60, 0x58, 0xff, 0x5d, 0x9c\ndb 0xac, 0x3f, 0x20, 0x8d, 0x62, 0xc0, 0xce, 0xcc, 0x36, 0xe0, 0xe6, 0xc0, 0x44, 0xa2, 0xee, 0x7d\ndb 0x9d, 0x21, 0x2c, 0x57, 0x52, 0x12, 0x4a, 0xf6, 0x78, 0x5e, 0x9c, 0xd4, 0x30, 0x4c, 0x43, 0xe6\ndb 0xd3, 0xdc, 0x51, 0x4d, 0x48, 0xf0, 0xa4, 0x75, 0xff, 0x30, 0x90, 0x45, 0xf6, 0xfa, 0x8c, 0xc0\ndb 0xc9, 0xf0, 0xf4, 0x2d, 0xeb, 0x68, 0xae, 0x53, 0xaf, 0x3b, 0x05, 0xdd, 0x07, 0xb8, 0xf3, 0x26\ndb 0x02, 0x56, 0xef, 0xba, 0x87, 0xbe, 0x11, 0x50, 0xea, 0x9a, 0x6b, 0x54, 0xcf, 0x82, 0x34, 0x78\ndb 0x5b, 0x95, 0xb1, 0x68, 0x6c, 0xed, 0x90, 0xab, 0x4a, 0x08, 0x4a, 0x8b, 0x22, 0x30, 0x82, 0xa3\ndb 0x43, 0x94, 0xb3, 0x44, 0x99, 0x83, 0x4d, 0x62, 0x26, 0xf5, 0x56, 0x0c, 0x1a, 0xb8, 0x85, 0x46\ndb 0x23, 0x1c, 0xfc, 0xf3, 0x5c, 0xa5, 0x3a, 0x34, 0x32, 0x67, 0x95, 0x66, 0xa6, 0x40, 0x8b, 0x92\ndb 0x17, 0x71, 0x11, 0x37, 0xcb, 0xfc, 0xaf, 0x69, 0x51, 0x86, 0x55, 0xa9, 0x1e, 0x35, 0x46, 0x41\ndb 0x5c, 0x08, 0xea, 0x6c, 0x52, 0xe8, 0xd1, 0x33, 0x01, 0x84, 0xce, 0x73, 0xd1, 0x7a, 0x6e, 0xfc\ndb 0xd1, 0x9f, 0x03, 0xb2, 0xdb, 0xd4, 0xed, 0x39, 0xef, 0xe8, 0xeb, 0x1f, 0x12, 0xf4, 0xc7, 0x44\ndb 0xd4, 0x66, 0x19, 0xac, 0xd5, 0x8e, 0xe2, 0x8c, 0xc1, 0x5b, 0x63, 0xde, 0xee, 0xa2, 0x39, 0xcc\ndb 0x4a, 0x52, 0x6c, 0x06, 0x72, 0x95, 0x72, 0xd2, 0x79, 0x29, 0x0e, 0x87, 0xcf, 0x58, 0x68, 0xe8\ndb 0x38, 0xac, 0x37, 0xdb, 0xac, 0x38, 0xf1, 0xcf, 0x1d, 0xdd, 0x08, 0xad, 0xfb, 0xfd, 0x07, 0x2b\ndb 0xae, 0x87, 0x96, 0x15, 0xac, 0x4b, 0x3d, 0xdd, 0x1c, 0xd8, 0xdb, 0x60, 0x9f, 0x45, 0x34, 0xab\ndb 0xcb, 0xd3, 0x86, 0x1f, 0xde, 0xcc, 0x00, 0x6c, 0x50, 0xd1, 0x9d, 0x4e, 0xaf, 0x2f, 0xb7, 0x85\ndb 0x70, 0xcc, 0xbf, 0xd8, 0x9b, 0x84, 0x67, 0xce, 0xaa, 0xd6, 0x74, 0xee, 0x35, 0x4d, 0x7b, 0xe4\ndb 0xa9, 0xae, 0x7f, 0x81, 0xf4, 0x29, 0xdf, 0x6d, 0x15, 0xc6, 0x02, 0xbf, 0x55, 0x6f, 0x74, 0xed\ndb 0x6f, 0x35, 0x03, 0xc0, 0x42, 0x7c, 0xd3, 0x9c, 0x38, 0xb7, 0x3d, 0xa4, 0xc7, 0x42, 0x4a, 0xf5\ndb 0x02, 0x8a, 0x63, 0xac, 0xb4, 0xf8, 0x0b, 0x19, 0xda, 0x0d, 0x3b, 0xad, 0xf8, 0xa8, 0xaa, 0x59\ndb 0x52, 0x71, 0x0b, 0xd6, 0xe2, 0xb3, 0x73, 0xa5, 0x49, 0xa3, 0x36, 0x65, 0x23, 0x29, 0x12, 0xbf\ndb 0x33, 0x75, 0xc2, 0x79, 0xec, 0x4e, 0xcf, 0xf4, 0x21, 0xf3, 0xe2, 0xa4, 0x82, 0xd9, 0x55, 0x84\ndb 0xda, 0x46, 0x18, 0xfc, 0x73, 0xac, 0xaf, 0x68, 0xc4, 0x49, 0x47, 0x6b, 0x6e, 0x50, 0x33, 0x27\ndb 0x47, 0x5e, 0xc7, 0x1d, 0xb7, 0x2e, 0x8c, 0x9f, 0xbe, 0xac, 0x5c, 0x11, 0x0a, 0x64, 0x14, 0xda\ndb 0x5d, 0xdc, 0xe2, 0xd2, 0xa0, 0x96, 0xcd, 0x08, 0xf3, 0xcf, 0xc6, 0xc8, 0x0f, 0x30, 0x07, 0x1f\ndb 0x67, 0xb9, 0x63, 0xf5, 0x73, 0xd3, 0xfb, 0x7e, 0xe1, 0xc1, 0x49, 0xc7, 0x9c, 0x4f, 0x99, 0xc0\ndb 0x1b, 0x7f, 0x60, 0x66, 0xcb, 0x3e, 0x38, 0x11, 0x0b, 0xdd, 0xc8, 0x68, 0xd8, 0x49, 0xe2, 0x66\ndb 0x79, 0x8f, 0xb1, 0xb2, 0xe6, 0xb5, 0x33, 0xf0, 0x28, 0x81, 0x7b, 0x48, 0xbf, 0x98, 0xfd, 0x88\ndb 0x29, 0xbb, 0x01, 0x85, 0x56, 0xd7, 0x61, 0xfc, 0xc3, 0x5b, 0x29, 0x33, 0xe6, 0x14, 0x9a, 0xdd\ndb 0xdc, 0x7b, 0x0b, 0x89, 0x95, 0xb2, 0x32, 0xaa, 0x06, 0x21, 0x82, 0x10, 0x91, 0x83, 0xe2, 0xa4\ndb 0x73, 0x5a, 0xb5, 0xbb, 0x64, 0x36, 0x6c, 0x65, 0x6a, 0x67, 0x2e, 0x44, 0x32, 0xf6, 0xf5, 0x47\ndb 0xbb, 0x35, 0x12, 0x75, 0xc4, 0xf6, 0xb2, 0x25, 0x8a, 0xc9, 0x4f, 0x40, 0xe5, 0x7c, 0x11, 0x03\ndb 0x8c, 0x88, 0x43, 0xca, 0x1e, 0x5e, 0xeb, 0xc4, 0x7f, 0x4d, 0x0d, 0x95, 0x18, 0xf8, 0xb4, 0x7b\ndb 0xca, 0xe4, 0x18, 0x2d, 0x27, 0x8b, 0xef, 0x04, 0x5a, 0x19, 0x0a, 0xba, 0x99, 0x06, 0x6c, 0x65\ndb 0x68, 0x82, 0x98, 0x35, 0x7e, 0x1d, 0x3f, 0xe5, 0xd3, 0x31, 0x3f, 0x26, 0x8a, 0x9b, 0xe4, 0x7c\ndb 0x90, 0xbd, 0x50, 0xb5, 0x47, 0x81, 0x95, 0xd7, 0xd2, 0xb8, 0xf5, 0xc8, 0x58, 0x4e, 0x98, 0xd0\ndb 0x36, 0xea, 0xcc, 0x4d, 0x83, 0xba, 0x7a, 0xf6, 0xff, 0x34, 0xa3, 0x3e, 0xdb, 0xe8, 0x1d, 0xd4\ndb 0x5e, 0xd2, 0x40, 0xbb, 0xa6, 0x5f, 0x42, 0x6a, 0xe8, 0x15, 0x66, 0x44, 0x69, 0x8d, 0x9f, 0x4d\ndb 0x0f, 0xbd, 0x0d, 0x9e, 0x44, 0x0b, 0xf0, 0xf8, 0xbe, 0x7a, 0x10, 0xc9, 0xcc, 0x87, 0xb9, 0x87\ndb 0xcb, 0xbb, 0x62, 0x5d, 0xb9, 0x3e, 0xa9, 0xa7, 0x71, 0x4e, 0xd1, 0x20, 0x2a, 0x26, 0x31, 0xf1\ndb 0x29, 0x67, 0x1b, 0x53, 0xa3, 0x27, 0x0e, 0x0b, 0xdd, 0xca, 0x14, 0xf3, 0xb9, 0x95, 0xf3, 0xf8\ndb 0x92, 0x16, 0x61, 0x00, 0x87, 0x17, 0x74, 0x7a, 0x5e, 0x08, 0xf1, 0xed, 0xc4, 0x76, 0x96, 0xb1\ndb 0x65, 0xf8, 0xd5, 0xec, 0xc8, 0x99, 0x1e, 0x37, 0xe8, 0x18, 0xf3, 0xaa, 0x5a, 0xa0, 0x9d, 0x56\ndb 0xc8, 0x3a, 0x9e, 0x31, 0x70, 0x80, 0x3a, 0x14, 0xc3, 0x59, 0x3b, 0x3c, 0x79, 0x00, 0x72, 0x22\ndb 0xbe, 0xf5, 0x25, 0x96, 0xe6, 0xa4, 0x8a, 0x4b, 0xe3, 0xa8, 0x2f, 0x0c, 0x58, 0xf5, 0x45, 0x75\ndb 0x1b, 0xc3, 0x58, 0x3b, 0x6b, 0x80, 0x14, 0xa9, 0xe5, 0x86, 0xe5, 0x21, 0x4c, 0xe4, 0xa5, 0xb6\ndb 0xeb, 0xcb, 0x84, 0x08, 0x49, 0x03, 0x31, 0x5c, 0xf2, 0x2c, 0xcf, 0xa3, 0xdf, 0x35, 0x30, 0xa4\ndb 0xeb, 0xcd, 0x7f, 0xc6, 0xdd, 0x8a, 0x81, 0xa6, 0x2f, 0x0f, 0x2c, 0x0b, 0x6a, 0xe8, 0x28, 0x64\ndb 0x97, 0x85, 0x70, 0xff, 0x8a, 0x51, 0xbc, 0xd5, 0x04, 0x07, 0x39, 0xa4, 0x38, 0x83, 0x97, 0x55\ndb 0xf7, 0x40, 0x2b, 0x24, 0x4d, 0x34, 0xae, 0x8b, 0xa9, 0xeb, 0x4f, 0x36, 0x42, 0xd4, 0x61, 0x28\ndb 0x64, 0xed, 0xb6, 0xf3, 0xec, 0xb4, 0x15, 0xff, 0x7a, 0xcb, 0x08, 0x3f, 0x49, 0x98, 0x4c, 0x3f\ndb 0x01, 0xc4, 0x36, 0x99, 0x26, 0xee, 0x11, 0x89, 0x94, 0x35, 0x7d, 0x24, 0xcc, 0x0c, 0x07, 0x03\ndb 0x65, 0xf6, 0xe6, 0x34, 0x11, 0xee, 0xdc, 0x5c, 0x2e, 0x31, 0x86, 0xa1, 0x80, 0x83, 0x37, 0x09\ndb 0x4a, 0xab, 0xd7, 0x52, 0x36, 0xec, 0x13, 0x28, 0xa8, 0x81, 0x69, 0x41, 0x3b, 0x3b, 0xcb, 0xca\ndb 0x90, 0xcf, 0x0b, 0x95, 0x46, 0x06, 0xc3, 0xbb, 0x8d, 0x47, 0xc1, 0xc4, 0x92, 0x5d, 0xd5, 0x56\ndb 0xe4, 0xb8, 0x0a, 0x99, 0x83, 0xaa, 0xc3, 0xd8, 0x06, 0xf7, 0x51, 0x4b, 0x31, 0xdf, 0x68, 0x3b\ndb 0x3b, 0xaa, 0x17, 0xd3, 0xd7, 0xba, 0x24, 0x41, 0xd1, 0x94, 0xd2, 0xd1, 0x3b, 0x96, 0xf6, 0xd2\ndb 0x2d, 0x9f, 0xf2, 0x92, 0x02, 0x2f, 0x51, 0xe5, 0x85, 0x99, 0xeb, 0x1b, 0x46, 0xd6, 0x82, 0xa5\ndb 0x30, 0x17, 0x33, 0xc1, 0xdb, 0xda, 0x5d, 0x13, 0xb2, 0xf3, 0x4d, 0x4d, 0xdb, 0x46, 0x3a, 0x4e\ndb 0xc0, 0x9f, 0x51, 0x0e, 0xf3, 0xff, 0x5d, 0xa1, 0xe2, 0x95, 0x6f, 0xf4, 0x49, 0x77, 0xed, 0x45\ndb 0x55, 0x46, 0xc2, 0xfa, 0xa7, 0x5f, 0x02, 0x81, 0xed, 0x1a, 0xf5, 0x1f, 0x96, 0xa9, 0x38, 0x82\ndb 0x89, 0xd0, 0xfd, 0xd3, 0xd0, 0x6d, 0x60, 0x3e, 0x1b, 0xe3, 0x8c, 0x5e, 0xd0, 0x2b, 0x2d, 0x7e\ndb 0xc2, 0x61, 0x2c, 0xa2, 0x8a, 0x75, 0x29, 0xea, 0x8f, 0x66, 0x0d, 0xb4, 0x21, 0x90, 0x04, 0x6b\ndb 0xbf, 0x24, 0xde, 0x9b, 0x9e, 0xbf, 0x30, 0xbb, 0x5b, 0x79, 0x51, 0xbb, 0xc0, 0x19, 0x51, 0xb2\ndb 0x6a, 0xd8, 0x5a, 0xa1, 0xca, 0xc2, 0xf5, 0x03, 0x04, 0xf5, 0x1f, 0x6f, 0x8a, 0x66, 0x20, 0x99\ndb 0xcb, 0xfb, 0xac, 0x3e, 0x26, 0x60, 0x2d, 0x5e, 0x02, 0x12, 0xd5, 0xe7, 0xe3, 0x49, 0x4f, 0x51\ndb 0x93, 0x03, 0x42, 0x74, 0x40, 0xf6, 0x32, 0xaa, 0x4e, 0xcf, 0xc0, 0xb7, 0xbe, 0x9d, 0x7c, 0xa0\ndb 0xd2, 0x95, 0xe1, 0xf6, 0x84, 0x5d, 0xda, 0x70, 0x95, 0x46, 0x11, 0x3d, 0x82, 0x23, 0xdc, 0xbc\ndb 0x2c, 0xe9, 0x37, 0x65, 0xc4, 0x89, 0x83, 0x1c, 0xea, 0x85, 0x75, 0xf6, 0xab, 0x9b, 0x91, 0xbf\ndb 0xbc, 0xbf, 0xfd, 0x81, 0xf9, 0xd8, 0x3d, 0xcc, 0x57, 0x9e, 0x37, 0xe4, 0xc5, 0xb2, 0xcd, 0x2f\ndb 0x03, 0x74, 0x6f, 0x6a, 0xf3, 0x9e, 0xcc, 0x4f, 0xd1, 0x35, 0xb6, 0xeb, 0xbb, 0x13, 0x9d, 0x3a\ndb 0x17, 0x22, 0x46, 0x16, 0x42, 0xbb, 0x63, 0xfb, 0x76, 0xba, 0x3f, 0x6c, 0xa3, 0x91, 0xf6, 0x9a\ndb 0x03, 0x1c, 0xd1, 0x8e, 0xc0, 0x19, 0x18, 0x4e, 0x6a, 0x49, 0x0a, 0x2b, 0x45, 0xd3, 0x3b, 0x93\ndb 0xda, 0x94, 0x10, 0xf8, 0x4f, 0x23, 0xa7, 0xfe, 0x7e, 0x52, 0xbc, 0x2f, 0x5a, 0x1d, 0x9d, 0x5b\ndb 0x23, 0xf2, 0xea, 0xb8, 0x85, 0x92, 0x10, 0xc3, 0x1f, 0x9a, 0xb0, 0x40, 0x81, 0x77, 0x3b, 0xed\ndb 0x13, 0xf8, 0xc9, 0x87, 0x53, 0x00, 0xe1, 0x72, 0x81, 0xdc, 0x19, 0x90, 0x14, 0xac, 0x36, 0x5b\ndb 0x84, 0x0c, 0x7b, 0x85, 0x01, 0x09, 0x73, 0x79, 0xdf, 0xf8, 0x4d, 0xcb, 0xff, 0xf0, 0xa5, 0x5a\ndb 0xfd, 0x8e, 0xb6, 0xf5, 0x21, 0x91, 0xf7, 0x24, 0x90, 0x7e, 0xa2, 0x74, 0xc6, 0x46, 0x69, 0x74\ndb 0x8b, 0x9e, 0x11, 0x6e, 0x69, 0xfd, 0x8f, 0x30, 0x0d, 0x7e, 0xf1, 0xc2, 0x67, 0xca, 0x44, 0xb3\ndb 0x47, 0x24, 0x22, 0xf0, 0x61, 0x7e, 0xb7, 0x60, 0x9f, 0xff, 0x49, 0x16, 0xc0, 0xe2, 0x7e, 0x9d\ndb 0xf8, 0x58, 0x3b, 0xa2, 0xe7, 0xf8, 0x11, 0x20, 0xaf, 0xe8, 0xec, 0x95, 0x2d, 0xf1, 0x31, 0xd6\ndb 0xc1, 0xe8, 0xdd, 0xac, 0x34, 0xf8, 0x01, 0x4c, 0x63, 0xf2, 0x2d, 0x15, 0xd0, 0xa8, 0xb1, 0xa8\ndb 0x0e, 0x6c, 0x64, 0xb1, 0x08, 0x3a, 0x9c, 0xa9, 0x30, 0x69, 0x67, 0xbc, 0xf5, 0x93, 0x28, 0x8a\ndb 0x5f, 0x96, 0xcb, 0xfd, 0x3d, 0x75, 0x87, 0x10, 0x77, 0xc5, 0x05, 0x3c, 0x17, 0xf4, 0xa1, 0xfa\ndb 0x23, 0x11, 0xec, 0x69, 0xaf, 0xc2, 0x6a, 0xe5, 0x79, 0xf3, 0xfc, 0x2f, 0x28, 0x61, 0xa1, 0xf2\ndb 0x7b, 0xc6, 0x53, 0x1d, 0xf5, 0xaa, 0xa8, 0x7d, 0x91, 0x21, 0xac, 0xf1, 0xc9, 0x7a, 0x97, 0xdb\ndb 0x83, 0x64, 0x0e, 0x35, 0xb8, 0x81, 0x90, 0xa5, 0xdf, 0x07, 0x3c, 0xba, 0xce, 0x9c, 0x84, 0x01\ndb 0x8a, 0x4e, 0x66, 0xe6, 0x69, 0xba, 0xb0, 0xda, 0x9f, 0x4a, 0x19, 0x3a, 0xd0, 0x08, 0xd1, 0xf6\ndb 0x4a, 0xf3, 0x5f, 0x04, 0xdd, 0x07, 0xd5, 0x41, 0xaf, 0x5c, 0x9a, 0x43, 0x0b, 0xcd, 0x9c, 0x6a\ndb 0x62, 0x11, 0x2f, 0x2f, 0x01, 0x77, 0x98, 0x4d, 0xf2, 0xfe, 0x47, 0x49, 0x55, 0xd2, 0xac, 0x19\ndb 0x64, 0x5a, 0xb8, 0xf1, 0xe4, 0xba, 0x53, 0xcf, 0x97, 0x6d, 0x3b, 0x8d, 0x03, 0x49, 0xbc, 0x57\ndb 0x95, 0x64, 0xff, 0x80, 0x07, 0xb9, 0x02, 0x52, 0x7e, 0xbd, 0x11, 0xd9, 0x25, 0x37, 0x2a, 0x11\ndb 0x9e, 0xad, 0x3d, 0x96, 0x57, 0x56, 0x9c, 0x57, 0x43, 0x62, 0x94, 0x76, 0x3a, 0xc1, 0xaa, 0x76\ndb 0xe6, 0x58, 0x9b, 0xe9, 0x65, 0xfb, 0xad, 0x1d, 0xfe, 0x1d, 0x75, 0x2a, 0xac, 0x22, 0xdb, 0x4a\ndb 0x89, 0x8d, 0x1f, 0xa3, 0x53, 0x47, 0x8c, 0x3c, 0x06, 0xcb, 0xaa, 0x3f, 0x21, 0x86, 0x37, 0xab\ndb 0x28, 0x42, 0xff, 0xb9, 0x9a, 0x25, 0x96, 0x12, 0x11, 0xee, 0xa1, 0x34, 0x33, 0xdf, 0x39, 0x39\ndb 0xc8, 0x19, 0xaa, 0x33, 0x7e, 0x06, 0xc2, 0x1c, 0xd5, 0x4c, 0xdd, 0xb9, 0x56, 0x70, 0xe9, 0x75\ndb 0x65, 0x08, 0xa6, 0xa0, 0x5e, 0x36, 0x38, 0xc8, 0x91, 0x4d, 0xd7, 0x37, 0xac, 0xc3, 0x22, 0x10\ndb 0x44, 0x14, 0x22, 0xe2, 0x94, 0x43, 0xd3, 0x27, 0xa4, 0xe4, 0x3c, 0x67, 0x26, 0x1f, 0x8f, 0xab\ndb 0xdf, 0x86, 0x71, 0xe4, 0x98, 0x29, 0x93, 0x9a, 0x7a, 0xf6, 0x79, 0x17, 0xf7, 0x59, 0x31, 0xe4\ndb 0x73, 0x47, 0xac, 0xa2, 0x1e, 0xa4, 0x0f, 0xb9, 0xf4, 0xee, 0x5b, 0xd3, 0xe8, 0xd0, 0x89, 0x6b\ndb 0xad, 0xa5, 0x46, 0x5e, 0x07, 0x73, 0x41, 0x72, 0xb7, 0xf4, 0x43, 0x79, 0x46, 0xab, 0xa0, 0xfd\ndb 0x2a, 0x93, 0x08, 0x09, 0x2c, 0xab, 0x60, 0xa9, 0x4a, 0xd5, 0x68, 0x78, 0xa0, 0x55, 0x2d, 0x55\ndb 0x7b, 0xd8, 0x3b, 0xd6, 0xf6, 0x88, 0x49, 0x86, 0xef, 0xb3, 0xea, 0xb0, 0xf5, 0xa3, 0x1a, 0x98\ndb 0x93, 0xd9, 0x21, 0x3b, 0xa5, 0xdb, 0xd7, 0xec, 0x53, 0xcb, 0x6c, 0x4d, 0x56, 0x67, 0xbe, 0x59\ndb 0x12, 0x92, 0xc6, 0x9a, 0x5a, 0x64, 0x84, 0x3d, 0x2e, 0x27, 0x77, 0x4b, 0x87, 0x42, 0x82, 0x45\ndb 0xf0, 0xd1, 0x9c, 0x52, 0xff, 0x2e, 0x7d, 0x09, 0xb7, 0x7a, 0x3a, 0x97, 0x7b, 0x40, 0x29, 0x5d\ndb 0x10, 0x7a, 0xb6, 0x65, 0x51, 0x8d, 0xca, 0xa0, 0x61, 0x6a, 0x48, 0xae, 0x3d, 0xe9, 0x94, 0xe8\ndb 0x25, 0x66, 0x46, 0x60, 0x39, 0x9c, 0x63, 0x55, 0xdb, 0x79, 0x34, 0xb2, 0x83, 0xb4, 0xc9, 0x44\ndb 0xc3, 0x20, 0xb6, 0xc3, 0xba, 0x9d, 0x5d, 0x47, 0x9a, 0x95, 0x62, 0x26, 0x49, 0x2f, 0x9f, 0x95\ndb 0x15, 0x35, 0xf4, 0x5d, 0xa6, 0x18, 0xe3, 0xd9, 0x63, 0xa0, 0x2f, 0xc2, 0x08, 0xb6, 0x98, 0x26\ndb 0x5a, 0x94, 0x13, 0xc9, 0x41, 0xa1, 0x68, 0x50, 0x2e, 0x0f, 0xcc, 0x50, 0x3b, 0x79, 0xbf, 0x13\ndb 0x0a, 0x38, 0x78, 0x0e, 0x8b, 0xf3, 0xf3, 0x5f, 0x0e, 0xa9, 0xab, 0x3b, 0xe4, 0xc6, 0x6b, 0xb8\ndb 0x9f, 0xb6, 0xa7, 0x98, 0xdc, 0x4a, 0xbb, 0x82, 0xc8, 0x26, 0x26, 0x4d, 0xa3, 0x83, 0x1b, 0x7d\ndb 0x6b, 0x8f, 0x70, 0xed, 0x55, 0xf8, 0x85, 0xb4, 0x07, 0xd2, 0x0e, 0xc9, 0x8d, 0x37, 0x0e, 0x5b\ndb 0xe1, 0xd1, 0x98, 0x06, 0x42, 0x92, 0x99, 0x98, 0x27, 0xfc, 0x16, 0x97, 0xf5, 0x30, 0xe2, 0xed\ndb 0x42, 0x0d, 0xa6, 0x69, 0x3a, 0x17, 0xd8, 0x62, 0xae, 0x95, 0x27, 0xf6, 0xa6, 0xeb, 0x65, 0xfc\ndb 0x21, 0xb2, 0x3a, 0xec, 0x5c, 0x7e, 0x1e, 0x20, 0x56, 0xc8, 0xec, 0xc5, 0xbd, 0xd3, 0xfd, 0xd3\ndb 0xe2, 0x26, 0x43, 0x6c, 0x32, 0x54, 0xc0, 0x0a, 0x95, 0x7f, 0x24, 0x9d, 0x9c, 0x4d, 0x99, 0xdd\ndb 0x5d, 0x16, 0x50, 0x99, 0x1c, 0xea, 0xe8, 0xd1, 0x7a, 0xee, 0x2e, 0xde, 0x21, 0xe7, 0x6c, 0x70\ndb 0x85, 0x4b, 0x3c, 0x7d, 0x7a, 0x80, 0x20, 0xfe, 0x47, 0x52, 0xee, 0x80, 0x60, 0x65, 0x4b, 0xbd\ndb 0x53, 0x11, 0xc6, 0x28, 0x70, 0xf9, 0x02, 0x6d, 0xd1, 0xae, 0xec, 0x36, 0xc0, 0x93, 0x26, 0xf1\ndb 0xed, 0x32, 0x9f, 0x88, 0x9d, 0x06, 0x9a, 0xa7, 0x60, 0x85, 0x2a, 0x08, 0x54, 0xac, 0x50, 0x10\ndb 0x5a, 0x8e, 0xe1, 0xc0, 0x0e, 0xc7, 0x95, 0xd4, 0x72, 0x1c, 0x8e, 0x1f, 0x82, 0x77, 0x6b, 0xfe\ndb 0xa2, 0x49, 0xe1, 0xe4, 0x25, 0x4a, 0x41, 0xfc, 0x8b, 0x8f, 0xee, 0x77, 0x38, 0x1c, 0x53, 0xe6\ndb 0x80, 0x96, 0x2e, 0x2c, 0x17, 0xd5, 0xec, 0x00, 0xf9, 0x70, 0xb0, 0x0a, 0xe4, 0x08, 0x05, 0x07\ndb 0x79, 0x67, 0x08, 0x2e, 0x9a, 0x15, 0x4d, 0x97, 0x35, 0x3b, 0x30, 0xa0, 0xf8, 0xf1, 0x23, 0x3f\ndb 0x0a, 0x12, 0x4d, 0x4f, 0xe8, 0xf7, 0x86, 0x15, 0x6b, 0x6c, 0x78, 0x26, 0x04, 0xcf, 0x2b, 0xfa\ndb 0xf3, 0xfe, 0x6e, 0x22, 0x9e, 0x50, 0x4c, 0x04, 0x42, 0x6e, 0x75, 0xd6, 0xcc, 0xc0, 0x3c, 0xfd\ndb 0x73, 0x8c, 0xb5, 0x9a, 0xfb, 0x7f, 0x34, 0xe0, 0x29, 0x73, 0x9b, 0x07, 0x26, 0x68, 0x6b, 0xb0\ndb 0xdd, 0x0d, 0xef, 0xfe, 0xb0, 0x7e, 0x5a, 0x73, 0xb8, 0x37, 0x63, 0x60, 0xb2, 0x3c, 0xa3, 0x3e\ndb 0xbb, 0xce, 0x66, 0x9e, 0x30, 0xd4, 0x01, 0xc9, 0xf0, 0x17, 0x3b, 0xed, 0x4c, 0x9d, 0xd1, 0xbf\ndb 0xe7, 0x7e, 0xb5, 0x59, 0x7d, 0xef, 0xb8, 0x22, 0xb5, 0x81, 0x2c, 0x83, 0x76, 0xc6, 0xee, 0x37\ndb 0xfb, 0x8e, 0xc1, 0x38, 0x22, 0xc4, 0x75, 0xda, 0x67, 0x95, 0x74, 0x34, 0xb9, 0x24, 0x4b, 0xa2\ndb 0x06, 0x7a, 0x29, 0xe2, 0xfb, 0x55, 0x3e, 0x98, 0x6d, 0x79, 0x62, 0x95, 0xeb, 0x46, 0xc4, 0x0d\ndb 0x61, 0xe1, 0x8d, 0x70, 0x4a, 0xd3, 0x1a, 0x7f, 0x60, 0x12, 0xd9, 0x14, 0x80, 0xc2, 0x00, 0xcb\ndb 0xe6, 0xa1, 0x3c, 0xc0, 0x7d, 0xf7, 0xdc, 0xfa, 0x8e, 0xde, 0x6e, 0x9d, 0xfa, 0xd8, 0xdb, 0xc3\ndb 0x24, 0x8d, 0x98, 0x3f, 0x59, 0xd1, 0xfa, 0x58, 0xcc, 0x3e, 0x0f, 0x8c, 0x0e, 0x7e, 0xed, 0x29\ndb 0x28, 0x5a, 0xdb, 0x8e, 0x4c, 0xc6, 0x5f, 0xf0, 0x3f, 0x54, 0xe8, 0x59, 0x2b, 0xf0, 0x5c, 0x78\ndb 0x28, 0xdd, 0x62, 0xc6, 0x22, 0xe7, 0x1a, 0xfe, 0x9f, 0x2e, 0x9a, 0x12, 0xa0, 0x9f, 0xbf, 0x24\ndb 0xfd, 0x25, 0x89, 0x1c, 0xf7, 0x03, 0xef, 0x1a, 0x26, 0xca, 0x17, 0x07, 0x3b, 0xf2, 0xb6, 0x99\ndb 0xed, 0xb7, 0xe9, 0xa4, 0x7c, 0x97, 0xcd, 0x7d, 0xf5, 0x76, 0x0a, 0xa2, 0x2f, 0x56, 0xe6, 0x67\ndb 0x9c, 0xcf, 0x8d, 0x16, 0x56, 0x6e, 0x69, 0xa6, 0x0a, 0xd9, 0x2f, 0x68, 0x42, 0xd3, 0xfe, 0x5c\ndb 0x3f, 0xb0, 0xf3, 0xcc, 0xc0, 0x6c, 0xbd, 0xe5, 0x0f, 0x35, 0xd9, 0x3a, 0x49, 0x59, 0x36, 0x36\ndb 0xad, 0x8f, 0xff, 0xa8, 0xa6, 0xb7, 0x23, 0xb6, 0xfa, 0xae, 0x3c, 0x4f, 0x89, 0x37, 0x0f, 0x48\ndb 0x04, 0xbe, 0x98, 0x63, 0xf7, 0xe9, 0xad, 0xb4, 0x9e, 0xd4, 0xb1, 0xd9, 0xc1, 0xdb, 0x07, 0x12\ndb 0x49, 0xa2, 0xa4, 0x8c, 0x99, 0xeb, 0xb1, 0xaa, 0x6d, 0x65, 0xf6, 0x54, 0x75, 0x31, 0x49, 0x1d\ndb 0xf9, 0x4e, 0xbb, 0xf1, 0x41, 0x7a, 0x89, 0x4d, 0xc8, 0x24, 0x9f, 0xda, 0xaa, 0x26, 0xc7, 0x82\ndb 0x6f, 0xf8, 0x04, 0xf4, 0xda, 0x6f, 0x34, 0xe8, 0x42, 0x9d, 0x47, 0xa3, 0xa6, 0x15, 0x2b, 0x15\ndb 0x8b, 0xbc, 0x2d, 0xd2, 0xa7, 0x2e, 0x52, 0x05, 0x6a, 0x56, 0x01, 0x1e, 0xf2, 0xb7, 0xa9, 0xfd\ndb 0xf3, 0x21, 0x69, 0xa5, 0xe4, 0x84, 0x7d, 0x17, 0x12, 0x91, 0x2c, 0xf0, 0xe0, 0x59, 0x46, 0x5e\ndb 0x81, 0xdb, 0x38, 0xbc, 0x02, 0xc0, 0xa7, 0x32, 0xee, 0xbd, 0x35, 0x73, 0xa9, 0x34, 0xec, 0x07\ndb 0xce, 0xa2, 0x29, 0x24, 0xc1, 0xc5, 0xc4, 0x84, 0x3a, 0x80, 0xdc, 0x2b, 0x8b, 0xe9, 0xe2, 0xa0\ndb 0xee, 0xe2, 0xeb, 0xd7, 0x16, 0x53, 0xce, 0x0f, 0x7f, 0x91, 0xd4, 0x1b, 0x06, 0x8f, 0xa3, 0xa9\ndb 0x2d, 0xf8, 0x0c, 0x40, 0x27, 0xf1, 0x91, 0x45, 0xbb, 0xf1, 0xa0, 0x33, 0x59, 0x7b, 0xc1, 0x90\ndb 0xe7, 0xc0, 0x4d, 0xd4, 0x9f, 0xc7, 0xe4, 0x31, 0xd0, 0x0f, 0xed, 0xad, 0x3e, 0x50, 0x1f, 0x82\ndb 0x80, 0xdf, 0x43, 0xdb, 0xe2, 0x9f, 0xdb, 0x19, 0x5f, 0x80, 0xaf, 0xa5, 0x25, 0xc7, 0xb9, 0x5e\ndb 0x82, 0xd6, 0x6b, 0x49, 0xee, 0x8c, 0xda, 0x3e, 0x4e, 0xef, 0x25, 0x1f, 0x8b, 0xe9, 0xa8, 0x6a\ndb 0xa1, 0x0c, 0xe2, 0x57, 0xd3, 0x97, 0xaa, 0xa5, 0xc3, 0x3b, 0x04, 0x81, 0xde, 0x3a, 0x8b, 0x65\ndb 0xf7, 0xa0, 0x0b, 0xe5, 0x8d, 0xe3, 0x7c, 0xc4, 0xd3, 0x4e, 0x2c, 0xec, 0xa2, 0x3f, 0x3e, 0x62\ndb 0x3f, 0x21, 0x88, 0x1d, 0x1d, 0x59, 0xb5, 0xca, 0xd9, 0xf8, 0x61, 0x49, 0x57, 0x15, 0xd0, 0x03\ndb 0xfa, 0xc5, 0x32, 0xd9, 0xd3, 0x13, 0x93, 0x6b, 0x93, 0x8e, 0x65, 0xba, 0x70, 0xac, 0x11, 0x0a\ndb 0x1d, 0xb6, 0xe8, 0x8a, 0x5a, 0x13, 0x15, 0xe0, 0x58, 0x9a, 0x91, 0x2a, 0x28, 0xe7, 0xc2, 0xac\ndb 0xc5, 0x18, 0xd1, 0xc9, 0xeb, 0xd9, 0xa9, 0x5b, 0xab, 0x4e, 0xb4, 0x17, 0xf3, 0x49, 0x22, 0xc9\ndb 0x2c, 0xca, 0x53, 0xdf, 0x0a, 0x84, 0x14, 0x07, 0x48, 0x45, 0xda, 0x90, 0xc2, 0x76, 0xba, 0xfd\ndb 0x55, 0x75, 0x53, 0xda, 0x90, 0x6b, 0x16, 0x90, 0x0e, 0xe1, 0xef, 0x27, 0x6a, 0x38, 0xe5, 0x5e\ndb 0xfe, 0x78, 0xd0, 0x71, 0xda, 0xe9, 0xf9, 0x5e, 0x7d, 0xac, 0x27, 0x8d, 0xae, 0xe8, 0x59, 0x7c\ndb 0x3c, 0xd2, 0xa0, 0xa4, 0x2b, 0x86, 0x8c, 0xd7, 0x76, 0x11, 0xb7, 0x09, 0xdd, 0xdf, 0x03, 0x01\ndb 0x08, 0x5b, 0xb1, 0x42, 0x99, 0x06, 0xf8, 0xe8, 0xe5, 0x7f, 0xb2, 0x26, 0xe1, 0xb6, 0x3f, 0x7c\ndb 0xc1, 0x38, 0xd8, 0x03, 0x33, 0x3f, 0xe6, 0x88, 0xcc, 0x73, 0x02, 0xbf, 0xef, 0x67, 0xe1, 0x14\ndb 0x96, 0x28, 0xba, 0x62, 0xed, 0x4e, 0x95, 0x6a, 0x95, 0xa8, 0xf9, 0x92, 0xd6, 0xb6, 0xc1, 0x5f\ndb 0x8f, 0x55, 0x69, 0x0b, 0xc8, 0x5b, 0x9d, 0x9a, 0xab, 0x51, 0x0b, 0x45, 0x12, 0x74, 0xa8, 0x7f\ndb 0x5f, 0x12, 0x2b, 0x2b, 0xd2, 0x9f, 0x95, 0xf5, 0x19, 0xd1, 0xc4, 0x37, 0xb7, 0xfc, 0x91, 0x06\ndb 0xff, 0xea, 0xb1, 0x45, 0xcb, 0x37, 0xe2, 0xce, 0x5e, 0x5f, 0x5f, 0x2f, 0x8c, 0xc1, 0x99, 0x39\ndb 0x23, 0x8a, 0xd6, 0x89, 0xd8, 0xdc, 0xa0, 0xa7, 0x57, 0xa6, 0xf6, 0xbd, 0xd7, 0xda, 0xf2, 0x8b\ndb 0x58, 0x06, 0xc2, 0x99, 0x99, 0x30, 0x84, 0xd2, 0xf5, 0xf0, 0x23, 0x03, 0xde, 0xb0, 0x88, 0xdb\ndb 0xca, 0x43, 0xae, 0xc0, 0x3b, 0x47, 0xa5, 0x4b, 0x00, 0xc5, 0xbd, 0xcc, 0x20, 0xb0, 0x94, 0x1f\ndb 0xe1, 0x01, 0xec, 0x35, 0x45, 0xa0, 0x61, 0x56, 0x47, 0x50, 0x72, 0xc8, 0x14, 0xfa, 0xe6, 0x2c\ndb 0xfe, 0xfa, 0xed, 0xef, 0x33, 0xd2, 0x4a, 0x3d, 0x45, 0xa8, 0xaf, 0x5f, 0x8b, 0xd8, 0xb5, 0x66\ndb 0x12, 0x09, 0x51, 0x0a, 0x47, 0x9b, 0xaa, 0xe1, 0x1e, 0x24, 0x4c, 0xd5, 0x92, 0x5f, 0x0c, 0x5e\ndb 0x90, 0x7f, 0x06, 0x77, 0x03, 0x16, 0xb8, 0x23, 0xfa, 0x24, 0x79, 0x1c, 0x7e, 0x7c, 0x77, 0xb4\ndb 0x81, 0x8f, 0x5b, 0xe2, 0x7e, 0xcc, 0xcb, 0xdf, 0x51, 0x5c, 0x3b, 0xb5, 0x21, 0x28, 0x82, 0xc7\ndb 0x0e, 0xa6, 0xdf, 0xe9, 0x91, 0x19, 0x6b, 0x70, 0x76, 0x19, 0xd8, 0x59, 0xdd, 0x37, 0x9b, 0xf2\ndb 0xfd, 0x03, 0x4f, 0x62, 0xc9, 0x4f, 0xb0, 0x9c, 0xd0, 0xf4, 0x63, 0x8b, 0x82, 0x1c, 0x70, 0xe4\ndb 0x69, 0x5c, 0x7d, 0x32, 0xb6, 0xba, 0xfe, 0x5e, 0xd5, 0xe3, 0x25, 0x45, 0x6c, 0xbf, 0x7c, 0x12\ndb 0xa3, 0xb8, 0x45, 0x07, 0xc7, 0xe1, 0xdc, 0xa6, 0xab, 0x45, 0xd0, 0x09, 0x36, 0xf9, 0x38, 0x85\ndb 0x98, 0x1f, 0x11, 0x98, 0x93, 0x80, 0x0b, 0x77, 0x7f, 0x60, 0x6a, 0x86, 0x0f, 0x78, 0x7b, 0x6f\ndb 0xbc, 0x10, 0x24, 0x87, 0xaf, 0x1b, 0x94, 0x7c, 0xea, 0x58, 0xe3, 0x1e, 0x90, 0x4c, 0x56, 0x49\ndb 0xc9, 0x2c, 0x54, 0xf1, 0xe1, 0xe4, 0xba, 0xfc, 0x3d, 0xce, 0x58, 0x31, 0x31, 0x98, 0x08, 0x48\ndb 0x73, 0x28, 0x09, 0x6f, 0x77, 0xe6, 0x90, 0x09, 0x91, 0x3a, 0x29, 0x99, 0xec, 0x61, 0x0d, 0x3b\ndb 0xdc, 0xe3, 0xeb, 0x32, 0x72, 0xac, 0xbe, 0x03, 0xf9, 0x65, 0xa5, 0xd1, 0xb5, 0xb5, 0xf6, 0x3c\ndb 0x16, 0x2f, 0x83, 0x7e, 0x5a, 0x72, 0x67, 0xbc, 0xf6, 0xb8, 0xa4, 0xa3, 0x9e, 0x38, 0x75, 0x7b\ndb 0x42, 0xc7, 0xa5, 0xa6, 0x9a, 0x83, 0x25, 0xed, 0x0d, 0xda, 0x4e, 0x78, 0x6c, 0x55, 0x57, 0x6e\ndb 0x5e, 0xaf, 0x3e, 0x9b, 0x52, 0xda, 0x4f, 0xbf, 0x75, 0xee, 0x50, 0x5f, 0xcc, 0x8f, 0x11, 0xe7\ndb 0xac, 0x63, 0xa5, 0x4a, 0xaa, 0x80, 0x95, 0x78, 0xac, 0x71, 0x98, 0x86, 0xf4, 0x3f, 0x20, 0x3a\ndb 0xa7, 0x18, 0x88, 0x6f, 0xe3, 0x79, 0x79, 0xb8, 0x98, 0x07, 0x55, 0xf0, 0xbd, 0x21, 0xba, 0x52\ndb 0x94, 0xec, 0x54, 0x01, 0x54, 0x2b, 0x50, 0xaf, 0x28, 0x3b, 0xfe, 0xbc, 0x60, 0xd2, 0xf6, 0xc3\ndb 0xfd, 0xf8, 0x9c, 0x02, 0xfc, 0x62, 0xee, 0x5f, 0x83, 0xfe, 0x7e, 0xc6, 0x8d, 0xd5, 0xe9, 0xff\ndb 0xdb, 0xf5, 0x2c, 0xcd, 0x1b, 0x52, 0xcc, 0x6a, 0x8a, 0x01, 0x61, 0x09, 0x76, 0x78, 0x03, 0x5c\ndb 0x81, 0x1d, 0xc9, 0xff, 0x46, 0x92, 0xd7, 0x7f, 0xb6, 0xaf, 0x90, 0x38, 0xf7, 0x2d, 0x7f, 0x5a\ndb 0xd7, 0xce, 0x87, 0x1b, 0x9d, 0xa4, 0x67, 0x7a, 0xce, 0x7b, 0xe8, 0x8f, 0xff, 0x2c, 0x37, 0xbc\ndb 0xb6, 0x41, 0x66, 0x32, 0xf1, 0x0d, 0x1e, 0x12, 0x3c, 0x7b, 0xff, 0x18, 0xc1, 0x1b, 0x3b, 0x51\ndb 0xd0, 0xde, 0x9d, 0x84, 0xf3, 0x01, 0x63, 0x38, 0x4b, 0x85, 0x39, 0x6b, 0x93, 0x25, 0xea, 0x05\ndb 0x85, 0xe9, 0xbd, 0x9a, 0x1d, 0x94, 0xcf, 0x9d, 0x1d, 0xed, 0x6e, 0xd4, 0x69, 0x83, 0x57, 0x14\ndb 0x92, 0x3f, 0x40, 0xae, 0xc6, 0xf8, 0xb9, 0x46, 0x9b, 0xf1, 0xdd, 0x51, 0x3e, 0x0d, 0x6f, 0xa0\ndb 0x1f, 0xf7, 0xbb, 0x16, 0x19, 0x5f, 0x0c, 0x43, 0x30, 0xfb, 0x46, 0xbc, 0x01, 0xfb, 0x9c, 0x81\ndb 0x3a, 0xd1, 0x33, 0x5a, 0xfe, 0xf5, 0x0d, 0x30, 0x86, 0x71, 0x0a, 0xd4, 0xc1, 0xe6, 0xb5, 0x88\ndb 0x26, 0x50, 0xe6, 0xc8, 0xc5, 0xc6, 0xab, 0x69, 0x5d, 0xfb, 0x55, 0x11, 0xbf, 0x51, 0xfd, 0xda\ndb 0xae, 0x63, 0xb8, 0x46, 0xf6, 0x54, 0x7f, 0xd1, 0x48, 0x79, 0xa9, 0x93, 0x22, 0x7e, 0xa3, 0x72\ndb 0x73, 0xf9, 0xeb, 0xac, 0xc5, 0x3b, 0xf1, 0xb0, 0x2a, 0x86, 0x21, 0xbe, 0x73, 0x4a, 0x1e, 0x95\ndb 0xc2, 0xcf, 0x85, 0x40, 0x23, 0x7b, 0x33, 0x4f, 0xa1, 0x0f, 0xdf, 0x64, 0x21, 0x9b, 0xf9, 0x2b\ndb 0xc0, 0x1a, 0xd6, 0xf8, 0x86, 0x2c, 0xa7, 0x0a, 0x5b, 0xdd, 0xd7, 0x9a, 0x9d, 0x2e, 0x34, 0x37\ndb 0xe1, 0x40, 0x3a, 0x43, 0xab, 0x13, 0xb3, 0x7d, 0xf0, 0x9d, 0x66, 0x97, 0x18, 0x73, 0x0f, 0xcb\ndb 0xbe, 0xa6, 0x5d, 0xab, 0x53, 0xa8, 0xf7, 0xd6, 0x90, 0x5b, 0x72, 0xa2, 0x6b, 0x35, 0xc7, 0xba\ndb 0xc7, 0xe5, 0x19, 0x01, 0xc3, 0x63, 0x09, 0x95, 0x36, 0x75, 0xf6, 0x92, 0x77, 0xf0, 0xe2, 0xd9\ndb 0x40, 0x6f, 0xd6, 0xae, 0x34, 0x82, 0x1a, 0x2f, 0xf3, 0x3e, 0x15, 0x12, 0x6b, 0x08, 0xa4, 0xc8\ndb 0xe1, 0xff, 0xa4, 0xf6, 0x52, 0x18, 0x8e, 0xea, 0xf0, 0xa1, 0xb0, 0x93, 0x42, 0x5e, 0xa3, 0xe5\ndb 0xd0, 0x09, 0x1b, 0x08, 0xf7, 0xa8, 0x09, 0x42, 0x48, 0xaa, 0x0a, 0x93, 0xf7, 0x6d, 0x14, 0x9a\ndb 0x8e, 0xf1, 0xfe, 0x13, 0x82, 0xf8, 0x4a, 0x86, 0xd1, 0x6f, 0x23, 0x5d, 0xf2, 0x2b, 0x78, 0xb2\ndb 0xee, 0x8a, 0xff, 0xc1, 0x07, 0x21, 0x87, 0xa2, 0xf4, 0x48, 0x33, 0x97, 0x3a, 0x37, 0x68, 0x46\ndb 0xb8, 0x9e, 0x24, 0x0e, 0x8f, 0x41, 0x0b, 0x30, 0xed, 0x95, 0x16, 0x89, 0x3a, 0x9e, 0x00, 0xbf\ndb 0x83, 0x82, 0xfb, 0xfd, 0x60, 0x9d, 0x8e, 0x70, 0x5f, 0xf2, 0x6f, 0x7c, 0x7a, 0x11, 0x81, 0x76\ndb 0xf6, 0xa9, 0x3a, 0x08, 0x59, 0xb4, 0xd0, 0x3a, 0x9c, 0xb8, 0x11, 0xe2, 0x1d, 0x16, 0x60, 0x5c\ndb 0xcb, 0x46, 0x67, 0xe9, 0x1e, 0xb6, 0x74, 0x6d, 0x9b, 0x5f, 0x47, 0xaa, 0xdf, 0x9d, 0x74, 0x90\ndb 0xb9, 0x53, 0xb5, 0x85, 0x46, 0xbb, 0x67, 0xc2, 0xbc, 0x08, 0xcb, 0x5e, 0x4d, 0x57, 0xd1, 0x63\ndb 0xbc, 0x2b, 0xdb, 0xe3, 0xf4, 0x6b, 0xee, 0xd1, 0x65, 0x52, 0x33, 0x61, 0x30, 0x9d, 0x61, 0x43\ndb 0x5c, 0xf8, 0xa5, 0x16, 0xd4, 0x3a, 0x3c, 0x52, 0xd9, 0x94, 0xe9, 0x41, 0x63, 0xf6, 0x48, 0xfb\ndb 0xe1, 0x6d, 0x20, 0x41, 0xbc, 0xa5, 0x67, 0xe1, 0x04, 0x02, 0xf3, 0xf8, 0x2d, 0x43, 0x50, 0xef\ndb 0xf6, 0x01, 0x11, 0x38, 0xe5, 0xa7, 0xc6, 0x73, 0xcb, 0xe3, 0x5d, 0x23, 0x22, 0x27, 0x6d, 0x89\ndb 0x8e, 0x38, 0x90, 0xbc, 0xfe, 0xb6, 0xfe, 0x88, 0x96, 0x12, 0xa6, 0xc6, 0x75, 0xb0, 0x3f, 0x1b\n\nalign 32\n; 8192-bytes of random data\n.random_data2:\ndb 0x18, 0xe0, 0x94, 0xf6, 0x0b, 0x6f, 0xbf, 0xca, 0x7c, 0x31, 0x4d, 0x34, 0x28, 0x68, 0xe6, 0xf3\ndb 0x3f, 0xb1, 0x8b, 0x43, 0x35, 0x4b, 0x58, 0x87, 0x48, 0x41, 0x94, 0x8c, 0xf2, 0xb3, 0xc7, 0xed\ndb 0x4b, 0x55, 0xc7, 0x9e, 0x03, 0x36, 0x2f, 0x16, 0xeb, 0xb7, 0xb8, 0x15, 0xe6, 0xb5, 0x06, 0x6e\ndb 0x00, 0x5b, 0x54, 0xcd, 0xe1, 0x34, 0xe5, 0xee, 0xc6, 0xf5, 0x6f, 0x71, 0x16, 0x81, 0x1e, 0x85\ndb 0xf8, 0x68, 0xbe, 0x81, 0xc3, 0xca, 0xa7, 0x48, 0x03, 0xc4, 0xfa, 0x63, 0xbe, 0x2e, 0xd2, 0x23\ndb 0xf2, 0xaf, 0xb4, 0x0a, 0x57, 0x16, 0x49, 0x65, 0x7b, 0x84, 0x05, 0x44, 0xe6, 0x6b, 0x78, 0xfe\ndb 0xff, 0xae, 0x2e, 0x20, 0xf1, 0xd6, 0xed, 0x08, 0xa0, 0x0d, 0xd2, 0x4b, 0xd4, 0x5f, 0x98, 0xfc\ndb 0xfc, 0x91, 0x06, 0x30, 0xec, 0x8c, 0x92, 0x2a, 0x71, 0x12, 0x8d, 0x61, 0xfd, 0xe4, 0x50, 0x64\ndb 0xc1, 0xce, 0xc3, 0x07, 0xd9, 0xee, 0x0e, 0x0e, 0xac, 0x27, 0xa8, 0xc4, 0x21, 0xcf, 0x34, 0xff\ndb 0x28, 0x94, 0xb1, 0xa1, 0xbe, 0xa1, 0x14, 0x14, 0x58, 0x64, 0x2c, 0x21, 0x39, 0xb2, 0xa0, 0x77\ndb 0x86, 0xfd, 0x91, 0xed, 0x5e, 0x8f, 0x65, 0x7f, 0xc9, 0x74, 0x8f, 0x98, 0x17, 0x82, 0x8f, 0x04\ndb 0x0a, 0x40, 0x58, 0x3d, 0x29, 0xff, 0x93, 0x8d, 0xb1, 0x56, 0x56, 0x1f, 0x0a, 0xed, 0x7f, 0xfb\ndb 0x96, 0xd8, 0x80, 0x2b, 0xcb, 0x5f, 0x5b, 0xdf, 0x4a, 0x84, 0xcb, 0x3a, 0xdd, 0xe7, 0x0a, 0xfc\ndb 0x4b, 0x60, 0x38, 0x31, 0x36, 0x5f, 0x44, 0x02, 0x5f, 0xdd, 0x64, 0xaa, 0xcd, 0xc7, 0x4f, 0xe9\ndb 0x65, 0xf8, 0xe4, 0x7c, 0x71, 0xe1, 0x51, 0xbe, 0x56, 0xe5, 0x19, 0x97, 0x91, 0xbe, 0x85, 0x5d\ndb 0x29, 0xf7, 0xac, 0x1b, 0xad, 0x45, 0xb5, 0x27, 0xa3, 0x97, 0x74, 0x3c, 0x50, 0x37, 0xc7, 0x25\ndb 0x8c, 0x5c, 0xea, 0x74, 0x18, 0x2d, 0xcf, 0x28, 0xb7, 0x56, 0x8a, 0xf4, 0xd1, 0x9c, 0xf8, 0x49\ndb 0xcf, 0xc2, 0xa5, 0x3d, 0x0a, 0x64, 0xff, 0x0c, 0xa0, 0x93, 0x58, 0x4c, 0x17, 0x7f, 0xeb, 0xeb\ndb 0x4b, 0xd8, 0xad, 0xfb, 0xb5, 0x8f, 0xa1, 0x85, 0xeb, 0xda, 0x94, 0x98, 0x40, 0xde, 0x3b, 0x3f\ndb 0x03, 0xd2, 0xc0, 0xe0, 0x2d, 0x2d, 0x1a, 0x4e, 0x08, 0x3a, 0xe7, 0x5a, 0x3c, 0x5b, 0xe4, 0xe8\ndb 0x52, 0x34, 0xde, 0x62, 0x38, 0x3c, 0xbe, 0x11, 0x31, 0x3e, 0xa9, 0xb4, 0x0e, 0x77, 0xa5, 0x54\ndb 0x91, 0xec, 0x2e, 0x60, 0x9a, 0xb7, 0xf9, 0x35, 0xc2, 0x17, 0x76, 0x2a, 0xd6, 0x26, 0x03, 0x0a\ndb 0x3f, 0x36, 0x7e, 0x64, 0x4c, 0xdc, 0xb2, 0x47, 0x59, 0xa2, 0x6b, 0x18, 0x3d, 0xbb, 0x73, 0xb2\ndb 0xc0, 0x09, 0x12, 0xd7, 0xbe, 0x5b, 0x46, 0x54, 0x48, 0x81, 0xa6, 0x62, 0x2a, 0xa7, 0x8e, 0x4f\ndb 0xbf, 0x3b, 0x07, 0x37, 0x8f, 0xbc, 0x37, 0xe2, 0xc8, 0x6a, 0xcc, 0x6f, 0x04, 0x8a, 0x50, 0x56\ndb 0x42, 0x35, 0xf2, 0x78, 0x33, 0xd8, 0xa3, 0xc6, 0x8b, 0x7f, 0x8a, 0xde, 0x3f, 0xed, 0x69, 0x2a\ndb 0x6e, 0xbf, 0x48, 0x2c, 0x92, 0x44, 0x74, 0xf6, 0x89, 0xb5, 0x54, 0x16, 0x97, 0x01, 0x03, 0x79\ndb 0x5c, 0x4c, 0x4f, 0x82, 0xd7, 0x80, 0x8a, 0x9d, 0xc8, 0xc3, 0xcf, 0x9e, 0x71, 0x46, 0x24, 0x30\ndb 0xe1, 0x2f, 0x7f, 0x2d, 0x13, 0xa1, 0xc8, 0x5b, 0xcb, 0x28, 0x2e, 0xd5, 0xe9, 0xc1, 0xc2, 0xf9\ndb 0x9b, 0xfc, 0x91, 0xc8, 0x18, 0x5d, 0x7a, 0x7f, 0x2c, 0xf2, 0x33, 0xff, 0xc4, 0x76, 0xa8, 0x17\ndb 0xfe, 0x5b, 0xba, 0x30, 0x42, 0x25, 0x7b, 0x98, 0xa8, 0xcb, 0x00, 0x46, 0xb5, 0xa0, 0x34, 0xd3\ndb 0xdd, 0x40, 0xb0, 0xd2, 0xf6, 0x67, 0x89, 0x33, 0x5d, 0x0f, 0x34, 0xc8, 0xd2, 0x10, 0x75, 0xba\ndb 0xd4, 0x33, 0xc4, 0xd9, 0xbb, 0x71, 0x60, 0xde, 0x31, 0xe0, 0xe0, 0xe4, 0x3e, 0x82, 0xf7, 0x99\ndb 0x6b, 0x1b, 0x04, 0xd1, 0x82, 0xa6, 0x17, 0x4b, 0x01, 0xde, 0x3b, 0xf6, 0x8d, 0x80, 0x82, 0x62\ndb 0x86, 0xd8, 0xc2, 0x58, 0xa2, 0x9c, 0x44, 0xec, 0x4d, 0x59, 0x99, 0x9c, 0x44, 0x2b, 0x6d, 0xbf\ndb 0x9b, 0x52, 0xe8, 0x1f, 0x34, 0x58, 0xfa, 0xdc, 0x75, 0x2d, 0x71, 0xc5, 0x7a, 0x08, 0x3d, 0xf4\ndb 0xa2, 0x14, 0x08, 0x89, 0x04, 0x34, 0x9d, 0x73, 0xed, 0x48, 0xa7, 0x6c, 0x83, 0x9a, 0xf0, 0x38\ndb 0xfb, 0xd6, 0x2b, 0xc2, 0x63, 0x12, 0x10, 0xd4, 0x59, 0x55, 0xa6, 0x9f, 0x95, 0x55, 0x43, 0xf6\ndb 0x70, 0x4b, 0xec, 0x1d, 0x32, 0xad, 0x1f, 0xa8, 0x32, 0xeb, 0x57, 0xbf, 0x4e, 0x7b, 0xae, 0xdf\ndb 0x96, 0xf0, 0x39, 0x2d, 0x09, 0xed, 0x03, 0x78, 0x99, 0xea, 0x87, 0x1f, 0xcc, 0xa9, 0x27, 0x22\ndb 0xb8, 0x63, 0x52, 0x23, 0xf0, 0x96, 0x65, 0xc4, 0x6c, 0xf2, 0xb4, 0xbf, 0xd9, 0x40, 0xbb, 0x04\ndb 0xb2, 0xf1, 0x4a, 0xc8, 0xd5, 0x7c, 0xfe, 0x1d, 0xc7, 0x3a, 0xc5, 0x41, 0x29, 0x7c, 0x23, 0xd7\ndb 0x8d, 0x69, 0x41, 0xd7, 0x22, 0xda, 0xfe, 0xd8, 0x0e, 0xbf, 0xf8, 0x51, 0xd5, 0x0c, 0xb5, 0x90\ndb 0xb3, 0x22, 0xb0, 0xc1, 0x75, 0x59, 0xe8, 0xbe, 0x24, 0x05, 0x26, 0x68, 0xfe, 0xf7, 0xcc, 0x35\ndb 0x91, 0x70, 0x7c, 0x11, 0x60, 0xd4, 0x22, 0x2b, 0x99, 0x11, 0x28, 0x37, 0x26, 0x5b, 0x9b, 0x09\ndb 0xd7, 0xb4, 0x7c, 0xc4, 0x3a, 0x2a, 0xb4, 0x96, 0x19, 0x12, 0xf3, 0x7d, 0x3c, 0xa3, 0x9e, 0x1e\ndb 0xd6, 0x24, 0x9a, 0x39, 0x41, 0xab, 0xe2, 0xdf, 0xa0, 0xcf, 0xd6, 0xd1, 0x06, 0x3d, 0x56, 0x61\ndb 0xa3, 0x3d, 0xec, 0xbc, 0x97, 0x60, 0xdd, 0x1e, 0x71, 0x65, 0x9f, 0x49, 0xd2, 0xc1, 0xd2, 0xa4\ndb 0x2b, 0x5c, 0x44, 0x7e, 0x70, 0x4b, 0x23, 0xb0, 0x6e, 0x1c, 0x20, 0x84, 0xd8, 0x2b, 0x83, 0xc8\ndb 0x6d, 0x63, 0xcc, 0x81, 0x82, 0x55, 0x7d, 0x18, 0xe8, 0x3f, 0x46, 0xc2, 0x47, 0xdc, 0xca, 0x6d\ndb 0x4b, 0xd8, 0xec, 0x4d, 0x38, 0xd6, 0x82, 0xa5, 0x8c, 0x10, 0xfe, 0x0d, 0x56, 0x7a, 0x95, 0xf6\ndb 0xdd, 0xd5, 0x6e, 0x74, 0x1c, 0x02, 0x90, 0x8b, 0x84, 0x62, 0x9b, 0x7d, 0x27, 0x6d, 0x4b, 0xfe\ndb 0xb8, 0x5d, 0xa7, 0xf0, 0x49, 0xcd, 0x93, 0xd7, 0xb0, 0x72, 0x84, 0x6b, 0xa4, 0xd9, 0xf8, 0x4d\ndb 0x5a, 0x52, 0x69, 0xf0, 0xdc, 0x39, 0x15, 0x5c, 0x6f, 0xd1, 0x35, 0xa3, 0xc8, 0x8b, 0x9c, 0x8f\ndb 0xff, 0xff, 0xe3, 0x12, 0xc7, 0x84, 0xc5, 0xec, 0x80, 0x83, 0x8f, 0x79, 0x41, 0xbb, 0x87, 0xca\ndb 0x6c, 0x6b, 0x61, 0x10, 0x0e, 0x9e, 0x01, 0xaf, 0xf8, 0x74, 0xdd, 0x86, 0x8e, 0xdb, 0x27, 0xb9\ndb 0xd9, 0xc3, 0x1f, 0xfd, 0x16, 0x18, 0x7b, 0xe7, 0x2d, 0xbc, 0x0a, 0x7a, 0xa1, 0x67, 0x57, 0xc9\ndb 0xc5, 0x8d, 0x2d, 0x11, 0x36, 0x63, 0x02, 0xa3, 0x3f, 0x9b, 0x8f, 0x41, 0x7f, 0xaf, 0x89, 0xaf\ndb 0xe4, 0x2a, 0x91, 0x66, 0xed, 0xb0, 0xf3, 0x12, 0xaf, 0xd5, 0x02, 0xdc, 0x07, 0xd6, 0x6d, 0xff\ndb 0x70, 0x9a, 0xc9, 0xe0, 0x31, 0xeb, 0xe1, 0x60, 0xd9, 0xda, 0x81, 0x9e, 0x70, 0xf6, 0x51, 0x0b\ndb 0x8e, 0xc3, 0xd3, 0x65, 0xdf, 0xe5, 0x2d, 0x2f, 0xf2, 0x3d, 0x92, 0xdd, 0x46, 0x0a, 0x83, 0xe2\ndb 0x69, 0x90, 0x28, 0xa4, 0x39, 0xe3, 0x67, 0x20, 0x95, 0x48, 0xe1, 0xa6, 0xad, 0x12, 0x96, 0x9e\ndb 0xb3, 0x11, 0xe7, 0xe6, 0x4c, 0x49, 0x0a, 0x42, 0x47, 0xb4, 0xdd, 0xb5, 0xe8, 0x06, 0x9f, 0x2b\ndb 0x30, 0x9c, 0x19, 0xc5, 0xaa, 0x81, 0xcf, 0x2f, 0x90, 0x09, 0x94, 0x21, 0x69, 0x80, 0x6f, 0x3b\ndb 0xcd, 0x9c, 0xb6, 0x1f, 0x7f, 0x3c, 0x2b, 0xf8, 0x1c, 0xed, 0x77, 0xda, 0x0f, 0xb1, 0x96, 0x5a\ndb 0x1d, 0x88, 0x55, 0x81, 0x33, 0x8c, 0xa9, 0x61, 0xc7, 0xe0, 0xfe, 0xbb, 0x1e, 0x26, 0xd6, 0x26\ndb 0x13, 0x42, 0x3c, 0x79, 0xf7, 0x66, 0xca, 0x9e, 0xe8, 0x56, 0xf4, 0x76, 0xbb, 0x7b, 0x1a, 0x0a\ndb 0x83, 0x1d, 0x7f, 0x6b, 0xdd, 0x2d, 0xc2, 0xb0, 0x32, 0x57, 0x17, 0x23, 0x83, 0x95, 0xdb, 0x2f\ndb 0x4f, 0x06, 0xc8, 0x50, 0x38, 0xf3, 0xa6, 0x36, 0x64, 0x78, 0xf2, 0xf2, 0xde, 0xcb, 0x26, 0x19\ndb 0xee, 0x5f, 0x0e, 0xdd, 0x5d, 0xd0, 0xa4, 0xef, 0xe9, 0xa9, 0xe3, 0x7c, 0xe6, 0x12, 0x89, 0x91\ndb 0xc6, 0xc0, 0x68, 0x61, 0x1d, 0x81, 0x6e, 0xd1, 0x7a, 0x7f, 0x4d, 0xc1, 0x03, 0x7c, 0x54, 0x4e\ndb 0xb6, 0xe9, 0x51, 0x41, 0x51, 0x1b, 0x65, 0x80, 0x81, 0xbc, 0x51, 0x8c, 0x60, 0xe5, 0x18, 0xdb\ndb 0x13, 0x6b, 0xcb, 0x13, 0x49, 0xf1, 0x24, 0xbe, 0x37, 0x18, 0xda, 0x36, 0xde, 0x77, 0xd8, 0x60\ndb 0xdd, 0x3d, 0x21, 0x83, 0xc0, 0xfe, 0x6e, 0x29, 0x37, 0xe0, 0x8a, 0x5b, 0xbc, 0x3e, 0xc8, 0x11\ndb 0x9b, 0xef, 0x2e, 0x52, 0xa5, 0xd0, 0x99, 0xe2, 0xe5, 0x5c, 0xfc, 0x21, 0x53, 0x03, 0x4c, 0x4a\ndb 0xdf, 0x42, 0x45, 0x6f, 0x07, 0x74, 0x46, 0x80, 0x41, 0x9e, 0x44, 0x3b, 0x0b, 0x46, 0x7b, 0xf3\ndb 0x20, 0xa8, 0x87, 0x71, 0xc0, 0xad, 0x74, 0x7a, 0xbc, 0x19, 0x22, 0xdd, 0xcc, 0xc2, 0xf8, 0x1c\ndb 0xee, 0x92, 0x00, 0xb7, 0xfb, 0x41, 0x8b, 0x74, 0x56, 0x35, 0x53, 0x5a, 0x6f, 0xc6, 0xf6, 0x5a\ndb 0x98, 0xb5, 0xd4, 0xb2, 0x0f, 0xb7, 0xc1, 0x11, 0x47, 0x16, 0x2f, 0xaf, 0x8e, 0xdf, 0xf3, 0x72\ndb 0x51, 0x51, 0xf6, 0x4e, 0x9b, 0x77, 0x10, 0x7d, 0xff, 0xe0, 0x99, 0x53, 0x9c, 0x9e, 0xbe, 0xa4\ndb 0xb6, 0xa3, 0x8f, 0x67, 0xba, 0x3c, 0xb2, 0x91, 0x2c, 0xeb, 0x1f, 0x4f, 0x49, 0xc9, 0xf0, 0x69\ndb 0x21, 0xe2, 0x48, 0xe8, 0xe1, 0xcb, 0x85, 0xa7, 0x6a, 0x1d, 0x64, 0x1f, 0x7a, 0xfb, 0xde, 0x1f\ndb 0x6d, 0xcd, 0x8c, 0xe8, 0xbf, 0x16, 0xf4, 0x18, 0xb7, 0x8f, 0x89, 0x94, 0xe8, 0xe1, 0xb0, 0x76\ndb 0xd3, 0xe8, 0x74, 0xd7, 0xc4, 0x7d, 0x61, 0x2e, 0xbb, 0x5f, 0xd5, 0x05, 0xce, 0xbf, 0x09, 0xfe\ndb 0x4d, 0x9e, 0x9a, 0x9b, 0x10, 0xa1, 0x27, 0x6a, 0x86, 0xda, 0x7a, 0xfb, 0xf3, 0xd6, 0x3c, 0x61\ndb 0x6a, 0xaf, 0x5d, 0xa9, 0x93, 0x19, 0x9b, 0xa6, 0x5e, 0x37, 0xb1, 0xc2, 0xb0, 0x91, 0x9b, 0x84\ndb 0xea, 0x33, 0x52, 0x2d, 0x18, 0x44, 0x5f, 0xeb, 0x84, 0xa1, 0xbc, 0x00, 0xe4, 0x36, 0x7e, 0x58\ndb 0x2e, 0x02, 0xc4, 0x00, 0x09, 0x85, 0xe8, 0x7e, 0xc3, 0xe0, 0xfe, 0x98, 0x73, 0x74, 0x4c, 0x6b\ndb 0xc9, 0xe3, 0x5a, 0x41, 0xa8, 0xbe, 0xea, 0xfc, 0x33, 0x49, 0x13, 0xf9, 0x32, 0x9c, 0x71, 0x73\ndb 0x05, 0x40, 0x90, 0x9b, 0xae, 0xe3, 0x38, 0x10, 0x86, 0x52, 0x80, 0x25, 0x88, 0xd8, 0x0a, 0x49\ndb 0x0b, 0xa2, 0xfa, 0x38, 0x7c, 0x74, 0x47, 0x20, 0xd0, 0x5c, 0x9f, 0x3d, 0x54, 0x3f, 0x52, 0x6d\ndb 0x7b, 0x4a, 0xcd, 0x7a, 0x2e, 0x4d, 0x2f, 0x9f, 0xf7, 0x51, 0x39, 0x7a, 0xc5, 0x0a, 0xe7, 0x37\ndb 0xa9, 0xb3, 0xc4, 0xd8, 0xf0, 0x04, 0xcc, 0xa0, 0xf8, 0x79, 0x55, 0x73, 0x2c, 0x23, 0x8a, 0x2a\ndb 0x39, 0xc8, 0xe5, 0xad, 0x24, 0x19, 0x35, 0xce, 0x46, 0xaf, 0xe1, 0xbb, 0x8e, 0x95, 0x33, 0xf4\ndb 0xe2, 0xc6, 0xe0, 0xcf, 0x4a, 0x7b, 0x7c, 0x70, 0xcb, 0x8c, 0x7e, 0xfc, 0x12, 0x9a, 0x78, 0xb5\ndb 0x62, 0x42, 0x52, 0xdd, 0x51, 0xd5, 0x9c, 0xb9, 0x60, 0x75, 0xf3, 0xf0, 0xad, 0xde, 0x55, 0xcb\ndb 0x96, 0x54, 0x10, 0x41, 0x9f, 0xf1, 0x44, 0x92, 0xc6, 0xa2, 0xf9, 0xb8, 0xe4, 0x11, 0x38, 0x56\ndb 0xf3, 0x0f, 0x73, 0x5f, 0xfd, 0xc1, 0x44, 0x8b, 0x72, 0xb9, 0xdc, 0x75, 0xef, 0xe8, 0x85, 0x46\ndb 0xf4, 0x14, 0xed, 0x79, 0x17, 0xa8, 0xea, 0xe5, 0xf6, 0x00, 0x28, 0x23, 0x89, 0xee, 0x6a, 0x06\ndb 0xdf, 0x09, 0x7a, 0x54, 0x5e, 0xe1, 0x6b, 0x6b, 0x7f, 0xdf, 0x69, 0x76, 0xd2, 0x7a, 0xd3, 0x77\ndb 0xe5, 0x98, 0xc2, 0x6a, 0x19, 0x7c, 0x73, 0xa8, 0xfe, 0x3d, 0xb0, 0x52, 0xc0, 0xfc, 0x3f, 0x83\ndb 0xe0, 0x60, 0x7a, 0xa6, 0x2f, 0xdd, 0x53, 0x4d, 0x35, 0x8d, 0xc2, 0xe3, 0x8e, 0xba, 0xf6, 0x32\ndb 0x28, 0xa6, 0x13, 0xe7, 0x0d, 0x1d, 0xd4, 0x20, 0xd7, 0x5e, 0xee, 0xcf, 0xbd, 0xb4, 0x0a, 0xf9\ndb 0xaf, 0x27, 0x05, 0x83, 0xcd, 0x53, 0x9d, 0x1f, 0x05, 0xcf, 0xa1, 0x56, 0xec, 0xe9, 0xd4, 0xb5\ndb 0x8b, 0x05, 0x4a, 0x81, 0xc8, 0x3d, 0xa4, 0xad, 0xda, 0x64, 0x90, 0xb2, 0xd9, 0xaf, 0xaf, 0x1b\ndb 0x54, 0xcf, 0xfc, 0xf3, 0x18, 0xa3, 0xbb, 0xc7, 0xe1, 0xa3, 0x29, 0xbb, 0x71, 0x1c, 0x76, 0x08\ndb 0x99, 0x1f, 0x78, 0xd9, 0xa9, 0x38, 0x83, 0xf2, 0x85, 0xac, 0x93, 0x4d, 0xf8, 0x93, 0xfd, 0x55\ndb 0x71, 0x52, 0x16, 0xf7, 0xba, 0x24, 0xaa, 0x7e, 0x3e, 0x95, 0xc3, 0x86, 0xfc, 0x5a, 0xe9, 0x27\ndb 0x87, 0x44, 0xe4, 0x9c, 0xb4, 0x60, 0xc9, 0x08, 0xd1, 0xc2, 0x3a, 0x3f, 0xc2, 0xca, 0x7e, 0xe7\ndb 0x12, 0x11, 0xe8, 0x44, 0xc7, 0xbc, 0x45, 0x5c, 0x28, 0xd6, 0x6c, 0x7f, 0x38, 0x0c, 0x43, 0x3d\ndb 0x67, 0xad, 0xac, 0x76, 0xa8, 0x80, 0x2b, 0x39, 0xa6, 0x12, 0xa0, 0x79, 0x13, 0x19, 0x29, 0x5a\ndb 0x7a, 0x00, 0xf1, 0x90, 0x9c, 0x85, 0x90, 0xe0, 0x13, 0x50, 0x0a, 0x47, 0x98, 0x8a, 0x72, 0xfc\ndb 0x5f, 0x21, 0x2c, 0xf0, 0x01, 0x95, 0xee, 0x11, 0xb3, 0x1e, 0xc9, 0x3e, 0x3e, 0x01, 0x27, 0xa2\ndb 0xfe, 0x59, 0x6e, 0xf1, 0x2c, 0x7c, 0x1a, 0x91, 0x7a, 0xb9, 0x43, 0xbd, 0xf6, 0x54, 0x4e, 0xd7\ndb 0xb3, 0x9f, 0xff, 0xa0, 0xe6, 0x43, 0x56, 0xb6, 0xa8, 0xab, 0x99, 0xcf, 0x8a, 0xda, 0x4c, 0x21\ndb 0xbf, 0x27, 0x5f, 0xb4, 0xd7, 0x43, 0x8c, 0x44, 0x56, 0x7b, 0xd5, 0x28, 0xd8, 0x47, 0xab, 0xdb\ndb 0xb9, 0xc8, 0x90, 0x01, 0x9a, 0xb1, 0x55, 0x44, 0x9c, 0x2d, 0xff, 0x08, 0x59, 0x77, 0x95, 0x5e\ndb 0x6b, 0x96, 0x6f, 0x60, 0xd9, 0xff, 0xa3, 0xce, 0x1b, 0x08, 0xab, 0x85, 0xeb, 0xc7, 0x85, 0xcf\ndb 0x2d, 0x9c, 0xea, 0x49, 0xaa, 0x74, 0x3a, 0x6e, 0xda, 0x43, 0x1a, 0xef, 0xc7, 0x41, 0xd6, 0xae\ndb 0x6f, 0x41, 0x5f, 0xc2, 0x91, 0xc6, 0xf5, 0x45, 0xd4, 0x9c, 0x7f, 0x52, 0x7a, 0x77, 0x8d, 0x26\ndb 0xa0, 0x06, 0x0b, 0x64, 0xd9, 0x74, 0x1a, 0x52, 0x2a, 0x5b, 0x84, 0x14, 0xc0, 0xbc, 0xe4, 0x6b\ndb 0xbe, 0xc3, 0x01, 0xea, 0x9f, 0x87, 0xaa, 0x07, 0xc0, 0x40, 0x08, 0xf6, 0x00, 0x41, 0x72, 0xb4\ndb 0x20, 0x7f, 0x46, 0x10, 0x59, 0xce, 0xf3, 0x68, 0x8a, 0x80, 0x10, 0x39, 0xb8, 0xeb, 0xfb, 0x6b\ndb 0x85, 0xf7, 0x60, 0x64, 0xc9, 0x28, 0xe2, 0xfd, 0x0c, 0x6d, 0x3f, 0xc3, 0x3e, 0x86, 0xd7, 0x6e\ndb 0xaa, 0x67, 0x35, 0x37, 0x83, 0xc8, 0x1c, 0xf0, 0x05, 0xbb, 0xa6, 0x6c, 0xca, 0x89, 0x08, 0x75\ndb 0x6f, 0x9e, 0xd3, 0xff, 0x5e, 0xb7, 0x0f, 0x99, 0x9b, 0xf5, 0x66, 0xd8, 0xb9, 0x50, 0x5c, 0xb6\ndb 0xaf, 0x07, 0x23, 0xd7, 0x93, 0x7c, 0xf1, 0x01, 0xbb, 0x0c, 0xf2, 0xd4, 0xe9, 0xd0, 0xad, 0xc3\ndb 0x6b, 0x80, 0xf0, 0xf6, 0x84, 0x77, 0x53, 0xa9, 0x61, 0x7c, 0x74, 0x5f, 0xbe, 0x16, 0xd3, 0xa9\ndb 0xf5, 0x5e, 0x3d, 0xa7, 0xcf, 0x21, 0x12, 0x18, 0xd2, 0xc9, 0xe3, 0x37, 0x26, 0x9f, 0x6d, 0x9c\ndb 0x38, 0x6e, 0x4c, 0xfd, 0x65, 0x67, 0xe7, 0x0e, 0x0d, 0xb1, 0x4e, 0x15, 0x03, 0xd8, 0xf6, 0xac\ndb 0x0b, 0xd4, 0x4a, 0x78, 0xa9, 0x22, 0x37, 0xf5, 0x62, 0xf7, 0x41, 0xc7, 0xce, 0xa1, 0xb5, 0xcf\ndb 0x19, 0x1d, 0x93, 0x54, 0x62, 0xeb, 0xb2, 0x4b, 0x2e, 0xa8, 0xd7, 0xd0, 0x01, 0x0c, 0xae, 0x4f\ndb 0x2c, 0x67, 0x94, 0xb2, 0x2d, 0x96, 0x43, 0x03, 0x92, 0xcb, 0x8a, 0x5b, 0xa4, 0x9c, 0xff, 0xcf\ndb 0xc4, 0x4f, 0x69, 0xde, 0x06, 0x7f, 0xf8, 0x26, 0x3c, 0x72, 0x8b, 0xe7, 0x8b, 0xf3, 0x15, 0x38\ndb 0x1b, 0x8a, 0x29, 0x9c, 0x28, 0x2d, 0x98, 0x54, 0x6a, 0x69, 0xf4, 0xe6, 0x51, 0x45, 0x05, 0x85\ndb 0x26, 0x72, 0x0f, 0x82, 0xcb, 0xce, 0x8a, 0xc0, 0xf9, 0x5c, 0x30, 0xcc, 0x15, 0xd0, 0xcd, 0x42\ndb 0x9e, 0x1d, 0x44, 0x69, 0xc8, 0x11, 0x73, 0x09, 0x14, 0xcc, 0xfc, 0x90, 0xd1, 0x21, 0x20, 0xa4\ndb 0xab, 0xd1, 0x2e, 0x71, 0x79, 0x8e, 0x62, 0x7e, 0xd4, 0x7a, 0xb5, 0xe6, 0x59, 0x0b, 0xc7, 0x42\ndb 0xb8, 0xd5, 0x3b, 0x51, 0xb1, 0x2a, 0xe6, 0x75, 0xe6, 0xf8, 0xe4, 0x18, 0xb0, 0x5e, 0x68, 0x3f\ndb 0x9f, 0xb3, 0x33, 0x0a, 0x69, 0xf4, 0x8a, 0x05, 0xcf, 0x87, 0x4f, 0x9c, 0xbb, 0xcd, 0x1a, 0xef\ndb 0x96, 0xd9, 0xce, 0x54, 0xf9, 0x9c, 0x96, 0xfe, 0xc9, 0x6f, 0xb6, 0x0c, 0x0b, 0x47, 0x08, 0xa2\ndb 0x59, 0xf3, 0x07, 0xe9, 0x47, 0x58, 0x1b, 0x42, 0x72, 0x2f, 0x4d, 0xb8, 0xad, 0x98, 0xe1, 0xa4\ndb 0x1d, 0xb6, 0xf9, 0x19, 0x99, 0x23, 0x52, 0xe2, 0x7e, 0x6a, 0x13, 0x3b, 0x2d, 0x29, 0x8f, 0x27\ndb 0xe0, 0xaa, 0x98, 0x16, 0xfe, 0x64, 0xd8, 0x95, 0x94, 0xba, 0xad, 0xe0, 0xf1, 0xfa, 0x0c, 0xcd\ndb 0x5a, 0xd8, 0x0b, 0x08, 0xe3, 0x02, 0xfa, 0x56, 0xb4, 0x59, 0xdb, 0xc6, 0x77, 0x61, 0xdb, 0x11\ndb 0x50, 0xc9, 0x3d, 0x5e, 0x49, 0x62, 0xad, 0xc0, 0xd0, 0xfa, 0x6a, 0x32, 0x49, 0x6e, 0xad, 0x8d\ndb 0xcd, 0xad, 0xa6, 0x70, 0xf8, 0x8b, 0x70, 0x23, 0x3f, 0xfb, 0x85, 0xc4, 0x3d, 0x24, 0x82, 0xbc\ndb 0x52, 0x7a, 0x22, 0xd1, 0xd5, 0xdd, 0x04, 0x5b, 0x44, 0xf5, 0x9c, 0x28, 0x73, 0xea, 0x62, 0x85\ndb 0x1a, 0xed, 0xcf, 0x7d, 0x29, 0x77, 0x19, 0x23, 0x15, 0x29, 0x36, 0xa6, 0x7e, 0x86, 0x49, 0x77\ndb 0x6f, 0xcd, 0x0f, 0xdb, 0xc5, 0x56, 0xdc, 0x00, 0x65, 0x60, 0x18, 0xa1, 0x85, 0x05, 0x13, 0xa1\ndb 0x86, 0xa4, 0x4a, 0xcb, 0x67, 0x95, 0x59, 0x8a, 0x49, 0xf4, 0x51, 0xfc, 0x6f, 0xc8, 0x72, 0x6a\ndb 0x73, 0x4d, 0x2c, 0x79, 0x37, 0x21, 0x2a, 0xd4, 0x35, 0x32, 0xbc, 0x5b, 0x27, 0x62, 0x3b, 0x3c\ndb 0xa9, 0x6d, 0xde, 0x06, 0x87, 0x0f, 0x1a, 0xbd, 0xb7, 0x46, 0x22, 0x0d, 0x1f, 0xdd, 0xc9, 0x33\ndb 0x94, 0xb8, 0xf7, 0xd8, 0xd6, 0xd6, 0x74, 0x9d, 0x64, 0x6d, 0xe9, 0x9d, 0x2f, 0x8c, 0x46, 0xda\ndb 0xc4, 0x97, 0x8f, 0xf2, 0xc4, 0x9b, 0xf0, 0x94, 0x95, 0x4e, 0x5e, 0xfb, 0xe7, 0x8e, 0x70, 0x18\ndb 0x1c, 0x53, 0x5a, 0x55, 0x06, 0x23, 0x67, 0x78, 0x4d, 0x06, 0x93, 0xe8, 0x08, 0x2d, 0x13, 0x28\ndb 0xa1, 0x4c, 0x4c, 0x8c, 0xed, 0x91, 0x05, 0xba, 0x46, 0xb0, 0xa4, 0x3c, 0xc3, 0xae, 0x78, 0xa0\ndb 0x2a, 0x0c, 0x8f, 0x39, 0xdf, 0x61, 0x00, 0x6a, 0x81, 0xd9, 0x78, 0xcc, 0xcf, 0x16, 0xa9, 0x46\ndb 0xc4, 0x0c, 0x04, 0x00, 0x2f, 0x56, 0x27, 0xb9, 0x4f, 0x1a, 0x2b, 0x9c, 0x0f, 0x35, 0x84, 0xb1\ndb 0x5c, 0x8d, 0xbf, 0x68, 0x43, 0x09, 0xf2, 0xca, 0xb8, 0x2e, 0xa3, 0xe8, 0xf4, 0x8b, 0x69, 0x2f\ndb 0xd2, 0x4b, 0x9e, 0xbd, 0x6d, 0xc7, 0x33, 0x47, 0x4f, 0x62, 0x6b, 0xac, 0xbd, 0x69, 0x9d, 0x35\ndb 0x20, 0x4f, 0x3e, 0xef, 0x7b, 0x81, 0xae, 0x91, 0xa8, 0xbb, 0x86, 0xf9, 0x02, 0xf9, 0x16, 0x7d\ndb 0x21, 0x37, 0x11, 0xb5, 0x18, 0x59, 0x60, 0x0f, 0xd6, 0x69, 0xcc, 0xd1, 0xb2, 0xca, 0xc0, 0xdf\ndb 0x2f, 0x94, 0xce, 0xd6, 0x9c, 0xf5, 0xc1, 0x9e, 0x88, 0x01, 0x35, 0xb7, 0xda, 0xf9, 0x79, 0x27\ndb 0xe5, 0xa9, 0xca, 0x5b, 0xdf, 0x5d, 0xaf, 0x52, 0x66, 0xb7, 0x79, 0x1e, 0x3b, 0xf7, 0xf2, 0x11\ndb 0x4d, 0xde, 0x5f, 0x5b, 0x63, 0x76, 0x83, 0xdb, 0x54, 0x9d, 0xec, 0x9d, 0xb2, 0x37, 0x03, 0xf1\ndb 0xeb, 0x01, 0xb1, 0x0b, 0x6a, 0xe0, 0xce, 0x4b, 0xfe, 0x4f, 0x90, 0xe9, 0x5f, 0xd0, 0x15, 0x91\ndb 0x19, 0xb6, 0x24, 0x8c, 0x3b, 0xd9, 0x26, 0x13, 0x8e, 0x60, 0xcf, 0xf9, 0x2f, 0x56, 0x36, 0xb2\ndb 0xa1, 0xeb, 0xa3, 0xbd, 0x6c, 0x55, 0x4e, 0x31, 0xb9, 0x3b, 0xfb, 0xed, 0x28, 0xbe, 0xe7, 0x67\ndb 0x15, 0x2c, 0xf5, 0x40, 0x57, 0xd7, 0xc0, 0x30, 0xe9, 0x11, 0x06, 0x93, 0x87, 0x13, 0x72, 0x44\ndb 0x58, 0x18, 0x08, 0x70, 0xb0, 0xae, 0x15, 0x5e, 0x6a, 0xce, 0x68, 0x6b, 0x53, 0x4f, 0xd5, 0x5c\ndb 0x97, 0xeb, 0xd8, 0xe0, 0xd2, 0xb5, 0x85, 0x90, 0x12, 0x4e, 0x99, 0x0f, 0x13, 0x47, 0x25, 0xcb\ndb 0x1b, 0xf2, 0xad, 0x33, 0xf9, 0x53, 0x23, 0x8d, 0xd6, 0x57, 0xa3, 0xdf, 0xfe, 0xce, 0xd0, 0xb1\ndb 0x87, 0xd2, 0x99, 0x7e, 0x58, 0xbc, 0x25, 0xe9, 0x08, 0xb5, 0x3c, 0x58, 0xad, 0xb1, 0xa0, 0x8b\ndb 0xdc, 0xdf, 0xe7, 0x66, 0x1c, 0x34, 0x20, 0x77, 0xf2, 0xf7, 0x78, 0x1e, 0xe0, 0xc3, 0x17, 0xdd\ndb 0x28, 0x52, 0x13, 0x0b, 0x8b, 0xe1, 0xbe, 0x98, 0x41, 0xe9, 0xda, 0x2d, 0xc3, 0xaf, 0x2f, 0xd7\ndb 0x7f, 0x01, 0x3d, 0xd9, 0x51, 0x01, 0x76, 0xe6, 0xff, 0x5f, 0x28, 0x4c, 0x8f, 0xd3, 0x1d, 0x47\ndb 0x02, 0x59, 0x94, 0x0a, 0x6d, 0x5b, 0xe1, 0xd9, 0x46, 0xe9, 0xbd, 0x9c, 0x50, 0xdb, 0x67, 0x86\ndb 0x5f, 0xb6, 0x9b, 0xa1, 0x04, 0x53, 0xb4, 0xda, 0xc9, 0xc6, 0x72, 0xe2, 0x8b, 0x4a, 0x5c, 0x1b\ndb 0x30, 0xe4, 0xa2, 0x02, 0x83, 0x19, 0xd4, 0x89, 0x7a, 0x82, 0x3a, 0x4c, 0xa1, 0xde, 0x62, 0xfc\ndb 0x26, 0xb4, 0xc0, 0x04, 0x25, 0x1d, 0x54, 0xed, 0x1c, 0xa6, 0x13, 0x05, 0x01, 0xc3, 0x0b, 0x77\ndb 0x64, 0x83, 0x1d, 0xe7, 0xa9, 0xb5, 0x10, 0x67, 0x4e, 0x17, 0x08, 0xf3, 0x09, 0x1c, 0xd0, 0x7c\ndb 0xb4, 0x6d, 0x2a, 0x3b, 0xc6, 0x80, 0xd3, 0xf2, 0xe9, 0x1a, 0xc3, 0xed, 0xd6, 0x7f, 0xab, 0xea\ndb 0x9b, 0xec, 0xe2, 0xe8, 0xfe, 0x67, 0x6b, 0x5d, 0x4c, 0x09, 0xc6, 0x8f, 0xfa, 0xa0, 0xa7, 0x85\ndb 0x3d, 0xa5, 0x19, 0x74, 0x2c, 0xb2, 0xfe, 0x15, 0x46, 0xf9, 0x50, 0x37, 0xe5, 0xe6, 0x21, 0x56\ndb 0x45, 0x12, 0x13, 0x2b, 0x08, 0x93, 0xd1, 0x82, 0x74, 0x89, 0x82, 0x14, 0xe1, 0xb3, 0x91, 0x84\ndb 0xb6, 0x2d, 0xcc, 0xd7, 0x75, 0x3c, 0x0c, 0xc4, 0x97, 0x94, 0x4c, 0x5d, 0x28, 0x25, 0xea, 0x0f\ndb 0xeb, 0x98, 0x5d, 0xff, 0xde, 0x6e, 0x68, 0x32, 0xdf, 0xc7, 0x5b, 0xdc, 0x87, 0x96, 0x38, 0x53\ndb 0xdb, 0x9b, 0xa9, 0xb7, 0x67, 0x8f, 0xd1, 0x2a, 0xb4, 0x61, 0x28, 0x7a, 0xcf, 0xea, 0x45, 0x4a\ndb 0x63, 0xaa, 0x49, 0x23, 0xd4, 0x63, 0x30, 0x46, 0x4e, 0xbf, 0xef, 0x2e, 0x19, 0xd1, 0xb8, 0x38\ndb 0x7b, 0x58, 0x39, 0xbc, 0x3f, 0x2e, 0x31, 0xdf, 0x7c, 0xd5, 0xca, 0xda, 0xd9, 0x78, 0xb4, 0xcb\ndb 0x3b, 0xcd, 0xd1, 0xe6, 0xa4, 0x27, 0xab, 0x5d, 0x2a, 0xa8, 0x62, 0xb3, 0x6d, 0x19, 0x6d, 0xa1\ndb 0xde, 0x94, 0x32, 0x0e, 0x70, 0x7f, 0x16, 0x0c, 0xa4, 0x20, 0x30, 0xd1, 0x1c, 0xbd, 0xa0, 0x4a\ndb 0x9e, 0x3b, 0xec, 0xd1, 0x53, 0x2b, 0xfe, 0x2a, 0x5c, 0x35, 0xaa, 0x65, 0xe3, 0x4b, 0x75, 0x8f\ndb 0xc6, 0xd8, 0x1e, 0xa9, 0x04, 0x8a, 0xb2, 0xcc, 0xab, 0xec, 0xbe, 0x4d, 0x69, 0xf1, 0x15, 0x9c\ndb 0x5e, 0xdc, 0x57, 0xb6, 0x73, 0x3b, 0x4b, 0x73, 0xd8, 0x1e, 0xb1, 0x48, 0x2c, 0xa2, 0x85, 0xea\ndb 0x26, 0x97, 0x62, 0x62, 0x74, 0xb9, 0xb3, 0x34, 0x39, 0x22, 0xf3, 0x40, 0xfe, 0xcc, 0x02, 0x9f\ndb 0xc6, 0x27, 0x99, 0x3c, 0xea, 0x99, 0x6b, 0xf8, 0x6e, 0x72, 0xbd, 0x2b, 0x42, 0x98, 0xc6, 0x8d\ndb 0xac, 0xfd, 0x9b, 0x43, 0xf5, 0x8e, 0xa4, 0x79, 0xe4, 0x7e, 0x3e, 0xf9, 0x02, 0x99, 0x63, 0x8f\ndb 0x1e, 0x77, 0x2a, 0xcd, 0x85, 0xc5, 0x64, 0x5e, 0xdb, 0xcc, 0x5f, 0x0d, 0x5f, 0xde, 0xe6, 0x80\ndb 0xe6, 0x4e, 0xfd, 0x9e, 0x2b, 0x07, 0x8b, 0x34, 0x97, 0x55, 0xf0, 0x34, 0x22, 0xe1, 0x11, 0x49\ndb 0x3a, 0x95, 0xfa, 0x80, 0x39, 0xfc, 0xfe, 0x84, 0x27, 0x90, 0x46, 0x54, 0x21, 0xab, 0x3f, 0x30\ndb 0x18, 0xdb, 0xda, 0x25, 0x0e, 0x4b, 0x1c, 0xd8, 0x09, 0xdc, 0x3d, 0x48, 0x32, 0x91, 0xa5, 0x2c\ndb 0x7c, 0x4d, 0xf7, 0x6f, 0x50, 0xf7, 0x77, 0x4f, 0x1a, 0xf2, 0xe7, 0xa8, 0x1d, 0x40, 0x3c, 0x6c\ndb 0x5c, 0xbb, 0xcf, 0x48, 0x89, 0x59, 0xff, 0x79, 0x1a, 0xd7, 0x95, 0xbd, 0x7b, 0xd1, 0x9e, 0x06\ndb 0xc9, 0x47, 0x8e, 0xf4, 0x55, 0xe6, 0xe3, 0xf9, 0x23, 0xdf, 0x05, 0x5e, 0x48, 0x16, 0xbf, 0x93\ndb 0x47, 0x79, 0x0f, 0x3c, 0xec, 0xa5, 0x18, 0x0e, 0x61, 0x0d, 0xc4, 0x79, 0x59, 0xa6, 0xe7, 0xf8\ndb 0xc1, 0x97, 0x1d, 0x40, 0xe9, 0x20, 0xb5, 0xea, 0x27, 0x11, 0xa6, 0x6b, 0x2e, 0xe6, 0x96, 0xec\ndb 0xa7, 0x41, 0x90, 0x15, 0x44, 0x00, 0xde, 0x37, 0xca, 0x9d, 0x14, 0x33, 0x84, 0x0c, 0x1e, 0x59\ndb 0x02, 0x02, 0x5f, 0x4a, 0xa9, 0x99, 0xd8, 0x40, 0x1b, 0x66, 0x1b, 0x2d, 0x32, 0x05, 0xe7, 0xcf\ndb 0xec, 0x15, 0xb6, 0x22, 0x0b, 0x99, 0x38, 0xdd, 0x70, 0xdf, 0x08, 0x0e, 0xb2, 0xaf, 0x76, 0xd3\ndb 0xa6, 0xd3, 0xd5, 0xbf, 0x0a, 0x95, 0x1b, 0xdc, 0x53, 0x26, 0xd0, 0xb7, 0x76, 0x53, 0x5f, 0x69\ndb 0xaf, 0xce, 0x4d, 0xe1, 0x6e, 0x2b, 0xdb, 0x13, 0x6e, 0xb4, 0xed, 0x26, 0x38, 0x1b, 0xa5, 0xf1\ndb 0xee, 0x10, 0x60, 0x4b, 0x90, 0x90, 0x42, 0x59, 0xdb, 0x76, 0x44, 0x5b, 0x0f, 0xa3, 0x9c, 0xa9\ndb 0x56, 0x3a, 0x5f, 0x05, 0x55, 0xf4, 0xe7, 0x2c, 0x2f, 0xcb, 0xdd, 0xd5, 0x0f, 0x1e, 0x8b, 0x3b\ndb 0xd5, 0x2a, 0x1a, 0x5e, 0x2a, 0x62, 0xa6, 0x26, 0x40, 0xe1, 0x50, 0xc3, 0xbc, 0x3b, 0xfd, 0x85\ndb 0x7a, 0xb4, 0xdc, 0xa7, 0xd7, 0x3b, 0x53, 0x5e, 0xf2, 0x6b, 0xc3, 0x85, 0x70, 0x3d, 0x1d, 0xcd\ndb 0x57, 0x3d, 0x25, 0xb6, 0x2d, 0x83, 0x61, 0x12, 0x90, 0x54, 0x16, 0xb8, 0x62, 0x85, 0x2a, 0x79\ndb 0x75, 0x0b, 0xb1, 0xf1, 0x04, 0xc7, 0x73, 0x1b, 0x6d, 0x15, 0xe8, 0x1f, 0xa5, 0xf2, 0x6e, 0x18\ndb 0x70, 0x58, 0x4f, 0xe4, 0x6e, 0x53, 0xdd, 0xf2, 0x96, 0x77, 0xa1, 0xb1, 0xb1, 0x44, 0xff, 0x61\ndb 0x6e, 0x6b, 0x54, 0x33, 0xcc, 0x88, 0x66, 0x8b, 0x33, 0x23, 0x1c, 0xa1, 0x87, 0xe7, 0x3d, 0x9c\ndb 0x12, 0xb1, 0xcd, 0x10, 0xf5, 0xa4, 0xf7, 0xff, 0xf5, 0x1b, 0xab, 0x91, 0xfc, 0x16, 0x90, 0x9c\ndb 0x7f, 0x3b, 0x70, 0x40, 0x26, 0x0e, 0xa0, 0xc4, 0xf0, 0x78, 0xaf, 0xcc, 0xef, 0x52, 0x6c, 0x4e\ndb 0x3b, 0xa1, 0xbf, 0xbf, 0x65, 0x97, 0xbf, 0xa6, 0x28, 0x6c, 0x76, 0xdb, 0x28, 0x5c, 0x22, 0x1b\ndb 0xd4, 0x0c, 0xa0, 0x15, 0x76, 0xfd, 0x4a, 0x6c, 0x2d, 0xf8, 0xc2, 0x9f, 0x97, 0x14, 0xe3, 0xac\ndb 0xf1, 0x19, 0x43, 0x35, 0x7a, 0xdd, 0x62, 0x24, 0x4c, 0xae, 0x0f, 0x2c, 0x11, 0x59, 0x29, 0xeb\ndb 0x1c, 0x48, 0x44, 0x8f, 0x62, 0xef, 0xd7, 0x8c, 0x33, 0x92, 0x4b, 0x5a, 0x8d, 0xfb, 0xe2, 0xba\ndb 0x5e, 0xe0, 0xf2, 0x10, 0x96, 0x1f, 0x69, 0x48, 0x23, 0x04, 0x3d, 0x28, 0x37, 0x30, 0x77, 0x7b\ndb 0x71, 0x2b, 0x19, 0x69, 0x81, 0x3b, 0x9a, 0x7b, 0xc7, 0x59, 0x25, 0x5b, 0xb9, 0xc0, 0xf7, 0x60\ndb 0xe6, 0x04, 0x61, 0x76, 0x20, 0xd1, 0x80, 0x85, 0x6e, 0x10, 0x49, 0x44, 0xd7, 0x83, 0xc7, 0x4c\ndb 0x4b, 0xb4, 0xb4, 0x5e, 0xc7, 0x02, 0xab, 0x0b, 0x1b, 0xb5, 0x8a, 0x1a, 0xf5, 0xc3, 0x87, 0x68\ndb 0xad, 0x8f, 0xa3, 0x58, 0x06, 0xf0, 0x65, 0x09, 0x27, 0x17, 0x7d, 0xc2, 0xb8, 0xfd, 0x4a, 0xab\ndb 0x81, 0x98, 0x09, 0x36, 0xa1, 0xa9, 0x25, 0x8f, 0xbc, 0x13, 0x67, 0xc7, 0x90, 0xbb, 0xbe, 0xe6\ndb 0x8b, 0x1b, 0x49, 0x18, 0xe1, 0x27, 0xdc, 0x6b, 0x2b, 0x41, 0xc1, 0x5a, 0x8d, 0xde, 0xbc, 0x8a\ndb 0x0b, 0xc4, 0xb5, 0x2d, 0x1f, 0x02, 0xc6, 0xbe, 0x67, 0x6b, 0x70, 0x3c, 0x40, 0xde, 0x75, 0xb2\ndb 0x0f, 0xcb, 0x40, 0x3d, 0x9a, 0x58, 0x1a, 0x77, 0x15, 0xc0, 0xa2, 0xfa, 0xa7, 0xbb, 0x58, 0x6b\ndb 0x6c, 0xd5, 0x02, 0xad, 0x36, 0x7d, 0xb6, 0x2a, 0x7c, 0x5e, 0x99, 0x63, 0xd8, 0x29, 0x8b, 0xfd\ndb 0x1b, 0x6a, 0x99, 0x9a, 0x51, 0x7a, 0x28, 0xce, 0xb8, 0x75, 0x71, 0x21, 0xab, 0x44, 0x15, 0x39\ndb 0x4a, 0xab, 0x79, 0xb7, 0x60, 0xf4, 0xeb, 0x7c, 0xb7, 0x95, 0x56, 0x5f, 0xdf, 0x92, 0x23, 0xb8\ndb 0x03, 0xe6, 0x44, 0xde, 0x2f, 0x97, 0xfa, 0x06, 0x31, 0xc1, 0xf7, 0x9c, 0xed, 0xcf, 0x04, 0x52\ndb 0x9a, 0xff, 0xeb, 0xee, 0x73, 0x81, 0x05, 0xca, 0x9a, 0x86, 0x53, 0x18, 0x20, 0xee, 0x1c, 0x9c\ndb 0x27, 0xda, 0xef, 0x99, 0x3e, 0x11, 0xe0, 0x1b, 0x51, 0xd3, 0xcf, 0xa4, 0x96, 0xdb, 0x14, 0x2e\ndb 0xc4, 0xe6, 0x3c, 0x47, 0x66, 0x3e, 0x7e, 0xd2, 0x5d, 0x70, 0xfb, 0x35, 0xd5, 0x56, 0x32, 0x3f\ndb 0x21, 0xdf, 0xd2, 0xac, 0x75, 0xb3, 0xac, 0x66, 0x23, 0x6a, 0x41, 0x03, 0x73, 0xef, 0x5a, 0x5c\ndb 0x03, 0x4d, 0x13, 0x2b, 0x84, 0x7a, 0x5a, 0x84, 0xce, 0xa5, 0x0f, 0x68, 0xe0, 0x60, 0xa9, 0xdc\ndb 0xd9, 0x8d, 0x52, 0xf9, 0x7b, 0x9b, 0x64, 0x87, 0x8a, 0x9f, 0xfb, 0x5e, 0x73, 0x62, 0xc4, 0xf2\ndb 0x8c, 0x5e, 0x1e, 0x00, 0x17, 0x93, 0x16, 0x54, 0x82, 0x0e, 0x6a, 0x30, 0xff, 0x43, 0xd5, 0x79\ndb 0x1d, 0x17, 0x38, 0x11, 0x45, 0xcd, 0x3d, 0x25, 0x92, 0xb6, 0x86, 0x55, 0x6e, 0x94, 0xe9, 0x18\ndb 0x2b, 0x88, 0x27, 0xc3, 0xa6, 0xa9, 0x94, 0x92, 0xd1, 0x15, 0x1e, 0xe9, 0xd5, 0x06, 0x29, 0x1c\ndb 0xdd, 0x5f, 0xed, 0xf4, 0x68, 0xf3, 0x9c, 0x61, 0xcd, 0xfc, 0xc0, 0x5c, 0x36, 0xcd, 0x25, 0xa7\ndb 0xc6, 0x2e, 0xd9, 0xdf, 0xdd, 0x17, 0x8a, 0x05, 0x42, 0x37, 0x1b, 0x8e, 0x9b, 0x31, 0xff, 0xb3\ndb 0xcb, 0x19, 0xcb, 0x68, 0x6d, 0x79, 0x43, 0xa5, 0x9c, 0x2b, 0x67, 0x21, 0xee, 0xbf, 0xc9, 0x3c\ndb 0xb1, 0xb5, 0x72, 0x51, 0xf9, 0x24, 0x06, 0xb7, 0x65, 0x2c, 0x4c, 0x45, 0x4a, 0xf7, 0xd3, 0x2a\ndb 0x1e, 0x09, 0x50, 0xda, 0x4b, 0x91, 0x54, 0x6e, 0x88, 0x3b, 0xf8, 0xcf, 0x2f, 0xfe, 0x62, 0x90\ndb 0xc6, 0xbc, 0xbc, 0xa0, 0x73, 0x97, 0x62, 0x10, 0xe3, 0x4f, 0x4d, 0x8b, 0x42, 0x6b, 0xb0, 0x7b\ndb 0xb9, 0x81, 0x62, 0x54, 0x22, 0x62, 0xc4, 0xcf, 0xa4, 0x02, 0x0e, 0x24, 0x65, 0x9d, 0x26, 0x34\n\ndb 0x23, 0x42, 0x0a, 0x4b, 0xfc, 0x7c, 0xf9, 0x30, 0x7a, 0xf1, 0x99, 0x75, 0x2c, 0xbe, 0xdf, 0xdb\ndb 0x41, 0x1e, 0xa5, 0x94, 0x4c, 0x60, 0xfb, 0x12, 0x29, 0x9d, 0x82, 0x93, 0xd8, 0xe6, 0xd0, 0xf2\ndb 0xd5, 0xdd, 0x74, 0xd2, 0x0c, 0x13, 0x56, 0xa2, 0xe7, 0x8a, 0x49, 0x8c, 0x25, 0xc4, 0x77, 0x3a\ndb 0xce, 0x04, 0xe2, 0x01, 0xa0, 0x84, 0x87, 0xc4, 0x83, 0xf7, 0xfd, 0xc1, 0x4b, 0xfa, 0x2c, 0xdb\ndb 0x15, 0x75, 0x68, 0x69, 0xb2, 0x59, 0x9a, 0x1d, 0x40, 0x46, 0x5c, 0x59, 0x91, 0x8b, 0xa2, 0x40\ndb 0xe5, 0x7d, 0x09, 0x02, 0x12, 0xe2, 0x8e, 0xc7, 0x84, 0xf3, 0xac, 0xa3, 0x4f, 0x65, 0x1f, 0x80\ndb 0xd6, 0xa4, 0x97, 0xc5, 0xdf, 0x9d, 0x88, 0x8d, 0xef, 0x27, 0xe7, 0xfe, 0x79, 0x9c, 0x1f, 0xde\ndb 0x7f, 0x6c, 0xb5, 0x57, 0x76, 0x16, 0x89, 0xa3, 0x5e, 0xaf, 0x5d, 0x75, 0xb0, 0x5e, 0x04, 0xff\ndb 0x20, 0xc1, 0x34, 0x0d, 0x6e, 0xb6, 0x90, 0x3b, 0x29, 0x32, 0x80, 0x9e, 0xdb, 0x68, 0xea, 0x7d\ndb 0xb8, 0x7f, 0x14, 0xd2, 0x9f, 0x2a, 0xc6, 0xe0, 0xbc, 0xee, 0x85, 0x38, 0x01, 0x2d, 0x70, 0x49\ndb 0x10, 0x73, 0x06, 0x6e, 0xa2, 0xb6, 0xda, 0x0c, 0xc7, 0x71, 0x3d, 0xae, 0x48, 0x95, 0xe0, 0xe0\ndb 0xa8, 0x02, 0x0e, 0xd8, 0xa1, 0x5d, 0x7a, 0x95, 0x0f, 0xeb, 0x72, 0x8b, 0x92, 0x4e, 0xad, 0x0e\ndb 0x6a, 0x9a, 0x5c, 0x60, 0x74, 0x8b, 0x87, 0xc7, 0xe2, 0x51, 0xb5, 0xe0, 0x04, 0xc1, 0x20, 0x04\ndb 0x09, 0x3c, 0xb4, 0x08, 0x30, 0x4d, 0x37, 0x12, 0x55, 0x95, 0x9a, 0x74, 0xa1, 0x9d, 0x34, 0x6e\ndb 0x3d, 0x14, 0x3e, 0x65, 0x5a, 0x1b, 0x77, 0xf5, 0x64, 0xc1, 0x22, 0x36, 0x86, 0x70, 0x0e, 0x29\ndb 0x03, 0x7e, 0xac, 0x5f, 0x89, 0x26, 0x5e, 0xa3, 0x0e, 0xaa, 0x4b, 0xd9, 0x51, 0x89, 0x10, 0x5d\ndb 0xdd, 0x2b, 0x10, 0xeb, 0xc0, 0x23, 0x84, 0x35, 0x76, 0x5f, 0xa1, 0x17, 0x69, 0x8e, 0xd2, 0xe6\ndb 0x36, 0x87, 0xd0, 0xf4, 0x5f, 0x69, 0x5e, 0xcc, 0xed, 0x22, 0x8f, 0x6e, 0xac, 0xfa, 0x10, 0x50\ndb 0x00, 0xd9, 0x54, 0x5d, 0x57, 0x8e, 0xe0, 0xdc, 0x7f, 0x77, 0x45, 0x60, 0x19, 0xc6, 0xae, 0x86\ndb 0x59, 0x8e, 0xc5, 0xfd, 0x57, 0x8f, 0x3c, 0x01, 0x74, 0xf1, 0x1f, 0xff, 0xc9, 0x72, 0x4b, 0xe9\ndb 0x9f, 0xa3, 0xcb, 0xcf, 0x33, 0x58, 0x14, 0x10, 0x30, 0xfe, 0xfd, 0x52, 0x3d, 0x2f, 0xd6, 0xc3\ndb 0xa7, 0xc5, 0x11, 0x38, 0xf0, 0x2a, 0xc9, 0x6c, 0xb8, 0xaf, 0xeb, 0x80, 0xdf, 0x46, 0x16, 0xe9\ndb 0x8c, 0xf8, 0xaf, 0xf8, 0x49, 0x5f, 0x9b, 0x63, 0x11, 0x71, 0x16, 0xb2, 0x9b, 0xa5, 0x7b, 0x4d\ndb 0xab, 0x99, 0xd5, 0xc7, 0xe6, 0xc8, 0x1a, 0x95, 0x27, 0x38, 0x02, 0xd3, 0x85, 0x3d, 0x7b, 0x15\ndb 0x5c, 0xd3, 0x99, 0xfc, 0x5b, 0x5e, 0x72, 0xdf, 0xd8, 0x42, 0x91, 0xf1, 0x8f, 0x05, 0x01, 0x0b\ndb 0xe0, 0x80, 0x90, 0x49, 0x32, 0x8b, 0x7c, 0x74, 0x4e, 0x76, 0x1a, 0x91, 0xc2, 0x01, 0x22, 0xf4\ndb 0xbb, 0x68, 0xcf, 0xd7, 0xe8, 0x44, 0x53, 0x65, 0x17, 0xdd, 0x22, 0x52, 0xc6, 0xcf, 0xec, 0xce\ndb 0x1d, 0xb1, 0x00, 0xb4, 0xfb, 0x1a, 0xc2, 0x28, 0xd7, 0x6a, 0x14, 0x66, 0xd9, 0xaa, 0xd6, 0x61\ndb 0x2b, 0xe4, 0x78, 0x5b, 0x77, 0xf9, 0x53, 0xc3, 0x8d, 0x86, 0x37, 0x71, 0xc2, 0x0b, 0xef, 0x20\ndb 0xa3, 0xb7, 0x06, 0x74, 0xf3, 0xa5, 0x56, 0x17, 0xac, 0x50, 0x19, 0x15, 0x07, 0xda, 0x12, 0x72\ndb 0x21, 0x6e, 0x52, 0xcf, 0x71, 0x55, 0x36, 0x29, 0x85, 0xff, 0xc5, 0x22, 0xeb, 0x17, 0x2d, 0x2a\ndb 0xab, 0x0b, 0x73, 0x50, 0x98, 0x06, 0x45, 0x51, 0x6f, 0xbd, 0x66, 0x4d, 0x7e, 0xa1, 0xf8, 0xc1\ndb 0xd2, 0x1d, 0x33, 0x68, 0xd7, 0x24, 0x38, 0x03, 0xab, 0xd9, 0xe2, 0xb6, 0xd1, 0x05, 0x0d, 0x71\ndb 0x43, 0x01, 0xf3, 0x9d, 0xc5, 0xd4, 0x76, 0xeb, 0x1b, 0x42, 0x38, 0x50, 0x0b, 0xde, 0x1a, 0xa9\ndb 0x26, 0x19, 0x86, 0xf7, 0xa5, 0xab, 0x1d, 0xd1, 0xf5, 0xbd, 0xaa, 0x45, 0x1c, 0x1a, 0x84, 0xeb\ndb 0x20, 0x63, 0xe2, 0x73, 0x92, 0xfc, 0xc3, 0xfd, 0x7d, 0x93, 0x90, 0x28, 0xee, 0xe1, 0x07, 0x9d\ndb 0x11, 0x36, 0x51, 0xeb, 0x52, 0x07, 0xcc, 0x7a, 0x08, 0x2b, 0x07, 0x6a, 0xef, 0x9c, 0x0e, 0xb7\ndb 0xff, 0xa8, 0xcb, 0x9b, 0x67, 0x62, 0x41, 0x5a, 0x66, 0x3e, 0xbc, 0xc5, 0xef, 0x21, 0xf0, 0xee\ndb 0x96, 0x1d, 0xc8, 0x35, 0x87, 0x1e, 0x10, 0x70, 0xa6, 0xb0, 0x8b, 0x2a, 0x5f, 0xf2, 0x93, 0xf5\ndb 0xb3, 0x08, 0xa0, 0x54, 0xee, 0x2e, 0xfc, 0xdc, 0xca, 0x95, 0x42, 0x80, 0xab, 0xdf, 0x53, 0xd7\ndb 0xfd, 0x9d, 0xb7, 0x6d, 0x80, 0xe2, 0x81, 0xac, 0x39, 0xf3, 0x68, 0x1b, 0x96, 0xe5, 0xa4, 0x8b\ndb 0xc6, 0xca, 0x33, 0xd1, 0x93, 0xee, 0x3a, 0x69, 0x62, 0xd7, 0x6e, 0x24, 0x9a, 0xca, 0x0f, 0x38\ndb 0xa6, 0x21, 0x21, 0x82, 0x0d, 0x37, 0xe9, 0x54, 0x08, 0x31, 0xf9, 0x92, 0x84, 0x09, 0x2f, 0x0c\ndb 0xc1, 0xdb, 0x28, 0xd0, 0xa4, 0xb1, 0xee, 0x70, 0x62, 0xc0, 0x93, 0xc4, 0x7e, 0x2b, 0x63, 0x4e\ndb 0x4a, 0x4a, 0x95, 0x88, 0xf0, 0xa9, 0xe5, 0x6f, 0x65, 0xec, 0xf7, 0x21, 0xdd, 0x49, 0x3d, 0x15\ndb 0xeb, 0x67, 0x0a, 0x98, 0x02, 0xa8, 0xc8, 0xd4, 0x2e, 0x1e, 0xd3, 0x51, 0xc8, 0x66, 0xd3, 0x3d\ndb 0xcc, 0xda, 0x6c, 0x15, 0x64, 0xa2, 0xb5, 0xcf, 0xd6, 0x68, 0x73, 0xfd, 0xae, 0x08, 0xbb, 0xdb\ndb 0x69, 0x5a, 0x8a, 0x7a, 0x14, 0x54, 0x59, 0xca, 0x0c, 0x89, 0x6f, 0x85, 0x77, 0x9e, 0xab, 0xc1\ndb 0x2d, 0x00, 0x51, 0xf2, 0xad, 0x61, 0x15, 0xe7, 0x1e, 0x53, 0x27, 0x97, 0xec, 0xc7, 0x48, 0x4b\ndb 0x4c, 0x9a, 0x77, 0x59, 0x53, 0x4a, 0x26, 0x59, 0xcd, 0x9e, 0x6c, 0x8a, 0x42, 0xdf, 0xfe, 0xef\ndb 0x8f, 0xa1, 0x3d, 0x25, 0x32, 0x4d, 0xd1, 0xbe, 0x62, 0x0d, 0x01, 0x08, 0x97, 0x09, 0xaf, 0x9e\ndb 0x9c, 0x7f, 0xe9, 0xb3, 0xec, 0xc2, 0xc5, 0xc0, 0x97, 0xd3, 0x8d, 0xad, 0xd5, 0x49, 0x6a, 0x3d\ndb 0x84, 0x92, 0x95, 0xf8, 0x00, 0xf3, 0x2a, 0xba, 0x56, 0xb7, 0x95, 0xf5, 0x1a, 0x28, 0x79, 0x8e\ndb 0x1e, 0x40, 0xee, 0xfc, 0x4d, 0xe2, 0x8d, 0x47, 0x7f, 0x13, 0x0c, 0x85, 0x54, 0xbb, 0x06, 0xfa\ndb 0x53, 0x95, 0x2d, 0x63, 0x23, 0xa8, 0xe9, 0x62, 0x3a, 0x0a, 0x81, 0x1f, 0x39, 0x79, 0x3d, 0xea\ndb 0x70, 0xb7, 0x29, 0x80, 0xc2, 0x25, 0x39, 0x5d, 0x98, 0x80, 0x7e, 0x09, 0x82, 0xd1, 0xc1, 0x12\ndb 0x3e, 0x98, 0x54, 0x05, 0x63, 0xff, 0x2f, 0x10, 0x60, 0x13, 0xf5, 0x27, 0xe8, 0xda, 0x8d, 0xeb\ndb 0x2a, 0xba, 0x01, 0xee, 0xb0, 0xbc, 0xef, 0x5f, 0x6d, 0x03, 0x48, 0x8f, 0x79, 0x21, 0xa4, 0x40\ndb 0x66, 0x85, 0x9c, 0x8b, 0x01, 0xa5, 0xbb, 0x9e, 0x79, 0xb8, 0xad, 0x59, 0xff, 0x11, 0xe6, 0x10\ndb 0xdb, 0xf0, 0x66, 0x87, 0xbc, 0x7b, 0x9b, 0x75, 0xef, 0x90, 0xbf, 0x22, 0x35, 0x79, 0xd1, 0x9d\ndb 0x2c, 0x4f, 0x22, 0x50, 0x8b, 0x23, 0x15, 0x4c, 0xb4, 0xb4, 0x64, 0xab, 0x4b, 0x7a, 0xa3, 0x19\ndb 0x95, 0xd6, 0xd8, 0x33, 0x57, 0xb9, 0xfc, 0x53, 0x66, 0x84, 0x61, 0x0a, 0xc7, 0x76, 0x84, 0xd8\ndb 0xa6, 0xf4, 0xbd, 0x46, 0xf7, 0x0e, 0xf9, 0x42, 0x08, 0xb6, 0x82, 0x94, 0x2e, 0x04, 0x9e, 0x0d\ndb 0x55, 0x18, 0xb2, 0xb8, 0xbf, 0xe0, 0xe1, 0xac, 0x15, 0xae, 0x60, 0x4c, 0x1d, 0xf1, 0x71, 0x7a\ndb 0xda, 0xed, 0xeb, 0x79, 0x33, 0x52, 0x5b, 0x38, 0x2d, 0x94, 0x38, 0x11, 0x8f, 0xf9, 0x37, 0x2c\ndb 0x39, 0x9c, 0x90, 0x8b, 0x45, 0x32, 0x79, 0x59, 0x3f, 0x4d, 0x43, 0x07, 0x88, 0xb5, 0xf6, 0x48\ndb 0x5c, 0xcd, 0x57, 0x85, 0x81, 0xb3, 0x09, 0x2c, 0xab, 0xb2, 0x16, 0xd9, 0x28, 0x32, 0x6c, 0xf3\ndb 0x75, 0xf3, 0xa4, 0xed, 0x19, 0xa0, 0xd5, 0x79, 0x62, 0xd6, 0xe1, 0xa0, 0x26, 0x54, 0x43, 0x76\ndb 0x59, 0xd7, 0x39, 0x01, 0x4d, 0x87, 0x52, 0x1a, 0xac, 0x9c, 0x53, 0x15, 0x2c, 0xff, 0x42, 0x90\ndb 0x62, 0xf9, 0x7a, 0xcb, 0x63, 0xce, 0x2e, 0x22, 0x72, 0x90, 0x7c, 0x13, 0x98, 0x87, 0x5b, 0x3c\ndb 0x09, 0x24, 0xc3, 0xaa, 0xad, 0x68, 0x93, 0xca, 0x80, 0xd4, 0xee, 0x2e, 0x6f, 0xd2, 0xad, 0x43\ndb 0xfa, 0x4a, 0x8b, 0x93, 0x80, 0x70, 0x66, 0x79, 0xf0, 0xa5, 0xef, 0x90, 0x26, 0xd9, 0xa2, 0x72\ndb 0x9c, 0xb5, 0x83, 0x6c, 0xc5, 0x91, 0x19, 0xd9, 0x18, 0x41, 0xf9, 0x04, 0x3a, 0x83, 0x8c, 0x0c\ndb 0xd3, 0x2c, 0x8e, 0x3e, 0xb7, 0x5c, 0x19, 0xf6, 0x04, 0x1d, 0x09, 0xe8, 0x7e, 0x9d, 0x00, 0xfa\ndb 0x08, 0x15, 0x1f, 0xdf, 0xf9, 0x42, 0x86, 0x63, 0x99, 0x8c, 0xec, 0x34, 0xcd, 0x20, 0x82, 0xc6\ndb 0x64, 0x9b, 0x1f, 0xec, 0x73, 0x38, 0x5c, 0xaa, 0xec, 0xe0, 0x76, 0x5b, 0x64, 0x93, 0x48, 0x0d\ndb 0x33, 0x2b, 0xfb, 0x02, 0x97, 0xd6, 0xee, 0xb4, 0x79, 0x92, 0xf6, 0xb0, 0x11, 0xdc, 0x97, 0x8e\ndb 0x33, 0x84, 0xe6, 0x68, 0xb2, 0x65, 0x60, 0x61, 0xa8, 0x83, 0xf5, 0xf9, 0x2a, 0x7e, 0x4a, 0x75\ndb 0x84, 0x85, 0x37, 0x34, 0x47, 0x4d, 0xf4, 0x8b, 0xcd, 0x19, 0xee, 0xda, 0x94, 0xee, 0x01, 0xef\ndb 0x5d, 0x75, 0x43, 0x78, 0xa4, 0xe0, 0x76, 0x7a, 0x76, 0x65, 0x74, 0x82, 0xd5, 0x2a, 0x95, 0x23\ndb 0x59, 0x2d, 0x63, 0xcf, 0x2c, 0xad, 0x85, 0xe2, 0x80, 0x3f, 0x4c, 0xcd, 0xb2, 0x75, 0x45, 0xd5\ndb 0x62, 0x0f, 0xc8, 0xd9, 0x68, 0x4c, 0xe9, 0xb8, 0x09, 0xed, 0x2e, 0x5b, 0x67, 0xaf, 0x65, 0x04\ndb 0x26, 0x96, 0x33, 0xb1, 0x01, 0x3e, 0x85, 0x0f, 0x8d, 0xf3, 0x52, 0x2c, 0x31, 0x93, 0xfe, 0x64\ndb 0x9a, 0x96, 0xd7, 0x19, 0xe0, 0x3c, 0xfc, 0xa9, 0x3f, 0xd2, 0xae, 0x49, 0x9c, 0x26, 0x6e, 0xe2\ndb 0xbf, 0x0f, 0x73, 0xf6, 0x44, 0xc5, 0x1b, 0x1c, 0x04, 0xde, 0xae, 0xf3, 0xdb, 0x80, 0xa5, 0x83\ndb 0xa4, 0xbf, 0xc7, 0x68, 0x58, 0xbf, 0x6d, 0xa3, 0x19, 0xf6, 0x0d, 0x74, 0xf2, 0x52, 0x36, 0x66\ndb 0xef, 0x42, 0xb5, 0xaa, 0x3d, 0x77, 0x00, 0x17, 0xab, 0x56, 0x08, 0x28, 0x31, 0xbe, 0xc9, 0xac\ndb 0xb9, 0xdf, 0x48, 0xcb, 0xd3, 0x24, 0xba, 0x7c, 0x19, 0xdd, 0x53, 0x1b, 0xb6, 0xac, 0xe0, 0xf8\ndb 0xdf, 0x38, 0x85, 0xc9, 0x24, 0x78, 0xdb, 0xf0, 0xe8, 0xab, 0xf2, 0xc2, 0xb7, 0x07, 0xf5, 0xfa\ndb 0x45, 0xc2, 0x2c, 0x3d, 0x20, 0x68, 0xdc, 0x2d, 0xcf, 0xb8, 0xe2, 0xe0, 0x29, 0x3c, 0x94, 0x37\ndb 0x7f, 0x23, 0x69, 0x9f, 0x11, 0x2c, 0x81, 0xf0, 0x3f, 0x11, 0x4c, 0xb5, 0xde, 0x9c, 0xe0, 0x17\ndb 0x97, 0x38, 0x64, 0x78, 0xdf, 0x36, 0x82, 0x23, 0x38, 0x64, 0x3d, 0x8a, 0x3d, 0xc2, 0xac, 0x29\ndb 0x5d, 0x63, 0x6b, 0x4d, 0xb1, 0x69, 0x7c, 0xfd, 0x74, 0xe9, 0x92, 0xf4, 0x62, 0x73, 0x77, 0x4a\ndb 0x80, 0xcd, 0x1a, 0xba, 0x6e, 0xba, 0x52, 0x12, 0xaf, 0xdd, 0x90, 0xf7, 0x73, 0x2f, 0xf9, 0x51\ndb 0x81, 0x89, 0xa1, 0x80, 0xaa, 0x87, 0xfc, 0x58, 0x6d, 0x1f, 0x2d, 0x6f, 0x5e, 0xe0, 0x23, 0x5e\ndb 0x0d, 0xaf, 0x86, 0x0d, 0x7a, 0x2d, 0x61, 0x4e, 0x5a, 0xcf, 0x3f, 0x11, 0xc5, 0x9b, 0xf0, 0x17\ndb 0x88, 0x96, 0x05, 0x95, 0x92, 0xc6, 0x65, 0x87, 0x13, 0x86, 0x77, 0x9c, 0x65, 0x14, 0xdd, 0x65\ndb 0xb9, 0xbb, 0x96, 0x15, 0x48, 0x6b, 0x23, 0x89, 0x99, 0x3c, 0x7b, 0xef, 0x03, 0x2a, 0xd2, 0x0a\ndb 0xfe, 0x5c, 0xee, 0x8a, 0x1c, 0x1e, 0x6c, 0x1e, 0xac, 0xb3, 0x61, 0x8e, 0x95, 0xad, 0x6a, 0x82\ndb 0x32, 0x3f, 0xef, 0x9d, 0x36, 0x92, 0x06, 0x4e, 0x1a, 0x25, 0x0d, 0xfb, 0xfe, 0xcc, 0x37, 0xe8\ndb 0xed, 0x9f, 0xc2, 0x90, 0x37, 0xad, 0x51, 0xe9, 0xb9, 0x20, 0x52, 0x1a, 0xe0, 0x55, 0xa1, 0x1a\ndb 0x09, 0x00, 0x4a, 0x45, 0xe2, 0x7a, 0x86, 0x3e, 0xbb, 0xf9, 0xb9, 0xc2, 0x0b, 0xa7, 0xf4, 0x75\ndb 0xca, 0xe3, 0x7a, 0xf4, 0xfd, 0xaf, 0x6a, 0x39, 0x72, 0x9c, 0x41, 0x8c, 0x10, 0x7e, 0xad, 0x8e\ndb 0xf9, 0x35, 0x2b, 0x85, 0x5d, 0x05, 0x9f, 0x99, 0x37, 0x3c, 0x46, 0x68, 0x5b, 0x5a, 0x70, 0x77\ndb 0x4a, 0xd7, 0x85, 0x79, 0x21, 0x3f, 0xdd, 0xdd, 0xc8, 0x3c, 0x03, 0x8c, 0x3d, 0xef, 0xad, 0x1e\ndb 0x44, 0x3e, 0xc1, 0xd0, 0x89, 0xa9, 0xfd, 0xab, 0x38, 0x30, 0x91, 0xc3, 0x49, 0x28, 0x8a, 0x7f\ndb 0x31, 0x44, 0xb0, 0xb9, 0x7d, 0x32, 0x14, 0x53, 0xe0, 0xa0, 0xed, 0xe2, 0xe2, 0x6c, 0xd7, 0x55\ndb 0x74, 0x6e, 0x8c, 0x70, 0x4d, 0x56, 0xa3, 0x7e, 0x99, 0x96, 0xea, 0x00, 0x5b, 0x13, 0x40, 0xdc\ndb 0xaa, 0x4a, 0xcf, 0x99, 0xf6, 0x76, 0x34, 0xa6, 0x53, 0x78, 0xbc, 0x5d, 0x32, 0x41, 0xe0, 0x33\ndb 0x21, 0xe5, 0xe6, 0x06, 0x73, 0x6c, 0xda, 0xa2, 0x10, 0x28, 0xd4, 0x6d, 0x1b, 0x02, 0x58, 0x8b\ndb 0xed, 0x7e, 0x65, 0x5e, 0x4c, 0x73, 0xd7, 0xce, 0xf0, 0x9c, 0x48, 0xa7, 0x6c, 0xca, 0x74, 0xdc\ndb 0x53, 0xc3, 0xee, 0x7a, 0x47, 0xc3, 0xb7, 0xe6, 0xb4, 0xb0, 0xba, 0x48, 0xdf, 0x46, 0x28, 0x03\ndb 0x68, 0x22, 0x20, 0x92, 0xca, 0xc9, 0xcf, 0xb6, 0x7f, 0xc9, 0xc2, 0x70, 0xa2, 0xe8, 0x43, 0x89\ndb 0xd2, 0x52, 0xb5, 0x62, 0xc5, 0x70, 0x50, 0x72, 0x98, 0x59, 0x5b, 0x07, 0xf7, 0x98, 0x5c, 0xab\ndb 0x04, 0xca, 0x79, 0x03, 0x67, 0x4d, 0xcc, 0xc0, 0x16, 0x69, 0x55, 0x07, 0x54, 0xa5, 0x41, 0xd7\ndb 0x57, 0x53, 0x4c, 0x1f, 0x35, 0xaf, 0x26, 0x6e, 0x4f, 0x63, 0xc4, 0x0d, 0xb4, 0x6a, 0x5c, 0x40\ndb 0xbd, 0xf4, 0x5c, 0x03, 0x7c, 0x51, 0x7a, 0xa2, 0x9d, 0x0c, 0xf8, 0x81, 0xb9, 0x92, 0x0e, 0x53\ndb 0xd1, 0xd5, 0x9a, 0x31, 0xf7, 0x0a, 0x1d, 0x70, 0xbc, 0x07, 0x82, 0xce, 0xad, 0x0a, 0xb0, 0x47\ndb 0x86, 0xe6, 0xc1, 0x44, 0xe6, 0x87, 0xca, 0xe6, 0x61, 0x8c, 0xc2, 0x33, 0xae, 0x11, 0x48, 0xcd\ndb 0xd0, 0x33, 0x9c, 0xf3, 0x11, 0xe6, 0x2a, 0x4d, 0x30, 0x0b, 0xcb, 0xe2, 0xc7, 0x77, 0x60, 0xb1\ndb 0xd8, 0xe3, 0xa0, 0x44, 0xe2, 0x87, 0xfa, 0xf6, 0x7e, 0xba, 0x5d, 0x32, 0xa1, 0x53, 0xe6, 0x05\ndb 0xe1, 0x15, 0xe8, 0xd2, 0x01, 0x46, 0xaf, 0xb1, 0x78, 0x0c, 0x64, 0x2d, 0x3a, 0x8c, 0xf2, 0xb8\ndb 0x07, 0xee, 0x9d, 0xda, 0x5b, 0x60, 0x07, 0xe4, 0x5e, 0x0b, 0x1d, 0x54, 0xbb, 0x00, 0xc9, 0x99\ndb 0x0c, 0x6b, 0x4e, 0x18, 0xcc, 0x82, 0x04, 0xa6, 0x8b, 0xc0, 0x07, 0xf4, 0x2b, 0xb4, 0x10, 0x25\ndb 0xd7, 0xdc, 0x3b, 0xa2, 0xa5, 0x0d, 0x06, 0xa1, 0xdf, 0x32, 0xb2, 0x3b, 0xa0, 0xdc, 0x70, 0x0e\ndb 0x16, 0x76, 0xc9, 0xbd, 0x73, 0x3d, 0x6e, 0x97, 0x55, 0xe0, 0x4f, 0x16, 0x8e, 0x42, 0x93, 0x0c\ndb 0x58, 0x64, 0x91, 0x76, 0x3f, 0xaf, 0x71, 0x25, 0x50, 0x66, 0xdd, 0x54, 0x2b, 0x47, 0x6b, 0x0d\ndb 0x4a, 0x8d, 0xaa, 0x29, 0x22, 0xad, 0xf5, 0x7f, 0x9d, 0xd8, 0x29, 0x25, 0x0f, 0x59, 0x10, 0x05\ndb 0xb9, 0x56, 0x25, 0x98, 0x60, 0x75, 0xa1, 0x32, 0xa0, 0x69, 0xb4, 0x37, 0x23, 0x5c, 0xcc, 0xe0\ndb 0x07, 0x94, 0xfb, 0xb0, 0x63, 0x9a, 0xf7, 0x90, 0x28, 0xe0, 0x1c, 0x82, 0xaf, 0xe9, 0xb0, 0x39\ndb 0xa3, 0x86, 0x61, 0x9c, 0xf6, 0x41, 0x71, 0x70, 0xb0, 0x8e, 0x44, 0x83, 0x51, 0xec, 0x4d, 0x2e\ndb 0xca, 0x62, 0xa1, 0xef, 0xc1, 0x95, 0x6b, 0xfd, 0x6c, 0x72, 0x57, 0x36, 0xcb, 0xde, 0x91, 0x52\ndb 0xc8, 0x1d, 0x09, 0x8f, 0x38, 0x74, 0xd5, 0x2c, 0xcc, 0x0b, 0x58, 0x57, 0xc5, 0xba, 0xb8, 0x29\ndb 0x4c, 0x79, 0x03, 0xab, 0x0d, 0x22, 0x45, 0x0e, 0x27, 0x93, 0x2b, 0xb1, 0x68, 0x5a, 0x66, 0xb1\ndb 0xa8, 0x85, 0x0d, 0xaa, 0x90, 0x84, 0x7a, 0x98, 0xf0, 0xe8, 0x3f, 0x41, 0x64, 0x1b, 0x7c, 0x79\ndb 0x9d, 0xfd, 0x3a, 0xf0, 0x00, 0xea, 0xa5, 0x7c, 0xe2, 0x89, 0xb9, 0xc0, 0x85, 0xf4, 0x0a, 0x1a\ndb 0x2c, 0xd9, 0xf4, 0x7e, 0x60, 0x67, 0xf4, 0x86, 0xf5, 0xe9, 0x22, 0x18, 0x97, 0x99, 0x7c, 0x94\ndb 0x96, 0x5e, 0xde, 0xf2, 0x50, 0x5c, 0xa3, 0x3e, 0xb2, 0x18, 0x6a, 0xd9, 0x22, 0x85, 0xb6, 0x15\ndb 0x92, 0x57, 0xc2, 0xe0, 0x33, 0x3b, 0x4d, 0x87, 0x9a, 0xe2, 0xfb, 0xfc, 0x14, 0xc4, 0x42, 0x0a\ndb 0xa8, 0xcc, 0x58, 0xe1, 0x9d, 0xaf, 0xc9, 0x84, 0x1c, 0x25, 0xcb, 0xa3, 0x00, 0xf7, 0x34, 0x21\ndb 0x60, 0x14, 0x34, 0xf7, 0xdd, 0xdd, 0x8e, 0x6d, 0x5e, 0xa0, 0x29, 0x49, 0x00, 0xcd, 0xc8, 0x5b\ndb 0xf8, 0x20, 0x92, 0x36, 0x28, 0xac, 0x94, 0xaa, 0x64, 0x6c, 0x27, 0xb2, 0x08, 0xb5, 0x93, 0xea\ndb 0x16, 0xdd, 0xdc, 0x54, 0x7d, 0x7e, 0x5b, 0x80, 0xab, 0x4f, 0xed, 0x3d, 0xfb, 0x73, 0xdc, 0x9a\ndb 0x88, 0xa4, 0x29, 0x69, 0x7f, 0x5f, 0xc2, 0xba, 0x52, 0x75, 0x95, 0x91, 0x05, 0x39, 0x27, 0x60\ndb 0xdc, 0xee, 0xea, 0x9e, 0x27, 0x8a, 0x7b, 0xd4, 0x4c, 0x0b, 0xbc, 0x12, 0x52, 0xf4, 0x28, 0xd2\ndb 0xe8, 0x0f, 0xbb, 0xc8, 0x5a, 0x1e, 0x9b, 0x1b, 0xed, 0x59, 0x7a, 0x67, 0x46, 0xd4, 0x3f, 0x28\ndb 0xee, 0x6f, 0xac, 0x78, 0x45, 0xe2, 0xd8, 0x6e, 0x71, 0x8d, 0xa5, 0xfb, 0xbd, 0x8f, 0x35, 0xd9\ndb 0x29, 0x1c, 0x0a, 0x40, 0xee, 0x39, 0xe3, 0x2f, 0x1a, 0xa8, 0xd2, 0xf2, 0xdd, 0xdb, 0x62, 0xf5\ndb 0x49, 0x1e, 0x3d, 0x11, 0xde, 0x1c, 0x5d, 0xe5, 0x5f, 0xd4, 0xdc, 0x8a, 0x98, 0x55, 0x57, 0x1a\ndb 0xee, 0x81, 0xbf, 0xed, 0x18, 0xda, 0x5a, 0x8e, 0x81, 0x3f, 0x31, 0x3c, 0x11, 0x52, 0x8d, 0x13\ndb 0xd9, 0xe9, 0x17, 0x8f, 0xd5, 0x50, 0x7b, 0xbf, 0x2f, 0x24, 0xcb, 0xfa, 0xcc, 0x92, 0xd7, 0xba\ndb 0xa6, 0xab, 0xcc, 0xcf, 0xed, 0xe7, 0xe7, 0x7f, 0x2e, 0x10, 0xbb, 0xa2, 0x57, 0x66, 0xee, 0xc7\ndb 0x69, 0x1b, 0x40, 0x30, 0xad, 0x46, 0x26, 0x72, 0xd5, 0xf9, 0x88, 0xb3, 0x11, 0x82, 0x49, 0x5a\ndb 0x8d, 0x82, 0xb7, 0xf3, 0xbc, 0x6b, 0x5c, 0x18, 0x9b, 0x85, 0x91, 0xb6, 0x9f, 0x05, 0xf1, 0x80\ndb 0xd3, 0x62, 0x32, 0xcf, 0x9f, 0xb8, 0x15, 0x36, 0x63, 0x09, 0x63, 0xaf, 0x4d, 0xa2, 0x5a, 0x02\ndb 0xe2, 0x57, 0xf5, 0xa5, 0x44, 0xe2, 0x51, 0xbd, 0x92, 0x51, 0x53, 0xc2, 0xef, 0x60, 0x57, 0xdf\ndb 0xa7, 0x15, 0x4c, 0xbf, 0x66, 0x7d, 0x78, 0xa0, 0x07, 0x53, 0xb4, 0x70, 0x3a, 0x8d, 0x4f, 0x57\ndb 0xae, 0xae, 0xa3, 0x99, 0xb8, 0x65, 0xc7, 0xee, 0x8b, 0xd7, 0x15, 0x80, 0x90, 0xb7, 0x8f, 0xb1\ndb 0x6e, 0x41, 0x3b, 0x97, 0x4c, 0xf1, 0x14, 0xc3, 0xfe, 0x93, 0x3d, 0xaa, 0x1c, 0xb2, 0xb3, 0xf4\ndb 0x97, 0xd1, 0x53, 0x09, 0x49, 0x3e, 0xfd, 0x72, 0x17, 0x06, 0xf7, 0xa8, 0x52, 0x9b, 0x86, 0x8d\ndb 0x4d, 0xc6, 0xf5, 0xd4, 0xd9, 0x36, 0xf7, 0xbe, 0xa9, 0x66, 0xcf, 0xc2, 0xd2, 0xb1, 0xee, 0x9f\ndb 0x9d, 0x8c, 0xbc, 0x53, 0xec, 0x55, 0x3a, 0xad, 0x85, 0xca, 0xd3, 0x8f, 0xa5, 0x0c, 0xb9, 0xa7\ndb 0x8e, 0x95, 0x5f, 0x9b, 0xeb, 0x5f, 0xad, 0x39, 0x3a, 0xb2, 0x36, 0x51, 0x0c, 0x5f, 0x1d, 0xe6\ndb 0xa5, 0x13, 0x67, 0x7f, 0xcb, 0x78, 0x85, 0xc2, 0x58, 0xb5, 0xb3, 0xeb, 0x3d, 0x15, 0x62, 0x97\ndb 0xd2, 0x99, 0x50, 0x30, 0x12, 0x49, 0x9e, 0x03, 0x54, 0x45, 0x8f, 0x89, 0x2f, 0x60, 0xb2, 0x8c\ndb 0x50, 0x25, 0x15, 0x08, 0x4f, 0xed, 0x09, 0x88, 0x50, 0x76, 0x3c, 0xf3, 0x4f, 0x20, 0x3b, 0xef\ndb 0xea, 0xfc, 0x07, 0x21, 0xb6, 0xc7, 0x8c, 0xfd, 0x54, 0xb1, 0xc3, 0xd6, 0xb0, 0xab, 0x7d, 0xfa\ndb 0x94, 0xb4, 0x64, 0x21, 0xc0, 0x3d, 0x78, 0x7f, 0x6d, 0xcb, 0xbb, 0x8d, 0xa7, 0x51, 0x99, 0x55\ndb 0x47, 0x9f, 0x97, 0x69, 0xda, 0x86, 0xa3, 0x41, 0xed, 0x2b, 0x32, 0x7c, 0xac, 0xf4, 0x8a, 0x40\ndb 0xec, 0xc1, 0x1b, 0xf7, 0x80, 0xb9, 0x64, 0x57, 0x89, 0x2c, 0xb2, 0x91, 0xa7, 0x55, 0xe7, 0xef\ndb 0xe5, 0x3c, 0x90, 0x90, 0xc0, 0xfd, 0x8a, 0x31, 0x6f, 0xcf, 0x37, 0x91, 0x41, 0x25, 0xb2, 0x89\ndb 0x23, 0xa5, 0x30, 0xb6, 0xb9, 0xcf, 0xb9, 0x10, 0x3d, 0xc8, 0xb8, 0x61, 0xc7, 0x02, 0x35, 0x26\ndb 0x0f, 0x74, 0xaf, 0xca, 0x3a, 0x55, 0x48, 0x55, 0x46, 0xe1, 0xce, 0x55, 0x06, 0x67, 0x8b, 0x73\ndb 0x32, 0xc1, 0xa2, 0xaf, 0x5a, 0xa1, 0x14, 0xfd, 0x4f, 0xc2, 0xe0, 0x90, 0xfe, 0x0a, 0xc3, 0x3d\ndb 0x25, 0x67, 0x4f, 0xf7, 0xd6, 0xe6, 0xfb, 0x0a, 0x80, 0x52, 0xb5, 0xd6, 0x58, 0x46, 0x34, 0xb8\ndb 0x95, 0x46, 0x3c, 0x22, 0xa5, 0x76, 0x90, 0xe6, 0x9e, 0xac, 0x13, 0x36, 0xf2, 0x70, 0xcc, 0x86\ndb 0x7d, 0x46, 0x76, 0x85, 0xb1, 0x6a, 0x83, 0xc3, 0x54, 0xba, 0xa2, 0x62, 0xca, 0x3c, 0x6a, 0xc1\ndb 0x74, 0x6a, 0xc4, 0x64, 0x66, 0x00, 0x78, 0x7e, 0xf5, 0x71, 0x55, 0x61, 0x6f, 0xae, 0xf3, 0x3d\ndb 0x7f, 0x2c, 0x1b, 0x4e, 0x8f, 0xa9, 0x92, 0x7b, 0xe1, 0x2c, 0x33, 0x4d, 0x4c, 0x05, 0x40, 0xe1\ndb 0x15, 0x6d, 0xd6, 0xde, 0xd8, 0x42, 0xa2, 0x45, 0x6a, 0x9c, 0x70, 0xcc, 0xf2, 0x00, 0xf4, 0xd0\ndb 0xaf, 0x95, 0xb1, 0x36, 0x63, 0x89, 0xfc, 0x92, 0x63, 0xdc, 0x08, 0xe3, 0xa0, 0x08, 0x60, 0xcb\ndb 0x3c, 0xa0, 0xc8, 0xbc, 0xfe, 0x06, 0x50, 0x96, 0x28, 0xf2, 0x8e, 0x30, 0x00, 0x08, 0xb9, 0xbe\ndb 0x05, 0xbd, 0xd5, 0x3b, 0xad, 0xf4, 0x10, 0x0f, 0xe1, 0xe1, 0x23, 0xbb, 0x2d, 0x41, 0x37, 0x5d\ndb 0x8d, 0xc3, 0xfd, 0xfb, 0x21, 0x31, 0xee, 0xa9, 0x2f, 0xd8, 0x55, 0xec, 0xd6, 0x92, 0x29, 0x4b\ndb 0x85, 0x2f, 0x64, 0x99, 0x05, 0x35, 0x66, 0xc2, 0x77, 0xb8, 0xe6, 0xe4, 0x40, 0x57, 0xf8, 0x5c\ndb 0xf0, 0x95, 0x7e, 0x67, 0x49, 0xc0, 0x20, 0x9c, 0xcc, 0x47, 0xff, 0xb0, 0xb4, 0xfa, 0x45, 0x7b\ndb 0xc0, 0xe3, 0x7f, 0xdd, 0x3e, 0xf0, 0x2c, 0x7f, 0x9d, 0xbb, 0x79, 0x9c, 0xb7, 0x08, 0xd4, 0x56\ndb 0xa8, 0xfe, 0xed, 0xd7, 0x4d, 0xd1, 0x24, 0x49, 0x5c, 0x6d, 0x93, 0x68, 0xc0, 0xe6, 0xb7, 0xbc\ndb 0xdb, 0x99, 0x2e, 0xf0, 0xc5, 0xe1, 0xfd, 0x1d, 0x5f, 0x4c, 0x36, 0xc7, 0xef, 0xf9, 0x50, 0x17\ndb 0x4b, 0xd3, 0xe7, 0x60, 0x46, 0xfd, 0xb8, 0x1c, 0x59, 0x90, 0x6a, 0x42, 0x9d, 0xe5, 0x1f, 0x89\ndb 0xa9, 0x8e, 0x94, 0x54, 0x02, 0xc6, 0x3a, 0xc6, 0xab, 0x8b, 0x32, 0xcb, 0xde, 0x46, 0x7a, 0x29\ndb 0xb2, 0x13, 0x17, 0x92, 0x8e, 0x85, 0x47, 0x25, 0x02, 0xd1, 0xf5, 0x08, 0xed, 0x95, 0x3d, 0x91\ndb 0x28, 0xf5, 0x8a, 0xa5, 0x65, 0xb1, 0xf1, 0x3c, 0x0e, 0xb8, 0x06, 0x7b, 0x20, 0xb2, 0x2f, 0x03\ndb 0x68, 0xea, 0x5a, 0x86, 0x95, 0xf8, 0x82, 0xdb, 0x48, 0xfe, 0x2c, 0x66, 0x0e, 0xe6, 0x54, 0x14\ndb 0xa9, 0x13, 0xd8, 0xf8, 0x5a, 0xa0, 0x07, 0x0f, 0x13, 0xc0, 0xac, 0xa7, 0x99, 0x32, 0xc2, 0x46\ndb 0x9c, 0x0c, 0x22, 0x08, 0x04, 0x6e, 0x43, 0x3a, 0x56, 0x6f, 0x8c, 0xd1, 0x3e, 0x77, 0x62, 0x67\ndb 0x4b, 0x20, 0x52, 0xcf, 0xa4, 0xcb, 0x59, 0xd5, 0xef, 0xbd, 0x70, 0x6b, 0x1f, 0x23, 0xc4, 0x57\ndb 0x6f, 0x2b, 0xe1, 0xc2, 0xfd, 0xd2, 0x51, 0xac, 0x08, 0x19, 0xa2, 0x54, 0x11, 0x4d, 0xc8, 0x11\ndb 0x96, 0x25, 0x89, 0x09, 0x29, 0xba, 0x34, 0x17, 0x5e, 0xe1, 0x8a, 0xfe, 0x40, 0x54, 0x5b, 0x22\ndb 0xf6, 0x91, 0x18, 0xab, 0xfa, 0x73, 0xa5, 0x3c, 0xdb, 0x93, 0xa5, 0xcb, 0x40, 0x49, 0xe5, 0x62\ndb 0xb7, 0xae, 0xd6, 0x8b, 0x60, 0xd7, 0xee, 0xb9, 0xbc, 0x77, 0xc8, 0x77, 0x1e, 0x51, 0x73, 0xd1\ndb 0xae, 0x05, 0x8a, 0x85, 0x9c, 0xba, 0xd9, 0x6e, 0xcb, 0xf0, 0x15, 0x56, 0xb9, 0x3c, 0x5d, 0xa3\ndb 0xde, 0x01, 0x9a, 0x9b, 0x03, 0xb4, 0xed, 0x78, 0xf4, 0xd5, 0xb7, 0xc7, 0x1b, 0x77, 0xfc, 0xea\ndb 0x45, 0x9a, 0x89, 0xbe, 0xd0, 0x8e, 0xfc, 0x9d, 0x23, 0x7b, 0xac, 0x6f, 0x7a, 0x6d, 0xfa, 0x7e\ndb 0xbb, 0x00, 0xc2, 0xef, 0xd1, 0x9e, 0x79, 0xf4, 0x6d, 0x85, 0x61, 0x4c, 0xe4, 0x11, 0xde, 0x80\ndb 0x72, 0x30, 0xfc, 0x01, 0xa8, 0x60, 0xcb, 0xe4, 0x22, 0x7a, 0x9b, 0xa5, 0x28, 0x3d, 0x57, 0x4b\ndb 0x51, 0x0c, 0xa7, 0x72, 0x6f, 0x6f, 0x4f, 0x57, 0x6c, 0xb2, 0x36, 0xc1, 0x11, 0xba, 0xa8, 0x59\ndb 0xc4, 0x2d, 0x5f, 0x4e, 0x30, 0x0c, 0x5d, 0xe1, 0xea, 0xb2, 0x0b, 0xf3, 0xe3, 0x76, 0x21, 0x90\ndb 0xc4, 0x7c, 0x4a, 0x07, 0xb1, 0x5a, 0x98, 0x2f, 0x1e, 0x81, 0x2c, 0xe8, 0xae, 0x62, 0x65, 0xc6\ndb 0xbb, 0x4a, 0xeb, 0xfa, 0xa1, 0x84, 0x93, 0xcb, 0x11, 0x75, 0xf9, 0x1b, 0x14, 0x1f, 0x60, 0xfc\ndb 0x9e, 0x23, 0xcb, 0x87, 0xfc, 0xe4, 0x1e, 0x42, 0xb6, 0x4b, 0x9b, 0x7d, 0xdb, 0xfb, 0x37, 0xf3\ndb 0x8f, 0xc8, 0x64, 0x2c, 0xad, 0xa4, 0xd8, 0x37, 0xfd, 0xb3, 0x9c, 0xd9, 0x78, 0x20, 0xfe, 0x80\ndb 0x9a, 0x80, 0x5d, 0x43, 0x7c, 0x97, 0xbe, 0x52, 0xd9, 0x2f, 0xad, 0x3c, 0xe2, 0x93, 0xc7, 0x7b\ndb 0x5b, 0x2b, 0x2e, 0xb0, 0xb1, 0x42, 0x74, 0x62, 0xdd, 0xe9, 0x27, 0xa9, 0x56, 0x7b, 0xf7, 0x9c\ndb 0x28, 0x7b, 0x9f, 0x31, 0xcb, 0x05, 0x80, 0x35, 0xe2, 0x38, 0x8d, 0x30, 0x13, 0x7f, 0x9b, 0xfc\ndb 0x82, 0x41, 0xc8, 0x76, 0xa1, 0x49, 0xf5, 0x49, 0x83, 0x72, 0xce, 0x23, 0x9e, 0xe4, 0xf1, 0xc9\ndb 0x38, 0x56, 0xd6, 0xf1, 0xcd, 0xd3, 0xf0, 0xb6, 0xce, 0xfa, 0x6d, 0xa7, 0xa6, 0x19, 0xc1, 0xf7\ndb 0x37, 0x29, 0x3c, 0xa9, 0xea, 0x90, 0x50, 0xb3, 0xde, 0xc0, 0x2a, 0x58, 0x21, 0xa9, 0xcd, 0x46\ndb 0xc2, 0x33, 0xf7, 0x93, 0x54, 0xba, 0xe4, 0x5c, 0x0f, 0x9c, 0x04, 0x68, 0x96, 0xbc, 0x36, 0xaa\ndb 0x14, 0xbe, 0x39, 0x5a, 0xff, 0x69, 0xe6, 0x0d, 0xaf, 0x61, 0x68, 0x06, 0xee, 0x47, 0x7f, 0xfd\ndb 0x56, 0x67, 0xce, 0xc9, 0x44, 0x96, 0xac, 0x4f, 0x36, 0x7f, 0x7c, 0xef, 0xfc, 0xe4, 0x35, 0x8b\ndb 0x6e, 0xb9, 0x92, 0x6e, 0xe9, 0xc7, 0x60, 0xac, 0x1e, 0x19, 0x78, 0xd8, 0x3d, 0xc7, 0x39, 0x1b\ndb 0xa6, 0x1f, 0x9e, 0x34, 0x91, 0x18, 0x9b, 0x89, 0x3e, 0x5e, 0xf4, 0x95, 0xc1, 0x26, 0x9e, 0x02\ndb 0xb6, 0x0a, 0x2f, 0x26, 0xb9, 0x66, 0xfb, 0xb4, 0x24, 0x24, 0x78, 0x5c, 0x6c, 0x55, 0x14, 0xae\ndb 0xf5, 0xe6, 0xce, 0xaf, 0xcf, 0x6a, 0x87, 0x6c, 0x31, 0x62, 0x66, 0xdd, 0x8f, 0x9e, 0x98, 0x17\ndb 0x8c, 0x19, 0x3f, 0xef, 0xb7, 0x92, 0x24, 0x8b, 0x18, 0x8f, 0xbe, 0x27, 0x97, 0xb8, 0x64, 0x87\ndb 0xb5, 0x99, 0x81, 0x47, 0xb0, 0x7a, 0x75, 0x4c, 0x42, 0x05, 0xc8, 0x8c, 0xd3, 0x6a, 0x41, 0x4b\ndb 0xdb, 0x8b, 0xdc, 0xa3, 0x3c, 0x1f, 0xff, 0x0f, 0xa8, 0xf5, 0xcc, 0x50, 0x15, 0xf1, 0x72, 0x4b\ndb 0xb8, 0x52, 0x34, 0x67, 0x77, 0x5f, 0x86, 0xe8, 0x9a, 0x2e, 0xe4, 0xec, 0x60, 0x16, 0x83, 0xc7\ndb 0x5d, 0x15, 0x3b, 0xe8, 0xee, 0x65, 0xd4, 0x5c, 0x43, 0x3e, 0x01, 0x52, 0xd0, 0xf2, 0xc8, 0xd5\ndb 0x97, 0x6e, 0xfe, 0x08, 0x2d, 0x19, 0x05, 0x28, 0xc8, 0x58, 0xdf, 0x94, 0x03, 0xf4, 0x57, 0xcf\ndb 0xe1, 0xf7, 0x72, 0x93, 0x38, 0xee, 0x23, 0xc8, 0x88, 0xb5, 0x34, 0xd4, 0xa0, 0x12, 0x42, 0xcf\ndb 0xb6, 0x10, 0xb3, 0x16, 0x66, 0x79, 0x2c, 0x5a, 0x95, 0xa8, 0x21, 0x72, 0xdd, 0x8e, 0xb0, 0x0b\ndb 0xc0, 0xe0, 0x62, 0x22, 0xa8, 0xcc, 0x67, 0xc8, 0x98, 0xbf, 0x74, 0xc4, 0x76, 0x5e, 0x60, 0xd3\ndb 0x36, 0xa9, 0x00, 0x95, 0xdd, 0x21, 0x3a, 0xb2, 0xee, 0x5a, 0x6c, 0x9e, 0xb7, 0x0e, 0x32, 0x23\ndb 0x6d, 0xec, 0xaf, 0x42, 0x41, 0x5d, 0x68, 0x14, 0x58, 0x80, 0xca, 0x2d, 0xb9, 0xf3, 0xb8, 0xdb\ndb 0x96, 0xb8, 0xed, 0xba, 0xdc, 0x26, 0xb0, 0x5d, 0xe9, 0x9a, 0x80, 0xdc, 0x0e, 0xb3, 0x74, 0x49\ndb 0x77, 0x54, 0xb6, 0xb4, 0x6a, 0x8c, 0x8f, 0x74, 0x86, 0x33, 0xcd, 0xcb, 0x94, 0x2d, 0x1e, 0xd4\ndb 0x1e, 0x8c, 0x6f, 0x85, 0x12, 0xa3, 0xa0, 0x6f, 0x29, 0x28, 0x5d, 0x6f, 0x6a, 0x07, 0xa8, 0xf4\ndb 0x92, 0x4f, 0xc3, 0xf5, 0x05, 0x28, 0x0e, 0xe9, 0x8a, 0x60, 0x9c, 0xd2, 0x60, 0x04, 0x4f, 0xae\ndb 0xef, 0x46, 0x2d, 0x06, 0x8d, 0x9b, 0x93, 0xef, 0x06, 0x32, 0xa2, 0xf3, 0xba, 0xd7, 0x96, 0xbc\ndb 0x84, 0xd5, 0x4b, 0x6e, 0x06, 0xb0, 0xb6, 0xcf, 0x13, 0x88, 0xd8, 0x52, 0xf7, 0x3f, 0xc4, 0x0e\ndb 0x67, 0x2c, 0x91, 0x4c, 0x26, 0x46, 0xfc, 0x8e, 0xf0, 0x69, 0x18, 0xee, 0xcd, 0x80, 0x17, 0x11\ndb 0xbc, 0x47, 0x55, 0x34, 0x74, 0x03, 0xc9, 0x14, 0xee, 0xdd, 0x95, 0x03, 0xf7, 0xd2, 0x81, 0xb3\ndb 0x68, 0xc6, 0xbd, 0x77, 0x9a, 0x7e, 0xc1, 0xcb, 0xf2, 0xb0, 0xe6, 0x78, 0xce, 0x83, 0xa1, 0xd7\ndb 0x6f, 0x87, 0x8d, 0xcf, 0xbc, 0x6b, 0x33, 0xb4, 0xe4, 0xc3, 0xc3, 0x48, 0xdf, 0x5d, 0xf7, 0xfe\ndb 0xc5, 0xb3, 0x49, 0x42, 0x0e, 0x2d, 0xd1, 0x4c, 0xf6, 0x37, 0xe7, 0x18, 0xd9, 0xa2, 0xc0, 0xaf\ndb 0x60, 0x0b, 0xf1, 0xca, 0x54, 0x5f, 0xcc, 0x64, 0x1b, 0x09, 0xda, 0xd2, 0x50, 0xec, 0x38, 0xa0\ndb 0x05, 0x8e, 0x0d, 0x76, 0xfd, 0x5b, 0x72, 0x3e, 0xac, 0x9a, 0xc7, 0xdb, 0xaf, 0x50, 0x9b, 0xfb\ndb 0x69, 0xb9, 0xdd, 0x48, 0xaa, 0xa6, 0x0c, 0x49, 0xff, 0x6f, 0x3b, 0xc3, 0x03, 0x13, 0x22, 0x26\ndb 0xf7, 0xd2, 0xb1, 0x13, 0x52, 0x49, 0xaa, 0x76, 0xe3, 0x48, 0xc0, 0x61, 0xea, 0xb3, 0xc4, 0x5b\ndb 0xc0, 0x88, 0x55, 0xb9, 0x71, 0xad, 0xb3, 0xc6, 0x99, 0xc3, 0x12, 0x51, 0x72, 0x3e, 0xd1, 0x92\ndb 0x40, 0x9a, 0xfe, 0xc7, 0x0f, 0xd9, 0x4f, 0x0f, 0x64, 0x91, 0xba, 0xfc, 0xc1, 0x62, 0xbf, 0xa8\ndb 0x45, 0x63, 0xae, 0xf6, 0x25, 0xa4, 0xf3, 0x50, 0x61, 0x86, 0xc4, 0xc3, 0x22, 0xf8, 0xd5, 0x37\ndb 0x70, 0x12, 0x9c, 0xba, 0xc0, 0xad, 0xa6, 0xa0, 0xc9, 0xfa, 0xd4, 0xe4, 0x57, 0x01, 0xa1, 0x0b\ndb 0x07, 0xab, 0xee, 0xe5, 0x35, 0x4c, 0x76, 0x83, 0x49, 0xfd, 0x11, 0x34, 0xed, 0xd8, 0xf7, 0x2c\n\nalign 32\n; 8192-bytes of random data\n.random_data3:\ndb 0x18, 0xd6, 0xfe, 0x97, 0x75, 0x8c, 0x1a, 0x61, 0xc5, 0xc0, 0x7e, 0x3f, 0x46, 0xf9, 0xb0, 0xa3\ndb 0x16, 0xb2, 0x1c, 0x7b, 0x04, 0xa7, 0x7e, 0xbe, 0x04, 0xdc, 0xc6, 0x65, 0x43, 0x5e, 0xa4, 0x8e\ndb 0x40, 0xc5, 0x4f, 0x2f, 0xf2, 0x62, 0x6d, 0x1b, 0x41, 0xb6, 0x9c, 0xa4, 0xbf, 0x1a, 0x57, 0x1e\ndb 0x83, 0x53, 0x8a, 0x92, 0xbc, 0x67, 0xe8, 0xe8, 0xc3, 0xb9, 0xbc, 0xab, 0x38, 0xa0, 0x8e, 0x5d\ndb 0xcc, 0x2d, 0xa9, 0xd8, 0x74, 0xee, 0x8f, 0x57, 0x62, 0x9b, 0x0f, 0xf8, 0x76, 0x2a, 0x4d, 0x22\ndb 0x2f, 0xaf, 0x0b, 0x13, 0xbf, 0xa5, 0x87, 0xc1, 0x0f, 0xfd, 0x0b, 0x69, 0xbc, 0x58, 0x06, 0xa3\ndb 0xc4, 0x4f, 0x33, 0xf7, 0x53, 0xc8, 0xe6, 0x6b, 0xa5, 0x96, 0x33, 0x37, 0x89, 0xc1, 0x33, 0x4e\ndb 0xfb, 0x54, 0xbb, 0xd1, 0xcf, 0xa7, 0xe4, 0x77, 0x72, 0x3f, 0x68, 0xd1, 0x7b, 0xc7, 0x4f, 0x99\ndb 0xd8, 0xdd, 0xf3, 0x85, 0x10, 0x88, 0x0c, 0x1a, 0x80, 0x86, 0xd9, 0xce, 0x9d, 0x88, 0xc7, 0x2e\ndb 0x2b, 0xcb, 0x34, 0x17, 0xd6, 0x85, 0x1b, 0xa3, 0x8e, 0xc2, 0xbb, 0x74, 0x2c, 0xf2, 0x61, 0x09\ndb 0xaa, 0x7b, 0x1e, 0x5c, 0x15, 0xb6, 0x47, 0x08, 0xbb, 0x5d, 0x5b, 0x1b, 0x4c, 0xb9, 0xd1, 0x9c\ndb 0x49, 0xc3, 0x57, 0x93, 0x84, 0x43, 0x97, 0x65, 0x97, 0x5d, 0xb8, 0x4f, 0xe5, 0x69, 0x7e, 0x6e\ndb 0xc4, 0xee, 0xd3, 0x62, 0xcc, 0xf7, 0xd1, 0xd7, 0x88, 0xfe, 0x9b, 0xaa, 0x31, 0x10, 0x6c, 0x9b\ndb 0x37, 0x4a, 0x8e, 0x01, 0xbb, 0xe1, 0x02, 0xc0, 0x9a, 0xa4, 0x45, 0x7c, 0xb4, 0xc0, 0x5e, 0xda\ndb 0xf2, 0x15, 0x3b, 0xe5, 0x95, 0x65, 0xe3, 0xf2, 0xb0, 0x84, 0x6b, 0xb8, 0xf9, 0x11, 0xdd, 0xd4\ndb 0xed, 0x1d, 0xbf, 0xbd, 0xb9, 0x98, 0xe8, 0xab, 0x08, 0x21, 0xe1, 0x76, 0xcd, 0x31, 0x59, 0x35\ndb 0x16, 0x95, 0x15, 0xb9, 0x00, 0x2c, 0xb1, 0xf9, 0x7b, 0x4d, 0xaf, 0x80, 0x92, 0xa9, 0x31, 0x91\ndb 0xfe, 0xaa, 0x8e, 0xe4, 0x45, 0x28, 0x48, 0x40, 0x5c, 0xf7, 0xa9, 0x3f, 0x5a, 0x87, 0x51, 0x30\ndb 0x7b, 0x55, 0xfa, 0x8c, 0xec, 0xcc, 0x32, 0xd5, 0x8c, 0x5b, 0xa7, 0x1c, 0xc2, 0xee, 0x5f, 0xdb\ndb 0x3a, 0x5c, 0xdb, 0x3d, 0x8f, 0x17, 0x0c, 0xae, 0x70, 0x35, 0x3a, 0xdd, 0x07, 0xa1, 0x21, 0x53\ndb 0xa6, 0x4a, 0xa3, 0xd7, 0x65, 0x3f, 0x32, 0xcb, 0x48, 0x4e, 0x2e, 0x12, 0x47, 0x9e, 0x59, 0x8e\ndb 0xa6, 0x85, 0x04, 0x06, 0x60, 0xcc, 0xc3, 0x54, 0x91, 0x64, 0x14, 0x05, 0xad, 0xe8, 0x2d, 0x77\ndb 0x5b, 0x5d, 0xca, 0x6b, 0x8c, 0x3a, 0x89, 0x71, 0x30, 0xcd, 0xa0, 0x8e, 0x79, 0xf8, 0xa3, 0xdb\ndb 0x5c, 0x7b, 0x52, 0xcb, 0x6a, 0xb1, 0x32, 0x31, 0xbe, 0x1f, 0x1a, 0xb8, 0xb8, 0x5f, 0xc4, 0x12\ndb 0x0c, 0xd6, 0x9e, 0x0c, 0xef, 0xca, 0x5e, 0x71, 0x57, 0x9e, 0x70, 0x91, 0x38, 0x43, 0x5b, 0xd7\ndb 0x18, 0x83, 0xe2, 0x68, 0x38, 0x29, 0xd7, 0x55, 0x8b, 0x61, 0xfd, 0x6a, 0x81, 0xbf, 0x7c, 0xf1\ndb 0xc4, 0xcb, 0x4a, 0x45, 0xe5, 0x7f, 0xfe, 0x02, 0x09, 0x9d, 0x6e, 0xbe, 0x45, 0xc3, 0x2a, 0xf3\ndb 0xe4, 0x64, 0xcc, 0xe8, 0x70, 0x34, 0x96, 0x73, 0x63, 0xad, 0x3f, 0x02, 0x4b, 0xfd, 0xc4, 0x4f\ndb 0x40, 0x00, 0x29, 0x45, 0x50, 0x54, 0xb2, 0x9b, 0xe5, 0xa5, 0x88, 0xf2, 0xa0, 0xe1, 0x17, 0xe7\ndb 0xe6, 0xea, 0x20, 0x5b, 0x03, 0xa1, 0xdc, 0x1a, 0x73, 0x26, 0x90, 0x0f, 0x3e, 0x00, 0x05, 0x21\ndb 0x62, 0x3e, 0x9c, 0xe9, 0xb7, 0xc2, 0x63, 0x22, 0xc4, 0xd1, 0x13, 0x45, 0x43, 0x02, 0x99, 0x76\ndb 0x72, 0x4a, 0x86, 0xf9, 0xd3, 0x88, 0x96, 0xbd, 0xf1, 0xba, 0xd0, 0xa6, 0x35, 0x9c, 0x8e, 0xa1\ndb 0x46, 0x52, 0xd3, 0x64, 0xa7, 0x48, 0xba, 0xab, 0x2c, 0x45, 0xb1, 0x38, 0x95, 0xf0, 0xe9, 0xde\ndb 0x1e, 0x51, 0x16, 0x58, 0xa8, 0x27, 0x93, 0x6d, 0x26, 0x57, 0xb5, 0x26, 0xae, 0xd9, 0x74, 0xd7\ndb 0x00, 0x02, 0xd9, 0x91, 0xc2, 0xe1, 0xdb, 0xf4, 0x3f, 0xaa, 0x4e, 0x59, 0x35, 0xf1, 0x9b, 0xf9\ndb 0x13, 0x30, 0xb5, 0xc5, 0x7c, 0x4c, 0x8f, 0x00, 0x28, 0x5e, 0xc1, 0x52, 0xd8, 0x19, 0x0c, 0x0e\ndb 0x18, 0x4c, 0x92, 0x74, 0x6e, 0xae, 0xae, 0x42, 0x35, 0xfb, 0xe5, 0xc0, 0xf9, 0x08, 0xe2, 0x41\ndb 0xe6, 0x00, 0x90, 0x83, 0x73, 0xaa, 0x62, 0x80, 0x68, 0x3f, 0x53, 0x46, 0x74, 0x36, 0x43, 0x4c\ndb 0xd4, 0x62, 0x40, 0xcc, 0x46, 0x2d, 0x67, 0xa5, 0x06, 0x39, 0x7b, 0xaa, 0x64, 0xcd, 0xf4, 0x2a\ndb 0xf7, 0xd2, 0x0d, 0xcc, 0xb9, 0x7d, 0xb6, 0x73, 0x30, 0xe2, 0x3e, 0x92, 0xbe, 0x09, 0xf5, 0x41\ndb 0x93, 0xe4, 0x99, 0x96, 0x05, 0xb1, 0x74, 0xeb, 0x35, 0xcb, 0xd4, 0xac, 0xa9, 0x49, 0x34, 0x09\ndb 0x24, 0x7e, 0xea, 0xad, 0xcf, 0x14, 0xdd, 0xea, 0xe1, 0xf8, 0x77, 0x0d, 0x97, 0x6f, 0xfd, 0x49\ndb 0x8c, 0x3b, 0xec, 0x5e, 0xbc, 0x3f, 0xbd, 0xdb, 0xaf, 0xff, 0x31, 0xdd, 0xeb, 0xe7, 0xe7, 0x38\ndb 0x59, 0x2e, 0x1f, 0xf8, 0x00, 0x7f, 0xa6, 0x9c, 0x3e, 0x17, 0x35, 0x3a, 0xbe, 0x7d, 0xe5, 0x18\ndb 0x06, 0xc6, 0x9e, 0x08, 0xf9, 0x4b, 0xba, 0xde, 0xa2, 0x82, 0x76, 0x26, 0xb1, 0xe6, 0xdc, 0xcd\ndb 0xd8, 0x15, 0x21, 0x5a, 0x00, 0x05, 0x40, 0x30, 0x47, 0xc5, 0x17, 0x83, 0xa1, 0x36, 0xcf, 0x6d\ndb 0x7a, 0xe3, 0x52, 0xc3, 0x0b, 0x8b, 0x78, 0x6c, 0x68, 0xd9, 0xa7, 0x52, 0xdc, 0x09, 0x43, 0x00\ndb 0x5c, 0x2b, 0x63, 0x6b, 0x76, 0x12, 0x69, 0x9f, 0x2b, 0x71, 0x4f, 0x78, 0x64, 0x24, 0x34, 0x4c\ndb 0x5b, 0x79, 0xac, 0xcc, 0x83, 0xf5, 0x05, 0x86, 0x8b, 0xcc, 0xa9, 0xf0, 0x1c, 0x67, 0xf6, 0x4c\ndb 0xda, 0x7f, 0xaf, 0x11, 0xd4, 0x6f, 0x37, 0x5e, 0xf3, 0x90, 0x62, 0xfe, 0xb2, 0x2c, 0x42, 0xef\ndb 0x92, 0x86, 0x58, 0x26, 0x80, 0xdb, 0x87, 0xe3, 0x18, 0xb2, 0x3b, 0x9b, 0xf2, 0x27, 0x00, 0x0a\ndb 0x87, 0x29, 0x2c, 0xe4, 0xc0, 0xba, 0x50, 0x6e, 0x1a, 0xd1, 0x27, 0xb2, 0xd0, 0xcf, 0x3d, 0x2d\ndb 0x3e, 0x74, 0xce, 0x0f, 0x1c, 0x13, 0x16, 0xc8, 0x7d, 0xc6, 0xcf, 0x23, 0x9d, 0xde, 0xca, 0x99\ndb 0x8d, 0x5d, 0x1c, 0xe7, 0x49, 0xbf, 0x30, 0x9c, 0xd7, 0xda, 0x78, 0xfe, 0x92, 0x4d, 0x56, 0x5f\ndb 0xc6, 0xd7, 0xdd, 0xa2, 0x94, 0x6b, 0xc1, 0x71, 0xd1, 0xb7, 0x3c, 0x7c, 0xb9, 0x05, 0xa8, 0x58\ndb 0x6e, 0x13, 0x3c, 0x12, 0xe2, 0xeb, 0x1f, 0xce, 0x41, 0x96, 0xda, 0xf8, 0xbe, 0x40, 0x2b, 0xaf\ndb 0x56, 0x9f, 0xae, 0x34, 0x1c, 0x69, 0xcd, 0x7b, 0x7c, 0x90, 0x36, 0x43, 0x00, 0xa1, 0x57, 0xc6\ndb 0xc6, 0x99, 0xc2, 0x44, 0x73, 0xe5, 0x65, 0x30, 0x3d, 0xfe, 0x7b, 0xf3, 0x70, 0xc5, 0x3c, 0x47\ndb 0xce, 0xbc, 0xe9, 0xa7, 0x99, 0xac, 0x14, 0x0a, 0x76, 0x92, 0xa8, 0xb2, 0x59, 0xbb, 0x59, 0xb6\ndb 0x2b, 0x6c, 0x30, 0x88, 0xca, 0x71, 0x45, 0xe3, 0x15, 0xaf, 0x85, 0xd3, 0xe7, 0x9c, 0xf1, 0xb2\ndb 0xb6, 0xe1, 0xdb, 0x70, 0x80, 0xe5, 0x36, 0xd9, 0xfe, 0x93, 0x58, 0x22, 0x45, 0x9b, 0x27, 0x98\ndb 0xbd, 0x6a, 0x8e, 0x6f, 0xfd, 0xa7, 0xb4, 0x7b, 0xa4, 0xb3, 0xc5, 0x64, 0x2c, 0x74, 0x27, 0x16\ndb 0x95, 0x6e, 0x1f, 0x9e, 0x33, 0x00, 0x09, 0x42, 0x70, 0xcd, 0x43, 0xf4, 0x8e, 0x93, 0xb5, 0xe1\ndb 0x89, 0xfd, 0x4c, 0x6f, 0xce, 0x0c, 0xde, 0xe7, 0xc7, 0xa4, 0x13, 0x41, 0xe4, 0x46, 0xf8, 0x68\ndb 0xc4, 0xce, 0x09, 0xd3, 0x28, 0xd9, 0xaf, 0x5e, 0x5b, 0x2f, 0xe6, 0xcb, 0xd1, 0xcc, 0x5d, 0x3c\ndb 0x4b, 0x01, 0x94, 0x0d, 0xbb, 0x7d, 0x64, 0x80, 0xcd, 0x8f, 0xea, 0xc5, 0x41, 0x7b, 0xc5, 0x40\ndb 0x92, 0xd0, 0xcb, 0xad, 0x66, 0x2c, 0x21, 0x2d, 0x95, 0xb7, 0x14, 0x4f, 0x21, 0xf4, 0xaa, 0xfe\ndb 0x60, 0xd4, 0x1f, 0x32, 0x37, 0xcc, 0xc5, 0x38, 0x85, 0x77, 0x29, 0xfd, 0x1c, 0x10, 0x9d, 0x84\ndb 0x19, 0xe4, 0xed, 0x64, 0xdc, 0xd5, 0xd4, 0x8f, 0x30, 0xf4, 0xbe, 0xc6, 0xfc, 0xfe, 0x60, 0x5c\ndb 0xba, 0x6a, 0x5f, 0x18, 0x4a, 0xa0, 0xec, 0xa8, 0xec, 0x80, 0xe2, 0x76, 0x1b, 0x61, 0x96, 0xfb\ndb 0xef, 0x62, 0xe3, 0x60, 0xf5, 0x87, 0xdb, 0x4d, 0x8f, 0x4e, 0xd2, 0xf9, 0x0b, 0x81, 0x03, 0x8b\ndb 0x56, 0xdc, 0x02, 0xe5, 0x7b, 0xa7, 0xba, 0x8a, 0xac, 0x6c, 0xd3, 0xd0, 0x49, 0xea, 0xc0, 0xdb\ndb 0x23, 0xba, 0xa6, 0x9f, 0x9c, 0x10, 0x8c, 0x82, 0x07, 0x12, 0x14, 0xf1, 0x6b, 0x8d, 0xe5, 0x71\ndb 0x9e, 0x58, 0x95, 0xa3, 0x1e, 0xe8, 0x34, 0x9a, 0x7d, 0x7a, 0xf4, 0x10, 0xd5, 0xb2, 0x23, 0xbe\ndb 0x28, 0x60, 0x07, 0xd0, 0xce, 0x65, 0x3a, 0x79, 0x66, 0x40, 0xc8, 0xb2, 0xb9, 0x0b, 0x16, 0x63\ndb 0x43, 0x02, 0x64, 0x27, 0xda, 0x87, 0x4f, 0xbe, 0x45, 0xe4, 0xf5, 0x51, 0xfa, 0xc6, 0x59, 0x9d\ndb 0x11, 0xfd, 0x72, 0xf1, 0x3f, 0x86, 0x91, 0x8f, 0xbe, 0x6a, 0x9a, 0x2b, 0x09, 0xe4, 0x67, 0xec\ndb 0x29, 0x43, 0x2c, 0xac, 0x34, 0xe2, 0xdc, 0x90, 0x11, 0x80, 0x13, 0x1c, 0xeb, 0x7b, 0xd6, 0xd9\ndb 0x7a, 0xd2, 0x57, 0xdf, 0xf2, 0x95, 0x47, 0x21, 0xb2, 0xd7, 0x48, 0x89, 0x9c, 0x91, 0xe6, 0x8d\ndb 0xd5, 0xd6, 0xc0, 0xf1, 0x65, 0xad, 0x40, 0x09, 0x9b, 0x3b, 0xc8, 0x5d, 0xe0, 0xd7, 0x23, 0x5c\ndb 0xbf, 0x13, 0x84, 0xe4, 0x91, 0xa7, 0xd6, 0x14, 0x96, 0x58, 0xa1, 0x9d, 0xef, 0xcf, 0xf6, 0x03\ndb 0x5b, 0x38, 0x9d, 0x45, 0xb1, 0x93, 0x86, 0x11, 0x67, 0x82, 0xb3, 0x26, 0x21, 0xb0, 0xb7, 0xc1\ndb 0x85, 0x63, 0xe5, 0x4a, 0x40, 0x3f, 0x93, 0x8e, 0xe5, 0xb5, 0x62, 0xf7, 0x33, 0x10, 0xb9, 0x4e\ndb 0x65, 0x05, 0x88, 0x4f, 0x95, 0x7d, 0x45, 0xdc, 0x8c, 0xc5, 0x3f, 0x6a, 0xf4, 0x01, 0x46, 0x68\ndb 0x0d, 0xd4, 0x89, 0x9e, 0xc1, 0xf5, 0x81, 0x06, 0x7a, 0x55, 0x7b, 0x52, 0xdd, 0x1f, 0x67, 0xf6\ndb 0x36, 0xed, 0xf1, 0xc5, 0xde, 0x3a, 0xb4, 0x66, 0x9a, 0x15, 0x9f, 0xa1, 0xf5, 0x8a, 0xc0, 0x44\ndb 0xe1, 0xc2, 0x0a, 0x6b, 0x17, 0xe2, 0xf8, 0x1b, 0x2c, 0x57, 0x30, 0xf1, 0xc0, 0xdd, 0xad, 0x98\ndb 0x7c, 0x99, 0x25, 0x50, 0x99, 0x43, 0xc7, 0xec, 0x55, 0xac, 0x05, 0xa4, 0x5d, 0xb9, 0x91, 0x96\ndb 0x43, 0x9b, 0x6b, 0x03, 0xb5, 0x09, 0xf8, 0xaa, 0xf7, 0x7f, 0xc7, 0xec, 0x9c, 0xfd, 0x6a, 0xdf\ndb 0x30, 0xd1, 0x38, 0xf1, 0x5b, 0x6b, 0xd0, 0x19, 0x8e, 0xba, 0x49, 0x74, 0xd3, 0x10, 0x87, 0x6c\ndb 0x9c, 0x9f, 0xfd, 0x46, 0xab, 0x84, 0x96, 0x12, 0x5c, 0xa1, 0xc2, 0x1a, 0x33, 0xc0, 0x23, 0xbd\ndb 0x01, 0xdf, 0xd4, 0x85, 0x69, 0x62, 0xbc, 0x3f, 0x2c, 0xe5, 0xfc, 0x66, 0x14, 0x13, 0xd2, 0xd5\ndb 0x12, 0x96, 0xdc, 0x3b, 0x14, 0x79, 0x96, 0x9f, 0x07, 0x5a, 0xc1, 0x65, 0xe1, 0xc8, 0x57, 0x7d\ndb 0x35, 0xa2, 0xcc, 0xaa, 0x94, 0xda, 0xb0, 0x4d, 0xe2, 0x5e, 0x4c, 0x39, 0x0d, 0x8e, 0xb6, 0x2f\ndb 0xe6, 0xcd, 0x58, 0xb2, 0x86, 0xf4, 0x1f, 0xf6, 0xb0, 0xd8, 0xf4, 0x42, 0x31, 0x4b, 0x6a, 0x5e\ndb 0x2d, 0x2f, 0xdb, 0x9c, 0xc5, 0x5a, 0x45, 0xd1, 0x17, 0x1a, 0xc7, 0xc5, 0xa0, 0x51, 0xbc, 0xe6\ndb 0xa9, 0xab, 0xc6, 0x3b, 0x3b, 0xf6, 0xce, 0xb5, 0x3b, 0xdc, 0x95, 0x10, 0x20, 0x1d, 0x1e, 0x64\ndb 0xa7, 0xe4, 0x1e, 0x86, 0x7a, 0xb1, 0x90, 0x12, 0x1d, 0x21, 0x43, 0x87, 0xbf, 0x19, 0x22, 0x02\ndb 0x3a, 0xbf, 0xa6, 0x0d, 0x91, 0x2f, 0x66, 0xc9, 0xd5, 0x87, 0xfc, 0xe7, 0xb6, 0x56, 0xf8, 0xc3\ndb 0x9e, 0x5e, 0x2f, 0xfd, 0xae, 0x3f, 0x01, 0x3b, 0x98, 0x7d, 0x6a, 0x3c, 0xd8, 0xb1, 0xf2, 0xec\ndb 0xa6, 0x54, 0x2a, 0xac, 0xc5, 0xdd, 0x4c, 0x8b, 0x4f, 0x7a, 0x95, 0x00, 0xe0, 0x9a, 0x35, 0x10\ndb 0xa8, 0xf5, 0xc7, 0xf6, 0x2c, 0xf2, 0x16, 0x2e, 0xa8, 0xb6, 0xad, 0x01, 0xba, 0x14, 0x63, 0xdd\ndb 0x5c, 0x02, 0xd8, 0xb3, 0x3d, 0x2c, 0x5b, 0x51, 0xd2, 0xb3, 0x20, 0x14, 0xbd, 0x6e, 0xee, 0x23\ndb 0x33, 0xd8, 0xd1, 0x8f, 0x02, 0x5b, 0xf4, 0xd0, 0x03, 0x55, 0x81, 0x50, 0x71, 0x47, 0xaa, 0x55\ndb 0x9c, 0x02, 0xb4, 0x07, 0x76, 0xb9, 0x3e, 0x6b, 0x59, 0x7c, 0xee, 0x46, 0xb4, 0x17, 0xe5, 0x01\ndb 0xf3, 0x0a, 0xdc, 0x74, 0xbd, 0x65, 0xee, 0x37, 0x10, 0x58, 0xbf, 0xa4, 0xd2, 0x7e, 0xb5, 0x6c\ndb 0x1e, 0xcd, 0xb8, 0x02, 0x65, 0x27, 0x72, 0x05, 0xe0, 0x40, 0x29, 0x61, 0xfc, 0x46, 0x13, 0x81\ndb 0x1d, 0xdf, 0x9a, 0x47, 0x20, 0x2a, 0x52, 0x1e, 0x30, 0x77, 0x74, 0x45, 0x30, 0x63, 0xb4, 0xb9\ndb 0x14, 0xb0, 0x2c, 0x0f, 0xea, 0x93, 0xda, 0xe1, 0xd7, 0xda, 0xf4, 0xb6, 0x71, 0x91, 0x53, 0x36\ndb 0xef, 0x57, 0xf7, 0xbc, 0xa4, 0x39, 0x3f, 0x42, 0x79, 0xb5, 0xb1, 0xc4, 0x53, 0x2c, 0xfc, 0xe1\ndb 0xe6, 0x47, 0xcb, 0x5d, 0x32, 0xb8, 0xc9, 0x62, 0x0b, 0x5e, 0xb8, 0xe5, 0x35, 0xf8, 0xd5, 0x45\ndb 0xa6, 0x80, 0x18, 0x59, 0x16, 0x32, 0x04, 0xe2, 0xe6, 0x0c, 0x4b, 0xbf, 0x38, 0x6a, 0x6d, 0xd8\ndb 0x96, 0x2c, 0xab, 0xc4, 0xc5, 0xc3, 0x65, 0x22, 0x76, 0x4f, 0x8c, 0xf0, 0x47, 0x90, 0x99, 0xb0\ndb 0xfc, 0xaa, 0xd0, 0x07, 0x39, 0x38, 0xd8, 0xd5, 0x53, 0x28, 0xf8, 0xac, 0xf5, 0x64, 0x1a, 0x46\ndb 0xd3, 0xff, 0x76, 0xb4, 0xcb, 0x56, 0xd5, 0xac, 0x05, 0x48, 0xc5, 0xbb, 0xe8, 0x2c, 0x6d, 0xd6\ndb 0x29, 0xf2, 0xe0, 0x01, 0x8c, 0xa3, 0x70, 0x5c, 0x76, 0x52, 0x16, 0x6a, 0x2f, 0x5a, 0x1c, 0x43\ndb 0x62, 0x1a, 0x17, 0xd7, 0x29, 0x8f, 0x99, 0xb7, 0xf9, 0xe3, 0x69, 0xe6, 0x61, 0x6a, 0x01, 0xa3\ndb 0xf2, 0xbe, 0xca, 0xb3, 0xfe, 0x53, 0x03, 0xd1, 0xdf, 0x4c, 0xd6, 0xa3, 0xcf, 0x59, 0xf5, 0xab\ndb 0xa1, 0x3d, 0x14, 0x84, 0x0e, 0xe2, 0x2b, 0x9a, 0x90, 0x48, 0xb3, 0x30, 0x6a, 0xaa, 0x8c, 0xe7\ndb 0x36, 0x58, 0xc3, 0x81, 0xf7, 0x3e, 0x27, 0x4b, 0x83, 0xd8, 0x5a, 0x6e, 0x49, 0x14, 0x12, 0x41\ndb 0xd3, 0x43, 0xa7, 0xa7, 0x0b, 0x38, 0x3b, 0x14, 0xf5, 0xe5, 0xd9, 0x27, 0x57, 0x34, 0x13, 0xcf\ndb 0xc1, 0x7f, 0xa5, 0x81, 0x29, 0xb0, 0x5f, 0x03, 0x87, 0x74, 0x1a, 0xad, 0x5a, 0xbc, 0xdf, 0xfb\ndb 0xac, 0x85, 0xdb, 0x62, 0x3b, 0x52, 0x61, 0xef, 0xb1, 0x71, 0xeb, 0x10, 0x8e, 0x54, 0xf1, 0xe1\ndb 0x66, 0xe7, 0x90, 0xd3, 0x88, 0xc1, 0x78, 0x2c, 0x11, 0xbb, 0xe7, 0xd0, 0x33, 0x45, 0xdb, 0x57\ndb 0x34, 0x26, 0xbf, 0x9b, 0x44, 0x95, 0x90, 0xe2, 0xca, 0x6b, 0x0f, 0xc2, 0xa9, 0x0a, 0x93, 0x6c\ndb 0x29, 0x65, 0xa1, 0x1e, 0xb4, 0x2b, 0xf3, 0xe7, 0x00, 0x9e, 0x47, 0xd7, 0x6a, 0x61, 0x5a, 0x68\ndb 0xe0, 0x45, 0x5d, 0xf6, 0x2f, 0x6f, 0x94, 0x2a, 0xfa, 0x35, 0x74, 0xcc, 0x39, 0x6a, 0x2b, 0xa7\ndb 0x33, 0xfd, 0xe5, 0xc1, 0x83, 0xbc, 0x2e, 0xa1, 0xa1, 0xc3, 0x44, 0xaa, 0x72, 0x07, 0x8c, 0xa2\ndb 0x90, 0xdc, 0x96, 0xde, 0xfc, 0x79, 0xb2, 0x3d, 0x70, 0xdd, 0xbe, 0xd8, 0x43, 0x86, 0xd0, 0xee\ndb 0x12, 0x2f, 0x60, 0xa1, 0xa8, 0x88, 0x0e, 0xdb, 0x21, 0xca, 0x6c, 0xab, 0xd0, 0xc6, 0xa2, 0x77\ndb 0xb2, 0x97, 0x37, 0x62, 0x32, 0xf5, 0x70, 0x47, 0x1d, 0x22, 0x08, 0x23, 0x9c, 0x4d, 0xd0, 0x7b\ndb 0x65, 0x46, 0x3d, 0x1d, 0x35, 0xef, 0xf7, 0xb3, 0x13, 0x54, 0xb8, 0xf4, 0x37, 0x26, 0x77, 0x84\ndb 0x9c, 0xa2, 0x7e, 0x26, 0x2a, 0x0e, 0xbd, 0x39, 0x9f, 0x0f, 0x3b, 0xcb, 0xdf, 0x5a, 0xa8, 0xc0\ndb 0x50, 0xff, 0x91, 0xd1, 0x81, 0xe0, 0xee, 0x83, 0x07, 0x32, 0x5d, 0xab, 0x31, 0x4c, 0xfe, 0x21\ndb 0x5f, 0x3b, 0xaa, 0x46, 0xdd, 0xf2, 0x9f, 0x5a, 0x57, 0x34, 0x54, 0x86, 0x3e, 0x1e, 0xda, 0xbe\ndb 0x78, 0xcb, 0x08, 0xda, 0xc9, 0x76, 0x28, 0x1f, 0xfe, 0x6f, 0x05, 0xd5, 0x7d, 0x4e, 0xbb, 0xf6\ndb 0x2d, 0x11, 0x2f, 0x9d, 0x4c, 0x05, 0xe6, 0xc5, 0xdc, 0xcd, 0x95, 0x7d, 0x31, 0xc5, 0xb9, 0x0e\ndb 0xdf, 0x83, 0x30, 0x8b, 0xba, 0xfd, 0xf5, 0xaa, 0x5c, 0xe0, 0x3e, 0xa6, 0xdd, 0x51, 0xf2, 0xb2\ndb 0xcb, 0x3e, 0x67, 0x8d, 0x59, 0x62, 0x6d, 0x58, 0x92, 0xbe, 0x95, 0xb7, 0x9f, 0x0c, 0x49, 0x3f\ndb 0xaf, 0x3c, 0x45, 0x76, 0xf6, 0xeb, 0x9b, 0x42, 0x01, 0x2e, 0xd4, 0x8a, 0x9f, 0x92, 0xca, 0xdb\ndb 0xd3, 0x55, 0x5e, 0x92, 0x01, 0x85, 0x63, 0xa2, 0x61, 0x62, 0x30, 0x64, 0xa2, 0xb2, 0x9e, 0x11\ndb 0xb9, 0xb1, 0x4d, 0x4b, 0x90, 0x1c, 0xea, 0xd2, 0xd1, 0x3d, 0x11, 0xe1, 0xe1, 0x66, 0xb9, 0x2f\ndb 0x5f, 0x3c, 0x0a, 0x9a, 0xba, 0x6b, 0x0f, 0x47, 0x54, 0x5d, 0xfc, 0x11, 0x2f, 0x42, 0xdf, 0x7f\ndb 0x22, 0x60, 0x18, 0x75, 0x05, 0x1d, 0x25, 0x23, 0x75, 0x8d, 0x77, 0x89, 0x03, 0xb7, 0x74, 0x1a\ndb 0xff, 0xaa, 0x2b, 0xb0, 0x5d, 0x9a, 0xa6, 0x3f, 0xd0, 0x6b, 0xe6, 0x28, 0xae, 0xf9, 0xe6, 0x5a\ndb 0xbb, 0x3d, 0x0a, 0x94, 0x5f, 0x9b, 0x96, 0x3b, 0xfb, 0x38, 0x8f, 0x93, 0x6f, 0xf2, 0x1e, 0x5c\ndb 0xc5, 0x8b, 0x44, 0xf7, 0x26, 0xc6, 0x3e, 0xf6, 0x60, 0xbf, 0x54, 0xb4, 0x21, 0xfb, 0xae, 0x80\ndb 0xdb, 0x1a, 0xd7, 0xa1, 0xb9, 0x1b, 0xc7, 0x8d, 0xb4, 0x11, 0x3e, 0x2b, 0x19, 0xb3, 0xfb, 0xb0\ndb 0xb3, 0xe0, 0xc7, 0x35, 0x34, 0x80, 0xf0, 0xee, 0xf5, 0x46, 0x66, 0x93, 0x36, 0xd7, 0x0f, 0x44\ndb 0xb3, 0xe0, 0x15, 0x6a, 0xc7, 0xb1, 0x1e, 0xc4, 0x68, 0x73, 0xe5, 0x43, 0x2e, 0xa6, 0x26, 0xdf\ndb 0xe3, 0x35, 0x8f, 0xa5, 0x96, 0x52, 0xb8, 0x38, 0xfc, 0x01, 0x76, 0x92, 0xb7, 0x89, 0x09, 0x0a\ndb 0x88, 0x89, 0x20, 0x7f, 0x0f, 0x84, 0xb6, 0x44, 0x22, 0xa8, 0x27, 0xbf, 0x97, 0x65, 0x3e, 0xa9\ndb 0x92, 0x64, 0x42, 0xfb, 0xa8, 0xd7, 0xf3, 0x26, 0x28, 0x2c, 0xb6, 0x59, 0x66, 0x80, 0xe7, 0x49\ndb 0x1c, 0x12, 0x4e, 0x46, 0xfe, 0xf6, 0x3f, 0xdb, 0x79, 0x30, 0x6a, 0x99, 0xf3, 0x8a, 0x9e, 0x26\ndb 0x4f, 0x62, 0x65, 0xde, 0x9b, 0xb9, 0x03, 0x1c, 0x1e, 0xcf, 0x5c, 0x14, 0x63, 0x3e, 0xa4, 0x18\ndb 0x99, 0x79, 0x38, 0xbc, 0x96, 0x78, 0xd9, 0xd1, 0x51, 0x0e, 0xe5, 0xb0, 0x6e, 0xaf, 0xa2, 0xd0\ndb 0x60, 0x4e, 0x71, 0xc9, 0xeb, 0x8a, 0x86, 0xb6, 0x8a, 0x71, 0x66, 0x54, 0x99, 0xd1, 0x52, 0x48\ndb 0x53, 0x0a, 0x0a, 0xce, 0x84, 0x7a, 0xb8, 0xff, 0x5b, 0x44, 0x4c, 0x21, 0x7a, 0x47, 0xe3, 0xc9\ndb 0xb5, 0x0d, 0xdb, 0xe7, 0x1b, 0x7a, 0xf9, 0xde, 0x22, 0xb4, 0xf1, 0x64, 0x64, 0x55, 0x79, 0x3b\ndb 0x84, 0xc1, 0xdb, 0xd9, 0x1a, 0x57, 0x4f, 0x6d, 0x37, 0x4c, 0xe5, 0x36, 0x63, 0xff, 0x0c, 0x2b\ndb 0x11, 0xa1, 0x12, 0x46, 0x2f, 0x11, 0x70, 0x63, 0x7a, 0x5b, 0x5d, 0xd0, 0x55, 0x40, 0xab, 0xf8\ndb 0xd5, 0x99, 0xfe, 0x79, 0xfa, 0x4e, 0x35, 0xe2, 0xd7, 0x0f, 0x4d, 0x0e, 0xf9, 0xc1, 0x40, 0x63\ndb 0x19, 0x5e, 0xb9, 0x2f, 0x65, 0x4d, 0xee, 0x02, 0x1b, 0xcf, 0x5f, 0x2a, 0xb8, 0x5e, 0x2b, 0xdb\ndb 0x2e, 0x18, 0xaf, 0xc4, 0x49, 0xee, 0xef, 0x36, 0x42, 0xe8, 0xbc, 0x21, 0x0b, 0x07, 0xdb, 0x70\ndb 0x0e, 0xc2, 0xfa, 0x6e, 0x39, 0x2c, 0xf6, 0xbc, 0xde, 0x87, 0x69, 0x92, 0x45, 0x80, 0x35, 0x14\ndb 0xba, 0xb2, 0x08, 0x69, 0x26, 0xec, 0x78, 0x17, 0x1c, 0x57, 0x86, 0x8c, 0xe3, 0x58, 0x85, 0x09\ndb 0x26, 0xb5, 0xd6, 0x8c, 0x9d, 0x61, 0x04, 0x87, 0x00, 0x1b, 0x32, 0x81, 0x46, 0xa8, 0x43, 0x98\ndb 0xdd, 0x36, 0xa0, 0xff, 0x9f, 0x13, 0x1b, 0x9e, 0x7a, 0x20, 0x4f, 0xa8, 0x0e, 0xd3, 0xdb, 0x31\ndb 0x1d, 0x07, 0x6a, 0x7e, 0x10, 0xc1, 0x59, 0x0b, 0x96, 0xf7, 0x98, 0x0c, 0x8f, 0xb7, 0x87, 0x10\ndb 0x91, 0xe7, 0xf0, 0xa3, 0x98, 0x28, 0xce, 0xfd, 0x52, 0xa5, 0xdd, 0xe2, 0xf7, 0xbe, 0x7a, 0x73\ndb 0xeb, 0x9a, 0xac, 0x7f, 0x53, 0xe9, 0x89, 0xb9, 0x96, 0xba, 0x32, 0x4b, 0x2d, 0xe2, 0x13, 0x00\ndb 0xed, 0xac, 0x6d, 0x97, 0x62, 0xa0, 0x9b, 0x3a, 0x36, 0x8f, 0x54, 0xf6, 0x0d, 0x46, 0x10, 0xca\ndb 0x12, 0xb9, 0x81, 0x21, 0x47, 0xf5, 0x20, 0x41, 0xf1, 0x29, 0x91, 0x59, 0xe8, 0x3a, 0x76, 0xb2\ndb 0xf2, 0x3c, 0xad, 0xba, 0x76, 0xa3, 0x93, 0x84, 0x8c, 0xdb, 0x5f, 0xe0, 0x45, 0x25, 0xcc, 0xc8\ndb 0x4f, 0x6a, 0x46, 0xa0, 0x1e, 0xa7, 0xd4, 0x88, 0xa5, 0xed, 0x50, 0xde, 0x01, 0xe1, 0xde, 0xe0\ndb 0x00, 0xa9, 0x07, 0x02, 0x2e, 0xcf, 0xb6, 0x1a, 0x31, 0x43, 0x40, 0xc2, 0x35, 0x17, 0x66, 0x4d\ndb 0x95, 0xaf, 0x26, 0x9b, 0x18, 0x19, 0xa9, 0x30, 0xb6, 0x7b, 0xb0, 0xb1, 0x26, 0x29, 0x47, 0x45\ndb 0xd5, 0x2a, 0xa1, 0xac, 0x82, 0x50, 0x74, 0x44, 0x8c, 0x9e, 0xc3, 0x1f, 0x19, 0x26, 0xc5, 0x67\ndb 0x69, 0xe2, 0x0e, 0xfd, 0x9e, 0xa2, 0x4f, 0x50, 0xed, 0x9f, 0x94, 0x89, 0x9a, 0x73, 0x54, 0xec\ndb 0x77, 0x22, 0x53, 0xa2, 0xce, 0xa4, 0xf4, 0x6e, 0x7c, 0x6e, 0xda, 0xeb, 0xaf, 0x6f, 0xc9, 0x11\ndb 0xa9, 0x7d, 0x2a, 0xbb, 0x00, 0x22, 0x99, 0x10, 0xf7, 0x67, 0x4f, 0x2f, 0x2f, 0xfc, 0x79, 0xb6\ndb 0x83, 0x78, 0x19, 0xe3, 0x44, 0xdb, 0x66, 0xbf, 0xe8, 0xab, 0x32, 0xa5, 0x57, 0x85, 0x8c, 0xae\ndb 0xae, 0x9d, 0x8b, 0xbb, 0x6e, 0xde, 0xab, 0x6c, 0x64, 0xac, 0xca, 0xd0, 0x4b, 0x1c, 0x1c, 0x30\ndb 0x9e, 0x88, 0x60, 0x75, 0x0c, 0x42, 0x84, 0x41, 0x76, 0xcd, 0x82, 0xef, 0x80, 0x79, 0x0f, 0xeb\ndb 0xa3, 0xb8, 0xad, 0x1d, 0x45, 0x4b, 0x0e, 0xd9, 0x07, 0x48, 0x7d, 0x82, 0xd8, 0xf7, 0xcc, 0x2f\ndb 0x7a, 0x0e, 0xb1, 0x82, 0x95, 0x6e, 0x74, 0x78, 0xe8, 0x0c, 0xb5, 0x12, 0x26, 0x72, 0x55, 0x8b\ndb 0x0e, 0x29, 0x86, 0xd3, 0xce, 0x88, 0xa6, 0x29, 0xe7, 0x18, 0x9b, 0xbc, 0x13, 0x90, 0x89, 0xf6\ndb 0xa5, 0x20, 0x70, 0x3b, 0xbd, 0x25, 0x9c, 0x47, 0xb8, 0x9a, 0xd7, 0x72, 0xb5, 0x55, 0xe5, 0x92\ndb 0x98, 0x89, 0x0f, 0x12, 0xe1, 0xe1, 0x0c, 0x2c, 0x7c, 0xca, 0x27, 0x6e, 0x9b, 0x13, 0x9d, 0xc0\ndb 0x51, 0xa5, 0x10, 0x31, 0xda, 0xe5, 0x40, 0x7c, 0x3a, 0x67, 0x14, 0xa5, 0x92, 0x99, 0xa0, 0xf2\ndb 0xa6, 0xba, 0x61, 0xa9, 0x28, 0x2d, 0x10, 0xa8, 0x23, 0x09, 0x26, 0x18, 0x13, 0x6a, 0x87, 0x40\ndb 0x0b, 0x6c, 0xd3, 0x62, 0x55, 0xdd, 0xa4, 0x7e, 0x2a, 0x70, 0x22, 0xa0, 0x3c, 0x51, 0xcb, 0x98\ndb 0x26, 0xcf, 0xad, 0xf8, 0xc3, 0x9e, 0xb1, 0x7a, 0xc0, 0xd5, 0xd4, 0xaf, 0xea, 0x8a, 0xfb, 0x03\ndb 0x1f, 0xae, 0x8c, 0x9b, 0xa3, 0xd2, 0x20, 0xe2, 0xdf, 0xb3, 0xea, 0x97, 0xe9, 0xce, 0x3a, 0xa1\ndb 0xed, 0xa3, 0x97, 0xd5, 0xe2, 0xa6, 0x47, 0x9d, 0x50, 0x9e, 0xac, 0xdf, 0xd1, 0xbe, 0x32, 0x7b\ndb 0xd6, 0xaf, 0xe3, 0x9f, 0x4d, 0xbc, 0x58, 0x30, 0x33, 0xd8, 0xcd, 0xd8, 0x5b, 0xfa, 0x5c, 0xdd\ndb 0x5f, 0x0e, 0x79, 0x1f, 0x1d, 0x0b, 0xd9, 0x9c, 0xb8, 0x78, 0x27, 0x89, 0x39, 0x48, 0xf9, 0x45\ndb 0xe4, 0xa5, 0x8a, 0x2f, 0xc5, 0xf8, 0xe5, 0xef, 0xef, 0x89, 0x9d, 0x24, 0x2a, 0xf4, 0x7e, 0x60\ndb 0x38, 0xe1, 0x25, 0x67, 0x87, 0x68, 0x8b, 0x25, 0xfe, 0xb2, 0x20, 0x02, 0x14, 0x04, 0xb6, 0xba\ndb 0xf7, 0x9c, 0xe8, 0x01, 0x07, 0x8e, 0x0f, 0x21, 0x4c, 0xaf, 0x81, 0xcd, 0x17, 0xb2, 0xae, 0x6c\ndb 0xbb, 0xfb, 0xb9, 0x8f, 0x8b, 0xc8, 0x07, 0x36, 0x26, 0x0c, 0x40, 0x6f, 0xa9, 0x1e, 0x69, 0x2a\ndb 0x5a, 0xde, 0x40, 0xb4, 0x00, 0xfa, 0x0f, 0x2e, 0xd9, 0xc4, 0xc9, 0xc7, 0x72, 0xbb, 0xed, 0x26\ndb 0x0a, 0xf4, 0x81, 0xf7, 0xc6, 0xc6, 0x69, 0xd7, 0xd0, 0x63, 0x97, 0xed, 0x70, 0x2a, 0xa3, 0x30\ndb 0x48, 0x69, 0x0a, 0xf3, 0xae, 0x0f, 0x92, 0x08, 0x2a, 0xce, 0x55, 0x4e, 0xf2, 0x4b, 0x3e, 0xc8\ndb 0x98, 0x15, 0x0a, 0x94, 0x21, 0xe9, 0xff, 0xca, 0x45, 0x82, 0x49, 0x08, 0x47, 0xaa, 0x0a, 0xc2\ndb 0x75, 0x6a, 0xca, 0x28, 0xa1, 0x0a, 0x5a, 0x24, 0xb3, 0xb3, 0x3c, 0xd9, 0xd6, 0xb2, 0x30, 0x75\ndb 0xc4, 0x6e, 0x85, 0x58, 0x92, 0x44, 0x0c, 0x80, 0xd9, 0x17, 0x94, 0xcb, 0x22, 0x4a, 0xd9, 0x34\ndb 0xe4, 0x15, 0x0b, 0xf1, 0xbb, 0x33, 0x8c, 0x77, 0x04, 0x0e, 0x90, 0x48, 0x37, 0x76, 0x79, 0x2c\ndb 0x92, 0xcd, 0xba, 0xa4, 0x74, 0x42, 0x9f, 0x09, 0x7d, 0xa8, 0xc2, 0xd4, 0x36, 0xe3, 0xf3, 0x14\ndb 0x30, 0xcf, 0xef, 0x5c, 0x41, 0x12, 0x4d, 0xb2, 0x4d, 0xa5, 0xad, 0xf7, 0xe8, 0xba, 0xf9, 0xb6\ndb 0xd3, 0x03, 0xe3, 0xb5, 0x11, 0x45, 0x43, 0x64, 0x31, 0xff, 0x32, 0xc3, 0xe0, 0xe4, 0x17, 0xe2\ndb 0xf3, 0xaf, 0x90, 0xce, 0x12, 0xe9, 0x33, 0x90, 0x80, 0xc8, 0x5d, 0x3e, 0x5c, 0xc0, 0x33, 0x7f\ndb 0x04, 0x3a, 0x2e, 0xaf, 0x76, 0x70, 0x76, 0x0e, 0x41, 0x81, 0xf2, 0xde, 0x48, 0xc8, 0x65, 0x45\ndb 0xbe, 0x02, 0x12, 0xa9, 0x0c, 0xf9, 0x5e, 0xfc, 0xfe, 0xaa, 0xc1, 0x1a, 0x22, 0x76, 0x19, 0xd5\ndb 0x76, 0xf4, 0xe6, 0xdd, 0xb3, 0xa1, 0xc9, 0x64, 0x5b, 0x80, 0xd2, 0x54, 0x2c, 0xf6, 0x1b, 0xa7\ndb 0x2e, 0xa1, 0x7b, 0xdb, 0x6f, 0xea, 0xd7, 0x8e, 0x13, 0x27, 0x1a, 0xbd, 0x4a, 0x09, 0x47, 0xf3\ndb 0xa0, 0x56, 0x13, 0x95, 0x83, 0x12, 0xe8, 0x9a, 0x7c, 0xf2, 0x84, 0xbb, 0x09, 0xed, 0x91, 0x06\ndb 0xbc, 0x38, 0xf6, 0xfd, 0xda, 0xbd, 0x93, 0xff, 0xe3, 0x8d, 0xb2, 0x0f, 0xe9, 0x2c, 0x9d, 0x51\ndb 0xba, 0x08, 0xdc, 0x01, 0x9a, 0x15, 0x34, 0x7e, 0x1f, 0x3a, 0x79, 0xcc, 0x89, 0xfe, 0x9a, 0x73\ndb 0xd1, 0x45, 0x1d, 0x72, 0xf8, 0xd9, 0x88, 0x6d, 0x3c, 0xf6, 0xb8, 0x09, 0xdf, 0x4f, 0x6e, 0x63\ndb 0x5d, 0x4d, 0xa9, 0x22, 0xcf, 0x8a, 0x66, 0xb0, 0xb1, 0x82, 0x69, 0x83, 0xd6, 0x1b, 0x4a, 0x69\ndb 0xad, 0x1b, 0x31, 0x18, 0x1a, 0xc8, 0x7e, 0x90, 0x55, 0x37, 0x69, 0x59, 0x1c, 0x72, 0xe3, 0x91\ndb 0x41, 0x32, 0xcc, 0xad, 0xf0, 0xa7, 0x2c, 0xfc, 0xed, 0x0f, 0x68, 0x7c, 0x3a, 0x41, 0x8f, 0x82\ndb 0xb6, 0xe4, 0x7f, 0xe9, 0xb5, 0xcf, 0x19, 0xbf, 0xae, 0xce, 0x1c, 0x87, 0xd3, 0x76, 0x31, 0xf7\ndb 0xc5, 0x29, 0x0d, 0x75, 0x34, 0x36, 0xdc, 0x4a, 0x4d, 0x7f, 0x0e, 0xce, 0x50, 0x95, 0x62, 0x80\ndb 0xc6, 0x19, 0xd9, 0x2f, 0xa3, 0x0b, 0x16, 0xe8, 0xf6, 0xa3, 0x30, 0xbf, 0xdb, 0x41, 0x04, 0x05\ndb 0xb7, 0x10, 0x3d, 0xef, 0x15, 0x78, 0x82, 0xe1, 0xfa, 0x46, 0xe2, 0xd7, 0xb2, 0x4d, 0x0d, 0x9c\ndb 0x3a, 0x1e, 0xda, 0x32, 0xb2, 0x5d, 0x1a, 0x31, 0x84, 0x13, 0x74, 0xb7, 0x5b, 0x4b, 0xdf, 0x83\ndb 0xd9, 0x91, 0x53, 0xc1, 0xad, 0xa1, 0x19, 0x13, 0xb0, 0x3f, 0x97, 0xd6, 0x1b, 0xed, 0x5e, 0x29\ndb 0x87, 0xf8, 0xf4, 0x1f, 0xd6, 0x99, 0x9b, 0x14, 0xf6, 0xe9, 0x9a, 0x96, 0x19, 0x9d, 0xa0, 0xa2\ndb 0x63, 0xe1, 0x10, 0x2d, 0xa3, 0xdc, 0x65, 0x0a, 0x52, 0x40, 0x61, 0x8f, 0xd5, 0x45, 0x5c, 0x37\ndb 0x7e, 0xf6, 0x11, 0xb6, 0xd6, 0xf0, 0x92, 0x35, 0xb9, 0x2e, 0xa0, 0x36, 0x3c, 0x63, 0x88, 0x77\ndb 0xba, 0xb6, 0xc5, 0x8f, 0xef, 0x77, 0x2d, 0xc7, 0x06, 0xae, 0xf4, 0xd2, 0xd3, 0xa3, 0xce, 0x0d\ndb 0xce, 0x37, 0x5c, 0x3d, 0x10, 0x13, 0xf4, 0x2b, 0x94, 0x23, 0x54, 0x93, 0xe7, 0xd4, 0x07, 0x6c\ndb 0x81, 0x5e, 0xb6, 0xdd, 0x96, 0x3d, 0x47, 0x7a, 0xe8, 0xe5, 0xa8, 0x67, 0xed, 0x09, 0x1a, 0xcc\ndb 0xcb, 0x68, 0xad, 0xa7, 0x9e, 0xff, 0x69, 0x54, 0x5d, 0x17, 0x67, 0x50, 0x7c, 0x8f, 0x86, 0xbe\ndb 0xc5, 0x45, 0x09, 0x63, 0xc0, 0x3b, 0x3d, 0xcd, 0xb5, 0x66, 0x75, 0x45, 0x18, 0x1b, 0x83, 0xb2\ndb 0xb5, 0x70, 0x2c, 0xef, 0x09, 0x9d, 0x47, 0x7a, 0xb9, 0xe7, 0xd5, 0x04, 0x10, 0x96, 0x0b, 0x6b\ndb 0xd1, 0x71, 0xcc, 0x8d, 0x73, 0x90, 0x36, 0x92, 0x1f, 0x5b, 0x6b, 0xdf, 0x2d, 0x2c, 0x98, 0xd7\ndb 0x5d, 0x55, 0xfd, 0x4e, 0xad, 0x9b, 0x0b, 0xba, 0x0b, 0x68, 0xc4, 0xe0, 0xe8, 0x66, 0xe7, 0x91\ndb 0xcf, 0x0d, 0xe3, 0xc8, 0x1e, 0xde, 0x82, 0xff, 0x02, 0x43, 0xf4, 0xd3, 0x25, 0x53, 0x0b, 0x03\ndb 0x22, 0x76, 0x6a, 0xff, 0xcf, 0x1f, 0xd6, 0x4d, 0x21, 0x45, 0x11, 0xd3, 0x0b, 0x9c, 0x87, 0x68\ndb 0x98, 0xb8, 0x82, 0x4e, 0x6e, 0xc5, 0x4d, 0x8a, 0x7a, 0x9f, 0x19, 0x8a, 0xa1, 0xf7, 0xed, 0x79\ndb 0x56, 0xd6, 0x1b, 0x75, 0xba, 0xf2, 0x8a, 0x1d, 0x83, 0xe1, 0x6a, 0x08, 0x46, 0x0d, 0x4d, 0xb4\ndb 0xa1, 0xb8, 0x40, 0x24, 0x71, 0xe4, 0xd4, 0xb0, 0x4c, 0x32, 0x49, 0xec, 0x5a, 0x03, 0x95, 0x13\ndb 0xef, 0xbb, 0x5f, 0xee, 0x1d, 0x95, 0xb1, 0x60, 0xd2, 0xd7, 0x6b, 0x06, 0x8e, 0xf1, 0x96, 0x35\ndb 0xe0, 0x02, 0x4e, 0x50, 0xb2, 0x7e, 0xaa, 0x6b, 0xe7, 0xf8, 0xd0, 0xd2, 0x3e, 0x96, 0xde, 0x77\ndb 0xf0, 0xa8, 0xdd, 0x44, 0x00, 0x4b, 0xc1, 0x56, 0xd2, 0xe5, 0x9a, 0x1d, 0xa7, 0x8f, 0x08, 0x3e\ndb 0x1b, 0x14, 0xc9, 0x9e, 0x46, 0x7e, 0xf0, 0x51, 0x3c, 0x8c, 0x80, 0x21, 0xc6, 0x96, 0xc1, 0x9a\ndb 0xda, 0x41, 0xa5, 0xc8, 0xc8, 0x18, 0x63, 0x43, 0x20, 0xaf, 0x69, 0x28, 0xa5, 0x38, 0x13, 0xe0\ndb 0xf4, 0x2e, 0xdc, 0xed, 0x4a, 0x0c, 0x70, 0xc7, 0xcf, 0x45, 0x62, 0x6d, 0x9c, 0x17, 0x8d, 0xb0\ndb 0x59, 0xc7, 0x2c, 0xff, 0x4d, 0xa7, 0x5d, 0xbb, 0xfd, 0xa2, 0xcb, 0xe0, 0x08, 0x3d, 0x78, 0x35\ndb 0x53, 0x88, 0x7e, 0xe5, 0xf1, 0x4a, 0x5a, 0xb7, 0xfc, 0xbb, 0xf0, 0x25, 0x5c, 0x32, 0x56, 0x4a\ndb 0xc8, 0x0b, 0xd2, 0x74, 0x14, 0xe3, 0x8b, 0xc0, 0x1f, 0x78, 0x1a, 0x74, 0xb8, 0x17, 0x09, 0x7c\ndb 0x74, 0x5e, 0x3a, 0xa9, 0x04, 0x64, 0x7d, 0x89, 0x81, 0x8a, 0x97, 0xac, 0x61, 0x41, 0xbd, 0x20\ndb 0x51, 0x55, 0x12, 0x95, 0xc3, 0x57, 0xcd, 0x9a, 0x07, 0x66, 0x19, 0xce, 0x9e, 0xed, 0x77, 0x34\ndb 0xb2, 0x77, 0xd8, 0x3a, 0xbc, 0x59, 0xf1, 0x86, 0x99, 0x2f, 0x19, 0x51, 0x0f, 0xda, 0x59, 0x82\ndb 0x0a, 0xaa, 0x2e, 0xaa, 0x04, 0x00, 0x8d, 0xe4, 0xe2, 0x53, 0xdf, 0x5c, 0x6e, 0xfb, 0x72, 0x22\ndb 0x23, 0x6f, 0xe2, 0x4c, 0x74, 0x30, 0xc6, 0x62, 0x5c, 0x85, 0x61, 0x44, 0xf4, 0x9d, 0x07, 0x56\ndb 0x0c, 0x90, 0xb2, 0x35, 0x8a, 0xcd, 0x02, 0x54, 0x5a, 0x51, 0x40, 0xfa, 0xad, 0x19, 0x5c, 0xdc\ndb 0xf5, 0xe2, 0xb6, 0x10, 0x58, 0x10, 0x60, 0x1d, 0x04, 0xbd, 0x7c, 0x47, 0xaf, 0x28, 0x3d, 0x68\ndb 0x80, 0x06, 0xee, 0x4e, 0xbd, 0x90, 0x53, 0x90, 0x3f, 0x7e, 0xed, 0x99, 0x6f, 0x4f, 0xc3, 0xce\ndb 0x64, 0xa7, 0x9e, 0x5e, 0x85, 0xb3, 0x2f, 0x30, 0x2c, 0xc5, 0xa2, 0x5f, 0xa7, 0x6e, 0xb8, 0x4e\ndb 0x50, 0xb2, 0x06, 0x3e, 0xaf, 0x9d, 0x2c, 0x25, 0x29, 0x06, 0x4e, 0xd6, 0x4d, 0x58, 0x28, 0xe1\ndb 0x57, 0x45, 0xf0, 0x0c, 0x09, 0xcf, 0x24, 0x13, 0x83, 0x39, 0xc4, 0xf8, 0x17, 0x26, 0xdc, 0xba\ndb 0x19, 0x55, 0x83, 0xe9, 0xad, 0xad, 0x51, 0xbe, 0xc4, 0x36, 0x8e, 0xaf, 0x5b, 0x40, 0x4a, 0xfd\ndb 0x26, 0xfc, 0x42, 0x74, 0xe0, 0xfd, 0x9f, 0x9b, 0xda, 0x31, 0x78, 0x1a, 0x4e, 0x2e, 0xfc, 0x67\ndb 0x2e, 0x96, 0x54, 0xfe, 0xdd, 0xfe, 0x28, 0x1a, 0x0f, 0xf6, 0x59, 0x9a, 0x76, 0x92, 0xdd, 0x1e\ndb 0xd2, 0xb7, 0x28, 0xeb, 0x49, 0x72, 0xef, 0x2a, 0xc5, 0xb3, 0x2f, 0x0f, 0xcd, 0xe1, 0xa2, 0x47\ndb 0xc0, 0x6d, 0x31, 0x77, 0x45, 0xd7, 0x2c, 0x97, 0x83, 0x8d, 0x2a, 0x52, 0x58, 0xc1, 0x2b, 0x36\ndb 0x06, 0xff, 0x02, 0x0f, 0xba, 0xac, 0x98, 0x29, 0xda, 0x20, 0xf1, 0x2f, 0x45, 0x66, 0xa9, 0xe4\ndb 0x59, 0x01, 0xa4, 0x11, 0x2d, 0x2e, 0xf8, 0xd4, 0x7d, 0x00, 0x8f, 0xf4, 0xea, 0xfe, 0x4c, 0x12\ndb 0xd5, 0x12, 0x30, 0x8b, 0xcc, 0xb2, 0x1f, 0x23, 0xd2, 0x63, 0x71, 0x49, 0xb4, 0x76, 0x58, 0xec\ndb 0x90, 0x09, 0xd5, 0x46, 0x8b, 0xfe, 0x15, 0x97, 0x3d, 0x7e, 0x3f, 0x5f, 0x36, 0xa2, 0x79, 0xc2\ndb 0x15, 0xcd, 0x24, 0x8d, 0x06, 0x75, 0x3c, 0x79, 0x82, 0xe7, 0x0c, 0x2e, 0x76, 0x3a, 0xcf, 0xbe\ndb 0xaf, 0xd9, 0x2a, 0x5f, 0xf2, 0x61, 0x22, 0xd5, 0xe3, 0x24, 0xe1, 0xfe, 0x12, 0x3d, 0x03, 0x70\ndb 0x71, 0xe3, 0x49, 0xe9, 0x10, 0x73, 0x0d, 0x89, 0x5c, 0x53, 0x7c, 0xd2, 0xb4, 0x71, 0xf6, 0x16\ndb 0x93, 0x67, 0x06, 0x60, 0x13, 0x72, 0xcd, 0x00, 0xe5, 0x50, 0x4c, 0x01, 0xcf, 0x6b, 0x98, 0x6c\ndb 0xe0, 0xcd, 0x5a, 0xfb, 0x33, 0x3e, 0x52, 0x77, 0xf2, 0x34, 0xdd, 0xb2, 0x94, 0xbb, 0xb5, 0x13\ndb 0x3f, 0xfd, 0xea, 0x2e, 0xda, 0x8c, 0x02, 0xbb, 0xab, 0x50, 0xd7, 0xfc, 0x26, 0x3e, 0xda, 0x3b\ndb 0xab, 0x9a, 0xea, 0x6b, 0xb1, 0x64, 0xb8, 0x1a, 0x19, 0x8d, 0x31, 0xed, 0x9b, 0x92, 0xe1, 0x75\ndb 0x8a, 0xb9, 0x17, 0xb5, 0xe5, 0x29, 0x48, 0xe5, 0xbf, 0x80, 0x94, 0xc6, 0x1e, 0xcf, 0x5a, 0xd7\ndb 0x47, 0x6e, 0xc5, 0xe8, 0x12, 0x99, 0x48, 0x07, 0xe8, 0x9c, 0xde, 0x0b, 0x59, 0xc0, 0x0f, 0x06\ndb 0x75, 0x41, 0x61, 0x94, 0x28, 0x5f, 0x87, 0x56, 0xa4, 0x3f, 0x18, 0xf7, 0x93, 0xe0, 0xc9, 0x03\ndb 0x03, 0x6e, 0x44, 0x16, 0x70, 0xbc, 0x38, 0x7d, 0x4d, 0x17, 0x75, 0x65, 0x5d, 0x9c, 0x79, 0xc7\ndb 0x29, 0x56, 0x52, 0x4a, 0xfe, 0xef, 0x09, 0x65, 0x9a, 0xc3, 0x78, 0x8d, 0x89, 0xc2, 0x3f, 0x43\ndb 0x1d, 0xd6, 0x54, 0x59, 0xe4, 0x6f, 0xaf, 0x08, 0x90, 0xff, 0x20, 0xae, 0x87, 0x68, 0x7b, 0x4a\ndb 0x62, 0xd2, 0x93, 0x57, 0x08, 0xec, 0xbd, 0x5b, 0xde, 0xa0, 0x76, 0x01, 0x6a, 0x27, 0x2e, 0xc9\ndb 0xf1, 0x99, 0x7a, 0xa5, 0x08, 0x31, 0x85, 0x68, 0x35, 0x94, 0xe4, 0x56, 0x0b, 0x52, 0xdc, 0x5b\ndb 0x9c, 0x2f, 0xe8, 0x54, 0xb3, 0xee, 0x9d, 0x0e, 0x75, 0xb5, 0x5c, 0xcb, 0xb9, 0x7b, 0x88, 0xf8\ndb 0x0e, 0x56, 0x11, 0x6f, 0xb4, 0xa5, 0x4f, 0xf3, 0x01, 0xc6, 0xe7, 0xc6, 0xbf, 0x89, 0x88, 0x02\ndb 0xeb, 0xce, 0x57, 0xe3, 0x59, 0xf0, 0x12, 0xdf, 0x57, 0x4e, 0xb0, 0xba, 0x67, 0x70, 0x94, 0x1e\ndb 0xa3, 0xd3, 0x60, 0x21, 0xf8, 0xa6, 0xc9, 0xe7, 0x3e, 0x12, 0x93, 0x58, 0x8b, 0xd7, 0x0e, 0x94\ndb 0x6f, 0xcd, 0x8b, 0x09, 0x6d, 0xaa, 0x5b, 0xb2, 0x2c, 0x9f, 0x6f, 0x85, 0x93, 0xf1, 0xc9, 0xd0\ndb 0xd2, 0x04, 0xd1, 0x80, 0xe0, 0x11, 0x09, 0x0f, 0x7b, 0x88, 0xfe, 0x05, 0x9a, 0x53, 0x36, 0xac\ndb 0xd9, 0xb8, 0x45, 0x81, 0x51, 0x99, 0xeb, 0x8d, 0xf2, 0x4d, 0x30, 0x70, 0x62, 0xf4, 0xf9, 0x2f\ndb 0xf7, 0x52, 0xa1, 0xb2, 0xec, 0xa4, 0xbe, 0x1c, 0xd0, 0xfb, 0x1c, 0xe4, 0x3a, 0xbe, 0x5d, 0xee\ndb 0x60, 0xdb, 0x4a, 0x70, 0xec, 0x31, 0xc7, 0x89, 0x16, 0x95, 0x94, 0xde, 0x8c, 0x58, 0x3e, 0xad\ndb 0x58, 0x46, 0x9c, 0x68, 0x2a, 0x2d, 0x43, 0x37, 0x5c, 0xec, 0xf4, 0x03, 0x65, 0xf5, 0x3e, 0xa2\ndb 0x7d, 0xe0, 0x4d, 0x39, 0x34, 0x7f, 0xe2, 0xdb, 0x90, 0x66, 0xdc, 0xca, 0x2e, 0xf8, 0x3d, 0xd8\ndb 0x97, 0x55, 0x60, 0x76, 0xc9, 0x53, 0x71, 0xe2, 0xa3, 0xe1, 0x5d, 0x5f, 0x4c, 0xfe, 0x03, 0x2b\ndb 0x15, 0xd7, 0x2d, 0x5b, 0x56, 0xa0, 0xb5, 0x78, 0x44, 0x98, 0x1f, 0x52, 0xe1, 0x49, 0x13, 0x48\ndb 0xed, 0x83, 0xa1, 0xfb, 0x23, 0xd0, 0x73, 0x34, 0x5e, 0x1d, 0x2f, 0xa0, 0xc5, 0x1b, 0xd0, 0xe3\ndb 0x12, 0x28, 0x52, 0x00, 0xe6, 0x7c, 0x6d, 0x6e, 0x87, 0xe2, 0x42, 0x97, 0x1f, 0x5b, 0x2b, 0x93\ndb 0xba, 0x75, 0xe2, 0x8b, 0x3f, 0x62, 0x5b, 0xb5, 0x36, 0x76, 0x05, 0x1d, 0x2d, 0x7d, 0x29, 0x88\ndb 0x2d, 0x6a, 0xe7, 0xec, 0x3b, 0x8c, 0x88, 0x70, 0xb7, 0xf2, 0xbb, 0x61, 0xdb, 0xa2, 0x1a, 0x28\ndb 0xb0, 0x17, 0xdf, 0x18, 0xcc, 0x2a, 0x02, 0xdd, 0xd2, 0x4a, 0x10, 0x2c, 0x9d, 0x65, 0x58, 0x46\ndb 0x1b, 0xa0, 0xf7, 0x57, 0x7f, 0x76, 0x36, 0xd2, 0xb6, 0xc1, 0xb5, 0x93, 0x6a, 0xbf, 0x97, 0x22\ndb 0x9f, 0xe2, 0xe9, 0xdb, 0x25, 0xc3, 0x04, 0xf0, 0xed, 0x54, 0xc7, 0xc6, 0xab, 0x30, 0x36, 0xb8\ndb 0x3a, 0x24, 0xab, 0x10, 0x0c, 0x26, 0x45, 0xb6, 0xd9, 0xf3, 0x19, 0x6b, 0x65, 0xfd, 0x1d, 0x6d\ndb 0x52, 0x73, 0x14, 0x9d, 0x22, 0x1f, 0xb1, 0x8c, 0x3e, 0x43, 0xbb, 0xf1, 0xca, 0x0f, 0x84, 0x81\ndb 0xb5, 0xc5, 0xe3, 0xf6, 0xcd, 0xe0, 0x2c, 0xf6, 0x9e, 0x21, 0xaa, 0xc8, 0x18, 0x85, 0x17, 0x78\ndb 0x60, 0xb5, 0xeb, 0x9f, 0x2e, 0x5b, 0xbe, 0xe9, 0x87, 0x37, 0xa0, 0x9c, 0x51, 0x8a, 0xf4, 0x1a\ndb 0x17, 0xfd, 0x9d, 0xf0, 0x81, 0x34, 0x55, 0x74, 0x4b, 0x49, 0x86, 0x7b, 0xd1, 0x00, 0x21, 0x92\ndb 0x69, 0xdf, 0x80, 0x8b, 0xa4, 0xf0, 0x50, 0x24, 0xbf, 0x2e, 0x1f, 0x7e, 0x4f, 0x2a, 0x79, 0x65\ndb 0x09, 0xc5, 0x6a, 0x4c, 0x87, 0x3d, 0x4d, 0xe7, 0xcd, 0x6a, 0xdd, 0x1d, 0x89, 0xde, 0x0f, 0xe3\ndb 0xaa, 0xf4, 0x99, 0xf0, 0x17, 0x54, 0x2d, 0x81, 0x97, 0x5a, 0x4f, 0xae, 0x77, 0x2f, 0x2a, 0x93\ndb 0x68, 0xe8, 0x0a, 0xbc, 0xcf, 0x48, 0xe2, 0x40, 0xe2, 0x55, 0xdd, 0x5c, 0xa5, 0x50, 0x63, 0xea\ndb 0xb2, 0x53, 0xea, 0x8a, 0x51, 0xbe, 0x93, 0xa7, 0x02, 0xa5, 0x50, 0x18, 0x7c, 0x0e, 0x40, 0x27\ndb 0x9e, 0x5c, 0x68, 0x17, 0x37, 0xe7, 0x83, 0x8c, 0xc4, 0x31, 0x5a, 0xd1, 0x6e, 0xe4, 0xac, 0xd7\ndb 0x05, 0x34, 0x2b, 0xdb, 0xe6, 0x75, 0xed, 0xd0, 0xa5, 0x18, 0xe5, 0x7e, 0x78, 0x7e, 0x28, 0xfb\ndb 0x9c, 0x58, 0x5d, 0x92, 0x9f, 0xfb, 0xa1, 0x86, 0x6e, 0x96, 0x55, 0x60, 0xee, 0xf8, 0x98, 0x39\ndb 0x18, 0xa1, 0x60, 0x58, 0xc7, 0xf4, 0xf7, 0x5b, 0x30, 0x76, 0x65, 0xa4, 0x9c, 0x75, 0x79, 0x37\ndb 0x3a, 0xb3, 0x40, 0xde, 0xff, 0xb2, 0x8d, 0x50, 0xd6, 0x05, 0xc2, 0x22, 0x5f, 0xa9, 0x2e, 0xd9\ndb 0xc3, 0x5c, 0xe5, 0xae, 0xcd, 0xad, 0x73, 0xba, 0xdb, 0x04, 0xe9, 0x1f, 0xeb, 0x6f, 0xd4, 0x02\ndb 0x3c, 0xfb, 0x68, 0x52, 0x25, 0xd8, 0xb9, 0xba, 0xf3, 0x56, 0x0c, 0x4b, 0xda, 0x00, 0xb1, 0x7d\ndb 0xd7, 0x4a, 0x04, 0x5e, 0x5f, 0x2f, 0x49, 0x7f, 0xe3, 0x30, 0x18, 0xa2, 0x44, 0x3a, 0x56, 0x80\ndb 0x2d, 0xdd, 0x77, 0x4d, 0x48, 0x1d, 0x8b, 0x3a, 0x52, 0xf5, 0x63, 0x51, 0xb1, 0xe0, 0xe3, 0x7c\ndb 0xd2, 0x3d, 0x50, 0xce, 0xbd, 0xf3, 0x8e, 0xfd, 0xe3, 0x0a, 0x3c, 0x6d, 0x85, 0x4a, 0xd2, 0xa8\ndb 0xe7, 0x7a, 0xac, 0x50, 0x9c, 0xc7, 0x9f, 0x91, 0x5d, 0xc5, 0x66, 0x86, 0x00, 0x31, 0x72, 0x87\ndb 0x39, 0x22, 0xd0, 0x3a, 0xc7, 0xe3, 0x91, 0x9f, 0x02, 0x55, 0xa2, 0x0c, 0xb2, 0xca, 0x11, 0xec\ndb 0xb5, 0x22, 0xab, 0x55, 0x8e, 0x05, 0x43, 0xe3, 0xfe, 0xb3, 0xef, 0x1b, 0xfb, 0x8f, 0x79, 0x11\ndb 0xb3, 0x2a, 0x01, 0x13, 0xaf, 0xa7, 0x7a, 0xcd, 0x85, 0xc9, 0xc0, 0x37, 0x7b, 0x8f, 0x6e, 0xef\ndb 0x15, 0xe9, 0x7f, 0xf5, 0xf7, 0xee, 0x82, 0xa2, 0x91, 0xc4, 0xa1, 0x33, 0x28, 0xef, 0xf9, 0x47\ndb 0x31, 0xef, 0x1e, 0xf1, 0x25, 0x3d, 0x9b, 0x84, 0x7a, 0x75, 0x03, 0xb0, 0xbd, 0x96, 0xe5, 0xb2\ndb 0x12, 0x52, 0x6c, 0x10, 0x1c, 0x1b, 0x8e, 0xe2, 0xd5, 0x08, 0x99, 0x3f, 0x1d, 0x57, 0x12, 0x00\ndb 0x90, 0xf5, 0x21, 0x76, 0x3e, 0x51, 0xd9, 0x19, 0xb2, 0x41, 0x88, 0x47, 0xc3, 0x95, 0xfb, 0xe0\ndb 0x38, 0x87, 0xff, 0x52, 0xb4, 0x9d, 0xf2, 0xdf, 0x53, 0x2d, 0x4f, 0x55, 0x4b, 0x4d, 0xa3, 0x0d\ndb 0x45, 0x9f, 0xd7, 0x33, 0xd8, 0x11, 0xd9, 0x45, 0xd9, 0x13, 0x3a, 0xe5, 0xe6, 0xda, 0x5b, 0xc6\ndb 0xd4, 0xcb, 0x19, 0x63, 0xb0, 0x5d, 0x2e, 0x37, 0x97, 0x0b, 0x64, 0x09, 0x45, 0xd3, 0x78, 0x2d\ndb 0xbc, 0xc0, 0x79, 0x0d, 0xf5, 0x51, 0x9b, 0xeb, 0x9c, 0x28, 0xce, 0x14, 0x32, 0x70, 0xae, 0x14\ndb 0xa1, 0xd5, 0x4f, 0x9d, 0xbc, 0x79, 0x45, 0x2d, 0x89, 0x63, 0x4b, 0x27, 0x37, 0x94, 0x7f, 0xdb\ndb 0x2f, 0x39, 0xb8, 0x73, 0xaf, 0x3b, 0x4e, 0x97, 0x2f, 0xce, 0x83, 0x04, 0xb8, 0xa3, 0xb7, 0x38\ndb 0xe9, 0x08, 0x75, 0x35, 0x42, 0x1c, 0xe8, 0xc4, 0xff, 0xca, 0x13, 0xf9, 0x69, 0x53, 0x32, 0x83\ndb 0x29, 0xe6, 0x17, 0xe7, 0xf3, 0x01, 0xbf, 0xc0, 0xf1, 0xdf, 0x8b, 0x2d, 0x29, 0x5d, 0x68, 0xfb\ndb 0x18, 0x77, 0x2d, 0x98, 0x29, 0xa3, 0x44, 0x79, 0x47, 0xbe, 0xb9, 0xca, 0x18, 0x29, 0x16, 0xd9\ndb 0x41, 0x49, 0x55, 0x82, 0xf2, 0xc0, 0x42, 0x13, 0x68, 0x72, 0x75, 0x5f, 0xe4, 0x97, 0xae, 0x6d\ndb 0x90, 0xc0, 0x57, 0x05, 0x9e, 0x54, 0xa5, 0x1e, 0x4b, 0x6e, 0x46, 0x9d, 0x31, 0xce, 0x0a, 0xde\ndb 0xed, 0x71, 0x7b, 0x42, 0xa6, 0xf3, 0x6c, 0xc8, 0x21, 0x4a, 0x4f, 0x40, 0x67, 0x90, 0x2c, 0x92\ndb 0xb6, 0x7a, 0xdc, 0x9b, 0x0c, 0xb8, 0x38, 0x80, 0xf6, 0x77, 0x29, 0xe3, 0x59, 0xbc, 0xfa, 0xe2\ndb 0xdf, 0x95, 0x5c, 0xec, 0x7c, 0xac, 0x81, 0x5f, 0xd3, 0xcc, 0x50, 0x43, 0xad, 0xb0, 0x6c, 0xb3\ndb 0x9a, 0x4c, 0x37, 0x6c, 0x18, 0xf1, 0xa3, 0x71, 0x57, 0x39, 0x09, 0xf7, 0xe0, 0xdc, 0x93, 0xe2\ndb 0xba, 0xd6, 0x2a, 0x81, 0x67, 0x59, 0x36, 0x8e, 0xf1, 0x4b, 0xd5, 0xa6, 0x57, 0x84, 0x63, 0x1a\ndb 0xea, 0x2f, 0x2f, 0xd8, 0x9b, 0x64, 0x15, 0x6e, 0x32, 0x40, 0xe0, 0x98, 0x11, 0x5f, 0xc2, 0x47\ndb 0xa9, 0x08, 0x84, 0x0c, 0xa3, 0xea, 0xe6, 0x4b, 0xcc, 0x08, 0x27, 0x22, 0x9b, 0xf7, 0xb7, 0x6e\ndb 0xfb, 0x86, 0x04, 0x04, 0x26, 0x8d, 0x47, 0x04, 0xf5, 0x48, 0x1c, 0xac, 0xaa, 0x73, 0x46, 0x06\ndb 0x33, 0xcf, 0xd4, 0xb2, 0xc0, 0x90, 0x5a, 0xc6, 0x0e, 0xe0, 0x3d, 0xd1, 0xf4, 0x9a, 0x7b, 0xaa\ndb 0xdc, 0x00, 0x62, 0xec, 0xae, 0x0b, 0x59, 0xdf, 0x46, 0x8c, 0x37, 0x48, 0xdf, 0xb9, 0x51, 0xef\ndb 0x03, 0x3f, 0x14, 0x06, 0xe9, 0xa9, 0x04, 0x5e, 0x05, 0x42, 0x5c, 0x3c, 0x56, 0xe7, 0xdb, 0xeb\ndb 0x96, 0x19, 0xa5, 0x0d, 0xa9, 0xc5, 0xa6, 0x1e, 0x68, 0x43, 0x1d, 0x09, 0x5e, 0x95, 0x48, 0xaa\ndb 0x73, 0xe2, 0x6a, 0x65, 0x34, 0xef, 0xf8, 0x2d, 0x3a, 0xe6, 0x0e, 0x56, 0xcb, 0x9a, 0x7d, 0x31\ndb 0xf0, 0xa8, 0x73, 0xfc, 0x69, 0x22, 0xab, 0xbc, 0xcf, 0xe1, 0x05, 0xa4, 0xe8, 0x14, 0x4e, 0x96\ndb 0xe1, 0x0c, 0xa1, 0x8d, 0x94, 0x18, 0xa1, 0xa3, 0x71, 0x1f, 0x1f, 0xd2, 0x92, 0x9c, 0xa3, 0x49\ndb 0xc1, 0xa0, 0x2b, 0xd3, 0x48, 0x5c, 0x59, 0xd5, 0x19, 0xbb, 0xcf, 0x07, 0x68, 0x5e, 0xca, 0x33\ndb 0xb7, 0x42, 0x04, 0x28, 0x78, 0x3a, 0x5c, 0x12, 0xc6, 0x67, 0x0e, 0x98, 0x30, 0xdb, 0x7f, 0x5a\ndb 0x4e, 0xc3, 0xd6, 0x3a, 0xec, 0x4a, 0x53, 0x9e, 0x2b, 0x92, 0xe9, 0x5b, 0xef, 0x01, 0x73, 0x1b\ndb 0x8f, 0x20, 0x91, 0xdb, 0x01, 0x7e, 0x97, 0xff, 0x98, 0xc2, 0x44, 0xa7, 0x35, 0xe6, 0xc0, 0x41\ndb 0x55, 0x6c, 0xaf, 0x24, 0xd2, 0xac, 0x2f, 0x2b, 0x62, 0xa2, 0xc8, 0x64, 0xf7, 0x0a, 0xf4, 0x94\ndb 0x3e, 0x29, 0x11, 0xd0, 0x08, 0xac, 0x40, 0xab, 0x14, 0x36, 0xe8, 0xd6, 0x9a, 0xe9, 0xd2, 0xe2\ndb 0x1b, 0xa8, 0x80, 0x67, 0x45, 0x24, 0xe0, 0x7c, 0xaa, 0xc4, 0x17, 0x0b, 0xbe, 0xbc, 0x7f, 0x17\ndb 0x44, 0xf7, 0x7a, 0x3a, 0x62, 0x92, 0xfc, 0x66, 0x08, 0x17, 0x60, 0xc8, 0x57, 0x42, 0x8f, 0x4f\ndb 0xa3, 0x2d, 0xe0, 0x42, 0x22, 0xab, 0x70, 0x65, 0x8f, 0xad, 0xc8, 0x8a, 0x1d, 0xbc, 0x66, 0xc2\ndb 0xd4, 0xb0, 0x47, 0x58, 0xb8, 0xe2, 0xd8, 0x40, 0x25, 0x05, 0x65, 0x07, 0xfc, 0x31, 0x4b, 0xaf\ndb 0xba, 0x0a, 0x92, 0x1e, 0xd7, 0xd9, 0x7a, 0x25, 0x39, 0xda, 0x7a, 0xa5, 0x31, 0x77, 0xce, 0x17\ndb 0x56, 0x12, 0x5d, 0xcf, 0x56, 0x06, 0xeb, 0x76, 0x3a, 0x8b, 0xcb, 0x3b, 0xc1, 0x7b, 0x0b, 0x20\ndb 0xf7, 0x03, 0xf0, 0xe1, 0xca, 0x77, 0x35, 0x69, 0x84, 0x78, 0x0a, 0x94, 0x09, 0xcd, 0x5f, 0x49\ndb 0x77, 0x8a, 0xc1, 0xbc, 0x95, 0x38, 0x61, 0x37, 0x37, 0x9a, 0x3d, 0xb4, 0xe2, 0x1a, 0x80, 0x42\ndb 0xd2, 0x85, 0x59, 0xba, 0xc8, 0xd8, 0x0f, 0x30, 0x3f, 0xdd, 0xef, 0xbe, 0x80, 0xe5, 0x95, 0xc4\ndb 0x54, 0xb8, 0x8f, 0xc6, 0x60, 0x2c, 0x85, 0xf4, 0xc3, 0x33, 0x63, 0x8e, 0x50, 0x23, 0x4b, 0xee\ndb 0x13, 0x87, 0xd6, 0xd4, 0xba, 0xb9, 0xcf, 0x05, 0xaf, 0x6a, 0x27, 0x73, 0x56, 0x30, 0xd6, 0x83\ndb 0x9e, 0x0b, 0x47, 0x12, 0x4f, 0x5c, 0x34, 0xb6, 0x66, 0xc0, 0xd9, 0x90, 0xb2, 0xa6, 0x54, 0xbf\ndb 0x42, 0x5d, 0xf0, 0x02, 0x9f, 0x6b, 0x73, 0x90, 0xa9, 0x1f, 0x9f, 0xae, 0x83, 0x12, 0xfa, 0x82\ndb 0x5b, 0x43, 0xcd, 0xfb, 0xf9, 0x4b, 0xb8, 0x10, 0x4b, 0x8c, 0x33, 0xcb, 0xff, 0x75, 0x04, 0xd6\ndb 0x85, 0x0c, 0x43, 0x9b, 0x17, 0x9b, 0x36, 0x8a, 0xb7, 0x56, 0x1c, 0xe0, 0x7f, 0xed, 0x69, 0xda\ndb 0x86, 0x5f, 0x79, 0x41, 0xa3, 0x3e, 0x39, 0x4e, 0xad, 0x95, 0x60, 0x8e, 0x6a, 0x12, 0x9f, 0xa5\ndb 0xbf, 0xd4, 0x2a, 0x9c, 0x48, 0x93, 0xeb, 0x11, 0x92, 0x68, 0xc8, 0xef, 0xa6, 0xbc, 0xf6, 0x84\ndb 0xc2, 0xfd, 0x48, 0xbf, 0xbb, 0x80, 0x1f, 0x8f, 0xf0, 0xf5, 0xe3, 0x8d, 0xfb, 0x87, 0xe4, 0x6a\ndb 0x51, 0x13, 0x03, 0x15, 0x7d, 0x30, 0xb8, 0xad, 0x9f, 0x1f, 0x15, 0xf2, 0x40, 0xef, 0x21, 0xcc\ndb 0x71, 0xe5, 0x80, 0x5d, 0xc8, 0x33, 0xe3, 0xe1, 0x09, 0x7a, 0x66, 0xdd, 0xe2, 0x1d, 0xac, 0xa7\ndb 0xb4, 0xa7, 0x8e, 0x92, 0x49, 0xbf, 0x60, 0x2d, 0xa3, 0xa8, 0x1a, 0x21, 0x34, 0xcc, 0x29, 0x12\ndb 0x78, 0x89, 0xc3, 0x52, 0xe8, 0xbc, 0xba, 0x54, 0xbd, 0x19, 0x2e, 0xad, 0xd4, 0x48, 0x4d, 0x2f\ndb 0x1f, 0xe7, 0x98, 0xd9, 0x6d, 0xbb, 0x85, 0x48, 0x79, 0x81, 0xf2, 0x3d, 0x03, 0xf7, 0x16, 0x7b\ndb 0xf5, 0x72, 0x5a, 0xf6, 0x56, 0x4d, 0x03, 0x2b, 0x6d, 0xa1, 0xb1, 0x02, 0xa4, 0xf0, 0x43, 0x4b\ndb 0xbe, 0xec, 0x74, 0xe9, 0x43, 0x0c, 0xd4, 0xeb, 0x06, 0x49, 0x66, 0x27, 0x4b, 0xb9, 0xe8, 0xb3\ndb 0xaa, 0x60, 0xf8, 0x9b, 0x4f, 0x88, 0x66, 0xfe, 0x7d, 0xc0, 0x21, 0x22, 0x74, 0xcf, 0xe3, 0xf8\ndb 0xf4, 0xe3, 0x6d, 0x6c, 0xf9, 0x21, 0xc2, 0x86, 0x89, 0x63, 0x5b, 0x27, 0x71, 0x04, 0x03, 0x40\ndb 0xa9, 0xe6, 0xa3, 0x2f, 0x65, 0xb6, 0x5a, 0xdc, 0xdd, 0x4d, 0x92, 0xe1, 0x86, 0xf5, 0xc5, 0xc0\ndb 0x05, 0x3c, 0x5b, 0x35, 0xd4, 0x8c, 0x61, 0xed, 0xc7, 0x53, 0x63, 0x4e, 0x6a, 0xfe, 0x6f, 0x52\ndb 0x96, 0x50, 0x43, 0x99, 0x24, 0x14, 0xeb, 0xb6, 0x58, 0xce, 0xd9, 0xe0, 0x21, 0x64, 0x9c, 0xe4\ndb 0x05, 0x48, 0xf8, 0xeb, 0x12, 0x03, 0x54, 0x19, 0xf3, 0x17, 0x6c, 0x3b, 0x91, 0x02, 0xe4, 0xfc\ndb 0xb9, 0x24, 0xa6, 0xc1, 0xc9, 0x5e, 0x31, 0xdb, 0x03, 0x52, 0x91, 0xc8, 0x67, 0xaa, 0xe8, 0x1b\ndb 0x51, 0x83, 0xf6, 0x6d, 0xf9, 0xad, 0x45, 0x2e, 0x24, 0x9d, 0x1d, 0x80, 0xd5, 0xc0, 0xbf, 0xd5\ndb 0xca, 0x78, 0x3e, 0x53, 0x86, 0x97, 0xa9, 0xc5, 0xf8, 0x22, 0x41, 0x1a, 0x1b, 0x20, 0x53, 0xc5\ndb 0xc8, 0x4b, 0xff, 0x56, 0xb8, 0xfb, 0x61, 0x84, 0x83, 0xca, 0xac, 0x68, 0xcd, 0x56, 0x47, 0xa6\ndb 0x0d, 0x43, 0xfc, 0xbb, 0xaa, 0x60, 0xf1, 0xc4, 0xde, 0xc0, 0xe0, 0xa2, 0x88, 0x59, 0x68, 0x53\ndb 0x69, 0xba, 0x67, 0x21, 0x54, 0x18, 0x98, 0x51, 0x09, 0x35, 0xdd, 0x3c, 0xec, 0x35, 0x2f, 0xf0\ndb 0x6e, 0xcf, 0xba, 0x21, 0x04, 0x0a, 0xb4, 0x91, 0xdf, 0xf8, 0xb5, 0x9f, 0xb8, 0xc4, 0x97, 0xf8\ndb 0x4f, 0x10, 0xca, 0x5b, 0x4a, 0x43, 0x9e, 0x45, 0x0e, 0x51, 0x3f, 0x43, 0x96, 0x40, 0xb8, 0x70\ndb 0x66, 0xcb, 0xa1, 0x70, 0x5f, 0x4f, 0x9e, 0xb0, 0x2f, 0x03, 0x6f, 0x42, 0xcd, 0xf6, 0x3c, 0x90\ndb 0x2f, 0x9b, 0x83, 0x01, 0x41, 0x13, 0xa8, 0xf8, 0xbc, 0x19, 0x5c, 0x10, 0x09, 0xb9, 0xd4, 0x5d\ndb 0x0c, 0xa3, 0x51, 0xb0, 0x1a, 0xfd, 0x18, 0xbb, 0x67, 0x40, 0x4f, 0xc4, 0xab, 0x41, 0x8e, 0xbf\ndb 0x74, 0x0d, 0xa2, 0xa0, 0xf2, 0x48, 0x94, 0x5e, 0xa6, 0x63, 0xe4, 0xb3, 0x77, 0x2b, 0x79, 0x90\ndb 0xfe, 0x95, 0x1d, 0x92, 0x3a, 0x23, 0x8b, 0xf2, 0xa9, 0x87, 0x31, 0x9a, 0x06, 0x81, 0xb1, 0x6f\ndb 0xa6, 0x1e, 0x21, 0xb6, 0x1e, 0x0d, 0x9a, 0xf8, 0x3d, 0x38, 0x9d, 0xcc, 0x0c, 0x49, 0x83, 0x7a\ndb 0xd5, 0x7e, 0x5a, 0x98, 0xd7, 0xbe, 0x07, 0xf9, 0x79, 0x5e, 0x46, 0x89, 0x8e, 0xc9, 0xdf, 0x27\ndb 0xf9, 0xa4, 0xc6, 0x5f, 0x08, 0x45, 0x04, 0x2b, 0x62, 0xf5, 0x8e, 0x54, 0x57, 0xd0, 0xcd, 0xf4\ndb 0x51, 0x9e, 0x9a, 0xc8, 0x82, 0x65, 0x45, 0x8e, 0x49, 0xba, 0x28, 0x55, 0x3e, 0x58, 0xac, 0xf0\ndb 0xfb, 0xf2, 0xbd, 0x77, 0x9e, 0xc0, 0xb4, 0xf6, 0x9e, 0x52, 0x87, 0x5e, 0xc9, 0x41, 0x26, 0x01\ndb 0x64, 0x1f, 0x54, 0x53, 0x25, 0xb8, 0x2d, 0x91, 0xc9, 0x68, 0x30, 0xa0, 0x92, 0x37, 0x03, 0xac\ndb 0x36, 0xdc, 0x43, 0xb8, 0x2b, 0x29, 0x39, 0x8b, 0xfe, 0xda, 0xb6, 0xee, 0x3c, 0x7d, 0x4a, 0xc3\ndb 0x3e, 0xad, 0x45, 0xf4, 0xab, 0x67, 0xe3, 0x2b, 0xf5, 0xc4, 0xcf, 0x2f, 0xe3, 0xbd, 0x2e, 0x1c\ndb 0xac, 0xca, 0x37, 0xe3, 0x65, 0x9e, 0x6b, 0xc9, 0x94, 0x4f, 0x6d, 0x93, 0x0f, 0x0a, 0xc7, 0x19\ndb 0x69, 0xb3, 0x16, 0xe6, 0x70, 0xe7, 0xd0, 0xb1, 0xa9, 0x20, 0xae, 0x1d, 0xf3, 0x9c, 0xde, 0x5a\ndb 0xb2, 0x97, 0xdc, 0xd2, 0xc5, 0x91, 0x5f, 0x29, 0x2a, 0x47, 0x9b, 0x8a, 0x08, 0xd1, 0x5d, 0xf8\ndb 0x25, 0xf5, 0x36, 0x75, 0x69, 0x78, 0x8f, 0x78, 0xc5, 0x81, 0x97, 0x1a, 0x3f, 0x31, 0xc9, 0x70\ndb 0x3c, 0xe2, 0x04, 0x43, 0x41, 0xbd, 0x09, 0x10, 0x74, 0x95, 0x52, 0x53, 0x15, 0x15, 0xe0, 0xe9\ndb 0x3a, 0x4d, 0x11, 0x43, 0x90, 0xfc, 0x05, 0x0b, 0xd2, 0xbf, 0x3b, 0x14, 0xe5, 0x7e, 0x40, 0xa7\ndb 0x58, 0x4e, 0x2d, 0x6e, 0xa8, 0xc8, 0x73, 0xd0, 0x15, 0xa9, 0x8b, 0x28, 0x5d, 0xe0, 0x73, 0xac\ndb 0x8a, 0xdb, 0x28, 0xea, 0xdc, 0x97, 0xae, 0x75, 0x5b, 0xd5, 0x15, 0xe3, 0x7a, 0xc3, 0x39, 0x22\ndb 0x6c, 0x30, 0x43, 0x6a, 0xf8, 0x53, 0x1d, 0xd7, 0xee, 0x37, 0xd9, 0xe7, 0x56, 0x8c, 0x72, 0x8a\ndb 0xf1, 0x7d, 0xc9, 0x55, 0x57, 0x8d, 0x9e, 0xa5, 0xef, 0xa0, 0x72, 0xef, 0x3a, 0x28, 0x83, 0x56\ndb 0x2a, 0xd4, 0xa3, 0x40, 0x6c, 0x41, 0xe2, 0xaf, 0x20, 0xc6, 0xae, 0x52, 0x69, 0x1c, 0x14, 0xe7\ndb 0x9e, 0x61, 0xb0, 0x18, 0x7d, 0x37, 0xee, 0x74, 0xec, 0x4f, 0x6e, 0x7a, 0x37, 0xaa, 0x72, 0xbb\ndb 0x66, 0x92, 0x9c, 0x04, 0x01, 0x7d, 0x5d, 0xd3, 0xae, 0xc0, 0x5a, 0x62, 0x29, 0xd4, 0x27, 0x64\ndb 0xce, 0x99, 0x2c, 0x0d, 0xfc, 0x27, 0xfc, 0x39, 0x5c, 0xfe, 0xe4, 0x64, 0x0e, 0x6d, 0x09, 0x39\ndb 0x42, 0xf4, 0x6b, 0xa0, 0x6e, 0x65, 0xc8, 0xc5, 0xed, 0xa4, 0x25, 0xbd, 0x63, 0x87, 0x43, 0xd5\ndb 0x4a, 0xbb, 0x85, 0x52, 0x6b, 0x13, 0x25, 0xc9, 0x8e, 0xb3, 0xb2, 0xa7, 0xfd, 0x96, 0x86, 0xe7\ndb 0xbb, 0x75, 0x41, 0x24, 0x11, 0xf7, 0xf7, 0xd4, 0xf3, 0x97, 0xb3, 0x19, 0x49, 0x32, 0xc1, 0xd4\ndb 0xfd, 0xd9, 0x93, 0x9d, 0x80, 0x4b, 0xd1, 0xb8, 0x9c, 0x1b, 0xc7, 0xf9, 0x48, 0x47, 0x68, 0x84\ndb 0xbe, 0x74, 0xff, 0xef, 0xb5, 0x00, 0x6f, 0x04, 0xa0, 0x91, 0x1f, 0xae, 0x59, 0x06, 0x81, 0xd4\ndb 0x46, 0xe5, 0x4e, 0xd6, 0xf6, 0x69, 0x67, 0x26, 0x58, 0x86, 0x54, 0x8b, 0x0e, 0x2b, 0x07, 0x51\ndb 0xe5, 0x52, 0x47, 0x23, 0x50, 0xb1, 0x7c, 0x5b, 0xf0, 0xbc, 0x87, 0x9d, 0x30, 0xff, 0x27, 0xd8\ndb 0x86, 0xce, 0x9a, 0x13, 0x99, 0x0e, 0xa7, 0x2d, 0xa0, 0x86, 0xae, 0xc8, 0x46, 0x4d, 0x6a, 0xc9\ndb 0x4d, 0xab, 0x5f, 0x6d, 0xb2, 0xae, 0xdf, 0x1a, 0x0e, 0xa9, 0x10, 0x37, 0xe9, 0xf7, 0xef, 0x29\ndb 0xea, 0xe1, 0x39, 0xaf, 0xbc, 0xb1, 0xd0, 0x4f, 0x33, 0x69, 0xe7, 0x79, 0xdf, 0xfb, 0x58, 0x51\ndb 0x95, 0x3e, 0xc1, 0x5b, 0x53, 0x49, 0xbf, 0x85, 0xf5, 0xde, 0x32, 0x3b, 0xf0, 0x25, 0x46, 0x2d\ndb 0xb4, 0x49, 0xbf, 0x63, 0x93, 0x9c, 0xac, 0x32, 0xfb, 0xc2, 0x03, 0x5e, 0x45, 0x77, 0x41, 0xf9\ndb 0x38, 0x1e, 0x3c, 0xa0, 0xf6, 0x02, 0x08, 0xe8, 0x19, 0xf4, 0x13, 0xb3, 0x96, 0x15, 0xe8, 0x46\ndb 0xe7, 0x50, 0x5c, 0x8b, 0x79, 0x5c, 0x36, 0x72, 0x2f, 0x77, 0x0a, 0x68, 0x7a, 0x2f, 0x06, 0x01\ndb 0x29, 0x1c, 0xd3, 0x76, 0xf2, 0x32, 0x8e, 0xea, 0x55, 0x47, 0xd9, 0xe0, 0xc6, 0x1d, 0x87, 0xdb\ndb 0x9e, 0xd7, 0xe8, 0xb2, 0x18, 0x60, 0x08, 0x88, 0xc4, 0xdf, 0x7d, 0x0b, 0xfd, 0xfc, 0xb2, 0xeb\ndb 0x17, 0xcd, 0xf0, 0x79, 0xe1, 0xc1, 0x6e, 0x74, 0xc2, 0x64, 0x17, 0xa5, 0x8b, 0xca, 0x20, 0x95\ndb 0x3d, 0xc7, 0xe5, 0x30, 0x3d, 0x32, 0x80, 0xd5, 0x32, 0x74, 0x30, 0xf1, 0x09, 0x56, 0x79, 0x22\ndb 0x07, 0x48, 0x03, 0x55, 0x3c, 0x19, 0xec, 0x88, 0xa2, 0xe6, 0xa2, 0x98, 0x13, 0x7b, 0x14, 0x3f\ndb 0xa6, 0x8f, 0xef, 0xbc, 0xfc, 0x4e, 0x6e, 0x25, 0x7e, 0xcc, 0x54, 0x5f, 0x9f, 0x16, 0xe5, 0xb5\ndb 0x24, 0xcc, 0xe8, 0xde, 0xfb, 0x36, 0xad, 0xbe, 0x00, 0x34, 0x32, 0x6c, 0x78, 0xcf, 0xc7, 0x2a\ndb 0xb0, 0xef, 0x07, 0x67, 0x73, 0x59, 0x4b, 0xc4, 0x58, 0x47, 0xbf, 0x19, 0x0f, 0x5f, 0x87, 0xbf\ndb 0x14, 0x2c, 0xa1, 0xc7, 0xa1, 0x48, 0xe2, 0x3a, 0x48, 0x1b, 0x2c, 0x0f, 0x52, 0xe0, 0x43, 0x9a\ndb 0x32, 0x10, 0x0a, 0xdb, 0x27, 0x30, 0x01, 0x55, 0x89, 0x1c, 0x5e, 0xc3, 0x10, 0xf2, 0x48, 0x78\ndb 0xd7, 0xf7, 0xba, 0xa4, 0x67, 0xda, 0xb4, 0x16, 0x99, 0x44, 0x41, 0x26, 0x85, 0xb6, 0x45, 0xec\ndb 0x0a, 0x26, 0xf4, 0xfc, 0x3b, 0x6a, 0x55, 0x1d, 0x62, 0xc9, 0xa4, 0x3b, 0x20, 0x54, 0x7c, 0x3e\ndb 0xb6, 0xd3, 0x88, 0xe5, 0x54, 0xb5, 0xeb, 0xd1, 0x30, 0xb9, 0x98, 0xda, 0x4d, 0x2c, 0x81, 0xf3\ndb 0x4b, 0x54, 0x3a, 0x24, 0x59, 0x4f, 0x13, 0x58, 0x7f, 0xa0, 0x5b, 0x1f, 0xd6, 0x0a, 0x7a, 0xb5\ndb 0x36, 0x6b, 0x2f, 0xaa, 0x53, 0xda, 0xe6, 0xa8, 0x61, 0x83, 0x16, 0x3c, 0xa6, 0x81, 0x78, 0xd2\ndb 0x77, 0x0a, 0x30, 0x76, 0x0e, 0x56, 0x6a, 0x66, 0xa6, 0x5c, 0x91, 0xc8, 0xec, 0xa2, 0x99, 0xa0\ndb 0x67, 0x5b, 0x21, 0x37, 0x38, 0x01, 0x27, 0x27, 0x8b, 0x1c, 0xd0, 0xe4, 0x91, 0x43, 0xe0, 0xcb\ndb 0xe5, 0x4b, 0xa0, 0xe7, 0x1c, 0x3f, 0x33, 0x3f, 0xb4, 0x42, 0xb0, 0x64, 0x34, 0xde, 0x8d, 0x35\ndb 0x2e, 0x59, 0x21, 0xab, 0xa6, 0x71, 0xc9, 0x3a, 0x65, 0x83, 0xa6, 0x0c, 0xb0, 0x36, 0xa0, 0xe2\ndb 0xb0, 0xb9, 0x8b, 0x5c, 0x2e, 0x3b, 0xa1, 0x03, 0x96, 0x6e, 0x63, 0x9c, 0x2a, 0x02, 0xbd, 0x2b\ndb 0x21, 0xf9, 0xee, 0x75, 0xab, 0xf4, 0x3c, 0xf4, 0x64, 0xb1, 0xbb, 0x97, 0x10, 0x3a, 0x02, 0x60\ndb 0x3e, 0x93, 0x97, 0xfd, 0xb4, 0xcb, 0x2f, 0x31, 0x80, 0x7f, 0x74, 0x23, 0x35, 0x6d, 0x4a, 0x83\ndb 0xa6, 0x70, 0x7b, 0x27, 0xf7, 0xfa, 0x97, 0xe9, 0x54, 0x4d, 0xfe, 0xfd, 0x7c, 0xe8, 0x91, 0x03\ndb 0x6b, 0x61, 0xc4, 0x8c, 0xa2, 0x41, 0x23, 0x52, 0xc3, 0x9b, 0x5d, 0xb6, 0xb5, 0x1b, 0x9f, 0x3b\ndb 0x48, 0x09, 0x59, 0xec, 0x3c, 0x23, 0xfd, 0x9e, 0xa8, 0x76, 0x73, 0x92, 0xab, 0x28, 0x6a, 0x57\ndb 0xe4, 0x88, 0x25, 0x2b, 0x6d, 0xbf, 0xf8, 0xc2, 0xe6, 0xdb, 0x48, 0x58, 0x0a, 0x06, 0xae, 0xd0\ndb 0x78, 0x25, 0x61, 0xd5, 0xcd, 0x60, 0xf9, 0xf1, 0xaf, 0xb3, 0xb8, 0x86, 0x2f, 0x00, 0x4b, 0xe1\ndb 0xe6, 0xbd, 0x46, 0xdb, 0x91, 0x76, 0xea, 0x22, 0xb5, 0x85, 0x32, 0x3a, 0x41, 0x6a, 0xfb, 0x86\ndb 0x45, 0xc9, 0x3e, 0xb1, 0xcb, 0x1d, 0xee, 0x8e, 0x58, 0xcf, 0x24, 0x6b, 0xb1, 0xc5, 0xe0, 0xda\ndb 0x30, 0xc9, 0xa9, 0x36, 0x5b, 0xeb, 0xc1, 0x93, 0x32, 0x60, 0x15, 0x0a, 0x41, 0xa0, 0x64, 0x0c\ndb 0x30, 0x89, 0x6e, 0xda, 0xab, 0x7e, 0x49, 0x44, 0xbc, 0xb4, 0x92, 0x0c, 0x29, 0xee, 0xd5, 0x03\ndb 0xe0, 0xd7, 0x96, 0xcf, 0x00, 0xf8, 0xaf, 0x89, 0xf2, 0xe0, 0x3a, 0x23, 0x45, 0x1a, 0x73, 0x4d\ndb 0x3f, 0x59, 0x50, 0xe5, 0x98, 0x2a, 0x78, 0x0f, 0x07, 0x31, 0xd2, 0x89, 0x69, 0xa2, 0xe9, 0x8d\ndb 0xe4, 0xab, 0x41, 0x8b, 0xe9, 0x83, 0x5e, 0xbc, 0xf9, 0x81, 0xbf, 0xe8, 0x24, 0xa4, 0x9d, 0x0a\ndb 0xd0, 0x7c, 0x3b, 0x40, 0x69, 0x93, 0x26, 0x42, 0x23, 0xb1, 0x38, 0xfa, 0x22, 0x25, 0x15, 0xb5\ndb 0x17, 0xb8, 0xa0, 0xc3, 0xb0, 0x80, 0x98, 0x04, 0x85, 0x91, 0x2b, 0xa8, 0x79, 0x34, 0xf9, 0x74\ndb 0x9e, 0x49, 0xad, 0xcf, 0xca, 0xf6, 0x06, 0xd3, 0xdf, 0x27, 0xb6, 0xd8, 0x19, 0x14, 0x84, 0xee\ndb 0xe6, 0x9c, 0x7c, 0x41, 0x07, 0xbd, 0x26, 0x7b, 0x3c, 0x81, 0x20, 0x8f, 0x1d, 0x50, 0x2d, 0xdd\ndb 0x31, 0xb9, 0x5a, 0x4c, 0xc0, 0x89, 0x68, 0x79, 0xb4, 0x9e, 0xe6, 0x57, 0x44, 0xee, 0x32, 0xbb\ndb 0x69, 0xf7, 0x35, 0xbc, 0xcf, 0x96, 0xa7, 0xe0, 0xb4, 0x38, 0xce, 0xde, 0xb9, 0xf6, 0xfe, 0x5a\ndb 0xb9, 0xe7, 0x3c, 0x01, 0xf2, 0xbd, 0xa8, 0x26, 0xf6, 0x29, 0x0b, 0xe6, 0xd7, 0xe7, 0xa5, 0x62\ndb 0xb0, 0x0c, 0x9b, 0x01, 0x4f, 0x18, 0x9e, 0x40, 0x28, 0x2a, 0xbb, 0x21, 0xe6, 0x8d, 0x93, 0x22\ndb 0xbd, 0x01, 0xfc, 0x78, 0x93, 0x29, 0x55, 0x8f, 0x17, 0xe8, 0x09, 0x07, 0xf8, 0x30, 0x20, 0x68\ndb 0xf2, 0x95, 0xc1, 0x50, 0xad, 0x12, 0x35, 0x46, 0x52, 0x65, 0xaa, 0xb7, 0x35, 0x50, 0x22, 0x91\ndb 0x36, 0x74, 0x86, 0xab, 0x4b, 0xe8, 0xfd, 0x42, 0x76, 0x41, 0x4a, 0xb4, 0x2c, 0x59, 0x36, 0xc9\ndb 0xd6, 0xdb, 0x7e, 0xa1, 0x60, 0xcf, 0x13, 0x62, 0x0c, 0x93, 0xdd, 0x3e, 0xfc, 0x3e, 0x36, 0xfc\ndb 0xfd, 0x7e, 0x48, 0x69, 0x0f, 0x6a, 0xdf, 0x3c, 0xc0, 0x35, 0xcf, 0x81, 0x4b, 0x79, 0x15, 0x2d\ndb 0xda, 0x5a, 0x7f, 0xef, 0xe1, 0x13, 0x75, 0xef, 0xad, 0x80, 0xf7, 0x4e, 0xa1, 0xfd, 0x5d, 0xf8\ndb 0x67, 0xc4, 0x4a, 0xe5, 0x9f, 0x28, 0xe8, 0x82, 0xe5, 0xae, 0xac, 0xef, 0xb9, 0x4b, 0xca, 0x44\ndb 0x9b, 0xdc, 0xf2, 0xd2, 0x57, 0xa6, 0x9c, 0x5e, 0xbb, 0xd5, 0x4e, 0x31, 0xa8, 0xfa, 0x32, 0x26\ndb 0x4d, 0x46, 0x0d, 0xcb, 0xcf, 0x9e, 0x1a, 0xa3, 0x50, 0x69, 0x06, 0x34, 0xd8, 0xf9, 0x5d, 0xaf\ndb 0x4f, 0xc5, 0x2b, 0xe0, 0x8b, 0x81, 0x76, 0xc5, 0xce, 0x74, 0x4b, 0xba, 0x02, 0xba, 0xd4, 0x8b\ndb 0x91, 0xc5, 0x54, 0x28, 0x41, 0x77, 0x5f, 0xaa, 0x83, 0x14, 0xba, 0xf7, 0x8c, 0x51, 0xe2, 0xea\ndb 0xcf, 0x71, 0x40, 0x2f, 0x07, 0x82, 0xed, 0x81, 0x8c, 0x4f, 0xd3, 0x28, 0xce, 0x5c, 0x16, 0x72\ndb 0x4f, 0xcc, 0xe8, 0x49, 0x04, 0xae, 0x11, 0xe4, 0xbb, 0x18, 0x6d, 0xc4, 0xb3, 0x30, 0x20, 0xf7\ndb 0x0c, 0xe8, 0x50, 0x68, 0x37, 0xe9, 0x48, 0x76, 0x8b, 0x33, 0xea, 0xbb, 0x0d, 0x52, 0xbb, 0xab\ndb 0x6a, 0x62, 0xf4, 0x06, 0xbe, 0x5d, 0x7e, 0x89, 0xfb, 0xca, 0x75, 0xe6, 0xf7, 0x27, 0x59, 0x7c\ndb 0x91, 0x1a, 0xa3, 0xbb, 0x5a, 0x72, 0xd4, 0x3c, 0x19, 0xa8, 0x00, 0x74, 0x12, 0x24, 0x1c, 0x49\ndb 0xd9, 0x87, 0xd2, 0xc2, 0x98, 0x63, 0x7a, 0x0e, 0x5c, 0x39, 0x6b, 0x44, 0x29, 0xee, 0xef, 0x18\ndb 0xd1, 0xab, 0x15, 0xe0, 0x79, 0x50, 0x2a, 0x21, 0xc2, 0x67, 0x21, 0xab, 0x3c, 0x54, 0xc6, 0xf4\ndb 0xc6, 0x67, 0x96, 0x38, 0x37, 0xb6, 0xd2, 0x1b, 0xf0, 0xf6, 0xf8, 0x03, 0x60, 0x1c, 0xd8, 0x28\ndb 0xb2, 0x47, 0x53, 0x97, 0xf3, 0x1e, 0xd0, 0xcd, 0xd8, 0x30, 0xad, 0x24, 0xe7, 0xd9, 0x38, 0x97\ndb 0xb4, 0xc3, 0x1b, 0xb3, 0xea, 0x28, 0x40, 0x99, 0x29, 0x3e, 0x8f, 0x30, 0xb2, 0x55, 0xca, 0x7b\n"
  },
  {
    "path": "unittests/ASM/jump.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RAX\": \"0x1\"\n  }\n}\n%endif\n\nmov esi, 50\n\n.jump_start:\nmov edi, 1\ntest edi, edi\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n\njz .local\nmov eax, 1\njmp .end\n\n.local:\nmov eax, 0\n\n.end:\nsub esi, 1\ntest esi, esi\njz .jump_start\nhlt\n"
  },
  {
    "path": "unittests/ASM/lea.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RAX\": \"0x1BD5B7DDE\",\n    \"RBX\": \"0x0DEADBF18\"\n  }\n}\n%endif\n\nmov r15, 0xDEADBEEF\nmov r14, 0x5\n\nlea rax, [r15*2]\nlea rbx, [r15+r14*8 + 1]\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/modrm_oob/DDD.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\",\n    \"0x100002000\": \"4096\"\n  }\n}\n%endif\n\nmov r15, 0x100001000\nmov r14, 0x100002000\nmov rax, 0\n\n%include \"modrm_oob_macros.mac\"\n\n; DDD\nr3 pi2fw, 8, mm0\nr3 pi2fd, 8, mm0\nr3 pf2iw, 8, mm0\nr3 pf2id, 8, mm0\nr3 pfrcpv, 8, mm0\nr3 pfrsqrtv, 8, mm0\nr3 pfnacc, 8, mm0\nr3 pfpnacc, 8, mm0\nr3 pfcmpge, 8, mm0\nr3 pfmin, 8, mm0\nr3 pfrcp, 8, mm0\nr3 pfrsqrt, 8, mm0\nr3 pfsub, 8, mm0\nr3 pfadd, 8, mm0\nr3 pfcmpgt, 8, mm0\nr3 pfmax, 8, mm0\nr3 pfrcpit1, 8, mm0\nr3 pfrsqit1, 8, mm0\nr3 pfsubr, 8, mm0\nr3 pfacc, 8, mm0\nr3 pfcmpeq, 8, mm0\nr3 pfmul, 8, mm0\nr3 pfrcpit2, 8, mm0\n; Nasm doesn't understand this instruction.\n; r3 pmulhrw, 8, mm0\nr3 pswapd, 8, mm0\nr3 pavgusb, 8, mm0\n\n; Done\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/modrm_oob/H0F38.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\",\n    \"0x100002000\": \"4096\"\n  }\n}\n%endif\n\nmov r15, 0x100001000\nmov r14, 0x100002000\nmov rax, 0\n\n%include \"modrm_oob_macros.mac\"\n\n; H0F38\nr3 pshufb, 8, mm0\nr3 pshufb, 16, xmm0\n\nr3 phaddw, 8, mm0\nr3 phaddw, 16, xmm0\n\nr3 phaddd, 8, mm0\nr3 phaddd, 16, xmm0\n\nr3 phaddsw, 8, mm0\nr3 phaddsw, 16, xmm0\n\nr3 pmaddubsw, 8, mm0\nr3 pmaddubsw, 16, xmm0\n\nr3 phsubw, 8, mm0\nr3 phsubw, 16, xmm0\n\nr3 phsubd, 8, mm0\nr3 phsubd, 16, xmm0\n\nr3 phsubsw, 8, mm0\nr3 phsubsw, 16, xmm0\n\nr3 psignb, 8, mm0\nr3 psignb, 16, xmm0\n\nr3 psignw, 8, mm0\nr3 psignw, 16, xmm0\n\nr3 psignd, 8, mm0\nr3 psignd, 16, xmm0\n\nr3 pmulhrsw, 8, mm0\nr3 pmulhrsw, 16, xmm0\n\nr3 pblendvb, 16, xmm0\nr3 blendvps, 16, xmm0\nr3 blendvpd, 16, xmm0\nr3 ptest, 16, xmm0\n\nr3 pabsb, 8, mm0\nr3 pabsb, 16, xmm0\n\nr3 pabsw, 8, mm0\nr3 pabsw, 16, xmm0\n\nr3 pabsd, 8, mm0\nr3 pabsd, 16, xmm0\n\nr3 pmovsxbw, 16, xmm0\nr3 pmovsxbd, 16, xmm0\nr3 pmovsxbq, 16, xmm0\nr3 pmovsxwd, 16, xmm0\nr3 pmovsxwq, 16, xmm0\nr3 pmovsxdq, 16, xmm0\nr3 pmuldq, 16, xmm0\nr3 pcmpeqq, 16, xmm0\nr3 movntdqa, 16, xmm0\nr3 packusdw, 16, xmm0\nr3 pmovzxbw, 16, xmm0\nr3 pmovzxbd, 16, xmm0\nr3 pmovzxbq, 16, xmm0\nr3 pmovzxwd, 16, xmm0\nr3 pmovzxwq, 16, xmm0\nr3 pmovzxdq, 16, xmm0\nr3 pcmpgtq, 16, xmm0\nr3 pminsb, 16, xmm0\nr3 pminsd, 16, xmm0\nr3 pminuw, 16, xmm0\nr3 pminud, 16, xmm0\nr3 pmaxsb, 16, xmm0\nr3 pmaxsd, 16, xmm0\nr3 pmaxuw, 16, xmm0\nr3 pmaxud, 16, xmm0\nr3 pmulld, 16, xmm0\nr3 sha1nexte, 16, xmm0\nr3 sha1msg1, 16, xmm0\nr3 sha1msg2, 16, xmm0\nr3 sha256rnds2, 16, xmm0\nr3 sha256msg1, 16, xmm0\nr3 sha256msg2, 16, xmm0\nr3 aesimc, 16, xmm0\nr3 aesenc, 16, xmm0\nr3 aesenclast, 16, xmm0\nr3 aesdec, 16, xmm0\nr3 aesdeclast, 16, xmm0\n\nrw3 movbe, 2, ax\nrw3 movbe, 4, eax\nrw3 movbe, 8, rax\n\nr4_size crc32, 1, byte, eax\nr4_size crc32, 2, word, eax\nr4_size crc32, 4, dword, eax\nr4_size crc32, 8, qword, rax\n\nr3 adcx, 4, eax\nr3 adcx, 8, rax\n\nr3 adox, 4, eax\nr3 adox, 8, rax\n\n; Done\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/modrm_oob/H0F3A.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\",\n    \"0x100002000\": \"4096\"\n  }\n}\n%endif\n\nmov r15, 0x100001000\nmov r14, 0x100002000\nmov rax, 0\n\n%include \"modrm_oob_macros.mac\"\n\n; H0F3A\nw4 pextrq, 8, xmm0, 0\nr4 pinsrq, 8, xmm0, 0\nw4 pextrd, 4, xmm0, 0\nr4 pinsrd, 4, xmm0, 0\n\nr4 palignr, 8, mm0, 0\nr4 palignr, 16, xmm0, 0\nr4 roundps, 16, xmm0, 0\nr4 roundpd, 16, xmm0, 0\nr4 roundpd, 16, xmm0, 0\nr4 roundss, 4, xmm0, 0\nr4 roundsd, 8, xmm0, 0\nr4 blendps, 16, xmm0, 0\nr4 blendpd, 16, xmm0, 0\nr4 pblendw, 16, xmm0, 0\nr4 palignr, 8, mm0, 0\nr4 palignr, 16, xmm0, 0\nw4 pextrb, 1, xmm0, 0\nw4 pextrw, 2, xmm0, 0\nw4 extractps, 4, xmm0, 0\nr4 pinsrb, 1, xmm0, 0\nr4 insertps, 4, xmm0, 0\nr4 dpps, 16, xmm0, 0\nr4 dppd, 16, xmm0, 0\nr4 mpsadbw, 16, xmm0, 0\nr4 pclmulqdq, 16, xmm0, 0\nr4 pcmpestrm, 16, xmm0, 0\nr4 pcmpestri, 16, xmm0, 0\nr4 pcmpistrm, 16, xmm0, 0\nr4 pcmpistri, 16, xmm0, 0\nr4 sha1rnds4, 16, xmm0, 0\nr4 aeskeygenassist, 16, xmm0, 0\n\n; Done\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/modrm_oob/Primary.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\",\n    \"0x100002000\": \"4096\"\n  }\n}\n%endif\n\nmov r15, 0x100001000\nmov r14, 0x100002000\nmov rax, 0\n\n%include \"modrm_oob_macros.mac\"\n\n; Primary table\nrw3 add, 8, rax\nrw3 add, 4, eax\nrw3 add, 2, ax\nrw3 add, 1, al\n\nw3 lock add, 8, rax\nw3 lock add, 4, eax\nw3 lock add, 2, ax\nw3 lock add, 1, al\n\nrw3 or, 8, rax\nrw3 or, 4, eax\nrw3 or, 2, ax\nrw3 or, 1, al\n\nw3 lock or, 8, rax\nw3 lock or, 4, eax\nw3 lock or, 2, ax\nw3 lock or, 1, al\n\nrw3 adc, 8, rax\nrw3 adc, 4, eax\nrw3 adc, 2, ax\nrw3 adc, 1, al\n\nw3 lock adc, 8, rax\nw3 lock adc, 4, eax\nw3 lock adc, 2, ax\nw3 lock adc, 1, al\n\nrw3 sbb, 8, rax\nrw3 sbb, 4, eax\nrw3 sbb, 2, ax\nrw3 sbb, 1, al\n\nw3 lock sbb, 8, rax\nw3 lock sbb, 4, eax\nw3 lock sbb, 2, ax\nw3 lock sbb, 1, al\n\nrw3 and, 8, rax\nrw3 and, 4, eax\nrw3 and, 2, ax\nrw3 and, 1, al\n\nw3 lock and, 8, rax\nw3 lock and, 4, eax\nw3 lock and, 2, ax\nw3 lock and, 1, al\n\nrw3 xor, 8, rax\nrw3 xor, 4, eax\nrw3 xor, 2, ax\nrw3 xor, 1, al\n\nw3 lock xor, 8, rax\nw3 lock xor, 4, eax\nw3 lock xor, 2, ax\nw3 lock xor, 1, al\n\nrw3 cmp, 8, rax\nrw3 cmp, 4, eax\nrw3 cmp, 2, ax\nrw3 cmp, 1, al\n\nr4 imul, 8, rax, 4\nr4 imul, 4, eax, 4\nr4 imul, 2, ax, 4\n\nr4 imul, 8, rax, 0x1004\nr4 imul, 4, eax, 0x1004\nr4 imul, 2, ax, 0x1004\n\nrw3 test, 8, rax\nrw3 test, 4, eax\nrw3 test, 2, ax\nrw3 test, 1, al\n\nrw3 xchg, 8, rax\nrw3 xchg, 4, eax\nrw3 xchg, 2, ax\nrw3 xchg, 1, al\n\nrw3 mov, 8, rax\nrw3 mov, 4, eax\nrw3 mov, 2, ax\nrw3 mov, 1, al\n\nr3 movsxd, 4, rax\n\n; Done\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/modrm_oob/PrimaryGroup.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\",\n    \"0x100002000\": \"4096\"\n  }\n}\n%endif\n\nmov r15, 0x100001000\nmov r14, 0x100002000\nmov rax, 0\n\n%include \"modrm_oob_macros.mac\"\n\n; Primary Group\n\nw4_size add, 1, byte, 1\nw4_size add, 2, word, 1\nw4_size add, 4, dword, 1\nw4_size add, 8, qword, 1\n\nw4_size lock add, 1, byte, 1\nw4_size lock add, 2, word, 1\nw4_size lock add, 4, dword, 1\nw4_size lock add, 8, qword, 1\n\nw4_size or, 1, byte, 1\nw4_size or, 2, word, 1\nw4_size or, 4, dword, 1\nw4_size or, 8, qword, 1\n\nw4_size lock or, 1, byte, 1\nw4_size lock or, 2, word, 1\nw4_size lock or, 4, dword, 1\nw4_size lock or, 8, qword, 1\n\nw4_size adc, 1, byte, 1\nw4_size adc, 2, word, 1\nw4_size adc, 4, dword, 1\nw4_size adc, 8, qword, 1\n\nw4_size lock adc, 1, byte, 1\nw4_size lock adc, 2, word, 1\nw4_size lock adc, 4, dword, 1\nw4_size lock adc, 8, qword, 1\n\nw4_size sbb, 1, byte, 1\nw4_size sbb, 2, word, 1\nw4_size sbb, 4, dword, 1\nw4_size sbb, 8, qword, 1\n\nw4_size lock sbb, 1, byte, 1\nw4_size lock sbb, 2, word, 1\nw4_size lock sbb, 4, dword, 1\nw4_size lock sbb, 8, qword, 1\n\nw4_size and, 1, byte, 1\nw4_size and, 2, word, 1\nw4_size and, 4, dword, 1\nw4_size and, 8, qword, 1\n\nw4_size lock and, 1, byte, 1\nw4_size lock and, 2, word, 1\nw4_size lock and, 4, dword, 1\nw4_size lock and, 8, qword, 1\n\nw4_size sub, 1, byte, 1\nw4_size sub, 2, word, 1\nw4_size sub, 4, dword, 1\nw4_size sub, 8, qword, 1\n\nw4_size lock sub, 1, byte, 1\nw4_size lock sub, 2, word, 1\nw4_size lock sub, 4, dword, 1\nw4_size lock sub, 8, qword, 1\n\nw4_size xor, 1, byte, 1\nw4_size xor, 2, word, 1\nw4_size xor, 4, dword, 1\nw4_size xor, 8, qword, 1\n\nw4_size lock xor, 1, byte, 1\nw4_size lock xor, 2, word, 1\nw4_size lock xor, 4, dword, 1\nw4_size lock xor, 8, qword, 1\n\nw4_size cmp, 1, byte, 1\nw4_size cmp, 2, word, 1\nw4_size cmp, 4, dword, 1\nw4_size cmp, 8, qword, 1\n\nw4_size rol, 1, byte, 1\nw4_size rol, 2, word, 1\nw4_size rol, 4, dword, 1\nw4_size rol, 8, qword, 1\n\nw4_size ror, 1, byte, 1\nw4_size ror, 2, word, 1\nw4_size ror, 4, dword, 1\nw4_size ror, 8, qword, 1\n\nw4_size rcl, 1, byte, 1\nw4_size rcl, 2, word, 1\nw4_size rcl, 4, dword, 1\nw4_size rcl, 8, qword, 1\n\nw4_size rcr, 1, byte, 1\nw4_size rcr, 2, word, 1\nw4_size rcr, 4, dword, 1\nw4_size rcr, 8, qword, 1\n\nw4_size shl, 1, byte, 1\nw4_size shl, 2, word, 1\nw4_size shl, 4, dword, 1\nw4_size shl, 8, qword, 1\n\nw4_size shr, 1, byte, 1\nw4_size shr, 2, word, 1\nw4_size shr, 4, dword, 1\nw4_size shr, 8, qword, 1\n\nw4_size sar, 1, byte, 1\nw4_size sar, 2, word, 1\nw4_size sar, 4, dword, 1\nw4_size sar, 8, qword, 1\n\nw4_size test, 1, byte, 1\nw4_size test, 2, word, 1\nw4_size test, 4, dword, 1\nw4_size test, 8, qword, 1\n\nw3_size not, 1, byte\nw3_size not, 2, word\nw3_size not, 4, dword\nw3_size not, 8, qword\n\nw3_size lock not, 1, byte\nw3_size lock not, 2, word\nw3_size lock not, 4, dword\nw3_size lock not, 8, qword\n\nw3_size neg, 1, byte\nw3_size neg, 2, word\nw3_size neg, 4, dword\nw3_size neg, 8, qword\n\nw3_size lock neg, 1, byte\nw3_size lock neg, 2, word\nw3_size lock neg, 4, dword\nw3_size lock neg, 8, qword\n\nw3_size mul, 1, byte\nw3_size mul, 2, word\nw3_size mul, 4, dword\nw3_size mul, 8, qword\n\nw3_size imul, 1, byte\nw3_size imul, 2, word\nw3_size imul, 4, dword\nw3_size imul, 8, qword\n\nw3_size div, 1, byte\nw3_size div, 2, word\nw3_size div, 4, dword\nw3_size div, 8, qword\n\nw3_size idiv, 1, byte\nw3_size idiv, 2, word\nw3_size idiv, 4, dword\nw3_size idiv, 8, qword\n\nw3_size inc, 1, byte\nw3_size inc, 2, word\nw3_size inc, 4, dword\nw3_size inc, 8, qword\n\nw3_size lock inc, 1, byte\nw3_size lock inc, 2, word\nw3_size lock inc, 4, dword\nw3_size lock inc, 8, qword\n\nw3_size dec, 1, byte\nw3_size dec, 2, word\nw3_size dec, 4, dword\nw3_size dec, 8, qword\n\nw3_size lock dec, 1, byte\nw3_size lock dec, 2, word\nw3_size lock dec, 4, dword\nw3_size lock dec, 8, qword\n\nw4_size mov, 1, byte, 1\nw4_size mov, 2, word, 1\nw4_size mov, 4, dword, 1\nw4_size mov, 8, qword, 1\n\n; Done\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/modrm_oob/Secondary.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\",\n    \"0x100002000\": \"4096\"\n  }\n}\n%endif\n\nmov r15, 0x100001000\nmov r14, 0x100002000\nmov rax, 0\n\n%include \"modrm_oob_macros.mac\"\n\n; Secondary table\nrw3 movups, 16, xmm0\nrw3 movlps, 8, xmm0\nr3 unpcklps, 16, xmm0\nr3 unpckhps, 16, xmm0\nrw3 movhps, 8, xmm0\nrw3 movaps, 16, xmm0\nr3 cvtpi2ps, 8, xmm0\nw3 movntps, 16, xmm0\nr3 cvttps2pi, 8, mm0\nr3 cvtps2pi, 8, mm0\nr3 ucomiss, 4, xmm0\nr3 comiss, 4, xmm0\n\nr3 cmovo, 8, rax\nr3 cmovo, 4, eax\nr3 cmovo, 2, ax\n\nr3 cmovno, 8, rax\nr3 cmovno, 4, eax\nr3 cmovno, 2, ax\n\nr3 cmovb, 8, rax\nr3 cmovb, 4, eax\nr3 cmovb, 2, ax\n\nr3 cmovnb, 8, rax\nr3 cmovnb, 4, eax\nr3 cmovnb, 2, ax\n\nr3 cmovz, 8, rax\nr3 cmovz, 4, eax\nr3 cmovz, 2, ax\n\nr3 cmovnz, 8, rax\nr3 cmovnz, 4, eax\nr3 cmovnz, 2, ax\n\nr3 cmovbe, 8, rax\nr3 cmovbe, 4, eax\nr3 cmovbe, 2, ax\n\nr3 cmovnbe, 8, rax\nr3 cmovnbe, 4, eax\nr3 cmovnbe, 2, ax\n\nr3 cmovs, 8, rax\nr3 cmovs, 4, eax\nr3 cmovs, 2, ax\n\nr3 cmovns, 8, rax\nr3 cmovns, 4, eax\nr3 cmovns, 2, ax\n\nr3 cmovp, 8, rax\nr3 cmovp, 4, eax\nr3 cmovp, 2, ax\n\nr3 cmovnp, 8, rax\nr3 cmovnp, 4, eax\nr3 cmovnp, 2, ax\n\nr3 cmovl, 8, rax\nr3 cmovl, 4, eax\nr3 cmovl, 2, ax\n\nr3 cmovnl, 8, rax\nr3 cmovnl, 4, eax\nr3 cmovnl, 2, ax\n\nr3 cmovle, 8, rax\nr3 cmovle, 4, eax\nr3 cmovle, 2, ax\n\nr3 cmovnle, 8, rax\nr3 cmovnle, 4, eax\nr3 cmovnle, 2, ax\n\nr3 sqrtps, 16, xmm0\nr3 rsqrtps, 16, xmm0\nr3 rcpps, 16, xmm0\nr3 andps, 16, xmm0\nr3 andnps, 16, xmm0\nr3 orps, 16, xmm0\nr3 xorps, 16, xmm0\nr3 addps, 16, xmm0\nr3 mulps, 16, xmm0\nr3 cvtps2pd, 8, xmm0\nr3 cvtdq2ps, 16, xmm0\nr3 subps, 16, xmm0\nr3 minps, 16, xmm0\nr3 divps, 16, xmm0\nr3 maxps, 16, xmm0\nr3 punpcklbw, 16, xmm0\nr3 punpcklwd, 16, xmm0\nr3 punpckldq, 16, xmm0\nr3 packsswb, 16, xmm0\nr3 pcmpgtb, 16, xmm0\nr3 pcmpgtw, 16, xmm0\nr3 pcmpgtd, 16, xmm0\nr3 packuswb, 16, xmm0\nr3 punpckhbw, 16, xmm0\nr3 punpckhwd, 16, xmm0\nr3 punpckhdq, 16, xmm0\nr3 packssdw, 16, xmm0\n\nrw3 movd, 4, mm0\nrw3 movq, 8, mm0\nr4 pshufw, 8, mm0, 0\nr3 pcmpeqb, 8, mm0\nr3 pcmpeqw, 8, mm0\nr3 pcmpeqd, 8, mm0\n\nrw3 movd, 4, xmm0\nrw3 movq, 8, xmm0\n\nw2 seto, 1\nw2 setno, 1\nw2 setb, 1\nw2 setnb, 1\nw2 setz, 1\nw2 setnz, 1\nw2 setbe, 1\nw2 setnbe, 1\nw2 sets, 1\nw2 setns, 1\nw2 setp, 1\nw2 setnp, 1\nw2 setl, 1\nw2 setnl, 1\nw2 setle, 1\nw2 setnle, 1\n\nmov rax, 0\nw3 bt, 2, ax\nw3 bt, 4, eax\nw3 bt, 8, rax\n\nw4 shld, 2, ax, 1\nw4 shld, 4, eax, 1\nw4 shld, 8, rax, 1\n\nmov cl, 1\nw4 shld, 2, ax, cl\nw4 shld, 4, eax, cl\nw4 shld, 8, rax, cl\n\nmov rax, 0\nw3 bts, 2, ax\nw3 bts, 4, eax\nw3 bts, 8, rax\n\nw4 shrd, 2, ax, 1\nw4 shrd, 4, eax, 1\nw4 shrd, 8, rax, 1\n\nmov cl, 1\nw4 shrd, 2, ax, cl\nw4 shrd, 4, eax, cl\nw4 shld, 8, rax, cl\n\nr3 imul, 8, rax\nr3 imul, 4, eax\nr3 imul, 2, ax\n\nw3 cmpxchg, 8, rax\nw3 cmpxchg, 4, eax\nw3 cmpxchg, 2, ax\nw3 cmpxchg, 1, al\n\nmov rax, 0\nw3 btr, 2, ax\nw3 btr, 4, eax\nw3 btr, 8, rax\n\n; MOVZX is a bit special\nmovzx rax, byte [r15 - 1]\nmovzx rax, byte [r14]\nmovzx rax, word [r15 - 2]\nmovzx rax, word [r14]\n\nmov rax, 0\nw3 btc, 2, ax\nw3 btc, 4, eax\nw3 btc, 8, rax\n\nr3 bsf, 2, ax\nr3 bsf, 4, eax\nr3 bsf, 8, rax\n\nr3 bsr, 2, ax\nr3 bsr, 4, eax\nr3 bsr, 8, rax\n\n; MOVSX is a bit special\nmovsx rax, byte [r15 - 1]\nmovsx rax, byte [r14]\nmovsx rax, word [r15 - 2]\nmovsx rax, word [r14]\n\nw3 xadd, 1, al\nw3 xadd, 2, ax\nw3 xadd, 4, eax\nw3 xadd, 8, rax\n\nw3 lock xadd, 1, al\nw3 lock xadd, 2, ax\nw3 lock xadd, 4, eax\nw3 lock xadd, 8, rax\n\n\nr4 cmpps, 16, xmm0, 0\nr4 cmpps, 16, xmm0, 1\nr4 cmpps, 16, xmm0, 2\nr4 cmpps, 16, xmm0, 3\nr4 cmpps, 16, xmm0, 4\nr4 cmpps, 16, xmm0, 5\nr4 cmpps, 16, xmm0, 6\nr4 cmpps, 16, xmm0, 7\n\nw3 movnti, 4, eax\nw3 movnti, 8, rax\n\nr4 pinsrw, 2, xmm0, 0\nr4 shufps, 16, xmm0, 0\n\nr3 psrlw, 8, mm0\nr3 psrld, 8, mm0\nr3 psrlq, 8, mm0\nr3 paddq, 8, mm0\nr3 pmullw, 8, mm0\nr3 psubusb, 8, mm0\nr3 psubusw, 8, mm0\nr3 pminub, 8, mm0\nr3 pand, 8, mm0\nr3 paddusb, 8, mm0\nr3 paddusw, 8, mm0\nr3 pmaxub, 8, mm0\nr3 pandn, 8, mm0\nr3 pavgb, 8, mm0\nr3 psraw, 8, mm0\nr3 psrad, 8, mm0\nr3 pavgw, 8, mm0\nr3 pmulhuw, 8, mm0\nr3 pmulhw, 8, mm0\n\nw3 movntq, 8, mm0\n\n\nr3 psubsb, 8, mm0\nr3 psubsw, 8, mm0\nr3 pminsw, 8, mm0\nr3 por, 8, mm0\nr3 paddsb, 8, mm0\nr3 paddsw, 8, mm0\nr3 pmaxsw, 8, mm0\nr3 pxor, 8, mm0\nr3 psllw, 8, mm0\nr3 pslld, 8, mm0\nr3 psllq, 8, mm0\nr3 pmuludq, 8, mm0\nr3 pmaddwd, 8, mm0\nr3 psadbw, 8, mm0\nr3 psubb, 8, mm0\nr3 psubw, 8, mm0\nr3 psubd, 8, mm0\nr3 psubq, 8, mm0\nr3 paddb, 8, mm0\nr3 paddw, 8, mm0\nr3 paddd, 8, mm0\n\n; Done\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/modrm_oob/SecondaryGroup.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\",\n    \"0x100002000\": \"4096\"\n  }\n}\n%endif\n\nmov r15, 0x100001000\nmov r14, 0x100002000\nmov rax, 0\n\n%include \"modrm_oob_macros.mac\"\n\n; Secondary Group\n; w2 sldt, 2\n; w2 str, 2\n; w2 verr, 2\n; w2 verw, 2\n; SGDT\n; SIDT\nw2 smsw, 2\n\nw4_size bt, 2, word, 0\nw4_size bt, 4, dword, 0\nw4_size bt, 8, qword, 0\n\nw4_size bts, 2, word, 0\nw4_size bts, 4, dword, 0\nw4_size bts, 8, qword, 0\n\nw4_size btr, 2, word, 0\nw4_size btr, 4, dword, 0\nw4_size btr, 8, qword, 0\n\nw4_size btc, 2, word, 0\nw4_size btc, 4, dword, 0\nw4_size btc, 8, qword, 0\n\nw2 cmpxchg8b, 8\nw2 cmpxchg16b, 16\n\nw2 fxsave, 512\nr2 fxrstor, 512\n\nw2 stmxcsr, 4\nr2 ldmxcsr, 4\n\n; XSAVE/XRSTOR size is variable and can't be tested here.\n\n; Done\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/modrm_oob/SecondaryModRM.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\",\n    \"0x100002000\": \"4096\"\n  }\n}\n%endif\n\nmov r15, 0x100001000\nmov r14, 0x100002000\nmov rax, 0\n\n%include \"modrm_oob_macros.mac\"\n\n; Secondary ModRM\n\n; clzero is a bit special\nlea rax, [r15 - 64]\nclzero rax\n\nlea rax, [r14]\nclzero rax\n\n; Done\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/modrm_oob/SecondaryOpSize.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\",\n    \"0x100002000\": \"4096\"\n  }\n}\n%endif\n\nmov r15, 0x100001000\nmov r14, 0x100002000\nmov rax, 0\n\n%include \"modrm_oob_macros.mac\"\n\n; Secondary Opsize\nrw3 movupd, 16, xmm0\nrw3 movlpd, 8, xmm0\nr3 unpcklpd, 16, xmm0\nr3 unpckhpd, 16, xmm0\nrw3 movhpd, 8, xmm0\nrw3 movapd, 16, xmm0\nr3 cvtpi2pd, 8, xmm0\nw3 movntpd, 16, xmm0\nr3 cvttpd2pi, 16, mm0\nr3 cvtpd2pi, 16, mm0\nr3 ucomisd, 8, xmm0\nr3 comisd, 8, xmm0\n\nr3 sqrtpd, 16, xmm0\nr3 andpd, 16, xmm0\nr3 andnpd, 16, xmm0\nr3 orpd, 16, xmm0\nr3 xorpd, 16, xmm0\nr3 addpd, 16, xmm0\nr3 mulpd, 16, xmm0\nr3 cvtpd2ps, 16, xmm0\nr3 cvtps2dq, 16, xmm0\nr3 subpd, 16, xmm0\nr3 minpd, 16, xmm0\nr3 divpd, 16, xmm0\nr3 maxpd, 16, xmm0\n\nr3 punpcklbw, 16, xmm0\nr3 punpcklwd, 16, xmm0\nr3 punpckldq, 16, xmm0\nr3 packsswb, 16, xmm0\nr3 pcmpgtb, 16, xmm0\nr3 pcmpgtw, 16, xmm0\nr3 pcmpgtd, 16, xmm0\nr3 packuswb, 16, xmm0\nr3 punpckhbw, 16, xmm0\nr3 punpckhwd, 16, xmm0\nr3 punpckhdq, 16, xmm0\nr3 packssdw, 16, xmm0\nr3 punpcklqdq, 16, xmm0\nr3 punpckhqdq, 16, xmm0\n\nrw3 movdqa, 16, xmm0\n\nr4 pshufd, 16, xmm0, 1\n\nr3 pcmpeqb, 16, xmm0\nr3 pcmpeqw, 16, xmm0\nr3 pcmpeqd, 16, xmm0\nr3 haddpd, 16, xmm0\nr3 hsubpd, 16, xmm0\n\nr4 cmppd, 16, xmm0, 0\nr4 cmppd, 16, xmm0, 1\nr4 cmppd, 16, xmm0, 2\nr4 cmppd, 16, xmm0, 3\nr4 cmppd, 16, xmm0, 4\nr4 cmppd, 16, xmm0, 5\nr4 cmppd, 16, xmm0, 6\nr4 cmppd, 16, xmm0, 7\n\nr4 pinsrw, 2, xmm0, 0\nw4 pextrw, 2, xmm0, 0\n\nr4 shufpd, 16, xmm0, 0\nr3 addsubpd, 16, xmm0\nr3 psrlw, 16, xmm0\nr3 psrld, 16, xmm0\nr3 psrlq, 16, xmm0\nr3 paddq, 16, xmm0\nr3 psubusb, 16, xmm0\nr3 psubusw, 16, xmm0\nr3 pminub, 16, xmm0\nr3 pand, 16, xmm0\nr3 paddusb, 16, xmm0\nr3 paddusw, 16, xmm0\nr3 pmaxub, 16, xmm0\nr3 pandn, 16, xmm0\n\nr3 pavgb, 16, xmm0\nr3 psraw, 16, xmm0\nr3 psrad, 16, xmm0\nr3 pavgw, 16, xmm0\nr3 pmulhuw, 16, xmm0\nr3 pmulhw, 16, xmm0\nr3 cvttpd2dq, 16, xmm0\nw3 movntdq, 16, xmm0\nr3 psubsb, 16, xmm0\nr3 pminsw, 16, xmm0\nr3 por, 16, xmm0\nr3 paddsb, 16, xmm0\nr3 paddsw, 16, xmm0\nr3 pmaxsw, 16, xmm0\nr3 pxor, 16, xmm0\nr3 psllw, 16, xmm0\nr3 pslld, 16, xmm0\nr3 psllq, 16, xmm0\nr3 pmuludq, 16, xmm0\nr3 pmaddwd, 16, xmm0\nr3 psadbw, 16, xmm0\nr3 psubb, 16, xmm0\nr3 psubw, 16, xmm0\nr3 psubd, 16, xmm0\nr3 psubq, 16, xmm0\nr3 paddb, 16, xmm0\nr3 paddw, 16, xmm0\nr3 paddd, 16, xmm0\n\n; Done\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/modrm_oob/SecondaryREP.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\",\n    \"0x100002000\": \"4096\"\n  }\n}\n%endif\n\nmov r15, 0x100001000\nmov r14, 0x100002000\nmov rax, 0\n\n%include \"modrm_oob_macros.mac\"\n\n; Secondary REP\nrw3 movss, 4, xmm0\nr3 movsldup, 16, xmm0\nr3 movshdup, 16, xmm0\n\n; cvtsi2ss is a bit special\ncvtsi2ss xmm0, dword [r15 - 4]\ncvtsi2ss xmm0, dword [r14]\n\ncvtsi2ss xmm0, qword [r15 - 8]\ncvtsi2ss xmm0, qword [r14]\n\nw3 movntss, 4, xmm0\n\nr3 cvttss2si, 4, eax\nr3 cvttss2si, 8, rax\n\nr3 cvtss2si, 4, eax\nr3 cvtss2si, 8, rax\n\nr3 sqrtss, 4, xmm0\nr3 rsqrtss, 4, xmm0\nr3 rcpss, 4, xmm0\nr3 addss, 4, xmm0\nr3 mulss, 4, xmm0\nr3 cvtss2sd, 4, xmm0\nr3 cvttps2dq, 16, xmm0\nr3 subss, 4, xmm0\nr3 minss, 4, xmm0\nr3 divss, 4, xmm0\nr3 maxss, 4, xmm0\n\nrw3 movdqu, 16, xmm0\nr4 pshufhw, 16, xmm0, 0\nrw3 movq, 8, xmm0\n\nr3 popcnt, 2, ax\nr3 popcnt, 4, eax\nr3 popcnt, 8, rax\n\nr3 tzcnt, 2, ax\nr3 tzcnt, 4, eax\nr3 tzcnt, 8, rax\n\nr3 lzcnt, 2, ax\nr3 lzcnt, 4, eax\nr3 lzcnt, 8, rax\n\nr4 cmpss, 4, xmm0, 0\nr4 cmpss, 4, xmm0, 1\nr4 cmpss, 4, xmm0, 2\nr4 cmpss, 4, xmm0, 3\nr4 cmpss, 4, xmm0, 4\nr4 cmpss, 4, xmm0, 5\nr4 cmpss, 4, xmm0, 6\nr4 cmpss, 4, xmm0, 7\n\nr3 cvtdq2pd, 8, xmm0\n\n; Done\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/modrm_oob/SecondaryREPNE.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\",\n    \"0x100002000\": \"4096\"\n  }\n}\n%endif\n\nmov r15, 0x100001000\nmov r14, 0x100002000\nmov rax, 0\n\n%include \"modrm_oob_macros.mac\"\n\n; Secondary REPNE\nrw3 movsd, 8, xmm0\nr3 movddup, 8, xmm0\n\n; cvtsi2sd is a bit special\ncvtsi2sd xmm0, dword [r15 - 4]\ncvtsi2sd xmm0, dword [r14]\n\ncvtsi2sd xmm0, qword [r15 - 8]\ncvtsi2sd xmm0, qword [r14]\n\nw3 movntsd, 8, xmm0\n\nr3 cvttsd2si, 8, rax\nr3 cvtsd2si, 8, rax\n\nr3 sqrtsd, 8, xmm0\nr3 addsd, 8, xmm0\nr3 mulsd, 8, xmm0\nr3 cvtsd2ss, 8, xmm0\nr3 subsd, 8, xmm0\nr3 minsd, 8, xmm0\nr3 divsd, 8, xmm0\nr3 maxsd, 8, xmm0\n\nr4 pshuflw, 16, xmm0, 0\nr3 haddps, 16, xmm0\nr3 hsubps, 16, xmm0\n\nr4 cmpsd, 8, xmm0, 0\nr4 cmpsd, 8, xmm0, 1\nr4 cmpsd, 8, xmm0, 2\nr4 cmpsd, 8, xmm0, 3\nr4 cmpsd, 8, xmm0, 4\nr4 cmpsd, 8, xmm0, 5\nr4 cmpsd, 8, xmm0, 6\nr4 cmpsd, 8, xmm0, 7\n\nr3 addsubps, 16, xmm0\nr3 cvtpd2dq, 16, xmm0\nr3 lddqu, 16, xmm0\n\n; Done\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/modrm_oob/VEX.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\",\n    \"0x100002000\": \"4096\"\n  }\n}\n%endif\n\nmov r15, 0x100001000\nmov r14, 0x100002000\nmov rax, 0\n\n%include \"modrm_oob_macros.mac\"\n\n; VEX map 1\n%macro r_avx 1\nr3 %1, 16, xmm0\nr3 %1, 32, ymm0\n%endmacro\n\n%macro r_avx_2_reg 1\nr4 %1, 16, xmm0, xmm1\nr4 %1, 32, ymm0, ymm1\n%endmacro\n\n%macro r_avx_fma 1\nr4_fma %1, 16, xmm0, xmm1\nr4_fma %1, 32, ymm0, ymm2\n%endmacro\n\n%macro r2_avx 2\nr4 %1, 16, xmm0, %2\nr4 %1, 32, ymm0, %2\n%endmacro\n\n%macro w_avx 1\nw3 %1, 16, xmm0\nw3 %1, 32, ymm0\n%endmacro\n\n%macro rw_avx 1\nr_avx %1\nw_avx %1\n%endmacro\n\n; VEX\nrw_avx vmovups\nrw_avx vmovupd\nrw3 vmovss, 4, xmm0\nrw3 vmovsd, 8, xmm0\n\nrw3 vmovlps, 8, xmm0\nrw3 vmovlpd, 8, xmm0\n\nr_avx vmovsldup\nr_avx vmovddup\n\nr_avx vunpcklps\nr_avx vunpcklpd\nr_avx vunpckhps\nr_avx vunpckhpd\n\nrw3 vmovhps, 8, xmm0\nrw3 vmovhpd, 8, xmm0\n\nr_avx vmovshdup\nr_avx vsqrtps\nr_avx vsqrtpd\n\nr3 vsqrtss, 4, xmm0\nr3 vsqrtsd, 8, xmm0\n\nr_avx vrsqrtps\nr3 vrsqrtss, 4, xmm0\n\nr_avx vrcpps\nr3 vrcpss, 4, xmm0\n\nr_avx vandps\nr_avx vandpd\nr_avx vandnps\nr_avx vandnpd\nr_avx vorps\nr_avx vorpd\nr_avx vxorps\nr_avx vxorpd\nr_avx vpunpcklbw\nr_avx vpunpcklwd\nr_avx vpunpckldq\n\nr_avx vpacksswb\nr_avx vpcmpgtb\nr_avx vpcmpgtw\nr_avx vpcmpgtd\nr_avx vpackuswb\n\nr2_avx vpshufd, 0\nr2_avx vpshufhw, 0\nr2_avx vpshuflw, 0\n\nr_avx vpcmpeqb\nr_avx vpcmpeqw\nr_avx vpcmpeqd\n\nr2_avx vcmpps, 0\nr2_avx vcmpps, 1\nr2_avx vcmpps, 2\nr2_avx vcmpps, 3\nr2_avx vcmpps, 4\nr2_avx vcmpps, 5\nr2_avx vcmpps, 6\nr2_avx vcmpps, 7\n\nr2_avx vcmppd, 0\nr2_avx vcmppd, 1\nr2_avx vcmppd, 2\nr2_avx vcmppd, 3\nr2_avx vcmppd, 4\nr2_avx vcmppd, 5\nr2_avx vcmppd, 6\nr2_avx vcmppd, 7\n\nr4 vcmpss, 4, xmm0, 0\nr4 vcmpss, 4, xmm0, 1\nr4 vcmpss, 4, xmm0, 2\nr4 vcmpss, 4, xmm0, 3\nr4 vcmpss, 4, xmm0, 4\nr4 vcmpss, 4, xmm0, 5\nr4 vcmpss, 4, xmm0, 6\nr4 vcmpss, 4, xmm0, 7\n\nr4 vcmpsd, 8, xmm0, 0\nr4 vcmpsd, 8, xmm0, 1\nr4 vcmpsd, 8, xmm0, 2\nr4 vcmpsd, 8, xmm0, 3\nr4 vcmpsd, 8, xmm0, 4\nr4 vcmpsd, 8, xmm0, 5\nr4 vcmpsd, 8, xmm0, 6\nr4 vcmpsd, 8, xmm0, 7\n\nr4 vpinsrw, 2, xmm0, 0\nw4 vpextrw, 2, xmm0, 0\n\nr2_avx vshufps, 0\nr2_avx vshufpd, 0\n\nrw_avx vmovaps\nrw_avx vmovapd\n\nr4_size vcvtsi2ss, 4, dword, xmm0\nr4_size vcvtsi2ss, 8, qword, xmm0\n\nr4_size vcvtsi2sd, 4, dword, xmm0\nr4_size vcvtsi2sd, 8, qword, xmm0\n\nw_avx vmovntps\nw_avx vmovntpd\n\nr4_size vcvttss2si, 4, dword, eax\nr4_size vcvttss2si, 4, dword, rax\n\nr4_size vcvttsd2si, 8, qword, eax\nr4_size vcvttsd2si, 8, qword, rax\n\nr4_size vcvtss2si, 4, dword, eax\nr4_size vcvtss2si, 4, dword, rax\n\nr4_size vcvtsd2si, 8, qword, eax\nr4_size vcvtsd2si, 8, qword, rax\n\nr4_size vucomiss, 4, dword, xmm0\nr4_size vucomisd, 8, qword, xmm0\n\nr4_size vcomiss, 4, dword, xmm0\nr4_size vcomisd, 8, qword, xmm0\n\nr_avx vaddps\nr_avx vaddpd\nr4_size vaddss, 4, dword, xmm0\nr4_size vaddsd, 8, qword, xmm0\n\nr_avx vmulps\nr_avx vmulpd\nr4_size vmulss, 4, dword, xmm0\nr4_size vmulsd, 8, qword, xmm0\n\nr4_size vcvtps2pd, 8, qword, xmm0\nr4_size vcvtps2pd, 16, oword, ymm0\n\nr4_size vcvtpd2ps, 16, oword, xmm0\nr4_size vcvtpd2ps, 32, yword, xmm0\n\nr4_size vcvtss2sd, 4, dword, xmm0\nr4_size vcvtsd2ss, 8, qword, xmm0\n\nr_avx vcvtdq2ps\nr_avx vcvtps2dq\nr_avx vcvttps2dq\n\nr_avx vsubps\nr_avx vsubpd\nr4_size vsubss, 4, dword, xmm0\nr4_size vsubsd, 8, qword, xmm0\n\nr_avx vminps\nr_avx vminpd\nr4_size vminss, 4, dword, xmm0\nr4_size vminsd, 8, qword, xmm0\n\nr_avx vdivps\nr_avx vdivpd\nr4_size vdivss, 4, dword, xmm0\nr4_size vdivsd, 8, qword, xmm0\n\nr_avx vmaxps\nr_avx vmaxpd\nr4_size vmaxss, 4, dword, xmm0\nr4_size vmaxsd, 8, qword, xmm0\n\nr_avx vpunpckhbw\nr_avx vpunpckhwd\nr_avx vpunpckhdq\nr_avx vpackssdw\nr_avx vpunpcklqdq\nr_avx vpunpckhqdq\n\nrw3 vmovq, 8, xmm0\nrw3 vmovd, 4, xmm0\n\nr_avx vmovdqa\nr_avx vmovdqu\nr_avx vhaddpd\nr_avx vhaddps\nr_avx vhsubpd\nr_avx vhsubps\nr_avx vaddsubpd\nr_avx vaddsubps\n\nr_avx vpsrlw\nr_avx vpsrld\nr_avx vpsrlq\nr_avx vpaddq\nr_avx vpmullw\nr_avx vpsubusb\nr_avx vpsubusw\nr_avx vpand\nr_avx vpaddusb\nr_avx vpmaxub\nr_avx vpandn\nr_avx vpavgb\nr_avx vpsraw\nr_avx vpsrad\nr_avx vpavgw\nr_avx vpmulhuw\nr_avx vpmulhw\nr4_size vcvttpd2dq, 16, oword, xmm0\nr4_size vcvttpd2dq, 32, yword, xmm0\nr_avx vcvtdq2pd\nr4_size vcvtpd2dq, 16, oword, xmm0\nr4_size vcvtpd2dq, 32, yword, xmm0\nw_avx vmovntdq\nr_avx vpsubsb\nr_avx vpsubsw\nr_avx vpminsw\nr_avx vpor\nr_avx vpaddsb\nr_avx vpaddsw\nr_avx vpmaxsw\nr_avx vpxor\nr_avx vlddqu\nr_avx vpsllw\nr_avx vpslld\nr_avx vpsllq\nr_avx vpmuludq\nr_avx vpmaddwd\nr_avx vpsadbw\nr_avx vpsubb\nr_avx vpsubw\nr_avx vpsubd\nr_avx vpsubq\nr_avx vpaddb\nr_avx vpaddw\nr_avx vpaddd\nr_avx vpaddq\n\n; VEX Map 2\nr_avx vpshufb\nr_avx vphaddw\nr_avx vphaddd\nr_avx vphaddsw\nr_avx vpmaddubsw\nr_avx vphsubw\nr_avx vphsubd\nr_avx vphsubsw\nr_avx vpsignb\nr_avx vpsignw\nr_avx vpsignd\nr_avx vpsignd\nr_avx vpmulhrsw\nr_avx vpermilps\nr_avx vpermilpd\nr_avx vtestps\nr_avx vtestpd\n\nr4_size vcvtph2ps, 8, qword, xmm0\nr4_size vcvtph2ps, 16, oword, ymm0\n\nr3 vpermps, 32, ymm0\nr_avx vptest\nr4_size vbroadcastss, 4, dword, xmm0\nr4_size vbroadcastss, 4, dword, ymm0\n\nr4_size vbroadcastsd, 8, qword, ymm0\nr3 vbroadcastf128, 16, ymm0\n\nr_avx vpabsb\nr_avx vpabsw\nr_avx vpabsd\n\nr4_size vpmovsxbw, 8, qword, xmm0\nr4_size vpmovsxbw, 16, oword, ymm0\n\nr4_size vpmovsxbd, 4, dword, xmm0\nr4_size vpmovsxbd, 8, qword, ymm0\n\nr4_size vpmovsxbq, 2, word, xmm0\nr4_size vpmovsxbq, 4, dword, ymm0\n\nr4_size vpmovsxwd, 8, qword, xmm0\nr4_size vpmovsxwd, 16, oword, ymm0\n\nr4_size vpmovsxwq, 4, dword, xmm0\nr4_size vpmovsxwq, 8, qword, ymm0\n\nr4_size vpmovsxdq, 8, qword, xmm0\nr4_size vpmovsxdq, 16, oword, ymm0\n\nr_avx vpmuldq\nr_avx vpcmpeqq\nr_avx vmovntdqa\nr_avx vpackusdw\n\n; VMASKMOVPS/PD is complex and can't be tested here.\n\nr4_size vpmovzxbw, 8, qword, xmm0\nr4_size vpmovzxbw, 16, oword, ymm0\n\nr4_size vpmovzxbd, 4, dword, xmm0\nr4_size vpmovzxbd, 8, qword, ymm0\n\nr4_size vpmovzxbq, 2, word, xmm0\nr4_size vpmovzxbq, 4, dword, ymm0\n\nr4_size vpmovzxwd, 8, qword, xmm0\nr4_size vpmovzxwd, 16, oword, ymm0\n\nr4_size vpmovzxwq, 4, dword, xmm0\nr4_size vpmovzxwq, 8, qword, ymm0\n\nr4_size vpmovzxdq, 8, qword, xmm0\nr4_size vpmovzxdq, 16, oword, ymm0\n\nr3 vpermd, 32, ymm0\nr_avx vpcmpgtq\nr_avx vpminsb\nr_avx vpminsd\nr_avx vpminuw\nr_avx vpminud\nr_avx vpmaxsb\nr_avx vpmaxsd\nr_avx vpmaxuw\nr_avx vpmaxud\nr_avx vpmulld\nr3 vphminposuw, 16, xmm0\nr_avx vpsrlvd\nr_avx vpsrlvq\nr_avx vpsravd\nr_avx vpsllvd\nr_avx vpsllvq\n\nr4_size vpbroadcastd, 4, dword, xmm0\nr4_size vpbroadcastd, 4, dword, ymm0\n\nr4_size vpbroadcastq, 8, qword, xmm0\nr4_size vpbroadcastq, 8, qword, ymm0\n\nr4_size vbroadcasti128, 16, oword, ymm0\n\n; VPMASKMOVD/Q is complex and can't be tested here.\n; V{P,}GATHER* is complex and can't be tested here.\nr_avx_fma vfmaddsub132pd\nr_avx_fma vfmsubadd132pd\nr_avx_fma vfmaddsub132ps\nr_avx_fma vfmsubadd132ps\n\nr_avx_fma vfmadd132pd\nr_avx_fma vfmadd132ps\nr_avx_fma vfmsub132pd\nr_avx_fma vfmsub132ps\nr_avx_fma vfnmadd132pd\nr_avx_fma vfnmadd132ps\nr_avx_fma vfnmsub132pd\nr_avx_fma vfnmsub132ps\nr_avx_fma vfmadd213pd\nr_avx_fma vfmadd213ps\nr_avx_fma vfmsub213pd\nr_avx_fma vfmsub213ps\nr_avx_fma vfnmadd213pd\nr_avx_fma vfnmadd213ps\nr_avx_fma vfnmsub213pd\nr_avx_fma vfnmsub213ps\nr_avx_fma vfmadd231pd\nr_avx_fma vfmadd231ps\nr_avx_fma vfmsub231pd\nr_avx_fma vfmsub231ps\nr_avx_fma vfnmadd231pd\nr_avx_fma vfnmadd231ps\nr_avx_fma vfnmsub231pd\nr_avx_fma vfnmsub231ps\nr_avx_fma vfmaddsub213pd\nr_avx_fma vfmaddsub213ps\nr_avx_fma vfmsubadd213pd\nr_avx_fma vfmsubadd213ps\nr_avx_fma vfmaddsub231pd\nr_avx_fma vfmaddsub231ps\nr_avx_fma vfmsubadd231pd\nr_avx_fma vfmsubadd231ps\n\nr5_fma_sized vfmadd132sd, 8, qword, xmm0, xmm1\nr5_fma_sized vfmadd132ss, 4, dword, xmm0, xmm1\n\nr5_fma_sized vfmsub132sd, 8, qword, xmm0, xmm1\nr5_fma_sized vfmsub132ss, 4, dword, xmm0, xmm1\n\nr5_fma_sized vfnmadd132sd, 8, qword, xmm0, xmm1\nr5_fma_sized vfnmadd132ss, 4, dword, xmm0, xmm1\n\nr5_fma_sized vfnmsub132sd, 8, qword, xmm0, xmm1\nr5_fma_sized vfnmsub132ss, 4, dword, xmm0, xmm1\n\nr5_fma_sized vfmadd213sd, 8, qword, xmm0, xmm1\nr5_fma_sized vfmadd213ss, 4, dword, xmm0, xmm1\n\nr5_fma_sized vfmsub213sd, 8, qword, xmm0, xmm1\nr5_fma_sized vfmsub213ss, 4, dword, xmm0, xmm1\n\nr5_fma_sized vfnmadd213sd, 8, qword, xmm0, xmm1\nr5_fma_sized vfnmadd213ss, 4, dword, xmm0, xmm1\n\nr5_fma_sized vfnmsub213sd, 8, qword, xmm0, xmm1\nr5_fma_sized vfnmsub213ss, 4, dword, xmm0, xmm1\n\nr5_fma_sized vfmadd231sd, 8, qword, xmm0, xmm1\nr5_fma_sized vfmadd231ss, 4, dword, xmm0, xmm1\n\nr5_fma_sized vfmsub231sd, 8, qword, xmm0, xmm1\nr5_fma_sized vfmsub231ss, 4, dword, xmm0, xmm1\n\nr5_fma_sized vfnmadd231sd, 8, qword, xmm0, xmm1\nr5_fma_sized vfnmadd231ss, 4, dword, xmm0, xmm1\n\nr5_fma_sized vfnmsub231sd, 8, qword, xmm0, xmm1\nr5_fma_sized vfnmsub231ss, 4, dword, xmm0, xmm1\n\nr3 vaesimc, 16, xmm0\nr3 vaesenc, 16, xmm0\nr3 vaesenclast, 16, xmm0\nr3 vaesdec, 16, xmm0\nr3 vaesdeclast, 16, xmm0\n\nr5_fma_sized andn, 4, dword, eax, ebx\nr5_fma_sized andn, 8, qword, rax, rbx\n\n; bzhi is a bit special.\nbzhi eax, dword [r15 - 4], ebx\nbzhi eax, dword [r14], ebx\n\nbzhi rax, qword [r15 - 8], rbx\nbzhi rax, qword [r14], rbx\n\nr5_fma_sized pext, 4, dword, eax, ebx\nr5_fma_sized pext, 8, qword, rax, rbx\n\nr5_fma_sized pdep, 4, dword, eax, ebx\nr5_fma_sized pdep, 8, qword, rax, rbx\n\nr5_fma_sized mulx, 4, dword, eax, ebx\nr5_fma_sized mulx, 8, qword, rax, rbx\n\n; bextr is a bit special.\nbextr eax, dword [r15 - 4], ebx\nbextr eax, dword [r14], ebx\n\nbextr rax, qword [r15 - 8], rbx\nbextr rax, qword [r14], rbx\n\n; shlx is a bit special.\nshlx eax, dword [r15 - 4], ebx\nshlx eax, dword [r14], ebx\n\nshlx rax, qword [r15 - 8], rbx\nshlx rax, qword [r14], rbx\n\n; sarx is a bit special.\nsarx eax, dword [r15 - 4], ebx\nsarx eax, dword [r14], ebx\n\nsarx rax, qword [r15 - 8], rbx\nsarx rax, qword [r14], rbx\n\n; shrx is a bit special.\nshrx eax, dword [r15 - 4], ebx\nshrx eax, dword [r14], ebx\n\nshrx rax, qword [r15 - 8], rbx\nshrx rax, qword [r14], rbx\n\n; VEX Map 3\nr4 vpermq, 32, ymm0, 0\nr4 vpermpd, 32, ymm0, 0\n\nr2_avx vpblendd, 0\nr2_avx vpermilps, 0\nr2_avx vpermilpd, 0\nr4 vperm2f128, 32, ymm0, 0\nr2_avx vroundps, 0\nr2_avx vroundpd, 0\n\nr4 vroundss, 4, xmm0, 0\nr4 vroundsd, 8, xmm0, 0\nr2_avx vblendps, 0\nr2_avx vblendpd, 0\nr2_avx vpblendw, 0\nr2_avx vpalignr, 0\n\nw5_size vpextrb, 1, byte, xmm0, 0\nw5_size vpextrw, 2, word, xmm0, 0\nw5_size vpextrd, 4, dword, xmm0, 0\nw5_size vextractps, 4, dword, xmm0, 0\nw5_size vpextrq, 8, qword, xmm0, 0\nr4 vinsertf128, 16, ymm0, 0\nw5_size vextractf128, 16, oword, ymm0, 0\nw5_size vcvtps2ph, 8, qword, xmm0, 0\nw5_size vcvtps2ph, 16, oword, ymm0, 0\n\nr5_size vpinsrb, 1, byte, xmm0, 0\nr5_size vinsertps, 4, dword, xmm0, 0\nr5_size vpinsrd, 4, dword, xmm0, 0\nr5_size vpinsrq, 8, qword, xmm0, 0\nr4 vinserti128, 16, ymm0, 0\nw5_size vextracti128, 16, oword, ymm0, 0\n\nr2_avx vdpps, 0\nr4 vdppd, 16, xmm0, 0\nr2_avx vmpsadbw, 0\nr2_avx vpclmulqdq, 0\nr4 vperm2i128, 32, ymm0, 0\n\nr_avx_2_reg vblendvps\nr_avx_2_reg vblendvpd\nr_avx_2_reg vpblendvb\n\nr4 vpcmpestrm, 16, xmm0, 0\nr4 vpcmpestri, 16, xmm0, 0\nr4 vpcmpistrm, 16, xmm0, 0\nr4 vpcmpistri, 16, xmm0, 0\nr4 vaeskeygenassist, 16, xmm0, 0\n\nr4 rorx, 4, eax, 1\nr4 rorx, 8, rax, 1\n\n; Done\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/modrm_oob/VEXGroup.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\",\n    \"0x100002000\": \"4096\"\n  }\n}\n%endif\n\nmov r15, 0x100001000\nmov r14, 0x100002000\nmov rax, 0\n\n%include \"modrm_oob_macros.mac\"\n\n; VEX group 15\nw2 vstmxcsr, 4\nw2 vldmxcsr, 4\n\n; VEX group 17\nr3 blsr, 4, eax\nr3 blsr, 8, rax\nr3 blsmsk, 4, eax\nr3 blsmsk, 8, rax\nr3 blsi, 4, eax\nr3 blsi, 8, rax\n\n; Done\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/modrm_oob/X87.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\",\n    \"0x100002000\": \"4096\"\n  }\n}\n%endif\n\nmov r15, 0x100001000\nmov r14, 0x100002000\nmov rax, 0\n\n%include \"modrm_oob_macros.mac\"\n\n; X87\n\n; These macros using the w* versions are actually reads.\n%macro x87_f48_op 1\nfldz\nw3_size %1, 4, dword\nw3_size %1, 8, qword\nffreep\n%endmacro\n\n%macro x87_i24_op 1\nfldz\nw3_size %1, 2, word\nw3_size %1, 4, dword\nffreep\n%endmacro\n\nx87_f48_op fadd\nx87_f48_op fmul\nx87_f48_op fcom\n\n; fcomp is special\nfldz\nw3_size fcomp, 4, dword\nfldz\nw3_size fcomp, 8, qword\n\nx87_f48_op fsub\nx87_f48_op fsubr\nx87_f48_op fdiv\nx87_f48_op fdivr\n\n; fld is special\nw3_size fld, 4, dword\nffreep\nw3_size fld, 8, qword\nffreep\nw3_size fld, 10, tword\nffreep\n\n; fst is special\nfldz\nw3_size fst, 4, dword\nw3_size fst, 8, qword\n\n; fstp is special\nfldz\nw3_size fstp, 4, dword\nfldz\nw3_size fstp, 8, qword\nfldz\nw3_size fstp, 10, tword\n\nw2 fnstenv, 28\nw2 fldenv, 28\n\nw2 o16 fnstenv, 14\nw2 o16 fldenv, 14\n\nw2 fnstcw, 2\nw2 fldcw, 2\n\nx87_i24_op fiadd\nx87_i24_op fimul\nx87_i24_op ficom\n\n; ficomp is special\nfldz\nw3_size ficomp, 2, word\nfldz\nw3_size ficomp, 4, dword\n\nx87_i24_op fisub\nx87_i24_op fisubr\n\nx87_i24_op fidiv\nx87_i24_op fidivr\n\n; fild is special\nw3_size fild, 2, word\nffreep\nw3_size fild, 4, dword\nffreep\nw3_size fild, 8, qword\nffreep\n\n; fist is special\nfldz\nw3_size fist, 2, word\nw3_size fist, 4, dword\n\n; fistp is special\nfldz\nw3_size fistp, 2, word\nfldz\nw3_size fistp, 4, dword\nfldz\nw3_size fistp, 8, qword\n\n; fisttp is special\nfldz\nw3_size fisttp, 2, word\nfldz\nw3_size fisttp, 4, dword\nfldz\nw3_size fisttp, 8, qword\n\nw2 fnsave, 108\nw2 frstor, 108\n\nw2 fnstsw, 2\n\nw2 o16 fnsave, 94\nw2 o16 frstor, 94\n\nw3_size fbld, 10, tword\nw3_size fbstp, 10, tword\n\n; Done\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/modrm_oob/X87_Reduced.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\",\n    \"0x100002000\": \"4096\"\n  },\n  \"Env\": { \"FEX_X87REDUCEDPRECISION\" : \"1\" }\n}\n%endif\n\nmov r15, 0x100001000\nmov r14, 0x100002000\nmov rax, 0\n\n%include \"modrm_oob_macros.mac\"\n\n; X87\n\n; These macros using the w* versions are actually reads.\n%macro x87_f48_op 1\nfldz\nw3_size %1, 4, dword\nw3_size %1, 8, qword\nffreep\n%endmacro\n\n%macro x87_i24_op 1\nfldz\nw3_size %1, 2, word\nw3_size %1, 4, dword\nffreep\n%endmacro\n\nx87_f48_op fadd\nx87_f48_op fmul\nx87_f48_op fcom\n\n; fcomp is special\nfldz\nw3_size fcomp, 4, dword\nfldz\nw3_size fcomp, 8, qword\n\nx87_f48_op fsub\nx87_f48_op fsubr\nx87_f48_op fdiv\nx87_f48_op fdivr\n\n; fld is special\nw3_size fld, 4, dword\nffreep\nw3_size fld, 8, qword\nffreep\nw3_size fld, 10, tword\nffreep\n\n; fst is special\nfldz\nw3_size fst, 4, dword\nw3_size fst, 8, qword\n\n; fstp is special\nfldz\nw3_size fstp, 4, dword\nfldz\nw3_size fstp, 8, qword\nfldz\nw3_size fstp, 10, tword\n\nw2 fnstenv, 28\nw2 fldenv, 28\n\nw2 o16 fnstenv, 14\nw2 o16 fldenv, 14\n\nw2 fnstcw, 2\nw2 fldcw, 2\n\nx87_i24_op fiadd\nx87_i24_op fimul\nx87_i24_op ficom\n\n; ficomp is special\nfldz\nw3_size ficomp, 2, word\nfldz\nw3_size ficomp, 4, dword\n\nx87_i24_op fisub\nx87_i24_op fisubr\n\nx87_i24_op fidiv\nx87_i24_op fidivr\n\n; fild is special\nw3_size fild, 2, word\nffreep\nw3_size fild, 4, dword\nffreep\nw3_size fild, 8, qword\nffreep\n\n; fist is special\nfldz\nw3_size fist, 2, word\nw3_size fist, 4, dword\n\n; fistp is special\nfldz\nw3_size fistp, 2, word\nfldz\nw3_size fistp, 4, dword\nfldz\nw3_size fistp, 8, qword\n\n; fisttp is special\nfldz\nw3_size fisttp, 2, word\nfldz\nw3_size fisttp, 4, dword\nfldz\nw3_size fisttp, 8, qword\n\nw2 fnsave, 108\nw2 frstor, 108\n\nw2 fnstsw, 2\n\nw2 o16 fnsave, 94\nw2 o16 frstor, 94\n\nw3_size fbld, 10, tword\nw3_size fbstp, 10, tword\n\n; Done\nmov rax, 1\nhlt\n"
  },
  {
    "path": "unittests/ASM/mov.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RAX\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RBX\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RCX\": \"0xFFFFFFFFFFFFFFFF\",\n    \"RDX\": \"0xDEADBEEFBAD0DAD1\",\n    \"R15\": \"0xDEADBEEFBAD0DAD1\"\n  }\n}\n%endif\n\nmov rax, -1\nmov rbx, -1\nmov rcx, -1\n\nmov r15, qword 0xDEADBEEFBAD0DAD1\nmov rdx, qword 0xDEADBEEFBAD0DAD1\n\n;mov al, dl\n;mov bx, dx\n;mov ecx, edx\n;mov al, -1\n;mov ax, -1\n;mov eax, -1\n;mov rax, qword -1\n;mov rax, 0\n;mov al, al\n;mov rbx, -1\n;mov bx, ax\n;mov ax, ax\n;mov ax, ax\n;mov eax, eax\n;mov rax, rax\nhlt\n"
  },
  {
    "path": "unittests/ASM/movups.asm",
    "content": "%ifdef CONFIG\n{\n  \"Ignore\": [\"RAX\", \"RDX\"],\n  \"RegData\": {\n    \"RAX\" : \"0x0000FFFF\",\n    \"XMM0\": [\"0x3f800000\", \"0x40000000\"],\n    \"XMM1\": [\"0x3f800000\", \"0x40000000\"],\n    \"XMM2\": [\"0x3f800000\", \"0x40000000\"],\n    \"XMM3\": [\"0x3f800000\", \"0x8100000080000000\"],\n    \"XMM4\": [\"0xDEADBEEFBFD0DAD1\", \"0x4141414142424242\"],\n    \"XMM5\": [\"0xDEADBEEFBAD0DAD1\", \"0\"],\n    \"XMM6\": [\"0xDEADBEEFBFD0DAD1\", \"0\"]\n  }\n}\n%endif\n\njmp label\nlabel:\nmov rax, 0x3f800000\n;mov rsi, 0xdeadbeefbaddad1\n;rdseed eax\n;vpermd ymm0, ymm1, ymm2\nmov rdx, 0xe0000000\nmov [rdx], eax\nmov eax, 0x40000000\nmov [rdx + 8], eax\n\nmovups xmm0, [rdx]\nmovups xmm1, xmm0\n\nmovups [rdx + 16], xmm1\nmovups xmm2, [rdx + 16]\n\n; Upper moves\nmov eax, 0x80000000\n\nmov [rdx + 32], eax\nmov eax, 0x81000000\nmov [rdx + 36], eax\n\nmovups xmm3, xmm0\nmovhps xmm3, [rdx + 32]\n\nmov rax, 0xDEADBEEFBAD0DAD1\nmov [rdx + 32], rax\nmov rax, 0x4141414142424242\nmov [rdx + 40], rax\nmovups xmm4, [rdx + 32]\nmovq xmm5, [rdx + 32]\n\npor xmm4, xmm0\nmovq xmm6, xmm4\npaddq xmm7, xmm6\nmov rax, 0xFFFFFFFFFFFFFFFF\nmov [rdx + 32], rax\nmov [rdx + 40], rax\nmovdqu xmm8, [rdx + 32]\npmovmskb eax, xmm8\n\n;fcomp dword [0]\n;fldl2t\n;fld1\nhlt\n"
  },
  {
    "path": "unittests/ASM/movzx.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"RBX\": \"0xFFFFFFFFFFFF00D1\",\n    \"RCX\": \"0x00000000000000D1\",\n    \"RDX\": \"0xDAD1\",\n    \"RDI\": \"0xDAD1\"\n  }\n}\n%endif\n\nmov rax, qword 0xDEADBEEFBAD0DAD1\n\nmov rbx, -1\nmov rcx, -1\nmov rdx, -1\nmov rdi, -1\n\nmovzx bx,  al ; 8bit-> 16bit\nmovzx ecx, al ; 8bit-> 32bit\nmovzx edx, ax ; 16bit-> 32bit\nmovzx rdi, ax ; 16bit -> 64bit\n\nhlt"
  },
  {
    "path": "unittests/ASM/pslldq.asm",
    "content": "%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"RegData\": {\n    \"XMM0\": [\"0xadbeefbad0dad100\", \"0x41414141414141de\"],\n    \"XMM1\": [\"0x41deadbeefbad0da\", \"0x0041414141414141\"]\n  }\n}\n%endif\n\nmov rdx, 0xe8000000\nmov rax, 0xDEADBEEFBAD0DAD1\nmov rcx, 0x4141414141414141\n\nmov [rdx], rax\nmov [rdx + 8], rcx\n\nmovups xmm0, [rdx]\npslldq xmm0, 1\n\nmovups xmm1, [rdx]\npsrldq xmm1, 1\n\nhlt\n"
  },
  {
    "path": "unittests/ASM/x87_stack.asm",
    "content": "%ifdef CONFIG\n{\n  \"RegData\": {\n    \"RAX\": \"0x4142434445464748\",\n    \"RBX\": \"0\"\n  }\n}\n%endif\n\nlea rax, [rel .data]\nlea rbx, [rel .data_mov]\n\nfld qword [rax]\nfstp qword [rbx]\n\nmov rax, [rbx]\nmov rbx, [rbx + 8]\nhlt\n\nalign 4096\n.data:\ndq 0x4142434445464748\ndq 0x5152535455565758\n\n.data_mov:\ndq 0\ndq 0\n"
  },
  {
    "path": "unittests/CMakeLists.txt",
    "content": "if (NOT MINGW)\n  add_subdirectory(APITests/)\n  add_subdirectory(POSIX/)\n  add_subdirectory(gvisor-tests/)\n  add_subdirectory(gcc-target-tests-32/)\n  add_subdirectory(gcc-target-tests-64/)\n  add_subdirectory(Utilities/)\n\n  if (BUILD_THUNKS)\n    add_subdirectory(ThunkLibs)\n    add_subdirectory(ThunkFunctionalTests)\n  endif()\n\n  if (BUILD_FEX_LINUX_TESTS)\n    add_subdirectory(FEXLinuxTests/)\n  endif()\nendif()\n\nadd_subdirectory(ASM/)\nadd_subdirectory(32Bit_ASM/)\nif (ENABLE_VIXL_DISASSEMBLER)\n  # Tests are only valid to run if the vixl disassembler is enabled and the active JIT is the ARM64 JIT.\n  add_subdirectory(InstructionCountCI/)\nendif()\n"
  },
  {
    "path": "unittests/Example.asm",
    "content": "; If you want a specific configuration at the top of asm file then make sure to wrap it in ifdef and endif.\n; This allows the python script to extract the json and nasm to ignore the section\n;\n; X86 State option that can be compared\n; - All: Makes sure all options are compared\n; - None: No options\n; ===== Specific options ====\n; -- GPRs --\n; RAX, RBX, RCX, RDX\n; RSI, RDI, RBP, RSP\n; R8-R15\n; -- XMM --\n; XMM0-XX15\n; -- Misc --\n; RIP\n; FS, GS\n; Flags\n; -- X87 / MMX / 3DNow --\n; MM0-MM7\n; ===========================\n; Match: Forces full matching of types\n;   - Type: String or List of strings\n;   - Default: All\n; Ignore: Forces types to be ignored when matching. Overwrites Matches\n;   - Default: None\n;   - Type: String or List of strings\n; RegData: Makes sure that a register contains specific data\n;   - Default: Any data\n;   - Type: Dict of key:value pairs\n;   - >64bit registers should contain a list of values for each 64bit value\n;\n; Additional config options\n; ABI : {SystemV-64, Win64, None}\n;   - Default: SystemV-64\n; StackSize : Stack size that the test needs\n;   - Default : 4096\n;   - Stack address starts at: [0xc000'0000, 0xc000'0000 + StackSize)\n; EntryPoint : Entrypoint for the assembly\n;   - Default: 1\n;   - 0 is invalid since that is special cased\n; MemoryRegions: Memory Regions for the tests to use\n;   - Default: No memory regions generated\n;   - Dict of key:value pairs\n;   - Key indicates the memory base\n;   - Value indicates the memory region size\n;   - WARNING: Emulator sets up some default regions that you don't want to intersect with\n;   - Additionally the VM only has 64GB of virtual memory. If you go past this size, expect failure\n;   - 0xb000'0000 - FS Memory base\n;   - 0xc000'0000 - Stack pointer base\n;   - 0xd000'0000 - Linux BRK memory base\n; MemoryData: Prepopulate one or more memory regions with data\n;   - Default: None\n;   - Dict of key:value pairs\n;   - Key is address\n;   - Value is a string with hex data.\n;       - No leading 0x needed.\n;       - Spaces allowed\n\n%ifdef CONFIG\n{\n  \"Match\": \"All\",\n  \"Ignore\": [\"XMM0\", \"Flags\"],\n  \"RegData\": {\n    \"RAX\": \"1\"\n  },\n  \"MemoryRegions\": {\n    \"0x100000000\": \"4096\"\n  },\n  \"MemoryData\": {\n    \"0x100000000\" : \"00000001 00000000 00000000 00000000\",\n    \"0x100000020\" : \"fa aa 55 33\",\n    \"0x100000038\" : \"0x123456789\"\n  }\n}\n%endif\n\nmov eax, 1\nret\n"
  },
  {
    "path": "unittests/FEXLinuxTests/CMakeLists.txt",
    "content": "include(ExternalProject)\nExternalProject_Add(FEXLinuxTests\n  PREFIX FEXLinuxTests\n  SOURCE_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/tests\"\n  BINARY_DIR \"${CMAKE_CURRENT_BINARY_DIR}/FEXLinuxTests_64\"\n  CMAKE_ARGS\n  \"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}\"\n  \"-DCMAKE_TOOLCHAIN_FILE:FILEPATH=${X86_64_TOOLCHAIN_FILE}\"\n  \"-DENABLE_CLANG_THUNKS=True\"\n  \"-DBITNESS=64\"\n  INSTALL_COMMAND \"\"\n  BUILD_ALWAYS ON)\n\nExternalProject_Add(FEXLinuxTests_32\n  PREFIX FEXLinuxTests_32\n  SOURCE_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/tests\"\n  BINARY_DIR \"${CMAKE_CURRENT_BINARY_DIR}/FEXLinuxTests_32\"\n  CMAKE_ARGS\n  \"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}\"\n  \"-DCMAKE_TOOLCHAIN_FILE:FILEPATH=${X86_32_TOOLCHAIN_FILE}\"\n  \"-DENABLE_CLANG_THUNKS=True\"\n  \"-DBITNESS=32\"\n  INSTALL_COMMAND \"\"\n  BUILD_ALWAYS ON)\n\n# this kind of sucks, but reglob\nfile(GLOB_RECURSE TESTS CONFIGURE_DEPENDS tests/*.cpp)\nfile(GLOB_RECURSE TESTS_64_ONLY CONFIGURE_DEPENDS tests/*.64.cpp)\nfile(GLOB_RECURSE TESTS_32_ONLY CONFIGURE_DEPENDS tests/*.32.cpp)\n\n# Apply bitness-specific exclude lists\nlist(REMOVE_ITEM TESTS ${TESTS_64_ONLY})\nlist(REMOVE_ITEM TESTS ${TESTS_32_ONLY})\n\nfunction(AddTests Tests BinDirectory Bitness)\n  foreach(TEST ${Tests})\n    get_filename_component(TEST_NAME ${TEST} NAME_WE)\n    set(BIN_PATH \"${CMAKE_CURRENT_BINARY_DIR}/${BinDirectory}/${TEST_NAME}.${Bitness}\")\n    set(TEST_CASE \"${TEST_NAME}.${Bitness}\")\n\n    if(TEST_NAME STREQUAL \"thunk_testlib\")\n      # Test thunking only if thunks are enabled and supported\n      if(NOT BUILD_THUNKS OR ENABLE_GLIBC_ALLOCATOR_HOOK_FAULT)\n        continue()\n      endif()\n    endif()\n\n    # Add jit test case\n    add_test(NAME \"${TEST_CASE}.jit.flt\"\n      COMMAND \"python3\" \"${CMAKE_SOURCE_DIR}/Scripts/guest_test_runner.py\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/Known_Failures\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/Expected_Output\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/Disabled_Tests\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/Flake_Tests\"\n      \"${TEST_CASE}\"\n      \"guest\"\n      \"$<TARGET_FILE:FEX>\"\n      \"${BIN_PATH}\")\n\n    set_property(TEST \"${TEST_CASE}.jit.flt\" APPEND PROPERTY ENVIRONMENT \"FEX_OUTPUTLOG=stderr;FEX_SILENTLOG=0;FEX_MAXINST=500\")\n\n    if(TEST_NAME STREQUAL \"thunk_testlib\")\n      set_property(TEST \"${TEST_CASE}.jit.flt\" APPEND PROPERTY ENVIRONMENT \"FEX_THUNKCONFIG=${CMAKE_SOURCE_DIR}/Data/CI/FEXLinuxTestsThunks.json\")\n    endif()\n\n    if (ARCHITECTURE_x86_64 AND NOT TEST_NAME STREQUAL \"thunk_testlib\")\n      # Add host test case\n      add_test(NAME \"${TEST_CASE}.host.flt\"\n        COMMAND \"python3\" \"${CMAKE_SOURCE_DIR}/Scripts/guest_test_runner.py\"\n        \"${CMAKE_CURRENT_SOURCE_DIR}/Known_Failures_Host\"\n        \"${CMAKE_CURRENT_SOURCE_DIR}/Expected_Output\"\n        \"${CMAKE_CURRENT_SOURCE_DIR}/Disabled_Tests_Host\"\n        \"${CMAKE_CURRENT_SOURCE_DIR}/Flake_Tests\"\n        \"${TEST_CASE}\"\n        \"host\"\n        \"${BIN_PATH}\")\n      set_property(TEST \"${TEST_CASE}.host.flt\" APPEND PROPERTY SKIP_RETURN_CODE 125)\n    endif()\n    set_property(TEST \"${TEST_CASE}.jit.flt\" APPEND PROPERTY SKIP_RETURN_CODE 125)\n  endforeach()\nendfunction()\n\n# Execute combined 32-bit and 64-bit tests.\nAddTests(\"${TESTS}\" \"FEXLinuxTests_64\" 64)\nAddTests(\"${TESTS}\" \"FEXLinuxTests_32\" 32)\n# Execute tests that are only 64-bit.\nAddTests(\"${TESTS_64_ONLY}\" \"FEXLinuxTests_64\" 64)\n# Execute tests that are only 32-bit.\nAddTests(\"${TESTS_32_ONLY}\" \"FEXLinuxTests_32\" 32)\n\nif(TEST thunk_testlib.64.jit.flt)\n  # Ensure libfex_thunk_test is found even when using an uncommon install prefix\n  set_property(TEST \"thunk_testlib.32.jit.flt\" APPEND PROPERTY ENVIRONMENT \"LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/lib\")\n  set_property(TEST \"thunk_testlib.64.jit.flt\" APPEND PROPERTY ENVIRONMENT \"LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/lib\")\nendif()\n\n# Only emulated\nadd_custom_target(fex_linux_tests\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"30\" ${TEST_JOB_FLAG} \"-R\" \"\\.*\\.jit\\.flt$$\"\n  DEPENDS FEXLinuxTests FEXLinuxTests_32 FEX)\n\n# Only host\nadd_custom_target(fex_linux_tests_host\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"30\" ${TEST_JOB_FLAG} \"-R\" \"\\.*\\.host\\.flt$$\"\n  DEPENDS FEXLinuxTests FEXLinuxTests_32)\n\n# Both host and emulated\nadd_custom_target(fex_linux_tests_all\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"30\" ${TEST_JOB_FLAG} \"-R\" \"\\.*\\.flt$$\"\n  DEPENDS FEXLinuxTests FEXLinuxTests_32 FEX)\n"
  },
  {
    "path": "unittests/FEXLinuxTests/Disabled_Tests",
    "content": "###\n### Disabled tests ###\n###\n\n# These sometimes crash FEX with SIGSEGV\ntimer-sigev-thread.32\ntimer-sigev-thread.64\n"
  },
  {
    "path": "unittests/FEXLinuxTests/Disabled_Tests_Host",
    "content": "\n"
  },
  {
    "path": "unittests/FEXLinuxTests/Expected_Output",
    "content": ""
  },
  {
    "path": "unittests/FEXLinuxTests/Flake_Tests",
    "content": "smc-mt-1.32\nsmc-mt-2.32\nsmc-mt-1.64\nsmc-mt-2.64\npthread_cancel.64\npthread_cancel.32\n"
  },
  {
    "path": "unittests/FEXLinuxTests/Known_Failures",
    "content": "###\n### Disabled tests ###\n###\n\n# These sometimes crash FEX with SIGSEGV\ntimer-sigev-thread.32\ntimer-sigev-thread.64\n\n# These trigger various quirks in FEX's signal handling\nsynchronous-signal-block.32\nsynchronous-signal-block.64\n\n###\n### Failing Tests ###\n###\n\n# these will be fixed with FEX_TICKET(1725)\nsigtest_samask.32\nsigtest_samask.64\nsigtest_sigmask.32\nsigtest_sigmask.64\n\n# Disabled since FEX's FaultSafeMemcpy is intentionally stub-implemented\nsyscalls_efault.32\nsyscalls_efault.64\n\n# partial instruction decode is known to fail\nnoexec_protect.64\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.14)\nproject(FEXLinuxTests)\n\nset(CMAKE_CXX_STANDARD 20)\n\nset(GENERATE_GUEST_INSTALL_TARGETS TRUE)\n\n# Use intel masm syntax. ATT style asm syntax is archaic and hard to read.\nadd_compile_options(-masm=intel)\n# Override a define so catch2 doesn't use ATT style inline asm\nadd_definitions(-D\"CATCH_BREAK_INTO_DEBUGGER\\(\\)\"=\"[]{ if\\( Catch::isDebuggerActive\\(\\) \\) { __builtin_trap\\(\\)\\; } }\\(\\)\")\n\nfile(GLOB_RECURSE TESTS CONFIGURE_DEPENDS *.cpp)\nif(BITNESS EQUAL 64)\n  file(GLOB_RECURSE TESTS_32_ONLY CONFIGURE_DEPENDS *.32.cpp)\n  list(REMOVE_ITEM TESTS ${TESTS_32_ONLY})\nelse()\n  file(GLOB_RECURSE TESTS_64_ONLY CONFIGURE_DEPENDS *.64.cpp)\n  list(REMOVE_ITEM TESTS ${TESTS_64_ONLY})\nendif()\n\noption(CATCH_BUILD_STATIC_LIBRARY \"\" ON)\nset(CATCH_BUILD_STATIC_LIBRARY ON)\nadd_subdirectory(../../../External/Catch2/ Catch2)\n\nforeach(TEST ${TESTS})\n  get_filename_component(TEST_NAME ${TEST} NAME_WE)\n\n  add_executable(${TEST_NAME}.${BITNESS} ${TEST})\n  target_link_libraries(${TEST_NAME}.${BITNESS} PRIVATE Catch2::Catch2WithMain)\n  target_include_directories(${TEST_NAME}.${BITNESS} PRIVATE include/)\nendforeach()\n\ntarget_link_libraries(pthread_cancel.${BITNESS} PRIVATE pthread)\n\ntarget_link_options(smc-1-dynamic.${BITNESS} PRIVATE -z execstack)\n\ntarget_link_libraries(smc-mt-1.${BITNESS} PRIVATE pthread)\n\ntarget_link_libraries(smc-mt-2.${BITNESS} PRIVATE pthread)\n\ntarget_link_libraries(smc-shared-1.${BITNESS} PRIVATE rt pthread)\n\ntarget_link_libraries(smc-shared-2.${BITNESS} PRIVATE rt pthread)\n\ntarget_link_libraries(thunk_testlib.${BITNESS} PRIVATE ${CMAKE_DL_LIBS})\n\ntarget_link_libraries(timer-sigev-thread.${BITNESS} PRIVATE rt pthread)\n\ntarget_link_libraries(smc-unexec-stack.${BITNESS} PRIVATE -Wl,-z,noexecstack)\n\ntarget_link_options(smc-exec-stack.${BITNESS} PRIVATE -Wl,-z,execstack)\n\n# Must use lld because it has the nognustack option\ntarget_link_options(smc-missing-gnustack.${BITNESS} PRIVATE -fuse-ld=lld -Wl,-z,nognustack)\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/cpu/cpu_count.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <cpuid.h>\n#include <optional>\n#include <unistd.h>\n#include <thread>\n\nTEST_CASE(\"cpu count - libraries\") {\n  const auto hw_concurrency = std::thread::hardware_concurrency();\n  CHECK(hw_concurrency == sysconf(_SC_NPROCESSORS_CONF));\n  CHECK(hw_concurrency == sysconf(_SC_NPROCESSORS_ONLN));\n}\n\nstruct core_info {\n  uint32_t local_apicid;\n  uint32_t max_addressible_ids;\n  uint32_t cores;\n  uint32_t threads;\n  bool HTT;\n};\n\nstruct cpuid_fn {\n  uint32_t eax, ebx, ecx, edx;\n};\n\ncpuid_fn get_cpuid(uint32_t func, uint32_t leaf = 0) {\n  cpuid_fn fn {};\n  __asm volatile(\"cpuid\" : \"=a\"(fn.eax), \"=b\"(fn.ebx), \"=c\"(fn.ecx), \"=d\"(fn.edx) : \"a\"(func), \"c\"(leaf));\n\n  return fn;\n}\n\nstd::optional<core_info> cpuid_calculate_core_info() {\n  core_info info {};\n\n  // Legacy path\n  const auto cpuid_fn_0 = get_cpuid(0);\n  if (cpuid_fn_0.eax < 1) {\n    return std::nullopt;\n  }\n\n  const auto cpuid_fn_1 = get_cpuid(1);\n\n  info.local_apicid = cpuid_fn_1.ebx >> 24;\n  info.HTT = (cpuid_fn_1.edx >> 28) & 1;\n\n  const auto cpuid_fn_8000_0000 = get_cpuid(0x8000'0000U);\n\n  if (cpuid_fn_8000_0000.eax < 0x8000'0008) {\n    return std::nullopt;\n  }\n\n  const auto cpuid_fn_8000_0008 = get_cpuid(0x8000'0008U);\n  const uint32_t apic_id_size = (cpuid_fn_8000_0008.ecx >> 12) & 0xF;\n\n  // E.5.2: MNLP (Maximum Number of Logical Processors)\n  uint32_t MNLP {};\n\n  if (apic_id_size) {\n    // Extended topology.\n    MNLP = 1 << apic_id_size;\n  } else {\n    // Legacy path.\n    MNLP = (cpuid_fn_8000_0008.ecx & 0xF) + 1;\n  }\n\n  info.max_addressible_ids = MNLP;\n\n  const auto cpuid_fn_4 = get_cpuid(4);\n  if (cpuid_fn_4.eax & 0xF) {\n    // Intel exclusive cpuid function, AMD returns zero as unsupported.\n    // `Maximum number of addressable IDs for processor cores in the physical package`\n    info.cores = (cpuid_fn_4.eax >> 26) + 1;\n    if (info.HTT) {\n      // `A value of 1 for HTT indicates the value in CPUID.1.EBX[23:16] (the Maximum number of addressable IDs for logical processors in\n      // this package) is valid for the package. `Maximum number of addressable IDs for logical processors in this physical package`\n      info.threads = (cpuid_fn_1.ebx >> 16) & 0xFF;\n    } else {\n      info.threads = info.cores;\n    }\n  } else if (info.HTT) {\n    info.cores = (cpuid_fn_1.ebx >> 16) & 0xFF;\n    info.threads = info.cores * 2;\n  } else {\n    // Legacy path means cores/threads is equal to MNLP.\n    info.cores = info.threads = MNLP;\n  }\n\n  return info;\n}\n\nTEST_CASE(\"cpu count - cpuid\") {\n  const auto hw_concurrency = std::thread::hardware_concurrency();\n  const auto core_info = cpuid_calculate_core_info();\n  REQUIRE(core_info.has_value());\n  CHECK(core_info->local_apicid < hw_concurrency);\n  CHECK(core_info->local_apicid < core_info->max_addressible_ids);\n  CHECK(core_info->max_addressible_ids >= hw_concurrency);\n  if (core_info->HTT) {\n    // May not be entirely correct on systems that mix HTT and non-HTT cpu cores.\n    CHECK((core_info->cores * 2) == core_info->threads);\n  } else {\n    CHECK(core_info->cores == core_info->threads);\n  }\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/fd/test_close_range.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <cstdint>\n#include <unistd.h>\n\nTEST_CASE(\"Close Range\") {\n  int fd_base = dup(STDOUT_FILENO);\n  for (size_t i = 0; i < 15; ++i) {\n    REQUIRE(dup(fd_base) >= 0);\n  }\n\n  // Specifically testing last as ~0U to ensure FEX doesn't hang\n  constexpr uint32_t SYS_close_range = 436;\n  ::syscall(SYS_close_range, fd_base + 1, ~0U, 0);\n\n  // Ensure that fd_base itself wasn't closed in close_range\n  CHECK(close(fd_base) == 0);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/fs/self_symlink.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <filesystem>\n\nTEST_CASE(\"proc-self symlink\") {\n  // Saw with the Darwinia Linux game port.\n  // It sanity checks that `/proc/self/exe` is a symlink and also that it points to a regular file.\n  // This uses newfsstatat or statx behind the scenes which FEX didn't handle this edge-case correctly.\n\n  // Create a path with /proc/self/exe\n  std::filesystem::path path {\"/proc/self/exe\"};\n\n  // Check the status of the file with status first.\n  std::error_code ec;\n  auto status = std::filesystem::status(path, ec);\n\n  // No error\n  REQUIRE(!ec);\n  CHECK(status.type() == std::filesystem::file_type::regular);\n\n  // Now check the status with symlink_status.\n  status = std::filesystem::symlink_status(path, ec);\n\n  // No error\n  REQUIRE(!ec);\n  CHECK(status.type() == std::filesystem::file_type::symlink);\n\n  // The game would then continue to read std::filesystem::read_symlink.\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/include/fpstate.h",
    "content": "#pragma once\n#include <cstdint>\n\nnamespace FEX::Unittests {\n#ifndef __x86_64__\nstruct __uint128_t {\n  uint64_t raw[2];\n};\n#endif\nstruct fpx_sw_bytes {\n  static constexpr uint32_t FP_XSTATE_MAGIC_1 = 0x46505853;\n  static constexpr uint32_t FP_XSTATE_MAGIC_2 = 0x46505845;\n\n  enum FeatureFlag : uint32_t {\n    FEATURE_FP = 1U << 0,\n    FEATURE_SSE = 1U << 1,\n    FEATURE_YMM = 1U << 2,\n    FEATURE_BNDREGS = 1U << 3,\n    FEATURE_BNDCSR = 1U << 4,\n    FEATURE_OPMASK = 1U << 5,\n    FEATURE_ZMM_Hi256 = 1U << 6,\n    FEATURE_Hi16_ZMM = 1U << 7,\n    FEATURE_PT_UNIMPL = 1U << 8,\n    FEATURE_PKRU = 1U << 9,\n    FEATURE_PASID = 1U << 10,\n    FEATURE_RESERVED11 = 1U << 11,\n    FEATURE_RESERVED12 = 1U << 12,\n    FEATURE_RESERVED13 = 1U << 13,\n    FEATURE_RESERVED14 = 1U << 14,\n    FEATURE_LBR = 1U << 15,\n    FEATURE_RESERVED16 = 1U << 16,\n    FEATURE_XTILE_CFG = 1U << 17,\n    FEATURE_XTILE_DATA = 1U << 18,\n  };\n\n  bool HasExtendedContext() const {\n    return magic1 == FP_XSTATE_MAGIC_1;\n  }\n\n  bool HasYMMH() const {\n    return (xfeatures & FEATURE_YMM) != 0;\n  }\n\n  // If magic1 is set to FP_XSTATE_MAGIC_1, then the encompassing\n  // frame is an xstate frame. If 0, then it's a legacy frame.\n  uint32_t magic1;\n\n  // Total size of the fpstate area\n  // - magic1 = 0                 -> sizeof(fpstate)\n  // - magic1 = FP_XSTATE_MAGIC_1 -> sizeof(xstate) + extensions (if any)\n  uint32_t extended_size;\n\n  // Feature bitmask describing supported features.\n  uint64_t xfeatures;\n\n  // Actual XSAVE state size, based on above xfeatures\n  uint32_t xstate_size;\n\n  // Reserved data\n  uint32_t padding[7];\n};\nstatic_assert(sizeof(fpx_sw_bytes) == 48);\n\nstruct xstate_header {\n  uint64_t xfeatures;\n  uint64_t reserved1[2];\n  uint64_t reserved2[5];\n};\nstatic_assert(sizeof(xstate_header) == 64);\n\nstruct ymmh_state {\n  __uint128_t ymmh_space[16];\n};\nstatic_assert(sizeof(ymmh_state) == 256);\n\n#ifdef __x86_64__\nstruct _libc_fpstate {\n  // This is in FXSAVE format\n  uint16_t fcw;\n  uint16_t fsw;\n  uint16_t ftw;\n  uint16_t fop;\n  uint64_t fip;\n  uint64_t fdp;\n  uint32_t mxcsr;\n  uint32_t mxcsr_mask;\n  __uint128_t _st[8];\n  __uint128_t _xmm[16];\n  uint32_t _res[12];\n\n  // Linux uses 12 of the bytes relegated for software purposes\n  // to store info describing any existing XSAVE context data.\n  fpx_sw_bytes sw_reserved;\n};\nstatic_assert(sizeof(FEX::Unittests::_libc_fpstate) == 512, \"This needs to be the right size\");\n\n/**\n * Extended state that includes both the main fpstate\n * and the extended state.\n */\nstruct xstate {\n  _libc_fpstate fpstate;\n  xstate_header xstate_hdr;\n  ymmh_state ymmh;\n};\nstatic_assert(sizeof(xstate) == 832);\n#else\n\nstruct _libc_fpreg {\n  uint16_t significand[4];\n  uint16_t exponent;\n};\nstatic_assert(sizeof(FEX::Unittests::_libc_fpreg) == 10, \"This needs to be the right size\");\n\nenum fpstate_magic {\n  // Legacy fpstate\n  MAGIC_FPU = 0xFFFF'0000,\n  // Contains extended state information\n  MAGIC_XFPSTATE = 0x0,\n};\nstruct _libc_fpstate {\n  uint32_t fcw;\n  uint32_t fsw;\n  uint32_t ftw;\n  uint32_t fop;\n  uint32_t cssel;\n  uint32_t dataoff;\n  uint32_t datasel;\n  FEX::Unittests::_libc_fpreg _st[8];\n  uint32_t status;\n\n  // Extended FPU data\n  uint32_t pad[6]; // Ignored FXSR data\n  uint32_t mxcsr;\n  uint32_t reserved;\n  __uint128_t _st_pad[8];   // Ignored st data\n  __uint128_t _xmm[8];      // First 8 XMM registers\n  uint32_t pad2[44];        // Second 8 XMM registers plus padding\n  fpx_sw_bytes sw_reserved; // extended state encoding\n};\nstatic_assert(sizeof(FEX::Unittests::_libc_fpstate) == 624, \"This needs to be the right size\");\n\nstruct xstate {\n  _libc_fpstate fpstate;\n  xstate_header xstate_hdr;\n  ymmh_state ymmh;\n};\nstatic_assert(sizeof(xstate) == 944);\n#endif\n} // namespace FEX::Unittests\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/include/simple_x86.h",
    "content": "#pragma once\n#include <cstdint>\n\nclass SimpleX86Emit final {\npublic:\n  enum Reg {\n    RAX = 0,\n    RCX = 1,\n    RDX = 2,\n    RBX = 3,\n    RSP = 4,\n    RBP = 5,\n    RSI = 6,\n    RDI = 7,\n    // r8 and higher not implemented.\n  };\n  SimpleX86Emit(void* Ptr, std::size_t size)\n    : Ptr {static_cast<uint8_t*>(Ptr)}\n    , EndPtr {static_cast<uint8_t*>(Ptr) + size} {}\n\n  void ret() {\n    db<uint8_t>(0xc3);\n  }\n\n  void mov(Reg reg, uint32_t val) {\n    db<uint8_t>(0xB8 + reg);\n    db(val);\n  }\n\n  void dd(uint32_t val) {\n    db(val);\n  }\n\n  bool HadError() const {\n    return _HadError;\n  }\n\nprivate:\n  uint8_t* Ptr;\n  uint8_t* EndPtr;\n  bool _HadError {};\n\n  template<typename T>\n  void db(T v) {\n    static_assert(sizeof(uint32_t) == 4);\n    std::size_t i {};\n    for (i = 0; i < sizeof(T) && Ptr != EndPtr; ++i) {\n      *Ptr = v >> (i * 8);\n      ++Ptr;\n    }\n\n    _HadError = i != sizeof(T);\n  }\n};\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/Syscall_state.32.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n#include <csetjmp>\n#include <unistd.h>\n#include <sys/syscall.h>\n#include <signal.h>\n#include <string.h>\n#include <sys/wait.h>\n\nstruct CPUState {\n  uint32_t Registers[8];\n  uint32_t eflags;\n};\n\nCPUState CapturedState {};\n\nenum RegNums {\n  TEST_REG_EAX = 0,\n  TEST_REG_EBX,\n  TEST_REG_ECX,\n  TEST_REG_EDX,\n  TEST_REG_ESI,\n  TEST_REG_EDI,\n  TEST_REG_ESP,\n  TEST_REG_EBP,\n};\n\n__attribute__((naked)) void DoZeroRegSyscallFault(CPUState State) {\n  // i386 stores arguments on the stack.\n  __asm volatile(\n    R\"(\n    // Load flags\n    push dword ptr [esp + %[FlagsOffset]]\n    popfd\n\n    // Do getpid syscall.\n    // Overwrites some arguments.\n    // Syscall num\n    mov eax, dword ptr [esp + %[RAXOffset]]\n\n    // Load remaining registers that we can\n    mov ebx, dword ptr [esp + %[RBXOffset]];\n    mov ecx, dword ptr [esp + %[RCXOffset]];\n    mov edx, dword ptr [esp + %[RDXOffset]]\n    mov esi, dword ptr [esp + %[RSIOffset]]\n    mov edi, dword ptr [esp + %[RDIOffset]];\n    mov ebp, dword ptr [esp + %[RBPOffset]];\n    // Can't load RSP\n\n    int 0x80;\n\n    // Immediately fault\n    hlt;\n\n    // We long jump from the signal handler, so this won't continue.\n  )\"\n    :\n    // The stack is offset by 4-bytes due to the call.\n    : [RAXOffset] \"i\"(offsetof(CPUState, Registers[TEST_REG_EAX]) + 4), [RDXOffset] \"i\"(offsetof(CPUState, Registers[TEST_REG_EDX]) + 4),\n      [RSIOffset] \"i\"(offsetof(CPUState, Registers[TEST_REG_ESI]) + 4), [RDIOffset] \"i\"(offsetof(CPUState, Registers[TEST_REG_EDI]) + 4),\n      [RBXOffset] \"i\"(offsetof(CPUState, Registers[TEST_REG_EBX]) + 4), [RCXOffset] \"i\"(offsetof(CPUState, Registers[TEST_REG_ECX]) + 4),\n      [RBPOffset] \"i\"(offsetof(CPUState, Registers[TEST_REG_EBP]) + 4), [FlagsOffset] \"i\"(offsetof(CPUState, eflags) + 4)\n\n    : \"memory\");\n}\n\nstatic jmp_buf LongJump {};\nstatic void CapturingHandler(int signal, siginfo_t* siginfo, void* context) {\n  ucontext_t* _context = (ucontext_t*)context;\n\n  auto RAX = _context->uc_mcontext.gregs[REG_EAX];\n  if (RAX > -4095U) {\n    // Failure to syscall\n    fprintf(stderr, \"Parent thread failed to syscall: %d %s\\n\", static_cast<uint32_t>(-RAX), strerror(-RAX));\n    _exit(1);\n  }\n\n  CPUState& State = CapturedState;\n\n  // These aren't 1:1 mapped\n#define COPY(REG) State.Registers[TEST_REG_##REG] = _context->uc_mcontext.gregs[REG_##REG];\n  COPY(EAX);\n  COPY(EBX);\n  COPY(ECX);\n  COPY(EDX);\n  COPY(ESI);\n  COPY(EDI);\n  COPY(ESP);\n  COPY(EBP);\n\n  longjmp(LongJump, 1);\n}\n\n\nTEST_CASE(\"getppid: State\") {\n  // Set up a signal handler for SIGSEGV\n  struct sigaction act {};\n  act.sa_sigaction = CapturingHandler;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGSEGV, &act, nullptr);\n\n  CPUState Object = {\n    .Registers =\n      {\n        0x1011'1213ULL,\n        0x2022'2223ULL,\n        0x3033'3233ULL,\n        0x4044'4243ULL,\n        0x5055'5253ULL,\n        0x6066'6263ULL,\n        0x7077'7273ULL,\n        0x8088'8283ULL,\n      },\n    .eflags = (1U << 0) | // CF\n              (1U << 1) | // RA1\n              (1U << 2) | // PF\n              (1U << 4) | // AF\n              (1U << 6) | // ZF\n              (1U << 7) | // CF\n              (1U << 9) | // IF (Is always 1 in userspace)\n              (1U << 11)  // OF\n  };\n\n  constexpr uint64_t SyscallNum = SYS_sched_yield;\n  Object.Registers[TEST_REG_EAX] = SyscallNum;\n  int Value = setjmp(LongJump);\n  if (Value == 0) {\n    DoZeroRegSyscallFault(Object);\n  }\n\n  for (size_t i = 0; i < (sizeof(Object.Registers) / sizeof(Object.Registers[0])); ++i) {\n    if (i == TEST_REG_ESP || i == TEST_REG_EAX) {\n      // Needs special handling.\n      continue;\n    }\n\n    CHECK(Object.Registers[i] == CapturedState.Registers[i]);\n  }\n\n  // Syscall success return\n  CHECK(CapturedState.Registers[TEST_REG_EAX] == 0);\n  // RSP is untested here.\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/Syscall_state.64.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n#include <csetjmp>\n#include <unistd.h>\n#include <sys/syscall.h>\n#include <signal.h>\n#include <string.h>\n#include <sys/wait.h>\n\nstruct CPUState {\n  uint64_t Registers[16];\n\n  uint64_t eflags;\n};\n\nCPUState CapturedState {};\n\n// This refers to the label defined in the inline ASM below.\nextern \"C\" uint64_t HLT_INST;\nvoid* const HaltLocation = &HLT_INST;\n\n__attribute__((naked)) void DoZeroRegSyscallFault(CPUState* State) {\n  // x86-64 ABI puts State pointer in to RDI\n  __asm volatile(R\"(\n    // Save some registers\n    push rbx\n    push rbp\n    push r12\n    push r13\n    push r14\n    push r15\n\n    // Load flags\n    push qword ptr [rdi + %[FlagsOffset]]\n    popfq\n\n    // Do getpid syscall.\n    // Overwrites some arguments.\n    // Syscall num\n    mov rax, qword ptr [rdi + %[RAXOffset]]\n\n    // Load remaining registers that we can\n    mov rbx, qword ptr [rdi + %[RBXOffset]];\n    mov rcx, qword ptr [rdi + %[RCXOffset]];\n    mov rdx, qword ptr [rdi + %[RDXOffset]]\n    mov rsi, qword ptr [rdi + %[RSIOffset]]\n    mov rbp, qword ptr [rdi + %[RBPOffset]];\n    // Can't load RSP\n    mov r8, qword ptr [rdi + %[R8Offset]]\n    mov r9, qword ptr [rdi + %[R9Offset]];\n    mov r10, qword ptr [rdi + %[R10Offset]]\n    mov r11, qword ptr [rdi + %[R11Offset]];\n    mov r12, qword ptr [rdi + %[R12Offset]];\n    mov r13, qword ptr [rdi + %[R13Offset]];\n    mov r14, qword ptr [rdi + %[R14Offset]];\n    mov r15, qword ptr [rdi + %[R15Offset]];\n\n    // Overwrite RDI last.\n    mov rdi, qword ptr [rdi + %[RDIOffset]];\n\n    syscall;\n\n    // Immediately fault\n    HLT_INST:\n    hlt;\n\n    // We long jump from the signal handler, so this won't continue.\n  )\"\n                 :\n                 : [RAXOffset] \"i\"(offsetof(CPUState, Registers[REG_RAX])), [RDXOffset] \"i\"(offsetof(CPUState, Registers[REG_RDX])),\n                   [R10Offset] \"i\"(offsetof(CPUState, Registers[REG_R10])), [R8Offset] \"i\"(offsetof(CPUState, Registers[REG_R8])),\n                   [RSIOffset] \"i\"(offsetof(CPUState, Registers[REG_RSI])), [RDIOffset] \"i\"(offsetof(CPUState, Registers[REG_RDI])),\n                   [RBXOffset] \"i\"(offsetof(CPUState, Registers[REG_RBX])), [RCXOffset] \"i\"(offsetof(CPUState, Registers[REG_RCX])),\n                   [RBPOffset] \"i\"(offsetof(CPUState, Registers[REG_RBP])), [R9Offset] \"i\"(offsetof(CPUState, Registers[REG_R9])),\n                   [R11Offset] \"i\"(offsetof(CPUState, Registers[REG_R11])), [R12Offset] \"i\"(offsetof(CPUState, Registers[REG_R12])),\n                   [R13Offset] \"i\"(offsetof(CPUState, Registers[REG_R13])), [R14Offset] \"i\"(offsetof(CPUState, Registers[REG_R14])),\n                   [R15Offset] \"i\"(offsetof(CPUState, Registers[REG_R15])), [FlagsOffset] \"i\"(offsetof(CPUState, eflags))\n\n                 : \"memory\");\n}\n\n\nstatic jmp_buf LongJump {};\nstatic void CapturingHandler(int signal, siginfo_t* siginfo, void* context) {\n  ucontext_t* _context = (ucontext_t*)context;\n\n  auto RAX = _context->uc_mcontext.gregs[REG_RAX];\n  if (RAX > -4095U) {\n    // Failure to syscall\n    fprintf(stderr, \"Parent thread failed to syscall: %ld %s\\n\", static_cast<uint64_t>(-RAX), strerror(-RAX));\n    _exit(1);\n  }\n\n  CPUState& State = CapturedState;\n\n  memcpy(&State.Registers, _context->uc_mcontext.gregs, sizeof(State.Registers));\n\n  longjmp(LongJump, 1);\n}\n\n\nTEST_CASE(\"getppid: State\") {\n  // Set up a signal handler for SIGSEGV\n  struct sigaction act {};\n  act.sa_sigaction = CapturingHandler;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGSEGV, &act, nullptr);\n\n  CPUState Object = {\n    .Registers =\n      {\n        0x1011'1213'1415'1617ULL,\n        0x2022'2223'2425'2627ULL,\n        0x3033'3233'3435'3637ULL,\n        0x4044'4243'4445'4647ULL,\n        0x5055'5253'5455'5657ULL,\n        0x6066'6263'6465'6667ULL,\n        0x7077'7273'7475'7677ULL,\n        0x8088'8283'8485'8687ULL,\n        0x9099'9293'9495'9697ULL,\n        0xA0AA'A2A3'A4A5'A6A7ULL,\n        0xB0BB'B2B3'B4B5'B6B7ULL,\n        0xC0CC'C2C3'C4C5'C6C7ULL,\n        0xD0DD'D2D3'D4D5'D6D7ULL,\n        0xE0EE'E2E3'E4E5'E6E7ULL,\n        0xF0FF'F2F3'F4F5'F6F7ULL,\n        0x0000'0203'0405'0607ULL,\n      },\n    .eflags = (1U << 0) | // CF\n              (1U << 1) | // RA1\n              (1U << 2) | // PF\n              (1U << 4) | // AF\n              (1U << 6) | // ZF\n              (1U << 7) | // CF\n              (1U << 9) | // IF (Is always 1 in userspace)\n              (1U << 11)  // OF\n  };\n\n  constexpr uint64_t SyscallNum = SYS_sched_yield;\n  Object.Registers[REG_RAX] = SyscallNum;\n  int Value = setjmp(LongJump);\n  if (Value == 0) {\n    DoZeroRegSyscallFault(&Object);\n  }\n\n  for (size_t i = 0; i < 16; ++i) {\n    if (i == REG_R11 || i == REG_RCX || i == REG_RSP || i == REG_RAX) {\n      // Needs special handling.\n      continue;\n    }\n\n    CHECK(Object.Registers[i] == CapturedState.Registers[i]);\n  }\n\n  // Syscall success return\n  CHECK(CapturedState.Registers[REG_RAX] == 0);\n\n  // syscall instruction RCX return.\n  CHECK(CapturedState.Registers[REG_RCX] == reinterpret_cast<uint64_t>(HaltLocation));\n\n  // Syscall instruction R11 eflags return.\n  CHECK(Object.eflags == CapturedState.Registers[REG_R11]);\n\n  // RSP is untested here.\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/SystemInstructions.64.cpp",
    "content": "#include \"invalid_util.h\"\n\n#include <catch2/catch_test_macros.hpp>\n\n#include <atomic>\n#include <signal.h>\n#include <sys/mman.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <cstdlib>\n\n#ifndef REG_RIP\n#define REG_RIP REG_EIP\n#endif\n\nenum trapno {\n  X86_TRAPNO_UD = 6,\n  X86_TRAPNO_GP = 13,\n};\n\n#define CONCAT(x, y) x##y\n#define TestSymbols(num)                       \\\n  extern \"C\" uint64_t CONCAT(TestBegin_, num); \\\n  extern \"C\" uint64_t CONCAT(TestEnd_, num);\n\n#define Test(num, asm, trapno, errno, si_code, signal)                                                      \\\n  capturing_handler_skip = (unsigned long)&CONCAT(TestEnd_, num) - (unsigned long)&CONCAT(TestBegin_, num); \\\n  const unsigned long EXPECTED_RIP = (unsigned long)&CONCAT(TestBegin_, num);                               \\\n  const int EXPECTED_TRAPNO = trapno;                                                                       \\\n  const int EXPECTED_ERR = errno;                                                                           \\\n  const int EXPECTED_SI_CODE = si_code;                                                                     \\\n  const int EXPECTED_SIGNAL = signal;                                                                       \\\n  __asm volatile(\"TestBegin_\" #num \":\" asm \";\"                                                              \\\n                                           \"TestEnd_\" #num \":\" ::                                           \\\n                                             : \"memory\");\n\n\n#define TEST(num, name, asm, trapno, errno, _si_code, _signal)      \\\n  TestSymbols(num);                                                 \\\n  TEST_CASE(\"Signals: \" #name) {                                    \\\n    struct sigaction act {};                                        \\\n    act.sa_sigaction = CapturingHandler;                            \\\n    act.sa_flags = SA_SIGINFO;                                      \\\n    sigaction(SIGSEGV, &act, nullptr);                              \\\n    sigaction(SIGTRAP, &act, nullptr);                              \\\n    sigaction(SIGILL, &act, nullptr);                               \\\n                                                                    \\\n    Test(num, asm, trapno, errno, _si_code, _signal);               \\\n                                                                    \\\n    REQUIRE(from_handler.has_value());                              \\\n    CHECK(from_handler->mctx.gregs[REG_RIP] == EXPECTED_RIP);       \\\n    CHECK(from_handler->mctx.gregs[REG_TRAPNO] == EXPECTED_TRAPNO); \\\n    CHECK(from_handler->mctx.gregs[REG_ERR] == EXPECTED_ERR);       \\\n    CHECK(from_handler->si_code == EXPECTED_SI_CODE);               \\\n    CHECK(from_handler->signal == EXPECTED_SIGNAL);                 \\\n  }\n\n// Instructions that explicitly are supported but must only work in CPL-0\nTEST(0, \"rdmsr\", \"rdmsr\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(1, \"outs\", \"outs dx, byte ptr [rsi]\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(2, \"ins\", \"ins byte ptr [rdi], dx\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(3, \"cli\", \"cli\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(4, \"clts\", \"clts\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(5, \"invlpg\", \"invlpg [rax]\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(6, \"lmsw\", \"lmsw [rax]\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(7, \"ltr\", \"ltr [rax]\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(8, \"mov cr0\", \"mov cr0, rax\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(9, \"mov cr8\", \"mov cr8, rax\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(10, \"mov rax, cr0\", \"mov rax, cr0\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(11, \"mov rax, cr8\", \"mov rax, cr8\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(12, \"mov rax, dr0\", \"mov rax, dr0\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(13, \"mov dr0, rax\", \"mov dr0, rax\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(14, \"rdpmc\", \"rdpmc\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(15, \"sti\", \"sti\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\nTEST(16, \"swapgs\", \"swapgs\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\n#ifdef __clang__\nTEST(17, \"sysret\", \"sysret\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\n#else\nTEST(17, \"sysret\", \"sysretd\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\n#endif\nTEST(18, \"wrmsr\", \"wrmsr\", X86_TRAPNO_GP, 0, 0x80, SIGSEGV);\n\n// Instructions not implemented\nTEST(19, \"monitor\", \"monitor\", X86_TRAPNO_UD, 0, 2, SIGILL);\nTEST(20, \"mwait\", \"mwait\", X86_TRAPNO_UD, 0, 2, SIGILL);\nTEST(21, \"sysenter\", \"sysenter\", X86_TRAPNO_UD, 0, 2, SIGILL);\n#ifdef __clang__\nTEST(22, \"sysexit\", \"sysexit\", X86_TRAPNO_UD, 0, 2, SIGILL);\n#else\nTEST(22, \"sysexit\", \"sysexitd\", X86_TRAPNO_UD, 0, 2, SIGILL);\n#endif\n\n// Differs between dr8 and dr0-7 variants.\n// dr0-7: SIGSEGV\n// dr8-15: SIGILL\n// TEST(20, \"mov rax, dr8\", \"mov rax, dr8\", X86_TRAPNO_UD, 0, 2, SIGILL);\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/eflags_signal.cpp",
    "content": "#include <atomic>\n#include <catch2/catch_test_macros.hpp>\n#include <fstream>\n#include <functional>\n#include <optional>\n#include <signal.h>\n#include <thread>\n#include <sys/syscall.h>\n#include <linux/futex.h>\n\n#if __SIZEOF_POINTER__ == 4\n#define DO_ASM(x, y)                                                                                                               \\\n  __asm volatile(x                                    /* Need to late move syscall number since incoming asm will overwrite eax */ \\\n                 \" mov eax, %[Syscall];\"              /* Notify we are ready (Without touching flags) */                           \\\n                 \"mov dword ptr [%[ReadyNotify]], 1;\" /* Do a futex */                                                             \\\n                 \"int 0x80;\" y                                                                                                     \\\n                 :                                                                                                                 \\\n                 : [Syscall] \"i\"(SYS_futex), \"b\"(Futex), \"c\"(FUTEX_WAIT), \"d\"(0), \"S\"(0), [ReadyNotify] \"r\"(ReadyNotify)           \\\n                 : \"cc\", \"memory\", \"eax\")\n#else\n\n#define DO_ASM(x, y)                                                                                                                                            \\\n  __asm volatile(                                                                                                                                               \\\n    x /* Do a futex */                                                                                                                                          \\\n    \" mov rax, %[Syscall];\"                                                                                                                                     \\\n    \" mov rdi, %[FutexAddr];\"                                                                                                                                   \\\n    \" mov rsi, %[FutexOp];\"                                                                                                                                     \\\n    \" mov rdx, %[ExpectedValue];\"                                                                                                                               \\\n    \" mov r10, %[TimeoutAddr];\" /* Notify we are ready (Without touching flags) */                                                                              \\\n    \"mov dword ptr [%[ReadyNotify]], 1;\"                                                                                                                        \\\n    \"syscall;\" y                                                                                                                                                \\\n    :                                                                                                                                                           \\\n    : [Syscall] \"i\"(SYS_futex), [FutexAddr] \"r\"(Futex), [FutexOp] \"i\"(FUTEX_WAIT), [ExpectedValue] \"i\"(0), [TimeoutAddr] \"i\"(0), [ReadyNotify] \"r\"(ReadyNotify) \\\n    : \"cc\", \"memory\", \"rax\", \"rdi\", \"rsi\", \"rdx\", \"r10\")\n#endif\n\nstatic void ClearCFAndWait(std::atomic<uint32_t>* Futex, std::atomic<uint32_t>* ReadyNotify) {\n  DO_ASM(\n    // Clear CF\n    \"clc;\",\n    // CF should still be cleared.\n    \"jnc 1f;\"\n    \"int3;\"\n    \"1:\");\n}\n\nstatic void SetCFAndWait(std::atomic<uint32_t>* Futex, std::atomic<uint32_t>* ReadyNotify) {\n  DO_ASM(\n    // Set CF\n    \"stc;\",\n    // CF should still be set.\n    \"jc 1f;\"\n    \"int3;\"\n    \"1:\");\n}\n\nstatic void ClearPFAndWait(std::atomic<uint32_t>* Futex, std::atomic<uint32_t>* ReadyNotify) {\n  DO_ASM(\n    // Clear PF\n    \"mov eax, 0;\"\n    \"inc eax;\",\n\n    // PF should still be cleared.\n    \"jnp 1f;\"\n    \"int3;\"\n    \"1:\");\n}\n\nstatic void SetPFAndWait(std::atomic<uint32_t>* Futex, std::atomic<uint32_t>* ReadyNotify) {\n  DO_ASM(\n    // Set PF\n    \"mov eax, 0x80;\"\n    \"inc eax;\",\n    // PF should still be set.\n    \"jp 1f;\"\n    \"int3;\"\n    \"1:\");\n}\n\nstatic void ClearZFAndWait(std::atomic<uint32_t>* Futex, std::atomic<uint32_t>* ReadyNotify) {\n  DO_ASM(\n    // Clear ZF\n    \"mov eax, 2;\"\n    \"dec eax;\",\n    // ZF should still be cleared.\n    \"jnz 1f;\"\n    \"int3;\"\n    \"1:\");\n}\n\nstatic void SetZFAndWait(std::atomic<uint32_t>* Futex, std::atomic<uint32_t>* ReadyNotify) {\n  DO_ASM(\n    // Set ZF\n    \"mov eax, 1;\"\n    \"dec eax;\",\n    // ZF should still be set.\n    \"jz 1f;\"\n    \"int3;\"\n    \"1:\");\n}\n\nstatic void ClearSFAndWait(std::atomic<uint32_t>* Futex, std::atomic<uint32_t>* ReadyNotify) {\n  DO_ASM(\n    // Clear SF\n    \"mov eax, 1;\"\n    \"dec eax;\",\n    // SF should still be cleared.\n    \"jns 1f;\"\n    \"int3;\"\n    \"1:\");\n}\n\nstatic void SetSFAndWait(std::atomic<uint32_t>* Futex, std::atomic<uint32_t>* ReadyNotify) {\n  DO_ASM(\n    // Set SF\n    \"mov eax, 0;\"\n    \"dec eax;\",\n    // SF should still be set.\n    \"js 1f;\"\n    \"int3;\"\n    \"1:\");\n}\n\nstatic void ClearOFAndWait(std::atomic<uint32_t>* Futex, std::atomic<uint32_t>* ReadyNotify) {\n  DO_ASM(\n    // Clear OF\n    \"mov eax, 0;\"\n    \"inc eax;\",\n    // OF should still be cleared.\n    \"jno 1f;\"\n    \"int3;\"\n    \"1:\");\n}\n\nstatic void SetOFAndWait(std::atomic<uint32_t>* Futex, std::atomic<uint32_t>* ReadyNotify) {\n  DO_ASM(\n    // Set OF\n    \"mov eax, 0x7fffffff;\"\n    \"inc eax;\",\n    // OF should still be set.\n    \"jo 1f;\"\n    \"int3;\"\n    \"1:\");\n}\n\nstruct CapturingData {\n  int Signal;\n  uint64_t eflags;\n};\n\nstd::optional<CapturingData> from_handler;\nconstexpr uint32_t EFL_CF = 0;\nconstexpr uint32_t EFL_PF = 2;\nconstexpr uint32_t EFL_ZF = 6;\nconstexpr uint32_t EFL_SF = 7;\nconstexpr uint32_t EFL_OF = 11;\n\nstatic void CapturingHandler(int signal, siginfo_t* siginfo, void* context) {\n  ucontext_t* _context = (ucontext_t*)context;\n\n  from_handler = {\n    .Signal = signal,\n    .eflags = static_cast<uint64_t>(_context->uc_mcontext.gregs[REG_EFL]),\n  };\n}\n\nusing TestHandler = std::function<void(std::atomic<uint32_t>* Futex, std::atomic<uint32_t>* ReadyNotify)>;\n\nstatic void ThreadHandler(std::atomic<uint32_t>* Mutex, std::atomic<uint32_t>* ReadyNotify, std::atomic<uint32_t>* ThreadID, TestHandler Test) {\n  // Unblock SIGTERM.\n  sigset_t BlockMask {};\n  sigemptyset(&BlockMask);\n  sigaddset(&BlockMask, SIGTERM);\n  sigprocmask(SIG_UNBLOCK, &BlockMask, nullptr);\n\n  // Set up a signal handler for SIGTERM\n  struct sigaction act {};\n  act.sa_sigaction = CapturingHandler;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGTERM, &act, nullptr);\n\n  *ThreadID = ::gettid();\n  Test(Mutex, ReadyNotify);\n}\n\nvoid WaitForThreadAsleep(uint32_t tid) {\n  std::string Path = \"/proc/\" + std::to_string(::getpid()) + \"/task/\" + std::to_string(tid) + \"/status\";\n  std::ifstream fs {Path, std::fstream::binary};\n  std::string Line;\n\n  while (true) {\n    fs.clear();\n    fs.seekg(0);\n    while (std::getline(fs, Line)) {\n      if (fs.eof()) {\n        break;\n      }\n\n      if (Line.find(\"State\") == Line.npos) {\n        continue;\n      }\n\n      char State {};\n      if (sscanf(Line.c_str(), \"State: %c\", &State) == 1) {\n        if (State == 'S') {\n          return;\n        }\n        break;\n      }\n    }\n  }\n}\nvoid RunTest(uint32_t FlagLocation, uint32_t FlagValue, TestHandler Test) {\n  // Block SIGTERM.\n  sigset_t BlockMask {};\n  sigemptyset(&BlockMask);\n  sigaddset(&BlockMask, SIGTERM);\n  sigprocmask(SIG_BLOCK, &BlockMask, nullptr);\n  std::atomic<uint32_t> Mutex {};\n  std::atomic<uint32_t> ReadyNotify {};\n  std::atomic<uint32_t> ThreadID {};\n\n  std::thread t(ThreadHandler, &Mutex, &ReadyNotify, &ThreadID, Test);\n\n  while (ReadyNotify.load() == 0)\n    ;\n  // Wait for thread to get in to the futex.\n  WaitForThreadAsleep(ThreadID.load());\n\n  tgkill(::getpid(), ThreadID.load(), SIGTERM);\n\n  t.join();\n\n  REQUIRE(from_handler.has_value());\n  CHECK(from_handler.value().Signal == SIGTERM);\n  CHECK(((from_handler.value().eflags >> FlagLocation) & 1) == FlagValue);\n  from_handler.reset();\n}\n\nTEST_CASE(\"Signal-Flags-CF-0\") {\n  RunTest(EFL_CF, 0, ClearCFAndWait);\n}\nTEST_CASE(\"Signal-Flags-CF-1\") {\n  RunTest(EFL_CF, 1, SetCFAndWait);\n}\nTEST_CASE(\"Signal-Flags-PF-0\") {\n  RunTest(EFL_PF, 0, ClearPFAndWait);\n}\nTEST_CASE(\"Signal-Flags-PF-1\") {\n  RunTest(EFL_PF, 1, SetPFAndWait);\n}\nTEST_CASE(\"Signal-Flags-ZF-0\") {\n  RunTest(EFL_ZF, 0, ClearZFAndWait);\n}\nTEST_CASE(\"Signal-Flags-ZF-1\") {\n  RunTest(EFL_ZF, 1, SetZFAndWait);\n}\nTEST_CASE(\"Signal-Flags-SF-0\") {\n  RunTest(EFL_SF, 0, ClearSFAndWait);\n}\nTEST_CASE(\"Signal-Flags-SF-1\") {\n  RunTest(EFL_SF, 1, SetSFAndWait);\n}\nTEST_CASE(\"Signal-Flags-OF-0\") {\n  RunTest(EFL_OF, 0, ClearOFAndWait);\n}\nTEST_CASE(\"Signal-Flags-OF-1\") {\n  RunTest(EFL_OF, 1, SetOFAndWait);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/into.32.cpp",
    "content": "#include <atomic>\n#include <signal.h>\n\nstd::atomic<bool> CorrectFaultData {false};\nstatic void handler(int signal, siginfo_t* siginfo, void* context) {\n  ucontext_t* _context = (ucontext_t*)context;\n\n  if (signal != SIGSEGV) {\n    return;\n  }\n\n  if (siginfo->si_addr != nullptr) {\n    return;\n  }\n\n  if (_context->uc_mcontext.gregs[REG_TRAPNO] != 4) {\n    return;\n  }\n\n  CorrectFaultData = true;\n}\n\nint main() {\n  struct sigaction act {};\n  act.sa_sigaction = handler;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGSEGV, &act, nullptr);\n\n  __asm volatile(R\"(\n  mov eax, 0x7f;\n  inc al;\n  into;\n  )\" ::\n                   : \"eax\");\n\n  return CorrectFaultData ? 0 : 1;\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/invalid_hlt.cpp",
    "content": "#include \"invalid_util.h\"\n\n#include <catch2/catch_test_macros.hpp>\n\n#include <atomic>\n#include <signal.h>\n#include <sys/mman.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <cstdlib>\n\nextern \"C\" void IntInstruction();\n\n#pragma GCC diagnostic ignored \"-Wattributes\" // Suppress warning in case control-flow checks aren't enabled\n__attribute__((naked, nocf_check)) static void InvalidINT() {\n  __asm volatile(R\"(\n    IntInstruction:\n    hlt;\n    ret;\n    )\");\n}\n\nunsigned long EXPECTED_RIP = reinterpret_cast<unsigned long>(&IntInstruction);\nconstexpr int EXPECTED_TRAPNO = 0xD;\nconstexpr int EXPECTED_ERR = 0;\nconstexpr int EXPECTED_SI_CODE = 128;\nconstexpr int EXPECTED_SIGNAL = SIGSEGV;\n\nTEST_CASE(\"Signals: Invalid HLT\") {\n  capturing_handler_skip = 1;\n  struct sigaction act {};\n  act.sa_sigaction = CapturingHandler;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGSEGV, &act, nullptr);\n  sigaction(SIGTRAP, &act, nullptr);\n  sigaction(SIGILL, &act, nullptr);\n\n  InvalidINT();\n\n#ifndef REG_RIP\n#define REG_RIP REG_EIP\n#endif\n\n  REQUIRE(from_handler.has_value());\n  CHECK(from_handler->mctx.gregs[REG_RIP] == EXPECTED_RIP);\n  CHECK(from_handler->mctx.gregs[REG_TRAPNO] == EXPECTED_TRAPNO);\n  CHECK(from_handler->mctx.gregs[REG_ERR] == EXPECTED_ERR);\n  CHECK(from_handler->si_code == EXPECTED_SI_CODE);\n  CHECK(from_handler->signal == EXPECTED_SIGNAL);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/invalid_int.cpp",
    "content": "#include \"invalid_util.h\"\n\n#include <catch2/catch_test_macros.hpp>\n\n#include <atomic>\n#include <signal.h>\n#include <sys/mman.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <cstdlib>\n\nextern \"C\" void IntInstruction();\n\n#pragma GCC diagnostic ignored \"-Wattributes\" // Suppress warning in case control-flow checks aren't enabled\n__attribute__((naked, nocf_check)) static void InvalidINT() {\n  __asm volatile(R\"(\n  IntInstruction:\n  int 0x2d;\n  ret;\n  )\");\n}\n\nunsigned long EXPECTED_RIP = reinterpret_cast<unsigned long>(&IntInstruction);\nconstexpr int EXPECTED_TRAPNO = 13;\nconstexpr int EXPECTED_ERR = 362;\nconstexpr int EXPECTED_SI_CODE = 128;\nconstexpr int EXPECTED_SIGNAL = SIGSEGV;\n\nTEST_CASE(\"Signals: Invalid INT\") {\n  capturing_handler_skip = 2;\n  struct sigaction act {};\n  act.sa_sigaction = CapturingHandler;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGSEGV, &act, nullptr);\n  sigaction(SIGTRAP, &act, nullptr);\n  sigaction(SIGILL, &act, nullptr);\n\n  InvalidINT();\n\n#ifndef REG_RIP\n#define REG_RIP REG_EIP\n#endif\n\n  REQUIRE(from_handler.has_value());\n  CHECK(from_handler->mctx.gregs[REG_RIP] == EXPECTED_RIP);\n  CHECK(from_handler->mctx.gregs[REG_TRAPNO] == EXPECTED_TRAPNO);\n  CHECK(from_handler->mctx.gregs[REG_ERR] == EXPECTED_ERR);\n  CHECK(from_handler->si_code == EXPECTED_SI_CODE);\n  CHECK(from_handler->signal == EXPECTED_SIGNAL);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/invalid_int1.cpp",
    "content": "#include \"invalid_util.h\"\n\n#include <catch2/catch_test_macros.hpp>\n\n#include <atomic>\n#include <signal.h>\n#include <sys/mman.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <cstdlib>\n\nextern \"C\" void IntInstruction();\n\n#pragma GCC diagnostic ignored \"-Wattributes\" // Suppress warning in case control-flow checks aren't enabled\n__attribute__((naked, nocf_check)) static void InvalidINT() {\n  __asm volatile(R\"(\n  IntInstruction:\n  .byte 0xF1; # int1\n  ret;\n  )\");\n}\n\nunsigned long EXPECTED_RIP = reinterpret_cast<unsigned long>(&IntInstruction) + 1;\nconstexpr int EXPECTED_TRAPNO = 1;\nconstexpr int EXPECTED_ERR = 0;\nconstexpr int EXPECTED_SI_CODE = 1;\nconstexpr int EXPECTED_SIGNAL = SIGTRAP;\n\nTEST_CASE(\"Signals: Invalid INT1\") {\n  capturing_handler_skip = 0;\n  struct sigaction act {};\n  act.sa_sigaction = CapturingHandler;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGSEGV, &act, nullptr);\n  sigaction(SIGTRAP, &act, nullptr);\n  sigaction(SIGILL, &act, nullptr);\n\n  InvalidINT();\n\n#ifndef REG_RIP\n#define REG_RIP REG_EIP\n#endif\n\n  REQUIRE(from_handler.has_value());\n  CHECK(from_handler->mctx.gregs[REG_RIP] == EXPECTED_RIP);\n  CHECK(from_handler->mctx.gregs[REG_TRAPNO] == EXPECTED_TRAPNO);\n  CHECK(from_handler->mctx.gregs[REG_ERR] == EXPECTED_ERR);\n  CHECK(from_handler->si_code == EXPECTED_SI_CODE);\n  CHECK(from_handler->signal == EXPECTED_SIGNAL);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/invalid_int3.cpp",
    "content": "#include \"invalid_util.h\"\n\n#include <catch2/catch_test_macros.hpp>\n\n#include <atomic>\n#include <signal.h>\n#include <sys/mman.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <cstdlib>\n\nextern \"C\" void IntInstruction();\n\n#pragma GCC diagnostic ignored \"-Wattributes\" // Suppress warning in case control-flow checks aren't enabled\n__attribute__((naked, nocf_check)) static void InvalidINT() {\n  __asm volatile(R\"(\n  IntInstruction:\n  int3;\n  ret;\n  )\");\n}\n\nunsigned long EXPECTED_RIP = reinterpret_cast<unsigned long>(&IntInstruction) + 1;\nconstexpr int EXPECTED_TRAPNO = 3;\nconstexpr int EXPECTED_ERR = 0;\nconstexpr int EXPECTED_SI_CODE = 128;\nconstexpr int EXPECTED_SIGNAL = SIGTRAP;\n\nTEST_CASE(\"Signals: Invalid INT3\") {\n  capturing_handler_skip = 0;\n  struct sigaction act {};\n  act.sa_sigaction = CapturingHandler;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGSEGV, &act, nullptr);\n  sigaction(SIGTRAP, &act, nullptr);\n  sigaction(SIGILL, &act, nullptr);\n\n  InvalidINT();\n\n#ifndef REG_RIP\n#define REG_RIP REG_EIP\n#endif\n\n  REQUIRE(from_handler.has_value());\n  CHECK(from_handler->mctx.gregs[REG_RIP] == EXPECTED_RIP);\n  CHECK(from_handler->mctx.gregs[REG_TRAPNO] == EXPECTED_TRAPNO);\n  CHECK(from_handler->mctx.gregs[REG_ERR] == EXPECTED_ERR);\n  CHECK(from_handler->si_code == EXPECTED_SI_CODE);\n  CHECK(from_handler->signal == EXPECTED_SIGNAL);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/invalid_ud2.cpp",
    "content": "#include \"invalid_util.h\"\n\n#include <catch2/catch_test_macros.hpp>\n\n#include <atomic>\n#include <signal.h>\n#include <sys/mman.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <cstdlib>\n\nextern \"C\" void IntInstruction();\n\n#pragma GCC diagnostic ignored \"-Wattributes\" // Suppress warning in case control-flow checks aren't enabled\n__attribute__((naked, nocf_check)) static void InvalidINT() {\n  __asm volatile(R\"(\n  IntInstruction:\n  ud2;\n  ret;\n  )\");\n}\n\nunsigned long EXPECTED_RIP = reinterpret_cast<unsigned long>(&IntInstruction);\nconstexpr int EXPECTED_TRAPNO = 6;\nconstexpr int EXPECTED_ERR = 0;\nconstexpr int EXPECTED_SI_CODE = 2;\nconstexpr int EXPECTED_SIGNAL = SIGILL;\n\nTEST_CASE(\"Signals: Invalid UD2\") {\n  capturing_handler_skip = 2;\n  struct sigaction act {};\n  act.sa_sigaction = CapturingHandler;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGSEGV, &act, nullptr);\n  sigaction(SIGTRAP, &act, nullptr);\n  sigaction(SIGILL, &act, nullptr);\n\n  InvalidINT();\n\n#ifndef REG_RIP\n#define REG_RIP REG_EIP\n#endif\n\n  REQUIRE(from_handler.has_value());\n  CHECK(from_handler->mctx.gregs[REG_RIP] == EXPECTED_RIP);\n  CHECK(from_handler->mctx.gregs[REG_TRAPNO] == EXPECTED_TRAPNO);\n  CHECK(from_handler->mctx.gregs[REG_ERR] == EXPECTED_ERR);\n  CHECK(from_handler->si_code == EXPECTED_SI_CODE);\n  CHECK(from_handler->signal == EXPECTED_SIGNAL);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/invalid_util.h",
    "content": "#include <cstdint>\n#include <signal.h>\n#include <optional>\n\nstruct CapturedHandlerState {\n  mcontext_t mctx;\n  int signal;\n  int si_code;\n};\n\nstd::optional<CapturedHandlerState> from_handler;\n\n// Number of bytes to skip to resume from the signal handler\nint capturing_handler_skip = 0;\n\n// Number of times the signal handler has caught a signal\nint capturing_handler_calls = 0;\n\n// Signal handler that writes its context data to the global from_handler\nstatic void CapturingHandler(int signal, siginfo_t* siginfo, void* context) {\n  ucontext_t* _context = (ucontext_t*)context;\n  from_handler = {_context->uc_mcontext, signal, siginfo->si_code};\n#ifdef REG_RIP\n#define FEX_IP_REG REG_RIP\n#else\n#define FEX_IP_REG REG_EIP\n#endif\n  _context->uc_mcontext.gregs[FEX_IP_REG] += capturing_handler_skip;\n#undef FEX_IP_REG\n  capturing_handler_calls++;\n}\n\n#if __SIZEOF_POINTER__ == 4\nstruct sigcontext_32 {\n  uint16_t gs, gsh;\n  uint16_t fs, fsh;\n  uint16_t es, esh;\n  uint16_t ds, dsh;\n  uint32_t di;\n  uint32_t si;\n  uint32_t bp;\n  uint32_t sp;\n  uint32_t bx;\n  uint32_t dx;\n  uint32_t cx;\n  uint32_t ax;\n  uint32_t trapno;\n  uint32_t err;\n  uint32_t ip;\n  uint16_t cs, csh;\n  uint32_t flags;\n  uint32_t sp_at_signal;\n  uint16_t ss, ssh;\n\n  uint32_t fpstate;\n  uint32_t oldmask;\n  uint32_t cr2;\n};\nstruct sigframe_ia32 {\n  uint32_t pretcode;\n  int signal;\n  sigcontext_32 sc;\n  // <...>\n  // Some extra state\n};\n\nstruct rt_sigframe_ia32 {\n  uint32_t pretcode;\n  int signal;\n  uint32_t pinfo;\n  uint32_t puc;\n  siginfo_t info;\n  ucontext_t uc;\n  // <...>\n  // Some extra state\n};\n\nstruct CapturedHandlerState_32 {\n  sigcontext_32 mctx;\n  int signal;\n  int si_code;\n};\n\nstruct CapturedHandlerState_regparm_32 {\n  int signal;\n  siginfo_t* siginfo;\n  void* context;\n};\n\n// This capturing handler is for non-realtime signals pulling arguments from the stack.\nstd::optional<CapturedHandlerState_32> from_handler_32;\n// This capturing handler is for non-realtime signals pulling arguments from regparm ABI.\nstd::optional<CapturedHandlerState_regparm_32> from_handler_regparm_32;\n\n/*\n * This signal handler is for testing 32-bit non-realtime signal support.\n * This handler gives a signal, and a sigcontext_32 object.\n *\n * The arguments are passed on the stack for this function.\n */\nstatic void CapturingHandler_non_realtime(int signal, ...) {\n  // Getting the context frame is really hard, so hardwire some magic.\n  // Getting the frame address returns\n  // struct frame {\n  //  uint32_t ????;\n  //  uint32_t pret;\n  //  uint32_t signal;\n  //  sigcontext_32 sc;\n  sigframe_ia32* frame = (sigframe_ia32*)((size_t)__builtin_frame_address(0) + 4);\n  sigcontext_32* context = &frame->sc;\n\n  from_handler_32 = {*context, signal, 0};\n#ifdef REG_RIP\n#define FEX_IP_REG REG_RIP\n#else\n#define FEX_IP_REG REG_EIP\n#endif\n  context->ip += capturing_handler_skip;\n#undef FEX_IP_REG\n  capturing_handler_calls++;\n}\n\n/*\n * This signal handler is for testing 32-bit realtime signal support.\n * This handler gives a signal, a siginfo_t, and mcontext_t object.\n *\n * The arguments are passed on the stack for this function.\n */\n[[gnu::regparm(3)]]\nstatic void CapturingHandler_realtime_regparm(int signal, siginfo_t* siginfo, void* context) {\n  ucontext_t* _context = (ucontext_t*)context;\n\n  from_handler = {_context->uc_mcontext, signal, siginfo->si_code};\n#ifdef REG_RIP\n#define FEX_IP_REG REG_RIP\n#else\n#define FEX_IP_REG REG_EIP\n#endif\n  _context->uc_mcontext.gregs[FEX_IP_REG] += capturing_handler_skip;\n#undef FEX_IP_REG\n  capturing_handler_calls++;\n}\n\n/*\n * This signal handler is for testing 32-bit non-realtime signal support.\n * This handler gives a signal, and that's it\n *\n * siginfo and context objects should always be nullptr in this case.\n *\n * The arguments are passed on in registers for this function.\n */\n[[gnu::regparm(3)]]\nstatic void CapturingHandler_non_realtime_regparm(int signal, siginfo_t* siginfo, void* context) {\n  // Getting the context frame is really hard, so hardwire some magic.\n  // Getting the frame address returns\n  // struct frame {\n  //  uint32_t ????;\n  //  uint32_t pret;\n  //  uint32_t signal;\n  //  sigcontext_32 sc;\n  // If volatile isn't used then the compiler optimizes this out.\n  volatile sigframe_ia32* frame = (volatile sigframe_ia32*)((size_t)__builtin_frame_address(0) + 4);\n  volatile sigcontext_32* context_stack = &frame->sc;\n\n  // siginfo and context should be nullptr.\n  from_handler_regparm_32 = {signal, siginfo, context};\n#ifdef REG_RIP\n#define FEX_IP_REG REG_RIP\n#else\n#define FEX_IP_REG REG_EIP\n#endif\n  context_stack->ip += capturing_handler_skip;\n#undef FEX_IP_REG\n  capturing_handler_calls++;\n}\n\n/*\n * This signal handler is for testing 32-bit realtime signal support.\n * This handler gives a signal, a siginfo_t, and mcontext_t object.\n *\n * The arguments are passed on the stack for this function.\n */\nstatic void CapturingHandler_realtime() {\n  // Getting the context frame is really hard, so hardwire some magic.\n  // Getting the frame address returns\n  // struct frame {\n  //  uint32_t ????;\n  //  rt_sigframe_ia32 frame;\n  rt_sigframe_ia32* frame = (rt_sigframe_ia32*)((size_t)__builtin_frame_address(0) + 4);\n  int signal = frame->signal;\n  siginfo_t* siginfo = &frame->info;\n  ucontext_t* _context = &frame->uc;\n\n  from_handler = {_context->uc_mcontext, signal, siginfo->si_code};\n#ifdef REG_RIP\n#define FEX_IP_REG REG_RIP\n#else\n#define FEX_IP_REG REG_EIP\n#endif\n  _context->uc_mcontext.gregs[FEX_IP_REG] += capturing_handler_skip;\n#undef FEX_IP_REG\n  capturing_handler_calls++;\n}\n\n/*\n * This signal handler is for testing 32-bit realtime signal support.\n * This handler gives a signal, a siginfo_t, and mcontext_t object.\n *\n * The arguments are passed on in registers for this function.\n * This one is specifically is for testing if the glibc handler is working correctly.\n * It matches `CapturingHandler_realtime_regparm` but without the `regparm` ABI.\n */\nstatic void CapturingHandler_realtime_glibc_helper(int signal, siginfo_t* siginfo, void* context) {\n  ucontext_t* _context = (ucontext_t*)context;\n\n  from_handler = {_context->uc_mcontext, signal, siginfo->si_code};\n#ifdef REG_RIP\n#define FEX_IP_REG REG_RIP\n#else\n#define FEX_IP_REG REG_EIP\n#endif\n  _context->uc_mcontext.gregs[FEX_IP_REG] += capturing_handler_skip;\n#undef FEX_IP_REG\n  capturing_handler_calls++;\n}\n#endif\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/invalid_vex.32.cpp",
    "content": "#include \"invalid_util.h\"\n\n#include <catch2/catch_test_macros.hpp>\n\n#include <signal.h>\n#include <sys/mman.h>\n#include <stdint.h>\n#include <cstdlib>\n\nextern \"C\" void IntInstruction();\n\n#pragma GCC diagnostic ignored \"-Wattributes\" // Suppress warning in case control-flow checks aren't enabled\n__attribute__((naked, nocf_check)) static void InvalidINT() {\n  __asm volatile(R\"(\n  IntInstruction:\n  // vaddss xmm0,xmm15,xmm2\n  .byte 0xc5, 0x82, 0x58, 0xc2;\n  ret;\n  )\");\n}\n\nunsigned long EXPECTED_RIP = reinterpret_cast<unsigned long>(&IntInstruction);\n\nTEST_CASE(\"Signals: Invalid VEX.vvvv\") {\n  capturing_handler_skip = 4;\n  struct sigaction act {};\n  act.sa_sigaction = CapturingHandler;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGSEGV, &act, nullptr);\n  sigaction(SIGTRAP, &act, nullptr);\n  sigaction(SIGILL, &act, nullptr);\n\n  InvalidINT();\n\n#ifndef REG_RIP\n#define REG_RIP REG_EIP\n#endif\n\n  REQUIRE(from_handler.has_value());\n  CHECK(from_handler->mctx.gregs[REG_RIP] == EXPECTED_RIP);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/noexec_protect.64.cpp",
    "content": "#include \"simple_x86.h\"\n#include <catch2/catch_test_macros.hpp>\n\n#include <signal.h>\n#include <sys/mman.h>\n#include <stdint.h>\n#include <cstdlib>\n#include <csetjmp>\n\nbool Caught = false;\nuint64_t CaughtAddr {};\nstatic jmp_buf LongJump {};\n\nstatic void SIGSEGV_Handler(int signal, siginfo_t* siginfo, void* context) {\n  ucontext_t* _context = (ucontext_t*)context;\n  // Needs to be an access error.\n  REQUIRE(siginfo->si_code == SEGV_ACCERR);\n\n  // Page fault\n  REQUIRE(_context->uc_mcontext.gregs[REG_TRAPNO] == 14);\n\n  CaughtAddr = reinterpret_cast<uint64_t>(siginfo->si_addr);\n\n  Caught = true;\n  longjmp(LongJump, 1);\n}\n\nTEST_CASE(\"Signals: Test No-Exec\") {\n  struct sigaction act {};\n  act.sa_sigaction = SIGSEGV_Handler;\n  act.sa_flags = SA_SIGINFO;\n\n  sigaction(SIGSEGV, &act, nullptr);\n  auto PageSize = sysconf(_SC_PAGESIZE);\n  PageSize = PageSize > 0 ? PageSize : 0x1000;\n\n  void* Ptr = mmap(nullptr, PageSize, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n  REQUIRE(Ptr != MAP_FAILED);\n\n  SimpleX86Emit emit(Ptr, PageSize);\n  emit.mov(SimpleX86Emit::Reg::RAX, 1);\n  emit.ret();\n\n  using func_ptr = uint32_t (*)();\n  func_ptr func = reinterpret_cast<func_ptr>(Ptr);\n\n  // First time should execute fine.\n  Caught = false;\n  if (setjmp(LongJump) == 0) {\n    int res = func();\n    REQUIRE(res == 1);\n  } else {\n    REQUIRE(Caught == false);\n  }\n\n  // Protect as non-executable\n  REQUIRE(mprotect(Ptr, PageSize, PROT_READ | PROT_WRITE) == 0);\n\n  // This should now fail to execute due to No-Exec.\n  Caught = false;\n  if (setjmp(LongJump) == 0) {\n    int res = func();\n    // Shouldn't get reached.\n    REQUIRE(res == 1);\n    REQUIRE(false);\n  } else {\n    REQUIRE(Caught == true);\n  }\n}\n\nTEST_CASE(\"Signals: Partial decode\") {\n  struct sigaction act {};\n  act.sa_sigaction = SIGSEGV_Handler;\n  act.sa_flags = SA_SIGINFO;\n\n  sigaction(SIGSEGV, &act, nullptr);\n  auto PageSize = sysconf(_SC_PAGESIZE);\n  PageSize = PageSize > 0 ? PageSize : 0x1000;\n\n  void* Ptr = mmap(nullptr, PageSize * 2, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n  REQUIRE(Ptr != MAP_FAILED);\n\n  SimpleX86Emit emit(static_cast<uint8_t*>(Ptr) + PageSize - 1, PageSize + 1);\n\n  // MOV <uint32_t> hits the end of the page, writing only the opcode.\n  emit.mov(SimpleX86Emit::Reg::RAX, 0x42424242);\n  emit.ret();\n\n  // Protect second page\n  REQUIRE(mprotect(static_cast<uint8_t*>(Ptr) + PageSize, PageSize, PROT_NONE) == 0);\n\n  using func_ptr = uint32_t (*)();\n  func_ptr func = reinterpret_cast<func_ptr>(static_cast<uint8_t*>(Ptr) + PageSize - 1);\n  Caught = false;\n  if (setjmp(LongJump) == 0) {\n    REQUIRE(func() != 0x42424242);\n  } else {\n    REQUIRE(Caught == true);\n    CHECK(CaughtAddr == (reinterpret_cast<uint64_t>(Ptr) + PageSize));\n  }\n\n  Caught = false;\n  CaughtAddr = 0;\n\n  // Protect second page\n  REQUIRE(mprotect(static_cast<uint8_t*>(Ptr) + PageSize, PageSize, PROT_READ | PROT_WRITE | PROT_EXEC) == 0);\n\n  if (setjmp(LongJump) == 0) {\n    CHECK(func() == 0x42424242);\n  } else {\n    REQUIRE(false);\n  }\n\n  CHECK(Caught == false);\n  CHECK(CaughtAddr == 0);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/pthread_cancel.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <atomic>\n#include <errno.h>\n#include <pthread.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n\n// Derived from example in https://manual.cs50.io/3/pthread_cancel\n// <<Manual pages for the C standard library, C POSIX library, and the CS50 Library>>\n\nstd::atomic<bool> thread_ready;\nstd::atomic<bool> cancel_sent;\n\nstatic pthread_key_t key;\n\nvoid key_dtor(void* ptr) {\n  puts(\"key_dtor: Thread aborted\\n\");\n  free(ptr);\n}\n\n#define handle_error_en(en, msg) \\\n  do {                           \\\n    errno = en;                  \\\n    perror(msg);                 \\\n    exit(EXIT_FAILURE);          \\\n  } while (0)\n\nstatic void* thread_func(void* ignored_argument) {\n  pthread_key_create(&key, &key_dtor);\n  pthread_setspecific(key, malloc(32));\n  int s;\n\n  /* Disable cancellation for a while, so that we don't\n     immediately react to a cancellation request. */\n\n  s = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);\n  if (s != 0) {\n    handle_error_en(s, \"pthread_setcancelstate\");\n  }\n\n  printf(\"thread_func(): started; cancellation disabled\\n\");\n  thread_ready = true;\n\n  while (!cancel_sent.load())\n    ;\n  printf(\"thread_func(): about to enable cancellation\\n\");\n\n  s = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);\n  if (s != 0) {\n    handle_error_en(s, \"pthread_setcancelstate\");\n  }\n\n  /* sleep() is a cancellation point. */\n\n  for (;;) {\n    sleep(1000); /* Should get canceled while we sleep */\n  }\n\n  /* Should never get here. */\n\n  printf(\"thread_func(): not canceled!\\n\");\n  return NULL;\n}\n\nTEST_CASE(\"pthreads cancel\") {\n  pthread_t thr;\n  void* res;\n  int s;\n\n  /* Start a thread and then send it a cancellation request. */\n\n  REQUIRE(pthread_create(&thr, NULL, &thread_func, NULL) == 0);\n\n  while (!thread_ready.load())\n    ;\n\n  printf(\"main(): sending cancellation request\\n\");\n  REQUIRE(pthread_cancel(thr) == 0);\n\n  cancel_sent = true;\n\n  /* Join with thread to see what its exit status was. */\n\n  REQUIRE(pthread_join(thr, &res) == 0);\n\n  CHECK(res == PTHREAD_CANCELED);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/sigill_flags.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <array>\n#include <signal.h>\n#include <sys/mman.h>\n#include <stdint.h>\n#include <cstdlib>\n#include <optional>\n\n__attribute__((naked, nocf_check)) static void SafeRet() {\n  __asm volatile(R\"(\n  ret;\n  )\");\n}\n\nstruct capture_data {\n  uintptr_t RIP;\n  uintptr_t siginfo_RIP;\n  uint64_t Register_Err;\n  uint64_t TrapNo;\n};\n\nstd::optional<capture_data> data;\nstatic void sigsegv_check(int signal, siginfo_t* siginfo, void* context) {\n  ucontext_t* _context = (ucontext_t*)context;\n  auto mcontext = &_context->uc_mcontext;\n\n#ifdef REG_RIP\n#define FEX_IP_REG REG_RIP\n#else\n#define FEX_IP_REG REG_EIP\n#endif\n  data.emplace(capture_data {\n    .RIP = static_cast<uintptr_t>(mcontext->gregs[FEX_IP_REG]),\n    .siginfo_RIP = reinterpret_cast<uintptr_t>(siginfo->si_addr),\n    .Register_Err = static_cast<uint64_t>(mcontext->gregs[REG_ERR]),\n    .TrapNo = static_cast<uint64_t>(mcontext->gregs[REG_TRAPNO]),\n  });\n\n  // Change RIP to a safe return so we can continue testing.\n  mcontext->gregs[FEX_IP_REG] = reinterpret_cast<greg_t>(&SafeRet);\n}\n\nTEST_CASE(\"Signals: SIGILL flags\") {\n  struct sigaction act {};\n  act.sa_sigaction = sigsegv_check;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGSEGV, &act, nullptr);\n\n  struct TestArray {\n    int Prot;\n    uint64_t RegisterErr;\n  };\n\n  constexpr static std::array<TestArray, 2> ProtArray {{\n    {PROT_READ | PROT_WRITE, 21}, {PROT_READ, 21},\n\n    // FEX doesn't currently support reporting this correctly.\n    // { PROT_NONE, 20 },\n  }};\n\n  for (auto& Prot : ProtArray) {\n    void* ptr = mmap(nullptr, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n    REQUIRE(ptr != MAP_FAILED);\n\n    // Fill JIT space with `ret` instruction.\n    memset(ptr, 0xc3, 4096);\n\n    // Protect with various NOEXEC protections.\n    REQUIRE(mprotect(ptr, 4096, Prot.Prot) == 0);\n\n    using func_type = void (*)();\n    auto func = reinterpret_cast<func_type>(ptr);\n\n    data.reset();\n\n    // Jump to prepared JIT function with NOEXEC permissions.\n    // Will immediately fault.\n    func();\n\n    REQUIRE(data.has_value());\n    CHECK(data->RIP == reinterpret_cast<uintptr_t>(ptr));\n    CHECK(data->siginfo_RIP == reinterpret_cast<uintptr_t>(ptr));\n    CHECK(data->Register_Err == Prot.RegisterErr);\n    CHECK(data->TrapNo == 14);\n    REQUIRE(munmap(ptr, 4096) == 0);\n  }\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/sigill_xstate_magic.cpp",
    "content": "#include \"fpstate.h\"\n#include <catch2/catch_test_macros.hpp>\n\n#include <array>\n#include <signal.h>\n#include <sys/mman.h>\n#include <stdint.h>\n#include <cstdlib>\n#include <optional>\n\n#pragma GCC diagnostic ignored \"-Wattributes\" // Suppress warning in case control-flow checks aren't enabled\n__attribute__((naked, nocf_check)) static void InvalidINT() {\n  __asm volatile(R\"(\n    hlt;\n    ret;\n    )\");\n}\n\n__attribute__((naked, nocf_check)) static void SafeRet() {\n  __asm volatile(R\"(\n  ret;\n  )\");\n}\n\nstruct capture_data {\n  uint32_t magic1;\n  uint32_t magic2;\n};\n\nstd::optional<capture_data> data;\nstatic void signal_check(int signal, siginfo_t* siginfo, void* context) {\n  ucontext_t* _context = (ucontext_t*)context;\n  auto mcontext = &_context->uc_mcontext;\n\n#ifdef REG_RIP\n#define FEX_IP_REG REG_RIP\n#else\n#define FEX_IP_REG REG_EIP\n#endif\n  auto xstate = reinterpret_cast<FEX::Unittests::xstate*>(_context->uc_mcontext.fpregs);\n  auto magic1 = xstate->fpstate.sw_reserved.magic1;\n  uint32_t magic2 {};\n  if (magic1 == FEX::Unittests::fpx_sw_bytes::FP_XSTATE_MAGIC_1) {\n    auto magic2_addr =\n      reinterpret_cast<uint32_t*>(reinterpret_cast<uintptr_t>(xstate) + xstate->fpstate.sw_reserved.extended_size - sizeof(uint32_t));\n    magic2 = *magic2_addr;\n  }\n\n  data.emplace(capture_data {\n    .magic1 = magic1,\n    .magic2 = magic2,\n  });\n\n  // Change RIP to a safe return so we can continue testing.\n  mcontext->gregs[FEX_IP_REG] = reinterpret_cast<greg_t>(&SafeRet);\n}\n\nTEST_CASE(\"Signals: SIGILL flags\") {\n  struct sigaction act {};\n  act.sa_sigaction = signal_check;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGSEGV, &act, nullptr);\n  sigaction(SIGTRAP, &act, nullptr);\n  sigaction(SIGILL, &act, nullptr);\n\n  InvalidINT();\n\n  REQUIRE(data.has_value());\n  CHECK(data->magic1 == FEX::Unittests::fpx_sw_bytes::FP_XSTATE_MAGIC_1);\n  CHECK(data->magic2 == FEX::Unittests::fpx_sw_bytes::FP_XSTATE_MAGIC_2);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/signal_df_reset.64.cpp",
    "content": "// SPDX-License-Identifier: MIT\n#include <catch2/catch_test_macros.hpp>\n#include <signal.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/mman.h>\n#include <ucontext.h>\n#include <unistd.h>\n\nint Page {};\nvoid* signal_page {};\nvoid* signal_second_page {};\n\nvoid* backwards_page {};\nvoid* backwards_second_page {};\n\n__attribute__((naked)) void backwards_set(void* dest, uint8_t value, uint32_t pad, size_t size) {\n  __asm volatile(R\"(\n    std;\n    jmp 1f;\n    1:\n    mov rax, rsi;\n    rep stosb;\n    jmp 2f;\n    2:\n    cld;\n    ret;\n  )\" ::\n                   : \"memory\", \"cc\");\n}\n\n__attribute__((naked)) void forward_set(void* dest, uint8_t value, uint32_t pad, size_t size) {\n  __asm volatile(R\"(\n    mov rax, rsi;\n    rep stosb;\n    ret;\n  )\" ::\n                   : \"memory\", \"cc\");\n}\n\nvoid sig_handler(int signum, siginfo_t* info, void* context) {\n  // Ensure the fault address isn't in the signal page.\n  auto addr = reinterpret_cast<uint64_t>(info->si_addr);\n  // This REQUIRE will fail if DF isn't reset on signal handler.\n  REQUIRE(!(addr >= (uint64_t)signal_page && addr <= (uint64_t)signal_second_page));\n  forward_set(signal_second_page, 1, 0, 4096);\n\n  // mprotect the page that was originally written to, allowing the code to continue.\n  REQUIRE(mprotect(backwards_page, Page, PROT_READ | PROT_WRITE) == 0);\n}\n\nTEST_CASE(\"DF flaga reset on signal\") {\n  struct sigaction act {};\n\n  act.sa_flags = SA_SIGINFO;\n  act.sa_sigaction = &sig_handler;\n  REQUIRE(sigaction(SIGSEGV, &act, NULL) == 0);\n\n  Page = sysconf(_SC_PAGESIZE);\n\n  // Allocate pages with protections to ensure correct direction.\n  signal_page = ::mmap(nullptr, Page * 3, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n  REQUIRE(signal_page != MAP_FAILED);\n  signal_second_page = reinterpret_cast<void*>(reinterpret_cast<uint64_t>(signal_page) + Page);\n\n  // Again for backward direction.\n  backwards_page = ::mmap(nullptr, Page * 3, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n  REQUIRE(backwards_page != MAP_FAILED);\n  backwards_second_page = reinterpret_cast<void*>(reinterpret_cast<uint64_t>(backwards_page) + Page);\n\n  // Allow the middle page to read/write.\n  REQUIRE(mprotect(signal_second_page, Page, PROT_READ | PROT_WRITE) == 0);\n\n  // Allow the middle page to read/write.\n  REQUIRE(mprotect(backwards_second_page, Page, PROT_READ | PROT_WRITE) == 0);\n\n  // Copy backwards and cause a signal.\n  backwards_set(backwards_second_page, 1, 0, 4096);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/signal_flags.cpp",
    "content": "#include \"invalid_util.h\"\n\n#include <catch2/catch_test_macros.hpp>\n\n#include <atomic>\n#include <signal.h>\n#include <sys/mman.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <cstdlib>\n\n__attribute__((naked)) static void InvalidINT_SetPF() {\n  __asm volatile(R\"(\n  mov eax, 0x80\n  inc eax\n  int3;\n  ret;\n  )\");\n}\n\n__attribute__((naked)) static void InvalidINT_ClearPF() {\n  __asm volatile(R\"(\n  mov eax, 0\n  inc eax\n  int3;\n  ret;\n  )\");\n}\n\n__attribute__((naked)) static void InvalidINT_SetCF() {\n  __asm volatile(R\"(\n  stc\n  int3;\n  ret;\n  )\");\n}\n\n__attribute__((naked)) static void InvalidINT_ClearCF() {\n  __asm volatile(R\"(\n  clc\n  int3;\n  ret;\n  )\");\n}\n\n__attribute__((naked)) static void InvalidINT_SetZF() {\n  __asm volatile(R\"(\n  mov eax, 1\n  dec eax\n  int3;\n  ret;\n  )\");\n}\n\n__attribute__((naked)) static void InvalidINT_ClearZF() {\n  __asm volatile(R\"(\n  mov eax, 2\n  dec eax\n  int3;\n  ret;\n  )\");\n}\n\n__attribute__((naked)) static void InvalidINT_SetSF() {\n  __asm volatile(R\"(\n  mov eax, 0\n  dec eax\n  int3;\n  ret;\n  )\");\n}\n\n__attribute__((naked)) static void InvalidINT_ClearSF() {\n  __asm volatile(R\"(\n  mov eax, 1\n  dec eax\n  int3;\n  ret;\n  )\");\n}\n\n__attribute__((naked)) static void InvalidINT_SetOF() {\n  __asm volatile(R\"(\n  mov eax, 0x7fffffff\n  inc eax\n  int3;\n  ret;\n  )\");\n}\n\n__attribute__((naked)) static void InvalidINT_ClearOF() {\n  __asm volatile(R\"(\n  mov eax, 0\n  inc eax\n  int3;\n  ret;\n  )\");\n}\n\nconstexpr int EXPECTED_TRAPNO = 3;\nconstexpr int EXPECTED_ERR = 0;\nconstexpr int EXPECTED_SI_CODE = 128;\nconstexpr int EXPECTED_SIGNAL = SIGTRAP;\n\nconstexpr uint32_t EFL_CF = 0;\nconstexpr uint32_t EFL_PF = 2;\nconstexpr uint32_t EFL_ZF = 6;\nconstexpr uint32_t EFL_SF = 7;\nconstexpr uint32_t EFL_OF = 11;\n\n#ifndef REG_RIP\n#define REG_RIP REG_EIP\n#endif\n\nusing FunctionPtr = void (*)();\nvoid SetupAndCallTest(FunctionPtr Func, uint32_t FlagOffset, uint32_t ExpectedFlag) {\n  capturing_handler_skip = 0;\n  struct sigaction act {};\n  act.sa_sigaction = CapturingHandler;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGSEGV, &act, nullptr);\n  sigaction(SIGTRAP, &act, nullptr);\n  sigaction(SIGILL, &act, nullptr);\n\n  Func();\n\n  REQUIRE(from_handler.has_value());\n  CHECK(from_handler->mctx.gregs[REG_TRAPNO] == EXPECTED_TRAPNO);\n  CHECK(from_handler->mctx.gregs[REG_ERR] == EXPECTED_ERR);\n  CHECK(from_handler->si_code == EXPECTED_SI_CODE);\n  CHECK(from_handler->signal == EXPECTED_SIGNAL);\n  // Extract Flag\n  CHECK(((from_handler->mctx.gregs[REG_EFL] >> FlagOffset) & 1) == ExpectedFlag);\n}\n\nTEST_CASE(\"Signals: PF on Signal\") {\n  SetupAndCallTest(InvalidINT_SetPF, EFL_PF, 1);\n}\n\nTEST_CASE(\"Signals: NoPF on Signal\") {\n  SetupAndCallTest(InvalidINT_ClearPF, EFL_PF, 0);\n}\n\nTEST_CASE(\"Signals: CF on Signal\") {\n  SetupAndCallTest(InvalidINT_SetCF, EFL_CF, 1);\n}\n\nTEST_CASE(\"Signals: NoCF on Signal\") {\n  SetupAndCallTest(InvalidINT_ClearCF, EFL_CF, 0);\n}\n\nTEST_CASE(\"Signals: ZF on Signal\") {\n  SetupAndCallTest(InvalidINT_SetZF, EFL_ZF, 1);\n}\n\nTEST_CASE(\"Signals: NoZF on Signal\") {\n  SetupAndCallTest(InvalidINT_ClearZF, EFL_ZF, 0);\n}\n\nTEST_CASE(\"Signals: SF on Signal\") {\n  SetupAndCallTest(InvalidINT_SetSF, EFL_SF, 1);\n}\n\nTEST_CASE(\"Signals: NoSF on Signal\") {\n  SetupAndCallTest(InvalidINT_ClearSF, EFL_SF, 0);\n}\n\nTEST_CASE(\"Signals: OF on Signal\") {\n  SetupAndCallTest(InvalidINT_SetOF, EFL_OF, 1);\n}\n\nTEST_CASE(\"Signals: NoOF on Signal\") {\n  SetupAndCallTest(InvalidINT_ClearOF, EFL_OF, 0);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/signal_order.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n#include <unistd.h>\n#include <signal.h>\n#include <sys/syscall.h>\n#include <stdio.h>\n\nconstexpr uint64_t ExpectedOrder[64] = {\n  0,  1,  2,  3,  4,  5,  6,  7,  0,  8,  9,  10, 11, 12, 13, 14, 15, 16, 0,  17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,\n  30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,\n};\n\nuint64_t Count {};\nuint64_t Order[64] = {};\n\n#ifndef __x86_64__\n[[gnu::regparm(3)]]\n#endif\nstatic void handler(int signal, siginfo_t* siginfo, void* context) {\n  REQUIRE((signal > 0 && signal < 65));\n  if (signal < 1 || signal > 64) {\n    return;\n  }\n  Order[signal - 1] = Count;\n  ++Count;\n}\n\n#ifdef __x86_64__\n__attribute__((naked)) void asm_handler(int signal, siginfo_t* siginfo, void* context) {\n  __asm volatile(R\"(\n  call %[Handler];\n  ret;\n  )\" ::[Handler] \"r\"(handler)\n                 : \"memory\");\n}\n\n__attribute__((naked)) void restorer() {\n  __asm volatile(R\"(\n  mov eax, %[sigreturn];\n  syscall;\n  )\" ::[sigreturn] \"i\"(SYS_rt_sigreturn)\n                 : \"memory\");\n}\n#else\n__attribute__((naked)) void asm_handler(int signal, siginfo_t* siginfo, void* context) {\n  __asm volatile(R\"(\n  mov ebx, %[Handler];\n  mov eax, [esp + 4];\n  mov ecx, [esp + 8];\n  mov edx, [esp + 12];\n  call ebx;\n  ret;\n  )\" ::[Handler] \"r\"(handler)\n                 : \"eax\", \"ecx\", \"edx\", \"memory\");\n}\n\n\n__attribute__((naked)) void restorer() {\n  __asm volatile(R\"(\n  mov eax, %[sigreturn];\n  int 0x80;\n  )\" ::[sigreturn] \"i\"(SYS_rt_sigreturn)\n                 : \"memory\");\n}\n#endif\n\n\nstruct __attribute__((packed)) GuestSAMask {\n  uint64_t Val;\n};\n\nstruct __attribute__((packed)) GuestSigAction {\n  union {\n    void (*handler)(int);\n    void (*sigaction)(int, siginfo_t*, void*);\n  } sigaction_handler;\n\n  size_t sa_flags;\n  void (*restorer)(void);\n  GuestSAMask sa_mask;\n};\n\nTEST_CASE(\"signal order\") {\n\n#define SA_RESTORER 0x04000000\n  struct GuestSigAction act {};\n  act.sigaction_handler.sigaction = (decltype(act.sigaction_handler.sigaction))asm_handler;\n  act.restorer = restorer;\n  act.sa_flags = SA_SIGINFO | SA_RESTORER;\n  for (size_t i = 1; i <= 64; ++i) {\n    ::syscall(SYS_rt_sigaction, i, &act, nullptr, 8);\n  }\n\n  auto pid = ::getpid();\n  auto tid = ::gettid();\n  for (size_t i = 1; i <= 64; ++i) {\n    if (i == SIGKILL || i == SIGSTOP) {\n      continue;\n    }\n    tgkill(pid, tid, i);\n  }\n\n  for (size_t i = 1; i <= 64; ++i) {\n    CHECK(Order[i - 1] == ExpectedOrder[i - 1]);\n  }\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/sigtest_defer.cpp",
    "content": "// A test where a signal is masked, a value is set that the signal handler will overwrite, and then the signal is unmasked to allow it to\n// fire. FEX-Emu had a bug where it wasn't properly deferring signals from sigprocmask if one of the signals was masked by the guest application.\n// In older glibc versions (glibc-2.26), the `raise` implementation would block signals, tgkill, and then unblock signals,\n// expecting the signal to fire once the signals were unblocked.\n\n#include <catch2/catch_test_macros.hpp>\n#include <catch2/generators/catch_generators.hpp>\n#include <catch2/generators/catch_generators_range.hpp>\n\n#include <signal.h>\n#include <unistd.h>\n\nstatic uint32_t CheckValue {};\nvoid sig_handler(int signum, siginfo_t* info, void* context) {\n  REQUIRE(CheckValue == 2);\n  CheckValue = 0x1;\n}\n\nstatic void RaiseSignal(int Signal) {\n  sigset_t Prev {};\n  sigset_t New {};\n\n  // Mask all signals\n  sigfillset(&New);\n  int Ret = sigprocmask(SIG_BLOCK, &New, &Prev);\n\n  REQUIRE(Ret != -1);\n\n  // Try to raise the signal, even though it is blocked\n  Ret = tgkill(::getpid(), ::gettid(), Signal);\n  REQUIRE(Ret != -1);\n\n  // Set the check value\n  CHECK(CheckValue == 0);\n  CheckValue = 0x2;\n\n  // Unmask the signal\n  Ret = sigprocmask(SIG_SETMASK, &Prev, nullptr);\n  REQUIRE(Ret != -1);\n}\n\nTEST_CASE(\"Signals: Defer Signals\") {\n  auto tested_signal = GENERATE(range(1, 65));\n\n  if (tested_signal != SIGKILL && tested_signal != SIGSTOP && tested_signal != 32 && tested_signal != 33) {\n    struct sigaction sa {};\n    sa.sa_sigaction = sig_handler;\n    sigemptyset(&sa.sa_mask);\n    sa.sa_flags = SA_RESTART | SA_SIGINFO;\n    sigaction(tested_signal, &sa, nullptr);\n    CheckValue = 0;\n    RaiseSignal(tested_signal);\n    CHECK(CheckValue == 1);\n  }\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/sigtest_no_defer.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <signal.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n\nvolatile int count = 0;\nvolatile int count2 = 0;\n\n#define NUMCOUNT 10\n#define SIGN SIGTSTP\n\nvoid sig_handler(int signum, siginfo_t* info, void* context) {\n  printf(\"Inside handler function\\n\");\n  if (count != 0) {\n    printf(\"SA_NODEFER bug\\n\");\n    exit(-1);\n  }\n\n  if (count2 != 0) {\n    printf(\"Nested raise correctly raised, trying sigprocmask\\n\");\n    sigset_t old;\n    // test if sigmask returned by sigprocmask is the one currently active\n    sigprocmask(0, 0, &old);\n    sigprocmask(SIG_SETMASK, &old, 0);\n  }\n\n  if (count2 < NUMCOUNT) {\n    printf(\"Nested Raising %d, %d of %d times\\n\", signum, 1 + count, NUMCOUNT);\n    count2++;\n    raise(signum);\n    count++;\n  } else {\n    // Return to caller\n  }\n}\n\nTEST_CASE(\"Signals: No defer\") {\n  struct sigaction act = {0};\n\n  act.sa_flags = SA_SIGINFO | SA_NODEFER;\n  act.sa_sigaction = &sig_handler;\n  REQUIRE(sigaction(SIGN, &act, NULL) == 0);\n\n  raise(SIGN);\n  CHECK(count == 10);\n  CHECK(count2 == 10);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/sigtest_samask.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <signal.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n\nvolatile bool loop = true;\nvolatile bool last = false;\nvolatile int count = 0;\nvolatile int count2 = 0;\n\n// OPTIONS\n// TESTSIGPROCMASK\n\n#define NUMCOUNT 10\n#define SIGN SIGTSTP\n\nvoid sig_handler(int signum) {\n  loop = false;\n  printf(\"Inside handler function\\n\");\n\n  if (last) {\n    printf(\"Handling last raise\\n\");\n    return;\n  }\n\n  if (count2 != count) {\n    printf(\"Signal reentering bug\\n\");\n    exit(-1);\n  }\n\n  if (count < NUMCOUNT) {\n    printf(\"Nested Raising sig%d, %d of %d times\\n\", signum, 1 + count, NUMCOUNT);\n    count2++;\n    raise(signum);\n    printf(\"Nested raise correctly blocked, trying sigprocmask\\n\");\n    sigset_t old;\n    // test if sigmask returned by sigprocmask is the one currently active\n    sigprocmask(0, 0, &old);\n    sigprocmask(SIG_SETMASK, &old, 0);\n    printf(\"sigprocmask worked correctly, should trigger next iteration on signal return\\n\");\n    count++;\n  }\n}\n\nTEST_CASE(\"Signals: samask\") {\n  REQUIRE(signal(SIGN, sig_handler) == 0);\n\n  // test if sigmask blocks during execution as expected\n  last = false;\n  loop = true;\n  while (loop) {\n    printf(\"Inside main loop, raising signal\\n\");\n    raise(SIGN);\n    REQUIRE_FALSE(loop);\n  }\n  last = true;\n  loop = true;\n\n  // test if sigmask returned by sigprocmask is the one set by the signal return\n  sigset_t old;\n  sigprocmask(0, 0, &old);\n  sigprocmask(SIG_SETMASK, &old, 0);\n\n  while (loop) {\n    printf(\"Inside last loop, raising signal\\n\");\n    raise(SIGN);\n    REQUIRE_FALSE(loop);\n  }\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/sigtest_siginfo.32.cpp",
    "content": "#include \"invalid_util.h\"\n\n#include <catch2/catch_test_macros.hpp>\n\n#include <signal.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <cstdint>\n#include <syscall.h>\n\nextern \"C\" void IntInstruction();\n\n__attribute__((naked)) static void CauseInt() {\n  __asm volatile(R\"(\n  IntInstruction:\n  int 1;\n  ret; # For RIP modification\n  )\");\n}\n\nstatic uint32_t EXPECTED_RIP = reinterpret_cast<uint32_t>(&IntInstruction);\nconstexpr int EXPECTED_TRAPNO = 13;\nconstexpr int EXPECTED_ERR = 10;\nconstexpr int EXPECTED_SI_CODE = 128;\nconstexpr int EXPECTED_SIGNAL = SIGSEGV;\n\nstruct ActionHandler {\n  void* handler;\n  uint32_t sa_mask;\n  uint32_t sa_flags;\n  void* restorer;\n};\n\nstruct rt_ActionHandler {\n  void* handler;\n\n  uint32_t sa_flags;\n  void* restorer;\n  uint64_t sa_mask;\n};\n\nTEST_CASE(\"sigaction: no siginfo\") {\n  // On 32-bit, non-realtime sigaction still receives a context on the stack.\n  // This is an implementation detail of Linux and not enforced by POSIX.\n  // This can be modified by the userspace application as it is part of the uapi.\n  // This is how Linux allows an application to modify its context on signal return.\n  // This unit test is testing this by incrementing EIP by 2.\n  capturing_handler_skip = 2;\n  ActionHandler act {};\n  act.handler = (void*)CapturingHandler_non_realtime;\n  act.sa_flags = 0;\n  syscall(SYS_sigaction, SIGSEGV, &act, nullptr);\n\n  CauseInt();\n\n  REQUIRE(from_handler_32.has_value());\n  CHECK(from_handler_32->mctx.ip == EXPECTED_RIP);\n  CHECK(from_handler_32->mctx.trapno == EXPECTED_TRAPNO);\n  CHECK(from_handler_32->mctx.err == EXPECTED_ERR);\n  CHECK(from_handler_32->signal == EXPECTED_SIGNAL);\n}\n\nTEST_CASE(\"sigaction: siginfo - regparm\") {\n  // On 32-bit, siginfo sigaction supports receiving siginfo and context in regparm.\n  // This can be modified by the userspace application as it is part of the uapi.\n  // This unit test is testing this by incrementing EIP by 2.\n  capturing_handler_skip = 2;\n  ActionHandler act {};\n  act.handler = (void*)CapturingHandler_realtime_regparm;\n  act.sa_flags = SA_SIGINFO;\n  syscall(SYS_sigaction, SIGSEGV, &act, nullptr);\n\n  CauseInt();\n\n  REQUIRE(from_handler.has_value());\n  CHECK((uint32_t)from_handler->mctx.gregs[REG_EIP] == EXPECTED_RIP);\n  CHECK(from_handler->mctx.gregs[REG_TRAPNO] == EXPECTED_TRAPNO);\n  CHECK(from_handler->mctx.gregs[REG_ERR] == EXPECTED_ERR);\n  CHECK(from_handler->signal == EXPECTED_SIGNAL);\n}\n\nTEST_CASE(\"sigaction: no siginfo - regparm\") {\n  // On 32-bit, siginfo sigaction supports receiving siginfo and context in regparm.\n  // This can be modified by the userspace application as it is part of the uapi.\n  // This unit test is testing this by incrementing EIP by 2.\n  capturing_handler_skip = 2;\n  ActionHandler act {};\n  act.handler = (void*)CapturingHandler_non_realtime_regparm;\n  act.sa_flags = 0;\n  syscall(SYS_sigaction, SIGSEGV, &act, nullptr);\n\n  CauseInt();\n\n  REQUIRE(from_handler_regparm_32.has_value());\n  CHECK(from_handler_regparm_32->signal == EXPECTED_SIGNAL);\n  CHECK(from_handler_regparm_32->siginfo == nullptr);\n  CHECK(from_handler_regparm_32->context == nullptr);\n}\n\nTEST_CASE(\"sigaction: siginfo - stack\") {\n  // On 32-bit, siginfo sigaction put the frame on the stack.\n  // This can be modified by the userspace application as it is part of the uapi.\n  // This unit test is testing this by incrementing EIP by 2.\n  capturing_handler_skip = 2;\n  ActionHandler act {};\n  act.handler = (void*)CapturingHandler_realtime;\n  act.sa_flags = SA_SIGINFO;\n  syscall(SYS_sigaction, SIGSEGV, &act, nullptr);\n\n  CauseInt();\n\n  REQUIRE(from_handler.has_value());\n  CHECK(from_handler->mctx.gregs[REG_EIP] == EXPECTED_RIP);\n  CHECK(from_handler->mctx.gregs[REG_TRAPNO] == EXPECTED_TRAPNO);\n  CHECK(from_handler->mctx.gregs[REG_ERR] == EXPECTED_ERR);\n  CHECK(from_handler->signal == EXPECTED_SIGNAL);\n}\n\nTEST_CASE(\"rt_sigaction: no siginfo\") {\n  // On 32-bit, classic rt_sigaction still receives a context on the stack.\n  // This can be modified by the userspace application as it is part of the uapi.\n  // This is how to modify the context on sigreturn.\n  capturing_handler_skip = 2;\n  rt_ActionHandler act {};\n  act.handler = (void*)CapturingHandler_non_realtime;\n  act.sa_flags = 0;\n  syscall(SYS_rt_sigaction, SIGSEGV, &act, nullptr, 8);\n\n  CauseInt();\n\n  REQUIRE(from_handler_32.has_value());\n  CHECK(from_handler_32->mctx.ip == EXPECTED_RIP);\n  CHECK(from_handler_32->mctx.trapno == EXPECTED_TRAPNO);\n  CHECK(from_handler_32->mctx.err == EXPECTED_ERR);\n  CHECK(from_handler_32->signal == EXPECTED_SIGNAL);\n}\n\nTEST_CASE(\"rt_sigaction: siginfo - regparm\") {\n  // On 32-bit, a realtime sigaction supports arguments being received on the stack AND regparm.\n  // This unit test ensures that the regparm implementation is working correctly.\n  capturing_handler_skip = 2;\n  rt_ActionHandler act {};\n  act.handler = (void*)CapturingHandler_realtime_regparm;\n  act.sa_flags = SA_SIGINFO;\n  syscall(SYS_rt_sigaction, SIGSEGV, &act, nullptr, 8);\n\n  CauseInt();\n\n  REQUIRE(from_handler.has_value());\n  CHECK(from_handler->mctx.gregs[REG_EIP] == EXPECTED_RIP);\n  CHECK(from_handler->mctx.gregs[REG_TRAPNO] == EXPECTED_TRAPNO);\n  CHECK(from_handler->mctx.gregs[REG_ERR] == EXPECTED_ERR);\n  CHECK(from_handler->signal == EXPECTED_SIGNAL);\n}\n\nTEST_CASE(\"rt_sigaction: siginfo - stack\") {\n  // On 32-bit, a realtime sigaction supports arguments being received on the stack AND regparm.\n  // This unit test ensures that the stack implementation is working correctly.\n  capturing_handler_skip = 2;\n  rt_ActionHandler act {};\n  act.handler = (void*)CapturingHandler_realtime;\n  act.sa_flags = SA_SIGINFO;\n  syscall(SYS_rt_sigaction, SIGSEGV, &act, nullptr, 8);\n\n  CauseInt();\n\n  REQUIRE(from_handler.has_value());\n  CHECK(from_handler->mctx.gregs[REG_EIP] == EXPECTED_RIP);\n  CHECK(from_handler->mctx.gregs[REG_TRAPNO] == EXPECTED_TRAPNO);\n  CHECK(from_handler->mctx.gregs[REG_ERR] == EXPECTED_ERR);\n  CHECK(from_handler->signal == EXPECTED_SIGNAL);\n}\n\nTEST_CASE(\"sigaction: siginfo - glibc\") {\n  // Test to ensure that regular glibc sigaction works.\n  capturing_handler_skip = 2;\n  struct sigaction act {};\n  act.sa_sigaction = CapturingHandler_realtime_glibc_helper;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGSEGV, &act, nullptr);\n\n  CauseInt();\n\n  REQUIRE(from_handler.has_value());\n  CHECK(from_handler->mctx.gregs[REG_EIP] == EXPECTED_RIP);\n  CHECK(from_handler->mctx.gregs[REG_TRAPNO] == EXPECTED_TRAPNO);\n  CHECK(from_handler->mctx.gregs[REG_ERR] == EXPECTED_ERR);\n  CHECK(from_handler->signal == EXPECTED_SIGNAL);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/sigtest_siginfo.64.cpp",
    "content": "#include \"invalid_util.h\"\n\n#include <catch2/catch_test_macros.hpp>\n\n#include <signal.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <cstdint>\n\nextern \"C\" void IntInstruction();\n\n#pragma GCC diagnostic ignored \"-Wattributes\" // Suppress warning in case control-flow checks aren't enabled\n__attribute__((naked, nocf_check)) static void CauseInt() {\n  __asm volatile(R\"(\n  IntInstruction:\n  int 1;\n  ret; # For RIP modification\n  )\");\n}\n\nstatic uint64_t EXPECTED_RIP = reinterpret_cast<uint64_t>(&IntInstruction);\nconstexpr int EXPECTED_TRAPNO = 13;\nconstexpr int EXPECTED_ERR = 10;\nconstexpr int EXPECTED_SI_CODE = 128;\nconstexpr int EXPECTED_SIGNAL = SIGSEGV;\n\nTEST_CASE(\"siginfo\") {\n  // On x86-64, the signal handler receives siginfo even if SA_SIGINFO isn't set.\n  // This flag is effectively a no-op, not changing behaviour.\n  capturing_handler_skip = 2;\n  struct sigaction act {};\n  act.sa_sigaction = CapturingHandler;\n  act.sa_flags = 0;\n  sigaction(SIGSEGV, &act, nullptr);\n\n  CauseInt();\n\n  REQUIRE(from_handler.has_value());\n  CHECK(from_handler->mctx.gregs[REG_RIP] == EXPECTED_RIP);\n  CHECK(from_handler->mctx.gregs[REG_TRAPNO] == EXPECTED_TRAPNO);\n  CHECK(from_handler->mctx.gregs[REG_ERR] == EXPECTED_ERR);\n  CHECK(from_handler->signal == EXPECTED_SIGNAL);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/sigtest_sigmask.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <signal.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <ucontext.h>\n#include <unistd.h>\n\nvolatile bool loop = false;\nvolatile bool inhandler = false;\n\n#define SIGN SIGTSTP\n\nvoid sig_handler(int signum, siginfo_t* info, void* context) {\n  loop = false;\n  printf(\"Inside handler function\\n\");\n  if (inhandler) {\n    printf(\"Signal reentering bug\\n\");\n    exit(-1);\n  }\n  inhandler = true;\n  raise(signum);\n\n  auto uctx = (ucontext_t*)context;\n  sigfillset(&uctx->uc_sigmask);\n}\n\nTEST_CASE(\"Signals: sigmask\") {\n  struct sigaction act = {0};\n\n  act.sa_flags = SA_SIGINFO;\n  act.sa_sigaction = &sig_handler;\n  REQUIRE(sigaction(SIGN, &act, NULL) == 0);\n\n  loop = true;\n  while (loop) {\n    printf(\"Inside main loop, raising signal\\n\");\n    raise(SIGN);\n\n    // Ensure the signal got indeed raised\n    REQUIRE_FALSE(loop);\n  }\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/synchronous-signal-block.cpp",
    "content": "// Triggering synchronous POSIX signals while they're masked triggers a\n// process exit. In contrast, if an asynchronous signals is triggered, the\n// corresponding signal handler will be invoked once the signal is unmasked.\n//\n// To test synchronous signals, the test forks and triggers the signal in the\n// child process. For asynchronous signals, a signal handler that sets a global\n// variable is used.\n\n#include <sys/mman.h>\n#include <sys/wait.h>\n\n#include <cinttypes>\n#include <cstdint>\n#include <optional>\n#include <setjmp.h>\n#include <signal.h>\n#include <stdio.h>\n#include <sys/mman.h>\n#include <sys/wait.h>\n#include <unistd.h>\n\n#include <catch2/catch_test_macros.hpp>\n#include <catch2/generators/catch_generators.hpp>\n\nstatic jmp_buf jmpbuf;\n\nstruct HandledSignal {\n  int signal;\n  uintptr_t addr;\n};\n\nstruct HandledSignal_ERR {\n  int signal;\n  size_t ERR;\n};\n\nstatic std::optional<HandledSignal> handled_signal;\nstatic std::optional<HandledSignal_ERR> handled_signal_err;\n\nstatic void handler(int sig, siginfo_t* si, void* context) {\n  printf(\"Got %d at address: 0x%lx\\n\", sig, (long)si->si_addr);\n  handled_signal = {sig, reinterpret_cast<uintptr_t>(si->si_addr)};\n  siglongjmp(jmpbuf, 1);\n}\n\n// Helper that masks all signals and unmasks them on destruction\nstruct GuardedSignalMask {\n  sigset_t oldset {};\n\n  GuardedSignalMask() {\n    sigset_t set;\n    sigfillset(&set);\n    sigprocmask(SIG_SETMASK, &set, &oldset);\n  }\n\n  ~GuardedSignalMask() {\n    sigprocmask(SIG_SETMASK, &oldset, nullptr);\n  }\n};\n\n// Checks if the given function causes the process to exit.\n// The function is executed in a process fork.\ntemplate<typename F>\nstd::optional<int> CheckIfExitsFromSignal(F&& f) {\n  if (fork() == 0) {\n    GuardedSignalMask guard;\n    std::forward<F>(f)();\n    exit(1);\n  } else {\n    int status = 0;\n    wait(&status);\n    return status;\n  }\n}\n\n// Checks if the given function causes a signal handler to be invoked\ntemplate<typename F>\nstd::optional<HandledSignal> CheckIfSignalHandlerCalled(F&& f) {\n  handled_signal = {};\n  struct sigaction oldsa[4];\n\n  if (!sigsetjmp(jmpbuf, 1)) {\n    // Handle all signals by the test handler\n    struct sigaction sa;\n    sa.sa_flags = SA_SIGINFO;\n    sigemptyset(&sa.sa_mask);\n    sa.sa_sigaction = handler;\n    sigaction(SIGSEGV, &sa, &oldsa[0]);\n    sigaction(SIGBUS, &sa, &oldsa[1]);\n    sigaction(SIGILL, &sa, &oldsa[2]);\n    sigaction(SIGFPE, &sa, &oldsa[3]);\n\n    // Mask signals and run given callback\n    GuardedSignalMask guard;\n    std::forward<F>(f)();\n  }\n\n  // Restore previous signal handlers\n  sigaction(SIGSEGV, &oldsa[0], nullptr);\n  sigaction(SIGBUS, &oldsa[1], nullptr);\n  sigaction(SIGILL, &oldsa[2], nullptr);\n  sigaction(SIGFPE, &oldsa[3], nullptr);\n\n  return handled_signal;\n}\n\nstatic void handler_read(int sig, siginfo_t* si, void* context) {\n  ucontext_t* _context = (ucontext_t*)context;\n  auto mcontext = &_context->uc_mcontext;\n  printf(\"Got %d at address: 0x%lx with 0x%zx\\n\", sig, (long)si->si_addr, (size_t)mcontext->gregs[REG_ERR]);\n  handled_signal_err = {sig, (size_t)mcontext->gregs[REG_ERR]};\n  siglongjmp(jmpbuf, 1);\n}\n\ntemplate<typename F>\nstd::optional<HandledSignal> CheckIfSignalHandlerCalledWithRegERR(F&& f) {\n  handled_signal = {};\n  struct sigaction oldsa[4];\n\n  if (!sigsetjmp(jmpbuf, 1)) {\n    // Handle all signals by the test handler\n    struct sigaction sa;\n    sa.sa_flags = SA_SIGINFO;\n    sigemptyset(&sa.sa_mask);\n    sa.sa_sigaction = handler_read;\n    sigaction(SIGSEGV, &sa, &oldsa[0]);\n    sigaction(SIGBUS, &sa, &oldsa[1]);\n    sigaction(SIGILL, &sa, &oldsa[2]);\n    sigaction(SIGFPE, &sa, &oldsa[3]);\n\n    // Mask signals and run given callback\n    std::forward<F>(f)();\n  }\n\n  // Restore previous signal handlers\n  sigaction(SIGSEGV, &oldsa[0], nullptr);\n  sigaction(SIGBUS, &oldsa[1], nullptr);\n  sigaction(SIGILL, &oldsa[2], nullptr);\n  sigaction(SIGFPE, &oldsa[3], nullptr);\n\n  return handled_signal;\n}\n\nTEST_CASE(\"Signals: Error Flag - Read\") {\n  // Check that the signal handler is delayed until unmasking.\n  auto handled_signal = CheckIfSignalHandlerCalledWithRegERR([&]() {\n    uint8_t* Code = (uint8_t*)mmap(nullptr, 4096, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);\n    printf(\"Read: %d\\n\", Code[0]);\n  });\n  REQUIRE(handled_signal_err.has_value());\n  CHECK(handled_signal_err->signal == SIGSEGV);\n  constexpr size_t Expected = 0x4;\n  CHECK(handled_signal_err->ERR == Expected); // USER\n}\n\nTEST_CASE(\"Signals: Error Flag - Write\") {\n  // Check that the signal handler is delayed until unmasking.\n  auto handled_signal = CheckIfSignalHandlerCalledWithRegERR([&]() {\n    uint8_t* Code = (uint8_t*)mmap(nullptr, 4096, PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);\n    Code[0] = 1;\n  });\n  REQUIRE(handled_signal_err.has_value());\n  CHECK(handled_signal_err->signal == SIGSEGV);\n  constexpr size_t Expected = 0x6;\n  CHECK(handled_signal_err->ERR == Expected); // USER + WRITE\n}\n\n// For ssegv, we fail to do default signal catching behaviour\nTEST_CASE(\"Signals: ssegv\") {\n  auto status = CheckIfExitsFromSignal([]() { *(int*)0x32 = 0x64; });\n  REQUIRE(status.has_value());\n  CHECK(WIFSIGNALED(*status) == true);\n  CHECK(WTERMSIG(*status) == SIGSEGV);\n}\n\n// For sill, we fail to do default signal catching behaviour\nTEST_CASE(\"Signals: sill\") {\n  auto status = CheckIfExitsFromSignal([]() { asm volatile(\"ud2\\n\"); });\n  REQUIRE(status.has_value());\n  CHECK(WIFSIGNALED(*status) == true);\n  CHECK(WTERMSIG(*status) == SIGILL);\n}\n\n// sbus and abus fail on arm because of sigbus handling\nTEST_CASE(\"Signals: sbus\") {\n  auto map1 = mmap(nullptr, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);\n  auto map2 = (char*)mremap(map1, 4096, 8192, MREMAP_MAYMOVE);\n\n  auto status = CheckIfExitsFromSignal([&]() { map2[4096] = 2; });\n  REQUIRE(status.has_value());\n  CHECK(WIFSIGNALED(*status) == true);\n  CHECK(WTERMSIG(*status) == SIGBUS);\n}\n\n// sfpe and afpe fail on arm because we don't raise FPE\nTEST_CASE(\"Signals: sfpe\") {\n  auto status = CheckIfExitsFromSignal([&]() {\n    volatile int a = 10;\n    volatile int b = 0;\n    volatile int c = a / b;\n    printf(\"result: %d\\n\", c);\n  });\n  REQUIRE(status.has_value());\n  CHECK(WIFSIGNALED(*status) == true);\n  CHECK(WTERMSIG(*status) == SIGFPE);\n}\n\n// These fail to queue the signals\nTEST_CASE(\"Signals: asynchronous\") {\n  int tested_signal = GENERATE(SIGSEGV, SIGILL, SIGBUS, SIGFPE);\n\n  // Check that the signal handler is delayed until unmasking.\n  bool handled_asynchronously = false;\n  auto handled_signal = CheckIfSignalHandlerCalled([&]() {\n    GuardedSignalMask guard {};\n    raise(tested_signal);\n\n    // Verify the rest of this function is still executed\n    handled_asynchronously = true;\n\n    // Destructor of GuardedSignalMask will unmask signals now,\n    // after which the signal handler should run\n  });\n  REQUIRE(handled_signal.has_value());\n  CHECK(handled_signal->signal == tested_signal);\n  CHECK(handled_asynchronously);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/timer-sigev-thread.cpp",
    "content": "// Simple test of timer_create + SIGEV_THREAD, glibc implements it via SIG32\n\n#include <catch2/catch_test_macros.hpp>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\n#include <cassert>\n#include <optional>\n#include <signal.h>\n#include <time.h>\n\nint test;\n\nstd::optional<bool> sigval_ack;\n\nvoid timer_handler(union sigval sv) {\n  sigval_ack = sv.sival_ptr == &test;\n  printf(\"timer_handler called, ok = %d\\n\", *sigval_ack);\n}\n\n// These sometimes crash FEX with SIGSEGV\nTEST_CASE(\"timer_create and SIGEV_THREAD\", \"[!mayfail]\") {\n  timer_t timer;\n  sigevent sige;\n  itimerspec spec;\n\n  memset(&sige, 0, sizeof(sige));\n\n  sige.sigev_notify = SIGEV_THREAD;\n  sige.sigev_notify_function = &timer_handler;\n  sige.sigev_value.sival_ptr = &test;\n\n  timer_create(CLOCK_REALTIME, &sige, &timer);\n\n  memset(&spec, 0, sizeof(spec));\n\n  spec.it_value.tv_sec = 0;\n  spec.it_value.tv_nsec = 1;\n\n  timer_settime(timer, 0, &spec, NULL);\n\n  while (!sigval_ack) {\n    usleep(10);\n  }\n\n  REQUIRE(sigval_ack.has_value());\n  CHECK(*sigval_ack == true);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/trap_flag.cpp",
    "content": "#include \"invalid_util.h\"\n\n#include <catch2/catch_test_macros.hpp>\n\n#include <atomic>\n#include <signal.h>\n#include <sys/mman.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <cstdlib>\n\nextern \"C\" void RetInstruction();\n\n#pragma GCC diagnostic ignored \"-Wattributes\" // Suppress warning in case control-flow checks aren't enabled\n\n#if __SIZEOF_POINTER__ == 4\n__attribute__((naked, nocf_check)) static void TestTF() {\n  __asm volatile(R\"(\n  pushfd;\n  or dword ptr [esp], 0x100;\n  popfd;\n  nop;\n  nop;\n  nop;\n  pushfd;\n  and dword ptr [esp], ~0x100;\n  popfd;\n  RetInstruction:\n  ret;\n  )\");\n}\n#else\n__attribute__((naked, nocf_check)) static void TestTF() {\n  __asm volatile(R\"(\n  pushfq;\n  or qword ptr [rsp], 0x100;\n  popfq;\n  nop;\n  nop;\n  nop;\n  pushfq;\n  and qword ptr [rsp], ~0x100;\n  popfq;\n  RetInstruction:\n  ret;\n  )\");\n}\n#endif\n\nunsigned long EXPECTED_RIP = reinterpret_cast<unsigned long>(&RetInstruction);\nconstexpr int EXPECTED_TRAPNO = 1;\nconstexpr int EXPECTED_ERR = 0;\nconstexpr int EXPECTED_SI_CODE = 2;\nconstexpr int EXPECTED_SIGNAL = SIGTRAP;\nconstexpr int EXPECTED_SIGNAL_COUNT = 6;\n\nTEST_CASE(\"Signals: Trap Flag\") {\n  capturing_handler_skip = 0;\n  struct sigaction act {};\n  act.sa_sigaction = CapturingHandler;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGTRAP, &act, nullptr);\n\n  TestTF();\n\n#ifndef REG_RIP\n#define REG_RIP REG_EIP\n#endif\n\n  REQUIRE(from_handler.has_value());\n  CHECK(from_handler->mctx.gregs[REG_RIP] == EXPECTED_RIP);\n  CHECK(from_handler->mctx.gregs[REG_TRAPNO] == EXPECTED_TRAPNO);\n  CHECK(from_handler->mctx.gregs[REG_ERR] == EXPECTED_ERR);\n  CHECK(from_handler->si_code == EXPECTED_SI_CODE);\n  CHECK(from_handler->signal == EXPECTED_SIGNAL);\n  CHECK(capturing_handler_calls == EXPECTED_SIGNAL_COUNT);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/signal/x87_state.64.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <signal.h>\n#include <sys/mman.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <cstdlib>\n\nstruct DataStruct {\n  uint64_t dual[2];\n};\nconstexpr static DataStruct data[8] = {\n  {0x1112131415161718ULL, 0x191A1B1C1D1E1F10ULL}, {0x2122232425262728ULL, 0x292A2B2C2D2E2F20ULL},\n  {0x3132333435363738ULL, 0x393A3B3C3D3E3F30ULL}, {0x4142434445464748ULL, 0x494A4B4C4D4E4F40ULL},\n  {0x5152535455565758ULL, 0x595A5B5C5D5E5F50ULL}, {0x6162636465666768ULL, 0x696A6B6C6D6E6F60ULL},\n  {0x7172737475767778ULL, 0x797A7B7C7D7E7F70ULL}, {0x8182838485868788ULL, 0x898A8B8C8D8E8F80ULL},\n};\n\nextern \"C\" void RetInstruction();\n__attribute__((naked, nocf_check)) static void TestFromSignal(const DataStruct* data) {\n  __asm volatile(R\"(\n\n  finit;\n  // Load 8 zeroes to be safe.\n  fldz;\n  fldz;\n  fldz;\n  fldz;\n  fldz;\n  fldz;\n  fldz;\n  fldz;\n\n  // Empty them\n  ffreep st(0);\n  ffreep st(0);\n  ffreep st(0);\n  ffreep st(0);\n  ffreep st(0);\n  ffreep st(0);\n  ffreep st(0);\n  ffreep st(0);\n\n  // Now load **7** values. Keeping the last one zero and our stack top not wrapped around.\n  fld tbyte ptr [rdi + (0 * 16)];\n  fld tbyte ptr [rdi + (1 * 16)];\n  fld tbyte ptr [rdi + (2 * 16)];\n  fld tbyte ptr [rdi + (3 * 16)];\n  fld tbyte ptr [rdi + (4 * 16)];\n  fld tbyte ptr [rdi + (5 * 16)];\n  fld tbyte ptr [rdi + (6 * 16)];\n\n  hlt;\n  RetInstruction:\n  ret;\n  )\" ::\n                   : \"memory\", \"cc\");\n}\n\nextern \"C\" void RetSetInstruction();\n__attribute__((naked, nocf_check)) static void TestSetInSignal(DataStruct* data) {\n  __asm volatile(R\"(\n  finit;\n  // Load 8 zeroes to be safe.\n  fldz;\n  fldz;\n  fldz;\n  fldz;\n  fldz;\n  fldz;\n  fldz;\n  fldz;\n\n  // Empty them\n  ffreep st(0);\n  ffreep st(0);\n  ffreep st(0);\n  ffreep st(0);\n  ffreep st(0);\n  ffreep st(0);\n  ffreep st(0);\n  ffreep st(0);\n\n  hlt;\n  RetSetInstruction:\n\n  // Store values until the status word says nothing is left.\n  mov eax, 0;\n\n2:\n\n  fstsw ax;\n  and eax, (7 << 11);\n  jz 3f;\n  fstp tbyte ptr [rdi];\n  add rdi, 16;\n\n  jmp 2b\n\n3:\n\n  // Now load **7** values. Keeping the last one zero and our stack top not wrapped around.\n  fld tbyte ptr [rdi + (0 * 16)];\n  fld tbyte ptr [rdi + (1 * 16)];\n  fld tbyte ptr [rdi + (2 * 16)];\n  fld tbyte ptr [rdi + (3 * 16)];\n  fld tbyte ptr [rdi + (4 * 16)];\n  fld tbyte ptr [rdi + (5 * 16)];\n  fld tbyte ptr [rdi + (6 * 16)];\n\n  ret;\n  )\" ::\n                   : \"memory\", \"cc\");\n}\n\nstatic DataStruct signal_data[8];\n\nstatic void Correct_Handler(int signal, siginfo_t* siginfo, void* context) {\n  ucontext_t* _context = (ucontext_t*)context;\n  auto mcontext = &_context->uc_mcontext;\n\n  for (size_t i = 0; i < 8; ++i) {\n    memcpy(&signal_data[i], &mcontext->fpregs->_st[i], 10);\n  }\n#ifdef REG_RIP\n#define FEX_IP_REG REG_RIP\n#else\n#define FEX_IP_REG REG_EIP\n#endif\n\n  mcontext->gregs[FEX_IP_REG] = reinterpret_cast<greg_t>(RetInstruction);\n}\n\nstatic void Set_Signal_Handler(int signal, siginfo_t* siginfo, void* context) {\n  ucontext_t* _context = (ucontext_t*)context;\n  auto mcontext = &_context->uc_mcontext;\n\n  // Set the first seven values\n  for (size_t i = 0; i < 8; ++i) {\n    memcpy(&mcontext->fpregs->_st[i], &data[i], sizeof(mcontext->fpregs->_st[i]));\n  }\n\n  // Adjust the x87 TOP to 1\n  mcontext->fpregs->swd = (mcontext->fpregs->swd & ~(3 << 11)) | (1 << 11);\n  // Make sure to set the tag words as valid.\n  mcontext->fpregs->ftw = 0xFFFE;\n\n#ifdef REG_RIP\n#define FEX_IP_REG REG_RIP\n#else\n#define FEX_IP_REG REG_EIP\n#endif\n\n  mcontext->gregs[FEX_IP_REG] = reinterpret_cast<greg_t>(RetSetInstruction);\n}\n\nTEST_CASE(\"Signals: X87 State in handler\") {\n  struct sigaction act {};\n  act.sa_sigaction = Correct_Handler;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGSEGV, &act, nullptr);\n  TestFromSignal(data);\n\n  constexpr static DataStruct test_data[8] = {\n    {0x7172737475767778, 0x7f70}, {0x6162636465666768, 0x6f60}, {0x5152535455565758, 0x5f50}, {0x4142434445464748, 0x4f40},\n    {0x3132333435363738, 0x3f30}, {0x2122232425262728, 0x2f20}, {0x1112131415161718, 0x1f10}, {0x0, 0x0}};\n\n  for (size_t i = 0; i < 8; ++i) {\n    CHECK(memcmp(&test_data[i], &signal_data[i], sizeof(DataStruct)) == 0);\n  }\n}\n\nTEST_CASE(\"Signals: X87 State set state in handler\") {\n  struct sigaction act {};\n  act.sa_sigaction = Set_Signal_Handler;\n  act.sa_flags = SA_SIGINFO;\n  sigaction(SIGSEGV, &act, nullptr);\n\n  DataStruct output_data[8] {};\n  TestSetInSignal(output_data);\n\n  constexpr static DataStruct test_data[8] = {\n    {0x1112131415161718, 0x1f10}, {0x2122232425262728, 0x2f20}, {0x3132333435363738, 0x3f30}, {0x4142434445464748, 0x4f40},\n    {0x5152535455565758, 0x5f50}, {0x6162636465666768, 0x6f60}, {0x7172737475767778, 0x7f70}, {0x0, 0x0}};\n\n  for (size_t i = 0; i < 8; ++i) {\n    CHECK(memcmp(&test_data[i], &output_data[i], sizeof(DataStruct)) == 0);\n  }\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/smc/smc-1-dynamic.cpp",
    "content": "#define EXECSTACK\n\n/*\nWe cannot test the omagic or the static version of this, due to cross compiling issues\n//#define OMAGIC // when the g++ driver is used to link, -Wl,--omagic breaks -static, so this can't be tested\n*/\n/*\n  tests for smc changes in .text, stack and bss\n*/\n\nchar data_sym[16384];\nchar text_sym[16384] __attribute__((section(\".text\")));\n\n#include \"smc-common.h\"\n\n#include <catch2/catch_test_macros.hpp>\n\nTEST_CASE(\"SMC: Changes in stack\") {\n  // stack, depends on -z execstack or mprotect\n  char stack[16384];\n  auto code = (char*)(((uintptr_t)stack + 4095) & ~4095);\n\n#if !defined(EXECSTACK)\n  mprotect(code, 4096, PROT_READ | PROT_WRITE | PROT_EXEC);\n#endif\n\n  CHECK(test(code, \"stack\") == 0);\n}\n\nTEST_CASE(\"SMC: Changes in data section\") {\n  // data_sym, must use mprotect\n  auto code = (char*)(((uintptr_t)data_sym + 4095) & ~4095);\n  mprotect(code, 4096, PROT_READ | PROT_WRITE | PROT_EXEC);\n  CHECK(test(code, \"data_sym\") == 0);\n}\n\nTEST_CASE(\"SMC: Changes in text section\") {\n  // text_sym, depends on -Wl,omagic or mprotect\n  auto code = (char*)(((uintptr_t)text_sym + 4095) & ~4095);\n\n#if !defined(OMAGIC)\n  mprotect(code, 4096, PROT_READ | PROT_WRITE | PROT_EXEC);\n#endif\n\n  CHECK(test(code, \"text_sym\") == 0);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/smc/smc-2.cpp",
    "content": "/*\n  tests for smc changes memory mapped via mmap, mremap, shmat without mirroring\n*/\n\n#include \"smc-common.h\"\n\n#include <catch2/catch_test_macros.hpp>\n\nTEST_CASE(\"SMC: mmap\") {\n  auto code = (char*)mmap(0, 4096, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, 0, 0);\n  CHECK(test(code, \"mmap\") == 0);\n}\n\nTEST_CASE(\"SMC: mremap\") {\n  auto code = (char*)mmap(0, 4096, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED | MAP_ANON, 0, 0);\n  auto code2 = (char*)mremap(code, 0, 4096, MREMAP_MAYMOVE);\n  CHECK(test(code2, \"mremap\") == 0);\n}\n\nTEST_CASE(\"SMC: shmat\") {\n  auto shm = shmget(IPC_PRIVATE, 4096, IPC_CREAT | 0777);\n  auto code = (char*)shmat(shm, nullptr, SHM_EXEC);\n  CHECK(test(code, \"shmat\") == 0);\n}\n\nTEST_CASE(\"SMC: shmat_mremap\") {\n  auto shm = shmget(IPC_PRIVATE, 4096, IPC_CREAT | 0777);\n  auto code = (char*)shmat(shm, nullptr, SHM_EXEC);\n  auto code2 = (char*)mremap(code, 0, 4096, MREMAP_MAYMOVE);\n  CHECK(test(code2, \"shmat_mremap\") == 0);\n}\n\nTEST_CASE(\"SMC: mmap_shmdt\") {\n  auto shmid = shmget(IPC_PRIVATE, 4096 * 3, IPC_CREAT | 0777);\n  auto ptrshm = (char*)shmat(shmid, 0, 0);\n  shmctl(shmid, IPC_RMID, NULL);\n  auto ptrmmap = (char*)mmap(ptrshm + 4096, 4096, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_ANON, 0, 0);\n  shmdt(ptrshm);\n  CHECK(test(ptrmmap, \"mmap_shmdt\") == 0);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/smc/smc-common.h",
    "content": "#include <cstdint>\n#include <cstdio>\n#include <cstdlib>\n#include <cassert>\n#include <cstring>\n\n#include <unistd.h>\n#include <fcntl.h>\n\n#include <sys/mman.h>\n#include <sys/shm.h>\n#include <sys/wait.h>\n\n\nint test(char* code, const char* name) {\n  // mov eax, imm32\n  code[0] = 0xB8;\n  code[1] = 0xAA;\n  code[2] = 0xBB;\n  code[3] = 0xCC;\n  code[4] = 0xDD;\n\n  // ret\n  code[5] = 0xC3;\n\n  auto fn = (int (*)())code;\n  auto e1 = fn();\n\n  // patch imm\n  code[3] = 0xFE;\n  auto e2 = fn();\n\n  mprotect(code, 4096, PROT_READ | PROT_EXEC);\n\n  mprotect(code, 4096, PROT_READ | PROT_WRITE | PROT_EXEC);\n\n  // patch imm\n  code[3] = 0xF3;\n\n  mprotect(code, 4096, PROT_READ | PROT_EXEC);\n\n  auto e3 = fn();\n\n  mprotect(code, 4096, PROT_READ | PROT_WRITE | PROT_EXEC);\n\n  // patch imm\n  code[3] = 0xF1;\n\n  auto e4 = fn();\n\n  int failure_set = 0;\n\n  failure_set |= (e1 != 0xDDCCBBAA) << 0;\n  printf(\"%s-1: %X, %s\\n\", name, e1, e1 != 0xDDCCBBAA ? \"FAIL\" : \"PASS\");\n  failure_set |= (e2 != 0xDDFEBBAA) << 1;\n  printf(\"%s-2: %X, %s\\n\", name, e2, e2 != 0xDDFEBBAA ? \"FAIL\" : \"PASS\");\n  failure_set |= (e3 != 0xDDF3BBAA) << 2;\n  printf(\"%s-3: %X, %s\\n\", name, e3, e3 != 0xDDF3BBAA ? \"FAIL\" : \"PASS\");\n  failure_set |= (e4 != 0xDDF1BBAA) << 3;\n  printf(\"%s-4: %X, %s\\n\", name, e4, e4 != 0xDDF1BBAA ? \"FAIL\" : \"PASS\");\n\n  return failure_set;\n}\n\nint test_shared(char* code, char* codeexec, const char* name) {\n  assert(code != codeexec);\n  code[0] = 0xB8;\n  code[1] = 0xAA;\n  code[2] = 0xBB;\n  code[3] = 0xCC;\n  code[4] = 0xDD;\n\n  code[5] = 0xC3;\n\n  auto fn = (int (*)())codeexec;\n  auto e1 = fn();\n  code[3] = 0xFE;\n  auto e2 = fn();\n\n  int failure_set = 0;\n\n  failure_set |= (e1 != 0xDDCCBBAA) << 0;\n  printf(\"%s-1: %X, %s\\n\", name, e1, e1 != 0xDDCCBBAA ? \"FAIL\" : \"PASS\");\n  failure_set |= (e2 != 0xDDFEBBAA) << 1;\n  printf(\"%s-2: %X, %s\\n\", name, e2, e2 != 0xDDFEBBAA ? \"FAIL\" : \"PASS\");\n\n  return failure_set;\n}\n\nint test_forked(char* code, char* codeexec, const char* name) {\n  code[0] = 0xB8;\n  code[1] = 0xAA;\n  code[2] = 0xBB;\n  code[3] = 0xCC;\n  code[4] = 0xDD;\n\n  code[5] = 0xC3;\n\n  auto fn = (int (*)())codeexec;\n  auto e1 = fn();\n  auto pid = fork();\n  if (pid == 0) {\n    code[3] = 0xFE;\n    exit(0);\n  } else {\n    int status;\n    wait(&status);\n    return WEXITSTATUS(status);\n  }\n  auto e2 = fn();\n\n  printf(\"%s-1: %X, %s\\n\", name, e1, e1 != 0xDDCCBBAA ? \"FAIL\" : \"PASS\");\n  printf(\"%s-2: %X, %s\\n\", name, e2, e2 != 0xDDFEBBAA ? \"FAIL\" : \"PASS\");\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/smc/smc-exec-stack.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n#include <signal.h>\n#include <ucontext.h>\n#include <sys/mman.h>\n\nbool got_signal = false;\n\nstatic void sigsegv_handler(int signal, siginfo_t* siginfo, void* context) {\n  REQUIRE(siginfo->si_code == SEGV_ACCERR);\n  got_signal = true;\n  size_t page_size = sysconf(_SC_PAGESIZE);\n  void* fault_page = (void*)((uintptr_t)(siginfo->si_addr) & ~(page_size - 1));\n  REQUIRE(mprotect(fault_page, page_size, PROT_READ | PROT_WRITE | PROT_EXEC) == 0);\n}\n\nvoid register_signal_handler() {\n  struct sigaction act {};\n  act.sa_sigaction = sigsegv_handler;\n  act.sa_flags = SA_SIGINFO;\n  REQUIRE(sigaction(SIGSEGV, &act, nullptr) == 0);\n}\n\nTEST_CASE(\"smc-exec-stack: PT_GNU_STACK == RWX\") {\n  register_signal_handler();\n\n  // Try executing from stack\n  char stack[16384];\n  auto stack_code = (char*)(((uintptr_t)stack + 4095) & ~4095);\n  *stack_code = 0xC3; // ret\n  ((void (*)())(stack_code))();\n  CHECK(got_signal == false);\n  got_signal = false;\n}\n\nTEST_CASE(\"smc-exec-stack: mmap other memory\") {\n  register_signal_handler();\n\n  // Executing from other memory should fail\n  size_t page_size = sysconf(_SC_PAGESIZE);\n  uint8_t* mem_code = static_cast<uint8_t*>(mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));\n  REQUIRE(mem_code != nullptr);\n  *mem_code = 0xC3; // ret\n  ((void (*)())(mem_code))();\n\n  CHECK(got_signal == true);\n  got_signal = false;\n\n  REQUIRE(munmap(mem_code, page_size) == 0);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/smc/smc-missing-gnustack.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n#include <signal.h>\n#include <ucontext.h>\n#include <sys/mman.h>\n\nbool got_signal = false;\n\nstatic void sigsegv_handler(int signal, siginfo_t* siginfo, void* context) {\n  REQUIRE(siginfo->si_code == SEGV_ACCERR);\n  got_signal = true;\n  size_t page_size = sysconf(_SC_PAGESIZE);\n  void* fault_page = (void*)((uintptr_t)(siginfo->si_addr) & ~(page_size - 1));\n  REQUIRE(mprotect(fault_page, page_size, PROT_READ | PROT_WRITE | PROT_EXEC) == 0);\n}\n\nvoid register_signal_handler() {\n  struct sigaction act {};\n  act.sa_sigaction = sigsegv_handler;\n  act.sa_flags = SA_SIGINFO;\n  REQUIRE(sigaction(SIGSEGV, &act, nullptr) == 0);\n}\n\nTEST_CASE(\"smc-missing-gnustack: PT_GNU_STACK missing\") {\n  register_signal_handler();\n\n  // Try executing from stack\n  char stack[16384];\n  auto stack_code = (char*)(((uintptr_t)stack + 4095) & ~4095);\n  *stack_code = 0xC3; // ret\n  ((void (*)())(stack_code))();\n\n#ifdef __i386__\n  CHECK(got_signal == false);\n#else\n  CHECK(got_signal == true);\n#endif\n  got_signal = false;\n}\n\nTEST_CASE(\"smc-missing-gnustack: mmap other memory\") {\n  register_signal_handler();\n  // Executing from other memory should fail on 64 bit but work on 32 bit\n  size_t page_size = sysconf(_SC_PAGESIZE);\n  uint8_t* mem_code = static_cast<uint8_t*>(mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));\n  REQUIRE(mem_code != nullptr);\n  *mem_code = 0xC3; // ret\n  ((void (*)())(mem_code))();\n\n#ifdef __i386__\n  CHECK(got_signal == false);\n#else\n  CHECK(got_signal == true);\n#endif\n  got_signal = false;\n\n  REQUIRE(munmap(mem_code, page_size) == 0);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/smc/smc-mt-1.cpp",
    "content": "/*\n  tests concurrent invalidation of different code from different threads\n\n  creates 10 threads\n  each thread does an smc test 10 times\n\n*/\n#include <cstdio>\n#include <pthread.h>\n#include <sys/mman.h>\n\n#include <atomic>\n\n#include <catch2/catch_test_macros.hpp>\n\nstd::atomic<int> result;\nstd::atomic<bool> go;\n\nvoid* thread(void*) {\n\n  auto code = (char*)mmap(0, 4096, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, 0, 0);\n\n  for (int k = 0; k < 10; k++) {\n    code[0] = 0xB8;\n    code[1] = 0xAA;\n    code[2] = 0xBB;\n    code[3] = 0xCC;\n    code[4] = 0xDD;\n\n    code[5] = 0xC3;\n\n    while (!go)\n      ;\n\n    auto fn = (int (*)())code;\n    auto e1 = fn();\n    code[3] = 0xFE;\n    auto e2 = fn();\n\n    mprotect(code, 4096, PROT_READ | PROT_EXEC);\n\n    mprotect(code, 4096, PROT_READ | PROT_WRITE | PROT_EXEC);\n\n    code[3] = 0xF3;\n\n    mprotect(code, 4096, PROT_READ | PROT_EXEC);\n\n    auto e3 = fn();\n\n    mprotect(code, 4096, PROT_READ | PROT_WRITE | PROT_EXEC);\n\n    code[3] = 0xF1;\n\n    auto e4 = fn();\n\n    result |= e1 != 0xDDCCBBAA;\n    printf(\"Exec1: %X, %s\\n\", e1, e1 != 0xDDCCBBAA ? \"FAIL\" : \"PASS\");\n    result |= e2 != 0xDDFEBBAA;\n    printf(\"Exec2: %X, %s\\n\", e2, e2 != 0xDDFEBBAA ? \"FAIL\" : \"PASS\");\n    result |= e3 != 0xDDF3BBAA;\n    printf(\"Exec3: %X, %s\\n\", e3, e3 != 0xDDF3BBAA ? \"FAIL\" : \"PASS\");\n    result |= e4 != 0xDDF1BBAA;\n    printf(\"Exec4: %X, %s\\n\", e4, e4 != 0xDDF1BBAA ? \"FAIL\" : \"PASS\");\n  }\n\n  return 0;\n}\n\nTEST_CASE(\"SMC: Concurrent invalidation of different code from different threads\") {\n  pthread_t tid[10];\n  for (int i = 0; i < 10; i++) {\n    pthread_create(&tid[i], 0, &thread, 0);\n  }\n\n  go = true;\n\n  for (int i = 0; i < 10; i++) {\n    void* rv;\n    pthread_join(tid[i], &rv);\n  }\n\n  CHECK(result == 0);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/smc/smc-mt-2.cpp",
    "content": "/*\n  tests one thread modifying another thread's code\n\n  main thread\n  - allocates code buffer\n  - starts secondary thread\n  - waits to be signaled from secondary thread\n  - modifies the code\n  - signals secondary thread to claim the code is modified\n  - waits for secondary thread to exit, while making sure it doesn't run the old code after modification\n  - exits\n\n\n  secondary thread\n  - generates some code and runs it once\n  - signals main thread to modify the code\n  - waits to be signaled that code was modified\n  - calls the to be code and checks if the result is the modified or non modified one\n  - exits\n\n*/\n\n#include <cstdio>\n#include <cstdlib>\n#include <pthread.h>\n#include <sys/mman.h>\n#include <unistd.h>\n\n#include <atomic>\n\n#include <catch2/catch_test_macros.hpp>\n\nstd::atomic<bool> ready_for_modification;\nstd::atomic<bool> waiting_for_modification;\nstd::atomic<bool> thread_unblocked;\nstd::atomic<int> thread_counter;\n\nchar* code;\n\nvoid* thread(void*) {\n  printf(\"Generating code on thread\\n\");\n  code[0] = 0xB8;\n  code[1] = 0xAA;\n  code[2] = 0xBB;\n  code[3] = 0xCC;\n  code[4] = 0xDD;\n\n  code[5] = 0xC3;\n\n  auto fn = (int (*)())code;\n\n  fn();\n\n  ready_for_modification = true;\n  printf(\"Waiting for code to be modified\\n\");\n\n  while (!waiting_for_modification)\n    ;\n\n  while (fn() == 0xDDCCBBAA) {\n    thread_counter++;\n  }\n\n  thread_unblocked = true;\n  printf(\"Thread exiting\\n\");\n\n  return 0;\n}\n\nvoid RunIteration() {\n  printf(\"Starting Iteration\\n\");\n  code = (char*)mmap(0, 4096, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, 0, 0);\n  ready_for_modification = false;\n  waiting_for_modification = false;\n  thread_unblocked = false;\n  thread_counter = 0;\n\n  pthread_t tid;\n  pthread_create(&tid, 0, &thread, 0);\n\n  while (!ready_for_modification)\n    ;\n\n  printf(\"Modifying code from another thread\\n\");\n\n  code[3] = 0xFE;\n\n  waiting_for_modification = true;\n\n  auto counter = thread_counter.load();\n\n  printf(\"Waiting for thread to get unblocked\\n\");\n\n  bool once = false;\n  while (!thread_unblocked) {\n    if (thread_counter != counter) {\n      // depending on the patch timing, this might happen once\n      if (once) {\n        printf(\"Thread should have been patched to not modify counter here\\n\");\n        exit(1);\n      }\n      printf(\"Thread overshoot once, this is non fatal\\n\");\n      once = true;\n      counter = thread_counter.load();\n    }\n  }\n\n  printf(\"Iteration should finish now\\n\");\n  void* rv;\n  pthread_join(tid, &rv);\n  printf(\"Iteration done\\n\");\n  munmap(code, 4096);\n}\n\nTEST_CASE(\"SMC: One thread modifying another thread's code\") {\n  for (int i = 0; i < 100; i++) {\n    RunIteration();\n  }\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/smc/smc-shared-1.cpp",
    "content": "/*\n    tests shared / mirrored mappings\n*/\n\n#include \"smc-common.h\"\n\n#include <catch2/catch_test_macros.hpp>\n\nTEST_CASE(\"SMC: mmap_mremap\") {\n  auto code = (char*)mmap(0, 4096, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED | MAP_ANON, 0, 0);\n\n  auto code2 = (char*)mremap(code, 0, 4096, MREMAP_MAYMOVE);\n\n  CHECK(test_shared(code, code2, \"mmap_mremap\") == 0);\n}\n\nTEST_CASE(\"SMC: mmap_mremap_mid\") {\n  auto code = (char*)mmap(0, 8192, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED | MAP_ANON, 0, 0);\n\n  auto code2 = (char*)mremap(code + 4096, 0, 4096, MREMAP_MAYMOVE);\n\n  CHECK(test_shared(code + 4096, code2, \"mmap_mremap_mid\") == 0);\n}\n\nTEST_CASE(\"SMC: shmat\") {\n  auto shm = shmget(IPC_PRIVATE, 4096, IPC_CREAT | 0777);\n  auto code3 = (char*)shmat(shm, nullptr, 0);\n  auto code4 = (char*)shmat(shm, nullptr, SHM_EXEC);\n  CHECK(test_shared(code3, code4, \"shmat\") == 0);\n}\n\nTEST_CASE(\"SMC: shmat_mremap\") {\n  auto shm2 = shmget(IPC_PRIVATE, 4096, IPC_CREAT | 0777);\n  auto code5 = (char*)shmat(shm2, nullptr, SHM_EXEC);\n  auto code6 = (char*)mremap(code5, 0, 4096, MREMAP_MAYMOVE);\n\n  CHECK(test_shared(code5, code6, \"shmat_mremap\") == 0);\n}\n\nTEST_CASE(\"SMC: shmat_mremap_mid\") {\n  auto shm2 = shmget(IPC_PRIVATE, 8192, IPC_CREAT | 0777);\n  auto code5 = (char*)shmat(shm2, nullptr, SHM_EXEC);\n  auto code6 = (char*)mremap(code5 + 4096, 0, 4096, MREMAP_MAYMOVE);\n\n  CHECK(test_shared(code5 + 4096, code6, \"shmat_mremap_mid\") == 0);\n}\n\nTEST_CASE(\"SMC: mmap_mmap\") {\n  char file[] = \"smc-tests.XXXXXXXX\";\n  int fd = mkstemp(file);\n  unlink(file);\n  REQUIRE(ftruncate(fd, 4096) == 0);\n\n  auto code7 = (char*)mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);\n  auto code8 = (char*)mmap(0, 4096, PROT_READ | PROT_EXEC, MAP_SHARED, fd, 0);\n  CHECK(test_shared(code7, code8, \"mmap_mmap\") == 0);\n}\n\nTEST_CASE(\"SMC: mmap_mmap_fd_fd2\") {\n  char file[] = \"smc-tests.XXXXXXXX\";\n  int fd = mkstemp(file);\n  int fd2 = open(file, O_RDONLY);\n  unlink(file);\n  REQUIRE(ftruncate(fd, 4096) == 0);\n\n  auto code = (char*)mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);\n  auto code2 = (char*)mmap(0, 4096, PROT_READ | PROT_EXEC, MAP_SHARED, fd2, 0);\n  CHECK(test_shared(code, code2, \"mmap_mmap_fd_fd2\") == 0);\n}\n\nTEST_CASE(\"SMC: shm_open_mmap_mmap\") {\n  char file[] = \"smc-tests.XXXXXXXX\";\n  mktemp(file);\n  int fd = shm_open(file, O_RDWR | O_CREAT, 0700);\n  shm_unlink(file);\n  REQUIRE(ftruncate(fd, 4096) == 0);\n\n  auto code7 = (char*)mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);\n  auto code8 = (char*)mmap(0, 4096, PROT_READ | PROT_EXEC, MAP_SHARED, fd, 0);\n  CHECK(test_shared(code7, code8, \"shm_open_mmap_mmap\") == 0);\n}\n\nTEST_CASE(\"SMC: shm_open_mmap_mmap_fd_fd2\") {\n  char file[] = \"smc-tests.XXXXXXXX\";\n  mktemp(file);\n  int fd = shm_open(file, O_RDWR | O_CREAT, 0700);\n  int fd2 = shm_open(file, O_RDONLY, 0700);\n  shm_unlink(file);\n  REQUIRE(ftruncate(fd, 4096) == 0);\n\n  auto code7 = (char*)mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);\n  auto code8 = (char*)mmap(0, 4096, PROT_READ | PROT_EXEC, MAP_SHARED, fd2, 0);\n  CHECK(test_shared(code7, code8, \"shm_open_mmap_mmap_fd_fd2\") == 0);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/smc/smc-shared-2.cpp",
    "content": "\n/*\n    tests shared / mirrored mappings\n*/\n\n#include \"smc-common.h\"\n\n#include <catch2/catch_test_macros.hpp>\n\nTEST_CASE(\"SMC: mmap_fork\") {\n  auto code = (char*)mmap(0, 4096, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED | MAP_ANON, 0, 0);\n  CHECK(test_forked(code, code, \"mmap_fork\") == 0);\n}\n\nTEST_CASE(\"SMC: shmat_fork\") {\n  auto shm = shmget(IPC_PRIVATE, 4096, IPC_CREAT | 0777);\n  auto code = (char*)shmat(shm, nullptr, SHM_EXEC);\n  CHECK(test_forked(code, code, \"shmat_fork\") == 0);\n}\n\nTEST_CASE(\"SMC: fork_shmat_same_shmid\") {\n  auto shm = shmget(IPC_PRIVATE, 4096, IPC_CREAT | 0777);\n  auto code3 = (char*)shmat(shm, nullptr, 0);\n  // NOTE: Forking in a test will fork the entire Catch2 test runtime.\n  //       That's not great, but it doesn't seem to cause any issues other\n  //       than printing test results twice\n  if (fork() == 0) {\n    auto code4 = (char*)shmat(shm, nullptr, SHM_EXEC);\n    CHECK(test_shared(code3, code4, \"fork_shmat_same_shmid\") == 0);\n  } else {\n    int status;\n    wait(&status);\n    CHECK(WEXITSTATUS(status) == 0);\n  }\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/smc/smc-unexec-stack.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n#include <signal.h>\n#include <ucontext.h>\n#include <sys/mman.h>\n\nbool got_signal = false;\n\nstatic void sigsegv_handler(int signal, siginfo_t* siginfo, void* context) {\n  REQUIRE(siginfo->si_code == SEGV_ACCERR);\n  got_signal = true;\n  size_t page_size = sysconf(_SC_PAGESIZE);\n  void* fault_page = (void*)((uintptr_t)(siginfo->si_addr) & ~(page_size - 1));\n  REQUIRE(mprotect(fault_page, page_size, PROT_READ | PROT_WRITE | PROT_EXEC) == 0);\n}\n\nvoid register_signal_handler() {\n  struct sigaction act {};\n  act.sa_sigaction = sigsegv_handler;\n  act.sa_flags = SA_SIGINFO;\n  REQUIRE(sigaction(SIGSEGV, &act, nullptr) == 0);\n}\n\nTEST_CASE(\"smc-unexec-stack: PT_GNU_STACK == RW\") {\n  register_signal_handler();\n\n  // Try executing from stack\n  char stack[16384];\n  auto stack_code = (char*)(((uintptr_t)stack + 4095) & ~4095);\n  *stack_code = 0xC3; // ret instruction\n  ((void (*)())(stack_code))();\n\n  CHECK(got_signal == true);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/syscalls/execveat_memfd.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <cstdio>\n#include <unistd.h>\n#include <fcntl.h>\n#include <sys/mman.h>\n#include <sys/stat.h>\n#include <sys/syscall.h>\n\nstatic std::vector<char> LoadFile(const char* Path) {\n  int fd = open(Path, O_RDONLY);\n  REQUIRE(fd != -1);\n\n  struct stat st {};\n  REQUIRE(fstat(fd, &st) != -1);\n\n  std::vector<char> Result {};\n  Result.resize(st.st_size);\n\n  size_t DidRead {};\n  do {\n    auto Read = read(fd, Result.data() + DidRead, Result.size() - DidRead);\n\n    if (Read == -1) {\n      if (errno == EINTR || errno == EAGAIN) {\n        continue;\n      }\n      REQUIRE(errno != 0);\n    }\n\n    DidRead += Read;\n  } while (DidRead != st.st_size);\n\n  return Result;\n}\n\nTEST_CASE(\"execveat - memfd - MFD_CLOEXEC\") {\n  auto MapsFile = LoadFile(\"/usr/bin/true\");\n  REQUIRE(MapsFile.size() != 0);\n\n  int fd = memfd_create(\"Anonymous\", MFD_CLOEXEC | MFD_ALLOW_SEALING);\n  REQUIRE(fd != -1);\n\n  size_t Written {};\n  do {\n    auto Wrote = write(fd, MapsFile.data() + Written, MapsFile.size() - Written);\n    if (Wrote == -1) {\n      if (errno == EINTR || errno == EAGAIN) {\n        continue;\n      }\n      REQUIRE(errno != 0);\n    }\n    Written += Wrote;\n  } while (Written != MapsFile.size());\n\n  const char* argv[] = {\"tmp\", nullptr};\n  auto Res = ::syscall(SYS_execveat, fd, \"\", argv, nullptr, AT_EMPTY_PATH);\n\n  // Will only get here if execveat fails.\n  close(fd);\n  REQUIRE(Res == 0);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/syscalls/futimesat.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <fcntl.h>\n#include <unistd.h>\n#include <sys/stat.h>\n#include <sys/syscall.h>\n#include <sys/time.h>\n\nstruct compat_timeval {\n  long tv_sec;\n  long tv_usec;\n};\n\nuint64_t compat_futimesat(int dirfd, const char* pathname, const struct compat_timeval times[2]) {\n  return ::syscall(SYS_futimesat, dirfd, pathname, times);\n}\n\nTEST_CASE(\"futimesat - invalid - minimum\") {\n  compat_timeval tvs[2] {};\n  tvs[0].tv_sec = 0;\n  tvs[0].tv_usec = -1;\n\n  tvs[1].tv_sec = 0;\n  tvs[1].tv_usec = -1;\n\n  char file[] = \"futimesat-tests.XXXXXXXX\";\n  int fd = mkstemp(file);\n  REQUIRE(fd != -1);\n\n  REQUIRE(compat_futimesat(fd, nullptr, tvs) == -1);\n  CHECK(errno == EINVAL);\n  REQUIRE(unlinkat(AT_FDCWD, file, 0) != -1);\n  REQUIRE(close(fd) != -1);\n}\n\nTEST_CASE(\"futimesat - invalid - maximum\") {\n  compat_timeval tvs[2] {};\n  tvs[0].tv_sec = 0;\n  tvs[0].tv_usec = 1000000;\n\n  tvs[1].tv_sec = 0;\n  tvs[1].tv_usec = 1000000;\n\n  char file[] = \"futimesat-tests.XXXXXXXX\";\n  int fd = mkstemp(file);\n  REQUIRE(fd != -1);\n\n  REQUIRE(compat_futimesat(fd, nullptr, tvs) == -1);\n  CHECK(errno == EINVAL);\n  REQUIRE(unlinkat(AT_FDCWD, file, 0) != -1);\n  REQUIRE(close(fd) != -1);\n}\n\nTEST_CASE(\"futimesat - valid - null\") {\n  char file[] = \"futimesat-tests.XXXXXXXX\";\n  int fd = mkstemp(file);\n  REQUIRE(fd != -1);\n\n  timespec time {};\n  REQUIRE(clock_gettime(CLOCK_REALTIME, &time) == 0);\n\n  // Remove the nanoseconds to ensure consistent time setting.\n  time.tv_nsec = 0;\n\n  // A small sleep because CPU time and filesystem time might be slightly off.\n  sleep(1);\n\n  // Sets the time to \"Now\".\n  REQUIRE(compat_futimesat(fd, nullptr, nullptr) == 0);\n  REQUIRE(unlinkat(AT_FDCWD, file, 0) != -1);\n\n  // Get the stat information of the file.\n  struct stat sb {};\n  REQUIRE(fstat(fd, &sb) == 0);\n  CHECK(sb.st_atim.tv_sec >= time.tv_sec);\n  CHECK(sb.st_mtim.tv_sec >= time.tv_sec);\n\n  REQUIRE(close(fd) != -1);\n}\n\nTEST_CASE(\"futimesat - valid - future\") {\n  char file[] = \"futimesat-tests.XXXXXXXX\";\n  int fd = mkstemp(file);\n  REQUIRE(fd != -1);\n\n  timespec time {};\n  REQUIRE(clock_gettime(CLOCK_REALTIME, &time) == 0);\n\n  compat_timeval tvs[2] {};\n  tvs[0].tv_sec = time.tv_sec + 60;\n  tvs[0].tv_usec = 0;\n\n  tvs[1].tv_sec = time.tv_sec + 60;\n  tvs[1].tv_usec = 0;\n\n  // Sets the time to \"Now\".\n  REQUIRE(compat_futimesat(fd, nullptr, tvs) == 0);\n  REQUIRE(unlinkat(AT_FDCWD, file, 0) != -1);\n\n  // Get the stat information of the file.\n  struct stat sb {};\n  REQUIRE(fstat(fd, &sb) == 0);\n  CHECK(sb.st_atim.tv_sec == tvs[0].tv_sec);\n  CHECK(sb.st_mtim.tv_sec == tvs[1].tv_sec);\n\n  REQUIRE(close(fd) != -1);\n}\n\nTEST_CASE(\"futimesat - valid - past\") {\n  char file[] = \"futimesat-tests.XXXXXXXX\";\n  int fd = mkstemp(file);\n  REQUIRE(fd != -1);\n\n  timespec time {};\n  REQUIRE(clock_gettime(CLOCK_REALTIME, &time) == 0);\n\n  compat_timeval tvs[2] {};\n  tvs[0].tv_sec = time.tv_sec - 60;\n  tvs[0].tv_usec = 0;\n\n  tvs[1].tv_sec = time.tv_sec - 60;\n  tvs[1].tv_usec = 0;\n\n  // Sets the time to \"Now\".\n  REQUIRE(compat_futimesat(fd, nullptr, tvs) == 0);\n  REQUIRE(unlinkat(AT_FDCWD, file, 0) != -1);\n\n  // Get the stat information of the file.\n  struct stat sb {};\n  REQUIRE(fstat(fd, &sb) == 0);\n  CHECK(sb.st_atim.tv_sec == tvs[0].tv_sec);\n  CHECK(sb.st_mtim.tv_sec == tvs[1].tv_sec);\n\n  REQUIRE(close(fd) != -1);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/syscalls/personality.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <cstdint>\n#include <sys/personality.h>\n#include <sys/utsname.h>\n#include <string_view>\n\nconstexpr uint32_t QUERY_PERSONA = ~0U;\nTEST_CASE(\"default - query\") {\n  REQUIRE(::personality(0) != -1);\n\n  auto persona = ::personality(QUERY_PERSONA);\n  CHECK(persona == 0);\n}\n\nTEST_CASE(\"default - set all\") {\n  REQUIRE(::personality(-2U) != -1);\n  auto persona = ::personality(QUERY_PERSONA);\n  CHECK(persona == -2U);\n}\n\nTEST_CASE(\"default - check linux32\") {\n  REQUIRE(::personality(0) != -1);\n\n  struct utsname name {};\n  uname(&name);\n  CHECK(std::string_view(name.machine) == \"x86_64\");\n\n  CHECK(::personality(PER_LINUX32) != -1);\n  auto persona = ::personality(QUERY_PERSONA);\n  CHECK(persona == PER_LINUX32);\n\n  uname(&name);\n  CHECK(std::string_view(name.machine) == \"i686\");\n}\n\nTEST_CASE(\"default - check uname26\") {\n  REQUIRE(::personality(UNAME26) != -1);\n  auto persona = ::personality(QUERY_PERSONA);\n  CHECK(persona == UNAME26);\n\n  struct utsname name {};\n  uname(&name);\n  CHECK(std::string_view(name.release).starts_with(\"2.6.\"));\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/syscalls/syscall_exit.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <unistd.h>\n#include <sys/wait.h>\n#include <sys/syscall.h>\n\nTEST_CASE(\"fork - exit\") {\n  int child_pid = ::fork();\n  if (child_pid == 0) {\n    ::syscall(SYS_exit, 1);\n    // unreachable\n    std::terminate();\n  } else {\n    int status {};\n    int exited_child = ::waitpid(child_pid, &status, 0);\n    bool exited = WIFEXITED(status);\n    REQUIRE(WIFEXITED(status) == 1);\n    CHECK(WEXITSTATUS(status) == 1);\n  }\n}\n\nTEST_CASE(\"fork - signal\") {\n  int child_pid = ::fork();\n  if (child_pid == 0) {\n    ::syscall(SYS_tgkill, ::getpid(), ::gettid(), SIGKILL);\n    // unreachable\n    std::terminate();\n  } else {\n    int status {};\n    int exited_child = ::waitpid(child_pid, &status, 0);\n    bool exited = WIFEXITED(status);\n    REQUIRE(WIFSIGNALED(status) == 1);\n    CHECK(WTERMSIG(status) == SIGKILL);\n  }\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/syscalls/syscall_sigaltstack.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <unistd.h>\n#include <sys/wait.h>\n#include <sys/syscall.h>\n\nTEST_CASE(\"sysaltstack - minimum\") {\n  char test[4096];\n  constexpr size_t EXPECTED_MIN = 2048;\n\n  stack_t stack {\n    .ss_sp = test,\n    .ss_flags = 0,\n    .ss_size = 0,\n  };\n  for (size_t i = 1; i < sizeof(test); ++i) {\n    stack.ss_size = i;\n    CHECK(sigaltstack(&stack, nullptr) == (i < EXPECTED_MIN ? -1 : 0));\n  }\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/syscalls/syscalls_efault.cpp",
    "content": "#include <catch2/catch_test_macros.hpp>\n\n#include <cstdint>\n#include <unistd.h>\n#include <sys/mman.h>\n#include <sys/syscall.h>\n#include <poll.h>\n#include <signal.h>\n\nTEST_CASE(\"poll\") {\n  // poll can return EFAULT if first argument is pointed to invalid pointer.\n  // Using mmap specifically for allocating with PROT_NONE.\n  struct pollfd* invalid_fds =\n    reinterpret_cast<struct pollfd*>(mmap(nullptr, sysconf(_SC_PAGESIZE), PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));\n  auto ret = ::syscall(SYS_poll, invalid_fds, 1, 0);\n  REQUIRE(ret == -1);\n  CHECK(errno == EFAULT);\n}\n\nTEST_CASE(\"ppoll\") {\n  // ppoll can return EFAULT for arguments 1, 3, 4.\n  // Using mmap specifically for allocating with PROT_NONE.\n  struct pollfd* invalid_fds =\n    reinterpret_cast<struct pollfd*>(mmap(nullptr, sysconf(_SC_PAGESIZE), PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));\n  struct timespec* invalid_timespec =\n    reinterpret_cast<struct timespec*>(mmap(nullptr, sysconf(_SC_PAGESIZE), PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));\n  sigset_t* invalid_sigset = reinterpret_cast<sigset_t*>(mmap(nullptr, sysconf(_SC_PAGESIZE), PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));\n\n  SECTION(\"invalid fds\") {\n    auto ret = ::syscall(SYS_ppoll, invalid_fds, 1, 0, nullptr, nullptr);\n    REQUIRE(ret == -1);\n    CHECK(errno == EFAULT);\n  }\n\n  SECTION(\"invalid timespec\") {\n    struct pollfd valid_fds {\n      .fd = STDOUT_FILENO,\n      .events = 0,\n      .revents = 0,\n    };\n    auto ret = ::syscall(SYS_ppoll, &valid_fds, 1, invalid_timespec, nullptr, sizeof(uint64_t));\n    REQUIRE(ret == -1);\n    CHECK(errno == EFAULT);\n  }\n\n  SECTION(\"invalid sigset\") {\n    struct pollfd valid_fds {\n      .fd = STDOUT_FILENO,\n      .events = 0,\n      .revents = 0,\n    };\n\n    struct timespec valid_ts {};\n    auto ret = ::syscall(SYS_ppoll, &valid_fds, 1, &valid_ts, invalid_sigset, sizeof(uint64_t));\n    REQUIRE(ret == -1);\n    CHECK(errno == EFAULT);\n  }\n\n  SECTION(\"valid configuration\") {\n    struct pollfd valid_fds {\n      .fd = STDOUT_FILENO,\n      .events = 0,\n      .revents = 0,\n    };\n\n    struct timespec valid_ts {};\n    sigset_t valid_sigset {};\n    sigemptyset(&valid_sigset);\n    auto ret = ::syscall(SYS_ppoll, &valid_fds, 1, &valid_ts, &valid_sigset, sizeof(uint64_t));\n    REQUIRE(ret == 0);\n  }\n\n  SECTION(\"invalid timespec write-back\") {\n    struct pollfd valid_fds {\n      .fd = STDOUT_FILENO,\n      .events = 0,\n      .revents = 0,\n    };\n\n    // Kernel will read timespec, but it then can't write the result back.\n    mprotect(invalid_timespec, sysconf(_SC_PAGESIZE), PROT_READ | PROT_WRITE);\n    invalid_timespec->tv_sec = 1;\n    mprotect(invalid_timespec, sysconf(_SC_PAGESIZE), PROT_READ);\n\n    sigset_t valid_sigset {};\n    sigemptyset(&valid_sigset);\n    auto ret = ::syscall(SYS_ppoll, &valid_fds, 1, invalid_timespec, &valid_sigset, sizeof(uint64_t));\n    REQUIRE(ret == 0);\n    CHECK(invalid_timespec->tv_sec == 1);\n  }\n}\n\nstruct timespec64 {\n  uint64_t tv_sec, tv_nsec;\n};\n\nstatic const timespec64 readonly_ts {\n  .tv_sec = 1,\n  .tv_nsec = 0,\n};\n\n\nTEST_CASE(\"ppoll_64\") {\n#ifndef SYS_ppoll_time64\n#define SYS_ppoll_time64 SYS_ppoll\n#endif\n  // ppoll can return EFAULT for arguments 1, 3, 4\n  // Using mmap specifically for allocating with PROT_NONE.\n  struct pollfd* invalid_fds =\n    reinterpret_cast<struct pollfd*>(mmap(nullptr, sysconf(_SC_PAGESIZE), PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));\n  timespec64* invalid_timespec =\n    reinterpret_cast<timespec64*>(mmap(nullptr, sysconf(_SC_PAGESIZE), PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));\n  sigset_t* invalid_sigset = reinterpret_cast<sigset_t*>(mmap(nullptr, sysconf(_SC_PAGESIZE), PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));\n\n  SECTION(\"invalid fds\") {\n    auto ret = ::syscall(SYS_ppoll_time64, invalid_fds, 1, 0, nullptr, nullptr);\n    REQUIRE(ret == -1);\n    CHECK(errno == EFAULT);\n  }\n\n  SECTION(\"invalid timespec\") {\n    struct pollfd valid_fds {\n      .fd = STDOUT_FILENO,\n      .events = 0,\n      .revents = 0,\n    };\n    auto ret = ::syscall(SYS_ppoll_time64, &valid_fds, 1, invalid_timespec, nullptr, sizeof(uint64_t));\n    REQUIRE(ret == -1);\n    CHECK(errno == EFAULT);\n  }\n\n  SECTION(\"invalid sigset\") {\n    struct pollfd valid_fds {\n      .fd = STDOUT_FILENO,\n      .events = 0,\n      .revents = 0,\n    };\n\n    timespec64 valid_ts {};\n    auto ret = ::syscall(SYS_ppoll_time64, &valid_fds, 1, &valid_ts, invalid_sigset, sizeof(uint64_t));\n    REQUIRE(ret == -1);\n    CHECK(errno == EFAULT);\n  }\n\n  SECTION(\"valid configuration\") {\n    struct pollfd valid_fds {\n      .fd = STDOUT_FILENO,\n      .events = 0,\n      .revents = 0,\n    };\n\n    timespec64 valid_ts {};\n    sigset_t valid_sigset {};\n    sigemptyset(&valid_sigset);\n    auto ret = ::syscall(SYS_ppoll_time64, &valid_fds, 1, &valid_ts, &valid_sigset, sizeof(uint64_t));\n    REQUIRE(ret == 0);\n  }\n\n  SECTION(\"invalid timespec write-back\") {\n    struct pollfd valid_fds {\n      .fd = STDOUT_FILENO,\n      .events = 0,\n      .revents = 0,\n    };\n\n    // Kernel will read timespec, but it then can't write the result back.\n    sigset_t valid_sigset {};\n    sigemptyset(&valid_sigset);\n    auto ret = ::syscall(SYS_ppoll_time64, &valid_fds, 1, &readonly_ts, &valid_sigset, sizeof(uint64_t));\n    REQUIRE(ret == 0);\n    CHECK(readonly_ts.tv_sec == 1);\n  }\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/thunks/thunk_testlib.cpp",
    "content": "#define GUEST_THUNK_LIBRARY\n\n#include <dlfcn.h>\n\n#include <stdexcept>\n\n#include <catch2/catch_test_macros.hpp>\n\n#include \"../../../../ThunkLibs/libfex_thunk_test/api.h\"\n\nstruct Fixture {\n  void* lib = []() {\n    auto ret = dlopen(\"libfex_thunk_test.so\", RTLD_LAZY);\n    if (!ret) {\n      throw std::runtime_error(\"Failed to open lib\\n\");\n    }\n    return ret;\n  }();\n\n#define GET_SYMBOL(name) decltype(&::name) name = (decltype(name))dlsym(lib, #name)\n  GET_SYMBOL(GetDoubledValue);\n\n  GET_SYMBOL(MakeOpaqueType);\n  GET_SYMBOL(ReadOpaqueTypeData);\n  GET_SYMBOL(DestroyOpaqueType);\n\n  GET_SYMBOL(MakeUnionType);\n  GET_SYMBOL(GetUnionTypeA);\n\n  GET_SYMBOL(MakeReorderingType);\n  GET_SYMBOL(GetReorderingTypeMember);\n  GET_SYMBOL(GetReorderingTypeMemberWithoutRepacking);\n  GET_SYMBOL(ModifyReorderingTypeMembers);\n  GET_SYMBOL(QueryOffsetOf);\n\n  GET_SYMBOL(RanCustomRepack);\n\n  GET_SYMBOL(FunctionWithDivergentSignature);\n\n  GET_SYMBOL(ReadData1);\n};\n\nTEST_CASE_METHOD(Fixture, \"Trivial\") {\n  CHECK(GetDoubledValue(10) == 20);\n}\n\nTEST_CASE_METHOD(Fixture, \"Opaque data types\") {\n  {\n    auto data = MakeOpaqueType(0x1234);\n    CHECK(ReadOpaqueTypeData(data) == 0x1234);\n    DestroyOpaqueType(data);\n  }\n\n  {\n    auto data = MakeUnionType(0x1, 0x2, 0x3, 0x4);\n    CHECK(GetUnionTypeA(&data) == 0x04030201);\n  }\n}\n\nTEST_CASE_METHOD(Fixture, \"Automatic struct repacking\") {\n  {\n    // Test repacking of return values\n    ReorderingType test_struct = MakeReorderingType(0x1234, 0x5678);\n    REQUIRE(test_struct.a == 0x1234);\n    REQUIRE(test_struct.b == 0x5678);\n\n    // Test offsets of the host-side guest_layout wrapper match the guest-side ones\n    CHECK(QueryOffsetOf(&test_struct, 0) == offsetof(ReorderingType, a));\n    CHECK(QueryOffsetOf(&test_struct, 1) == offsetof(ReorderingType, b));\n\n    // Test repacking of input pointers\n    CHECK(GetReorderingTypeMember(&test_struct, 0) == 0x1234);\n    CHECK(GetReorderingTypeMember(&test_struct, 1) == 0x5678);\n\n    // Test that we can force reinterpreting the data in guest layout as host layout\n    CHECK(GetReorderingTypeMemberWithoutRepacking(&test_struct, 0) == 0x5678);\n    CHECK(GetReorderingTypeMemberWithoutRepacking(&test_struct, 1) == 0x1234);\n\n    // Test repacking of output pointers\n    ModifyReorderingTypeMembers(&test_struct);\n    CHECK(GetReorderingTypeMember(&test_struct, 0) == 0x1235);\n    CHECK(GetReorderingTypeMember(&test_struct, 1) == 0x567a);\n  };\n}\n\nTEST_CASE_METHOD(Fixture, \"Assisted struct repacking\") {\n  CustomRepackedType data {};\n  CHECK(RanCustomRepack(&data) == 1);\n}\n\nTEST_CASE_METHOD(Fixture, \"Function signature with differing parameter sizes\") {\n  CHECK(FunctionWithDivergentSignature(DivType {1}, DivType {2}, DivType {3}, DivType {4}) == 0x01020304);\n}\n\n// Test Vulkan-like linked lists\nTEST_CASE_METHOD(Fixture, \"Assisted repacking of linked lists\") {\n  const int s2_data = 0xcddeeff;\n  TestStruct2 s2 {\n    .Next = nullptr,\n    .Type = StructType::Struct2,\n    .Data1 = s2_data,\n  };\n\n  const int s1_data = 0x1234567;\n  TestStruct1 s1 {\n    .Next = &s2,\n    .Type = StructType::Struct1,\n    .Data2 = 0xab,\n    .Data1 = s1_data,\n  };\n\n  CHECK(ReadData1(&s1, 0) == s1_data);\n  CHECK(ReadData1(&s1, 1) == s2_data);\n}\n"
  },
  {
    "path": "unittests/FEXLinuxTests/tests/vdso/vdso_test.cpp",
    "content": "#include <map>\n#include <sys/auxv.h>\n#include <string>\n#include <unistd.h>\n#include <fstream>\n#include <elf.h>\n#include <dlfcn.h>\n#include <cstdint>\n#include <sys/time.h>\n#include <time.h>\n#include <stdio.h>\n\n#include <catch2/catch_test_macros.hpp>\n\nusing time_type = int (*)(time_t* tloc);\ntime_type time_vdso = (time_type)::time;\n\nusing gettimeofday_type = int (*)(struct timeval* tv, struct timezone* tz);\ngettimeofday_type gettimeofday_vdso = (gettimeofday_type)::gettimeofday;\n\nusing gettime_type = int (*)(clockid_t, struct timespec*);\ngettime_type gettime_vdso = (gettime_type)::clock_gettime;\n\nusing getres_type = int (*)(clockid_t, struct timespec*);\ngetres_type getres_vdso = (getres_type)::clock_getres;\n\nusing getcpu_type = int (*)(uint32_t* cpu, uint32_t* node);\ngetcpu_type getcpu_vdso = (getcpu_type)::getcpu;\n\n#if __SIZEOF_POINTER__ == 4\nstruct timespec64 {\n  int64_t tv_sec;\n  int64_t tv_nsec;\n};\n\nusing gettime64_type = int (*)(clockid_t, struct timespec64*);\ngettime64_type gettime64_vdso = nullptr;\n#endif\n\nclass VDSOParser {\n#if __SIZEOF_POINTER__ == 8\n  using ELFHeader = Elf64_Ehdr;\n  using ELFSectionHeader = Elf64_Shdr;\n  using ELFSymbol = Elf64_Sym;\n#else\n  using ELFHeader = Elf32_Ehdr;\n  using ELFSectionHeader = Elf32_Shdr;\n  using ELFSymbol = Elf32_Sym;\n\n#endif\npublic:\n  VDSOParser(uint8_t* Ptr) {\n    ELFHeader* Header = (ELFHeader*)Ptr;\n    uint64_t SectionHeaderOffset = Header->e_shoff;\n    uint16_t SectionHeaderCount = Header->e_shnum;\n    ELFSectionHeader* SHdrs = (ELFSectionHeader*)(&Ptr[SectionHeaderOffset]);\n\n    const ELFSectionHeader* DynamicSymHeader {nullptr};\n    const ELFSectionHeader* DynamicStringHeader {nullptr};\n    for (size_t i = 0; i < SectionHeaderCount; ++i) {\n      if (SHdrs[i].sh_type == SHT_STRTAB && SHdrs[i].sh_addr) {\n        DynamicStringHeader = &SHdrs[i];\n      }\n      if (SHdrs[i].sh_type == SHT_DYNSYM) {\n        DynamicSymHeader = &SHdrs[i];\n      }\n    }\n\n    size_t NumDynSymSymbols = DynamicSymHeader->sh_size / DynamicSymHeader->sh_entsize;\n    const char* DynStrTab = reinterpret_cast<const char*>(&Ptr[DynamicStringHeader->sh_offset]);\n\n    for (size_t i = 0; i < NumDynSymSymbols; ++i) {\n      uint64_t offset = DynamicSymHeader->sh_offset + i * DynamicSymHeader->sh_entsize;\n      const ELFSymbol* Symbol = reinterpret_cast<const ELFSymbol*>(&Ptr[offset]);\n\n      const char* Name = &DynStrTab[Symbol->st_name];\n      if (Symbol->st_info != 0) {\n        uint8_t* SymbolPtr = Symbol->st_value + Ptr;\n        VDSOSymbols[Name] = SymbolPtr;\n        printf(\"Found VDSO symbol '%s' at %p\\n\", Name, SymbolPtr);\n      }\n    }\n  }\n\n  uint8_t* GetVDSOSymbol(const char* String) {\n    auto it = VDSOSymbols.find(String);\n    if (it != VDSOSymbols.end()) {\n      return it->second;\n    }\n\n    return nullptr;\n  }\n\n  std::map<std::string, uint8_t*> VDSOSymbols;\n};\n\nstatic void LoadVDSO() {\n  uint64_t Begin = ::getauxval(AT_SYSINFO_EHDR);\n  if (!Begin) {\n    printf(\"No VDSO\\n\");\n    return;\n  }\n\n  VDSOParser VDSO((uint8_t*)Begin);\n  auto it = VDSO.GetVDSOSymbol(\"__vdso_time\");\n  if (it) {\n    time_vdso = reinterpret_cast<time_type>(it);\n  }\n\n  it = VDSO.GetVDSOSymbol(\"__vdso_gettimeofday\");\n  if (it) {\n    gettimeofday_vdso = reinterpret_cast<gettimeofday_type>(it);\n  }\n\n  it = VDSO.GetVDSOSymbol(\"__vdso_clock_gettime\");\n  if (it) {\n    gettime_vdso = reinterpret_cast<gettime_type>(it);\n  }\n\n  it = VDSO.GetVDSOSymbol(\"__vdso_clock_getres\");\n  if (it) {\n    getres_vdso = reinterpret_cast<getres_type>(it);\n  }\n\n  it = VDSO.GetVDSOSymbol(\"__vdso_getcpu\");\n  if (it) {\n    getcpu_vdso = reinterpret_cast<getcpu_type>(it);\n  }\n\n#if __SIZEOF_POINTER__ == 4\n  it = VDSO.GetVDSOSymbol(\"__vdso_clock_gettime64\");\n  if (it) {\n    gettime64_vdso = reinterpret_cast<gettime64_type>(it);\n  }\n#endif\n}\n\n\nTEST_CASE(\"VDSO\") {\n  LoadVDSO();\n  REQUIRE(time_vdso != 0);\n  REQUIRE(gettimeofday_vdso != 0);\n  REQUIRE(gettime_vdso != 0);\n  REQUIRE(getres_vdso != 0);\n  REQUIRE(getcpu_vdso != 0);\n\n  // There are few strict guarantees on the return values of these functions,\n  // so instead we make some educated guesses to check for valid outputs below\n\n  time_t tloc {};\n  {\n    int result = time_vdso(&tloc);\n    printf(\"time\\n\");\n    CHECK(result != -1);\n    printf(\"\\tResult: %d\\n\", result);\n    printf(\"\\tTime_t: 0x%lx\\n\", tloc);\n    CHECK(tloc > 946684800); // Ensure it's later than year 2000\n  }\n\n  {\n    timeval tv {};\n    int result = gettimeofday_vdso(&tv, nullptr);\n    printf(\"gettimeofday\\n\");\n    CHECK(result == 0);\n    printf(\"\\tTime: 0x%lx 0x%lx\\n\", tv.tv_sec, tv.tv_usec);\n    // Ensure gettimeofday and time results are consistent\n    CHECK(tv.tv_sec >= tloc);\n    CHECK(tv.tv_sec <= tloc + 1);\n  }\n\n  {\n    timespec ts {};\n    int result = gettime_vdso(CLOCK_MONOTONIC, &ts);\n    printf(\"clock_gettime\\n\");\n    CHECK(result == 0);\n    printf(\"\\tTime: 0x%lx 0x%lx\\n\", ts.tv_sec, ts.tv_nsec);\n  }\n\n  {\n    timespec ts {};\n    int result = getres_vdso(CLOCK_MONOTONIC, &ts);\n    printf(\"clock_getres\\n\");\n    CHECK(result == 0);\n    printf(\"\\tTime: 0x%lx 0x%lx\\n\", ts.tv_sec, ts.tv_nsec);\n    CHECK(ts.tv_sec == 0);\n    CHECK(ts.tv_nsec > 0);\n  }\n\n  {\n    uint32_t cpu, node;\n    int result = getcpu_vdso(&cpu, &node);\n    printf(\"getcpu\\n\");\n    CHECK(result == 0);\n    printf(\"\\tCPU: 0x%x\\n\", cpu);\n    printf(\"\\tNode: 0x%x\\n\", node);\n  }\n\n#if __SIZEOF_POINTER__ == 4\n  if (gettime64_vdso) {\n    timespec64 ts {};\n    int result = gettime64_vdso(CLOCK_MONOTONIC, &ts);\n    printf(\"clock_gettime64\\n\");\n    CHECK(result == 0);\n    printf(\"\\tTime: 0x%llx 0x%llx\\n\", ts.tv_sec, ts.tv_nsec);\n  }\n#endif\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AFP/H0F3A.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"AFP\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\"\n    ]\n  },\n  \"Instructions\": {\n    \"roundss xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Nearest rounding\",\n        \"0x66 0x0f 0x3a 0x0a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintn s16, s17\"\n      ]\n    },\n    \"roundss xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"0x66 0x0f 0x3a 0x0a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintm s16, s17\"\n      ]\n    },\n    \"roundss xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"0x66 0x0f 0x3a 0x0a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintp s16, s17\"\n      ]\n    },\n    \"roundss xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"0x66 0x0f 0x3a 0x0a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintz s16, s17\"\n      ]\n    },\n    \"roundss xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"host rounding mode rounding\",\n        \"0x66 0x0f 0x3a 0x0a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti s16, s17\"\n      ]\n    },\n    \"roundsd xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Nearest rounding\",\n        \"0x66 0x0f 0x3a 0x0b\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintn d16, d17\"\n      ]\n    },\n    \"roundsd xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"0x66 0x0f 0x3a 0x0b\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintm d16, d17\"\n      ]\n    },\n    \"roundsd xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"0x66 0x0f 0x3a 0x0b\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintp d16, d17\"\n      ]\n    },\n    \"roundsd xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"0x66 0x0f 0x3a 0x0b\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintz d16, d17\"\n      ]\n    },\n    \"roundsd xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"host rounding mode rounding\",\n        \"0x66 0x0f 0x3a 0x0b\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti d16, d17\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AFP/SVE256/Secondary.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ],\n    \"DisabledHostFeatures\": []\n  },\n  \"Instructions\": {\n    \"cvtpi2ps xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"scvtf v0.2s, v2.2s\",\n        \"ptrue p0.d, vl1\",\n        \"mov z16.d, p0/m, z0.d\"\n      ]\n    },\n    \"cvtpi2ps xmm0, mm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"scvtf v0.2s, v2.2s\",\n        \"ptrue p0.d, vl1\",\n        \"mov z16.d, p0/m, z0.d\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AFP/SVE256/Secondary_REP.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"RPRES\"\n    ]\n  },\n  \"Instructions\": {\n    \"cvtsi2ss xmm0, eax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"scvtf s16, w4\"\n      ]\n    },\n    \"cvtsi2ss xmm0, dword [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf3 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"scvtf s16, s2\"\n      ]\n    },\n    \"cvtsi2ss xmm0, qword [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf3 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x4]\",\n        \"scvtf s16, x20\"\n      ]\n    },\n    \"sqrtss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x51\",\n      \"ExpectedArm64ASM\": [\n        \"fsqrt s16, s17\"\n      ]\n    },\n    \"rsqrtss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"FEAT_FPRES could make this more optimal\",\n        \"0xf3 0x0f 0x52\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov s0, #0x70 (1.0000)\",\n        \"fsqrt s1, s17\",\n        \"fdiv s0, s0, s1\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"rcpss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"FEAT_FPRES could make this more optimal\",\n        \"0xf3 0x0f 0x53\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov s0, #0x70 (1.0000)\",\n        \"fdiv s0, s0, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"addss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x58\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fadd s16, s16, s17\"\n      ]\n    },\n    \"mulss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x59\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul s16, s16, s17\"\n      ]\n    },\n    \"cvtss2sd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x5a\",\n      \"ExpectedArm64ASM\": [\n        \"fcvt d16, s17\"\n      ]\n    },\n    \"cvtss2sd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf3 0x0f 0x5a\",\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d16, s2\"\n      ]\n    },\n    \"subss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x5c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsub s16, s16, s17\"\n      ]\n    },\n    \"minss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x5d\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmin s16, s16, s17\"\n      ]\n    },\n    \"divss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x5e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fdiv s16, s16, s17\"\n      ]\n    },\n    \"maxss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x5f\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmax s16, s16, s17\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq s16, s17, s16\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt s16, s17, s16\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge s16, s17, s16\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge s0, s16, s17\",\n        \"fcmgt s1, s17, s16\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mvn v0.8b, v0.8b\",\n        \"ptrue p0.s, vl1\",\n        \"mov z16.s, p0/m, z0.s\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 4\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq s0, s17, s16\",\n        \"mvn v0.8b, v0.8b\",\n        \"ptrue p0.s, vl1\",\n        \"mov z16.s, p0/m, z0.s\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 5\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt s2, s17, s16\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.s[0], v2.s[0]\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 6\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge s2, s17, s16\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.s[0], v2.s[0]\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 7\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge s0, s16, s17\",\n        \"fcmgt s1, s17, s16\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"ptrue p0.s, vl1\",\n        \"mov z16.s, p0/m, z0.s\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AFP/SVE256/Secondary_REPNE.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ],\n    \"DisabledHostFeatures\": []\n  },\n  \"Instructions\": {\n    \"cvtsi2sd xmm0, eax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"scvtf d16, w4\"\n      ]\n    },\n    \"cvtsi2sd xmm0, dword [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d16, w20\"\n      ]\n    },\n    \"cvtsi2sd xmm0, rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"scvtf d16, x4\"\n      ]\n    },\n    \"cvtsi2sd xmm0, qword [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"scvtf d16, d2\"\n      ]\n    },\n    \"sqrtsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x51\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsqrt d16, d17\"\n      ]\n    },\n    \"addsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x58\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fadd d16, d16, d17\"\n      ]\n    },\n    \"mulsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x59\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul d16, d16, d17\"\n      ]\n    },\n    \"cvtsd2ss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvt s16, d17\"\n      ]\n    },\n    \"cvtsd2ss xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"fcvt s16, d2\"\n      ]\n    },\n    \"subsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsub d16, d16, d17\"\n      ]\n    },\n    \"minsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5d\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmin d16, d16, d17\"\n      ]\n    },\n    \"divsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fdiv d16, d16, d17\"\n      ]\n    },\n    \"maxsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5f\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmax d16, d16, d17\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq d16, d17, d16\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt d16, d17, d16\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge d16, d17, d16\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge d0, d16, d17\",\n        \"fcmgt d1, d17, d16\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mvn v0.8b, v0.8b\",\n        \"ptrue p0.d, vl1\",\n        \"mov z16.d, p0/m, z0.d\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 4\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq d0, d17, d16\",\n        \"mvn v0.8b, v0.8b\",\n        \"ptrue p0.d, vl1\",\n        \"mov z16.d, p0/m, z0.d\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 5\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt d2, d17, d16\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.d[0], v2.d[0]\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 6\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge d2, d17, d16\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.d[0], v2.d[0]\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 7\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge d0, d16, d17\",\n        \"fcmgt d1, d17, d16\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"ptrue p0.d, vl1\",\n        \"mov z16.d, p0/m, z0.d\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AFP/Secondary.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"AFP\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\"\n    ]\n  },\n  \"Instructions\": {\n    \"cvtpi2ps xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"scvtf v0.2s, v2.2s\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"cvtpi2ps xmm0, mm0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"scvtf v0.2s, v2.2s\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AFP/Secondary_REP.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"AFP\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\"\n    ]\n  },\n  \"Instructions\": {\n    \"cvtsi2ss xmm0, eax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"scvtf s16, w4\"\n      ]\n    },\n    \"cvtsi2ss xmm0, dword [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf3 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"scvtf s16, s2\"\n      ]\n    },\n    \"cvtsi2ss xmm0, qword [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf3 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x4]\",\n        \"scvtf s16, x20\"\n      ]\n    },\n    \"sqrtss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x51\",\n      \"ExpectedArm64ASM\": [\n        \"fsqrt s16, s17\"\n      ]\n    },\n    \"rsqrtss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"FEAT_FPRES could make this more optimal\",\n        \"0xf3 0x0f 0x52\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov s0, #0x70 (1.0000)\",\n        \"fsqrt s1, s17\",\n        \"fdiv s0, s0, s1\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"rcpss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"FEAT_FPRES could make this more optimal\",\n        \"0xf3 0x0f 0x53\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov s0, #0x70 (1.0000)\",\n        \"fdiv s0, s0, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"addss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x58\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fadd s16, s16, s17\"\n      ]\n    },\n    \"mulss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x59\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul s16, s16, s17\"\n      ]\n    },\n    \"cvtss2sd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x5a\",\n      \"ExpectedArm64ASM\": [\n        \"fcvt d16, s17\"\n      ]\n    },\n    \"cvtss2sd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf3 0x0f 0x5a\",\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d16, s2\"\n      ]\n    },\n    \"subss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x5c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsub s16, s16, s17\"\n      ]\n    },\n    \"minss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x5d\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmin s16, s16, s17\"\n      ]\n    },\n    \"divss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x5e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fdiv s16, s16, s17\"\n      ]\n    },\n    \"maxss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x5f\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmax s16, s16, s17\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq s16, s17, s16\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt s16, s17, s16\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge s16, s17, s16\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 3\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge s0, s16, s17\",\n        \"fcmgt s1, s17, s16\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 4\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq s0, s17, s16\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 5\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt s2, s17, s16\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.s[0], v2.s[0]\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 6\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge s2, s17, s16\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.s[0], v2.s[0]\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 7\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge s0, s16, s17\",\n        \"fcmgt s1, s17, s16\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AFP/Secondary_REPNE.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"AFP\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\"\n    ]\n  },\n  \"Instructions\": {\n    \"cvtsi2sd xmm0, eax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"scvtf d16, w4\"\n      ]\n    },\n    \"cvtsi2sd xmm0, dword [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d16, w20\"\n      ]\n    },\n    \"cvtsi2sd xmm0, rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"scvtf d16, x4\"\n      ]\n    },\n    \"cvtsi2sd xmm0, qword [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"scvtf d16, d2\"\n      ]\n    },\n    \"sqrtsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x51\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsqrt d16, d17\"\n      ]\n    },\n    \"addsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x58\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fadd d16, d16, d17\"\n      ]\n    },\n    \"mulsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x59\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul d16, d16, d17\"\n      ]\n    },\n    \"cvtsd2ss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvt s16, d17\"\n      ]\n    },\n    \"cvtsd2ss xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"fcvt s16, d2\"\n      ]\n    },\n    \"subsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsub d16, d16, d17\"\n      ]\n    },\n    \"minsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5d\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmin d16, d16, d17\"\n      ]\n    },\n    \"divsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fdiv d16, d16, d17\"\n      ]\n    },\n    \"maxsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5f\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmax d16, d16, d17\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq d16, d17, d16\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt d16, d17, d16\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge d16, d17, d16\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 3\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge d0, d16, d17\",\n        \"fcmgt d1, d17, d16\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 4\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq d0, d17, d16\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 5\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt d2, d17, d16\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.d[0], v2.d[0]\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 6\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge d2, d17, d16\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.d[0], v2.d[0]\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 7\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge d0, d16, d17\",\n        \"fcmgt d1, d17, d16\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AFP/VEX_map1.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"RPRES\"\n    ]\n  },\n  \"Instructions\": {\n    \"vsqrtss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x51 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fsqrt s16, s18\"\n      ]\n    },\n    \"vsqrtsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x51 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fsqrt d16, d18\"\n      ]\n    },\n    \"vrsqrtss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"FEAT_FPRES could make this more optimal\",\n        \"Map 1 0b10 0x52 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmov s0, #0x70 (1.0000)\",\n        \"fsqrt s1, s18\",\n        \"fdiv s0, s0, s1\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vrcpss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"FEAT_FPRES could make this more optimal\",\n        \"Map 1 0b10 0x53 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmov s0, #0x70 (1.0000)\",\n        \"fdiv s0, s0, s18\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x00\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmeq s16, s18, s17\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x01\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmgt s16, s18, s17\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x02\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge s16, s18, s17\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x03\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge s0, s17, s18\",\n        \"fcmgt s1, s18, s17\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x04\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmeq s0, s18, s17\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x05\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt s2, s18, s17\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[0], v2.s[0]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x06\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge s2, s18, s17\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[0], v2.s[0]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x07\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge s0, s17, s18\",\n        \"fcmgt s1, s18, s17\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x00\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmeq d16, d18, d17\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x01\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmgt d16, d18, d17\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x02\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge d16, d18, d17\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x03\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge d0, d17, d18\",\n        \"fcmgt d1, d18, d17\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x04\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmeq d0, d18, d17\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x05\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt d2, d18, d17\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[0], v2.d[0]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x06\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge d2, d18, d17\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[0], v2.d[0]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x07\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge d0, d17, d18\",\n        \"fcmgt d1, d18, d17\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vcvtsi2ss xmm0, xmm1, eax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"scvtf s16, w4\"\n      ]\n    },\n    \"vcvtsi2ss xmm0, xmm1, rax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"scvtf s16, x4\"\n      ]\n    },\n    \"vcvtsi2sd xmm0, xmm1, eax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"scvtf d16, w4\"\n      ]\n    },\n    \"vcvtsi2sd xmm0, xmm1, rax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"scvtf d16, x4\"\n      ]\n    },\n    \"vmulss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x59 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmul s16, s17, s18\"\n      ]\n    },\n    \"vmulsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x59 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmul d16, d17, d18\"\n      ]\n    },\n    \"vcvtss2sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcvt d16, s18\"\n      ]\n    },\n    \"vcvtsd2ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcvt s16, d18\"\n      ]\n    },\n    \"vsubss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x5c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fsub s16, s17, s18\"\n      ]\n    },\n    \"vsubsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x5c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fsub d16, d17, d18\"\n      ]\n    },\n    \"vminss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x5d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmin s16, s17, s18\"\n      ]\n    },\n    \"vminsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x5d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmin d16, d17, d18\"\n      ]\n    },\n    \"vdivss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x5e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fdiv s16, s17, s18\"\n      ]\n    },\n    \"vdivsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x5e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fdiv d16, d17, d18\"\n      ]\n    },\n    \"vmaxss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x5f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmax s16, s17, s18\"\n      ]\n    },\n    \"vmaxsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x5f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmax d16, d17, d18\"\n      ]\n    },\n    \"vminps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x5d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmin v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vminps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x5d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt p0.s, p7/z, z18.s, z17.s\",\n        \"not p0.b, p7/z, p0.b\",\n        \"mov z0.d, z17.d\",\n        \"mov z0.s, p0/m, z18.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vminpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x5d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmin v16.2d, v17.2d, v18.2d\"\n      ]\n    },\n    \"vminpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x5d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt p0.d, p7/z, z18.d, z17.d\",\n        \"not p0.b, p7/z, p0.b\",\n        \"mov z0.d, z17.d\",\n        \"mov z0.d, p0/m, z18.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AFP/VEX_map3.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ],\n    \"DisabledHostFeatures\": []\n  },\n  \"Instructions\": {\n    \"vroundss xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintn s16, s17\"\n      ]\n    },\n    \"vroundss xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintm s16, s17\"\n      ]\n    },\n    \"vroundss xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintp s16, s17\"\n      ]\n    },\n    \"vroundss xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintz s16, s17\"\n      ]\n    },\n    \"vroundss xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frinti s16, s17\"\n      ]\n    },\n    \"vroundsd xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintn d16, d17\"\n      ]\n    },\n    \"vroundsd xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintm d16, d17\"\n      ]\n    },\n    \"vroundsd xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintp d16, d17\"\n      ]\n    },\n    \"vroundsd xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintz d16, d17\"\n      ]\n    },\n    \"vroundsd xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frinti d16, d17\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AVX128/FMA4.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"AFP\",\n      \"SVE256\",\n      \"SVE128\"\n    ]\n  },\n  \"Instructions\": {\n    \"vfmaddsubps xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x5c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmaddsubps ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x5c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmaddsubpd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x5d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmaddsubpd ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x5d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmsubaddps xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x5e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmsubaddps ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x5e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmsubaddpd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x5f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmsubaddpd ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x5f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmaddps xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x68 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmaddps ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x68 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmaddpd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x69 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmaddpd ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x69 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmaddss xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x6a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmaddsd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x6b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmsubps xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x6c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmsubps ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x6c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmsubpd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x6d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmsubpd ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x6d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmsubss xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x6e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfmsubsd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x6f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfnmaddps xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x78 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfnmaddpd ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x78 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfnmaddss xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x79 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfnmaddsd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x7a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfnmsubps xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x7c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfnmsubps ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x7c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfnmsubpd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x7d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfnmsubpd ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x7d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfnmsubss xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x7e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    },\n    \"vfnmsubsd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x7f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x10000\",\n        \"str x20, [x28, #24]\",\n        \"mov w1, #0x401\",\n        \"str x1, [x28, #1496]\",\n        \"ldr x0, [x28, #2912]\",\n        \"br x0\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AVX128/VEX_map1.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FRINTTS\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"FCMA\",\n      \"RPRES\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"SVE256\",\n      \"SVE128\"\n    ]\n  },\n  \"Instructions\": {\n    \"vmovups xmm0, xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovups xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovups ymm0, ymm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Spurious moves\",\n        \"Map 1 0b00 0x10 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovups ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x10 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldp q16, q2, [x4]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovupd xmm0, xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovupd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovupd ymm0, ymm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Spurious moves\",\n        \"Map 1 0b01 0x10 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovupd ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x10 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldp q16, q2, [x4]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovss xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s16, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[0], v18.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovsd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d16, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Insert in to first element could be more optimal, which is the common case.\",\n        \"Map 1 0b11 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[0], v18.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovups [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x11 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"vmovups [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x11 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"stp q16, q2, [x4]\"\n      ]\n    },\n    \"vmovupd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x11 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"vmovupd [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x11 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"stp q16, q2, [x4]\"\n      ]\n    },\n    \"vmovss [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b10 0x11 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str s16, [x4]\"\n      ]\n    },\n    \"db 0xc5, 0xf2, 0x11, 0xc2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"vmovss xmm2, xmm1, xmm0\",\n        \"Need to manually encode since nasm won't encode this\",\n        \"Map 1 0b10 0x11 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v18.16b, v17.16b\",\n        \"mov v18.s[0], v16.s[0]\",\n        \"stp xzr, xzr, [x28, #224]\"\n      ]\n    },\n    \"vmovsd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b11 0x11 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str d16, [x4]\"\n      ]\n    },\n    \"db 0xc5, 0xf3, 0x11, 0xc2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"vmovsd xmm2, xmm1, xmm0\",\n        \"Need to manually encode since nasm won't encode this\",\n        \"Insert in to first element could be more optimal, which is the common case.\",\n        \"Map 1 0b11 0x11 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v18.16b, v17.16b\",\n        \"mov v18.d[0], v16.d[0]\",\n        \"stp xzr, xzr, [x28, #224]\"\n      ]\n    },\n    \"vmovlps xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Insert in to first element could be more optimal, which is the common case.\",\n        \"Map 1 0b00 0x12 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"ld1 {v16.d}[0], [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovlpd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Insert in to first element could be more optimal, which is the common case.\",\n        \"Map 1 0b01 0x12 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"ld1 {v16.d}[0], [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovsldup xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0x12 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"trn1 v16.4s, v2.4s, v2.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovsldup ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0x12 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldp q2, q3, [x4]\",\n        \"trn1 v16.4s, v2.4s, v2.4s\",\n        \"trn1 v2.4s, v3.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovddup xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0x12 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"dup v16.2d, v2.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovddup ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0x12 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldp q2, q3, [x4]\",\n        \"dup v16.2d, v2.d[0]\",\n        \"dup v2.2d, v3.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovlps [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x13 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str d16, [x4]\"\n      ]\n    },\n    \"vmovlpd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x13 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str d16, [x4]\"\n      ]\n    },\n    \"vunpcklps xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0x14 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip1 v16.4s, v17.4s, v2.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vunpcklps ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x14 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldp q3, q4, [x4]\",\n        \"zip1 v16.4s, v17.4s, v3.4s\",\n        \"zip1 v2.4s, v2.4s, v4.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vunpcklpd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0x14 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip1 v16.2d, v17.2d, v2.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vunpcklpd ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x14 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldp q3, q4, [x4]\",\n        \"zip1 v16.2d, v17.2d, v3.2d\",\n        \"zip1 v2.2d, v2.2d, v4.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vunpckhps xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0x15 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip2 v16.4s, v17.4s, v2.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vunpckhps ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x15 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldp q3, q4, [x4]\",\n        \"zip2 v16.4s, v17.4s, v3.4s\",\n        \"zip2 v2.4s, v2.4s, v4.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vunpckhpd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0x15 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip2 v16.2d, v17.2d, v2.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vunpckhpd ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x15 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldp q3, q4, [x4]\",\n        \"zip2 v16.2d, v17.2d, v3.2d\",\n        \"zip2 v2.2d, v2.2d, v4.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovhps xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"ld1 {v16.d}[1], [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovhpd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"ld1 {v16.d}[1], [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovlhps xmm0, xmm1, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.2d, v17.2d, v17.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovshdup xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"trn2 v16.4s, v2.4s, v2.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovshdup ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0x16 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldp q2, q3, [x4]\",\n        \"trn2 v16.4s, v2.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovhps [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x17 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.d}[1], [x4]\"\n      ]\n    },\n    \"vmovhpd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x17 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.d}[1], [x4]\"\n      ]\n    },\n    \"vmovmskps rax, xmm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x50 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ushr v2.4s, v16.4s, #31\",\n        \"ldr q3, [x28, #3168]\",\n        \"ushl v2.4s, v2.4s, v3.4s\",\n        \"addv s2, v2.4s\",\n        \"mov w4, v2.s[0]\"\n      ]\n    },\n    \"vmovmskps rax, ymm0\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 1 0b00 0x50 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ushr v3.4s, v16.4s, #31\",\n        \"ldr q4, [x28, #3168]\",\n        \"ushl v3.4s, v3.4s, v4.4s\",\n        \"addv s3, v3.4s\",\n        \"mov w20, v3.s[0]\",\n        \"ushr v2.4s, v2.4s, #31\",\n        \"ushl v2.4s, v2.4s, v4.4s\",\n        \"addv s2, v2.4s\",\n        \"mov w21, v2.s[0]\",\n        \"orr x4, x20, x21, lsl #4\"\n      ]\n    },\n    \"vmovmskpd rax, xmm0\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x50 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp2 v2.4s, v16.4s, v16.4s\",\n        \"mov x20, v2.d[0]\",\n        \"bfi x20, x20, #31, #32\",\n        \"lsr x4, x20, #62\"\n      ]\n    },\n    \"vmovmskpd rax, ymm0\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 1 0b01 0x50 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"uzp2 v3.4s, v16.4s, v16.4s\",\n        \"mov x20, v3.d[0]\",\n        \"bfi x20, x20, #31, #32\",\n        \"lsr x20, x20, #62\",\n        \"uzp2 v2.4s, v2.4s, v2.4s\",\n        \"mov x21, v2.d[0]\",\n        \"bfi x21, x21, #31, #32\",\n        \"lsr x21, x21, #62\",\n        \"orr x4, x20, x21, lsl #2\"\n      ]\n    },\n    \"vsqrtps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x51 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsqrt v16.4s, v17.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vsqrtps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0x51 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"fsqrt v16.4s, v17.4s\",\n        \"fsqrt v2.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vsqrtpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x51 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsqrt v16.2d, v17.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vsqrtpd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x51 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"fsqrt v16.2d, v17.2d\",\n        \"fsqrt v2.2d, v2.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vsqrtss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0x51 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fsqrt s0, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vsqrtsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0x51 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fsqrt d0, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vrsqrtps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0x52 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov v0.4s, #0x70 (1.0000)\",\n        \"fsqrt v1.4s, v17.4s\",\n        \"fdiv v16.4s, v0.4s, v1.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vrsqrtps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 1 0b00 0x52 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"fmov v0.4s, #0x70 (1.0000)\",\n        \"fsqrt v1.4s, v17.4s\",\n        \"fdiv v16.4s, v0.4s, v1.4s\",\n        \"fmov v0.4s, #0x70 (1.0000)\",\n        \"fsqrt v1.4s, v2.4s\",\n        \"fdiv v2.4s, v0.4s, v1.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vrsqrtss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0x52 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmov s0, #0x70 (1.0000)\",\n        \"fsqrt s1, s18\",\n        \"fdiv s0, s0, s1\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vrcpps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0x53 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov v0.4s, #0x70 (1.0000)\",\n        \"fdiv v16.4s, v0.4s, v17.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vrcpps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b00 0x53 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"fmov v0.4s, #0x70 (1.0000)\",\n        \"fdiv v16.4s, v0.4s, v17.4s\",\n        \"fmov v0.4s, #0x70 (1.0000)\",\n        \"fdiv v2.4s, v0.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vrcpss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b10 0x53 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmov s0, #0x70 (1.0000)\",\n        \"fdiv s0, s0, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vandps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x54 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and v16.16b, v16.16b, v17.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vandps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x54 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"and v16.16b, v16.16b, v17.16b\",\n        \"and v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vandpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x54 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and v16.16b, v16.16b, v17.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vandpd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x54 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"and v16.16b, v16.16b, v17.16b\",\n        \"and v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vandnps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x55 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"bic v16.16b, v17.16b, v16.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vandnps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x55 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"bic v16.16b, v17.16b, v16.16b\",\n        \"bic v2.16b, v3.16b, v2.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vandnpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x55 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"bic v16.16b, v17.16b, v16.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vandnpd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x55 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"bic v16.16b, v17.16b, v16.16b\",\n        \"bic v2.16b, v3.16b, v2.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vorps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x56 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr v16.16b, v16.16b, v17.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vorps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x56 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"orr v16.16b, v16.16b, v17.16b\",\n        \"orr v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vorpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x56 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr v16.16b, v16.16b, v17.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vorpd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x56 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"orr v16.16b, v16.16b, v17.16b\",\n        \"orr v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vxorps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x57 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor v16.16b, v16.16b, v17.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vxorps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x57 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"eor v16.16b, v16.16b, v17.16b\",\n        \"eor v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vxorpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x57 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor v16.16b, v16.16b, v17.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vxorpd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x57 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"eor v16.16b, v16.16b, v17.16b\",\n        \"eor v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vxorps xmm0, xmm1, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"xor with itself to get zero register\",\n        \"Map 1 0b00 0x57 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vxorps ymm0, ymm1, ymm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"xor with itself to get zero register\",\n        \"Map 1 0b00 0x57 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vxorpd xmm0, xmm1, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"xor with itself to get zero register\",\n        \"Map 1 0b01 0x57 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vxorpd ymm0, ymm1, ymm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"xor with itself to get zero register\",\n        \"Map 1 0b01 0x57 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpunpcklbw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x60 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpunpcklbw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x60 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"zip1 v16.16b, v17.16b, v18.16b\",\n        \"zip1 v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpunpcklwd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x61 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpunpcklwd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x61 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"zip1 v16.8h, v17.8h, v18.8h\",\n        \"zip1 v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpunpckldq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x62 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpunpckldq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x62 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"zip1 v16.4s, v17.4s, v18.4s\",\n        \"zip1 v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpacksswb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0x63 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqxtn v16.8b, v17.8h\",\n        \"sqxtn2 v16.16b, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpacksswb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b01 0x63 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"sqxtn v16.8b, v17.8h\",\n        \"sqxtn2 v16.16b, v18.8h\",\n        \"sqxtn v2.8b, v2.8h\",\n        \"sqxtn2 v2.16b, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpcmpgtb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x64 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmgt v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpcmpgtb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x64 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"cmgt v16.16b, v17.16b, v18.16b\",\n        \"cmgt v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpcmpgtw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x65 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmgt v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpcmpgtw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x65 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"cmgt v16.8h, v17.8h, v18.8h\",\n        \"cmgt v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpcmpgtd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x66 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmgt v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpcmpgtd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x66 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"cmgt v16.4s, v17.4s, v18.4s\",\n        \"cmgt v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpackuswb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0x67 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqxtun v16.8b, v17.8h\",\n        \"sqxtun2 v16.16b, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpackuswb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b01 0x67 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"sqxtun v16.8b, v17.8h\",\n        \"sqxtun2 v16.16b, v18.8h\",\n        \"sqxtun v2.8b, v2.8h\",\n        \"sqxtun2 v2.16b, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpshufd xmm0, xmm1, 00b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.4s, v17.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpshufd xmm0, xmm1, 01b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2680]\",\n        \"ldr q2, [x0, #16]\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpshufd xmm0, xmm1, 10b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2680]\",\n        \"ldr q2, [x0, #32]\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpshufd xmm0, xmm1, 11b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2680]\",\n        \"ldr q2, [x0, #48]\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpshufd ymm0, ymm1, 00b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.4s, v17.s[0]\",\n        \"dup v2.4s, v2.s[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpshufd ymm0, ymm1, 01b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr x0, [x28, #2680]\",\n        \"ldr q3, [x0, #16]\",\n        \"tbl v16.16b, {v17.16b}, v3.16b\",\n        \"tbl v2.16b, {v2.16b}, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpshufd ymm0, ymm1, 10b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr x0, [x28, #2680]\",\n        \"ldr q3, [x0, #32]\",\n        \"tbl v16.16b, {v17.16b}, v3.16b\",\n        \"tbl v2.16b, {v2.16b}, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpshufd ymm0, ymm1, 11b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr x0, [x28, #2680]\",\n        \"ldr q3, [x0, #48]\",\n        \"tbl v16.16b, {v17.16b}, v3.16b\",\n        \"tbl v2.16b, {v2.16b}, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpshufhw xmm0, xmm1, 00b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.8h, v17.h[4]\",\n        \"trn1 v16.2d, v17.2d, v2.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpshufhw xmm0, xmm1, 01b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2672]\",\n        \"ldr q2, [x0, #16]\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpshufhw xmm0, xmm1, 10b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2672]\",\n        \"ldr q2, [x0, #32]\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpshufhw xmm0, xmm1, 11b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2672]\",\n        \"ldr q2, [x0, #48]\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpshufhw ymm0, ymm1, 00b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v3.8h, v17.h[4]\",\n        \"trn1 v16.2d, v17.2d, v3.2d\",\n        \"dup v3.8h, v2.h[4]\",\n        \"trn1 v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpshufhw ymm0, ymm1, 01b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr x0, [x28, #2672]\",\n        \"ldr q3, [x0, #16]\",\n        \"tbl v16.16b, {v17.16b}, v3.16b\",\n        \"tbl v2.16b, {v2.16b}, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpshufhw ymm0, ymm1, 10b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr x0, [x28, #2672]\",\n        \"ldr q3, [x0, #32]\",\n        \"tbl v16.16b, {v17.16b}, v3.16b\",\n        \"tbl v2.16b, {v2.16b}, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpshufhw ymm0, ymm1, 11b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr x0, [x28, #2672]\",\n        \"ldr q3, [x0, #48]\",\n        \"tbl v16.16b, {v17.16b}, v3.16b\",\n        \"tbl v2.16b, {v2.16b}, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpshuflw xmm0, xmm1, 00b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.8h, v17.h[0]\",\n        \"trn2 v16.2d, v2.2d, v17.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpshuflw xmm0, xmm1, 01b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2664]\",\n        \"ldr q2, [x0, #16]\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpshuflw xmm0, xmm1, 10b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2664]\",\n        \"ldr q2, [x0, #32]\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpshuflw xmm0, xmm1, 11b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2664]\",\n        \"ldr q2, [x0, #48]\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpshuflw ymm0, ymm1, 00b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v3.8h, v17.h[0]\",\n        \"trn2 v16.2d, v3.2d, v17.2d\",\n        \"dup v3.8h, v2.h[0]\",\n        \"trn2 v2.2d, v3.2d, v2.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpshuflw ymm0, ymm1, 01b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr x0, [x28, #2664]\",\n        \"ldr q3, [x0, #16]\",\n        \"tbl v16.16b, {v17.16b}, v3.16b\",\n        \"tbl v2.16b, {v2.16b}, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpshuflw ymm0, ymm1, 10b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr x0, [x28, #2664]\",\n        \"ldr q3, [x0, #32]\",\n        \"tbl v16.16b, {v17.16b}, v3.16b\",\n        \"tbl v2.16b, {v2.16b}, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpshuflw ymm0, ymm1, 11b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr x0, [x28, #2664]\",\n        \"ldr q3, [x0, #48]\",\n        \"tbl v16.16b, {v17.16b}, v3.16b\",\n        \"tbl v2.16b, {v2.16b}, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpcmpeqb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x74 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmeq v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpcmpeqb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x74 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"cmeq v16.16b, v17.16b, v18.16b\",\n        \"cmeq v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpcmpeqw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x75 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmeq v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpcmpeqw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x75 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"cmeq v16.8h, v17.8h, v18.8h\",\n        \"cmeq v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpcmpeqd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x76 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmeq v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpcmpeqd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x76 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"cmeq v16.4s, v17.4s, v18.4s\",\n        \"cmeq v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vzeroupper\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Might be able to use DZ ZVA\",\n        \"Map 1 0b01 0x77 L=0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add x0, x28, #0xc0 (192)\",\n        \"dc zva, x0\",\n        \"add x0, x28, #0x100 (256)\",\n        \"dc zva, x0\",\n        \"add x0, x28, #0x140 (320)\",\n        \"dc zva, x0\",\n        \"add x0, x28, #0x180 (384)\",\n        \"dc zva, x0\"\n      ]\n    },\n    \"vzeroall\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"Might be able to use DZ ZVA\",\n        \"Map 1 0b01 0x77 L=1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"movi v17.2d, #0x0\",\n        \"movi v18.2d, #0x0\",\n        \"movi v19.2d, #0x0\",\n        \"movi v20.2d, #0x0\",\n        \"movi v21.2d, #0x0\",\n        \"movi v22.2d, #0x0\",\n        \"movi v23.2d, #0x0\",\n        \"movi v24.2d, #0x0\",\n        \"movi v25.2d, #0x0\",\n        \"movi v26.2d, #0x0\",\n        \"movi v27.2d, #0x0\",\n        \"movi v28.2d, #0x0\",\n        \"movi v29.2d, #0x0\",\n        \"movi v30.2d, #0x0\",\n        \"movi v31.2d, #0x0\",\n        \"add x0, x28, #0xc0 (192)\",\n        \"dc zva, x0\",\n        \"add x0, x28, #0x100 (256)\",\n        \"dc zva, x0\",\n        \"add x0, x28, #0x140 (320)\",\n        \"dc zva, x0\",\n        \"add x0, x28, #0x180 (384)\",\n        \"dc zva, x0\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x00\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x00\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmeq v16.4s, v17.4s, v18.4s\",\n        \"fcmeq v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x01\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v16.4s, v18.4s, v17.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x01\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmgt v16.4s, v18.4s, v17.4s\",\n        \"fcmgt v2.4s, v3.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x02\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v16.4s, v18.4s, v17.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x02\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmge v16.4s, v18.4s, v17.4s\",\n        \"fcmge v2.4s, v3.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x03\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v0.4s, v17.4s, v18.4s\",\n        \"fcmgt v1.4s, v18.4s, v17.4s\",\n        \"orr v16.16b, v0.16b, v1.16b\",\n        \"mvn v16.16b, v16.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x03\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmge v0.4s, v17.4s, v18.4s\",\n        \"fcmgt v1.4s, v18.4s, v17.4s\",\n        \"orr v16.16b, v0.16b, v1.16b\",\n        \"mvn v16.16b, v16.16b\",\n        \"fcmge v0.4s, v2.4s, v3.4s\",\n        \"fcmgt v1.4s, v3.4s, v2.4s\",\n        \"orr v2.16b, v0.16b, v1.16b\",\n        \"mvn v2.16b, v2.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x04\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq v16.4s, v17.4s, v18.4s\",\n        \"mvn v16.16b, v16.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x04\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmeq v16.4s, v17.4s, v18.4s\",\n        \"mvn v16.16b, v16.16b\",\n        \"fcmeq v2.4s, v2.4s, v3.4s\",\n        \"mvn v2.16b, v2.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x05\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v2.4s, v18.4s, v17.4s\",\n        \"mvn v16.16b, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x05\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmgt v4.4s, v18.4s, v17.4s\",\n        \"mvn v16.16b, v4.16b\",\n        \"fcmgt v2.4s, v3.4s, v2.4s\",\n        \"mvn v2.16b, v2.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x06\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v2.4s, v18.4s, v17.4s\",\n        \"mvn v16.16b, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x06\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmge v4.4s, v18.4s, v17.4s\",\n        \"mvn v16.16b, v4.16b\",\n        \"fcmge v2.4s, v3.4s, v2.4s\",\n        \"mvn v2.16b, v2.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x07\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v0.4s, v17.4s, v18.4s\",\n        \"fcmgt v1.4s, v18.4s, v17.4s\",\n        \"orr v16.16b, v0.16b, v1.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x07\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmge v0.4s, v17.4s, v18.4s\",\n        \"fcmgt v1.4s, v18.4s, v17.4s\",\n        \"orr v16.16b, v0.16b, v1.16b\",\n        \"fcmge v0.4s, v2.4s, v3.4s\",\n        \"fcmgt v1.4s, v3.4s, v2.4s\",\n        \"orr v2.16b, v0.16b, v1.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x00\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x00\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmeq v16.2d, v17.2d, v18.2d\",\n        \"fcmeq v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x01\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v16.2d, v18.2d, v17.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x01\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmgt v16.2d, v18.2d, v17.2d\",\n        \"fcmgt v2.2d, v3.2d, v2.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x02\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v16.2d, v18.2d, v17.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x02\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmge v16.2d, v18.2d, v17.2d\",\n        \"fcmge v2.2d, v3.2d, v2.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x03\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v0.2d, v17.2d, v18.2d\",\n        \"fcmgt v1.2d, v18.2d, v17.2d\",\n        \"orr v16.16b, v0.16b, v1.16b\",\n        \"mvn v16.16b, v16.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x03\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmge v0.2d, v17.2d, v18.2d\",\n        \"fcmgt v1.2d, v18.2d, v17.2d\",\n        \"orr v16.16b, v0.16b, v1.16b\",\n        \"mvn v16.16b, v16.16b\",\n        \"fcmge v0.2d, v2.2d, v3.2d\",\n        \"fcmgt v1.2d, v3.2d, v2.2d\",\n        \"orr v2.16b, v0.16b, v1.16b\",\n        \"mvn v2.16b, v2.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x04\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq v16.2d, v17.2d, v18.2d\",\n        \"mvn v16.16b, v16.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x04\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmeq v16.2d, v17.2d, v18.2d\",\n        \"mvn v16.16b, v16.16b\",\n        \"fcmeq v2.2d, v2.2d, v3.2d\",\n        \"mvn v2.16b, v2.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x05\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v2.2d, v18.2d, v17.2d\",\n        \"mvn v16.16b, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x05\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmgt v4.2d, v18.2d, v17.2d\",\n        \"mvn v16.16b, v4.16b\",\n        \"fcmgt v2.2d, v3.2d, v2.2d\",\n        \"mvn v2.16b, v2.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x06\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v2.2d, v18.2d, v17.2d\",\n        \"mvn v16.16b, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x06\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmge v4.2d, v18.2d, v17.2d\",\n        \"mvn v16.16b, v4.16b\",\n        \"fcmge v2.2d, v3.2d, v2.2d\",\n        \"mvn v2.16b, v2.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x07\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v0.2d, v17.2d, v18.2d\",\n        \"fcmgt v1.2d, v18.2d, v17.2d\",\n        \"orr v16.16b, v0.16b, v1.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x07\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmge v0.2d, v17.2d, v18.2d\",\n        \"fcmgt v1.2d, v18.2d, v17.2d\",\n        \"orr v16.16b, v0.16b, v1.16b\",\n        \"fcmge v0.2d, v2.2d, v3.2d\",\n        \"fcmgt v1.2d, v3.2d, v2.2d\",\n        \"orr v2.16b, v0.16b, v1.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x00\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmeq s0, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x01\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmgt s0, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x02\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge s0, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x03\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge s0, s17, s18\",\n        \"fcmgt s1, s18, s17\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x04\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmeq s0, s18, s17\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x05\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt s2, s18, s17\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[0], v2.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x06\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge s2, s18, s17\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[0], v2.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x07\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge s0, s17, s18\",\n        \"fcmgt s1, s18, s17\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x00\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmeq d0, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x01\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmgt d0, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x02\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge d0, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x03\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge d0, d17, d18\",\n        \"fcmgt d1, d18, d17\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x04\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmeq d0, d18, d17\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x05\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt d2, d18, d17\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[0], v2.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x06\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge d2, d18, d17\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[0], v2.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x07\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge d0, d17, d18\",\n        \"fcmgt d1, d18, d17\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpinsrw xmm0, xmm0, eax, 000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xC4 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.h[0], w4\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpinsrw xmm0, xmm1, eax, 000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xC4 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.h[0], w4\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpinsrw xmm0, xmm1, eax, 001b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xC4 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.h[1], w4\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpinsrw xmm0, xmm1, eax, 111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xC4 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.h[7], w4\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpextrw eax, xmm0, 000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[0]\"\n      ]\n    },\n    \"vpextrw eax, xmm0, 001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[1]\"\n      ]\n    },\n    \"vpextrw eax, xmm0, 111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[7]\"\n      ]\n    },\n    \"vpextrw [rax], xmm0, 000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[0], [x4]\"\n      ]\n    },\n    \"vpextrw [rax], xmm0, 001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[1], [x4]\"\n      ]\n    },\n    \"vpextrw [rax], xmm0, 111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[7], [x4]\"\n      ]\n    },\n    \"vshufps xmm0, xmm1, xmm2, 00b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[0]\",\n        \"dup v3.4s, v18.s[0]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vshufps ymm0, ymm1, ymm2, 00b\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"dup v4.4s, v17.s[0]\",\n        \"dup v5.4s, v18.s[0]\",\n        \"zip1 v16.2d, v4.2d, v5.2d\",\n        \"dup v2.4s, v2.s[0]\",\n        \"dup v3.4s, v3.s[0]\",\n        \"zip1 v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vshufps xmm0, xmm1, xmm2, 01b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2688]\",\n        \"ldr q2, [x0, #16]\",\n        \"tbl v16.16b, {v17.16b, v18.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vshufps ymm0, ymm1, ymm2, 01b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ldr x0, [x28, #2688]\",\n        \"ldr q4, [x0, #16]\",\n        \"tbl v16.16b, {v17.16b, v18.16b}, v4.16b\",\n        \"tbl v2.16b, {v2.16b, v3.16b}, v4.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vshufps xmm0, xmm1, xmm2, 10b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2688]\",\n        \"ldr q2, [x0, #32]\",\n        \"tbl v16.16b, {v17.16b, v18.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vshufps ymm0, ymm1, ymm2, 10b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ldr x0, [x28, #2688]\",\n        \"ldr q4, [x0, #32]\",\n        \"tbl v16.16b, {v17.16b, v18.16b}, v4.16b\",\n        \"tbl v2.16b, {v2.16b, v3.16b}, v4.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vshufps xmm0, xmm1, xmm2, 11b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2688]\",\n        \"ldr q2, [x0, #48]\",\n        \"tbl v16.16b, {v17.16b, v18.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vshufps ymm0, ymm1, ymm2, 11b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ldr x0, [x28, #2688]\",\n        \"ldr q4, [x0, #48]\",\n        \"tbl v16.16b, {v17.16b, v18.16b}, v4.16b\",\n        \"tbl v2.16b, {v2.16b, v3.16b}, v4.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vshufpd xmm0, xmm1, xmm2, 0b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xC6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vshufpd ymm0, ymm1, ymm2, 0b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xC6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"zip1 v16.2d, v17.2d, v18.2d\",\n        \"zip1 v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vshufpd xmm0, xmm1, xmm2, 1b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xC6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ext v16.16b, v17.16b, v18.16b, #8\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vshufpd ymm0, ymm1, ymm2, 1b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xC6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ext v16.16b, v17.16b, v18.16b, #8\",\n        \"zip1 v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovaps xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x28 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovaps ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x28 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldp q16, q2, [x4]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovaps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x29 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vmovaps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0x29 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vmovapd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x28 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovapd ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x28 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldp q16, q2, [x4]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovapd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x29 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vmovapd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0x29 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vmovaps [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x29 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"vmovaps [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x29 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"stp q16, q2, [x4]\"\n      ]\n    },\n    \"vmovapd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x29 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"vmovapd [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x29 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"stp q16, q2, [x4]\"\n      ]\n    },\n    \"vcvtsi2ss xmm0, xmm1, eax\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"scvtf s0, w4\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtsi2ss xmm0, xmm1, rax\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"scvtf s0, x4\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtsi2ss xmm0, xmm1, dword [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b10 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"mov v16.16b, v17.16b\",\n        \"scvtf s0, s2\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtsi2ss xmm0, xmm1, qword [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b10 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x4]\",\n        \"mov v16.16b, v17.16b\",\n        \"scvtf s0, x20\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtsi2sd xmm0, xmm1, eax\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"scvtf d0, w4\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtsi2sd xmm0, xmm1, rax\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"scvtf d0, x4\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtsi2sd xmm0, xmm1, dword [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b11 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"mov v16.16b, v17.16b\",\n        \"scvtf d0, w20\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtsi2sd xmm0, xmm1, qword [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b11 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"mov v16.16b, v17.16b\",\n        \"scvtf d0, d2\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovntps [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x2B 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"vmovntps [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x2B 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"stnp q16, q2, [x4]\"\n      ]\n    },\n    \"vmovntpd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x2B 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"vmovntpd [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x2B 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"stnp q16, q2, [x4]\"\n      ]\n    },\n    \"vcvttss2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32z s2, s16\",\n        \"fcvtzs w4, s2\"\n      ]\n    },\n    \"vcvttss2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint64z s2, s16\",\n        \"fcvtzs x4, s2\"\n      ]\n    },\n    \"vcvttss2si rax, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"frint64z s2, s2\",\n        \"fcvtzs x4, s2\"\n      ]\n    },\n    \"vcvttsd2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32z d2, d16\",\n        \"fcvtzs w4, d2\"\n      ]\n    },\n    \"vcvttsd2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint64z d2, d16\",\n        \"fcvtzs x4, d2\"\n      ]\n    },\n    \"vcvttsd2si rax, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"frint64z d2, d2\",\n        \"fcvtzs x4, d2\"\n      ]\n    },\n    \"vcvtss2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32x s2, s16\",\n        \"fcvtzs w4, s2\"\n      ]\n    },\n    \"vcvtss2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint64x s2, s16\",\n        \"fcvtzs x4, s2\"\n      ]\n    },\n    \"vcvtss2si rax, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"frint64x s2, s2\",\n        \"fcvtzs x4, s2\"\n      ]\n    },\n    \"vcvtsd2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32x d2, d16\",\n        \"fcvtzs w4, d2\"\n      ]\n    },\n    \"vcvtsd2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint64x d2, d16\",\n        \"fcvtzs x4, d2\"\n      ]\n    },\n    \"vcvtsd2si rax, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"frint64x d2, d2\",\n        \"fcvtzs x4, d2\"\n      ]\n    },\n    \"vucomiss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x2e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp s16, s17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"vucomisd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x2e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp d16, d17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"vcomiss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x2f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp s16, s17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"vcomisd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x2f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp d16, d17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"vaddps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x58 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fadd v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vaddps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x58 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fadd v16.4s, v17.4s, v18.4s\",\n        \"fadd v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vaddpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x58 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fadd v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vaddpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x58 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fadd v16.2d, v17.2d, v18.2d\",\n        \"fadd v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vaddss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0x58 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fadd s0, s17, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vaddsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0x58 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fadd d0, d17, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmulps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x59 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmulps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x59 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fmul v16.4s, v17.4s, v18.4s\",\n        \"fmul v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmulpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x59 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmulpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x59 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fmul v16.2d, v17.2d, v18.2d\",\n        \"fmul v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmulss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0x59 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmul s0, s17, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmulsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0x59 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmul d0, d17, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtps2pd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvtl v16.2d, v17.2s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtpd2ps xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"fcvtn v16.2s, v2.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtpd2ps xmm0, yword [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldp q2, q3, [x4]\",\n        \"fcvtn v2.2s, v2.2d\",\n        \"fcvtn v3.2s, v3.2d\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.d[1], v3.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtpd2ps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvtn v16.2s, v17.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtss2sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcvt d0, s18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtss2sd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b10 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"mov v16.16b, v17.16b\",\n        \"fcvt d0, s2\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtsd2ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcvt s0, d18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtsd2ss xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b11 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"mov v16.16b, v17.16b\",\n        \"fcvt s0, d2\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtdq2ps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x5b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"scvtf v16.4s, v17.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtdq2ps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0x5b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"scvtf v16.4s, v17.4s\",\n        \"scvtf v2.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcvtps2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0x5b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32x v2.4s, v17.4s\",\n        \"fcvtzs v16.4s, v2.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtps2dq ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x5b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"frint32x v3.4s, v17.4s\",\n        \"fcvtzs v16.4s, v3.4s\",\n        \"frint32x v2.4s, v2.4s\",\n        \"fcvtzs v2.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcvttps2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0x5b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32z v2.4s, v17.4s\",\n        \"fcvtzs v16.4s, v2.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvttps2dq ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0x5b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"frint32z v3.4s, v17.4s\",\n        \"fcvtzs v16.4s, v3.4s\",\n        \"frint32z v2.4s, v2.4s\",\n        \"fcvtzs v2.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vsubps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x5c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsub v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vsubps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x5c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fsub v16.4s, v17.4s, v18.4s\",\n        \"fsub v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vsubpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x5c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsub v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vsubpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x5c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fsub v16.2d, v17.2d, v18.2d\",\n        \"fsub v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vsubss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0x5c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fsub s0, s17, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vsubsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0x5c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fsub d0, d17, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vminps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0x5d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v0.4s, v18.4s, v17.4s\",\n        \"mov v16.16b, v17.16b\",\n        \"bif v16.16b, v18.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vminps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 1 0b00 0x5d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmgt v0.4s, v18.4s, v17.4s\",\n        \"mov v16.16b, v17.16b\",\n        \"bif v16.16b, v18.16b, v0.16b\",\n        \"fcmgt v0.4s, v3.4s, v2.4s\",\n        \"bif v2.16b, v3.16b, v0.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vminpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x5d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v0.2d, v18.2d, v17.2d\",\n        \"mov v16.16b, v17.16b\",\n        \"bif v16.16b, v18.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vminpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 1 0b01 0x5d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmgt v0.2d, v18.2d, v17.2d\",\n        \"mov v16.16b, v17.16b\",\n        \"bif v16.16b, v18.16b, v0.16b\",\n        \"fcmgt v0.2d, v3.2d, v2.2d\",\n        \"bif v2.16b, v3.16b, v0.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vminss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b10 0x5d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v16.16b, v17.16b\",\n        \"fcmp s17, s18\",\n        \"fcsel s0, s17, s18, mi\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vminsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b11 0x5d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v16.16b, v17.16b\",\n        \"fcmp d17, d18\",\n        \"fcsel d0, d17, d18, mi\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vdivps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x5e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fdiv v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vdivps ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b00 0x5e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"fdiv v16.4s, v16.4s, v18.4s\",\n        \"fdiv v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vdivps ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b00 0x5e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"fdiv v16.4s, v17.4s, v16.4s\",\n        \"fdiv v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vdivps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x5e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fdiv v16.4s, v17.4s, v18.4s\",\n        \"fdiv v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vdivpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x5e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fdiv v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vdivpd ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0x5e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"fdiv v16.2d, v17.2d, v16.2d\",\n        \"fdiv v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vdivpd ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0x5e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"fdiv v16.2d, v16.2d, v18.2d\",\n        \"fdiv v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vdivpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x5e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fdiv v16.2d, v17.2d, v18.2d\",\n        \"fdiv v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vdivss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0x5e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fdiv s0, s17, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vdivsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0x5e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fdiv d0, d17, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmaxps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0x5f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v0.4s, v18.4s, v17.4s\",\n        \"mov v16.16b, v17.16b\",\n        \"bit v16.16b, v18.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmaxps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 1 0b00 0x5f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmgt v0.4s, v18.4s, v17.4s\",\n        \"mov v16.16b, v17.16b\",\n        \"bit v16.16b, v18.16b, v0.16b\",\n        \"fcmgt v0.4s, v3.4s, v2.4s\",\n        \"bit v2.16b, v3.16b, v0.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmaxpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x5f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v0.2d, v18.2d, v17.2d\",\n        \"mov v16.16b, v17.16b\",\n        \"bit v16.16b, v18.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmaxpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 1 0b01 0x5f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fcmgt v0.2d, v18.2d, v17.2d\",\n        \"mov v16.16b, v17.16b\",\n        \"bit v16.16b, v18.16b, v0.16b\",\n        \"fcmgt v0.2d, v3.2d, v2.2d\",\n        \"bit v2.16b, v3.16b, v0.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmaxss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b10 0x5f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v16.16b, v17.16b\",\n        \"fcmp s17, s18\",\n        \"fcsel s0, s17, s18, gt\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmaxsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b11 0x5f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v16.16b, v17.16b\",\n        \"fcmp d17, d18\",\n        \"fcsel d0, d17, d18, gt\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpunpckhbw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x68 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpunpckhbw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x68 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"zip2 v16.16b, v17.16b, v18.16b\",\n        \"zip2 v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpunpckhwd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x69 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpunpckhwd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x69 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"zip2 v16.8h, v17.8h, v18.8h\",\n        \"zip2 v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpunpckhdq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x6a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpunpckhdq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x6a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"zip2 v16.4s, v17.4s, v18.4s\",\n        \"zip2 v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpackssdw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0x6b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqxtn v16.4h, v17.4s\",\n        \"sqxtn2 v16.8h, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpackssdw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b01 0x6b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"sqxtn v16.4h, v17.4s\",\n        \"sqxtn2 v16.8h, v18.4s\",\n        \"sqxtn v2.4h, v2.4s\",\n        \"sqxtn2 v2.8h, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpunpcklqdq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x6c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpunpcklqdq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x6c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"zip1 v16.2d, v17.2d, v18.2d\",\n        \"zip1 v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpunpckhqdq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x6d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpunpckhqdq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x6d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"zip2 v16.2d, v17.2d, v18.2d\",\n        \"zip2 v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovd xmm0, dword [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x6e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s16, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovq xmm0, qword [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x6e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d16, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovdqa xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x6f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovdqa [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x6f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"vmovdqu xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x6f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovdqu [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b10 0x6f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"vhaddpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x7c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"faddp v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vhaddpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x7c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"faddp v16.2d, v17.2d, v18.2d\",\n        \"faddp v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vhaddps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x7c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"faddp v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vhaddps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b11 0x7c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"faddp v16.4s, v17.4s, v18.4s\",\n        \"faddp v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vhsubpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x7d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.2d, v17.2d, v18.2d\",\n        \"uzp2 v3.2d, v17.2d, v18.2d\",\n        \"fsub v16.2d, v2.2d, v3.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vhsubpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 1 0b01 0x7d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"uzp1 v4.2d, v17.2d, v18.2d\",\n        \"uzp2 v5.2d, v17.2d, v18.2d\",\n        \"fsub v16.2d, v4.2d, v5.2d\",\n        \"uzp1 v4.2d, v2.2d, v3.2d\",\n        \"uzp2 v2.2d, v2.2d, v3.2d\",\n        \"fsub v2.2d, v4.2d, v2.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vhsubps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0x7d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.4s, v17.4s, v18.4s\",\n        \"uzp2 v3.4s, v17.4s, v18.4s\",\n        \"fsub v16.4s, v2.4s, v3.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vhsubps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 1 0b11 0x7d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"uzp1 v4.4s, v17.4s, v18.4s\",\n        \"uzp2 v5.4s, v17.4s, v18.4s\",\n        \"fsub v16.4s, v4.4s, v5.4s\",\n        \"uzp1 v4.4s, v2.4s, v3.4s\",\n        \"uzp2 v2.4s, v2.4s, v3.4s\",\n        \"fsub v2.4s, v4.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovd dword [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x7e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str s16, [x4]\"\n      ]\n    },\n    \"vmovq qword [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x7e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str d16, [x4]\"\n      ]\n    },\n    \"vmovdqa ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x7f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldp q16, q2, [x4]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovdqa [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x7f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"stp q16, q2, [x4]\"\n      ]\n    },\n    \"vmovdqu ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x7f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldp q16, q2, [x4]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovdqu [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x7f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"stp q16, q2, [x4]\"\n      ]\n    },\n    \"vaddsubpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xd0 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3072]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"fadd v16.2d, v17.2d, v2.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vaddsubpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 1 0b01 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ldr q4, [x28, #3072]\",\n        \"eor v5.16b, v18.16b, v4.16b\",\n        \"fadd v16.2d, v17.2d, v5.2d\",\n        \"eor v3.16b, v3.16b, v4.16b\",\n        \"fadd v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vaddsubps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0xd0 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3040]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"fadd v16.4s, v17.4s, v2.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vaddsubps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 1 0b11 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ldr q4, [x28, #3040]\",\n        \"eor v5.16b, v18.16b, v4.16b\",\n        \"fadd v16.4s, v17.4s, v5.4s\",\n        \"eor v3.16b, v3.16b, v4.16b\",\n        \"fadd v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsrlw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0xd1 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.8h, v0.h[0]\",\n        \"neg v0.8h, v0.8h\",\n        \"ushl v16.8h, v17.8h, v0.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrlw ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 1 0b01 0xd1 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.8h, v0.h[0]\",\n        \"neg v0.8h, v0.8h\",\n        \"ushl v16.8h, v17.8h, v0.8h\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.8h, v0.h[0]\",\n        \"neg v0.8h, v0.8h\",\n        \"ushl v2.8h, v2.8h, v0.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsrld xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0xd2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.4s, v0.s[0]\",\n        \"neg v0.4s, v0.4s\",\n        \"ushl v16.4s, v17.4s, v0.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrld ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 1 0b01 0xd2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.4s, v0.s[0]\",\n        \"neg v0.4s, v0.4s\",\n        \"ushl v16.4s, v17.4s, v0.4s\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.4s, v0.s[0]\",\n        \"neg v0.4s, v0.4s\",\n        \"ushl v2.4s, v2.4s, v0.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsrlq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0xd3 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.2d, v0.d[0]\",\n        \"neg v0.2d, v0.2d\",\n        \"ushl v16.2d, v17.2d, v0.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrlq ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 1 0b01 0xd3 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.2d, v0.d[0]\",\n        \"neg v0.2d, v0.2d\",\n        \"ushl v16.2d, v17.2d, v0.2d\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.2d, v0.d[0]\",\n        \"neg v0.2d, v0.2d\",\n        \"ushl v2.2d, v2.2d, v0.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpaddq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xd4 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpaddq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xd4 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"add v16.2d, v17.2d, v18.2d\",\n        \"add v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmullw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xd5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mul v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmullw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xd4 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"mul v16.8h, v17.8h, v18.8h\",\n        \"mul v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovq [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xd6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str d16, [x4]\"\n      ]\n    },\n    \"vpmovmskb rax, xmm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b01 0xd7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3296]\",\n        \"cmlt v3.16b, v16.16b, #0\",\n        \"and v2.16b, v3.16b, v2.16b\",\n        \"addp v2.16b, v2.16b, v2.16b\",\n        \"addp v2.16b, v2.16b, v2.16b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"umov w4, v2.h[0]\"\n      ]\n    },\n    \"vpmovmskb rax, ymm0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 1 0b01 0xd7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #3296]\",\n        \"cmlt v4.16b, v16.16b, #0\",\n        \"and v4.16b, v4.16b, v3.16b\",\n        \"addp v4.16b, v4.16b, v4.16b\",\n        \"addp v4.16b, v4.16b, v4.16b\",\n        \"addp v4.8b, v4.8b, v4.8b\",\n        \"umov w20, v4.h[0]\",\n        \"cmlt v2.16b, v2.16b, #0\",\n        \"and v2.16b, v2.16b, v3.16b\",\n        \"addp v2.16b, v2.16b, v2.16b\",\n        \"addp v2.16b, v2.16b, v2.16b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"umov w21, v2.h[0]\",\n        \"orr x20, x20, x21, lsl #16\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"vpsubusb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xd8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqsub v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsubusb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xd8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"uqsub v16.16b, v17.16b, v18.16b\",\n        \"uqsub v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsubusw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xd9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqsub v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsubusw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xd9 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"uqsub v16.8h, v17.8h, v18.8h\",\n        \"uqsub v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminub xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xda 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umin v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpminub ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xda 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"umin v16.16b, v17.16b, v16.16b\",\n        \"umin v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminub ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xda 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"umin v16.16b, v16.16b, v18.16b\",\n        \"umin v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminub ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xda 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"umin v16.16b, v17.16b, v18.16b\",\n        \"umin v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpand xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xdb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpand ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xdb 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"and v16.16b, v17.16b, v18.16b\",\n        \"and v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpaddusb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xdc 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqadd v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpaddusb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xdc 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"uqadd v16.16b, v17.16b, v18.16b\",\n        \"uqadd v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpaddusw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xdd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqadd v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpaddusw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xdd 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"uqadd v16.8h, v17.8h, v18.8h\",\n        \"uqadd v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxub xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xdd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umax v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmaxub ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xde 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"umax v16.16b, v16.16b, v18.16b\",\n        \"umax v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxub ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xde 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"umax v16.16b, v17.16b, v16.16b\",\n        \"umax v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxub ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xde 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"umax v16.16b, v17.16b, v18.16b\",\n        \"umax v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpandn xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xdf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"bic v16.16b, v18.16b, v17.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpandn ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xdf 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"bic v16.16b, v18.16b, v17.16b\",\n        \"bic v2.16b, v3.16b, v2.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpavgb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xe0 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"urhadd v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpavgb ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xe0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"urhadd v16.16b, v17.16b, v16.16b\",\n        \"urhadd v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpavgb ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xe0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"urhadd v16.16b, v16.16b, v18.16b\",\n        \"urhadd v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpavgb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xe0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"urhadd v16.16b, v17.16b, v18.16b\",\n        \"urhadd v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsraw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0xe1 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.8h, v0.h[0]\",\n        \"neg v0.8h, v0.8h\",\n        \"sshl v16.8h, v17.8h, v0.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsraw ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 1 0b01 0xe1 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.8h, v0.h[0]\",\n        \"neg v0.8h, v0.8h\",\n        \"sshl v16.8h, v17.8h, v0.8h\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.8h, v0.h[0]\",\n        \"neg v0.8h, v0.8h\",\n        \"sshl v2.8h, v2.8h, v0.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsrad xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0xe2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.4s, v0.s[0]\",\n        \"neg v0.4s, v0.4s\",\n        \"sshl v16.4s, v17.4s, v0.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrad ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 1 0b01 0xe2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.4s, v0.s[0]\",\n        \"neg v0.4s, v0.4s\",\n        \"sshl v16.4s, v17.4s, v0.4s\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.4s, v0.s[0]\",\n        \"neg v0.4s, v0.4s\",\n        \"sshl v2.4s, v2.4s, v0.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpavgw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xe3 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"urhadd v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpavgw ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xe3 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"urhadd v16.8h, v17.8h, v16.8h\",\n        \"urhadd v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpavgw ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xe3 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"urhadd v16.8h, v16.8h, v18.8h\",\n        \"urhadd v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpavgw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xe3 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"urhadd v16.8h, v17.8h, v18.8h\",\n        \"urhadd v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmulhuw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xe4 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umull2 v0.4s, v17.8h, v18.8h\",\n        \"umull v16.4s, v17.4h, v18.4h\",\n        \"uzp2 v16.8h, v16.8h, v0.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmulhuw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 1 0b01 0xe4 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"umull2 v0.4s, v17.8h, v18.8h\",\n        \"umull v16.4s, v17.4h, v18.4h\",\n        \"uzp2 v16.8h, v16.8h, v0.8h\",\n        \"umull2 v0.4s, v2.8h, v3.8h\",\n        \"umull v2.4s, v2.4h, v3.4h\",\n        \"uzp2 v2.8h, v2.8h, v0.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmulhw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xe5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smull2 v0.4s, v17.8h, v18.8h\",\n        \"smull v16.4s, v17.4h, v18.4h\",\n        \"uzp2 v16.8h, v16.8h, v0.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmulhw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 1 0b01 0xe5 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"smull2 v0.4s, v17.8h, v18.8h\",\n        \"smull v16.4s, v17.4h, v18.4h\",\n        \"uzp2 v16.8h, v16.8h, v0.8h\",\n        \"smull2 v0.4s, v2.8h, v3.8h\",\n        \"smull v2.4s, v2.4h, v3.4h\",\n        \"uzp2 v2.8h, v2.8h, v0.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcvttpd2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xe6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32z v2.2d, v17.2d\",\n        \"fcvtzs v2.2d, v2.2d\",\n        \"xtn v16.2s, v2.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvttpd2dq xmm0, ymm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 1 0b01 0xe6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"frint32z v3.2d, v17.2d\",\n        \"fcvtzs v3.2d, v3.2d\",\n        \"xtn v3.2s, v3.2d\",\n        \"frint32z v2.2d, v2.2d\",\n        \"fcvtzs v2.2d, v2.2d\",\n        \"xtn v2.2s, v2.2d\",\n        \"zip1 v16.2d, v3.2d, v2.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtdq2pd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0xe6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.2d, v17.2s\",\n        \"scvtf v16.2d, v2.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtdq2pd ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b10 0xe6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.2d, v17.2s\",\n        \"scvtf v16.2d, v2.2d\",\n        \"sxtl2 v2.2d, v17.4s\",\n        \"scvtf v2.2d, v2.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vcvtpd2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0xe6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32x v2.2d, v17.2d\",\n        \"fcvtzs v2.2d, v2.2d\",\n        \"xtn v16.2s, v2.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtpd2dq xmm0, ymm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 1 0b11 0xe6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"frint32x v3.2d, v17.2d\",\n        \"fcvtzs v3.2d, v3.2d\",\n        \"xtn v3.2s, v3.2d\",\n        \"frint32x v2.2d, v2.2d\",\n        \"fcvtzs v2.2d, v2.2d\",\n        \"xtn v2.2s, v2.2d\",\n        \"zip1 v16.2d, v3.2d, v2.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovntdq [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xe7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"vmovntdq [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xe7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"stnp q16, q2, [x4]\"\n      ]\n    },\n    \"vpsubsb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xe8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqsub v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsubsb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xe8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"sqsub v16.16b, v17.16b, v18.16b\",\n        \"sqsub v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsubsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xe9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqsub v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsubsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xe9 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"sqsub v16.8h, v17.8h, v18.8h\",\n        \"sqsub v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xea 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smin v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpminsw ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xea 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"smin v16.8h, v17.8h, v16.8h\",\n        \"smin v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminsw ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xea 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"smin v16.8h, v16.8h, v18.8h\",\n        \"smin v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xea 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"smin v16.8h, v17.8h, v18.8h\",\n        \"smin v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpor xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xeb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpor ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xeb 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"orr v16.16b, v17.16b, v18.16b\",\n        \"orr v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpaddsb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xec 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqadd v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpaddsb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xec 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"sqadd v16.16b, v17.16b, v18.16b\",\n        \"sqadd v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpaddsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xed 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqadd v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpaddsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xed 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"sqadd v16.8h, v17.8h, v18.8h\",\n        \"sqadd v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xee 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smax v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmaxsw ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xee 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"smax v16.8h, v17.8h, v16.8h\",\n        \"smax v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxsw ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xee 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"smax v16.8h, v16.8h, v18.8h\",\n        \"smax v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xee 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"smax v16.8h, v17.8h, v18.8h\",\n        \"smax v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpxor xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xef 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpxor ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xef 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"eor v16.16b, v17.16b, v18.16b\",\n        \"eor v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpxor xmm0, xmm1, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"xor with itself to get zero register\",\n        \"Map 1 0b01 0xef 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpxor ymm0, ymm1, ymm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"xor with itself to get zero register\",\n        \"Map 1 0b01 0xef 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vlddqu xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0xf0 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vlddqu ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0xf0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldp q16, q2, [x4]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsllw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xf1 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.8h, v0.h[0]\",\n        \"ushl v16.8h, v17.8h, v0.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsllw ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 1 0b01 0xf1 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.8h, v0.h[0]\",\n        \"ushl v16.8h, v17.8h, v0.8h\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.8h, v0.h[0]\",\n        \"ushl v2.8h, v2.8h, v0.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpslld xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xf2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.4s, v0.s[0]\",\n        \"ushl v16.4s, v17.4s, v0.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpslld ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 1 0b01 0xf2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.4s, v0.s[0]\",\n        \"ushl v16.4s, v17.4s, v0.4s\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.4s, v0.s[0]\",\n        \"ushl v2.4s, v2.4s, v0.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsllq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xf3 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.2d, v0.d[0]\",\n        \"ushl v16.2d, v17.2d, v0.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsllq ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 1 0b01 0xf3 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.2d, v0.d[0]\",\n        \"ushl v16.2d, v17.2d, v0.2d\",\n        \"uqshl d0, d18, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.2d, v0.d[0]\",\n        \"ushl v2.2d, v2.2d, v0.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmuludq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xf4 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.4s, v17.4s, v17.4s\",\n        \"uzp1 v3.4s, v18.4s, v18.4s\",\n        \"umull v16.2d, v2.2s, v3.2s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmuludq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 1 0b01 0xf4 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"uzp1 v4.4s, v17.4s, v17.4s\",\n        \"uzp1 v5.4s, v18.4s, v18.4s\",\n        \"umull v16.2d, v4.2s, v5.2s\",\n        \"uzp1 v2.4s, v2.4s, v2.4s\",\n        \"uzp1 v3.4s, v3.4s, v3.4s\",\n        \"umull v2.2d, v2.2s, v3.2s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaddwd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xf5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smull v2.4s, v17.4h, v18.4h\",\n        \"smull2 v3.4s, v17.8h, v18.8h\",\n        \"addp v16.4s, v2.4s, v3.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmaddwd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 1 0b01 0xf5 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"smull v4.4s, v17.4h, v18.4h\",\n        \"smull2 v5.4s, v17.8h, v18.8h\",\n        \"addp v16.4s, v4.4s, v5.4s\",\n        \"smull v4.4s, v2.4h, v3.4h\",\n        \"smull2 v2.4s, v2.8h, v3.8h\",\n        \"addp v2.4s, v4.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsadbw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0xf6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uabdl v2.8h, v17.8b, v18.8b\",\n        \"uabdl2 v3.8h, v17.16b, v18.16b\",\n        \"addv h2, v2.8h\",\n        \"addv h3, v3.8h\",\n        \"zip1 v16.2d, v2.2d, v3.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsadbw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 1 0b01 0xf6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"uabdl v4.8h, v17.8b, v18.8b\",\n        \"uabdl2 v5.8h, v17.16b, v18.16b\",\n        \"addv h4, v4.8h\",\n        \"addv h5, v5.8h\",\n        \"zip1 v16.2d, v4.2d, v5.2d\",\n        \"uabdl v4.8h, v2.8b, v3.8b\",\n        \"uabdl2 v2.8h, v2.16b, v3.16b\",\n        \"addv h3, v4.8h\",\n        \"addv h2, v2.8h\",\n        \"zip1 v2.2d, v3.2d, v2.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmaskmovdqu xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xf7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmlt v2.16b, v17.16b, #0\",\n        \"ldr q3, [x11]\",\n        \"bsl v2.16b, v16.16b, v3.16b\",\n        \"str q2, [x11]\"\n      ]\n    },\n    \"vpsubb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xf8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsubb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xf8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"sub v16.16b, v17.16b, v18.16b\",\n        \"sub v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsubw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xf9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsubw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xf9 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"sub v16.8h, v17.8h, v18.8h\",\n        \"sub v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsubd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xfa 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsubd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xfa 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"sub v16.4s, v17.4s, v18.4s\",\n        \"sub v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsubq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xfb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsubq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xfb 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"sub v16.2d, v17.2d, v18.2d\",\n        \"sub v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpaddb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xfc 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpaddb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xfc 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"add v16.16b, v17.16b, v18.16b\",\n        \"add v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpaddw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xfd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpaddw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xfd 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"add v16.8h, v17.8h, v18.8h\",\n        \"add v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpaddd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xfe 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpaddd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xfe 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"add v16.4s, v17.4s, v18.4s\",\n        \"add v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AVX128/VEX_map1_FCMA.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"AFP\",\n      \"FCMA\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE256\",\n      \"SVE128\"\n    ]\n  },\n  \"Instructions\": {\n    \"vaddsubpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xd0 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ext v2.16b, v18.16b, v18.16b, #8\",\n        \"fcadd v16.2d, v17.2d, v2.2d, #90\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vaddsubpd ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"ext v4.16b, v18.16b, v18.16b, #8\",\n        \"fcadd v16.2d, v16.2d, v4.2d, #90\",\n        \"ext v3.16b, v3.16b, v3.16b, #8\",\n        \"fcadd v2.2d, v2.2d, v3.2d, #90\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vaddsubpd ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"ext v4.16b, v16.16b, v16.16b, #8\",\n        \"fcadd v16.2d, v17.2d, v4.2d, #90\",\n        \"ext v3.16b, v3.16b, v3.16b, #8\",\n        \"fcadd v2.2d, v2.2d, v3.2d, #90\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vaddsubpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b01 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ext v4.16b, v18.16b, v18.16b, #8\",\n        \"fcadd v16.2d, v17.2d, v4.2d, #90\",\n        \"ext v3.16b, v3.16b, v3.16b, #8\",\n        \"fcadd v2.2d, v2.2d, v3.2d, #90\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vaddsubps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0xd0 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"rev64 v2.4s, v18.4s\",\n        \"fcadd v16.4s, v17.4s, v2.4s, #90\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vaddsubps ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b11 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"rev64 v4.4s, v16.4s\",\n        \"fcadd v16.4s, v17.4s, v4.4s, #90\",\n        \"rev64 v3.4s, v3.4s\",\n        \"fcadd v2.4s, v2.4s, v3.4s, #90\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vaddsubps ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b11 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"rev64 v4.4s, v18.4s\",\n        \"fcadd v16.4s, v16.4s, v4.4s, #90\",\n        \"rev64 v3.4s, v3.4s\",\n        \"fcadd v2.4s, v2.4s, v3.4s, #90\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vaddsubps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b11 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"rev64 v4.4s, v18.4s\",\n        \"fcadd v16.4s, v17.4s, v4.4s, #90\",\n        \"rev64 v3.4s, v3.4s\",\n        \"fcadd v2.4s, v2.4s, v3.4s, #90\",\n        \"str q2, [x28, #192]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AVX128/VEX_map1_SVE128.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"SVE256\"\n    ]\n  },\n  \"Instructions\": {\n    \"vmovntps [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x2B 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stnt1b {z16.b}, p6, [x4]\"\n      ]\n    },\n    \"vmovntps [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x2B 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"stnp q16, q2, [x4]\"\n      ]\n    },\n    \"vmovntpd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x2B 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stnt1b {z16.b}, p6, [x4]\"\n      ]\n    },\n    \"vmovntpd [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x2B 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"stnp q16, q2, [x4]\"\n      ]\n    },\n    \"vmovntdq [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xe7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stnt1b {z16.b}, p6, [x4]\"\n      ]\n    },\n    \"vmovntdq [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xe7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"stnp q16, q2, [x4]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AVX128/VEX_map1_flagm.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"AFP\",\n      \"SVE128\",\n      \"SVE256\"\n    ]\n  },\n  \"Instructions\": {\n    \"vucomiss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0x2e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp s16, s17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"axflag\"\n      ]\n    },\n    \"vucomisd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x2e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp d16, d17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"axflag\"\n      ]\n    },\n    \"vcomiss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0x2f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp s16, s17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"axflag\"\n      ]\n    },\n    \"vcomisd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x2f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp d16, d17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"axflag\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AVX128/VEX_map2.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"SVE128\",\n      \"SVE256\"\n    ]\n  },\n  \"Instructions\": {\n    \"vpshufb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x00 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.16b, #0x8f\",\n        \"and v2.16b, v18.16b, v2.16b\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpshufb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.16b, #0x8f\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"and v5.16b, v18.16b, v2.16b\",\n        \"tbl v16.16b, {v17.16b}, v5.16b\",\n        \"and v2.16b, v4.16b, v2.16b\",\n        \"tbl v2.16b, {v3.16b}, v2.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vphaddw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x01 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"addp v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vphaddw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x01 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"addp v16.8h, v17.8h, v18.8h\",\n        \"addp v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vphaddd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"addp v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vphaddd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x02 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"addp v16.4s, v17.4s, v18.4s\",\n        \"addp v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vphaddsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x03 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.8h, v17.8h, v18.8h\",\n        \"uzp2 v3.8h, v17.8h, v18.8h\",\n        \"sqadd v16.8h, v2.8h, v3.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vphaddsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x03 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"uzp1 v4.8h, v17.8h, v18.8h\",\n        \"uzp2 v5.8h, v17.8h, v18.8h\",\n        \"sqadd v16.8h, v4.8h, v5.8h\",\n        \"uzp1 v4.8h, v2.8h, v3.8h\",\n        \"uzp2 v2.8h, v2.8h, v3.8h\",\n        \"sqadd v2.8h, v4.8h, v2.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaddubsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0x04 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v2.8h, v17.8b\",\n        \"sxtl v3.8h, v18.8b\",\n        \"mul v2.8h, v2.8h, v3.8h\",\n        \"uxtl2 v3.8h, v17.16b\",\n        \"sxtl2 v4.8h, v18.16b\",\n        \"mul v3.8h, v3.8h, v4.8h\",\n        \"uzp1 v4.8h, v2.8h, v3.8h\",\n        \"uzp2 v2.8h, v2.8h, v3.8h\",\n        \"sqadd v16.8h, v4.8h, v2.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmaddubsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"Map 2 0b01 0x04 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"uxtl v4.8h, v17.8b\",\n        \"sxtl v5.8h, v18.8b\",\n        \"mul v4.8h, v4.8h, v5.8h\",\n        \"uxtl2 v5.8h, v17.16b\",\n        \"sxtl2 v6.8h, v18.16b\",\n        \"mul v5.8h, v5.8h, v6.8h\",\n        \"uzp1 v6.8h, v4.8h, v5.8h\",\n        \"uzp2 v4.8h, v4.8h, v5.8h\",\n        \"sqadd v16.8h, v6.8h, v4.8h\",\n        \"uxtl v4.8h, v2.8b\",\n        \"sxtl v5.8h, v3.8b\",\n        \"mul v4.8h, v4.8h, v5.8h\",\n        \"uxtl2 v2.8h, v2.16b\",\n        \"sxtl2 v3.8h, v3.16b\",\n        \"mul v2.8h, v2.8h, v3.8h\",\n        \"uzp1 v3.8h, v4.8h, v2.8h\",\n        \"uzp2 v2.8h, v4.8h, v2.8h\",\n        \"sqadd v2.8h, v3.8h, v2.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vphsubw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x05 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.8h, v17.8h, v18.8h\",\n        \"uzp2 v3.8h, v17.8h, v18.8h\",\n        \"sub v16.8h, v2.8h, v3.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vphsubw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"uzp1 v4.8h, v17.8h, v18.8h\",\n        \"uzp2 v5.8h, v17.8h, v18.8h\",\n        \"sub v16.8h, v4.8h, v5.8h\",\n        \"uzp1 v4.8h, v2.8h, v3.8h\",\n        \"uzp2 v2.8h, v2.8h, v3.8h\",\n        \"sub v2.8h, v4.8h, v2.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vphsubd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x06 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.4s, v17.4s, v18.4s\",\n        \"uzp2 v3.4s, v17.4s, v18.4s\",\n        \"sub v16.4s, v2.4s, v3.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vphsubd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"uzp1 v4.4s, v17.4s, v18.4s\",\n        \"uzp2 v5.4s, v17.4s, v18.4s\",\n        \"sub v16.4s, v4.4s, v5.4s\",\n        \"uzp1 v4.4s, v2.4s, v3.4s\",\n        \"uzp2 v2.4s, v2.4s, v3.4s\",\n        \"sub v2.4s, v4.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vphsubsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x07 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.8h, v17.8h, v18.8h\",\n        \"uzp2 v3.8h, v17.8h, v18.8h\",\n        \"sqsub v16.8h, v2.8h, v3.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vphsubsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x07 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"uzp1 v4.8h, v17.8h, v18.8h\",\n        \"uzp2 v5.8h, v17.8h, v18.8h\",\n        \"sqsub v16.8h, v4.8h, v5.8h\",\n        \"uzp1 v4.8h, v2.8h, v3.8h\",\n        \"uzp2 v2.8h, v2.8h, v3.8h\",\n        \"sqsub v2.8h, v4.8h, v2.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsignb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x08 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqshl v2.16b, v18.16b, #7\",\n        \"srshr v2.16b, v2.16b, #7\",\n        \"mul v16.16b, v17.16b, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsignb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x08 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"sqshl v4.16b, v18.16b, #7\",\n        \"srshr v4.16b, v4.16b, #7\",\n        \"mul v16.16b, v17.16b, v4.16b\",\n        \"sqshl v3.16b, v3.16b, #7\",\n        \"srshr v3.16b, v3.16b, #7\",\n        \"mul v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsignw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x09 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqshl v2.8h, v18.8h, #15\",\n        \"srshr v2.8h, v2.8h, #15\",\n        \"mul v16.8h, v17.8h, v2.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsignw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x09 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"sqshl v4.8h, v18.8h, #15\",\n        \"srshr v4.8h, v4.8h, #15\",\n        \"mul v16.8h, v17.8h, v4.8h\",\n        \"sqshl v3.8h, v3.8h, #15\",\n        \"srshr v3.8h, v3.8h, #15\",\n        \"mul v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsignd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqshl v2.4s, v18.4s, #31\",\n        \"srshr v2.4s, v2.4s, #31\",\n        \"mul v16.4s, v17.4s, v2.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsignd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x0a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"sqshl v4.4s, v18.4s, #31\",\n        \"srshr v4.4s, v4.4s, #31\",\n        \"mul v16.4s, v17.4s, v4.4s\",\n        \"sqshl v3.4s, v3.4s, #31\",\n        \"srshr v3.4s, v3.4s, #31\",\n        \"mul v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmulhrsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smull v2.4s, v17.4h, v18.4h\",\n        \"smull2 v3.4s, v17.8h, v18.8h\",\n        \"sshr v2.4s, v2.4s, #14\",\n        \"sshr v3.4s, v3.4s, #14\",\n        \"movi v4.4s, #0x1\",\n        \"add v2.4s, v2.4s, v4.4s\",\n        \"add v3.4s, v3.4s, v4.4s\",\n        \"shrn v2.4h, v2.4s, #1\",\n        \"mov v0.16b, v2.16b\",\n        \"shrn2 v0.8h, v3.4s, #1\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmulhrsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"Map 2 0b01 0x0b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"smull v4.4s, v17.4h, v18.4h\",\n        \"smull2 v5.4s, v17.8h, v18.8h\",\n        \"sshr v4.4s, v4.4s, #14\",\n        \"sshr v5.4s, v5.4s, #14\",\n        \"movi v6.4s, #0x1\",\n        \"add v4.4s, v4.4s, v6.4s\",\n        \"add v5.4s, v5.4s, v6.4s\",\n        \"shrn v4.4h, v4.4s, #1\",\n        \"mov v0.16b, v4.16b\",\n        \"shrn2 v0.8h, v5.4s, #1\",\n        \"mov v16.16b, v0.16b\",\n        \"smull v4.4s, v2.4h, v3.4h\",\n        \"smull2 v2.4s, v2.8h, v3.8h\",\n        \"sshr v4.4s, v4.4s, #14\",\n        \"sshr v2.4s, v2.4s, #14\",\n        \"movi v3.4s, #0x1\",\n        \"add v4.4s, v4.4s, v3.4s\",\n        \"add v2.4s, v2.4s, v3.4s\",\n        \"shrn v4.4h, v4.4s, #1\",\n        \"shrn2 v4.8h, v2.4s, #1\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vpermilps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x0c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.4s, #0x3\",\n        \"and v2.16b, v18.16b, v2.16b\",\n        \"trn1 v2.16b, v2.16b, v2.16b\",\n        \"trn1 v2.8h, v2.8h, v2.8h\",\n        \"shl v2.16b, v2.16b, #2\",\n        \"mov w20, #0x100\",\n        \"movk w20, #0x302, lsl #16\",\n        \"dup v3.4s, w20\",\n        \"add v2.16b, v3.16b, v2.16b\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpermilps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"Map 2 0b01 0x0c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"movi v4.4s, #0x3\",\n        \"and v4.16b, v18.16b, v4.16b\",\n        \"trn1 v4.16b, v4.16b, v4.16b\",\n        \"trn1 v4.8h, v4.8h, v4.8h\",\n        \"shl v4.16b, v4.16b, #2\",\n        \"mov w20, #0x100\",\n        \"movk w20, #0x302, lsl #16\",\n        \"dup v5.4s, w20\",\n        \"add v4.16b, v5.16b, v4.16b\",\n        \"tbl v16.16b, {v17.16b}, v4.16b\",\n        \"movi v4.4s, #0x3\",\n        \"and v3.16b, v3.16b, v4.16b\",\n        \"trn1 v3.16b, v3.16b, v3.16b\",\n        \"trn1 v3.8h, v3.8h, v3.8h\",\n        \"shl v3.16b, v3.16b, #2\",\n        \"dup v4.4s, w20\",\n        \"add v3.16b, v4.16b, v3.16b\",\n        \"tbl v2.16b, {v2.16b}, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x0d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ushr v2.2d, v18.2d, #1\",\n        \"mov w0, #0x1\",\n        \"dup v3.2d, x0\",\n        \"and v2.16b, v2.16b, v3.16b\",\n        \"trn1 v2.16b, v2.16b, v2.16b\",\n        \"trn1 v2.8h, v2.8h, v2.8h\",\n        \"trn1 v2.4s, v2.4s, v2.4s\",\n        \"shl v2.16b, v2.16b, #3\",\n        \"mov x20, #0x100\",\n        \"movk x20, #0x302, lsl #16\",\n        \"movk x20, #0x504, lsl #32\",\n        \"movk x20, #0x706, lsl #48\",\n        \"dup v3.2d, x20\",\n        \"add v2.16b, v3.16b, v2.16b\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"Map 2 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ushr v4.2d, v18.2d, #1\",\n        \"mov w0, #0x1\",\n        \"dup v5.2d, x0\",\n        \"and v4.16b, v4.16b, v5.16b\",\n        \"trn1 v4.16b, v4.16b, v4.16b\",\n        \"trn1 v4.8h, v4.8h, v4.8h\",\n        \"trn1 v4.4s, v4.4s, v4.4s\",\n        \"shl v4.16b, v4.16b, #3\",\n        \"mov x20, #0x100\",\n        \"movk x20, #0x302, lsl #16\",\n        \"movk x20, #0x504, lsl #32\",\n        \"movk x20, #0x706, lsl #48\",\n        \"dup v5.2d, x20\",\n        \"add v4.16b, v5.16b, v4.16b\",\n        \"tbl v16.16b, {v17.16b}, v4.16b\",\n        \"ushr v3.2d, v3.2d, #1\",\n        \"mov w0, #0x1\",\n        \"dup v4.2d, x0\",\n        \"and v3.16b, v3.16b, v4.16b\",\n        \"trn1 v3.16b, v3.16b, v3.16b\",\n        \"trn1 v3.8h, v3.8h, v3.8h\",\n        \"trn1 v3.4s, v3.4s, v3.4s\",\n        \"shl v3.16b, v3.16b, #3\",\n        \"dup v4.2d, x20\",\n        \"add v3.16b, v4.16b, v3.16b\",\n        \"tbl v2.16b, {v2.16b}, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vtestps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 2 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80000000\",\n        \"dup v2.4s, w20\",\n        \"and v3.16b, v17.16b, v16.16b\",\n        \"bic v4.16b, v17.16b, v16.16b\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"and v2.16b, v4.16b, v2.16b\",\n        \"umaxv h3, v3.8h\",\n        \"umaxv h2, v2.8h\",\n        \"umov w20, v3.h[0]\",\n        \"umov w21, v2.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"mov w26, #0x1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vtestps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"Map 2 0b01 0x0e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"and v4.16b, v17.16b, v16.16b\",\n        \"and v5.16b, v3.16b, v2.16b\",\n        \"ushr v4.4s, v4.4s, #31\",\n        \"ushr v5.4s, v5.4s, #31\",\n        \"add v4.4s, v5.4s, v4.4s\",\n        \"addv s4, v4.4s\",\n        \"mov w20, v4.s[0]\",\n        \"bic v4.16b, v17.16b, v16.16b\",\n        \"bic v2.16b, v3.16b, v2.16b\",\n        \"ushr v4.4s, v4.4s, #31\",\n        \"ushr v2.4s, v2.4s, #31\",\n        \"add v2.4s, v2.4s, v4.4s\",\n        \"addv s2, v2.4s\",\n        \"mov w21, v2.s[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"mov w26, #0x1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vtestpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 2 0b01 0x0f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x8000000000000000\",\n        \"dup v2.2d, x20\",\n        \"and v3.16b, v17.16b, v16.16b\",\n        \"bic v4.16b, v17.16b, v16.16b\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"and v2.16b, v4.16b, v2.16b\",\n        \"umaxv h3, v3.8h\",\n        \"umaxv h2, v2.8h\",\n        \"umov w20, v3.h[0]\",\n        \"umov w21, v2.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"mov w26, #0x1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vtestpd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"Map 2 0b01 0x0f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"and v4.16b, v17.16b, v16.16b\",\n        \"and v5.16b, v3.16b, v2.16b\",\n        \"ushr v4.2d, v4.2d, #63\",\n        \"ushr v5.2d, v5.2d, #63\",\n        \"add v4.2d, v5.2d, v4.2d\",\n        \"addp v4.2d, v4.2d, v4.2d\",\n        \"mov x20, v4.d[0]\",\n        \"bic v4.16b, v17.16b, v16.16b\",\n        \"bic v2.16b, v3.16b, v2.16b\",\n        \"ushr v4.2d, v4.2d, #63\",\n        \"ushr v2.2d, v2.2d, #63\",\n        \"add v2.2d, v2.2d, v4.2d\",\n        \"addp v2.2d, v2.2d, v2.2d\",\n        \"mov x21, v2.d[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"mov w26, #0x1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vcvtph2ps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x13 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvtl v16.4s, v17.4h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtph2ps ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x13 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvtl v16.4s, v17.4h\",\n        \"fcvtl2 v2.4s, v17.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"Map 2 0b01 0x16 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"movi v4.4s, #0x7\",\n        \"mov w20, #0x100\",\n        \"movk w20, #0x302, lsl #16\",\n        \"dup v5.4s, w20\",\n        \"and v6.16b, v17.16b, v4.16b\",\n        \"trn1 v6.16b, v6.16b, v6.16b\",\n        \"trn1 v6.8h, v6.8h, v6.8h\",\n        \"shl v6.16b, v6.16b, #2\",\n        \"add v6.16b, v6.16b, v5.16b\",\n        \"mov v0.16b, v18.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"tbl v16.16b, {v0.16b, v1.16b}, v6.16b\",\n        \"and v2.16b, v2.16b, v4.16b\",\n        \"trn1 v2.16b, v2.16b, v2.16b\",\n        \"trn1 v2.8h, v2.8h, v2.8h\",\n        \"shl v2.16b, v2.16b, #2\",\n        \"add v2.16b, v2.16b, v5.16b\",\n        \"mov v0.16b, v18.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"tbl v2.16b, {v0.16b, v1.16b}, v2.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vptest xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and v2.16b, v16.16b, v17.16b\",\n        \"bic v3.16b, v17.16b, v16.16b\",\n        \"umaxv h2, v2.8h\",\n        \"umaxv h3, v3.8h\",\n        \"umov w20, v2.h[0]\",\n        \"umov w21, v3.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"mov w26, #0x1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vptest ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"Map 2 0b01 0x16 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"and v4.16b, v16.16b, v17.16b\",\n        \"bic v5.16b, v17.16b, v16.16b\",\n        \"and v6.16b, v2.16b, v3.16b\",\n        \"bic v2.16b, v3.16b, v2.16b\",\n        \"umax v3.8h, v4.8h, v6.8h\",\n        \"umax v2.8h, v5.8h, v2.8h\",\n        \"umaxv h3, v3.8h\",\n        \"umaxv h2, v2.8h\",\n        \"umov w20, v3.h[0]\",\n        \"umov w21, v2.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"mov w26, #0x1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vbroadcastss xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x18 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.4s}, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vbroadcastss ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x18 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.4s}, [x4]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vbroadcastsd ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x19 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.2d}, [x4]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vbroadcastf128 ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x1a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpabsb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x1c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"abs v16.16b, v17.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpabsb ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x1c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"abs v16.16b, v17.16b\",\n        \"abs v2.16b, v2.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpabsw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x1d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"abs v16.8h, v17.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpabsw ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x1d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"abs v16.8h, v17.8h\",\n        \"abs v2.8h, v2.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpabsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x1e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"abs v16.4s, v17.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpabsd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x1e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"abs v16.4s, v17.4s\",\n        \"abs v2.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmovsxbw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x20 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v16.8h, v17.8b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmovsxbw ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x20 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.2d, v17.d[1]\",\n        \"sxtl v16.8h, v17.8b\",\n        \"sxtl v2.8h, v2.8b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmovsxbd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x21 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.8h, v17.8b\",\n        \"sxtl v16.4s, v2.4h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmovsxbd ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x21 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[1]\",\n        \"sxtl v3.8h, v17.8b\",\n        \"sxtl v16.4s, v3.4h\",\n        \"sxtl v2.8h, v2.8b\",\n        \"sxtl v2.4s, v2.4h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmovsxbq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x22 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.8h, v17.8b\",\n        \"sxtl v2.4s, v2.4h\",\n        \"sxtl v16.2d, v2.2s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmovsxbq ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x22 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.8h, v17.h[1]\",\n        \"sxtl v3.8h, v17.8b\",\n        \"sxtl v3.4s, v3.4h\",\n        \"sxtl v16.2d, v3.2s\",\n        \"sxtl v2.8h, v2.8b\",\n        \"sxtl v2.4s, v2.4h\",\n        \"sxtl v2.2d, v2.2s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmovsxwd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x23 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v16.4s, v17.4h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmovsxwd ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x23 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.2d, v17.d[1]\",\n        \"sxtl v16.4s, v17.4h\",\n        \"sxtl v2.4s, v2.4h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmovsxwq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x24 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.4s, v17.4h\",\n        \"sxtl v16.2d, v2.2s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmovsxwq ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x24 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[1]\",\n        \"sxtl v3.4s, v17.4h\",\n        \"sxtl v16.2d, v3.2s\",\n        \"sxtl v2.4s, v2.4h\",\n        \"sxtl v2.2d, v2.2s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmovsxdq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x25 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v16.2d, v17.2s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmovsxdq ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x25 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.2d, v17.d[1]\",\n        \"sxtl v16.2d, v17.2s\",\n        \"sxtl v2.2d, v2.2s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmuldq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x28 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.4s, v17.4s, v17.4s\",\n        \"uzp1 v3.4s, v18.4s, v18.4s\",\n        \"smull v16.2d, v2.2s, v3.2s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmuldq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x28 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"uzp1 v4.4s, v17.4s, v17.4s\",\n        \"uzp1 v5.4s, v18.4s, v18.4s\",\n        \"smull v16.2d, v4.2s, v5.2s\",\n        \"uzp1 v2.4s, v2.4s, v2.4s\",\n        \"uzp1 v3.4s, v3.4s, v3.4s\",\n        \"smull v2.2d, v2.2s, v3.2s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpcmpeqq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x29 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmeq v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpcmpeqq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x29 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"cmeq v16.2d, v17.2d, v18.2d\",\n        \"cmeq v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmovntdqa xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x2a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovntdqa ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x2a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\",\n        \"ldr q2, [x4, #16]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpackusdw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x2b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqxtun v16.4h, v17.4s\",\n        \"sqxtun2 v16.8h, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpackusdw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b01 0x2b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"sqxtun v16.4h, v17.4s\",\n        \"sqxtun2 v16.8h, v18.4s\",\n        \"sqxtun v2.4h, v2.4s\",\n        \"sqxtun2 v2.8h, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmaskmovps xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 2 0b01 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.2d, #0x0\",\n        \"mov w0, v17.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v17.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[3], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmaskmovps ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 37,\n      \"Comment\": [\n        \"Map 2 0b01 0x2c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v0.2d, #0x0\",\n        \"mov w0, v17.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v17.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[3], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"movi v0.2d, #0x0\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov w0, v2.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[0], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[3], [x1]\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmaskmovpd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.2d, #0x0\",\n        \"mov x0, v17.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v17.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[1], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmaskmovpd ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"Map 2 0b01 0x2d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v0.2d, #0x0\",\n        \"mov x0, v17.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v17.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[1], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"movi v0.2d, #0x0\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov x0, v2.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[0], [x1]\",\n        \"add x1, x1, #0x8 (8)\",\n        \"mov x0, v2.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[1], [x1]\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmaskmovps [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x2e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, v16.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v16.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[3], [x1]\"\n      ]\n    },\n    \"vmaskmovps [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"Map 2 0b01 0x2e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"mov w0, v16.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v16.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[3], [x1]\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov w0, v2.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[0], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[3], [x1]\"\n      ]\n    },\n    \"vmaskmovpd [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b01 0x2f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v16.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v16.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[1], [x1]\"\n      ]\n    },\n    \"vmaskmovpd [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x2f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"mov x0, v16.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v16.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[1], [x1]\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov x0, v2.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v3.d}[0], [x1]\",\n        \"add x1, x1, #0x8 (8)\",\n        \"mov x0, v2.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v3.d}[1], [x1]\"\n      ]\n    },\n    \"vpmovzxbw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x30 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v16.8h, v17.8b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmovzxbw ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x30 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.2d, v17.d[1]\",\n        \"uxtl v16.8h, v17.8b\",\n        \"uxtl v2.8h, v2.8b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmovzxbd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x31 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v2.8h, v17.8b\",\n        \"uxtl v16.4s, v2.4h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmovzxbd ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x31 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[1]\",\n        \"uxtl v3.8h, v17.8b\",\n        \"uxtl v16.4s, v3.4h\",\n        \"uxtl v2.8h, v2.8b\",\n        \"uxtl v2.4s, v2.4h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmovzxbq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x32 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v2.8h, v17.8b\",\n        \"uxtl v2.4s, v2.4h\",\n        \"uxtl v16.2d, v2.2s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmovzxbq ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x32 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.8h, v17.h[1]\",\n        \"uxtl v3.8h, v17.8b\",\n        \"uxtl v3.4s, v3.4h\",\n        \"uxtl v16.2d, v3.2s\",\n        \"uxtl v2.8h, v2.8b\",\n        \"uxtl v2.4s, v2.4h\",\n        \"uxtl v2.2d, v2.2s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmovzxwd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x33 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v16.4s, v17.4h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmovzxwd ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x33 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.2d, v17.d[1]\",\n        \"uxtl v16.4s, v17.4h\",\n        \"uxtl v2.4s, v2.4h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmovzxwq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x34 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v2.4s, v17.4h\",\n        \"uxtl v16.2d, v2.2s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmovzxwq ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x34 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[1]\",\n        \"uxtl v3.4s, v17.4h\",\n        \"uxtl v16.2d, v3.2s\",\n        \"uxtl v2.4s, v2.4h\",\n        \"uxtl v2.2d, v2.2s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmovzxdq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x35 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v16.2d, v17.2s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmovzxdq ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x35 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.2d, v17.d[1]\",\n        \"uxtl v16.2d, v17.2s\",\n        \"uxtl v2.2d, v2.2s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"Map 2 0b01 0x36 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"movi v4.4s, #0x7\",\n        \"mov w20, #0x100\",\n        \"movk w20, #0x302, lsl #16\",\n        \"dup v5.4s, w20\",\n        \"and v6.16b, v17.16b, v4.16b\",\n        \"trn1 v6.16b, v6.16b, v6.16b\",\n        \"trn1 v6.8h, v6.8h, v6.8h\",\n        \"shl v6.16b, v6.16b, #2\",\n        \"add v6.16b, v6.16b, v5.16b\",\n        \"mov v0.16b, v18.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"tbl v16.16b, {v0.16b, v1.16b}, v6.16b\",\n        \"and v2.16b, v2.16b, v4.16b\",\n        \"trn1 v2.16b, v2.16b, v2.16b\",\n        \"trn1 v2.8h, v2.8h, v2.8h\",\n        \"shl v2.16b, v2.16b, #2\",\n        \"add v2.16b, v2.16b, v5.16b\",\n        \"mov v0.16b, v18.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"tbl v2.16b, {v0.16b, v1.16b}, v2.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpcmpgtq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x37 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmgt v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpcmpgtq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x37 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"cmgt v16.2d, v17.2d, v18.2d\",\n        \"cmgt v2.2d, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminsb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x38 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smin v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpminsb ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x38 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"smin v16.16b, v17.16b, v16.16b\",\n        \"smin v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminsb ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x38 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"smin v16.16b, v16.16b, v18.16b\",\n        \"smin v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminsb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x38 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"smin v16.16b, v17.16b, v18.16b\",\n        \"smin v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x39 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smin v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpminsd ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x39 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"smin v16.4s, v17.4s, v16.4s\",\n        \"smin v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminsd ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x39 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"smin v16.4s, v16.4s, v18.4s\",\n        \"smin v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminsd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x39 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"smin v16.4s, v17.4s, v18.4s\",\n        \"smin v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminuw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x3a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umin v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpminuw ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"umin v16.8h, v17.8h, v16.8h\",\n        \"umin v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminuw ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"umin v16.8h, v16.8h, v18.8h\",\n        \"umin v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminuw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x3a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"umin v16.8h, v17.8h, v18.8h\",\n        \"umin v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminud xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x3b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umin v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpminud ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"umin v16.4s, v17.4s, v16.4s\",\n        \"umin v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminud ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"umin v16.4s, v16.4s, v18.4s\",\n        \"umin v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpminud ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x3b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"umin v16.4s, v17.4s, v18.4s\",\n        \"umin v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxsb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x3c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smax v16.16b, v17.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmaxsb ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"smax v16.16b, v16.16b, v18.16b\",\n        \"smax v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxsb ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x3c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"smax v16.16b, v17.16b, v16.16b\",\n        \"smax v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxsb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x3c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"smax v16.16b, v17.16b, v18.16b\",\n        \"smax v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x3d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smax v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmaxsd ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"smax v16.4s, v17.4s, v16.4s\",\n        \"smax v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxsd ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"smax v16.4s, v16.4s, v18.4s\",\n        \"smax v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxsd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x3d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"smax v16.4s, v17.4s, v18.4s\",\n        \"smax v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxuw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x3e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umax v16.8h, v17.8h, v18.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmaxuw ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"umax v16.8h, v17.8h, v16.8h\",\n        \"umax v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxuw ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"umax v16.8h, v16.8h, v18.8h\",\n        \"umax v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxuw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x3e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"umax v16.8h, v17.8h, v18.8h\",\n        \"umax v2.8h, v2.8h, v3.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxud xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x3f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umax v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmaxud ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"umax v16.4s, v16.4s, v18.4s\",\n        \"umax v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxud ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x3f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #192]\",\n        \"umax v16.4s, v17.4s, v16.4s\",\n        \"umax v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaxud ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x3f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"umax v16.4s, v17.4s, v18.4s\",\n        \"umax v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmulld xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mul v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmulld ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x40 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"mul v16.4s, v17.4s, v18.4s\",\n        \"mul v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vphminposuw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b01 0x41 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3008]\",\n        \"zip1 v3.8h, v2.8h, v17.8h\",\n        \"zip2 v2.8h, v2.8h, v17.8h\",\n        \"umin v2.4s, v3.4s, v2.4s\",\n        \"uminv s2, v2.4s\",\n        \"rev32 v16.8h, v2.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrlvd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x45 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.4s, #0x20\",\n        \"umin v0.4s, v0.4s, v18.4s\",\n        \"neg v0.4s, v0.4s\",\n        \"ushl v16.4s, v17.4s, v0.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrlvd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x45 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"movi v0.4s, #0x20\",\n        \"umin v0.4s, v0.4s, v18.4s\",\n        \"neg v0.4s, v0.4s\",\n        \"ushl v16.4s, v17.4s, v0.4s\",\n        \"movi v0.4s, #0x20\",\n        \"umin v0.4s, v0.4s, v3.4s\",\n        \"neg v0.4s, v0.4s\",\n        \"ushl v2.4s, v2.4s, v0.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsrlvq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b01 0x45 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, #0x40\",\n        \"dup v0.2d, x0\",\n        \"cmhi v1.2d, v18.2d, v0.2d\",\n        \"bif v0.16b, v18.16b, v1.16b\",\n        \"neg v0.2d, v0.2d\",\n        \"ushl v16.2d, v17.2d, v0.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrlvq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x45 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov w0, #0x40\",\n        \"dup v0.2d, x0\",\n        \"cmhi v1.2d, v18.2d, v0.2d\",\n        \"bif v0.16b, v18.16b, v1.16b\",\n        \"neg v0.2d, v0.2d\",\n        \"ushl v16.2d, v17.2d, v0.2d\",\n        \"mov w0, #0x40\",\n        \"dup v0.2d, x0\",\n        \"cmhi v1.2d, v3.2d, v0.2d\",\n        \"bif v0.16b, v3.16b, v1.16b\",\n        \"neg v0.2d, v0.2d\",\n        \"ushl v2.2d, v2.2d, v0.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsravd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x46 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.4s, #0x1f\",\n        \"umin v0.4s, v0.4s, v18.4s\",\n        \"neg v0.4s, v0.4s\",\n        \"sshl v16.4s, v17.4s, v0.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsravd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"movi v0.4s, #0x1f\",\n        \"umin v0.4s, v0.4s, v18.4s\",\n        \"neg v0.4s, v0.4s\",\n        \"sshl v16.4s, v17.4s, v0.4s\",\n        \"movi v0.4s, #0x1f\",\n        \"umin v0.4s, v0.4s, v3.4s\",\n        \"neg v0.4s, v0.4s\",\n        \"sshl v2.4s, v2.4s, v0.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsllvd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x47 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.4s, #0x20\",\n        \"umin v0.4s, v0.4s, v18.4s\",\n        \"ushl v16.4s, v17.4s, v0.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsllvd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x47 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"movi v0.4s, #0x20\",\n        \"umin v0.4s, v0.4s, v18.4s\",\n        \"ushl v16.4s, v17.4s, v0.4s\",\n        \"movi v0.4s, #0x20\",\n        \"umin v0.4s, v0.4s, v3.4s\",\n        \"ushl v2.4s, v2.4s, v0.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsllvq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x47 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, #0x40\",\n        \"dup v0.2d, x0\",\n        \"cmhi v1.2d, v18.2d, v0.2d\",\n        \"bif v0.16b, v18.16b, v1.16b\",\n        \"ushl v16.2d, v17.2d, v0.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsllvq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x47 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov w0, #0x40\",\n        \"dup v0.2d, x0\",\n        \"cmhi v1.2d, v18.2d, v0.2d\",\n        \"bif v0.16b, v18.16b, v1.16b\",\n        \"ushl v16.2d, v17.2d, v0.2d\",\n        \"mov w0, #0x40\",\n        \"dup v0.2d, x0\",\n        \"cmhi v1.2d, v3.2d, v0.2d\",\n        \"bif v0.16b, v3.16b, v1.16b\",\n        \"ushl v2.2d, v2.2d, v0.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x58 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.4s, v17.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x58 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.4s}, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastd ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x58 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.4s, v17.s[0]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastd ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x58 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.4s}, [x4]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x59 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.2d, v17.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastq xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x59 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.2d}, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastq ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x59 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.2d, v17.d[0]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastq ymm0, [rax]\": {\n      \"ExpectedInstructiqonCount\": -1,\n      \"Comment\": [\n        \"Map 2 0b01 0x59 256-bit\"\n      ],\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.2d}, [x4]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vbroadcasti128 ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x5a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x78 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.16b, v17.b[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastb xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x78 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.16b}, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastb ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x78 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.16b, v17.b[0]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastb ymm0, [rax]\": {\n      \"ExpectedInstructiqonCount\": -1,\n      \"Comment\": [\n        \"Map 2 0b01 0x78 256-bit\"\n      ],\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.16b}, [x4]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x79 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.8h, v17.h[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastw xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x79 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.8h}, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastw ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x79 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.8h, v17.h[0]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpbroadcastw ymm0, [rax]\": {\n      \"ExpectedInstructiqonCount\": -1,\n      \"Comment\": [\n        \"Map 2 0b01 0x79 256-bit\"\n      ],\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.8h}, [x4]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpmaskmovd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.2d, #0x0\",\n        \"mov w0, v17.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v17.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[3], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmaskmovd ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 37,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v0.2d, #0x0\",\n        \"mov w0, v17.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v17.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[3], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"movi v0.2d, #0x0\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov w0, v2.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[0], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[3], [x1]\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaskmovq xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.2d, #0x0\",\n        \"mov x0, v17.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v17.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[1], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmaskmovq ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v0.2d, #0x0\",\n        \"mov x0, v17.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v17.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[1], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"movi v0.2d, #0x0\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov x0, v2.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[0], [x1]\",\n        \"add x1, x1, #0x8 (8)\",\n        \"mov x0, v2.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[1], [x1]\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaskmovd [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, v16.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v16.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[3], [x1]\"\n      ]\n    },\n    \"vpmaskmovd [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"mov w0, v16.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v16.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[3], [x1]\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov w0, v2.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[0], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[3], [x1]\"\n      ]\n    },\n    \"vpmaskmovq [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v16.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v16.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[1], [x1]\"\n      ]\n    },\n    \"vpmaskmovq [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"mov x0, v16.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v16.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[1], [x1]\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov x0, v2.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v3.d}[0], [x1]\",\n        \"add x1, x1, #0x8 (8)\",\n        \"mov x0, v2.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v3.d}[1], [x1]\"\n      ]\n    },\n    \"vpgatherdd xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 46,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"mov w0, v4.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[0]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v4.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[1]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v4.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[2]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v4.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[3]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 46,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"mov w0, v4.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v4.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v4.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[2]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v4.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[3]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 46,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"mov w0, v4.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[0]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v4.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[1]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v4.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[2]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v4.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[3]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 46,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"mov w0, v4.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v4.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v4.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[2]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v4.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[3]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v3.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v3.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v3.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v3.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v3.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v3.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v3.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v3.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v4.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v4.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v4.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v4.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v4.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v4.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v4.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v4.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 46,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"mov w0, v4.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[0]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v4.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[1]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v4.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[2]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v4.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[3]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 46,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"mov w0, v4.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v4.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v4.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[2]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v4.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[3]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 46,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"mov w0, v4.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[0]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v4.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[1]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v4.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[2]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v4.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[3]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 46,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"mov w0, v4.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v4.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v4.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[2]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v4.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v3.s[3]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v3.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v3.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v3.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v3.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v3.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v3.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #2\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v3.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v3.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v4.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v4.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v4.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v4.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v4.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v4.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov x0, v18.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.d}[0], [x1]\",\n        \"mov x0, v18.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v16.d}[1], [x1]\",\n        \"mov x0, v4.d[0]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v2.d}[0], [x1]\",\n        \"mov x0, v4.d[1]\",\n        \"tbz x0, #63, #+0x10\",\n        \"mov x0, v3.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v2.d}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x96 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3040]\",\n        \"eor v2.16b, v17.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x96 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3040]\",\n        \"eor v6.16b, v17.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v3.16b, v3.16b, v5.16b\",\n        \"fmla v3.4s, v2.4s, v4.4s\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x96 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3072]\",\n        \"eor v2.16b, v17.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x96 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3072]\",\n        \"eor v6.16b, v17.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v3.16b, v3.16b, v5.16b\",\n        \"fmla v3.2d, v2.2d, v4.2d\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x97 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3104]\",\n        \"eor v2.16b, v17.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x97 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3104]\",\n        \"eor v6.16b, v17.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v3.16b, v3.16b, v5.16b\",\n        \"fmla v3.4s, v2.4s, v4.4s\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x97 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3136]\",\n        \"eor v2.16b, v17.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x97 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3136]\",\n        \"eor v6.16b, v17.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v3.16b, v3.16b, v5.16b\",\n        \"fmla v3.2d, v2.2d, v4.2d\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmadd132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x98 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v17.16b\",\n        \"fmla v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x98 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v17.16b\",\n        \"fmla v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"fmla v3.4s, v2.4s, v4.4s\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmadd132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x98 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v17.16b\",\n        \"fmla v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x98 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v17.16b\",\n        \"fmla v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"fmla v3.2d, v2.2d, v4.2d\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmadd132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x99 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd s0, s16, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x99 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd d0, d16, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x9a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fneg v0.4s, v17.4s\",\n        \"fmla v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x9a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fneg v0.4s, v17.4s\",\n        \"fmla v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"fneg v3.4s, v3.4s\",\n        \"fmla v3.4s, v2.4s, v4.4s\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmsub132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x9a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fneg v0.2d, v17.2d\",\n        \"fmla v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x9a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fneg v0.2d, v17.2d\",\n        \"fmla v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"fneg v3.2d, v3.2d\",\n        \"fmla v3.2d, v2.2d, v4.2d\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmsub132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub s0, s16, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub d0, d16, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x9c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v17.16b\",\n        \"fmls v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x9c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v17.16b\",\n        \"fmls v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"fmls v3.4s, v2.4s, v4.4s\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x9c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v17.16b\",\n        \"fmls v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x9c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v17.16b\",\n        \"fmls v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"fmls v3.2d, v2.2d, v4.2d\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub s0, s16, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub d0, d16, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x9e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fneg v0.4s, v17.4s\",\n        \"fmls v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x9e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fneg v0.4s, v17.4s\",\n        \"fmls v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"fneg v3.4s, v3.4s\",\n        \"fmls v3.4s, v2.4s, v4.4s\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x9e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fneg v0.2d, v17.2d\",\n        \"fmls v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x9e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fneg v0.2d, v17.2d\",\n        \"fmls v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"fneg v3.2d, v3.2d\",\n        \"fmls v3.2d, v2.2d, v4.2d\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd s0, s16, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd d0, d16, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xa8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v18.16b\",\n        \"fmla v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xa8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v18.16b\",\n        \"fmla v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"fmla v4.4s, v3.4s, v2.4s\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmadd213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xa8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v18.16b\",\n        \"fmla v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xa8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v18.16b\",\n        \"fmla v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"fmla v4.2d, v3.2d, v2.2d\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmadd213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xa9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd s0, s17, s16, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xa9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd d0, d17, d16, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xaa 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fneg v0.4s, v18.4s\",\n        \"fmla v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0xaa 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fneg v0.4s, v18.4s\",\n        \"fmla v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"fneg v4.4s, v4.4s\",\n        \"fmla v4.4s, v3.4s, v2.4s\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmsub213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xaa 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fneg v0.2d, v18.2d\",\n        \"fmla v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0xaa 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fneg v0.2d, v18.2d\",\n        \"fmla v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"fneg v4.2d, v4.2d\",\n        \"fmla v4.2d, v3.2d, v2.2d\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmsub213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xab 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub s0, s17, s16, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xab 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub d0, d17, d16, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xac 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v18.16b\",\n        \"fmls v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xac 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v18.16b\",\n        \"fmls v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"fmls v4.4s, v3.4s, v2.4s\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xac 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v18.16b\",\n        \"fmls v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xac 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v18.16b\",\n        \"fmls v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"fmls v4.2d, v3.2d, v2.2d\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xad 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub s0, s17, s16, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xad 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub d0, d17, d16, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xae 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fneg v0.4s, v18.4s\",\n        \"fmls v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0xae 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fneg v0.4s, v18.4s\",\n        \"fmls v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"fneg v4.4s, v4.4s\",\n        \"fmls v4.4s, v3.4s, v2.4s\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xae 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fneg v0.2d, v18.2d\",\n        \"fmls v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0xae 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fneg v0.2d, v18.2d\",\n        \"fmls v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"fneg v4.2d, v4.2d\",\n        \"fmls v4.2d, v3.2d, v2.2d\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xaf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd s0, s17, s16, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xaf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd d0, d17, d16, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xb8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmla v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xb8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fmla v16.4s, v17.4s, v18.4s\",\n        \"fmla v2.4s, v3.4s, v4.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmadd231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xb8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmla v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xb8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fmla v16.2d, v17.2d, v18.2d\",\n        \"fmla v2.2d, v3.2d, v4.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmadd231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xb9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd s0, s17, s18, s16\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xb9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd d0, d17, d18, d16\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xba 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fneg v16.4s, v16.4s\",\n        \"fmla v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xba 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fneg v16.4s, v16.4s\",\n        \"fmla v16.4s, v17.4s, v18.4s\",\n        \"fneg v2.4s, v2.4s\",\n        \"fmla v2.4s, v3.4s, v4.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmsub231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xba 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fneg v16.2d, v16.2d\",\n        \"fmla v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xba 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fneg v16.2d, v16.2d\",\n        \"fmla v16.2d, v17.2d, v18.2d\",\n        \"fneg v2.2d, v2.2d\",\n        \"fmla v2.2d, v3.2d, v4.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmsub231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub s0, s17, s18, s16\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub d0, d17, d18, d16\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xbc 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmls v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xbc 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fmls v16.4s, v17.4s, v18.4s\",\n        \"fmls v2.4s, v3.4s, v4.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xbc 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmls v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xbc 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fmls v16.2d, v17.2d, v18.2d\",\n        \"fmls v2.2d, v3.2d, v4.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub s0, s17, s18, s16\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub d0, d17, d18, d16\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbe 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fneg v16.4s, v16.4s\",\n        \"fmls v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xbe 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fneg v16.4s, v16.4s\",\n        \"fmls v16.4s, v17.4s, v18.4s\",\n        \"fneg v2.4s, v2.4s\",\n        \"fmls v2.4s, v3.4s, v4.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbe 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fneg v16.2d, v16.2d\",\n        \"fmls v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xbe 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fneg v16.2d, v16.2d\",\n        \"fmls v16.2d, v17.2d, v18.2d\",\n        \"fneg v2.2d, v2.2d\",\n        \"fmls v2.2d, v3.2d, v4.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd s0, s17, s18, s16\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd d0, d17, d18, d16\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xa6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3040]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0xa6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3040]\",\n        \"eor v6.16b, v18.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v4.16b, v4.16b, v5.16b\",\n        \"fmla v4.4s, v3.4s, v2.4s\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xa6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3072]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0xa6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3072]\",\n        \"eor v6.16b, v18.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v4.16b, v4.16b, v5.16b\",\n        \"fmla v4.2d, v3.2d, v2.2d\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xa7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3104]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0xa7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3104]\",\n        \"eor v6.16b, v18.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v4.16b, v4.16b, v5.16b\",\n        \"fmla v4.4s, v3.4s, v2.4s\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xa7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3136]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0xa7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3136]\",\n        \"eor v6.16b, v18.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v4.16b, v4.16b, v5.16b\",\n        \"fmla v4.2d, v3.2d, v2.2d\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xb6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3040]\",\n        \"eor v2.16b, v16.16b, v2.16b\",\n        \"mov v16.16b, v2.16b\",\n        \"fmla v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0xb6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3040]\",\n        \"eor v6.16b, v16.16b, v5.16b\",\n        \"mov v16.16b, v6.16b\",\n        \"fmla v16.4s, v17.4s, v18.4s\",\n        \"eor v2.16b, v2.16b, v5.16b\",\n        \"fmla v2.4s, v3.4s, v4.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xb6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3072]\",\n        \"eor v2.16b, v16.16b, v2.16b\",\n        \"mov v16.16b, v2.16b\",\n        \"fmla v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0xb6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3072]\",\n        \"eor v6.16b, v16.16b, v5.16b\",\n        \"mov v16.16b, v6.16b\",\n        \"fmla v16.2d, v17.2d, v18.2d\",\n        \"eor v2.16b, v2.16b, v5.16b\",\n        \"fmla v2.2d, v3.2d, v4.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xb7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3104]\",\n        \"eor v2.16b, v16.16b, v2.16b\",\n        \"mov v16.16b, v2.16b\",\n        \"fmla v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0xb7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3104]\",\n        \"eor v6.16b, v16.16b, v5.16b\",\n        \"mov v16.16b, v6.16b\",\n        \"fmla v16.4s, v17.4s, v18.4s\",\n        \"eor v2.16b, v2.16b, v5.16b\",\n        \"fmla v2.4s, v3.4s, v4.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xb7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3136]\",\n        \"eor v2.16b, v16.16b, v2.16b\",\n        \"mov v16.16b, v2.16b\",\n        \"fmla v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0xb7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3136]\",\n        \"eor v6.16b, v16.16b, v5.16b\",\n        \"mov v16.16b, v6.16b\",\n        \"fmla v16.2d, v17.2d, v18.2d\",\n        \"eor v2.16b, v2.16b, v5.16b\",\n        \"fmla v2.2d, v3.2d, v4.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vaesimc xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xdb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"aesimc v16.16b, v17.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vaesenc xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xdc 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v0.16b, v17.16b\",\n        \"aese v0.16b, v2.16b\",\n        \"aesmc v0.16b, v0.16b\",\n        \"eor v16.16b, v0.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vaesenc ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0xdc 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v17.16b\",\n        \"aese v0.16b, v2.16b\",\n        \"aesmc v0.16b, v0.16b\",\n        \"eor v16.16b, v0.16b, v18.16b\",\n        \"mov v0.16b, v3.16b\",\n        \"aese v0.16b, v2.16b\",\n        \"aesmc v0.16b, v0.16b\",\n        \"eor v2.16b, v0.16b, v4.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vaesenclast xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xdd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v0.16b, v17.16b\",\n        \"aese v0.16b, v2.16b\",\n        \"eor v16.16b, v0.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vaesenclast ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0xdd 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v17.16b\",\n        \"aese v0.16b, v2.16b\",\n        \"eor v16.16b, v0.16b, v18.16b\",\n        \"mov v0.16b, v3.16b\",\n        \"aese v0.16b, v2.16b\",\n        \"eor v2.16b, v0.16b, v4.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vaesdec xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xde 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v0.16b, v17.16b\",\n        \"aesd v0.16b, v2.16b\",\n        \"aesimc v0.16b, v0.16b\",\n        \"eor v16.16b, v0.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vaesdec ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0xde 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v17.16b\",\n        \"aesd v0.16b, v2.16b\",\n        \"aesimc v0.16b, v0.16b\",\n        \"eor v16.16b, v0.16b, v18.16b\",\n        \"mov v0.16b, v3.16b\",\n        \"aesd v0.16b, v2.16b\",\n        \"aesimc v0.16b, v0.16b\",\n        \"eor v2.16b, v0.16b, v4.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vaesdeclast xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xdf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v0.16b, v17.16b\",\n        \"aesd v0.16b, v2.16b\",\n        \"eor v16.16b, v0.16b, v18.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vaesdeclast ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0xdf 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v17.16b\",\n        \"aesd v0.16b, v2.16b\",\n        \"eor v16.16b, v0.16b, v18.16b\",\n        \"mov v0.16b, v3.16b\",\n        \"aesd v0.16b, v2.16b\",\n        \"eor v2.16b, v0.16b, v4.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AVX128/VEX_map2_AFP.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"AFP\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE256\",\n      \"SVE128\"\n    ]\n  },\n  \"Instructions\": {\n    \"vfmadd132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x99 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd s0, s16, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x99 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd d0, d16, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub s0, s16, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub d0, d16, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub s0, s16, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub d0, d16, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd s0, s16, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd d0, d16, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xa9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd s0, s17, s16, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xa9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd d0, d17, d16, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xab 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub s0, s17, s16, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xab 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub d0, d17, d16, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xad 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub s0, s17, s16, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xad 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub d0, d17, d16, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xaf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd s0, s17, s16, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xaf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd d0, d17, d16, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xb9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd s16, s17, s18, s16\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xb9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd d16, d17, d18, d16\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xbb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub s16, s17, s18, s16\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xbb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub d16, d17, d18, d16\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xbd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub s16, s17, s18, s16\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xbd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub d16, d17, d18, d16\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xbf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd s16, s17, s18, s16\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xbf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd d16, d17, d18, d16\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AVX128/VEX_map2_SVE128.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"SVE256\"\n    ]\n  },\n  \"Instructions\": {\n    \"vmovntdqa xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x2a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldnt1b {z16.b}, p6/z, [x4]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmovntdqa ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x2a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldnt1b {z16.b}, p6/z, [x4]\",\n        \"ldnt1b {z2.b}, p6/z, [x4, #1, mul vl]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmaskmovps xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z17.s, #0\",\n        \"ld1w {z16.s}, p0/z, [x4]\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmaskmovps ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x2c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z17.s, #0\",\n        \"ld1w {z16.s}, p0/z, [x4]\",\n        \"cmplt p0.s, p6/z, z2.s, #0\",\n        \"ld1w {z2.s}, p0/z, [x4, #1, mul vl]\",\n        \"msr nzcv, x20\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmaskmovpd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z17.d, #0\",\n        \"ld1d {z16.d}, p0/z, [x4]\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmaskmovpd ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x2d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z17.d, #0\",\n        \"ld1d {z16.d}, p0/z, [x4]\",\n        \"cmplt p0.d, p6/z, z2.d, #0\",\n        \"ld1d {z2.d}, p0/z, [x4, #1, mul vl]\",\n        \"msr nzcv, x20\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmaskmovps [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x2e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z16.s, #0\",\n        \"st1w {z17.s}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovps [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x2e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z16.s, #0\",\n        \"st1w {z17.s}, p0, [x4]\",\n        \"cmplt p0.s, p6/z, z2.s, #0\",\n        \"st1w {z3.s}, p0, [x4, #1, mul vl]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovpd [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x2f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z16.d, #0\",\n        \"st1d {z17.d}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovpd [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x2f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z16.d, #0\",\n        \"st1d {z17.d}, p0, [x4]\",\n        \"cmplt p0.d, p6/z, z2.d, #0\",\n        \"st1d {z3.d}, p0, [x4, #1, mul vl]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdd xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll2 v2.2d, v17.4s, #1\",\n        \"sshll v3.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw #2]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll2 v2.2d, v17.4s, #3\",\n        \"sshll v3.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z3.s, sxtw]\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"sshll2 v5.2d, v17.4s, #1\",\n        \"sshll v6.2d, v17.2s, #1\",\n        \"sshll2 v7.2d, v3.4s, #1\",\n        \"sshll v3.2d, v3.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z6.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z5.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z7.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw #2]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z3.s, sxtw #2]\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"sshll2 v5.2d, v17.4s, #3\",\n        \"sshll v6.2d, v17.2s, #3\",\n        \"sshll2 v7.2d, v3.4s, #3\",\n        \"sshll v3.2d, v3.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z6.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z5.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z7.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.2d, v17.2s\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sxtl2 v4.2d, v17.4s\",\n        \"sxtl v5.2d, v17.2s\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sshll2 v4.2d, v17.4s, #1\",\n        \"sshll v5.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sshll2 v4.2d, v17.4s, #2\",\n        \"sshll v5.2d, v17.2s, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sshll2 v4.2d, v17.4s, #3\",\n        \"sshll v5.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z17.d]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z2.d]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z17.d, lsl #2]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z2.d]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z17.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"shl v3.2d, v17.2d, #1\",\n        \"shl v2.2d, v2.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z17.d, lsl #2]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z2.d, lsl #2]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"shl v3.2d, v17.2d, #3\",\n        \"shl v2.2d, v2.2d, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d, lsl #3]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z3.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"shl v5.2d, v17.2d, #1\",\n        \"shl v3.2d, v3.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z3.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"shl v5.2d, v17.2d, #2\",\n        \"shl v3.2d, v3.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z3.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d, lsl #3]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z3.d, lsl #3]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll2 v2.2d, v17.4s, #1\",\n        \"sshll v3.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw #2]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll2 v2.2d, v17.4s, #3\",\n        \"sshll v3.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z3.s, sxtw]\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"sshll2 v5.2d, v17.4s, #1\",\n        \"sshll v6.2d, v17.2s, #1\",\n        \"sshll2 v7.2d, v3.4s, #1\",\n        \"sshll v3.2d, v3.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z6.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z5.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z7.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw #2]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z3.s, sxtw #2]\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"sshll2 v5.2d, v17.4s, #3\",\n        \"sshll v6.2d, v17.2s, #3\",\n        \"sshll2 v7.2d, v3.4s, #3\",\n        \"sshll v3.2d, v3.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z6.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z5.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z7.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.2d, v17.2s\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sxtl2 v4.2d, v17.4s\",\n        \"sxtl v5.2d, v17.2s\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sshll2 v4.2d, v17.4s, #1\",\n        \"sshll v5.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sshll2 v4.2d, v17.4s, #2\",\n        \"sshll v5.2d, v17.2s, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sshll2 v4.2d, v17.4s, #3\",\n        \"sshll v5.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z17.d]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z2.d]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z17.d, lsl #2]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z2.d]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z17.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"shl v3.2d, v17.2d, #1\",\n        \"shl v2.2d, v2.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z17.d, lsl #2]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z2.d, lsl #2]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"shl v3.2d, v17.2d, #3\",\n        \"shl v2.2d, v2.2d, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [x4, z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [x4, z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d, lsl #3]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z3.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"shl v5.2d, v17.2d, #1\",\n        \"shl v3.2d, v3.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z3.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"shl v5.2d, v17.2d, #2\",\n        \"shl v3.2d, v3.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z3.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d, lsl #3]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z3.d, lsl #3]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd xmm0, [xmm1*2], xmm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll2 v2.2d, v17.4s, #1\",\n        \"sshll v3.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd xmm0, [xmm1*4], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"mov w0, #0x0\",\n        \"ld1w {z0.s}, p0/z, [x0, z17.s, sxtw #2]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd xmm0, [xmm1*8], xmm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll2 v2.2d, v17.4s, #3\",\n        \"sshll v3.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*1], ymm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [z17.s]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"ld1w {z0.s}, p0/z, [z3.s]\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*2], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"sshll2 v5.2d, v17.4s, #1\",\n        \"sshll v6.2d, v17.2s, #1\",\n        \"sshll2 v7.2d, v3.4s, #1\",\n        \"sshll v3.2d, v3.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z6.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z5.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z7.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*4], ymm2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"mov w0, #0x0\",\n        \"ld1w {z0.s}, p0/z, [x0, z17.s, sxtw #2]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"mov w0, #0x0\",\n        \"ld1w {z0.s}, p0/z, [x0, z3.s, sxtw #2]\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*8], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"sshll2 v5.2d, v17.4s, #3\",\n        \"sshll v6.2d, v17.2s, #3\",\n        \"sshll2 v7.2d, v3.4s, #3\",\n        \"sshll v3.2d, v3.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z6.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z5.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z7.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*1], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.2d, v17.2s\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*2], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*4], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*8], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*1], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sxtl2 v4.2d, v17.4s\",\n        \"sxtl v5.2d, v17.2s\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*2], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sshll2 v4.2d, v17.4s, #1\",\n        \"sshll v5.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*4], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sshll2 v4.2d, v17.4s, #2\",\n        \"sshll v5.2d, v17.2s, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*8], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sshll2 v4.2d, v17.4s, #3\",\n        \"sshll v5.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*1], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z17.d]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*2], xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z2.d]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*4], xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z2.d]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*8], xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z2.d]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*1], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z17.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*2], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"shl v3.2d, v17.2d, #1\",\n        \"shl v2.2d, v2.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*4], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"shl v3.2d, v17.2d, #2\",\n        \"shl v2.2d, v2.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*8], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"shl v3.2d, v17.2d, #3\",\n        \"shl v2.2d, v2.2d, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*1], xmm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z17.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*2], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*4], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*8], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"mov w0, #0x0\",\n        \"ld1d {z0.d}, p0/z, [x0, z17.d, lsl #3]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*1], ymm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z17.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z3.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*2], ymm2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"shl v5.2d, v17.2d, #1\",\n        \"shl v3.2d, v3.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z3.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*4], ymm2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"shl v5.2d, v17.2d, #2\",\n        \"shl v3.2d, v3.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z3.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*8], ymm2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"mov w0, #0x0\",\n        \"ld1d {z0.d}, p0/z, [x0, z17.d, lsl #3]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"mov w0, #0x0\",\n        \"ld1d {z0.d}, p0/z, [x0, z3.d, lsl #3]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*1], xmm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [z17.s]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*2], xmm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll2 v2.2d, v17.4s, #1\",\n        \"sshll v3.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*4], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"mov w0, #0x0\",\n        \"ld1w {z0.s}, p0/z, [x0, z17.s, sxtw #2]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*8], xmm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll2 v2.2d, v17.4s, #3\",\n        \"sshll v3.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*1], ymm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [z17.s]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"ld1w {z0.s}, p0/z, [z3.s]\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*2], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"sshll2 v5.2d, v17.4s, #1\",\n        \"sshll v6.2d, v17.2s, #1\",\n        \"sshll2 v7.2d, v3.4s, #1\",\n        \"sshll v3.2d, v3.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z6.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z5.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z7.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*4], ymm2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"mov w0, #0x0\",\n        \"ld1w {z0.s}, p0/z, [x0, z17.s, sxtw #2]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"mov w0, #0x0\",\n        \"ld1w {z0.s}, p0/z, [x0, z3.s, sxtw #2]\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*8], ymm2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"sshll2 v5.2d, v17.4s, #3\",\n        \"sshll v6.2d, v17.2s, #3\",\n        \"sshll2 v7.2d, v3.4s, #3\",\n        \"sshll v3.2d, v3.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z6.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z5.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"cmplt p0.s, p6/z, z4.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z7.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z2.s, p0/m, z0.s\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*1], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.2d, v17.2s\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*2], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*4], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*8], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*1], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sxtl2 v4.2d, v17.4s\",\n        \"sxtl v5.2d, v17.2s\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*2], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sshll2 v4.2d, v17.4s, #1\",\n        \"sshll v5.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*4], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sshll2 v4.2d, v17.4s, #2\",\n        \"sshll v5.2d, v17.2s, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*8], ymm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #224]\",\n        \"sshll2 v4.2d, v17.4s, #3\",\n        \"sshll v5.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*1], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z17.d]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*2], xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z2.d]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*4], xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z2.d]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*8], xmm2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z2.d]\",\n        \"xtn v0.2s, v0.2d\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v16.2d, v2.2d, v18.2d\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*1], xmm2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z17.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*2], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"shl v3.2d, v17.2d, #1\",\n        \"shl v2.2d, v2.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*4], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"shl v3.2d, v17.2d, #2\",\n        \"shl v2.2d, v2.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*8], xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"shl v3.2d, v17.2d, #3\",\n        \"shl v2.2d, v2.2d, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"punpklo p1.h, p0.b\",\n        \"ld1w {z0.d}, p1/z, [z3.d]\",\n        \"punpkhi p1.h, p0.b\",\n        \"ld1w {z1.d}, p1/z, [z2.d]\",\n        \"uzp1 v0.4s, v0.4s, v1.4s\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*1], xmm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z17.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*2], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*4], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z2.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*8], xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"mov w0, #0x0\",\n        \"ld1d {z0.d}, p0/z, [x0, z17.d, lsl #3]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*1], ymm2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z17.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z3.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*2], ymm2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"shl v5.2d, v17.2d, #1\",\n        \"shl v3.2d, v3.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z3.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*4], ymm2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"shl v5.2d, v17.2d, #2\",\n        \"shl v3.2d, v3.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z5.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"ld1d {z0.d}, p0/z, [z3.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*8], ymm2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"mov w0, #0x0\",\n        \"ld1d {z0.d}, p0/z, [x0, z17.d, lsl #3]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"cmplt p0.d, p6/z, z4.d, #0\",\n        \"mov w0, #0x0\",\n        \"ld1d {z0.d}, p0/z, [x0, z3.d, lsl #3]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\",\n        \"stp xzr, xzr, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x96 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3040]\",\n        \"eor v2.16b, v17.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x96 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3040]\",\n        \"eor v6.16b, v17.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v3.16b, v3.16b, v5.16b\",\n        \"fmla v3.4s, v2.4s, v4.4s\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x96 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3072]\",\n        \"eor v2.16b, v17.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x96 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3072]\",\n        \"eor v6.16b, v17.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v3.16b, v3.16b, v5.16b\",\n        \"fmla v3.2d, v2.2d, v4.2d\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x97 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3104]\",\n        \"eor v2.16b, v17.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x97 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3104]\",\n        \"eor v6.16b, v17.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v3.16b, v3.16b, v5.16b\",\n        \"fmla v3.4s, v2.4s, v4.4s\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x97 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3136]\",\n        \"eor v2.16b, v17.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x97 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3136]\",\n        \"eor v6.16b, v17.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v3.16b, v3.16b, v5.16b\",\n        \"fmla v3.2d, v2.2d, v4.2d\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmadd132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x98 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v17.16b\",\n        \"fmla v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x98 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v17.16b\",\n        \"fmla v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"fmla v3.4s, v2.4s, v4.4s\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmadd132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x98 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v17.16b\",\n        \"fmla v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x98 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v17.16b\",\n        \"fmla v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"fmla v3.2d, v2.2d, v4.2d\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmadd132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x99 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd s0, s16, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x99 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd d0, d16, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x9a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z17.d\",\n        \"fnmls z0.s, p6/m, z16.s, z18.s\",\n        \"mov z16.d, z0.d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x9a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov z0.d, z17.d\",\n        \"fnmls z0.s, p6/m, z16.s, z18.s\",\n        \"mov z16.d, z0.d\",\n        \"fnmls z3.s, p6/m, z2.s, z4.s\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmsub132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x9a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z17.d\",\n        \"fnmls z0.d, p6/m, z16.d, z18.d\",\n        \"mov z16.d, z0.d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x9a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov z0.d, z17.d\",\n        \"fnmls z0.d, p6/m, z16.d, z18.d\",\n        \"mov z16.d, z0.d\",\n        \"fnmls z3.d, p6/m, z2.d, z4.d\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfmsub132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub s0, s16, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub d0, d16, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x9c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v17.16b\",\n        \"fmls v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x9c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v17.16b\",\n        \"fmls v0.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"fmls v3.4s, v2.4s, v4.4s\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x9c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v17.16b\",\n        \"fmls v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x9c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v17.16b\",\n        \"fmls v0.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"fmls v3.2d, v2.2d, v4.2d\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub s0, s16, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub d0, d16, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x9e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z17.d\",\n        \"fnmla z0.s, p6/m, z16.s, z18.s\",\n        \"mov z16.d, z0.d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x9e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov z0.d, z17.d\",\n        \"fnmla z0.s, p6/m, z16.s, z18.s\",\n        \"mov z16.d, z0.d\",\n        \"fnmla z3.s, p6/m, z2.s, z4.s\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x9e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z17.d\",\n        \"fnmla z0.d, p6/m, z16.d, z18.d\",\n        \"mov z16.d, z0.d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0x9e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov z0.d, z17.d\",\n        \"fnmla z0.d, p6/m, z16.d, z18.d\",\n        \"mov z16.d, z0.d\",\n        \"fnmla z3.d, p6/m, z2.d, z4.d\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd s0, s16, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd d0, d16, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xa8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v18.16b\",\n        \"fmla v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xa8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v18.16b\",\n        \"fmla v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"fmla v4.4s, v3.4s, v2.4s\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmadd213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xa8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v18.16b\",\n        \"fmla v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xa8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v18.16b\",\n        \"fmla v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"fmla v4.2d, v3.2d, v2.2d\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmadd213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xa9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd s0, s17, s16, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xa9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd d0, d17, d16, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xaa 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z18.d\",\n        \"fnmls z0.s, p6/m, z17.s, z16.s\",\n        \"mov z16.d, z0.d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xaa 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov z0.d, z18.d\",\n        \"fnmls z0.s, p6/m, z17.s, z16.s\",\n        \"mov z16.d, z0.d\",\n        \"fnmls z4.s, p6/m, z3.s, z2.s\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmsub213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xaa 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z18.d\",\n        \"fnmls z0.d, p6/m, z17.d, z16.d\",\n        \"mov z16.d, z0.d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xaa 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov z0.d, z18.d\",\n        \"fnmls z0.d, p6/m, z17.d, z16.d\",\n        \"mov z16.d, z0.d\",\n        \"fnmls z4.d, p6/m, z3.d, z2.d\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmsub213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xab 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub s0, s17, s16, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xab 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub d0, d17, d16, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xac 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v18.16b\",\n        \"fmls v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xac 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v18.16b\",\n        \"fmls v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"fmls v4.4s, v3.4s, v2.4s\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xac 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v18.16b\",\n        \"fmls v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xac 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov v0.16b, v18.16b\",\n        \"fmls v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"fmls v4.2d, v3.2d, v2.2d\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xad 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub s0, s17, s16, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xad 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub d0, d17, d16, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xae 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z18.d\",\n        \"fnmla z0.s, p6/m, z17.s, z16.s\",\n        \"mov z16.d, z0.d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xae 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov z0.d, z18.d\",\n        \"fnmla z0.s, p6/m, z17.s, z16.s\",\n        \"mov z16.d, z0.d\",\n        \"fnmla z4.s, p6/m, z3.s, z2.s\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xae 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z18.d\",\n        \"fnmla z0.d, p6/m, z17.d, z16.d\",\n        \"mov z16.d, z0.d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b01 0xae 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"mov z0.d, z18.d\",\n        \"fnmla z0.d, p6/m, z17.d, z16.d\",\n        \"mov z16.d, z0.d\",\n        \"fnmla z4.d, p6/m, z3.d, z2.d\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xaf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd s0, s17, s16, s18\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xaf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd d0, d17, d16, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xb8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmla v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xb8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fmla v16.4s, v17.4s, v18.4s\",\n        \"fmla v2.4s, v3.4s, v4.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmadd231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xb8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmla v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xb8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fmla v16.2d, v17.2d, v18.2d\",\n        \"fmla v2.2d, v3.2d, v4.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmadd231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xb9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd s0, s17, s18, s16\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmadd231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xb9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmadd d0, d17, d18, d16\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xba 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmls z16.s, p6/m, z17.s, z18.s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xba 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fnmls z16.s, p6/m, z17.s, z18.s\",\n        \"fnmls z2.s, p6/m, z3.s, z4.s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmsub231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xba 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmls z16.d, p6/m, z17.d, z18.d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xba 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fnmls z16.d, p6/m, z17.d, z18.d\",\n        \"fnmls z2.d, p6/m, z3.d, z4.d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmsub231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub s0, s17, s18, s16\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsub231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmsub d0, d17, d18, d16\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xbc 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmls v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xbc 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fmls v16.4s, v17.4s, v18.4s\",\n        \"fmls v2.4s, v3.4s, v4.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xbc 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmls v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xbc 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fmls v16.2d, v17.2d, v18.2d\",\n        \"fmls v2.2d, v3.2d, v4.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub s0, s17, s18, s16\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmadd231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmsub d0, d17, d18, d16\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xbe 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmla z16.s, p6/m, z17.s, z18.s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xbe 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fnmla z16.s, p6/m, z17.s, z18.s\",\n        \"fnmla z2.s, p6/m, z3.s, z4.s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xbe 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmla z16.d, p6/m, z17.d, z18.d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xbe 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"fnmla z16.d, p6/m, z17.d, z18.d\",\n        \"fnmla z2.d, p6/m, z3.d, z4.d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd s0, s17, s18, s16\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfnmsub231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmadd d0, d17, d18, d16\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xa6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3040]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0xa6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3040]\",\n        \"eor v6.16b, v18.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v4.16b, v4.16b, v5.16b\",\n        \"fmla v4.4s, v3.4s, v2.4s\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xa6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3072]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0xa6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3072]\",\n        \"eor v6.16b, v18.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v4.16b, v4.16b, v5.16b\",\n        \"fmla v4.2d, v3.2d, v2.2d\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xa7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3104]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0xa7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3104]\",\n        \"eor v6.16b, v18.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v4.16b, v4.16b, v5.16b\",\n        \"fmla v4.4s, v3.4s, v2.4s\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xa7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3136]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"mov v0.16b, v2.16b\",\n        \"fmla v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0xa7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3136]\",\n        \"eor v6.16b, v18.16b, v5.16b\",\n        \"mov v0.16b, v6.16b\",\n        \"fmla v0.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v0.16b\",\n        \"eor v4.16b, v4.16b, v5.16b\",\n        \"fmla v4.2d, v3.2d, v2.2d\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xb6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3040]\",\n        \"eor v2.16b, v16.16b, v2.16b\",\n        \"mov v16.16b, v2.16b\",\n        \"fmla v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0xb6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3040]\",\n        \"eor v6.16b, v16.16b, v5.16b\",\n        \"mov v16.16b, v6.16b\",\n        \"fmla v16.4s, v17.4s, v18.4s\",\n        \"eor v2.16b, v2.16b, v5.16b\",\n        \"fmla v2.4s, v3.4s, v4.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xb6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3072]\",\n        \"eor v2.16b, v16.16b, v2.16b\",\n        \"mov v16.16b, v2.16b\",\n        \"fmla v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmaddsub231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0xb6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3072]\",\n        \"eor v6.16b, v16.16b, v5.16b\",\n        \"mov v16.16b, v6.16b\",\n        \"fmla v16.2d, v17.2d, v18.2d\",\n        \"eor v2.16b, v2.16b, v5.16b\",\n        \"fmla v2.2d, v3.2d, v4.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xb7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3104]\",\n        \"eor v2.16b, v16.16b, v2.16b\",\n        \"mov v16.16b, v2.16b\",\n        \"fmla v16.4s, v17.4s, v18.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0xb7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3104]\",\n        \"eor v6.16b, v16.16b, v5.16b\",\n        \"mov v16.16b, v6.16b\",\n        \"fmla v16.4s, v17.4s, v18.4s\",\n        \"eor v2.16b, v2.16b, v5.16b\",\n        \"fmla v2.4s, v3.4s, v4.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xb7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3136]\",\n        \"eor v2.16b, v16.16b, v2.16b\",\n        \"mov v16.16b, v2.16b\",\n        \"fmla v16.2d, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vfmsubadd231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0xb7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #3136]\",\n        \"eor v6.16b, v16.16b, v5.16b\",\n        \"mov v16.16b, v6.16b\",\n        \"fmla v16.2d, v17.2d, v18.2d\",\n        \"eor v2.16b, v2.16b, v5.16b\",\n        \"fmla v2.2d, v3.2d, v4.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AVX128/VEX_map2_flagm.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"AFP\",\n      \"SVE128\",\n      \"SVE256\",\n      \"SVEBITPERM\"\n    ]\n  },\n  \"Instructions\": {\n    \"vtestps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80000000\",\n        \"dup v2.4s, w20\",\n        \"and v3.16b, v17.16b, v16.16b\",\n        \"bic v4.16b, v17.16b, v16.16b\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"and v2.16b, v4.16b, v2.16b\",\n        \"umaxv h3, v3.8h\",\n        \"umaxv h2, v2.8h\",\n        \"umov w20, v3.h[0]\",\n        \"umov w21, v2.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"rmif x21, #63, #nzCv\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"vtestps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"Map 2 0b01 0x0e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"and v4.16b, v17.16b, v16.16b\",\n        \"and v5.16b, v3.16b, v2.16b\",\n        \"ushr v4.4s, v4.4s, #31\",\n        \"ushr v5.4s, v5.4s, #31\",\n        \"add v4.4s, v5.4s, v4.4s\",\n        \"addv s4, v4.4s\",\n        \"mov w20, v4.s[0]\",\n        \"bic v4.16b, v17.16b, v16.16b\",\n        \"bic v2.16b, v3.16b, v2.16b\",\n        \"ushr v4.4s, v4.4s, #31\",\n        \"ushr v2.4s, v2.4s, #31\",\n        \"add v2.4s, v2.4s, v4.4s\",\n        \"addv s2, v2.4s\",\n        \"mov w21, v2.s[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"rmif x21, #63, #nzCv\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"vtestpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x0f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x8000000000000000\",\n        \"dup v2.2d, x20\",\n        \"and v3.16b, v17.16b, v16.16b\",\n        \"bic v4.16b, v17.16b, v16.16b\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"and v2.16b, v4.16b, v2.16b\",\n        \"umaxv h3, v3.8h\",\n        \"umaxv h2, v2.8h\",\n        \"umov w20, v3.h[0]\",\n        \"umov w21, v2.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"rmif x21, #63, #nzCv\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"vtestpd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"Map 2 0b01 0x0f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"and v4.16b, v17.16b, v16.16b\",\n        \"and v5.16b, v3.16b, v2.16b\",\n        \"ushr v4.2d, v4.2d, #63\",\n        \"ushr v5.2d, v5.2d, #63\",\n        \"add v4.2d, v5.2d, v4.2d\",\n        \"addp v4.2d, v4.2d, v4.2d\",\n        \"mov x20, v4.d[0]\",\n        \"bic v4.16b, v17.16b, v16.16b\",\n        \"bic v2.16b, v3.16b, v2.16b\",\n        \"ushr v4.2d, v4.2d, #63\",\n        \"ushr v2.2d, v2.2d, #63\",\n        \"add v2.2d, v2.2d, v4.2d\",\n        \"addp v2.2d, v2.2d, v2.2d\",\n        \"mov x21, v2.d[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"rmif x21, #63, #nzCv\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"vptest xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and v2.16b, v16.16b, v17.16b\",\n        \"bic v3.16b, v17.16b, v16.16b\",\n        \"umaxv h2, v2.8h\",\n        \"umaxv h3, v3.8h\",\n        \"umov w20, v2.h[0]\",\n        \"umov w21, v3.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"rmif x21, #63, #nzCv\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"vptest ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 2 0b01 0x16 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"and v4.16b, v16.16b, v17.16b\",\n        \"bic v5.16b, v17.16b, v16.16b\",\n        \"and v6.16b, v2.16b, v3.16b\",\n        \"bic v2.16b, v3.16b, v2.16b\",\n        \"umax v3.8h, v4.8h, v6.8h\",\n        \"umax v2.8h, v5.8h, v2.8h\",\n        \"umaxv h3, v3.8h\",\n        \"umaxv h2, v2.8h\",\n        \"umov w20, v3.h[0]\",\n        \"umov w21, v2.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"rmif x21, #63, #nzCv\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"vmaskmovps xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 2 0b01 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.2d, #0x0\",\n        \"mov w0, v17.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v17.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[3], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmaskmovps ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 37,\n      \"Comment\": [\n        \"Map 2 0b01 0x2c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v0.2d, #0x0\",\n        \"mov w0, v17.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v17.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[3], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"movi v0.2d, #0x0\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov w0, v2.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[0], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[3], [x1]\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmaskmovpd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.2d, #0x0\",\n        \"mov x0, v17.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v17.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[1], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmaskmovpd ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"Map 2 0b01 0x2d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v0.2d, #0x0\",\n        \"mov x0, v17.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v17.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[1], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"movi v0.2d, #0x0\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov x0, v2.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[0], [x1]\",\n        \"add x1, x1, #0x8 (8)\",\n        \"mov x0, v2.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[1], [x1]\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmaskmovps [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x2e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, v16.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v16.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[3], [x1]\"\n      ]\n    },\n    \"vmaskmovps [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"Map 2 0b01 0x2e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"mov w0, v16.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v16.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[3], [x1]\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov w0, v2.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[0], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[3], [x1]\"\n      ]\n    },\n    \"vmaskmovpd [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b01 0x2f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v16.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v16.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[1], [x1]\"\n      ]\n    },\n    \"vmaskmovpd [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x2f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"mov x0, v16.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v16.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[1], [x1]\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov x0, v2.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v3.d}[0], [x1]\",\n        \"add x1, x1, #0x8 (8)\",\n        \"mov x0, v2.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v3.d}[1], [x1]\"\n      ]\n    },\n    \"vpmaskmovd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.2d, #0x0\",\n        \"mov w0, v17.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v17.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[3], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmaskmovd ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 37,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v0.2d, #0x0\",\n        \"mov w0, v17.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v17.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v17.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[3], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"movi v0.2d, #0x0\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov w0, v2.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[0], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"ld1 {v0.s}[3], [x1]\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaskmovq xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.2d, #0x0\",\n        \"mov x0, v17.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v17.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[1], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpmaskmovq ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v0.2d, #0x0\",\n        \"mov x0, v17.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v17.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[1], [x1]\",\n        \"mov v16.16b, v0.16b\",\n        \"movi v0.2d, #0x0\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov x0, v2.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[0], [x1]\",\n        \"add x1, x1, #0x8 (8)\",\n        \"mov x0, v2.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"ld1 {v0.d}[1], [x1]\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpmaskmovd [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, v16.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v16.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[3], [x1]\"\n      ]\n    },\n    \"vpmaskmovd [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"mov w0, v16.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[0], [x4]\",\n        \"add x1, x4, #0x4 (4)\",\n        \"mov w0, v16.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v16.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v17.s}[3], [x1]\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov w0, v2.s[0]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[0], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[1]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[1], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[2]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[2], [x1]\",\n        \"add x1, x1, #0x4 (4)\",\n        \"mov w0, v2.s[3]\",\n        \"tbz w0, #31, #+0x8\",\n        \"st1 {v3.s}[3], [x1]\"\n      ]\n    },\n    \"vpmaskmovq [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, v16.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v16.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[1], [x1]\"\n      ]\n    },\n    \"vpmaskmovq [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"mov x0, v16.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[0], [x4]\",\n        \"add x1, x4, #0x8 (8)\",\n        \"mov x0, v16.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v17.d}[1], [x1]\",\n        \"add x1, x4, #0x10 (16)\",\n        \"mov x0, v2.d[0]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v3.d}[0], [x1]\",\n        \"add x1, x1, #0x8 (8)\",\n        \"mov x0, v2.d[1]\",\n        \"tbz x0, #63, #+0x8\",\n        \"st1 {v3.d}[1], [x1]\"\n      ]\n    },\n    \"andn eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b00 0xf2 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"bic w4, w7, w6\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"andn rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b00 0xf2 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"bic x4, x7, x6\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"bzhi eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b00 0xf5 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"lsl w20, w20, w7\",\n        \"bic w20, w6, w20\",\n        \"tst x7, #0xe0\",\n        \"csel w4, w6, w20, ne\",\n        \"cset x20, eq\",\n        \"cmp w4, #0x0 (0)\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bzhi rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b00 0xf5 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"lsl x20, x20, x7\",\n        \"bic x20, x6, x20\",\n        \"tst x7, #0xc0\",\n        \"csel x4, x6, x20, ne\",\n        \"cset x20, eq\",\n        \"cmp x4, #0x0 (0)\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"pdep eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b11 0xf5 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, x6\",\n        \"mov x1, x7\",\n        \"mov w4, #0x0\",\n        \"cbz w7, #+0x2c\",\n        \"neg w2, w1\",\n        \"and w2, w2, w1\",\n        \"sbfx w3, w0, #0, #1\",\n        \"eor w1, w1, w2\",\n        \"and w2, w3, w2\",\n        \"neg w3, w1\",\n        \"orr w4, w4, w2\",\n        \"lsr w0, w0, #1\",\n        \"and w2, w1, w3\",\n        \"cbnz w2, #-0x1c\"\n      ]\n    },\n    \"pdep rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b11 0xf5 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, x6\",\n        \"mov x1, x7\",\n        \"mov x4, #0x0\",\n        \"cbz x7, #+0x2c\",\n        \"neg x2, x1\",\n        \"and x2, x2, x1\",\n        \"sbfx x3, x0, #0, #1\",\n        \"eor x1, x1, x2\",\n        \"and x2, x3, x2\",\n        \"neg x3, x1\",\n        \"orr x4, x4, x2\",\n        \"lsr x0, x0, #1\",\n        \"and x2, x1, x3\",\n        \"cbnz x2, #-0x1c\"\n      ]\n    },\n    \"bextr eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b00 0xf7 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w7\",\n        \"lsr w21, w6, w20\",\n        \"mov w22, #0x0\",\n        \"cmp w20, #0x1f (31)\",\n        \"csel w20, w21, w22, ls\",\n        \"ubfx w21, w7, #8, #8\",\n        \"mov x22, #0xffffffffffffffff\",\n        \"lsl w22, w22, w21\",\n        \"bic w22, w20, w22\",\n        \"cmp w21, #0x1f (31)\",\n        \"csel w4, w22, w20, ls\",\n        \"cmp w4, #0x0 (0)\"\n      ]\n    },\n    \"bextr rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b00 0xf7 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtb x20, w7\",\n        \"lsr x21, x6, x20\",\n        \"mov w22, #0x0\",\n        \"cmp x20, #0x3f (63)\",\n        \"csel x20, x21, x22, ls\",\n        \"ubfx x21, x7, #8, #8\",\n        \"mov x22, #0xffffffffffffffff\",\n        \"lsl x22, x22, x21\",\n        \"bic x22, x20, x22\",\n        \"cmp x21, #0x3f (63)\",\n        \"csel x4, x22, x20, ls\",\n        \"cmp x4, #0x0 (0)\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AVX128/VEX_map3.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"AFP\",\n      \"SVE256\",\n      \"SVE128\"\n    ]\n  },\n  \"Instructions\": {\n    \"vpermq ymm0, ymm1, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ext v16.16b, v17.16b, v17.16b, #8\",\n        \"dup v2.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"zip1 v16.2d, v2.2d, v17.2d\",\n        \"dup v2.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 3\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ext v16.16b, v2.16b, v17.16b, #8\",\n        \"dup v2.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 4\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 5\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.2d, v17.d[1]\",\n        \"dup v2.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 6\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.d[1], v17.d[1]\",\n        \"dup v2.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 7\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"trn2 v16.2d, v2.2d, v17.2d\",\n        \"dup v2.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 8\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"zip1 v16.2d, v17.2d, v2.2d\",\n        \"dup v2.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 9\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ext v16.16b, v17.16b, v2.16b, #8\",\n        \"dup v2.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 10\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.2d, v2.d[0]\",\n        \"dup v2.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 11\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ext v16.16b, v2.16b, v2.16b, #8\",\n        \"dup v2.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 12\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[1], v2.d[1]\",\n        \"dup v2.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 13\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"trn2 v16.2d, v17.2d, v2.2d\",\n        \"dup v2.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 14\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #208]\",\n        \"dup v2.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 15\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.2d, v2.d[1]\",\n        \"dup v2.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.2d, v17.d[0]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 01010101b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.2d, v17.d[1]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 10101010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.2d, v2.d[0]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.2d, v2.d[1]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpermpd ymm0, ymm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x01 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.2d, v17.d[0]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpermpd ymm0, ymm1, 01010101b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x01 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.2d, v17.d[1]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpermpd ymm0, ymm1, 10101010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x01 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.2d, v2.d[0]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpermpd ymm0, ymm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x01 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.2d, v2.d[1]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[0], v17.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[1], v17.s[1]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[0], v17.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0100b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[2], v17.s[2]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0101b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"rev64 v2.4s, v17.4s\",\n        \"trn2 v16.4s, v2.4s, v16.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0110b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3200]\",\n        \"tbx v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3216]\",\n        \"tbx v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[3], v17.s[3]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1001b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3232]\",\n        \"tbx v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"rev64 v2.4s, v16.4s\",\n        \"trn2 v16.4s, v2.4s, v17.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1011b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3248]\",\n        \"tbx v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1100b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[1], v17.d[1]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1101b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3264]\",\n        \"tbx v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1110b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3280]\",\n        \"tbx v16.16b, {v17.16b}, v2.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1111b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpblendd ymm0, ymm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpblendd ymm0, ymm1, 01010101b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"rev64 v4.4s, v17.4s\",\n        \"trn2 v16.4s, v4.4s, v16.4s\",\n        \"rev64 v3.4s, v3.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpblendd ymm0, ymm1, 10101010b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #192]\",\n        \"ldr q3, [x28, #208]\",\n        \"rev64 v4.4s, v16.4s\",\n        \"trn2 v16.4s, v4.4s, v17.4s\",\n        \"rev64 v2.4s, v2.4s\",\n        \"trn2 v2.4s, v2.4s, v3.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpblendd ymm0, ymm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpermilps xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.4s, v17.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpermilps xmm0, xmm1, 01010101b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.4s, v17.s[1]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpermilps xmm0, xmm1, 10101010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.4s, v17.s[2]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpermilps xmm0, xmm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.4s, v17.s[3]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpermilps ymm0, ymm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.4s, v17.s[0]\",\n        \"dup v2.4s, v2.s[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilps ymm0, ymm1, 01010101b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.4s, v17.s[1]\",\n        \"dup v2.4s, v2.s[1]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilps ymm0, ymm1, 10101010b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.4s, v17.s[2]\",\n        \"dup v2.4s, v2.s[2]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilps ymm0, ymm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.4s, v17.s[3]\",\n        \"dup v2.4s, v2.s[3]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd xmm0, xmm1, 00b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.2d, v17.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd xmm0, xmm1, 01b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ext v16.16b, v17.16b, v17.16b, #8\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd xmm0, xmm1, 10b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpermilpd xmm0, xmm1, 11b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.2d, v17.d[1]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0000b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.2d, v17.d[0]\",\n        \"dup v2.2d, v2.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0001b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ext v16.16b, v17.16b, v17.16b, #8\",\n        \"dup v2.2d, v2.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0010b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v2.2d, v2.d[0]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0011b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.2d, v17.d[1]\",\n        \"dup v2.2d, v2.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0100b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.2d, v17.d[0]\",\n        \"ext v2.16b, v2.16b, v2.16b, #8\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0101b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ext v16.16b, v17.16b, v17.16b, #8\",\n        \"ext v2.16b, v2.16b, v2.16b, #8\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0110b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ext v2.16b, v2.16b, v2.16b, #8\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0111b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.2d, v17.d[1]\",\n        \"ext v2.16b, v2.16b, v2.16b, #8\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.2d, v17.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1001b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ext v16.16b, v17.16b, v17.16b, #8\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1011b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.2d, v17.d[1]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1100b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.2d, v17.d[0]\",\n        \"dup v2.2d, v2.d[1]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1101b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ext v16.16b, v17.16b, v17.16b, #8\",\n        \"dup v2.2d, v2.d[1]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1110b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v2.2d, v2.d[1]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1111b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"dup v16.2d, v17.d[1]\",\n        \"dup v2.2d, v2.d[1]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q17, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00000001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #208]\",\n        \"str q17, [x28, #192]\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00000010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q17, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00000011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #224]\",\n        \"str q17, [x28, #192]\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00010000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00010001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #208]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00010010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00010011b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q16, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00100000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q18, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00100001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #208]\",\n        \"str q18, [x28, #192]\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00100010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q18, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00100011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #224]\",\n        \"str q18, [x28, #192]\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00110000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #224]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00110001b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #208]\",\n        \"ldr q2, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00110010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #224]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00110011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #224]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00001000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"str q17, [x28, #192]\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00011000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v16.2d, #0x0\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00101000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"str q18, [x28, #192]\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00111000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #224]\",\n        \"movi v16.2d, #0x0\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 10001000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 10000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 10000001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #208]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 10000010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 10000011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundps xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x08 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintn v16.4s, v17.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundps xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x08 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintm v16.4s, v17.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundps xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x08 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintp v16.4s, v17.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundps xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x08 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintz v16.4s, v17.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundps xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x08 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti v16.4s, v17.4s\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundps ymm0, ymm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x08 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"frintn v16.4s, v17.4s\",\n        \"frintn v2.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vroundps ymm0, ymm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x08 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"frintm v16.4s, v17.4s\",\n        \"frintm v2.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vroundps ymm0, ymm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x08 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"frintp v16.4s, v17.4s\",\n        \"frintp v2.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vroundps ymm0, ymm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x08 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"frintz v16.4s, v17.4s\",\n        \"frintz v2.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vroundps ymm0, ymm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x08 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"frinti v16.4s, v17.4s\",\n        \"frinti v2.4s, v2.4s\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vroundpd xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x09 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintn v16.2d, v17.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundpd xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x09 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintm v16.2d, v17.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundpd xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x09 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintp v16.2d, v17.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundpd xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x09 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintz v16.2d, v17.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundpd xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x09 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti v16.2d, v17.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundpd ymm0, ymm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x09 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"frintn v16.2d, v17.2d\",\n        \"frintn v2.2d, v2.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vroundpd ymm0, ymm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x09 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"frintm v16.2d, v17.2d\",\n        \"frintm v2.2d, v2.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vroundpd ymm0, ymm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x09 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"frintp v16.2d, v17.2d\",\n        \"frintp v2.2d, v2.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vroundpd ymm0, ymm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x09 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"frintz v16.2d, v17.2d\",\n        \"frintz v2.2d, v2.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vroundpd ymm0, ymm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x09 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"frinti v16.2d, v17.2d\",\n        \"frinti v2.2d, v2.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vroundss xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintn s0, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundss xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintm s0, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundss xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintp s0, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundss xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintz s0, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundss xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti s0, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundsd xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintn d0, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundsd xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintm d0, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundsd xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintp d0, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundsd xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintz d0, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vroundsd xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti d0, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vblendps xmm0, xmm1, xmm2, 0000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x0c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vblendps xmm0, xmm1, xmm2, 0001b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x0c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[0], v18.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vblendps xmm0, xmm1, xmm2, 1111b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x0c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vblendps ymm0, ymm1, ymm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x0c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vblendps ymm0, ymm1, ymm2, 10000001b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x0c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[0], v18.s[0]\",\n        \"mov v2.s[3], v3.s[3]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vblendps ymm0, ymm1, ymm2, 11111111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x0c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #224]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vblendpd xmm0, xmm1, xmm2, 00b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vblendpd xmm0, xmm1, xmm2, 01b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[0], v18.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vblendpd xmm0, xmm1, xmm2, 10b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[1], v18.d[1]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vblendpd xmm0, xmm1, xmm2, 11b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0001b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[0], v18.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0010b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[1], v18.d[1]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0011b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0100b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov v2.d[0], v3.d[0]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0101b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[0], v18.d[0]\",\n        \"mov v2.d[0], v3.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0110b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[1], v18.d[1]\",\n        \"mov v2.d[0], v3.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0111b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov v2.d[0], v3.d[0]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1000b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov v2.d[1], v3.d[1]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1001b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[0], v18.d[0]\",\n        \"mov v2.d[1], v3.d[1]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1010b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[1], v18.d[1]\",\n        \"mov v2.d[1], v3.d[1]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1011b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov v2.d[1], v3.d[1]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1100b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #224]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1101b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #224]\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[0], v18.d[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1110b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #224]\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[1], v18.d[1]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #224]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vpblendw xmm0, xmm1, xmm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpblendw xmm0, xmm1, xmm2, 00000001b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.h[0], v18.h[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendw xmm0, xmm1, xmm2, 11111111b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vpblendw ymm0, ymm1, ymm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpblendw ymm0, ymm1, ymm2, 00000001b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.h[0], v18.h[0]\",\n        \"mov v2.h[0], v3.h[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpblendw ymm0, ymm1, ymm2, 11111111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #224]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vpalignr xmm0, xmm1, xmm2, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vpalignr xmm0, xmm1, xmm2, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ext v16.16b, v18.16b, v17.16b, #1\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpalignr xmm0, xmm1, xmm2, 15\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ext v16.16b, v18.16b, v17.16b, #15\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpalignr xmm0, xmm1, xmm2, 16\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpalignr xmm0, xmm1, xmm2, 17\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ext v16.16b, v17.16b, v2.16b, #1\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpalignr ymm0, ymm1, ymm2, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #224]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vpalignr ymm0, ymm1, ymm2, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ext v16.16b, v18.16b, v17.16b, #1\",\n        \"ext v3.16b, v3.16b, v2.16b, #1\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vpalignr ymm0, ymm1, ymm2, 15\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ext v16.16b, v18.16b, v17.16b, #15\",\n        \"ext v3.16b, v3.16b, v2.16b, #15\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vpalignr ymm0, ymm1, ymm2, 16\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpalignr ymm0, ymm1, ymm2, 17\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v3.2d, #0x0\",\n        \"ext v16.16b, v17.16b, v3.16b, #1\",\n        \"ext v2.16b, v2.16b, v3.16b, #1\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpextrb rax, xmm0, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x14 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.b[0]\"\n      ]\n    },\n    \"vpextrb rax, xmm0, 15\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x14 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.b[15]\"\n      ]\n    },\n    \"vpextrw rax, xmm0, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x15 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[0]\"\n      ]\n    },\n    \"vpextrw rax, xmm0, 7\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x15 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[7]\"\n      ]\n    },\n    \"vpextrd rax, xmm0, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, v16.s[0]\"\n      ]\n    },\n    \"vpextrd rax, xmm0, 3\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, v16.s[3]\"\n      ]\n    },\n    \"vpextrb [rax], xmm0, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x14 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.b}[0], [x4]\"\n      ]\n    },\n    \"vpextrb [rax], xmm0, 15\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x14 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.b}[15], [x4]\"\n      ]\n    },\n    \"vpextrw [rax], xmm0, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x15 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[0], [x4]\"\n      ]\n    },\n    \"vpextrw [rax], xmm0, 7\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x15 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[7], [x4]\"\n      ]\n    },\n    \"vpextrd [rax], xmm0, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.s}[0], [x4]\"\n      ]\n    },\n    \"vpextrd [rax], xmm0, 3\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.s}[3], [x4]\"\n      ]\n    },\n    \"vextractps eax, xmm0, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x17 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, v16.s[0]\"\n      ]\n    },\n    \"vextractps eax, xmm0, 3\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x17 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, v16.s[3]\"\n      ]\n    },\n    \"vinsertf128 ymm0, ymm1, xmm2, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x18 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vinsertf128 ymm0, ymm1, xmm2, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x18 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q18, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vextractf128 xmm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x19 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vextractf128 xmm0, ymm1, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x19 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #208]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtps2ph xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x1D 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, fpcr\",\n        \"and x0, x20, #0xffffffffff3fffff\",\n        \"msr fpcr, x0\",\n        \"fcvtn v16.4h, v17.4s\",\n        \"msr fpcr, x20\"\n      ]\n    },\n    \"vcvtps2ph xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x1D 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, fpcr\",\n        \"and x0, x20, #0xffffffffffbfffff\",\n        \"orr x0, x0, #0x800000\",\n        \"msr fpcr, x0\",\n        \"fcvtn v16.4h, v17.4s\",\n        \"msr fpcr, x20\"\n      ]\n    },\n    \"vcvtps2ph xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x1D 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, fpcr\",\n        \"and x0, x20, #0xffffffffff7fffff\",\n        \"orr x0, x0, #0x400000\",\n        \"msr fpcr, x0\",\n        \"fcvtn v16.4h, v17.4s\",\n        \"msr fpcr, x20\"\n      ]\n    },\n    \"vcvtps2ph xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x1D 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, fpcr\",\n        \"orr x0, x20, #0xc00000\",\n        \"msr fpcr, x0\",\n        \"fcvtn v16.4h, v17.4s\",\n        \"msr fpcr, x20\"\n      ]\n    },\n    \"vcvtps2ph xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x1D 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvtn v16.4h, v17.4s\"\n      ]\n    },\n    \"vcvtps2ph xmm0, ymm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x1D 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mrs x20, fpcr\",\n        \"and x0, x20, #0xffffffffff3fffff\",\n        \"msr fpcr, x0\",\n        \"fcvtn v3.4h, v17.4s\",\n        \"mov v0.16b, v3.16b\",\n        \"fcvtn2 v0.8h, v2.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"msr fpcr, x20\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtps2ph xmm0, ymm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x1D 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mrs x20, fpcr\",\n        \"and x0, x20, #0xffffffffffbfffff\",\n        \"orr x0, x0, #0x800000\",\n        \"msr fpcr, x0\",\n        \"fcvtn v3.4h, v17.4s\",\n        \"mov v0.16b, v3.16b\",\n        \"fcvtn2 v0.8h, v2.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"msr fpcr, x20\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtps2ph xmm0, ymm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x1D 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mrs x20, fpcr\",\n        \"and x0, x20, #0xffffffffff7fffff\",\n        \"orr x0, x0, #0x400000\",\n        \"msr fpcr, x0\",\n        \"fcvtn v3.4h, v17.4s\",\n        \"mov v0.16b, v3.16b\",\n        \"fcvtn2 v0.8h, v2.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"msr fpcr, x20\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtps2ph xmm0, ymm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x1D 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"mrs x20, fpcr\",\n        \"orr x0, x20, #0xc00000\",\n        \"msr fpcr, x0\",\n        \"fcvtn v3.4h, v17.4s\",\n        \"mov v0.16b, v3.16b\",\n        \"fcvtn2 v0.8h, v2.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"msr fpcr, x20\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vcvtps2ph xmm0, ymm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x1D 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"fcvtn v3.4h, v17.4s\",\n        \"mov v0.16b, v3.16b\",\n        \"fcvtn2 v0.8h, v2.4s\",\n        \"mov v16.16b, v0.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpinsrb xmm0, xmm0, eax, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x20 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.b[0], w4\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpinsrb xmm0, xmm1, eax, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x20 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.b[0], w4\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpinsrb xmm0, xmm1, eax, 15\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x20 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.b[15], w4\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vinsertps xmm0, xmm1, xmm2, ((0b00 << 6) | (0b00 << 4) | (0b0000))\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x21 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[0], v18.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vinsertps xmm0, xmm1, xmm2, ((0b00 << 6) | (0b00 << 4) | (0b1111))\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x21 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vinsertps xmm0, xmm1, xmm2, ((0b11 << 6) | (0b11 << 4) | (0b0000))\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x21 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[3], v18.s[3]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpinsrd xmm0, xmm0, eax, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x22 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[0], w4\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpinsrd xmm0, xmm1, eax, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x22 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[0], w4\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpinsrd xmm0, xmm1, eax, 3\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x22 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[3], w4\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpinsrq xmm0, xmm0, rax, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x22 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[0], x4\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpinsrq xmm0, xmm1, rax, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x22 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[0], x4\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpinsrq xmm0, xmm1, rax, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x22 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[1], x4\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vinserti128 ymm0, ymm1, xmm2, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x38 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vinserti128 ymm0, ymm1, xmm2, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x38 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q18, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vextracti128 xmm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x39 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vextracti128 xmm0, ymm1, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x39 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #208]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vdpps xmm0, xmm1, xmm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vdpps xmm0, xmm1, xmm2, 00001111b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vdpps xmm0, xmm1, xmm2, 11110000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vdpps xmm0, xmm1, xmm2, 11111111b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v2.4s, v17.4s, v18.4s\",\n        \"faddp v2.4s, v2.4s, v2.4s\",\n        \"faddp s2, v2.2s\",\n        \"dup v16.4s, v2.s[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vdpps ymm0, ymm1, ymm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vdpps ymm0, ymm1, ymm2, 00001111b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vdpps ymm0, ymm1, ymm2, 11110000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vdpps ymm0, ymm1, ymm2, 11111111b\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"fmul v4.4s, v17.4s, v18.4s\",\n        \"faddp v4.4s, v4.4s, v4.4s\",\n        \"faddp s4, v4.2s\",\n        \"dup v16.4s, v4.s[0]\",\n        \"fmul v2.4s, v2.4s, v3.4s\",\n        \"faddp v2.4s, v2.4s, v2.4s\",\n        \"faddp s2, v2.2s\",\n        \"dup v2.4s, v2.s[0]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vdppd xmm0, xmm1, xmm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x41 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vdppd xmm0, xmm1, xmm2, 00001111b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x41 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vdppd xmm0, xmm1, xmm2, 11110000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x41 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vdppd xmm0, xmm1, xmm2, 11111111b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x41 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v2.2d, v17.2d, v18.2d\",\n        \"faddp d2, v2.2d\",\n        \"dup v16.2d, v2.d[0]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 000b\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[0]\",\n        \"ext v3.16b, v17.16b, v17.16b, #0\",\n        \"ext v4.16b, v17.16b, v17.16b, #1\",\n        \"ext v5.16b, v17.16b, v17.16b, #2\",\n        \"ext v6.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 001b\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[1]\",\n        \"ext v3.16b, v17.16b, v17.16b, #0\",\n        \"ext v4.16b, v17.16b, v17.16b, #1\",\n        \"ext v5.16b, v17.16b, v17.16b, #2\",\n        \"ext v6.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 010b\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[2]\",\n        \"ext v3.16b, v17.16b, v17.16b, #0\",\n        \"ext v4.16b, v17.16b, v17.16b, #1\",\n        \"ext v5.16b, v17.16b, v17.16b, #2\",\n        \"ext v6.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 011b\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[3]\",\n        \"ext v3.16b, v17.16b, v17.16b, #0\",\n        \"ext v4.16b, v17.16b, v17.16b, #1\",\n        \"ext v5.16b, v17.16b, v17.16b, #2\",\n        \"ext v6.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 100b\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[0]\",\n        \"ext v3.16b, v17.16b, v17.16b, #4\",\n        \"ext v4.16b, v17.16b, v17.16b, #5\",\n        \"ext v5.16b, v17.16b, v17.16b, #6\",\n        \"ext v6.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 101b\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[1]\",\n        \"ext v3.16b, v17.16b, v17.16b, #4\",\n        \"ext v4.16b, v17.16b, v17.16b, #5\",\n        \"ext v5.16b, v17.16b, v17.16b, #6\",\n        \"ext v6.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 110b\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[2]\",\n        \"ext v3.16b, v17.16b, v17.16b, #4\",\n        \"ext v4.16b, v17.16b, v17.16b, #5\",\n        \"ext v5.16b, v17.16b, v17.16b, #6\",\n        \"ext v6.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 111b\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[3]\",\n        \"ext v3.16b, v17.16b, v17.16b, #4\",\n        \"ext v4.16b, v17.16b, v17.16b, #5\",\n        \"ext v5.16b, v17.16b, v17.16b, #6\",\n        \"ext v6.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 000b\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"dup v4.4s, v18.s[0]\",\n        \"ext v5.16b, v17.16b, v17.16b, #0\",\n        \"ext v6.16b, v17.16b, v17.16b, #1\",\n        \"ext v7.16b, v17.16b, v17.16b, #2\",\n        \"ext v8.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v4.8h, v8.8b, v4.8b\",\n        \"addp v5.8h, v5.8h, v7.8h\",\n        \"addp v4.8h, v6.8h, v4.8h\",\n        \"trn1 v6.4s, v5.4s, v4.4s\",\n        \"trn2 v4.4s, v5.4s, v4.4s\",\n        \"addp v16.8h, v6.8h, v4.8h\",\n        \"dup v3.4s, v3.s[0]\",\n        \"ext v4.16b, v2.16b, v2.16b, #0\",\n        \"ext v5.16b, v2.16b, v2.16b, #1\",\n        \"ext v6.16b, v2.16b, v2.16b, #2\",\n        \"ext v2.16b, v2.16b, v2.16b, #3\",\n        \"uabdl v4.8h, v4.8b, v3.8b\",\n        \"uabdl v5.8h, v5.8b, v3.8b\",\n        \"uabdl v6.8h, v6.8b, v3.8b\",\n        \"uabdl v2.8h, v2.8b, v3.8b\",\n        \"addp v3.8h, v4.8h, v6.8h\",\n        \"addp v2.8h, v5.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 001b\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"dup v4.4s, v18.s[1]\",\n        \"ext v5.16b, v17.16b, v17.16b, #0\",\n        \"ext v6.16b, v17.16b, v17.16b, #1\",\n        \"ext v7.16b, v17.16b, v17.16b, #2\",\n        \"ext v8.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v4.8h, v8.8b, v4.8b\",\n        \"addp v5.8h, v5.8h, v7.8h\",\n        \"addp v4.8h, v6.8h, v4.8h\",\n        \"trn1 v6.4s, v5.4s, v4.4s\",\n        \"trn2 v4.4s, v5.4s, v4.4s\",\n        \"addp v16.8h, v6.8h, v4.8h\",\n        \"dup v3.4s, v3.s[0]\",\n        \"ext v4.16b, v2.16b, v2.16b, #0\",\n        \"ext v5.16b, v2.16b, v2.16b, #1\",\n        \"ext v6.16b, v2.16b, v2.16b, #2\",\n        \"ext v2.16b, v2.16b, v2.16b, #3\",\n        \"uabdl v4.8h, v4.8b, v3.8b\",\n        \"uabdl v5.8h, v5.8b, v3.8b\",\n        \"uabdl v6.8h, v6.8b, v3.8b\",\n        \"uabdl v2.8h, v2.8b, v3.8b\",\n        \"addp v3.8h, v4.8h, v6.8h\",\n        \"addp v2.8h, v5.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 010b\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"dup v4.4s, v18.s[2]\",\n        \"ext v5.16b, v17.16b, v17.16b, #0\",\n        \"ext v6.16b, v17.16b, v17.16b, #1\",\n        \"ext v7.16b, v17.16b, v17.16b, #2\",\n        \"ext v8.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v4.8h, v8.8b, v4.8b\",\n        \"addp v5.8h, v5.8h, v7.8h\",\n        \"addp v4.8h, v6.8h, v4.8h\",\n        \"trn1 v6.4s, v5.4s, v4.4s\",\n        \"trn2 v4.4s, v5.4s, v4.4s\",\n        \"addp v16.8h, v6.8h, v4.8h\",\n        \"dup v3.4s, v3.s[0]\",\n        \"ext v4.16b, v2.16b, v2.16b, #0\",\n        \"ext v5.16b, v2.16b, v2.16b, #1\",\n        \"ext v6.16b, v2.16b, v2.16b, #2\",\n        \"ext v2.16b, v2.16b, v2.16b, #3\",\n        \"uabdl v4.8h, v4.8b, v3.8b\",\n        \"uabdl v5.8h, v5.8b, v3.8b\",\n        \"uabdl v6.8h, v6.8b, v3.8b\",\n        \"uabdl v2.8h, v2.8b, v3.8b\",\n        \"addp v3.8h, v4.8h, v6.8h\",\n        \"addp v2.8h, v5.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 011b\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"dup v4.4s, v18.s[3]\",\n        \"ext v5.16b, v17.16b, v17.16b, #0\",\n        \"ext v6.16b, v17.16b, v17.16b, #1\",\n        \"ext v7.16b, v17.16b, v17.16b, #2\",\n        \"ext v8.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v4.8h, v8.8b, v4.8b\",\n        \"addp v5.8h, v5.8h, v7.8h\",\n        \"addp v4.8h, v6.8h, v4.8h\",\n        \"trn1 v6.4s, v5.4s, v4.4s\",\n        \"trn2 v4.4s, v5.4s, v4.4s\",\n        \"addp v16.8h, v6.8h, v4.8h\",\n        \"dup v3.4s, v3.s[0]\",\n        \"ext v4.16b, v2.16b, v2.16b, #0\",\n        \"ext v5.16b, v2.16b, v2.16b, #1\",\n        \"ext v6.16b, v2.16b, v2.16b, #2\",\n        \"ext v2.16b, v2.16b, v2.16b, #3\",\n        \"uabdl v4.8h, v4.8b, v3.8b\",\n        \"uabdl v5.8h, v5.8b, v3.8b\",\n        \"uabdl v6.8h, v6.8b, v3.8b\",\n        \"uabdl v2.8h, v2.8b, v3.8b\",\n        \"addp v3.8h, v4.8h, v6.8h\",\n        \"addp v2.8h, v5.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 100b\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"dup v4.4s, v18.s[0]\",\n        \"ext v5.16b, v17.16b, v17.16b, #4\",\n        \"ext v6.16b, v17.16b, v17.16b, #5\",\n        \"ext v7.16b, v17.16b, v17.16b, #6\",\n        \"ext v8.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v4.8h, v8.8b, v4.8b\",\n        \"addp v5.8h, v5.8h, v7.8h\",\n        \"addp v4.8h, v6.8h, v4.8h\",\n        \"trn1 v6.4s, v5.4s, v4.4s\",\n        \"trn2 v4.4s, v5.4s, v4.4s\",\n        \"addp v16.8h, v6.8h, v4.8h\",\n        \"dup v3.4s, v3.s[0]\",\n        \"ext v4.16b, v2.16b, v2.16b, #0\",\n        \"ext v5.16b, v2.16b, v2.16b, #1\",\n        \"ext v6.16b, v2.16b, v2.16b, #2\",\n        \"ext v2.16b, v2.16b, v2.16b, #3\",\n        \"uabdl v4.8h, v4.8b, v3.8b\",\n        \"uabdl v5.8h, v5.8b, v3.8b\",\n        \"uabdl v6.8h, v6.8b, v3.8b\",\n        \"uabdl v2.8h, v2.8b, v3.8b\",\n        \"addp v3.8h, v4.8h, v6.8h\",\n        \"addp v2.8h, v5.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 101b\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"dup v4.4s, v18.s[1]\",\n        \"ext v5.16b, v17.16b, v17.16b, #4\",\n        \"ext v6.16b, v17.16b, v17.16b, #5\",\n        \"ext v7.16b, v17.16b, v17.16b, #6\",\n        \"ext v8.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v4.8h, v8.8b, v4.8b\",\n        \"addp v5.8h, v5.8h, v7.8h\",\n        \"addp v4.8h, v6.8h, v4.8h\",\n        \"trn1 v6.4s, v5.4s, v4.4s\",\n        \"trn2 v4.4s, v5.4s, v4.4s\",\n        \"addp v16.8h, v6.8h, v4.8h\",\n        \"dup v3.4s, v3.s[0]\",\n        \"ext v4.16b, v2.16b, v2.16b, #0\",\n        \"ext v5.16b, v2.16b, v2.16b, #1\",\n        \"ext v6.16b, v2.16b, v2.16b, #2\",\n        \"ext v2.16b, v2.16b, v2.16b, #3\",\n        \"uabdl v4.8h, v4.8b, v3.8b\",\n        \"uabdl v5.8h, v5.8b, v3.8b\",\n        \"uabdl v6.8h, v6.8b, v3.8b\",\n        \"uabdl v2.8h, v2.8b, v3.8b\",\n        \"addp v3.8h, v4.8h, v6.8h\",\n        \"addp v2.8h, v5.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 110b\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"dup v4.4s, v18.s[2]\",\n        \"ext v5.16b, v17.16b, v17.16b, #4\",\n        \"ext v6.16b, v17.16b, v17.16b, #5\",\n        \"ext v7.16b, v17.16b, v17.16b, #6\",\n        \"ext v8.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v4.8h, v8.8b, v4.8b\",\n        \"addp v5.8h, v5.8h, v7.8h\",\n        \"addp v4.8h, v6.8h, v4.8h\",\n        \"trn1 v6.4s, v5.4s, v4.4s\",\n        \"trn2 v4.4s, v5.4s, v4.4s\",\n        \"addp v16.8h, v6.8h, v4.8h\",\n        \"dup v3.4s, v3.s[0]\",\n        \"ext v4.16b, v2.16b, v2.16b, #0\",\n        \"ext v5.16b, v2.16b, v2.16b, #1\",\n        \"ext v6.16b, v2.16b, v2.16b, #2\",\n        \"ext v2.16b, v2.16b, v2.16b, #3\",\n        \"uabdl v4.8h, v4.8b, v3.8b\",\n        \"uabdl v5.8h, v5.8b, v3.8b\",\n        \"uabdl v6.8h, v6.8b, v3.8b\",\n        \"uabdl v2.8h, v2.8b, v3.8b\",\n        \"addp v3.8h, v4.8h, v6.8h\",\n        \"addp v2.8h, v5.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 111b\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"dup v4.4s, v18.s[3]\",\n        \"ext v5.16b, v17.16b, v17.16b, #4\",\n        \"ext v6.16b, v17.16b, v17.16b, #5\",\n        \"ext v7.16b, v17.16b, v17.16b, #6\",\n        \"ext v8.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v4.8h, v8.8b, v4.8b\",\n        \"addp v5.8h, v5.8h, v7.8h\",\n        \"addp v4.8h, v6.8h, v4.8h\",\n        \"trn1 v6.4s, v5.4s, v4.4s\",\n        \"trn2 v4.4s, v5.4s, v4.4s\",\n        \"addp v16.8h, v6.8h, v4.8h\",\n        \"dup v3.4s, v3.s[0]\",\n        \"ext v4.16b, v2.16b, v2.16b, #0\",\n        \"ext v5.16b, v2.16b, v2.16b, #1\",\n        \"ext v6.16b, v2.16b, v2.16b, #2\",\n        \"ext v2.16b, v2.16b, v2.16b, #3\",\n        \"uabdl v4.8h, v4.8b, v3.8b\",\n        \"uabdl v5.8h, v5.8b, v3.8b\",\n        \"uabdl v6.8h, v6.8b, v3.8b\",\n        \"uabdl v2.8h, v2.8b, v3.8b\",\n        \"addp v3.8h, v4.8h, v6.8h\",\n        \"addp v2.8h, v5.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpclmulqdq xmm0, xmm1, xmm2, 00000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x44 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"pmull v16.1q, v17.1d, v18.1d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpclmulqdq xmm0, xmm1, xmm2, 00001b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x44 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v0.2d, v17.d[1]\",\n        \"pmull v16.1q, v0.1d, v18.1d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpclmulqdq xmm0, xmm1, xmm2, 10000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x44 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v0.2d, v18.d[1]\",\n        \"pmull v16.1q, v0.1d, v17.1d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpclmulqdq xmm0, xmm1, xmm2, 10001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x44 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"pmull2 v16.1q, v17.2d, v18.2d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpclmulqdq ymm0, ymm1, ymm2, 00000b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x44 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"pmull v16.1q, v17.1d, v18.1d\",\n        \"pmull v2.1q, v2.1d, v3.1d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpclmulqdq ymm0, ymm1, ymm2, 00001b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x44 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"dup v0.2d, v17.d[1]\",\n        \"pmull v16.1q, v0.1d, v18.1d\",\n        \"dup v0.2d, v2.d[1]\",\n        \"pmull v2.1q, v0.1d, v3.1d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpclmulqdq ymm0, ymm1, ymm2, 10000b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x44 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"dup v0.2d, v18.d[1]\",\n        \"pmull v16.1q, v0.1d, v17.1d\",\n        \"dup v0.2d, v3.d[1]\",\n        \"pmull v2.1q, v0.1d, v2.1d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpclmulqdq ymm0, ymm1, ymm2, 10001b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x44 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"pmull2 v16.1q, v17.2d, v18.2d\",\n        \"pmull2 v2.1q, v2.2d, v3.2d\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q17, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00000001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #208]\",\n        \"str q17, [x28, #192]\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00000010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q17, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00000011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #224]\",\n        \"str q17, [x28, #192]\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00010000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00010001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #208]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00010010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00010011b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q16, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00100000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q18, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00100001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #208]\",\n        \"str q18, [x28, #192]\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00100010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q18, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00100011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #224]\",\n        \"str q18, [x28, #192]\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00110000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #224]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00110001b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #208]\",\n        \"ldr q2, [x28, #224]\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00110010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #224]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00110011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #224]\",\n        \"str q16, [x28, #192]\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00001000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"str q17, [x28, #192]\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00011000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v16.2d, #0x0\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00101000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"str q18, [x28, #192]\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00111000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #224]\",\n        \"movi v16.2d, #0x0\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 10001000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 10000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 10000001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #208]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 10000010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 10000011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x28, #224]\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vblendvps xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x4a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v2.4s, v19.4s, #31\",\n        \"mov v16.16b, v2.16b\",\n        \"bsl v16.16b, v18.16b, v17.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vblendvps ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 3 0b01 0x4a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ldr q4, [x28, #240]\",\n        \"sshr v5.4s, v19.4s, #31\",\n        \"mov v16.16b, v5.16b\",\n        \"bsl v16.16b, v18.16b, v17.16b\",\n        \"sshr v4.4s, v4.4s, #31\",\n        \"bsl v4.16b, v3.16b, v2.16b\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vblendvpd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x4b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v2.2d, v19.2d, #63\",\n        \"mov v16.16b, v2.16b\",\n        \"bsl v16.16b, v18.16b, v17.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vblendvpd ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 3 0b01 0x4b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ldr q4, [x28, #240]\",\n        \"sshr v5.2d, v19.2d, #63\",\n        \"mov v16.16b, v5.16b\",\n        \"bsl v16.16b, v18.16b, v17.16b\",\n        \"sshr v4.2d, v4.2d, #63\",\n        \"bsl v4.16b, v3.16b, v2.16b\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vpblendvb xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x4c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v2.16b, v19.16b, #7\",\n        \"mov v16.16b, v2.16b\",\n        \"bsl v16.16b, v18.16b, v17.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendvb ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 3 0b01 0x4c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ldr q4, [x28, #240]\",\n        \"sshr v5.16b, v19.16b, #7\",\n        \"mov v16.16b, v5.16b\",\n        \"bsl v16.16b, v18.16b, v17.16b\",\n        \"sshr v4.16b, v4.16b, #7\",\n        \"bsl v4.16b, v3.16b, v2.16b\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vaeskeygenassist xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0xdf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ldr q3, [x28, #3184]\",\n        \"mov v16.16b, v17.16b\",\n        \"aese v16.16b, v2.16b\",\n        \"tbl v16.16b, {v16.16b}, v3.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vaeskeygenassist xmm0, xmm1, 0xFF\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 3 0b01 0xdf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ldr q3, [x28, #3184]\",\n        \"mov v16.16b, v17.16b\",\n        \"aese v16.16b, v2.16b\",\n        \"tbl v16.16b, {v16.16b}, v3.16b\",\n        \"mov x0, #0xff00000000\",\n        \"dup v1.2d, x0\",\n        \"eor v16.16b, v16.16b, v1.16b\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AVX128/VEX_map3_SVE128.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"AFP\",\n      \"SVE256\"\n    ]\n  },\n  \"Instructions\": {\n    \"vblendvps xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x4a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v2.4s, v19.4s, #31\",\n        \"movprfx z16, z18\",\n        \"bsl z16.d, z16.d, z17.d, z2.d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vblendvps ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 3 0b01 0x4a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ldr q4, [x28, #240]\",\n        \"sshr v5.4s, v19.4s, #31\",\n        \"movprfx z16, z18\",\n        \"bsl z16.d, z16.d, z17.d, z5.d\",\n        \"sshr v4.4s, v4.4s, #31\",\n        \"bsl v4.16b, v3.16b, v2.16b\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vblendvpd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x4b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v2.2d, v19.2d, #63\",\n        \"movprfx z16, z18\",\n        \"bsl z16.d, z16.d, z17.d, z2.d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vblendvpd ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 3 0b01 0x4b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ldr q4, [x28, #240]\",\n        \"sshr v5.2d, v19.2d, #63\",\n        \"movprfx z16, z18\",\n        \"bsl z16.d, z16.d, z17.d, z5.d\",\n        \"sshr v4.2d, v4.2d, #63\",\n        \"bsl v4.16b, v3.16b, v2.16b\",\n        \"str q4, [x28, #192]\"\n      ]\n    },\n    \"vpblendvb xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x4c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v2.16b, v19.16b, #7\",\n        \"movprfx z16, z18\",\n        \"bsl z16.d, z16.d, z17.d, z2.d\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpblendvb ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 3 0b01 0x4c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #224]\",\n        \"ldr q4, [x28, #240]\",\n        \"sshr v5.16b, v19.16b, #7\",\n        \"movprfx z16, z18\",\n        \"bsl z16.d, z16.d, z17.d, z5.d\",\n        \"sshr v4.16b, v4.16b, #7\",\n        \"bsl v4.16b, v3.16b, v2.16b\",\n        \"str q4, [x28, #192]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/AVX128/VEX_map_group.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"SVE256\",\n      \"SVE128\"\n    ]\n  },\n  \"Instructions\": {\n    \"vpsrlw xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 12 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsrlw xmm0, xmm1, 15\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 12 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ushr v16.8h, v17.8h, #15\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrlw xmm0, xmm1, 16\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 12 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrlw ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map group 12 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsrlw ymm0, ymm1, 15\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 12 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ushr v16.8h, v17.8h, #15\",\n        \"ushr v2.8h, v2.8h, #15\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsrlw ymm0, ymm1, 16\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 12 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v16.2d, #0x0\",\n        \"movi v2.2d, #0x0\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsraw xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 12 0b100 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsraw xmm0, xmm1, 15\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 12 0b100 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.8h, v17.8h, #15\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsraw xmm0, xmm1, 16\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 12 0b100 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.8h, v17.8h, #15\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsraw ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map group 12 0b100 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsraw ymm0, ymm1, 15\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 12 0b100 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"sshr v16.8h, v17.8h, #15\",\n        \"sshr v2.8h, v2.8h, #15\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsraw ymm0, ymm1, 16\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 12 0b100 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"sshr v16.8h, v17.8h, #15\",\n        \"sshr v2.8h, v2.8h, #15\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsllw xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 12 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsllw xmm0, xmm1, 15\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 12 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v16.8h, v17.8h, #15\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsllw xmm0, xmm1, 16\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 12 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsllw ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map group 12 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsllw ymm0, ymm1, 15\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 12 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"shl v16.8h, v17.8h, #15\",\n        \"shl v2.8h, v2.8h, #15\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsllw ymm0, ymm1, 16\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 12 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v16.2d, #0x0\",\n        \"movi v2.2d, #0x0\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsrld xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 13 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsrld xmm0, xmm1, 31\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 13 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ushr v16.4s, v17.4s, #31\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrld xmm0, xmm1, 32\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 13 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrld ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map group 13 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsrld ymm0, ymm1, 31\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 13 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ushr v16.4s, v17.4s, #31\",\n        \"ushr v2.4s, v2.4s, #31\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsrld ymm0, ymm1, 32\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 13 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v16.2d, #0x0\",\n        \"movi v2.2d, #0x0\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsrad xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 13 0b100 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsrad xmm0, xmm1, 31\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 13 0b100 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.4s, v17.4s, #31\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrad xmm0, xmm1, 32\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 13 0b100 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.4s, v17.4s, #31\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrad ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map group 13 0b100 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsrad ymm0, ymm1, 31\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 13 0b100 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"sshr v16.4s, v17.4s, #31\",\n        \"sshr v2.4s, v2.4s, #31\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsrad ymm0, ymm1, 32\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 13 0b100 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"sshr v16.4s, v17.4s, #31\",\n        \"sshr v2.4s, v2.4s, #31\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpslld xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 13 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpslld xmm0, xmm1, 31\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 13 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v16.4s, v17.4s, #31\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpslld xmm0, xmm1, 32\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 13 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpslld ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map group 13 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpslld ymm0, ymm1, 31\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 13 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"shl v16.4s, v17.4s, #31\",\n        \"shl v2.4s, v2.4s, #31\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpslld ymm0, ymm1, 32\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 13 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v16.2d, #0x0\",\n        \"movi v2.2d, #0x0\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsrlq xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsrlq xmm0, xmm1, 63\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ushr v16.2d, v17.2d, #63\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrlq xmm0, xmm1, 64\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrlq ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map group 14 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsrlq ymm0, ymm1, 63\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 14 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"ushr v16.2d, v17.2d, #63\",\n        \"ushr v2.2d, v2.2d, #63\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsrlq ymm0, ymm1, 64\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 14 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v16.2d, #0x0\",\n        \"movi v2.2d, #0x0\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsrldq xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b011 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsrldq xmm0, xmm1, 15\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map group 14 0b011 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ext v16.16b, v17.16b, v2.16b, #15\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrldq xmm0, xmm1, 16\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b011 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsrldq ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map group 14 0b011 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsrldq ymm0, ymm1, 15\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map group 14 0b011 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v3.2d, #0x0\",\n        \"ext v16.16b, v17.16b, v3.16b, #15\",\n        \"ext v2.16b, v2.16b, v3.16b, #15\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsrldq ymm0, ymm1, 16\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b011 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsllq xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsllq xmm0, xmm1, 63\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v16.2d, v17.2d, #63\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsllq xmm0, xmm1, 64\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpsllq ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map group 14 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsllq ymm0, ymm1, 63\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 14 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"shl v16.2d, v17.2d, #63\",\n        \"shl v2.2d, v2.2d, #63\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpsllq ymm0, ymm1, 64\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map group 14 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v16.2d, #0x0\",\n        \"movi v2.2d, #0x0\",\n        \"str q2, [x28, #192]\"\n      ]\n    },\n    \"vpslldq xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b111 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp xzr, xzr, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpslldq xmm0, xmm1, 15\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map group 14 0b111 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ext v16.16b, v2.16b, v17.16b, #1\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpslldq xmm0, xmm1, 16\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b111 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    },\n    \"vpslldq ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map group 14 0b111 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"str q2, [x28, #192]\",\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpslldq ymm0, ymm1, 15\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map group 14 0b111 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"movi v3.2d, #0x0\",\n        \"ext v16.16b, v3.16b, v17.16b, #1\",\n        \"ext v3.16b, v3.16b, v2.16b, #1\",\n        \"str q3, [x28, #192]\"\n      ]\n    },\n    \"vpslldq ymm0, ymm1, 16\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b111 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"stp xzr, xzr, [x28, #192]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Atomics.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ]\n  },\n  \"Instructions\": {\n    \"lock add byte [rax], cl\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x00\",\n      \"ExpectedArm64ASM\": [\n        \"ldaddalb w7, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"lsl w0, w20, #24\",\n        \"cmn w0, w7, lsl #24\",\n        \"add w26, w20, w7\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock add word [rax], cx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x01\",\n      \"ExpectedArm64ASM\": [\n        \"ldaddalh w7, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"lsl w0, w20, #16\",\n        \"cmn w0, w7, lsl #16\",\n        \"add w26, w20, w7\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock add dword [rax], ecx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x01\",\n      \"ExpectedArm64ASM\": [\n        \"ldaddal w7, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"adds w26, w20, w7\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock or byte [rax], cl\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x08\",\n      \"ExpectedArm64ASM\": [\n        \"ldsetalb w7, w20, [x4]\",\n        \"orr w26, w20, w7\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock or word [rax], cx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x09\",\n      \"ExpectedArm64ASM\": [\n        \"ldsetalh w7, w20, [x4]\",\n        \"orr w26, w20, w7\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock or dword [rax], ecx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x09\",\n      \"ExpectedArm64ASM\": [\n        \"ldsetal w7, w20, [x4]\",\n        \"orr w20, w20, w7\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock adc byte [rax], cl\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": \"0x10\",\n      \"ExpectedArm64ASM\": [\n        \"cinc w20, w7, lo\",\n        \"ldaddalb w20, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"uxtb x21, w7\",\n        \"cinc w22, w21, lo\",\n        \"add w23, w20, w22\",\n        \"uxtb w26, w23\",\n        \"cmp w26, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"bic w20, w20, w21\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w23, w20, #28, #1\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"lock adc word [rax], cx\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": \"0x11\",\n      \"ExpectedArm64ASM\": [\n        \"cinc w20, w7, lo\",\n        \"ldaddalh w20, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"uxth x21, w7\",\n        \"cinc w22, w21, lo\",\n        \"add w23, w20, w22\",\n        \"uxth w26, w23\",\n        \"cmp w26, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"bic w20, w20, w21\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w23, w20, #28, #1\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"lock adc dword [rax], ecx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x11\",\n      \"ExpectedArm64ASM\": [\n        \"cinc w20, w7, lo\",\n        \"ldaddal w20, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs w26, w20, w7\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock sbb byte [rax], cl\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": \"0x18\",\n      \"ExpectedArm64ASM\": [\n        \"cinc w20, w7, lo\",\n        \"neg w1, w20\",\n        \"ldaddalb w1, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"uxtb w20, w20\",\n        \"uxtb x21, w7\",\n        \"cinc w22, w21, lo\",\n        \"sub w23, w20, w22\",\n        \"uxtb w26, w23\",\n        \"cmp w20, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"and w20, w20, w21\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w23, w20, #28, #1\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"lock sbb word [rax], cx\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": \"0x19\",\n      \"ExpectedArm64ASM\": [\n        \"cinc w20, w7, lo\",\n        \"neg w1, w20\",\n        \"ldaddalh w1, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"uxth w20, w20\",\n        \"uxth x21, w7\",\n        \"cinc w22, w21, lo\",\n        \"sub w23, w20, w22\",\n        \"uxth w26, w23\",\n        \"cmp w20, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"and w20, w20, w21\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w23, w20, #28, #1\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"lock sbb dword [rax], ecx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x19\",\n      \"ExpectedArm64ASM\": [\n        \"cinc w20, w7, lo\",\n        \"neg w1, w20\",\n        \"ldaddal w1, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"sbcs w26, w20, w7\"\n      ]\n    },\n    \"lock and byte [rax], cl\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x20\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w1, w7\",\n        \"ldclralb w1, w20, [x4]\",\n        \"and w26, w20, w7\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock and word [rax], cx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x21\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w1, w7\",\n        \"ldclralh w1, w20, [x4]\",\n        \"and w26, w20, w7\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock and dword [rax], ecx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x21\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w1, w7\",\n        \"ldclral w1, w20, [x4]\",\n        \"ands w26, w20, w7\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock sub byte [rax], cl\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x28\",\n      \"ExpectedArm64ASM\": [\n        \"neg w1, w7\",\n        \"ldaddalb w1, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"lsl w0, w20, #24\",\n        \"cmp w0, w7, lsl #24\",\n        \"sub w26, w20, w7\"\n      ]\n    },\n    \"lock sub word [rax], cx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x28\",\n      \"ExpectedArm64ASM\": [\n        \"neg w1, w7\",\n        \"ldaddalh w1, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"lsl w0, w20, #16\",\n        \"cmp w0, w7, lsl #16\",\n        \"sub w26, w20, w7\"\n      ]\n    },\n    \"lock sub dword [rax], ecx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x29\",\n      \"ExpectedArm64ASM\": [\n        \"neg w1, w7\",\n        \"ldaddal w1, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"subs w26, w20, w7\"\n      ]\n    },\n    \"lock xor byte [rax], cl\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x30\",\n      \"ExpectedArm64ASM\": [\n        \"ldeoralb w7, w20, [x4]\",\n        \"eor w26, w20, w7\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock xor word [rax], cx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x31\",\n      \"ExpectedArm64ASM\": [\n        \"ldeoralh w7, w20, [x4]\",\n        \"eor w26, w20, w7\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock xor dword [rax], ecx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x31\",\n      \"ExpectedArm64ASM\": [\n        \"ldeoral w7, w20, [x4]\",\n        \"eor w20, w20, w7\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock add qword [rax], rcx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x01\",\n      \"ExpectedArm64ASM\": [\n        \"ldaddal x7, x20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"adds x26, x20, x7\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"xchg byte [rax], cl\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x86\",\n      \"ExpectedArm64ASM\": [\n        \"swpalb w7, w20, [x4]\",\n        \"bfxil x7, x20, #0, #8\"\n      ]\n    },\n    \"xchg word [rax], cx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x87\",\n      \"ExpectedArm64ASM\": [\n        \"swpalh w7, w20, [x4]\",\n        \"bfxil x7, x20, #0, #16\"\n      ]\n    },\n    \"xchg dword [rax], ecx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x87\",\n      \"ExpectedArm64ASM\": [\n        \"swpal w7, w7, [x4]\"\n      ]\n    },\n    \"xchg qword [rax], rcx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x87\",\n      \"ExpectedArm64ASM\": [\n        \"swpal x7, x7, [x4]\"\n      ]\n    },\n    \"xadd byte [rax], bl\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xc0\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w6\",\n        \"ldaddalb w20, w21, [x4]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w21, w20\",\n        \"bfxil x6, x21, #0, #8\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"xadd word [rax], bx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"ldaddalh w20, w21, [x4]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w21, w20\",\n        \"bfxil x6, x21, #0, #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"xadd dword [rax], ebx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w6\",\n        \"ldaddal w20, w6, [x4]\",\n        \"eor x27, x6, x20\",\n        \"adds w26, w6, w20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"xadd qword [rax], rbx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"ldaddal x6, x20, [x4]\",\n        \"eor x27, x20, x6\",\n        \"adds x26, x20, x6\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"mov x6, x20\"\n      ]\n    },\n    \"lock add byte [rax], 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP1 0x80 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddalb w20, w27, [x4]\",\n        \"lsl w0, w27, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w27, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock add byte [rax], 0xFF\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP1 0x80 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"ldaddalb w20, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"lsl w0, w21, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w21, #0xff (255)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock add word [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldaddalh w20, w27, [x4]\",\n        \"lsl w0, w27, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w27, #0x100 (256)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock add word [rax], 0xFFFF\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"ldaddalh w20, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"lsl w0, w21, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w21, w20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock add dword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldaddal w20, w27, [x4]\",\n        \"adds w26, w27, #0x100 (256)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock add dword [rax], 0xFFFFFFFF\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"ldaddal w20, w20, [x4]\",\n        \"mvn w27, w20\",\n        \"subs w26, w20, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock add qword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldaddal x20, x27, [x4]\",\n        \"adds x26, x27, #0x100 (256)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock add qword [rax], -2147483647\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffff80000001\",\n        \"ldaddal x20, x27, [x4]\",\n        \"adds x26, x27, x20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock add word [rax], 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddalh w20, w27, [x4]\",\n        \"lsl w0, w27, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w27, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock add dword [rax], 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddal w20, w27, [x4]\",\n        \"adds w26, w27, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock add qword [rax], 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddal x20, x27, [x4]\",\n        \"adds x26, x27, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock or byte [rax], 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x80 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldsetalb w20, w20, [x4]\",\n        \"orr w26, w20, #0x1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock or byte [rax], 0xFF\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x80 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"ldsetalb w20, w20, [x4]\",\n        \"orr w26, w20, #0xff\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock or word [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldsetalh w20, w20, [x4]\",\n        \"orr w26, w20, #0x100\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock or word [rax], 0xFFFF\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"ldsetalh w20, w20, [x4]\",\n        \"orr w26, w20, #0xffff\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock or dword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldsetal w20, w20, [x4]\",\n        \"orr w20, w20, #0x100\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock or dword [rax], 0xFFFFFFFF\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"ldsetal w20, w21, [x4]\",\n        \"orr w20, w21, w20\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock or qword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldsetal x20, x20, [x4]\",\n        \"orr x20, x20, #0x100\",\n        \"subs x26, x20, #0x0 (0)\"\n      ]\n    },\n    \"lock or qword [rax], -2147483647\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffff80000001\",\n        \"ldsetal x20, x20, [x4]\",\n        \"orr x20, x20, #0xffffffff80000001\",\n        \"subs x26, x20, #0x0 (0)\"\n      ]\n    },\n    \"lock or word [rax], 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x83 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldsetalh w20, w20, [x4]\",\n        \"orr w26, w20, #0x1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock or dword [rax], 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldsetal w20, w20, [x4]\",\n        \"orr w20, w20, #0x1\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock or qword [rax], 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldsetal x20, x20, [x4]\",\n        \"orr x20, x20, #0x1\",\n        \"subs x26, x20, #0x0 (0)\"\n      ]\n    },\n    \"lock adc byte [rax], 1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"GROUP1 0x80 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w21, w20, lo\",\n        \"ldaddalb w21, w27, [x4]\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w27, w20\",\n        \"uxtb w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"bic w20, w26, w27\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock adc byte [rax], 0xFF\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": \"GROUP1 0x80 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"cinc w21, w20, lo\",\n        \"ldaddalb w21, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"cinc w20, w20, lo\",\n        \"add w22, w21, w20\",\n        \"uxtb w26, w22\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"bic w20, w21, w26\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"lock adc word [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"cinc w21, w20, lo\",\n        \"ldaddalh w21, w27, [x4]\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w27, w20\",\n        \"uxth w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"bic w20, w26, w27\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock adc word [rax], 0xFFFF\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"cinc w21, w20, lo\",\n        \"ldaddalh w21, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"cinc w20, w20, lo\",\n        \"add w22, w21, w20\",\n        \"uxth w26, w22\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"bic w20, w21, w26\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"lock adc dword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"cinc w21, w20, lo\",\n        \"ldaddal w21, w27, [x4]\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs w26, w27, w20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock adc dword [rax], 0xFFFFFFFF\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"cinc w21, w20, lo\",\n        \"ldaddal w21, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"mrs x22, nzcv\",\n        \"eor w22, w22, #0x20000000\",\n        \"msr nzcv, x22\",\n        \"adcs w26, w21, w20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock adc qword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"cinc x21, x20, lo\",\n        \"ldaddal x21, x27, [x4]\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs x26, x27, x20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock adc qword [rax], -2147483647\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffff80000001\",\n        \"cinc x21, x20, lo\",\n        \"ldaddal x21, x27, [x4]\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs x26, x27, x20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock adc word [rax], 1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"GROUP1 0x83 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w21, w20, lo\",\n        \"ldaddalh w21, w27, [x4]\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w27, w20\",\n        \"uxth w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"bic w20, w26, w27\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock adc dword [rax], 1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP1 0x83 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w21, w20, lo\",\n        \"ldaddal w21, w27, [x4]\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs w26, w27, w20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock adc qword [rax], 1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP1 0x83 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc x21, x20, lo\",\n        \"ldaddal x21, x27, [x4]\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs x26, x27, x20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock sbb byte [rax], 1\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"GROUP1 0x80 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddalb w1, w27, [x4]\",\n        \"uxtb w21, w27\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxtb w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"bic w20, w21, w26\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"lock sbb byte [rax], 0xFF\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": \"GROUP1 0x80 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddalb w1, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"uxtb w21, w21\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxtb w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"bic w20, w26, w21\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"lock sbb word [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddalh w1, w27, [x4]\",\n        \"uxth w21, w27\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxth w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"bic w20, w21, w26\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"lock sbb word [rax], 0xFFFF\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddalh w1, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"uxth w21, w21\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxth w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"bic w20, w26, w21\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"lock sbb dword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddal w1, w27, [x4]\",\n        \"sbcs w26, w27, w20\"\n      ]\n    },\n    \"lock sbb dword [rax], 0xFFFFFFFF\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddal w1, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"sbcs w26, w21, w20\"\n      ]\n    },\n    \"lock sbb qword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"cinc x21, x20, lo\",\n        \"neg x1, x21\",\n        \"ldaddal x1, x27, [x4]\",\n        \"sbcs x26, x27, x20\"\n      ]\n    },\n    \"lock sbb qword [rax], -2147483647\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffff80000001\",\n        \"cinc x21, x20, lo\",\n        \"neg x1, x21\",\n        \"ldaddal x1, x27, [x4]\",\n        \"sbcs x26, x27, x20\"\n      ]\n    },\n    \"lock sbb word [rax], 1\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"GROUP1 0x83 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddalh w1, w27, [x4]\",\n        \"uxth w21, w27\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxth w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"bic w20, w21, w26\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"lock sbb dword [rax], 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x83 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddal w1, w27, [x4]\",\n        \"sbcs w26, w27, w20\"\n      ]\n    },\n    \"lock sbb qword [rax], 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x83 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc x21, x20, lo\",\n        \"neg x1, x21\",\n        \"ldaddal x1, x27, [x4]\",\n        \"sbcs x26, x27, x20\"\n      ]\n    },\n    \"lock and byte [rax], 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP1 0x80 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mvn w1, w20\",\n        \"ldclralb w1, w20, [x4]\",\n        \"and w26, w20, #0x1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock and byte [rax], 0xFF\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP1 0x80 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w1, w20\",\n        \"ldclralb w1, w20, [x4]\",\n        \"and w26, w20, #0xff\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock and word [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"mvn w1, w20\",\n        \"ldclralh w1, w20, [x4]\",\n        \"and w26, w20, #0x100\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock and word [rax], 0xFFFF\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"mvn w1, w20\",\n        \"ldclralh w1, w20, [x4]\",\n        \"and w26, w20, #0xffff\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock and dword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"mvn w1, w20\",\n        \"ldclral w1, w20, [x4]\",\n        \"ands w26, w20, #0x100\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock and dword [rax], 0xFFFFFFFF\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"mvn w1, w20\",\n        \"ldclral w1, w21, [x4]\",\n        \"ands w26, w21, w20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock and qword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"mvn x1, x20\",\n        \"ldclral x1, x20, [x4]\",\n        \"ands x26, x20, #0x100\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock and qword [rax], -2147483647\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffff80000001\",\n        \"mvn x1, x20\",\n        \"ldclral x1, x20, [x4]\",\n        \"ands x26, x20, #0xffffffff80000001\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock and word [rax], 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP1 0x83 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mvn w1, w20\",\n        \"ldclralh w1, w20, [x4]\",\n        \"and w26, w20, #0x1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock and dword [rax], 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x83 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mvn w1, w20\",\n        \"ldclral w1, w20, [x4]\",\n        \"ands w26, w20, #0x1\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock and qword [rax], 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x83 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mvn x1, x20\",\n        \"ldclral x1, x20, [x4]\",\n        \"ands x26, x20, #0x1\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock sub byte [rax], 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x80 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"neg w1, w20\",\n        \"ldaddalb w1, w27, [x4]\",\n        \"lsl w0, w27, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w27, #0x1 (1)\"\n      ]\n    },\n    \"lock sub byte [rax], 0xFF\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x80 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"neg w1, w20\",\n        \"ldaddalb w1, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"lsl w0, w21, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w21, #0xff (255)\"\n      ]\n    },\n    \"lock sub word [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"neg w1, w20\",\n        \"ldaddalh w1, w27, [x4]\",\n        \"lsl w0, w27, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w27, #0x100 (256)\"\n      ]\n    },\n    \"lock sub word [rax], 0xFFFF\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"neg w1, w20\",\n        \"ldaddalh w1, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"lsl w0, w21, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w21, w20\"\n      ]\n    },\n    \"lock sub dword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"neg w1, w20\",\n        \"ldaddal w1, w27, [x4]\",\n        \"subs w26, w27, #0x100 (256)\"\n      ]\n    },\n    \"lock sub dword [rax], 0xFFFFFFFF\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"neg w1, w20\",\n        \"ldaddal w1, w20, [x4]\",\n        \"mvn w27, w20\",\n        \"adds w26, w20, #0x1 (1)\"\n      ]\n    },\n    \"lock sub qword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"neg x1, x20\",\n        \"ldaddal x1, x27, [x4]\",\n        \"subs x26, x27, #0x100 (256)\"\n      ]\n    },\n    \"lock sub qword [rax], -2147483647\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffff80000001\",\n        \"neg x1, x20\",\n        \"ldaddal x1, x27, [x4]\",\n        \"subs x26, x27, x20\"\n      ]\n    },\n    \"lock sub word [rax], 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"neg w1, w20\",\n        \"ldaddalh w1, w27, [x4]\",\n        \"lsl w0, w27, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w27, #0x1 (1)\"\n      ]\n    },\n    \"lock sub dword [rax], 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"neg w1, w20\",\n        \"ldaddal w1, w27, [x4]\",\n        \"subs w26, w27, #0x1 (1)\"\n      ]\n    },\n    \"lock sub qword [rax], 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"neg x1, x20\",\n        \"ldaddal x1, x27, [x4]\",\n        \"subs x26, x27, #0x1 (1)\"\n      ]\n    },\n    \"lock xor byte [rax], 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x80 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldeoralb w20, w20, [x4]\",\n        \"eor w26, w20, #0x1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock xor byte [rax], 0xFF\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x80 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"ldeoralb w20, w20, [x4]\",\n        \"eor w26, w20, #0xff\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock xor word [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldeoralh w20, w20, [x4]\",\n        \"eor w26, w20, #0x100\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock xor word [rax], 0xFFFF\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"ldeoralh w20, w20, [x4]\",\n        \"eor w26, w20, #0xffff\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock xor dword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldeoral w20, w20, [x4]\",\n        \"eor w20, w20, #0x100\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock xor dword [rax], 0xFFFFFFFF\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"ldeoral w20, w21, [x4]\",\n        \"eor w20, w21, w20\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock xor qword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldeoral x20, x20, [x4]\",\n        \"eor x20, x20, #0x100\",\n        \"subs x26, x20, #0x0 (0)\"\n      ]\n    },\n    \"lock xor qword [rax], -2147483647\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffff80000001\",\n        \"ldeoral x20, x20, [x4]\",\n        \"eor x20, x20, #0xffffffff80000001\",\n        \"subs x26, x20, #0x0 (0)\"\n      ]\n    },\n    \"lock xor word [rax], 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x83 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldeoralh w20, w20, [x4]\",\n        \"eor w26, w20, #0x1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock xor dword [rax], 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldeoral w20, w20, [x4]\",\n        \"eor w20, w20, #0x1\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock xor qword [rax], 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldeoral x20, x20, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"subs x26, x20, #0x0 (0)\"\n      ]\n    },\n    \"lock dec byte [rax]\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP3 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"ldaddalb w20, w27, [x4]\",\n        \"mov w20, #0x1\",\n        \"cset x21, hs\",\n        \"lsl w0, w27, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w27, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock not byte [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP2 0xf6 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"ldeoralb w20, w20, [x4]\"\n      ]\n    },\n    \"lock not word [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP2 0xf7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"ldeoralh w20, w20, [x4]\"\n      ]\n    },\n    \"lock not dword [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP2 0xf7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"ldeoral w20, w20, [x4]\"\n      ]\n    },\n    \"lock not qword [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP2 0xf7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"ldeoral x20, x20, [x4]\"\n      ]\n    },\n    \"lock neg byte [rax]\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xf6 /3\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w1, [x4]\",\n        \"mov w3, w1\",\n        \"neg w2, w1\",\n        \"casalb w1, w2, [x4]\",\n        \"sub w2, w1, w3\",\n        \"cbnz w2, #-0x10\",\n        \"mov w27, w1\",\n        \"cmp wzr, w27, lsl #24\",\n        \"neg w26, w27\"\n      ]\n    },\n    \"lock neg word [rax]\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xf7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w1, [x4]\",\n        \"mov w3, w1\",\n        \"neg w2, w1\",\n        \"casalh w1, w2, [x4]\",\n        \"sub w2, w1, w3\",\n        \"cbnz w2, #-0x10\",\n        \"mov w27, w1\",\n        \"cmp wzr, w27, lsl #16\",\n        \"neg w26, w27\"\n      ]\n    },\n    \"lock neg dword [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xf7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w1, [x4]\",\n        \"mov w3, w1\",\n        \"neg w2, w1\",\n        \"casal w1, w2, [x4]\",\n        \"sub w2, w1, w3\",\n        \"cbnz w2, #-0x10\",\n        \"mov w27, w1\",\n        \"negs w26, w27\"\n      ]\n    },\n    \"lock neg qword [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xf7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x1, [x4]\",\n        \"mov x3, x1\",\n        \"neg x2, x1\",\n        \"casal x1, x2, [x4]\",\n        \"sub x2, x1, x3\",\n        \"cbnz x2, #-0x10\",\n        \"mov x27, x1\",\n        \"negs x26, x27\"\n      ]\n    },\n    \"lock dec word [rax]\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP4 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"ldaddalh w20, w27, [x4]\",\n        \"mov w20, #0x1\",\n        \"cset x21, hs\",\n        \"lsl w0, w27, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w27, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock dec dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP4 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"ldaddal w20, w27, [x4]\",\n        \"cset x20, hs\",\n        \"subs w26, w27, #0x1 (1)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock dec qword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP4 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"ldaddal x20, x27, [x4]\",\n        \"cset x20, hs\",\n        \"subs x26, x27, #0x1 (1)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock inc byte [rax]\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP4 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddalb w20, w27, [x4]\",\n        \"cset x21, hs\",\n        \"lsl w0, w27, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w27, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock inc word [rax]\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP4 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddalh w20, w27, [x4]\",\n        \"cset x21, hs\",\n        \"lsl w0, w27, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w27, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"lock inc dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP4 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddal w20, w27, [x4]\",\n        \"cset x20, hs\",\n        \"adds w26, w27, #0x1 (1)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock inc qword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP4 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddal x20, x27, [x4]\",\n        \"cset x20, hs\",\n        \"adds x26, x27, #0x1 (1)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/CMakeLists.txt",
    "content": "# Careful. Globbing can't see changes to the contents of files\n# Need to do a fresh clean to see changes\nfile(GLOB_RECURSE JSON_SOURCES CONFIGURE_DEPENDS *.json)\n\nset(JSON_DEPENDS \"\")\nset(JSON_UPDATE_DEPENDS \"\")\n\nforeach(JSON_SRC ${JSON_SOURCES})\n  file(RELATIVE_PATH REL_JSON ${CMAKE_SOURCE_DIR} ${JSON_SRC})\n  file(RELATIVE_PATH REL_TEST_JSON ${CMAKE_CURRENT_SOURCE_DIR} ${JSON_SRC})\n  get_filename_component(JSON_NAME ${JSON_SRC} NAME)\n  get_filename_component(JSON_DIR \"${REL_JSON}\" DIRECTORY)\n  set(OUTPUT_JSON_FOLDER \"${CMAKE_BINARY_DIR}/${JSON_DIR}\")\n\n  # Generate build directory\n  file(MAKE_DIRECTORY \"${OUTPUT_JSON_FOLDER}\")\n  set(OUTPUT_JSON_NAME \"${OUTPUT_JSON_FOLDER}/${JSON_NAME}.instcountci\")\n  set(OUTPUT_JSON_NEWNUMBERS_NAME \"${OUTPUT_JSON_FOLDER}/${JSON_NAME}.instcountci.json\")\n\n  add_custom_command(OUTPUT ${OUTPUT_JSON_NAME}\n    DEPENDS \"${JSON_SRC}\"\n    DEPENDS \"${CMAKE_SOURCE_DIR}/Scripts/InstructionCountParser.py\"\n    COMMAND \"python3\" ARGS \"${CMAKE_SOURCE_DIR}/Scripts/InstructionCountParser.py\" \"${JSON_SRC}\" \"${OUTPUT_JSON_NAME}\")\n\n  list(APPEND JSON_DEPENDS \"${OUTPUT_JSON_NAME}\")\n\n  if (NOT MINGW_BUILD)\n    set(LAUNCH_PROGRAM \"${CMAKE_BINARY_DIR}/Bin/CodeSizeValidation\")\n  else()\n    set(LAUNCH_PROGRAM \"wine\" \"${CMAKE_BINARY_DIR}/Bin/CodeSizeValidation.exe\")\n  endif()\n\n  file(RELATIVE_PATH JSON_PATH_RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${JSON_SRC})\n  set(TEST_NAME \"InstCountCI/Test_${JSON_PATH_RELATIVE}.instcountci\")\n  set(TEST_NAME_UPDATE_NUMBERS \"InstCountCI/Test_${JSON_PATH_RELATIVE}.new_numbers\")\n\n  add_test(NAME ${TEST_NAME}\n    COMMAND ${LAUNCH_PROGRAM} \"${OUTPUT_JSON_NAME}\" \"${OUTPUT_JSON_NEWNUMBERS_NAME}\")\n\n  add_test(NAME ${TEST_NAME_UPDATE_NUMBERS}\n    COMMAND \"python3\" \"${CMAKE_SOURCE_DIR}/Scripts/UpdateInstructionCountJson.py\" \"${JSON_SRC}\" \"${OUTPUT_JSON_NEWNUMBERS_NAME}\")\n\n  set_property(TEST ${TEST_NAME} APPEND PROPERTY DEPENDS \"${CMAKE_BINARY_DIR}/Bin/CodeSizeValidation\")\n  set_property(TEST ${TEST_NAME} APPEND PROPERTY DEPENDS \"${OUTPUT_JSON_NAME}\")\n\n  set_property(TEST ${TEST_NAME_UPDATE_NUMBERS} APPEND PROPERTY DEPENDS \"${TEST_NAME}\")\nendforeach()\n\nadd_custom_target(instcountci_test_files ALL\n  DEPENDS \"${JSON_DEPENDS}\")\n\nadd_custom_target(instcountci_tests\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  DEPENDS instcountci_test_files\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"302\" ${TEST_JOB_FLAG} \"-R\" \"InstCountCI/\\.*.instcountci$$\")\n\nadd_custom_target(instcountci_update_tests\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"302\" ${TEST_JOB_FLAG} \"-R\" \"InstCountCI/\\.*new_numbers$$\")\n"
  },
  {
    "path": "unittests/InstructionCountCI/Crypto/H0F38.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"CRYPTO\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"sha1nexte xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0xc8\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[3]\",\n        \"sha1h s2, s2\",\n        \"dup v2.4s, v2.s[0]\",\n        \"add v2.4s, v17.4s, v2.4s\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[3], v2.s[3]\"\n      ]\n    },\n    \"sha1msg2 xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0xca\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2680]\",\n        \"ldr q2, [x0, #432]\",\n        \"tbl v3.16b, {v16.16b}, v2.16b\",\n        \"tbl v4.16b, {v17.16b}, v2.16b\",\n        \"sha1su1 v3.4s, v4.4s\",\n        \"tbl v16.16b, {v3.16b}, v2.16b\"\n      ]\n    },\n    \"sha256rnds2 xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0xcb\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip2 v2.2d, v17.2d, v16.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v16.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v16.4s, v2.4s\"\n      ]\n    },\n    \"sha256msg1 xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0xcc\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sha256su0 v16.4s, v17.4s\"\n      ]\n    },\n    \"sha256msg2 xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0xcd\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ext v2.16b, v16.16b, v16.16b, #12\",\n        \"dup v3.4s, v16.s[3]\",\n        \"zip2 v3.2d, v3.2d, v17.2d\",\n        \"movi v16.2d, #0x0\",\n        \"sha256su1 v16.4s, v2.4s, v3.4s\"\n      ]\n    },\n    \"aesimc xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0xdb\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"aesimc v16.16b, v17.16b\"\n      ]\n    },\n    \"aesenc xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0xdc\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"aese v16.16b, v2.16b\",\n        \"aesmc v16.16b, v16.16b\",\n        \"eor v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"aesenclast xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0xdd\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"aese v16.16b, v2.16b\",\n        \"eor v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"aesdec xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0xde\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"aesd v16.16b, v2.16b\",\n        \"aesimc v16.16b, v16.16b\",\n        \"eor v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"aesdeclast xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0xdf\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"aesd v16.16b, v2.16b\",\n        \"eor v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"crc32 eax, bl\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x38 0xf0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"crc32cb w4, w4, w6\"\n      ]\n    },\n    \"crc32 eax, bx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x38 0xf1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"crc32ch w4, w4, w6\"\n      ]\n    },\n    \"crc32 eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x38 0xf1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"crc32cw w4, w4, w6\"\n      ]\n    },\n    \"crc32 rax, bl\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x38 0xf0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"crc32cb w4, w4, w6\"\n      ]\n    },\n    \"crc32 rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf2 0x0f 0x38 0xf1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"crc32cx w4, w4, x6\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Crypto/H0F3A.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"CRYPTO\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"pclmulqdq xmm0, xmm1, 00000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x44\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"pmull v16.1q, v16.1d, v17.1d\"\n      ]\n    },\n    \"pclmulqdq xmm0, xmm1, 00001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x44\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v0.2d, v16.d[1]\",\n        \"pmull v16.1q, v0.1d, v17.1d\"\n      ]\n    },\n    \"pclmulqdq xmm0, xmm1, 10000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x44\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v0.2d, v17.d[1]\",\n        \"pmull v16.1q, v0.1d, v16.1d\"\n      ]\n    },\n    \"pclmulqdq xmm0, xmm1, 10001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x44\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"pmull2 v16.1q, v16.2d, v17.2d\"\n      ]\n    },\n    \"aeskeygenassist xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0xdf\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3184]\",\n        \"movi v3.2d, #0x0\",\n        \"mov v16.16b, v17.16b\",\n        \"aese v16.16b, v3.16b\",\n        \"tbl v16.16b, {v16.16b}, v2.16b\"\n      ]\n    },\n    \"aeskeygenassist xmm0, xmm1, 0xFF\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0xdf\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3184]\",\n        \"movi v3.2d, #0x0\",\n        \"mov v16.16b, v17.16b\",\n        \"aese v16.16b, v3.16b\",\n        \"tbl v16.16b, {v16.16b}, v2.16b\",\n        \"mov x0, #0xff00000000\",\n        \"dup v1.2d, x0\",\n        \"eor v16.16b, v16.16b, v1.16b\"\n      ]\n    },\n    \"sha1rnds4 xmm0, xmm1, 00b\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0xcc\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3568]\",\n        \"movi v3.2d, #0x0\",\n        \"ldr x0, [x28, #2680]\",\n        \"ldr q4, [x0, #432]\",\n        \"tbl v5.16b, {v16.16b}, v4.16b\",\n        \"tbl v6.16b, {v17.16b}, v4.16b\",\n        \"add v2.4s, v6.4s, v2.4s\",\n        \"sha1c q5, s3, v2.4s\",\n        \"tbl v16.16b, {v5.16b}, v4.16b\"\n      ]\n    },\n    \"sha1rnds4 xmm0, xmm1, 01b\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0xcc\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3584]\",\n        \"movi v3.2d, #0x0\",\n        \"ldr x0, [x28, #2680]\",\n        \"ldr q4, [x0, #432]\",\n        \"tbl v5.16b, {v16.16b}, v4.16b\",\n        \"tbl v6.16b, {v17.16b}, v4.16b\",\n        \"add v2.4s, v6.4s, v2.4s\",\n        \"sha1p q5, s3, v2.4s\",\n        \"tbl v16.16b, {v5.16b}, v4.16b\"\n      ]\n    },\n    \"sha1rnds4 xmm0, xmm1, 10b\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0xcc\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3600]\",\n        \"movi v3.2d, #0x0\",\n        \"ldr x0, [x28, #2680]\",\n        \"ldr q4, [x0, #432]\",\n        \"tbl v5.16b, {v16.16b}, v4.16b\",\n        \"tbl v6.16b, {v17.16b}, v4.16b\",\n        \"add v2.4s, v6.4s, v2.4s\",\n        \"sha1m q5, s3, v2.4s\",\n        \"tbl v16.16b, {v5.16b}, v4.16b\"\n      ]\n    },\n    \"sha1rnds4 xmm0, xmm1, 11b\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0xcc\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3616]\",\n        \"movi v3.2d, #0x0\",\n        \"ldr x0, [x28, #2680]\",\n        \"ldr q4, [x0, #432]\",\n        \"tbl v5.16b, {v16.16b}, v4.16b\",\n        \"tbl v6.16b, {v17.16b}, v4.16b\",\n        \"add v2.4s, v6.4s, v2.4s\",\n        \"sha1p q5, s3, v2.4s\",\n        \"tbl v16.16b, {v5.16b}, v4.16b\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/DDD.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FRINTTS\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\",\n      \"RPRES\"\n    ]\n  },\n  \"Comment\": [\n    \"These 3DNow! instructions are optimal assuming that FEX doesn't SRA MMX registers\",\n    \"This accounts for the overhead of loading and storing the registers in each instruction\",\n    \"Could technically save some instructions by using SRA for MMX registers.\"\n  ],\n  \"Instructions\": {\n    \"pi2fw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0x0f 0x0f 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"uzp1 v2.4h, v2.4h, v2.4h\",\n        \"sxtl v2.4s, v2.4h\",\n        \"scvtf v2.2s, v2.2s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pi2fd mm0, mm1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0x0f 0x0f 0x0d\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"scvtf v2.2s, v2.2s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pf2iw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0x0f 0x0f 0x1c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"fcvtzs v2.2s, v2.2s\",\n        \"uzp1 v2.4h, v2.4h, v2.4h\",\n        \"sxtl v2.4s, v2.4h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pf2id mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0x0f 0x0f 0x1d\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"frint32z v2.4s, v2.4s\",\n        \"fcvtzs v2.2s, v2.2s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfrcpv mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0x0f 0x0f 0x86\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"fmov v0.4s, #0x70 (1.0000)\",\n        \"fdiv v2.4s, v0.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfrsqrtv mm0, mm1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0x0f 0x0f 0x87\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"fabs v3.4s, v2.4s\",\n        \"fmov v0.4s, #0x70 (1.0000)\",\n        \"fsqrt v1.4s, v3.4s\",\n        \"fdiv v3.4s, v0.4s, v1.4s\",\n        \"movi v0.2s, #0x80, lsl #24\",\n        \"bit v3.8b, v2.8b, v0.8b\",\n        \"str d3, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfnacc mm0, mm1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0x0f 0x8a\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"uzp1 v4.2s, v2.2s, v3.2s\",\n        \"uzp2 v2.2s, v2.2s, v3.2s\",\n        \"fsub v2.4s, v4.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfpnacc mm0, mm1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"0x0f 0x0f 0x8e\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"dup v4.2s, v2.s[1]\",\n        \"fsub s2, s2, s4\",\n        \"faddp v3.4s, v3.4s, v3.4s\",\n        \"mov v2.s[1], v3.s[0]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfcmpge mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x0f 0x90\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"fcmge v2.4s, v3.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfmin mm0, mm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0x0f 0x94\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"fcmgt v0.4s, v2.4s, v3.4s\",\n        \"bif v3.16b, v2.16b, v0.16b\",\n        \"str d3, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfrcp mm0, mm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0x0f 0x0f 0x96\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"fmov s0, #0x70 (1.0000)\",\n        \"fdiv s2, s0, s2\",\n        \"dup v2.2s, v2.s[0]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfrsqrt mm0, mm1\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0x0f 0x0f 0x97\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"fabs v3.4s, v2.4s\",\n        \"fmov v0.4s, #0x70 (1.0000)\",\n        \"fsqrt v1.4s, v3.4s\",\n        \"fdiv v3.4s, v0.4s, v1.4s\",\n        \"movi v0.2s, #0x80, lsl #24\",\n        \"bit v3.8b, v2.8b, v0.8b\",\n        \"dup v2.2s, v3.s[0]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfsub mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x0f 0x9a\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"fsub v2.4s, v3.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfadd mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x0f 0x9e\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"fadd v2.4s, v3.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfcmpgt mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x0f 0xa0\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"fcmgt v2.4s, v3.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfmax mm0, mm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0x0f 0xa4\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"fcmgt v0.4s, v2.4s, v3.4s\",\n        \"bit v3.16b, v2.16b, v0.16b\",\n        \"str d3, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfrcpit1 mm0, mm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0x0f 0xa6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfrcpit1 mm0, mm0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": \"0x0f 0x0f 0xa6\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"pfrsqit1 mm0, mm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0x0f 0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfrsqit1 mm0, mm0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": \"0x0f 0x0f 0xa7\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"pfsubr mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x0f 0xaa\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"fsub v2.4s, v2.4s, v3.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfcmpeq mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x0f 0xb0\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"fcmeq v2.4s, v3.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfmul mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x0f 0xb4\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"fmul v2.4s, v3.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfrcpit2 mm0, mm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0x0f 0xb6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfrcpit2 mm0, mm0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": \"0x0f 0x0f 0xb6\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"db 0x0f, 0x0f, 0xc1, 0xb7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"nasm doesn't support emitting this instruction\",\n        \"pmulhrw mm0, mm1\",\n        \"0x0f 0x0f 0xb7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"smull v2.4s, v2.4h, v3.4h\",\n        \"movi v3.4s, #0x80, lsl #8\",\n        \"add v2.4s, v2.4s, v3.4s\",\n        \"shrn v2.4h, v2.4s, #16\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pswapd mm0, mm1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0x0f 0xbb\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"rev64 v2.2s, v2.2s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pavgusb mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x0f 0xbf\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"urhadd v2.16b, v3.16b, v2.16b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FEXOpt/AddressingLimitations.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\",\n      \"AFP\"\n    ]\n  },\n  \"Comment\": [\n    \"Instructions that explicitly push against the limits of ARM's loadstore instructions\"\n  ],\n  \"Instructions\": {\n    \"movzx rax, byte [ecx - 257]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x101 (257)\",\n        \"mov w20, w20\",\n        \"ldrb w4, [x20]\"\n      ]\n    },\n    \"movzx rax, byte [ecx - 256]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x100 (256)\",\n        \"mov w20, w20\",\n        \"ldrb w4, [x20]\"\n      ]\n    },\n    \"movzx rax, byte [ecx + 255]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0xff (255)\",\n        \"mov w20, w20\",\n        \"ldrb w4, [x20]\"\n      ]\n    },\n    \"movzx rax, byte [ecx + 256]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0x100 (256)\",\n        \"mov w20, w20\",\n        \"ldrb w4, [x20]\"\n      ]\n    },\n    \"movzx rax, byte [ecx + 4095]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0xfff (4095)\",\n        \"mov w20, w20\",\n        \"ldrb w4, [x20]\"\n      ]\n    },\n    \"movzx rax, byte [ecx + 4096]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0x1000 (4096)\",\n        \"mov w20, w20\",\n        \"ldrb w4, [x20]\"\n      ]\n    },\n    \"movzx rax, word [ecx - 257]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x101 (257)\",\n        \"mov w20, w20\",\n        \"ldrh w4, [x20]\"\n      ]\n    },\n    \"movzx rax, word [ecx - 256]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x100 (256)\",\n        \"mov w20, w20\",\n        \"ldrh w4, [x20]\"\n      ]\n    },\n    \"movzx rax, word [ecx + 255]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0xff (255)\",\n        \"mov w20, w20\",\n        \"ldrh w4, [x20]\"\n      ]\n    },\n    \"movzx rax, word [ecx + 256]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0x100 (256)\",\n        \"mov w20, w20\",\n        \"ldrh w4, [x20]\"\n      ]\n    },\n    \"movzx rax, word [ecx + 8190]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1ffe\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldrh w4, [x20]\"\n      ]\n    },\n    \"movzx rax, word [ecx + 8191]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1fff\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldrh w4, [x20]\"\n      ]\n    },\n    \"movzx rax, word [ecx + 8192]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0x2000 (8192)\",\n        \"mov w20, w20\",\n        \"ldrh w4, [x20]\"\n      ]\n    },\n    \"mov eax, dword [ecx - 257]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x101 (257)\",\n        \"mov w20, w20\",\n        \"ldr w4, [x20]\"\n      ]\n    },\n    \"mov eax, dword [ecx - 256]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x100 (256)\",\n        \"mov w20, w20\",\n        \"ldr w4, [x20]\"\n      ]\n    },\n    \"mov eax, dword [ecx + 255]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0xff (255)\",\n        \"mov w20, w20\",\n        \"ldr w4, [x20]\"\n      ]\n    },\n    \"mov eax, dword [ecx + 256]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0x100 (256)\",\n        \"mov w20, w20\",\n        \"ldr w4, [x20]\"\n      ]\n    },\n    \"mov eax, dword [ecx + 16380]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffc\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr w4, [x20]\"\n      ]\n    },\n    \"mov eax, dword [ecx + 16381]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffd\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr w4, [x20]\"\n      ]\n    },\n    \"mov eax, dword [ecx + 16382]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffe\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr w4, [x20]\"\n      ]\n    },\n    \"mov eax, dword [ecx + 16383]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3fff\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr w4, [x20]\"\n      ]\n    },\n    \"mov eax, dword [ecx + 16384]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0x4000 (16384)\",\n        \"mov w20, w20\",\n        \"ldr w4, [x20]\"\n      ]\n    },\n    \"mov rax, qword [ecx - 257]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x101 (257)\",\n        \"mov w20, w20\",\n        \"ldr x4, [x20]\"\n      ]\n    },\n    \"mov rax, qword [ecx - 256]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x100 (256)\",\n        \"mov w20, w20\",\n        \"ldr x4, [x20]\"\n      ]\n    },\n    \"mov rax, qword [ecx + 255]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0xff (255)\",\n        \"mov w20, w20\",\n        \"ldr x4, [x20]\"\n      ]\n    },\n    \"mov rax, qword [ecx + 256]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0x100 (256)\",\n        \"mov w20, w20\",\n        \"ldr x4, [x20]\"\n      ]\n    },\n    \"mov rax, qword [ecx + 32760]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ff8\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr x4, [x20]\"\n      ]\n    },\n    \"mov rax, qword [ecx + 32761]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ff9\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr x4, [x20]\"\n      ]\n    },\n    \"mov rax, qword [ecx + 32762]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ffa\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr x4, [x20]\"\n      ]\n    },\n    \"mov rax, qword [ecx + 32763]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ffb\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr x4, [x20]\"\n      ]\n    },\n    \"mov rax, qword [ecx + 32764]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ffc\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr x4, [x20]\"\n      ]\n    },\n    \"mov rax, qword [ecx + 32765]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ffd\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr x4, [x20]\"\n      ]\n    },\n    \"mov rax, qword [ecx + 32766]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ffe\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr x4, [x20]\"\n      ]\n    },\n    \"mov rax, qword [ecx + 32767]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7fff\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr x4, [x20]\"\n      ]\n    },\n    \"mov rax, qword [ecx + 32768]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0x8000 (32768)\",\n        \"mov w20, w20\",\n        \"ldr x4, [x20]\"\n      ]\n    },\n    \"movzx rax, byte [rcx - 257]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xfffffffffffffeff\",\n        \"ldrb w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movzx rax, byte [rcx - 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldurb w4, [x7, #-256]\"\n      ]\n    },\n    \"movzx rax, byte [rcx + 255]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldrb w4, [x7, #255]\"\n      ]\n    },\n    \"movzx rax, byte [rcx + 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldrb w4, [x7, #256]\"\n      ]\n    },\n    \"movzx rax, byte [rcx + 4095]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldrb w4, [x7, #4095]\"\n      ]\n    },\n    \"movzx rax, byte [rcx + 4096]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1000\",\n        \"ldrb w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movzx rax, word [rcx - 257]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xfffffffffffffeff\",\n        \"ldrh w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movzx rax, word [rcx - 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldurh w4, [x7, #-256]\"\n      ]\n    },\n    \"movzx rax, word [rcx + 255]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldurh w4, [x7, #255]\"\n      ]\n    },\n    \"movzx rax, word [rcx + 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldrh w4, [x7, #256]\"\n      ]\n    },\n    \"movzx rax, word [rcx + 8190]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldrh w4, [x7, #8190]\"\n      ]\n    },\n    \"movzx rax, word [rcx + 8191]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1fff\",\n        \"ldrh w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movzx rax, word [rcx + 8192]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x2000\",\n        \"ldrh w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov eax, dword [rcx - 257]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xfffffffffffffeff\",\n        \"ldr w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov eax, dword [rcx - 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur w4, [x7, #-256]\"\n      ]\n    },\n    \"mov eax, dword [rcx + 255]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur w4, [x7, #255]\"\n      ]\n    },\n    \"mov eax, dword [rcx + 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x7, #256]\"\n      ]\n    },\n    \"mov eax, dword [rcx + 16380]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x7, #16380]\"\n      ]\n    },\n    \"mov eax, dword [rcx + 16381]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffd\",\n        \"ldr w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov eax, dword [rcx + 16382]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffe\",\n        \"ldr w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov eax, dword [rcx + 16383]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3fff\",\n        \"ldr w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov eax, dword [rcx + 16384]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x4000\",\n        \"ldr w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov rax, qword [rcx - 257]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xfffffffffffffeff\",\n        \"ldr x4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov rax, qword [rcx - 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur x4, [x7, #-256]\"\n      ]\n    },\n    \"mov rax, qword [rcx + 255]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur x4, [x7, #255]\"\n      ]\n    },\n    \"mov rax, qword [rcx + 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr x4, [x7, #256]\"\n      ]\n    },\n    \"mov rax, qword [rcx + 32760]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr x4, [x7, #32760]\"\n      ]\n    },\n    \"mov rax, qword [rcx + 32761]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ff9\",\n        \"ldr x4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov rax, qword [rcx + 32762]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ffa\",\n        \"ldr x4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov rax, qword [rcx + 32763]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ffb\",\n        \"ldr x4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov rax, qword [rcx + 32764]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ffc\",\n        \"ldr x4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov rax, qword [rcx + 32765]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ffd\",\n        \"ldr x4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov rax, qword [rcx + 32766]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ffe\",\n        \"ldr x4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov rax, qword [rcx + 32767]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7fff\",\n        \"ldr x4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov rax, qword [rcx + 32768]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x8000\",\n        \"ldr x4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movss xmm0, [rcx + 16379]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffb\",\n        \"ldr s16, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movss xmm0, [rcx + 16380]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr s16, [x7, #16380]\"\n      ]\n    },\n    \"movss xmm0, [rcx + 16381]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffd\",\n        \"ldr s16, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movss xmm0, [rcx - 257]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xfffffffffffffeff\",\n        \"ldr s16, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movss xmm0, [rcx - 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur s16, [x7, #-256]\"\n      ]\n    },\n    \"movss xmm0, [rcx + 255]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur s16, [x7, #255]\"\n      ]\n    },\n    \"movss xmm0, [rcx + 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr s16, [x7, #256]\"\n      ]\n    },\n    \"movsd xmm0, [rcx + 32759]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ff7\",\n        \"ldr d16, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movsd xmm0, [rcx + 32760]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr d16, [x7, #32760]\"\n      ]\n    },\n    \"movsd xmm0, [rcx + 32761]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ff9\",\n        \"ldr d16, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movsd xmm0, [rcx - 257]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xfffffffffffffeff\",\n        \"ldr d16, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movsd xmm0, [rcx - 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur d16, [x7, #-256]\"\n      ]\n    },\n    \"movsd xmm0, [rcx + 255]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur d16, [x7, #255]\"\n      ]\n    },\n    \"movsd xmm0, [rcx + 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr d16, [x7, #256]\"\n      ]\n    },\n    \"movq xmm0, [rcx + 65519]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffef\",\n        \"ldr d16, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movq xmm0, [rcx + 65520]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xfff0\",\n        \"ldr d16, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movq xmm0, [rcx + 65521]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xfff1\",\n        \"ldr d16, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movq xmm0, [rcx - 257]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xfffffffffffffeff\",\n        \"ldr d16, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movq xmm0, [rcx - 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur d16, [x7, #-256]\"\n      ]\n    },\n    \"movq xmm0, [rcx + 255]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur d16, [x7, #255]\"\n      ]\n    },\n    \"movq xmm0, [rcx + 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr d16, [x7, #256]\"\n      ]\n    },\n    \"movss xmm0, [ecx + 16379]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffb\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr s16, [x20]\"\n      ]\n    },\n    \"movss xmm0, [ecx + 16380]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffc\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr s16, [x20]\"\n      ]\n    },\n    \"movss xmm0, [ecx + 16381]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffd\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr s16, [x20]\"\n      ]\n    },\n    \"movss xmm0, [ecx - 257]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x101 (257)\",\n        \"mov w20, w20\",\n        \"ldr s16, [x20]\"\n      ]\n    },\n    \"movss xmm0, [ecx - 256]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x100 (256)\",\n        \"mov w20, w20\",\n        \"ldr s16, [x20]\"\n      ]\n    },\n    \"movss xmm0, [ecx + 255]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0xff (255)\",\n        \"mov w20, w20\",\n        \"ldr s16, [x20]\"\n      ]\n    },\n    \"movss xmm0, [ecx + 256]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0x100 (256)\",\n        \"mov w20, w20\",\n        \"ldr s16, [x20]\"\n      ]\n    },\n    \"movsd xmm0, [ecx + 32759]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ff7\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movsd xmm0, [ecx + 32760]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ff8\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movsd xmm0, [ecx + 32761]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ff9\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movsd xmm0, [ecx - 257]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x101 (257)\",\n        \"mov w20, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movsd xmm0, [ecx - 256]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x100 (256)\",\n        \"mov w20, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movsd xmm0, [ecx + 255]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0xff (255)\",\n        \"mov w20, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movsd xmm0, [ecx + 256]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0x100 (256)\",\n        \"mov w20, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movq xmm0, [ecx + 65519]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffef\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movq xmm0, [ecx + 65520]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xfff0\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movq xmm0, [ecx + 65521]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xfff1\",\n        \"add x20, x7, x20\",\n        \"mov w20, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movq xmm0, [ecx - 257]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x101 (257)\",\n        \"mov w20, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movq xmm0, [ecx - 256]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x100 (256)\",\n        \"mov w20, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movq xmm0, [ecx + 255]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0xff (255)\",\n        \"mov w20, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movq xmm0, [ecx + 256]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0x100 (256)\",\n        \"mov w20, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"prefetch [rcx - 257]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x101 (257)\",\n        \"prfm pldl1keep, [x20]\"\n      ]\n    },\n    \"prefetch [rcx - 256]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x7, #0x100 (256)\",\n        \"prfm pldl1keep, [x20]\"\n      ]\n    },\n    \"prefetch [rcx + 255]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0xff (255)\",\n        \"prfm pldl1keep, [x20]\"\n      ]\n    },\n    \"prefetch [rcx + 256]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x7, #0x100 (256)\",\n        \"prfm pldl1keep, [x20]\"\n      ]\n    },\n    \"prefetch [rcx + 32760]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ff8\",\n        \"add x20, x7, x20\",\n        \"prfm pldl1keep, [x20]\"\n      ]\n    },\n    \"prefetch [rcx + 32761]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ff9\",\n        \"add x20, x7, x20\",\n        \"prfm pldl1keep, [x20]\"\n      ]\n    },\n    \"prefetch [rax + rcx*1]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x4, x7\",\n        \"prfm pldl1keep, [x20]\"\n      ]\n    },\n    \"prefetch [rax + rcx*2]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x4, x7, lsl #1\",\n        \"prfm pldl1keep, [x20]\"\n      ]\n    },\n    \"prefetch [rax + rcx*4]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x4, x7, lsl #2\",\n        \"prfm pldl1keep, [x20]\"\n      ]\n    },\n    \"prefetch [rax + rcx*8]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x4, x7, lsl #3\",\n        \"prfm pldl1keep, [x20]\"\n      ]\n    },\n    \"movzx ebx, byte [rax + rcx*1]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldrb w6, [x4, x7, sxtx]\"\n      ]\n    },\n    \"movzx ebx, byte [rax + rcx*2]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x4, x7, lsl #1\",\n        \"ldrb w6, [x20]\"\n      ]\n    },\n    \"movzx ebx, byte [rax + rcx*4]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x4, x7, lsl #2\",\n        \"ldrb w6, [x20]\"\n      ]\n    },\n    \"movzx ebx, byte [rax + rcx*8]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x4, x7, lsl #3\",\n        \"ldrb w6, [x20]\"\n      ]\n    },\n    \"movzx ebx, word [rax + rcx*1]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldrh w6, [x4, x7, sxtx]\"\n      ]\n    },\n    \"movzx ebx, word [rax + rcx*2]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldrh w6, [x4, x7, sxtx #1]\"\n      ]\n    },\n    \"movzx ebx, word [rax + rcx*4]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x4, x7, lsl #2\",\n        \"ldrh w6, [x20]\"\n      ]\n    },\n    \"movzx ebx, word [rax + rcx*8]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x4, x7, lsl #3\",\n        \"ldrh w6, [x20]\"\n      ]\n    },\n    \"mov ebx, [rax + rcx*1]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr w6, [x4, x7, sxtx]\"\n      ]\n    },\n    \"mov ebx, [rax + rcx*2]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x4, x7, lsl #1\",\n        \"ldr w6, [x20]\"\n      ]\n    },\n    \"mov ebx, [rax + rcx*4]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr w6, [x4, x7, sxtx #2]\"\n      ]\n    },\n    \"mov ebx, [rax + rcx*8]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x4, x7, lsl #3\",\n        \"ldr w6, [x20]\"\n      ]\n    },\n    \"mov rbx, [rax + rcx*1]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr x6, [x4, x7, sxtx]\"\n      ]\n    },\n    \"mov rbx, [rax + rcx*2]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x4, x7, lsl #1\",\n        \"ldr x6, [x20]\"\n      ]\n    },\n    \"mov rbx, [rax + rcx*4]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x4, x7, lsl #2\",\n        \"ldr x6, [x20]\"\n      ]\n    },\n    \"mov rbx, [rax + rcx*8]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr x6, [x4, x7, sxtx #3]\"\n      ]\n    },\n    \"mov ebx, fs:0x14\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x28, #1000]\",\n        \"ldr w6, [x20, #20]\"\n      ]\n    },\n    \"mov rbx, gs:0x14\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x28, #992]\",\n        \"ldur x6, [x20, #20]\"\n      ]\n    },\n    \"Multiple segment registers\": {\n      \"x86Insts\": [\n        \"mov rax, gs:0x100\",\n        \"mov rbx, gs:0x14\"\n      ],\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x28, #992]\",\n        \"ldr x4, [x20, #256]\",\n        \"ldr x20, [x28, #992]\",\n        \"ldur x6, [x20, #20]\"\n      ]\n    },\n    \"vmovdqu ymm7,yword [rsi+0x60]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"ldp q23, q2, [x10, #96]\",\n        \"str q2, [x28, #304]\"\n      ]\n    },\n    \"vmovdqu ymm7,yword [rsi+0x120]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"ldp q23, q2, [x10, #288]\",\n        \"str q2, [x28, #304]\"\n      ]\n    },\n    \"vmovdqu ymm7,yword [rsi-0x60]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"ldp q23, q2, [x10, #-96]\",\n        \"str q2, [x28, #304]\"\n      ]\n    },\n    \"vmovdqu ymm7,yword [rsi-0x400]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"ldp q23, q2, [x10, #-1024]\",\n        \"str q2, [x28, #304]\"\n      ]\n    },\n    \"vmovdqu ymm7,yword [rsi-0x420]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x10, #0x420 (1056)\",\n        \"ldp q23, q2, [x20]\",\n        \"str q2, [x28, #304]\"\n      ]\n    },\n    \"vmovdqu ymm7,yword [rsi+0x3d0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"ldp q23, q2, [x10, #976]\",\n        \"str q2, [x28, #304]\"\n      ]\n    },\n    \"vmovdqu ymm7,yword [rsi+0x400]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"add x20, x10, #0x400 (1024)\",\n        \"ldp q23, q2, [x20]\",\n        \"str q2, [x28, #304]\"\n      ]\n    },\n    \"vmovdqa yword [rcx+0x60],ymm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"stp q17, q2, [x7, #96]\"\n      ]\n    },\n    \"vmovdqa yword [rcx+0x3d0],ymm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"stp q17, q2, [x7, #976]\"\n      ]\n    },\n    \"vmovdqa yword [rcx-0x3d0],ymm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"stp q17, q2, [x7, #-976]\"\n      ]\n    },\n    \"vmovdqa yword [rcx+rsi-0x3d0],ymm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #208]\",\n        \"add x20, x7, x10\",\n        \"stp q17, q2, [x20, #-976]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FEXOpt/AddressingLimitations_32Bit.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\",\n      \"AFP\"\n    ]\n  },\n  \"Comment\": [\n    \"Instructions that explicitly push against the limits of ARM's loadstore instructions\"\n  ],\n  \"Instructions\": {\n    \"movzx eax, byte [ecx - 257]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xfffffffffffffeff\",\n        \"ldrb w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movzx eax, byte [ecx - 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldurb w4, [x7, #-256]\"\n      ]\n    },\n    \"movzx eax, byte [ecx + 255]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldrb w4, [x7, #255]\"\n      ]\n    },\n    \"movzx eax, byte [ecx + 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldrb w4, [x7, #256]\"\n      ]\n    },\n    \"movzx eax, byte [ecx + 4095]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldrb w4, [x7, #4095]\"\n      ]\n    },\n    \"movzx eax, byte [ecx + 4096]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1000\",\n        \"ldrb w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movzx eax, word [ecx - 257]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xfffffffffffffeff\",\n        \"ldrh w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movzx eax, word [ecx - 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldurh w4, [x7, #-256]\"\n      ]\n    },\n    \"movzx eax, word [ecx + 255]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldurh w4, [x7, #255]\"\n      ]\n    },\n    \"movzx eax, word [ecx + 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldrh w4, [x7, #256]\"\n      ]\n    },\n    \"movzx eax, word [ecx + 8190]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldrh w4, [x7, #8190]\"\n      ]\n    },\n    \"movzx eax, word [ecx + 8191]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1fff\",\n        \"ldrh w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movzx eax, word [ecx + 8192]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x2000\",\n        \"ldrh w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov eax, dword [ecx - 257]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xfffffffffffffeff\",\n        \"ldr w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov eax, dword [ecx - 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur w4, [x7, #-256]\"\n      ]\n    },\n    \"mov eax, dword [ecx + 255]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur w4, [x7, #255]\"\n      ]\n    },\n    \"mov eax, dword [ecx + 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x7, #256]\"\n      ]\n    },\n    \"mov eax, dword [ecx + 16380]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x7, #16380]\"\n      ]\n    },\n    \"mov eax, dword [ecx + 16381]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffd\",\n        \"ldr w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov eax, dword [ecx + 16382]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffe\",\n        \"ldr w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov eax, dword [ecx + 16383]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3fff\",\n        \"ldr w4, [x7, x20, sxtx]\"\n      ]\n    },\n    \"mov eax, dword [ecx + 16384]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"add w20, w7, #0x4000 (16384)\",\n        \"ldr w4, [x20]\"\n      ]\n    },\n    \"movss xmm0, [ecx + 16379]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffb\",\n        \"ldr s16, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movss xmm0, [ecx + 16380]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr s16, [x7, #16380]\"\n      ]\n    },\n    \"movss xmm0, [ecx + 16381]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffd\",\n        \"ldr s16, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movss xmm0, [ecx - 257]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xfffffffffffffeff\",\n        \"ldr s16, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movss xmm0, [ecx - 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur s16, [x7, #-256]\"\n      ]\n    },\n    \"movss xmm0, [ecx + 255]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur s16, [x7, #255]\"\n      ]\n    },\n    \"movss xmm0, [ecx + 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr s16, [x7, #256]\"\n      ]\n    },\n    \"movsd xmm0, [ecx + 32759]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ff7\",\n        \"add w20, w7, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movsd xmm0, [ecx + 32760]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ff8\",\n        \"add w20, w7, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movsd xmm0, [ecx + 32761]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x7ff9\",\n        \"add w20, w7, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movsd xmm0, [ecx - 257]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xfffffffffffffeff\",\n        \"ldr d16, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movsd xmm0, [ecx - 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur d16, [x7, #-256]\"\n      ]\n    },\n    \"movsd xmm0, [ecx + 255]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur d16, [x7, #255]\"\n      ]\n    },\n    \"movsd xmm0, [ecx + 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr d16, [x7, #256]\"\n      ]\n    },\n    \"movq xmm0, [ecx + 65519]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffef\",\n        \"add w20, w7, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movq xmm0, [ecx + 65520]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xfff0\",\n        \"add w20, w7, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movq xmm0, [ecx + 65521]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xfff1\",\n        \"add w20, w7, w20\",\n        \"ldr d16, [x20]\"\n      ]\n    },\n    \"movq xmm0, [ecx - 257]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xfffffffffffffeff\",\n        \"ldr d16, [x7, x20, sxtx]\"\n      ]\n    },\n    \"movq xmm0, [ecx - 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur d16, [x7, #-256]\"\n      ]\n    },\n    \"movq xmm0, [ecx + 255]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldur d16, [x7, #255]\"\n      ]\n    },\n    \"movq xmm0, [ecx + 256]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ldr d16, [x7, #256]\"\n      ]\n    },\n    \"mov ebx, fs:0x14\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x28, #1000]\",\n        \"ldr w6, [x20, #20]\"\n      ]\n    },\n    \"mov ebx, gs:0x14\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x28, #992]\",\n        \"ldr w6, [x20, #20]\"\n      ]\n    },\n    \"Multiple segment registers\": {\n      \"x86Insts\": [\n        \"mov eax, gs:0x100\",\n        \"mov ebx, gs:0x14\"\n      ],\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 4,\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x28, #992]\",\n        \"ldr w4, [x20, #256]\",\n        \"ldr w20, [x28, #992]\",\n        \"ldr w6, [x20, #20]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FEXOpt/MultiInst.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"FRINTTS\",\n      \"MOPS\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\",\n      \"AFP\"\n    ]\n  },\n  \"Comment\": [\n    \"These are instruction combinations that could be more optimal if FEX optimized for them\"\n  ],\n  \"Instructions\": {\n    \"cpuid constant\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"CPUID function call with constant function id\"\n      ],\n      \"x86Insts\": [\n        \"mov rax, 0\",\n        \"cpuid\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, #0x0\",\n        \"isb\",\n        \"mov w20, #0x16\",\n        \"mov w6, #0x6547\",\n        \"movk w6, #0x756e, lsl #16\",\n        \"mov w21, #0x746e\",\n        \"movk w21, #0x6c65, lsl #16\",\n        \"mov w5, #0x6e69\",\n        \"movk w5, #0x4965, lsl #16\",\n        \"mov x7, x21\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"xgetbv constant\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"XGETBV function call with constant function id\"\n      ],\n      \"x86Insts\": [\n        \"mov rcx, 0\",\n        \"xgetbv\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w7, #0x0\",\n        \"mov w4, #0x7\",\n        \"mov w5, #0x0\"\n      ]\n    },\n    \"signed div narrow\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"div narrowing with known smaller sources\",\n        \"dividend in rdx:rax\"\n      ],\n      \"x86Insts\": [\n        \"cqo\",\n        \"idiv rcx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"asr x5, x4, #63\",\n        \"sdiv x20, x4, x7\",\n        \"msub x22, x20, x7, x4\",\n        \"mov x5, x22\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"unsigned div narrow\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"div narrowing with known smaller sources\",\n        \"dividend in rdx:rax\"\n      ],\n      \"x86Insts\": [\n        \"mov rdx, 0\",\n        \"div rcx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w5, #0x0\",\n        \"udiv x20, x4, x7\",\n        \"msub x22, x20, x7, x4\",\n        \"mov x5, x22\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"unsigned div narrow with flags\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"div narrowing with known smaller sources\",\n        \"dividend in rdx:rax\"\n      ],\n      \"x86Insts\": [\n        \"xor rdx, rdx\",\n        \"div rcx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w5, w5\",\n        \"mov w5, #0x0\",\n        \"udiv x20, x4, x7\",\n        \"msub x22, x20, x7, x4\",\n        \"mov x5, x22\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"signed div narrow 32-bit\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 10,\n      \"x86Insts\": [\n        \"mov    eax, edi\",\n        \"cdq\",\n        \"idiv    esi\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, w11\",\n        \"asr w5, w4, #31\",\n        \"mov w20, w10\",\n        \"mov x0, x4\",\n        \"bfi x0, x5, #32, #32\",\n        \"sxtw x1, w20\",\n        \"sdiv x22, x0, x1\",\n        \"msub x21, x22, x1, x0\",\n        \"mov w4, w22\",\n        \"mov w5, w21\"\n      ]\n    },\n    \"unsigned div narrow 32-bit\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 7,\n      \"x86Insts\": [\n        \"mov    eax, edi\",\n        \"xor    edx, edx\",\n        \"div    esi\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, w11\",\n        \"subs w26, w5, w5\",\n        \"mov w5, #0x0\",\n        \"udiv w20, w4, w10\",\n        \"msub w22, w20, w10, w4\",\n        \"mov w4, w20\",\n        \"mov w5, w22\"\n      ]\n    },\n    \"push ax, bx\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Mergable 16-bit pushes. May or may not be an optimization.\"\n      ],\n      \"x86Insts\": [\n        \"push ax\",\n        \"push bx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strh w4, [x8, #-2]!\",\n        \"strh w6, [x8, #-2]!\"\n      ]\n    },\n    \"push rax, rbx\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Mergable 64-bit pushes\"\n      ],\n      \"x86Insts\": [\n        \"push rax\",\n        \"push rbx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp x6, x4, [x8, #-16]!\"\n      ]\n    },\n    \"adds xmm0, xmm1, xmm2\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Redundant scalar adds that can get eliminated without AFP.\"\n      ],\n      \"x86Insts\": [\n        \"addss xmm0, xmm1\",\n        \"addss xmm0, xmm2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fadd s0, s16, s17\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"fadd s0, s16, s18\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"positive movsb\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"cld\",\n        \"movsb\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldrb w21, [x10]\",\n        \"strb w21, [x11]\",\n        \"add x10, x10, x20\",\n        \"add x11, x11, x20\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"positive movsw\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"cld\",\n        \"movsw\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldrh w21, [x10]\",\n        \"strh w21, [x11]\",\n        \"add x10, x10, x20, lsl #1\",\n        \"add x11, x11, x20, lsl #1\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"positive movsd\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"cld\",\n        \"movsd\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldr w21, [x10]\",\n        \"str w21, [x11]\",\n        \"add x10, x10, x20, lsl #2\",\n        \"add x11, x11, x20, lsl #2\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"positive movsq\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"cld\",\n        \"movsq\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldr x21, [x10]\",\n        \"str x21, [x11]\",\n        \"add x10, x10, x20, lsl #3\",\n        \"add x11, x11, x20, lsl #3\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"negative movsb\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"std\",\n        \"movsb\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"ldrb w21, [x10]\",\n        \"strb w21, [x11]\",\n        \"add x10, x10, x20\",\n        \"add x11, x11, x20\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"negative movsw\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"std\",\n        \"movsw\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"ldrh w21, [x10]\",\n        \"strh w21, [x11]\",\n        \"add x10, x10, x20, lsl #1\",\n        \"add x11, x11, x20, lsl #1\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"negative movsd\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"std\",\n        \"movsd\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"ldr w21, [x10]\",\n        \"str w21, [x11]\",\n        \"add x10, x10, x20, lsl #2\",\n        \"add x11, x11, x20, lsl #2\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"negative movsq\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"std\",\n        \"movsq\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"ldr x21, [x10]\",\n        \"str x21, [x11]\",\n        \"add x10, x10, x20, lsl #3\",\n        \"add x11, x11, x20, lsl #3\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"positive rep movsb\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 54,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"cld\",\n        \"rep movsb\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"cbz x0, #+0xa4\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x18\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x7c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x54\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x40 (64)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x40 (64)\",\n        \"cbz x0, #+0x34\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x14\",\n        \"ldrb w3, [x2], #1\",\n        \"strb w3, [x1], #1\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"add x22, x0, x2\",\n        \"add x21, x1, x2\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\",\n        \"mov x11, x22\",\n        \"mov x10, x21\"\n      ]\n    },\n    \"positive rep movsw\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 55,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"cld\",\n        \"rep movsw\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"cbz x0, #+0xa8\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x1c\",\n        \"lsl x0, x0, #1\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x7c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x54\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x34\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x14\",\n        \"ldrh w3, [x2], #2\",\n        \"strh w3, [x1], #2\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"add x22, x0, x2, lsl #1\",\n        \"add x21, x1, x2, lsl #1\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\",\n        \"mov x11, x22\",\n        \"mov x10, x21\"\n      ]\n    },\n    \"positive rep movsd\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 55,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"cld\",\n        \"rep movsd\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"cbz x0, #+0xa8\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x1c\",\n        \"lsl x0, x0, #2\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x7c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x54\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x34\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x14\",\n        \"ldr w3, [x2], #4\",\n        \"str w3, [x1], #4\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"add x22, x0, x2, lsl #2\",\n        \"add x21, x1, x2, lsl #2\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\",\n        \"mov x11, x22\",\n        \"mov x10, x21\"\n      ]\n    },\n    \"positive rep movsq\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 55,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"cld\",\n        \"rep movsq\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"cbz x0, #+0xa8\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x1c\",\n        \"lsl x0, x0, #3\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x7c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x54\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x34\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x4 (4)\",\n        \"cbz x0, #+0x14\",\n        \"ldr x3, [x2], #8\",\n        \"str x3, [x1], #8\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"add x22, x0, x2, lsl #3\",\n        \"add x21, x1, x2, lsl #3\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\",\n        \"mov x11, x22\",\n        \"mov x10, x21\"\n      ]\n    },\n    \"negative rep movsb\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 62,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"std\",\n        \"rep movsb\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"cbz x0, #+0xc4\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x28\",\n        \"sub x1, x1, x0\",\n        \"sub x2, x2, x0\",\n        \"add x1, x1, #0x1 (1)\",\n        \"add x2, x2, #0x1 (1)\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x8c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x64\",\n        \"sub x1, x1, #0x1f (31)\",\n        \"sub x2, x2, #0x1f (31)\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x40 (64)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x40 (64)\",\n        \"cbz x0, #+0x3c\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x1c\",\n        \"add x1, x1, #0x1f (31)\",\n        \"add x2, x2, #0x1f (31)\",\n        \"ldrb w3, [x2], #-1\",\n        \"strb w3, [x1], #-1\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"sub x22, x0, x2\",\n        \"sub x21, x1, x2\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\",\n        \"mov x11, x22\",\n        \"mov x10, x21\"\n      ]\n    },\n    \"negative rep movsw\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 63,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"std\",\n        \"rep movsw\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"cbz x0, #+0xc8\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x2c\",\n        \"lsl x0, x0, #1\",\n        \"sub x1, x1, x0\",\n        \"sub x2, x2, x0\",\n        \"add x1, x1, #0x2 (2)\",\n        \"add x2, x2, #0x2 (2)\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x8c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x64\",\n        \"sub x1, x1, #0x1e (30)\",\n        \"sub x2, x2, #0x1e (30)\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x3c\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x1c\",\n        \"add x1, x1, #0x1e (30)\",\n        \"add x2, x2, #0x1e (30)\",\n        \"ldrh w3, [x2], #-2\",\n        \"strh w3, [x1], #-2\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"sub x22, x0, x2, lsl #1\",\n        \"sub x21, x1, x2, lsl #1\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\",\n        \"mov x11, x22\",\n        \"mov x10, x21\"\n      ]\n    },\n    \"negative rep movsd\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 63,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"std\",\n        \"rep movsd\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"cbz x0, #+0xc8\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x2c\",\n        \"lsl x0, x0, #2\",\n        \"sub x1, x1, x0\",\n        \"sub x2, x2, x0\",\n        \"add x1, x1, #0x4 (4)\",\n        \"add x2, x2, #0x4 (4)\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x8c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x64\",\n        \"sub x1, x1, #0x1c (28)\",\n        \"sub x2, x2, #0x1c (28)\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x3c\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x1c\",\n        \"add x1, x1, #0x1c (28)\",\n        \"add x2, x2, #0x1c (28)\",\n        \"ldr w3, [x2], #-4\",\n        \"str w3, [x1], #-4\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"sub x22, x0, x2, lsl #2\",\n        \"sub x21, x1, x2, lsl #2\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\",\n        \"mov x11, x22\",\n        \"mov x10, x21\"\n      ]\n    },\n    \"negative rep movsq\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 63,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"std\",\n        \"rep movsq\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"cbz x0, #+0xc8\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x2c\",\n        \"lsl x0, x0, #3\",\n        \"sub x1, x1, x0\",\n        \"sub x2, x2, x0\",\n        \"add x1, x1, #0x8 (8)\",\n        \"add x2, x2, #0x8 (8)\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x8c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x64\",\n        \"sub x1, x1, #0x18 (24)\",\n        \"sub x2, x2, #0x18 (24)\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x3c\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x4 (4)\",\n        \"cbz x0, #+0x1c\",\n        \"add x1, x1, #0x18 (24)\",\n        \"add x2, x2, #0x18 (24)\",\n        \"ldr x3, [x2], #-8\",\n        \"str x3, [x1], #-8\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"sub x22, x0, x2, lsl #3\",\n        \"sub x21, x1, x2, lsl #3\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\",\n        \"mov x11, x22\",\n        \"mov x10, x21\"\n      ]\n    },\n    \"positive rep stosb\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"cld\",\n        \"rep stosb\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"uxtb w21, w4\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"cbz x0, #+0x1c\",\n        \"mrs x2, nzcv\",\n        \"setp [x1]!, x0!, x21\",\n        \"setm [x1]!, x0!, x21\",\n        \"sete [x1]!, x0!, x21\",\n        \"msr nzcv, x2\",\n        \"add x11, x11, x7\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"positive rep stosw\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"cld\",\n        \"rep stosw\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"uxth w21, w4\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"cbz x0, #+0x58\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.8h, w21\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #32\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x2c\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x10\",\n        \"strh w21, [x1], #2\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"add x11, x11, x7, lsl #1\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"positive rep stosd\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"cld\",\n        \"rep stosd\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mov w21, w4\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"cbz x0, #+0x58\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.4s, w21\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #32\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x2c\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x10\",\n        \"str w21, [x1], #4\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"add x11, x11, x7, lsl #2\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"positive rep stosq\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 28,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"cld\",\n        \"rep stosq\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"cbz x0, #+0x58\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.2d, x4\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #32\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x2c\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x4 (4)\",\n        \"cbz x0, #+0x10\",\n        \"str x4, [x1], #8\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"add x11, x11, x7, lsl #3\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"negative rep stosb\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"std\",\n        \"rep stosb\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"uxtb w21, w4\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"cbz x0, #+0x24\",\n        \"sub x1, x1, x0\",\n        \"add x1, x1, #0x1 (1)\",\n        \"mrs x2, nzcv\",\n        \"setp [x1]!, x0!, x21\",\n        \"setm [x1]!, x0!, x21\",\n        \"sete [x1]!, x0!, x21\",\n        \"msr nzcv, x2\",\n        \"sub x11, x11, x7\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"negative rep stosw\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"std\",\n        \"rep stosw\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"uxth w21, w4\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"cbz x0, #+0x60\",\n        \"sub x1, x1, #0x1e (30)\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.8h, w21\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #-32\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x30\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x14\",\n        \"add x1, x1, #0x1e (30)\",\n        \"strh w21, [x1], #-2\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"sub x11, x11, x7, lsl #1\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"negative rep stosd\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"std\",\n        \"rep stosd\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"mov w21, w4\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"cbz x0, #+0x60\",\n        \"sub x1, x1, #0x1c (28)\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.4s, w21\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #-32\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x30\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x14\",\n        \"add x1, x1, #0x1c (28)\",\n        \"str w21, [x1], #-4\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"sub x11, x11, x7, lsl #2\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"negative rep stosq\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"When direction flag is a compile time constant we can optimize\",\n        \"loads and stores can turn in to post-increment when known\"\n      ],\n      \"x86Insts\": [\n        \"std\",\n        \"rep stosq\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"cbz x0, #+0x60\",\n        \"sub x1, x1, #0x18 (24)\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.2d, x4\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #-32\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x30\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x4 (4)\",\n        \"cbz x0, #+0x14\",\n        \"add x1, x1, #0x18 (24)\",\n        \"str x4, [x1], #-8\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"sub x11, x11, x7, lsl #3\",\n        \"mov w7, #0x0\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"Sekiro spill block\": {\n      \"x86InstructionCount\": 119,\n      \"ExpectedInstructionCount\": 115,\n      \"Comment\": [\n        \"This block of code came from the settings screen when it loaded\",\n        \"It was originally at RIP: 0x14232cca0 and has been deobfuscated\"\n      ],\n      \"x86Insts\": [\n        \"mov    QWORD [rsp+0x8],rcx\",\n        \"push   rbx\",\n        \"push   rbp\",\n        \"push   rsi\",\n        \"push   rdi\",\n        \"push   r12\",\n        \"push   r13\",\n        \"push   r14\",\n        \"push   r15\",\n        \"sub    rsp,0x18\",\n        \"mov    ecx,dword [rdx+0x24]\",\n        \"mov    esi,dword [rdx]\",\n        \"mov    ebp,dword [rdx+0x4]\",\n        \"mov    r14d,dword [rdx+0x8]\",\n        \"mov    r15d,dword [rdx+0xc]\",\n        \"mov    r12d,dword [rdx+0x10]\",\n        \"mov    r13d,dword [rdx+0x14]\",\n        \"mov    r11d,dword [rdx+0x18]\",\n        \"mov    ebx,dword [rdx+0x1c]\",\n        \"mov    edi,dword [rdx+0x20]\",\n        \"imul   eax,ecx,0x13\",\n        \"mov    dword [rsp+0x68],ecx\",\n        \"add    eax,0x1000000\",\n        \"shr    eax,0x19\",\n        \"add    eax,esi\",\n        \"sar    eax,0x1a\",\n        \"add    eax,ebp\",\n        \"sar    eax,0x19\",\n        \"add    eax,r14d\",\n        \"sar    eax,0x1a\",\n        \"add    eax,r15d\",\n        \"sar    eax,0x19\",\n        \"add    eax,r12d\",\n        \"sar    eax,0x1a\",\n        \"add    eax,r13d\",\n        \"sar    eax,0x19\",\n        \"add    eax,r11d\",\n        \"sar    eax,0x1a\",\n        \"add    eax,ebx\",\n        \"sar    eax,0x19\",\n        \"add    eax,edi\",\n        \"sar    eax,0x1a\",\n        \"add    eax,ecx\",\n        \"sar    eax,0x19\",\n        \"imul   eax,eax,0x13\",\n        \"add    esi,eax\",\n        \"mov    eax,esi\",\n        \"sar    eax,0x1a\",\n        \"add    ebp,eax\",\n        \"shl    eax,0x1a\",\n        \"sub    esi,eax\",\n        \"mov    ecx,ebp\",\n        \"mov    rax,qword [rsp+0x60]\",\n        \"sar    ecx,0x19\",\n        \"add    r14d,ecx\",\n        \"shl    ecx,0x19\",\n        \"mov    edx,r14d\",\n        \"sub    ebp,ecx\",\n        \"sar    edx,0x1a\",\n        \"add    r15d,edx\",\n        \"mov    dword [rax],esi\",\n        \"mov    r8d,r15d\",\n        \"shl    edx,0x1a\",\n        \"sar    r8d,0x19\",\n        \"sub    r14d,edx\",\n        \"add    r12d,r8d\",\n        \"mov    dword [rax+0x4],ebp\",\n        \"mov    r9d,r12d\",\n        \"shl    r8d,0x19\",\n        \"sar    r9d,0x1a\",\n        \"sub    r15d,r8d\",\n        \"add    r13d,r9d\",\n        \"mov    dword [rax+0x8],r14d\",\n        \"shl    r9d,0x1a\",\n        \"mov    r10d,r13d\",\n        \"sar    r10d,0x19\",\n        \"sub    r12d,r9d\",\n        \"add    r11d,r10d\",\n        \"mov    dword [rax+0xc],r15d\",\n        \"mov    dword [rsp+0x70],r11d\",\n        \"mov    rsi,rax\",\n        \"sar    r11d,0x1a\",\n        \"add    ebx,r11d\",\n        \"mov    dword [rax+0x10],r12d\",\n        \"mov    dword [rsp+0x78],ebx\",\n        \"sar    ebx,0x19\",\n        \"add    edi,ebx\",\n        \"mov    dword [rsp],edi\",\n        \"sar    edi,0x1a\",\n        \"add    dword [rsp+0x68],edi\",\n        \"shl    r10d,0x19\",\n        \"mov    ecx,dword [rsp+0x68]\",\n        \"sub    r13d,r10d\",\n        \"mov    dword [rax+0x14],r13d\",\n        \"mov    eax,dword [rsp+0x70]\",\n        \"shl    r11d,0x1a\",\n        \"sub    eax,r11d\",\n        \"shl    ebx,0x19\",\n        \"mov    dword [rsi+0x18],eax\",\n        \"mov    eax,dword [rsp+0x78]\",\n        \"sub    eax,ebx\",\n        \"shl    edi,0x1a\",\n        \"mov    dword [rsi+0x1c],eax\",\n        \"mov    eax,dword [rsp]\",\n        \"sub    eax,edi\",\n        \"mov    dword [rsi+0x20],eax\",\n        \"mov    eax,ecx\",\n        \"and    eax,0xfe000000\",\n        \"sub    ecx,eax\",\n        \"mov    dword [rsi+0x24],ecx\",\n        \"add    rsp,0x18\",\n        \"pop    r15\",\n        \"pop    r14\",\n        \"pop    r13\",\n        \"pop    r12\",\n        \"pop    rdi\",\n        \"pop    rsi\",\n        \"pop    rbp\",\n        \"pop    rbx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str x7, [x8, #8]\",\n        \"stp x9, x6, [x8, #-16]!\",\n        \"stp x11, x10, [x8, #-16]!\",\n        \"stp x17, x16, [x8, #-16]!\",\n        \"stp x29, x19, [x8, #-16]!\",\n        \"sub x8, x8, #0x18 (24)\",\n        \"ldr w7, [x5, #36]\",\n        \"ldr w10, [x5]\",\n        \"ldr w9, [x5, #4]\",\n        \"ldr w19, [x5, #8]\",\n        \"ldr w29, [x5, #12]\",\n        \"ldr w16, [x5, #16]\",\n        \"ldr w17, [x5, #20]\",\n        \"ldr w15, [x5, #24]\",\n        \"ldr w6, [x5, #28]\",\n        \"ldr w11, [x5, #32]\",\n        \"mov w20, #0x13\",\n        \"mul w4, w7, w20\",\n        \"str w7, [x8, #104]\",\n        \"mov w21, #0x1000000\",\n        \"add w4, w4, w21\",\n        \"lsr w4, w4, #25\",\n        \"add w4, w4, w10\",\n        \"asr w4, w4, #26\",\n        \"add w4, w4, w9\",\n        \"asr w4, w4, #25\",\n        \"add w4, w4, w19\",\n        \"asr w4, w4, #26\",\n        \"add w4, w4, w29\",\n        \"asr w4, w4, #25\",\n        \"add w4, w4, w16\",\n        \"asr w4, w4, #26\",\n        \"add w4, w4, w17\",\n        \"asr w4, w4, #25\",\n        \"add w4, w4, w15\",\n        \"asr w4, w4, #26\",\n        \"add w4, w4, w6\",\n        \"asr w4, w4, #25\",\n        \"add w4, w4, w11\",\n        \"asr w4, w4, #26\",\n        \"add w4, w4, w7\",\n        \"asr w4, w4, #25\",\n        \"mul w4, w4, w20\",\n        \"add w10, w10, w4\",\n        \"asr w4, w10, #26\",\n        \"add w9, w9, w4\",\n        \"lsl w4, w4, #26\",\n        \"sub w10, w10, w4\",\n        \"mov w7, w9\",\n        \"ldr x4, [x8, #96]\",\n        \"asr w7, w7, #25\",\n        \"add w19, w19, w7\",\n        \"lsl w7, w7, #25\",\n        \"mov w5, w19\",\n        \"sub w9, w9, w7\",\n        \"asr w5, w5, #26\",\n        \"add w29, w29, w5\",\n        \"str w10, [x4]\",\n        \"mov w12, w29\",\n        \"lsl w5, w5, #26\",\n        \"asr w12, w12, #25\",\n        \"sub w19, w19, w5\",\n        \"add w16, w16, w12\",\n        \"str w9, [x4, #4]\",\n        \"mov w13, w16\",\n        \"lsl w12, w12, #25\",\n        \"asr w13, w13, #26\",\n        \"sub w29, w29, w12\",\n        \"add w17, w17, w13\",\n        \"str w19, [x4, #8]\",\n        \"lsl w13, w13, #26\",\n        \"asr w14, w17, #25\",\n        \"sub w16, w16, w13\",\n        \"add w15, w15, w14\",\n        \"str w29, [x4, #12]\",\n        \"str w15, [x8, #112]\",\n        \"mov x10, x4\",\n        \"asr w15, w15, #26\",\n        \"add w6, w6, w15\",\n        \"str w16, [x4, #16]\",\n        \"str w6, [x8, #120]\",\n        \"asr w6, w6, #25\",\n        \"add w11, w11, w6\",\n        \"str w11, [x8]\",\n        \"asr w11, w11, #26\",\n        \"ldr w20, [x8, #104]\",\n        \"add w20, w20, w11\",\n        \"str w20, [x8, #104]\",\n        \"lsl w14, w14, #25\",\n        \"ldr w7, [x8, #104]\",\n        \"sub w17, w17, w14\",\n        \"str w17, [x4, #20]\",\n        \"ldr w4, [x8, #112]\",\n        \"lsl w15, w15, #26\",\n        \"sub w4, w4, w15\",\n        \"lsl w6, w6, #25\",\n        \"str w4, [x10, #24]\",\n        \"ldr w4, [x8, #120]\",\n        \"sub w4, w4, w6\",\n        \"lsl w11, w11, #26\",\n        \"str w4, [x10, #28]\",\n        \"ldr w4, [x8]\",\n        \"sub w4, w4, w11\",\n        \"str w4, [x10, #32]\",\n        \"and w4, w7, #0xfe000000\",\n        \"sub w7, w7, w4\",\n        \"str w7, [x10, #36]\",\n        \"mvn w27, w8\",\n        \"adds x26, x8, #0x18 (24)\",\n        \"mov x8, x26\",\n        \"ldp x29, x19, [x8], #16\",\n        \"ldp x17, x16, [x8], #16\",\n        \"ldp x11, x10, [x8], #16\",\n        \"ldp x9, x6, [x8], #16\",\n        \"cfinv\"\n      ]\n    },\n    \"Control - random block using cvtss2si 1\": {\n      \"x86InstructionCount\": 7,\n      \"ExpectedInstructionCount\": 13,\n      \"x86Insts\": [\n        \"mov    rcx,rdx\",\n        \"cvttss2si rax,xmm1\",\n        \"add    rax,rcx\",\n        \"mov    qword [rsp],rax\",\n        \"mulss  xmm0,dword [rbp]\",\n        \"xor    ecx,ecx\",\n        \"comiss xmm0,xmm2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x7, x5\",\n        \"frint64z s2, s17\",\n        \"fcvtzs x4, s2\",\n        \"add x4, x4, x7\",\n        \"str x4, [x8]\",\n        \"ldr s2, [x9]\",\n        \"fmul s0, s16, s2\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"mov w7, #0x0\",\n        \"fcmp s16, s18\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"mov x27, x7\"\n      ]\n    },\n    \"Control - random block using cvtss2si 2\": {\n      \"x86InstructionCount\": 6,\n      \"ExpectedInstructionCount\": 9,\n      \"x86Insts\": [\n        \"movss  xmm1,dword [rbp+0x40]\",\n        \"roundss xmm1,xmm1,0x1\",\n        \"cvtss2si eax,xmm1\",\n        \"mov    dword [r15+0xb4],eax\",\n        \"mov    dword [rbp+0x48],0x3f800000\",\n        \"test   r14,r14\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s17, [x9, #64]\",\n        \"frintm s0, s17\",\n        \"mov v17.s[0], v0.s[0]\",\n        \"frint32x s2, s17\",\n        \"fcvtzs w4, s2\",\n        \"str w4, [x29, #180]\",\n        \"mov w20, #0x3f800000\",\n        \"str w20, [x9, #72]\",\n        \"subs x26, x19, #0x0 (0)\"\n      ]\n    },\n    \"Long-lived ymm_high test\": {\n      \"x86InstructionCount\": 16,\n      \"ExpectedInstructionCount\": 132,\n      \"Comment\": [\n        \"Inspired from a Geekbench benchmark hammering this instruction\",\n        \"Keeps a bunch of ymm_high values live that can get spilled in to spill-slots\",\n        \"These can instead be spilled back in to the context without any stack usage\",\n        \"Useful to ensure we aren't evicting cachelines unnnecessarily\"\n      ],\n      \"x86Insts\": [\n        \"vpmaddwd ymm0, ymm1, ymm15\",\n        \"vpmaddwd ymm1, ymm2, ymm14\",\n        \"vpmaddwd ymm2, ymm3, ymm13\",\n        \"vpmaddwd ymm3, ymm4, ymm12\",\n        \"vpmaddwd ymm4, ymm5, ymm11\",\n        \"vpmaddwd ymm5, ymm6, ymm10\",\n        \"vpmaddwd ymm6, ymm7, ymm9\",\n        \"vpmaddwd ymm7, ymm8, ymm8\",\n        \"vpmaddwd ymm8, ymm9, ymm7\",\n        \"vpmaddwd ymm9, ymm10, ymm6\",\n        \"vpmaddwd ymm10, ymm11, ymm5\",\n        \"vpmaddwd ymm11, ymm12, ymm4\",\n        \"vpmaddwd ymm12, ymm13, ymm3\",\n        \"vpmaddwd ymm13, ymm14, ymm2\",\n        \"vpmaddwd ymm14, ymm15, ymm1\",\n        \"vpmaddwd ymm15, ymm0, ymm0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub sp, sp, #0xa0 (160)\",\n        \"ldr q2, [x28, #208]\",\n        \"ldr q3, [x28, #432]\",\n        \"smull v4.4s, v17.4h, v31.4h\",\n        \"smull2 v5.4s, v17.8h, v31.8h\",\n        \"addp v16.4s, v4.4s, v5.4s\",\n        \"smull v4.4s, v2.4h, v3.4h\",\n        \"smull2 v2.4s, v2.8h, v3.8h\",\n        \"addp v2.4s, v4.4s, v2.4s\",\n        \"ldr q4, [x28, #224]\",\n        \"ldr q5, [x28, #416]\",\n        \"smull v6.4s, v18.4h, v30.4h\",\n        \"smull2 v7.4s, v18.8h, v30.8h\",\n        \"addp v17.4s, v6.4s, v7.4s\",\n        \"smull v6.4s, v4.4h, v5.4h\",\n        \"smull2 v4.4s, v4.8h, v5.8h\",\n        \"addp v4.4s, v6.4s, v4.4s\",\n        \"ldr q6, [x28, #240]\",\n        \"ldr q7, [x28, #400]\",\n        \"smull v8.4s, v19.4h, v29.4h\",\n        \"smull2 v9.4s, v19.8h, v29.8h\",\n        \"addp v18.4s, v8.4s, v9.4s\",\n        \"smull v8.4s, v6.4h, v7.4h\",\n        \"smull2 v6.4s, v6.8h, v7.8h\",\n        \"addp v6.4s, v8.4s, v6.4s\",\n        \"ldr q8, [x28, #256]\",\n        \"ldr q9, [x28, #384]\",\n        \"smull v10.4s, v20.4h, v28.4h\",\n        \"smull2 v11.4s, v20.8h, v28.8h\",\n        \"addp v19.4s, v10.4s, v11.4s\",\n        \"smull v10.4s, v8.4h, v9.4h\",\n        \"smull2 v8.4s, v8.8h, v9.8h\",\n        \"addp v8.4s, v10.4s, v8.4s\",\n        \"ldr q10, [x28, #272]\",\n        \"ldr q11, [x28, #368]\",\n        \"smull v12.4s, v21.4h, v27.4h\",\n        \"smull2 v13.4s, v21.8h, v27.8h\",\n        \"addp v20.4s, v12.4s, v13.4s\",\n        \"smull v12.4s, v10.4h, v11.4h\",\n        \"smull2 v10.4s, v10.8h, v11.8h\",\n        \"addp v10.4s, v12.4s, v10.4s\",\n        \"ldr q12, [x28, #288]\",\n        \"ldr q13, [x28, #352]\",\n        \"smull v14.4s, v22.4h, v26.4h\",\n        \"smull2 v15.4s, v22.8h, v26.8h\",\n        \"addp v21.4s, v14.4s, v15.4s\",\n        \"smull v14.4s, v12.4h, v13.4h\",\n        \"smull2 v12.4s, v12.8h, v13.8h\",\n        \"addp v12.4s, v14.4s, v12.4s\",\n        \"ldr q14, [x28, #304]\",\n        \"ldr q15, [x28, #336]\",\n        \"str q2, [sp]\",\n        \"smull v2.4s, v23.4h, v25.4h\",\n        \"str q3, [sp, #32]\",\n        \"smull2 v3.4s, v23.8h, v25.8h\",\n        \"addp v22.4s, v2.4s, v3.4s\",\n        \"smull v2.4s, v14.4h, v15.4h\",\n        \"smull2 v3.4s, v14.8h, v15.8h\",\n        \"addp v2.4s, v2.4s, v3.4s\",\n        \"ldr q3, [x28, #320]\",\n        \"smull v14.4s, v24.4h, v24.4h\",\n        \"str q4, [sp, #64]\",\n        \"smull2 v4.4s, v24.8h, v24.8h\",\n        \"addp v23.4s, v14.4s, v4.4s\",\n        \"smull v4.4s, v3.4h, v3.4h\",\n        \"smull2 v3.4s, v3.8h, v3.8h\",\n        \"addp v3.4s, v4.4s, v3.4s\",\n        \"smull v4.4s, v25.4h, v23.4h\",\n        \"smull2 v14.4s, v25.8h, v23.8h\",\n        \"addp v24.4s, v4.4s, v14.4s\",\n        \"smull v4.4s, v15.4h, v3.4h\",\n        \"smull2 v14.4s, v15.8h, v3.8h\",\n        \"addp v4.4s, v4.4s, v14.4s\",\n        \"smull v14.4s, v26.4h, v22.4h\",\n        \"smull2 v15.4s, v26.8h, v22.8h\",\n        \"addp v25.4s, v14.4s, v15.4s\",\n        \"smull v14.4s, v13.4h, v2.4h\",\n        \"smull2 v13.4s, v13.8h, v2.8h\",\n        \"addp v13.4s, v14.4s, v13.4s\",\n        \"smull v14.4s, v27.4h, v21.4h\",\n        \"smull2 v15.4s, v27.8h, v21.8h\",\n        \"addp v26.4s, v14.4s, v15.4s\",\n        \"smull v14.4s, v11.4h, v12.4h\",\n        \"smull2 v11.4s, v11.8h, v12.8h\",\n        \"addp v11.4s, v14.4s, v11.4s\",\n        \"smull v14.4s, v28.4h, v20.4h\",\n        \"smull2 v15.4s, v28.8h, v20.8h\",\n        \"addp v27.4s, v14.4s, v15.4s\",\n        \"smull v14.4s, v9.4h, v10.4h\",\n        \"smull2 v9.4s, v9.8h, v10.8h\",\n        \"addp v9.4s, v14.4s, v9.4s\",\n        \"smull v14.4s, v29.4h, v19.4h\",\n        \"smull2 v15.4s, v29.8h, v19.8h\",\n        \"addp v28.4s, v14.4s, v15.4s\",\n        \"smull v14.4s, v7.4h, v8.4h\",\n        \"smull2 v7.4s, v7.8h, v8.8h\",\n        \"addp v7.4s, v14.4s, v7.4s\",\n        \"smull v14.4s, v30.4h, v18.4h\",\n        \"smull2 v15.4s, v30.8h, v18.8h\",\n        \"addp v29.4s, v14.4s, v15.4s\",\n        \"smull v14.4s, v5.4h, v6.4h\",\n        \"smull2 v5.4s, v5.8h, v6.8h\",\n        \"addp v5.4s, v14.4s, v5.4s\",\n        \"smull v14.4s, v31.4h, v17.4h\",\n        \"smull2 v15.4s, v31.8h, v17.8h\",\n        \"addp v30.4s, v14.4s, v15.4s\",\n        \"ldr q14, [sp, #32]\",\n        \"ldr q15, [sp, #64]\",\n        \"str q6, [sp, #96]\",\n        \"smull v6.4s, v14.4h, v15.4h\",\n        \"smull2 v14.4s, v14.8h, v15.8h\",\n        \"addp v6.4s, v6.4s, v14.4s\",\n        \"smull v14.4s, v16.4h, v16.4h\",\n        \"smull2 v15.4s, v16.8h, v16.8h\",\n        \"addp v31.4s, v14.4s, v15.4s\",\n        \"ldr q14, [sp]\",\n        \"smull v15.4s, v14.4h, v14.4h\",\n        \"str q8, [sp, #128]\",\n        \"smull2 v8.4s, v14.8h, v14.8h\",\n        \"addp v8.4s, v15.4s, v8.4s\",\n        \"stp q6, q8, [x28, #416]\",\n        \"stp q7, q5, [x28, #384]\",\n        \"stp q11, q9, [x28, #352]\",\n        \"stp q4, q13, [x28, #320]\",\n        \"stp q2, q3, [x28, #288]\",\n        \"stp q10, q12, [x28, #256]\",\n        \"ldr q2, [sp, #96]\",\n        \"ldr q3, [sp, #128]\",\n        \"stp q2, q3, [x28, #224]\",\n        \"ldr q2, [sp, #64]\",\n        \"stp q14, q2, [x28, #192]\",\n        \"add sp, sp, #0xa0 (160)\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FEXOpt/MultiInst_32bit.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\",\n      \"AFP\"\n    ]\n  },\n  \"Comment\": [\n    \"These are instruction combinations that could be more optimal if FEX optimized for them\"\n  ],\n  \"Instructions\": {\n    \"Load variables from structs\": {\n      \"x86InstructionCount\": 7,\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Saw this in 32-bit libvulkan_freedreno.so:tu_cs_begin_sub_stream_aligned\",\n        \"Loads a bunch of values from structs passed as arguments\",\n        \"Loads failed to use LRCPC2/ldapur with small immediate offset when TSO is enabled, but is fine when TSO isn't enabled.\"\n      ],\n      \"x86Insts\": [\n        \"mov edi, [ecx + 8]\",\n        \"mov edx, [ecx + 4]\",\n        \"mov ebx, [ecx]\",\n        \"mov esi, [ecx + 0xc]\",\n        \"imul edx, edi\",\n        \"mov eax, [ebx + 0xc]\",\n        \"sub eax, [ebx + 4]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w11, [x7, #8]\",\n        \"ldr w5, [x7, #4]\",\n        \"ldr w6, [x7]\",\n        \"ldr w10, [x7, #12]\",\n        \"mul w5, w5, w11\",\n        \"ldr w4, [x6, #12]\",\n        \"ldr w20, [x6, #4]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"mov x4, x26\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FEXOpt/MultiInst_AFP.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"AFP\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\"\n    ]\n  },\n  \"Comment\": [\n    \"These are instruction combinations that could be more optimal if FEX optimized for them\"\n  ],\n  \"Instructions\": {\n    \"adds xmm0, xmm1, xmm2\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Redundant scalar operations should get eliminated with AFP\"\n      ],\n      \"x86Insts\": [\n        \"addss xmm0, xmm1\",\n        \"addss xmm0, xmm2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fadd s16, s16, s17\",\n        \"fadd s16, s16, s18\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FEXOpt/MultiInst_TSO.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"TSO\",\n      \"LRCPC\",\n      \"LRCPC2\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\",\n      \"AFP\"\n    ]\n  },\n  \"Comment\": [\n    \"These are instruction combinations that could be more optimal if FEX optimized for them\"\n  ],\n  \"Instructions\": {\n    \"Load variables from memory\": {\n      \"x86InstructionCount\": 6,\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Just to ensure small atomic offset loads are using LRCPC2\"\n      ],\n      \"x86Insts\": [\n        \"mov edi, [rcx]\",\n        \"mov edx, [rcx + 4]\",\n        \"mov rbx, [rcx + 8]\",\n        \"mov rsi, [rcx + 16]\",\n        \"mov ax, [rcx + 24]\",\n        \"mov bl, [rcx + 26]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldapur w11, [x7]\",\n        \"nop\",\n        \"ldapur w5, [x7, #4]\",\n        \"nop\",\n        \"ldapur x6, [x7, #8]\",\n        \"nop\",\n        \"ldapur x10, [x7, #16]\",\n        \"nop\",\n        \"ldapurh w20, [x7, #24]\",\n        \"nop\",\n        \"bfxil x4, x20, #0, #16\",\n        \"ldapurb w20, [x7, #26]\",\n        \"bfxil x6, x20, #0, #8\"\n      ]\n    },\n    \"Store variables to memory\": {\n      \"x86InstructionCount\": 6,\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Just to ensure small atomic offset stores are using LRCPC2\"\n      ],\n      \"x86Insts\": [\n        \"mov [rcx], edi\",\n        \"mov [rcx + 4], edx\",\n        \"mov [rcx + 8], rbx\",\n        \"mov [rcx + 16], rsi\",\n        \"mov [rcx + 24], ax\",\n        \"mov [rcx + 26], bl\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"nop\",\n        \"stlur w11, [x7]\",\n        \"nop\",\n        \"stlur w5, [x7, #4]\",\n        \"nop\",\n        \"stlur x6, [x7, #8]\",\n        \"nop\",\n        \"stlur x10, [x7, #16]\",\n        \"nop\",\n        \"stlurh w4, [x7, #24]\",\n        \"stlurb w6, [x7, #26]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FEXOpt/MultiInst_TSO_32bit.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [\n      \"TSO\",\n      \"LRCPC\",\n      \"LRCPC2\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\",\n      \"AFP\"\n    ]\n  },\n  \"Comment\": [\n    \"These are instruction combinations that could be more optimal if FEX optimized for them\"\n  ],\n  \"Instructions\": {\n    \"Load variables from structs\": {\n      \"x86InstructionCount\": 7,\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Saw this in 32-bit libvulkan_freedreno.so:tu_cs_begin_sub_stream_aligned\",\n        \"Loads a bunch of values from structs passed as arguments\",\n        \"Loads failed to use LRCPC2/ldapur with small immediate offset when possible\"\n      ],\n      \"x86Insts\": [\n        \"mov edi, [ecx + 8]\",\n        \"mov edx, [ecx + 4]\",\n        \"mov ebx, [ecx]\",\n        \"mov esi, [ecx + 0xc]\",\n        \"imul edx, edi\",\n        \"mov eax, [ebx + 0xc]\",\n        \"sub eax, [ebx + 4]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldapur w11, [x7, #8]\",\n        \"nop\",\n        \"ldapur w5, [x7, #4]\",\n        \"nop\",\n        \"ldapur w6, [x7]\",\n        \"nop\",\n        \"ldapur w10, [x7, #12]\",\n        \"nop\",\n        \"mul w5, w5, w11\",\n        \"ldapur w4, [x6, #12]\",\n        \"nop\",\n        \"ldapur w20, [x6, #4]\",\n        \"nop\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"Load variables from memory\": {\n      \"x86InstructionCount\": 4,\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Just to ensure small atomic offset loads are using LRCPC2\"\n      ],\n      \"x86Insts\": [\n        \"mov edi, [ecx]\",\n        \"mov edx, [ecx + 4]\",\n        \"mov ax, [ecx + 24]\",\n        \"mov bl, [ecx + 26]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldapur w11, [x7]\",\n        \"nop\",\n        \"ldapur w5, [x7, #4]\",\n        \"nop\",\n        \"ldapurh w20, [x7, #24]\",\n        \"nop\",\n        \"bfxil x4, x20, #0, #16\",\n        \"ldapurb w20, [x7, #26]\",\n        \"bfxil x6, x20, #0, #8\"\n      ]\n    },\n    \"Store variables to memory\": {\n      \"x86InstructionCount\": 4,\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Just to ensure small atomic offset stores are using LRCPC2\"\n      ],\n      \"x86Insts\": [\n        \"mov [ecx], edi\",\n        \"mov [ecx + 4], edx\",\n        \"mov [ecx + 24], ax\",\n        \"mov [ecx + 26], bl\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"nop\",\n        \"stlur w11, [x7]\",\n        \"nop\",\n        \"stlur w5, [x7, #4]\",\n        \"nop\",\n        \"stlurh w4, [x7, #24]\",\n        \"stlurb w6, [x7, #26]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FEXOpt/libnss.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"CRYPTO\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\",\n      \"AFP\"\n    ]\n  },\n  \"Comment\": [],\n  \"Instructions\": {\n    \"libnss3 sha\": {\n      \"x86InstructionCount\": 168,\n      \"ExpectedInstructionCount\": 521,\n      \"Comment\": [\n        \"This block of code comes from libnss3 which causes panic spilling in FEX's RA.\",\n        \"This code is hit in steamwebhelper calling in to this function.\",\n        \"No correct behaviour to return here, just need to compare output logs and ensure panic spilling doesn't occur.\"\n      ],\n      \"x86Insts\": [\n        \"endbr64\",\n        \"movdqu  xmm2, [rdi+0x100]\",\n        \"movdqu  xmm3, [rdi+0x110]\",\n        \"movdqu  xmm8, [rdi]\",\n        \"movdqu  xmm7, [rdi+0x10]\",\n        \"pshufd  xmm0, xmm2, 0xb1\",\n        \"pshufd  xmm2, xmm3, 0x1b\",\n        \"movdqu  xmm6, [rdi+0x20]\",\n        \"movdqu  xmm5, [rdi+0x30]\",\n        \"movdqa  xmm3, xmm0\",\n        \"palignr xmm3, xmm2, 0x8\",\n        \"pblendw xmm2, xmm0, 0xf0\",\n        \"movdqa  xmm0, [r15 + 0x1_1000]\",\n        \"movdqa  xmm4, xmm2\",\n        \"movdqa  xmm1, xmm3\",\n        \"pshufb  xmm5, xmm0\",\n        \"pshufb  xmm6, xmm0\",\n        \"pshufb  xmm7, xmm0\",\n        \"pshufb  xmm8, xmm0\",\n        \"movdqa  xmm0, [r15 + 0x1_1000]\",\n        \"paddd   xmm0, xmm8\",\n        \"sha256msg1 xmm8, xmm7\",\n        \"sha256rnds2 xmm4, xmm3\",\n        \"pshufd  xmm0, xmm0, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"movdqa  xmm0, xmm5\",\n        \"palignr xmm0, xmm6, 0x4\",\n        \"paddd   xmm8, xmm0\",\n        \"movdqa  xmm0, [r15 + 0x1_1000]\",\n        \"sha256msg2 xmm8, xmm5\",\n        \"paddd   xmm0, xmm7\",\n        \"sha256msg1 xmm7, xmm6\",\n        \"sha256rnds2 xmm4, xmm1\",\n        \"pshufd  xmm0, xmm0, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"movdqa  xmm0, xmm8\",\n        \"palignr xmm0, xmm5, 0x4\",\n        \"paddd   xmm7, xmm0\",\n        \"movdqa  xmm0, [r15 + 0x1_1000]\",\n        \"sha256msg2 xmm7, xmm8\",\n        \"paddd   xmm0, xmm6\",\n        \"sha256msg1 xmm6, xmm5\",\n        \"sha256rnds2 xmm4, xmm1\",\n        \"pshufd  xmm0, xmm0, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"movdqa  xmm0, xmm7\",\n        \"palignr xmm0, xmm8, 0x4\",\n        \"paddd   xmm6, xmm0\",\n        \"movdqa  xmm0, [r15 + 0x1_1000]\",\n        \"sha256msg2 xmm6, xmm7\",\n        \"paddd   xmm0, xmm5\",\n        \"sha256msg1 xmm5, xmm8\",\n        \"sha256rnds2 xmm4, xmm1\",\n        \"pshufd  xmm0, xmm0, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"movdqa  xmm0, xmm6\",\n        \"palignr xmm0, xmm7, 0x4\",\n        \"paddd   xmm5, xmm0\",\n        \"movdqa  xmm0, [r15 + 0x1_1000]\",\n        \"sha256msg2 xmm5, xmm6\",\n        \"paddd   xmm0, xmm8\",\n        \"sha256msg1 xmm8, xmm7\",\n        \"sha256rnds2 xmm4, xmm1\",\n        \"pshufd  xmm0, xmm0, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"movdqa  xmm0, xmm5\",\n        \"palignr xmm0, xmm6, 0x4\",\n        \"paddd   xmm8, xmm0\",\n        \"movdqa  xmm0, [r15 + 0x1_1000]\",\n        \"sha256msg2 xmm8, xmm5\",\n        \"paddd   xmm0, xmm7\",\n        \"sha256msg1 xmm7, xmm6\",\n        \"sha256rnds2 xmm4, xmm1\",\n        \"pshufd  xmm0, xmm0, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"movdqa  xmm0, xmm8\",\n        \"palignr xmm0, xmm5, 0x4\",\n        \"paddd   xmm7, xmm0\",\n        \"movdqa  xmm0, [r15 + 0x1_1000]\",\n        \"sha256msg2 xmm7, xmm8\",\n        \"paddd   xmm0, xmm6\",\n        \"sha256msg1 xmm6, xmm5\",\n        \"sha256rnds2 xmm4, xmm1\",\n        \"pshufd  xmm0, xmm0, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"movdqa  xmm0, xmm7\",\n        \"palignr xmm0, xmm8, 0x4\",\n        \"paddd   xmm6, xmm0\",\n        \"movdqa  xmm0, [r15 + 0x1_1000]\",\n        \"sha256msg2 xmm6, xmm7\",\n        \"paddd   xmm0, xmm5\",\n        \"sha256msg1 xmm5, xmm8\",\n        \"sha256rnds2 xmm4, xmm1\",\n        \"pshufd  xmm0, xmm0, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"movdqa  xmm0, xmm6\",\n        \"palignr xmm0, xmm7, 0x4\",\n        \"paddd   xmm5, xmm0\",\n        \"movdqa  xmm0, [r15 + 0x1_1000]\",\n        \"sha256msg2 xmm5, xmm6\",\n        \"paddd   xmm0, xmm8\",\n        \"sha256msg1 xmm8, xmm7\",\n        \"sha256rnds2 xmm4, xmm1\",\n        \"pshufd  xmm0, xmm0, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"movdqa  xmm0, xmm5\",\n        \"palignr xmm0, xmm6, 0x4\",\n        \"paddd   xmm8, xmm0\",\n        \"movdqa  xmm0, [r15 + 0x1_1000]\",\n        \"sha256msg2 xmm8, xmm5\",\n        \"paddd   xmm0, xmm7\",\n        \"sha256msg1 xmm7, xmm6\",\n        \"sha256rnds2 xmm4, xmm1\",\n        \"pshufd  xmm0, xmm0, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"movdqa  xmm0, xmm8\",\n        \"palignr xmm0, xmm5, 0x4\",\n        \"paddd   xmm7, xmm0\",\n        \"movdqa  xmm0, [r15 + 0x1_1000]\",\n        \"sha256msg2 xmm7, xmm8\",\n        \"paddd   xmm0, xmm6\",\n        \"sha256msg1 xmm6, xmm5\",\n        \"sha256rnds2 xmm4, xmm1\",\n        \"pshufd  xmm0, xmm0, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"movdqa  xmm0, xmm7\",\n        \"palignr xmm0, xmm8, 0x4\",\n        \"paddd   xmm6, xmm0\",\n        \"movdqa  xmm0, [r15 + 0x1_1000]\",\n        \"sha256msg2 xmm6, xmm7\",\n        \"paddd   xmm0, xmm5\",\n        \"sha256msg1 xmm5, xmm8\",\n        \"sha256rnds2 xmm4, xmm1\",\n        \"pshufd  xmm0, xmm0, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"movdqa  xmm0, xmm6\",\n        \"palignr xmm0, xmm7, 0x4\",\n        \"paddd   xmm7, [r15 + 0x1_1000]\",\n        \"paddd   xmm5, xmm0\",\n        \"movdqa  xmm0, [r15 + 0x1_1000]\",\n        \"sha256msg2 xmm5, xmm6\",\n        \"paddd   xmm6, [r15 + 0x1_1000]\",\n        \"paddd   xmm5, [r15 + 0x1_1000]\",\n        \"paddd   xmm0, xmm8\",\n        \"sha256rnds2 xmm4, xmm1\",\n        \"pshufd  xmm0, xmm0, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"movdqa  xmm0, xmm7\",\n        \"sha256rnds2 xmm4, xmm1\",\n        \"pshufd  xmm0, xmm7, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"movdqa  xmm0, xmm6\",\n        \"sha256rnds2 xmm4, xmm1\",\n        \"pshufd  xmm0, xmm6, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"movdqa  xmm0, xmm5\",\n        \"sha256rnds2 xmm4, xmm1\",\n        \"pshufd  xmm0, xmm5, 0xe\",\n        \"sha256rnds2 xmm1, xmm4\",\n        \"paddd   xmm4, xmm2\",\n        \"paddd   xmm1, xmm3\",\n        \"pshufd  xmm4, xmm4, 0xb1\",\n        \"pshufd  xmm1, xmm1, 0x1b\",\n        \"movdqa  xmm0, xmm1\",\n        \"pblendw xmm0, xmm4, 0xf0\",\n        \"palignr xmm4, xmm1, 0x8\",\n        \"movups  [rdi+0x100], xmm0\",\n        \"movups  [rdi+0x110], xmm4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q18, [x11, #256]\",\n        \"ldr q19, [x11, #272]\",\n        \"ldr q24, [x11]\",\n        \"ldr q23, [x11, #16]\",\n        \"rev64 v16.4s, v18.4s\",\n        \"rev64 v2.4s, v19.4s\",\n        \"ext v18.16b, v2.16b, v2.16b, #8\",\n        \"ldr q22, [x11, #32]\",\n        \"ldr q21, [x11, #48]\",\n        \"ext v19.16b, v18.16b, v16.16b, #8\",\n        \"mov v18.d[1], v16.d[1]\",\n        \"mov w20, #0x1000\",\n        \"movk w20, #0x1, lsl #16\",\n        \"ldr q16, [x29, x20, sxtx]\",\n        \"mov v20.16b, v18.16b\",\n        \"mov v17.16b, v19.16b\",\n        \"movi v2.16b, #0x8f\",\n        \"and v2.16b, v16.16b, v2.16b\",\n        \"tbl v21.16b, {v21.16b}, v2.16b\",\n        \"movi v2.16b, #0x8f\",\n        \"and v2.16b, v16.16b, v2.16b\",\n        \"tbl v22.16b, {v22.16b}, v2.16b\",\n        \"movi v2.16b, #0x8f\",\n        \"and v2.16b, v16.16b, v2.16b\",\n        \"tbl v23.16b, {v23.16b}, v2.16b\",\n        \"movi v2.16b, #0x8f\",\n        \"and v2.16b, v16.16b, v2.16b\",\n        \"tbl v24.16b, {v24.16b}, v2.16b\",\n        \"ldr q16, [x29, x20, sxtx]\",\n        \"add v16.4s, v16.4s, v24.4s\",\n        \"sha256su0 v24.4s, v23.4s\",\n        \"zip2 v2.2d, v19.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v19.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v16.s[0]\",\n        \"ext v16.16b, v16.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"ext v16.16b, v22.16b, v21.16b, #4\",\n        \"add v24.4s, v24.4s, v16.4s\",\n        \"ldr q16, [x29, x20, sxtx]\",\n        \"ext v2.16b, v24.16b, v24.16b, #12\",\n        \"dup v3.4s, v24.s[3]\",\n        \"zip2 v3.2d, v3.2d, v21.2d\",\n        \"movi v24.2d, #0x0\",\n        \"sha256su1 v24.4s, v2.4s, v3.4s\",\n        \"add v16.4s, v16.4s, v23.4s\",\n        \"sha256su0 v23.4s, v22.4s\",\n        \"zip2 v2.2d, v17.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v16.s[0]\",\n        \"ext v16.16b, v16.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"ext v16.16b, v21.16b, v24.16b, #4\",\n        \"add v23.4s, v23.4s, v16.4s\",\n        \"ldr q16, [x29, x20, sxtx]\",\n        \"ext v2.16b, v23.16b, v23.16b, #12\",\n        \"dup v3.4s, v23.s[3]\",\n        \"zip2 v3.2d, v3.2d, v24.2d\",\n        \"movi v23.2d, #0x0\",\n        \"sha256su1 v23.4s, v2.4s, v3.4s\",\n        \"add v16.4s, v16.4s, v22.4s\",\n        \"sha256su0 v22.4s, v21.4s\",\n        \"zip2 v2.2d, v17.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v16.s[0]\",\n        \"ext v16.16b, v16.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"ext v16.16b, v24.16b, v23.16b, #4\",\n        \"add v22.4s, v22.4s, v16.4s\",\n        \"ldr q16, [x29, x20, sxtx]\",\n        \"ext v2.16b, v22.16b, v22.16b, #12\",\n        \"dup v3.4s, v22.s[3]\",\n        \"zip2 v3.2d, v3.2d, v23.2d\",\n        \"movi v22.2d, #0x0\",\n        \"sha256su1 v22.4s, v2.4s, v3.4s\",\n        \"add v16.4s, v16.4s, v21.4s\",\n        \"sha256su0 v21.4s, v24.4s\",\n        \"zip2 v2.2d, v17.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v16.s[0]\",\n        \"ext v16.16b, v16.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"ext v16.16b, v23.16b, v22.16b, #4\",\n        \"add v21.4s, v21.4s, v16.4s\",\n        \"ldr q16, [x29, x20, sxtx]\",\n        \"ext v2.16b, v21.16b, v21.16b, #12\",\n        \"dup v3.4s, v21.s[3]\",\n        \"zip2 v3.2d, v3.2d, v22.2d\",\n        \"movi v21.2d, #0x0\",\n        \"sha256su1 v21.4s, v2.4s, v3.4s\",\n        \"add v16.4s, v16.4s, v24.4s\",\n        \"sha256su0 v24.4s, v23.4s\",\n        \"zip2 v2.2d, v17.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v16.s[0]\",\n        \"ext v16.16b, v16.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"ext v16.16b, v22.16b, v21.16b, #4\",\n        \"add v24.4s, v24.4s, v16.4s\",\n        \"ldr q16, [x29, x20, sxtx]\",\n        \"ext v2.16b, v24.16b, v24.16b, #12\",\n        \"dup v3.4s, v24.s[3]\",\n        \"zip2 v3.2d, v3.2d, v21.2d\",\n        \"movi v24.2d, #0x0\",\n        \"sha256su1 v24.4s, v2.4s, v3.4s\",\n        \"add v16.4s, v16.4s, v23.4s\",\n        \"sha256su0 v23.4s, v22.4s\",\n        \"zip2 v2.2d, v17.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v16.s[0]\",\n        \"ext v16.16b, v16.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"ext v16.16b, v21.16b, v24.16b, #4\",\n        \"add v23.4s, v23.4s, v16.4s\",\n        \"ldr q16, [x29, x20, sxtx]\",\n        \"ext v2.16b, v23.16b, v23.16b, #12\",\n        \"dup v3.4s, v23.s[3]\",\n        \"zip2 v3.2d, v3.2d, v24.2d\",\n        \"movi v23.2d, #0x0\",\n        \"sha256su1 v23.4s, v2.4s, v3.4s\",\n        \"add v16.4s, v16.4s, v22.4s\",\n        \"sha256su0 v22.4s, v21.4s\",\n        \"zip2 v2.2d, v17.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v16.s[0]\",\n        \"ext v16.16b, v16.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"ext v16.16b, v24.16b, v23.16b, #4\",\n        \"add v22.4s, v22.4s, v16.4s\",\n        \"ldr q16, [x29, x20, sxtx]\",\n        \"ext v2.16b, v22.16b, v22.16b, #12\",\n        \"dup v3.4s, v22.s[3]\",\n        \"zip2 v3.2d, v3.2d, v23.2d\",\n        \"movi v22.2d, #0x0\",\n        \"sha256su1 v22.4s, v2.4s, v3.4s\",\n        \"add v16.4s, v16.4s, v21.4s\",\n        \"sha256su0 v21.4s, v24.4s\",\n        \"zip2 v2.2d, v17.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v16.s[0]\",\n        \"ext v16.16b, v16.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"ext v16.16b, v23.16b, v22.16b, #4\",\n        \"add v21.4s, v21.4s, v16.4s\",\n        \"ldr q16, [x29, x20, sxtx]\",\n        \"ext v2.16b, v21.16b, v21.16b, #12\",\n        \"dup v3.4s, v21.s[3]\",\n        \"zip2 v3.2d, v3.2d, v22.2d\",\n        \"movi v21.2d, #0x0\",\n        \"sha256su1 v21.4s, v2.4s, v3.4s\",\n        \"add v16.4s, v16.4s, v24.4s\",\n        \"sha256su0 v24.4s, v23.4s\",\n        \"zip2 v2.2d, v17.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v16.s[0]\",\n        \"ext v16.16b, v16.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"ext v16.16b, v22.16b, v21.16b, #4\",\n        \"add v24.4s, v24.4s, v16.4s\",\n        \"ldr q16, [x29, x20, sxtx]\",\n        \"ext v2.16b, v24.16b, v24.16b, #12\",\n        \"dup v3.4s, v24.s[3]\",\n        \"zip2 v3.2d, v3.2d, v21.2d\",\n        \"movi v24.2d, #0x0\",\n        \"sha256su1 v24.4s, v2.4s, v3.4s\",\n        \"add v16.4s, v16.4s, v23.4s\",\n        \"sha256su0 v23.4s, v22.4s\",\n        \"zip2 v2.2d, v17.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v16.s[0]\",\n        \"ext v16.16b, v16.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"ext v16.16b, v21.16b, v24.16b, #4\",\n        \"add v23.4s, v23.4s, v16.4s\",\n        \"ldr q16, [x29, x20, sxtx]\",\n        \"ext v2.16b, v23.16b, v23.16b, #12\",\n        \"dup v3.4s, v23.s[3]\",\n        \"zip2 v3.2d, v3.2d, v24.2d\",\n        \"movi v23.2d, #0x0\",\n        \"sha256su1 v23.4s, v2.4s, v3.4s\",\n        \"add v16.4s, v16.4s, v22.4s\",\n        \"sha256su0 v22.4s, v21.4s\",\n        \"zip2 v2.2d, v17.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v16.s[0]\",\n        \"ext v16.16b, v16.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"ext v16.16b, v24.16b, v23.16b, #4\",\n        \"add v22.4s, v22.4s, v16.4s\",\n        \"ldr q16, [x29, x20, sxtx]\",\n        \"ext v2.16b, v22.16b, v22.16b, #12\",\n        \"dup v3.4s, v22.s[3]\",\n        \"zip2 v3.2d, v3.2d, v23.2d\",\n        \"movi v22.2d, #0x0\",\n        \"sha256su1 v22.4s, v2.4s, v3.4s\",\n        \"add v16.4s, v16.4s, v21.4s\",\n        \"sha256su0 v21.4s, v24.4s\",\n        \"zip2 v2.2d, v17.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v16.s[0]\",\n        \"ext v16.16b, v16.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"ext v16.16b, v23.16b, v22.16b, #4\",\n        \"ldr q2, [x29, x20, sxtx]\",\n        \"add v23.4s, v23.4s, v2.4s\",\n        \"add v21.4s, v21.4s, v16.4s\",\n        \"ldr q16, [x29, x20, sxtx]\",\n        \"ext v2.16b, v21.16b, v21.16b, #12\",\n        \"dup v3.4s, v21.s[3]\",\n        \"zip2 v3.2d, v3.2d, v22.2d\",\n        \"movi v21.2d, #0x0\",\n        \"sha256su1 v21.4s, v2.4s, v3.4s\",\n        \"ldr q2, [x29, x20, sxtx]\",\n        \"add v22.4s, v22.4s, v2.4s\",\n        \"ldr q2, [x29, x20, sxtx]\",\n        \"add v21.4s, v21.4s, v2.4s\",\n        \"add v16.4s, v16.4s, v24.4s\",\n        \"zip2 v2.2d, v17.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v16.s[0]\",\n        \"ext v16.16b, v16.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"mov v16.16b, v23.16b\",\n        \"zip2 v2.2d, v17.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v23.s[0]\",\n        \"ext v16.16b, v23.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"mov v16.16b, v22.16b\",\n        \"zip2 v2.2d, v17.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v22.s[0]\",\n        \"ext v16.16b, v22.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"mov v16.16b, v21.16b\",\n        \"zip2 v2.2d, v17.2d, v20.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v17.2d, v20.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v20.4s, v2.4s\",\n        \"dup v2.4s, v21.s[0]\",\n        \"ext v16.16b, v21.16b, v2.16b, #8\",\n        \"zip2 v2.2d, v20.2d, v17.2d\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v3.2d, v20.2d, v17.2d\",\n        \"rev64 v3.4s, v3.4s\",\n        \"dup v4.2d, v16.d[0]\",\n        \"mov v5.16b, v2.16b\",\n        \"sha256h q5, q3, v4.4s\",\n        \"sha256h2 q3, q2, v4.4s\",\n        \"zip2 v2.2d, v3.2d, v5.2d\",\n        \"rev64 v17.4s, v2.4s\",\n        \"add v20.4s, v20.4s, v18.4s\",\n        \"add v17.4s, v17.4s, v19.4s\",\n        \"rev64 v20.4s, v20.4s\",\n        \"rev64 v2.4s, v17.4s\",\n        \"ext v17.16b, v2.16b, v2.16b, #8\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[1], v20.d[1]\",\n        \"ext v20.16b, v17.16b, v20.16b, #8\",\n        \"str q16, [x11, #256]\",\n        \"str q20, [x11, #272]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/Atomics.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"lock add byte [rax], cl\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x00\",\n      \"ExpectedArm64ASM\": [\n        \"ldaddalb w7, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"lsl w0, w20, #24\",\n        \"cmn w0, w7, lsl #24\",\n        \"add w26, w20, w7\",\n        \"cfinv\"\n      ]\n    },\n    \"lock add word [rax], cx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x01\",\n      \"ExpectedArm64ASM\": [\n        \"ldaddalh w7, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"lsl w0, w20, #16\",\n        \"cmn w0, w7, lsl #16\",\n        \"add w26, w20, w7\",\n        \"cfinv\"\n      ]\n    },\n    \"lock add dword [rax], ecx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x01\",\n      \"ExpectedArm64ASM\": [\n        \"ldaddal w7, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"adds w26, w20, w7\",\n        \"cfinv\"\n      ]\n    },\n    \"lock or byte [rax], cl\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x08\",\n      \"ExpectedArm64ASM\": [\n        \"ldsetalb w7, w20, [x4]\",\n        \"orr w26, w20, w7\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\"\n      ]\n    },\n    \"lock or word [rax], cx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x09\",\n      \"ExpectedArm64ASM\": [\n        \"ldsetalh w7, w20, [x4]\",\n        \"orr w26, w20, w7\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\"\n      ]\n    },\n    \"lock or dword [rax], ecx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x09\",\n      \"ExpectedArm64ASM\": [\n        \"ldsetal w7, w20, [x4]\",\n        \"orr w20, w20, w7\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock adc byte [rax], cl\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"0x10\",\n      \"ExpectedArm64ASM\": [\n        \"cinc w20, w7, lo\",\n        \"ldaddalb w20, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"uxtb x21, w7\",\n        \"cinc w22, w21, lo\",\n        \"add w23, w20, w22\",\n        \"uxtb w26, w23\",\n        \"cmp w26, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x22, #63, #nzCv\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"bic w20, w20, w21\",\n        \"rmif x20, #7, #nzcV\"\n      ]\n    },\n    \"lock adc word [rax], cx\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"0x11\",\n      \"ExpectedArm64ASM\": [\n        \"cinc w20, w7, lo\",\n        \"ldaddalh w20, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"uxth x21, w7\",\n        \"cinc w22, w21, lo\",\n        \"add w23, w20, w22\",\n        \"uxth w26, w23\",\n        \"cmp w26, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x22, #63, #nzCv\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"bic w20, w20, w21\",\n        \"rmif x20, #15, #nzcV\"\n      ]\n    },\n    \"lock adc dword [rax], ecx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x11\",\n      \"ExpectedArm64ASM\": [\n        \"cinc w20, w7, lo\",\n        \"ldaddal w20, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"cfinv\",\n        \"adcs w26, w20, w7\",\n        \"cfinv\"\n      ]\n    },\n    \"lock sbb byte [rax], cl\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"0x18\",\n      \"ExpectedArm64ASM\": [\n        \"cinc w20, w7, lo\",\n        \"neg w1, w20\",\n        \"ldaddalb w1, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"uxtb w20, w20\",\n        \"uxtb x21, w7\",\n        \"cinc w22, w21, lo\",\n        \"sub w23, w20, w22\",\n        \"uxtb w26, w23\",\n        \"cmp w20, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x22, #63, #nzCv\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"and w20, w20, w21\",\n        \"rmif x20, #7, #nzcV\"\n      ]\n    },\n    \"lock sbb word [rax], cx\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"0x19\",\n      \"ExpectedArm64ASM\": [\n        \"cinc w20, w7, lo\",\n        \"neg w1, w20\",\n        \"ldaddalh w1, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"uxth w20, w20\",\n        \"uxth x21, w7\",\n        \"cinc w22, w21, lo\",\n        \"sub w23, w20, w22\",\n        \"uxth w26, w23\",\n        \"cmp w20, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x22, #63, #nzCv\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"and w20, w20, w21\",\n        \"rmif x20, #15, #nzcV\"\n      ]\n    },\n    \"lock sbb dword [rax], ecx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x19\",\n      \"ExpectedArm64ASM\": [\n        \"cinc w20, w7, lo\",\n        \"neg w1, w20\",\n        \"ldaddal w1, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"sbcs w26, w20, w7\"\n      ]\n    },\n    \"lock and byte [rax], cl\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x20\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w1, w7\",\n        \"ldclralb w1, w20, [x4]\",\n        \"and w26, w20, w7\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\"\n      ]\n    },\n    \"lock and word [rax], cx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x21\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w1, w7\",\n        \"ldclralh w1, w20, [x4]\",\n        \"and w26, w20, w7\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\"\n      ]\n    },\n    \"lock and dword [rax], ecx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x21\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w1, w7\",\n        \"ldclral w1, w20, [x4]\",\n        \"ands w26, w20, w7\",\n        \"cfinv\"\n      ]\n    },\n    \"lock sub byte [rax], cl\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x28\",\n      \"ExpectedArm64ASM\": [\n        \"neg w1, w7\",\n        \"ldaddalb w1, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"lsl w0, w20, #24\",\n        \"cmp w0, w7, lsl #24\",\n        \"sub w26, w20, w7\"\n      ]\n    },\n    \"lock sub word [rax], cx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x28\",\n      \"ExpectedArm64ASM\": [\n        \"neg w1, w7\",\n        \"ldaddalh w1, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"lsl w0, w20, #16\",\n        \"cmp w0, w7, lsl #16\",\n        \"sub w26, w20, w7\"\n      ]\n    },\n    \"lock sub dword [rax], ecx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x29\",\n      \"ExpectedArm64ASM\": [\n        \"neg w1, w7\",\n        \"ldaddal w1, w20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"subs w26, w20, w7\"\n      ]\n    },\n    \"lock xor byte [rax], cl\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x30\",\n      \"ExpectedArm64ASM\": [\n        \"ldeoralb w7, w20, [x4]\",\n        \"eor w26, w20, w7\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\"\n      ]\n    },\n    \"lock xor word [rax], cx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x31\",\n      \"ExpectedArm64ASM\": [\n        \"ldeoralh w7, w20, [x4]\",\n        \"eor w26, w20, w7\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\"\n      ]\n    },\n    \"lock xor dword [rax], ecx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x31\",\n      \"ExpectedArm64ASM\": [\n        \"ldeoral w7, w20, [x4]\",\n        \"eor w20, w20, w7\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock add qword [rax], rcx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x01\",\n      \"ExpectedArm64ASM\": [\n        \"ldaddal x7, x20, [x4]\",\n        \"eor x27, x20, x7\",\n        \"adds x26, x20, x7\",\n        \"cfinv\"\n      ]\n    },\n    \"xadd byte [rax], bl\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xc0\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w6\",\n        \"ldaddalb w20, w21, [x4]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w21, w20\",\n        \"bfxil x6, x21, #0, #8\",\n        \"cfinv\"\n      ]\n    },\n    \"xadd word [rax], bx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"ldaddalh w20, w21, [x4]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w21, w20\",\n        \"bfxil x6, x21, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"xadd dword [rax], ebx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w6\",\n        \"ldaddal w20, w6, [x4]\",\n        \"eor x27, x6, x20\",\n        \"adds w26, w6, w20\",\n        \"cfinv\"\n      ]\n    },\n    \"xadd qword [rax], rbx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"ldaddal x6, x20, [x4]\",\n        \"eor x27, x20, x6\",\n        \"adds x26, x20, x6\",\n        \"cfinv\",\n        \"mov x6, x20\"\n      ]\n    },\n    \"lock add byte [rax], 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x80 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddalb w20, w27, [x4]\",\n        \"lsl w0, w27, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w27, #0x1 (1)\",\n        \"cfinv\"\n      ]\n    },\n    \"lock add byte [rax], 0xFF\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x80 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"ldaddalb w20, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"lsl w0, w21, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w21, #0xff (255)\",\n        \"cfinv\"\n      ]\n    },\n    \"lock add word [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldaddalh w20, w27, [x4]\",\n        \"lsl w0, w27, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w27, #0x100 (256)\",\n        \"cfinv\"\n      ]\n    },\n    \"lock add word [rax], 0xFFFF\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"ldaddalh w20, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"lsl w0, w21, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w21, w20\",\n        \"cfinv\"\n      ]\n    },\n    \"lock add dword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldaddal w20, w27, [x4]\",\n        \"adds w26, w27, #0x100 (256)\",\n        \"cfinv\"\n      ]\n    },\n    \"lock add dword [rax], 0xFFFFFFFF\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"ldaddal w20, w20, [x4]\",\n        \"mvn w27, w20\",\n        \"subs w26, w20, #0x1 (1)\",\n        \"cfinv\"\n      ]\n    },\n    \"lock add qword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldaddal x20, x27, [x4]\",\n        \"adds x26, x27, #0x100 (256)\",\n        \"cfinv\"\n      ]\n    },\n    \"lock add qword [rax], -2147483647\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffff80000001\",\n        \"ldaddal x20, x27, [x4]\",\n        \"adds x26, x27, x20\",\n        \"cfinv\"\n      ]\n    },\n    \"lock add word [rax], 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddalh w20, w27, [x4]\",\n        \"lsl w0, w27, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w27, #0x1 (1)\",\n        \"cfinv\"\n      ]\n    },\n    \"lock add dword [rax], 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddal w20, w27, [x4]\",\n        \"adds w26, w27, #0x1 (1)\",\n        \"cfinv\"\n      ]\n    },\n    \"lock add qword [rax], 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddal x20, x27, [x4]\",\n        \"adds x26, x27, #0x1 (1)\",\n        \"cfinv\"\n      ]\n    },\n    \"lock or byte [rax], 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x80 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldsetalb w20, w20, [x4]\",\n        \"orr w26, w20, #0x1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\"\n      ]\n    },\n    \"lock or byte [rax], 0xFF\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x80 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"ldsetalb w20, w20, [x4]\",\n        \"orr w26, w20, #0xff\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\"\n      ]\n    },\n    \"lock or word [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldsetalh w20, w20, [x4]\",\n        \"orr w26, w20, #0x100\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\"\n      ]\n    },\n    \"lock or word [rax], 0xFFFF\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"ldsetalh w20, w20, [x4]\",\n        \"orr w26, w20, #0xffff\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\"\n      ]\n    },\n    \"lock or dword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldsetal w20, w20, [x4]\",\n        \"orr w20, w20, #0x100\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock or dword [rax], 0xFFFFFFFF\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"ldsetal w20, w21, [x4]\",\n        \"orr w20, w21, w20\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock or qword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldsetal x20, x20, [x4]\",\n        \"orr x20, x20, #0x100\",\n        \"subs x26, x20, #0x0 (0)\"\n      ]\n    },\n    \"lock or qword [rax], -2147483647\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffff80000001\",\n        \"ldsetal x20, x20, [x4]\",\n        \"orr x20, x20, #0xffffffff80000001\",\n        \"subs x26, x20, #0x0 (0)\"\n      ]\n    },\n    \"lock or word [rax], 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x83 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldsetalh w20, w20, [x4]\",\n        \"orr w26, w20, #0x1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\"\n      ]\n    },\n    \"lock or dword [rax], 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldsetal w20, w20, [x4]\",\n        \"orr w20, w20, #0x1\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock or qword [rax], 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldsetal x20, x20, [x4]\",\n        \"orr x20, x20, #0x1\",\n        \"subs x26, x20, #0x0 (0)\"\n      ]\n    },\n    \"lock adc byte [rax], 1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"GROUP1 0x80 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w21, w20, lo\",\n        \"ldaddalb w21, w27, [x4]\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w27, w20\",\n        \"uxtb w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w26, w27\",\n        \"rmif x20, #7, #nzcV\"\n      ]\n    },\n    \"lock adc byte [rax], 0xFF\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"GROUP1 0x80 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"cinc w21, w20, lo\",\n        \"ldaddalb w21, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"cinc w20, w20, lo\",\n        \"add w22, w21, w20\",\n        \"uxtb w26, w22\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w21, w26\",\n        \"rmif x20, #7, #nzcV\"\n      ]\n    },\n    \"lock adc word [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"cinc w21, w20, lo\",\n        \"ldaddalh w21, w27, [x4]\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w27, w20\",\n        \"uxth w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w26, w27\",\n        \"rmif x20, #15, #nzcV\"\n      ]\n    },\n    \"lock adc word [rax], 0xFFFF\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"cinc w21, w20, lo\",\n        \"ldaddalh w21, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"cinc w20, w20, lo\",\n        \"add w22, w21, w20\",\n        \"uxth w26, w22\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w21, w26\",\n        \"rmif x20, #15, #nzcV\"\n      ]\n    },\n    \"lock adc dword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"cinc w21, w20, lo\",\n        \"ldaddal w21, w27, [x4]\",\n        \"cfinv\",\n        \"adcs w26, w27, w20\",\n        \"cfinv\"\n      ]\n    },\n    \"lock adc dword [rax], 0xFFFFFFFF\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"cinc w21, w20, lo\",\n        \"ldaddal w21, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"cfinv\",\n        \"adcs w26, w21, w20\",\n        \"cfinv\"\n      ]\n    },\n    \"lock adc qword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"cinc x21, x20, lo\",\n        \"ldaddal x21, x27, [x4]\",\n        \"cfinv\",\n        \"adcs x26, x27, x20\",\n        \"cfinv\"\n      ]\n    },\n    \"lock adc qword [rax], -2147483647\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffff80000001\",\n        \"cinc x21, x20, lo\",\n        \"ldaddal x21, x27, [x4]\",\n        \"cfinv\",\n        \"adcs x26, x27, x20\",\n        \"cfinv\"\n      ]\n    },\n    \"lock adc word [rax], 1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"GROUP1 0x83 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w21, w20, lo\",\n        \"ldaddalh w21, w27, [x4]\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w27, w20\",\n        \"uxth w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w26, w27\",\n        \"rmif x20, #15, #nzcV\"\n      ]\n    },\n    \"lock adc dword [rax], 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w21, w20, lo\",\n        \"ldaddal w21, w27, [x4]\",\n        \"cfinv\",\n        \"adcs w26, w27, w20\",\n        \"cfinv\"\n      ]\n    },\n    \"lock adc qword [rax], 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc x21, x20, lo\",\n        \"ldaddal x21, x27, [x4]\",\n        \"cfinv\",\n        \"adcs x26, x27, x20\",\n        \"cfinv\"\n      ]\n    },\n    \"lock sbb byte [rax], 1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"GROUP1 0x80 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddalb w1, w27, [x4]\",\n        \"uxtb w21, w27\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxtb w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w21, w26\",\n        \"rmif x20, #7, #nzcV\"\n      ]\n    },\n    \"lock sbb byte [rax], 0xFF\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"GROUP1 0x80 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddalb w1, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"uxtb w21, w21\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxtb w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w26, w21\",\n        \"rmif x20, #7, #nzcV\"\n      ]\n    },\n    \"lock sbb word [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddalh w1, w27, [x4]\",\n        \"uxth w21, w27\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxth w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w21, w26\",\n        \"rmif x20, #15, #nzcV\"\n      ]\n    },\n    \"lock sbb word [rax], 0xFFFF\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddalh w1, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"uxth w21, w21\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxth w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w26, w21\",\n        \"rmif x20, #15, #nzcV\"\n      ]\n    },\n    \"lock sbb dword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddal w1, w27, [x4]\",\n        \"sbcs w26, w27, w20\"\n      ]\n    },\n    \"lock sbb dword [rax], 0xFFFFFFFF\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddal w1, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"sbcs w26, w21, w20\"\n      ]\n    },\n    \"lock sbb qword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"cinc x21, x20, lo\",\n        \"neg x1, x21\",\n        \"ldaddal x1, x27, [x4]\",\n        \"sbcs x26, x27, x20\"\n      ]\n    },\n    \"lock sbb qword [rax], -2147483647\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffff80000001\",\n        \"cinc x21, x20, lo\",\n        \"neg x1, x21\",\n        \"ldaddal x1, x27, [x4]\",\n        \"sbcs x26, x27, x20\"\n      ]\n    },\n    \"lock sbb word [rax], 1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"GROUP1 0x83 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddalh w1, w27, [x4]\",\n        \"uxth w21, w27\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxth w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w21, w26\",\n        \"rmif x20, #15, #nzcV\"\n      ]\n    },\n    \"lock sbb dword [rax], 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x83 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w21, w20, lo\",\n        \"neg w1, w21\",\n        \"ldaddal w1, w27, [x4]\",\n        \"sbcs w26, w27, w20\"\n      ]\n    },\n    \"lock sbb qword [rax], 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x83 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc x21, x20, lo\",\n        \"neg x1, x21\",\n        \"ldaddal x1, x27, [x4]\",\n        \"sbcs x26, x27, x20\"\n      ]\n    },\n    \"lock and byte [rax], 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x80 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mvn w1, w20\",\n        \"ldclralb w1, w20, [x4]\",\n        \"and w26, w20, #0x1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\"\n      ]\n    },\n    \"lock and byte [rax], 0xFF\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x80 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w1, w20\",\n        \"ldclralb w1, w20, [x4]\",\n        \"and w26, w20, #0xff\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\"\n      ]\n    },\n    \"lock and word [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"mvn w1, w20\",\n        \"ldclralh w1, w20, [x4]\",\n        \"and w26, w20, #0x100\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\"\n      ]\n    },\n    \"lock and word [rax], 0xFFFF\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"mvn w1, w20\",\n        \"ldclralh w1, w20, [x4]\",\n        \"and w26, w20, #0xffff\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\"\n      ]\n    },\n    \"lock and dword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"mvn w1, w20\",\n        \"ldclral w1, w20, [x4]\",\n        \"ands w26, w20, #0x100\",\n        \"cfinv\"\n      ]\n    },\n    \"lock and dword [rax], 0xFFFFFFFF\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"mvn w1, w20\",\n        \"ldclral w1, w21, [x4]\",\n        \"ands w26, w21, w20\",\n        \"cfinv\"\n      ]\n    },\n    \"lock and qword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"mvn x1, x20\",\n        \"ldclral x1, x20, [x4]\",\n        \"ands x26, x20, #0x100\",\n        \"cfinv\"\n      ]\n    },\n    \"lock and qword [rax], -2147483647\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffff80000001\",\n        \"mvn x1, x20\",\n        \"ldclral x1, x20, [x4]\",\n        \"ands x26, x20, #0xffffffff80000001\",\n        \"cfinv\"\n      ]\n    },\n    \"lock and word [rax], 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mvn w1, w20\",\n        \"ldclralh w1, w20, [x4]\",\n        \"and w26, w20, #0x1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\"\n      ]\n    },\n    \"lock and dword [rax], 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x83 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mvn w1, w20\",\n        \"ldclral w1, w20, [x4]\",\n        \"ands w26, w20, #0x1\",\n        \"cfinv\"\n      ]\n    },\n    \"lock and qword [rax], 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x83 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mvn x1, x20\",\n        \"ldclral x1, x20, [x4]\",\n        \"ands x26, x20, #0x1\",\n        \"cfinv\"\n      ]\n    },\n    \"lock sub byte [rax], 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x80 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"neg w1, w20\",\n        \"ldaddalb w1, w27, [x4]\",\n        \"lsl w0, w27, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w27, #0x1 (1)\"\n      ]\n    },\n    \"lock sub byte [rax], 0xFF\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x80 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"neg w1, w20\",\n        \"ldaddalb w1, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"lsl w0, w21, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w21, #0xff (255)\"\n      ]\n    },\n    \"lock sub word [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"neg w1, w20\",\n        \"ldaddalh w1, w27, [x4]\",\n        \"lsl w0, w27, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w27, #0x100 (256)\"\n      ]\n    },\n    \"lock sub word [rax], 0xFFFF\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"neg w1, w20\",\n        \"ldaddalh w1, w21, [x4]\",\n        \"mvn w27, w21\",\n        \"lsl w0, w21, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w21, w20\"\n      ]\n    },\n    \"lock sub dword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"neg w1, w20\",\n        \"ldaddal w1, w27, [x4]\",\n        \"subs w26, w27, #0x100 (256)\"\n      ]\n    },\n    \"lock sub dword [rax], 0xFFFFFFFF\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"neg w1, w20\",\n        \"ldaddal w1, w20, [x4]\",\n        \"mvn w27, w20\",\n        \"adds w26, w20, #0x1 (1)\"\n      ]\n    },\n    \"lock sub qword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"neg x1, x20\",\n        \"ldaddal x1, x27, [x4]\",\n        \"subs x26, x27, #0x100 (256)\"\n      ]\n    },\n    \"lock sub qword [rax], -2147483647\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffff80000001\",\n        \"neg x1, x20\",\n        \"ldaddal x1, x27, [x4]\",\n        \"subs x26, x27, x20\"\n      ]\n    },\n    \"lock sub word [rax], 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"neg w1, w20\",\n        \"ldaddalh w1, w27, [x4]\",\n        \"lsl w0, w27, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w27, #0x1 (1)\"\n      ]\n    },\n    \"lock sub dword [rax], 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"neg w1, w20\",\n        \"ldaddal w1, w27, [x4]\",\n        \"subs w26, w27, #0x1 (1)\"\n      ]\n    },\n    \"lock sub qword [rax], 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"neg x1, x20\",\n        \"ldaddal x1, x27, [x4]\",\n        \"subs x26, x27, #0x1 (1)\"\n      ]\n    },\n    \"lock xor byte [rax], 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x80 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldeoralb w20, w20, [x4]\",\n        \"eor w26, w20, #0x1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\"\n      ]\n    },\n    \"lock xor byte [rax], 0xFF\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x80 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"ldeoralb w20, w20, [x4]\",\n        \"eor w26, w20, #0xff\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\"\n      ]\n    },\n    \"lock xor word [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldeoralh w20, w20, [x4]\",\n        \"eor w26, w20, #0x100\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\"\n      ]\n    },\n    \"lock xor word [rax], 0xFFFF\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"ldeoralh w20, w20, [x4]\",\n        \"eor w26, w20, #0xffff\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\"\n      ]\n    },\n    \"lock xor dword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldeoral w20, w20, [x4]\",\n        \"eor w20, w20, #0x100\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock xor dword [rax], 0xFFFFFFFF\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"ldeoral w20, w21, [x4]\",\n        \"eor w20, w21, w20\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock xor qword [rax], 0x100\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"ldeoral x20, x20, [x4]\",\n        \"eor x20, x20, #0x100\",\n        \"subs x26, x20, #0x0 (0)\"\n      ]\n    },\n    \"lock xor qword [rax], -2147483647\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffff80000001\",\n        \"ldeoral x20, x20, [x4]\",\n        \"eor x20, x20, #0xffffffff80000001\",\n        \"subs x26, x20, #0x0 (0)\"\n      ]\n    },\n    \"lock xor word [rax], 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x83 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldeoralh w20, w20, [x4]\",\n        \"eor w26, w20, #0x1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\"\n      ]\n    },\n    \"lock xor dword [rax], 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldeoral w20, w20, [x4]\",\n        \"eor w20, w20, #0x1\",\n        \"subs w26, w20, #0x0 (0)\"\n      ]\n    },\n    \"lock xor qword [rax], 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldeoral x20, x20, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"subs x26, x20, #0x0 (0)\"\n      ]\n    },\n    \"lock dec byte [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP3 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"ldaddalb w20, w27, [x4]\",\n        \"sub w26, w27, #0x1 (1)\",\n        \"setf8 w26\",\n        \"bic w20, w27, w26\",\n        \"rmif x20, #7, #nzcV\"\n      ]\n    },\n    \"lock not byte [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP2 0xf6 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"ldeoralb w20, w20, [x4]\"\n      ]\n    },\n    \"lock not word [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP2 0xf7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"ldeoralh w20, w20, [x4]\"\n      ]\n    },\n    \"lock not dword [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP2 0xf7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"ldeoral w20, w20, [x4]\"\n      ]\n    },\n    \"lock not qword [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP2 0xf7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"ldeoral x20, x20, [x4]\"\n      ]\n    },\n    \"lock neg byte [rax]\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xf6 /3\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w1, [x4]\",\n        \"mov w3, w1\",\n        \"neg w2, w1\",\n        \"casalb w1, w2, [x4]\",\n        \"sub w2, w1, w3\",\n        \"cbnz w2, #-0x10\",\n        \"mov w27, w1\",\n        \"cmp wzr, w27, lsl #24\",\n        \"neg w26, w27\"\n      ]\n    },\n    \"lock neg word [rax]\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xf7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w1, [x4]\",\n        \"mov w3, w1\",\n        \"neg w2, w1\",\n        \"casalh w1, w2, [x4]\",\n        \"sub w2, w1, w3\",\n        \"cbnz w2, #-0x10\",\n        \"mov w27, w1\",\n        \"cmp wzr, w27, lsl #16\",\n        \"neg w26, w27\"\n      ]\n    },\n    \"lock neg dword [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xf7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w1, [x4]\",\n        \"mov w3, w1\",\n        \"neg w2, w1\",\n        \"casal w1, w2, [x4]\",\n        \"sub w2, w1, w3\",\n        \"cbnz w2, #-0x10\",\n        \"mov w27, w1\",\n        \"negs w26, w27\"\n      ]\n    },\n    \"lock neg qword [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xf7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x1, [x4]\",\n        \"mov x3, x1\",\n        \"neg x2, x1\",\n        \"casal x1, x2, [x4]\",\n        \"sub x2, x1, x3\",\n        \"cbnz x2, #-0x10\",\n        \"mov x27, x1\",\n        \"negs x26, x27\"\n      ]\n    },\n    \"lock dec word [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP4 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"ldaddalh w20, w27, [x4]\",\n        \"sub w26, w27, #0x1 (1)\",\n        \"setf16 w26\",\n        \"bic w20, w27, w26\",\n        \"rmif x20, #15, #nzcV\"\n      ]\n    },\n    \"lock dec dword [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP4 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"ldaddal w20, w27, [x4]\",\n        \"cset x20, hs\",\n        \"subs w26, w27, #0x1 (1)\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock dec qword [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP4 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"ldaddal x20, x27, [x4]\",\n        \"cset x20, hs\",\n        \"subs x26, x27, #0x1 (1)\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock inc byte [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP4 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddalb w20, w27, [x4]\",\n        \"add w26, w27, #0x1 (1)\",\n        \"setf8 w26\",\n        \"bic w20, w26, w27\",\n        \"rmif x20, #7, #nzcV\"\n      ]\n    },\n    \"lock inc word [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP4 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddalh w20, w27, [x4]\",\n        \"add w26, w27, #0x1 (1)\",\n        \"setf16 w26\",\n        \"bic w20, w26, w27\",\n        \"rmif x20, #15, #nzcV\"\n      ]\n    },\n    \"lock inc dword [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP4 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddal w20, w27, [x4]\",\n        \"cset x20, hs\",\n        \"adds w26, w27, #0x1 (1)\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock inc qword [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP4 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"ldaddal x20, x27, [x4]\",\n        \"cset x20, hs\",\n        \"adds x26, x27, #0x1 (1)\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock xadd byte [rcx], al\": {\n      \"ExpectedInstructionCount\": 8,\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"ldaddalb w20, w21, [x7]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w21, w20\",\n        \"bfxil x4, x21, #0, #8\",\n        \"cfinv\"\n      ]\n    },\n    \"lock xadd word [rcx], ax\": {\n      \"ExpectedInstructionCount\": 8,\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"ldaddalh w20, w21, [x7]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w21, w20\",\n        \"bfxil x4, x21, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"lock xadd dword [rcx], eax\": {\n      \"ExpectedInstructionCount\": 5,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w4\",\n        \"ldaddal w20, w4, [x7]\",\n        \"eor x27, x4, x20\",\n        \"adds w26, w4, w20\",\n        \"cfinv\"\n      ]\n    },\n    \"lock xadd qword [rcx], rax\": {\n      \"ExpectedInstructionCount\": 5,\n      \"ExpectedArm64ASM\": [\n        \"ldaddal x4, x20, [x7]\",\n        \"eor x27, x20, x4\",\n        \"adds x26, x20, x4\",\n        \"cfinv\",\n        \"mov x4, x20\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/FlagOpts.json",
    "content": "{\n  \"Features\": {\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"Chained add\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 5,\n      \"x86Insts\": [\n        \"add rax, rbx\",\n        \"adc rcx, rcx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"adds x4, x4, x6\",\n        \"mov w27, #0x0\",\n        \"adcs x26, x7, x7\",\n        \"cfinv\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"Chained sub\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 4,\n      \"x86Insts\": [\n        \"sub rax, rbx\",\n        \"sbb rcx, rdx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"subs x4, x4, x6\",\n        \"eor x27, x7, x5\",\n        \"sbcs x26, x7, x5\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"Inverted add\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 4,\n      \"x86Insts\": [\n        \"add rax, rbx\",\n        \"adc rcx, rdx\",\n        \"cmc\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"adds x4, x4, x6\",\n        \"eor x27, x7, x5\",\n        \"adcs x26, x7, x5\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"Inverted sub\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 5,\n      \"x86Insts\": [\n        \"sub rax, rbx\",\n        \"sbb rcx, rcx\",\n        \"cmc\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"subs x4, x4, x6\",\n        \"mov w27, #0x0\",\n        \"sbcs x26, x7, x7\",\n        \"mov x7, x26\",\n        \"cfinv\"\n      ]\n    },\n    \"ADC dead\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 3,\n      \"x86Insts\": [\n        \"add rax, rbx\",\n        \"adc rcx, rcx\",\n        \"test rcx, rcx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"adds x4, x4, x6\",\n        \"adc x7, x7, x7\",\n        \"subs x26, x7, #0x0 (0)\"\n      ]\n    },\n    \"INC consumed\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 6,\n      \"x86Insts\": [\n        \"add rax, rbx\",\n        \"inc rax\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"adds x4, x4, x6\",\n        \"cset x20, lo\",\n        \"adds x26, x4, #0x1 (1)\",\n        \"rmif x20, #63, #nzCv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"INC dead\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 4,\n      \"x86Insts\": [\n        \"add rax, rbx\",\n        \"inc rax\",\n        \"test rax, rdx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add x4, x4, x6\",\n        \"add x4, x4, #0x1 (1)\",\n        \"ands x26, x4, x5\",\n        \"cfinv\"\n      ]\n    },\n    \"DEC consumed\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 6,\n      \"x86Insts\": [\n        \"sub rax, rbx\",\n        \"dec rax\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"subs x4, x4, x6\",\n        \"cset x20, hs\",\n        \"subs x26, x4, #0x1 (1)\",\n        \"rmif x20, #63, #nzCv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"DEC dead\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 4,\n      \"x86Insts\": [\n        \"sub rax, rbx\",\n        \"dec rax\",\n        \"test rax, rcx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub x4, x4, x6\",\n        \"sub x4, x4, #0x1 (1)\",\n        \"ands x26, x4, x7\",\n        \"cfinv\"\n      ]\n    },\n    \"8-bit DEC consumed\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 11,\n      \"x86Insts\": [\n        \"sub al, ah\",\n        \"dec al\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, #8\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w20, w4, w20\",\n        \"bfxil x4, x20, #0, #8\",\n        \"uxtb w27, w4\",\n        \"sub w26, w27, #0x1 (1)\",\n        \"setf8 w26\",\n        \"bic w20, w27, w26\",\n        \"rmif x20, #7, #nzcV\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"8-bit DEC dead\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 9,\n      \"x86Insts\": [\n        \"sub al, ah\",\n        \"dec al\",\n        \"test al, al\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, #8\",\n        \"sub w20, w4, w20\",\n        \"bfxil x4, x20, #0, #8\",\n        \"uxtb w20, w4\",\n        \"sub w20, w20, #0x1 (1)\",\n        \"bfxil x4, x20, #0, #8\",\n        \"cmn wzr, w4, lsl #24\",\n        \"cfinv\",\n        \"mov x26, x4\"\n      ]\n    },\n    \"Variable shift dead\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 3,\n      \"x86Insts\": [\n        \"sar rax, cl\",\n        \"test rax, rdx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"asr x4, x4, x7\",\n        \"ands x26, x4, x5\",\n        \"cfinv\"\n      ]\n    },\n    \"Variable rotate-through-carry dead\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 11,\n      \"x86Insts\": [\n        \"rcr rax, cl\",\n        \"test rax, rdx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x3f\",\n        \"cbz x20, #+0x20\",\n        \"lsr x20, x4, x7\",\n        \"cset x21, lo\",\n        \"neg x22, x7\",\n        \"lsl x23, x4, x22\",\n        \"orr x20, x20, x23, lsl #1\",\n        \"lsl x21, x21, x22\",\n        \"orr x4, x20, x21\",\n        \"ands x26, x4, x5\",\n        \"cfinv\"\n      ]\n    },\n    \"Partial NZCV select (cmp)\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 6,\n      \"x86Insts\": [\n        \"cmp rax, rbx\",\n        \"setz cl\",\n        \"test cl, cl\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmp x4, x6\",\n        \"cset x20, eq\",\n        \"bfxil x7, x20, #0, #8\",\n        \"cmn wzr, w7, lsl #24\",\n        \"cfinv\",\n        \"mov x26, x7\"\n      ]\n    },\n    \"Partial NZCV select (add)\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 6,\n      \"x86Insts\": [\n        \"add rax, rbx\",\n        \"setz cl\",\n        \"test cl, cl\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"adds x4, x4, x6\",\n        \"cset x20, eq\",\n        \"bfxil x7, x20, #0, #8\",\n        \"cmn wzr, w7, lsl #24\",\n        \"cfinv\",\n        \"mov x26, x7\"\n      ]\n    },\n    \"AND use only ZF\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 6,\n      \"x86Insts\": [\n        \"and eax, ebx\",\n        \"setz cl\",\n        \"test cl, cl\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ands w4, w4, w6\",\n        \"cset x20, eq\",\n        \"bfxil x7, x20, #0, #8\",\n        \"cmn wzr, w7, lsl #24\",\n        \"cfinv\",\n        \"mov x26, x7\"\n      ]\n    },\n    \"AND use only PF\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 10,\n      \"x86Insts\": [\n        \"and eax, ebx\",\n        \"setp cl\",\n        \"test cl, cl\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and w26, w4, w6\",\n        \"mov x4, x26\",\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"and w20, w20, #0x1\",\n        \"bfxil x7, x20, #0, #8\",\n        \"cmn wzr, w7, lsl #24\",\n        \"cfinv\",\n        \"mov x26, x7\"\n      ]\n    },\n    \"UCOMISS use only PF\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 4,\n      \"x86Insts\": [\n        \"ucomiss xmm0, xmm1\",\n        \"setnp cl\",\n        \"test rax, rax\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp s16, s17\",\n        \"cset x26, vc\",\n        \"bfxil x7, x26, #0, #8\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"Test use only zero - self 16-bit\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 6,\n      \"x86Insts\": [\n        \"test ax, ax\",\n        \"setz al\",\n        \"test cl, cl\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"tst w4, #0xffff\",\n        \"cset x20, eq\",\n        \"bfxil x4, x20, #0, #8\",\n        \"cmn wzr, w7, lsl #24\",\n        \"cfinv\",\n        \"mov x26, x7\"\n      ]\n    },\n    \"Test use only zero - non constant 16-bit\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 7,\n      \"x86Insts\": [\n        \"test ax, bx\",\n        \"setz al\",\n        \"test cl, cl\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and w0, w4, w6\",\n        \"tst w0, #0xffff\",\n        \"cset x20, eq\",\n        \"bfxil x4, x20, #0, #8\",\n        \"cmn wzr, w7, lsl #24\",\n        \"cfinv\",\n        \"mov x26, x7\"\n      ]\n    },\n    \"Test use only zero - constant 8-bit\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 8,\n      \"x86Insts\": [\n        \"test al, 137\",\n        \"setnz al\",\n        \"test cl, cl\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x89\",\n        \"and w0, w4, w20\",\n        \"tst w0, #0xff\",\n        \"cset x20, ne\",\n        \"bfxil x4, x20, #0, #8\",\n        \"cmn wzr, w7, lsl #24\",\n        \"cfinv\",\n        \"mov x26, x7\"\n      ]\n    },\n    \"Dead cmpxchg flags\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 10,\n      \"x86Insts\": [\n        \"cmpxchg8b [rbp]\",\n        \"test rax, rax\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"mov x21, x5\",\n        \"caspal w20, w21, w6, w7, [x9]\",\n        \"mrs x0, nzcv\",\n        \"cmp w20, w4\",\n        \"ccmp w21, w5, #nzcv, eq\",\n        \"rmif x0, #0, #NzCV\",\n        \"csel x4, x20, x4, ne\",\n        \"csel x5, x21, x5, ne\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/H0F38.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"ptest xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x17\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and v2.16b, v16.16b, v17.16b\",\n        \"bic v3.16b, v17.16b, v16.16b\",\n        \"umaxv h2, v2.8h\",\n        \"umaxv h3, v3.8h\",\n        \"umov w20, v2.h[0]\",\n        \"umov w21, v3.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"rmif x21, #63, #nzCv\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"adcx eax, ebx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0xf6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cfinv\",\n        \"adcs w4, w6, w4\",\n        \"rmif x20, #28, #NZcV\",\n        \"cfinv\"\n      ]\n    },\n    \"adcx rax, rbx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x66 REX.W 0x0f 0x38 0xf6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cfinv\",\n        \"adcs x4, x6, x4\",\n        \"rmif x20, #28, #NZcV\",\n        \"cfinv\"\n      ]\n    },\n    \"adox eax, ebx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xf3 0x0f 0x38 0xf6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"ccmp wzr, #0, #nzcv, vs\",\n        \"adcs w4, w6, w4\",\n        \"ccmp wzr, #0, #nzcV, lo\",\n        \"rmif x20, #28, #NZCv\"\n      ]\n    },\n    \"adox rax, rbx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xf3 REX.W 0x0f 0x38 0xf6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"ccmp wzr, #0, #nzcv, vs\",\n        \"adcs x4, x6, x4\",\n        \"ccmp wzr, #0, #nzcV, lo\",\n        \"rmif x20, #28, #NZCv\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/HotBlocks.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"The Witcher 3\": {\n      \"x86InstructionCount\": 7,\n      \"ExpectedInstructionCount\": 9,\n      \"x86Insts\": [\n        \"mov eax, 0x1\",\n        \"lock xadd qword [rcx], rax\",\n        \"mov rdx, rax\",\n        \"and edx, 0x1f\",\n        \"inc rdx\",\n        \"shl rdx, 0x6\",\n        \"add rdx, rcx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, #0x1\",\n        \"ldaddal x4, x4, [x7]\",\n        \"and w5, w4, #0x1f\",\n        \"add x5, x5, #0x1 (1)\",\n        \"lsl x5, x5, #6\",\n        \"eor x27, x5, x7\",\n        \"adds x26, x5, x7\",\n        \"cfinv\",\n        \"mov x5, x26\"\n      ]\n    },\n    \"FMOD scalar loop\": {\n      \"x86InstructionCount\": 38,\n      \"ExpectedInstructionCount\": 64,\n      \"x86Insts\": [\n        \"mov     esi, ecx\",\n        \"mov     rdx, rbp\",\n        \"mov     rax, rbx\",\n        \"movss   xmm2, dword [rdx]\",\n        \"add     rax, 0x20\",\n        \"mulss   xmm2, xmm0\",\n        \"add     rdx, 0x20\",\n        \"addss   xmm2, dword [rax-0x20]\",\n        \"movss   dword [rax-0x20], xmm2\",\n        \"movss   xmm2, dword [rdx-0x1c]\",\n        \"mulss   xmm2, xmm1\",\n        \"addss   xmm2, dword [rax-0x1c]\",\n        \"movss   dword [rax-0x1c], xmm2\",\n        \"movss   xmm2, dword [rdx-0x18]\",\n        \"mulss   xmm2, xmm0\",\n        \"addss   xmm2, dword [rax-0x18]\",\n        \"movss   dword [rax-0x18], xmm2\",\n        \"movss   xmm2, dword [rdx-0x14]\",\n        \"mulss   xmm2, xmm1\",\n        \"addss   xmm2, dword [rax-0x14]\",\n        \"movss   dword [rax-0x14], xmm2\",\n        \"movss   xmm2, dword [rdx-0x10]\",\n        \"mulss   xmm2, xmm0\",\n        \"addss   xmm2, dword [rax-0x10]\",\n        \"movss   dword [rax-0x10], xmm2\",\n        \"movss   xmm2, dword [rdx-0xc]\",\n        \"mulss   xmm2, xmm1\",\n        \"addss   xmm2, dword [rax-0xc]\",\n        \"movss   dword [rax-0xc], xmm2\",\n        \"movss   xmm2, dword [rdx-0x8]\",\n        \"mulss   xmm2, xmm0\",\n        \"addss   xmm2, dword [rax-0x8]\",\n        \"movss   dword [rax-0x8], xmm2\",\n        \"movss   xmm2, dword [rdx-0x4]\",\n        \"mulss   xmm2, xmm1\",\n        \"addss   xmm2, dword [rax-0x4]\",\n        \"movss   dword [rax-0x4], xmm2\",\n        \"sub     esi, 0x1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w10, w7\",\n        \"mov x5, x9\",\n        \"mov x4, x6\",\n        \"ldr s18, [x5]\",\n        \"add x4, x4, #0x20 (32)\",\n        \"fmul s0, s18, s16\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"add x5, x5, #0x20 (32)\",\n        \"ldur s2, [x4, #-32]\",\n        \"fadd s0, s18, s2\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"stur s18, [x4, #-32]\",\n        \"ldur s18, [x5, #-28]\",\n        \"fmul s0, s18, s17\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"ldur s2, [x4, #-28]\",\n        \"fadd s0, s18, s2\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"stur s18, [x4, #-28]\",\n        \"ldur s18, [x5, #-24]\",\n        \"fmul s0, s18, s16\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"ldur s2, [x4, #-24]\",\n        \"fadd s0, s18, s2\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"stur s18, [x4, #-24]\",\n        \"ldur s18, [x5, #-20]\",\n        \"fmul s0, s18, s17\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"ldur s2, [x4, #-20]\",\n        \"fadd s0, s18, s2\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"stur s18, [x4, #-20]\",\n        \"ldur s18, [x5, #-16]\",\n        \"fmul s0, s18, s16\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"ldur s2, [x4, #-16]\",\n        \"fadd s0, s18, s2\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"stur s18, [x4, #-16]\",\n        \"ldur s18, [x5, #-12]\",\n        \"fmul s0, s18, s17\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"ldur s2, [x4, #-12]\",\n        \"fadd s0, s18, s2\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"stur s18, [x4, #-12]\",\n        \"ldur s18, [x5, #-8]\",\n        \"fmul s0, s18, s16\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"ldur s2, [x4, #-8]\",\n        \"fadd s0, s18, s2\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"stur s18, [x4, #-8]\",\n        \"ldur s18, [x5, #-4]\",\n        \"fmul s0, s18, s17\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"ldur s2, [x4, #-4]\",\n        \"fadd s0, s18, s2\",\n        \"mov v18.s[0], v0.s[0]\",\n        \"stur s18, [x4, #-4]\",\n        \"subs w26, w10, #0x1 (1)\",\n        \"mov x27, x10\",\n        \"mov x10, x26\"\n      ]\n    },\n    \"Scalar vector add loop\": {\n      \"x86InstructionCount\": 5,\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Saw this in bytemark\"\n      ],\n      \"x86Insts\": [\n        \"movdqu  xmm0, [r12+rax]\",\n        \"paddq   xmm0, xmm1\",\n        \"movups  [r12+rax], xmm0\",\n        \"add     rax, 0x10\",\n        \"cmp     rsi, rax\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x16, x4, sxtx]\",\n        \"add v16.2d, v16.2d, v17.2d\",\n        \"str q16, [x16, x4, sxtx]\",\n        \"add x4, x4, #0x10 (16)\",\n        \"eor x27, x10, x4\",\n        \"subs x26, x10, x4\"\n      ]\n    },\n    \"bytemark data xor loop\": {\n      \"x86InstructionCount\": 9,\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Saw this in bytemark\"\n      ],\n      \"x86Insts\": [\n        \"mov     rdx, rax\",\n        \"mov     rcx, rax\",\n        \"mov     r14, rsi\",\n        \"add     rax, 0x1\",\n        \"shr     rdx, 0x6\",\n        \"and     ecx, 0x3f\",\n        \"shl     r14, cl\",\n        \"xor     qword [rbx+rdx*8], r14\",\n        \"cmp     rdi, rax\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x5, x4\",\n        \"mov x7, x4\",\n        \"mov x19, x10\",\n        \"add x4, x4, #0x1 (1)\",\n        \"lsr x5, x5, #6\",\n        \"and w7, w7, #0x3f\",\n        \"lsl x19, x19, x7\",\n        \"ldr x20, [x6, x5, sxtx #3]\",\n        \"eor x20, x20, x19\",\n        \"str x20, [x6, x5, sxtx #3]\",\n        \"eor x27, x11, x4\",\n        \"subs x26, x11, x4\"\n      ]\n    },\n    \"bytemark num sort\": {\n      \"x86InstructionCount\": 4,\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Saw this in bytemark\"\n      ],\n      \"x86Insts\": [\n        \"mov    r13, qword [rsi+r9*8]\",\n        \"mov    r11, r9\",\n        \"or     r11, 0x1\",\n        \"cmp    r13, qword [rsi+r11*8]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x17, [x10, x13, sxtx #3]\",\n        \"orr x15, x13, #0x1\",\n        \"ldr x20, [x10, x15, sxtx #3]\",\n        \"eor x27, x17, x20\",\n        \"subs x26, x17, x20\"\n      ]\n    },\n    \"bytemark fpemu\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Saw this in bytemark\"\n      ],\n      \"x86Insts\": [\n        \"movzx  r10d,word [rdx+0x4]\",\n        \"movzx  edi,word [rdx+0x6]\",\n        \"mov    dword [rsp+0xc],edi\",\n        \"movzx  ebx,word [rdx+0x8]\",\n        \"movzx  edi,word [rdx+0xa]\",\n        \"mov    dword [rsp+0x10],edi\",\n        \"lea    r8,[r11+r11*2]\",\n        \"cmp    qword [r13+r8*4+0x4],0x0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w14, [x5, #4]\",\n        \"ldrh w11, [x5, #6]\",\n        \"str w11, [x8, #12]\",\n        \"ldrh w6, [x5, #8]\",\n        \"ldrh w11, [x5, #10]\",\n        \"str w11, [x8, #16]\",\n        \"add x12, x15, x15, lsl #1\",\n        \"add x20, x17, x12, lsl #2\",\n        \"ldur x27, [x20, #4]\",\n        \"subs x26, x27, #0x0 (0)\"\n      ]\n    },\n    \"bytemark DivideInternalFPF\": {\n      \"x86InstructionCount\": 13,\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Saw this in bytemark\"\n      ],\n      \"x86Insts\": [\n        \"push   rbp\",\n        \"push   r15\",\n        \"push   r14\",\n        \"push   r13\",\n        \"push   r12\",\n        \"push   rbx\",\n        \"sub    rsp,0x18\",\n        \"mov    qword [rsp],rdx\",\n        \"movzx  r10d,byte [rdi]\",\n        \"lea    ecx,[r10+r10*4]\",\n        \"movzx  eax,byte [rsi]\",\n        \"add    eax,ecx\",\n        \"cmp    eax,0x18\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp x29, x9, [x8, #-16]!\",\n        \"stp x17, x19, [x8, #-16]!\",\n        \"stp x6, x16, [x8, #-16]!\",\n        \"sub x8, x8, #0x18 (24)\",\n        \"str x5, [x8]\",\n        \"ldrb w14, [x11]\",\n        \"add x20, x14, x14, lsl #2\",\n        \"mov w7, w20\",\n        \"ldrb w4, [x10]\",\n        \"add w4, w4, w7\",\n        \"mvn w27, w4\",\n        \"subs w26, w4, #0x18 (24)\"\n      ]\n    },\n    \"bytemark huffman 1\": {\n      \"x86InstructionCount\": 18,\n      \"ExpectedInstructionCount\": 21,\n      \"x86Insts\": [\n        \"mov    r9,rdx\",\n        \"mov    r8,rcx\",\n        \"nop    dword [rax+0x0]\",\n        \"mov    r10d,esi\",\n        \"shr    r10d,0x3\",\n        \"movzx  r10d,byte [rbp+r10*1+0x0]\",\n        \"mov    r11d,esi\",\n        \"and    r11d,0x7\",\n        \"bt     r10d,r11d\",\n        \"lea    r8,[r8+r8*4]\",\n        \"lea    r8,[rbx+r8*4+0x10]\",\n        \"cmovae r8,r9\",\n        \"movsxd r8,dword [r8]\",\n        \"add    rsi,0x1\",\n        \"lea    r10,[r8+r8*4]\",\n        \"lea    r9,[rbx+r10*4]\",\n        \"add    r9,0xc\",\n        \"cmp    dword [rbx+r10*4+0xc],0xffffffff\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x13, x5\",\n        \"mov x12, x7\",\n        \"lsr w14, w10, #3\",\n        \"ldrb w14, [x9, x14, sxtx]\",\n        \"and w15, w10, #0x7\",\n        \"lsr w20, w14, w15\",\n        \"rmif x20, #63, #nzCv\",\n        \"add x12, x12, x12, lsl #2\",\n        \"add x20, x6, #0x10 (16)\",\n        \"add x12, x20, x12, lsl #2\",\n        \"csel x12, x13, x12, lo\",\n        \"ldr w20, [x12]\",\n        \"sxtw x12, w20\",\n        \"add x10, x10, #0x1 (1)\",\n        \"add x14, x12, x12, lsl #2\",\n        \"add x13, x6, x14, lsl #2\",\n        \"add x13, x13, #0xc (12)\",\n        \"add x20, x6, x14, lsl #2\",\n        \"ldr w20, [x20, #12]\",\n        \"mvn w27, w20\",\n        \"adds w26, w20, #0x1 (1)\"\n      ]\n    },\n    \"bytemark huffman 2\": {\n      \"x86InstructionCount\": 10,\n      \"ExpectedInstructionCount\": 17,\n      \"x86Insts\": [\n        \"movsxd r9,r8d\",\n        \"lea    r9,[r9+r9*4]\",\n        \"cmp    dword [rbx+r9*4+0xc],ecx\",\n        \"sete   cl\",\n        \"xor    cl,0x31\",\n        \"mov    byte [rsp+rdi*1+0x50],cl\",\n        \"add    rdi,0x1\",\n        \"mov    ecx,r8d\",\n        \"mov    r8d,dword [rbx+r9*4+0x8]\",\n        \"cmp    r8d,0xfffffffe\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtw x13, w12\",\n        \"add x13, x13, x13, lsl #2\",\n        \"add x20, x6, x13, lsl #2\",\n        \"ldr w20, [x20, #12]\",\n        \"cmp w20, w7\",\n        \"cset x20, eq\",\n        \"bfxil x7, x20, #0, #8\",\n        \"mov w20, #0x31\",\n        \"eor x7, x7, x20\",\n        \"add x20, x8, x11\",\n        \"strb w7, [x20, #80]\",\n        \"add x11, x11, #0x1 (1)\",\n        \"mov w7, w12\",\n        \"add x20, x6, x13, lsl #2\",\n        \"ldr w12, [x20, #8]\",\n        \"mvn w27, w12\",\n        \"adds w26, w12, #0x2 (2)\"\n      ]\n    },\n    \"bytemark huffman 3\": {\n      \"x86InstructionCount\": 19,\n      \"ExpectedInstructionCount\": 34,\n      \"x86Insts\": [\n        \"mov    ecx,eax\",\n        \"and    cl,0x7\",\n        \"mov    r8b,0x1\",\n        \"shl    r8b,cl\",\n        \"mov    r9d,eax\",\n        \"shr    r9d,0x3\",\n        \"movzx  r10d,byte [rbp+r9*1+0x0]\",\n        \"mov    r11b,0xfe\",\n        \"mov    ecx,eax\",\n        \"rol    r11b,cl\",\n        \"and    r11b,r10b\",\n        \"or     r8b,r10b\",\n        \"cmp    byte [rsp+rdi*1+0x4f],0x31\",\n        \"movzx  ecx,r8b\",\n        \"movzx  r8d,r11b\",\n        \"cmove  r8d,ecx\",\n        \"add    rax,0x1\",\n        \"mov    byte [rbp+r9*1+0x0],r8b\",\n        \"add    rdi,0xffffffffffffffff\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and w7, w4, #0xffffff07\",\n        \"mov w20, #0x1\",\n        \"bfxil x12, x20, #0, #8\",\n        \"lsl w20, w12, w7\",\n        \"bfxil x12, x20, #0, #8\",\n        \"lsr w13, w4, #3\",\n        \"ldrb w14, [x9, x13, sxtx]\",\n        \"mov w20, #0xfe\",\n        \"bfxil x15, x20, #0, #8\",\n        \"mov w7, w4\",\n        \"and x20, x7, #0x7\",\n        \"mov x21, x15\",\n        \"bfi w21, w15, #24, #8\",\n        \"neg x20, x20\",\n        \"ror w20, w21, w20\",\n        \"bfxil x15, x20, #0, #8\",\n        \"and w20, w15, w14\",\n        \"bfxil x15, x20, #0, #8\",\n        \"orr w20, w12, w14\",\n        \"bfxil x12, x20, #0, #8\",\n        \"mov w20, #0x31\",\n        \"add x21, x8, x11\",\n        \"ldrb w21, [x21, #79]\",\n        \"lsl w0, w21, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"uxtb w7, w12\",\n        \"uxtb w12, w15\",\n        \"csel w12, w7, w12, eq\",\n        \"add x4, x4, #0x1 (1)\",\n        \"strb w12, [x9, x13, sxtx]\",\n        \"mvn w27, w11\",\n        \"subs x26, x11, #0x1 (1)\",\n        \"cfinv\",\n        \"mov x11, x26\"\n      ]\n    },\n    \"bytemark nn\": {\n      \"x86InstructionCount\": 12,\n      \"ExpectedInstructionCount\": 24,\n      \"x86Insts\": [\n        \"mulpd  xmm3,xmm2\",\n        \"movupd xmm4,oword [rax+rdx*8+0x216190]\",\n        \"mulpd  xmm4,xmm6\",\n        \"addpd  xmm4,xmm3\",\n        \"movupd xmm3,oword [rax+rdx*8+0x2155d0]\",\n        \"addpd  xmm3,xmm4\",\n        \"movupd oword [rax+rdx*8+0x2155d0],xmm3\",\n        \"movupd xmm3,oword [rax+rdx*8+0x217c10]\",\n        \"addpd  xmm3,xmm4\",\n        \"movupd oword [rax+rdx*8+0x217c10],xmm3\",\n        \"add    rdx,0x2\",\n        \"cmp    rdx,0x22\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v19.2d, v19.2d, v18.2d\",\n        \"add x20, x4, x5, lsl #3\",\n        \"mov w21, #0x6190\",\n        \"movk w21, #0x21, lsl #16\",\n        \"ldr q20, [x20, x21, sxtx]\",\n        \"fmul v20.2d, v20.2d, v22.2d\",\n        \"fadd v20.2d, v20.2d, v19.2d\",\n        \"add x20, x4, x5, lsl #3\",\n        \"mov w21, #0x55d0\",\n        \"movk w21, #0x21, lsl #16\",\n        \"ldr q19, [x20, x21, sxtx]\",\n        \"fadd v19.2d, v19.2d, v20.2d\",\n        \"add x20, x4, x5, lsl #3\",\n        \"str q19, [x20, x21, sxtx]\",\n        \"add x20, x4, x5, lsl #3\",\n        \"mov w21, #0x7c10\",\n        \"movk w21, #0x21, lsl #16\",\n        \"ldr q19, [x20, x21, sxtx]\",\n        \"fadd v19.2d, v19.2d, v20.2d\",\n        \"add x20, x4, x5, lsl #3\",\n        \"str q19, [x20, x21, sxtx]\",\n        \"add x5, x5, #0x2 (2)\",\n        \"subs x26, x5, #0x22 (34)\",\n        \"mov x27, x5\"\n      ]\n    },\n    \"000000000020e9bd <DoNNetIteration+0x21d>:\": {\n      \"x86InstructionCount\": 35,\n      \"ExpectedInstructionCount\": 53,\n      \"x86Insts\": [\n        \"mov    rsi,0xfffffffffffffee8\",\n        \"xchg   ax,ax\",\n        \"mov    ecx,eax\",\n        \"imul   eax,edx,0x8149a\",\n        \"imul   edx,ecx,0x3e322\",\n        \"add    edx,eax\",\n        \"movsxd rax,edx\",\n        \"imul   rdx,rax,0xffffffff8646c299\",\n        \"shr    rdx,0x20\",\n        \"add    edx,eax\",\n        \"mov    edi,edx\",\n        \"shr    edi,0x1f\",\n        \"sar    edx,0x13\",\n        \"add    edx,edi\",\n        \"imul   edx,edx,0xf408b\",\n        \"sub    eax,edx\",\n        \"movsxd rdx,eax\",\n        \"imul   rdi,rdx,0x14f8b589\",\n        \"mov    r8,rdi\",\n        \"shr    r8,0x3f\",\n        \"sar    rdi,0x2d\",\n        \"add    edi,r8d\",\n        \"imul   edi,edi,0x186a0\",\n        \"sub    edx,edi\",\n        \"mov    edi,edx\",\n        \"neg    edi\",\n        \"cmovs  edi,edx\",\n        \"xorps  xmm0,xmm0\",\n        \"cvtsi2sd xmm0,rdi\",\n        \"divsd  xmm0,xmm1\",\n        \"addsd  xmm0,xmm2\",\n        \"mulsd  xmm0,xmm3\",\n        \"movsd  qword [rsi+0x216428],xmm0\",\n        \"mov    edx,ecx\",\n        \"add    rsi,0x8\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x10, #0xfffffffffffffee8\",\n        \"mov w7, w4\",\n        \"mov w20, #0x149a\",\n        \"movk w20, #0x8, lsl #16\",\n        \"mul w4, w5, w20\",\n        \"mov w20, #0xe322\",\n        \"movk w20, #0x3, lsl #16\",\n        \"mul w5, w7, w20\",\n        \"add w5, w5, w4\",\n        \"sxtw x4, w5\",\n        \"mov x20, #0xffffffffffffc299\",\n        \"movk x20, #0x8646, lsl #16\",\n        \"mul x5, x4, x20\",\n        \"lsr x5, x5, #32\",\n        \"add w5, w5, w4\",\n        \"lsr w11, w5, #31\",\n        \"asr w5, w5, #19\",\n        \"add w5, w5, w11\",\n        \"mov w20, #0x408b\",\n        \"movk w20, #0xf, lsl #16\",\n        \"mul w5, w5, w20\",\n        \"sub w4, w4, w5\",\n        \"sxtw x5, w4\",\n        \"mov w20, #0xb589\",\n        \"movk w20, #0x14f8, lsl #16\",\n        \"mul x11, x5, x20\",\n        \"lsr x12, x11, #63\",\n        \"asr x11, x11, #45\",\n        \"add w11, w11, w12\",\n        \"mov w20, #0x86a0\",\n        \"movk w20, #0x1, lsl #16\",\n        \"mul w11, w11, w20\",\n        \"sub w5, w5, w11\",\n        \"mov w11, w5\",\n        \"negs w11, w11\",\n        \"csel w11, w5, w11, mi\",\n        \"movi v16.2d, #0x0\",\n        \"scvtf d0, x11\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"fdiv d0, d16, d17\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"fadd d0, d16, d18\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"fmul d0, d16, d19\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"mov w20, #0x6428\",\n        \"movk w20, #0x21, lsl #16\",\n        \"str d16, [x10, x20, sxtx]\",\n        \"mov w5, w7\",\n        \"adds x26, x10, #0x8 (8)\",\n        \"cfinv\",\n        \"mov x27, x10\",\n        \"mov x10, x26\"\n      ]\n    },\n    \"glibc AVX memcpy block 1\": {\n      \"x86InstructionCount\": 20,\n      \"ExpectedInstructionCount\": 26,\n      \"x86Insts\": [\n        \"vmovdqu ymm5,yword [rsi+0x20]\",\n        \"vmovdqu ymm6,yword [rsi+0x40]\",\n        \"lea    rcx,[rdi+rdx*1-0x81]\",\n        \"vmovdqu ymm7,yword [rsi+0x60]\",\n        \"vmovdqu ymm8,yword [rsi+rdx*1-0x20]\",\n        \"sub    rsi,rdi\",\n        \"and    rcx,0xffffffffffffffe0\",\n        \"add    rsi,rcx\",\n        \"nop    dword [rax+0x0]\",\n        \"vmovdqu ymm1,yword [rsi+0x60]\",\n        \"vmovdqu ymm2,yword [rsi+0x40]\",\n        \"vmovdqu ymm3,yword [rsi+0x20]\",\n        \"vmovdqu ymm4,yword [rsi]\",\n        \"add    rsi,0xffffffffffffff80\",\n        \"vmovdqa yword [rcx+0x60],ymm1\",\n        \"vmovdqa yword [rcx+0x40],ymm2\",\n        \"vmovdqa yword [rcx+0x20],ymm3\",\n        \"vmovdqa yword [rcx],ymm4\",\n        \"add    rcx,0xffffffffffffff80\",\n        \"cmp    rdi,rcx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldp q21, q2, [x10, #32]\",\n        \"ldp q22, q3, [x10, #64]\",\n        \"sub x20, x11, #0x81 (129)\",\n        \"add x7, x20, x5\",\n        \"ldp q23, q4, [x10, #96]\",\n        \"add x20, x10, x5\",\n        \"ldp q24, q5, [x20, #-32]\",\n        \"sub x10, x10, x11\",\n        \"and x7, x7, #0xffffffffffffffe0\",\n        \"add x10, x10, x7\",\n        \"ldp q17, q6, [x10, #96]\",\n        \"ldp q18, q7, [x10, #64]\",\n        \"ldp q19, q8, [x10, #32]\",\n        \"ldp q20, q9, [x10]\",\n        \"sub x10, x10, #0x80 (128)\",\n        \"stp q17, q6, [x7, #96]\",\n        \"stp q18, q7, [x7, #64]\",\n        \"stp q19, q8, [x7, #32]\",\n        \"stp q20, q9, [x7]\",\n        \"sub x7, x7, #0x80 (128)\",\n        \"eor x27, x11, x7\",\n        \"subs x26, x11, x7\",\n        \"stp q4, q5, [x28, #304]\",\n        \"stp q2, q3, [x28, #272]\",\n        \"stp q8, q9, [x28, #240]\",\n        \"stp q6, q7, [x28, #208]\"\n      ]\n    },\n    \"glibc AVX memcpy block 2\": {\n      \"x86InstructionCount\": 22,\n      \"ExpectedInstructionCount\": 31,\n      \"x86Insts\": [\n        \"vmovdqu ymm5,yword [rsi+rdx*1-0x20]\",\n        \"vmovdqu ymm6,yword [rsi+rdx*1-0x40]\",\n        \"mov    rcx,rdi\",\n        \"or     rdi,0x1f\",\n        \"vmovdqu ymm7,yword [rsi+rdx*1-0x60]\",\n        \"vmovdqu ymm8,yword [rsi+rdx*1-0x80]\",\n        \"sub    rsi,rcx\",\n        \"inc    rdi\",\n        \"add    rsi,rdi\",\n        \"lea    rdx,[rcx+rdx*1-0x80]\",\n        \"nop    dword [rax+rax*1+0x0]\",\n        \"vmovdqu ymm1,yword [rsi]\",\n        \"vmovdqu ymm2,yword [rsi+0x20]\",\n        \"vmovdqu ymm3,yword [rsi+0x40]\",\n        \"vmovdqu ymm4,yword [rsi+0x60]\",\n        \"sub    rsi,0xffffffffffffff80\",\n        \"vmovdqa yword [rdi],ymm1\",\n        \"vmovdqa yword [rdi+0x20],ymm2\",\n        \"vmovdqa yword [rdi+0x40],ymm3\",\n        \"vmovdqa yword [rdi+0x60],ymm4\",\n        \"sub    rdi,0xffffffffffffff80\",\n        \"cmp    rdx,rdi\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add x20, x10, x5\",\n        \"ldp q21, q2, [x20, #-32]\",\n        \"add x20, x10, x5\",\n        \"ldp q22, q3, [x20, #-64]\",\n        \"mov x7, x11\",\n        \"orr x11, x11, #0x1f\",\n        \"add x20, x10, x5\",\n        \"ldp q23, q4, [x20, #-96]\",\n        \"add x20, x10, x5\",\n        \"ldp q24, q5, [x20, #-128]\",\n        \"sub x10, x10, x7\",\n        \"add x11, x11, #0x1 (1)\",\n        \"add x10, x10, x11\",\n        \"sub x20, x7, #0x80 (128)\",\n        \"add x5, x20, x5\",\n        \"ldp q17, q6, [x10]\",\n        \"ldp q18, q7, [x10, #32]\",\n        \"ldp q19, q8, [x10, #64]\",\n        \"ldp q20, q9, [x10, #96]\",\n        \"add x10, x10, #0x80 (128)\",\n        \"stp q17, q6, [x11]\",\n        \"stp q18, q7, [x11, #32]\",\n        \"stp q19, q8, [x11, #64]\",\n        \"stp q20, q9, [x11, #96]\",\n        \"add x11, x11, #0x80 (128)\",\n        \"eor x27, x5, x11\",\n        \"subs x26, x5, x11\",\n        \"stp q4, q5, [x28, #304]\",\n        \"stp q2, q3, [x28, #272]\",\n        \"stp q8, q9, [x28, #240]\",\n        \"stp q6, q7, [x28, #208]\"\n      ]\n    },\n    \"bytemark strsift\": {\n      \"x86InstructionCount\": 15,\n      \"ExpectedInstructionCount\": 19,\n      \"x86Insts\": [\n        \"mov    rsi,rdx\",\n        \"and    rsi,0xfffffffffffffffc\",\n        \"movq   xmm0,rcx\",\n        \"pshufd xmm0,xmm0,0x44\",\n        \"mov    rdi,qword [rsp+0x20]\",\n        \"lea    rdi,[rdi+r13*8]\",\n        \"xor    r8d,r8d\",\n        \"movdqu xmm1,oword [rdi+r8*8-0x10]\",\n        \"movdqu xmm2,oword [rdi+r8*8]\",\n        \"paddq  xmm1,xmm0\",\n        \"paddq  xmm2,xmm0\",\n        \"movdqu oword [rdi+r8*8-0x10],xmm1\",\n        \"movdqu oword [rdi+r8*8],xmm2\",\n        \"add    r8,0x4\",\n        \"cmp    rsi,r8\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and x10, x5, #0xfffffffffffffffc\",\n        \"fmov d16, x7\",\n        \"dup v16.2d, v16.d[0]\",\n        \"ldr x11, [x8, #32]\",\n        \"add x11, x11, x17, lsl #3\",\n        \"mov w12, #0x0\",\n        \"add x20, x11, x12, lsl #3\",\n        \"ldur q17, [x20, #-16]\",\n        \"add x20, x11, x12, lsl #3\",\n        \"ldr q18, [x20]\",\n        \"add v17.2d, v17.2d, v16.2d\",\n        \"add v18.2d, v18.2d, v16.2d\",\n        \"add x20, x11, x12, lsl #3\",\n        \"stur q17, [x20, #-16]\",\n        \"add x20, x11, x12, lsl #3\",\n        \"str q18, [x20]\",\n        \"add x12, x12, #0x4 (4)\",\n        \"eor x27, x10, x12\",\n        \"subs x26, x10, x12\"\n      ]\n    },\n    \"bytemark idea 1\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 11,\n      \"x86Insts\": [\n        \"movzx  eax,ax\",\n        \"imul   r8d,eax\",\n        \"mov    eax,r8d\",\n        \"shr    eax,0x10\",\n        \"movzx  r9d,r8w\",\n        \"sub    r8d,eax\",\n        \"cmp    r9d,eax\",\n        \"adc    r8d,0x0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxth w4, w4\",\n        \"mul w12, w12, w4\",\n        \"lsr w4, w12, #16\",\n        \"uxth w13, w12\",\n        \"sub w12, w12, w4\",\n        \"cmp w13, w4\",\n        \"cset w0, lo\",\n        \"adds w26, w12, w0\",\n        \"cfinv\",\n        \"mov x27, x12\",\n        \"mov x12, x26\"\n      ]\n    },\n    \"bytemark idea 2\": {\n      \"x86InstructionCount\": 12,\n      \"ExpectedInstructionCount\": 15,\n      \"x86Insts\": [\n        \"movzx  eax,ax\",\n        \"imul   r10d,eax\",\n        \"mov    eax,r10d\",\n        \"shr    eax,0x10\",\n        \"movzx  esi,r10w\",\n        \"sub    r10d,eax\",\n        \"cmp    esi,eax\",\n        \"adc    r10d,0x0\",\n        \"mov    eax,r10d\",\n        \"mov    esi,r9d\",\n        \"xor    si,di\",\n        \"movzx  r10d,word [rsp+r8*1+0x158]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxth w4, w4\",\n        \"mul w14, w14, w4\",\n        \"lsr w4, w14, #16\",\n        \"uxth w10, w14\",\n        \"sub w14, w14, w4\",\n        \"cmp w10, w4\",\n        \"cinc w14, w14, lo\",\n        \"mov w4, w14\",\n        \"mov w10, w13\",\n        \"eor w26, w10, w11\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x10, x26, #0, #16\",\n        \"add x20, x8, x12\",\n        \"ldrh w14, [x20, #344]\",\n        \"cfinv\"\n      ]\n    },\n    \"bytemark idea 3\": {\n      \"x86InstructionCount\": 11,\n      \"ExpectedInstructionCount\": 13,\n      \"x86Insts\": [\n        \"movzx  eax,si\",\n        \"imul   r8d,eax\",\n        \"mov    eax,r8d\",\n        \"shr    eax,0x10\",\n        \"movzx  esi,r8w\",\n        \"sub    r8d,eax\",\n        \"cmp    esi,eax\",\n        \"adc    r8d,0x0\",\n        \"mov    esi,r8d\",\n        \"movzx  r8d,word [rsp+rdi*1+0x66]\",\n        \"test   dx,dx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxth w4, w10\",\n        \"mul w12, w12, w4\",\n        \"lsr w4, w12, #16\",\n        \"uxth w10, w12\",\n        \"sub w12, w12, w4\",\n        \"cmp w10, w4\",\n        \"cinc w12, w12, lo\",\n        \"mov w10, w12\",\n        \"add x20, x8, x11\",\n        \"ldrh w12, [x20, #102]\",\n        \"cmn wzr, w5, lsl #16\",\n        \"cfinv\",\n        \"mov x26, x5\"\n      ]\n    },\n    \"Factorio drawSprite+0x890\": {\n      \"x86InstructionCount\": 3,\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"first load should be rip relative\",\n      \"x86Insts\": [\n        \"movss  xmm9,dword [rbp]\",\n        \"and    r9d,0x800000\",\n        \"movss  dword [rbp-0x58],xmm9\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s25, [x9]\",\n        \"ands w26, w13, #0x800000\",\n        \"mov x13, x26\",\n        \"stur s25, [x9, #-88]\",\n        \"cfinv\"\n      ]\n    },\n    \"Factorio drawSprite+0xf2\": {\n      \"x86InstructionCount\": 9,\n      \"ExpectedInstructionCount\": 11,\n      \"x86Insts\": [\n        \"movss  xmm8,dword [rbp-0x58]\",\n        \"mov    byte [rbp-0x49],r13b\",\n        \"mov    byte [rbp-0x4a],r14b\",\n        \"mov    rdx,qword [rdi+0x8]\",\n        \"mov    qword [rbp-0x38],rbx\",\n        \"mov    byte [rbp-0x4b],al\",\n        \"mov    qword [rbp-0x40],r11\",\n        \"movss  dword [rbp-0x48],xmm8\",\n        \"cmp    rdx,qword [rdi]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldur s24, [x9, #-88]\",\n        \"sturb w17, [x9, #-73]\",\n        \"sturb w19, [x9, #-74]\",\n        \"ldr x5, [x11, #8]\",\n        \"stur x6, [x9, #-56]\",\n        \"sturb w4, [x9, #-75]\",\n        \"stur x15, [x9, #-64]\",\n        \"stur s24, [x9, #-72]\",\n        \"ldr x20, [x11]\",\n        \"eor x27, x5, x20\",\n        \"subs x26, x5, x20\"\n      ]\n    },\n    \"Factorio drawSprite+0x520\": {\n      \"x86InstructionCount\": 4,\n      \"ExpectedInstructionCount\": 8,\n      \"x86Insts\": [\n        \"sub    ecx,0x9\",\n        \"xor    r11d,r11d\",\n        \"cmp    cl,0x1\",\n        \"cmovbe r11,rsi\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub w7, w7, #0x9 (9)\",\n        \"mov w15, #0x0\",\n        \"mov w20, #0x1\",\n        \"lsl w0, w7, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w7, #0x1 (1)\",\n        \"mov x27, x7\",\n        \"csel x15, x10, x15, ls\"\n      ]\n    },\n    \"pcmpistri xmm0, xmm1, 0_0_00_11_01b\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"A Hat In Time spends at least 5% CPU time in this instruction\",\n        \"Comes from vcruntime140.dll wcsstr\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v1.16b, v17.16b\",\n        \"mov w0, #0xd\",\n        \"ldr x1, [x28, #2336]\",\n        \"ldr x3, [x28, #2344]\",\n        \"blr x1\",\n        \"ldr x30, [sp], #16\",\n        \"mov w20, w0\",\n        \"mov w27, #0x0\",\n        \"uxth w21, w20\",\n        \"mov w22, #0x8\",\n        \"rbit w0, w21\",\n        \"clz w23, w0\",\n        \"cmp x21, #0x0 (0)\",\n        \"csel x7, x22, x23, eq\",\n        \"mov w26, #0x1\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/HotBlocks_32Bit.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"Sonic Mania movie player\": {\n      \"x86InstructionCount\": 10,\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"Used to be hottest block in Sonic Mania\",\n      \"x86Insts\": [\n        \"movzx   edx, byte [esi+ecx]\",\n        \"movzx   ecx, byte [esi+edi]\",\n        \"or      edx, 0xffff0000\",\n        \"shl     edx, 0x8\",\n        \"inc     esi\",\n        \"or      edx, ecx\",\n        \"mov     ecx, dword [ebp+0xc]\",\n        \"or      dword [eax], edx\",\n        \"add     eax, 0x4\",\n        \"cmp     esi, ebx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add w20, w10, w7\",\n        \"ldrb w5, [x20]\",\n        \"add w20, w10, w11\",\n        \"ldrb w7, [x20]\",\n        \"orr w5, w5, #0xffff0000\",\n        \"lsl w5, w5, #8\",\n        \"add w10, w10, #0x1 (1)\",\n        \"orr w5, w5, w7\",\n        \"ldr w7, [x9, #12]\",\n        \"ldr w20, [x4]\",\n        \"orr w20, w20, w5\",\n        \"str w20, [x4]\",\n        \"add w4, w4, #0x4 (4)\",\n        \"eor x27, x10, x6\",\n        \"subs w26, w10, w6\"\n      ]\n    },\n    \"wine mscrt.dll memmove\": {\n      \"x86InstructionCount\": 12,\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"Hot in Sonic Mania\",\n      \"x86Insts\": [\n        \"movdqu  xmm0, [esi]\",\n        \"movdqu  xmm1, [esi+0x10]\",\n        \"movdqu  xmm2, [esi+0x20]\",\n        \"movdqu  xmm3, [esi+0x30]\",\n        \"movdqa  [edi], xmm0\",\n        \"movdqa  [edi+0x10], xmm1\",\n        \"movdqa  [edi+0x20], xmm2\",\n        \"movdqa  [edi+0x30], xmm3\",\n        \"add     esi, 0x40\",\n        \"add     edi, 0x40\",\n        \"sub     ecx, 0x40\",\n        \"cmp     ecx, 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x10]\",\n        \"ldr q17, [x10, #16]\",\n        \"ldr q18, [x10, #32]\",\n        \"ldr q19, [x10, #48]\",\n        \"str q16, [x11]\",\n        \"str q17, [x11, #16]\",\n        \"str q18, [x11, #32]\",\n        \"str q19, [x11, #48]\",\n        \"add w10, w10, #0x40 (64)\",\n        \"add w11, w11, #0x40 (64)\",\n        \"sub w7, w7, #0x40 (64)\",\n        \"subs w26, w7, #0x40 (64)\",\n        \"mov x27, x7\"\n      ]\n    },\n    \"dxvk hotblock from MGRR\": {\n      \"x86InstructionCount\": 14,\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"Hottest block in Metal Gear Rising: Revengeance render thread\"\n      ],\n      \"x86Insts\": [\n        \"mov     edx, dword [eax+0xc]\",\n        \"mov     eax, dword [eax+0x8]\",\n        \"mov     dword [ebp-0x34], esi\",\n        \"mov     ecx, eax\",\n        \"mov     ebx, edx\",\n        \"mov     esi, dword [ebp-0x24]\",\n        \"add     ecx, 0xffffffff\",\n        \"adc     ebx, 0xffffffff\",\n        \"mov     dword [ebp-0x28], ecx\",\n        \"mov     dword [ebp-0x2c], ebx\",\n        \"mov     ebx, ecx\",\n        \"mov     dword [ebp-0x30], ecx\",\n        \"mov     ecx, dword [ebp-0x2c]\",\n        \"lock cmpxchg8b qword [esi+0x8]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w5, [x4, #12]\",\n        \"ldr w4, [x4, #8]\",\n        \"stur w10, [x9, #-52]\",\n        \"mov x7, x4\",\n        \"mov x6, x5\",\n        \"ldur w10, [x9, #-36]\",\n        \"mov w20, #0xffffffff\",\n        \"subs w7, w7, #0x1 (1)\",\n        \"mvn w27, w6\",\n        \"adcs w26, w6, w20\",\n        \"mov x6, x26\",\n        \"stur w7, [x9, #-40]\",\n        \"stur w6, [x9, #-44]\",\n        \"mov x6, x7\",\n        \"stur w7, [x9, #-48]\",\n        \"ldur w7, [x9, #-44]\",\n        \"add w20, w10, #0x8 (8)\",\n        \"mov x22, x4\",\n        \"mov x23, x5\",\n        \"caspal w22, w23, w6, w7, [x20]\",\n        \"mrs x0, nzcv\",\n        \"cmp w22, w4\",\n        \"ccmp w23, w5, #nzcv, eq\",\n        \"rmif x0, #0, #NzCV\",\n        \"csel x4, x22, x4, ne\",\n        \"csel x5, x23, x5, ne\",\n        \"cfinv\"\n      ]\n    },\n    \"Psychonauts matrix swizzle\": {\n      \"x86InstructionCount\": 103,\n      \"ExpectedInstructionCount\": 113,\n      \"Comment\": [\n        \"Hottest block in Windows Psychonauts\",\n        \"Doing a 4x4 32-bit float matrix swizzle\",\n        \"Only data movement, no manipulation of the floats\"\n      ],\n      \"x86Insts\": [\n        \"push    ebp\",\n        \"mov     ebp, esp\",\n        \"sub     esp, 0x44\",\n        \"mov     [ebp-0x44], ecx\",\n        \"mov     eax, dword [ebp-0x44]\",\n        \"fld     dword [eax]\",\n        \"fstp    dword [ebp-0x40]\",\n        \"mov     ecx, dword [ebp-0x44]\",\n        \"fld     dword [ecx+0x10]\",\n        \"fstp    dword [ebp-0x3c]\",\n        \"mov     edx, dword [ebp-0x44]\",\n        \"fld     dword [edx+0x20]\",\n        \"fstp    dword [ebp-0x38]\",\n        \"mov     eax, dword [ebp-0x44]\",\n        \"fld     dword [eax+0x30]\",\n        \"fstp    dword [ebp-0x34]\",\n        \"mov     ecx, dword [ebp-0x44]\",\n        \"fld     dword [ecx+0x4]\",\n        \"fstp    dword [ebp-0x30]\",\n        \"mov     edx, dword [ebp-0x44]\",\n        \"fld     dword [edx+0x14]\",\n        \"fstp    dword [ebp-0x2c]\",\n        \"mov     eax, dword [ebp-0x44]\",\n        \"fld     dword [eax+0x24]\",\n        \"fstp    dword [ebp-0x28]\",\n        \"mov     ecx, dword [ebp-0x44]\",\n        \"fld     dword [ecx+0x34]\",\n        \"fstp    dword [ebp-0x24]\",\n        \"mov     edx, dword [ebp-0x44]\",\n        \"fld     dword [edx+0x8]\",\n        \"fstp    dword [ebp-0x20]\",\n        \"mov     eax, dword [ebp-0x44]\",\n        \"fld     dword [eax+0x18]\",\n        \"fstp    dword [ebp-0x1c]\",\n        \"mov     ecx, dword [ebp-0x44]\",\n        \"fld     dword [ecx+0x28]\",\n        \"fstp    dword [ebp-0x18]\",\n        \"mov     edx, dword [ebp-0x44]\",\n        \"fld     dword [edx+0x38]\",\n        \"fstp    dword [ebp-0x14]\",\n        \"mov     eax, dword [ebp-0x44]\",\n        \"fld     dword [eax+0xc]\",\n        \"fstp    dword [ebp-0x10]\",\n        \"mov     ecx, dword [ebp-0x44]\",\n        \"fld     dword [ecx+0x1c]\",\n        \"fstp    dword [ebp-0xc]\",\n        \"mov     edx, dword [ebp-0x44]\",\n        \"fld     dword [edx+0x2c]\",\n        \"fstp    dword [ebp-0x8]\",\n        \"mov     eax, dword [ebp-0x44]\",\n        \"fld     dword [eax+0x3c]\",\n        \"fstp    dword [ebp-0x4]\",\n        \"mov     ecx, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0x40]\",\n        \"fstp    dword [ecx]\",\n        \"mov     edx, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0x3c]\",\n        \"fstp    dword [edx+0x4]\",\n        \"mov     eax, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0x38]\",\n        \"fstp    dword [eax+0x8]\",\n        \"mov     ecx, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0x34]\",\n        \"fstp    dword [ecx+0xc]\",\n        \"mov     edx, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0x30]\",\n        \"fstp    dword [edx+0x10]\",\n        \"mov     eax, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0x2c]\",\n        \"fstp    dword [eax+0x14]\",\n        \"mov     ecx, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0x28]\",\n        \"fstp    dword [ecx+0x18]\",\n        \"mov     edx, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0x24]\",\n        \"fstp    dword [edx+0x1c]\",\n        \"mov     eax, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0x20]\",\n        \"fstp    dword [eax+0x20]\",\n        \"mov     ecx, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0x1c]\",\n        \"fstp    dword [ecx+0x24]\",\n        \"mov     edx, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0x18]\",\n        \"fstp    dword [edx+0x28]\",\n        \"mov     eax, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0x14]\",\n        \"fstp    dword [eax+0x2c]\",\n        \"mov     ecx, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0x10]\",\n        \"fstp    dword [ecx+0x30]\",\n        \"mov     edx, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0xc]\",\n        \"fstp    dword [edx+0x34]\",\n        \"mov     eax, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0x8]\",\n        \"fstp    dword [eax+0x38]\",\n        \"mov     ecx, dword [ebp+0x8]\",\n        \"fld     dword [ebp-0x4]\",\n        \"fstp    dword [ecx+0x3c]\",\n        \"mov     eax, dword [ebp+0x8]\",\n        \"mov     esp, ebp\",\n        \"pop     ebp\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str w9, [x8, #-4]!\",\n        \"mov x9, x8\",\n        \"subs w26, w8, #0x44 (68)\",\n        \"mov x27, x8\",\n        \"mov x8, x26\",\n        \"stur w7, [x9, #-68]\",\n        \"ldur w4, [x9, #-68]\",\n        \"ldr s2, [x4]\",\n        \"stur s2, [x9, #-64]\",\n        \"ldur w7, [x9, #-68]\",\n        \"ldr s2, [x7, #16]\",\n        \"stur s2, [x9, #-60]\",\n        \"ldur w5, [x9, #-68]\",\n        \"ldr s2, [x5, #32]\",\n        \"stur s2, [x9, #-56]\",\n        \"ldur w4, [x9, #-68]\",\n        \"ldr s2, [x4, #48]\",\n        \"stur s2, [x9, #-52]\",\n        \"ldur w7, [x9, #-68]\",\n        \"ldr s2, [x7, #4]\",\n        \"stur s2, [x9, #-48]\",\n        \"ldur w5, [x9, #-68]\",\n        \"ldr s2, [x5, #20]\",\n        \"stur s2, [x9, #-44]\",\n        \"ldur w4, [x9, #-68]\",\n        \"ldr s2, [x4, #36]\",\n        \"stur s2, [x9, #-40]\",\n        \"ldur w7, [x9, #-68]\",\n        \"ldr s2, [x7, #52]\",\n        \"stur s2, [x9, #-36]\",\n        \"ldur w5, [x9, #-68]\",\n        \"ldr s2, [x5, #8]\",\n        \"stur s2, [x9, #-32]\",\n        \"ldur w4, [x9, #-68]\",\n        \"ldr s2, [x4, #24]\",\n        \"stur s2, [x9, #-28]\",\n        \"ldur w7, [x9, #-68]\",\n        \"ldr s2, [x7, #40]\",\n        \"stur s2, [x9, #-24]\",\n        \"ldur w5, [x9, #-68]\",\n        \"ldr s2, [x5, #56]\",\n        \"stur s2, [x9, #-20]\",\n        \"ldur w4, [x9, #-68]\",\n        \"ldr s2, [x4, #12]\",\n        \"stur s2, [x9, #-16]\",\n        \"ldur w7, [x9, #-68]\",\n        \"ldr s2, [x7, #28]\",\n        \"stur s2, [x9, #-12]\",\n        \"ldur w5, [x9, #-68]\",\n        \"ldr s2, [x5, #44]\",\n        \"stur s2, [x9, #-8]\",\n        \"ldur w4, [x9, #-68]\",\n        \"ldr s2, [x4, #60]\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w7, [x9, #8]\",\n        \"ldur s2, [x9, #-64]\",\n        \"str s2, [x7]\",\n        \"ldr w5, [x9, #8]\",\n        \"ldur s2, [x9, #-60]\",\n        \"str s2, [x5, #4]\",\n        \"ldr w4, [x9, #8]\",\n        \"ldur s2, [x9, #-56]\",\n        \"str s2, [x4, #8]\",\n        \"ldr w7, [x9, #8]\",\n        \"ldur s2, [x9, #-52]\",\n        \"str s2, [x7, #12]\",\n        \"ldr w5, [x9, #8]\",\n        \"ldur s2, [x9, #-48]\",\n        \"str s2, [x5, #16]\",\n        \"ldr w4, [x9, #8]\",\n        \"ldur s2, [x9, #-44]\",\n        \"str s2, [x4, #20]\",\n        \"ldr w7, [x9, #8]\",\n        \"ldur s2, [x9, #-40]\",\n        \"str s2, [x7, #24]\",\n        \"ldr w5, [x9, #8]\",\n        \"ldur s2, [x9, #-36]\",\n        \"str s2, [x5, #28]\",\n        \"ldr w4, [x9, #8]\",\n        \"ldur s2, [x9, #-32]\",\n        \"str s2, [x4, #32]\",\n        \"ldr w7, [x9, #8]\",\n        \"ldur s2, [x9, #-28]\",\n        \"str s2, [x7, #36]\",\n        \"ldr w5, [x9, #8]\",\n        \"ldur s2, [x9, #-24]\",\n        \"str s2, [x5, #40]\",\n        \"ldr w4, [x9, #8]\",\n        \"ldur s2, [x9, #-20]\",\n        \"str s2, [x4, #44]\",\n        \"ldr w7, [x9, #8]\",\n        \"ldur s2, [x9, #-16]\",\n        \"str s2, [x7, #48]\",\n        \"ldr w5, [x9, #8]\",\n        \"ldur s2, [x9, #-12]\",\n        \"str s2, [x5, #52]\",\n        \"ldr w4, [x9, #8]\",\n        \"ldur s2, [x9, #-8]\",\n        \"str s2, [x4, #56]\",\n        \"ldr w7, [x9, #8]\",\n        \"ldur s2, [x9, #-4]\",\n        \"str s2, [x7, #60]\",\n        \"ldr w4, [x9, #8]\",\n        \"mov x8, x9\",\n        \"ldr w9, [x8], #4\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/HotBlocks_AFP.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"AFP\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\"\n    ]\n  },\n  \"Instructions\": {\n    \"FMOD scalar loop\": {\n      \"x86InstructionCount\": 38,\n      \"ExpectedInstructionCount\": 48,\n      \"x86Insts\": [\n        \"mov     esi, ecx\",\n        \"mov     rdx, rbp\",\n        \"mov     rax, rbx\",\n        \"movss   xmm2, dword [rdx]\",\n        \"add     rax, 0x20\",\n        \"mulss   xmm2, xmm0\",\n        \"add     rdx, 0x20\",\n        \"addss   xmm2, dword [rax-0x20]\",\n        \"movss   dword [rax-0x20], xmm2\",\n        \"movss   xmm2, dword [rdx-0x1c]\",\n        \"mulss   xmm2, xmm1\",\n        \"addss   xmm2, dword [rax-0x1c]\",\n        \"movss   dword [rax-0x1c], xmm2\",\n        \"movss   xmm2, dword [rdx-0x18]\",\n        \"mulss   xmm2, xmm0\",\n        \"addss   xmm2, dword [rax-0x18]\",\n        \"movss   dword [rax-0x18], xmm2\",\n        \"movss   xmm2, dword [rdx-0x14]\",\n        \"mulss   xmm2, xmm1\",\n        \"addss   xmm2, dword [rax-0x14]\",\n        \"movss   dword [rax-0x14], xmm2\",\n        \"movss   xmm2, dword [rdx-0x10]\",\n        \"mulss   xmm2, xmm0\",\n        \"addss   xmm2, dword [rax-0x10]\",\n        \"movss   dword [rax-0x10], xmm2\",\n        \"movss   xmm2, dword [rdx-0xc]\",\n        \"mulss   xmm2, xmm1\",\n        \"addss   xmm2, dword [rax-0xc]\",\n        \"movss   dword [rax-0xc], xmm2\",\n        \"movss   xmm2, dword [rdx-0x8]\",\n        \"mulss   xmm2, xmm0\",\n        \"addss   xmm2, dword [rax-0x8]\",\n        \"movss   dword [rax-0x8], xmm2\",\n        \"movss   xmm2, dword [rdx-0x4]\",\n        \"mulss   xmm2, xmm1\",\n        \"addss   xmm2, dword [rax-0x4]\",\n        \"movss   dword [rax-0x4], xmm2\",\n        \"sub     esi, 0x1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w10, w7\",\n        \"mov x5, x9\",\n        \"mov x4, x6\",\n        \"ldr s18, [x5]\",\n        \"add x4, x4, #0x20 (32)\",\n        \"fmul s18, s18, s16\",\n        \"add x5, x5, #0x20 (32)\",\n        \"ldur s2, [x4, #-32]\",\n        \"fadd s18, s18, s2\",\n        \"stur s18, [x4, #-32]\",\n        \"ldur s18, [x5, #-28]\",\n        \"fmul s18, s18, s17\",\n        \"ldur s2, [x4, #-28]\",\n        \"fadd s18, s18, s2\",\n        \"stur s18, [x4, #-28]\",\n        \"ldur s18, [x5, #-24]\",\n        \"fmul s18, s18, s16\",\n        \"ldur s2, [x4, #-24]\",\n        \"fadd s18, s18, s2\",\n        \"stur s18, [x4, #-24]\",\n        \"ldur s18, [x5, #-20]\",\n        \"fmul s18, s18, s17\",\n        \"ldur s2, [x4, #-20]\",\n        \"fadd s18, s18, s2\",\n        \"stur s18, [x4, #-20]\",\n        \"ldur s18, [x5, #-16]\",\n        \"fmul s18, s18, s16\",\n        \"ldur s2, [x4, #-16]\",\n        \"fadd s18, s18, s2\",\n        \"stur s18, [x4, #-16]\",\n        \"ldur s18, [x5, #-12]\",\n        \"fmul s18, s18, s17\",\n        \"ldur s2, [x4, #-12]\",\n        \"fadd s18, s18, s2\",\n        \"stur s18, [x4, #-12]\",\n        \"ldur s18, [x5, #-8]\",\n        \"fmul s18, s18, s16\",\n        \"ldur s2, [x4, #-8]\",\n        \"fadd s18, s18, s2\",\n        \"stur s18, [x4, #-8]\",\n        \"ldur s18, [x5, #-4]\",\n        \"fmul s18, s18, s17\",\n        \"ldur s2, [x4, #-4]\",\n        \"fadd s18, s18, s2\",\n        \"stur s18, [x4, #-4]\",\n        \"subs w26, w10, #0x1 (1)\",\n        \"mov x27, x10\",\n        \"mov x10, x26\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/HotBlocks_TSO_32Bit.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [\n      \"TSO\",\n      \"LRCPC\",\n      \"LRCPC2\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"The Sims 1 hot block\": {\n      \"x86InstructionCount\": 47,\n      \"ExpectedInstructionCount\": 97,\n      \"Comment\": [\n        \"Hottest in-game block from The Sims 1, Legacy Collection\",\n        \"Consumed 6.13% of a CPU core on Oryon-1\",\n        \"Some interesting problems in this block:\",\n        \"  - LRCPC2 small immediate loadstores aren't getting used\",\n        \"  - Memory stores of zero aren't using wzr register\",\n        \"  - Vector loadstores are using large negative numbers which Arm64 can't optimize\",\n        \"    - Would need to generate a temporary and convert negative offsets to positive (Or close enough for simm9)\",\n        \"  - LRCPC3 isn't used for vector loadstores at all\",\n        \"    - Where the excessive dmb comes from\",\n        \"    - No hardware ships with LRCPC3 yet anyway\"\n      ],\n      \"x86Insts\": [\n        \"push    ebp\",\n        \"mov     ebp, esp\",\n        \"sub     esp, 0x1c4\",\n        \"mov     eax, dword [0xa37400]\",\n        \"xor     eax, ebp\",\n        \"mov     dword [ebp-0x4], eax\",\n        \"mov     edx, dword [ebp+0x8]\",\n        \"push    ebx\",\n        \"push    esi\",\n        \"mov     esi, dword [ebp+0x18]\",\n        \"push    edi\",\n        \"mov     edi, ecx\",\n        \"mov     dword [ebp-0x184], edx\",\n        \"mov     dword [ebp-0x180], 0x0\",\n        \"lea     ecx, [ebp-0x16c]\",\n        \"add     esi, 0x28\",\n        \"mov     edx, 0x6\",\n        \"mov     eax, dword [edi+0x3190]\",\n        \"mov     dword [ebp-0x188], eax\",\n        \"mov     eax, dword [ebp+0xc]\",\n        \"mov     dword [ebp-0x178], eax\",\n        \"mov     eax, dword [ebp+0x10]\",\n        \"mov     dword [ebp-0x170], eax\",\n        \"movzx   eax, byte [ebp+0x14]\",\n        \"mov     dword [ebp-0x17c], eax\",\n        \"movq    xmm0, qword [esi-0x28]\",\n        \"xorps   xmm1, xmm1\",\n        \"mov     eax, dword [esi-0x20]\",\n        \"lea     esi, [esi+0x4c]\",\n        \"movq    qword [ebp-0x1c4], xmm0\",\n        \"lea     ecx, [ecx+0x3c]\",\n        \"mov     dword [ebp-0x1bc], eax\",\n        \"movups  xmm0, [esi-0x58]\",\n        \"movups  [ebp-0x1a8], xmm1\",\n        \"movups  [ebp-0x1b8], xmm0\",\n        \"movups  xmm0, [ebp-0x1c4]\",\n        \"movups  [ebp-0x198], xmm1\",\n        \"psrldq  xmm1, 0xc\",\n        \"movups  [ecx-0x3c], xmm0\",\n        \"movups  xmm0, [ebp-0x1b4]\",\n        \"movups  [ecx-0x2c], xmm0\",\n        \"movups  xmm0, [ebp-0x1a4]\",\n        \"movups  [ecx-0x1c], xmm0\",\n        \"movq    xmm0, qword [ebp-0x194]\",\n        \"movq    qword [ecx-0xc], xmm0\",\n        \"movd    dword [ecx-0x4], xmm1\",\n        \"sub     edx, 0x1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str w9, [x8, #-4]!\",\n        \"mov x9, x8\",\n        \"sub w8, w8, #0x1c4 (452)\",\n        \"mov w20, #0x7400\",\n        \"movk w20, #0xa3, lsl #16\",\n        \"ldapur w4, [x20]\",\n        \"nop\",\n        \"eor w4, w4, w9\",\n        \"nop\",\n        \"stlur w4, [x9, #-4]\",\n        \"ldapur w5, [x9, #8]\",\n        \"nop\",\n        \"stp w10, w6, [x8, #-8]!\",\n        \"ldapur w10, [x9, #24]\",\n        \"nop\",\n        \"str w11, [x8, #-4]!\",\n        \"mov x11, x7\",\n        \"sub w20, w9, #0x184 (388)\",\n        \"nop\",\n        \"stlur w5, [x20]\",\n        \"sub w20, w9, #0x180 (384)\",\n        \"nop\",\n        \"stlur wzr, [x20]\",\n        \"sub w7, w9, #0x16c (364)\",\n        \"add w10, w10, #0x28 (40)\",\n        \"mov w5, #0x6\",\n        \"mov w20, #0x3190\",\n        \"add w20, w11, w20\",\n        \"ldapur w4, [x20]\",\n        \"nop\",\n        \"sub w20, w9, #0x188 (392)\",\n        \"nop\",\n        \"stlur w4, [x20]\",\n        \"ldapur w4, [x9, #12]\",\n        \"nop\",\n        \"sub w20, w9, #0x178 (376)\",\n        \"nop\",\n        \"stlur w4, [x20]\",\n        \"ldapur w4, [x9, #16]\",\n        \"nop\",\n        \"sub w20, w9, #0x170 (368)\",\n        \"nop\",\n        \"stlur w4, [x20]\",\n        \"ldapurb w4, [x9, #20]\",\n        \"sub w20, w9, #0x17c (380)\",\n        \"nop\",\n        \"stlur w4, [x20]\",\n        \"ldur d16, [x10, #-40]\",\n        \"dmb ishld\",\n        \"movi v17.2d, #0x0\",\n        \"ldapur w4, [x10, #-32]\",\n        \"nop\",\n        \"add w10, w10, #0x4c (76)\",\n        \"mov x20, #0xfffffffffffffe3c\",\n        \"dmb ish\",\n        \"str d16, [x9, x20, sxtx]\",\n        \"add w7, w7, #0x3c (60)\",\n        \"sub w21, w9, #0x1bc (444)\",\n        \"nop\",\n        \"stlur w4, [x21]\",\n        \"ldur q16, [x10, #-88]\",\n        \"dmb ishld\",\n        \"mov v2.16b, v17.16b\",\n        \"mov x21, #0xfffffffffffffe58\",\n        \"dmb ish\",\n        \"str q17, [x9, x21, sxtx]\",\n        \"mov x21, #0xfffffffffffffe48\",\n        \"dmb ish\",\n        \"str q16, [x9, x21, sxtx]\",\n        \"ldr q16, [x9, x20, sxtx]\",\n        \"dmb ishld\",\n        \"mov x20, #0xfffffffffffffe68\",\n        \"dmb ish\",\n        \"str q17, [x9, x20, sxtx]\",\n        \"ext v17.16b, v17.16b, v2.16b, #12\",\n        \"dmb ish\",\n        \"stur q16, [x7, #-60]\",\n        \"mov x20, #0xfffffffffffffe4c\",\n        \"ldr q16, [x9, x20, sxtx]\",\n        \"dmb ishld\",\n        \"dmb ish\",\n        \"stur q16, [x7, #-44]\",\n        \"mov x20, #0xfffffffffffffe5c\",\n        \"ldr q16, [x9, x20, sxtx]\",\n        \"dmb ishld\",\n        \"dmb ish\",\n        \"stur q16, [x7, #-28]\",\n        \"mov x20, #0xfffffffffffffe6c\",\n        \"ldr d16, [x9, x20, sxtx]\",\n        \"dmb ishld\",\n        \"dmb ish\",\n        \"stur d16, [x7, #-12]\",\n        \"sub w20, w7, #0x4 (4)\",\n        \"str s17, [x20]\",\n        \"subs w26, w5, #0x1 (1)\",\n        \"mov x27, x5\",\n        \"mov x5, x26\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/Primary.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"add bl, cl\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x00\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"lsl w0, w6, #24\",\n        \"cmn w0, w7, lsl #24\",\n        \"add w26, w6, w7\",\n        \"bfxil x6, x26, #0, #8\",\n        \"cfinv\"\n      ]\n    },\n    \"add bx, cx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x01\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"lsl w0, w6, #16\",\n        \"cmn w0, w7, lsl #16\",\n        \"add w26, w6, w7\",\n        \"bfxil x6, x26, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"add ebx, ecx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x01\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"adds w26, w6, w7\",\n        \"cfinv\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"add rbx, rcx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x01\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"adds x26, x6, x7\",\n        \"cfinv\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"db 0x02, 0xcb\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x02\",\n        \"add bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"lsl w0, w7, #24\",\n        \"cmn w0, w6, lsl #24\",\n        \"add w26, w7, w6\",\n        \"bfxil x7, x26, #0, #8\",\n        \"cfinv\"\n      ]\n    },\n    \"db 0x66, 0x03, 0xcb\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x03\",\n        \"add bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"lsl w0, w7, #16\",\n        \"cmn w0, w6, lsl #16\",\n        \"add w26, w7, w6\",\n        \"bfxil x7, x26, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"db 0x03, 0xcb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x03\",\n        \"add ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"adds w26, w7, w6\",\n        \"cfinv\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"db 0x48, 0x03, 0xcb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x03\",\n        \"add rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"adds x26, x7, x6\",\n        \"cfinv\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"add al, 1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x04\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w4, #0x1 (1)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"add ax, 1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x05\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w4, #0x1 (1)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #16\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"add eax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x05\",\n      \"ExpectedArm64ASM\": [\n        \"adds w26, w4, #0x1 (1)\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"add rax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x05\",\n      \"ExpectedArm64ASM\": [\n        \"adds x26, x4, #0x1 (1)\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"add al, -1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x04\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w4, #0xff (255)\",\n        \"bfxil x4, x26, #0, #8\",\n        \"cfinv\"\n      ]\n    },\n    \"add ax, -1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x05\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w4, w20\",\n        \"bfxil x4, x26, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"add eax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x05\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"subs w26, w4, #0x1 (1)\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"add rax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x05\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"subs x26, x4, #0x1 (1)\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or bl, bh\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w6, #8\",\n        \"orr w26, w6, w20\",\n        \"cmn wzr, w26, lsl #24\",\n        \"bfxil x6, x26, #0, #8\",\n        \"cfinv\"\n      ]\n    },\n    \"or bl, cl\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x08\",\n      \"ExpectedArm64ASM\": [\n        \"orr w26, w6, w7\",\n        \"cmn wzr, w26, lsl #24\",\n        \"bfxil x6, x26, #0, #8\",\n        \"cfinv\"\n      ]\n    },\n    \"or bx, cx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x09\",\n      \"ExpectedArm64ASM\": [\n        \"orr w26, w6, w7\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x6, x26, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"or ebx, ecx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x09\",\n      \"ExpectedArm64ASM\": [\n        \"orr w6, w6, w7\",\n        \"subs w26, w6, #0x0 (0)\"\n      ]\n    },\n    \"or rbx, rcx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x09\",\n      \"ExpectedArm64ASM\": [\n        \"orr x6, x6, x7\",\n        \"subs x26, x6, #0x0 (0)\"\n      ]\n    },\n    \"db 0x0A, 0xcb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x0A\",\n        \"or bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr w26, w7, w6\",\n        \"cmn wzr, w26, lsl #24\",\n        \"bfxil x7, x26, #0, #8\",\n        \"cfinv\"\n      ]\n    },\n    \"db 0x66, 0x0B, 0xcb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x0B\",\n        \"or bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr w26, w7, w6\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x7, x26, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"db 0x0B, 0xcb\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x0B\",\n        \"or ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr w7, w7, w6\",\n        \"subs w26, w7, #0x0 (0)\"\n      ]\n    },\n    \"db 0x48, 0x0B, 0xcb\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x0B\",\n        \"or rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr x7, x7, x6\",\n        \"subs x26, x7, #0x0 (0)\"\n      ]\n    },\n    \"or al, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0C\",\n      \"ExpectedArm64ASM\": [\n        \"orr x26, x4, #0x1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or ax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0D\",\n      \"ExpectedArm64ASM\": [\n        \"orr x26, x4, #0x1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or eax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0D\",\n      \"ExpectedArm64ASM\": [\n        \"orr w4, w4, #0x1\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"or rax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0D\",\n      \"ExpectedArm64ASM\": [\n        \"orr x4, x4, #0x1\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"or al, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0C\",\n      \"ExpectedArm64ASM\": [\n        \"orr x26, x4, #0xff\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or ax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0D\",\n      \"ExpectedArm64ASM\": [\n        \"orr x26, x4, #0xffff\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or eax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x0D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"orr w4, w4, w20\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"or rax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x0D\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"orr x4, x4, x20\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"adc bl, cl\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"0x10\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"uxtb x20, w7\",\n        \"cinc w21, w20, lo\",\n        \"add w22, w6, w21\",\n        \"uxtb w26, w22\",\n        \"cmp w26, w21\",\n        \"cset x21, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x21, #63, #nzCv\",\n        \"eor w20, w6, w20\",\n        \"eor w21, w26, w6\",\n        \"bic w20, w21, w20\",\n        \"rmif x20, #7, #nzcV\",\n        \"bfxil x6, x26, #0, #8\"\n      ]\n    },\n    \"adc bx, cx\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"0x11\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"uxth x20, w7\",\n        \"cinc w21, w20, lo\",\n        \"add w22, w6, w21\",\n        \"uxth w26, w22\",\n        \"cmp w26, w21\",\n        \"cset x21, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x21, #63, #nzCv\",\n        \"eor w20, w6, w20\",\n        \"eor w21, w26, w6\",\n        \"bic w20, w21, w20\",\n        \"rmif x20, #15, #nzcV\",\n        \"bfxil x6, x26, #0, #16\"\n      ]\n    },\n    \"adc ebx, ecx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x11\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"cfinv\",\n        \"adcs w26, w6, w7\",\n        \"cfinv\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"adc rbx, rcx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x11\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"cfinv\",\n        \"adcs x26, x6, x7\",\n        \"cfinv\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"db 0x12, 0xcb\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0x12\",\n        \"adc bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"uxtb x20, w6\",\n        \"cinc w21, w20, lo\",\n        \"add w22, w7, w21\",\n        \"uxtb w26, w22\",\n        \"cmp w26, w21\",\n        \"cset x21, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x21, #63, #nzCv\",\n        \"eor w20, w7, w20\",\n        \"eor w21, w26, w7\",\n        \"bic w20, w21, w20\",\n        \"rmif x20, #7, #nzcV\",\n        \"bfxil x7, x26, #0, #8\"\n      ]\n    },\n    \"db 0x66, 0x13, 0xcb\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0x13\",\n        \"adc bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"uxth x20, w6\",\n        \"cinc w21, w20, lo\",\n        \"add w22, w7, w21\",\n        \"uxth w26, w22\",\n        \"cmp w26, w21\",\n        \"cset x21, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x21, #63, #nzCv\",\n        \"eor w20, w7, w20\",\n        \"eor w21, w26, w7\",\n        \"bic w20, w21, w20\",\n        \"rmif x20, #15, #nzcV\",\n        \"bfxil x7, x26, #0, #16\"\n      ]\n    },\n    \"db 0x13, 0xcb\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x13\",\n        \"adc ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"cfinv\",\n        \"adcs w26, w7, w6\",\n        \"cfinv\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"db 0x48, 0x13, 0xcb\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x13\",\n        \"adc rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"cfinv\",\n        \"adcs x26, x7, x6\",\n        \"cfinv\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"adc al, 1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"0x14\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w4, w20\",\n        \"uxtb w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w26, w4\",\n        \"rmif x20, #7, #nzcV\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"adc ax, 1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"0x15\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w4, w20\",\n        \"uxth w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w26, w4\",\n        \"rmif x20, #15, #nzcV\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #16\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"adc eax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x15\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cfinv\",\n        \"adcs w26, w4, w20\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc rax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x15\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cfinv\",\n        \"adcs x26, x4, x20\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc al, -1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x14\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w4, w20\",\n        \"uxtb w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w4, w26\",\n        \"rmif x20, #7, #nzcV\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"adc ax, -1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x15\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"mvn w27, w4\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w4, w20\",\n        \"uxth w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w4, w26\",\n        \"rmif x20, #15, #nzcV\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"adc eax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x15\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"mvn w27, w4\",\n        \"cfinv\",\n        \"adcs w26, w4, w20\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc rax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x15\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"mvn w27, w4\",\n        \"cfinv\",\n        \"adcs x26, x4, x20\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb bl, cl\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"0x18\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"uxtb w20, w6\",\n        \"uxtb x21, w7\",\n        \"cinc w22, w21, lo\",\n        \"sub w23, w20, w22\",\n        \"uxtb w26, w23\",\n        \"cmp w20, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x22, #63, #nzCv\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"and w20, w20, w21\",\n        \"rmif x20, #7, #nzcV\",\n        \"bfxil x6, x26, #0, #8\"\n      ]\n    },\n    \"sbb bx, cx\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"0x19\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"uxth w20, w6\",\n        \"uxth x21, w7\",\n        \"cinc w22, w21, lo\",\n        \"sub w23, w20, w22\",\n        \"uxth w26, w23\",\n        \"cmp w20, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x22, #63, #nzCv\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"and w20, w20, w21\",\n        \"rmif x20, #15, #nzcV\",\n        \"bfxil x6, x26, #0, #16\"\n      ]\n    },\n    \"sbb ebx, ecx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x19\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"sbcs w26, w6, w7\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"sbb rbx, rcx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x19\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"sbcs x26, x6, x7\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"db 0x1A, 0xcb\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0x1A\",\n        \"sbb bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"uxtb w20, w7\",\n        \"uxtb x21, w6\",\n        \"cinc w22, w21, lo\",\n        \"sub w23, w20, w22\",\n        \"uxtb w26, w23\",\n        \"cmp w20, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x22, #63, #nzCv\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"and w20, w20, w21\",\n        \"rmif x20, #7, #nzcV\",\n        \"bfxil x7, x26, #0, #8\"\n      ]\n    },\n    \"db 0x66, 0x1B, 0xcb\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0x1B\",\n        \"sbb bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"uxth w20, w7\",\n        \"uxth x21, w6\",\n        \"cinc w22, w21, lo\",\n        \"sub w23, w20, w22\",\n        \"uxth w26, w23\",\n        \"cmp w20, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x22, #63, #nzCv\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"and w20, w20, w21\",\n        \"rmif x20, #15, #nzcV\",\n        \"bfxil x7, x26, #0, #16\"\n      ]\n    },\n    \"db 0x1B, 0xcb\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x1B\",\n        \"sbb ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"sbcs w26, w7, w6\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"db 0x48, 0x1B, 0xcb\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x1B\",\n        \"sbb rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"sbcs x26, x7, x6\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"sbb al, 1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"0x1C\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"uxtb w21, w4\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxtb w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w21, w26\",\n        \"rmif x20, #7, #nzcV\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"sbb ax, 1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"0x1D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"uxth w21, w4\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxth w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w21, w26\",\n        \"rmif x20, #15, #nzcV\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #16\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"sbb eax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x1D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"sbcs w26, w4, w20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb rax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x1D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"sbcs x26, x4, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb al, -1\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"0x1C\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"uxtb w21, w4\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxtb w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w26, w21\",\n        \"rmif x20, #7, #nzcV\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"sbb ax, -1\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"0x1D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"mvn w27, w4\",\n        \"uxth w21, w4\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxth w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w26, w21\",\n        \"rmif x20, #15, #nzcV\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"sbb eax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x1D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"mvn w27, w4\",\n        \"sbcs w26, w4, w20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb rax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x1D\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"mvn w27, w4\",\n        \"sbcs x26, x4, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and bl, cl\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x20\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w6, w7\",\n        \"cmn wzr, w26, lsl #24\",\n        \"bfxil x6, x26, #0, #8\",\n        \"cfinv\"\n      ]\n    },\n    \"and bx, cx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x21\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w6, w7\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x6, x26, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"and ebx, ecx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x21\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w6, w7\",\n        \"cfinv\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"and rbx, rcx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x21\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x6, x7\",\n        \"cfinv\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"db 0x22, 0xcb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x22\",\n        \"and bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and w26, w7, w6\",\n        \"cmn wzr, w26, lsl #24\",\n        \"bfxil x7, x26, #0, #8\",\n        \"cfinv\"\n      ]\n    },\n    \"db 0x66, 0x23, 0xcb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x23\",\n        \"and bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and w26, w7, w6\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x7, x26, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"db 0x23, 0xcb\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x23\",\n        \"and ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w7, w6\",\n        \"cfinv\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"db 0x48, 0x23, 0xcb\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x23\",\n        \"and rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x7, x6\",\n        \"cfinv\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"and al, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x24\",\n      \"ExpectedArm64ASM\": [\n        \"and x26, x4, #0xffffffffffffff01\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and ax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x25\",\n      \"ExpectedArm64ASM\": [\n        \"and x26, x4, #0xffffffffffff0001\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and eax, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x25\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w4, #0x1\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and rax, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x25\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x4, #0x1\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and al, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x24\",\n      \"ExpectedArm64ASM\": [\n        \"cmn wzr, w4, lsl #24\",\n        \"cfinv\",\n        \"mov x26, x4\"\n      ]\n    },\n    \"and ax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x25\",\n      \"ExpectedArm64ASM\": [\n        \"cmn wzr, w4, lsl #16\",\n        \"cfinv\",\n        \"mov x26, x4\"\n      ]\n    },\n    \"and eax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x25\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"ands w26, w4, w20\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and rax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x25\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"ands x26, x4, x20\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub bl, cl\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x28\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"lsl w0, w6, #24\",\n        \"cmp w0, w7, lsl #24\",\n        \"sub w26, w6, w7\",\n        \"bfxil x6, x26, #0, #8\"\n      ]\n    },\n    \"sub bx, cx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x29\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"lsl w0, w6, #16\",\n        \"cmp w0, w7, lsl #16\",\n        \"sub w26, w6, w7\",\n        \"bfxil x6, x26, #0, #16\"\n      ]\n    },\n    \"sub ebx, ecx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x29\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"subs w26, w6, w7\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"sub rbx, rcx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x29\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"subs x26, x6, x7\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"db 0x2A, 0xcb\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x2A\",\n        \"sub bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"lsl w0, w7, #24\",\n        \"cmp w0, w6, lsl #24\",\n        \"sub w26, w7, w6\",\n        \"bfxil x7, x26, #0, #8\"\n      ]\n    },\n    \"db 0x66, 0x2B, 0xcb\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x2B\",\n        \"sub bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"lsl w0, w7, #16\",\n        \"cmp w0, w6, lsl #16\",\n        \"sub w26, w7, w6\",\n        \"bfxil x7, x26, #0, #16\"\n      ]\n    },\n    \"db 0x2B, 0xcb\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x2B\",\n        \"sub ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"subs w26, w7, w6\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"db 0x48, 0x2B, 0xcb\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x2B\",\n        \"sub rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"subs x26, x7, x6\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"sub al, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x2C\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0x1 (1)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"sub ax, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x2D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, #0x1 (1)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #16\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"sub eax, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x2D\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x1 (1)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub rax, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x2D\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x1 (1)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub al, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x2C\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0xff (255)\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"sub ax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x2D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"sub eax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x2D\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds w26, w4, #0x1 (1)\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub rax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x2D\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds x26, x4, #0x1 (1)\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor bl, cl\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x30\",\n      \"ExpectedArm64ASM\": [\n        \"eor w26, w6, w7\",\n        \"cmn wzr, w26, lsl #24\",\n        \"bfxil x6, x26, #0, #8\",\n        \"cfinv\"\n      ]\n    },\n    \"xor bx, cx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x31\",\n      \"ExpectedArm64ASM\": [\n        \"eor w26, w6, w7\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x6, x26, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"xor ebx, ecx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x31\",\n      \"ExpectedArm64ASM\": [\n        \"eor w6, w6, w7\",\n        \"subs w26, w6, #0x0 (0)\"\n      ]\n    },\n    \"xor rbx, rcx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x31\",\n      \"ExpectedArm64ASM\": [\n        \"eor x6, x6, x7\",\n        \"subs x26, x6, #0x0 (0)\"\n      ]\n    },\n    \"db 0x32, 0xcb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x32\",\n        \"xor bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w26, w7, w6\",\n        \"cmn wzr, w26, lsl #24\",\n        \"bfxil x7, x26, #0, #8\",\n        \"cfinv\"\n      ]\n    },\n    \"db 0x66, 0x33, 0xcb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x33\",\n        \"xor bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w26, w7, w6\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x7, x26, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"db 0x33, 0xcb\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x33\",\n        \"xor ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w7, w7, w6\",\n        \"subs w26, w7, #0x0 (0)\"\n      ]\n    },\n    \"db 0x48, 0x33, 0xcb\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x33\",\n        \"xor rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x7, x7, x6\",\n        \"subs x26, x7, #0x0 (0)\"\n      ]\n    },\n    \"xor al, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x34\",\n      \"ExpectedArm64ASM\": [\n        \"eor x26, x4, #0x1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor ax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x35\",\n      \"ExpectedArm64ASM\": [\n        \"eor x26, x4, #0x1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor eax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x35\",\n      \"ExpectedArm64ASM\": [\n        \"eor w4, w4, #0x1\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"xor rax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x35\",\n      \"ExpectedArm64ASM\": [\n        \"eor x4, x4, #0x1\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"cmp bl, cl\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x38\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"lsl w0, w6, #24\",\n        \"cmp w0, w7, lsl #24\",\n        \"sub w26, w6, w7\"\n      ]\n    },\n    \"xor al, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x34\",\n      \"ExpectedArm64ASM\": [\n        \"eor x26, x4, #0xff\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor ax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x35\",\n      \"ExpectedArm64ASM\": [\n        \"eor x26, x4, #0xffff\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor eax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x35\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w4, w4\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"xor rax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x35\",\n      \"ExpectedArm64ASM\": [\n        \"mvn x4, x4\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"cmp bx, cx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x39\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"lsl w0, w6, #16\",\n        \"cmp w0, w7, lsl #16\",\n        \"sub w26, w6, w7\"\n      ]\n    },\n    \"cmp ebx, ecx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x39\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"subs w26, w6, w7\"\n      ]\n    },\n    \"cmp rbx, rcx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x39\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"subs x26, x6, x7\"\n      ]\n    },\n    \"db 0x3A, 0xcb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x3A\",\n        \"cmp bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"lsl w0, w7, #24\",\n        \"cmp w0, w6, lsl #24\",\n        \"sub w26, w7, w6\"\n      ]\n    },\n    \"db 0x66, 0x3B, 0xcb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x3B\",\n        \"cmp bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"lsl w0, w7, #16\",\n        \"cmp w0, w6, lsl #16\",\n        \"sub w26, w7, w6\"\n      ]\n    },\n    \"db 0x3B, 0xcb\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x3B\",\n        \"cmp ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"subs w26, w7, w6\"\n      ]\n    },\n    \"db 0x48, 0x3B, 0xcb\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x3B\",\n        \"cmp rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"subs x26, x7, x6\"\n      ]\n    },\n    \"cmp al, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x3C\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0x1 (1)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"cmp ax, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x3D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, #0x1 (1)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"cmp eax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x3D\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x1 (1)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"cmp rax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x3D\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x1 (1)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"cmp al, -1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x3C\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0xff (255)\"\n      ]\n    },\n    \"cmp ax, -1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x3D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\"\n      ]\n    },\n    \"cmp eax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x3D\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds w26, w4, #0x1 (1)\"\n      ]\n    },\n    \"cmp rax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x3D\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds x26, x4, #0x1 (1)\"\n      ]\n    },\n    \"imul ax, bx, 257\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x69\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x101\",\n        \"sxth x21, w6\",\n        \"mul x20, x21, x20\",\n        \"sbfx x21, x20, #16, #16\",\n        \"bfxil x4, x20, #0, #16\",\n        \"sbfx x20, x20, #15, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul eax, ebx, 257\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x69\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x101\",\n        \"smull x21, w6, w20\",\n        \"asr x21, x21, #32\",\n        \"mul w4, w6, w20\",\n        \"sbfx x20, x4, #31, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul rax, rbx, 257\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x69\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x101\",\n        \"smulh x21, x6, x20\",\n        \"mul x4, x6, x20\",\n        \"asr x20, x4, #63\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul ax, bx, 3\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x6b\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3\",\n        \"sxth x21, w6\",\n        \"mul x20, x21, x20\",\n        \"sbfx x21, x20, #16, #16\",\n        \"bfxil x4, x20, #0, #16\",\n        \"sbfx x20, x20, #15, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul eax, ebx, 3\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x6b\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3\",\n        \"smull x21, w6, w20\",\n        \"asr x21, x21, #32\",\n        \"mul w4, w6, w20\",\n        \"sbfx x20, x4, #31, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul rax, rbx, 3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x6b\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3\",\n        \"smulh x21, x6, x20\",\n        \"mul x4, x6, x20\",\n        \"asr x20, x4, #63\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"test al, bl\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x84\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w4, w6\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\"\n      ]\n    },\n    \"test ax, bx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x84\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w4, w6\",\n        \"cmn wzr, w26, lsl #16\",\n        \"cfinv\"\n      ]\n    },\n    \"test eax, ebx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x84\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w4, w6\",\n        \"cfinv\"\n      ]\n    },\n    \"test rax, rbx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x84\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x4, x6\",\n        \"cfinv\"\n      ]\n    },\n    \"o16 pushf\": {\n      \"ExpectedInstructionCount\": 39,\n      \"Comment\": \"0x9c\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"eor x21, x27, x26\",\n        \"ubfx w21, w21, #4, #1\",\n        \"orr x20, x20, x21, lsl #4\",\n        \"ldrb w21, [x28, #1016]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1017]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrsb x21, [x28, #1018]\",\n        \"lsr x21, x21, #63\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"cset x21, vs\",\n        \"orr x20, x20, x21, lsl #11\",\n        \"ldrb w21, [x28, #1020]\",\n        \"orr x20, x20, x21, lsl #12\",\n        \"ldrb w21, [x28, #1022]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1024]\",\n        \"orr x20, x20, x21, lsl #16\",\n        \"ldrb w21, [x28, #1025]\",\n        \"orr x20, x20, x21, lsl #17\",\n        \"ldrb w21, [x28, #1026]\",\n        \"orr x20, x20, x21, lsl #18\",\n        \"ldrb w21, [x28, #1027]\",\n        \"orr x20, x20, x21, lsl #19\",\n        \"ldrb w21, [x28, #1028]\",\n        \"orr x20, x20, x21, lsl #20\",\n        \"ldrb w21, [x28, #1029]\",\n        \"orr x20, x20, x21, lsl #21\",\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w21, w0, w0, lsr #1\",\n        \"orr x21, x21, #0xfffffffffffffffe\",\n        \"orn x20, x20, x21, ror #62\",\n        \"mrs x21, nzcv\",\n        \"and x21, x21, #0xc0000000\",\n        \"orr x20, x20, x21, lsr #24\",\n        \"orr x20, x20, #0x2\",\n        \"strh w20, [x8, #-2]!\"\n      ]\n    },\n    \"pushfq\": {\n      \"ExpectedInstructionCount\": 39,\n      \"Comment\": \"0x9c\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"eor x21, x27, x26\",\n        \"ubfx w21, w21, #4, #1\",\n        \"orr x20, x20, x21, lsl #4\",\n        \"ldrb w21, [x28, #1016]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1017]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrsb x21, [x28, #1018]\",\n        \"lsr x21, x21, #63\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"cset x21, vs\",\n        \"orr x20, x20, x21, lsl #11\",\n        \"ldrb w21, [x28, #1020]\",\n        \"orr x20, x20, x21, lsl #12\",\n        \"ldrb w21, [x28, #1022]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1024]\",\n        \"orr x20, x20, x21, lsl #16\",\n        \"ldrb w21, [x28, #1025]\",\n        \"orr x20, x20, x21, lsl #17\",\n        \"ldrb w21, [x28, #1026]\",\n        \"orr x20, x20, x21, lsl #18\",\n        \"ldrb w21, [x28, #1027]\",\n        \"orr x20, x20, x21, lsl #19\",\n        \"ldrb w21, [x28, #1028]\",\n        \"orr x20, x20, x21, lsl #20\",\n        \"ldrb w21, [x28, #1029]\",\n        \"orr x20, x20, x21, lsl #21\",\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w21, w0, w0, lsr #1\",\n        \"orr x21, x21, #0xfffffffffffffffe\",\n        \"orn x20, x20, x21, ror #62\",\n        \"mrs x21, nzcv\",\n        \"and x21, x21, #0xc0000000\",\n        \"orr x20, x20, x21, lsr #24\",\n        \"orr x20, x20, #0x2\",\n        \"str x20, [x8, #-8]!\"\n      ]\n    },\n    \"popf\": {\n      \"ExpectedInstructionCount\": 40,\n      \"Comment\": \"0x9d\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x8], #8\",\n        \"mov w21, #0x202\",\n        \"orr x27, x20, x21\",\n        \"mvn w20, w27\",\n        \"rmif x20, #63, #nzCv\",\n        \"ubfx w26, w20, #2, #1\",\n        \"rmif x27, #4, #nZcv\",\n        \"rmif x27, #4, #Nzcv\",\n        \"ubfx w20, w27, #8, #1\",\n        \"ldrb w21, [x28, #1016]\",\n        \"and w21, w21, #0xfffffffe\",\n        \"mov w22, #0x1\",\n        \"mrs x23, nzcv\",\n        \"cmp x20, #0x0 (0)\",\n        \"csel x20, x21, x22, eq\",\n        \"strb w20, [x28, #1016]\",\n        \"ubfx w20, w27, #9, #1\",\n        \"strb w20, [x28, #1017]\",\n        \"ubfx w20, w27, #10, #1\",\n        \"sub x20, x22, x20, lsl #1\",\n        \"msr nzcv, x23\",\n        \"rmif x27, #11, #nzcV\",\n        \"ubfx w21, w27, #12, #1\",\n        \"strb w21, [x28, #1020]\",\n        \"ubfx w21, w27, #14, #1\",\n        \"strb w21, [x28, #1022]\",\n        \"ubfx w21, w27, #16, #1\",\n        \"strb w21, [x28, #1024]\",\n        \"ubfx w21, w27, #17, #1\",\n        \"strb w21, [x28, #1025]\",\n        \"ubfx w21, w27, #18, #1\",\n        \"strb w21, [x28, #1026]\",\n        \"ubfx w21, w27, #19, #1\",\n        \"strb w21, [x28, #1027]\",\n        \"ubfx w21, w27, #20, #1\",\n        \"strb w21, [x28, #1028]\",\n        \"ubfx w21, w27, #21, #1\",\n        \"strb w21, [x28, #1029]\",\n        \"mov w21, #0x10001\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"sahf\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x9e\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx w20, w4, #8, #8\",\n        \"mov w21, #0x28\",\n        \"bic x20, x20, x21\",\n        \"orr x27, x20, #0x2\",\n        \"mvn w20, w27\",\n        \"rmif x20, #63, #nzCv\",\n        \"ubfx w26, w20, #2, #1\",\n        \"rmif x27, #4, #nZcv\",\n        \"rmif x27, #4, #Nzcv\"\n      ]\n    },\n    \"lahf\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"0x9f\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"eor x21, x27, x26\",\n        \"ubfx w21, w21, #4, #1\",\n        \"orr x20, x20, x21, lsl #4\",\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w21, w0, w0, lsr #1\",\n        \"orr x21, x21, #0xfffffffffffffffe\",\n        \"orn x20, x20, x21, ror #62\",\n        \"mrs x21, nzcv\",\n        \"and x21, x21, #0xc0000000\",\n        \"orr x20, x20, x21, lsr #24\",\n        \"orr x20, x20, #0x2\",\n        \"bfi x4, x20, #8, #8\"\n      ]\n    },\n    \"cmpsb\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xa6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x11]\",\n        \"ldrb w21, [x10]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w21, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20\",\n        \"add x10, x10, x20\"\n      ]\n    },\n    \"cmpsw\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xa7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x11]\",\n        \"ldrh w21, [x10]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w21, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #1\",\n        \"add x10, x10, x20, lsl #1\"\n      ]\n    },\n    \"cmpsd\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xa7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x11]\",\n        \"ldr w21, [x10]\",\n        \"eor x27, x21, x20\",\n        \"subs w26, w21, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #2\",\n        \"add x10, x10, x20, lsl #2\"\n      ]\n    },\n    \"cmpsq\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xa7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x11]\",\n        \"ldr x21, [x10]\",\n        \"eor x27, x21, x20\",\n        \"subs x26, x21, x20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #3\",\n        \"add x10, x10, x20, lsl #3\"\n      ]\n    },\n    \"repz cmpsb\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": \"0xa6\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x64\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldrb w26, [x11]\",\n        \"ldrb w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x1 (1)\",\n        \"add x10, x10, #0x1 (1)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"ldrb w26, [x11]\",\n        \"ldrb w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x1 (1)\",\n        \"sub x10, x10, #0x1 (1)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"eor x20, x27, x26\",\n        \"lsl w0, w27, #24\",\n        \"cmp w0, w26, lsl #24\",\n        \"sub w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repz cmpsw\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x64\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldrh w26, [x11]\",\n        \"ldrh w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x2 (2)\",\n        \"add x10, x10, #0x2 (2)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"ldrh w26, [x11]\",\n        \"ldrh w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x2 (2)\",\n        \"sub x10, x10, #0x2 (2)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"eor x20, x27, x26\",\n        \"lsl w0, w27, #16\",\n        \"cmp w0, w26, lsl #16\",\n        \"sub w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repz cmpsd\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x5c\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldr w26, [x11]\",\n        \"ldr w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x4 (4)\",\n        \"add x10, x10, #0x4 (4)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"ldr w26, [x11]\",\n        \"ldr w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x4 (4)\",\n        \"sub x10, x10, #0x4 (4)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"eor x20, x27, x26\",\n        \"subs w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repz cmpsq\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x5c\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldr x26, [x11]\",\n        \"ldr x27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x8 (8)\",\n        \"add x10, x10, #0x8 (8)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"ldr x26, [x11]\",\n        \"ldr x27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x8 (8)\",\n        \"sub x10, x10, #0x8 (8)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"eor x20, x27, x26\",\n        \"subs x26, x27, x26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repnz cmpsb\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": \"0xa6\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x64\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldrb w26, [x11]\",\n        \"ldrb w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x1 (1)\",\n        \"add x10, x10, #0x1 (1)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"ldrb w26, [x11]\",\n        \"ldrb w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x1 (1)\",\n        \"sub x10, x10, #0x1 (1)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"eor x20, x27, x26\",\n        \"lsl w0, w27, #24\",\n        \"cmp w0, w26, lsl #24\",\n        \"sub w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repnz cmpsw\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x64\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldrh w26, [x11]\",\n        \"ldrh w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x2 (2)\",\n        \"add x10, x10, #0x2 (2)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"ldrh w26, [x11]\",\n        \"ldrh w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x2 (2)\",\n        \"sub x10, x10, #0x2 (2)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"eor x20, x27, x26\",\n        \"lsl w0, w27, #16\",\n        \"cmp w0, w26, lsl #16\",\n        \"sub w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repnz cmpsd\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x5c\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldr w26, [x11]\",\n        \"ldr w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x4 (4)\",\n        \"add x10, x10, #0x4 (4)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"ldr w26, [x11]\",\n        \"ldr w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x4 (4)\",\n        \"sub x10, x10, #0x4 (4)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"eor x20, x27, x26\",\n        \"subs w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repnz cmpsq\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x5c\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldr x26, [x11]\",\n        \"ldr x27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x8 (8)\",\n        \"add x10, x10, #0x8 (8)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"ldr x26, [x11]\",\n        \"ldr x27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x8 (8)\",\n        \"sub x10, x10, #0x8 (8)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"eor x20, x27, x26\",\n        \"subs x26, x27, x26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"test al, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xa8\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w4, #0x1\",\n        \"cmp w26, #0x0 (0)\"\n      ]\n    },\n    \"test ax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xa9\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w4, #0x1\",\n        \"cmp w26, #0x0 (0)\"\n      ]\n    },\n    \"test eax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xa9\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w4, #0x1\",\n        \"cfinv\"\n      ]\n    },\n    \"test rax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xa9\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x4, #0x1\",\n        \"cfinv\"\n      ]\n    },\n    \"test al, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xa8\",\n      \"ExpectedArm64ASM\": [\n        \"cmn wzr, w4, lsl #24\",\n        \"cfinv\",\n        \"mov x26, x4\"\n      ]\n    },\n    \"test ax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xa9\",\n      \"ExpectedArm64ASM\": [\n        \"cmn wzr, w4, lsl #16\",\n        \"cfinv\",\n        \"mov x26, x4\"\n      ]\n    },\n    \"test eax, -1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xa9\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"test rax, -1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xa9\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"scasb\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xae\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20\"\n      ]\n    },\n    \"scasw\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #1\"\n      ]\n    },\n    \"scasd\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #2\"\n      ]\n    },\n    \"scasq\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs x26, x4, x20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #3\"\n      ]\n    },\n    \"repz scasb\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xae\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x2c\",\n        \"cbz x7, #+0x24\",\n        \"ldrb w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x1 (1)\",\n        \"b.eq #-0x20\",\n        \"b #+0x28\",\n        \"cbz x7, #+0x24\",\n        \"ldrb w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x1 (1)\",\n        \"b.eq #-0x20\"\n      ]\n    },\n    \"repz scasw\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x2c\",\n        \"cbz x7, #+0x24\",\n        \"ldrh w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x2 (2)\",\n        \"b.eq #-0x20\",\n        \"b #+0x28\",\n        \"cbz x7, #+0x24\",\n        \"ldrh w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x2 (2)\",\n        \"b.eq #-0x20\"\n      ]\n    },\n    \"repz scasd\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"cbz x7, #+0x1c\",\n        \"ldr w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x4 (4)\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x1c\",\n        \"ldr w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x4 (4)\",\n        \"b.eq #-0x18\"\n      ]\n    },\n    \"repz scasq\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"cbz x7, #+0x1c\",\n        \"ldr x20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs x26, x4, x20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x8 (8)\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x1c\",\n        \"ldr x20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs x26, x4, x20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x8 (8)\",\n        \"b.eq #-0x18\"\n      ]\n    },\n    \"repnz scasb\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xae\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x2c\",\n        \"cbz x7, #+0x24\",\n        \"ldrb w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x1 (1)\",\n        \"b.ne #-0x20\",\n        \"b #+0x28\",\n        \"cbz x7, #+0x24\",\n        \"ldrb w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x1 (1)\",\n        \"b.ne #-0x20\"\n      ]\n    },\n    \"repnz scasw\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x2c\",\n        \"cbz x7, #+0x24\",\n        \"ldrh w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x2 (2)\",\n        \"b.ne #-0x20\",\n        \"b #+0x28\",\n        \"cbz x7, #+0x24\",\n        \"ldrh w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x2 (2)\",\n        \"b.ne #-0x20\"\n      ]\n    },\n    \"repnz scasd\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"cbz x7, #+0x1c\",\n        \"ldr w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x4 (4)\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x1c\",\n        \"ldr w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x4 (4)\",\n        \"b.ne #-0x18\"\n      ]\n    },\n    \"repnz scasq\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"cbz x7, #+0x1c\",\n        \"ldr x20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs x26, x4, x20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x8 (8)\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x1c\",\n        \"ldr x20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs x26, x4, x20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x8 (8)\",\n        \"b.ne #-0x18\"\n      ]\n    },\n    \"cmc\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf5\",\n      \"ExpectedArm64ASM\": [\n        \"cfinv\"\n      ]\n    },\n    \"clc\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf8\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"stc\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf9\",\n      \"ExpectedArm64ASM\": [\n        \"rmif xzr, #63, #nzCv\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/PrimaryGroup.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"add al, 1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP1 0x80 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w4, #0x1 (1)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"or al, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x80 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr x26, x4, #0x1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc al, 1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"GROUP1 0x80 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w4, w20\",\n        \"uxtb w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w26, w4\",\n        \"rmif x20, #7, #nzcV\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"sbb al, 1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"GROUP1 0x80 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"uxtb w21, w4\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxtb w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w21, w26\",\n        \"rmif x20, #7, #nzcV\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"and al, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x80 /4\",\n      \"ExpectedArm64ASM\": [\n        \"and x26, x4, #0xffffffffffffff01\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub al, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP1 0x80 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0x1 (1)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"xor al, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x80 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor x26, x4, #0x1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"cmp al, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x80 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0x1 (1)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"add al, -1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x80 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w4, #0xff (255)\",\n        \"bfxil x4, x26, #0, #8\",\n        \"cfinv\"\n      ]\n    },\n    \"or al, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x80 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr x26, x4, #0xff\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc al, -1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"GROUP1 0x80 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w4, w20\",\n        \"uxtb w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w4, w26\",\n        \"rmif x20, #7, #nzcV\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"sbb al, -1\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"GROUP1 0x80 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"uxtb w21, w4\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxtb w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x20, #63, #nzCv\",\n        \"bic w20, w26, w21\",\n        \"rmif x20, #7, #nzcV\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"and al, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x80 /4\",\n      \"ExpectedArm64ASM\": [\n        \"cmn wzr, w4, lsl #24\",\n        \"cfinv\",\n        \"mov x26, x4\"\n      ]\n    },\n    \"sub al, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x80 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0xff (255)\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"xor al, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x80 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor x26, x4, #0xff\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"cmp al, -1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x80 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0xff (255)\"\n      ]\n    },\n    \"add ax, 256\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"lsl w0, w4, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w4, #0x100 (256)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #16\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"add eax, 256\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"adds w26, w4, #0x100 (256)\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"add rax, 256\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"adds x26, x4, #0x100 (256)\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or eax, 256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr w4, w4, #0x100\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"or rax, 256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr x4, x4, #0x100\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"adc eax, 256\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"cfinv\",\n        \"adcs w26, w4, w20\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc rax, 256\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"cfinv\",\n        \"adcs x26, x4, x20\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb eax, 256\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"sbcs w26, w4, w20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb rax, 256\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"sbcs x26, x4, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and eax, 256\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w4, #0x100\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and rax, 256\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x4, #0x100\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub eax, 256\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x100 (256)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub rax, 256\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x100 (256)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor eax, 256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor w4, w4, #0x100\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"xor rax, 256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor x4, x4, #0x100\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"cmp eax, 256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /7\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x100 (256)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"cmp rax, 256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /7\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x100 (256)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"add ax, -256\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff00\",\n        \"lsl w0, w4, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w4, w20\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #16\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"add eax, -256\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x100 (256)\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"add rax, -256\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x100 (256)\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or eax, -256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr w4, w4, #0xffffff00\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"or rax, -256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr x4, x4, #0xffffffffffffff00\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"adc eax, -256\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffff00\",\n        \"cfinv\",\n        \"adcs w26, w4, w20\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc rax, -256\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffff00\",\n        \"cfinv\",\n        \"adcs x26, x4, x20\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb eax, -256\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffff00\",\n        \"sbcs w26, w4, w20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb rax, -256\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffff00\",\n        \"sbcs x26, x4, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and eax, -256\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w4, #0xffffff00\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and rax, -256\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x4, #0xffffffffffffff00\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub eax, -256\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"adds w26, w4, #0x100 (256)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub rax, -256\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"adds x26, x4, #0x100 (256)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor eax, -256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor w4, w4, #0xffffff00\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"xor rax, -256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor x4, x4, #0xffffffffffffff00\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"cmp eax, -256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /7\",\n      \"ExpectedArm64ASM\": [\n        \"adds w26, w4, #0x100 (256)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"cmp rax, -256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /7\",\n      \"ExpectedArm64ASM\": [\n        \"adds x26, x4, #0x100 (256)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"add ax, 1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w4, #0x1 (1)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #16\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"add eax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"adds w26, w4, #0x1 (1)\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"add rax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"adds x26, x4, #0x1 (1)\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or eax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr w4, w4, #0x1\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"or rax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr x4, x4, #0x1\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"adc eax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cfinv\",\n        \"adcs w26, w4, w20\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc rax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cfinv\",\n        \"adcs x26, x4, x20\",\n        \"cfinv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb eax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"sbcs w26, w4, w20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb rax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"sbcs x26, x4, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and eax, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x83 /4\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w4, #0x1\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and rax, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x83 /4\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x4, #0x1\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub eax, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x83 /5\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x1 (1)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub rax, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x83 /5\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x1 (1)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor eax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor w4, w4, #0x1\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"xor rax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor x4, x4, #0x1\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"cmp eax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /7\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x1 (1)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"cmp rax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /7\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x1 (1)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"add ax, -1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w4, w20\",\n        \"bfxil x4, x26, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"add eax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"subs w26, w4, #0x1 (1)\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"add rax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"subs x26, x4, #0x1 (1)\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or eax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x83 /-1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"orr w4, w4, w20\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"or rax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x83 /-1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"orr x4, x4, x20\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"adc eax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"mvn w27, w4\",\n        \"cfinv\",\n        \"adcs w26, w4, w20\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc rax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"mvn w27, w4\",\n        \"cfinv\",\n        \"adcs x26, x4, x20\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb eax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"mvn w27, w4\",\n        \"sbcs w26, w4, w20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb rax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"mvn w27, w4\",\n        \"sbcs x26, x4, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and eax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"ands w26, w4, w20\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and rax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"ands x26, x4, x20\",\n        \"cfinv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub eax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x83 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds w26, w4, #0x1 (1)\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub rax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x83 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds x26, x4, #0x1 (1)\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor eax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w4, w4\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"xor rax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mvn x4, x4\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"cmp eax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds w26, w4, #0x1 (1)\"\n      ]\n    },\n    \"cmp rax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds x26, x4, #0x1 (1)\"\n      ]\n    },\n    \"rol al, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC0 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #24, #8\",\n        \"ror w20, w20, #30\",\n        \"bfxil x4, x20, #0, #8\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"ror al, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC0 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #8, #8\",\n        \"ror w20, w20, #2\",\n        \"bfxil x4, x20, #0, #8\",\n        \"eor x20, x20, #0x80\",\n        \"rmif x20, #6, #nzCv\"\n      ]\n    },\n    \"rcl al, 2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"GROUP2 0xC0 /2\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"cset x21, lo\",\n        \"mov w22, #0x0\",\n        \"bfi x22, x20, #55, #8\",\n        \"bfi x22, x21, #63, #1\",\n        \"bfi x22, x20, #46, #8\",\n        \"bfi x22, x21, #54, #1\",\n        \"bfi x22, x20, #37, #8\",\n        \"bfi x22, x21, #45, #1\",\n        \"bfi x22, x20, #28, #8\",\n        \"bfi x22, x21, #36, #1\",\n        \"bfi x22, x20, #19, #8\",\n        \"bfi x22, x21, #27, #1\",\n        \"bfxil x22, x20, #0, #8\",\n        \"ror x20, x22, #62\",\n        \"bfxil x4, x20, #0, #8\",\n        \"ror x20, x22, #61\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"rcr al, 2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP2 0xC0 /3\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"uxtb w21, w4\",\n        \"bfi x21, x20, #8, #1\",\n        \"bfi x21, x21, #9, #9\",\n        \"bfi x21, x21, #18, #18\",\n        \"bfi x21, x21, #36, #9\",\n        \"lsr x20, x21, #2\",\n        \"bfxil x4, x20, #0, #8\",\n        \"eor x20, x21, #0x2\",\n        \"rmif x20, #0, #nzCv\"\n      ]\n    },\n    \"shl al, 2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xC0 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w26, w4, #2\",\n        \"cmn wzr, w26, lsl #24\",\n        \"eor x20, x4, #0x40\",\n        \"rmif x20, #5, #nzCv\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"shr al, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC0 /5\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"lsr w26, w20, #2\",\n        \"cmn wzr, w26, lsl #24\",\n        \"eor x20, x20, #0x2\",\n        \"rmif x20, #0, #nzCv\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"sar al, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC0 /7\",\n      \"ExpectedArm64ASM\": [\n        \"sxtb x20, w4\",\n        \"asr w26, w20, #2\",\n        \"cmn wzr, w26, lsl #24\",\n        \"eor x20, x20, #0x2\",\n        \"rmif x20, #0, #nzCv\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"rol ax, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC1 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #16, #16\",\n        \"ror w20, w20, #30\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"rol eax, 2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP2 0xC1 /0\",\n      \"ExpectedArm64ASM\": [\n        \"ror w4, w4, #30\",\n        \"eor x20, x4, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"rol rax, 2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP2 0xC1 /0\",\n      \"ExpectedArm64ASM\": [\n        \"ror x4, x4, #62\",\n        \"eor x20, x4, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"ror ax, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC1 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #16, #16\",\n        \"ror w20, w20, #2\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor x20, x20, #0x8000\",\n        \"rmif x20, #14, #nzCv\"\n      ]\n    },\n    \"ror eax, 2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP2 0xC1 /1\",\n      \"ExpectedArm64ASM\": [\n        \"ror w4, w4, #2\",\n        \"eor x20, x4, #0x80000000\",\n        \"rmif x20, #30, #nzCv\"\n      ]\n    },\n    \"ror rax, 2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP2 0xC1 /1\",\n      \"ExpectedArm64ASM\": [\n        \"ror x4, x4, #2\",\n        \"eor x20, x4, #0x8000000000000000\",\n        \"rmif x20, #62, #nzCv\"\n      ]\n    },\n    \"rcl ax, 2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"GROUP2 0xC1 /2\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"cset x21, lo\",\n        \"mov w22, #0x0\",\n        \"bfi x22, x20, #47, #16\",\n        \"bfi x22, x21, #63, #1\",\n        \"bfi x22, x20, #30, #16\",\n        \"bfi x22, x21, #46, #1\",\n        \"bfi x22, x20, #13, #16\",\n        \"bfi x22, x21, #29, #1\",\n        \"bfxil x22, x20, #0, #16\",\n        \"ror x20, x22, #62\",\n        \"bfxil x4, x20, #0, #16\",\n        \"ror x20, x22, #61\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"rcl eax, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC1 /2\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w20, w4, #2\",\n        \"cset x21, lo\",\n        \"orr w20, w20, w4, lsr #31\",\n        \"eor x22, x4, #0x40000000\",\n        \"rmif x22, #29, #nzCv\",\n        \"orr w4, w20, w21, lsl #1\"\n      ]\n    },\n    \"rcl rax, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC1 /2\",\n      \"ExpectedArm64ASM\": [\n        \"lsl x20, x4, #2\",\n        \"cset x21, lo\",\n        \"orr x20, x20, x4, lsr #63\",\n        \"eor x22, x4, #0x4000000000000000\",\n        \"rmif x22, #61, #nzCv\",\n        \"orr x4, x20, x21, lsl #1\"\n      ]\n    },\n    \"rcr ax, 2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xC1 /3\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"uxth w21, w4\",\n        \"bfi x21, x20, #16, #1\",\n        \"bfi x21, x21, #17, #17\",\n        \"bfi x21, x21, #34, #17\",\n        \"lsr x20, x21, #2\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor x20, x21, #0x2\",\n        \"rmif x20, #0, #nzCv\"\n      ]\n    },\n    \"rcr eax, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC1 /3\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, #2\",\n        \"cset x21, lo\",\n        \"orr w20, w20, w4, lsl #31\",\n        \"eor x22, x4, #0x2\",\n        \"rmif x22, #0, #nzCv\",\n        \"orr w4, w20, w21, lsl #30\"\n      ]\n    },\n    \"rcr rax, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC1 /3\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x20, x4, #2\",\n        \"cset x21, lo\",\n        \"orr x20, x20, x4, lsl #63\",\n        \"eor x22, x4, #0x2\",\n        \"rmif x22, #0, #nzCv\",\n        \"orr x4, x20, x21, lsl #62\"\n      ]\n    },\n    \"shl ax, 2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xC1 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w26, w4, #2\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x20, x4, #0x4000\",\n        \"rmif x20, #13, #nzCv\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"shl eax, 2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xC1 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w26, w4, #2\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x40000000\",\n        \"rmif x20, #29, #nzCv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shl rax, 2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xC1 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl x26, x4, #2\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x4000000000000000\",\n        \"rmif x20, #61, #nzCv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shr ax, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC1 /5\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"lsr w26, w20, #2\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x20, x20, #0x2\",\n        \"rmif x20, #0, #nzCv\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"shr eax, 2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xC1 /5\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w26, w4, #2\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x2\",\n        \"rmif x20, #0, #nzCv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shr rax, 2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xC1 /5\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x26, x4, #2\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x2\",\n        \"rmif x20, #0, #nzCv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sar ax, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC1 /7\",\n      \"ExpectedArm64ASM\": [\n        \"sxth x20, w4\",\n        \"asr w26, w20, #2\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x20, x20, #0x2\",\n        \"rmif x20, #0, #nzCv\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"sar eax, 2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xC1 /7\",\n      \"ExpectedArm64ASM\": [\n        \"asr w26, w4, #2\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x2\",\n        \"rmif x20, #0, #nzCv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sar rax, 2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xC1 /7\",\n      \"ExpectedArm64ASM\": [\n        \"asr x26, x4, #2\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x2\",\n        \"rmif x20, #0, #nzCv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"rol al, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xd0 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #24, #8\",\n        \"ror w20, w20, #31\",\n        \"bfxil x4, x20, #0, #8\",\n        \"eor x21, x20, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"eor w20, w20, w20, lsr #7\",\n        \"rmif x20, #0, #nzcV\"\n      ]\n    },\n    \"ror al, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xd0 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #8, #8\",\n        \"ror w20, w20, #1\",\n        \"bfxil x4, x20, #0, #8\",\n        \"eor x21, x20, #0x80\",\n        \"rmif x21, #6, #nzCv\",\n        \"eor w20, w20, w20, lsr #1\",\n        \"rmif x20, #6, #nzcV\"\n      ]\n    },\n    \"rcl al, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xd0 /2\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"cset x21, lo\",\n        \"orr w21, w21, w20, lsl #1\",\n        \"eor x22, x20, #0x80\",\n        \"rmif x22, #6, #nzCv\",\n        \"eor w20, w21, w20\",\n        \"rmif x20, #7, #nzcV\",\n        \"bfxil x4, x21, #0, #8\"\n      ]\n    },\n    \"rcr al, 1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xd0 /3\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"cset x21, lo\",\n        \"eor x22, x20, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"ubfx w20, w20, #1, #7\",\n        \"bfi w20, w21, #7, #1\",\n        \"bfxil x4, x20, #0, #8\",\n        \"eor w20, w20, w20, lsr #1\",\n        \"rmif x20, #6, #nzcV\"\n      ]\n    },\n    \"shl al, 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xd0 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w26, w4, #1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"eor x20, x4, #0x80\",\n        \"rmif x20, #6, #nzCv\",\n        \"eor w20, w26, w4\",\n        \"rmif x20, #7, #nzcV\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"shr al, 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xd0 /5\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"lsr w26, w20, #1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"eor x21, x20, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x20, #7, #nzcV\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"sar al, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xd0 /7\",\n      \"ExpectedArm64ASM\": [\n        \"sxtb x20, w4\",\n        \"asr w26, w20, #1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"rol ax, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xd1 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #16, #16\",\n        \"ror w20, w20, #31\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor x21, x20, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"eor w20, w20, w20, lsr #15\",\n        \"rmif x20, #0, #nzcV\"\n      ]\n    },\n    \"rol eax, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xd1 /0\",\n      \"ExpectedArm64ASM\": [\n        \"ror w4, w4, #31\",\n        \"eor x20, x4, #0x1\",\n        \"rmif x20, #63, #nzCv\",\n        \"eor w20, w4, w4, lsr #31\",\n        \"rmif x20, #0, #nzcV\"\n      ]\n    },\n    \"rol rax, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xd1 /0\",\n      \"ExpectedArm64ASM\": [\n        \"ror x4, x4, #63\",\n        \"eor x20, x4, #0x1\",\n        \"rmif x20, #63, #nzCv\",\n        \"eor x20, x4, x4, lsr #63\",\n        \"rmif x20, #0, #nzcV\"\n      ]\n    },\n    \"ror ax, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xd1 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #16, #16\",\n        \"ror w20, w20, #1\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor x21, x20, #0x8000\",\n        \"rmif x21, #14, #nzCv\",\n        \"eor w20, w20, w20, lsr #1\",\n        \"rmif x20, #14, #nzcV\"\n      ]\n    },\n    \"ror eax, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xd1 /1\",\n      \"ExpectedArm64ASM\": [\n        \"ror w4, w4, #1\",\n        \"eor x20, x4, #0x80000000\",\n        \"rmif x20, #30, #nzCv\",\n        \"eor w20, w4, w4, lsr #1\",\n        \"rmif x20, #30, #nzcV\"\n      ]\n    },\n    \"ror rax, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xd1 /1\",\n      \"ExpectedArm64ASM\": [\n        \"ror x4, x4, #1\",\n        \"eor x20, x4, #0x8000000000000000\",\n        \"rmif x20, #62, #nzCv\",\n        \"eor x20, x4, x4, lsr #1\",\n        \"rmif x20, #62, #nzcV\"\n      ]\n    },\n    \"rcl ax, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xd1 /2\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"cset x21, lo\",\n        \"orr w21, w21, w20, lsl #1\",\n        \"eor x22, x20, #0x8000\",\n        \"rmif x22, #14, #nzCv\",\n        \"eor w20, w21, w20\",\n        \"rmif x20, #15, #nzcV\",\n        \"bfxil x4, x21, #0, #16\"\n      ]\n    },\n    \"rcl eax, 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xd1 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w4\",\n        \"cset x21, lo\",\n        \"orr w4, w21, w20, lsl #1\",\n        \"eor x21, x20, #0x80000000\",\n        \"rmif x21, #30, #nzCv\",\n        \"eor w20, w4, w20\",\n        \"rmif x20, #31, #nzcV\"\n      ]\n    },\n    \"rcl rax, 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xd1 /2\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"orr x20, x20, x4, lsl #1\",\n        \"eor x21, x4, #0x8000000000000000\",\n        \"rmif x21, #62, #nzCv\",\n        \"eor x21, x20, x4\",\n        \"rmif x21, #63, #nzcV\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"rcr ax, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xd1 /3\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"eor x21, x4, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"ubfx w21, w4, #1, #15\",\n        \"orr w20, w21, w20, lsl #15\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor x20, x20, x20, lsr #1\",\n        \"rmif x20, #14, #nzcV\"\n      ]\n    },\n    \"rcr eax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xd1 /3\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"eor x21, x4, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"extr w4, w20, w4, #1\",\n        \"eor x20, x4, x4, lsr #1\",\n        \"rmif x20, #30, #nzcV\"\n      ]\n    },\n    \"rcr rax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xd1 /3\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"eor x21, x4, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"extr x4, x20, x4, #1\",\n        \"eor x20, x4, x4, lsr #1\",\n        \"rmif x20, #62, #nzcV\"\n      ]\n    },\n    \"shl ax, 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xd1 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w26, w4, #1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x20, x4, #0x8000\",\n        \"rmif x20, #14, #nzCv\",\n        \"eor w20, w26, w4\",\n        \"rmif x20, #15, #nzcV\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"shl eax, 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xd1 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w26, w4, #1\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x80000000\",\n        \"rmif x20, #30, #nzCv\",\n        \"eor w20, w26, w4\",\n        \"rmif x20, #31, #nzcV\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shl rax, 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xd1 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl x26, x4, #1\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x8000000000000000\",\n        \"rmif x20, #62, #nzCv\",\n        \"eor x20, x26, x4\",\n        \"rmif x20, #63, #nzcV\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shr ax, 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xd1 /5\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"lsr w26, w20, #1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x21, x20, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x20, #15, #nzcV\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"shr eax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xd1 /5\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w26, w4, #1\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x1\",\n        \"rmif x20, #63, #nzCv\",\n        \"rmif x4, #31, #nzcV\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shr rax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xd1 /5\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x26, x4, #1\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x1\",\n        \"rmif x20, #63, #nzCv\",\n        \"rmif x4, #63, #nzcV\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sar ax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xd1 /7\",\n      \"ExpectedArm64ASM\": [\n        \"sxth x20, w4\",\n        \"asr w26, w20, #1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"sar eax, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xd1 /7\",\n      \"ExpectedArm64ASM\": [\n        \"asr w26, w4, #1\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x1\",\n        \"rmif x20, #63, #nzCv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sar rax, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xd1 /7\",\n      \"ExpectedArm64ASM\": [\n        \"asr x26, x4, #1\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x1\",\n        \"rmif x20, #63, #nzCv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"rol al, cl\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"GROUP2 0xd2 /0\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x7\",\n        \"mov x21, x4\",\n        \"bfi w21, w4, #24, #8\",\n        \"neg x20, x20\",\n        \"ror w20, w21, w20\",\n        \"bfxil x4, x20, #0, #8\",\n        \"and x21, x7, #0x1f\",\n        \"cbz w21, #+0x14\",\n        \"eor x0, x20, x20, lsr #7\",\n        \"mvn x1, x20\",\n        \"rmif x1, #63, #nzCv\",\n        \"rmif x0, #0, #nzcV\"\n      ]\n    },\n    \"ror al, cl\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd2 /1\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x7\",\n        \"mov x21, x4\",\n        \"bfi w21, w4, #8, #8\",\n        \"ror w20, w21, w20\",\n        \"bfxil x4, x20, #0, #8\",\n        \"and x21, x7, #0x1f\",\n        \"cbz w21, #+0x14\",\n        \"eor x0, x20, x20, lsr #1\",\n        \"mvn x1, x20\",\n        \"rmif x1, #6, #nzCv\",\n        \"rmif x0, #6, #nzcV\"\n      ]\n    },\n    \"rcl al, cl\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": \"GROUP2 0xd2 /2\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"cbz x20, #+0x68\",\n        \"and x20, x7, #0x1f\",\n        \"uxtb w21, w4\",\n        \"cset x22, lo\",\n        \"mov w23, #0x0\",\n        \"bfi x23, x21, #55, #8\",\n        \"bfi x23, x22, #63, #1\",\n        \"bfi x23, x21, #46, #8\",\n        \"bfi x23, x22, #54, #1\",\n        \"bfi x23, x21, #37, #8\",\n        \"bfi x23, x22, #45, #1\",\n        \"bfi x23, x21, #28, #8\",\n        \"bfi x23, x22, #36, #1\",\n        \"bfi x23, x21, #19, #8\",\n        \"bfi x23, x22, #27, #1\",\n        \"bfxil x23, x21, #0, #8\",\n        \"neg x21, x20\",\n        \"ror x21, x23, x21\",\n        \"bfxil x4, x21, #0, #8\",\n        \"mov w22, #0x3f\",\n        \"sub x20, x22, x20\",\n        \"ror x20, x23, x20\",\n        \"eor x22, x20, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"eor x20, x20, x21, lsr #7\",\n        \"rmif x20, #0, #nzcV\"\n      ]\n    },\n    \"rcr al, cl\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"GROUP2 0xd2 /3\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"cbz x20, #+0x40\",\n        \"and x20, x7, #0x1f\",\n        \"cset x21, lo\",\n        \"uxtb w22, w4\",\n        \"bfi x22, x21, #8, #1\",\n        \"bfi x22, x22, #9, #9\",\n        \"bfi x22, x22, #18, #18\",\n        \"bfi x22, x22, #36, #9\",\n        \"lsr x21, x22, x20\",\n        \"bfxil x4, x21, #0, #8\",\n        \"sub w20, w20, #0x1 (1)\",\n        \"lsr w20, w22, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\",\n        \"eor w20, w21, w21, lsr #1\",\n        \"rmif x20, #6, #nzcV\"\n      ]\n    },\n    \"shl al, cl\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP2 0xd2 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w20, w4, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x1c\",\n        \"cmn wzr, w20, lsl #24\",\n        \"mov x26, x20\",\n        \"mvn x0, x20\",\n        \"eor w2, w4, w20\",\n        \"rmif x0, #7, #nzCv\",\n        \"rmif x2, #7, #nzcV\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"shr al, cl\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"GROUP2 0xd2 /5\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"lsr w21, w20, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x24\",\n        \"cmn wzr, w21, lsl #24\",\n        \"mov x26, x21\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr w0, w20, w0\",\n        \"mvn x0, x0\",\n        \"eor w2, w20, w21\",\n        \"rmif x0, #63, #nzCv\",\n        \"rmif x2, #7, #nzcV\",\n        \"bfxil x4, x21, #0, #8\"\n      ]\n    },\n    \"sar al, cl\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd2 /7\",\n      \"ExpectedArm64ASM\": [\n        \"sxtb x20, w4\",\n        \"asr w21, w20, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x1c\",\n        \"cmn wzr, w21, lsl #24\",\n        \"mov x26, x21\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr w0, w20, w0\",\n        \"mvn x0, x0\",\n        \"rmif x0, #63, #nzCv\",\n        \"bfxil x4, x21, #0, #8\"\n      ]\n    },\n    \"rol ax, cl\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd3 /0\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"mov x21, x4\",\n        \"bfi w21, w4, #16, #16\",\n        \"neg x22, x20\",\n        \"ror w21, w21, w22\",\n        \"bfxil x4, x21, #0, #16\",\n        \"cbz w20, #+0x14\",\n        \"eor x0, x21, x21, lsr #15\",\n        \"mvn x1, x21\",\n        \"rmif x1, #63, #nzCv\",\n        \"rmif x0, #0, #nzcV\"\n      ]\n    },\n    \"rol eax, cl\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xd3 /0\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"neg x21, x20\",\n        \"ror w4, w4, w21\",\n        \"cbz w20, #+0x14\",\n        \"eor x0, x4, x4, lsr #31\",\n        \"mvn x1, x4\",\n        \"rmif x1, #63, #nzCv\",\n        \"rmif x0, #0, #nzcV\"\n      ]\n    },\n    \"rol rax, cl\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xd3 /0\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x3f\",\n        \"neg x21, x20\",\n        \"ror x4, x4, x21\",\n        \"cbz x20, #+0x14\",\n        \"eor x0, x4, x4, lsr #63\",\n        \"mvn x1, x4\",\n        \"rmif x1, #63, #nzCv\",\n        \"rmif x0, #0, #nzcV\"\n      ]\n    },\n    \"ror ax, cl\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP2 0xd3 /1\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"mov x21, x4\",\n        \"bfi w21, w4, #16, #16\",\n        \"ror w21, w21, w20\",\n        \"bfxil x4, x21, #0, #16\",\n        \"cbz w20, #+0x14\",\n        \"eor x0, x21, x21, lsr #1\",\n        \"mvn x1, x21\",\n        \"rmif x1, #14, #nzCv\",\n        \"rmif x0, #14, #nzcV\"\n      ]\n    },\n    \"ror eax, cl\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xd3 /1\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"ror w4, w4, w20\",\n        \"cbz w20, #+0x14\",\n        \"eor x0, x4, x4, lsr #1\",\n        \"mvn x1, x4\",\n        \"rmif x1, #30, #nzCv\",\n        \"rmif x0, #30, #nzcV\"\n      ]\n    },\n    \"ror rax, cl\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xd3 /1\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x3f\",\n        \"ror x4, x4, x20\",\n        \"cbz x20, #+0x14\",\n        \"eor x0, x4, x4, lsr #1\",\n        \"mvn x1, x4\",\n        \"rmif x1, #62, #nzCv\",\n        \"rmif x0, #62, #nzcV\"\n      ]\n    },\n    \"rcl ax, cl\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"GROUP2 0xd3 /2\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"cbz x20, #+0x58\",\n        \"and x20, x7, #0x1f\",\n        \"uxth w21, w4\",\n        \"cset x22, lo\",\n        \"mov w23, #0x0\",\n        \"bfi x23, x21, #47, #16\",\n        \"bfi x23, x22, #63, #1\",\n        \"bfi x23, x21, #30, #16\",\n        \"bfi x23, x22, #46, #1\",\n        \"bfi x23, x21, #13, #16\",\n        \"bfi x23, x22, #29, #1\",\n        \"bfxil x23, x21, #0, #16\",\n        \"neg x21, x20\",\n        \"ror x21, x23, x21\",\n        \"bfxil x4, x21, #0, #16\",\n        \"mov w22, #0x3f\",\n        \"sub x20, x22, x20\",\n        \"ror x20, x23, x20\",\n        \"eor x22, x20, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"eor x20, x20, x21, lsr #15\",\n        \"rmif x20, #0, #nzcV\"\n      ]\n    },\n    \"rcl eax, cl\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"GROUP2 0xd3 /2\",\n      \"ExpectedArm64ASM\": [\n        \"and w20, w7, #0x1f\",\n        \"cbz x20, #+0x3c\",\n        \"lsl w20, w4, w7\",\n        \"cset x21, lo\",\n        \"neg w22, w7\",\n        \"lsr w23, w4, w22\",\n        \"orr w20, w20, w23, lsr #1\",\n        \"lsr w22, w4, w22\",\n        \"eor x23, x22, #0x1\",\n        \"rmif x23, #63, #nzCv\",\n        \"sub w23, w7, #0x1 (1)\",\n        \"lsl w21, w21, w23\",\n        \"orr w4, w20, w21\",\n        \"eor w20, w4, w22, lsl #31\",\n        \"rmif x20, #31, #nzcV\",\n        \"b #+0x8\",\n        \"mov w4, w4\"\n      ]\n    },\n    \"rcl rax, cl\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"GROUP2 0xd3 /2\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x3f\",\n        \"cbz x20, #+0x38\",\n        \"lsl x20, x4, x7\",\n        \"cset x21, lo\",\n        \"neg x22, x7\",\n        \"lsr x23, x4, x22\",\n        \"orr x20, x20, x23, lsr #1\",\n        \"lsr x22, x4, x22\",\n        \"eor x23, x22, #0x1\",\n        \"rmif x23, #63, #nzCv\",\n        \"sub x23, x7, #0x1 (1)\",\n        \"lsl x21, x21, x23\",\n        \"orr x4, x20, x21\",\n        \"eor x20, x4, x22, lsl #63\",\n        \"rmif x20, #63, #nzcV\"\n      ]\n    },\n    \"rcr ax, cl\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": \"GROUP2 0xd3 /3\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"cbz x20, #+0x3c\",\n        \"and x20, x7, #0x1f\",\n        \"cset x21, lo\",\n        \"uxth w22, w4\",\n        \"bfi x22, x21, #16, #1\",\n        \"bfi x22, x22, #17, #17\",\n        \"bfi x22, x22, #34, #17\",\n        \"lsr x21, x22, x20\",\n        \"bfxil x4, x21, #0, #16\",\n        \"sub w20, w20, #0x1 (1)\",\n        \"lsr w20, w22, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\",\n        \"eor w20, w21, w21, lsr #1\",\n        \"rmif x20, #14, #nzcV\"\n      ]\n    },\n    \"rcr eax, cl\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"GROUP2 0xd3 /3\",\n      \"ExpectedArm64ASM\": [\n        \"and w20, w7, #0x1f\",\n        \"cbz x20, #+0x3c\",\n        \"lsr w20, w4, w7\",\n        \"cset x21, lo\",\n        \"neg w22, w7\",\n        \"lsl w23, w4, w22\",\n        \"orr w20, w20, w23, lsl #1\",\n        \"sub w23, w7, #0x1 (1)\",\n        \"lsr w23, w4, w23\",\n        \"eor x23, x23, #0x1\",\n        \"rmif x23, #63, #nzCv\",\n        \"lsl w21, w21, w22\",\n        \"orr w4, w20, w21\",\n        \"eor w20, w4, w4, lsr #1\",\n        \"rmif x20, #30, #nzcV\",\n        \"b #+0x8\",\n        \"mov w4, w4\"\n      ]\n    },\n    \"rcr rax, cl\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"GROUP2 0xd3 /3\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x3f\",\n        \"cbz x20, #+0x38\",\n        \"lsr x20, x4, x7\",\n        \"cset x21, lo\",\n        \"neg x22, x7\",\n        \"lsl x23, x4, x22\",\n        \"orr x20, x20, x23, lsl #1\",\n        \"sub x23, x7, #0x1 (1)\",\n        \"lsr x23, x4, x23\",\n        \"eor x23, x23, #0x1\",\n        \"rmif x23, #63, #nzCv\",\n        \"lsl x21, x21, x22\",\n        \"orr x4, x20, x21\",\n        \"eor x20, x4, x4, lsr #1\",\n        \"rmif x20, #62, #nzcV\"\n      ]\n    },\n    \"shl ax, cl\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP2 0xd3 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w20, w4, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x1c\",\n        \"cmn wzr, w20, lsl #16\",\n        \"mov x26, x20\",\n        \"mvn x0, x20\",\n        \"eor w2, w4, w20\",\n        \"rmif x0, #15, #nzCv\",\n        \"rmif x2, #15, #nzcV\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"shl eax, cl\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd3 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w20, w4, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x20\",\n        \"ands w26, w20, w20\",\n        \"neg w0, w7\",\n        \"lsr w0, w4, w0\",\n        \"mvn x0, x0\",\n        \"eor w2, w4, w20\",\n        \"rmif x0, #63, #nzCv\",\n        \"rmif x2, #31, #nzcV\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"shl rax, cl\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd3 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl x20, x4, x7\",\n        \"and w0, w7, #0x3f\",\n        \"cbz x0, #+0x20\",\n        \"ands x26, x20, x20\",\n        \"neg x0, x7\",\n        \"lsr x0, x4, x0\",\n        \"mvn x0, x0\",\n        \"eor x2, x4, x20\",\n        \"rmif x0, #63, #nzCv\",\n        \"rmif x2, #63, #nzcV\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"shr ax, cl\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"GROUP2 0xd3 /5\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"lsr w21, w20, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x24\",\n        \"cmn wzr, w21, lsl #16\",\n        \"mov x26, x21\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr w0, w20, w0\",\n        \"mvn x0, x0\",\n        \"eor w2, w20, w21\",\n        \"rmif x0, #63, #nzCv\",\n        \"rmif x2, #15, #nzcV\",\n        \"bfxil x4, x21, #0, #16\"\n      ]\n    },\n    \"shr eax, cl\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd3 /5\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x20\",\n        \"ands w26, w20, w20\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr w0, w4, w0\",\n        \"mvn x0, x0\",\n        \"eor w2, w4, w20\",\n        \"rmif x0, #63, #nzCv\",\n        \"rmif x2, #31, #nzcV\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"shr rax, cl\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd3 /5\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x20, x4, x7\",\n        \"and w0, w7, #0x3f\",\n        \"cbz x0, #+0x20\",\n        \"ands x26, x20, x20\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr x0, x4, x0\",\n        \"mvn x0, x0\",\n        \"eor x2, x4, x20\",\n        \"rmif x0, #63, #nzCv\",\n        \"rmif x2, #63, #nzcV\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"sar ax, cl\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd3 /7\",\n      \"ExpectedArm64ASM\": [\n        \"sxth x20, w4\",\n        \"asr w21, w20, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x1c\",\n        \"cmn wzr, w21, lsl #16\",\n        \"mov x26, x21\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr w0, w20, w0\",\n        \"mvn x0, x0\",\n        \"rmif x0, #63, #nzCv\",\n        \"bfxil x4, x21, #0, #16\"\n      ]\n    },\n    \"sar eax, cl\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xd3 /7\",\n      \"ExpectedArm64ASM\": [\n        \"asr w20, w4, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x18\",\n        \"ands w26, w20, w20\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr w0, w4, w0\",\n        \"mvn x0, x0\",\n        \"rmif x0, #63, #nzCv\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"sar rax, cl\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xd3 /7\",\n      \"ExpectedArm64ASM\": [\n        \"asr x20, x4, x7\",\n        \"and w0, w7, #0x3f\",\n        \"cbz x0, #+0x18\",\n        \"ands x26, x20, x20\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr x0, x4, x0\",\n        \"mvn x0, x0\",\n        \"rmif x0, #63, #nzCv\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"test bl, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP2 0xf6 /0\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w6, #0x1\",\n        \"cmp w26, #0x0 (0)\"\n      ]\n    },\n    \"not bl\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP2 0xf6 /2\",\n      \"ExpectedArm64ASM\": [\n        \"eor x6, x6, #0xff\"\n      ]\n    },\n    \"neg bl\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xf6 /3\",\n      \"ExpectedArm64ASM\": [\n        \"cmp wzr, w6, lsl #24\",\n        \"neg w26, w6\",\n        \"mov x20, x6\",\n        \"bfxil x20, x26, #0, #8\",\n        \"mov x27, x6\",\n        \"mov x6, x20\"\n      ]\n    },\n    \"mul bl\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xf6 /4\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb x20, w6\",\n        \"uxtb x21, w4\",\n        \"mul x20, x20, x21\",\n        \"bfxil x4, x20, #0, #16\",\n        \"ubfx x20, x20, #8, #8\",\n        \"cmp x20, #0x0 (0)\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul bl\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xf6 /5\",\n      \"ExpectedArm64ASM\": [\n        \"sxtb x20, w6\",\n        \"sxtb x21, w4\",\n        \"mul x20, x20, x21\",\n        \"bfxil x4, x20, #0, #16\",\n        \"sbfx x21, x20, #8, #8\",\n        \"sbfx x20, x20, #7, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"div bl\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xf6 /6\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w6\",\n        \"uxth w23, w4\",\n        \"udiv w22, w23, w20\",\n        \"msub w21, w22, w20, w23\",\n        \"bfi x22, x21, #8, #8\",\n        \"bfxil x4, x22, #0, #16\"\n      ]\n    },\n    \"idiv bl\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xf6 /7\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w6\",\n        \"sxth x23, w4\",\n        \"sxtb x20, w20\",\n        \"sdiv x22, x23, x20\",\n        \"msub x21, x22, x20, x23\",\n        \"bfi x22, x21, #8, #8\",\n        \"bfxil x4, x22, #0, #16\"\n      ]\n    },\n    \"test bx, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP2 0xf7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w6, #0x1\",\n        \"cmp w26, #0x0 (0)\"\n      ]\n    },\n    \"test ebx, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP2 0xf7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w6, #0x1\",\n        \"cfinv\"\n      ]\n    },\n    \"test rbx, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP2 0xf7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x6, #0x1\",\n        \"cfinv\"\n      ]\n    },\n    \"test bx, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP2 0xf7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"cmn wzr, w6, lsl #16\",\n        \"cfinv\",\n        \"mov x26, x6\"\n      ]\n    },\n    \"test ebx, -1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP2 0xf7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w6, #0x0 (0)\"\n      ]\n    },\n    \"test rbx, -1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP2 0xf7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x6, #0x0 (0)\"\n      ]\n    },\n    \"neg bx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xf7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"cmp wzr, w6, lsl #16\",\n        \"neg w26, w6\",\n        \"mov x20, x6\",\n        \"bfxil x20, x26, #0, #16\",\n        \"mov x27, x6\",\n        \"mov x6, x20\"\n      ]\n    },\n    \"neg ebx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP2 0xf7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"negs w26, w6\",\n        \"mov x27, x6\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"neg rbx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP2 0xf7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"negs x26, x6\",\n        \"mov x27, x6\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"mul bx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xf7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"uxth x20, w6\",\n        \"uxth x21, w4\",\n        \"mul x20, x20, x21\",\n        \"bfxil x4, x20, #0, #16\",\n        \"ubfx x20, x20, #16, #16\",\n        \"bfxil x5, x20, #0, #16\",\n        \"cmp x20, #0x0 (0)\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"mul ebx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xf7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w6\",\n        \"mov w21, w4\",\n        \"mul x20, x20, x21\",\n        \"mov w4, w20\",\n        \"lsr x5, x20, #32\",\n        \"cmp x5, #0x0 (0)\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"mul rbx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP2 0xf7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"umulh x5, x6, x4\",\n        \"mul x4, x6, x4\",\n        \"cmp x5, #0x0 (0)\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul bx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xf7 /5\",\n      \"ExpectedArm64ASM\": [\n        \"sxth x20, w6\",\n        \"sxth x21, w4\",\n        \"mul x20, x20, x21\",\n        \"bfxil x4, x20, #0, #16\",\n        \"sbfx x21, x20, #16, #16\",\n        \"bfxil x5, x21, #0, #16\",\n        \"sbfx x20, x20, #15, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul ebx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP2 0xf7 /5\",\n      \"ExpectedArm64ASM\": [\n        \"sxtw x20, w6\",\n        \"sxtw x21, w4\",\n        \"mul x20, x20, x21\",\n        \"mov w4, w20\",\n        \"lsr x5, x20, #32\",\n        \"asr x21, x20, #32\",\n        \"sxtw x20, w20\",\n        \"sbfx x20, x20, #31, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul rbx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xf7 /5\",\n      \"ExpectedArm64ASM\": [\n        \"smulh x5, x6, x4\",\n        \"mul x4, x6, x4\",\n        \"asr x20, x4, #63\",\n        \"cmp x5, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"div bx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xf7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"uxth w0, w4\",\n        \"bfi w0, w5, #16, #16\",\n        \"udiv w22, w0, w20\",\n        \"msub w21, w22, w20, w0\",\n        \"bfxil x4, x22, #0, #16\",\n        \"bfxil x5, x21, #0, #16\"\n      ]\n    },\n    \"inc al\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP3 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w27, w4\",\n        \"add w26, w27, #0x1 (1)\",\n        \"setf8 w26\",\n        \"bic w20, w26, w27\",\n        \"rmif x20, #7, #nzcV\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"dec al\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP3 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w27, w4\",\n        \"sub w26, w27, #0x1 (1)\",\n        \"setf8 w26\",\n        \"bic w20, w27, w26\",\n        \"rmif x20, #7, #nzcV\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"inc ax\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP4 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w27, w4\",\n        \"add w26, w27, #0x1 (1)\",\n        \"setf16 w26\",\n        \"bic w20, w26, w27\",\n        \"rmif x20, #15, #nzcV\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"inc eax\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP4 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hs\",\n        \"adds w26, w4, #0x1 (1)\",\n        \"rmif x20, #63, #nzCv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"inc rax\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP4 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hs\",\n        \"adds x26, x4, #0x1 (1)\",\n        \"rmif x20, #63, #nzCv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"dec ax\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP4 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w27, w4\",\n        \"sub w26, w27, #0x1 (1)\",\n        \"setf16 w26\",\n        \"bic w20, w27, w26\",\n        \"rmif x20, #15, #nzcV\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"dec eax\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP4 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hs\",\n        \"subs w26, w4, #0x1 (1)\",\n        \"rmif x20, #63, #nzCv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"dec rax\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP4 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hs\",\n        \"subs x26, x4, #0x1 (1)\",\n        \"rmif x20, #63, #nzCv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/Primary_32Bit.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [\n      \"FlagM\",\n      \"FlagM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"push es\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x06\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #960]\",\n        \"str w20, [x8, #-4]!\"\n      ]\n    },\n    \"pop es\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x07\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x8], #4\",\n        \"strh w20, [x28, #960]\",\n        \"ubfx w21, w20, #2, #1\",\n        \"and w20, w20, #0xfff8\",\n        \"add x0, x28, x21, lsl #3\",\n        \"ldr x21, [x0, #1184]\",\n        \"ldr x20, [x21, w20, uxtw]\",\n        \"lsr x21, x20, #32\",\n        \"and w22, w21, #0xff000000\",\n        \"orr w20, w22, w20, lsr #16\",\n        \"bfi w20, w21, #16, #8\",\n        \"str w20, [x28, #976]\"\n      ]\n    },\n    \"push cs\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0e\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #962]\",\n        \"str w20, [x8, #-4]!\"\n      ]\n    },\n    \"push ss\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x16\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #964]\",\n        \"str w20, [x8, #-4]!\"\n      ]\n    },\n    \"pop ss\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": \"0x17\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x8], #4\",\n        \"ldrb w21, [x28, #1016]\",\n        \"mov w22, #0x1\",\n        \"and w21, w21, #0x1\",\n        \"ldrb w23, [x28, #1016]\",\n        \"and w23, w23, #0xfffffffe\",\n        \"mrs x12, nzcv\",\n        \"cmp x21, #0x0 (0)\",\n        \"csel x21, x23, x22, eq\",\n        \"strb w21, [x28, #1016]\",\n        \"strh w20, [x28, #964]\",\n        \"ubfx w21, w20, #2, #1\",\n        \"and w20, w20, #0xfff8\",\n        \"add x0, x28, x21, lsl #3\",\n        \"ldr x21, [x0, #1184]\",\n        \"ldr x20, [x21, w20, uxtw]\",\n        \"lsr x21, x20, #32\",\n        \"and w22, w21, #0xff000000\",\n        \"orr w20, w22, w20, lsr #16\",\n        \"bfi w20, w21, #16, #8\",\n        \"str w20, [x28, #984]\",\n        \"msr nzcv, x12\"\n      ]\n    },\n    \"push ds\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x1e\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #966]\",\n        \"str w20, [x8, #-4]!\"\n      ]\n    },\n    \"pop ds\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x1f\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x8], #4\",\n        \"strh w20, [x28, #966]\",\n        \"ubfx w21, w20, #2, #1\",\n        \"and w20, w20, #0xfff8\",\n        \"add x0, x28, x21, lsl #3\",\n        \"ldr x21, [x0, #1184]\",\n        \"ldr x20, [x21, w20, uxtw]\",\n        \"lsr x21, x20, #32\",\n        \"and w22, w21, #0xff000000\",\n        \"orr w20, w22, w20, lsr #16\",\n        \"bfi w20, w21, #16, #8\",\n        \"str w20, [x28, #988]\"\n      ]\n    },\n    \"daa\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": \"0x27\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"cset x21, hs\",\n        \"and x22, x20, #0xf\",\n        \"cmp x22, #0x9 (9)\",\n        \"cset x22, hi\",\n        \"eor x23, x27, x26\",\n        \"ubfx w23, w23, #4, #1\",\n        \"orr x22, x23, x22\",\n        \"cmp x20, #0x99 (153)\",\n        \"cset x23, ls\",\n        \"and x21, x21, x23\",\n        \"add x23, x20, #0x6 (6)\",\n        \"cmp x22, #0x0 (0)\",\n        \"csel x20, x23, x20, ne\",\n        \"add x23, x20, #0x60 (96)\",\n        \"cmp x21, #0x0 (0)\",\n        \"csel x26, x23, x20, eq\",\n        \"bfxil x4, x26, #0, #8\",\n        \"cmn wzr, w26, lsl #24\",\n        \"rmif x21, #63, #nzCv\",\n        \"eor w27, w26, w22, lsl #4\"\n      ]\n    },\n    \"das\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": \"0x2f\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"cset x21, lo\",\n        \"and x22, x20, #0xf\",\n        \"cmp x22, #0x9 (9)\",\n        \"cset x22, hi\",\n        \"eor x23, x27, x26\",\n        \"ubfx w23, w23, #4, #1\",\n        \"orr x22, x23, x22\",\n        \"cmp x20, #0x99 (153)\",\n        \"cset x23, hi\",\n        \"orr x21, x21, x23\",\n        \"cmp x20, #0x6 (6)\",\n        \"csel x23, x22, x21, lo\",\n        \"orr w23, w21, w23\",\n        \"sub x12, x20, #0x6 (6)\",\n        \"cmp x22, #0x0 (0)\",\n        \"csel x20, x12, x20, ne\",\n        \"sub x12, x20, #0x60 (96)\",\n        \"cmp x21, #0x0 (0)\",\n        \"csel x26, x12, x20, ne\",\n        \"bfxil x4, x26, #0, #8\",\n        \"cmn wzr, w26, lsl #24\",\n        \"eor x20, x23, #0x1\",\n        \"rmif x20, #63, #nzCv\",\n        \"eor w27, w26, w22, lsl #4\"\n      ]\n    },\n    \"aaa\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"0x37\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x4, #0xf\",\n        \"cmp x20, #0x9 (9)\",\n        \"cset x20, hi\",\n        \"eor x21, x27, x26\",\n        \"ubfx w21, w21, #4, #1\",\n        \"orr x20, x21, x20\",\n        \"cmp wzr, w20\",\n        \"eor w27, w26, w20, lsl #4\",\n        \"add w20, w4, #0x106 (262)\",\n        \"csel w20, w20, w4, lo\",\n        \"mov w21, #0xff0f\",\n        \"and w20, w20, w21\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"aas\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"0x3f\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x4, #0xf\",\n        \"cmp x20, #0x9 (9)\",\n        \"cset x20, hi\",\n        \"eor x21, x27, x26\",\n        \"ubfx w21, w21, #4, #1\",\n        \"orr x20, x21, x20\",\n        \"cmp wzr, w20\",\n        \"eor w27, w26, w20, lsl #4\",\n        \"sub w20, w4, #0x106 (262)\",\n        \"csel w20, w20, w4, lo\",\n        \"mov w21, #0xff0f\",\n        \"and w20, w20, w21\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"inc ax\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x40\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w27, w4\",\n        \"add w26, w27, #0x1 (1)\",\n        \"setf16 w26\",\n        \"bic w20, w26, w27\",\n        \"rmif x20, #15, #nzcV\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"inc eax\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x40\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hs\",\n        \"adds w26, w4, #0x1 (1)\",\n        \"rmif x20, #63, #nzCv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"dec ax\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x48\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w27, w4\",\n        \"sub w26, w27, #0x1 (1)\",\n        \"setf16 w26\",\n        \"bic w20, w27, w26\",\n        \"rmif x20, #15, #nzcV\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"push ax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x50\",\n      \"ExpectedArm64ASM\": [\n        \"strh w4, [x8, #-2]!\"\n      ]\n    },\n    \"push eax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x50\",\n      \"ExpectedArm64ASM\": [\n        \"str w4, [x8, #-4]!\"\n      ]\n    },\n    \"dec eax\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x48\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hs\",\n        \"subs w26, w4, #0x1 (1)\",\n        \"rmif x20, #63, #nzCv\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"pusha\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x60\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x8\",\n        \"stp w7, w4, [x8, #-8]!\",\n        \"stp w6, w5, [x8, #-8]!\",\n        \"stp w9, w20, [x8, #-8]!\",\n        \"stp w11, w10, [x8, #-8]!\"\n      ]\n    },\n    \"pushad\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x60\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x8\",\n        \"stp w7, w4, [x8, #-8]!\",\n        \"stp w6, w5, [x8, #-8]!\",\n        \"stp w9, w20, [x8, #-8]!\",\n        \"stp w11, w10, [x8, #-8]!\"\n      ]\n    },\n    \"popa\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x61\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x8\",\n        \"ldp w11, w10, [x20], #8\",\n        \"ldr w9, [x20], #4\",\n        \"add x20, x20, #0x4 (4)\",\n        \"mov x8, x20\",\n        \"ldp w6, w5, [x8], #8\",\n        \"ldp w7, w4, [x8], #8\"\n      ]\n    },\n    \"popad\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x61\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x8\",\n        \"ldp w11, w10, [x20], #8\",\n        \"ldr w9, [x20], #4\",\n        \"add x20, x20, #0x4 (4)\",\n        \"mov x8, x20\",\n        \"ldp w6, w5, [x8], #8\",\n        \"ldp w7, w4, [x8], #8\"\n      ]\n    },\n    \"o16 pushf\": {\n      \"ExpectedInstructionCount\": 39,\n      \"Comment\": \"0x9c\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"eor x21, x27, x26\",\n        \"ubfx w21, w21, #4, #1\",\n        \"orr x20, x20, x21, lsl #4\",\n        \"ldrb w21, [x28, #1016]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1017]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrsb x21, [x28, #1018]\",\n        \"lsr x21, x21, #63\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"cset x21, vs\",\n        \"orr x20, x20, x21, lsl #11\",\n        \"ldrb w21, [x28, #1020]\",\n        \"orr x20, x20, x21, lsl #12\",\n        \"ldrb w21, [x28, #1022]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1024]\",\n        \"orr x20, x20, x21, lsl #16\",\n        \"ldrb w21, [x28, #1025]\",\n        \"orr x20, x20, x21, lsl #17\",\n        \"ldrb w21, [x28, #1026]\",\n        \"orr x20, x20, x21, lsl #18\",\n        \"ldrb w21, [x28, #1027]\",\n        \"orr x20, x20, x21, lsl #19\",\n        \"ldrb w21, [x28, #1028]\",\n        \"orr x20, x20, x21, lsl #20\",\n        \"ldrb w21, [x28, #1029]\",\n        \"orr x20, x20, x21, lsl #21\",\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w21, w0, w0, lsr #1\",\n        \"orr x21, x21, #0xfffffffffffffffe\",\n        \"orn x20, x20, x21, ror #62\",\n        \"mrs x21, nzcv\",\n        \"and x21, x21, #0xc0000000\",\n        \"orr x20, x20, x21, lsr #24\",\n        \"orr x20, x20, #0x2\",\n        \"strh w20, [x8, #-2]!\"\n      ]\n    },\n    \"pushfd\": {\n      \"ExpectedInstructionCount\": 39,\n      \"Comment\": \"0x9c\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"eor x21, x27, x26\",\n        \"ubfx w21, w21, #4, #1\",\n        \"orr x20, x20, x21, lsl #4\",\n        \"ldrb w21, [x28, #1016]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1017]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrsb x21, [x28, #1018]\",\n        \"lsr x21, x21, #63\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"cset x21, vs\",\n        \"orr x20, x20, x21, lsl #11\",\n        \"ldrb w21, [x28, #1020]\",\n        \"orr x20, x20, x21, lsl #12\",\n        \"ldrb w21, [x28, #1022]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1024]\",\n        \"orr x20, x20, x21, lsl #16\",\n        \"ldrb w21, [x28, #1025]\",\n        \"orr x20, x20, x21, lsl #17\",\n        \"ldrb w21, [x28, #1026]\",\n        \"orr x20, x20, x21, lsl #18\",\n        \"ldrb w21, [x28, #1027]\",\n        \"orr x20, x20, x21, lsl #19\",\n        \"ldrb w21, [x28, #1028]\",\n        \"orr x20, x20, x21, lsl #20\",\n        \"ldrb w21, [x28, #1029]\",\n        \"orr x20, x20, x21, lsl #21\",\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w21, w0, w0, lsr #1\",\n        \"orr x21, x21, #0xfffffffffffffffe\",\n        \"orn x20, x20, x21, ror #62\",\n        \"mrs x21, nzcv\",\n        \"and x21, x21, #0xc0000000\",\n        \"orr x20, x20, x21, lsr #24\",\n        \"orr x20, x20, #0x2\",\n        \"str w20, [x8, #-4]!\"\n      ]\n    },\n    \"aam\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0xd4\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"mov w21, #0xa\",\n        \"udiv x22, x20, x21\",\n        \"msub x12, x22, x21, x20\",\n        \"add x26, x12, x22, lsl #8\",\n        \"bfxil x4, x26, #0, #16\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\"\n      ]\n    },\n    \"aad\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0xd5\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, #8\",\n        \"mov w21, #0xa\",\n        \"mul x20, x20, x21\",\n        \"add x20, x4, x20\",\n        \"and x26, x20, #0xff\",\n        \"bfxil x4, x26, #0, #16\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\"\n      ]\n    },\n    \"db 0xd4, 0x40\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"aam with a different immediate byte base\",\n        \"0xd4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"mov w21, #0x40\",\n        \"udiv x22, x20, x21\",\n        \"msub x12, x22, x21, x20\",\n        \"add x26, x12, x22, lsl #8\",\n        \"bfxil x4, x26, #0, #16\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\"\n      ]\n    },\n    \"db 0xd5, 0x40\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"aad with a different immediate byte base\",\n        \"0xd5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, #8\",\n        \"mov w21, #0x40\",\n        \"mul x20, x20, x21\",\n        \"add x20, x4, x20\",\n        \"and x26, x20, #0xff\",\n        \"bfxil x4, x26, #0, #16\",\n        \"cmn wzr, w26, lsl #24\",\n        \"cfinv\"\n      ]\n    },\n    \"salc\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xd6\",\n      \"ExpectedArm64ASM\": [\n        \"csetm w20, lo\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/Secondary.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"ucomiss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0f 0x2e\",\n      \"ExpectedArm64ASM\": [\n        \"fcmp s16, s17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"axflag\"\n      ]\n    },\n    \"comiss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0f 0x2f\",\n      \"ExpectedArm64ASM\": [\n        \"fcmp s16, s17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"axflag\"\n      ]\n    },\n    \"cmovo ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x40\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, vs\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovo eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x40\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, vs\"\n      ]\n    },\n    \"cmovo rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x40\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, vs\"\n      ]\n    },\n    \"cmovno ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x41\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, vc\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovno eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x41\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, vc\"\n      ]\n    },\n    \"cmovno rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x41\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, vc\"\n      ]\n    },\n    \"cmovb ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x42\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, lo\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovb eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x42\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, lo\"\n      ]\n    },\n    \"cmovb rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x42\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, lo\"\n      ]\n    },\n    \"cmovnb ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x43\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, hs\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovnb eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x43\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, hs\"\n      ]\n    },\n    \"cmovnb rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x43\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, hs\"\n      ]\n    },\n    \"cmovz ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x44\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, eq\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovz eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x44\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, eq\"\n      ]\n    },\n    \"cmovz rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x44\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, eq\"\n      ]\n    },\n    \"cmovnz ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x45\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, ne\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovnz eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x45\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, ne\"\n      ]\n    },\n    \"cmovnz rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x45\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, ne\"\n      ]\n    },\n    \"cmovbe ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x46\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, ls\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovbe eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x46\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, ls\"\n      ]\n    },\n    \"cmovbe rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x46\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, ls\"\n      ]\n    },\n    \"cmovnbe ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x47\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, hi\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovnbe eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x47\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, hi\"\n      ]\n    },\n    \"cmovnbe rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x47\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, hi\"\n      ]\n    },\n    \"cmovs ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x48\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, mi\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovs eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x48\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, mi\"\n      ]\n    },\n    \"cmovs rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x48\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, mi\"\n      ]\n    },\n    \"cmovns ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x49\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, pl\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovns eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x49\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, pl\"\n      ]\n    },\n    \"cmovns rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x49\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, pl\"\n      ]\n    },\n    \"cmovpe ax, bx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x4a\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"mrs x21, nzcv\",\n        \"tst w20, #0x1\",\n        \"csel w20, w6, w4, ne\",\n        \"bfxil x4, x20, #0, #16\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"cmovpe eax, ebx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0x4a\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"mrs x21, nzcv\",\n        \"tst w20, #0x1\",\n        \"csel w4, w6, w4, ne\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"cmovpe rax, rbx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0x4a\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"mrs x21, nzcv\",\n        \"tst w20, #0x1\",\n        \"csel x4, x6, x4, ne\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"cmovnp ax, bx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x4b\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"mrs x21, nzcv\",\n        \"tst w20, #0x1\",\n        \"csel w20, w6, w4, ne\",\n        \"bfxil x4, x20, #0, #16\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"cmovnp eax, ebx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0x4b\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"mrs x21, nzcv\",\n        \"tst w20, #0x1\",\n        \"csel w4, w6, w4, ne\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"cmovnp rax, rbx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0x4b\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"mrs x21, nzcv\",\n        \"tst w20, #0x1\",\n        \"csel x4, x6, x4, ne\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"cmovl ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x4c\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, lt\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovl eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4c\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, lt\"\n      ]\n    },\n    \"cmovl rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4c\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, lt\"\n      ]\n    },\n    \"cmovnl ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x4d\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, ge\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovnl eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4d\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, ge\"\n      ]\n    },\n    \"cmovnl rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4d\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, ge\"\n      ]\n    },\n    \"cmovle ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x4e\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, le\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovle eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4e\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, le\"\n      ]\n    },\n    \"cmovle rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4e\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, le\"\n      ]\n    },\n    \"cmovnle ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x4f\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, gt\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovnle eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4f\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, gt\"\n      ]\n    },\n    \"cmovnle rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4f\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, gt\"\n      ]\n    },\n    \"seto al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x90\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, vs\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setno al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x91\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, vc\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setb al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x92\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setnb al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x93\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hs\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setz al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x94\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, eq\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setnz al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x95\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, ne\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setbe al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x96\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, ls\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setnbe al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x97\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hi\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"sets al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x98\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, mi\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setns al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x99\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, pl\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setpe al\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0x9a\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"and w20, w20, #0x1\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setnp al\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0x9b\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"and w20, w20, #0x1\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setl al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x9c\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lt\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setnl al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x9d\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, ge\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setle al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x9e\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, le\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setnle al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x9f\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, gt\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"bt ax, bx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0f 0xa3\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x6, #0xf\",\n        \"lsr w20, w4, w20\",\n        \"rmif x20, #63, #nzCv\",\n        \"cfinv\"\n      ]\n    },\n    \"bt [rax], bx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0xa3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #13\",\n        \"ldrb w21, [x4, x21, sxtx]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bt eax, ebx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x0f 0xa3\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, w6\",\n        \"rmif x20, #63, #nzCv\",\n        \"cfinv\"\n      ]\n    },\n    \"bt [rax], ebx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0xa3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #29\",\n        \"ldrb w21, [x4, x21, sxtx]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bt rax, rbx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x0f 0xa3\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x20, x4, x6\",\n        \"rmif x20, #63, #nzCv\",\n        \"cfinv\"\n      ]\n    },\n    \"bt [rax], rbx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0xa3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"asr x21, x6, #3\",\n        \"ldrb w21, [x4, x21, sxtx]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"shld ax, bx, 1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"uxth w21, w4\",\n        \"lsl x22, x21, #1\",\n        \"lsr w20, w20, #15\",\n        \"orr x26, x22, x20\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x20, x21, #0x8000\",\n        \"rmif x20, #14, #nzCv\",\n        \"eor w20, w26, w21\",\n        \"rmif x20, #15, #nzcV\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"shld ax, bx, 15\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"uxth w21, w4\",\n        \"lsl x22, x21, #15\",\n        \"lsr w20, w20, #1\",\n        \"orr x26, x22, x20\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x20, x21, #0x2\",\n        \"rmif x20, #0, #nzCv\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"shld ax, bx, 16\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"uxth w21, w4\",\n        \"lsl x21, x21, #16\",\n        \"orr x26, x21, x20\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x4, x26, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"shld ax, bx, 31\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"uxth w21, w4\",\n        \"lsl x21, x21, #31\",\n        \"lsr w20, w20, #17\",\n        \"orr x26, x21, x20\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x4, x26, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"shld eax, ebx, 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr w26, w4, w6, #31\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x80000000\",\n        \"rmif x20, #30, #nzCv\",\n        \"eor w20, w26, w4\",\n        \"rmif x20, #31, #nzcV\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld eax, ebx, 15\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr w26, w4, w6, #17\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x20000\",\n        \"rmif x20, #16, #nzCv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld eax, ebx, 16\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr w26, w4, w6, #16\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x10000\",\n        \"rmif x20, #15, #nzCv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld eax, ebx, 31\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr w26, w4, w6, #1\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x2\",\n        \"rmif x20, #0, #nzCv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld rax, rbx, 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr x26, x4, x6, #63\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x8000000000000000\",\n        \"rmif x20, #62, #nzCv\",\n        \"eor x20, x26, x4\",\n        \"rmif x20, #63, #nzcV\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld rax, rbx, 15\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr x26, x4, x6, #49\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x2000000000000\",\n        \"rmif x20, #48, #nzCv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld rax, rbx, 32\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr x26, x4, x6, #32\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x100000000\",\n        \"rmif x20, #31, #nzCv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld rax, rbx, 63\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr x26, x4, x6, #1\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x2\",\n        \"rmif x20, #0, #nzCv\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld ax, bx, cl\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": \"0x0f 0xad\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"uxth w21, w4\",\n        \"and x22, x7, #0x1f\",\n        \"mov w23, #0x10\",\n        \"sub x23, x23, x22\",\n        \"lsl x24, x21, x22\",\n        \"lsr w20, w20, w23\",\n        \"orr x20, x24, x20\",\n        \"mrs x23, nzcv\",\n        \"cmp x22, #0x0 (0)\",\n        \"csel x20, x21, x20, eq\",\n        \"msr nzcv, x23\",\n        \"and w0, w22, #0x1f\",\n        \"cbz w0, #+0x1c\",\n        \"cmn wzr, w20, lsl #16\",\n        \"mov x26, x20\",\n        \"mvn x0, x20\",\n        \"eor w2, w21, w20\",\n        \"rmif x0, #15, #nzCv\",\n        \"rmif x2, #15, #nzcV\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"shld eax, ebx, cl\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": \"0x0f 0xad\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w4\",\n        \"and x21, x7, #0x1f\",\n        \"neg x22, x21\",\n        \"lsl x23, x20, x21\",\n        \"lsr w22, w6, w22\",\n        \"orr x22, x23, x22\",\n        \"mrs x23, nzcv\",\n        \"cmp x21, #0x0 (0)\",\n        \"csel x22, x20, x22, eq\",\n        \"msr nzcv, x23\",\n        \"and w0, w21, #0x1f\",\n        \"cbz w0, #+0x20\",\n        \"ands w26, w22, w22\",\n        \"neg w0, w21\",\n        \"lsr w0, w20, w0\",\n        \"mvn x0, x0\",\n        \"eor w2, w20, w22\",\n        \"rmif x0, #63, #nzCv\",\n        \"rmif x2, #31, #nzcV\",\n        \"mov w4, w22\"\n      ]\n    },\n    \"shld rax, rbx, cl\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"0x0f 0xad\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x3f\",\n        \"neg x21, x20\",\n        \"lsl x22, x4, x20\",\n        \"lsr x21, x6, x21\",\n        \"orr x21, x22, x21\",\n        \"mrs x22, nzcv\",\n        \"cmp x20, #0x0 (0)\",\n        \"csel x21, x4, x21, eq\",\n        \"msr nzcv, x22\",\n        \"and w0, w20, #0x3f\",\n        \"cbz x0, #+0x20\",\n        \"ands x26, x21, x21\",\n        \"neg x0, x20\",\n        \"lsr x0, x4, x0\",\n        \"mvn x0, x0\",\n        \"eor x2, x4, x21\",\n        \"rmif x0, #63, #nzCv\",\n        \"rmif x2, #63, #nzcV\",\n        \"mov x4, x21\"\n      ]\n    },\n    \"bts ax, bx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xab\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x6, #0xf\",\n        \"lsr w21, w4, w20\",\n        \"rmif x21, #63, #nzCv\",\n        \"mov w21, #0x1\",\n        \"lsl w20, w21, w20\",\n        \"orr w20, w4, w20\",\n        \"bfxil x4, x20, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"bts [rax], bx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xab\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #13\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"orr x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bts eax, ebx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0xab\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, w6\",\n        \"rmif x20, #63, #nzCv\",\n        \"mov w20, #0x1\",\n        \"lsl w20, w20, w6\",\n        \"orr w4, w4, w20\",\n        \"cfinv\"\n      ]\n    },\n    \"bts [rax], ebx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xab\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #29\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"orr x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bts rax, rbx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0xab\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x20, x4, x6\",\n        \"rmif x20, #63, #nzCv\",\n        \"mov w20, #0x1\",\n        \"lsl x20, x20, x6\",\n        \"orr x4, x4, x20\",\n        \"cfinv\"\n      ]\n    },\n    \"bts [rax], rbx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xab\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"asr x21, x6, #3\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"orr x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock bts [rax], bx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #13\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldsetalb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock bts [rax], ebx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #29\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldsetalb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock bts [rax], rbx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"asr x21, x6, #3\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldsetalb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"imul ax, bx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"sxth x20, w4\",\n        \"sxth x21, w6\",\n        \"mul x20, x20, x21\",\n        \"sbfx x21, x20, #16, #16\",\n        \"bfxil x4, x20, #0, #16\",\n        \"sbfx x20, x20, #15, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul eax, ebx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"smull x20, w4, w6\",\n        \"asr x20, x20, #32\",\n        \"mul w4, w4, w6\",\n        \"sbfx x21, x4, #31, #1\",\n        \"cmp x20, x21\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul rax, rbx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"smulh x20, x4, x6\",\n        \"mul x4, x4, x6\",\n        \"asr x21, x4, #63\",\n        \"cmp x20, x21\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul rsi, rax, 0xffffffff8646c299\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffc299\",\n        \"movk x20, #0x8646, lsl #16\",\n        \"smulh x21, x4, x20\",\n        \"mul x10, x4, x20\",\n        \"asr x20, x10, #63\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"cmpxchg cl, bl\": {\n      \"ExpectedInstructionCount\": 7,\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x4, x7\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w7, lsl #24\",\n        \"sub w26, w4, w7\",\n        \"bfxil x4, x7, #0, #8\",\n        \"csel x20, x6, x7, eq\",\n        \"bfxil x7, x20, #0, #8\"\n      ]\n    },\n    \"cmpxchg cx, bx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x4, x7\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w7, lsl #16\",\n        \"sub w26, w4, w7\",\n        \"bfxil x4, x7, #0, #16\",\n        \"csel x20, x6, x7, eq\",\n        \"bfxil x7, x20, #0, #16\"\n      ]\n    },\n    \"cmpxchg ecx, ebx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w7\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"csel x4, x4, x20, eq\",\n        \"mov w20, w6\",\n        \"csel x7, x20, x7, eq\"\n      ]\n    },\n    \"cmpxchg rcx, rbx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x4, x7\",\n        \"subs x26, x4, x7\",\n        \"csel x20, x6, x7, eq\",\n        \"mov x21, x7\",\n        \"mov x7, x20\",\n        \"mov x4, x21\"\n      ]\n    },\n    \"cmpxchg [rcx], rbx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0f 0xb1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"casal x4, x6, [x7]\",\n        \"eor x27, x20, x4\",\n        \"subs x26, x20, x4\"\n      ]\n    },\n    \"cmpxchg al, bl\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xb0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w27, #0x0\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w4, lsl #24\",\n        \"sub w26, w4, w4\",\n        \"bfxil x4, x6, #0, #8\"\n      ]\n    },\n    \"cmpxchg [rcx], bl\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xb0\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w6\",\n        \"uxtb x21, w4\",\n        \"mov w1, w4\",\n        \"casalb w1, w20, [x7]\",\n        \"mov w20, w1\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w21, w20\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"cmpxchg ax, bx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xb1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w27, #0x0\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w4, lsl #16\",\n        \"sub w26, w4, w4\",\n        \"bfxil x4, x6, #0, #16\"\n      ]\n    },\n    \"cmpxchg [rcx], bx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xb1\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"uxth x21, w4\",\n        \"mov w1, w4\",\n        \"casalh w1, w20, [x7]\",\n        \"mov w20, w1\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w21, w20\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmpxchg eax, ebx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x0f 0xb1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w27, #0x0\",\n        \"subs w26, w4, w4\",\n        \"mov x4, x6\"\n      ]\n    },\n    \"cmpxchg [rcx], ebx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xb1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w6\",\n        \"mov w21, w4\",\n        \"mov w1, w4\",\n        \"casal w1, w20, [x7]\",\n        \"mov w20, w1\",\n        \"eor x27, x21, x20\",\n        \"subs w26, w21, w20\",\n        \"csel x4, x4, x20, eq\"\n      ]\n    },\n    \"cmpxchg rax, rbx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x0f 0xb1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w27, #0x0\",\n        \"subs x26, x4, x4\",\n        \"mov x4, x6\"\n      ]\n    },\n    \"btr ax, bx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x6, #0xf\",\n        \"lsr w21, w4, w20\",\n        \"rmif x21, #63, #nzCv\",\n        \"mov w21, #0x1\",\n        \"lsl w20, w21, w20\",\n        \"bic w20, w4, w20\",\n        \"bfxil x4, x20, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"btr [rax], bx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #13\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"bic x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btr eax, ebx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, w6\",\n        \"rmif x20, #63, #nzCv\",\n        \"mov w20, #0x1\",\n        \"lsl w20, w20, w6\",\n        \"bic w4, w4, w20\",\n        \"cfinv\"\n      ]\n    },\n    \"btr [rax], ebx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #29\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"bic x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btr rax, rbx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x20, x4, x6\",\n        \"rmif x20, #63, #nzCv\",\n        \"mov w20, #0x1\",\n        \"lsl x20, x20, x6\",\n        \"bic x4, x4, x20\",\n        \"cfinv\"\n      ]\n    },\n    \"btr [rax], rbx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"asr x21, x6, #3\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"bic x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btr [rax], bx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #13\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldclralb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btr [rax], ebx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #29\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldclralb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btr [rax], rbx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"asr x21, x6, #3\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldclralb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btc ax, bx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xbb\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x6, #0xf\",\n        \"mov w21, #0x1\",\n        \"lsl w21, w21, w20\",\n        \"eor w21, w4, w21\",\n        \"lsr w20, w21, w20\",\n        \"rmif x20, #63, #nzCv\",\n        \"bfxil x4, x21, #0, #16\"\n      ]\n    },\n    \"btc [rax], bx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xbb\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #13\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"eor x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btc eax, ebx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xbb\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w20, w20, w6\",\n        \"eor w4, w4, w20\",\n        \"lsr w20, w4, w6\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btc [rax], ebx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xbb\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #29\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"eor x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btc rax, rbx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xbb\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl x20, x20, x6\",\n        \"eor x4, x4, x20\",\n        \"lsr x20, x4, x6\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btc [rax], rbx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xbb\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"asr x21, x6, #3\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"eor x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btc [rax], bx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #13\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldeoralb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btc [rax], ebx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #29\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldeoralb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btc [rax], rbx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"asr x21, x6, #3\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldeoralb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bsf ax, bx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xbc\",\n      \"ExpectedArm64ASM\": [\n        \"rbit w0, w6\",\n        \"clz w20, w0\",\n        \"tst w6, #0xffff\",\n        \"csel x20, x4, x20, eq\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"bsf eax, ebx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0f 0xbc\",\n      \"ExpectedArm64ASM\": [\n        \"rbit w0, w6\",\n        \"clz w20, w0\",\n        \"tst w6, w6\",\n        \"csel x4, x4, x20, eq\"\n      ]\n    },\n    \"bsf rax, rbx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0f 0xbc\",\n      \"ExpectedArm64ASM\": [\n        \"rbit x0, x6\",\n        \"clz x20, x0\",\n        \"tst x6, x6\",\n        \"csel x4, x4, x20, eq\"\n      ]\n    },\n    \"bsr ax, bx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xbd\",\n      \"ExpectedArm64ASM\": [\n        \"mov x0, #0xf\",\n        \"lsl w20, w6, #16\",\n        \"clz w20, w20\",\n        \"sub x20, x0, x20\",\n        \"tst w6, #0xffff\",\n        \"csel x20, x4, x20, eq\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"bsr eax, ebx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xbd\",\n      \"ExpectedArm64ASM\": [\n        \"mov x0, #0x1f\",\n        \"clz w20, w6\",\n        \"sub x20, x0, x20\",\n        \"tst w6, w6\",\n        \"csel x4, x4, x20, eq\"\n      ]\n    },\n    \"bsr rax, rbx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xbd\",\n      \"ExpectedArm64ASM\": [\n        \"mov x0, #0x3f\",\n        \"clz x20, x6\",\n        \"sub x20, x0, x20\",\n        \"tst x6, x6\",\n        \"csel x4, x4, x20, eq\"\n      ]\n    },\n    \"xadd al, bl\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xc0\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"uxtb w21, w6\",\n        \"eor x27, x20, x21\",\n        \"lsl w0, w20, #24\",\n        \"cmn w0, w21, lsl #24\",\n        \"add w26, w20, w21\",\n        \"bfxil x6, x20, #0, #8\",\n        \"bfxil x4, x26, #0, #8\",\n        \"cfinv\"\n      ]\n    },\n    \"xadd [rax], bl\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xc0\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w6\",\n        \"ldaddalb w20, w21, [x4]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w21, w20\",\n        \"bfxil x6, x21, #0, #8\",\n        \"cfinv\"\n      ]\n    },\n    \"xadd ax, bx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"uxth w21, w6\",\n        \"eor x27, x20, x21\",\n        \"lsl w0, w20, #16\",\n        \"cmn w0, w21, lsl #16\",\n        \"add w26, w20, w21\",\n        \"bfxil x6, x20, #0, #16\",\n        \"bfxil x4, x26, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"xadd [rax], bx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"ldaddalh w20, w21, [x4]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w21, w20\",\n        \"bfxil x6, x21, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"xadd eax, ebx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w4\",\n        \"mov w21, w6\",\n        \"eor x27, x20, x21\",\n        \"adds w26, w20, w21\",\n        \"cfinv\",\n        \"mov x6, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xadd [rax], ebx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w6\",\n        \"ldaddal w20, w6, [x4]\",\n        \"eor x27, x6, x20\",\n        \"adds w26, w6, w20\",\n        \"cfinv\"\n      ]\n    },\n    \"xadd rax, rbx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x4, x6\",\n        \"adds x26, x4, x6\",\n        \"cfinv\",\n        \"mov x6, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xadd [rax], rbx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"ldaddal x6, x20, [x4]\",\n        \"eor x27, x20, x6\",\n        \"adds x26, x20, x6\",\n        \"cfinv\",\n        \"mov x6, x20\"\n      ]\n    },\n    \"pmovmskb eax, mm0\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"0x0f 0xd7\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #3296]\",\n        \"cmlt v2.16b, v2.16b, #0\",\n        \"and v2.8b, v2.8b, v3.8b\",\n        \"addp v2.16b, v2.16b, v2.16b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"umov w4, v2.h[0]\"\n      ]\n    },\n    \"maskmovq mm0, mm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xf7\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"cmlt v2.16b, v2.16b, #0\",\n        \"ldr d3, [x28, #1056]\",\n        \"ldr d4, [x11]\",\n        \"bsl v2.8b, v3.8b, v4.8b\",\n        \"str d2, [x11]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/SecondaryGroup.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"RNG\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"sgdt [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP7 0x0F 0x1 /0\",\n      \"ExpectedArm64ASM\": [\n        \"strh wzr, [x4]\",\n        \"mov x20, #0xfffffffffffe0000\",\n        \"stur x20, [x4, #2]\"\n      ]\n    },\n    \"bt ax, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP8 0x0F 0xBA /4\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #63, #nzCv\",\n        \"cfinv\"\n      ]\n    },\n    \"bt eax, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP8 0x0F 0xBA /4\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #63, #nzCv\",\n        \"cfinv\"\n      ]\n    },\n    \"bt rax, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP8 0x0F 0xBA /4\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #63, #nzCv\",\n        \"cfinv\"\n      ]\n    },\n    \"bt ax, 15\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP8 0x0F 0xBA /4\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #14, #nzCv\",\n        \"cfinv\"\n      ]\n    },\n    \"bt eax, 31\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP8 0x0F 0xBA /4\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #30, #nzCv\",\n        \"cfinv\"\n      ]\n    },\n    \"bt rax, 63\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP8 0x0F 0xBA /4\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #62, #nzCv\",\n        \"cfinv\"\n      ]\n    },\n    \"bt word [rax], 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bt dword [rax], 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bt qword [rax], 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bt word [rax], 15\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #1]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bt dword [rax], 31\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #3]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bt qword [rax], 63\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #7]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bts ax, 0\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP8 0x0F 0xBA /5\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #63, #nzCv\",\n        \"orr w20, w4, #0x1\",\n        \"bfxil x4, x20, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"bts eax, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP8 0x0F 0xBA /5\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #63, #nzCv\",\n        \"orr w4, w4, #0x1\",\n        \"cfinv\"\n      ]\n    },\n    \"bts rax, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP8 0x0F 0xBA /5\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #63, #nzCv\",\n        \"orr x4, x4, #0x1\",\n        \"cfinv\"\n      ]\n    },\n    \"bts ax, 15\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP8 0x0F 0xBA /5\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #14, #nzCv\",\n        \"orr w20, w4, #0x8000\",\n        \"bfxil x4, x20, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"bts eax, 31\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP8 0x0F 0xBA /5\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #30, #nzCv\",\n        \"orr w4, w4, #0x80000000\",\n        \"cfinv\"\n      ]\n    },\n    \"bts rax, 63\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP8 0x0F 0xBA /5\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #62, #nzCv\",\n        \"orr x4, x4, #0x8000000000000000\",\n        \"cfinv\"\n      ]\n    },\n    \"bts word [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"orr x21, x20, #0x1\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bts dword [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"orr x21, x20, #0x1\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bts qword [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"orr x21, x20, #0x1\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bts word [rax], 15\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #1]\",\n        \"orr x21, x20, #0x80\",\n        \"strb w21, [x4, #1]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bts dword [rax], 31\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #3]\",\n        \"orr x21, x20, #0x80\",\n        \"strb w21, [x4, #3]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bts qword [rax], 63\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #7]\",\n        \"orr x21, x20, #0x80\",\n        \"strb w21, [x4, #7]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock bts word [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldsetalb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock bts dword [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldsetalb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock bts qword [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldsetalb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock bts word [rax], 15\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x1 (1)\",\n        \"ldsetalb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock bts dword [rax], 31\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x3 (3)\",\n        \"ldsetalb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock bts qword [rax], 63\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x7 (7)\",\n        \"ldsetalb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btr ax, 0\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #63, #nzCv\",\n        \"and w20, w4, #0xfffffffe\",\n        \"bfxil x4, x20, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"btr eax, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #63, #nzCv\",\n        \"and w4, w4, #0xfffffffe\",\n        \"cfinv\"\n      ]\n    },\n    \"btr rax, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #63, #nzCv\",\n        \"and x4, x4, #0xfffffffffffffffe\",\n        \"cfinv\"\n      ]\n    },\n    \"btr ax, 15\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #14, #nzCv\",\n        \"and w20, w4, #0xffff7fff\",\n        \"bfxil x4, x20, #0, #16\",\n        \"cfinv\"\n      ]\n    },\n    \"btr eax, 31\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #30, #nzCv\",\n        \"and w4, w4, #0x7fffffff\",\n        \"cfinv\"\n      ]\n    },\n    \"btr rax, 63\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"rmif x4, #62, #nzCv\",\n        \"and x4, x4, #0x7fffffffffffffff\",\n        \"cfinv\"\n      ]\n    },\n    \"btr word [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"and x21, x20, #0xfffffffffffffffe\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btr dword [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"and x21, x20, #0xfffffffffffffffe\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btr qword [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"and x21, x20, #0xfffffffffffffffe\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btr word [rax], 15\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #1]\",\n        \"and x21, x20, #0xffffffffffffff7f\",\n        \"strb w21, [x4, #1]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btr dword [rax], 31\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #3]\",\n        \"and x21, x20, #0xffffffffffffff7f\",\n        \"strb w21, [x4, #3]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btr qword [rax], 63\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #7]\",\n        \"and x21, x20, #0xffffffffffffff7f\",\n        \"strb w21, [x4, #7]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btr word [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldclralb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btr dword [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldclralb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btr qword [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldclralb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btr word [rax], 15\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x1 (1)\",\n        \"ldclralb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btr dword [rax], 31\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x3 (3)\",\n        \"ldclralb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btr qword [rax], 63\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x7 (7)\",\n        \"ldclralb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btc ax, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP8 0x0F 0xBA /7\",\n      \"ExpectedArm64ASM\": [\n        \"eor w20, w4, #0x1\",\n        \"rmif x20, #63, #nzCv\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"btc eax, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP8 0x0F 0xBA /7\",\n      \"ExpectedArm64ASM\": [\n        \"eor w4, w4, #0x1\",\n        \"rmif x4, #63, #nzCv\"\n      ]\n    },\n    \"btc rax, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP8 0x0F 0xBA /7\",\n      \"ExpectedArm64ASM\": [\n        \"eor x4, x4, #0x1\",\n        \"rmif x4, #63, #nzCv\"\n      ]\n    },\n    \"btc ax, 15\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP8 0x0F 0xBA /7\",\n      \"ExpectedArm64ASM\": [\n        \"eor w20, w4, #0x8000\",\n        \"rmif x20, #14, #nzCv\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"btc eax, 31\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP8 0x0F 0xBA /7\",\n      \"ExpectedArm64ASM\": [\n        \"eor w4, w4, #0x80000000\",\n        \"rmif x4, #30, #nzCv\"\n      ]\n    },\n    \"btc rax, 63\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP8 0x0F 0xBA /7\",\n      \"ExpectedArm64ASM\": [\n        \"eor x4, x4, #0x8000000000000000\",\n        \"rmif x4, #62, #nzCv\"\n      ]\n    },\n    \"btc word [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"eor x21, x20, #0x1\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btc dword [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"eor x21, x20, #0x1\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btc qword [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"eor x21, x20, #0x1\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btc word [rax], 15\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #1]\",\n        \"eor x21, x20, #0x80\",\n        \"strb w21, [x4, #1]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btc dword [rax], 31\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #3]\",\n        \"eor x21, x20, #0x80\",\n        \"strb w21, [x4, #3]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"btc qword [rax], 63\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #7]\",\n        \"eor x21, x20, #0x80\",\n        \"strb w21, [x4, #7]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btc word [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldeoralb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btc dword [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldeoralb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btc qword [rax], 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldeoralb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btc word [rax], 15\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x1 (1)\",\n        \"ldeoralb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btc dword [rax], 31\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x3 (3)\",\n        \"ldeoralb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"lock btc qword [rax], 63\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x7 (7)\",\n        \"ldeoralb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"cmpxchg8b [rbp]\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"mov x21, x5\",\n        \"caspal w20, w21, w6, w7, [x9]\",\n        \"mrs x0, nzcv\",\n        \"cmp w20, w4\",\n        \"ccmp w21, w5, #nzcv, eq\",\n        \"rmif x0, #0, #NzCV\",\n        \"csel x4, x20, x4, ne\",\n        \"csel x5, x21, x5, ne\"\n      ]\n    },\n    \"cmpxchg16b [rbp]\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"mov x21, x5\",\n        \"caspal x20, x21, x6, x7, [x9]\",\n        \"mrs x0, nzcv\",\n        \"cmp x20, x4\",\n        \"ccmp x21, x5, #nzcv, eq\",\n        \"rmif x0, #0, #NzCV\",\n        \"csel x4, x20, x4, ne\",\n        \"csel x5, x21, x5, ne\"\n      ]\n    },\n    \"rdrand ax\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, rndr\",\n        \"bfxil x4, x20, #0, #16\",\n        \"cset x20, eq\",\n        \"mov w26, #0x1\",\n        \"mov w27, #0x0\",\n        \"rmif x20, #63, #NZCV\"\n      ]\n    },\n    \"rdrand eax\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, rndr\",\n        \"mov w4, w20\",\n        \"cset x20, eq\",\n        \"mov w26, #0x1\",\n        \"mov w27, #0x0\",\n        \"rmif x20, #63, #NZCV\"\n      ]\n    },\n    \"rdrand rax\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x4, rndr\",\n        \"cset x20, eq\",\n        \"mov w26, #0x1\",\n        \"mov w27, #0x0\",\n        \"rmif x20, #63, #NZCV\"\n      ]\n    },\n    \"rdseed ax\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, rndrrs\",\n        \"bfxil x4, x20, #0, #16\",\n        \"cset x20, eq\",\n        \"mov w26, #0x1\",\n        \"mov w27, #0x0\",\n        \"rmif x20, #63, #NZCV\"\n      ]\n    },\n    \"rdseed eax\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, rndrrs\",\n        \"mov w4, w20\",\n        \"cset x20, eq\",\n        \"mov w26, #0x1\",\n        \"mov w27, #0x0\",\n        \"rmif x20, #63, #NZCV\"\n      ]\n    },\n    \"rdseed rax\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x4, rndrrs\",\n        \"cset x20, eq\",\n        \"mov w26, #0x1\",\n        \"mov w27, #0x0\",\n        \"rmif x20, #63, #NZCV\"\n      ]\n    },\n    \"psrlw mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrlw mm0, 15\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ushr v2.8h, v2.8h, #15\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrlw mm0, 16\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"movi v2.2d, #0x0\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrlw xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrlw xmm0, 15\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"ushr v16.8h, v16.8h, #15\"\n      ]\n    },\n    \"psrlw xmm0, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"psraw mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psraw mm0, 15\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"sshr v2.8h, v2.8h, #15\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psraw mm0, 16\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"sshr v2.8h, v2.8h, #15\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psraw xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psraw xmm0, 15\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.8h, v16.8h, #15\"\n      ]\n    },\n    \"psraw xmm0, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.8h, v16.8h, #15\"\n      ]\n    },\n    \"psllw mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psllw mm0, 15\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"shl v2.8h, v2.8h, #15\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psllw mm0, 16\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"movi v2.2d, #0x0\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psllw xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psllw xmm0, 15\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"shl v16.8h, v16.8h, #15\"\n      ]\n    },\n    \"psllw xmm0, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"psrld mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrld mm0, 31\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ushr v2.4s, v2.4s, #31\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrld mm0, 32\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"movi v2.2d, #0x0\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrld xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrld xmm0, 31\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"ushr v16.4s, v16.4s, #31\"\n      ]\n    },\n    \"psrld xmm0, 32\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"psrad mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrad mm0, 31\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"sshr v2.4s, v2.4s, #31\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrad mm0, 32\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"sshr v2.4s, v2.4s, #31\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrad xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrad xmm0, 31\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.4s, v16.4s, #31\"\n      ]\n    },\n    \"psrad xmm0, 32\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.4s, v16.4s, #31\"\n      ]\n    },\n    \"pslld mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"pslld mm0, 31\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"shl v2.4s, v2.4s, #31\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pslld mm0, 32\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"movi v2.2d, #0x0\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pslld xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"pslld xmm0, 31\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"shl v16.4s, v16.4s, #31\"\n      ]\n    },\n    \"pslld xmm0, 32\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"psrlq mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrlq mm0, 63\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ushr v2.2d, v2.2d, #63\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrlq mm0, 64\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"movi v2.2d, #0x0\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrlq xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrlq xmm0, 63\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"ushr v16.2d, v16.2d, #63\"\n      ]\n    },\n    \"psrlq xmm0, 64\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"psrldq xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrldq xmm0, 15\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ext v16.16b, v16.16b, v2.16b, #15\"\n      ]\n    },\n    \"psrldq xmm0, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"psllq mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psllq mm0, 63\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"shl v2.2d, v2.2d, #63\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psllq mm0, 64\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"movi v2.2d, #0x0\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psllq xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psllq xmm0, 63\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"shl v16.2d, v16.2d, #63\"\n      ]\n    },\n    \"psllq xmm0, 64\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"fxsave [rax]\": {\n      \"ExpectedInstructionCount\": 68,\n      \"Comment\": \"GROUP15 0x0F 0xAE /0\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #1200]\",\n        \"strh w20, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"strh w20, [x4, #2]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"strb w20, [x4, #4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #32]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #48]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #64]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #80]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #96]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #112]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #128]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #144]\",\n        \"stp q16, q17, [x4, #160]\",\n        \"stp q18, q19, [x4, #192]\",\n        \"stp q20, q21, [x4, #224]\",\n        \"stp q22, q23, [x4, #256]\",\n        \"stp q24, q25, [x4, #288]\",\n        \"stp q26, q27, [x4, #320]\",\n        \"stp q28, q29, [x4, #352]\",\n        \"stp q30, q31, [x4, #384]\",\n        \"ldr w20, [x28, #972]\",\n        \"and w20, w20, #0xffc0\",\n        \"mov w21, #0xffff\",\n        \"stp w20, w21, [x4, #24]\"\n      ]\n    },\n    \"rdfsbase eax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /0\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x28, #1000]\"\n      ]\n    },\n    \"rdfsbase rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /0\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x4, [x28, #1000]\"\n      ]\n    },\n    \"fxrstor [rax]\": {\n      \"ExpectedInstructionCount\": 48,\n      \"Comment\": \"GROUP15 0x0F 0xAE /1\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"strh w20, [x28, #1200]\",\n        \"ldrh w20, [x4, #2]\",\n        \"ubfx w21, w20, #11, #3\",\n        \"strb w21, [x28, #1051]\",\n        \"ubfx w21, w20, #8, #1\",\n        \"ubfx w22, w20, #9, #1\",\n        \"ubfx w23, w20, #10, #1\",\n        \"ubfx w24, w20, #14, #1\",\n        \"ubfx w20, w20, #0, #1\",\n        \"strb w21, [x28, #1048]\",\n        \"strb w22, [x28, #1049]\",\n        \"strb w23, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\",\n        \"ldrb w20, [x4, #4]\",\n        \"strb w20, [x28, #1202]\",\n        \"ldp q2, q3, [x4, #32]\",\n        \"str q2, [x28, #1056]\",\n        \"str q3, [x28, #1072]\",\n        \"ldp q2, q3, [x4, #64]\",\n        \"str q2, [x28, #1088]\",\n        \"str q3, [x28, #1104]\",\n        \"ldp q2, q3, [x4, #96]\",\n        \"str q2, [x28, #1120]\",\n        \"str q3, [x28, #1136]\",\n        \"ldp q2, q3, [x4, #128]\",\n        \"str q2, [x28, #1152]\",\n        \"str q3, [x28, #1168]\",\n        \"ldp q16, q17, [x4, #160]\",\n        \"ldp q18, q19, [x4, #192]\",\n        \"ldp q20, q21, [x4, #224]\",\n        \"ldp q22, q23, [x4, #256]\",\n        \"ldp q24, q25, [x4, #288]\",\n        \"ldp q26, q27, [x4, #320]\",\n        \"ldp q28, q29, [x4, #352]\",\n        \"ldp q30, q31, [x4, #384]\",\n        \"ldr w20, [x4, #24]\",\n        \"and w20, w20, #0xffc0\",\n        \"str w20, [x28, #972]\",\n        \"ubfx w21, w20, #13, #3\",\n        \"rbit w1, w21\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x21, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\"\n      ]\n    },\n    \"rdgsbase eax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /1\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x28, #992]\"\n      ]\n    },\n    \"rdgsbase rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /1\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x4, [x28, #992]\"\n      ]\n    },\n    \"ldmxcsr [rax]\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP15 0x0F 0xAE /2\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"and w20, w20, #0xffc0\",\n        \"str w20, [x28, #972]\",\n        \"ubfx w21, w20, #13, #3\",\n        \"rbit w1, w21\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x21, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\"\n      ]\n    },\n    \"wrfsbase eax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP15 0x0F 0xAE /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w4\",\n        \"str x20, [x28, #1000]\"\n      ]\n    },\n    \"wrfsbase rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /2\",\n      \"ExpectedArm64ASM\": [\n        \"str x4, [x28, #1000]\"\n      ]\n    },\n    \"stmxcsr [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP15 0x0F 0xAE /3\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x28, #972]\",\n        \"and w20, w20, #0xffc0\",\n        \"str w20, [x4]\"\n      ]\n    },\n    \"wrgsbase eax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP15 0x0F 0xAE /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w4\",\n        \"str x20, [x28, #992]\"\n      ]\n    },\n    \"wrgsbase rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /3\",\n      \"ExpectedArm64ASM\": [\n        \"str x4, [x28, #992]\"\n      ]\n    },\n    \"xsave [rax]\": {\n      \"ExpectedInstructionCount\": 98,\n      \"Comment\": \"GROUP15 0x0F 0xAE /4\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #0, #1\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0xe4\",\n        \"ldrh w20, [x28, #1200]\",\n        \"strh w20, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"strh w20, [x4, #2]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"strb w20, [x4, #4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #32]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #48]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #64]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #80]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #96]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #112]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #128]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #144]\",\n        \"ubfx x20, x4, #1, #1\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x24\",\n        \"stp q16, q17, [x4, #160]\",\n        \"stp q18, q19, [x4, #192]\",\n        \"stp q20, q21, [x4, #224]\",\n        \"stp q22, q23, [x4, #256]\",\n        \"stp q24, q25, [x4, #288]\",\n        \"stp q26, q27, [x4, #320]\",\n        \"stp q28, q29, [x4, #352]\",\n        \"stp q30, q31, [x4, #384]\",\n        \"ubfx x20, x4, #2, #1\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x44\",\n        \"ldp q2, q3, [x28, #192]\",\n        \"stp q2, q3, [x4, #576]\",\n        \"ldp q2, q3, [x28, #224]\",\n        \"stp q2, q3, [x4, #608]\",\n        \"ldp q2, q3, [x28, #256]\",\n        \"stp q2, q3, [x4, #640]\",\n        \"ldp q2, q3, [x28, #288]\",\n        \"stp q2, q3, [x4, #672]\",\n        \"ldp q2, q3, [x28, #320]\",\n        \"stp q2, q3, [x4, #704]\",\n        \"ldp q2, q3, [x28, #352]\",\n        \"stp q2, q3, [x4, #736]\",\n        \"ldp q2, q3, [x28, #384]\",\n        \"stp q2, q3, [x4, #768]\",\n        \"ldp q2, q3, [x28, #416]\",\n        \"stp q2, q3, [x4, #800]\",\n        \"ubfx x20, x4, #1, #2\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x14\",\n        \"ldr w20, [x28, #972]\",\n        \"and w20, w20, #0xffc0\",\n        \"mov w21, #0xffff\",\n        \"stp w20, w21, [x4, #24]\",\n        \"ubfx x20, x4, #0, #3\",\n        \"str x20, [x4, #512]\"\n      ]\n    },\n    \"xsaveopt [rax]\": {\n      \"ExpectedInstructionCount\": 98,\n      \"Comment\": \"GROUP15 0x0F 0xAE /6\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #0, #1\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0xe4\",\n        \"ldrh w20, [x28, #1200]\",\n        \"strh w20, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"strh w20, [x4, #2]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"strb w20, [x4, #4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #32]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #48]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #64]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #80]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #96]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #112]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #128]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #144]\",\n        \"ubfx x20, x4, #1, #1\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x24\",\n        \"stp q16, q17, [x4, #160]\",\n        \"stp q18, q19, [x4, #192]\",\n        \"stp q20, q21, [x4, #224]\",\n        \"stp q22, q23, [x4, #256]\",\n        \"stp q24, q25, [x4, #288]\",\n        \"stp q26, q27, [x4, #320]\",\n        \"stp q28, q29, [x4, #352]\",\n        \"stp q30, q31, [x4, #384]\",\n        \"ubfx x20, x4, #2, #1\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x44\",\n        \"ldp q2, q3, [x28, #192]\",\n        \"stp q2, q3, [x4, #576]\",\n        \"ldp q2, q3, [x28, #224]\",\n        \"stp q2, q3, [x4, #608]\",\n        \"ldp q2, q3, [x28, #256]\",\n        \"stp q2, q3, [x4, #640]\",\n        \"ldp q2, q3, [x28, #288]\",\n        \"stp q2, q3, [x4, #672]\",\n        \"ldp q2, q3, [x28, #320]\",\n        \"stp q2, q3, [x4, #704]\",\n        \"ldp q2, q3, [x28, #352]\",\n        \"stp q2, q3, [x4, #736]\",\n        \"ldp q2, q3, [x28, #384]\",\n        \"stp q2, q3, [x4, #768]\",\n        \"ldp q2, q3, [x28, #416]\",\n        \"stp q2, q3, [x4, #800]\",\n        \"ubfx x20, x4, #1, #2\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x14\",\n        \"ldr w20, [x28, #972]\",\n        \"and w20, w20, #0xffc0\",\n        \"mov w21, #0xffff\",\n        \"stp w20, w21, [x4, #24]\",\n        \"ubfx x20, x4, #0, #3\",\n        \"str x20, [x4, #512]\"\n      ]\n    },\n    \"lfence\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /5\",\n      \"ExpectedArm64ASM\": [\n        \"dmb ld\"\n      ]\n    },\n    \"xrstor [rax]\": {\n      \"ExpectedInstructionCount\": 133,\n      \"Comment\": \"GROUP15 0x0F 0xAE /5\",\n      \"ExpectedArm64ASM\": [\n        \"sub sp, sp, #0x40 (64)\",\n        \"ldr x20, [x4, #512]\",\n        \"ubfx x20, x20, #0, #1\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x7c\",\n        \"ldrh w20, [x4]\",\n        \"strh w20, [x28, #1200]\",\n        \"ldrh w20, [x4, #2]\",\n        \"ubfx w21, w20, #11, #3\",\n        \"strb w21, [x28, #1051]\",\n        \"ubfx w21, w20, #8, #1\",\n        \"ubfx w22, w20, #9, #1\",\n        \"ubfx w23, w20, #10, #1\",\n        \"ubfx w24, w20, #14, #1\",\n        \"ubfx w20, w20, #0, #1\",\n        \"strb w21, [x28, #1048]\",\n        \"strb w22, [x28, #1049]\",\n        \"strb w23, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\",\n        \"ldrb w20, [x4, #4]\",\n        \"strb w20, [x28, #1202]\",\n        \"ldp q2, q3, [x4, #32]\",\n        \"str q2, [x28, #1056]\",\n        \"str q3, [x28, #1072]\",\n        \"ldp q2, q3, [x4, #64]\",\n        \"str q2, [x28, #1088]\",\n        \"str q3, [x28, #1104]\",\n        \"ldp q2, q3, [x4, #96]\",\n        \"str q2, [x28, #1120]\",\n        \"str q3, [x28, #1136]\",\n        \"ldp q2, q3, [x4, #128]\",\n        \"str q2, [x28, #1152]\",\n        \"str q3, [x28, #1168]\",\n        \"b #+0x4c\",\n        \"mov w20, #0x37f\",\n        \"strh w20, [x28, #1200]\",\n        \"strb wzr, [x28, #1051]\",\n        \"strb wzr, [x28, #1202]\",\n        \"strb wzr, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb wzr, [x28, #1054]\",\n        \"strb wzr, [x28, #1040]\",\n        \"movi v2.2d, #0x0\",\n        \"str q2, [x28, #1056]\",\n        \"str q2, [x28, #1072]\",\n        \"str q2, [x28, #1088]\",\n        \"str q2, [x28, #1104]\",\n        \"str q2, [x28, #1120]\",\n        \"str q2, [x28, #1136]\",\n        \"str q2, [x28, #1152]\",\n        \"str q2, [x28, #1168]\",\n        \"ldr x20, [x4, #512]\",\n        \"ubfx x20, x20, #1, #1\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x28\",\n        \"ldp q16, q17, [x4, #160]\",\n        \"ldp q18, q19, [x4, #192]\",\n        \"ldp q20, q21, [x4, #224]\",\n        \"ldp q22, q23, [x4, #256]\",\n        \"ldp q24, q25, [x4, #288]\",\n        \"ldp q26, q27, [x4, #320]\",\n        \"ldp q28, q29, [x4, #352]\",\n        \"ldp q30, q31, [x4, #384]\",\n        \"b #+0x44\",\n        \"movi v31.2d, #0x0\",\n        \"mov v30.16b, v31.16b\",\n        \"mov v29.16b, v31.16b\",\n        \"mov v28.16b, v31.16b\",\n        \"mov v27.16b, v31.16b\",\n        \"mov v26.16b, v31.16b\",\n        \"mov v25.16b, v31.16b\",\n        \"mov v24.16b, v31.16b\",\n        \"mov v23.16b, v31.16b\",\n        \"mov v22.16b, v31.16b\",\n        \"mov v21.16b, v31.16b\",\n        \"mov v20.16b, v31.16b\",\n        \"mov v19.16b, v31.16b\",\n        \"mov v18.16b, v31.16b\",\n        \"mov v17.16b, v31.16b\",\n        \"mov v16.16b, v31.16b\",\n        \"ldr x20, [x4, #512]\",\n        \"ubfx x20, x20, #2, #1\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x58\",\n        \"ldp q2, q3, [x4, #576]\",\n        \"ldp q4, q5, [x4, #608]\",\n        \"ldp q6, q7, [x4, #640]\",\n        \"ldp q8, q9, [x4, #672]\",\n        \"ldp q10, q11, [x4, #704]\",\n        \"ldp q12, q13, [x4, #736]\",\n        \"ldp q14, q15, [x4, #768]\",\n        \"str q2, [sp]\",\n        \"str q3, [sp, #32]\",\n        \"ldp q2, q3, [x4, #800]\",\n        \"stp q2, q3, [x28, #416]\",\n        \"stp q14, q15, [x28, #384]\",\n        \"stp q12, q13, [x28, #352]\",\n        \"stp q10, q11, [x28, #320]\",\n        \"stp q8, q9, [x28, #288]\",\n        \"stp q6, q7, [x28, #256]\",\n        \"stp q4, q5, [x28, #224]\",\n        \"ldr q2, [sp]\",\n        \"ldr q3, [sp, #32]\",\n        \"stp q2, q3, [x28, #192]\",\n        \"b #+0x28\",\n        \"movi v2.2d, #0x0\",\n        \"stp q2, q2, [x28, #416]\",\n        \"stp q2, q2, [x28, #384]\",\n        \"stp q2, q2, [x28, #352]\",\n        \"stp q2, q2, [x28, #320]\",\n        \"stp q2, q2, [x28, #288]\",\n        \"stp q2, q2, [x28, #256]\",\n        \"stp q2, q2, [x28, #224]\",\n        \"stp q2, q2, [x28, #192]\",\n        \"ldr x20, [x4, #512]\",\n        \"ubfx x20, x20, #1, #2\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x34\",\n        \"ldr w20, [x4, #24]\",\n        \"and w20, w20, #0xffc0\",\n        \"str w20, [x28, #972]\",\n        \"ubfx w21, w20, #13, #3\",\n        \"rbit w1, w21\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x21, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\",\n        \"b #+0x4\",\n        \"add sp, sp, #0x40 (64)\"\n      ]\n    },\n    \"mfence\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /6\",\n      \"ExpectedArm64ASM\": [\n        \"dmb sy\"\n      ]\n    },\n    \"clwb [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /6\",\n      \"ExpectedArm64ASM\": [\n        \"dc cvac, x4\"\n      ]\n    },\n    \"sfence\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /7\",\n      \"ExpectedArm64ASM\": [\n        \"dmb st\"\n      ]\n    },\n    \"clflush [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP15 0x0F 0xAE /7\",\n      \"ExpectedArm64ASM\": [\n        \"dc civac, x4\",\n        \"dsb ish\"\n      ]\n    },\n    \"clflushopt [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /7\",\n      \"ExpectedArm64ASM\": [\n        \"dc civac, x4\"\n      ]\n    },\n    \"prefetchnta [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"GROUP16 0x0F 0x18 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"prfm pldl1strm, [x4]\"\n      ]\n    },\n    \"prefetcht0 [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"GROUP16 0x0F 0x18 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"prfm pldl1keep, [x4]\"\n      ]\n    },\n    \"prefetcht1 [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"GROUP16 0x0F 0x18 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"prfm pldl2keep, [x4]\"\n      ]\n    },\n    \"prefetcht2 [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"GROUP16 0x0F 0x18 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"prfm pldl3keep, [x4]\"\n      ]\n    },\n    \"db 0x0f, 0x18, 0x20;\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"GROUP16 0x0F 0x18 /4\",\n        \"nop dword [rax]\",\n        \"NOP implementation\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"db 0x0f, 0x0d, 0x00\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"GROUPP 0x0F 0x0D /0\",\n        \"prefetch_exclusive [rax]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"prfm pldl1keep, [x4]\"\n      ]\n    },\n    \"prefetchw [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"GROUPP 0x0F 0x0D /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"prfm pstl1keep, [x4]\"\n      ]\n    },\n    \"prefetchwt1 [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"GROUPP 0x0F 0x0D /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"prfm pstl1keep, [x4]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/SecondaryModRM.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"CLZERO\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"xgetbv\": {\n      \"ExpectedInstructionCount\": 52,\n      \"Comment\": \"0xF 0x01 /2 RM-0\",\n      \"ExpectedArm64ASM\": [\n        \"sub sp, sp, #0xf0 (240)\",\n        \"mov x3, sp\",\n        \"st1 {v2.2d, v3.2d}, [x3], #32\",\n        \"st1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x3], #64\",\n        \"st1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x3], #64\",\n        \"st1 {v12.2d, v13.2d, v14.2d, v15.2d}, [x3], #64\",\n        \"stp x18, x30, [x3], #16\",\n        \"mrs x3, nzcv\",\n        \"str w3, [x28, #1032]\",\n        \"str x25, [x28, #176]\",\n        \"stp x4, x7, [x28, #32]\",\n        \"stp x5, x6, [x28, #48]\",\n        \"stp x8, x9, [x28, #64]\",\n        \"stp x10, x11, [x28, #80]\",\n        \"stp x12, x13, [x28, #96]\",\n        \"stp x14, x15, [x28, #112]\",\n        \"stp x16, x17, [x28, #128]\",\n        \"stp x19, x29, [x28, #144]\",\n        \"stp w26, w27, [x28, #16]\",\n        \"add x3, x28, #0x1c0 (448)\",\n        \"st1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x3], #64\",\n        \"st1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x3], #64\",\n        \"st1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x3], #64\",\n        \"st1 {v28.2d, v29.2d, v30.2d, v31.2d}, [x3], #64\",\n        \"mov w1, w7\",\n        \"ldr x0, [x28, #1544]\",\n        \"ldr x2, [x28, #1560]\",\n        \"blr x2\",\n        \"ldr x25, [x28, #176]\",\n        \"ldr w4, [x28, #1032]\",\n        \"msr nzcv, x4\",\n        \"add x4, x28, #0x1c0 (448)\",\n        \"ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x4], #64\",\n        \"ld1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x4], #64\",\n        \"ld1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x4], #64\",\n        \"ld1 {v28.2d, v29.2d, v30.2d, v31.2d}, [x4], #64\",\n        \"ldp x4, x7, [x28, #32]\",\n        \"ldp x5, x6, [x28, #48]\",\n        \"ldp x8, x9, [x28, #64]\",\n        \"ldp x10, x11, [x28, #80]\",\n        \"ldp x12, x13, [x28, #96]\",\n        \"ldp x14, x15, [x28, #112]\",\n        \"ldp x16, x17, [x28, #128]\",\n        \"ldp x19, x29, [x28, #144]\",\n        \"ldp w26, w27, [x28, #16]\",\n        \"ld1 {v2.2d, v3.2d}, [sp], #32\",\n        \"ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [sp], #64\",\n        \"ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [sp], #64\",\n        \"ld1 {v12.2d, v13.2d, v14.2d, v15.2d}, [sp], #64\",\n        \"ldp x18, x30, [sp], #16\",\n        \"mov w4, w0\",\n        \"lsr x5, x0, #32\"\n      ]\n    },\n    \"rdtscp\": {\n      \"Skip\": \"Yes\",\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": \"0xF 0x01 /7 RM-1\",\n      \"ExpectedArm64ASM\": [\n        \"dmb ld\",\n        \"mrs x20, S3_3_c14_c0_2\",\n        \"lsl w4, w20, #7\",\n        \"lsr x5, x20, #25\",\n        \"mrs x0, nzcv\",\n        \"str w0, [x28, #1000]\",\n        \"str x8, [x28, #312]\",\n        \"mov w0, #0x100\",\n        \"str x0, [x28, #1312]\",\n        \"sub sp, sp, #0x10 (16)\",\n        \"mov w8, #0xa8\",\n        \"mov x0, sp\",\n        \"add x1, sp, #0x4 (4)\",\n        \"svc #0x0\",\n        \"ldp w0, w1, [sp]\",\n        \"sub sp, sp, #0x10 (16)\",\n        \"ldr w8, [x28, #1000]\",\n        \"msr nzcv, x8\",\n        \"ldr x8, [x28, #312]\",\n        \"str xzr, [x28, #1312]\",\n        \"orr x7, x0, x1, lsl #12\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/Secondary_OpSize.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\",\n      \"FCMA\"\n    ]\n  },\n  \"Instructions\": {\n    \"ucomisd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x66 0x0f 0x2e\",\n      \"ExpectedArm64ASM\": [\n        \"fcmp d16, d17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"axflag\"\n      ]\n    },\n    \"comisd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x66 0x0f 0x2f\",\n      \"ExpectedArm64ASM\": [\n        \"fcmp d16, d17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"axflag\"\n      ]\n    },\n    \"pmovmskb eax, xmm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x66 0x0f 0xd7\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3296]\",\n        \"cmlt v3.16b, v16.16b, #0\",\n        \"and v2.16b, v3.16b, v2.16b\",\n        \"addp v2.16b, v2.16b, v2.16b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"umov w4, v2.h[0]\"\n      ]\n    },\n    \"maskmovdqu xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x66 0x0f 0xf7\",\n      \"ExpectedArm64ASM\": [\n        \"cmlt v2.16b, v17.16b, #0\",\n        \"ldr q3, [x11]\",\n        \"bsl v2.16b, v16.16b, v3.16b\",\n        \"str q2, [x11]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/Secondary_REP.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\",\n      \"AFP\",\n      \"CSSC\"\n    ]\n  },\n  \"Instructions\": {\n    \"popcnt ax, bx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0xf3 0x0f 0xb8\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"fmov s0, w20\",\n        \"cnt v0.8b, v0.8b\",\n        \"addp v0.8b, v0.8b, v0.8b\",\n        \"umov w20, v0.b[0]\",\n        \"bfxil x4, x20, #0, #16\",\n        \"mov w27, #0x0\",\n        \"cmp w20, #0x0 (0)\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"popcnt eax, ebx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xf3 0x0f 0xb8\",\n      \"ExpectedArm64ASM\": [\n        \"fmov s0, w6\",\n        \"cnt v0.8b, v0.8b\",\n        \"addv b0, v0.8b\",\n        \"umov w4, v0.b[0]\",\n        \"mov w27, #0x0\",\n        \"cmp w4, #0x0 (0)\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"popcnt rax, rbx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xf3 0x0f 0xb8\",\n      \"ExpectedArm64ASM\": [\n        \"fmov d0, x6\",\n        \"cnt v0.8b, v0.8b\",\n        \"addv b0, v0.8b\",\n        \"umov w4, v0.b[0]\",\n        \"mov w27, #0x0\",\n        \"cmp w4, #0x0 (0)\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"tzcnt ax, bx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xf3 0x0f 0xbc\",\n      \"ExpectedArm64ASM\": [\n        \"rbit w20, w6\",\n        \"orr w20, w20, #0x8000\",\n        \"clz w20, w20\",\n        \"bfxil x4, x20, #0, #16\",\n        \"cmn wzr, w20, lsl #16\",\n        \"eor x20, x20, #0x10\",\n        \"rmif x20, #3, #nzCv\"\n      ]\n    },\n    \"tzcnt eax, ebx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0xf3 0x0f 0xbc\",\n      \"ExpectedArm64ASM\": [\n        \"rbit w4, w6\",\n        \"clz w4, w4\",\n        \"cmp w4, #0x0 (0)\",\n        \"eor x20, x4, #0x20\",\n        \"rmif x20, #4, #nzCv\"\n      ]\n    },\n    \"tzcnt rax, rbx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0xf3 0x0f 0xbc\",\n      \"ExpectedArm64ASM\": [\n        \"rbit x4, x6\",\n        \"clz x4, x4\",\n        \"cmp x4, #0x0 (0)\",\n        \"eor x20, x4, #0x40\",\n        \"rmif x20, #5, #nzCv\"\n      ]\n    },\n    \"lzcnt ax, bx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xf3 0x0f 0xbd\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w20, w6, #16\",\n        \"orr w20, w20, #0x8000\",\n        \"clz w20, w20\",\n        \"bfxil x4, x20, #0, #16\",\n        \"cmn wzr, w20, lsl #16\",\n        \"eor x20, x20, #0x10\",\n        \"rmif x20, #3, #nzCv\"\n      ]\n    },\n    \"lzcnt eax, ebx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0xf3 0x0f 0xbd\",\n      \"ExpectedArm64ASM\": [\n        \"clz w4, w6\",\n        \"cmp w4, #0x0 (0)\",\n        \"eor x20, x4, #0x20\",\n        \"rmif x20, #4, #nzCv\"\n      ]\n    },\n    \"lzcnt rax, rbx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0xf3 0x0f 0xbd\",\n      \"ExpectedArm64ASM\": [\n        \"clz x4, x6\",\n        \"cmp x4, #0x0 (0)\",\n        \"eor x20, x4, #0x40\",\n        \"rmif x20, #5, #nzCv\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/Secondary_REP_CSSC.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"CSSC\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"popcnt ax, bx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0xf3 0x0f 0xb8\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"cnt w20, w20\",\n        \"bfxil x4, x20, #0, #16\",\n        \"mov w27, #0x0\",\n        \"cmp w20, #0x0 (0)\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"popcnt eax, ebx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0xf3 0x0f 0xb8\",\n      \"ExpectedArm64ASM\": [\n        \"cnt w4, w6\",\n        \"mov w27, #0x0\",\n        \"cmp w4, #0x0 (0)\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"popcnt rax, rbx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0xf3 0x0f 0xb8\",\n      \"ExpectedArm64ASM\": [\n        \"cnt x4, x6\",\n        \"mov w27, #0x0\",\n        \"cmp w4, #0x0 (0)\",\n        \"mov w26, #0x1\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/VEX_map1.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"FCMA\",\n      \"RPRES\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"vucomiss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0x2e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp s16, s17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"axflag\"\n      ]\n    },\n    \"vucomisd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x2e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp d16, d17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"axflag\"\n      ]\n    },\n    \"vcomiss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0x2f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp s16, s17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"axflag\"\n      ]\n    },\n    \"vcomisd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x2f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp d16, d17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"axflag\"\n      ]\n    },\n    \"vpmovmskb rax, xmm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b01 0xd7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3296]\",\n        \"cmlt v3.16b, v16.16b, #0\",\n        \"and v2.16b, v3.16b, v2.16b\",\n        \"addp v2.16b, v2.16b, v2.16b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"umov w4, v2.h[0]\"\n      ]\n    },\n    \"vpmovmskb rax, ymm0\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 1 0b01 0xd7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2496]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"mrs x0, nzcv\",\n        \"mov z0.d, #0\",\n        \"cmplt p0.b, p7/z, z16.b, #0\",\n        \"not z0.b, p0/m, z16.b\",\n        \"orr z0.b, p0/m, z0.b, z16.b\",\n        \"mov z3.d, z0.d\",\n        \"msr nzcv, x0\",\n        \"and z2.d, z3.d, z2.d\",\n        \"movprfx z0, z2\",\n        \"addp z0.b, p7/m, z0.b, z2.b\",\n        \"uzp1 z2.b, z0.b, z0.b\",\n        \"uzp2 z1.b, z0.b, z0.b\",\n        \"splice z2.d, p6, z2.d, z1.d\",\n        \"addp v2.16b, v2.16b, v2.16b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"mov w4, v2.s[0]\"\n      ]\n    },\n    \"vmaskmovdqu xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xf7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmlt v2.16b, v17.16b, #0\",\n        \"ldr q3, [x11]\",\n        \"bsl v2.16b, v16.16b, v3.16b\",\n        \"str q2, [x11]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/VEX_map2.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE256\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"AFP\",\n      \"SVEBITPERM\"\n    ]\n  },\n  \"Instructions\": {\n    \"vtestps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80000000\",\n        \"dup v2.4s, w20\",\n        \"and v3.16b, v17.16b, v16.16b\",\n        \"bic v4.16b, v17.16b, v16.16b\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"and v2.16b, v4.16b, v2.16b\",\n        \"umaxv h3, v3.8h\",\n        \"umaxv h2, v2.8h\",\n        \"umov w20, v3.h[0]\",\n        \"umov w21, v2.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"rmif x21, #63, #nzCv\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"vtestps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x0e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80000000\",\n        \"mov z2.s, w20\",\n        \"and z3.d, z17.d, z16.d\",\n        \"bic z4.d, z17.d, z16.d\",\n        \"and z3.d, z3.d, z2.d\",\n        \"and z2.d, z4.d, z2.d\",\n        \"umaxv h3, p7, z3.h\",\n        \"umaxv h2, p7, z2.h\",\n        \"umov w20, v3.h[0]\",\n        \"umov w21, v2.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"rmif x21, #63, #nzCv\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"vtestpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x0f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x8000000000000000\",\n        \"dup v2.2d, x20\",\n        \"and v3.16b, v17.16b, v16.16b\",\n        \"bic v4.16b, v17.16b, v16.16b\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"and v2.16b, v4.16b, v2.16b\",\n        \"umaxv h3, v3.8h\",\n        \"umaxv h2, v2.8h\",\n        \"umov w20, v3.h[0]\",\n        \"umov w21, v2.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"rmif x21, #63, #nzCv\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"vtestpd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x0f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x8000000000000000\",\n        \"mov z2.d, x20\",\n        \"and z3.d, z17.d, z16.d\",\n        \"bic z4.d, z17.d, z16.d\",\n        \"and z3.d, z3.d, z2.d\",\n        \"and z2.d, z4.d, z2.d\",\n        \"umaxv h3, p7, z3.h\",\n        \"umaxv h2, p7, z2.h\",\n        \"umov w20, v3.h[0]\",\n        \"umov w21, v2.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"rmif x21, #63, #nzCv\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"vptest xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and v2.16b, v16.16b, v17.16b\",\n        \"bic v3.16b, v17.16b, v16.16b\",\n        \"umaxv h2, v2.8h\",\n        \"umaxv h3, v3.8h\",\n        \"umov w20, v2.h[0]\",\n        \"umov w21, v3.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"rmif x21, #63, #nzCv\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"vptest ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b01 0x16 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and z2.d, z16.d, z17.d\",\n        \"bic z3.d, z17.d, z16.d\",\n        \"umaxv h2, p7, z2.h\",\n        \"umaxv h3, p7, z3.h\",\n        \"umov w20, v2.h[0]\",\n        \"umov w21, v3.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"rmif x21, #63, #nzCv\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"vmaskmovps xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z17.s, #0\",\n        \"ld1w {z2.s}, p0/z, [x4]\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovps ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x2c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p7/z, z17.s, #0\",\n        \"ld1w {z16.s}, p0/z, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovpd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z17.d, #0\",\n        \"ld1d {z2.d}, p0/z, [x4]\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovpd ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x2d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p7/z, z17.d, #0\",\n        \"ld1d {z16.d}, p0/z, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovps [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x2e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z16.s, #0\",\n        \"st1w {z17.s}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovps [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x2e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p7/z, z16.s, #0\",\n        \"st1w {z17.s}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovpd [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x2f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z16.d, #0\",\n        \"st1d {z17.d}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovpd [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x2f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p7/z, z16.d, #0\",\n        \"st1d {z17.d}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmaskmovd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z17.s, #0\",\n        \"ld1w {z2.s}, p0/z, [x4]\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmaskmovd ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p7/z, z17.s, #0\",\n        \"ld1w {z16.s}, p0/z, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmaskmovq xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z17.d, #0\",\n        \"ld1d {z2.d}, p0/z, [x4]\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmaskmovq ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p7/z, z17.d, #0\",\n        \"ld1d {z16.d}, p0/z, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmaskmovd [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z16.s, #0\",\n        \"st1w {z17.s}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmaskmovd [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p7/z, z16.s, #0\",\n        \"st1w {z17.s}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmaskmovq [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z16.d, #0\",\n        \"st1d {z17.d}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmaskmovq [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p7/z, z16.d, #0\",\n        \"st1d {z17.d}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"andn eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b00 0xf2 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"bic w4, w7, w6\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"andn rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b00 0xf2 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"bic x4, x7, x6\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"bzhi eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b00 0xf5 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"lsl w20, w20, w7\",\n        \"bic w20, w6, w20\",\n        \"tst x7, #0xe0\",\n        \"csel w4, w6, w20, ne\",\n        \"cset x20, eq\",\n        \"cmp w4, #0x0 (0)\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"bzhi rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 2 0b00 0xf5 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"lsl x20, x20, x7\",\n        \"bic x20, x6, x20\",\n        \"tst x7, #0xc0\",\n        \"csel x4, x6, x20, ne\",\n        \"cset x20, eq\",\n        \"cmp x4, #0x0 (0)\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"pdep eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b11 0xf5 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, x6\",\n        \"mov x1, x7\",\n        \"mov w4, #0x0\",\n        \"cbz w7, #+0x2c\",\n        \"neg w2, w1\",\n        \"and w2, w2, w1\",\n        \"sbfx w3, w0, #0, #1\",\n        \"eor w1, w1, w2\",\n        \"and w2, w3, w2\",\n        \"neg w3, w1\",\n        \"orr w4, w4, w2\",\n        \"lsr w0, w0, #1\",\n        \"and w2, w1, w3\",\n        \"cbnz w2, #-0x1c\"\n      ]\n    },\n    \"pdep rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b11 0xf5 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, x6\",\n        \"mov x1, x7\",\n        \"mov x4, #0x0\",\n        \"cbz x7, #+0x2c\",\n        \"neg x2, x1\",\n        \"and x2, x2, x1\",\n        \"sbfx x3, x0, #0, #1\",\n        \"eor x1, x1, x2\",\n        \"and x2, x3, x2\",\n        \"neg x3, x1\",\n        \"orr x4, x4, x2\",\n        \"lsr x0, x0, #1\",\n        \"and x2, x1, x3\",\n        \"cbnz x2, #-0x1c\"\n      ]\n    },\n    \"bextr eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b00 0xf7 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w7\",\n        \"lsr w21, w6, w20\",\n        \"mov w22, #0x0\",\n        \"cmp w20, #0x1f (31)\",\n        \"csel w20, w21, w22, ls\",\n        \"ubfx w21, w7, #8, #8\",\n        \"mov x22, #0xffffffffffffffff\",\n        \"lsl w22, w22, w21\",\n        \"bic w22, w20, w22\",\n        \"cmp w21, #0x1f (31)\",\n        \"csel w4, w22, w20, ls\",\n        \"cmp w4, #0x0 (0)\"\n      ]\n    },\n    \"bextr rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b00 0xf7 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtb x20, w7\",\n        \"lsr x21, x6, x20\",\n        \"mov w22, #0x0\",\n        \"cmp x20, #0x3f (63)\",\n        \"csel x20, x21, x22, ls\",\n        \"ubfx x21, x7, #8, #8\",\n        \"mov x22, #0xffffffffffffffff\",\n        \"lsl x22, x22, x21\",\n        \"bic x22, x20, x22\",\n        \"cmp x21, #0x3f (63)\",\n        \"csel x4, x22, x20, ls\",\n        \"cmp x4, #0x0 (0)\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/VEX_map_group.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE256\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"blsr eax, ebx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map group 17 0b001 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub w20, w6, #0x1 (1)\",\n        \"and w4, w20, w6\",\n        \"cmp x6, #0x0 (0)\",\n        \"cset x20, ne\",\n        \"cmp w4, #0x0 (0)\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"blsr rax, rbx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map group 17 0b001 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x6, #0x1 (1)\",\n        \"and x4, x20, x6\",\n        \"cmp x6, #0x0 (0)\",\n        \"cset x20, ne\",\n        \"cmp x4, #0x0 (0)\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"blsmsk eax, ebx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map group 17 0b010 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub w20, w6, #0x1 (1)\",\n        \"eor w4, w20, w6\",\n        \"cmp x6, #0x0 (0)\",\n        \"cset x20, ne\",\n        \"cmp w4, #0x0 (0)\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"blsmsk rax, rbx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map group 17 0b010 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x6, #0x1 (1)\",\n        \"eor x4, x20, x6\",\n        \"cmp x6, #0x0 (0)\",\n        \"cset x20, ne\",\n        \"cmp x4, #0x0 (0)\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"blsi eax, ebx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map group 17 0b011 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"neg w20, w6\",\n        \"and w4, w6, w20\",\n        \"cmp w4, #0x0 (0)\",\n        \"cset x20, eq\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    },\n    \"blsi rax, rbx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map group 17 0b011 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"neg x20, x6\",\n        \"and x4, x6, x20\",\n        \"cmp x4, #0x0 (0)\",\n        \"cset x20, eq\",\n        \"rmif x20, #63, #nzCv\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/x87-Crysis2Max-fmodel.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"Block1\": {\n      \"x86Insts\": [\n        \"push ebp\",\n        \"mov ebp,esp\",\n        \"sub esp,0x104\",\n        \"mov eax,dword  [ebp + 0x10]\",\n        \"fld dword  [eax]\",\n        \"mov ecx,dword  [0x100de354]\",\n        \"fadd dword  [eax + 0x7c]\",\n        \"fstp dword  [ebp + -0x80]\",\n        \"fld dword  [eax]\",\n        \"fsub dword  [eax + 0x7c]\",\n        \"fmul dword  [ecx]\",\n        \"fstp dword  [ebp + -0x4]\",\n        \"fld dword  [eax + 0x78]\",\n        \"fadd dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + -0x7c]\",\n        \"fld dword  [eax + 0x4]\",\n        \"fsub dword  [eax + 0x78]\",\n        \"fmul dword  [ecx + 0x4]\",\n        \"fstp dword  [ebp + -0x8]\",\n        \"fld dword  [eax + 0x74]\",\n        \"fadd dword  [eax + 0x8]\",\n        \"fstp dword  [ebp + -0x78]\",\n        \"fld dword  [eax + 0x8]\",\n        \"fsub dword  [eax + 0x74]\",\n        \"fmul dword  [ecx + 0x8]\",\n        \"fstp dword  [ebp + -0xc]\",\n        \"fld dword  [eax + 0x70]\",\n        \"fadd dword  [eax + 0xc]\",\n        \"fstp dword  [ebp + -0x74]\",\n        \"fld dword  [eax + 0xc]\",\n        \"fsub dword  [eax + 0x70]\",\n        \"fmul dword  [ecx + 0xc]\",\n        \"fstp dword  [ebp + -0x10]\",\n        \"fld dword  [eax + 0x6c]\",\n        \"fadd dword  [eax + 0x10]\",\n        \"fstp dword  [ebp + -0x70]\",\n        \"fld dword  [eax + 0x10]\",\n        \"fsub dword  [eax + 0x6c]\",\n        \"fmul dword  [ecx + 0x10]\",\n        \"fstp dword  [ebp + -0x14]\",\n        \"fld dword  [eax + 0x68]\",\n        \"fadd dword  [eax + 0x14]\",\n        \"fstp dword  [ebp + -0x6c]\",\n        \"fld dword  [eax + 0x14]\",\n        \"fsub dword  [eax + 0x68]\",\n        \"fmul dword  [ecx + 0x14]\",\n        \"fstp dword  [ebp + -0x18]\",\n        \"fld dword  [eax + 0x64]\",\n        \"fadd dword  [eax + 0x18]\",\n        \"fstp dword  [ebp + -0x68]\",\n        \"fld dword  [eax + 0x18]\",\n        \"fsub dword  [eax + 0x64]\",\n        \"fmul dword  [ecx + 0x18]\",\n        \"fstp dword  [ebp + -0x1c]\",\n        \"fld dword  [eax + 0x60]\",\n        \"fadd dword  [eax + 0x1c]\",\n        \"fstp dword  [ebp + -0x64]\",\n        \"fld dword  [eax + 0x1c]\",\n        \"fsub dword  [eax + 0x60]\",\n        \"fmul dword  [ecx + 0x1c]\",\n        \"fstp dword  [ebp + -0x20]\",\n        \"fld dword  [eax + 0x5c]\",\n        \"fadd dword  [eax + 0x20]\",\n        \"fstp dword  [ebp + -0x60]\",\n        \"fld dword  [eax + 0x20]\",\n        \"fsub dword  [eax + 0x5c]\",\n        \"fmul dword  [ecx + 0x20]\",\n        \"fstp dword  [ebp + -0x24]\",\n        \"fld dword  [eax + 0x58]\",\n        \"fadd dword  [eax + 0x24]\",\n        \"fstp dword  [ebp + -0x5c]\",\n        \"fld dword  [eax + 0x24]\",\n        \"fsub dword  [eax + 0x58]\",\n        \"fmul dword  [ecx + 0x24]\",\n        \"fstp dword  [ebp + -0x28]\",\n        \"fld dword  [eax + 0x54]\",\n        \"fadd dword  [eax + 0x28]\",\n        \"fstp dword  [ebp + -0x58]\",\n        \"fld dword  [eax + 0x28]\",\n        \"fsub dword  [eax + 0x54]\",\n        \"fmul dword  [ecx + 0x28]\",\n        \"fstp dword  [ebp + -0x2c]\",\n        \"fld dword  [eax + 0x50]\",\n        \"fadd dword  [eax + 0x2c]\",\n        \"fstp dword  [ebp + -0x54]\",\n        \"fld dword  [eax + 0x2c]\",\n        \"fsub dword  [eax + 0x50]\",\n        \"fmul dword  [ecx + 0x2c]\",\n        \"fstp dword  [ebp + -0x30]\",\n        \"fld dword  [eax + 0x4c]\",\n        \"fadd dword  [eax + 0x30]\",\n        \"fstp dword  [ebp + -0x50]\",\n        \"fld dword  [eax + 0x30]\",\n        \"fsub dword  [eax + 0x4c]\",\n        \"fmul dword  [ecx + 0x30]\",\n        \"fstp dword  [ebp + -0x34]\",\n        \"fld dword  [eax + 0x48]\",\n        \"fadd dword  [eax + 0x34]\",\n        \"fstp dword  [ebp + -0x4c]\",\n        \"fld dword  [eax + 0x34]\",\n        \"fsub dword  [eax + 0x48]\",\n        \"fmul dword  [ecx + 0x34]\",\n        \"fstp dword  [ebp + -0x38]\",\n        \"fld dword  [eax + 0x44]\",\n        \"fadd dword  [eax + 0x38]\",\n        \"fstp dword  [ebp + -0x48]\",\n        \"fld dword  [eax + 0x38]\",\n        \"fsub dword  [eax + 0x44]\",\n        \"fmul dword  [ecx + 0x38]\",\n        \"fstp dword  [ebp + -0x3c]\",\n        \"fld dword  [eax + 0x40]\",\n        \"fadd dword  [eax + 0x3c]\",\n        \"fstp dword  [ebp + -0x44]\",\n        \"fld dword  [eax + 0x3c]\",\n        \"fsub dword  [eax + 0x40]\",\n        \"mov eax,[0x100de358]\",\n        \"fmul dword  [ecx + 0x3c]\",\n        \"fstp dword  [ebp + -0x40]\",\n        \"fld dword  [ebp + -0x44]\",\n        \"fadd dword  [ebp + -0x80]\",\n        \"fstp dword  [ebp + 0xffffff00]\",\n        \"fld dword  [ebp + -0x80]\",\n        \"fsub dword  [ebp + -0x44]\",\n        \"fmul dword  [eax]\",\n        \"fstp dword  [ebp + 0xffffff3c]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"fadd dword  [ebp + -0x7c]\",\n        \"fstp dword  [ebp + 0xffffff04]\",\n        \"fld dword  [ebp + -0x7c]\",\n        \"fsub dword  [ebp + -0x48]\",\n        \"fmul dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + 0xffffff38]\",\n        \"fld dword  [ebp + -0x4c]\",\n        \"fadd dword  [ebp + -0x78]\",\n        \"fstp dword  [ebp + 0xffffff08]\",\n        \"fld dword  [ebp + -0x78]\",\n        \"fsub dword  [ebp + -0x4c]\",\n        \"fmul dword  [eax + 0x8]\",\n        \"fstp dword  [ebp + 0xffffff34]\",\n        \"fld dword  [ebp + -0x50]\",\n        \"fadd dword  [ebp + -0x74]\",\n        \"fstp dword  [ebp + 0xffffff0c]\",\n        \"fld dword  [ebp + -0x74]\",\n        \"fsub dword  [ebp + -0x50]\",\n        \"fmul dword  [eax + 0xc]\",\n        \"fstp dword  [ebp + 0xffffff30]\",\n        \"fld dword  [ebp + -0x54]\",\n        \"fadd dword  [ebp + -0x70]\",\n        \"fstp dword  [ebp + 0xffffff10]\",\n        \"fld dword  [ebp + -0x70]\",\n        \"fsub dword  [ebp + -0x54]\",\n        \"fmul dword  [eax + 0x10]\",\n        \"fstp dword  [ebp + 0xffffff2c]\",\n        \"fld dword  [ebp + -0x58]\",\n        \"fadd dword  [ebp + -0x6c]\",\n        \"fstp dword  [ebp + 0xffffff14]\",\n        \"fld dword  [ebp + -0x6c]\",\n        \"fsub dword  [ebp + -0x58]\",\n        \"fmul dword  [eax + 0x14]\",\n        \"fstp dword  [ebp + 0xffffff28]\",\n        \"fld dword  [ebp + -0x5c]\",\n        \"fadd dword  [ebp + -0x68]\",\n        \"fstp dword  [ebp + 0xffffff18]\",\n        \"fld dword  [ebp + -0x68]\",\n        \"fsub dword  [ebp + -0x5c]\",\n        \"fmul dword  [eax + 0x18]\",\n        \"fstp dword  [ebp + 0xffffff24]\",\n        \"fld dword  [ebp + -0x60]\",\n        \"fadd dword  [ebp + -0x64]\",\n        \"fstp dword  [ebp + 0xffffff1c]\",\n        \"fld dword  [ebp + -0x64]\",\n        \"fsub dword  [ebp + -0x60]\",\n        \"fmul dword  [eax + 0x1c]\",\n        \"fstp dword  [ebp + 0xffffff20]\",\n        \"fld dword  [ebp + -0x40]\",\n        \"fadd dword  [ebp + -0x4]\",\n        \"fstp dword  [ebp + 0xffffff40]\",\n        \"fld dword  [ebp + -0x4]\",\n        \"fsub dword  [ebp + -0x40]\",\n        \"fmul dword  [eax]\",\n        \"fstp dword  [ebp + 0xffffff7c]\",\n        \"fld dword  [ebp + -0x3c]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [ebp + 0xffffff44]\",\n        \"fld dword  [ebp + -0x8]\",\n        \"fsub dword  [ebp + -0x3c]\",\n        \"fmul dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + 0xffffff78]\",\n        \"fld dword  [ebp + -0x38]\",\n        \"fadd dword  [ebp + -0xc]\",\n        \"fstp dword  [ebp + 0xffffff48]\",\n        \"fld dword  [ebp + -0xc]\",\n        \"fsub dword  [ebp + -0x38]\",\n        \"fmul dword  [eax + 0x8]\",\n        \"fstp dword  [ebp + 0xffffff74]\",\n        \"fld dword  [ebp + -0x34]\",\n        \"fadd dword  [ebp + -0x10]\",\n        \"fstp dword  [ebp + 0xffffff4c]\",\n        \"fld dword  [ebp + -0x10]\",\n        \"fsub dword  [ebp + -0x34]\",\n        \"fmul dword  [eax + 0xc]\",\n        \"fstp dword  [ebp + 0xffffff70]\",\n        \"fld dword  [ebp + -0x30]\",\n        \"fadd dword  [ebp + -0x14]\",\n        \"fstp dword  [ebp + 0xffffff50]\",\n        \"fld dword  [ebp + -0x14]\",\n        \"fsub dword  [ebp + -0x30]\",\n        \"fmul dword  [eax + 0x10]\",\n        \"fstp dword  [ebp + 0xffffff6c]\",\n        \"fld dword  [ebp + -0x2c]\",\n        \"fadd dword  [ebp + -0x18]\",\n        \"fstp dword  [ebp + 0xffffff54]\",\n        \"fld dword  [ebp + -0x18]\",\n        \"fsub dword  [ebp + -0x2c]\",\n        \"fmul dword  [eax + 0x14]\",\n        \"fstp dword  [ebp + 0xffffff68]\",\n        \"fld dword  [ebp + -0x28]\",\n        \"fadd dword  [ebp + -0x1c]\",\n        \"fstp dword  [ebp + 0xffffff58]\",\n        \"fld dword  [ebp + -0x1c]\",\n        \"fsub dword  [ebp + -0x28]\",\n        \"fmul dword  [eax + 0x18]\",\n        \"fstp dword  [ebp + 0xffffff64]\",\n        \"fld dword  [ebp + -0x24]\",\n        \"fadd dword  [ebp + -0x20]\",\n        \"fstp dword  [ebp + 0xffffff5c]\",\n        \"fld dword  [ebp + -0x20]\",\n        \"fsub dword  [ebp + -0x24]\",\n        \"fmul dword  [eax + 0x1c]\",\n        \"mov eax,[0x100de35c]\",\n        \"fstp dword  [ebp + 0xffffff60]\",\n        \"fld dword  [ebp + 0xffffff1c]\",\n        \"fadd dword  [ebp + 0xffffff00]\",\n        \"fstp dword  [ebp + -0x80]\",\n        \"fld dword  [ebp + 0xffffff00]\",\n        \"fsub dword  [ebp + 0xffffff1c]\",\n        \"fmul dword  [eax]\",\n        \"fstp dword  [ebp + -0x64]\",\n        \"fld dword  [ebp + 0xffffff18]\",\n        \"fadd dword  [ebp + 0xffffff04]\",\n        \"fstp dword  [ebp + -0x7c]\",\n        \"fld dword  [ebp + 0xffffff04]\",\n        \"fsub dword  [ebp + 0xffffff18]\",\n        \"fmul dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + -0x68]\",\n        \"fld dword  [ebp + 0xffffff14]\",\n        \"fadd dword  [ebp + 0xffffff08]\",\n        \"fstp dword  [ebp + -0x78]\",\n        \"fld dword  [ebp + 0xffffff08]\",\n        \"fsub dword  [ebp + 0xffffff14]\",\n        \"fmul dword  [eax + 0x8]\",\n        \"fstp dword  [ebp + -0x6c]\",\n        \"fld dword  [ebp + 0xffffff10]\",\n        \"fadd dword  [ebp + 0xffffff0c]\",\n        \"fstp dword  [ebp + -0x74]\",\n        \"fld dword  [ebp + 0xffffff0c]\",\n        \"fsub dword  [ebp + 0xffffff10]\",\n        \"fmul dword  [eax + 0xc]\",\n        \"fstp dword  [ebp + -0x70]\",\n        \"fld dword  [ebp + 0xffffff20]\",\n        \"fadd dword  [ebp + 0xffffff3c]\",\n        \"fstp dword  [ebp + -0x60]\",\n        \"fld dword  [ebp + 0xffffff3c]\",\n        \"fsub dword  [ebp + 0xffffff20]\",\n        \"fmul dword  [eax]\",\n        \"fstp dword  [ebp + -0x44]\",\n        \"fld dword  [ebp + 0xffffff24]\",\n        \"fadd dword  [ebp + 0xffffff38]\",\n        \"fstp dword  [ebp + -0x5c]\",\n        \"fld dword  [ebp + 0xffffff38]\",\n        \"fsub dword  [ebp + 0xffffff24]\",\n        \"fmul dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + -0x48]\",\n        \"fld dword  [ebp + 0xffffff28]\",\n        \"fadd dword  [ebp + 0xffffff34]\",\n        \"fstp dword  [ebp + -0x58]\",\n        \"fld dword  [ebp + 0xffffff34]\",\n        \"fsub dword  [ebp + 0xffffff28]\",\n        \"fmul dword  [eax + 0x8]\",\n        \"fstp dword  [ebp + -0x4c]\",\n        \"fld dword  [ebp + 0xffffff2c]\",\n        \"fadd dword  [ebp + 0xffffff30]\",\n        \"fstp dword  [ebp + -0x54]\",\n        \"fld dword  [ebp + 0xffffff30]\",\n        \"fsub dword  [ebp + 0xffffff2c]\",\n        \"fmul dword  [eax + 0xc]\",\n        \"fstp dword  [ebp + -0x50]\",\n        \"fld dword  [ebp + 0xffffff5c]\",\n        \"fadd dword  [ebp + 0xffffff40]\",\n        \"fstp dword  [ebp + -0x40]\",\n        \"fld dword  [ebp + 0xffffff40]\",\n        \"fsub dword  [ebp + 0xffffff5c]\",\n        \"fmul dword  [eax]\",\n        \"fstp dword  [ebp + -0x24]\",\n        \"fld dword  [ebp + 0xffffff58]\",\n        \"fadd dword  [ebp + 0xffffff44]\",\n        \"fstp dword  [ebp + -0x3c]\",\n        \"fld dword  [ebp + 0xffffff44]\",\n        \"fsub dword  [ebp + 0xffffff58]\",\n        \"fmul dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + -0x28]\",\n        \"fld dword  [ebp + 0xffffff54]\",\n        \"fadd dword  [ebp + 0xffffff48]\",\n        \"fstp dword  [ebp + -0x38]\",\n        \"fld dword  [ebp + 0xffffff48]\",\n        \"fsub dword  [ebp + 0xffffff54]\",\n        \"fmul dword  [eax + 0x8]\",\n        \"fstp dword  [ebp + -0x2c]\",\n        \"fld dword  [ebp + 0xffffff50]\",\n        \"fadd dword  [ebp + 0xffffff4c]\",\n        \"fstp dword  [ebp + -0x34]\",\n        \"fld dword  [ebp + 0xffffff4c]\",\n        \"fsub dword  [ebp + 0xffffff50]\",\n        \"fmul dword  [eax + 0xc]\",\n        \"fstp dword  [ebp + -0x30]\",\n        \"fld dword  [ebp + 0xffffff60]\",\n        \"fadd dword  [ebp + 0xffffff7c]\",\n        \"fstp dword  [ebp + -0x20]\",\n        \"fld dword  [ebp + 0xffffff7c]\",\n        \"fsub dword  [ebp + 0xffffff60]\",\n        \"fmul dword  [eax]\",\n        \"fstp dword  [ebp + -0x4]\",\n        \"fld dword  [ebp + 0xffffff64]\",\n        \"fadd dword  [ebp + 0xffffff78]\",\n        \"fstp dword  [ebp + -0x1c]\",\n        \"fld dword  [ebp + 0xffffff78]\",\n        \"fsub dword  [ebp + 0xffffff64]\",\n        \"fmul dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + -0x8]\",\n        \"fld dword  [ebp + 0xffffff68]\",\n        \"fadd dword  [ebp + 0xffffff74]\",\n        \"fstp dword  [ebp + -0x18]\",\n        \"fld dword  [ebp + 0xffffff74]\",\n        \"fsub dword  [ebp + 0xffffff68]\",\n        \"fmul dword  [eax + 0x8]\",\n        \"fstp dword  [ebp + -0xc]\",\n        \"fld dword  [ebp + 0xffffff6c]\",\n        \"fadd dword  [ebp + 0xffffff70]\",\n        \"fstp dword  [ebp + -0x14]\",\n        \"fld dword  [ebp + 0xffffff70]\",\n        \"fsub dword  [ebp + 0xffffff6c]\",\n        \"fmul dword  [eax + 0xc]\",\n        \"mov eax,[0x100de360]\",\n        \"fstp dword  [ebp + -0x10]\",\n        \"fld dword  [eax]\",\n        \"fstp dword  [ebp + 0x10]\",\n        \"fld dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + 0xfffffefc]\",\n        \"fld dword  [ebp + -0x74]\",\n        \"fadd dword  [ebp + -0x80]\",\n        \"fstp dword  [ebp + 0xffffff00]\",\n        \"fld dword  [ebp + -0x80]\",\n        \"fsub dword  [ebp + -0x74]\",\n        \"fld dword  [ebp + 0x10]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword  [ebp + 0xffffff0c]\",\n        \"fld dword  [ebp + -0x78]\",\n        \"fadd dword  [ebp + -0x7c]\",\n        \"fstp dword  [ebp + 0xffffff04]\",\n        \"fld dword  [ebp + -0x7c]\",\n        \"fsub dword  [ebp + -0x78]\",\n        \"fld dword  [ebp + 0xfffffefc]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword  [ebp + 0xffffff08]\",\n        \"fld dword  [ebp + -0x64]\",\n        \"fadd dword  [ebp + -0x70]\",\n        \"fstp dword  [ebp + 0xffffff10]\",\n        \"fld dword  [ebp + -0x64]\",\n        \"fsub dword  [ebp + -0x70]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff1c]\",\n        \"fld dword  [ebp + -0x68]\",\n        \"fadd dword  [ebp + -0x6c]\",\n        \"fstp dword  [ebp + 0xffffff14]\",\n        \"fld dword  [ebp + -0x68]\",\n        \"fsub dword  [ebp + -0x6c]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff18]\",\n        \"fld dword  [ebp + -0x54]\",\n        \"fadd dword  [ebp + -0x60]\",\n        \"fstp dword  [ebp + 0xffffff20]\",\n        \"fld dword  [ebp + -0x60]\",\n        \"fsub dword  [ebp + -0x54]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff2c]\",\n        \"fld dword  [ebp + -0x58]\",\n        \"fadd dword  [ebp + -0x5c]\",\n        \"fstp dword  [ebp + 0xffffff24]\",\n        \"fld dword  [ebp + -0x5c]\",\n        \"fsub dword  [ebp + -0x58]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff28]\",\n        \"fld dword  [ebp + -0x44]\",\n        \"fadd dword  [ebp + -0x50]\",\n        \"fstp dword  [ebp + 0xffffff30]\",\n        \"fld dword  [ebp + -0x44]\",\n        \"fsub dword  [ebp + -0x50]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff3c]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"mov eax,[0x100de364]\",\n        \"fadd dword  [ebp + -0x4c]\",\n        \"fstp dword  [ebp + 0xffffff34]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"fsub dword  [ebp + -0x4c]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff38]\",\n        \"fld dword  [ebp + -0x40]\",\n        \"fadd dword  [ebp + -0x34]\",\n        \"fstp dword  [ebp + 0xffffff40]\",\n        \"fld dword  [ebp + -0x40]\",\n        \"fsub dword  [ebp + -0x34]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff4c]\",\n        \"fld dword  [ebp + -0x3c]\",\n        \"fadd dword  [ebp + -0x38]\",\n        \"fstp dword  [ebp + 0xffffff44]\",\n        \"fld dword  [ebp + -0x3c]\",\n        \"fsub dword  [ebp + -0x38]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff48]\",\n        \"fld dword  [ebp + -0x30]\",\n        \"fadd dword  [ebp + -0x24]\",\n        \"fstp dword  [ebp + 0xffffff50]\",\n        \"fld dword  [ebp + -0x24]\",\n        \"fsub dword  [ebp + -0x30]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff5c]\",\n        \"fld dword  [ebp + -0x2c]\",\n        \"fadd dword  [ebp + -0x28]\",\n        \"fstp dword  [ebp + 0xffffff54]\",\n        \"fld dword  [ebp + -0x28]\",\n        \"fsub dword  [ebp + -0x2c]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff58]\",\n        \"fld dword  [ebp + -0x20]\",\n        \"fadd dword  [ebp + -0x14]\",\n        \"fstp dword  [ebp + 0xffffff60]\",\n        \"fld dword  [ebp + -0x20]\",\n        \"fsub dword  [ebp + -0x14]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff6c]\",\n        \"fld dword  [ebp + -0x1c]\",\n        \"fadd dword  [ebp + -0x18]\",\n        \"fstp dword  [ebp + 0xffffff64]\",\n        \"fld dword  [ebp + -0x1c]\",\n        \"fsub dword  [ebp + -0x18]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff68]\",\n        \"fld dword  [ebp + -0x10]\",\n        \"fadd dword  [ebp + -0x4]\",\n        \"fstp dword  [ebp + 0xffffff70]\",\n        \"fld dword  [ebp + -0x4]\",\n        \"fsub dword  [ebp + -0x10]\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword  [ebp + 0xffffff7c]\",\n        \"fld dword  [ebp + -0xc]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [ebp + 0xffffff74]\",\n        \"fld dword  [ebp + -0x8]\",\n        \"fsub dword  [ebp + -0xc]\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff78]\",\n        \"fld dword  [eax]\",\n        \"fstp dword  [ebp + 0x10]\",\n        \"fld dword  [ebp + 0xffffff04]\",\n        \"fadd dword  [ebp + 0xffffff00]\",\n        \"fstp dword  [ebp + -0x80]\",\n        \"fld dword  [ebp + 0xffffff00]\",\n        \"fsub dword  [ebp + 0xffffff04]\",\n        \"fld dword  [ebp + 0x10]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword  [ebp + -0x7c]\",\n        \"fld dword  [ebp + 0xffffff0c]\",\n        \"fadd dword  [ebp + 0xffffff08]\",\n        \"fstp dword  [ebp + -0x78]\",\n        \"fld dword  [ebp + 0xffffff0c]\",\n        \"fsub dword  [ebp + 0xffffff08]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x74]\",\n        \"fld dword  [ebp + -0x74]\",\n        \"fadd dword  [ebp + -0x78]\",\n        \"fstp dword  [ebp + -0x78]\",\n        \"fld dword  [ebp + 0xffffff14]\",\n        \"fadd dword  [ebp + 0xffffff10]\",\n        \"fstp dword  [ebp + -0x70]\",\n        \"fld dword  [ebp + 0xffffff10]\",\n        \"fsub dword  [ebp + 0xffffff14]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x6c]\",\n        \"fld dword  [ebp + 0xffffff1c]\",\n        \"fadd dword  [ebp + 0xffffff18]\",\n        \"fstp dword  [ebp + -0x68]\",\n        \"fld dword  [ebp + 0xffffff1c]\",\n        \"fsub dword  [ebp + 0xffffff18]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x64]\",\n        \"fld dword  [ebp + -0x64]\",\n        \"fadd dword  [ebp + -0x68]\",\n        \"fstp dword  [ebp + -0x68]\",\n        \"fld dword  [ebp + -0x68]\",\n        \"fadd dword  [ebp + -0x70]\",\n        \"fstp dword  [ebp + -0x70]\",\n        \"fld dword  [ebp + -0x68]\",\n        \"fadd dword  [ebp + -0x6c]\",\n        \"fstp dword  [ebp + -0x68]\",\n        \"fld dword  [ebp + -0x64]\",\n        \"fadd dword  [ebp + -0x6c]\",\n        \"fstp dword  [ebp + -0x6c]\",\n        \"fld dword  [ebp + 0xffffff20]\",\n        \"fadd dword  [ebp + 0xffffff24]\",\n        \"fstp dword  [ebp + -0x60]\",\n        \"fld dword  [ebp + 0xffffff20]\",\n        \"fsub dword  [ebp + 0xffffff24]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x5c]\",\n        \"fld dword  [ebp + 0xffffff28]\",\n        \"fadd dword  [ebp + 0xffffff2c]\",\n        \"fstp dword  [ebp + -0x58]\",\n        \"fld dword  [ebp + 0xffffff2c]\",\n        \"fsub dword  [ebp + 0xffffff28]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x54]\",\n        \"fld dword  [ebp + -0x54]\",\n        \"fadd dword  [ebp + -0x58]\",\n        \"fstp dword  [ebp + -0x58]\",\n        \"fld dword  [ebp + 0xffffff30]\",\n        \"fadd dword  [ebp + 0xffffff34]\",\n        \"fstp dword  [ebp + -0x50]\",\n        \"fld dword  [ebp + 0xffffff30]\",\n        \"fsub dword  [ebp + 0xffffff34]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x4c]\",\n        \"fld dword  [ebp + 0xffffff38]\",\n        \"fadd dword  [ebp + 0xffffff3c]\",\n        \"fstp dword  [ebp + -0x48]\",\n        \"fld dword  [ebp + 0xffffff3c]\",\n        \"fsub dword  [ebp + 0xffffff38]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x44]\",\n        \"fld dword  [ebp + -0x44]\",\n        \"fld st0\",\n        \"fadd dword  [ebp + -0x48]\",\n        \"fstp dword  [ebp + -0x48]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"fadd dword  [ebp + -0x50]\",\n        \"fstp dword  [ebp + -0x50]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"fadd dword  [ebp + -0x4c]\",\n        \"fstp dword  [ebp + -0x48]\",\n        \"fld st0\",\n        \"fadd dword  [ebp + -0x4c]\",\n        \"fstp dword  [ebp + -0x4c]\",\n        \"fld dword  [ebp + 0xffffff44]\",\n        \"fadd dword  [ebp + 0xffffff40]\",\n        \"fstp dword  [ebp + -0x40]\",\n        \"fld dword  [ebp + 0xffffff40]\",\n        \"fsub dword  [ebp + 0xffffff44]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x3c]\",\n        \"fld dword  [ebp + 0xffffff4c]\",\n        \"fadd dword  [ebp + 0xffffff48]\",\n        \"fstp dword  [ebp + -0x38]\",\n        \"fld dword  [ebp + 0xffffff4c]\",\n        \"fsub dword  [ebp + 0xffffff48]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x34]\",\n        \"fld dword  [ebp + -0x38]\",\n        \"fadd dword  [ebp + -0x34]\",\n        \"fstp dword  [ebp + -0x38]\",\n        \"fld dword  [ebp + 0xffffff54]\",\n        \"fadd dword  [ebp + 0xffffff50]\",\n        \"fstp dword  [ebp + -0x30]\",\n        \"fld dword  [ebp + 0xffffff50]\",\n        \"fsub dword  [ebp + 0xffffff54]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x2c]\",\n        \"fld dword  [ebp + 0xffffff5c]\",\n        \"fadd dword  [ebp + 0xffffff58]\",\n        \"fstp dword  [ebp + -0x28]\",\n        \"fld dword  [ebp + 0xffffff5c]\",\n        \"fsub dword  [ebp + 0xffffff58]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x24]\",\n        \"fld dword  [ebp + -0x28]\",\n        \"fld dword  [ebp + -0x24]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword  [ebp + -0x28]\",\n        \"fld dword  [ebp + -0x30]\",\n        \"fadd dword  [ebp + -0x28]\",\n        \"fstp dword  [ebp + -0x30]\",\n        \"fld dword  [ebp + -0x2c]\",\n        \"fadd dword  [ebp + -0x28]\",\n        \"fstp dword  [ebp + -0x28]\",\n        \"fld dword  [ebp + -0x2c]\",\n        \"fld st1\",\n        \"faddp\",\n        \"fstp dword  [ebp + -0x2c]\",\n        \"fld dword  [ebp + 0xffffff60]\",\n        \"fadd dword  [ebp + 0xffffff64]\",\n        \"fstp dword  [ebp + -0x20]\",\n        \"fld dword  [ebp + 0xffffff60]\",\n        \"fsub dword  [ebp + 0xffffff64]\",\n        \"fld st3\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x1c]\",\n        \"fld dword  [ebp + 0xffffff68]\",\n        \"fadd dword  [ebp + 0xffffff6c]\",\n        \"fstp dword  [ebp + -0x18]\",\n        \"fld dword  [ebp + 0xffffff6c]\",\n        \"fsub dword  [ebp + 0xffffff68]\",\n        \"fld st3\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x14]\",\n        \"fld dword  [ebp + -0x18]\",\n        \"fadd dword  [ebp + -0x14]\",\n        \"fstp dword  [ebp + -0x18]\",\n        \"fld dword  [ebp + 0xffffff70]\",\n        \"fadd dword  [ebp + 0xffffff74]\",\n        \"fstp dword  [ebp + -0x10]\",\n        \"mov eax,dword  [ebp + 0x8]\",\n        \"fld dword  [ebp + 0xffffff70]\",\n        \"mov ecx,dword  [ebp + 0xc]\",\n        \"fsub dword  [ebp + 0xffffff74]\",\n        \"fld st3\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0xc]\",\n        \"fld dword  [ebp + 0xffffff78]\",\n        \"fadd dword  [ebp + 0xffffff7c]\",\n        \"fstp dword  [ebp + -0x8]\",\n        \"fld dword  [ebp + 0xffffff7c]\",\n        \"fsub dword  [ebp + 0xffffff78]\",\n        \"fmulp st3\",\n        \"fxch st2\",\n        \"fstp dword  [ebp + -0x4]\",\n        \"fld dword  [ebp + -0x8]\",\n        \"fld dword  [ebp + -0x4]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword  [ebp + -0x8]\",\n        \"fld dword  [ebp + -0x10]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [ebp + -0x10]\",\n        \"fld dword  [ebp + -0xc]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [ebp + -0x8]\",\n        \"fld dword  [ebp + -0xc]\",\n        \"fld st1\",\n        \"faddp\",\n        \"fstp dword  [ebp + -0xc]\",\n        \"fld dword  [ebp + -0x80]\",\n        \"fstp dword  [eax + 0x400]\",\n        \"fld dword  [ebp + -0x70]\",\n        \"fstp dword  [eax + 0x300]\",\n        \"fld dword  [ebp + -0x78]\",\n        \"fstp dword  [eax + 0x200]\",\n        \"fld dword  [ebp + -0x68]\",\n        \"fstp dword  [eax + 0x100]\",\n        \"fld dword  [ebp + -0x7c]\",\n        \"fstp dword  [eax]\",\n        \"fld dword  [ebp + -0x7c]\",\n        \"fstp dword  [ecx]\",\n        \"fld dword  [ebp + -0x6c]\",\n        \"fstp dword  [ecx + 0x100]\",\n        \"fld dword  [ebp + -0x74]\",\n        \"fstp dword  [ecx + 0x200]\",\n        \"fld dword  [ebp + -0x64]\",\n        \"fstp dword  [ecx + 0x300]\",\n        \"fld dword  [ebp + -0x50]\",\n        \"fadd dword  [ebp + -0x60]\",\n        \"fstp dword  [ebp + -0x60]\",\n        \"fld dword  [ebp + -0x60]\",\n        \"fstp dword  [eax + 0x380]\",\n        \"fld dword  [ebp + -0x50]\",\n        \"fadd dword  [ebp + -0x58]\",\n        \"fstp dword  [ebp + -0x50]\",\n        \"fld dword  [ebp + -0x50]\",\n        \"fstp dword  [eax + 0x280]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"fadd dword  [ebp + -0x58]\",\n        \"fstp dword  [ebp + -0x58]\",\n        \"fld dword  [ebp + -0x58]\",\n        \"fstp dword  [eax + 0x180]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"fadd dword  [ebp + -0x5c]\",\n        \"fstp dword  [ebp + -0x48]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"fstp dword  [eax + 0x80]\",\n        \"fld dword  [ebp + -0x4c]\",\n        \"fadd dword  [ebp + -0x5c]\",\n        \"fstp dword  [ebp + -0x5c]\",\n        \"fld dword  [ebp + -0x5c]\",\n        \"fstp dword  [ecx + 0x80]\",\n        \"fld dword  [ebp + -0x4c]\",\n        \"fadd dword  [ebp + -0x54]\",\n        \"fstp dword  [ebp + -0x4c]\",\n        \"fld dword  [ebp + -0x4c]\",\n        \"fstp dword  [ecx + 0x180]\",\n        \"fld st1\",\n        \"fadd dword  [ebp + -0x54]\",\n        \"fstp dword  [ebp + -0x54]\",\n        \"fld dword  [ebp + -0x54]\",\n        \"fstp dword  [ecx + 0x280]\",\n        \"fxch\",\n        \"fstp dword  [ecx + 0x380]\",\n        \"fld dword  [ebp + -0x20]\",\n        \"fadd dword  [ebp + -0x10]\",\n        \"fstp dword  [ebp + -0x20]\",\n        \"fld dword  [ebp + -0x40]\",\n        \"fadd dword  [ebp + -0x20]\",\n        \"fstp dword  [eax + 0x3c0]\",\n        \"fld dword  [ebp + -0x30]\",\n        \"fadd dword  [ebp + -0x20]\",\n        \"fstp dword  [eax + 0x340]\",\n        \"fld dword  [ebp + -0x18]\",\n        \"fadd dword  [ebp + -0x10]\",\n        \"fstp dword  [ebp + -0x10]\",\n        \"fld dword  [ebp + -0x30]\",\n        \"fadd dword  [ebp + -0x10]\",\n        \"fstp dword  [eax + 0x2c0]\",\n        \"fld dword  [ebp + -0x38]\",\n        \"fadd dword  [ebp + -0x10]\",\n        \"fstp dword  [eax + 0x240]\",\n        \"fld dword  [ebp + -0x18]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [ebp + -0x18]\",\n        \"fld dword  [ebp + -0x38]\",\n        \"fadd dword  [ebp + -0x18]\",\n        \"fstp dword  [eax + 0x1c0]\",\n        \"fld dword  [ebp + -0x28]\",\n        \"fadd dword  [ebp + -0x18]\",\n        \"fstp dword  [eax + 0x140]\",\n        \"fld dword  [ebp + -0x1c]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [ebp + -0x8]\",\n        \"fld dword  [ebp + -0x28]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [eax + 0xc0]\",\n        \"fld dword  [ebp + -0x3c]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [eax + 0x40]\",\n        \"fld dword  [ebp + -0x1c]\",\n        \"fadd dword  [ebp + -0xc]\",\n        \"fstp dword  [ebp + -0x1c]\",\n        \"fld dword  [ebp + -0x3c]\",\n        \"fadd dword  [ebp + -0x1c]\",\n        \"fstp dword  [ecx + 0x40]\",\n        \"fld dword  [ebp + -0x2c]\",\n        \"fadd dword  [ebp + -0x1c]\",\n        \"fstp dword  [ecx + 0xc0]\",\n        \"fld dword  [ebp + -0x14]\",\n        \"fadd dword  [ebp + -0xc]\",\n        \"fstp dword  [ebp + -0xc]\",\n        \"fld dword  [ebp + -0x2c]\",\n        \"fadd dword  [ebp + -0xc]\",\n        \"fstp dword  [ecx + 0x140]\",\n        \"fld dword  [ebp + -0x34]\",\n        \"fadd dword  [ebp + -0xc]\",\n        \"fstp dword  [ecx + 0x1c0]\",\n        \"fld dword  [ebp + -0x14]\",\n        \"fld st1\",\n        \"faddp\",\n        \"fstp dword  [ebp + -0x14]\",\n        \"fld dword  [ebp + -0x34]\",\n        \"fadd dword  [ebp + -0x14]\",\n        \"fstp dword  [ecx + 0x240]\",\n        \"fld st1\",\n        \"fadd dword  [ebp + -0x14]\",\n        \"fstp dword  [ecx + 0x2c0]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword  [ecx + 0x340]\",\n        \"fstp dword  [ecx + 0x3c0]\",\n        \"leave\",\n        \"ret\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str w9, [x8, #-4]!\",\n        \"mov x9, x8\",\n        \"subs w26, w8, #0x104 (260)\",\n        \"mov x27, x8\",\n        \"mov x8, x26\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xe354\",\n        \"movk w20, #0x100d, lsl #16\",\n        \"ldr w7, [x20]\",\n        \"ldr s3, [x4, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-128]\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr s2, [x4, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-124]\",\n        \"ldr s2, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr s2, [x4, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-120]\",\n        \"ldr s2, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-12]\",\n        \"ldr s2, [x4, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-116]\",\n        \"ldr s2, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-16]\",\n        \"ldr s2, [x4, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-112]\",\n        \"ldr s2, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-20]\",\n        \"ldr s2, [x4, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-108]\",\n        \"ldr s2, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-24]\",\n        \"ldr s2, [x4, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-104]\",\n        \"ldr s2, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-28]\",\n        \"ldr s2, [x4, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-100]\",\n        \"ldr s2, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-32]\",\n        \"ldr s2, [x4, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-96]\",\n        \"ldr s2, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-36]\",\n        \"ldr s2, [x4, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-92]\",\n        \"ldr s2, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-40]\",\n        \"ldr s2, [x4, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-88]\",\n        \"ldr s2, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-44]\",\n        \"ldr s2, [x4, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-84]\",\n        \"ldr s2, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-48]\",\n        \"ldr s2, [x4, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-80]\",\n        \"ldr s2, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-52]\",\n        \"ldr s2, [x4, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-76]\",\n        \"ldr s2, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-56]\",\n        \"ldr s2, [x4, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-72]\",\n        \"ldr s2, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-60]\",\n        \"ldr s2, [x4, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-68]\",\n        \"ldr s2, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xe358\",\n        \"movk w20, #0x100d, lsl #16\",\n        \"ldr w4, [x20]\",\n        \"ldr s3, [x7, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-64]\",\n        \"ldur s2, [x9, #-68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-256]\",\n        \"ldur s2, [x9, #-128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-196]\",\n        \"ldur s2, [x9, #-72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-252]\",\n        \"ldur s2, [x9, #-124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-200]\",\n        \"ldur s2, [x9, #-76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-248]\",\n        \"ldur s2, [x9, #-120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-204]\",\n        \"ldur s2, [x9, #-80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-244]\",\n        \"ldur s2, [x9, #-116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-208]\",\n        \"ldur s2, [x9, #-84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-240]\",\n        \"ldur s2, [x9, #-112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-212]\",\n        \"ldur s2, [x9, #-88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-236]\",\n        \"ldur s2, [x9, #-108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-216]\",\n        \"ldur s2, [x9, #-92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-232]\",\n        \"ldur s2, [x9, #-104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-220]\",\n        \"ldur s2, [x9, #-96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-228]\",\n        \"ldur s2, [x9, #-100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-224]\",\n        \"ldur s2, [x9, #-64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-192]\",\n        \"ldur s2, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-132]\",\n        \"ldur s2, [x9, #-60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-188]\",\n        \"ldur s2, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-136]\",\n        \"ldur s2, [x9, #-56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-184]\",\n        \"ldur s2, [x9, #-12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-140]\",\n        \"ldur s2, [x9, #-52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-180]\",\n        \"ldur s2, [x9, #-16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-144]\",\n        \"ldur s2, [x9, #-48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-176]\",\n        \"ldur s2, [x9, #-20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-148]\",\n        \"ldur s2, [x9, #-44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-172]\",\n        \"ldur s2, [x9, #-24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-152]\",\n        \"ldur s2, [x9, #-40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-168]\",\n        \"ldur s2, [x9, #-28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-156]\",\n        \"ldur s2, [x9, #-36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-164]\",\n        \"ldur s2, [x9, #-32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xe35c\",\n        \"movk w20, #0x100d, lsl #16\",\n        \"ldr w4, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-160]\",\n        \"ldur s2, [x9, #-228]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-256]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-128]\",\n        \"ldur s2, [x9, #-256]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-228]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-100]\",\n        \"ldur s2, [x9, #-232]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-252]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-124]\",\n        \"ldur s2, [x9, #-252]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-232]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-104]\",\n        \"ldur s2, [x9, #-236]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-248]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-120]\",\n        \"ldur s2, [x9, #-248]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-236]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-108]\",\n        \"ldur s2, [x9, #-240]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-244]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-116]\",\n        \"ldur s2, [x9, #-244]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-240]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-112]\",\n        \"ldur s2, [x9, #-224]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-196]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-96]\",\n        \"ldur s2, [x9, #-196]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-224]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-68]\",\n        \"ldur s2, [x9, #-220]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-200]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-92]\",\n        \"ldur s2, [x9, #-200]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-220]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-72]\",\n        \"ldur s2, [x9, #-216]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-204]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-88]\",\n        \"ldur s2, [x9, #-204]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-216]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-76]\",\n        \"ldur s2, [x9, #-212]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-208]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-84]\",\n        \"ldur s2, [x9, #-208]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-212]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-80]\",\n        \"ldur s2, [x9, #-164]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-192]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-64]\",\n        \"ldur s2, [x9, #-192]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-164]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-36]\",\n        \"ldur s2, [x9, #-168]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-188]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-60]\",\n        \"ldur s2, [x9, #-188]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-168]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-40]\",\n        \"ldur s2, [x9, #-172]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-184]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-56]\",\n        \"ldur s2, [x9, #-184]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-172]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-44]\",\n        \"ldur s2, [x9, #-176]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-180]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-52]\",\n        \"ldur s2, [x9, #-180]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-176]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-48]\",\n        \"ldur s2, [x9, #-160]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-32]\",\n        \"ldur s2, [x9, #-132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-160]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-4]\",\n        \"ldur s2, [x9, #-156]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-28]\",\n        \"ldur s2, [x9, #-136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-156]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-8]\",\n        \"ldur s2, [x9, #-152]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-140]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-24]\",\n        \"ldur s2, [x9, #-140]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-152]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-12]\",\n        \"ldur s2, [x9, #-148]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-144]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-20]\",\n        \"ldur s2, [x9, #-144]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-148]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xe360\",\n        \"movk w20, #0x100d, lsl #16\",\n        \"ldr w4, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-16]\",\n        \"ldr s2, [x4]\",\n        \"str s2, [x9, #16]\",\n        \"ldr s2, [x4, #4]\",\n        \"mov x20, #0xfffffffffffffefc\",\n        \"str s2, [x9, x20, sxtx]\",\n        \"ldur s2, [x9, #-116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-256]\",\n        \"ldur s2, [x9, #-128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x9, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-244]\",\n        \"ldur s2, [x9, #-120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-252]\",\n        \"ldur s2, [x9, #-124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s4, [x9, x20, sxtx]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-248]\",\n        \"ldur s2, [x9, #-100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-240]\",\n        \"ldur s2, [x9, #-100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-228]\",\n        \"ldur s2, [x9, #-104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-236]\",\n        \"ldur s2, [x9, #-104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-232]\",\n        \"ldur s2, [x9, #-84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-224]\",\n        \"ldur s2, [x9, #-96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-212]\",\n        \"ldur s2, [x9, #-88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-220]\",\n        \"ldur s2, [x9, #-92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-216]\",\n        \"ldur s2, [x9, #-68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-208]\",\n        \"ldur s2, [x9, #-68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-196]\",\n        \"ldur s2, [x9, #-72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xe364\",\n        \"movk w20, #0x100d, lsl #16\",\n        \"ldr w4, [x20]\",\n        \"ldur s5, [x9, #-76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-204]\",\n        \"ldur s2, [x9, #-72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-200]\",\n        \"ldur s2, [x9, #-64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-192]\",\n        \"ldur s2, [x9, #-64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-180]\",\n        \"ldur s2, [x9, #-60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-188]\",\n        \"ldur s2, [x9, #-60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-184]\",\n        \"ldur s2, [x9, #-48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-176]\",\n        \"ldur s2, [x9, #-36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-164]\",\n        \"ldur s2, [x9, #-44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-172]\",\n        \"ldur s2, [x9, #-40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-168]\",\n        \"ldur s2, [x9, #-32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-160]\",\n        \"ldur s2, [x9, #-32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-148]\",\n        \"ldur s2, [x9, #-28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-156]\",\n        \"ldur s2, [x9, #-28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-152]\",\n        \"ldur s2, [x9, #-16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-144]\",\n        \"ldur s2, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s5, [x9, #-16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-132]\",\n        \"ldur s2, [x9, #-12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-140]\",\n        \"ldur s2, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-136]\",\n        \"ldr s2, [x4]\",\n        \"str s2, [x9, #16]\",\n        \"ldur s2, [x9, #-252]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-256]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-128]\",\n        \"ldur s2, [x9, #-256]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-252]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x9, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-124]\",\n        \"ldur s2, [x9, #-244]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-248]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-120]\",\n        \"ldur s2, [x9, #-244]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-248]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-116]\",\n        \"ldur s2, [x9, #-116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-120]\",\n        \"ldur s2, [x9, #-236]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-240]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-112]\",\n        \"ldur s2, [x9, #-240]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-236]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-108]\",\n        \"ldur s2, [x9, #-228]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-232]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-104]\",\n        \"ldur s2, [x9, #-228]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-232]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-100]\",\n        \"ldur s2, [x9, #-100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-104]\",\n        \"ldur s2, [x9, #-104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-112]\",\n        \"ldur s2, [x9, #-104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-104]\",\n        \"ldur s2, [x9, #-100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-108]\",\n        \"ldur s2, [x9, #-224]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-220]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-96]\",\n        \"ldur s2, [x9, #-224]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-220]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-92]\",\n        \"ldur s2, [x9, #-216]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-212]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-88]\",\n        \"ldur s2, [x9, #-212]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-216]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-84]\",\n        \"ldur s2, [x9, #-84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-88]\",\n        \"ldur s2, [x9, #-208]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-204]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-80]\",\n        \"ldur s2, [x9, #-208]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-204]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-76]\",\n        \"ldur s2, [x9, #-200]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-196]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-72]\",\n        \"ldur s2, [x9, #-196]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s4, [x9, #-200]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-68]\",\n        \"ldur s2, [x9, #-68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldur s5, [x9, #-72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-72]\",\n        \"ldur s5, [x9, #-72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x9, #-80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-80]\",\n        \"ldur s5, [x9, #-72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x9, #-76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-72]\",\n        \"ldur s5, [x9, #-76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-76]\",\n        \"ldur s5, [x9, #-188]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x9, #-192]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-64]\",\n        \"ldur s5, [x9, #-192]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x9, #-188]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-60]\",\n        \"ldur s5, [x9, #-180]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x9, #-184]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-56]\",\n        \"ldur s5, [x9, #-180]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x9, #-184]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-52]\",\n        \"ldur s5, [x9, #-56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x9, #-52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-56]\",\n        \"ldur s5, [x9, #-172]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x9, #-176]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-48]\",\n        \"ldur s5, [x9, #-176]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x9, #-172]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-44]\",\n        \"ldur s5, [x9, #-164]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x9, #-168]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-40]\",\n        \"ldur s5, [x9, #-164]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x9, #-168]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-36]\",\n        \"ldur s5, [x9, #-40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x9, #-36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-40]\",\n        \"ldur s5, [x9, #-48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s7, [x9, #-40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-48]\",\n        \"ldur s5, [x9, #-44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s7, [x9, #-40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-40]\",\n        \"ldur s5, [x9, #-44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-44]\",\n        \"ldur s5, [x9, #-160]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s7, [x9, #-156]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-32]\",\n        \"ldur s5, [x9, #-160]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s7, [x9, #-156]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-28]\",\n        \"ldur s5, [x9, #-152]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s7, [x9, #-148]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-24]\",\n        \"ldur s5, [x9, #-148]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s7, [x9, #-152]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-20]\",\n        \"ldur s5, [x9, #-24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s7, [x9, #-20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-24]\",\n        \"ldur s5, [x9, #-144]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s7, [x9, #-140]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-16]\",\n        \"ldr w4, [x9, #8]\",\n        \"ldur s5, [x9, #-144]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w7, [x9, #12]\",\n        \"ldur s7, [x9, #-140]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-12]\",\n        \"ldur s5, [x9, #-136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s7, [x9, #-132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x9, #-8]\",\n        \"ldur s5, [x9, #-132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s7, [x9, #-136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x9, #-4]\",\n        \"ldur s3, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldur s5, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x9, #-8]\",\n        \"ldur s3, [x9, #-16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldur s8, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x9, #-16]\",\n        \"ldur s3, [x9, #-12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldur s8, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x9, #-8]\",\n        \"ldur s3, [x9, #-12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x9, #-12]\",\n        \"ldur s3, [x9, #-128]\",\n        \"str s3, [x4, #1024]\",\n        \"ldur s3, [x9, #-112]\",\n        \"str s3, [x4, #768]\",\n        \"ldur s3, [x9, #-120]\",\n        \"str s3, [x4, #512]\",\n        \"ldur s3, [x9, #-104]\",\n        \"str s3, [x4, #256]\",\n        \"ldur s3, [x9, #-124]\",\n        \"str s3, [x4]\",\n        \"ldur s3, [x9, #-124]\",\n        \"str s3, [x7]\",\n        \"ldur s3, [x9, #-108]\",\n        \"str s3, [x7, #256]\",\n        \"ldur s3, [x9, #-116]\",\n        \"str s3, [x7, #512]\",\n        \"ldur s3, [x9, #-100]\",\n        \"str s3, [x7, #768]\",\n        \"ldur s3, [x9, #-80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldur s8, [x9, #-96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x9, #-96]\",\n        \"ldur s3, [x9, #-96]\",\n        \"str s3, [x4, #896]\",\n        \"ldur s3, [x9, #-80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldur s8, [x9, #-88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x9, #-80]\",\n        \"ldur s3, [x9, #-80]\",\n        \"str s3, [x4, #640]\",\n        \"ldur s3, [x9, #-72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldur s8, [x9, #-88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x9, #-88]\",\n        \"ldur s3, [x9, #-88]\",\n        \"str s3, [x4, #384]\",\n        \"ldur s3, [x9, #-72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldur s8, [x9, #-92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x9, #-72]\",\n        \"ldur s3, [x9, #-72]\",\n        \"str s3, [x4, #128]\",\n        \"ldur s3, [x9, #-76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldur s8, [x9, #-92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x9, #-92]\",\n        \"ldur s3, [x9, #-92]\",\n        \"str s3, [x7, #128]\",\n        \"ldur s3, [x9, #-76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldur s8, [x9, #-84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x9, #-76]\",\n        \"ldur s3, [x9, #-76]\",\n        \"str s3, [x7, #384]\",\n        \"ldur s3, [x9, #-84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x9, #-84]\",\n        \"ldur s3, [x9, #-84]\",\n        \"str s3, [x7, #640]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s2, [x7, #896]\",\n        \"ldur s2, [x9, #-32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-32]\",\n        \"ldur s2, [x9, #-64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #960]\",\n        \"ldur s2, [x9, #-48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #832]\",\n        \"ldur s2, [x9, #-24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-16]\",\n        \"ldur s2, [x9, #-48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #704]\",\n        \"ldur s2, [x9, #-56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #576]\",\n        \"ldur s2, [x9, #-24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-24]\",\n        \"ldur s2, [x9, #-56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #448]\",\n        \"ldur s2, [x9, #-40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #320]\",\n        \"ldur s2, [x9, #-28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-8]\",\n        \"ldur s2, [x9, #-40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #192]\",\n        \"ldur s2, [x9, #-60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #64]\",\n        \"ldur s2, [x9, #-28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-28]\",\n        \"ldur s2, [x9, #-60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x7, #64]\",\n        \"ldur s2, [x9, #-44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x7, #192]\",\n        \"ldur s2, [x9, #-20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-12]\",\n        \"ldur s2, [x9, #-44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x7, #320]\",\n        \"ldur s2, [x9, #-52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x7, #448]\",\n        \"ldur s2, [x9, #-20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-20]\",\n        \"ldur s2, [x9, #-52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x7, #576]\",\n        \"ldur s2, [x9, #-20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x7, #704]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x7, #832]\",\n        \"str s5, [x7, #960]\",\n        \"mov x8, x9\",\n        \"ldp w9, w20, [x8], #8\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x8\",\n        \"sub w21, w23, w21\",\n        \"mov w23, #0xf8f8\",\n        \"lsr w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ],\n      \"x86InstructionCount\": 809,\n      \"ExpectedInstructionCount\": 7755\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/x87-HalfLife.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"Block1\": {\n      \"x86InstructionCount\": 70,\n      \"ExpectedInstructionCount\": 412,\n      \"x86Insts\": [\n        \"sub esp,0x2c\",\n        \"mov ecx,dword [esp + 0x34]\",\n        \"mov edx,dword [esp + 0x30]\",\n        \"mov eax,dword [esp + 0x38]\",\n        \"fld dword [ecx]\",\n        \"fld dword [edx]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fld dword [ecx + 0x4]\",\n        \"fld dword [edx + 0x4]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [ecx + 0x8]\",\n        \"fld dword [edx + 0x8]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax]\",\n        \"fsubr st7,st0\",\n        \"fxch st7\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsubr st4,st0\",\n        \"fxch st4\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fsubr st2,st0\",\n        \"fxch st6\",\n        \"fsubrp st7,st0\",\n        \"fxch st2\",\n        \"fsubrp st3,st0\",\n        \"fxch st4\",\n        \"fsubp\",\n        \"fxch st2\",\n        \"fmul st0\",\n        \"fldz\",\n        \"faddp\",\n        \"fld dword [esp + 0x10]\",\n        \"fld st0\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [esp + 0x14]\",\n        \"fld st0\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [esp + 0x18]\",\n        \"fld st0\",\n        \"fmulp\",\n        \"fldz\",\n        \"faddp\",\n        \"fld dword [esp + 0x1c]\",\n        \"fld st0\",\n        \"fmulp\",\n        \"faddp\",\n        \"fxch st4\",\n        \"fmul st0\",\n        \"faddp st4,st0\",\n        \"fxch st4\",\n        \"fmul st0\",\n        \"fldz\",\n        \"faddp\",\n        \"fxch\",\n        \"fmul st0\",\n        \"faddp\",\n        \"fxch\",\n        \"fmul st0\",\n        \"faddp\",\n        \"fxch st2\",\n        \"fucomi st0,st1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"subs w20, w8, #0x2c (44)\",\n        \"mov x27, x8\",\n        \"mov x8, x20\",\n        \"ldr w7, [x8, #52]\",\n        \"ldr w5, [x8, #48]\",\n        \"ldr w4, [x8, #56]\",\n        \"ldr s2, [x7]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x7, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x5, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #16]\",\n        \"ldr s7, [x7, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x5, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #20]\",\n        \"ldr s9, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #28]\",\n        \"ldr s5, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"movi v6.2d, #0x0\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s8, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q4, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str q7, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0x707\",\n        \"lsr w22, w22, w20\",\n        \"orr w21, w21, w22\",\n        \"mov w22, #0xf8f8\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block2\": {\n      \"x86InstructionCount\": 37,\n      \"ExpectedInstructionCount\": 213,\n      \"x86Insts\": [\n        \"sub esp,0x1c\",\n        \"mov edx,dword [esp + 0x20]\",\n        \"mov eax,dword [esp + 0x24]\",\n        \"fld dword [edx]\",\n        \"fabs\",\n        \"fld dword [eax]\",\n        \"fabs\",\n        \"fxch\",\n        \"fucomi st0,st1\",\n        \"fcmovbe st0,st1\",\n        \"fstp st1\",\n        \"fld dword [edx + 0x4]\",\n        \"fabs\",\n        \"fld dword [eax + 0x4]\",\n        \"fabs\",\n        \"fxch\",\n        \"fucomi st0,st1\",\n        \"fcmovbe st0,st1\",\n        \"fstp st1\",\n        \"fld dword [edx + 0x8]\",\n        \"fabs\",\n        \"fld dword [eax + 0x8]\",\n        \"fabs\",\n        \"fxch\",\n        \"fucomi st0,st1\",\n        \"fcmovbe st0,st1\",\n        \"fstp st1\",\n        \"fld st2\",\n        \"fmulp st3\",\n        \"fxch\",\n        \"fmul st0\",\n        \"faddp st2,st0\",\n        \"fmul st0\",\n        \"faddp\",\n        \"fld st0\",\n        \"fsqrt\",\n        \"fucomi st0,st0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w8\",\n        \"subs w8, w8, #0x1c (28)\",\n        \"ldr w5, [x8, #32]\",\n        \"ldr w4, [x8, #36]\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q3, [x28, #3552]\",\n        \"bic v2.16b, v2.16b, v3.16b\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr q4, [x28, #3552]\",\n        \"bic v3.16b, v3.16b, v4.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"strb w20, [x28, #1040]\",\n        \"csetm x20, ls\",\n        \"dup v4.2d, x20\",\n        \"bsl v4.16b, v3.16b, v2.16b\",\n        \"ldr s2, [x5, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q3, [x28, #3552]\",\n        \"bic v2.16b, v2.16b, v3.16b\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr q5, [x28, #3552]\",\n        \"bic v3.16b, v3.16b, v5.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"strb w20, [x28, #1040]\",\n        \"csetm x20, ls\",\n        \"dup v5.2d, x20\",\n        \"bsl v5.16b, v3.16b, v2.16b\",\n        \"ldr s2, [x5, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q3, [x28, #3552]\",\n        \"bic v2.16b, v2.16b, v3.16b\",\n        \"ldr s3, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr q6, [x28, #3552]\",\n        \"bic v3.16b, v3.16b, v6.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"strb w20, [x28, #1040]\",\n        \"csetm x20, ls\",\n        \"dup v6.2d, x20\",\n        \"bsl v6.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1888]\",\n        \"ldr x3, [x28, #1896]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q3, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0x303\",\n        \"lsr w22, w22, w20\",\n        \"orr w21, w21, w22\",\n        \"mov w22, #0xc0c0\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block3\": {\n      \"x86InstructionCount\": 32,\n      \"ExpectedInstructionCount\": 231,\n      \"x86Insts\": [\n        \"fld dword [ecx]\",\n        \"fld dword [edx + 0x4]\",\n        \"fld dword [ecx + 0x4]\",\n        \"fld dword [edx]\",\n        \"fld dword [ecx + 0x8]\",\n        \"fstp dword [esp]\",\n        \"fld dword [edx + 0x8]\",\n        \"fld st4\",\n        \"fmul st4\",\n        \"fld st3\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fmul dword [eax + 0x8]\",\n        \"fxch st2\",\n        \"fmul dword [esp]\",\n        \"fxch st5\",\n        \"fmul st1\",\n        \"fsubp st5,st0\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp st5\",\n        \"fxch st4\",\n        \"faddp\",\n        \"fxch st3\",\n        \"fmulp\",\n        \"fxch\",\n        \"fmul dword [esp]\",\n        \"mov byte [esp],0x1\",\n        \"fsubp\",\n        \"fmul dword [eax]\",\n        \"faddp\",\n        \"fdivrp\",\n        \"fstp dword [esi]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x7]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x5, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x7, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x7, #8]\",\n        \"str s6, [x8]\",\n        \"ldr s6, [x5, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s5, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s5, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"mov w20, #0x1\",\n        \"strb w20, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x10]\",\n        \"add w21, w21, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x20, #1056]\",\n        \"str q3, [x22, #1056]\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block4\": {\n      \"x86InstructionCount\": 54,\n      \"ExpectedInstructionCount\": 75,\n      \"x86Insts\": [\n        \"push ebp\",\n        \"push edi\",\n        \"push esi\",\n        \"push ebx\",\n        \"sub esp,0x4c\",\n        \"mov eax,dword [esp + 0x68]\",\n        \"lea ebp,[esp + 0x38]\",\n        \"lea esi,[esp + 0x30]\",\n        \"fld qword [0x00052098]\",\n        \"mov dword [esp + 0xc],esi\",\n        \"mov edi,dword [esp + 0x64]\",\n        \"mov dword [esp + 0x8],ebp\",\n        \"mov ebx,dword [esp + 0x6c]\",\n        \"mov dword [esp + 0x28],eax\",\n        \"mov eax,dword [esp + 0x60]\",\n        \"fmul dword [eax + 0x4]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fstp qword [esp]\",\n        \"call 0x0006d100\",\n        \"mov eax,dword [esp + 0x60]\",\n        \"mov dword [esp + 0xc],esi\",\n        \"mov dword [esp + 0x8],ebp\",\n        \"fld qword [esp + 0x38]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld qword [0x00052098]\",\n        \"fmul dword [eax]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fstp qword [esp]\",\n        \"call 0x0006d100\",\n        \"mov eax,dword [esp + 0x60]\",\n        \"mov dword [esp + 0xc],esi\",\n        \"mov dword [esp + 0x8],ebp\",\n        \"fld qword [esp + 0x38]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld qword [0x00052098]\",\n        \"fmul dword [eax + 0x8]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fstp qword [esp]\",\n        \"call 0x0006d100\",\n        \"test edi,edi\",\n        \"mov eax,dword [esp + 0x28]\",\n        \"fld qword [esp + 0x38]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fld qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x2c]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp w11, w9, [x8, #-8]!\",\n        \"stp w6, w10, [x8, #-8]!\",\n        \"subs w26, w8, #0x4c (76)\",\n        \"mov x27, x8\",\n        \"mov x8, x26\",\n        \"ldr w4, [x8, #104]\",\n        \"add w9, w8, #0x38 (56)\",\n        \"add w10, w8, #0x30 (48)\",\n        \"mov w20, #0x2098\",\n        \"movk w20, #0x5, lsl #16\",\n        \"ldr d2, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str w10, [x8, #12]\",\n        \"ldr w11, [x8, #100]\",\n        \"str w9, [x8, #8]\",\n        \"ldr w6, [x8, #108]\",\n        \"str w4, [x8, #40]\",\n        \"ldr w4, [x8, #96]\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"str d2, [x8]\",\n        \"mov w20, #0x44\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"add w21, w21, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"lsl w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    },\n    \"Block5\": {\n      \"x86InstructionCount\": 49,\n      \"ExpectedInstructionCount\": 300,\n      \"x86Insts\": [\n        \"fld dword [esp + 0x80]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"mov eax,dword [esp + 0x88]\",\n        \"mov ecx,dword [esp + 0x8c]\",\n        \"movss xmm1,dword [esp + 0x7c]\",\n        \"mov dword [esp + 0x38],edx\",\n        \"fst dword [esp + 0x34]\",\n        \"fld dword [esp + 0x24]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fadd dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [eax]\",\n        \"fsub dword [ebp]\",\n        \"movss xmm0,dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fadd dword [ebp]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsub dword [ebp + 0x4]\",\n        \"fmul st1\",\n        \"fadd dword [ebp + 0x4]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [eax + 0x8]\",\n        \"fsub dword [ebp + 0x8]\",\n        \"fmulp\",\n        \"fadd dword [ebp + 0x8]\",\n        \"mov dword [esp + 0x1c],ecx\",\n        \"movss dword [esp + 0x10],xmm0\",\n        \"lea ecx,[esp + 0x44]\",\n        \"movss dword [esp + 0xc],xmm1\",\n        \"mov dword [esp + 0x18],ecx\",\n        \"mov dword [esp + 0x14],ebp\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fldz\",\n        \"fld dword [esp + 0x28]\",\n        \"fxch\",\n        \"fucomip st0,st1\",\n        \"fstp st0\",\n        \"seta byte [esp + 0x30]\",\n        \"movzx eax,byte [esp + 0x30]\",\n        \"movsx eax,word [esi + eax*0x2 + 0x4]\",\n        \"mov dword [esp + 0x8],eax\",\n        \"mov dword [esp + 0x4],ebx\",\n        \"mov dword [esp],edi\",\n        \"call 0x0002b5b0\",\n        \"mov edx,dword [esp + 0x38]\",\n        \"test al,al\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x8, #136]\",\n        \"ldr w7, [x8, #140]\",\n        \"ldr s17, [x8, #124]\",\n        \"str w5, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #52]\",\n        \"ldr s3, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s4, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s4, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s16, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s4, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #68]\",\n        \"ldr s2, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s4, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s4, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #72]\",\n        \"ldr s2, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s4, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str w7, [x8, #28]\",\n        \"str s16, [x8, #16]\",\n        \"add w7, w8, #0x44 (68)\",\n        \"str s17, [x8, #12]\",\n        \"str w7, [x8, #24]\",\n        \"str w9, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #76]\",\n        \"movi v2.2d, #0x0\",\n        \"ldr s3, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"cset x20, hi\",\n        \"strb w20, [x8, #48]\",\n        \"ldrb w4, [x8, #48]\",\n        \"add w20, w10, w4, lsl #1\",\n        \"ldrh w20, [x20, #4]\",\n        \"sxth w4, w20\",\n        \"str w4, [x8, #8]\",\n        \"str w6, [x8, #4]\",\n        \"str w11, [x8]\",\n        \"mov w20, #0xb2\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x8\",\n        \"sub w21, w23, w21\",\n        \"mov w23, #0xe0e0\",\n        \"lsr w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    },\n    \"Block6\": {\n      \"x86InstructionCount\": 39,\n      \"ExpectedInstructionCount\": 294,\n      \"x86Insts\": [\n        \"push ebp\",\n        \"push edi\",\n        \"push esi\",\n        \"push ebx\",\n        \"sub esp,0x4\",\n        \"mov ecx,dword [esp + 0x20]\",\n        \"mov ebx,dword [esp + 0x24]\",\n        \"mov eax,dword [esp + 0x1c]\",\n        \"mov edx,dword [esp + 0x18]\",\n        \"fld dword [ecx]\",\n        \"fmul dword [ebx + 0x4]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"mov edi,dword [esp + 0x2c]\",\n        \"mov esi,dword [esp + 0x30]\",\n        \"fld dword [ecx + 0x4]\",\n        \"fmul dword [ebx]\",\n        \"fsubp\",\n        \"fld dword [ebx]\",\n        \"fmul dword [ecx + 0x8]\",\n        \"fld dword [ecx]\",\n        \"fmul dword [ebx + 0x8]\",\n        \"fsubp\",\n        \"fld dword [ecx + 0x4]\",\n        \"fmul dword [ebx + 0x8]\",\n        \"fld dword [ebx + 0x4]\",\n        \"fmul dword [ecx + 0x8]\",\n        \"fsubp\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul st3\",\n        \"fld dword [eax + 0x4]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fld dword [eax]\",\n        \"fmul st2\",\n        \"faddp\",\n        \"fldz\",\n        \"fxch\",\n        \"fucomi st0,st1\",\n        \"fstp st1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp w11, w9, [x8, #-8]!\",\n        \"stp w6, w10, [x8, #-8]!\",\n        \"subs w20, w8, #0x4 (4)\",\n        \"mov x27, x8\",\n        \"mov x8, x20\",\n        \"ldr w7, [x8, #32]\",\n        \"ldr w6, [x8, #36]\",\n        \"ldr w4, [x8, #28]\",\n        \"ldr w5, [x8, #24]\",\n        \"ldr s2, [x7]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x6, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr w11, [x8, #44]\",\n        \"ldr w10, [x8, #48]\",\n        \"ldr s3, [x7, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x6]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x6]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x7, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x7]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x6, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x7, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x6, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x6, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x7, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"movi v6.2d, #0x0\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q5, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str q4, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str q3, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w22, w22, w20\",\n        \"mov w23, #0xf0f\",\n        \"lsr w22, w23, w22\",\n        \"orr w21, w21, w22\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block7\": {\n      \"x86InstructionCount\": 25,\n      \"ExpectedInstructionCount\": 244,\n      \"x86Insts\": [\n        \"fld dword [ebx + 0x4]\",\n        \"fld dword [ebx]\",\n        \"fld dword [ebx + 0x8]\",\n        \"fld dword [edx]\",\n        \"fmul st3\",\n        \"fld dword [edx + 0x4]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fmul dword [eax + 0x8]\",\n        \"fxch st2\",\n        \"fmul dword [edx + 0x8]\",\n        \"fld dword [edx]\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fmul dword [eax + 0x4]\",\n        \"faddp st2,st0\",\n        \"fmul dword [edx + 0x4]\",\n        \"fxch st2\",\n        \"fmul dword [edx + 0x8]\",\n        \"fsubp st2,st0\",\n        \"fxch\",\n        \"fmul dword [eax]\",\n        \"faddp\",\n        \"fdiv st0,st1\",\n        \"fstp dword [edi]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x6, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x6]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x6, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x5, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s6, [x5, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s6, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s6, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s5, [x5, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s5, [x5, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s4, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x11]\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x20, #1056]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w21, w22, w21\",\n        \"mov w22, #0xf8f8\",\n        \"lsr w21, w22, w21\",\n        \"bic w20, w20, w21\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block8\": {\n      \"x86InstructionCount\": 25,\n      \"ExpectedInstructionCount\": 72,\n      \"x86Insts\": [\n        \"fstp st0\",\n        \"fstp st3\",\n        \"fstp st0\",\n        \"fstp st3\",\n        \"fxch\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x38]\",\n        \"fxch\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fxch\",\n        \"fstp dword [esp + 0x28]\",\n        \"fstp qword [esp]\",\n        \"call 0x0006d0d8\",\n        \"fld dword [ebx]\",\n        \"fld dword [ebx + 0x4]\",\n        \"fld dword [ebx + 0x8]\",\n        \"fld dword [esp + 0x38]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fxch st6\",\n        \"fxch st5\",\n        \"fxch\",\n        \"fxch st4\",\n        \"fxch st3\",\n        \"fxch\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"add x22, x28, x22, lsl #4\",\n        \"ldr q4, [x22, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x23, x28, x20, lsl #4\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #56]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #44]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x12, x28, x20, lsl #4\",\n        \"ldr q5, [x12, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d6, d0\",\n        \"str d6, [x8]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"mov w13, #0x24\",\n        \"movk w13, #0x1, lsl #16\",\n        \"str w13, [x8, #-4]!\",\n        \"strb w20, [x28, #1051]\",\n        \"str q3, [x21, #1056]\",\n        \"str q4, [x22, #1056]\",\n        \"str q5, [x23, #1056]\",\n        \"str q2, [x12, #1056]\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block9\": {\n      \"x86InstructionCount\": 25,\n      \"ExpectedInstructionCount\": 72,\n      \"x86Insts\": [\n        \"fstp st0\",\n        \"fstp st3\",\n        \"fstp st0\",\n        \"fstp st3\",\n        \"fxch\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x38]\",\n        \"fxch\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fxch\",\n        \"fstp dword [esp + 0x28]\",\n        \"fstp qword [esp]\",\n        \"call 0x0006d0d8\",\n        \"fld dword [ebx]\",\n        \"fld dword [ebx + 0x4]\",\n        \"fld dword [ebx + 0x8]\",\n        \"fld dword [esp + 0x38]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fxch st6\",\n        \"fxch st5\",\n        \"fxch\",\n        \"fxch st4\",\n        \"fxch st3\",\n        \"fxch\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"add x22, x28, x22, lsl #4\",\n        \"ldr q4, [x22, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x23, x28, x20, lsl #4\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #56]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #44]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x12, x28, x20, lsl #4\",\n        \"ldr q5, [x12, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d6, d0\",\n        \"str d6, [x8]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"mov w13, #0x24\",\n        \"movk w13, #0x1, lsl #16\",\n        \"str w13, [x8, #-4]!\",\n        \"strb w20, [x28, #1051]\",\n        \"str q3, [x21, #1056]\",\n        \"str q4, [x22, #1056]\",\n        \"str q5, [x23, #1056]\",\n        \"str q2, [x12, #1056]\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block10\": {\n      \"x86InstructionCount\": 125,\n      \"ExpectedInstructionCount\": 17,\n      \"x86Insts\": [\n        \"push esi\",\n        \"push ebx\",\n        \"sub esp,0xa4\",\n        \"mov ebx,dword [esp + 0xb0]\",\n        \"lea esi,[esp + 0x18]\",\n        \"mov eax,gs:[0x14]\",\n        \"mov dword [esp + 0x9c],eax\",\n        \"xor eax,eax\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x18]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x1c]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x20]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x24]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x28]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x2c]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x30]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x34]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x38]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x3c]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x40]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x44]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x48]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x4c]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x50]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x54]\",\n        \"call 0x00018ad0\",\n        \"mov dword [esp + 0x58],eax\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x7c]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x80]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x84]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x88]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x8c]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x90]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x94]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x98]\",\n        \"call 0x00019700\",\n        \"mov edx,0x1f\",\n        \"mov dword [esp + 0x8],edx\",\n        \"mov dword [esp + 0x4],eax\",\n        \"lea eax,[esp + 0x5c]\",\n        \"mov dword [esp],eax\",\n        \"call 0x0006d0dc\",\n        \"mov eax,dword [ebx + 0x130]\",\n        \"mov byte [esp + 0x7b],0x0\",\n        \"mov edx,dword [eax]\",\n        \"mov dword [esp],eax\",\n        \"mov dword [esp + 0x4],esi\",\n        \"call dword [edx + 0xc4]\",\n        \"mov eax,dword [esp + 0x9c]\",\n        \"xor eax,dword gs:[0x14]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp w6, w10, [x8, #-8]!\",\n        \"sub w8, w8, #0xa4 (164)\",\n        \"ldr w6, [x8, #176]\",\n        \"add w10, w8, #0x18 (24)\",\n        \"ldr w20, [x28, #992]\",\n        \"ldr w4, [x20, #20]\",\n        \"str w4, [x8, #156]\",\n        \"subs w26, w4, w4\",\n        \"mov w4, #0x0\",\n        \"mov w20, #0x869c\",\n        \"movk w20, #0x5, lsl #16\",\n        \"add w20, w6, w20\",\n        \"ldr w4, [x20]\",\n        \"str w4, [x8]\",\n        \"mov w20, #0x30\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/x87-Oblivion.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"Block1\": {\n      \"x86InstructionCount\": 911,\n      \"ExpectedInstructionCount\": 7343,\n      \"x86Insts\": [\n        \"sub esp,0x118\",\n        \"fld dword [ecx + 0x1084]\",\n        \"fadd dword [ecx + 0x1008]\",\n        \"fstp dword [esp]\",\n        \"fld dword [ecx + 0x1080]\",\n        \"fadd dword [ecx + 0x100c]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [ecx + 0x107c]\",\n        \"fadd dword [ecx + 0x1010]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [ecx + 0x1078]\",\n        \"fadd dword [ecx + 0x1014]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [ecx + 0x1074]\",\n        \"fadd dword [ecx + 0x1018]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [ecx + 0x1070]\",\n        \"fadd dword [ecx + 0x101c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [ecx + 0x106c]\",\n        \"fadd dword [ecx + 0x1020]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [ecx + 0x1068]\",\n        \"fadd dword [ecx + 0x1024]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [ecx + 0x1064]\",\n        \"fadd dword [ecx + 0x1028]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [ecx + 0x1060]\",\n        \"fadd dword [ecx + 0x102c]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [ecx + 0x105c]\",\n        \"fadd dword [ecx + 0x1030]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [ecx + 0x1058]\",\n        \"fadd dword [ecx + 0x1034]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [ecx + 0x1054]\",\n        \"fadd dword [ecx + 0x1038]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [ecx + 0x1050]\",\n        \"fadd dword [ecx + 0x103c]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [ecx + 0x104c]\",\n        \"fadd dword [ecx + 0x1040]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [ecx + 0x1048]\",\n        \"fadd dword [ecx + 0x1044]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fld st0\",\n        \"fld dword [esp]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x38]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x4]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x34]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x30]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x28]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esp + 0x24]\",\n        \"fadd dword [esp + 0x18]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fxch st4\",\n        \"fsubrp st5,st0\",\n        \"fld dword [0x00b3c1d0]\",\n        \"fmulp st5\",\n        \"fxch st4\",\n        \"fstp dword [esp + 0x64]\",\n        \"fsubrp\",\n        \"fmul dword [0x00b3c1d4]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fsubrp\",\n        \"fmul dword [0x00b3c1d8]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x30]\",\n        \"fmul dword [0x00b3c1dc]\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x2c]\",\n        \"fmul dword [0x00b3c1e0]\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x28]\",\n        \"fmul dword [0x00b3c1e4]\",\n        \"fstp dword [esp + 0x78]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x24]\",\n        \"fmul dword [0x00b3c1e8]\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fmul dword [0x00b3c1ec]\",\n        \"fstp dword [esp + 0x80]\",\n        \"fld dword [esp + 0x60]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x44]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x48]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x58]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x4c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x54]\",\n        \"fadd dword [esp + 0x50]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fxch st4\",\n        \"fsubrp st5,st0\",\n        \"fld dword [0x00b3c1f0]\",\n        \"fld st0\",\n        \"fmulp st6\",\n        \"fxch st5\",\n        \"fstp dword [esp + 0x10]\",\n        \"fxch\",\n        \"fsubrp st2,st0\",\n        \"fld dword [0x00b3c1f4]\",\n        \"fld st0\",\n        \"fmulp st3\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x14]\",\n        \"fsubp st2,st0\",\n        \"fld dword [0x00b3c1f8]\",\n        \"fld st0\",\n        \"fmulp st3\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x50]\",\n        \"fsub dword [esp + 0x54]\",\n        \"fld dword [0x00b3c1fc]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x80]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x64]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fadd dword [esp + 0x68]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esp + 0x78]\",\n        \"fadd dword [esp + 0x6c]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x74]\",\n        \"fadd dword [esp + 0x70]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fsubrp\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x68]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"fmul st2\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fsub dword [esp + 0x78]\",\n        \"fmul st3\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x70]\",\n        \"fsub dword [esp + 0x74]\",\n        \"fmulp\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fld dword [esp]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fxch\",\n        \"fsubrp st2,st0\",\n        \"fld dword [0x00b3c200]\",\n        \"fld st0\",\n        \"fmulp st3\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fsubr dword [esp + 0x4]\",\n        \"fld dword [0x00b3c204]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fsubr dword [esp + 0x10]\",\n        \"fmul st2\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x20]\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x28]\",\n        \"fadd dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fsubr dword [esp + 0x20]\",\n        \"fmul st2\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0x24]\",\n        \"fsub dword [esp + 0x28]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x30]\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x38]\",\n        \"fadd dword [esp + 0x34]\",\n        \"fstp dword [esp + 0x78]\",\n        \"fsubr dword [esp + 0x30]\",\n        \"fmul st2\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x34]\",\n        \"fsub dword [esp + 0x38]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x80]\",\n        \"fld dword [esp + 0x48]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [esp]\",\n        \"fsubr dword [esp + 0x44]\",\n        \"fld dword [0x00b3c208]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x50]\",\n        \"fadd dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fsub dword [esp + 0x50]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0x58]\",\n        \"fadd dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x54]\",\n        \"fsub dword [esp + 0x58]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fsub dword [esp + 0x60]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x68]\",\n        \"fadd dword [esp + 0x64]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esp + 0x64]\",\n        \"fsub dword [esp + 0x68]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esp + 0x70]\",\n        \"fadd dword [esp + 0x6c]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fsub dword [esp + 0x70]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x78]\",\n        \"fadd dword [esp + 0x74]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x74]\",\n        \"fsub dword [esp + 0x78]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp + 0x80]\",\n        \"fadd dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fsub dword [esp + 0x80]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fst dword [esp + 0xc0]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fstp dword [esp + 0xa0]\",\n        \"fld dword [esp + 0xa0]\",\n        \"fchs\",\n        \"fstp dword [esp + 0x8c]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fstp dword [esp + 0xdc]\",\n        \"fld dword [esp + 0x18]\",\n        \"fchs\",\n        \"fsub dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [esp + 0xfc]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fst dword [esp + 0xc8]\",\n        \"fadd dword [esp + 0x2c]\",\n        \"fstp dword [esp + 0xb8]\",\n        \"fld dword [esp + 0xb8]\",\n        \"fadd dword [esp + 0x34]\",\n        \"fstp dword [esp + 0xa8]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fadd dword [esp + 0x34]\",\n        \"fadd dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x98]\",\n        \"fld dword [esp + 0x98]\",\n        \"fchs\",\n        \"fstp dword [esp + 0x84]\",\n        \"fld dword [esp + 0x84]\",\n        \"fsub dword [esp + 0x38]\",\n        \"fstp dword [esp + 0xd4]\",\n        \"fld dword [esp + 0x38]\",\n        \"fchs\",\n        \"fsub dword [esp + 0x3c]\",\n        \"fst qword [esp + 0x110]\",\n        \"fsub dword [esp + 0x28]\",\n        \"fsub dword [esp + 0x2c]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fsub dword [esp + 0x34]\",\n        \"fstp dword [esp + 0xe4]\",\n        \"fld dword [esp + 0x30]\",\n        \"fsubr qword [esp + 0x110]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fstp dword [esp + 0x104]\",\n        \"fld dword [esp + 0x40]\",\n        \"fsub dword [esp + 0x30]\",\n        \"fstp dword [esp + 0xf4]\",\n        \"fld dword [esp]\",\n        \"fchs\",\n        \"fstp dword [esp + 0x10c]\",\n        \"fld dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x90]\",\n        \"fld dword [esp + 0xc]\",\n        \"fst dword [esp + 0xb0]\",\n        \"fchs\",\n        \"fsub dword [esp + 0x8]\",\n        \"fstp dword [esp + 0xec]\",\n        \"fld dword [ecx + 0x1008]\",\n        \"fsub dword [ecx + 0x1084]\",\n        \"fmul dword [0x00b3c190]\",\n        \"fstp dword [esp]\",\n        \"fld dword [ecx + 0x100c]\",\n        \"fsub dword [ecx + 0x1080]\",\n        \"fmul dword [0x00b3c194]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [ecx + 0x1010]\",\n        \"fsub dword [ecx + 0x107c]\",\n        \"fmul dword [0x00b3c198]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [ecx + 0x1014]\",\n        \"fsub dword [ecx + 0x1078]\",\n        \"fmul dword [0x00b3c19c]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [ecx + 0x1018]\",\n        \"fsub dword [ecx + 0x1074]\",\n        \"fmul dword [0x00b3c1a0]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [ecx + 0x101c]\",\n        \"fsub dword [ecx + 0x1070]\",\n        \"fmul dword [0x00b3c1a4]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [ecx + 0x1020]\",\n        \"fsub dword [ecx + 0x106c]\",\n        \"fmul dword [0x00b3c1a8]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [ecx + 0x1024]\",\n        \"fsub dword [ecx + 0x1068]\",\n        \"fmul dword [0x00b3c1ac]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [ecx + 0x1028]\",\n        \"fsub dword [ecx + 0x1064]\",\n        \"fmul dword [0x00b3c1b0]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [ecx + 0x102c]\",\n        \"fsub dword [ecx + 0x1060]\",\n        \"fmul dword [0x00b3c1b4]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [ecx + 0x1030]\",\n        \"fsub dword [ecx + 0x105c]\",\n        \"fmul dword [0x00b3c1b8]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [ecx + 0x1034]\",\n        \"fsub dword [ecx + 0x1058]\",\n        \"fmul dword [0x00b3c1bc]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [ecx + 0x1038]\",\n        \"fsub dword [ecx + 0x1054]\",\n        \"fmul dword [0x00b3c1c0]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [ecx + 0x103c]\",\n        \"fsub dword [ecx + 0x1050]\",\n        \"fmul dword [0x00b3c1c4]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [ecx + 0x1040]\",\n        \"fsub dword [ecx + 0x104c]\",\n        \"fmul dword [0x00b3c1c8]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [ecx + 0x1044]\",\n        \"fsub dword [ecx + 0x1048]\",\n        \"fmul dword [0x00b3c1cc]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fadd dword [esp]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x38]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x34]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x30]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x28]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esp + 0x24]\",\n        \"fadd dword [esp + 0x18]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esp]\",\n        \"fsub dword [esp + 0x3c]\",\n        \"fmul dword [0x00b3c1d0]\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp + 0x38]\",\n        \"fmul dword [0x00b3c1d4]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0x34]\",\n        \"fmul dword [0x00b3c1d8]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x30]\",\n        \"fmul dword [0x00b3c1dc]\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x2c]\",\n        \"fmul dword [0x00b3c1e0]\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x28]\",\n        \"fmul dword [0x00b3c1e4]\",\n        \"fstp dword [esp + 0x78]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x24]\",\n        \"fmul dword [0x00b3c1e8]\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fmul dword [0x00b3c1ec]\",\n        \"fstp dword [esp + 0x80]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fadd dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x58]\",\n        \"fadd dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x54]\",\n        \"fadd dword [esp + 0x50]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0x44]\",\n        \"fsub dword [esp + 0x60]\",\n        \"fmul st6\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x48]\",\n        \"fsub dword [esp + 0x5c]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fsub dword [esp + 0x58]\",\n        \"fmul st5\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x50]\",\n        \"fsub dword [esp + 0x54]\",\n        \"fmul dword [0x00b3c1fc]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x80]\",\n        \"fadd dword [esp + 0x64]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fadd dword [esp + 0x68]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esp + 0x78]\",\n        \"fadd dword [esp + 0x6c]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x74]\",\n        \"fadd dword [esp + 0x70]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x64]\",\n        \"fsub dword [esp + 0x80]\",\n        \"fmulp st6\",\n        \"fxch st5\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x68]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"fmulp st3\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fsub dword [esp + 0x78]\",\n        \"fmulp st3\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x70]\",\n        \"fsub dword [esp + 0x74]\",\n        \"fmul dword [0x00b3c1fc]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fld dword [esp]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fxch\",\n        \"fsubrp st2,st0\",\n        \"fld st3\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fsubr dword [esp + 0x4]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x10]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x18]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fxch\",\n        \"fsubrp st2,st0\",\n        \"fld st3\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fsubr dword [esp + 0x14]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x20]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fxch\",\n        \"fsubrp st2,st0\",\n        \"fld st3\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fsubr dword [esp + 0x24]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x30]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x38]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x34]\",\n        \"fstp dword [esp + 0x78]\",\n        \"fxch\",\n        \"fsubrp st2,st0\",\n        \"fxch\",\n        \"fmulp st3\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x34]\",\n        \"fsubrp st2,st0\",\n        \"fmulp\",\n        \"fstp dword [esp + 0x80]\",\n        \"fld dword [esp + 0x48]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x44]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp]\",\n        \"fsubrp\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x50]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x4c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x8]\",\n        \"fsubrp\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0x58]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x54]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x10]\",\n        \"fsubrp\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x60]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x5c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x18]\",\n        \"fsubrp\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x68]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x64]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x20]\",\n        \"fsubrp\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esp + 0x70]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x6c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x28]\",\n        \"fsubrp\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x78]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x74]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x30]\",\n        \"fsubrp\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp + 0x80]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x7c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fsubrp\",\n        \"fmulp\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x1c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0xc4]\",\n        \"fld dword [esp + 0xc4]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x2c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0xbc]\",\n        \"fld dword [esp + 0xbc]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fld dword [esp + 0x34]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0xa4]\",\n        \"fld st4\",\n        \"fadd st0,st2\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0xb4]\",\n        \"fld dword [esp + 0xb4]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0xac]\",\n        \"fld st4\",\n        \"fadd st0,st1\",\n        \"fadd dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x94]\",\n        \"fld dword [esp + 0x94]\",\n        \"fchs\",\n        \"fstp dword [esp + 0x110]\",\n        \"fld dword [esp + 0x110]\",\n        \"fld dword [esp + 0x38]\",\n        \"fld st0\",\n        \"fsubp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0xd0]\",\n        \"fld dword [esp + 0x40]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fadd st0,st5\",\n        \"fstp dword [esp + 0x9c]\",\n        \"fld dword [esp + 0x9c]\",\n        \"fchs\",\n        \"fstp dword [esp + 0x88]\",\n        \"fld dword [esp + 0x88]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fsub st0,st1\",\n        \"fstp dword [esp + 0xd8]\",\n        \"fld dword [esp + 0x28]\",\n        \"fchs\",\n        \"fsubrp st3,st0\",\n        \"fld st0\",\n        \"fsubp st3,st0\",\n        \"fld st5\",\n        \"fsubp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fld st0\",\n        \"fsubrp st2,st0\",\n        \"fld dword [esp + 0x8]\",\n        \"fsubr st0,st2\",\n        \"fsub dword [esp + 0xc]\",\n        \"fstp dword [esp + 0xe8]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsubp st2,st0\",\n        \"fld dword [esp + 0x18]\",\n        \"fsubp st2,st0\",\n        \"fld st4\",\n        \"fsubp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0xe0]\",\n        \"fld dword [esp + 0x30]\",\n        \"fld st0\",\n        \"fsubp st2,st0\",\n        \"fld dword [esp + 0x8]\",\n        \"fsubr st0,st2\",\n        \"fsub dword [esp + 0xc]\",\n        \"fstp dword [esp + 0xf0]\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x10]\",\n        \"faddp st5,st0\",\n        \"mov eax,dword [ecx + 0x1004]\",\n        \"mov edx,dword [ecx + 0x1000]\",\n        \"fxch st4\",\n        \"lea eax,[edx + eax*0x4]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fld st0\",\n        \"fsubp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0xf8]\",\n        \"fld dword [esp + 0x20]\",\n        \"fchs\",\n        \"fsubrp st4,st0\",\n        \"fxch st3\",\n        \"fsubrp\",\n        \"fsub st0,st3\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fld st0\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x108]\",\n        \"fsubrp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x100]\",\n        \"fld dword [esp + 0x90]\",\n        \"fstp dword [eax]\",\n        \"fld dword [esp + 0x94]\",\n        \"fstp dword [eax + 0x40]\",\n        \"fld dword [esp + 0x98]\",\n        \"fstp dword [eax + 0x80]\",\n        \"fld dword [esp + 0x9c]\",\n        \"fstp dword [eax + 0xc0]\",\n        \"fld dword [esp + 0xa0]\",\n        \"fstp dword [eax + 0x100]\",\n        \"fld dword [esp + 0xa4]\",\n        \"fst dword [eax + 0x140]\",\n        \"fld dword [esp + 0xa8]\",\n        \"fst dword [eax + 0x180]\",\n        \"fld dword [esp + 0xac]\",\n        \"fst dword [eax + 0x1c0]\",\n        \"fld dword [esp + 0xb0]\",\n        \"fst dword [eax + 0x200]\",\n        \"fld dword [esp + 0xb4]\",\n        \"fstp dword [eax + 0x240]\",\n        \"fld dword [esp + 0xb8]\",\n        \"fst dword [eax + 0x280]\",\n        \"fld dword [esp + 0xbc]\",\n        \"fstp dword [eax + 0x2c0]\",\n        \"fld dword [esp + 0xc0]\",\n        \"fstp dword [eax + 0x300]\",\n        \"fxch st5\",\n        \"fst dword [eax + 0x340]\",\n        \"fld dword [esp + 0xc8]\",\n        \"fstp dword [eax + 0x380]\",\n        \"fxch st6\",\n        \"fst dword [eax + 0x3c0]\",\n        \"fldz\",\n        \"fstp dword [eax + 0x400]\",\n        \"fchs\",\n        \"fstp dword [eax + 0x440]\",\n        \"fld dword [esp + 0xc8]\",\n        \"fchs\",\n        \"fstp dword [eax + 0x480]\",\n        \"fxch st5\",\n        \"fchs\",\n        \"fstp dword [eax + 0x4c0]\",\n        \"fld dword [esp + 0xc0]\",\n        \"fchs\",\n        \"fstp dword [eax + 0x500]\",\n        \"fld dword [esp + 0xbc]\",\n        \"fchs\",\n        \"fstp dword [eax + 0x540]\",\n        \"fxch st3\",\n        \"fchs\",\n        \"fstp dword [eax + 0x580]\",\n        \"fld dword [esp + 0xb4]\",\n        \"fchs\",\n        \"fstp dword [eax + 0x5c0]\",\n        \"fxch st3\",\n        \"fchs\",\n        \"fstp dword [eax + 0x600]\",\n        \"fxch\",\n        \"fchs\",\n        \"fstp dword [eax + 0x640]\",\n        \"fxch\",\n        \"fchs\",\n        \"fstp dword [eax + 0x680]\",\n        \"fchs\",\n        \"fstp dword [eax + 0x6c0]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [eax + 0x700]\",\n        \"fld dword [esp + 0x88]\",\n        \"fstp dword [eax + 0x740]\",\n        \"fld dword [esp + 0x84]\",\n        \"fstp dword [eax + 0x780]\",\n        \"fld dword [esp + 0x110]\",\n        \"fstp dword [eax + 0x7c0]\",\n        \"cmp dword [ecx + 0x1000],ecx\",\n        \"lea eax,[ecx + 0x800]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub w8, w8, #0x118 (280)\",\n        \"ldr s2, [x7, #4228]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8]\",\n        \"ldr s2, [x7, #4224]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #4]\",\n        \"ldr s2, [x7, #4220]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #8]\",\n        \"ldr s2, [x7, #4216]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x7, #4212]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x7, #4208]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x7, #4204]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x7, #4200]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x7, #4196]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #32]\",\n        \"ldr s2, [x7, #4192]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4140]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #36]\",\n        \"ldr s2, [x7, #4188]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4144]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x7, #4184]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4148]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x7, #4180]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4152]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x7, #4176]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4156]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #52]\",\n        \"ldr s2, [x7, #4172]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4160]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x7, #4168]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #4164]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #68]\",\n        \"ldr s4, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #72]\",\n        \"ldr s6, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #76]\",\n        \"ldr s8, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #80]\",\n        \"ldr s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #84]\",\n        \"ldr s8, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #88]\",\n        \"ldr s8, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #92]\",\n        \"ldr s8, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #96]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1d0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1d4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1d8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #108]\",\n        \"ldr s2, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1dc\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #112]\",\n        \"ldr s2, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1e0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #116]\",\n        \"ldr s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1e4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #120]\",\n        \"ldr s2, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1e8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #124]\",\n        \"ldr s2, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1ec\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #128]\",\n        \"ldr s2, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8]\",\n        \"ldr s4, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #4]\",\n        \"ldr s6, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #8]\",\n        \"ldr s8, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #12]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1f0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #16]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1f4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s4, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1f8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s5, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s6, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1fc\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s6, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s7, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #32]\",\n        \"ldr s8, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #36]\",\n        \"ldr s8, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #40]\",\n        \"ldr s8, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s7, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #52]\",\n        \"ldr s2, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s7, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s7, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s6, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #68]\",\n        \"ldr s7, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #72]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc200\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s6, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #76]\",\n        \"ldr s2, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc204\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s7, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #80]\",\n        \"ldr s2, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #84]\",\n        \"ldr s8, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #88]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #92]\",\n        \"ldr s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s8, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #96]\",\n        \"ldr s2, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s8, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #100]\",\n        \"ldr s8, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #104]\",\n        \"ldr s8, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #108]\",\n        \"ldr s2, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s8, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #112]\",\n        \"ldr s2, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s8, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #116]\",\n        \"ldr s8, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #120]\",\n        \"ldr s8, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #124]\",\n        \"ldr s2, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s8, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #128]\",\n        \"ldr s2, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s8, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8]\",\n        \"ldr s8, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc208\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s8, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #4]\",\n        \"ldr s2, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #8]\",\n        \"ldr s2, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #32]\",\n        \"ldr s2, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #36]\",\n        \"ldr s2, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #52]\",\n        \"ldr s2, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str s2, [x8, #192]\",\n        \"ldr s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #160]\",\n        \"ldr s2, [x8, #160]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q9, [x28, #3552]\",\n        \"eor v2.16b, v2.16b, v9.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #140]\",\n        \"ldr s2, [x8, #140]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #220]\",\n        \"ldr s2, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q9, [x28, #3552]\",\n        \"eor v2.16b, v2.16b, v9.16b\",\n        \"ldr s9, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #252]\",\n        \"ldr s2, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str s2, [x8, #200]\",\n        \"ldr s2, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #184]\",\n        \"ldr s2, [x8, #184]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #168]\",\n        \"ldr s2, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #152]\",\n        \"ldr s2, [x8, #152]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q9, [x28, #3552]\",\n        \"eor v2.16b, v2.16b, v9.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #132]\",\n        \"ldr s2, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #212]\",\n        \"ldr s2, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q9, [x28, #3552]\",\n        \"eor v2.16b, v2.16b, v9.16b\",\n        \"ldr s9, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d9, d0\",\n        \"str d9, [x8, #272]\",\n        \"ldr s9, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #64]\",\n        \"ldr s2, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #228]\",\n        \"ldr s2, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d9, [x8, #272]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #260]\",\n        \"ldr s2, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #244]\",\n        \"ldr s2, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q9, [x28, #3552]\",\n        \"eor v2.16b, v2.16b, v9.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #268]\",\n        \"ldr s2, [x8, #4]\",\n        \"str s2, [x8, #144]\",\n        \"ldr s2, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str s2, [x8, #176]\",\n        \"ldr q2, [x28, #3552]\",\n        \"eor v2.16b, v9.16b, v2.16b\",\n        \"ldr s9, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #236]\",\n        \"ldr s2, [x7, #4104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4228]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc190\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8]\",\n        \"ldr s2, [x7, #4108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4224]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc194\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #4]\",\n        \"ldr s2, [x7, #4112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4220]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc198\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #8]\",\n        \"ldr s2, [x7, #4116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4216]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc19c\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x7, #4120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4212]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1a0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x7, #4124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4208]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1a4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x7, #4128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4204]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1a8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x7, #4132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4200]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1ac\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x7, #4136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4196]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1b0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #32]\",\n        \"ldr s2, [x7, #4140]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4192]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1b4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #36]\",\n        \"ldr s2, [x7, #4144]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4188]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1b8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x7, #4148]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4184]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1bc\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x7, #4152]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4180]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1c0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x7, #4156]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4176]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1c4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #52]\",\n        \"ldr s2, [x7, #4160]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4172]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1c8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x7, #4164]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x7, #4168]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1cc\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #68]\",\n        \"ldr s2, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #72]\",\n        \"ldr s2, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #76]\",\n        \"ldr s2, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #80]\",\n        \"ldr s2, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #84]\",\n        \"ldr s2, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #88]\",\n        \"ldr s2, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #92]\",\n        \"ldr s2, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #96]\",\n        \"ldr s2, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1d0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #100]\",\n        \"ldr s2, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1d4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #104]\",\n        \"ldr s2, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1d8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #108]\",\n        \"ldr s2, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1dc\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #112]\",\n        \"ldr s2, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1e0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #116]\",\n        \"ldr s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1e4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #120]\",\n        \"ldr s2, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1e8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #124]\",\n        \"ldr s2, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1ec\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #128]\",\n        \"ldr s2, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8]\",\n        \"ldr s2, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #4]\",\n        \"ldr s2, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #8]\",\n        \"ldr s2, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xc1fc\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #32]\",\n        \"ldr s2, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #36]\",\n        \"ldr s2, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s9, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #52]\",\n        \"ldr s2, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #68]\",\n        \"ldr s4, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #72]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #76]\",\n        \"ldr s2, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #80]\",\n        \"ldr s2, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #84]\",\n        \"ldr s4, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #88]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #92]\",\n        \"ldr s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #96]\",\n        \"ldr s2, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #100]\",\n        \"ldr s4, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #104]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #108]\",\n        \"ldr s2, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #112]\",\n        \"ldr s2, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #116]\",\n        \"ldr s4, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #120]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #124]\",\n        \"ldr s2, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #128]\",\n        \"ldr s2, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #4]\",\n        \"ldr s2, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #36]\",\n        \"ldr s2, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #52]\",\n        \"ldr s2, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #196]\",\n        \"ldr s5, [x8, #196]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #188]\",\n        \"ldr s8, [x8, #188]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #164]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s10, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s10\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #180]\",\n        \"ldr s8, [x8, #180]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #172]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s10, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s10\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #64]\",\n        \"ldr s8, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s10, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s10\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #148]\",\n        \"ldr s8, [x8, #148]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr q10, [x28, #3552]\",\n        \"eor v8.16b, v8.16b, v10.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #272]\",\n        \"ldr s8, [x8, #272]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s10, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s10\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #208]\",\n        \"ldr s8, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s11, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s11\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v11.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v11.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #156]\",\n        \"ldr s8, [x8, #156]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr q11, [x28, #3552]\",\n        \"eor v8.16b, v8.16b, v11.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #136]\",\n        \"ldr s8, [x8, #136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s11, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s11\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v11.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v11.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #216]\",\n        \"ldr s8, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr q11, [x28, #3552]\",\n        \"eor v8.16b, v8.16b, v11.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #64]\",\n        \"ldr s7, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr s11, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s11\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v11.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v11.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #232]\",\n        \"ldr s9, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #224]\",\n        \"ldr s8, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s9, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr s11, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s11\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v11.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v11.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #240]\",\n        \"ldr s9, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr s11, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s11\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v11.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v11.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x7, #4100]\",\n        \"ldr w5, [x7, #4096]\",\n        \"strb wzr, [x28, #1049]\",\n        \"add w4, w5, w4, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #64]\",\n        \"ldr s4, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #248]\",\n        \"ldr s7, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr q9, [x28, #3552]\",\n        \"eor v7.16b, v7.16b, v9.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #64]\",\n        \"ldr s7, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #264]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #256]\",\n        \"ldr s4, [x8, #144]\",\n        \"str s4, [x4]\",\n        \"ldr s4, [x8, #148]\",\n        \"str s4, [x4, #64]\",\n        \"ldr s4, [x8, #152]\",\n        \"str s4, [x4, #128]\",\n        \"ldr s4, [x8, #156]\",\n        \"str s4, [x4, #192]\",\n        \"ldr s4, [x8, #160]\",\n        \"str s4, [x4, #256]\",\n        \"ldr s4, [x8, #164]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str s4, [x4, #320]\",\n        \"ldr s4, [x8, #168]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str s4, [x4, #384]\",\n        \"ldr s4, [x8, #172]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str s4, [x4, #448]\",\n        \"ldr s4, [x8, #176]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str s4, [x4, #512]\",\n        \"ldr s4, [x8, #180]\",\n        \"str s4, [x4, #576]\",\n        \"ldr s4, [x8, #184]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v11.16b, v0.16b\",\n        \"str s4, [x4, #640]\",\n        \"ldr s4, [x8, #188]\",\n        \"str s4, [x4, #704]\",\n        \"ldr s4, [x8, #192]\",\n        \"str s4, [x4, #768]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s5, [x4, #832]\",\n        \"ldr s4, [x8, #200]\",\n        \"str s4, [x4, #896]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s2, [x4, #960]\",\n        \"movi v2.2d, #0x0\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #1024]\",\n        \"ldr q2, [x28, #3552]\",\n        \"eor v2.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #1088]\",\n        \"ldr s2, [x8, #200]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q3, [x28, #3552]\",\n        \"eor v2.16b, v2.16b, v3.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #1152]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr q2, [x28, #3552]\",\n        \"eor v2.16b, v6.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #1216]\",\n        \"ldr s2, [x8, #192]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q3, [x28, #3552]\",\n        \"eor v2.16b, v2.16b, v3.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #1280]\",\n        \"ldr s2, [x8, #188]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q3, [x28, #3552]\",\n        \"eor v2.16b, v2.16b, v3.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #1344]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr q2, [x28, #3552]\",\n        \"eor v2.16b, v11.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #1408]\",\n        \"ldr s2, [x8, #180]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q3, [x28, #3552]\",\n        \"eor v2.16b, v2.16b, v3.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #1472]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr q2, [x28, #3552]\",\n        \"eor v2.16b, v10.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #1536]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr q2, [x28, #3552]\",\n        \"eor v2.16b, v9.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #1600]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr q2, [x28, #3552]\",\n        \"eor v2.16b, v8.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #1664]\",\n        \"ldr q2, [x28, #3552]\",\n        \"eor v2.16b, v7.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #1728]\",\n        \"ldr s2, [x8, #140]\",\n        \"str s2, [x4, #1792]\",\n        \"ldr s2, [x8, #136]\",\n        \"str s2, [x4, #1856]\",\n        \"ldr s2, [x8, #132]\",\n        \"str s2, [x4, #1920]\",\n        \"ldr s2, [x8, #272]\",\n        \"str s2, [x4, #1984]\",\n        \"ldr w20, [x7, #4096]\",\n        \"eor x27, x20, x7\",\n        \"subs w26, w20, w7\",\n        \"add w4, w7, #0x800 (2048)\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block2\": {\n      \"x86InstructionCount\": 630,\n      \"ExpectedInstructionCount\": 4711,\n      \"x86Insts\": [\n        \"mov eax,dword [ebp + 0x8]\",\n        \"fld dword [eax + 0x40]\",\n        \"fld dword [eax + 0x44]\",\n        \"fadd st0,st1\",\n        \"fstp dword [eax + 0x44]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x40]\",\n        \"fld dword [eax + 0x38]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x3c]\",\n        \"fld dword [eax + 0x34]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x38]\",\n        \"fld dword [eax + 0x30]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x34]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x30]\",\n        \"fld dword [eax + 0x28]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x2c]\",\n        \"fld dword [eax + 0x24]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x28]\",\n        \"fld dword [eax + 0x20]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x24]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x20]\",\n        \"fld dword [eax + 0x18]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x1c]\",\n        \"fld dword [eax + 0x14]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x18]\",\n        \"fld dword [eax + 0x10]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x14]\",\n        \"fld dword [eax + 0xc]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x8]\",\n        \"fld dword [eax]\",\n        \"fst qword [esp + 0x20]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst dword [eax + 0x4]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fld dword [eax + 0x44]\",\n        \"fadd st0,st1\",\n        \"fstp dword [eax + 0x44]\",\n        \"fld dword [eax + 0x34]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x3c]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x34]\",\n        \"fld dword [eax + 0x24]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x2c]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x24]\",\n        \"fld dword [eax + 0x14]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x1c]\",\n        \"fld dword [eax + 0xc]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x14]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fstp dword [eax + 0xc]\",\n        \"fadd st0,st0\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + 0x30]\",\n        \"fst qword [esp + 0x18]\",\n        \"fld dword [esp + 0x14]\",\n        \"fst qword [esp + 0x28]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fst qword [esp + 0x80]\",\n        \"fld dword [eax + 0x20]\",\n        \"fld dword [eax + 0x40]\",\n        \"fld st3\",\n        \"fld qword [0x00a77b70]\",\n        \"fmul st1\",\n        \"fxch\",\n        \"faddp st4,st0\",\n        \"fld st2\",\n        \"fld qword [0x00a77b68]\",\n        \"fmul st1\",\n        \"fxch st5\",\n        \"faddp\",\n        \"fld st2\",\n        \"fld qword [0x00a77b60]\",\n        \"fmul st1\",\n        \"fxch st2\",\n        \"faddp\",\n        \"fstp dword [esp + 0xc0]\",\n        \"fld qword [esp + 0x28]\",\n        \"fadd st0,st6\",\n        \"fsub st0,st4\",\n        \"fld qword [esp + 0x18]\",\n        \"fsub st1,st0\",\n        \"fsubp\",\n        \"fsub st0,st3\",\n        \"fstp dword [esp + 0xd0]\",\n        \"fld st5\",\n        \"fmul st1\",\n        \"fsubr qword [esp + 0x80]\",\n        \"fld st4\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fld st3\",\n        \"fmul st6\",\n        \"faddp\",\n        \"fstp dword [esp + 0xb8]\",\n        \"fld st5\",\n        \"fmul st5\",\n        \"fsubr qword [esp + 0x80]\",\n        \"fld st4\",\n        \"fmul st2\",\n        \"faddp\",\n        \"fld st3\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [esp + 0xc8]\",\n        \"fld qword [esp + 0x20]\",\n        \"fsubrp st6,st0\",\n        \"fxch st5\",\n        \"faddp st3,st0\",\n        \"fxch st2\",\n        \"fsub qword [esp + 0x18]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x80]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmul qword [0x00a77b58]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + 0x8]\",\n        \"fst qword [esp + 0x18]\",\n        \"fld dword [esp + 0x14]\",\n        \"fst qword [esp + 0x20]\",\n        \"fld dword [eax + 0x28]\",\n        \"fst qword [esp + 0x90]\",\n        \"fld dword [eax + 0x38]\",\n        \"fst qword [esp + 0x28]\",\n        \"fld qword [0x00a77b50]\",\n        \"fmul st4\",\n        \"fxch st4\",\n        \"faddp st3,st0\",\n        \"fld qword [0x00a77b48]\",\n        \"fmul st2\",\n        \"fxch st3\",\n        \"faddp st2,st0\",\n        \"fld qword [0x00a77b40]\",\n        \"fmul st1\",\n        \"fxch st2\",\n        \"faddp\",\n        \"fstp dword [esp + 0xb4]\",\n        \"fld qword [esp + 0x18]\",\n        \"fld qword [esp + 0x90]\",\n        \"fsub st1,st0\",\n        \"fxch\",\n        \"fsub qword [esp + 0x28]\",\n        \"fmul qword [0x00a77b58]\",\n        \"fstp dword [esp + 0xc4]\",\n        \"fld qword [esp + 0x18]\",\n        \"fmul st3\",\n        \"fsub qword [esp + 0x20]\",\n        \"fxch\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fld qword [esp + 0x28]\",\n        \"fmul st4\",\n        \"faddp\",\n        \"fstp dword [esp + 0xa8]\",\n        \"fld qword [esp + 0x18]\",\n        \"fmul st1\",\n        \"fsub qword [esp + 0x20]\",\n        \"fld qword [esp + 0x90]\",\n        \"fmul st4\",\n        \"faddp\",\n        \"fld qword [esp + 0x28]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x90]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst qword [esp + 0x8]\",\n        \"fadd st0,st0\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + 0x34]\",\n        \"fst qword [esp + 0x98]\",\n        \"fld dword [esp + 0x14]\",\n        \"fst qword [esp + 0xa0]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + 0x14]\",\n        \"fst qword [esp + 0x20]\",\n        \"fld dword [esp + 0x14]\",\n        \"fstp qword [esp + 0x88]\",\n        \"fld dword [eax + 0x24]\",\n        \"fstp qword [esp + 0x18]\",\n        \"fld dword [eax + 0x44]\",\n        \"fstp qword [esp + 0x28]\",\n        \"fmul st4\",\n        \"fadd qword [esp + 0x88]\",\n        \"fld qword [esp + 0x18]\",\n        \"fmul st6\",\n        \"faddp\",\n        \"fld qword [esp + 0x28]\",\n        \"fmul st7\",\n        \"faddp\",\n        \"fstp dword [esp + 0xb0]\",\n        \"fld qword [esp + 0xa0]\",\n        \"fadd qword [esp + 0x20]\",\n        \"fsub qword [esp + 0x18]\",\n        \"fld qword [esp + 0x98]\",\n        \"fsub st1,st0\",\n        \"fsubp\",\n        \"fsub qword [esp + 0x28]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld qword [esp + 0x20]\",\n        \"fmul st6\",\n        \"fsubr qword [esp + 0x88]\",\n        \"fld qword [esp + 0x18]\",\n        \"fmul st5\",\n        \"fsubp\",\n        \"fld qword [esp + 0x28]\",\n        \"fmul st6\",\n        \"faddp\",\n        \"fstp dword [esp + 0xa0]\",\n        \"fld qword [esp + 0x20]\",\n        \"fld st0\",\n        \"fmulp st6\",\n        \"fld qword [esp + 0x88]\",\n        \"fsubrp st6,st0\",\n        \"fld qword [esp + 0x18]\",\n        \"fmulp st7\",\n        \"fxch st5\",\n        \"faddp st6,st0\",\n        \"fld qword [esp + 0x28]\",\n        \"fld st0\",\n        \"fmulp st5\",\n        \"fxch st6\",\n        \"fsubrp st4,st0\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld qword [esp + 0x8]\",\n        \"fsubrp st4,st0\",\n        \"fxch st3\",\n        \"fadd qword [esp + 0x18]\",\n        \"fsub qword [esp + 0x98]\",\n        \"faddp st4,st0\",\n        \"fxch st3\",\n        \"fmul qword [0x00a77bd8]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmul qword [0x00a77b58]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x14]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fld dword [esp + 0x4]\",\n        \"fmul st6\",\n        \"fadd st0,st3\",\n        \"fld st2\",\n        \"fmul st6\",\n        \"faddp\",\n        \"fld st1\",\n        \"fmul st5\",\n        \"faddp\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + 0xc]\",\n        \"fst qword [esp + 0x20]\",\n        \"fsub st0,st2\",\n        \"fsub st0,st1\",\n        \"fmul qword [0x00a77b58]\",\n        \"fstp dword [esp + 0x98]\",\n        \"fld qword [esp + 0x20]\",\n        \"fmul st5\",\n        \"fsub st0,st3\",\n        \"fld st2\",\n        \"fmul st5\",\n        \"fsubp\",\n        \"fld st1\",\n        \"fmul st7\",\n        \"faddp\",\n        \"fstp dword [esp + 0x88]\",\n        \"fld qword [esp + 0x20]\",\n        \"fmulp st4\",\n        \"fxch st3\",\n        \"fsubrp st2,st0\",\n        \"fmulp st4\",\n        \"faddp st3,st0\",\n        \"fmulp\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esp + 0xb4]\",\n        \"fld dword [esp + 0xc0]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x14]\",\n        \"fld dword [esp + 0xb0]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fmul qword [0x00a77b38]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x38]\",\n        \"fsubrp\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0xc4]\",\n        \"fld dword [esp + 0xd0]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x98]\",\n        \"fst qword [esp + 0xd0]\",\n        \"fld dword [esp + 0x30]\",\n        \"fst qword [esp + 0x98]\",\n        \"faddp\",\n        \"fmul qword [0x00a77bd0]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst qword [esp + 0x30]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fsubr qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x78]\",\n        \"fld dword [esp + 0xa8]\",\n        \"fst qword [esp + 0xa8]\",\n        \"fld dword [esp + 0xb8]\",\n        \"fst qword [esp + 0xb8]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x88]\",\n        \"fst qword [esp + 0x88]\",\n        \"fld dword [esp + 0xa0]\",\n        \"fst qword [esp + 0xa0]\",\n        \"faddp\",\n        \"fmul qword [0x00a77b30]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst qword [esp + 0x30]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x40]\",\n        \"fsubr qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x90]\",\n        \"fst qword [esp + 0x90]\",\n        \"fld dword [esp + 0xc8]\",\n        \"fst qword [esp + 0xc8]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x20]\",\n        \"fst qword [esp + 0x20]\",\n        \"fld dword [esp + 0x28]\",\n        \"fst qword [esp + 0x28]\",\n        \"faddp\",\n        \"fmul qword [0x00a77b28]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst qword [esp + 0x30]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x44]\",\n        \"fsubr qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [esp + 0x18]\",\n        \"fld dword [esp + 0x80]\",\n        \"fst qword [esp + 0x80]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x48]\",\n        \"fsubr qword [esp + 0x80]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld qword [esp + 0xc8]\",\n        \"fsub qword [esp + 0x90]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld qword [esp + 0x28]\",\n        \"fsub qword [esp + 0x20]\",\n        \"fmul qword [0x00a77b20]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst qword [esp + 0x30]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fsubr qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fld qword [esp + 0xb8]\",\n        \"fsub qword [esp + 0xa8]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld qword [esp + 0xa0]\",\n        \"fsub qword [esp + 0x88]\",\n        \"fmul qword [0x00a77b18]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst qword [esp + 0x30]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x50]\",\n        \"fsubr qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x64]\",\n        \"fsubrp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld qword [esp + 0x98]\",\n        \"fsub qword [esp + 0xd0]\",\n        \"fmul qword [0x00a77be0]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x54]\",\n        \"fsubrp\",\n        \"fstp dword [esp + 0x60]\",\n        \"fxch st2\",\n        \"fsubrp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x8]\",\n        \"fsubrp\",\n        \"fmul qword [0x00a77b10]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"lea eax,[ecx + ecx*0x8]\",\n        \"fld st0\",\n        \"mov ecx,dword [ebp + 0xc]\",\n        \"fadd st0,st2\",\n        \"shl eax,0x4\",\n        \"add eax,0xb183d0\",\n        \"fstp dword [esp + 0x58]\",\n        \"fsubrp\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fld st0\",\n        \"fchs\",\n        \"fmul dword [eax]\",\n        \"fstp dword [ecx]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld dword [esp + 0x60]\",\n        \"fld st0\",\n        \"fchs\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [ecx + 0x4]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld dword [esp + 0x64]\",\n        \"fld st0\",\n        \"fchs\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [ecx + 0x8]\",\n        \"fld dword [eax + 0xc]\",\n        \"fld dword [esp + 0x68]\",\n        \"fld st0\",\n        \"fchs\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [ecx + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fld st0\",\n        \"fchs\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [ecx + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"fld dword [esp + 0x70]\",\n        \"fld st0\",\n        \"fchs\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [ecx + 0x14]\",\n        \"fld dword [eax + 0x18]\",\n        \"fld dword [esp + 0x74]\",\n        \"fchs\",\n        \"fmulp\",\n        \"fstp dword [ecx + 0x18]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fld dword [esp + 0x78]\",\n        \"fchs\",\n        \"fmulp\",\n        \"fstp dword [ecx + 0x1c]\",\n        \"fld dword [eax + 0x20]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fchs\",\n        \"fmulp\",\n        \"fstp dword [ecx + 0x20]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmul dword [esp + 0x7c]\",\n        \"fstp dword [ecx + 0x24]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [ecx + 0x28]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmul dword [esp + 0x74]\",\n        \"fstp dword [ecx + 0x2c]\",\n        \"fmul dword [eax + 0x30]\",\n        \"fstp dword [ecx + 0x30]\",\n        \"fmul dword [eax + 0x34]\",\n        \"fstp dword [ecx + 0x34]\",\n        \"fmul dword [eax + 0x38]\",\n        \"fstp dword [ecx + 0x38]\",\n        \"fmul dword [eax + 0x3c]\",\n        \"fstp dword [ecx + 0x3c]\",\n        \"fmul dword [eax + 0x40]\",\n        \"fstp dword [ecx + 0x40]\",\n        \"fmul dword [eax + 0x44]\",\n        \"fstp dword [ecx + 0x44]\",\n        \"fld dword [esp + 0x58]\",\n        \"fld dword [eax + 0x48]\",\n        \"fmul st1\",\n        \"fstp dword [ecx + 0x48]\",\n        \"fld dword [esp + 0x54]\",\n        \"fld dword [eax + 0x4c]\",\n        \"fmul st1\",\n        \"fstp dword [ecx + 0x4c]\",\n        \"fld dword [esp + 0x50]\",\n        \"fld dword [eax + 0x50]\",\n        \"fmul st1\",\n        \"fstp dword [ecx + 0x50]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fld dword [eax + 0x54]\",\n        \"fmul st1\",\n        \"fstp dword [ecx + 0x54]\",\n        \"fld dword [esp + 0x48]\",\n        \"fld dword [eax + 0x58]\",\n        \"fmul st1\",\n        \"fstp dword [ecx + 0x58]\",\n        \"fld dword [esp + 0x44]\",\n        \"fld dword [eax + 0x5c]\",\n        \"fmul st1\",\n        \"fstp dword [ecx + 0x5c]\",\n        \"fld dword [esp + 0x40]\",\n        \"fst qword [esp + 0x18]\",\n        \"fmul dword [eax + 0x60]\",\n        \"fstp dword [ecx + 0x60]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fst qword [esp + 0x80]\",\n        \"fmul dword [eax + 0x64]\",\n        \"fstp dword [ecx + 0x64]\",\n        \"fld dword [esp + 0x38]\",\n        \"fld dword [eax + 0x68]\",\n        \"fmul st1\",\n        \"fstp dword [ecx + 0x68]\",\n        \"fmul dword [eax + 0x6c]\",\n        \"fstp dword [ecx + 0x6c]\",\n        \"fld dword [eax + 0x70]\",\n        \"fmul qword [esp + 0x80]\",\n        \"fstp dword [ecx + 0x70]\",\n        \"fld dword [eax + 0x74]\",\n        \"fmul qword [esp + 0x18]\",\n        \"fstp dword [ecx + 0x74]\",\n        \"fmul dword [eax + 0x78]\",\n        \"fstp dword [ecx + 0x78]\",\n        \"fmul dword [eax + 0x7c]\",\n        \"fstp dword [ecx + 0x7c]\",\n        \"fmul dword [eax + 0x80]\",\n        \"fstp dword [ecx + 0x80]\",\n        \"fmul dword [eax + 0x84]\",\n        \"fstp dword [ecx + 0x84]\",\n        \"fmul dword [eax + 0x88]\",\n        \"fstp dword [ecx + 0x88]\",\n        \"fmul dword [eax + 0x8c]\",\n        \"fstp dword [ecx + 0x8c]\",\n        \"mov esp,ebp\",\n        \"pop ebp\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x9, #8]\",\n        \"ldr s2, [x4, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #68]\",\n        \"ldr s3, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #64]\",\n        \"ldr s2, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #60]\",\n        \"ldr s3, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #56]\",\n        \"ldr s2, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #52]\",\n        \"ldr s3, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #48]\",\n        \"ldr s2, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #44]\",\n        \"ldr s3, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #40]\",\n        \"ldr s2, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #36]\",\n        \"ldr s3, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #32]\",\n        \"ldr s2, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #28]\",\n        \"ldr s3, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #24]\",\n        \"ldr s2, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #20]\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #16]\",\n        \"ldr s2, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #12]\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #8]\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d4, d0\",\n        \"str d4, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #8]\",\n        \"ldr s3, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str s3, [x4, #4]\",\n        \"ldr s3, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s5, [x4, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x4, #68]\",\n        \"ldr s5, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #60]\",\n        \"ldr s3, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x4, #52]\",\n        \"ldr s5, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #44]\",\n        \"ldr s3, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x4, #36]\",\n        \"ldr s5, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #28]\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #4]\",\n        \"ldr s3, [x8, #4]\",\n        \"str s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"str d3, [x8, #24]\",\n        \"ldr s3, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d4, d0\",\n        \"str d4, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d4, d0\",\n        \"str d4, [x8, #128]\",\n        \"ldr s4, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x4, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"mov w20, #0x7b70\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d6, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d6\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"mov w20, #0x7b68\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d7, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d7\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"mov w20, #0x7b60\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d8, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d8\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #192]\",\n        \"ldr d3, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr d9, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #208]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr d9, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #184]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr d9, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #200]\",\n        \"ldr d3, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr d3, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #128]\",\n        \"ldr s2, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0x7b58\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"str d3, [x8, #24]\",\n        \"ldr s3, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d4, d0\",\n        \"str d4, [x8, #32]\",\n        \"ldr s4, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d5, d0\",\n        \"str d5, [x8, #144]\",\n        \"ldr s5, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d9, d0\",\n        \"str d9, [x8, #40]\",\n        \"mov w21, #0x7b50\",\n        \"movk w21, #0xa7, lsl #16\",\n        \"ldr d9, [x21]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w21, #0x7b48\",\n        \"movk w21, #0xa7, lsl #16\",\n        \"ldr d3, [x21]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w21, #0x7b40\",\n        \"movk w21, #0xa7, lsl #16\",\n        \"ldr d4, [x21]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d4\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #180]\",\n        \"ldr d2, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #144]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr d10, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d10\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d10, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d10\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #196]\",\n        \"ldr d2, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d10, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d10\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #168]\",\n        \"ldr d2, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #144]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #144]\",\n        \"ldr s2, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d5, d0\",\n        \"str d5, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d5, d0\",\n        \"str d5, [x8, #152]\",\n        \"ldr s5, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d10, d0\",\n        \"str d10, [x8, #160]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d5, d0\",\n        \"str d5, [x8, #32]\",\n        \"ldr s5, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d5, d0\",\n        \"str d5, [x8, #136]\",\n        \"ldr s5, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d5, d0\",\n        \"str d5, [x8, #24]\",\n        \"ldr s5, [x4, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d5, d0\",\n        \"str d5, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #176]\",\n        \"ldr d2, [x8, #160]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #152]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #48]\",\n        \"ldr d2, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #160]\",\n        \"ldr d2, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr d7, [x8, #136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d7\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr d7, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d7\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr d7, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d7\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #40]\",\n        \"ldr d5, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr d5, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x8, #152]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"mov w21, #0x7bd8\",\n        \"movk w21, #0xa7, lsl #16\",\n        \"ldr d5, [x21]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d5, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s5, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #20]\",\n        \"ldr s7, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d8, d0\",\n        \"str d8, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr d8, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d8\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #152]\",\n        \"ldr d7, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d7\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #136]\",\n        \"ldr d7, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d7\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #32]\",\n        \"ldr s2, [x8, #180]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #192]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #8]\",\n        \"ldr s4, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #176]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"mov w20, #0x7b38\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d7, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d7\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #4]\",\n        \"ldr s6, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #124]\",\n        \"ldr s6, [x8, #196]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #208]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #8]\",\n        \"ldr s8, [x8, #152]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d9, d0\",\n        \"str d9, [x8, #208]\",\n        \"ldr s9, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d10, d0\",\n        \"str d10, [x8, #152]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"mov w20, #0x7bd0\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d10, d0\",\n        \"str d10, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #60]\",\n        \"ldr d9, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #120]\",\n        \"ldr s8, [x8, #168]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d9, d0\",\n        \"str d9, [x8, #168]\",\n        \"ldr s9, [x8, #184]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d10, d0\",\n        \"str d10, [x8, #184]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #8]\",\n        \"ldr s8, [x8, #136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d9, d0\",\n        \"str d9, [x8, #136]\",\n        \"ldr s9, [x8, #160]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d10, d0\",\n        \"str d10, [x8, #160]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"mov w20, #0x7b30\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d10, d0\",\n        \"str d10, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #64]\",\n        \"ldr d9, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #116]\",\n        \"ldr s8, [x8, #144]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d9, d0\",\n        \"str d9, [x8, #144]\",\n        \"ldr s9, [x8, #200]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d10, d0\",\n        \"str d10, [x8, #200]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #8]\",\n        \"ldr s8, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d9, d0\",\n        \"str d9, [x8, #32]\",\n        \"ldr s9, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d10, d0\",\n        \"str d10, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"mov w20, #0x7b28\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d10, d0\",\n        \"str d10, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #68]\",\n        \"ldr d9, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #112]\",\n        \"ldr s8, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d10, d0\",\n        \"str d10, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #72]\",\n        \"ldr d9, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #108]\",\n        \"ldr d8, [x8, #200]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d8\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr d9, [x8, #144]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #8]\",\n        \"ldr d8, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d8\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr d9, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"mov w20, #0x7b20\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d10, d0\",\n        \"str d10, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #76]\",\n        \"ldr d9, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #104]\",\n        \"ldr d8, [x8, #184]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d8\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr d9, [x8, #168]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #8]\",\n        \"ldr d8, [x8, #160]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d8\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr d9, [x8, #136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"mov w20, #0x7b18\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d10, d0\",\n        \"str d10, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #80]\",\n        \"ldr d9, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #8]\",\n        \"ldr d6, [x8, #152]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d6\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr d7, [x8, #208]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d7\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"mov w20, #0x7be0\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d7, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d7\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #4]\",\n        \"ldr s6, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #96]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0x7b10\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #4]\",\n        \"ldr s2, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"add w4, w7, w7, lsl #3\",\n        \"ldr w7, [x9, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"lsl w4, w4, #4\",\n        \"mov w20, #0x83d0\",\n        \"movk w20, #0xb1, lsl #16\",\n        \"mvn w27, w4\",\n        \"adds w26, w4, w20\",\n        \"mov x4, x26\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #92]\",\n        \"ldr s2, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q3, [x28, #3552]\",\n        \"eor v3.16b, v2.16b, v3.16b\",\n        \"ldr s4, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7]\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr q5, [x28, #3552]\",\n        \"eor v5.16b, v4.16b, v5.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #4]\",\n        \"ldr s3, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s5, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr q6, [x28, #3552]\",\n        \"eor v6.16b, v5.16b, v6.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #8]\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s6, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr q7, [x28, #3552]\",\n        \"eor v7.16b, v6.16b, v7.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #12]\",\n        \"ldr s3, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s7, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr q8, [x28, #3552]\",\n        \"eor v8.16b, v7.16b, v8.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #16]\",\n        \"ldr s3, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s8, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr q9, [x28, #3552]\",\n        \"eor v9.16b, v8.16b, v9.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #20]\",\n        \"ldr s3, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s9, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr q10, [x28, #3552]\",\n        \"eor v9.16b, v9.16b, v10.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #24]\",\n        \"ldr s3, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s9, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr q10, [x28, #3552]\",\n        \"eor v9.16b, v9.16b, v10.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #28]\",\n        \"ldr s3, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s9, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr q10, [x28, #3552]\",\n        \"eor v9.16b, v9.16b, v10.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #32]\",\n        \"ldr s3, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s9, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #36]\",\n        \"ldr s3, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s9, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #40]\",\n        \"ldr s3, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s9, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #44]\",\n        \"ldr s3, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #48]\",\n        \"ldr s3, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #52]\",\n        \"ldr s3, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #56]\",\n        \"ldr s3, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #60]\",\n        \"ldr s3, [x4, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #64]\",\n        \"ldr s3, [x4, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x7, #68]\",\n        \"ldr s2, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #72]\",\n        \"ldr s3, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x4, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x7, #76]\",\n        \"ldr s4, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x4, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x7, #80]\",\n        \"ldr s5, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x7, #84]\",\n        \"ldr s6, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x4, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x7, #88]\",\n        \"ldr s7, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x7, #92]\",\n        \"ldr s8, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d9, d0\",\n        \"str d9, [x8, #24]\",\n        \"ldr s9, [x4, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x7, #96]\",\n        \"ldr s8, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d9, d0\",\n        \"str d9, [x8, #128]\",\n        \"ldr s9, [x4, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x7, #100]\",\n        \"ldr s8, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x7, #104]\",\n        \"ldr s9, [x4, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x7, #108]\",\n        \"ldr s8, [x4, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr d9, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x7, #112]\",\n        \"ldr s8, [x4, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr d9, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d9\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x7, #116]\",\n        \"ldr s8, [x4, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x7, #120]\",\n        \"ldr s7, [x4, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x7, #124]\",\n        \"ldr s6, [x4, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x7, #128]\",\n        \"ldr s5, [x4, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x7, #132]\",\n        \"ldr s4, [x4, #136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #136]\",\n        \"ldr s3, [x4, #140]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x7, #140]\",\n        \"mov x8, x9\",\n        \"ldr w9, [x8], #4\",\n        \"cfinv\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block3\": {\n      \"x86InstructionCount\": 649,\n      \"ExpectedInstructionCount\": 3256,\n      \"x86Insts\": [\n        \"fld dword [esi + 0x64]\",\n        \"mov eax,dword [esi + 0x88]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"mov ecx,dword [esi + 0x8c]\",\n        \"fld dword [esi + 0x70]\",\n        \"mov edx,dword [esi + 0x90]\",\n        \"fstp dword [esp + 0x60]\",\n        \"mov dword [esp + 0x2e4],0x3f\",\n        \"fld dword [esi + 0x7c]\",\n        \"mov dword [esp + 0x94],eax\",\n        \"fstp dword [esp + 0x64]\",\n        \"mov dword [esp + 0x98],ecx\",\n        \"fld dword [esi + 0x68]\",\n        \"mov dword [esp + 0x9c],edx\",\n        \"fstp dword [esp + 0x14]\",\n        \"mov dword [esp + 0xe8],eax\",\n        \"fld dword [esi + 0x74]\",\n        \"mov dword [esp + 0xec],ecx\",\n        \"fstp dword [esp + 0x18]\",\n        \"mov dword [esp + 0xf0],edx\",\n        \"fld dword [esi + 0x80]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esi + 0xf4]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x14]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x8c]\",\n        \"fld dword [esp + 0x18]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fmul dword [esp + 0x1c]\",\n        \"fstp dword [esp + 0x84]\",\n        \"fld dword [esi + 0x6c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esi + 0x78]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esi + 0x84]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esi + 0xf0]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x14]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x18]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x50]\",\n        \"fmul dword [esp + 0x1c]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esi + 0x100]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x54]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fst dword [esp + 0x10]\",\n        \"fld dword [esp + 0x50]\",\n        \"fmul st2\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fst dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x58]\",\n        \"fmul st3\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fst dword [esp + 0x14]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x8c]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x84]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x84]\",\n        \"fld dword [esp + 0x60]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x64]\",\n        \"fmulp st4\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x94]\",\n        \"fld dword [esp + 0x84]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x84]\",\n        \"fld dword [esp + 0x98]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x9c]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x84]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fadd dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fadd dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x44]\",\n        \"fadd dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd dword [esp + 0x2c]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x40]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"mov eax,dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0xf4],eax\",\n        \"fstp dword [esp + 0x60]\",\n        \"mov ecx,dword [esp + 0x60]\",\n        \"fld dword [esp + 0x14]\",\n        \"mov dword [esp + 0xf8],ecx\",\n        \"fstp dword [esp + 0x64]\",\n        \"mov edx,dword [esp + 0x64]\",\n        \"fxch st4\",\n        \"mov dword [esp + 0xfc],edx\",\n        \"fst dword [esp + 0x5c]\",\n        \"fxch st3\",\n        \"fst dword [esp + 0x84]\",\n        \"fxch st5\",\n        \"fst dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st5\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fsub dword [esp + 0x84]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x14]\",\n        \"mov eax,dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0x100],eax\",\n        \"fstp dword [esp + 0x18]\",\n        \"mov ecx,dword [esp + 0x18]\",\n        \"fld dword [esp + 0x10]\",\n        \"mov dword [esp + 0x104],ecx\",\n        \"fstp dword [esp + 0x1c]\",\n        \"mov edx,dword [esp + 0x1c]\",\n        \"fxch st3\",\n        \"mov dword [esp + 0x108],edx\",\n        \"fst dword [esp + 0x5c]\",\n        \"fxch st5\",\n        \"fst dword [esp + 0x84]\",\n        \"fxch st3\",\n        \"fst dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st5\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x84]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x14]\",\n        \"mov eax,dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0x10c],eax\",\n        \"fstp dword [esp + 0x18]\",\n        \"mov ecx,dword [esp + 0x18]\",\n        \"fld dword [esp + 0x10]\",\n        \"mov dword [esp + 0x110],ecx\",\n        \"fstp dword [esp + 0x1c]\",\n        \"mov edx,dword [esp + 0x1c]\",\n        \"fxch st5\",\n        \"mov dword [esp + 0x114],edx\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x84]\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"faddp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fsub dword [esp + 0x84]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x14]\",\n        \"mov eax,dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0x118],eax\",\n        \"mov eax,dword [ebx + 0x88]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x10]\",\n        \"mov ecx,dword [esp + 0x18]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"mov edx,dword [esp + 0x1c]\",\n        \"fld dword [ebx + 0x64]\",\n        \"mov dword [esp + 0x11c],ecx\",\n        \"mov ecx,dword [ebx + 0x8c]\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [ebx + 0x70]\",\n        \"mov dword [esp + 0x120],edx\",\n        \"mov edx,dword [ebx + 0x90]\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [ebx + 0x7c]\",\n        \"mov dword [esp + 0x94],eax\",\n        \"mov dword [esp + 0x98],ecx\",\n        \"mov dword [esp + 0x9c],edx\",\n        \"fstp dword [esp + 0x78]\",\n        \"mov dword [esp + 0xac],eax\",\n        \"fld dword [ebx + 0x68]\",\n        \"mov dword [esp + 0xb0],ecx\",\n        \"fstp dword [esp + 0x2c]\",\n        \"mov dword [esp + 0xb4],edx\",\n        \"fld dword [ebx + 0x74]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [ebx + 0x80]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [ebx + 0xf4]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x48]\",\n        \"fmul dword [esp + 0x34]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [ebx + 0x6c]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [ebx + 0x78]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [ebx + 0x84]\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [ebx + 0xf0]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x14]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x60]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fmul dword [esp + 0x64]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [ebx + 0x100]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x14]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x14]\",\n        \"fst dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st2\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x14]\",\n        \"fst dword [esp + 0x84]\",\n        \"fld dword [esp + 0x10]\",\n        \"fmul st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x14]\",\n        \"fst dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x40]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x48]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x44]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x70]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x74]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x8c]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x78]\",\n        \"fmulp st4\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x94]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x98]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x9c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x84]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x70]\",\n        \"mov eax,dword [esp + 0x70]\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0xb8],eax\",\n        \"fstp dword [esp + 0x74]\",\n        \"mov ecx,dword [esp + 0x74]\",\n        \"fld dword [esp + 0x10]\",\n        \"mov dword [esp + 0xbc],ecx\",\n        \"fstp dword [esp + 0x78]\",\n        \"mov edx,dword [esp + 0x78]\",\n        \"fxch st4\",\n        \"mov dword [esp + 0xc0],edx\",\n        \"fst dword [esp + 0x5c]\",\n        \"fxch st3\",\n        \"fst dword [esp + 0x84]\",\n        \"fxch st5\",\n        \"fst dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st5\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fsub dword [esp + 0x84]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x70]\",\n        \"mov eax,dword [esp + 0x70]\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0xc4],eax\",\n        \"fstp dword [esp + 0x74]\",\n        \"mov ecx,dword [esp + 0x74]\",\n        \"fld dword [esp + 0x10]\",\n        \"mov dword [esp + 0xc8],ecx\",\n        \"fstp dword [esp + 0x78]\",\n        \"mov edx,dword [esp + 0x78]\",\n        \"fxch st3\",\n        \"mov dword [esp + 0xcc],edx\",\n        \"fst dword [esp + 0x5c]\",\n        \"fxch st5\",\n        \"fst dword [esp + 0x84]\",\n        \"fxch st3\",\n        \"fst dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st5\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x84]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x70]\",\n        \"mov eax,dword [esp + 0x70]\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0xd0],eax\",\n        \"fstp dword [esp + 0x74]\",\n        \"mov ecx,dword [esp + 0x74]\",\n        \"fld dword [esp + 0x10]\",\n        \"mov dword [esp + 0xd4],ecx\",\n        \"fstp dword [esp + 0x78]\",\n        \"mov edx,dword [esp + 0x78]\",\n        \"mov dword [esp + 0xd8],edx\",\n        \"fxch st5\",\n        \"push 0x0\",\n        \"fstp dword [esp + 0x60]\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x88]\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x80]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x90]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x18]\",\n        \"faddp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x30]\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x30]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x30]\",\n        \"fsub dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x60]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x30]\",\n        \"fsub dword [esp + 0x88]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x80]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x18]\",\n        \"fstp dword [esp + 0x74]\",\n        \"mov eax,dword [esp + 0x74]\",\n        \"fld dword [esp + 0x30]\",\n        \"mov dword [esp + 0xe0],eax\",\n        \"fstp dword [esp + 0x78]\",\n        \"mov ecx,dword [esp + 0x78]\",\n        \"fld dword [esp + 0x14]\",\n        \"mov dword [esp + 0xe4],ecx\",\n        \"fstp dword [esp + 0x7c]\",\n        \"mov edx,dword [esp + 0x7c]\",\n        \"lea ecx,[esp + 0x190]\",\n        \"mov dword [esp + 0xe8],edx\",\n        \"call 0x0070df30\",\n        \"mov dword [esp + 0x198],esi\",\n        \"add esi,0xec\",\n        \"push esi\",\n        \"lea ecx,[esp + 0x190]\",\n        \"mov dword [esp + 0x314],0x0\",\n        \"call 0x0070e040\",\n        \"mov ecx,0x19\",\n        \"lea esi,[esp + 0x1b8]\",\n        \"lea edi,[esp + 0x21c]\",\n        \"rep movsd\",\n        \"mov dword [esp + 0x198],ebx\",\n        \"add ebx,0xec\",\n        \"push ebx\",\n        \"lea ecx,[esp + 0x190]\",\n        \"call 0x0070e040\",\n        \"mov ecx,0x19\",\n        \"lea esi,[esp + 0x1b8]\",\n        \"lea edi,[esp + 0x284]\",\n        \"rep movsd\",\n        \"lea esi,[esp + 0x124]\",\n        \"mov edi,0x5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x10, #100]\",\n        \"ldr w4, [x10, #136]\",\n        \"str s2, [x8, #92]\",\n        \"ldr w7, [x10, #140]\",\n        \"ldr s2, [x10, #112]\",\n        \"ldr w5, [x10, #144]\",\n        \"str s2, [x8, #96]\",\n        \"mov w20, #0x3f\",\n        \"str w20, [x8, #740]\",\n        \"ldr s2, [x10, #124]\",\n        \"str w4, [x8, #148]\",\n        \"str s2, [x8, #100]\",\n        \"str w7, [x8, #152]\",\n        \"ldr s2, [x10, #104]\",\n        \"str w5, [x8, #156]\",\n        \"str s2, [x8, #20]\",\n        \"str w4, [x8, #232]\",\n        \"ldr s2, [x10, #116]\",\n        \"str w7, [x8, #236]\",\n        \"str s2, [x8, #24]\",\n        \"str w5, [x8, #240]\",\n        \"ldr s2, [x10, #128]\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x10, #244]\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #140]\",\n        \"ldr s3, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #124]\",\n        \"ldr s3, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #132]\",\n        \"ldr s2, [x10, #108]\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x10, #120]\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x10, #132]\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x10, #240]\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #84]\",\n        \"ldr s3, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #80]\",\n        \"ldr s3, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #88]\",\n        \"ldr s2, [x10, #256]\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #40]\",\n        \"ldr s3, [x8, #40]\",\n        \"str s3, [x8, #16]\",\n        \"ldr s4, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #40]\",\n        \"ldr s4, [x8, #40]\",\n        \"str s4, [x8, #44]\",\n        \"ldr s5, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #40]\",\n        \"ldr s5, [x8, #40]\",\n        \"str s5, [x8, #20]\",\n        \"ldr s6, [x8, #140]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #76]\",\n        \"ldr s6, [x8, #76]\",\n        \"str s6, [x8, #68]\",\n        \"ldr s6, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #140]\",\n        \"ldr s6, [x8, #140]\",\n        \"str s6, [x8, #72]\",\n        \"ldr s6, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #88]\",\n        \"ldr s6, [x8, #88]\",\n        \"str s6, [x8, #64]\",\n        \"ldr s6, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #80]\",\n        \"ldr s6, [x8, #80]\",\n        \"str s6, [x8, #132]\",\n        \"ldr s6, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #84]\",\n        \"ldr s6, [x8, #84]\",\n        \"str s6, [x8, #124]\",\n        \"ldr s6, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x8, #40]\",\n        \"str s2, [x8, #92]\",\n        \"ldr s2, [x8, #148]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s6, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #132]\",\n        \"ldr s6, [x8, #152]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #124]\",\n        \"ldr s7, [x8, #156]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #92]\",\n        \"ldr s8, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #68]\",\n        \"ldr s8, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #72]\",\n        \"ldr s8, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #64]\",\n        \"ldr s8, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #16]\",\n        \"str s8, [x8, #92]\",\n        \"ldr w4, [x8, #92]\",\n        \"ldr s8, [x8, #44]\",\n        \"str w4, [x8, #244]\",\n        \"str s8, [x8, #96]\",\n        \"ldr w7, [x8, #96]\",\n        \"ldr s8, [x8, #20]\",\n        \"str w7, [x8, #248]\",\n        \"str s8, [x8, #100]\",\n        \"ldr w5, [x8, #100]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str w5, [x8, #252]\",\n        \"str s3, [x8, #92]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s4, [x8, #132]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s5, [x8, #124]\",\n        \"ldr s8, [x8, #76]\",\n        \"str s8, [x8, #64]\",\n        \"ldr s8, [x8, #140]\",\n        \"str s8, [x8, #72]\",\n        \"ldr s8, [x8, #88]\",\n        \"str s8, [x8, #68]\",\n        \"ldr s8, [x8, #80]\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #84]\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #40]\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str s8, [x8, #20]\",\n        \"ldr w4, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str w4, [x8, #256]\",\n        \"str s8, [x8, #24]\",\n        \"ldr w7, [x8, #24]\",\n        \"ldr s8, [x8, #16]\",\n        \"str w7, [x8, #260]\",\n        \"str s8, [x8, #28]\",\n        \"ldr w5, [x8, #28]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str w5, [x8, #264]\",\n        \"str s3, [x8, #92]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s4, [x8, #132]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s5, [x8, #124]\",\n        \"ldr s8, [x8, #76]\",\n        \"str s8, [x8, #64]\",\n        \"ldr s8, [x8, #140]\",\n        \"str s8, [x8, #72]\",\n        \"ldr s8, [x8, #88]\",\n        \"str s8, [x8, #68]\",\n        \"ldr s8, [x8, #80]\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #84]\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #40]\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str s8, [x8, #20]\",\n        \"ldr w4, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str w4, [x8, #268]\",\n        \"str s8, [x8, #24]\",\n        \"ldr w7, [x8, #24]\",\n        \"ldr s8, [x8, #16]\",\n        \"str w7, [x8, #272]\",\n        \"str s8, [x8, #28]\",\n        \"ldr w5, [x8, #28]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str w5, [x8, #276]\",\n        \"str s3, [x8, #92]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s4, [x8, #132]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s5, [x8, #124]\",\n        \"ldr s3, [x8, #76]\",\n        \"str s3, [x8, #64]\",\n        \"ldr s3, [x8, #140]\",\n        \"str s3, [x8, #72]\",\n        \"ldr s3, [x8, #88]\",\n        \"str s3, [x8, #68]\",\n        \"ldr s3, [x8, #80]\",\n        \"str s3, [x8, #20]\",\n        \"ldr s3, [x8, #84]\",\n        \"str s3, [x8, #44]\",\n        \"ldr s3, [x8, #40]\",\n        \"str s3, [x8, #16]\",\n        \"ldr s3, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x8, #20]\",\n        \"str s2, [x8, #20]\",\n        \"ldr w4, [x8, #20]\",\n        \"ldr s2, [x8, #44]\",\n        \"str w4, [x8, #280]\",\n        \"ldr w4, [x6, #136]\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x8, #16]\",\n        \"ldr w7, [x8, #24]\",\n        \"str s2, [x8, #28]\",\n        \"ldr w5, [x8, #28]\",\n        \"ldr s2, [x6, #100]\",\n        \"str w7, [x8, #284]\",\n        \"ldr w7, [x6, #140]\",\n        \"str s2, [x8, #112]\",\n        \"ldr s2, [x6, #112]\",\n        \"str w5, [x8, #288]\",\n        \"ldr w5, [x6, #144]\",\n        \"str s2, [x8, #116]\",\n        \"ldr s2, [x6, #124]\",\n        \"str w4, [x8, #148]\",\n        \"str w7, [x8, #152]\",\n        \"str w5, [x8, #156]\",\n        \"str s2, [x8, #120]\",\n        \"str w4, [x8, #172]\",\n        \"ldr s2, [x6, #104]\",\n        \"str w7, [x8, #176]\",\n        \"str s2, [x8, #44]\",\n        \"str w5, [x8, #180]\",\n        \"ldr s2, [x6, #116]\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x6, #128]\",\n        \"str s2, [x8, #52]\",\n        \"ldr s2, [x6, #244]\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #64]\",\n        \"ldr s3, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #72]\",\n        \"ldr s3, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #68]\",\n        \"ldr s2, [x6, #108]\",\n        \"str s2, [x8, #92]\",\n        \"ldr s2, [x6, #120]\",\n        \"str s2, [x8, #96]\",\n        \"ldr s2, [x6, #132]\",\n        \"str s2, [x8, #100]\",\n        \"ldr s2, [x6, #240]\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #20]\",\n        \"ldr s3, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #44]\",\n        \"ldr s3, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x6, #256]\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #20]\",\n        \"ldr s3, [x8, #20]\",\n        \"str s3, [x8, #92]\",\n        \"ldr s4, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #20]\",\n        \"ldr s4, [x8, #20]\",\n        \"str s4, [x8, #132]\",\n        \"ldr s5, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #20]\",\n        \"ldr s5, [x8, #20]\",\n        \"str s5, [x8, #124]\",\n        \"ldr s6, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #40]\",\n        \"ldr s6, [x8, #40]\",\n        \"str s6, [x8, #64]\",\n        \"ldr s6, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #84]\",\n        \"ldr s6, [x8, #84]\",\n        \"str s6, [x8, #72]\",\n        \"ldr s6, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #80]\",\n        \"ldr s6, [x8, #80]\",\n        \"str s6, [x8, #68]\",\n        \"ldr s6, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #88]\",\n        \"ldr s6, [x8, #88]\",\n        \"str s6, [x8, #20]\",\n        \"ldr s6, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #140]\",\n        \"ldr s6, [x8, #140]\",\n        \"str s6, [x8, #44]\",\n        \"ldr s6, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0x0\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #76]\",\n        \"ldr s2, [x8, #76]\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x8, #148]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s6, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #20]\",\n        \"ldr s6, [x8, #152]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #44]\",\n        \"ldr s7, [x8, #156]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str s8, [x8, #112]\",\n        \"ldr w4, [x8, #112]\",\n        \"ldr s8, [x8, #44]\",\n        \"str w4, [x8, #184]\",\n        \"str s8, [x8, #116]\",\n        \"ldr w7, [x8, #116]\",\n        \"ldr s8, [x8, #16]\",\n        \"str w7, [x8, #188]\",\n        \"str s8, [x8, #120]\",\n        \"ldr w5, [x8, #120]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str w5, [x8, #192]\",\n        \"str s3, [x8, #92]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s4, [x8, #132]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s5, [x8, #124]\",\n        \"ldr s8, [x8, #40]\",\n        \"str s8, [x8, #64]\",\n        \"ldr s8, [x8, #84]\",\n        \"str s8, [x8, #72]\",\n        \"ldr s8, [x8, #80]\",\n        \"str s8, [x8, #68]\",\n        \"ldr s8, [x8, #88]\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #140]\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #76]\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str s8, [x8, #112]\",\n        \"ldr w4, [x8, #112]\",\n        \"ldr s8, [x8, #44]\",\n        \"str w4, [x8, #196]\",\n        \"str s8, [x8, #116]\",\n        \"ldr w7, [x8, #116]\",\n        \"ldr s8, [x8, #16]\",\n        \"str w7, [x8, #200]\",\n        \"str s8, [x8, #120]\",\n        \"ldr w5, [x8, #120]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str w5, [x8, #204]\",\n        \"str s3, [x8, #92]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s4, [x8, #132]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s5, [x8, #124]\",\n        \"ldr s8, [x8, #40]\",\n        \"str s8, [x8, #64]\",\n        \"ldr s8, [x8, #84]\",\n        \"str s8, [x8, #72]\",\n        \"ldr s8, [x8, #80]\",\n        \"str s8, [x8, #68]\",\n        \"ldr s8, [x8, #88]\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #140]\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #76]\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str s8, [x8, #112]\",\n        \"ldr w4, [x8, #112]\",\n        \"ldr s8, [x8, #44]\",\n        \"str w4, [x8, #208]\",\n        \"str s8, [x8, #116]\",\n        \"ldr w7, [x8, #116]\",\n        \"ldr s8, [x8, #16]\",\n        \"str w7, [x8, #212]\",\n        \"str s8, [x8, #120]\",\n        \"ldr w5, [x8, #120]\",\n        \"str w5, [x8, #216]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str w20, [x8, #-4]!\",\n        \"str s3, [x8, #96]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s4, [x8, #136]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s5, [x8, #128]\",\n        \"ldr s3, [x8, #44]\",\n        \"str s3, [x8, #68]\",\n        \"ldr s3, [x8, #88]\",\n        \"str s3, [x8, #76]\",\n        \"ldr s3, [x8, #84]\",\n        \"str s3, [x8, #72]\",\n        \"ldr s3, [x8, #92]\",\n        \"str s3, [x8, #24]\",\n        \"ldr s3, [x8, #144]\",\n        \"str s3, [x8, #48]\",\n        \"ldr s3, [x8, #80]\",\n        \"str s3, [x8, #20]\",\n        \"ldr s3, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #24]\",\n        \"str s2, [x8, #116]\",\n        \"ldr w4, [x8, #116]\",\n        \"ldr s2, [x8, #48]\",\n        \"str w4, [x8, #224]\",\n        \"str s2, [x8, #120]\",\n        \"ldr w7, [x8, #120]\",\n        \"ldr s2, [x8, #20]\",\n        \"str w7, [x8, #228]\",\n        \"str s2, [x8, #124]\",\n        \"ldr w5, [x8, #124]\",\n        \"add w7, w8, #0x190 (400)\",\n        \"str w5, [x8, #232]\",\n        \"mov w20, #0xa3f\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x8\",\n        \"sub w21, w23, w21\",\n        \"mov w23, #0xfefe\",\n        \"lsr w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    },\n    \"Block4\": {\n      \"x86InstructionCount\": 2050,\n      \"ExpectedInstructionCount\": 36,\n      \"x86Insts\": [\n        \"fldz\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000172\",\n        \"push 0x37\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33c14\",\n        \"push 0x52424157\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000172\",\n        \"push 0x38\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33c04\",\n        \"push 0x41574157\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x2b\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33bfc\",\n        \"push 0x444c4853\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x3d\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33bf0\",\n        \"push 0x48534946\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x44\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33bdc\",\n        \"push 0x4853494c\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x3e\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33bcc\",\n        \"push 0x48535246\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x52485446\",\n        \"push 0x4c505344\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x1000073\",\n        \"push 0xb\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33bc4\",\n        \"push 0x4e445242\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x4c505344\",\n        \"push 0x1\",\n        \"push 0x40\",\n        \"push 0x1000076\",\n        \"push 0xb\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33bbc\",\n        \"push 0x52485446\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0xe0\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa32700\",\n        \"push 0x4b434f4c\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0xc0\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33bb4\",\n        \"push 0x4e45504f\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x48534946\",\n        \"push 0x49465352\",\n        \"push 0x4c505344\",\n        \"push 0x3\",\n        \"push 0x3d\",\n        \"push 0x21000475\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33ba8\",\n        \"push 0x47444946\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x2c\",\n        \"push 0x4853494c\",\n        \"push 0x48535352\",\n        \"push 0x4c505344\",\n        \"push 0x3\",\n        \"push 0x44\",\n        \"push 0x21000075\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b98\",\n        \"push 0x47444853\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x2c\",\n        \"push 0x48535246\",\n        \"push 0x52465352\",\n        \"push 0x4c505344\",\n        \"push 0x3\",\n        \"push 0x3e\",\n        \"push 0x1000075\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b88\",\n        \"push 0x47445246\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x2c\",\n        \"push 0x54414241\",\n        \"push 0x54414f46\",\n        \"push 0x54414552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x100075\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b74\",\n        \"push 0x54414744\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x45484241\",\n        \"push 0x45484f46\",\n        \"push 0x45484552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x21000075\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b64\",\n        \"push 0x45484744\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x50534241\",\n        \"push 0x50534f46\",\n        \"push 0x50534552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000075\",\n        \"push 0x9\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b50\",\n        \"push 0x50534744\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x41464241\",\n        \"push 0x41464f46\",\n        \"push 0x41464552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000075\",\n        \"push 0xa\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b40\",\n        \"push 0x41464744\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x54414241\",\n        \"push 0x54414f46\",\n        \"push 0x54414552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x100077\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b30\",\n        \"push 0x54415244\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x4b534241\",\n        \"push 0x4b534f46\",\n        \"push 0x4c505344\",\n        \"push 0x3\",\n        \"push 0x40\",\n        \"push 0x80077\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b24\",\n        \"push 0x4b535244\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x2c\",\n        \"push 0x45484241\",\n        \"push 0x45484f46\",\n        \"push 0x45484552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000077\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b14\",\n        \"push 0x45485244\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x50534241\",\n        \"push 0x50534f46\",\n        \"push 0x50534552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000077\",\n        \"push 0x9\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b00\",\n        \"push 0x50535244\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x41464241\",\n        \"push 0x41464f46\",\n        \"push 0x41464552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000077\",\n        \"push 0xa\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33af0\",\n        \"push 0x41465244\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x4c505344\",\n        \"push 0x49465352\",\n        \"push 0x48534946\",\n        \"push 0x3\",\n        \"push 0x40\",\n        \"push 0x100007f\",\n        \"push 0x3d\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33adc\",\n        \"push 0x49464b57\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x2c\",\n        \"push 0x4c505344\",\n        \"push 0x52465352\",\n        \"push 0x48535246\",\n        \"push 0x3\",\n        \"push 0x40\",\n        \"push 0x100007f\",\n        \"push 0x3e\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33ac8\",\n        \"push 0x52464b57\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x2c\",\n        \"push 0x4c505344\",\n        \"push 0x48535352\",\n        \"push 0x4853494c\",\n        \"push 0x3\",\n        \"push 0x40\",\n        \"push 0x100007f\",\n        \"push 0x44\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33ab4\",\n        \"push 0x48534b57\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x2c\",\n        \"push 0x4c505344\",\n        \"push 0x414d5352\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x100007f\",\n        \"push 0x40\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33aa0\",\n        \"push 0x414d4b57\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x4c505344\",\n        \"push 0x49445352\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x100007f\",\n        \"push 0x3f\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a8c\",\n        \"push 0x49444b57\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x4c505344\",\n        \"push 0x4f505352\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x100007f\",\n        \"push 0x43\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a78\",\n        \"push 0x4f504b57\",\n        \"call 0x00417220\",\n        \"add esp,0x28\",\n        \"push 0x4c505344\",\n        \"push 0x574e5352\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x100007f\",\n        \"push 0x41\",\n        \"push ecx\",\n        \"fldz\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a5c\",\n        \"push 0x574e4b57\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x48535246\",\n        \"push 0x4853494c\",\n        \"push 0x48534946\",\n        \"push 0x444c4853\",\n        \"push 0x4c505344\",\n        \"push 0x5\",\n        \"push 0x40\",\n        \"push 0x75\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a48\",\n        \"push 0x52414944\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x34\",\n        \"push 0x48535246\",\n        \"push 0x4853494c\",\n        \"push 0x48534946\",\n        \"push 0x444c4853\",\n        \"push 0x4c505344\",\n        \"push 0x5\",\n        \"push 0x40\",\n        \"push 0x75\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a30\",\n        \"push 0x45574944\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x34\",\n        \"push 0x0\",\n        \"push 0x3f\",\n        \"push 0x10000092\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a24\",\n        \"push 0x504d4156\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x14\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a18\",\n        \"push 0x47445553\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000112\",\n        \"push 0x39\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a08\",\n        \"push 0x414d5453\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"push 0x4f505543\",\n        \"push 0x1\",\n        \"push 0x43\",\n        \"push 0x800000\",\n        \"fldz\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa339fc\",\n        \"push 0x4e534f50\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x49445543\",\n        \"push 0x1\",\n        \"push 0x3f\",\n        \"push 0x800000\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa339ec\",\n        \"push 0x45534944\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x45484241\",\n        \"push 0x45484f46\",\n        \"push 0x45484552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x21000075\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa339cc\",\n        \"push 0x594d5544\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000172\",\n        \"push 0x2f\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa339bc\",\n        \"push 0x49564e49\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x2e\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa339b0\",\n        \"push 0x4c4d4843\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x4c505344\",\n        \"push 0x41505543\",\n        \"push 0x2\",\n        \"push 0x42\",\n        \"push 0x1000173\",\n        \"push 0x30\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa339a4\",\n        \"push 0x41524150\",\n        \"call 0x00417220\",\n        \"add esp,0x28\",\n        \"push 0x4c505344\",\n        \"push 0x1\",\n        \"push 0x40\",\n        \"push 0x1000173\",\n        \"push 0x31\",\n        \"fldz\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa3399c\",\n        \"push 0x434e4c53\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x4c505344\",\n        \"push 0x1\",\n        \"push 0x40\",\n        \"push 0x1000062\",\n        \"push 0x6\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33994\",\n        \"push 0x4d524843\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x594c4152\",\n        \"push 0x4c505344\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x41000066\",\n        \"push 0x22\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33988\",\n        \"push 0x4f4d4544\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x4f4d4544\",\n        \"push 0x4c505344\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x1000062\",\n        \"push 0x22\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33980\",\n        \"push 0x594c4152\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x4d4c4143\",\n        \"push 0x4c505344\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x41000062\",\n        \"push 0x21\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33978\",\n        \"push 0x5a4e5246\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x5a4e5246\",\n        \"push 0x4c505344\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x41000066\",\n        \"push 0x21\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33970\",\n        \"push 0x4d4c4143\",\n        \"call 0x00417220\",\n        \"add esp,0x28\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000112\",\n        \"push 0x29\",\n        \"fldz\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33964\",\n        \"push 0x4559454e\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x80000072\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa3395c\",\n        \"push 0x5448474c\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x81000072\",\n        \"push 0x46\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33950\",\n        \"push 0x4b524144\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push 0x40\",\n        \"push 0xf0\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x4\",\n        \"push 0xa33948\",\n        \"push 0x4c505344\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x4c505344\",\n        \"push 0x1\",\n        \"push 0x40\",\n        \"push 0x163\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x4\",\n        \"push 0xa3393c\",\n        \"push 0x50525453\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x81000242\",\n        \"push 0x3c\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x4\",\n        \"push 0xa33930\",\n        \"push 0x454c4554\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x81000012\",\n        \"push 0x3a\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x4\",\n        \"push 0xa33924\",\n        \"push 0x54435444\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"fldz\",\n        \"push 0x0\",\n        \"push 0x40\",\n        \"push 0x1000072\",\n        \"push 0x34\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x4\",\n        \"push 0xa33910\",\n        \"push 0x53424153\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x35\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x4\",\n        \"push 0xa33908\",\n        \"push 0x434c4652\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100001a\",\n        \"push 0x3b\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x4\",\n        \"push 0xa338f8\",\n        \"push 0x47444552\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100070\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa338e4\",\n        \"push 0x54414552\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000070\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa338d4\",\n        \"push 0x45484552\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000070\",\n        \"push 0x9\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa338bc\",\n        \"push 0x50534552\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000070\",\n        \"push 0xa\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa338ac\",\n        \"push 0x41464552\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100072\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33898\",\n        \"push 0x54414f46\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x80072\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33888\",\n        \"push 0x4b534f46\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000072\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33878\",\n        \"push 0x45484f46\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000072\",\n        \"push 0x9\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33860\",\n        \"push 0x50534f46\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000072\",\n        \"push 0xa\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33850\",\n        \"push 0x41464f46\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x4b535244\",\n        \"push 0x4b534241\",\n        \"push 0x4c505344\",\n        \"push 0x3\",\n        \"push 0x40\",\n        \"push 0x80027\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33840\",\n        \"push 0x4b534241\",\n        \"call 0x00417220\",\n        \"add esp,0x2c\",\n        \"push 0x54414744\",\n        \"push 0x54415244\",\n        \"push 0x54414241\",\n        \"fldz\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x100027\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa3382c\",\n        \"push 0x54414241\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x594d5544\",\n        \"push 0x45484744\",\n        \"push 0x45485244\",\n        \"push 0x45484241\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000025\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa3381c\",\n        \"push 0x45484241\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x34\",\n        \"push 0x41464744\",\n        \"push 0x41465244\",\n        \"push 0x41464241\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000025\",\n        \"push 0xa\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa3380c\",\n        \"push 0x41464241\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x50534744\",\n        \"push 0x50535244\",\n        \"push 0x50534241\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000025\",\n        \"push 0x9\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa337f8\",\n        \"push 0x50534241\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x3d\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa337ec\",\n        \"push 0x49465352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x3e\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa337dc\",\n        \"push 0x52465352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x44\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa337cc\",\n        \"push 0x48535352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x40\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa337bc\",\n        \"push 0x414d5352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x3f\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa337ac\",\n        \"push 0x49445352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x43\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa3379c\",\n        \"push 0x4f505352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x42\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33788\",\n        \"push 0x41505352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x41\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33770\",\n        \"push 0x574e5352\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100017a\",\n        \"push 0x47\",\n        \"fldz\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa3375c\",\n        \"push 0x44575352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1f0\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa3374c\",\n        \"push 0x49445543\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1f0\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33740\",\n        \"push 0x4f505543\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1f0\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33730\",\n        \"push 0x41505543\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000012\",\n        \"push 0x28\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33714\",\n        \"push 0x4d4d4f46\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33704\",\n        \"push 0x4f48475a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa336f8\",\n        \"push 0x43494c5a\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"fldz\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa336e8\",\n        \"push 0x454b535a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa336d0\",\n        \"push 0x414b535a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa336b4\",\n        \"push 0x434b535a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3369c\",\n        \"push 0x484b535a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3368c\",\n        \"push 0x4152575a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33678\",\n        \"push 0x4c52575a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33668\",\n        \"push 0x4d4f5a5a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33650\",\n        \"push 0x5a44485a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33638\",\n        \"push 0x4149465a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33620\",\n        \"push 0x4152465a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33608\",\n        \"push 0x4154535a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa335f8\",\n        \"push 0x4541445a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa335e8\",\n        \"push 0x4552445a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa335d4\",\n        \"push 0x4c52445a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa335c4\",\n        \"push 0x4143535a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa335b0\",\n        \"push 0x414c435a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33598\",\n        \"push 0x4450535a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33588\",\n        \"push 0x5649585a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33578\",\n        \"push 0x3130305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33568\",\n        \"push 0x3230305a\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"fldz\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33558\",\n        \"push 0x3330305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33548\",\n        \"push 0x3430305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33538\",\n        \"push 0x3530305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33528\",\n        \"push 0x3630305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33518\",\n        \"push 0x3730305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33508\",\n        \"push 0x3830305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa334f8\",\n        \"push 0x3930305a\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"fldz\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa334e8\",\n        \"push 0x3031305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa334d8\",\n        \"push 0x3131305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa334c8\",\n        \"push 0x3231305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa334b8\",\n        \"push 0x3331305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa334a8\",\n        \"push 0x3431305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33498\",\n        \"push 0x3531305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33488\",\n        \"push 0x3631305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33478\",\n        \"push 0x3731305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33468\",\n        \"push 0x3831305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33458\",\n        \"push 0x3931305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33448\",\n        \"push 0x3032305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x4c505344\",\n        \"push 0x1\",\n        \"push -0x1\",\n        \"push 0x40000062\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33434\",\n        \"push 0x55484f43\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x4c505344\",\n        \"push 0x1\",\n        \"push -0x1\",\n        \"push 0x40000062\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33420\",\n        \"push 0x52434f43\",\n        \"call 0x00417220\",\n        \"add esp,0x24\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fldz\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33414\",\n        \"push 0x58415742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33408\",\n        \"push 0x4f425742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa333f8\",\n        \"push 0x41445742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa333ec\",\n        \"push 0x414d5742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa333e0\",\n        \"push 0x57535742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa333d4\",\n        \"push 0x4f424142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa333c4\",\n        \"push 0x55434142\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"fldz\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa333b4\",\n        \"push 0x41474142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa333a4\",\n        \"push 0x52474142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33394\",\n        \"push 0x45484142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33384\",\n        \"push 0x48534142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3336c\",\n        \"push 0x31304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33354\",\n        \"push 0x32304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3333c\",\n        \"push 0x33304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33324\",\n        \"push 0x34304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3330c\",\n        \"push 0x35304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa332f4\",\n        \"push 0x36304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa332dc\",\n        \"push 0x37304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa332c4\",\n        \"push 0x38304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa332ac\",\n        \"push 0x39304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33294\",\n        \"push 0x30314142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3327c\",\n        \"push 0x31305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33264\",\n        \"push 0x32305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3324c\",\n        \"push 0x33305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33234\",\n        \"push 0x34305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3321c\",\n        \"push 0x35305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33204\",\n        \"push 0x36305742\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fldz\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa331ec\",\n        \"push 0x37305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa331d4\",\n        \"push 0x38305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa331bc\",\n        \"push 0x39305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa331a4\",\n        \"push 0x30315742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x594c4152\",\n        \"push 0x4c505344\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x40000063\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33198\",\n        \"push 0x4e525554\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x4c505344\",\n        \"push 0x1\",\n        \"push -0x1\",\n        \"push 0x170\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x6\",\n        \"push 0xa33188\",\n        \"push 0x46464553\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3316c\",\n        \"push 0x4854594d\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33154\",\n        \"push 0x4c48594d\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10000360\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33148\",\n        \"push 0x4e414552\",\n        \"call 0x00417220\",\n        \"add esp,0x20\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov w20, #0x0\",\n        \"str w20, [x8, #-4]!\",\n        \"mov w21, #0xffffffff\",\n        \"str w21, [x8, #-4]!\",\n        \"mov w21, #0x172\",\n        \"movk w21, #0x100, lsl #16\",\n        \"str w21, [x8, #-4]!\",\n        \"mov w21, #0x37\",\n        \"stp w7, w21, [x8, #-8]!\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8]\",\n        \"str w20, [x8, #-4]!\",\n        \"mov w20, #0x3c14\",\n        \"movk w20, #0xa3, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"mov w20, #0x4157\",\n        \"movk w20, #0x5242, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"mov w20, #0x22\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"add w21, w21, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"lsl w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    },\n    \"Block5\": {\n      \"x86InstructionCount\": 368,\n      \"ExpectedInstructionCount\": 128,\n      \"x86Insts\": [\n        \"mov ebx,dword [eax + 0x68]\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov eax,dword [ebp + 0x68]\",\n        \"sub esp,0x14\",\n        \"fstp dword [esp + 0x10]\",\n        \"movzx ecx,al\",\n        \"fld1\",\n        \"mov dword [esp + 0x38],ecx\",\n        \"fstp dword [esp + 0xc]\",\n        \"movzx edx,bl\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fild dword [esp + 0x38]\",\n        \"mov dword [esp + 0x40],eax\",\n        \"fld qword [0x00a3ddd8]\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x38],edx\",\n        \"fild dword [esp + 0x38]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esi + 0x2c]\",\n        \"movzx eax,byte [esp + 0x41]\",\n        \"fstp dword [esp + 0x10]\",\n        \"mov dword [esp + 0x38],eax\",\n        \"fld1\",\n        \"movzx ecx,bh\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fild dword [esp + 0x38]\",\n        \"fld qword [0x00a3ddd8]\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x38],ecx\",\n        \"fild dword [esp + 0x38]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x28]\",\n        \"mov eax,dword [esp + 0x40]\",\n        \"fld dword [esi + 0x2c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"shr eax,0x10\",\n        \"fld1\",\n        \"movzx edx,al\",\n        \"fstp dword [esp + 0xc]\",\n        \"mov dword [esp + 0x40],edx\",\n        \"fldz\",\n        \"shr ebx,0x10\",\n        \"movzx eax,bl\",\n        \"fstp dword [esp + 0x8]\",\n        \"fild dword [esp + 0x40]\",\n        \"fld qword [0x00a3ddd8]\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x40],eax\",\n        \"fild dword [esp + 0x40]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld1\",\n        \"fst dword [esp + 0x30]\",\n        \"mov ecx,dword [esp + 0x24]\",\n        \"mov edx,dword [esp + 0x28]\",\n        \"mov eax,dword [esp + 0x2c]\",\n        \"mov dword [0x00b45e14],ecx\",\n        \"mov ecx,dword [esp + 0x30]\",\n        \"mov [0x00b45e1c],eax\",\n        \"mov dword [0x00b45e20],ecx\",\n        \"mov dword [0x00b45e18],edx\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov eax,dword [ebp + 0x6c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"mov dword [esp + 0x40],eax\",\n        \"fstp dword [esp + 0xc]\",\n        \"movzx eax,al\",\n        \"fldz\",\n        \"mov dword [esp + 0x38],eax\",\n        \"fstp dword [esp + 0x8]\",\n        \"mov edx,dword [esi + 0x20]\",\n        \"fild dword [esp + 0x38]\",\n        \"mov ebx,dword [edx + 0x6c]\",\n        \"fld qword [0x00a3ddd8]\",\n        \"movzx ecx,bl\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x38],ecx\",\n        \"fild dword [esp + 0x38]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esi + 0x2c]\",\n        \"movzx edx,byte [esp + 0x41]\",\n        \"fstp dword [esp + 0x10]\",\n        \"mov dword [esp + 0x38],edx\",\n        \"fld1\",\n        \"movzx eax,bh\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fild dword [esp + 0x38]\",\n        \"fld qword [0x00a3ddd8]\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x38],eax\",\n        \"fild dword [esp + 0x38]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x28]\",\n        \"mov eax,dword [esp + 0x40]\",\n        \"fld dword [esi + 0x2c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"shr eax,0x10\",\n        \"fld1\",\n        \"movzx ecx,al\",\n        \"fstp dword [esp + 0xc]\",\n        \"mov dword [esp + 0x40],ecx\",\n        \"fldz\",\n        \"shr ebx,0x10\",\n        \"movzx edx,bl\",\n        \"fstp dword [esp + 0x8]\",\n        \"fild dword [esp + 0x40]\",\n        \"fld qword [0x00a3ddd8]\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x40],edx\",\n        \"fild dword [esp + 0x40]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"mov eax,dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld1\",\n        \"mov ecx,dword [esp + 0x28]\",\n        \"mov edx,dword [esp + 0x2c]\",\n        \"fst dword [esp + 0x30]\",\n        \"mov [0x00b45e24],eax\",\n        \"mov eax,dword [esp + 0x30]\",\n        \"mov dword [0x00b45e2c],edx\",\n        \"mov [0x00b45e30],eax\",\n        \"mov dword [0x00b45e28],ecx\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov eax,dword [ebp + 0x70]\",\n        \"fstp dword [esp + 0x10]\",\n        \"movzx edx,al\",\n        \"fstp dword [esp + 0xc]\",\n        \"mov dword [esp + 0x38],edx\",\n        \"fldz\",\n        \"mov ecx,dword [esi + 0x20]\",\n        \"fstp dword [esp + 0x8]\",\n        \"mov ebx,dword [ecx + 0x70]\",\n        \"fild dword [esp + 0x38]\",\n        \"mov dword [esp + 0x40],eax\",\n        \"fld qword [0x00a3ddd8]\",\n        \"movzx eax,bl\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x38],eax\",\n        \"fild dword [esp + 0x38]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esi + 0x2c]\",\n        \"movzx ecx,byte [esp + 0x41]\",\n        \"fstp dword [esp + 0x10]\",\n        \"mov dword [esp + 0x38],ecx\",\n        \"fld1\",\n        \"movzx edx,bh\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fild dword [esp + 0x38]\",\n        \"fld qword [0x00a3ddd8]\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x38],edx\",\n        \"fild dword [esp + 0x38]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x28]\",\n        \"mov eax,dword [esp + 0x40]\",\n        \"fld dword [esi + 0x2c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"shr eax,0x10\",\n        \"fld1\",\n        \"movzx eax,al\",\n        \"fstp dword [esp + 0xc]\",\n        \"mov dword [esp + 0x40],eax\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fild dword [esp + 0x40]\",\n        \"fld qword [0x00a3ddd8]\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"shr ebx,0x10\",\n        \"movzx ecx,bl\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x40],ecx\",\n        \"fild dword [esp + 0x40]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld1\",\n        \"mov edx,dword [esp + 0x24]\",\n        \"mov eax,dword [esp + 0x28]\",\n        \"fst dword [esp + 0x30]\",\n        \"mov ecx,dword [esp + 0x2c]\",\n        \"mov dword [0x00b45e34],edx\",\n        \"mov edx,dword [esp + 0x30]\",\n        \"mov [0x00b45e38],eax\",\n        \"mov dword [0x00b45e3c],ecx\",\n        \"mov dword [0x00b45e40],edx\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov eax,dword [esi + 0x24]\",\n        \"fstp dword [esp + 0x10]\",\n        \"mov ecx,dword [esi + 0x20]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x4c]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [ecx + 0x4c]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [0x00b45e44]\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov edx,dword [esi + 0x24]\",\n        \"mov eax,dword [esi + 0x20]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld1\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [edx + 0x50]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [eax + 0x50]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [0x00b45e48]\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov ecx,dword [esi + 0x24]\",\n        \"add esp,0x8\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld1\",\n        \"fstp dword [esp + 0x4]\",\n        \"fldz\",\n        \"fstp dword [esp]\",\n        \"call 0x004ed660\",\n        \"push ecx\",\n        \"mov ecx,dword [esi + 0x20]\",\n        \"fstp dword [esp]\",\n        \"call 0x004ed660\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [0x00b45e4c]\",\n        \"mov ecx,dword [esi + 0x24]\",\n        \"fld dword [esi + 0x2c]\",\n        \"add esp,0x8\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld1\",\n        \"fstp dword [esp + 0x4]\",\n        \"fldz\",\n        \"fstp dword [esp]\",\n        \"call 0x004ed680\",\n        \"push ecx\",\n        \"mov ecx,dword [esi + 0x20]\",\n        \"fstp dword [esp]\",\n        \"call 0x004ed680\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [0x00b45e50]\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov ecx,dword [esi + 0x24]\",\n        \"mov edx,dword [esi + 0x20]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld1\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [ecx + 0x58]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [edx + 0x58]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [0x00b45e54]\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov eax,dword [esi + 0x24]\",\n        \"mov ecx,dword [esi + 0x20]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld1\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x5c]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [ecx + 0x5c]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [0x00b45e58]\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov edx,dword [esi + 0x24]\",\n        \"mov eax,dword [esi + 0x20]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld1\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [edx + 0x54]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [eax + 0x54]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"add esp,0x14\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w6, [x4, #104]\",\n        \"ldr s2, [x10, #44]\",\n        \"ldr w4, [x9, #104]\",\n        \"mvn w27, w8\",\n        \"subs w26, w8, #0x14 (20)\",\n        \"mov x8, x26\",\n        \"str s2, [x8, #16]\",\n        \"uxtb w7, w4\",\n        \"ldr q2, [x28, #3328]\",\n        \"str w7, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #12]\",\n        \"uxtb w5, w6\",\n        \"movi v2.2d, #0x0\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #8]\",\n        \"ldr w20, [x8, #56]\",\n        \"sxtw x20, w20\",\n        \"mrs x21, nzcv\",\n        \"mov w22, #0x0\",\n        \"cmp x20, #0x0 (0)\",\n        \"mov w23, #0x8000\",\n        \"csel x12, x23, x22, lt\",\n        \"cneg x20, x20, mi\",\n        \"mov w13, #0x3f\",\n        \"mov x0, #0x3f\",\n        \"clz x14, x20\",\n        \"sub x14, x0, x14\",\n        \"sub x14, x13, x14\",\n        \"lsl x15, x20, x14\",\n        \"mov w16, #0x403e\",\n        \"sub x14, x16, x14\",\n        \"cmp x20, #0x0 (0)\",\n        \"csel x20, x22, x14, eq\",\n        \"orr x20, x12, x20\",\n        \"fmov d2, x15\",\n        \"fmov v2.D[1], x20\",\n        \"msr nzcv, x21\",\n        \"str w4, [x8, #64]\",\n        \"mov w20, #0xddd8\",\n        \"movk w20, #0xa3, lsl #16\",\n        \"ldr d3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #56]\",\n        \"str s2, [x8, #4]\",\n        \"str w5, [x8, #56]\",\n        \"ldr w20, [x8, #56]\",\n        \"sxtw x20, w20\",\n        \"mrs x21, nzcv\",\n        \"cmp x20, #0x0 (0)\",\n        \"csel x23, x23, x22, lt\",\n        \"cneg x20, x20, mi\",\n        \"mov x0, #0x3f\",\n        \"clz x12, x20\",\n        \"sub x12, x0, x12\",\n        \"sub x12, x13, x12\",\n        \"lsl x13, x20, x12\",\n        \"sub x12, x16, x12\",\n        \"cmp x20, #0x0 (0)\",\n        \"csel x20, x22, x12, eq\",\n        \"orr x20, x23, x20\",\n        \"fmov d2, x13\",\n        \"fmov v2.D[1], x20\",\n        \"msr nzcv, x21\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #56]\",\n        \"str s2, [x8]\",\n        \"mov w20, #0x5e\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x8\",\n        \"sub w21, w23, w21\",\n        \"mov w23, #0xc0c0\",\n        \"lsr w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    },\n    \"Block6\": {\n      \"x86InstructionCount\": 315,\n      \"ExpectedInstructionCount\": 32,\n      \"x86Insts\": [\n        \"mov eax,dword [esp + 0x110]\",\n        \"fldz\",\n        \"mov ecx,dword [eax]\",\n        \"mov edx,dword [esp + 0x5c]\",\n        \"mov ebx,dword [edx + 0x18]\",\n        \"mov esi,dword [esp + 0x58]\",\n        \"mov dword [ebx + 0xc],ecx\",\n        \"mov edx,dword [eax + 0x4]\",\n        \"mov dword [ebx + 0x10],edx\",\n        \"mov eax,dword [eax + 0x8]\",\n        \"mov dword [ebx + 0x14],eax\",\n        \"mov ecx,dword [esi + 0x50]\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"call 0x00784370\",\n        \"mov ecx,dword [esi + 0x50]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fldz\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"call 0x00784370\",\n        \"fstp dword [esp + 0x64]\",\n        \"mov eax,dword [esp + 0x11c]\",\n        \"lea ebp,[ebx + 0x1c]\",\n        \"mov esi,eax\",\n        \"mov ecx,0x9\",\n        \"mov edi,ebp\",\n        \"rep movsd\",\n        \"fld dword [eax + 0x4]\",\n        \"mov ecx,dword [esp + 0x120]\",\n        \"sub esp,0xc\",\n        \"fmul dword [ecx + 0x4]\",\n        \"fld dword [ecx]\",\n        \"fmul dword [eax]\",\n        \"faddp\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul dword [ecx + 0x8]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmul dword [ecx]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmul dword [ecx + 0x4]\",\n        \"faddp\",\n        \"fld dword [eax + 0x14]\",\n        \"fmul dword [ecx + 0x8]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmul dword [ecx]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmul dword [ecx + 0x4]\",\n        \"faddp\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,esp\",\n        \"fmul dword [ecx + 0x8]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x48]\",\n        \"mov ecx,dword [esp + 0x48]\",\n        \"fld dword [esp + 0x44]\",\n        \"mov dword [eax],ecx\",\n        \"fstp dword [esp + 0x4c]\",\n        \"mov edx,dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x34]\",\n        \"mov dword [eax + 0x4],edx\",\n        \"fstp dword [esp + 0x50]\",\n        \"mov ecx,dword [esp + 0x50]\",\n        \"fld dword [esp + 0x3c]\",\n        \"mov dword [eax + 0x8],ecx\",\n        \"push ecx\",\n        \"mov ecx,ebp\",\n        \"fstp dword [esp]\",\n        \"call 0x0078f050\",\n        \"fld dword [esp + 0x54]\",\n        \"sub esp,0x8\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fadd dword [esp + 0x3c]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esp + 0x24]\",\n        \"mov ecx,ebp\",\n        \"fstp dword [esp]\",\n        \"call 0x0078ef60\",\n        \"fld dword [ebp + 0xc]\",\n        \"mov esi,dword [esp + 0x58]\",\n        \"fld dword [0x00b2b71c]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fld dword [ebp]\",\n        \"fld dword [0x00b2b718]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch st3\",\n        \"faddp\",\n        \"fld dword [ebp + 0x18]\",\n        \"fld dword [0x00b2b720]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch st2\",\n        \"faddp\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [ebp + 0x10]\",\n        \"fmul st2\",\n        \"fld dword [ebp + 0x4]\",\n        \"fmul st4\",\n        \"faddp\",\n        \"fld dword [ebp + 0x1c]\",\n        \"fmul st2\",\n        \"faddp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [ebp + 0x14]\",\n        \"fmulp st2\",\n        \"fld dword [ebp + 0x8]\",\n        \"fmulp st3\",\n        \"fxch\",\n        \"faddp st2,st0\",\n        \"fmul dword [ebp + 0x20]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"mov edx,dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x38]\",\n        \"mov dword [ebx],edx\",\n        \"fstp dword [esp + 0x40]\",\n        \"mov eax,dword [esp + 0x40]\",\n        \"fld dword [esp + 0x28]\",\n        \"mov dword [ebx + 0x4],eax\",\n        \"fstp dword [esp + 0x44]\",\n        \"mov ecx,dword [esp + 0x44]\",\n        \"fldz\",\n        \"mov dword [ebx + 0x8],ecx\",\n        \"mov ecx,dword [esi + 0x68]\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"call 0x00784210\",\n        \"fmul dword [esp + 0x6c]\",\n        \"fstp dword [ebx + 0x18]\",\n        \"mov ecx,dword [esi + 0x5c]\",\n        \"fldz\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"call 0x00784210\",\n        \"fmul dword [esp + 0x80]\",\n        \"push 0xb2b724\",\n        \"mov ecx,ebx\",\n        \"fstp dword [esp + 0x54]\",\n        \"call 0x0078fcc0\",\n        \"fmul qword [0x00a8ba48]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp + 0x34]\",\n        \"fsubr qword [0x00a65a18]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fabs\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fmul qword [0x00a8c698]\",\n        \"fld1\",\n        \"fsubrp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [0x00b2b72c]\",\n        \"fld st0\",\n        \"fmul dword [ebx + 0x4]\",\n        \"fld dword [ebx + 0x8]\",\n        \"fld dword [0x00b2b728]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch st2\",\n        \"fsubrp\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [ebx + 0x8]\",\n        \"fld dword [0x00b2b724]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fld dword [ebx]\",\n        \"fmulp st4\",\n        \"fxch\",\n        \"fsubrp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x30]\",\n        \"fmul dword [ebx]\",\n        \"fld dword [ebx + 0x4]\",\n        \"fmulp st2\",\n        \"fsubrp\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x30]\",\n        \"fld dword [esp + 0x24]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fld st1\",\n        \"fmulp st2\",\n        \"fld st2\",\n        \"fmulp st3\",\n        \"fxch\",\n        \"faddp st2,st0\",\n        \"fmul st0\",\n        \"faddp\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x1c]\",\n        \"call 0x00982c30\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x1c]\",\n        \"mov ecx,dword [esi + 0x70]\",\n        \"fld1\",\n        \"push ecx\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x20]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x44]\",\n        \"fmul dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fldz\",\n        \"fstp dword [esp]\",\n        \"call 0x00784210\",\n        \"fsub qword [0x00a2faa0]\",\n        \"mov edx,dword [esp + 0x3c]\",\n        \"mov ecx,dword [esp + 0x40]\",\n        \"sub esp,0xc\",\n        \"fadd st0,st0\",\n        \"mov eax,esp\",\n        \"mov dword [eax],edx\",\n        \"fmul qword [0x00a3d360]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld1\",\n        \"fst dword [esp + 0xb8]\",\n        \"fldz\",\n        \"fst dword [esp + 0xbc]\",\n        \"fst dword [esp + 0xc0]\",\n        \"fst dword [esp + 0xc4]\",\n        \"fst dword [esp + 0xcc]\",\n        \"fst dword [esp + 0xd0]\",\n        \"fstp dword [esp + 0xd4]\",\n        \"fst dword [esp + 0xc8]\",\n        \"fstp dword [esp + 0xd8]\",\n        \"fld dword [esp + 0x28]\",\n        \"mov edx,dword [esp + 0x50]\",\n        \"fmul dword [esp + 0x90]\",\n        \"mov dword [eax + 0x4],ecx\",\n        \"push ecx\",\n        \"mov dword [eax + 0x8],edx\",\n        \"fmul dword [esp + 0x44]\",\n        \"lea ecx,[esp + 0xbc]\",\n        \"fmul dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fstp dword [esp]\",\n        \"call 0x0078f160\",\n        \"lea eax,[esp + 0xac]\",\n        \"push eax\",\n        \"lea ecx,[esp + 0xd4]\",\n        \"push ecx\",\n        \"mov ecx,ebp\",\n        \"call 0x0078edd0\",\n        \"cmp dword [esp + 0x124],0x0\",\n        \"mov esi,eax\",\n        \"mov ecx,0x9\",\n        \"mov edi,ebp\",\n        \"rep movsd\",\n        \"fld dword [ebp + 0xc]\",\n        \"fld dword [0x00b2b71c]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fld dword [ebp]\",\n        \"fld dword [0x00b2b718]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch st3\",\n        \"faddp\",\n        \"fld dword [ebp + 0x18]\",\n        \"fld dword [0x00b2b720]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch st2\",\n        \"faddp\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [ebp + 0x10]\",\n        \"fmul st2\",\n        \"fld dword [ebp + 0x4]\",\n        \"fmul st4\",\n        \"faddp\",\n        \"fld dword [ebp + 0x1c]\",\n        \"fmul st2\",\n        \"faddp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [ebp + 0x14]\",\n        \"fmulp st2\",\n        \"fld dword [ebp + 0x8]\",\n        \"fmulp st3\",\n        \"fxch\",\n        \"faddp st2,st0\",\n        \"fmul dword [ebp + 0x20]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"mov edx,dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x38]\",\n        \"mov dword [ebx],edx\",\n        \"fstp dword [esp + 0x40]\",\n        \"mov eax,dword [esp + 0x40]\",\n        \"fld dword [esp + 0x28]\",\n        \"mov dword [ebx + 0x4],eax\",\n        \"mov eax,dword [esp + 0x10c]\",\n        \"fstp dword [esp + 0x44]\",\n        \"mov ecx,dword [esp + 0x44]\",\n        \"mov dword [ebx + 0x8],ecx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x8, #272]\",\n        \"movi v2.2d, #0x0\",\n        \"ldr w7, [x4]\",\n        \"ldr w5, [x8, #92]\",\n        \"ldr w6, [x5, #24]\",\n        \"ldr w10, [x8, #88]\",\n        \"str w7, [x6, #12]\",\n        \"ldr w5, [x4, #4]\",\n        \"str w5, [x6, #16]\",\n        \"ldr w4, [x4, #8]\",\n        \"str w4, [x6, #20]\",\n        \"ldr w7, [x10, #80]\",\n        \"str w7, [x8, #-4]!\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8]\",\n        \"mov w20, #0x31\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"add w21, w21, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"lsl w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    },\n    \"Block7\": {\n      \"x86InstructionCount\": 214,\n      \"ExpectedInstructionCount\": 1743,\n      \"x86Insts\": [\n        \"fld dword [ecx + 0xc]\",\n        \"fld dword [ecx + 0x18]\",\n        \"fadd st0,st1\",\n        \"fstp dword [ecx + 0x18]\",\n        \"fld dword [ecx]\",\n        \"fadd st1,st0\",\n        \"fxch\",\n        \"fstp dword [ecx + 0xc]\",\n        \"fld dword [ecx + -0xc]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [ecx]\",\n        \"fld dword [ecx + -0x18]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [ecx + -0xc]\",\n        \"fld dword [ecx + -0x24]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst dword [ecx + -0x18]\",\n        \"fld dword [ecx]\",\n        \"fld dword [ecx + 0x18]\",\n        \"fadd st0,st1\",\n        \"fstp dword [ecx + 0x18]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst dword [ecx]\",\n        \"fld dword [ecx + -0xc]\",\n        \"fmul st6\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [ecx + 0xc]\",\n        \"fld st0\",\n        \"fmul st6\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x8]\",\n        \"fadd st0,st4\",\n        \"fstp dword [esp + 0x8]\",\n        \"fsubp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x38]\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x40]\",\n        \"fxch\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [ecx + 0x18]\",\n        \"fld st0\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x8]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x8]\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x8]\",\n        \"fmul qword [0x00a77be0]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x48]\",\n        \"fmul qword [0x00a77bd8]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fmul qword [0x00a77bd0]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x38]\",\n        \"fst dword [esp + 0x8]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fadd st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fsubr dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fst dword [esp + 0x8]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fsubr dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x40]\",\n        \"fst dword [esp + 0x8]\",\n        \"fld dword [esp + 0x44]\",\n        \"fadd st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x40]\",\n        \"fsubr dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul qword [0x00a77bc8]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul qword [0x00a77bc0]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x40]\",\n        \"fmul qword [0x00a77bb8]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x44]\",\n        \"fmul qword [0x00a77bb0]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x48]\",\n        \"fmul qword [0x00a77ba8]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fmul qword [0x00a77ba0]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x38]\",\n        \"fchs\",\n        \"fld st0\",\n        \"fmul st2\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld qword [0x00a77b98]\",\n        \"fmul st1\",\n        \"fxch\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fchs\",\n        \"fld st0\",\n        \"fld qword [0x00a77b90]\",\n        \"fmul st1\",\n        \"fxch\",\n        \"fstp dword [esp + 0x54]\",\n        \"fxch\",\n        \"fmul qword [0x00a77b88]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esp + 0x40]\",\n        \"fchs\",\n        \"fld qword [0x00a77b80]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x50]\",\n        \"fmul qword [0x00a77b78]\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x48]\",\n        \"fld qword [0x00a77b88]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fld st0\",\n        \"fmulp st4\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x40]\",\n        \"fxch st2\",\n        \"fchs\",\n        \"fmul st3\",\n        \"add eax,0x18\",\n        \"add ecx,0x4\",\n        \"sub edx,0x1\",\n        \"fstp dword [esp + 0x44]\",\n        \"fxch\",\n        \"fchs\",\n        \"fmulp\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x38]\",\n        \"fld st0\",\n        \"fchs\",\n        \"fmul qword [0x00a77b80]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fmul qword [0x00a77b78]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [eax + -0x1c]\",\n        \"fadd dword [esp + 0x38]\",\n        \"fstp dword [eax + -0x1c]\",\n        \"fld dword [eax + -0x18]\",\n        \"fadd dword [esp + 0x3c]\",\n        \"fstp dword [eax + -0x18]\",\n        \"fld dword [esp + 0x40]\",\n        \"fadd dword [eax + -0x14]\",\n        \"fstp dword [eax + -0x14]\",\n        \"fld dword [eax + -0x10]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [eax + -0x10]\",\n        \"fld dword [eax + -0xc]\",\n        \"fadd dword [esp + 0x48]\",\n        \"fstp dword [eax + -0xc]\",\n        \"fld dword [eax + -0x8]\",\n        \"fadd dword [esp + 0x4c]\",\n        \"fstp dword [eax + -0x8]\",\n        \"fld dword [esp + 0x50]\",\n        \"fadd dword [eax + -0x4]\",\n        \"fstp dword [eax + -0x4]\",\n        \"fld dword [eax]\",\n        \"fadd dword [esp + 0x54]\",\n        \"fstp dword [eax]\",\n        \"fld dword [eax + 0x4]\",\n        \"fadd dword [esp + 0x58]\",\n        \"fstp dword [eax + 0x4]\",\n        \"fld dword [eax + 0x8]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fstp dword [eax + 0x8]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [eax + 0xc]\",\n        \"fstp dword [eax + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fadd dword [esp + 0x64]\",\n        \"fstp dword [eax + 0x10]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x7, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #24]\",\n        \"ldr s3, [x7]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x7, #12]\",\n        \"ldur s2, [x7, #-12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7]\",\n        \"ldur s3, [x7, #-24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x7, #-12]\",\n        \"ldur s2, [x7, #-36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #8]\",\n        \"ldr s3, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"stur s3, [x7, #-24]\",\n        \"ldr s3, [x7]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s5, [x7, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x7, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #8]\",\n        \"ldr s3, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str s3, [x7]\",\n        \"ldur s3, [x7, #-12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q6, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #4]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"ldr s3, [x7, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add w23, w20, #0x6 (6)\",\n        \"and w23, w23, #0x7\",\n        \"add x23, x28, x23, lsl #4\",\n        \"ldr q7, [x23, #1056]\",\n        \"add x23, x28, x20, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #8]\",\n        \"ldr s8, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x12, x28, x20, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add x13, x28, x22, lsl #4\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #60]\",\n        \"add w22, w22, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"ldr s2, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #64]\",\n        \"add x22, x28, x22, lsl #4\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #4]\",\n        \"ldr s2, [x7, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #8]\",\n        \"ldr s3, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #72]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldr s2, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #8]\",\n        \"ldr s2, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w14, #0x7be0\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #68]\",\n        \"ldr s2, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w14, #0x7bd8\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #72]\",\n        \"ldr s2, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w14, #0x7bd0\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #76]\",\n        \"ldr s2, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #8]\",\n        \"ldr s3, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #76]\",\n        \"ldr s2, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #8]\",\n        \"ldr s3, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #72]\",\n        \"ldr s2, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #8]\",\n        \"ldr s3, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #64]\",\n        \"ldr s2, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #68]\",\n        \"ldr s2, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w14, #0x7bc8\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w14, #0x7bc0\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w14, #0x7bb8\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #64]\",\n        \"ldr s2, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w14, #0x7bb0\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #68]\",\n        \"ldr s2, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w14, #0x7ba8\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #72]\",\n        \"ldr s2, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w14, #0x7ba0\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #76]\",\n        \"ldr s2, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q3, [x28, #3552]\",\n        \"eor v2.16b, v2.16b, v3.16b\",\n        \"add x14, x28, x20, lsl #4\",\n        \"ldr q3, [x14, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #88]\",\n        \"mov w14, #0x7b98\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d4, [x14]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d4\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #92]\",\n        \"ldr s2, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q5, [x28, #3552]\",\n        \"eor v2.16b, v2.16b, v5.16b\",\n        \"mov w14, #0x7b90\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d5, [x14]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d5\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #84]\",\n        \"strb wzr, [x28, #1049]\",\n        \"mov w14, #0x7b88\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d6, [x14]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d6\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #96]\",\n        \"ldr s2, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q6, [x28, #3552]\",\n        \"eor v2.16b, v2.16b, v6.16b\",\n        \"mov w15, #0x7b80\",\n        \"movk w15, #0xa7, lsl #16\",\n        \"ldr d6, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d6\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #80]\",\n        \"mov w16, #0x7b78\",\n        \"movk w16, #0xa7, lsl #16\",\n        \"ldr d6, [x16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d6\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #100]\",\n        \"ldr s2, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr d6, [x14]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d6\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #60]\",\n        \"ldr s6, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #64]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr q7, [x28, #3552]\",\n        \"eor v7.16b, v6.16b, v7.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"add w4, w4, #0x18 (24)\",\n        \"add w7, w7, #0x4 (4)\",\n        \"subs w26, w5, #0x1 (1)\",\n        \"mov x27, x5\",\n        \"mov x5, x26\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #68]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr q7, [x28, #3552]\",\n        \"eor v2.16b, v2.16b, v7.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #72]\",\n        \"ldr s2, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q5, [x28, #3552]\",\n        \"eor v5.16b, v2.16b, v5.16b\",\n        \"ldr d7, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d7\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #76]\",\n        \"ldr d7, [x16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d7\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #56]\",\n        \"ldur s2, [x4, #-28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s7, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x4, #-28]\",\n        \"ldur s2, [x4, #-24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s7, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x4, #-24]\",\n        \"ldr s2, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s7, [x4, #-20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x4, #-20]\",\n        \"ldur s2, [x4, #-16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s7, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x4, #-16]\",\n        \"ldur s2, [x4, #-12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s7, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x4, #-12]\",\n        \"ldur s2, [x4, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s7, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x4, #-8]\",\n        \"ldr s2, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s7, [x4, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x4, #-4]\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s7, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr s2, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s7, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #4]\",\n        \"ldr s2, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s7, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #8]\",\n        \"ldr s2, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s7, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #12]\",\n        \"ldr s2, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s7, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x4, #16]\",\n        \"strb w20, [x28, #1051]\",\n        \"str q6, [x23, #1056]\",\n        \"str q4, [x21, #1056]\",\n        \"str q3, [x13, #1056]\",\n        \"str q5, [x22, #1056]\",\n        \"str q2, [x12, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xf8f8\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block8\": {\n      \"x86InstructionCount\": 229,\n      \"ExpectedInstructionCount\": 1903,\n      \"x86Insts\": [\n        \"movzx eax,word [esi + edx*0x8]\",\n        \"fld dword [esi + edx*0x8 + 0x4]\",\n        \"fstp dword [esp + 0x24]\",\n        \"mov esi,dword [esp + 0x1c8]\",\n        \"fld dword [esp + 0x9c]\",\n        \"movzx eax,ax\",\n        \"mov ecx,eax\",\n        \"imul ecx,dword [esp + 0x1e4]\",\n        \"lea eax,[eax + eax*0x2]\",\n        \"add eax,eax\",\n        \"add eax,eax\",\n        \"lea edi,[eax + esi*0x1 + 0x8]\",\n        \"mov dword [esp + 0x10],edi\",\n        \"fmul dword [eax + esi*0x1 + 0x4]\",\n        \"fld dword [esp + 0x98]\",\n        \"fmul dword [eax + esi*0x1]\",\n        \"faddp\",\n        \"fld dword [esp + 0xa0]\",\n        \"fmul dword [edi]\",\n        \"faddp\",\n        \"fadd dword [esp + 0x88]\",\n        \"fstp dword [esp + 0xd0]\",\n        \"fld dword [esp + 0xa8]\",\n        \"fmul dword [eax + esi*0x1 + 0x4]\",\n        \"fld dword [esp + 0xa4]\",\n        \"fmul dword [eax + esi*0x1]\",\n        \"faddp\",\n        \"fld dword [esp + 0xac]\",\n        \"fmul dword [edi]\",\n        \"faddp\",\n        \"fadd dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0xd4]\",\n        \"fld dword [esp + 0xb4]\",\n        \"fmul dword [eax + esi*0x1 + 0x4]\",\n        \"fld dword [esp + 0xb0]\",\n        \"fmul dword [eax + esi*0x1]\",\n        \"mov esi,edi\",\n        \"faddp\",\n        \"fld dword [esp + 0xb8]\",\n        \"fmul dword [esi]\",\n        \"mov esi,dword [esp + 0x38]\",\n        \"lea edi,[esi + eax*0x1 + 0x8]\",\n        \"mov dword [esp + 0x10],edi\",\n        \"faddp\",\n        \"fadd dword [esp + 0x90]\",\n        \"fstp dword [esp + 0xd8]\",\n        \"fld dword [esp + 0x64]\",\n        \"fld st0\",\n        \"fmul dword [eax + ebx*0x1]\",\n        \"fld dword [esp + 0x68]\",\n        \"fld st0\",\n        \"fmul dword [eax + ebx*0x1 + 0x4]\",\n        \"faddp st2,st0\",\n        \"fld dword [esp + 0x6c]\",\n        \"fld st0\",\n        \"fmul dword [eax + ebx*0x1 + 0x8]\",\n        \"faddp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0xe8]\",\n        \"fld dword [esp + 0x70]\",\n        \"fld st0\",\n        \"fmul dword [eax + ebx*0x1]\",\n        \"fld dword [esp + 0x74]\",\n        \"fld st0\",\n        \"fmul dword [eax + ebx*0x1 + 0x4]\",\n        \"faddp st2,st0\",\n        \"fld dword [esp + 0x78]\",\n        \"fmul dword [eax + ebx*0x1 + 0x8]\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0xec]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fmul dword [eax + ebx*0x1]\",\n        \"fld dword [esp + 0x80]\",\n        \"fmul dword [eax + ebx*0x1 + 0x4]\",\n        \"faddp\",\n        \"fld dword [esp + 0x84]\",\n        \"fmul dword [eax + ebx*0x1 + 0x8]\",\n        \"faddp\",\n        \"fstp dword [esp + 0xf0]\",\n        \"fld st2\",\n        \"fmul dword [esi + eax*0x1 + 0x4]\",\n        \"fld st5\",\n        \"fmul dword [esi + eax*0x1]\",\n        \"faddp\",\n        \"fld st4\",\n        \"fmul dword [edi]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld st0\",\n        \"fmul dword [esi + eax*0x1 + 0x4]\",\n        \"fld st2\",\n        \"fmul dword [esi + eax*0x1]\",\n        \"faddp\",\n        \"fld dword [esp + 0x78]\",\n        \"fmul dword [edi]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x80]\",\n        \"fmul dword [esi + eax*0x1 + 0x4]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fmul dword [esi + eax*0x1]\",\n        \"mov esi,edi\",\n        \"faddp\",\n        \"fld dword [esp + 0x84]\",\n        \"fmul dword [esi]\",\n        \"mov esi,dword [esp + 0x20]\",\n        \"lea edi,[esi + eax*0x1 + 0x4]\",\n        \"mov dword [esp + 0x10],edi\",\n        \"faddp\",\n        \"lea edi,[esi + eax*0x1 + 0x8]\",\n        \"mov dword [esp + 0xbc],edi\",\n        \"mov edi,dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esi + eax*0x1]\",\n        \"fmulp st5\",\n        \"fld dword [edi]\",\n        \"mov edi,dword [esp + 0xbc]\",\n        \"fmulp st3\",\n        \"fxch st4\",\n        \"faddp st2,st0\",\n        \"fld dword [edi]\",\n        \"mov edi,dword [esp + 0x10]\",\n        \"fmulp st3\",\n        \"fxch\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fmul dword [esi + eax*0x1]\",\n        \"fld dword [edi]\",\n        \"mov edi,dword [esp + 0xbc]\",\n        \"fmulp st2\",\n        \"faddp\",\n        \"fld dword [esp + 0x78]\",\n        \"fmul dword [edi]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fmul dword [esi + eax*0x1]\",\n        \"mov eax,dword [esp + 0x10]\",\n        \"fld dword [esp + 0x80]\",\n        \"fmul dword [eax]\",\n        \"mov eax,dword [esp + 0x1d4]\",\n        \"faddp\",\n        \"fld dword [esp + 0x84]\",\n        \"fmul dword [edi]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0xd0]\",\n        \"fld dword [esp + 0x24]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0xc0]\",\n        \"fld dword [esp + 0xd4]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0xc4]\",\n        \"fld dword [esp + 0xd8]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0xc8]\",\n        \"fld dword [esp + 0xc0]\",\n        \"fadd dword [ecx + eax*0x1]\",\n        \"fstp dword [ecx + eax*0x1]\",\n        \"add edx,0x1\",\n        \"cmp edx,dword [esp + 0x1c]\",\n        \"fld dword [esp + 0xc4]\",\n        \"fadd dword [ecx + eax*0x1 + 0x4]\",\n        \"fstp dword [ecx + eax*0x1 + 0x4]\",\n        \"lea eax,[ecx + eax*0x1 + 0x8]\",\n        \"fld dword [eax]\",\n        \"fadd dword [esp + 0xc8]\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [esp + 0x1dc]\",\n        \"fld dword [esp + 0xe8]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0xdc]\",\n        \"fld dword [esp + 0xec]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0xe0]\",\n        \"fld dword [esp + 0xf0]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0xe4]\",\n        \"fld dword [esp + 0xdc]\",\n        \"fadd dword [ecx + ebp*0x1]\",\n        \"fstp dword [ecx + ebp*0x1]\",\n        \"fld dword [esp + 0xe0]\",\n        \"fadd dword [ecx + ebp*0x1 + 0x4]\",\n        \"fstp dword [ecx + ebp*0x1 + 0x4]\",\n        \"fld dword [esp + 0xe4]\",\n        \"fadd dword [ecx + ebp*0x1 + 0x8]\",\n        \"fstp dword [ecx + ebp*0x1 + 0x8]\",\n        \"fld dword [esp + 0x58]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x60]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [ecx + eax*0x1]\",\n        \"fadd dword [esp + 0x3c]\",\n        \"fstp dword [ecx + eax*0x1]\",\n        \"fld dword [esp + 0x40]\",\n        \"fadd dword [ecx + eax*0x1 + 0x4]\",\n        \"fstp dword [ecx + eax*0x1 + 0x4]\",\n        \"lea eax,[ecx + eax*0x1 + 0x8]\",\n        \"fld dword [esp + 0x44]\",\n        \"fadd dword [eax]\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [esp + 0x1e0]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x50]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x30]\",\n        \"fmul dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [ecx + eax*0x1]\",\n        \"fadd dword [esp + 0x2c]\",\n        \"fstp dword [ecx + eax*0x1]\",\n        \"fld dword [esp + 0x30]\",\n        \"fadd dword [ecx + eax*0x1 + 0x4]\",\n        \"fstp dword [ecx + eax*0x1 + 0x4]\",\n        \"lea ecx,[ecx + eax*0x1 + 0x8]\",\n        \"fld dword [esp + 0x34]\",\n        \"fadd dword [ecx]\",\n        \"fstp dword [ecx]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add w20, w10, w5, lsl #3\",\n        \"ldrh w4, [x20]\",\n        \"add w20, w10, w5, lsl #3\",\n        \"ldr s2, [x20, #4]\",\n        \"str s2, [x8, #36]\",\n        \"ldr w10, [x8, #456]\",\n        \"ldr s2, [x8, #156]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"uxth w4, w4\",\n        \"mov x7, x4\",\n        \"ldr w20, [x8, #484]\",\n        \"mul w7, w7, w20\",\n        \"add w4, w4, w4, lsl #1\",\n        \"add w4, w4, w4\",\n        \"add w4, w4, w4\",\n        \"add w20, w4, #0x8 (8)\",\n        \"add w11, w20, w10\",\n        \"str w11, [x8, #16]\",\n        \"add w20, w4, w10\",\n        \"ldr s3, [x20, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #152]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"add w20, w4, w10\",\n        \"ldr s4, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #160]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x11]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #208]\",\n        \"ldr s2, [x8, #168]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w4, w10\",\n        \"ldr s3, [x20, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #164]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"add w20, w4, w10\",\n        \"ldr s4, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #172]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x11]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #140]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #212]\",\n        \"ldr s2, [x8, #180]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w4, w10\",\n        \"ldr s3, [x20, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #176]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"add w20, w4, w10\",\n        \"ldr s4, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"mov x10, x11\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #184]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x10]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w10, [x8, #56]\",\n        \"add w20, w10, #0x8 (8)\",\n        \"add w11, w20, w4\",\n        \"str w11, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #144]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #216]\",\n        \"ldr s2, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w4, w6\",\n        \"ldr s3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w20, w4, w6\",\n        \"ldr s5, [x20, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s5, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add w20, w4, w6\",\n        \"ldr s6, [x20, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #232]\",\n        \"ldr s3, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"add w20, w4, w6\",\n        \"ldr s6, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w20, w4, w6\",\n        \"ldr s8, [x20, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s8, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"add w20, w4, w6\",\n        \"ldr s9, [x20, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #236]\",\n        \"ldr s6, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w20, w4, w6\",\n        \"ldr s8, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s8, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"add w20, w4, w6\",\n        \"ldr s9, [x20, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s8, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"add w20, w4, w6\",\n        \"ldr s9, [x20, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #240]\",\n        \"add w20, w10, w4\",\n        \"ldr s6, [x20, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w20, w10, w4\",\n        \"ldr s8, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s8, [x11]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #88]\",\n        \"add w20, w10, w4\",\n        \"ldr s6, [x20, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w20, w10, w4\",\n        \"ldr s8, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s8, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x11]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #92]\",\n        \"ldr s6, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w20, w10, w4\",\n        \"ldr s8, [x20, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s8, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"add w20, w10, w4\",\n        \"ldr s9, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"mov x10, x11\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s8, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x10]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr w10, [x8, #32]\",\n        \"add w20, w10, #0x4 (4)\",\n        \"add w11, w20, w4\",\n        \"str w11, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w20, w10, #0x8 (8)\",\n        \"add w11, w20, w4\",\n        \"str w11, [x8, #188]\",\n        \"ldr w11, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #96]\",\n        \"add w20, w10, w4\",\n        \"ldr s6, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s6, [x11]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w11, [x8, #188]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s4, [x11]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w11, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #76]\",\n        \"add w20, w10, w4\",\n        \"ldr s2, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x11]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w11, [x8, #188]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x11]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #80]\",\n        \"ldr s2, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w10, w4\",\n        \"ldr s3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x8, #16]\",\n        \"ldr s3, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x8, #468]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x11]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #84]\",\n        \"ldr s2, [x8, #208]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #192]\",\n        \"ldr s2, [x8, #212]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #196]\",\n        \"ldr s2, [x8, #216]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #200]\",\n        \"ldr s2, [x8, #192]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w4\",\n        \"ldr s4, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x20]\",\n        \"add w5, w5, #0x1 (1)\",\n        \"ldr w20, [x8, #28]\",\n        \"eor x27, x5, x20\",\n        \"subs w26, w5, w20\",\n        \"ldr s2, [x8, #196]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w4\",\n        \"ldr s4, [x20, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x20, #4]\",\n        \"add w20, w7, #0x8 (8)\",\n        \"add w4, w20, w4\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s4, [x8, #200]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x8, #476]\",\n        \"ldr s2, [x8, #232]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #220]\",\n        \"ldr s2, [x8, #236]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #224]\",\n        \"ldr s2, [x8, #240]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #228]\",\n        \"ldr s2, [x8, #220]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w9\",\n        \"ldr s4, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w9\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x20]\",\n        \"ldr s2, [x8, #224]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w9\",\n        \"ldr s4, [x20, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w9\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x20, #4]\",\n        \"ldr s2, [x8, #228]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w9\",\n        \"ldr s4, [x20, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w9\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x20, #8]\",\n        \"ldr s2, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #64]\",\n        \"ldr s2, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #68]\",\n        \"add w20, w7, w4\",\n        \"ldr s2, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s4, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x20]\",\n        \"ldr s2, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w4\",\n        \"ldr s4, [x20, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x20, #4]\",\n        \"add w20, w7, #0x8 (8)\",\n        \"add w4, w20, w4\",\n        \"ldr s2, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s4, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x8, #480]\",\n        \"ldr s2, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #52]\",\n        \"add w20, w7, w4\",\n        \"ldr s2, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x20]\",\n        \"ldr s2, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w4\",\n        \"ldr s3, [x20, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w7, w4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x20, #4]\",\n        \"add w20, w7, #0x8 (8)\",\n        \"add w7, w20, w4\",\n        \"ldr s2, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x7]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xfefe\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block9\": {\n      \"x86InstructionCount\": 260,\n      \"ExpectedInstructionCount\": 80,\n      \"x86Insts\": [\n        \"fld dword [edi]\",\n        \"fmul st0\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd qword [0x00a2f928]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"call 0x00982c30\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"lea ecx,[esp + 0x10]\",\n        \"fld1\",\n        \"push ecx\",\n        \"fdivrp\",\n        \"lea edx,[esp + 0x50]\",\n        \"push edx\",\n        \"lea ecx,[esp + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [edi]\",\n        \"fchs\",\n        \"fld dword [esp + 0x10]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0x40]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x70]\",\n        \"fmul dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x30]\",\n        \"fld dword [esp + 0x10]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x64]\",\n        \"fmul dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [esp + 0x6c]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x64]\",\n        \"fadd dword [esp + 0x70]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esp + 0x68]\",\n        \"fadd dword [esp + 0x74]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"call 0x00716e00\",\n        \"mov ecx,dword [eax]\",\n        \"mov dword [esi + 0x20],ecx\",\n        \"mov edx,dword [eax + 0x4]\",\n        \"mov dword [esi + 0x24],edx\",\n        \"mov ecx,dword [eax + 0x8]\",\n        \"mov dword [esi + 0x28],ecx\",\n        \"mov edx,dword [eax + 0xc]\",\n        \"mov dword [esi + 0x2c],edx\",\n        \"fld dword [edi + 0x4]\",\n        \"fmul st0\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd qword [0x00a2f928]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"call 0x00982c30\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"fld1\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [edi + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x8]\",\n        \"fchs\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0x34]\",\n        \"fld dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fmul dword [esp + 0x3c]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x68]\",\n        \"fmul dword [esp + 0x30]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0x64]\",\n        \"fadd dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x74]\",\n        \"mov eax,dword [esp + 0x74]\",\n        \"fld dword [esp + 0x68]\",\n        \"mov dword [esp + 0x4c],eax\",\n        \"fadd dword [esp + 0x5c]\",\n        \"lea eax,[esp + 0x10]\",\n        \"push eax\",\n        \"fstp dword [esp + 0x7c]\",\n        \"mov ecx,dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x70]\",\n        \"mov dword [esp + 0x54],ecx\",\n        \"fadd dword [esp + 0x64]\",\n        \"lea ecx,[esp + 0x50]\",\n        \"push ecx\",\n        \"lea ecx,[esp + 0x7c]\",\n        \"fstp dword [esp + 0x84]\",\n        \"mov edx,dword [esp + 0x84]\",\n        \"mov dword [esp + 0x5c],edx\",\n        \"call 0x00716e00\",\n        \"mov edx,dword [eax]\",\n        \"mov dword [esi + 0x30],edx\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov dword [esi + 0x34],ecx\",\n        \"mov edx,dword [eax + 0x8]\",\n        \"mov dword [esi + 0x38],edx\",\n        \"mov eax,dword [eax + 0xc]\",\n        \"mov dword [esi + 0x3c],eax\",\n        \"fld dword [edi + 0x8]\",\n        \"fmul st0\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd qword [0x00a2f928]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"call 0x00982c30\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"fld1\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fmul dword [edi + 0x8]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fchs\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0x40]\",\n        \"fld dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x44]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x68]\",\n        \"fmul dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x78]\",\n        \"fmul dword [esp + 0x30]\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x74]\",\n        \"fadd dword [esp + 0x64]\",\n        \"fstp dword [esp + 0x58]\",\n        \"mov ecx,dword [esp + 0x58]\",\n        \"fld dword [esp + 0x78]\",\n        \"mov dword [esp + 0x4c],ecx\",\n        \"fadd dword [esp + 0x68]\",\n        \"lea ecx,[esp + 0x10]\",\n        \"push ecx\",\n        \"lea ecx,[esp + 0x78]\",\n        \"fstp dword [esp + 0x60]\",\n        \"mov edx,dword [esp + 0x60]\",\n        \"fld dword [esp + 0x80]\",\n        \"mov dword [esp + 0x54],edx\",\n        \"fadd dword [esp + 0x70]\",\n        \"lea edx,[esp + 0x50]\",\n        \"push edx\",\n        \"fstp dword [esp + 0x68]\",\n        \"mov eax,dword [esp + 0x68]\",\n        \"mov dword [esp + 0x5c],eax\",\n        \"call 0x00716e00\",\n        \"mov ecx,dword [eax]\",\n        \"mov dword [esi + 0x40],ecx\",\n        \"mov edx,dword [eax + 0x4]\",\n        \"mov dword [esi + 0x44],edx\",\n        \"mov ecx,dword [eax + 0x8]\",\n        \"mov dword [esi + 0x48],ecx\",\n        \"mov edx,dword [eax + 0xc]\",\n        \"mov dword [esi + 0x4c],edx\",\n        \"fld dword [edi + 0xc]\",\n        \"fmul st0\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd qword [0x00a2f928]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"call 0x00982c30\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"fld1\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [edi + 0xc]\",\n        \"fchs\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x40]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x44]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x68]\",\n        \"fmul dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x78]\",\n        \"fmul dword [esp + 0x30]\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x74]\",\n        \"fadd dword [esp + 0x64]\",\n        \"fstp dword [esp + 0x58]\",\n        \"mov eax,dword [esp + 0x58]\",\n        \"fld dword [esp + 0x78]\",\n        \"mov dword [esp + 0x4c],eax\",\n        \"fadd dword [esp + 0x68]\",\n        \"lea eax,[esp + 0x10]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"mov ecx,dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x7c]\",\n        \"mov dword [esp + 0x50],ecx\",\n        \"fadd dword [esp + 0x6c]\",\n        \"lea ecx,[esp + 0x4c]\",\n        \"fstp dword [esp + 0x60]\",\n        \"mov edx,dword [esp + 0x60]\",\n        \"mov dword [esp + 0x54],edx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x11]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0xf928\",\n        \"movk w20, #0xa2, lsl #16\",\n        \"ldr d3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0x1f\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add w21, w21, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    },\n    \"Block10\": {\n      \"x86InstructionCount\": 206,\n      \"ExpectedInstructionCount\": 183,\n      \"x86Insts\": [\n        \"fld dword [0x00b42a74]\",\n        \"push ecx\",\n        \"fstp dword [0x00b42a20]\",\n        \"lea ecx,[esp + 0x48]\",\n        \"fld dword [0x00b42a78]\",\n        \"fstp dword [0x00b42a24]\",\n        \"fld dword [0x00b42a7c]\",\n        \"fstp dword [0x00b42a28]\",\n        \"fld dword [0x00b42a68]\",\n        \"fstp dword [0x00b42a2c]\",\n        \"fld dword [0x00b42a6c]\",\n        \"fstp dword [0x00b42a30]\",\n        \"fld dword [0x00b42a70]\",\n        \"fstp dword [0x00b42a34]\",\n        \"fld dword [0x00b42a5c]\",\n        \"fstp dword [0x00b42a38]\",\n        \"fld dword [0x00b42a60]\",\n        \"fstp dword [0x00b42a3c]\",\n        \"fld dword [0x00b42a64]\",\n        \"fstp dword [0x00b42a40]\",\n        \"fld dword [0x00b42a50]\",\n        \"fstp dword [0x00b42a44]\",\n        \"fld dword [0x00b42a54]\",\n        \"fstp dword [0x00b42a48]\",\n        \"fld dword [0x00b42a58]\",\n        \"fstp dword [0x00b42a4c]\",\n        \"fst dword [esp + 0x48]\",\n        \"fst dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fst dword [esp + 0x4c]\",\n        \"fst dword [esp + 0x50]\",\n        \"fst dword [esp + 0x54]\",\n        \"fst dword [esp + 0x5c]\",\n        \"fst dword [esp + 0x60]\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x4]\",\n        \"fstp dword [esp]\",\n        \"call 0x00793aa0\",\n        \"fld dword [esp + 0x50]\",\n        \"fld dword [0x00b42a78]\",\n        \"fst qword [esp + 0x28]\",\n        \"fld dword [0x00b42a74]\",\n        \"fst qword [esp + 0x30]\",\n        \"fld dword [esp + 0x44]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fld dword [0x00b42a7c]\",\n        \"fst qword [esp + 0x10]\",\n        \"fld st2\",\n        \"fmul st4\",\n        \"fld st6\",\n        \"fmul st6\",\n        \"faddp\",\n        \"fld st2\",\n        \"fmulp st2\",\n        \"faddp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x54]\",\n        \"fld dword [esp + 0x48]\",\n        \"fld dword [esp + 0x60]\",\n        \"fstp qword [esp]\",\n        \"fld st0\",\n        \"fmulp st5\",\n        \"fld st1\",\n        \"fmulp st6\",\n        \"fxch st4\",\n        \"faddp st5,st0\",\n        \"fld qword [esp]\",\n        \"fmul qword [esp + 0x10]\",\n        \"faddp st5,st0\",\n        \"fxch st4\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x58]\",\n        \"fst qword [esp + 0x20]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fst qword [esp + 0x18]\",\n        \"fld dword [esp + 0x64]\",\n        \"fstp qword [esp + 0x8]\",\n        \"fmul qword [esp + 0x30]\",\n        \"fxch\",\n        \"fmul qword [esp + 0x28]\",\n        \"faddp\",\n        \"fld qword [esp + 0x8]\",\n        \"mov eax,dword [esp + 0x38]\",\n        \"fmul qword [esp + 0x10]\",\n        \"mov ecx,dword [esp + 0x3c]\",\n        \"mov [0x00b2ba7c],eax\",\n        \"mov dword [0x00b2ba80],ecx\",\n        \"faddp\",\n        \"fstp dword [esp + 0x40]\",\n        \"mov edx,dword [esp + 0x40]\",\n        \"fld dword [0x00b42a6c]\",\n        \"mov dword [0x00b2ba84],edx\",\n        \"fst qword [esp + 0x30]\",\n        \"fld dword [0x00b42a68]\",\n        \"fst qword [esp + 0x28]\",\n        \"fld dword [0x00b42a70]\",\n        \"fstp qword [esp + 0x10]\",\n        \"fmul st3\",\n        \"fld st6\",\n        \"fmulp st2\",\n        \"faddp\",\n        \"fld st1\",\n        \"fmul qword [esp + 0x10]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x38]\",\n        \"mov eax,dword [esp + 0x38]\",\n        \"fld st2\",\n        \"mov [0x00b2ba88],eax\",\n        \"fmul qword [esp + 0x28]\",\n        \"fld st4\",\n        \"fmul qword [esp + 0x30]\",\n        \"faddp\",\n        \"fld qword [esp]\",\n        \"fmul qword [esp + 0x10]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x3c]\",\n        \"mov ecx,dword [esp + 0x3c]\",\n        \"fld qword [esp + 0x18]\",\n        \"mov dword [0x00b2ba8c],ecx\",\n        \"fmul qword [esp + 0x28]\",\n        \"fld qword [esp + 0x20]\",\n        \"fmul qword [esp + 0x30]\",\n        \"faddp\",\n        \"fld qword [esp + 0x8]\",\n        \"fmul qword [esp + 0x10]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x40]\",\n        \"mov edx,dword [esp + 0x40]\",\n        \"fld dword [0x00b42a60]\",\n        \"mov dword [0x00b2ba90],edx\",\n        \"fst qword [esp + 0x28]\",\n        \"fld dword [0x00b42a5c]\",\n        \"fst qword [esp + 0x30]\",\n        \"fld dword [0x00b42a64]\",\n        \"fstp qword [esp + 0x10]\",\n        \"fmul st3\",\n        \"fld st6\",\n        \"fmulp st2\",\n        \"faddp\",\n        \"fld st1\",\n        \"fmul qword [esp + 0x10]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x38]\",\n        \"mov eax,dword [esp + 0x38]\",\n        \"fld st2\",\n        \"fmul qword [esp + 0x30]\",\n        \"fld st4\",\n        \"fmul qword [esp + 0x28]\",\n        \"faddp\",\n        \"fld qword [esp]\",\n        \"fmul qword [esp + 0x10]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld qword [esp + 0x18]\",\n        \"fmul qword [esp + 0x30]\",\n        \"fld qword [esp + 0x20]\",\n        \"fmul qword [esp + 0x28]\",\n        \"faddp\",\n        \"fld qword [esp + 0x8]\",\n        \"fmul qword [esp + 0x10]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [0x00b42a54]\",\n        \"mov ecx,dword [esp + 0x3c]\",\n        \"fld dword [0x00b42a50]\",\n        \"mov edx,dword [esp + 0x40]\",\n        \"fld dword [0x00b42a58]\",\n        \"mov [0x00b2ba94],eax\",\n        \"fxch st4\",\n        \"mov dword [0x00b2ba98],ecx\",\n        \"fmul st1\",\n        \"mov dword [0x00b2ba9c],edx\",\n        \"fxch st7\",\n        \"fmul st2\",\n        \"faddp st7,st0\",\n        \"fxch st2\",\n        \"fmul st3\",\n        \"faddp st6,st0\",\n        \"fxch st5\",\n        \"fstp dword [esp + 0x38]\",\n        \"mov eax,dword [esp + 0x38]\",\n        \"mov [0x00b2baa0],eax\",\n        \"fmul st2\",\n        \"fxch st3\",\n        \"fmul st4\",\n        \"faddp st2,st0\",\n        \"fld qword [esp]\",\n        \"fmul st1\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x3c]\",\n        \"mov ecx,dword [esp + 0x3c]\",\n        \"fld qword [esp + 0x18]\",\n        \"mov dword [0x00b2baa4],ecx\",\n        \"fmulp st2\",\n        \"fld qword [esp + 0x20]\",\n        \"fmulp st3\",\n        \"fxch\",\n        \"faddp st2,st0\",\n        \"fmul qword [esp + 0x8]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x40]\",\n        \"mov edx,dword [esp + 0x40]\",\n        \"mov dword [0x00b2baa8],edx\",\n        \"mov esp,ebp\",\n        \"pop ebp\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x2a74\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"str w7, [x8, #-4]!\",\n        \"mov w20, #0x2a20\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"add w7, w8, #0x48 (72)\",\n        \"mov w20, #0x2a78\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a24\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a7c\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a28\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a68\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a2c\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a6c\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a30\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a70\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a34\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a5c\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a38\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a60\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a3c\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a64\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a40\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a50\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a44\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a54\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a48\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a58\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a4c\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #104]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #100]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldr s2, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8]\",\n        \"mov w22, #0xc5\",\n        \"movk w22, #0x1, lsl #16\",\n        \"str w22, [x8, #-4]!\",\n        \"strb w20, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w23, #0x8\",\n        \"sub w20, w23, w20\",\n        \"mov w23, #0xe0e0\",\n        \"lsr w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/x87-Psychonauts.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"Block1\": {\n      \"x86InstructionCount\": 520,\n      \"ExpectedInstructionCount\": 4570,\n      \"x86Insts\": [\n        \"sub esp,0x88\",\n        \"fld dword [ecx + 0x4]\",\n        \"mov edx,dword [ecx + 0x18]\",\n        \"fld dword [ecx + 0x10]\",\n        \"mov dword [esp + 0x14],edx\",\n        \"fld dword [ecx + 0x14]\",\n        \"mov edx,dword [ecx + 0x1c]\",\n        \"fld dword [ecx + 0x20]\",\n        \"mov dword [esp + 0x10],edx\",\n        \"fld dword [ecx + 0x24]\",\n        \"fld dword [eax]\",\n        \"fsub dword [eax + 0x44]\",\n        \"fld dword [eax + 0x40]\",\n        \"fadd dword [eax + 0x4]\",\n        \"fld dword [eax + 0x20]\",\n        \"fsub dword [eax + 0x64]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x24]\",\n        \"fadd dword [eax + 0x60]\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp]\",\n        \"fmul st7\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fmul st7\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x80]\",\n        \"fld dword [esp]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x78]\",\n        \"fxch\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [eax + 0x44]\",\n        \"fadd dword [eax]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsub dword [eax + 0x40]\",\n        \"fld dword [eax + 0x64]\",\n        \"fadd dword [eax + 0x20]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x24]\",\n        \"fsub dword [eax + 0x60]\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp]\",\n        \"fmul st7\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fmul st7\",\n        \"fstp dword [esp]\",\n        \"fld st1\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x64]\",\n        \"fstp st0\",\n        \"fld dword [eax + 0x8]\",\n        \"fsub dword [eax + 0x4c]\",\n        \"fld dword [eax + 0xc]\",\n        \"fadd dword [eax + 0x48]\",\n        \"fstp dword [esp]\",\n        \"fld st0\",\n        \"fmul st5\",\n        \"fld dword [esp]\",\n        \"fmul st5\",\n        \"fsubp\",\n        \"fstp dword [esp + 0xc]\",\n        \"fmul st3\",\n        \"fld dword [esp]\",\n        \"fmul st5\",\n        \"faddp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x28]\",\n        \"fsub dword [eax + 0x6c]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fadd dword [eax + 0x68]\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x10]\",\n        \"fmul st1\",\n        \"fld dword [esp]\",\n        \"fmul dword [esp + 0x14]\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp]\",\n        \"fmul dword [esp + 0x10]\",\n        \"fxch\",\n        \"fmul dword [esp + 0x14]\",\n        \"faddp\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [eax + 0x4c]\",\n        \"fadd dword [eax + 0x8]\",\n        \"fld dword [eax + 0xc]\",\n        \"fsub dword [eax + 0x48]\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x14]\",\n        \"fmul st1\",\n        \"fld dword [esp]\",\n        \"fmul dword [esp + 0x10]\",\n        \"fsubp\",\n        \"fstp dword [esp + 0xc]\",\n        \"fmul dword [esp + 0x10]\",\n        \"fld dword [esp]\",\n        \"fmul dword [esp + 0x14]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x6c]\",\n        \"fadd dword [eax + 0x28]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fsub dword [eax + 0x68]\",\n        \"fst dword [esp]\",\n        \"fmul st4\",\n        \"fld st1\",\n        \"fmul st6\",\n        \"faddp\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp]\",\n        \"fmul st5\",\n        \"fxch\",\n        \"fmul st4\",\n        \"fsubp\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x84]\",\n        \"fld dword [eax + 0x10]\",\n        \"fsub dword [eax + 0x54]\",\n        \"fld dword [eax + 0x14]\",\n        \"fadd dword [eax + 0x50]\",\n        \"fstp dword [esp]\",\n        \"fld st0\",\n        \"fmul st3\",\n        \"fld dword [esp]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [esp + 0xc]\",\n        \"fmul st1\",\n        \"fld dword [esp]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x30]\",\n        \"fsub dword [eax + 0x74]\",\n        \"fld dword [eax + 0x34]\",\n        \"fadd dword [eax + 0x70]\",\n        \"fstp dword [esp]\",\n        \"fld st0\",\n        \"fmul st2\",\n        \"fld dword [esp]\",\n        \"fmul st4\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp]\",\n        \"fmul st2\",\n        \"fxch\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [eax + 0x54]\",\n        \"fadd dword [eax + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"fsub dword [eax + 0x50]\",\n        \"fstp dword [esp]\",\n        \"fld st0\",\n        \"fmul st2\",\n        \"fld dword [esp]\",\n        \"fmul st4\",\n        \"fsubp\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp]\",\n        \"fmul st2\",\n        \"fxch\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x74]\",\n        \"fadd dword [eax + 0x30]\",\n        \"fld dword [eax + 0x34]\",\n        \"fsub dword [eax + 0x70]\",\n        \"fstp dword [esp]\",\n        \"fld st0\",\n        \"fmul st3\",\n        \"fld dword [esp]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x4]\",\n        \"fmul st1\",\n        \"fld dword [esp]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [esp]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [eax + 0x18]\",\n        \"fsub dword [eax + 0x5c]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fadd dword [eax + 0x58]\",\n        \"fld st1\",\n        \"fmul dword [esp + 0x14]\",\n        \"fld st1\",\n        \"fmul dword [esp + 0x10]\",\n        \"fsubp\",\n        \"fstp dword [esp + 0xc]\",\n        \"fxch\",\n        \"fmul dword [esp + 0x10]\",\n        \"fxch\",\n        \"fmul dword [esp + 0x14]\",\n        \"faddp\",\n        \"fld dword [eax + 0x38]\",\n        \"fsub dword [eax + 0x7c]\",\n        \"fld dword [eax + 0x78]\",\n        \"fadd dword [eax + 0x3c]\",\n        \"fld st1\",\n        \"fmul st4\",\n        \"fld st1\",\n        \"fmul st6\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x4]\",\n        \"fmul st3\",\n        \"fxch\",\n        \"fmul st4\",\n        \"faddp\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [eax + 0x5c]\",\n        \"fadd dword [eax + 0x18]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fsub dword [eax + 0x58]\",\n        \"fld st1\",\n        \"fmul st3\",\n        \"fld st1\",\n        \"fmul st5\",\n        \"faddp\",\n        \"fstp dword [esp + 0xc]\",\n        \"fmul st2\",\n        \"fxch\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp st2\",\n        \"fstp st0\",\n        \"fld dword [eax + 0x7c]\",\n        \"fadd dword [eax + 0x38]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fsub dword [eax + 0x78]\",\n        \"fld st1\",\n        \"fmul dword [esp + 0x10]\",\n        \"fld st1\",\n        \"fmul dword [esp + 0x14]\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x4]\",\n        \"fmul dword [esp + 0x10]\",\n        \"fxch\",\n        \"fmul dword [esp + 0x14]\",\n        \"faddp\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fsubp\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x80]\",\n        \"fld dword [esp + 0x28]\",\n        \"fadd dword [esp + 0x78]\",\n        \"fld dword [esp + 0x8]\",\n        \"fadd dword [esp + 0x58]\",\n        \"fld dword [esp + 0x70]\",\n        \"fadd dword [esp + 0x30]\",\n        \"fstp dword [esp]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax]\",\n        \"fld dword [esp]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + 0x8]\",\n        \"fstp st1\",\n        \"fsub dword [esp]\",\n        \"fstp dword [eax + 0xc]\",\n        \"fld dword [esp + 0x80]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x78]\",\n        \"fsub dword [esp + 0x28]\",\n        \"fld dword [esp + 0x58]\",\n        \"fsub dword [esp + 0x8]\",\n        \"fld dword [esp + 0x30]\",\n        \"fsub dword [esp + 0x70]\",\n        \"fld st3\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x10]\",\n        \"fld st1\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x14]\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x18]\",\n        \"fxch\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x1c]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x60]\",\n        \"fsub dword [esp + 0x38]\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x40]\",\n        \"fld dword [esp + 0x68]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fadd dword [esp + 0x50]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul st6\",\n        \"fstp dword [esp + 0x4]\",\n        \"faddp\",\n        \"fmul st4\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x20]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x24]\",\n        \"fxch st2\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x28]\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x2c]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x38]\",\n        \"fadd dword [esp + 0x60]\",\n        \"fld dword [esp + 0x40]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd dword [esp + 0x68]\",\n        \"fld dword [esp + 0x50]\",\n        \"fsub dword [esp + 0x1c]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul st6\",\n        \"fstp dword [esp + 0x4]\",\n        \"faddp\",\n        \"fmul st4\",\n        \"fld st2\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x30]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x34]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x38]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x3c]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x24]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fadd dword [esp + 0x34]\",\n        \"fld dword [esp + 0x44]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [esp]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x40]\",\n        \"fld dword [esp]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x44]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + 0x48]\",\n        \"fstp st1\",\n        \"fsub dword [esp]\",\n        \"fstp dword [eax + 0x4c]\",\n        \"fld dword [esp + 0x24]\",\n        \"fsub dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x34]\",\n        \"fsub dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x4c]\",\n        \"fld st3\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x50]\",\n        \"fld st1\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x54]\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x58]\",\n        \"fxch\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x5c]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x5c]\",\n        \"fsub dword [esp + 0x54]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fadd dword [esp + 0x64]\",\n        \"fld st2\",\n        \"fadd dword [esp + 0x74]\",\n        \"fld dword [esp + 0x84]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul st6\",\n        \"fstp dword [esp + 0x4]\",\n        \"faddp\",\n        \"fmul st4\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x60]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x64]\",\n        \"fxch st2\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x68]\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x6c]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x54]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0x64]\",\n        \"fsub dword [esp + 0x6c]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fsubr dword [esp + 0x74]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fadd dword [esp + 0x84]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul st3\",\n        \"fstp dword [esp + 0x4]\",\n        \"fadd st0,st1\",\n        \"fmulp st2\",\n        \"fstp st0\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x70]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [eax + 0x74]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [eax + 0x78]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x7c]\",\n        \"add esp,0x88\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub w8, w8, #0x88 (136)\",\n        \"ldr s2, [x7, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x7, #24]\",\n        \"ldr s3, [x7, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str w5, [x8, #20]\",\n        \"ldr s4, [x7, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w5, [x7, #28]\",\n        \"ldr s5, [x7, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str w5, [x8, #16]\",\n        \"ldr s6, [x7, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr s10, [x4, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s10\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #8]\",\n        \"ldr s9, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr s10, [x4, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s10\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8]\",\n        \"ldr s9, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr s10, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s10\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #4]\",\n        \"ldr s9, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr s10, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s10\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8]\",\n        \"ldr s9, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #128]\",\n        \"ldr s9, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #120]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s9, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #96]\",\n        \"ldr s7, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #64]\",\n        \"ldr s7, [x4, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr s10, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s10\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #8]\",\n        \"ldr s9, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr s10, [x4, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s10\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8]\",\n        \"ldr s9, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr s10, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s10\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #4]\",\n        \"ldr s9, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr s10, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s10\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8]\",\n        \"ldr s9, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #36]\",\n        \"ldr s9, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8, #52]\",\n        \"ldr s9, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #92]\",\n        \"ldr s7, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #100]\",\n        \"ldr s7, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr s10, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s10\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s9, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8]\",\n        \"ldr s7, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #88]\",\n        \"ldr s7, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #48]\",\n        \"ldr s7, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #104]\",\n        \"ldr s7, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #80]\",\n        \"ldr s7, [x4, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8]\",\n        \"ldr s8, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"ldr s10, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s10\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v10.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v10.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #12]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s9, s0\",\n        \"str s9, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8]\",\n        \"ldr s7, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #68]\",\n        \"ldr s7, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #76]\",\n        \"ldr s7, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #116]\",\n        \"ldr s7, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #132]\",\n        \"ldr s7, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8]\",\n        \"ldr s7, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #32]\",\n        \"ldr s7, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #40]\",\n        \"ldr s7, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #24]\",\n        \"ldr s7, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #56]\",\n        \"ldr s7, [x4, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #12]\",\n        \"ldr s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v9.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8]\",\n        \"ldr s5, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #44]\",\n        \"ldr s5, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #60]\",\n        \"ldr s5, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #108]\",\n        \"ldr s5, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #84]\",\n        \"ldr s5, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x4, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #12]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s7, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s7, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x4, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x4, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8]\",\n        \"ldr s6, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #8]\",\n        \"ldr s6, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #112]\",\n        \"ldr s6, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #28]\",\n        \"ldr s6, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #72]\",\n        \"ldr s5, [x4, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x4, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x4, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #4]\",\n        \"ldr s6, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s6, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #16]\",\n        \"ldr s5, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x4]\",\n        \"ldr s7, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x4, #4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #8]\",\n        \"ldr s4, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #12]\",\n        \"ldr s4, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #24]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #28]\",\n        \"ldr s4, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x4, #36]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s7, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #44]\",\n        \"ldr s4, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x4, #48]\",\n        \"ldr s7, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #56]\",\n        \"ldr s4, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #60]\",\n        \"ldr s4, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x4, #64]\",\n        \"ldr s7, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x4, #68]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #72]\",\n        \"ldr s4, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #76]\",\n        \"ldr s4, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x4, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x4, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #88]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #92]\",\n        \"ldr s4, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x4, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x4, #100]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s7, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #108]\",\n        \"ldr s4, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #12]\",\n        \"ldr s4, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #8]\",\n        \"ldr s4, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #112]\",\n        \"ldr s3, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #116]\",\n        \"ldr s3, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #120]\",\n        \"ldr s2, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #124]\",\n        \"adds w26, w8, #0x88 (136)\",\n        \"cfinv\",\n        \"mov x27, x8\",\n        \"mov x8, x26\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block2\": {\n      \"x86InstructionCount\": 434,\n      \"ExpectedInstructionCount\": 3932,\n      \"x86Insts\": [\n        \"sub esp,0x90\",\n        \"fld dword [ecx + 0x4]\",\n        \"fld st0\",\n        \"fmul dword [ecx + 0x8]\",\n        \"fld st0\",\n        \"fadd dword [ecx + 0x8]\",\n        \"fld dword [eax + 0x40]\",\n        \"fadd dword [eax]\",\n        \"fld dword [eax + 0x44]\",\n        \"fadd dword [eax + 0x4]\",\n        \"fld dword [eax]\",\n        \"fsub dword [eax + 0x40]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsub dword [eax + 0x44]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [eax + 0x20]\",\n        \"fadd dword [eax + 0x60]\",\n        \"fld dword [eax + 0x64]\",\n        \"fadd dword [eax + 0x24]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"fsub dword [eax + 0x60]\",\n        \"fstp dword [esp]\",\n        \"fld dword [eax + 0x24]\",\n        \"fsub dword [eax + 0x64]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x64]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x78]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [eax + 0x8]\",\n        \"fadd dword [eax + 0x48]\",\n        \"fld dword [eax + 0x4c]\",\n        \"fadd dword [eax + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fsub dword [eax + 0x48]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0xc]\",\n        \"fsub dword [eax + 0x4c]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [eax + 0x28]\",\n        \"fadd dword [eax + 0x68]\",\n        \"fld dword [eax + 0x6c]\",\n        \"fadd dword [eax + 0x2c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"fsub dword [eax + 0x68]\",\n        \"fstp dword [esp]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fsub dword [eax + 0x6c]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x84]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [esp + 0x20]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fld st1\",\n        \"fmul st3\",\n        \"fld st1\",\n        \"fmul st5\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x68]\",\n        \"fmul st2\",\n        \"fxch\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [esp + 0x88]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fld st1\",\n        \"fmul st4\",\n        \"fld st1\",\n        \"fmul st4\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x80]\",\n        \"fxch\",\n        \"fmul st2\",\n        \"fxch\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [eax + 0x10]\",\n        \"fadd dword [eax + 0x50]\",\n        \"fld dword [eax + 0x54]\",\n        \"fadd dword [eax + 0x14]\",\n        \"fld dword [eax + 0x10]\",\n        \"fsub dword [eax + 0x50]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x14]\",\n        \"fsub dword [eax + 0x54]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [eax + 0x30]\",\n        \"fadd dword [eax + 0x70]\",\n        \"fld dword [eax + 0x74]\",\n        \"fadd dword [eax + 0x34]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"fsub dword [eax + 0x70]\",\n        \"fstp dword [esp]\",\n        \"fld dword [eax + 0x34]\",\n        \"fsub dword [eax + 0x74]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul st5\",\n        \"fstp dword [esp + 0x38]\",\n        \"fadd st0,st1\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x40]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fmul st5\",\n        \"fstp dword [esp + 0x48]\",\n        \"fsub st0,st1\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x58]\",\n        \"fstp st0\",\n        \"fld dword [eax + 0x58]\",\n        \"fadd dword [eax + 0x18]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fadd dword [eax + 0x5c]\",\n        \"fld dword [eax + 0x18]\",\n        \"fsub dword [eax + 0x58]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fsub dword [eax + 0x5c]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [eax + 0x78]\",\n        \"fadd dword [eax + 0x38]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fadd dword [eax + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"fsub dword [eax + 0x78]\",\n        \"fstp dword [esp]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fsub dword [eax + 0x7c]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x8c]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fld st1\",\n        \"fmul st4\",\n        \"fld st1\",\n        \"fmul st4\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fxch\",\n        \"fmul st2\",\n        \"fxch\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fld st1\",\n        \"fmul st3\",\n        \"fld st1\",\n        \"fmul st5\",\n        \"fsubp\",\n        \"fstp dword [esp]\",\n        \"fmul st2\",\n        \"fxch\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp st2\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x50]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fld dword [esp + 0x28]\",\n        \"fsub dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x58]\",\n        \"fadd dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x80]\",\n        \"fsub dword [esp]\",\n        \"fld dword [esp + 0x30]\",\n        \"fsub st0,st3\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x80]\",\n        \"fstp dword [esp]\",\n        \"fxch st2\",\n        \"fadd dword [esp + 0x30]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fxch\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x60]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x18]\",\n        \"fstp dword [eax + 0x64]\",\n        \"fxch\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x68]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + 0x6c]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fstp dword [eax + 0x70]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x74]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [eax + 0x78]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [eax + 0x7c]\",\n        \"fld dword [esp + 0x38]\",\n        \"fadd dword [esp + 0x60]\",\n        \"fld dword [esp + 0x40]\",\n        \"fadd dword [esp + 0x78]\",\n        \"fld dword [esp + 0x60]\",\n        \"fsub dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x78]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fadd dword [esp + 0x68]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x88]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x68]\",\n        \"fsub dword [esp + 0x1c]\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x88]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x40]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x44]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + 0x48]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + 0x4c]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fstp dword [eax + 0x50]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x54]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [eax + 0x58]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [eax + 0x5c]\",\n        \"fld dword [esp + 0x20]\",\n        \"fsub dword [esp + 0x70]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x24]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"faddp\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x70]\",\n        \"fadd dword [esp + 0x20]\",\n        \"fld dword [esp + 0x24]\",\n        \"fsub dword [esp + 0x2c]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul st4\",\n        \"fstp dword [esp]\",\n        \"fadd st0,st1\",\n        \"fmul st3\",\n        \"fstp dword [esp + 0xc]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x3c]\",\n        \"fsub dword [esp + 0x34]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x34]\",\n        \"fadd dword [esp + 0x3c]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x44]\",\n        \"fsub dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd st0,st1\",\n        \"fstp dword [eax + 0x20]\",\n        \"fld st1\",\n        \"fadd dword [esp + 0x18]\",\n        \"fstp dword [eax + 0x24]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fstp dword [eax + 0x28]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x2c]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fstp dword [eax + 0x30]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x34]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [eax + 0x38]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [eax + 0x3c]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fadd dword [esp + 0x54]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fadd dword [esp + 0x64]\",\n        \"fld dword [esp + 0x54]\",\n        \"fsub dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x64]\",\n        \"fsub dword [esp + 0x6c]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fadd dword [esp + 0x74]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fadd dword [esp + 0x84]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x74]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x84]\",\n        \"fsub dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + 0x8]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + 0xc]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fstp dword [eax + 0x10]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x14]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [eax + 0x18]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [eax + 0x1c]\",\n        \"add esp,0x90\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub w8, w8, #0x90 (144)\",\n        \"ldr s2, [x7, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x7, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x7, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x4, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #4]\",\n        \"ldr s7, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8]\",\n        \"ldr s8, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #84]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #100]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #60]\",\n        \"ldr s5, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #68]\",\n        \"ldr s5, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #96]\",\n        \"ldr s5, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #120]\",\n        \"ldr s5, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #80]\",\n        \"ldr s5, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #40]\",\n        \"ldr s5, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #4]\",\n        \"ldr s7, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8]\",\n        \"ldr s8, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #116]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #132]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #32]\",\n        \"ldr s5, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #36]\",\n        \"ldr s5, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #136]\",\n        \"ldr s5, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #128]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #48]\",\n        \"ldr s5, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #4]\",\n        \"ldr s7, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8]\",\n        \"ldr s8, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #92]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #108]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #76]\",\n        \"ldr s5, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #52]\",\n        \"ldr s5, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #64]\",\n        \"ldr s5, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #88]\",\n        \"ldr s5, [x4, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x4, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #4]\",\n        \"ldr s7, [x4, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr s8, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8]\",\n        \"ldr s8, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr s9, [x4, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #124]\",\n        \"ldr s8, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x8, #140]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #44]\",\n        \"ldr s5, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #112]\",\n        \"ldr s5, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #28]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #20]\",\n        \"ldr s5, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #24]\",\n        \"ldr s5, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #8]\",\n        \"ldr s5, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #4]\",\n        \"ldr s5, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #16]\",\n        \"ldr s6, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #128]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s6, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #12]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #96]\",\n        \"ldr s3, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s6, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #100]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #104]\",\n        \"ldr s3, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #108]\",\n        \"ldr s3, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #112]\",\n        \"ldr s3, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #116]\",\n        \"ldr s3, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #120]\",\n        \"ldr s3, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #124]\",\n        \"ldr s3, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #8]\",\n        \"ldr s5, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #4]\",\n        \"ldr s5, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #16]\",\n        \"ldr s6, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8]\",\n        \"ldr s6, [x8, #136]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x4, #64]\",\n        \"ldr s6, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x4, #68]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #72]\",\n        \"ldr s3, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #76]\",\n        \"ldr s3, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #80]\",\n        \"ldr s3, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #84]\",\n        \"ldr s3, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #88]\",\n        \"ldr s3, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x4, #92]\",\n        \"ldr s3, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s4, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s4, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #24]\",\n        \"ldr s4, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #8]\",\n        \"ldr s4, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #4]\",\n        \"ldr s4, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #32]\",\n        \"ldr s4, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x4, #36]\",\n        \"ldr s4, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #40]\",\n        \"ldr s2, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #44]\",\n        \"ldr s2, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #48]\",\n        \"ldr s2, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #52]\",\n        \"ldr s2, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #56]\",\n        \"ldr s2, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #60]\",\n        \"ldr s2, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #8]\",\n        \"ldr s4, [x8, #100]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #4]\",\n        \"ldr s4, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #140]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #16]\",\n        \"ldr s5, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8]\",\n        \"ldr s5, [x8, #132]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #140]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x4]\",\n        \"ldr s5, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x4, #4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #8]\",\n        \"ldr s2, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #12]\",\n        \"ldr s2, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #16]\",\n        \"ldr s2, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #20]\",\n        \"ldr s2, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #24]\",\n        \"ldr s2, [x8, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4, #28]\",\n        \"mvn w27, w8\",\n        \"adds w26, w8, #0x90 (144)\",\n        \"cfinv\",\n        \"mov x8, x26\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xfefe\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block3\": {\n      \"x86InstructionCount\": 702,\n      \"ExpectedInstructionCount\": 92,\n      \"x86Insts\": [\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"shl eax,0x5\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"mov dword [ebp + -0x7c],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"add eax,0x1\",\n        \"shl eax,0x5\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"mov dword [ebp + -0x78],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"shl eax,0x5\",\n        \"add eax,0x40\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"mov dword [ebp + -0x74],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"shl eax,0x5\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"add eax,0xc\",\n        \"mov dword [ebp + -0x70],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"add eax,0x1\",\n        \"shl eax,0x5\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"add eax,0xc\",\n        \"mov dword [ebp + -0x6c],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"shl eax,0x5\",\n        \"add eax,0x40\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"add eax,0xc\",\n        \"mov dword [ebp + -0x68],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"shl eax,0x5\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"add eax,0x18\",\n        \"mov dword [ebp + -0x64],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"add eax,0x1\",\n        \"shl eax,0x5\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"add eax,0x18\",\n        \"mov dword [ebp + -0x60],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"shl eax,0x5\",\n        \"add eax,0x40\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"add eax,0x18\",\n        \"mov dword [ebp + -0x5c],eax\",\n        \"lea eax,[ebp + 0xffffff04]\",\n        \"mov dword [esp],eax\",\n        \"call 0x0819ba1a\",\n        \"lea eax,[ebp + 0xfffffef8]\",\n        \"mov dword [esp],eax\",\n        \"call 0x0819ba1a\",\n        \"lea eax,[ebp + 0xfffffeec]\",\n        \"mov dword [esp],eax\",\n        \"call 0x0819ba1a\",\n        \"lea eax,[ebp + 0xfffffee0]\",\n        \"mov dword [esp],eax\",\n        \"call 0x0819ba1a\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"mov eax,dword [eax]\",\n        \"mov dword [ebp + 0xfffffe68],eax\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"mov eax,dword [eax + 0x4]\",\n        \"mov dword [ebp + 0xfffffe6c],eax\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"mov eax,dword [eax + 0x8]\",\n        \"mov dword [ebp + 0xfffffe70],eax\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"mov eax,dword [eax]\",\n        \"mov dword [ebp + 0xfffffe20],eax\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"mov eax,dword [eax + 0x4]\",\n        \"mov dword [ebp + 0xfffffe24],eax\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"mov eax,dword [eax + 0x8]\",\n        \"mov dword [ebp + 0xfffffe28],eax\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"mov eax,dword [eax]\",\n        \"mov dword [ebp + 0xfffffe8c],eax\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"mov eax,dword [eax + 0x4]\",\n        \"mov dword [ebp + 0xfffffe90],eax\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"mov eax,dword [eax + 0x8]\",\n        \"mov dword [ebp + 0xfffffe94],eax\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff04]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff08]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff0c]\",\n        \"mov eax,dword [ebp + 0xffffff04]\",\n        \"mov dword [ebp + 0xfffffeec],eax\",\n        \"mov eax,dword [ebp + 0xffffff08]\",\n        \"mov dword [ebp + 0xfffffef0],eax\",\n        \"mov eax,dword [ebp + 0xffffff0c]\",\n        \"mov dword [ebp + 0xfffffef4],eax\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x80]\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffeec]\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffef0]\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax]\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe44]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe48]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe4c]\",\n        \"mov eax,dword [ebp + 0xffffff04]\",\n        \"mov dword [ebp + 0xfffffee0],eax\",\n        \"mov eax,dword [ebp + 0xffffff08]\",\n        \"mov dword [ebp + 0xfffffee4],eax\",\n        \"mov eax,dword [ebp + 0xffffff0c]\",\n        \"mov dword [ebp + 0xfffffee8],eax\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x80]\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee0]\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee4]\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax]\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe2c]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe30]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe34]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff04]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff08]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x8]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff0c]\",\n        \"mov eax,dword [ebp + 0xffffff04]\",\n        \"mov dword [ebp + 0xfffffeec],eax\",\n        \"mov eax,dword [ebp + 0xffffff08]\",\n        \"mov dword [ebp + 0xfffffef0],eax\",\n        \"mov eax,dword [ebp + 0xffffff0c]\",\n        \"mov dword [ebp + 0xfffffef4],eax\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x80]\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffeec]\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffef0]\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax]\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe38]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe3c]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe40]\",\n        \"mov eax,dword [ebp + 0xffffff04]\",\n        \"mov dword [ebp + 0xfffffee0],eax\",\n        \"mov eax,dword [ebp + 0xffffff08]\",\n        \"mov dword [ebp + 0xfffffee4],eax\",\n        \"mov eax,dword [ebp + 0xffffff0c]\",\n        \"mov dword [ebp + 0xfffffee8],eax\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x80]\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee0]\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee4]\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax]\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe5c]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe60]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe64]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff04]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff08]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff0c]\",\n        \"mov eax,dword [ebp + 0xffffff04]\",\n        \"mov dword [ebp + 0xfffffeec],eax\",\n        \"mov eax,dword [ebp + 0xffffff08]\",\n        \"mov dword [ebp + 0xfffffef0],eax\",\n        \"mov eax,dword [ebp + 0xffffff0c]\",\n        \"mov dword [ebp + 0xfffffef4],eax\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x80]\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffeec]\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffef0]\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax]\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe74]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe78]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe7c]\",\n        \"mov eax,dword [ebp + 0xffffff04]\",\n        \"mov dword [ebp + 0xfffffee0],eax\",\n        \"mov eax,dword [ebp + 0xffffff08]\",\n        \"mov dword [ebp + 0xfffffee4],eax\",\n        \"mov eax,dword [ebp + 0xffffff0c]\",\n        \"mov dword [ebp + 0xfffffee8],eax\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x80]\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee0]\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee4]\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax]\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe80]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe84]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe88]\",\n        \"fld dword [ebp + 0xfffffe2c]\",\n        \"fld dword [ebp + 0xfffffe44]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe38]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe5c]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe74]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe80]\",\n        \"faddp\",\n        \"fld dword [0x085cefe4]\",\n        \"fdivp\",\n        \"fstp dword [ebp + 0xfffffe50]\",\n        \"fld dword [ebp + 0xfffffe30]\",\n        \"fld dword [ebp + 0xfffffe48]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe3c]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe60]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe78]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe84]\",\n        \"faddp\",\n        \"fld dword [0x085cefe4]\",\n        \"fdivp\",\n        \"fstp dword [ebp + 0xfffffe54]\",\n        \"fld dword [ebp + 0xfffffe34]\",\n        \"fld dword [ebp + 0xfffffe4c]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe40]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe64]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe7c]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe88]\",\n        \"faddp\",\n        \"fld dword [0x085cefe4]\",\n        \"fdivp\",\n        \"fstp dword [ebp + 0xfffffe58]\",\n        \"fld dword [ebp + 0xfffffe50]\",\n        \"fld dword [ebp + 0xfffffe20]\",\n        \"fld dword [ebp + 0xfffffe68]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe8c]\",\n        \"faddp\",\n        \"fld dword [0x085cefe8]\",\n        \"fdivp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe50]\",\n        \"fld dword [ebp + 0xfffffe54]\",\n        \"fld dword [ebp + 0xfffffe24]\",\n        \"fld dword [ebp + 0xfffffe6c]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe90]\",\n        \"faddp\",\n        \"fld dword [0x085cefe8]\",\n        \"fdivp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe54]\",\n        \"fld dword [ebp + 0xfffffe58]\",\n        \"fld dword [ebp + 0xfffffe28]\",\n        \"fld dword [ebp + 0xfffffe70]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe94]\",\n        \"faddp\",\n        \"fld dword [0x085cefe8]\",\n        \"fdivp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe58]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"mov eax,dword [eax]\",\n        \"mov dword [ebp + 0xfffffebc],eax\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"mov eax,dword [eax + 0x4]\",\n        \"mov dword [ebp + 0xfffffec0],eax\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"mov eax,dword [eax + 0x8]\",\n        \"mov dword [ebp + 0xfffffec4],eax\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"mov eax,dword [eax]\",\n        \"mov dword [ebp + 0xfffffe98],eax\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"mov eax,dword [eax + 0x4]\",\n        \"mov dword [ebp + 0xfffffe9c],eax\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"mov eax,dword [eax + 0x8]\",\n        \"mov dword [ebp + 0xfffffea0],eax\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"mov eax,dword [eax]\",\n        \"mov dword [ebp + 0xfffffed4],eax\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"mov eax,dword [eax + 0x4]\",\n        \"mov dword [ebp + 0xfffffed8],eax\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"mov eax,dword [eax + 0x8]\",\n        \"mov dword [ebp + 0xfffffedc],eax\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax]\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffef8]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x4]\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffefc]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x8]\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xffffff00]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff04]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff08]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff0c]\",\n        \"fld dword [ebp + 0xffffff04]\",\n        \"fld dword [ebp + 0xffffff04]\",\n        \"fmulp\",\n        \"fld dword [ebp + 0xffffff08]\",\n        \"fld dword [ebp + 0xffffff08]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + 0xffffff0c]\",\n        \"fld dword [ebp + 0xffffff0c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp qword [esp]\",\n        \"call 0x0811028c\",\n        \"fstp dword [ebp + -0x80]\",\n        \"fld dword [ebp + -0x80]\",\n        \"fldz\",\n        \"fxch\",\n        \"fucomip st0,st1\",\n        \"fstp st0\",\n        \"seta al\",\n        \"test al,al\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w7, w4\",\n        \"stur w4, [x9, #-124]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"add w4, w4, #0x1 (1)\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w7, w4\",\n        \"stur w4, [x9, #-120]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w4, #0x40 (64)\",\n        \"add w4, w7, w4\",\n        \"stur w4, [x9, #-116]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w7, w4\",\n        \"add w4, w4, #0xc (12)\",\n        \"stur w4, [x9, #-112]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"add w4, w4, #0x1 (1)\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w7, w4\",\n        \"add w4, w4, #0xc (12)\",\n        \"stur w4, [x9, #-108]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w4, #0x40 (64)\",\n        \"add w4, w7, w4\",\n        \"add w4, w4, #0xc (12)\",\n        \"stur w4, [x9, #-104]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w7, w4\",\n        \"add w4, w4, #0x18 (24)\",\n        \"stur w4, [x9, #-100]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"add w4, w4, #0x1 (1)\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w7, w4\",\n        \"add w4, w4, #0x18 (24)\",\n        \"stur w4, [x9, #-96]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w4, #0x40 (64)\",\n        \"add w4, w7, w4\",\n        \"mvn w27, w4\",\n        \"adds w26, w4, #0x18 (24)\",\n        \"mov x4, x26\",\n        \"stur w4, [x9, #-92]\",\n        \"sub w4, w9, #0xfc (252)\",\n        \"str w4, [x8]\",\n        \"mov w20, #0x140\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"cfinv\"\n      ]\n    },\n    \"Block4\": {\n      \"x86InstructionCount\": 351,\n      \"ExpectedInstructionCount\": 2809,\n      \"x86Insts\": [\n        \"mov ebp,dword [esp + 0x64]\",\n        \"fadd dword [ebp + 0x8]\",\n        \"add ebp,0x10\",\n        \"mov dword [esp + 0x64],ebp\",\n        \"fmul dword [esp + 0x74]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0x34]\",\n        \"fadd dword [ebp + -0x4]\",\n        \"fmul dword [esp + 0x74]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fld dword [esp + 0x38]\",\n        \"fadd dword [ebp]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fsub dword [ebp + 0x4]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [ebp + -0x8]\",\n        \"mov ebp,dword [ebp + -0x4]\",\n        \"mov dword [esp + 0x34],ebp\",\n        \"mov ebp,dword [esp + 0x64]\",\n        \"mov ebp,dword [ebp]\",\n        \"mov dword [esp + 0x38],ebp\",\n        \"mov ebp,dword [esp + 0x64]\",\n        \"fld dword [ebp + 0x4]\",\n        \"fchs\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [edi + -0x8]\",\n        \"fadd dword [edx + -0x8]\",\n        \"fld dword [edi + -0x4]\",\n        \"fchs\",\n        \"fsub dword [edx + -0x4]\",\n        \"fld dword [edi + -0x8]\",\n        \"fsub dword [edx + -0x8]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [edx + -0x4]\",\n        \"fsub dword [edi + -0x4]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [edi]\",\n        \"fadd dword [edx]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [edi + 0x4]\",\n        \"fchs\",\n        \"fsub dword [edx + 0x4]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [edi]\",\n        \"fsub dword [edx]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [edx + 0x4]\",\n        \"fsub dword [edi + 0x4]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [ecx + -0x8]\",\n        \"fadd dword [esi + -0x8]\",\n        \"fld dword [ecx + -0x4]\",\n        \"fadd dword [esi + -0x4]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esi + -0x8]\",\n        \"fsub dword [ecx + -0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esi + -0x4]\",\n        \"fsub dword [ecx + -0x4]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [ecx]\",\n        \"fadd dword [esi]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [ecx + 0x4]\",\n        \"fadd dword [esi + 0x4]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esi]\",\n        \"fsub dword [ecx]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esi + 0x4]\",\n        \"fsub dword [ecx + 0x4]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [edi + -0x8]\",\n        \"fld st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [edi + -0x4]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [edi]\",\n        \"fld dword [esp + 0x50]\",\n        \"fsub dword [esp + 0x4c]\",\n        \"fstp dword [edi + 0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [esi + -0x8]\",\n        \"fstp st1\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esi + -0x4]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x44]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [esi]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fadd dword [esp + 0x50]\",\n        \"fstp dword [esi + 0x4]\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st2\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [edx + -0x8]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [edx + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x58]\",\n        \"fadd dword [esp + 0x54]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fld st2\",\n        \"fmul st2\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [edx]\",\n        \"fld st2\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [edx + 0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st1\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ecx + -0x8]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ecx + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x54]\",\n        \"fsub dword [esp + 0x58]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fsub dword [esp + 0x60]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ecx]\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ecx + 0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [ebp + 0x8]\",\n        \"mov ebp,dword [esp + 0x30]\",\n        \"fadd dword [ebp + 0x8]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fld dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x30]\",\n        \"fchs\",\n        \"fsub dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fld dword [ebp + 0x8]\",\n        \"mov ebp,dword [esp + 0x30]\",\n        \"fsub dword [ebp + 0x8]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fsub dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x30]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [ebp]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fadd dword [ebp]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x30]\",\n        \"fchs\",\n        \"fsub dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [ebp]\",\n        \"mov ebp,dword [esp + 0x30]\",\n        \"fsub dword [ebp]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fsub dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x70]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [ebp + 0x8]\",\n        \"fadd dword [ebx + 0x8]\",\n        \"fld dword [ebp + 0xc]\",\n        \"fadd dword [ebx + 0xc]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [ebp + 0x8]\",\n        \"fsub dword [ebx + 0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [ebp + 0xc]\",\n        \"fsub dword [ebx + 0xc]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [ebp]\",\n        \"fadd dword [ebx]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [ebx + 0x4]\",\n        \"fadd dword [ebp + 0x4]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [ebp]\",\n        \"fsub dword [ebx]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fsub dword [ebx + 0x4]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [ebp + 0x8]\",\n        \"fld st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [ebp + 0xc]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [ebp]\",\n        \"fld dword [esp + 0x50]\",\n        \"fsub dword [esp + 0x4c]\",\n        \"fstp dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x70]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [ebp + 0x8]\",\n        \"fstp st1\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st1\",\n        \"fstp dword [ebp + 0xc]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x44]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [ebp]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fadd dword [esp + 0x50]\",\n        \"fstp dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x30]\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st2\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0x8]\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xc]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x58]\",\n        \"fadd dword [esp + 0x54]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st2\",\n        \"fld st3\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [ebp]\",\n        \"sub ebp,0x10\",\n        \"fld dword [esp + 0x34]\",\n        \"mov dword [esp + 0x30],ebp\",\n        \"fmul st1\",\n        \"add ecx,0x10\",\n        \"fld st3\",\n        \"add edx,0x10\",\n        \"fmul st3\",\n        \"add esi,0x10\",\n        \"add edi,0x10\",\n        \"faddp\",\n        \"sub ebx,0x10\",\n        \"fstp dword [ebp + 0x14]\",\n        \"mov ebp,dword [esp + 0x70]\",\n        \"sub ebp,0x10\",\n        \"fstp st0\",\n        \"mov dword [esp + 0x70],ebp\",\n        \"fstp st0\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fld dword [esp + 0x14]\",\n        \"sub ebp,0x10\",\n        \"fsub dword [esp + 0x18]\",\n        \"mov dword [esp + 0x24],ebp\",\n        \"fld dword [esp + 0x1c]\",\n        \"mov ebp,dword [esp + 0x7c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"dec ebp\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0x7c],ebp\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ebx + 0x18]\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ebx + 0x1c]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x54]\",\n        \"fsub dword [esp + 0x58]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fsub dword [esp + 0x60]\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ebx + 0x10]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ebx + 0x14]\",\n        \"fstp st0\",\n        \"fstp st0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w9, [x8, #100]\",\n        \"ldr s2, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w9, w9, #0x10 (16)\",\n        \"str w9, [x8, #100]\",\n        \"ldr s3, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #108]\",\n        \"ldr s2, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #104]\",\n        \"ldr s2, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #40]\",\n        \"ldur s2, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur w9, [x9, #-4]\",\n        \"str w9, [x8, #52]\",\n        \"ldr w9, [x8, #100]\",\n        \"ldr w9, [x9]\",\n        \"str w9, [x8, #56]\",\n        \"ldr w9, [x8, #100]\",\n        \"ldr s3, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"add w22, w20, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add x23, x28, x22, lsl #4\",\n        \"ldr q4, [x28, #3552]\",\n        \"eor v3.16b, v3.16b, v4.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #60]\",\n        \"ldur s3, [x11, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldur s4, [x5, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldur s4, [x11, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add x12, x28, x22, lsl #4\",\n        \"ldr q5, [x28, #3552]\",\n        \"eor v4.16b, v4.16b, v5.16b\",\n        \"ldur s5, [x5, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldur s5, [x11, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"ldur s6, [x5, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add x13, x28, x22, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #20]\",\n        \"ldur s5, [x5, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x11, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #28]\",\n        \"ldr s5, [x11]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #68]\",\n        \"ldr s5, [x11, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr q6, [x28, #3552]\",\n        \"eor v5.16b, v5.16b, v6.16b\",\n        \"ldr s6, [x5, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #80]\",\n        \"ldr s5, [x11]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #84]\",\n        \"ldr s5, [x5, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x11, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #92]\",\n        \"ldur s5, [x7, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x10, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x7, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"ldur s7, [x10, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add x22, x28, x22, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #16]\",\n        \"ldur s6, [x10, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldur s7, [x7, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #32]\",\n        \"ldur s6, [x10, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldur s7, [x7, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #24]\",\n        \"ldr s6, [x7]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x10]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #72]\",\n        \"ldr s6, [x7, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x10, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #76]\",\n        \"ldr s6, [x10]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x7]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #96]\",\n        \"ldr s6, [x10, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x7, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"stur s6, [x11, #-8]\",\n        \"ldr s6, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"stur s6, [x11, #-4]\",\n        \"ldr s6, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x11]\",\n        \"ldr s6, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x11, #4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x10, #-8]\",\n        \"ldr s3, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x10, #-4]\",\n        \"ldr s3, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x10]\",\n        \"ldr s3, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x10, #4]\",\n        \"ldr s3, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x5, #-8]\",\n        \"ldr s5, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x5, #-4]\",\n        \"ldr s3, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x5, #4]\",\n        \"ldr s3, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s6, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x7, #-8]\",\n        \"ldr s5, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x7, #-4]\",\n        \"ldr s3, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x7]\",\n        \"ldr s5, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #4]\",\n        \"ldr s3, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w9, [x8, #48]\",\n        \"ldr s4, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s4, [x9, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w9, [x8, #48]\",\n        \"ldr q5, [x28, #3552]\",\n        \"eor v4.16b, v4.16b, v5.16b\",\n        \"ldr s5, [x9, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s5, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #48]\",\n        \"ldr s6, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #20]\",\n        \"ldr s5, [x9, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s6, [x9, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #28]\",\n        \"ldr s5, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s6, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #68]\",\n        \"ldr s5, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #48]\",\n        \"ldr q6, [x28, #3552]\",\n        \"eor v5.16b, v5.16b, v6.16b\",\n        \"ldr s6, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #80]\",\n        \"ldr s5, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #48]\",\n        \"ldr s6, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #84]\",\n        \"ldr s5, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s6, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #92]\",\n        \"ldr s5, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x6, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x9, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x6, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #16]\",\n        \"ldr s6, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x6, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #32]\",\n        \"ldr s6, [x9, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x6, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #24]\",\n        \"ldr s6, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x6]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #72]\",\n        \"ldr s6, [x6, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #76]\",\n        \"ldr s6, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x6]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #96]\",\n        \"ldr s6, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s7, [x6, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x9, #8]\",\n        \"ldr s6, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x9, #12]\",\n        \"ldr s6, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x9]\",\n        \"ldr s6, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x9, #4]\",\n        \"ldr w9, [x8, #112]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x9, #8]\",\n        \"ldr s3, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x9, #12]\",\n        \"ldr s3, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x9]\",\n        \"ldr s3, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x9, #4]\",\n        \"ldr w9, [x8, #48]\",\n        \"ldr s3, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x9, #8]\",\n        \"ldr s5, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x9, #12]\",\n        \"ldr s3, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x9]\",\n        \"sub w9, w9, #0x10 (16)\",\n        \"ldr s5, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str w9, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w7, w7, #0x10 (16)\",\n        \"add w5, w5, #0x10 (16)\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"add w10, w10, #0x10 (16)\",\n        \"add w11, w11, #0x10 (16)\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"sub w6, w6, #0x10 (16)\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x9, #20]\",\n        \"ldr w9, [x8, #112]\",\n        \"sub w9, w9, #0x10 (16)\",\n        \"str w9, [x8, #112]\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s3, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"subs w9, w9, #0x10 (16)\",\n        \"ldr s4, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str w9, [x8, #36]\",\n        \"ldr s4, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w9, [x8, #124]\",\n        \"ldr s5, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"cset x14, hs\",\n        \"subs w26, w9, #0x1 (1)\",\n        \"rmif x14, #63, #nzCv\",\n        \"mov x27, x9\",\n        \"mov x9, x26\",\n        \"ldr s5, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str w9, [x8, #124]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x6, #24]\",\n        \"ldr s5, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x6, #28]\",\n        \"ldr s3, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x6, #16]\",\n        \"ldr s5, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x6, #20]\",\n        \"strb w20, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"str q6, [x22, #1056]\",\n        \"str q5, [x13, #1056]\",\n        \"str q4, [x12, #1056]\",\n        \"str q3, [x23, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w22, w22, w20\",\n        \"orr w21, w21, w22\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xf0f0\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block5\": {\n      \"x86InstructionCount\": 346,\n      \"ExpectedInstructionCount\": 2804,\n      \"x86Insts\": [\n        \"mov ebp,dword [esp + 0x64]\",\n        \"fadd dword [ebp + 0x8]\",\n        \"add ebp,0x10\",\n        \"mov dword [esp + 0x64],ebp\",\n        \"fmul dword [esp + 0x74]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0x34]\",\n        \"fadd dword [ebp + -0x4]\",\n        \"fmul dword [esp + 0x74]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fld dword [esp + 0x38]\",\n        \"fadd dword [ebp]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fsub dword [ebp + 0x4]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [ebp + -0x8]\",\n        \"mov ebp,dword [ebp + -0x4]\",\n        \"mov dword [esp + 0x34],ebp\",\n        \"mov ebp,dword [esp + 0x64]\",\n        \"mov ebp,dword [ebp]\",\n        \"mov dword [esp + 0x38],ebp\",\n        \"mov ebp,dword [esp + 0x64]\",\n        \"fld dword [ebp + 0x4]\",\n        \"fchs\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [edx + -0x8]\",\n        \"fadd dword [edi + -0x8]\",\n        \"fld dword [edi + -0x4]\",\n        \"fadd dword [edx + -0x4]\",\n        \"fld dword [edi + -0x8]\",\n        \"fsub dword [edx + -0x8]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [edi + -0x4]\",\n        \"fsub dword [edx + -0x4]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [edi]\",\n        \"fadd dword [edx]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [edi + 0x4]\",\n        \"fadd dword [edx + 0x4]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [edi]\",\n        \"fsub dword [edx]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [edi + 0x4]\",\n        \"fsub dword [edx + 0x4]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [ecx + -0x8]\",\n        \"fadd dword [esi + -0x8]\",\n        \"fld dword [ecx + -0x4]\",\n        \"fadd dword [esi + -0x4]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esi + -0x8]\",\n        \"fsub dword [ecx + -0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esi + -0x4]\",\n        \"fsub dword [ecx + -0x4]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [ecx]\",\n        \"fadd dword [esi]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [ecx + 0x4]\",\n        \"fadd dword [esi + 0x4]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esi]\",\n        \"fsub dword [ecx]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esi + 0x4]\",\n        \"fsub dword [ecx + 0x4]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [edi + -0x8]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [edi + -0x4]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [edi]\",\n        \"fld dword [esp + 0x50]\",\n        \"fadd dword [esp + 0x4c]\",\n        \"fstp dword [edi + 0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [esi + -0x8]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [esi + -0x4]\",\n        \"fld dword [esp + 0x44]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [esi]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fsub dword [esp + 0x50]\",\n        \"fstp dword [esi + 0x4]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st2\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [edx + -0x8]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [edx + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x58]\",\n        \"fsub dword [esp + 0x54]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fld st2\",\n        \"fmul st2\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [edx]\",\n        \"fld st2\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [edx + 0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fstp dword [ecx + -0x8]\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ecx + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x54]\",\n        \"fadd dword [esp + 0x58]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fsub dword [esp + 0x60]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ecx]\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ecx + 0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [ebp + 0x8]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fadd dword [ebp + 0x8]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fld dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fadd dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fld dword [ebp + 0x8]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fsub dword [ebp + 0x8]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fsub dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [ebp]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fadd dword [ebp]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fadd dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [ebp]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fsub dword [ebp]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fsub dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x70]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [ebp + 0x8]\",\n        \"fadd dword [ebx + 0x8]\",\n        \"fld dword [ebp + 0xc]\",\n        \"fadd dword [ebx + 0xc]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [ebp + 0x8]\",\n        \"fsub dword [ebx + 0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [ebp + 0xc]\",\n        \"fsub dword [ebx + 0xc]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [ebx]\",\n        \"fadd dword [ebp]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [ebp + 0x4]\",\n        \"fadd dword [ebx + 0x4]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [ebp]\",\n        \"fsub dword [ebx]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fsub dword [ebx + 0x4]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [ebp + 0x8]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [ebp + 0xc]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [ebp]\",\n        \"fld dword [esp + 0x50]\",\n        \"fadd dword [esp + 0x4c]\",\n        \"fstp dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x70]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [ebp + 0x8]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [ebp + 0xc]\",\n        \"fld dword [esp + 0x44]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [ebp]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fsub dword [esp + 0x50]\",\n        \"fstp dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st2\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0x8]\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xc]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x58]\",\n        \"fsub dword [esp + 0x54]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st2\",\n        \"fld st3\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [ebp]\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st1\",\n        \"fld st3\",\n        \"fmul st3\",\n        \"sub ebp,0x10\",\n        \"mov dword [esp + 0x28],ebp\",\n        \"add ecx,0x10\",\n        \"faddp\",\n        \"add edx,0x10\",\n        \"add esi,0x10\",\n        \"fstp dword [ebp + 0x14]\",\n        \"mov ebp,dword [esp + 0x70]\",\n        \"sub ebp,0x10\",\n        \"fstp st0\",\n        \"mov dword [esp + 0x70],ebp\",\n        \"fstp st0\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fld dword [esp + 0x14]\",\n        \"sub ebp,0x10\",\n        \"fadd dword [esp + 0x18]\",\n        \"mov dword [esp + 0x24],ebp\",\n        \"fld dword [esp + 0x1c]\",\n        \"mov ebp,dword [esp + 0x7c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"add edi,0x10\",\n        \"fld dword [esp + 0x30]\",\n        \"sub ebx,0x10\",\n        \"dec ebp\",\n        \"fmul st1\",\n        \"mov dword [esp + 0x7c],ebp\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ebx + 0x18]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ebx + 0x1c]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x54]\",\n        \"fadd dword [esp + 0x58]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fsub dword [esp + 0x60]\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ebx + 0x10]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ebx + 0x14]\",\n        \"fstp st0\",\n        \"fstp st0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w9, [x8, #100]\",\n        \"ldr s2, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w9, w9, #0x10 (16)\",\n        \"str w9, [x8, #100]\",\n        \"ldr s3, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #108]\",\n        \"ldr s2, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #104]\",\n        \"ldr s2, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #44]\",\n        \"ldur s2, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur w9, [x9, #-4]\",\n        \"str w9, [x8, #52]\",\n        \"ldr w9, [x8, #100]\",\n        \"ldr w9, [x9]\",\n        \"str w9, [x8, #56]\",\n        \"ldr w9, [x8, #100]\",\n        \"ldr s3, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"add w22, w20, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add x23, x28, x22, lsl #4\",\n        \"ldr q4, [x28, #3552]\",\n        \"eor v3.16b, v3.16b, v4.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x8, #60]\",\n        \"ldur s3, [x5, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldur s4, [x11, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldur s4, [x11, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"ldur s5, [x5, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add x12, x28, x22, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldur s5, [x11, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"ldur s6, [x5, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add x13, x28, x22, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #24]\",\n        \"ldur s5, [x11, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x5, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #28]\",\n        \"ldr s5, [x11]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #68]\",\n        \"ldr s5, [x11, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x5, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #76]\",\n        \"ldr s5, [x11]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #88]\",\n        \"ldr s5, [x11, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x5, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #92]\",\n        \"ldur s5, [x7, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x10, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldur s6, [x7, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"ldur s7, [x10, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add x22, x28, x22, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #16]\",\n        \"ldur s6, [x10, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldur s7, [x7, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #32]\",\n        \"ldur s6, [x10, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldur s7, [x7, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #20]\",\n        \"ldr s6, [x7]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x10]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #72]\",\n        \"ldr s6, [x7, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x10, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #80]\",\n        \"ldr s6, [x10]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x7]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #96]\",\n        \"ldr s6, [x10, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x7, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"stur s6, [x11, #-8]\",\n        \"ldr s6, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"stur s6, [x11, #-4]\",\n        \"ldr s6, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x11]\",\n        \"ldr s6, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x11, #4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x10, #-8]\",\n        \"ldr s3, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x10, #-4]\",\n        \"ldr s3, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x10]\",\n        \"ldr s3, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x10, #4]\",\n        \"ldr s3, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x5, #-8]\",\n        \"ldr s5, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x5, #-4]\",\n        \"ldr s3, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x5, #4]\",\n        \"ldr s3, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"stur s5, [x7, #-8]\",\n        \"ldr s5, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"stur s3, [x7, #-4]\",\n        \"ldr s3, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x7]\",\n        \"ldr s5, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x7, #4]\",\n        \"ldr s3, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s4, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s4, [x9, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s5, [x9, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s5, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s6, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #24]\",\n        \"ldr s5, [x9, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s6, [x9, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #28]\",\n        \"ldr s5, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s6, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #68]\",\n        \"ldr s5, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s6, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #76]\",\n        \"ldr s5, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s6, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #88]\",\n        \"ldr s5, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s6, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w9, [x8, #112]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x8, #92]\",\n        \"ldr s5, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x6, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x9, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x6, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #16]\",\n        \"ldr s6, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x6, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #32]\",\n        \"ldr s6, [x9, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x6, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #20]\",\n        \"ldr s6, [x6]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #72]\",\n        \"ldr s6, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x6, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #80]\",\n        \"ldr s6, [x9]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x6]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #96]\",\n        \"ldr s6, [x9, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s7, [x6, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x9, #8]\",\n        \"ldr s6, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x9, #12]\",\n        \"ldr s6, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x9]\",\n        \"ldr s6, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x9, #4]\",\n        \"ldr w9, [x8, #112]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x9, #8]\",\n        \"ldr s3, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x9, #12]\",\n        \"ldr s3, [x8, #68]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #72]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x9]\",\n        \"ldr s3, [x8, #76]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #80]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x9, #4]\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s3, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x9, #8]\",\n        \"ldr s5, [x8, #104]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #108]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x9, #12]\",\n        \"ldr s3, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x9]\",\n        \"ldr s5, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"sub w9, w9, #0x10 (16)\",\n        \"str w9, [x8, #40]\",\n        \"add w7, w7, #0x10 (16)\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"add w5, w5, #0x10 (16)\",\n        \"add w10, w10, #0x10 (16)\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x9, #20]\",\n        \"ldr w9, [x8, #112]\",\n        \"sub w9, w9, #0x10 (16)\",\n        \"str w9, [x8, #112]\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s3, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"sub w9, w9, #0x10 (16)\",\n        \"ldr s4, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str w9, [x8, #36]\",\n        \"ldr s4, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w9, [x8, #124]\",\n        \"ldr s5, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w11, w11, #0x10 (16)\",\n        \"ldr s5, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"subs w6, w6, #0x10 (16)\",\n        \"cset x14, hs\",\n        \"subs w26, w9, #0x1 (1)\",\n        \"rmif x14, #63, #nzCv\",\n        \"mov x27, x9\",\n        \"mov x9, x26\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str w9, [x8, #124]\",\n        \"ldr s6, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x6, #24]\",\n        \"ldr s5, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s3, s0\",\n        \"str s3, [x6, #28]\",\n        \"ldr s3, [x8, #84]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #88]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #92]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #96]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s5, s0\",\n        \"str s5, [x6, #16]\",\n        \"ldr s5, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x6, #20]\",\n        \"strb w20, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"str q6, [x22, #1056]\",\n        \"str q5, [x13, #1056]\",\n        \"str q4, [x12, #1056]\",\n        \"str q3, [x23, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w22, w22, w20\",\n        \"orr w21, w21, w22\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xf0f0\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block6\": {\n      \"x86InstructionCount\": 409,\n      \"ExpectedInstructionCount\": 2204,\n      \"x86Insts\": [\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x30]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x2c]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x28]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x24]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x20]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x1c]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x18]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x14]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x10]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0xc]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + -0x30]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [ebp + -0x2c]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [ebp + -0x28]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [ebp + -0x24]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [ebp + -0x20]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [ebp + -0x1c]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [ebp + -0x18]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [ebp + -0x14]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [ebp + -0x10]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [ebp + -0xc]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fxch st5\",\n        \"fstp dword [esp + 0x18]\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"fxch\",\n        \"fstp dword [esp + 0x10]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp],ebx\",\n        \"call 0x0818d57a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-48]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-44]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-40]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-36]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-32]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-28]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-24]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-20]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-16]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-12]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s8, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s9, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s8, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s9, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s8, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s9, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldur s8, [x9, #-48]\",\n        \"str s8, [x8, #64]\",\n        \"ldur s8, [x9, #-44]\",\n        \"str s8, [x8, #60]\",\n        \"ldur s8, [x9, #-40]\",\n        \"str s8, [x8, #56]\",\n        \"ldur s8, [x9, #-36]\",\n        \"str s8, [x8, #52]\",\n        \"ldur s8, [x9, #-32]\",\n        \"str s8, [x8, #48]\",\n        \"ldur s8, [x9, #-28]\",\n        \"str s8, [x8, #44]\",\n        \"ldur s8, [x9, #-24]\",\n        \"str s8, [x8, #40]\",\n        \"ldur s8, [x9, #-20]\",\n        \"str s8, [x8, #36]\",\n        \"ldur s8, [x9, #-16]\",\n        \"str s8, [x8, #32]\",\n        \"ldur s8, [x9, #-12]\",\n        \"str s8, [x8, #28]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #24]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #4]\",\n        \"str w6, [x8]\",\n        \"mov w20, #0x462\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block7\": {\n      \"x86InstructionCount\": 418,\n      \"ExpectedInstructionCount\": 2211,\n      \"x86Insts\": [\n        \"push ebp\",\n        \"mov ebp,esp\",\n        \"push ebx\",\n        \"sub esp,0x84\",\n        \"mov ebx,dword [ebp + 0x8]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x30]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x2c]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x28]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x24]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x20]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x1c]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x18]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x14]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x10]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0xc]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + -0x30]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [ebp + -0x2c]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [ebp + -0x28]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [ebp + -0x24]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [ebp + -0x20]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [ebp + -0x1c]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [ebp + -0x18]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [ebp + -0x14]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [ebp + -0x10]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [ebp + -0xc]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fxch st5\",\n        \"fstp dword [esp + 0x18]\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"fxch\",\n        \"fstp dword [esp + 0x10]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp],ebx\",\n        \"call 0x0818d57a\",\n        \"mov eax,ebx\",\n        \"add esp,0x84\",\n        \"pop ebx\",\n        \"pop ebp\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str w9, [x8, #-4]!\",\n        \"mov x9, x8\",\n        \"str w6, [x8, #-4]!\",\n        \"subs w26, w8, #0x84 (132)\",\n        \"mov x27, x8\",\n        \"mov x8, x26\",\n        \"ldr w6, [x9, #8]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-48]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-44]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-40]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-36]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-32]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-28]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-24]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-20]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-16]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-12]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4, #36]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s8, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s9, [x4, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s8, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s9, [x4, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s8, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s9, [x4, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s9\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v9.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v8.16b\",\n        \"mov v1.16b, v9.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"ldur s8, [x9, #-48]\",\n        \"str s8, [x8, #64]\",\n        \"ldur s8, [x9, #-44]\",\n        \"str s8, [x8, #60]\",\n        \"ldur s8, [x9, #-40]\",\n        \"str s8, [x8, #56]\",\n        \"ldur s8, [x9, #-36]\",\n        \"str s8, [x8, #52]\",\n        \"ldur s8, [x9, #-32]\",\n        \"str s8, [x8, #48]\",\n        \"ldur s8, [x9, #-28]\",\n        \"str s8, [x8, #44]\",\n        \"ldur s8, [x9, #-24]\",\n        \"str s8, [x8, #40]\",\n        \"ldur s8, [x9, #-20]\",\n        \"str s8, [x8, #36]\",\n        \"ldur s8, [x9, #-16]\",\n        \"str s8, [x8, #32]\",\n        \"ldur s8, [x9, #-12]\",\n        \"str s8, [x8, #28]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #24]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #20]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x8, #4]\",\n        \"str w6, [x8]\",\n        \"mov w20, #0x46f\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block8\": {\n      \"x86InstructionCount\": 231,\n      \"ExpectedInstructionCount\": 1963,\n      \"x86Insts\": [\n        \"fadd dword [esp + 0x40]\",\n        \"lea edx,[ecx + ecx*0x2]\",\n        \"lea esi,[edx + ecx*0x2]\",\n        \"lea ebx,[ecx + -0x2]\",\n        \"fmul dword [esp + 0x74]\",\n        \"fld dword [esp + 0x34]\",\n        \"lea edi,[esi + ecx*0x2]\",\n        \"fadd dword [esp + 0x40]\",\n        \"fmul dword [esp + 0x74]\",\n        \"fld dword [esp + 0x38]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [eax + esi*0x4 + -0x8]\",\n        \"fadd dword [eax + ebx*0x4]\",\n        \"fld dword [eax + ecx*0x4 + -0x4]\",\n        \"fchs\",\n        \"fsub dword [eax + esi*0x4 + -0x4]\",\n        \"fld dword [eax + ebx*0x4]\",\n        \"fsub dword [eax + esi*0x4 + -0x8]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + esi*0x4 + -0x4]\",\n        \"fsub dword [eax + ecx*0x4 + -0x4]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [eax + edx*0x4 + -0x8]\",\n        \"fadd dword [eax + edi*0x4 + -0x8]\",\n        \"fld dword [eax + edx*0x4 + -0x4]\",\n        \"fadd dword [eax + edi*0x4 + -0x4]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + edx*0x4 + -0x8]\",\n        \"fsub dword [eax + edi*0x4 + -0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [eax + edx*0x4 + -0x4]\",\n        \"fsub dword [eax + edi*0x4 + -0x4]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + ebx*0x4]\",\n        \"fld st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + ecx*0x4 + -0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + edx*0x4 + -0x8]\",\n        \"fstp st1\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st1\",\n        \"fstp dword [eax + edx*0x4 + -0x4]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld st3\",\n        \"fmul st2\",\n        \"fld st3\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [eax + esi*0x4 + -0x8]\",\n        \"fld st3\",\n        \"fmul st1\",\n        \"fld st3\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [eax + esi*0x4 + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [eax + edi*0x4 + -0x8]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [eax + edi*0x4 + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [eax + ecx*0x4]\",\n        \"fadd dword [eax + esi*0x4]\",\n        \"fld dword [eax + ecx*0x4 + 0x4]\",\n        \"fchs\",\n        \"fsub dword [eax + esi*0x4 + 0x4]\",\n        \"fld dword [eax + ecx*0x4]\",\n        \"fsub dword [eax + esi*0x4]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + esi*0x4 + 0x4]\",\n        \"fsub dword [eax + ecx*0x4 + 0x4]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [eax + edi*0x4]\",\n        \"fadd dword [eax + edx*0x4]\",\n        \"fld dword [eax + edx*0x4 + 0x4]\",\n        \"fadd dword [eax + edi*0x4 + 0x4]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + edx*0x4]\",\n        \"fsub dword [eax + edi*0x4]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [eax + edx*0x4 + 0x4]\",\n        \"fsub dword [eax + edi*0x4 + 0x4]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + ecx*0x4]\",\n        \"fld st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + ecx*0x4 + 0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + edx*0x4]\",\n        \"fstp st1\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st1\",\n        \"fstp dword [eax + edx*0x4 + 0x4]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul dword [esp + 0x40]\",\n        \"fstp dword [eax + esi*0x4]\",\n        \"fadd st0,st1\",\n        \"fmul dword [esp + 0x40]\",\n        \"fstp dword [eax + esi*0x4 + 0x4]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x40]\",\n        \"fchs\",\n        \"fld st1\",\n        \"fadd st0,st3\",\n        \"fmul st1\",\n        \"fstp dword [eax + edi*0x4]\",\n        \"fxch\",\n        \"fsub st0,st2\",\n        \"fmul st1\",\n        \"fstp dword [eax + edi*0x4 + 0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [eax + ecx*0x4 + 0x8]\",\n        \"fadd dword [eax + esi*0x4 + 0x8]\",\n        \"fld dword [eax + ecx*0x4 + 0xc]\",\n        \"fchs\",\n        \"fsub dword [eax + esi*0x4 + 0xc]\",\n        \"fld dword [eax + ecx*0x4 + 0x8]\",\n        \"fsub dword [eax + esi*0x4 + 0x8]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + esi*0x4 + 0xc]\",\n        \"fsub dword [eax + ecx*0x4 + 0xc]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [eax + edi*0x4 + 0x8]\",\n        \"fadd dword [eax + edx*0x4 + 0x8]\",\n        \"fld dword [eax + edx*0x4 + 0xc]\",\n        \"fadd dword [eax + edi*0x4 + 0xc]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + edx*0x4 + 0x8]\",\n        \"fsub dword [eax + edi*0x4 + 0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [eax + edx*0x4 + 0xc]\",\n        \"fsub dword [eax + edi*0x4 + 0xc]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + ecx*0x4 + 0x8]\",\n        \"fld st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + ecx*0x4 + 0xc]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + edx*0x4 + 0x8]\",\n        \"fstp st1\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st1\",\n        \"fstp dword [eax + edx*0x4 + 0xc]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld st2\",\n        \"fmul st2\",\n        \"fld st4\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [eax + esi*0x4 + 0x8]\",\n        \"fxch st2\",\n        \"fmul st2\",\n        \"fxch st3\",\n        \"fmul st1\",\n        \"faddp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [eax + esi*0x4 + 0xc]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [eax + edi*0x4 + 0x8]\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [eax + edi*0x4 + 0xc]\",\n        \"pop edi\",\n        \"pop esi\",\n        \"fstp st0\",\n        \"pop ebp\",\n        \"fstp st0\",\n        \"pop ebx\",\n        \"add esp,0x74\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w5, w7, w7, lsl #1\",\n        \"add w10, w5, w7, lsl #1\",\n        \"sub w6, w7, #0x2 (2)\",\n        \"ldr s3, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"add w22, w20, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add w11, w10, w7, lsl #1\",\n        \"ldr s4, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add x23, x28, x22, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"ldr s5, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add x12, x28, x22, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #44]\",\n        \"ldr s4, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #40]\",\n        \"add w13, w4, w10, lsl #2\",\n        \"ldur s4, [x13, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w13, w4, w6, lsl #2\",\n        \"ldr s5, [x13]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w13, w4, w7, lsl #2\",\n        \"ldur s5, [x13, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add x13, x28, x22, lsl #4\",\n        \"ldr q6, [x28, #3552]\",\n        \"eor v5.16b, v5.16b, v6.16b\",\n        \"add w14, w4, w10, lsl #2\",\n        \"ldur s6, [x14, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add w14, w4, w6, lsl #2\",\n        \"ldr s6, [x14]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add w14, w4, w10, lsl #2\",\n        \"ldur s7, [x14, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add x14, x28, x22, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #20]\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldur s6, [x15, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldur s7, [x15, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #28]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s6, [x15, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s7, [x15, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s7, [x15, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s8, [x15, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"add x22, x28, x22, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #16]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s7, [x15, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s8, [x15, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #32]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s7, [x15, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s8, [x15, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w6, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x15]\",\n        \"ldr s7, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"stur s7, [x15, #-4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"stur s4, [x15, #-8]\",\n        \"ldr s4, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"stur s4, [x15, #-4]\",\n        \"ldr s4, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"stur s6, [x15, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"stur s4, [x15, #-4]\",\n        \"ldr s4, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"stur s6, [x15, #-8]\",\n        \"ldr s6, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"stur s4, [x15, #-4]\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s4, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s5, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s5, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr q6, [x28, #3552]\",\n        \"eor v5.16b, v5.16b, v6.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s6, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s6, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s7, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #20]\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s6, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s7, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #28]\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s6, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #16]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #32]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x15]\",\n        \"ldr s7, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x15, #4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x15]\",\n        \"ldr s4, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x15, #4]\",\n        \"ldr s4, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x15, #4]\",\n        \"ldr s4, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr q7, [x28, #3552]\",\n        \"eor v6.16b, v6.16b, v7.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x15]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x15, #4]\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s4, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s5, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s5, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr q6, [x28, #3552]\",\n        \"eor v5.16b, v5.16b, v6.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s6, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s6, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s7, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #20]\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s6, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s7, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #28]\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s6, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #16]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #32]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x15, #8]\",\n        \"ldr s7, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x15, #12]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x15, #8]\",\n        \"ldr s4, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x15, #12]\",\n        \"ldr s4, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x15, #8]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"add w15, w4, w10, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x15, #12]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldr s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x15, #8]\",\n        \"ldr s4, [x8, #40]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x15, #12]\",\n        \"ldp w11, w10, [x8], #8\",\n        \"ldp w9, w6, [x8], #8\",\n        \"mvn w27, w8\",\n        \"adds w26, w8, #0x74 (116)\",\n        \"cfinv\",\n        \"mov x8, x26\",\n        \"strb w20, [x28, #1051]\",\n        \"str q7, [x22, #1056]\",\n        \"str q6, [x14, #1056]\",\n        \"str q5, [x13, #1056]\",\n        \"str q4, [x12, #1056]\",\n        \"str q3, [x23, #1056]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xfcfc\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block9\": {\n      \"x86InstructionCount\": 222,\n      \"ExpectedInstructionCount\": 1957,\n      \"x86Insts\": [\n        \"fadd dword [esp + 0x40]\",\n        \"lea edx,[ecx + ecx*0x2]\",\n        \"lea esi,[edx + ecx*0x2]\",\n        \"lea ebx,[ecx + -0x2]\",\n        \"fmul dword [esp + 0x74]\",\n        \"fld dword [esp + 0x34]\",\n        \"lea edi,[esi + ecx*0x2]\",\n        \"fadd dword [esp + 0x40]\",\n        \"fmul dword [esp + 0x74]\",\n        \"fld dword [esp + 0x38]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [eax + esi*0x4 + -0x8]\",\n        \"fadd dword [eax + ebx*0x4]\",\n        \"fld dword [eax + ecx*0x4 + -0x4]\",\n        \"fadd dword [eax + esi*0x4 + -0x4]\",\n        \"fld dword [eax + ebx*0x4]\",\n        \"fsub dword [eax + esi*0x4 + -0x8]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [eax + ecx*0x4 + -0x4]\",\n        \"fsub dword [eax + esi*0x4 + -0x4]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [eax + edi*0x4 + -0x8]\",\n        \"fadd dword [eax + edx*0x4 + -0x8]\",\n        \"fld dword [eax + edx*0x4 + -0x4]\",\n        \"fadd dword [eax + edi*0x4 + -0x4]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + edx*0x4 + -0x8]\",\n        \"fsub dword [eax + edi*0x4 + -0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [eax + edx*0x4 + -0x4]\",\n        \"fsub dword [eax + edi*0x4 + -0x4]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + ebx*0x4]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + ecx*0x4 + -0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + edx*0x4 + -0x8]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + edx*0x4 + -0x4]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld st3\",\n        \"fmul st2\",\n        \"fld st3\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [eax + esi*0x4 + -0x8]\",\n        \"fld st3\",\n        \"fmul st1\",\n        \"fld st3\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [eax + esi*0x4 + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [eax + edi*0x4 + -0x8]\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [eax + edi*0x4 + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [eax + ecx*0x4]\",\n        \"fadd dword [eax + esi*0x4]\",\n        \"fld dword [eax + ecx*0x4 + 0x4]\",\n        \"fadd dword [eax + esi*0x4 + 0x4]\",\n        \"fld dword [eax + ecx*0x4]\",\n        \"fsub dword [eax + esi*0x4]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [eax + ecx*0x4 + 0x4]\",\n        \"fsub dword [eax + esi*0x4 + 0x4]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [eax + edx*0x4]\",\n        \"fadd dword [eax + edi*0x4]\",\n        \"fld dword [eax + edx*0x4 + 0x4]\",\n        \"fadd dword [eax + edi*0x4 + 0x4]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + edx*0x4]\",\n        \"fsub dword [eax + edi*0x4]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [eax + edx*0x4 + 0x4]\",\n        \"fsub dword [eax + edi*0x4 + 0x4]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + ecx*0x4]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + ecx*0x4 + 0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + edx*0x4]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + edx*0x4 + 0x4]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul dword [esp + 0x40]\",\n        \"fstp dword [eax + esi*0x4]\",\n        \"fadd st0,st1\",\n        \"fmul dword [esp + 0x40]\",\n        \"fstp dword [eax + esi*0x4 + 0x4]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x40]\",\n        \"fchs\",\n        \"fld st1\",\n        \"fadd st0,st3\",\n        \"fmul st1\",\n        \"fstp dword [eax + edi*0x4]\",\n        \"fxch\",\n        \"fsub st0,st2\",\n        \"fmul st1\",\n        \"fstp dword [eax + edi*0x4 + 0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [eax + ecx*0x4 + 0x8]\",\n        \"fadd dword [eax + esi*0x4 + 0x8]\",\n        \"fld dword [eax + ecx*0x4 + 0xc]\",\n        \"fadd dword [eax + esi*0x4 + 0xc]\",\n        \"fld dword [eax + ecx*0x4 + 0x8]\",\n        \"fsub dword [eax + esi*0x4 + 0x8]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [eax + ecx*0x4 + 0xc]\",\n        \"fsub dword [eax + esi*0x4 + 0xc]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [eax + edi*0x4 + 0x8]\",\n        \"fadd dword [eax + edx*0x4 + 0x8]\",\n        \"fld dword [eax + edi*0x4 + 0xc]\",\n        \"fadd dword [eax + edx*0x4 + 0xc]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + edx*0x4 + 0x8]\",\n        \"fsub dword [eax + edi*0x4 + 0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [eax + edx*0x4 + 0xc]\",\n        \"fsub dword [eax + edi*0x4 + 0xc]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + ecx*0x4 + 0x8]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + ecx*0x4 + 0xc]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + edx*0x4 + 0x8]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + edx*0x4 + 0xc]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld st2\",\n        \"fmul st2\",\n        \"fld st4\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [eax + esi*0x4 + 0x8]\",\n        \"fxch st2\",\n        \"fmul st2\",\n        \"fxch st3\",\n        \"fmul st1\",\n        \"faddp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [eax + esi*0x4 + 0xc]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [eax + edi*0x4 + 0x8]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [eax + edi*0x4 + 0xc]\",\n        \"pop edi\",\n        \"pop esi\",\n        \"fstp st0\",\n        \"pop ebp\",\n        \"fstp st0\",\n        \"pop ebx\",\n        \"add esp,0x74\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w5, w7, w7, lsl #1\",\n        \"add w10, w5, w7, lsl #1\",\n        \"sub w6, w7, #0x2 (2)\",\n        \"ldr s3, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #52]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"add w22, w20, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add w11, w10, w7, lsl #1\",\n        \"ldr s4, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add x23, x28, x22, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #116]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #56]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"ldr s5, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add x12, x28, x22, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #48]\",\n        \"ldr s4, [x8, #60]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #120]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x8, #44]\",\n        \"add w13, w4, w10, lsl #2\",\n        \"ldur s4, [x13, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w13, w4, w6, lsl #2\",\n        \"ldr s5, [x13]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w13, w4, w7, lsl #2\",\n        \"ldur s5, [x13, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add w13, w4, w10, lsl #2\",\n        \"ldur s6, [x13, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add x13, x28, x22, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add w14, w4, w6, lsl #2\",\n        \"ldr s6, [x14]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add w14, w4, w10, lsl #2\",\n        \"ldur s7, [x14, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add x14, x28, x22, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #24]\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldur s6, [x15, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldur s7, [x15, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #28]\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s6, [x15, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s7, [x15, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s7, [x15, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s8, [x15, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"add x22, x28, x22, lsl #4\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #16]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s7, [x15, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s8, [x15, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #32]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s7, [x15, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s8, [x15, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w6, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x15]\",\n        \"ldr s7, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"stur s7, [x15, #-4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"stur s4, [x15, #-8]\",\n        \"ldr s4, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"stur s4, [x15, #-4]\",\n        \"ldr s4, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"stur s6, [x15, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"stur s4, [x15, #-4]\",\n        \"ldr s4, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"stur s6, [x15, #-8]\",\n        \"ldr s6, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"stur s4, [x15, #-4]\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s4, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s5, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s5, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s6, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s6, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s7, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #24]\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s6, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s7, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #28]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s6, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s7, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #16]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #32]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x15]\",\n        \"ldr s7, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x15, #4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x15]\",\n        \"ldr s4, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x15, #4]\",\n        \"ldr s4, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr s7, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x15]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x15, #4]\",\n        \"ldr s4, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #64]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"ldr q7, [x28, #3552]\",\n        \"eor v6.16b, v6.16b, v7.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x15]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x15, #4]\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s4, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s5, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s5, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s6, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s6, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s7, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #24]\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s6, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s7, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s6, s0\",\n        \"str s6, [x8, #28]\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s6, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s7, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s8, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #16]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #32]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s8\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v8.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v8.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x15, #8]\",\n        \"ldr s7, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s7\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"add w15, w4, w7, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v7.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s7, s0\",\n        \"str s7, [x15, #12]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x15, #8]\",\n        \"ldr s4, [x8, #16]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w5, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x15, #12]\",\n        \"ldr s4, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldr s6, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s6\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v6.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v7.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"mov v1.16b, v7.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v6.16b, v0.16b\",\n        \"add w15, w4, w10, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v6.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x15, #8]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1049]\",\n        \"add w15, w4, w10, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x15, #12]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldr s2, [x8, #20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #24]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x8, #28]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #32]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s4, s0\",\n        \"str s4, [x15, #8]\",\n        \"ldr s4, [x8, #44]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x8, #48]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v5.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"mov v1.16b, v5.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"add w15, w4, w11, lsl #2\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v4.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s8, s0\",\n        \"str s8, [x15, #12]\",\n        \"ldp w11, w10, [x8], #8\",\n        \"ldp w9, w6, [x8], #8\",\n        \"mvn w27, w8\",\n        \"adds w26, w8, #0x74 (116)\",\n        \"cfinv\",\n        \"mov x8, x26\",\n        \"strb w20, [x28, #1051]\",\n        \"str q7, [x22, #1056]\",\n        \"str q6, [x14, #1056]\",\n        \"str q5, [x13, #1056]\",\n        \"str q4, [x12, #1056]\",\n        \"str q3, [x23, #1056]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xfcfc\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block10\": {\n      \"x86InstructionCount\": 420,\n      \"ExpectedInstructionCount\": 1954,\n      \"x86Insts\": [\n        \"push ebp\",\n        \"mov ebp,esp\",\n        \"sub esp,0x14\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x78\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x38\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x7c\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x3c\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x78\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x78\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x38\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x7c\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x7c\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x3c\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"lea edx,[eax + 0x38]\",\n        \"mov eax,dword [ebp + -0x8]\",\n        \"mov dword [edx],eax\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"lea edx,[eax + 0x3c]\",\n        \"mov eax,dword [ebp + -0x4]\",\n        \"mov dword [edx],eax\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x70\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x30\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x74\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x34\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x70\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x70\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x30\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x74\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x74\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x34\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x30\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x08553140]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x08553144]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x34\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x08553148]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x08553140]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x68\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x28\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x6c\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x2c\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x68\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x68\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x28\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x6c\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x6c\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x2c\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x28\",\n        \"fld dword [ebp + -0x8]\",\n        \"fsub dword [ebp + -0x4]\",\n        \"fld dword [0x0855313c]\",\n        \"fmulp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x2c\",\n        \"fld dword [ebp + -0x8]\",\n        \"fadd dword [ebp + -0x4]\",\n        \"fld dword [0x0855313c]\",\n        \"fmulp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x60\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x20\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x64\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x24\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x60\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x60\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x20\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x64\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x64\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x24\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x20\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x08553148]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x0855314c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x24\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x08553148]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x08553140]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x58\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x18\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x1c\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x5c\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x58\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x58\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x18\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x5c\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x5c\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x1c\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"lea edx,[eax + 0x18]\",\n        \"mov eax,dword [ebp + -0x4]\",\n        \"mov dword [edx],eax\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"lea edx,[eax + 0x1c]\",\n        \"mov eax,dword [ebp + -0x8]\",\n        \"mov dword [edx],eax\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x10\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x50\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x14\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x54\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x50\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x50\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x10\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x54\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x54\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x14\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x10\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x08553140]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x08553148]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x14\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x08553148]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x0855314c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x8\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x48\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0xc\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x4c\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x48\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x48\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x8\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x4c\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x4c\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0xc\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x8\",\n        \"fld dword [ebp + -0x4]\",\n        \"fadd dword [ebp + -0x8]\",\n        \"fld dword [0x0855313c]\",\n        \"fmulp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0xc\",\n        \"fld dword [ebp + -0x4]\",\n        \"fsub dword [ebp + -0x8]\",\n        \"fld dword [0x0855313c]\",\n        \"fmulp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x40\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x4\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x44\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"lea edx,[eax + 0x40]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x40\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"fld dword [eax]\",\n        \"faddp\",\n        \"fstp dword [edx]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x44\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x44\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x4\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x08553148]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x08553140]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x4\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x08553140]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x08553144]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"mov dword [esp],eax\",\n        \"call 0x0816de98\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x40\",\n        \"mov dword [esp],eax\",\n        \"call 0x0816de98\",\n        \"leave\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str w9, [x8, #-4]!\",\n        \"mov x9, x8\",\n        \"sub w8, w8, #0x14 (20)\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x78 (120)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x38 (56)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x7c (124)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x3c (60)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x78 (120)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x78 (120)\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x38 (56)\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x7c (124)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x7c (124)\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x3c (60)\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w5, w4, #0x38 (56)\",\n        \"ldur w4, [x9, #-8]\",\n        \"str w4, [x5]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w5, w4, #0x3c (60)\",\n        \"ldur w4, [x9, #-4]\",\n        \"str w4, [x5]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x70 (112)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x30 (48)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x74 (116)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x34 (52)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x70 (112)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x70 (112)\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x30 (48)\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x74 (116)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x74 (116)\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x34 (52)\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x30 (48)\",\n        \"ldur s2, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w20, #0x3140\",\n        \"movk w20, #0x855, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"mov w21, #0x3144\",\n        \"movk w21, #0x855, lsl #16\",\n        \"ldr s4, [x21]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x34 (52)\",\n        \"ldur s2, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w22, #0x3148\",\n        \"movk w22, #0x855, lsl #16\",\n        \"ldr s3, [x22]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x68 (104)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x28 (40)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x6c (108)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x2c (44)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x68 (104)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x68 (104)\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x28 (40)\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x6c (108)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x6c (108)\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x2c (44)\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x28 (40)\",\n        \"ldur s2, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"mov w23, #0x313c\",\n        \"movk w23, #0x855, lsl #16\",\n        \"ldr s3, [x23]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x2c (44)\",\n        \"ldur s2, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x23]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x60 (96)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x20 (32)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x64 (100)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x24 (36)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x60 (96)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x60 (96)\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x20 (32)\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x64 (100)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x64 (100)\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x24 (36)\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x20 (32)\",\n        \"ldur s2, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x22]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"mov w12, #0x314c\",\n        \"movk w12, #0x855, lsl #16\",\n        \"ldr s4, [x12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x24 (36)\",\n        \"ldur s2, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x22]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x58 (88)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x18 (24)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x1c (28)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x5c (92)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x58 (88)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x58 (88)\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x18 (24)\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x5c (92)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x5c (92)\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x1c (28)\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w5, w4, #0x18 (24)\",\n        \"ldur w4, [x9, #-4]\",\n        \"str w4, [x5]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w5, w4, #0x1c (28)\",\n        \"ldur w4, [x9, #-8]\",\n        \"str w4, [x5]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x10 (16)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x50 (80)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x14 (20)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x54 (84)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x50 (80)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x50 (80)\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x10 (16)\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x54 (84)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x54 (84)\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x14 (20)\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x10 (16)\",\n        \"ldur s2, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x22]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x14 (20)\",\n        \"ldur s2, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x22]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x8 (8)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x48 (72)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0xc (12)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x4c (76)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x48 (72)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x48 (72)\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x8 (8)\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x4c (76)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x4c (76)\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0xc (12)\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x8 (8)\",\n        \"ldur s2, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x23]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0xc (12)\",\n        \"ldur s2, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x23]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x40 (64)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x4 (4)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x44 (68)\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w5, w4, #0x40 (64)\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x40 (64)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"ldr s3, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x5]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x44 (68)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x44 (68)\",\n        \"ldr s2, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x4 (4)\",\n        \"ldr s3, [x5]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldur s2, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x22]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr w4, [x9, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"adds w26, w4, #0x4 (4)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\",\n        \"ldur s2, [x9, #-4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldur s3, [x9, #-8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x21]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v4.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"str w4, [x8]\",\n        \"mov w20, #0x47c\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"cfinv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x8\",\n        \"sub w21, w23, w21\",\n        \"mov w23, #0xe0e0\",\n        \"lsr w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/x87.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"CSSC\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"fadd dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xd8 !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xd8 !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcom dword [rax]\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xd8 !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcomp dword [rax]\": {\n      \"ExpectedInstructionCount\": 37,\n      \"Comment\": [\n        \"0xd8 !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsub dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xd8 !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xd8 !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xd8 !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xd8 !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd8 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st3\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st4\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st5\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st6\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st7\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd8 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st3\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st4\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st5\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st6\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st7\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcom st0, st0\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xd8 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcom st0, st1\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 11b 0xd1 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcom st0, st2\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 11b 0xd2 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcom st0, st3\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 11b 0xd3 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcom st0, st4\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 11b 0xd4 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcom st0, st5\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 11b 0xd5 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcom st0, st6\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 11b 0xd6 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcom st0, st7\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 11b 0xd7 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcomp st0, st0\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xd8 11b 0xd8 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st1\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"0xd8 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x22, x0\",\n        \"ubfx x23, x22, #1, #1\",\n        \"ubfx x24, x22, #0, #1\",\n        \"ubfx x22, x22, #2, #1\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"strb w22, [x28, #1040]\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st2\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xd8 11b 0xda /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st3\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xd8 11b 0xdb /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st4\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xd8 11b 0xdc /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st5\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xd8 11b 0xdd /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st6\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xd8 11b 0xde /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st7\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xd8 11b 0xdf /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsub st0, st0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd8 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st3\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st4\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st5\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st6\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st7\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr st0, st0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd8 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr st0, st1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st3\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st4\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st5\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st6\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st7\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdiv st0, st0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd8 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st3\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st4\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st5\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st6\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st7\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr st0, st0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd8 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr st0, st1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st3\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st4\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st5\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st6\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st7\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fld dword [rax]\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xd9 !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst dword [rax]\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xd9 !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\"\n      ]\n    },\n    \"fstp dword [rax]\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xd9 !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldenv [rax]\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xd9 !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"strh w20, [x28, #1200]\",\n        \"add x20, x4, #0x4 (4)\",\n        \"ldr w20, [x20]\",\n        \"ubfx w21, w20, #11, #3\",\n        \"strb w21, [x28, #1051]\",\n        \"ubfx w21, w20, #8, #1\",\n        \"ubfx w22, w20, #9, #1\",\n        \"ubfx w23, w20, #10, #1\",\n        \"ubfx w24, w20, #14, #1\",\n        \"ubfx w20, w20, #0, #1\",\n        \"strb w21, [x28, #1048]\",\n        \"strb w22, [x28, #1049]\",\n        \"strb w23, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\",\n        \"add x20, x4, #0x8 (8)\",\n        \"ldr w20, [x20]\",\n        \"and w20, w20, w20, lsr #1\",\n        \"mov w21, #0x55555555\",\n        \"bic w20, w21, w20\",\n        \"orr w20, w20, w20, lsr #1\",\n        \"and w20, w20, #0x33333333\",\n        \"orr w20, w20, w20, lsr #2\",\n        \"and w20, w20, #0xf0f0f0f\",\n        \"orr w20, w20, w20, lsr #4\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldcw [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xd9 !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"strh w20, [x28, #1200]\"\n      ]\n    },\n    \"fnstenv [rax]\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xd9 !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #1200]\",\n        \"str w20, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"str w20, [x4, #4]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"orr w20, w20, w20, lsl #4\",\n        \"and w20, w20, #0xf0f0f0f\",\n        \"orr w20, w20, w20, lsl #2\",\n        \"and w20, w20, #0x33333333\",\n        \"orr w20, w20, w20, lsl #1\",\n        \"and w20, w20, #0x55555555\",\n        \"orr w20, w20, w20, lsl #1\",\n        \"eor w20, w20, #0xffff\",\n        \"str w20, [x4, #8]\",\n        \"str wzr, [x4, #12]\",\n        \"str wzr, [x4, #16]\",\n        \"str wzr, [x4, #20]\",\n        \"str wzr, [x4, #24]\"\n      ]\n    },\n    \"fnstcw [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xd9 !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #1200]\",\n        \"strh w20, [x4]\"\n      ]\n    },\n    \"fld st0\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xd9 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st3\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st4\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st5\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st6\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st7\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"strb w20, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fxch st0, st0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xd9 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1049]\"\n      ]\n    },\n    \"fxch st0, st1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str q3, [x21, #1056]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str q3, [x21, #1056]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st3\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str q3, [x21, #1056]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st4\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str q3, [x21, #1056]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st5\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str q3, [x21, #1056]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st6\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str q3, [x21, #1056]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st7\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str q3, [x21, #1056]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fnop\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"0xd9 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"fchs\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xd9 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"ldr q3, [x28, #3552]\",\n        \"eor v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fabs\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xd9 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"ldr q3, [x28, #3552]\",\n        \"bic v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"ftst\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"0xd9 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"mov w20, #0x0\",\n        \"fmov d3, x20\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fxam\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"mov x21, v2.d[1]\",\n        \"ubfx x21, x21, #15, #1\",\n        \"strb w21, [x28, #1049]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"lsr w20, w21, w20\",\n        \"and w20, w20, #0x1\",\n        \"mrs x21, nzcv\",\n        \"cmp w20, #0x1 (1)\",\n        \"cset x22, ne\",\n        \"strb w22, [x28, #1048]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fld1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3328]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldl2t\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3344]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldl2e\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3360]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldpi\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3376]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldlg2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3392]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldln2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3408]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldz\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"f2xm1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xd9 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1856]\",\n        \"ldr x3, [x28, #1864]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fyl2x\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q2, [x22, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2080]\",\n        \"ldr x3, [x28, #2088]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x22, #1056]\"\n      ]\n    },\n    \"fptan\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"0xd9 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1872]\",\n        \"ldr x3, [x28, #1880]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q3, [x28, #3328]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb w20, [x28, #1051]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"str q3, [x22, #1056]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fpatan\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2096]\",\n        \"ldr x3, [x28, #2104]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w20, [x28, #1051]\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fxtract\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"0xd9 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1952]\",\n        \"ldr x3, [x28, #1960]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1968]\",\n        \"ldr x3, [x28, #1976]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"str q3, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0x303\",\n        \"lsr w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fprem1\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2112]\",\n        \"ldr x3, [x28, #2120]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1050]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdecstp\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xd9 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"fincstp\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xd9 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"fprem\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2128]\",\n        \"ldr x3, [x28, #2136]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1050]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fyl2xp1\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xd9 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3328]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2080]\",\n        \"ldr x3, [x28, #2088]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb w20, [x28, #1051]\",\n        \"str q3, [x22, #1056]\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsqrt\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xd9 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1888]\",\n        \"ldr x3, [x28, #1896]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsincos\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"0xd9 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1936]\",\n        \"ldr x3, [x28, #1944]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"mov v4.16b, v1.16b\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb w20, [x28, #1051]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"str q4, [x22, #1056]\",\n        \"str q3, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"frndint\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xd9 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1840]\",\n        \"ldr x3, [x28, #1848]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fscale\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2144]\",\n        \"ldr x3, [x28, #2152]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsin\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1904]\",\n        \"ldr x3, [x28, #1912]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1050]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcos\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1920]\",\n        \"ldr x3, [x28, #1928]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1050]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fiadd dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xda !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fimul dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xda !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"ficom dword [rax]\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xda !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"ficomp dword [rax]\": {\n      \"ExpectedInstructionCount\": 37,\n      \"Comment\": [\n        \"0xda !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisub dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xda !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fisubr dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xda !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fidiv dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xda !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fidivr dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xda !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda 11b 0xd0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st0\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xda 11b 0xd8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xd9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xda /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st3\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st4\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st5\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st6\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xde /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st7\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fucompp\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xda 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xc0c0\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fild dword [rax]\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"sxtw x20, w20\",\n        \"mrs x21, nzcv\",\n        \"mov w22, #0x0\",\n        \"cmp x20, #0x0 (0)\",\n        \"mov w23, #0x8000\",\n        \"csel x23, x23, x22, lt\",\n        \"cneg x20, x20, mi\",\n        \"mov w24, #0x3f\",\n        \"mov x0, #0x3f\",\n        \"clz x30, x20\",\n        \"sub x30, x0, x30\",\n        \"sub x24, x24, x30\",\n        \"lsl x30, x20, x24\",\n        \"mov w18, #0x403e\",\n        \"sub x24, x18, x24\",\n        \"cmp x20, #0x0 (0)\",\n        \"csel x20, x22, x24, eq\",\n        \"orr x20, x23, x20\",\n        \"fmov d2, x30\",\n        \"fmov v2.D[1], x20\",\n        \"msr nzcv, x21\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisttp dword [rax]\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdb !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1760]\",\n        \"ldr x3, [x28, #1768]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov w21, w0\",\n        \"str w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fist dword [rax]\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1712]\",\n        \"ldr x3, [x28, #1720]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov w20, w0\",\n        \"str w20, [x4]\"\n      ]\n    },\n    \"fistp dword [rax]\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdf !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1712]\",\n        \"ldr x3, [x28, #1720]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov w21, w0\",\n        \"str w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld tword [rax]\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"add x20, x4, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp tword [rax]\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str d2, [x4]\",\n        \"mov x21, v2.d[1]\",\n        \"strh w21, [x4, #8]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcmovnb st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xdb 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xdb 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xdb 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd1 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd2 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd3 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd4 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd5 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd6 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd7 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st0\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xd8 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xda /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st3\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdb /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st4\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdc /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st5\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdd /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st6\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xde /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st7\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdf /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fnclex\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xdb 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1040]\"\n      ]\n    },\n    \"fninit\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdb 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x37f\",\n        \"strh w20, [x28, #1200]\",\n        \"strb wzr, [x28, #1051]\",\n        \"strb wzr, [x28, #1202]\",\n        \"strb wzr, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb wzr, [x28, #1054]\",\n        \"strb wzr, [x28, #1040]\"\n      ]\n    },\n    \"fucomi st0, st0\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xdb 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucomi st0, st1\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdb 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucomi st0, st2\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdb 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucomi st0, st3\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdb 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucomi st0, st4\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdb 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucomi st0, st5\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdb 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucomi st0, st6\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdb 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucomi st0, st7\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdb 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcomi st0, st0\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xdb 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcomi st0, st1\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdb 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcomi st0, st2\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdb 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcomi st0, st3\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdb 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcomi st0, st4\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdb 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcomi st0, st5\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdb 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcomi st0, st6\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdb 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcomi st0, st7\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdb 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"rmif x21, #63, #nzCv\",\n        \"rmif x22, #62, #nZcv\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fadd qword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xdc !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul qword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xdc !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcom qword [rax]\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xdc !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcomp qword [rax]\": {\n      \"ExpectedInstructionCount\": 37,\n      \"Comment\": [\n        \"0xdc !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsub qword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xdc !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr qword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xdc !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv qword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xdc !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr qword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xdc !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xc0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"fadd st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st1, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st2, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st3, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st4, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st5, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st6, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st7, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xc8\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"fmul st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st1, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st2, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st3, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st4, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st5, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st6, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st7, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xe0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"fsubr st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr st1, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st2, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st3, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st4, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st5, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st6, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st7, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xe8\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"fsub st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st1, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st2, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st3, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st4, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st5, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st6, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st7, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xf0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"fdivr st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr st1, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st2, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st3, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st4, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st5, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st6, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st7, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xf8\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"fdiv st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st1, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st2, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st3, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st4, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st5, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st6, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st7, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fld qword [rax]\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdd !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisttp qword [rax]\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdd !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1776]\",\n        \"ldr x3, [x28, #1784]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"str x21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst qword [rax]\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdd !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"str d2, [x4]\"\n      ]\n    },\n    \"fstp qword [rax]\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdd !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"str d2, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"frstor [rax]\": {\n      \"ExpectedInstructionCount\": 76,\n      \"Comment\": [\n        \"0xdd !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"strh w20, [x28, #1200]\",\n        \"ldr w20, [x4, #4]\",\n        \"ubfx w21, w20, #11, #3\",\n        \"strb w21, [x28, #1051]\",\n        \"ubfx w22, w20, #8, #1\",\n        \"ubfx w23, w20, #9, #1\",\n        \"ubfx w24, w20, #10, #1\",\n        \"ubfx w30, w20, #14, #1\",\n        \"ubfx w20, w20, #0, #1\",\n        \"strb w22, [x28, #1048]\",\n        \"strb w23, [x28, #1049]\",\n        \"strb w24, [x28, #1050]\",\n        \"strb w30, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\",\n        \"ldr w20, [x4, #8]\",\n        \"and w20, w20, w20, lsr #1\",\n        \"mov w22, #0x55555555\",\n        \"bic w20, w22, w20\",\n        \"orr w20, w20, w20, lsr #1\",\n        \"and w20, w20, #0x33333333\",\n        \"orr w20, w20, w20, lsr #2\",\n        \"and w20, w20, #0xf0f0f0f\",\n        \"orr w20, w20, w20, lsr #4\",\n        \"strb w20, [x28, #1202]\",\n        \"mov x20, #0xffffffffffffffff\",\n        \"mov w22, #0xffff\",\n        \"fmov d2, x20\",\n        \"fmov v2.D[1], x22\",\n        \"ldur q3, [x4, #28]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"add x0, x28, x21, lsl #4\",\n        \"str q3, [x0, #1056]\",\n        \"add w20, w21, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #38]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str q3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldr q3, [x4, #48]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str q3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #58]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str q3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #68]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str q3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #78]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str q3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #88]\",\n        \"and v2.16b, v3.16b, v2.16b\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str q2, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur d2, [x4, #98]\",\n        \"ldr h3, [x4, #106]\",\n        \"mov v2.h[4], v3.h[0]\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str q2, [x0, #1056]\"\n      ]\n    },\n    \"fnsave [rax]\": {\n      \"ExpectedInstructionCount\": 79,\n      \"Comment\": [\n        \"0xdd !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrh w21, [x28, #1200]\",\n        \"str w21, [x4]\",\n        \"ldrb w21, [x28, #1051]\",\n        \"lsl x21, x21, #11\",\n        \"ldrb w22, [x28, #1048]\",\n        \"orr x21, x21, x22, lsl #8\",\n        \"ldrb w22, [x28, #1049]\",\n        \"orr x21, x21, x22, lsl #9\",\n        \"ldrb w22, [x28, #1050]\",\n        \"orr x21, x21, x22, lsl #10\",\n        \"ldrb w22, [x28, #1054]\",\n        \"orr x21, x21, x22, lsl #14\",\n        \"ldrb w22, [x28, #1040]\",\n        \"orr x21, x21, x22\",\n        \"str w21, [x4, #4]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"orr w21, w21, w21, lsl #4\",\n        \"and w21, w21, #0xf0f0f0f\",\n        \"orr w21, w21, w21, lsl #2\",\n        \"and w21, w21, #0x33333333\",\n        \"orr w21, w21, w21, lsl #1\",\n        \"and w21, w21, #0x55555555\",\n        \"orr w21, w21, w21, lsl #1\",\n        \"eor w21, w21, #0xffff\",\n        \"str w21, [x4, #8]\",\n        \"str wzr, [x4, #12]\",\n        \"str wzr, [x4, #16]\",\n        \"str wzr, [x4, #20]\",\n        \"str wzr, [x4, #24]\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"stur q2, [x4, #28]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"stur q2, [x4, #38]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #48]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"stur q2, [x4, #58]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"stur q2, [x4, #68]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"stur q2, [x4, #78]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"stur q2, [x4, #88]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"stur d2, [x4, #98]\",\n        \"dup v2.8h, v2.h[4]\",\n        \"str h2, [x4, #106]\",\n        \"mov w20, #0x37f\",\n        \"strh w20, [x28, #1200]\",\n        \"strb wzr, [x28, #1051]\",\n        \"strb wzr, [x28, #1202]\",\n        \"strb wzr, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb wzr, [x28, #1054]\",\n        \"strb wzr, [x28, #1040]\"\n      ]\n    },\n    \"fnstsw [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdd !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"strh w20, [x4]\"\n      ]\n    },\n    \"fld and fnstsw\": {\n      \"x86InstructionCount\": 5,\n      \"ExpectedInstructionCount\": 83,\n      \"x86Insts\": [\n        \"fld dword [rax]\",\n        \"fld dword [rax + 4]\",\n        \"fld dword [rax + 8]\",\n        \"fld dword [rax + 12]\",\n        \"fnstsw [rbx]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub sp, sp, #0x20 (32)\",\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr s3, [x4, #4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s3\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"ldr s4, [x4, #8]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s4\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v4.16b, v0.16b\",\n        \"ldr s5, [x4, #12]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s5\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v5.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q5, [x21, #1056]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"add x22, x28, x22, lsl #4\",\n        \"str q4, [x22, #1056]\",\n        \"add w23, w20, #0x2 (2)\",\n        \"and w23, w23, #0x7\",\n        \"add x23, x28, x23, lsl #4\",\n        \"str q3, [x23, #1056]\",\n        \"add w24, w20, #0x3 (3)\",\n        \"and w24, w24, #0x7\",\n        \"add x24, x28, x24, lsl #4\",\n        \"str q2, [x24, #1056]\",\n        \"ldrb w30, [x28, #1202]\",\n        \"mov w18, #0x8\",\n        \"sub w18, w18, w20\",\n        \"str x24, [sp]\",\n        \"mov w24, #0xf0f\",\n        \"lsr w24, w24, w18\",\n        \"orr w24, w30, w24\",\n        \"strb w24, [x28, #1202]\",\n        \"lsl x30, x20, #11\",\n        \"ldrb w18, [x28, #1048]\",\n        \"orr x30, x30, x18, lsl #8\",\n        \"ldrb w18, [x28, #1049]\",\n        \"orr x30, x30, x18, lsl #9\",\n        \"ldrb w18, [x28, #1050]\",\n        \"orr x30, x30, x18, lsl #10\",\n        \"ldrb w18, [x28, #1054]\",\n        \"orr x30, x30, x18, lsl #14\",\n        \"ldrb w18, [x28, #1040]\",\n        \"orr x30, x30, x18\",\n        \"strh w30, [x6]\",\n        \"str q5, [x21, #1056]\",\n        \"str q4, [x22, #1056]\",\n        \"str q3, [x23, #1056]\",\n        \"ldr x21, [sp]\",\n        \"str q2, [x21, #1056]\",\n        \"mov w21, #0x8\",\n        \"sub w20, w21, w20\",\n        \"mov w21, #0xf0f\",\n        \"lsr w20, w21, w20\",\n        \"orr w20, w24, w20\",\n        \"strb w20, [x28, #1202]\",\n        \"add sp, sp, #0x20 (32)\"\n      ]\n    },\n    \"ffree st0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdd 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st3\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st4\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st5\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st6\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st7\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"0xdd 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"fst st1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd1 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd2 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st3\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd3 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st4\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd4 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st5\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd5 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st6\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd6 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st7\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd7 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st0\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdd 11b 0xd8 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xdd 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xda /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st3\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdb /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st4\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdc /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st5\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdd /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st6\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xde /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st7\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdf /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucom st0\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xdd 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucom st1\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdd 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucom st2\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdd 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucom st3\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdd 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucom st4\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdd 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucom st5\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdd 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucom st6\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdd 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucom st7\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdd 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucomp st0\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xdd 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st1\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"0xdd 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x22, x0\",\n        \"ubfx x23, x22, #1, #1\",\n        \"ubfx x24, x22, #0, #1\",\n        \"ubfx x22, x22, #2, #1\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"strb w22, [x28, #1040]\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st2\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdd 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st3\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdd 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st4\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdd 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st5\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdd 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st6\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdd 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st7\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdd 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fiadd word [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xde !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fimul word [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xde !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"ficom word [rax]\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xde !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"ficomp word [rax]\": {\n      \"ExpectedInstructionCount\": 37,\n      \"Comment\": [\n        \"0xde !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisub word [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xde !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fisubr word [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xde !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fidiv word [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xde !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fidivr word [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xde !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"faddp st0\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xd8 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st1\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xde 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st2\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st3\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st4\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st5\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st6\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st7\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st0\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xde 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st1\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xde 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st2\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st3\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st4\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st5\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st6\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st7\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcompp\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xde 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xc0c0\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xe0\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"fsubrp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st1, st0\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xde 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q2, [x22, #1056]\",\n        \"add x23, x28, x20, lsl #4\",\n        \"ldr q3, [x23, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st2, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st3, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st4, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st5, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st6, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st7, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xe8\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"fsubp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st1, st0\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xde 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st2, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st3, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st4, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st5, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st6, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st7, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xf0\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"fdivrp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st1, st0\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xde 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q2, [x22, #1056]\",\n        \"add x23, x28, x20, lsl #4\",\n        \"ldr q3, [x23, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st2, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st3, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st4, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st5, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st6, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st7, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xf8\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"fdivp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st1, st0\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xde 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st2, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st3, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st4, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st5, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st6, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st7, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fild word [rax]\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"mrs x21, nzcv\",\n        \"mov w22, #0x0\",\n        \"cmp x20, #0x0 (0)\",\n        \"mov w23, #0x8000\",\n        \"csel x23, x23, x22, lt\",\n        \"cneg x20, x20, mi\",\n        \"mov w24, #0x3f\",\n        \"mov x0, #0x3f\",\n        \"clz x30, x20\",\n        \"sub x30, x0, x30\",\n        \"sub x24, x24, x30\",\n        \"lsl x30, x20, x24\",\n        \"mov w18, #0x403e\",\n        \"sub x24, x18, x24\",\n        \"cmp x20, #0x0 (0)\",\n        \"csel x20, x22, x24, eq\",\n        \"orr x20, x23, x20\",\n        \"fmov d2, x30\",\n        \"fmov v2.D[1], x20\",\n        \"msr nzcv, x21\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisttp word [rax]\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"0xdf !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"mov x21, v2.d[1]\",\n        \"and x21, x21, #0x7fff\",\n        \"mrs x22, nzcv\",\n        \"tst x21, #0x7fff\",\n        \"cset x23, eq\",\n        \"mov w24, #0x400e\",\n        \"cmp x21, x24\",\n        \"cset x21, hs\",\n        \"orr x21, x23, x21\",\n        \"strb w21, [x28, #1040]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1744]\",\n        \"ldr x3, [x28, #1752]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov w21, w0\",\n        \"strh w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x22\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fist word [rax]\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xdf !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"mov x20, v2.d[1]\",\n        \"and x20, x20, #0x7fff\",\n        \"mrs x21, nzcv\",\n        \"tst x20, #0x7fff\",\n        \"cset x22, eq\",\n        \"mov w23, #0x400e\",\n        \"cmp x20, x23\",\n        \"cset x20, hs\",\n        \"orr x20, x22, x20\",\n        \"strb w20, [x28, #1040]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1696]\",\n        \"ldr x3, [x28, #1704]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov w20, w0\",\n        \"strh w20, [x4]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fistp word [rax]\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"0xdf !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"mov x21, v2.d[1]\",\n        \"and x21, x21, #0x7fff\",\n        \"mrs x22, nzcv\",\n        \"tst x21, #0x7fff\",\n        \"cset x23, eq\",\n        \"mov w24, #0x400e\",\n        \"cmp x21, x24\",\n        \"cset x21, hs\",\n        \"orr x21, x23, x21\",\n        \"strb w21, [x28, #1040]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1696]\",\n        \"ldr x3, [x28, #1704]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov w21, w0\",\n        \"strh w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x22\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fbld tword [rax]\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xdf !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"add x20, x4, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #2000]\",\n        \"ldr x3, [x28, #2008]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fbstp tword [rax]\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xdf !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1984]\",\n        \"ldr x3, [x28, #1992]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str d2, [x4]\",\n        \"mov x21, v2.d[1]\",\n        \"strh w21, [x4, #8]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffreep st0\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st3\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st4\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st5\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st6\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st7\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"fnstsw ax\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdf 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"fucomip st0\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xdf 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"rmif x23, #62, #nZcv\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st1\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"0xdf 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x22, x0\",\n        \"ubfx x23, x22, #1, #1\",\n        \"ubfx x24, x22, #0, #1\",\n        \"ubfx x22, x22, #2, #1\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"eor x23, x23, #0x1\",\n        \"rmif x23, #63, #nzCv\",\n        \"rmif x24, #62, #nZcv\",\n        \"eor w26, w22, #0x1\",\n        \"strb w22, [x28, #1040]\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st2\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"rmif x23, #62, #nZcv\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st3\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"rmif x23, #62, #nZcv\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st4\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"rmif x23, #62, #nZcv\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st5\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"rmif x23, #62, #nZcv\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st6\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"rmif x23, #62, #nZcv\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st7\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"rmif x23, #62, #nZcv\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st0\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xdf 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"rmif x23, #62, #nZcv\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st1\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"0xdf 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x22, x0\",\n        \"ubfx x23, x22, #1, #1\",\n        \"ubfx x24, x22, #0, #1\",\n        \"ubfx x22, x22, #2, #1\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"eor x23, x23, #0x1\",\n        \"rmif x23, #63, #nzCv\",\n        \"rmif x24, #62, #nZcv\",\n        \"eor w26, w22, #0x1\",\n        \"strb w22, [x28, #1040]\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st2\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"rmif x23, #62, #nZcv\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st3\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"rmif x23, #62, #nZcv\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st4\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"rmif x23, #62, #nZcv\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st5\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"rmif x23, #62, #nZcv\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st6\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"rmif x23, #62, #nZcv\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st7\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"rmif x22, #63, #nzCv\",\n        \"rmif x23, #62, #nZcv\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"memcpy4_32\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 16,\n      \"x86Insts\": [\n        \"fld dword [rax]\",\n        \"fstp dword [rdx]\",\n        \"fld dword [rax + 4]\",\n        \"fstp dword [rdx + 4]\",\n        \"fld dword [rax + 8]\",\n        \"fstp dword [rdx + 8]\",\n        \"fld dword [rax + 12]\",\n        \"fstp dword [rdx + 12]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str s2, [x5]\",\n        \"ldr s2, [x4, #4]\",\n        \"str s2, [x5, #4]\",\n        \"ldr s2, [x4, #8]\",\n        \"str s2, [x5, #8]\",\n        \"ldr s2, [x4, #12]\",\n        \"str s2, [x5, #12]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"memcpy4_64\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 16,\n      \"x86Insts\": [\n        \"fld qword [rax]\",\n        \"fstp qword [rdx]\",\n        \"fld qword [rax + 8]\",\n        \"fstp qword [rdx + 8]\",\n        \"fld qword [rax + 16]\",\n        \"fstp qword [rdx + 16]\",\n        \"fld qword [rax + 32]\",\n        \"fstp qword [rdx + 32]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str d2, [x5]\",\n        \"ldr d2, [x4, #8]\",\n        \"str d2, [x5, #8]\",\n        \"ldr d2, [x4, #16]\",\n        \"str d2, [x5, #16]\",\n        \"ldr d2, [x4, #32]\",\n        \"str d2, [x5, #32]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"memcpy4_80\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 38,\n      \"x86Insts\": [\n        \"fld tword [rax]\",\n        \"fstp tword [rdx]\",\n        \"fld tword [rax + 10]\",\n        \"fstp tword [rdx + 10]\",\n        \"fld tword [rax + 20]\",\n        \"fstp tword [rdx + 20]\",\n        \"fld tword [rax + 30]\",\n        \"fstp tword [rdx + 30]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"add x20, x4, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"str d2, [x5]\",\n        \"mov x20, v2.d[1]\",\n        \"strh w20, [x5, #8]\",\n        \"add x20, x4, #0xa (10)\",\n        \"ldr d2, [x20]\",\n        \"add x20, x20, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"stur d2, [x5, #10]\",\n        \"mov x20, v2.d[1]\",\n        \"add x21, x5, #0xa (10)\",\n        \"strh w20, [x21, #8]\",\n        \"add x20, x4, #0x14 (20)\",\n        \"ldr d2, [x20]\",\n        \"add x20, x20, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"stur d2, [x5, #20]\",\n        \"mov x20, v2.d[1]\",\n        \"add x21, x5, #0x14 (20)\",\n        \"strh w20, [x21, #8]\",\n        \"add x20, x4, #0x1e (30)\",\n        \"ldr d2, [x20]\",\n        \"add x20, x20, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"stur d2, [x5, #30]\",\n        \"mov x20, v2.d[1]\",\n        \"add x21, x5, #0x1e (30)\",\n        \"strh w20, [x21, #8]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/x87_f64-Crysis2Max-fmodel.json",
    "content": "{\n  \"Features\": {\n    \"Env\": {\n      \"FEX_X87REDUCEDPRECISION\": \"1\"\n    },\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"Block1\": {\n      \"x86Insts\": [\n        \"push ebp\",\n        \"mov ebp,esp\",\n        \"sub esp,0x104\",\n        \"mov eax,dword  [ebp + 0x10]\",\n        \"fld dword  [eax]\",\n        \"mov ecx,dword  [0x100de354]\",\n        \"fadd dword  [eax + 0x7c]\",\n        \"fstp dword  [ebp + -0x80]\",\n        \"fld dword  [eax]\",\n        \"fsub dword  [eax + 0x7c]\",\n        \"fmul dword  [ecx]\",\n        \"fstp dword  [ebp + -0x4]\",\n        \"fld dword  [eax + 0x78]\",\n        \"fadd dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + -0x7c]\",\n        \"fld dword  [eax + 0x4]\",\n        \"fsub dword  [eax + 0x78]\",\n        \"fmul dword  [ecx + 0x4]\",\n        \"fstp dword  [ebp + -0x8]\",\n        \"fld dword  [eax + 0x74]\",\n        \"fadd dword  [eax + 0x8]\",\n        \"fstp dword  [ebp + -0x78]\",\n        \"fld dword  [eax + 0x8]\",\n        \"fsub dword  [eax + 0x74]\",\n        \"fmul dword  [ecx + 0x8]\",\n        \"fstp dword  [ebp + -0xc]\",\n        \"fld dword  [eax + 0x70]\",\n        \"fadd dword  [eax + 0xc]\",\n        \"fstp dword  [ebp + -0x74]\",\n        \"fld dword  [eax + 0xc]\",\n        \"fsub dword  [eax + 0x70]\",\n        \"fmul dword  [ecx + 0xc]\",\n        \"fstp dword  [ebp + -0x10]\",\n        \"fld dword  [eax + 0x6c]\",\n        \"fadd dword  [eax + 0x10]\",\n        \"fstp dword  [ebp + -0x70]\",\n        \"fld dword  [eax + 0x10]\",\n        \"fsub dword  [eax + 0x6c]\",\n        \"fmul dword  [ecx + 0x10]\",\n        \"fstp dword  [ebp + -0x14]\",\n        \"fld dword  [eax + 0x68]\",\n        \"fadd dword  [eax + 0x14]\",\n        \"fstp dword  [ebp + -0x6c]\",\n        \"fld dword  [eax + 0x14]\",\n        \"fsub dword  [eax + 0x68]\",\n        \"fmul dword  [ecx + 0x14]\",\n        \"fstp dword  [ebp + -0x18]\",\n        \"fld dword  [eax + 0x64]\",\n        \"fadd dword  [eax + 0x18]\",\n        \"fstp dword  [ebp + -0x68]\",\n        \"fld dword  [eax + 0x18]\",\n        \"fsub dword  [eax + 0x64]\",\n        \"fmul dword  [ecx + 0x18]\",\n        \"fstp dword  [ebp + -0x1c]\",\n        \"fld dword  [eax + 0x60]\",\n        \"fadd dword  [eax + 0x1c]\",\n        \"fstp dword  [ebp + -0x64]\",\n        \"fld dword  [eax + 0x1c]\",\n        \"fsub dword  [eax + 0x60]\",\n        \"fmul dword  [ecx + 0x1c]\",\n        \"fstp dword  [ebp + -0x20]\",\n        \"fld dword  [eax + 0x5c]\",\n        \"fadd dword  [eax + 0x20]\",\n        \"fstp dword  [ebp + -0x60]\",\n        \"fld dword  [eax + 0x20]\",\n        \"fsub dword  [eax + 0x5c]\",\n        \"fmul dword  [ecx + 0x20]\",\n        \"fstp dword  [ebp + -0x24]\",\n        \"fld dword  [eax + 0x58]\",\n        \"fadd dword  [eax + 0x24]\",\n        \"fstp dword  [ebp + -0x5c]\",\n        \"fld dword  [eax + 0x24]\",\n        \"fsub dword  [eax + 0x58]\",\n        \"fmul dword  [ecx + 0x24]\",\n        \"fstp dword  [ebp + -0x28]\",\n        \"fld dword  [eax + 0x54]\",\n        \"fadd dword  [eax + 0x28]\",\n        \"fstp dword  [ebp + -0x58]\",\n        \"fld dword  [eax + 0x28]\",\n        \"fsub dword  [eax + 0x54]\",\n        \"fmul dword  [ecx + 0x28]\",\n        \"fstp dword  [ebp + -0x2c]\",\n        \"fld dword  [eax + 0x50]\",\n        \"fadd dword  [eax + 0x2c]\",\n        \"fstp dword  [ebp + -0x54]\",\n        \"fld dword  [eax + 0x2c]\",\n        \"fsub dword  [eax + 0x50]\",\n        \"fmul dword  [ecx + 0x2c]\",\n        \"fstp dword  [ebp + -0x30]\",\n        \"fld dword  [eax + 0x4c]\",\n        \"fadd dword  [eax + 0x30]\",\n        \"fstp dword  [ebp + -0x50]\",\n        \"fld dword  [eax + 0x30]\",\n        \"fsub dword  [eax + 0x4c]\",\n        \"fmul dword  [ecx + 0x30]\",\n        \"fstp dword  [ebp + -0x34]\",\n        \"fld dword  [eax + 0x48]\",\n        \"fadd dword  [eax + 0x34]\",\n        \"fstp dword  [ebp + -0x4c]\",\n        \"fld dword  [eax + 0x34]\",\n        \"fsub dword  [eax + 0x48]\",\n        \"fmul dword  [ecx + 0x34]\",\n        \"fstp dword  [ebp + -0x38]\",\n        \"fld dword  [eax + 0x44]\",\n        \"fadd dword  [eax + 0x38]\",\n        \"fstp dword  [ebp + -0x48]\",\n        \"fld dword  [eax + 0x38]\",\n        \"fsub dword  [eax + 0x44]\",\n        \"fmul dword  [ecx + 0x38]\",\n        \"fstp dword  [ebp + -0x3c]\",\n        \"fld dword  [eax + 0x40]\",\n        \"fadd dword  [eax + 0x3c]\",\n        \"fstp dword  [ebp + -0x44]\",\n        \"fld dword  [eax + 0x3c]\",\n        \"fsub dword  [eax + 0x40]\",\n        \"mov eax,[0x100de358]\",\n        \"fmul dword  [ecx + 0x3c]\",\n        \"fstp dword  [ebp + -0x40]\",\n        \"fld dword  [ebp + -0x44]\",\n        \"fadd dword  [ebp + -0x80]\",\n        \"fstp dword  [ebp + 0xffffff00]\",\n        \"fld dword  [ebp + -0x80]\",\n        \"fsub dword  [ebp + -0x44]\",\n        \"fmul dword  [eax]\",\n        \"fstp dword  [ebp + 0xffffff3c]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"fadd dword  [ebp + -0x7c]\",\n        \"fstp dword  [ebp + 0xffffff04]\",\n        \"fld dword  [ebp + -0x7c]\",\n        \"fsub dword  [ebp + -0x48]\",\n        \"fmul dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + 0xffffff38]\",\n        \"fld dword  [ebp + -0x4c]\",\n        \"fadd dword  [ebp + -0x78]\",\n        \"fstp dword  [ebp + 0xffffff08]\",\n        \"fld dword  [ebp + -0x78]\",\n        \"fsub dword  [ebp + -0x4c]\",\n        \"fmul dword  [eax + 0x8]\",\n        \"fstp dword  [ebp + 0xffffff34]\",\n        \"fld dword  [ebp + -0x50]\",\n        \"fadd dword  [ebp + -0x74]\",\n        \"fstp dword  [ebp + 0xffffff0c]\",\n        \"fld dword  [ebp + -0x74]\",\n        \"fsub dword  [ebp + -0x50]\",\n        \"fmul dword  [eax + 0xc]\",\n        \"fstp dword  [ebp + 0xffffff30]\",\n        \"fld dword  [ebp + -0x54]\",\n        \"fadd dword  [ebp + -0x70]\",\n        \"fstp dword  [ebp + 0xffffff10]\",\n        \"fld dword  [ebp + -0x70]\",\n        \"fsub dword  [ebp + -0x54]\",\n        \"fmul dword  [eax + 0x10]\",\n        \"fstp dword  [ebp + 0xffffff2c]\",\n        \"fld dword  [ebp + -0x58]\",\n        \"fadd dword  [ebp + -0x6c]\",\n        \"fstp dword  [ebp + 0xffffff14]\",\n        \"fld dword  [ebp + -0x6c]\",\n        \"fsub dword  [ebp + -0x58]\",\n        \"fmul dword  [eax + 0x14]\",\n        \"fstp dword  [ebp + 0xffffff28]\",\n        \"fld dword  [ebp + -0x5c]\",\n        \"fadd dword  [ebp + -0x68]\",\n        \"fstp dword  [ebp + 0xffffff18]\",\n        \"fld dword  [ebp + -0x68]\",\n        \"fsub dword  [ebp + -0x5c]\",\n        \"fmul dword  [eax + 0x18]\",\n        \"fstp dword  [ebp + 0xffffff24]\",\n        \"fld dword  [ebp + -0x60]\",\n        \"fadd dword  [ebp + -0x64]\",\n        \"fstp dword  [ebp + 0xffffff1c]\",\n        \"fld dword  [ebp + -0x64]\",\n        \"fsub dword  [ebp + -0x60]\",\n        \"fmul dword  [eax + 0x1c]\",\n        \"fstp dword  [ebp + 0xffffff20]\",\n        \"fld dword  [ebp + -0x40]\",\n        \"fadd dword  [ebp + -0x4]\",\n        \"fstp dword  [ebp + 0xffffff40]\",\n        \"fld dword  [ebp + -0x4]\",\n        \"fsub dword  [ebp + -0x40]\",\n        \"fmul dword  [eax]\",\n        \"fstp dword  [ebp + 0xffffff7c]\",\n        \"fld dword  [ebp + -0x3c]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [ebp + 0xffffff44]\",\n        \"fld dword  [ebp + -0x8]\",\n        \"fsub dword  [ebp + -0x3c]\",\n        \"fmul dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + 0xffffff78]\",\n        \"fld dword  [ebp + -0x38]\",\n        \"fadd dword  [ebp + -0xc]\",\n        \"fstp dword  [ebp + 0xffffff48]\",\n        \"fld dword  [ebp + -0xc]\",\n        \"fsub dword  [ebp + -0x38]\",\n        \"fmul dword  [eax + 0x8]\",\n        \"fstp dword  [ebp + 0xffffff74]\",\n        \"fld dword  [ebp + -0x34]\",\n        \"fadd dword  [ebp + -0x10]\",\n        \"fstp dword  [ebp + 0xffffff4c]\",\n        \"fld dword  [ebp + -0x10]\",\n        \"fsub dword  [ebp + -0x34]\",\n        \"fmul dword  [eax + 0xc]\",\n        \"fstp dword  [ebp + 0xffffff70]\",\n        \"fld dword  [ebp + -0x30]\",\n        \"fadd dword  [ebp + -0x14]\",\n        \"fstp dword  [ebp + 0xffffff50]\",\n        \"fld dword  [ebp + -0x14]\",\n        \"fsub dword  [ebp + -0x30]\",\n        \"fmul dword  [eax + 0x10]\",\n        \"fstp dword  [ebp + 0xffffff6c]\",\n        \"fld dword  [ebp + -0x2c]\",\n        \"fadd dword  [ebp + -0x18]\",\n        \"fstp dword  [ebp + 0xffffff54]\",\n        \"fld dword  [ebp + -0x18]\",\n        \"fsub dword  [ebp + -0x2c]\",\n        \"fmul dword  [eax + 0x14]\",\n        \"fstp dword  [ebp + 0xffffff68]\",\n        \"fld dword  [ebp + -0x28]\",\n        \"fadd dword  [ebp + -0x1c]\",\n        \"fstp dword  [ebp + 0xffffff58]\",\n        \"fld dword  [ebp + -0x1c]\",\n        \"fsub dword  [ebp + -0x28]\",\n        \"fmul dword  [eax + 0x18]\",\n        \"fstp dword  [ebp + 0xffffff64]\",\n        \"fld dword  [ebp + -0x24]\",\n        \"fadd dword  [ebp + -0x20]\",\n        \"fstp dword  [ebp + 0xffffff5c]\",\n        \"fld dword  [ebp + -0x20]\",\n        \"fsub dword  [ebp + -0x24]\",\n        \"fmul dword  [eax + 0x1c]\",\n        \"mov eax,[0x100de35c]\",\n        \"fstp dword  [ebp + 0xffffff60]\",\n        \"fld dword  [ebp + 0xffffff1c]\",\n        \"fadd dword  [ebp + 0xffffff00]\",\n        \"fstp dword  [ebp + -0x80]\",\n        \"fld dword  [ebp + 0xffffff00]\",\n        \"fsub dword  [ebp + 0xffffff1c]\",\n        \"fmul dword  [eax]\",\n        \"fstp dword  [ebp + -0x64]\",\n        \"fld dword  [ebp + 0xffffff18]\",\n        \"fadd dword  [ebp + 0xffffff04]\",\n        \"fstp dword  [ebp + -0x7c]\",\n        \"fld dword  [ebp + 0xffffff04]\",\n        \"fsub dword  [ebp + 0xffffff18]\",\n        \"fmul dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + -0x68]\",\n        \"fld dword  [ebp + 0xffffff14]\",\n        \"fadd dword  [ebp + 0xffffff08]\",\n        \"fstp dword  [ebp + -0x78]\",\n        \"fld dword  [ebp + 0xffffff08]\",\n        \"fsub dword  [ebp + 0xffffff14]\",\n        \"fmul dword  [eax + 0x8]\",\n        \"fstp dword  [ebp + -0x6c]\",\n        \"fld dword  [ebp + 0xffffff10]\",\n        \"fadd dword  [ebp + 0xffffff0c]\",\n        \"fstp dword  [ebp + -0x74]\",\n        \"fld dword  [ebp + 0xffffff0c]\",\n        \"fsub dword  [ebp + 0xffffff10]\",\n        \"fmul dword  [eax + 0xc]\",\n        \"fstp dword  [ebp + -0x70]\",\n        \"fld dword  [ebp + 0xffffff20]\",\n        \"fadd dword  [ebp + 0xffffff3c]\",\n        \"fstp dword  [ebp + -0x60]\",\n        \"fld dword  [ebp + 0xffffff3c]\",\n        \"fsub dword  [ebp + 0xffffff20]\",\n        \"fmul dword  [eax]\",\n        \"fstp dword  [ebp + -0x44]\",\n        \"fld dword  [ebp + 0xffffff24]\",\n        \"fadd dword  [ebp + 0xffffff38]\",\n        \"fstp dword  [ebp + -0x5c]\",\n        \"fld dword  [ebp + 0xffffff38]\",\n        \"fsub dword  [ebp + 0xffffff24]\",\n        \"fmul dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + -0x48]\",\n        \"fld dword  [ebp + 0xffffff28]\",\n        \"fadd dword  [ebp + 0xffffff34]\",\n        \"fstp dword  [ebp + -0x58]\",\n        \"fld dword  [ebp + 0xffffff34]\",\n        \"fsub dword  [ebp + 0xffffff28]\",\n        \"fmul dword  [eax + 0x8]\",\n        \"fstp dword  [ebp + -0x4c]\",\n        \"fld dword  [ebp + 0xffffff2c]\",\n        \"fadd dword  [ebp + 0xffffff30]\",\n        \"fstp dword  [ebp + -0x54]\",\n        \"fld dword  [ebp + 0xffffff30]\",\n        \"fsub dword  [ebp + 0xffffff2c]\",\n        \"fmul dword  [eax + 0xc]\",\n        \"fstp dword  [ebp + -0x50]\",\n        \"fld dword  [ebp + 0xffffff5c]\",\n        \"fadd dword  [ebp + 0xffffff40]\",\n        \"fstp dword  [ebp + -0x40]\",\n        \"fld dword  [ebp + 0xffffff40]\",\n        \"fsub dword  [ebp + 0xffffff5c]\",\n        \"fmul dword  [eax]\",\n        \"fstp dword  [ebp + -0x24]\",\n        \"fld dword  [ebp + 0xffffff58]\",\n        \"fadd dword  [ebp + 0xffffff44]\",\n        \"fstp dword  [ebp + -0x3c]\",\n        \"fld dword  [ebp + 0xffffff44]\",\n        \"fsub dword  [ebp + 0xffffff58]\",\n        \"fmul dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + -0x28]\",\n        \"fld dword  [ebp + 0xffffff54]\",\n        \"fadd dword  [ebp + 0xffffff48]\",\n        \"fstp dword  [ebp + -0x38]\",\n        \"fld dword  [ebp + 0xffffff48]\",\n        \"fsub dword  [ebp + 0xffffff54]\",\n        \"fmul dword  [eax + 0x8]\",\n        \"fstp dword  [ebp + -0x2c]\",\n        \"fld dword  [ebp + 0xffffff50]\",\n        \"fadd dword  [ebp + 0xffffff4c]\",\n        \"fstp dword  [ebp + -0x34]\",\n        \"fld dword  [ebp + 0xffffff4c]\",\n        \"fsub dword  [ebp + 0xffffff50]\",\n        \"fmul dword  [eax + 0xc]\",\n        \"fstp dword  [ebp + -0x30]\",\n        \"fld dword  [ebp + 0xffffff60]\",\n        \"fadd dword  [ebp + 0xffffff7c]\",\n        \"fstp dword  [ebp + -0x20]\",\n        \"fld dword  [ebp + 0xffffff7c]\",\n        \"fsub dword  [ebp + 0xffffff60]\",\n        \"fmul dword  [eax]\",\n        \"fstp dword  [ebp + -0x4]\",\n        \"fld dword  [ebp + 0xffffff64]\",\n        \"fadd dword  [ebp + 0xffffff78]\",\n        \"fstp dword  [ebp + -0x1c]\",\n        \"fld dword  [ebp + 0xffffff78]\",\n        \"fsub dword  [ebp + 0xffffff64]\",\n        \"fmul dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + -0x8]\",\n        \"fld dword  [ebp + 0xffffff68]\",\n        \"fadd dword  [ebp + 0xffffff74]\",\n        \"fstp dword  [ebp + -0x18]\",\n        \"fld dword  [ebp + 0xffffff74]\",\n        \"fsub dword  [ebp + 0xffffff68]\",\n        \"fmul dword  [eax + 0x8]\",\n        \"fstp dword  [ebp + -0xc]\",\n        \"fld dword  [ebp + 0xffffff6c]\",\n        \"fadd dword  [ebp + 0xffffff70]\",\n        \"fstp dword  [ebp + -0x14]\",\n        \"fld dword  [ebp + 0xffffff70]\",\n        \"fsub dword  [ebp + 0xffffff6c]\",\n        \"fmul dword  [eax + 0xc]\",\n        \"mov eax,[0x100de360]\",\n        \"fstp dword  [ebp + -0x10]\",\n        \"fld dword  [eax]\",\n        \"fstp dword  [ebp + 0x10]\",\n        \"fld dword  [eax + 0x4]\",\n        \"fstp dword  [ebp + 0xfffffefc]\",\n        \"fld dword  [ebp + -0x74]\",\n        \"fadd dword  [ebp + -0x80]\",\n        \"fstp dword  [ebp + 0xffffff00]\",\n        \"fld dword  [ebp + -0x80]\",\n        \"fsub dword  [ebp + -0x74]\",\n        \"fld dword  [ebp + 0x10]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword  [ebp + 0xffffff0c]\",\n        \"fld dword  [ebp + -0x78]\",\n        \"fadd dword  [ebp + -0x7c]\",\n        \"fstp dword  [ebp + 0xffffff04]\",\n        \"fld dword  [ebp + -0x7c]\",\n        \"fsub dword  [ebp + -0x78]\",\n        \"fld dword  [ebp + 0xfffffefc]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword  [ebp + 0xffffff08]\",\n        \"fld dword  [ebp + -0x64]\",\n        \"fadd dword  [ebp + -0x70]\",\n        \"fstp dword  [ebp + 0xffffff10]\",\n        \"fld dword  [ebp + -0x64]\",\n        \"fsub dword  [ebp + -0x70]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff1c]\",\n        \"fld dword  [ebp + -0x68]\",\n        \"fadd dword  [ebp + -0x6c]\",\n        \"fstp dword  [ebp + 0xffffff14]\",\n        \"fld dword  [ebp + -0x68]\",\n        \"fsub dword  [ebp + -0x6c]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff18]\",\n        \"fld dword  [ebp + -0x54]\",\n        \"fadd dword  [ebp + -0x60]\",\n        \"fstp dword  [ebp + 0xffffff20]\",\n        \"fld dword  [ebp + -0x60]\",\n        \"fsub dword  [ebp + -0x54]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff2c]\",\n        \"fld dword  [ebp + -0x58]\",\n        \"fadd dword  [ebp + -0x5c]\",\n        \"fstp dword  [ebp + 0xffffff24]\",\n        \"fld dword  [ebp + -0x5c]\",\n        \"fsub dword  [ebp + -0x58]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff28]\",\n        \"fld dword  [ebp + -0x44]\",\n        \"fadd dword  [ebp + -0x50]\",\n        \"fstp dword  [ebp + 0xffffff30]\",\n        \"fld dword  [ebp + -0x44]\",\n        \"fsub dword  [ebp + -0x50]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff3c]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"mov eax,[0x100de364]\",\n        \"fadd dword  [ebp + -0x4c]\",\n        \"fstp dword  [ebp + 0xffffff34]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"fsub dword  [ebp + -0x4c]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff38]\",\n        \"fld dword  [ebp + -0x40]\",\n        \"fadd dword  [ebp + -0x34]\",\n        \"fstp dword  [ebp + 0xffffff40]\",\n        \"fld dword  [ebp + -0x40]\",\n        \"fsub dword  [ebp + -0x34]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff4c]\",\n        \"fld dword  [ebp + -0x3c]\",\n        \"fadd dword  [ebp + -0x38]\",\n        \"fstp dword  [ebp + 0xffffff44]\",\n        \"fld dword  [ebp + -0x3c]\",\n        \"fsub dword  [ebp + -0x38]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff48]\",\n        \"fld dword  [ebp + -0x30]\",\n        \"fadd dword  [ebp + -0x24]\",\n        \"fstp dword  [ebp + 0xffffff50]\",\n        \"fld dword  [ebp + -0x24]\",\n        \"fsub dword  [ebp + -0x30]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff5c]\",\n        \"fld dword  [ebp + -0x2c]\",\n        \"fadd dword  [ebp + -0x28]\",\n        \"fstp dword  [ebp + 0xffffff54]\",\n        \"fld dword  [ebp + -0x28]\",\n        \"fsub dword  [ebp + -0x2c]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff58]\",\n        \"fld dword  [ebp + -0x20]\",\n        \"fadd dword  [ebp + -0x14]\",\n        \"fstp dword  [ebp + 0xffffff60]\",\n        \"fld dword  [ebp + -0x20]\",\n        \"fsub dword  [ebp + -0x14]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff6c]\",\n        \"fld dword  [ebp + -0x1c]\",\n        \"fadd dword  [ebp + -0x18]\",\n        \"fstp dword  [ebp + 0xffffff64]\",\n        \"fld dword  [ebp + -0x1c]\",\n        \"fsub dword  [ebp + -0x18]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff68]\",\n        \"fld dword  [ebp + -0x10]\",\n        \"fadd dword  [ebp + -0x4]\",\n        \"fstp dword  [ebp + 0xffffff70]\",\n        \"fld dword  [ebp + -0x4]\",\n        \"fsub dword  [ebp + -0x10]\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword  [ebp + 0xffffff7c]\",\n        \"fld dword  [ebp + -0xc]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [ebp + 0xffffff74]\",\n        \"fld dword  [ebp + -0x8]\",\n        \"fsub dword  [ebp + -0xc]\",\n        \"fmulp\",\n        \"fstp dword  [ebp + 0xffffff78]\",\n        \"fld dword  [eax]\",\n        \"fstp dword  [ebp + 0x10]\",\n        \"fld dword  [ebp + 0xffffff04]\",\n        \"fadd dword  [ebp + 0xffffff00]\",\n        \"fstp dword  [ebp + -0x80]\",\n        \"fld dword  [ebp + 0xffffff00]\",\n        \"fsub dword  [ebp + 0xffffff04]\",\n        \"fld dword  [ebp + 0x10]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword  [ebp + -0x7c]\",\n        \"fld dword  [ebp + 0xffffff0c]\",\n        \"fadd dword  [ebp + 0xffffff08]\",\n        \"fstp dword  [ebp + -0x78]\",\n        \"fld dword  [ebp + 0xffffff0c]\",\n        \"fsub dword  [ebp + 0xffffff08]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x74]\",\n        \"fld dword  [ebp + -0x74]\",\n        \"fadd dword  [ebp + -0x78]\",\n        \"fstp dword  [ebp + -0x78]\",\n        \"fld dword  [ebp + 0xffffff14]\",\n        \"fadd dword  [ebp + 0xffffff10]\",\n        \"fstp dword  [ebp + -0x70]\",\n        \"fld dword  [ebp + 0xffffff10]\",\n        \"fsub dword  [ebp + 0xffffff14]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x6c]\",\n        \"fld dword  [ebp + 0xffffff1c]\",\n        \"fadd dword  [ebp + 0xffffff18]\",\n        \"fstp dword  [ebp + -0x68]\",\n        \"fld dword  [ebp + 0xffffff1c]\",\n        \"fsub dword  [ebp + 0xffffff18]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x64]\",\n        \"fld dword  [ebp + -0x64]\",\n        \"fadd dword  [ebp + -0x68]\",\n        \"fstp dword  [ebp + -0x68]\",\n        \"fld dword  [ebp + -0x68]\",\n        \"fadd dword  [ebp + -0x70]\",\n        \"fstp dword  [ebp + -0x70]\",\n        \"fld dword  [ebp + -0x68]\",\n        \"fadd dword  [ebp + -0x6c]\",\n        \"fstp dword  [ebp + -0x68]\",\n        \"fld dword  [ebp + -0x64]\",\n        \"fadd dword  [ebp + -0x6c]\",\n        \"fstp dword  [ebp + -0x6c]\",\n        \"fld dword  [ebp + 0xffffff20]\",\n        \"fadd dword  [ebp + 0xffffff24]\",\n        \"fstp dword  [ebp + -0x60]\",\n        \"fld dword  [ebp + 0xffffff20]\",\n        \"fsub dword  [ebp + 0xffffff24]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x5c]\",\n        \"fld dword  [ebp + 0xffffff28]\",\n        \"fadd dword  [ebp + 0xffffff2c]\",\n        \"fstp dword  [ebp + -0x58]\",\n        \"fld dword  [ebp + 0xffffff2c]\",\n        \"fsub dword  [ebp + 0xffffff28]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x54]\",\n        \"fld dword  [ebp + -0x54]\",\n        \"fadd dword  [ebp + -0x58]\",\n        \"fstp dword  [ebp + -0x58]\",\n        \"fld dword  [ebp + 0xffffff30]\",\n        \"fadd dword  [ebp + 0xffffff34]\",\n        \"fstp dword  [ebp + -0x50]\",\n        \"fld dword  [ebp + 0xffffff30]\",\n        \"fsub dword  [ebp + 0xffffff34]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x4c]\",\n        \"fld dword  [ebp + 0xffffff38]\",\n        \"fadd dword  [ebp + 0xffffff3c]\",\n        \"fstp dword  [ebp + -0x48]\",\n        \"fld dword  [ebp + 0xffffff3c]\",\n        \"fsub dword  [ebp + 0xffffff38]\",\n        \"fld st1\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x44]\",\n        \"fld dword  [ebp + -0x44]\",\n        \"fld st0\",\n        \"fadd dword  [ebp + -0x48]\",\n        \"fstp dword  [ebp + -0x48]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"fadd dword  [ebp + -0x50]\",\n        \"fstp dword  [ebp + -0x50]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"fadd dword  [ebp + -0x4c]\",\n        \"fstp dword  [ebp + -0x48]\",\n        \"fld st0\",\n        \"fadd dword  [ebp + -0x4c]\",\n        \"fstp dword  [ebp + -0x4c]\",\n        \"fld dword  [ebp + 0xffffff44]\",\n        \"fadd dword  [ebp + 0xffffff40]\",\n        \"fstp dword  [ebp + -0x40]\",\n        \"fld dword  [ebp + 0xffffff40]\",\n        \"fsub dword  [ebp + 0xffffff44]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x3c]\",\n        \"fld dword  [ebp + 0xffffff4c]\",\n        \"fadd dword  [ebp + 0xffffff48]\",\n        \"fstp dword  [ebp + -0x38]\",\n        \"fld dword  [ebp + 0xffffff4c]\",\n        \"fsub dword  [ebp + 0xffffff48]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x34]\",\n        \"fld dword  [ebp + -0x38]\",\n        \"fadd dword  [ebp + -0x34]\",\n        \"fstp dword  [ebp + -0x38]\",\n        \"fld dword  [ebp + 0xffffff54]\",\n        \"fadd dword  [ebp + 0xffffff50]\",\n        \"fstp dword  [ebp + -0x30]\",\n        \"fld dword  [ebp + 0xffffff50]\",\n        \"fsub dword  [ebp + 0xffffff54]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x2c]\",\n        \"fld dword  [ebp + 0xffffff5c]\",\n        \"fadd dword  [ebp + 0xffffff58]\",\n        \"fstp dword  [ebp + -0x28]\",\n        \"fld dword  [ebp + 0xffffff5c]\",\n        \"fsub dword  [ebp + 0xffffff58]\",\n        \"fld st2\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x24]\",\n        \"fld dword  [ebp + -0x28]\",\n        \"fld dword  [ebp + -0x24]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword  [ebp + -0x28]\",\n        \"fld dword  [ebp + -0x30]\",\n        \"fadd dword  [ebp + -0x28]\",\n        \"fstp dword  [ebp + -0x30]\",\n        \"fld dword  [ebp + -0x2c]\",\n        \"fadd dword  [ebp + -0x28]\",\n        \"fstp dword  [ebp + -0x28]\",\n        \"fld dword  [ebp + -0x2c]\",\n        \"fld st1\",\n        \"faddp\",\n        \"fstp dword  [ebp + -0x2c]\",\n        \"fld dword  [ebp + 0xffffff60]\",\n        \"fadd dword  [ebp + 0xffffff64]\",\n        \"fstp dword  [ebp + -0x20]\",\n        \"fld dword  [ebp + 0xffffff60]\",\n        \"fsub dword  [ebp + 0xffffff64]\",\n        \"fld st3\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x1c]\",\n        \"fld dword  [ebp + 0xffffff68]\",\n        \"fadd dword  [ebp + 0xffffff6c]\",\n        \"fstp dword  [ebp + -0x18]\",\n        \"fld dword  [ebp + 0xffffff6c]\",\n        \"fsub dword  [ebp + 0xffffff68]\",\n        \"fld st3\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0x14]\",\n        \"fld dword  [ebp + -0x18]\",\n        \"fadd dword  [ebp + -0x14]\",\n        \"fstp dword  [ebp + -0x18]\",\n        \"fld dword  [ebp + 0xffffff70]\",\n        \"fadd dword  [ebp + 0xffffff74]\",\n        \"fstp dword  [ebp + -0x10]\",\n        \"mov eax,dword  [ebp + 0x8]\",\n        \"fld dword  [ebp + 0xffffff70]\",\n        \"mov ecx,dword  [ebp + 0xc]\",\n        \"fsub dword  [ebp + 0xffffff74]\",\n        \"fld st3\",\n        \"fmulp\",\n        \"fstp dword  [ebp + -0xc]\",\n        \"fld dword  [ebp + 0xffffff78]\",\n        \"fadd dword  [ebp + 0xffffff7c]\",\n        \"fstp dword  [ebp + -0x8]\",\n        \"fld dword  [ebp + 0xffffff7c]\",\n        \"fsub dword  [ebp + 0xffffff78]\",\n        \"fmulp st3\",\n        \"fxch st2\",\n        \"fstp dword  [ebp + -0x4]\",\n        \"fld dword  [ebp + -0x8]\",\n        \"fld dword  [ebp + -0x4]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword  [ebp + -0x8]\",\n        \"fld dword  [ebp + -0x10]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [ebp + -0x10]\",\n        \"fld dword  [ebp + -0xc]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [ebp + -0x8]\",\n        \"fld dword  [ebp + -0xc]\",\n        \"fld st1\",\n        \"faddp\",\n        \"fstp dword  [ebp + -0xc]\",\n        \"fld dword  [ebp + -0x80]\",\n        \"fstp dword  [eax + 0x400]\",\n        \"fld dword  [ebp + -0x70]\",\n        \"fstp dword  [eax + 0x300]\",\n        \"fld dword  [ebp + -0x78]\",\n        \"fstp dword  [eax + 0x200]\",\n        \"fld dword  [ebp + -0x68]\",\n        \"fstp dword  [eax + 0x100]\",\n        \"fld dword  [ebp + -0x7c]\",\n        \"fstp dword  [eax]\",\n        \"fld dword  [ebp + -0x7c]\",\n        \"fstp dword  [ecx]\",\n        \"fld dword  [ebp + -0x6c]\",\n        \"fstp dword  [ecx + 0x100]\",\n        \"fld dword  [ebp + -0x74]\",\n        \"fstp dword  [ecx + 0x200]\",\n        \"fld dword  [ebp + -0x64]\",\n        \"fstp dword  [ecx + 0x300]\",\n        \"fld dword  [ebp + -0x50]\",\n        \"fadd dword  [ebp + -0x60]\",\n        \"fstp dword  [ebp + -0x60]\",\n        \"fld dword  [ebp + -0x60]\",\n        \"fstp dword  [eax + 0x380]\",\n        \"fld dword  [ebp + -0x50]\",\n        \"fadd dword  [ebp + -0x58]\",\n        \"fstp dword  [ebp + -0x50]\",\n        \"fld dword  [ebp + -0x50]\",\n        \"fstp dword  [eax + 0x280]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"fadd dword  [ebp + -0x58]\",\n        \"fstp dword  [ebp + -0x58]\",\n        \"fld dword  [ebp + -0x58]\",\n        \"fstp dword  [eax + 0x180]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"fadd dword  [ebp + -0x5c]\",\n        \"fstp dword  [ebp + -0x48]\",\n        \"fld dword  [ebp + -0x48]\",\n        \"fstp dword  [eax + 0x80]\",\n        \"fld dword  [ebp + -0x4c]\",\n        \"fadd dword  [ebp + -0x5c]\",\n        \"fstp dword  [ebp + -0x5c]\",\n        \"fld dword  [ebp + -0x5c]\",\n        \"fstp dword  [ecx + 0x80]\",\n        \"fld dword  [ebp + -0x4c]\",\n        \"fadd dword  [ebp + -0x54]\",\n        \"fstp dword  [ebp + -0x4c]\",\n        \"fld dword  [ebp + -0x4c]\",\n        \"fstp dword  [ecx + 0x180]\",\n        \"fld st1\",\n        \"fadd dword  [ebp + -0x54]\",\n        \"fstp dword  [ebp + -0x54]\",\n        \"fld dword  [ebp + -0x54]\",\n        \"fstp dword  [ecx + 0x280]\",\n        \"fxch\",\n        \"fstp dword  [ecx + 0x380]\",\n        \"fld dword  [ebp + -0x20]\",\n        \"fadd dword  [ebp + -0x10]\",\n        \"fstp dword  [ebp + -0x20]\",\n        \"fld dword  [ebp + -0x40]\",\n        \"fadd dword  [ebp + -0x20]\",\n        \"fstp dword  [eax + 0x3c0]\",\n        \"fld dword  [ebp + -0x30]\",\n        \"fadd dword  [ebp + -0x20]\",\n        \"fstp dword  [eax + 0x340]\",\n        \"fld dword  [ebp + -0x18]\",\n        \"fadd dword  [ebp + -0x10]\",\n        \"fstp dword  [ebp + -0x10]\",\n        \"fld dword  [ebp + -0x30]\",\n        \"fadd dword  [ebp + -0x10]\",\n        \"fstp dword  [eax + 0x2c0]\",\n        \"fld dword  [ebp + -0x38]\",\n        \"fadd dword  [ebp + -0x10]\",\n        \"fstp dword  [eax + 0x240]\",\n        \"fld dword  [ebp + -0x18]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [ebp + -0x18]\",\n        \"fld dword  [ebp + -0x38]\",\n        \"fadd dword  [ebp + -0x18]\",\n        \"fstp dword  [eax + 0x1c0]\",\n        \"fld dword  [ebp + -0x28]\",\n        \"fadd dword  [ebp + -0x18]\",\n        \"fstp dword  [eax + 0x140]\",\n        \"fld dword  [ebp + -0x1c]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [ebp + -0x8]\",\n        \"fld dword  [ebp + -0x28]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [eax + 0xc0]\",\n        \"fld dword  [ebp + -0x3c]\",\n        \"fadd dword  [ebp + -0x8]\",\n        \"fstp dword  [eax + 0x40]\",\n        \"fld dword  [ebp + -0x1c]\",\n        \"fadd dword  [ebp + -0xc]\",\n        \"fstp dword  [ebp + -0x1c]\",\n        \"fld dword  [ebp + -0x3c]\",\n        \"fadd dword  [ebp + -0x1c]\",\n        \"fstp dword  [ecx + 0x40]\",\n        \"fld dword  [ebp + -0x2c]\",\n        \"fadd dword  [ebp + -0x1c]\",\n        \"fstp dword  [ecx + 0xc0]\",\n        \"fld dword  [ebp + -0x14]\",\n        \"fadd dword  [ebp + -0xc]\",\n        \"fstp dword  [ebp + -0xc]\",\n        \"fld dword  [ebp + -0x2c]\",\n        \"fadd dword  [ebp + -0xc]\",\n        \"fstp dword  [ecx + 0x140]\",\n        \"fld dword  [ebp + -0x34]\",\n        \"fadd dword  [ebp + -0xc]\",\n        \"fstp dword  [ecx + 0x1c0]\",\n        \"fld dword  [ebp + -0x14]\",\n        \"fld st1\",\n        \"faddp\",\n        \"fstp dword  [ebp + -0x14]\",\n        \"fld dword  [ebp + -0x34]\",\n        \"fadd dword  [ebp + -0x14]\",\n        \"fstp dword  [ecx + 0x240]\",\n        \"fld st1\",\n        \"fadd dword  [ebp + -0x14]\",\n        \"fstp dword  [ecx + 0x2c0]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword  [ecx + 0x340]\",\n        \"fstp dword  [ecx + 0x3c0]\",\n        \"leave\",\n        \"ret\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str w9, [x8, #-4]!\",\n        \"mov x9, x8\",\n        \"subs w26, w8, #0x104 (260)\",\n        \"mov x27, x8\",\n        \"mov x8, x26\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"mov w20, #0xe354\",\n        \"movk w20, #0x100d, lsl #16\",\n        \"ldr w7, [x20]\",\n        \"ldr s3, [x4, #124]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-128]\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #124]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x7]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr s2, [x4, #120]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-124]\",\n        \"ldr s2, [x4, #4]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #120]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x7, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr s2, [x4, #116]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #8]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-120]\",\n        \"ldr s2, [x4, #8]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #116]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x7, #8]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-12]\",\n        \"ldr s2, [x4, #112]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-116]\",\n        \"ldr s2, [x4, #12]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #112]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x7, #12]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-16]\",\n        \"ldr s2, [x4, #108]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #16]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-112]\",\n        \"ldr s2, [x4, #16]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #108]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x7, #16]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-20]\",\n        \"ldr s2, [x4, #104]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #20]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-108]\",\n        \"ldr s2, [x4, #20]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #104]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x7, #20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-24]\",\n        \"ldr s2, [x4, #100]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #24]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-104]\",\n        \"ldr s2, [x4, #24]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #100]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x7, #24]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-28]\",\n        \"ldr s2, [x4, #96]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #28]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-100]\",\n        \"ldr s2, [x4, #28]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #96]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x7, #28]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-32]\",\n        \"ldr s2, [x4, #92]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #32]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-96]\",\n        \"ldr s2, [x4, #32]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #92]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x7, #32]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-36]\",\n        \"ldr s2, [x4, #88]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #36]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-92]\",\n        \"ldr s2, [x4, #36]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #88]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x7, #36]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-40]\",\n        \"ldr s2, [x4, #84]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #40]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-88]\",\n        \"ldr s2, [x4, #40]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #84]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x7, #40]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-44]\",\n        \"ldr s2, [x4, #80]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #44]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-84]\",\n        \"ldr s2, [x4, #44]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #80]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x7, #44]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-48]\",\n        \"ldr s2, [x4, #76]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #48]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-80]\",\n        \"ldr s2, [x4, #48]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #76]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x7, #48]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-52]\",\n        \"ldr s2, [x4, #72]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #52]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-76]\",\n        \"ldr s2, [x4, #52]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #72]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x7, #52]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-56]\",\n        \"ldr s2, [x4, #68]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #56]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-72]\",\n        \"ldr s2, [x4, #56]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #68]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x7, #56]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-60]\",\n        \"ldr s2, [x4, #64]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #60]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-68]\",\n        \"ldr s2, [x4, #60]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #64]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"mov w20, #0xe358\",\n        \"movk w20, #0x100d, lsl #16\",\n        \"ldr w4, [x20]\",\n        \"ldr s3, [x7, #60]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-64]\",\n        \"ldur s2, [x9, #-68]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-128]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-256]\",\n        \"ldur s2, [x9, #-128]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-68]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-196]\",\n        \"ldur s2, [x9, #-72]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-124]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-252]\",\n        \"ldur s2, [x9, #-124]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-72]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-200]\",\n        \"ldur s2, [x9, #-76]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-120]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-248]\",\n        \"ldur s2, [x9, #-120]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-76]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #8]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-204]\",\n        \"ldur s2, [x9, #-80]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-116]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-244]\",\n        \"ldur s2, [x9, #-116]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-80]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-208]\",\n        \"ldur s2, [x9, #-84]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-112]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-240]\",\n        \"ldur s2, [x9, #-112]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-84]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #16]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-212]\",\n        \"ldur s2, [x9, #-88]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-108]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-236]\",\n        \"ldur s2, [x9, #-108]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-88]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-216]\",\n        \"ldur s2, [x9, #-92]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-104]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-232]\",\n        \"ldur s2, [x9, #-104]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-92]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #24]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-220]\",\n        \"ldur s2, [x9, #-96]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-100]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-228]\",\n        \"ldur s2, [x9, #-100]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-96]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #28]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-224]\",\n        \"ldur s2, [x9, #-64]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-4]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-192]\",\n        \"ldur s2, [x9, #-4]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-64]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-132]\",\n        \"ldur s2, [x9, #-60]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-8]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-188]\",\n        \"ldur s2, [x9, #-8]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-60]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-136]\",\n        \"ldur s2, [x9, #-56]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-12]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-184]\",\n        \"ldur s2, [x9, #-12]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-56]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #8]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-140]\",\n        \"ldur s2, [x9, #-52]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-16]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-180]\",\n        \"ldur s2, [x9, #-16]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-52]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-144]\",\n        \"ldur s2, [x9, #-48]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-20]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-176]\",\n        \"ldur s2, [x9, #-20]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-48]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #16]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-148]\",\n        \"ldur s2, [x9, #-44]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-24]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-172]\",\n        \"ldur s2, [x9, #-24]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-44]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-152]\",\n        \"ldur s2, [x9, #-40]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-28]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-168]\",\n        \"ldur s2, [x9, #-28]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-40]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #24]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-156]\",\n        \"ldur s2, [x9, #-36]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-32]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-164]\",\n        \"ldur s2, [x9, #-32]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-36]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #28]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"mov w20, #0xe35c\",\n        \"movk w20, #0x100d, lsl #16\",\n        \"ldr w4, [x20]\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-160]\",\n        \"ldur s2, [x9, #-228]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-256]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-128]\",\n        \"ldur s2, [x9, #-256]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-228]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-100]\",\n        \"ldur s2, [x9, #-232]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-252]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-124]\",\n        \"ldur s2, [x9, #-252]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-232]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-104]\",\n        \"ldur s2, [x9, #-236]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-248]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-120]\",\n        \"ldur s2, [x9, #-248]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-236]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #8]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-108]\",\n        \"ldur s2, [x9, #-240]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-244]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-116]\",\n        \"ldur s2, [x9, #-244]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-240]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-112]\",\n        \"ldur s2, [x9, #-224]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-196]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-96]\",\n        \"ldur s2, [x9, #-196]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-224]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-68]\",\n        \"ldur s2, [x9, #-220]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-200]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-92]\",\n        \"ldur s2, [x9, #-200]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-220]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-72]\",\n        \"ldur s2, [x9, #-216]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-204]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-88]\",\n        \"ldur s2, [x9, #-204]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-216]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #8]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-76]\",\n        \"ldur s2, [x9, #-212]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-208]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-84]\",\n        \"ldur s2, [x9, #-208]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-212]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-80]\",\n        \"ldur s2, [x9, #-164]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-192]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-64]\",\n        \"ldur s2, [x9, #-192]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-164]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-36]\",\n        \"ldur s2, [x9, #-168]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-188]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-60]\",\n        \"ldur s2, [x9, #-188]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-168]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-40]\",\n        \"ldur s2, [x9, #-172]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-184]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-56]\",\n        \"ldur s2, [x9, #-184]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-172]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #8]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-44]\",\n        \"ldur s2, [x9, #-176]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-180]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-52]\",\n        \"ldur s2, [x9, #-180]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-176]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-48]\",\n        \"ldur s2, [x9, #-160]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-132]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-32]\",\n        \"ldur s2, [x9, #-132]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-160]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-4]\",\n        \"ldur s2, [x9, #-156]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-136]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-28]\",\n        \"ldur s2, [x9, #-136]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-156]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-8]\",\n        \"ldur s2, [x9, #-152]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-140]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-24]\",\n        \"ldur s2, [x9, #-140]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-152]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #8]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-12]\",\n        \"ldur s2, [x9, #-148]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-144]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-20]\",\n        \"ldur s2, [x9, #-144]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-148]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"mov w20, #0xe360\",\n        \"movk w20, #0x100d, lsl #16\",\n        \"ldr w4, [x20]\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-16]\",\n        \"ldr s2, [x4]\",\n        \"str s2, [x9, #16]\",\n        \"ldr s2, [x4, #4]\",\n        \"mov x20, #0xfffffffffffffefc\",\n        \"str s2, [x9, x20, sxtx]\",\n        \"ldur s2, [x9, #-116]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-128]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-256]\",\n        \"ldur s2, [x9, #-128]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-116]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x9, #16]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-244]\",\n        \"ldur s2, [x9, #-120]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-124]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-252]\",\n        \"ldur s2, [x9, #-124]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-120]\",\n        \"fcvt d4, s4\",\n        \"fsub d2, d2, d4\",\n        \"ldr s4, [x9, x20, sxtx]\",\n        \"fcvt d4, s4\",\n        \"fmul d2, d2, d4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-248]\",\n        \"ldur s2, [x9, #-100]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-112]\",\n        \"fcvt d5, s5\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-240]\",\n        \"ldur s2, [x9, #-100]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-112]\",\n        \"fcvt d5, s5\",\n        \"fsub d2, d2, d5\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-228]\",\n        \"ldur s2, [x9, #-104]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-108]\",\n        \"fcvt d5, s5\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-236]\",\n        \"ldur s2, [x9, #-104]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-108]\",\n        \"fcvt d5, s5\",\n        \"fsub d2, d2, d5\",\n        \"fmul d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-232]\",\n        \"ldur s2, [x9, #-84]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-96]\",\n        \"fcvt d5, s5\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-224]\",\n        \"ldur s2, [x9, #-96]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-84]\",\n        \"fcvt d5, s5\",\n        \"fsub d2, d2, d5\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-212]\",\n        \"ldur s2, [x9, #-88]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-92]\",\n        \"fcvt d5, s5\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-220]\",\n        \"ldur s2, [x9, #-92]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-88]\",\n        \"fcvt d5, s5\",\n        \"fsub d2, d2, d5\",\n        \"fmul d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-216]\",\n        \"ldur s2, [x9, #-68]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-80]\",\n        \"fcvt d5, s5\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-208]\",\n        \"ldur s2, [x9, #-68]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-80]\",\n        \"fcvt d5, s5\",\n        \"fsub d2, d2, d5\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-196]\",\n        \"ldur s2, [x9, #-72]\",\n        \"fcvt d2, s2\",\n        \"mov w20, #0xe364\",\n        \"movk w20, #0x100d, lsl #16\",\n        \"ldr w4, [x20]\",\n        \"ldur s5, [x9, #-76]\",\n        \"fcvt d5, s5\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-204]\",\n        \"ldur s2, [x9, #-72]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-76]\",\n        \"fcvt d5, s5\",\n        \"fsub d2, d2, d5\",\n        \"fmul d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-200]\",\n        \"ldur s2, [x9, #-64]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-52]\",\n        \"fcvt d5, s5\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-192]\",\n        \"ldur s2, [x9, #-64]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-52]\",\n        \"fcvt d5, s5\",\n        \"fsub d2, d2, d5\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-180]\",\n        \"ldur s2, [x9, #-60]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-56]\",\n        \"fcvt d5, s5\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-188]\",\n        \"ldur s2, [x9, #-60]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-56]\",\n        \"fcvt d5, s5\",\n        \"fsub d2, d2, d5\",\n        \"fmul d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-184]\",\n        \"ldur s2, [x9, #-48]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-36]\",\n        \"fcvt d5, s5\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-176]\",\n        \"ldur s2, [x9, #-36]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-48]\",\n        \"fcvt d5, s5\",\n        \"fsub d2, d2, d5\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-164]\",\n        \"ldur s2, [x9, #-44]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-40]\",\n        \"fcvt d5, s5\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-172]\",\n        \"ldur s2, [x9, #-40]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-44]\",\n        \"fcvt d5, s5\",\n        \"fsub d2, d2, d5\",\n        \"fmul d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-168]\",\n        \"ldur s2, [x9, #-32]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-20]\",\n        \"fcvt d5, s5\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-160]\",\n        \"ldur s2, [x9, #-32]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-20]\",\n        \"fcvt d5, s5\",\n        \"fsub d2, d2, d5\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-148]\",\n        \"ldur s2, [x9, #-28]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-24]\",\n        \"fcvt d5, s5\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-156]\",\n        \"ldur s2, [x9, #-28]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-24]\",\n        \"fcvt d5, s5\",\n        \"fsub d2, d2, d5\",\n        \"fmul d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-152]\",\n        \"ldur s2, [x9, #-16]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-4]\",\n        \"fcvt d5, s5\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-144]\",\n        \"ldur s2, [x9, #-4]\",\n        \"fcvt d2, s2\",\n        \"ldur s5, [x9, #-16]\",\n        \"fcvt d5, s5\",\n        \"fsub d2, d2, d5\",\n        \"fmul d2, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-132]\",\n        \"ldur s2, [x9, #-12]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-8]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-140]\",\n        \"ldur s2, [x9, #-8]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-12]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fmul d2, d4, d2\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-136]\",\n        \"ldr s2, [x4]\",\n        \"str s2, [x9, #16]\",\n        \"ldur s2, [x9, #-252]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-256]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-128]\",\n        \"ldur s2, [x9, #-256]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-252]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x9, #16]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-124]\",\n        \"ldur s2, [x9, #-244]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-248]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-120]\",\n        \"ldur s2, [x9, #-244]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-248]\",\n        \"fcvt d4, s4\",\n        \"fsub d2, d2, d4\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-116]\",\n        \"ldur s2, [x9, #-116]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-120]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-120]\",\n        \"ldur s2, [x9, #-236]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-240]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-112]\",\n        \"ldur s2, [x9, #-240]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-236]\",\n        \"fcvt d4, s4\",\n        \"fsub d2, d2, d4\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-108]\",\n        \"ldur s2, [x9, #-228]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-232]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-104]\",\n        \"ldur s2, [x9, #-228]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-232]\",\n        \"fcvt d4, s4\",\n        \"fsub d2, d2, d4\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-100]\",\n        \"ldur s2, [x9, #-100]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-104]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-104]\",\n        \"ldur s2, [x9, #-104]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-112]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-112]\",\n        \"ldur s2, [x9, #-104]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-108]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-104]\",\n        \"ldur s2, [x9, #-100]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-108]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-108]\",\n        \"ldur s2, [x9, #-224]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-220]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-96]\",\n        \"ldur s2, [x9, #-224]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-220]\",\n        \"fcvt d4, s4\",\n        \"fsub d2, d2, d4\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-92]\",\n        \"ldur s2, [x9, #-216]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-212]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-88]\",\n        \"ldur s2, [x9, #-212]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-216]\",\n        \"fcvt d4, s4\",\n        \"fsub d2, d2, d4\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-84]\",\n        \"ldur s2, [x9, #-84]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-88]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-88]\",\n        \"ldur s2, [x9, #-208]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-204]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-80]\",\n        \"ldur s2, [x9, #-208]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-204]\",\n        \"fcvt d4, s4\",\n        \"fsub d2, d2, d4\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-76]\",\n        \"ldur s2, [x9, #-200]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-196]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-72]\",\n        \"ldur s2, [x9, #-196]\",\n        \"fcvt d2, s2\",\n        \"ldur s4, [x9, #-200]\",\n        \"fcvt d4, s4\",\n        \"fsub d2, d2, d4\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-68]\",\n        \"ldur s2, [x9, #-68]\",\n        \"fcvt d4, s2\",\n        \"ldur s5, [x9, #-72]\",\n        \"fcvt d5, s5\",\n        \"fadd d5, d4, d5\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-72]\",\n        \"ldur s5, [x9, #-72]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x9, #-80]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-80]\",\n        \"ldur s5, [x9, #-72]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x9, #-76]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-72]\",\n        \"ldur s5, [x9, #-76]\",\n        \"fcvt d5, s5\",\n        \"fadd d5, d4, d5\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-76]\",\n        \"ldur s5, [x9, #-188]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x9, #-192]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-64]\",\n        \"ldur s5, [x9, #-192]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x9, #-188]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fmul d5, d5, d3\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-60]\",\n        \"ldur s5, [x9, #-180]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x9, #-184]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-56]\",\n        \"ldur s5, [x9, #-180]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x9, #-184]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fmul d5, d5, d3\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-52]\",\n        \"ldur s5, [x9, #-56]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x9, #-52]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-56]\",\n        \"ldur s5, [x9, #-172]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x9, #-176]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-48]\",\n        \"ldur s5, [x9, #-176]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x9, #-172]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fmul d5, d5, d3\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-44]\",\n        \"ldur s5, [x9, #-164]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x9, #-168]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-40]\",\n        \"ldur s5, [x9, #-164]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x9, #-168]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fmul d5, d5, d3\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-36]\",\n        \"ldur s5, [x9, #-40]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x9, #-36]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-40]\",\n        \"ldur s5, [x9, #-48]\",\n        \"fcvt d5, s5\",\n        \"ldur s7, [x9, #-40]\",\n        \"fcvt d7, s7\",\n        \"fadd d5, d5, d7\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-48]\",\n        \"ldur s5, [x9, #-44]\",\n        \"fcvt d5, s5\",\n        \"ldur s7, [x9, #-40]\",\n        \"fcvt d7, s7\",\n        \"fadd d5, d5, d7\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-40]\",\n        \"ldur s5, [x9, #-44]\",\n        \"fcvt d5, s5\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-44]\",\n        \"ldur s5, [x9, #-160]\",\n        \"fcvt d5, s5\",\n        \"ldur s7, [x9, #-156]\",\n        \"fcvt d7, s7\",\n        \"fadd d5, d5, d7\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-32]\",\n        \"ldur s5, [x9, #-160]\",\n        \"fcvt d5, s5\",\n        \"ldur s7, [x9, #-156]\",\n        \"fcvt d7, s7\",\n        \"fsub d5, d5, d7\",\n        \"fmul d5, d5, d3\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-28]\",\n        \"ldur s5, [x9, #-152]\",\n        \"fcvt d5, s5\",\n        \"ldur s7, [x9, #-148]\",\n        \"fcvt d7, s7\",\n        \"fadd d5, d5, d7\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-24]\",\n        \"ldur s5, [x9, #-148]\",\n        \"fcvt d5, s5\",\n        \"ldur s7, [x9, #-152]\",\n        \"fcvt d7, s7\",\n        \"fsub d5, d5, d7\",\n        \"fmul d5, d5, d3\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-20]\",\n        \"ldur s5, [x9, #-24]\",\n        \"fcvt d5, s5\",\n        \"ldur s7, [x9, #-20]\",\n        \"fcvt d7, s7\",\n        \"fadd d5, d5, d7\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-24]\",\n        \"ldur s5, [x9, #-144]\",\n        \"fcvt d5, s5\",\n        \"ldur s7, [x9, #-140]\",\n        \"fcvt d7, s7\",\n        \"fadd d5, d5, d7\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-16]\",\n        \"ldr w4, [x9, #8]\",\n        \"ldur s5, [x9, #-144]\",\n        \"fcvt d5, s5\",\n        \"ldr w7, [x9, #12]\",\n        \"ldur s7, [x9, #-140]\",\n        \"fcvt d7, s7\",\n        \"fsub d5, d5, d7\",\n        \"fmul d5, d5, d3\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-12]\",\n        \"ldur s5, [x9, #-136]\",\n        \"fcvt d5, s5\",\n        \"ldur s7, [x9, #-132]\",\n        \"fcvt d7, s7\",\n        \"fadd d5, d5, d7\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x9, #-8]\",\n        \"ldur s5, [x9, #-132]\",\n        \"fcvt d5, s5\",\n        \"ldur s7, [x9, #-136]\",\n        \"fcvt d7, s7\",\n        \"fsub d5, d5, d7\",\n        \"fmul d3, d3, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x9, #-4]\",\n        \"ldur s3, [x9, #-8]\",\n        \"fcvt d3, s3\",\n        \"ldur s5, [x9, #-4]\",\n        \"fcvt d7, s5\",\n        \"fadd d3, d3, d7\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x9, #-8]\",\n        \"ldur s3, [x9, #-16]\",\n        \"fcvt d3, s3\",\n        \"ldur s8, [x9, #-8]\",\n        \"fcvt d8, s8\",\n        \"fadd d3, d3, d8\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x9, #-16]\",\n        \"ldur s3, [x9, #-12]\",\n        \"fcvt d3, s3\",\n        \"ldur s8, [x9, #-8]\",\n        \"fcvt d8, s8\",\n        \"fadd d3, d3, d8\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x9, #-8]\",\n        \"ldur s3, [x9, #-12]\",\n        \"fcvt d3, s3\",\n        \"fadd d3, d3, d7\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x9, #-12]\",\n        \"ldur s3, [x9, #-128]\",\n        \"str s3, [x4, #1024]\",\n        \"ldur s3, [x9, #-112]\",\n        \"str s3, [x4, #768]\",\n        \"ldur s3, [x9, #-120]\",\n        \"str s3, [x4, #512]\",\n        \"ldur s3, [x9, #-104]\",\n        \"str s3, [x4, #256]\",\n        \"ldur s3, [x9, #-124]\",\n        \"str s3, [x4]\",\n        \"ldur s3, [x9, #-124]\",\n        \"str s3, [x7]\",\n        \"ldur s3, [x9, #-108]\",\n        \"str s3, [x7, #256]\",\n        \"ldur s3, [x9, #-116]\",\n        \"str s3, [x7, #512]\",\n        \"ldur s3, [x9, #-100]\",\n        \"str s3, [x7, #768]\",\n        \"ldur s3, [x9, #-80]\",\n        \"fcvt d3, s3\",\n        \"ldur s8, [x9, #-96]\",\n        \"fcvt d8, s8\",\n        \"fadd d3, d3, d8\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x9, #-96]\",\n        \"ldur s3, [x9, #-96]\",\n        \"str s3, [x4, #896]\",\n        \"ldur s3, [x9, #-80]\",\n        \"fcvt d3, s3\",\n        \"ldur s8, [x9, #-88]\",\n        \"fcvt d8, s8\",\n        \"fadd d3, d3, d8\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x9, #-80]\",\n        \"ldur s3, [x9, #-80]\",\n        \"str s3, [x4, #640]\",\n        \"ldur s3, [x9, #-72]\",\n        \"fcvt d3, s3\",\n        \"ldur s8, [x9, #-88]\",\n        \"fcvt d8, s8\",\n        \"fadd d3, d3, d8\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x9, #-88]\",\n        \"ldur s3, [x9, #-88]\",\n        \"str s3, [x4, #384]\",\n        \"ldur s3, [x9, #-72]\",\n        \"fcvt d3, s3\",\n        \"ldur s8, [x9, #-92]\",\n        \"fcvt d8, s8\",\n        \"fadd d3, d3, d8\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x9, #-72]\",\n        \"ldur s3, [x9, #-72]\",\n        \"str s3, [x4, #128]\",\n        \"ldur s3, [x9, #-76]\",\n        \"fcvt d3, s3\",\n        \"ldur s8, [x9, #-92]\",\n        \"fcvt d8, s8\",\n        \"fadd d3, d3, d8\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x9, #-92]\",\n        \"ldur s3, [x9, #-92]\",\n        \"str s3, [x7, #128]\",\n        \"ldur s3, [x9, #-76]\",\n        \"fcvt d3, s3\",\n        \"ldur s8, [x9, #-84]\",\n        \"fcvt d8, s8\",\n        \"fadd d3, d3, d8\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x9, #-76]\",\n        \"ldur s3, [x9, #-76]\",\n        \"str s3, [x7, #384]\",\n        \"ldur s3, [x9, #-84]\",\n        \"fcvt d3, s3\",\n        \"fadd d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x9, #-84]\",\n        \"ldur s3, [x9, #-84]\",\n        \"str s3, [x7, #640]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s2, [x7, #896]\",\n        \"ldur s2, [x9, #-32]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-16]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-32]\",\n        \"ldur s2, [x9, #-64]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-32]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #960]\",\n        \"ldur s2, [x9, #-48]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-32]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #832]\",\n        \"ldur s2, [x9, #-24]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-16]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-16]\",\n        \"ldur s2, [x9, #-48]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-16]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #704]\",\n        \"ldur s2, [x9, #-56]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-16]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #576]\",\n        \"ldur s2, [x9, #-24]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-8]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-24]\",\n        \"ldur s2, [x9, #-56]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-24]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #448]\",\n        \"ldur s2, [x9, #-40]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-24]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #320]\",\n        \"ldur s2, [x9, #-28]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-8]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-8]\",\n        \"ldur s2, [x9, #-40]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-8]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #192]\",\n        \"ldur s2, [x9, #-60]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-8]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #64]\",\n        \"ldur s2, [x9, #-28]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-12]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-28]\",\n        \"ldur s2, [x9, #-60]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-28]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x7, #64]\",\n        \"ldur s2, [x9, #-44]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-28]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x7, #192]\",\n        \"ldur s2, [x9, #-20]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-12]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-12]\",\n        \"ldur s2, [x9, #-44]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-12]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x7, #320]\",\n        \"ldur s2, [x9, #-52]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-12]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x7, #448]\",\n        \"ldur s2, [x9, #-20]\",\n        \"fcvt d2, s2\",\n        \"fadd d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-20]\",\n        \"ldur s2, [x9, #-52]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-20]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x7, #576]\",\n        \"ldur s2, [x9, #-20]\",\n        \"fcvt d2, s2\",\n        \"fadd d2, d6, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x7, #704]\",\n        \"fadd d2, d6, d7\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x7, #832]\",\n        \"str s5, [x7, #960]\",\n        \"mov x8, x9\",\n        \"ldp w9, w20, [x8], #8\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x8\",\n        \"sub w21, w23, w21\",\n        \"mov w23, #0xf8f8\",\n        \"lsr w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ],\n      \"x86InstructionCount\": 809,\n      \"ExpectedInstructionCount\": 1712\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/x87_f64-HalfLife.json",
    "content": "{\n  \"Features\": {\n    \"Env\": {\n      \"FEX_X87REDUCEDPRECISION\": \"1\"\n    },\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"Block1\": {\n      \"x86InstructionCount\": 70,\n      \"ExpectedInstructionCount\": 109,\n      \"x86Insts\": [\n        \"sub esp,0x2c\",\n        \"mov ecx,dword [esp + 0x34]\",\n        \"mov edx,dword [esp + 0x30]\",\n        \"mov eax,dword [esp + 0x38]\",\n        \"fld dword [ecx]\",\n        \"fld dword [edx]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fld dword [ecx + 0x4]\",\n        \"fld dword [edx + 0x4]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [ecx + 0x8]\",\n        \"fld dword [edx + 0x8]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax]\",\n        \"fsubr st7,st0\",\n        \"fxch st7\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsubr st4,st0\",\n        \"fxch st4\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fsubr st2,st0\",\n        \"fxch st6\",\n        \"fsubrp st7,st0\",\n        \"fxch st2\",\n        \"fsubrp st3,st0\",\n        \"fxch st4\",\n        \"fsubp\",\n        \"fxch st2\",\n        \"fmul st0\",\n        \"fldz\",\n        \"faddp\",\n        \"fld dword [esp + 0x10]\",\n        \"fld st0\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [esp + 0x14]\",\n        \"fld st0\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [esp + 0x18]\",\n        \"fld st0\",\n        \"fmulp\",\n        \"fldz\",\n        \"faddp\",\n        \"fld dword [esp + 0x1c]\",\n        \"fld st0\",\n        \"fmulp\",\n        \"faddp\",\n        \"fxch st4\",\n        \"fmul st0\",\n        \"faddp st4,st0\",\n        \"fxch st4\",\n        \"fmul st0\",\n        \"fldz\",\n        \"faddp\",\n        \"fxch\",\n        \"fmul st0\",\n        \"faddp\",\n        \"fxch\",\n        \"fmul st0\",\n        \"faddp\",\n        \"fxch st2\",\n        \"fucomi st0,st1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub w20, w8, #0x2c (44)\",\n        \"mov x27, x8\",\n        \"mov x8, x20\",\n        \"ldr w7, [x8, #52]\",\n        \"ldr w5, [x8, #48]\",\n        \"ldr w4, [x8, #56]\",\n        \"ldr s2, [x7]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fsub d4, d2, d3\",\n        \"ldr s5, [x7, #4]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x5, #4]\",\n        \"fcvt d6, s6\",\n        \"fsub d7, d5, d6\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #16]\",\n        \"ldr s7, [x7, #8]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x5, #8]\",\n        \"fcvt d8, s8\",\n        \"fsub d9, d7, d8\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #20]\",\n        \"ldr s9, [x4]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d9, d2\",\n        \"mov w20, #0x0\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x4, #4]\",\n        \"fcvt d2, s2\",\n        \"fsub d5, d2, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #28]\",\n        \"ldr s5, [x4, #8]\",\n        \"fcvt d5, s5\",\n        \"fsub d7, d5, d7\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d3, d3, d9\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d2, d6, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d5, d8, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d4, d4, d4\",\n        \"fmov d6, x20\",\n        \"fadd d4, d4, d6\",\n        \"ldr s6, [x8, #16]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d6\",\n        \"fadd d4, d4, d6\",\n        \"ldr s6, [x8, #20]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d6\",\n        \"fadd d4, d4, d6\",\n        \"ldr s6, [x8, #24]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d6\",\n        \"fmov d8, x20\",\n        \"fadd d6, d6, d8\",\n        \"ldr s8, [x8, #28]\",\n        \"fcvt d8, s8\",\n        \"fmul d8, d8, d8\",\n        \"fadd d6, d6, d8\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d7, d7, d7\",\n        \"fadd d6, d6, d7\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d3, d3, d3\",\n        \"fmov d7, x20\",\n        \"fadd d3, d3, d7\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d2, d2, d2\",\n        \"fadd d2, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d3, d5, d5\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcmp d4, d6\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d4, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str d6, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0x707\",\n        \"lsr w22, w22, w20\",\n        \"orr w21, w21, w22\",\n        \"mov w22, #0xf8f8\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block2\": {\n      \"x86InstructionCount\": 37,\n      \"ExpectedInstructionCount\": 70,\n      \"x86Insts\": [\n        \"sub esp,0x1c\",\n        \"mov edx,dword [esp + 0x20]\",\n        \"mov eax,dword [esp + 0x24]\",\n        \"fld dword [edx]\",\n        \"fabs\",\n        \"fld dword [eax]\",\n        \"fabs\",\n        \"fxch\",\n        \"fucomi st0,st1\",\n        \"fcmovbe st0,st1\",\n        \"fstp st1\",\n        \"fld dword [edx + 0x4]\",\n        \"fabs\",\n        \"fld dword [eax + 0x4]\",\n        \"fabs\",\n        \"fxch\",\n        \"fucomi st0,st1\",\n        \"fcmovbe st0,st1\",\n        \"fstp st1\",\n        \"fld dword [edx + 0x8]\",\n        \"fabs\",\n        \"fld dword [eax + 0x8]\",\n        \"fabs\",\n        \"fxch\",\n        \"fucomi st0,st1\",\n        \"fcmovbe st0,st1\",\n        \"fstp st1\",\n        \"fld st2\",\n        \"fmulp st3\",\n        \"fxch\",\n        \"fmul st0\",\n        \"faddp st2,st0\",\n        \"fmul st0\",\n        \"faddp\",\n        \"fld st0\",\n        \"fsqrt\",\n        \"fucomi st0,st0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w8\",\n        \"sub w8, w8, #0x1c (28)\",\n        \"ldr w5, [x8, #32]\",\n        \"ldr w4, [x8, #36]\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"fabs d2, d2\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fabs d3, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcmp d2, d3\",\n        \"axflag\",\n        \"csetm x20, ls\",\n        \"dup v4.2d, x20\",\n        \"bsl v4.16b, v3.16b, v2.16b\",\n        \"ldr s2, [x5, #4]\",\n        \"fcvt d2, s2\",\n        \"fabs d2, d2\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fabs d3, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcmp d2, d3\",\n        \"axflag\",\n        \"csetm x20, ls\",\n        \"dup v5.2d, x20\",\n        \"bsl v5.16b, v3.16b, v2.16b\",\n        \"ldr s2, [x5, #8]\",\n        \"fcvt d2, s2\",\n        \"fabs d2, d2\",\n        \"ldr s3, [x4, #8]\",\n        \"fcvt d3, s3\",\n        \"fabs d3, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcmp d2, d3\",\n        \"axflag\",\n        \"csetm x20, ls\",\n        \"dup v6.2d, x20\",\n        \"bsl v6.16b, v3.16b, v2.16b\",\n        \"fmul d2, d4, d4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d3, d5, d5\",\n        \"fadd d2, d2, d3\",\n        \"fmul d3, d6, d6\",\n        \"fadd d2, d2, d3\",\n        \"fsqrt d3, d2\",\n        \"fcmp d3, d3\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d3, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0x303\",\n        \"lsr w22, w22, w20\",\n        \"orr w21, w21, w22\",\n        \"mov w22, #0xc0c0\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block3\": {\n      \"x86InstructionCount\": 32,\n      \"ExpectedInstructionCount\": 60,\n      \"x86Insts\": [\n        \"fld dword [ecx]\",\n        \"fld dword [edx + 0x4]\",\n        \"fld dword [ecx + 0x4]\",\n        \"fld dword [edx]\",\n        \"fld dword [ecx + 0x8]\",\n        \"fstp dword [esp]\",\n        \"fld dword [edx + 0x8]\",\n        \"fld st4\",\n        \"fmul st4\",\n        \"fld st3\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fmul dword [eax + 0x8]\",\n        \"fxch st2\",\n        \"fmul dword [esp]\",\n        \"fxch st5\",\n        \"fmul st1\",\n        \"fsubp st5,st0\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp st5\",\n        \"fxch st4\",\n        \"faddp\",\n        \"fxch st3\",\n        \"fmulp\",\n        \"fxch\",\n        \"fmul dword [esp]\",\n        \"mov byte [esp],0x1\",\n        \"fsubp\",\n        \"fmul dword [eax]\",\n        \"faddp\",\n        \"fdivrp\",\n        \"fstp dword [esi]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x7]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x5, #4]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x7, #4]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x5]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x7, #8]\",\n        \"str s6, [x8]\",\n        \"ldr s6, [x5, #8]\",\n        \"fcvt d6, s6\",\n        \"fmul d7, d2, d3\",\n        \"fmul d8, d4, d5\",\n        \"fsub d7, d7, d8\",\n        \"ldr s8, [x4, #8]\",\n        \"fcvt d8, s8\",\n        \"fmul d7, d7, d8\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s8, [x8]\",\n        \"fcvt d8, s8\",\n        \"fmul d5, d5, d8\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d2, d2, d6\",\n        \"fsub d2, d5, d2\",\n        \"ldr s5, [x4, #4]\",\n        \"fcvt d5, s5\",\n        \"fmul d2, d2, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"fadd d2, d7, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d4, d4, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s5, [x8]\",\n        \"fcvt d5, s5\",\n        \"fmul d3, d3, d5\",\n        \"mov w20, #0x1\",\n        \"strb w20, [x8]\",\n        \"fsub d3, d4, d3\",\n        \"ldr s4, [x4]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"fdiv d3, d2, d3\",\n        \"fcvt s4, d3\",\n        \"str s4, [x10]\",\n        \"add w21, w21, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x20, #1056]\",\n        \"str d3, [x22, #1056]\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block4\": {\n      \"x86InstructionCount\": 54,\n      \"ExpectedInstructionCount\": 36,\n      \"x86Insts\": [\n        \"push ebp\",\n        \"push edi\",\n        \"push esi\",\n        \"push ebx\",\n        \"sub esp,0x4c\",\n        \"mov eax,dword [esp + 0x68]\",\n        \"lea ebp,[esp + 0x38]\",\n        \"lea esi,[esp + 0x30]\",\n        \"fld qword [0x00052098]\",\n        \"mov dword [esp + 0xc],esi\",\n        \"mov edi,dword [esp + 0x64]\",\n        \"mov dword [esp + 0x8],ebp\",\n        \"mov ebx,dword [esp + 0x6c]\",\n        \"mov dword [esp + 0x28],eax\",\n        \"mov eax,dword [esp + 0x60]\",\n        \"fmul dword [eax + 0x4]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fstp qword [esp]\",\n        \"call 0x0006d100\",\n        \"mov eax,dword [esp + 0x60]\",\n        \"mov dword [esp + 0xc],esi\",\n        \"mov dword [esp + 0x8],ebp\",\n        \"fld qword [esp + 0x38]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld qword [0x00052098]\",\n        \"fmul dword [eax]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fstp qword [esp]\",\n        \"call 0x0006d100\",\n        \"mov eax,dword [esp + 0x60]\",\n        \"mov dword [esp + 0xc],esi\",\n        \"mov dword [esp + 0x8],ebp\",\n        \"fld qword [esp + 0x38]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld qword [0x00052098]\",\n        \"fmul dword [eax + 0x8]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fstp qword [esp]\",\n        \"call 0x0006d100\",\n        \"test edi,edi\",\n        \"mov eax,dword [esp + 0x28]\",\n        \"fld qword [esp + 0x38]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fld qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x2c]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp w11, w9, [x8, #-8]!\",\n        \"stp w6, w10, [x8, #-8]!\",\n        \"subs w26, w8, #0x4c (76)\",\n        \"mov x27, x8\",\n        \"mov x8, x26\",\n        \"ldr w4, [x8, #104]\",\n        \"add w9, w8, #0x38 (56)\",\n        \"add w10, w8, #0x30 (48)\",\n        \"mov w20, #0x2098\",\n        \"movk w20, #0x5, lsl #16\",\n        \"ldr d2, [x20]\",\n        \"str w10, [x8, #12]\",\n        \"ldr w11, [x8, #100]\",\n        \"str w9, [x8, #8]\",\n        \"ldr w6, [x8, #108]\",\n        \"str w4, [x8, #40]\",\n        \"ldr w4, [x8, #96]\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #44]\",\n        \"fcvt d2, s2\",\n        \"str d2, [x8]\",\n        \"mov w20, #0x44\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"add w21, w21, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"lsl w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    },\n    \"Block5\": {\n      \"x86InstructionCount\": 49,\n      \"ExpectedInstructionCount\": 88,\n      \"x86Insts\": [\n        \"fld dword [esp + 0x80]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"mov eax,dword [esp + 0x88]\",\n        \"mov ecx,dword [esp + 0x8c]\",\n        \"movss xmm1,dword [esp + 0x7c]\",\n        \"mov dword [esp + 0x38],edx\",\n        \"fst dword [esp + 0x34]\",\n        \"fld dword [esp + 0x24]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fadd dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [eax]\",\n        \"fsub dword [ebp]\",\n        \"movss xmm0,dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fadd dword [ebp]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsub dword [ebp + 0x4]\",\n        \"fmul st1\",\n        \"fadd dword [ebp + 0x4]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [eax + 0x8]\",\n        \"fsub dword [ebp + 0x8]\",\n        \"fmulp\",\n        \"fadd dword [ebp + 0x8]\",\n        \"mov dword [esp + 0x1c],ecx\",\n        \"movss dword [esp + 0x10],xmm0\",\n        \"lea ecx,[esp + 0x44]\",\n        \"movss dword [esp + 0xc],xmm1\",\n        \"mov dword [esp + 0x18],ecx\",\n        \"mov dword [esp + 0x14],ebp\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fldz\",\n        \"fld dword [esp + 0x28]\",\n        \"fxch\",\n        \"fucomip st0,st1\",\n        \"fstp st0\",\n        \"seta byte [esp + 0x30]\",\n        \"movzx eax,byte [esp + 0x30]\",\n        \"movsx eax,word [esi + eax*0x2 + 0x4]\",\n        \"mov dword [esp + 0x8],eax\",\n        \"mov dword [esp + 0x4],ebx\",\n        \"mov dword [esp],edi\",\n        \"call 0x0002b5b0\",\n        \"mov edx,dword [esp + 0x38]\",\n        \"test al,al\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x8, #128]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #124]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr w4, [x8, #136]\",\n        \"ldr w7, [x8, #140]\",\n        \"ldr s17, [x8, #124]\",\n        \"str w5, [x8, #56]\",\n        \"fcvt s3, d2\",\n        \"str s3, [x8, #52]\",\n        \"ldr s3, [x8, #36]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"mov w20, #0x0\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s4, [x8, #124]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr s4, [x9]\",\n        \"fcvt d4, s4\",\n        \"fsub d2, d2, d4\",\n        \"ldr s16, [x8, #44]\",\n        \"fmul d2, d2, d3\",\n        \"ldr s4, [x9]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #68]\",\n        \"ldr s2, [x4, #4]\",\n        \"fcvt d2, s2\",\n        \"ldr s4, [x9, #4]\",\n        \"fcvt d4, s4\",\n        \"fsub d2, d2, d4\",\n        \"fmul d2, d2, d3\",\n        \"ldr s4, [x9, #4]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #72]\",\n        \"ldr s2, [x4, #8]\",\n        \"fcvt d2, s2\",\n        \"ldr s4, [x9, #8]\",\n        \"fcvt d4, s4\",\n        \"fsub d2, d2, d4\",\n        \"fmul d2, d3, d2\",\n        \"ldr s3, [x9, #8]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"str w7, [x8, #28]\",\n        \"str s16, [x8, #16]\",\n        \"add w7, w8, #0x44 (68)\",\n        \"str s17, [x8, #12]\",\n        \"str w7, [x8, #24]\",\n        \"str w9, [x8, #20]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #76]\",\n        \"fmov d2, x20\",\n        \"ldr s3, [x8, #40]\",\n        \"fcvt d3, s3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcmp d2, d3\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"cset x20, hi\",\n        \"strb w20, [x8, #48]\",\n        \"ldrb w4, [x8, #48]\",\n        \"add w20, w10, w4, lsl #1\",\n        \"ldrh w20, [x20, #4]\",\n        \"sxth w4, w20\",\n        \"str w4, [x8, #8]\",\n        \"str w6, [x8, #4]\",\n        \"str w11, [x8]\",\n        \"mov w20, #0xb2\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x8\",\n        \"sub w21, w23, w21\",\n        \"mov w23, #0xe0e0\",\n        \"lsr w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    },\n    \"Block6\": {\n      \"x86InstructionCount\": 39,\n      \"ExpectedInstructionCount\": 92,\n      \"x86Insts\": [\n        \"push ebp\",\n        \"push edi\",\n        \"push esi\",\n        \"push ebx\",\n        \"sub esp,0x4\",\n        \"mov ecx,dword [esp + 0x20]\",\n        \"mov ebx,dword [esp + 0x24]\",\n        \"mov eax,dword [esp + 0x1c]\",\n        \"mov edx,dword [esp + 0x18]\",\n        \"fld dword [ecx]\",\n        \"fmul dword [ebx + 0x4]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"mov edi,dword [esp + 0x2c]\",\n        \"mov esi,dword [esp + 0x30]\",\n        \"fld dword [ecx + 0x4]\",\n        \"fmul dword [ebx]\",\n        \"fsubp\",\n        \"fld dword [ebx]\",\n        \"fmul dword [ecx + 0x8]\",\n        \"fld dword [ecx]\",\n        \"fmul dword [ebx + 0x8]\",\n        \"fsubp\",\n        \"fld dword [ecx + 0x4]\",\n        \"fmul dword [ebx + 0x8]\",\n        \"fld dword [ebx + 0x4]\",\n        \"fmul dword [ecx + 0x8]\",\n        \"fsubp\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul st3\",\n        \"fld dword [eax + 0x4]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fld dword [eax]\",\n        \"fmul st2\",\n        \"faddp\",\n        \"fldz\",\n        \"fxch\",\n        \"fucomi st0,st1\",\n        \"fstp st1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp w11, w9, [x8, #-8]!\",\n        \"stp w6, w10, [x8, #-8]!\",\n        \"sub w20, w8, #0x4 (4)\",\n        \"mov x27, x8\",\n        \"mov x8, x20\",\n        \"ldr w7, [x8, #32]\",\n        \"ldr w6, [x8, #36]\",\n        \"ldr w4, [x8, #28]\",\n        \"ldr w5, [x8, #24]\",\n        \"ldr s2, [x7]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x6, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr w11, [x8, #44]\",\n        \"ldr w10, [x8, #48]\",\n        \"ldr s3, [x7, #4]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x6]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x6]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x7, #8]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"ldr s4, [x7]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x6, #8]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"fsub d3, d3, d4\",\n        \"ldr s4, [x7, #4]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x6, #8]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"ldr s5, [x6, #4]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x7, #8]\",\n        \"fcvt d6, s6\",\n        \"fmul d5, d5, d6\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x4, #8]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d2\",\n        \"ldr s6, [x4, #4]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d3\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x4]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d4\",\n        \"fadd d5, d5, d6\",\n        \"mov w20, #0x0\",\n        \"fmov d6, x20\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcmp d5, d6\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d5, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str d4, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str d3, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w22, w22, w20\",\n        \"mov w23, #0xf0f\",\n        \"lsr w22, w23, w22\",\n        \"orr w21, w21, w22\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block7\": {\n      \"x86InstructionCount\": 25,\n      \"ExpectedInstructionCount\": 61,\n      \"x86Insts\": [\n        \"fld dword [ebx + 0x4]\",\n        \"fld dword [ebx]\",\n        \"fld dword [ebx + 0x8]\",\n        \"fld dword [edx]\",\n        \"fmul st3\",\n        \"fld dword [edx + 0x4]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fmul dword [eax + 0x8]\",\n        \"fxch st2\",\n        \"fmul dword [edx + 0x8]\",\n        \"fld dword [edx]\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fmul dword [eax + 0x4]\",\n        \"faddp st2,st0\",\n        \"fmul dword [edx + 0x4]\",\n        \"fxch st2\",\n        \"fmul dword [edx + 0x8]\",\n        \"fsubp st2,st0\",\n        \"fxch\",\n        \"fmul dword [eax]\",\n        \"faddp\",\n        \"fdiv st0,st1\",\n        \"fstp dword [edi]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x6, #4]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x6]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x6, #8]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x5]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d2\",\n        \"ldr s6, [x5, #4]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d3\",\n        \"fsub d5, d5, d6\",\n        \"ldr s6, [x4, #8]\",\n        \"fcvt d6, s6\",\n        \"fmul d5, d5, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s6, [x5, #8]\",\n        \"fcvt d6, s6\",\n        \"fmul d3, d3, d6\",\n        \"ldr s6, [x5]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d4\",\n        \"fsub d3, d3, d6\",\n        \"ldr s6, [x4, #4]\",\n        \"fcvt d6, s6\",\n        \"fmul d3, d3, d6\",\n        \"fadd d3, d5, d3\",\n        \"ldr s5, [x5, #4]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s5, [x5, #8]\",\n        \"fcvt d5, s5\",\n        \"fmul d2, d2, d5\",\n        \"fsub d2, d4, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s4, [x4]\",\n        \"fcvt d4, s4\",\n        \"fmul d2, d2, d4\",\n        \"fadd d2, d3, d2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"fdiv d2, d2, d3\",\n        \"fcvt s3, d2\",\n        \"str s3, [x11]\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x20, #1056]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w21, w22, w21\",\n        \"mov w22, #0xf8f8\",\n        \"lsr w21, w22, w21\",\n        \"bic w20, w20, w21\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block8\": {\n      \"x86InstructionCount\": 25,\n      \"ExpectedInstructionCount\": 47,\n      \"x86Insts\": [\n        \"fstp st0\",\n        \"fstp st3\",\n        \"fstp st0\",\n        \"fstp st3\",\n        \"fxch\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x38]\",\n        \"fxch\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fxch\",\n        \"fstp dword [esp + 0x28]\",\n        \"fstp qword [esp]\",\n        \"call 0x0006d0d8\",\n        \"fld dword [ebx]\",\n        \"fld dword [ebx + 0x4]\",\n        \"fld dword [ebx + 0x8]\",\n        \"fld dword [esp + 0x38]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fxch st6\",\n        \"fxch st5\",\n        \"fxch\",\n        \"fxch st4\",\n        \"fxch st3\",\n        \"fxch\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"add x22, x28, x22, lsl #4\",\n        \"ldr d4, [x22, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x23, x28, x20, lsl #4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s5, d3\",\n        \"str s5, [x8, #56]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s5, d4\",\n        \"str s5, [x8, #44]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x12, x28, x20, lsl #4\",\n        \"ldr d5, [x12, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s6, d5\",\n        \"str s6, [x8, #40]\",\n        \"str d2, [x8]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"mov w13, #0x24\",\n        \"movk w13, #0x1, lsl #16\",\n        \"str w13, [x8, #-4]!\",\n        \"strb w20, [x28, #1051]\",\n        \"str d3, [x21, #1056]\",\n        \"str d4, [x22, #1056]\",\n        \"str d5, [x23, #1056]\",\n        \"str d2, [x12, #1056]\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block9\": {\n      \"x86InstructionCount\": 25,\n      \"ExpectedInstructionCount\": 47,\n      \"x86Insts\": [\n        \"fstp st0\",\n        \"fstp st3\",\n        \"fstp st0\",\n        \"fstp st3\",\n        \"fxch\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x38]\",\n        \"fxch\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fxch\",\n        \"fstp dword [esp + 0x28]\",\n        \"fstp qword [esp]\",\n        \"call 0x0006d0d8\",\n        \"fld dword [ebx]\",\n        \"fld dword [ebx + 0x4]\",\n        \"fld dword [ebx + 0x8]\",\n        \"fld dword [esp + 0x38]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fxch st6\",\n        \"fxch st5\",\n        \"fxch\",\n        \"fxch st4\",\n        \"fxch st3\",\n        \"fxch\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"add x22, x28, x22, lsl #4\",\n        \"ldr d4, [x22, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x23, x28, x20, lsl #4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s5, d3\",\n        \"str s5, [x8, #56]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s5, d4\",\n        \"str s5, [x8, #44]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x12, x28, x20, lsl #4\",\n        \"ldr d5, [x12, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s6, d5\",\n        \"str s6, [x8, #40]\",\n        \"str d2, [x8]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"mov w13, #0x24\",\n        \"movk w13, #0x1, lsl #16\",\n        \"str w13, [x8, #-4]!\",\n        \"strb w20, [x28, #1051]\",\n        \"str d3, [x21, #1056]\",\n        \"str d4, [x22, #1056]\",\n        \"str d5, [x23, #1056]\",\n        \"str d2, [x12, #1056]\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block10\": {\n      \"x86InstructionCount\": 125,\n      \"ExpectedInstructionCount\": 17,\n      \"x86Insts\": [\n        \"push esi\",\n        \"push ebx\",\n        \"sub esp,0xa4\",\n        \"mov ebx,dword [esp + 0xb0]\",\n        \"lea esi,[esp + 0x18]\",\n        \"mov eax,gs:[0x14]\",\n        \"mov dword [esp + 0x9c],eax\",\n        \"xor eax,eax\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x18]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x1c]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x20]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x24]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x28]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x2c]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x30]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x34]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x38]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x3c]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x40]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x44]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x48]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x4c]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x50]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x54]\",\n        \"call 0x00018ad0\",\n        \"mov dword [esp + 0x58],eax\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x7c]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x80]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x84]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x88]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x8c]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x90]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x94]\",\n        \"call 0x00019090\",\n        \"mov eax,dword [ebx + 0x5869c]\",\n        \"mov dword [esp],eax\",\n        \"fstp dword [esp + 0x98]\",\n        \"call 0x00019700\",\n        \"mov edx,0x1f\",\n        \"mov dword [esp + 0x8],edx\",\n        \"mov dword [esp + 0x4],eax\",\n        \"lea eax,[esp + 0x5c]\",\n        \"mov dword [esp],eax\",\n        \"call 0x0006d0dc\",\n        \"mov eax,dword [ebx + 0x130]\",\n        \"mov byte [esp + 0x7b],0x0\",\n        \"mov edx,dword [eax]\",\n        \"mov dword [esp],eax\",\n        \"mov dword [esp + 0x4],esi\",\n        \"call dword [edx + 0xc4]\",\n        \"mov eax,dword [esp + 0x9c]\",\n        \"xor eax,dword gs:[0x14]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stp w6, w10, [x8, #-8]!\",\n        \"sub w8, w8, #0xa4 (164)\",\n        \"ldr w6, [x8, #176]\",\n        \"add w10, w8, #0x18 (24)\",\n        \"ldr w20, [x28, #992]\",\n        \"ldr w4, [x20, #20]\",\n        \"str w4, [x8, #156]\",\n        \"subs w26, w4, w4\",\n        \"mov w4, #0x0\",\n        \"mov w20, #0x869c\",\n        \"movk w20, #0x5, lsl #16\",\n        \"add w20, w6, w20\",\n        \"ldr w4, [x20]\",\n        \"str w4, [x8]\",\n        \"mov w20, #0x30\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/x87_f64-Oblivion.json",
    "content": "{\n  \"Features\": {\n    \"Env\": {\n      \"FEX_X87REDUCEDPRECISION\": \"1\"\n    },\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"Block1\": {\n      \"x86InstructionCount\": 911,\n      \"ExpectedInstructionCount\": 1695,\n      \"x86Insts\": [\n        \"sub esp,0x118\",\n        \"fld dword [ecx + 0x1084]\",\n        \"fadd dword [ecx + 0x1008]\",\n        \"fstp dword [esp]\",\n        \"fld dword [ecx + 0x1080]\",\n        \"fadd dword [ecx + 0x100c]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [ecx + 0x107c]\",\n        \"fadd dword [ecx + 0x1010]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [ecx + 0x1078]\",\n        \"fadd dword [ecx + 0x1014]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [ecx + 0x1074]\",\n        \"fadd dword [ecx + 0x1018]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [ecx + 0x1070]\",\n        \"fadd dword [ecx + 0x101c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [ecx + 0x106c]\",\n        \"fadd dword [ecx + 0x1020]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [ecx + 0x1068]\",\n        \"fadd dword [ecx + 0x1024]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [ecx + 0x1064]\",\n        \"fadd dword [ecx + 0x1028]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [ecx + 0x1060]\",\n        \"fadd dword [ecx + 0x102c]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [ecx + 0x105c]\",\n        \"fadd dword [ecx + 0x1030]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [ecx + 0x1058]\",\n        \"fadd dword [ecx + 0x1034]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [ecx + 0x1054]\",\n        \"fadd dword [ecx + 0x1038]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [ecx + 0x1050]\",\n        \"fadd dword [ecx + 0x103c]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [ecx + 0x104c]\",\n        \"fadd dword [ecx + 0x1040]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [ecx + 0x1048]\",\n        \"fadd dword [ecx + 0x1044]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fld st0\",\n        \"fld dword [esp]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x38]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x4]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x34]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x30]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x28]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esp + 0x24]\",\n        \"fadd dword [esp + 0x18]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fxch st4\",\n        \"fsubrp st5,st0\",\n        \"fld dword [0x00b3c1d0]\",\n        \"fmulp st5\",\n        \"fxch st4\",\n        \"fstp dword [esp + 0x64]\",\n        \"fsubrp\",\n        \"fmul dword [0x00b3c1d4]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fsubrp\",\n        \"fmul dword [0x00b3c1d8]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x30]\",\n        \"fmul dword [0x00b3c1dc]\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x2c]\",\n        \"fmul dword [0x00b3c1e0]\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x28]\",\n        \"fmul dword [0x00b3c1e4]\",\n        \"fstp dword [esp + 0x78]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x24]\",\n        \"fmul dword [0x00b3c1e8]\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fmul dword [0x00b3c1ec]\",\n        \"fstp dword [esp + 0x80]\",\n        \"fld dword [esp + 0x60]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x44]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x48]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x58]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x4c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x54]\",\n        \"fadd dword [esp + 0x50]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fxch st4\",\n        \"fsubrp st5,st0\",\n        \"fld dword [0x00b3c1f0]\",\n        \"fld st0\",\n        \"fmulp st6\",\n        \"fxch st5\",\n        \"fstp dword [esp + 0x10]\",\n        \"fxch\",\n        \"fsubrp st2,st0\",\n        \"fld dword [0x00b3c1f4]\",\n        \"fld st0\",\n        \"fmulp st3\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x14]\",\n        \"fsubp st2,st0\",\n        \"fld dword [0x00b3c1f8]\",\n        \"fld st0\",\n        \"fmulp st3\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x50]\",\n        \"fsub dword [esp + 0x54]\",\n        \"fld dword [0x00b3c1fc]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x80]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x64]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fadd dword [esp + 0x68]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esp + 0x78]\",\n        \"fadd dword [esp + 0x6c]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x74]\",\n        \"fadd dword [esp + 0x70]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fsubrp\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x68]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"fmul st2\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fsub dword [esp + 0x78]\",\n        \"fmul st3\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x70]\",\n        \"fsub dword [esp + 0x74]\",\n        \"fmulp\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fld dword [esp]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fxch\",\n        \"fsubrp st2,st0\",\n        \"fld dword [0x00b3c200]\",\n        \"fld st0\",\n        \"fmulp st3\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fsubr dword [esp + 0x4]\",\n        \"fld dword [0x00b3c204]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fsubr dword [esp + 0x10]\",\n        \"fmul st2\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x20]\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x28]\",\n        \"fadd dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fsubr dword [esp + 0x20]\",\n        \"fmul st2\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0x24]\",\n        \"fsub dword [esp + 0x28]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x30]\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x38]\",\n        \"fadd dword [esp + 0x34]\",\n        \"fstp dword [esp + 0x78]\",\n        \"fsubr dword [esp + 0x30]\",\n        \"fmul st2\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x34]\",\n        \"fsub dword [esp + 0x38]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x80]\",\n        \"fld dword [esp + 0x48]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [esp]\",\n        \"fsubr dword [esp + 0x44]\",\n        \"fld dword [0x00b3c208]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x50]\",\n        \"fadd dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fsub dword [esp + 0x50]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0x58]\",\n        \"fadd dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x54]\",\n        \"fsub dword [esp + 0x58]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fsub dword [esp + 0x60]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x68]\",\n        \"fadd dword [esp + 0x64]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esp + 0x64]\",\n        \"fsub dword [esp + 0x68]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esp + 0x70]\",\n        \"fadd dword [esp + 0x6c]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fsub dword [esp + 0x70]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x78]\",\n        \"fadd dword [esp + 0x74]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x74]\",\n        \"fsub dword [esp + 0x78]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp + 0x80]\",\n        \"fadd dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fsub dword [esp + 0x80]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fst dword [esp + 0xc0]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fstp dword [esp + 0xa0]\",\n        \"fld dword [esp + 0xa0]\",\n        \"fchs\",\n        \"fstp dword [esp + 0x8c]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fstp dword [esp + 0xdc]\",\n        \"fld dword [esp + 0x18]\",\n        \"fchs\",\n        \"fsub dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [esp + 0xfc]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fst dword [esp + 0xc8]\",\n        \"fadd dword [esp + 0x2c]\",\n        \"fstp dword [esp + 0xb8]\",\n        \"fld dword [esp + 0xb8]\",\n        \"fadd dword [esp + 0x34]\",\n        \"fstp dword [esp + 0xa8]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fadd dword [esp + 0x34]\",\n        \"fadd dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x98]\",\n        \"fld dword [esp + 0x98]\",\n        \"fchs\",\n        \"fstp dword [esp + 0x84]\",\n        \"fld dword [esp + 0x84]\",\n        \"fsub dword [esp + 0x38]\",\n        \"fstp dword [esp + 0xd4]\",\n        \"fld dword [esp + 0x38]\",\n        \"fchs\",\n        \"fsub dword [esp + 0x3c]\",\n        \"fst qword [esp + 0x110]\",\n        \"fsub dword [esp + 0x28]\",\n        \"fsub dword [esp + 0x2c]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fsub dword [esp + 0x34]\",\n        \"fstp dword [esp + 0xe4]\",\n        \"fld dword [esp + 0x30]\",\n        \"fsubr qword [esp + 0x110]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fstp dword [esp + 0x104]\",\n        \"fld dword [esp + 0x40]\",\n        \"fsub dword [esp + 0x30]\",\n        \"fstp dword [esp + 0xf4]\",\n        \"fld dword [esp]\",\n        \"fchs\",\n        \"fstp dword [esp + 0x10c]\",\n        \"fld dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x90]\",\n        \"fld dword [esp + 0xc]\",\n        \"fst dword [esp + 0xb0]\",\n        \"fchs\",\n        \"fsub dword [esp + 0x8]\",\n        \"fstp dword [esp + 0xec]\",\n        \"fld dword [ecx + 0x1008]\",\n        \"fsub dword [ecx + 0x1084]\",\n        \"fmul dword [0x00b3c190]\",\n        \"fstp dword [esp]\",\n        \"fld dword [ecx + 0x100c]\",\n        \"fsub dword [ecx + 0x1080]\",\n        \"fmul dword [0x00b3c194]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [ecx + 0x1010]\",\n        \"fsub dword [ecx + 0x107c]\",\n        \"fmul dword [0x00b3c198]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [ecx + 0x1014]\",\n        \"fsub dword [ecx + 0x1078]\",\n        \"fmul dword [0x00b3c19c]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [ecx + 0x1018]\",\n        \"fsub dword [ecx + 0x1074]\",\n        \"fmul dword [0x00b3c1a0]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [ecx + 0x101c]\",\n        \"fsub dword [ecx + 0x1070]\",\n        \"fmul dword [0x00b3c1a4]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [ecx + 0x1020]\",\n        \"fsub dword [ecx + 0x106c]\",\n        \"fmul dword [0x00b3c1a8]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [ecx + 0x1024]\",\n        \"fsub dword [ecx + 0x1068]\",\n        \"fmul dword [0x00b3c1ac]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [ecx + 0x1028]\",\n        \"fsub dword [ecx + 0x1064]\",\n        \"fmul dword [0x00b3c1b0]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [ecx + 0x102c]\",\n        \"fsub dword [ecx + 0x1060]\",\n        \"fmul dword [0x00b3c1b4]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [ecx + 0x1030]\",\n        \"fsub dword [ecx + 0x105c]\",\n        \"fmul dword [0x00b3c1b8]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [ecx + 0x1034]\",\n        \"fsub dword [ecx + 0x1058]\",\n        \"fmul dword [0x00b3c1bc]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [ecx + 0x1038]\",\n        \"fsub dword [ecx + 0x1054]\",\n        \"fmul dword [0x00b3c1c0]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [ecx + 0x103c]\",\n        \"fsub dword [ecx + 0x1050]\",\n        \"fmul dword [0x00b3c1c4]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [ecx + 0x1040]\",\n        \"fsub dword [ecx + 0x104c]\",\n        \"fmul dword [0x00b3c1c8]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [ecx + 0x1044]\",\n        \"fsub dword [ecx + 0x1048]\",\n        \"fmul dword [0x00b3c1cc]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fadd dword [esp]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x38]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x34]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x30]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x28]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esp + 0x24]\",\n        \"fadd dword [esp + 0x18]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esp]\",\n        \"fsub dword [esp + 0x3c]\",\n        \"fmul dword [0x00b3c1d0]\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp + 0x38]\",\n        \"fmul dword [0x00b3c1d4]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0x34]\",\n        \"fmul dword [0x00b3c1d8]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x30]\",\n        \"fmul dword [0x00b3c1dc]\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x2c]\",\n        \"fmul dword [0x00b3c1e0]\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x28]\",\n        \"fmul dword [0x00b3c1e4]\",\n        \"fstp dword [esp + 0x78]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x24]\",\n        \"fmul dword [0x00b3c1e8]\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fmul dword [0x00b3c1ec]\",\n        \"fstp dword [esp + 0x80]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fadd dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x58]\",\n        \"fadd dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x54]\",\n        \"fadd dword [esp + 0x50]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0x44]\",\n        \"fsub dword [esp + 0x60]\",\n        \"fmul st6\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x48]\",\n        \"fsub dword [esp + 0x5c]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fsub dword [esp + 0x58]\",\n        \"fmul st5\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x50]\",\n        \"fsub dword [esp + 0x54]\",\n        \"fmul dword [0x00b3c1fc]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x80]\",\n        \"fadd dword [esp + 0x64]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fadd dword [esp + 0x68]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esp + 0x78]\",\n        \"fadd dword [esp + 0x6c]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x74]\",\n        \"fadd dword [esp + 0x70]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x64]\",\n        \"fsub dword [esp + 0x80]\",\n        \"fmulp st6\",\n        \"fxch st5\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x68]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"fmulp st3\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fsub dword [esp + 0x78]\",\n        \"fmulp st3\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x70]\",\n        \"fsub dword [esp + 0x74]\",\n        \"fmul dword [0x00b3c1fc]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fld dword [esp]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fxch\",\n        \"fsubrp st2,st0\",\n        \"fld st3\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fsubr dword [esp + 0x4]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x10]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x18]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fxch\",\n        \"fsubrp st2,st0\",\n        \"fld st3\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fsubr dword [esp + 0x14]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x20]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fxch\",\n        \"fsubrp st2,st0\",\n        \"fld st3\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fsubr dword [esp + 0x24]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x30]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x38]\",\n        \"fld st0\",\n        \"fadd dword [esp + 0x34]\",\n        \"fstp dword [esp + 0x78]\",\n        \"fxch\",\n        \"fsubrp st2,st0\",\n        \"fxch\",\n        \"fmulp st3\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x34]\",\n        \"fsubrp st2,st0\",\n        \"fmulp\",\n        \"fstp dword [esp + 0x80]\",\n        \"fld dword [esp + 0x48]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x44]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp]\",\n        \"fsubrp\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x50]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x4c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x8]\",\n        \"fsubrp\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0x58]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x54]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x10]\",\n        \"fsubrp\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x60]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x5c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x18]\",\n        \"fsubrp\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x68]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x64]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x20]\",\n        \"fsubrp\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esp + 0x70]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x6c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x28]\",\n        \"fsubrp\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x78]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x74]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x30]\",\n        \"fsubrp\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp + 0x80]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x7c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fsubrp\",\n        \"fmulp\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x1c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0xc4]\",\n        \"fld dword [esp + 0xc4]\",\n        \"fld st0\",\n        \"fld dword [esp + 0x2c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0xbc]\",\n        \"fld dword [esp + 0xbc]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fld dword [esp + 0x34]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0xa4]\",\n        \"fld st4\",\n        \"fadd st0,st2\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0xb4]\",\n        \"fld dword [esp + 0xb4]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0xac]\",\n        \"fld st4\",\n        \"fadd st0,st1\",\n        \"fadd dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x94]\",\n        \"fld dword [esp + 0x94]\",\n        \"fchs\",\n        \"fstp dword [esp + 0x110]\",\n        \"fld dword [esp + 0x110]\",\n        \"fld dword [esp + 0x38]\",\n        \"fld st0\",\n        \"fsubp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0xd0]\",\n        \"fld dword [esp + 0x40]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fadd st0,st5\",\n        \"fstp dword [esp + 0x9c]\",\n        \"fld dword [esp + 0x9c]\",\n        \"fchs\",\n        \"fstp dword [esp + 0x88]\",\n        \"fld dword [esp + 0x88]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fsub st0,st1\",\n        \"fstp dword [esp + 0xd8]\",\n        \"fld dword [esp + 0x28]\",\n        \"fchs\",\n        \"fsubrp st3,st0\",\n        \"fld st0\",\n        \"fsubp st3,st0\",\n        \"fld st5\",\n        \"fsubp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fld st0\",\n        \"fsubrp st2,st0\",\n        \"fld dword [esp + 0x8]\",\n        \"fsubr st0,st2\",\n        \"fsub dword [esp + 0xc]\",\n        \"fstp dword [esp + 0xe8]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsubp st2,st0\",\n        \"fld dword [esp + 0x18]\",\n        \"fsubp st2,st0\",\n        \"fld st4\",\n        \"fsubp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0xe0]\",\n        \"fld dword [esp + 0x30]\",\n        \"fld st0\",\n        \"fsubp st2,st0\",\n        \"fld dword [esp + 0x8]\",\n        \"fsubr st0,st2\",\n        \"fsub dword [esp + 0xc]\",\n        \"fstp dword [esp + 0xf0]\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x10]\",\n        \"faddp st5,st0\",\n        \"mov eax,dword [ecx + 0x1004]\",\n        \"mov edx,dword [ecx + 0x1000]\",\n        \"fxch st4\",\n        \"lea eax,[edx + eax*0x4]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fld st0\",\n        \"fsubp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0xf8]\",\n        \"fld dword [esp + 0x20]\",\n        \"fchs\",\n        \"fsubrp st4,st0\",\n        \"fxch st3\",\n        \"fsubrp\",\n        \"fsub st0,st3\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fld st0\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x108]\",\n        \"fsubrp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x100]\",\n        \"fld dword [esp + 0x90]\",\n        \"fstp dword [eax]\",\n        \"fld dword [esp + 0x94]\",\n        \"fstp dword [eax + 0x40]\",\n        \"fld dword [esp + 0x98]\",\n        \"fstp dword [eax + 0x80]\",\n        \"fld dword [esp + 0x9c]\",\n        \"fstp dword [eax + 0xc0]\",\n        \"fld dword [esp + 0xa0]\",\n        \"fstp dword [eax + 0x100]\",\n        \"fld dword [esp + 0xa4]\",\n        \"fst dword [eax + 0x140]\",\n        \"fld dword [esp + 0xa8]\",\n        \"fst dword [eax + 0x180]\",\n        \"fld dword [esp + 0xac]\",\n        \"fst dword [eax + 0x1c0]\",\n        \"fld dword [esp + 0xb0]\",\n        \"fst dword [eax + 0x200]\",\n        \"fld dword [esp + 0xb4]\",\n        \"fstp dword [eax + 0x240]\",\n        \"fld dword [esp + 0xb8]\",\n        \"fst dword [eax + 0x280]\",\n        \"fld dword [esp + 0xbc]\",\n        \"fstp dword [eax + 0x2c0]\",\n        \"fld dword [esp + 0xc0]\",\n        \"fstp dword [eax + 0x300]\",\n        \"fxch st5\",\n        \"fst dword [eax + 0x340]\",\n        \"fld dword [esp + 0xc8]\",\n        \"fstp dword [eax + 0x380]\",\n        \"fxch st6\",\n        \"fst dword [eax + 0x3c0]\",\n        \"fldz\",\n        \"fstp dword [eax + 0x400]\",\n        \"fchs\",\n        \"fstp dword [eax + 0x440]\",\n        \"fld dword [esp + 0xc8]\",\n        \"fchs\",\n        \"fstp dword [eax + 0x480]\",\n        \"fxch st5\",\n        \"fchs\",\n        \"fstp dword [eax + 0x4c0]\",\n        \"fld dword [esp + 0xc0]\",\n        \"fchs\",\n        \"fstp dword [eax + 0x500]\",\n        \"fld dword [esp + 0xbc]\",\n        \"fchs\",\n        \"fstp dword [eax + 0x540]\",\n        \"fxch st3\",\n        \"fchs\",\n        \"fstp dword [eax + 0x580]\",\n        \"fld dword [esp + 0xb4]\",\n        \"fchs\",\n        \"fstp dword [eax + 0x5c0]\",\n        \"fxch st3\",\n        \"fchs\",\n        \"fstp dword [eax + 0x600]\",\n        \"fxch\",\n        \"fchs\",\n        \"fstp dword [eax + 0x640]\",\n        \"fxch\",\n        \"fchs\",\n        \"fstp dword [eax + 0x680]\",\n        \"fchs\",\n        \"fstp dword [eax + 0x6c0]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [eax + 0x700]\",\n        \"fld dword [esp + 0x88]\",\n        \"fstp dword [eax + 0x740]\",\n        \"fld dword [esp + 0x84]\",\n        \"fstp dword [eax + 0x780]\",\n        \"fld dword [esp + 0x110]\",\n        \"fstp dword [eax + 0x7c0]\",\n        \"cmp dword [ecx + 0x1000],ecx\",\n        \"lea eax,[ecx + 0x800]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub w8, w8, #0x118 (280)\",\n        \"ldr s2, [x7, #4228]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4104]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8]\",\n        \"ldr s2, [x7, #4224]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4108]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #4]\",\n        \"ldr s2, [x7, #4220]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4112]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #8]\",\n        \"ldr s2, [x7, #4216]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4116]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x7, #4212]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4120]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x7, #4208]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4124]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x7, #4204]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4128]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x7, #4200]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4132]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x7, #4196]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4136]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #32]\",\n        \"ldr s2, [x7, #4192]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4140]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #36]\",\n        \"ldr s2, [x7, #4188]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4144]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x7, #4184]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4148]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x7, #4180]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4152]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x7, #4176]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4156]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #52]\",\n        \"ldr s2, [x7, #4172]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4160]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x7, #4168]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #4164]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #60]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #68]\",\n        \"ldr s4, [x8, #56]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #4]\",\n        \"fcvt d5, s5\",\n        \"fadd d6, d4, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #72]\",\n        \"ldr s6, [x8, #52]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #8]\",\n        \"fcvt d7, s7\",\n        \"fadd d8, d6, d7\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #76]\",\n        \"ldr s8, [x8, #48]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #12]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #80]\",\n        \"ldr s8, [x8, #44]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #16]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #84]\",\n        \"ldr s8, [x8, #40]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #20]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #88]\",\n        \"ldr s8, [x8, #36]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #24]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #92]\",\n        \"ldr s8, [x8, #32]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #28]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #96]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d2, d3, d2\",\n        \"mov w20, #0xc1d0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #100]\",\n        \"fsub d2, d5, d4\",\n        \"mov w20, #0xc1d4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #104]\",\n        \"fsub d2, d7, d6\",\n        \"mov w20, #0xc1d8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #108]\",\n        \"ldr s2, [x8, #12]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #48]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"mov w20, #0xc1dc\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #112]\",\n        \"ldr s2, [x8, #16]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #44]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"mov w20, #0xc1e0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #116]\",\n        \"ldr s2, [x8, #20]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #40]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"mov w20, #0xc1e4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #120]\",\n        \"ldr s2, [x8, #24]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #36]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"mov w20, #0xc1e8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #124]\",\n        \"ldr s2, [x8, #28]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #32]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"mov w20, #0xc1ec\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #128]\",\n        \"ldr s2, [x8, #96]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #68]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8]\",\n        \"ldr s4, [x8, #92]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #72]\",\n        \"fcvt d5, s5\",\n        \"fadd d6, d4, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #4]\",\n        \"ldr s6, [x8, #88]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #76]\",\n        \"fcvt d7, s7\",\n        \"fadd d8, d6, d7\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #8]\",\n        \"ldr s8, [x8, #84]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #80]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #12]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d2, d3, d2\",\n        \"mov w20, #0xc1f0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #16]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d2, d5, d4\",\n        \"mov w20, #0xc1f4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s4, [x20]\",\n        \"fcvt d4, s4\",\n        \"fmul d2, d2, d4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"fsub d2, d7, d6\",\n        \"mov w20, #0xc1f8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s5, [x20]\",\n        \"fcvt d5, s5\",\n        \"fmul d2, d2, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x8, #80]\",\n        \"fcvt d2, s2\",\n        \"ldr s6, [x8, #84]\",\n        \"fcvt d6, s6\",\n        \"fsub d2, d2, d6\",\n        \"mov w20, #0xc1fc\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s6, [x20]\",\n        \"fcvt d6, s6\",\n        \"fmul d2, d2, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x8, #128]\",\n        \"fcvt d2, s2\",\n        \"ldr s7, [x8, #100]\",\n        \"fcvt d7, s7\",\n        \"fadd d8, d2, d7\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #32]\",\n        \"ldr s8, [x8, #124]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #104]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #36]\",\n        \"ldr s8, [x8, #120]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #108]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #40]\",\n        \"ldr s8, [x8, #116]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #112]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"fsub d2, d7, d2\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #104]\",\n        \"fcvt d2, s2\",\n        \"ldr s7, [x8, #124]\",\n        \"fcvt d7, s7\",\n        \"fsub d2, d2, d7\",\n        \"fmul d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #52]\",\n        \"ldr s2, [x8, #108]\",\n        \"fcvt d2, s2\",\n        \"ldr s7, [x8, #120]\",\n        \"fcvt d7, s7\",\n        \"fsub d2, d2, d7\",\n        \"fmul d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #112]\",\n        \"fcvt d2, s2\",\n        \"ldr s7, [x8, #116]\",\n        \"fcvt d7, s7\",\n        \"fsub d2, d2, d7\",\n        \"fmul d2, d6, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #12]\",\n        \"fcvt d2, s2\",\n        \"ldr s6, [x8]\",\n        \"fcvt d6, s6\",\n        \"fadd d7, d2, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #68]\",\n        \"ldr s7, [x8, #8]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #4]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d7, d8\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #72]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d2, d6, d2\",\n        \"mov w20, #0xc200\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s6, [x20]\",\n        \"fcvt d6, s6\",\n        \"fmul d2, d2, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #76]\",\n        \"ldr s2, [x8, #4]\",\n        \"fcvt d2, s2\",\n        \"fsub d2, d2, d7\",\n        \"mov w20, #0xc204\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s7, [x20]\",\n        \"fcvt d7, s7\",\n        \"fmul d2, d2, d7\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #80]\",\n        \"ldr s2, [x8, #28]\",\n        \"fcvt d2, s2\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d2, d8\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #84]\",\n        \"ldr s8, [x8, #24]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #20]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #88]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"fsub d2, d8, d2\",\n        \"fmul d2, d2, d6\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #92]\",\n        \"ldr s2, [x8, #20]\",\n        \"fcvt d2, s2\",\n        \"ldr s8, [x8, #24]\",\n        \"fcvt d8, s8\",\n        \"fsub d2, d2, d8\",\n        \"fmul d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #96]\",\n        \"ldr s2, [x8, #44]\",\n        \"fcvt d2, s2\",\n        \"ldr s8, [x8, #32]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d2, d8\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #100]\",\n        \"ldr s8, [x8, #40]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #36]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #104]\",\n        \"ldr s8, [x8, #32]\",\n        \"fcvt d8, s8\",\n        \"fsub d2, d8, d2\",\n        \"fmul d2, d2, d6\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #108]\",\n        \"ldr s2, [x8, #36]\",\n        \"fcvt d2, s2\",\n        \"ldr s8, [x8, #40]\",\n        \"fcvt d8, s8\",\n        \"fsub d2, d2, d8\",\n        \"fmul d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #112]\",\n        \"ldr s2, [x8, #60]\",\n        \"fcvt d2, s2\",\n        \"ldr s8, [x8, #48]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d2, d8\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #116]\",\n        \"ldr s8, [x8, #56]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #52]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #120]\",\n        \"ldr s8, [x8, #48]\",\n        \"fcvt d8, s8\",\n        \"fsub d2, d8, d2\",\n        \"fmul d2, d2, d6\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #124]\",\n        \"ldr s2, [x8, #52]\",\n        \"fcvt d2, s2\",\n        \"ldr s8, [x8, #56]\",\n        \"fcvt d8, s8\",\n        \"fsub d2, d2, d8\",\n        \"fmul d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #128]\",\n        \"ldr s2, [x8, #72]\",\n        \"fcvt d2, s2\",\n        \"ldr s8, [x8, #68]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d2, d8\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8]\",\n        \"ldr s8, [x8, #68]\",\n        \"fcvt d8, s8\",\n        \"fsub d2, d8, d2\",\n        \"mov w20, #0xc208\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s8, [x20]\",\n        \"fcvt d8, s8\",\n        \"fmul d2, d2, d8\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #4]\",\n        \"ldr s2, [x8, #80]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #76]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #8]\",\n        \"ldr s2, [x8, #76]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #80]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fmul d2, d2, d8\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x8, #88]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #84]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x8, #84]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #88]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fmul d2, d2, d8\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #96]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #92]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x8, #92]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #96]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fmul d2, d2, d8\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x8, #104]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #100]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #32]\",\n        \"ldr s2, [x8, #100]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #104]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fmul d2, d2, d8\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #36]\",\n        \"ldr s2, [x8, #112]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #108]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x8, #108]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #112]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fmul d2, d2, d8\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #120]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #116]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #116]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #120]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fmul d2, d2, d8\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #52]\",\n        \"ldr s2, [x8, #128]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #124]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #124]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #128]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fmul d2, d2, d8\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #28]\",\n        \"fcvt d9, s2\",\n        \"str s2, [x8, #192]\",\n        \"ldr s2, [x8, #20]\",\n        \"fcvt d2, s2\",\n        \"fadd d2, d9, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #160]\",\n        \"ldr s2, [x8, #160]\",\n        \"fcvt d2, s2\",\n        \"fneg v2.2d, v2.2d\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #140]\",\n        \"ldr s2, [x8, #140]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #24]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #220]\",\n        \"ldr s2, [x8, #24]\",\n        \"fcvt d2, s2\",\n        \"fneg v2.2d, v2.2d\",\n        \"ldr s9, [x8, #28]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"ldr s9, [x8, #16]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #252]\",\n        \"ldr s2, [x8, #60]\",\n        \"fcvt d9, s2\",\n        \"str s2, [x8, #200]\",\n        \"ldr s2, [x8, #44]\",\n        \"fcvt d2, s2\",\n        \"fadd d2, d9, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #184]\",\n        \"ldr s2, [x8, #184]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #52]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #168]\",\n        \"ldr s2, [x8, #60]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #52]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"ldr s9, [x8, #36]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #152]\",\n        \"ldr s2, [x8, #152]\",\n        \"fcvt d2, s2\",\n        \"fneg v2.2d, v2.2d\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #132]\",\n        \"ldr s2, [x8, #132]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #56]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #212]\",\n        \"ldr s2, [x8, #56]\",\n        \"fcvt d2, s2\",\n        \"fneg v2.2d, v2.2d\",\n        \"ldr s9, [x8, #60]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"str d2, [x8, #272]\",\n        \"ldr s9, [x8, #40]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"ldr s9, [x8, #44]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #64]\",\n        \"ldr s2, [x8, #64]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #52]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #228]\",\n        \"ldr s2, [x8, #48]\",\n        \"fcvt d2, s2\",\n        \"ldr d9, [x8, #272]\",\n        \"fsub d2, d9, d2\",\n        \"ldr s9, [x8, #32]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #260]\",\n        \"ldr s2, [x8, #64]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #48]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #244]\",\n        \"ldr s2, [x8]\",\n        \"fcvt d2, s2\",\n        \"fneg v2.2d, v2.2d\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #268]\",\n        \"ldr s2, [x8, #4]\",\n        \"str s2, [x8, #144]\",\n        \"ldr s2, [x8, #12]\",\n        \"fcvt d9, s2\",\n        \"str s2, [x8, #176]\",\n        \"fneg v2.2d, v9.2d\",\n        \"ldr s9, [x8, #8]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #236]\",\n        \"ldr s2, [x7, #4104]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4228]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc190\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8]\",\n        \"ldr s2, [x7, #4108]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4224]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc194\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #4]\",\n        \"ldr s2, [x7, #4112]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4220]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc198\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #8]\",\n        \"ldr s2, [x7, #4116]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4216]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc19c\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x7, #4120]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4212]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1a0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x7, #4124]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4208]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1a4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x7, #4128]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4204]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1a8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x7, #4132]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4200]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1ac\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x7, #4136]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4196]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1b0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #32]\",\n        \"ldr s2, [x7, #4140]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4192]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1b4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #36]\",\n        \"ldr s2, [x7, #4144]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4188]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1b8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x7, #4148]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4184]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1bc\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x7, #4152]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4180]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1c0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x7, #4156]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4176]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1c4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #52]\",\n        \"ldr s2, [x7, #4160]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4172]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1c8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x7, #4164]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x7, #4168]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1cc\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #60]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #68]\",\n        \"ldr s2, [x8, #56]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #4]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #72]\",\n        \"ldr s2, [x8, #52]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #8]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #76]\",\n        \"ldr s2, [x8, #48]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #12]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #80]\",\n        \"ldr s2, [x8, #44]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #16]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #84]\",\n        \"ldr s2, [x8, #40]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #20]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #88]\",\n        \"ldr s2, [x8, #36]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #24]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #92]\",\n        \"ldr s2, [x8, #32]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #28]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #96]\",\n        \"ldr s2, [x8]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #60]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1d0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #100]\",\n        \"ldr s2, [x8, #4]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #56]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1d4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #104]\",\n        \"ldr s2, [x8, #8]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #52]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1d8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #108]\",\n        \"ldr s2, [x8, #12]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #48]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1dc\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #112]\",\n        \"ldr s2, [x8, #16]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #44]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1e0\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #116]\",\n        \"ldr s2, [x8, #20]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #40]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1e4\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #120]\",\n        \"ldr s2, [x8, #24]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #36]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1e8\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #124]\",\n        \"ldr s2, [x8, #28]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #32]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1ec\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #128]\",\n        \"ldr s2, [x8, #96]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #68]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8]\",\n        \"ldr s2, [x8, #92]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #72]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #4]\",\n        \"ldr s2, [x8, #88]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #76]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #8]\",\n        \"ldr s2, [x8, #84]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #80]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x8, #68]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #96]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x8, #72]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #92]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fmul d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #76]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #88]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fmul d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x8, #80]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #84]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"mov w20, #0xc1fc\",\n        \"movk w20, #0xb3, lsl #16\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x8, #128]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #100]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #32]\",\n        \"ldr s2, [x8, #124]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #104]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #36]\",\n        \"ldr s2, [x8, #120]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #108]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x8, #116]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #112]\",\n        \"fcvt d9, s9\",\n        \"fadd d2, d2, d9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #100]\",\n        \"fcvt d2, s2\",\n        \"ldr s9, [x8, #128]\",\n        \"fcvt d9, s9\",\n        \"fsub d2, d2, d9\",\n        \"fmul d2, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #104]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #124]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fmul d2, d4, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #52]\",\n        \"ldr s2, [x8, #108]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #120]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fmul d2, d5, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #112]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #116]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #12]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #68]\",\n        \"ldr s4, [x8, #8]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #4]\",\n        \"fcvt d5, s5\",\n        \"fadd d5, d4, d5\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #72]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d2, d3, d2\",\n        \"fmul d2, d2, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #76]\",\n        \"ldr s2, [x8, #4]\",\n        \"fcvt d2, s2\",\n        \"fsub d2, d2, d4\",\n        \"fmul d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #80]\",\n        \"ldr s2, [x8, #28]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #16]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #84]\",\n        \"ldr s4, [x8, #24]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #20]\",\n        \"fcvt d5, s5\",\n        \"fadd d5, d4, d5\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #88]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d2, d3, d2\",\n        \"fmul d2, d2, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #92]\",\n        \"ldr s2, [x8, #20]\",\n        \"fcvt d2, s2\",\n        \"fsub d2, d2, d4\",\n        \"fmul d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #96]\",\n        \"ldr s2, [x8, #44]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #32]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #100]\",\n        \"ldr s4, [x8, #40]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #36]\",\n        \"fcvt d5, s5\",\n        \"fadd d5, d4, d5\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #104]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d2, d3, d2\",\n        \"fmul d2, d2, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #108]\",\n        \"ldr s2, [x8, #36]\",\n        \"fcvt d2, s2\",\n        \"fsub d2, d2, d4\",\n        \"fmul d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #112]\",\n        \"ldr s2, [x8, #60]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #48]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #116]\",\n        \"ldr s4, [x8, #56]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #52]\",\n        \"fcvt d5, s5\",\n        \"fadd d5, d4, d5\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #120]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d2, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d2, d6, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #124]\",\n        \"ldr s2, [x8, #52]\",\n        \"fcvt d2, s2\",\n        \"fsub d2, d2, d4\",\n        \"fmul d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #128]\",\n        \"ldr s2, [x8, #72]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #68]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8]\",\n        \"fsub d2, d3, d2\",\n        \"fmul d2, d2, d8\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #4]\",\n        \"ldr s2, [x8, #80]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #76]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #8]\",\n        \"fsub d2, d3, d2\",\n        \"fmul d2, d2, d8\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x8, #88]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #84]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #16]\",\n        \"fsub d2, d3, d2\",\n        \"fmul d2, d2, d8\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #96]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #92]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #24]\",\n        \"fsub d2, d3, d2\",\n        \"fmul d2, d2, d8\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x8, #104]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #100]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #32]\",\n        \"fsub d2, d3, d2\",\n        \"fmul d2, d2, d8\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #36]\",\n        \"ldr s2, [x8, #112]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #108]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #40]\",\n        \"fsub d2, d3, d2\",\n        \"fmul d2, d2, d8\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #120]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #116]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #48]\",\n        \"fsub d2, d3, d2\",\n        \"fmul d2, d2, d8\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #52]\",\n        \"ldr s2, [x8, #128]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #124]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #56]\",\n        \"fsub d2, d3, d2\",\n        \"fmul d2, d8, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #60]\",\n        \"fcvt d3, s2\",\n        \"ldr s4, [x8, #28]\",\n        \"fcvt d4, s4\",\n        \"fadd d5, d3, d4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #196]\",\n        \"ldr s5, [x8, #196]\",\n        \"fcvt d6, s5\",\n        \"ldr s7, [x8, #44]\",\n        \"fcvt d7, s7\",\n        \"fadd d8, d6, d7\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #188]\",\n        \"ldr s8, [x8, #188]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #20]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"ldr s9, [x8, #52]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #164]\",\n        \"fadd d8, d3, d7\",\n        \"ldr s10, [x8, #12]\",\n        \"fcvt d10, s10\",\n        \"fadd d8, d8, d10\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #180]\",\n        \"ldr s8, [x8, #180]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #172]\",\n        \"fadd d8, d3, d9\",\n        \"ldr s10, [x8, #36]\",\n        \"fcvt d10, s10\",\n        \"fadd d8, d8, d10\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #64]\",\n        \"ldr s8, [x8, #64]\",\n        \"fcvt d8, s8\",\n        \"ldr s10, [x8, #4]\",\n        \"fcvt d10, s10\",\n        \"fadd d8, d8, d10\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #148]\",\n        \"ldr s8, [x8, #148]\",\n        \"fcvt d8, s8\",\n        \"fneg v8.2d, v8.2d\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #272]\",\n        \"ldr s8, [x8, #272]\",\n        \"fcvt d8, s8\",\n        \"ldr s10, [x8, #56]\",\n        \"fcvt d10, s10\",\n        \"fsub d8, d8, d10\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #208]\",\n        \"ldr s8, [x8, #64]\",\n        \"fcvt d8, s8\",\n        \"ldr s11, [x8, #20]\",\n        \"fcvt d11, s11\",\n        \"fadd d8, d8, d11\",\n        \"fadd d8, d8, d4\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #156]\",\n        \"ldr s8, [x8, #156]\",\n        \"fcvt d8, s8\",\n        \"fneg v8.2d, v8.2d\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #136]\",\n        \"ldr s8, [x8, #136]\",\n        \"fcvt d8, s8\",\n        \"ldr s11, [x8, #24]\",\n        \"fcvt d11, s11\",\n        \"fsub d8, d8, d11\",\n        \"fsub d8, d8, d10\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #216]\",\n        \"ldr s8, [x8, #40]\",\n        \"fcvt d8, s8\",\n        \"fneg v8.2d, v8.2d\",\n        \"fsub d7, d8, d7\",\n        \"fsub d7, d7, d10\",\n        \"fsub d7, d7, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #64]\",\n        \"ldr s7, [x8, #64]\",\n        \"fcvt d7, s7\",\n        \"fsub d8, d7, d9\",\n        \"ldr s9, [x8, #8]\",\n        \"fcvt d9, s9\",\n        \"fsub d9, d8, d9\",\n        \"ldr s11, [x8, #12]\",\n        \"fcvt d11, s11\",\n        \"fsub d9, d9, d11\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #232]\",\n        \"ldr s9, [x8, #20]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"ldr s9, [x8, #24]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fsub d8, d8, d4\",\n        \"mov w20, #0x0\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #224]\",\n        \"ldr s8, [x8, #48]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"ldr s9, [x8, #8]\",\n        \"fcvt d9, s9\",\n        \"fsub d9, d7, d9\",\n        \"ldr s11, [x8, #12]\",\n        \"fcvt d11, s11\",\n        \"fsub d9, d9, d11\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #240]\",\n        \"ldr s9, [x8, #24]\",\n        \"fcvt d9, s9\",\n        \"ldr s11, [x8, #16]\",\n        \"fcvt d11, s11\",\n        \"fadd d9, d9, d11\",\n        \"fadd d4, d4, d9\",\n        \"ldr w4, [x7, #4100]\",\n        \"ldr w5, [x7, #4096]\",\n        \"strb wzr, [x28, #1049]\",\n        \"add w4, w5, w4, lsl #2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #64]\",\n        \"ldr s4, [x8, #64]\",\n        \"fcvt d4, s4\",\n        \"fsub d7, d7, d4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #248]\",\n        \"ldr s7, [x8, #32]\",\n        \"fcvt d7, s7\",\n        \"fneg v7.2d, v7.2d\",\n        \"fsub d7, d7, d8\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d7, d7, d10\",\n        \"fsub d7, d7, d3\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #64]\",\n        \"ldr s7, [x8, #64]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8]\",\n        \"fcvt d8, s8\",\n        \"fsub d8, d7, d8\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #264]\",\n        \"fsub d4, d7, d4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #256]\",\n        \"ldr s4, [x8, #144]\",\n        \"str s4, [x4]\",\n        \"ldr s4, [x8, #148]\",\n        \"str s4, [x4, #64]\",\n        \"ldr s4, [x8, #152]\",\n        \"str s4, [x4, #128]\",\n        \"ldr s4, [x8, #156]\",\n        \"str s4, [x4, #192]\",\n        \"ldr s4, [x8, #160]\",\n        \"str s4, [x4, #256]\",\n        \"ldr s4, [x8, #164]\",\n        \"fcvt d7, s4\",\n        \"str s4, [x4, #320]\",\n        \"ldr s4, [x8, #168]\",\n        \"fcvt d8, s4\",\n        \"str s4, [x4, #384]\",\n        \"ldr s4, [x8, #172]\",\n        \"fcvt d9, s4\",\n        \"str s4, [x4, #448]\",\n        \"ldr s4, [x8, #176]\",\n        \"fcvt d10, s4\",\n        \"str s4, [x4, #512]\",\n        \"ldr s4, [x8, #180]\",\n        \"str s4, [x4, #576]\",\n        \"ldr s4, [x8, #184]\",\n        \"fcvt d11, s4\",\n        \"str s4, [x4, #640]\",\n        \"ldr s4, [x8, #188]\",\n        \"str s4, [x4, #704]\",\n        \"ldr s4, [x8, #192]\",\n        \"str s4, [x4, #768]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s5, [x4, #832]\",\n        \"ldr s4, [x8, #200]\",\n        \"str s4, [x4, #896]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s2, [x4, #960]\",\n        \"fmov d2, x20\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #1024]\",\n        \"fneg v2.2d, v3.2d\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #1088]\",\n        \"ldr s2, [x8, #200]\",\n        \"fcvt d2, s2\",\n        \"fneg v2.2d, v2.2d\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #1152]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fneg v2.2d, v6.2d\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #1216]\",\n        \"ldr s2, [x8, #192]\",\n        \"fcvt d2, s2\",\n        \"fneg v2.2d, v2.2d\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #1280]\",\n        \"ldr s2, [x8, #188]\",\n        \"fcvt d2, s2\",\n        \"fneg v2.2d, v2.2d\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #1344]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fneg v2.2d, v11.2d\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #1408]\",\n        \"ldr s2, [x8, #180]\",\n        \"fcvt d2, s2\",\n        \"fneg v2.2d, v2.2d\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #1472]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fneg v2.2d, v10.2d\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #1536]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fneg v2.2d, v9.2d\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #1600]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fneg v2.2d, v8.2d\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #1664]\",\n        \"fneg v2.2d, v7.2d\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #1728]\",\n        \"ldr s2, [x8, #140]\",\n        \"str s2, [x4, #1792]\",\n        \"ldr s2, [x8, #136]\",\n        \"str s2, [x4, #1856]\",\n        \"ldr s2, [x8, #132]\",\n        \"str s2, [x4, #1920]\",\n        \"ldr s2, [x8, #272]\",\n        \"str s2, [x4, #1984]\",\n        \"ldr w20, [x7, #4096]\",\n        \"eor x27, x20, x7\",\n        \"subs w26, w20, w7\",\n        \"add w4, w7, #0x800 (2048)\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block2\": {\n      \"x86InstructionCount\": 630,\n      \"ExpectedInstructionCount\": 938,\n      \"x86Insts\": [\n        \"mov eax,dword [ebp + 0x8]\",\n        \"fld dword [eax + 0x40]\",\n        \"fld dword [eax + 0x44]\",\n        \"fadd st0,st1\",\n        \"fstp dword [eax + 0x44]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x40]\",\n        \"fld dword [eax + 0x38]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x3c]\",\n        \"fld dword [eax + 0x34]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x38]\",\n        \"fld dword [eax + 0x30]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x34]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x30]\",\n        \"fld dword [eax + 0x28]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x2c]\",\n        \"fld dword [eax + 0x24]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x28]\",\n        \"fld dword [eax + 0x20]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x24]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x20]\",\n        \"fld dword [eax + 0x18]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x1c]\",\n        \"fld dword [eax + 0x14]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x18]\",\n        \"fld dword [eax + 0x10]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x14]\",\n        \"fld dword [eax + 0xc]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x8]\",\n        \"fld dword [eax]\",\n        \"fst qword [esp + 0x20]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst dword [eax + 0x4]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fld dword [eax + 0x44]\",\n        \"fadd st0,st1\",\n        \"fstp dword [eax + 0x44]\",\n        \"fld dword [eax + 0x34]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x3c]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x34]\",\n        \"fld dword [eax + 0x24]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x2c]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x24]\",\n        \"fld dword [eax + 0x14]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x1c]\",\n        \"fld dword [eax + 0xc]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [eax + 0x14]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fstp dword [eax + 0xc]\",\n        \"fadd st0,st0\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + 0x30]\",\n        \"fst qword [esp + 0x18]\",\n        \"fld dword [esp + 0x14]\",\n        \"fst qword [esp + 0x28]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fst qword [esp + 0x80]\",\n        \"fld dword [eax + 0x20]\",\n        \"fld dword [eax + 0x40]\",\n        \"fld st3\",\n        \"fld qword [0x00a77b70]\",\n        \"fmul st1\",\n        \"fxch\",\n        \"faddp st4,st0\",\n        \"fld st2\",\n        \"fld qword [0x00a77b68]\",\n        \"fmul st1\",\n        \"fxch st5\",\n        \"faddp\",\n        \"fld st2\",\n        \"fld qword [0x00a77b60]\",\n        \"fmul st1\",\n        \"fxch st2\",\n        \"faddp\",\n        \"fstp dword [esp + 0xc0]\",\n        \"fld qword [esp + 0x28]\",\n        \"fadd st0,st6\",\n        \"fsub st0,st4\",\n        \"fld qword [esp + 0x18]\",\n        \"fsub st1,st0\",\n        \"fsubp\",\n        \"fsub st0,st3\",\n        \"fstp dword [esp + 0xd0]\",\n        \"fld st5\",\n        \"fmul st1\",\n        \"fsubr qword [esp + 0x80]\",\n        \"fld st4\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fld st3\",\n        \"fmul st6\",\n        \"faddp\",\n        \"fstp dword [esp + 0xb8]\",\n        \"fld st5\",\n        \"fmul st5\",\n        \"fsubr qword [esp + 0x80]\",\n        \"fld st4\",\n        \"fmul st2\",\n        \"faddp\",\n        \"fld st3\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [esp + 0xc8]\",\n        \"fld qword [esp + 0x20]\",\n        \"fsubrp st6,st0\",\n        \"fxch st5\",\n        \"faddp st3,st0\",\n        \"fxch st2\",\n        \"fsub qword [esp + 0x18]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x80]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmul qword [0x00a77b58]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + 0x8]\",\n        \"fst qword [esp + 0x18]\",\n        \"fld dword [esp + 0x14]\",\n        \"fst qword [esp + 0x20]\",\n        \"fld dword [eax + 0x28]\",\n        \"fst qword [esp + 0x90]\",\n        \"fld dword [eax + 0x38]\",\n        \"fst qword [esp + 0x28]\",\n        \"fld qword [0x00a77b50]\",\n        \"fmul st4\",\n        \"fxch st4\",\n        \"faddp st3,st0\",\n        \"fld qword [0x00a77b48]\",\n        \"fmul st2\",\n        \"fxch st3\",\n        \"faddp st2,st0\",\n        \"fld qword [0x00a77b40]\",\n        \"fmul st1\",\n        \"fxch st2\",\n        \"faddp\",\n        \"fstp dword [esp + 0xb4]\",\n        \"fld qword [esp + 0x18]\",\n        \"fld qword [esp + 0x90]\",\n        \"fsub st1,st0\",\n        \"fxch\",\n        \"fsub qword [esp + 0x28]\",\n        \"fmul qword [0x00a77b58]\",\n        \"fstp dword [esp + 0xc4]\",\n        \"fld qword [esp + 0x18]\",\n        \"fmul st3\",\n        \"fsub qword [esp + 0x20]\",\n        \"fxch\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fld qword [esp + 0x28]\",\n        \"fmul st4\",\n        \"faddp\",\n        \"fstp dword [esp + 0xa8]\",\n        \"fld qword [esp + 0x18]\",\n        \"fmul st1\",\n        \"fsub qword [esp + 0x20]\",\n        \"fld qword [esp + 0x90]\",\n        \"fmul st4\",\n        \"faddp\",\n        \"fld qword [esp + 0x28]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x90]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst qword [esp + 0x8]\",\n        \"fadd st0,st0\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + 0x34]\",\n        \"fst qword [esp + 0x98]\",\n        \"fld dword [esp + 0x14]\",\n        \"fst qword [esp + 0xa0]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + 0x14]\",\n        \"fst qword [esp + 0x20]\",\n        \"fld dword [esp + 0x14]\",\n        \"fstp qword [esp + 0x88]\",\n        \"fld dword [eax + 0x24]\",\n        \"fstp qword [esp + 0x18]\",\n        \"fld dword [eax + 0x44]\",\n        \"fstp qword [esp + 0x28]\",\n        \"fmul st4\",\n        \"fadd qword [esp + 0x88]\",\n        \"fld qword [esp + 0x18]\",\n        \"fmul st6\",\n        \"faddp\",\n        \"fld qword [esp + 0x28]\",\n        \"fmul st7\",\n        \"faddp\",\n        \"fstp dword [esp + 0xb0]\",\n        \"fld qword [esp + 0xa0]\",\n        \"fadd qword [esp + 0x20]\",\n        \"fsub qword [esp + 0x18]\",\n        \"fld qword [esp + 0x98]\",\n        \"fsub st1,st0\",\n        \"fsubp\",\n        \"fsub qword [esp + 0x28]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld qword [esp + 0x20]\",\n        \"fmul st6\",\n        \"fsubr qword [esp + 0x88]\",\n        \"fld qword [esp + 0x18]\",\n        \"fmul st5\",\n        \"fsubp\",\n        \"fld qword [esp + 0x28]\",\n        \"fmul st6\",\n        \"faddp\",\n        \"fstp dword [esp + 0xa0]\",\n        \"fld qword [esp + 0x20]\",\n        \"fld st0\",\n        \"fmulp st6\",\n        \"fld qword [esp + 0x88]\",\n        \"fsubrp st6,st0\",\n        \"fld qword [esp + 0x18]\",\n        \"fmulp st7\",\n        \"fxch st5\",\n        \"faddp st6,st0\",\n        \"fld qword [esp + 0x28]\",\n        \"fld st0\",\n        \"fmulp st5\",\n        \"fxch st6\",\n        \"fsubrp st4,st0\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld qword [esp + 0x8]\",\n        \"fsubrp st4,st0\",\n        \"fxch st3\",\n        \"fadd qword [esp + 0x18]\",\n        \"fsub qword [esp + 0x98]\",\n        \"faddp st4,st0\",\n        \"fxch st3\",\n        \"fmul qword [0x00a77bd8]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmul qword [0x00a77b58]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x14]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fld dword [esp + 0x4]\",\n        \"fmul st6\",\n        \"fadd st0,st3\",\n        \"fld st2\",\n        \"fmul st6\",\n        \"faddp\",\n        \"fld st1\",\n        \"fmul st5\",\n        \"faddp\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + 0xc]\",\n        \"fst qword [esp + 0x20]\",\n        \"fsub st0,st2\",\n        \"fsub st0,st1\",\n        \"fmul qword [0x00a77b58]\",\n        \"fstp dword [esp + 0x98]\",\n        \"fld qword [esp + 0x20]\",\n        \"fmul st5\",\n        \"fsub st0,st3\",\n        \"fld st2\",\n        \"fmul st5\",\n        \"fsubp\",\n        \"fld st1\",\n        \"fmul st7\",\n        \"faddp\",\n        \"fstp dword [esp + 0x88]\",\n        \"fld qword [esp + 0x20]\",\n        \"fmulp st4\",\n        \"fxch st3\",\n        \"fsubrp st2,st0\",\n        \"fmulp st4\",\n        \"faddp st3,st0\",\n        \"fmulp\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esp + 0xb4]\",\n        \"fld dword [esp + 0xc0]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x14]\",\n        \"fld dword [esp + 0xb0]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fmul qword [0x00a77b38]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x38]\",\n        \"fsubrp\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0xc4]\",\n        \"fld dword [esp + 0xd0]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x98]\",\n        \"fst qword [esp + 0xd0]\",\n        \"fld dword [esp + 0x30]\",\n        \"fst qword [esp + 0x98]\",\n        \"faddp\",\n        \"fmul qword [0x00a77bd0]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst qword [esp + 0x30]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fsubr qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x78]\",\n        \"fld dword [esp + 0xa8]\",\n        \"fst qword [esp + 0xa8]\",\n        \"fld dword [esp + 0xb8]\",\n        \"fst qword [esp + 0xb8]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x88]\",\n        \"fst qword [esp + 0x88]\",\n        \"fld dword [esp + 0xa0]\",\n        \"fst qword [esp + 0xa0]\",\n        \"faddp\",\n        \"fmul qword [0x00a77b30]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst qword [esp + 0x30]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x40]\",\n        \"fsubr qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x90]\",\n        \"fst qword [esp + 0x90]\",\n        \"fld dword [esp + 0xc8]\",\n        \"fst qword [esp + 0xc8]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x20]\",\n        \"fst qword [esp + 0x20]\",\n        \"fld dword [esp + 0x28]\",\n        \"fst qword [esp + 0x28]\",\n        \"faddp\",\n        \"fmul qword [0x00a77b28]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst qword [esp + 0x30]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x44]\",\n        \"fsubr qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [esp + 0x18]\",\n        \"fld dword [esp + 0x80]\",\n        \"fst qword [esp + 0x80]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x48]\",\n        \"fsubr qword [esp + 0x80]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld qword [esp + 0xc8]\",\n        \"fsub qword [esp + 0x90]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld qword [esp + 0x28]\",\n        \"fsub qword [esp + 0x20]\",\n        \"fmul qword [0x00a77b20]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst qword [esp + 0x30]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fsubr qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fld qword [esp + 0xb8]\",\n        \"fsub qword [esp + 0xa8]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld qword [esp + 0xa0]\",\n        \"fsub qword [esp + 0x88]\",\n        \"fmul qword [0x00a77b18]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst qword [esp + 0x30]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x50]\",\n        \"fsubr qword [esp + 0x30]\",\n        \"fstp dword [esp + 0x64]\",\n        \"fsubrp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld qword [esp + 0x98]\",\n        \"fsub qword [esp + 0xd0]\",\n        \"fmul qword [0x00a77be0]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x54]\",\n        \"fsubrp\",\n        \"fstp dword [esp + 0x60]\",\n        \"fxch st2\",\n        \"fsubrp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x8]\",\n        \"fsubrp\",\n        \"fmul qword [0x00a77b10]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"lea eax,[ecx + ecx*0x8]\",\n        \"fld st0\",\n        \"mov ecx,dword [ebp + 0xc]\",\n        \"fadd st0,st2\",\n        \"shl eax,0x4\",\n        \"add eax,0xb183d0\",\n        \"fstp dword [esp + 0x58]\",\n        \"fsubrp\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fld st0\",\n        \"fchs\",\n        \"fmul dword [eax]\",\n        \"fstp dword [ecx]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld dword [esp + 0x60]\",\n        \"fld st0\",\n        \"fchs\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [ecx + 0x4]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld dword [esp + 0x64]\",\n        \"fld st0\",\n        \"fchs\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [ecx + 0x8]\",\n        \"fld dword [eax + 0xc]\",\n        \"fld dword [esp + 0x68]\",\n        \"fld st0\",\n        \"fchs\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [ecx + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fld st0\",\n        \"fchs\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [ecx + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"fld dword [esp + 0x70]\",\n        \"fld st0\",\n        \"fchs\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [ecx + 0x14]\",\n        \"fld dword [eax + 0x18]\",\n        \"fld dword [esp + 0x74]\",\n        \"fchs\",\n        \"fmulp\",\n        \"fstp dword [ecx + 0x18]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fld dword [esp + 0x78]\",\n        \"fchs\",\n        \"fmulp\",\n        \"fstp dword [ecx + 0x1c]\",\n        \"fld dword [eax + 0x20]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fchs\",\n        \"fmulp\",\n        \"fstp dword [ecx + 0x20]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmul dword [esp + 0x7c]\",\n        \"fstp dword [ecx + 0x24]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [ecx + 0x28]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmul dword [esp + 0x74]\",\n        \"fstp dword [ecx + 0x2c]\",\n        \"fmul dword [eax + 0x30]\",\n        \"fstp dword [ecx + 0x30]\",\n        \"fmul dword [eax + 0x34]\",\n        \"fstp dword [ecx + 0x34]\",\n        \"fmul dword [eax + 0x38]\",\n        \"fstp dword [ecx + 0x38]\",\n        \"fmul dword [eax + 0x3c]\",\n        \"fstp dword [ecx + 0x3c]\",\n        \"fmul dword [eax + 0x40]\",\n        \"fstp dword [ecx + 0x40]\",\n        \"fmul dword [eax + 0x44]\",\n        \"fstp dword [ecx + 0x44]\",\n        \"fld dword [esp + 0x58]\",\n        \"fld dword [eax + 0x48]\",\n        \"fmul st1\",\n        \"fstp dword [ecx + 0x48]\",\n        \"fld dword [esp + 0x54]\",\n        \"fld dword [eax + 0x4c]\",\n        \"fmul st1\",\n        \"fstp dword [ecx + 0x4c]\",\n        \"fld dword [esp + 0x50]\",\n        \"fld dword [eax + 0x50]\",\n        \"fmul st1\",\n        \"fstp dword [ecx + 0x50]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fld dword [eax + 0x54]\",\n        \"fmul st1\",\n        \"fstp dword [ecx + 0x54]\",\n        \"fld dword [esp + 0x48]\",\n        \"fld dword [eax + 0x58]\",\n        \"fmul st1\",\n        \"fstp dword [ecx + 0x58]\",\n        \"fld dword [esp + 0x44]\",\n        \"fld dword [eax + 0x5c]\",\n        \"fmul st1\",\n        \"fstp dword [ecx + 0x5c]\",\n        \"fld dword [esp + 0x40]\",\n        \"fst qword [esp + 0x18]\",\n        \"fmul dword [eax + 0x60]\",\n        \"fstp dword [ecx + 0x60]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fst qword [esp + 0x80]\",\n        \"fmul dword [eax + 0x64]\",\n        \"fstp dword [ecx + 0x64]\",\n        \"fld dword [esp + 0x38]\",\n        \"fld dword [eax + 0x68]\",\n        \"fmul st1\",\n        \"fstp dword [ecx + 0x68]\",\n        \"fmul dword [eax + 0x6c]\",\n        \"fstp dword [ecx + 0x6c]\",\n        \"fld dword [eax + 0x70]\",\n        \"fmul qword [esp + 0x80]\",\n        \"fstp dword [ecx + 0x70]\",\n        \"fld dword [eax + 0x74]\",\n        \"fmul qword [esp + 0x18]\",\n        \"fstp dword [ecx + 0x74]\",\n        \"fmul dword [eax + 0x78]\",\n        \"fstp dword [ecx + 0x78]\",\n        \"fmul dword [eax + 0x7c]\",\n        \"fstp dword [ecx + 0x7c]\",\n        \"fmul dword [eax + 0x80]\",\n        \"fstp dword [ecx + 0x80]\",\n        \"fmul dword [eax + 0x84]\",\n        \"fstp dword [ecx + 0x84]\",\n        \"fmul dword [eax + 0x88]\",\n        \"fstp dword [ecx + 0x88]\",\n        \"fmul dword [eax + 0x8c]\",\n        \"fstp dword [ecx + 0x8c]\",\n        \"mov esp,ebp\",\n        \"pop ebp\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x9, #8]\",\n        \"ldr s2, [x4, #64]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #68]\",\n        \"fcvt d3, s3\",\n        \"fadd d3, d3, d2\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #68]\",\n        \"ldr s3, [x4, #60]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #64]\",\n        \"ldr s2, [x4, #56]\",\n        \"fcvt d2, s2\",\n        \"fadd d3, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #60]\",\n        \"ldr s3, [x4, #52]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #56]\",\n        \"ldr s2, [x4, #48]\",\n        \"fcvt d2, s2\",\n        \"fadd d3, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #52]\",\n        \"ldr s3, [x4, #44]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #48]\",\n        \"ldr s2, [x4, #40]\",\n        \"fcvt d2, s2\",\n        \"fadd d3, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #44]\",\n        \"ldr s3, [x4, #36]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #40]\",\n        \"ldr s2, [x4, #32]\",\n        \"fcvt d2, s2\",\n        \"fadd d3, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #36]\",\n        \"ldr s3, [x4, #28]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #32]\",\n        \"ldr s2, [x4, #24]\",\n        \"fcvt d2, s2\",\n        \"fadd d3, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #28]\",\n        \"ldr s3, [x4, #20]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #24]\",\n        \"ldr s2, [x4, #16]\",\n        \"fcvt d2, s2\",\n        \"fadd d3, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #20]\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #16]\",\n        \"ldr s2, [x4, #8]\",\n        \"fcvt d2, s2\",\n        \"fadd d3, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #12]\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #8]\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"str d2, [x8, #32]\",\n        \"fadd d3, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #8]\",\n        \"ldr s3, [x8, #8]\",\n        \"fcvt d4, s3\",\n        \"str s3, [x4, #4]\",\n        \"ldr s3, [x4, #60]\",\n        \"fcvt d3, s3\",\n        \"ldr s5, [x4, #68]\",\n        \"fcvt d5, s5\",\n        \"fadd d5, d5, d3\",\n        \"fcvt s5, d5\",\n        \"str s5, [x4, #68]\",\n        \"ldr s5, [x4, #52]\",\n        \"fcvt d5, s5\",\n        \"fadd d3, d3, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #60]\",\n        \"ldr s3, [x4, #44]\",\n        \"fcvt d3, s3\",\n        \"fadd d5, d5, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s5, d5\",\n        \"str s5, [x4, #52]\",\n        \"ldr s5, [x4, #36]\",\n        \"fcvt d5, s5\",\n        \"fadd d3, d3, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #44]\",\n        \"ldr s3, [x4, #28]\",\n        \"fcvt d3, s3\",\n        \"fadd d5, d5, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s5, d5\",\n        \"str s5, [x4, #36]\",\n        \"ldr s5, [x4, #20]\",\n        \"fcvt d5, s5\",\n        \"fadd d3, d3, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #28]\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"fadd d5, d5, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s5, d5\",\n        \"str s5, [x4, #20]\",\n        \"fadd d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #4]\",\n        \"ldr s3, [x8, #4]\",\n        \"str s3, [x4, #12]\",\n        \"fadd d2, d2, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x4, #48]\",\n        \"fcvt d2, s2\",\n        \"str d2, [x8, #24]\",\n        \"ldr s3, [x8, #20]\",\n        \"fcvt d3, s3\",\n        \"str d3, [x8, #40]\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x4, #16]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #20]\",\n        \"fcvt d3, s3\",\n        \"str d3, [x8, #128]\",\n        \"ldr s4, [x4, #32]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x4, #64]\",\n        \"fcvt d5, s5\",\n        \"mov w20, #0x7b70\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d6, [x20]\",\n        \"fmul d6, d6, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fadd d3, d3, d2\",\n        \"mov w20, #0x7b68\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d7, [x20]\",\n        \"fmul d7, d7, d4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fadd d3, d4, d3\",\n        \"mov w20, #0x7b60\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d8, [x20]\",\n        \"fmul d8, d8, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"fadd d3, d5, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #192]\",\n        \"ldr d3, [x8, #40]\",\n        \"fadd d3, d3, d2\",\n        \"fsub d3, d3, d4\",\n        \"ldr d9, [x8, #24]\",\n        \"fsub d3, d3, d9\",\n        \"fsub d3, d3, d9\",\n        \"fsub d3, d3, d5\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #208]\",\n        \"fmul d3, d2, d8\",\n        \"ldr d9, [x8, #128]\",\n        \"fsub d3, d9, d3\",\n        \"fmul d9, d4, d6\",\n        \"fsub d3, d3, d9\",\n        \"fmul d9, d5, d7\",\n        \"fadd d3, d3, d9\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #184]\",\n        \"fmul d3, d2, d7\",\n        \"ldr d9, [x8, #128]\",\n        \"fsub d3, d9, d3\",\n        \"fmul d9, d4, d8\",\n        \"fadd d3, d3, d9\",\n        \"fmul d9, d5, d6\",\n        \"fsub d3, d3, d9\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #200]\",\n        \"ldr d3, [x8, #32]\",\n        \"fsub d2, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fadd d2, d4, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr d3, [x8, #24]\",\n        \"fsub d2, d2, d3\",\n        \"fadd d2, d5, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #128]\",\n        \"ldr s2, [x4, #24]\",\n        \"fcvt d2, s2\",\n        \"mov w20, #0x7b58\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d3, [x20]\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x4, #8]\",\n        \"fcvt d2, s2\",\n        \"str d2, [x8, #24]\",\n        \"ldr s3, [x8, #20]\",\n        \"fcvt d3, s3\",\n        \"str d3, [x8, #32]\",\n        \"ldr s4, [x4, #40]\",\n        \"fcvt d4, s4\",\n        \"str d4, [x8, #144]\",\n        \"ldr s5, [x4, #56]\",\n        \"fcvt d5, s5\",\n        \"str d5, [x8, #40]\",\n        \"mov w21, #0x7b50\",\n        \"movk w21, #0xa7, lsl #16\",\n        \"ldr d9, [x21]\",\n        \"fmul d9, d9, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fadd d2, d3, d2\",\n        \"mov w21, #0x7b48\",\n        \"movk w21, #0xa7, lsl #16\",\n        \"ldr d3, [x21]\",\n        \"fmul d3, d3, d4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fadd d2, d4, d2\",\n        \"mov w21, #0x7b40\",\n        \"movk w21, #0xa7, lsl #16\",\n        \"ldr d4, [x21]\",\n        \"fmul d4, d4, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"fadd d2, d5, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #180]\",\n        \"ldr d2, [x8, #24]\",\n        \"ldr d5, [x8, #144]\",\n        \"fsub d2, d2, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr d10, [x8, #40]\",\n        \"fsub d2, d2, d10\",\n        \"ldr d10, [x20]\",\n        \"fmul d2, d2, d10\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #196]\",\n        \"ldr d2, [x8, #24]\",\n        \"fmul d2, d2, d3\",\n        \"ldr d10, [x8, #32]\",\n        \"fsub d2, d2, d10\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d5, d5, d4\",\n        \"fsub d2, d2, d5\",\n        \"ldr d5, [x8, #40]\",\n        \"fmul d5, d5, d9\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #168]\",\n        \"ldr d2, [x8, #24]\",\n        \"fmul d2, d2, d4\",\n        \"ldr d5, [x8, #32]\",\n        \"fsub d2, d2, d5\",\n        \"ldr d5, [x8, #144]\",\n        \"fmul d5, d5, d9\",\n        \"fadd d2, d2, d5\",\n        \"ldr d5, [x8, #40]\",\n        \"fmul d5, d5, d3\",\n        \"fsub d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #144]\",\n        \"ldr s2, [x8, #8]\",\n        \"fcvt d2, s2\",\n        \"str d2, [x8, #8]\",\n        \"fadd d2, d2, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x4, #52]\",\n        \"fcvt d2, s2\",\n        \"str d2, [x8, #152]\",\n        \"ldr s5, [x8, #20]\",\n        \"fcvt d5, s5\",\n        \"str d5, [x8, #160]\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x4, #20]\",\n        \"fcvt d2, s2\",\n        \"str d2, [x8, #32]\",\n        \"ldr s5, [x8, #20]\",\n        \"fcvt d5, s5\",\n        \"str d5, [x8, #136]\",\n        \"ldr s5, [x4, #36]\",\n        \"fcvt d5, s5\",\n        \"str d5, [x8, #24]\",\n        \"ldr s5, [x4, #68]\",\n        \"fcvt d5, s5\",\n        \"str d5, [x8, #40]\",\n        \"fmul d2, d2, d6\",\n        \"ldr d5, [x8, #136]\",\n        \"fadd d2, d2, d5\",\n        \"ldr d5, [x8, #24]\",\n        \"fmul d5, d5, d7\",\n        \"fadd d2, d2, d5\",\n        \"ldr d5, [x8, #40]\",\n        \"fmul d5, d5, d8\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #176]\",\n        \"ldr d2, [x8, #160]\",\n        \"ldr d5, [x8, #32]\",\n        \"fadd d2, d2, d5\",\n        \"ldr d5, [x8, #24]\",\n        \"fsub d2, d2, d5\",\n        \"ldr d5, [x8, #152]\",\n        \"fsub d2, d2, d5\",\n        \"fsub d2, d2, d5\",\n        \"ldr d5, [x8, #40]\",\n        \"fsub d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #48]\",\n        \"ldr d2, [x8, #32]\",\n        \"fmul d2, d2, d8\",\n        \"ldr d5, [x8, #136]\",\n        \"fsub d2, d5, d2\",\n        \"ldr d5, [x8, #24]\",\n        \"fmul d5, d5, d6\",\n        \"fsub d2, d2, d5\",\n        \"ldr d5, [x8, #40]\",\n        \"fmul d5, d5, d7\",\n        \"fadd d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #160]\",\n        \"ldr d2, [x8, #32]\",\n        \"fmul d5, d7, d2\",\n        \"ldr d7, [x8, #136]\",\n        \"fsub d5, d7, d5\",\n        \"ldr d7, [x8, #24]\",\n        \"fmul d7, d8, d7\",\n        \"strb wzr, [x28, #1049]\",\n        \"fadd d5, d7, d5\",\n        \"ldr d7, [x8, #40]\",\n        \"fmul d6, d6, d7\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d5, d5, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #40]\",\n        \"ldr d5, [x8, #8]\",\n        \"fsub d2, d5, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr d5, [x8, #24]\",\n        \"fadd d2, d2, d5\",\n        \"ldr d5, [x8, #152]\",\n        \"fsub d2, d2, d5\",\n        \"fadd d2, d7, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"mov w21, #0x7bd8\",\n        \"movk w21, #0xa7, lsl #16\",\n        \"ldr d5, [x21]\",\n        \"fmul d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x4, #28]\",\n        \"fcvt d2, s2\",\n        \"ldr d5, [x20]\",\n        \"fmul d2, d2, d5\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #20]\",\n        \"fcvt d2, s2\",\n        \"ldr s5, [x4, #44]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x4, #60]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #4]\",\n        \"fcvt d7, s7\",\n        \"fmul d7, d7, d9\",\n        \"fadd d7, d7, d2\",\n        \"fmul d8, d5, d3\",\n        \"fadd d7, d7, d8\",\n        \"fmul d8, d6, d4\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #20]\",\n        \"ldr s7, [x4, #12]\",\n        \"fcvt d7, s7\",\n        \"str d7, [x8, #32]\",\n        \"fsub d7, d7, d5\",\n        \"fsub d7, d7, d6\",\n        \"ldr d8, [x20]\",\n        \"fmul d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #152]\",\n        \"ldr d7, [x8, #32]\",\n        \"fmul d7, d7, d3\",\n        \"fsub d7, d7, d2\",\n        \"fmul d8, d5, d4\",\n        \"fsub d7, d7, d8\",\n        \"fmul d8, d6, d9\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #136]\",\n        \"ldr d7, [x8, #32]\",\n        \"fmul d4, d4, d7\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d2, d4, d2\",\n        \"fmul d4, d9, d5\",\n        \"fadd d2, d4, d2\",\n        \"fmul d3, d3, d6\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #32]\",\n        \"ldr s2, [x8, #180]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #192]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d3, d2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #8]\",\n        \"ldr s4, [x8, #20]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #176]\",\n        \"fcvt d5, s5\",\n        \"fadd d6, d5, d4\",\n        \"mov w20, #0x7b38\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d7, [x20]\",\n        \"fmul d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #4]\",\n        \"ldr s6, [x8, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #8]\",\n        \"fcvt d7, s7\",\n        \"fadd d8, d7, d6\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #56]\",\n        \"fsub d6, d7, d6\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #124]\",\n        \"ldr s6, [x8, #196]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #208]\",\n        \"fcvt d7, s7\",\n        \"fadd d8, d7, d6\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #8]\",\n        \"ldr s8, [x8, #152]\",\n        \"fcvt d8, s8\",\n        \"str d8, [x8, #208]\",\n        \"ldr s9, [x8, #48]\",\n        \"fcvt d9, s9\",\n        \"str d9, [x8, #152]\",\n        \"fadd d8, d8, d9\",\n        \"mov w20, #0x7bd0\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d9, [x20]\",\n        \"fmul d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8, #4]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #8]\",\n        \"fcvt d9, s9\",\n        \"str d9, [x8, #48]\",\n        \"fadd d9, d9, d8\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #60]\",\n        \"ldr d9, [x8, #48]\",\n        \"fsub d8, d9, d8\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #120]\",\n        \"ldr s8, [x8, #168]\",\n        \"fcvt d8, s8\",\n        \"str d8, [x8, #168]\",\n        \"ldr s9, [x8, #184]\",\n        \"fcvt d9, s9\",\n        \"str d9, [x8, #184]\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #8]\",\n        \"ldr s8, [x8, #136]\",\n        \"fcvt d8, s8\",\n        \"str d8, [x8, #136]\",\n        \"ldr s9, [x8, #160]\",\n        \"fcvt d9, s9\",\n        \"str d9, [x8, #160]\",\n        \"fadd d8, d8, d9\",\n        \"mov w20, #0x7b30\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d9, [x20]\",\n        \"fmul d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8, #4]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #8]\",\n        \"fcvt d9, s9\",\n        \"str d9, [x8, #48]\",\n        \"fadd d9, d9, d8\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #64]\",\n        \"ldr d9, [x8, #48]\",\n        \"fsub d8, d9, d8\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #116]\",\n        \"ldr s8, [x8, #144]\",\n        \"fcvt d8, s8\",\n        \"str d8, [x8, #144]\",\n        \"ldr s9, [x8, #200]\",\n        \"fcvt d9, s9\",\n        \"str d9, [x8, #200]\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #8]\",\n        \"ldr s8, [x8, #32]\",\n        \"fcvt d8, s8\",\n        \"str d8, [x8, #32]\",\n        \"ldr s9, [x8, #40]\",\n        \"fcvt d9, s9\",\n        \"str d9, [x8, #40]\",\n        \"fadd d8, d8, d9\",\n        \"mov w20, #0x7b28\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d9, [x20]\",\n        \"fmul d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8, #4]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #8]\",\n        \"fcvt d9, s9\",\n        \"str d9, [x8, #48]\",\n        \"fadd d9, d9, d8\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #68]\",\n        \"ldr d9, [x8, #48]\",\n        \"fsub d8, d9, d8\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #112]\",\n        \"ldr s8, [x8, #24]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #128]\",\n        \"fcvt d9, s9\",\n        \"str d9, [x8, #128]\",\n        \"fadd d9, d9, d8\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #72]\",\n        \"ldr d9, [x8, #128]\",\n        \"fsub d8, d9, d8\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #108]\",\n        \"ldr d8, [x8, #200]\",\n        \"ldr d9, [x8, #144]\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #8]\",\n        \"ldr d8, [x8, #40]\",\n        \"ldr d9, [x8, #32]\",\n        \"fsub d8, d8, d9\",\n        \"mov w20, #0x7b20\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d9, [x20]\",\n        \"fmul d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8, #4]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #8]\",\n        \"fcvt d9, s9\",\n        \"str d9, [x8, #48]\",\n        \"fadd d9, d9, d8\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #76]\",\n        \"ldr d9, [x8, #48]\",\n        \"fsub d8, d9, d8\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #104]\",\n        \"ldr d8, [x8, #184]\",\n        \"ldr d9, [x8, #168]\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #8]\",\n        \"ldr d8, [x8, #160]\",\n        \"ldr d9, [x8, #136]\",\n        \"fsub d8, d8, d9\",\n        \"mov w20, #0x7b18\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d9, [x20]\",\n        \"fmul d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8, #4]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #8]\",\n        \"fcvt d9, s9\",\n        \"str d9, [x8, #48]\",\n        \"fadd d9, d9, d8\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #80]\",\n        \"ldr d9, [x8, #48]\",\n        \"fsub d8, d9, d8\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #100]\",\n        \"fsub d6, d7, d6\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #8]\",\n        \"ldr d6, [x8, #152]\",\n        \"ldr d7, [x8, #208]\",\n        \"fsub d6, d6, d7\",\n        \"mov w20, #0x7be0\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d7, [x20]\",\n        \"fmul d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #4]\",\n        \"ldr s6, [x8, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #8]\",\n        \"fcvt d7, s7\",\n        \"fadd d8, d7, d6\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #84]\",\n        \"fsub d6, d7, d6\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #96]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d2, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #8]\",\n        \"fsub d2, d5, d4\",\n        \"mov w20, #0x7b10\",\n        \"movk w20, #0xa7, lsl #16\",\n        \"ldr d3, [x20]\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #4]\",\n        \"ldr s2, [x8, #4]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #8]\",\n        \"fcvt d3, s3\",\n        \"add w4, w7, w7, lsl #3\",\n        \"ldr w7, [x9, #12]\",\n        \"fadd d4, d3, d2\",\n        \"lsl w4, w4, #4\",\n        \"mov w20, #0x83d0\",\n        \"movk w20, #0xb1, lsl #16\",\n        \"mvn w27, w4\",\n        \"adds w26, w4, w20\",\n        \"mov x4, x26\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #88]\",\n        \"fsub d2, d3, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #92]\",\n        \"ldr s2, [x8, #92]\",\n        \"fcvt d2, s2\",\n        \"fneg v3.2d, v2.2d\",\n        \"ldr s4, [x4]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7]\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #96]\",\n        \"fcvt d4, s4\",\n        \"fneg v5.2d, v4.2d\",\n        \"fmul d3, d3, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #4]\",\n        \"ldr s3, [x4, #8]\",\n        \"fcvt d3, s3\",\n        \"ldr s5, [x8, #100]\",\n        \"fcvt d5, s5\",\n        \"fneg v6.2d, v5.2d\",\n        \"fmul d3, d3, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #8]\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"ldr s6, [x8, #104]\",\n        \"fcvt d6, s6\",\n        \"fneg v7.2d, v6.2d\",\n        \"fmul d3, d3, d7\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #12]\",\n        \"ldr s3, [x4, #16]\",\n        \"fcvt d3, s3\",\n        \"ldr s7, [x8, #108]\",\n        \"fcvt d7, s7\",\n        \"fneg v8.2d, v7.2d\",\n        \"fmul d3, d3, d8\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #16]\",\n        \"ldr s3, [x4, #20]\",\n        \"fcvt d3, s3\",\n        \"ldr s8, [x8, #112]\",\n        \"fcvt d8, s8\",\n        \"fneg v9.2d, v8.2d\",\n        \"fmul d3, d3, d9\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #20]\",\n        \"ldr s3, [x4, #24]\",\n        \"fcvt d3, s3\",\n        \"ldr s9, [x8, #116]\",\n        \"fcvt d9, s9\",\n        \"fneg v9.2d, v9.2d\",\n        \"fmul d3, d3, d9\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #24]\",\n        \"ldr s3, [x4, #28]\",\n        \"fcvt d3, s3\",\n        \"ldr s9, [x8, #120]\",\n        \"fcvt d9, s9\",\n        \"fneg v9.2d, v9.2d\",\n        \"fmul d3, d3, d9\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #28]\",\n        \"ldr s3, [x4, #32]\",\n        \"fcvt d3, s3\",\n        \"ldr s9, [x8, #124]\",\n        \"fcvt d9, s9\",\n        \"fneg v9.2d, v9.2d\",\n        \"fmul d3, d3, d9\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #32]\",\n        \"ldr s3, [x4, #36]\",\n        \"fcvt d3, s3\",\n        \"ldr s9, [x8, #124]\",\n        \"fcvt d9, s9\",\n        \"fmul d3, d3, d9\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #36]\",\n        \"ldr s3, [x4, #40]\",\n        \"fcvt d3, s3\",\n        \"ldr s9, [x8, #120]\",\n        \"fcvt d9, s9\",\n        \"fmul d3, d3, d9\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #40]\",\n        \"ldr s3, [x4, #44]\",\n        \"fcvt d3, s3\",\n        \"ldr s9, [x8, #116]\",\n        \"fcvt d9, s9\",\n        \"fmul d3, d3, d9\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #44]\",\n        \"ldr s3, [x4, #48]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d8, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #48]\",\n        \"ldr s3, [x4, #52]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d7, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #52]\",\n        \"ldr s3, [x4, #56]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d6, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #56]\",\n        \"ldr s3, [x4, #60]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d5, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #60]\",\n        \"ldr s3, [x4, #64]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #64]\",\n        \"ldr s3, [x4, #68]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x7, #68]\",\n        \"ldr s2, [x8, #88]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x4, #72]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d3, d2\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #72]\",\n        \"ldr s3, [x8, #84]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x4, #76]\",\n        \"fcvt d4, s4\",\n        \"fmul d4, d4, d3\",\n        \"fcvt s4, d4\",\n        \"str s4, [x7, #76]\",\n        \"ldr s4, [x8, #80]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x4, #80]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d4\",\n        \"fcvt s5, d5\",\n        \"str s5, [x7, #80]\",\n        \"ldr s5, [x8, #76]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x4, #84]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d5\",\n        \"fcvt s6, d6\",\n        \"str s6, [x7, #84]\",\n        \"ldr s6, [x8, #72]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x4, #88]\",\n        \"fcvt d7, s7\",\n        \"fmul d7, d7, d6\",\n        \"fcvt s7, d7\",\n        \"str s7, [x7, #88]\",\n        \"ldr s7, [x8, #68]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #92]\",\n        \"fcvt d8, s8\",\n        \"fmul d8, d8, d7\",\n        \"fcvt s8, d8\",\n        \"str s8, [x7, #92]\",\n        \"ldr s8, [x8, #64]\",\n        \"fcvt d8, s8\",\n        \"str d8, [x8, #24]\",\n        \"ldr s9, [x4, #96]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x7, #96]\",\n        \"ldr s8, [x8, #60]\",\n        \"fcvt d8, s8\",\n        \"str d8, [x8, #128]\",\n        \"ldr s9, [x4, #100]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x7, #100]\",\n        \"ldr s8, [x8, #56]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #104]\",\n        \"fcvt d9, s9\",\n        \"fmul d9, d9, d8\",\n        \"fcvt s9, d9\",\n        \"str s9, [x7, #104]\",\n        \"ldr s9, [x4, #108]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x7, #108]\",\n        \"ldr s8, [x4, #112]\",\n        \"fcvt d8, s8\",\n        \"ldr d9, [x8, #128]\",\n        \"fmul d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x7, #112]\",\n        \"ldr s8, [x4, #116]\",\n        \"fcvt d8, s8\",\n        \"ldr d9, [x8, #24]\",\n        \"fmul d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x7, #116]\",\n        \"ldr s8, [x4, #120]\",\n        \"fcvt d8, s8\",\n        \"fmul d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x7, #120]\",\n        \"ldr s7, [x4, #124]\",\n        \"fcvt d7, s7\",\n        \"fmul d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x7, #124]\",\n        \"ldr s6, [x4, #128]\",\n        \"fcvt d6, s6\",\n        \"fmul d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x7, #128]\",\n        \"ldr s5, [x4, #132]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"fcvt s4, d4\",\n        \"str s4, [x7, #132]\",\n        \"ldr s4, [x4, #136]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #136]\",\n        \"ldr s3, [x4, #140]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x7, #140]\",\n        \"mov x8, x9\",\n        \"ldr w9, [x8], #4\",\n        \"cfinv\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block3\": {\n      \"x86InstructionCount\": 649,\n      \"ExpectedInstructionCount\": 958,\n      \"x86Insts\": [\n        \"fld dword [esi + 0x64]\",\n        \"mov eax,dword [esi + 0x88]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"mov ecx,dword [esi + 0x8c]\",\n        \"fld dword [esi + 0x70]\",\n        \"mov edx,dword [esi + 0x90]\",\n        \"fstp dword [esp + 0x60]\",\n        \"mov dword [esp + 0x2e4],0x3f\",\n        \"fld dword [esi + 0x7c]\",\n        \"mov dword [esp + 0x94],eax\",\n        \"fstp dword [esp + 0x64]\",\n        \"mov dword [esp + 0x98],ecx\",\n        \"fld dword [esi + 0x68]\",\n        \"mov dword [esp + 0x9c],edx\",\n        \"fstp dword [esp + 0x14]\",\n        \"mov dword [esp + 0xe8],eax\",\n        \"fld dword [esi + 0x74]\",\n        \"mov dword [esp + 0xec],ecx\",\n        \"fstp dword [esp + 0x18]\",\n        \"mov dword [esp + 0xf0],edx\",\n        \"fld dword [esi + 0x80]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esi + 0xf4]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x14]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x8c]\",\n        \"fld dword [esp + 0x18]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fmul dword [esp + 0x1c]\",\n        \"fstp dword [esp + 0x84]\",\n        \"fld dword [esi + 0x6c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esi + 0x78]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esi + 0x84]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esi + 0xf0]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x14]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x18]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x50]\",\n        \"fmul dword [esp + 0x1c]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esi + 0x100]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x54]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fst dword [esp + 0x10]\",\n        \"fld dword [esp + 0x50]\",\n        \"fmul st2\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fst dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x58]\",\n        \"fmul st3\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fst dword [esp + 0x14]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x8c]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x84]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x84]\",\n        \"fld dword [esp + 0x60]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x64]\",\n        \"fmulp st4\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x94]\",\n        \"fld dword [esp + 0x84]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x84]\",\n        \"fld dword [esp + 0x98]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x9c]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x84]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fadd dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fadd dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x44]\",\n        \"fadd dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd dword [esp + 0x2c]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x40]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"mov eax,dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0xf4],eax\",\n        \"fstp dword [esp + 0x60]\",\n        \"mov ecx,dword [esp + 0x60]\",\n        \"fld dword [esp + 0x14]\",\n        \"mov dword [esp + 0xf8],ecx\",\n        \"fstp dword [esp + 0x64]\",\n        \"mov edx,dword [esp + 0x64]\",\n        \"fxch st4\",\n        \"mov dword [esp + 0xfc],edx\",\n        \"fst dword [esp + 0x5c]\",\n        \"fxch st3\",\n        \"fst dword [esp + 0x84]\",\n        \"fxch st5\",\n        \"fst dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st5\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fsub dword [esp + 0x84]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x14]\",\n        \"mov eax,dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0x100],eax\",\n        \"fstp dword [esp + 0x18]\",\n        \"mov ecx,dword [esp + 0x18]\",\n        \"fld dword [esp + 0x10]\",\n        \"mov dword [esp + 0x104],ecx\",\n        \"fstp dword [esp + 0x1c]\",\n        \"mov edx,dword [esp + 0x1c]\",\n        \"fxch st3\",\n        \"mov dword [esp + 0x108],edx\",\n        \"fst dword [esp + 0x5c]\",\n        \"fxch st5\",\n        \"fst dword [esp + 0x84]\",\n        \"fxch st3\",\n        \"fst dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st5\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x84]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x14]\",\n        \"mov eax,dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0x10c],eax\",\n        \"fstp dword [esp + 0x18]\",\n        \"mov ecx,dword [esp + 0x18]\",\n        \"fld dword [esp + 0x10]\",\n        \"mov dword [esp + 0x110],ecx\",\n        \"fstp dword [esp + 0x1c]\",\n        \"mov edx,dword [esp + 0x1c]\",\n        \"fxch st5\",\n        \"mov dword [esp + 0x114],edx\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x84]\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"faddp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fsub dword [esp + 0x84]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x14]\",\n        \"mov eax,dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0x118],eax\",\n        \"mov eax,dword [ebx + 0x88]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x10]\",\n        \"mov ecx,dword [esp + 0x18]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"mov edx,dword [esp + 0x1c]\",\n        \"fld dword [ebx + 0x64]\",\n        \"mov dword [esp + 0x11c],ecx\",\n        \"mov ecx,dword [ebx + 0x8c]\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [ebx + 0x70]\",\n        \"mov dword [esp + 0x120],edx\",\n        \"mov edx,dword [ebx + 0x90]\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [ebx + 0x7c]\",\n        \"mov dword [esp + 0x94],eax\",\n        \"mov dword [esp + 0x98],ecx\",\n        \"mov dword [esp + 0x9c],edx\",\n        \"fstp dword [esp + 0x78]\",\n        \"mov dword [esp + 0xac],eax\",\n        \"fld dword [ebx + 0x68]\",\n        \"mov dword [esp + 0xb0],ecx\",\n        \"fstp dword [esp + 0x2c]\",\n        \"mov dword [esp + 0xb4],edx\",\n        \"fld dword [ebx + 0x74]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [ebx + 0x80]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [ebx + 0xf4]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x48]\",\n        \"fmul dword [esp + 0x34]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [ebx + 0x6c]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [ebx + 0x78]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [ebx + 0x84]\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [ebx + 0xf0]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x14]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x60]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fmul dword [esp + 0x64]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [ebx + 0x100]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x14]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x14]\",\n        \"fst dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st2\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x14]\",\n        \"fst dword [esp + 0x84]\",\n        \"fld dword [esp + 0x10]\",\n        \"fmul st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x14]\",\n        \"fst dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x40]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x48]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x44]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x70]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x74]\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x8c]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x78]\",\n        \"fmulp st4\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x94]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x98]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x9c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x84]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x70]\",\n        \"mov eax,dword [esp + 0x70]\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0xb8],eax\",\n        \"fstp dword [esp + 0x74]\",\n        \"mov ecx,dword [esp + 0x74]\",\n        \"fld dword [esp + 0x10]\",\n        \"mov dword [esp + 0xbc],ecx\",\n        \"fstp dword [esp + 0x78]\",\n        \"mov edx,dword [esp + 0x78]\",\n        \"fxch st4\",\n        \"mov dword [esp + 0xc0],edx\",\n        \"fst dword [esp + 0x5c]\",\n        \"fxch st3\",\n        \"fst dword [esp + 0x84]\",\n        \"fxch st5\",\n        \"fst dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st5\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fsub dword [esp + 0x84]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x70]\",\n        \"mov eax,dword [esp + 0x70]\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0xc4],eax\",\n        \"fstp dword [esp + 0x74]\",\n        \"mov ecx,dword [esp + 0x74]\",\n        \"fld dword [esp + 0x10]\",\n        \"mov dword [esp + 0xc8],ecx\",\n        \"fstp dword [esp + 0x78]\",\n        \"mov edx,dword [esp + 0x78]\",\n        \"fxch st3\",\n        \"mov dword [esp + 0xcc],edx\",\n        \"fst dword [esp + 0x5c]\",\n        \"fxch st5\",\n        \"fst dword [esp + 0x84]\",\n        \"fxch st3\",\n        \"fst dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st5\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fsub dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x84]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x70]\",\n        \"mov eax,dword [esp + 0x70]\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0xd0],eax\",\n        \"fstp dword [esp + 0x74]\",\n        \"mov ecx,dword [esp + 0x74]\",\n        \"fld dword [esp + 0x10]\",\n        \"mov dword [esp + 0xd4],ecx\",\n        \"fstp dword [esp + 0x78]\",\n        \"mov edx,dword [esp + 0x78]\",\n        \"mov dword [esp + 0xd8],edx\",\n        \"fxch st5\",\n        \"push 0x0\",\n        \"fstp dword [esp + 0x60]\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x88]\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x80]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x90]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x18]\",\n        \"faddp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x30]\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x30]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x30]\",\n        \"fsub dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x60]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x30]\",\n        \"fsub dword [esp + 0x88]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x80]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0x18]\",\n        \"fstp dword [esp + 0x74]\",\n        \"mov eax,dword [esp + 0x74]\",\n        \"fld dword [esp + 0x30]\",\n        \"mov dword [esp + 0xe0],eax\",\n        \"fstp dword [esp + 0x78]\",\n        \"mov ecx,dword [esp + 0x78]\",\n        \"fld dword [esp + 0x14]\",\n        \"mov dword [esp + 0xe4],ecx\",\n        \"fstp dword [esp + 0x7c]\",\n        \"mov edx,dword [esp + 0x7c]\",\n        \"lea ecx,[esp + 0x190]\",\n        \"mov dword [esp + 0xe8],edx\",\n        \"call 0x0070df30\",\n        \"mov dword [esp + 0x198],esi\",\n        \"add esi,0xec\",\n        \"push esi\",\n        \"lea ecx,[esp + 0x190]\",\n        \"mov dword [esp + 0x314],0x0\",\n        \"call 0x0070e040\",\n        \"mov ecx,0x19\",\n        \"lea esi,[esp + 0x1b8]\",\n        \"lea edi,[esp + 0x21c]\",\n        \"rep movsd\",\n        \"mov dword [esp + 0x198],ebx\",\n        \"add ebx,0xec\",\n        \"push ebx\",\n        \"lea ecx,[esp + 0x190]\",\n        \"call 0x0070e040\",\n        \"mov ecx,0x19\",\n        \"lea esi,[esp + 0x1b8]\",\n        \"lea edi,[esp + 0x284]\",\n        \"rep movsd\",\n        \"lea esi,[esp + 0x124]\",\n        \"mov edi,0x5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x10, #100]\",\n        \"ldr w4, [x10, #136]\",\n        \"str s2, [x8, #92]\",\n        \"ldr w7, [x10, #140]\",\n        \"ldr s2, [x10, #112]\",\n        \"ldr w5, [x10, #144]\",\n        \"str s2, [x8, #96]\",\n        \"mov w20, #0x3f\",\n        \"str w20, [x8, #740]\",\n        \"ldr s2, [x10, #124]\",\n        \"str w4, [x8, #148]\",\n        \"str s2, [x8, #100]\",\n        \"str w7, [x8, #152]\",\n        \"ldr s2, [x10, #104]\",\n        \"str w5, [x8, #156]\",\n        \"str s2, [x8, #20]\",\n        \"str w4, [x8, #232]\",\n        \"ldr s2, [x10, #116]\",\n        \"str w7, [x8, #236]\",\n        \"str s2, [x8, #24]\",\n        \"str w5, [x8, #240]\",\n        \"ldr s2, [x10, #128]\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x10, #244]\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x8, #40]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #20]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d3, d2\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #140]\",\n        \"ldr s3, [x8, #24]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d3, d2\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #124]\",\n        \"ldr s3, [x8, #28]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #132]\",\n        \"ldr s2, [x10, #108]\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x10, #120]\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x10, #132]\",\n        \"str s2, [x8, #28]\",\n        \"ldr s2, [x10, #240]\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x8, #40]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #20]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d3, d2\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #84]\",\n        \"ldr s3, [x8, #24]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d3, d2\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #80]\",\n        \"ldr s3, [x8, #28]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #88]\",\n        \"ldr s2, [x10, #256]\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x8, #40]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #84]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d3, d2\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #40]\",\n        \"ldr s3, [x8, #40]\",\n        \"str s3, [x8, #16]\",\n        \"ldr s4, [x8, #80]\",\n        \"fcvt d4, s4\",\n        \"fmul d4, d4, d2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #40]\",\n        \"ldr s4, [x8, #40]\",\n        \"str s4, [x8, #44]\",\n        \"ldr s5, [x8, #88]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d2\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #40]\",\n        \"ldr s5, [x8, #40]\",\n        \"str s5, [x8, #20]\",\n        \"ldr s6, [x8, #140]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #76]\",\n        \"ldr s6, [x8, #76]\",\n        \"str s6, [x8, #68]\",\n        \"ldr s6, [x8, #124]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #140]\",\n        \"ldr s6, [x8, #140]\",\n        \"str s6, [x8, #72]\",\n        \"ldr s6, [x8, #132]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #88]\",\n        \"ldr s6, [x8, #88]\",\n        \"str s6, [x8, #64]\",\n        \"ldr s6, [x8, #92]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #80]\",\n        \"ldr s6, [x8, #80]\",\n        \"str s6, [x8, #132]\",\n        \"ldr s6, [x8, #96]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #84]\",\n        \"ldr s6, [x8, #84]\",\n        \"str s6, [x8, #124]\",\n        \"ldr s6, [x8, #100]\",\n        \"fcvt d6, s6\",\n        \"fmul d2, d2, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x8, #40]\",\n        \"str s2, [x8, #92]\",\n        \"ldr s2, [x8, #148]\",\n        \"fcvt d2, s2\",\n        \"ldr s6, [x8, #132]\",\n        \"fcvt d6, s6\",\n        \"fadd d6, d6, d2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #132]\",\n        \"ldr s6, [x8, #152]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #124]\",\n        \"fcvt d7, s7\",\n        \"fadd d7, d7, d6\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #124]\",\n        \"ldr s7, [x8, #156]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #92]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d7\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #92]\",\n        \"ldr s8, [x8, #132]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #68]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #68]\",\n        \"ldr s8, [x8, #124]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #72]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #72]\",\n        \"ldr s8, [x8, #92]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #64]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #64]\",\n        \"ldr s8, [x8, #68]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #16]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #72]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #44]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #64]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #20]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #16]\",\n        \"str s8, [x8, #92]\",\n        \"ldr w4, [x8, #92]\",\n        \"ldr s8, [x8, #44]\",\n        \"str w4, [x8, #244]\",\n        \"str s8, [x8, #96]\",\n        \"ldr w7, [x8, #96]\",\n        \"ldr s8, [x8, #20]\",\n        \"str w7, [x8, #248]\",\n        \"str s8, [x8, #100]\",\n        \"ldr w5, [x8, #100]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str w5, [x8, #252]\",\n        \"str s3, [x8, #92]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s4, [x8, #132]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s5, [x8, #124]\",\n        \"ldr s8, [x8, #76]\",\n        \"str s8, [x8, #64]\",\n        \"ldr s8, [x8, #140]\",\n        \"str s8, [x8, #72]\",\n        \"ldr s8, [x8, #88]\",\n        \"str s8, [x8, #68]\",\n        \"ldr s8, [x8, #80]\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #84]\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #40]\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d2\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d6\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d7\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #64]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #72]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #68]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #92]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #132]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #124]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str s8, [x8, #20]\",\n        \"ldr w4, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str w4, [x8, #256]\",\n        \"str s8, [x8, #24]\",\n        \"ldr w7, [x8, #24]\",\n        \"ldr s8, [x8, #16]\",\n        \"str w7, [x8, #260]\",\n        \"str s8, [x8, #28]\",\n        \"ldr w5, [x8, #28]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str w5, [x8, #264]\",\n        \"str s3, [x8, #92]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s4, [x8, #132]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s5, [x8, #124]\",\n        \"ldr s8, [x8, #76]\",\n        \"str s8, [x8, #64]\",\n        \"ldr s8, [x8, #140]\",\n        \"str s8, [x8, #72]\",\n        \"ldr s8, [x8, #88]\",\n        \"str s8, [x8, #68]\",\n        \"ldr s8, [x8, #80]\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #84]\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #40]\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d2\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d6\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d7\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #64]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #72]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #68]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #92]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #132]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #124]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str s8, [x8, #20]\",\n        \"ldr w4, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"str w4, [x8, #268]\",\n        \"str s8, [x8, #24]\",\n        \"ldr w7, [x8, #24]\",\n        \"ldr s8, [x8, #16]\",\n        \"str w7, [x8, #272]\",\n        \"str s8, [x8, #28]\",\n        \"ldr w5, [x8, #28]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str w5, [x8, #276]\",\n        \"str s3, [x8, #92]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s4, [x8, #132]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s5, [x8, #124]\",\n        \"ldr s3, [x8, #76]\",\n        \"str s3, [x8, #64]\",\n        \"ldr s3, [x8, #140]\",\n        \"str s3, [x8, #72]\",\n        \"ldr s3, [x8, #88]\",\n        \"str s3, [x8, #68]\",\n        \"ldr s3, [x8, #80]\",\n        \"str s3, [x8, #20]\",\n        \"ldr s3, [x8, #84]\",\n        \"str s3, [x8, #44]\",\n        \"ldr s3, [x8, #40]\",\n        \"str s3, [x8, #16]\",\n        \"ldr s3, [x8, #20]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #44]\",\n        \"fcvt d2, s2\",\n        \"fadd d2, d6, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #16]\",\n        \"fcvt d2, s2\",\n        \"fadd d2, d7, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x8, #20]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #64]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #44]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #72]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #16]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #68]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x8, #20]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #92]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #44]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #132]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #16]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #124]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x8, #20]\",\n        \"str s2, [x8, #20]\",\n        \"ldr w4, [x8, #20]\",\n        \"ldr s2, [x8, #44]\",\n        \"str w4, [x8, #280]\",\n        \"ldr w4, [x6, #136]\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x8, #16]\",\n        \"ldr w7, [x8, #24]\",\n        \"str s2, [x8, #28]\",\n        \"ldr w5, [x8, #28]\",\n        \"ldr s2, [x6, #100]\",\n        \"str w7, [x8, #284]\",\n        \"ldr w7, [x6, #140]\",\n        \"str s2, [x8, #112]\",\n        \"ldr s2, [x6, #112]\",\n        \"str w5, [x8, #288]\",\n        \"ldr w5, [x6, #144]\",\n        \"str s2, [x8, #116]\",\n        \"ldr s2, [x6, #124]\",\n        \"str w4, [x8, #148]\",\n        \"str w7, [x8, #152]\",\n        \"str w5, [x8, #156]\",\n        \"str s2, [x8, #120]\",\n        \"str w4, [x8, #172]\",\n        \"ldr s2, [x6, #104]\",\n        \"str w7, [x8, #176]\",\n        \"str s2, [x8, #44]\",\n        \"str w5, [x8, #180]\",\n        \"ldr s2, [x6, #116]\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x6, #128]\",\n        \"str s2, [x8, #52]\",\n        \"ldr s2, [x6, #244]\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #20]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #44]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d3, d2\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #64]\",\n        \"ldr s3, [x8, #48]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d3, d2\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #72]\",\n        \"ldr s3, [x8, #52]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #68]\",\n        \"ldr s2, [x6, #108]\",\n        \"str s2, [x8, #92]\",\n        \"ldr s2, [x6, #120]\",\n        \"str s2, [x8, #96]\",\n        \"ldr s2, [x6, #132]\",\n        \"str s2, [x8, #100]\",\n        \"ldr s2, [x6, #240]\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #20]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #92]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d3, d2\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #20]\",\n        \"ldr s3, [x8, #96]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d3, d2\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #44]\",\n        \"ldr s3, [x8, #100]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x6, #256]\",\n        \"str s2, [x8, #40]\",\n        \"ldr s2, [x8, #40]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #20]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d3, d2\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #20]\",\n        \"ldr s3, [x8, #20]\",\n        \"str s3, [x8, #92]\",\n        \"ldr s4, [x8, #44]\",\n        \"fcvt d4, s4\",\n        \"fmul d4, d4, d2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #20]\",\n        \"ldr s4, [x8, #20]\",\n        \"str s4, [x8, #132]\",\n        \"ldr s5, [x8, #16]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d2\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #20]\",\n        \"ldr s5, [x8, #20]\",\n        \"str s5, [x8, #124]\",\n        \"ldr s6, [x8, #64]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #40]\",\n        \"ldr s6, [x8, #40]\",\n        \"str s6, [x8, #64]\",\n        \"ldr s6, [x8, #72]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #84]\",\n        \"ldr s6, [x8, #84]\",\n        \"str s6, [x8, #72]\",\n        \"ldr s6, [x8, #68]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #80]\",\n        \"ldr s6, [x8, #80]\",\n        \"str s6, [x8, #68]\",\n        \"ldr s6, [x8, #112]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #88]\",\n        \"ldr s6, [x8, #88]\",\n        \"str s6, [x8, #20]\",\n        \"ldr s6, [x8, #116]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #140]\",\n        \"ldr s6, [x8, #140]\",\n        \"str s6, [x8, #44]\",\n        \"ldr s6, [x8, #120]\",\n        \"fcvt d6, s6\",\n        \"fmul d2, d2, d6\",\n        \"mov w20, #0x0\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #76]\",\n        \"ldr s2, [x8, #76]\",\n        \"str s2, [x8, #16]\",\n        \"ldr s2, [x8, #148]\",\n        \"fcvt d2, s2\",\n        \"ldr s6, [x8, #20]\",\n        \"fcvt d6, s6\",\n        \"fadd d6, d6, d2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #20]\",\n        \"ldr s6, [x8, #152]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #44]\",\n        \"fcvt d7, s7\",\n        \"fadd d7, d7, d6\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #44]\",\n        \"ldr s7, [x8, #156]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d7\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #64]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #72]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #68]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #92]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #132]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #124]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str s8, [x8, #112]\",\n        \"ldr w4, [x8, #112]\",\n        \"ldr s8, [x8, #44]\",\n        \"str w4, [x8, #184]\",\n        \"str s8, [x8, #116]\",\n        \"ldr w7, [x8, #116]\",\n        \"ldr s8, [x8, #16]\",\n        \"str w7, [x8, #188]\",\n        \"str s8, [x8, #120]\",\n        \"ldr w5, [x8, #120]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str w5, [x8, #192]\",\n        \"str s3, [x8, #92]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s4, [x8, #132]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s5, [x8, #124]\",\n        \"ldr s8, [x8, #40]\",\n        \"str s8, [x8, #64]\",\n        \"ldr s8, [x8, #84]\",\n        \"str s8, [x8, #72]\",\n        \"ldr s8, [x8, #80]\",\n        \"str s8, [x8, #68]\",\n        \"ldr s8, [x8, #88]\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #140]\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #76]\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d2\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d6\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d7\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #64]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #72]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #68]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #92]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #132]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #124]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str s8, [x8, #112]\",\n        \"ldr w4, [x8, #112]\",\n        \"ldr s8, [x8, #44]\",\n        \"str w4, [x8, #196]\",\n        \"str s8, [x8, #116]\",\n        \"ldr w7, [x8, #116]\",\n        \"ldr s8, [x8, #16]\",\n        \"str w7, [x8, #200]\",\n        \"str s8, [x8, #120]\",\n        \"ldr w5, [x8, #120]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str w5, [x8, #204]\",\n        \"str s3, [x8, #92]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s4, [x8, #132]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s5, [x8, #124]\",\n        \"ldr s8, [x8, #40]\",\n        \"str s8, [x8, #64]\",\n        \"ldr s8, [x8, #84]\",\n        \"str s8, [x8, #72]\",\n        \"ldr s8, [x8, #80]\",\n        \"str s8, [x8, #68]\",\n        \"ldr s8, [x8, #88]\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #140]\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #76]\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d2\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d6\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d7\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #64]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #72]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #68]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #92]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #20]\",\n        \"ldr s8, [x8, #44]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #132]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #44]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #124]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x8, #20]\",\n        \"str s8, [x8, #112]\",\n        \"ldr w4, [x8, #112]\",\n        \"ldr s8, [x8, #44]\",\n        \"str w4, [x8, #208]\",\n        \"str s8, [x8, #116]\",\n        \"ldr w7, [x8, #116]\",\n        \"ldr s8, [x8, #16]\",\n        \"str w7, [x8, #212]\",\n        \"str s8, [x8, #120]\",\n        \"ldr w5, [x8, #120]\",\n        \"str w5, [x8, #216]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str w20, [x8, #-4]!\",\n        \"str s3, [x8, #96]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s4, [x8, #136]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str s5, [x8, #128]\",\n        \"ldr s3, [x8, #44]\",\n        \"str s3, [x8, #68]\",\n        \"ldr s3, [x8, #88]\",\n        \"str s3, [x8, #76]\",\n        \"ldr s3, [x8, #84]\",\n        \"str s3, [x8, #72]\",\n        \"ldr s3, [x8, #92]\",\n        \"str s3, [x8, #24]\",\n        \"ldr s3, [x8, #144]\",\n        \"str s3, [x8, #48]\",\n        \"ldr s3, [x8, #80]\",\n        \"str s3, [x8, #20]\",\n        \"ldr s3, [x8, #24]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x8, #48]\",\n        \"fcvt d2, s2\",\n        \"fadd d2, d6, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #20]\",\n        \"fcvt d2, s2\",\n        \"fadd d2, d7, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #24]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #68]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x8, #48]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #76]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #20]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #72]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #24]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #96]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #24]\",\n        \"ldr s2, [x8, #48]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #136]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #20]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #128]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #20]\",\n        \"ldr s2, [x8, #24]\",\n        \"str s2, [x8, #116]\",\n        \"ldr w4, [x8, #116]\",\n        \"ldr s2, [x8, #48]\",\n        \"str w4, [x8, #224]\",\n        \"str s2, [x8, #120]\",\n        \"ldr w7, [x8, #120]\",\n        \"ldr s2, [x8, #20]\",\n        \"str w7, [x8, #228]\",\n        \"str s2, [x8, #124]\",\n        \"ldr w5, [x8, #124]\",\n        \"add w7, w8, #0x190 (400)\",\n        \"str w5, [x8, #232]\",\n        \"mov w20, #0xa3f\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x8\",\n        \"sub w21, w23, w21\",\n        \"mov w23, #0xfefe\",\n        \"lsr w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    },\n    \"Block4\": {\n      \"x86InstructionCount\": 2050,\n      \"ExpectedInstructionCount\": 30,\n      \"x86Insts\": [\n        \"fldz\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000172\",\n        \"push 0x37\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33c14\",\n        \"push 0x52424157\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000172\",\n        \"push 0x38\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33c04\",\n        \"push 0x41574157\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x2b\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33bfc\",\n        \"push 0x444c4853\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x3d\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33bf0\",\n        \"push 0x48534946\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x44\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33bdc\",\n        \"push 0x4853494c\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x3e\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33bcc\",\n        \"push 0x48535246\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x52485446\",\n        \"push 0x4c505344\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x1000073\",\n        \"push 0xb\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33bc4\",\n        \"push 0x4e445242\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x4c505344\",\n        \"push 0x1\",\n        \"push 0x40\",\n        \"push 0x1000076\",\n        \"push 0xb\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33bbc\",\n        \"push 0x52485446\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0xe0\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa32700\",\n        \"push 0x4b434f4c\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0xc0\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x0\",\n        \"push 0xa33bb4\",\n        \"push 0x4e45504f\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x48534946\",\n        \"push 0x49465352\",\n        \"push 0x4c505344\",\n        \"push 0x3\",\n        \"push 0x3d\",\n        \"push 0x21000475\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33ba8\",\n        \"push 0x47444946\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x2c\",\n        \"push 0x4853494c\",\n        \"push 0x48535352\",\n        \"push 0x4c505344\",\n        \"push 0x3\",\n        \"push 0x44\",\n        \"push 0x21000075\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b98\",\n        \"push 0x47444853\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x2c\",\n        \"push 0x48535246\",\n        \"push 0x52465352\",\n        \"push 0x4c505344\",\n        \"push 0x3\",\n        \"push 0x3e\",\n        \"push 0x1000075\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b88\",\n        \"push 0x47445246\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x2c\",\n        \"push 0x54414241\",\n        \"push 0x54414f46\",\n        \"push 0x54414552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x100075\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b74\",\n        \"push 0x54414744\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x45484241\",\n        \"push 0x45484f46\",\n        \"push 0x45484552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x21000075\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b64\",\n        \"push 0x45484744\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x50534241\",\n        \"push 0x50534f46\",\n        \"push 0x50534552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000075\",\n        \"push 0x9\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b50\",\n        \"push 0x50534744\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x41464241\",\n        \"push 0x41464f46\",\n        \"push 0x41464552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000075\",\n        \"push 0xa\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b40\",\n        \"push 0x41464744\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x54414241\",\n        \"push 0x54414f46\",\n        \"push 0x54414552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x100077\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b30\",\n        \"push 0x54415244\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x4b534241\",\n        \"push 0x4b534f46\",\n        \"push 0x4c505344\",\n        \"push 0x3\",\n        \"push 0x40\",\n        \"push 0x80077\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b24\",\n        \"push 0x4b535244\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x2c\",\n        \"push 0x45484241\",\n        \"push 0x45484f46\",\n        \"push 0x45484552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000077\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b14\",\n        \"push 0x45485244\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x50534241\",\n        \"push 0x50534f46\",\n        \"push 0x50534552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000077\",\n        \"push 0x9\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33b00\",\n        \"push 0x50535244\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x41464241\",\n        \"push 0x41464f46\",\n        \"push 0x41464552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000077\",\n        \"push 0xa\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33af0\",\n        \"push 0x41465244\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x4c505344\",\n        \"push 0x49465352\",\n        \"push 0x48534946\",\n        \"push 0x3\",\n        \"push 0x40\",\n        \"push 0x100007f\",\n        \"push 0x3d\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33adc\",\n        \"push 0x49464b57\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x2c\",\n        \"push 0x4c505344\",\n        \"push 0x52465352\",\n        \"push 0x48535246\",\n        \"push 0x3\",\n        \"push 0x40\",\n        \"push 0x100007f\",\n        \"push 0x3e\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33ac8\",\n        \"push 0x52464b57\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x2c\",\n        \"push 0x4c505344\",\n        \"push 0x48535352\",\n        \"push 0x4853494c\",\n        \"push 0x3\",\n        \"push 0x40\",\n        \"push 0x100007f\",\n        \"push 0x44\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33ab4\",\n        \"push 0x48534b57\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x2c\",\n        \"push 0x4c505344\",\n        \"push 0x414d5352\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x100007f\",\n        \"push 0x40\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33aa0\",\n        \"push 0x414d4b57\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x4c505344\",\n        \"push 0x49445352\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x100007f\",\n        \"push 0x3f\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a8c\",\n        \"push 0x49444b57\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x4c505344\",\n        \"push 0x4f505352\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x100007f\",\n        \"push 0x43\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a78\",\n        \"push 0x4f504b57\",\n        \"call 0x00417220\",\n        \"add esp,0x28\",\n        \"push 0x4c505344\",\n        \"push 0x574e5352\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x100007f\",\n        \"push 0x41\",\n        \"push ecx\",\n        \"fldz\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a5c\",\n        \"push 0x574e4b57\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x48535246\",\n        \"push 0x4853494c\",\n        \"push 0x48534946\",\n        \"push 0x444c4853\",\n        \"push 0x4c505344\",\n        \"push 0x5\",\n        \"push 0x40\",\n        \"push 0x75\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a48\",\n        \"push 0x52414944\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x34\",\n        \"push 0x48535246\",\n        \"push 0x4853494c\",\n        \"push 0x48534946\",\n        \"push 0x444c4853\",\n        \"push 0x4c505344\",\n        \"push 0x5\",\n        \"push 0x40\",\n        \"push 0x75\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a30\",\n        \"push 0x45574944\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x34\",\n        \"push 0x0\",\n        \"push 0x3f\",\n        \"push 0x10000092\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a24\",\n        \"push 0x504d4156\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x14\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a18\",\n        \"push 0x47445553\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000112\",\n        \"push 0x39\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa33a08\",\n        \"push 0x414d5453\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"push 0x4f505543\",\n        \"push 0x1\",\n        \"push 0x43\",\n        \"push 0x800000\",\n        \"fldz\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa339fc\",\n        \"push 0x4e534f50\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x49445543\",\n        \"push 0x1\",\n        \"push 0x3f\",\n        \"push 0x800000\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa339ec\",\n        \"push 0x45534944\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x45484241\",\n        \"push 0x45484f46\",\n        \"push 0x45484552\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x21000075\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x2\",\n        \"push 0xa339cc\",\n        \"push 0x594d5544\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000172\",\n        \"push 0x2f\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa339bc\",\n        \"push 0x49564e49\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x2e\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa339b0\",\n        \"push 0x4c4d4843\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x4c505344\",\n        \"push 0x41505543\",\n        \"push 0x2\",\n        \"push 0x42\",\n        \"push 0x1000173\",\n        \"push 0x30\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa339a4\",\n        \"push 0x41524150\",\n        \"call 0x00417220\",\n        \"add esp,0x28\",\n        \"push 0x4c505344\",\n        \"push 0x1\",\n        \"push 0x40\",\n        \"push 0x1000173\",\n        \"push 0x31\",\n        \"fldz\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa3399c\",\n        \"push 0x434e4c53\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x4c505344\",\n        \"push 0x1\",\n        \"push 0x40\",\n        \"push 0x1000062\",\n        \"push 0x6\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33994\",\n        \"push 0x4d524843\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x594c4152\",\n        \"push 0x4c505344\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x41000066\",\n        \"push 0x22\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33988\",\n        \"push 0x4f4d4544\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x4f4d4544\",\n        \"push 0x4c505344\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x1000062\",\n        \"push 0x22\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33980\",\n        \"push 0x594c4152\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x4d4c4143\",\n        \"push 0x4c505344\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x41000062\",\n        \"push 0x21\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33978\",\n        \"push 0x5a4e5246\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x5a4e5246\",\n        \"push 0x4c505344\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x41000066\",\n        \"push 0x21\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33970\",\n        \"push 0x4d4c4143\",\n        \"call 0x00417220\",\n        \"add esp,0x28\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000112\",\n        \"push 0x29\",\n        \"fldz\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33964\",\n        \"push 0x4559454e\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x80000072\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa3395c\",\n        \"push 0x5448474c\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x81000072\",\n        \"push 0x46\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33950\",\n        \"push 0x4b524144\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push 0x40\",\n        \"push 0xf0\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x4\",\n        \"push 0xa33948\",\n        \"push 0x4c505344\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x4c505344\",\n        \"push 0x1\",\n        \"push 0x40\",\n        \"push 0x163\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x4\",\n        \"push 0xa3393c\",\n        \"push 0x50525453\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x81000242\",\n        \"push 0x3c\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x4\",\n        \"push 0xa33930\",\n        \"push 0x454c4554\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x81000012\",\n        \"push 0x3a\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x4\",\n        \"push 0xa33924\",\n        \"push 0x54435444\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"fldz\",\n        \"push 0x0\",\n        \"push 0x40\",\n        \"push 0x1000072\",\n        \"push 0x34\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x4\",\n        \"push 0xa33910\",\n        \"push 0x53424153\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x35\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x4\",\n        \"push 0xa33908\",\n        \"push 0x434c4652\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100001a\",\n        \"push 0x3b\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x4\",\n        \"push 0xa338f8\",\n        \"push 0x47444552\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100070\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa338e4\",\n        \"push 0x54414552\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000070\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa338d4\",\n        \"push 0x45484552\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000070\",\n        \"push 0x9\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa338bc\",\n        \"push 0x50534552\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000070\",\n        \"push 0xa\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa338ac\",\n        \"push 0x41464552\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100072\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33898\",\n        \"push 0x54414f46\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x80072\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33888\",\n        \"push 0x4b534f46\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000072\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33878\",\n        \"push 0x45484f46\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000072\",\n        \"push 0x9\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33860\",\n        \"push 0x50534f46\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000072\",\n        \"push 0xa\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33850\",\n        \"push 0x41464f46\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x4b535244\",\n        \"push 0x4b534241\",\n        \"push 0x4c505344\",\n        \"push 0x3\",\n        \"push 0x40\",\n        \"push 0x80027\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33840\",\n        \"push 0x4b534241\",\n        \"call 0x00417220\",\n        \"add esp,0x2c\",\n        \"push 0x54414744\",\n        \"push 0x54415244\",\n        \"push 0x54414241\",\n        \"fldz\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x100027\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa3382c\",\n        \"push 0x54414241\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x594d5544\",\n        \"push 0x45484744\",\n        \"push 0x45485244\",\n        \"push 0x45484241\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000025\",\n        \"push 0x8\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa3381c\",\n        \"push 0x45484241\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x34\",\n        \"push 0x41464744\",\n        \"push 0x41465244\",\n        \"push 0x41464241\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000025\",\n        \"push 0xa\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa3380c\",\n        \"push 0x41464241\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x50534744\",\n        \"push 0x50535244\",\n        \"push 0x50534241\",\n        \"push 0x4c505344\",\n        \"push 0x4\",\n        \"push 0x40\",\n        \"push 0x1000025\",\n        \"push 0x9\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa337f8\",\n        \"push 0x50534241\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x30\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x3d\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa337ec\",\n        \"push 0x49465352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x3e\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa337dc\",\n        \"push 0x52465352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x44\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa337cc\",\n        \"push 0x48535352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x40\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa337bc\",\n        \"push 0x414d5352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x3f\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa337ac\",\n        \"push 0x49445352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x43\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa3379c\",\n        \"push 0x4f505352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x42\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33788\",\n        \"push 0x41505352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100007a\",\n        \"push 0x41\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33770\",\n        \"push 0x574e5352\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x100017a\",\n        \"push 0x47\",\n        \"fldz\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa3375c\",\n        \"push 0x44575352\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1f0\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa3374c\",\n        \"push 0x49445543\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1f0\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33740\",\n        \"push 0x4f505543\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1f0\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33730\",\n        \"push 0x41505543\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x1000012\",\n        \"push 0x28\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x5\",\n        \"push 0xa33714\",\n        \"push 0x4d4d4f46\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33704\",\n        \"push 0x4f48475a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa336f8\",\n        \"push 0x43494c5a\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"fldz\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa336e8\",\n        \"push 0x454b535a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa336d0\",\n        \"push 0x414b535a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa336b4\",\n        \"push 0x434b535a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3369c\",\n        \"push 0x484b535a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3368c\",\n        \"push 0x4152575a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33678\",\n        \"push 0x4c52575a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33668\",\n        \"push 0x4d4f5a5a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33650\",\n        \"push 0x5a44485a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33638\",\n        \"push 0x4149465a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33620\",\n        \"push 0x4152465a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33608\",\n        \"push 0x4154535a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa335f8\",\n        \"push 0x4541445a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa335e8\",\n        \"push 0x4552445a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa335d4\",\n        \"push 0x4c52445a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa335c4\",\n        \"push 0x4143535a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa335b0\",\n        \"push 0x414c435a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33598\",\n        \"push 0x4450535a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33588\",\n        \"push 0x5649585a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33578\",\n        \"push 0x3130305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33568\",\n        \"push 0x3230305a\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"fldz\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33558\",\n        \"push 0x3330305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33548\",\n        \"push 0x3430305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33538\",\n        \"push 0x3530305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33528\",\n        \"push 0x3630305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33518\",\n        \"push 0x3730305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33508\",\n        \"push 0x3830305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa334f8\",\n        \"push 0x3930305a\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"fldz\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa334e8\",\n        \"push 0x3031305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa334d8\",\n        \"push 0x3131305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa334c8\",\n        \"push 0x3231305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa334b8\",\n        \"push 0x3331305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa334a8\",\n        \"push 0x3431305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33498\",\n        \"push 0x3531305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33488\",\n        \"push 0x3631305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33478\",\n        \"push 0x3731305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33468\",\n        \"push 0x3831305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33458\",\n        \"push 0x3931305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x40112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33448\",\n        \"push 0x3032305a\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x4c505344\",\n        \"push 0x1\",\n        \"push -0x1\",\n        \"push 0x40000062\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33434\",\n        \"push 0x55484f43\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x4c505344\",\n        \"push 0x1\",\n        \"push -0x1\",\n        \"push 0x40000062\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x3\",\n        \"push 0xa33420\",\n        \"push 0x52434f43\",\n        \"call 0x00417220\",\n        \"add esp,0x24\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fldz\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33414\",\n        \"push 0x58415742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33408\",\n        \"push 0x4f425742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa333f8\",\n        \"push 0x41445742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa333ec\",\n        \"push 0x414d5742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa333e0\",\n        \"push 0x57535742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa333d4\",\n        \"push 0x4f424142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa333c4\",\n        \"push 0x55434142\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"fldz\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa333b4\",\n        \"push 0x41474142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa333a4\",\n        \"push 0x52474142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33394\",\n        \"push 0x45484142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33384\",\n        \"push 0x48534142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3336c\",\n        \"push 0x31304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33354\",\n        \"push 0x32304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3333c\",\n        \"push 0x33304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33324\",\n        \"push 0x34304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3330c\",\n        \"push 0x35304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa332f4\",\n        \"push 0x36304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa332dc\",\n        \"push 0x37304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa332c4\",\n        \"push 0x38304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa332ac\",\n        \"push 0x39304142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33294\",\n        \"push 0x30314142\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3327c\",\n        \"push 0x31305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33264\",\n        \"push 0x32305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3324c\",\n        \"push 0x33305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33234\",\n        \"push 0x34305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3321c\",\n        \"push 0x35305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33204\",\n        \"push 0x36305742\",\n        \"call 0x00417220\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fldz\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa331ec\",\n        \"push 0x37305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa331d4\",\n        \"push 0x38305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa331bc\",\n        \"push 0x39305742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa331a4\",\n        \"push 0x30315742\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x594c4152\",\n        \"push 0x4c505344\",\n        \"push 0x2\",\n        \"push 0x40\",\n        \"push 0x40000063\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33198\",\n        \"push 0x4e525554\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x28\",\n        \"push 0x4c505344\",\n        \"push 0x1\",\n        \"push -0x1\",\n        \"push 0x170\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x6\",\n        \"push 0xa33188\",\n        \"push 0x46464553\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x24\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa3316c\",\n        \"push 0x4854594d\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x20112\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33154\",\n        \"push 0x4c48594d\",\n        \"call 0x00417220\",\n        \"fldz\",\n        \"add esp,0x20\",\n        \"push 0x0\",\n        \"push -0x1\",\n        \"push 0x10000360\",\n        \"push 0x0\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"push 0x1\",\n        \"push 0xa33148\",\n        \"push 0x4e414552\",\n        \"call 0x00417220\",\n        \"add esp,0x20\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x0\",\n        \"fmov d2, x20\",\n        \"str w20, [x8, #-4]!\",\n        \"mov w21, #0xffffffff\",\n        \"str w21, [x8, #-4]!\",\n        \"mov w21, #0x172\",\n        \"movk w21, #0x100, lsl #16\",\n        \"str w21, [x8, #-4]!\",\n        \"mov w21, #0x37\",\n        \"stp w7, w21, [x8, #-8]!\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8]\",\n        \"str w20, [x8, #-4]!\",\n        \"mov w20, #0x3c14\",\n        \"movk w20, #0xa3, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"mov w20, #0x4157\",\n        \"movk w20, #0x5242, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"mov w20, #0x22\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"add w21, w21, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"lsl w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    },\n    \"Block5\": {\n      \"x86InstructionCount\": 368,\n      \"ExpectedInstructionCount\": 49,\n      \"x86Insts\": [\n        \"mov ebx,dword [eax + 0x68]\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov eax,dword [ebp + 0x68]\",\n        \"sub esp,0x14\",\n        \"fstp dword [esp + 0x10]\",\n        \"movzx ecx,al\",\n        \"fld1\",\n        \"mov dword [esp + 0x38],ecx\",\n        \"fstp dword [esp + 0xc]\",\n        \"movzx edx,bl\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fild dword [esp + 0x38]\",\n        \"mov dword [esp + 0x40],eax\",\n        \"fld qword [0x00a3ddd8]\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x38],edx\",\n        \"fild dword [esp + 0x38]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esi + 0x2c]\",\n        \"movzx eax,byte [esp + 0x41]\",\n        \"fstp dword [esp + 0x10]\",\n        \"mov dword [esp + 0x38],eax\",\n        \"fld1\",\n        \"movzx ecx,bh\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fild dword [esp + 0x38]\",\n        \"fld qword [0x00a3ddd8]\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x38],ecx\",\n        \"fild dword [esp + 0x38]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x28]\",\n        \"mov eax,dword [esp + 0x40]\",\n        \"fld dword [esi + 0x2c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"shr eax,0x10\",\n        \"fld1\",\n        \"movzx edx,al\",\n        \"fstp dword [esp + 0xc]\",\n        \"mov dword [esp + 0x40],edx\",\n        \"fldz\",\n        \"shr ebx,0x10\",\n        \"movzx eax,bl\",\n        \"fstp dword [esp + 0x8]\",\n        \"fild dword [esp + 0x40]\",\n        \"fld qword [0x00a3ddd8]\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x40],eax\",\n        \"fild dword [esp + 0x40]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld1\",\n        \"fst dword [esp + 0x30]\",\n        \"mov ecx,dword [esp + 0x24]\",\n        \"mov edx,dword [esp + 0x28]\",\n        \"mov eax,dword [esp + 0x2c]\",\n        \"mov dword [0x00b45e14],ecx\",\n        \"mov ecx,dword [esp + 0x30]\",\n        \"mov [0x00b45e1c],eax\",\n        \"mov dword [0x00b45e20],ecx\",\n        \"mov dword [0x00b45e18],edx\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov eax,dword [ebp + 0x6c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"mov dword [esp + 0x40],eax\",\n        \"fstp dword [esp + 0xc]\",\n        \"movzx eax,al\",\n        \"fldz\",\n        \"mov dword [esp + 0x38],eax\",\n        \"fstp dword [esp + 0x8]\",\n        \"mov edx,dword [esi + 0x20]\",\n        \"fild dword [esp + 0x38]\",\n        \"mov ebx,dword [edx + 0x6c]\",\n        \"fld qword [0x00a3ddd8]\",\n        \"movzx ecx,bl\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x38],ecx\",\n        \"fild dword [esp + 0x38]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esi + 0x2c]\",\n        \"movzx edx,byte [esp + 0x41]\",\n        \"fstp dword [esp + 0x10]\",\n        \"mov dword [esp + 0x38],edx\",\n        \"fld1\",\n        \"movzx eax,bh\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fild dword [esp + 0x38]\",\n        \"fld qword [0x00a3ddd8]\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x38],eax\",\n        \"fild dword [esp + 0x38]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x28]\",\n        \"mov eax,dword [esp + 0x40]\",\n        \"fld dword [esi + 0x2c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"shr eax,0x10\",\n        \"fld1\",\n        \"movzx ecx,al\",\n        \"fstp dword [esp + 0xc]\",\n        \"mov dword [esp + 0x40],ecx\",\n        \"fldz\",\n        \"shr ebx,0x10\",\n        \"movzx edx,bl\",\n        \"fstp dword [esp + 0x8]\",\n        \"fild dword [esp + 0x40]\",\n        \"fld qword [0x00a3ddd8]\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x40],edx\",\n        \"fild dword [esp + 0x40]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"mov eax,dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld1\",\n        \"mov ecx,dword [esp + 0x28]\",\n        \"mov edx,dword [esp + 0x2c]\",\n        \"fst dword [esp + 0x30]\",\n        \"mov [0x00b45e24],eax\",\n        \"mov eax,dword [esp + 0x30]\",\n        \"mov dword [0x00b45e2c],edx\",\n        \"mov [0x00b45e30],eax\",\n        \"mov dword [0x00b45e28],ecx\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov eax,dword [ebp + 0x70]\",\n        \"fstp dword [esp + 0x10]\",\n        \"movzx edx,al\",\n        \"fstp dword [esp + 0xc]\",\n        \"mov dword [esp + 0x38],edx\",\n        \"fldz\",\n        \"mov ecx,dword [esi + 0x20]\",\n        \"fstp dword [esp + 0x8]\",\n        \"mov ebx,dword [ecx + 0x70]\",\n        \"fild dword [esp + 0x38]\",\n        \"mov dword [esp + 0x40],eax\",\n        \"fld qword [0x00a3ddd8]\",\n        \"movzx eax,bl\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x38],eax\",\n        \"fild dword [esp + 0x38]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esi + 0x2c]\",\n        \"movzx ecx,byte [esp + 0x41]\",\n        \"fstp dword [esp + 0x10]\",\n        \"mov dword [esp + 0x38],ecx\",\n        \"fld1\",\n        \"movzx edx,bh\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fild dword [esp + 0x38]\",\n        \"fld qword [0x00a3ddd8]\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x38],edx\",\n        \"fild dword [esp + 0x38]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x38]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x28]\",\n        \"mov eax,dword [esp + 0x40]\",\n        \"fld dword [esi + 0x2c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"shr eax,0x10\",\n        \"fld1\",\n        \"movzx eax,al\",\n        \"fstp dword [esp + 0xc]\",\n        \"mov dword [esp + 0x40],eax\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fild dword [esp + 0x40]\",\n        \"fld qword [0x00a3ddd8]\",\n        \"fdiv st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"shr ebx,0x10\",\n        \"movzx ecx,bl\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp + 0x40],ecx\",\n        \"fild dword [esp + 0x40]\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x40]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld1\",\n        \"mov edx,dword [esp + 0x24]\",\n        \"mov eax,dword [esp + 0x28]\",\n        \"fst dword [esp + 0x30]\",\n        \"mov ecx,dword [esp + 0x2c]\",\n        \"mov dword [0x00b45e34],edx\",\n        \"mov edx,dword [esp + 0x30]\",\n        \"mov [0x00b45e38],eax\",\n        \"mov dword [0x00b45e3c],ecx\",\n        \"mov dword [0x00b45e40],edx\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov eax,dword [esi + 0x24]\",\n        \"fstp dword [esp + 0x10]\",\n        \"mov ecx,dword [esi + 0x20]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x4c]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [ecx + 0x4c]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [0x00b45e44]\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov edx,dword [esi + 0x24]\",\n        \"mov eax,dword [esi + 0x20]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld1\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [edx + 0x50]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [eax + 0x50]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [0x00b45e48]\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov ecx,dword [esi + 0x24]\",\n        \"add esp,0x8\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld1\",\n        \"fstp dword [esp + 0x4]\",\n        \"fldz\",\n        \"fstp dword [esp]\",\n        \"call 0x004ed660\",\n        \"push ecx\",\n        \"mov ecx,dword [esi + 0x20]\",\n        \"fstp dword [esp]\",\n        \"call 0x004ed660\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [0x00b45e4c]\",\n        \"mov ecx,dword [esi + 0x24]\",\n        \"fld dword [esi + 0x2c]\",\n        \"add esp,0x8\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld1\",\n        \"fstp dword [esp + 0x4]\",\n        \"fldz\",\n        \"fstp dword [esp]\",\n        \"call 0x004ed680\",\n        \"push ecx\",\n        \"mov ecx,dword [esi + 0x20]\",\n        \"fstp dword [esp]\",\n        \"call 0x004ed680\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [0x00b45e50]\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov ecx,dword [esi + 0x24]\",\n        \"mov edx,dword [esi + 0x20]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld1\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [ecx + 0x58]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [edx + 0x58]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [0x00b45e54]\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov eax,dword [esi + 0x24]\",\n        \"mov ecx,dword [esi + 0x20]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld1\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x5c]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [ecx + 0x5c]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"fstp dword [0x00b45e58]\",\n        \"fld dword [esi + 0x2c]\",\n        \"mov edx,dword [esi + 0x24]\",\n        \"mov eax,dword [esi + 0x20]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld1\",\n        \"fstp dword [esp + 0xc]\",\n        \"fldz\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [edx + 0x54]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [eax + 0x54]\",\n        \"fstp dword [esp]\",\n        \"call 0x00410eb0\",\n        \"add esp,0x14\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w6, [x4, #104]\",\n        \"ldr s2, [x10, #44]\",\n        \"ldr w4, [x9, #104]\",\n        \"mvn w27, w8\",\n        \"subs w26, w8, #0x14 (20)\",\n        \"mov x8, x26\",\n        \"str s2, [x8, #16]\",\n        \"uxtb w7, w4\",\n        \"mov x20, #0x3ff0000000000000\",\n        \"fmov d2, x20\",\n        \"str w7, [x8, #56]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #12]\",\n        \"uxtb w5, w6\",\n        \"mov w20, #0x0\",\n        \"fmov d2, x20\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #8]\",\n        \"ldr w20, [x8, #56]\",\n        \"scvtf d2, w20\",\n        \"str w4, [x8, #64]\",\n        \"mov w20, #0xddd8\",\n        \"movk w20, #0xa3, lsl #16\",\n        \"ldr d3, [x20]\",\n        \"fdiv d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #56]\",\n        \"str s2, [x8, #4]\",\n        \"str w5, [x8, #56]\",\n        \"ldr w20, [x8, #56]\",\n        \"scvtf d2, w20\",\n        \"fdiv d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #56]\",\n        \"str s2, [x8]\",\n        \"mov w20, #0x5e\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x8\",\n        \"sub w21, w23, w21\",\n        \"mov w23, #0xc0c0\",\n        \"lsr w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    },\n    \"Block6\": {\n      \"x86InstructionCount\": 315,\n      \"ExpectedInstructionCount\": 27,\n      \"x86Insts\": [\n        \"mov eax,dword [esp + 0x110]\",\n        \"fldz\",\n        \"mov ecx,dword [eax]\",\n        \"mov edx,dword [esp + 0x5c]\",\n        \"mov ebx,dword [edx + 0x18]\",\n        \"mov esi,dword [esp + 0x58]\",\n        \"mov dword [ebx + 0xc],ecx\",\n        \"mov edx,dword [eax + 0x4]\",\n        \"mov dword [ebx + 0x10],edx\",\n        \"mov eax,dword [eax + 0x8]\",\n        \"mov dword [ebx + 0x14],eax\",\n        \"mov ecx,dword [esi + 0x50]\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"call 0x00784370\",\n        \"mov ecx,dword [esi + 0x50]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fldz\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"call 0x00784370\",\n        \"fstp dword [esp + 0x64]\",\n        \"mov eax,dword [esp + 0x11c]\",\n        \"lea ebp,[ebx + 0x1c]\",\n        \"mov esi,eax\",\n        \"mov ecx,0x9\",\n        \"mov edi,ebp\",\n        \"rep movsd\",\n        \"fld dword [eax + 0x4]\",\n        \"mov ecx,dword [esp + 0x120]\",\n        \"sub esp,0xc\",\n        \"fmul dword [ecx + 0x4]\",\n        \"fld dword [ecx]\",\n        \"fmul dword [eax]\",\n        \"faddp\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul dword [ecx + 0x8]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmul dword [ecx]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmul dword [ecx + 0x4]\",\n        \"faddp\",\n        \"fld dword [eax + 0x14]\",\n        \"fmul dword [ecx + 0x8]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmul dword [ecx]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmul dword [ecx + 0x4]\",\n        \"faddp\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,esp\",\n        \"fmul dword [ecx + 0x8]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x48]\",\n        \"mov ecx,dword [esp + 0x48]\",\n        \"fld dword [esp + 0x44]\",\n        \"mov dword [eax],ecx\",\n        \"fstp dword [esp + 0x4c]\",\n        \"mov edx,dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x34]\",\n        \"mov dword [eax + 0x4],edx\",\n        \"fstp dword [esp + 0x50]\",\n        \"mov ecx,dword [esp + 0x50]\",\n        \"fld dword [esp + 0x3c]\",\n        \"mov dword [eax + 0x8],ecx\",\n        \"push ecx\",\n        \"mov ecx,ebp\",\n        \"fstp dword [esp]\",\n        \"call 0x0078f050\",\n        \"fld dword [esp + 0x54]\",\n        \"sub esp,0x8\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fadd dword [esp + 0x3c]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esp + 0x24]\",\n        \"mov ecx,ebp\",\n        \"fstp dword [esp]\",\n        \"call 0x0078ef60\",\n        \"fld dword [ebp + 0xc]\",\n        \"mov esi,dword [esp + 0x58]\",\n        \"fld dword [0x00b2b71c]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fld dword [ebp]\",\n        \"fld dword [0x00b2b718]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch st3\",\n        \"faddp\",\n        \"fld dword [ebp + 0x18]\",\n        \"fld dword [0x00b2b720]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch st2\",\n        \"faddp\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [ebp + 0x10]\",\n        \"fmul st2\",\n        \"fld dword [ebp + 0x4]\",\n        \"fmul st4\",\n        \"faddp\",\n        \"fld dword [ebp + 0x1c]\",\n        \"fmul st2\",\n        \"faddp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [ebp + 0x14]\",\n        \"fmulp st2\",\n        \"fld dword [ebp + 0x8]\",\n        \"fmulp st3\",\n        \"fxch\",\n        \"faddp st2,st0\",\n        \"fmul dword [ebp + 0x20]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"mov edx,dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x38]\",\n        \"mov dword [ebx],edx\",\n        \"fstp dword [esp + 0x40]\",\n        \"mov eax,dword [esp + 0x40]\",\n        \"fld dword [esp + 0x28]\",\n        \"mov dword [ebx + 0x4],eax\",\n        \"fstp dword [esp + 0x44]\",\n        \"mov ecx,dword [esp + 0x44]\",\n        \"fldz\",\n        \"mov dword [ebx + 0x8],ecx\",\n        \"mov ecx,dword [esi + 0x68]\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"call 0x00784210\",\n        \"fmul dword [esp + 0x6c]\",\n        \"fstp dword [ebx + 0x18]\",\n        \"mov ecx,dword [esi + 0x5c]\",\n        \"fldz\",\n        \"push ecx\",\n        \"fstp dword [esp]\",\n        \"call 0x00784210\",\n        \"fmul dword [esp + 0x80]\",\n        \"push 0xb2b724\",\n        \"mov ecx,ebx\",\n        \"fstp dword [esp + 0x54]\",\n        \"call 0x0078fcc0\",\n        \"fmul qword [0x00a8ba48]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp + 0x34]\",\n        \"fsubr qword [0x00a65a18]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fabs\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fmul qword [0x00a8c698]\",\n        \"fld1\",\n        \"fsubrp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [0x00b2b72c]\",\n        \"fld st0\",\n        \"fmul dword [ebx + 0x4]\",\n        \"fld dword [ebx + 0x8]\",\n        \"fld dword [0x00b2b728]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch st2\",\n        \"fsubrp\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [ebx + 0x8]\",\n        \"fld dword [0x00b2b724]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fld dword [ebx]\",\n        \"fmulp st4\",\n        \"fxch\",\n        \"fsubrp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x30]\",\n        \"fmul dword [ebx]\",\n        \"fld dword [ebx + 0x4]\",\n        \"fmulp st2\",\n        \"fsubrp\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x30]\",\n        \"fld dword [esp + 0x24]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fld st1\",\n        \"fmulp st2\",\n        \"fld st2\",\n        \"fmulp st3\",\n        \"fxch\",\n        \"faddp st2,st0\",\n        \"fmul st0\",\n        \"faddp\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x1c]\",\n        \"call 0x00982c30\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x1c]\",\n        \"mov ecx,dword [esi + 0x70]\",\n        \"fld1\",\n        \"push ecx\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x20]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x44]\",\n        \"fmul dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fldz\",\n        \"fstp dword [esp]\",\n        \"call 0x00784210\",\n        \"fsub qword [0x00a2faa0]\",\n        \"mov edx,dword [esp + 0x3c]\",\n        \"mov ecx,dword [esp + 0x40]\",\n        \"sub esp,0xc\",\n        \"fadd st0,st0\",\n        \"mov eax,esp\",\n        \"mov dword [eax],edx\",\n        \"fmul qword [0x00a3d360]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld1\",\n        \"fst dword [esp + 0xb8]\",\n        \"fldz\",\n        \"fst dword [esp + 0xbc]\",\n        \"fst dword [esp + 0xc0]\",\n        \"fst dword [esp + 0xc4]\",\n        \"fst dword [esp + 0xcc]\",\n        \"fst dword [esp + 0xd0]\",\n        \"fstp dword [esp + 0xd4]\",\n        \"fst dword [esp + 0xc8]\",\n        \"fstp dword [esp + 0xd8]\",\n        \"fld dword [esp + 0x28]\",\n        \"mov edx,dword [esp + 0x50]\",\n        \"fmul dword [esp + 0x90]\",\n        \"mov dword [eax + 0x4],ecx\",\n        \"push ecx\",\n        \"mov dword [eax + 0x8],edx\",\n        \"fmul dword [esp + 0x44]\",\n        \"lea ecx,[esp + 0xbc]\",\n        \"fmul dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fstp dword [esp]\",\n        \"call 0x0078f160\",\n        \"lea eax,[esp + 0xac]\",\n        \"push eax\",\n        \"lea ecx,[esp + 0xd4]\",\n        \"push ecx\",\n        \"mov ecx,ebp\",\n        \"call 0x0078edd0\",\n        \"cmp dword [esp + 0x124],0x0\",\n        \"mov esi,eax\",\n        \"mov ecx,0x9\",\n        \"mov edi,ebp\",\n        \"rep movsd\",\n        \"fld dword [ebp + 0xc]\",\n        \"fld dword [0x00b2b71c]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fld dword [ebp]\",\n        \"fld dword [0x00b2b718]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch st3\",\n        \"faddp\",\n        \"fld dword [ebp + 0x18]\",\n        \"fld dword [0x00b2b720]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch st2\",\n        \"faddp\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [ebp + 0x10]\",\n        \"fmul st2\",\n        \"fld dword [ebp + 0x4]\",\n        \"fmul st4\",\n        \"faddp\",\n        \"fld dword [ebp + 0x1c]\",\n        \"fmul st2\",\n        \"faddp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [ebp + 0x14]\",\n        \"fmulp st2\",\n        \"fld dword [ebp + 0x8]\",\n        \"fmulp st3\",\n        \"fxch\",\n        \"faddp st2,st0\",\n        \"fmul dword [ebp + 0x20]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"mov edx,dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x38]\",\n        \"mov dword [ebx],edx\",\n        \"fstp dword [esp + 0x40]\",\n        \"mov eax,dword [esp + 0x40]\",\n        \"fld dword [esp + 0x28]\",\n        \"mov dword [ebx + 0x4],eax\",\n        \"mov eax,dword [esp + 0x10c]\",\n        \"fstp dword [esp + 0x44]\",\n        \"mov ecx,dword [esp + 0x44]\",\n        \"mov dword [ebx + 0x8],ecx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x8, #272]\",\n        \"mov w20, #0x0\",\n        \"fmov d2, x20\",\n        \"ldr w7, [x4]\",\n        \"ldr w5, [x8, #92]\",\n        \"ldr w6, [x5, #24]\",\n        \"ldr w10, [x8, #88]\",\n        \"str w7, [x6, #12]\",\n        \"ldr w5, [x4, #4]\",\n        \"str w5, [x6, #16]\",\n        \"ldr w4, [x4, #8]\",\n        \"str w4, [x6, #20]\",\n        \"ldr w7, [x10, #80]\",\n        \"str w7, [x8, #-4]!\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8]\",\n        \"mov w20, #0x31\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"add w21, w21, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"lsl w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    },\n    \"Block7\": {\n      \"x86InstructionCount\": 214,\n      \"ExpectedInstructionCount\": 432,\n      \"x86Insts\": [\n        \"fld dword [ecx + 0xc]\",\n        \"fld dword [ecx + 0x18]\",\n        \"fadd st0,st1\",\n        \"fstp dword [ecx + 0x18]\",\n        \"fld dword [ecx]\",\n        \"fadd st1,st0\",\n        \"fxch\",\n        \"fstp dword [ecx + 0xc]\",\n        \"fld dword [ecx + -0xc]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [ecx]\",\n        \"fld dword [ecx + -0x18]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [ecx + -0xc]\",\n        \"fld dword [ecx + -0x24]\",\n        \"fld st0\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst dword [ecx + -0x18]\",\n        \"fld dword [ecx]\",\n        \"fld dword [ecx + 0x18]\",\n        \"fadd st0,st1\",\n        \"fstp dword [ecx + 0x18]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x8]\",\n        \"fst dword [ecx]\",\n        \"fld dword [ecx + -0xc]\",\n        \"fmul st6\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [ecx + 0xc]\",\n        \"fld st0\",\n        \"fmul st6\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x8]\",\n        \"fadd st0,st4\",\n        \"fstp dword [esp + 0x8]\",\n        \"fsubp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x38]\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x40]\",\n        \"fxch\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [ecx + 0x18]\",\n        \"fld st0\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x8]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x8]\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld dword [esp + 0x4]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x8]\",\n        \"fmul qword [0x00a77be0]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x48]\",\n        \"fmul qword [0x00a77bd8]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fmul qword [0x00a77bd0]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x38]\",\n        \"fst dword [esp + 0x8]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fadd st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x38]\",\n        \"fsubr dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fst dword [esp + 0x8]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fsubr dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x40]\",\n        \"fst dword [esp + 0x8]\",\n        \"fld dword [esp + 0x44]\",\n        \"fadd st1,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x40]\",\n        \"fsubr dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul qword [0x00a77bc8]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul qword [0x00a77bc0]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x40]\",\n        \"fmul qword [0x00a77bb8]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x44]\",\n        \"fmul qword [0x00a77bb0]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x48]\",\n        \"fmul qword [0x00a77ba8]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fmul qword [0x00a77ba0]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x38]\",\n        \"fchs\",\n        \"fld st0\",\n        \"fmul st2\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld qword [0x00a77b98]\",\n        \"fmul st1\",\n        \"fxch\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fchs\",\n        \"fld st0\",\n        \"fld qword [0x00a77b90]\",\n        \"fmul st1\",\n        \"fxch\",\n        \"fstp dword [esp + 0x54]\",\n        \"fxch\",\n        \"fmul qword [0x00a77b88]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esp + 0x40]\",\n        \"fchs\",\n        \"fld qword [0x00a77b80]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x50]\",\n        \"fmul qword [0x00a77b78]\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x48]\",\n        \"fld qword [0x00a77b88]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fld st0\",\n        \"fmulp st4\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x40]\",\n        \"fxch st2\",\n        \"fchs\",\n        \"fmul st3\",\n        \"add eax,0x18\",\n        \"add ecx,0x4\",\n        \"sub edx,0x1\",\n        \"fstp dword [esp + 0x44]\",\n        \"fxch\",\n        \"fchs\",\n        \"fmulp\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [esp + 0x38]\",\n        \"fld st0\",\n        \"fchs\",\n        \"fmul qword [0x00a77b80]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fmul qword [0x00a77b78]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [eax + -0x1c]\",\n        \"fadd dword [esp + 0x38]\",\n        \"fstp dword [eax + -0x1c]\",\n        \"fld dword [eax + -0x18]\",\n        \"fadd dword [esp + 0x3c]\",\n        \"fstp dword [eax + -0x18]\",\n        \"fld dword [esp + 0x40]\",\n        \"fadd dword [eax + -0x14]\",\n        \"fstp dword [eax + -0x14]\",\n        \"fld dword [eax + -0x10]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [eax + -0x10]\",\n        \"fld dword [eax + -0xc]\",\n        \"fadd dword [esp + 0x48]\",\n        \"fstp dword [eax + -0xc]\",\n        \"fld dword [eax + -0x8]\",\n        \"fadd dword [esp + 0x4c]\",\n        \"fstp dword [eax + -0x8]\",\n        \"fld dword [esp + 0x50]\",\n        \"fadd dword [eax + -0x4]\",\n        \"fstp dword [eax + -0x4]\",\n        \"fld dword [eax]\",\n        \"fadd dword [esp + 0x54]\",\n        \"fstp dword [eax]\",\n        \"fld dword [eax + 0x4]\",\n        \"fadd dword [esp + 0x58]\",\n        \"fstp dword [eax + 0x4]\",\n        \"fld dword [eax + 0x8]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fstp dword [eax + 0x8]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [eax + 0xc]\",\n        \"fstp dword [eax + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fadd dword [esp + 0x64]\",\n        \"fstp dword [eax + 0x10]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x7, #12]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #24]\",\n        \"fcvt d3, s3\",\n        \"fadd d3, d3, d2\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #24]\",\n        \"ldr s3, [x7]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x7, #12]\",\n        \"ldur s2, [x7, #-12]\",\n        \"fcvt d2, s2\",\n        \"fadd d3, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7]\",\n        \"ldur s3, [x7, #-24]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x7, #-12]\",\n        \"ldur s2, [x7, #-36]\",\n        \"fcvt d2, s2\",\n        \"fadd d3, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #8]\",\n        \"ldr s3, [x8, #8]\",\n        \"fcvt d4, s3\",\n        \"stur s3, [x7, #-24]\",\n        \"ldr s3, [x7]\",\n        \"fcvt d3, s3\",\n        \"ldr s5, [x7, #24]\",\n        \"fcvt d5, s5\",\n        \"fadd d5, d5, d3\",\n        \"fcvt s5, d5\",\n        \"str s5, [x7, #24]\",\n        \"fadd d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #8]\",\n        \"ldr s3, [x8, #8]\",\n        \"fcvt d5, s3\",\n        \"str s3, [x7]\",\n        \"ldur s3, [x7, #-12]\",\n        \"fcvt d3, s3\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d6, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"fmul d3, d3, d6\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #4]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"ldr s3, [x7, #12]\",\n        \"fcvt d3, s3\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add w23, w20, #0x6 (6)\",\n        \"and w23, w23, #0x7\",\n        \"add x23, x28, x23, lsl #4\",\n        \"ldr d7, [x23, #1056]\",\n        \"add x23, x28, x20, lsl #4\",\n        \"fmul d8, d3, d7\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #8]\",\n        \"ldr s8, [x8, #8]\",\n        \"fcvt d8, s8\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x12, x28, x20, lsl #4\",\n        \"fadd d8, d8, d2\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #8]\",\n        \"fsub d2, d2, d3\",\n        \"add x13, x28, x22, lsl #4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #60]\",\n        \"add w22, w22, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"ldr s2, [x8, #8]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #4]\",\n        \"fcvt d3, s3\",\n        \"fadd d8, d3, d2\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #56]\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #64]\",\n        \"add x22, x28, x22, lsl #4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d2, d5, d6\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #4]\",\n        \"ldr s2, [x7, #24]\",\n        \"fcvt d2, s2\",\n        \"fmul d3, d2, d7\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #8]\",\n        \"ldr s3, [x8, #8]\",\n        \"fcvt d3, s3\",\n        \"fadd d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #8]\",\n        \"fsub d2, d4, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #72]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldr s2, [x8, #8]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #4]\",\n        \"fcvt d3, s3\",\n        \"fadd d4, d3, d2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #76]\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #8]\",\n        \"ldr s2, [x8, #8]\",\n        \"fcvt d2, s2\",\n        \"mov w14, #0x7be0\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #68]\",\n        \"ldr s2, [x8, #72]\",\n        \"fcvt d2, s2\",\n        \"mov w14, #0x7bd8\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #72]\",\n        \"ldr s2, [x8, #76]\",\n        \"fcvt d2, s2\",\n        \"mov w14, #0x7bd0\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #76]\",\n        \"ldr s2, [x8, #56]\",\n        \"fcvt d2, s2\",\n        \"fcvt s3, d2\",\n        \"str s3, [x8, #8]\",\n        \"ldr s3, [x8, #76]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #8]\",\n        \"fcvt d2, s2\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #76]\",\n        \"ldr s2, [x8, #60]\",\n        \"fcvt d2, s2\",\n        \"fcvt s3, d2\",\n        \"str s3, [x8, #8]\",\n        \"ldr s3, [x8, #72]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #8]\",\n        \"fcvt d2, s2\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #72]\",\n        \"ldr s2, [x8, #64]\",\n        \"fcvt d2, s2\",\n        \"fcvt s3, d2\",\n        \"str s3, [x8, #8]\",\n        \"ldr s3, [x8, #68]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #64]\",\n        \"ldr s2, [x8, #8]\",\n        \"fcvt d2, s2\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #68]\",\n        \"ldr s2, [x8, #56]\",\n        \"fcvt d2, s2\",\n        \"mov w14, #0x7bc8\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #60]\",\n        \"fcvt d2, s2\",\n        \"mov w14, #0x7bc0\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #64]\",\n        \"fcvt d2, s2\",\n        \"mov w14, #0x7bb8\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #64]\",\n        \"ldr s2, [x8, #68]\",\n        \"fcvt d2, s2\",\n        \"mov w14, #0x7bb0\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #68]\",\n        \"ldr s2, [x8, #72]\",\n        \"fcvt d2, s2\",\n        \"mov w14, #0x7ba8\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #72]\",\n        \"ldr s2, [x8, #76]\",\n        \"fcvt d2, s2\",\n        \"mov w14, #0x7ba0\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d3, [x14]\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #76]\",\n        \"ldr s2, [x8, #56]\",\n        \"fcvt d2, s2\",\n        \"fneg v2.2d, v2.2d\",\n        \"add x14, x28, x20, lsl #4\",\n        \"ldr d3, [x14, #1056]\",\n        \"fmul d4, d2, d3\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #88]\",\n        \"mov w14, #0x7b98\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d4, [x14]\",\n        \"fmul d4, d4, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #92]\",\n        \"ldr s2, [x8, #60]\",\n        \"fcvt d2, s2\",\n        \"fneg v2.2d, v2.2d\",\n        \"mov w14, #0x7b90\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d5, [x14]\",\n        \"fmul d5, d5, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s6, d2\",\n        \"str s6, [x8, #84]\",\n        \"strb wzr, [x28, #1049]\",\n        \"mov w14, #0x7b88\",\n        \"movk w14, #0xa7, lsl #16\",\n        \"ldr d6, [x14]\",\n        \"fmul d2, d2, d6\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #96]\",\n        \"ldr s2, [x8, #64]\",\n        \"fcvt d2, s2\",\n        \"fneg v2.2d, v2.2d\",\n        \"mov w15, #0x7b80\",\n        \"movk w15, #0xa7, lsl #16\",\n        \"ldr d6, [x15]\",\n        \"fmul d6, d6, d2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #80]\",\n        \"mov w16, #0x7b78\",\n        \"movk w16, #0xa7, lsl #16\",\n        \"ldr d6, [x16]\",\n        \"fmul d2, d2, d6\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #100]\",\n        \"ldr s2, [x8, #68]\",\n        \"fcvt d2, s2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #56]\",\n        \"ldr s2, [x8, #72]\",\n        \"fcvt d2, s2\",\n        \"ldr d6, [x14]\",\n        \"fmul d6, d6, d2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #60]\",\n        \"ldr s6, [x8, #76]\",\n        \"fcvt d6, s6\",\n        \"fmul d4, d4, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s7, d4\",\n        \"str s7, [x8, #64]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fneg v7.2d, v6.2d\",\n        \"fmul d3, d7, d3\",\n        \"add w4, w4, #0x18 (24)\",\n        \"add w7, w7, #0x4 (4)\",\n        \"subs w26, w5, #0x1 (1)\",\n        \"mov x27, x5\",\n        \"mov x5, x26\",\n        \"fcvt s7, d3\",\n        \"str s7, [x8, #68]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fneg v2.2d, v2.2d\",\n        \"fmul d2, d5, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #72]\",\n        \"ldr s2, [x8, #56]\",\n        \"fcvt d2, s2\",\n        \"fneg v5.2d, v2.2d\",\n        \"ldr d7, [x15]\",\n        \"fmul d5, d5, d7\",\n        \"fcvt s7, d5\",\n        \"str s7, [x8, #76]\",\n        \"ldr d7, [x16]\",\n        \"fmul d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #56]\",\n        \"ldur s2, [x4, #-28]\",\n        \"fcvt d2, s2\",\n        \"ldr s7, [x8, #56]\",\n        \"fcvt d7, s7\",\n        \"fadd d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x4, #-28]\",\n        \"ldur s2, [x4, #-24]\",\n        \"fcvt d2, s2\",\n        \"ldr s7, [x8, #60]\",\n        \"fcvt d7, s7\",\n        \"fadd d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x4, #-24]\",\n        \"ldr s2, [x8, #64]\",\n        \"fcvt d2, s2\",\n        \"ldur s7, [x4, #-20]\",\n        \"fcvt d7, s7\",\n        \"fadd d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x4, #-20]\",\n        \"ldur s2, [x4, #-16]\",\n        \"fcvt d2, s2\",\n        \"ldr s7, [x8, #68]\",\n        \"fcvt d7, s7\",\n        \"fadd d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x4, #-16]\",\n        \"ldur s2, [x4, #-12]\",\n        \"fcvt d2, s2\",\n        \"ldr s7, [x8, #72]\",\n        \"fcvt d7, s7\",\n        \"fadd d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x4, #-12]\",\n        \"ldur s2, [x4, #-8]\",\n        \"fcvt d2, s2\",\n        \"ldr s7, [x8, #76]\",\n        \"fcvt d7, s7\",\n        \"fadd d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x4, #-8]\",\n        \"ldr s2, [x8, #80]\",\n        \"fcvt d2, s2\",\n        \"ldur s7, [x4, #-4]\",\n        \"fcvt d7, s7\",\n        \"fadd d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x4, #-4]\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr s7, [x8, #84]\",\n        \"fcvt d7, s7\",\n        \"fadd d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr s2, [x4, #4]\",\n        \"fcvt d2, s2\",\n        \"ldr s7, [x8, #88]\",\n        \"fcvt d7, s7\",\n        \"fadd d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #4]\",\n        \"ldr s2, [x4, #8]\",\n        \"fcvt d2, s2\",\n        \"ldr s7, [x8, #92]\",\n        \"fcvt d7, s7\",\n        \"fadd d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #8]\",\n        \"ldr s2, [x8, #96]\",\n        \"fcvt d2, s2\",\n        \"ldr s7, [x4, #12]\",\n        \"fcvt d7, s7\",\n        \"fadd d2, d2, d7\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #12]\",\n        \"ldr s2, [x4, #16]\",\n        \"fcvt d2, s2\",\n        \"ldr s7, [x8, #100]\",\n        \"fcvt d7, s7\",\n        \"fadd d2, d2, d7\",\n        \"fcvt s7, d2\",\n        \"str s7, [x4, #16]\",\n        \"strb w20, [x28, #1051]\",\n        \"str d6, [x23, #1056]\",\n        \"str d4, [x21, #1056]\",\n        \"str d3, [x13, #1056]\",\n        \"str d5, [x22, #1056]\",\n        \"str d2, [x12, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xf8f8\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block8\": {\n      \"x86InstructionCount\": 229,\n      \"ExpectedInstructionCount\": 466,\n      \"x86Insts\": [\n        \"movzx eax,word [esi + edx*0x8]\",\n        \"fld dword [esi + edx*0x8 + 0x4]\",\n        \"fstp dword [esp + 0x24]\",\n        \"mov esi,dword [esp + 0x1c8]\",\n        \"fld dword [esp + 0x9c]\",\n        \"movzx eax,ax\",\n        \"mov ecx,eax\",\n        \"imul ecx,dword [esp + 0x1e4]\",\n        \"lea eax,[eax + eax*0x2]\",\n        \"add eax,eax\",\n        \"add eax,eax\",\n        \"lea edi,[eax + esi*0x1 + 0x8]\",\n        \"mov dword [esp + 0x10],edi\",\n        \"fmul dword [eax + esi*0x1 + 0x4]\",\n        \"fld dword [esp + 0x98]\",\n        \"fmul dword [eax + esi*0x1]\",\n        \"faddp\",\n        \"fld dword [esp + 0xa0]\",\n        \"fmul dword [edi]\",\n        \"faddp\",\n        \"fadd dword [esp + 0x88]\",\n        \"fstp dword [esp + 0xd0]\",\n        \"fld dword [esp + 0xa8]\",\n        \"fmul dword [eax + esi*0x1 + 0x4]\",\n        \"fld dword [esp + 0xa4]\",\n        \"fmul dword [eax + esi*0x1]\",\n        \"faddp\",\n        \"fld dword [esp + 0xac]\",\n        \"fmul dword [edi]\",\n        \"faddp\",\n        \"fadd dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0xd4]\",\n        \"fld dword [esp + 0xb4]\",\n        \"fmul dword [eax + esi*0x1 + 0x4]\",\n        \"fld dword [esp + 0xb0]\",\n        \"fmul dword [eax + esi*0x1]\",\n        \"mov esi,edi\",\n        \"faddp\",\n        \"fld dword [esp + 0xb8]\",\n        \"fmul dword [esi]\",\n        \"mov esi,dword [esp + 0x38]\",\n        \"lea edi,[esi + eax*0x1 + 0x8]\",\n        \"mov dword [esp + 0x10],edi\",\n        \"faddp\",\n        \"fadd dword [esp + 0x90]\",\n        \"fstp dword [esp + 0xd8]\",\n        \"fld dword [esp + 0x64]\",\n        \"fld st0\",\n        \"fmul dword [eax + ebx*0x1]\",\n        \"fld dword [esp + 0x68]\",\n        \"fld st0\",\n        \"fmul dword [eax + ebx*0x1 + 0x4]\",\n        \"faddp st2,st0\",\n        \"fld dword [esp + 0x6c]\",\n        \"fld st0\",\n        \"fmul dword [eax + ebx*0x1 + 0x8]\",\n        \"faddp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [esp + 0xe8]\",\n        \"fld dword [esp + 0x70]\",\n        \"fld st0\",\n        \"fmul dword [eax + ebx*0x1]\",\n        \"fld dword [esp + 0x74]\",\n        \"fld st0\",\n        \"fmul dword [eax + ebx*0x1 + 0x4]\",\n        \"faddp st2,st0\",\n        \"fld dword [esp + 0x78]\",\n        \"fmul dword [eax + ebx*0x1 + 0x8]\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0xec]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fmul dword [eax + ebx*0x1]\",\n        \"fld dword [esp + 0x80]\",\n        \"fmul dword [eax + ebx*0x1 + 0x4]\",\n        \"faddp\",\n        \"fld dword [esp + 0x84]\",\n        \"fmul dword [eax + ebx*0x1 + 0x8]\",\n        \"faddp\",\n        \"fstp dword [esp + 0xf0]\",\n        \"fld st2\",\n        \"fmul dword [esi + eax*0x1 + 0x4]\",\n        \"fld st5\",\n        \"fmul dword [esi + eax*0x1]\",\n        \"faddp\",\n        \"fld st4\",\n        \"fmul dword [edi]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld st0\",\n        \"fmul dword [esi + eax*0x1 + 0x4]\",\n        \"fld st2\",\n        \"fmul dword [esi + eax*0x1]\",\n        \"faddp\",\n        \"fld dword [esp + 0x78]\",\n        \"fmul dword [edi]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x80]\",\n        \"fmul dword [esi + eax*0x1 + 0x4]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fmul dword [esi + eax*0x1]\",\n        \"mov esi,edi\",\n        \"faddp\",\n        \"fld dword [esp + 0x84]\",\n        \"fmul dword [esi]\",\n        \"mov esi,dword [esp + 0x20]\",\n        \"lea edi,[esi + eax*0x1 + 0x4]\",\n        \"mov dword [esp + 0x10],edi\",\n        \"faddp\",\n        \"lea edi,[esi + eax*0x1 + 0x8]\",\n        \"mov dword [esp + 0xbc],edi\",\n        \"mov edi,dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esi + eax*0x1]\",\n        \"fmulp st5\",\n        \"fld dword [edi]\",\n        \"mov edi,dword [esp + 0xbc]\",\n        \"fmulp st3\",\n        \"fxch st4\",\n        \"faddp st2,st0\",\n        \"fld dword [edi]\",\n        \"mov edi,dword [esp + 0x10]\",\n        \"fmulp st3\",\n        \"fxch\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fmul dword [esi + eax*0x1]\",\n        \"fld dword [edi]\",\n        \"mov edi,dword [esp + 0xbc]\",\n        \"fmulp st2\",\n        \"faddp\",\n        \"fld dword [esp + 0x78]\",\n        \"fmul dword [edi]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fmul dword [esi + eax*0x1]\",\n        \"mov eax,dword [esp + 0x10]\",\n        \"fld dword [esp + 0x80]\",\n        \"fmul dword [eax]\",\n        \"mov eax,dword [esp + 0x1d4]\",\n        \"faddp\",\n        \"fld dword [esp + 0x84]\",\n        \"fmul dword [edi]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0xd0]\",\n        \"fld dword [esp + 0x24]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0xc0]\",\n        \"fld dword [esp + 0xd4]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0xc4]\",\n        \"fld dword [esp + 0xd8]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0xc8]\",\n        \"fld dword [esp + 0xc0]\",\n        \"fadd dword [ecx + eax*0x1]\",\n        \"fstp dword [ecx + eax*0x1]\",\n        \"add edx,0x1\",\n        \"cmp edx,dword [esp + 0x1c]\",\n        \"fld dword [esp + 0xc4]\",\n        \"fadd dword [ecx + eax*0x1 + 0x4]\",\n        \"fstp dword [ecx + eax*0x1 + 0x4]\",\n        \"lea eax,[ecx + eax*0x1 + 0x8]\",\n        \"fld dword [eax]\",\n        \"fadd dword [esp + 0xc8]\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [esp + 0x1dc]\",\n        \"fld dword [esp + 0xe8]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0xdc]\",\n        \"fld dword [esp + 0xec]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0xe0]\",\n        \"fld dword [esp + 0xf0]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0xe4]\",\n        \"fld dword [esp + 0xdc]\",\n        \"fadd dword [ecx + ebp*0x1]\",\n        \"fstp dword [ecx + ebp*0x1]\",\n        \"fld dword [esp + 0xe0]\",\n        \"fadd dword [ecx + ebp*0x1 + 0x4]\",\n        \"fstp dword [ecx + ebp*0x1 + 0x4]\",\n        \"fld dword [esp + 0xe4]\",\n        \"fadd dword [ecx + ebp*0x1 + 0x8]\",\n        \"fstp dword [ecx + ebp*0x1 + 0x8]\",\n        \"fld dword [esp + 0x58]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [esp + 0x60]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [ecx + eax*0x1]\",\n        \"fadd dword [esp + 0x3c]\",\n        \"fstp dword [ecx + eax*0x1]\",\n        \"fld dword [esp + 0x40]\",\n        \"fadd dword [ecx + eax*0x1 + 0x4]\",\n        \"fstp dword [ecx + eax*0x1 + 0x4]\",\n        \"lea eax,[ecx + eax*0x1 + 0x8]\",\n        \"fld dword [esp + 0x44]\",\n        \"fadd dword [eax]\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [esp + 0x1e0]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x50]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x30]\",\n        \"fmul dword [esp + 0x54]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [ecx + eax*0x1]\",\n        \"fadd dword [esp + 0x2c]\",\n        \"fstp dword [ecx + eax*0x1]\",\n        \"fld dword [esp + 0x30]\",\n        \"fadd dword [ecx + eax*0x1 + 0x4]\",\n        \"fstp dword [ecx + eax*0x1 + 0x4]\",\n        \"lea ecx,[ecx + eax*0x1 + 0x8]\",\n        \"fld dword [esp + 0x34]\",\n        \"fadd dword [ecx]\",\n        \"fstp dword [ecx]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add w20, w10, w5, lsl #3\",\n        \"ldrh w4, [x20]\",\n        \"add w20, w10, w5, lsl #3\",\n        \"ldr s2, [x20, #4]\",\n        \"str s2, [x8, #36]\",\n        \"ldr w10, [x8, #456]\",\n        \"ldr s2, [x8, #156]\",\n        \"fcvt d2, s2\",\n        \"uxth w4, w4\",\n        \"mov x7, x4\",\n        \"ldr w20, [x8, #484]\",\n        \"mul w7, w7, w20\",\n        \"add w4, w4, w4, lsl #1\",\n        \"add w4, w4, w4\",\n        \"add w4, w4, w4\",\n        \"add w20, w4, #0x8 (8)\",\n        \"add w11, w20, w10\",\n        \"str w11, [x8, #16]\",\n        \"add w20, w4, w10\",\n        \"ldr s3, [x20, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr s3, [x8, #152]\",\n        \"fcvt d3, s3\",\n        \"add w20, w4, w10\",\n        \"ldr s4, [x20]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr s3, [x8, #160]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x11]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr s3, [x8, #136]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #208]\",\n        \"ldr s2, [x8, #168]\",\n        \"fcvt d2, s2\",\n        \"add w20, w4, w10\",\n        \"ldr s3, [x20, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr s3, [x8, #164]\",\n        \"fcvt d3, s3\",\n        \"add w20, w4, w10\",\n        \"ldr s4, [x20]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr s3, [x8, #172]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x11]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr s3, [x8, #140]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #212]\",\n        \"ldr s2, [x8, #180]\",\n        \"fcvt d2, s2\",\n        \"add w20, w4, w10\",\n        \"ldr s3, [x20, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr s3, [x8, #176]\",\n        \"fcvt d3, s3\",\n        \"add w20, w4, w10\",\n        \"ldr s4, [x20]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"mov x10, x11\",\n        \"fadd d2, d2, d3\",\n        \"ldr s3, [x8, #184]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x10]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"ldr w10, [x8, #56]\",\n        \"add w20, w10, #0x8 (8)\",\n        \"add w11, w20, w4\",\n        \"str w11, [x8, #16]\",\n        \"fadd d2, d2, d3\",\n        \"ldr s3, [x8, #144]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #216]\",\n        \"ldr s2, [x8, #100]\",\n        \"fcvt d2, s2\",\n        \"add w20, w4, w6\",\n        \"ldr s3, [x20]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d2, d3\",\n        \"ldr s4, [x8, #104]\",\n        \"fcvt d4, s4\",\n        \"add w20, w4, w6\",\n        \"ldr s5, [x20, #4]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d4, d5\",\n        \"fadd d3, d3, d5\",\n        \"ldr s5, [x8, #108]\",\n        \"fcvt d5, s5\",\n        \"add w20, w4, w6\",\n        \"ldr s6, [x20, #8]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d5, d6\",\n        \"fadd d3, d3, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #232]\",\n        \"ldr s3, [x8, #112]\",\n        \"fcvt d3, s3\",\n        \"add w20, w4, w6\",\n        \"ldr s6, [x20]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d3, d6\",\n        \"ldr s7, [x8, #116]\",\n        \"fcvt d7, s7\",\n        \"add w20, w4, w6\",\n        \"ldr s8, [x20, #4]\",\n        \"fcvt d8, s8\",\n        \"fmul d8, d7, d8\",\n        \"fadd d6, d6, d8\",\n        \"ldr s8, [x8, #120]\",\n        \"fcvt d8, s8\",\n        \"add w20, w4, w6\",\n        \"ldr s9, [x20, #8]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"fadd d6, d6, d8\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #236]\",\n        \"ldr s6, [x8, #124]\",\n        \"fcvt d6, s6\",\n        \"add w20, w4, w6\",\n        \"ldr s8, [x20]\",\n        \"fcvt d8, s8\",\n        \"fmul d6, d6, d8\",\n        \"ldr s8, [x8, #128]\",\n        \"fcvt d8, s8\",\n        \"add w20, w4, w6\",\n        \"ldr s9, [x20, #4]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"fadd d6, d6, d8\",\n        \"ldr s8, [x8, #132]\",\n        \"fcvt d8, s8\",\n        \"add w20, w4, w6\",\n        \"ldr s9, [x20, #8]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"fadd d6, d6, d8\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #240]\",\n        \"add w20, w10, w4\",\n        \"ldr s6, [x20, #4]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d4, d6\",\n        \"add w20, w10, w4\",\n        \"ldr s8, [x20]\",\n        \"fcvt d8, s8\",\n        \"fmul d8, d2, d8\",\n        \"fadd d6, d6, d8\",\n        \"ldr s8, [x11]\",\n        \"fcvt d8, s8\",\n        \"fmul d8, d5, d8\",\n        \"fadd d6, d6, d8\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #88]\",\n        \"add w20, w10, w4\",\n        \"ldr s6, [x20, #4]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d7, d6\",\n        \"add w20, w10, w4\",\n        \"ldr s8, [x20]\",\n        \"fcvt d8, s8\",\n        \"fmul d8, d3, d8\",\n        \"fadd d6, d6, d8\",\n        \"ldr s8, [x8, #120]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x11]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"fadd d6, d6, d8\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #92]\",\n        \"ldr s6, [x8, #128]\",\n        \"fcvt d6, s6\",\n        \"add w20, w10, w4\",\n        \"ldr s8, [x20, #4]\",\n        \"fcvt d8, s8\",\n        \"fmul d6, d6, d8\",\n        \"ldr s8, [x8, #124]\",\n        \"fcvt d8, s8\",\n        \"add w20, w10, w4\",\n        \"ldr s9, [x20]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"mov x10, x11\",\n        \"fadd d6, d6, d8\",\n        \"ldr s8, [x8, #132]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x10]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"ldr w10, [x8, #32]\",\n        \"add w20, w10, #0x4 (4)\",\n        \"add w11, w20, w4\",\n        \"str w11, [x8, #16]\",\n        \"fadd d6, d6, d8\",\n        \"add w20, w10, #0x8 (8)\",\n        \"add w11, w20, w4\",\n        \"str w11, [x8, #188]\",\n        \"ldr w11, [x8, #16]\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #96]\",\n        \"add w20, w10, w4\",\n        \"ldr s6, [x20]\",\n        \"fcvt d6, s6\",\n        \"fmul d2, d2, d6\",\n        \"ldr s6, [x11]\",\n        \"fcvt d6, s6\",\n        \"ldr w11, [x8, #188]\",\n        \"fmul d4, d4, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"fadd d2, d4, d2\",\n        \"ldr s4, [x11]\",\n        \"fcvt d4, s4\",\n        \"ldr w11, [x8, #16]\",\n        \"fmul d4, d5, d4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fadd d2, d4, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #76]\",\n        \"add w20, w10, w4\",\n        \"ldr s2, [x20]\",\n        \"fcvt d2, s2\",\n        \"fmul d2, d3, d2\",\n        \"ldr s3, [x11]\",\n        \"fcvt d3, s3\",\n        \"ldr w11, [x8, #188]\",\n        \"fmul d3, d7, d3\",\n        \"fadd d2, d3, d2\",\n        \"ldr s3, [x8, #120]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x11]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #80]\",\n        \"ldr s2, [x8, #124]\",\n        \"fcvt d2, s2\",\n        \"add w20, w10, w4\",\n        \"ldr s3, [x20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x8, #16]\",\n        \"ldr s3, [x8, #128]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x4]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"ldr w4, [x8, #468]\",\n        \"fadd d2, d2, d3\",\n        \"ldr s3, [x8, #132]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x11]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #84]\",\n        \"ldr s2, [x8, #208]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #36]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #192]\",\n        \"ldr s2, [x8, #212]\",\n        \"fcvt d2, s2\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #196]\",\n        \"ldr s2, [x8, #216]\",\n        \"fcvt d2, s2\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #200]\",\n        \"ldr s2, [x8, #192]\",\n        \"fcvt d2, s2\",\n        \"add w20, w7, w4\",\n        \"ldr s4, [x20]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"add w20, w7, w4\",\n        \"fcvt s2, d2\",\n        \"str s2, [x20]\",\n        \"add w5, w5, #0x1 (1)\",\n        \"ldr w20, [x8, #28]\",\n        \"eor x27, x5, x20\",\n        \"subs w26, w5, w20\",\n        \"ldr s2, [x8, #196]\",\n        \"fcvt d2, s2\",\n        \"add w20, w7, w4\",\n        \"ldr s4, [x20, #4]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"add w20, w7, w4\",\n        \"fcvt s2, d2\",\n        \"str s2, [x20, #4]\",\n        \"add w20, w7, #0x8 (8)\",\n        \"add w4, w20, w4\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr s4, [x8, #200]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x8, #476]\",\n        \"ldr s2, [x8, #232]\",\n        \"fcvt d2, s2\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #220]\",\n        \"ldr s2, [x8, #236]\",\n        \"fcvt d2, s2\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #224]\",\n        \"ldr s2, [x8, #240]\",\n        \"fcvt d2, s2\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #228]\",\n        \"ldr s2, [x8, #220]\",\n        \"fcvt d2, s2\",\n        \"add w20, w7, w9\",\n        \"ldr s4, [x20]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"add w20, w7, w9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x20]\",\n        \"ldr s2, [x8, #224]\",\n        \"fcvt d2, s2\",\n        \"add w20, w7, w9\",\n        \"ldr s4, [x20, #4]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"add w20, w7, w9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x20, #4]\",\n        \"ldr s2, [x8, #228]\",\n        \"fcvt d2, s2\",\n        \"add w20, w7, w9\",\n        \"ldr s4, [x20, #8]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"add w20, w7, w9\",\n        \"fcvt s2, d2\",\n        \"str s2, [x20, #8]\",\n        \"ldr s2, [x8, #88]\",\n        \"fcvt d2, s2\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #60]\",\n        \"ldr s2, [x8, #92]\",\n        \"fcvt d2, s2\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #64]\",\n        \"ldr s2, [x8, #96]\",\n        \"fcvt d2, s2\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #68]\",\n        \"add w20, w7, w4\",\n        \"ldr s2, [x20]\",\n        \"fcvt d2, s2\",\n        \"ldr s4, [x8, #60]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"add w20, w7, w4\",\n        \"fcvt s2, d2\",\n        \"str s2, [x20]\",\n        \"ldr s2, [x8, #64]\",\n        \"fcvt d2, s2\",\n        \"add w20, w7, w4\",\n        \"ldr s4, [x20, #4]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"add w20, w7, w4\",\n        \"fcvt s2, d2\",\n        \"str s2, [x20, #4]\",\n        \"add w20, w7, #0x8 (8)\",\n        \"add w4, w20, w4\",\n        \"ldr s2, [x8, #68]\",\n        \"fcvt d2, s2\",\n        \"ldr s4, [x4]\",\n        \"fcvt d4, s4\",\n        \"fadd d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x8, #480]\",\n        \"ldr s2, [x8, #76]\",\n        \"fcvt d2, s2\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #80]\",\n        \"fcvt d2, s2\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #84]\",\n        \"fcvt d2, s2\",\n        \"fmul d2, d3, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #52]\",\n        \"add w20, w7, w4\",\n        \"ldr s2, [x20]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #44]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"add w20, w7, w4\",\n        \"fcvt s2, d2\",\n        \"str s2, [x20]\",\n        \"ldr s2, [x8, #48]\",\n        \"fcvt d2, s2\",\n        \"add w20, w7, w4\",\n        \"ldr s3, [x20, #4]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"add w20, w7, w4\",\n        \"fcvt s2, d2\",\n        \"str s2, [x20, #4]\",\n        \"add w20, w7, #0x8 (8)\",\n        \"add w7, w20, w4\",\n        \"ldr s2, [x8, #52]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x7]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xfefe\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block9\": {\n      \"x86InstructionCount\": 260,\n      \"ExpectedInstructionCount\": 29,\n      \"x86Insts\": [\n        \"fld dword [edi]\",\n        \"fmul st0\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd qword [0x00a2f928]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"call 0x00982c30\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"lea ecx,[esp + 0x10]\",\n        \"fld1\",\n        \"push ecx\",\n        \"fdivrp\",\n        \"lea edx,[esp + 0x50]\",\n        \"push edx\",\n        \"lea ecx,[esp + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [edi]\",\n        \"fchs\",\n        \"fld dword [esp + 0x10]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0x40]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x70]\",\n        \"fmul dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x30]\",\n        \"fld dword [esp + 0x10]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x64]\",\n        \"fmul dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [esp + 0x6c]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x64]\",\n        \"fadd dword [esp + 0x70]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esp + 0x68]\",\n        \"fadd dword [esp + 0x74]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"call 0x00716e00\",\n        \"mov ecx,dword [eax]\",\n        \"mov dword [esi + 0x20],ecx\",\n        \"mov edx,dword [eax + 0x4]\",\n        \"mov dword [esi + 0x24],edx\",\n        \"mov ecx,dword [eax + 0x8]\",\n        \"mov dword [esi + 0x28],ecx\",\n        \"mov edx,dword [eax + 0xc]\",\n        \"mov dword [esi + 0x2c],edx\",\n        \"fld dword [edi + 0x4]\",\n        \"fmul st0\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd qword [0x00a2f928]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"call 0x00982c30\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"fld1\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [edi + 0x4]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x8]\",\n        \"fchs\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0x34]\",\n        \"fld dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fmul dword [esp + 0x3c]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x68]\",\n        \"fmul dword [esp + 0x30]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0x64]\",\n        \"fadd dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x74]\",\n        \"mov eax,dword [esp + 0x74]\",\n        \"fld dword [esp + 0x68]\",\n        \"mov dword [esp + 0x4c],eax\",\n        \"fadd dword [esp + 0x5c]\",\n        \"lea eax,[esp + 0x10]\",\n        \"push eax\",\n        \"fstp dword [esp + 0x7c]\",\n        \"mov ecx,dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x70]\",\n        \"mov dword [esp + 0x54],ecx\",\n        \"fadd dword [esp + 0x64]\",\n        \"lea ecx,[esp + 0x50]\",\n        \"push ecx\",\n        \"lea ecx,[esp + 0x7c]\",\n        \"fstp dword [esp + 0x84]\",\n        \"mov edx,dword [esp + 0x84]\",\n        \"mov dword [esp + 0x5c],edx\",\n        \"call 0x00716e00\",\n        \"mov edx,dword [eax]\",\n        \"mov dword [esi + 0x30],edx\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov dword [esi + 0x34],ecx\",\n        \"mov edx,dword [eax + 0x8]\",\n        \"mov dword [esi + 0x38],edx\",\n        \"mov eax,dword [eax + 0xc]\",\n        \"mov dword [esi + 0x3c],eax\",\n        \"fld dword [edi + 0x8]\",\n        \"fmul st0\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd qword [0x00a2f928]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"call 0x00982c30\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"fld1\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fmul dword [edi + 0x8]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fchs\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0x40]\",\n        \"fld dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x44]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x68]\",\n        \"fmul dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x78]\",\n        \"fmul dword [esp + 0x30]\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x74]\",\n        \"fadd dword [esp + 0x64]\",\n        \"fstp dword [esp + 0x58]\",\n        \"mov ecx,dword [esp + 0x58]\",\n        \"fld dword [esp + 0x78]\",\n        \"mov dword [esp + 0x4c],ecx\",\n        \"fadd dword [esp + 0x68]\",\n        \"lea ecx,[esp + 0x10]\",\n        \"push ecx\",\n        \"lea ecx,[esp + 0x78]\",\n        \"fstp dword [esp + 0x60]\",\n        \"mov edx,dword [esp + 0x60]\",\n        \"fld dword [esp + 0x80]\",\n        \"mov dword [esp + 0x54],edx\",\n        \"fadd dword [esp + 0x70]\",\n        \"lea edx,[esp + 0x50]\",\n        \"push edx\",\n        \"fstp dword [esp + 0x68]\",\n        \"mov eax,dword [esp + 0x68]\",\n        \"mov dword [esp + 0x5c],eax\",\n        \"call 0x00716e00\",\n        \"mov ecx,dword [eax]\",\n        \"mov dword [esi + 0x40],ecx\",\n        \"mov edx,dword [eax + 0x4]\",\n        \"mov dword [esi + 0x44],edx\",\n        \"mov ecx,dword [eax + 0x8]\",\n        \"mov dword [esi + 0x48],ecx\",\n        \"mov edx,dword [eax + 0xc]\",\n        \"mov dword [esi + 0x4c],edx\",\n        \"fld dword [edi + 0xc]\",\n        \"fmul st0\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd qword [0x00a2f928]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"call 0x00982c30\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0xc]\",\n        \"fld1\",\n        \"fdivrp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [edi + 0xc]\",\n        \"fchs\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x40]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x44]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x68]\",\n        \"fmul dword [esp + 0x48]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0x28]\",\n        \"fld dword [esp + 0x8]\",\n        \"fld st0\",\n        \"fmulp st2\",\n        \"fxch\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fstp dword [esp + 0x78]\",\n        \"fmul dword [esp + 0x30]\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x74]\",\n        \"fadd dword [esp + 0x64]\",\n        \"fstp dword [esp + 0x58]\",\n        \"mov eax,dword [esp + 0x58]\",\n        \"fld dword [esp + 0x78]\",\n        \"mov dword [esp + 0x4c],eax\",\n        \"fadd dword [esp + 0x68]\",\n        \"lea eax,[esp + 0x10]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"mov ecx,dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x7c]\",\n        \"mov dword [esp + 0x50],ecx\",\n        \"fadd dword [esp + 0x6c]\",\n        \"lea ecx,[esp + 0x4c]\",\n        \"fstp dword [esp + 0x60]\",\n        \"mov edx,dword [esp + 0x60]\",\n        \"mov dword [esp + 0x54],edx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x11]\",\n        \"fcvt d2, s2\",\n        \"fmul d2, d2, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x8, #12]\",\n        \"fcvt d2, s2\",\n        \"mov w20, #0xf928\",\n        \"movk w20, #0xa2, lsl #16\",\n        \"ldr d3, [x20]\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x8, #12]\",\n        \"fcvt d2, s2\",\n        \"mov w20, #0x1f\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add w21, w21, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    },\n    \"Block10\": {\n      \"x86InstructionCount\": 206,\n      \"ExpectedInstructionCount\": 117,\n      \"x86Insts\": [\n        \"fld dword [0x00b42a74]\",\n        \"push ecx\",\n        \"fstp dword [0x00b42a20]\",\n        \"lea ecx,[esp + 0x48]\",\n        \"fld dword [0x00b42a78]\",\n        \"fstp dword [0x00b42a24]\",\n        \"fld dword [0x00b42a7c]\",\n        \"fstp dword [0x00b42a28]\",\n        \"fld dword [0x00b42a68]\",\n        \"fstp dword [0x00b42a2c]\",\n        \"fld dword [0x00b42a6c]\",\n        \"fstp dword [0x00b42a30]\",\n        \"fld dword [0x00b42a70]\",\n        \"fstp dword [0x00b42a34]\",\n        \"fld dword [0x00b42a5c]\",\n        \"fstp dword [0x00b42a38]\",\n        \"fld dword [0x00b42a60]\",\n        \"fstp dword [0x00b42a3c]\",\n        \"fld dword [0x00b42a64]\",\n        \"fstp dword [0x00b42a40]\",\n        \"fld dword [0x00b42a50]\",\n        \"fstp dword [0x00b42a44]\",\n        \"fld dword [0x00b42a54]\",\n        \"fstp dword [0x00b42a48]\",\n        \"fld dword [0x00b42a58]\",\n        \"fstp dword [0x00b42a4c]\",\n        \"fst dword [esp + 0x48]\",\n        \"fst dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fst dword [esp + 0x4c]\",\n        \"fst dword [esp + 0x50]\",\n        \"fst dword [esp + 0x54]\",\n        \"fst dword [esp + 0x5c]\",\n        \"fst dword [esp + 0x60]\",\n        \"fstp dword [esp + 0x64]\",\n        \"fld dword [esp + 0x4]\",\n        \"fstp dword [esp]\",\n        \"call 0x00793aa0\",\n        \"fld dword [esp + 0x50]\",\n        \"fld dword [0x00b42a78]\",\n        \"fst qword [esp + 0x28]\",\n        \"fld dword [0x00b42a74]\",\n        \"fst qword [esp + 0x30]\",\n        \"fld dword [esp + 0x44]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fld dword [0x00b42a7c]\",\n        \"fst qword [esp + 0x10]\",\n        \"fld st2\",\n        \"fmul st4\",\n        \"fld st6\",\n        \"fmul st6\",\n        \"faddp\",\n        \"fld st2\",\n        \"fmulp st2\",\n        \"faddp\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [esp + 0x54]\",\n        \"fld dword [esp + 0x48]\",\n        \"fld dword [esp + 0x60]\",\n        \"fstp qword [esp]\",\n        \"fld st0\",\n        \"fmulp st5\",\n        \"fld st1\",\n        \"fmulp st6\",\n        \"fxch st4\",\n        \"faddp st5,st0\",\n        \"fld qword [esp]\",\n        \"fmul qword [esp + 0x10]\",\n        \"faddp st5,st0\",\n        \"fxch st4\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x58]\",\n        \"fst qword [esp + 0x20]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fst qword [esp + 0x18]\",\n        \"fld dword [esp + 0x64]\",\n        \"fstp qword [esp + 0x8]\",\n        \"fmul qword [esp + 0x30]\",\n        \"fxch\",\n        \"fmul qword [esp + 0x28]\",\n        \"faddp\",\n        \"fld qword [esp + 0x8]\",\n        \"mov eax,dword [esp + 0x38]\",\n        \"fmul qword [esp + 0x10]\",\n        \"mov ecx,dword [esp + 0x3c]\",\n        \"mov [0x00b2ba7c],eax\",\n        \"mov dword [0x00b2ba80],ecx\",\n        \"faddp\",\n        \"fstp dword [esp + 0x40]\",\n        \"mov edx,dword [esp + 0x40]\",\n        \"fld dword [0x00b42a6c]\",\n        \"mov dword [0x00b2ba84],edx\",\n        \"fst qword [esp + 0x30]\",\n        \"fld dword [0x00b42a68]\",\n        \"fst qword [esp + 0x28]\",\n        \"fld dword [0x00b42a70]\",\n        \"fstp qword [esp + 0x10]\",\n        \"fmul st3\",\n        \"fld st6\",\n        \"fmulp st2\",\n        \"faddp\",\n        \"fld st1\",\n        \"fmul qword [esp + 0x10]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x38]\",\n        \"mov eax,dword [esp + 0x38]\",\n        \"fld st2\",\n        \"mov [0x00b2ba88],eax\",\n        \"fmul qword [esp + 0x28]\",\n        \"fld st4\",\n        \"fmul qword [esp + 0x30]\",\n        \"faddp\",\n        \"fld qword [esp]\",\n        \"fmul qword [esp + 0x10]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x3c]\",\n        \"mov ecx,dword [esp + 0x3c]\",\n        \"fld qword [esp + 0x18]\",\n        \"mov dword [0x00b2ba8c],ecx\",\n        \"fmul qword [esp + 0x28]\",\n        \"fld qword [esp + 0x20]\",\n        \"fmul qword [esp + 0x30]\",\n        \"faddp\",\n        \"fld qword [esp + 0x8]\",\n        \"fmul qword [esp + 0x10]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x40]\",\n        \"mov edx,dword [esp + 0x40]\",\n        \"fld dword [0x00b42a60]\",\n        \"mov dword [0x00b2ba90],edx\",\n        \"fst qword [esp + 0x28]\",\n        \"fld dword [0x00b42a5c]\",\n        \"fst qword [esp + 0x30]\",\n        \"fld dword [0x00b42a64]\",\n        \"fstp qword [esp + 0x10]\",\n        \"fmul st3\",\n        \"fld st6\",\n        \"fmulp st2\",\n        \"faddp\",\n        \"fld st1\",\n        \"fmul qword [esp + 0x10]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x38]\",\n        \"mov eax,dword [esp + 0x38]\",\n        \"fld st2\",\n        \"fmul qword [esp + 0x30]\",\n        \"fld st4\",\n        \"fmul qword [esp + 0x28]\",\n        \"faddp\",\n        \"fld qword [esp]\",\n        \"fmul qword [esp + 0x10]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld qword [esp + 0x18]\",\n        \"fmul qword [esp + 0x30]\",\n        \"fld qword [esp + 0x20]\",\n        \"fmul qword [esp + 0x28]\",\n        \"faddp\",\n        \"fld qword [esp + 0x8]\",\n        \"fmul qword [esp + 0x10]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [0x00b42a54]\",\n        \"mov ecx,dword [esp + 0x3c]\",\n        \"fld dword [0x00b42a50]\",\n        \"mov edx,dword [esp + 0x40]\",\n        \"fld dword [0x00b42a58]\",\n        \"mov [0x00b2ba94],eax\",\n        \"fxch st4\",\n        \"mov dword [0x00b2ba98],ecx\",\n        \"fmul st1\",\n        \"mov dword [0x00b2ba9c],edx\",\n        \"fxch st7\",\n        \"fmul st2\",\n        \"faddp st7,st0\",\n        \"fxch st2\",\n        \"fmul st3\",\n        \"faddp st6,st0\",\n        \"fxch st5\",\n        \"fstp dword [esp + 0x38]\",\n        \"mov eax,dword [esp + 0x38]\",\n        \"mov [0x00b2baa0],eax\",\n        \"fmul st2\",\n        \"fxch st3\",\n        \"fmul st4\",\n        \"faddp st2,st0\",\n        \"fld qword [esp]\",\n        \"fmul st1\",\n        \"faddp st2,st0\",\n        \"fxch\",\n        \"fstp dword [esp + 0x3c]\",\n        \"mov ecx,dword [esp + 0x3c]\",\n        \"fld qword [esp + 0x18]\",\n        \"mov dword [0x00b2baa4],ecx\",\n        \"fmulp st2\",\n        \"fld qword [esp + 0x20]\",\n        \"fmulp st3\",\n        \"fxch\",\n        \"faddp st2,st0\",\n        \"fmul qword [esp + 0x8]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x40]\",\n        \"mov edx,dword [esp + 0x40]\",\n        \"mov dword [0x00b2baa8],edx\",\n        \"mov esp,ebp\",\n        \"pop ebp\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x2a74\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"str w7, [x8, #-4]!\",\n        \"mov w20, #0x2a20\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"add w7, w8, #0x48 (72)\",\n        \"mov w20, #0x2a78\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a24\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a7c\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a28\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a68\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a2c\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a6c\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a30\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a70\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a34\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a5c\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a38\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a60\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a3c\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a64\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a40\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a50\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a44\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a54\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a48\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"mov w20, #0x2a58\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"ldr s2, [x20]\",\n        \"mov w20, #0x2a4c\",\n        \"movk w20, #0xb4, lsl #16\",\n        \"str s2, [x20]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fcvt s3, d2\",\n        \"str s3, [x8, #72]\",\n        \"fcvt s3, d2\",\n        \"str s3, [x8, #88]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #104]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fcvt s3, d2\",\n        \"str s3, [x8, #76]\",\n        \"fcvt s3, d2\",\n        \"str s3, [x8, #80]\",\n        \"fcvt s3, d2\",\n        \"str s3, [x8, #84]\",\n        \"fcvt s3, d2\",\n        \"str s3, [x8, #92]\",\n        \"fcvt s3, d2\",\n        \"str s3, [x8, #96]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #100]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldr s2, [x8, #4]\",\n        \"fcvt d2, s2\",\n        \"fcvt s3, d2\",\n        \"str s3, [x8]\",\n        \"mov w22, #0xc5\",\n        \"movk w22, #0x1, lsl #16\",\n        \"str w22, [x8, #-4]!\",\n        \"strb w20, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w23, #0x8\",\n        \"sub w20, w23, w20\",\n        \"mov w23, #0xe0e0\",\n        \"lsr w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/x87_f64-Psychonauts.json",
    "content": "{\n  \"Features\": {\n    \"Env\": {\n      \"FEX_X87REDUCEDPRECISION\": \"1\"\n    },\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"Block1\": {\n      \"x86InstructionCount\": 520,\n      \"ExpectedInstructionCount\": 938,\n      \"x86Insts\": [\n        \"sub esp,0x88\",\n        \"fld dword [ecx + 0x4]\",\n        \"mov edx,dword [ecx + 0x18]\",\n        \"fld dword [ecx + 0x10]\",\n        \"mov dword [esp + 0x14],edx\",\n        \"fld dword [ecx + 0x14]\",\n        \"mov edx,dword [ecx + 0x1c]\",\n        \"fld dword [ecx + 0x20]\",\n        \"mov dword [esp + 0x10],edx\",\n        \"fld dword [ecx + 0x24]\",\n        \"fld dword [eax]\",\n        \"fsub dword [eax + 0x44]\",\n        \"fld dword [eax + 0x40]\",\n        \"fadd dword [eax + 0x4]\",\n        \"fld dword [eax + 0x20]\",\n        \"fsub dword [eax + 0x64]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x24]\",\n        \"fadd dword [eax + 0x60]\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp]\",\n        \"fmul st7\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fmul st7\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x80]\",\n        \"fld dword [esp]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x78]\",\n        \"fxch\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [eax + 0x44]\",\n        \"fadd dword [eax]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsub dword [eax + 0x40]\",\n        \"fld dword [eax + 0x64]\",\n        \"fadd dword [eax + 0x20]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x24]\",\n        \"fsub dword [eax + 0x60]\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp]\",\n        \"fmul st7\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fmul st7\",\n        \"fstp dword [esp]\",\n        \"fld st1\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x64]\",\n        \"fstp st0\",\n        \"fld dword [eax + 0x8]\",\n        \"fsub dword [eax + 0x4c]\",\n        \"fld dword [eax + 0xc]\",\n        \"fadd dword [eax + 0x48]\",\n        \"fstp dword [esp]\",\n        \"fld st0\",\n        \"fmul st5\",\n        \"fld dword [esp]\",\n        \"fmul st5\",\n        \"fsubp\",\n        \"fstp dword [esp + 0xc]\",\n        \"fmul st3\",\n        \"fld dword [esp]\",\n        \"fmul st5\",\n        \"faddp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x28]\",\n        \"fsub dword [eax + 0x6c]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fadd dword [eax + 0x68]\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x10]\",\n        \"fmul st1\",\n        \"fld dword [esp]\",\n        \"fmul dword [esp + 0x14]\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp]\",\n        \"fmul dword [esp + 0x10]\",\n        \"fxch\",\n        \"fmul dword [esp + 0x14]\",\n        \"faddp\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [eax + 0x4c]\",\n        \"fadd dword [eax + 0x8]\",\n        \"fld dword [eax + 0xc]\",\n        \"fsub dword [eax + 0x48]\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x14]\",\n        \"fmul st1\",\n        \"fld dword [esp]\",\n        \"fmul dword [esp + 0x10]\",\n        \"fsubp\",\n        \"fstp dword [esp + 0xc]\",\n        \"fmul dword [esp + 0x10]\",\n        \"fld dword [esp]\",\n        \"fmul dword [esp + 0x14]\",\n        \"faddp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x6c]\",\n        \"fadd dword [eax + 0x28]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fsub dword [eax + 0x68]\",\n        \"fst dword [esp]\",\n        \"fmul st4\",\n        \"fld st1\",\n        \"fmul st6\",\n        \"faddp\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp]\",\n        \"fmul st5\",\n        \"fxch\",\n        \"fmul st4\",\n        \"fsubp\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x84]\",\n        \"fld dword [eax + 0x10]\",\n        \"fsub dword [eax + 0x54]\",\n        \"fld dword [eax + 0x14]\",\n        \"fadd dword [eax + 0x50]\",\n        \"fstp dword [esp]\",\n        \"fld st0\",\n        \"fmul st3\",\n        \"fld dword [esp]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [esp + 0xc]\",\n        \"fmul st1\",\n        \"fld dword [esp]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x30]\",\n        \"fsub dword [eax + 0x74]\",\n        \"fld dword [eax + 0x34]\",\n        \"fadd dword [eax + 0x70]\",\n        \"fstp dword [esp]\",\n        \"fld st0\",\n        \"fmul st2\",\n        \"fld dword [esp]\",\n        \"fmul st4\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp]\",\n        \"fmul st2\",\n        \"fxch\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [eax + 0x54]\",\n        \"fadd dword [eax + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"fsub dword [eax + 0x50]\",\n        \"fstp dword [esp]\",\n        \"fld st0\",\n        \"fmul st2\",\n        \"fld dword [esp]\",\n        \"fmul st4\",\n        \"fsubp\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp]\",\n        \"fmul st2\",\n        \"fxch\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x74]\",\n        \"fadd dword [eax + 0x30]\",\n        \"fld dword [eax + 0x34]\",\n        \"fsub dword [eax + 0x70]\",\n        \"fstp dword [esp]\",\n        \"fld st0\",\n        \"fmul st3\",\n        \"fld dword [esp]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x4]\",\n        \"fmul st1\",\n        \"fld dword [esp]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [esp]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [eax + 0x18]\",\n        \"fsub dword [eax + 0x5c]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fadd dword [eax + 0x58]\",\n        \"fld st1\",\n        \"fmul dword [esp + 0x14]\",\n        \"fld st1\",\n        \"fmul dword [esp + 0x10]\",\n        \"fsubp\",\n        \"fstp dword [esp + 0xc]\",\n        \"fxch\",\n        \"fmul dword [esp + 0x10]\",\n        \"fxch\",\n        \"fmul dword [esp + 0x14]\",\n        \"faddp\",\n        \"fld dword [eax + 0x38]\",\n        \"fsub dword [eax + 0x7c]\",\n        \"fld dword [eax + 0x78]\",\n        \"fadd dword [eax + 0x3c]\",\n        \"fld st1\",\n        \"fmul st4\",\n        \"fld st1\",\n        \"fmul st6\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x4]\",\n        \"fmul st3\",\n        \"fxch\",\n        \"fmul st4\",\n        \"faddp\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [eax + 0x5c]\",\n        \"fadd dword [eax + 0x18]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fsub dword [eax + 0x58]\",\n        \"fld st1\",\n        \"fmul st3\",\n        \"fld st1\",\n        \"fmul st5\",\n        \"faddp\",\n        \"fstp dword [esp + 0xc]\",\n        \"fmul st2\",\n        \"fxch\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp st2\",\n        \"fstp st0\",\n        \"fld dword [eax + 0x7c]\",\n        \"fadd dword [eax + 0x38]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fsub dword [eax + 0x78]\",\n        \"fld st1\",\n        \"fmul dword [esp + 0x10]\",\n        \"fld st1\",\n        \"fmul dword [esp + 0x14]\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x4]\",\n        \"fmul dword [esp + 0x10]\",\n        \"fxch\",\n        \"fmul dword [esp + 0x14]\",\n        \"faddp\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fsubp\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x80]\",\n        \"fld dword [esp + 0x28]\",\n        \"fadd dword [esp + 0x78]\",\n        \"fld dword [esp + 0x8]\",\n        \"fadd dword [esp + 0x58]\",\n        \"fld dword [esp + 0x70]\",\n        \"fadd dword [esp + 0x30]\",\n        \"fstp dword [esp]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax]\",\n        \"fld dword [esp]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + 0x8]\",\n        \"fstp st1\",\n        \"fsub dword [esp]\",\n        \"fstp dword [eax + 0xc]\",\n        \"fld dword [esp + 0x80]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x78]\",\n        \"fsub dword [esp + 0x28]\",\n        \"fld dword [esp + 0x58]\",\n        \"fsub dword [esp + 0x8]\",\n        \"fld dword [esp + 0x30]\",\n        \"fsub dword [esp + 0x70]\",\n        \"fld st3\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x10]\",\n        \"fld st1\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x14]\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x18]\",\n        \"fxch\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x1c]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x60]\",\n        \"fsub dword [esp + 0x38]\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x40]\",\n        \"fld dword [esp + 0x68]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fadd dword [esp + 0x50]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul st6\",\n        \"fstp dword [esp + 0x4]\",\n        \"faddp\",\n        \"fmul st4\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x20]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x24]\",\n        \"fxch st2\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x28]\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x2c]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x38]\",\n        \"fadd dword [esp + 0x60]\",\n        \"fld dword [esp + 0x40]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd dword [esp + 0x68]\",\n        \"fld dword [esp + 0x50]\",\n        \"fsub dword [esp + 0x1c]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul st6\",\n        \"fstp dword [esp + 0x4]\",\n        \"faddp\",\n        \"fmul st4\",\n        \"fld st2\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x30]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x34]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x38]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x3c]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x24]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fadd dword [esp + 0x34]\",\n        \"fld dword [esp + 0x44]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [esp]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x40]\",\n        \"fld dword [esp]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x44]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + 0x48]\",\n        \"fstp st1\",\n        \"fsub dword [esp]\",\n        \"fstp dword [eax + 0x4c]\",\n        \"fld dword [esp + 0x24]\",\n        \"fsub dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x34]\",\n        \"fsub dword [esp + 0x3c]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x4c]\",\n        \"fld st3\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x50]\",\n        \"fld st1\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x54]\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x58]\",\n        \"fxch\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x5c]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x5c]\",\n        \"fsub dword [esp + 0x54]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fadd dword [esp + 0x64]\",\n        \"fld st2\",\n        \"fadd dword [esp + 0x74]\",\n        \"fld dword [esp + 0x84]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul st6\",\n        \"fstp dword [esp + 0x4]\",\n        \"faddp\",\n        \"fmul st4\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x60]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x64]\",\n        \"fxch st2\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x68]\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x6c]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x54]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld dword [esp + 0x64]\",\n        \"fsub dword [esp + 0x6c]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fsubr dword [esp + 0x74]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fadd dword [esp + 0x84]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul st3\",\n        \"fstp dword [esp + 0x4]\",\n        \"fadd st0,st1\",\n        \"fmulp st2\",\n        \"fstp st0\",\n        \"fld dword [esp + 0xc]\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x70]\",\n        \"fld dword [esp + 0x4]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [eax + 0x74]\",\n        \"fadd dword [esp + 0xc]\",\n        \"fstp dword [eax + 0x78]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x7c]\",\n        \"add esp,0x88\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub w8, w8, #0x88 (136)\",\n        \"ldr s2, [x7, #4]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x7, #24]\",\n        \"ldr s3, [x7, #16]\",\n        \"fcvt d3, s3\",\n        \"str w5, [x8, #20]\",\n        \"ldr s4, [x7, #20]\",\n        \"fcvt d4, s4\",\n        \"ldr w5, [x7, #28]\",\n        \"ldr s5, [x7, #32]\",\n        \"fcvt d5, s5\",\n        \"str w5, [x8, #16]\",\n        \"ldr s6, [x7, #36]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x4]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #68]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"ldr s8, [x4, #64]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #4]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"ldr s9, [x4, #32]\",\n        \"fcvt d9, s9\",\n        \"ldr s10, [x4, #100]\",\n        \"fcvt d10, s10\",\n        \"fsub d9, d9, d10\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #8]\",\n        \"ldr s9, [x4, #36]\",\n        \"fcvt d9, s9\",\n        \"ldr s10, [x4, #96]\",\n        \"fcvt d10, s10\",\n        \"fadd d9, d9, d10\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8]\",\n        \"ldr s9, [x8, #8]\",\n        \"fcvt d9, s9\",\n        \"ldr s10, [x8]\",\n        \"fcvt d10, s10\",\n        \"fsub d9, d9, d10\",\n        \"fmul d9, d9, d2\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #4]\",\n        \"ldr s9, [x8]\",\n        \"fcvt d9, s9\",\n        \"ldr s10, [x8, #8]\",\n        \"fcvt d10, s10\",\n        \"fadd d9, d9, d10\",\n        \"fmul d9, d9, d2\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8]\",\n        \"ldr s9, [x8, #4]\",\n        \"fcvt d9, s9\",\n        \"fadd d9, d9, d7\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #128]\",\n        \"ldr s9, [x8]\",\n        \"fcvt d9, s9\",\n        \"fadd d9, d9, d8\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #120]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s9, [x8, #4]\",\n        \"fcvt d9, s9\",\n        \"fsub d7, d7, d9\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #96]\",\n        \"ldr s7, [x8]\",\n        \"fcvt d7, s7\",\n        \"fsub d7, d8, d7\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #64]\",\n        \"ldr s7, [x4, #68]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"ldr s8, [x4, #4]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #64]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"ldr s9, [x4, #100]\",\n        \"fcvt d9, s9\",\n        \"ldr s10, [x4, #32]\",\n        \"fcvt d10, s10\",\n        \"fadd d9, d9, d10\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #8]\",\n        \"ldr s9, [x4, #36]\",\n        \"fcvt d9, s9\",\n        \"ldr s10, [x4, #96]\",\n        \"fcvt d10, s10\",\n        \"fsub d9, d9, d10\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8]\",\n        \"ldr s9, [x8, #8]\",\n        \"fcvt d9, s9\",\n        \"ldr s10, [x8]\",\n        \"fcvt d10, s10\",\n        \"fsub d9, d9, d10\",\n        \"fmul d9, d9, d2\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #4]\",\n        \"ldr s9, [x8]\",\n        \"fcvt d9, s9\",\n        \"ldr s10, [x8, #8]\",\n        \"fcvt d10, s10\",\n        \"fadd d9, d9, d10\",\n        \"fmul d9, d9, d2\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8]\",\n        \"ldr s9, [x8]\",\n        \"fcvt d9, s9\",\n        \"fsub d9, d7, d9\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #36]\",\n        \"ldr s9, [x8, #4]\",\n        \"fcvt d9, s9\",\n        \"fadd d9, d9, d8\",\n        \"fcvt s9, d9\",\n        \"str s9, [x8, #52]\",\n        \"ldr s9, [x8]\",\n        \"fcvt d9, s9\",\n        \"fadd d7, d9, d7\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #92]\",\n        \"ldr s7, [x8, #4]\",\n        \"fcvt d7, s7\",\n        \"fsub d7, d8, d7\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #100]\",\n        \"ldr s7, [x4, #8]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #76]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"ldr s8, [x4, #12]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #72]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8]\",\n        \"fmul d8, d7, d3\",\n        \"ldr s9, [x8]\",\n        \"fcvt d9, s9\",\n        \"fmul d9, d9, d4\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #12]\",\n        \"fmul d7, d7, d4\",\n        \"ldr s8, [x8]\",\n        \"fcvt d8, s8\",\n        \"fmul d8, d8, d3\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #40]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #108]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"ldr s8, [x4, #44]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #104]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"fmul d8, d8, d7\",\n        \"ldr s9, [x8]\",\n        \"fcvt d9, s9\",\n        \"ldr s10, [x8, #20]\",\n        \"fcvt d10, s10\",\n        \"fmul d9, d9, d10\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #16]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s9, [x8, #20]\",\n        \"fcvt d9, s9\",\n        \"fmul d7, d7, d9\",\n        \"fadd d7, d8, d7\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8]\",\n        \"ldr s7, [x8, #4]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #12]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #88]\",\n        \"ldr s7, [x8]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #8]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #48]\",\n        \"ldr s7, [x8, #12]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #4]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #104]\",\n        \"ldr s7, [x8, #8]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #80]\",\n        \"ldr s7, [x4, #76]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #8]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"ldr s8, [x4, #12]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #72]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8]\",\n        \"ldr s8, [x8, #20]\",\n        \"fcvt d8, s8\",\n        \"fmul d8, d8, d7\",\n        \"ldr s9, [x8]\",\n        \"fcvt d9, s9\",\n        \"ldr s10, [x8, #16]\",\n        \"fcvt d10, s10\",\n        \"fmul d9, d9, d10\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #12]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"fmul d7, d7, d8\",\n        \"ldr s8, [x8]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x8, #20]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #108]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #40]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"ldr s8, [x4, #44]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #104]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s9, d8\",\n        \"str s9, [x8]\",\n        \"fmul d8, d8, d4\",\n        \"fmul d9, d7, d3\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8]\",\n        \"fcvt d8, s8\",\n        \"fmul d8, d8, d3\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d7, d7, d4\",\n        \"fsub d7, d8, d7\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8]\",\n        \"ldr s7, [x8, #12]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #4]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #68]\",\n        \"ldr s7, [x8, #8]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #76]\",\n        \"ldr s7, [x8, #4]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #12]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #116]\",\n        \"ldr s7, [x8]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #8]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #132]\",\n        \"ldr s7, [x4, #16]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #84]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"ldr s8, [x4, #20]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #80]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8]\",\n        \"fmul d8, d7, d5\",\n        \"ldr s9, [x8]\",\n        \"fcvt d9, s9\",\n        \"fmul d9, d9, d6\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #12]\",\n        \"fmul d7, d7, d6\",\n        \"ldr s8, [x8]\",\n        \"fcvt d8, s8\",\n        \"fmul d8, d8, d5\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #48]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #116]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"ldr s8, [x4, #52]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #112]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8]\",\n        \"fmul d8, d7, d6\",\n        \"ldr s9, [x8]\",\n        \"fcvt d9, s9\",\n        \"fmul d9, d9, d5\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #4]\",\n        \"ldr s8, [x8]\",\n        \"fcvt d8, s8\",\n        \"fmul d8, d8, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d7, d7, d5\",\n        \"fadd d7, d8, d7\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8]\",\n        \"ldr s7, [x8, #4]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #12]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #32]\",\n        \"ldr s7, [x8]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #8]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #40]\",\n        \"ldr s7, [x8, #12]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #4]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #24]\",\n        \"ldr s7, [x8, #8]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #56]\",\n        \"ldr s7, [x4, #84]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #16]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"ldr s8, [x4, #20]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #80]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8]\",\n        \"fmul d8, d7, d6\",\n        \"ldr s9, [x8]\",\n        \"fcvt d9, s9\",\n        \"fmul d9, d9, d5\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #12]\",\n        \"ldr s8, [x8]\",\n        \"fcvt d8, s8\",\n        \"fmul d8, d8, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d7, d7, d5\",\n        \"fadd d7, d8, d7\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #116]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #48]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"ldr s8, [x4, #52]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #112]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8]\",\n        \"fmul d8, d7, d5\",\n        \"ldr s9, [x8]\",\n        \"fcvt d9, s9\",\n        \"fmul d9, d9, d6\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #4]\",\n        \"fmul d6, d7, d6\",\n        \"ldr s7, [x8]\",\n        \"fcvt d7, s7\",\n        \"fmul d5, d7, d5\",\n        \"fadd d5, d6, d5\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8]\",\n        \"ldr s5, [x8, #12]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #4]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #44]\",\n        \"ldr s5, [x8, #8]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #60]\",\n        \"ldr s5, [x8, #4]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #12]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #108]\",\n        \"ldr s5, [x8]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #8]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #84]\",\n        \"ldr s5, [x4, #24]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x4, #92]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr s6, [x4, #28]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x4, #88]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"ldr s7, [x8, #20]\",\n        \"fcvt d7, s7\",\n        \"fmul d7, d5, d7\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"fmul d8, d6, d8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #12]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s7, [x8, #16]\",\n        \"fcvt d7, s7\",\n        \"fmul d5, d5, d7\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s7, [x8, #20]\",\n        \"fcvt d7, s7\",\n        \"fmul d6, d6, d7\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x4, #56]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x4, #124]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"ldr s7, [x4, #120]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #60]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"fmul d8, d6, d4\",\n        \"fmul d9, d7, d3\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #4]\",\n        \"fmul d7, d7, d4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d6, d6, d3\",\n        \"fadd d6, d7, d6\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8]\",\n        \"ldr s6, [x8, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #12]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #8]\",\n        \"ldr s6, [x8]\",\n        \"fcvt d6, s6\",\n        \"fadd d6, d6, d5\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #112]\",\n        \"ldr s6, [x8, #12]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #4]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #28]\",\n        \"ldr s6, [x8]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #72]\",\n        \"ldr s5, [x4, #92]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x4, #24]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x4, #28]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x4, #88]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fmul d7, d5, d4\",\n        \"fmul d8, d6, d3\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #12]\",\n        \"fmul d4, d6, d4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d3, d5, d3\",\n        \"fsub d3, d4, d3\",\n        \"ldr s4, [x4, #124]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x4, #56]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x4, #60]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x4, #120]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr s6, [x8, #16]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d4, d6\",\n        \"ldr s7, [x8, #20]\",\n        \"fcvt d7, s7\",\n        \"fmul d7, d5, d7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #4]\",\n        \"ldr s6, [x8, #16]\",\n        \"fcvt d6, s6\",\n        \"fmul d5, d5, d6\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s6, [x8, #20]\",\n        \"fcvt d6, s6\",\n        \"fmul d4, d4, d6\",\n        \"fadd d4, d5, d4\",\n        \"ldr s5, [x8, #4]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #12]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #20]\",\n        \"fadd d5, d4, d3\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #16]\",\n        \"ldr s5, [x8, #12]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #4]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #124]\",\n        \"fsub d3, d3, d4\",\n        \"ldr s4, [x8, #32]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #128]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #40]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #120]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x8, #8]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #88]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"ldr s7, [x8, #112]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #48]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8]\",\n        \"fadd d7, d6, d4\",\n        \"fcvt s7, d7\",\n        \"str s7, [x4]\",\n        \"ldr s7, [x8]\",\n        \"fcvt d7, s7\",\n        \"fadd d7, d7, d5\",\n        \"fcvt s7, d7\",\n        \"str s7, [x4, #4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d4, d4, d6\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #8]\",\n        \"ldr s4, [x8]\",\n        \"fcvt d4, s4\",\n        \"fsub d4, d5, d4\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #12]\",\n        \"ldr s4, [x8, #128]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #32]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #120]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #40]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr s6, [x8, #88]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #8]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"ldr s7, [x8, #48]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #112]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fsub d8, d4, d7\",\n        \"fcvt s8, d8\",\n        \"str s8, [x4, #16]\",\n        \"fadd d8, d6, d5\",\n        \"fcvt s8, d8\",\n        \"str s8, [x4, #20]\",\n        \"fadd d4, d7, d4\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #24]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d4, d5, d6\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #28]\",\n        \"ldr s4, [x8, #96]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #56]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #24]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #64]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x8, #104]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #72]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"ldr s7, [x8, #28]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #80]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"fsub d8, d6, d7\",\n        \"fmul d8, d8, d2\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #4]\",\n        \"fadd d6, d6, d7\",\n        \"fmul d6, d6, d2\",\n        \"ldr s7, [x8, #4]\",\n        \"fcvt d7, s7\",\n        \"fadd d7, d7, d4\",\n        \"fcvt s7, d7\",\n        \"str s7, [x4, #32]\",\n        \"fadd d7, d6, d5\",\n        \"fcvt s7, d7\",\n        \"str s7, [x4, #36]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s7, [x8, #4]\",\n        \"fcvt d7, s7\",\n        \"fsub d4, d4, d7\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #40]\",\n        \"fsub d4, d5, d6\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #44]\",\n        \"ldr s4, [x8, #56]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #96]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #64]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #24]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr s6, [x8, #72]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #104]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"ldr s7, [x8, #80]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #28]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fsub d8, d6, d7\",\n        \"fmul d8, d8, d2\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #4]\",\n        \"fadd d6, d6, d7\",\n        \"fmul d6, d6, d2\",\n        \"fsub d7, d4, d6\",\n        \"fcvt s7, d7\",\n        \"str s7, [x4, #48]\",\n        \"ldr s7, [x8, #4]\",\n        \"fcvt d7, s7\",\n        \"fadd d7, d7, d5\",\n        \"fcvt s7, d7\",\n        \"str s7, [x4, #52]\",\n        \"fadd d4, d6, d4\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #56]\",\n        \"ldr s4, [x8, #4]\",\n        \"fcvt d4, s4\",\n        \"fsub d4, d5, d4\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #60]\",\n        \"ldr s4, [x8, #44]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #36]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #60]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #52]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x8, #68]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #20]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"ldr s7, [x8, #76]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8]\",\n        \"fadd d7, d6, d4\",\n        \"fcvt s7, d7\",\n        \"str s7, [x4, #64]\",\n        \"ldr s7, [x8]\",\n        \"fcvt d7, s7\",\n        \"fadd d7, d7, d5\",\n        \"fcvt s7, d7\",\n        \"str s7, [x4, #68]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d4, d4, d6\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #72]\",\n        \"ldr s4, [x8]\",\n        \"fcvt d4, s4\",\n        \"fsub d4, d5, d4\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #76]\",\n        \"ldr s4, [x8, #36]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #44]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #52]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #60]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr s6, [x8, #20]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #68]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"ldr s7, [x8, #16]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #76]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"fsub d8, d4, d7\",\n        \"fcvt s8, d8\",\n        \"str s8, [x4, #80]\",\n        \"fadd d8, d6, d5\",\n        \"fcvt s8, d8\",\n        \"str s8, [x4, #84]\",\n        \"fadd d4, d7, d4\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #88]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d4, d5, d6\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #92]\",\n        \"ldr s4, [x8, #92]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #84]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #108]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #100]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x8, #116]\",\n        \"fcvt d6, s6\",\n        \"fadd d6, d3, d6\",\n        \"ldr s7, [x8, #132]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x8, #124]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fsub d8, d6, d7\",\n        \"fmul d8, d8, d2\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #4]\",\n        \"fadd d6, d6, d7\",\n        \"fmul d6, d6, d2\",\n        \"ldr s7, [x8, #4]\",\n        \"fcvt d7, s7\",\n        \"fadd d7, d7, d4\",\n        \"fcvt s7, d7\",\n        \"str s7, [x4, #96]\",\n        \"fadd d7, d6, d5\",\n        \"fcvt s7, d7\",\n        \"str s7, [x4, #100]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s7, [x8, #4]\",\n        \"fcvt d7, s7\",\n        \"fsub d4, d4, d7\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #104]\",\n        \"fsub d4, d5, d6\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #108]\",\n        \"ldr s4, [x8, #84]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #92]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #12]\",\n        \"ldr s4, [x8, #100]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #108]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #8]\",\n        \"ldr s4, [x8, #116]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d4, d3\",\n        \"ldr s4, [x8, #124]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #132]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"fsub d5, d3, d4\",\n        \"fmul d5, d5, d2\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #4]\",\n        \"fadd d3, d4, d3\",\n        \"fmul d2, d2, d3\",\n        \"ldr s3, [x8, #12]\",\n        \"fcvt d3, s3\",\n        \"fsub d3, d3, d2\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #112]\",\n        \"ldr s3, [x8, #4]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #8]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #116]\",\n        \"ldr s3, [x8, #12]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #120]\",\n        \"ldr s2, [x8, #8]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #124]\",\n        \"adds w26, w8, #0x88 (136)\",\n        \"cfinv\",\n        \"mov x27, x8\",\n        \"mov x8, x26\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block2\": {\n      \"x86InstructionCount\": 434,\n      \"ExpectedInstructionCount\": 834,\n      \"x86Insts\": [\n        \"sub esp,0x90\",\n        \"fld dword [ecx + 0x4]\",\n        \"fld st0\",\n        \"fmul dword [ecx + 0x8]\",\n        \"fld st0\",\n        \"fadd dword [ecx + 0x8]\",\n        \"fld dword [eax + 0x40]\",\n        \"fadd dword [eax]\",\n        \"fld dword [eax + 0x44]\",\n        \"fadd dword [eax + 0x4]\",\n        \"fld dword [eax]\",\n        \"fsub dword [eax + 0x40]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsub dword [eax + 0x44]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [eax + 0x20]\",\n        \"fadd dword [eax + 0x60]\",\n        \"fld dword [eax + 0x64]\",\n        \"fadd dword [eax + 0x24]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"fsub dword [eax + 0x60]\",\n        \"fstp dword [esp]\",\n        \"fld dword [eax + 0x24]\",\n        \"fsub dword [eax + 0x64]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x64]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [esp + 0x78]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [eax + 0x8]\",\n        \"fadd dword [eax + 0x48]\",\n        \"fld dword [eax + 0x4c]\",\n        \"fadd dword [eax + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fsub dword [eax + 0x48]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0xc]\",\n        \"fsub dword [eax + 0x4c]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [eax + 0x28]\",\n        \"fadd dword [eax + 0x68]\",\n        \"fld dword [eax + 0x6c]\",\n        \"fadd dword [eax + 0x2c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"fsub dword [eax + 0x68]\",\n        \"fstp dword [esp]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fsub dword [eax + 0x6c]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x74]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x84]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [esp + 0x20]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fld st1\",\n        \"fmul st3\",\n        \"fld st1\",\n        \"fmul st5\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x68]\",\n        \"fmul st2\",\n        \"fxch\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [esp + 0x88]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fld st1\",\n        \"fmul st4\",\n        \"fld st1\",\n        \"fmul st4\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x80]\",\n        \"fxch\",\n        \"fmul st2\",\n        \"fxch\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [eax + 0x10]\",\n        \"fadd dword [eax + 0x50]\",\n        \"fld dword [eax + 0x54]\",\n        \"fadd dword [eax + 0x14]\",\n        \"fld dword [eax + 0x10]\",\n        \"fsub dword [eax + 0x50]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x14]\",\n        \"fsub dword [eax + 0x54]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [eax + 0x30]\",\n        \"fadd dword [eax + 0x70]\",\n        \"fld dword [eax + 0x74]\",\n        \"fadd dword [eax + 0x34]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"fsub dword [eax + 0x70]\",\n        \"fstp dword [esp]\",\n        \"fld dword [eax + 0x34]\",\n        \"fsub dword [eax + 0x74]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul st5\",\n        \"fstp dword [esp + 0x38]\",\n        \"fadd st0,st1\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x40]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fmul st5\",\n        \"fstp dword [esp + 0x48]\",\n        \"fsub st0,st1\",\n        \"fmul st4\",\n        \"fstp dword [esp + 0x58]\",\n        \"fstp st0\",\n        \"fld dword [eax + 0x58]\",\n        \"fadd dword [eax + 0x18]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fadd dword [eax + 0x5c]\",\n        \"fld dword [eax + 0x18]\",\n        \"fsub dword [eax + 0x58]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fsub dword [eax + 0x5c]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [eax + 0x78]\",\n        \"fadd dword [eax + 0x38]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fadd dword [eax + 0x7c]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"fsub dword [eax + 0x78]\",\n        \"fstp dword [esp]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fsub dword [eax + 0x7c]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [esp + 0x7c]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [esp + 0x8c]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [esp + 0x70]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fld st1\",\n        \"fmul st4\",\n        \"fld st1\",\n        \"fmul st4\",\n        \"fsubp\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fxch\",\n        \"fmul st2\",\n        \"fxch\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fld st1\",\n        \"fmul st3\",\n        \"fld st1\",\n        \"fmul st5\",\n        \"fsubp\",\n        \"fstp dword [esp]\",\n        \"fmul st2\",\n        \"fxch\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp st2\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x50]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fld dword [esp + 0x28]\",\n        \"fsub dword [esp + 0x58]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd dword [esp + 0x50]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x58]\",\n        \"fadd dword [esp + 0x28]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x80]\",\n        \"fsub dword [esp]\",\n        \"fld dword [esp + 0x30]\",\n        \"fsub st0,st3\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x80]\",\n        \"fstp dword [esp]\",\n        \"fxch st2\",\n        \"fadd dword [esp + 0x30]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fxch\",\n        \"fld st0\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x60]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd dword [esp + 0x18]\",\n        \"fstp dword [eax + 0x64]\",\n        \"fxch\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x68]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + 0x6c]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fstp dword [eax + 0x70]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x74]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [eax + 0x78]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [eax + 0x7c]\",\n        \"fld dword [esp + 0x38]\",\n        \"fadd dword [esp + 0x60]\",\n        \"fld dword [esp + 0x40]\",\n        \"fadd dword [esp + 0x78]\",\n        \"fld dword [esp + 0x60]\",\n        \"fsub dword [esp + 0x38]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x78]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fadd dword [esp + 0x68]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x88]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x68]\",\n        \"fsub dword [esp + 0x1c]\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x88]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + 0x40]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x44]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + 0x48]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + 0x4c]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fstp dword [eax + 0x50]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x54]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [eax + 0x58]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [eax + 0x5c]\",\n        \"fld dword [esp + 0x20]\",\n        \"fsub dword [esp + 0x70]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fadd dword [esp + 0x24]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"faddp\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x70]\",\n        \"fadd dword [esp + 0x20]\",\n        \"fld dword [esp + 0x24]\",\n        \"fsub dword [esp + 0x2c]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul st4\",\n        \"fstp dword [esp]\",\n        \"fadd st0,st1\",\n        \"fmul st3\",\n        \"fstp dword [esp + 0xc]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x3c]\",\n        \"fsub dword [esp + 0x34]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [esp + 0x34]\",\n        \"fadd dword [esp + 0x3c]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x44]\",\n        \"fsub dword [esp + 0x4c]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd st0,st1\",\n        \"fstp dword [eax + 0x20]\",\n        \"fld st1\",\n        \"fadd dword [esp + 0x18]\",\n        \"fstp dword [eax + 0x24]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fstp dword [eax + 0x28]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub st0,st1\",\n        \"fstp dword [eax + 0x2c]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fstp dword [eax + 0x30]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x34]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [eax + 0x38]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [eax + 0x3c]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fadd dword [esp + 0x54]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fadd dword [esp + 0x64]\",\n        \"fld dword [esp + 0x54]\",\n        \"fsub dword [esp + 0x5c]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fld dword [esp + 0x64]\",\n        \"fsub dword [esp + 0x6c]\",\n        \"fstp dword [esp + 0x4]\",\n        \"fld dword [esp + 0x7c]\",\n        \"fadd dword [esp + 0x74]\",\n        \"fld dword [esp + 0x8c]\",\n        \"fadd dword [esp + 0x84]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esp + 0x74]\",\n        \"fsub dword [esp + 0x7c]\",\n        \"fstp dword [esp]\",\n        \"fld dword [esp + 0x84]\",\n        \"fsub dword [esp + 0x8c]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + 0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + 0x8]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + 0xc]\",\n        \"fld dword [esp + 0x8]\",\n        \"fsub dword [esp + 0xc]\",\n        \"fstp dword [eax + 0x10]\",\n        \"fld dword [esp]\",\n        \"fadd dword [esp + 0x4]\",\n        \"fstp dword [eax + 0x14]\",\n        \"fld dword [esp + 0xc]\",\n        \"fadd dword [esp + 0x8]\",\n        \"fstp dword [eax + 0x18]\",\n        \"fld dword [esp + 0x4]\",\n        \"fsub dword [esp]\",\n        \"fstp dword [eax + 0x1c]\",\n        \"add esp,0x90\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub w8, w8, #0x90 (144)\",\n        \"ldr s2, [x7, #4]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x7, #8]\",\n        \"fcvt d3, s3\",\n        \"fmul d3, d2, d3\",\n        \"ldr s4, [x7, #8]\",\n        \"fcvt d4, s4\",\n        \"fadd d4, d3, d4\",\n        \"ldr s5, [x4, #64]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x4]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x4, #68]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x4, #4]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"ldr s7, [x4]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #64]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #4]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #68]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #4]\",\n        \"ldr s7, [x4, #32]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #96]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"ldr s8, [x4, #100]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #36]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x4, #32]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #96]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8]\",\n        \"ldr s8, [x4, #36]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #100]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #12]\",\n        \"fadd d8, d7, d5\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #84]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d6\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #100]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d5, d5, d7\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #60]\",\n        \"ldr s5, [x8, #16]\",\n        \"fcvt d5, s5\",\n        \"fsub d5, d6, d5\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #68]\",\n        \"ldr s5, [x8, #8]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #12]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #96]\",\n        \"ldr s5, [x8]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #4]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #120]\",\n        \"ldr s5, [x8, #12]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #8]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #80]\",\n        \"ldr s5, [x8, #4]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #40]\",\n        \"ldr s5, [x4, #8]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x4, #72]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x4, #76]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x4, #12]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"ldr s7, [x4, #8]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #72]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #12]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #76]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #4]\",\n        \"ldr s7, [x4, #40]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #104]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"ldr s8, [x4, #108]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #44]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x4, #40]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #104]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8]\",\n        \"ldr s8, [x4, #44]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #108]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #12]\",\n        \"fadd d8, d7, d5\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #116]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d6\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #132]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d5, d5, d7\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #32]\",\n        \"ldr s5, [x8, #16]\",\n        \"fcvt d5, s5\",\n        \"fsub d5, d6, d5\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #36]\",\n        \"ldr s5, [x8, #8]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #12]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr s6, [x8]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #4]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fmul d7, d5, d4\",\n        \"fmul d8, d6, d3\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #104]\",\n        \"fmul d6, d6, d4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d5, d5, d3\",\n        \"fadd d5, d6, d5\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #136]\",\n        \"ldr s5, [x8, #12]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #8]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x8, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fmul d7, d5, d3\",\n        \"fmul d8, d6, d4\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #128]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d5, d5, d4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d6, d6, d3\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #48]\",\n        \"ldr s5, [x4, #16]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x4, #80]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x4, #84]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x4, #20]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"ldr s7, [x4, #16]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #80]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #20]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #84]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #4]\",\n        \"ldr s7, [x4, #48]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #112]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"ldr s8, [x4, #116]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #52]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x4, #48]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #112]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8]\",\n        \"ldr s8, [x4, #52]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #116]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #12]\",\n        \"fadd d8, d7, d5\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #92]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d6\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #108]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d5, d5, d7\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #76]\",\n        \"ldr s5, [x8, #16]\",\n        \"fcvt d5, s5\",\n        \"fsub d5, d6, d5\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #52]\",\n        \"ldr s5, [x8, #8]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #12]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr s6, [x8]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #4]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fsub d7, d5, d6\",\n        \"fmul d7, d7, d2\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #56]\",\n        \"fadd d5, d6, d5\",\n        \"fmul d5, d5, d2\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #64]\",\n        \"ldr s5, [x8, #12]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #8]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x8, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fadd d7, d6, d5\",\n        \"fmul d7, d7, d2\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #72]\",\n        \"fsub d5, d6, d5\",\n        \"fmul d5, d5, d2\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #88]\",\n        \"ldr s5, [x4, #88]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x4, #24]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x4, #28]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x4, #92]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"ldr s7, [x4, #24]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #88]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #8]\",\n        \"ldr s7, [x4, #28]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #92]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #4]\",\n        \"ldr s7, [x4, #120]\",\n        \"fcvt d7, s7\",\n        \"ldr s8, [x4, #56]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"ldr s8, [x4, #60]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #124]\",\n        \"fcvt d9, s9\",\n        \"fadd d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #16]\",\n        \"ldr s8, [x4, #56]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #120]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8]\",\n        \"ldr s8, [x4, #60]\",\n        \"fcvt d8, s8\",\n        \"ldr s9, [x4, #124]\",\n        \"fcvt d9, s9\",\n        \"fsub d8, d8, d9\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #12]\",\n        \"fadd d8, d7, d5\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #124]\",\n        \"ldr s8, [x8, #16]\",\n        \"fcvt d8, s8\",\n        \"fadd d8, d8, d6\",\n        \"fcvt s8, d8\",\n        \"str s8, [x8, #140]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d5, d5, d7\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #44]\",\n        \"ldr s5, [x8, #16]\",\n        \"fcvt d5, s5\",\n        \"fsub d5, d6, d5\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #112]\",\n        \"ldr s5, [x8, #8]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #12]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr s6, [x8]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #4]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fmul d7, d5, d3\",\n        \"fmul d8, d6, d4\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #28]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d5, d5, d4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d6, d6, d3\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #20]\",\n        \"ldr s5, [x8, #12]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #8]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x8, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fmul d7, d5, d4\",\n        \"fmul d8, d6, d3\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8]\",\n        \"fmul d4, d6, d4\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d3, d5, d3\",\n        \"fadd d3, d4, d3\",\n        \"ldr s4, [x8, #80]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #72]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #40]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #88]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #24]\",\n        \"ldr s5, [x8, #72]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #80]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #8]\",\n        \"ldr s5, [x8, #88]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #40]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #4]\",\n        \"ldr s5, [x8, #128]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr s6, [x8, #48]\",\n        \"fcvt d6, s6\",\n        \"fsub d6, d6, d3\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #16]\",\n        \"ldr s6, [x8]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #128]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8]\",\n        \"strb wzr, [x28, #1049]\",\n        \"ldr s6, [x8, #48]\",\n        \"fcvt d6, s6\",\n        \"fadd d3, d3, d6\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #12]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fadd d3, d5, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #96]\",\n        \"ldr s3, [x8, #16]\",\n        \"fcvt d3, s3\",\n        \"ldr s6, [x8, #24]\",\n        \"fcvt d6, s6\",\n        \"fadd d3, d3, d6\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #100]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d3, d4, d5\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #104]\",\n        \"ldr s3, [x8, #24]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #16]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #108]\",\n        \"ldr s3, [x8, #8]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #12]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #112]\",\n        \"ldr s3, [x8]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #4]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #116]\",\n        \"ldr s3, [x8, #12]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #8]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #120]\",\n        \"ldr s3, [x8, #4]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #124]\",\n        \"ldr s3, [x8, #56]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #96]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"ldr s4, [x8, #64]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #120]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #96]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #56]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #8]\",\n        \"ldr s5, [x8, #120]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #64]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #4]\",\n        \"ldr s5, [x8, #28]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #104]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x8, #20]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #136]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #16]\",\n        \"ldr s6, [x8, #104]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #28]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8]\",\n        \"ldr s6, [x8, #136]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #20]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #12]\",\n        \"fadd d6, d5, d3\",\n        \"fcvt s6, d6\",\n        \"str s6, [x4, #64]\",\n        \"ldr s6, [x8, #16]\",\n        \"fcvt d6, s6\",\n        \"fadd d6, d6, d4\",\n        \"fcvt s6, d6\",\n        \"str s6, [x4, #68]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d3, d3, d5\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #72]\",\n        \"ldr s3, [x8, #16]\",\n        \"fcvt d3, s3\",\n        \"fsub d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #76]\",\n        \"ldr s3, [x8, #8]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #12]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #80]\",\n        \"ldr s3, [x8]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #4]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #84]\",\n        \"ldr s3, [x8, #12]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #8]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #88]\",\n        \"ldr s3, [x8, #4]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x4, #92]\",\n        \"ldr s3, [x8, #32]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #112]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"ldr s4, [x8, #44]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #36]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"fsub d5, d3, d4\",\n        \"fmul d5, d5, d2\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #20]\",\n        \"fadd d3, d3, d4\",\n        \"fmul d3, d3, d2\",\n        \"ldr s4, [x8, #112]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #32]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #36]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #44]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fsub d6, d4, d5\",\n        \"fmul d6, d6, d2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8]\",\n        \"fadd d4, d5, d4\",\n        \"fmul d2, d4, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #12]\",\n        \"ldr s2, [x8, #60]\",\n        \"fcvt d2, s2\",\n        \"ldr s4, [x8, #52]\",\n        \"fcvt d4, s4\",\n        \"fsub d2, d2, d4\",\n        \"ldr s4, [x8, #76]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #68]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #24]\",\n        \"ldr s4, [x8, #52]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #60]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #8]\",\n        \"ldr s4, [x8, #68]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #76]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #4]\",\n        \"ldr s4, [x8, #20]\",\n        \"fcvt d4, s4\",\n        \"fadd d4, d4, d2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #32]\",\n        \"ldr s4, [x8, #24]\",\n        \"fcvt d4, s4\",\n        \"fadd d4, d3, d4\",\n        \"fcvt s4, d4\",\n        \"str s4, [x4, #36]\",\n        \"ldr s4, [x8, #20]\",\n        \"fcvt d4, s4\",\n        \"fsub d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #40]\",\n        \"ldr s2, [x8, #24]\",\n        \"fcvt d2, s2\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #44]\",\n        \"ldr s2, [x8, #8]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #12]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #48]\",\n        \"ldr s2, [x8]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #4]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #52]\",\n        \"ldr s2, [x8, #12]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #8]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #56]\",\n        \"ldr s2, [x8, #4]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #60]\",\n        \"ldr s2, [x8, #92]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #84]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"ldr s3, [x8, #108]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #100]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"ldr s4, [x8, #84]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #92]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #8]\",\n        \"ldr s4, [x8, #100]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #108]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #4]\",\n        \"ldr s4, [x8, #124]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #116]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #140]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #132]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #16]\",\n        \"ldr s5, [x8, #116]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #124]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8]\",\n        \"ldr s5, [x8, #132]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #140]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #12]\",\n        \"fadd d5, d4, d2\",\n        \"fcvt s5, d5\",\n        \"str s5, [x4]\",\n        \"ldr s5, [x8, #16]\",\n        \"fcvt d5, s5\",\n        \"fadd d5, d5, d3\",\n        \"fcvt s5, d5\",\n        \"str s5, [x4, #4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d2, d2, d4\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #8]\",\n        \"ldr s2, [x8, #16]\",\n        \"fcvt d2, s2\",\n        \"fsub d2, d3, d2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #12]\",\n        \"ldr s2, [x8, #8]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #12]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #16]\",\n        \"ldr s2, [x8]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #4]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #20]\",\n        \"ldr s2, [x8, #12]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #8]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #24]\",\n        \"ldr s2, [x8, #4]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4, #28]\",\n        \"mvn w27, w8\",\n        \"adds w26, w8, #0x90 (144)\",\n        \"cfinv\",\n        \"mov x8, x26\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xfefe\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block3\": {\n      \"x86InstructionCount\": 702,\n      \"ExpectedInstructionCount\": 92,\n      \"x86Insts\": [\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"shl eax,0x5\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"mov dword [ebp + -0x7c],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"add eax,0x1\",\n        \"shl eax,0x5\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"mov dword [ebp + -0x78],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"shl eax,0x5\",\n        \"add eax,0x40\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"mov dword [ebp + -0x74],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"shl eax,0x5\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"add eax,0xc\",\n        \"mov dword [ebp + -0x70],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"add eax,0x1\",\n        \"shl eax,0x5\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"add eax,0xc\",\n        \"mov dword [ebp + -0x6c],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"shl eax,0x5\",\n        \"add eax,0x40\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"add eax,0xc\",\n        \"mov dword [ebp + -0x68],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"shl eax,0x5\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"add eax,0x18\",\n        \"mov dword [ebp + -0x64],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"add eax,0x1\",\n        \"shl eax,0x5\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"add eax,0x18\",\n        \"mov dword [ebp + -0x60],eax\",\n        \"mov eax,dword [ebp + 0xffffff44]\",\n        \"mov ecx,dword [eax + 0x4]\",\n        \"mov edx,dword [ebp + 0xffffff7c]\",\n        \"mov eax,edx\",\n        \"add eax,eax\",\n        \"add eax,edx\",\n        \"shl eax,0x5\",\n        \"add eax,0x40\",\n        \"lea eax,[ecx + eax*0x1]\",\n        \"add eax,0x18\",\n        \"mov dword [ebp + -0x5c],eax\",\n        \"lea eax,[ebp + 0xffffff04]\",\n        \"mov dword [esp],eax\",\n        \"call 0x0819ba1a\",\n        \"lea eax,[ebp + 0xfffffef8]\",\n        \"mov dword [esp],eax\",\n        \"call 0x0819ba1a\",\n        \"lea eax,[ebp + 0xfffffeec]\",\n        \"mov dword [esp],eax\",\n        \"call 0x0819ba1a\",\n        \"lea eax,[ebp + 0xfffffee0]\",\n        \"mov dword [esp],eax\",\n        \"call 0x0819ba1a\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"mov eax,dword [eax]\",\n        \"mov dword [ebp + 0xfffffe68],eax\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"mov eax,dword [eax + 0x4]\",\n        \"mov dword [ebp + 0xfffffe6c],eax\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"mov eax,dword [eax + 0x8]\",\n        \"mov dword [ebp + 0xfffffe70],eax\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"mov eax,dword [eax]\",\n        \"mov dword [ebp + 0xfffffe20],eax\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"mov eax,dword [eax + 0x4]\",\n        \"mov dword [ebp + 0xfffffe24],eax\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"mov eax,dword [eax + 0x8]\",\n        \"mov dword [ebp + 0xfffffe28],eax\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"mov eax,dword [eax]\",\n        \"mov dword [ebp + 0xfffffe8c],eax\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"mov eax,dword [eax + 0x4]\",\n        \"mov dword [ebp + 0xfffffe90],eax\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"mov eax,dword [eax + 0x8]\",\n        \"mov dword [ebp + 0xfffffe94],eax\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff04]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff08]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff0c]\",\n        \"mov eax,dword [ebp + 0xffffff04]\",\n        \"mov dword [ebp + 0xfffffeec],eax\",\n        \"mov eax,dword [ebp + 0xffffff08]\",\n        \"mov dword [ebp + 0xfffffef0],eax\",\n        \"mov eax,dword [ebp + 0xffffff0c]\",\n        \"mov dword [ebp + 0xfffffef4],eax\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x80]\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffeec]\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffef0]\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax]\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe44]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe48]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe4c]\",\n        \"mov eax,dword [ebp + 0xffffff04]\",\n        \"mov dword [ebp + 0xfffffee0],eax\",\n        \"mov eax,dword [ebp + 0xffffff08]\",\n        \"mov dword [ebp + 0xfffffee4],eax\",\n        \"mov eax,dword [ebp + 0xffffff0c]\",\n        \"mov dword [ebp + 0xfffffee8],eax\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x80]\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee0]\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee4]\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax]\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe2c]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe30]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe34]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff04]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff08]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x8]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff0c]\",\n        \"mov eax,dword [ebp + 0xffffff04]\",\n        \"mov dword [ebp + 0xfffffeec],eax\",\n        \"mov eax,dword [ebp + 0xffffff08]\",\n        \"mov dword [ebp + 0xfffffef0],eax\",\n        \"mov eax,dword [ebp + 0xffffff0c]\",\n        \"mov dword [ebp + 0xfffffef4],eax\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x80]\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffeec]\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffef0]\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax]\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe38]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe3c]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe40]\",\n        \"mov eax,dword [ebp + 0xffffff04]\",\n        \"mov dword [ebp + 0xfffffee0],eax\",\n        \"mov eax,dword [ebp + 0xffffff08]\",\n        \"mov dword [ebp + 0xfffffee4],eax\",\n        \"mov eax,dword [ebp + 0xffffff0c]\",\n        \"mov dword [ebp + 0xfffffee8],eax\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x80]\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee0]\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee4]\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax]\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe5c]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe60]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe64]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff04]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff08]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff0c]\",\n        \"mov eax,dword [ebp + 0xffffff04]\",\n        \"mov dword [ebp + 0xfffffeec],eax\",\n        \"mov eax,dword [ebp + 0xffffff08]\",\n        \"mov dword [ebp + 0xfffffef0],eax\",\n        \"mov eax,dword [ebp + 0xffffff0c]\",\n        \"mov dword [ebp + 0xfffffef4],eax\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x80]\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffeec]\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffef0]\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffef4]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax]\",\n        \"fld dword [ebp + 0xfffffeec]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe74]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld dword [ebp + 0xfffffef0]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe78]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld dword [ebp + 0xfffffef4]\",\n        \"fld dword [0x085cefdc]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe7c]\",\n        \"mov eax,dword [ebp + 0xffffff04]\",\n        \"mov dword [ebp + 0xfffffee0],eax\",\n        \"mov eax,dword [ebp + 0xffffff08]\",\n        \"mov dword [ebp + 0xfffffee4],eax\",\n        \"mov eax,dword [ebp + 0xffffff0c]\",\n        \"mov dword [ebp + 0xfffffee8],eax\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x80]\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee0]\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee4]\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmul dword [ebp + -0x80]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xfffffee8]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax]\",\n        \"fld dword [ebp + 0xfffffee0]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe80]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x4]\",\n        \"fld dword [ebp + 0xfffffee4]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe84]\",\n        \"mov eax,dword [ebp + -0x74]\",\n        \"fld dword [eax + 0x8]\",\n        \"fld dword [ebp + 0xfffffee8]\",\n        \"fld dword [0x085cefe0]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe88]\",\n        \"fld dword [ebp + 0xfffffe2c]\",\n        \"fld dword [ebp + 0xfffffe44]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe38]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe5c]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe74]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe80]\",\n        \"faddp\",\n        \"fld dword [0x085cefe4]\",\n        \"fdivp\",\n        \"fstp dword [ebp + 0xfffffe50]\",\n        \"fld dword [ebp + 0xfffffe30]\",\n        \"fld dword [ebp + 0xfffffe48]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe3c]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe60]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe78]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe84]\",\n        \"faddp\",\n        \"fld dword [0x085cefe4]\",\n        \"fdivp\",\n        \"fstp dword [ebp + 0xfffffe54]\",\n        \"fld dword [ebp + 0xfffffe34]\",\n        \"fld dword [ebp + 0xfffffe4c]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe40]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe64]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe7c]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe88]\",\n        \"faddp\",\n        \"fld dword [0x085cefe4]\",\n        \"fdivp\",\n        \"fstp dword [ebp + 0xfffffe58]\",\n        \"fld dword [ebp + 0xfffffe50]\",\n        \"fld dword [ebp + 0xfffffe20]\",\n        \"fld dword [ebp + 0xfffffe68]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe8c]\",\n        \"faddp\",\n        \"fld dword [0x085cefe8]\",\n        \"fdivp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe50]\",\n        \"fld dword [ebp + 0xfffffe54]\",\n        \"fld dword [ebp + 0xfffffe24]\",\n        \"fld dword [ebp + 0xfffffe6c]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe90]\",\n        \"faddp\",\n        \"fld dword [0x085cefe8]\",\n        \"fdivp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe54]\",\n        \"fld dword [ebp + 0xfffffe58]\",\n        \"fld dword [ebp + 0xfffffe28]\",\n        \"fld dword [ebp + 0xfffffe70]\",\n        \"faddp\",\n        \"fld dword [ebp + 0xfffffe94]\",\n        \"faddp\",\n        \"fld dword [0x085cefe8]\",\n        \"fdivp\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffe58]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"mov eax,dword [eax]\",\n        \"mov dword [ebp + 0xfffffebc],eax\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"mov eax,dword [eax + 0x4]\",\n        \"mov dword [ebp + 0xfffffec0],eax\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"mov eax,dword [eax + 0x8]\",\n        \"mov dword [ebp + 0xfffffec4],eax\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"mov eax,dword [eax]\",\n        \"mov dword [ebp + 0xfffffe98],eax\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"mov eax,dword [eax + 0x4]\",\n        \"mov dword [ebp + 0xfffffe9c],eax\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"mov eax,dword [eax + 0x8]\",\n        \"mov dword [ebp + 0xfffffea0],eax\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"mov eax,dword [eax]\",\n        \"mov dword [ebp + 0xfffffed4],eax\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"mov eax,dword [eax + 0x4]\",\n        \"mov dword [ebp + 0xfffffed8],eax\",\n        \"mov eax,dword [ebp + -0x68]\",\n        \"mov eax,dword [eax + 0x8]\",\n        \"mov dword [ebp + 0xfffffedc],eax\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax]\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffef8]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x4]\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xfffffefc]\",\n        \"mov eax,dword [ebp + -0x70]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + -0x6c]\",\n        \"fld dword [eax + 0x8]\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xffffff00]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff04]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x4]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff08]\",\n        \"mov eax,dword [ebp + -0x78]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + -0x7c]\",\n        \"fld dword [eax + 0x8]\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0xffffff0c]\",\n        \"fld dword [ebp + 0xffffff04]\",\n        \"fld dword [ebp + 0xffffff04]\",\n        \"fmulp\",\n        \"fld dword [ebp + 0xffffff08]\",\n        \"fld dword [ebp + 0xffffff08]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + 0xffffff0c]\",\n        \"fld dword [ebp + 0xffffff0c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp qword [esp]\",\n        \"call 0x0811028c\",\n        \"fstp dword [ebp + -0x80]\",\n        \"fld dword [ebp + -0x80]\",\n        \"fldz\",\n        \"fxch\",\n        \"fucomip st0,st1\",\n        \"fstp st0\",\n        \"seta al\",\n        \"test al,al\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w7, w4\",\n        \"stur w4, [x9, #-124]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"add w4, w4, #0x1 (1)\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w7, w4\",\n        \"stur w4, [x9, #-120]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w4, #0x40 (64)\",\n        \"add w4, w7, w4\",\n        \"stur w4, [x9, #-116]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w7, w4\",\n        \"add w4, w4, #0xc (12)\",\n        \"stur w4, [x9, #-112]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"add w4, w4, #0x1 (1)\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w7, w4\",\n        \"add w4, w4, #0xc (12)\",\n        \"stur w4, [x9, #-108]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w4, #0x40 (64)\",\n        \"add w4, w7, w4\",\n        \"add w4, w4, #0xc (12)\",\n        \"stur w4, [x9, #-104]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w7, w4\",\n        \"add w4, w4, #0x18 (24)\",\n        \"stur w4, [x9, #-100]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"add w4, w4, #0x1 (1)\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w7, w4\",\n        \"add w4, w4, #0x18 (24)\",\n        \"stur w4, [x9, #-96]\",\n        \"ldur w4, [x9, #-188]\",\n        \"ldr w7, [x4, #4]\",\n        \"ldur w5, [x9, #-132]\",\n        \"add w4, w5, w5\",\n        \"add w4, w4, w5\",\n        \"lsl w4, w4, #5\",\n        \"add w4, w4, #0x40 (64)\",\n        \"add w4, w7, w4\",\n        \"mvn w27, w4\",\n        \"adds w26, w4, #0x18 (24)\",\n        \"mov x4, x26\",\n        \"stur w4, [x9, #-92]\",\n        \"sub w4, w9, #0xfc (252)\",\n        \"str w4, [x8]\",\n        \"mov w20, #0x140\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"cfinv\"\n      ]\n    },\n    \"Block4\": {\n      \"x86InstructionCount\": 351,\n      \"ExpectedInstructionCount\": 644,\n      \"x86Insts\": [\n        \"mov ebp,dword [esp + 0x64]\",\n        \"fadd dword [ebp + 0x8]\",\n        \"add ebp,0x10\",\n        \"mov dword [esp + 0x64],ebp\",\n        \"fmul dword [esp + 0x74]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0x34]\",\n        \"fadd dword [ebp + -0x4]\",\n        \"fmul dword [esp + 0x74]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fld dword [esp + 0x38]\",\n        \"fadd dword [ebp]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fsub dword [ebp + 0x4]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [ebp + -0x8]\",\n        \"mov ebp,dword [ebp + -0x4]\",\n        \"mov dword [esp + 0x34],ebp\",\n        \"mov ebp,dword [esp + 0x64]\",\n        \"mov ebp,dword [ebp]\",\n        \"mov dword [esp + 0x38],ebp\",\n        \"mov ebp,dword [esp + 0x64]\",\n        \"fld dword [ebp + 0x4]\",\n        \"fchs\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [edi + -0x8]\",\n        \"fadd dword [edx + -0x8]\",\n        \"fld dword [edi + -0x4]\",\n        \"fchs\",\n        \"fsub dword [edx + -0x4]\",\n        \"fld dword [edi + -0x8]\",\n        \"fsub dword [edx + -0x8]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [edx + -0x4]\",\n        \"fsub dword [edi + -0x4]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [edi]\",\n        \"fadd dword [edx]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [edi + 0x4]\",\n        \"fchs\",\n        \"fsub dword [edx + 0x4]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [edi]\",\n        \"fsub dword [edx]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [edx + 0x4]\",\n        \"fsub dword [edi + 0x4]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [ecx + -0x8]\",\n        \"fadd dword [esi + -0x8]\",\n        \"fld dword [ecx + -0x4]\",\n        \"fadd dword [esi + -0x4]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esi + -0x8]\",\n        \"fsub dword [ecx + -0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esi + -0x4]\",\n        \"fsub dword [ecx + -0x4]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [ecx]\",\n        \"fadd dword [esi]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [ecx + 0x4]\",\n        \"fadd dword [esi + 0x4]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [esi]\",\n        \"fsub dword [ecx]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esi + 0x4]\",\n        \"fsub dword [ecx + 0x4]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [edi + -0x8]\",\n        \"fld st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [edi + -0x4]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [edi]\",\n        \"fld dword [esp + 0x50]\",\n        \"fsub dword [esp + 0x4c]\",\n        \"fstp dword [edi + 0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [esi + -0x8]\",\n        \"fstp st1\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st1\",\n        \"fstp dword [esi + -0x4]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x44]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [esi]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fadd dword [esp + 0x50]\",\n        \"fstp dword [esi + 0x4]\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st2\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [edx + -0x8]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [edx + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x58]\",\n        \"fadd dword [esp + 0x54]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fld st2\",\n        \"fmul st2\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [edx]\",\n        \"fld st2\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [edx + 0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st1\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ecx + -0x8]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ecx + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x54]\",\n        \"fsub dword [esp + 0x58]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fsub dword [esp + 0x60]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ecx]\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ecx + 0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [ebp + 0x8]\",\n        \"mov ebp,dword [esp + 0x30]\",\n        \"fadd dword [ebp + 0x8]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fld dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x30]\",\n        \"fchs\",\n        \"fsub dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fld dword [ebp + 0x8]\",\n        \"mov ebp,dword [esp + 0x30]\",\n        \"fsub dword [ebp + 0x8]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fsub dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x30]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [ebp]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fadd dword [ebp]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x30]\",\n        \"fchs\",\n        \"fsub dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [ebp]\",\n        \"mov ebp,dword [esp + 0x30]\",\n        \"fsub dword [ebp]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fsub dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x70]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [ebp + 0x8]\",\n        \"fadd dword [ebx + 0x8]\",\n        \"fld dword [ebp + 0xc]\",\n        \"fadd dword [ebx + 0xc]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [ebp + 0x8]\",\n        \"fsub dword [ebx + 0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [ebp + 0xc]\",\n        \"fsub dword [ebx + 0xc]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [ebp]\",\n        \"fadd dword [ebx]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [ebx + 0x4]\",\n        \"fadd dword [ebp + 0x4]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [ebp]\",\n        \"fsub dword [ebx]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fsub dword [ebx + 0x4]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [ebp + 0x8]\",\n        \"fld st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [ebp + 0xc]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [ebp]\",\n        \"fld dword [esp + 0x50]\",\n        \"fsub dword [esp + 0x4c]\",\n        \"fstp dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x70]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [ebp + 0x8]\",\n        \"fstp st1\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st1\",\n        \"fstp dword [ebp + 0xc]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x44]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [ebp]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fadd dword [esp + 0x50]\",\n        \"fstp dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x30]\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st2\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0x8]\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xc]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x58]\",\n        \"fadd dword [esp + 0x54]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st2\",\n        \"fld st3\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [ebp]\",\n        \"sub ebp,0x10\",\n        \"fld dword [esp + 0x34]\",\n        \"mov dword [esp + 0x30],ebp\",\n        \"fmul st1\",\n        \"add ecx,0x10\",\n        \"fld st3\",\n        \"add edx,0x10\",\n        \"fmul st3\",\n        \"add esi,0x10\",\n        \"add edi,0x10\",\n        \"faddp\",\n        \"sub ebx,0x10\",\n        \"fstp dword [ebp + 0x14]\",\n        \"mov ebp,dword [esp + 0x70]\",\n        \"sub ebp,0x10\",\n        \"fstp st0\",\n        \"mov dword [esp + 0x70],ebp\",\n        \"fstp st0\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fld dword [esp + 0x14]\",\n        \"sub ebp,0x10\",\n        \"fsub dword [esp + 0x18]\",\n        \"mov dword [esp + 0x24],ebp\",\n        \"fld dword [esp + 0x1c]\",\n        \"mov ebp,dword [esp + 0x7c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"dec ebp\",\n        \"fld dword [esp + 0x2c]\",\n        \"mov dword [esp + 0x7c],ebp\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ebx + 0x18]\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ebx + 0x1c]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x54]\",\n        \"fsub dword [esp + 0x58]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fsub dword [esp + 0x60]\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ebx + 0x10]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ebx + 0x14]\",\n        \"fstp st0\",\n        \"fstp st0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w9, [x8, #100]\",\n        \"ldr s2, [x9, #8]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w9, w9, #0x10 (16)\",\n        \"str w9, [x8, #100]\",\n        \"ldr s3, [x8, #116]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #108]\",\n        \"ldr s2, [x8, #52]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-4]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"ldr s3, [x8, #116]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #104]\",\n        \"ldr s2, [x8, #56]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x9]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"ldr s3, [x8, #120]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #44]\",\n        \"ldr s2, [x8, #60]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x9, #4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x8, #120]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #40]\",\n        \"ldur s2, [x9, #-8]\",\n        \"fcvt d2, s2\",\n        \"ldur w9, [x9, #-4]\",\n        \"str w9, [x8, #52]\",\n        \"ldr w9, [x8, #100]\",\n        \"ldr w9, [x9]\",\n        \"str w9, [x8, #56]\",\n        \"ldr w9, [x8, #100]\",\n        \"ldr s3, [x9, #4]\",\n        \"fcvt d3, s3\",\n        \"add w22, w20, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add x23, x28, x22, lsl #4\",\n        \"fneg v3.2d, v3.2d\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #60]\",\n        \"ldur s3, [x11, #-8]\",\n        \"fcvt d3, s3\",\n        \"ldur s4, [x5, #-8]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"ldur s4, [x11, #-4]\",\n        \"fcvt d4, s4\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add x12, x28, x22, lsl #4\",\n        \"fneg v4.2d, v4.2d\",\n        \"ldur s5, [x5, #-4]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldur s5, [x11, #-8]\",\n        \"fcvt d5, s5\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"ldur s6, [x5, #-8]\",\n        \"fcvt d6, s6\",\n        \"add x13, x28, x22, lsl #4\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #20]\",\n        \"ldur s5, [x5, #-4]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x11, #-4]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #28]\",\n        \"ldr s5, [x11]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x5]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #68]\",\n        \"ldr s5, [x11, #4]\",\n        \"fcvt d5, s5\",\n        \"fneg v5.2d, v5.2d\",\n        \"ldr s6, [x5, #4]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #80]\",\n        \"ldr s5, [x11]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x5]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #84]\",\n        \"ldr s5, [x5, #4]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x11, #4]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #92]\",\n        \"ldur s5, [x7, #-8]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x10, #-8]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldur s6, [x7, #-4]\",\n        \"fcvt d6, s6\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"ldur s7, [x10, #-4]\",\n        \"fcvt d7, s7\",\n        \"add x22, x28, x22, lsl #4\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #16]\",\n        \"ldur s6, [x10, #-8]\",\n        \"fcvt d6, s6\",\n        \"ldur s7, [x7, #-8]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #32]\",\n        \"ldur s6, [x10, #-4]\",\n        \"fcvt d6, s6\",\n        \"ldur s7, [x7, #-4]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #24]\",\n        \"ldr s6, [x7]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x10]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #72]\",\n        \"ldr s6, [x7, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x10, #4]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #76]\",\n        \"ldr s6, [x10]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x7]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #96]\",\n        \"ldr s6, [x10, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x7, #4]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #88]\",\n        \"fadd d6, d5, d3\",\n        \"fcvt s6, d6\",\n        \"stur s6, [x11, #-8]\",\n        \"ldr s6, [x8, #16]\",\n        \"fcvt d6, s6\",\n        \"fsub d6, d4, d6\",\n        \"fcvt s6, d6\",\n        \"stur s6, [x11, #-4]\",\n        \"ldr s6, [x8, #72]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #68]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x11]\",\n        \"ldr s6, [x8, #80]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #76]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x11, #4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d3, d3, d5\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x10, #-8]\",\n        \"ldr s3, [x8, #16]\",\n        \"fcvt d3, s3\",\n        \"fadd d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x10, #-4]\",\n        \"ldr s3, [x8, #68]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #72]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x10]\",\n        \"ldr s3, [x8, #76]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #80]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x10, #4]\",\n        \"ldr s3, [x8, #24]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #20]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"ldr s4, [x8, #32]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #28]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #108]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d3\",\n        \"ldr s6, [x8, #104]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d4\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x5, #-8]\",\n        \"ldr s5, [x8, #108]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d5, d4\",\n        \"ldr s5, [x8, #104]\",\n        \"fcvt d5, s5\",\n        \"fmul d3, d5, d3\",\n        \"fadd d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x5, #-4]\",\n        \"ldr s3, [x8, #88]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #84]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"ldr s4, [x8, #96]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #92]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"fmul d5, d2, d3\",\n        \"ldr s6, [x8, #52]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d4\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x5]\",\n        \"fmul d4, d2, d4\",\n        \"ldr s5, [x8, #52]\",\n        \"fcvt d5, s5\",\n        \"fmul d3, d5, d3\",\n        \"fadd d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x5, #4]\",\n        \"ldr s3, [x8, #20]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #24]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"ldr s4, [x8, #28]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #32]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #40]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d4\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s6, [x8, #44]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d3\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x7, #-8]\",\n        \"ldr s5, [x8, #44]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d5, d4\",\n        \"ldr s5, [x8, #40]\",\n        \"fcvt d5, s5\",\n        \"fmul d3, d5, d3\",\n        \"fsub d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x7, #-4]\",\n        \"ldr s3, [x8, #84]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #88]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"ldr s4, [x8, #92]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #96]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #60]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d4\",\n        \"ldr s6, [x8, #56]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d3\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x7]\",\n        \"ldr s5, [x8, #56]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d5, d4\",\n        \"ldr s5, [x8, #60]\",\n        \"fcvt d5, s5\",\n        \"fmul d3, d5, d3\",\n        \"fsub d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #4]\",\n        \"ldr s3, [x9, #8]\",\n        \"fcvt d3, s3\",\n        \"ldr w9, [x8, #48]\",\n        \"ldr s4, [x9, #8]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s4, [x9, #12]\",\n        \"fcvt d4, s4\",\n        \"ldr w9, [x8, #48]\",\n        \"fneg v4.2d, v4.2d\",\n        \"ldr s5, [x9, #12]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s5, [x9, #8]\",\n        \"fcvt d5, s5\",\n        \"ldr w9, [x8, #48]\",\n        \"ldr s6, [x9, #8]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #20]\",\n        \"ldr s5, [x9, #12]\",\n        \"fcvt d5, s5\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s6, [x9, #12]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr w9, [x8, #48]\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #28]\",\n        \"ldr s5, [x9]\",\n        \"fcvt d5, s5\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s6, [x9]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #68]\",\n        \"ldr s5, [x9, #4]\",\n        \"fcvt d5, s5\",\n        \"ldr w9, [x8, #48]\",\n        \"fneg v5.2d, v5.2d\",\n        \"ldr s6, [x9, #4]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr w9, [x8, #36]\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #80]\",\n        \"ldr s5, [x9]\",\n        \"fcvt d5, s5\",\n        \"ldr w9, [x8, #48]\",\n        \"ldr s6, [x9]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #84]\",\n        \"ldr s5, [x9, #4]\",\n        \"fcvt d5, s5\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s6, [x9, #4]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr w9, [x8, #112]\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #92]\",\n        \"ldr s5, [x9, #8]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x6, #8]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x9, #12]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x6, #12]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #16]\",\n        \"ldr s6, [x9, #8]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x6, #8]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #32]\",\n        \"ldr s6, [x9, #12]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x6, #12]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #24]\",\n        \"ldr s6, [x9]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x6]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #72]\",\n        \"ldr s6, [x6, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x9, #4]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #76]\",\n        \"ldr s6, [x9]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x6]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #96]\",\n        \"ldr s6, [x9, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s7, [x6, #4]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #88]\",\n        \"fadd d6, d5, d3\",\n        \"fcvt s6, d6\",\n        \"str s6, [x9, #8]\",\n        \"ldr s6, [x8, #16]\",\n        \"fcvt d6, s6\",\n        \"fsub d6, d4, d6\",\n        \"fcvt s6, d6\",\n        \"str s6, [x9, #12]\",\n        \"ldr s6, [x8, #72]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #68]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x9]\",\n        \"ldr s6, [x8, #80]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #76]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x9, #4]\",\n        \"ldr w9, [x8, #112]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d3, d3, d5\",\n        \"fcvt s3, d3\",\n        \"str s3, [x9, #8]\",\n        \"ldr s3, [x8, #16]\",\n        \"fcvt d3, s3\",\n        \"fadd d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x9, #12]\",\n        \"ldr s3, [x8, #68]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #72]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x9]\",\n        \"ldr s3, [x8, #76]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #80]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x9, #4]\",\n        \"ldr w9, [x8, #48]\",\n        \"ldr s3, [x8, #24]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #20]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"ldr s4, [x8, #32]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #28]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #104]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d3\",\n        \"ldr s6, [x8, #108]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d4\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x9, #8]\",\n        \"ldr s5, [x8, #104]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d5, d4\",\n        \"ldr s5, [x8, #108]\",\n        \"fcvt d5, s5\",\n        \"fmul d3, d5, d3\",\n        \"fadd d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x9, #12]\",\n        \"ldr s3, [x8, #88]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #84]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"ldr s4, [x8, #96]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #92]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #52]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d3\",\n        \"fmul d6, d2, d4\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x9]\",\n        \"sub w9, w9, #0x10 (16)\",\n        \"ldr s5, [x8, #52]\",\n        \"fcvt d5, s5\",\n        \"str w9, [x8, #48]\",\n        \"fmul d4, d5, d4\",\n        \"add w7, w7, #0x10 (16)\",\n        \"add w5, w5, #0x10 (16)\",\n        \"fmul d3, d2, d3\",\n        \"add w10, w10, #0x10 (16)\",\n        \"add w11, w11, #0x10 (16)\",\n        \"fadd d3, d4, d3\",\n        \"sub w6, w6, #0x10 (16)\",\n        \"fcvt s3, d3\",\n        \"str s3, [x9, #20]\",\n        \"ldr w9, [x8, #112]\",\n        \"sub w9, w9, #0x10 (16)\",\n        \"str w9, [x8, #112]\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s3, [x8, #20]\",\n        \"fcvt d3, s3\",\n        \"subs w9, w9, #0x10 (16)\",\n        \"ldr s4, [x8, #24]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"str w9, [x8, #36]\",\n        \"ldr s4, [x8, #28]\",\n        \"fcvt d4, s4\",\n        \"ldr w9, [x8, #124]\",\n        \"ldr s5, [x8, #32]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"cset x14, hs\",\n        \"subs w26, w9, #0x1 (1)\",\n        \"rmif x14, #63, #nzCv\",\n        \"mov x27, x9\",\n        \"mov x9, x26\",\n        \"ldr s5, [x8, #44]\",\n        \"fcvt d5, s5\",\n        \"str w9, [x8, #124]\",\n        \"fmul d5, d5, d4\",\n        \"ldr s6, [x8, #40]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d3\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x6, #24]\",\n        \"ldr s5, [x8, #40]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d5, d4\",\n        \"ldr s5, [x8, #44]\",\n        \"fcvt d5, s5\",\n        \"fmul d3, d5, d3\",\n        \"fsub d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x6, #28]\",\n        \"ldr s3, [x8, #84]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #88]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"ldr s4, [x8, #92]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #96]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #56]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d4\",\n        \"ldr s6, [x8, #60]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d3\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x6, #16]\",\n        \"ldr s5, [x8, #60]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d4\",\n        \"ldr s6, [x8, #56]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d3\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s7, d5\",\n        \"str s7, [x6, #20]\",\n        \"strb w20, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"str d6, [x22, #1056]\",\n        \"str d5, [x13, #1056]\",\n        \"str d4, [x12, #1056]\",\n        \"str d3, [x23, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w22, w22, w20\",\n        \"orr w21, w21, w22\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xf0f0\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block5\": {\n      \"x86InstructionCount\": 346,\n      \"ExpectedInstructionCount\": 643,\n      \"x86Insts\": [\n        \"mov ebp,dword [esp + 0x64]\",\n        \"fadd dword [ebp + 0x8]\",\n        \"add ebp,0x10\",\n        \"mov dword [esp + 0x64],ebp\",\n        \"fmul dword [esp + 0x74]\",\n        \"fstp dword [esp + 0x6c]\",\n        \"fld dword [esp + 0x34]\",\n        \"fadd dword [ebp + -0x4]\",\n        \"fmul dword [esp + 0x74]\",\n        \"fstp dword [esp + 0x68]\",\n        \"fld dword [esp + 0x38]\",\n        \"fadd dword [ebp]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fsub dword [ebp + 0x4]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [ebp + -0x8]\",\n        \"mov ebp,dword [ebp + -0x4]\",\n        \"mov dword [esp + 0x34],ebp\",\n        \"mov ebp,dword [esp + 0x64]\",\n        \"mov ebp,dword [ebp]\",\n        \"mov dword [esp + 0x38],ebp\",\n        \"mov ebp,dword [esp + 0x64]\",\n        \"fld dword [ebp + 0x4]\",\n        \"fchs\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [edx + -0x8]\",\n        \"fadd dword [edi + -0x8]\",\n        \"fld dword [edi + -0x4]\",\n        \"fadd dword [edx + -0x4]\",\n        \"fld dword [edi + -0x8]\",\n        \"fsub dword [edx + -0x8]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [edi + -0x4]\",\n        \"fsub dword [edx + -0x4]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [edi]\",\n        \"fadd dword [edx]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [edi + 0x4]\",\n        \"fadd dword [edx + 0x4]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [edi]\",\n        \"fsub dword [edx]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [edi + 0x4]\",\n        \"fsub dword [edx + 0x4]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [ecx + -0x8]\",\n        \"fadd dword [esi + -0x8]\",\n        \"fld dword [ecx + -0x4]\",\n        \"fadd dword [esi + -0x4]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [esi + -0x8]\",\n        \"fsub dword [ecx + -0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [esi + -0x4]\",\n        \"fsub dword [ecx + -0x4]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [ecx]\",\n        \"fadd dword [esi]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [ecx + 0x4]\",\n        \"fadd dword [esi + 0x4]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [esi]\",\n        \"fsub dword [ecx]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [esi + 0x4]\",\n        \"fsub dword [ecx + 0x4]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [edi + -0x8]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [edi + -0x4]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [edi]\",\n        \"fld dword [esp + 0x50]\",\n        \"fadd dword [esp + 0x4c]\",\n        \"fstp dword [edi + 0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [esi + -0x8]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [esi + -0x4]\",\n        \"fld dword [esp + 0x44]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [esi]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fsub dword [esp + 0x50]\",\n        \"fstp dword [esi + 0x4]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st2\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [edx + -0x8]\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [edx + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x58]\",\n        \"fsub dword [esp + 0x54]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fld st2\",\n        \"fmul st2\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [edx]\",\n        \"fld st2\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [edx + 0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fstp dword [ecx + -0x8]\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ecx + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x54]\",\n        \"fadd dword [esp + 0x58]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fsub dword [esp + 0x60]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ecx]\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ecx + 0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [ebp + 0x8]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fadd dword [ebp + 0x8]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fld dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fadd dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fld dword [ebp + 0x8]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fsub dword [ebp + 0x8]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fsub dword [ebp + 0xc]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [ebp]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fadd dword [ebp]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x44]\",\n        \"fld dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fadd dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x4c]\",\n        \"fld dword [ebp]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fsub dword [ebp]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fstp dword [esp + 0x58]\",\n        \"fld dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fsub dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x70]\",\n        \"fstp dword [esp + 0x5c]\",\n        \"fld dword [ebp + 0x8]\",\n        \"fadd dword [ebx + 0x8]\",\n        \"fld dword [ebp + 0xc]\",\n        \"fadd dword [ebx + 0xc]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [ebp + 0x8]\",\n        \"fsub dword [ebx + 0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [ebp + 0xc]\",\n        \"fsub dword [ebx + 0xc]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [ebx]\",\n        \"fadd dword [ebp]\",\n        \"fstp dword [esp + 0x48]\",\n        \"fld dword [ebp + 0x4]\",\n        \"fadd dword [ebx + 0x4]\",\n        \"fstp dword [esp + 0x50]\",\n        \"fld dword [ebp]\",\n        \"fsub dword [ebx]\",\n        \"fstp dword [esp + 0x60]\",\n        \"fld dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fsub dword [ebx + 0x4]\",\n        \"fstp dword [esp + 0x54]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [ebp + 0x8]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [ebp + 0xc]\",\n        \"fld dword [esp + 0x48]\",\n        \"fadd dword [esp + 0x44]\",\n        \"fstp dword [ebp]\",\n        \"fld dword [esp + 0x50]\",\n        \"fadd dword [esp + 0x4c]\",\n        \"fstp dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x70]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [ebp + 0x8]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [ebp + 0xc]\",\n        \"fld dword [esp + 0x44]\",\n        \"fsub dword [esp + 0x48]\",\n        \"fstp dword [ebp]\",\n        \"fld dword [esp + 0x4c]\",\n        \"fsub dword [esp + 0x50]\",\n        \"fstp dword [ebp + 0x4]\",\n        \"mov ebp,dword [esp + 0x28]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st2\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [ebp + 0x8]\",\n        \"fld dword [esp + 0x68]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x6c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ebp + 0xc]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x58]\",\n        \"fsub dword [esp + 0x54]\",\n        \"fld dword [esp + 0x60]\",\n        \"fadd dword [esp + 0x5c]\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st2\",\n        \"fld st3\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [ebp]\",\n        \"fld dword [esp + 0x34]\",\n        \"fmul st1\",\n        \"fld st3\",\n        \"fmul st3\",\n        \"sub ebp,0x10\",\n        \"mov dword [esp + 0x28],ebp\",\n        \"add ecx,0x10\",\n        \"faddp\",\n        \"add edx,0x10\",\n        \"add esi,0x10\",\n        \"fstp dword [ebp + 0x14]\",\n        \"mov ebp,dword [esp + 0x70]\",\n        \"sub ebp,0x10\",\n        \"fstp st0\",\n        \"mov dword [esp + 0x70],ebp\",\n        \"fstp st0\",\n        \"mov ebp,dword [esp + 0x24]\",\n        \"fld dword [esp + 0x14]\",\n        \"sub ebp,0x10\",\n        \"fadd dword [esp + 0x18]\",\n        \"mov dword [esp + 0x24],ebp\",\n        \"fld dword [esp + 0x1c]\",\n        \"mov ebp,dword [esp + 0x7c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"add edi,0x10\",\n        \"fld dword [esp + 0x30]\",\n        \"sub ebx,0x10\",\n        \"dec ebp\",\n        \"fmul st1\",\n        \"mov dword [esp + 0x7c],ebp\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ebx + 0x18]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ebx + 0x1c]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x54]\",\n        \"fadd dword [esp + 0x58]\",\n        \"fld dword [esp + 0x5c]\",\n        \"fsub dword [esp + 0x60]\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [ebx + 0x10]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x38]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [ebx + 0x14]\",\n        \"fstp st0\",\n        \"fstp st0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w9, [x8, #100]\",\n        \"ldr s2, [x9, #8]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w9, w9, #0x10 (16)\",\n        \"str w9, [x8, #100]\",\n        \"ldr s3, [x8, #116]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #108]\",\n        \"ldr s2, [x8, #52]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-4]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"ldr s3, [x8, #116]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #104]\",\n        \"ldr s2, [x8, #56]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x9]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"ldr s3, [x8, #120]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #48]\",\n        \"ldr s2, [x8, #60]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x9, #4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x8, #120]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #44]\",\n        \"ldur s2, [x9, #-8]\",\n        \"fcvt d2, s2\",\n        \"ldur w9, [x9, #-4]\",\n        \"str w9, [x8, #52]\",\n        \"ldr w9, [x8, #100]\",\n        \"ldr w9, [x9]\",\n        \"str w9, [x8, #56]\",\n        \"ldr w9, [x8, #100]\",\n        \"ldr s3, [x9, #4]\",\n        \"fcvt d3, s3\",\n        \"add w22, w20, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add x23, x28, x22, lsl #4\",\n        \"fneg v3.2d, v3.2d\",\n        \"fcvt s3, d3\",\n        \"str s3, [x8, #60]\",\n        \"ldur s3, [x5, #-8]\",\n        \"fcvt d3, s3\",\n        \"ldur s4, [x11, #-8]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"ldur s4, [x11, #-4]\",\n        \"fcvt d4, s4\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"ldur s5, [x5, #-4]\",\n        \"fcvt d5, s5\",\n        \"add x12, x28, x22, lsl #4\",\n        \"fadd d4, d4, d5\",\n        \"ldur s5, [x11, #-8]\",\n        \"fcvt d5, s5\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"ldur s6, [x5, #-8]\",\n        \"fcvt d6, s6\",\n        \"add x13, x28, x22, lsl #4\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #24]\",\n        \"ldur s5, [x11, #-4]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x5, #-4]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #28]\",\n        \"ldr s5, [x11]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x5]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #68]\",\n        \"ldr s5, [x11, #4]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x5, #4]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #76]\",\n        \"ldr s5, [x11]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x5]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #88]\",\n        \"ldr s5, [x11, #4]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x5, #4]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #92]\",\n        \"ldur s5, [x7, #-8]\",\n        \"fcvt d5, s5\",\n        \"ldur s6, [x10, #-8]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldur s6, [x7, #-4]\",\n        \"fcvt d6, s6\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"ldur s7, [x10, #-4]\",\n        \"fcvt d7, s7\",\n        \"add x22, x28, x22, lsl #4\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #16]\",\n        \"ldur s6, [x10, #-8]\",\n        \"fcvt d6, s6\",\n        \"ldur s7, [x7, #-8]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #32]\",\n        \"ldur s6, [x10, #-4]\",\n        \"fcvt d6, s6\",\n        \"ldur s7, [x7, #-4]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #20]\",\n        \"ldr s6, [x7]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x10]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #72]\",\n        \"ldr s6, [x7, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x10, #4]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #80]\",\n        \"ldr s6, [x10]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x7]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #96]\",\n        \"ldr s6, [x10, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x7, #4]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #84]\",\n        \"fadd d6, d5, d3\",\n        \"fcvt s6, d6\",\n        \"stur s6, [x11, #-8]\",\n        \"ldr s6, [x8, #16]\",\n        \"fcvt d6, s6\",\n        \"fadd d6, d6, d4\",\n        \"fcvt s6, d6\",\n        \"stur s6, [x11, #-4]\",\n        \"ldr s6, [x8, #72]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #68]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x11]\",\n        \"ldr s6, [x8, #80]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #76]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x11, #4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d3, d3, d5\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x10, #-8]\",\n        \"ldr s3, [x8, #16]\",\n        \"fcvt d3, s3\",\n        \"fsub d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x10, #-4]\",\n        \"ldr s3, [x8, #68]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #72]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x10]\",\n        \"ldr s3, [x8, #76]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #80]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x10, #4]\",\n        \"ldr s3, [x8, #24]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #20]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"ldr s4, [x8, #32]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #28]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #108]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d3\",\n        \"ldr s6, [x8, #104]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d4\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x5, #-8]\",\n        \"ldr s5, [x8, #108]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d5, d4\",\n        \"ldr s5, [x8, #104]\",\n        \"fcvt d5, s5\",\n        \"fmul d3, d5, d3\",\n        \"fadd d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x5, #-4]\",\n        \"ldr s3, [x8, #88]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #84]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"ldr s4, [x8, #96]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #92]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"fmul d5, d2, d3\",\n        \"ldr s6, [x8, #52]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d4\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x5]\",\n        \"fmul d4, d2, d4\",\n        \"ldr s5, [x8, #52]\",\n        \"fcvt d5, s5\",\n        \"fmul d3, d5, d3\",\n        \"fadd d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x5, #4]\",\n        \"ldr s3, [x8, #20]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #24]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"ldr s4, [x8, #28]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #32]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #44]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d4\",\n        \"ldr s6, [x8, #48]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d3\",\n        \"fadd d5, d5, d6\",\n        \"ldr w9, [x8, #36]\",\n        \"fcvt s5, d5\",\n        \"stur s5, [x7, #-8]\",\n        \"ldr s5, [x8, #48]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d5, d4\",\n        \"ldr s5, [x8, #44]\",\n        \"fcvt d5, s5\",\n        \"fmul d3, d5, d3\",\n        \"fsub d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"stur s3, [x7, #-4]\",\n        \"ldr s3, [x8, #84]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #88]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"ldr s4, [x8, #92]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #96]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #60]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d4\",\n        \"ldr s6, [x8, #56]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d3\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x7]\",\n        \"ldr s5, [x8, #56]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d5, d4\",\n        \"ldr s5, [x8, #60]\",\n        \"fcvt d5, s5\",\n        \"fmul d3, d5, d3\",\n        \"fsub d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x7, #4]\",\n        \"ldr s3, [x9, #8]\",\n        \"fcvt d3, s3\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s4, [x9, #8]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s4, [x9, #12]\",\n        \"fcvt d4, s4\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s5, [x9, #12]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s5, [x9, #8]\",\n        \"fcvt d5, s5\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s6, [x9, #8]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr w9, [x8, #36]\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #24]\",\n        \"ldr s5, [x9, #12]\",\n        \"fcvt d5, s5\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s6, [x9, #12]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr w9, [x8, #36]\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #28]\",\n        \"ldr s5, [x9]\",\n        \"fcvt d5, s5\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s6, [x9]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr w9, [x8, #36]\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #68]\",\n        \"ldr s5, [x9, #4]\",\n        \"fcvt d5, s5\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s6, [x9, #4]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr w9, [x8, #36]\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #76]\",\n        \"ldr s5, [x9]\",\n        \"fcvt d5, s5\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s6, [x9]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr w9, [x8, #36]\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #88]\",\n        \"ldr s5, [x9, #4]\",\n        \"fcvt d5, s5\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s6, [x9, #4]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr w9, [x8, #112]\",\n        \"fcvt s5, d5\",\n        \"str s5, [x8, #92]\",\n        \"ldr s5, [x9, #8]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x6, #8]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"ldr s6, [x9, #12]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x6, #12]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #16]\",\n        \"ldr s6, [x9, #8]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x6, #8]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #32]\",\n        \"ldr s6, [x9, #12]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x6, #12]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #20]\",\n        \"ldr s6, [x6]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x9]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #72]\",\n        \"ldr s6, [x9, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x6, #4]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #80]\",\n        \"ldr s6, [x9]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x6]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #96]\",\n        \"ldr s6, [x9, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s7, [x6, #4]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #84]\",\n        \"fadd d6, d5, d3\",\n        \"fcvt s6, d6\",\n        \"str s6, [x9, #8]\",\n        \"ldr s6, [x8, #16]\",\n        \"fcvt d6, s6\",\n        \"fadd d6, d6, d4\",\n        \"fcvt s6, d6\",\n        \"str s6, [x9, #12]\",\n        \"ldr s6, [x8, #72]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #68]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x9]\",\n        \"ldr s6, [x8, #80]\",\n        \"fcvt d6, s6\",\n        \"ldr s7, [x8, #76]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x9, #4]\",\n        \"ldr w9, [x8, #112]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d3, d3, d5\",\n        \"fcvt s3, d3\",\n        \"str s3, [x9, #8]\",\n        \"ldr s3, [x8, #16]\",\n        \"fcvt d3, s3\",\n        \"fsub d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x9, #12]\",\n        \"ldr s3, [x8, #68]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #72]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x9]\",\n        \"ldr s3, [x8, #76]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #80]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"fcvt s3, d3\",\n        \"str s3, [x9, #4]\",\n        \"ldr w9, [x8, #40]\",\n        \"ldr s3, [x8, #24]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #20]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"ldr s4, [x8, #32]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #28]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #104]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d3\",\n        \"ldr s6, [x8, #108]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d4\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x9, #8]\",\n        \"ldr s5, [x8, #104]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d5, d4\",\n        \"ldr s5, [x8, #108]\",\n        \"fcvt d5, s5\",\n        \"fmul d3, d5, d3\",\n        \"fadd d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x9, #12]\",\n        \"ldr s3, [x8, #88]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #84]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"ldr s4, [x8, #96]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #92]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #52]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d3\",\n        \"fmul d6, d2, d4\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x9]\",\n        \"ldr s5, [x8, #52]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d5, d4\",\n        \"fmul d3, d2, d3\",\n        \"sub w9, w9, #0x10 (16)\",\n        \"str w9, [x8, #40]\",\n        \"add w7, w7, #0x10 (16)\",\n        \"fadd d3, d4, d3\",\n        \"add w5, w5, #0x10 (16)\",\n        \"add w10, w10, #0x10 (16)\",\n        \"fcvt s3, d3\",\n        \"str s3, [x9, #20]\",\n        \"ldr w9, [x8, #112]\",\n        \"sub w9, w9, #0x10 (16)\",\n        \"str w9, [x8, #112]\",\n        \"ldr w9, [x8, #36]\",\n        \"ldr s3, [x8, #20]\",\n        \"fcvt d3, s3\",\n        \"sub w9, w9, #0x10 (16)\",\n        \"ldr s4, [x8, #24]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"str w9, [x8, #36]\",\n        \"ldr s4, [x8, #28]\",\n        \"fcvt d4, s4\",\n        \"ldr w9, [x8, #124]\",\n        \"ldr s5, [x8, #32]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"add w11, w11, #0x10 (16)\",\n        \"ldr s5, [x8, #48]\",\n        \"fcvt d5, s5\",\n        \"subs w6, w6, #0x10 (16)\",\n        \"cset x14, hs\",\n        \"subs w26, w9, #0x1 (1)\",\n        \"rmif x14, #63, #nzCv\",\n        \"mov x27, x9\",\n        \"mov x9, x26\",\n        \"fmul d5, d5, d4\",\n        \"str w9, [x8, #124]\",\n        \"ldr s6, [x8, #44]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d3\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x6, #24]\",\n        \"ldr s5, [x8, #44]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d5, d4\",\n        \"ldr s5, [x8, #48]\",\n        \"fcvt d5, s5\",\n        \"fmul d3, d5, d3\",\n        \"fsub d3, d4, d3\",\n        \"fcvt s3, d3\",\n        \"str s3, [x6, #28]\",\n        \"ldr s3, [x8, #84]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #88]\",\n        \"fcvt d4, s4\",\n        \"fadd d3, d3, d4\",\n        \"ldr s4, [x8, #92]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #96]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #56]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d4\",\n        \"ldr s6, [x8, #60]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d3\",\n        \"fadd d5, d5, d6\",\n        \"fcvt s5, d5\",\n        \"str s5, [x6, #16]\",\n        \"ldr s5, [x8, #60]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d4\",\n        \"ldr s6, [x8, #56]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d3\",\n        \"fsub d5, d5, d6\",\n        \"fcvt s7, d5\",\n        \"str s7, [x6, #20]\",\n        \"strb w20, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"str d6, [x22, #1056]\",\n        \"str d5, [x13, #1056]\",\n        \"str d4, [x12, #1056]\",\n        \"str d3, [x23, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w22, w22, w20\",\n        \"orr w21, w21, w22\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xf0f0\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block6\": {\n      \"x86InstructionCount\": 409,\n      \"ExpectedInstructionCount\": 556,\n      \"x86Insts\": [\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x30]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x2c]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x28]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x24]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x20]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x1c]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x18]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x14]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x10]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0xc]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + -0x30]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [ebp + -0x2c]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [ebp + -0x28]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [ebp + -0x24]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [ebp + -0x20]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [ebp + -0x1c]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [ebp + -0x18]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [ebp + -0x14]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [ebp + -0x10]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [ebp + -0xc]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fxch st5\",\n        \"fstp dword [esp + 0x18]\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"fxch\",\n        \"fstp dword [esp + 0x10]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp],ebx\",\n        \"call 0x0818d57a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #28]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #44]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #60]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-48]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #8]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #24]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #40]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #56]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-44]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #20]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #36]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #52]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-40]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #16]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #32]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #48]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-36]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #28]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #44]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #60]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-32]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #8]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #24]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #40]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #56]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-28]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #20]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #36]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #52]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-24]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #16]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #32]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #48]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-20]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #16]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #20]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #28]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #24]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #44]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #28]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #60]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-16]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #16]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #8]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #20]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #24]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #24]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #40]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #28]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #56]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-12]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #16]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #20]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #20]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #24]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #36]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #28]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #52]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #16]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4, #20]\",\n        \"fcvt d4, s4\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #16]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"fadd d3, d3, d4\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4, #24]\",\n        \"fcvt d4, s4\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #32]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"fadd d3, d3, d4\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4, #28]\",\n        \"fcvt d4, s4\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #48]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"fadd d3, d3, d4\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4]\",\n        \"fcvt d4, s4\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #12]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4, #4]\",\n        \"fcvt d5, s5\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #28]\",\n        \"fcvt d6, s6\",\n        \"fmul d5, d5, d6\",\n        \"fadd d4, d4, d5\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4, #8]\",\n        \"fcvt d5, s5\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #44]\",\n        \"fcvt d6, s6\",\n        \"fmul d5, d5, d6\",\n        \"fadd d4, d4, d5\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4, #12]\",\n        \"fcvt d5, s5\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #60]\",\n        \"fcvt d6, s6\",\n        \"fmul d5, d5, d6\",\n        \"fadd d4, d4, d5\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4]\",\n        \"fcvt d5, s5\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #8]\",\n        \"fcvt d6, s6\",\n        \"fmul d5, d5, d6\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #24]\",\n        \"fcvt d7, s7\",\n        \"fmul d6, d6, d7\",\n        \"fadd d5, d5, d6\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4, #8]\",\n        \"fcvt d6, s6\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #40]\",\n        \"fcvt d7, s7\",\n        \"fmul d6, d6, d7\",\n        \"fadd d5, d5, d6\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4, #12]\",\n        \"fcvt d6, s6\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #56]\",\n        \"fcvt d7, s7\",\n        \"fmul d6, d6, d7\",\n        \"fadd d5, d5, d6\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4]\",\n        \"fcvt d6, s6\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #4]\",\n        \"fcvt d7, s7\",\n        \"fmul d6, d6, d7\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4, #4]\",\n        \"fcvt d7, s7\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4, #20]\",\n        \"fcvt d8, s8\",\n        \"fmul d7, d7, d8\",\n        \"fadd d6, d6, d7\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4, #8]\",\n        \"fcvt d7, s7\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4, #36]\",\n        \"fcvt d8, s8\",\n        \"fmul d7, d7, d8\",\n        \"fadd d6, d6, d7\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4, #12]\",\n        \"fcvt d7, s7\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4, #52]\",\n        \"fcvt d8, s8\",\n        \"fmul d7, d7, d8\",\n        \"fadd d6, d6, d7\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4]\",\n        \"fcvt d7, s7\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4]\",\n        \"fcvt d8, s8\",\n        \"fmul d7, d7, d8\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s8, [x4, #4]\",\n        \"fcvt d8, s8\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s9, [x4, #16]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"fadd d7, d7, d8\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s8, [x4, #8]\",\n        \"fcvt d8, s8\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s9, [x4, #32]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"fadd d7, d7, d8\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s8, [x4, #12]\",\n        \"fcvt d8, s8\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s9, [x4, #48]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"fadd d7, d7, d8\",\n        \"ldur s8, [x9, #-48]\",\n        \"str s8, [x8, #64]\",\n        \"ldur s8, [x9, #-44]\",\n        \"str s8, [x8, #60]\",\n        \"ldur s8, [x9, #-40]\",\n        \"str s8, [x8, #56]\",\n        \"ldur s8, [x9, #-36]\",\n        \"str s8, [x8, #52]\",\n        \"ldur s8, [x9, #-32]\",\n        \"str s8, [x8, #48]\",\n        \"ldur s8, [x9, #-28]\",\n        \"str s8, [x8, #44]\",\n        \"ldur s8, [x9, #-24]\",\n        \"str s8, [x8, #40]\",\n        \"ldur s8, [x9, #-20]\",\n        \"str s8, [x8, #36]\",\n        \"ldur s8, [x9, #-16]\",\n        \"str s8, [x8, #32]\",\n        \"ldur s8, [x9, #-12]\",\n        \"str s8, [x8, #28]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #24]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d3\",\n        \"str s2, [x8, #20]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d4\",\n        \"str s2, [x8, #16]\",\n        \"fcvt s2, d5\",\n        \"str s2, [x8, #12]\",\n        \"fcvt s2, d6\",\n        \"str s2, [x8, #8]\",\n        \"fcvt s2, d7\",\n        \"str s2, [x8, #4]\",\n        \"str w6, [x8]\",\n        \"mov w20, #0x462\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block7\": {\n      \"x86InstructionCount\": 418,\n      \"ExpectedInstructionCount\": 563,\n      \"x86Insts\": [\n        \"push ebp\",\n        \"mov ebp,esp\",\n        \"push ebx\",\n        \"sub esp,0x84\",\n        \"mov ebx,dword [ebp + 0x8]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x30]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x2c]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x28]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x30]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x34]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x38]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x3c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x24]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x20]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x1c]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x18]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x20]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x24]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x28]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x2c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x14]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0x10]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [ebp + -0xc]\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x10]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x14]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x18]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x1c]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0xc]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x1c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x2c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x3c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x8]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x18]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x28]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x38]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x4]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x14]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x24]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x34]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax]\",\n        \"fmulp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x4]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x10]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0x8]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x20]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x10]\",\n        \"fld dword [eax + 0xc]\",\n        \"mov eax,dword [ebp + 0xc]\",\n        \"fld dword [eax + 0x30]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fld dword [ebp + -0x30]\",\n        \"fstp dword [esp + 0x40]\",\n        \"fld dword [ebp + -0x2c]\",\n        \"fstp dword [esp + 0x3c]\",\n        \"fld dword [ebp + -0x28]\",\n        \"fstp dword [esp + 0x38]\",\n        \"fld dword [ebp + -0x24]\",\n        \"fstp dword [esp + 0x34]\",\n        \"fld dword [ebp + -0x20]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [ebp + -0x1c]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [ebp + -0x18]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [ebp + -0x14]\",\n        \"fstp dword [esp + 0x24]\",\n        \"fld dword [ebp + -0x10]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [ebp + -0xc]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fxch st5\",\n        \"fstp dword [esp + 0x18]\",\n        \"fxch st3\",\n        \"fstp dword [esp + 0x14]\",\n        \"fxch\",\n        \"fstp dword [esp + 0x10]\",\n        \"fstp dword [esp + 0xc]\",\n        \"fstp dword [esp + 0x8]\",\n        \"fstp dword [esp + 0x4]\",\n        \"mov dword [esp],ebx\",\n        \"call 0x0818d57a\",\n        \"mov eax,ebx\",\n        \"add esp,0x84\",\n        \"pop ebx\",\n        \"pop ebp\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str w9, [x8, #-4]!\",\n        \"mov x9, x8\",\n        \"str w6, [x8, #-4]!\",\n        \"subs w26, w8, #0x84 (132)\",\n        \"mov x27, x8\",\n        \"mov x8, x26\",\n        \"ldr w6, [x9, #8]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #28]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #44]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #60]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-48]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #8]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #24]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #40]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #56]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-44]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #20]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #36]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #52]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-40]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #48]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #52]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #16]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #56]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #32]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #60]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #48]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-36]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #28]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #44]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #60]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-32]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #8]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #24]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #40]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #56]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-28]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #20]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #36]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #52]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-24]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #32]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #36]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #16]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #40]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #32]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #44]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #48]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-20]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #16]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #12]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #20]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #28]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #24]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #44]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #28]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #60]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-16]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #16]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #8]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #20]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #24]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #24]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #40]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #28]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #56]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-12]\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s2, [x4, #16]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s3, [x4, #4]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #20]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #20]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #24]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #36]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #28]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4, #52]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s3, [x4, #16]\",\n        \"fcvt d3, s3\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s4, [x4]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4, #20]\",\n        \"fcvt d4, s4\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #16]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"fadd d3, d3, d4\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4, #24]\",\n        \"fcvt d4, s4\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #32]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"fadd d3, d3, d4\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4, #28]\",\n        \"fcvt d4, s4\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #48]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"fadd d3, d3, d4\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s4, [x4]\",\n        \"fcvt d4, s4\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s5, [x4, #12]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4, #4]\",\n        \"fcvt d5, s5\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #28]\",\n        \"fcvt d6, s6\",\n        \"fmul d5, d5, d6\",\n        \"fadd d4, d4, d5\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4, #8]\",\n        \"fcvt d5, s5\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #44]\",\n        \"fcvt d6, s6\",\n        \"fmul d5, d5, d6\",\n        \"fadd d4, d4, d5\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4, #12]\",\n        \"fcvt d5, s5\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #60]\",\n        \"fcvt d6, s6\",\n        \"fmul d5, d5, d6\",\n        \"fadd d4, d4, d5\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s5, [x4]\",\n        \"fcvt d5, s5\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s6, [x4, #8]\",\n        \"fcvt d6, s6\",\n        \"fmul d5, d5, d6\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4, #4]\",\n        \"fcvt d6, s6\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #24]\",\n        \"fcvt d7, s7\",\n        \"fmul d6, d6, d7\",\n        \"fadd d5, d5, d6\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4, #8]\",\n        \"fcvt d6, s6\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #40]\",\n        \"fcvt d7, s7\",\n        \"fmul d6, d6, d7\",\n        \"fadd d5, d5, d6\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4, #12]\",\n        \"fcvt d6, s6\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #56]\",\n        \"fcvt d7, s7\",\n        \"fmul d6, d6, d7\",\n        \"fadd d5, d5, d6\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s6, [x4]\",\n        \"fcvt d6, s6\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s7, [x4, #4]\",\n        \"fcvt d7, s7\",\n        \"fmul d6, d6, d7\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4, #4]\",\n        \"fcvt d7, s7\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4, #20]\",\n        \"fcvt d8, s8\",\n        \"fmul d7, d7, d8\",\n        \"fadd d6, d6, d7\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4, #8]\",\n        \"fcvt d7, s7\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4, #36]\",\n        \"fcvt d8, s8\",\n        \"fmul d7, d7, d8\",\n        \"fadd d6, d6, d7\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4, #12]\",\n        \"fcvt d7, s7\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4, #52]\",\n        \"fcvt d8, s8\",\n        \"fmul d7, d7, d8\",\n        \"fadd d6, d6, d7\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s7, [x4]\",\n        \"fcvt d7, s7\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s8, [x4]\",\n        \"fcvt d8, s8\",\n        \"fmul d7, d7, d8\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s8, [x4, #4]\",\n        \"fcvt d8, s8\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s9, [x4, #16]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"fadd d7, d7, d8\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s8, [x4, #8]\",\n        \"fcvt d8, s8\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s9, [x4, #32]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"fadd d7, d7, d8\",\n        \"ldr w4, [x9, #16]\",\n        \"ldr s8, [x4, #12]\",\n        \"fcvt d8, s8\",\n        \"ldr w4, [x9, #12]\",\n        \"ldr s9, [x4, #48]\",\n        \"fcvt d9, s9\",\n        \"fmul d8, d8, d9\",\n        \"fadd d7, d7, d8\",\n        \"ldur s8, [x9, #-48]\",\n        \"str s8, [x8, #64]\",\n        \"ldur s8, [x9, #-44]\",\n        \"str s8, [x8, #60]\",\n        \"ldur s8, [x9, #-40]\",\n        \"str s8, [x8, #56]\",\n        \"ldur s8, [x9, #-36]\",\n        \"str s8, [x8, #52]\",\n        \"ldur s8, [x9, #-32]\",\n        \"str s8, [x8, #48]\",\n        \"ldur s8, [x9, #-28]\",\n        \"str s8, [x8, #44]\",\n        \"ldur s8, [x9, #-24]\",\n        \"str s8, [x8, #40]\",\n        \"ldur s8, [x9, #-20]\",\n        \"str s8, [x8, #36]\",\n        \"ldur s8, [x9, #-16]\",\n        \"str s8, [x8, #32]\",\n        \"ldur s8, [x9, #-12]\",\n        \"str s8, [x8, #28]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x8, #24]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d3\",\n        \"str s2, [x8, #20]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fcvt s2, d4\",\n        \"str s2, [x8, #16]\",\n        \"fcvt s2, d5\",\n        \"str s2, [x8, #12]\",\n        \"fcvt s2, d6\",\n        \"str s2, [x8, #8]\",\n        \"fcvt s2, d7\",\n        \"str s2, [x8, #4]\",\n        \"str w6, [x8]\",\n        \"mov w20, #0x46f\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"Block8\": {\n      \"x86InstructionCount\": 231,\n      \"ExpectedInstructionCount\": 497,\n      \"x86Insts\": [\n        \"fadd dword [esp + 0x40]\",\n        \"lea edx,[ecx + ecx*0x2]\",\n        \"lea esi,[edx + ecx*0x2]\",\n        \"lea ebx,[ecx + -0x2]\",\n        \"fmul dword [esp + 0x74]\",\n        \"fld dword [esp + 0x34]\",\n        \"lea edi,[esi + ecx*0x2]\",\n        \"fadd dword [esp + 0x40]\",\n        \"fmul dword [esp + 0x74]\",\n        \"fld dword [esp + 0x38]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x28]\",\n        \"fld dword [eax + esi*0x4 + -0x8]\",\n        \"fadd dword [eax + ebx*0x4]\",\n        \"fld dword [eax + ecx*0x4 + -0x4]\",\n        \"fchs\",\n        \"fsub dword [eax + esi*0x4 + -0x4]\",\n        \"fld dword [eax + ebx*0x4]\",\n        \"fsub dword [eax + esi*0x4 + -0x8]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + esi*0x4 + -0x4]\",\n        \"fsub dword [eax + ecx*0x4 + -0x4]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [eax + edx*0x4 + -0x8]\",\n        \"fadd dword [eax + edi*0x4 + -0x8]\",\n        \"fld dword [eax + edx*0x4 + -0x4]\",\n        \"fadd dword [eax + edi*0x4 + -0x4]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + edx*0x4 + -0x8]\",\n        \"fsub dword [eax + edi*0x4 + -0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [eax + edx*0x4 + -0x4]\",\n        \"fsub dword [eax + edi*0x4 + -0x4]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + ebx*0x4]\",\n        \"fld st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + ecx*0x4 + -0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + edx*0x4 + -0x8]\",\n        \"fstp st1\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st1\",\n        \"fstp dword [eax + edx*0x4 + -0x4]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld st3\",\n        \"fmul st2\",\n        \"fld st3\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [eax + esi*0x4 + -0x8]\",\n        \"fld st3\",\n        \"fmul st1\",\n        \"fld st3\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [eax + esi*0x4 + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [eax + edi*0x4 + -0x8]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [eax + edi*0x4 + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [eax + ecx*0x4]\",\n        \"fadd dword [eax + esi*0x4]\",\n        \"fld dword [eax + ecx*0x4 + 0x4]\",\n        \"fchs\",\n        \"fsub dword [eax + esi*0x4 + 0x4]\",\n        \"fld dword [eax + ecx*0x4]\",\n        \"fsub dword [eax + esi*0x4]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + esi*0x4 + 0x4]\",\n        \"fsub dword [eax + ecx*0x4 + 0x4]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [eax + edi*0x4]\",\n        \"fadd dword [eax + edx*0x4]\",\n        \"fld dword [eax + edx*0x4 + 0x4]\",\n        \"fadd dword [eax + edi*0x4 + 0x4]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + edx*0x4]\",\n        \"fsub dword [eax + edi*0x4]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [eax + edx*0x4 + 0x4]\",\n        \"fsub dword [eax + edi*0x4 + 0x4]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + ecx*0x4]\",\n        \"fld st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + ecx*0x4 + 0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + edx*0x4]\",\n        \"fstp st1\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st1\",\n        \"fstp dword [eax + edx*0x4 + 0x4]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul dword [esp + 0x40]\",\n        \"fstp dword [eax + esi*0x4]\",\n        \"fadd st0,st1\",\n        \"fmul dword [esp + 0x40]\",\n        \"fstp dword [eax + esi*0x4 + 0x4]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x40]\",\n        \"fchs\",\n        \"fld st1\",\n        \"fadd st0,st3\",\n        \"fmul st1\",\n        \"fstp dword [eax + edi*0x4]\",\n        \"fxch\",\n        \"fsub st0,st2\",\n        \"fmul st1\",\n        \"fstp dword [eax + edi*0x4 + 0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [eax + ecx*0x4 + 0x8]\",\n        \"fadd dword [eax + esi*0x4 + 0x8]\",\n        \"fld dword [eax + ecx*0x4 + 0xc]\",\n        \"fchs\",\n        \"fsub dword [eax + esi*0x4 + 0xc]\",\n        \"fld dword [eax + ecx*0x4 + 0x8]\",\n        \"fsub dword [eax + esi*0x4 + 0x8]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld dword [eax + esi*0x4 + 0xc]\",\n        \"fsub dword [eax + ecx*0x4 + 0xc]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [eax + edi*0x4 + 0x8]\",\n        \"fadd dword [eax + edx*0x4 + 0x8]\",\n        \"fld dword [eax + edx*0x4 + 0xc]\",\n        \"fadd dword [eax + edi*0x4 + 0xc]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + edx*0x4 + 0x8]\",\n        \"fsub dword [eax + edi*0x4 + 0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [eax + edx*0x4 + 0xc]\",\n        \"fsub dword [eax + edi*0x4 + 0xc]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + ecx*0x4 + 0x8]\",\n        \"fld st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + ecx*0x4 + 0xc]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + edx*0x4 + 0x8]\",\n        \"fstp st1\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st1\",\n        \"fstp dword [eax + edx*0x4 + 0xc]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x18]\",\n        \"fadd dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld st2\",\n        \"fmul st2\",\n        \"fld st4\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [eax + esi*0x4 + 0x8]\",\n        \"fxch st2\",\n        \"fmul st2\",\n        \"fxch st3\",\n        \"fmul st1\",\n        \"faddp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [eax + esi*0x4 + 0xc]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fsub dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [eax + edi*0x4 + 0x8]\",\n        \"fld dword [esp + 0x28]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [eax + edi*0x4 + 0xc]\",\n        \"pop edi\",\n        \"pop esi\",\n        \"fstp st0\",\n        \"pop ebp\",\n        \"fstp st0\",\n        \"pop ebx\",\n        \"add esp,0x74\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x8, #64]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w5, w7, w7, lsl #1\",\n        \"add w10, w5, w7, lsl #1\",\n        \"sub w6, w7, #0x2 (2)\",\n        \"ldr s3, [x8, #116]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr s3, [x8, #52]\",\n        \"fcvt d3, s3\",\n        \"add w22, w20, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add w11, w10, w7, lsl #1\",\n        \"ldr s4, [x8, #64]\",\n        \"fcvt d4, s4\",\n        \"add x23, x28, x22, lsl #4\",\n        \"fadd d3, d3, d4\",\n        \"ldr s4, [x8, #116]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"ldr s4, [x8, #56]\",\n        \"fcvt d4, s4\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"ldr s5, [x8, #64]\",\n        \"fcvt d5, s5\",\n        \"add x12, x28, x22, lsl #4\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #120]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #44]\",\n        \"ldr s4, [x8, #60]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #64]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #120]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #40]\",\n        \"add w13, w4, w10, lsl #2\",\n        \"ldur s4, [x13, #-8]\",\n        \"fcvt d4, s4\",\n        \"add w13, w4, w6, lsl #2\",\n        \"ldr s5, [x13]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"add w13, w4, w7, lsl #2\",\n        \"ldur s5, [x13, #-4]\",\n        \"fcvt d5, s5\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add x13, x28, x22, lsl #4\",\n        \"fneg v5.2d, v5.2d\",\n        \"add w14, w4, w10, lsl #2\",\n        \"ldur s6, [x14, #-4]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"add w14, w4, w6, lsl #2\",\n        \"ldr s6, [x14]\",\n        \"fcvt d6, s6\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add w14, w4, w10, lsl #2\",\n        \"ldur s7, [x14, #-8]\",\n        \"fcvt d7, s7\",\n        \"add x14, x28, x22, lsl #4\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #20]\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldur s6, [x15, #-4]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldur s7, [x15, #-4]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #28]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s6, [x15, #-8]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s7, [x15, #-8]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s7, [x15, #-4]\",\n        \"fcvt d7, s7\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s8, [x15, #-4]\",\n        \"fcvt d8, s8\",\n        \"add x22, x28, x22, lsl #4\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #16]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s7, [x15, #-8]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s8, [x15, #-8]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #32]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s7, [x15, #-4]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s8, [x15, #-4]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #24]\",\n        \"fadd d7, d6, d4\",\n        \"add w15, w4, w6, lsl #2\",\n        \"fcvt s7, d7\",\n        \"str s7, [x15]\",\n        \"ldr s7, [x8, #16]\",\n        \"fcvt d7, s7\",\n        \"fsub d7, d5, d7\",\n        \"add w15, w4, w7, lsl #2\",\n        \"fcvt s7, d7\",\n        \"stur s7, [x15, #-4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d4, d4, d6\",\n        \"add w15, w4, w5, lsl #2\",\n        \"fcvt s4, d4\",\n        \"stur s4, [x15, #-8]\",\n        \"ldr s4, [x8, #16]\",\n        \"fcvt d4, s4\",\n        \"fadd d4, d4, d5\",\n        \"add w15, w4, w5, lsl #2\",\n        \"fcvt s4, d4\",\n        \"stur s4, [x15, #-4]\",\n        \"ldr s4, [x8, #24]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #20]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #32]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #28]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fmul d6, d2, d4\",\n        \"fmul d7, d3, d5\",\n        \"fsub d6, d6, d7\",\n        \"add w15, w4, w10, lsl #2\",\n        \"fcvt s6, d6\",\n        \"stur s6, [x15, #-8]\",\n        \"fmul d5, d2, d5\",\n        \"fmul d4, d3, d4\",\n        \"fadd d4, d5, d4\",\n        \"add w15, w4, w10, lsl #2\",\n        \"fcvt s4, d4\",\n        \"stur s4, [x15, #-4]\",\n        \"ldr s4, [x8, #20]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #24]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #28]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #32]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr s6, [x8, #40]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d5\",\n        \"ldr s7, [x8, #44]\",\n        \"fcvt d7, s7\",\n        \"fmul d7, d7, d4\",\n        \"fadd d6, d6, d7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"fcvt s6, d6\",\n        \"stur s6, [x15, #-8]\",\n        \"ldr s6, [x8, #44]\",\n        \"fcvt d6, s6\",\n        \"fmul d5, d6, d5\",\n        \"ldr s6, [x8, #40]\",\n        \"fcvt d6, s6\",\n        \"fmul d4, d6, d4\",\n        \"fsub d4, d5, d4\",\n        \"add w15, w4, w11, lsl #2\",\n        \"fcvt s4, d4\",\n        \"stur s4, [x15, #-4]\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s4, [x15]\",\n        \"fcvt d4, s4\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s5, [x15]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s5, [x15, #4]\",\n        \"fcvt d5, s5\",\n        \"fneg v5.2d, v5.2d\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s6, [x15, #4]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s6, [x15]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s7, [x15]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #20]\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s6, [x15, #4]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s7, [x15, #4]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #28]\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s6, [x15]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #4]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #4]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #16]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #32]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #4]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #4]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #24]\",\n        \"fadd d7, d6, d4\",\n        \"add w15, w4, w7, lsl #2\",\n        \"fcvt s7, d7\",\n        \"str s7, [x15]\",\n        \"ldr s7, [x8, #16]\",\n        \"fcvt d7, s7\",\n        \"fsub d7, d5, d7\",\n        \"add w15, w4, w7, lsl #2\",\n        \"fcvt s7, d7\",\n        \"str s7, [x15, #4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d4, d4, d6\",\n        \"add w15, w4, w5, lsl #2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x15]\",\n        \"ldr s4, [x8, #16]\",\n        \"fcvt d4, s4\",\n        \"fadd d4, d4, d5\",\n        \"add w15, w4, w5, lsl #2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x15, #4]\",\n        \"ldr s4, [x8, #24]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #20]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #32]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #28]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fsub d6, d4, d5\",\n        \"ldr s7, [x8, #64]\",\n        \"fcvt d7, s7\",\n        \"fmul d6, d6, d7\",\n        \"add w15, w4, w10, lsl #2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x15]\",\n        \"fadd d4, d5, d4\",\n        \"ldr s5, [x8, #64]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"add w15, w4, w10, lsl #2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x15, #4]\",\n        \"ldr s4, [x8, #20]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #24]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #28]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #32]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr s6, [x8, #64]\",\n        \"fcvt d6, s6\",\n        \"fneg v6.2d, v6.2d\",\n        \"fadd d7, d5, d4\",\n        \"fmul d7, d7, d6\",\n        \"add w15, w4, w11, lsl #2\",\n        \"fcvt s7, d7\",\n        \"str s7, [x15]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d4, d5, d4\",\n        \"fmul d4, d4, d6\",\n        \"add w15, w4, w11, lsl #2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x15, #4]\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s4, [x15, #8]\",\n        \"fcvt d4, s4\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s5, [x15, #8]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s5, [x15, #12]\",\n        \"fcvt d5, s5\",\n        \"fneg v5.2d, v5.2d\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s6, [x15, #12]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s6, [x15, #8]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s7, [x15, #8]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #20]\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s6, [x15, #12]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s7, [x15, #12]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #28]\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s6, [x15, #8]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #8]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #12]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #12]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #16]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #8]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #8]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #32]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #12]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #12]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #24]\",\n        \"fadd d7, d6, d4\",\n        \"add w15, w4, w7, lsl #2\",\n        \"fcvt s7, d7\",\n        \"str s7, [x15, #8]\",\n        \"ldr s7, [x8, #16]\",\n        \"fcvt d7, s7\",\n        \"fsub d7, d5, d7\",\n        \"add w15, w4, w7, lsl #2\",\n        \"fcvt s7, d7\",\n        \"str s7, [x15, #12]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d4, d4, d6\",\n        \"add w15, w4, w5, lsl #2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x15, #8]\",\n        \"ldr s4, [x8, #16]\",\n        \"fcvt d4, s4\",\n        \"fadd d4, d4, d5\",\n        \"add w15, w4, w5, lsl #2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x15, #12]\",\n        \"ldr s4, [x8, #24]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #20]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #32]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #28]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fmul d6, d3, d4\",\n        \"fmul d7, d2, d5\",\n        \"fsub d6, d6, d7\",\n        \"add w15, w4, w10, lsl #2\",\n        \"fcvt s8, d6\",\n        \"str s8, [x15, #8]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d3, d3, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d2, d2, d4\",\n        \"fadd d2, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"add w15, w4, w10, lsl #2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x15, #12]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldr s2, [x8, #20]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #24]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x8, #28]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #32]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"ldr s4, [x8, #44]\",\n        \"fcvt d4, s4\",\n        \"fmul d4, d4, d3\",\n        \"ldr s5, [x8, #40]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d2\",\n        \"fadd d4, d4, d5\",\n        \"add w15, w4, w11, lsl #2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x15, #8]\",\n        \"ldr s4, [x8, #40]\",\n        \"fcvt d4, s4\",\n        \"fmul d4, d4, d3\",\n        \"ldr s5, [x8, #44]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d2\",\n        \"fsub d4, d4, d5\",\n        \"add w15, w4, w11, lsl #2\",\n        \"fcvt s8, d4\",\n        \"str s8, [x15, #12]\",\n        \"ldp w11, w10, [x8], #8\",\n        \"ldp w9, w6, [x8], #8\",\n        \"mvn w27, w8\",\n        \"adds w26, w8, #0x74 (116)\",\n        \"cfinv\",\n        \"mov x8, x26\",\n        \"strb w20, [x28, #1051]\",\n        \"str d7, [x22, #1056]\",\n        \"str d6, [x14, #1056]\",\n        \"str d5, [x13, #1056]\",\n        \"str d4, [x12, #1056]\",\n        \"str d3, [x23, #1056]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xfcfc\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block9\": {\n      \"x86InstructionCount\": 222,\n      \"ExpectedInstructionCount\": 494,\n      \"x86Insts\": [\n        \"fadd dword [esp + 0x40]\",\n        \"lea edx,[ecx + ecx*0x2]\",\n        \"lea esi,[edx + ecx*0x2]\",\n        \"lea ebx,[ecx + -0x2]\",\n        \"fmul dword [esp + 0x74]\",\n        \"fld dword [esp + 0x34]\",\n        \"lea edi,[esi + ecx*0x2]\",\n        \"fadd dword [esp + 0x40]\",\n        \"fmul dword [esp + 0x74]\",\n        \"fld dword [esp + 0x38]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x30]\",\n        \"fld dword [esp + 0x3c]\",\n        \"fsub dword [esp + 0x40]\",\n        \"fmul dword [esp + 0x78]\",\n        \"fstp dword [esp + 0x2c]\",\n        \"fld dword [eax + esi*0x4 + -0x8]\",\n        \"fadd dword [eax + ebx*0x4]\",\n        \"fld dword [eax + ecx*0x4 + -0x4]\",\n        \"fadd dword [eax + esi*0x4 + -0x4]\",\n        \"fld dword [eax + ebx*0x4]\",\n        \"fsub dword [eax + esi*0x4 + -0x8]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [eax + ecx*0x4 + -0x4]\",\n        \"fsub dword [eax + esi*0x4 + -0x4]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [eax + edi*0x4 + -0x8]\",\n        \"fadd dword [eax + edx*0x4 + -0x8]\",\n        \"fld dword [eax + edx*0x4 + -0x4]\",\n        \"fadd dword [eax + edi*0x4 + -0x4]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + edx*0x4 + -0x8]\",\n        \"fsub dword [eax + edi*0x4 + -0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [eax + edx*0x4 + -0x4]\",\n        \"fsub dword [eax + edi*0x4 + -0x4]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + ebx*0x4]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + ecx*0x4 + -0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + edx*0x4 + -0x8]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + edx*0x4 + -0x4]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld st3\",\n        \"fmul st2\",\n        \"fld st3\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [eax + esi*0x4 + -0x8]\",\n        \"fld st3\",\n        \"fmul st1\",\n        \"fld st3\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [eax + esi*0x4 + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [eax + edi*0x4 + -0x8]\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [eax + edi*0x4 + -0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [eax + ecx*0x4]\",\n        \"fadd dword [eax + esi*0x4]\",\n        \"fld dword [eax + ecx*0x4 + 0x4]\",\n        \"fadd dword [eax + esi*0x4 + 0x4]\",\n        \"fld dword [eax + ecx*0x4]\",\n        \"fsub dword [eax + esi*0x4]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [eax + ecx*0x4 + 0x4]\",\n        \"fsub dword [eax + esi*0x4 + 0x4]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [eax + edx*0x4]\",\n        \"fadd dword [eax + edi*0x4]\",\n        \"fld dword [eax + edx*0x4 + 0x4]\",\n        \"fadd dword [eax + edi*0x4 + 0x4]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + edx*0x4]\",\n        \"fsub dword [eax + edi*0x4]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [eax + edx*0x4 + 0x4]\",\n        \"fsub dword [eax + edi*0x4 + 0x4]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + ecx*0x4]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + ecx*0x4 + 0x4]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + edx*0x4]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + edx*0x4 + 0x4]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld st1\",\n        \"fsub st0,st1\",\n        \"fmul dword [esp + 0x40]\",\n        \"fstp dword [eax + esi*0x4]\",\n        \"fadd st0,st1\",\n        \"fmul dword [esp + 0x40]\",\n        \"fstp dword [eax + esi*0x4 + 0x4]\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x40]\",\n        \"fchs\",\n        \"fld st1\",\n        \"fadd st0,st3\",\n        \"fmul st1\",\n        \"fstp dword [eax + edi*0x4]\",\n        \"fxch\",\n        \"fsub st0,st2\",\n        \"fmul st1\",\n        \"fstp dword [eax + edi*0x4 + 0x4]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [eax + ecx*0x4 + 0x8]\",\n        \"fadd dword [eax + esi*0x4 + 0x8]\",\n        \"fld dword [eax + ecx*0x4 + 0xc]\",\n        \"fadd dword [eax + esi*0x4 + 0xc]\",\n        \"fld dword [eax + ecx*0x4 + 0x8]\",\n        \"fsub dword [eax + esi*0x4 + 0x8]\",\n        \"fstp dword [esp + 0x18]\",\n        \"fld dword [eax + ecx*0x4 + 0xc]\",\n        \"fsub dword [eax + esi*0x4 + 0xc]\",\n        \"fstp dword [esp + 0x1c]\",\n        \"fld dword [eax + edi*0x4 + 0x8]\",\n        \"fadd dword [eax + edx*0x4 + 0x8]\",\n        \"fld dword [eax + edi*0x4 + 0xc]\",\n        \"fadd dword [eax + edx*0x4 + 0xc]\",\n        \"fstp dword [esp + 0x10]\",\n        \"fld dword [eax + edx*0x4 + 0x8]\",\n        \"fsub dword [eax + edi*0x4 + 0x8]\",\n        \"fstp dword [esp + 0x20]\",\n        \"fld dword [eax + edx*0x4 + 0xc]\",\n        \"fsub dword [eax + edi*0x4 + 0xc]\",\n        \"fstp dword [esp + 0x14]\",\n        \"fld st0\",\n        \"fadd st0,st3\",\n        \"fstp dword [eax + ecx*0x4 + 0x8]\",\n        \"fld dword [esp + 0x10]\",\n        \"fadd st0,st2\",\n        \"fstp dword [eax + ecx*0x4 + 0xc]\",\n        \"fxch st2\",\n        \"fsub st0,st2\",\n        \"fstp dword [eax + edx*0x4 + 0x8]\",\n        \"fstp st1\",\n        \"fsub dword [esp + 0x10]\",\n        \"fstp dword [eax + edx*0x4 + 0xc]\",\n        \"fld dword [esp + 0x18]\",\n        \"fsub dword [esp + 0x14]\",\n        \"fld dword [esp + 0x20]\",\n        \"fadd dword [esp + 0x1c]\",\n        \"fld st2\",\n        \"fmul st2\",\n        \"fld st4\",\n        \"fmul st2\",\n        \"fsubp\",\n        \"fstp dword [eax + esi*0x4 + 0x8]\",\n        \"fxch st2\",\n        \"fmul st2\",\n        \"fxch st3\",\n        \"fmul st1\",\n        \"faddp st3,st0\",\n        \"fxch st2\",\n        \"fstp dword [eax + esi*0x4 + 0xc]\",\n        \"fstp st0\",\n        \"fstp st0\",\n        \"fld dword [esp + 0x14]\",\n        \"fadd dword [esp + 0x18]\",\n        \"fld dword [esp + 0x1c]\",\n        \"fsub dword [esp + 0x20]\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st3\",\n        \"faddp\",\n        \"fstp dword [eax + edi*0x4 + 0x8]\",\n        \"fld dword [esp + 0x2c]\",\n        \"fmul st1\",\n        \"fld dword [esp + 0x30]\",\n        \"fmul st3\",\n        \"fsubp\",\n        \"fstp dword [eax + edi*0x4 + 0xc]\",\n        \"pop edi\",\n        \"pop esi\",\n        \"fstp st0\",\n        \"pop ebp\",\n        \"fstp st0\",\n        \"pop ebx\",\n        \"add esp,0x74\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x8, #64]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w5, w7, w7, lsl #1\",\n        \"add w10, w5, w7, lsl #1\",\n        \"sub w6, w7, #0x2 (2)\",\n        \"ldr s3, [x8, #116]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldr s3, [x8, #52]\",\n        \"fcvt d3, s3\",\n        \"add w22, w20, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add w11, w10, w7, lsl #1\",\n        \"ldr s4, [x8, #64]\",\n        \"fcvt d4, s4\",\n        \"add x23, x28, x22, lsl #4\",\n        \"fadd d3, d3, d4\",\n        \"ldr s4, [x8, #116]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"ldr s4, [x8, #56]\",\n        \"fcvt d4, s4\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"ldr s5, [x8, #64]\",\n        \"fcvt d5, s5\",\n        \"add x12, x28, x22, lsl #4\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #120]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #48]\",\n        \"ldr s4, [x8, #60]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #64]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #120]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"fcvt s4, d4\",\n        \"str s4, [x8, #44]\",\n        \"add w13, w4, w10, lsl #2\",\n        \"ldur s4, [x13, #-8]\",\n        \"fcvt d4, s4\",\n        \"add w13, w4, w6, lsl #2\",\n        \"ldr s5, [x13]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"add w13, w4, w7, lsl #2\",\n        \"ldur s5, [x13, #-4]\",\n        \"fcvt d5, s5\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add w13, w4, w10, lsl #2\",\n        \"ldur s6, [x13, #-4]\",\n        \"fcvt d6, s6\",\n        \"add x13, x28, x22, lsl #4\",\n        \"fadd d5, d5, d6\",\n        \"add w14, w4, w6, lsl #2\",\n        \"ldr s6, [x14]\",\n        \"fcvt d6, s6\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add w14, w4, w10, lsl #2\",\n        \"ldur s7, [x14, #-8]\",\n        \"fcvt d7, s7\",\n        \"add x14, x28, x22, lsl #4\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #24]\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldur s6, [x15, #-4]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldur s7, [x15, #-4]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #28]\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s6, [x15, #-8]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s7, [x15, #-8]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s7, [x15, #-4]\",\n        \"fcvt d7, s7\",\n        \"add w22, w22, #0x7 (7)\",\n        \"and w22, w22, #0x7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s8, [x15, #-4]\",\n        \"fcvt d8, s8\",\n        \"add x22, x28, x22, lsl #4\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #16]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s7, [x15, #-8]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s8, [x15, #-8]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #32]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldur s7, [x15, #-4]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldur s8, [x15, #-4]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #20]\",\n        \"fadd d7, d6, d4\",\n        \"add w15, w4, w6, lsl #2\",\n        \"fcvt s7, d7\",\n        \"str s7, [x15]\",\n        \"ldr s7, [x8, #16]\",\n        \"fcvt d7, s7\",\n        \"fadd d7, d7, d5\",\n        \"add w15, w4, w7, lsl #2\",\n        \"fcvt s7, d7\",\n        \"stur s7, [x15, #-4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d4, d4, d6\",\n        \"add w15, w4, w5, lsl #2\",\n        \"fcvt s4, d4\",\n        \"stur s4, [x15, #-8]\",\n        \"ldr s4, [x8, #16]\",\n        \"fcvt d4, s4\",\n        \"fsub d4, d5, d4\",\n        \"add w15, w4, w5, lsl #2\",\n        \"fcvt s4, d4\",\n        \"stur s4, [x15, #-4]\",\n        \"ldr s4, [x8, #24]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #20]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #32]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #28]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fmul d6, d2, d4\",\n        \"fmul d7, d3, d5\",\n        \"fsub d6, d6, d7\",\n        \"add w15, w4, w10, lsl #2\",\n        \"fcvt s6, d6\",\n        \"stur s6, [x15, #-8]\",\n        \"fmul d5, d2, d5\",\n        \"fmul d4, d3, d4\",\n        \"fadd d4, d5, d4\",\n        \"add w15, w4, w10, lsl #2\",\n        \"fcvt s4, d4\",\n        \"stur s4, [x15, #-4]\",\n        \"ldr s4, [x8, #20]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #24]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #28]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #32]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr s6, [x8, #44]\",\n        \"fcvt d6, s6\",\n        \"fmul d6, d6, d5\",\n        \"ldr s7, [x8, #48]\",\n        \"fcvt d7, s7\",\n        \"fmul d7, d7, d4\",\n        \"fadd d6, d6, d7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"fcvt s6, d6\",\n        \"stur s6, [x15, #-8]\",\n        \"ldr s6, [x8, #48]\",\n        \"fcvt d6, s6\",\n        \"fmul d5, d6, d5\",\n        \"ldr s6, [x8, #44]\",\n        \"fcvt d6, s6\",\n        \"fmul d4, d6, d4\",\n        \"fsub d4, d5, d4\",\n        \"add w15, w4, w11, lsl #2\",\n        \"fcvt s4, d4\",\n        \"stur s4, [x15, #-4]\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s4, [x15]\",\n        \"fcvt d4, s4\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s5, [x15]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s5, [x15, #4]\",\n        \"fcvt d5, s5\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s6, [x15, #4]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s6, [x15]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s7, [x15]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #24]\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s6, [x15, #4]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s7, [x15, #4]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #28]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s6, [x15]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s7, [x15]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #4]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #4]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #16]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #32]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #4]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #4]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #20]\",\n        \"fadd d7, d6, d4\",\n        \"add w15, w4, w7, lsl #2\",\n        \"fcvt s7, d7\",\n        \"str s7, [x15]\",\n        \"ldr s7, [x8, #16]\",\n        \"fcvt d7, s7\",\n        \"fadd d7, d7, d5\",\n        \"add w15, w4, w7, lsl #2\",\n        \"fcvt s7, d7\",\n        \"str s7, [x15, #4]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d4, d4, d6\",\n        \"add w15, w4, w5, lsl #2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x15]\",\n        \"ldr s4, [x8, #16]\",\n        \"fcvt d4, s4\",\n        \"fsub d4, d5, d4\",\n        \"add w15, w4, w5, lsl #2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x15, #4]\",\n        \"ldr s4, [x8, #24]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #20]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #32]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #28]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fsub d6, d4, d5\",\n        \"ldr s7, [x8, #64]\",\n        \"fcvt d7, s7\",\n        \"fmul d6, d6, d7\",\n        \"add w15, w4, w10, lsl #2\",\n        \"fcvt s6, d6\",\n        \"str s6, [x15]\",\n        \"fadd d4, d5, d4\",\n        \"ldr s5, [x8, #64]\",\n        \"fcvt d5, s5\",\n        \"fmul d4, d4, d5\",\n        \"add w15, w4, w10, lsl #2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x15, #4]\",\n        \"ldr s4, [x8, #20]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #24]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"ldr s5, [x8, #28]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #32]\",\n        \"fcvt d6, s6\",\n        \"fsub d5, d5, d6\",\n        \"ldr s6, [x8, #64]\",\n        \"fcvt d6, s6\",\n        \"fneg v6.2d, v6.2d\",\n        \"fadd d7, d5, d4\",\n        \"fmul d7, d7, d6\",\n        \"add w15, w4, w11, lsl #2\",\n        \"fcvt s7, d7\",\n        \"str s7, [x15]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d4, d5, d4\",\n        \"fmul d4, d4, d6\",\n        \"add w15, w4, w11, lsl #2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x15, #4]\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s4, [x15, #8]\",\n        \"fcvt d4, s4\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s5, [x15, #8]\",\n        \"fcvt d5, s5\",\n        \"fadd d4, d4, d5\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s5, [x15, #12]\",\n        \"fcvt d5, s5\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s6, [x15, #12]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s6, [x15, #8]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s7, [x15, #8]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #24]\",\n        \"add w15, w4, w7, lsl #2\",\n        \"ldr s6, [x15, #12]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w10, lsl #2\",\n        \"ldr s7, [x15, #12]\",\n        \"fcvt d7, s7\",\n        \"fsub d6, d6, d7\",\n        \"fcvt s6, d6\",\n        \"str s6, [x8, #28]\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s6, [x15, #8]\",\n        \"fcvt d6, s6\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #8]\",\n        \"fcvt d7, s7\",\n        \"fadd d6, d6, d7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s7, [x15, #12]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s8, [x15, #12]\",\n        \"fcvt d8, s8\",\n        \"fadd d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #16]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #8]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #8]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #32]\",\n        \"add w15, w4, w5, lsl #2\",\n        \"ldr s7, [x15, #12]\",\n        \"fcvt d7, s7\",\n        \"add w15, w4, w11, lsl #2\",\n        \"ldr s8, [x15, #12]\",\n        \"fcvt d8, s8\",\n        \"fsub d7, d7, d8\",\n        \"fcvt s7, d7\",\n        \"str s7, [x8, #20]\",\n        \"fadd d7, d6, d4\",\n        \"add w15, w4, w7, lsl #2\",\n        \"fcvt s7, d7\",\n        \"str s7, [x15, #8]\",\n        \"ldr s7, [x8, #16]\",\n        \"fcvt d7, s7\",\n        \"fadd d7, d7, d5\",\n        \"add w15, w4, w7, lsl #2\",\n        \"fcvt s7, d7\",\n        \"str s7, [x15, #12]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fsub d4, d4, d6\",\n        \"add w15, w4, w5, lsl #2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x15, #8]\",\n        \"ldr s4, [x8, #16]\",\n        \"fcvt d4, s4\",\n        \"fsub d4, d5, d4\",\n        \"add w15, w4, w5, lsl #2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x15, #12]\",\n        \"ldr s4, [x8, #24]\",\n        \"fcvt d4, s4\",\n        \"ldr s5, [x8, #20]\",\n        \"fcvt d5, s5\",\n        \"fsub d4, d4, d5\",\n        \"ldr s5, [x8, #32]\",\n        \"fcvt d5, s5\",\n        \"ldr s6, [x8, #28]\",\n        \"fcvt d6, s6\",\n        \"fadd d5, d5, d6\",\n        \"fmul d6, d3, d4\",\n        \"fmul d7, d2, d5\",\n        \"fsub d6, d6, d7\",\n        \"add w15, w4, w10, lsl #2\",\n        \"fcvt s8, d6\",\n        \"str s8, [x15, #8]\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d3, d3, d5\",\n        \"strb wzr, [x28, #1049]\",\n        \"fmul d2, d2, d4\",\n        \"fadd d2, d3, d2\",\n        \"strb wzr, [x28, #1049]\",\n        \"add w15, w4, w10, lsl #2\",\n        \"fcvt s2, d2\",\n        \"str s2, [x15, #12]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldr s2, [x8, #20]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x8, #24]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"ldr s3, [x8, #28]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x8, #32]\",\n        \"fcvt d4, s4\",\n        \"fsub d3, d3, d4\",\n        \"ldr s4, [x8, #48]\",\n        \"fcvt d4, s4\",\n        \"fmul d4, d4, d3\",\n        \"ldr s5, [x8, #44]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d2\",\n        \"fadd d4, d4, d5\",\n        \"add w15, w4, w11, lsl #2\",\n        \"fcvt s4, d4\",\n        \"str s4, [x15, #8]\",\n        \"ldr s4, [x8, #44]\",\n        \"fcvt d4, s4\",\n        \"fmul d4, d4, d3\",\n        \"ldr s5, [x8, #48]\",\n        \"fcvt d5, s5\",\n        \"fmul d5, d5, d2\",\n        \"fsub d4, d4, d5\",\n        \"add w15, w4, w11, lsl #2\",\n        \"fcvt s8, d4\",\n        \"str s8, [x15, #12]\",\n        \"ldp w11, w10, [x8], #8\",\n        \"ldp w9, w6, [x8], #8\",\n        \"mvn w27, w8\",\n        \"adds w26, w8, #0x74 (116)\",\n        \"cfinv\",\n        \"mov x8, x26\",\n        \"strb w20, [x28, #1051]\",\n        \"str d7, [x22, #1056]\",\n        \"str d6, [x14, #1056]\",\n        \"str d5, [x13, #1056]\",\n        \"str d4, [x12, #1056]\",\n        \"str d3, [x23, #1056]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xfcfc\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Block10\": {\n      \"x86InstructionCount\": 420,\n      \"ExpectedInstructionCount\": 594,\n      \"x86Insts\": [\n        \"push ebp\",\n        \"mov ebp,esp\",\n        \"sub esp,0x14\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x78\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x38\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x7c\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x3c\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x78\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x78\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x38\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x7c\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x7c\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x3c\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"lea edx,[eax + 0x38]\",\n        \"mov eax,dword [ebp + -0x8]\",\n        \"mov dword [edx],eax\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"lea edx,[eax + 0x3c]\",\n        \"mov eax,dword [ebp + -0x4]\",\n        \"mov dword [edx],eax\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x70\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x30\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x74\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x34\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x70\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x70\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x30\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x74\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x74\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x34\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x30\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x08553140]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x08553144]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x34\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x08553148]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x08553140]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x68\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x28\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x6c\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x2c\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x68\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x68\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x28\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x6c\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x6c\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x2c\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x28\",\n        \"fld dword [ebp + -0x8]\",\n        \"fsub dword [ebp + -0x4]\",\n        \"fld dword [0x0855313c]\",\n        \"fmulp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x2c\",\n        \"fld dword [ebp + -0x8]\",\n        \"fadd dword [ebp + -0x4]\",\n        \"fld dword [0x0855313c]\",\n        \"fmulp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x60\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x20\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x64\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x24\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x60\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x60\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x20\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x64\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x64\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x24\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x20\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x08553148]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x0855314c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x24\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x08553148]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x08553140]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x58\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x18\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x1c\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x5c\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x58\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x58\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x18\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x5c\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x5c\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x1c\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"lea edx,[eax + 0x18]\",\n        \"mov eax,dword [ebp + -0x4]\",\n        \"mov dword [edx],eax\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"lea edx,[eax + 0x1c]\",\n        \"mov eax,dword [ebp + -0x8]\",\n        \"mov dword [edx],eax\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x10\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x50\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x14\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x54\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x50\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x50\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x10\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x54\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x54\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x14\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x10\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x08553140]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x08553148]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x14\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x08553148]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x0855314c]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x8\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x48\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0xc\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x4c\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x48\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x48\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x8\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x4c\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x4c\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0xc\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x8\",\n        \"fld dword [ebp + -0x4]\",\n        \"fadd dword [ebp + -0x8]\",\n        \"fld dword [0x0855313c]\",\n        \"fmulp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0xc\",\n        \"fld dword [ebp + -0x4]\",\n        \"fsub dword [ebp + -0x8]\",\n        \"fld dword [0x0855313c]\",\n        \"fmulp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x40\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x8]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x4\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x44\",\n        \"fld dword [eax]\",\n        \"fsubp\",\n        \"fstp dword [ebp + -0x4]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"lea edx,[eax + 0x40]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x40\",\n        \"fld dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"fld dword [eax]\",\n        \"faddp\",\n        \"fstp dword [edx]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x44\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x44\",\n        \"fld dword [edx]\",\n        \"mov edx,dword [ebp + 0x8]\",\n        \"add edx,0x4\",\n        \"fld dword [edx]\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x08553148]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x08553140]\",\n        \"fmulp\",\n        \"faddp\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x4\",\n        \"fld dword [ebp + -0x4]\",\n        \"fld dword [0x08553140]\",\n        \"fmulp\",\n        \"fld dword [ebp + -0x8]\",\n        \"fld dword [0x08553144]\",\n        \"fmulp\",\n        \"faddp\",\n        \"fstp dword [eax]\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"mov dword [esp],eax\",\n        \"call 0x0816de98\",\n        \"mov eax,dword [ebp + 0x8]\",\n        \"add eax,0x40\",\n        \"mov dword [esp],eax\",\n        \"call 0x0816de98\",\n        \"leave\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str w9, [x8, #-4]!\",\n        \"mov x9, x8\",\n        \"sub w8, w8, #0x14 (20)\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x78 (120)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x38 (56)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x7c (124)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x3c (60)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x78 (120)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x78 (120)\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x38 (56)\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x7c (124)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x7c (124)\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x3c (60)\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w5, w4, #0x38 (56)\",\n        \"ldur w4, [x9, #-8]\",\n        \"str w4, [x5]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w5, w4, #0x3c (60)\",\n        \"ldur w4, [x9, #-4]\",\n        \"str w4, [x5]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x70 (112)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x30 (48)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x74 (116)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x34 (52)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x70 (112)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x70 (112)\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x30 (48)\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x74 (116)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x74 (116)\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x34 (52)\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x30 (48)\",\n        \"ldur s2, [x9, #-8]\",\n        \"fcvt d2, s2\",\n        \"mov w20, #0x3140\",\n        \"movk w20, #0x855, lsl #16\",\n        \"ldr s3, [x20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldur s3, [x9, #-4]\",\n        \"fcvt d3, s3\",\n        \"mov w21, #0x3144\",\n        \"movk w21, #0x855, lsl #16\",\n        \"ldr s4, [x21]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x34 (52)\",\n        \"ldur s2, [x9, #-8]\",\n        \"fcvt d2, s2\",\n        \"mov w22, #0x3148\",\n        \"movk w22, #0x855, lsl #16\",\n        \"ldr s3, [x22]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldur s3, [x9, #-4]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x20]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x68 (104)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x28 (40)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x6c (108)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x2c (44)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x68 (104)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x68 (104)\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x28 (40)\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x6c (108)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x6c (108)\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x2c (44)\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x28 (40)\",\n        \"ldur s2, [x9, #-8]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"mov w23, #0x313c\",\n        \"movk w23, #0x855, lsl #16\",\n        \"ldr s3, [x23]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x2c (44)\",\n        \"ldur s2, [x9, #-8]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-4]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"ldr s3, [x23]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x60 (96)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x20 (32)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x64 (100)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x24 (36)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x60 (96)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x60 (96)\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x20 (32)\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x64 (100)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x64 (100)\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x24 (36)\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x20 (32)\",\n        \"ldur s2, [x9, #-8]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x22]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldur s3, [x9, #-4]\",\n        \"fcvt d3, s3\",\n        \"mov w12, #0x314c\",\n        \"movk w12, #0x855, lsl #16\",\n        \"ldr s4, [x12]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x24 (36)\",\n        \"ldur s2, [x9, #-4]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x22]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldur s3, [x9, #-8]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x20]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x58 (88)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x18 (24)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x1c (28)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x5c (92)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x58 (88)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x58 (88)\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x18 (24)\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x5c (92)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x5c (92)\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x1c (28)\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w5, w4, #0x18 (24)\",\n        \"ldur w4, [x9, #-4]\",\n        \"str w4, [x5]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w5, w4, #0x1c (28)\",\n        \"ldur w4, [x9, #-8]\",\n        \"str w4, [x5]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x10 (16)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x50 (80)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x14 (20)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x54 (84)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x50 (80)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x50 (80)\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x10 (16)\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x54 (84)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x54 (84)\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x14 (20)\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x10 (16)\",\n        \"ldur s2, [x9, #-4]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldur s3, [x9, #-8]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x22]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x14 (20)\",\n        \"ldur s2, [x9, #-4]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x22]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldur s3, [x9, #-8]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x12]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x8 (8)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x48 (72)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0xc (12)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x4c (76)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x48 (72)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x48 (72)\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x8 (8)\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x4c (76)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x4c (76)\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0xc (12)\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x8 (8)\",\n        \"ldur s2, [x9, #-4]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-8]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"ldr s3, [x23]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0xc (12)\",\n        \"ldur s2, [x9, #-4]\",\n        \"fcvt d2, s2\",\n        \"ldur s3, [x9, #-8]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"ldr s3, [x23]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x40 (64)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-8]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x4 (4)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x44 (68)\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fsub d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"stur s2, [x9, #-4]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w5, w4, #0x40 (64)\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x40 (64)\",\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldr w4, [x9, #8]\",\n        \"ldr s3, [x4]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x5]\",\n        \"ldr w4, [x9, #8]\",\n        \"add w4, w4, #0x44 (68)\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x44 (68)\",\n        \"ldr s2, [x5]\",\n        \"fcvt d2, s2\",\n        \"ldr w5, [x9, #8]\",\n        \"add w5, w5, #0x4 (4)\",\n        \"ldr s3, [x5]\",\n        \"fcvt d3, s3\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldur s2, [x9, #-4]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x22]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldur s3, [x9, #-8]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x20]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"ldr w4, [x9, #8]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"adds w26, w4, #0x4 (4)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\",\n        \"ldur s2, [x9, #-4]\",\n        \"fcvt d2, s2\",\n        \"ldr s3, [x20]\",\n        \"fcvt d3, s3\",\n        \"fmul d2, d2, d3\",\n        \"ldur s3, [x9, #-8]\",\n        \"fcvt d3, s3\",\n        \"ldr s4, [x21]\",\n        \"fcvt d4, s4\",\n        \"fmul d3, d3, d4\",\n        \"fadd d2, d2, d3\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"ldr w4, [x9, #8]\",\n        \"str w4, [x8]\",\n        \"mov w20, #0x47c\",\n        \"movk w20, #0x1, lsl #16\",\n        \"str w20, [x8, #-4]!\",\n        \"cfinv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x8\",\n        \"sub w21, w23, w21\",\n        \"mov w23, #0xe0e0\",\n        \"lsr w21, w23, w21\",\n        \"bic w21, w22, w21\",\n        \"strb w21, [x28, #1202]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/FlagM/x87_f64.json",
    "content": "{\n  \"Features\": {\n    \"Env\": {\n      \"FEX_X87REDUCEDPRECISION\": \"1\"\n    },\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"fadd dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xd8 !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xd8 !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcom dword [rax]\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x21, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"fcomp dword [rax]\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xd8 !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w21, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x20\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w21, w22, w21\",\n        \"bic w20, w20, w21\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsub dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xd8 !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xd8 !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xd8 !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xd8 !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd8 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fadd d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st4\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st5\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st6\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st7\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd8 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fmul d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st4\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st5\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st6\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st7\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcom st0, st0\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xd8 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"mrs x20, nzcv\",\n        \"fcmp d2, d2\",\n        \"cset x21, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"fcom st0, st1\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xd8 11b 0xd1 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fcom st0, st2\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xd8 11b 0xd2 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fcom st0, st3\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xd8 11b 0xd3 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fcom st0, st4\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xd8 11b 0xd4 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fcom st0, st5\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xd8 11b 0xd5 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fcom st0, st6\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xd8 11b 0xd6 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fcom st0, st7\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xd8 11b 0xd7 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fcomp st0, st0\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xd8 11b 0xd8 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"fcmp d2, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st1\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xd8 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"mrs x22, nzcv\",\n        \"add x23, x28, x20, lsl #4\",\n        \"ldr d3, [x23, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x23, vs\",\n        \"axflag\",\n        \"cset x24, lo\",\n        \"cset x30, eq\",\n        \"strb w24, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w23, [x28, #1050]\",\n        \"strb w30, [x28, #1054]\",\n        \"msr nzcv, x22\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"0xd8 11b 0xda /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st3\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"0xd8 11b 0xdb /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st4\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"0xd8 11b 0xdc /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st5\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"0xd8 11b 0xdd /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st6\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"0xd8 11b 0xde /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st7\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"0xd8 11b 0xdf /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsub st0, st0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd8 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fsub d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st4\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st5\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st6\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st7\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr st0, st0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd8 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fsub d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr st0, st1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st4\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st5\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st6\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st7\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdiv st0, st0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd8 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fdiv d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st4\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st5\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st6\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st7\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr st0, st0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd8 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fdiv d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr st0, st1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st4\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st5\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st6\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st7\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fld dword [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xd9 !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst dword [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd9 !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\"\n      ]\n    },\n    \"fstp dword [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xd9 !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldenv [rax]\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xd9 !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"ubfx w21, w20, #10, #3\",\n        \"rbit w1, w21\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x21, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\",\n        \"strh w20, [x28, #1200]\",\n        \"ldr w20, [x4, #4]\",\n        \"ubfx w21, w20, #11, #3\",\n        \"strb w21, [x28, #1051]\",\n        \"ubfx w21, w20, #8, #1\",\n        \"ubfx w22, w20, #9, #1\",\n        \"ubfx w23, w20, #10, #1\",\n        \"ubfx w24, w20, #14, #1\",\n        \"ubfx w20, w20, #0, #1\",\n        \"strb w21, [x28, #1048]\",\n        \"strb w22, [x28, #1049]\",\n        \"strb w23, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\",\n        \"ldr w20, [x4, #8]\",\n        \"and w20, w20, w20, lsr #1\",\n        \"mov w21, #0x55555555\",\n        \"bic w20, w21, w20\",\n        \"orr w20, w20, w20, lsr #1\",\n        \"and w20, w20, #0x33333333\",\n        \"orr w20, w20, w20, lsr #2\",\n        \"and w20, w20, #0xf0f0f0f\",\n        \"orr w20, w20, w20, lsr #4\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldcw [rax]\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"ubfx w21, w20, #10, #3\",\n        \"rbit w1, w21\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x21, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\",\n        \"strh w20, [x28, #1200]\"\n      ]\n    },\n    \"fnstenv [rax]\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xd9 !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #1200]\",\n        \"str w20, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"str w20, [x4, #4]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"orr w20, w20, w20, lsl #4\",\n        \"and w20, w20, #0xf0f0f0f\",\n        \"orr w20, w20, w20, lsl #2\",\n        \"and w20, w20, #0x33333333\",\n        \"orr w20, w20, w20, lsl #1\",\n        \"and w20, w20, #0x55555555\",\n        \"orr w20, w20, w20, lsl #1\",\n        \"eor w20, w20, #0xffff\",\n        \"str w20, [x4, #8]\",\n        \"str wzr, [x4, #12]\",\n        \"str wzr, [x4, #16]\",\n        \"str wzr, [x4, #20]\",\n        \"str wzr, [x4, #24]\"\n      ]\n    },\n    \"fnstcw [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xd9 !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #1200]\",\n        \"strh w20, [x4]\"\n      ]\n    },\n    \"fld st0\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xd9 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st3\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st4\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st5\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st6\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st7\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"strb w20, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fxch st0, st0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xd9 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1049]\"\n      ]\n    },\n    \"fxch st0, st1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str d3, [x21, #1056]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str d3, [x21, #1056]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st3\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str d3, [x21, #1056]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st4\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str d3, [x21, #1056]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st5\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str d3, [x21, #1056]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st6\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str d3, [x21, #1056]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st7\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str d3, [x21, #1056]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fnop\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"0xd9 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"fchs\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd9 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fneg v2.2d, v2.2d\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fabs\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd9 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fabs d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"ftst\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mov w21, #0x0\",\n        \"fmov d3, x21\",\n        \"fcmp d2, d3\",\n        \"cset x21, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"fxam\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mov x21, v2.d[0]\",\n        \"lsr x21, x21, #63\",\n        \"strb w21, [x28, #1049]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"lsr w20, w21, w20\",\n        \"and w20, w20, #0x1\",\n        \"mrs x21, nzcv\",\n        \"cmp w20, #0x1 (1)\",\n        \"cset x22, ne\",\n        \"strb w22, [x28, #1048]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fld1\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xd9 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x3ff0000000000000\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldl2t\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xa372\",\n        \"movk x20, #0x979, lsl #16\",\n        \"movk x20, #0x934f, lsl #32\",\n        \"movk x20, #0x400a, lsl #48\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldl2e\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x82fe\",\n        \"movk x20, #0x652b, lsl #16\",\n        \"movk x20, #0x1547, lsl #32\",\n        \"movk x20, #0x3ff7, lsl #48\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldpi\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x2d18\",\n        \"movk x20, #0x5444, lsl #16\",\n        \"movk x20, #0x21fb, lsl #32\",\n        \"movk x20, #0x4009, lsl #48\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldlg2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x79ff\",\n        \"movk x20, #0x509f, lsl #16\",\n        \"movk x20, #0x4413, lsl #32\",\n        \"movk x20, #0x3fd3, lsl #48\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldln2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x39ef\",\n        \"movk x20, #0xfefa, lsl #16\",\n        \"movk x20, #0x2e42, lsl #32\",\n        \"movk x20, #0x3fe6, lsl #48\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldz\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xd9 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x0\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"f2xm1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xd9 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #2240]\",\n        \"ldr x3, [x28, #2248]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fyl2x\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"fmov d1, d2\",\n        \"ldr x0, [x28, #2256]\",\n        \"ldr x3, [x28, #2264]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x22, #1056]\"\n      ]\n    },\n    \"fptan\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"0xd9 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #2992]\",\n        \"str x30, [sp, #-16]!\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"mov x22, #0x3ff0000000000000\",\n        \"fmov d3, x22\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb w20, [x28, #1051]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"str d3, [x22, #1056]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fpatan\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"fmov d1, d2\",\n        \"ldr x0, [x28, #2224]\",\n        \"ldr x3, [x28, #2232]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"strb w20, [x28, #1051]\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fxtract\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"0xd9 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mov x22, v2.d[0]\",\n        \"mov x23, #0xfff0000000000000\",\n        \"fmov d3, x23\",\n        \"ubfx x23, x22, #52, #11\",\n        \"sub x23, x23, #0x3ff (1023)\",\n        \"scvtf d4, x23\",\n        \"and x23, x22, #0x800fffffffffffff\",\n        \"orr x23, x23, #0x3ff0000000000000\",\n        \"fmov d5, x23\",\n        \"mrs x23, nzcv\",\n        \"tst x22, #0x7fffffffffffffff\",\n        \"fcsel d2, d2, d5, eq\",\n        \"fcsel d3, d3, d4, eq\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"msr nzcv, x23\",\n        \"strb w20, [x28, #1051]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"str d3, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0x303\",\n        \"lsr w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fprem1\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"fmov d1, d2\",\n        \"ldr x0, [x28, #2288]\",\n        \"ldr x3, [x28, #2296]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"strb wzr, [x28, #1050]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdecstp\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xd9 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"fincstp\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xd9 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"fprem\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"fmov d1, d2\",\n        \"ldr x0, [x28, #2272]\",\n        \"ldr x3, [x28, #2280]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"strb wzr, [x28, #1050]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fyl2xp1\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xd9 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x3ff0000000000000\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"fmov d1, d3\",\n        \"ldr x0, [x28, #2256]\",\n        \"ldr x3, [x28, #2264]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"strb w20, [x28, #1051]\",\n        \"str d3, [x22, #1056]\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsqrt\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd9 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fsqrt d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsincos\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xd9 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #2976]\",\n        \"str x30, [sp, #-16]!\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #2984]\",\n        \"str x30, [sp, #-16]!\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb w20, [x28, #1051]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"str d3, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"frndint\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd9 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"frinti d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fscale\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"fmov d1, d2\",\n        \"ldr x0, [x28, #2304]\",\n        \"ldr x3, [x28, #2312]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsin\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xd9 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #2976]\",\n        \"str x30, [sp, #-16]!\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"strb wzr, [x28, #1050]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcos\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xd9 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #2984]\",\n        \"str x30, [sp, #-16]!\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"strb wzr, [x28, #1050]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fiadd dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fimul dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"ficom dword [rax]\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xda !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x21, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"ficomp dword [rax]\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xda !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w21, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x20\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w21, w22, w21\",\n        \"bic w20, w20, w21\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisub dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fisubr dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fidiv dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fidivr dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda 11b 0xd0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st0\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xda 11b 0xd8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xd9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xda /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st3\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st4\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st5\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st6\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xde /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st7\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fucompp\": {\n      \"ExpectedInstructionCount\": 28,\n      \"Comment\": [\n        \"0xda 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"mrs x22, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w20, w21, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"msr nzcv, x22\",\n        \"strb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xc0c0\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fild dword [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdf !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisttp dword [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdb !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fcvtzs w21, d2\",\n        \"str w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fist dword [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdb !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"frinti d0, d2\",\n        \"fcvtzs w20, d0\",\n        \"str w20, [x4]\"\n      ]\n    },\n    \"fistp dword [rax]\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdf !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"frinti d0, d2\",\n        \"fcvtzs w21, d0\",\n        \"str w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld tword [rax]\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xdb !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"add x20, x4, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp tword [rax]\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xdb !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str d2, [x4]\",\n        \"mov x21, v2.d[1]\",\n        \"strh w21, [x4, #8]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcmovnb st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xdb 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xdb 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xdb 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd1 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd2 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd3 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd4 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd5 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd6 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd7 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st0\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xd8 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xda /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st3\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdb /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st4\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdc /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st5\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdd /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st6\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xde /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st7\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdf /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fnclex\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xdb 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1040]\"\n      ]\n    },\n    \"fninit\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdb 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x0\",\n        \"rbit w1, w20\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x20, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\",\n        \"mov w20, #0x37f\",\n        \"strh w20, [x28, #1200]\",\n        \"strb wzr, [x28, #1051]\",\n        \"strb wzr, [x28, #1202]\",\n        \"strb wzr, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb wzr, [x28, #1054]\",\n        \"strb wzr, [x28, #1040]\"\n      ]\n    },\n    \"fucomi st0, st0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdb 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fcmp d2, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fucomi st0, st1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fucomi st0, st2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fucomi st0, st3\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fucomi st0, st4\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fucomi st0, st5\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fucomi st0, st6\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fucomi st0, st7\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fcomi st0, st0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdb 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fcmp d2, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fcomi st0, st1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fcomi st0, st2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fcomi st0, st3\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fcomi st0, st4\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fcomi st0, st5\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fcomi st0, st6\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fcomi st0, st7\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\"\n      ]\n    },\n    \"fadd qword [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdc !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul qword [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdc !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcom qword [rax]\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xdc !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x21, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"fcomp qword [rax]\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"0xdc !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w21, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x20\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w21, w22, w21\",\n        \"bic w20, w20, w21\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsub qword [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdc !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr qword [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdc !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv qword [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdc !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr qword [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdc !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xc0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"fadd st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fadd d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st1, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st2, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st3, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st4, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st5, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st6, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st7, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xc8\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"fmul st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fmul d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st1, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st2, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st3, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st4, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st5, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st6, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st7, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xe0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"fsubr st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fsub d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr st1, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st2, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st3, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st4, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st5, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st6, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st7, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xe8\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"fsub st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fsub d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st1, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st2, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st3, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st4, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st5, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st6, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st7, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xf0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"fdivr st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fdiv d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr st1, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st2, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st3, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st4, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st5, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st6, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st7, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xf8\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"fdiv st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fdiv d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st1, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st2, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st3, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st4, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st5, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st6, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st7, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fld qword [rax]\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisttp qword [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdd !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fcvtzs x21, d2\",\n        \"str x21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst qword [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdd !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"str d2, [x4]\"\n      ]\n    },\n    \"fstp qword [rax]\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"str d2, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"frstor [rax]\": {\n      \"ExpectedInstructionCount\": 141,\n      \"Comment\": [\n        \"0xdd !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"strh w20, [x28, #1200]\",\n        \"lsr w20, w20, #10\",\n        \"and w20, w20, #0x3\",\n        \"rbit w1, w20\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x20, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\",\n        \"ldr w20, [x4, #4]\",\n        \"ubfx w21, w20, #11, #3\",\n        \"strb w21, [x28, #1051]\",\n        \"ubfx w22, w20, #8, #1\",\n        \"ubfx w23, w20, #9, #1\",\n        \"ubfx w24, w20, #10, #1\",\n        \"ubfx w30, w20, #14, #1\",\n        \"ubfx w20, w20, #0, #1\",\n        \"strb w22, [x28, #1048]\",\n        \"strb w23, [x28, #1049]\",\n        \"strb w24, [x28, #1050]\",\n        \"strb w30, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\",\n        \"ldr w20, [x4, #8]\",\n        \"and w20, w20, w20, lsr #1\",\n        \"mov w22, #0x55555555\",\n        \"bic w20, w22, w20\",\n        \"orr w20, w20, w20, lsr #1\",\n        \"and w20, w20, #0x33333333\",\n        \"orr w20, w20, w20, lsr #2\",\n        \"and w20, w20, #0xf0f0f0f\",\n        \"orr w20, w20, w20, lsr #4\",\n        \"strb w20, [x28, #1202]\",\n        \"mov x20, #0xffffffffffffffff\",\n        \"mov w22, #0xffff\",\n        \"fmov d2, x20\",\n        \"fmov v2.D[1], x22\",\n        \"ldur q3, [x4, #28]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"add x0, x28, x21, lsl #4\",\n        \"str d3, [x0, #1056]\",\n        \"add w20, w21, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #38]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str d3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldr q3, [x4, #48]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str d3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #58]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str d3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #68]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str d3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #78]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str d3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #88]\",\n        \"and v2.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str d2, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur d2, [x4, #98]\",\n        \"ldr h3, [x4, #106]\",\n        \"mov v2.h[4], v3.h[0]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str d2, [x0, #1056]\"\n      ]\n    },\n    \"fnsave [rax]\": {\n      \"ExpectedInstructionCount\": 143,\n      \"Comment\": [\n        \"0xdd !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrh w21, [x28, #1200]\",\n        \"str w21, [x4]\",\n        \"ldrb w21, [x28, #1051]\",\n        \"lsl x21, x21, #11\",\n        \"ldrb w22, [x28, #1048]\",\n        \"orr x21, x21, x22, lsl #8\",\n        \"ldrb w22, [x28, #1049]\",\n        \"orr x21, x21, x22, lsl #9\",\n        \"ldrb w22, [x28, #1050]\",\n        \"orr x21, x21, x22, lsl #10\",\n        \"ldrb w22, [x28, #1054]\",\n        \"orr x21, x21, x22, lsl #14\",\n        \"ldrb w22, [x28, #1040]\",\n        \"orr x21, x21, x22\",\n        \"str w21, [x4, #4]\",\n        \"mov w21, #0x0\",\n        \"ldrb w22, [x28, #1202]\",\n        \"orr w22, w22, w22, lsl #4\",\n        \"and w22, w22, #0xf0f0f0f\",\n        \"orr w22, w22, w22, lsl #2\",\n        \"and w22, w22, #0x33333333\",\n        \"orr w22, w22, w22, lsl #1\",\n        \"and w22, w22, #0x55555555\",\n        \"orr w22, w22, w22, lsl #1\",\n        \"eor w22, w22, #0xffff\",\n        \"str w22, [x4, #8]\",\n        \"str wzr, [x4, #12]\",\n        \"str wzr, [x4, #16]\",\n        \"str wzr, [x4, #20]\",\n        \"str wzr, [x4, #24]\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"stur q2, [x4, #28]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"stur q2, [x4, #38]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x4, #48]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"stur q2, [x4, #58]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"stur q2, [x4, #68]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"stur q2, [x4, #78]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"stur q2, [x4, #88]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"stur d2, [x4, #98]\",\n        \"dup v2.8h, v2.h[4]\",\n        \"str h2, [x4, #106]\",\n        \"rbit w1, w21\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x21, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\",\n        \"mov w20, #0x37f\",\n        \"strh w20, [x28, #1200]\",\n        \"strb wzr, [x28, #1051]\",\n        \"strb wzr, [x28, #1202]\",\n        \"strb wzr, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb wzr, [x28, #1054]\",\n        \"strb wzr, [x28, #1040]\"\n      ]\n    },\n    \"fnstsw [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdd !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"strh w20, [x4]\"\n      ]\n    },\n    \"ffree st0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdd 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st3\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st4\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st5\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st6\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st7\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"0xdd 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"fst st1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd1 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd2 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st3\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd3 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st4\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd4 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st5\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd5 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st6\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd6 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st7\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd7 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st0\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdd 11b 0xd8 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xdd 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xda /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st3\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdb /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st4\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdc /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st5\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdd /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st6\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xde /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st7\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdf /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucom st0\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdd 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"mrs x20, nzcv\",\n        \"fcmp d2, d2\",\n        \"cset x21, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"fucom st1\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdd 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fucom st2\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdd 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fucom st3\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdd 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fucom st4\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdd 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fucom st5\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdd 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fucom st6\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdd 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fucom st7\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdd 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fucomp st0\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xdd 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"fcmp d2, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st1\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xdd 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"mrs x22, nzcv\",\n        \"add x23, x28, x20, lsl #4\",\n        \"ldr d3, [x23, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x23, vs\",\n        \"axflag\",\n        \"cset x24, lo\",\n        \"cset x30, eq\",\n        \"strb w24, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w23, [x28, #1050]\",\n        \"strb w30, [x28, #1054]\",\n        \"msr nzcv, x22\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"0xdd 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st3\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"0xdd 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st4\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"0xdd 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st5\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"0xdd 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st6\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"0xdd 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st7\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"0xdd 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fiadd word [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xde !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fimul word [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xde !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"ficom word [rax]\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x21, vs\",\n        \"axflag\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"ficomp word [rax]\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xde !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w21, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x20\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w21, w22, w21\",\n        \"bic w20, w20, w21\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisub word [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xde !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fisubr word [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xde !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fidiv word [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xde !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fidivr word [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xde !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"faddp st0\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xd8 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fadd d2, d2, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xde 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st3\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st4\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st5\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st6\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st7\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st0\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xde 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fmul d2, d2, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xde 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st3\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st4\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st5\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st6\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st7\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcompp\": {\n      \"ExpectedInstructionCount\": 28,\n      \"Comment\": [\n        \"0xde 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"mrs x22, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"axflag\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w20, w21, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"msr nzcv, x22\",\n        \"strb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xc0c0\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xe0\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"fsubrp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fsub d2, d2, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st1, st0\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xde 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"add x23, x28, x20, lsl #4\",\n        \"ldr d3, [x23, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st2, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st3, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st4, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st5, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st6, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st7, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xe8\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"fsubp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fsub d2, d2, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st1, st0\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xde 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st2, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st3, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st4, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st5, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st6, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st7, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xf0\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"fdivrp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fdiv d2, d2, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st1, st0\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xde 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"add x23, x28, x20, lsl #4\",\n        \"ldr d3, [x23, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st2, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st3, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st4, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st5, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st6, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st7, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xf8\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"fdivp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fdiv d2, d2, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st1, st0\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xde 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st2, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st3, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st4, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st5, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st6, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st7, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fild word [rax]\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdf !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisttp word [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdf !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fcvtzs x21, d2\",\n        \"strh w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fist word [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdf !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"frinti d0, d2\",\n        \"fcvtzs x20, d0\",\n        \"strh w20, [x4]\"\n      ]\n    },\n    \"fistp word [rax]\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdf !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"frinti d0, d2\",\n        \"fcvtzs x21, d0\",\n        \"strh w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fbld tword [rax]\": {\n      \"ExpectedInstructionCount\": 28,\n      \"Comment\": [\n        \"0xdf !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"add x20, x4, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #2000]\",\n        \"ldr x3, [x28, #2008]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fbstp tword [rax]\": {\n      \"ExpectedInstructionCount\": 28,\n      \"Comment\": [\n        \"0xdf !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1984]\",\n        \"ldr x3, [x28, #1992]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str d2, [x4]\",\n        \"mov x21, v2.d[1]\",\n        \"strh w21, [x4, #8]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffreep st0\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st3\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st4\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st5\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st6\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st7\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"fnstsw ax\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdf 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"fucomip st0\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdf 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fcmp d2, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdf 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st2\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdf 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st3\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdf 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st4\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdf 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st5\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdf 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st6\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdf 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st7\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdf 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st0\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdf 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fcmp d2, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdf 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st2\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdf 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st3\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdf 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st4\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdf 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st5\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdf 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st6\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdf 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st7\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xdf 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"axflag\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"memcpy4_32\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 16,\n      \"x86Insts\": [\n        \"fld dword [rax]\",\n        \"fstp dword [rdx]\",\n        \"fld dword [rax + 4]\",\n        \"fstp dword [rdx + 4]\",\n        \"fld dword [rax + 8]\",\n        \"fstp dword [rdx + 8]\",\n        \"fld dword [rax + 12]\",\n        \"fstp dword [rdx + 12]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str s2, [x5]\",\n        \"ldr s2, [x4, #4]\",\n        \"str s2, [x5, #4]\",\n        \"ldr s2, [x4, #8]\",\n        \"str s2, [x5, #8]\",\n        \"ldr s2, [x4, #12]\",\n        \"str s2, [x5, #12]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"memcpy4_64\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 16,\n      \"x86Insts\": [\n        \"fld qword [rax]\",\n        \"fstp qword [rdx]\",\n        \"fld qword [rax + 8]\",\n        \"fstp qword [rdx + 8]\",\n        \"fld qword [rax + 16]\",\n        \"fstp qword [rdx + 16]\",\n        \"fld qword [rax + 32]\",\n        \"fstp qword [rdx + 32]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str d2, [x5]\",\n        \"ldr d2, [x4, #8]\",\n        \"str d2, [x5, #8]\",\n        \"ldr d2, [x4, #16]\",\n        \"str d2, [x5, #16]\",\n        \"ldr d2, [x4, #32]\",\n        \"str d2, [x5, #32]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"memcpy4_80\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 38,\n      \"x86Insts\": [\n        \"fld tword [rax]\",\n        \"fstp tword [rdx]\",\n        \"fld tword [rax + 10]\",\n        \"fstp tword [rdx + 10]\",\n        \"fld tword [rax + 20]\",\n        \"fstp tword [rdx + 20]\",\n        \"fld tword [rax + 30]\",\n        \"fstp tword [rdx + 30]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"add x20, x4, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"str d2, [x5]\",\n        \"mov x20, v2.d[1]\",\n        \"strh w20, [x5, #8]\",\n        \"add x20, x4, #0xa (10)\",\n        \"ldr d2, [x20]\",\n        \"add x20, x20, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"stur d2, [x5, #10]\",\n        \"mov x20, v2.d[1]\",\n        \"add x21, x5, #0xa (10)\",\n        \"strh w20, [x21, #8]\",\n        \"add x20, x4, #0x14 (20)\",\n        \"ldr d2, [x20]\",\n        \"add x20, x20, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"stur d2, [x5, #20]\",\n        \"mov x20, v2.d[1]\",\n        \"add x21, x5, #0x14 (20)\",\n        \"strh w20, [x21, #8]\",\n        \"add x20, x4, #0x1e (30)\",\n        \"ldr d2, [x20]\",\n        \"add x20, x20, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"stur d2, [x5, #30]\",\n        \"mov x20, v2.d[1]\",\n        \"add x21, x5, #0x1e (30)\",\n        \"strh w20, [x21, #8]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/H0F38.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"CRYPTO\"\n    ]\n  },\n  \"Instructions\": {\n    \"pshufb mm0, mm1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"NP 0x0f 0x38 0x00\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"movi v4.16b, #0x87\",\n        \"and v3.8b, v3.8b, v4.8b\",\n        \"tbl v2.8b, {v2.16b}, v3.8b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pshufb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x00\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.16b, #0x8f\",\n        \"and v2.16b, v17.16b, v2.16b\",\n        \"tbl v16.16b, {v16.16b}, v2.16b\"\n      ]\n    },\n    \"phaddw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"NP 0x0f 0x38 0x01\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"addp v2.4h, v3.4h, v2.4h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"phaddw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x01\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"addp v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"phaddd mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"NP 0x0f 0x38 0x02\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"addp v2.2s, v3.2s, v2.2s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"phaddd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x02\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"addp v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"phaddsw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"NP 0x0f 0x38 0x03\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"uzp1 v4.4h, v2.4h, v3.4h\",\n        \"uzp2 v2.4h, v2.4h, v3.4h\",\n        \"sqadd v2.8h, v4.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"phaddsw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x03\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.8h, v16.8h, v17.8h\",\n        \"uzp2 v3.8h, v16.8h, v17.8h\",\n        \"sqadd v16.8h, v2.8h, v3.8h\"\n      ]\n    },\n    \"pmaddubsw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"NP 0x0f 0x38 0x04\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"uxtl v2.8h, v2.8b\",\n        \"sxtl v3.8h, v3.8b\",\n        \"smull v4.4s, v2.4h, v3.4h\",\n        \"smull2 v2.4s, v2.8h, v3.8h\",\n        \"addp v2.4s, v4.4s, v2.4s\",\n        \"sqxtn v2.4h, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pmaddubsw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"{u,s}xtl{,2} and uzp{1,2} can be more optimal\",\n        \"Up-front zero extend and sign extend the elements in place\",\n        \"This allows extracting even and odd elements up-front so we don't need the unzips at the end\",\n        \"Requires implementing IR ops for BIC (vector, immediate)\",\n        \"0x66 0x0f 0x38 0x04\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v2.8h, v16.8b\",\n        \"sxtl v3.8h, v17.8b\",\n        \"mul v2.8h, v2.8h, v3.8h\",\n        \"uxtl2 v3.8h, v16.16b\",\n        \"sxtl2 v4.8h, v17.16b\",\n        \"mul v3.8h, v3.8h, v4.8h\",\n        \"uzp1 v4.8h, v2.8h, v3.8h\",\n        \"uzp2 v2.8h, v2.8h, v3.8h\",\n        \"sqadd v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"phsubw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"NP 0x0f 0x38 0x05\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"uzp1 v4.4h, v2.4h, v3.4h\",\n        \"uzp2 v2.4h, v2.4h, v3.4h\",\n        \"sub v2.8h, v4.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"phsubw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x05\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.8h, v16.8h, v17.8h\",\n        \"uzp2 v3.8h, v16.8h, v17.8h\",\n        \"sub v16.8h, v2.8h, v3.8h\"\n      ]\n    },\n    \"phsubd mm0, mm1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"NP 0x0f 0x38 0x06\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"uzp1 v4.2s, v2.2s, v3.2s\",\n        \"uzp2 v2.2s, v2.2s, v3.2s\",\n        \"sub v2.4s, v4.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"phsubd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x06\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.4s, v16.4s, v17.4s\",\n        \"uzp2 v3.4s, v16.4s, v17.4s\",\n        \"sub v16.4s, v2.4s, v3.4s\"\n      ]\n    },\n    \"phsubsw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"NP 0x0f 0x38 0x07\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"uzp1 v4.4h, v2.4h, v3.4h\",\n        \"uzp2 v2.4h, v2.4h, v3.4h\",\n        \"sqsub v2.8h, v4.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"phsubsw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x07\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.8h, v16.8h, v17.8h\",\n        \"uzp2 v3.8h, v16.8h, v17.8h\",\n        \"sqsub v16.8h, v2.8h, v3.8h\"\n      ]\n    },\n    \"psignb mm0, mm1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"NP 0x0f 0x38 0x08\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"sqshl v2.8b, v2.8b, #7\",\n        \"srshr v2.8b, v2.8b, #7\",\n        \"mul v2.16b, v3.16b, v2.16b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psignb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x08\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqshl v2.16b, v17.16b, #7\",\n        \"srshr v2.16b, v2.16b, #7\",\n        \"mul v16.16b, v16.16b, v2.16b\"\n      ]\n    },\n    \"psignw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"NP 0x0f 0x38 0x09\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"sqshl v2.4h, v2.4h, #15\",\n        \"srshr v2.4h, v2.4h, #15\",\n        \"mul v2.8h, v3.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psignw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x09\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqshl v2.8h, v17.8h, #15\",\n        \"srshr v2.8h, v2.8h, #15\",\n        \"mul v16.8h, v16.8h, v2.8h\"\n      ]\n    },\n    \"psignd mm0, mm1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"NP 0x0f 0x38 0x0a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"sqshl v2.2s, v2.2s, #31\",\n        \"srshr v2.2s, v2.2s, #31\",\n        \"mul v2.4s, v3.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psignd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x0a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqshl v2.4s, v17.4s, #31\",\n        \"srshr v2.4s, v2.4s, #31\",\n        \"mul v16.4s, v16.4s, v2.4s\"\n      ]\n    },\n    \"pmulhrsw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Might be able to use sqdmulh\",\n        \"NP 0x0f 0x38 0x0b\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"smull v2.4s, v2.4h, v3.4h\",\n        \"sshr v2.4s, v2.4s, #14\",\n        \"movi v3.4s, #0x1\",\n        \"add v2.4s, v2.4s, v3.4s\",\n        \"shrn v2.4h, v2.4s, #1\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pmulhrsw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Might be able to use sqdmulh\",\n        \"0x66 0x0f 0x38 0x0b\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smull v2.4s, v16.4h, v17.4h\",\n        \"smull2 v3.4s, v16.8h, v17.8h\",\n        \"sshr v2.4s, v2.4s, #14\",\n        \"sshr v3.4s, v3.4s, #14\",\n        \"movi v4.4s, #0x1\",\n        \"add v2.4s, v2.4s, v4.4s\",\n        \"add v3.4s, v3.4s, v4.4s\",\n        \"shrn v2.4h, v2.4s, #1\",\n        \"mov v0.16b, v2.16b\",\n        \"shrn2 v0.8h, v3.4s, #1\",\n        \"mov v16.16b, v0.16b\"\n      ]\n    },\n    \"pblendvb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x10\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v2.16b, v16.16b, #7\",\n        \"bit v16.16b, v17.16b, v2.16b\"\n      ]\n    },\n    \"blendvps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x14\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v2.4s, v16.4s, #31\",\n        \"bit v16.16b, v17.16b, v2.16b\"\n      ]\n    },\n    \"blendvpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x15\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v2.2d, v16.2d, #63\",\n        \"bit v16.16b, v17.16b, v2.16b\"\n      ]\n    },\n    \"pblendvb xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x10\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v2.16b, v16.16b, #7\",\n        \"bit v17.16b, v18.16b, v2.16b\"\n      ]\n    },\n    \"blendvps xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x14\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v2.4s, v16.4s, #31\",\n        \"bit v17.16b, v18.16b, v2.16b\"\n      ]\n    },\n    \"blendvpd xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x15\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v2.2d, v16.2d, #63\",\n        \"bit v17.16b, v18.16b, v2.16b\"\n      ]\n    },\n    \"ptest xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x17\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and v2.16b, v16.16b, v17.16b\",\n        \"bic v3.16b, v17.16b, v16.16b\",\n        \"umaxv h2, v2.8h\",\n        \"umaxv h3, v3.8h\",\n        \"umov w20, v2.h[0]\",\n        \"umov w21, v3.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"mov w26, #0x1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"pabsb mm0, mm1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"NP 0x0f 0x38 0x1c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"abs v2.16b, v2.16b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pabsb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x1c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"abs v16.16b, v17.16b\"\n      ]\n    },\n    \"pabsw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"NP 0x0f 0x38 0x1d\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"abs v2.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pabsw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x1d\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"abs v16.8h, v17.8h\"\n      ]\n    },\n    \"pabsd mm0, mm1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"NP 0x0f 0x38 0x1e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"abs v2.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pabsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x1e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"abs v16.4s, v17.4s\"\n      ]\n    },\n    \"pmovzxbw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x30\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v16.8h, v17.8b\"\n      ]\n    },\n    \"pmovzxbd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x31\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v2.8h, v17.8b\",\n        \"uxtl v16.4s, v2.4h\"\n      ]\n    },\n    \"pmovzxbq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x32\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v2.8h, v17.8b\",\n        \"uxtl v2.4s, v2.4h\",\n        \"uxtl v16.2d, v2.2s\"\n      ]\n    },\n    \"pmovzxwd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x33\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v16.4s, v17.4h\"\n      ]\n    },\n    \"pmovzxwq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x34\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v2.4s, v17.4h\",\n        \"uxtl v16.2d, v2.2s\"\n      ]\n    },\n    \"pmovzxdq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x35\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v16.2d, v17.2s\"\n      ]\n    },\n    \"pcmpgtq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x37\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmgt v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"pminsb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x38\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smin v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"pminsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x39\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smin v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"pminuw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x3a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umin v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"pminud xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x3b\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umin v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"pmaxsb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x3c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smax v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"pmaxsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x3d\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smax v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"pmaxuw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x3e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umax v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"pmaxud xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x3f\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umax v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"pmulld xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mul v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"phminposuw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0x41\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3008]\",\n        \"zip1 v3.8h, v2.8h, v17.8h\",\n        \"zip2 v2.8h, v2.8h, v17.8h\",\n        \"umin v2.4s, v3.4s, v2.4s\",\n        \"uminv s2, v2.4s\",\n        \"rev32 v16.8h, v2.8h\"\n      ]\n    },\n    \"movbe ax, word [rbx]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0xf0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x6]\",\n        \"rev w20, w20\",\n        \"bfxil x4, x20, #16, #16\"\n      ]\n    },\n    \"movbe eax, dword [rbx]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0xf0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x6]\",\n        \"rev w4, w20\"\n      ]\n    },\n    \"movbe rax, qword [rbx]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"REX.W 0x66 0x0f 0x38 0xf0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x6]\",\n        \"rev x4, x20\"\n      ]\n    },\n    \"adcx eax, ebx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0x66 0x0f 0x38 0xf6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"eor w21, w20, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs w4, w6, w4\",\n        \"cset x21, lo\",\n        \"bfi w20, w21, #29, #1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"adcx rax, rbx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0x66 REX.W 0x0f 0x38 0xf6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"eor w21, w20, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs x4, x6, x4\",\n        \"cset x21, lo\",\n        \"bfi w20, w21, #29, #1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"adox eax, ebx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xf3 0x0f 0x38 0xf6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"ccmp wzr, #0, #nzcv, vs\",\n        \"adcs w4, w6, w4\",\n        \"cset x21, hs\",\n        \"bfi w20, w21, #28, #1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"adox rax, rbx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xf3 REX.W 0x0f 0x38 0xf6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"ccmp wzr, #0, #nzcv, vs\",\n        \"adcs x4, x6, x4\",\n        \"cset x21, hs\",\n        \"bfi w20, w21, #28, #1\",\n        \"msr nzcv, x20\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/H0F3A.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\",\n      \"CRYPTO\"\n    ]\n  },\n  \"Comment\": [\n    \"SSE4.2 string instructions are skipped here.\",\n    \"Entirely because they are nightmare implementations of instructions.\"\n  ],\n  \"Instructions\": {\n    \"palignr mm0, mm1, 0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"NP 0x0f 0x3a 0x0f\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"palignr mm0, mm1, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"NP 0x0f 0x3a 0x0f\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"ext v2.8b, v2.8b, v3.8b, #1\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"palignr mm0, mm1, 255\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"NP 0x0f 0x3a 0x0f\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"movi v2.2d, #0x0\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"roundps xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Nearest rounding\",\n        \"0x66 0x0f 0x3a 0x08\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintn v16.4s, v17.4s\"\n      ]\n    },\n    \"roundps xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"0x66 0x0f 0x3a 0x08\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintm v16.4s, v17.4s\"\n      ]\n    },\n    \"roundps xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"0x66 0x0f 0x3a 0x08\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintp v16.4s, v17.4s\"\n      ]\n    },\n    \"roundps xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"0x66 0x0f 0x3a 0x08\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintz v16.4s, v17.4s\"\n      ]\n    },\n    \"roundps xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"host rounding mode rounding\",\n        \"0x66 0x0f 0x3a 0x08\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti v16.4s, v17.4s\"\n      ]\n    },\n    \"roundpd xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Nearest rounding\",\n        \"0x66 0x0f 0x3a 0x09\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintn v16.2d, v17.2d\"\n      ]\n    },\n    \"roundpd xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"0x66 0x0f 0x3a 0x09\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintm v16.2d, v17.2d\"\n      ]\n    },\n    \"roundpd xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"0x66 0x0f 0x3a 0x09\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintp v16.2d, v17.2d\"\n      ]\n    },\n    \"roundpd xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"0x66 0x0f 0x3a 0x09\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintz v16.2d, v17.2d\"\n      ]\n    },\n    \"roundpd xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"host rounding mode rounding\",\n        \"0x66 0x0f 0x3a 0x09\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti v16.2d, v17.2d\"\n      ]\n    },\n    \"roundss xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Nearest rounding\",\n        \"0x66 0x0f 0x3a 0x0a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintn s0, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"roundss xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"0x66 0x0f 0x3a 0x0a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintm s0, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"roundss xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"0x66 0x0f 0x3a 0x0a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintp s0, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"roundss xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"0x66 0x0f 0x3a 0x0a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintz s0, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"roundss xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"host rounding mode rounding\",\n        \"0x66 0x0f 0x3a 0x0a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti s0, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"roundsd xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Nearest rounding\",\n        \"0x66 0x0f 0x3a 0x0b\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintn d0, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"roundsd xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"0x66 0x0f 0x3a 0x0b\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintm d0, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"roundsd xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"0x66 0x0f 0x3a 0x0b\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintp d0, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"roundsd xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"0x66 0x0f 0x3a 0x0b\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintz d0, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"roundsd xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"host rounding mode rounding\",\n        \"0x66 0x0f 0x3a 0x0b\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti d0, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"blendps xmm0, xmm1, 0000b\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"blendps xmm0, xmm1, 0001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[0], v17.s[0]\"\n      ]\n    },\n    \"blendps xmm0, xmm1, 0010b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[1], v17.s[1]\"\n      ]\n    },\n    \"blendps xmm0, xmm1, 0011b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[0], v17.d[0]\"\n      ]\n    },\n    \"blendps xmm0, xmm1, 0100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[2], v17.s[2]\"\n      ]\n    },\n    \"blendps xmm0, xmm1, 0101b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"rev64 v2.4s, v17.4s\",\n        \"trn2 v16.4s, v2.4s, v16.4s\"\n      ]\n    },\n    \"blendps xmm0, xmm1, 0110b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3200]\",\n        \"tbx v16.16b, {v17.16b}, v2.16b\"\n      ]\n    },\n    \"blendps xmm0, xmm1, 0111b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3216]\",\n        \"tbx v16.16b, {v17.16b}, v2.16b\"\n      ]\n    },\n    \"blendps xmm0, xmm1, 1000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[3], v17.s[3]\"\n      ]\n    },\n    \"blendps xmm0, xmm1, 1001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3232]\",\n        \"tbx v16.16b, {v17.16b}, v2.16b\"\n      ]\n    },\n    \"blendps xmm0, xmm1, 1010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"rev64 v2.4s, v16.4s\",\n        \"trn2 v16.4s, v2.4s, v17.4s\"\n      ]\n    },\n    \"blendps xmm0, xmm1, 1011b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3248]\",\n        \"tbx v16.16b, {v17.16b}, v2.16b\"\n      ]\n    },\n    \"blendps xmm0, xmm1, 1100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[1], v17.d[1]\"\n      ]\n    },\n    \"blendps xmm0, xmm1, 1101b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3264]\",\n        \"tbx v16.16b, {v17.16b}, v2.16b\"\n      ]\n    },\n    \"blendps xmm0, xmm1, 1110b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3280]\",\n        \"tbx v16.16b, {v17.16b}, v2.16b\"\n      ]\n    },\n    \"blendps xmm0, xmm1, 1111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"blendpd xmm0, xmm1, 00b\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0d\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"blendpd xmm0, xmm1, 01b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0d\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[0], v17.d[0]\"\n      ]\n    },\n    \"blendpd xmm0, xmm1, 10b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0d\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[1], v17.d[1]\"\n      ]\n    },\n    \"blendpd xmm0, xmm1, 11b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0d\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"pblendw xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0e\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"pblendw xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.h[0], v17.h[0]\"\n      ]\n    },\n    \"pblendw xmm0, xmm1, 11010111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2712]\",\n        \"ldr q2, [x0, #3440]\",\n        \"tbx v16.16b, {v17.16b}, v2.16b\"\n      ]\n    },\n    \"pblendw xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[0], v17.s[0]\"\n      ]\n    },\n    \"pblendw xmm0, xmm1, 00001100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[1], v17.s[1]\"\n      ]\n    },\n    \"pblendw xmm0, xmm1, 00110000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[2], v17.s[2]\"\n      ]\n    },\n    \"pblendw xmm0, xmm1, 11000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[3], v17.s[3]\"\n      ]\n    },\n    \"pblendw xmm0, xmm1, 00001111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[0], v17.d[0]\"\n      ]\n    },\n    \"pblendw xmm0, xmm1, 11110000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[1], v17.d[1]\"\n      ]\n    },\n    \"pblendw xmm0, xmm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"palignr xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0f\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"palignr xmm0, xmm1, 1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0f\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ext v16.16b, v17.16b, v16.16b, #1\"\n      ]\n    },\n    \"palignr xmm0, xmm1, 255\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x0f\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"pextrb eax, xmm0, 0000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x14\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.b[0]\"\n      ]\n    },\n    \"pextrb eax, xmm0, 1111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x14\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.b[15]\"\n      ]\n    },\n    \"pextrw eax, xmm0, 000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x15\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[0]\"\n      ]\n    },\n    \"pextrw eax, xmm0, 111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x15\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[7]\"\n      ]\n    },\n    \"pextrd eax, xmm0, 00b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x16\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, v16.s[0]\"\n      ]\n    },\n    \"pextrd eax, xmm0, 11b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x16\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, v16.s[3]\"\n      ]\n    },\n    \"pextrq rax, xmm0, 0b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 REX.W 0x0f 0x3a 0x16\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x4, v16.d[0]\"\n      ]\n    },\n    \"pextrq rax, xmm0, 1b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 REX.W 0x0f 0x3a 0x16\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x4, v16.d[1]\"\n      ]\n    },\n    \"pextrb [rax], xmm0, 0000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x14\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.b}[0], [x4]\"\n      ]\n    },\n    \"pextrb [rax], xmm0, 1111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x14\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.b}[15], [x4]\"\n      ]\n    },\n    \"pextrw [rax], xmm0, 000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x15\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[0], [x4]\"\n      ]\n    },\n    \"pextrw [rax], xmm0, 111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x15\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[7], [x4]\"\n      ]\n    },\n    \"pextrd [rax], xmm0, 00b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x16\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.s}[0], [x4]\"\n      ]\n    },\n    \"pextrd [rax], xmm0, 11b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x16\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.s}[3], [x4]\"\n      ]\n    },\n    \"pextrq [rax], xmm0, 0b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 REX.W 0x0f 0x3a 0x16\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.d}[0], [x4]\"\n      ]\n    },\n    \"pextrq [rax], xmm0, 1b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 REX.W 0x0f 0x3a 0x16\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.d}[1], [x4]\"\n      ]\n    },\n    \"extractps eax, xmm0, 00b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x17\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, v16.s[0]\"\n      ]\n    },\n    \"extractps eax, xmm0, 11b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x17\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, v16.s[3]\"\n      ]\n    },\n    \"pinsrb xmm0, eax, 0000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x20\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.b[0], w4\"\n      ]\n    },\n    \"pinsrb xmm0, eax, 0001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x20\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.b[1], w4\"\n      ]\n    },\n    \"pinsrb xmm0, eax, 1111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x20\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.b[15], w4\"\n      ]\n    },\n    \"pinsrb xmm0, [rax], 0000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x20\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.b}[0], [x4]\"\n      ]\n    },\n    \"pinsrb xmm0, [rax], 0001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x20\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.b}[1], [x4]\"\n      ]\n    },\n    \"pinsrb xmm0, [rax], 1111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x20\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.b}[15], [x4]\"\n      ]\n    },\n    \"insertps xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x21\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[0], v17.s[0]\"\n      ]\n    },\n    \"insertps xmm0, xmm1, 00001111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x21\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"insertps xmm0, xmm1, 00010000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x21\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[1], v17.s[0]\"\n      ]\n    },\n    \"pinsrd xmm0, eax, 00b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x22\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[0], w4\"\n      ]\n    },\n    \"pinsrd xmm0, eax, 01b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x22\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[1], w4\"\n      ]\n    },\n    \"pinsrd xmm0, eax, 11b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x22\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[3], w4\"\n      ]\n    },\n    \"pinsrq xmm0, rax, 0b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 REX.W 0x0f 0x3a 0x22\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[0], x4\"\n      ]\n    },\n    \"pinsrq xmm0, rax, 1b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 REX.W 0x0f 0x3a 0x22\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[1], x4\"\n      ]\n    },\n    \"pinsrd xmm0, [rax], 00b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x22\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.s}[0], [x4]\"\n      ]\n    },\n    \"pinsrd xmm0, [rax], 01b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x22\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.s}[1], [x4]\"\n      ]\n    },\n    \"pinsrd xmm0, [rax], 11b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x22\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.s}[3], [x4]\"\n      ]\n    },\n    \"pinsrq xmm0, [rax], 0b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 REX.W 0x0f 0x3a 0x22\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.d}[0], [x4]\"\n      ]\n    },\n    \"pinsrq xmm0, [rax], 1b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 REX.W 0x0f 0x3a 0x22\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.d}[1], [x4]\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 00001111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110001b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddp v3.4s, v3.4s, v3.4s\",\n        \"faddp s3, v3.2s\",\n        \"zip1 v16.4s, v3.4s, v2.4s\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110010b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddp v3.4s, v3.4s, v3.4s\",\n        \"faddp s3, v3.2s\",\n        \"zip1 v16.2s, v2.2s, v3.2s\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110011b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v2.4s, v16.4s, v17.4s\",\n        \"faddp v2.4s, v2.4s, v2.4s\",\n        \"faddp s2, v2.2s\",\n        \"dup v16.2s, v2.s[0]\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110100b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddp v3.4s, v3.4s, v3.4s\",\n        \"faddp s3, v3.2s\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110101b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v2.4s, v16.4s, v17.4s\",\n        \"faddp v2.4s, v2.4s, v2.4s\",\n        \"faddp s2, v2.2s\",\n        \"zip1 v16.2d, v2.2d, v2.2d\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110110b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddp v3.4s, v3.4s, v3.4s\",\n        \"faddp s3, v3.2s\",\n        \"mov v2.s[1], v3.s[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.s[2], v3.s[0]\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110111b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddp v3.4s, v3.4s, v3.4s\",\n        \"faddp s3, v3.2s\",\n        \"dup v3.4s, v3.s[0]\",\n        \"mov v16.16b, v3.16b\",\n        \"mov v16.s[3], v2.s[0]\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111000b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddp v3.4s, v3.4s, v3.4s\",\n        \"faddp s3, v3.2s\",\n        \"ext v16.16b, v2.16b, v3.16b, #4\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111001b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddp v3.4s, v3.4s, v3.4s\",\n        \"faddp s3, v3.2s\",\n        \"mov v2.s[0], v3.s[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.s[3], v3.s[0]\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111010b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddp v3.4s, v3.4s, v3.4s\",\n        \"faddp s3, v3.2s\",\n        \"dup v3.4s, v3.s[0]\",\n        \"zip1 v16.4s, v2.4s, v3.4s\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111011b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddp v3.4s, v3.4s, v3.4s\",\n        \"faddp s3, v3.2s\",\n        \"dup v3.4s, v3.s[0]\",\n        \"mov v16.16b, v3.16b\",\n        \"mov v16.s[2], v2.s[0]\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111100b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddp v3.4s, v3.4s, v3.4s\",\n        \"faddp s3, v3.2s\",\n        \"dup v3.4s, v3.s[0]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111101b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddp v3.4s, v3.4s, v3.4s\",\n        \"faddp s3, v3.2s\",\n        \"dup v3.4s, v3.s[0]\",\n        \"mov v16.16b, v3.16b\",\n        \"mov v16.s[1], v2.s[0]\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111110b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddp v3.4s, v3.4s, v3.4s\",\n        \"faddp s3, v3.2s\",\n        \"dup v3.4s, v3.s[0]\",\n        \"mov v16.16b, v3.16b\",\n        \"mov v16.s[0], v2.s[0]\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v2.4s, v16.4s, v17.4s\",\n        \"faddp v2.4s, v2.4s, v2.4s\",\n        \"faddp s2, v2.2s\",\n        \"dup v16.4s, v2.s[0]\"\n      ]\n    },\n    \"dppd xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x41\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"dppd xmm0, xmm1, 00001111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x41\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"dppd xmm0, xmm1, 11110000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x41\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"dppd xmm0, xmm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x41\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v2.2d, v16.2d, v17.2d\",\n        \"faddp d2, v2.2d\",\n        \"dup v16.2d, v2.d[0]\"\n      ]\n    },\n    \"mpsadbw xmm0, xmm1, 000b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x42\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[0]\",\n        \"ext v3.16b, v16.16b, v16.16b, #0\",\n        \"ext v4.16b, v16.16b, v16.16b, #1\",\n        \"ext v5.16b, v16.16b, v16.16b, #2\",\n        \"ext v6.16b, v16.16b, v16.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"mpsadbw xmm0, xmm1, 001b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x42\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[1]\",\n        \"ext v3.16b, v16.16b, v16.16b, #0\",\n        \"ext v4.16b, v16.16b, v16.16b, #1\",\n        \"ext v5.16b, v16.16b, v16.16b, #2\",\n        \"ext v6.16b, v16.16b, v16.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"mpsadbw xmm0, xmm1, 010b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x42\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[2]\",\n        \"ext v3.16b, v16.16b, v16.16b, #0\",\n        \"ext v4.16b, v16.16b, v16.16b, #1\",\n        \"ext v5.16b, v16.16b, v16.16b, #2\",\n        \"ext v6.16b, v16.16b, v16.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"mpsadbw xmm0, xmm1, 011b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x42\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[3]\",\n        \"ext v3.16b, v16.16b, v16.16b, #0\",\n        \"ext v4.16b, v16.16b, v16.16b, #1\",\n        \"ext v5.16b, v16.16b, v16.16b, #2\",\n        \"ext v6.16b, v16.16b, v16.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"mpsadbw xmm0, xmm1, 100b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x42\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[0]\",\n        \"ext v3.16b, v16.16b, v16.16b, #4\",\n        \"ext v4.16b, v16.16b, v16.16b, #5\",\n        \"ext v5.16b, v16.16b, v16.16b, #6\",\n        \"ext v6.16b, v16.16b, v16.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"mpsadbw xmm0, xmm1, 101b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x42\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[1]\",\n        \"ext v3.16b, v16.16b, v16.16b, #4\",\n        \"ext v4.16b, v16.16b, v16.16b, #5\",\n        \"ext v5.16b, v16.16b, v16.16b, #6\",\n        \"ext v6.16b, v16.16b, v16.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"mpsadbw xmm0, xmm1, 110b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x42\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[2]\",\n        \"ext v3.16b, v16.16b, v16.16b, #4\",\n        \"ext v4.16b, v16.16b, v16.16b, #5\",\n        \"ext v5.16b, v16.16b, v16.16b, #6\",\n        \"ext v6.16b, v16.16b, v16.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"mpsadbw xmm0, xmm1, 111b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x42\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[3]\",\n        \"ext v3.16b, v16.16b, v16.16b, #4\",\n        \"ext v4.16b, v16.16b, v16.16b, #5\",\n        \"ext v5.16b, v16.16b, v16.16b, #6\",\n        \"ext v6.16b, v16.16b, v16.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/H0F3A_SVE128.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"dpps xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 00001111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110001b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddv s3, p6, z3.s\",\n        \"zip1 v16.4s, v3.4s, v2.4s\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110010b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddv s3, p6, z3.s\",\n        \"zip1 v16.2s, v2.2s, v3.2s\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110011b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v2.4s, v16.4s, v17.4s\",\n        \"faddv s2, p6, z2.s\",\n        \"dup v16.2s, v2.s[0]\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110100b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddv s3, p6, z3.s\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110101b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v2.4s, v16.4s, v17.4s\",\n        \"faddv s2, p6, z2.s\",\n        \"zip1 v16.2d, v2.2d, v2.2d\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110110b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddv s3, p6, z3.s\",\n        \"mov v2.s[1], v3.s[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.s[2], v3.s[0]\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11110111b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddv s3, p6, z3.s\",\n        \"dup v3.4s, v3.s[0]\",\n        \"mov v16.16b, v3.16b\",\n        \"mov v16.s[3], v2.s[0]\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111000b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddv s3, p6, z3.s\",\n        \"ext v16.16b, v2.16b, v3.16b, #4\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111001b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddv s3, p6, z3.s\",\n        \"mov v2.s[0], v3.s[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.s[3], v3.s[0]\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111010b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddv s3, p6, z3.s\",\n        \"dup v3.4s, v3.s[0]\",\n        \"zip1 v16.4s, v2.4s, v3.4s\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111011b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddv s3, p6, z3.s\",\n        \"dup v3.4s, v3.s[0]\",\n        \"mov v16.16b, v3.16b\",\n        \"mov v16.s[2], v2.s[0]\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111100b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddv s3, p6, z3.s\",\n        \"dup v3.4s, v3.s[0]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111101b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddv s3, p6, z3.s\",\n        \"dup v3.4s, v3.s[0]\",\n        \"mov v16.16b, v3.16b\",\n        \"mov v16.s[1], v2.s[0]\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111110b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul v3.4s, v16.4s, v17.4s\",\n        \"faddv s3, p6, z3.s\",\n        \"dup v3.4s, v3.s[0]\",\n        \"mov v16.16b, v3.16b\",\n        \"mov v16.s[0], v2.s[0]\"\n      ]\n    },\n    \"dpps xmm0, xmm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x40\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v2.4s, v16.4s, v17.4s\",\n        \"faddv s2, p6, z2.s\",\n        \"dup v16.4s, v2.s[0]\"\n      ]\n    },\n    \"dppd xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x41\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"dppd xmm0, xmm1, 00001111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x41\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"dppd xmm0, xmm1, 11110000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x41\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"dppd xmm0, xmm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x66 0x0f 0x3a 0x41\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v2.2d, v16.2d, v17.2d\",\n        \"faddv d2, p6, z2.d\",\n        \"dup v16.2d, v2.d[0]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/MOPS/Primary.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"MOPS\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ]\n  },\n  \"Instructions\": {\n    \"rep movsb\": {\n      \"ExpectedInstructionCount\": 109,\n      \"Comment\": \"0xa4\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x22, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"tbnz w22, #1, #+0xc0\",\n        \"cbz x0, #+0xa4\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x18\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x7c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x54\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x40 (64)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x40 (64)\",\n        \"cbz x0, #+0x34\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x14\",\n        \"ldrb w3, [x2], #1\",\n        \"strb w3, [x1], #1\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"add x21, x0, x2\",\n        \"add x20, x1, x2\",\n        \"b #+0xdc\",\n        \"cbz x0, #+0xc4\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x28\",\n        \"sub x1, x1, x0\",\n        \"sub x2, x2, x0\",\n        \"add x1, x1, #0x1 (1)\",\n        \"add x2, x2, #0x1 (1)\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x8c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x64\",\n        \"sub x1, x1, #0x1f (31)\",\n        \"sub x2, x2, #0x1f (31)\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x40 (64)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x40 (64)\",\n        \"cbz x0, #+0x3c\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x1c\",\n        \"add x1, x1, #0x1f (31)\",\n        \"add x2, x2, #0x1f (31)\",\n        \"ldrb w3, [x2], #-1\",\n        \"strb w3, [x1], #-1\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"sub x21, x0, x2\",\n        \"sub x20, x1, x2\",\n        \"mov w7, #0x0\",\n        \"mov x11, x21\",\n        \"mov x10, x20\"\n      ]\n    },\n    \"rep movsw\": {\n      \"ExpectedInstructionCount\": 111,\n      \"Comment\": \"0xa5\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x22, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"tbnz w22, #1, #+0xc4\",\n        \"cbz x0, #+0xa8\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x1c\",\n        \"lsl x0, x0, #1\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x7c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x54\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x34\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x14\",\n        \"ldrh w3, [x2], #2\",\n        \"strh w3, [x1], #2\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"add x21, x0, x2, lsl #1\",\n        \"add x20, x1, x2, lsl #1\",\n        \"b #+0xe0\",\n        \"cbz x0, #+0xc8\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x2c\",\n        \"lsl x0, x0, #1\",\n        \"sub x1, x1, x0\",\n        \"sub x2, x2, x0\",\n        \"add x1, x1, #0x2 (2)\",\n        \"add x2, x2, #0x2 (2)\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x8c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x64\",\n        \"sub x1, x1, #0x1e (30)\",\n        \"sub x2, x2, #0x1e (30)\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x3c\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x1c\",\n        \"add x1, x1, #0x1e (30)\",\n        \"add x2, x2, #0x1e (30)\",\n        \"ldrh w3, [x2], #-2\",\n        \"strh w3, [x1], #-2\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"sub x21, x0, x2, lsl #1\",\n        \"sub x20, x1, x2, lsl #1\",\n        \"mov w7, #0x0\",\n        \"mov x11, x21\",\n        \"mov x10, x20\"\n      ]\n    },\n    \"rep movsd\": {\n      \"ExpectedInstructionCount\": 111,\n      \"Comment\": \"0xa5\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x22, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"tbnz w22, #1, #+0xc4\",\n        \"cbz x0, #+0xa8\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x1c\",\n        \"lsl x0, x0, #2\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x7c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x54\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x34\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x14\",\n        \"ldr w3, [x2], #4\",\n        \"str w3, [x1], #4\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"add x21, x0, x2, lsl #2\",\n        \"add x20, x1, x2, lsl #2\",\n        \"b #+0xe0\",\n        \"cbz x0, #+0xc8\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x2c\",\n        \"lsl x0, x0, #2\",\n        \"sub x1, x1, x0\",\n        \"sub x2, x2, x0\",\n        \"add x1, x1, #0x4 (4)\",\n        \"add x2, x2, #0x4 (4)\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x8c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x64\",\n        \"sub x1, x1, #0x1c (28)\",\n        \"sub x2, x2, #0x1c (28)\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x3c\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x1c\",\n        \"add x1, x1, #0x1c (28)\",\n        \"add x2, x2, #0x1c (28)\",\n        \"ldr w3, [x2], #-4\",\n        \"str w3, [x1], #-4\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"sub x21, x0, x2, lsl #2\",\n        \"sub x20, x1, x2, lsl #2\",\n        \"mov w7, #0x0\",\n        \"mov x11, x21\",\n        \"mov x10, x20\"\n      ]\n    },\n    \"rep movsq\": {\n      \"ExpectedInstructionCount\": 111,\n      \"Comment\": \"0xa5\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x22, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"tbnz w22, #1, #+0xc4\",\n        \"cbz x0, #+0xa8\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x1c\",\n        \"lsl x0, x0, #3\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x7c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x54\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x34\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x4 (4)\",\n        \"cbz x0, #+0x14\",\n        \"ldr x3, [x2], #8\",\n        \"str x3, [x1], #8\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"add x21, x0, x2, lsl #3\",\n        \"add x20, x1, x2, lsl #3\",\n        \"b #+0xe0\",\n        \"cbz x0, #+0xc8\",\n        \"mrs x3, nzcv\",\n        \"sub x0, x1, x2\",\n        \"cmp x0, x7\",\n        \"mov x0, x7\",\n        \"bc.lt #+0x2c\",\n        \"lsl x0, x0, #3\",\n        \"sub x1, x1, x0\",\n        \"sub x2, x2, x0\",\n        \"add x1, x1, #0x8 (8)\",\n        \"add x2, x2, #0x8 (8)\",\n        \"cpyfp [x1]!, [x2]!, x0!\",\n        \"cpyfm [x1]!, [x2]!, x0!\",\n        \"cpyfe [x1]!, [x2]!, x0!\",\n        \"msr nzcv, x3\",\n        \"b #+0x8c\",\n        \"msr nzcv, x3\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x64\",\n        \"sub x1, x1, #0x18 (24)\",\n        \"sub x2, x2, #0x18 (24)\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x3c\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x4 (4)\",\n        \"cbz x0, #+0x1c\",\n        \"add x1, x1, #0x18 (24)\",\n        \"add x2, x2, #0x18 (24)\",\n        \"ldr x3, [x2], #-8\",\n        \"str x3, [x1], #-8\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"sub x21, x0, x2, lsl #3\",\n        \"sub x20, x1, x2, lsl #3\",\n        \"mov w7, #0x0\",\n        \"mov x11, x21\",\n        \"mov x10, x20\"\n      ]\n    },\n    \"cmpsb\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xa6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x11]\",\n        \"ldrb w21, [x10]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w21, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20\",\n        \"add x10, x10, x20\"\n      ]\n    },\n    \"cmpsw\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xa7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x11]\",\n        \"ldrh w21, [x10]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w21, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #1\",\n        \"add x10, x10, x20, lsl #1\"\n      ]\n    },\n    \"cmpsd\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xa7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x11]\",\n        \"ldr w21, [x10]\",\n        \"eor x27, x21, x20\",\n        \"subs w26, w21, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #2\",\n        \"add x10, x10, x20, lsl #2\"\n      ]\n    },\n    \"cmpsq\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xa7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x11]\",\n        \"ldr x21, [x10]\",\n        \"eor x27, x21, x20\",\n        \"subs x26, x21, x20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #3\",\n        \"add x10, x10, x20, lsl #3\"\n      ]\n    },\n    \"repz cmpsb\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": \"0xa6\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x64\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldrb w26, [x11]\",\n        \"ldrb w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x1 (1)\",\n        \"add x10, x10, #0x1 (1)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"ldrb w26, [x11]\",\n        \"ldrb w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x1 (1)\",\n        \"sub x10, x10, #0x1 (1)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"eor x20, x27, x26\",\n        \"lsl w0, w27, #24\",\n        \"cmp w0, w26, lsl #24\",\n        \"sub w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repz cmpsw\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x64\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldrh w26, [x11]\",\n        \"ldrh w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x2 (2)\",\n        \"add x10, x10, #0x2 (2)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"ldrh w26, [x11]\",\n        \"ldrh w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x2 (2)\",\n        \"sub x10, x10, #0x2 (2)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"eor x20, x27, x26\",\n        \"lsl w0, w27, #16\",\n        \"cmp w0, w26, lsl #16\",\n        \"sub w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repz cmpsd\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x5c\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldr w26, [x11]\",\n        \"ldr w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x4 (4)\",\n        \"add x10, x10, #0x4 (4)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"ldr w26, [x11]\",\n        \"ldr w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x4 (4)\",\n        \"sub x10, x10, #0x4 (4)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"eor x20, x27, x26\",\n        \"subs w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repz cmpsq\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x5c\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldr x26, [x11]\",\n        \"ldr x27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x8 (8)\",\n        \"add x10, x10, #0x8 (8)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"ldr x26, [x11]\",\n        \"ldr x27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x8 (8)\",\n        \"sub x10, x10, #0x8 (8)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"eor x20, x27, x26\",\n        \"subs x26, x27, x26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repnz cmpsb\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": \"0xa6\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x64\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldrb w26, [x11]\",\n        \"ldrb w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x1 (1)\",\n        \"add x10, x10, #0x1 (1)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"ldrb w26, [x11]\",\n        \"ldrb w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x1 (1)\",\n        \"sub x10, x10, #0x1 (1)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"eor x20, x27, x26\",\n        \"lsl w0, w27, #24\",\n        \"cmp w0, w26, lsl #24\",\n        \"sub w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repnz cmpsw\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x64\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldrh w26, [x11]\",\n        \"ldrh w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x2 (2)\",\n        \"add x10, x10, #0x2 (2)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"ldrh w26, [x11]\",\n        \"ldrh w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x2 (2)\",\n        \"sub x10, x10, #0x2 (2)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"eor x20, x27, x26\",\n        \"lsl w0, w27, #16\",\n        \"cmp w0, w26, lsl #16\",\n        \"sub w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repnz cmpsd\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x5c\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldr w26, [x11]\",\n        \"ldr w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x4 (4)\",\n        \"add x10, x10, #0x4 (4)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"ldr w26, [x11]\",\n        \"ldr w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x4 (4)\",\n        \"sub x10, x10, #0x4 (4)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"eor x20, x27, x26\",\n        \"subs w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repnz cmpsq\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x5c\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldr x26, [x11]\",\n        \"ldr x27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x8 (8)\",\n        \"add x10, x10, #0x8 (8)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"ldr x26, [x11]\",\n        \"ldr x27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x8 (8)\",\n        \"sub x10, x10, #0x8 (8)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"eor x20, x27, x26\",\n        \"subs x26, x27, x26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"stosb\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xaa\",\n      \"ExpectedArm64ASM\": [\n        \"strb w4, [x11]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20\"\n      ]\n    },\n    \"stosw\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xab\",\n      \"ExpectedArm64ASM\": [\n        \"strh w4, [x11]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #1\"\n      ]\n    },\n    \"stosd\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xab\",\n      \"ExpectedArm64ASM\": [\n        \"str w4, [x11]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #2\"\n      ]\n    },\n    \"stosq\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xab\",\n      \"ExpectedArm64ASM\": [\n        \"str x4, [x11]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #3\"\n      ]\n    },\n    \"rep stosb\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xaa\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"ldrsb x21, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"tbnz w21, #1, #+0x24\",\n        \"cbz x0, #+0x1c\",\n        \"mrs x2, nzcv\",\n        \"setp [x1]!, x0!, x20\",\n        \"setm [x1]!, x0!, x20\",\n        \"sete [x1]!, x0!, x20\",\n        \"msr nzcv, x2\",\n        \"add x11, x11, x7\",\n        \"b #+0x28\",\n        \"cbz x0, #+0x24\",\n        \"sub x1, x1, x0\",\n        \"add x1, x1, #0x1 (1)\",\n        \"mrs x2, nzcv\",\n        \"setp [x1]!, x0!, x20\",\n        \"setm [x1]!, x0!, x20\",\n        \"sete [x1]!, x0!, x20\",\n        \"msr nzcv, x2\",\n        \"sub x11, x11, x7\",\n        \"mov w7, #0x0\"\n      ]\n    },\n    \"rep stosw\": {\n      \"ExpectedInstructionCount\": 55,\n      \"Comment\": \"0xab\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"ldrsb x21, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"tbnz w21, #1, #+0x64\",\n        \"cbz x0, #+0x58\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.8h, w20\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #32\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x2c\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x10\",\n        \"strh w20, [x1], #2\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"add x11, x11, x7, lsl #1\",\n        \"b #+0x68\",\n        \"cbz x0, #+0x60\",\n        \"sub x1, x1, #0x1e (30)\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.8h, w20\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #-32\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x30\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x14\",\n        \"add x1, x1, #0x1e (30)\",\n        \"strh w20, [x1], #-2\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"sub x11, x11, x7, lsl #1\",\n        \"mov w7, #0x0\"\n      ]\n    },\n    \"rep stosd\": {\n      \"ExpectedInstructionCount\": 55,\n      \"Comment\": \"0xab\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w4\",\n        \"ldrsb x21, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"tbnz w21, #1, #+0x64\",\n        \"cbz x0, #+0x58\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.4s, w20\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #32\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x2c\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x10\",\n        \"str w20, [x1], #4\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"add x11, x11, x7, lsl #2\",\n        \"b #+0x68\",\n        \"cbz x0, #+0x60\",\n        \"sub x1, x1, #0x1c (28)\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.4s, w20\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #-32\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x30\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x14\",\n        \"add x1, x1, #0x1c (28)\",\n        \"str w20, [x1], #-4\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"sub x11, x11, x7, lsl #2\",\n        \"mov w7, #0x0\"\n      ]\n    },\n    \"rep stosq\": {\n      \"ExpectedInstructionCount\": 54,\n      \"Comment\": [\n        \"Unrolling the loop for faster memset can be done.\",\n        \"Taking advantage of ARM MOPs instructions can be done\",\n        \"0xab\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"tbnz w20, #1, #+0x64\",\n        \"cbz x0, #+0x58\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.2d, x4\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #32\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x2c\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x4 (4)\",\n        \"cbz x0, #+0x10\",\n        \"str x4, [x1], #8\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"add x11, x11, x7, lsl #3\",\n        \"b #+0x68\",\n        \"cbz x0, #+0x60\",\n        \"sub x1, x1, #0x18 (24)\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.2d, x4\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #-32\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x30\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x4 (4)\",\n        \"cbz x0, #+0x14\",\n        \"add x1, x1, #0x18 (24)\",\n        \"str x4, [x1], #-8\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"sub x11, x11, x7, lsl #3\",\n        \"mov w7, #0x0\"\n      ]\n    },\n    \"lodsb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0xac\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x10]\",\n        \"bfxil x4, x20, #0, #8\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x10, x10, x20\"\n      ]\n    },\n    \"lodsw\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0xad\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x10]\",\n        \"bfxil x4, x20, #0, #16\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x10, x10, x20, lsl #1\"\n      ]\n    },\n    \"lodsd\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xad\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x10]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x10, x10, x20, lsl #2\"\n      ]\n    },\n    \"lodsq\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xad\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x4, [x10]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x10, x10, x20, lsl #3\"\n      ]\n    },\n    \"rep lodsb\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"0xac\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x18\",\n        \"ldrb w20, [x10]\",\n        \"bfxil x4, x20, #0, #8\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x10, x10, #0x1 (1)\",\n        \"b #-0x14\",\n        \"b #+0x1c\",\n        \"cbz x7, #+0x18\",\n        \"ldrb w20, [x10]\",\n        \"bfxil x4, x20, #0, #8\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x10, x10, #0x1 (1)\",\n        \"b #-0x14\"\n      ]\n    },\n    \"rep lodsw\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"0xad\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x18\",\n        \"ldrh w20, [x10]\",\n        \"bfxil x4, x20, #0, #16\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x10, x10, #0x2 (2)\",\n        \"b #-0x14\",\n        \"b #+0x1c\",\n        \"cbz x7, #+0x18\",\n        \"ldrh w20, [x10]\",\n        \"bfxil x4, x20, #0, #16\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x10, x10, #0x2 (2)\",\n        \"b #-0x14\"\n      ]\n    },\n    \"rep lodsd\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"0xad\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x1c\",\n        \"cbz x7, #+0x14\",\n        \"ldr w4, [x10]\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x10, x10, #0x4 (4)\",\n        \"b #-0x10\",\n        \"b #+0x18\",\n        \"cbz x7, #+0x14\",\n        \"ldr w4, [x10]\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x10, x10, #0x4 (4)\",\n        \"b #-0x10\"\n      ]\n    },\n    \"rep lodsq\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"0xad\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x1c\",\n        \"cbz x7, #+0x14\",\n        \"ldr x4, [x10]\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x10, x10, #0x8 (8)\",\n        \"b #-0x10\",\n        \"b #+0x18\",\n        \"cbz x7, #+0x14\",\n        \"ldr x4, [x10]\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x10, x10, #0x8 (8)\",\n        \"b #-0x10\"\n      ]\n    },\n    \"scasb\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xae\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20\"\n      ]\n    },\n    \"scasw\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #1\"\n      ]\n    },\n    \"scasd\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #2\"\n      ]\n    },\n    \"scasq\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs x26, x4, x20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #3\"\n      ]\n    },\n    \"repz scasb\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xae\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x2c\",\n        \"cbz x7, #+0x24\",\n        \"ldrb w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x1 (1)\",\n        \"b.eq #-0x20\",\n        \"b #+0x28\",\n        \"cbz x7, #+0x24\",\n        \"ldrb w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x1 (1)\",\n        \"b.eq #-0x20\"\n      ]\n    },\n    \"repz scasw\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x2c\",\n        \"cbz x7, #+0x24\",\n        \"ldrh w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x2 (2)\",\n        \"b.eq #-0x20\",\n        \"b #+0x28\",\n        \"cbz x7, #+0x24\",\n        \"ldrh w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x2 (2)\",\n        \"b.eq #-0x20\"\n      ]\n    },\n    \"repz scasd\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"cbz x7, #+0x1c\",\n        \"ldr w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x4 (4)\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x1c\",\n        \"ldr w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x4 (4)\",\n        \"b.eq #-0x18\"\n      ]\n    },\n    \"repz scasq\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"cbz x7, #+0x1c\",\n        \"ldr x20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs x26, x4, x20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x8 (8)\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x1c\",\n        \"ldr x20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs x26, x4, x20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x8 (8)\",\n        \"b.eq #-0x18\"\n      ]\n    },\n    \"repnz scasb\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xae\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x2c\",\n        \"cbz x7, #+0x24\",\n        \"ldrb w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x1 (1)\",\n        \"b.ne #-0x20\",\n        \"b #+0x28\",\n        \"cbz x7, #+0x24\",\n        \"ldrb w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x1 (1)\",\n        \"b.ne #-0x20\"\n      ]\n    },\n    \"repnz scasw\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x2c\",\n        \"cbz x7, #+0x24\",\n        \"ldrh w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x2 (2)\",\n        \"b.ne #-0x20\",\n        \"b #+0x28\",\n        \"cbz x7, #+0x24\",\n        \"ldrh w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x2 (2)\",\n        \"b.ne #-0x20\"\n      ]\n    },\n    \"repnz scasd\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"cbz x7, #+0x1c\",\n        \"ldr w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x4 (4)\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x1c\",\n        \"ldr w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x4 (4)\",\n        \"b.ne #-0x18\"\n      ]\n    },\n    \"repnz scasq\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"cbz x7, #+0x1c\",\n        \"ldr x20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs x26, x4, x20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x8 (8)\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x1c\",\n        \"ldr x20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs x26, x4, x20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x8 (8)\",\n        \"b.ne #-0x18\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Primary.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"MOPS\"\n    ]\n  },\n  \"Instructions\": {\n    \"add bl, cl\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x00\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"lsl w0, w6, #24\",\n        \"cmn w0, w7, lsl #24\",\n        \"add w26, w6, w7\",\n        \"bfxil x6, x26, #0, #8\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"add bx, cx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x01\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"lsl w0, w6, #16\",\n        \"cmn w0, w7, lsl #16\",\n        \"add w26, w6, w7\",\n        \"bfxil x6, x26, #0, #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"add ebx, ecx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x01\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"adds w26, w6, w7\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"add rbx, rcx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x01\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"adds x26, x6, x7\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"db 0x02, 0xcb\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0x02\",\n        \"add bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"lsl w0, w7, #24\",\n        \"cmn w0, w6, lsl #24\",\n        \"add w26, w7, w6\",\n        \"bfxil x7, x26, #0, #8\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"db 0x66, 0x03, 0xcb\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0x03\",\n        \"add bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"lsl w0, w7, #16\",\n        \"cmn w0, w6, lsl #16\",\n        \"add w26, w7, w6\",\n        \"bfxil x7, x26, #0, #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"db 0x03, 0xcb\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x03\",\n        \"add ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"adds w26, w7, w6\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"db 0x48, 0x03, 0xcb\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x03\",\n        \"add rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"adds x26, x7, x6\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"add al, 1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"0x04\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w4, #0x1 (1)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"add ax, 1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"0x05\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w4, #0x1 (1)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #16\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"add eax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x05\",\n      \"ExpectedArm64ASM\": [\n        \"adds w26, w4, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"add rax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x05\",\n      \"ExpectedArm64ASM\": [\n        \"adds x26, x4, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"add al, -1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x04\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w4, #0xff (255)\",\n        \"bfxil x4, x26, #0, #8\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"add ax, -1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x05\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w4, w20\",\n        \"bfxil x4, x26, #0, #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"add eax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x05\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"subs w26, w4, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"add rax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x05\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"subs x26, x4, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or bl, bh\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w6, #8\",\n        \"orr w26, w6, w20\",\n        \"cmn wzr, w26, lsl #24\",\n        \"bfxil x6, x26, #0, #8\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"or bl, cl\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x08\",\n      \"ExpectedArm64ASM\": [\n        \"orr w26, w6, w7\",\n        \"cmn wzr, w26, lsl #24\",\n        \"bfxil x6, x26, #0, #8\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"or bx, cx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x09\",\n      \"ExpectedArm64ASM\": [\n        \"orr w26, w6, w7\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x6, x26, #0, #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"or ebx, ecx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x09\",\n      \"ExpectedArm64ASM\": [\n        \"orr w6, w6, w7\",\n        \"subs w26, w6, #0x0 (0)\"\n      ]\n    },\n    \"or rbx, rcx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x09\",\n      \"ExpectedArm64ASM\": [\n        \"orr x6, x6, x7\",\n        \"subs x26, x6, #0x0 (0)\"\n      ]\n    },\n    \"db 0x0A, 0xcb\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x0A\",\n        \"or bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr w26, w7, w6\",\n        \"cmn wzr, w26, lsl #24\",\n        \"bfxil x7, x26, #0, #8\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"db 0x66, 0x0B, 0xcb\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x0B\",\n        \"or bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr w26, w7, w6\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x7, x26, #0, #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"db 0x0B, 0xcb\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x0B\",\n        \"or ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr w7, w7, w6\",\n        \"subs w26, w7, #0x0 (0)\"\n      ]\n    },\n    \"db 0x48, 0x0B, 0xcb\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x0B\",\n        \"or rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr x7, x7, x6\",\n        \"subs x26, x7, #0x0 (0)\"\n      ]\n    },\n    \"or al, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0C\",\n      \"ExpectedArm64ASM\": [\n        \"orr x26, x4, #0x1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or ax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0D\",\n      \"ExpectedArm64ASM\": [\n        \"orr x26, x4, #0x1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or eax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0D\",\n      \"ExpectedArm64ASM\": [\n        \"orr w4, w4, #0x1\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"or rax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0D\",\n      \"ExpectedArm64ASM\": [\n        \"orr x4, x4, #0x1\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"or al, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0C\",\n      \"ExpectedArm64ASM\": [\n        \"orr x26, x4, #0xff\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or ax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0D\",\n      \"ExpectedArm64ASM\": [\n        \"orr x26, x4, #0xffff\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or eax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x0D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"orr w4, w4, w20\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"or rax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x0D\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"orr x4, x4, x20\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"adc bl, cl\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"0x10\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"uxtb x20, w7\",\n        \"cinc w21, w20, lo\",\n        \"add w22, w6, w21\",\n        \"uxtb w26, w22\",\n        \"cmp w26, w21\",\n        \"cset x21, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"eor w20, w6, w20\",\n        \"eor w21, w26, w6\",\n        \"bic w20, w21, w20\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"bfxil x6, x26, #0, #8\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"adc bx, cx\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"0x11\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"uxth x20, w7\",\n        \"cinc w21, w20, lo\",\n        \"add w22, w6, w21\",\n        \"uxth w26, w22\",\n        \"cmp w26, w21\",\n        \"cset x21, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"eor w20, w6, w20\",\n        \"eor w21, w26, w6\",\n        \"bic w20, w21, w20\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"bfxil x6, x26, #0, #16\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"adc ebx, ecx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x11\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"adcs w26, w6, w7\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"adc rbx, rcx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x11\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"adcs x26, x6, x7\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"db 0x12, 0xcb\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0x12\",\n        \"adc bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"uxtb x20, w6\",\n        \"cinc w21, w20, lo\",\n        \"add w22, w7, w21\",\n        \"uxtb w26, w22\",\n        \"cmp w26, w21\",\n        \"cset x21, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"eor w20, w7, w20\",\n        \"eor w21, w26, w7\",\n        \"bic w20, w21, w20\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"bfxil x7, x26, #0, #8\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"db 0x66, 0x13, 0xcb\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0x13\",\n        \"adc bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"uxth x20, w6\",\n        \"cinc w21, w20, lo\",\n        \"add w22, w7, w21\",\n        \"uxth w26, w22\",\n        \"cmp w26, w21\",\n        \"cset x21, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"eor w20, w7, w20\",\n        \"eor w21, w26, w7\",\n        \"bic w20, w21, w20\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"bfxil x7, x26, #0, #16\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"db 0x13, 0xcb\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0x13\",\n        \"adc ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"adcs w26, w7, w6\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"db 0x48, 0x13, 0xcb\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0x13\",\n        \"adc rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"adcs x26, x7, x6\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"adc al, 1\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"0x14\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w4, w20\",\n        \"uxtb w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"bic w20, w26, w4\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"msr nzcv, x21\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"adc ax, 1\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"0x15\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w4, w20\",\n        \"uxth w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"bic w20, w26, w4\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #16\",\n        \"msr nzcv, x21\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"adc eax, 1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x15\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs w26, w4, w20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc rax, 1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x15\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs x26, x4, x20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc al, -1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"0x14\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w4, w20\",\n        \"uxtb w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"bic w20, w4, w26\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"bfxil x4, x26, #0, #8\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"adc ax, -1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"0x15\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"mvn w27, w4\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w4, w20\",\n        \"uxth w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"bic w20, w4, w26\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"bfxil x4, x26, #0, #16\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"adc eax, -1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x15\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"mvn w27, w4\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs w26, w4, w20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc rax, -1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x15\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"mvn w27, w4\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs x26, x4, x20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb bl, cl\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": \"0x18\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"uxtb w20, w6\",\n        \"uxtb x21, w7\",\n        \"cinc w22, w21, lo\",\n        \"sub w23, w20, w22\",\n        \"uxtb w26, w23\",\n        \"cmp w20, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"and w20, w20, w21\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w23, w20, #28, #1\",\n        \"bfxil x6, x26, #0, #8\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"sbb bx, cx\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": \"0x19\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"uxth w20, w6\",\n        \"uxth x21, w7\",\n        \"cinc w22, w21, lo\",\n        \"sub w23, w20, w22\",\n        \"uxth w26, w23\",\n        \"cmp w20, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"and w20, w20, w21\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w23, w20, #28, #1\",\n        \"bfxil x6, x26, #0, #16\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"sbb ebx, ecx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x19\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"sbcs w26, w6, w7\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"sbb rbx, rcx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x19\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"sbcs x26, x6, x7\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"db 0x1A, 0xcb\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0x1A\",\n        \"sbb bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"uxtb w20, w7\",\n        \"uxtb x21, w6\",\n        \"cinc w22, w21, lo\",\n        \"sub w23, w20, w22\",\n        \"uxtb w26, w23\",\n        \"cmp w20, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"and w20, w20, w21\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w23, w20, #28, #1\",\n        \"bfxil x7, x26, #0, #8\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"db 0x66, 0x1B, 0xcb\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0x1B\",\n        \"sbb bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"uxth w20, w7\",\n        \"uxth x21, w6\",\n        \"cinc w22, w21, lo\",\n        \"sub w23, w20, w22\",\n        \"uxth w26, w23\",\n        \"cmp w20, w22\",\n        \"cset x22, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"eor w21, w20, w21\",\n        \"eor w20, w26, w20\",\n        \"and w20, w20, w21\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w23, w20, #28, #1\",\n        \"bfxil x7, x26, #0, #16\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"db 0x1B, 0xcb\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x1B\",\n        \"sbb ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"sbcs w26, w7, w6\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"db 0x48, 0x1B, 0xcb\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x1B\",\n        \"sbb rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"sbcs x26, x7, x6\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"sbb al, 1\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": \"0x1C\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"uxtb w21, w4\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxtb w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"bic w20, w21, w26\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"msr nzcv, x22\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"sbb ax, 1\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": \"0x1D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"uxth w21, w4\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxth w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"bic w20, w21, w26\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #16\",\n        \"msr nzcv, x22\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"sbb eax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x1D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"sbcs w26, w4, w20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb rax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x1D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"sbcs x26, x4, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb al, -1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": \"0x1C\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"uxtb w21, w4\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxtb w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"bic w20, w26, w21\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"bfxil x4, x26, #0, #8\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"sbb ax, -1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": \"0x1D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"mvn w27, w4\",\n        \"uxth w21, w4\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxth w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"bic w20, w26, w21\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"bfxil x4, x26, #0, #16\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"sbb eax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x1D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"mvn w27, w4\",\n        \"sbcs w26, w4, w20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb rax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x1D\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"mvn w27, w4\",\n        \"sbcs x26, x4, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and bl, cl\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x20\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w6, w7\",\n        \"cmn wzr, w26, lsl #24\",\n        \"bfxil x6, x26, #0, #8\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"and bx, cx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x21\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w6, w7\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x6, x26, #0, #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"and ebx, ecx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x21\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w6, w7\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"and rbx, rcx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x21\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x6, x7\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"db 0x22, 0xcb\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x22\",\n        \"and bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and w26, w7, w6\",\n        \"cmn wzr, w26, lsl #24\",\n        \"bfxil x7, x26, #0, #8\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"db 0x66, 0x23, 0xcb\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x23\",\n        \"and bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and w26, w7, w6\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x7, x26, #0, #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"db 0x23, 0xcb\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x23\",\n        \"and ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w7, w6\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"db 0x48, 0x23, 0xcb\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x23\",\n        \"and rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x7, x6\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"and al, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x24\",\n      \"ExpectedArm64ASM\": [\n        \"and x26, x4, #0xffffffffffffff01\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and ax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x25\",\n      \"ExpectedArm64ASM\": [\n        \"and x26, x4, #0xffffffffffff0001\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and eax, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x25\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w4, #0x1\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and rax, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x25\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x4, #0x1\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and al, -1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x24\",\n      \"ExpectedArm64ASM\": [\n        \"cmn wzr, w4, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x26, x4\"\n      ]\n    },\n    \"and ax, -1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x25\",\n      \"ExpectedArm64ASM\": [\n        \"cmn wzr, w4, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x26, x4\"\n      ]\n    },\n    \"and eax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x25\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"ands w26, w4, w20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and rax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x25\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"ands x26, x4, x20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub bl, cl\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x28\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"lsl w0, w6, #24\",\n        \"cmp w0, w7, lsl #24\",\n        \"sub w26, w6, w7\",\n        \"bfxil x6, x26, #0, #8\"\n      ]\n    },\n    \"sub bx, cx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x29\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"lsl w0, w6, #16\",\n        \"cmp w0, w7, lsl #16\",\n        \"sub w26, w6, w7\",\n        \"bfxil x6, x26, #0, #16\"\n      ]\n    },\n    \"sub ebx, ecx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x29\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"subs w26, w6, w7\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"sub rbx, rcx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x29\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"subs x26, x6, x7\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"db 0x2A, 0xcb\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x2A\",\n        \"sub bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"lsl w0, w7, #24\",\n        \"cmp w0, w6, lsl #24\",\n        \"sub w26, w7, w6\",\n        \"bfxil x7, x26, #0, #8\"\n      ]\n    },\n    \"db 0x66, 0x2B, 0xcb\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0x2B\",\n        \"sub bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"lsl w0, w7, #16\",\n        \"cmp w0, w6, lsl #16\",\n        \"sub w26, w7, w6\",\n        \"bfxil x7, x26, #0, #16\"\n      ]\n    },\n    \"db 0x2B, 0xcb\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x2B\",\n        \"sub ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"subs w26, w7, w6\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"db 0x48, 0x2B, 0xcb\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x2B\",\n        \"sub rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"subs x26, x7, x6\",\n        \"mov x7, x26\"\n      ]\n    },\n    \"sub al, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x2C\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0x1 (1)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"sub ax, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x2D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, #0x1 (1)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #16\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"sub eax, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x2D\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x1 (1)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub rax, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x2D\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x1 (1)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub al, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x2C\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0xff (255)\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"sub ax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x2D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"sub eax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x2D\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds w26, w4, #0x1 (1)\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub rax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x2D\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds x26, x4, #0x1 (1)\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor bl, cl\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x30\",\n      \"ExpectedArm64ASM\": [\n        \"eor w26, w6, w7\",\n        \"cmn wzr, w26, lsl #24\",\n        \"bfxil x6, x26, #0, #8\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"xor bx, cx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x31\",\n      \"ExpectedArm64ASM\": [\n        \"eor w26, w6, w7\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x6, x26, #0, #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"xor ebx, ecx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x31\",\n      \"ExpectedArm64ASM\": [\n        \"eor w6, w6, w7\",\n        \"subs w26, w6, #0x0 (0)\"\n      ]\n    },\n    \"xor rbx, rcx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x31\",\n      \"ExpectedArm64ASM\": [\n        \"eor x6, x6, x7\",\n        \"subs x26, x6, #0x0 (0)\"\n      ]\n    },\n    \"db 0x32, 0xcb\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x32\",\n        \"xor bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w26, w7, w6\",\n        \"cmn wzr, w26, lsl #24\",\n        \"bfxil x7, x26, #0, #8\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"db 0x66, 0x33, 0xcb\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x33\",\n        \"xor bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w26, w7, w6\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x7, x26, #0, #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"db 0x33, 0xcb\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x33\",\n        \"xor ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w7, w7, w6\",\n        \"subs w26, w7, #0x0 (0)\"\n      ]\n    },\n    \"db 0x48, 0x33, 0xcb\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x33\",\n        \"xor rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x7, x7, x6\",\n        \"subs x26, x7, #0x0 (0)\"\n      ]\n    },\n    \"xor al, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x34\",\n      \"ExpectedArm64ASM\": [\n        \"eor x26, x4, #0x1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor ax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x35\",\n      \"ExpectedArm64ASM\": [\n        \"eor x26, x4, #0x1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor eax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x35\",\n      \"ExpectedArm64ASM\": [\n        \"eor w4, w4, #0x1\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"xor rax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x35\",\n      \"ExpectedArm64ASM\": [\n        \"eor x4, x4, #0x1\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"cmp bl, cl\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x38\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"lsl w0, w6, #24\",\n        \"cmp w0, w7, lsl #24\",\n        \"sub w26, w6, w7\"\n      ]\n    },\n    \"xor al, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x34\",\n      \"ExpectedArm64ASM\": [\n        \"eor x26, x4, #0xff\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor ax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x35\",\n      \"ExpectedArm64ASM\": [\n        \"eor x26, x4, #0xffff\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor eax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x35\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w4, w4\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"xor rax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x35\",\n      \"ExpectedArm64ASM\": [\n        \"mvn x4, x4\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"cmp bx, cx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x39\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"lsl w0, w6, #16\",\n        \"cmp w0, w7, lsl #16\",\n        \"sub w26, w6, w7\"\n      ]\n    },\n    \"cmp ebx, ecx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x39\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"subs w26, w6, w7\"\n      ]\n    },\n    \"cmp rbx, rcx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x39\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x6, x7\",\n        \"subs x26, x6, x7\"\n      ]\n    },\n    \"db 0x3A, 0xcb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x3A\",\n        \"cmp bl, cl but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"lsl w0, w7, #24\",\n        \"cmp w0, w6, lsl #24\",\n        \"sub w26, w7, w6\"\n      ]\n    },\n    \"db 0x66, 0x3B, 0xcb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x3B\",\n        \"cmp bx, cx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"lsl w0, w7, #16\",\n        \"cmp w0, w6, lsl #16\",\n        \"sub w26, w7, w6\"\n      ]\n    },\n    \"db 0x3B, 0xcb\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x3B\",\n        \"cmp ebx, ecx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"subs w26, w7, w6\"\n      ]\n    },\n    \"db 0x48, 0x3B, 0xcb\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x3B\",\n        \"cmp rbx, rcx but modrm.rm as source\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x7, x6\",\n        \"subs x26, x7, x6\"\n      ]\n    },\n    \"cmp al, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x3C\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0x1 (1)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"cmp ax, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x3D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, #0x1 (1)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"cmp eax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x3D\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x1 (1)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"cmp rax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x3D\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x1 (1)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"cmp al, -1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x3C\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0xff (255)\"\n      ]\n    },\n    \"cmp ax, -1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x3D\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\"\n      ]\n    },\n    \"cmp eax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x3D\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds w26, w4, #0x1 (1)\"\n      ]\n    },\n    \"cmp rax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x3D\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds x26, x4, #0x1 (1)\"\n      ]\n    },\n    \"push ax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x50\",\n      \"ExpectedArm64ASM\": [\n        \"strh w4, [x8, #-2]!\"\n      ]\n    },\n    \"push rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x50\",\n      \"ExpectedArm64ASM\": [\n        \"str x4, [x8, #-8]!\"\n      ]\n    },\n    \"pop ax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8f\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x8], #2\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"pop rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8f\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x4, [x8], #8\"\n      ]\n    },\n    \"movsxd rax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x63\",\n      \"ExpectedArm64ASM\": [\n        \"sxtw x4, w6\"\n      ]\n    },\n    \"push word 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x68\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"strh w20, [x8, #-2]!\"\n      ]\n    },\n    \"push qword 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x68\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"str x20, [x8, #-8]!\"\n      ]\n    },\n    \"imul ax, bx, 257\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x69\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x101\",\n        \"sxth x21, w6\",\n        \"mul x20, x21, x20\",\n        \"sbfx x21, x20, #16, #16\",\n        \"bfxil x4, x20, #0, #16\",\n        \"sbfx x20, x20, #15, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul eax, ebx, 257\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x69\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x101\",\n        \"smull x21, w6, w20\",\n        \"asr x21, x21, #32\",\n        \"mul w4, w6, w20\",\n        \"sbfx x20, x4, #31, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul rax, rbx, 257\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x69\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x101\",\n        \"smulh x21, x6, x20\",\n        \"mul x4, x6, x20\",\n        \"asr x20, x4, #63\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"push word -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x6a\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"strh w20, [x8, #-2]!\"\n      ]\n    },\n    \"push dword -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x6a\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"str x20, [x8, #-8]!\"\n      ]\n    },\n    \"push qword -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x6a\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"str x20, [x8, #-8]!\"\n      ]\n    },\n    \"imul ax, bx, 3\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x6b\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3\",\n        \"sxth x21, w6\",\n        \"mul x20, x21, x20\",\n        \"sbfx x21, x20, #16, #16\",\n        \"bfxil x4, x20, #0, #16\",\n        \"sbfx x20, x20, #15, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul eax, ebx, 3\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x6b\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3\",\n        \"smull x21, w6, w20\",\n        \"asr x21, x21, #32\",\n        \"mul w4, w6, w20\",\n        \"sbfx x20, x4, #31, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul rax, rbx, 3\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x6b\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3\",\n        \"smulh x21, x6, x20\",\n        \"mul x4, x6, x20\",\n        \"asr x20, x4, #63\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"test al, bl\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x84\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w4, w6\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"test ax, bx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x84\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w4, w6\",\n        \"cmn wzr, w26, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"test eax, ebx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x84\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w4, w6\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"test rax, rbx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x84\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x4, x6\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"test al, al\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x84\",\n      \"ExpectedArm64ASM\": [\n        \"cmn wzr, w4, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x26, x4\"\n      ]\n    },\n    \"test ax, ax\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x84\",\n      \"ExpectedArm64ASM\": [\n        \"cmn wzr, w4, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x26, x4\"\n      ]\n    },\n    \"test eax, eax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x84\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"test rax, rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x84\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"db 0x86, 0xcb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x86\",\n        \"xchg bl, cl\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x6\",\n        \"bfxil x20, x7, #0, #8\",\n        \"bfxil x7, x6, #0, #8\",\n        \"mov x6, x20\"\n      ]\n    },\n    \"db 0x86, 0xd9\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x86\",\n        \"xchg cl, bl\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x7\",\n        \"bfxil x20, x6, #0, #8\",\n        \"bfxil x6, x7, #0, #8\",\n        \"mov x7, x20\"\n      ]\n    },\n    \"xchg [rax], cl\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x86\",\n      \"ExpectedArm64ASM\": [\n        \"swpalb w7, w20, [x4]\",\n        \"bfxil x7, x20, #0, #8\"\n      ]\n    },\n    \"db 0x66, 0x87, 0xcb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x87\",\n        \"xchg bx, cx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x6\",\n        \"bfxil x20, x7, #0, #16\",\n        \"bfxil x7, x6, #0, #16\",\n        \"mov x6, x20\"\n      ]\n    },\n    \"db 0x66, 0x87, 0xd9\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0x87\",\n        \"xchg cx, bx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x7\",\n        \"bfxil x20, x6, #0, #16\",\n        \"bfxil x6, x7, #0, #16\",\n        \"mov x7, x20\"\n      ]\n    },\n    \"xchg [rax], cx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x87\",\n      \"ExpectedArm64ASM\": [\n        \"swpalh w7, w20, [x4]\",\n        \"bfxil x7, x20, #0, #16\"\n      ]\n    },\n    \"db 0x87, 0xcb\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x87\",\n        \"xchg ebx, ecx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w7\",\n        \"mov w7, w6\",\n        \"mov x6, x20\"\n      ]\n    },\n    \"db 0x87, 0xd9\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x87\",\n        \"xchg ecx, ebx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w6\",\n        \"mov w6, w7\",\n        \"mov x7, x20\"\n      ]\n    },\n    \"xchg [rax], ecx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x87\",\n      \"ExpectedArm64ASM\": [\n        \"swpal w7, w7, [x4]\"\n      ]\n    },\n    \"db 0x48, 0x87, 0xcb\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x87\",\n        \"xchg rbx, rcx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x6\",\n        \"mov x6, x7\",\n        \"mov x7, x20\"\n      ]\n    },\n    \"db 0x48, 0x87, 0xd9\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x87\",\n        \"xchg rcx, rbx\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x6\",\n        \"mov x6, x7\",\n        \"mov x7, x20\"\n      ]\n    },\n    \"xchg [rax], rcx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x87\",\n      \"ExpectedArm64ASM\": [\n        \"swpal x7, x7, [x4]\"\n      ]\n    },\n    \"mov [rax], bl\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x88\",\n      \"ExpectedArm64ASM\": [\n        \"strb w6, [x4]\"\n      ]\n    },\n    \"mov [rax], bx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x89\",\n      \"ExpectedArm64ASM\": [\n        \"strh w6, [x4]\"\n      ]\n    },\n    \"mov [rax], ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x89\",\n      \"ExpectedArm64ASM\": [\n        \"str w6, [x4]\"\n      ]\n    },\n    \"mov [rax], rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x89\",\n      \"ExpectedArm64ASM\": [\n        \"str x6, [x4]\"\n      ]\n    },\n    \"mov bl, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8a\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"bfxil x6, x20, #0, #8\"\n      ]\n    },\n    \"mov bx, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8b\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"bfxil x6, x20, #0, #16\"\n      ]\n    },\n    \"mov ebx, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8b\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w6, [x4]\"\n      ]\n    },\n    \"mov rbx, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8b\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x6, [x4]\"\n      ]\n    },\n    \"mov ax, cs\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #962]\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"mov eax, cs\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w4, [x28, #962]\"\n      ]\n    },\n    \"mov rax, cs\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w4, [x28, #962]\"\n      ]\n    },\n    \"mov ax, es\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #960]\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"mov eax, es\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w4, [x28, #960]\"\n      ]\n    },\n    \"mov rax, es\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w4, [x28, #960]\"\n      ]\n    },\n    \"mov ax, ss\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #964]\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"mov eax, ss\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w4, [x28, #964]\"\n      ]\n    },\n    \"mov rax, ss\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w4, [x28, #964]\"\n      ]\n    },\n    \"mov ax, ds\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #966]\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"mov eax, ds\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w4, [x28, #966]\"\n      ]\n    },\n    \"mov rax, ds\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w4, [x28, #966]\"\n      ]\n    },\n    \"mov ax, gs\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"and x4, x4, #0xffffffffffff0000\"\n      ]\n    },\n    \"mov eax, gs\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"mov w4, #0x0\"\n      ]\n    },\n    \"mov rax, gs\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"mov w4, #0x0\"\n      ]\n    },\n    \"mov ax, fs\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"and x4, x4, #0xffffffffffff0000\"\n      ]\n    },\n    \"mov eax, fs\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"mov w4, #0x0\"\n      ]\n    },\n    \"mov rax, fs\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8c\",\n      \"ExpectedArm64ASM\": [\n        \"mov w4, #0x0\"\n      ]\n    },\n    \"lea ax, [rbx+rcx*1 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"lea eax, [rbx+rcx*1 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"lea rax, [rbx+rcx*1 + 0]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x4, x6, x7\"\n      ]\n    },\n    \"lea ax, [rbx+rcx*2 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7, lsl #1\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"lea eax, [rbx+rcx*2 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7, lsl #1\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"lea rax, [rbx+rcx*2 + 0]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x4, x6, x7, lsl #1\"\n      ]\n    },\n    \"lea ax, [rbx+rcx*4 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7, lsl #2\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"lea eax, [rbx+rcx*4 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7, lsl #2\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"lea rax, [rbx+rcx*4 + 0]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x4, x6, x7, lsl #2\"\n      ]\n    },\n    \"lea ax, [rbx+rcx*8 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7, lsl #3\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"lea eax, [rbx+rcx*8 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7, lsl #3\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"lea rax, [rbx+rcx*8 + 0]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x4, x6, x7, lsl #3\"\n      ]\n    },\n    \"lea ax, [ebx+ecx*1 + 0]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7\",\n        \"mov w20, w20\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"lea eax, [ebx+ecx*1 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"lea rax, [ebx+ecx*1 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"lea ax, [ebx+ecx*2 + 0]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7, lsl #1\",\n        \"mov w20, w20\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"lea eax, [ebx+ecx*2 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7, lsl #1\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"lea rax, [ebx+ecx*2 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7, lsl #1\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"lea ax, [ebx+ecx*4 + 0]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7, lsl #2\",\n        \"mov w20, w20\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"lea eax, [ebx+ecx*4 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7, lsl #2\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"lea rax, [ebx+ecx*4 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7, lsl #2\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"lea ax, [ebx+ecx*8 + 0]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7, lsl #3\",\n        \"mov w20, w20\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"lea eax, [ebx+ecx*8 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7, lsl #3\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"lea rax, [ebx+ecx*8 + 0]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8d\",\n      \"ExpectedArm64ASM\": [\n        \"add x20, x6, x7, lsl #3\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"mov cs, ax\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Skip\": \"Yes\",\n      \"Comment\": \"0x8e\"\n    },\n    \"mov es, ax\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x8e\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"strh w20, [x28, #960]\",\n        \"ubfx w21, w20, #2, #1\",\n        \"and w20, w20, #0xfff8\",\n        \"add x0, x28, x21, lsl #3\",\n        \"ldr x21, [x0, #1184]\",\n        \"ldr x20, [x21, w20, uxtw]\",\n        \"lsr x21, x20, #32\",\n        \"and w22, w21, #0xff000000\",\n        \"orr w20, w22, w20, lsr #16\",\n        \"bfi w20, w21, #16, #8\",\n        \"str w20, [x28, #976]\"\n      ]\n    },\n    \"mov ss, ax\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x8e\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"strh w20, [x28, #964]\",\n        \"ubfx w21, w20, #2, #1\",\n        \"and w20, w20, #0xfff8\",\n        \"add x0, x28, x21, lsl #3\",\n        \"ldr x21, [x0, #1184]\",\n        \"ldr x20, [x21, w20, uxtw]\",\n        \"lsr x21, x20, #32\",\n        \"and w22, w21, #0xff000000\",\n        \"orr w20, w22, w20, lsr #16\",\n        \"bfi w20, w21, #16, #8\",\n        \"str w20, [x28, #984]\"\n      ]\n    },\n    \"mov ds, ax\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x8e\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"strh w20, [x28, #966]\",\n        \"ubfx w21, w20, #2, #1\",\n        \"and w20, w20, #0xfff8\",\n        \"add x0, x28, x21, lsl #3\",\n        \"ldr x21, [x0, #1184]\",\n        \"ldr x20, [x21, w20, uxtw]\",\n        \"lsr x21, x20, #32\",\n        \"and w22, w21, #0xff000000\",\n        \"orr w20, w22, w20, lsr #16\",\n        \"bfi w20, w21, #16, #8\",\n        \"str w20, [x28, #988]\"\n      ]\n    },\n    \"mov gs, ax\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Skip\": \"Yes\",\n      \"Comment\": \"0x8e\"\n    },\n    \"mov fs, ax\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Skip\": \"Yes\",\n      \"Comment\": \"0x8e\"\n    },\n    \"pop word [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8f\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x8], #2\",\n        \"strh w20, [x4]\"\n      ]\n    },\n    \"pop qword [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x8f\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x8], #8\",\n        \"str x20, [x4]\"\n      ]\n    },\n    \"xchg ax, bx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x90\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x6\",\n        \"bfxil x20, x4, #0, #16\",\n        \"bfxil x4, x6, #0, #16\",\n        \"mov x6, x20\"\n      ]\n    },\n    \"xchg eax, ebx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x90\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w4\",\n        \"mov w4, w6\",\n        \"mov x6, x20\"\n      ]\n    },\n    \"xchg rax, rbx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x90\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x6\",\n        \"mov x6, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"nop\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": \"0x90\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"pause\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xF3 0x90\",\n      \"ExpectedArm64ASM\": [\n        \"yield\"\n      ]\n    },\n    \"cbw\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x98\",\n      \"ExpectedArm64ASM\": [\n        \"sxtb w20, w4\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cwde\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x98\",\n      \"ExpectedArm64ASM\": [\n        \"sxth w4, w4\"\n      ]\n    },\n    \"cdqe\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x98\",\n      \"ExpectedArm64ASM\": [\n        \"sxtw x4, w4\"\n      ]\n    },\n    \"cwd\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x98\",\n      \"ExpectedArm64ASM\": [\n        \"sbfx w20, w4, #15, #1\",\n        \"bfxil x5, x20, #0, #16\"\n      ]\n    },\n    \"cdq\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x99\",\n      \"ExpectedArm64ASM\": [\n        \"asr w5, w4, #31\"\n      ]\n    },\n    \"cqo\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x99\",\n      \"ExpectedArm64ASM\": [\n        \"asr x5, x4, #63\"\n      ]\n    },\n    \"fwait\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": \"0x9b\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"pushf\": {\n      \"ExpectedInstructionCount\": 39,\n      \"Comment\": \"0x9c\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"eor x21, x27, x26\",\n        \"ubfx w21, w21, #4, #1\",\n        \"orr x20, x20, x21, lsl #4\",\n        \"ldrb w21, [x28, #1016]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1017]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrsb x21, [x28, #1018]\",\n        \"lsr x21, x21, #63\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"cset x21, vs\",\n        \"orr x20, x20, x21, lsl #11\",\n        \"ldrb w21, [x28, #1020]\",\n        \"orr x20, x20, x21, lsl #12\",\n        \"ldrb w21, [x28, #1022]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1024]\",\n        \"orr x20, x20, x21, lsl #16\",\n        \"ldrb w21, [x28, #1025]\",\n        \"orr x20, x20, x21, lsl #17\",\n        \"ldrb w21, [x28, #1026]\",\n        \"orr x20, x20, x21, lsl #18\",\n        \"ldrb w21, [x28, #1027]\",\n        \"orr x20, x20, x21, lsl #19\",\n        \"ldrb w21, [x28, #1028]\",\n        \"orr x20, x20, x21, lsl #20\",\n        \"ldrb w21, [x28, #1029]\",\n        \"orr x20, x20, x21, lsl #21\",\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w21, w0, w0, lsr #1\",\n        \"orr x21, x21, #0xfffffffffffffffe\",\n        \"orn x20, x20, x21, ror #62\",\n        \"mrs x21, nzcv\",\n        \"and x21, x21, #0xc0000000\",\n        \"orr x20, x20, x21, lsr #24\",\n        \"orr x20, x20, #0x2\",\n        \"str x20, [x8, #-8]!\"\n      ]\n    },\n    \"pushfq\": {\n      \"ExpectedInstructionCount\": 39,\n      \"Comment\": \"0x9c\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"eor x21, x27, x26\",\n        \"ubfx w21, w21, #4, #1\",\n        \"orr x20, x20, x21, lsl #4\",\n        \"ldrb w21, [x28, #1016]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1017]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrsb x21, [x28, #1018]\",\n        \"lsr x21, x21, #63\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"cset x21, vs\",\n        \"orr x20, x20, x21, lsl #11\",\n        \"ldrb w21, [x28, #1020]\",\n        \"orr x20, x20, x21, lsl #12\",\n        \"ldrb w21, [x28, #1022]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1024]\",\n        \"orr x20, x20, x21, lsl #16\",\n        \"ldrb w21, [x28, #1025]\",\n        \"orr x20, x20, x21, lsl #17\",\n        \"ldrb w21, [x28, #1026]\",\n        \"orr x20, x20, x21, lsl #18\",\n        \"ldrb w21, [x28, #1027]\",\n        \"orr x20, x20, x21, lsl #19\",\n        \"ldrb w21, [x28, #1028]\",\n        \"orr x20, x20, x21, lsl #20\",\n        \"ldrb w21, [x28, #1029]\",\n        \"orr x20, x20, x21, lsl #21\",\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w21, w0, w0, lsr #1\",\n        \"orr x21, x21, #0xfffffffffffffffe\",\n        \"orn x20, x20, x21, ror #62\",\n        \"mrs x21, nzcv\",\n        \"and x21, x21, #0xc0000000\",\n        \"orr x20, x20, x21, lsr #24\",\n        \"orr x20, x20, #0x2\",\n        \"str x20, [x8, #-8]!\"\n      ]\n    },\n    \"popf\": {\n      \"ExpectedInstructionCount\": 44,\n      \"Comment\": \"0x9d\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x8], #8\",\n        \"mov w21, #0x202\",\n        \"orr x27, x20, x21\",\n        \"mvn w20, w27\",\n        \"ubfx x21, x20, #0, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"ubfx w26, w20, #2, #1\",\n        \"ubfx x20, x27, #6, #1\",\n        \"bfi w22, w20, #30, #1\",\n        \"ubfx x20, x27, #7, #1\",\n        \"bfi w22, w20, #31, #1\",\n        \"ubfx w20, w27, #8, #1\",\n        \"ldrb w21, [x28, #1016]\",\n        \"and w21, w21, #0xfffffffe\",\n        \"mov w23, #0x1\",\n        \"cmp x20, #0x0 (0)\",\n        \"csel x20, x21, x23, eq\",\n        \"strb w20, [x28, #1016]\",\n        \"ubfx w20, w27, #9, #1\",\n        \"strb w20, [x28, #1017]\",\n        \"ubfx w20, w27, #10, #1\",\n        \"sub x20, x23, x20, lsl #1\",\n        \"ubfx x21, x27, #11, #1\",\n        \"bfi w22, w21, #28, #1\",\n        \"ubfx w21, w27, #12, #1\",\n        \"strb w21, [x28, #1020]\",\n        \"ubfx w21, w27, #14, #1\",\n        \"strb w21, [x28, #1022]\",\n        \"ubfx w21, w27, #16, #1\",\n        \"strb w21, [x28, #1024]\",\n        \"ubfx w21, w27, #17, #1\",\n        \"strb w21, [x28, #1025]\",\n        \"ubfx w21, w27, #18, #1\",\n        \"strb w21, [x28, #1026]\",\n        \"ubfx w21, w27, #19, #1\",\n        \"strb w21, [x28, #1027]\",\n        \"ubfx w21, w27, #20, #1\",\n        \"strb w21, [x28, #1028]\",\n        \"ubfx w21, w27, #21, #1\",\n        \"strb w21, [x28, #1029]\",\n        \"mov w21, #0x10001\",\n        \"msr nzcv, x22\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"sahf\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"0x9e\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx w20, w4, #8, #8\",\n        \"mov w21, #0x28\",\n        \"bic x20, x20, x21\",\n        \"orr x27, x20, #0x2\",\n        \"mvn w20, w27\",\n        \"ubfx x21, x20, #0, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"ubfx w26, w20, #2, #1\",\n        \"ubfx x20, x27, #6, #1\",\n        \"bfi w22, w20, #30, #1\",\n        \"ubfx x20, x27, #7, #1\",\n        \"bfi w22, w20, #31, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"lahf\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"0x9f\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"eor x21, x27, x26\",\n        \"ubfx w21, w21, #4, #1\",\n        \"orr x20, x20, x21, lsl #4\",\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w21, w0, w0, lsr #1\",\n        \"orr x21, x21, #0xfffffffffffffffe\",\n        \"orn x20, x20, x21, ror #62\",\n        \"mrs x21, nzcv\",\n        \"and x21, x21, #0xc0000000\",\n        \"orr x20, x20, x21, lsr #24\",\n        \"orr x20, x20, #0x2\",\n        \"bfi x4, x20, #8, #8\"\n      ]\n    },\n    \"mov rax, [qword 0xe0000008]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xa1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x8\",\n        \"movk w20, #0xe000, lsl #16\",\n        \"ldr x4, [x20]\"\n      ]\n    },\n    \"mov eax, [qword 0xe0000000]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xa1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xe0000000\",\n        \"ldr w4, [x20]\"\n      ]\n    },\n    \"mov [qword 0xe0000008], rax\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xa3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x8\",\n        \"movk w20, #0xe000, lsl #16\",\n        \"str x4, [x20]\"\n      ]\n    },\n    \"mov [qword 0xe0000000], eax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xa3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xe0000000\",\n        \"str w4, [x20]\"\n      ]\n    },\n    \"movsb\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xa4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x10]\",\n        \"strb w20, [x11]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x10, x10, x20\",\n        \"add x11, x11, x20\"\n      ]\n    },\n    \"movsw\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xa5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x10]\",\n        \"strh w20, [x11]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x10, x10, x20, lsl #1\",\n        \"add x11, x11, x20, lsl #1\"\n      ]\n    },\n    \"movsd\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xa5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x10]\",\n        \"str w20, [x11]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x10, x10, x20, lsl #2\",\n        \"add x11, x11, x20, lsl #2\"\n      ]\n    },\n    \"movsq\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xa5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x10]\",\n        \"str x20, [x11]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x10, x10, x20, lsl #3\",\n        \"add x11, x11, x20, lsl #3\"\n      ]\n    },\n    \"rep movsb\": {\n      \"ExpectedInstructionCount\": 83,\n      \"Comment\": \"0xa4\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x22, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"tbnz w22, #1, #+0x94\",\n        \"cbz x0, #+0x78\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x54\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x40 (64)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x40 (64)\",\n        \"cbz x0, #+0x34\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x14\",\n        \"ldrb w3, [x2], #1\",\n        \"strb w3, [x1], #1\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"add x21, x0, x2\",\n        \"add x20, x1, x2\",\n        \"b #+0xa0\",\n        \"cbz x0, #+0x88\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x64\",\n        \"sub x1, x1, #0x1f (31)\",\n        \"sub x2, x2, #0x1f (31)\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x40 (64)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x40 (64)\",\n        \"cbz x0, #+0x3c\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x1c\",\n        \"add x1, x1, #0x1f (31)\",\n        \"add x2, x2, #0x1f (31)\",\n        \"ldrb w3, [x2], #-1\",\n        \"strb w3, [x1], #-1\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"sub x21, x0, x2\",\n        \"sub x20, x1, x2\",\n        \"mov w7, #0x0\",\n        \"mov x11, x21\",\n        \"mov x10, x20\"\n      ]\n    },\n    \"rep movsw\": {\n      \"ExpectedInstructionCount\": 83,\n      \"Comment\": \"0xa5\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x22, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"tbnz w22, #1, #+0x94\",\n        \"cbz x0, #+0x78\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x54\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x34\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x14\",\n        \"ldrh w3, [x2], #2\",\n        \"strh w3, [x1], #2\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"add x21, x0, x2, lsl #1\",\n        \"add x20, x1, x2, lsl #1\",\n        \"b #+0xa0\",\n        \"cbz x0, #+0x88\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x64\",\n        \"sub x1, x1, #0x1e (30)\",\n        \"sub x2, x2, #0x1e (30)\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x3c\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x1c\",\n        \"add x1, x1, #0x1e (30)\",\n        \"add x2, x2, #0x1e (30)\",\n        \"ldrh w3, [x2], #-2\",\n        \"strh w3, [x1], #-2\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"sub x21, x0, x2, lsl #1\",\n        \"sub x20, x1, x2, lsl #1\",\n        \"mov w7, #0x0\",\n        \"mov x11, x21\",\n        \"mov x10, x20\"\n      ]\n    },\n    \"rep movsd\": {\n      \"ExpectedInstructionCount\": 83,\n      \"Comment\": \"0xa5\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x22, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"tbnz w22, #1, #+0x94\",\n        \"cbz x0, #+0x78\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x54\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x34\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x14\",\n        \"ldr w3, [x2], #4\",\n        \"str w3, [x1], #4\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"add x21, x0, x2, lsl #2\",\n        \"add x20, x1, x2, lsl #2\",\n        \"b #+0xa0\",\n        \"cbz x0, #+0x88\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x64\",\n        \"sub x1, x1, #0x1c (28)\",\n        \"sub x2, x2, #0x1c (28)\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x3c\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x1c\",\n        \"add x1, x1, #0x1c (28)\",\n        \"add x2, x2, #0x1c (28)\",\n        \"ldr w3, [x2], #-4\",\n        \"str w3, [x1], #-4\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"sub x21, x0, x2, lsl #2\",\n        \"sub x20, x1, x2, lsl #2\",\n        \"mov w7, #0x0\",\n        \"mov x11, x21\",\n        \"mov x10, x20\"\n      ]\n    },\n    \"rep movsq\": {\n      \"ExpectedInstructionCount\": 83,\n      \"Comment\": \"0xa5\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x22, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"mov x2, x10\",\n        \"tbnz w22, #1, #+0x94\",\n        \"cbz x0, #+0x78\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x54\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x34\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #32\",\n        \"stp q0, q1, [x1], #32\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x4 (4)\",\n        \"cbz x0, #+0x14\",\n        \"ldr x3, [x2], #8\",\n        \"str x3, [x1], #8\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"add x21, x0, x2, lsl #3\",\n        \"add x20, x1, x2, lsl #3\",\n        \"b #+0xa0\",\n        \"cbz x0, #+0x88\",\n        \"sub x3, x1, x2\",\n        \"tbz x3, #63, #+0x8\",\n        \"neg x3, x3\",\n        \"sub x3, x3, #0x20 (32)\",\n        \"tbnz x3, #63, #+0x64\",\n        \"sub x1, x1, #0x18 (24)\",\n        \"sub x2, x2, #0x18 (24)\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x44\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x1c\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0x14\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x3c\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"ldp q0, q1, [x2], #-32\",\n        \"stp q0, q1, [x1], #-32\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x4 (4)\",\n        \"cbz x0, #+0x1c\",\n        \"add x1, x1, #0x18 (24)\",\n        \"add x2, x2, #0x18 (24)\",\n        \"ldr x3, [x2], #-8\",\n        \"str x3, [x1], #-8\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0xc\",\n        \"mov x0, x11\",\n        \"mov x1, x10\",\n        \"mov x2, x7\",\n        \"sub x21, x0, x2, lsl #3\",\n        \"sub x20, x1, x2, lsl #3\",\n        \"mov w7, #0x0\",\n        \"mov x11, x21\",\n        \"mov x10, x20\"\n      ]\n    },\n    \"cmpsb\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xa6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x11]\",\n        \"ldrb w21, [x10]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w21, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20\",\n        \"add x10, x10, x20\"\n      ]\n    },\n    \"cmpsw\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xa7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x11]\",\n        \"ldrh w21, [x10]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w21, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #1\",\n        \"add x10, x10, x20, lsl #1\"\n      ]\n    },\n    \"cmpsd\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xa7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x11]\",\n        \"ldr w21, [x10]\",\n        \"eor x27, x21, x20\",\n        \"subs w26, w21, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #2\",\n        \"add x10, x10, x20, lsl #2\"\n      ]\n    },\n    \"cmpsq\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xa7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x11]\",\n        \"ldr x21, [x10]\",\n        \"eor x27, x21, x20\",\n        \"subs x26, x21, x20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #3\",\n        \"add x10, x10, x20, lsl #3\"\n      ]\n    },\n    \"repz cmpsb\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": \"0xa6\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x64\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldrb w26, [x11]\",\n        \"ldrb w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x1 (1)\",\n        \"add x10, x10, #0x1 (1)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"ldrb w26, [x11]\",\n        \"ldrb w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x1 (1)\",\n        \"sub x10, x10, #0x1 (1)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"eor x20, x27, x26\",\n        \"lsl w0, w27, #24\",\n        \"cmp w0, w26, lsl #24\",\n        \"sub w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repz cmpsw\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x64\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldrh w26, [x11]\",\n        \"ldrh w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x2 (2)\",\n        \"add x10, x10, #0x2 (2)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"ldrh w26, [x11]\",\n        \"ldrh w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x2 (2)\",\n        \"sub x10, x10, #0x2 (2)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"eor x20, x27, x26\",\n        \"lsl w0, w27, #16\",\n        \"cmp w0, w26, lsl #16\",\n        \"sub w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repz cmpsd\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x5c\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldr w26, [x11]\",\n        \"ldr w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x4 (4)\",\n        \"add x10, x10, #0x4 (4)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"ldr w26, [x11]\",\n        \"ldr w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x4 (4)\",\n        \"sub x10, x10, #0x4 (4)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"eor x20, x27, x26\",\n        \"subs w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repz cmpsq\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x5c\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldr x26, [x11]\",\n        \"ldr x27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x8 (8)\",\n        \"add x10, x10, #0x8 (8)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"ldr x26, [x11]\",\n        \"ldr x27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x8 (8)\",\n        \"sub x10, x10, #0x8 (8)\",\n        \"ccmp x27, x26, #nzcv, ne\",\n        \"b.eq #-0x18\",\n        \"eor x20, x27, x26\",\n        \"subs x26, x27, x26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repnz cmpsb\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": \"0xa6\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x64\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldrb w26, [x11]\",\n        \"ldrb w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x1 (1)\",\n        \"add x10, x10, #0x1 (1)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"ldrb w26, [x11]\",\n        \"ldrb w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x1 (1)\",\n        \"sub x10, x10, #0x1 (1)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"eor x20, x27, x26\",\n        \"lsl w0, w27, #24\",\n        \"cmp w0, w26, lsl #24\",\n        \"sub w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repnz cmpsw\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x64\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldrh w26, [x11]\",\n        \"ldrh w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x2 (2)\",\n        \"add x10, x10, #0x2 (2)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"ldrh w26, [x11]\",\n        \"ldrh w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x2 (2)\",\n        \"sub x10, x10, #0x2 (2)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"eor x20, x27, x26\",\n        \"lsl w0, w27, #16\",\n        \"cmp w0, w26, lsl #16\",\n        \"sub w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repnz cmpsd\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x5c\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldr w26, [x11]\",\n        \"ldr w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x4 (4)\",\n        \"add x10, x10, #0x4 (4)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"ldr w26, [x11]\",\n        \"ldr w27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x4 (4)\",\n        \"sub x10, x10, #0x4 (4)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"eor x20, x27, x26\",\n        \"subs w26, w27, w26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"repnz cmpsq\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xa7\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x5c\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"ldr x26, [x11]\",\n        \"ldr x27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x8 (8)\",\n        \"add x10, x10, #0x8 (8)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"ldr x26, [x11]\",\n        \"ldr x27, [x10]\",\n        \"subs x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x8 (8)\",\n        \"sub x10, x10, #0x8 (8)\",\n        \"ccmp x27, x26, #nZcv, ne\",\n        \"b.ne #-0x18\",\n        \"eor x20, x27, x26\",\n        \"subs x26, x27, x26\",\n        \"mov x27, x20\"\n      ]\n    },\n    \"test al, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xa8\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w4, #0x1\",\n        \"cmp w26, #0x0 (0)\"\n      ]\n    },\n    \"test ax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xa9\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w4, #0x1\",\n        \"cmp w26, #0x0 (0)\"\n      ]\n    },\n    \"test eax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0xa9\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w4, #0x1\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"test rax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0xa9\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x4, #0x1\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"test al, -1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0xa8\",\n      \"ExpectedArm64ASM\": [\n        \"cmn wzr, w4, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x26, x4\"\n      ]\n    },\n    \"test ax, -1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0xa9\",\n      \"ExpectedArm64ASM\": [\n        \"cmn wzr, w4, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x26, x4\"\n      ]\n    },\n    \"test eax, -1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xa9\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"test rax, -1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xa9\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"stosb\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xaa\",\n      \"ExpectedArm64ASM\": [\n        \"strb w4, [x11]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20\"\n      ]\n    },\n    \"stosw\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xab\",\n      \"ExpectedArm64ASM\": [\n        \"strh w4, [x11]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #1\"\n      ]\n    },\n    \"stosd\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xab\",\n      \"ExpectedArm64ASM\": [\n        \"str w4, [x11]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #2\"\n      ]\n    },\n    \"stosq\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xab\",\n      \"ExpectedArm64ASM\": [\n        \"str x4, [x11]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #3\"\n      ]\n    },\n    \"rep stosb\": {\n      \"ExpectedInstructionCount\": 55,\n      \"Comment\": \"0xaa\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"ldrsb x21, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"tbnz w21, #1, #+0x64\",\n        \"cbz x0, #+0x58\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.16b, w20\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #32\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x40 (64)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x40 (64)\",\n        \"cbz x0, #+0x2c\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x10\",\n        \"strb w20, [x1], #1\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"add x11, x11, x7\",\n        \"b #+0x68\",\n        \"cbz x0, #+0x60\",\n        \"sub x1, x1, #0x1f (31)\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.16b, w20\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #-32\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x40 (64)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x40 (64)\",\n        \"cbz x0, #+0x30\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x14\",\n        \"add x1, x1, #0x1f (31)\",\n        \"strb w20, [x1], #-1\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"sub x11, x11, x7\",\n        \"mov w7, #0x0\"\n      ]\n    },\n    \"rep stosw\": {\n      \"ExpectedInstructionCount\": 55,\n      \"Comment\": \"0xab\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"ldrsb x21, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"tbnz w21, #1, #+0x64\",\n        \"cbz x0, #+0x58\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.8h, w20\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #32\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x2c\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x10\",\n        \"strh w20, [x1], #2\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"add x11, x11, x7, lsl #1\",\n        \"b #+0x68\",\n        \"cbz x0, #+0x60\",\n        \"sub x1, x1, #0x1e (30)\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.8h, w20\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #-32\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x20 (32)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x20 (32)\",\n        \"cbz x0, #+0x30\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x14\",\n        \"add x1, x1, #0x1e (30)\",\n        \"strh w20, [x1], #-2\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"sub x11, x11, x7, lsl #1\",\n        \"mov w7, #0x0\"\n      ]\n    },\n    \"rep stosd\": {\n      \"ExpectedInstructionCount\": 55,\n      \"Comment\": \"0xab\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w4\",\n        \"ldrsb x21, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"tbnz w21, #1, #+0x64\",\n        \"cbz x0, #+0x58\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.4s, w20\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #32\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x2c\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x10\",\n        \"str w20, [x1], #4\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"add x11, x11, x7, lsl #2\",\n        \"b #+0x68\",\n        \"cbz x0, #+0x60\",\n        \"sub x1, x1, #0x1c (28)\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.4s, w20\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #-32\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x10 (16)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x10 (16)\",\n        \"cbz x0, #+0x30\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x14\",\n        \"add x1, x1, #0x1c (28)\",\n        \"str w20, [x1], #-4\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"sub x11, x11, x7, lsl #2\",\n        \"mov w7, #0x0\"\n      ]\n    },\n    \"rep stosq\": {\n      \"ExpectedInstructionCount\": 54,\n      \"Comment\": [\n        \"Unrolling the loop for faster memset can be done.\",\n        \"Taking advantage of ARM MOPs instructions can be done\",\n        \"0xab\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"mov x0, x7\",\n        \"mov x1, x11\",\n        \"tbnz w20, #1, #+0x64\",\n        \"cbz x0, #+0x58\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.2d, x4\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #32\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x2c\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #32\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x4 (4)\",\n        \"cbz x0, #+0x10\",\n        \"str x4, [x1], #8\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"add x11, x11, x7, lsl #3\",\n        \"b #+0x68\",\n        \"cbz x0, #+0x60\",\n        \"sub x1, x1, #0x18 (24)\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x3c\",\n        \"dup v1.2d, x4\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x14\",\n        \"stp q1, q1, [x1], #-32\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x8 (8)\",\n        \"tbz x0, #63, #-0xc\",\n        \"add x0, x0, #0x8 (8)\",\n        \"cbz x0, #+0x30\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbnz x0, #63, #+0x10\",\n        \"stp q1, q1, [x1], #-32\",\n        \"sub x0, x0, #0x4 (4)\",\n        \"tbz x0, #63, #-0x8\",\n        \"add x0, x0, #0x4 (4)\",\n        \"cbz x0, #+0x14\",\n        \"add x1, x1, #0x18 (24)\",\n        \"str x4, [x1], #-8\",\n        \"sub x0, x0, #0x1 (1)\",\n        \"cbnz x0, #-0x8\",\n        \"sub x11, x11, x7, lsl #3\",\n        \"mov w7, #0x0\"\n      ]\n    },\n    \"lodsb\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0xac\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x10]\",\n        \"bfxil x4, x20, #0, #8\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x10, x10, x20\"\n      ]\n    },\n    \"lodsw\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0xad\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x10]\",\n        \"bfxil x4, x20, #0, #16\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x10, x10, x20, lsl #1\"\n      ]\n    },\n    \"lodsd\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xad\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x10]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x10, x10, x20, lsl #2\"\n      ]\n    },\n    \"lodsq\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xad\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x4, [x10]\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x10, x10, x20, lsl #3\"\n      ]\n    },\n    \"rep lodsb\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"0xac\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x18\",\n        \"ldrb w20, [x10]\",\n        \"bfxil x4, x20, #0, #8\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x10, x10, #0x1 (1)\",\n        \"b #-0x14\",\n        \"b #+0x1c\",\n        \"cbz x7, #+0x18\",\n        \"ldrb w20, [x10]\",\n        \"bfxil x4, x20, #0, #8\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x10, x10, #0x1 (1)\",\n        \"b #-0x14\"\n      ]\n    },\n    \"rep lodsw\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"0xad\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x18\",\n        \"ldrh w20, [x10]\",\n        \"bfxil x4, x20, #0, #16\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x10, x10, #0x2 (2)\",\n        \"b #-0x14\",\n        \"b #+0x1c\",\n        \"cbz x7, #+0x18\",\n        \"ldrh w20, [x10]\",\n        \"bfxil x4, x20, #0, #16\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x10, x10, #0x2 (2)\",\n        \"b #-0x14\"\n      ]\n    },\n    \"rep lodsd\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"0xad\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x1c\",\n        \"cbz x7, #+0x14\",\n        \"ldr w4, [x10]\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x10, x10, #0x4 (4)\",\n        \"b #-0x10\",\n        \"b #+0x18\",\n        \"cbz x7, #+0x14\",\n        \"ldr w4, [x10]\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x10, x10, #0x4 (4)\",\n        \"b #-0x10\"\n      ]\n    },\n    \"rep lodsq\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"0xad\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x1c\",\n        \"cbz x7, #+0x14\",\n        \"ldr x4, [x10]\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x10, x10, #0x8 (8)\",\n        \"b #-0x10\",\n        \"b #+0x18\",\n        \"cbz x7, #+0x14\",\n        \"ldr x4, [x10]\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x10, x10, #0x8 (8)\",\n        \"b #-0x10\"\n      ]\n    },\n    \"scasb\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xae\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20\"\n      ]\n    },\n    \"scasw\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #1\"\n      ]\n    },\n    \"scasd\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #2\"\n      ]\n    },\n    \"scasq\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs x26, x4, x20\",\n        \"ldrsb x20, [x28, #1018]\",\n        \"add x11, x11, x20, lsl #3\"\n      ]\n    },\n    \"repz scasb\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xae\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x2c\",\n        \"cbz x7, #+0x24\",\n        \"ldrb w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x1 (1)\",\n        \"b.eq #-0x20\",\n        \"b #+0x28\",\n        \"cbz x7, #+0x24\",\n        \"ldrb w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x1 (1)\",\n        \"b.eq #-0x20\"\n      ]\n    },\n    \"repz scasw\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x2c\",\n        \"cbz x7, #+0x24\",\n        \"ldrh w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x2 (2)\",\n        \"b.eq #-0x20\",\n        \"b #+0x28\",\n        \"cbz x7, #+0x24\",\n        \"ldrh w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x2 (2)\",\n        \"b.eq #-0x20\"\n      ]\n    },\n    \"repz scasd\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"cbz x7, #+0x1c\",\n        \"ldr w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x4 (4)\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x1c\",\n        \"ldr w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x4 (4)\",\n        \"b.eq #-0x18\"\n      ]\n    },\n    \"repz scasq\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"cbz x7, #+0x1c\",\n        \"ldr x20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs x26, x4, x20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x8 (8)\",\n        \"b.eq #-0x18\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x1c\",\n        \"ldr x20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs x26, x4, x20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x8 (8)\",\n        \"b.eq #-0x18\"\n      ]\n    },\n    \"repnz scasb\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xae\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x2c\",\n        \"cbz x7, #+0x24\",\n        \"ldrb w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x1 (1)\",\n        \"b.ne #-0x20\",\n        \"b #+0x28\",\n        \"cbz x7, #+0x24\",\n        \"ldrb w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x1 (1)\",\n        \"b.ne #-0x20\"\n      ]\n    },\n    \"repnz scasw\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x2c\",\n        \"cbz x7, #+0x24\",\n        \"ldrh w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x2 (2)\",\n        \"b.ne #-0x20\",\n        \"b #+0x28\",\n        \"cbz x7, #+0x24\",\n        \"ldrh w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x2 (2)\",\n        \"b.ne #-0x20\"\n      ]\n    },\n    \"repnz scasd\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"cbz x7, #+0x1c\",\n        \"ldr w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x4 (4)\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x1c\",\n        \"ldr w20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs w26, w4, w20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x4 (4)\",\n        \"b.ne #-0x18\"\n      ]\n    },\n    \"repnz scasq\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrsb x20, [x28, #1018]\",\n        \"lsr x20, x20, #63\",\n        \"cbz x20, #+0x8\",\n        \"b #+0x24\",\n        \"cbz x7, #+0x1c\",\n        \"ldr x20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs x26, x4, x20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"add x11, x11, #0x8 (8)\",\n        \"b.ne #-0x18\",\n        \"b #+0x20\",\n        \"cbz x7, #+0x1c\",\n        \"ldr x20, [x11]\",\n        \"eor x27, x4, x20\",\n        \"subs x26, x4, x20\",\n        \"sub x7, x7, #0x1 (1)\",\n        \"sub x11, x11, #0x8 (8)\",\n        \"b.ne #-0x18\"\n      ]\n    },\n    \"mov al, 0x0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"and x4, x4, #0xffffffffffffff00\"\n      ]\n    },\n    \"xor al, al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, w4\",\n        \"and x4, x4, #0xffffffffffffff00\"\n      ]\n    },\n    \"mov ah, 0x0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"and x4, x4, #0xffffffffffff00ff\"\n      ]\n    },\n    \"xor ah, ah\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, w4\",\n        \"and x4, x4, #0xffffffffffff00ff\"\n      ]\n    },\n    \"mov al, 0xff\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xb0\",\n      \"ExpectedArm64ASM\": [\n        \"orr x4, x4, #0xff\"\n      ]\n    },\n    \"mov al, 0x82\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xb0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x82\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"mov ah, 0xff\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"orr x4, x4, #0xff00\"\n      ]\n    },\n    \"mov ax, 0xffff\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xb8\",\n      \"ExpectedArm64ASM\": [\n        \"orr x4, x4, #0xffff\"\n      ]\n    },\n    \"mov ax, 0x4243\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xb8\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x4243\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"mov ax, 0x0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"and x4, x4, #0xffffffffffff0000\"\n      ]\n    },\n    \"xor ax, ax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, w4\",\n        \"and x4, x4, #0xffffffffffff0000\"\n      ]\n    },\n    \"mov eax, 0x0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"mov w4, #0x0\"\n      ]\n    },\n    \"xor eax, eax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, w4\",\n        \"mov w4, #0x0\"\n      ]\n    },\n    \"mov eax, 0xffffffff\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"movz+movk doesn't turn in to bitfield move\",\n        \"0xb8\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, #0xffffffff\"\n      ]\n    },\n    \"mov eax, 0x44454647\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xb8\",\n      \"ExpectedArm64ASM\": [\n        \"mov w4, #0x4647\",\n        \"movk w4, #0x4445, lsl #16\"\n      ]\n    },\n    \"mov rax, 0x0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xb0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w4, #0x0\"\n      ]\n    },\n    \"xor rax, rax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xb0\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, w4\",\n        \"mov w4, #0x0\"\n      ]\n    },\n    \"mov rax, 0xffffffffffffffff\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xb8\",\n      \"ExpectedArm64ASM\": [\n        \"mov x4, #0xffffffffffffffff\"\n      ]\n    },\n    \"mov rax, 0x5152535455565758\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0xb8\",\n      \"ExpectedArm64ASM\": [\n        \"mov x4, #0x5758\",\n        \"movk x4, #0x5556, lsl #16\",\n        \"movk x4, #0x5354, lsl #32\",\n        \"movk x4, #0x5152, lsl #48\"\n      ]\n    },\n    \"xlat\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xd7\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"ldrb w20, [x6, x20, sxtx]\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"retf 0x1234\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"0xca\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x8\",\n        \"ldp w21, w22, [x20], #8\",\n        \"mov w23, #0x1234\",\n        \"add x8, x20, x23\",\n        \"strh w22, [x28, #962]\",\n        \"ubfx w20, w22, #2, #1\",\n        \"and w22, w22, #0xfff8\",\n        \"add x0, x28, x20, lsl #3\",\n        \"ldr x20, [x0, #1184]\",\n        \"ldr x20, [x20, w22, uxtw]\",\n        \"lsr x22, x20, #32\",\n        \"and w23, w22, #0xff000000\",\n        \"orr w20, w23, w20, lsr #16\",\n        \"bfi w20, w22, #16, #8\",\n        \"str w20, [x28, #980]\"\n      ]\n    },\n    \"retf\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0xcb\",\n      \"ExpectedArm64ASM\": [\n        \"ldp w20, w21, [x8], #8\",\n        \"strh w21, [x28, #962]\",\n        \"ubfx w22, w21, #2, #1\",\n        \"and w21, w21, #0xfff8\",\n        \"add x0, x28, x22, lsl #3\",\n        \"ldr x22, [x0, #1184]\",\n        \"ldr x21, [x22, w21, uxtw]\",\n        \"lsr x22, x21, #32\",\n        \"and w23, w22, #0xff000000\",\n        \"orr w21, w23, w21, lsr #16\",\n        \"bfi w21, w22, #16, #8\",\n        \"str w21, [x28, #980]\"\n      ]\n    },\n    \"cmc\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf5\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"clc\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0xf8\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"stc\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0xf9\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x0\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"cli\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Skip\": \"Yes\",\n      \"Comment\": \"0xfa\"\n    },\n    \"sti\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Skip\": \"Yes\",\n      \"Comment\": \"0xfb\"\n    },\n    \"cld\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xfc\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    },\n    \"std\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xfd\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"strb w20, [x28, #1018]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/PrimaryGroup.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ]\n  },\n  \"Comment\": [\n    \"Instructions in this table that are marked optimal don't have their flag calculation part of this assumption\",\n    \"Flags calculation can dramatically change an instruction's lengths so this is mostly ignored here.\"\n  ],\n  \"Instructions\": {\n    \"add al, 1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP1 0x80 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w4, #0x1 (1)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"or al, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x80 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr x26, x4, #0x1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc al, 1\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"GROUP1 0x80 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w4, w20\",\n        \"uxtb w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"bic w20, w26, w4\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"msr nzcv, x21\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"sbb al, 1\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": \"GROUP1 0x80 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"uxtb w21, w4\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxtb w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"bic w20, w21, w26\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"msr nzcv, x22\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"and al, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x80 /4\",\n      \"ExpectedArm64ASM\": [\n        \"and x26, x4, #0xffffffffffffff01\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub al, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP1 0x80 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0x1 (1)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #8\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"xor al, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x80 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor x26, x4, #0x1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"cmp al, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x80 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0x1 (1)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"add al, -1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP1 0x80 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w4, #0xff (255)\",\n        \"bfxil x4, x26, #0, #8\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"or al, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x80 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr x26, x4, #0xff\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc al, -1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"GROUP1 0x80 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"cinc w20, w20, lo\",\n        \"add w21, w4, w20\",\n        \"uxtb w26, w21\",\n        \"cmp w26, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"bic w20, w4, w26\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"bfxil x4, x26, #0, #8\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"sbb al, -1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": \"GROUP1 0x80 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"uxtb w21, w4\",\n        \"cinc w20, w20, lo\",\n        \"sub w22, w21, w20\",\n        \"uxtb w26, w22\",\n        \"cmp w21, w20\",\n        \"cset x20, hs\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"bic w20, w26, w21\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"bfxil x4, x26, #0, #8\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"and al, -1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x80 /4\",\n      \"ExpectedArm64ASM\": [\n        \"cmn wzr, w4, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x26, x4\"\n      ]\n    },\n    \"sub al, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x80 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0xff (255)\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"xor al, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x80 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor x26, x4, #0xff\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"cmp al, -1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x80 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w4, #0xff (255)\"\n      ]\n    },\n    \"add ax, 256\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"lsl w0, w4, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w4, #0x100 (256)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #16\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"add eax, 256\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"adds w26, w4, #0x100 (256)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"add rax, 256\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"adds x26, x4, #0x100 (256)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or eax, 256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr w4, w4, #0x100\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"or rax, 256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr x4, x4, #0x100\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"adc eax, 256\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs w26, w4, w20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc rax, 256\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs x26, x4, x20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb eax, 256\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"sbcs w26, w4, w20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb rax, 256\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x100\",\n        \"sbcs x26, x4, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and eax, 256\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w4, #0x100\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and rax, 256\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x4, #0x100\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub eax, 256\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x100 (256)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub rax, 256\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x100 (256)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor eax, 256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor w4, w4, #0x100\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"xor rax, 256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor x4, x4, #0x100\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"cmp eax, 256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /7\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x100 (256)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"cmp rax, 256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /7\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x100 (256)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"add ax, -256\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff00\",\n        \"lsl w0, w4, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w4, w20\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #16\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"add eax, -256\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x100 (256)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"add rax, -256\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x81 /0\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x100 (256)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or eax, -256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr w4, w4, #0xffffff00\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"or rax, -256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr x4, x4, #0xffffffffffffff00\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"adc eax, -256\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffff00\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs w26, w4, w20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc rax, -256\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP1 0x81 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffff00\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs x26, x4, x20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb eax, -256\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffff00\",\n        \"sbcs w26, w4, w20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb rax, -256\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x81 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffff00\",\n        \"sbcs x26, x4, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and eax, -256\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w4, #0xffffff00\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and rax, -256\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x81 /4\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x4, #0xffffffffffffff00\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub eax, -256\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"adds w26, w4, #0x100 (256)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub rax, -256\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x81 /5\",\n      \"ExpectedArm64ASM\": [\n        \"adds x26, x4, #0x100 (256)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor eax, -256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor w4, w4, #0xffffff00\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"xor rax, -256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor x4, x4, #0xffffffffffffff00\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"cmp eax, -256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /7\",\n      \"ExpectedArm64ASM\": [\n        \"adds w26, w4, #0x100 (256)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"cmp rax, -256\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x81 /7\",\n      \"ExpectedArm64ASM\": [\n        \"adds x26, x4, #0x100 (256)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"add ax, 1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w0, w4, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w4, #0x1 (1)\",\n        \"mov x20, x4\",\n        \"bfxil x20, x26, #0, #16\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"mov x27, x4\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"add eax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"adds w26, w4, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"add rax, 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"adds x26, x4, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or eax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr w4, w4, #0x1\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"or rax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /1\",\n      \"ExpectedArm64ASM\": [\n        \"orr x4, x4, #0x1\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"adc eax, 1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP1 0x83 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs w26, w4, w20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc rax, 1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP1 0x83 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs x26, x4, x20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb eax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"sbcs w26, w4, w20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb rax, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"sbcs x26, x4, x20\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and eax, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x83 /4\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w4, #0x1\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and rax, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP1 0x83 /4\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x4, #0x1\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub eax, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x83 /5\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x1 (1)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub rax, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x83 /5\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x1 (1)\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor eax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor w4, w4, #0x1\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"xor rax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /6\",\n      \"ExpectedArm64ASM\": [\n        \"eor x4, x4, #0x1\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"cmp eax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /7\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w4, #0x1 (1)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"cmp rax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /7\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x4, #0x1 (1)\",\n        \"mov x27, x4\"\n      ]\n    },\n    \"add ax, -1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"mvn w27, w4\",\n        \"lsl w0, w4, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w4, w20\",\n        \"bfxil x4, x26, #0, #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"add eax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"subs w26, w4, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"add rax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"subs x26, x4, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"or eax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x83 /-1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"orr w4, w4, w20\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"or rax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x83 /-1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"orr x4, x4, x20\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"adc eax, -1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP1 0x83 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"mvn w27, w4\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs w26, w4, w20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"adc rax, -1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP1 0x83 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"mvn w27, w4\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"adcs x26, x4, x20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb eax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"mvn w27, w4\",\n        \"sbcs w26, w4, w20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sbb rax, -1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP1 0x83 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"mvn w27, w4\",\n        \"sbcs x26, x4, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and eax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"ands w26, w4, w20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"and rax, -1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP1 0x83 /4\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"ands x26, x4, x20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub eax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x83 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds w26, w4, #0x1 (1)\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sub rax, -1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP1 0x83 /5\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds x26, x4, #0x1 (1)\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xor eax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w4, w4\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"xor rax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mvn x4, x4\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"cmp eax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds w26, w4, #0x1 (1)\"\n      ]\n    },\n    \"cmp rax, -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP1 0x83 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w27, w4\",\n        \"adds x26, x4, #0x1 (1)\"\n      ]\n    },\n    \"rol al, 2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xC0 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #24, #8\",\n        \"ror w20, w20, #30\",\n        \"bfxil x4, x20, #0, #8\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"ror al, 2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xC0 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #8, #8\",\n        \"ror w20, w20, #2\",\n        \"bfxil x4, x20, #0, #8\",\n        \"eor x20, x20, #0x80\",\n        \"ubfx x20, x20, #7, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"rcl al, 2\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": \"GROUP2 0xC0 /2\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"cset x21, lo\",\n        \"mov w22, #0x0\",\n        \"bfi x22, x20, #55, #8\",\n        \"bfi x22, x21, #63, #1\",\n        \"bfi x22, x20, #46, #8\",\n        \"bfi x22, x21, #54, #1\",\n        \"bfi x22, x20, #37, #8\",\n        \"bfi x22, x21, #45, #1\",\n        \"bfi x22, x20, #28, #8\",\n        \"bfi x22, x21, #36, #1\",\n        \"bfi x22, x20, #19, #8\",\n        \"bfi x22, x21, #27, #1\",\n        \"bfxil x22, x20, #0, #8\",\n        \"ror x20, x22, #62\",\n        \"bfxil x4, x20, #0, #8\",\n        \"ror x20, x22, #61\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"rcr al, 2\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"GROUP2 0xC0 /3\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"uxtb w21, w4\",\n        \"bfi x21, x20, #8, #1\",\n        \"bfi x21, x21, #9, #9\",\n        \"bfi x21, x21, #18, #18\",\n        \"bfi x21, x21, #36, #9\",\n        \"lsr x20, x21, #2\",\n        \"bfxil x4, x20, #0, #8\",\n        \"eor x20, x21, #0x2\",\n        \"ubfx x20, x20, #1, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"shl al, 2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xC0 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w26, w4, #2\",\n        \"cmn wzr, w26, lsl #24\",\n        \"eor x20, x4, #0x40\",\n        \"ubfx x20, x20, #6, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"shr al, 2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xC0 /5\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"lsr w26, w20, #2\",\n        \"cmn wzr, w26, lsl #24\",\n        \"eor x20, x20, #0x2\",\n        \"ubfx x20, x20, #1, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"sar al, 2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xC0 /7\",\n      \"ExpectedArm64ASM\": [\n        \"sxtb x20, w4\",\n        \"asr w26, w20, #2\",\n        \"cmn wzr, w26, lsl #24\",\n        \"eor x20, x20, #0x2\",\n        \"ubfx x20, x20, #1, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"rol ax, 2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xC1 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #16, #16\",\n        \"ror w20, w20, #30\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"rol eax, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC1 /0\",\n      \"ExpectedArm64ASM\": [\n        \"ror w4, w4, #30\",\n        \"eor x20, x4, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"rol rax, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC1 /0\",\n      \"ExpectedArm64ASM\": [\n        \"ror x4, x4, #62\",\n        \"eor x20, x4, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"ror ax, 2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xC1 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #16, #16\",\n        \"ror w20, w20, #2\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor x20, x20, #0x8000\",\n        \"ubfx x20, x20, #15, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"ror eax, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC1 /1\",\n      \"ExpectedArm64ASM\": [\n        \"ror w4, w4, #2\",\n        \"eor x20, x4, #0x80000000\",\n        \"ubfx x20, x20, #31, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"ror rax, 2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xC1 /1\",\n      \"ExpectedArm64ASM\": [\n        \"ror x4, x4, #2\",\n        \"eor x20, x4, #0x8000000000000000\",\n        \"lsr x20, x20, #63\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"rcl ax, 2\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": \"GROUP2 0xC1 /2\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"cset x21, lo\",\n        \"mov w22, #0x0\",\n        \"bfi x22, x20, #47, #16\",\n        \"bfi x22, x21, #63, #1\",\n        \"bfi x22, x20, #30, #16\",\n        \"bfi x22, x21, #46, #1\",\n        \"bfi x22, x20, #13, #16\",\n        \"bfi x22, x21, #29, #1\",\n        \"bfxil x22, x20, #0, #16\",\n        \"ror x20, x22, #62\",\n        \"bfxil x4, x20, #0, #16\",\n        \"ror x20, x22, #61\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"rcl eax, 2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xC1 /2\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w20, w4, #2\",\n        \"cset x21, lo\",\n        \"orr w20, w20, w4, lsr #31\",\n        \"eor x22, x4, #0x40000000\",\n        \"ubfx x22, x22, #30, #1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"orr w4, w20, w21, lsl #1\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"rcl rax, 2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xC1 /2\",\n      \"ExpectedArm64ASM\": [\n        \"lsl x20, x4, #2\",\n        \"cset x21, lo\",\n        \"orr x20, x20, x4, lsr #63\",\n        \"eor x22, x4, #0x4000000000000000\",\n        \"ubfx x22, x22, #62, #1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"orr x4, x20, x21, lsl #1\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"rcr ax, 2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"GROUP2 0xC1 /3\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"uxth w21, w4\",\n        \"bfi x21, x20, #16, #1\",\n        \"bfi x21, x21, #17, #17\",\n        \"bfi x21, x21, #34, #17\",\n        \"lsr x20, x21, #2\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor x20, x21, #0x2\",\n        \"ubfx x20, x20, #1, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"rcr eax, 2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xC1 /3\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, #2\",\n        \"cset x21, lo\",\n        \"orr w20, w20, w4, lsl #31\",\n        \"eor x22, x4, #0x2\",\n        \"ubfx x22, x22, #1, #1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"orr w4, w20, w21, lsl #30\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"rcr rax, 2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xC1 /3\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x20, x4, #2\",\n        \"cset x21, lo\",\n        \"orr x20, x20, x4, lsl #63\",\n        \"eor x22, x4, #0x2\",\n        \"ubfx x22, x22, #1, #1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"orr x4, x20, x21, lsl #62\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"shl ax, 2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xC1 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w26, w4, #2\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x20, x4, #0x4000\",\n        \"ubfx x20, x20, #14, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"shl eax, 2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xC1 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w26, w4, #2\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x40000000\",\n        \"ubfx x20, x20, #30, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shl rax, 2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xC1 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl x26, x4, #2\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x4000000000000000\",\n        \"ubfx x20, x20, #62, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shr ax, 2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xC1 /5\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"lsr w26, w20, #2\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x20, x20, #0x2\",\n        \"ubfx x20, x20, #1, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"shr eax, 2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xC1 /5\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w26, w4, #2\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x2\",\n        \"ubfx x20, x20, #1, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shr rax, 2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xC1 /5\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x26, x4, #2\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x2\",\n        \"ubfx x20, x20, #1, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sar ax, 2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xC1 /7\",\n      \"ExpectedArm64ASM\": [\n        \"sxth x20, w4\",\n        \"asr w26, w20, #2\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x20, x20, #0x2\",\n        \"ubfx x20, x20, #1, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"sar eax, 2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xC1 /7\",\n      \"ExpectedArm64ASM\": [\n        \"asr w26, w4, #2\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x2\",\n        \"ubfx x20, x20, #1, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sar rax, 2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xC1 /7\",\n      \"ExpectedArm64ASM\": [\n        \"asr x26, x4, #2\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x2\",\n        \"ubfx x20, x20, #1, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"rol al, 1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"GROUP2 0xd0 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #24, #8\",\n        \"ror w20, w20, #31\",\n        \"bfxil x4, x20, #0, #8\",\n        \"eor x21, x20, #0x1\",\n        \"ubfx x21, x21, #0, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"eor w20, w20, w20, lsr #7\",\n        \"ubfx x20, x20, #0, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"ror al, 1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"GROUP2 0xd0 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #8, #8\",\n        \"ror w20, w20, #1\",\n        \"bfxil x4, x20, #0, #8\",\n        \"eor x21, x20, #0x80\",\n        \"ubfx x21, x21, #7, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"eor w20, w20, w20, lsr #1\",\n        \"ubfx x20, x20, #6, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"rcl al, 1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"GROUP2 0xd0 /2\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"cset x21, lo\",\n        \"orr w21, w21, w20, lsl #1\",\n        \"eor x22, x20, #0x80\",\n        \"ubfx x22, x22, #7, #1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"eor w20, w21, w20\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w23, w20, #28, #1\",\n        \"bfxil x4, x21, #0, #8\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"rcr al, 1\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"GROUP2 0xd0 /3\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"cset x21, lo\",\n        \"eor x22, x20, #0x1\",\n        \"ubfx x22, x22, #0, #1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"ubfx w20, w20, #1, #7\",\n        \"bfi w20, w21, #7, #1\",\n        \"bfxil x4, x20, #0, #8\",\n        \"eor w20, w20, w20, lsr #1\",\n        \"ubfx x20, x20, #6, #1\",\n        \"bfi w23, w20, #28, #1\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"shl al, 1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd0 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w26, w4, #1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"eor x20, x4, #0x80\",\n        \"ubfx x20, x20, #7, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w20, w26, w4\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"msr nzcv, x21\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"shr al, 1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd0 /5\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"lsr w26, w20, #1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"eor x21, x20, #0x1\",\n        \"ubfx x21, x21, #0, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"ubfx x20, x20, #7, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"sar al, 1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xd0 /7\",\n      \"ExpectedArm64ASM\": [\n        \"sxtb x20, w4\",\n        \"asr w26, w20, #1\",\n        \"cmn wzr, w26, lsl #24\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"bfxil x4, x26, #0, #8\"\n      ]\n    },\n    \"rol ax, 1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"GROUP2 0xd1 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #16, #16\",\n        \"ror w20, w20, #31\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor x21, x20, #0x1\",\n        \"ubfx x21, x21, #0, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"eor w20, w20, w20, lsr #15\",\n        \"ubfx x20, x20, #0, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"rol eax, 1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xd1 /0\",\n      \"ExpectedArm64ASM\": [\n        \"ror w4, w4, #31\",\n        \"eor x20, x4, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w20, w4, w4, lsr #31\",\n        \"ubfx x20, x20, #0, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"rol rax, 1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xd1 /0\",\n      \"ExpectedArm64ASM\": [\n        \"ror x4, x4, #63\",\n        \"eor x20, x4, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor x20, x4, x4, lsr #63\",\n        \"ubfx x20, x20, #0, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"ror ax, 1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"GROUP2 0xd1 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"bfi w20, w4, #16, #16\",\n        \"ror w20, w20, #1\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor x21, x20, #0x8000\",\n        \"ubfx x21, x21, #15, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"eor w20, w20, w20, lsr #1\",\n        \"ubfx x20, x20, #14, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"ror eax, 1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xd1 /1\",\n      \"ExpectedArm64ASM\": [\n        \"ror w4, w4, #1\",\n        \"eor x20, x4, #0x80000000\",\n        \"ubfx x20, x20, #31, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w20, w4, w4, lsr #1\",\n        \"ubfx x20, x20, #30, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"ror rax, 1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xd1 /1\",\n      \"ExpectedArm64ASM\": [\n        \"ror x4, x4, #1\",\n        \"eor x20, x4, #0x8000000000000000\",\n        \"lsr x20, x20, #63\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor x20, x4, x4, lsr #1\",\n        \"ubfx x20, x20, #62, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"rcl ax, 1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"GROUP2 0xd1 /2\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"cset x21, lo\",\n        \"orr w21, w21, w20, lsl #1\",\n        \"eor x22, x20, #0x8000\",\n        \"ubfx x22, x22, #15, #1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"eor w20, w21, w20\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w23, w20, #28, #1\",\n        \"bfxil x4, x21, #0, #16\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"rcl eax, 1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd1 /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w4\",\n        \"cset x21, lo\",\n        \"orr w4, w21, w20, lsl #1\",\n        \"eor x21, x20, #0x80000000\",\n        \"ubfx x21, x21, #31, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"eor w20, w4, w20\",\n        \"ubfx x20, x20, #31, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"rcl rax, 1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd1 /2\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"orr x20, x20, x4, lsl #1\",\n        \"eor x21, x4, #0x8000000000000000\",\n        \"lsr x21, x21, #63\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"eor x21, x20, x4\",\n        \"lsr x21, x21, #63\",\n        \"bfi w22, w21, #28, #1\",\n        \"msr nzcv, x22\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"rcr ax, 1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"GROUP2 0xd1 /3\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"eor x21, x4, #0x1\",\n        \"ubfx x21, x21, #0, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"ubfx w21, w4, #1, #15\",\n        \"orr w20, w21, w20, lsl #15\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor x20, x20, x20, lsr #1\",\n        \"ubfx x20, x20, #14, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"rcr eax, 1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP2 0xd1 /3\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"eor x21, x4, #0x1\",\n        \"ubfx x21, x21, #0, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"extr w4, w20, w4, #1\",\n        \"eor x20, x4, x4, lsr #1\",\n        \"ubfx x20, x20, #30, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"rcr rax, 1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP2 0xd1 /3\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"eor x21, x4, #0x1\",\n        \"ubfx x21, x21, #0, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"extr x4, x20, x4, #1\",\n        \"eor x20, x4, x4, lsr #1\",\n        \"ubfx x20, x20, #62, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"shl ax, 1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd1 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w26, w4, #1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x20, x4, #0x8000\",\n        \"ubfx x20, x20, #15, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w20, w26, w4\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"msr nzcv, x21\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"shl eax, 1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd1 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w26, w4, #1\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x80000000\",\n        \"ubfx x20, x20, #31, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w20, w26, w4\",\n        \"ubfx x20, x20, #31, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shl rax, 1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd1 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl x26, x4, #1\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x8000000000000000\",\n        \"lsr x20, x20, #63\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor x20, x26, x4\",\n        \"lsr x20, x20, #63\",\n        \"bfi w21, w20, #28, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shr ax, 1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd1 /5\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"lsr w26, w20, #1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x21, x20, #0x1\",\n        \"ubfx x21, x21, #0, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"shr eax, 1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP2 0xd1 /5\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w26, w4, #1\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"ubfx x20, x4, #31, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shr rax, 1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP2 0xd1 /5\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x26, x4, #1\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"lsr x20, x4, #63\",\n        \"bfi w21, w20, #28, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sar ax, 1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xd1 /7\",\n      \"ExpectedArm64ASM\": [\n        \"sxth x20, w4\",\n        \"asr w26, w20, #1\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"sar eax, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xd1 /7\",\n      \"ExpectedArm64ASM\": [\n        \"asr w26, w4, #1\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"sar rax, 1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xd1 /7\",\n      \"ExpectedArm64ASM\": [\n        \"asr x26, x4, #1\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"rol al, cl\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"GROUP2 0xd2 /0\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x7\",\n        \"mov x21, x4\",\n        \"bfi w21, w4, #24, #8\",\n        \"neg x20, x20\",\n        \"ror w20, w21, w20\",\n        \"bfxil x4, x20, #0, #8\",\n        \"and x21, x7, #0x1f\",\n        \"cbz w21, #+0x1c\",\n        \"eor x0, x20, x20, lsr #7\",\n        \"mvn x1, x20\",\n        \"mrs x2, nzcv\",\n        \"bfi w2, w0, #28, #1\",\n        \"bfi w2, w1, #29, #1\",\n        \"msr nzcv, x2\"\n      ]\n    },\n    \"ror al, cl\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"GROUP2 0xd2 /1\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x7\",\n        \"mov x21, x4\",\n        \"bfi w21, w4, #8, #8\",\n        \"ror w20, w21, w20\",\n        \"bfxil x4, x20, #0, #8\",\n        \"and x21, x7, #0x1f\",\n        \"cbz w21, #+0x24\",\n        \"eor x0, x20, x20, lsr #1\",\n        \"mvn x1, x20\",\n        \"lsr w0, w0, #6\",\n        \"lsr w1, w1, #7\",\n        \"mrs x2, nzcv\",\n        \"bfi w2, w0, #28, #1\",\n        \"bfi w2, w1, #29, #1\",\n        \"msr nzcv, x2\"\n      ]\n    },\n    \"rcl al, cl\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": \"GROUP2 0xd2 /2\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"cbz x20, #+0x78\",\n        \"and x20, x7, #0x1f\",\n        \"uxtb w21, w4\",\n        \"cset x22, lo\",\n        \"mov w23, #0x0\",\n        \"bfi x23, x21, #55, #8\",\n        \"bfi x23, x22, #63, #1\",\n        \"bfi x23, x21, #46, #8\",\n        \"bfi x23, x22, #54, #1\",\n        \"bfi x23, x21, #37, #8\",\n        \"bfi x23, x22, #45, #1\",\n        \"bfi x23, x21, #28, #8\",\n        \"bfi x23, x22, #36, #1\",\n        \"bfi x23, x21, #19, #8\",\n        \"bfi x23, x22, #27, #1\",\n        \"bfxil x23, x21, #0, #8\",\n        \"neg x21, x20\",\n        \"ror x21, x23, x21\",\n        \"bfxil x4, x21, #0, #8\",\n        \"mov w22, #0x3f\",\n        \"sub x20, x22, x20\",\n        \"ror x20, x23, x20\",\n        \"eor x22, x20, #0x1\",\n        \"ubfx x22, x22, #0, #1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"eor x20, x20, x21, lsr #7\",\n        \"ubfx x20, x20, #0, #1\",\n        \"bfi w23, w20, #28, #1\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"rcr al, cl\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": \"GROUP2 0xd2 /3\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"cbz x20, #+0x50\",\n        \"and x20, x7, #0x1f\",\n        \"cset x21, lo\",\n        \"uxtb w22, w4\",\n        \"bfi x22, x21, #8, #1\",\n        \"bfi x22, x22, #9, #9\",\n        \"bfi x22, x22, #18, #18\",\n        \"bfi x22, x22, #36, #9\",\n        \"lsr x21, x22, x20\",\n        \"bfxil x4, x21, #0, #8\",\n        \"sub w20, w20, #0x1 (1)\",\n        \"lsr w20, w22, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"eor w20, w21, w21, lsr #1\",\n        \"ubfx x20, x20, #6, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"shl al, cl\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"GROUP2 0xd2 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w20, w4, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x2c\",\n        \"cmn wzr, w20, lsl #24\",\n        \"mov x26, x20\",\n        \"mvn x0, x20\",\n        \"eor w2, w4, w20\",\n        \"mrs x1, nzcv\",\n        \"lsr x0, x0, #8\",\n        \"bfi w1, w0, #29, #1\",\n        \"lsr w2, w2, #7\",\n        \"bfi w1, w2, #28, #1\",\n        \"msr nzcv, x1\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"shr al, cl\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": \"GROUP2 0xd2 /5\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"lsr w21, w20, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x30\",\n        \"cmn wzr, w21, lsl #24\",\n        \"mov x26, x21\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr w0, w20, w0\",\n        \"mvn x0, x0\",\n        \"eor w2, w20, w21\",\n        \"mrs x1, nzcv\",\n        \"bfi w1, w0, #29, #1\",\n        \"lsr w2, w2, #7\",\n        \"bfi w1, w2, #28, #1\",\n        \"msr nzcv, x1\",\n        \"bfxil x4, x21, #0, #8\"\n      ]\n    },\n    \"sar al, cl\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"GROUP2 0xd2 /7\",\n      \"ExpectedArm64ASM\": [\n        \"sxtb x20, w4\",\n        \"asr w21, w20, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x24\",\n        \"cmn wzr, w21, lsl #24\",\n        \"mov x26, x21\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr w0, w20, w0\",\n        \"mvn x0, x0\",\n        \"mrs x1, nzcv\",\n        \"bfi w1, w0, #29, #1\",\n        \"msr nzcv, x1\",\n        \"bfxil x4, x21, #0, #8\"\n      ]\n    },\n    \"rol ax, cl\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"GROUP2 0xd3 /0\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"mov x21, x4\",\n        \"bfi w21, w4, #16, #16\",\n        \"neg x22, x20\",\n        \"ror w21, w21, w22\",\n        \"bfxil x4, x21, #0, #16\",\n        \"cbz w20, #+0x1c\",\n        \"eor x0, x21, x21, lsr #15\",\n        \"mvn x1, x21\",\n        \"mrs x2, nzcv\",\n        \"bfi w2, w0, #28, #1\",\n        \"bfi w2, w1, #29, #1\",\n        \"msr nzcv, x2\"\n      ]\n    },\n    \"rol eax, cl\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP2 0xd3 /0\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"neg x21, x20\",\n        \"ror w4, w4, w21\",\n        \"cbz w20, #+0x1c\",\n        \"eor x0, x4, x4, lsr #31\",\n        \"mvn x1, x4\",\n        \"mrs x2, nzcv\",\n        \"bfi w2, w0, #28, #1\",\n        \"bfi w2, w1, #29, #1\",\n        \"msr nzcv, x2\"\n      ]\n    },\n    \"rol rax, cl\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP2 0xd3 /0\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x3f\",\n        \"neg x21, x20\",\n        \"ror x4, x4, x21\",\n        \"cbz x20, #+0x1c\",\n        \"eor x0, x4, x4, lsr #63\",\n        \"mvn x1, x4\",\n        \"mrs x2, nzcv\",\n        \"bfi w2, w0, #28, #1\",\n        \"bfi w2, w1, #29, #1\",\n        \"msr nzcv, x2\"\n      ]\n    },\n    \"ror ax, cl\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"GROUP2 0xd3 /1\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"mov x21, x4\",\n        \"bfi w21, w4, #16, #16\",\n        \"ror w21, w21, w20\",\n        \"bfxil x4, x21, #0, #16\",\n        \"cbz w20, #+0x24\",\n        \"eor x0, x21, x21, lsr #1\",\n        \"mvn x1, x21\",\n        \"lsr w0, w0, #14\",\n        \"lsr w1, w1, #15\",\n        \"mrs x2, nzcv\",\n        \"bfi w2, w0, #28, #1\",\n        \"bfi w2, w1, #29, #1\",\n        \"msr nzcv, x2\"\n      ]\n    },\n    \"ror eax, cl\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd3 /1\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"ror w4, w4, w20\",\n        \"cbz w20, #+0x24\",\n        \"eor x0, x4, x4, lsr #1\",\n        \"mvn x1, x4\",\n        \"lsr w0, w0, #30\",\n        \"lsr w1, w1, #31\",\n        \"mrs x2, nzcv\",\n        \"bfi w2, w0, #28, #1\",\n        \"bfi w2, w1, #29, #1\",\n        \"msr nzcv, x2\"\n      ]\n    },\n    \"ror rax, cl\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd3 /1\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x3f\",\n        \"ror x4, x4, x20\",\n        \"cbz x20, #+0x24\",\n        \"eor x0, x4, x4, lsr #1\",\n        \"mvn x1, x4\",\n        \"lsr x0, x0, #62\",\n        \"lsr x1, x1, #63\",\n        \"mrs x2, nzcv\",\n        \"bfi w2, w0, #28, #1\",\n        \"bfi w2, w1, #29, #1\",\n        \"msr nzcv, x2\"\n      ]\n    },\n    \"rcl ax, cl\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": \"GROUP2 0xd3 /2\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"cbz x20, #+0x68\",\n        \"and x20, x7, #0x1f\",\n        \"uxth w21, w4\",\n        \"cset x22, lo\",\n        \"mov w23, #0x0\",\n        \"bfi x23, x21, #47, #16\",\n        \"bfi x23, x22, #63, #1\",\n        \"bfi x23, x21, #30, #16\",\n        \"bfi x23, x22, #46, #1\",\n        \"bfi x23, x21, #13, #16\",\n        \"bfi x23, x22, #29, #1\",\n        \"bfxil x23, x21, #0, #16\",\n        \"neg x21, x20\",\n        \"ror x21, x23, x21\",\n        \"bfxil x4, x21, #0, #16\",\n        \"mov w22, #0x3f\",\n        \"sub x20, x22, x20\",\n        \"ror x20, x23, x20\",\n        \"eor x22, x20, #0x1\",\n        \"ubfx x22, x22, #0, #1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w22, #29, #1\",\n        \"eor x20, x20, x21, lsr #15\",\n        \"ubfx x20, x20, #0, #1\",\n        \"bfi w23, w20, #28, #1\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"rcl eax, cl\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": \"GROUP2 0xd3 /2\",\n      \"ExpectedArm64ASM\": [\n        \"and w20, w7, #0x1f\",\n        \"cbz x20, #+0x4c\",\n        \"lsl w20, w4, w7\",\n        \"cset x21, lo\",\n        \"neg w22, w7\",\n        \"lsr w23, w4, w22\",\n        \"orr w20, w20, w23, lsr #1\",\n        \"lsr w22, w4, w22\",\n        \"eor x23, x22, #0x1\",\n        \"ubfx x23, x23, #0, #1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w23, #29, #1\",\n        \"sub w23, w7, #0x1 (1)\",\n        \"lsl w21, w21, w23\",\n        \"orr w4, w20, w21\",\n        \"eor w20, w4, w22, lsl #31\",\n        \"ubfx x20, x20, #31, #1\",\n        \"bfi w24, w20, #28, #1\",\n        \"msr nzcv, x24\",\n        \"b #+0x8\",\n        \"mov w4, w4\"\n      ]\n    },\n    \"rcl rax, cl\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"GROUP2 0xd3 /2\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x3f\",\n        \"cbz x20, #+0x48\",\n        \"lsl x20, x4, x7\",\n        \"cset x21, lo\",\n        \"neg x22, x7\",\n        \"lsr x23, x4, x22\",\n        \"orr x20, x20, x23, lsr #1\",\n        \"lsr x22, x4, x22\",\n        \"eor x23, x22, #0x1\",\n        \"ubfx x23, x23, #0, #1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w23, #29, #1\",\n        \"sub x23, x7, #0x1 (1)\",\n        \"lsl x21, x21, x23\",\n        \"orr x4, x20, x21\",\n        \"eor x20, x4, x22, lsl #63\",\n        \"lsr x20, x20, #63\",\n        \"bfi w24, w20, #28, #1\",\n        \"msr nzcv, x24\"\n      ]\n    },\n    \"rcr ax, cl\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": \"GROUP2 0xd3 /3\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x1f\",\n        \"cbz x20, #+0x4c\",\n        \"and x20, x7, #0x1f\",\n        \"cset x21, lo\",\n        \"uxth w22, w4\",\n        \"bfi x22, x21, #16, #1\",\n        \"bfi x22, x22, #17, #17\",\n        \"bfi x22, x22, #34, #17\",\n        \"lsr x21, x22, x20\",\n        \"bfxil x4, x21, #0, #16\",\n        \"sub w20, w20, #0x1 (1)\",\n        \"lsr w20, w22, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"eor w20, w21, w21, lsr #1\",\n        \"ubfx x20, x20, #14, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"rcr eax, cl\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": \"GROUP2 0xd3 /3\",\n      \"ExpectedArm64ASM\": [\n        \"and w20, w7, #0x1f\",\n        \"cbz x20, #+0x4c\",\n        \"lsr w20, w4, w7\",\n        \"cset x21, lo\",\n        \"neg w22, w7\",\n        \"lsl w23, w4, w22\",\n        \"orr w20, w20, w23, lsl #1\",\n        \"sub w23, w7, #0x1 (1)\",\n        \"lsr w23, w4, w23\",\n        \"eor x23, x23, #0x1\",\n        \"ubfx x23, x23, #0, #1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w23, #29, #1\",\n        \"lsl w21, w21, w22\",\n        \"orr w4, w20, w21\",\n        \"eor w20, w4, w4, lsr #1\",\n        \"ubfx x20, x20, #30, #1\",\n        \"bfi w24, w20, #28, #1\",\n        \"msr nzcv, x24\",\n        \"b #+0x8\",\n        \"mov w4, w4\"\n      ]\n    },\n    \"rcr rax, cl\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": \"GROUP2 0xd3 /3\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x3f\",\n        \"cbz x20, #+0x48\",\n        \"lsr x20, x4, x7\",\n        \"cset x21, lo\",\n        \"neg x22, x7\",\n        \"lsl x23, x4, x22\",\n        \"orr x20, x20, x23, lsl #1\",\n        \"sub x23, x7, #0x1 (1)\",\n        \"lsr x23, x4, x23\",\n        \"eor x23, x23, #0x1\",\n        \"ubfx x23, x23, #0, #1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w23, #29, #1\",\n        \"lsl x21, x21, x22\",\n        \"orr x4, x20, x21\",\n        \"eor x20, x4, x4, lsr #1\",\n        \"ubfx x20, x20, #62, #1\",\n        \"bfi w24, w20, #28, #1\",\n        \"msr nzcv, x24\"\n      ]\n    },\n    \"shl ax, cl\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"GROUP2 0xd3 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w20, w4, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x2c\",\n        \"cmn wzr, w20, lsl #16\",\n        \"mov x26, x20\",\n        \"mvn x0, x20\",\n        \"eor w2, w4, w20\",\n        \"mrs x1, nzcv\",\n        \"lsr x0, x0, #16\",\n        \"bfi w1, w0, #29, #1\",\n        \"lsr w2, w2, #15\",\n        \"bfi w1, w2, #28, #1\",\n        \"msr nzcv, x1\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"shl eax, cl\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"GROUP2 0xd3 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w20, w4, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x2c\",\n        \"ands w26, w20, w20\",\n        \"neg w0, w7\",\n        \"lsr w0, w4, w0\",\n        \"mvn x0, x0\",\n        \"eor w2, w4, w20\",\n        \"mrs x1, nzcv\",\n        \"bfi w1, w0, #29, #1\",\n        \"lsr w2, w2, #31\",\n        \"bfi w1, w2, #28, #1\",\n        \"msr nzcv, x1\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"shl rax, cl\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"GROUP2 0xd3 /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsl x20, x4, x7\",\n        \"and w0, w7, #0x3f\",\n        \"cbz x0, #+0x2c\",\n        \"ands x26, x20, x20\",\n        \"neg x0, x7\",\n        \"lsr x0, x4, x0\",\n        \"mvn x0, x0\",\n        \"eor x2, x4, x20\",\n        \"mrs x1, nzcv\",\n        \"bfi w1, w0, #29, #1\",\n        \"lsr x2, x2, #63\",\n        \"bfi w1, w2, #28, #1\",\n        \"msr nzcv, x1\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"shr ax, cl\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": \"GROUP2 0xd3 /5\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"lsr w21, w20, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x30\",\n        \"cmn wzr, w21, lsl #16\",\n        \"mov x26, x21\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr w0, w20, w0\",\n        \"mvn x0, x0\",\n        \"eor w2, w20, w21\",\n        \"mrs x1, nzcv\",\n        \"bfi w1, w0, #29, #1\",\n        \"lsr w2, w2, #15\",\n        \"bfi w1, w2, #28, #1\",\n        \"msr nzcv, x1\",\n        \"bfxil x4, x21, #0, #16\"\n      ]\n    },\n    \"shr eax, cl\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"GROUP2 0xd3 /5\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x2c\",\n        \"ands w26, w20, w20\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr w0, w4, w0\",\n        \"mvn x0, x0\",\n        \"eor w2, w4, w20\",\n        \"mrs x1, nzcv\",\n        \"bfi w1, w0, #29, #1\",\n        \"lsr w2, w2, #31\",\n        \"bfi w1, w2, #28, #1\",\n        \"msr nzcv, x1\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"shr rax, cl\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": \"GROUP2 0xd3 /5\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x20, x4, x7\",\n        \"and w0, w7, #0x3f\",\n        \"cbz x0, #+0x2c\",\n        \"ands x26, x20, x20\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr x0, x4, x0\",\n        \"mvn x0, x0\",\n        \"eor x2, x4, x20\",\n        \"mrs x1, nzcv\",\n        \"bfi w1, w0, #29, #1\",\n        \"lsr x2, x2, #63\",\n        \"bfi w1, w2, #28, #1\",\n        \"msr nzcv, x1\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"sar ax, cl\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"GROUP2 0xd3 /7\",\n      \"ExpectedArm64ASM\": [\n        \"sxth x20, w4\",\n        \"asr w21, w20, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x24\",\n        \"cmn wzr, w21, lsl #16\",\n        \"mov x26, x21\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr w0, w20, w0\",\n        \"mvn x0, x0\",\n        \"mrs x1, nzcv\",\n        \"bfi w1, w0, #29, #1\",\n        \"msr nzcv, x1\",\n        \"bfxil x4, x21, #0, #16\"\n      ]\n    },\n    \"sar eax, cl\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd3 /7\",\n      \"ExpectedArm64ASM\": [\n        \"asr w20, w4, w7\",\n        \"and w0, w7, #0x1f\",\n        \"cbz w0, #+0x20\",\n        \"ands w26, w20, w20\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr w0, w4, w0\",\n        \"mvn x0, x0\",\n        \"mrs x1, nzcv\",\n        \"bfi w1, w0, #29, #1\",\n        \"msr nzcv, x1\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"sar rax, cl\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP2 0xd3 /7\",\n      \"ExpectedArm64ASM\": [\n        \"asr x20, x4, x7\",\n        \"and w0, w7, #0x3f\",\n        \"cbz x0, #+0x20\",\n        \"ands x26, x20, x20\",\n        \"sub x0, x7, #0x1 (1)\",\n        \"lsr x0, x4, x0\",\n        \"mvn x0, x0\",\n        \"mrs x1, nzcv\",\n        \"bfi w1, w0, #29, #1\",\n        \"msr nzcv, x1\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"test bl, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP2 0xf6 /0\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w6, #0x1\",\n        \"cmp w26, #0x0 (0)\"\n      ]\n    },\n    \"not bl\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP2 0xf6 /2\",\n      \"ExpectedArm64ASM\": [\n        \"eor x6, x6, #0xff\"\n      ]\n    },\n    \"not bh\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP2 0xf6 /2\",\n      \"ExpectedArm64ASM\": [\n        \"eor x6, x6, #0xff00\"\n      ]\n    },\n    \"neg bl\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xf6 /3\",\n      \"ExpectedArm64ASM\": [\n        \"cmp wzr, w6, lsl #24\",\n        \"neg w26, w6\",\n        \"mov x20, x6\",\n        \"bfxil x20, x26, #0, #8\",\n        \"mov x27, x6\",\n        \"mov x6, x20\"\n      ]\n    },\n    \"mul bl\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xf6 /4\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb x20, w6\",\n        \"uxtb x21, w4\",\n        \"mul x20, x20, x21\",\n        \"bfxil x4, x20, #0, #16\",\n        \"ubfx x20, x20, #8, #8\",\n        \"cmp x20, #0x0 (0)\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul bl\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xf6 /5\",\n      \"ExpectedArm64ASM\": [\n        \"sxtb x20, w6\",\n        \"sxtb x21, w4\",\n        \"mul x20, x20, x21\",\n        \"bfxil x4, x20, #0, #16\",\n        \"sbfx x21, x20, #8, #8\",\n        \"sbfx x20, x20, #7, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"div bl\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xf6 /6\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w6\",\n        \"uxth w23, w4\",\n        \"udiv w22, w23, w20\",\n        \"msub w21, w22, w20, w23\",\n        \"bfi x22, x21, #8, #8\",\n        \"bfxil x4, x22, #0, #16\"\n      ]\n    },\n    \"idiv bl\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xf6 /7\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w6\",\n        \"sxth x23, w4\",\n        \"sxtb x20, w20\",\n        \"sdiv x22, x23, x20\",\n        \"msub x21, x22, x20, x23\",\n        \"bfi x22, x21, #8, #8\",\n        \"bfxil x4, x22, #0, #16\"\n      ]\n    },\n    \"test bx, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP2 0xf7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"and w26, w6, #0x1\",\n        \"cmp w26, #0x0 (0)\"\n      ]\n    },\n    \"test ebx, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP2 0xf7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"ands w26, w6, #0x1\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"test rbx, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP2 0xf7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"ands x26, x6, #0x1\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"test bx, -1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xf7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"cmn wzr, w6, lsl #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x26, x6\"\n      ]\n    },\n    \"test ebx, -1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP2 0xf7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"subs w26, w6, #0x0 (0)\"\n      ]\n    },\n    \"test rbx, -1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP2 0xf7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"subs x26, x6, #0x0 (0)\"\n      ]\n    },\n    \"not bx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP2 0xf7 /1\",\n      \"ExpectedArm64ASM\": [\n        \"eor x6, x6, #0xffff\"\n      ]\n    },\n    \"not ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP2 0xf7 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mvn w6, w6\"\n      ]\n    },\n    \"not rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP2 0xf7 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mvn x6, x6\"\n      ]\n    },\n    \"neg bx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP2 0xf7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"cmp wzr, w6, lsl #16\",\n        \"neg w26, w6\",\n        \"mov x20, x6\",\n        \"bfxil x20, x26, #0, #16\",\n        \"mov x27, x6\",\n        \"mov x6, x20\"\n      ]\n    },\n    \"neg ebx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP2 0xf7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"negs w26, w6\",\n        \"mov x27, x6\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"neg rbx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP2 0xf7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"negs x26, x6\",\n        \"mov x27, x6\",\n        \"mov x6, x26\"\n      ]\n    },\n    \"mul bx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xf7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"uxth x20, w6\",\n        \"uxth x21, w4\",\n        \"mul x20, x20, x21\",\n        \"bfxil x4, x20, #0, #16\",\n        \"ubfx x20, x20, #16, #16\",\n        \"bfxil x5, x20, #0, #16\",\n        \"cmp x20, #0x0 (0)\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"mul ebx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xf7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w6\",\n        \"mov w21, w4\",\n        \"mul x20, x20, x21\",\n        \"mov w4, w20\",\n        \"lsr x5, x20, #32\",\n        \"cmp x5, #0x0 (0)\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"mul rbx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"GROUP2 0xf7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"umulh x5, x6, x4\",\n        \"mul x4, x6, x4\",\n        \"cmp x5, #0x0 (0)\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul bx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP2 0xf7 /5\",\n      \"ExpectedArm64ASM\": [\n        \"sxth x20, w6\",\n        \"sxth x21, w4\",\n        \"mul x20, x20, x21\",\n        \"bfxil x4, x20, #0, #16\",\n        \"sbfx x21, x20, #16, #16\",\n        \"bfxil x5, x21, #0, #16\",\n        \"sbfx x20, x20, #15, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul ebx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP2 0xf7 /5\",\n      \"ExpectedArm64ASM\": [\n        \"sxtw x20, w6\",\n        \"sxtw x21, w4\",\n        \"mul x20, x20, x21\",\n        \"mov w4, w20\",\n        \"lsr x5, x20, #32\",\n        \"asr x21, x20, #32\",\n        \"sxtw x20, w20\",\n        \"sbfx x20, x20, #31, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul rbx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP2 0xf7 /5\",\n      \"ExpectedArm64ASM\": [\n        \"smulh x5, x6, x4\",\n        \"mul x4, x6, x4\",\n        \"asr x20, x4, #63\",\n        \"cmp x5, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"div bx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xf7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"uxth w0, w4\",\n        \"bfi w0, w5, #16, #16\",\n        \"udiv w22, w0, w20\",\n        \"msub w21, w22, w20, w0\",\n        \"bfxil x4, x22, #0, #16\",\n        \"bfxil x5, x21, #0, #16\"\n      ]\n    },\n    \"div ebx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP2 0xf7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w1, w6\",\n        \"mov x0, x4\",\n        \"bfi x0, x5, #32, #32\",\n        \"udiv x20, x0, x1\",\n        \"msub x22, x20, x1, x0\",\n        \"mov w4, w20\",\n        \"mov w5, w22\"\n      ]\n    },\n    \"div rbx\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"GROUP2 0xf7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"cbz x5, #+0x2c\",\n        \"mov x0, x5\",\n        \"mov x1, x4\",\n        \"mov x2, x6\",\n        \"ldr x3, [x28, #2960]\",\n        \"str x30, [sp, #-16]!\",\n        \"blr x3\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"mov x22, x1\",\n        \"b #+0xc\",\n        \"udiv x20, x4, x6\",\n        \"msub x22, x20, x6, x4\",\n        \"mov x5, x22\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"idiv bx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xf7 /7\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"uxth w0, w4\",\n        \"bfi w0, w5, #16, #16\",\n        \"sxth w1, w20\",\n        \"sdiv w22, w0, w1\",\n        \"msub w21, w22, w1, w0\",\n        \"bfxil x4, x22, #0, #16\",\n        \"bfxil x5, x21, #0, #16\"\n      ]\n    },\n    \"idiv ebx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP2 0xf7 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w6\",\n        \"mov x0, x4\",\n        \"bfi x0, x5, #32, #32\",\n        \"sxtw x1, w20\",\n        \"sdiv x22, x0, x1\",\n        \"msub x21, x22, x1, x0\",\n        \"mov w4, w22\",\n        \"mov w5, w21\"\n      ]\n    },\n    \"idiv rbx\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"GROUP2 0xf7 /7\",\n      \"ExpectedArm64ASM\": [\n        \"asr x0, x4, #63\",\n        \"eor x0, x0, x5\",\n        \"cbz x0, #+0x2c\",\n        \"mov x0, x5\",\n        \"mov x1, x4\",\n        \"mov x2, x6\",\n        \"ldr x3, [x28, #2968]\",\n        \"str x30, [sp, #-16]!\",\n        \"blr x3\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"mov x22, x1\",\n        \"b #+0xc\",\n        \"sdiv x20, x4, x6\",\n        \"msub x22, x20, x6, x4\",\n        \"mov x5, x22\",\n        \"mov x4, x20\"\n      ]\n    },\n    \"inc al\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP3 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w27, w4\",\n        \"mov w20, #0x1\",\n        \"cset x21, hs\",\n        \"lsl w0, w27, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w27, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"bfxil x4, x26, #0, #8\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"dec al\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP3 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w27, w4\",\n        \"mov w20, #0x1\",\n        \"cset x21, hs\",\n        \"lsl w0, w27, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w27, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"bfxil x4, x26, #0, #8\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"inc ax\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP4 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w27, w4\",\n        \"mov w20, #0x1\",\n        \"cset x21, hs\",\n        \"lsl w0, w27, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w27, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"bfxil x4, x26, #0, #16\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"inc eax\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP4 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hs\",\n        \"adds w26, w4, #0x1 (1)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"inc rax\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP4 0xfe /0\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hs\",\n        \"adds x26, x4, #0x1 (1)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"dec ax\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"GROUP4 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w27, w4\",\n        \"mov w20, #0x1\",\n        \"cset x21, hs\",\n        \"lsl w0, w27, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w27, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"bfxil x4, x26, #0, #16\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"dec eax\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP4 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hs\",\n        \"subs w26, w4, #0x1 (1)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"dec rax\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP4 0xfe /1\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hs\",\n        \"subs x26, x4, #0x1 (1)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"push ax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP4 0xff /6\",\n      \"ExpectedArm64ASM\": [\n        \"strh w4, [x8, #-2]!\"\n      ]\n    },\n    \"call far [rsp]\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": \"GROUP5 0xff /3\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x8]\",\n        \"ldrh w21, [x8, #4]\",\n        \"ldrh w22, [x28, #962]\",\n        \"mov w23, #0x4\",\n        \"movk w23, #0x1, lsl #16\",\n        \"stp x23, x22, [x8, #-16]!\",\n        \"strh w21, [x28, #962]\",\n        \"ubfx w22, w21, #2, #1\",\n        \"and w21, w21, #0xfff8\",\n        \"add x0, x28, x22, lsl #3\",\n        \"ldr x22, [x0, #1184]\",\n        \"ldr x21, [x22, w21, uxtw]\",\n        \"lsr x22, x21, #32\",\n        \"and w23, w22, #0xff000000\",\n        \"orr w21, w23, w21, lsr #16\",\n        \"bfi w21, w22, #16, #8\",\n        \"str w21, [x28, #980]\"\n      ]\n    },\n    \"push rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP4 0xff /6\",\n      \"ExpectedArm64ASM\": [\n        \"str x4, [x8, #-8]!\"\n      ]\n    },\n    \"jmp far [rsp]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"GROUP5 0xff /5\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x8]\",\n        \"ldrh w21, [x8, #4]\",\n        \"strh w21, [x28, #962]\",\n        \"ubfx w22, w21, #2, #1\",\n        \"and w21, w21, #0xfff8\",\n        \"add x0, x28, x22, lsl #3\",\n        \"ldr x22, [x0, #1184]\",\n        \"ldr x21, [x22, w21, uxtw]\",\n        \"lsr x22, x21, #32\",\n        \"and w23, w22, #0xff000000\",\n        \"orr w21, w23, w21, lsr #16\",\n        \"bfi w21, w22, #16, #8\",\n        \"str w21, [x28, #980]\"\n      ]\n    },\n    \"mov byte [rax], 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP11 0xc6 /0\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x4]\"\n      ]\n    },\n    \"mov word [rax], 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP11 0xc7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"strh wzr, [x4]\"\n      ]\n    },\n    \"mov dword [rax], 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP11 0xc7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"str wzr, [x4]\"\n      ]\n    },\n    \"mov qword [rax], 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP11 0xc7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"str xzr, [x4]\"\n      ]\n    },\n    \"mov byte [rax], 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP11 0xc6 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"strb w20, [x4]\"\n      ]\n    },\n    \"mov word [rax], 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP11 0xc7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"strh w20, [x4]\"\n      ]\n    },\n    \"mov dword [rax], 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP11 0xc7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"str w20, [x4]\"\n      ]\n    },\n    \"mov qword [rax], 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP11 0xc7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"str x20, [x4]\"\n      ]\n    },\n    \"mov byte [rax], -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP11 0xc6 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xff\",\n        \"strb w20, [x4]\"\n      ]\n    },\n    \"mov word [rax], -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP11 0xc7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffff\",\n        \"strh w20, [x4]\"\n      ]\n    },\n    \"mov dword [rax], -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP11 0xc7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"str w20, [x4]\"\n      ]\n    },\n    \"mov qword [rax], -1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP11 0xc7 /0\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"str x20, [x4]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Primary_32Bit.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\",\n      \"FlagM\",\n      \"FlagM2\"\n    ]\n  },\n  \"Instructions\": {\n    \"push es\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x06\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #960]\",\n        \"str w20, [x8, #-4]!\"\n      ]\n    },\n    \"pop es\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x07\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x8], #4\",\n        \"strh w20, [x28, #960]\",\n        \"ubfx w21, w20, #2, #1\",\n        \"and w20, w20, #0xfff8\",\n        \"add x0, x28, x21, lsl #3\",\n        \"ldr x21, [x0, #1184]\",\n        \"ldr x20, [x21, w20, uxtw]\",\n        \"lsr x21, x20, #32\",\n        \"and w22, w21, #0xff000000\",\n        \"orr w20, w22, w20, lsr #16\",\n        \"bfi w20, w21, #16, #8\",\n        \"str w20, [x28, #976]\"\n      ]\n    },\n    \"push cs\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0e\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #962]\",\n        \"str w20, [x8, #-4]!\"\n      ]\n    },\n    \"push ss\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x16\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #964]\",\n        \"str w20, [x8, #-4]!\"\n      ]\n    },\n    \"pop ss\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": \"0x17\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x8], #4\",\n        \"ldrb w21, [x28, #1016]\",\n        \"mov w22, #0x1\",\n        \"and w21, w21, #0x1\",\n        \"ldrb w23, [x28, #1016]\",\n        \"and w23, w23, #0xfffffffe\",\n        \"mrs x12, nzcv\",\n        \"cmp x21, #0x0 (0)\",\n        \"csel x21, x23, x22, eq\",\n        \"strb w21, [x28, #1016]\",\n        \"strh w20, [x28, #964]\",\n        \"ubfx w21, w20, #2, #1\",\n        \"and w20, w20, #0xfff8\",\n        \"add x0, x28, x21, lsl #3\",\n        \"ldr x21, [x0, #1184]\",\n        \"ldr x20, [x21, w20, uxtw]\",\n        \"lsr x21, x20, #32\",\n        \"and w22, w21, #0xff000000\",\n        \"orr w20, w22, w20, lsr #16\",\n        \"bfi w20, w21, #16, #8\",\n        \"str w20, [x28, #984]\",\n        \"msr nzcv, x12\"\n      ]\n    },\n    \"push ds\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x1e\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #966]\",\n        \"str w20, [x8, #-4]!\"\n      ]\n    },\n    \"pop ds\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x1f\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x8], #4\",\n        \"strh w20, [x28, #966]\",\n        \"ubfx w21, w20, #2, #1\",\n        \"and w20, w20, #0xfff8\",\n        \"add x0, x28, x21, lsl #3\",\n        \"ldr x21, [x0, #1184]\",\n        \"ldr x20, [x21, w20, uxtw]\",\n        \"lsr x21, x20, #32\",\n        \"and w22, w21, #0xff000000\",\n        \"orr w20, w22, w20, lsr #16\",\n        \"bfi w20, w21, #16, #8\",\n        \"str w20, [x28, #988]\"\n      ]\n    },\n    \"daa\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0x27\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"cset x21, hs\",\n        \"and x22, x20, #0xf\",\n        \"cmp x22, #0x9 (9)\",\n        \"cset x22, hi\",\n        \"eor x23, x27, x26\",\n        \"ubfx w23, w23, #4, #1\",\n        \"orr x22, x23, x22\",\n        \"cmp x20, #0x99 (153)\",\n        \"cset x23, ls\",\n        \"and x21, x21, x23\",\n        \"add x23, x20, #0x6 (6)\",\n        \"cmp x22, #0x0 (0)\",\n        \"csel x20, x23, x20, ne\",\n        \"add x23, x20, #0x60 (96)\",\n        \"cmp x21, #0x0 (0)\",\n        \"csel x26, x23, x20, eq\",\n        \"bfxil x4, x26, #0, #8\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"eor w27, w26, w22, lsl #4\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"das\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": \"0x2f\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"cset x21, lo\",\n        \"and x22, x20, #0xf\",\n        \"cmp x22, #0x9 (9)\",\n        \"cset x22, hi\",\n        \"eor x23, x27, x26\",\n        \"ubfx w23, w23, #4, #1\",\n        \"orr x22, x23, x22\",\n        \"cmp x20, #0x99 (153)\",\n        \"cset x23, hi\",\n        \"orr x21, x21, x23\",\n        \"cmp x20, #0x6 (6)\",\n        \"csel x23, x22, x21, lo\",\n        \"orr w23, w21, w23\",\n        \"sub x12, x20, #0x6 (6)\",\n        \"cmp x22, #0x0 (0)\",\n        \"csel x20, x12, x20, ne\",\n        \"sub x12, x20, #0x60 (96)\",\n        \"cmp x21, #0x0 (0)\",\n        \"csel x26, x12, x20, ne\",\n        \"bfxil x4, x26, #0, #8\",\n        \"cmn wzr, w26, lsl #24\",\n        \"eor x20, x23, #0x1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w27, w26, w22, lsl #4\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"aaa\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"0x37\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x4, #0xf\",\n        \"cmp x20, #0x9 (9)\",\n        \"cset x20, hi\",\n        \"eor x21, x27, x26\",\n        \"ubfx w21, w21, #4, #1\",\n        \"orr x20, x21, x20\",\n        \"cmp wzr, w20\",\n        \"eor w27, w26, w20, lsl #4\",\n        \"add w20, w4, #0x106 (262)\",\n        \"csel w20, w20, w4, lo\",\n        \"mov w21, #0xff0f\",\n        \"and w20, w20, w21\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"aas\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"0x3f\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x4, #0xf\",\n        \"cmp x20, #0x9 (9)\",\n        \"cset x20, hi\",\n        \"eor x21, x27, x26\",\n        \"ubfx w21, w21, #4, #1\",\n        \"orr x20, x21, x20\",\n        \"cmp wzr, w20\",\n        \"eor w27, w26, w20, lsl #4\",\n        \"sub w20, w4, #0x106 (262)\",\n        \"csel w20, w20, w4, lo\",\n        \"mov w21, #0xff0f\",\n        \"and w20, w20, w21\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"inc ax\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x40\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w27, w4\",\n        \"mov w20, #0x1\",\n        \"cset x21, hs\",\n        \"lsl w0, w27, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w27, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"bfxil x4, x26, #0, #16\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"inc eax\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x40\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hs\",\n        \"adds w26, w4, #0x1 (1)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"dec ax\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x48\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w27, w4\",\n        \"mov w20, #0x1\",\n        \"cset x21, hs\",\n        \"lsl w0, w27, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w27, #0x1 (1)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"bfxil x4, x26, #0, #16\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"push ax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x50\",\n      \"ExpectedArm64ASM\": [\n        \"strh w4, [x8, #-2]!\"\n      ]\n    },\n    \"push eax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x50\",\n      \"ExpectedArm64ASM\": [\n        \"str w4, [x8, #-4]!\"\n      ]\n    },\n    \"dec eax\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x48\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hs\",\n        \"subs w26, w4, #0x1 (1)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x27, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"pusha\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x60\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x8\",\n        \"stp w7, w4, [x8, #-8]!\",\n        \"stp w6, w5, [x8, #-8]!\",\n        \"stp w9, w20, [x8, #-8]!\",\n        \"stp w11, w10, [x8, #-8]!\"\n      ]\n    },\n    \"pushad\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x60\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x8\",\n        \"stp w7, w4, [x8, #-8]!\",\n        \"stp w6, w5, [x8, #-8]!\",\n        \"stp w9, w20, [x8, #-8]!\",\n        \"stp w11, w10, [x8, #-8]!\"\n      ]\n    },\n    \"popa\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x61\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x8\",\n        \"ldp w11, w10, [x20], #8\",\n        \"ldr w9, [x20], #4\",\n        \"add x20, x20, #0x4 (4)\",\n        \"mov x8, x20\",\n        \"ldp w6, w5, [x8], #8\",\n        \"ldp w7, w4, [x8], #8\"\n      ]\n    },\n    \"popad\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x61\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x8\",\n        \"ldp w11, w10, [x20], #8\",\n        \"ldr w9, [x20], #4\",\n        \"add x20, x20, #0x4 (4)\",\n        \"mov x8, x20\",\n        \"ldp w6, w5, [x8], #8\",\n        \"ldp w7, w4, [x8], #8\"\n      ]\n    },\n    \"aam\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0xd4\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"mov w21, #0xa\",\n        \"udiv x22, x20, x21\",\n        \"msub x12, x22, x21, x20\",\n        \"add x26, x12, x22, lsl #8\",\n        \"bfxil x4, x26, #0, #16\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"aad\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0xd5\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, #8\",\n        \"mov w21, #0xa\",\n        \"mul x20, x20, x21\",\n        \"add x20, x4, x20\",\n        \"and x26, x20, #0xff\",\n        \"bfxil x4, x26, #0, #16\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"db 0xd4, 0x40\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"aam with a different immediate byte base\",\n        \"0xd4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"mov w21, #0x40\",\n        \"udiv x22, x20, x21\",\n        \"msub x12, x22, x21, x20\",\n        \"add x26, x12, x22, lsl #8\",\n        \"bfxil x4, x26, #0, #16\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"db 0xd5, 0x40\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"aad with a different immediate byte base\",\n        \"0xd5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, #8\",\n        \"mov w21, #0x40\",\n        \"mul x20, x20, x21\",\n        \"add x20, x4, x20\",\n        \"and x26, x20, #0xff\",\n        \"bfxil x4, x26, #0, #16\",\n        \"cmn wzr, w26, lsl #24\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"salc\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xd6\",\n      \"ExpectedArm64ASM\": [\n        \"csetm w20, lo\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/RPRES/DDD.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"AFP\",\n      \"RPRES\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\"\n    ]\n  },\n  \"Instructions\": {\n    \"pfrcpv mm0, mm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0x0f 0x0f 0x86\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"frecpe v0.2s, v2.2s\",\n        \"frecps v1.2s, v0.2s, v2.2s\",\n        \"fmul v2.2s, v0.2s, v1.2s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfrsqrtv mm0, mm1\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0x0f 0x0f 0x87\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"fabs v3.4s, v2.4s\",\n        \"frsqrte v0.2s, v3.2s\",\n        \"fmul v1.2s, v0.2s, v0.2s\",\n        \"frsqrts v1.2s, v1.2s, v3.2s\",\n        \"fmul v3.2s, v0.2s, v1.2s\",\n        \"movi v0.2s, #0x80, lsl #24\",\n        \"bit v3.8b, v2.8b, v0.8b\",\n        \"str d3, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfrcp mm0, mm1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0x0f 0x0f 0x96\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"frecpe s0, s2\",\n        \"frecps s1, s0, s2\",\n        \"fmul s2, s0, s1\",\n        \"dup v2.2s, v2.s[0]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pfrsqrt mm0, mm1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0x0f 0x0f 0x97\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"fabs v3.4s, v2.4s\",\n        \"frsqrte v0.2s, v3.2s\",\n        \"fmul v1.2s, v0.2s, v0.2s\",\n        \"frsqrts v1.2s, v1.2s, v3.2s\",\n        \"fmul v3.2s, v0.2s, v1.2s\",\n        \"movi v0.2s, #0x80, lsl #24\",\n        \"bit v3.8b, v2.8b, v0.8b\",\n        \"dup v2.2s, v3.s[0]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/RPRES/Secondary.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"AFP\",\n      \"RPRES\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\"\n    ]\n  },\n  \"Instructions\": {\n    \"rsqrtps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x0f 0x52\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frsqrte v16.4s, v17.4s\"\n      ]\n    },\n    \"rcpps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0x0f 0x53\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frecpe v16.4s, v17.4s\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/RPRES/Secondary_REP_AFP.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"RPRES\",\n      \"AFP\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\"\n    ]\n  },\n  \"Instructions\": {\n    \"rsqrtss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x52\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frsqrte s16, s17\"\n      ]\n    },\n    \"rcpss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xf3 0x0f 0x53\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frecpe s16, s17\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/RPRES/VEX_map1_AFP.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\",\n      \"AFP\"\n    ],\n    \"DisabledHostFeatures\": []\n  },\n  \"Instructions\": {\n    \"vrsqrtps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x52 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frsqrte v16.4s, v17.4s\"\n      ]\n    },\n    \"vrsqrtps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x52 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frsqrte z16.s, z17.s\"\n      ]\n    },\n    \"vrsqrtss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"AFP can make this more optimal\",\n        \"Map 1 0b10 0x52 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"frsqrte s16, s18\"\n      ]\n    },\n    \"vrcpps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x53 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frecpe v16.4s, v17.4s\"\n      ]\n    },\n    \"vrcpps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x53 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frecpe z16.s, z17.s\"\n      ]\n    },\n    \"vrcpss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x53 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"frecpe s16, s18\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Repeat.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\"\n    ]\n  },\n  \"Instructions\": {}\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/SSE42_Strings.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"CRYPTO\"\n    ],\n    \"Comment\": [\n      \"Look at the official documentation for more information about this layout.\",\n      \"imm of each string comparison operation changes behaviour of the operation.\",\n      \"[1:0] - Source Data Format\",\n      \"      - 00b: Unsigned bytes\",\n      \"      - 01b: Unsigned words\",\n      \"      - 10b: Signed bytes\",\n      \"      - 11b: Signed words\",\n      \"[3:2] - Aggregation Operation\",\n      \"      - 00b: Equal Any\",\n      \"      - 01b: Range\",\n      \"      - 10b: Equal Each\",\n      \"      - 11b: Equal Ordered\",\n      \"[5:4] - Polarity\",\n      \"      - 00b: Positive Polarity (IntRes2 = IntRes1)\",\n      \"      - 01b: Negative Polarity (IntRes2 = -1 ^ IntRes1)\",\n      \"      - 10b: Positive Masked (IntRes2 = IntRes1)\",\n      \"      - 11b: Negative Masked (IntRes2[i] = ~IntRes1[i])\",\n      \"[6]   - Output selection\",\n      \"      - 0b: ECX = LSB\",\n      \"      - 1b: ECX = MSB\",\n      \"[7]   - Reserved\"\n    ]\n  },\n  \"Instructions\": {\n    \"pcmpestrm xmm0, xmm1, 0_0_00_00_00b\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0x66 0x0f 0x3A 0x60\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x3, [x28, #2320]\",\n        \"ldr x0, [x28, #2328]\",\n        \"stp x0, x30, [sp, #-16]!\",\n        \"mov x0, x4\",\n        \"mov x1, x5\",\n        \"mov w2, #0x0\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v1.16b, v17.16b\",\n        \"blr x3\",\n        \"ldp xzr, x30, [sp], #16\",\n        \"mov w20, w0\",\n        \"mov w27, #0x0\",\n        \"uxth w0, w20\",\n        \"fmov s16, w0\",\n        \"mov w26, #0x1\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"pcmpestri xmm0, xmm1, 0_0_00_00_00b\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0x66 0x0f 0x3A 0x61\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x3, [x28, #2320]\",\n        \"ldr x0, [x28, #2328]\",\n        \"stp x0, x30, [sp, #-16]!\",\n        \"mov x0, x4\",\n        \"mov x1, x5\",\n        \"mov w2, #0x0\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v1.16b, v17.16b\",\n        \"blr x3\",\n        \"ldp xzr, x30, [sp], #16\",\n        \"mov w20, w0\",\n        \"mov w27, #0x0\",\n        \"uxth w21, w20\",\n        \"mov w22, #0x10\",\n        \"rbit w0, w21\",\n        \"clz w23, w0\",\n        \"cmp x21, #0x0 (0)\",\n        \"csel x7, x22, x23, eq\",\n        \"mov w26, #0x1\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"pcmpistrm xmm0, xmm1, 0_0_00_00_00b\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0x66 0x0f 0x3A 0x62\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v1.16b, v17.16b\",\n        \"mov w0, #0x0\",\n        \"ldr x1, [x28, #2336]\",\n        \"ldr x3, [x28, #2344]\",\n        \"blr x1\",\n        \"ldr x30, [sp], #16\",\n        \"mov w20, w0\",\n        \"mov w27, #0x0\",\n        \"uxth w0, w20\",\n        \"fmov s16, w0\",\n        \"mov w26, #0x1\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"pcmpistri xmm0, xmm1, 0_0_00_00_00b\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0x66 0x0f 0x3A 0x63\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v1.16b, v17.16b\",\n        \"mov w0, #0x0\",\n        \"ldr x1, [x28, #2336]\",\n        \"ldr x3, [x28, #2344]\",\n        \"blr x1\",\n        \"ldr x30, [sp], #16\",\n        \"mov w20, w0\",\n        \"mov w27, #0x0\",\n        \"uxth w21, w20\",\n        \"mov w22, #0x10\",\n        \"rbit w0, w21\",\n        \"clz w23, w0\",\n        \"cmp x21, #0x0 (0)\",\n        \"csel x7, x22, x23, eq\",\n        \"mov w26, #0x1\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Secondary.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FRINTTS\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ]\n  },\n  \"Comment\": [\n    \"MMX instructions are defined as optimal without SRA being used for these instructions.\",\n    \"Could remove a bunch of instructions if those are under SRA\",\n    \"Vector shifts by vector elements can be optimized with SVE wide element shifts\",\n    \"Vector multiply returning high can be optimized with SVE\"\n  ],\n  \"Instructions\": {\n    \"femms\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x0b\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"movups xmm0, xmm0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": \"0x0f 0x10\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"movups xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x10\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"movups xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x10\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\"\n      ]\n    },\n    \"movups [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x11\",\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"movlps xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x12\",\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.d}[0], [x4]\"\n      ]\n    },\n    \"movlps [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x13\",\n      \"ExpectedArm64ASM\": [\n        \"str d16, [x4]\"\n      ]\n    },\n    \"movhlps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x12\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[0], v17.d[1]\"\n      ]\n    },\n    \"unpcklps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x14\",\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"unpckhps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x15\",\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"movhps xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x16\",\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.d}[1], [x4]\"\n      ]\n    },\n    \"movlhps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x16\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[1], v17.d[0]\"\n      ]\n    },\n    \"movhps [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x17\",\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.d}[1], [x4]\"\n      ]\n    },\n    \"nop\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": \"0x0f 0x19\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"movaps xmm0, xmm0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": \"0x0f 0x28\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"movaps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x28\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"movaps xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x28\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\"\n      ]\n    },\n    \"movaps [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x29\",\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"cvtpi2ps xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"scvtf v0.2s, v2.2s\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"cvtpi2ps xmm0, mm0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"scvtf v0.2s, v2.2s\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"movntps [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x2b\",\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"cvttps2pi mm0, [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x2c\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x4]\",\n        \"frint32z v2.4s, v2.4s\",\n        \"fcvtzs v2.2s, v2.2s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"cvttps2pi mm0, xmm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0x2c\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"frint32z v2.4s, v16.4s\",\n        \"fcvtzs v2.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"cvtps2pi mm0, [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x2d\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x4]\",\n        \"frint32x v2.4s, v2.4s\",\n        \"fcvtzs v2.2s, v2.2s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"cvtps2pi mm0, xmm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0x2d\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"frint32x v2.4s, v16.4s\",\n        \"fcvtzs v2.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"ucomiss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0x2e\",\n      \"ExpectedArm64ASM\": [\n        \"fcmp s16, s17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"comiss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0x2f\",\n      \"ExpectedArm64ASM\": [\n        \"fcmp s16, s17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"rdtsc\": {\n      \"Skip\": \"Yes\",\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x0f 0x31\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, S3_3_c14_c0_2\",\n        \"lsl w4, w20, #7\",\n        \"lsr x5, x20, #25\"\n      ]\n    },\n    \"cmovo ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x40\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, vs\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovo eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x40\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, vs\"\n      ]\n    },\n    \"cmovo rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x40\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, vs\"\n      ]\n    },\n    \"cmovno ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x41\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, vc\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovno eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x41\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, vc\"\n      ]\n    },\n    \"cmovno rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x41\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, vc\"\n      ]\n    },\n    \"cmovb ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x42\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, lo\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovb eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x42\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, lo\"\n      ]\n    },\n    \"cmovb rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x42\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, lo\"\n      ]\n    },\n    \"cmovnb ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x43\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, hs\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovnb eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x43\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, hs\"\n      ]\n    },\n    \"cmovnb rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x43\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, hs\"\n      ]\n    },\n    \"cmovz ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x44\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, eq\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovz eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x44\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, eq\"\n      ]\n    },\n    \"cmovz rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x44\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, eq\"\n      ]\n    },\n    \"cmovnz ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x45\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, ne\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovnz eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x45\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, ne\"\n      ]\n    },\n    \"cmovnz rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x45\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, ne\"\n      ]\n    },\n    \"cmovbe ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x46\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, ls\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovbe eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x46\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, ls\"\n      ]\n    },\n    \"cmovbe rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x46\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, ls\"\n      ]\n    },\n    \"cmovnbe ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x47\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, hi\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovnbe eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x47\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, hi\"\n      ]\n    },\n    \"cmovnbe rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x47\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, hi\"\n      ]\n    },\n    \"cmovs ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x48\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, mi\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovs eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x48\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, mi\"\n      ]\n    },\n    \"cmovs rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x48\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, mi\"\n      ]\n    },\n    \"cmovns ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x49\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, pl\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovns eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x49\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, pl\"\n      ]\n    },\n    \"cmovns rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x49\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, pl\"\n      ]\n    },\n    \"cmovpe ax, bx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x4a\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"mrs x21, nzcv\",\n        \"tst w20, #0x1\",\n        \"csel w20, w6, w4, ne\",\n        \"bfxil x4, x20, #0, #16\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"cmovpe eax, ebx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0x4a\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"mrs x21, nzcv\",\n        \"tst w20, #0x1\",\n        \"csel w4, w6, w4, ne\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"cmovpe rax, rbx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0x4a\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"mrs x21, nzcv\",\n        \"tst w20, #0x1\",\n        \"csel x4, x6, x4, ne\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"cmovnp ax, bx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x4b\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"mrs x21, nzcv\",\n        \"tst w20, #0x1\",\n        \"csel w20, w6, w4, ne\",\n        \"bfxil x4, x20, #0, #16\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"cmovnp eax, ebx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0x4b\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"mrs x21, nzcv\",\n        \"tst w20, #0x1\",\n        \"csel w4, w6, w4, ne\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"cmovnp rax, rbx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0x4b\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"mrs x21, nzcv\",\n        \"tst w20, #0x1\",\n        \"csel x4, x6, x4, ne\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"cmovl ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x4c\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, lt\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovl eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4c\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, lt\"\n      ]\n    },\n    \"cmovl rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4c\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, lt\"\n      ]\n    },\n    \"cmovnl ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x4d\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, ge\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovnl eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4d\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, ge\"\n      ]\n    },\n    \"cmovnl rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4d\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, ge\"\n      ]\n    },\n    \"cmovle ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x4e\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, le\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovle eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4e\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, le\"\n      ]\n    },\n    \"cmovle rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4e\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, le\"\n      ]\n    },\n    \"cmovnle ax, bx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x4f\",\n      \"ExpectedArm64ASM\": [\n        \"csel w20, w6, w4, gt\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmovnle eax, ebx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4f\",\n      \"ExpectedArm64ASM\": [\n        \"csel w4, w6, w4, gt\"\n      ]\n    },\n    \"cmovnle rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x4f\",\n      \"ExpectedArm64ASM\": [\n        \"csel x4, x6, x4, gt\"\n      ]\n    },\n    \"movmskps eax, xmm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0x50\",\n      \"ExpectedArm64ASM\": [\n        \"ushr v2.4s, v16.4s, #31\",\n        \"ldr q3, [x28, #3168]\",\n        \"ushl v2.4s, v2.4s, v3.4s\",\n        \"addv s2, v2.4s\",\n        \"mov w4, v2.s[0]\"\n      ]\n    },\n    \"movmskps rax, xmm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0x50\",\n      \"ExpectedArm64ASM\": [\n        \"ushr v2.4s, v16.4s, #31\",\n        \"ldr q3, [x28, #3168]\",\n        \"ushl v2.4s, v2.4s, v3.4s\",\n        \"addv s2, v2.4s\",\n        \"mov w4, v2.s[0]\"\n      ]\n    },\n    \"sqrtps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x51\",\n      \"ExpectedArm64ASM\": [\n        \"fsqrt v16.4s, v17.4s\"\n      ]\n    },\n    \"rsqrtps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0x0f 0x52\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov v0.4s, #0x70 (1.0000)\",\n        \"fsqrt v1.4s, v17.4s\",\n        \"fdiv v16.4s, v0.4s, v1.4s\"\n      ]\n    },\n    \"rcpps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0x0f 0x53\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov v0.4s, #0x70 (1.0000)\",\n        \"fdiv v16.4s, v0.4s, v17.4s\"\n      ]\n    },\n    \"andps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x54\",\n      \"ExpectedArm64ASM\": [\n        \"and v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"andnps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x55\",\n      \"ExpectedArm64ASM\": [\n        \"bic v16.16b, v17.16b, v16.16b\"\n      ]\n    },\n    \"orps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x56\",\n      \"ExpectedArm64ASM\": [\n        \"orr v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"xorps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x57\",\n      \"ExpectedArm64ASM\": [\n        \"eor v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"xorps xmm0, xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x57\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"addps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x58\",\n      \"ExpectedArm64ASM\": [\n        \"fadd v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"mulps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x59\",\n      \"ExpectedArm64ASM\": [\n        \"fmul v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"cvtps2pd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x5a\",\n      \"ExpectedArm64ASM\": [\n        \"fcvtl v16.2d, v17.2s\"\n      ]\n    },\n    \"cvtps2pd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x5a\",\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"fcvtl v16.2d, v2.2s\"\n      ]\n    },\n    \"cvtdq2ps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x5b\",\n      \"ExpectedArm64ASM\": [\n        \"scvtf v16.4s, v17.4s\"\n      ]\n    },\n    \"subps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x5c\",\n      \"ExpectedArm64ASM\": [\n        \"fsub v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"minps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x5d\",\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v0.4s, v17.4s, v16.4s\",\n        \"bif v16.16b, v17.16b, v0.16b\"\n      ]\n    },\n    \"divps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x5e\",\n      \"ExpectedArm64ASM\": [\n        \"fdiv v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"maxps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x5f\",\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v0.4s, v17.4s, v16.4s\",\n        \"bit v16.16b, v17.16b, v0.16b\"\n      ]\n    },\n    \"punpcklbw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x60\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"zip1 v2.8b, v2.8b, v3.8b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"punpcklbw mm0, [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x60\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x4]\",\n        \"zip1 v2.8b, v2.8b, v3.8b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"punpcklwd mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x61\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"zip1 v2.4h, v2.4h, v3.4h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"punpcklwd mm0, [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x61\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x4]\",\n        \"zip1 v2.4h, v2.4h, v3.4h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"punpckldq mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x62\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"zip1 v2.2s, v2.2s, v3.2s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"punpckldq mm0, [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x62\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x4]\",\n        \"zip1 v2.2s, v2.2s, v3.2s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"packsswb mm0, mm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0x63\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"zip1 v2.2d, v2.2d, v3.2d\",\n        \"sqxtn v2.8b, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"packsswb mm0, [rax]\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0x63\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x4]\",\n        \"zip1 v2.2d, v2.2d, v3.2d\",\n        \"sqxtn v2.8b, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"packsswb mm0, mm0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x63\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"zip1 v2.2d, v2.2d, v2.2d\",\n        \"sqxtn v2.8b, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pcmpgtb mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x64\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"cmgt v2.16b, v3.16b, v2.16b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pcmpgtw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x65\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"cmgt v2.8h, v3.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pcmpgtd mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x66\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"cmgt v2.4s, v3.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"punpckhbw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x68\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"zip2 v2.8b, v2.8b, v3.8b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"punpckhbw mm0, [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x68\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x4]\",\n        \"zip2 v2.8b, v2.8b, v3.8b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"punpckhwd mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x69\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"zip2 v2.4h, v2.4h, v3.4h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"punpckhwd mm0, [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x69\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x4]\",\n        \"zip2 v2.4h, v2.4h, v3.4h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"punpckhdq mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x6a\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"zip2 v2.2s, v2.2s, v3.2s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"punpckhdq mm0, [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x6a\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x4]\",\n        \"zip2 v2.2s, v2.2s, v3.2s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"packssdw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0x6b\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"zip1 v2.2d, v2.2d, v3.2d\",\n        \"sqxtn v2.4h, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"movd mm0, eax\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0x6e\",\n      \"ExpectedArm64ASM\": [\n        \"fmov s2, w4\",\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"movd mm0, [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0x6e\",\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"movq mm0, mm0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0x6f\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"movq mm0, mm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0x6f\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"movq mm0, [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0x6f\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x4]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pshufw mm0, mm1, 0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0x70\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"dup v2.4h, v2.h[0]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pshufw mm0, [rax], 0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0x70\",\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"dup v2.4h, v2.h[0]\",\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pshufw mm0, mm1, 1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0x70\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr x0, [x28, #2664]\",\n        \"ldr d3, [x0, #16]\",\n        \"tbl v2.8b, {v2.16b}, v3.8b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pshufw mm0, [rax], 1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0x70\",\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"ldr x0, [x28, #2664]\",\n        \"ldr d3, [x0, #16]\",\n        \"tbl v2.8b, {v2.16b}, v3.8b\",\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pshufw mm0, mm1, 0xff\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0x70\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"dup v2.4h, v2.h[3]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pshufw mm0, [rax], 0xff\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0x70\",\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"dup v2.4h, v2.h[3]\",\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pcmpeqb mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x74\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"cmeq v2.16b, v3.16b, v2.16b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pcmpeqw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x75\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"cmeq v2.8h, v3.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pcmpeqd mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0x76\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"cmeq v2.4s, v3.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"emms\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0x77\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"movd eax, mm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0x7e\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"mov w4, v2.s[0]\"\n      ]\n    },\n    \"movd [rax], mm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0x7e\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"str s2, [x4]\"\n      ]\n    },\n    \"db 0x0f, 0x7f, 0xc1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"movq mm0, mm1\",\n        \"Manual encoded since nasm would encode 0x6f version\",\n        \"0x0f 0x7f\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"str d2, [x28, #1072]\",\n        \"strh w20, [x28, #1080]\"\n      ]\n    },\n    \"movq [rax], mm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0x7f\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"str d2, [x4]\"\n      ]\n    },\n    \"seto al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x90\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, vs\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setno al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x91\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, vc\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setb al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x92\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lo\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setnb al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x93\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hs\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setz al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x94\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, eq\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setnz al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x95\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, ne\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setbe al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x96\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, ls\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setnbe al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x97\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, hi\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"sets al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x98\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, mi\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setns al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x99\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, pl\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setpe al\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0x9a\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"and w20, w20, #0x1\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setnp al\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0x9b\",\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"and w20, w20, #0x1\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setl al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x9c\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, lt\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setnl al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x9d\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, ge\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setle al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x9e\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, le\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"setnle al\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0x9f\",\n      \"ExpectedArm64ASM\": [\n        \"cset x20, gt\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"push fs\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0xa0\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x28, #1000]\",\n        \"str x20, [x8, #-8]!\"\n      ]\n    },\n    \"pop fs\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xa1\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x8], #8\",\n        \"strh w20, [x28, #970]\",\n        \"ubfx w21, w20, #2, #1\",\n        \"and w20, w20, #0xfff8\",\n        \"add x0, x28, x21, lsl #3\",\n        \"ldr x21, [x0, #1184]\",\n        \"ldr x20, [x21, w20, uxtw]\",\n        \"lsr x21, x20, #32\",\n        \"and w22, w21, #0xff000000\",\n        \"orr w20, w22, w20, lsr #16\",\n        \"bfi w20, w21, #16, #8\",\n        \"str w20, [x28, #1000]\"\n      ]\n    },\n    \"bt ax, bx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xa3\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x6, #0xf\",\n        \"lsr w20, w4, w20\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bt [rax], bx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xa3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #13\",\n        \"ldrb w21, [x4, x21, sxtx]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bt eax, ebx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0xa3\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, w6\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bt [rax], ebx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xa3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #29\",\n        \"ldrb w21, [x4, x21, sxtx]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bt rax, rbx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0xa3\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x20, x4, x6\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bt [rax], rbx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xa3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"asr x21, x6, #3\",\n        \"ldrb w21, [x4, x21, sxtx]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"shld ax, bx, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"shld ax, bx, 1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"uxth w21, w4\",\n        \"lsl x22, x21, #1\",\n        \"lsr w20, w20, #15\",\n        \"orr x26, x22, x20\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x20, x21, #0x8000\",\n        \"ubfx x20, x20, #15, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"eor w20, w26, w21\",\n        \"ubfx x20, x20, #15, #1\",\n        \"bfi w22, w20, #28, #1\",\n        \"msr nzcv, x22\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"shld ax, bx, 15\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"uxth w21, w4\",\n        \"lsl x22, x21, #15\",\n        \"lsr w20, w20, #1\",\n        \"orr x26, x22, x20\",\n        \"cmn wzr, w26, lsl #16\",\n        \"eor x20, x21, #0x2\",\n        \"ubfx x20, x20, #1, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"bfxil x4, x26, #0, #16\"\n      ]\n    },\n    \"shld ax, bx, 16\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"uxth w21, w4\",\n        \"lsl x21, x21, #16\",\n        \"orr x26, x21, x20\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x4, x26, #0, #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"shld ax, bx, 31\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"uxth w21, w4\",\n        \"lsl x21, x21, #31\",\n        \"lsr w20, w20, #17\",\n        \"orr x26, x21, x20\",\n        \"cmn wzr, w26, lsl #16\",\n        \"bfxil x4, x26, #0, #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"shld eax, ebx, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"mov w4, w4\"\n      ]\n    },\n    \"shld eax, ebx, 1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr w26, w4, w6, #31\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x80000000\",\n        \"ubfx x20, x20, #31, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w20, w26, w4\",\n        \"ubfx x20, x20, #31, #1\",\n        \"bfi w21, w20, #28, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld eax, ebx, 15\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr w26, w4, w6, #17\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x20000\",\n        \"ubfx x20, x20, #17, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld eax, ebx, 16\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr w26, w4, w6, #16\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x10000\",\n        \"ubfx x20, x20, #16, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld eax, ebx, 31\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr w26, w4, w6, #1\",\n        \"cmp w26, #0x0 (0)\",\n        \"eor x20, x4, #0x2\",\n        \"ubfx x20, x20, #1, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld rax, rbx, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"shld rax, rbx, 1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr x26, x4, x6, #63\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x8000000000000000\",\n        \"lsr x20, x20, #63\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor x20, x26, x4\",\n        \"lsr x20, x20, #63\",\n        \"bfi w21, w20, #28, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld rax, rbx, 15\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr x26, x4, x6, #49\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x2000000000000\",\n        \"ubfx x20, x20, #49, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld rax, rbx, 32\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr x26, x4, x6, #32\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x100000000\",\n        \"ubfx x20, x20, #32, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld rax, rbx, 63\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xac\",\n      \"ExpectedArm64ASM\": [\n        \"extr x26, x4, x6, #1\",\n        \"cmp x26, #0x0 (0)\",\n        \"eor x20, x4, #0x2\",\n        \"ubfx x20, x20, #1, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"shld ax, bx, cl\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": \"0x0f 0xad\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"uxth w21, w4\",\n        \"and x22, x7, #0x1f\",\n        \"mov w23, #0x10\",\n        \"sub x23, x23, x22\",\n        \"lsl x24, x21, x22\",\n        \"lsr w20, w20, w23\",\n        \"orr x20, x24, x20\",\n        \"mrs x23, nzcv\",\n        \"cmp x22, #0x0 (0)\",\n        \"csel x20, x21, x20, eq\",\n        \"msr nzcv, x23\",\n        \"and w0, w22, #0x1f\",\n        \"cbz w0, #+0x2c\",\n        \"cmn wzr, w20, lsl #16\",\n        \"mov x26, x20\",\n        \"mvn x0, x20\",\n        \"eor w2, w21, w20\",\n        \"mrs x1, nzcv\",\n        \"lsr x0, x0, #16\",\n        \"bfi w1, w0, #29, #1\",\n        \"lsr w2, w2, #15\",\n        \"bfi w1, w2, #28, #1\",\n        \"msr nzcv, x1\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"shld eax, ebx, cl\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": \"0x0f 0xad\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w4\",\n        \"and x21, x7, #0x1f\",\n        \"neg x22, x21\",\n        \"lsl x23, x20, x21\",\n        \"lsr w22, w6, w22\",\n        \"orr x22, x23, x22\",\n        \"mrs x23, nzcv\",\n        \"cmp x21, #0x0 (0)\",\n        \"csel x22, x20, x22, eq\",\n        \"msr nzcv, x23\",\n        \"and w0, w21, #0x1f\",\n        \"cbz w0, #+0x2c\",\n        \"ands w26, w22, w22\",\n        \"neg w0, w21\",\n        \"lsr w0, w20, w0\",\n        \"mvn x0, x0\",\n        \"eor w2, w20, w22\",\n        \"mrs x1, nzcv\",\n        \"bfi w1, w0, #29, #1\",\n        \"lsr w2, w2, #31\",\n        \"bfi w1, w2, #28, #1\",\n        \"msr nzcv, x1\",\n        \"mov w4, w22\"\n      ]\n    },\n    \"shld rax, rbx, cl\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": \"0x0f 0xad\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x7, #0x3f\",\n        \"neg x21, x20\",\n        \"lsl x22, x4, x20\",\n        \"lsr x21, x6, x21\",\n        \"orr x21, x22, x21\",\n        \"mrs x22, nzcv\",\n        \"cmp x20, #0x0 (0)\",\n        \"csel x21, x4, x21, eq\",\n        \"msr nzcv, x22\",\n        \"and w0, w20, #0x3f\",\n        \"cbz x0, #+0x2c\",\n        \"ands x26, x21, x21\",\n        \"neg x0, x20\",\n        \"lsr x0, x4, x0\",\n        \"mvn x0, x0\",\n        \"eor x2, x4, x21\",\n        \"mrs x1, nzcv\",\n        \"bfi w1, w0, #29, #1\",\n        \"lsr x2, x2, #63\",\n        \"bfi w1, w2, #28, #1\",\n        \"msr nzcv, x1\",\n        \"mov x4, x21\"\n      ]\n    },\n    \"push gs\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0xa8\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x28, #992]\",\n        \"str x20, [x8, #-8]!\"\n      ]\n    },\n    \"pop gs\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xa9\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x8], #8\",\n        \"strh w20, [x28, #968]\",\n        \"ubfx w21, w20, #2, #1\",\n        \"and w20, w20, #0xfff8\",\n        \"add x0, x28, x21, lsl #3\",\n        \"ldr x21, [x0, #1184]\",\n        \"ldr x20, [x21, w20, uxtw]\",\n        \"lsr x21, x20, #32\",\n        \"and w22, w21, #0xff000000\",\n        \"orr w20, w22, w20, lsr #16\",\n        \"bfi w20, w21, #16, #8\",\n        \"str w20, [x28, #992]\"\n      ]\n    },\n    \"bts ax, bx\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"0x0f 0xab\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x6, #0xf\",\n        \"lsr w21, w4, w20\",\n        \"ubfx x21, x21, #0, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"mov w21, #0x1\",\n        \"lsl w20, w21, w20\",\n        \"orr w20, w4, w20\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor w20, w22, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bts [rax], bx\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"0x0f 0xab\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #13\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"orr x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bts eax, ebx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xab\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, w6\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"mov w20, #0x1\",\n        \"lsl w20, w20, w6\",\n        \"orr w4, w4, w20\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bts [rax], ebx\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"0x0f 0xab\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #29\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"orr x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bts rax, rbx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xab\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x20, x4, x6\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"mov w20, #0x1\",\n        \"lsl x20, x20, x6\",\n        \"orr x4, x4, x20\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bts [rax], rbx\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"0x0f 0xab\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"asr x21, x6, #3\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"orr x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock bts [rax], bx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #13\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldsetalb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock bts [rax], ebx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #29\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldsetalb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock bts [rax], rbx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"asr x21, x6, #3\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldsetalb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"imul ax, bx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"sxth x20, w4\",\n        \"sxth x21, w6\",\n        \"mul x20, x20, x21\",\n        \"sbfx x21, x20, #16, #16\",\n        \"bfxil x4, x20, #0, #16\",\n        \"sbfx x20, x20, #15, #1\",\n        \"cmp x21, x20\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul eax, ebx\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"smull x20, w4, w6\",\n        \"asr x20, x20, #32\",\n        \"mul w4, w4, w6\",\n        \"sbfx x21, x4, #31, #1\",\n        \"cmp x20, x21\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"imul rax, rbx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xaf\",\n      \"ExpectedArm64ASM\": [\n        \"smulh x20, x4, x6\",\n        \"mul x4, x4, x6\",\n        \"asr x21, x4, #63\",\n        \"cmp x20, x21\",\n        \"ccmp xzr, #0, #nzcV, eq\"\n      ]\n    },\n    \"cmpxchg al, bl\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xb0\",\n      \"ExpectedArm64ASM\": [\n        \"mov w27, #0x0\",\n        \"lsl w0, w4, #24\",\n        \"cmp w0, w4, lsl #24\",\n        \"sub w26, w4, w4\",\n        \"bfxil x4, x6, #0, #8\"\n      ]\n    },\n    \"cmpxchg [rcx], bl\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xb0\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w6\",\n        \"uxtb x21, w4\",\n        \"mov w1, w4\",\n        \"casalb w1, w20, [x7]\",\n        \"mov w20, w1\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #24\",\n        \"cmp w0, w20, lsl #24\",\n        \"sub w26, w21, w20\",\n        \"bfxil x4, x20, #0, #8\"\n      ]\n    },\n    \"cmpxchg ax, bx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xb1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w27, #0x0\",\n        \"lsl w0, w4, #16\",\n        \"cmp w0, w4, lsl #16\",\n        \"sub w26, w4, w4\",\n        \"bfxil x4, x6, #0, #16\"\n      ]\n    },\n    \"cmpxchg [rcx], bx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xb1\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"uxth x21, w4\",\n        \"mov w1, w4\",\n        \"casalh w1, w20, [x7]\",\n        \"mov w20, w1\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #16\",\n        \"cmp w0, w20, lsl #16\",\n        \"sub w26, w21, w20\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"cmpxchg eax, ebx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x0f 0xb1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w27, #0x0\",\n        \"subs w26, w4, w4\",\n        \"mov x4, x6\"\n      ]\n    },\n    \"cmpxchg [rcx], ebx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xb1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w6\",\n        \"mov w21, w4\",\n        \"mov w1, w4\",\n        \"casal w1, w20, [x7]\",\n        \"mov w20, w1\",\n        \"eor x27, x21, x20\",\n        \"subs w26, w21, w20\",\n        \"csel x4, x4, x20, eq\"\n      ]\n    },\n    \"cmpxchg rax, rbx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x0f 0xb1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w27, #0x0\",\n        \"subs x26, x4, x4\",\n        \"mov x4, x6\"\n      ]\n    },\n    \"cmpxchg [rcx], rbx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0f 0xb1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"casal x4, x6, [x7]\",\n        \"eor x27, x20, x4\",\n        \"subs x26, x20, x4\"\n      ]\n    },\n    \"btr ax, bx\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x6, #0xf\",\n        \"lsr w21, w4, w20\",\n        \"ubfx x21, x21, #0, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"mov w21, #0x1\",\n        \"lsl w20, w21, w20\",\n        \"bic w20, w4, w20\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor w20, w22, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"btr [rax], bx\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #13\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"bic x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btr eax, ebx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"lsr w20, w4, w6\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"mov w20, #0x1\",\n        \"lsl w20, w20, w6\",\n        \"bic w4, w4, w20\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"btr [rax], ebx\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #29\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"bic x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btr rax, rbx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x20, x4, x6\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"mov w20, #0x1\",\n        \"lsl x20, x20, x6\",\n        \"bic x4, x4, x20\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"btr [rax], rbx\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"asr x21, x6, #3\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"bic x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"movzx ax, bl\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0xb6\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w6\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"lock btr [rax], bx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #13\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldclralb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btr [rax], ebx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #29\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldclralb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btr [rax], rbx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"asr x21, x6, #3\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldclralb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"movzx ax, byte [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0xb6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"movzx eax, bl\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xb6\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w4, w6\"\n      ]\n    },\n    \"movzx eax, byte [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xb6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w4, [x4]\"\n      ]\n    },\n    \"movzx rax, bl\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xb6\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w4, w6\"\n      ]\n    },\n    \"movzx rax, byte [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xb6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w4, [x4]\"\n      ]\n    },\n    \"movzx eax, bx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xb7\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w4, w6\"\n      ]\n    },\n    \"movzx eax, word [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xb7\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w4, [x4]\"\n      ]\n    },\n    \"movzx rax, bx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xb7\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w4, w6\"\n      ]\n    },\n    \"movzx rax, word [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xb7\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w4, [x4]\"\n      ]\n    },\n    \"btc ax, bx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xbb\",\n      \"ExpectedArm64ASM\": [\n        \"and x20, x6, #0xf\",\n        \"mov w21, #0x1\",\n        \"lsl w21, w21, w20\",\n        \"eor w21, w4, w21\",\n        \"lsr w20, w21, w20\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w20, #29, #1\",\n        \"bfxil x4, x21, #0, #16\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"btc [rax], bx\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"0x0f 0xbb\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #13\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"eor x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btc eax, ebx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xbb\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl w20, w20, w6\",\n        \"eor w4, w4, w20\",\n        \"lsr w20, w4, w6\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btc [rax], ebx\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"0x0f 0xbb\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #29\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"eor x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btc rax, rbx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xbb\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"lsl x20, x20, x6\",\n        \"eor x4, x4, x20\",\n        \"lsr x20, x4, x6\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btc [rax], rbx\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": \"0x0f 0xbb\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"asr x21, x6, #3\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"ldrb w23, [x4, x21, sxtx]\",\n        \"eor x22, x23, x22\",\n        \"strb w22, [x4, x21, sxtx]\",\n        \"lsr w20, w23, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btc [rax], bx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #13\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldeoralb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btc [rax], ebx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"sbfx x21, x6, #3, #29\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldeoralb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btc [rax], rbx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xb3\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x6, #0, #3\",\n        \"asr x21, x6, #3\",\n        \"mov w22, #0x1\",\n        \"lsl x22, x22, x20\",\n        \"add x21, x4, x21\",\n        \"ldeoralb w22, w21, [x21]\",\n        \"lsr w20, w21, w20\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bsf ax, bx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xbc\",\n      \"ExpectedArm64ASM\": [\n        \"rbit w0, w6\",\n        \"clz w20, w0\",\n        \"tst w6, #0xffff\",\n        \"csel x20, x4, x20, eq\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"bsf eax, ebx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0f 0xbc\",\n      \"ExpectedArm64ASM\": [\n        \"rbit w0, w6\",\n        \"clz w20, w0\",\n        \"tst w6, w6\",\n        \"csel x4, x4, x20, eq\"\n      ]\n    },\n    \"bsf rax, rbx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0f 0xbc\",\n      \"ExpectedArm64ASM\": [\n        \"rbit x0, x6\",\n        \"clz x20, x0\",\n        \"tst x6, x6\",\n        \"csel x4, x4, x20, eq\"\n      ]\n    },\n    \"bsr ax, bx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xbd\",\n      \"ExpectedArm64ASM\": [\n        \"mov x0, #0xf\",\n        \"lsl w20, w6, #16\",\n        \"clz w20, w20\",\n        \"sub x20, x0, x20\",\n        \"tst w6, #0xffff\",\n        \"csel x20, x4, x20, eq\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"bsr eax, ebx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xbd\",\n      \"ExpectedArm64ASM\": [\n        \"mov x0, #0x1f\",\n        \"clz w20, w6\",\n        \"sub x20, x0, x20\",\n        \"tst w6, w6\",\n        \"csel x4, x4, x20, eq\"\n      ]\n    },\n    \"bsr rax, rbx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xbd\",\n      \"ExpectedArm64ASM\": [\n        \"mov x0, #0x3f\",\n        \"clz x20, x6\",\n        \"sub x20, x0, x20\",\n        \"tst x6, x6\",\n        \"csel x4, x4, x20, eq\"\n      ]\n    },\n    \"movsx ax, bl\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0xbe\",\n      \"ExpectedArm64ASM\": [\n        \"sxtb w20, w6\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"movsx ax, byte [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x0f 0xbe\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"sxtb w20, w20\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"movsx eax, bl\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xbe\",\n      \"ExpectedArm64ASM\": [\n        \"sxtb w4, w6\"\n      ]\n    },\n    \"movsx eax, byte [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0xbe\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"sxtb w4, w20\"\n      ]\n    },\n    \"movsx rax, bl\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xbe\",\n      \"ExpectedArm64ASM\": [\n        \"sxtb x4, w6\"\n      ]\n    },\n    \"movsx rax, byte [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0xbe\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"sxtb x4, w20\"\n      ]\n    },\n    \"movsx eax, bx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xbf\",\n      \"ExpectedArm64ASM\": [\n        \"sxth w4, w6\"\n      ]\n    },\n    \"movsx eax, word [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0xbf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth w4, w20\"\n      ]\n    },\n    \"movsx rax, bx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xbf\",\n      \"ExpectedArm64ASM\": [\n        \"sxth x4, w6\"\n      ]\n    },\n    \"movsx rax, word [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0xbf\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x4, w20\"\n      ]\n    },\n    \"xadd al, bl\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"0x0f 0xc0\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w4\",\n        \"uxtb w21, w6\",\n        \"eor x27, x20, x21\",\n        \"lsl w0, w20, #24\",\n        \"cmn w0, w21, lsl #24\",\n        \"add w26, w20, w21\",\n        \"bfxil x6, x20, #0, #8\",\n        \"bfxil x4, x26, #0, #8\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"xadd [rax], bl\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xc0\",\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w6\",\n        \"ldaddalb w20, w21, [x4]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #24\",\n        \"cmn w0, w20, lsl #24\",\n        \"add w26, w21, w20\",\n        \"bfxil x6, x21, #0, #8\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"xadd ax, bx\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w4\",\n        \"uxth w21, w6\",\n        \"eor x27, x20, x21\",\n        \"lsl w0, w20, #16\",\n        \"cmn w0, w21, lsl #16\",\n        \"add w26, w20, w21\",\n        \"bfxil x6, x20, #0, #16\",\n        \"bfxil x4, x26, #0, #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"xadd [rax], bx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"ldaddalh w20, w21, [x4]\",\n        \"eor x27, x21, x20\",\n        \"lsl w0, w21, #16\",\n        \"cmn w0, w20, lsl #16\",\n        \"add w26, w21, w20\",\n        \"bfxil x6, x21, #0, #16\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"xadd eax, ebx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w4\",\n        \"mov w21, w6\",\n        \"eor x27, x20, x21\",\n        \"adds w26, w20, w21\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"mov x6, x20\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xadd [rax], ebx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w6\",\n        \"ldaddal w20, w6, [x4]\",\n        \"eor x27, x6, x20\",\n        \"adds w26, w6, w20\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"xadd rax, rbx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"eor x27, x4, x6\",\n        \"adds x26, x4, x6\",\n        \"mrs x20, nzcv\",\n        \"eor w20, w20, #0x20000000\",\n        \"msr nzcv, x20\",\n        \"mov x6, x4\",\n        \"mov x4, x26\"\n      ]\n    },\n    \"xadd [rax], rbx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc1\",\n      \"ExpectedArm64ASM\": [\n        \"ldaddal x6, x20, [x4]\",\n        \"eor x27, x20, x6\",\n        \"adds x26, x20, x6\",\n        \"mrs x21, nzcv\",\n        \"eor w21, w21, #0x20000000\",\n        \"msr nzcv, x21\",\n        \"mov x6, x20\"\n      ]\n    },\n    \"cmpps xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmeq v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"cmpps xmm0, xmm1, 1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v16.4s, v17.4s, v16.4s\"\n      ]\n    },\n    \"cmpps xmm0, xmm1, 2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmge v16.4s, v17.4s, v16.4s\"\n      ]\n    },\n    \"cmpps xmm0, xmm1, 3\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmge v0.4s, v16.4s, v17.4s\",\n        \"fcmgt v1.4s, v17.4s, v16.4s\",\n        \"orr v16.16b, v0.16b, v1.16b\",\n        \"mvn v16.16b, v16.16b\"\n      ]\n    },\n    \"cmpps xmm0, xmm1, 4\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmeq v16.4s, v16.4s, v17.4s\",\n        \"mvn v16.16b, v16.16b\"\n      ]\n    },\n    \"cmpps xmm0, xmm1, 5\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v2.4s, v17.4s, v16.4s\",\n        \"mvn v16.16b, v2.16b\"\n      ]\n    },\n    \"cmpps xmm0, xmm1, 6\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmge v2.4s, v17.4s, v16.4s\",\n        \"mvn v16.16b, v2.16b\"\n      ]\n    },\n    \"cmpps xmm0, xmm1, 7\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmge v0.4s, v16.4s, v17.4s\",\n        \"fcmgt v1.4s, v17.4s, v16.4s\",\n        \"orr v16.16b, v0.16b, v1.16b\"\n      ]\n    },\n    \"movnti [rax], ebx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0xc3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w6\",\n        \"str w20, [x4]\"\n      ]\n    },\n    \"movnti [rax], rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xc3\",\n      \"ExpectedArm64ASM\": [\n        \"str x6, [x4]\"\n      ]\n    },\n    \"pinsrw mm0, eax, 0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"mov v2.h[0], w4\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pinsrw mm0, eax, 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"mov v2.h[1], w4\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pinsrw mm0, eax, 2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"mov v2.h[2], w4\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pinsrw mm0, eax, 3\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"mov v2.h[3], w4\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pinsrw mm0, eax, 4\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"mov v2.h[0], w4\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pinsrw mm0, [rax], 0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ld1 {v2.h}[0], [x4]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pinsrw mm0, [rax], 1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ld1 {v2.h}[1], [x4]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pinsrw mm0, [rax], 2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ld1 {v2.h}[2], [x4]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pinsrw mm0, [rax], 3\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ld1 {v2.h}[3], [x4]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pinsrw mm0, [rax], 4\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ld1 {v2.h}[0], [x4]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pextrw eax, mm0, 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"umov w4, v2.h[0]\"\n      ]\n    },\n    \"pextrw eax, mm0, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"umov w4, v2.h[1]\"\n      ]\n    },\n    \"pextrw eax, mm0, 2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"umov w4, v2.h[2]\"\n      ]\n    },\n    \"pextrw eax, mm0, 3\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"umov w4, v2.h[3]\"\n      ]\n    },\n    \"pextrw eax, mm0, 4\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"umov w4, v2.h[0]\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 01000100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Dst[63:0]    = Src1[63:0]\",\n        \"Dest[127:64] = Src2[63:0]\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 11101110b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Dst[63:0]    = Src1[127:64]\",\n        \"Dest[127:64] = Src2[127:64]\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 11100100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Dst[63:0]    = Src1[63:0]\",\n        \"Dest[127:64] = Src2[127:64]\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[1], v17.d[1]\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 01001110b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Dst[63:0]    = Src1[63:0]\",\n        \"Dest[127:64] = Src2[127:64]\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ext v16.16b, v16.16b, v17.16b, #8\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[0]\",\n        \"dup v3.4s, v17.s[0]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 00000101b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[1]\",\n        \"dup v3.4s, v17.s[0]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 00001010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[2]\",\n        \"dup v3.4s, v17.s[0]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 00001111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[3]\",\n        \"dup v3.4s, v17.s[0]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 01010000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[0]\",\n        \"dup v3.4s, v17.s[1]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 01010101b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[1]\",\n        \"dup v3.4s, v17.s[1]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 01011010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[2]\",\n        \"dup v3.4s, v17.s[1]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 01011111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[3]\",\n        \"dup v3.4s, v17.s[1]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 10100000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[0]\",\n        \"dup v3.4s, v17.s[2]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 10100101b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[1]\",\n        \"dup v3.4s, v17.s[2]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 10101010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[2]\",\n        \"dup v3.4s, v17.s[2]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 10101111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[3]\",\n        \"dup v3.4s, v17.s[2]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 11110000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[0]\",\n        \"dup v3.4s, v17.s[3]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 11110101b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[1]\",\n        \"dup v3.4s, v17.s[3]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 11111010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[2]\",\n        \"dup v3.4s, v17.s[3]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 11100000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Bottom elements duplicated, Top 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[0]\",\n        \"zip2 v16.2d, v2.2d, v17.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 11100101b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Bottom elements duplicated, Top 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[1]\",\n        \"zip2 v16.2d, v2.2d, v17.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 11101010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Bottom elements duplicated, Top 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[2]\",\n        \"zip2 v16.2d, v2.2d, v17.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 11101111b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Bottom elements duplicated, Top 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[3]\",\n        \"zip2 v16.2d, v2.2d, v17.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 01000000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Bottom elements duplicated, Top 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[0]\",\n        \"zip1 v16.2d, v2.2d, v17.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 01000101b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Bottom elements duplicated, Top 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[1]\",\n        \"zip1 v16.2d, v2.2d, v17.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 01001010b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Bottom elements duplicated, Top 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[2]\",\n        \"zip1 v16.2d, v2.2d, v17.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 01001111b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Bottom elements duplicated, Top 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[3]\",\n        \"zip1 v16.2d, v2.2d, v17.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Top elements duplicated, Bottom 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[0]\",\n        \"zip1 v16.2d, v16.2d, v2.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 01010100b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Top elements duplicated, Bottom 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[1]\",\n        \"zip1 v16.2d, v16.2d, v2.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 10100100b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Top elements duplicated, Bottom 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[2]\",\n        \"zip1 v16.2d, v16.2d, v2.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 11110100b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Top elements duplicated, Bottom 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[3]\",\n        \"zip1 v16.2d, v16.2d, v2.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 00001110b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Top elements duplicated, Top 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[0]\",\n        \"zip2 v16.2d, v16.2d, v2.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 01011110b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Top elements duplicated, Top 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[1]\",\n        \"zip2 v16.2d, v16.2d, v2.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 10101110b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Top elements duplicated, Top 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[2]\",\n        \"zip2 v16.2d, v16.2d, v2.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 11111110b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Top elements duplicated, Top 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[3]\",\n        \"zip2 v16.2d, v16.2d, v2.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 01000111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"odd elements inverted, Low 64-bits inserted\",\n        \"SRA quirks with RA fail to understand that v16 is dead\",\n        \"Could InsElement directly in to v16 but it does two moves instead\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov v2.s[0], v16.s[3]\",\n        \"zip1 v16.2d, v2.2d, v17.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 11100111b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"odd elements inverted, Top 64-bits inserted\",\n        \"SRA quirks with RA fail to understand that v16 is dead\",\n        \"Could InsElement directly in to v16 but it does two moves instead\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov v2.s[0], v16.s[3]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.d[1], v17.d[1]\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 11100001b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Lower 32-bit elements inverted, Top 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"rev64 v2.4s, v16.4s\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.d[1], v17.d[1]\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 01000001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Lower 32-bit elements inverted, Low 64-bits inserted\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"rev64 v2.4s, v16.4s\",\n        \"zip1 v16.2d, v2.2d, v17.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Duplicate selected element between each 64-bit segment\",\n        \"0x0f 0xc6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v16.s[3]\",\n        \"dup v3.4s, v17.s[3]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"shufps xmm0, [rax], 0\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0f 0xc6\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"dup v3.4s, v16.s[0]\",\n        \"dup v2.4s, v2.s[0]\",\n        \"zip1 v16.2d, v3.2d, v2.2d\"\n      ]\n    },\n    \"shufps xmm0, xmm1, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x0f 0xc6\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2688]\",\n        \"ldr q2, [x0, #16]\",\n        \"tbl v16.16b, {v16.16b, v17.16b}, v2.16b\"\n      ]\n    },\n    \"shufps xmm1, xmm0, 1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xc6\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2688]\",\n        \"ldr q2, [x0, #16]\",\n        \"mov v0.16b, v17.16b\",\n        \"mov v1.16b, v16.16b\",\n        \"tbl v17.16b, {v0.16b, v1.16b}, v2.16b\"\n      ]\n    },\n    \"shufps xmm0, [rax], 1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0xc6\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"ldr x0, [x28, #2688]\",\n        \"ldr q3, [x0, #16]\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"tbl v16.16b, {v0.16b, v1.16b}, v3.16b\"\n      ]\n    },\n    \"shufps xmm0, [rax], 0xFF\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x0f 0xc6\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"dup v3.4s, v16.s[3]\",\n        \"dup v2.4s, v2.s[3]\",\n        \"zip1 v16.2d, v3.2d, v2.2d\"\n      ]\n    },\n    \"bswap eax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xc8\",\n      \"ExpectedArm64ASM\": [\n        \"rev w4, w4\"\n      ]\n    },\n    \"bswap rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x0f 0xc8\",\n      \"ExpectedArm64ASM\": [\n        \"rev x4, x4\"\n      ]\n    },\n    \"psrlw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xd1\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"uqshl d0, d3, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.8h, v0.h[0]\",\n        \"neg v0.8h, v0.8h\",\n        \"ushl v2.8h, v2.8h, v0.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrld mm0, mm1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xd2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"uqshl d0, d3, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.4s, v0.s[0]\",\n        \"neg v0.4s, v0.4s\",\n        \"ushl v2.4s, v2.4s, v0.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrlq mm0, mm1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xd3\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"uqshl d0, d3, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.2d, v0.d[0]\",\n        \"neg v0.2d, v0.2d\",\n        \"ushl v2.2d, v2.2d, v0.2d\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"paddq mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xd4\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"add v2.2d, v3.2d, v2.2d\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pmullw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xd5\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"mul v2.8h, v3.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pmovmskb eax, mm0\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"0x0f 0xd7\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #3296]\",\n        \"cmlt v2.16b, v2.16b, #0\",\n        \"and v2.8b, v2.8b, v3.8b\",\n        \"addp v2.16b, v2.16b, v2.16b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"umov w4, v2.h[0]\"\n      ]\n    },\n    \"psubusb mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xd8\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"uqsub v2.16b, v3.16b, v2.16b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psubusw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xd9\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"uqsub v2.8h, v3.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pminub mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xda\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"umin v2.16b, v3.16b, v2.16b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pand mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xdb\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"and v2.8b, v3.8b, v2.8b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"paddusb mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xdc\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"uqadd v2.16b, v3.16b, v2.16b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"paddusw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xdd\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"uqadd v2.8h, v3.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pmaxub mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xde\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"umax v2.16b, v3.16b, v2.16b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pandn mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xdf\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"bic v2.8b, v2.8b, v3.8b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pavgb mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xe0\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"urhadd v2.16b, v3.16b, v2.16b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psraw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xe1\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"uqshl d0, d3, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.8h, v0.h[0]\",\n        \"neg v0.8h, v0.8h\",\n        \"sshl v2.8h, v2.8h, v0.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrad mm0, mm1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xe2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"uqshl d0, d3, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.4s, v0.s[0]\",\n        \"neg v0.4s, v0.4s\",\n        \"sshl v2.4s, v2.4s, v0.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pavgw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xe3\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"urhadd v2.8h, v3.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pmulhuw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xe4\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"umull v2.4s, v2.4h, v3.4h\",\n        \"shrn v2.4h, v2.4s, #16\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pmulhw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xe5\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"smull v2.4s, v2.4h, v3.4h\",\n        \"shrn v2.4h, v2.4s, #16\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"movntq [rax], mm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0xe7\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"str d2, [x4]\"\n      ]\n    },\n    \"psubsb mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xe8\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"sqsub v2.16b, v3.16b, v2.16b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psubsw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xe9\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"sqsub v2.8h, v3.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pminsw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xea\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"smin v2.8h, v3.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"por mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xeb\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"orr v2.8b, v3.8b, v2.8b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"paddsb mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xec\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"sqadd v2.16b, v3.16b, v2.16b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"paddsw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xed\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"sqadd v2.8h, v3.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pmaxsw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xee\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"smax v2.8h, v3.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pxor mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xef\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"eor v2.8b, v3.8b, v2.8b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pxor mm0, mm0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x0f 0xef\",\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psllw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"0x0f 0xf1\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"uqshl d0, d3, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.8h, v0.h[0]\",\n        \"ushl v2.8h, v2.8h, v0.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pslld mm0, mm1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"0x0f 0xf2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"uqshl d0, d3, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.4s, v0.s[0]\",\n        \"ushl v2.4s, v2.4s, v0.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psllq mm0, mm1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"0x0f 0xf3\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"uqshl d0, d3, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.2d, v0.d[0]\",\n        \"ushl v2.2d, v2.2d, v0.2d\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pmuludq mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xf4\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"umull v2.2d, v2.2s, v3.2s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pmaddwd mm0, mm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xf5\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"smull v2.4s, v2.4h, v3.4h\",\n        \"addp v2.4s, v2.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psadbw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xf6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"uabdl v2.8h, v2.8b, v3.8b\",\n        \"addv h2, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"maskmovq mm0, mm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0x0f 0xf7\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"cmlt v2.16b, v2.16b, #0\",\n        \"ldr d3, [x28, #1056]\",\n        \"ldr d4, [x11]\",\n        \"bsl v2.8b, v3.8b, v4.8b\",\n        \"str d2, [x11]\"\n      ]\n    },\n    \"psubb mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xf8\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"sub v2.16b, v3.16b, v2.16b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psubw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xf9\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"sub v2.8h, v3.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psubd mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xfa\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"sub v2.4s, v3.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psubq mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xfb\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"sub v2.2d, v3.2d, v2.2d\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"paddb mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xfc\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"add v2.16b, v3.16b, v2.16b\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"paddw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xfd\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"add v2.8h, v3.8h, v2.8h\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"paddd mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xfe\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1072]\",\n        \"ldr d3, [x28, #1056]\",\n        \"add v2.4s, v3.4s, v2.4s\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/SecondaryGroup.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"RNG\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ]\n  },\n  \"Instructions\": {\n    \"sgdt [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP7 0x0F 0x1 /0\",\n      \"ExpectedArm64ASM\": [\n        \"strh wzr, [x4]\",\n        \"mov x20, #0xfffffffffffe0000\",\n        \"stur x20, [x4, #2]\"\n      ]\n    },\n    \"bt ax, 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /4\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bt eax, 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /4\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bt rax, 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /4\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bt ax, 15\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /4\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #15, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bt eax, 31\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /4\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #31, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bt rax, 63\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /4\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x20, x4, #63\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bt word [rax], 0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bt dword [rax], 0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bt qword [rax], 0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bt word [rax], 15\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #1]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bt dword [rax], 31\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #3]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bt qword [rax], 63\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #7]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bts ax, 0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP8 0x0F 0xBA /5\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"orr w20, w4, #0x1\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bts eax, 0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /5\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"orr w4, w4, #0x1\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bts rax, 0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /5\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"orr x4, x4, #0x1\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bts ax, 15\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP8 0x0F 0xBA /5\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #15, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"orr w20, w4, #0x8000\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bts eax, 31\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /5\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #31, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"orr w4, w4, #0x80000000\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bts rax, 63\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /5\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x20, x4, #63\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"orr x4, x4, #0x8000000000000000\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"bts word [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"orr x21, x20, #0x1\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bts dword [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"orr x21, x20, #0x1\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bts qword [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"orr x21, x20, #0x1\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bts word [rax], 15\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #1]\",\n        \"orr x21, x20, #0x80\",\n        \"strb w21, [x4, #1]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bts dword [rax], 31\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #3]\",\n        \"orr x21, x20, #0x80\",\n        \"strb w21, [x4, #3]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bts qword [rax], 63\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #7]\",\n        \"orr x21, x20, #0x80\",\n        \"strb w21, [x4, #7]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock bts word [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldsetalb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock bts dword [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldsetalb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock bts qword [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldsetalb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock bts word [rax], 15\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x1 (1)\",\n        \"ldsetalb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock bts dword [rax], 31\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x3 (3)\",\n        \"ldsetalb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock bts qword [rax], 63\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x7 (7)\",\n        \"ldsetalb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btr ax, 0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"and w20, w4, #0xfffffffe\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"btr eax, 0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"and w4, w4, #0xfffffffe\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"btr rax, 0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"and x4, x4, #0xfffffffffffffffe\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"btr ax, 15\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #15, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"and w20, w4, #0xffff7fff\",\n        \"bfxil x4, x20, #0, #16\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"btr eax, 31\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #31, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"and w4, w4, #0x7fffffff\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"btr rax, 63\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"lsr x20, x4, #63\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"and x4, x4, #0x7fffffffffffffff\",\n        \"eor w20, w21, #0x20000000\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"btr word [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"and x21, x20, #0xfffffffffffffffe\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btr dword [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"and x21, x20, #0xfffffffffffffffe\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btr qword [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"and x21, x20, #0xfffffffffffffffe\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btr word [rax], 15\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #1]\",\n        \"and x21, x20, #0xffffffffffffff7f\",\n        \"strb w21, [x4, #1]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btr dword [rax], 31\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #3]\",\n        \"and x21, x20, #0xffffffffffffff7f\",\n        \"strb w21, [x4, #3]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btr qword [rax], 63\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #7]\",\n        \"and x21, x20, #0xffffffffffffff7f\",\n        \"strb w21, [x4, #7]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btr word [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldclralb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btr dword [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldclralb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btr qword [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldclralb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btr word [rax], 15\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x1 (1)\",\n        \"ldclralb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btr dword [rax], 31\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x3 (3)\",\n        \"ldclralb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btr qword [rax], 63\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x7 (7)\",\n        \"ldclralb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btc ax, 0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /7\",\n      \"ExpectedArm64ASM\": [\n        \"eor w20, w4, #0x1\",\n        \"ubfx x21, x20, #0, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"bfxil x4, x20, #0, #16\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"btc eax, 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /7\",\n      \"ExpectedArm64ASM\": [\n        \"eor w4, w4, #0x1\",\n        \"ubfx x20, x4, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btc rax, 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /7\",\n      \"ExpectedArm64ASM\": [\n        \"eor x4, x4, #0x1\",\n        \"ubfx x20, x4, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btc ax, 15\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"GROUP8 0x0F 0xBA /7\",\n      \"ExpectedArm64ASM\": [\n        \"eor w20, w4, #0x8000\",\n        \"ubfx x21, x20, #15, #1\",\n        \"mrs x22, nzcv\",\n        \"bfi w22, w21, #29, #1\",\n        \"bfxil x4, x20, #0, #16\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"btc eax, 31\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /7\",\n      \"ExpectedArm64ASM\": [\n        \"eor w4, w4, #0x80000000\",\n        \"ubfx x20, x4, #31, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btc rax, 63\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"GROUP8 0x0F 0xBA /7\",\n      \"ExpectedArm64ASM\": [\n        \"eor x4, x4, #0x8000000000000000\",\n        \"lsr x20, x4, #63\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btc word [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"eor x21, x20, #0x1\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btc dword [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"eor x21, x20, #0x1\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btc qword [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4]\",\n        \"eor x21, x20, #0x1\",\n        \"strb w21, [x4]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btc word [rax], 15\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #1]\",\n        \"eor x21, x20, #0x80\",\n        \"strb w21, [x4, #1]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btc dword [rax], 31\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #3]\",\n        \"eor x21, x20, #0x80\",\n        \"strb w21, [x4, #3]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"btc qword [rax], 63\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x4, #7]\",\n        \"eor x21, x20, #0x80\",\n        \"strb w21, [x4, #7]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btc word [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldeoralb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btc dword [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldeoralb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btc qword [rax], 0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x1\",\n        \"add x21, x4, #0x0 (0)\",\n        \"ldeoralb w20, w20, [x21]\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btc word [rax], 15\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x1 (1)\",\n        \"ldeoralb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btc dword [rax], 31\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x3 (3)\",\n        \"ldeoralb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lock btc qword [rax], 63\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP8 0x0F 0xBA /6\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80\",\n        \"add x21, x4, #0x7 (7)\",\n        \"ldeoralb w20, w20, [x21]\",\n        \"lsr w20, w20, #7\",\n        \"eor x20, x20, #0x1\",\n        \"ubfx x20, x20, #0, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"cmpxchg8b [rbp]\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"mov x21, x5\",\n        \"caspal w20, w21, w6, w7, [x9]\",\n        \"mrs x0, nzcv\",\n        \"cmp w20, w4\",\n        \"ccmp w21, w5, #nzcv, eq\",\n        \"cset w1, eq\",\n        \"bfi w0, w1, #30, #1\",\n        \"msr nzcv, x0\",\n        \"csel x4, x20, x4, ne\",\n        \"csel x5, x21, x5, ne\"\n      ]\n    },\n    \"cmpxchg16b [rbp]\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /1\",\n      \"ExpectedArm64ASM\": [\n        \"mov x20, x4\",\n        \"mov x21, x5\",\n        \"caspal x20, x21, x6, x7, [x9]\",\n        \"mrs x0, nzcv\",\n        \"cmp x20, x4\",\n        \"ccmp x21, x5, #nzcv, eq\",\n        \"cset w1, eq\",\n        \"bfi w0, w1, #30, #1\",\n        \"msr nzcv, x0\",\n        \"csel x4, x20, x4, ne\",\n        \"csel x5, x21, x5, ne\"\n      ]\n    },\n    \"rdrand ax\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, rndr\",\n        \"bfxil x4, x20, #0, #16\",\n        \"cset x20, eq\",\n        \"mov w26, #0x1\",\n        \"mov w27, #0x0\",\n        \"mov w0, w27\",\n        \"bfi w0, w20, #29, #1\",\n        \"mov w20, w0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"rdrand eax\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, rndr\",\n        \"mov w4, w20\",\n        \"cset x20, eq\",\n        \"mov w26, #0x1\",\n        \"mov w27, #0x0\",\n        \"mov w0, w27\",\n        \"bfi w0, w20, #29, #1\",\n        \"mov w20, w0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"rdrand rax\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x4, rndr\",\n        \"cset x20, eq\",\n        \"mov w26, #0x1\",\n        \"mov w27, #0x0\",\n        \"mov w0, w27\",\n        \"bfi w0, w20, #29, #1\",\n        \"mov w20, w0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"rdseed ax\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, rndrrs\",\n        \"bfxil x4, x20, #0, #16\",\n        \"cset x20, eq\",\n        \"mov w26, #0x1\",\n        \"mov w27, #0x0\",\n        \"mov w0, w27\",\n        \"bfi w0, w20, #29, #1\",\n        \"mov w20, w0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"rdseed eax\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, rndrrs\",\n        \"mov w4, w20\",\n        \"cset x20, eq\",\n        \"mov w26, #0x1\",\n        \"mov w27, #0x0\",\n        \"mov w0, w27\",\n        \"bfi w0, w20, #29, #1\",\n        \"mov w20, w0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"rdseed rax\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"GROUP9 0x0F 0xC7 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x4, rndrrs\",\n        \"cset x20, eq\",\n        \"mov w26, #0x1\",\n        \"mov w27, #0x0\",\n        \"mov w0, w27\",\n        \"bfi w0, w20, #29, #1\",\n        \"mov w20, w0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"rdpid eax\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": \"GROUP9 0xF3 0x0F 0xC7 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x0, nzcv\",\n        \"str w0, [x28, #1032]\",\n        \"str x25, [x28, #176]\",\n        \"str x8, [x28, #64]\",\n        \"mov w0, #0x100\",\n        \"str x0, [x28, #1480]\",\n        \"sub sp, sp, #0x10 (16)\",\n        \"mov w8, #0xa8\",\n        \"mov x0, sp\",\n        \"add x1, sp, #0x4 (4)\",\n        \"svc #0x0\",\n        \"ldp w0, w1, [sp]\",\n        \"sub sp, sp, #0x10 (16)\",\n        \"ldr x25, [x28, #176]\",\n        \"ldr w8, [x28, #1032]\",\n        \"msr nzcv, x8\",\n        \"ldr x8, [x28, #64]\",\n        \"str xzr, [x28, #1480]\",\n        \"orr x20, x0, x1, lsl #12\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"rdpid rax\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": \"GROUP9 0xF3 0x0F 0xC7 /7\",\n      \"ExpectedArm64ASM\": [\n        \"mrs x0, nzcv\",\n        \"str w0, [x28, #1032]\",\n        \"str x25, [x28, #176]\",\n        \"str x8, [x28, #64]\",\n        \"mov w0, #0x100\",\n        \"str x0, [x28, #1480]\",\n        \"sub sp, sp, #0x10 (16)\",\n        \"mov w8, #0xa8\",\n        \"mov x0, sp\",\n        \"add x1, sp, #0x4 (4)\",\n        \"svc #0x0\",\n        \"ldp w0, w1, [sp]\",\n        \"sub sp, sp, #0x10 (16)\",\n        \"ldr x25, [x28, #176]\",\n        \"ldr w8, [x28, #1032]\",\n        \"msr nzcv, x8\",\n        \"ldr x8, [x28, #64]\",\n        \"str xzr, [x28, #1480]\",\n        \"orr x20, x0, x1, lsl #12\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"psrlw mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrlw mm0, 15\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ushr v2.8h, v2.8h, #15\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrlw mm0, 16\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"movi v2.2d, #0x0\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrlw xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrlw xmm0, 15\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"ushr v16.8h, v16.8h, #15\"\n      ]\n    },\n    \"psrlw xmm0, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"psraw mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psraw mm0, 15\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"sshr v2.8h, v2.8h, #15\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psraw mm0, 16\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"sshr v2.8h, v2.8h, #15\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psraw xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psraw xmm0, 15\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.8h, v16.8h, #15\"\n      ]\n    },\n    \"psraw xmm0, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.8h, v16.8h, #15\"\n      ]\n    },\n    \"psllw mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psllw mm0, 15\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"shl v2.8h, v2.8h, #15\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psllw mm0, 16\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"movi v2.2d, #0x0\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psllw xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psllw xmm0, 15\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"shl v16.8h, v16.8h, #15\"\n      ]\n    },\n    \"psllw xmm0, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP12 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"psrld mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrld mm0, 31\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ushr v2.4s, v2.4s, #31\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrld mm0, 32\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"movi v2.2d, #0x0\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrld xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrld xmm0, 31\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"ushr v16.4s, v16.4s, #31\"\n      ]\n    },\n    \"psrld xmm0, 32\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"psrad mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrad mm0, 31\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"sshr v2.4s, v2.4s, #31\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrad mm0, 32\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"sshr v2.4s, v2.4s, #31\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrad xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrad xmm0, 31\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.4s, v16.4s, #31\"\n      ]\n    },\n    \"psrad xmm0, 32\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.4s, v16.4s, #31\"\n      ]\n    },\n    \"pslld mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"pslld mm0, 31\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"shl v2.4s, v2.4s, #31\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pslld mm0, 32\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"movi v2.2d, #0x0\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pslld xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"pslld xmm0, 31\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"shl v16.4s, v16.4s, #31\"\n      ]\n    },\n    \"pslld xmm0, 32\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP13 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"psrlq mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrlq mm0, 63\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ushr v2.2d, v2.2d, #63\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrlq mm0, 64\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"movi v2.2d, #0x0\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrlq xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrlq xmm0, 63\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"ushr v16.2d, v16.2d, #63\"\n      ]\n    },\n    \"psrlq xmm0, 64\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /2\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"psrldq xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psrldq xmm0, 15\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ext v16.16b, v16.16b, v2.16b, #15\"\n      ]\n    },\n    \"psrldq xmm0, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /3\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"psllq mm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psllq mm0, 63\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"shl v2.2d, v2.2d, #63\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psllq mm0, 64\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Type\": \"MMX\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"movi v2.2d, #0x0\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psllq xmm0, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"psllq xmm0, 63\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"shl v16.2d, v16.2d, #63\"\n      ]\n    },\n    \"psllq xmm0, 64\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Type\": \"SSE\",\n      \"Comment\": \"GROUP14 0x0F 0xC7 /6\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"fxsave [rax]\": {\n      \"ExpectedInstructionCount\": 68,\n      \"Comment\": \"GROUP15 0x0F 0xAE /0\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #1200]\",\n        \"strh w20, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"strh w20, [x4, #2]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"strb w20, [x4, #4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #32]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #48]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #64]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #80]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #96]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #112]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #128]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #144]\",\n        \"stp q16, q17, [x4, #160]\",\n        \"stp q18, q19, [x4, #192]\",\n        \"stp q20, q21, [x4, #224]\",\n        \"stp q22, q23, [x4, #256]\",\n        \"stp q24, q25, [x4, #288]\",\n        \"stp q26, q27, [x4, #320]\",\n        \"stp q28, q29, [x4, #352]\",\n        \"stp q30, q31, [x4, #384]\",\n        \"ldr w20, [x28, #972]\",\n        \"and w20, w20, #0xffc0\",\n        \"mov w21, #0xffff\",\n        \"stp w20, w21, [x4, #24]\"\n      ]\n    },\n    \"rdfsbase eax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /0\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x28, #1000]\"\n      ]\n    },\n    \"rdfsbase rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /0\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x4, [x28, #1000]\"\n      ]\n    },\n    \"fxrstor [rax]\": {\n      \"ExpectedInstructionCount\": 48,\n      \"Comment\": \"GROUP15 0x0F 0xAE /1\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"strh w20, [x28, #1200]\",\n        \"ldrh w20, [x4, #2]\",\n        \"ubfx w21, w20, #11, #3\",\n        \"strb w21, [x28, #1051]\",\n        \"ubfx w21, w20, #8, #1\",\n        \"ubfx w22, w20, #9, #1\",\n        \"ubfx w23, w20, #10, #1\",\n        \"ubfx w24, w20, #14, #1\",\n        \"ubfx w20, w20, #0, #1\",\n        \"strb w21, [x28, #1048]\",\n        \"strb w22, [x28, #1049]\",\n        \"strb w23, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\",\n        \"ldrb w20, [x4, #4]\",\n        \"strb w20, [x28, #1202]\",\n        \"ldp q2, q3, [x4, #32]\",\n        \"str q2, [x28, #1056]\",\n        \"str q3, [x28, #1072]\",\n        \"ldp q2, q3, [x4, #64]\",\n        \"str q2, [x28, #1088]\",\n        \"str q3, [x28, #1104]\",\n        \"ldp q2, q3, [x4, #96]\",\n        \"str q2, [x28, #1120]\",\n        \"str q3, [x28, #1136]\",\n        \"ldp q2, q3, [x4, #128]\",\n        \"str q2, [x28, #1152]\",\n        \"str q3, [x28, #1168]\",\n        \"ldp q16, q17, [x4, #160]\",\n        \"ldp q18, q19, [x4, #192]\",\n        \"ldp q20, q21, [x4, #224]\",\n        \"ldp q22, q23, [x4, #256]\",\n        \"ldp q24, q25, [x4, #288]\",\n        \"ldp q26, q27, [x4, #320]\",\n        \"ldp q28, q29, [x4, #352]\",\n        \"ldp q30, q31, [x4, #384]\",\n        \"ldr w20, [x4, #24]\",\n        \"and w20, w20, #0xffc0\",\n        \"str w20, [x28, #972]\",\n        \"ubfx w21, w20, #13, #3\",\n        \"rbit w1, w21\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x21, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\"\n      ]\n    },\n    \"rdgsbase eax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /1\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w4, [x28, #992]\"\n      ]\n    },\n    \"rdgsbase rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /1\",\n      \"ExpectedArm64ASM\": [\n        \"ldr x4, [x28, #992]\"\n      ]\n    },\n    \"ldmxcsr [rax]\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": \"GROUP15 0x0F 0xAE /2\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"and w20, w20, #0xffc0\",\n        \"str w20, [x28, #972]\",\n        \"ubfx w21, w20, #13, #3\",\n        \"rbit w1, w21\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x21, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\"\n      ]\n    },\n    \"wrfsbase eax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP15 0x0F 0xAE /2\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w4\",\n        \"str x20, [x28, #1000]\"\n      ]\n    },\n    \"wrfsbase rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /2\",\n      \"ExpectedArm64ASM\": [\n        \"str x4, [x28, #1000]\"\n      ]\n    },\n    \"stmxcsr [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"GROUP15 0x0F 0xAE /3\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x28, #972]\",\n        \"and w20, w20, #0xffc0\",\n        \"str w20, [x4]\"\n      ]\n    },\n    \"wrgsbase eax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP15 0x0F 0xAE /3\",\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w4\",\n        \"str x20, [x28, #992]\"\n      ]\n    },\n    \"wrgsbase rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /3\",\n      \"ExpectedArm64ASM\": [\n        \"str x4, [x28, #992]\"\n      ]\n    },\n    \"xsave [rax]\": {\n      \"ExpectedInstructionCount\": 98,\n      \"Comment\": \"GROUP15 0x0F 0xAE /4\",\n      \"ExpectedArm64ASM\": [\n        \"ubfx x20, x4, #0, #1\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0xe4\",\n        \"ldrh w20, [x28, #1200]\",\n        \"strh w20, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"strh w20, [x4, #2]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"strb w20, [x4, #4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #32]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #48]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #64]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #80]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #96]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #112]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #128]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #144]\",\n        \"ubfx x20, x4, #1, #1\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x24\",\n        \"stp q16, q17, [x4, #160]\",\n        \"stp q18, q19, [x4, #192]\",\n        \"stp q20, q21, [x4, #224]\",\n        \"stp q22, q23, [x4, #256]\",\n        \"stp q24, q25, [x4, #288]\",\n        \"stp q26, q27, [x4, #320]\",\n        \"stp q28, q29, [x4, #352]\",\n        \"stp q30, q31, [x4, #384]\",\n        \"ubfx x20, x4, #2, #1\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x44\",\n        \"ldp q2, q3, [x28, #192]\",\n        \"stp q2, q3, [x4, #576]\",\n        \"ldp q2, q3, [x28, #224]\",\n        \"stp q2, q3, [x4, #608]\",\n        \"ldp q2, q3, [x28, #256]\",\n        \"stp q2, q3, [x4, #640]\",\n        \"ldp q2, q3, [x28, #288]\",\n        \"stp q2, q3, [x4, #672]\",\n        \"ldp q2, q3, [x28, #320]\",\n        \"stp q2, q3, [x4, #704]\",\n        \"ldp q2, q3, [x28, #352]\",\n        \"stp q2, q3, [x4, #736]\",\n        \"ldp q2, q3, [x28, #384]\",\n        \"stp q2, q3, [x4, #768]\",\n        \"ldp q2, q3, [x28, #416]\",\n        \"stp q2, q3, [x4, #800]\",\n        \"ubfx x20, x4, #1, #2\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x14\",\n        \"ldr w20, [x28, #972]\",\n        \"and w20, w20, #0xffc0\",\n        \"mov w21, #0xffff\",\n        \"stp w20, w21, [x4, #24]\",\n        \"ubfx x20, x4, #0, #3\",\n        \"str x20, [x4, #512]\"\n      ]\n    },\n    \"lfence\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /5\",\n      \"ExpectedArm64ASM\": [\n        \"dmb ld\"\n      ]\n    },\n    \"xrstor [rax]\": {\n      \"ExpectedInstructionCount\": 133,\n      \"Comment\": \"GROUP15 0x0F 0xAE /5\",\n      \"ExpectedArm64ASM\": [\n        \"sub sp, sp, #0x40 (64)\",\n        \"ldr x20, [x4, #512]\",\n        \"ubfx x20, x20, #0, #1\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x7c\",\n        \"ldrh w20, [x4]\",\n        \"strh w20, [x28, #1200]\",\n        \"ldrh w20, [x4, #2]\",\n        \"ubfx w21, w20, #11, #3\",\n        \"strb w21, [x28, #1051]\",\n        \"ubfx w21, w20, #8, #1\",\n        \"ubfx w22, w20, #9, #1\",\n        \"ubfx w23, w20, #10, #1\",\n        \"ubfx w24, w20, #14, #1\",\n        \"ubfx w20, w20, #0, #1\",\n        \"strb w21, [x28, #1048]\",\n        \"strb w22, [x28, #1049]\",\n        \"strb w23, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\",\n        \"ldrb w20, [x4, #4]\",\n        \"strb w20, [x28, #1202]\",\n        \"ldp q2, q3, [x4, #32]\",\n        \"str q2, [x28, #1056]\",\n        \"str q3, [x28, #1072]\",\n        \"ldp q2, q3, [x4, #64]\",\n        \"str q2, [x28, #1088]\",\n        \"str q3, [x28, #1104]\",\n        \"ldp q2, q3, [x4, #96]\",\n        \"str q2, [x28, #1120]\",\n        \"str q3, [x28, #1136]\",\n        \"ldp q2, q3, [x4, #128]\",\n        \"str q2, [x28, #1152]\",\n        \"str q3, [x28, #1168]\",\n        \"b #+0x4c\",\n        \"mov w20, #0x37f\",\n        \"strh w20, [x28, #1200]\",\n        \"strb wzr, [x28, #1051]\",\n        \"strb wzr, [x28, #1202]\",\n        \"strb wzr, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb wzr, [x28, #1054]\",\n        \"strb wzr, [x28, #1040]\",\n        \"movi v2.2d, #0x0\",\n        \"str q2, [x28, #1056]\",\n        \"str q2, [x28, #1072]\",\n        \"str q2, [x28, #1088]\",\n        \"str q2, [x28, #1104]\",\n        \"str q2, [x28, #1120]\",\n        \"str q2, [x28, #1136]\",\n        \"str q2, [x28, #1152]\",\n        \"str q2, [x28, #1168]\",\n        \"ldr x20, [x4, #512]\",\n        \"ubfx x20, x20, #1, #1\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x28\",\n        \"ldp q16, q17, [x4, #160]\",\n        \"ldp q18, q19, [x4, #192]\",\n        \"ldp q20, q21, [x4, #224]\",\n        \"ldp q22, q23, [x4, #256]\",\n        \"ldp q24, q25, [x4, #288]\",\n        \"ldp q26, q27, [x4, #320]\",\n        \"ldp q28, q29, [x4, #352]\",\n        \"ldp q30, q31, [x4, #384]\",\n        \"b #+0x44\",\n        \"movi v31.2d, #0x0\",\n        \"mov v30.16b, v31.16b\",\n        \"mov v29.16b, v31.16b\",\n        \"mov v28.16b, v31.16b\",\n        \"mov v27.16b, v31.16b\",\n        \"mov v26.16b, v31.16b\",\n        \"mov v25.16b, v31.16b\",\n        \"mov v24.16b, v31.16b\",\n        \"mov v23.16b, v31.16b\",\n        \"mov v22.16b, v31.16b\",\n        \"mov v21.16b, v31.16b\",\n        \"mov v20.16b, v31.16b\",\n        \"mov v19.16b, v31.16b\",\n        \"mov v18.16b, v31.16b\",\n        \"mov v17.16b, v31.16b\",\n        \"mov v16.16b, v31.16b\",\n        \"ldr x20, [x4, #512]\",\n        \"ubfx x20, x20, #2, #1\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x58\",\n        \"ldp q2, q3, [x4, #576]\",\n        \"ldp q4, q5, [x4, #608]\",\n        \"ldp q6, q7, [x4, #640]\",\n        \"ldp q8, q9, [x4, #672]\",\n        \"ldp q10, q11, [x4, #704]\",\n        \"ldp q12, q13, [x4, #736]\",\n        \"ldp q14, q15, [x4, #768]\",\n        \"str q2, [sp]\",\n        \"str q3, [sp, #32]\",\n        \"ldp q2, q3, [x4, #800]\",\n        \"stp q2, q3, [x28, #416]\",\n        \"stp q14, q15, [x28, #384]\",\n        \"stp q12, q13, [x28, #352]\",\n        \"stp q10, q11, [x28, #320]\",\n        \"stp q8, q9, [x28, #288]\",\n        \"stp q6, q7, [x28, #256]\",\n        \"stp q4, q5, [x28, #224]\",\n        \"ldr q2, [sp]\",\n        \"ldr q3, [sp, #32]\",\n        \"stp q2, q3, [x28, #192]\",\n        \"b #+0x28\",\n        \"movi v2.2d, #0x0\",\n        \"stp q2, q2, [x28, #416]\",\n        \"stp q2, q2, [x28, #384]\",\n        \"stp q2, q2, [x28, #352]\",\n        \"stp q2, q2, [x28, #320]\",\n        \"stp q2, q2, [x28, #288]\",\n        \"stp q2, q2, [x28, #256]\",\n        \"stp q2, q2, [x28, #224]\",\n        \"stp q2, q2, [x28, #192]\",\n        \"ldr x20, [x4, #512]\",\n        \"ubfx x20, x20, #1, #2\",\n        \"cbnz x20, #+0x8\",\n        \"b #+0x34\",\n        \"ldr w20, [x4, #24]\",\n        \"and w20, w20, #0xffc0\",\n        \"str w20, [x28, #972]\",\n        \"ubfx w21, w20, #13, #3\",\n        \"rbit w1, w21\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x21, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\",\n        \"b #+0x4\",\n        \"add sp, sp, #0x40 (64)\"\n      ]\n    },\n    \"mfence\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /6\",\n      \"ExpectedArm64ASM\": [\n        \"dmb sy\"\n      ]\n    },\n    \"clwb [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /6\",\n      \"ExpectedArm64ASM\": [\n        \"dc cvac, x4\"\n      ]\n    },\n    \"sfence\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /7\",\n      \"ExpectedArm64ASM\": [\n        \"dmb st\"\n      ]\n    },\n    \"clflush [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"GROUP15 0x0F 0xAE /7\",\n      \"ExpectedArm64ASM\": [\n        \"dc civac, x4\",\n        \"dsb ish\"\n      ]\n    },\n    \"clflushopt [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"GROUP15 0x0F 0xAE /7\",\n      \"ExpectedArm64ASM\": [\n        \"dc civac, x4\"\n      ]\n    },\n    \"prefetchnta [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"GROUP16 0x0F 0x18 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"prfm pldl1strm, [x4]\"\n      ]\n    },\n    \"prefetcht0 [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"GROUP16 0x0F 0x18 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"prfm pldl1keep, [x4]\"\n      ]\n    },\n    \"prefetcht1 [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"GROUP16 0x0F 0x18 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"prfm pldl2keep, [x4]\"\n      ]\n    },\n    \"prefetcht2 [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"GROUP16 0x0F 0x18 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"prfm pldl3keep, [x4]\"\n      ]\n    },\n    \"db 0x0f, 0x18, 0x20;\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"GROUP16 0x0F 0x18 /4\",\n        \"nop dword [rax]\",\n        \"NOP implementation\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"db 0x0f, 0x0d, 0x00\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"GROUPP 0x0F 0x0D /0\",\n        \"prefetch_exclusive [rax]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"prfm pldl1keep, [x4]\"\n      ]\n    },\n    \"prefetchw [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"GROUPP 0x0F 0x0D /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"prfm pstl1keep, [x4]\"\n      ]\n    },\n    \"prefetchwt1 [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"GROUPP 0x0F 0x0D /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"prfm pstl1keep, [x4]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/SecondaryModRM.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"CLZERO\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ]\n  },\n  \"Instructions\": {\n    \"xgetbv\": {\n      \"ExpectedInstructionCount\": 52,\n      \"Comment\": \"0xF 0x01 /2 RM-0\",\n      \"ExpectedArm64ASM\": [\n        \"sub sp, sp, #0xf0 (240)\",\n        \"mov x3, sp\",\n        \"st1 {v2.2d, v3.2d}, [x3], #32\",\n        \"st1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x3], #64\",\n        \"st1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x3], #64\",\n        \"st1 {v12.2d, v13.2d, v14.2d, v15.2d}, [x3], #64\",\n        \"stp x18, x30, [x3], #16\",\n        \"mrs x3, nzcv\",\n        \"str w3, [x28, #1032]\",\n        \"str x25, [x28, #176]\",\n        \"stp x4, x7, [x28, #32]\",\n        \"stp x5, x6, [x28, #48]\",\n        \"stp x8, x9, [x28, #64]\",\n        \"stp x10, x11, [x28, #80]\",\n        \"stp x12, x13, [x28, #96]\",\n        \"stp x14, x15, [x28, #112]\",\n        \"stp x16, x17, [x28, #128]\",\n        \"stp x19, x29, [x28, #144]\",\n        \"stp w26, w27, [x28, #16]\",\n        \"add x3, x28, #0x1c0 (448)\",\n        \"st1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x3], #64\",\n        \"st1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x3], #64\",\n        \"st1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x3], #64\",\n        \"st1 {v28.2d, v29.2d, v30.2d, v31.2d}, [x3], #64\",\n        \"mov w1, w7\",\n        \"ldr x0, [x28, #1544]\",\n        \"ldr x2, [x28, #1560]\",\n        \"blr x2\",\n        \"ldr x25, [x28, #176]\",\n        \"ldr w4, [x28, #1032]\",\n        \"msr nzcv, x4\",\n        \"add x4, x28, #0x1c0 (448)\",\n        \"ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x4], #64\",\n        \"ld1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x4], #64\",\n        \"ld1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x4], #64\",\n        \"ld1 {v28.2d, v29.2d, v30.2d, v31.2d}, [x4], #64\",\n        \"ldp x4, x7, [x28, #32]\",\n        \"ldp x5, x6, [x28, #48]\",\n        \"ldp x8, x9, [x28, #64]\",\n        \"ldp x10, x11, [x28, #80]\",\n        \"ldp x12, x13, [x28, #96]\",\n        \"ldp x14, x15, [x28, #112]\",\n        \"ldp x16, x17, [x28, #128]\",\n        \"ldp x19, x29, [x28, #144]\",\n        \"ldp w26, w27, [x28, #16]\",\n        \"ld1 {v2.2d, v3.2d}, [sp], #32\",\n        \"ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [sp], #64\",\n        \"ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [sp], #64\",\n        \"ld1 {v12.2d, v13.2d, v14.2d, v15.2d}, [sp], #64\",\n        \"ldp x18, x30, [sp], #16\",\n        \"mov w4, w0\",\n        \"lsr x5, x0, #32\"\n      ]\n    },\n    \"rdtscp\": {\n      \"Skip\": \"Yes\",\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": \"0xF 0x01 /7 RM-1\",\n      \"ExpectedArm64ASM\": [\n        \"dmb ld\",\n        \"mrs x20, S3_3_c14_c0_2\",\n        \"lsl w4, w20, #7\",\n        \"lsr x5, x20, #25\",\n        \"mrs x0, nzcv\",\n        \"str w0, [x28, #1000]\",\n        \"str x8, [x28, #312]\",\n        \"mov w0, #0x100\",\n        \"str x0, [x28, #1312]\",\n        \"sub sp, sp, #0x10 (16)\",\n        \"mov w8, #0xa8\",\n        \"mov x0, sp\",\n        \"add x1, sp, #0x4 (4)\",\n        \"svc #0x0\",\n        \"ldp w0, w1, [sp]\",\n        \"sub sp, sp, #0x10 (16)\",\n        \"ldr w8, [x28, #1000]\",\n        \"msr nzcv, x8\",\n        \"ldr x8, [x28, #312]\",\n        \"str xzr, [x28, #1312]\",\n        \"orr x7, x0, x1, lsl #12\"\n      ]\n    },\n    \"clzero rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xF 0x01 /7 RM-4\",\n      \"ExpectedArm64ASM\": [\n        \"dc zva, x4\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Secondary_32Bit.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"push fs\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0xa0\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #970]\",\n        \"str w20, [x8, #-4]!\"\n      ]\n    },\n    \"pop fs\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xa1\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x8], #4\",\n        \"strh w20, [x28, #970]\",\n        \"ubfx w21, w20, #2, #1\",\n        \"and w20, w20, #0xfff8\",\n        \"add x0, x28, x21, lsl #3\",\n        \"ldr x21, [x0, #1184]\",\n        \"ldr x20, [x21, w20, uxtw]\",\n        \"lsr x21, x20, #32\",\n        \"and w22, w21, #0xff000000\",\n        \"orr w20, w22, w20, lsr #16\",\n        \"bfi w20, w21, #16, #8\",\n        \"str w20, [x28, #1000]\"\n      ]\n    },\n    \"push gs\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x0f 0xa8\",\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #968]\",\n        \"str w20, [x8, #-4]!\"\n      ]\n    },\n    \"pop gs\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"0x0f 0xa9\",\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x8], #4\",\n        \"strh w20, [x28, #968]\",\n        \"ubfx w21, w20, #2, #1\",\n        \"and w20, w20, #0xfff8\",\n        \"add x0, x28, x21, lsl #3\",\n        \"ldr x21, [x0, #1184]\",\n        \"ldr x20, [x21, w20, uxtw]\",\n        \"lsr x21, x20, #32\",\n        \"and w22, w21, #0xff000000\",\n        \"orr w20, w22, w20, lsr #16\",\n        \"bfi w20, w21, #16, #8\",\n        \"str w20, [x28, #992]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Secondary_OpSize.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FRINTTS\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\",\n      \"FCMA\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ]\n  },\n  \"Instructions\": {\n    \"movupd xmm0, xmm0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": \"0x66 0x0f 0x10\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"movupd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x10\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"movupd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x10\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\"\n      ]\n    },\n    \"movupd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x11\",\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"movlpd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x12\",\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.d}[0], [x4]\"\n      ]\n    },\n    \"movlpd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x13\",\n      \"ExpectedArm64ASM\": [\n        \"str d16, [x4]\"\n      ]\n    },\n    \"unpcklpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x14\",\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"unpckhpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x15\",\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"movhpd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x16\",\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.d}[1], [x4]\"\n      ]\n    },\n    \"movhpd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x17\",\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.d}[1], [x4]\"\n      ]\n    },\n    \"movapd xmm0, xmm0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": \"0x66 0x0f 0x28\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"movapd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x28\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"movapd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x28\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\"\n      ]\n    },\n    \"movapd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x29\",\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"cvtpi2pd xmm0, mm0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0x66 0x0f 0x2a\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"sxtl v2.2d, v2.2s\",\n        \"scvtf v16.2d, v2.2d\"\n      ]\n    },\n    \"movntpd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x2b\",\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"cvttpd2pi mm0, xmm0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x66 0x0f 0x2c\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"frint32z v2.2d, v16.2d\",\n        \"fcvtzs v2.2d, v2.2d\",\n        \"xtn v2.2s, v2.2d\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"cvtpd2pi mm0, xmm0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x66 0x0f 0x2d\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"frint32x v2.2d, v16.2d\",\n        \"fcvtzs v2.2d, v2.2d\",\n        \"xtn v2.2s, v2.2d\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"ucomisd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x66 0x0f 0x2e\",\n      \"ExpectedArm64ASM\": [\n        \"fcmp d16, d17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"comisd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x66 0x0f 0x2f\",\n      \"ExpectedArm64ASM\": [\n        \"fcmp d16, d17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"movmskpd eax, xmm0\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x66 0x0f 0x50\",\n      \"ExpectedArm64ASM\": [\n        \"uzp2 v2.4s, v16.4s, v16.4s\",\n        \"mov x20, v2.d[0]\",\n        \"bfi x20, x20, #31, #32\",\n        \"lsr x4, x20, #62\"\n      ]\n    },\n    \"sqrtpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x51\",\n      \"ExpectedArm64ASM\": [\n        \"fsqrt v16.2d, v17.2d\"\n      ]\n    },\n    \"addpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x58\",\n      \"ExpectedArm64ASM\": [\n        \"fadd v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"mulpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x59\",\n      \"ExpectedArm64ASM\": [\n        \"fmul v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"cvtpd2ps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x5a\",\n      \"ExpectedArm64ASM\": [\n        \"fcvtn v16.2s, v17.2d\"\n      ]\n    },\n    \"cvtpd2ps xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf2 0x0f 0x5a\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"fcvtn v16.2s, v2.2d\"\n      ]\n    },\n    \"cvtps2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0x5b\",\n      \"ExpectedArm64ASM\": [\n        \"frint32x v2.4s, v17.4s\",\n        \"fcvtzs v16.4s, v2.4s\"\n      ]\n    },\n    \"cvtps2dq xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf2 0x0f 0x5b\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"frint32x v2.4s, v2.4s\",\n        \"fcvtzs v16.4s, v2.4s\"\n      ]\n    },\n    \"subpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x5c\",\n      \"ExpectedArm64ASM\": [\n        \"fsub v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"minpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0x5d\",\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v0.2d, v17.2d, v16.2d\",\n        \"bif v16.16b, v17.16b, v0.16b\"\n      ]\n    },\n    \"divpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x5e\",\n      \"ExpectedArm64ASM\": [\n        \"fdiv v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"maxpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0x5f\",\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v0.2d, v17.2d, v16.2d\",\n        \"bit v16.16b, v17.16b, v0.16b\"\n      ]\n    },\n    \"punpcklbw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x60\",\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"punpcklbw xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0x60\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip1 v16.16b, v16.16b, v2.16b\"\n      ]\n    },\n    \"punpcklwd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x61\",\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"punpcklwd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0x61\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip1 v16.8h, v16.8h, v2.8h\"\n      ]\n    },\n    \"punpckldq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x62\",\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"punpckldq xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0x62\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip1 v16.4s, v16.4s, v2.4s\"\n      ]\n    },\n    \"packsswb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0x63\",\n      \"ExpectedArm64ASM\": [\n        \"sqxtn v16.8b, v16.8h\",\n        \"sqxtn2 v16.16b, v17.8h\"\n      ]\n    },\n    \"packsswb xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x66 0x0f 0x63\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"sqxtn v16.8b, v16.8h\",\n        \"sqxtn2 v16.16b, v2.8h\"\n      ]\n    },\n    \"packsswb xmm0, xmm0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x66 0x0f 0x63\",\n      \"ExpectedArm64ASM\": [\n        \"mov v0.16b, v16.16b\",\n        \"sqxtn v16.8b, v16.8h\",\n        \"sqxtn2 v16.16b, v0.8h\"\n      ]\n    },\n    \"pcmpgtb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x64\",\n      \"ExpectedArm64ASM\": [\n        \"cmgt v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"pcmpgtw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x65\",\n      \"ExpectedArm64ASM\": [\n        \"cmgt v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"pcmpgtd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x66\",\n      \"ExpectedArm64ASM\": [\n        \"cmgt v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"punpckhbw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x68\",\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"punpckhbw xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0x68\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip2 v16.16b, v16.16b, v2.16b\"\n      ]\n    },\n    \"punpckhwd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x69\",\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"punpckhwd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0x69\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip2 v16.8h, v16.8h, v2.8h\"\n      ]\n    },\n    \"punpckhdq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x6a\",\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"punpckhdq xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0x6a\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip2 v16.4s, v16.4s, v2.4s\"\n      ]\n    },\n    \"packssdw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0x6b\",\n      \"ExpectedArm64ASM\": [\n        \"sqxtn v16.4h, v16.4s\",\n        \"sqxtn2 v16.8h, v17.4s\"\n      ]\n    },\n    \"punpcklqdq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x6c\",\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"punpckhqdq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x6d\",\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"movd xmm0, dword [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x6e\",\n      \"ExpectedArm64ASM\": [\n        \"ldr s16, [x4]\"\n      ]\n    },\n    \"movd xmm0, eax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x6e\",\n      \"ExpectedArm64ASM\": [\n        \"fmov s16, w4\"\n      ]\n    },\n    \"movq xmm0, qword [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x6e\",\n      \"ExpectedArm64ASM\": [\n        \"ldr d16, [x4]\"\n      ]\n    },\n    \"movq xmm0, rax\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x6e\",\n      \"ExpectedArm64ASM\": [\n        \"fmov d16, x4\"\n      ]\n    },\n    \"movdqa xmm0, xmm0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": \"0x66 0x0f 0x6f\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"movdqa xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x6f\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"movdqa xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x6f\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\"\n      ]\n    },\n    \"pshufd xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Broadcast element 0\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.4s, v17.s[0]\"\n      ]\n    },\n    \"pshufd xmm0, xmm1, 11100100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Identity copy\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"pshufd xmm0, xmm1, 01010000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Zip with self\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.4s, v17.4s, v17.4s\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Broadcast element 0 from memory\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"dup v16.4s, v2.s[0]\"\n      ]\n    },\n    \"pshufd xmm0, xmm1, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Broadcast element 0\",\n        \"Element 0 becomes element 1\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2680]\",\n        \"ldr q2, [x0, #16]\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Broadcast element 0 from Memory\",\n        \"Element 0 becomes element 1\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"ldr x0, [x28, #2680]\",\n        \"ldr q3, [x0, #16]\",\n        \"tbl v16.16b, {v2.16b}, v3.16b\"\n      ]\n    },\n    \"pshufd xmm0, xmm1, 0xff\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Broadcast element 3\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.4s, v17.s[3]\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 0xff\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Broadcast element 3 from memory\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"dup v16.4s, v2.s[3]\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 00_00_11_10b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Inverse elements\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"dup v3.4s, v2.s[0]\",\n        \"ext v16.16b, v2.16b, v3.16b, #8\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 00_01_00_01b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Weird reversed low elements and broadcast\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v16.2d, v2.2d, v2.2d\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 00_01_10_11b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Inverse elements\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"rev64 v2.4s, v2.4s\",\n        \"ext v16.16b, v2.16b, v2.16b, #8\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 00_10_00_10b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Weird reversed even elements and broadcast\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"uzp1 v2.4s, v2.4s, v2.4s\",\n        \"ext v16.16b, v2.16b, v2.16b, #4\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 00_11_00_11b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Weird Low plus high element reversed and broadcast\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"ext v2.16b, v2.16b, v2.16b, #4\",\n        \"zip2 v16.2d, v2.2d, v2.2d\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 00_11_10_01b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Vector rotate - One element\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"ext v16.16b, v2.16b, v2.16b, #4\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 01_00_01_00b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Duplicate bottom 64-bits\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"dup v16.2d, v2.d[0]\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 01_00_11_10b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Vector rotate - Two elements\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"ext v16.16b, v2.16b, v2.16b, #8\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 10_00_10_00b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Even elements broadcast\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"uzp1 v16.4s, v2.4s, v2.4s\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 10_01_10_11b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Vector rotate - Three elements\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"ldr x0, [x28, #2680]\",\n        \"ldr q3, [x0, #2480]\",\n        \"tbl v16.16b, {v2.16b}, v3.16b\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 01_10_01_10b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Weird middle elements swizzle plus broadcast\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"ext v2.16b, v2.16b, v2.16b, #4\",\n        \"rev64 v2.4s, v2.4s\",\n        \"zip1 v16.2d, v2.2d, v2.2d\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 01_11_01_11b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Weird reversed upper elements and broadcast\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"uzp2 v2.4s, v2.4s, v2.4s\",\n        \"ext v16.16b, v2.16b, v2.16b, #4\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 10_01_10_01b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Middle two elements broadcast\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"ext v2.16b, v2.16b, v2.16b, #4\",\n        \"zip1 v16.2d, v2.2d, v2.2d\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 10_11_00_01b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Inverse elements\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"rev64 v16.4s, v2.4s\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 10_11_10_11b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Weird top two elements reverse and broadcast\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip2 v2.2d, v2.2d, v2.2d\",\n        \"ext v16.16b, v2.16b, v2.16b, #4\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 11_00_11_00b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Weird low plus high element broadcast\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"ext v2.16b, v2.16b, v2.16b, #4\",\n        \"zip2 v2.2d, v2.2d, v2.2d\",\n        \"ext v16.16b, v2.16b, v2.16b, #4\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 11_01_11_01b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Odd elements broadcast\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"uzp2 v16.4s, v2.4s, v2.4s\"\n      ]\n    },\n    \"pshufd xmm0, [rax], 11_10_11_10b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Duplicate Top 64-bits\",\n        \"0x66 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"dup v16.2d, v2.d[1]\"\n      ]\n    },\n    \"pcmpeqb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x74\",\n      \"ExpectedArm64ASM\": [\n        \"cmeq v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"pcmpeqw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x75\",\n      \"ExpectedArm64ASM\": [\n        \"cmeq v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"pcmpeqd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x76\",\n      \"ExpectedArm64ASM\": [\n        \"cmeq v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"extrq xmm0, 64, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"SSE4a\",\n        \"0x66 0x0f 0x78\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"fmov d2, x20\",\n        \"and v16.16b, v16.16b, v2.16b\"\n      ]\n    },\n    \"extrq xmm0, 32, 32\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"SSE4a\",\n        \"0x66 0x0f 0x78\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ushr v2.2d, v16.2d, #32\",\n        \"mov w20, #0xffffffff\",\n        \"fmov d3, x20\",\n        \"and v16.16b, v2.16b, v3.16b\"\n      ]\n    },\n    \"extrq xmm0, 0, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"SSE4a\",\n        \"0x66 0x0f 0x78\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"fmov d2, x20\",\n        \"and v16.16b, v16.16b, v2.16b\"\n      ]\n    },\n    \"extrq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"SSE4a\",\n        \"0x66 0x0f 0x79\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, #0x3f\",\n        \"dup v2.2d, x0\",\n        \"and v3.8b, v17.8b, v2.8b\",\n        \"ushr v4.2d, v17.2d, #8\",\n        \"and v2.8b, v4.8b, v2.8b\",\n        \"neg v0.2d, v2.2d\",\n        \"ushl v2.2d, v16.2d, v0.2d\",\n        \"mov x20, v3.d[0]\",\n        \"mrs x21, nzcv\",\n        \"mov x0, #0xffffffffffffffff\",\n        \"cmp x20, #0x0 (0)\",\n        \"lsl x1, x0, x20\",\n        \"csinv x20, x0, x1, eq\",\n        \"fmov d3, x20\",\n        \"and v16.16b, v2.16b, v3.16b\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"haddpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x7c\",\n      \"ExpectedArm64ASM\": [\n        \"faddp v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"hsubpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x66 0x0f 0x7c\",\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.2d, v16.2d, v17.2d\",\n        \"uzp2 v3.2d, v16.2d, v17.2d\",\n        \"fsub v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"movd eax, xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x7e\",\n      \"ExpectedArm64ASM\": [\n        \"mov w4, v16.s[0]\"\n      ]\n    },\n    \"movq rax, xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x7e\",\n      \"ExpectedArm64ASM\": [\n        \"mov x4, v16.d[0]\"\n      ]\n    },\n    \"movd dword [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x7e\",\n      \"ExpectedArm64ASM\": [\n        \"str s16, [x4]\"\n      ]\n    },\n    \"movq qword [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x7e\",\n      \"ExpectedArm64ASM\": [\n        \"str d16, [x4]\"\n      ]\n    },\n    \"movdqa [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0x7f\",\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"cmppd xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmeq v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"cmppd xmm0, xmm1, 1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v16.2d, v17.2d, v16.2d\"\n      ]\n    },\n    \"cmppd xmm0, xmm1, 2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmge v16.2d, v17.2d, v16.2d\"\n      ]\n    },\n    \"cmppd xmm0, xmm1, 3\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x66 0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmge v0.2d, v16.2d, v17.2d\",\n        \"fcmgt v1.2d, v17.2d, v16.2d\",\n        \"orr v16.16b, v0.16b, v1.16b\",\n        \"mvn v16.16b, v16.16b\"\n      ]\n    },\n    \"cmppd xmm0, xmm1, 4\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmeq v16.2d, v16.2d, v17.2d\",\n        \"mvn v16.16b, v16.16b\"\n      ]\n    },\n    \"cmppd xmm0, xmm1, 5\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v2.2d, v17.2d, v16.2d\",\n        \"mvn v16.16b, v2.16b\"\n      ]\n    },\n    \"cmppd xmm0, xmm1, 6\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmge v2.2d, v17.2d, v16.2d\",\n        \"mvn v16.16b, v2.16b\"\n      ]\n    },\n    \"cmppd xmm0, xmm1, 7\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x66 0x0f 0xc2\",\n      \"ExpectedArm64ASM\": [\n        \"fcmge v0.2d, v16.2d, v17.2d\",\n        \"fcmgt v1.2d, v17.2d, v16.2d\",\n        \"orr v16.16b, v0.16b, v1.16b\"\n      ]\n    },\n    \"pinsrw xmm0, eax, 000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.h[0], w4\"\n      ]\n    },\n    \"pinsrw xmm0, eax, 001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.h[1], w4\"\n      ]\n    },\n    \"pinsrw xmm0, eax, 010b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.h[2], w4\"\n      ]\n    },\n    \"pinsrw xmm0, eax, 011b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.h[3], w4\"\n      ]\n    },\n    \"pinsrw xmm0, eax, 100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.h[4], w4\"\n      ]\n    },\n    \"pinsrw xmm0, eax, 101b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.h[5], w4\"\n      ]\n    },\n    \"pinsrw xmm0, eax, 110b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.h[6], w4\"\n      ]\n    },\n    \"pinsrw xmm0, eax, 111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.h[7], w4\"\n      ]\n    },\n    \"pinsrw xmm0, [rax], 000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.h}[0], [x4]\"\n      ]\n    },\n    \"pinsrw xmm0, [rax], 001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.h}[1], [x4]\"\n      ]\n    },\n    \"pinsrw xmm0, [rax], 010b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.h}[2], [x4]\"\n      ]\n    },\n    \"pinsrw xmm0, [rax], 011b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.h}[3], [x4]\"\n      ]\n    },\n    \"pinsrw xmm0, [rax], 100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.h}[4], [x4]\"\n      ]\n    },\n    \"pinsrw xmm0, [rax], 101b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.h}[5], [x4]\"\n      ]\n    },\n    \"pinsrw xmm0, [rax], 110b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.h}[6], [x4]\"\n      ]\n    },\n    \"pinsrw xmm0, [rax], 111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc4\",\n      \"ExpectedArm64ASM\": [\n        \"ld1 {v16.h}[7], [x4]\"\n      ]\n    },\n    \"pextrw eax, xmm0, 000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[0]\"\n      ]\n    },\n    \"pextrw eax, xmm0, 001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[1]\"\n      ]\n    },\n    \"pextrw eax, xmm0, 010b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[2]\"\n      ]\n    },\n    \"pextrw eax, xmm0, 011b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[3]\"\n      ]\n    },\n    \"pextrw eax, xmm0, 100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[4]\"\n      ]\n    },\n    \"pextrw eax, xmm0, 101b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[5]\"\n      ]\n    },\n    \"pextrw eax, xmm0, 110b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[6]\"\n      ]\n    },\n    \"pextrw eax, xmm0, 111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[7]\"\n      ]\n    },\n    \"pextrw [rax], xmm0, 000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[0], [x4]\"\n      ]\n    },\n    \"pextrw [rax], xmm0, 001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[1], [x4]\"\n      ]\n    },\n    \"pextrw [rax], xmm0, 010b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[2], [x4]\"\n      ]\n    },\n    \"pextrw [rax], xmm0, 011b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[3], [x4]\"\n      ]\n    },\n    \"pextrw [rax], xmm0, 100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[4], [x4]\"\n      ]\n    },\n    \"pextrw [rax], xmm0, 101b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[5], [x4]\"\n      ]\n    },\n    \"pextrw [rax], xmm0, 110b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[6], [x4]\"\n      ]\n    },\n    \"pextrw [rax], xmm0, 111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc5\",\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[7], [x4]\"\n      ]\n    },\n    \"shufpd xmm0, xmm1, 00b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc6\",\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"shufpd xmm0, xmm1, 01b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc6\",\n      \"ExpectedArm64ASM\": [\n        \"ext v16.16b, v16.16b, v17.16b, #8\"\n      ]\n    },\n    \"shufpd xmm0, xmm1, 10b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc6\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[1], v17.d[1]\"\n      ]\n    },\n    \"shufpd xmm0, xmm1, 11b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc6\",\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"shufpd xmm1, xmm0, 00b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc6\",\n      \"ExpectedArm64ASM\": [\n        \"zip1 v17.2d, v17.2d, v16.2d\"\n      ]\n    },\n    \"shufpd xmm1, xmm0, 01b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc6\",\n      \"ExpectedArm64ASM\": [\n        \"ext v17.16b, v17.16b, v16.16b, #8\"\n      ]\n    },\n    \"shufpd xmm1, xmm0, 10b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc6\",\n      \"ExpectedArm64ASM\": [\n        \"mov v17.d[1], v16.d[1]\"\n      ]\n    },\n    \"shufpd xmm1, xmm0, 11b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xc6\",\n      \"ExpectedArm64ASM\": [\n        \"zip2 v17.2d, v17.2d, v16.2d\"\n      ]\n    },\n    \"addsubpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x66 0x0f 0xd0\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3072]\",\n        \"eor v2.16b, v17.16b, v2.16b\",\n        \"fadd v16.2d, v16.2d, v2.2d\"\n      ]\n    },\n    \"psrlw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x66 0x0f 0xd1\",\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d17, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.8h, v0.h[0]\",\n        \"neg v0.8h, v0.8h\",\n        \"ushl v16.8h, v16.8h, v0.8h\"\n      ]\n    },\n    \"psrld xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x66 0x0f 0xd2\",\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d17, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.4s, v0.s[0]\",\n        \"neg v0.4s, v0.4s\",\n        \"ushl v16.4s, v16.4s, v0.4s\"\n      ]\n    },\n    \"psrlq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x66 0x0f 0xd3\",\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d17, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.2d, v0.d[0]\",\n        \"neg v0.2d, v0.2d\",\n        \"ushl v16.2d, v16.2d, v0.2d\"\n      ]\n    },\n    \"paddq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xd4\",\n      \"ExpectedArm64ASM\": [\n        \"add v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"pmullw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xd3\",\n      \"ExpectedArm64ASM\": [\n        \"mul v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"pmovmskb eax, xmm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0x66 0x0f 0xd7\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3296]\",\n        \"cmlt v3.16b, v16.16b, #0\",\n        \"and v2.16b, v3.16b, v2.16b\",\n        \"addp v2.16b, v2.16b, v2.16b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"umov w4, v2.h[0]\"\n      ]\n    },\n    \"psubusb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xd8\",\n      \"ExpectedArm64ASM\": [\n        \"uqsub v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"psubusw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xd9\",\n      \"ExpectedArm64ASM\": [\n        \"uqsub v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"pminub xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xda\",\n      \"ExpectedArm64ASM\": [\n        \"umin v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"pand xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xdb\",\n      \"ExpectedArm64ASM\": [\n        \"and v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"paddusb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xdc\",\n      \"ExpectedArm64ASM\": [\n        \"uqadd v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"paddusw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xdd\",\n      \"ExpectedArm64ASM\": [\n        \"uqadd v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"pmaxub xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xde\",\n      \"ExpectedArm64ASM\": [\n        \"umax v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"pandn xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xdf\",\n      \"ExpectedArm64ASM\": [\n        \"bic v16.16b, v17.16b, v16.16b\"\n      ]\n    },\n    \"pavgb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xe0\",\n      \"ExpectedArm64ASM\": [\n        \"urhadd v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"psraw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x66 0x0f 0xe1\",\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d17, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.8h, v0.h[0]\",\n        \"neg v0.8h, v0.8h\",\n        \"sshl v16.8h, v16.8h, v0.8h\"\n      ]\n    },\n    \"psrad xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x66 0x0f 0xe2\",\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d17, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.4s, v0.s[0]\",\n        \"neg v0.4s, v0.4s\",\n        \"sshl v16.4s, v16.4s, v0.4s\"\n      ]\n    },\n    \"pavgw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xe3\",\n      \"ExpectedArm64ASM\": [\n        \"urhadd v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"pmulhuw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x66 0x0f 0xe4\",\n      \"ExpectedArm64ASM\": [\n        \"umull2 v0.4s, v16.8h, v17.8h\",\n        \"umull v16.4s, v16.4h, v17.4h\",\n        \"uzp2 v16.8h, v16.8h, v0.8h\"\n      ]\n    },\n    \"pmulhw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x66 0x0f 0xe5\",\n      \"ExpectedArm64ASM\": [\n        \"smull2 v0.4s, v16.8h, v17.8h\",\n        \"smull v16.4s, v16.4h, v17.4h\",\n        \"uzp2 v16.8h, v16.8h, v0.8h\"\n      ]\n    },\n    \"cvttpd2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x66 0x0f 0xe6\",\n      \"ExpectedArm64ASM\": [\n        \"frint32z v2.2d, v17.2d\",\n        \"fcvtzs v2.2d, v2.2d\",\n        \"xtn v16.2s, v2.2d\"\n      ]\n    },\n    \"movntdq [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xe7\",\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"psubsb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xe8\",\n      \"ExpectedArm64ASM\": [\n        \"sqsub v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"psubsw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xe9\",\n      \"ExpectedArm64ASM\": [\n        \"sqsub v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"pminsw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xea\",\n      \"ExpectedArm64ASM\": [\n        \"smin v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"por xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xeb\",\n      \"ExpectedArm64ASM\": [\n        \"orr v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"paddsb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xec\",\n      \"ExpectedArm64ASM\": [\n        \"sqadd v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"paddsw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xed\",\n      \"ExpectedArm64ASM\": [\n        \"sqadd v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"pmaxsw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xee\",\n      \"ExpectedArm64ASM\": [\n        \"smax v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"pxor xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xef\",\n      \"ExpectedArm64ASM\": [\n        \"eor v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"pxor xmm0, xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xef\",\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"psllw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x66 0x0f 0xf1\",\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d17, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.8h, v0.h[0]\",\n        \"ushl v16.8h, v16.8h, v0.8h\"\n      ]\n    },\n    \"pslld xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x66 0x0f 0xf2\",\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d17, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.4s, v0.s[0]\",\n        \"ushl v16.4s, v16.4s, v0.4s\"\n      ]\n    },\n    \"psllq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x66 0x0f 0xf3\",\n      \"ExpectedArm64ASM\": [\n        \"uqshl d0, d17, #57\",\n        \"ushr d0, d0, #57\",\n        \"dup v0.2d, v0.d[0]\",\n        \"ushl v16.2d, v16.2d, v0.2d\"\n      ]\n    },\n    \"pmuludq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x66 0x0f 0xf4\",\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.4s, v16.4s, v16.4s\",\n        \"uzp1 v3.4s, v17.4s, v17.4s\",\n        \"umull v16.2d, v2.2s, v3.2s\"\n      ]\n    },\n    \"pmaddwd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0x66 0x0f 0xf5\",\n      \"ExpectedArm64ASM\": [\n        \"smull v2.4s, v16.4h, v17.4h\",\n        \"smull2 v3.4s, v16.8h, v17.8h\",\n        \"addp v16.4s, v2.4s, v3.4s\"\n      ]\n    },\n    \"psadbw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x66 0x0f 0xf6\",\n      \"ExpectedArm64ASM\": [\n        \"uabdl v2.8h, v16.8b, v17.8b\",\n        \"uabdl2 v3.8h, v16.16b, v17.16b\",\n        \"addv h2, v2.8h\",\n        \"addv h3, v3.8h\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"maskmovdqu xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0x66 0x0f 0xf7\",\n      \"ExpectedArm64ASM\": [\n        \"cmlt v2.16b, v17.16b, #0\",\n        \"ldr q3, [x11]\",\n        \"bsl v2.16b, v16.16b, v3.16b\",\n        \"str q2, [x11]\"\n      ]\n    },\n    \"psubb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xf8\",\n      \"ExpectedArm64ASM\": [\n        \"sub v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"psubw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xf9\",\n      \"ExpectedArm64ASM\": [\n        \"sub v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"psubd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xfa\",\n      \"ExpectedArm64ASM\": [\n        \"sub v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"psubq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xfb\",\n      \"ExpectedArm64ASM\": [\n        \"sub v16.2d, v16.2d, v17.2d\"\n      ]\n    },\n    \"paddb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xfc\",\n      \"ExpectedArm64ASM\": [\n        \"add v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"paddw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xfd\",\n      \"ExpectedArm64ASM\": [\n        \"add v16.8h, v16.8h, v17.8h\"\n      ]\n    },\n    \"paddd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xfe\",\n      \"ExpectedArm64ASM\": [\n        \"add v16.4s, v16.4s, v17.4s\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Secondary_OpSize_FCMA.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FCMA\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"addsubpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0xd0\",\n      \"ExpectedArm64ASM\": [\n        \"ext v2.16b, v17.16b, v17.16b, #8\",\n        \"fcadd v16.2d, v16.2d, v2.2d, #90\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Secondary_OpSize_SVE128.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"psrlw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0xd1\",\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d17\",\n        \"lsr z16.h, p6/m, z16.h, z0.d\"\n      ]\n    },\n    \"psrld xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0xd2\",\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d17\",\n        \"lsr z16.s, p6/m, z16.s, z0.d\"\n      ]\n    },\n    \"psrlq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0xd3\",\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d17\",\n        \"lsr z16.d, p6/m, z16.d, z0.d\"\n      ]\n    },\n    \"psraw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0xe1\",\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d17\",\n        \"asr z16.h, p6/m, z16.h, z0.d\"\n      ]\n    },\n    \"psrad xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0xe2\",\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d17\",\n        \"asr z16.s, p6/m, z16.s, z0.d\"\n      ]\n    },\n    \"pmulhuw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xe4\",\n      \"ExpectedArm64ASM\": [\n        \"umulh z16.h, z16.h, z17.h\"\n      ]\n    },\n    \"pmulhw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0x66 0x0f 0xe5\",\n      \"ExpectedArm64ASM\": [\n        \"smulh z16.h, z16.h, z17.h\"\n      ]\n    },\n    \"psllw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0xf1\",\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d17\",\n        \"lsl z16.h, p6/m, z16.h, z0.d\"\n      ]\n    },\n    \"pslld xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0xf2\",\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d17\",\n        \"lsl z16.s, p6/m, z16.s, z0.d\"\n      ]\n    },\n    \"psllq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0x66 0x0f 0xf3\",\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d17\",\n        \"lsl z16.d, p6/m, z16.d, z0.d\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Secondary_OpSize_SVE256.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ],\n    \"DisabledHostFeatures\": []\n  },\n  \"Instructions\": {\n    \"pmulhuw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"SVE-256bit changes behaviour slightly\",\n        \"0x66 0x0f 0xe4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umulh z16.h, p6/m, z16.h, z17.h\"\n      ]\n    },\n    \"pmulhw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"SVE-256bit changes behaviour slightly\",\n        \"0x66 0x0f 0xe5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smulh z16.h, p6/m, z16.h, z17.h\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Secondary_REP.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"FRINTTS\",\n      \"CSSC\"\n    ]\n  },\n  \"Instructions\": {\n    \"movss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x10\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.s[0], v17.s[0]\"\n      ]\n    },\n    \"movss xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x10\",\n      \"ExpectedArm64ASM\": [\n        \"ldr s16, [x4]\"\n      ]\n    },\n    \"movss [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x11\",\n      \"ExpectedArm64ASM\": [\n        \"str s16, [x4]\"\n      ]\n    },\n    \"movsldup xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x12\",\n      \"ExpectedArm64ASM\": [\n        \"trn1 v16.4s, v17.4s, v17.4s\"\n      ]\n    },\n    \"movsldup xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf3 0x0f 0x12\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"trn1 v16.4s, v2.4s, v2.4s\"\n      ]\n    },\n    \"movshdup xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x16\",\n      \"ExpectedArm64ASM\": [\n        \"trn2 v16.4s, v17.4s, v17.4s\"\n      ]\n    },\n    \"movshdup xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf3 0x0f 0x16\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"trn2 v16.4s, v2.4s, v2.4s\"\n      ]\n    },\n    \"cvtsi2ss xmm0, eax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf3 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"scvtf s0, w4\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"cvtsi2ss xmm0, dword [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf3 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"scvtf s0, s2\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"cvtsi2ss xmm0, rax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf3 0x0f 0x2a\",\n      \"ExpectedArm64ASM\": [\n        \"scvtf s0, x4\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"cvtsi2ss xmm0, qword [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf3 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x4]\",\n        \"scvtf s0, x20\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"movntss [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x2b\",\n      \"ExpectedArm64ASM\": [\n        \"str s16, [x4]\"\n      ]\n    },\n    \"cvttss2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xf3 0x0f 0x2c\",\n      \"ExpectedArm64ASM\": [\n        \"fcvtzs w20, s16\",\n        \"mov w21, #0x80000000\",\n        \"ldr s2, [x28, #3424]\",\n        \"mrs x22, nzcv\",\n        \"fcmp s2, s16\",\n        \"csel w4, w20, w21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"cvttss2si eax, dword [rbx]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0xf3 0x0f 0x2c\",\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x6]\",\n        \"fcvtzs w20, s2\",\n        \"mov w21, #0x80000000\",\n        \"ldr s3, [x28, #3424]\",\n        \"mrs x22, nzcv\",\n        \"fcmp s3, s2\",\n        \"csel w4, w20, w21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"cvttss2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xf3 0x0f 0x2c\",\n      \"ExpectedArm64ASM\": [\n        \"fcvtzs x20, s16\",\n        \"mov x21, #0x8000000000000000\",\n        \"ldr s2, [x28, #3456]\",\n        \"mrs x22, nzcv\",\n        \"fcmp s2, s16\",\n        \"csel x4, x20, x21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"cvttss2si rax, dword [rbx]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0xf3 0x0f 0x2c\",\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x6]\",\n        \"fcvtzs x20, s2\",\n        \"mov x21, #0x8000000000000000\",\n        \"ldr s3, [x28, #3456]\",\n        \"mrs x22, nzcv\",\n        \"fcmp s3, s2\",\n        \"csel x4, x20, x21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"cvtss2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0xf3 0x0f 0x2d\",\n      \"ExpectedArm64ASM\": [\n        \"frinti s2, s16\",\n        \"fcvtzs w20, s2\",\n        \"mov w21, #0x80000000\",\n        \"ldr s3, [x28, #3424]\",\n        \"mrs x22, nzcv\",\n        \"fcmp s3, s2\",\n        \"csel w4, w20, w21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"cvtss2si eax, dword [rbx]\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0xf3 0x0f 0x2d\",\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x6]\",\n        \"frinti s2, s2\",\n        \"fcvtzs w20, s2\",\n        \"mov w21, #0x80000000\",\n        \"ldr s3, [x28, #3424]\",\n        \"mrs x22, nzcv\",\n        \"fcmp s3, s2\",\n        \"csel w4, w20, w21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"cvtss2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0xf3 0x0f 0x2d\",\n      \"ExpectedArm64ASM\": [\n        \"frinti s2, s16\",\n        \"fcvtzs x20, s2\",\n        \"mov x21, #0x8000000000000000\",\n        \"ldr s3, [x28, #3456]\",\n        \"mrs x22, nzcv\",\n        \"fcmp s3, s2\",\n        \"csel x4, x20, x21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"cvtss2si rax, dword [rbx]\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0xf3 0x0f 0x2d\",\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x6]\",\n        \"frinti s2, s2\",\n        \"fcvtzs x20, s2\",\n        \"mov x21, #0x8000000000000000\",\n        \"ldr s3, [x28, #3456]\",\n        \"mrs x22, nzcv\",\n        \"fcmp s3, s2\",\n        \"csel x4, x20, x21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"sqrtss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf3 0x0f 0x51\",\n      \"ExpectedArm64ASM\": [\n        \"fsqrt s0, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"rsqrtss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xf3 0x0f 0x52\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov s0, #0x70 (1.0000)\",\n        \"fsqrt s1, s17\",\n        \"fdiv s0, s0, s1\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"rcpss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf3 0x0f 0x53\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov s0, #0x70 (1.0000)\",\n        \"fdiv s0, s0, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"addss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf3 0x0f 0x58\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fadd s0, s16, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"mulss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf3 0x0f 0x59\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul s0, s16, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"cvtss2sd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf3 0x0f 0x5a\",\n      \"ExpectedArm64ASM\": [\n        \"fcvt d0, s17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"cvtss2sd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf3 0x0f 0x5a\",\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d0, s2\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"cvttps2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": \"0xf3 0x0f 0x5b\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3520]\",\n        \"ldr q3, [x28, #3424]\",\n        \"fcvtzs v4.4s, v17.4s\",\n        \"fcmgt v3.4s, v3.4s, v17.4s\",\n        \"mov v16.16b, v3.16b\",\n        \"bsl v16.16b, v4.16b, v2.16b\"\n      ]\n    },\n    \"subss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf3 0x0f 0x5c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsub s0, s16, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"minss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xf3 0x0f 0x5d\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"fcmp s16, s17\",\n        \"fcsel s0, s16, s17, mi\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"divss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf3 0x0f 0x5e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fdiv s0, s16, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"maxss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xf3 0x0f 0x5f\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"fcmp s16, s17\",\n        \"fcsel s0, s16, s17, gt\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"movdqu xmm0, xmm0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": \"0xf3 0x0f 0x6f\",\n      \"ExpectedArm64ASM\": []\n    },\n    \"movdqu xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x6f\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"movdqu xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x6f\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\"\n      ]\n    },\n    \"pshufhw xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Broadcast upper-half element 0\",\n        \"0xf3 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.8h, v17.h[4]\",\n        \"trn1 v16.2d, v17.2d, v2.2d\"\n      ]\n    },\n    \"pshufhw xmm0, xmm1, 11100100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Identity copy\",\n        \"0xf3 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"pshufhw xmm0, xmm1, 01010000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Upper elements Self-zip\",\n        \"0xf3 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2672]\",\n        \"ldr q2, [x0, #1280]\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\"\n      ]\n    },\n    \"pshufhw xmm0, xmm1, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Broadcast element 0 in the upper-half\",\n        \"Upper-half Element 0 gets turned in to element 1\",\n        \"0xf3 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2672]\",\n        \"ldr q2, [x0, #16]\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\"\n      ]\n    },\n    \"pshufhw xmm0, xmm1, 0xff\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Broadcast upper-half Element 3\",\n        \"0xf3 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.8h, v17.h[7]\",\n        \"trn1 v16.2d, v17.2d, v2.2d\"\n      ]\n    },\n    \"movq xmm0, xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x7e\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.8b, v16.8b\"\n      ]\n    },\n    \"movq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x7e\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.8b, v17.8b\"\n      ]\n    },\n    \"movq xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x7e\",\n      \"ExpectedArm64ASM\": [\n        \"ldr d16, [x4]\"\n      ]\n    },\n    \"movdqu [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf3 0x0f 0x7f\",\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"popcnt ax, bx\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": \"0xf3 0x0f 0xb8\",\n      \"ExpectedArm64ASM\": [\n        \"uxth w20, w6\",\n        \"fmov s0, w20\",\n        \"cnt v0.8b, v0.8b\",\n        \"addp v0.8b, v0.8b, v0.8b\",\n        \"umov w20, v0.b[0]\",\n        \"bfxil x4, x20, #0, #16\",\n        \"mov w27, #0x0\",\n        \"cmp w20, #0x0 (0)\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"popcnt eax, ebx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xf3 0x0f 0xb8\",\n      \"ExpectedArm64ASM\": [\n        \"fmov s0, w6\",\n        \"cnt v0.8b, v0.8b\",\n        \"addv b0, v0.8b\",\n        \"umov w4, v0.b[0]\",\n        \"mov w27, #0x0\",\n        \"cmp w4, #0x0 (0)\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"popcnt rax, rbx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xf3 0x0f 0xb8\",\n      \"ExpectedArm64ASM\": [\n        \"fmov d0, x6\",\n        \"cnt v0.8b, v0.8b\",\n        \"addv b0, v0.8b\",\n        \"umov w4, v0.b[0]\",\n        \"mov w27, #0x0\",\n        \"cmp w4, #0x0 (0)\",\n        \"mov w26, #0x1\"\n      ]\n    },\n    \"tzcnt ax, bx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0xf3 0x0f 0xbc\",\n      \"ExpectedArm64ASM\": [\n        \"rbit w20, w6\",\n        \"orr w20, w20, #0x8000\",\n        \"clz w20, w20\",\n        \"bfxil x4, x20, #0, #16\",\n        \"cmn wzr, w20, lsl #16\",\n        \"eor x20, x20, #0x10\",\n        \"ubfx x20, x20, #4, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"tzcnt eax, ebx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0xf3 0x0f 0xbc\",\n      \"ExpectedArm64ASM\": [\n        \"rbit w4, w6\",\n        \"clz w4, w4\",\n        \"cmp w4, #0x0 (0)\",\n        \"eor x20, x4, #0x20\",\n        \"ubfx x20, x20, #5, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"tzcnt rax, rbx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0xf3 0x0f 0xbc\",\n      \"ExpectedArm64ASM\": [\n        \"rbit x4, x6\",\n        \"clz x4, x4\",\n        \"cmp x4, #0x0 (0)\",\n        \"eor x20, x4, #0x40\",\n        \"ubfx x20, x20, #6, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lzcnt ax, bx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": \"0xf3 0x0f 0xbd\",\n      \"ExpectedArm64ASM\": [\n        \"lsl w20, w6, #16\",\n        \"orr w20, w20, #0x8000\",\n        \"clz w20, w20\",\n        \"bfxil x4, x20, #0, #16\",\n        \"cmn wzr, w20, lsl #16\",\n        \"eor x20, x20, #0x10\",\n        \"ubfx x20, x20, #4, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lzcnt eax, ebx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xf3 0x0f 0xbd\",\n      \"ExpectedArm64ASM\": [\n        \"clz w4, w6\",\n        \"cmp w4, #0x0 (0)\",\n        \"eor x20, x4, #0x20\",\n        \"ubfx x20, x20, #5, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"lzcnt rax, rbx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": \"0xf3 0x0f 0xbd\",\n      \"ExpectedArm64ASM\": [\n        \"clz x4, x6\",\n        \"cmp x4, #0x0 (0)\",\n        \"eor x20, x4, #0x40\",\n        \"ubfx x20, x20, #6, #1\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq s0, s17, s16\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt s0, s17, s16\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge s0, s17, s16\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 3\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge s0, s16, s17\",\n        \"fcmgt s1, s17, s16\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 4\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq s0, s17, s16\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 5\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt s2, s17, s16\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.s[0], v2.s[0]\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 6\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge s2, s17, s16\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.s[0], v2.s[0]\"\n      ]\n    },\n    \"cmpss xmm0, xmm1, 7\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xf3 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge s0, s16, s17\",\n        \"fcmgt s1, s17, s16\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"movq2dq xmm0, mm0\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": \"0xf3 0x0f 0xd6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d16, [x28, #1056]\"\n      ]\n    },\n    \"cvtdq2pd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf3 0x0f 0xe6\",\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.2d, v17.2s\",\n        \"scvtf v16.2d, v2.2d\"\n      ]\n    },\n    \"cvtdq2pd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf3 0x0f 0xe6\",\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"sxtl v2.2d, v2.2s\",\n        \"scvtf v16.2d, v2.2d\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Secondary_REPNE.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FRINTTS\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"FCMA\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"movsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf2 0x0f 0x10\",\n      \"ExpectedArm64ASM\": [\n        \"mov v16.d[0], v17.d[0]\"\n      ]\n    },\n    \"movsd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf2 0x0f 0x10\",\n      \"ExpectedArm64ASM\": [\n        \"ldr d16, [x4]\"\n      ]\n    },\n    \"movsd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf2 0x0f 0x11\",\n      \"ExpectedArm64ASM\": [\n        \"str d16, [x4]\"\n      ]\n    },\n    \"movddup xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf2 0x0f 0x12\",\n      \"ExpectedArm64ASM\": [\n        \"dup v16.2d, v17.d[0]\"\n      ]\n    },\n    \"movddup xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf2 0x0f 0x12\",\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"dup v16.2d, v2.d[0]\"\n      ]\n    },\n    \"cvtsi2sd xmm0, eax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"scvtf d0, w4\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"cvtsi2sd xmm0, dword [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf2 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d0, w20\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"cvtsi2sd xmm0, rax\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"scvtf d0, x4\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"cvtsi2sd xmm0, qword [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf2 0x0f 0x2a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"scvtf d0, d2\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"movntsd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf2 0x0f 0x2b\",\n      \"ExpectedArm64ASM\": [\n        \"str d16, [x4]\"\n      ]\n    },\n    \"cvttsd2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf2 0x0f 0x2c\",\n      \"ExpectedArm64ASM\": [\n        \"frint32z d2, d16\",\n        \"fcvtzs w4, d2\"\n      ]\n    },\n    \"cvttsd2si eax, qword [rbx]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf2 0x0f 0x2c\",\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x6]\",\n        \"frint32z d2, d2\",\n        \"fcvtzs w4, d2\"\n      ]\n    },\n    \"cvttsd2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf2 0x0f 0x2c\",\n      \"ExpectedArm64ASM\": [\n        \"frint64z d2, d16\",\n        \"fcvtzs x4, d2\"\n      ]\n    },\n    \"cvttsd2si rax, qword [rbx]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf2 0x0f 0x2c\",\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x6]\",\n        \"frint64z d2, d2\",\n        \"fcvtzs x4, d2\"\n      ]\n    },\n    \"cvtsd2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf2 0x0f 0x2d\",\n      \"ExpectedArm64ASM\": [\n        \"frint32x d2, d16\",\n        \"fcvtzs w4, d2\"\n      ]\n    },\n    \"cvtsd2si eax, qword [rbx]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf2 0x0f 0x2d\",\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x6]\",\n        \"frint32x d2, d2\",\n        \"fcvtzs w4, d2\"\n      ]\n    },\n    \"cvtsd2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf2 0x0f 0x2d\",\n      \"ExpectedArm64ASM\": [\n        \"frint64x d2, d16\",\n        \"fcvtzs x4, d2\"\n      ]\n    },\n    \"cvtsd2si rax, qword [rbx]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf2 0x0f 0x2d\",\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x6]\",\n        \"frint64x d2, d2\",\n        \"fcvtzs x4, d2\"\n      ]\n    },\n    \"sqrtsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0x51\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsqrt d0, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"addsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0x58\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fadd d0, d16, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"mulsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0x59\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul d0, d16, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"cvtsd2ss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvt s0, d17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"cvtsd2ss xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5a\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"fcvt s0, d2\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"subsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5c\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsub d0, d16, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"minsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5d\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"fcmp d16, d17\",\n        \"fcsel d0, d16, d17, mi\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"divsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5e\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fdiv d0, d16, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"maxsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xf2 0x0f 0x5f\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"fcmp d16, d17\",\n        \"fcsel d0, d16, d17, gt\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"pshuflw xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Broadcast element 0\",\n        \"0xf2 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.8h, v17.h[0]\",\n        \"trn2 v16.2d, v2.2d, v17.2d\"\n      ]\n    },\n    \"pshuflw xmm0, xmm1, 11100100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Identity copy\",\n        \"0xf2 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"pshuflw xmm0, xmm1, 01010000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Lower elements Self-zip\",\n        \"0xf2 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2664]\",\n        \"ldr q2, [x0, #1280]\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\"\n      ]\n    },\n    \"pshuflw xmm0, xmm1, 1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Broadcast first element in to Elements 1,2,3\",\n        \"Element 0 gets turned in to element 1\",\n        \"0xf2 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2664]\",\n        \"ldr q2, [x0, #16]\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\"\n      ]\n    },\n    \"pshuflw xmm0, xmm1, 0xff\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Broadcast Element 3\",\n        \"0xf2 0x0f 0x70\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.8h, v17.h[3]\",\n        \"trn2 v16.2d, v2.2d, v17.2d\"\n      ]\n    },\n    \"insertq xmm0, xmm1, 0, 0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"SSE4a\",\n        \"0xf2 0x0f 0x78\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"fmov d2, x20\",\n        \"and v3.8b, v17.8b, v2.8b\",\n        \"mvn v2.16b, v2.16b\",\n        \"and v2.8b, v16.8b, v2.8b\",\n        \"orr v16.8b, v2.8b, v3.8b\"\n      ]\n    },\n    \"insertq xmm0, xmm1, 64, 0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"SSE4a\",\n        \"0xf2 0x0f 0x78\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"fmov d2, x20\",\n        \"and v3.8b, v17.8b, v2.8b\",\n        \"mvn v2.16b, v2.16b\",\n        \"and v2.8b, v16.8b, v2.8b\",\n        \"orr v16.8b, v2.8b, v3.8b\"\n      ]\n    },\n    \"insertq xmm0, xmm1, 32, 32\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"SSE4a\",\n        \"0xf2 0x0f 0x78\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0xffffffff\",\n        \"fmov d2, x20\",\n        \"and v3.8b, v17.8b, v2.8b\",\n        \"shl v3.2d, v3.2d, #32\",\n        \"shl v2.2d, v2.2d, #32\",\n        \"mvn v2.16b, v2.16b\",\n        \"and v2.8b, v16.8b, v2.8b\",\n        \"orr v16.8b, v2.8b, v3.8b\"\n      ]\n    },\n    \"insertq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"SSE4a\",\n        \"0xf2 0x0f 0x79\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.2d, v17.d[1]\",\n        \"mov w0, #0x3f\",\n        \"dup v3.2d, x0\",\n        \"and v4.8b, v2.8b, v3.8b\",\n        \"ushr v2.2d, v2.2d, #8\",\n        \"and v2.8b, v2.8b, v3.8b\",\n        \"mov x20, v4.d[0]\",\n        \"mrs x21, nzcv\",\n        \"mov x0, #0xffffffffffffffff\",\n        \"cmp x20, #0x0 (0)\",\n        \"lsl x1, x0, x20\",\n        \"csinv x20, x0, x1, eq\",\n        \"fmov d3, x20\",\n        \"and v4.16b, v17.16b, v3.16b\",\n        \"ushl v4.2d, v4.2d, v2.2d\",\n        \"ushl v3.2d, v3.2d, v2.2d\",\n        \"mvn v2.16b, v3.16b\",\n        \"and v2.8b, v16.8b, v2.8b\",\n        \"orr v16.8b, v2.8b, v4.8b\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"haddps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf2 0x0f 0x7c\",\n      \"ExpectedArm64ASM\": [\n        \"faddp v16.4s, v16.4s, v17.4s\"\n      ]\n    },\n    \"hsubps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf2 0x0f 0x7d\",\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.4s, v16.4s, v17.4s\",\n        \"uzp2 v3.4s, v16.4s, v17.4s\",\n        \"fsub v16.4s, v2.4s, v3.4s\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq d0, d17, d16\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt d0, d17, d16\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge d0, d17, d16\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 3\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge d0, d16, d17\",\n        \"fcmgt d1, d17, d16\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 4\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq d0, d17, d16\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 5\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt d2, d17, d16\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.d[0], v2.d[0]\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 6\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge d2, d17, d16\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.d[0], v2.d[0]\"\n      ]\n    },\n    \"cmpsd xmm0, xmm1, 7\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xf2 0x0f 0xc2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge d0, d16, d17\",\n        \"fcmgt d1, d17, d16\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"addsubps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf2 0x0f 0xd0\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3040]\",\n        \"eor v2.16b, v17.16b, v2.16b\",\n        \"fadd v16.4s, v16.4s, v2.4s\"\n      ]\n    },\n    \"movdq2q mm0, xmm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0xf2 0x0f 0xd6\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"str d16, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"cvtpd2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf2 0x0f 0xe6\",\n      \"ExpectedArm64ASM\": [\n        \"frint32x v2.2d, v17.2d\",\n        \"fcvtzs v2.2d, v2.2d\",\n        \"xtn v16.2s, v2.2d\"\n      ]\n    },\n    \"lddqu xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": \"0xf2 0x0f 0xf0\",\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Secondary_REPNE_FCMA.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FCMA\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"addsubps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf2 0x0f 0xd0\",\n      \"ExpectedArm64ASM\": [\n        \"rev64 v2.4s, v17.4s\",\n        \"fcadd v16.4s, v16.4s, v2.4s, #90\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Secondary_REPNE_SVE128.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\",\n      \"FRINTTS\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE256\",\n      \"FCMA\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"cvtpd2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf2 0x0f 0xe6\",\n      \"ExpectedArm64ASM\": [\n        \"frint32x v2.2d, v17.2d\",\n        \"fcvtzs v2.2d, v2.2d\",\n        \"xtn v16.2s, v2.2d\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Secondary_REP_FRINTTS.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"FRINTTS\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"RPRES\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ]\n  },\n  \"Instructions\": {\n    \"cvttss2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf3 0x0f 0x2c\",\n      \"ExpectedArm64ASM\": [\n        \"frint32z s2, s16\",\n        \"fcvtzs w4, s2\"\n      ]\n    },\n    \"cvttss2si eax, dword [rbx]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf3 0x0f 0x2c\",\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x6]\",\n        \"frint32z s2, s2\",\n        \"fcvtzs w4, s2\"\n      ]\n    },\n    \"cvttss2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf3 0x0f 0x2c\",\n      \"ExpectedArm64ASM\": [\n        \"frint64z s2, s16\",\n        \"fcvtzs x4, s2\"\n      ]\n    },\n    \"cvttss2si rax, dword [rbx]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf3 0x0f 0x2c\",\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x6]\",\n        \"frint64z s2, s2\",\n        \"fcvtzs x4, s2\"\n      ]\n    },\n    \"cvtss2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf3 0x0f 0x2d\",\n      \"ExpectedArm64ASM\": [\n        \"frint32x s2, s16\",\n        \"fcvtzs w4, s2\"\n      ]\n    },\n    \"cvtss2si eax, dword [rbx]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf3 0x0f 0x2d\",\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x6]\",\n        \"frint32x s2, s2\",\n        \"fcvtzs w4, s2\"\n      ]\n    },\n    \"cvtss2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf3 0x0f 0x2d\",\n      \"ExpectedArm64ASM\": [\n        \"frint64x s2, s16\",\n        \"fcvtzs x4, s2\"\n      ]\n    },\n    \"cvtss2si rax, dword [rbx]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": \"0xf3 0x0f 0x2d\",\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x6]\",\n        \"frint64x s2, s2\",\n        \"fcvtzs x4, s2\"\n      ]\n    },\n    \"cvttps2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": \"0xf3 0x0f 0x5b\",\n      \"ExpectedArm64ASM\": [\n        \"frint32z v2.4s, v17.4s\",\n        \"fcvtzs v16.4s, v2.4s\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/Secondary_SVE128.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE256\",\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"movmskps eax, xmm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0x50\",\n      \"ExpectedArm64ASM\": [\n        \"ushr v2.4s, v16.4s, #31\",\n        \"index z3.s, #0, #1\",\n        \"ushl v2.4s, v2.4s, v3.4s\",\n        \"addv s2, v2.4s\",\n        \"mov w4, v2.s[0]\"\n      ]\n    },\n    \"movmskps rax, xmm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": \"0x0f 0x50\",\n      \"ExpectedArm64ASM\": [\n        \"ushr v2.4s, v16.4s, #31\",\n        \"index z3.s, #0, #1\",\n        \"ushl v2.4s, v2.4s, v3.4s\",\n        \"addv s2, v2.4s\",\n        \"mov w4, v2.s[0]\"\n      ]\n    },\n    \"psrlw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xd1\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"lsr z2.h, p6/m, z2.h, z3.d\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrld mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xd2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"lsr z2.s, p6/m, z2.s, z3.d\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrlq mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xd3\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"lsr z2.d, p6/m, z2.d, z3.d\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psraw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xe1\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"asr z2.h, p6/m, z2.h, z3.d\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psrad mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xe2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"asr z2.s, p6/m, z2.s, z3.d\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psllw mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xf1\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"lsl z2.h, p6/m, z2.h, z3.d\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"pslld mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xf2\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"lsl z2.s, p6/m, z2.s, z3.d\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    },\n    \"psllq mm0, mm1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": \"0x0f 0xf3\",\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1051]\",\n        \"mov w20, #0xffff\",\n        \"strb w20, [x28, #1202]\",\n        \"ldr d2, [x28, #1056]\",\n        \"ldr d3, [x28, #1072]\",\n        \"lsl z2.d, p6/m, z2.d, z3.d\",\n        \"str d2, [x28, #1056]\",\n        \"strh w20, [x28, #1064]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/VEX_map1.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"FCMA\",\n      \"RPRES\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"FRINTTS\"\n    ]\n  },\n  \"Instructions\": {\n    \"vmovups xmm0, xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\"\n      ]\n    },\n    \"vmovups xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"SVE 128-bit load already zero's the upper bits\",\n        \"Map 1 0b00 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\"\n      ]\n    },\n    \"vmovups ymm0, ymm0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"Spurious moves\",\n        \"Map 1 0b00 0x10 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"vmovups ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x10 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1b {z16.b}, p7/z, [x4]\"\n      ]\n    },\n    \"vmovupd xmm0, xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\"\n      ]\n    },\n    \"vmovupd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"SVE 128-bit load already zero's the upper bits\",\n        \"Map 1 0b01 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\"\n      ]\n    },\n    \"vmovupd ymm0, ymm0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"Spurious moves\",\n        \"Map 1 0b01 0x10 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"vmovupd ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x10 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1b {z16.b}, p7/z, [x4]\"\n      ]\n    },\n    \"vmovss xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"32-bit vector load already zero's the upper bits\",\n        \"Map 1 0b10 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s16, [x4]\"\n      ]\n    },\n    \"vmovss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Insert in to first element could be more optimal, which is the common case.\",\n        \"Map 1 0b10 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[0], v18.s[0]\"\n      ]\n    },\n    \"vmovsd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"32-bit vector load already zero's the upper bits\",\n        \"Map 1 0b11 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d16, [x4]\"\n      ]\n    },\n    \"vmovsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Insert in to first element could be more optimal, which is the common case.\",\n        \"Map 1 0b11 0x10 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[0], v18.d[0]\"\n      ]\n    },\n    \"vmovups [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x11 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"vmovups [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x11 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1b {z16.b}, p7, [x4]\"\n      ]\n    },\n    \"vmovupd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x11 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"vmovupd [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x11 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1b {z16.b}, p7, [x4]\"\n      ]\n    },\n    \"vmovss [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b10 0x11 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str s16, [x4]\"\n      ]\n    },\n    \"db 0xc5, 0xf2, 0x11, 0xc2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"vmovss xmm2, xmm1, xmm0\",\n        \"Need to manually encode since nasm won't encode this\",\n        \"Insert in to first element could be more optimal, which is the common case.\",\n        \"Map 1 0b10 0x11 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v18.16b, v17.16b\",\n        \"mov v18.s[0], v16.s[0]\"\n      ]\n    },\n    \"vmovsd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b11 0x11 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str d16, [x4]\"\n      ]\n    },\n    \"db 0xc5, 0xf3, 0x11, 0xc2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"vmovsd xmm2, xmm1, xmm0\",\n        \"Need to manually encode since nasm won't encode this\",\n        \"Insert in to first element could be more optimal, which is the common case.\",\n        \"Map 1 0b11 0x11 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v18.16b, v17.16b\",\n        \"mov v18.d[0], v16.d[0]\"\n      ]\n    },\n    \"vmovlps xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Insert in to first element could be more optimal, which is the common case.\",\n        \"Map 1 0b00 0x12 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.d[1], v17.d[1]\"\n      ]\n    },\n    \"vmovlpd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Insert in to first element could be more optimal, which is the common case.\",\n        \"Map 1 0b01 0x12 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.d[1], v17.d[1]\"\n      ]\n    },\n    \"vmovsldup xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x12 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"trn1 v16.4s, v2.4s, v2.4s\"\n      ]\n    },\n    \"vmovsldup ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Could potentially be considered optimal.\",\n        \"Ideally the load happens directly in the destination register\",\n        \"This would lower memory pressure of this instruction by 1 temporary\",\n        \"But the more optimal implementation is still the same number of instructions\",\n        \"Map 1 0b10 0x12 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1b {z2.b}, p7/z, [x4]\",\n        \"trn1 z16.s, z2.s, z2.s\"\n      ]\n    },\n    \"vmovddup xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x12 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"dup v16.2d, v2.d[0]\"\n      ]\n    },\n    \"vmovddup ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Could potentially be considered optimal.\",\n        \"Ideally the load happens directly in the destination register\",\n        \"This would lower memory pressure of this instruction by 1 temporary\",\n        \"But the more optimal implementation is still the same number of instructions\",\n        \"Map 1 0b11 0x12 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1b {z2.b}, p7/z, [x4]\",\n        \"trn1 z16.d, z2.d, z2.d\"\n      ]\n    },\n    \"vmovlps [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x13 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str d16, [x4]\"\n      ]\n    },\n    \"vmovlpd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x13 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str d16, [x4]\"\n      ]\n    },\n    \"vunpcklps xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x14 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip1 v16.4s, v17.4s, v2.4s\"\n      ]\n    },\n    \"vunpcklps ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b00 0x14 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1b {z2.b}, p7/z, [x4]\",\n        \"zip1 z3.s, z17.s, z2.s\",\n        \"zip2 z2.s, z17.s, z2.s\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z3.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vunpcklpd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x14 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip1 v16.2d, v17.2d, v2.2d\"\n      ]\n    },\n    \"vunpcklpd ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b01 0x14 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1b {z2.b}, p7/z, [x4]\",\n        \"zip1 z3.d, z17.d, z2.d\",\n        \"zip2 z2.d, z17.d, z2.d\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z3.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vunpckhps xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x15 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip2 v16.4s, v17.4s, v2.4s\"\n      ]\n    },\n    \"vunpckhps ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b00 0x15 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1b {z2.b}, p7/z, [x4]\",\n        \"zip1 z3.s, z17.s, z2.s\",\n        \"zip2 z2.s, z17.s, z2.s\",\n        \"mov z1.q, z3.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vunpckhpd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x15 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip2 v16.2d, v17.2d, v2.2d\"\n      ]\n    },\n    \"vunpckhpd ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x15 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1b {z2.b}, p7/z, [x4]\",\n        \"zip1 z3.d, z17.d, z2.d\",\n        \"zip2 z2.d, z17.d, z2.d\",\n        \"mov z1.q, z3.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vmovhps xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.8b, v17.8b\",\n        \"ldr d3, [x4]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.d[1], v3.d[0]\"\n      ]\n    },\n    \"vmovhpd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.8b, v17.8b\",\n        \"ldr d3, [x4]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.d[1], v3.d[0]\"\n      ]\n    },\n    \"vmovlhps xmm0, xmm1, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.8b, v17.8b\",\n        \"mov v3.8b, v17.8b\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.d[1], v3.d[0]\"\n      ]\n    },\n    \"vmovshdup xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"trn2 v16.4s, v2.4s, v2.4s\"\n      ]\n    },\n    \"vmovshdup ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x16 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1b {z2.b}, p7/z, [x4]\",\n        \"trn2 z16.s, z2.s, z2.s\"\n      ]\n    },\n    \"vmovhps [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0x17 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov v2.d[0], v16.d[1]\",\n        \"str d2, [x4]\"\n      ]\n    },\n    \"vmovhpd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0x17 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov v2.d[0], v16.d[1]\",\n        \"str d2, [x4]\"\n      ]\n    },\n    \"vmovmskps rax, xmm0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x50 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ushr v2.4s, v16.4s, #31\",\n        \"index z3.s, #0, #1\",\n        \"ushl v2.4s, v2.4s, v3.4s\",\n        \"addv s2, v2.4s\",\n        \"mov w4, v2.s[0]\"\n      ]\n    },\n    \"vmovmskps rax, ymm0\": {\n      \"ExpectedInstructionCount\": 32,\n      \"Comment\": [\n        \"Map 1 0b00 0x50 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, v16.s[0]\",\n        \"lsr w20, w20, #31\",\n        \"mov w21, v16.s[1]\",\n        \"lsr w21, w21, #31\",\n        \"orr x20, x20, x21, lsl #1\",\n        \"mov w21, v16.s[2]\",\n        \"lsr w21, w21, #31\",\n        \"orr x20, x20, x21, lsl #2\",\n        \"mov w21, v16.s[3]\",\n        \"lsr w21, w21, #31\",\n        \"orr x20, x20, x21, lsl #3\",\n        \"not p0.b, p7/z, p6.b\",\n        \"compact z0.d, p0, z16.d\",\n        \"mov w21, v16.s[0]\",\n        \"lsr w21, w21, #31\",\n        \"orr x20, x20, x21, lsl #4\",\n        \"not p0.b, p7/z, p6.b\",\n        \"compact z0.d, p0, z16.d\",\n        \"mov w21, v16.s[1]\",\n        \"lsr w21, w21, #31\",\n        \"orr x20, x20, x21, lsl #5\",\n        \"not p0.b, p7/z, p6.b\",\n        \"compact z0.d, p0, z16.d\",\n        \"mov w21, v16.s[2]\",\n        \"lsr w21, w21, #31\",\n        \"orr x20, x20, x21, lsl #6\",\n        \"not p0.b, p7/z, p6.b\",\n        \"compact z0.d, p0, z16.d\",\n        \"mov w21, v16.s[3]\",\n        \"lsr w21, w21, #31\",\n        \"orr x20, x20, x21, lsl #7\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"vmovmskpd rax, xmm0\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x50 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp2 v2.4s, v16.4s, v16.4s\",\n        \"mov x20, v2.d[0]\",\n        \"bfi x20, x20, #31, #32\",\n        \"lsr x4, x20, #62\"\n      ]\n    },\n    \"vmovmskpd rax, ymm0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 1 0b01 0x50 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, v16.d[0]\",\n        \"lsr x20, x20, #63\",\n        \"mov x21, v16.d[1]\",\n        \"lsr x21, x21, #63\",\n        \"orr x20, x20, x21, lsl #1\",\n        \"not p0.b, p7/z, p6.b\",\n        \"compact z0.d, p0, z16.d\",\n        \"mov x21, v16.d[0]\",\n        \"lsr x21, x21, #63\",\n        \"orr x20, x20, x21, lsl #2\",\n        \"not p0.b, p7/z, p6.b\",\n        \"compact z0.d, p0, z16.d\",\n        \"mov x21, v16.d[1]\",\n        \"lsr x21, x21, #63\",\n        \"orr x20, x20, x21, lsl #3\",\n        \"mov w4, w20\"\n      ]\n    },\n    \"vsqrtps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x51 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsqrt v16.4s, v17.4s\"\n      ]\n    },\n    \"vsqrtps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x51 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsqrt z16.s, p7/m, z17.s\"\n      ]\n    },\n    \"vsqrtpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x51 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsqrt v16.2d, v17.2d\"\n      ]\n    },\n    \"vsqrtpd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x51 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsqrt z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vsqrtss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0x51 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fsqrt s0, s18\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vsqrtsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0x51 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fsqrt d0, d18\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vrsqrtps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0x52 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov v0.4s, #0x70 (1.0000)\",\n        \"fsqrt v1.4s, v17.4s\",\n        \"fdiv v16.4s, v0.4s, v1.4s\"\n      ]\n    },\n    \"vrsqrtps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0x52 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsqrt z0.s, p7/m, z17.s\",\n        \"fmov z16.s, #0x70 (1.0000)\",\n        \"fdiv z16.s, p7/m, z16.s, z0.s\"\n      ]\n    },\n    \"vrsqrtss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b10 0x52 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmov s0, #0x70 (1.0000)\",\n        \"fsqrt s1, s18\",\n        \"fdiv s0, s0, s1\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vrcpps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x53 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov v0.4s, #0x70 (1.0000)\",\n        \"fdiv v16.4s, v0.4s, v17.4s\"\n      ]\n    },\n    \"vrcpps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0x53 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov z0.s, #0x70 (1.0000)\",\n        \"fdiv z0.s, p7/m, z0.s, z17.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vrcpss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0x53 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmov s0, #0x70 (1.0000)\",\n        \"fdiv s0, s0, s18\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vandps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x54 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"vandps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x54 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and z16.d, z16.d, z17.d\"\n      ]\n    },\n    \"vandpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x54 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"vandpd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x54 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and z16.d, z16.d, z17.d\"\n      ]\n    },\n    \"vandnps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x55 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"bic v16.16b, v17.16b, v16.16b\"\n      ]\n    },\n    \"vandnps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x55 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"bic z16.d, z17.d, z16.d\"\n      ]\n    },\n    \"vandnpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x55 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"bic v16.16b, v17.16b, v16.16b\"\n      ]\n    },\n    \"vandnpd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x55 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"bic z16.d, z17.d, z16.d\"\n      ]\n    },\n    \"vorps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x56 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"vorps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x56 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr z16.d, z16.d, z17.d\"\n      ]\n    },\n    \"vorpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x56 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"vorpd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x56 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr z16.d, z16.d, z17.d\"\n      ]\n    },\n    \"vxorps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x57 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"vxorps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x57 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor z16.d, z16.d, z17.d\"\n      ]\n    },\n    \"vxorpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x57 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor v16.16b, v16.16b, v17.16b\"\n      ]\n    },\n    \"vxorpd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x57 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor z16.d, z16.d, z17.d\"\n      ]\n    },\n    \"vxorps xmm0, xmm1, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"xor with itself to get zero register\",\n        \"Map 1 0b00 0x57 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vxorps ymm0, ymm1, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"xor with itself to get zero register\",\n        \"Map 1 0b00 0x57 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vxorpd xmm0, xmm1, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"xor with itself to get zero register\",\n        \"Map 1 0b01 0x57 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vxorpd ymm0, ymm1, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"xor with itself to get zero register\",\n        \"Map 1 0b01 0x57 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpunpcklbw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x60 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpunpcklbw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x60 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 z2.b, z17.b, z18.b\",\n        \"zip2 z3.b, z17.b, z18.b\",\n        \"mov z1.q, q3\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vpunpcklwd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x61 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpunpcklwd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x61 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 z2.h, z17.h, z18.h\",\n        \"zip2 z3.h, z17.h, z18.h\",\n        \"mov z1.q, q3\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vpunpckldq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x62 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vpunpckldq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x62 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 z2.s, z17.s, z18.s\",\n        \"zip2 z3.s, z17.s, z18.s\",\n        \"mov z1.q, q3\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vpacksswb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x63 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqxtn v16.8b, v17.8h\",\n        \"sqxtn2 v16.16b, v18.8h\"\n      ]\n    },\n    \"vpacksswb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 1 0b01 0x63 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqxtnb z1.b, z18.h\",\n        \"uzp1 z1.b, z1.b, z1.b\",\n        \"sqxtnb z2.b, z17.h\",\n        \"uzp1 z2.b, z2.b, z2.b\",\n        \"splice z2.b, p6, z2.b, z1.b\",\n        \"mov z1.d, z2.d[1]\",\n        \"mov z3.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z3.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z2.d[2]\",\n        \"mov z16.d, z3.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpcmpgtb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x64 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmgt v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpcmpgtb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x64 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x0, nzcv\",\n        \"cmpgt p0.b, p7/z, z17.b, z18.b\",\n        \"not z0.b, p0/m, z17.b\",\n        \"movprfx z16.b, p0/z, z17.b\",\n        \"orr z16.b, p0/m, z16.b, z0.b\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpcmpgtw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x65 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmgt v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpcmpgtw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x65 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x0, nzcv\",\n        \"cmpgt p0.h, p7/z, z17.h, z18.h\",\n        \"not z0.h, p0/m, z17.h\",\n        \"movprfx z16.h, p0/z, z17.h\",\n        \"orr z16.h, p0/m, z16.h, z0.h\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpcmpgtd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x66 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmgt v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vpcmpgtd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x66 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x0, nzcv\",\n        \"cmpgt p0.s, p7/z, z17.s, z18.s\",\n        \"not z0.s, p0/m, z17.s\",\n        \"movprfx z16.s, p0/z, z17.s\",\n        \"orr z16.s, p0/m, z16.s, z0.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpackuswb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x67 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqxtun v16.8b, v17.8h\",\n        \"sqxtun2 v16.16b, v18.8h\"\n      ]\n    },\n    \"vpackuswb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 1 0b01 0x67 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqxtunb z1.b, z18.h\",\n        \"uzp1 z1.b, z1.b, z1.b\",\n        \"sqxtunb z2.b, z17.h\",\n        \"uzp1 z2.b, z2.b, z2.b\",\n        \"splice z2.b, p6, z2.b, z1.b\",\n        \"mov z1.d, z2.d[1]\",\n        \"mov z3.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z3.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z2.d[2]\",\n        \"mov z16.d, z3.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpshufd xmm0, xmm1, 00b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"mov v2.s[0], v17.s[0]\",\n        \"mov v2.s[1], v17.s[0]\",\n        \"mov v2.s[2], v17.s[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.s[3], v17.s[0]\"\n      ]\n    },\n    \"vpshufd xmm0, xmm1, 01b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"mov v2.s[0], v17.s[1]\",\n        \"mov v2.s[1], v17.s[0]\",\n        \"mov v2.s[2], v17.s[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.s[3], v17.s[0]\"\n      ]\n    },\n    \"vpshufd xmm0, xmm1, 10b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"mov v2.s[0], v17.s[2]\",\n        \"mov v2.s[1], v17.s[0]\",\n        \"mov v2.s[2], v17.s[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.s[3], v17.s[0]\"\n      ]\n    },\n    \"vpshufd xmm0, xmm1, 11b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"mov v2.s[0], v17.s[3]\",\n        \"mov v2.s[1], v17.s[0]\",\n        \"mov v2.s[2], v17.s[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.s[3], v17.s[0]\"\n      ]\n    },\n    \"vpshufd ymm0, ymm1, 00b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.s, s17\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpshufd ymm0, ymm1, 01b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.s, z17.s[1]\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[5]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpshufd ymm0, ymm1, 10b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.s, z17.s[2]\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[6]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpshufd ymm0, ymm1, 11b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b01 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.s, z17.s[3]\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[7]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpshufhw xmm0, xmm1, 00b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"mov v2.h[4], v17.h[4]\",\n        \"mov v2.h[5], v17.h[4]\",\n        \"mov v2.h[6], v17.h[4]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.h[7], v17.h[4]\"\n      ]\n    },\n    \"vpshufhw xmm0, xmm1, 01b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"mov v2.h[4], v17.h[5]\",\n        \"mov v2.h[5], v17.h[4]\",\n        \"mov v2.h[6], v17.h[4]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.h[7], v17.h[4]\"\n      ]\n    },\n    \"vpshufhw xmm0, xmm1, 10b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"mov v2.h[4], v17.h[6]\",\n        \"mov v2.h[5], v17.h[4]\",\n        \"mov v2.h[6], v17.h[4]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.h[7], v17.h[4]\"\n      ]\n    },\n    \"vpshufhw xmm0, xmm1, 11b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"mov v2.h[4], v17.h[7]\",\n        \"mov v2.h[5], v17.h[4]\",\n        \"mov v2.h[6], v17.h[4]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.h[7], v17.h[4]\"\n      ]\n    },\n    \"vpshufhw ymm0, ymm1, 00b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.h, z17.h[4]\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-4\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[12]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #4\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-3\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[12]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #5\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-2\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[12]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #6\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-1\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[12]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #7\",\n        \"mov z16.h, p0/m, z1.h\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpshufhw ymm0, ymm1, 01b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.h, z17.h[5]\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-4\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[13]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #4\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-3\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[12]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #5\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-2\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[12]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #6\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-1\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[12]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #7\",\n        \"mov z16.h, p0/m, z1.h\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpshufhw ymm0, ymm1, 10b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.h, z17.h[6]\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-4\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[14]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #4\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-3\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[12]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #5\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-2\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[12]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #6\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-1\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[12]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #7\",\n        \"mov z16.h, p0/m, z1.h\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpshufhw ymm0, ymm1, 11b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b10 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.h, z17.h[7]\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-4\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[15]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #4\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-3\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[12]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #5\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-2\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[12]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #6\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-1\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[12]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #7\",\n        \"mov z16.h, p0/m, z1.h\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpshuflw xmm0, xmm1, 00b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"mov v2.h[0], v17.h[0]\",\n        \"mov v2.h[1], v17.h[0]\",\n        \"mov v2.h[2], v17.h[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.h[3], v17.h[0]\"\n      ]\n    },\n    \"vpshuflw xmm0, xmm1, 01b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"mov v2.h[0], v17.h[1]\",\n        \"mov v2.h[1], v17.h[0]\",\n        \"mov v2.h[2], v17.h[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.h[3], v17.h[0]\"\n      ]\n    },\n    \"vpshuflw xmm0, xmm1, 10b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"mov v2.h[0], v17.h[2]\",\n        \"mov v2.h[1], v17.h[0]\",\n        \"mov v2.h[2], v17.h[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.h[3], v17.h[0]\"\n      ]\n    },\n    \"vpshuflw xmm0, xmm1, 11b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"mov v2.h[0], v17.h[3]\",\n        \"mov v2.h[1], v17.h[0]\",\n        \"mov v2.h[2], v17.h[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.h[3], v17.h[0]\"\n      ]\n    },\n    \"vpshuflw ymm0, ymm1, 00b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.h, h17\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-8\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[8]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #0\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, h17\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-7\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[8]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #1\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, h17\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-6\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[8]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #2\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, h17\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-5\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[8]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #3\",\n        \"mov z16.h, p0/m, z1.h\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpshuflw ymm0, ymm1, 01b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.h, z17.h[1]\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-8\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[9]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #0\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, h17\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-7\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[8]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #1\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, h17\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-6\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[8]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #2\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, h17\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-5\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[8]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #3\",\n        \"mov z16.h, p0/m, z1.h\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpshuflw ymm0, ymm1, 10b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.h, z17.h[2]\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-8\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[10]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #0\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, h17\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-7\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[8]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #1\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, h17\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-6\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[8]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #2\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, h17\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-5\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[8]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #3\",\n        \"mov z16.h, p0/m, z1.h\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpshuflw ymm0, ymm1, 11b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b11 0x70 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.h, z17.h[3]\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-8\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[11]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #0\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, h17\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-7\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[8]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #1\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, h17\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-6\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[8]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #2\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, h17\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-5\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[8]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #3\",\n        \"mov z16.h, p0/m, z1.h\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpcmpeqb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x74 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmeq v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpcmpeqb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x74 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x0, nzcv\",\n        \"cmpeq p0.b, p7/z, z17.b, z18.b\",\n        \"not z0.b, p0/m, z17.b\",\n        \"movprfx z16.b, p0/z, z17.b\",\n        \"orr z16.b, p0/m, z16.b, z0.b\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpcmpeqw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x75 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmeq v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpcmpeqw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x75 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x0, nzcv\",\n        \"cmpeq p0.h, p7/z, z17.h, z18.h\",\n        \"not z0.h, p0/m, z17.h\",\n        \"movprfx z16.h, p0/z, z17.h\",\n        \"orr z16.h, p0/m, z16.h, z0.h\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpcmpeqd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x76 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmeq v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vpcmpeqd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x76 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x0, nzcv\",\n        \"cmpeq p0.s, p7/z, z17.s, z18.s\",\n        \"not z0.s, p0/m, z17.s\",\n        \"movprfx z16.s, p0/z, z17.s\",\n        \"orr z16.s, p0/m, z16.s, z0.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vzeroupper\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Might need to revisit this if move renaming ends up slower than some other clearing\",\n        \"Map 1 0b01 0x77 L=0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"mov v17.16b, v17.16b\",\n        \"mov v18.16b, v18.16b\",\n        \"mov v19.16b, v19.16b\",\n        \"mov v20.16b, v20.16b\",\n        \"mov v21.16b, v21.16b\",\n        \"mov v22.16b, v22.16b\",\n        \"mov v23.16b, v23.16b\",\n        \"mov v24.16b, v24.16b\",\n        \"mov v25.16b, v25.16b\",\n        \"mov v26.16b, v26.16b\",\n        \"mov v27.16b, v27.16b\",\n        \"mov v28.16b, v28.16b\",\n        \"mov v29.16b, v29.16b\",\n        \"mov v30.16b, v30.16b\",\n        \"mov v31.16b, v31.16b\"\n      ]\n    },\n    \"vzeroall\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 1 0b01 0x77 L=1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\",\n        \"movi v17.2d, #0x0\",\n        \"movi v18.2d, #0x0\",\n        \"movi v19.2d, #0x0\",\n        \"movi v20.2d, #0x0\",\n        \"movi v21.2d, #0x0\",\n        \"movi v22.2d, #0x0\",\n        \"movi v23.2d, #0x0\",\n        \"movi v24.2d, #0x0\",\n        \"movi v25.2d, #0x0\",\n        \"movi v26.2d, #0x0\",\n        \"movi v27.2d, #0x0\",\n        \"movi v28.2d, #0x0\",\n        \"movi v29.2d, #0x0\",\n        \"movi v30.2d, #0x0\",\n        \"movi v31.2d, #0x0\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x00\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x00\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq p0.s, p7/z, z17.s, z18.s\",\n        \"not z0.s, p0/m, z17.s\",\n        \"movprfx z16.s, p0/z, z17.s\",\n        \"orr z16.s, p0/m, z16.s, z0.s\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x01\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v16.4s, v18.4s, v17.4s\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x01\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt p0.s, p7/z, z18.s, z17.s\",\n        \"not z0.s, p0/m, z18.s\",\n        \"movprfx z16.s, p0/z, z18.s\",\n        \"orr z16.s, p0/m, z16.s, z0.s\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x02\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v16.4s, v18.4s, v17.4s\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x02\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge p0.s, p7/z, z18.s, z17.s\",\n        \"not z0.s, p0/m, z18.s\",\n        \"movprfx z16.s, p0/z, z18.s\",\n        \"orr z16.s, p0/m, z16.s, z0.s\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x03\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v0.4s, v17.4s, v18.4s\",\n        \"fcmgt v1.4s, v18.4s, v17.4s\",\n        \"orr v16.16b, v0.16b, v1.16b\",\n        \"mvn v16.16b, v16.16b\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x03\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmuo p0.s, p7/z, z17.s, z18.s\",\n        \"not z0.s, p0/m, z17.s\",\n        \"movprfx z16.s, p0/z, z17.s\",\n        \"orr z16.s, p0/m, z16.s, z0.s\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x04\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq v16.4s, v17.4s, v18.4s\",\n        \"mvn v16.16b, v16.16b\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x04\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmne p0.s, p7/z, z17.s, z18.s\",\n        \"not z0.s, p0/m, z17.s\",\n        \"movprfx z16.s, p0/z, z17.s\",\n        \"orr z16.s, p0/m, z16.s, z0.s\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x05\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v2.4s, v18.4s, v17.4s\",\n        \"mvn v16.16b, v2.16b\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x05\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt p0.s, p7/z, z18.s, z17.s\",\n        \"not z0.s, p0/m, z18.s\",\n        \"movprfx z2.s, p0/z, z18.s\",\n        \"orr z2.s, p0/m, z2.s, z0.s\",\n        \"not z16.b, p7/m, z2.b\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x06\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v2.4s, v18.4s, v17.4s\",\n        \"mvn v16.16b, v2.16b\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x06\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge p0.s, p7/z, z18.s, z17.s\",\n        \"not z0.s, p0/m, z18.s\",\n        \"movprfx z2.s, p0/z, z18.s\",\n        \"orr z2.s, p0/m, z2.s, z0.s\",\n        \"not z16.b, p7/m, z2.b\"\n      ]\n    },\n    \"vcmpps xmm0, xmm1, xmm2, 0x07\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v0.4s, v17.4s, v18.4s\",\n        \"fcmgt v1.4s, v18.4s, v17.4s\",\n        \"orr v16.16b, v0.16b, v1.16b\"\n      ]\n    },\n    \"vcmpps ymm0, ymm1, ymm2, 0x07\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmuo p0.s, p7/z, z17.s, z18.s\",\n        \"not p0.b, p7/z, p0.b\",\n        \"not z0.s, p0/m, z17.s\",\n        \"movprfx z16.s, p0/z, z17.s\",\n        \"orr z16.s, p0/m, z16.s, z0.s\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x00\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq v16.2d, v17.2d, v18.2d\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x00\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq p0.d, p7/z, z17.d, z18.d\",\n        \"not z0.d, p0/m, z17.d\",\n        \"movprfx z16.d, p0/z, z17.d\",\n        \"orr z16.d, p0/m, z16.d, z0.d\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x01\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v16.2d, v18.2d, v17.2d\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x01\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt p0.d, p7/z, z18.d, z17.d\",\n        \"not z0.d, p0/m, z18.d\",\n        \"movprfx z16.d, p0/z, z18.d\",\n        \"orr z16.d, p0/m, z16.d, z0.d\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x02\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v16.2d, v18.2d, v17.2d\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x02\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge p0.d, p7/z, z18.d, z17.d\",\n        \"not z0.d, p0/m, z18.d\",\n        \"movprfx z16.d, p0/z, z18.d\",\n        \"orr z16.d, p0/m, z16.d, z0.d\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x03\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v0.2d, v17.2d, v18.2d\",\n        \"fcmgt v1.2d, v18.2d, v17.2d\",\n        \"orr v16.16b, v0.16b, v1.16b\",\n        \"mvn v16.16b, v16.16b\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x03\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmuo p0.d, p7/z, z17.d, z18.d\",\n        \"not z0.d, p0/m, z17.d\",\n        \"movprfx z16.d, p0/z, z17.d\",\n        \"orr z16.d, p0/m, z16.d, z0.d\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x04\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmeq v16.2d, v17.2d, v18.2d\",\n        \"mvn v16.16b, v16.16b\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x04\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmne p0.d, p7/z, z17.d, z18.d\",\n        \"not z0.d, p0/m, z17.d\",\n        \"movprfx z16.d, p0/z, z17.d\",\n        \"orr z16.d, p0/m, z16.d, z0.d\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x05\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v2.2d, v18.2d, v17.2d\",\n        \"mvn v16.16b, v2.16b\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x05\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt p0.d, p7/z, z18.d, z17.d\",\n        \"not z0.d, p0/m, z18.d\",\n        \"movprfx z2.d, p0/z, z18.d\",\n        \"orr z2.d, p0/m, z2.d, z0.d\",\n        \"not z16.b, p7/m, z2.b\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x06\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v2.2d, v18.2d, v17.2d\",\n        \"mvn v16.16b, v2.16b\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x06\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge p0.d, p7/z, z18.d, z17.d\",\n        \"not z0.d, p0/m, z18.d\",\n        \"movprfx z2.d, p0/z, z18.d\",\n        \"orr z2.d, p0/m, z2.d, z0.d\",\n        \"not z16.b, p7/m, z2.b\"\n      ]\n    },\n    \"vcmppd xmm0, xmm1, xmm2, 0x07\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge v0.2d, v17.2d, v18.2d\",\n        \"fcmgt v1.2d, v18.2d, v17.2d\",\n        \"orr v16.16b, v0.16b, v1.16b\"\n      ]\n    },\n    \"vcmppd ymm0, ymm1, ymm2, 0x07\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xC2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmuo p0.d, p7/z, z17.d, z18.d\",\n        \"not p0.b, p7/z, p0.b\",\n        \"not z0.d, p0/m, z17.d\",\n        \"movprfx z16.d, p0/z, z17.d\",\n        \"orr z16.d, p0/m, z16.d, z0.d\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x00\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmeq s0, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x01\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmgt s0, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x02\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge s0, s18, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x03\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge s0, s17, s18\",\n        \"fcmgt s1, s18, s17\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x04\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmeq s0, s18, s17\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x05\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt s2, s18, s17\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[0], v2.s[0]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x06\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge s2, s18, s17\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[0], v2.s[0]\"\n      ]\n    },\n    \"vcmpss xmm0, xmm1, xmm2, 0x07\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b10 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge s0, s17, s18\",\n        \"fcmgt s1, s18, s17\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x00\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmeq d0, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x01\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmgt d0, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x02\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge d0, d18, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x03\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge d0, d17, d18\",\n        \"fcmgt d1, d18, d17\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x04\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmeq d0, d18, d17\",\n        \"mvn v0.8b, v0.8b\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x05\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt d2, d18, d17\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[0], v2.d[0]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x06\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmge d2, d18, d17\",\n        \"mvn v2.16b, v2.16b\",\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[0], v2.d[0]\"\n      ]\n    },\n    \"vcmpsd xmm0, xmm1, xmm2, 0x07\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b11 0xC2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcmge d0, d17, d18\",\n        \"fcmgt d1, d18, d17\",\n        \"orr v0.8b, v0.8b, v1.8b\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vpinsrw xmm0, xmm0, eax, 000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xC4 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov v2.h[0], w4\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpinsrw xmm0, xmm1, eax, 000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xC4 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.h[0], w4\"\n      ]\n    },\n    \"vpinsrw xmm0, xmm1, eax, 001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xC4 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.h[1], w4\"\n      ]\n    },\n    \"vpinsrw xmm0, xmm1, eax, 111b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xC4 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.h[7], w4\"\n      ]\n    },\n    \"vpextrw eax, xmm0, 000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[0]\"\n      ]\n    },\n    \"vpextrw eax, xmm0, 001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[1]\"\n      ]\n    },\n    \"vpextrw eax, xmm0, 111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[7]\"\n      ]\n    },\n    \"vpextrw [rax], xmm0, 000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[0], [x4]\"\n      ]\n    },\n    \"vpextrw [rax], xmm0, 001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[1], [x4]\"\n      ]\n    },\n    \"vpextrw [rax], xmm0, 111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[7], [x4]\"\n      ]\n    },\n    \"vshufps xmm0, xmm1, xmm2, 00b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v17.s[0]\",\n        \"dup v3.4s, v18.s[0]\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"vshufps ymm0, ymm1, ymm2, 00b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.s, s17\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s18\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z18.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s18\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z18.s[4]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vshufps xmm0, xmm1, xmm2, 01b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2688]\",\n        \"ldr q2, [x0, #16]\",\n        \"tbl v16.16b, {v17.16b, v18.16b}, v2.16b\"\n      ]\n    },\n    \"vshufps ymm0, ymm1, ymm2, 01b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.s, z17.s[1]\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[5]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s18\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z18.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s18\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z18.s[4]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vshufps xmm0, xmm1, xmm2, 10b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2688]\",\n        \"ldr q2, [x0, #32]\",\n        \"tbl v16.16b, {v17.16b, v18.16b}, v2.16b\"\n      ]\n    },\n    \"vshufps ymm0, ymm1, ymm2, 10b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.s, z17.s[2]\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[6]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s18\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z18.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s18\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z18.s[4]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vshufps xmm0, xmm1, xmm2, 11b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2688]\",\n        \"ldr q2, [x0, #48]\",\n        \"tbl v16.16b, {v17.16b, v18.16b}, v2.16b\"\n      ]\n    },\n    \"vshufps ymm0, ymm1, ymm2, 11b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 1 0b00 0xC6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.s, z17.s[3]\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[7]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s18\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z18.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s18\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z18.s[4]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vshufpd xmm0, xmm1, xmm2, 0b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.2d, v17.2d, v18.2d\"\n      ]\n    },\n    \"vshufpd ymm0, ymm1, ymm2, 0b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 1 0b01 0xC6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.d, d17\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d18\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[2]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vshufpd xmm0, xmm1, xmm2, 1b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xC6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ext v16.16b, v17.16b, v18.16b, #8\"\n      ]\n    },\n    \"vshufpd ymm0, ymm1, ymm2, 1b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 1 0b01 0xC6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.d, z17.d[1]\",\n        \"mov z2.d, z17.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d18\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[2]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vmovaps xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x28 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\"\n      ]\n    },\n    \"vmovaps ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x28 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1b {z16.b}, p7/z, [x4]\"\n      ]\n    },\n    \"vmovaps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x29 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vmovaps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x29 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vmovapd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x28 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\"\n      ]\n    },\n    \"vmovapd ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x28 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1b {z16.b}, p7/z, [x4]\"\n      ]\n    },\n    \"vmovapd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x29 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vmovapd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x29 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vmovaps [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x29 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"vmovaps [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x29 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1b {z16.b}, p7, [x4]\"\n      ]\n    },\n    \"vmovapd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x29 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"vmovapd [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x29 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1b {z16.b}, p7, [x4]\"\n      ]\n    },\n    \"vcvtsi2ss xmm0, xmm1, eax\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"scvtf s0, w4\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vcvtsi2ss xmm0, xmm1, rax\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"scvtf s0, x4\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vcvtsi2sd xmm0, xmm1, eax\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"scvtf d0, w4\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vcvtsi2sd xmm0, xmm1, rax\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0x2A 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"scvtf d0, x4\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vmovntps [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x2B 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stnt1b {z16.b}, p6, [x4]\"\n      ]\n    },\n    \"vmovntps [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x2B 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stnt1b {z16.b}, p7, [x4]\"\n      ]\n    },\n    \"vmovntpd [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x2B 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stnt1b {z16.b}, p6, [x4]\"\n      ]\n    },\n    \"vmovntpd [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x2B 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stnt1b {z16.b}, p7, [x4]\"\n      ]\n    },\n    \"vcvttss2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b10 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvtzs w20, s16\",\n        \"mov w21, #0x80000000\",\n        \"ldr s2, [x28, #3424]\",\n        \"mrs x22, nzcv\",\n        \"fcmp s2, s16\",\n        \"csel w4, w20, w21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"vcvttss2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b10 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvtzs x20, s16\",\n        \"mov x21, #0x8000000000000000\",\n        \"ldr s2, [x28, #3456]\",\n        \"mrs x22, nzcv\",\n        \"fcmp s2, s16\",\n        \"csel x4, x20, x21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"vcvttsd2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b11 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvtzs w20, d16\",\n        \"mov w21, #0x80000000\",\n        \"ldr d2, [x28, #3472]\",\n        \"mrs x22, nzcv\",\n        \"fcmp d2, d16\",\n        \"csel w4, w20, w21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"vcvttsd2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b11 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvtzs x20, d16\",\n        \"mov x21, #0x8000000000000000\",\n        \"ldr d2, [x28, #3504]\",\n        \"mrs x22, nzcv\",\n        \"fcmp d2, d16\",\n        \"csel x4, x20, x21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"vcvtss2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 1 0b10 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti s2, s16\",\n        \"fcvtzs w20, s2\",\n        \"mov w21, #0x80000000\",\n        \"ldr s3, [x28, #3424]\",\n        \"mrs x22, nzcv\",\n        \"fcmp s3, s2\",\n        \"csel w4, w20, w21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"vcvtss2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 1 0b10 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti s2, s16\",\n        \"fcvtzs x20, s2\",\n        \"mov x21, #0x8000000000000000\",\n        \"ldr s3, [x28, #3456]\",\n        \"mrs x22, nzcv\",\n        \"fcmp s3, s2\",\n        \"csel x4, x20, x21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"vcvtsd2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 1 0b11 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti d2, d16\",\n        \"fcvtzs w20, d2\",\n        \"mov w21, #0x80000000\",\n        \"ldr d3, [x28, #3472]\",\n        \"mrs x22, nzcv\",\n        \"fcmp d3, d2\",\n        \"csel w4, w20, w21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"vcvtsd2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 1 0b11 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti d2, d16\",\n        \"fcvtzs x20, d2\",\n        \"mov x21, #0x8000000000000000\",\n        \"ldr d3, [x28, #3504]\",\n        \"mrs x22, nzcv\",\n        \"fcmp d3, d2\",\n        \"csel x4, x20, x21, gt\",\n        \"msr nzcv, x22\"\n      ]\n    },\n    \"vucomiss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x2e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp s16, s17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"vucomisd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x2e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp d16, d17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"vcomiss xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x2f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp s16, s17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"vcomisd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x2f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmp d16, d17\",\n        \"cset x26, vc\",\n        \"mov w27, #0x0\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"vaddps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x58 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fadd v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vaddps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x58 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fadd z16.s, z17.s, z18.s\"\n      ]\n    },\n    \"vaddpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x58 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fadd v16.2d, v17.2d, v18.2d\"\n      ]\n    },\n    \"vaddpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x58 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fadd z16.d, z17.d, z18.d\"\n      ]\n    },\n    \"vaddss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0x58 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fadd s0, s17, s18\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vaddsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0x58 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fadd d0, d17, d18\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vmulps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x59 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vmulps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x59 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul z16.s, z17.s, z18.s\"\n      ]\n    },\n    \"vmulpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x59 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v16.2d, v17.2d, v18.2d\"\n      ]\n    },\n    \"vmulpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x59 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul z16.d, z17.d, z18.d\"\n      ]\n    },\n    \"vmulss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0x59 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmul s0, s17, s18\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vmulsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0x59 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fmul d0, d17, d18\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vcvtps2pd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvtl v2.2d, v17.2s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vcvtpd2ps xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"fcvtn v16.2s, v2.2d\"\n      ]\n    },\n    \"vcvtpd2ps xmm0, yword [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1b {z2.b}, p7/z, [x4]\",\n        \"fcvtnt z2.s, p7/m, z2.d\",\n        \"uzp2 z2.s, z2.s, z2.s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vcvtpd2ps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvtn v16.2s, v17.2d\"\n      ]\n    },\n    \"vcvtss2sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcvt d0, s18\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vcvtsd2ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0x5a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fcvt s0, d18\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vcvtdq2ps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x5b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"scvtf v16.4s, v17.4s\"\n      ]\n    },\n    \"vcvtdq2ps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x5b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"scvtf z16.s, p7/m, z17.s\"\n      ]\n    },\n    \"vcvtps2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b01 0x5b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti v2.4s, v17.4s\",\n        \"ldr q3, [x28, #3520]\",\n        \"ldr q4, [x28, #3424]\",\n        \"fcvtzs v5.4s, v2.4s\",\n        \"fcmgt v2.4s, v4.4s, v2.4s\",\n        \"mov v16.16b, v2.16b\",\n        \"bsl v16.16b, v5.16b, v3.16b\"\n      ]\n    },\n    \"vcvtps2dq ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 1 0b01 0x5b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti z2.s, p7/m, z17.s\",\n        \"ldr x0, [x28, #2608]\",\n        \"ld1b {z3.b}, p7/z, [x0]\",\n        \"ldr x0, [x28, #2560]\",\n        \"ld1b {z4.b}, p7/z, [x0]\",\n        \"fcvtzs z5.s, p7/m, z2.s\",\n        \"fcmgt p0.s, p7/z, z4.s, z2.s\",\n        \"not z0.s, p0/m, z4.s\",\n        \"movprfx z2.s, p0/z, z4.s\",\n        \"orr z2.s, p0/m, z2.s, z0.s\",\n        \"movprfx z0, z5\",\n        \"bsl z0.d, z0.d, z3.d, z2.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vcvttps2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0x5b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3520]\",\n        \"ldr q3, [x28, #3424]\",\n        \"fcvtzs v4.4s, v17.4s\",\n        \"fcmgt v3.4s, v3.4s, v17.4s\",\n        \"mov v16.16b, v3.16b\",\n        \"bsl v16.16b, v4.16b, v2.16b\"\n      ]\n    },\n    \"vcvttps2dq ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 1 0b10 0x5b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2608]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"ldr x0, [x28, #2560]\",\n        \"ld1b {z3.b}, p7/z, [x0]\",\n        \"fcvtzs z4.s, p7/m, z17.s\",\n        \"fcmgt p0.s, p7/z, z3.s, z17.s\",\n        \"not z0.s, p0/m, z3.s\",\n        \"movprfx z3.s, p0/z, z3.s\",\n        \"orr z3.s, p0/m, z3.s, z0.s\",\n        \"movprfx z0, z4\",\n        \"bsl z0.d, z0.d, z2.d, z3.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vsubps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x5c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsub v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vsubps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x5c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsub z16.s, z17.s, z18.s\"\n      ]\n    },\n    \"vsubpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x5c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsub v16.2d, v17.2d, v18.2d\"\n      ]\n    },\n    \"vsubpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x5c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fsub z16.d, z17.d, z18.d\"\n      ]\n    },\n    \"vsubss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0x5c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fsub s0, s17, s18\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vsubsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0x5c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fsub d0, d17, d18\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vminps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0x5d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v0.4s, v18.4s, v17.4s\",\n        \"mov v16.16b, v17.16b\",\n        \"bif v16.16b, v18.16b, v0.16b\"\n      ]\n    },\n    \"vminps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b00 0x5d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt p0.s, p7/z, z18.s, z17.s\",\n        \"not p0.b, p7/z, p0.b\",\n        \"mov z0.d, z17.d\",\n        \"mov z0.s, p0/m, z18.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vminpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0x5d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v0.2d, v18.2d, v17.2d\",\n        \"mov v16.16b, v17.16b\",\n        \"bif v16.16b, v18.16b, v0.16b\"\n      ]\n    },\n    \"vminpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x5d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt p0.d, p7/z, z18.d, z17.d\",\n        \"not p0.b, p7/z, p0.b\",\n        \"mov z0.d, z17.d\",\n        \"mov z0.d, p0/m, z18.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vminss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0x5d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v16.16b, v17.16b\",\n        \"fcmp s17, s18\",\n        \"fcsel s0, s17, s18, mi\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vminsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b11 0x5d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v16.16b, v17.16b\",\n        \"fcmp d17, d18\",\n        \"fcsel d0, d17, d18, mi\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vdivps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b00 0x5e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fdiv v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vdivps ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b00 0x5e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fdiv z16.s, p7/m, z16.s, z18.s\"\n      ]\n    },\n    \"vdivps ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b00 0x5e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z0, z17\",\n        \"fdiv z0.s, p7/m, z0.s, z16.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vdivps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b00 0x5e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"fdiv z16.s, p7/m, z16.s, z18.s\"\n      ]\n    },\n    \"vdivpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x5e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fdiv v16.2d, v17.2d, v18.2d\"\n      ]\n    },\n    \"vdivpd ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0x5e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z0, z17\",\n        \"fdiv z0.d, p7/m, z0.d, z16.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vdivpd ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0x5e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fdiv z16.d, p7/m, z16.d, z18.d\"\n      ]\n    },\n    \"vdivpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x5e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"fdiv z16.d, p7/m, z16.d, z18.d\"\n      ]\n    },\n    \"vdivss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b10 0x5e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fdiv s0, s17, s18\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vdivsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0x5e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"fdiv d0, d17, d18\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vmaxps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b00 0x5f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v0.4s, v18.4s, v17.4s\",\n        \"mov v16.16b, v17.16b\",\n        \"bit v16.16b, v18.16b, v0.16b\"\n      ]\n    },\n    \"vmaxps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b00 0x5f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt p0.s, p7/z, z18.s, z17.s\",\n        \"mov z0.d, z17.d\",\n        \"mov z0.s, p0/m, z18.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vmaxpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0x5f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt v0.2d, v18.2d, v17.2d\",\n        \"mov v16.16b, v17.16b\",\n        \"bit v16.16b, v18.16b, v0.16b\"\n      ]\n    },\n    \"vmaxpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x5f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcmgt p0.d, p7/z, z18.d, z17.d\",\n        \"mov z0.d, z17.d\",\n        \"mov z0.d, p0/m, z18.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vmaxss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b10 0x5f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v16.16b, v17.16b\",\n        \"fcmp s17, s18\",\n        \"fcsel s0, s17, s18, gt\",\n        \"mov v16.s[0], v0.s[0]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaxsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b11 0x5f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v16.16b, v17.16b\",\n        \"fcmp d17, d18\",\n        \"fcsel d0, d17, d18, gt\",\n        \"mov v16.d[0], v0.d[0]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpunpckhbw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x68 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpunpckhbw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x68 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 z2.b, z17.b, z18.b\",\n        \"zip2 z3.b, z17.b, z18.b\",\n        \"mov z1.q, z2.q[1]\",\n        \"mov z16.d, z3.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vpunpckhwd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x69 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpunpckhwd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x69 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 z2.h, z17.h, z18.h\",\n        \"zip2 z3.h, z17.h, z18.h\",\n        \"mov z1.q, z2.q[1]\",\n        \"mov z16.d, z3.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vpunpckhdq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x6a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vpunpckhdq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x6a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 z2.s, z17.s, z18.s\",\n        \"zip2 z3.s, z17.s, z18.s\",\n        \"mov z1.q, z2.q[1]\",\n        \"mov z16.d, z3.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vpackssdw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x6b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqxtn v16.4h, v17.4s\",\n        \"sqxtn2 v16.8h, v18.4s\"\n      ]\n    },\n    \"vpackssdw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 1 0b01 0x6b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqxtnb z1.h, z18.s\",\n        \"uzp1 z1.h, z1.h, z1.h\",\n        \"sqxtnb z2.h, z17.s\",\n        \"uzp1 z2.h, z2.h, z2.h\",\n        \"splice z2.h, p6, z2.h, z1.h\",\n        \"mov z1.d, z2.d[1]\",\n        \"mov z3.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z3.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z2.d[2]\",\n        \"mov z16.d, z3.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpunpcklqdq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x6c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 v16.2d, v17.2d, v18.2d\"\n      ]\n    },\n    \"vpunpcklqdq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 1 0b01 0x6c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 z2.d, z17.d, z18.d\",\n        \"zip2 z3.d, z17.d, z18.d\",\n        \"mov z1.q, q3\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vpunpckhqdq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x6d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip2 v16.2d, v17.2d, v18.2d\"\n      ]\n    },\n    \"vpunpckhqdq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0x6d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 z2.d, z17.d, z18.d\",\n        \"zip2 z3.d, z17.d, z18.d\",\n        \"mov z1.q, z2.q[1]\",\n        \"mov z16.d, z3.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vmovd xmm0, dword [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x6e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s16, [x4]\"\n      ]\n    },\n    \"vmovq xmm0, qword [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x6e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d16, [x4]\"\n      ]\n    },\n    \"vmovdqa xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x6f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\"\n      ]\n    },\n    \"vmovdqa [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x6f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"vmovdqu xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b10 0x6f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\"\n      ]\n    },\n    \"vmovdqu [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b10 0x6f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str q16, [x4]\"\n      ]\n    },\n    \"vhaddpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x7c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"faddp v16.2d, v17.2d, v18.2d\"\n      ]\n    },\n    \"vhaddpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 1 0b01 0x7c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z0, z17\",\n        \"faddp z0.d, p7/m, z0.d, z18.d\",\n        \"uzp1 z2.d, z0.d, z0.d\",\n        \"uzp2 z1.d, z0.d, z0.d\",\n        \"splice z2.d, p6, z2.d, z1.d\",\n        \"mov z1.d, z2.d[2]\",\n        \"mov z3.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z3.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z2.d[1]\",\n        \"mov z16.d, z3.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vhaddps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b11 0x7c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"faddp v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vhaddps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 1 0b11 0x7c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z0, z17\",\n        \"faddp z0.s, p7/m, z0.s, z18.s\",\n        \"uzp1 z2.s, z0.s, z0.s\",\n        \"uzp2 z1.s, z0.s, z0.s\",\n        \"splice z2.d, p6, z2.d, z1.d\",\n        \"mov z1.d, z2.d[2]\",\n        \"mov z3.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z3.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z2.d[1]\",\n        \"mov z16.d, z3.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vhsubpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0x7d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.2d, v17.2d, v18.2d\",\n        \"uzp2 v3.2d, v17.2d, v18.2d\",\n        \"fsub v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"vhsubpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 1 0b01 0x7d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 z2.d, z17.d, z18.d\",\n        \"uzp2 z3.d, z17.d, z18.d\",\n        \"fsub z2.d, z2.d, z3.d\",\n        \"mov z1.d, z2.d[2]\",\n        \"mov z3.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z3.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z2.d[1]\",\n        \"mov z16.d, z3.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vhsubps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0x7d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.4s, v17.4s, v18.4s\",\n        \"uzp2 v3.4s, v17.4s, v18.4s\",\n        \"fsub v16.4s, v2.4s, v3.4s\"\n      ]\n    },\n    \"vhsubps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 1 0b11 0x7d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 z2.s, z17.s, z18.s\",\n        \"uzp2 z3.s, z17.s, z18.s\",\n        \"fsub z2.s, z2.s, z3.s\",\n        \"mov z1.d, z2.d[2]\",\n        \"mov z3.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z3.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z2.d[1]\",\n        \"mov z16.d, z3.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vmovd dword [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0x7e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.2d, #0x0\",\n        \"mov v0.s[0], v16.s[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"str s2, [x4]\"\n      ]\n    },\n    \"vmovq qword [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x7e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str d16, [x4]\"\n      ]\n    },\n    \"vmovdqa ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x7f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1b {z16.b}, p7/z, [x4]\"\n      ]\n    },\n    \"vmovdqa [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0x7f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1b {z16.b}, p7, [x4]\"\n      ]\n    },\n    \"vmovdqu ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b10 0x7f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1b {z16.b}, p7/z, [x4]\"\n      ]\n    },\n    \"vmovdqu [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b10 0x7f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1b {z16.b}, p7, [x4]\"\n      ]\n    },\n    \"vaddsubpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xd0 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3072]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"fadd v16.2d, v17.2d, v2.2d\"\n      ]\n    },\n    \"vaddsubpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2384]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"eor z2.d, z18.d, z2.d\",\n        \"fadd z16.d, z17.d, z2.d\"\n      ]\n    },\n    \"vaddsubps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0xd0 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3040]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"fadd v16.4s, v17.4s, v2.4s\"\n      ]\n    },\n    \"vaddsubps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b11 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2368]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"eor z2.d, z18.d, z2.d\",\n        \"fadd z16.s, z17.s, z2.s\"\n      ]\n    },\n    \"vpsrlw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xd1 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z2, z17\",\n        \"lsr z2.h, p6/m, z2.h, z0.d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpsrlw ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xd1 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z16, z17\",\n        \"lsr z16.h, p7/m, z16.h, z0.d\"\n      ]\n    },\n    \"vpsrld xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xd2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z2, z17\",\n        \"lsr z2.s, p6/m, z2.s, z0.d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpsrld ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xd2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z16, z17\",\n        \"lsr z16.s, p7/m, z16.s, z0.d\"\n      ]\n    },\n    \"vpsrlq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xd3 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z2, z17\",\n        \"lsr z2.d, p6/m, z2.d, z0.d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpsrlq ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xd3 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z16, z17\",\n        \"lsr z16.d, p7/m, z16.d, z0.d\"\n      ]\n    },\n    \"vpaddq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xd4 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add v16.2d, v17.2d, v18.2d\"\n      ]\n    },\n    \"vpaddq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xd4 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add z16.d, z17.d, z18.d\"\n      ]\n    },\n    \"vpmullw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xd5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mul v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpmullw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xd4 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mul z16.h, z17.h, z18.h\"\n      ]\n    },\n    \"vmovq [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xd6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"str d16, [x4]\"\n      ]\n    },\n    \"vpmovmskb rax, xmm0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 1 0b01 0xd7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3296]\",\n        \"cmlt v3.16b, v16.16b, #0\",\n        \"and v2.16b, v3.16b, v2.16b\",\n        \"addp v2.16b, v2.16b, v2.16b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"umov w4, v2.h[0]\"\n      ]\n    },\n    \"vpmovmskb rax, ymm0\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 1 0b01 0xd7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2496]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"mrs x0, nzcv\",\n        \"mov z0.d, #0\",\n        \"cmplt p0.b, p7/z, z16.b, #0\",\n        \"not z0.b, p0/m, z16.b\",\n        \"orr z0.b, p0/m, z0.b, z16.b\",\n        \"mov z3.d, z0.d\",\n        \"msr nzcv, x0\",\n        \"and z2.d, z3.d, z2.d\",\n        \"movprfx z0, z2\",\n        \"addp z0.b, p7/m, z0.b, z2.b\",\n        \"uzp1 z2.b, z0.b, z0.b\",\n        \"uzp2 z1.b, z0.b, z0.b\",\n        \"splice z2.d, p6, z2.d, z1.d\",\n        \"addp v2.16b, v2.16b, v2.16b\",\n        \"addp v2.8b, v2.8b, v2.8b\",\n        \"mov w4, v2.s[0]\"\n      ]\n    },\n    \"vpsubusb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xd8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqsub v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpsubusb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xd8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqsub z16.b, z17.b, z18.b\"\n      ]\n    },\n    \"vpsubusw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xd9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqsub v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpsubusw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xd9 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqsub z16.h, z17.h, z18.h\"\n      ]\n    },\n    \"vpminub xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xda 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umin v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpminub ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xda 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umin z16.b, p7/m, z16.b, z17.b\"\n      ]\n    },\n    \"vpminub ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xda 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umin z16.b, p7/m, z16.b, z18.b\"\n      ]\n    },\n    \"vpminub ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xda 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"umin z16.b, p7/m, z16.b, z18.b\"\n      ]\n    },\n    \"vpand xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xdb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpand ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xdb 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and z16.d, z17.d, z18.d\"\n      ]\n    },\n    \"vpaddusb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xdc 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqadd v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpaddusb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xdc 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqadd z16.b, z17.b, z18.b\"\n      ]\n    },\n    \"vpaddusw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xdd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqadd v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpaddusw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xdd 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uqadd z16.h, z17.h, z18.h\"\n      ]\n    },\n    \"vpmaxub xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xdd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umax v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpmaxub ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xde 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umax z16.b, p7/m, z16.b, z18.b\"\n      ]\n    },\n    \"vpmaxub ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xde 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umax z16.b, p7/m, z16.b, z17.b\"\n      ]\n    },\n    \"vpmaxub ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xde 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"umax z16.b, p7/m, z16.b, z18.b\"\n      ]\n    },\n    \"vpandn xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xdf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"bic v16.16b, v18.16b, v17.16b\"\n      ]\n    },\n    \"vpandn ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xdf 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"bic z16.d, z18.d, z17.d\"\n      ]\n    },\n    \"vpavgb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xe0 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"urhadd v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpavgb ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xe0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"urhadd z16.b, p7/m, z16.b, z17.b\"\n      ]\n    },\n    \"vpavgb ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xe0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"urhadd z16.b, p7/m, z16.b, z18.b\"\n      ]\n    },\n    \"vpavgb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xe0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"urhadd z16.b, p7/m, z16.b, z18.b\"\n      ]\n    },\n    \"vpsraw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xe1 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z2, z17\",\n        \"asr z2.h, p6/m, z2.h, z0.d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpsraw ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xe1 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z16, z17\",\n        \"asr z16.h, p7/m, z16.h, z0.d\"\n      ]\n    },\n    \"vpsrad xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xe2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z2, z17\",\n        \"asr z2.s, p6/m, z2.s, z0.d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpsrad ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xe2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z16, z17\",\n        \"asr z16.s, p7/m, z16.s, z0.d\"\n      ]\n    },\n    \"vpavgw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xe3 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"urhadd v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpavgw ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xe3 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"urhadd z16.h, p7/m, z16.h, z17.h\"\n      ]\n    },\n    \"vpavgw ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xe3 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"urhadd z16.h, p7/m, z16.h, z18.h\"\n      ]\n    },\n    \"vpavgw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xe3 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"urhadd z16.h, p7/m, z16.h, z18.h\"\n      ]\n    },\n    \"vpmulhuw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xe4 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z2, z17\",\n        \"umulh z2.h, p6/m, z2.h, z18.h\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpmulhuw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xe4 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umulh z16.h, z17.h, z18.h\"\n      ]\n    },\n    \"vpmulhw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xe5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z2, z17\",\n        \"smulh z2.h, p6/m, z2.h, z18.h\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpmulhw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xe5 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smulh z16.h, z17.h, z18.h\"\n      ]\n    },\n    \"vcvttpd2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 1 0b01 0xe6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x28, #3520]\",\n        \"ldr q3, [x28, #3472]\",\n        \"fcvtzs z4.s, p6/m, z17.d\",\n        \"uzp1 z4.s, z4.s, z4.s\",\n        \"mov v4.8b, v4.8b\",\n        \"fcmgt v3.2d, v3.2d, v17.2d\",\n        \"shrn v3.2s, v3.2d, #32\",\n        \"mov v16.16b, v3.16b\",\n        \"bsl v16.16b, v4.16b, v2.16b\"\n      ]\n    },\n    \"vcvttpd2dq xmm0, ymm1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 1 0b01 0xe6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3520]\",\n        \"ldr x0, [x28, #2584]\",\n        \"ld1b {z3.b}, p7/z, [x0]\",\n        \"fcvtzs z4.s, p7/m, z17.d\",\n        \"uzp1 z4.s, z4.s, z4.s\",\n        \"mov v4.16b, v4.16b\",\n        \"fcmgt p0.d, p7/z, z3.d, z17.d\",\n        \"not z0.d, p0/m, z3.d\",\n        \"movprfx z3.d, p0/z, z3.d\",\n        \"orr z3.d, p0/m, z3.d, z0.d\",\n        \"shrnb z3.s, z3.d, #32\",\n        \"uzp1 z3.s, z3.s, z3.s\",\n        \"movprfx z0, z4\",\n        \"bsl z0.d, z0.d, z2.d, z3.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vcvtdq2pd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0xe6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.2d, v17.2s\",\n        \"scvtf v16.2d, v2.2d\"\n      ]\n    },\n    \"vcvtdq2pd ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0xe6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sunpklo z2.d, z17.s\",\n        \"scvtf z16.d, p7/m, z2.d\"\n      ]\n    },\n    \"vcvtpd2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 1 0b11 0xe6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti v2.2d, v17.2d\",\n        \"ldr d3, [x28, #3520]\",\n        \"ldr q4, [x28, #3472]\",\n        \"fcvtzs z5.s, p6/m, z2.d\",\n        \"uzp1 z5.s, z5.s, z5.s\",\n        \"mov v5.8b, v5.8b\",\n        \"fcmgt v2.2d, v4.2d, v2.2d\",\n        \"shrn v2.2s, v2.2d, #32\",\n        \"mov v16.16b, v2.16b\",\n        \"bsl v16.16b, v5.16b, v3.16b\"\n      ]\n    },\n    \"vcvtpd2dq xmm0, ymm1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 1 0b11 0xe6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti z2.d, p7/m, z17.d\",\n        \"ldr q3, [x28, #3520]\",\n        \"ldr x0, [x28, #2584]\",\n        \"ld1b {z4.b}, p7/z, [x0]\",\n        \"fcvtzs z5.s, p7/m, z2.d\",\n        \"uzp1 z5.s, z5.s, z5.s\",\n        \"mov v5.16b, v5.16b\",\n        \"fcmgt p0.d, p7/z, z4.d, z2.d\",\n        \"not z0.d, p0/m, z4.d\",\n        \"movprfx z2.d, p0/z, z4.d\",\n        \"orr z2.d, p0/m, z2.d, z0.d\",\n        \"shrnb z2.s, z2.d, #32\",\n        \"uzp1 z2.s, z2.s, z2.s\",\n        \"movprfx z0, z5\",\n        \"bsl z0.d, z0.d, z3.d, z2.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vmovntdq [rax], xmm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xe7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stnt1b {z16.b}, p6, [x4]\"\n      ]\n    },\n    \"vmovntdq [rax], ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xe7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"stnt1b {z16.b}, p7, [x4]\"\n      ]\n    },\n    \"vpsubsb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xe8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqsub v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpsubsb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xe8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqsub z16.b, z17.b, z18.b\"\n      ]\n    },\n    \"vpsubsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xe9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqsub v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpsubsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xe9 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqsub z16.h, z17.h, z18.h\"\n      ]\n    },\n    \"vpminsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xea 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smin v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpminsw ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xea 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smin z16.h, p7/m, z16.h, z17.h\"\n      ]\n    },\n    \"vpminsw ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xea 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smin z16.h, p7/m, z16.h, z18.h\"\n      ]\n    },\n    \"vpminsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xea 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"smin z16.h, p7/m, z16.h, z18.h\"\n      ]\n    },\n    \"vpor xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xeb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpor ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xeb 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"orr z16.d, z17.d, z18.d\"\n      ]\n    },\n    \"vpaddsb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xec 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqadd v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpaddsb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xec 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqadd z16.b, z17.b, z18.b\"\n      ]\n    },\n    \"vpaddsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xed 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqadd v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpaddsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xed 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqadd z16.h, z17.h, z18.h\"\n      ]\n    },\n    \"vpmaxsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xee 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smax v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpmaxsw ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xee 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smax z16.h, p7/m, z16.h, z17.h\"\n      ]\n    },\n    \"vpmaxsw ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xee 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smax z16.h, p7/m, z16.h, z18.h\"\n      ]\n    },\n    \"vpmaxsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xee 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"smax z16.h, p7/m, z16.h, z18.h\"\n      ]\n    },\n    \"vpxor xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xef 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpxor ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xef 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor z16.d, z17.d, z18.d\"\n      ]\n    },\n    \"vpxor xmm0, xmm1, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"xor with itself to get zero register\",\n        \"Map 1 0b01 0xef 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpxor ymm0, ymm1, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"xor with itself to get zero register\",\n        \"Map 1 0b01 0xef 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vlddqu xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b11 0xf0 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q16, [x4]\"\n      ]\n    },\n    \"vlddqu ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b11 0xf0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1b {z16.b}, p7/z, [x4]\"\n      ]\n    },\n    \"vpsllw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xf1 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z2, z17\",\n        \"lsl z2.h, p6/m, z2.h, z0.d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpsllw ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xf1 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z16, z17\",\n        \"lsl z16.h, p7/m, z16.h, z0.d\"\n      ]\n    },\n    \"vpslld xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xf2 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z2, z17\",\n        \"lsl z2.s, p6/m, z2.s, z0.d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpslld ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xf2 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z16, z17\",\n        \"lsl z16.s, p7/m, z16.s, z0.d\"\n      ]\n    },\n    \"vpsllq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xf3 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z2, z17\",\n        \"lsl z2.d, p6/m, z2.d, z0.d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpsllq ymm0, ymm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xf3 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, d18\",\n        \"movprfx z16, z17\",\n        \"lsl z16.d, p7/m, z16.d, z0.d\"\n      ]\n    },\n    \"vpmuludq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xf4 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.4s, v17.4s, v17.4s\",\n        \"uzp1 v3.4s, v18.4s, v18.4s\",\n        \"umull v16.2d, v2.2s, v3.2s\"\n      ]\n    },\n    \"vpmuludq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xf4 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 z2.s, z17.s, z17.s\",\n        \"uzp1 z3.s, z18.s, z18.s\",\n        \"umullb z0.d, z2.s, z3.s\",\n        \"umullt z1.d, z2.s, z3.s\",\n        \"zip1 z16.d, z0.d, z1.d\"\n      ]\n    },\n    \"vpmaddwd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xf5 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smull v2.4s, v17.4h, v18.4h\",\n        \"smull2 v3.4s, v17.8h, v18.8h\",\n        \"addp v16.4s, v2.4s, v3.4s\"\n      ]\n    },\n    \"vpmaddwd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 1 0b01 0xf5 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smullb z0.s, z17.h, z18.h\",\n        \"smullt z1.s, z17.h, z18.h\",\n        \"zip1 z2.s, z0.s, z1.s\",\n        \"smullb z0.s, z17.h, z18.h\",\n        \"smullt z1.s, z17.h, z18.h\",\n        \"zip2 z3.s, z0.s, z1.s\",\n        \"movprfx z0, z2\",\n        \"addp z0.s, p7/m, z0.s, z3.s\",\n        \"uzp1 z16.s, z0.s, z0.s\",\n        \"uzp2 z1.s, z0.s, z0.s\",\n        \"splice z16.d, p6, z16.d, z1.d\"\n      ]\n    },\n    \"vpsadbw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 1 0b01 0xf6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uabdl v2.8h, v17.8b, v18.8b\",\n        \"uabdl2 v3.8h, v17.16b, v18.16b\",\n        \"addv h2, v2.8h\",\n        \"addv h3, v3.8h\",\n        \"zip1 v16.2d, v2.2d, v3.2d\"\n      ]\n    },\n    \"vpsadbw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 36,\n      \"Comment\": [\n        \"Map 1 0b01 0xf6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uabdlb z0.h, z17.b, z18.b\",\n        \"uabdlt z1.h, z17.b, z18.b\",\n        \"zip1 z2.h, z0.h, z1.h\",\n        \"uabdlb z0.h, z17.b, z18.b\",\n        \"uabdlt z1.h, z17.b, z18.b\",\n        \"zip2 z3.h, z0.h, z1.h\",\n        \"addv h4, v2.8h\",\n        \"addv h5, v3.8h\",\n        \"zip1 z4.d, z4.d, z5.d\",\n        \"mov z2.q, z2.q[1]\",\n        \"mov z3.q, z3.q[1]\",\n        \"addv h2, v2.8h\",\n        \"addv h3, v3.8h\",\n        \"mov z1.d, d3\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.q, q2\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z4.b, p0/m, z1.b\",\n        \"mov z1.d, z4.d[1]\",\n        \"mov z2.d, z4.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z4.d[2]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vmaskmovdqu xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xf7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmlt v2.16b, v17.16b, #0\",\n        \"ldr q3, [x11]\",\n        \"bsl v2.16b, v16.16b, v3.16b\",\n        \"str q2, [x11]\"\n      ]\n    },\n    \"vpsubb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xf8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpsubb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xf8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub z16.b, z17.b, z18.b\"\n      ]\n    },\n    \"vpsubw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xf9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpsubw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xf9 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub z16.h, z17.h, z18.h\"\n      ]\n    },\n    \"vpsubd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xfa 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vpsubd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xfa 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub z16.s, z17.s, z18.s\"\n      ]\n    },\n    \"vpsubq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xfb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub v16.2d, v17.2d, v18.2d\"\n      ]\n    },\n    \"vpsubq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xfb 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub z16.d, z17.d, z18.d\"\n      ]\n    },\n    \"vpaddb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xfc 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpaddb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xfc 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add z16.b, z17.b, z18.b\"\n      ]\n    },\n    \"vpaddw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xfd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpaddw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xfd 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add z16.h, z17.h, z18.h\"\n      ]\n    },\n    \"vpaddd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xfe 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vpaddd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 1 0b01 0xfe 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"add z16.s, z17.s, z18.s\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/VEX_map1_FCMA.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\",\n      \"FCMA\"\n    ],\n    \"DisabledHostFeatures\": []\n  },\n  \"Instructions\": {\n    \"vaddsubpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0xd0 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ext v2.16b, v18.16b, v18.16b, #8\",\n        \"fcadd v16.2d, v17.2d, v2.2d, #90\"\n      ]\n    },\n    \"vaddsubpd ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z2, z18\",\n        \"ext z2.b, z2.b, z18.b, #8\",\n        \"fcadd z16.d, p7/m, z16.d, z2.d, #90\"\n      ]\n    },\n    \"vaddsubpd ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b01 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z2, z16\",\n        \"ext z2.b, z2.b, z16.b, #8\",\n        \"movprfx z16, z17\",\n        \"fcadd z16.d, p7/m, z16.d, z2.d, #90\"\n      ]\n    },\n    \"vaddsubpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 1 0b01 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z2, z18\",\n        \"ext z2.b, z2.b, z18.b, #8\",\n        \"movprfx z16, z17\",\n        \"fcadd z16.d, p7/m, z16.d, z2.d, #90\"\n      ]\n    },\n    \"vaddsubps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0xd0 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"rev64 v2.4s, v18.4s\",\n        \"fcadd v16.4s, v17.4s, v2.4s, #90\"\n      ]\n    },\n    \"vaddsubps ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b11 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"revw z2.d, p7/m, z16.d\",\n        \"movprfx z16, z17\",\n        \"fcadd z16.s, p7/m, z16.s, z2.s, #90\"\n      ]\n    },\n    \"vaddsubps ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 1 0b11 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"revw z2.d, p7/m, z18.d\",\n        \"fcadd z16.s, p7/m, z16.s, z2.s, #90\"\n      ]\n    },\n    \"vaddsubps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0xd0 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"revw z2.d, p7/m, z18.d\",\n        \"movprfx z16, z17\",\n        \"fcadd z16.s, p7/m, z16.s, z2.s, #90\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/VEX_map1_FRINTTS.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"FRINTTS\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"FCMA\",\n      \"RPRES\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ]\n  },\n  \"Instructions\": {\n    \"vcvttss2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32z s2, s16\",\n        \"fcvtzs w4, s2\"\n      ]\n    },\n    \"vcvttss2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint64z s2, s16\",\n        \"fcvtzs x4, s2\"\n      ]\n    },\n    \"vcvttsd2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32z d2, d16\",\n        \"fcvtzs w4, d2\"\n      ]\n    },\n    \"vcvttsd2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint64z d2, d16\",\n        \"fcvtzs x4, d2\"\n      ]\n    },\n    \"vcvtss2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32x s2, s16\",\n        \"fcvtzs w4, s2\"\n      ]\n    },\n    \"vcvtss2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint64x s2, s16\",\n        \"fcvtzs x4, s2\"\n      ]\n    },\n    \"vcvtsd2si eax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32x d2, d16\",\n        \"fcvtzs w4, d2\"\n      ]\n    },\n    \"vcvtsd2si rax, xmm0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b11 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint64x d2, d16\",\n        \"fcvtzs x4, d2\"\n      ]\n    },\n    \"vcvtps2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b01 0x5b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32x v2.4s, v17.4s\",\n        \"fcvtzs v16.4s, v2.4s\"\n      ]\n    },\n    \"vcvtps2dq ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"Map 1 0b01 0x5b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti z2.s, p7/m, z17.s\",\n        \"ldr x0, [x28, #2608]\",\n        \"ld1b {z3.b}, p7/z, [x0]\",\n        \"ldr x0, [x28, #2560]\",\n        \"ld1b {z4.b}, p7/z, [x0]\",\n        \"fcvtzs z5.s, p7/m, z2.s\",\n        \"fcmgt p0.s, p7/z, z4.s, z2.s\",\n        \"not z0.s, p0/m, z4.s\",\n        \"movprfx z2.s, p0/z, z4.s\",\n        \"orr z2.s, p0/m, z2.s, z0.s\",\n        \"movprfx z0, z5\",\n        \"bsl z0.d, z0.d, z3.d, z2.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vcvttps2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 1 0b10 0x5b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32z v2.4s, v17.4s\",\n        \"fcvtzs v16.4s, v2.4s\"\n      ]\n    },\n    \"vcvttps2dq ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 1 0b10 0x5b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2608]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"ldr x0, [x28, #2560]\",\n        \"ld1b {z3.b}, p7/z, [x0]\",\n        \"fcvtzs z4.s, p7/m, z17.s\",\n        \"fcmgt p0.s, p7/z, z3.s, z17.s\",\n        \"not z0.s, p0/m, z3.s\",\n        \"movprfx z3.s, p0/z, z3.s\",\n        \"orr z3.s, p0/m, z3.s, z0.s\",\n        \"movprfx z0, z4\",\n        \"bsl z0.d, z0.d, z2.d, z3.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vcvttpd2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b01 0xe6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32z v2.2d, v17.2d\",\n        \"fcvtzs v2.2d, v2.2d\",\n        \"xtn v16.2s, v2.2d\"\n      ]\n    },\n    \"vcvttpd2dq xmm0, ymm1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 1 0b01 0xe6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3520]\",\n        \"ldr x0, [x28, #2584]\",\n        \"ld1b {z3.b}, p7/z, [x0]\",\n        \"fcvtzs z4.s, p7/m, z17.d\",\n        \"uzp1 z4.s, z4.s, z4.s\",\n        \"mov v4.16b, v4.16b\",\n        \"fcmgt p0.d, p7/z, z3.d, z17.d\",\n        \"not z0.d, p0/m, z3.d\",\n        \"movprfx z3.d, p0/z, z3.d\",\n        \"orr z3.d, p0/m, z3.d, z0.d\",\n        \"shrnb z3.s, z3.d, #32\",\n        \"uzp1 z3.s, z3.s, z3.s\",\n        \"movprfx z0, z4\",\n        \"bsl z0.d, z0.d, z2.d, z3.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vcvtpd2dq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 1 0b11 0xe6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frint32x v2.2d, v17.2d\",\n        \"fcvtzs v2.2d, v2.2d\",\n        \"xtn v16.2s, v2.2d\"\n      ]\n    },\n    \"vcvtpd2dq xmm0, ymm1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 1 0b11 0xe6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti z2.d, p7/m, z17.d\",\n        \"ldr q3, [x28, #3520]\",\n        \"ldr x0, [x28, #2584]\",\n        \"ld1b {z4.b}, p7/z, [x0]\",\n        \"fcvtzs z5.s, p7/m, z2.d\",\n        \"uzp1 z5.s, z5.s, z5.s\",\n        \"mov v5.16b, v5.16b\",\n        \"fcmgt p0.d, p7/z, z4.d, z2.d\",\n        \"not z0.d, p0/m, z4.d\",\n        \"movprfx z2.d, p0/z, z4.d\",\n        \"orr z2.d, p0/m, z2.d, z0.d\",\n        \"shrnb z2.s, z2.d, #32\",\n        \"uzp1 z2.s, z2.s, z2.s\",\n        \"movprfx z0, z5\",\n        \"bsl z0.d, z0.d, z3.d, z2.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/VEX_map2.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE256\",\n      \"SVE128\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"SVEBITPERM\"\n    ]\n  },\n  \"Instructions\": {\n    \"vpshufb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x00 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.16b, #0x8f\",\n        \"and v2.16b, v18.16b, v2.16b\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\"\n      ]\n    },\n    \"vpshufb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.b, #-113\",\n        \"and z2.d, z18.d, z2.d\",\n        \"tbl v3.16b, {v17.16b}, v2.16b\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z4.d, z17.d\",\n        \"mov z4.b, p6/m, z1.b\",\n        \"tbl v2.16b, {v4.16b}, v2.16b\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z3.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vphaddw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x01 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"addp v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vphaddw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 2 0b01 0x01 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z0, z17\",\n        \"addp z0.h, p7/m, z0.h, z18.h\",\n        \"uzp1 z2.h, z0.h, z0.h\",\n        \"uzp2 z1.h, z0.h, z0.h\",\n        \"splice z2.d, p6, z2.d, z1.d\",\n        \"mov z1.d, z2.d[2]\",\n        \"mov z3.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z3.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z2.d[1]\",\n        \"mov z16.d, z3.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vphaddd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"addp v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vphaddd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 2 0b01 0x02 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z0, z17\",\n        \"addp z0.s, p7/m, z0.s, z18.s\",\n        \"uzp1 z2.s, z0.s, z0.s\",\n        \"uzp2 z1.s, z0.s, z0.s\",\n        \"splice z2.d, p6, z2.d, z1.d\",\n        \"mov z1.d, z2.d[2]\",\n        \"mov z3.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z3.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z2.d[1]\",\n        \"mov z16.d, z3.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vphaddsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x03 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.8h, v17.8h, v18.8h\",\n        \"uzp2 v3.8h, v17.8h, v18.8h\",\n        \"sqadd v16.8h, v2.8h, v3.8h\"\n      ]\n    },\n    \"vphaddsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x03 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 z2.h, z17.h, z18.h\",\n        \"uzp2 z3.h, z17.h, z18.h\",\n        \"sqadd z2.h, z2.h, z3.h\",\n        \"mov z1.d, z2.d[2]\",\n        \"mov z3.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z3.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z2.d[1]\",\n        \"mov z16.d, z3.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpmaddubsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x04 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v2.8h, v17.8b\",\n        \"sxtl v3.8h, v18.8b\",\n        \"mul v2.8h, v2.8h, v3.8h\",\n        \"uxtl2 v3.8h, v17.16b\",\n        \"sxtl2 v4.8h, v18.16b\",\n        \"mul v3.8h, v3.8h, v4.8h\",\n        \"uzp1 v4.8h, v2.8h, v3.8h\",\n        \"uzp2 v2.8h, v2.8h, v3.8h\",\n        \"sqadd v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"vpmaddubsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map 2 0b01 0x04 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uunpklo z2.h, z17.b\",\n        \"sunpklo z3.h, z18.b\",\n        \"mul z2.h, z2.h, z3.h\",\n        \"uunpkhi z3.h, z17.b\",\n        \"sunpkhi z4.h, z18.b\",\n        \"mul z3.h, z3.h, z4.h\",\n        \"uzp1 z4.h, z2.h, z3.h\",\n        \"uzp2 z2.h, z2.h, z3.h\",\n        \"sqadd z16.h, z4.h, z2.h\"\n      ]\n    },\n    \"vphsubw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x05 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.8h, v17.8h, v18.8h\",\n        \"uzp2 v3.8h, v17.8h, v18.8h\",\n        \"sub v16.8h, v2.8h, v3.8h\"\n      ]\n    },\n    \"vphsubw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 z2.h, z17.h, z18.h\",\n        \"uzp2 z3.h, z17.h, z18.h\",\n        \"sub z2.h, z2.h, z3.h\",\n        \"mov z1.d, z2.d[2]\",\n        \"mov z3.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z3.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z2.d[1]\",\n        \"mov z16.d, z3.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vphsubd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x06 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.4s, v17.4s, v18.4s\",\n        \"uzp2 v3.4s, v17.4s, v18.4s\",\n        \"sub v16.4s, v2.4s, v3.4s\"\n      ]\n    },\n    \"vphsubd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 z2.s, z17.s, z18.s\",\n        \"uzp2 z3.s, z17.s, z18.s\",\n        \"sub z2.s, z2.s, z3.s\",\n        \"mov z1.d, z2.d[2]\",\n        \"mov z3.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z3.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z2.d[1]\",\n        \"mov z16.d, z3.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vphsubsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x07 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.8h, v17.8h, v18.8h\",\n        \"uzp2 v3.8h, v17.8h, v18.8h\",\n        \"sqsub v16.8h, v2.8h, v3.8h\"\n      ]\n    },\n    \"vphsubsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x07 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 z2.h, z17.h, z18.h\",\n        \"uzp2 z3.h, z17.h, z18.h\",\n        \"sqsub z2.h, z2.h, z3.h\",\n        \"mov z1.d, z2.d[2]\",\n        \"mov z3.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z3.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z2.d[1]\",\n        \"mov z16.d, z3.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpsignb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x08 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqshl v2.16b, v18.16b, #7\",\n        \"srshr v2.16b, v2.16b, #7\",\n        \"mul v16.16b, v17.16b, v2.16b\"\n      ]\n    },\n    \"vpsignb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x08 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z2, z18\",\n        \"sqshl z2.b, p7/m, z2.b, #7\",\n        \"srshr z2.b, p7/m, z2.b, #7\",\n        \"mul z16.b, z17.b, z2.b\"\n      ]\n    },\n    \"vpsignw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x09 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqshl v2.8h, v18.8h, #15\",\n        \"srshr v2.8h, v2.8h, #15\",\n        \"mul v16.8h, v17.8h, v2.8h\"\n      ]\n    },\n    \"vpsignw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x09 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z2, z18\",\n        \"sqshl z2.h, p7/m, z2.h, #15\",\n        \"srshr z2.h, p7/m, z2.h, #15\",\n        \"mul z16.h, z17.h, z2.h\"\n      ]\n    },\n    \"vpsignd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqshl v2.4s, v18.4s, #31\",\n        \"srshr v2.4s, v2.4s, #31\",\n        \"mul v16.4s, v17.4s, v2.4s\"\n      ]\n    },\n    \"vpsignd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x0a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z2, z18\",\n        \"sqshl z2.s, p7/m, z2.s, #31\",\n        \"srshr z2.s, p7/m, z2.s, #31\",\n        \"mul z16.s, z17.s, z2.s\"\n      ]\n    },\n    \"vpmulhrsw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smull v2.4s, v17.4h, v18.4h\",\n        \"smull2 v3.4s, v17.8h, v18.8h\",\n        \"sshr v2.4s, v2.4s, #14\",\n        \"sshr v3.4s, v3.4s, #14\",\n        \"movi v4.4s, #0x1\",\n        \"add v2.4s, v2.4s, v4.4s\",\n        \"add v3.4s, v3.4s, v4.4s\",\n        \"shrn v2.4h, v2.4s, #1\",\n        \"mov v0.16b, v2.16b\",\n        \"shrn2 v0.8h, v3.4s, #1\",\n        \"mov v16.16b, v0.16b\"\n      ]\n    },\n    \"vpmulhrsw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x0b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smullb z0.s, z17.h, z18.h\",\n        \"smullt z1.s, z17.h, z18.h\",\n        \"zip1 z2.s, z0.s, z1.s\",\n        \"smullb z0.s, z17.h, z18.h\",\n        \"smullt z1.s, z17.h, z18.h\",\n        \"zip2 z3.s, z0.s, z1.s\",\n        \"asr z2.s, p7/m, z2.s, #14\",\n        \"asr z3.s, p7/m, z3.s, #14\",\n        \"mov z4.s, #1\",\n        \"add z2.s, z2.s, z4.s\",\n        \"add z3.s, z3.s, z4.s\",\n        \"shrnb z2.h, z2.s, #1\",\n        \"uzp1 z2.h, z2.h, z2.h\",\n        \"shrnb z1.h, z3.s, #1\",\n        \"uzp1 z1.h, z1.h, z1.h\",\n        \"movprfx z16, z2\",\n        \"splice z16.h, p6, z16.h, z1.h\"\n      ]\n    },\n    \"vpermilps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0x0c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.4s, #0x3\",\n        \"and v2.16b, v18.16b, v2.16b\",\n        \"trn1 v2.16b, v2.16b, v2.16b\",\n        \"trn1 v2.8h, v2.8h, v2.8h\",\n        \"shl v2.16b, v2.16b, #2\",\n        \"mov w20, #0x100\",\n        \"movk w20, #0x302, lsl #16\",\n        \"dup v3.4s, w20\",\n        \"add v2.16b, v3.16b, v2.16b\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\"\n      ]\n    },\n    \"vpermilps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"Map 2 0b01 0x0c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.s, #3\",\n        \"and z2.d, z18.d, z2.d\",\n        \"trn1 z2.b, z2.b, z2.b\",\n        \"trn1 z2.h, z2.h, z2.h\",\n        \"lsl z2.b, p7/m, z2.b, #2\",\n        \"mov w20, #0x100\",\n        \"movk w20, #0x302, lsl #16\",\n        \"mov z3.s, w20\",\n        \"movi v4.2d, #0x0\",\n        \"mov z5.b, #16\",\n        \"mov z1.q, q5\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z4.b, p0/m, z1.b\",\n        \"add z3.b, z3.b, z4.b\",\n        \"add z2.b, z3.b, z2.b\",\n        \"tbl z16.b, {z17.b}, z2.b\"\n      ]\n    },\n    \"vpermilpd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"Map 2 0b01 0x0d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ushr v2.2d, v18.2d, #1\",\n        \"mov w0, #0x1\",\n        \"dup v3.2d, x0\",\n        \"and v2.16b, v2.16b, v3.16b\",\n        \"trn1 v2.16b, v2.16b, v2.16b\",\n        \"trn1 v2.8h, v2.8h, v2.8h\",\n        \"trn1 v2.4s, v2.4s, v2.4s\",\n        \"shl v2.16b, v2.16b, #3\",\n        \"mov x20, #0x100\",\n        \"movk x20, #0x302, lsl #16\",\n        \"movk x20, #0x504, lsl #32\",\n        \"movk x20, #0x706, lsl #48\",\n        \"dup v3.2d, x20\",\n        \"add v2.16b, v3.16b, v2.16b\",\n        \"tbl v16.16b, {v17.16b}, v2.16b\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"Map 2 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z2, z18\",\n        \"lsr z2.d, p7/m, z2.d, #1\",\n        \"mov z3.d, #1\",\n        \"and z2.d, z2.d, z3.d\",\n        \"trn1 z2.b, z2.b, z2.b\",\n        \"trn1 z2.h, z2.h, z2.h\",\n        \"trn1 z2.s, z2.s, z2.s\",\n        \"lsl z2.b, p7/m, z2.b, #3\",\n        \"mov x20, #0x100\",\n        \"movk x20, #0x302, lsl #16\",\n        \"movk x20, #0x504, lsl #32\",\n        \"movk x20, #0x706, lsl #48\",\n        \"mov z3.d, x20\",\n        \"movi v4.2d, #0x0\",\n        \"mov z5.b, #16\",\n        \"mov z1.q, q5\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z4.b, p0/m, z1.b\",\n        \"add z3.b, z3.b, z4.b\",\n        \"add z2.b, z3.b, z2.b\",\n        \"tbl z16.b, {z17.b}, z2.b\"\n      ]\n    },\n    \"vtestps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 2 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80000000\",\n        \"dup v2.4s, w20\",\n        \"and v3.16b, v17.16b, v16.16b\",\n        \"bic v4.16b, v17.16b, v16.16b\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"and v2.16b, v4.16b, v2.16b\",\n        \"umaxv h3, v3.8h\",\n        \"umaxv h2, v2.8h\",\n        \"umov w20, v3.h[0]\",\n        \"umov w21, v2.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"mov w26, #0x1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vtestps ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 2 0b01 0x0e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x80000000\",\n        \"mov z2.s, w20\",\n        \"and z3.d, z17.d, z16.d\",\n        \"bic z4.d, z17.d, z16.d\",\n        \"and z3.d, z3.d, z2.d\",\n        \"and z2.d, z4.d, z2.d\",\n        \"umaxv h3, p7, z3.h\",\n        \"umaxv h2, p7, z2.h\",\n        \"umov w20, v3.h[0]\",\n        \"umov w21, v2.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"mov w26, #0x1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vtestpd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 2 0b01 0x0f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x8000000000000000\",\n        \"dup v2.2d, x20\",\n        \"and v3.16b, v17.16b, v16.16b\",\n        \"bic v4.16b, v17.16b, v16.16b\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"and v2.16b, v4.16b, v2.16b\",\n        \"umaxv h3, v3.8h\",\n        \"umaxv h2, v2.8h\",\n        \"umov w20, v3.h[0]\",\n        \"umov w21, v2.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"mov w26, #0x1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vtestpd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 2 0b01 0x0f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x8000000000000000\",\n        \"mov z2.d, x20\",\n        \"and z3.d, z17.d, z16.d\",\n        \"bic z4.d, z17.d, z16.d\",\n        \"and z3.d, z3.d, z2.d\",\n        \"and z2.d, z4.d, z2.d\",\n        \"umaxv h3, p7, z3.h\",\n        \"umaxv h2, p7, z2.h\",\n        \"umov w20, v3.h[0]\",\n        \"umov w21, v2.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"mov w26, #0x1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vcvtph2ps xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x13 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvtl v16.4s, v17.4h\"\n      ]\n    },\n    \"vcvtph2ps xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x13 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"fcvtl v16.4s, v2.4h\"\n      ]\n    },\n    \"vcvtph2ps ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x13 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"zip1 z16.h, z17.h, z17.h\",\n        \"fcvtlt z16.s, p7/m, z16.h\"\n      ]\n    },\n    \"vcvtph2ps ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x13 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x4]\",\n        \"zip1 z16.h, z2.h, z2.h\",\n        \"fcvtlt z16.s, p7/m, z16.h\"\n      ]\n    },\n    \"vpermps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0x16 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.s, #7\",\n        \"mov w20, #0x100\",\n        \"movk w20, #0x302, lsl #16\",\n        \"mov z3.s, w20\",\n        \"and z2.d, z17.d, z2.d\",\n        \"trn1 z2.b, z2.b, z2.b\",\n        \"trn1 z2.h, z2.h, z2.h\",\n        \"lsl z2.b, p7/m, z2.b, #2\",\n        \"add z2.b, z2.b, z3.b\",\n        \"tbl z16.b, {z18.b}, z2.b\"\n      ]\n    },\n    \"vptest xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and v2.16b, v16.16b, v17.16b\",\n        \"bic v3.16b, v17.16b, v16.16b\",\n        \"umaxv h2, v2.8h\",\n        \"umaxv h3, v3.8h\",\n        \"umov w20, v2.h[0]\",\n        \"umov w21, v3.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"mov w26, #0x1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vptest ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b01 0x16 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"and z2.d, z16.d, z17.d\",\n        \"bic z3.d, z17.d, z16.d\",\n        \"umaxv h2, p7, z2.h\",\n        \"umaxv h3, p7, z3.h\",\n        \"umov w20, v2.h[0]\",\n        \"umov w21, v3.h[0]\",\n        \"mov w27, #0x0\",\n        \"cmp x21, #0x0 (0)\",\n        \"cset x21, ne\",\n        \"cmp w20, #0x0 (0)\",\n        \"mrs x20, nzcv\",\n        \"bfi w20, w21, #29, #1\",\n        \"mov w26, #0x1\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vbroadcastss xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x18 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.4s}, [x4]\"\n      ]\n    },\n    \"vbroadcastss ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x18 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1rw {z16.s}, p7/z, [x4]\"\n      ]\n    },\n    \"vbroadcastsd ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x19 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1rd {z16.d}, p7/z, [x4]\"\n      ]\n    },\n    \"vbroadcastf128 ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x1a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1rqb {z16.b}, p7/z, [x4]\"\n      ]\n    },\n    \"vpabsb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x1c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"abs v16.16b, v17.16b\"\n      ]\n    },\n    \"vpabsb ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x1c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"abs z16.b, p7/m, z17.b\"\n      ]\n    },\n    \"vpabsw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x1d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"abs v16.8h, v17.8h\"\n      ]\n    },\n    \"vpabsw ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x1d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"abs z16.h, p7/m, z17.h\"\n      ]\n    },\n    \"vpabsd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x1e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"abs v16.4s, v17.4s\"\n      ]\n    },\n    \"vpabsd ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x1e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"abs z16.s, p7/m, z17.s\"\n      ]\n    },\n    \"vpmovsxbw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x20 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v16.8h, v17.8b\"\n      ]\n    },\n    \"vpmovsxbw ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x20 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sunpklo z16.h, z17.b\"\n      ]\n    },\n    \"vpmovsxbd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x21 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.8h, v17.8b\",\n        \"sxtl v16.4s, v2.4h\"\n      ]\n    },\n    \"vpmovsxbd ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x21 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sunpklo z2.h, z17.b\",\n        \"sunpklo z16.s, z2.h\"\n      ]\n    },\n    \"vpmovsxbq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x22 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.8h, v17.8b\",\n        \"sxtl v2.4s, v2.4h\",\n        \"sxtl v16.2d, v2.2s\"\n      ]\n    },\n    \"vpmovsxbq ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x22 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sunpklo z2.h, z17.b\",\n        \"sunpklo z2.s, z2.h\",\n        \"sunpklo z16.d, z2.s\"\n      ]\n    },\n    \"vpmovsxwd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x23 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v16.4s, v17.4h\"\n      ]\n    },\n    \"vpmovsxwd ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x23 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sunpklo z16.s, z17.h\"\n      ]\n    },\n    \"vpmovsxwq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x24 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.4s, v17.4h\",\n        \"sxtl v16.2d, v2.2s\"\n      ]\n    },\n    \"vpmovsxwq ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x24 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sunpklo z2.s, z17.h\",\n        \"sunpklo z16.d, z2.s\"\n      ]\n    },\n    \"vpmovsxdq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x25 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v16.2d, v17.2s\"\n      ]\n    },\n    \"vpmovsxdq ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x25 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sunpklo z16.d, z17.s\"\n      ]\n    },\n    \"vpmuldq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x28 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 v2.4s, v17.4s, v17.4s\",\n        \"uzp1 v3.4s, v18.4s, v18.4s\",\n        \"smull v16.2d, v2.2s, v3.2s\"\n      ]\n    },\n    \"vpmuldq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x28 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uzp1 z2.s, z17.s, z17.s\",\n        \"uzp1 z3.s, z18.s, z18.s\",\n        \"smullb z0.d, z2.s, z3.s\",\n        \"smullt z1.d, z2.s, z3.s\",\n        \"zip1 z16.d, z0.d, z1.d\"\n      ]\n    },\n    \"vpcmpeqq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x29 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmeq v16.2d, v17.2d, v18.2d\"\n      ]\n    },\n    \"vpcmpeqq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x29 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x0, nzcv\",\n        \"cmpeq p0.d, p7/z, z17.d, z18.d\",\n        \"not z0.d, p0/m, z17.d\",\n        \"movprfx z16.d, p0/z, z17.d\",\n        \"orr z16.d, p0/m, z16.d, z0.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vmovntdqa xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x2a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldnt1b {z16.b}, p6/z, [x4]\"\n      ]\n    },\n    \"vmovntdqa ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x2a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldnt1b {z16.b}, p7/z, [x4]\"\n      ]\n    },\n    \"vpackusdw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x2b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqxtun v16.4h, v17.4s\",\n        \"sqxtun2 v16.8h, v18.4s\"\n      ]\n    },\n    \"vpackusdw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 2 0b01 0x2b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sqxtunb z1.h, z18.s\",\n        \"uzp1 z1.h, z1.h, z1.h\",\n        \"sqxtunb z2.h, z17.s\",\n        \"uzp1 z2.h, z2.h, z2.h\",\n        \"splice z2.h, p6, z2.h, z1.h\",\n        \"mov z1.d, z2.d[1]\",\n        \"mov z3.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z3.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z2.d[2]\",\n        \"mov z16.d, z3.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vmaskmovps xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x2c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z17.s, #0\",\n        \"ld1w {z2.s}, p0/z, [x4]\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovps ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x2c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p7/z, z17.s, #0\",\n        \"ld1w {z16.s}, p0/z, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovpd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x2d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z17.d, #0\",\n        \"ld1d {z2.d}, p0/z, [x4]\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovpd ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x2d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p7/z, z17.d, #0\",\n        \"ld1d {z16.d}, p0/z, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovps [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x2e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z16.s, #0\",\n        \"st1w {z17.s}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovps [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x2e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p7/z, z16.s, #0\",\n        \"st1w {z17.s}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovpd [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x2f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z16.d, #0\",\n        \"st1d {z17.d}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vmaskmovpd [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x2f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p7/z, z16.d, #0\",\n        \"st1d {z17.d}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmovzxbw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x30 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v16.8h, v17.8b\"\n      ]\n    },\n    \"vpmovzxbw ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x30 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uunpklo z16.h, z17.b\"\n      ]\n    },\n    \"vpmovzxbd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x31 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v2.8h, v17.8b\",\n        \"uxtl v16.4s, v2.4h\"\n      ]\n    },\n    \"vpmovzxbd ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x31 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uunpklo z2.h, z17.b\",\n        \"uunpklo z16.s, z2.h\"\n      ]\n    },\n    \"vpmovzxbq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x32 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v2.8h, v17.8b\",\n        \"uxtl v2.4s, v2.4h\",\n        \"uxtl v16.2d, v2.2s\"\n      ]\n    },\n    \"vpmovzxbq ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x32 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uunpklo z2.h, z17.b\",\n        \"uunpklo z2.s, z2.h\",\n        \"uunpklo z16.d, z2.s\"\n      ]\n    },\n    \"vpmovzxwd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x33 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v16.4s, v17.4h\"\n      ]\n    },\n    \"vpmovzxwd ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x33 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uunpklo z16.s, z17.h\"\n      ]\n    },\n    \"vpmovzxwq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x34 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v2.4s, v17.4h\",\n        \"uxtl v16.2d, v2.2s\"\n      ]\n    },\n    \"vpmovzxwq ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x34 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uunpklo z2.s, z17.h\",\n        \"uunpklo z16.d, z2.s\"\n      ]\n    },\n    \"vpmovzxdq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x35 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtl v16.2d, v17.2s\"\n      ]\n    },\n    \"vpmovzxdq ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x35 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uunpklo z16.d, z17.s\"\n      ]\n    },\n    \"vpermd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b01 0x36 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.s, #7\",\n        \"mov w20, #0x100\",\n        \"movk w20, #0x302, lsl #16\",\n        \"mov z3.s, w20\",\n        \"and z2.d, z17.d, z2.d\",\n        \"trn1 z2.b, z2.b, z2.b\",\n        \"trn1 z2.h, z2.h, z2.h\",\n        \"lsl z2.b, p7/m, z2.b, #2\",\n        \"add z2.b, z2.b, z3.b\",\n        \"tbl z16.b, {z18.b}, z2.b\"\n      ]\n    },\n    \"vpcmpgtq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x37 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cmgt v16.2d, v17.2d, v18.2d\"\n      ]\n    },\n    \"vpcmpgtq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x37 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x0, nzcv\",\n        \"cmpgt p0.d, p7/z, z17.d, z18.d\",\n        \"not z0.d, p0/m, z17.d\",\n        \"movprfx z16.d, p0/z, z17.d\",\n        \"orr z16.d, p0/m, z16.d, z0.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpminsb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x38 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smin v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpminsb ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x38 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smin z16.b, p7/m, z16.b, z17.b\"\n      ]\n    },\n    \"vpminsb ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x38 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smin z16.b, p7/m, z16.b, z18.b\"\n      ]\n    },\n    \"vpminsb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x38 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"smin z16.b, p7/m, z16.b, z18.b\"\n      ]\n    },\n    \"vpminsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x39 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smin v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vpminsd ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x39 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smin z16.s, p7/m, z16.s, z17.s\"\n      ]\n    },\n    \"vpminsd ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x39 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smin z16.s, p7/m, z16.s, z18.s\"\n      ]\n    },\n    \"vpminsd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x39 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"smin z16.s, p7/m, z16.s, z18.s\"\n      ]\n    },\n    \"vpminuw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x3a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umin v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpminuw ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umin z16.h, p7/m, z16.h, z17.h\"\n      ]\n    },\n    \"vpminuw ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umin z16.h, p7/m, z16.h, z18.h\"\n      ]\n    },\n    \"vpminuw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x3a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"umin z16.h, p7/m, z16.h, z18.h\"\n      ]\n    },\n    \"vpminud xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x3b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umin v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vpminud ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umin z16.s, p7/m, z16.s, z17.s\"\n      ]\n    },\n    \"vpminud ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umin z16.s, p7/m, z16.s, z18.s\"\n      ]\n    },\n    \"vpminud ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x3b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"umin z16.s, p7/m, z16.s, z18.s\"\n      ]\n    },\n    \"vpmaxsb xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x3c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smax v16.16b, v17.16b, v18.16b\"\n      ]\n    },\n    \"vpmaxsb ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smax z16.b, p7/m, z16.b, z18.b\"\n      ]\n    },\n    \"vpmaxsb ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x3c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smax z16.b, p7/m, z16.b, z17.b\"\n      ]\n    },\n    \"vpmaxsb ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x3c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"smax z16.b, p7/m, z16.b, z18.b\"\n      ]\n    },\n    \"vpmaxsd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x3d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smax v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vpmaxsd ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smax z16.s, p7/m, z16.s, z17.s\"\n      ]\n    },\n    \"vpmaxsd ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"smax z16.s, p7/m, z16.s, z18.s\"\n      ]\n    },\n    \"vpmaxsd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x3d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"smax z16.s, p7/m, z16.s, z18.s\"\n      ]\n    },\n    \"vpmaxuw xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x3e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umax v16.8h, v17.8h, v18.8h\"\n      ]\n    },\n    \"vpmaxuw ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umax z16.h, p7/m, z16.h, z17.h\"\n      ]\n    },\n    \"vpmaxuw ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umax z16.h, p7/m, z16.h, z18.h\"\n      ]\n    },\n    \"vpmaxuw ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x3e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"umax z16.h, p7/m, z16.h, z18.h\"\n      ]\n    },\n    \"vpmaxud xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x3f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umax v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vpmaxud ymm0, ymm0, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Aliasing source and destination\",\n        \"Map 2 0b01 0x3f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umax z16.s, p7/m, z16.s, z18.s\"\n      ]\n    },\n    \"vpmaxud ymm0, ymm1, ymm0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x3f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umax z16.s, p7/m, z16.s, z17.s\"\n      ]\n    },\n    \"vpmaxud ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0x3f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"umax z16.s, p7/m, z16.s, z18.s\"\n      ]\n    },\n    \"vpmulld xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mul v16.4s, v17.4s, v18.4s\"\n      ]\n    },\n    \"vpmulld ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x40 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mul z16.s, z17.s, z18.s\"\n      ]\n    },\n    \"vphminposuw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x41 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3008]\",\n        \"zip1 v3.8h, v2.8h, v17.8h\",\n        \"zip2 v2.8h, v2.8h, v17.8h\",\n        \"umin v2.4s, v3.4s, v2.4s\",\n        \"uminv s2, v2.4s\",\n        \"rev32 v16.8h, v2.8h\"\n      ]\n    },\n    \"vpsrlvd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x45 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.4s, #0x20\",\n        \"umin v0.4s, v0.4s, v18.4s\",\n        \"neg v0.4s, v0.4s\",\n        \"ushl v16.4s, v17.4s, v0.4s\"\n      ]\n    },\n    \"vpsrlvd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x45 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.s, #32\",\n        \"umin z1.s, p7/m, z1.s, z18.s\",\n        \"movprfx z16, z17\",\n        \"lsr z16.s, p7/m, z16.s, z1.s\"\n      ]\n    },\n    \"vpsrlvq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x45 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, #0x40\",\n        \"dup v0.2d, x0\",\n        \"cmhi v1.2d, v18.2d, v0.2d\",\n        \"bif v0.16b, v18.16b, v1.16b\",\n        \"neg v0.2d, v0.2d\",\n        \"ushl v16.2d, v17.2d, v0.2d\"\n      ]\n    },\n    \"vpsrlvq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x45 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.d, #64\",\n        \"umin z1.d, p7/m, z1.d, z18.d\",\n        \"movprfx z16, z17\",\n        \"lsr z16.d, p7/m, z16.d, z1.d\"\n      ]\n    },\n    \"vpsravd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x46 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.4s, #0x1f\",\n        \"umin v0.4s, v0.4s, v18.4s\",\n        \"neg v0.4s, v0.4s\",\n        \"sshl v16.4s, v17.4s, v0.4s\"\n      ]\n    },\n    \"vpsravd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.s, #31\",\n        \"umin z0.s, p7/m, z0.s, z18.s\",\n        \"movprfx z16, z17\",\n        \"asr z16.s, p7/m, z16.s, z0.s\"\n      ]\n    },\n    \"vpsllvd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x47 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.4s, #0x20\",\n        \"umin v0.4s, v0.4s, v18.4s\",\n        \"ushl v16.4s, v17.4s, v0.4s\"\n      ]\n    },\n    \"vpsllvd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x47 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.s, #32\",\n        \"umin z1.s, p7/m, z1.s, z18.s\",\n        \"movprfx z16, z17\",\n        \"lsl z16.s, p7/m, z16.s, z1.s\"\n      ]\n    },\n    \"vpsllvq xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x47 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w0, #0x40\",\n        \"dup v0.2d, x0\",\n        \"cmhi v1.2d, v18.2d, v0.2d\",\n        \"bif v0.16b, v18.16b, v1.16b\",\n        \"ushl v16.2d, v17.2d, v0.2d\"\n      ]\n    },\n    \"vpsllvq ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x47 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.d, #64\",\n        \"umin z1.d, p7/m, z1.d, z18.d\",\n        \"movprfx z16, z17\",\n        \"lsl z16.d, p7/m, z16.d, z1.d\"\n      ]\n    },\n    \"vpbroadcastd xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x58 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.4s, v17.s[0]\"\n      ]\n    },\n    \"vpbroadcastd xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x58 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.4s}, [x4]\"\n      ]\n    },\n    \"vpbroadcastd ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x58 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.s, s17\"\n      ]\n    },\n    \"vpbroadcastd ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x58 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1rw {z16.s}, p7/z, [x4]\"\n      ]\n    },\n    \"vpbroadcastq xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x59 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.2d, v17.d[0]\"\n      ]\n    },\n    \"vpbroadcastq xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x59 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.2d}, [x4]\"\n      ]\n    },\n    \"vpbroadcastq ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x59 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, d17\"\n      ]\n    },\n    \"vpbroadcastq ymm0, [rax]\": {\n      \"ExpectedInstructiqonCount\": -1,\n      \"Comment\": [\n        \"Map 2 0b01 0x59 256-bit\"\n      ],\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ld1rd {z16.d}, p7/z, [x4]\"\n      ]\n    },\n    \"vbroadcasti128 ymm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x5a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1rqb {z16.b}, p7/z, [x4]\"\n      ]\n    },\n    \"vpbroadcastb xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x78 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.16b, v17.b[0]\"\n      ]\n    },\n    \"vpbroadcastb xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x78 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.16b}, [x4]\"\n      ]\n    },\n    \"vpbroadcastb ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x78 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.b, b17\"\n      ]\n    },\n    \"vpbroadcastb ymm0, [rax]\": {\n      \"ExpectedInstructiqonCount\": -1,\n      \"Comment\": [\n        \"Map 2 0b01 0x78 256-bit\"\n      ],\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ld1rb {z16.b}, p7/z, [x4]\"\n      ]\n    },\n    \"vpbroadcastw xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x79 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v16.8h, v17.h[0]\"\n      ]\n    },\n    \"vpbroadcastw xmm0, [rax]\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x79 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1r {v16.8h}, [x4]\"\n      ]\n    },\n    \"vpbroadcastw ymm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0x79 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.h, h17\"\n      ]\n    },\n    \"vpbroadcastw ymm0, [rax]\": {\n      \"ExpectedInstructiqonCount\": -1,\n      \"Comment\": [\n        \"Map 2 0b01 0x79 256-bit\"\n      ],\n      \"ExpectedInstructionCount\": 1,\n      \"ExpectedArm64ASM\": [\n        \"ld1rh {z16.h}, p7/z, [x4]\"\n      ]\n    },\n    \"vpmaskmovd xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z17.s, #0\",\n        \"ld1w {z2.s}, p0/z, [x4]\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmaskmovd ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p7/z, z17.s, #0\",\n        \"ld1w {z16.s}, p0/z, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmaskmovq xmm0, xmm1, [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z17.d, #0\",\n        \"ld1d {z2.d}, p0/z, [x4]\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmaskmovq ymm0, ymm1, [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x8c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p7/z, z17.d, #0\",\n        \"ld1d {z16.d}, p0/z, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmaskmovd [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z16.s, #0\",\n        \"st1w {z17.s}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmaskmovd [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p7/z, z16.s, #0\",\n        \"st1w {z17.s}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmaskmovq [rax], xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z16.d, #0\",\n        \"st1d {z17.d}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpmaskmovq [rax], ymm0, ymm1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x8e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p7/z, z16.d, #0\",\n        \"st1d {z17.d}, p0, [x4]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdd xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw]\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"mov v16.16b, v2.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdd xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 28,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdd xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw #2]\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"mov v16.16b, v2.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdd xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 28,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p7/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 51,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"mov z4.q, z17.q[1]\",\n        \"mrs x20, nzcv\",\n        \"mov v5.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v5.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v5.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v5.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v5.s}[3], [x1]\",\n        \"mov w0, v3.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v3.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v3.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[2]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v3.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[3]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p7/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw #2]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdd ymm0, [ymm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 51,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"mov z4.q, z17.q[1]\",\n        \"mrs x20, nzcv\",\n        \"mov v5.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v5.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v5.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v5.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v5.s}[3], [x1]\",\n        \"mov w0, v3.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v3.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v3.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[2]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v3.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[3]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.2d, v17.2s\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdq xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"sxtl2 v4.2d, v17.4s\",\n        \"sxtl v5.2d, v17.2s\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"sel z5.d, p0, z0.d, z16.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"sshll2 v4.2d, v17.4s, #1\",\n        \"sshll v5.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"sel z5.d, p0, z0.d, z16.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"sshll2 v4.2d, v17.4s, #2\",\n        \"sshll v5.2d, v17.2s, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"sel z5.d, p0, z0.d, z16.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherdq ymm0, [xmm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x90 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"sshll2 v4.2d, v17.4s, #3\",\n        \"sshll v5.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"sel z5.d, p0, z0.d, z16.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v2.2d, v2.2d, v18.2d\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.8b, v2.8b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v2.2d, v2.2d, v18.2d\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.8b, v2.8b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v2.2d, v2.2d, v18.2d\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.8b, v2.8b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqd xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v2.2d, v2.2d, v18.2d\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.8b, v2.8b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z17.q[1]\",\n        \"mrs x20, nzcv\",\n        \"mov v3.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v3.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v3.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v3.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v3.s}[3], [x1]\",\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q2\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z3.b, p0/m, z1.b\",\n        \"mov v16.16b, v3.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z17.q[1]\",\n        \"mrs x20, nzcv\",\n        \"mov v3.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v3.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v3.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v3.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v3.s}[3], [x1]\",\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q2\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z3.b, p0/m, z1.b\",\n        \"mov v16.16b, v3.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z17.q[1]\",\n        \"mrs x20, nzcv\",\n        \"mov v3.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v3.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v3.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v3.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v3.s}[3], [x1]\",\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q2\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z3.b, p0/m, z1.b\",\n        \"mov v16.16b, v3.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqd xmm0, [ymm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z17.q[1]\",\n        \"mrs x20, nzcv\",\n        \"mov v3.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v3.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v3.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v3.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v3.s}[3], [x1]\",\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q2\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z3.b, p0/m, z1.b\",\n        \"mov v16.16b, v3.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"mov v16.16b, v2.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqq xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d, lsl #3]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"mov v16.16b, v2.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p7/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"mov z4.q, z17.q[1]\",\n        \"shl v5.2d, v17.2d, #1\",\n        \"shl v4.2d, v4.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"sel z5.d, p0, z0.d, z16.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"mov z4.q, z17.q[1]\",\n        \"shl v5.2d, v17.2d, #2\",\n        \"shl v4.2d, v4.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"sel z5.d, p0, z0.d, z16.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vpgatherqq ymm0, [ymm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x91 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p7/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d, lsl #3]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw]\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"mov v16.16b, v2.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 28,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p6/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw #2]\",\n        \"sel z2.s, p0, z0.s, z16.s\",\n        \"mov v16.16b, v2.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdps xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 28,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p7/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 51,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"mov z4.q, z17.q[1]\",\n        \"mrs x20, nzcv\",\n        \"mov v5.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v5.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v5.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v5.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v5.s}[3], [x1]\",\n        \"mov w0, v3.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[0]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v3.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[1]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v3.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[2]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v3.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[3]\",\n        \"add x1, x4, w0, sxtw #1\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.s, p7/z, z18.s, #0\",\n        \"ld1w {z0.s}, p0/z, [x4, z17.s, sxtw #2]\",\n        \"mov z16.s, p0/m, z0.s\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdps ymm0, [ymm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 51,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"mov z4.q, z17.q[1]\",\n        \"mrs x20, nzcv\",\n        \"mov v5.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v5.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v5.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[2]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v5.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v17.s[3]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v5.s}[3], [x1]\",\n        \"mov w0, v3.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[0]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v3.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[1]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"mov w0, v3.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[2]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[2], [x1]\",\n        \"mov w0, v3.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"smov x0, v4.s[3]\",\n        \"add x1, x4, w0, sxtw #3\",\n        \"ld1 {v2.s}[3], [x1]\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sxtl v2.2d, v17.2s\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdpd xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshll v2.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"sxtl2 v4.2d, v17.4s\",\n        \"sxtl v5.2d, v17.2s\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"sel z5.d, p0, z0.d, z16.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"sshll2 v4.2d, v17.4s, #1\",\n        \"sshll v5.2d, v17.2s, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"sel z5.d, p0, z0.d, z16.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"sshll2 v4.2d, v17.4s, #2\",\n        \"sshll v5.2d, v17.2s, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"sel z5.d, p0, z0.d, z16.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherdpd ymm0, [xmm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"Map 2 0b01 0x92 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"sshll2 v4.2d, v17.4s, #3\",\n        \"sshll v5.2d, v17.2s, #3\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"sel z5.d, p0, z0.d, z16.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v2.2d, v2.2d, v18.2d\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.8b, v2.8b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v2.2d, v2.2d, v18.2d\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.8b, v2.8b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v2.2d, v2.2d, v18.2d\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.8b, v2.8b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqps xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"mov v2.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v2.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v2.s}[1], [x1]\",\n        \"movi v18.2d, #0x0\",\n        \"zip1 v2.2d, v2.2d, v18.2d\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.8b, v2.8b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z17.q[1]\",\n        \"mrs x20, nzcv\",\n        \"mov v3.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v3.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v3.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v3.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0\",\n        \"ld1 {v3.s}[3], [x1]\",\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q2\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z3.b, p0/m, z1.b\",\n        \"mov v16.16b, v3.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z17.q[1]\",\n        \"mrs x20, nzcv\",\n        \"mov v3.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v3.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v3.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v3.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0, lsl #1\",\n        \"ld1 {v3.s}[3], [x1]\",\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q2\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z3.b, p0/m, z1.b\",\n        \"mov v16.16b, v3.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z17.q[1]\",\n        \"mrs x20, nzcv\",\n        \"mov v3.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v3.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v3.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v3.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0, lsl #2\",\n        \"ld1 {v3.s}[3], [x1]\",\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q2\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z3.b, p0/m, z1.b\",\n        \"mov v16.16b, v3.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqps xmm0, [ymm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z17.q[1]\",\n        \"mrs x20, nzcv\",\n        \"mov v3.16b, v16.16b\",\n        \"mov w0, v18.s[0]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v3.s}[0], [x1]\",\n        \"mov w0, v18.s[1]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v17.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v3.s}[1], [x1]\",\n        \"mov w0, v18.s[2]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[0]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v3.s}[2], [x1]\",\n        \"mov w0, v18.s[3]\",\n        \"tbz w0, #31, #+0x10\",\n        \"mov x0, v2.d[1]\",\n        \"add x1, x4, x0, lsl #3\",\n        \"ld1 {v3.s}[3], [x1]\",\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q2\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z3.b, p0/m, z1.b\",\n        \"mov v16.16b, v3.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*1 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"mov v16.16b, v2.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*2 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*4 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v2.2d, v17.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z2.d]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"movi v18.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z2.b, p0/m, z1.b\",\n        \"mov v16.16b, v2.16b\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqpd xmm0, [xmm1*8 + rax], xmm2\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d, lsl #3]\",\n        \"sel z2.d, p0, z0.d, z16.d\",\n        \"mov v16.16b, v2.16b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*1 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p7/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*2 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"mov z4.q, z17.q[1]\",\n        \"shl v5.2d, v17.2d, #1\",\n        \"shl v4.2d, v4.2d, #1\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"sel z5.d, p0, z0.d, z16.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*4 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z16.q[1]\",\n        \"mov z3.q, z18.q[1]\",\n        \"mov z4.q, z17.q[1]\",\n        \"shl v5.2d, v17.2d, #2\",\n        \"shl v4.2d, v4.2d, #2\",\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p6/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z5.d]\",\n        \"sel z5.d, p0, z0.d, z16.d\",\n        \"cmplt p0.d, p6/z, z3.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z4.d]\",\n        \"mov z2.d, p0/m, z0.d\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z5.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vgatherqpd ymm0, [ymm1*8 + rax], ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x93 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"cmplt p0.d, p7/z, z18.d, #0\",\n        \"ld1d {z0.d}, p0/z, [x4, z17.d, lsl #3]\",\n        \"mov z16.d, p0/m, z0.d\",\n        \"movi v18.2d, #0x0\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"vfmaddsub132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x96 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3040]\",\n        \"eor v2.16b, v17.16b, v2.16b\",\n        \"fmla v2.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmaddsub132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x96 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2368]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"eor z2.d, z17.d, z2.d\",\n        \"mov z0.d, z2.d\",\n        \"fmla z0.s, p7/m, z16.s, z18.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmaddsub132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x96 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3072]\",\n        \"eor v2.16b, v17.16b, v2.16b\",\n        \"fmla v2.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmaddsub132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x96 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2384]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"eor z2.d, z17.d, z2.d\",\n        \"mov z0.d, z2.d\",\n        \"fmla z0.d, p7/m, z16.d, z18.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmsubadd132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x97 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3104]\",\n        \"eor v2.16b, v17.16b, v2.16b\",\n        \"fmla v2.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsubadd132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x97 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2400]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"eor z2.d, z17.d, z2.d\",\n        \"mov z0.d, z2.d\",\n        \"fmla z0.s, p7/m, z16.s, z18.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmsubadd132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0x97 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3136]\",\n        \"eor v2.16b, v17.16b, v2.16b\",\n        \"fmla v2.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsubadd132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x97 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2416]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"eor z2.d, z17.d, z2.d\",\n        \"mov z0.d, z2.d\",\n        \"fmla z0.d, p7/m, z16.d, z18.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmadd132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x98 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"fmla v2.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmadd132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x98 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z17.d\",\n        \"fmla z0.s, p7/m, z16.s, z18.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmadd132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x98 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"fmla v2.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmadd132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x98 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z17.d\",\n        \"fmla z0.d, p7/m, z16.d, z18.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmadd132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x99 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"fmla v2.4s, v16.4s, v18.4s\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.s[0], v2.s[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmadd132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x99 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"fmla v2.2d, v16.2d, v18.2d\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.d[0], v2.d[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsub132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z17.d\",\n        \"fnmls z2.s, p6/m, z16.s, z18.s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsub132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z17.d\",\n        \"fnmls z0.s, p7/m, z16.s, z18.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmsub132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z17.d\",\n        \"fnmls z2.d, p6/m, z16.d, z18.d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsub132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z17.d\",\n        \"fnmls z0.d, p7/m, z16.d, z18.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmsub132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x9b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z17.d\",\n        \"fnmls z2.s, p6/m, z16.s, z18.s\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.s[0], v2.s[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsub132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x9b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z17.d\",\n        \"fnmls z2.d, p6/m, z16.d, z18.d\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.d[0], v2.d[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmadd132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"fmls v2.4s, v16.4s, v18.4s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmadd132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z17.d\",\n        \"fmls z0.s, p7/m, z16.s, z18.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfnmadd132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"fmls v2.2d, v16.2d, v18.2d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmadd132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z17.d\",\n        \"fmls z0.d, p7/m, z16.d, z18.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfnmadd132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x9d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"fmls v2.4s, v16.4s, v18.4s\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.s[0], v2.s[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmadd132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x9d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v17.16b\",\n        \"fmls v2.2d, v16.2d, v18.2d\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.d[0], v2.d[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmsub132ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z17.d\",\n        \"fnmla z2.s, p6/m, z16.s, z18.s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmsub132ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z17.d\",\n        \"fnmla z0.s, p7/m, z16.s, z18.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfnmsub132pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z17.d\",\n        \"fnmla z2.d, p6/m, z16.d, z18.d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmsub132pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0x9e 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z17.d\",\n        \"fnmla z0.d, p7/m, z16.d, z18.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfnmsub132ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x9f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z17.d\",\n        \"fnmla z2.s, p6/m, z16.s, z18.s\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.s[0], v2.s[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmsub132sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0x9f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z17.d\",\n        \"fnmla z2.d, p6/m, z16.d, z18.d\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.d[0], v2.d[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmadd213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xa8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v18.16b\",\n        \"fmla v2.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmadd213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xa8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z18.d\",\n        \"fmla z0.s, p7/m, z17.s, z16.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmadd213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xa8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v18.16b\",\n        \"fmla v2.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmadd213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xa8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z18.d\",\n        \"fmla z0.d, p7/m, z17.d, z16.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmadd213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xa9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v18.16b\",\n        \"fmla v2.4s, v17.4s, v16.4s\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.s[0], v2.s[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmadd213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xa9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v18.16b\",\n        \"fmla v2.2d, v17.2d, v16.2d\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.d[0], v2.d[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsub213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xaa 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z18.d\",\n        \"fnmls z2.s, p6/m, z17.s, z16.s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsub213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xaa 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z18.d\",\n        \"fnmls z0.s, p7/m, z17.s, z16.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmsub213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xaa 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z18.d\",\n        \"fnmls z2.d, p6/m, z17.d, z16.d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsub213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xaa 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z18.d\",\n        \"fnmls z0.d, p7/m, z17.d, z16.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmsub213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xab 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z18.d\",\n        \"fnmls z2.s, p6/m, z17.s, z16.s\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.s[0], v2.s[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsub213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xab 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z18.d\",\n        \"fnmls z2.d, p6/m, z17.d, z16.d\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.d[0], v2.d[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmadd213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xac 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v18.16b\",\n        \"fmls v2.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmadd213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xac 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z18.d\",\n        \"fmls z0.s, p7/m, z17.s, z16.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfnmadd213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xac 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v18.16b\",\n        \"fmls v2.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmadd213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xac 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z18.d\",\n        \"fmls z0.d, p7/m, z17.d, z16.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfnmadd213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xad 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v18.16b\",\n        \"fmls v2.4s, v17.4s, v16.4s\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.s[0], v2.s[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmadd213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xad 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v18.16b\",\n        \"fmls v2.2d, v17.2d, v16.2d\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.d[0], v2.d[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmsub213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xae 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z18.d\",\n        \"fnmla z2.s, p6/m, z17.s, z16.s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmsub213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xae 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z18.d\",\n        \"fnmla z0.s, p7/m, z17.s, z16.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfnmsub213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xae 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z18.d\",\n        \"fnmla z2.d, p6/m, z17.d, z16.d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmsub213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xae 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z0.d, z18.d\",\n        \"fnmla z0.d, p7/m, z17.d, z16.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfnmsub213ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xaf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z18.d\",\n        \"fnmla z2.s, p6/m, z17.s, z16.s\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.s[0], v2.s[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmsub213sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xaf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z18.d\",\n        \"fnmla z2.d, p6/m, z17.d, z16.d\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.d[0], v2.d[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmadd231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xb8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"fmla v2.4s, v17.4s, v18.4s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmadd231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0xb8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmla z16.s, p7/m, z17.s, z18.s\"\n      ]\n    },\n    \"vfmadd231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xb8 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"fmla v2.2d, v17.2d, v18.2d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmadd231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0xb8 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmla z16.d, p7/m, z17.d, z18.d\"\n      ]\n    },\n    \"vfmadd231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xb9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"fmla v2.4s, v17.4s, v18.4s\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.s[0], v2.s[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmadd231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xb9 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"fmla v2.2d, v17.2d, v18.2d\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.d[0], v2.d[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsub231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xba 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z16.d\",\n        \"fnmls z2.s, p6/m, z17.s, z18.s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsub231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0xba 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmls z16.s, p7/m, z17.s, z18.s\"\n      ]\n    },\n    \"vfmsub231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xba 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z16.d\",\n        \"fnmls z2.d, p6/m, z17.d, z18.d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsub231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0xba 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmls z16.d, p7/m, z17.d, z18.d\"\n      ]\n    },\n    \"vfmsub231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xbb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z16.d\",\n        \"fnmls z2.s, p6/m, z17.s, z18.s\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.s[0], v2.s[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsub231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xbb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z16.d\",\n        \"fnmls z2.d, p6/m, z17.d, z18.d\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.d[0], v2.d[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmadd231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbc 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"fmls v2.4s, v17.4s, v18.4s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmadd231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0xbc 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmls z16.s, p7/m, z17.s, z18.s\"\n      ]\n    },\n    \"vfnmadd231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbc 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"fmls v2.2d, v17.2d, v18.2d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmadd231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0xbc 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmls z16.d, p7/m, z17.d, z18.d\"\n      ]\n    },\n    \"vfnmadd231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xbd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"fmls v2.4s, v17.4s, v18.4s\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.s[0], v2.s[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmadd231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xbd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"fmls v2.2d, v17.2d, v18.2d\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.d[0], v2.d[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmsub231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbe 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z16.d\",\n        \"fnmla z2.s, p6/m, z17.s, z18.s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmsub231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0xbe 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmla z16.s, p7/m, z17.s, z18.s\"\n      ]\n    },\n    \"vfnmsub231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xbe 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z16.d\",\n        \"fnmla z2.d, p6/m, z17.d, z18.d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmsub231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0xbe 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fnmla z16.d, p7/m, z17.d, z18.d\"\n      ]\n    },\n    \"vfnmsub231ss xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xbf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z16.d\",\n        \"fnmla z2.s, p6/m, z17.s, z18.s\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.s[0], v2.s[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfnmsub231sd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xbf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.d, z16.d\",\n        \"fnmla z2.d, p6/m, z17.d, z18.d\",\n        \"mov v0.16b, v16.16b\",\n        \"mov v0.d[0], v2.d[0]\",\n        \"mov v2.16b, v0.16b\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmaddsub213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xa6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3040]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"fmla v2.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmaddsub213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xa6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2368]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"eor z2.d, z18.d, z2.d\",\n        \"mov z0.d, z2.d\",\n        \"fmla z0.s, p7/m, z17.s, z16.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmaddsub213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xa6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3072]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"fmla v2.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmaddsub213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xa6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2384]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"eor z2.d, z18.d, z2.d\",\n        \"mov z0.d, z2.d\",\n        \"fmla z0.d, p7/m, z17.d, z16.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmsubadd213ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xa7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3104]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"fmla v2.4s, v17.4s, v16.4s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsubadd213ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xa7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2400]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"eor z2.d, z18.d, z2.d\",\n        \"mov z0.d, z2.d\",\n        \"fmla z0.s, p7/m, z17.s, z16.s\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmsubadd213pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xa7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3136]\",\n        \"eor v2.16b, v18.16b, v2.16b\",\n        \"fmla v2.2d, v17.2d, v16.2d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsubadd213pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 2 0b01 0xa7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2416]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"eor z2.d, z18.d, z2.d\",\n        \"mov z0.d, z2.d\",\n        \"fmla z0.d, p7/m, z17.d, z16.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmaddsub231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xb6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3040]\",\n        \"eor v2.16b, v16.16b, v2.16b\",\n        \"fmla v2.4s, v17.4s, v18.4s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmaddsub231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xb6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2368]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"eor z2.d, z16.d, z2.d\",\n        \"mov z16.d, z2.d\",\n        \"fmla z16.s, p7/m, z17.s, z18.s\"\n      ]\n    },\n    \"vfmaddsub231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xb6 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3072]\",\n        \"eor v2.16b, v16.16b, v2.16b\",\n        \"fmla v2.2d, v17.2d, v18.2d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmaddsub231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xb6 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2384]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"eor z2.d, z16.d, z2.d\",\n        \"mov z16.d, z2.d\",\n        \"fmla z16.d, p7/m, z17.d, z18.d\"\n      ]\n    },\n    \"vfmsubadd231ps xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xb7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3104]\",\n        \"eor v2.16b, v16.16b, v2.16b\",\n        \"fmla v2.4s, v17.4s, v18.4s\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsubadd231ps ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xb7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2400]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"eor z2.d, z16.d, z2.d\",\n        \"mov z16.d, z2.d\",\n        \"fmla z16.s, p7/m, z17.s, z18.s\"\n      ]\n    },\n    \"vfmsubadd231pd xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xb7 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3136]\",\n        \"eor v2.16b, v16.16b, v2.16b\",\n        \"fmla v2.2d, v17.2d, v18.2d\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vfmsubadd231pd ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xb7 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x0, [x28, #2416]\",\n        \"ld1b {z2.b}, p7/z, [x0]\",\n        \"eor z2.d, z16.d, z2.d\",\n        \"mov z16.d, z2.d\",\n        \"fmla z16.d, p7/m, z17.d, z18.d\"\n      ]\n    },\n    \"vaesimc xmm0, xmm1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0xdb 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"aesimc v16.16b, v17.16b\"\n      ]\n    },\n    \"vaesenc xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xdc 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v0.16b, v17.16b\",\n        \"aese v0.16b, v2.16b\",\n        \"aesmc v0.16b, v0.16b\",\n        \"eor v16.16b, v0.16b, v18.16b\"\n      ]\n    },\n    \"vaesenc ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 2 0b01 0xdc 256-bit\"\n      ]\n    },\n    \"vaesenclast xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xdd 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v0.16b, v17.16b\",\n        \"aese v0.16b, v2.16b\",\n        \"eor v16.16b, v0.16b, v18.16b\"\n      ]\n    },\n    \"vaesenclast ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 2 0b01 0xdd 256-bit\"\n      ]\n    },\n    \"vaesdec xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b01 0xde 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v0.16b, v17.16b\",\n        \"aesd v0.16b, v2.16b\",\n        \"aesimc v0.16b, v0.16b\",\n        \"eor v16.16b, v0.16b, v18.16b\"\n      ]\n    },\n    \"vaesdec ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 2 0b01 0xde 256-bit\"\n      ]\n    },\n    \"vaesdeclast xmm0, xmm1, xmm2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b01 0xdf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v0.16b, v17.16b\",\n        \"aesd v0.16b, v2.16b\",\n        \"eor v16.16b, v0.16b, v18.16b\"\n      ]\n    },\n    \"vaesdeclast ymm0, ymm1, ymm2\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 2 0b01 0xdf 256-bit\"\n      ]\n    },\n    \"andn eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b00 0xf2 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"bic w4, w7, w6\",\n        \"subs w26, w4, #0x0 (0)\"\n      ]\n    },\n    \"andn rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b00 0xf2 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"bic x4, x7, x6\",\n        \"subs x26, x4, #0x0 (0)\"\n      ]\n    },\n    \"bzhi eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b00 0xf5 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"lsl w20, w20, w7\",\n        \"bic w20, w6, w20\",\n        \"tst x7, #0xe0\",\n        \"csel w4, w6, w20, ne\",\n        \"cset x20, eq\",\n        \"cmp w4, #0x0 (0)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"bzhi rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 2 0b00 0xf5 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xffffffffffffffff\",\n        \"lsl x20, x20, x7\",\n        \"bic x20, x6, x20\",\n        \"tst x7, #0xc0\",\n        \"csel x4, x6, x20, ne\",\n        \"cset x20, eq\",\n        \"cmp x4, #0x0 (0)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"pext eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b10 0xf5 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cbz w7, #+0x2c\",\n        \"mov w0, w7\",\n        \"mov w2, w6\",\n        \"mov w4, wzr\",\n        \"cbz w0, #+0x20\",\n        \"clz w1, w0\",\n        \"lsl w2, w2, w1\",\n        \"lsl w0, w0, w1\",\n        \"extr w4, w4, w2, #31\",\n        \"bfc w0, #31, #1\",\n        \"b #-0x18\",\n        \"mov w4, wzr\"\n      ]\n    },\n    \"pext rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b10 0xf5 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"cbz x7, #+0x2c\",\n        \"mov x0, x7\",\n        \"mov x2, x6\",\n        \"mov x4, xzr\",\n        \"cbz x0, #+0x20\",\n        \"clz x1, x0\",\n        \"lsl x2, x2, x1\",\n        \"lsl x0, x0, x1\",\n        \"extr x4, x4, x2, #63\",\n        \"bfc x0, #63, #1\",\n        \"b #-0x18\",\n        \"mov x4, xzr\"\n      ]\n    },\n    \"pdep eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b11 0xf5 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, x6\",\n        \"mov x1, x7\",\n        \"mov w4, #0x0\",\n        \"cbz w7, #+0x2c\",\n        \"neg w2, w1\",\n        \"and w2, w2, w1\",\n        \"sbfx w3, w0, #0, #1\",\n        \"eor w1, w1, w2\",\n        \"and w2, w3, w2\",\n        \"neg w3, w1\",\n        \"orr w4, w4, w2\",\n        \"lsr w0, w0, #1\",\n        \"and w2, w1, w3\",\n        \"cbnz w2, #-0x1c\"\n      ]\n    },\n    \"pdep rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 2 0b11 0xf5 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x0, x6\",\n        \"mov x1, x7\",\n        \"mov x4, #0x0\",\n        \"cbz x7, #+0x2c\",\n        \"neg x2, x1\",\n        \"and x2, x2, x1\",\n        \"sbfx x3, x0, #0, #1\",\n        \"eor x1, x1, x2\",\n        \"and x2, x3, x2\",\n        \"neg x3, x1\",\n        \"orr x4, x4, x2\",\n        \"lsr x0, x0, #1\",\n        \"and x2, x1, x3\",\n        \"cbnz x2, #-0x1c\"\n      ]\n    },\n    \"mulx eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 2 0b11 0xf6 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mul w6, w7, w5\",\n        \"ubfx x0, x7, #0, #32\",\n        \"ubfx x1, x5, #0, #32\",\n        \"mul x4, x0, x1\",\n        \"lsr x4, x4, #32\"\n      ]\n    },\n    \"mulx eax, eax, ebx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Same two destinations should only compute high part\",\n        \"Map 2 0b11 0xf6 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ubfx x0, x6, #0, #32\",\n        \"ubfx x1, x5, #0, #32\",\n        \"mul x4, x0, x1\",\n        \"lsr x4, x4, #32\"\n      ]\n    },\n    \"mulx eax, ebx, [ecx]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 2 0b11 0xf6 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w7\",\n        \"ldr w20, [x20]\",\n        \"mul w6, w20, w5\",\n        \"ubfx x0, x20, #0, #32\",\n        \"ubfx x1, x5, #0, #32\",\n        \"mul x4, x0, x1\",\n        \"lsr x4, x4, #32\"\n      ]\n    },\n    \"mulx rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b11 0xf6 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mul x6, x7, x5\",\n        \"umulh x4, x7, x5\"\n      ]\n    },\n    \"mulx rax, rax, rbx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Same two destinations should only compute high part\",\n        \"Map 2 0b11 0xf6 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umulh x4, x6, x5\"\n      ]\n    },\n    \"mulx rax, rbx, [rcx]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b11 0xf6 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x7]\",\n        \"mul x6, x20, x5\",\n        \"umulh x4, x20, x5\"\n      ]\n    },\n    \"bextr eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b00 0xf7 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtb w20, w7\",\n        \"lsr w21, w6, w20\",\n        \"mov w22, #0x0\",\n        \"cmp w20, #0x1f (31)\",\n        \"csel w20, w21, w22, ls\",\n        \"ubfx w21, w7, #8, #8\",\n        \"mov x22, #0xffffffffffffffff\",\n        \"lsl w22, w22, w21\",\n        \"bic w22, w20, w22\",\n        \"cmp w21, #0x1f (31)\",\n        \"csel w4, w22, w20, ls\",\n        \"cmp w4, #0x0 (0)\"\n      ]\n    },\n    \"bextr rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 2 0b00 0xf7 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"uxtb x20, w7\",\n        \"lsr x21, x6, x20\",\n        \"mov w22, #0x0\",\n        \"cmp x20, #0x3f (63)\",\n        \"csel x20, x21, x22, ls\",\n        \"ubfx x21, x7, #8, #8\",\n        \"mov x22, #0xffffffffffffffff\",\n        \"lsl x22, x22, x21\",\n        \"bic x22, x20, x22\",\n        \"cmp x21, #0x3f (63)\",\n        \"csel x4, x22, x20, ls\",\n        \"cmp x4, #0x0 (0)\"\n      ]\n    },\n    \"shlx eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0xf7 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"lsl w4, w6, w7\"\n      ]\n    },\n    \"shlx eax, [ebx], ecx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b01 0xf7 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w6\",\n        \"ldr w20, [x20]\",\n        \"lsl w4, w20, w7\"\n      ]\n    },\n    \"shlx rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b01 0xf7 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"lsl x4, x6, x7\"\n      ]\n    },\n    \"shlx rax, [rbx], rcx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b01 0xf7 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x6]\",\n        \"lsl x4, x20, x7\"\n      ]\n    },\n    \"sarx eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b10 0xf7 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"asr w4, w6, w7\"\n      ]\n    },\n    \"sarx eax, [ebx], ecx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b10 0xf7 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w6\",\n        \"ldr w20, [x20]\",\n        \"asr w4, w20, w7\"\n      ]\n    },\n    \"sarx rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b10 0xf7 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"asr x4, x6, x7\"\n      ]\n    },\n    \"sarx rax, [rbx], rcx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b10 0xf7 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x6]\",\n        \"asr x4, x20, x7\"\n      ]\n    },\n    \"shrx eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b11 0xf7 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"lsr w4, w6, w7\"\n      ]\n    },\n    \"shrx eax, [ebx], ecx\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 2 0b11 0xf7 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, w6\",\n        \"ldr w20, [x20]\",\n        \"lsr w4, w20, w7\"\n      ]\n    },\n    \"shrx rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 2 0b11 0xf7 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"lsr x4, x6, x7\"\n      ]\n    },\n    \"shrx rax, [rbx], rcx\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 2 0b11 0xf7 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr x20, [x6]\",\n        \"lsr x4, x20, x7\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/VEX_map2_svebitperm.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE256\",\n      \"SVE128\",\n      \"SVEBITPERM\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ]\n  },\n  \"Instructions\": {\n    \"pext eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b10 0xf5 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov s0, w6\",\n        \"fmov s1, w7\",\n        \"bext z0.s, z0.s, z1.s\",\n        \"mov w4, v0.s[0]\"\n      ]\n    },\n    \"pext rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b10 0xf5 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov d0, x6\",\n        \"fmov d1, x7\",\n        \"bext z0.d, z0.d, z1.d\",\n        \"mov x4, v0.d[0]\"\n      ]\n    },\n    \"pdep eax, ebx, ecx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b11 0xf5 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov s0, w6\",\n        \"fmov s1, w7\",\n        \"bdep z0.s, z0.s, z1.s\",\n        \"mov w4, v0.s[0]\"\n      ]\n    },\n    \"pdep rax, rbx, rcx\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 2 0b11 0xf5 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmov d0, x6\",\n        \"fmov d1, x7\",\n        \"bdep z0.d, z0.d, z1.d\",\n        \"mov x4, v0.d[0]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/VEX_map3.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE256\",\n      \"SVE128\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"AFP\"\n    ]\n  },\n  \"Instructions\": {\n    \"vpermq ymm0, ymm1, 1\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 2\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 3\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 4\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 5\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 6\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 7\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 8\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 9\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 10\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 11\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 12\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 13\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 14\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 15\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, d17\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 01010101b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, z17.d[1]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 10101010b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, z17.d[2]\"\n      ]\n    },\n    \"vpermq ymm0, ymm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x00 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, z17.d[3]\"\n      ]\n    },\n    \"vpermpd ymm0, ymm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x01 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, d17\"\n      ]\n    },\n    \"vpermpd ymm0, ymm1, 01010101b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x01 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, z17.d[1]\"\n      ]\n    },\n    \"vpermpd ymm0, ymm1, 10101010b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x01 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, z17.d[2]\"\n      ]\n    },\n    \"vpermpd ymm0, ymm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x01 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, z17.d[3]\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0001b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v17.s[0]\",\n        \"mov v2.s[1], v16.s[1]\",\n        \"mov v2.s[2], v16.s[2]\",\n        \"mov v2.s[3], v16.s[3]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0010b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v16.s[0]\",\n        \"mov v2.s[1], v17.s[1]\",\n        \"mov v2.s[2], v16.s[2]\",\n        \"mov v2.s[3], v16.s[3]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0011b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v17.s[0]\",\n        \"mov v2.s[1], v17.s[1]\",\n        \"mov v2.s[2], v16.s[2]\",\n        \"mov v2.s[3], v16.s[3]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0100b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v16.s[0]\",\n        \"mov v2.s[1], v16.s[1]\",\n        \"mov v2.s[2], v17.s[2]\",\n        \"mov v2.s[3], v16.s[3]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0101b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v17.s[0]\",\n        \"mov v2.s[1], v16.s[1]\",\n        \"mov v2.s[2], v17.s[2]\",\n        \"mov v2.s[3], v16.s[3]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0110b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v16.s[0]\",\n        \"mov v2.s[1], v17.s[1]\",\n        \"mov v2.s[2], v17.s[2]\",\n        \"mov v2.s[3], v16.s[3]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 0111b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v17.s[0]\",\n        \"mov v2.s[1], v17.s[1]\",\n        \"mov v2.s[2], v17.s[2]\",\n        \"mov v2.s[3], v16.s[3]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1000b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v16.s[0]\",\n        \"mov v2.s[1], v16.s[1]\",\n        \"mov v2.s[2], v16.s[2]\",\n        \"mov v2.s[3], v17.s[3]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1001b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v17.s[0]\",\n        \"mov v2.s[1], v16.s[1]\",\n        \"mov v2.s[2], v16.s[2]\",\n        \"mov v2.s[3], v17.s[3]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1010b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v16.s[0]\",\n        \"mov v2.s[1], v17.s[1]\",\n        \"mov v2.s[2], v16.s[2]\",\n        \"mov v2.s[3], v17.s[3]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1011b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v17.s[0]\",\n        \"mov v2.s[1], v17.s[1]\",\n        \"mov v2.s[2], v16.s[2]\",\n        \"mov v2.s[3], v17.s[3]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1100b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v16.s[0]\",\n        \"mov v2.s[1], v16.s[1]\",\n        \"mov v2.s[2], v17.s[2]\",\n        \"mov v2.s[3], v17.s[3]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1101b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v17.s[0]\",\n        \"mov v2.s[1], v16.s[1]\",\n        \"mov v2.s[2], v17.s[2]\",\n        \"mov v2.s[3], v17.s[3]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1110b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v16.s[0]\",\n        \"mov v2.s[1], v17.s[1]\",\n        \"mov v2.s[2], v17.s[2]\",\n        \"mov v2.s[3], v17.s[3]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpblendd xmm0, xmm1, 1111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpblendd ymm0, ymm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"vpblendd ymm0, ymm1, 01010101b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z16.s[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z16.s[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z16.s[5]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[6]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z16.s[7]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpblendd ymm0, ymm1, 10101010b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.s, s16\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z16.s[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z16.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[5]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z16.s[6]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[7]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpblendd ymm0, ymm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x02 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vpermilps xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v17.s[0]\",\n        \"mov v2.s[1], v17.s[0]\",\n        \"mov v2.s[2], v17.s[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.s[3], v17.s[0]\"\n      ]\n    },\n    \"vpermilps xmm0, xmm1, 01010101b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v17.s[1]\",\n        \"mov v2.s[1], v17.s[1]\",\n        \"mov v2.s[2], v17.s[1]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.s[3], v17.s[1]\"\n      ]\n    },\n    \"vpermilps xmm0, xmm1, 10101010b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v17.s[2]\",\n        \"mov v2.s[1], v17.s[2]\",\n        \"mov v2.s[2], v17.s[2]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.s[3], v17.s[2]\"\n      ]\n    },\n    \"vpermilps xmm0, xmm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v17.s[3]\",\n        \"mov v2.s[1], v17.s[3]\",\n        \"mov v2.s[2], v17.s[3]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.s[3], v17.s[3]\"\n      ]\n    },\n    \"vpermilps ymm0, ymm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s17\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilps ymm0, ymm1, 01010101b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.s, z17.s[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[5]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[5]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[5]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[5]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilps ymm0, ymm1, 10101010b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.s, z17.s[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[6]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[6]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[6]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[6]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilps ymm0, ymm1, 11111111b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 3 0b01 0x03 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.s, z17.s[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[7]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[7]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[7]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[7]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd xmm0, xmm1, 00b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.d[0], v17.d[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.d[1], v17.d[0]\"\n      ]\n    },\n    \"vpermilpd xmm0, xmm1, 01b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.d[0], v17.d[1]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.d[1], v17.d[0]\"\n      ]\n    },\n    \"vpermilpd xmm0, xmm1, 10b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.d[0], v17.d[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.d[1], v17.d[1]\"\n      ]\n    },\n    \"vpermilpd xmm0, xmm1, 11b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.d[0], v17.d[1]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.d[1], v17.d[1]\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0000b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0001b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0010b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0011b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0100b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0101b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0110b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 0111b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1000b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1001b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1010b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1011b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1100b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1101b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1110b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpermilpd ymm0, ymm1, 1111b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x05 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q17\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q17\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00000001b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q17\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00000010b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q17\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00000011b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q17\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00010000b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q17\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00010001b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00010010b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00010011b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00100000b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q17\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q18\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00100001b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q18\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00100010b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q18\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00100011b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q18\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00110000b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q17\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00110001b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00110010b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00110011b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00001000b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q17\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00011000b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00101000b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 00111000b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 10001000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 10000000b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q17\",\n        \"mov z16.d, z2.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 10000001b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 10000010b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"mov z16.d, z2.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vperm2f128 ymm0, ymm1, ymm2, 10000011b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x06 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vroundps xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x08 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintn v16.4s, v17.4s\"\n      ]\n    },\n    \"vroundps xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x08 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintm v16.4s, v17.4s\"\n      ]\n    },\n    \"vroundps xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x08 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintp v16.4s, v17.4s\"\n      ]\n    },\n    \"vroundps xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x08 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintz v16.4s, v17.4s\"\n      ]\n    },\n    \"vroundps xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x08 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti v16.4s, v17.4s\"\n      ]\n    },\n    \"vroundps ymm0, ymm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x08 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintn z16.s, p7/m, z17.s\"\n      ]\n    },\n    \"vroundps ymm0, ymm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x08 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintm z16.s, p7/m, z17.s\"\n      ]\n    },\n    \"vroundps ymm0, ymm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x08 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintp z16.s, p7/m, z17.s\"\n      ]\n    },\n    \"vroundps ymm0, ymm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x08 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintz z16.s, p7/m, z17.s\"\n      ]\n    },\n    \"vroundps ymm0, ymm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x08 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti z16.s, p7/m, z17.s\"\n      ]\n    },\n    \"vroundpd xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x09 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintn v16.2d, v17.2d\"\n      ]\n    },\n    \"vroundpd xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x09 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintm v16.2d, v17.2d\"\n      ]\n    },\n    \"vroundpd xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x09 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintp v16.2d, v17.2d\"\n      ]\n    },\n    \"vroundpd xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x09 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintz v16.2d, v17.2d\"\n      ]\n    },\n    \"vroundpd xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x09 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti v16.2d, v17.2d\"\n      ]\n    },\n    \"vroundpd ymm0, ymm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x09 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintn z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vroundpd ymm0, ymm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x09 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintm z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vroundpd ymm0, ymm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x09 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintp z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vroundpd ymm0, ymm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x09 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frintz z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vroundpd ymm0, ymm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x09 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"frinti z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vroundss xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintn s0, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vroundss xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintm s0, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vroundss xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintp s0, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vroundss xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintz s0, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vroundss xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x0a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frinti s0, s17\",\n        \"mov v16.s[0], v0.s[0]\"\n      ]\n    },\n    \"vroundsd xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintn d0, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vroundsd xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintm d0, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vroundsd xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintp d0, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vroundsd xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frintz d0, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vroundsd xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x0b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v16.16b\",\n        \"frinti d0, d17\",\n        \"mov v16.d[0], v0.d[0]\"\n      ]\n    },\n    \"vblendps xmm0, xmm1, xmm2, 0000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vblendps xmm0, xmm1, xmm2, 0001b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"Map 3 0b01 0x0c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.s[0], v18.s[0]\",\n        \"mov v2.s[1], v17.s[1]\",\n        \"mov v2.s[2], v17.s[2]\",\n        \"mov v2.s[3], v17.s[3]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vblendps xmm0, xmm1, xmm2, 1111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vblendps ymm0, ymm1, ymm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vblendps ymm0, ymm1, ymm2, 10000001b\": {\n      \"ExpectedInstructionCount\": 50,\n      \"Comment\": [\n        \"Map 3 0b01 0x0c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.s, s18\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[5]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z17.s[6]\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, z18.s[7]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vblendps ymm0, ymm1, ymm2, 11111111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z18.d\"\n      ]\n    },\n    \"vblendpd xmm0, xmm1, xmm2, 00b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vblendpd xmm0, xmm1, xmm2, 01b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.d[0], v18.d[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.d[1], v17.d[1]\"\n      ]\n    },\n    \"vblendpd xmm0, xmm1, xmm2, 10b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.d[0], v17.d[0]\",\n        \"mov v16.16b, v2.16b\",\n        \"mov v16.d[1], v18.d[1]\"\n      ]\n    },\n    \"vblendpd xmm0, xmm1, xmm2, 11b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0001b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d18\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0010b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0011b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d18\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0100b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0101b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d18\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0110b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 0111b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d18\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1000b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1001b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d18\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1010b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1011b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d18\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1100b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1101b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d18\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z17.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1110b\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.d, d17\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-2\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #-1\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #0\",\n        \"mov z2.d, p0/m, z1.d\",\n        \"msr nzcv, x0\",\n        \"mov z1.d, z18.d[3]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.d, #-2, #1\",\n        \"cmpeq p0.d, p7/z, z0.d, #1\",\n        \"mov z16.d, p0/m, z1.d\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vblendpd ymm0, ymm1, ymm2, 1111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0d 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z18.d\"\n      ]\n    },\n    \"vpblendw xmm0, xmm1, xmm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpblendw xmm0, xmm1, xmm2, 00000001b\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"Map 3 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov v2.h[0], v18.h[0]\",\n        \"mov v2.h[1], v17.h[1]\",\n        \"mov v2.h[2], v17.h[2]\",\n        \"mov v2.h[3], v17.h[3]\",\n        \"mov v2.h[4], v17.h[4]\",\n        \"mov v2.h[5], v17.h[5]\",\n        \"mov v2.h[6], v17.h[6]\",\n        \"mov v2.h[7], v17.h[7]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpblendw xmm0, xmm1, xmm2, 11111111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vpblendw ymm0, ymm1, ymm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vpblendw ymm0, ymm1, ymm2, 00000001b\": {\n      \"ExpectedInstructionCount\": 98,\n      \"Comment\": [\n        \"Map 3 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.h, h18\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-8\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[1]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-7\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[2]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-6\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[3]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-5\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[4]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-4\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[5]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-3\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[6]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-2\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[7]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #-1\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z18.h[8]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #0\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[9]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #1\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[10]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #2\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[11]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #3\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[12]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #4\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[13]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #5\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[14]\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #6\",\n        \"mov z2.h, p0/m, z1.h\",\n        \"msr nzcv, x0\",\n        \"mov z1.h, z17.h[15]\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.h, #-8, #1\",\n        \"cmpeq p0.h, p7/z, z0.h, #7\",\n        \"mov z16.h, p0/m, z1.h\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vpblendw ymm0, ymm1, ymm2, 11111111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0e 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z18.d\"\n      ]\n    },\n    \"vpalignr xmm0, xmm1, xmm2, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v18.16b\"\n      ]\n    },\n    \"vpalignr xmm0, xmm1, xmm2, 1\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ext v16.16b, v18.16b, v17.16b, #1\"\n      ]\n    },\n    \"vpalignr xmm0, xmm1, xmm2, 15\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ext v16.16b, v18.16b, v17.16b, #15\"\n      ]\n    },\n    \"vpalignr xmm0, xmm1, xmm2, 16\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.2d, #0x0\",\n        \"ext v16.16b, v17.16b, v0.16b, #0\"\n      ]\n    },\n    \"vpalignr ymm0, ymm1, ymm2, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z18.d\"\n      ]\n    },\n    \"vpalignr ymm0, ymm1, ymm2, 1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ext v2.16b, v18.16b, v17.16b, #1\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z3.d, z17.d\",\n        \"mov z3.b, p6/m, z1.b\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z4.d, z18.d\",\n        \"mov z4.b, p6/m, z1.b\",\n        \"ext v4.16b, v4.16b, v3.16b, #1\",\n        \"mov z1.q, q4\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vpalignr ymm0, ymm1, ymm2, 15\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ext v2.16b, v18.16b, v17.16b, #15\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z3.d, z17.d\",\n        \"mov z3.b, p6/m, z1.b\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z4.d, z18.d\",\n        \"mov z4.b, p6/m, z1.b\",\n        \"ext v4.16b, v4.16b, v3.16b, #15\",\n        \"mov z1.q, q4\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vpalignr ymm0, ymm1, ymm2, 16\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 3 0b01 0x0f 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v0.2d, #0x0\",\n        \"ext v2.16b, v17.16b, v0.16b, #0\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z3.d, z17.d\",\n        \"mov z3.b, p6/m, z1.b\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z4.d, z18.d\",\n        \"mov z4.b, p6/m, z1.b\",\n        \"movi v0.2d, #0x0\",\n        \"ext v4.16b, v3.16b, v0.16b, #0\",\n        \"mov z1.q, q4\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vpextrb rax, xmm0, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x14 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.b[0]\"\n      ]\n    },\n    \"vpextrb rax, xmm0, 15\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x14 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.b[15]\"\n      ]\n    },\n    \"vpextrw rax, xmm0, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x15 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[0]\"\n      ]\n    },\n    \"vpextrw rax, xmm0, 7\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x15 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"umov w4, v16.h[7]\"\n      ]\n    },\n    \"vpextrd rax, xmm0, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, v16.s[0]\"\n      ]\n    },\n    \"vpextrd rax, xmm0, 3\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, v16.s[3]\"\n      ]\n    },\n    \"vpextrb [rax], xmm0, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x14 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.b}[0], [x4]\"\n      ]\n    },\n    \"vpextrb [rax], xmm0, 15\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x14 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.b}[15], [x4]\"\n      ]\n    },\n    \"vpextrw [rax], xmm0, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x15 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[0], [x4]\"\n      ]\n    },\n    \"vpextrw [rax], xmm0, 7\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x15 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.h}[7], [x4]\"\n      ]\n    },\n    \"vpextrd [rax], xmm0, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.s}[0], [x4]\"\n      ]\n    },\n    \"vpextrd [rax], xmm0, 3\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x16 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"st1 {v16.s}[3], [x4]\"\n      ]\n    },\n    \"vextractps eax, xmm0, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x17 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, v16.s[0]\"\n      ]\n    },\n    \"vextractps eax, xmm0, 3\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x17 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, v16.s[3]\"\n      ]\n    },\n    \"vinsertf128 ymm0, ymm1, xmm2, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x18 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.q, q18\",\n        \"mov z16.d, z17.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vinsertf128 ymm0, ymm1, xmm2, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x18 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.q, q18\",\n        \"mov z16.d, z17.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vextractf128 xmm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x19 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vextractf128 xmm0, ymm1, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x19 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z17.q[1]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vcvtps2ph xmm0, xmm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x1D 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, fpcr\",\n        \"and x0, x20, #0xffffffffff3fffff\",\n        \"msr fpcr, x0\",\n        \"fcvtn v16.4h, v17.4s\",\n        \"msr fpcr, x20\"\n      ]\n    },\n    \"vcvtps2ph xmm0, xmm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x1D 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, fpcr\",\n        \"and x0, x20, #0xffffffffffbfffff\",\n        \"orr x0, x0, #0x800000\",\n        \"msr fpcr, x0\",\n        \"fcvtn v16.4h, v17.4s\",\n        \"msr fpcr, x20\"\n      ]\n    },\n    \"vcvtps2ph xmm0, xmm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x1D 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, fpcr\",\n        \"and x0, x20, #0xffffffffff7fffff\",\n        \"orr x0, x0, #0x400000\",\n        \"msr fpcr, x0\",\n        \"fcvtn v16.4h, v17.4s\",\n        \"msr fpcr, x20\"\n      ]\n    },\n    \"vcvtps2ph xmm0, xmm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x1D 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, fpcr\",\n        \"orr x0, x20, #0xc00000\",\n        \"msr fpcr, x0\",\n        \"fcvtn v16.4h, v17.4s\",\n        \"msr fpcr, x20\"\n      ]\n    },\n    \"vcvtps2ph xmm0, xmm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x1D 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvtn v16.4h, v17.4s\"\n      ]\n    },\n    \"vcvtps2ph xmm0, ymm1, 00000000b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"nearest rounding\",\n        \"Map 3 0b01 0x1D 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, fpcr\",\n        \"and x0, x20, #0xffffffffff3fffff\",\n        \"msr fpcr, x0\",\n        \"fcvtnt z2.h, p7/m, z17.s\",\n        \"uzp2 z2.h, z2.h, z2.h\",\n        \"msr fpcr, x20\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vcvtps2ph xmm0, ymm1, 00000001b\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"-inf rounding\",\n        \"Map 3 0b01 0x1D 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, fpcr\",\n        \"and x0, x20, #0xffffffffffbfffff\",\n        \"orr x0, x0, #0x800000\",\n        \"msr fpcr, x0\",\n        \"fcvtnt z2.h, p7/m, z17.s\",\n        \"uzp2 z2.h, z2.h, z2.h\",\n        \"msr fpcr, x20\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vcvtps2ph xmm0, ymm1, 00000010b\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"+inf rounding\",\n        \"Map 3 0b01 0x1D 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, fpcr\",\n        \"and x0, x20, #0xffffffffff7fffff\",\n        \"orr x0, x0, #0x400000\",\n        \"msr fpcr, x0\",\n        \"fcvtnt z2.h, p7/m, z17.s\",\n        \"uzp2 z2.h, z2.h, z2.h\",\n        \"msr fpcr, x20\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vcvtps2ph xmm0, ymm1, 00000011b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"truncate rounding\",\n        \"Map 3 0b01 0x1D 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, fpcr\",\n        \"orr x0, x20, #0xc00000\",\n        \"msr fpcr, x0\",\n        \"fcvtnt z2.h, p7/m, z17.s\",\n        \"uzp2 z2.h, z2.h, z2.h\",\n        \"msr fpcr, x20\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vcvtps2ph xmm0, ymm1, 00000100b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"host mode rounding\",\n        \"Map 3 0b01 0x1D 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fcvtnt z2.h, p7/m, z17.s\",\n        \"uzp2 z2.h, z2.h, z2.h\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpinsrb xmm0, xmm0, eax, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x20 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov v2.b[0], w4\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpinsrb xmm0, xmm1, eax, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x20 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.b[0], w4\"\n      ]\n    },\n    \"vpinsrb xmm0, xmm1, eax, 15\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x20 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.b[15], w4\"\n      ]\n    },\n    \"vinsertps xmm0, xmm1, xmm2, ((0b00 << 6) | (0b00 << 4) | (0b0000))\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x21 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[0], v18.s[0]\"\n      ]\n    },\n    \"vinsertps xmm0, xmm1, xmm2, ((0b00 << 6) | (0b00 << 4) | (0b1111))\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x21 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vinsertps xmm0, xmm1, xmm2, ((0b11 << 6) | (0b11 << 4) | (0b0000))\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x21 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[3], v18.s[3]\"\n      ]\n    },\n    \"vpinsrd xmm0, xmm0, eax, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x22 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov v2.s[0], w4\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpinsrd xmm0, xmm1, eax, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x22 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[0], w4\"\n      ]\n    },\n    \"vpinsrd xmm0, xmm1, eax, 3\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x22 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.s[3], w4\"\n      ]\n    },\n    \"vpinsrq xmm0, xmm0, rax, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x22 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v2.16b, v16.16b\",\n        \"mov v2.d[0], x4\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vpinsrq xmm0, xmm1, rax, 0\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x22 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[0], x4\"\n      ]\n    },\n    \"vpinsrq xmm0, xmm1, rax, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x22 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\",\n        \"mov v16.d[1], x4\"\n      ]\n    },\n    \"vinserti128 ymm0, ymm1, xmm2, 0\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x38 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.q, q18\",\n        \"mov z16.d, z17.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vinserti128 ymm0, ymm1, xmm2, 1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x38 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z1.q, q18\",\n        \"mov z16.d, z17.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vextracti128 xmm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x39 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vextracti128 xmm0, ymm1, 1\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x39 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z2.q, z17.q[1]\",\n        \"mov v16.16b, v2.16b\"\n      ]\n    },\n    \"vdpps xmm0, xmm1, xmm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vdpps xmm0, xmm1, xmm2, 00001111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vdpps xmm0, xmm1, xmm2, 11110000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vdpps xmm0, xmm1, xmm2, 11111111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v2.4s, v17.4s, v18.4s\",\n        \"faddv s2, p6, z2.s\",\n        \"dup v16.4s, v2.s[0]\"\n      ]\n    },\n    \"vdpps ymm0, ymm1, ymm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vdpps ymm0, ymm1, ymm2, 00001111b\": {\n      \"ExpectedInstructionCount\": 109,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul z3.s, z17.s, z18.s\",\n        \"mov z1.s, s2\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z3.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s2\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z3.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s2\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z3.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s2\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z3.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s2\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z3.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s2\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z3.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s2\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z3.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s2\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z3.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"movprfx z0, z3\",\n        \"faddp z0.s, p7/m, z0.s, z2.s\",\n        \"uzp1 z3.s, z0.s, z0.s\",\n        \"uzp2 z1.s, z0.s, z0.s\",\n        \"splice z3.d, p6, z3.d, z1.d\",\n        \"movprfx z0, z3\",\n        \"faddp z0.s, p7/m, z0.s, z2.s\",\n        \"uzp1 z3.s, z0.s, z0.s\",\n        \"uzp2 z1.s, z0.s, z0.s\",\n        \"splice z3.d, p6, z3.d, z1.d\",\n        \"mov z1.s, s3\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s3\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s3\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s3\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s3\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s3\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s3\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s3\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vdpps ymm0, ymm1, ymm2, 11110000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vdpps ymm0, ymm1, ymm2, 11111111b\": {\n      \"ExpectedInstructionCount\": 61,\n      \"Comment\": [\n        \"Map 3 0b01 0x40 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"fmul z3.s, z17.s, z18.s\",\n        \"movprfx z0, z3\",\n        \"faddp z0.s, p7/m, z0.s, z2.s\",\n        \"uzp1 z3.s, z0.s, z0.s\",\n        \"uzp2 z1.s, z0.s, z0.s\",\n        \"splice z3.d, p6, z3.d, z1.d\",\n        \"movprfx z0, z3\",\n        \"faddp z0.s, p7/m, z0.s, z2.s\",\n        \"uzp1 z3.s, z0.s, z0.s\",\n        \"uzp2 z1.s, z0.s, z0.s\",\n        \"splice z3.d, p6, z3.d, z1.d\",\n        \"mov z1.s, s3\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-4\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s3\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-3\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s3\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s3\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #-1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s3\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #0\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s3\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #1\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s3\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #2\",\n        \"mov z2.s, p0/m, z1.s\",\n        \"msr nzcv, x0\",\n        \"mov z1.s, s3\",\n        \"mov z16.d, z2.d\",\n        \"mrs x0, nzcv\",\n        \"index z0.s, #-4, #1\",\n        \"cmpeq p0.s, p7/z, z0.s, #3\",\n        \"mov z16.s, p0/m, z1.s\",\n        \"msr nzcv, x0\"\n      ]\n    },\n    \"vdppd xmm0, xmm1, xmm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x41 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vdppd xmm0, xmm1, xmm2, 00001111b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x41 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vdppd xmm0, xmm1, xmm2, 11110000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x41 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vdppd xmm0, xmm1, xmm2, 11111111b\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x41 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"fmul v2.2d, v17.2d, v18.2d\",\n        \"faddv d2, p6, z2.d\",\n        \"dup v16.2d, v2.d[0]\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 000b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[0]\",\n        \"ext v3.16b, v17.16b, v17.16b, #0\",\n        \"ext v4.16b, v17.16b, v17.16b, #1\",\n        \"ext v5.16b, v17.16b, v17.16b, #2\",\n        \"ext v6.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 001b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[1]\",\n        \"ext v3.16b, v17.16b, v17.16b, #0\",\n        \"ext v4.16b, v17.16b, v17.16b, #1\",\n        \"ext v5.16b, v17.16b, v17.16b, #2\",\n        \"ext v6.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 010b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[2]\",\n        \"ext v3.16b, v17.16b, v17.16b, #0\",\n        \"ext v4.16b, v17.16b, v17.16b, #1\",\n        \"ext v5.16b, v17.16b, v17.16b, #2\",\n        \"ext v6.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 011b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[3]\",\n        \"ext v3.16b, v17.16b, v17.16b, #0\",\n        \"ext v4.16b, v17.16b, v17.16b, #1\",\n        \"ext v5.16b, v17.16b, v17.16b, #2\",\n        \"ext v6.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 100b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[0]\",\n        \"ext v3.16b, v17.16b, v17.16b, #4\",\n        \"ext v4.16b, v17.16b, v17.16b, #5\",\n        \"ext v5.16b, v17.16b, v17.16b, #6\",\n        \"ext v6.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 101b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[1]\",\n        \"ext v3.16b, v17.16b, v17.16b, #4\",\n        \"ext v4.16b, v17.16b, v17.16b, #5\",\n        \"ext v5.16b, v17.16b, v17.16b, #6\",\n        \"ext v6.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 110b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[2]\",\n        \"ext v3.16b, v17.16b, v17.16b, #4\",\n        \"ext v4.16b, v17.16b, v17.16b, #5\",\n        \"ext v5.16b, v17.16b, v17.16b, #6\",\n        \"ext v6.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"vmpsadbw xmm0, xmm1, xmm2, 111b\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[3]\",\n        \"ext v3.16b, v17.16b, v17.16b, #4\",\n        \"ext v4.16b, v17.16b, v17.16b, #5\",\n        \"ext v5.16b, v17.16b, v17.16b, #6\",\n        \"ext v6.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v16.8h, v4.8h, v2.8h\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 000b\": {\n      \"ExpectedInstructionCount\": 34,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[0]\",\n        \"ext v3.16b, v17.16b, v17.16b, #0\",\n        \"ext v4.16b, v17.16b, v17.16b, #1\",\n        \"ext v5.16b, v17.16b, v17.16b, #2\",\n        \"ext v6.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"mov z3.q, z17.q[1]\",\n        \"mov z4.q, z18.q[1]\",\n        \"dup v4.4s, v4.s[0]\",\n        \"ext v5.16b, v3.16b, v3.16b, #0\",\n        \"ext v6.16b, v3.16b, v3.16b, #1\",\n        \"ext v7.16b, v3.16b, v3.16b, #2\",\n        \"ext v3.16b, v3.16b, v3.16b, #3\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v3.8h, v3.8b, v4.8b\",\n        \"addp v4.8h, v5.8h, v7.8h\",\n        \"addp v3.8h, v6.8h, v3.8h\",\n        \"trn1 v5.4s, v4.4s, v3.4s\",\n        \"trn2 v3.4s, v4.4s, v3.4s\",\n        \"addp v3.8h, v5.8h, v3.8h\",\n        \"mov z1.q, q3\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 001b\": {\n      \"ExpectedInstructionCount\": 34,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[1]\",\n        \"ext v3.16b, v17.16b, v17.16b, #0\",\n        \"ext v4.16b, v17.16b, v17.16b, #1\",\n        \"ext v5.16b, v17.16b, v17.16b, #2\",\n        \"ext v6.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"mov z3.q, z17.q[1]\",\n        \"mov z4.q, z18.q[1]\",\n        \"dup v4.4s, v4.s[0]\",\n        \"ext v5.16b, v3.16b, v3.16b, #0\",\n        \"ext v6.16b, v3.16b, v3.16b, #1\",\n        \"ext v7.16b, v3.16b, v3.16b, #2\",\n        \"ext v3.16b, v3.16b, v3.16b, #3\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v3.8h, v3.8b, v4.8b\",\n        \"addp v4.8h, v5.8h, v7.8h\",\n        \"addp v3.8h, v6.8h, v3.8h\",\n        \"trn1 v5.4s, v4.4s, v3.4s\",\n        \"trn2 v3.4s, v4.4s, v3.4s\",\n        \"addp v3.8h, v5.8h, v3.8h\",\n        \"mov z1.q, q3\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 010b\": {\n      \"ExpectedInstructionCount\": 34,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[2]\",\n        \"ext v3.16b, v17.16b, v17.16b, #0\",\n        \"ext v4.16b, v17.16b, v17.16b, #1\",\n        \"ext v5.16b, v17.16b, v17.16b, #2\",\n        \"ext v6.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"mov z3.q, z17.q[1]\",\n        \"mov z4.q, z18.q[1]\",\n        \"dup v4.4s, v4.s[0]\",\n        \"ext v5.16b, v3.16b, v3.16b, #0\",\n        \"ext v6.16b, v3.16b, v3.16b, #1\",\n        \"ext v7.16b, v3.16b, v3.16b, #2\",\n        \"ext v3.16b, v3.16b, v3.16b, #3\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v3.8h, v3.8b, v4.8b\",\n        \"addp v4.8h, v5.8h, v7.8h\",\n        \"addp v3.8h, v6.8h, v3.8h\",\n        \"trn1 v5.4s, v4.4s, v3.4s\",\n        \"trn2 v3.4s, v4.4s, v3.4s\",\n        \"addp v3.8h, v5.8h, v3.8h\",\n        \"mov z1.q, q3\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 011b\": {\n      \"ExpectedInstructionCount\": 34,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[3]\",\n        \"ext v3.16b, v17.16b, v17.16b, #0\",\n        \"ext v4.16b, v17.16b, v17.16b, #1\",\n        \"ext v5.16b, v17.16b, v17.16b, #2\",\n        \"ext v6.16b, v17.16b, v17.16b, #3\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"mov z3.q, z17.q[1]\",\n        \"mov z4.q, z18.q[1]\",\n        \"dup v4.4s, v4.s[0]\",\n        \"ext v5.16b, v3.16b, v3.16b, #0\",\n        \"ext v6.16b, v3.16b, v3.16b, #1\",\n        \"ext v7.16b, v3.16b, v3.16b, #2\",\n        \"ext v3.16b, v3.16b, v3.16b, #3\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v3.8h, v3.8b, v4.8b\",\n        \"addp v4.8h, v5.8h, v7.8h\",\n        \"addp v3.8h, v6.8h, v3.8h\",\n        \"trn1 v5.4s, v4.4s, v3.4s\",\n        \"trn2 v3.4s, v4.4s, v3.4s\",\n        \"addp v3.8h, v5.8h, v3.8h\",\n        \"mov z1.q, q3\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 100b\": {\n      \"ExpectedInstructionCount\": 34,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[0]\",\n        \"ext v3.16b, v17.16b, v17.16b, #4\",\n        \"ext v4.16b, v17.16b, v17.16b, #5\",\n        \"ext v5.16b, v17.16b, v17.16b, #6\",\n        \"ext v6.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"mov z3.q, z17.q[1]\",\n        \"mov z4.q, z18.q[1]\",\n        \"dup v4.4s, v4.s[0]\",\n        \"ext v5.16b, v3.16b, v3.16b, #0\",\n        \"ext v6.16b, v3.16b, v3.16b, #1\",\n        \"ext v7.16b, v3.16b, v3.16b, #2\",\n        \"ext v3.16b, v3.16b, v3.16b, #3\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v3.8h, v3.8b, v4.8b\",\n        \"addp v4.8h, v5.8h, v7.8h\",\n        \"addp v3.8h, v6.8h, v3.8h\",\n        \"trn1 v5.4s, v4.4s, v3.4s\",\n        \"trn2 v3.4s, v4.4s, v3.4s\",\n        \"addp v3.8h, v5.8h, v3.8h\",\n        \"mov z1.q, q3\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 101b\": {\n      \"ExpectedInstructionCount\": 34,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[1]\",\n        \"ext v3.16b, v17.16b, v17.16b, #4\",\n        \"ext v4.16b, v17.16b, v17.16b, #5\",\n        \"ext v5.16b, v17.16b, v17.16b, #6\",\n        \"ext v6.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"mov z3.q, z17.q[1]\",\n        \"mov z4.q, z18.q[1]\",\n        \"dup v4.4s, v4.s[0]\",\n        \"ext v5.16b, v3.16b, v3.16b, #0\",\n        \"ext v6.16b, v3.16b, v3.16b, #1\",\n        \"ext v7.16b, v3.16b, v3.16b, #2\",\n        \"ext v3.16b, v3.16b, v3.16b, #3\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v3.8h, v3.8b, v4.8b\",\n        \"addp v4.8h, v5.8h, v7.8h\",\n        \"addp v3.8h, v6.8h, v3.8h\",\n        \"trn1 v5.4s, v4.4s, v3.4s\",\n        \"trn2 v3.4s, v4.4s, v3.4s\",\n        \"addp v3.8h, v5.8h, v3.8h\",\n        \"mov z1.q, q3\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 110b\": {\n      \"ExpectedInstructionCount\": 34,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[2]\",\n        \"ext v3.16b, v17.16b, v17.16b, #4\",\n        \"ext v4.16b, v17.16b, v17.16b, #5\",\n        \"ext v5.16b, v17.16b, v17.16b, #6\",\n        \"ext v6.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"mov z3.q, z17.q[1]\",\n        \"mov z4.q, z18.q[1]\",\n        \"dup v4.4s, v4.s[0]\",\n        \"ext v5.16b, v3.16b, v3.16b, #0\",\n        \"ext v6.16b, v3.16b, v3.16b, #1\",\n        \"ext v7.16b, v3.16b, v3.16b, #2\",\n        \"ext v3.16b, v3.16b, v3.16b, #3\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v3.8h, v3.8b, v4.8b\",\n        \"addp v4.8h, v5.8h, v7.8h\",\n        \"addp v3.8h, v6.8h, v3.8h\",\n        \"trn1 v5.4s, v4.4s, v3.4s\",\n        \"trn2 v3.4s, v4.4s, v3.4s\",\n        \"addp v3.8h, v5.8h, v3.8h\",\n        \"mov z1.q, q3\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vmpsadbw ymm0, ymm1, ymm2, 111b\": {\n      \"ExpectedInstructionCount\": 34,\n      \"Comment\": [\n        \"Map 3 0b01 0x42 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v2.4s, v18.s[3]\",\n        \"ext v3.16b, v17.16b, v17.16b, #4\",\n        \"ext v4.16b, v17.16b, v17.16b, #5\",\n        \"ext v5.16b, v17.16b, v17.16b, #6\",\n        \"ext v6.16b, v17.16b, v17.16b, #7\",\n        \"uabdl v3.8h, v3.8b, v2.8b\",\n        \"uabdl v4.8h, v4.8b, v2.8b\",\n        \"uabdl v5.8h, v5.8b, v2.8b\",\n        \"uabdl v2.8h, v6.8b, v2.8b\",\n        \"addp v3.8h, v3.8h, v5.8h\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"trn1 v4.4s, v3.4s, v2.4s\",\n        \"trn2 v2.4s, v3.4s, v2.4s\",\n        \"addp v2.8h, v4.8h, v2.8h\",\n        \"mov z3.q, z17.q[1]\",\n        \"mov z4.q, z18.q[1]\",\n        \"dup v4.4s, v4.s[0]\",\n        \"ext v5.16b, v3.16b, v3.16b, #0\",\n        \"ext v6.16b, v3.16b, v3.16b, #1\",\n        \"ext v7.16b, v3.16b, v3.16b, #2\",\n        \"ext v3.16b, v3.16b, v3.16b, #3\",\n        \"uabdl v5.8h, v5.8b, v4.8b\",\n        \"uabdl v6.8h, v6.8b, v4.8b\",\n        \"uabdl v7.8h, v7.8b, v4.8b\",\n        \"uabdl v3.8h, v3.8b, v4.8b\",\n        \"addp v4.8h, v5.8h, v7.8h\",\n        \"addp v3.8h, v6.8h, v3.8h\",\n        \"trn1 v5.4s, v4.4s, v3.4s\",\n        \"trn2 v3.4s, v4.4s, v3.4s\",\n        \"addp v3.8h, v5.8h, v3.8h\",\n        \"mov z1.q, q3\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vpclmulqdq xmm0, xmm1, xmm2, 00000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x44 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"pmull v16.1q, v17.1d, v18.1d\"\n      ]\n    },\n    \"vpclmulqdq xmm0, xmm1, xmm2, 00001b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x44 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v0.2d, v17.d[1]\",\n        \"pmull v16.1q, v0.1d, v18.1d\"\n      ]\n    },\n    \"vpclmulqdq xmm0, xmm1, xmm2, 10000b\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map 3 0b01 0x44 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"dup v0.2d, v18.d[1]\",\n        \"pmull v16.1q, v0.1d, v17.1d\"\n      ]\n    },\n    \"vpclmulqdq xmm0, xmm1, xmm2, 10001b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x44 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"pmull2 v16.1q, v17.2d, v18.2d\"\n      ]\n    },\n    \"vpclmulqdq ymm0, ymm1, ymm2, 00000b\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x44 256-bit\"\n      ]\n    },\n    \"vpclmulqdq ymm0, ymm1, ymm2, 00001b\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x44 256-bit\"\n      ]\n    },\n    \"vpclmulqdq ymm0, ymm1, ymm2, 10000b\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x44 256-bit\"\n      ]\n    },\n    \"vpclmulqdq ymm0, ymm1, ymm2, 10001b\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x44 256-bit\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00000000b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q17\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q17\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00000001b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q17\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00000010b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q17\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00000011b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q17\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00010000b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q17\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00010001b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00010010b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00010011b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00100000b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q17\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q18\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00100001b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q18\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00100010b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q18\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00100011b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, q18\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00110000b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q17\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00110001b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00110010b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00110011b\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z2.b, p6/m, z1.b\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00001000b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q17\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00011000b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00101000b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 00111000b\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 10001000b\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 10000000b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q17\",\n        \"mov z16.d, z2.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 10000001b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z17.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 10000010b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, q18\",\n        \"mov z16.d, z2.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vperm2i128 ymm0, ymm1, ymm2, 10000011b\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"Map 3 0b01 0x46 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"mov z1.q, z18.q[1]\",\n        \"mov z16.d, z2.d\",\n        \"mov z16.b, p6/m, z1.b\"\n      ]\n    },\n    \"vblendvps xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x4a 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v2.4s, v19.4s, #31\",\n        \"mov v16.16b, v2.16b\",\n        \"bsl v16.16b, v18.16b, v17.16b\"\n      ]\n    },\n    \"vblendvps ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x4a 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z2, z19\",\n        \"asr z2.s, p7/m, z2.s, #31\",\n        \"movprfx z0, z18\",\n        \"bsl z0.d, z0.d, z17.d, z2.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vblendvpd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x4b 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v2.2d, v19.2d, #63\",\n        \"mov v16.16b, v2.16b\",\n        \"bsl v16.16b, v18.16b, v17.16b\"\n      ]\n    },\n    \"vblendvpd ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x4b 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z2, z19\",\n        \"asr z2.d, p7/m, z2.d, #63\",\n        \"movprfx z0, z18\",\n        \"bsl z0.d, z0.d, z17.d, z2.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vpblendvb xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map 3 0b01 0x4c 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v2.16b, v19.16b, #7\",\n        \"mov v16.16b, v2.16b\",\n        \"bsl v16.16b, v18.16b, v17.16b\"\n      ]\n    },\n    \"vpblendvb ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0x4c 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z2, z19\",\n        \"asr z2.b, p7/m, z2.b, #7\",\n        \"movprfx z0, z18\",\n        \"bsl z0.d, z0.d, z17.d, z2.d\",\n        \"mov z16.d, z0.d\"\n      ]\n    },\n    \"vfmaddsubps xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x5c 128-bit\"\n      ]\n    },\n    \"vfmaddsubps ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x5c 256-bit\"\n      ]\n    },\n    \"vfmaddsubpd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x5d 128-bit\"\n      ]\n    },\n    \"vfmaddsubpd ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x5d 256-bit\"\n      ]\n    },\n    \"vfmsubaddps xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x5e 128-bit\"\n      ]\n    },\n    \"vfmsubaddps ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x5e 256-bit\"\n      ]\n    },\n    \"vfmsubaddpd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x5f 128-bit\"\n      ]\n    },\n    \"vfmsubaddpd ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x5f 256-bit\"\n      ]\n    },\n    \"vfmaddps xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x68 128-bit\"\n      ]\n    },\n    \"vfmaddps ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x68 256-bit\"\n      ]\n    },\n    \"vfmaddpd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x69 128-bit\"\n      ]\n    },\n    \"vfmaddpd ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x69 256-bit\"\n      ]\n    },\n    \"vfmaddss xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x6a 128-bit\"\n      ]\n    },\n    \"vfmaddsd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x6b 128-bit\"\n      ]\n    },\n    \"vfmsubps xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x6c 128-bit\"\n      ]\n    },\n    \"vfmsubps ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x6c 256-bit\"\n      ]\n    },\n    \"vfmsubpd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x6d 128-bit\"\n      ]\n    },\n    \"vfmsubpd ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x6d 256-bit\"\n      ]\n    },\n    \"vfmsubss xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x6e 128-bit\"\n      ]\n    },\n    \"vfmsubsd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x6f 128-bit\"\n      ]\n    },\n    \"vfnmaddps xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x78 128-bit\"\n      ]\n    },\n    \"vfnmaddpd ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x78 256-bit\"\n      ]\n    },\n    \"vfnmaddss xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x79 128-bit\"\n      ]\n    },\n    \"vfnmaddsd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x7a 128-bit\"\n      ]\n    },\n    \"vfnmsubps xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x7c 128-bit\"\n      ]\n    },\n    \"vfnmsubps ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x7c 256-bit\"\n      ]\n    },\n    \"vfnmsubpd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x7d 128-bit\"\n      ]\n    },\n    \"vfnmsubpd ymm0, ymm1, ymm2, ymm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x7d 256-bit\"\n      ]\n    },\n    \"vfnmsubss xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x7e 128-bit\"\n      ]\n    },\n    \"vfnmsubsd xmm0, xmm1, xmm2, xmm3\": {\n      \"ExpectedInstructionCount\": -1,\n      \"Skip\": \"Yes\",\n      \"Comment\": [\n        \"Map 3 0b01 0x7f 128-bit\"\n      ]\n    },\n    \"vaeskeygenassist xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"Map 3 0b01 0xdf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3184]\",\n        \"movi v3.2d, #0x0\",\n        \"mov v16.16b, v17.16b\",\n        \"aese v16.16b, v3.16b\",\n        \"tbl v16.16b, {v16.16b}, v2.16b\"\n      ]\n    },\n    \"vaeskeygenassist xmm0, xmm1, 0xFF\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map 3 0b01 0xdf 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3184]\",\n        \"movi v3.2d, #0x0\",\n        \"mov v16.16b, v17.16b\",\n        \"aese v16.16b, v3.16b\",\n        \"tbl v16.16b, {v16.16b}, v2.16b\",\n        \"mov x0, #0xff00000000\",\n        \"dup v1.2d, x0\",\n        \"eor v16.16b, v16.16b, v1.16b\"\n      ]\n    },\n    \"rorx eax, ebx, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b11 0xf0 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, w6\"\n      ]\n    },\n    \"rorx eax, eax, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b11 0xf0 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, w4\"\n      ]\n    },\n    \"rorx eax, ebx, 31\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b11 0xf0 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ror w4, w6, #31\"\n      ]\n    },\n    \"rorx eax, ebx, 32\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b11 0xf0 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, w6\"\n      ]\n    },\n    \"rorx eax, eax, 32\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b11 0xf0 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w4, w4\"\n      ]\n    },\n    \"rorx rax, rbx, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b11 0xf0 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x4, x6\"\n      ]\n    },\n    \"rorx rax, rax, 0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"Map 3 0b11 0xf0 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"rorx rax, rbx, 63\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b11 0xf0 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ror x4, x6, #63\"\n      ]\n    },\n    \"rorx rax, rbx, 64\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map 3 0b11 0xf0 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x4, x6\"\n      ]\n    },\n    \"rorx rax, rax, 64\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"Map 3 0b11 0xf0 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": []\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/VEX_map_group.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE256\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ]\n  },\n  \"Instructions\": {\n    \"vpsrlw xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 12 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsrlw xmm0, xmm1, 15\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 12 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ushr v16.8h, v17.8h, #15\"\n      ]\n    },\n    \"vpsrlw xmm0, xmm1, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 12 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpsrlw ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 12 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vpsrlw ymm0, ymm1, 15\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 12 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"lsr z16.h, p7/m, z16.h, #15\"\n      ]\n    },\n    \"vpsrlw ymm0, ymm1, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 12 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpsraw xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 12 0b100 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsraw xmm0, xmm1, 15\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 12 0b100 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.8h, v17.8h, #15\"\n      ]\n    },\n    \"vpsraw xmm0, xmm1, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 12 0b100 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.8h, v17.8h, #15\"\n      ]\n    },\n    \"vpsraw ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 12 0b100 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vpsraw ymm0, ymm1, 15\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 12 0b100 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"asr z16.h, p7/m, z16.h, #15\"\n      ]\n    },\n    \"vpsraw ymm0, ymm1, 16\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 12 0b100 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"asr z16.h, p7/m, z16.h, #15\"\n      ]\n    },\n    \"vpsllw xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 12 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsllw xmm0, xmm1, 15\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 12 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v16.8h, v17.8h, #15\"\n      ]\n    },\n    \"vpsllw xmm0, xmm1, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 12 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpsllw ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 12 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vpsllw ymm0, ymm1, 15\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 12 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"lsl z16.h, p7/m, z16.h, #15\"\n      ]\n    },\n    \"vpsllw ymm0, ymm1, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 12 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpsrld xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 13 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsrld xmm0, xmm1, 31\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 13 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ushr v16.4s, v17.4s, #31\"\n      ]\n    },\n    \"vpsrld xmm0, xmm1, 32\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 13 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpsrld ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 13 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vpsrld ymm0, ymm1, 31\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 13 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"lsr z16.s, p7/m, z16.s, #31\"\n      ]\n    },\n    \"vpsrld ymm0, ymm1, 32\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 13 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpsrad xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 13 0b100 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsrad xmm0, xmm1, 31\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 13 0b100 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.4s, v17.4s, #31\"\n      ]\n    },\n    \"vpsrad xmm0, xmm1, 32\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 13 0b100 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sshr v16.4s, v17.4s, #31\"\n      ]\n    },\n    \"vpsrad ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 13 0b100 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vpsrad ymm0, ymm1, 31\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 13 0b100 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"asr z16.s, p7/m, z16.s, #31\"\n      ]\n    },\n    \"vpsrad ymm0, ymm1, 32\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 13 0b100 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"asr z16.s, p7/m, z16.s, #31\"\n      ]\n    },\n    \"vpslld xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 13 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpslld xmm0, xmm1, 31\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 13 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v16.4s, v17.4s, #31\"\n      ]\n    },\n    \"vpslld xmm0, xmm1, 32\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 13 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpslld ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 13 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vpslld ymm0, ymm1, 31\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 13 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"lsl z16.s, p7/m, z16.s, #31\"\n      ]\n    },\n    \"vpslld ymm0, ymm1, 32\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 13 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpsrlq xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsrlq xmm0, xmm1, 63\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ushr v16.2d, v17.2d, #63\"\n      ]\n    },\n    \"vpsrlq xmm0, xmm1, 64\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b010 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpsrlq ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vpsrlq ymm0, ymm1, 63\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"lsr z16.d, p7/m, z16.d, #63\"\n      ]\n    },\n    \"vpsrlq ymm0, ymm1, 64\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b010 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpsrldq xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b011 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsrldq xmm0, xmm1, 15\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b011 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ext v16.16b, v17.16b, v2.16b, #15\"\n      ]\n    },\n    \"vpsrldq xmm0, xmm1, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b011 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpsrldq ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b011 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vpsrldq ymm0, ymm1, 15\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"Map group 14 0b011 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ext v3.16b, v17.16b, v2.16b, #15\",\n        \"movprfx z1, z17\",\n        \"ext z1.b, z1.b, z2.b, #31\",\n        \"mov z2.d, z1.d\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z3.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vpsrldq ymm0, ymm1, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b011 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpsllq xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpsllq xmm0, xmm1, 63\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"shl v16.2d, v17.2d, #63\"\n      ]\n    },\n    \"vpsllq xmm0, xmm1, 64\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b110 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpsllq ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vpsllq ymm0, ymm1, 63\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movprfx z16, z17\",\n        \"lsl z16.d, p7/m, z16.d, #63\"\n      ]\n    },\n    \"vpsllq ymm0, ymm1, 64\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b110 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpslldq xmm0, xmm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b111 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov v16.16b, v17.16b\"\n      ]\n    },\n    \"vpslldq xmm0, xmm1, 15\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"Map group 14 0b111 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ext v16.16b, v2.16b, v17.16b, #1\"\n      ]\n    },\n    \"vpslldq xmm0, xmm1, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b111 128-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vpslldq ymm0, ymm1, 0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b111 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov z16.d, p7/m, z17.d\"\n      ]\n    },\n    \"vpslldq ymm0, ymm1, 15\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map group 14 0b111 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ext v3.16b, v2.16b, v17.16b, #1\",\n        \"ext z2.b, z2.b, z17.b, #17\",\n        \"mov z1.q, q2\",\n        \"mov z16.d, z3.d\",\n        \"not p0.b, p7/z, p6.b\",\n        \"mov z16.b, p0/m, z1.b\"\n      ]\n    },\n    \"vpslldq ymm0, ymm1, 16\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"Map group 14 0b111 256-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v16.2d, #0x0\"\n      ]\n    },\n    \"vldmxcsr [rax]\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"Map group 15 0b010\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"and w20, w20, #0xffc0\",\n        \"str w20, [x28, #972]\",\n        \"ubfx w21, w20, #13, #3\",\n        \"rbit w1, w21\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x21, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\"\n      ]\n    },\n    \"vstmxcsr [rax]\": {\n      \"ExpectedInstructionCount\": 3,\n      \"Comment\": [\n        \"Map group 15 0b011\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x28, #972]\",\n        \"and w20, w20, #0xffc0\",\n        \"str w20, [x4]\"\n      ]\n    },\n    \"blsr eax, ebx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map group 17 0b001 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub w20, w6, #0x1 (1)\",\n        \"and w4, w20, w6\",\n        \"cmp x6, #0x0 (0)\",\n        \"cset x20, ne\",\n        \"cmp w4, #0x0 (0)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"blsr rax, rbx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map group 17 0b001 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x6, #0x1 (1)\",\n        \"and x4, x20, x6\",\n        \"cmp x6, #0x0 (0)\",\n        \"cset x20, ne\",\n        \"cmp x4, #0x0 (0)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"blsmsk eax, ebx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map group 17 0b010 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub w20, w6, #0x1 (1)\",\n        \"eor w4, w20, w6\",\n        \"cmp x6, #0x0 (0)\",\n        \"cset x20, ne\",\n        \"cmp w4, #0x0 (0)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"blsmsk rax, rbx\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"Map group 17 0b010 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"sub x20, x6, #0x1 (1)\",\n        \"eor x4, x20, x6\",\n        \"cmp x6, #0x0 (0)\",\n        \"cset x20, ne\",\n        \"cmp x4, #0x0 (0)\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"blsi eax, ebx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map group 17 0b011 32-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"neg w20, w6\",\n        \"and w4, w6, w20\",\n        \"cmp w4, #0x0 (0)\",\n        \"cset x20, eq\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"blsi rax, rbx\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"Map group 17 0b011 64-bit\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"neg x20, x6\",\n        \"and x4, x6, x20\",\n        \"cmp x4, #0x0 (0)\",\n        \"cset x20, eq\",\n        \"mrs x21, nzcv\",\n        \"bfi w21, w20, #29, #1\",\n        \"msr nzcv, x21\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/X87ldst-SVE.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\",\n      \"RPRES\"\n    ]\n  },\n  \"Instructions\": {\n    \"fstp tword [rax]\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"Single 80-bit store.\",\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"st1h {z2.h}, p2, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"2-store 80bit\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 20,\n      \"x86Insts\": [\n        \"fstp tword [rax]\",\n        \"fstp tword [rax+10]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"st1h {z2.h}, p2, [x4]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x21, x4, #0xa (10)\",\n        \"st1h {z2.h}, p2, [x21]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xc0c0\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"8-store 80bit\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 48,\n      \"x86Insts\": [\n        \"fstp tword [rax]\",\n        \"fstp tword [rax+10]\",\n        \"fstp tword [rax+20]\",\n        \"fstp tword [rax+30]\",\n        \"fstp tword [rax+40]\",\n        \"fstp tword [rax+50]\",\n        \"fstp tword [rax+60]\",\n        \"fstp tword [rax+70]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"st1h {z2.h}, p2, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q2, [x22, #1056]\",\n        \"add x22, x4, #0xa (10)\",\n        \"st1h {z2.h}, p2, [x22]\",\n        \"add w21, w21, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q2, [x22, #1056]\",\n        \"add x22, x4, #0x14 (20)\",\n        \"st1h {z2.h}, p2, [x22]\",\n        \"add w21, w21, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q2, [x22, #1056]\",\n        \"add x22, x4, #0x1e (30)\",\n        \"st1h {z2.h}, p2, [x22]\",\n        \"add w21, w21, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q2, [x22, #1056]\",\n        \"add x22, x4, #0x28 (40)\",\n        \"st1h {z2.h}, p2, [x22]\",\n        \"add w21, w21, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q2, [x22, #1056]\",\n        \"add x22, x4, #0x32 (50)\",\n        \"st1h {z2.h}, p2, [x22]\",\n        \"add w21, w21, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q2, [x22, #1056]\",\n        \"add x22, x4, #0x3c (60)\",\n        \"st1h {z2.h}, p2, [x22]\",\n        \"add w21, w21, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x21, x4, #0x46 (70)\",\n        \"st1h {z2.h}, p2, [x21]\",\n        \"strb w20, [x28, #1051]\",\n        \"strb wzr, [x28, #1202]\"\n      ]\n    },\n    \"fld tword [rax]\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": \"Single 80-bit store.\",\n      \"ExpectedArm64ASM\": [\n        \"ld1h {z2.h}, p2/z, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"2-load 80bit\": {\n      \"x86InstructionCount\": 2,\n      \"ExpectedInstructionCount\": 20,\n      \"x86Insts\": [\n        \"fld tword [rax]\",\n        \"fld tword [rax+10]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1h {z2.h}, p2/z, [x4]\",\n        \"add x20, x4, #0xa (10)\",\n        \"ld1h {z3.h}, p2/z, [x20]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q3, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0x303\",\n        \"lsr w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"8-load 80bit\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 49,\n      \"x86Insts\": [\n        \"fld tword [rax]\",\n        \"fld tword [rax+10]\",\n        \"fld tword [rax+20]\",\n        \"fld tword [rax+30]\",\n        \"fld tword [rax+40]\",\n        \"fld tword [rax+50]\",\n        \"fld tword [rax+60]\",\n        \"fld tword [rax+70]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ld1h {z2.h}, p2/z, [x4]\",\n        \"add x20, x4, #0xa (10)\",\n        \"ld1h {z3.h}, p2/z, [x20]\",\n        \"add x20, x4, #0x14 (20)\",\n        \"ld1h {z4.h}, p2/z, [x20]\",\n        \"add x20, x4, #0x1e (30)\",\n        \"ld1h {z5.h}, p2/z, [x20]\",\n        \"add x20, x4, #0x28 (40)\",\n        \"ld1h {z6.h}, p2/z, [x20]\",\n        \"add x20, x4, #0x32 (50)\",\n        \"ld1h {z7.h}, p2/z, [x20]\",\n        \"add x20, x4, #0x3c (60)\",\n        \"ld1h {z8.h}, p2/z, [x20]\",\n        \"add x20, x4, #0x46 (70)\",\n        \"ld1h {z9.h}, p2/z, [x20]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q9, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str q8, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str q7, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str q6, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str q5, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str q4, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"str q3, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"str q2, [x20, #1056]\",\n        \"mov w20, #0xff\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/x87.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"CSSC\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ]\n  },\n  \"Instructions\": {\n    \"fadd dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xd8 !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xd8 !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcom dword [rax]\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xd8 !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcomp dword [rax]\": {\n      \"ExpectedInstructionCount\": 37,\n      \"Comment\": [\n        \"0xd8 !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsub dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xd8 !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xd8 !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xd8 !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xd8 !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd8 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st3\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st4\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st5\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st6\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st7\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd8 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st3\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st4\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st5\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st6\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st7\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcom st0, st0\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xd8 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcom st0, st1\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 11b 0xd1 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcom st0, st2\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 11b 0xd2 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcom st0, st3\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 11b 0xd3 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcom st0, st4\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 11b 0xd4 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcom st0, st5\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 11b 0xd5 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcom st0, st6\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 11b 0xd6 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcom st0, st7\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 11b 0xd7 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcomp st0, st0\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xd8 11b 0xd8 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st1\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"0xd8 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x22, x0\",\n        \"ubfx x23, x22, #1, #1\",\n        \"ubfx x24, x22, #0, #1\",\n        \"ubfx x22, x22, #2, #1\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"strb w22, [x28, #1040]\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st2\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xd8 11b 0xda /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st3\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xd8 11b 0xdb /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st4\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xd8 11b 0xdc /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st5\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xd8 11b 0xdd /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st6\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xd8 11b 0xde /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st7\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xd8 11b 0xdf /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsub st0, st0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd8 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st3\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st4\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st5\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st6\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st7\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr st0, st0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd8 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr st0, st1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st3\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st4\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st5\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st6\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st7\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdiv st0, st0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd8 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st3\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st4\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st5\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st6\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st7\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr st0, st0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd8 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr st0, st1\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st3\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st4\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st5\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st6\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st7\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd8 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fld dword [rax]\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xd9 !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov s0, s2\",\n        \"ldr x0, [x28, #1632]\",\n        \"ldr x3, [x28, #1640]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst dword [rax]\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xd9 !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\"\n      ]\n    },\n    \"fstp dword [rax]\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xd9 !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1664]\",\n        \"ldr x3, [x28, #1672]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov s2, s0\",\n        \"str s2, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldenv [rax]\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xd9 !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"strh w20, [x28, #1200]\",\n        \"add x20, x4, #0x4 (4)\",\n        \"ldr w20, [x20]\",\n        \"ubfx w21, w20, #11, #3\",\n        \"strb w21, [x28, #1051]\",\n        \"ubfx w21, w20, #8, #1\",\n        \"ubfx w22, w20, #9, #1\",\n        \"ubfx w23, w20, #10, #1\",\n        \"ubfx w24, w20, #14, #1\",\n        \"ubfx w20, w20, #0, #1\",\n        \"strb w21, [x28, #1048]\",\n        \"strb w22, [x28, #1049]\",\n        \"strb w23, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\",\n        \"add x20, x4, #0x8 (8)\",\n        \"ldr w20, [x20]\",\n        \"and w20, w20, w20, lsr #1\",\n        \"mov w21, #0x55555555\",\n        \"bic w20, w21, w20\",\n        \"orr w20, w20, w20, lsr #1\",\n        \"and w20, w20, #0x33333333\",\n        \"orr w20, w20, w20, lsr #2\",\n        \"and w20, w20, #0xf0f0f0f\",\n        \"orr w20, w20, w20, lsr #4\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldcw [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xd9 !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"strh w20, [x28, #1200]\"\n      ]\n    },\n    \"fnstenv [rax]\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xd9 !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #1200]\",\n        \"str w20, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"str w20, [x4, #4]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"orr w20, w20, w20, lsl #4\",\n        \"and w20, w20, #0xf0f0f0f\",\n        \"orr w20, w20, w20, lsl #2\",\n        \"and w20, w20, #0x33333333\",\n        \"orr w20, w20, w20, lsl #1\",\n        \"and w20, w20, #0x55555555\",\n        \"orr w20, w20, w20, lsl #1\",\n        \"eor w20, w20, #0xffff\",\n        \"str w20, [x4, #8]\",\n        \"str wzr, [x4, #12]\",\n        \"str wzr, [x4, #16]\",\n        \"str wzr, [x4, #20]\",\n        \"str wzr, [x4, #24]\"\n      ]\n    },\n    \"fnstcw [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xd9 !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #1200]\",\n        \"strh w20, [x4]\"\n      ]\n    },\n    \"fld st0\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xd9 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st3\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st4\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st5\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st6\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st7\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"strb w20, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fxch st0, st0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xd9 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1049]\"\n      ]\n    },\n    \"fxch st0, st1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str q3, [x21, #1056]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str q3, [x21, #1056]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st3\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str q3, [x21, #1056]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st4\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str q3, [x21, #1056]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st5\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str q3, [x21, #1056]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st6\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str q3, [x21, #1056]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st7\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str q3, [x21, #1056]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fnop\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"0xd9 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"fchs\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xd9 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"ldr q3, [x28, #3552]\",\n        \"eor v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fabs\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xd9 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"ldr q3, [x28, #3552]\",\n        \"bic v2.16b, v2.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"ftst\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"0xd9 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"mov w20, #0x0\",\n        \"fmov d3, x20\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fxam\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"mov x21, v2.d[1]\",\n        \"ubfx x21, x21, #15, #1\",\n        \"strb w21, [x28, #1049]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"lsr w20, w21, w20\",\n        \"and w20, w20, #0x1\",\n        \"mrs x21, nzcv\",\n        \"cmp w20, #0x1 (1)\",\n        \"cset x22, ne\",\n        \"strb w22, [x28, #1048]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fld1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3328]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldl2t\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3344]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldl2e\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3360]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldpi\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3376]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldlg2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3392]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldln2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3408]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldz\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"movi v2.2d, #0x0\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"f2xm1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xd9 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1856]\",\n        \"ldr x3, [x28, #1864]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fyl2x\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q2, [x22, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2080]\",\n        \"ldr x3, [x28, #2088]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x22, #1056]\"\n      ]\n    },\n    \"fptan\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"0xd9 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1872]\",\n        \"ldr x3, [x28, #1880]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldr q3, [x28, #3328]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb w20, [x28, #1051]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"str q3, [x22, #1056]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fpatan\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2096]\",\n        \"ldr x3, [x28, #2104]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w20, [x28, #1051]\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fxtract\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"0xd9 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1952]\",\n        \"ldr x3, [x28, #1960]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1968]\",\n        \"ldr x3, [x28, #1976]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"str q3, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0x303\",\n        \"lsr w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fprem1\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2112]\",\n        \"ldr x3, [x28, #2120]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1050]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdecstp\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xd9 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"fincstp\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xd9 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"fprem\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2128]\",\n        \"ldr x3, [x28, #2136]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1050]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fyl2xp1\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xd9 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr q2, [x28, #3328]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2080]\",\n        \"ldr x3, [x28, #2088]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"strb w20, [x28, #1051]\",\n        \"str q3, [x22, #1056]\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsqrt\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xd9 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1888]\",\n        \"ldr x3, [x28, #1896]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsincos\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"0xd9 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1936]\",\n        \"ldr x3, [x28, #1944]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v3.16b, v0.16b\",\n        \"mov v4.16b, v1.16b\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb w20, [x28, #1051]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"str q4, [x22, #1056]\",\n        \"str q3, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"frndint\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xd9 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1840]\",\n        \"ldr x3, [x28, #1848]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fscale\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2144]\",\n        \"ldr x3, [x28, #2152]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsin\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1904]\",\n        \"ldr x3, [x28, #1912]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1050]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcos\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1920]\",\n        \"ldr x3, [x28, #1928]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb wzr, [x28, #1050]\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fiadd dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xda !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fimul dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xda !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"ficom dword [rax]\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xda !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"ficomp dword [rax]\": {\n      \"ExpectedInstructionCount\": 37,\n      \"Comment\": [\n        \"0xda !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisub dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xda !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fisubr dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xda !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fidiv dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xda !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fidivr dword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xda !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov w1, w20\",\n        \"ldr x0, [x28, #1824]\",\n        \"ldr x3, [x28, #1832]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda 11b 0xd0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st0\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xda 11b 0xd8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xd9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xda /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st3\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st4\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st5\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st6\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xde /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st7\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fucompp\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xda 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xc0c0\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fild dword [rax]\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"sxtw x20, w20\",\n        \"mrs x21, nzcv\",\n        \"mov w22, #0x0\",\n        \"cmp x20, #0x0 (0)\",\n        \"mov w23, #0x8000\",\n        \"csel x23, x23, x22, lt\",\n        \"cneg x20, x20, mi\",\n        \"mov w24, #0x3f\",\n        \"mov x0, #0x3f\",\n        \"clz x30, x20\",\n        \"sub x30, x0, x30\",\n        \"sub x24, x24, x30\",\n        \"lsl x30, x20, x24\",\n        \"mov w18, #0x403e\",\n        \"sub x24, x18, x24\",\n        \"cmp x20, #0x0 (0)\",\n        \"csel x20, x22, x24, eq\",\n        \"orr x20, x23, x20\",\n        \"fmov d2, x30\",\n        \"fmov v2.D[1], x20\",\n        \"msr nzcv, x21\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisttp dword [rax]\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdb !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1760]\",\n        \"ldr x3, [x28, #1768]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov w21, w0\",\n        \"str w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fist dword [rax]\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1712]\",\n        \"ldr x3, [x28, #1720]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov w20, w0\",\n        \"str w20, [x4]\"\n      ]\n    },\n    \"fistp dword [rax]\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdf !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1712]\",\n        \"ldr x3, [x28, #1720]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov w21, w0\",\n        \"str w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld tword [rax]\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"add x20, x4, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp tword [rax]\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str d2, [x4]\",\n        \"mov x21, v2.d[1]\",\n        \"strh w21, [x4, #8]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcmovnb st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xdb 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xdb 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xdb 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd1 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd2 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd3 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd4 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd5 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd6 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd7 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st0\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xd8 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xda /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st3\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdb /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st4\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdc /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st5\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdd /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st6\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xde /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st7\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdf /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fnclex\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xdb 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1040]\"\n      ]\n    },\n    \"fninit\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdb 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x37f\",\n        \"strh w20, [x28, #1200]\",\n        \"strb wzr, [x28, #1051]\",\n        \"strb wzr, [x28, #1202]\",\n        \"strb wzr, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb wzr, [x28, #1054]\",\n        \"strb wzr, [x28, #1040]\"\n      ]\n    },\n    \"fucomi st0, st0\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"0xdb 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fucomi st0, st1\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdb 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fucomi st0, st2\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdb 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fucomi st0, st3\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdb 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fucomi st0, st4\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdb 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fucomi st0, st5\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdb 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fucomi st0, st6\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdb 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fucomi st0, st7\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdb 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fcomi st0, st0\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"0xdb 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fcomi st0, st1\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdb 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fcomi st0, st2\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdb 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fcomi st0, st3\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdb 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fcomi st0, st4\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdb 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fcomi st0, st5\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdb 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fcomi st0, st6\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdb 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fcomi st0, st7\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdb 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"eor x21, x21, #0x1\",\n        \"mrs x23, nzcv\",\n        \"bfi w23, w21, #29, #1\",\n        \"bfi w23, w22, #30, #1\",\n        \"eor w26, w20, #0x1\",\n        \"strb w20, [x28, #1040]\",\n        \"msr nzcv, x23\"\n      ]\n    },\n    \"fadd qword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xdc !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul qword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xdc !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fcom qword [rax]\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xdc !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fcomp qword [rax]\": {\n      \"ExpectedInstructionCount\": 37,\n      \"Comment\": [\n        \"0xdc !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsub qword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xdc !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr qword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xdc !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv qword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xdc !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr qword [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xdc !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xc0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"fadd st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st1, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st2, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st3, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st4, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st5, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st6, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st7, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xc8\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"fmul st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st1, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st2, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st3, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st4, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st5, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st6, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st7, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xe0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"fsubr st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr st1, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st2, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st3, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st4, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st5, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st6, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st7, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xe8\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"fsub st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st1, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st2, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st3, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st4, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st5, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st6, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st7, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xf0\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"fdivr st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr st1, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st2, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st3, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st4, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st5, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st6, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st7, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x21, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xf8\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"fdiv st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st1, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st2, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st3, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st4, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st5, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st6, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st7, st0\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fld qword [rax]\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdd !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisttp qword [rax]\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdd !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1776]\",\n        \"ldr x3, [x28, #1784]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"str x21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst qword [rax]\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdd !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"str d2, [x4]\"\n      ]\n    },\n    \"fstp qword [rax]\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdd !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"str d2, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"frstor [rax]\": {\n      \"ExpectedInstructionCount\": 76,\n      \"Comment\": [\n        \"0xdd !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"strh w20, [x28, #1200]\",\n        \"ldr w20, [x4, #4]\",\n        \"ubfx w21, w20, #11, #3\",\n        \"strb w21, [x28, #1051]\",\n        \"ubfx w22, w20, #8, #1\",\n        \"ubfx w23, w20, #9, #1\",\n        \"ubfx w24, w20, #10, #1\",\n        \"ubfx w30, w20, #14, #1\",\n        \"ubfx w20, w20, #0, #1\",\n        \"strb w22, [x28, #1048]\",\n        \"strb w23, [x28, #1049]\",\n        \"strb w24, [x28, #1050]\",\n        \"strb w30, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\",\n        \"ldr w20, [x4, #8]\",\n        \"and w20, w20, w20, lsr #1\",\n        \"mov w22, #0x55555555\",\n        \"bic w20, w22, w20\",\n        \"orr w20, w20, w20, lsr #1\",\n        \"and w20, w20, #0x33333333\",\n        \"orr w20, w20, w20, lsr #2\",\n        \"and w20, w20, #0xf0f0f0f\",\n        \"orr w20, w20, w20, lsr #4\",\n        \"strb w20, [x28, #1202]\",\n        \"mov x20, #0xffffffffffffffff\",\n        \"mov w22, #0xffff\",\n        \"fmov d2, x20\",\n        \"fmov v2.D[1], x22\",\n        \"ldur q3, [x4, #28]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"add x0, x28, x21, lsl #4\",\n        \"str q3, [x0, #1056]\",\n        \"add w20, w21, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #38]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str q3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldr q3, [x4, #48]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str q3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #58]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str q3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #68]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str q3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #78]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str q3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #88]\",\n        \"and v2.16b, v3.16b, v2.16b\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str q2, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur d2, [x4, #98]\",\n        \"ldr h3, [x4, #106]\",\n        \"mov v2.h[4], v3.h[0]\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str q2, [x0, #1056]\"\n      ]\n    },\n    \"fnsave [rax]\": {\n      \"ExpectedInstructionCount\": 79,\n      \"Comment\": [\n        \"0xdd !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrh w21, [x28, #1200]\",\n        \"str w21, [x4]\",\n        \"ldrb w21, [x28, #1051]\",\n        \"lsl x21, x21, #11\",\n        \"ldrb w22, [x28, #1048]\",\n        \"orr x21, x21, x22, lsl #8\",\n        \"ldrb w22, [x28, #1049]\",\n        \"orr x21, x21, x22, lsl #9\",\n        \"ldrb w22, [x28, #1050]\",\n        \"orr x21, x21, x22, lsl #10\",\n        \"ldrb w22, [x28, #1054]\",\n        \"orr x21, x21, x22, lsl #14\",\n        \"ldrb w22, [x28, #1040]\",\n        \"orr x21, x21, x22\",\n        \"str w21, [x4, #4]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"orr w21, w21, w21, lsl #4\",\n        \"and w21, w21, #0xf0f0f0f\",\n        \"orr w21, w21, w21, lsl #2\",\n        \"and w21, w21, #0x33333333\",\n        \"orr w21, w21, w21, lsl #1\",\n        \"and w21, w21, #0x55555555\",\n        \"orr w21, w21, w21, lsl #1\",\n        \"eor w21, w21, #0xffff\",\n        \"str w21, [x4, #8]\",\n        \"str wzr, [x4, #12]\",\n        \"str wzr, [x4, #16]\",\n        \"str wzr, [x4, #20]\",\n        \"str wzr, [x4, #24]\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"stur q2, [x4, #28]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"stur q2, [x4, #38]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"str q2, [x4, #48]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"stur q2, [x4, #58]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"stur q2, [x4, #68]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"stur q2, [x4, #78]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"stur q2, [x4, #88]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr q2, [x0, #1056]\",\n        \"stur d2, [x4, #98]\",\n        \"dup v2.8h, v2.h[4]\",\n        \"str h2, [x4, #106]\",\n        \"mov w20, #0x37f\",\n        \"strh w20, [x28, #1200]\",\n        \"strb wzr, [x28, #1051]\",\n        \"strb wzr, [x28, #1202]\",\n        \"strb wzr, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb wzr, [x28, #1054]\",\n        \"strb wzr, [x28, #1040]\"\n      ]\n    },\n    \"fnstsw [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdd !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"strh w20, [x4]\"\n      ]\n    },\n    \"ffree st0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdd 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st3\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st4\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st5\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st6\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st7\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"0xdd 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"fst st1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd1 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd2 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st3\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd3 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st4\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd4 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st5\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd5 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st6\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd6 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st7\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd7 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st0\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdd 11b 0xd8 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xdd 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xda /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st3\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdb /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st4\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdc /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st5\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdd /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st6\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xde /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st7\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdf /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucom st0\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xdd 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucom st1\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdd 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucom st2\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdd 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucom st3\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdd 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucom st4\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdd 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucom st5\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdd 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucom st6\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdd 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucom st7\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdd 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"fucomp st0\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xdd 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st1\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"0xdd 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x22, x0\",\n        \"ubfx x23, x22, #1, #1\",\n        \"ubfx x24, x22, #0, #1\",\n        \"ubfx x22, x22, #2, #1\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"strb w22, [x28, #1040]\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st2\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdd 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st3\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdd 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st4\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdd 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st5\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdd 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st6\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdd 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st7\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdd 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fiadd word [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xde !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fimul word [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xde !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"ficom word [rax]\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xde !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x20, x0\",\n        \"ubfx x21, x20, #1, #1\",\n        \"ubfx x22, x20, #0, #1\",\n        \"ubfx x20, x20, #2, #1\",\n        \"orr w21, w21, w20\",\n        \"orr w22, w22, w20\",\n        \"strb w21, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\"\n      ]\n    },\n    \"ficomp word [rax]\": {\n      \"ExpectedInstructionCount\": 37,\n      \"Comment\": [\n        \"0xde !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisub word [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xde !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fisubr word [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xde !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fidiv word [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xde !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"fidivr word [rax]\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xde !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"str x30, [sp, #-16]!\",\n        \"sxth w1, w20\",\n        \"ldr x0, [x28, #1808]\",\n        \"ldr x3, [x28, #1816]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x20, #1056]\"\n      ]\n    },\n    \"faddp st0\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xd8 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st1\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xde 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st2\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st3\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st4\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st5\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st6\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st7\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2016]\",\n        \"ldr x3, [x28, #2024]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st0\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"0xde 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st1\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xde 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st2\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st3\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st4\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st5\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st6\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st7\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2048]\",\n        \"ldr x3, [x28, #2056]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcompp\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xde 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"strb w21, [x28, #1040]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xc0c0\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xe0\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"fsubrp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st1, st0\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xde 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q2, [x22, #1056]\",\n        \"add x23, x28, x20, lsl #4\",\n        \"ldr q3, [x23, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st2, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st3, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st4, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st5, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st6, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st7, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xe8\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"fsubp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st1, st0\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xde 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st2, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st3, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st4, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st5, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st6, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st7, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2032]\",\n        \"ldr x3, [x28, #2040]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xf0\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"fdivrp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st1, st0\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xde 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q2, [x22, #1056]\",\n        \"add x23, x28, x20, lsl #4\",\n        \"ldr q3, [x23, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st2, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st3, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st4, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st5, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st6, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st7, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xf8\": {\n      \"ExpectedInstructionCount\": 20,\n      \"Comment\": [\n        \"fdivp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st1, st0\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xde 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"strb w21, [x28, #1051]\",\n        \"str q2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st2, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st3, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st4, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st5, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st6, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st7, st0\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xde 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #2064]\",\n        \"ldr x3, [x28, #2072]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fild word [rax]\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"mrs x21, nzcv\",\n        \"mov w22, #0x0\",\n        \"cmp x20, #0x0 (0)\",\n        \"mov w23, #0x8000\",\n        \"csel x23, x23, x22, lt\",\n        \"cneg x20, x20, mi\",\n        \"mov w24, #0x3f\",\n        \"mov x0, #0x3f\",\n        \"clz x30, x20\",\n        \"sub x30, x0, x30\",\n        \"sub x24, x24, x30\",\n        \"lsl x30, x20, x24\",\n        \"mov w18, #0x403e\",\n        \"sub x24, x18, x24\",\n        \"cmp x20, #0x0 (0)\",\n        \"csel x20, x22, x24, eq\",\n        \"orr x20, x23, x20\",\n        \"fmov d2, x30\",\n        \"fmov v2.D[1], x20\",\n        \"msr nzcv, x21\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisttp word [rax]\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"0xdf !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"mov x21, v2.d[1]\",\n        \"and x21, x21, #0x7fff\",\n        \"mrs x22, nzcv\",\n        \"tst x21, #0x7fff\",\n        \"cset x23, eq\",\n        \"mov w24, #0x400e\",\n        \"cmp x21, x24\",\n        \"cset x21, hs\",\n        \"orr x21, x23, x21\",\n        \"strb w21, [x28, #1040]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1744]\",\n        \"ldr x3, [x28, #1752]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov w21, w0\",\n        \"strh w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x22\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fist word [rax]\": {\n      \"ExpectedInstructionCount\": 22,\n      \"Comment\": [\n        \"0xdf !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr q2, [x20, #1056]\",\n        \"mov x20, v2.d[1]\",\n        \"and x20, x20, #0x7fff\",\n        \"mrs x21, nzcv\",\n        \"tst x20, #0x7fff\",\n        \"cset x22, eq\",\n        \"mov w23, #0x400e\",\n        \"cmp x20, x23\",\n        \"cset x20, hs\",\n        \"orr x20, x22, x20\",\n        \"strb w20, [x28, #1040]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1696]\",\n        \"ldr x3, [x28, #1704]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov w20, w0\",\n        \"strh w20, [x4]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fistp word [rax]\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"0xdf !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"mov x21, v2.d[1]\",\n        \"and x21, x21, #0x7fff\",\n        \"mrs x22, nzcv\",\n        \"tst x21, #0x7fff\",\n        \"cset x23, eq\",\n        \"mov w24, #0x400e\",\n        \"cmp x21, x24\",\n        \"cset x21, hs\",\n        \"orr x21, x23, x21\",\n        \"strb w21, [x28, #1040]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1696]\",\n        \"ldr x3, [x28, #1704]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov w21, w0\",\n        \"strh w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x22\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fbld tword [rax]\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xdf !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"add x20, x4, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #2000]\",\n        \"ldr x3, [x28, #2008]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str q2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fbstp tword [rax]\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xdf !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1984]\",\n        \"ldr x3, [x28, #1992]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str d2, [x4]\",\n        \"mov x21, v2.d[1]\",\n        \"strh w21, [x4, #8]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffreep st0\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st3\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st4\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st5\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st6\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st7\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"fnstsw ax\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdf 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"fucomip st0\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"0xdf 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w22, #29, #1\",\n        \"bfi w24, w23, #30, #1\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x24\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st1\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x22, x0\",\n        \"ubfx x23, x22, #1, #1\",\n        \"ubfx x24, x22, #0, #1\",\n        \"ubfx x22, x22, #2, #1\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"eor x23, x23, #0x1\",\n        \"mrs x30, nzcv\",\n        \"bfi w30, w23, #29, #1\",\n        \"bfi w30, w24, #30, #1\",\n        \"eor w26, w22, #0x1\",\n        \"strb w22, [x28, #1040]\",\n        \"msr nzcv, x30\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st2\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xdf 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w22, #29, #1\",\n        \"bfi w24, w23, #30, #1\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x24\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st3\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xdf 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w22, #29, #1\",\n        \"bfi w24, w23, #30, #1\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x24\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st4\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xdf 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w22, #29, #1\",\n        \"bfi w24, w23, #30, #1\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x24\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st5\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xdf 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w22, #29, #1\",\n        \"bfi w24, w23, #30, #1\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x24\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st6\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xdf 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w22, #29, #1\",\n        \"bfi w24, w23, #30, #1\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x24\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st7\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xdf 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w22, #29, #1\",\n        \"bfi w24, w23, #30, #1\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x24\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st0\": {\n      \"ExpectedInstructionCount\": 31,\n      \"Comment\": [\n        \"0xdf 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v2.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w22, #29, #1\",\n        \"bfi w24, w23, #30, #1\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x24\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st1\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xdf 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr q3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x22, x0\",\n        \"ubfx x23, x22, #1, #1\",\n        \"ubfx x24, x22, #0, #1\",\n        \"ubfx x22, x22, #2, #1\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"eor x23, x23, #0x1\",\n        \"mrs x30, nzcv\",\n        \"bfi w30, w23, #29, #1\",\n        \"bfi w30, w24, #30, #1\",\n        \"eor w26, w22, #0x1\",\n        \"strb w22, [x28, #1040]\",\n        \"msr nzcv, x30\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st2\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xdf 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w22, #29, #1\",\n        \"bfi w24, w23, #30, #1\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x24\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st3\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xdf 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w22, #29, #1\",\n        \"bfi w24, w23, #30, #1\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x24\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st4\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xdf 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w22, #29, #1\",\n        \"bfi w24, w23, #30, #1\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x24\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st5\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xdf 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w22, #29, #1\",\n        \"bfi w24, w23, #30, #1\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x24\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st6\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xdf 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w22, #29, #1\",\n        \"bfi w24, w23, #30, #1\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x24\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st7\": {\n      \"ExpectedInstructionCount\": 35,\n      \"Comment\": [\n        \"0xdf 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr q2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr q3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"mov v1.16b, v3.16b\",\n        \"ldr x0, [x28, #1792]\",\n        \"ldr x3, [x28, #1800]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov x21, x0\",\n        \"ubfx x22, x21, #1, #1\",\n        \"ubfx x23, x21, #0, #1\",\n        \"ubfx x21, x21, #2, #1\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"eor x22, x22, #0x1\",\n        \"mrs x24, nzcv\",\n        \"bfi w24, w22, #29, #1\",\n        \"bfi w24, w23, #30, #1\",\n        \"eor w26, w21, #0x1\",\n        \"strb w21, [x28, #1040]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"msr nzcv, x24\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"memcpy4_32\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 16,\n      \"x86Insts\": [\n        \"fld dword [rax]\",\n        \"fstp dword [rdx]\",\n        \"fld dword [rax + 4]\",\n        \"fstp dword [rdx + 4]\",\n        \"fld dword [rax + 8]\",\n        \"fstp dword [rdx + 8]\",\n        \"fld dword [rax + 12]\",\n        \"fstp dword [rdx + 12]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str s2, [x5]\",\n        \"ldr s2, [x4, #4]\",\n        \"str s2, [x5, #4]\",\n        \"ldr s2, [x4, #8]\",\n        \"str s2, [x5, #8]\",\n        \"ldr s2, [x4, #12]\",\n        \"str s2, [x5, #12]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"memcpy4_64\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 16,\n      \"x86Insts\": [\n        \"fld qword [rax]\",\n        \"fstp qword [rdx]\",\n        \"fld qword [rax + 8]\",\n        \"fstp qword [rdx + 8]\",\n        \"fld qword [rax + 16]\",\n        \"fstp qword [rdx + 16]\",\n        \"fld qword [rax + 32]\",\n        \"fstp qword [rdx + 32]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str d2, [x5]\",\n        \"ldr d2, [x4, #8]\",\n        \"str d2, [x5, #8]\",\n        \"ldr d2, [x4, #16]\",\n        \"str d2, [x5, #16]\",\n        \"ldr d2, [x4, #32]\",\n        \"str d2, [x5, #32]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Multiple fld/fst\": {\n      \"x86InstructionCount\": 4,\n      \"ExpectedInstructionCount\": 22,\n      \"x86Insts\": [\n        \"fld     qword [ebp+16380]\",\n        \"fstp    qword [eax-0x4]\",\n        \"fld     qword [ebp-0x8]\",\n        \"fstp    qword [eax+16370]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffc\",\n        \"add x20, x9, x20\",\n        \"mov w20, w20\",\n        \"ldr d2, [x20]\",\n        \"sub x20, x4, #0x4 (4)\",\n        \"mov w20, w20\",\n        \"str d2, [x20]\",\n        \"sub x20, x9, #0x8 (8)\",\n        \"mov w20, w20\",\n        \"ldr d2, [x20]\",\n        \"mov w20, #0x3ff2\",\n        \"add x20, x4, x20\",\n        \"mov w20, w20\",\n        \"str d2, [x20]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"memcpy4_80\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 38,\n      \"x86Insts\": [\n        \"fld tword [rax]\",\n        \"fstp tword [rdx]\",\n        \"fld tword [rax + 10]\",\n        \"fstp tword [rdx + 10]\",\n        \"fld tword [rax + 20]\",\n        \"fstp tword [rdx + 20]\",\n        \"fld tword [rax + 30]\",\n        \"fstp tword [rdx + 30]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"add x20, x4, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"str d2, [x5]\",\n        \"mov x20, v2.d[1]\",\n        \"strh w20, [x5, #8]\",\n        \"add x20, x4, #0xa (10)\",\n        \"ldr d2, [x20]\",\n        \"add x20, x20, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"stur d2, [x5, #10]\",\n        \"mov x20, v2.d[1]\",\n        \"add x21, x5, #0xa (10)\",\n        \"strh w20, [x21, #8]\",\n        \"add x20, x4, #0x14 (20)\",\n        \"ldr d2, [x20]\",\n        \"add x20, x20, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"stur d2, [x5, #20]\",\n        \"mov x20, v2.d[1]\",\n        \"add x21, x5, #0x14 (20)\",\n        \"strh w20, [x21, #8]\",\n        \"add x20, x4, #0x1e (30)\",\n        \"ldr d2, [x20]\",\n        \"add x20, x20, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"stur d2, [x5, #30]\",\n        \"mov x20, v2.d[1]\",\n        \"add x21, x5, #0x1e (30)\",\n        \"strh w20, [x21, #8]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/x87_32Bit.json",
    "content": "{\n  \"Features\": {\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"CSSC\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ]\n  },\n  \"Instructions\": {\n    \"Multiple fld/fst\": {\n      \"x86InstructionCount\": 4,\n      \"ExpectedInstructionCount\": 13,\n      \"x86Insts\": [\n        \"fld     dword [ebp+16380]\",\n        \"fstp    dword [eax-0x4]\",\n        \"fld     dword [ebp-0x8]\",\n        \"fstp    dword [eax+16370]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x9, #16380]\",\n        \"stur s2, [x4, #-4]\",\n        \"ldur s2, [x9, #-8]\",\n        \"mov w20, #0x3ff2\",\n        \"str s2, [x4, x20, sxtx]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/x87_f64.json",
    "content": "{\n  \"Features\": {\n    \"Env\": {\n      \"FEX_X87REDUCEDPRECISION\": \"1\"\n    },\n    \"Bitness\": 64,\n    \"EnabledHostFeatures\": [],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"AFP\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ]\n  },\n  \"Instructions\": {\n    \"fadd dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xd8 !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xd8 !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcom dword [rax]\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd8 !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x21, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"fcomp dword [rax]\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w21, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x20\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w21, w22, w21\",\n        \"bic w20, w20, w21\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsub dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xd8 !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xd8 !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xd8 !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xd8 !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd8 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fadd d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st4\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st5\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st6\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st0, st7\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd8 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fmul d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st4\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st5\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st6\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st0, st7\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcom st0, st0\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd8 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"mrs x20, nzcv\",\n        \"fcmp d2, d2\",\n        \"cset x21, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"fcom st0, st1\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xd8 11b 0xd1 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w20\",\n        \"orr w23, w23, w20\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fcom st0, st2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xd8 11b 0xd2 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w20\",\n        \"orr w23, w23, w20\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fcom st0, st3\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xd8 11b 0xd3 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w20\",\n        \"orr w23, w23, w20\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fcom st0, st4\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xd8 11b 0xd4 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w20\",\n        \"orr w23, w23, w20\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fcom st0, st5\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xd8 11b 0xd5 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w20\",\n        \"orr w23, w23, w20\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fcom st0, st6\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xd8 11b 0xd6 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w20\",\n        \"orr w23, w23, w20\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fcom st0, st7\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xd8 11b 0xd7 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w20\",\n        \"orr w23, w23, w20\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fcomp st0, st0\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"0xd8 11b 0xd8 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"fcmp d2, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st1\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xd8 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"mrs x22, nzcv\",\n        \"add x23, x28, x20, lsl #4\",\n        \"ldr d3, [x23, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x23, vs\",\n        \"cset x24, lo\",\n        \"cset x30, eq\",\n        \"orr w24, w24, w23\",\n        \"orr w30, w30, w23\",\n        \"strb w24, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w23, [x28, #1050]\",\n        \"strb w30, [x28, #1054]\",\n        \"msr nzcv, x22\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st2\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xd8 11b 0xda /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st3\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xd8 11b 0xdb /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st4\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xd8 11b 0xdc /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st5\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xd8 11b 0xdd /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st6\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xd8 11b 0xde /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomp st0, st7\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xd8 11b 0xdf /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsub st0, st0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd8 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fsub d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st4\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st5\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st6\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st0, st7\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr st0, st0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd8 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fsub d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr st0, st1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st4\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st5\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st6\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st0, st7\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdiv st0, st0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd8 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fdiv d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st4\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st5\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st6\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st0, st7\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr st0, st0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd8 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fdiv d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr st0, st1\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st2\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st3\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st4\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st5\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st6\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st0, st7\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xd8 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fld dword [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xd9 !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"fcvt d2, s2\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst dword [rax]\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd9 !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\"\n      ]\n    },\n    \"fstp dword [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xd9 !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldenv [rax]\": {\n      \"ExpectedInstructionCount\": 33,\n      \"Comment\": [\n        \"0xd9 !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"ubfx w21, w20, #10, #3\",\n        \"rbit w1, w21\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x21, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\",\n        \"strh w20, [x28, #1200]\",\n        \"ldr w20, [x4, #4]\",\n        \"ubfx w21, w20, #11, #3\",\n        \"strb w21, [x28, #1051]\",\n        \"ubfx w21, w20, #8, #1\",\n        \"ubfx w22, w20, #9, #1\",\n        \"ubfx w23, w20, #10, #1\",\n        \"ubfx w24, w20, #14, #1\",\n        \"ubfx w20, w20, #0, #1\",\n        \"strb w21, [x28, #1048]\",\n        \"strb w22, [x28, #1049]\",\n        \"strb w23, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\",\n        \"ldr w20, [x4, #8]\",\n        \"and w20, w20, w20, lsr #1\",\n        \"mov w21, #0x55555555\",\n        \"bic w20, w21, w20\",\n        \"orr w20, w20, w20, lsr #1\",\n        \"and w20, w20, #0x33333333\",\n        \"orr w20, w20, w20, lsr #2\",\n        \"and w20, w20, #0xf0f0f0f\",\n        \"orr w20, w20, w20, lsr #4\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldcw [rax]\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"ubfx w21, w20, #10, #3\",\n        \"rbit w1, w21\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x21, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\",\n        \"strh w20, [x28, #1200]\"\n      ]\n    },\n    \"fnstenv [rax]\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xd9 !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #1200]\",\n        \"str w20, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"str w20, [x4, #4]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"orr w20, w20, w20, lsl #4\",\n        \"and w20, w20, #0xf0f0f0f\",\n        \"orr w20, w20, w20, lsl #2\",\n        \"and w20, w20, #0x33333333\",\n        \"orr w20, w20, w20, lsl #1\",\n        \"and w20, w20, #0x55555555\",\n        \"orr w20, w20, w20, lsl #1\",\n        \"eor w20, w20, #0xffff\",\n        \"str w20, [x4, #8]\",\n        \"str wzr, [x4, #12]\",\n        \"str wzr, [x4, #16]\",\n        \"str wzr, [x4, #20]\",\n        \"str wzr, [x4, #24]\"\n      ]\n    },\n    \"fnstcw [rax]\": {\n      \"ExpectedInstructionCount\": 2,\n      \"Comment\": [\n        \"0xd9 !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x28, #1200]\",\n        \"strh w20, [x4]\"\n      ]\n    },\n    \"fld st0\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xd9 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st2\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st3\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st4\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st5\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st6\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xd9 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld st7\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xd9 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"strb w20, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fxch st0, st0\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xd9 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1049]\"\n      ]\n    },\n    \"fxch st0, st1\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str d3, [x21, #1056]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st2\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str d3, [x21, #1056]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st3\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str d3, [x21, #1056]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st4\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str d3, [x21, #1056]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st5\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str d3, [x21, #1056]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st6\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str d3, [x21, #1056]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fxch st0, st7\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xd9 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"strb wzr, [x28, #1049]\",\n        \"str d3, [x21, #1056]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fnop\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"0xd9 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"fchs\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd9 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fneg v2.2d, v2.2d\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fabs\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd9 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fabs d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"ftst\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mov w21, #0x0\",\n        \"fmov d3, x21\",\n        \"fcmp d2, d3\",\n        \"cset x21, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"fxam\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mov x21, v2.d[0]\",\n        \"lsr x21, x21, #63\",\n        \"strb w21, [x28, #1049]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"lsr w20, w21, w20\",\n        \"and w20, w20, #0x1\",\n        \"mrs x21, nzcv\",\n        \"cmp w20, #0x1 (1)\",\n        \"cset x22, ne\",\n        \"strb w22, [x28, #1048]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w22, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fld1\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xd9 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x3ff0000000000000\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldl2t\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0xa372\",\n        \"movk x20, #0x979, lsl #16\",\n        \"movk x20, #0x934f, lsl #32\",\n        \"movk x20, #0x400a, lsl #48\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldl2e\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x82fe\",\n        \"movk x20, #0x652b, lsl #16\",\n        \"movk x20, #0x1547, lsl #32\",\n        \"movk x20, #0x3ff7, lsl #48\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldpi\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x2d18\",\n        \"movk x20, #0x5444, lsl #16\",\n        \"movk x20, #0x21fb, lsl #32\",\n        \"movk x20, #0x4009, lsl #48\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldlg2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x79ff\",\n        \"movk x20, #0x509f, lsl #16\",\n        \"movk x20, #0x4413, lsl #32\",\n        \"movk x20, #0x3fd3, lsl #48\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldln2\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x39ef\",\n        \"movk x20, #0xfefa, lsl #16\",\n        \"movk x20, #0x2e42, lsl #32\",\n        \"movk x20, #0x3fe6, lsl #48\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fldz\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xd9 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x0\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"f2xm1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xd9 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #2240]\",\n        \"ldr x3, [x28, #2248]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fyl2x\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"fmov d1, d2\",\n        \"ldr x0, [x28, #2256]\",\n        \"ldr x3, [x28, #2264]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x22, #1056]\"\n      ]\n    },\n    \"fptan\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"0xd9 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #2992]\",\n        \"str x30, [sp, #-16]!\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"mov x22, #0x3ff0000000000000\",\n        \"fmov d3, x22\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb w20, [x28, #1051]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"str d3, [x22, #1056]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fpatan\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"fmov d1, d2\",\n        \"ldr x0, [x28, #2224]\",\n        \"ldr x3, [x28, #2232]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"strb w20, [x28, #1051]\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fxtract\": {\n      \"ExpectedInstructionCount\": 30,\n      \"Comment\": [\n        \"0xd9 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mov x22, v2.d[0]\",\n        \"mov x23, #0xfff0000000000000\",\n        \"fmov d3, x23\",\n        \"ubfx x23, x22, #52, #11\",\n        \"sub x23, x23, #0x3ff (1023)\",\n        \"scvtf d4, x23\",\n        \"and x23, x22, #0x800fffffffffffff\",\n        \"orr x23, x23, #0x3ff0000000000000\",\n        \"fmov d5, x23\",\n        \"mrs x23, nzcv\",\n        \"tst x22, #0x7fffffffffffffff\",\n        \"fcsel d2, d2, d5, eq\",\n        \"fcsel d3, d3, d4, eq\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"msr nzcv, x23\",\n        \"strb w20, [x28, #1051]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"str d3, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0x303\",\n        \"lsr w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fprem1\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"fmov d1, d2\",\n        \"ldr x0, [x28, #2288]\",\n        \"ldr x3, [x28, #2296]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"strb wzr, [x28, #1050]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdecstp\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xd9 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"fincstp\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xd9 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"fprem\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xd9 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"fmov d1, d2\",\n        \"ldr x0, [x28, #2272]\",\n        \"ldr x3, [x28, #2280]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"strb wzr, [x28, #1050]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fyl2xp1\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xd9 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov x20, #0x3ff0000000000000\",\n        \"fmov d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"fmov d1, d3\",\n        \"ldr x0, [x28, #2256]\",\n        \"ldr x3, [x28, #2264]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"strb w20, [x28, #1051]\",\n        \"str d3, [x22, #1056]\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsqrt\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd9 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fsqrt d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsincos\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xd9 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #2976]\",\n        \"str x30, [sp, #-16]!\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #2984]\",\n        \"str x30, [sp, #-16]!\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb w20, [x28, #1051]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"str d3, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"frndint\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"0xd9 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"frinti d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fscale\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xd9 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d3\",\n        \"fmov d1, d2\",\n        \"ldr x0, [x28, #2304]\",\n        \"ldr x3, [x28, #2312]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsin\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xd9 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #2976]\",\n        \"str x30, [sp, #-16]!\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"strb wzr, [x28, #1050]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcos\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xd9 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #2984]\",\n        \"str x30, [sp, #-16]!\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"strb wzr, [x28, #1050]\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fiadd dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fimul dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"ficom dword [rax]\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xda !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x21, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"ficomp dword [rax]\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xda !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w21, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x20\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w21, w22, w21\",\n        \"bic w20, w20, w21\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisub dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fisubr dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fidiv dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fidivr dword [rax]\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovb st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, lo\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmove st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, eq\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xda 11b 0xd0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovbe st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xda 11b 0xd7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ls\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st0\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xda 11b 0xd8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xd9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xda /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st3\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st4\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st5\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st6\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xde /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovu st0, st7\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xda 11b 0xdf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eon w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fucompp\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xda 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"mrs x22, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w20\",\n        \"orr w24, w24, w20\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w20, w21, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"msr nzcv, x22\",\n        \"strb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xc0c0\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fild dword [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdf !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr w20, [x4]\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisttp dword [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdb !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fcvtzs w21, d2\",\n        \"str w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fist dword [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdb !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"frinti d0, d2\",\n        \"fcvtzs w20, d0\",\n        \"str w20, [x4]\"\n      ]\n    },\n    \"fistp dword [rax]\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdf !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"frinti d0, d2\",\n        \"fcvtzs w21, d0\",\n        \"str w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fld tword [rax]\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xdb !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"add x20, x4, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp tword [rax]\": {\n      \"ExpectedInstructionCount\": 21,\n      \"Comment\": [\n        \"0xdb !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str d2, [x4]\",\n        \"mov x21, v2.d[1]\",\n        \"strh w21, [x4, #8]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcmovnb st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xdb 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnb st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hs\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xdb 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovne st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, ne\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xdb 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd1 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd2 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd3 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd4 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd5 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd6 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnbe st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xd7 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"csetm x20, hi\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st0\": {\n      \"ExpectedInstructionCount\": 10,\n      \"Comment\": [\n        \"0xdb 11b 0xd8 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v3.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st1\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st2\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xda /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st3\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdb /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st4\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdc /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st5\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdd /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st6\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xde /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcmovnu st0, st7\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdb 11b 0xdf /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"eor w0, w26, w26, lsr #4\",\n        \"eor w0, w0, w0, lsr #2\",\n        \"eor w20, w0, w0, lsr #1\",\n        \"sbfx x20, x20, #0, #1\",\n        \"dup v2.2d, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d4, [x20, #1056]\",\n        \"bsl v2.16b, v3.16b, v4.16b\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fnclex\": {\n      \"ExpectedInstructionCount\": 1,\n      \"Comment\": [\n        \"0xdb 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"strb wzr, [x28, #1040]\"\n      ]\n    },\n    \"fninit\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdb 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x0\",\n        \"rbit w1, w20\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x20, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\",\n        \"mov w20, #0x37f\",\n        \"strh w20, [x28, #1200]\",\n        \"strb wzr, [x28, #1051]\",\n        \"strb wzr, [x28, #1202]\",\n        \"strb wzr, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb wzr, [x28, #1054]\",\n        \"strb wzr, [x28, #1040]\"\n      ]\n    },\n    \"fucomi st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xdb 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fcmp d2, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fucomi st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fucomi st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fucomi st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fucomi st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fucomi st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fucomi st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fucomi st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fcomi st0, st0\": {\n      \"ExpectedInstructionCount\": 7,\n      \"Comment\": [\n        \"0xdb 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fcmp d2, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fcomi st0, st1\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fcomi st0, st2\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fcomi st0, st3\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fcomi st0, st4\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fcomi st0, st5\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fcomi st0, st6\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fcomi st0, st7\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdb 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\"\n      ]\n    },\n    \"fadd qword [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdc !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul qword [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdc !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fcom qword [rax]\": {\n      \"ExpectedInstructionCount\": 16,\n      \"Comment\": [\n        \"0xdc !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x21, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"fcomp qword [rax]\": {\n      \"ExpectedInstructionCount\": 24,\n      \"Comment\": [\n        \"0xdc !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w21, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x20\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w21, w22, w21\",\n        \"bic w20, w20, w21\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsub qword [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdc !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr qword [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdc !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv qword [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdc !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr qword [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdc !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xc0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"fadd st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fadd d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st1, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st2, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st3, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st4, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st5, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st6, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fadd st7, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xc8\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"fmul st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fmul d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st1, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st2, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st3, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st4, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st5, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st6, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fmul st7, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xe0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"fsubr st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fsub d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsubr st1, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st2, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st3, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st4, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st5, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st6, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fsubr st7, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xe8\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"fsub st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fsub d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st1, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st2, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st3, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st4, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st5, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st6, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fsub st7, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xf0\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"fdivr st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fdiv d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdivr st1, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st2, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st3, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st4, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st5, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st6, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"fdivr st7, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x21, #1056]\"\n      ]\n    },\n    \"db 0xdc, 0xf8\": {\n      \"ExpectedInstructionCount\": 5,\n      \"Comment\": [\n        \"fdiv st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xdc 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"fdiv d2, d2, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st1, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st2, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st3, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st4, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st5, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st6, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fdiv st7, st0\": {\n      \"ExpectedInstructionCount\": 9,\n      \"Comment\": [\n        \"0xdc 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fld qword [rax]\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisttp qword [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdd !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fcvtzs x21, d2\",\n        \"str x21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst qword [rax]\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdd !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"str d2, [x4]\"\n      ]\n    },\n    \"fstp qword [rax]\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"str d2, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"frstor [rax]\": {\n      \"ExpectedInstructionCount\": 141,\n      \"Comment\": [\n        \"0xdd !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"strh w20, [x28, #1200]\",\n        \"lsr w20, w20, #10\",\n        \"and w20, w20, #0x3\",\n        \"rbit w1, w20\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x20, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\",\n        \"ldr w20, [x4, #4]\",\n        \"ubfx w21, w20, #11, #3\",\n        \"strb w21, [x28, #1051]\",\n        \"ubfx w22, w20, #8, #1\",\n        \"ubfx w23, w20, #9, #1\",\n        \"ubfx w24, w20, #10, #1\",\n        \"ubfx w30, w20, #14, #1\",\n        \"ubfx w20, w20, #0, #1\",\n        \"strb w22, [x28, #1048]\",\n        \"strb w23, [x28, #1049]\",\n        \"strb w24, [x28, #1050]\",\n        \"strb w30, [x28, #1054]\",\n        \"strb w20, [x28, #1040]\",\n        \"ldr w20, [x4, #8]\",\n        \"and w20, w20, w20, lsr #1\",\n        \"mov w22, #0x55555555\",\n        \"bic w20, w22, w20\",\n        \"orr w20, w20, w20, lsr #1\",\n        \"and w20, w20, #0x33333333\",\n        \"orr w20, w20, w20, lsr #2\",\n        \"and w20, w20, #0xf0f0f0f\",\n        \"orr w20, w20, w20, lsr #4\",\n        \"strb w20, [x28, #1202]\",\n        \"mov x20, #0xffffffffffffffff\",\n        \"mov w22, #0xffff\",\n        \"fmov d2, x20\",\n        \"fmov v2.D[1], x22\",\n        \"ldur q3, [x4, #28]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"add x0, x28, x21, lsl #4\",\n        \"str d3, [x0, #1056]\",\n        \"add w20, w21, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #38]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str d3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldr q3, [x4, #48]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str d3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #58]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str d3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #68]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str d3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #78]\",\n        \"and v3.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v3.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d3, d0\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str d3, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur q3, [x4, #88]\",\n        \"and v2.16b, v3.16b, v2.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str d2, [x0, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"ldur d2, [x4, #98]\",\n        \"ldr h3, [x4, #106]\",\n        \"mov v2.h[4], v3.h[0]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"add x0, x28, x20, lsl #4\",\n        \"str d2, [x0, #1056]\"\n      ]\n    },\n    \"fnsave [rax]\": {\n      \"ExpectedInstructionCount\": 143,\n      \"Comment\": [\n        \"0xdd !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrh w21, [x28, #1200]\",\n        \"str w21, [x4]\",\n        \"ldrb w21, [x28, #1051]\",\n        \"lsl x21, x21, #11\",\n        \"ldrb w22, [x28, #1048]\",\n        \"orr x21, x21, x22, lsl #8\",\n        \"ldrb w22, [x28, #1049]\",\n        \"orr x21, x21, x22, lsl #9\",\n        \"ldrb w22, [x28, #1050]\",\n        \"orr x21, x21, x22, lsl #10\",\n        \"ldrb w22, [x28, #1054]\",\n        \"orr x21, x21, x22, lsl #14\",\n        \"ldrb w22, [x28, #1040]\",\n        \"orr x21, x21, x22\",\n        \"str w21, [x4, #4]\",\n        \"mov w21, #0x0\",\n        \"ldrb w22, [x28, #1202]\",\n        \"orr w22, w22, w22, lsl #4\",\n        \"and w22, w22, #0xf0f0f0f\",\n        \"orr w22, w22, w22, lsl #2\",\n        \"and w22, w22, #0x33333333\",\n        \"orr w22, w22, w22, lsl #1\",\n        \"and w22, w22, #0x55555555\",\n        \"orr w22, w22, w22, lsl #1\",\n        \"eor w22, w22, #0xffff\",\n        \"str w22, [x4, #8]\",\n        \"str wzr, [x4, #12]\",\n        \"str wzr, [x4, #16]\",\n        \"str wzr, [x4, #20]\",\n        \"str wzr, [x4, #24]\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"stur q2, [x4, #28]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"stur q2, [x4, #38]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str q2, [x4, #48]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"stur q2, [x4, #58]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"stur q2, [x4, #68]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"stur q2, [x4, #78]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"stur q2, [x4, #88]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x0, x28, x20, lsl #4\",\n        \"ldr d2, [x0, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"stur d2, [x4, #98]\",\n        \"dup v2.8h, v2.h[4]\",\n        \"str h2, [x4, #106]\",\n        \"rbit w1, w21\",\n        \"lsr w1, w1, #30\",\n        \"mrs x0, fpcr\",\n        \"bfi x0, x1, #22, #2\",\n        \"lsr x1, x21, #2\",\n        \"bfi x0, x1, #24, #1\",\n        \"msr fpcr, x0\",\n        \"mov w20, #0x37f\",\n        \"strh w20, [x28, #1200]\",\n        \"strb wzr, [x28, #1051]\",\n        \"strb wzr, [x28, #1202]\",\n        \"strb wzr, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb wzr, [x28, #1050]\",\n        \"strb wzr, [x28, #1054]\",\n        \"strb wzr, [x28, #1040]\"\n      ]\n    },\n    \"fnstsw [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdd !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"strh w20, [x4]\"\n      ]\n    },\n    \"ffree st0\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdd 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st1\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st2\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st3\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st4\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st5\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st6\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffree st7\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xdd 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st0\": {\n      \"ExpectedInstructionCount\": 0,\n      \"Comment\": [\n        \"0xdd 11b 0xd0 /2\"\n      ],\n      \"ExpectedArm64ASM\": []\n    },\n    \"fst st1\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd1 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st2\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd2 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x2 (2)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st3\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd3 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x3 (3)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st4\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd4 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x4 (4)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st5\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd5 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x5 (5)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st6\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd6 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x6 (6)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fst st7\": {\n      \"ExpectedInstructionCount\": 12,\n      \"Comment\": [\n        \"0xdd 11b 0xd7 /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st0\": {\n      \"ExpectedInstructionCount\": 11,\n      \"Comment\": [\n        \"0xdd 11b 0xd8 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xdd 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xda /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st3\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdb /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st4\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdc /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st5\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdd /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st6\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xde /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fstp st7\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdd 11b 0xdf /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"add w21, w21, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w22, [x28, #1202]\",\n        \"mov w23, #0x1\",\n        \"lsl w21, w23, w21\",\n        \"orr w21, w22, w21\",\n        \"lsl w20, w23, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucom st0\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xdd 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"mrs x20, nzcv\",\n        \"fcmp d2, d2\",\n        \"cset x21, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"fucom st1\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdd 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w20\",\n        \"orr w23, w23, w20\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fucom st2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdd 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w20\",\n        \"orr w23, w23, w20\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fucom st3\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdd 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w20\",\n        \"orr w23, w23, w20\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fucom st4\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdd 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w20\",\n        \"orr w23, w23, w20\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fucom st5\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdd 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w20\",\n        \"orr w23, w23, w20\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fucom st6\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdd 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w20\",\n        \"orr w23, w23, w20\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fucom st7\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdd 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w20\",\n        \"orr w23, w23, w20\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x21\"\n      ]\n    },\n    \"fucomp st0\": {\n      \"ExpectedInstructionCount\": 23,\n      \"Comment\": [\n        \"0xdd 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"fcmp d2, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st1\": {\n      \"ExpectedInstructionCount\": 25,\n      \"Comment\": [\n        \"0xdd 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"mrs x22, nzcv\",\n        \"add x23, x28, x20, lsl #4\",\n        \"ldr d3, [x23, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x23, vs\",\n        \"cset x24, lo\",\n        \"cset x30, eq\",\n        \"orr w24, w24, w23\",\n        \"orr w30, w30, w23\",\n        \"strb w24, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w23, [x28, #1050]\",\n        \"strb w30, [x28, #1054]\",\n        \"msr nzcv, x22\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st2\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdd 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st3\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdd 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st4\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdd 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st5\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdd 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st6\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdd 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomp st7\": {\n      \"ExpectedInstructionCount\": 27,\n      \"Comment\": [\n        \"0xdd 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"mrs x21, nzcv\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x21\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fiadd word [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xde !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fimul word [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xde !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"ficom word [rax]\": {\n      \"ExpectedInstructionCount\": 18,\n      \"Comment\": [\n        \"0xde !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x21, vs\",\n        \"cset x22, lo\",\n        \"cset x23, eq\",\n        \"orr w22, w22, w21\",\n        \"orr w23, w23, w21\",\n        \"strb w22, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w21, [x28, #1050]\",\n        \"strb w23, [x28, #1054]\",\n        \"msr nzcv, x20\"\n      ]\n    },\n    \"ficomp word [rax]\": {\n      \"ExpectedInstructionCount\": 26,\n      \"Comment\": [\n        \"0xde !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"mrs x20, nzcv\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x22, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w22\",\n        \"orr w24, w24, w22\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w22, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w22, w21, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"msr nzcv, x20\",\n        \"strb w22, [x28, #1051]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w21, w22, w21\",\n        \"bic w20, w20, w21\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisub word [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xde !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fisubr word [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xde !11b /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fsub d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fidiv word [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xde !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"fidivr word [rax]\": {\n      \"ExpectedInstructionCount\": 8,\n      \"Comment\": [\n        \"0xde !11b /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, w20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fdiv d2, d2, d3\",\n        \"str d2, [x20, #1056]\"\n      ]\n    },\n    \"faddp st0\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xd8 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fadd d2, d2, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xde 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st3\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st4\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st5\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st6\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"faddp st7\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fadd d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st0\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xde 11b 0xc8 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fmul d2, d2, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st1\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xde 11b 0xc9 /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st2\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xca /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st3\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xcb /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st4\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xcc /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st5\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xcd /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st6\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xce /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fmulp st7\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xcf /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fmul d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcompp\": {\n      \"ExpectedInstructionCount\": 29,\n      \"Comment\": [\n        \"0xde 11b 0xd9 /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"mrs x22, nzcv\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d3, [x20, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x20, vs\",\n        \"cset x23, lo\",\n        \"cset x24, eq\",\n        \"orr w23, w23, w20\",\n        \"orr w24, w24, w20\",\n        \"strb w23, [x28, #1048]\",\n        \"strb wzr, [x28, #1049]\",\n        \"strb w20, [x28, #1050]\",\n        \"strb w24, [x28, #1054]\",\n        \"add w20, w21, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"msr nzcv, x22\",\n        \"strb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x8\",\n        \"sub w20, w22, w20\",\n        \"mov w22, #0xc0c0\",\n        \"lsr w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xe0\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"fsubrp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fsub d2, d2, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st1, st0\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xde 11b 0xe1 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"add x23, x28, x20, lsl #4\",\n        \"ldr d3, [x23, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st2, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xe2 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st3, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xe3 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st4, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xe4 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st5, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xe5 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st6, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xe6 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubrp st7, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xe7 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xe8\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"fsubp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fsub d2, d2, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st1, st0\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xde 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st2, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st3, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st4, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st5, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st6, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fsubp st7, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fsub d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xf0\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"fdivrp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fdiv d2, d2, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st1, st0\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xde 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"add x23, x28, x20, lsl #4\",\n        \"ldr d3, [x23, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st2, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st3, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st4, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st5, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st6, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivrp st7, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"db 0xde, 0xf8\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"fdivp st0, st0\",\n        \"Needs manual encoding since otherwise nasm will emit the 0xd8 variant.\",\n        \"0xde 11b 0xf8 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fdiv d2, d2, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st1, st0\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xde 11b 0xf9 /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"strb w21, [x28, #1051]\",\n        \"str d2, [x22, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st2, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xfa /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st3, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xfb /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st4, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xfc /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st5, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xfd /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st6, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xfe /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fdivp st7, st0\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xde 11b 0xff /7\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fdiv d2, d3, d2\",\n        \"add w22, w20, #0x1 (1)\",\n        \"and w22, w22, #0x7\",\n        \"strb w22, [x28, #1051]\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fild word [rax]\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdf !11b /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrh w20, [x4]\",\n        \"sxth x20, w20\",\n        \"scvtf d2, x20\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fisttp word [rax]\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdf !11b /1\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fcvtzs x21, d2\",\n        \"strh w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fist word [rax]\": {\n      \"ExpectedInstructionCount\": 6,\n      \"Comment\": [\n        \"0xdf !11b /2\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x20, x28, x20, lsl #4\",\n        \"ldr d2, [x20, #1056]\",\n        \"frinti d0, d2\",\n        \"fcvtzs x20, d0\",\n        \"strh w20, [x4]\"\n      ]\n    },\n    \"fistp word [rax]\": {\n      \"ExpectedInstructionCount\": 14,\n      \"Comment\": [\n        \"0xdf !11b /3\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"frinti d0, d2\",\n        \"fcvtzs x21, d0\",\n        \"strh w21, [x4]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fbld tword [rax]\": {\n      \"ExpectedInstructionCount\": 28,\n      \"Comment\": [\n        \"0xdf !11b /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"add x20, x4, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #2000]\",\n        \"ldr x3, [x28, #2008]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1680]\",\n        \"ldr x3, [x28, #1688]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"fmov d2, d0\",\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"str d2, [x21, #1056]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"orr w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fbstp tword [rax]\": {\n      \"ExpectedInstructionCount\": 28,\n      \"Comment\": [\n        \"0xdf !11b /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"str x30, [sp, #-16]!\",\n        \"fmov d0, d2\",\n        \"ldr x0, [x28, #1648]\",\n        \"ldr x3, [x28, #1656]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str x30, [sp, #-16]!\",\n        \"mov v0.16b, v2.16b\",\n        \"ldr x0, [x28, #1984]\",\n        \"ldr x3, [x28, #1992]\",\n        \"blr x0\",\n        \"ldr x30, [sp], #16\",\n        \"mov v2.16b, v0.16b\",\n        \"str d2, [x4]\",\n        \"mov x21, v2.d[1]\",\n        \"strh w21, [x4, #8]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"ffreep st0\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc0 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st1\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc1 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st2\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc2 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st3\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc3 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st4\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc4 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st5\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc5 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st6\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc6 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"ffreep st7\": {\n      \"ExpectedInstructionCount\": 4,\n      \"Comment\": [\n        \"0xdf 11b 0xc7 /0\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w20, w20, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\"\n      ]\n    },\n    \"fnstsw ax\": {\n      \"ExpectedInstructionCount\": 13,\n      \"Comment\": [\n        \"0xdf 11b 0xe0 /4\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"lsl x20, x20, #11\",\n        \"ldrb w21, [x28, #1048]\",\n        \"orr x20, x20, x21, lsl #8\",\n        \"ldrb w21, [x28, #1049]\",\n        \"orr x20, x20, x21, lsl #9\",\n        \"ldrb w21, [x28, #1050]\",\n        \"orr x20, x20, x21, lsl #10\",\n        \"ldrb w21, [x28, #1054]\",\n        \"orr x20, x20, x21, lsl #14\",\n        \"ldrb w21, [x28, #1040]\",\n        \"orr x20, x20, x21\",\n        \"bfxil x4, x20, #0, #16\"\n      ]\n    },\n    \"fucomip st0\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xdf 11b 0xe8 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fcmp d2, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st1\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdf 11b 0xe9 /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdf 11b 0xea /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st3\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdf 11b 0xeb /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st4\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdf 11b 0xec /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st5\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdf 11b 0xed /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st6\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdf 11b 0xee /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fucomip st7\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdf 11b 0xef /5\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st0\": {\n      \"ExpectedInstructionCount\": 15,\n      \"Comment\": [\n        \"0xdf 11b 0xf0 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"fcmp d2, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st1\": {\n      \"ExpectedInstructionCount\": 17,\n      \"Comment\": [\n        \"0xdf 11b 0xf1 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"add x22, x28, x20, lsl #4\",\n        \"ldr d3, [x22, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st2\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdf 11b 0xf2 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x2 (2)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st3\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdf 11b 0xf3 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x3 (3)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st4\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdf 11b 0xf4 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x4 (4)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st5\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdf 11b 0xf5 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x5 (5)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st6\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdf 11b 0xf6 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x6 (6)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"fcomip st7\": {\n      \"ExpectedInstructionCount\": 19,\n      \"Comment\": [\n        \"0xdf 11b 0xf7 /6\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldrb w20, [x28, #1051]\",\n        \"add w21, w20, #0x7 (7)\",\n        \"and w21, w21, #0x7\",\n        \"add x21, x28, x21, lsl #4\",\n        \"ldr d2, [x21, #1056]\",\n        \"add x21, x28, x20, lsl #4\",\n        \"ldr d3, [x21, #1056]\",\n        \"fcmp d3, d2\",\n        \"cset x26, vc\",\n        \"csetm x0, eq\",\n        \"ccmn x26, x0, #nzCv, le\",\n        \"add w21, w20, #0x1 (1)\",\n        \"and w21, w21, #0x7\",\n        \"strb w21, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"memcpy4_32\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 16,\n      \"x86Insts\": [\n        \"fld dword [rax]\",\n        \"fstp dword [rdx]\",\n        \"fld dword [rax + 4]\",\n        \"fstp dword [rdx + 4]\",\n        \"fld dword [rax + 8]\",\n        \"fstp dword [rdx + 8]\",\n        \"fld dword [rax + 12]\",\n        \"fstp dword [rdx + 12]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr s2, [x4]\",\n        \"str s2, [x5]\",\n        \"ldr s2, [x4, #4]\",\n        \"str s2, [x5, #4]\",\n        \"ldr s2, [x4, #8]\",\n        \"str s2, [x5, #8]\",\n        \"ldr s2, [x4, #12]\",\n        \"str s2, [x5, #12]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"memcpy4_64\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 16,\n      \"x86Insts\": [\n        \"fld qword [rax]\",\n        \"fstp qword [rdx]\",\n        \"fld qword [rax + 8]\",\n        \"fstp qword [rdx + 8]\",\n        \"fld qword [rax + 16]\",\n        \"fstp qword [rdx + 16]\",\n        \"fld qword [rax + 32]\",\n        \"fstp qword [rdx + 32]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"str d2, [x5]\",\n        \"ldr d2, [x4, #8]\",\n        \"str d2, [x5, #8]\",\n        \"ldr d2, [x4, #16]\",\n        \"str d2, [x5, #16]\",\n        \"ldr d2, [x4, #32]\",\n        \"str d2, [x5, #32]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"Multiple fld/fst\": {\n      \"x86InstructionCount\": 4,\n      \"ExpectedInstructionCount\": 22,\n      \"x86Insts\": [\n        \"fld     qword [ebp+16380]\",\n        \"fstp    qword [eax-0x4]\",\n        \"fld     qword [ebp-0x8]\",\n        \"fstp    qword [eax+16370]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x3ffc\",\n        \"add x20, x9, x20\",\n        \"mov w20, w20\",\n        \"ldr d2, [x20]\",\n        \"sub x20, x4, #0x4 (4)\",\n        \"mov w20, w20\",\n        \"str d2, [x20]\",\n        \"sub x20, x9, #0x8 (8)\",\n        \"mov w20, w20\",\n        \"ldr d2, [x20]\",\n        \"mov w20, #0x3ff2\",\n        \"add x20, x4, x20\",\n        \"mov w20, w20\",\n        \"str d2, [x20]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    },\n    \"memcpy4_80\": {\n      \"x86InstructionCount\": 8,\n      \"ExpectedInstructionCount\": 38,\n      \"x86Insts\": [\n        \"fld tword [rax]\",\n        \"fstp tword [rdx]\",\n        \"fld tword [rax + 10]\",\n        \"fstp tword [rdx + 10]\",\n        \"fld tword [rax + 20]\",\n        \"fstp tword [rdx + 20]\",\n        \"fld tword [rax + 30]\",\n        \"fstp tword [rdx + 30]\"\n      ],\n      \"ExpectedArm64ASM\": [\n        \"ldr d2, [x4]\",\n        \"add x20, x4, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"str d2, [x5]\",\n        \"mov x20, v2.d[1]\",\n        \"strh w20, [x5, #8]\",\n        \"add x20, x4, #0xa (10)\",\n        \"ldr d2, [x20]\",\n        \"add x20, x20, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"stur d2, [x5, #10]\",\n        \"mov x20, v2.d[1]\",\n        \"add x21, x5, #0xa (10)\",\n        \"strh w20, [x21, #8]\",\n        \"add x20, x4, #0x14 (20)\",\n        \"ldr d2, [x20]\",\n        \"add x20, x20, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"stur d2, [x5, #20]\",\n        \"mov x20, v2.d[1]\",\n        \"add x21, x5, #0x14 (20)\",\n        \"strh w20, [x21, #8]\",\n        \"add x20, x4, #0x1e (30)\",\n        \"ldr d2, [x20]\",\n        \"add x20, x20, #0x8 (8)\",\n        \"ld1 {v2.h}[4], [x20]\",\n        \"stur d2, [x5, #30]\",\n        \"mov x20, v2.d[1]\",\n        \"add x21, x5, #0x1e (30)\",\n        \"strh w20, [x21, #8]\",\n        \"ldrb w20, [x28, #1051]\",\n        \"ldrb w21, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"add w20, w20, #0x7 (7)\",\n        \"and w20, w20, #0x7\",\n        \"lsl w20, w22, w20\",\n        \"bic w20, w21, w20\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/InstructionCountCI/x87_f64_32Bit.json",
    "content": "{\n  \"Features\": {\n    \"Env\": {\n      \"FEX_X87REDUCEDPRECISION\": \"1\"\n    },\n    \"Bitness\": 32,\n    \"EnabledHostFeatures\": [\n      \"AFP\",\n      \"RPRES\",\n      \"FLAGM\",\n      \"FLAGM2\"\n    ],\n    \"DisabledHostFeatures\": [\n      \"SVE128\",\n      \"SVE256\",\n      \"CSSC\"\n    ]\n  },\n  \"Instructions\": {\n    \"fstp dword [ebx*4+0x204a20]\": {\n      \"ExpectedInstructionCount\": 16,\n      \"ExpectedArm64ASM\": [\n        \"mov w20, #0x4a20\",\n        \"movk w20, #0x20, lsl #16\",\n        \"add w20, w20, w6, lsl #2\",\n        \"ldrb w21, [x28, #1051]\",\n        \"add x22, x28, x21, lsl #4\",\n        \"ldr d2, [x22, #1056]\",\n        \"fcvt s2, d2\",\n        \"str s2, [x20]\",\n        \"add w20, w21, #0x1 (1)\",\n        \"and w20, w20, #0x7\",\n        \"strb w20, [x28, #1051]\",\n        \"ldrb w20, [x28, #1202]\",\n        \"mov w22, #0x1\",\n        \"lsl w21, w22, w21\",\n        \"bic w20, w20, w21\",\n        \"strb w20, [x28, #1202]\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "unittests/POSIX/CMakeLists.txt",
    "content": "\n# Careful. Globbing can't see changes to the contents of files\n# Need to do a fresh clean to see changes\nfile(GLOB_RECURSE POSIX_TESTS CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/External/fex-posixtest-bins/conformance/*.test)\n\nforeach(POSIX_TEST ${POSIX_TESTS})\n\n  string(REPLACE \"/fex-posixtest-bins/\" \";\" TEST_NAME_LIST ${POSIX_TEST})\n  list(GET TEST_NAME_LIST 1 TEST_NAME)\n  string(REPLACE \"/\" \"-\" TEST_NAME ${TEST_NAME})\n\n  add_test(NAME \"${TEST_NAME}.jit.posix\"\n    COMMAND \"python3\" \"${CMAKE_SOURCE_DIR}/Scripts/guest_test_runner.py\"\n    \"${CMAKE_CURRENT_SOURCE_DIR}/Known_Failures\"\n    \"${CMAKE_CURRENT_SOURCE_DIR}/Expected_Output\"\n    \"${CMAKE_CURRENT_SOURCE_DIR}/Disabled_Tests\"\n    \"${CMAKE_CURRENT_SOURCE_DIR}/Flake_Tests\"\n    \"${TEST_NAME}\"\n    \"guest\"\n    \"$<TARGET_FILE:FEX>\"\n    \"${POSIX_TEST}\")\n  set_property(TEST \"${TEST_NAME}.jit.posix\" APPEND PROPERTY SKIP_RETURN_CODE 125)\n  set_property(TEST \"${TEST_NAME}.jit.posix\" APPEND PROPERTY ENVIRONMENT \"FEX_OUTPUTLOG=stderr;FEX_SILENTLOG=0;FEX_MAXINST=500\")\nendforeach()\n\nadd_custom_target(posix_tests\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"302\" ${TEST_JOB_FLAG} \"-R\" \"\\.*.posix\")\n"
  },
  {
    "path": "unittests/POSIX/Disabled_Tests",
    "content": "# these are inconsistent or fail on CI\nnanosleep-2-1.test\nconformance-interfaces-clock_nanosleep-2-1.test\nconformance-interfaces-difftime-1-1.test\n\n# These tests are inconsistent\nconformance-interfaces-mmap-12-1.test\nconformance-interfaces-mmap-6-1.test\nconformance-interfaces-mmap-6-2.test\nconformance-interfaces-mmap-6-3.test\n\n# These tests take too long to run, and might timeout\nconformance-interfaces-clock-1-1.test\nconformance-interfaces-clock_gettime-4-1.test\nconformance-interfaces-clock_getcpuclockid-1-1.test\n\n# These tests fail when run natively on x86-64 host\nconformance-interfaces-clock_getcpuclockid-2-1.test\nconformance-interfaces-mlock-speculative-12-1.test\nconformance-interfaces-mmap-11-4.test\nconformance-interfaces-mmap-23-1.test\nconformance-interfaces-pthread_attr_getschedpolicy-2-1.test\nconformance-interfaces-pthread_attr_getscope-1-1.test\nconformance-interfaces-pthread_attr_setschedpolicy-4-1.test\nconformance-interfaces-pthread_attr_setscope-4-1.test\nconformance-interfaces-sched_getparam-6-1.test\nconformance-interfaces-sched_getscheduler-7-1.test\nconformance-interfaces-sigset-8-1.test\nconformance-interfaces-strftime-1-1.test\nsrc-conformance-interfaces-pthread_attr_getschedpolicy-2-1.test\nconformance-interfaces-munmap-2-1.test\nconformance-interfaces-mlockall-3-7.test\nconformance-interfaces-mlockall-speculative-15-1.test\nconformance-interfaces-pthread_attr_getschedparam-1-1.test\nconformance-interfaces-pthread_attr_setschedpolicy-speculative-5-1.test\nconformance-interfaces-sched_setparam-10-1.test\nconformance-interfaces-sched_setparam-23-6.test\nconformance-interfaces-sched_setparam-9-1.test\nconformance-interfaces-sched_setscheduler-1-1.test\nconformance-interfaces-sched_setscheduler-16-1.test\nconformance-interfaces-sched_setscheduler-17-5.test\nconformance-interfaces-sched_setscheduler-4-1.test\nconformance-interfaces-sigaddset-1-core-buildonly.test\nconformance-interfaces-sigaddset-4-core-buildonly.test\nconformance-interfaces-sigdelset-1-core-buildonly.test\nconformance-interfaces-sigdelset-4-core-buildonly.test\nconformance-interfaces-sighold-3-core-buildonly.test\nconformance-interfaces-sigignore-5-core-buildonly.test\nconformance-interfaces-sigismember-5-core-buildonly.test\nconformance-interfaces-sigqueue-9-1.test\nconformance-interfaces-sigrelse-3-core-buildonly.test\nconformance-interfaces-sigset-6-1.test\nconformance-interfaces-sigset-7-1.test\nconformance-interfaces-aio_cancel-10-1.test\nconformance-interfaces-aio_cancel-1-1.test\nconformance-interfaces-aio_cancel-2-1.test\nconformance-interfaces-aio_cancel-2-2.test\nconformance-interfaces-aio_cancel-4-1.test\nconformance-interfaces-aio_cancel-5-1.test\nconformance-interfaces-aio_cancel-6-1.test\nconformance-interfaces-aio_cancel-7-1.test\nconformance-interfaces-aio_cancel-8-1.test\nconformance-interfaces-aio_cancel-9-1.test\nconformance-interfaces-aio_error-1-1.test\nconformance-interfaces-aio_error-2-1.test\nconformance-interfaces-aio_error-3-1.test\nconformance-interfaces-aio_fsync-12-1.test\nconformance-interfaces-aio_fsync-14-1.test\nconformance-interfaces-aio_fsync-2-1.test\nconformance-interfaces-aio_fsync-3-1.test\nconformance-interfaces-aio_fsync-4-1.test\nconformance-interfaces-aio_fsync-4-2.test\nconformance-interfaces-aio_fsync-5-1.test\nconformance-interfaces-aio_fsync-8-1.test\nconformance-interfaces-aio_fsync-8-2.test\nconformance-interfaces-aio_fsync-8-3.test\nconformance-interfaces-aio_fsync-8-4.test\nconformance-interfaces-aio_fsync-9-1.test\nconformance-interfaces-aio_read-10-1.test\nconformance-interfaces-aio_read-11-1.test\nconformance-interfaces-aio_read-11-2.test\nconformance-interfaces-aio_read-2-1.test\nconformance-interfaces-aio_read-3-1.test\nconformance-interfaces-aio_read-3-2.test\nconformance-interfaces-aio_read-4-1.test\nconformance-interfaces-aio_read-5-1.test\nconformance-interfaces-aio_read-7-1.test\nconformance-interfaces-aio_read-8-1.test\nconformance-interfaces-aio_return-1-1.test\nconformance-interfaces-aio_return-3-1.test\nconformance-interfaces-aio_return-3-2.test\nconformance-interfaces-aio_suspend-3-1.test\nconformance-interfaces-aio_suspend-5-1.test\nconformance-interfaces-aio_write-1-1.test\nconformance-interfaces-aio_write-1-2.test\nconformance-interfaces-aio_write-2-1.test\nconformance-interfaces-aio_write-3-1.test\nconformance-interfaces-aio_write-5-1.test\nconformance-interfaces-aio_write-6-1.test\nconformance-interfaces-aio_write-8-1.test\nconformance-interfaces-aio_write-8-2.test\nconformance-interfaces-aio_write-9-1.test\nconformance-interfaces-aio_write-9-2.test\nconformance-interfaces-lio_listio-5-1.test\nconformance-interfaces-lio_listio-6-1.test\nconformance-interfaces-lio_listio-8-1.test\nconformance-interfaces-lio_listio-9-1.test\nconformance-interfaces-pthread_mutex_init-speculative-5-2.test\nconformance-interfaces-sched_get_priority_max-1-3.test\nconformance-interfaces-sched_get_priority_min-1-3.test\nconformance-interfaces-sched_setparam-23-2.test\nconformance-interfaces-sched_setparam-23-3.test\nconformance-interfaces-sched_setparam-23-4.test\nconformance-interfaces-sched_setparam-23-5.test\nconformance-interfaces-sched_setparam-25-2.test\nconformance-interfaces-sched_setscheduler-17-2.test\nconformance-interfaces-sched_setscheduler-17-3.test\nconformance-interfaces-sched_setscheduler-17-4.test\nconformance-interfaces-sched_setscheduler-19-2.test\nconformance-interfaces-sched_setscheduler-19-3.test\nconformance-interfaces-sched_setscheduler-19-4.test\nconformance-definitions-mqueue_h-10-1.test\nconformance-definitions-mqueue_h-11-1.test\nconformance-definitions-mqueue_h-1-1.test\nconformance-definitions-mqueue_h-2-1.test\nconformance-definitions-mqueue_h-3-1.test\nconformance-definitions-mqueue_h-4-1.test\nconformance-definitions-mqueue_h-5-1.test\nconformance-definitions-mqueue_h-6-1.test\nconformance-definitions-mqueue_h-7-1.test\nconformance-definitions-mqueue_h-8-1.test\nconformance-definitions-mqueue_h-9-1.test\nconformance-interfaces-clock_settime-1-1.test\nconformance-interfaces-clock_settime-19-1.test\nconformance-interfaces-clock_settime-7-1.test\nconformance-interfaces-clock_settime-7-2.test\nconformance-interfaces-clock_settime-8-1.test\nconformance-interfaces-mq_close-5-1.test\nconformance-interfaces-mq_open-10-1.test\nconformance-interfaces-mq_open-14-1.test\nconformance-interfaces-mq_open-17-1.test\nconformance-interfaces-mq_open-22-1.test\nconformance-interfaces-mq_open-24-1.test\nconformance-interfaces-mq_open-25-1.test\nconformance-interfaces-mq_open-28-1.test\nconformance-interfaces-mq_open-30-1.test\nconformance-interfaces-mq_open-4-1.test\nconformance-interfaces-mq_send-6-1.test\nconformance-interfaces-mq_timedsend-17-1.test\nconformance-interfaces-mq_timedsend-6-1.test\nconformance-interfaces-mq_unlink-2-3.test\nconformance-interfaces-pthread_attr_setscope-5-1.test\nconformance-interfaces-sched_getscheduler-2-1.test\nconformance-interfaces-sched_setparam-12-1.test\nconformance-interfaces-sched_setparam-13-1.test\nconformance-interfaces-sched_setparam-14-1.test\nconformance-interfaces-sched_setparam-15-1.test\nconformance-interfaces-sched_setparam-16-1.test\nconformance-interfaces-sched_setparam-17-1.test\nconformance-interfaces-sched_setparam-18-1.test\nconformance-interfaces-sched_setparam-19-1.test\nconformance-interfaces-sched_setparam-3-1.test\nconformance-interfaces-sched_setparam-6-1.test\nconformance-interfaces-sched_setparam-7-1.test\nconformance-interfaces-sched_setparam-8-1.test\nconformance-interfaces-sched_setscheduler-10-1.test\nconformance-interfaces-sched_setscheduler-11-1.test\nconformance-interfaces-sched_setscheduler-12-1.test\nconformance-interfaces-sched_setscheduler-13-1.test\nconformance-interfaces-sched_setscheduler-14-1.test\nconformance-interfaces-sched_setscheduler-2-1.test\nconformance-interfaces-sched_setscheduler-5-1.test\nconformance-interfaces-sched_setscheduler-6-1.test\nconformance-interfaces-sched_setscheduler-7-1.test\nconformance-interfaces-sched_setscheduler-9-1.test\nconformance-interfaces-shm_open-10-1.test\nconformance-interfaces-shm_open-12-1.test\nconformance-interfaces-shm_open-19-1.test\nconformance-interfaces-shm_open-2-1.test\nconformance-interfaces-shm_open-24-1.test\nconformance-interfaces-shm_open-27-1.test\nconformance-interfaces-shm_open-29-1.test\nconformance-interfaces-shm_open-3-1.test\nconformance-interfaces-shm_open-36-1.test\nconformance-interfaces-shm_open-42-1.test\nconformance-interfaces-shm_open-6-1.test\nconformance-interfaces-shm_open-7-1.test\nconformance-interfaces-shm_open-9-1.test\nconformance-interfaces-timer_getoverrun-3-1.test\nsrc-conformance-interfaces-shm_open-10-1.test\nsrc-conformance-interfaces-shm_open-12-1.test\nsrc-conformance-interfaces-shm_open-19-1.test\nsrc-conformance-interfaces-shm_open-24-1.test\nsrc-conformance-interfaces-shm_open-29-1.test\nsrc-conformance-interfaces-shm_open-6-1.test\n\n# These use signals and will fail on x86-64\nconformance-interfaces-sigaction-8-1.test\nconformance-interfaces-sigaction-8-10.test\nconformance-interfaces-sigaction-8-11.test\nconformance-interfaces-sigaction-8-12.test\nconformance-interfaces-sigaction-8-13.test\nconformance-interfaces-sigaction-8-14.test\nconformance-interfaces-sigaction-8-15.test\nconformance-interfaces-sigaction-8-16.test\nconformance-interfaces-sigaction-8-17.test\nconformance-interfaces-sigaction-8-18.test\nconformance-interfaces-sigaction-8-19.test\nconformance-interfaces-sigaction-8-2.test\nconformance-interfaces-sigaction-8-20.test\nconformance-interfaces-sigaction-8-21.test\nconformance-interfaces-sigaction-8-22.test\nconformance-interfaces-sigaction-8-23.test\nconformance-interfaces-sigaction-8-24.test\nconformance-interfaces-sigaction-8-25.test\nconformance-interfaces-sigaction-8-26.test\nconformance-interfaces-sigaction-8-3.test\nconformance-interfaces-sigaction-8-4.test\nconformance-interfaces-sigaction-8-5.test\nconformance-interfaces-sigaction-8-6.test\nconformance-interfaces-sigaction-8-7.test\nconformance-interfaces-sigaction-8-8.test\nconformance-interfaces-sigaction-8-9.test\nconformance-interfaces-sigaction-12-27.test\nconformance-interfaces-sigaction-12-28.test\nconformance-interfaces-sigaction-12-29.test\nconformance-interfaces-sigaction-12-30.test\nconformance-interfaces-sigaction-12-31.test\nconformance-interfaces-sigaction-12-32.test\nconformance-interfaces-sigaction-12-33.test\nconformance-interfaces-sigaction-12-34.test\nconformance-interfaces-sigaction-12-35.test\nconformance-interfaces-sigaction-12-36.test\nconformance-interfaces-sigaction-12-37.test\nconformance-interfaces-sigaction-12-38.test\nconformance-interfaces-sigaction-12-39.test\nconformance-interfaces-sigaction-12-40.test\nconformance-interfaces-sigaction-12-41.test\nconformance-interfaces-sigaction-12-42.test\nconformance-interfaces-sigaction-12-43.test\nconformance-interfaces-sigaction-12-44.test\nconformance-interfaces-sigaction-12-45.test\nconformance-interfaces-sigaction-12-46.test\nconformance-interfaces-sigaction-12-47.test\nconformance-interfaces-sigaction-12-48.test\nconformance-interfaces-sigaction-12-49.test\nconformance-interfaces-sigaction-12-50.test\nconformance-interfaces-sigaction-12-51.test\nconformance-interfaces-sigaction-12-52.test\nconformance-interfaces-sigaction-13-1.test\nconformance-interfaces-sigaction-13-10.test\nconformance-interfaces-sigaction-13-11.test\nconformance-interfaces-sigaction-13-12.test\nconformance-interfaces-sigaction-13-13.test\nconformance-interfaces-sigaction-13-14.test\nconformance-interfaces-sigaction-13-15.test\nconformance-interfaces-sigaction-13-16.test\nconformance-interfaces-sigaction-13-17.test\nconformance-interfaces-sigaction-13-18.test\nconformance-interfaces-sigaction-13-19.test\nconformance-interfaces-sigaction-13-2.test\nconformance-interfaces-sigaction-13-20.test\nconformance-interfaces-sigaction-13-21.test\nconformance-interfaces-sigaction-13-22.test\nconformance-interfaces-sigaction-13-23.test\nconformance-interfaces-sigaction-13-24.test\nconformance-interfaces-sigaction-13-25.test\nconformance-interfaces-sigaction-13-26.test\nconformance-interfaces-sigaction-13-3.test\nconformance-interfaces-sigaction-13-4.test\nconformance-interfaces-sigaction-13-5.test\nconformance-interfaces-sigaction-13-6.test\nconformance-interfaces-sigaction-13-7.test\nconformance-interfaces-sigaction-13-8.test\nconformance-interfaces-sigaction-13-9.test\nconformance-interfaces-sigaltstack-1-1.test\nconformance-interfaces-sigaltstack-6-1.test\nconformance-interfaces-sigaltstack-7-1.test\nconformance-interfaces-sigaltstack-9-1.test\nconformance-interfaces-signal-3-1.test\nconformance-interfaces-sigset-3-1.test\nconformance-interfaces-sigset-4-1.test\nconformance-interfaces-sigset-5-1.test\nconformance-interfaces-raise-10000-1.test\nconformance-interfaces-raise-2-1.test\n\n# Signals change this behaviour\nconformance-interfaces-sigpending-1-1.test\nconformance-interfaces-sigpending-2-1.test\n\n# Both of these pass signals in their handler\n# Since we exit the signal handler our sa_mask changes\n# and we don't currently resolve this\nconformance-interfaces-sigpending-1-2.test\nconformance-interfaces-sigpending-1-3.test\n\n# Causes long timeout with signal change\nconformance-interfaces-mmap-11-2.test\nconformance-interfaces-munmap-1-1.test\nconformance-interfaces-munmap-1-2.test\nconformance-interfaces-kill-1-2.test # uses rt_sigtimedwait\n\n# Unstable tests\nconformance-interfaces-clock_nanosleep-10-1.test # uses sigabort\nconformance-interfaces-clock_nanosleep-9-1.test # uses sigabort\nconformance-interfaces-nanosleep-5-2.test # uses sigabort\nconformance-interfaces-nanosleep-7-1.test # uses sigabort\nconformance-interfaces-nanosleep-7-2.test # uses sigabort\nconformance-interfaces-sigprocmask-6-1.test\n\n# unstable because of threaded unit test running\nconformance-interfaces-mlockall-8-1.test\n\n# Race happy\nconformance-interfaces-nanosleep-1-3.test\nconformance-interfaces-nanosleep-2-1.test\nconformance-interfaces-clock_nanosleep-1-1.test\nconformance-interfaces-clock_nanosleep-1-3.test\nconformance-interfaces-clock_nanosleep-2-2.test\nconformance-interfaces-mmap-13-1.test\nconformance-interfaces-clock_getres-3-1.test\n\n# mmap behaviour has changed versus what this is expecting\n# It is expecting mmap to fail if MAP_PRIVATE nor MAP_SHARED is set\n# Sadly it increments flags until MAP_SHARED_VALIDATE is set which allocates correctly\nconformance-interfaces-mmap-21-1.test\n\n# mmap behaviour has changed versus what this is expecting\n# It wants EOVERFLOW but kernel now returns ENOMEM\nconformance-interfaces-mmap-31-1.test\n\n# Sending signals to the process group causes every test to become flakey\n# Need to run these single threaded or change the program group prior to launch\n# !!! DO NOT REENABLE THESE UNTIL WE HAVE THIS IN PLACE IN CI !!!\nconformance-interfaces-killpg-1-1.test\nconformance-interfaces-killpg-1-2.test\nconformance-interfaces-killpg-2-1.test\nconformance-interfaces-killpg-4-1.test\nconformance-interfaces-killpg-5-1.test\nconformance-interfaces-killpg-6-1.test\nconformance-interfaces-killpg-8-1.test\n\n# This test is flaky\n# It puts the thread to sleep for 1 second and expects to wake up within 10ms of the timer\n# If the kernel is doing other things then this 10ms time is too strict and fails periodically\nconformance-interfaces-sigtimedwait-1-1.test\n\n# We accidentally pass through signals to the guest that shouldn't be\nconformance-interfaces-sigsuspend-1-1.test\n\n# Received signal in handler even though it should be masked\nconformance-interfaces-sigaction-25-1.test\nconformance-interfaces-sigaction-25-2.test\nconformance-interfaces-sigaction-25-3.test\nconformance-interfaces-sigaction-25-4.test\nconformance-interfaces-sigaction-25-5.test\nconformance-interfaces-sigaction-25-6.test\nconformance-interfaces-sigaction-25-7.test\nconformance-interfaces-sigaction-25-8.test\nconformance-interfaces-sigaction-25-9.test\nconformance-interfaces-sigaction-25-10.test\nconformance-interfaces-sigaction-25-11.test\nconformance-interfaces-sigaction-25-12.test\nconformance-interfaces-sigaction-25-13.test\nconformance-interfaces-sigaction-25-14.test\nconformance-interfaces-sigaction-25-15.test\nconformance-interfaces-sigaction-25-16.test\nconformance-interfaces-sigaction-25-17.test\nconformance-interfaces-sigaction-25-18.test\nconformance-interfaces-sigaction-25-19.test\nconformance-interfaces-sigaction-25-20.test\nconformance-interfaces-sigaction-25-21.test\nconformance-interfaces-sigaction-25-22.test\nconformance-interfaces-sigaction-25-23.test\nconformance-interfaces-sigaction-25-24.test\nconformance-interfaces-sigaction-25-25.test\nconformance-interfaces-sigaction-25-26.test\n\n# This test is flakey on the interpreter\nconformance-behavior-WIFEXITED-1-3.test\n"
  },
  {
    "path": "unittests/POSIX/Expected_Output",
    "content": "conformance-behavior-timers-2-1.test 0\nconformance-behavior-WIFEXITED-1-1.test 0\nconformance-behavior-WIFEXITED-1-2.test 0\nconformance-behavior-WIFEXITED-1-3.test 0\nconformance-definitions-errno_h-3-2.test 0\nconformance-definitions-errno_h-4-1.test 0\nconformance-definitions-signal_h-13-1.test 0\nconformance-interfaces-clock-1-1.test 0\nconformance-interfaces-clock-2-1.test 0\nconformance-interfaces-clock_getcpuclockid-1-1.test 0\nconformance-interfaces-clock_getres-1-1.test 0\nconformance-interfaces-clock_getres-3-1.test 0\nconformance-interfaces-clock_getres-5-1.test 0\nconformance-interfaces-clock_getres-6-1.test 0\nconformance-interfaces-clock_getres-6-2.test 0\nconformance-interfaces-clock_getres-7-1.test 0\nconformance-interfaces-clock_getres-8-1.test 0\nconformance-interfaces-clock_gettime-1-1.test 0\nconformance-interfaces-clock_gettime-1-2.test 0\nconformance-interfaces-clock_gettime-2-1.test 0\nconformance-interfaces-clock_gettime-3-1.test 0\nconformance-interfaces-clock_gettime-4-1.test 0\nconformance-interfaces-clock_gettime-7-1.test 0\nconformance-interfaces-clock_gettime-8-1.test 0\nconformance-interfaces-clock_gettime-8-2.test 0\nconformance-interfaces-clock_nanosleep-10-1.test 0\nconformance-interfaces-clock_nanosleep-11-1.test 0\nconformance-interfaces-clock_nanosleep-1-1.test 0\nconformance-interfaces-clock_nanosleep-13-1.test 0\nconformance-interfaces-clock_nanosleep-1-3.test 0\nconformance-interfaces-clock_nanosleep-1-4.test 0\nconformance-interfaces-clock_nanosleep-1-5.test 0\nconformance-interfaces-clock_nanosleep-2-1.test 0\nconformance-interfaces-clock_nanosleep-2-2.test 0\nconformance-interfaces-clock_nanosleep-2-3.test 0\nconformance-interfaces-clock_nanosleep-3-1.test 0\nconformance-interfaces-clock_nanosleep-9-1.test 0\nconformance-interfaces-clock_settime-17-1.test 0\nconformance-interfaces-clock_settime-17-2.test 0\nconformance-interfaces-clock_settime-20-1.test 0\nconformance-interfaces-clock_settime-6-1.test 0\nconformance-interfaces-ctime-1-1.test 0\nconformance-interfaces-difftime-1-1.test 0\nconformance-interfaces-fsync-4-1.test 0\nconformance-interfaces-fsync-5-1.test 0\nconformance-interfaces-fsync-7-1.test 0\nconformance-interfaces-gmtime-1-1.test 0\nconformance-interfaces-gmtime-2-1.test 0\nconformance-interfaces-kill-1-1.test 0\nconformance-interfaces-kill-1-2.test 0\nconformance-interfaces-kill-2-1.test 0\nconformance-interfaces-killpg-1-1.test 0\nconformance-interfaces-killpg-1-2.test 0\nconformance-interfaces-killpg-2-1.test 0\nconformance-interfaces-killpg-4-1.test 0\nconformance-interfaces-killpg-5-1.test 0\nconformance-interfaces-killpg-6-1.test 0\nconformance-interfaces-killpg-8-1.test 0\nconformance-interfaces-localtime-1-1.test 0\nconformance-interfaces-mktime-1-1.test 0\nconformance-interfaces-mlock-10-1.test 0\nconformance-interfaces-mlock-5-1.test 0\nconformance-interfaces-mlock-8-1.test 0\nconformance-interfaces-mlockall-13-1.test 0\nconformance-interfaces-mlockall-13-2.test 0\nconformance-interfaces-mlockall-8-1.test 0\nconformance-interfaces-mmap-10-1.test 0\nconformance-interfaces-mmap-11-1.test 0\nconformance-interfaces-mmap-11-2.test 0\nconformance-interfaces-mmap-1-1.test 0\nconformance-interfaces-mmap-12-1.test 0\nconformance-interfaces-mmap-13-1.test 0\nconformance-interfaces-mmap-14-1.test 0\nconformance-interfaces-mmap-19-1.test 0\nconformance-interfaces-mmap-3-1.test 0\nconformance-interfaces-mmap-5-1.test 0\nconformance-interfaces-mmap-6-1.test 0\nconformance-interfaces-mmap-6-2.test 0\nconformance-interfaces-mmap-6-3.test 0\nconformance-interfaces-mmap-6-4.test 0\nconformance-interfaces-mmap-6-5.test 0\nconformance-interfaces-mmap-6-6.test 0\nconformance-interfaces-mmap-7-1.test 0\nconformance-interfaces-mmap-7-2.test 0\nconformance-interfaces-mmap-9-1.test 0\nconformance-interfaces-munlock-10-1.test 0\nconformance-interfaces-munlock-11-1.test 0\nconformance-interfaces-munlock-7-1.test 0\nconformance-interfaces-munlockall-5-1.test 0\nconformance-interfaces-munmap-1-1.test 0\nconformance-interfaces-munmap-1-2.test 0\nconformance-interfaces-munmap-3-1.test 0\nconformance-interfaces-munmap-4-1.test 0\nconformance-interfaces-munmap-8-1.test 0\nconformance-interfaces-munmap-9-1.test 0\nconformance-interfaces-nanosleep-10000-1.test 0\nconformance-interfaces-nanosleep-1-1.test 0\nconformance-interfaces-nanosleep-1-2.test 0\nconformance-interfaces-nanosleep-1-3.test 0\nconformance-interfaces-nanosleep-2-1.test 0\nconformance-interfaces-nanosleep-3-1.test 0\nconformance-interfaces-nanosleep-3-2.test 0\nconformance-interfaces-nanosleep-5-1.test 0\nconformance-interfaces-nanosleep-5-2.test 0\nconformance-interfaces-nanosleep-6-1.test 0\nconformance-interfaces-nanosleep-7-1.test 0\nconformance-interfaces-nanosleep-7-2.test 0\nconformance-interfaces-pthread_atfork-1-1.test 0\nconformance-interfaces-pthread_atfork-2-1.test 0\nconformance-interfaces-pthread_attr_destroy-2-1.test 0\nconformance-interfaces-pthread_attr_destroy-3-1.test 0\nconformance-interfaces-pthread_attr_getdetachstate-1-1.test 0\nconformance-interfaces-pthread_attr_getdetachstate-1-2.test 0\nconformance-interfaces-pthread_attr_getinheritsched-1-1.test 0\nconformance-interfaces-pthread_attr_init-1-1.test 0\nconformance-interfaces-pthread_attr_init-4-1.test 0\nconformance-interfaces-pthread_attr_setdetachstate-1-1.test 0\nconformance-interfaces-pthread_attr_setdetachstate-1-2.test 0\nconformance-interfaces-pthread_attr_setdetachstate-4-1.test 0\nconformance-interfaces-pthread_attr_setinheritsched-1-1.test 0\nconformance-interfaces-pthread_attr_setinheritsched-4-1.test 0\nconformance-interfaces-pthread_attr_setschedparam-speculative-3-1.test 0\nconformance-interfaces-pthread_attr_setschedparam-speculative-3-2.test 0\nconformance-interfaces-pthread_condattr_destroy-1-1.test 0\nconformance-interfaces-pthread_condattr_destroy-2-1.test 0\nconformance-interfaces-pthread_condattr_destroy-3-1.test 0\nconformance-interfaces-pthread_condattr_init-3-1.test 0\nconformance-interfaces-pthread_cond_destroy-1-1.test 0\nconformance-interfaces-pthread_cond_destroy-3-1.test 0\nconformance-interfaces-pthread_cond_init-1-1.test 0\nconformance-interfaces-pthread_cond_init-2-1.test 0\nconformance-interfaces-pthread_cond_init-3-1.test 0\nconformance-interfaces-pthread_mutex_destroy-2-1.test 0\nconformance-interfaces-pthread_mutex_destroy-3-1.test 0\nconformance-interfaces-pthread_mutex_destroy-5-1.test 0\nconformance-interfaces-pthread_mutex_destroy-speculative-4-2.test 0\nconformance-interfaces-pthread_mutex_init-2-1.test 0\nconformance-interfaces-pthread_mutex_init-3-1.test 0\nconformance-interfaces-pthread_mutex_lock-2-1.test 0\nconformance-interfaces-pthread_mutex_unlock-3-1.test 0\nconformance-interfaces-raise-10000-1.test 0\nconformance-interfaces-raise-1-1.test 0\nconformance-interfaces-raise-1-2.test 0\nconformance-interfaces-raise-2-1.test 0\nconformance-interfaces-raise-4-1.test 0\nconformance-interfaces-raise-6-1.test 0\nconformance-interfaces-raise-7-1.test 0\nconformance-interfaces-sched_getparam-1-1.test 0\nconformance-interfaces-sched_getparam-2-1.test 0\nconformance-interfaces-sched_getparam-3-1.test 0\nconformance-interfaces-sched_getparam-4-1.test 0\nconformance-interfaces-sched_getparam-speculative-7-1.test 0\nconformance-interfaces-sched_get_priority_max-1-1.test 0\nconformance-interfaces-sched_get_priority_max-1-2.test 0\nconformance-interfaces-sched_get_priority_max-1-4.test 0\nconformance-interfaces-sched_get_priority_max-2-1.test 0\nconformance-interfaces-sched_get_priority_min-1-1.test 0\nconformance-interfaces-sched_get_priority_min-1-2.test 0\nconformance-interfaces-sched_get_priority_min-1-4.test 0\nconformance-interfaces-sched_get_priority_min-2-1.test 0\nconformance-interfaces-sched_getscheduler-1-1.test 0\nconformance-interfaces-sched_getscheduler-3-1.test 0\nconformance-interfaces-sched_getscheduler-4-1.test 0\nconformance-interfaces-sched_getscheduler-5-1.test 0\nconformance-interfaces-sched_rr_get_interval-1-1.test 0\nconformance-interfaces-sched_rr_get_interval-2-1.test 0\nconformance-interfaces-sched_rr_get_interval-3-1.test 0\nconformance-interfaces-sched_rr_get_interval-speculative-5-1.test 0\nconformance-interfaces-sched_setparam-1-1.test 0\nconformance-interfaces-sched_setparam-22-1.test 0\nconformance-interfaces-sched_setparam-23-1.test 0\nconformance-interfaces-sched_setparam-23-7.test 0\nconformance-interfaces-sched_setparam-25-1.test 0\nconformance-interfaces-sched_setparam-26-1.test 0\nconformance-interfaces-sched_setparam-27-1.test 0\nconformance-interfaces-sched_setparam-5-1.test 0\nconformance-interfaces-sched_setscheduler-17-1.test 0\nconformance-interfaces-sched_setscheduler-17-6.test 0\nconformance-interfaces-sched_setscheduler-17-7.test 0\nconformance-interfaces-sched_setscheduler-19-1.test 0\nconformance-interfaces-sched_setscheduler-19-5.test 0\nconformance-interfaces-sched_setscheduler-20-1.test 0\nconformance-interfaces-sched_setscheduler-21-1.test 0\nconformance-interfaces-sched_yield-2-1.test 0\nconformance-interfaces-sem_init-6-1.test 0\nconformance-interfaces-sem_open-5-1.test 0\nconformance-interfaces-sigaction-1-10.test 0\nconformance-interfaces-sigaction-1-11.test 0\nconformance-interfaces-sigaction-1-12.test 0\nconformance-interfaces-sigaction-1-13.test 0\nconformance-interfaces-sigaction-1-14.test 0\nconformance-interfaces-sigaction-1-15.test 0\nconformance-interfaces-sigaction-1-16.test 0\nconformance-interfaces-sigaction-1-17.test 0\nconformance-interfaces-sigaction-1-18.test 0\nconformance-interfaces-sigaction-1-19.test 0\nconformance-interfaces-sigaction-1-1.test 0\nconformance-interfaces-sigaction-1-20.test 0\nconformance-interfaces-sigaction-12-10.test 0\nconformance-interfaces-sigaction-12-11.test 0\nconformance-interfaces-sigaction-12-12.test 0\nconformance-interfaces-sigaction-12-13.test 0\nconformance-interfaces-sigaction-12-14.test 0\nconformance-interfaces-sigaction-12-15.test 0\nconformance-interfaces-sigaction-12-16.test 0\nconformance-interfaces-sigaction-12-17.test 0\nconformance-interfaces-sigaction-12-18.test 0\nconformance-interfaces-sigaction-12-19.test 0\nconformance-interfaces-sigaction-1-21.test 0\nconformance-interfaces-sigaction-12-1.test 0\nconformance-interfaces-sigaction-12-20.test 0\nconformance-interfaces-sigaction-12-21.test 0\nconformance-interfaces-sigaction-12-22.test 0\nconformance-interfaces-sigaction-12-23.test 0\nconformance-interfaces-sigaction-12-24.test 0\nconformance-interfaces-sigaction-12-25.test 0\nconformance-interfaces-sigaction-12-26.test 0\nconformance-interfaces-sigaction-12-27.test 0\nconformance-interfaces-sigaction-12-28.test 0\nconformance-interfaces-sigaction-12-29.test 0\nconformance-interfaces-sigaction-1-22.test 0\nconformance-interfaces-sigaction-12-2.test 0\nconformance-interfaces-sigaction-12-30.test 0\nconformance-interfaces-sigaction-12-31.test 0\nconformance-interfaces-sigaction-12-32.test 0\nconformance-interfaces-sigaction-12-33.test 0\nconformance-interfaces-sigaction-12-34.test 0\nconformance-interfaces-sigaction-12-35.test 0\nconformance-interfaces-sigaction-12-36.test 0\nconformance-interfaces-sigaction-12-37.test 0\nconformance-interfaces-sigaction-12-38.test 0\nconformance-interfaces-sigaction-12-39.test 0\nconformance-interfaces-sigaction-1-23.test 0\nconformance-interfaces-sigaction-12-3.test 0\nconformance-interfaces-sigaction-12-40.test 0\nconformance-interfaces-sigaction-12-41.test 0\nconformance-interfaces-sigaction-12-42.test 0\nconformance-interfaces-sigaction-12-43.test 0\nconformance-interfaces-sigaction-12-44.test 0\nconformance-interfaces-sigaction-12-45.test 0\nconformance-interfaces-sigaction-12-46.test 0\nconformance-interfaces-sigaction-12-47.test 0\nconformance-interfaces-sigaction-12-48.test 0\nconformance-interfaces-sigaction-12-49.test 0\nconformance-interfaces-sigaction-1-24.test 0\nconformance-interfaces-sigaction-12-4.test 0\nconformance-interfaces-sigaction-12-50.test 0\nconformance-interfaces-sigaction-12-51.test 0\nconformance-interfaces-sigaction-12-52.test 0\nconformance-interfaces-sigaction-1-25.test 0\nconformance-interfaces-sigaction-12-5.test 0\nconformance-interfaces-sigaction-1-26.test 0\nconformance-interfaces-sigaction-12-6.test 0\nconformance-interfaces-sigaction-12-7.test 0\nconformance-interfaces-sigaction-12-8.test 0\nconformance-interfaces-sigaction-12-9.test 0\nconformance-interfaces-sigaction-1-2.test 0\nconformance-interfaces-sigaction-13-10.test 0\nconformance-interfaces-sigaction-13-11.test 0\nconformance-interfaces-sigaction-13-12.test 0\nconformance-interfaces-sigaction-13-13.test 0\nconformance-interfaces-sigaction-13-14.test 0\nconformance-interfaces-sigaction-13-15.test 0\nconformance-interfaces-sigaction-13-16.test 0\nconformance-interfaces-sigaction-13-17.test 0\nconformance-interfaces-sigaction-13-18.test 0\nconformance-interfaces-sigaction-13-19.test 0\nconformance-interfaces-sigaction-13-1.test 0\nconformance-interfaces-sigaction-13-20.test 0\nconformance-interfaces-sigaction-13-21.test 0\nconformance-interfaces-sigaction-13-22.test 0\nconformance-interfaces-sigaction-13-23.test 0\nconformance-interfaces-sigaction-13-24.test 0\nconformance-interfaces-sigaction-13-25.test 0\nconformance-interfaces-sigaction-13-26.test 0\nconformance-interfaces-sigaction-13-2.test 0\nconformance-interfaces-sigaction-13-3.test 0\nconformance-interfaces-sigaction-13-4.test 0\nconformance-interfaces-sigaction-13-5.test 0\nconformance-interfaces-sigaction-13-6.test 0\nconformance-interfaces-sigaction-13-7.test 0\nconformance-interfaces-sigaction-13-8.test 0\nconformance-interfaces-sigaction-13-9.test 0\nconformance-interfaces-sigaction-1-3.test 0\nconformance-interfaces-sigaction-1-4.test 0\nconformance-interfaces-sigaction-1-5.test 0\nconformance-interfaces-sigaction-1-6.test 0\nconformance-interfaces-sigaction-17-10.test 0\nconformance-interfaces-sigaction-17-11.test 0\nconformance-interfaces-sigaction-17-12.test 0\nconformance-interfaces-sigaction-17-13.test 0\nconformance-interfaces-sigaction-17-14.test 0\nconformance-interfaces-sigaction-17-15.test 0\nconformance-interfaces-sigaction-17-16.test 0\nconformance-interfaces-sigaction-17-17.test 0\nconformance-interfaces-sigaction-17-18.test 0\nconformance-interfaces-sigaction-17-19.test 0\nconformance-interfaces-sigaction-17-1.test 0\nconformance-interfaces-sigaction-17-20.test 0\nconformance-interfaces-sigaction-17-21.test 0\nconformance-interfaces-sigaction-17-22.test 0\nconformance-interfaces-sigaction-17-23.test 0\nconformance-interfaces-sigaction-17-24.test 0\nconformance-interfaces-sigaction-17-25.test 0\nconformance-interfaces-sigaction-17-26.test 0\nconformance-interfaces-sigaction-17-2.test 0\nconformance-interfaces-sigaction-17-3.test 0\nconformance-interfaces-sigaction-17-4.test 0\nconformance-interfaces-sigaction-17-5.test 0\nconformance-interfaces-sigaction-17-6.test 0\nconformance-interfaces-sigaction-17-7.test 0\nconformance-interfaces-sigaction-17-8.test 0\nconformance-interfaces-sigaction-17-9.test 0\nconformance-interfaces-sigaction-1-7.test 0\nconformance-interfaces-sigaction-1-8.test 0\nconformance-interfaces-sigaction-1-9.test 0\nconformance-interfaces-sigaction-2-10.test 0\nconformance-interfaces-sigaction-2-11.test 0\nconformance-interfaces-sigaction-21-1.test 0\nconformance-interfaces-sigaction-2-12.test 0\nconformance-interfaces-sigaction-2-13.test 0\nconformance-interfaces-sigaction-2-14.test 0\nconformance-interfaces-sigaction-2-15.test 0\nconformance-interfaces-sigaction-2-16.test 0\nconformance-interfaces-sigaction-2-17.test 0\nconformance-interfaces-sigaction-2-18.test 0\nconformance-interfaces-sigaction-2-19.test 0\nconformance-interfaces-sigaction-2-1.test 0\nconformance-interfaces-sigaction-2-20.test 0\nconformance-interfaces-sigaction-22-10.test 0\nconformance-interfaces-sigaction-22-11.test 0\nconformance-interfaces-sigaction-22-12.test 0\nconformance-interfaces-sigaction-22-13.test 0\nconformance-interfaces-sigaction-22-14.test 0\nconformance-interfaces-sigaction-22-15.test 0\nconformance-interfaces-sigaction-22-16.test 0\nconformance-interfaces-sigaction-22-17.test 0\nconformance-interfaces-sigaction-22-18.test 0\nconformance-interfaces-sigaction-22-19.test 0\nconformance-interfaces-sigaction-2-21.test 0\nconformance-interfaces-sigaction-22-1.test 0\nconformance-interfaces-sigaction-22-20.test 0\nconformance-interfaces-sigaction-22-21.test 0\nconformance-interfaces-sigaction-22-22.test 0\nconformance-interfaces-sigaction-22-23.test 0\nconformance-interfaces-sigaction-22-24.test 0\nconformance-interfaces-sigaction-22-25.test 0\nconformance-interfaces-sigaction-22-26.test 0\nconformance-interfaces-sigaction-2-22.test 0\nconformance-interfaces-sigaction-22-2.test 0\nconformance-interfaces-sigaction-2-23.test 0\nconformance-interfaces-sigaction-22-3.test 0\nconformance-interfaces-sigaction-2-24.test 0\nconformance-interfaces-sigaction-22-4.test 0\nconformance-interfaces-sigaction-2-25.test 0\nconformance-interfaces-sigaction-22-5.test 0\nconformance-interfaces-sigaction-2-26.test 0\nconformance-interfaces-sigaction-22-6.test 0\nconformance-interfaces-sigaction-22-7.test 0\nconformance-interfaces-sigaction-22-8.test 0\nconformance-interfaces-sigaction-22-9.test 0\nconformance-interfaces-sigaction-2-2.test 0\nconformance-interfaces-sigaction-2-3.test 0\nconformance-interfaces-sigaction-2-4.test 0\nconformance-interfaces-sigaction-25-10.test 0\nconformance-interfaces-sigaction-25-11.test 0\nconformance-interfaces-sigaction-25-12.test 0\nconformance-interfaces-sigaction-25-13.test 0\nconformance-interfaces-sigaction-25-14.test 0\nconformance-interfaces-sigaction-25-15.test 0\nconformance-interfaces-sigaction-25-16.test 0\nconformance-interfaces-sigaction-25-17.test 0\nconformance-interfaces-sigaction-25-18.test 0\nconformance-interfaces-sigaction-25-19.test 0\nconformance-interfaces-sigaction-25-1.test 0\nconformance-interfaces-sigaction-25-20.test 0\nconformance-interfaces-sigaction-25-21.test 0\nconformance-interfaces-sigaction-25-22.test 0\nconformance-interfaces-sigaction-25-23.test 0\nconformance-interfaces-sigaction-25-24.test 0\nconformance-interfaces-sigaction-25-25.test 0\nconformance-interfaces-sigaction-25-26.test 0\nconformance-interfaces-sigaction-25-2.test 0\nconformance-interfaces-sigaction-25-3.test 0\nconformance-interfaces-sigaction-25-4.test 0\nconformance-interfaces-sigaction-25-5.test 0\nconformance-interfaces-sigaction-25-6.test 0\nconformance-interfaces-sigaction-25-7.test 0\nconformance-interfaces-sigaction-25-8.test 0\nconformance-interfaces-sigaction-25-9.test 0\nconformance-interfaces-sigaction-2-5.test 0\nconformance-interfaces-sigaction-2-6.test 0\nconformance-interfaces-sigaction-2-7.test 0\nconformance-interfaces-sigaction-2-8.test 0\nconformance-interfaces-sigaction-2-9.test 0\nconformance-interfaces-sigaction-3-10.test 0\nconformance-interfaces-sigaction-3-11.test 0\nconformance-interfaces-sigaction-3-12.test 0\nconformance-interfaces-sigaction-3-13.test 0\nconformance-interfaces-sigaction-3-14.test 0\nconformance-interfaces-sigaction-3-15.test 0\nconformance-interfaces-sigaction-3-16.test 0\nconformance-interfaces-sigaction-3-17.test 0\nconformance-interfaces-sigaction-3-18.test 0\nconformance-interfaces-sigaction-3-19.test 0\nconformance-interfaces-sigaction-3-1.test 0\nconformance-interfaces-sigaction-3-20.test 0\nconformance-interfaces-sigaction-3-21.test 0\nconformance-interfaces-sigaction-3-22.test 0\nconformance-interfaces-sigaction-3-23.test 0\nconformance-interfaces-sigaction-3-24.test 0\nconformance-interfaces-sigaction-3-25.test 0\nconformance-interfaces-sigaction-3-26.test 0\nconformance-interfaces-sigaction-3-2.test 0\nconformance-interfaces-sigaction-3-3.test 0\nconformance-interfaces-sigaction-3-4.test 0\nconformance-interfaces-sigaction-3-5.test 0\nconformance-interfaces-sigaction-3-6.test 0\nconformance-interfaces-sigaction-3-7.test 0\nconformance-interfaces-sigaction-3-8.test 0\nconformance-interfaces-sigaction-3-9.test 0\nconformance-interfaces-sigaction-4-100.test 0\nconformance-interfaces-sigaction-4-101.test 0\nconformance-interfaces-sigaction-4-102.test 0\nconformance-interfaces-sigaction-4-103.test 0\nconformance-interfaces-sigaction-4-104.test 0\nconformance-interfaces-sigaction-4-10.test 0\nconformance-interfaces-sigaction-4-11.test 0\nconformance-interfaces-sigaction-4-12.test 0\nconformance-interfaces-sigaction-4-13.test 0\nconformance-interfaces-sigaction-4-14.test 0\nconformance-interfaces-sigaction-4-15.test 0\nconformance-interfaces-sigaction-4-16.test 0\nconformance-interfaces-sigaction-4-17.test 0\nconformance-interfaces-sigaction-4-18.test 0\nconformance-interfaces-sigaction-4-19.test 0\nconformance-interfaces-sigaction-4-1.test 0\nconformance-interfaces-sigaction-4-20.test 0\nconformance-interfaces-sigaction-4-21.test 0\nconformance-interfaces-sigaction-4-22.test 0\nconformance-interfaces-sigaction-4-23.test 0\nconformance-interfaces-sigaction-4-24.test 0\nconformance-interfaces-sigaction-4-25.test 0\nconformance-interfaces-sigaction-4-26.test 0\nconformance-interfaces-sigaction-4-27.test 0\nconformance-interfaces-sigaction-4-28.test 0\nconformance-interfaces-sigaction-4-29.test 0\nconformance-interfaces-sigaction-4-2.test 0\nconformance-interfaces-sigaction-4-30.test 0\nconformance-interfaces-sigaction-4-31.test 0\nconformance-interfaces-sigaction-4-32.test 0\nconformance-interfaces-sigaction-4-33.test 0\nconformance-interfaces-sigaction-4-34.test 0\nconformance-interfaces-sigaction-4-35.test 0\nconformance-interfaces-sigaction-4-36.test 0\nconformance-interfaces-sigaction-4-37.test 0\nconformance-interfaces-sigaction-4-38.test 0\nconformance-interfaces-sigaction-4-39.test 0\nconformance-interfaces-sigaction-4-3.test 0\nconformance-interfaces-sigaction-4-40.test 0\nconformance-interfaces-sigaction-4-41.test 0\nconformance-interfaces-sigaction-4-42.test 0\nconformance-interfaces-sigaction-4-43.test 0\nconformance-interfaces-sigaction-4-44.test 0\nconformance-interfaces-sigaction-4-45.test 0\nconformance-interfaces-sigaction-4-46.test 0\nconformance-interfaces-sigaction-4-47.test 0\nconformance-interfaces-sigaction-4-48.test 0\nconformance-interfaces-sigaction-4-49.test 0\nconformance-interfaces-sigaction-4-4.test 0\nconformance-interfaces-sigaction-4-50.test 0\nconformance-interfaces-sigaction-4-51.test 0\nconformance-interfaces-sigaction-4-52.test 0\nconformance-interfaces-sigaction-4-53.test 0\nconformance-interfaces-sigaction-4-54.test 0\nconformance-interfaces-sigaction-4-55.test 0\nconformance-interfaces-sigaction-4-56.test 0\nconformance-interfaces-sigaction-4-57.test 0\nconformance-interfaces-sigaction-4-58.test 0\nconformance-interfaces-sigaction-4-59.test 0\nconformance-interfaces-sigaction-4-5.test 0\nconformance-interfaces-sigaction-4-60.test 0\nconformance-interfaces-sigaction-4-61.test 0\nconformance-interfaces-sigaction-4-62.test 0\nconformance-interfaces-sigaction-4-63.test 0\nconformance-interfaces-sigaction-4-64.test 0\nconformance-interfaces-sigaction-4-65.test 0\nconformance-interfaces-sigaction-4-66.test 0\nconformance-interfaces-sigaction-4-67.test 0\nconformance-interfaces-sigaction-4-68.test 0\nconformance-interfaces-sigaction-4-69.test 0\nconformance-interfaces-sigaction-4-6.test 0\nconformance-interfaces-sigaction-4-70.test 0\nconformance-interfaces-sigaction-4-71.test 0\nconformance-interfaces-sigaction-4-72.test 0\nconformance-interfaces-sigaction-4-73.test 0\nconformance-interfaces-sigaction-4-74.test 0\nconformance-interfaces-sigaction-4-75.test 0\nconformance-interfaces-sigaction-4-76.test 0\nconformance-interfaces-sigaction-4-77.test 0\nconformance-interfaces-sigaction-4-78.test 0\nconformance-interfaces-sigaction-4-79.test 0\nconformance-interfaces-sigaction-4-7.test 0\nconformance-interfaces-sigaction-4-80.test 0\nconformance-interfaces-sigaction-4-81.test 0\nconformance-interfaces-sigaction-4-82.test 0\nconformance-interfaces-sigaction-4-83.test 0\nconformance-interfaces-sigaction-4-84.test 0\nconformance-interfaces-sigaction-4-85.test 0\nconformance-interfaces-sigaction-4-86.test 0\nconformance-interfaces-sigaction-4-87.test 0\nconformance-interfaces-sigaction-4-88.test 0\nconformance-interfaces-sigaction-4-89.test 0\nconformance-interfaces-sigaction-4-8.test 0\nconformance-interfaces-sigaction-4-90.test 0\nconformance-interfaces-sigaction-4-91.test 0\nconformance-interfaces-sigaction-4-92.test 0\nconformance-interfaces-sigaction-4-93.test 0\nconformance-interfaces-sigaction-4-94.test 0\nconformance-interfaces-sigaction-4-95.test 0\nconformance-interfaces-sigaction-4-96.test 0\nconformance-interfaces-sigaction-4-97.test 0\nconformance-interfaces-sigaction-4-98.test 0\nconformance-interfaces-sigaction-4-99.test 0\nconformance-interfaces-sigaction-4-9.test 0\nconformance-interfaces-sigaction-6-10.test 0\nconformance-interfaces-sigaction-6-11.test 0\nconformance-interfaces-sigaction-6-12.test 0\nconformance-interfaces-sigaction-6-13.test 0\nconformance-interfaces-sigaction-6-14.test 0\nconformance-interfaces-sigaction-6-15.test 0\nconformance-interfaces-sigaction-6-16.test 0\nconformance-interfaces-sigaction-6-17.test 0\nconformance-interfaces-sigaction-6-18.test 0\nconformance-interfaces-sigaction-6-19.test 0\nconformance-interfaces-sigaction-6-1.test 0\nconformance-interfaces-sigaction-6-20.test 0\nconformance-interfaces-sigaction-6-21.test 0\nconformance-interfaces-sigaction-6-22.test 0\nconformance-interfaces-sigaction-6-23.test 0\nconformance-interfaces-sigaction-6-24.test 0\nconformance-interfaces-sigaction-6-25.test 0\nconformance-interfaces-sigaction-6-26.test 0\nconformance-interfaces-sigaction-6-2.test 0\nconformance-interfaces-sigaction-6-3.test 0\nconformance-interfaces-sigaction-6-4.test 0\nconformance-interfaces-sigaction-6-5.test 0\nconformance-interfaces-sigaction-6-6.test 0\nconformance-interfaces-sigaction-6-7.test 0\nconformance-interfaces-sigaction-6-8.test 0\nconformance-interfaces-sigaction-6-9.test 0\nconformance-interfaces-sigaction-8-10.test 0\nconformance-interfaces-sigaction-8-11.test 0\nconformance-interfaces-sigaction-8-12.test 0\nconformance-interfaces-sigaction-8-13.test 0\nconformance-interfaces-sigaction-8-14.test 0\nconformance-interfaces-sigaction-8-15.test 0\nconformance-interfaces-sigaction-8-16.test 0\nconformance-interfaces-sigaction-8-17.test 0\nconformance-interfaces-sigaction-8-18.test 0\nconformance-interfaces-sigaction-8-19.test 0\nconformance-interfaces-sigaction-8-1.test 0\nconformance-interfaces-sigaction-8-20.test 0\nconformance-interfaces-sigaction-8-21.test 0\nconformance-interfaces-sigaction-8-22.test 0\nconformance-interfaces-sigaction-8-23.test 0\nconformance-interfaces-sigaction-8-24.test 0\nconformance-interfaces-sigaction-8-25.test 0\nconformance-interfaces-sigaction-8-26.test 0\nconformance-interfaces-sigaction-8-2.test 0\nconformance-interfaces-sigaction-8-3.test 0\nconformance-interfaces-sigaction-8-4.test 0\nconformance-interfaces-sigaction-8-5.test 0\nconformance-interfaces-sigaction-8-6.test 0\nconformance-interfaces-sigaction-8-7.test 0\nconformance-interfaces-sigaction-8-8.test 0\nconformance-interfaces-sigaction-8-9.test 0\nconformance-interfaces-sigaddset-1-3.test 0\nconformance-interfaces-sigaddset-2-1.test 0\nconformance-interfaces-sigaltstack-10-1.test 0\nconformance-interfaces-sigaltstack-11-1.test 0\nconformance-interfaces-sigaltstack-1-1.test 0\nconformance-interfaces-sigaltstack-12-1.test 0\nconformance-interfaces-sigaltstack-2-1.test 0\nconformance-interfaces-sigaltstack-3-1.test 0\nconformance-interfaces-sigaltstack-5-1.test 0\nconformance-interfaces-sigaltstack-6-1.test 0\nconformance-interfaces-sigaltstack-7-1.test 0\nconformance-interfaces-sigaltstack-8-1.test 0\nconformance-interfaces-sigaltstack-9-1.test 0\nconformance-interfaces-sigaltstack-9-buildonly.test 0\nconformance-interfaces-sigdelset-1-3.test 0\nconformance-interfaces-sigdelset-1-4.test 0\nconformance-interfaces-sigdelset-2-1.test 0\nconformance-interfaces-sigemptyset-1-1.test 0\nconformance-interfaces-sigemptyset-2-1.test 0\nconformance-interfaces-sigfillset-1-1.test 0\nconformance-interfaces-sigfillset-2-1.test 0\nconformance-interfaces-sighold-1-1.test 0\nconformance-interfaces-sighold-2-1.test 0\nconformance-interfaces-sigignore-1-1.test 0\nconformance-interfaces-sigignore-4-1.test 0\nconformance-interfaces-sigignore-6-1.test 0\nconformance-interfaces-sigignore-6-2.test 0\nconformance-interfaces-sigismember-3-1.test 0\nconformance-interfaces-sigismember-4-1.test 0\nconformance-interfaces-signal-1-1.test 0\nconformance-interfaces-signal-2-1.test 0\nconformance-interfaces-signal-3-1.test 0\nconformance-interfaces-signal-5-1.test 0\nconformance-interfaces-signal-6-1.test 0\nconformance-interfaces-signal-7-1.test 0\nconformance-interfaces-sigpause-4-1.test 0\nconformance-interfaces-sigpending-1-1.test 0\nconformance-interfaces-sigpending-1-2.test 0\nconformance-interfaces-sigpending-1-3.test 0\nconformance-interfaces-sigpending-2-1.test 0\nconformance-interfaces-sigprocmask-10-1.test 0\nconformance-interfaces-sigprocmask-12-1.test 0\nconformance-interfaces-sigprocmask-15-1.test 0\nconformance-interfaces-sigprocmask-4-1.test 0\nconformance-interfaces-sigprocmask-5-1.test 0\nconformance-interfaces-sigprocmask-6-1.test 0\nconformance-interfaces-sigprocmask-7-1.test 0\nconformance-interfaces-sigprocmask-8-1.test 0\nconformance-interfaces-sigprocmask-8-2.test 0\nconformance-interfaces-sigprocmask-8-3.test 0\nconformance-interfaces-sigprocmask-9-1.test 0\nconformance-interfaces-sigqueue-10-1.test 0\nconformance-interfaces-sigqueue-11-1.test 0\nconformance-interfaces-sigqueue-1-1.test 0\nconformance-interfaces-sigqueue-12-1.test 0\nconformance-interfaces-sigqueue-2-1.test 0\nconformance-interfaces-sigqueue-2-2.test 0\nconformance-interfaces-sigqueue-3-1.test 0\nconformance-interfaces-sigqueue-4-1.test 0\nconformance-interfaces-sigqueue-5-1.test 0\nconformance-interfaces-sigqueue-6-1.test 0\nconformance-interfaces-sigqueue-7-1.test 0\nconformance-interfaces-sigqueue-8-1.test 0\nconformance-interfaces-sigrelse-1-1.test 0\nconformance-interfaces-sigrelse-2-1.test 0\nconformance-interfaces-sigset-10-1.test 0\nconformance-interfaces-sigset-1-1.test 0\nconformance-interfaces-sigset-2-1.test 0\nconformance-interfaces-sigset-3-1.test 0\nconformance-interfaces-sigset-4-1.test 0\nconformance-interfaces-sigset-5-1.test 0\nconformance-interfaces-sigset-9-1.test 0\nconformance-interfaces-sigsuspend-1-1.test 0\nconformance-interfaces-sigsuspend-3-1.test 0\nconformance-interfaces-sigsuspend-4-1.test 0\nconformance-interfaces-sigsuspend-6-1.test 0\nconformance-interfaces-sigtimedwait-1-1.test 0\nconformance-interfaces-sigtimedwait-2-1.test 0\nconformance-interfaces-sigtimedwait-4-1.test 0\nconformance-interfaces-sigtimedwait-5-1.test 0\nconformance-interfaces-sigtimedwait-6-1.test 0\nconformance-interfaces-sigwait-1-1.test 0\nconformance-interfaces-sigwait-2-1.test 0\nconformance-interfaces-sigwait-3-1.test 0\nconformance-interfaces-sigwait-4-1.test 0\nconformance-interfaces-sigwait-8-1.test 0\nconformance-interfaces-sigwaitinfo-1-1.test 0\nconformance-interfaces-sigwaitinfo-2-1.test 0\nconformance-interfaces-sigwaitinfo-3-1.test 0\nconformance-interfaces-sigwaitinfo-5-1.test 0\nconformance-interfaces-sigwaitinfo-6-1.test 0\nconformance-interfaces-sigwaitinfo-7-1.test 0\nconformance-interfaces-sigwaitinfo-8-1.test 0\nconformance-interfaces-sigwaitinfo-9-1.test 0\nconformance-interfaces-strftime-2-1.test 0\nconformance-interfaces-strftime-3-1.test 0\nconformance-interfaces-time-1-1.test 0\nconformance-interfaces-timer_create-speculative-15-1.test 0"
  },
  {
    "path": "unittests/POSIX/Flake_Tests",
    "content": "# CPU scheduling can cause these tests to take > 10ms for their error margin.\nconformance-interfaces-sigtimedwait-1-1.test\nconformance-interfaces-sigtimedwait-2-1.test\n"
  },
  {
    "path": "unittests/POSIX/Known_Failures",
    "content": "# these are disabled\n# These tests are inconsistent\nconformance-interfaces-mmap-12-1.test\nconformance-interfaces-mmap-6-1.test\nconformance-interfaces-mmap-6-2.test\nconformance-interfaces-mmap-6-3.test\n\n# These tests take too long to run, and might timeout\nconformance-interfaces-clock-1-1.test\nconformance-interfaces-clock_gettime-4-1.test\nconformance-interfaces-clock_getcpuclockid-1-1.test\n\n# These tests fail when run natively on x86-64 host\nconformance-interfaces-clock_getcpuclockid-2-1.test\nconformance-interfaces-mlock-speculative-12-1.test\nconformance-interfaces-mmap-11-4.test\nconformance-interfaces-mmap-23-1.test\nconformance-interfaces-pthread_attr_getschedpolicy-2-1.test\nconformance-interfaces-pthread_attr_getscope-1-1.test\nconformance-interfaces-pthread_attr_setschedpolicy-4-1.test\nconformance-interfaces-pthread_attr_setscope-4-1.test\nconformance-interfaces-sched_getparam-6-1.test\nconformance-interfaces-sched_getscheduler-7-1.test\nconformance-interfaces-sigset-8-1.test\nconformance-interfaces-strftime-1-1.test\nsrc-conformance-interfaces-pthread_attr_getschedpolicy-2-1.test\nconformance-interfaces-munmap-2-1.test\nconformance-interfaces-mlockall-3-7.test\nconformance-interfaces-mlockall-speculative-15-1.test\nconformance-interfaces-pthread_attr_getschedparam-1-1.test\nconformance-interfaces-pthread_attr_setschedpolicy-speculative-5-1.test\nconformance-interfaces-sched_setparam-10-1.test\nconformance-interfaces-sched_setparam-23-6.test\nconformance-interfaces-sched_setparam-9-1.test\nconformance-interfaces-sched_setscheduler-1-1.test\nconformance-interfaces-sched_setscheduler-16-1.test\nconformance-interfaces-sched_setscheduler-17-5.test\nconformance-interfaces-sched_setscheduler-4-1.test\nconformance-interfaces-sigaddset-1-core-buildonly.test\nconformance-interfaces-sigaddset-4-core-buildonly.test\nconformance-interfaces-sigdelset-1-core-buildonly.test\nconformance-interfaces-sigdelset-4-core-buildonly.test\nconformance-interfaces-sighold-3-core-buildonly.test\nconformance-interfaces-sigignore-5-core-buildonly.test\nconformance-interfaces-sigismember-5-core-buildonly.test\nconformance-interfaces-sigqueue-9-1.test\nconformance-interfaces-sigrelse-3-core-buildonly.test\nconformance-interfaces-sigset-6-1.test\nconformance-interfaces-sigset-7-1.test\nconformance-interfaces-aio_cancel-10-1.test\nconformance-interfaces-aio_cancel-1-1.test\nconformance-interfaces-aio_cancel-2-1.test\nconformance-interfaces-aio_cancel-2-2.test\nconformance-interfaces-aio_cancel-4-1.test\nconformance-interfaces-aio_cancel-5-1.test\nconformance-interfaces-aio_cancel-6-1.test\nconformance-interfaces-aio_cancel-7-1.test\nconformance-interfaces-aio_cancel-8-1.test\nconformance-interfaces-aio_cancel-9-1.test\nconformance-interfaces-aio_error-1-1.test\nconformance-interfaces-aio_error-2-1.test\nconformance-interfaces-aio_error-3-1.test\nconformance-interfaces-aio_fsync-12-1.test\nconformance-interfaces-aio_fsync-14-1.test\nconformance-interfaces-aio_fsync-2-1.test\nconformance-interfaces-aio_fsync-3-1.test\nconformance-interfaces-aio_fsync-4-1.test\nconformance-interfaces-aio_fsync-4-2.test\nconformance-interfaces-aio_fsync-5-1.test\nconformance-interfaces-aio_fsync-8-1.test\nconformance-interfaces-aio_fsync-8-2.test\nconformance-interfaces-aio_fsync-8-3.test\nconformance-interfaces-aio_fsync-8-4.test\nconformance-interfaces-aio_fsync-9-1.test\nconformance-interfaces-aio_read-10-1.test\nconformance-interfaces-aio_read-11-1.test\nconformance-interfaces-aio_read-11-2.test\nconformance-interfaces-aio_read-2-1.test\nconformance-interfaces-aio_read-3-1.test\nconformance-interfaces-aio_read-3-2.test\nconformance-interfaces-aio_read-4-1.test\nconformance-interfaces-aio_read-5-1.test\nconformance-interfaces-aio_read-7-1.test\nconformance-interfaces-aio_read-8-1.test\nconformance-interfaces-aio_return-1-1.test\nconformance-interfaces-aio_return-3-1.test\nconformance-interfaces-aio_return-3-2.test\nconformance-interfaces-aio_suspend-3-1.test\nconformance-interfaces-aio_suspend-5-1.test\nconformance-interfaces-aio_write-1-1.test\nconformance-interfaces-aio_write-1-2.test\nconformance-interfaces-aio_write-2-1.test\nconformance-interfaces-aio_write-3-1.test\nconformance-interfaces-aio_write-5-1.test\nconformance-interfaces-aio_write-6-1.test\nconformance-interfaces-aio_write-8-1.test\nconformance-interfaces-aio_write-8-2.test\nconformance-interfaces-aio_write-9-1.test\nconformance-interfaces-aio_write-9-2.test\nconformance-interfaces-lio_listio-5-1.test\nconformance-interfaces-lio_listio-6-1.test\nconformance-interfaces-lio_listio-8-1.test\nconformance-interfaces-lio_listio-9-1.test\nconformance-interfaces-pthread_mutex_init-speculative-5-2.test\nconformance-interfaces-sched_get_priority_max-1-3.test\nconformance-interfaces-sched_get_priority_min-1-3.test\nconformance-interfaces-sched_setparam-23-2.test\nconformance-interfaces-sched_setparam-23-3.test\nconformance-interfaces-sched_setparam-23-4.test\nconformance-interfaces-sched_setparam-23-5.test\nconformance-interfaces-sched_setparam-25-2.test\nconformance-interfaces-sched_setscheduler-17-2.test\nconformance-interfaces-sched_setscheduler-17-3.test\nconformance-interfaces-sched_setscheduler-17-4.test\nconformance-interfaces-sched_setscheduler-19-2.test\nconformance-interfaces-sched_setscheduler-19-3.test\nconformance-interfaces-sched_setscheduler-19-4.test\nconformance-definitions-mqueue_h-10-1.test\nconformance-definitions-mqueue_h-11-1.test\nconformance-definitions-mqueue_h-1-1.test\nconformance-definitions-mqueue_h-2-1.test\nconformance-definitions-mqueue_h-3-1.test\nconformance-definitions-mqueue_h-4-1.test\nconformance-definitions-mqueue_h-5-1.test\nconformance-definitions-mqueue_h-6-1.test\nconformance-definitions-mqueue_h-7-1.test\nconformance-definitions-mqueue_h-8-1.test\nconformance-definitions-mqueue_h-9-1.test\nconformance-interfaces-clock_settime-1-1.test\nconformance-interfaces-clock_settime-19-1.test\nconformance-interfaces-clock_settime-7-1.test\nconformance-interfaces-clock_settime-7-2.test\nconformance-interfaces-clock_settime-8-1.test\nconformance-interfaces-mq_close-5-1.test\nconformance-interfaces-mq_open-10-1.test\nconformance-interfaces-mq_open-14-1.test\nconformance-interfaces-mq_open-17-1.test\nconformance-interfaces-mq_open-22-1.test\nconformance-interfaces-mq_open-24-1.test\nconformance-interfaces-mq_open-25-1.test\nconformance-interfaces-mq_open-28-1.test\nconformance-interfaces-mq_open-30-1.test\nconformance-interfaces-mq_open-4-1.test\nconformance-interfaces-mq_send-6-1.test\nconformance-interfaces-mq_timedsend-17-1.test\nconformance-interfaces-mq_timedsend-6-1.test\nconformance-interfaces-mq_unlink-2-3.test\nconformance-interfaces-pthread_attr_setscope-5-1.test\nconformance-interfaces-sched_getscheduler-2-1.test\nconformance-interfaces-sched_setparam-12-1.test\nconformance-interfaces-sched_setparam-13-1.test\nconformance-interfaces-sched_setparam-14-1.test\nconformance-interfaces-sched_setparam-15-1.test\nconformance-interfaces-sched_setparam-16-1.test\nconformance-interfaces-sched_setparam-17-1.test\nconformance-interfaces-sched_setparam-18-1.test\nconformance-interfaces-sched_setparam-19-1.test\nconformance-interfaces-sched_setparam-3-1.test\nconformance-interfaces-sched_setparam-6-1.test\nconformance-interfaces-sched_setparam-7-1.test\nconformance-interfaces-sched_setparam-8-1.test\nconformance-interfaces-sched_setscheduler-10-1.test\nconformance-interfaces-sched_setscheduler-11-1.test\nconformance-interfaces-sched_setscheduler-12-1.test\nconformance-interfaces-sched_setscheduler-13-1.test\nconformance-interfaces-sched_setscheduler-14-1.test\nconformance-interfaces-sched_setscheduler-2-1.test\nconformance-interfaces-sched_setscheduler-5-1.test\nconformance-interfaces-sched_setscheduler-6-1.test\nconformance-interfaces-sched_setscheduler-7-1.test\nconformance-interfaces-sched_setscheduler-9-1.test\nconformance-interfaces-shm_open-10-1.test\nconformance-interfaces-shm_open-12-1.test\nconformance-interfaces-shm_open-19-1.test\nconformance-interfaces-shm_open-2-1.test\nconformance-interfaces-shm_open-24-1.test\nconformance-interfaces-shm_open-27-1.test\nconformance-interfaces-shm_open-29-1.test\nconformance-interfaces-shm_open-3-1.test\nconformance-interfaces-shm_open-36-1.test\nconformance-interfaces-shm_open-42-1.test\nconformance-interfaces-shm_open-6-1.test\nconformance-interfaces-shm_open-7-1.test\nconformance-interfaces-shm_open-9-1.test\nconformance-interfaces-timer_getoverrun-3-1.test\nsrc-conformance-interfaces-shm_open-10-1.test\nsrc-conformance-interfaces-shm_open-12-1.test\nsrc-conformance-interfaces-shm_open-19-1.test\nsrc-conformance-interfaces-shm_open-24-1.test\nsrc-conformance-interfaces-shm_open-29-1.test\nsrc-conformance-interfaces-shm_open-6-1.test\n\n# These use signals and will fail on x86-64\nconformance-interfaces-sigaction-8-1.test\nconformance-interfaces-sigaction-8-10.test\nconformance-interfaces-sigaction-8-11.test\nconformance-interfaces-sigaction-8-12.test\nconformance-interfaces-sigaction-8-13.test\nconformance-interfaces-sigaction-8-14.test\nconformance-interfaces-sigaction-8-15.test\nconformance-interfaces-sigaction-8-16.test\nconformance-interfaces-sigaction-8-17.test\nconformance-interfaces-sigaction-8-18.test\nconformance-interfaces-sigaction-8-19.test\nconformance-interfaces-sigaction-8-2.test\nconformance-interfaces-sigaction-8-20.test\nconformance-interfaces-sigaction-8-21.test\nconformance-interfaces-sigaction-8-22.test\nconformance-interfaces-sigaction-8-23.test\nconformance-interfaces-sigaction-8-24.test\nconformance-interfaces-sigaction-8-25.test\nconformance-interfaces-sigaction-8-26.test\nconformance-interfaces-sigaction-8-3.test\nconformance-interfaces-sigaction-8-4.test\nconformance-interfaces-sigaction-8-5.test\nconformance-interfaces-sigaction-8-6.test\nconformance-interfaces-sigaction-8-7.test\nconformance-interfaces-sigaction-8-8.test\nconformance-interfaces-sigaction-8-9.test\nconformance-interfaces-sigaction-12-27.test\nconformance-interfaces-sigaction-12-28.test\nconformance-interfaces-sigaction-12-29.test\nconformance-interfaces-sigaction-12-30.test\nconformance-interfaces-sigaction-12-31.test\nconformance-interfaces-sigaction-12-32.test\nconformance-interfaces-sigaction-12-33.test\nconformance-interfaces-sigaction-12-34.test\nconformance-interfaces-sigaction-12-35.test\nconformance-interfaces-sigaction-12-36.test\nconformance-interfaces-sigaction-12-37.test\nconformance-interfaces-sigaction-12-38.test\nconformance-interfaces-sigaction-12-39.test\nconformance-interfaces-sigaction-12-40.test\nconformance-interfaces-sigaction-12-41.test\nconformance-interfaces-sigaction-12-42.test\nconformance-interfaces-sigaction-12-43.test\nconformance-interfaces-sigaction-12-44.test\nconformance-interfaces-sigaction-12-45.test\nconformance-interfaces-sigaction-12-46.test\nconformance-interfaces-sigaction-12-47.test\nconformance-interfaces-sigaction-12-48.test\nconformance-interfaces-sigaction-12-49.test\nconformance-interfaces-sigaction-12-50.test\nconformance-interfaces-sigaction-12-51.test\nconformance-interfaces-sigaction-12-52.test\nconformance-interfaces-sigaction-13-1.test\nconformance-interfaces-sigaction-13-10.test\nconformance-interfaces-sigaction-13-11.test\nconformance-interfaces-sigaction-13-12.test\nconformance-interfaces-sigaction-13-13.test\nconformance-interfaces-sigaction-13-14.test\nconformance-interfaces-sigaction-13-15.test\nconformance-interfaces-sigaction-13-16.test\nconformance-interfaces-sigaction-13-17.test\nconformance-interfaces-sigaction-13-18.test\nconformance-interfaces-sigaction-13-19.test\nconformance-interfaces-sigaction-13-2.test\nconformance-interfaces-sigaction-13-20.test\nconformance-interfaces-sigaction-13-21.test\nconformance-interfaces-sigaction-13-22.test\nconformance-interfaces-sigaction-13-23.test\nconformance-interfaces-sigaction-13-24.test\nconformance-interfaces-sigaction-13-25.test\nconformance-interfaces-sigaction-13-26.test\nconformance-interfaces-sigaction-13-3.test\nconformance-interfaces-sigaction-13-4.test\nconformance-interfaces-sigaction-13-5.test\nconformance-interfaces-sigaction-13-6.test\nconformance-interfaces-sigaction-13-7.test\nconformance-interfaces-sigaction-13-8.test\nconformance-interfaces-sigaction-13-9.test\nconformance-interfaces-sigaltstack-1-1.test\nconformance-interfaces-sigaltstack-6-1.test\nconformance-interfaces-sigaltstack-7-1.test\nconformance-interfaces-sigaltstack-9-1.test\nconformance-interfaces-signal-3-1.test\nconformance-interfaces-sigset-3-1.test\nconformance-interfaces-sigset-4-1.test\nconformance-interfaces-sigset-5-1.test\nconformance-interfaces-raise-10000-1.test\nconformance-interfaces-raise-2-1.test\n\n# Signals change this behaviour\nconformance-interfaces-sigpending-1-1.test\nconformance-interfaces-sigpending-2-1.test\n\n# Both of these pass signals in their handler\n# Since we exit the signal handler our sa_mask changes\n# and we don't currently resolve this\nconformance-interfaces-sigpending-1-2.test\nconformance-interfaces-sigpending-1-3.test\n\n# Causes long timeout with signal change\nconformance-interfaces-mmap-11-2.test\nconformance-interfaces-munmap-1-1.test\nconformance-interfaces-munmap-1-2.test\n\nconformance-interfaces-killpg-1-2.test # uses rt_sigsuspend\nconformance-interfaces-kill-1-2.test # uses rt_sigtimedwait\n\n# Unstable tests\nconformance-interfaces-clock_nanosleep-10-1.test # uses sigabort\nconformance-interfaces-clock_nanosleep-9-1.test # uses sigabort\nconformance-interfaces-nanosleep-5-2.test # uses sigabort\nconformance-interfaces-nanosleep-7-1.test # uses sigabort\nconformance-interfaces-nanosleep-7-2.test # uses sigabort\nconformance-interfaces-sigprocmask-6-1.test\n\n# unstable because of threaded unit test running\nconformance-interfaces-mlockall-8-1.test\n\n# Race happy\nconformance-interfaces-nanosleep-1-3.test\nconformance-interfaces-clock_nanosleep-1-3.test\nconformance-interfaces-clock_nanosleep-2-2.test\n\n# these are inconsistent or fail on CI\nconformance-interfaces-clock_nanosleep-2-1.test\nconformance-interfaces-difftime-1-1.test\nconformance-interfaces-nanosleep-2-1.test\nconformance-interfaces-mmap-13-1.test\nconformance-interfaces-clock_getres-3-1.test\nconformance-interfaces-clock_nanosleep-1-1.test\nconformance-interfaces-clock_nanosleep-1-1.test\n\n# mmap behaviour has changed versus what this is expecting\n# It is expecting mmap to fail if MAP_PRIVATE nor MAP_SHARED is set\n# Sadly it increments flags until MAP_SHARED_VALIDATE is set which allocates correctly\nconformance-interfaces-mmap-21-1.test\n\n# mmap behaviour has changed versus what this is expecting\n# It wants EOVERFLOW but kernel now returns ENOMEM\nconformance-interfaces-mmap-31-1.test\n\n# Sending signals to the process group causes every test to become flakey\n# Need to run these single threaded or change the program group prior to launch\n# !!! DO NOT REENABLE THESE UNTIL WE HAVE THIS IN PLACE IN CI !!!\nconformance-interfaces-killpg-1-1.test\nconformance-interfaces-killpg-1-2.test\nconformance-interfaces-killpg-2-1.test\nconformance-interfaces-killpg-4-1.test\nconformance-interfaces-killpg-5-1.test\nconformance-interfaces-killpg-6-1.test\nconformance-interfaces-killpg-8-1.test\n\n# This test is flaky\n# It puts the thread to sleep for 1 second and expects to wake up within 10ms of the timer\n# If the kernel is doing other things then this 10ms time is too strict and fails periodically\nconformance-interfaces-sigtimedwait-1-1.test\n\n# This test relies on old Linux behaviour\n# This is setting a \"invalid\" flag that it expects the kernel to return EINVAL on\n# Sadly since this test is so old it happens to set SS_ONSTACK which is a no-op on\n# newer kernels. So this is expected to fail.\nconformance-interfaces-sigaltstack-11-1.test\n\n# This test fails since FEX doesn't fully support SS_DISABLE\nconformance-interfaces-sigaltstack-2-1.test\n\n# We accidentally pass through signals to the guest that shouldn't be\nconformance-interfaces-sigsuspend-1-1.test\n\n# Received signal in handler even though it should be masked\nconformance-interfaces-sigaction-25-1.test\nconformance-interfaces-sigaction-25-2.test\nconformance-interfaces-sigaction-25-3.test\nconformance-interfaces-sigaction-25-4.test\nconformance-interfaces-sigaction-25-5.test\nconformance-interfaces-sigaction-25-6.test\nconformance-interfaces-sigaction-25-7.test\nconformance-interfaces-sigaction-25-8.test\nconformance-interfaces-sigaction-25-9.test\nconformance-interfaces-sigaction-25-10.test\nconformance-interfaces-sigaction-25-11.test\nconformance-interfaces-sigaction-25-12.test\nconformance-interfaces-sigaction-25-13.test\nconformance-interfaces-sigaction-25-14.test\nconformance-interfaces-sigaction-25-15.test\nconformance-interfaces-sigaction-25-16.test\nconformance-interfaces-sigaction-25-17.test\nconformance-interfaces-sigaction-25-18.test\nconformance-interfaces-sigaction-25-19.test\nconformance-interfaces-sigaction-25-20.test\nconformance-interfaces-sigaction-25-21.test\nconformance-interfaces-sigaction-25-22.test\nconformance-interfaces-sigaction-25-23.test\nconformance-interfaces-sigaction-25-24.test\nconformance-interfaces-sigaction-25-25.test\nconformance-interfaces-sigaction-25-26.test\n\n# This test is flakey on the interpreter\nconformance-behavior-WIFEXITED-1-3.test\n"
  },
  {
    "path": "unittests/Readme.md",
    "content": "# FEX Unit tests\n\nFEX has its own test suite for x86-64 emulation, and we also use gcc's target tests, posixtest, and gvisor's tests. We use a combination of CMake/CTest and python runner scripts.\n\nWe also regularly run and pass qemu's and valgrind's tests for validation, but those aren't in CI right now.\n\n## x86/64 testing\n- A lot of handwritten assembly unit tests in [32Bit_ASM](32Bit_ASM) and [ASM](ASM) folders, run via our TestHarnessHelper\n- A few handwritten IR tests in [IR](IR), run via our IRLoader\n- gcc-target-tests-32 and gcc-target-tests-64, run via FEX. The tests binaries are in [External/fex-gcc-target-tests-bins](../External/fex-gcc-target-tests-bins)\n\n\n## Syscall testing\n- 64-bit posixtest from http://posixtest.sourceforge.net/, run via FEX. The tests binaries are in [External/fex-posixtest-bins](../External/fex-posixtest-bins)\n- 64-bit gvisor tests from https://github.com/google/gvisor, run via FEX. The tests binaries are in [External/fex-gvisor-tests-bins](../External/fex-gvisor-tests-bins)\n\n"
  },
  {
    "path": "unittests/ThunkFunctionalTests/CMakeLists.txt",
    "content": "set(FUNCTIONAL_DEPENDS \"\")\n\nfunction(AddThunksTest Bin ThunksFile)\n  if (NOT ThunksFile)\n    set(TEST_NAME ThunkFunctionalTest-NoThunks-${Bin})\n  else()\n    set(TEST_NAME ThunkFunctionalTest-Thunks-${Bin})\n  endif()\n\n  add_test(NAME ${TEST_NAME}\n    COMMAND \"$<TARGET_FILE:FEX>\"\n    ${Bin})\n    set_property(TEST ${TEST_NAME} APPEND PROPERTY DEPENDS \"${Bin}\")\n    set_property(TEST \"${TEST_NAME}\" APPEND PROPERTY ENVIRONMENT\n      \"FEX_OUTPUTLOG=stderr;FEX_SILENTLOG=0;FEX_MAXINST=500;FEX_THUNKHOSTLIBS=${HOSTLIBS_DATA_DIRECTORY}/HostThunks;FEX_THUNKGUESTLIBS=${CMAKE_INSTALL_PREFIX}/share/fex-emu/GuestThunks\")\n\n    if (ThunksFile)\n      set_property(TEST \"${TEST_NAME}\" APPEND PROPERTY ENVIRONMENT \"FEX_THUNKCONFIG=${CMAKE_SOURCE_DIR}/Data/CI/${ThunksFile}\")\n    endif()\n  list(APPEND FUNCTIONAL_DEPENDS \"${TEST_NAME}\")\nendfunction()\n\nfunction(AddTest Bin ThunksFile)\n  AddThunksTest(\"${Bin}\" \"\")\n  AddThunksTest(\"${Bin}\" \"${ThunksFile}\")\nendfunction()\n\nAddTest(\"/usr/bin/glxinfo\" \"GLThunks.json\")\nAddTest(\"/usr/bin/vulkaninfo\" \"VulkanThunks.json\")\n\nadd_custom_target(thunk_functional_tests_nothunks\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"302\" ${TEST_JOB_FLAG} \"-R\" \"ThunkFunctionalTest-NoThunks-\\.*\"\n  DEPENDS \"${FUNCTIONAL_DEPENDS}\")\n\nadd_custom_target(thunk_functional_tests_thunks\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"302\" ${TEST_JOB_FLAG} \"-R\" \"ThunkFunctionalTest-Thunks-\\.*\"\n  DEPENDS \"${FUNCTIONAL_DEPENDS}\")\n\nadd_custom_target(thunk_functional_tests\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"302\" ${TEST_JOB_FLAG} \"-R\" \"ThunkFunctionalTest\\.*\"\n  DEPENDS \"${FUNCTIONAL_DEPENDS}\")\n"
  },
  {
    "path": "unittests/ThunkLibs/CMakeLists.txt",
    "content": "add_executable(thunkgentest generator.cpp abi.cpp)\ntarget_link_libraries(thunkgentest PRIVATE Catch2::Catch2WithMain)\ntarget_link_libraries(thunkgentest PRIVATE fmt::fmt)\ntarget_link_libraries(thunkgentest PRIVATE thunkgenlib)\ncatch_discover_tests(thunkgentest TEST_SUFFIX \".ThunkGen\")\n\nadd_custom_target(thunkgen_tests\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"302\" ${TEST_JOB_FLAG} \"-R\" \"\\.*.ThunkGen\")\nadd_dependencies(thunkgen_tests thunkgentest)\n"
  },
  {
    "path": "unittests/ThunkLibs/abi.cpp",
    "content": "#include <clang/Frontend/CompilerInstance.h>\n#include <catch2/catch_all.hpp>\n\n#include <data_layout.h>\n#include <interface.h>\n#include \"common.h\"\n\n#include <fmt/format.h>\n\n#include <string_view>\n\nusing Catch::Matchers::ContainsSubstring;\n\n// run_tool will leak memory when the ToolAction throws an exception, so\n// disable AddressSanitizer's leak detection\nconst char* __asan_default_options() {\n  return \"detect_leaks=0\";\n}\n\ninline std::ostream& operator<<(std::ostream& os, TypeCompatibility compat) {\n  if (compat == TypeCompatibility::Full) {\n    os << \"Compatible\";\n  } else if (compat == TypeCompatibility::Repackable) {\n    os << \"Repackable\";\n  } else if (compat == TypeCompatibility::None) {\n    os << \"Incompatible\";\n  } else {\n    os << \"(INVALID)\";\n  }\n  return os;\n}\n\nclass DataLayoutCompareActionForTest;\n\nnamespace {\n\nstruct Fixture {\n  /**\n   * Parses annotations from the input source and generates data layout descriptions from it.\n   *\n   * Input code with common definitions (types, functions, ...) should be specified in \"prelude\".\n   * It will be prepended to \"code\" before processing and also to the generator output.\n   */\n  std::unique_ptr<DataLayoutCompareActionForTest> compute_data_layout(std::string_view prelude, std::string_view code, GuestABI);\n};\n\n} // namespace\n\nclass DataLayoutCompareActionForTest : public DataLayoutCompareAction {\n  std::unordered_map<const clang::Type*, TypeCompatibility> type_compat_cache;\n\n  // Persistent reference taken to enable accessing the ASTContext after CompilerInstance::ExecuteAction returns\n  llvm::IntrusiveRefCntPtr<clang::ASTContext> ast_context;\n  std::shared_ptr<clang::Preprocessor> preprocessor;\n\npublic:\n  DataLayoutCompareActionForTest(std::unique_ptr<ABI> guest_layout)\n    : DataLayoutCompareAction(*guest_layout)\n    , guest_layout(std::move(guest_layout)) {}\n\n  void ExecuteAction() override {\n    AnalysisAction::ExecuteAction();\n\n    ast_context = &getCompilerInstance().getASTContext();\n    preprocessor = getCompilerInstance().getPreprocessorPtr();\n    host_layout = ComputeDataLayout(*ast_context, types);\n  }\n\n  std::unique_ptr<ABI> guest_layout;\n  std::unordered_map<const clang::Type*, TypeInfo> host_layout;\n\n  TypeCompatibility GetTypeCompatibility(std::string_view type_name) {\n    for (const auto& [type, _] : host_layout) {\n      if (clang::QualType {type, 0}.getAsString() == type_name) {\n        return DataLayoutCompareAction::GetTypeCompatibility(*ast_context, type, host_layout, type_compat_cache);\n      }\n    }\n\n    throw std::runtime_error(\"No data layout information recorded for type \\\"\" + std::string {type_name} + \"\\\"\");\n  }\n};\n\n/**\n * Same as clang::FrontendActionFactory but takes an external FrontendAction\n * reference instead of constructing an internal one. Since the FrontendAction\n * lifetime may extend past this ToolAction, state captured by the\n * FrontendAction can be accessed after the ToolAction returns.\n */\nclass ThunkTestToolAction : public clang::tooling::ToolAction {\npublic:\n  clang::FrontendAction& ScopedToolAction;\n\npublic:\n  ThunkTestToolAction(clang::FrontendAction& action)\n    : ScopedToolAction(action) {}\n  ~ThunkTestToolAction() = default;\n\n  // Same as FrontendActionFactory but keeps ScopedToolAction alive when returning\n  bool runInvocation(std::shared_ptr<clang::CompilerInvocation> invocation, clang::FileManager* files,\n                     std::shared_ptr<clang::PCHContainerOperations> pch, clang::DiagnosticConsumer* diag_consumer) override {\n\n#if LLVM_VERSION_MAJOR >= 21\n    auto diagnostics =\n      clang::CompilerInstance::createDiagnostics(files->getVirtualFileSystem(), invocation->getDiagnosticOpts(), diag_consumer, false);\n#elif LLVM_VERSION_MAJOR == 20\n    auto diagnostics =\n      clang::CompilerInstance::createDiagnostics(files->getVirtualFileSystem(), &invocation->getDiagnosticOpts(), diag_consumer, false);\n#else\n    auto diagnostics = clang::CompilerInstance::createDiagnostics(&invocation->getDiagnosticOpts(), diag_consumer, false);\n#endif\n\n#if LLVM_VERSION_MAJOR >= 21\n    clang::CompilerInstance Compiler(std::move(invocation), std::move(pch));\n#else\n    clang::CompilerInstance Compiler(std::move(pch));\n    Compiler.setInvocation(std::move(invocation));\n#endif\n    Compiler.setFileManager(files);\n#if LLVM_VERSION_MAJOR >= 22\n    auto Diags = clang::CompilerInstance::createDiagnostics(Compiler.getVirtualFileSystem(), Compiler.getDiagnosticOpts(), diag_consumer, false);\n    Compiler.setDiagnostics(std::move(Diags));\n#elif LLVM_VERSION_MAJOR >= 20\n    Compiler.createDiagnostics(Compiler.getVirtualFileSystem(), diag_consumer, false);\n#else\n    Compiler.createDiagnostics(diag_consumer, false);\n#endif\n    if (!Compiler.hasDiagnostics()) {\n      return false;\n    }\n\n#if LLVM_VERSION_MAJOR >= 22\n    Compiler.createSourceManager();\n#else\n    Compiler.createSourceManager(*files);\n#endif\n\n    const bool Success = Compiler.ExecuteAction(ScopedToolAction);\n\n    files->clearStatCache();\n    return Success;\n  }\n};\n\nstd::unique_ptr<DataLayoutCompareActionForTest> Fixture::compute_data_layout(std::string_view prelude, std::string_view code, GuestABI guest_abi) {\n  const std::string full_code = std::string {prelude} + std::string {code};\n\n  // Compute guest data layout\n  auto data_layout_analysis_factory = std::make_unique<AnalyzeDataLayoutActionFactory>();\n  run_tool(*data_layout_analysis_factory, full_code, false, guest_abi);\n\n  // Compute host data layout\n  auto ScopedToolAction = std::make_unique<DataLayoutCompareActionForTest>(data_layout_analysis_factory->TakeDataLayout());\n  run_tool(std::make_unique<ThunkTestToolAction>(*ScopedToolAction), full_code, false, std::nullopt);\n\n  return ScopedToolAction;\n}\n\nstatic std::string FormatDataLayout(const std::unordered_map<const clang::Type*, TypeInfo>& layout) {\n  std::string ret;\n\n  for (const auto& [type, info] : layout) {\n    auto basic_info = info.get_if_simple_or_struct();\n    if (!basic_info) {\n      continue;\n    }\n\n    ret += fmt::format(\"  Host entry {}: {} ({})\\n\", clang::QualType {type, 0}.getAsString().c_str(), basic_info->size_bits / 8,\n                       basic_info->alignment_bits / 8);\n\n    if (auto struct_info = info.get_if_struct()) {\n      for (const auto& member : struct_info->members) {\n        ret += fmt::format(\"    Offset {}-{}: {} {}{}\\n\", member.offset_bits / 8, (member.offset_bits + member.size_bits - 1) / 8,\n                           member.type_name.c_str(), member.member_name.c_str(),\n                           member.array_size ? fmt::format(\"[{}]\", member.array_size.value()).c_str() : \"\");\n      }\n    }\n  }\n\n  return ret;\n}\n\nTEST_CASE_METHOD(Fixture, \"DataLayout\") {\n  auto guest_abi = GENERATE(GuestABI::X86_32, GuestABI::X86_64);\n  INFO(guest_abi);\n\n  SECTION(\"Trivial\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\",\n                                      \"struct A { int a; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::Full);\n  }\n\n  SECTION(\"Builtin types\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\",\n                                      \"struct A { char a; short b; int c; float d; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::Full);\n    CHECK(action->GetTypeCompatibility(\"char\") == TypeCompatibility::Full);\n    CHECK(action->GetTypeCompatibility(\"short\") == TypeCompatibility::Full);\n    CHECK(action->GetTypeCompatibility(\"int\") == TypeCompatibility::Full);\n    CHECK(action->GetTypeCompatibility(\"float\") == TypeCompatibility::Full);\n  }\n\n  SECTION(\"Padding after int16_t\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct A { int16_t a; int32_t b; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::Full);\n  }\n\n  SECTION(\"Array of int16_t\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct A { int16_t a[64]; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::Full);\n  }\n\n  const auto compat_full64_repackable32 = (guest_abi == GuestABI::X86_32 ? TypeCompatibility::Repackable : TypeCompatibility::Full);\n\n  SECTION(\"Type with platform-dependent size (size_t)\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdlib>\\n\",\n                                      \"struct A { size_t a; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->GetTypeCompatibility(\"struct A\") == compat_full64_repackable32);\n  }\n\n  SECTION(\"int64_t has stricter alignment requirements on 64-bit platforms\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct A { int64_t a; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->guest_layout->at(\"A\").get_if_struct()->alignment_bits == (guest_abi == GuestABI::X86_32 ? 32 : 64));\n    CHECK(action->GetTypeCompatibility(\"struct A\") == compat_full64_repackable32);\n  }\n\n  SECTION(\"Array of int64_t\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct A { int64_t a[64]; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->GetTypeCompatibility(\"struct A\") == compat_full64_repackable32);\n  }\n\n  SECTION(\"int64_t with explicit alignment specification\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct alignas(8) A { int64_t a; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->guest_layout->at(\"A\").get_if_struct()->alignment_bits == 64);\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::Full);\n  }\n\n  SECTION(\"int64_t alignment requirements propagate to parent struct\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct A { int32_t a; int32_t b; int64_t c; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->guest_layout->at(\"A\").get_if_struct()->alignment_bits == (guest_abi == GuestABI::X86_32 ? 32 : 64));\n    CHECK(action->GetTypeCompatibility(\"struct A\") == compat_full64_repackable32);\n  }\n\n  SECTION(\"Padding before int64_t member\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct A { int32_t a; int64_t b; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->guest_layout->at(\"A\").get_if_struct()->members[1].offset_bits == (guest_abi == GuestABI::X86_32 ? 32 : 64));\n\n    CHECK(action->GetTypeCompatibility(\"struct A\") == compat_full64_repackable32);\n  }\n\n  SECTION(\"Padding at end of struct due to int64_t alignment (like VkMemoryHeap)\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct A { int64_t a; int32_t b; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->guest_layout->at(\"A\").get_if_struct()->size_bits == (guest_abi == GuestABI::X86_32 ? 96 : 128));\n\n    CHECK(action->GetTypeCompatibility(\"struct A\") == compat_full64_repackable32);\n  }\n\n  SECTION(\"Different struct definition between guest and host; different member order\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"#ifdef HOST\\n\"\n                                      \"struct A { int32_t a; int32_t b; };\\n\"\n                                      \"#else\\n\"\n                                      \"struct A { int32_t b; int32_t a; };\\n\"\n                                      \"#endif\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->guest_layout->at(\"A\").get_if_struct()->members.at(0).member_name == \"b\");\n    CHECK(action->guest_layout->at(\"A\").get_if_struct()->members.at(1).member_name == \"a\");\n\n    REQUIRE(!action->host_layout.empty());\n    CHECK(action->host_layout.begin()->second.get_if_struct()->members.at(0).member_name == \"a\");\n    CHECK(action->host_layout.begin()->second.get_if_struct()->members.at(1).member_name == \"b\");\n\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::Repackable);\n  }\n\n  SECTION(\"Different struct definition between guest and host; different member size\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"#ifdef HOST\\n\"\n                                      \"struct A { int32_t a; int32_t b; };\\n\"\n                                      \"#else\\n\"\n                                      \"struct A { int32_t a; int64_t b; };\\n\"\n                                      \"#endif\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->guest_layout->at(\"A\").get_if_struct()->members.at(0).size_bits == 32);\n    CHECK(action->guest_layout->at(\"A\").get_if_struct()->members.at(1).size_bits == 64);\n\n    REQUIRE(!action->host_layout.empty());\n    CHECK(action->host_layout.begin()->second.get_if_struct()->members.at(0).size_bits == 32);\n    CHECK(action->host_layout.begin()->second.get_if_struct()->members.at(1).size_bits == 32);\n\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::Repackable);\n  }\n\n  SECTION(\"Different struct definition between guest and host; completely different members\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"#ifdef HOST\\n\"\n                                      \"struct A { int32_t a; int32_t b; };\\n\"\n                                      \"#else\\n\"\n                                      \"struct A { int32_t c; int32_t d; };\\n\"\n                                      \"#endif\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::None);\n  }\n\n  SECTION(\"Different struct definition between guest and host; member missing from guest\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"#ifdef HOST\\n\"\n                                      \"struct A { int32_t a; int32_t b; };\\n\"\n                                      \"#else\\n\"\n                                      \"struct A { int32_t a; };\\n\"\n                                      \"#endif\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::None);\n  }\n\n  SECTION(\"Different struct definition between guest and host; member missing from host\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"#ifdef HOST\\n\"\n                                      \"struct A { int32_t a; };\\n\"\n                                      \"#else\\n\"\n                                      \"struct A { int32_t a; int32_t b; };\\n\"\n                                      \"#endif\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::None);\n  }\n\n  SECTION(\"Nesting structs of consistent data layout\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct C { int32_t a; int16_t b; };\\n\"\n                                      \"struct B { C a; int16_t b; };\\n\"\n                                      \"struct A { int32_t a; B b; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    REQUIRE(action->guest_layout->contains(\"B\"));\n    REQUIRE(action->guest_layout->contains(\"C\"));\n    CHECK(action->guest_layout->at(\"A\").get_if_struct()->members.at(0).size_bits == 32);\n\n    CHECK(action->GetTypeCompatibility(\"struct C\") == TypeCompatibility::Full);\n    CHECK(action->GetTypeCompatibility(\"struct B\") == TypeCompatibility::Full);\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::Full);\n  }\n\n  SECTION(\"Nesting repackable structs by embedding\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"#ifdef HOST\\n\"\n                                      \"struct C { int32_t a; int32_t b; };\\n\"\n                                      \"#else\\n\"\n                                      \"struct C { int32_t b; int32_t a; };\\n\"\n                                      \"#endif\\n\"\n                                      \"struct B { C a; int16_t b; };\\n\"\n                                      \"struct A { int32_t a; B b; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    REQUIRE(action->guest_layout->contains(\"B\"));\n    REQUIRE(action->guest_layout->contains(\"C\"));\n    CHECK(action->guest_layout->at(\"A\").get_if_struct()->size_bits == 128);\n    CHECK(action->guest_layout->at(\"A\").get_if_struct()->alignment_bits == 32);\n\n    CHECK(action->GetTypeCompatibility(\"struct C\") == TypeCompatibility::Repackable);\n    CHECK(action->GetTypeCompatibility(\"struct B\") == TypeCompatibility::Repackable);\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::Repackable);\n  }\n\n  SECTION(\"Embedded union type (like VkRenderingAttachmentInfo)\") {\n    SECTION(\"without annotation\") {\n      CHECK_THROWS_WITH(compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                            \"#include <cstdint>\\n\",\n                                            \"union B { int32_t a; uint32_t b; };\\n\"\n                                            \"struct A { B a; };\\n\"\n                                            \"template<> struct fex_gen_type<A> {};\\n\",\n                                            guest_abi),\n                        ContainsSubstring(\"unannotated member\") && ContainsSubstring(\"union type\"));\n    }\n\n    SECTION(\"with annotation\") {\n      auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                        \"#include <cstdint>\\n\",\n                                        \"union B { int32_t a; uint32_t b; };\\n\"\n                                        \"struct A { B a; };\\n\"\n                                        \"template<> struct fex_gen_type<B> : fexgen::assume_compatible_data_layout {};\\n\"\n                                        \"template<> struct fex_gen_type<A> {};\\n\",\n                                        guest_abi);\n\n      INFO(FormatDataLayout(action->host_layout));\n\n      REQUIRE(action->guest_layout->contains(\"A\"));\n      CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::Full);\n    }\n  }\n}\n\nTEST_CASE_METHOD(Fixture, \"DataLayoutPointers\") {\n  auto guest_abi = GENERATE(GuestABI::X86_32, GuestABI::X86_64);\n  INFO(guest_abi);\n\n  const auto compat_full64_repackable32 = (guest_abi == GuestABI::X86_32 ? TypeCompatibility::Repackable : TypeCompatibility::Full);\n\n  SECTION(\"Pointer to data with consistent layout\") {\n    std::string type = GENERATE(\"char\", \"short\", \"int\", \"float\", \"struct B { int a; }\");\n    INFO(type);\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct A { \" + type +\n                                        \"* a; };\\n\"\n                                        \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    // The pointer itself needs repacking on 32-bit. On 64-bit, no repacking is needed at all.\n    CHECK(action->GetTypeCompatibility(\"struct A\") == compat_full64_repackable32);\n    if (!type.starts_with(\"struct B\")) {\n      CHECK(action->GetTypeCompatibility(type) == TypeCompatibility::Full);\n    }\n  }\n\n  SECTION(\"Pointer to struct with consistent layout\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct B { int32_t a; };\\n\"\n                                      \"struct A { B* a; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"B\"));\n    CHECK(action->GetTypeCompatibility(\"struct B\") == TypeCompatibility::Full);\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->GetTypeCompatibility(\"struct A\") == compat_full64_repackable32);\n  }\n\n  SECTION(\"Unannotated pointer to incomplete type\") {\n    CHECK_THROWS_WITH(compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                          \"#include <cstdint>\\n\",\n                                          \"struct B;\\n\"\n                                          \"struct A { B* a; };\\n\"\n                                          \"template<> struct fex_gen_type<A> {};\\n\",\n                                          guest_abi),\n                      ContainsSubstring(\"incomplete type\"));\n  }\n\n  SECTION(\"Unannotated pointer to repackable type\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"#ifdef HOST\\n\"\n                                      \"struct B { int32_t a; int32_t b; };\\n\"\n                                      \"#else\\n\"\n                                      \"struct B { int32_t a; int64_t b; };\\n\"\n                                      \"#endif\\n\"\n                                      \"struct A { B* a; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::None);\n  }\n\n  SECTION(\"Nesting repackable structs by pointers\") {\n    SECTION(\"Innermost struct is compatible\") {\n      auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                        \"#include <cstdint>\\n\",\n                                        \"struct C { int32_t a; int32_t b; };\\n\"\n                                        \"struct B { C* a; int16_t b; };\\n\"\n                                        \"struct A { int32_t a; B b; };\\n\"\n                                        \"template<> struct fex_gen_type<A> {};\\n\",\n                                        guest_abi);\n\n      INFO(FormatDataLayout(action->host_layout));\n\n      REQUIRE(action->guest_layout->contains(\"A\"));\n      REQUIRE(action->guest_layout->contains(\"B\"));\n      REQUIRE(action->guest_layout->contains(\"C\"));\n\n      // 64-bit is fully compatible, but 32-bit needs to zero-extend the pointer itself\n      CHECK(action->GetTypeCompatibility(\"struct C\") == TypeCompatibility::Full);\n      CHECK(action->GetTypeCompatibility(\"struct B\") == compat_full64_repackable32);\n      CHECK(action->GetTypeCompatibility(\"struct A\") == compat_full64_repackable32);\n    }\n\n    SECTION(\"Innermost struct is incompatible\") {\n      auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                        \"#include <cstdint>\\n\",\n                                        \"#ifdef HOST\\n\"\n                                        \"struct C { int32_t a; int32_t b; };\\n\"\n                                        \"#else\\n\"\n                                        \"struct C { int32_t b; int32_t a; };\\n\"\n                                        \"#endif\\n\"\n                                        \"struct B { C* a; int16_t b; };\\n\"\n                                        \"struct A { int32_t a; B b; };\\n\"\n                                        \"template<> struct fex_gen_type<A> {};\\n\",\n                                        guest_abi);\n\n      INFO(FormatDataLayout(action->host_layout));\n\n      REQUIRE(action->guest_layout->contains(\"A\"));\n      REQUIRE(action->guest_layout->contains(\"B\"));\n      REQUIRE(action->guest_layout->contains(\"C\"));\n\n      CHECK(action->GetTypeCompatibility(\"struct C\") == TypeCompatibility::Repackable);\n      CHECK(action->GetTypeCompatibility(\"struct B\") == TypeCompatibility::None);\n      CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::None);\n    }\n\n    SECTION(\"Innermost struct is incompatible but the pointer member is annotated\") {\n      auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                        \"#include <cstdint>\\n\",\n                                        \"#ifdef HOST\\n\"\n                                        \"struct C { int32_t a; int32_t b; };\\n\"\n                                        \"#else\\n\"\n                                        \"struct C { int32_t b; int32_t a; };\\n\"\n                                        \"#endif\\n\"\n                                        \"struct B { C* a; int16_t b; };\\n\"\n                                        \"struct A { int32_t a; B b; };\\n\"\n                                        \"template<> struct fex_gen_config<&B::a> : fexgen::custom_repack {};\\n\"\n                                        \"template<> struct fex_gen_type<A> {};\\n\"\n                                        \"template<> struct fex_gen_type<C> {};\\n\",\n                                        guest_abi);\n\n      INFO(FormatDataLayout(action->host_layout));\n\n      REQUIRE(action->guest_layout->contains(\"A\"));\n      REQUIRE(action->guest_layout->contains(\"B\"));\n      REQUIRE(action->guest_layout->contains(\"C\"));\n\n      CHECK(action->GetTypeCompatibility(\"struct C\") == TypeCompatibility::Repackable);\n      CHECK(action->GetTypeCompatibility(\"struct B\") == TypeCompatibility::Repackable);\n      CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::Repackable);\n    }\n  }\n\n  SECTION(\"Unannotated pointer to union type\") {\n    CHECK_THROWS_WITH(compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                          \"#include <cstdint>\\n\",\n                                          \"union B { int32_t a; uint32_t b; };\\n\"\n                                          \"struct A { B* a; };\\n\"\n                                          \"template<> struct fex_gen_type<A> {};\\n\",\n                                          guest_abi),\n                      ContainsSubstring(\"unannotated member\") && ContainsSubstring(\"union type\"));\n  }\n\n  SECTION(\"Pointer to union type with assume_compatible_data_layout annotation\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"union B { int32_t a; uint32_t b; };\\n\"\n                                      \"struct A { B* a; };\\n\"\n                                      \"template<> struct fex_gen_type<B> : fexgen::assume_compatible_data_layout {};\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->GetTypeCompatibility(\"struct A\") == compat_full64_repackable32);\n  }\n\n  SECTION(\"Pointer to union type with custom_repack annotation\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"union B { int32_t a; uint32_t b; };\\n\"\n                                      \"struct A { B* a; };\\n\"\n                                      \"template<> struct fex_gen_config<&A::a> : fexgen::custom_repack {};\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::Repackable);\n  }\n\n  SECTION(\"Pointer to opaque type\") {\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct B;\\n\"\n                                      \"struct A { B* a; };\\n\"\n                                      \"template<> struct fex_gen_type<B> : fexgen::opaque_type {};\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->GetTypeCompatibility(\"struct A\") == compat_full64_repackable32);\n  }\n\n  SECTION(\"Pointer member with custom repacking code\") {\n    // Data layout analysis only needs to know about the custom_repack\n    // annotation. The actual custom repacking code isn't needed for the\n    // test.\n\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"#ifdef HOST\\n\"\n                                      \"struct B { int32_t a; };\\n\"\n                                      \"#else\\n\"\n                                      \"struct B { int32_t b; };\\n\"\n                                      \"#endif\\n\"\n                                      \"struct A { B* a; };\\n\"\n                                      \"template<> struct fex_gen_config<&A::a> : fexgen::custom_repack {};\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\"\n                                      \"template<> struct fex_gen_type<B> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    REQUIRE(action->guest_layout->contains(\"B\"));\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::Repackable);\n    CHECK(action->GetTypeCompatibility(\"struct B\") == TypeCompatibility::None);\n  }\n\n  SECTION(\"Custom repacking induces repacking requirement\") {\n    // Data layout analysis only needs to know about the custom_repack\n    // annotation. The actual custom repacking code isn't needed for the\n    // test.\n\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct B {};\\n\"\n                                      \"struct A { B* a; };\\n\"\n                                      \"template<> struct fex_gen_config<&A::a> : fexgen::custom_repack {};\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\"\n                                      \"template<> struct fex_gen_type<B> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    REQUIRE(action->guest_layout->contains(\"B\"));\n    CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::Repackable);\n    CHECK(action->GetTypeCompatibility(\"struct B\") == TypeCompatibility::Full);\n  }\n\n  SECTION(\"Self-referencing struct (like VkBaseOutStructure)\") {\n    // Without annotation\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct A { A* a; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK_THROWS_WITH(action->GetTypeCompatibility(\"struct A\"), ContainsSubstring(\"recursive reference\"));\n\n    // With annotation\n    if (guest_abi == GuestABI::X86_64) {\n      auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                        \"#include <cstdint>\\n\",\n                                        \"struct A { A* a; };\\n\"\n                                        \"template<> struct fex_gen_type<A> : fexgen::assume_compatible_data_layout {};\\n\",\n                                        guest_abi);\n\n      INFO(FormatDataLayout(action->host_layout));\n\n      REQUIRE(action->guest_layout->contains(\"A\"));\n      CHECK(action->GetTypeCompatibility(\"struct A\") == TypeCompatibility::Full);\n    }\n  }\n\n  SECTION(\"Circularly referencing structs\") {\n    // Without annotation\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct B;\\n\"\n                                      \"struct A { B* a; };\\n\"\n                                      \"struct B { A* a; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    REQUIRE(action->guest_layout->contains(\"B\"));\n    CHECK_THROWS_WITH(action->GetTypeCompatibility(\"struct A\"), ContainsSubstring(\"recursive reference\"));\n    CHECK_THROWS_WITH(action->GetTypeCompatibility(\"struct B\"), ContainsSubstring(\"recursive reference\"));\n\n    // With annotation\n    if (guest_abi == GuestABI::X86_64) {\n      auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                        \"#include <cstdint>\\n\",\n                                        \"struct B;\\n\"\n                                        \"struct A { B* a; };\\n\"\n                                        \"struct B { A* a; };\\n\"\n                                        \"template<> struct fex_gen_type<B> : fexgen::assume_compatible_data_layout {};\\n\",\n                                        guest_abi);\n\n      INFO(FormatDataLayout(action->host_layout));\n\n      REQUIRE(action->guest_layout->contains(\"B\"));\n      CHECK(action->GetTypeCompatibility(\"struct B\") == TypeCompatibility::Full);\n    }\n  }\n\n  SECTION(\"Pointers to void\") {\n    // Without annotation\n    auto action = compute_data_layout(\"#include <thunks_common.h>\\n\"\n                                      \"#include <cstdint>\\n\",\n                                      \"struct A { void* a; };\\n\"\n                                      \"template<> struct fex_gen_type<A> {};\\n\",\n                                      guest_abi);\n\n    INFO(FormatDataLayout(action->host_layout));\n\n    REQUIRE(action->guest_layout->contains(\"A\"));\n    CHECK(action->GetTypeCompatibility(\"struct A\") == (guest_abi == GuestABI::X86_32 ? TypeCompatibility::None : TypeCompatibility::Full));\n  }\n\n  // TODO: Double pointers to compatible data: struct B { int a ; }; struct A { B** b; };\n}\n"
  },
  {
    "path": "unittests/ThunkLibs/common.h",
    "content": "#pragma once\n\n#include <clang/Frontend/TextDiagnosticPrinter.h>\n#include <clang/Tooling/Tooling.h>\n\n#include <llvm/Support/raw_os_ostream.h>\n\n#include <optional>\n\n/**\n * Prints diagnostics to console like clang::TextDiagnosticPrinter.\n * A copy of the first error message is stored so that it can be queried\n * after compiling.\n */\nclass TestDiagnosticConsumer : public clang::TextDiagnosticPrinter {\n  bool silent;\n\n  std::optional<std::string> first_error;\n\npublic:\n#if LLVM_VERSION_MAJOR >= 21\n  TestDiagnosticConsumer(bool silent_, clang::DiagnosticOptions& diag_opts)\n    : clang::TextDiagnosticPrinter(llvm::errs(), diag_opts)\n    , silent(silent_) {}\n#else\n  TestDiagnosticConsumer(bool silent_)\n    : clang::TextDiagnosticPrinter(llvm::errs(), new clang::DiagnosticOptions)\n    , silent(silent_) {}\n#endif\n\n  void HandleDiagnostic(clang::DiagnosticsEngine::Level level, const clang::Diagnostic& diag) override {\n    if (level >= clang::DiagnosticsEngine::Error && !first_error) {\n      llvm::SmallVector<char, 64> message;\n      diag.FormatDiagnostic(message);\n      first_error = std::string(message.begin(), message.end());\n    }\n\n    if (silent && level != clang::DiagnosticsEngine::Fatal) {\n      return;\n    }\n\n    clang::TextDiagnosticPrinter::HandleDiagnostic(level, diag);\n  }\n\n  std::optional<std::string> GetFirstError() const {\n    return first_error;\n  }\n};\n\nenum class GuestABI {\n  X86_32,\n  X86_64,\n};\n\ninline std::ostream& operator<<(std::ostream& os, GuestABI abi) {\n  if (abi == GuestABI::X86_32) {\n    os << \"X86_32\";\n  } else if (abi == GuestABI::X86_64) {\n    os << \"X86_64\";\n  }\n  return os;\n}\n\n/**\n * Run the given ToolAction on the input code.\n *\n * The \"silent\" parameter is used to suppress non-fatal diagnostics in tests that expect failure\n */\ninline void\nrun_tool(clang::tooling::ToolAction& action, std::string_view code, bool silent = false, std::optional<GuestABI> guest_abi = std::nullopt) {\n  const char* memory_filename = \"gen_input.cpp\";\n  auto adjuster = clang::tooling::getClangStripDependencyFileAdjuster();\n  std::vector<std::string> args = {\"clang-tool\", \"-fsyntax-only\", \"-std=c++20\", \"-Werror\", \"-I.\", memory_filename};\n  if (CLANG_RESOURCE_DIR[0] != 0) {\n    args.push_back(\"-resource-dir\");\n    args.push_back(CLANG_RESOURCE_DIR);\n  }\n  if (guest_abi == GuestABI::X86_64) {\n    args.push_back(\"-target\");\n    args.push_back(\"x86_64-linux-gnu\");\n    args.push_back(\"-isystem\");\n    args.push_back(\"/usr/x86_64-linux-gnu/include/\");\n  } else if (guest_abi == GuestABI::X86_32) {\n    args.push_back(\"-target\");\n    args.push_back(\"i686-linux-gnu\");\n    args.push_back(\"-isystem\");\n    args.push_back(\"/usr/i686-linux-gnu/include/\");\n  } else {\n    args.push_back(\"-DHOST\");\n  }\n\n  // Corresponds to the content of GeneratorInterface.h\n  const char* common_header_code = R\"(namespace fexgen {\nstruct returns_guest_pointer {};\nstruct custom_host_impl {};\nstruct callback_annotation_base { bool prevent_multiple; };\nstruct callback_stub : callback_annotation_base {};\n\nstruct custom_repack {};\nstruct emit_layout_wrappers {};\n\nstruct opaque_type {};\nstruct assume_compatible_data_layout {};\n\nstruct ptr_passthrough {};\n\n} // namespace fexgen\n\ntemplate<auto, int, typename = void> struct fex_gen_param {};\n\ntemplate<typename>\nstruct fex_gen_type;\ntemplate<auto>\nstruct fex_gen_config;\n\n)\";\n\n  llvm::IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem> overlay_fs(new llvm::vfs::OverlayFileSystem(llvm::vfs::getRealFileSystem()));\n  llvm::IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> memory_fs(new llvm::vfs::InMemoryFileSystem);\n  overlay_fs->pushOverlay(memory_fs);\n  memory_fs->addFile(memory_filename, 0, llvm::MemoryBuffer::getMemBufferCopy(code));\n  memory_fs->addFile(\"thunks_common.h\", 0, llvm::MemoryBuffer::getMemBufferCopy(common_header_code));\n  llvm::IntrusiveRefCntPtr<clang::FileManager> files(new clang::FileManager(clang::FileSystemOptions(), overlay_fs));\n\n  auto invocation = clang::tooling::ToolInvocation(args, &action, files.get(), std::make_shared<clang::PCHContainerOperations>());\n\n#if LLVM_VERSION_MAJOR >= 21\n  clang::DiagnosticOptions diag_opts;\n  TestDiagnosticConsumer consumer(silent, diag_opts);\n#else\n  TestDiagnosticConsumer consumer(silent);\n#endif\n\n  invocation.setDiagnosticConsumer(&consumer);\n\n  // Process the actual ToolAction.\n  // NOTE: If the ToolAction throws an exception, clang will leak memory here.\n  invocation.run();\n\n  if (auto error = consumer.GetFirstError()) {\n    throw std::runtime_error(*error);\n  }\n}\n\ninline void run_tool(std::unique_ptr<clang::tooling::ToolAction> action, std::string_view code, bool silent = false,\n                     std::optional<GuestABI> guest_abi = std::nullopt) {\n  return run_tool(*action, code, silent, guest_abi);\n}\n"
  },
  {
    "path": "unittests/ThunkLibs/generator.cpp",
    "content": "#include <catch2/catch_all.hpp>\n\n#include <clang/ASTMatchers/ASTMatchers.h>\n#include <clang/ASTMatchers/ASTMatchFinder.h>\n#include <clang/Basic/Version.h>\n#include <clang/Frontend/CompilerInstance.h>\n#include <clang/Tooling/Tooling.h>\n\n#include <interface.h>\n\n#include <filesystem>\n#include <fstream>\n#include <string_view>\n\n#include \"common.h\"\n\n/**\n * This class parses its input code and stores it alongside its AST representation.\n *\n * Use this with HasASTMatching in Catch2's CHECK_THAT/REQUIRE_THAT macros.\n */\nstruct SourceWithAST {\n  std::string code;\n  std::unique_ptr<clang::ASTUnit> ast;\n\n  SourceWithAST(std::string_view input, bool silent_compile = false);\n};\n\nstd::ostream& operator<<(std::ostream& os, const SourceWithAST& ast) {\n  os << ast.code;\n\n  // Additionally, change this to true to print the full AST on test failures\n  const bool print_ast = false;\n  if (print_ast) {\n    for (auto it = ast.ast->top_level_begin(); it != ast.ast->top_level_end(); ++it) {\n      // Skip header declarations\n      if (!ast.ast->isInMainFileID((*it)->getBeginLoc())) {\n        continue;\n      }\n\n      auto llvm_os = llvm::raw_os_ostream {os};\n      (*it)->dump(llvm_os);\n    }\n  }\n  return os;\n}\n\nstruct Fixture {\n  Fixture() {\n    tmpdir = std::string {P_tmpdir} + \"/thunkgentestXXXXXX\";\n    if (!mkdtemp(tmpdir.data())) {\n      std::abort();\n    }\n    std::filesystem::create_directory(tmpdir);\n    output_filenames = {\n      tmpdir + \"/thunkgen_guest\",\n      tmpdir + \"/thunkgen_host\",\n    };\n  }\n\n  ~Fixture() {\n    std::filesystem::remove_all(tmpdir);\n  }\n\n  struct GenOutput {\n    SourceWithAST guest;\n    SourceWithAST host;\n  };\n\n  /**\n   * Runs the given given code through the thunk generator and verifies the output compiles.\n   *\n   * Input code with common definitions (types, functions, ...) should be specified in \"prelude\".\n   * It will be prepended to \"code\" before processing and also to the generator output.\n   */\n  SourceWithAST run_thunkgen_guest(std::string_view prelude, std::string_view code, bool silent = false);\n  SourceWithAST run_thunkgen_host(std::string_view prelude, std::string_view code, GuestABI = GuestABI::X86_64, bool silent = false);\n  GenOutput run_thunkgen(std::string_view prelude, std::string_view code, bool silent = false);\n\n  const std::string libname = \"libtest\";\n  std::string tmpdir;\n  OutputFilenames output_filenames;\n};\n\nusing namespace clang::ast_matchers;\n\nclass MatchCallback : public MatchFinder::MatchCallback {\n  bool success = false;\n\n  using CheckFn = std::function<bool(const MatchFinder::MatchResult&)>;\n  std::vector<CheckFn> binding_checks;\n\npublic:\n  template<typename NodeType>\n  void check_binding(std::string_view binding_name, bool (*check_fn)(const NodeType*)) {\n    // Decorate the given check with node extraction and wrap it in a type-erased interface\n    binding_checks.push_back([check_fn, binding_name = std::string(binding_name)](const MatchFinder::MatchResult& result) {\n      if (auto node = result.Nodes.getNodeAs<NodeType>(binding_name.c_str())) {\n        return check_fn(node);\n      }\n      return false;\n    });\n  }\n\n  void run(const MatchFinder::MatchResult& result) override {\n    success = true; // NOTE: If there are no callbacks, this signals that the match was found at all\n\n    for (auto& binding_check : binding_checks) {\n      success = success && binding_check(result);\n    }\n  }\n\n  bool matched() const noexcept {\n    return success;\n  }\n};\n\n/**\n * This class connects the libclang AST to Catch2 test matchers, allowing for\n * code compiled via SourceWithAST objects to be pattern-matched using the\n * libclang ASTMatcher API.\n */\ntemplate<typename ClangMatcher>\nclass HasASTMatching : public Catch::Matchers::MatcherBase<SourceWithAST> {\n  ClangMatcher matcher;\n  MatchCallback callback;\n\npublic:\n  HasASTMatching(const ClangMatcher& matcher_)\n    : matcher(matcher_) {}\n\n  template<typename NodeT>\n  HasASTMatching& check_binding(std::string_view binding_name, bool (*check_fn)(const NodeT*)) {\n    callback.check_binding(binding_name, check_fn);\n    return *this;\n  }\n\n  bool match(const SourceWithAST& code) const override {\n    MatchCallback result = callback;\n    clang::ast_matchers::MatchFinder finder;\n    finder.addMatcher(matcher, &result);\n    finder.matchAST(code.ast->getASTContext());\n    return result.matched();\n  }\n\n  std::string describe() const override {\n    std::ostringstream ss;\n    ss << \"should compile and match the given AST pattern\";\n    return ss.str();\n  }\n};\n\nHasASTMatching<DeclarationMatcher> matches(const DeclarationMatcher& matcher_) {\n  return HasASTMatching<DeclarationMatcher>(matcher_);\n}\n\nHasASTMatching<StatementMatcher> matches(const StatementMatcher& matcher_) {\n  return HasASTMatching<StatementMatcher>(matcher_);\n}\n\n/**\n * Catch matcher that checks if a tested C++ source defines a function with the given name\n */\nclass DefinesPublicFunction : public HasASTMatching<DeclarationMatcher> {\n  std::string function_name;\n\npublic:\n  DefinesPublicFunction(std::string_view name)\n    : HasASTMatching(functionDecl(hasName(name)))\n    , function_name(name) {}\n\n  std::string describe() const override {\n    std::ostringstream ss;\n    ss << \"should define and export a function called \\\"\" + function_name + \"\\\"\";\n    return ss.str();\n  }\n};\n\nSourceWithAST::SourceWithAST(std::string_view input, bool silent_compile)\n  : code(input) {\n  // Call run_tool with a ToolAction that assigns this->ast\n\n  struct ToolAction : clang::tooling::ToolAction {\n    std::unique_ptr<clang::ASTUnit>& ast;\n\n    ToolAction(std::unique_ptr<clang::ASTUnit>& ast_)\n      : ast(ast_) {}\n\n    bool runInvocation(std::shared_ptr<clang::CompilerInvocation> invocation, clang::FileManager* files,\n                       std::shared_ptr<clang::PCHContainerOperations> pch, clang::DiagnosticConsumer* diag_consumer) override {\n#if LLVM_VERSION_MAJOR >= 21\n      auto diagnostics =\n        clang::CompilerInstance::createDiagnostics(files->getVirtualFileSystem(), invocation->getDiagnosticOpts(), diag_consumer, false);\n#elif LLVM_VERSION_MAJOR == 20\n      auto diagnostics =\n        clang::CompilerInstance::createDiagnostics(files->getVirtualFileSystem(), &invocation->getDiagnosticOpts(), diag_consumer, false);\n#else\n      auto diagnostics = clang::CompilerInstance::createDiagnostics(&invocation->getDiagnosticOpts(), diag_consumer, false);\n#endif\n\n#if LLVM_VERSION_MAJOR >= 21\n      ast = clang::ASTUnit::LoadFromCompilerInvocation(invocation, std::move(pch), nullptr, std::move(diagnostics), files);\n#else\n      ast = clang::ASTUnit::LoadFromCompilerInvocation(invocation, std::move(pch), std::move(diagnostics), files);\n#endif\n      return (ast != nullptr);\n    }\n  } tool_action {ast};\n\n  run_tool(tool_action, code, silent_compile);\n}\n\n/**\n * Generates guest thunk library code from the given input\n */\nSourceWithAST Fixture::run_thunkgen_guest(std::string_view prelude, std::string_view code, bool silent) {\n  const std::string full_code = std::string {prelude} + std::string {code};\n\n  // These tests don't deal with data layout differences, so just run data\n  // layout analysis with host configuration\n  auto data_layout_analysis_factory = std::make_unique<AnalyzeDataLayoutActionFactory>();\n  run_tool(*data_layout_analysis_factory, full_code, silent);\n  auto& data_layout = data_layout_analysis_factory->GetDataLayout();\n\n  run_tool(std::make_unique<GenerateThunkLibsActionFactory>(libname, output_filenames, data_layout), full_code, silent);\n\n  std::string result = \"#include <cstdint>\\n\"\n                       \"#define MAKE_THUNK(lib, name, hash) extern \\\"C\\\" int fexthunks_##lib##_##name(void*);\\n\"\n                       \"template<typename>\\n\"\n                       \"struct callback_thunk_defined;\\n\"\n                       \"#define MAKE_CALLBACK_THUNK(name, sig, hash) template<> struct callback_thunk_defined<sig> {};\\n\"\n                       \"#define FEX_PACKFN_LINKAGE\\n\"\n                       \"template<typename Target>\\n\"\n                       \"Target *MakeHostTrampolineForGuestFunction(uint8_t HostPacker[32], void (*)(uintptr_t, void*), Target*);\\n\"\n                       \"template<typename Target>\\n\"\n                       \"Target *AllocateHostTrampolineForGuestFunction(Target*);\\n\";\n  const auto& filename = output_filenames.guest;\n  {\n    std::ifstream file(filename);\n    const auto current_size = result.size();\n    const auto new_data_size = std::filesystem::file_size(filename);\n    result.resize(result.size() + new_data_size);\n    file.read(result.data() + current_size, result.size());\n  }\n  return SourceWithAST {std::string {prelude} + result};\n}\n\n/**\n * Generates host thunk library code from the given input\n */\nSourceWithAST Fixture::run_thunkgen_host(std::string_view prelude, std::string_view code, GuestABI guest_abi, bool silent) {\n  const std::string full_code = std::string {prelude} + std::string {code};\n\n  // These tests don't deal with data layout differences, so just run data\n  // layout analysis with host configuration\n  auto data_layout_analysis_factory = std::make_unique<AnalyzeDataLayoutActionFactory>();\n  run_tool(*data_layout_analysis_factory, full_code, silent, guest_abi);\n  auto& data_layout = data_layout_analysis_factory->GetDataLayout();\n\n  run_tool(std::make_unique<GenerateThunkLibsActionFactory>(libname, output_filenames, data_layout), full_code, silent);\n\n  std::string result =\n    \"#include <array>\\n\"\n    \"#include <cstdint>\\n\"\n    \"#include <cstring>\\n\"\n    \"#include <dlfcn.h>\\n\"\n    \"#include <type_traits>\\n\"\n    \"template<typename Fn>\\n\"\n    \"struct function_traits;\\n\"\n    \"template<typename Result, typename Arg>\\n\"\n    \"struct function_traits<Result(*)(Arg)> {\\n\"\n    \"    using result_t = Result;\\n\"\n    \"    using arg_t = Arg;\\n\"\n    \"};\\n\"\n    \"template<auto Fn>\\n\"\n    \"static typename function_traits<decltype(Fn)>::result_t\\n\"\n    \"fexfn_type_erased_unpack(void* argsv) {\\n\"\n    \"    using args_t = typename function_traits<decltype(Fn)>::arg_t;\\n\"\n    \"    return Fn(reinterpret_cast<args_t>(argsv));\\n\"\n    \"}\\n\"\n    \"#define LOAD_INTERNAL_GUESTPTR_VIA_CUSTOM_ABI(arg)\\n\"\n    \"struct GuestcallInfo {\\n\"\n    \"  uintptr_t HostPacker;\\n\"\n    \"  void (*CallCallback)(uintptr_t, uintptr_t, void*);\\n\"\n    \"  uintptr_t GuestUnpacker;\\n\"\n    \"  uintptr_t GuestTarget;\\n\"\n    \"};\\n\"\n    \"struct ParameterAnnotations {};\\n\"\n    \"template<typename, typename...>\\n\"\n    \"struct GuestWrapperForHostFunction {\\n\"\n    \"  template<ParameterAnnotations...> static void Call(void*);\\n\"\n    \"};\\n\"\n    \"struct ExportEntry { uint8_t* sha256; void(*fn)(void *); };\\n\"\n    \"void *dlsym_default(void* handle, const char* symbol);\\n\"\n    \"template<typename T> inline constexpr bool has_compatible_data_layout = std::is_integral_v<T> || std::is_enum_v<T>;\\n\"\n    \"template<typename T>\\n\"\n    \"struct guest_layout {\\n\"\n    \"  T data;\\n\"\n    \"};\\n\"\n    \"\\n\"\n    \"template<typename T, std::size_t N>\\n\"\n    \"struct guest_layout<T[N]> {\\n\"\n    \"  using type = std::enable_if_t<!std::is_pointer_v<T>, T>;\\n\"\n    \"  std::array<guest_layout<type>, N> data;\\n\"\n    \"};\\n\"\n    \"\\n\"\n    \"template<typename T>\\n\"\n    \"struct guest_layout<T*> {\\n\"\n    \"#ifdef IS_32BIT_THUNK\\n\"\n    \"  using type = uint32_t;\\n\"\n    \"#else\\n\"\n    \"  using type = uint64_t;\\n\"\n    \"#endif\\n\"\n    \"  type data;\\n\"\n    \"};\\n\"\n    \"\\n\"\n    \"template<typename T>\\n\"\n    \"struct host_layout {\\n\"\n    \"  T data;\\n\"\n    \"\\n\"\n    \"  explicit host_layout(const guest_layout<T>&);\\n\"\n    \"  template<typename U> explicit host_layout(const guest_layout<U>&) requires (std::is_integral_v<U> && sizeof(U) <= sizeof(T) && \"\n    \"std::is_convertible_v<T, U> && std::is_signed_v<T> == std::is_signed_v<U>);\\n\"\n    \"};\\n\"\n    \"\\n\"\n    \"template<typename T> constexpr bool is_long = std::is_same_v<T, long> || std::is_same_v<T, unsigned long>;\\n\"\n    \"template<typename T> constexpr bool is_longlong = std::is_same_v<T, long long> || std::is_same_v<T, unsigned long long>;\\n\"\n    \"template<typename T>\\n\"\n    \"struct host_layout<T*> {\\n\"\n    \"  T* data;\\n\"\n    \"  explicit host_layout(const guest_layout<T*>&);\\n\"\n    \"  template<typename U> explicit host_layout(const guest_layout<U*>&) requires (std::is_integral_v<U> && sizeof(U) == sizeof(long) && \"\n    \"sizeof(long) == 8 && is_long<std::remove_cv_t<T>> && std::is_convertible_v<T, U> && std::is_signed_v<T> == std::is_signed_v<U>);\\n\"\n    \"  template<typename U> explicit host_layout(const guest_layout<U*>&) requires (std::is_integral_v<U> && sizeof(U) == sizeof(long \"\n    \"long) && is_longlong<std::remove_cv_t<T>> && std::is_convertible_v<T, U> && std::is_signed_v<T> == std::is_signed_v<U>);\\n\"\n    \"  template<typename U> explicit host_layout(const guest_layout<U*>&) requires (std::is_same_v<std::remove_cv_t<T>, char> && \"\n    \"std::is_integral_v<U> && std::is_convertible_v<T, U> && sizeof(U) == 1);\\n\"\n    \"  template<typename U> explicit host_layout(const guest_layout<U*>&) requires (std::is_same_v<std::remove_cv_t<T>, wchar_t> && \"\n    \"std::is_integral_v<U> && std::is_convertible_v<T, U> && sizeof(U) == sizeof(wchar_t));\\n\"\n    \"};\\n\"\n    \"\\n\"\n    \"template<typename T> struct host_to_guest_convertible {\\n\"\n    \"  operator guest_layout<T>();\\n\"\n    \"  operator guest_layout<const unsigned long long*>() const requires(std::is_same_v<T, const unsigned long*>);\\n\"\n    \"  operator guest_layout<const uint8_t*>() const requires(std::is_same_v<T, const char*>);\\n\"\n    \"  operator guest_layout<uint8_t*>() const requires(std::is_same_v<T, char*>);\\n\"\n    \"  operator guest_layout<uint32_t*>() const requires(std::is_same_v<T, wchar_t*>);\\n\"\n    \"  template<typename U> operator guest_layout<U>() const requires (std::is_integral_v<U> && sizeof(U) == sizeof(T) && \"\n    \"std::is_convertible_v<T, U> && std::is_signed_v<T> == std::is_signed_v<U>);\\n\"\n    \"#if IS_32BIT_THUNK\\n\"\n    \"  operator guest_layout<uint32_t>() const requires(std::is_same_v<T, size_t>);\\n\"\n    \"#endif\\n\"\n    \"};\\n\"\n    \"\\n\"\n    \"template<typename T, size_t N>\\n\"\n    \"struct host_layout<T[N]> {\\n\"\n    \"  std::array<T, N> data;\\n\"\n    \"  host_layout(const guest_layout<T[N]>& from);\\n\"\n    \"};\\n\"\n    \"\\n\"\n    \"template<typename T, typename GuestT>\\n\"\n    \"struct repack_wrapper {};\\n\"\n    \"template<typename T, typename GuestT>\\n\"\n    \"repack_wrapper<T, GuestT> make_repack_wrapper(guest_layout<GuestT>& orig_arg);\\n\"\n    \"template<typename T> host_to_guest_convertible<T> to_guest(const host_layout<T>& from);\\n\"\n    \"template<typename F> void FinalizeHostTrampolineForGuestFunction(F*);\\n\"\n    \"template<typename F> void FinalizeHostTrampolineForGuestFunction(guest_layout<F*>);\\n\"\n    \"template<typename T> T& unwrap_host(host_layout<T>&);\\n\"\n    \"template<typename T, typename GuestT> T* unwrap_host(repack_wrapper<T*, GuestT>&);\\n\"\n    \"template<typename T> const host_layout<T>& to_host_layout(const T& t);\\n\";\n\n  auto& filename = output_filenames.host;\n  {\n    std::ifstream file(filename);\n    const auto prelude_size = result.size();\n    const auto new_data_size = std::filesystem::file_size(filename);\n    result.resize(result.size() + new_data_size);\n    file.read(result.data() + prelude_size, result.size());\n\n    // Force all functions to be non-static, since having to define them\n    // would add a lot of noise to simple tests.\n    while (true) {\n      auto pos = result.find(\"static \", prelude_size);\n      if (pos == std::string::npos) {\n        break;\n      }\n      result.replace(pos, 6, \"      \"); // Replace \"static\" with 6 spaces (avoiding reallocation)\n    }\n  }\n  return SourceWithAST {std::string {prelude} + result, silent};\n}\n\nFixture::GenOutput Fixture::run_thunkgen(std::string_view prelude, std::string_view code, bool silent) {\n  return {run_thunkgen_guest(prelude, code, silent), run_thunkgen_host(prelude, code, GuestABI::X86_64, silent)};\n}\n\n#if CLANG_VERSION_MAJOR <= 15\n// Old clang versions require an explicit \"struct\" prefix\n#define CLANG_STRUCT_PREFIX \"struct \"\n#define asStructString(name) asString(CLANG_STRUCT_PREFIX name)\n#else\n#define CLANG_STRUCT_PREFIX\n#define asStructString(name) asString(name)\n#endif\n\nTEST_CASE_METHOD(Fixture, \"Trivial\") {\n  const auto output = run_thunkgen(\"\", \"#include <thunks_common.h>\\n\"\n                                       \"void func();\\n\"\n                                       \"template<auto> struct fex_gen_config {};\\n\"\n                                       \"template<> struct fex_gen_config<func> {};\\n\");\n\n  // Guest code\n  CHECK_THAT(output.guest, DefinesPublicFunction(\"func\"));\n\n  CHECK_THAT(output.guest, matches(functionDecl(hasName(\"fexfn_pack_func\"), returns(asString(\"void\")), parameterCountIs(0))));\n\n  // Host code\n  CHECK_THAT(output.host,\n             matches(varDecl(hasName(\"exports\"), hasType(constantArrayType(hasElementType(asStructString(\"ExportEntry\")), hasSize(2))),\n                             hasInitializer(initListExpr(\n                               hasInit(0, expr()), hasInit(1, initListExpr(hasInit(0, implicitCastExpr()), hasInit(1, implicitCastExpr())))))\n                             // TODO: check null termination\n                             )));\n}\n\n// Unknown annotations trigger an error\nTEST_CASE_METHOD(Fixture, \"UnknownAnnotation\") {\n  REQUIRE_THROWS(run_thunkgen(\"void func();\\n\",\n                              \"struct invalid_annotation {};\\n\"\n                              \"template<auto> struct fex_gen_config {};\\n\"\n                              \"template<> struct fex_gen_config<func> : invalid_annotation {};\\n\",\n                              true));\n\n  REQUIRE_THROWS(run_thunkgen(\"void func();\\n\",\n                              \"template<auto> struct fex_gen_config {};\\n\"\n                              \"template<> struct fex_gen_config<func> { int invalid_field_annotation; };\\n\",\n                              true));\n}\n\nTEST_CASE_METHOD(Fixture, \"VersionedLibrary\") {\n  const auto output = run_thunkgen_host(\"\", \"template<auto> struct fex_gen_config { int version = 123; };\\n\");\n\n#if CLANG_VERSION_MAJOR >= 17\n  CHECK_THAT(output, matches(callExpr(callee(functionDecl(hasName(\"dlopen\"))), hasArgument(0, stringLiteral().bind(\"libname\"))))\n                       .check_binding(\"libname\", +[](const clang::StringLiteral* lit) { return lit->getString().ends_with(\".so.123\"); }));\n#else\n  CHECK_THAT(output, matches(callExpr(callee(functionDecl(hasName(\"dlopen\"))), hasArgument(0, stringLiteral().bind(\"libname\"))))\n                       .check_binding(\"libname\", +[](const clang::StringLiteral* lit) { return lit->getString().endswith(\".so.123\"); }));\n#endif\n}\n\nTEST_CASE_METHOD(Fixture, \"FunctionPointerViaType\") {\n  const auto output = run_thunkgen(\"\", \"template<typename> struct fex_gen_type {};\\n\"\n                                       \"template<> struct fex_gen_type<int(char, char)> {};\\n\");\n\n  // Guest should apply MAKE_CALLBACK_THUNK to this signature\n  CHECK_THAT(output.guest, matches(classTemplateSpecializationDecl(\n                             // Should have signature matching input function\n                             hasName(\"callback_thunk_defined\"), hasTemplateArgument(0, refersToType(asString(\"int (char, char)\"))))));\n\n  // Host should export the unpacking function for callback arguments\n  CHECK_THAT(output.host,\n             matches(varDecl(hasName(\"exports\"), hasType(constantArrayType(hasElementType(asStructString(\"ExportEntry\")), hasSize(2))),\n                             hasInitializer(hasDescendant(declRefExpr(\n                               to(cxxMethodDecl(hasName(\"Call\"), ofClass(hasName(\"GuestWrapperForHostFunction\"))).bind(\"funcptr\")))))))\n               .check_binding(\n                 \"funcptr\", +[](const clang::CXXMethodDecl* decl) {\n                   auto parent = llvm::cast<clang::ClassTemplateSpecializationDecl>(decl->getParent());\n                   return parent->getTemplateArgs().get(0).getAsType().getAsString() == \"int (unsigned char, unsigned char)\";\n                 }));\n}\n\n// Parameter is a function pointer\nTEST_CASE_METHOD(Fixture, \"FunctionPointerParameter\") {\n  const auto output = run_thunkgen(\"\", \"void func(int (*funcptr)(char, char));\\n\"\n                                       \"template<auto> struct fex_gen_config {};\\n\"\n                                       \"template<> struct fex_gen_config<func> {};\\n\");\n\n  CHECK_THAT(output.guest, matches(functionDecl(\n                             // Should have signature matching input function\n                             hasName(\"fexfn_pack_func\"), returns(asString(\"void\")), parameterCountIs(1),\n                             hasParameter(0, hasType(asString(\"int (*)(char, char)\"))))));\n\n  // Host packing function should call FinalizeHostTrampolineForGuestFunction on the argument\n  CHECK_THAT(output.host,\n             matches(functionDecl(hasName(\"fexfn_unpack_libtest_func\"), hasDescendant(callExpr(callee(functionDecl(hasName(\"FinalizeHostTra\"\n                                                                                                                           \"mpolineForGuest\"\n                                                                                                                           \"Function\"))),\n                                                                                               hasArgument(0, expr().bind(\"funcptr\"))))))\n               .check_binding(\n                 \"funcptr\", +[](const clang::Expr* funcptr) {\n                   // Check that the argument type matches the function pointer\n                   return funcptr->getType().getAsString() == \"guest_layout<int (*)(char, char)>\";\n                 }));\n\n  // Host should export the unpacking function for function pointer arguments\n  CHECK_THAT(output.host,\n             matches(varDecl(hasName(\"exports\"), hasType(constantArrayType(hasElementType(asStructString(\"ExportEntry\")), hasSize(3))),\n                             hasInitializer(hasDescendant(declRefExpr(to(cxxMethodDecl(hasName(\"Call\"), ofClass(hasName(\"GuestWrapperForHos\"\n                                                                                                                        \"tFunctio\"\n                                                                                                                        \"n\"))))))))));\n}\n\nTEST_CASE_METHOD(Fixture, \"MultipleParameters\") {\n  const std::string prelude = \"struct TestStruct { int member; };\\n\";\n\n  auto output = run_thunkgen(prelude, \"void func(int arg, char, unsigned long, TestStruct);\\n\"\n                                      \"template<auto> struct fex_gen_config {};\\n\"\n                                      \"template<> struct fex_gen_config<func> {};\\n\");\n\n  // Guest code\n  CHECK_THAT(output.guest, DefinesPublicFunction(\"func\"));\n\n  CHECK_THAT(output.guest, matches(functionDecl(hasName(\"fexfn_pack_func\"), returns(asString(\"void\")), parameterCountIs(4),\n                                                hasParameter(0, hasType(asString(\"int\"))), hasParameter(1, hasType(asString(\"char\"))),\n                                                hasParameter(2, hasType(asString(\"unsigned long\"))),\n                                                hasParameter(3, hasType(asStructString(\"TestStruct\"))))));\n\n  // Host code\n  CHECK_THAT(output.host,\n             matches(varDecl(hasName(\"exports\"), hasType(constantArrayType(hasElementType(asStructString(\"ExportEntry\")), hasSize(2))),\n                             hasInitializer(initListExpr(\n                               hasInit(0, expr()), hasInit(1, initListExpr(hasInit(0, implicitCastExpr()), hasInit(1, implicitCastExpr())))))\n                             // TODO: check null termination\n                             )));\n\n  CHECK_THAT(\n    output.host,\n    matches(functionDecl(\n      hasName(\"fexfn_unpack_libtest_func\"),\n      // Packed argument struct should contain all parameters\n      parameterCountIs(1),\n      hasParameter(0, hasType(pointerType(pointee(hasUnqualifiedDesugaredType(recordType(hasDeclaration(decl(\n                        has(fieldDecl(hasType(asString(\"guest_layout<int32_t>\")))), has(fieldDecl(hasType(asString(\"guest_layout<uint8_t>\")))),\n                        has(fieldDecl(hasType(asString(\"guest_layout<uint64_t>\")))),\n                        has(fieldDecl(hasType(asString(\"guest_layout<\" CLANG_STRUCT_PREFIX \"TestStruct>\")))))))))))))));\n}\n\n// Returning a function pointer should trigger an error unless an annotation is provided\nTEST_CASE_METHOD(Fixture, \"ReturnFunctionPointer\") {\n  const std::string prelude = \"using funcptr = void (*)(char, char);\\n\";\n\n  REQUIRE_THROWS(run_thunkgen_guest(prelude,\n                                    \"funcptr func(int);\\n\"\n                                    \"template<auto> struct fex_gen_config {};\\n\"\n                                    \"template<> struct fex_gen_config<func> {};\\n\",\n                                    true));\n\n  REQUIRE_NOTHROW(run_thunkgen_guest(prelude, \"#include <thunks_common.h>\\n\"\n                                              \"funcptr func(int);\\n\"\n                                              \"template<auto> struct fex_gen_config {};\\n\"\n                                              \"template<> struct fex_gen_config<func> : fexgen::returns_guest_pointer {};\\n\"));\n}\n\nTEST_CASE_METHOD(Fixture, \"VariadicFunction\") {\n  const std::string prelude = \"void func(int arg, ...);\\n\";\n\n  const auto output = run_thunkgen_guest(prelude, \"template<auto> struct fex_gen_config {};\\n\"\n                                                  \"template<> struct fex_gen_config<func> {\\n\"\n                                                  \"  using uniform_va_type = char;\\n\"\n                                                  \"};\\n\");\n\n  CHECK_THAT(output, matches(functionDecl(hasName(\"fexfn_pack_func_internal\"), returns(asString(\"void\")), parameterCountIs(3),\n                                          hasParameter(0, hasType(asString(\"int\"))), hasParameter(1, hasType(asString(\"unsigned long\"))),\n                                          hasParameter(2, hasType(pointerType(pointee(asString(\"char\"))))))));\n}\n\n// Variadic functions without annotation trigger an error\nTEST_CASE_METHOD(Fixture, \"VariadicFunctionsWithoutAnnotation\") {\n  REQUIRE_THROWS(run_thunkgen_guest(\"void func(int arg, ...);\\n\",\n                                    \"template<auto> struct fex_gen_config {};\\n\"\n                                    \"template<> struct fex_gen_config<func> {};\\n\",\n                                    true));\n}\n\n// Tests generation of guest_layout/host_layout wrappers and related helpers\nTEST_CASE_METHOD(Fixture, \"LayoutWrappers\") {\n  auto guest_abi = GENERATE(GuestABI::X86_32, GuestABI::X86_64);\n  INFO(guest_abi);\n\n  const auto host_layout_is_trivial =\n    matches(classTemplateSpecializationDecl(hasName(\"host_layout\"), hasAnyTemplateArgument(refersToType(asString(\"struct A\"))),\n                                            has(fieldDecl(hasName(\"data\"), hasType(hasCanonicalType(asString(\"struct A\")))))));\n  const auto layout_undefined = [](const char* type) {\n    return matches(classTemplateSpecializationDecl(hasName(type), hasAnyTemplateArgument(refersToType(asString(\"struct A\")))).bind(\"layout\"))\n      .check_binding(\"layout\", +[](const clang::ClassTemplateSpecializationDecl* decl) { return !decl->isCompleteDefinition(); });\n  };\n  const auto guest_converter_defined = matches(functionDecl(\n    hasName(\"to_guest\"),\n    // Parameter is a host_layout<A> (ignoring qualifiers and references)\n    hasParameter(\n      0, hasType(references(classTemplateSpecializationDecl(hasName(\"host_layout\"), hasAnyTemplateArgument(refersToType(asString(\"struct \"\n                                                                                                                                 \"A\"))))))),\n    // Return value is a guest_layout<A>\n    returns(asString(\"guest_layout<\" CLANG_STRUCT_PREFIX \"A>\"))));\n  const auto guest_converter_undefined = matches(functionDecl(\n    hasName(\"to_guest\"),\n    // Parameter is a host_layout<A> (ignoring qualifiers and references)\n    hasParameter(\n      0, hasType(references(classTemplateSpecializationDecl(hasName(\"host_layout\"), hasAnyTemplateArgument(refersToType(asString(\"struct \"\n                                                                                                                                 \"A\"))))))),\n    isDeleted()));\n\n  const std::string code = \"template<typename> struct fex_gen_type {};\\n\"\n                           \"template<> struct fex_gen_type<A> {};\\n\";\n\n  // For fully compatible types, both guest_layout and host_layout directly\n  // reference the original struct\n  SECTION(\"Fully compatible type\") {\n    const char* struct_def = \"struct A { int a; int b; };\\n\";\n    const auto output = run_thunkgen_host(struct_def, code, guest_abi);\n    CHECK_THAT(output,\n               matches(classTemplateSpecializationDecl(hasName(\"guest_layout\"), hasAnyTemplateArgument(refersToType(asString(\"struct A\"))),\n                                                       has(fieldDecl(hasName(\"data\"), hasType(hasCanonicalType(asString(\"struct A\"))))))));\n    CHECK_THAT(output, guest_converter_defined);\n\n    CHECK_THAT(output, host_layout_is_trivial);\n  }\n\n  // For repackable types, guest_layout explicitly lists its members\n  SECTION(\"Repackable type\") {\n    const char* struct_def = \"#ifdef HOST\\n\"\n                             \"struct A { int a; int b; };\\n\"\n                             \"#else\\n\"\n                             \"struct A { int b; int a; };\\n\"\n                             \"#endif\\n\";\n    const auto output = run_thunkgen_host(struct_def, code, guest_abi);\n    CHECK_THAT(output, matches(classTemplateSpecializationDecl(\n                         hasName(\"guest_layout\"), hasAnyTemplateArgument(refersToType(asString(\"struct A\"))),\n                         // The member \"data\" exists and is defined to a struct...\n                         has(fieldDecl(hasName(\"data\"), hasType(hasCanonicalType(hasDeclaration(decl(\n                                                          // ... the members of which also use guest_layout (with fixed-size integers)\n                                                          has(fieldDecl(hasName(\"a\"), hasType(asString(\"guest_layout<int32_t>\")))),\n                                                          has(fieldDecl(hasName(\"b\"), hasType(asString(\"guest_layout<int32_t>\")))))))))))));\n    CHECK_THAT(output, guest_converter_defined);\n\n    CHECK_THAT(output, host_layout_is_trivial);\n  }\n\n  // For incompatible types, use of guest_layout nor host_layout should be prohibited\n  SECTION(\"Incompatible type, unannotated\") {\n    const char* struct_def = \"#ifdef HOST\\n\"\n                             \"struct A { int a; int b; };\\n\"\n                             \"#else\\n\"\n                             \"struct A { int c; int d; };\\n\"\n                             \"#endif\\n\";\n    const auto output = run_thunkgen_host(struct_def, code, guest_abi);\n    CHECK_THAT(output, layout_undefined(\"guest_layout\"));\n    CHECK_THAT(output, guest_converter_undefined);\n    CHECK_THAT(output, layout_undefined(\"host_layout\"));\n  }\n\n  // Layout wrappers can be enabled even for incompatible types using the emit_layout_wrappers annotation\n  SECTION(\"Incompatible type, annotated\") {\n    // A slightly different setup is used here in order to construct a type which...\n    // - has incompatible data layout (for both 32-bit and 64-bit guests)\n    // - has consistently named members in struct A (which is required to emit layout wrappers)\n    const char* struct_def = \"#ifdef HOST\\n\"\n                             \"struct B { int a; };\\n\"\n                             \"#else\\n\"\n                             \"struct B { int b; };\\n\"\n                             \"#endif\\n\"\n                             \"struct A { B* a; int b; };\\n\";\n    const std::string code = \"#include <thunks_common.h>\\n\"\n                             \"template<typename> struct fex_gen_type {};\\n\"\n                             \"template<> struct fex_gen_type<A> : fexgen::emit_layout_wrappers {};\\n\";\n    const auto output = run_thunkgen_host(struct_def, code, guest_abi);\n    CHECK_THAT(output, matches(classTemplateSpecializationDecl(\n                         hasName(\"guest_layout\"), hasAnyTemplateArgument(refersToType(recordType(hasDeclaration(recordDecl(hasName(\"A\")))))),\n                         // The member \"data\" exists and is defined to a struct...\n                         has(fieldDecl(hasName(\"data\"), hasType(hasCanonicalType(hasDeclaration(decl(\n                                                          // ... the members of which also use guest_layout\n                                                          has(fieldDecl(hasName(\"a\"), hasType(asString(\"guest_layout<\" CLANG_STRUCT_PREFIX \"B \"\n                                                                                                       \"*>\")))),\n                                                          has(fieldDecl(hasName(\"b\"), hasType(asString(\"guest_layout<int32_t>\")))))))))))));\n    CHECK_THAT(output, guest_converter_defined);\n\n    CHECK_THAT(output, host_layout_is_trivial);\n  }\n}\n\n// Some integer types are differently sized on the guest than on the host.\n// All integer types are mapped to fixed-size equivalents when mentioned in a\n// guest context hence. This test ensures the mapping is done correctly and\n// the resulting guest_layout instantiations are convertible to host_layout.\nTEST_CASE_METHOD(Fixture, \"Mapping guest integers to fixed-size\") {\n  auto guest_abi = GENERATE(GuestABI::X86_32, GuestABI::X86_64);\n  INFO(guest_abi);\n\n  // Run each test a second time to ensure fixed-size integer mapping is\n  // applied to pointees as well\n  const std::string ptr = GENERATE(\"\", \" *\");\n\n  // Run each test with and without the ptr_passthrough annotation\n  const bool passthrough_guest_type = GENERATE(false, true);\n\n  // These types are differently sized on 32-bit guests\n  SECTION(\"(u)intptr_t / size_t / long\") {\n    const std::string type = GENERATE(\"long\", \"unsigned long\", \"uintptr_t\", \"intptr_t\", \"size_t\");\n    INFO(type + ptr);\n    const auto code = \"#include <thunks_common.h>\\n\"\n                      \"#include <cstddef>\\n\"\n                      \"#include <cstdint>\\n\"\n                      \"void func(\" +\n                      type + ptr +\n                      \");\\n\"\n                      \"template<> struct fex_gen_config<func> : fexgen::custom_host_impl {};\\n\" +\n                      (passthrough_guest_type ? \"template<> struct fex_gen_param<func, 0> : fexgen::ptr_passthrough {};\\n\" : \"\");\n    if (!ptr.empty() && guest_abi == GuestABI::X86_32 && !passthrough_guest_type) {\n      // Guest points to a 32-bit integer, but the host to a 64-bit one.\n      // This should be detected as a failure.\n      CHECK_THROWS_WITH(run_thunkgen_host(\"\", code, guest_abi, true),\n                        Catch::Matchers::ContainsSubstring(\"initialization of 'host_layout\", Catch::CaseSensitive::No));\n    } else {\n      const auto output = run_thunkgen_host(\"\", code, guest_abi);\n      std::string expected_type = \"guest_layout<\";\n      if (type == \"size_t\" || type.starts_with(\"u\")) {\n        expected_type += \"u\";\n      }\n      expected_type += (guest_abi == GuestABI::X86_32 ? +\"int32_t\" : \"int64_t\");\n      expected_type += ptr + \">\";\n      CHECK_THAT(output, matches(functionDecl(hasName(\"fexfn_unpack_libtest_func\"),\n                                              // Packed argument struct should contain all parameters\n                                              parameterCountIs(1),\n                                              hasParameter(0, hasType(pointerType(pointee(hasUnqualifiedDesugaredType(recordType(\n                                                                hasDeclaration(decl(has(fieldDecl(hasType(asString(expected_type)))))))))))))));\n\n      // For passthrough parameters, the target function signature should\n      // match the guest_layout type\n      if (passthrough_guest_type) {\n        CHECK_THAT(output, matches(functionDecl(hasName(\"fexfn_impl_libtest_func\"), parameterCountIs(1),\n                                                hasParameter(0, hasType(asString(expected_type))))));\n      }\n    }\n  }\n\n  // Most integer types are uniquely defined by specifying their size and\n  // their signedness. (w)char-types and long-types are special:\n  // * \"char\", \"signed char\", and \"unsigned char\" are different types\n  // * \"wchar_t\" is mapped to \"guest_layout<uint32_t>\", but uint32_t\n  //   itself is a type alias for \"int\"\n  // * \"long long\" is mapped to \"guest_layout<uint64_t>\", but uint64_t\n  //   itself is a type alias for \"long\" on 64-bit (which is a different\n  //   type than \"long long\")\n  //\n  // This test section ensures that the correct fixed-size integers are used\n  // *and* that they can be converted to host_layout.\n  SECTION(\"Special integer types\") {\n    const std::string type = GENERATE(\"long long\", \"unsigned long long\", \"char\", \"unsigned char\", \"signed char\", \"wchar_t\");\n    std::string fixed_size_type = ((type.starts_with(\"unsigned\") || type == \"char\" || type == \"wchar_t\") ? \"u\" : \"\");\n    if (type.ends_with(\"long long\")) {\n      fixed_size_type += \"int64_t\";\n    } else if (type.ends_with(\"wchar_t\")) {\n      fixed_size_type += \"int32_t\";\n    } else {\n      fixed_size_type += \"int8_t\";\n    }\n    INFO(type + ptr + \", expecting \" + fixed_size_type + ptr);\n    const auto code = \"#include <thunks_common.h>\\n\"\n                      \"#include <cstdint>\\n\"\n                      \"void func(\" +\n                      type + ptr +\n                      \");\\n\"\n                      \"template<> struct fex_gen_config<func> : fexgen::custom_host_impl {};\\n\" +\n                      (passthrough_guest_type ? \"template<> struct fex_gen_param<func, 0> : fexgen::ptr_passthrough {};\\n\" : \"\");\n    const auto output = run_thunkgen_host(\"\", code, guest_abi);\n    CHECK_THAT(output, matches(functionDecl(\n                         hasName(\"fexfn_unpack_libtest_func\"),\n                         // Packed argument struct should contain all parameters\n                         parameterCountIs(1),\n                         hasParameter(0, hasType(pointerType(pointee(hasUnqualifiedDesugaredType(recordType(hasDeclaration(\n                                           decl(has(fieldDecl(hasType(asString(\"guest_layout<\" + fixed_size_type + ptr + \">\")))))))))))))));\n\n    // For passthrough parameters, the target function signature should\n    // match the guest_layout type\n    if (passthrough_guest_type) {\n      CHECK_THAT(output, matches(functionDecl(hasName(\"fexfn_impl_libtest_func\"), parameterCountIs(1),\n                                              hasParameter(0, hasType(asString(\"guest_layout<\" + fixed_size_type + ptr + \">\"))))));\n    }\n  }\n}\n\nTEST_CASE_METHOD(Fixture, \"StructRepacking\") {\n  auto guest_abi = GENERATE(GuestABI::X86_32, GuestABI::X86_64);\n  INFO(guest_abi);\n\n  // All tests use the same function, but the prelude defining its parameter type \"A\" varies\n  const std::string code = \"#include <thunks_common.h>\\n\"\n                           \"void func(A*);\\n\"\n                           \"template<auto> struct fex_gen_config {};\\n\"\n                           \"template<> struct fex_gen_config<func> : fexgen::custom_host_impl {};\\n\";\n\n  SECTION(\"Pointer to struct with consistent data layout\") {\n    CHECK_NOTHROW(run_thunkgen_host(\"struct A { int a; };\\n\", code, guest_abi));\n  }\n\n  SECTION(\"Pointer to struct with unannotated pointer member with inconsistent data layout\") {\n    const auto prelude = \"#ifdef HOST\\n\"\n                         \"struct B { int a; };\\n\"\n                         \"#else\\n\"\n                         \"struct B { int b; };\\n\"\n                         \"#endif\\n\"\n                         \"struct A { B* a; };\\n\";\n\n    SECTION(\"Parameter unannotated\") {\n      CHECK_THROWS(run_thunkgen_host(prelude, code, guest_abi, true));\n    }\n\n    SECTION(\"Parameter annotated as ptr_passthrough\") {\n      CHECK_NOTHROW(run_thunkgen_host(prelude, code + \"template<> struct fex_gen_param<func, 0, A*> : fexgen::ptr_passthrough {};\\n\", guest_abi));\n    }\n\n    SECTION(\"Struct member annotated as custom_repack\") {\n      CHECK_NOTHROW(run_thunkgen_host(\"struct A { void* a; };\\n\",\n                                      code + \"template<> struct fex_gen_config<&A::a> : fexgen::custom_repack {};\\n\", guest_abi));\n    }\n  }\n\n  SECTION(\"Pointer to struct with pointer member of consistent data layout\") {\n    std::string type = GENERATE(\"char\", \"short\", \"int\", \"float\");\n    REQUIRE_NOTHROW(run_thunkgen_host(\"struct A { \" + type + \"* a; };\\n\", code, guest_abi));\n  }\n\n  SECTION(\"Pointer to struct with pointer member of opaque type\") {\n    const auto prelude = \"struct B;\\n\"\n                         \"struct A { B* a; };\\n\";\n\n    // Unannotated\n    REQUIRE_THROWS_WITH(run_thunkgen_host(prelude, code, guest_abi), Catch::Matchers::ContainsSubstring(\"incomplete type\"));\n\n    // Annotated as opaque_type\n    CHECK_NOTHROW(run_thunkgen_host(prelude, code + \"template<> struct fex_gen_type<B> : fexgen::opaque_type {};\\n\", guest_abi));\n  }\n}\n\nTEST_CASE_METHOD(Fixture, \"VoidPointerParameter\") {\n  auto guest_abi = GENERATE(GuestABI::X86_32, GuestABI::X86_64);\n  INFO(guest_abi);\n\n  SECTION(\"Unannotated\") {\n    const char* code = \"#include <thunks_common.h>\\n\"\n                       \"void func(void*);\\n\"\n                       \"template<> struct fex_gen_config<func> {};\\n\";\n    if (guest_abi == GuestABI::X86_32) {\n      // TODO: Currently not considered an error\n      //            CHECK_THROWS_WITH(run_thunkgen_host(\"\", code, guest_abi, true), Catch::Matchers::ContainsSubstring(\"unsupported parameter type\", Catch::CaseSensitive::No));\n    } else {\n      // Pointee data is assumed to be compatible on 64-bit\n      CHECK_NOTHROW(run_thunkgen_host(\"\", code, guest_abi));\n    }\n  }\n\n  SECTION(\"Passthrough\") {\n    const char* code = \"#include <thunks_common.h>\\n\"\n                       \"void func(void*);\\n\"\n                       \"template<> struct fex_gen_config<func> : fexgen::custom_host_impl {};\\n\"\n                       \"template<> struct fex_gen_param<func, 0, void*> : fexgen::ptr_passthrough {};\\n\";\n    CHECK_NOTHROW(run_thunkgen_host(\"\", code, guest_abi));\n  }\n\n  SECTION(\"Assumed compatible\") {\n    const char* code = \"#include <thunks_common.h>\\n\"\n                       \"void func(void*);\\n\"\n                       \"template<> struct fex_gen_config<func> {};\\n\"\n                       \"template<> struct fex_gen_param<func, 0, void*> : fexgen::assume_compatible_data_layout {};\\n\";\n    CHECK_NOTHROW(run_thunkgen_host(\"\", code, guest_abi));\n  }\n\n  SECTION(\"Unannotated in struct\") {\n    const char* prelude = \"struct A { void* a; };\\n\";\n    const char* code = \"#include <thunks_common.h>\\n\"\n                       \"void func(A*);\\n\"\n                       \"template<> struct fex_gen_config<func> {};\\n\";\n    if (guest_abi == GuestABI::X86_32) {\n      CHECK_THROWS_WITH(run_thunkgen_host(prelude, code, guest_abi, true),\n                        Catch::Matchers::ContainsSubstring(\"unsupported parameter type\", Catch::CaseSensitive::No));\n    } else {\n      CHECK_NOTHROW(run_thunkgen_host(prelude, code, guest_abi));\n    }\n  }\n\n  SECTION(\"Custom repack in struct\") {\n    const char* prelude = \"struct A { void* a; };\\n\";\n    const char* code = \"#include <thunks_common.h>\\n\"\n                       \"void func(A*);\\n\"\n                       \"template<> struct fex_gen_config<&A::a> : fexgen::custom_repack {};\\n\"\n                       \"template<> struct fex_gen_config<func> {};\\n\";\n    CHECK_NOTHROW(run_thunkgen_host(prelude, code, guest_abi));\n  }\n}\n"
  },
  {
    "path": "unittests/Utilities/CMakeLists.txt",
    "content": "add_executable(DeleteOldSHMRegions DeleteOldSHMRegions.cpp)\n\nset_target_properties(DeleteOldSHMRegions PROPERTIES RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/TestUtilities\")\nadd_custom_target(remove_old_shm_regions\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}/TestUtilities/\"\n  USES_TERMINAL\n  COMMAND \"DeleteOldSHMRegions\")\n\n"
  },
  {
    "path": "unittests/Utilities/DeleteOldSHMRegions.cpp",
    "content": "#include <cstdint>\n#include <fstream>\n#include <stdio.h>\n#include <sys/shm.h>\n#include <unistd.h>\n\nstatic bool ctime_is_old(uint64_t ctime) {\n  time_t curtime;\n  time(&curtime);\n\n  // If it is older than ten minutes.\n  return (curtime - ctime) > 600;\n}\n\nint main() {\n  // clang-format off\n  // key      shmid perms                  size  cpid  lpid nattch   uid   gid  cuid  cgid      atime      dtime      ctime                   rss                  swap\n  //\t 0     360448   777                  4096 165187 165187      0  1002  1002  1002  1002 1679659857 1679659857 1679659857                  4096                     0\n  //\t 0      32769   777                  4096 153814 153814      0  1002  1002  1002  1002 1676490841 1676490841 1676490841                     0                  4096\n  // clang-format on\n  std::ifstream fs {\"/proc/sysvipc/shm\", std::fstream::binary};\n  std::string Line;\n\n  // Remove first line\n  std::getline(fs, Line);\n\n  const auto current_uid = getuid();\n  while (std::getline(fs, Line)) {\n    if (fs.eof()) {\n      break;\n    }\n    int shmid;\n    int uid;\n    int attach;\n    uint64_t ctime;\n    if (sscanf(Line.c_str(), \"%*d %d %*d %*d %*d %*d %d %d %*d %*d %*d %*d %*d %ld\", &shmid, &attach, &uid, &ctime) == 4) {\n      // If the UID matches and nothing is attached AND it is old then delete it.\n      if (uid == current_uid && attach == 0 && ctime_is_old(ctime)) {\n        shmctl(shmid, IPC_RMID, nullptr);\n      }\n    }\n  }\n  return 0;\n}\n"
  },
  {
    "path": "unittests/gcc-target-tests-32/CMakeLists.txt",
    "content": "# Careful. Globbing can't see changes to the contents of files\n# Need to do a fresh clean to see changes\nfile(GLOB_RECURSE TESTS CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/External/fex-gcc-target-tests-bins/32/*)\n\nforeach(TEST ${TESTS})\n  # Extract test file name\n  string(REPLACE \"/fex-gcc-target-tests-bins/32/\" \";\" TEST_NAME_LIST ${TEST})\n  list(GET TEST_NAME_LIST 1 TEST_FILE_NAME)\n\n  # Loop over block sizes\n  foreach(BLOCK_SIZE 500 1)\n    # Create TEST_NAME from TEST_FILE_NAME\n    string(REPLACE \"/\" \"-\" TEST_NAME ${TEST_FILE_NAME})\n    string(APPEND TEST_NAME \".n${BLOCK_SIZE}.gcc-target-32\")\n\n    add_test(NAME \"${TEST_NAME}\"\n      COMMAND \"python3\" \"${CMAKE_SOURCE_DIR}/Scripts/guest_test_runner.py\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/Known_Failures\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/Expected_Output\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/Disabled_Tests\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/Flake_Tests\"\n      \"${TEST_NAME}\"\n      \"guest\"\n      \"$<TARGET_FILE:FEX>\"\n      \"${TEST}\")\n    set_property(TEST \"${TEST_NAME}\" APPEND PROPERTY SKIP_RETURN_CODE 125)\n    set_property(TEST \"${TEST_NAME}\" APPEND PROPERTY ENVIRONMENT \"FEX_OUTPUTLOG=stderr;FEX_SILENTLOG=0;FEX_MAXINST=${BLOCK_SIZE}\")\n  endforeach()\nendforeach()\n\nadd_custom_target(gcc_target_tests_32\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"40\" ${TEST_JOB_FLAG} \"-R\" \"\\.*.gcc-target-32$$\")\n"
  },
  {
    "path": "unittests/gcc-target-tests-32/Disabled_Tests",
    "content": "# Uses AVX\npr57275.c.gcc-target-test-32.n1.gcc-target-32\npr57275.c.gcc-target-test-32.n500.gcc-target-32\n\n# Consistently crashes on Solidrun only in CI\n20080723-1.c.gcc-target-test-32.n1.gcc-target-32\n20080723-1.c.gcc-target-test-32.n500.gcc-target-32\n\n# These tests fail because of things unrelated to the sse4.1 instructions\nsse4_1-ceil-sfix-vec.c.gcc-target-test-32.n1.gcc-target-32\nsse4_1-ceil-sfix-vec.c.gcc-target-test-32.n500.gcc-target-32\n\nsse4_1-ceilf-sfix-vec.c.gcc-target-test-32.n1.gcc-target-32\nsse4_1-ceilf-sfix-vec.c.gcc-target-test-32.n500.gcc-target-32\n\nsse4_1-floor-sfix-vec.c.gcc-target-test-32.n1.gcc-target-32\nsse4_1-floor-sfix-vec.c.gcc-target-test-32.n500.gcc-target-32\n\nsse4_1-floorf-sfix-vec.c.gcc-target-test-32.n1.gcc-target-32\nsse4_1-floorf-sfix-vec.c.gcc-target-test-32.n500.gcc-target-32\n\nsse4_1-rint-sfix-vec.c.gcc-target-test-32.n1.gcc-target-32\nsse4_1-rint-sfix-vec.c.gcc-target-test-32.n500.gcc-target-32\n\nsse4_1-rintf-sfix-vec.c.gcc-target-test-32.n1.gcc-target-32\nsse4_1-rintf-sfix-vec.c.gcc-target-test-32.n500.gcc-target-32\n\nsse4_1-round-sfix-vec.c.gcc-target-test-32.n1.gcc-target-32\nsse4_1-round-sfix-vec.c.gcc-target-test-32.n500.gcc-target-32\n\nsse4_1-roundf-sfix-vec.c.gcc-target-test-32.n1.gcc-target-32\nsse4_1-roundf-sfix-vec.c.gcc-target-test-32.n500.gcc-target-32\n\nsse4_1-rint-vec.c.gcc-target-test-32.n1.gcc-target-32\nsse4_1-rint-vec.c.gcc-target-test-32.n500.gcc-target-32\n\nsse4_1-roundf-vec.c.gcc-target-test-32.n1.gcc-target-32\nsse4_1-roundf-vec.c.gcc-target-test-32.n500.gcc-target-32\n\n\n# These tests fail on Nvidia Xavier ONLY\nsse4_1-rintf-vec.c.gcc-target-test-32.n1.gcc-target-32\nsse4_1-rintf-vec.c.gcc-target-test-32.n500.gcc-target-32\nsse4_1-round-vec.c.gcc-target-test-32.n1.gcc-target-32\nsse4_1-round-vec.c.gcc-target-test-32.n500.gcc-target-32\n\n# This has a race with SIGPROF\nmcount_pic.c.gcc-target-test-32.n1.gcc-target-32\nmcount_pic.c.gcc-target-test-32.n500.gcc-target-32"
  },
  {
    "path": "unittests/gcc-target-tests-32/Expected_Output",
    "content": "# default to zero"
  },
  {
    "path": "unittests/gcc-target-tests-32/Known_Failures",
    "content": "sse2-mmx-pextrw.c.gcc-target-test-32.n500.gcc-target-32\nsse2-mmx-pextrw.c.gcc-target-test-32.n1.gcc-target-32\n\n# Consistently crashes on Solidrun only in CI\n20080723-1.c.gcc-target-test-32\n\n# These tests fail because of things unrelated to the sse4.1 instructions\nsse4_1-ceil-sfix-vec.c.gcc-target-test-32\nsse4_1-ceilf-sfix-vec.c.gcc-target-test-32\nsse4_1-floor-sfix-vec.c.gcc-target-test-32\nsse4_1-floorf-sfix-vec.c.gcc-target-test-32\nsse4_1-rint-sfix-vec.c.gcc-target-test-32\nsse4_1-rintf-sfix-vec.c.gcc-target-test-32\nsse4_1-round-sfix-vec.c.gcc-target-test-32\nsse4_1-roundf-sfix-vec.c.gcc-target-test-32\nsse4_1-rint-vec.c.gcc-target-test-32\nsse4_1-roundf-vec.c.gcc-target-test-32\n\n# These tests fail on Nvidia Xavier ONLY\nsse4_1-rintf-vec.c.gcc-target-test-32\nsse4_1-round-vec.c.gcc-target-test-32\n\n# This has a race with SIGPROF\nmcount_pic.c.gcc-target-test-32\n\n# See https://github.com/FEX-Emu/FEX/issues/4436\n# Test has invalid asm. Fails on host as well.\n# It passes for -n 500 due to x87 stack optimization pass\n# not actually doing a fld/fst pair and instead doing the \n# memory store directly.\npr88240.c.gcc-target-test-32.n1.gcc-target-32\n"
  },
  {
    "path": "unittests/gcc-target-tests-64/CMakeLists.txt",
    "content": "# Careful. Globbing can't see changes to the contents of files\n# Need to do a fresh clean to see changes\nfile(GLOB_RECURSE TESTS CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/External/fex-gcc-target-tests-bins/64/*)\n\nforeach(TEST ${TESTS})\n  # Extract test file name\n  string(REPLACE \"/fex-gcc-target-tests-bins/64/\" \";\" TEST_NAME_LIST ${TEST})\n  list(GET TEST_NAME_LIST 1 TEST_FILE_NAME)\n\n  # Loop over block sizes\n  foreach(BLOCK_SIZE 500 1)\n    # Create TEST_NAME from TEST_FILE_NAME\n    string(REPLACE \"/\" \"-\" TEST_NAME ${TEST_FILE_NAME})\n    string(APPEND TEST_NAME \".n${BLOCK_SIZE}.gcc-target-64\")\n\n    add_test(NAME \"${TEST_NAME}\"\n      COMMAND \"python3\" \"${CMAKE_SOURCE_DIR}/Scripts/guest_test_runner.py\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/Known_Failures\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/Expected_Output\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/Disabled_Tests\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/Flake_Tests\"\n      \"${TEST_NAME}\"\n      \"guest\"\n      \"$<TARGET_FILE:FEX>\"\n      \"${TEST}\")\n    set_property(TEST \"${TEST_NAME}\" APPEND PROPERTY SKIP_RETURN_CODE 125)\n    set_property(TEST \"${TEST_NAME}\" APPEND PROPERTY ENVIRONMENT \"FEX_OUTPUTLOG=stderr;FEX_SILENTLOG=0;FEX_MAXINST=${BLOCK_SIZE}\")\n  endforeach()\nendforeach()\n\nadd_custom_target(gcc_target_tests_64\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"40\" ${TEST_JOB_FLAG} \"-R\" \"\\.*.gcc-target-64$$\")\n"
  },
  {
    "path": "unittests/gcc-target-tests-64/Disabled_Tests",
    "content": "# This relies on SIGPROF which means we need real signal support to handle this\n# Crashes or hangs depending on which runner is running it.\n# Also this has a race with SIGPROF\nmcount_pic.c.gcc-target-test-64\n"
  },
  {
    "path": "unittests/gcc-target-tests-64/Expected_Output",
    "content": "# default to zero"
  },
  {
    "path": "unittests/gcc-target-tests-64/Known_Failures",
    "content": "# This has invalid asm generated for its test\n# 'foo' gets the argument in edi\n# Passes the argument to bar in eax\n# 'bar' accepts the argument in edi\n# inline asm is incorrect, needs to use =d and d on the value\nasm-5.c.gcc-target-test-64.n500.gcc-target-64\nasm-5.c.gcc-target-test-64.n1.gcc-target-64\n\n# Fails even on host device\n# 'test_pextrw' does a zero extend to the gpr\n# Which means its -3339 value turns in to 0xf2f5\n# While the 'compute_correct_result' value does a sign extension\n# Which turns the value in to 0xfffff2f5\n# This causes its comparison to fail\nsse2-mmx-pextrw.c.gcc-target-test-64.n500.gcc-target-64\nsse2-mmx-pextrw.c.gcc-target-test-64.n1.gcc-target-64\n\n# See https://github.com/FEX-Emu/FEX/issues/4436\n# Test has invalid asm. Fails on host as well.\n# It passes for -n 500 due to x87 stack optimization pass\n# not actually doing a fld/fst pair and instead doing the \n# memory store directly.\npr88240.c.gcc-target-test-64.n1.gcc-target-64"
  },
  {
    "path": "unittests/gvisor-tests/CMakeLists.txt",
    "content": "# Careful. Globbing can't see changes to the contents of files\n# Need to do a fresh clean to see changes\nfile(GLOB_RECURSE TESTS CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/External/fex-gvisor-tests-bins/*_test)\n\nforeach(TEST ${TESTS})\n  string(REPLACE \"/fex-gvisor-tests-bins/\" \";\" TEST_NAME_LIST ${TEST})\n  list(GET TEST_NAME_LIST 1 TEST_NAME)\n  string(REPLACE \"/\" \"-\" TEST_NAME ${TEST_NAME})\n\n  add_test(NAME \"${TEST_NAME}.jit.gvisor\"\n    COMMAND \"python3\" \"${CMAKE_SOURCE_DIR}/Scripts/guest_test_runner.py\"\n    \"${CMAKE_CURRENT_SOURCE_DIR}/Known_Failures\"\n    \"${CMAKE_CURRENT_SOURCE_DIR}/Expected_Output\"\n    \"${CMAKE_CURRENT_SOURCE_DIR}/Disabled_Tests\"\n    \"${CMAKE_CURRENT_SOURCE_DIR}/Flake_Tests\"\n    \"${TEST_NAME}\"\n    \"guest\"\n    \"$<TARGET_FILE:FEX>\"\n    \"${TEST}\")\n  set_property(TEST \"${TEST_NAME}.jit.gvisor\" APPEND PROPERTY SKIP_RETURN_CODE 125)\n  set_property(TEST \"${TEST_NAME}.jit.gvisor\" APPEND PROPERTY ENVIRONMENT \"FEX_OUTPUTLOG=stderr;FEX_SILENTLOG=0;FEX_MAXINST=500\")\nendforeach()\n\nset(RM_DIR_COMMAND \"rm $ENV{FEX_ROOTFS}/tmp 2> /dev/null || true\")\n\nadd_custom_target(gvisor_tests\n  VERBATIM\n  WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\"\n  USES_TERMINAL\n  COMMAND \"sh\" \"-c\" \"${RM_DIR_COMMAND}\"\n  COMMAND \"ctest\" \"--output-on-failure\" \"--timeout\" \"302\" ${TEST_JOB_FLAG} \"-R\" \"\\.*.gvisor$$\")\n"
  },
  {
    "path": "unittests/gvisor-tests/Disabled_Tests",
    "content": "# never terminates (even though we use timeout)\nkill_test\n\n# erratic test results\nxattr_test\nmlock_test\n\n# these are flaky on x86\nstat_times_test\n\n# This periodically fails on ARM hosts. `PosixError(errno=13 Permission denied) open(/proc/self/oom_score_adj, 0x1, 0)`\nproc_pid_oomscore_test\n\n# Spins forever\nptrace_test\n\n# The behaviour of this is different between x86 and ARM\n# SIGSEGV kills a thread successfully on ARM but not on x86\ntime_test\n\n# The behaviour of this test changes depending on if running inside the test harness or not\n# Works outside of the test harness but fails inside of it\npause_test\n\n# This takes advantage of CLONE_VM in a way that breaks FEX's TLS usage\n# Need to workaround this somehow\naio_test\n\n# The Solidrun CI board isn't running a kernel with namespaces enabled\n# gvisor doesn't error check correctly in this case and returns hard failure instead of correctly exiting\nproc_pid_uid_gid_map_test\n\n# This test is expecting the kernel to update the timeout variable but by default the kernel keeps time outs \"sticky\"\n# See personality flag STICKY_TIMEOUTS\nselect_test\n\n# This test uses syscalls that a userspace process doesn't have access to\nsyslog_test\n\n# This very specifically is testing bad pointers passed in to the kernel to test EFAULT\naccess_test\nsigprocmask_test\n\n# Relies on some utility executables to be installed\nexec_test\n\n# This relies on splice behaviour that doesn't work even on x86 host\neventfd_test\n\n# Fails even on host x86 device\n# Expects the tmp folder to be empty and cleaned up between CI runs by a system process\n# Does tests that removes user priveleges to touch those files\nopen_create_test\n\n# Fails even on host x86 device\n# Expects the /tmp folder to be cleaned up between INDIVIDUAL tests\n# OpenTest.OTrunc creates /tmp/truncd\n# OpenTest.OTruncAndReadOnlyDir attempts to create the same directory just afterwards\n# Neither clean up after themselves\nopen_test\n\n# This test doesn't correctly check to see if seccomp is enabled\n# Attempts using regardless of enabled or not\nseccomp_test\n\n# Relies on ptrace to execute very simple binaries\nexec_binary_test\n\n# Relies on ptrace to send the parent process a signal\nprctl_test\n\n# Doesn't event pass on real x86 host\n# GetrusageTest.IgnoreSIGCHLD is expecting memory usage to be zero, but it isn't\ngetrusage_test\n\n# Doesn't event pass on real x86 host\nsendfile_test\n\n# Does a couple of things we don't support currently\n# ForkTest.SigAltStack : Fork should inherit altstack\n# ForkTest.Affinity : Affinity masks should be inherited\nfork_test\n\n# Requires accurate exit status from vfork\n# Which we currently don't achieve\nvfork_test\n\n# Doesn't even pass on real x86 host\n# Takes a long time to run as well\npty_test\n\n# This syscall isn't implemented on ARM64\nmempolicy_test\n\n# Relies on namespaces to exist on the host (and user accessible) and isn't guaranteed by our CI\nprctl_setuid_test\n\n# This does 32-bit syscalls from a 64-bit process. Which we don't support yet\n32bit_test\n\n# We are lying to the guest application about true affinity. Missing some edges here\naffinity_test\n\n# Doesn't even pass on real x86 host\n# Uses some private sandbox socket system?\n# Seems like it needs some environment variables set that is google specific\nconnect_external_test\n\n# Doesn't even pass on real x86 host\n# Needs some helper executable to work\nsigaltstack_test\n\n# Sets up an alarm to fire every 500ms\n# Sets up rcx and r11 to a known good value\n# sets a boolean in memory and spins until the signal handler sets another boolean\n# Stores the resulting values to a memory address\n# Then checks to ensure the signal handler picked up the correct context values\n# Seems like FEX currently doesn't?\nsigiret_test\n\n# Doesn't even pass on real x86 host\n# This relies on splice behaviour that doesn't work even on x86 host\n# Hangs after failing\nsplice_test\n\n# Relies on ptrace to run\nwait_test\nsysret_test\n\n# Has race conditions in the code and takes a long time to run\ntcp_socket_test\n\n# Doesn't even pass on real x86 host\nsocket_bind_to_device_test\nsocket_netlink_route_test\nsocket_bind_to_device_distribution_test\nsocket_bind_to_device_sequence_test\nsocket_inet_loopback_nogotsan_test\nsocket_ipv4_udp_unbound_loopback_nogotsan_test\nsocket_ipv4_udp_unbound_loopback_test\n\n# This takes forever even on x86 host\nsocket_inet_loopback_test\nsocket_ip_tcp_generic_loopback_test\nsocket_stress_test\nalarm_test\nitimer_test\nfutex_test\nfcntl_test\n\n# these take a long time\nppoll_test\nflock_test\npipe_test\nepoll_test\nconcurrency_test\n\n# This requires partial read support in the kernel\n# Arm64 devices don't have this\npartial_bad_buffer_test\n\n# Depending on board can work or not, depending on kernel configuration\n# IPv6 maybe?\nsocket_ipv6_udp_unbound_external_networking_test\n\n# This test is flaky\nproc_net_test\nrtsignal_test\nsigstop_test\nstat_test\n\n# These search for folders in /\n# Might need to rbind some folders to make it happy\n# This currently passes on x86-64 hosts\n# This fails on AArch64 because getdents isn't emulated\ngetdents_test\n\n# Flaky\nudp_socket_test\n\n# This test checks for the header layout from `/proc/net/udp` which has changed slightly with newer kernels\nproc_net_udp_test\n\n# This test is broken since kernel commit: 36e2c7421f02\n# Upstream gvisor has the offending tests removed\ninotify_test\n\n# Needs testing\nsemaphore_test\n\n# This test does an unsafe timer test. (NoTimeout subtest specifically).\n# Sets a timer for 100ms then starts a pselect with unlimited timeout.\n# If the timer fires before the pselect starts then pselect will hang forever.\n# Since we are running these tests on a fully loaded system, we tend to context switch,\n# causing the chance of a hang to occur quite frequently.\npselect_test\n\n# Somewhere between kernel versions 5.15 and 6.0, timerfd lseek behaviour has changed.\n# On older kernels it would return -ESPIPE, on new kernels it returns 0.\n# This test expects -ESPIPE behaviour.\ntimerfd_test\n\n# Sub-test SealGrowPartialWriteTruncated tests some behaviour of F_SEAL_GROW that changes behaviour depending on kernel version.\n#  - Grows the memfd region to 1 page\n#  - Seals it\n#  - Seeks to 3/4 in to the page\n#  - Tries to write one page of data\n#  - Expects the kernel to only write 1024 bytes\n#  - Newer kernels return EPERM instead\n# Sub-test SealWriteWithMmap tests behaviour of F_SEAL_WRITE that changes behaviour depending on kernel version\n# - Seals the memfd region\n# - Tries to map it with MAP_SHARED and PROT_WRITE - Expects failure\n# - Tries to map it with MAP_SHARED and PROT_READ - Expects failure\n# - Older Linux kernel versions accidentally allowed PROT_READ mappings through.\nmemfd_test\n\n# Subtest `TestInvalidFlag` tests expected invalid flag 0x80.\n# With a new enough kernel this is now RWF_NOAPPEND\npreadv2_test\npwritev2_test\n\n# Tries to set a bunch of socket options that used to work on older kernels, but now the get rejected with EOPNOTSUPP\nsocket_abstract_test\nsocket_domain_test\nsocket_filesystem_test\nsocket_ip_tcp_loopback_test\nsocket_ip_udp_loopback_test\n\n# Does some tricky signal masking and signal timer setup to try and ensure `sigtimedwait` still sends a timedwait signal when signals are blocked\n# With a new enough kernel it seems `sigtimedwait` now immediately return in this situation.\ntimers_test\n"
  },
  {
    "path": "unittests/gvisor-tests/Expected_Output",
    "content": "32bit_test 0\naccept_bind_stream_test 0\naccept_bind_test 0\naccess_test 0\naffinity_test 0\naio_test 0\nalarm_test 0\narch_prctl_test 0\nbad_test 0\nbind_test 0\nbrk_test 0\nchdir_test 0\nchmod_test 0\nchown_test 0\nchroot_test 0\nclock_getres_test 0\nclock_gettime_test 0\nclock_nanosleep_test 0\nconcurrency_test 0\nconnect_external_test 0\ncreat_test 0\ndev_test 0\ndup_test 0\nepoll_test 0\neventfd_test 0\nexceptions_test 0\nexec_binary_test 0\nexec_test 0\nexit_test 0\nfadvise64_test 0\nfallocate_test 0\nfault_test 0\nfchdir_test 0\nfcntl_test 0\nflock_test 0\nfork_test 0\nfpsig_fork_test 0\nfpsig_nested_test 0\nfsync_test 0\nfutex_test 0\ngetcpu_host_test 0\ngetcpu_test 0\ngetdents_test 0\ngetrandom_test 0\ngetrusage_test 0\ninotify_test 0\nioctl_test 0\nip6tables_test 0\niptables_test 0\nitimer_test 0\nkcov_test 0\nkill_test 0\nlink_test 0\nlseek_test 0\nmadvise_test 0\nmembarrier_test 0\nmemfd_test 0\nmemory_accounting_test 0\nmempolicy_test 0\nmincore_test 0\nmkdir_test 0\nmknod_test 0\nmlock_test 0\nmmap_test 0\nmount_test 0\nmremap_test 0\nmsync_test 0\nmunmap_test 0\nnetwork_namespace_test 0\nopen_create_test 0\nopen_test 0\npacket_socket_raw_test 0\npacket_socket_test 0\npartial_bad_buffer_test 0\npause_test 0\nping_socket_test 0\npipe_test 0\npoll_test 0\nppoll_test 0\nprctl_setuid_test 0\nprctl_test 0\npread64_test 0\npreadv2_test 0\npreadv_test 0\npriority_test 0\nproc_net_tcp_test 0\nproc_net_test 0\nproc_net_udp_test 0\nproc_net_unix_test 0\nproc_pid_oomscore_test 0\nproc_pid_smaps_test 0\nproc_pid_uid_gid_map_test 0\nproc_test 0\npselect_test 0\nptrace_test 0\npty_root_test 0\npty_test 0\npwrite64_test 0\npwritev2_test 0\nraw_socket_hdrincl_test 0\nraw_socket_icmp_test 0\nraw_socket_test 0\nreadahead_test 0\nread_test 0\nreadv_socket_test 0\nreadv_test 0\nrename_test 0\nrlimits_test 0\nrseq_test 0\nrtsignal_test 0\nsched_test 0\nsched_yield_test 0\nseccomp_test 0\nselect_test 0\nsemaphore_test 0\nsendfile_socket_test 0\nsendfile_test 0\nshm_test 0\nsigaction_test 0\nsigaltstack_test 0\nsigiret_test 0\nsignalfd_test 0\nsigprocmask_test 0\nsigstop_test 0\nsigtimedwait_test 0\nsocket_abstract_non_blocking_test 0\nsocket_abstract_test 0\nsocket_bind_to_device_distribution_test 0\nsocket_bind_to_device_sequence_test 0\nsocket_bind_to_device_test 0\nsocket_blocking_ip_test 0\nsocket_blocking_local_test 0\nsocket_capability_test 0\nsocket_domain_non_blocking_test 0\nsocket_domain_test 0\nsocket_filesystem_non_blocking_test 0\nsocket_filesystem_test 0\nsocket_inet_loopback_nogotsan_test 0\nsocket_inet_loopback_test 0\nsocket_ip_tcp_generic_loopback_test 0\nsocket_ip_tcp_loopback_non_blocking_test 0\nsocket_ip_tcp_loopback_test 0\nsocket_ip_tcp_udp_generic_loopback_test 0\nsocket_ip_udp_loopback_non_blocking_test 0\nsocket_ip_udp_loopback_test 0\nsocket_ip_unbound_netlink_test 0\nsocket_ip_unbound_test 0\nsocket_ipv4_udp_unbound_external_networking_test 0\nsocket_ipv4_udp_unbound_loopback_netlink_test 0\nsocket_ipv4_udp_unbound_loopback_nogotsan_test 0\nsocket_ipv4_udp_unbound_loopback_test 0\nsocket_ipv6_udp_unbound_external_networking_test 0\nsocket_ipv6_udp_unbound_loopback_netlink_test 0\nsocket_ipv6_udp_unbound_loopback_test 0\nsocket_netdevice_test 0\nsocket_netlink_route_test 0\nsocket_netlink_test 0\nsocket_netlink_uevent_test 0\nsocket_non_stream_blocking_local_test 0\nsocket_non_stream_blocking_udp_test 0\nsocket_stream_blocking_local_test 0\nsocket_stream_blocking_tcp_test 0\nsocket_stream_local_test 0\nsocket_stream_nonblock_local_test 0\nsocket_stress_test 0\nsocket_test 0\nsocket_unix_dgram_local_test 0\nsocket_unix_dgram_non_blocking_test 0\nsocket_unix_pair_test 0\nsocket_unix_seqpacket_local_test 0\nsocket_unix_stream_test 0\nsocket_unix_unbound_abstract_test 0\nsocket_unix_unbound_dgram_test 0\nsocket_unix_unbound_filesystem_test 0\nsocket_unix_unbound_seqpacket_test 0\nsocket_unix_unbound_stream_test 0\nsplice_test 0\nstatfs_test 0\nstat_test 0\nstat_times_test 0\nsticky_test 0\nsymlink_test 0\nsync_file_range_test 0\nsync_test 0\nsysinfo_test 0\nsyslog_test 0\nsysret_test 0\ntcp_socket_test 0\ntgkill_test 0\ntimerfd_test 0\ntimers_test 0\ntime_test 0\ntkill_test 0\ntruncate_test 0\ntuntap_hostinet_test 0\ntuntap_test 0\nudp_bind_test 0\nudp_socket_test 0\nuidgid_test 0\nuname_test 0\nunlink_test 0\nunshare_test 0\nutimes_test 0\nvdso_clock_gettime_test 0\nvdso_test 0\nvfork_test 0\nvsyscall_test 0\nwait_test 0\nwrite_test 0\nxattr_test 0\n"
  },
  {
    "path": "unittests/gvisor-tests/Flake_Tests",
    "content": "pselect_test\npoll_test\n# These are majorly flakey\nsocket_abstract_non_blocking_test\nsocket_abstract_test\nsocket_bind_to_device_distribution_test\nsocket_bind_to_device_sequence_test\nsocket_bind_to_device_test\nsocket_blocking_ip_test\nsocket_blocking_local_test\nsocket_capability_test\nsocket_domain_non_blocking_test\nsocket_domain_test\nsocket_filesystem_non_blocking_test\nsocket_filesystem_test\nsocket_inet_loopback_nogotsan_test\nsocket_inet_loopback_test\nsocket_ip_tcp_generic_loopback_test\nsocket_ip_tcp_loopback_non_blocking_test\nsocket_ip_tcp_loopback_test\nsocket_ip_tcp_udp_generic_loopback_test\nsocket_ip_udp_loopback_non_blocking_test\nsocket_ip_udp_loopback_test\nsocket_ip_unbound_netlink_test\nsocket_ip_unbound_test\nsocket_ipv4_udp_unbound_external_networking_test\nsocket_ipv4_udp_unbound_loopback_netlink_test\nsocket_ipv4_udp_unbound_loopback_nogotsan_test\nsocket_ipv4_udp_unbound_loopback_test\nsocket_ipv6_udp_unbound_external_networking_test\nsocket_ipv6_udp_unbound_loopback_netlink_test\nsocket_ipv6_udp_unbound_loopback_test\nsocket_netdevice_test\nsocket_netlink_route_test\nsocket_netlink_test\nsocket_netlink_uevent_test\nsocket_non_stream_blocking_local_test\nsocket_non_stream_blocking_udp_test\nsocket_stream_blocking_local_test\nsocket_stream_blocking_tcp_test\nsocket_stream_local_test\nsocket_stream_nonblock_local_test\nsocket_stress_test\nsocket_test\nsocket_unix_dgram_local_test\nsocket_unix_dgram_non_blocking_test\nsocket_unix_pair_test\nsocket_unix_seqpacket_local_test\nsocket_unix_stream_test\nsocket_unix_unbound_abstract_test\nsocket_unix_unbound_dgram_test\nsocket_unix_unbound_filesystem_test\nsocket_unix_unbound_seqpacket_test\nsocket_unix_unbound_stream_test\n"
  },
  {
    "path": "unittests/gvisor-tests/Known_Failures",
    "content": "# these fail on x86 CI\nproc_pid_oomscore_test\n\n# The behaviour of this is different between x86 and ARM\n# SIGSEGV kills a thread successfully on ARM but not on x86\ntime_test\n\n# these are disabled\n# never terminates (even though we use timeout)\nkill_test\n\n# erratic test results\nxattr_test\nmlock_test\n\n# These used to crash and fail its test, now hang\n#mremap_test\n\n# these are flaky on x86\nstat_times_test\n\n# Spins forever\nptrace_test\n\n# The behaviour of this test changes depending on if running inside the test harness or not\n# Works outside of the test harness but fails inside of it\npause_test\n\n# This takes advantage of CLONE_VM in a way that breaks FEX's TLS usage\n# Need to workaround this somehow\naio_test\n\n# The Solidrun CI board isn't running a kernel with namespaces enabled\n# gvisor doesn't error check correctly in this case and returns hard failure instead of correctly exiting\nproc_pid_uid_gid_map_test\n\n# This test is expecting the kernel to update the timeout variable but by default the kernel keeps time outs \"sticky\"\n# See personality flag STICKY_TIMEOUTS\nselect_test\n\n# This test uses syscalls that a userspace process doesn't have access to\nsyslog_test\n\n# This very specifically is testing bad pointers passed in to the kernel to test EFAULT\naccess_test\nsigprocmask_test\n\n# Relies on some utility executables to be installed\nexec_test\n\n# This relies on splice behaviour that doesn't work even on x86 host\neventfd_test\n\n# Relies on tricky behaviour\n# MMapDeathTest.TruncateAfterCOWBreak : Needs to capture SIGBUS. Test fails, handwritten test works\n# MMapTest.ProtNoneDeath : Needs to capture SIGBUS. Test fails, handwritten test works\n# MMapTest.NoProtExecDeath : Needs to support SIGSEGV from memory mapped without PROT_EXEC but WITH READ + WRITE\n# NoExceedLimitData : Requires brk to respect RLIMIT_DATA\nmmap_test\n\n# Fails even on host x86 device\n# Expects the tmp folder to be empty and cleaned up between CI runs by a system process\n# Does tests that removes user priveleges to touch those files\nopen_create_test\n\n# Fails even on host x86 device\n# Expects the /tmp folder to be cleaned up between INDIVIDUAL tests\n# OpenTest.OTrunc creates /tmp/truncd\n# OpenTest.OTruncAndReadOnlyDir attempts to create the same directory just afterwards\n# Neither clean up after themselves\nopen_test\n\n# This test doesn't correctly check to see if seccomp is enabled\n# Attempts using regardless of enabled or not\nseccomp_test\n\n# Relies on ptrace to execute very simple binaries\nexec_binary_test\n\n# Relies on ptrace to send the parent process a signal\nprctl_test\n\n# Doesn't event pass on real x86 host\n# GetrusageTest.IgnoreSIGCHLD is expecting memory usage to be zero, but it isn't\ngetrusage_test\n\n# Doesn't even pass on real x86 host\nsendfile_test\n\n# Does a couple of things we don't support currently\n# ForkTest.SigAltStack : Fork should inherit altstack\n# ForkTest.Affinity : Affinity masks should be inherited\n# CloneTest.NonCanonicalTLS : Non-Canonical TLS addresses should be rejecte with -EPERM\nfork_test\n\n# Requires accurate exit status from vfork\n# Which we currently don't achieve\nvfork_test\n\n# Doesn't even pass on real x86 host\n# ProcSelfFd.GetdentsDuplicates : Expects fcntl F_DUPFD, 1024 to work. Returns -1\n# ProcSelfFdInfo.GetdentsDuplicates : Same as above\n# ProcSelfAuxv.EntryPresence expects AT_SYSINFO_EHDR to exist. We don't support VDSO atm\n# ProcPidCmdline.SubprocessForkSameCmdline expects to read parent pid's /proc/{pid}/cmdline and get executable name. Expecting a match.\n# ProcPidExe.Subprocess : Same as above\n# ProcPidEnviron.MatchesEnviron Doesn't expect us injecting environment variables in to its container space\nproc_test\n\n# Doesn't even pass on real x86 host\n# Takes a long time to run as well\npty_test\n\n# This syscall isn't implemented on ARM64\nmempolicy_test\n\n# Relies on namespaces to exist on the host (and user accessible) and isn't guaranteed by our CI\nprctl_setuid_test\n\n# This does 32-bit syscalls from a 64-bit process. Which we don't support yet\n32bit_test\n\n# We are lying to the guest application about true affinity. Missing some edges here\naffinity_test\n\n# Doesn't even pass on real x86 host\n# Uses some private sandbox socket system?\n# Seems like it needs some environment variables set that is google specific\nconnect_external_test\n\n# Tests a bunch of different exception exits and we don't support them all\nexceptions_test\n\n# These search for folders in /\n# Might need to rbind some folders to make it happy\n# This currently passes on x86-64 hosts\n# This fails on AArch64 because getdents isn't emulated\ngetdents_test\n\n# Doesn't even pass on real x86 host\n# Needs some helper executable to work\nsigaltstack_test\n\n# Sets up an alarm to fire every 500ms\n# Sets up rcx and r11 to a known good value\n# sets a boolean in memory and spins until the signal handler sets another boolean\n# Stores the resulting values to a memory address\n# Then checks to ensure the signal handler picked up the correct context values\n# Seems like FEX currently doesn't?\nsigiret_test\n\n# Doesn't even pass on real x86 host\n# This relies on splice behaviour that doesn't work even on x86 host\n# Hangs after failing\nsplice_test\n\n# Relies on ptrace to run\nwait_test\nsysret_test\n\n# Has race conditions in the code and takes a long time to run\ntcp_socket_test\n\n# Doesn't even pass on real x86 host\nsocket_bind_to_device_test\nsocket_netlink_route_test\nsocket_bind_to_device_distribution_test\nsocket_bind_to_device_sequence_test\nsocket_inet_loopback_nogotsan_test\nsocket_ipv4_udp_unbound_loopback_nogotsan_test\nsocket_ipv4_udp_unbound_loopback_test\n\n# This takes forever even on x86 host\nsocket_inet_loopback_test\nsocket_ip_tcp_generic_loopback_test\nsocket_stress_test\nalarm_test\nitimer_test\nfutex_test\nfcntl_test\n\n# these take a long time\nppoll_test\nflock_test\npipe_test\nepoll_test\nconcurrency_test\n\n# This requires partial read support in the kernel\n# Tries reading a page's worth of bytes from an FD across a page with no permissions\n# Expecting a partial read to succeed\n# Arm64 devices don't have this\npartial_bad_buffer_test\n\n# Depending on board can work or not, depending on kernel configuration\n# IPv6 maybe?\nsocket_ipv6_udp_unbound_external_networking_test\n\n# This test is flaky\nproc_net_test\nrtsignal_test\nsigstop_test\nstat_test\n\n# Flaky\nudp_socket_test\n\n# This test checks for the header layout from `/proc/net/udp` which has changed slightly with newer kernels\nproc_net_udp_test\n\n# This test is broken since kernel commit: 36e2c7421f02\n# Upstream gvisor has the offending tests removed\ninotify_test\n\n# Needs testing\nsemaphore_test\n\n# This test does an unsafe timer test. (NoTimeout subtest specifically).\n# Sets a timer for 100ms then starts a pselect with unlimited timeout.\n# If the timer fires before the pselect starts then pselect will hang forever.\n# Since we are running these tests on a fully loaded system, we tend to context switch,\n# causing the chance of a hang to occur quite frequently.\npselect_test\n\n# Somewhere between kernel versions 5.15 and 6.0, timerfd lseek behaviour has changed.\n# On older kernels it would return -ESPIPE, on new kernels it returns 0.\n# This test expects -ESPIPE behaviour.\ntimerfd_test\n\n# Tests that poll correctly returns EFAULT\npoll_test\n"
  }
]